DisplayCAL-3.1.0.0/0000755000076500000000000000000012653527012013475 5ustar devwheel00000000000000DisplayCAL-3.1.0.0/autopackage/0000755000076500000000000000000012653527012015761 5ustar devwheel00000000000000DisplayCAL-3.1.0.0/autopackage/autopackage-devel.spec0000644000076500000000000000264112647526505022232 0ustar devwheel00000000000000Summary: Makes software installation on Linux easy Name: autopackage-devel Version: 1.4.2 Release: 1 License: GPL %if 0%{?suse_version} > 0 Group: Development/Tools/Building BuildRequires: fdupes %else %if 0%{?fedora_version} > 0 Group: Development/Tools %else %if 0%{?mandriva_version} > 0 Group: Development/Other %endif %endif %endif Source: http://autopackage.googlecode.com/files/autopackage-devel-1.4.2.tar.bz2 URL: http://autopackage.org/ #!BuildIgnore: post-build-checks BuildRoot: %{_tmppath}/%{name}-%{version}-root BuildRequires: autopackage, gcc, gcc-c++ Autoreq: 0 Requires: autopackage, gcc, gcc-c++ %description Software distributed using Autopackage can be installed on multiple Linux distributions and integrate well into the desktop environment. %prep %setup -n autopackage %build %install export PATH=`pwd`/apbuild:$PATH make install PREFIX=%{buildroot}/usr %if 0%{?suse_version} > 0 %fdupes -s $RPM_BUILD_ROOT/usr/gtk-headers %endif export NO_BRP_CHECK_RPATH=true %clean rm -rf $RPM_BUILD_ROOT %files %defattr(-,root,root) /usr/bin/* /usr/binreloc/* /usr/gtk-headers/* /usr/include/apbuild/* /usr/libexec/autopackage/* /usr/share/aclocal/* /usr/share/apbuild/* /usr/share/autopackage/* %dir /usr/binreloc %dir /usr/gtk-headers %dir /usr/include/apbuild %dir /usr/libexec/autopackage %dir /usr/share/aclocal %dir /usr/share/apbuild %changelog * Tue Aug 03 2010 Florian Höch - Version 1.4.2 DisplayCAL-3.1.0.0/autopackage/autopackage.spec0000644000076500000000000001447412647526505021144 0ustar devwheel00000000000000Summary: Makes software installation on Linux easy Name: autopackage Version: 1.4.2 Release: 1 License: GPL %if 0%{?suse_version} > 0 Group: Development/Tools/Building %else %if 0%{?fedora_version} > 0 Group: Development/Tools %else %if 0%{?mandriva_version} > 0 Group: Development/Other %endif %endif %endif Source: http://autopackage.googlecode.com/files/autopackage-1.4.2-x86.tar.bz2 URL: http://autopackage.org/ #!BuildIgnore: post-build-checks BuildRoot: %{_tmppath}/%{name}-%{version}-root BuildRequires: gcc, libstdc++ Autoreqprov: 0 Requires: tcl Provides: autopackage %description Software distributed using Autopackage can be installed on multiple Linux distributions and integrate well into the desktop environment. %prep %setup -n %{name} %build %install #!/bin/bash # Install script for Autopackage Support Code ### # # This code 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 library 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 library; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # # Copyright 2002-2003 Curtis Knight (knighcl@fastmail.fm) # ### ########## ### ### Determine directories ### ########## prefix=%{buildroot}/usr etc_dir=%{buildroot}/etc ########## ### ### Install ### ########## mkdir -p "$prefix/bin" mkdir -p "$prefix/libexec/autopackage" mkdir -p "$prefix/share/autopackage" mkdir -p "$etc_dir/autopackage" set +e cp -f "package" "$prefix/bin/package" cp -f "autopackage" "$prefix/bin/autopackage" cp -f "libexec"/* "$prefix/libexec/autopackage/" cp -f "share"/apkg-* "$prefix/share/autopackage/" cp -f "share"/*template "$prefix/share/autopackage/" cp -fr "share/locale" "$prefix/share/" cp -f "share/remove" "$prefix/share/autopackage/" # FIXME: should NOT be commented - this is done so that some return code does not fail # the install and stop the auto-setup code before gtkfe can be installed. #set -e # sub in autopackage prefix into config file sed "s|%AutopackagePrefix%|/usr|g" "etc/config" >"$etc_dir/autopackage/config" export NO_BRP_CHECK_RPATH=true %find_lang %{name} %clean rm -rf $RPM_BUILD_ROOT %post #!/bin/bash prefix=/usr pushd "$prefix/libexec/autopackage" >/dev/null [ ! -e libuau.so.3 ] && ln -s libuau.so.3.0.0 libuau.so.3 [ ! -e libcurl.so.2 ] && ln -s libcurl.so.2.0.2 libcurl.so.2 popd >/dev/null # if we have write access to the linker cache, refresh it (ie if we are root) if [ -w /etc/ld.so.cache ]; then echo -n "Refreshing linker cache, please wait ... " /sbin/ldconfig echo "done" fi _refresh_again=false # install libgcc_s.so.1 if needed if ! /sbin/ldconfig -p | grep -q libgcc_s.so.1 && [ ! -e "$prefix/lib/libgcc_s.so.1" ]; then echo "Your system is missing the GCC support library, putting a copy in $prefix/lib" mkdir -p "$prefix/lib" cp "$prefix/libexec/autopackage/libgcc_s.so.1" "$prefix/lib/libgcc_s.so.1" _refresh_again=true fi if ! /sbin/ldconfig -p | grep -q libstdc++.so.5 && [ ! -e "$prefix/lib/libstdc++.so.5" ]; then echo "Your system is missing v5 of the C++ support library, putting a copy in $prefix/lib" mkdir -p "$prefix/lib" cp "$prefix/libexec/autopackage/libstdc++.so.5.0.7" "$prefix/lib/libstdc++.so.5.0.7.apkg" ln -s "$prefix/lib/libstdc++.so.5.0.7.apkg" "$prefix/lib/libstdc++.so.5" _refresh_again=true fi if ! /sbin/ldconfig -p | grep -q libstdc++.so.6 && [ ! -e "$prefix/lib/libstdc++.so.6" ]; then echo "Your system is missing v6 of the C++ support library, putting a copy in $prefix/lib" mkdir -p "$prefix/lib" cp "$prefix/libexec/autopackage/libstdc++.so.6.0.9" "$prefix/lib/libstdc++.so.6.0.9.apkg" ln -s "$prefix/lib/libstdc++.so.6.0.9.apkg" "$prefix/lib/libstdc++.so.6" _refresh_again=true fi if $_refresh_again && [ -w /etc/ld.so.cache ]; then echo -n "Refreshing linker cache again, please wait ... " /sbin/ldconfig echo "done" fi # load installed autopackage support code [ -e /etc/autopackage/config ] && source /etc/autopackage/config; # link to autopackage functions - required for upgrading installation session if [ -e "$autopackage_prefix/share/autopackage/apkg-funclib" ]; then export PATH=$autopackage_prefix/share/autopackage:$PATH source "$autopackage_prefix/share/autopackage/apkg-funclib" fi # add marker file to denote that this is a first time installation session # of the support code; _initializeAutopackage converts this to variable # _autopackage_support_install=1 touch "$WORKING_DIRECTORY/apkg-support-install" # initialize autopackage variables (cpu_architecture) _initializeAutopackage # install GTK+ graphical front end # set variable to install in same location as support code export first_autosu="true" _installGTKFE r="$?" # unset variable to ask user where to install selected packages unset first_autosu # return value in case GTK+ graphical front end fails if [[ "$r" != "0" ]]; then exit 5 fi # add to PATH if necessary if ! isInList "$prefix/bin" "$PREFIX"; then updateEnv PATH "$prefix/bin" shell=$(basename $(cat /etc/passwd | grep ^$(whoami): | awk -F: '{print $7}')) if [[ "$shell" == "" ]]; then shell=$(basename $(readlink /bin/sh 2> /dev/null)) [[ "$shell" == "" ]] && shell="bash" # Still empty? Then use bash as a fallback fi out "Please run 'exec %s' in each terminal to update your path." "$shell"; out " " fi ### DONE "$autopackage_silent" || echo exit 0 %preun #!/bin/bash prefix=/usr pushd "$prefix/libexec/autopackage" >/dev/null rm libuau.so.3 rm libcurl.so.2 popd >/dev/null exit 0 %files -f %{name}.lang %defattr(-,root,root) /usr/bin/package /usr/bin/autopackage %config /etc/autopackage/config /usr/libexec/autopackage/* /usr/share/autopackage/* %dir /etc/autopackage/ %dir /usr/libexec/autopackage/ %dir /usr/share/autopackage/ %changelog * Tue Aug 03 2010 Florian Höch - Version 1.4.2 DisplayCAL-3.1.0.0/autopackage/default.apspec0000644000076500000000000002266712647526505020630 0ustar devwheel00000000000000# -*- shell-script -*- # Generated by mkapspec 0.5 [Meta] ShortName: displaycal SoftwareVersion: `python -c "from DisplayCAL import meta;print meta.version"` DisplayName: DisplayCAL - Display Calibration RootName: @displaycal.hoech.net/displaycal:$SOFTWAREVERSION RootInstallOnly: No URL: http://displaycal.net Summary: A graphical user interface for the Argyll CMS display calibration utilities Maintainer: Florian Höch Packager: Florian Höch PackageVersion: 1 CPUArchitectures: x86 x86_64 AutopackageTarget: 1.4 Type: Application License: GNU General Public License (GPL) [Description] A graphical user interface for the Argyll CMS display calibration utilities. [BuildPrepare] # If you're using autotools, the default should be enough. # prepareBuild will set up apbuild and run configure for you. If you # need to pass arguments to configure, just add them to prepareBuild: # prepareBuild --enable-foo --disable-bar export CC=apgcc python setup.py clean --all --use-distutils python setup.py build_py build_scripts --use-distutils python setup.py install --no-compile --use-distutils \ --root="$build_root" \ --prefix=/usr \ --doc-layout=generic \ --exec-prefix=/usr \ --install-data=/share \ --install-lib=/lib/python/site-packages \ --install-scripts=/bin \ --skip-build \ --skip-instrument-configuration-files \ --skip-postinstall # Use precompiled extension modules for bits in "32" "64" ; do mkdir -p "$build_root/lib/python/site-packages/DisplayCAL/lib$bits" echo "copying DisplayCAL/lib$bits/*.py -> $build_root/lib/python/site-packages/DisplayCAL/lib$bits" cp -f DisplayCAL/lib$bits/*.py "$build_root/lib/python/site-packages/DisplayCAL/lib$bits" for pycompat in "26" "27" ; do mkdir -p "$build_root/lib/python/site-packages/DisplayCAL/lib$bits/python$pycompat" echo "copying DisplayCAL/lib$bits/python$pycompat/*.py -> $build_root/lib/python/site-packages/DisplayCAL/lib$bits/python$pycompat" cp -f DisplayCAL/lib$bits/python$pycompat/*.py "$build_root/lib/python/site-packages/DisplayCAL/lib$bits/python$pycompat" echo "copying DisplayCAL/lib$bits/python$pycompat/*.so -> $build_root/lib/python/site-packages/DisplayCAL/lib$bits/python$pycompat" cp -f DisplayCAL/lib$bits/python$pycompat/*.so "$build_root/lib/python/site-packages/DisplayCAL/lib$bits/python$pycompat" done done # udev/hotplug mkdir -p "$build_root/share/DisplayCAL/usb" # USB and serial instruments using udev, where udev already creates /dev/bus/usb/00X/00X devices cp -f "misc/55-Argyll.rules" "$build_root/share/DisplayCAL/usb/55-Argyll.rules" # USB using udev, where there are NOT /dev/bus/usb/00X/00X devices cp -f "misc/45-Argyll.rules" "$build_root/share/DisplayCAL/usb/45-Argyll.rules" # USB using hotplug and Serial using udev (older versions of Linux) cp -f "misc/Argyll" "$build_root/share/DisplayCAL/usb/Argyll" cp -f "misc/Argyll.usermap" "$build_root/share/DisplayCAL/usb/Argyll.usermap" [BuildUnprepare] # If you're using prepareBuild above, there is no need to change this! # unprepareBuild [Globals] # Variables declared in this section will be available in all other sections [Prepare] function requireLibs() { pushOptE; set +e; for lib in $*; do outputTest $lib if `testForLib $lib.so`; then outputTestPass else outputTestFail outputFail "Required library not found." popOptE return 1 fi done popOptE return 0 } require '@python.org/python' 2.6 2.7 requireAtLeast '@wxpython.org/python-wxgtk:2.8' requireLibs libc libdl libpthread libX11 libXau libXext libXinerama libXrandr libXrender libXxf86vm testForPythonModule numpy || requireAtLeast '@numpy.scipy.org/numpy:1.1' removeOwningPackage "$PREFIX/bin/displaycal" [Imports] # This command will tell makepackage what to include in the package. # The selection comes from the files created by 'make install' or equivalent. # Usually, you can leave this at the default echo '*' | import [Install] outputStatus "Determining python version..." python_version=`python -c "import sys;print sys.version[:3]"` outputStatus "Determining python binary..." python=`which python$python_version 2>/dev/null || which python` outputStatus "Determining python library prefix..." if [ `whoami` = "root" ]; then python_lib_prefix=None else python_lib_prefix=\"$PREFIX\" fi platlib=`python -c "from distutils.sysconfig import get_python_lib; print get_python_lib(True, prefix=$python_lib_prefix)"` for script in `ls bin` ; do outputStatus "Adjusting script shebang line for $script..." safeSed bin/$script "s|/usr/bin/python|$python|" if [ `whoami` != "root" ]; then outputStatus "Adjusting module search path for $script..." safeSed bin/$script "3iimport sys\nsys.path.insert(0, '$platlib')" fi done # Copy autostart entries if [ `whoami` = "root" ]; then outputStatus "Installing profile loader autostart entry to /etc/xdg/autostart..." mkdir -p /etc/xdg/autostart copyFiles etc/xdg/autostart/* /etc/xdg/autostart else outputStatus "Adjusting profile loader autostart entry..." safeSed etc/xdg/autostart/z-displaycal-apply-profiles.desktop "s|Exec=displaycal-apply-profiles|Exec=$PREFIX/bin/displaycal-apply-profiles|" outputStatus "Installing profile loader autostart entry to ${XDG_CONFIG_HOME:-$HOME/.config}/autostart..." mkdir -p "${XDG_CONFIG_HOME:-$HOME/.config}/autostart" copyFiles etc/xdg/autostart/* "${XDG_CONFIG_HOME:-$HOME/.config}/autostart" fi # Copy package files outputStatus "Installing DisplayCAL to $platlib..." copyFiles lib/python/site-packages/DisplayCAL "$platlib" # Byte-compile *.py files # set PYTHONDONTWRITEBYTECODE for Mandriva 2011 export PYTHONDONTWRITEBYTECODE= outputStatus "Byte-compiling pure python modules..." python -c "import glob import os import platform import sys from distutils.sysconfig import get_python_lib from distutils.util import byte_compile bits = platform.architecture()[0][:2] mod = os.path.join(get_python_lib(True, prefix=$python_lib_prefix), 'DisplayCAL') for py in (glob.glob(os.path.join(mod, '*.py')), glob.glob(os.path.join(mod, 'lib', '*.py')), glob.glob(os.path.join(mod, 'lib', 'agw', '*.py')), glob.glob(os.path.join(mod, 'lib' + bits, '*.py')), glob.glob(os.path.join(mod, 'lib' + bits, 'python%s%s' % sys.version_info[:2], '*.py'))): byte_compile(py, optimize=0, force=1) byte_compile(py, optimize=1, force=1)" installData share/DisplayCAL share/doc installExe bin/* installIcon share/icons/hicolor installMan 1 share/man/man1/* if [ `whoami` != "root" ]; then outputStatus "Adjusting desktop menu entries..." for desktopfile in `ls share/applications` ; do safeSed share/applications/$desktopfile "s|Exec=displaycal|Exec=$PREFIX/bin/displaycal|" done fi # installMenuItem changes the .desktop file to include so-called 'Actions' # which makes the menu entry vanish in recent GNOME versions after logout! So # we only use it to make our app appear under 'desktop applications' in # autopackage's 'manage 3rd party software' utility installMenuItem "Graphics" share/applications/displaycal.desktop # Install our proper one for desktopfile in `ls share/applications` ; do which xdg-desktop-menu > /dev/null 2>&1 && xdg-desktop-menu install --novendor share/applications/$desktopfile || true done if [ `whoami` = "root" ]; then if [ -e "/etc/udev/rules.d" ]; then outputStatus "Installing udev rules..." ls /dev/bus/usb/*/* > /dev/null 2>&1 && ( # USB and serial instruments using udev, where udev already creates /dev/bus/usb/00X/00X devices if [ ! -e "/etc/udev/rules.d/55-Argyll.rules" ]; then linkFile "$PREFIX/share/DisplayCAL/usb/55-Argyll.rules" "/etc/udev/rules.d/55-Argyll.rules" fi ) || ( # USB using udev, where there are NOT /dev/bus/usb/00X/00X devices if [ ! -e "/etc/udev/rules.d/45-Argyll.rules" ]; then linkFile "$PREFIX/share/DisplayCAL/usb/45-Argyll.rules" "/etc/udev/rules.d/45-Argyll.rules" fi ) # Reload udev rules if [ -e "/sbin/udevadm" ]; then /sbin/udevadm control --reload-rules fi else if [ -e "/etc/hotplug" ]; then # USB using hotplug and Serial using udev (older versions of Linux) outputStatus "Installing hotplug scripts..." if [ ! -e "/etc/hotplug/usb/Argyll" ]; then linkFile "$PREFIX/share/DisplayCAL/usb/Argyll" "/etc/hotplug/usb/Argyll" fi if [ ! -e "/etc/hotplug/usb/Argyll.usermap" ]; then linkFile "$PREFIX/share/DisplayCAL/usb/Argyll.usermap" "/etc/hotplug/usb/Argyll.usermap" fi fi fi fi [Uninstall] # Leaving this at the default is safe unless you use custom commands in # "Install" to create files. All autopackage API functions # that installs files are logged. uninstallFromLog # Determine python library prefix if [ `whoami` = "root" ]; then python_lib_prefix=None else python_lib_prefix=\"$PREFIX\" fi # Remove *.py[co] python -c "import glob import os import platform import sys from distutils.sysconfig import get_python_lib bits = platform.architecture()[0][:2] mod = os.path.join(get_python_lib(True, prefix=$python_lib_prefix), 'DisplayCAL') for pyco in (glob.glob(os.path.join(mod, '*.py[co]')) + glob.glob(os.path.join(mod, 'lib', '*.py[co]')) + glob.glob(os.path.join(mod, 'lib', 'agw', '*.py[co]')) + glob.glob(os.path.join(mod, 'lib' + bits, '*.py[co]')) + glob.glob(os.path.join(mod, 'lib' + bits, 'python%s%s' % sys.version_info[:2], '*.py[co]'))): os.remove(pyco)" # Remove menu entries for suffix in "" "-3dlut-maker" "-curve-viewer" "-profile-info" "-synthprofile" "-testchart-editor" ; do which xdg-desktop-menu > /dev/null 2>&1 && xdg-desktop-menu uninstall displaycal$suffix.desktop || true done DisplayCAL-3.1.0.0/autopackage/skeletons/0000755000076500000000000000000012653527012017770 5ustar devwheel00000000000000DisplayCAL-3.1.0.0/autopackage/skeletons/@numpy.scipy.org/0000755000076500000000000000000012653527012023154 5ustar devwheel00000000000000DisplayCAL-3.1.0.0/autopackage/skeletons/@numpy.scipy.org/numpy/0000755000076500000000000000000012653527012024324 5ustar devwheel00000000000000DisplayCAL-3.1.0.0/autopackage/skeletons/@numpy.scipy.org/numpy/skeleton.10000644000076500000000000000063012647526504026241 0ustar devwheel00000000000000[Meta] RootName: @numpy.scipy.org/numpy DisplayName: NumPy ShortName: numpy Skeleton-Author: Florian Höch Skeleton-Version: 1 [Notes] [Test] testForPythonModule numpy SOFTWARE_VERSIONS=`python -c 'import numpy; print numpy.__version__' ` if [[ "$?" != "0" ]]; then INTERFACE_VERSIONS="" else INTERFACE_VERSIONS=$( echo $SOFTWARE_VERSIONS | awk -F. '{print $1 "." $2}' ) fi DisplayCAL-3.1.0.0/autopackage/skeletons/@python.org/0000755000076500000000000000000012653527012022177 5ustar devwheel00000000000000DisplayCAL-3.1.0.0/autopackage/skeletons/@python.org/python/0000755000076500000000000000000012653527012023520 5ustar devwheel00000000000000DisplayCAL-3.1.0.0/autopackage/skeletons/@python.org/python/skeleton.10000644000076500000000000000106012647526504025433 0ustar devwheel00000000000000[Meta] RootName: @python.org/python DisplayName: Python Interpreter ShortName: python Skeleton-Author: Florian Höch Skeleton-Version: 2 [Notes] Tests only the "system" python executable. For example if python 2.5.2 is installed, INTERFACE_VERSIONS is "2.5" and SOFTWARE_VERSIONS is set to the output of "python -V". [Test] SOFTWARE_VERSIONS=$( locateCommand python -V 2>&1 | cut -f2 -d' ' ) if [[ "$?" != "0" ]]; then INTERFACE_VERSIONS="" else INTERFACE_VERSIONS=$( echo $SOFTWARE_VERSIONS | awk -F. '{print $1 "." $2}' ) fi DisplayCAL-3.1.0.0/autopackage/skeletons/@wxpython.org/0000755000076500000000000000000012653527012022556 5ustar devwheel00000000000000DisplayCAL-3.1.0.0/autopackage/skeletons/@wxpython.org/python-wxgtk/0000755000076500000000000000000012653527012025241 5ustar devwheel00000000000000DisplayCAL-3.1.0.0/autopackage/skeletons/@wxpython.org/python-wxgtk/skeleton.10000644000076500000000000000164612647526504027166 0ustar devwheel00000000000000[Meta] RootName: @wxpython.org/python-wxgtk DisplayName: wxPython GUI Toolkit (GTK) ShortName: python-wxgtk Skeleton-Author: Florian Höch Skeleton-Version: 1 [Notes] Earliest detected version is wxPython 2.5.3.0, where wxversion was introduced. [Test] INTERFACE_VERSIONS= # we test for wx and wxversion because even if wxversion is importable it does # NOT mean that wx is importable (the wxPython install might be broken or have # been tampered with, in which case wxversion might still find it, but # importing wx could fail) if testForPythonModule wx; then if testForPythonModule wxversion; then INTERFACE_VERSIONS=`python -c 'import wxversion; print " ".join([version.split("-")[0] for version in wxversion.getInstalled()])' ` fi fi SOFTWARE_VERSIONS=$INTERFACE_VERSIONS # We should probably publish some information about what wx libraries # (xrc, opengl, etc) are available -- maybe next time. DisplayCAL-3.1.0.0/DisplayCAL/0000755000076500000000000000000012653527012015422 5ustar devwheel00000000000000DisplayCAL-3.1.0.0/DisplayCAL/__init__.py0000644000076500000000000000021712647526531017543 0ustar devwheel00000000000000# -*- coding: utf-8 -*- try: import __version__ except ImportError: __version__ = "0.0.0.0" else: __version__ = __version__.VERSION_STRING DisplayCAL-3.1.0.0/DisplayCAL/__version__.py0000644000076500000000000000027212653527010020254 0ustar devwheel00000000000000# generated by setup.py BUILD_DATE = '2016-02-01T00:59:52.487617Z' LASTMOD = '2016-02-01T00:47:53.408104Z' VERSION = (3, 1, 0, 0) VERSION_BASE = (3, 1, 0, 0) VERSION_STRING = '3.1.0.0' DisplayCAL-3.1.0.0/DisplayCAL/argyll_cgats.py0000644000076500000000000002667212647526531020474 0ustar devwheel00000000000000# -*- coding: utf-8 -*- import decimal Decimal = decimal.Decimal import os import traceback from time import strftime from options import debug from safe_print import safe_print from util_io import StringIOu as StringIO from util_str import safe_unicode import CGATS import ICCProfile as ICCP cals = {} def quote_nonoption_args(args): """ Puts quotes around all arguments which are not options (ie. which do not start with a hyphen '-') """ args = list(args) for i, arg in enumerate(args): if arg[0] != "-": args[i] = '"' + arg + '"' return args def add_dispcal_options_to_cal(cal, options_dispcal): # Add dispcal options to cal options_dispcal = quote_nonoption_args(options_dispcal) try: cgats = CGATS.CGATS(cal) cgats[0].add_section("ARGYLL_DISPCAL_ARGS", " ".join(options_dispcal).encode("UTF-7", "replace")) return cgats except Exception, exception: safe_print(safe_unicode(traceback.format_exc())) def add_options_to_ti3(ti3, options_dispcal=None, options_colprof=None): # Add dispcal and colprof options to ti3 try: cgats = CGATS.CGATS(ti3) if options_colprof: options_colprof = quote_nonoption_args(options_colprof) cgats[0].add_section("ARGYLL_COLPROF_ARGS", " ".join(options_colprof).encode("UTF-7", "replace")) if options_dispcal and 1 in cgats: options_dispcal = quote_nonoption_args(options_dispcal) cgats[1].add_section("ARGYLL_DISPCAL_ARGS", " ".join(options_dispcal).encode("UTF-7", "replace")) return cgats except Exception, exception: safe_print(safe_unicode(traceback.format_exc())) def cal_to_fake_profile(cal): """ Create and return a 'fake' ICCProfile with just a vcgt tag. cal must refer to a valid Argyll CAL file and can be a CGATS instance or a filename. """ if not isinstance(cal, CGATS.CGATS): try: cal = CGATS.CGATS(cal) except (IOError, CGATS.CGATSInvalidError, CGATS.CGATSInvalidOperationError, CGATS.CGATSKeyError, CGATS.CGATSTypeError, CGATS.CGATSValueError), exception: safe_print(u"Warning - couldn't process CGATS file '%s': %s" % tuple(safe_unicode(s) for s in (cal, exception))) return None required_fields = ("RGB_I", "RGB_R", "RGB_G", "RGB_B") data_format = cal.queryv1("DATA_FORMAT") if data_format: for field in required_fields: if not field in data_format.values(): if debug: safe_print("[D] Missing required field:", field) return None for field in data_format.values(): if not field in required_fields: if debug: safe_print("[D] Unknown field:", field) return None entries = cal.queryv(required_fields) if len(entries) < 1: if debug: safe_print("[D] No entries found in", cal.filename) return None profile = ICCP.ICCProfile() profile.fileName = cal.filename profile._data = "\0" * 128 profile._tags.desc = ICCP.TextDescriptionType("", "desc") profile._tags.desc.ASCII = safe_unicode( os.path.basename(cal.filename)).encode("ascii", "asciize") profile._tags.desc.Unicode = safe_unicode(os.path.basename(cal.filename)) profile._tags.vcgt = ICCP.VideoCardGammaTableType("", "vcgt") profile._tags.vcgt.update({ "channels": 3, "entryCount": len(entries), "entrySize": 2, "data": [[], [], []] }) for n in entries: for i in range(3): profile._tags.vcgt.data[i].append(entries[n][i + 1] * 65535.0) profile.size = len(profile.data) profile.is_loaded = True return profile def can_update_cal(path): """ Check if cal can be updated by checking for required fields. """ try: calstat = os.stat(path) except Exception, exception: safe_print(u"Warning - os.stat('%s') failed: %s" % tuple(safe_unicode(s) for s in (path, exception))) return False if not path in cals or cals[path].mtime != calstat.st_mtime: try: cal = CGATS.CGATS(path) except (IOError, CGATS.CGATSInvalidError, CGATS.CGATSInvalidOperationError, CGATS.CGATSKeyError, CGATS.CGATSTypeError, CGATS.CGATSValueError), exception: if path in cals: del cals[path] safe_print(u"Warning - couldn't process CGATS file '%s': %s" % tuple(safe_unicode(s) for s in (path, exception))) else: if cal.queryv1("DEVICE_CLASS") == "DISPLAY" and not None in \ (cal.queryv1("TARGET_WHITE_XYZ"), cal.queryv1("TARGET_GAMMA"), cal.queryv1("BLACK_POINT_CORRECTION"), cal.queryv1("QUALITY")): cals[path] = cal return path in cals and cals[path].mtime == calstat.st_mtime def extract_cal_from_ti3(ti3_data): """ Extract and return the CAL section of a TI3. ti3_data can be a file object or a string holding the data. """ if isinstance(ti3_data, (str, unicode)): ti3 = StringIO(ti3_data) else: ti3 = ti3_data cal = False cal_lines = [] for line in ti3: line = line.strip() if line == "CAL": line = "CAL " # Make sure CGATS file identifiers are # always a minimum of 7 characters cal = True if cal: cal_lines.append(line) if line == 'END_DATA': break if isinstance(ti3, file): ti3.close() return "\n".join(cal_lines) def extract_fix_copy_cal(source_filename, target_filename=None): """ Return the CAL section from a profile's embedded measurement data. Try to 'fix it' (add information needed to make the resulting .cal file 'updateable') and optionally copy it to target_filename. """ from worker import get_options_from_profile try: profile = ICCP.ICCProfile(source_filename) except (IOError, ICCP.ICCProfileInvalidError), exception: return exception if "CIED" in profile.tags or "targ" in profile.tags: cal_lines = [] ti3 = StringIO(profile.tags.get("CIED", "") or profile.tags.get("targ", "")) ti3_lines = [line.strip() for line in ti3] ti3.close() cal_found = False for line in ti3_lines: line = line.strip() if line == "CAL": line = "CAL " # Make sure CGATS file identifiers are #always a minimum of 7 characters cal_found = True if cal_found: cal_lines.append(line) if line == 'DEVICE_CLASS "DISPLAY"': options_dispcal = get_options_from_profile(profile)[0] if options_dispcal: whitepoint = False b = profile.tags.lumi.Y for o in options_dispcal: if o[0] == "y": cal_lines.append('KEYWORD "DEVICE_TYPE"') if o[1] == "c": cal_lines.append('DEVICE_TYPE "CRT"') else: cal_lines.append('DEVICE_TYPE "LCD"') continue if o[0] in ("t", "T"): continue if o[0] == "w": continue if o[0] in ("g", "G"): if o[1:] == "240": trc = "SMPTE240M" elif o[1:] == "709": trc = "REC709" elif o[1:] == "l": trc = "L_STAR" elif o[1:] == "s": trc = "sRGB" else: trc = o[1:] if o[0] == "G": try: trc = 0 - Decimal(trc) except decimal.InvalidOperation, \ exception: continue cal_lines.append('KEYWORD "TARGET_GAMMA"') cal_lines.append('TARGET_GAMMA "%s"' % trc) continue if o[0] == "f": cal_lines.append('KEYWORD ' '"DEGREE_OF_BLACK_OUTPUT_OFFSET"') cal_lines.append( 'DEGREE_OF_BLACK_OUTPUT_OFFSET "%s"' % o[1:]) continue if o[0] == "k": cal_lines.append('KEYWORD ' '"BLACK_POINT_CORRECTION"') cal_lines.append( 'BLACK_POINT_CORRECTION "%s"' % o[1:]) continue if o[0] == "B": cal_lines.append('KEYWORD ' '"TARGET_BLACK_BRIGHTNESS"') cal_lines.append( 'TARGET_BLACK_BRIGHTNESS "%s"' % o[1:]) continue if o[0] == "q": if o[1] == "l": q = "low" elif o[1] == "m": q = "medium" else: q = "high" cal_lines.append('KEYWORD "QUALITY"') cal_lines.append('QUALITY "%s"' % q) continue if not whitepoint: cal_lines.append('KEYWORD "NATIVE_TARGET_WHITE"') cal_lines.append('NATIVE_TARGET_WHITE ""') if cal_lines: if target_filename: try: f = open(target_filename, "w") f.write("\n".join(cal_lines)) f.close() except Exception, exception: return exception return cal_lines else: return None def ti3_to_ti1(ti3_data): """ Create and return TI1 data converted from TI3. ti3_data can be a file object, a list of strings or a string holding the data. """ ti3 = CGATS.CGATS(ti3_data) if not ti3: return "" ti3[0].type = "CTI1" ti3[0].DESCRIPTOR = "Argyll Calibration Target chart information 1" ti3[0].ORIGINATOR = "Argyll targen" if hasattr(ti3[0], "COLOR_REP"): color_rep = ti3[0].COLOR_REP.split('_')[0] else: color_rep = "RGB" ti3[0].add_keyword("COLOR_REP", color_rep) ti3[0].remove_keyword("DEVICE_CLASS") if hasattr(ti3[0], "LUMINANCE_XYZ_CDM2"): ti3[0].remove_keyword("LUMINANCE_XYZ_CDM2") if hasattr(ti3[0], "ARGYLL_COLPROF_ARGS"): del ti3[0].ARGYLL_COLPROF_ARGS return str(ti3[0]) def vcgt_to_cal(profile): """ Return a CAL (CGATS instance) from vcgt """ cgats = CGATS.CGATS(file_identifier="CAL ") context = cgats.add_data({"DESCRIPTOR": "Argyll Device Calibration State"}) context.add_data({"ORIGINATOR": "vcgt"}) context.add_data({"CREATED": strftime("%a %b %d %H:%M:%S %Y", profile.dateTime.timetuple())}) context.add_keyword("DEVICE_CLASS", "DISPLAY") context.add_keyword("COLOR_REP", "RGB") context.add_keyword("RGB_I") key = "DATA_FORMAT" context[key] = CGATS.CGATS() context[key].key = key context[key].parent = context context[key].root = cgats context[key].type = key context[key].add_data(("RGB_I", "RGB_R", "RGB_G", "RGB_B")) key = "DATA" context[key] = CGATS.CGATS() context[key].key = key context[key].parent = context context[key].root = cgats context[key].type = key values = profile.tags.vcgt.getNormalizedValues() for i, triplet in enumerate(values): context[key].add_data(("%.7f" % (i / float(len(values) - 1)), ) + triplet) return cgats def verify_cgats(cgats, required, ignore_unknown=True): """ Verify and return a CGATS instance or None on failure. Verify if a CGATS instance has a section with all required fields. Return the section as CGATS instance on success, None on failure. If ignore_unknown evaluates to True, ignore fields which are not required. Otherwise, the CGATS data must contain only the required fields, no more, no less. """ cgats_1 = cgats.queryi1(required) if cgats_1 and cgats_1.parent and cgats_1.parent.parent: cgats_1 = cgats_1.parent.parent if cgats_1.queryv1("NUMBER_OF_SETS"): if cgats_1.queryv1("DATA_FORMAT"): for field in required: if not field in cgats_1.queryv1("DATA_FORMAT").values(): raise CGATS.CGATSKeyError("Missing required field: %s" % field) if not ignore_unknown: for field in cgats_1.queryv1("DATA_FORMAT").values(): if not field in required: raise CGATS.CGATSError("Unknown field: %s" % field) else: raise CGATS.CGATSInvalidError("Missing DATA_FORMAT") else: raise CGATS.CGATSInvalidError("Missing NUMBER_OF_SETS") modified = cgats_1.modified cgats_1.filename = cgats.filename cgats_1.modified = modified return cgats_1 else: raise CGATS.CGATSKeyError("Missing required fields: %s" % ", ".join(required)) def verify_ti1_rgb_xyz(cgats): """ Verify and return a CGATS instance or None on failure. Verify if a CGATS instance has a TI1 section with all required fields for RGB devices. Return the TI1 section as CGATS instance on success, None on failure. """ return verify_cgats(cgats, ("RGB_R", "RGB_B", "RGB_G", "XYZ_X", "XYZ_Y", "XYZ_Z")) DisplayCAL-3.1.0.0/DisplayCAL/argyll_instruments.json0000644000076500000000000002203612647526531022275 0ustar devwheel00000000000000{ /* instrument names from Argyll source spectro/insttypes.c spectral: Does the instrument support spectral readings? adaptive_mode: Does the instrument support adaptive emissive readings? highres_mode: Does the instrument support high-res spectral readings? projector_mode: Does the instrument support a special projector mode? sensor_cal: Does the instrument need to calibrate its sensor by putting it on a reference tile or black surface? A value of false for sensor_cal means the instrument can be left on the display A value of true for sensor_cal means the instrument must be removed from the display for sensor calibration if it cannot be skipped skip_sensor_cal: Can the sensor calibration be skipped? integration_time: Approx. integration time (seconds) for black and white, based on measurements on wide-gamut IPS display with 0.23 cd/m2 black and 130 cd/m2 white level, rounded to multiple of .1 seconds. Instruments which I don't own have been estimated. A value of null for any of the keys means unknown/not tested Instruments can have an id (short string) that is different than the long instrument name. In case no id is given, the instrument name is the same as the id. */ "DTP92": { "spectral": false, "adaptive_mode": false, "highres_mode": false, "projector_mode": false, "sensor_cal": null, "skip_sensor_cal": null }, "DTP94": { "spectral": false, "adaptive_mode": false, "highres_mode": false, "projector_mode": false, "sensor_cal": false, "skip_sensor_cal": false, // DTP94 instrument access fails // when using -N option to skip automatic sensor calibration // (dispread -D9 output: "Setting no-sensor_calibrate failed // failed with 'Unsupported function'") "integration_time": [4.0, 1.1] // Estimated }, "Spectrolino": { "spectral": true, "adaptive_mode": false, "highres_mode": false, "projector_mode": false, "sensor_cal": true, "skip_sensor_cal": true }, "SpectroScan": { "spectral": true, "adaptive_mode": false, "highres_mode": false, "projector_mode": false, "sensor_cal": true, "skip_sensor_cal": true }, "SpectroScanT": { "spectral": true, "adaptive_mode": false, "highres_mode": false, "projector_mode": false, "sensor_cal": true, "skip_sensor_cal": true }, "Spectrocam": { "spectral": true, "adaptive_mode": false, "highres_mode": false, "projector_mode": false, "sensor_cal": true, "skip_sensor_cal": null }, "i1 Display": { // Argyll 1.3.5 and earlier "id": "i1D1", "spectral": false, "adaptive_mode": false, "highres_mode": false, "projector_mode": false, "sensor_cal": false, "skip_sensor_cal": false, "integration_time": [4.0, 1.0] // Using i1D2 values }, "i1 Display 1": { // Argyll 1.3.6 and newer "id": "i1D1", "spectral": false, "adaptive_mode": false, "highres_mode": false, "projector_mode": false, "sensor_cal": true, "skip_sensor_cal": false, "integration_time": [4.0, 1.0] // Using i1D2 values }, "i1 Display 2": { // Argyll 1.3.6 and newer "id": "i1D2", "spectral": false, "adaptive_mode": false, "highres_mode": false, "projector_mode": false, "sensor_cal": false, "skip_sensor_cal": false, // i1 Display 2 instrument access fails // when using -N option to skip automatic sensor calibration // (dispread -D9 output: "Setting no-sensor_calibrate failed // failed with 'Unsupported function'") "integration_time": [4.0, 1.0] // Measured }, "i1 DisplayPro, ColorMunki Display": { "id": "i1D3", "spectral": false, "adaptive_mode": false, "highres_mode": false, "projector_mode": false, "sensor_cal": false, "skip_sensor_cal": false, "measurement_mode_map": {"c": "r", "l": "n"}, "integration_time": [2.6, 0.2] // Measured }, "i1 Monitor": { // like i1Pro "spectral": true, "adaptive_mode": true, "highres_mode": true, "projector_mode": false, "sensor_cal": true, "skip_sensor_cal": true, "integration_time": [9.2, 3.9] // Using i1 Pro values }, "i1 Pro": { "spectral": true, "adaptive_mode": true, "highres_mode": true, "projector_mode": false, "sensor_cal": true, "skip_sensor_cal": true, "integration_time": [9.2, 3.9] // Measured (i1 Pro Rev. A) }, "i1 Pro 2": { "spectral": true, "adaptive_mode": true, "highres_mode": true, "projector_mode": false, "sensor_cal": true, "skip_sensor_cal": true, "integration_time": [9.2, 3.9] // Using i1 Pro values }, "ColorHug": { "spectral": false, "adaptive_mode": false, "highres_mode": false, "projector_mode": false, "sensor_cal": null, "skip_sensor_cal": null, "integration_time": [1.8, 0.8] // Measured (ColorHug #660) }, "ColorHug2": { "spectral": false, "adaptive_mode": false, "highres_mode": false, "projector_mode": false, "sensor_cal": null, "skip_sensor_cal": null, "integration_time": [2.0, 0.6] // Measured (ColorHug2 prototype #2) }, "ColorMunki": { "spectral": true, "adaptive_mode": true, "highres_mode": true, "projector_mode": true, "sensor_cal": true, "skip_sensor_cal": true, "integration_time": [9.2, 3.9] // Using i1 Pro values }, "Colorimtre HCFR": { "id": "HCFR", "spectral": false, "adaptive_mode": false, "highres_mode": false, "projector_mode": false, "sensor_cal": null, "skip_sensor_cal": null }, "ColorMunki Smile": { // Argyll 1.5.x and newer "id": "Smile", "spectral": false, "adaptive_mode": false, "highres_mode": false, "projector_mode": false, "sensor_cal": false, "skip_sensor_cal": false, "integration_time": [4.0, 1.0] // Using i1D2 values }, "EX1": { "spectral": true, "adaptive_mode": false, "highres_mode": false, "projector_mode": false, "sensor_cal": true, "skip_sensor_cal": true, "integration_time": [9.2, 3.9] // Using i1 Pro values }, "K-10": { "spectral": false, "adaptive_mode": false, "highres_mode": false, "projector_mode": false, "sensor_cal": null, "skip_sensor_cal": null, "integration_time": [1.1, 0.1] // Using i1D3 values halved }, "Spyder2": { "spectral": false, "adaptive_mode": false, "highres_mode": false, "projector_mode": false, "sensor_cal": null, "skip_sensor_cal": null, "integration_time": [10.5, 2.3] // Using Spyder3 values }, "Spyder3": { "spectral": false, "adaptive_mode": false, "highres_mode": false, "projector_mode": false, "sensor_cal": null, "skip_sensor_cal": null, "measurement_mode_map": {"c": "r", "l": "n"}, "integration_time": [10.5, 2.3] // Estimated }, "Spyder4": { "spectral": false, "adaptive_mode": false, "highres_mode": false, "projector_mode": false, "sensor_cal": null, "skip_sensor_cal": null, "measurement_mode_map": {"c": "r", "l": "n"}, "integration_time": [10.5, 2.3] // Using Spyder3 values }, "Spyder5": { "spectral": false, "adaptive_mode": false, "highres_mode": false, "projector_mode": false, "sensor_cal": null, "skip_sensor_cal": null, "measurement_mode_map": {"c": "r", "l": "n"}, "integration_time": [10.5, 2.3] // Using Spyder3 values }, "Huey": { "spectral": false, "adaptive_mode": false, "highres_mode": false, "projector_mode": false, "sensor_cal": null, "skip_sensor_cal": null, "integration_time": [4.0, 1.0] // Using i1D2 values }, "specbos": { "spectral": true, "adaptive_mode": false, "highres_mode": false, "projector_mode": false, "sensor_cal": null, "skip_sensor_cal": null, "measurement_mode_map": {"c": "r", "l": "n"}, "integration_time": [3.3, 0.8] // Estimated, VERY rough }, "specbos 1201": { "spectral": true, "adaptive_mode": false, "highres_mode": false, "projector_mode": false, "sensor_cal": null, "skip_sensor_cal": null, "integration_time": [10.3, 2.8] // Estimated, VERY rough }, "Dummy Meter / Hires & Projector": { // dummy instrument, just for testing "spectral": false, "adaptive_mode": false, "highres_mode": true, "projector_mode": true, "sensor_cal": false, "skip_sensor_cal": false }, "Dummy Spectro / Hires & Projector": { // dummy instrument, just for testing "spectral": true, "adaptive_mode": false, "highres_mode": true, "projector_mode": true, "sensor_cal": true, "skip_sensor_cal": true }, "Dummy Meter / Adaptive, Hires & Projector": { // dummy instrument, just for testing "spectral": false, "adaptive_mode": true, "highres_mode": true, "projector_mode": true, "sensor_cal": false, "skip_sensor_cal": false }, "Dummy Spectro / Adaptive, Hires & Projector": { // dummy instrument, just for testing "spectral": true, "adaptive_mode": true, "highres_mode": true, "projector_mode": true, "sensor_cal": true, "skip_sensor_cal": true } }DisplayCAL-3.1.0.0/DisplayCAL/argyll_instruments.py0000644000076500000000000000135712647526531021757 0ustar devwheel00000000000000# -*- coding: utf-8 -*- from itertools import izip import re from jsondict import JSONDict from util_str import strtr instruments = JSONDict("argyll_instruments.json") vendors = [ "ColorVision", "Datacolor", "GretagMacbeth", "Hughski", "Image Engineering", "JETI", "Klein", "X-Rite", "Xrite" ] def get_canonical_instrument_name(instrument_name, replacements=None, inverse=False): replacements = replacements or {} if inverse: replacements = dict(izip(replacements.itervalues(), replacements.iterkeys())) return strtr(remove_vendor_names(instrument_name), replacements) def remove_vendor_names(txt): for vendor in vendors: txt = re.sub(re.escape(vendor) + r"\s*", "", txt, re.I) txt = txt.strip() return txt DisplayCAL-3.1.0.0/DisplayCAL/argyll_names.py0000644000076500000000000000365312647526531020470 0ustar devwheel00000000000000# -*- coding: utf-8 -*- # Argyll CMS tools used by DisplayCAL names = [ "applycal", "average", "cctiff", "ccxxmake", "dispcal", "dispread", "collink", "colprof", "dispwin", "fakeread", "iccgamut", "icclu", "xicclu", "spotread", "spyd2en", "spyd4en", "targen", "tiffgamut", "txt2ti3", "i1d3ccss", "viewgam", "oeminst", "profcheck" ] # Argyll CMS tools optionally used by DisplayCAL optional = ["applycal", "average", "cctiff", "ccxxmake", "i1d3ccss", "oeminst", "spyd2en", "spyd4en", "tiffgamut"] prefixes_suffixes = ["argyll"] # Alternative tool names (from older Argyll CMS versions or with filename # prefix/suffix like on some Linux distros) altnames = {"txt2ti3": ["logo2cgats"], "icclu": ["xicclu"], "ccxxmake": ["ccmxmake"], "i1d3ccss": ["oeminst"], "spyd2en": ["oeminst"], "spyd4en": ["oeminst"]} def add_prefixes_suffixes(name, altname): for prefix_suffix in prefixes_suffixes: altnames[name].append("%s-%s" % (altname, prefix_suffix)) altnames[name].append("%s-%s" % (prefix_suffix, altname)) # Automatically populate the alternative tool names with prefixed/suffixed # versions for name in names: if not name in altnames: altnames[name] = [] _altnames = list(altnames[name]) for altname in _altnames: add_prefixes_suffixes(name, altname) altnames[name].append(name) add_prefixes_suffixes(name, name) altnames[name].reverse() # Viewing conditions supported by colprof (only predefined choices) viewconds = [ "pp", "pe", "pc", # Argyll 1.1.1 "mt", "mb", "md", "jm", "jd", "tv", # Argyll 1.6 "pcd", "ob", "cx" ] # Intents supported by colprof # pa = Argyll >= 1.3.3 # lp = Argyll >= 1.8.3 intents = ["a", "aa", "aw", "la", "lp", "ms", "p", "pa", "r", "s"] # Video input/output encodings supported by collink (Argyll >= 1.6) video_encodings = ["n", "t", "6", "7", "5", "2", "C", "x", "X"] # Observers observers = ["1931_2", "1955_2", "1964_10", "1964_10c", "1978_2", "shaw"] DisplayCAL-3.1.0.0/DisplayCAL/argyll_RGB2XYZ.py0000644000076500000000000001037712647526531020475 0ustar devwheel00000000000000# -*- coding: utf-8 -*- import math import colormath # from xcolorants.c icx_ink_table = { "C": [ [ 0.12, 0.18, 0.48 ], [ 0.12, 0.18, 0.48 ] ], "M": [ [ 0.38, 0.19, 0.20 ], [ 0.38, 0.19, 0.20 ] ], "Y": [ [ 0.76, 0.81, 0.11 ], [ 0.76, 0.81, 0.11 ] ], "K": [ [ 0.01, 0.01, 0.01 ], [ 0.04, 0.04, 0.04 ] ], "O": [ [ 0.59, 0.41, 0.03 ], [ 0.59, 0.41, 0.05 ] ], "R": [ [ 0.412414, 0.212642, 0.019325 ], [ 0.40, 0.21, 0.05 ] ], "G": [ [ 0.357618, 0.715136, 0.119207 ], [ 0.11, 0.27, 0.21 ] ], "B": [ [ 0.180511, 0.072193, 0.950770 ], [ 0.11, 0.27, 0.47 ] ], "W": [ [ 0.950543, 1.0, 1.089303 ], # D65 ? colormath.get_standard_illuminant("D50") ], # D50 "LC": [ [ 0.76, 0.89, 1.08 ], [ 0.76, 0.89, 1.08 ] ], "LM": [ [ 0.83, 0.74, 1.02 ], [ 0.83, 0.74, 1.02 ] ], "LY": [ [ 0.88, 0.97, 0.72 ], [ 0.88, 0.97, 0.72 ] ], "LK": [ [ 0.56, 0.60, 0.65 ], [ 0.56, 0.60, 0.65 ] ], "MC": [ [ 0.61, 0.81, 1.07 ], [ 0.61, 0.81, 1.07 ] ], "MM": [ [ 0.74, 0.53, 0.97 ], [ 0.74, 0.53, 0.97 ] ], "MY": [ [ 0.82, 0.93, 0.40 ], [ 0.82, 0.93, 0.40 ] ], "MK": [ [ 0.27, 0.29, 0.31 ], [ 0.27, 0.29, 0.31 ] ], "LLK": [ [ 0.76, 0.72, 0.65 ], # Very rough - should substiture real numbers [ 0.76, 0.72, 0.65 ] ], "": [ [ 0.0, 0.0, 0.0 ], [ 0.0, 0.0, 0.0 ] ] } s = { "Ynorm": 0.0, "iix": { 0: "R", 1: "G", 2: "B" } } s["Ynorm"] = 0.0 for e in xrange(3): s["Ynorm"] += icx_ink_table[s["iix"][e]][0][1] s["Ynorm"] = 1.0 / s["Ynorm"] def XYZ_denormalize_remove_glare(X, Y, Z): XYZ = [X, Y, Z] # De-Normalise Y from 1.0, & remove black glare for j in xrange(3): XYZ[j] = (XYZ[j] - icx_ink_table["K"][0][j]) / (1.0 - icx_ink_table["K"][0][j]) XYZ[j] /= s["Ynorm"] return tuple(XYZ) def XYZ_normalize_add_glare(X, Y, Z): XYZ = [X, Y, Z] # Normalise Y to 1.0, & add black glare for j in xrange(3): XYZ[j] *= s["Ynorm"] XYZ[j] = XYZ[j] * (1.0 - icx_ink_table["K"][0][j]) + \ icx_ink_table["K"][0][j] return tuple(XYZ) def RGB2XYZ(R, G, B): # from xcolorants.c -> icxColorantLu_to_XYZ d = (R, G, B) # We assume a simple additive model with gamma XYZ = [0.0, 0.0, 0.0] for e in xrange(3): v = d[e] if (v < 0.0): v = 0.0 elif (v > 1.0): v = 1.0 if (v <= 0.03928): v /= 12.92 else: v = math.pow((0.055 + v) / 1.055, 2.4) # Gamma for j in xrange(3): XYZ[j] += v * icx_ink_table[s["iix"][e]][0][j] return XYZ_normalize_add_glare(*XYZ) def XYZ2RGB(X, Y, Z): return colormath.XYZ2RGB(*XYZ_denormalize_remove_glare(X, Y, Z)) if __name__ == '__main__': for RGB, XYZ in iter(( ((1.0, 1.0, 1.0), (0.951065, 1.000000, 1.088440)), ((0.0, 0.0, 0.0), (0.010000, 0.010000, 0.010000)), ((0.5, 0.0, 0.0), (0.097393, 0.055060, 0.014095)), ((1.0, 0.0, 0.0), (0.418302, 0.220522, 0.029132)), ((0.0, 0.5, 0.0), (0.085782, 0.161542, 0.035261)), ((0.5, 0.5, 0.0), (0.173175, 0.206603, 0.039356)), ((1.0, 0.5, 0.0), (0.494083, 0.372064, 0.054393)), ((0.0, 1.0, 0.0), (0.364052, 0.718005, 0.128018)), ((0.5, 1.0, 0.0), (0.451445, 0.763065, 0.132113)), ((1.0, 1.0, 0.0), (0.772354, 0.928527, 0.147151)), ((0.0, 0.0, 0.5), (0.048252, 0.025298, 0.211475)), ((0.5, 0.0, 0.5), (0.135645, 0.070358, 0.215570)), ((1.0, 0.0, 0.5), (0.456553, 0.235820, 0.230607)), ((0.0, 0.5, 0.5), (0.124033, 0.176840, 0.236735)), ((0.5, 0.5, 0.5), (0.211427, 0.221901, 0.240831)), ((1.0, 0.5, 0.5), (0.532335, 0.387362, 0.255868)), ((0.0, 1.0, 0.5), (0.402304, 0.733303, 0.329493)), ((0.5, 1.0, 0.5), (0.489697, 0.778364, 0.333588)), ((1.0, 1.0, 0.5), (0.810605, 0.943825, 0.348625)), ((0.0, 0.0, 1.0), (0.188711, 0.081473, 0.951290)), ((0.5, 0.0, 1.0), (0.276104, 0.126533, 0.955385)), ((1.0, 0.0, 1.0), (0.597013, 0.291995, 0.970422)), ((0.0, 0.5, 1.0), (0.264493, 0.233015, 0.976550)), ((0.5, 0.5, 1.0), (0.351886, 0.278076, 0.980645)), ((1.0, 0.5, 1.0), (0.672794, 0.443537, 0.995683)), ((0.0, 1.0, 1.0), (0.542763, 0.789478, 1.069308)), ((0.5, 1.0, 1.0), (0.630157, 0.834539, 1.073403)))): XYZ1 = tuple(str(round(c, 6)) for c in RGB2XYZ(*RGB)) XYZ2 = tuple(str(c) for c in XYZ) try: assert(XYZ1 == XYZ2) except AssertionError: raise AssertionError('RGB2XYZ%r == (%s) != (%s)' % (RGB, ', '.join(XYZ1), ', '.join(XYZ2))) DisplayCAL-3.1.0.0/DisplayCAL/audio.py0000644000076500000000000002536212647526531017115 0ustar devwheel00000000000000# -*- coding: utf-8 -*- """ Audio wrapper module Can use pygame, pyglet, pyo or wx. pyglet or pygame will be used by default if available. pyglet can only be used if version >= 1.2.2 is available. pyo is still buggy under Linux and has a few quirks under Windows. pyglet seems like the best bet in the long run as pygame development is stagnant since 2009. wx doesn't support fading, changing volume, multiple concurrent sounds, and only supports wav format. Example: sound = Sound("test.wav", loop=True) sound.Play(fade_ms=1000) """ import sys import threading import time from log import safe_print _ch = {} _initialized = False _lib = None _lib_version = None _server = None _snd = {} _sounds = {} def init(lib=None, samplerate=44100, channels=2, buffersize=2048, reinit=False): """ (Re-)Initialize sound subsystem """ # Note on buffer size: Too high values cause crackling during fade, too low # values cause choppy playback of ogg files when using pyo (good value for # pyo is >= 2048) global _initialized, _lib, _lib_version, _server, pygame, pyglet, pyo, wx if _initialized and not reinit: # To re-initialize, explicitly set reinit to True return # Select the audio library we're going to use. # User choice or pyglet > pygame > pyo > wx if not lib: if sys.platform in ("darwin", "win32"): # Mac OS X, Windows libs = ("pyglet", "pygame", "pyo", "wx") else: # Linux libs = ("pygame", "pyglet", "pyo", "wx") for lib in libs: try: return init(lib, samplerate, channels, buffersize, reinit) except Exception, exception: pass raise exception elif lib == "pygame": try: import pygame, pygame.mixer _lib = "pygame" except ImportError: _lib = None else: if _initialized: pygame.mixer.quit() pygame.mixer.init(frequency=samplerate, channels=channels, buffer=buffersize) _server = pygame.mixer _lib_version = pygame.__version__ elif lib == "pyglet": try: import pyglet version = [] for item in pyglet.version.split("."): try: version.append(int(item)) except ValueError: version.append(item) if version < [1, 2, 2]: raise ImportError("pyglet version %s is too old" % pyglet.version) _lib = "pyglet" except ImportError: _lib = None else: # Work around localization preventing fallback to RIFFSourceLoader pyglet.lib.LibraryLoader.darwin_not_found_error = "" pyglet.lib.LibraryLoader.linux_not_found_error = "" # Set audio driver preference pyglet.options["audio"] = ("pulse", "openal", "directsound", "silent") _server = pyglet.media _lib_version = pyglet.version elif lib == "pyo": try: import pyo _lib = "pyo" except ImportError: _lib = None else: if isinstance(_server, pyo.Server): _server.reinit(sr=samplerate, nchnls=channels, buffersize=buffersize, duplex=0) else: _server = pyo.Server(sr=samplerate, nchnls=channels, buffersize=buffersize, duplex=0).boot() _server.start() _lib_version = ".".join(str(v) for v in pyo.getVersion()) elif lib == "wx": try: import wx _lib = "wx" except ImportError: _lib = None else: _server = wx _lib_version = wx.__version__ if not _lib: raise RuntimeError("No audio library available") _initialized = True return _server def safe_init(lib=None, samplerate=22050, channels=2, buffersize=2048, reinit=False): """ Like init(), but catch any exceptions """ global _initialized try: return init(lib, samplerate, channels, buffersize, reinit) except Exception, exception: # So we can check if initialization failed _initialized = exception return exception def Sound(filename, loop=False, raise_exceptions=False): """ Sound caching mechanism """ if (filename, loop) in _sounds: # Cache hit return _sounds[(filename, loop)] else: try: sound = _Sound(filename, loop) except Exception, exception: if raise_exceptions: raise safe_print(exception) sound = _Sound(None, loop) _sounds[(filename, loop)] = sound return sound class _DummySound(object): """ Dummy sound wrapper class """ def __init__(self, filename, loop=False): pass def fade(self, fade_ms, fade_in=None): return True @property def is_playing(self): return False def play(self, fade_ms=0): return True @property def play_count(self): return 0 def safe_fade(self, fade_ms, fade_in=None): return True def safe_play(self, fade_ms=0): return True def safe_stop(self, fade_ms=0): return True def stop(self, fade_ms=0): return True volume = 0 class _Sound(object): """ Sound wrapper class """ def __init__(self, filename, loop=False): self._filename = filename self._is_playing = False self._lib = _lib self._loop = loop self._play_timestamp = 0 self._play_count = 0 self._thread = -1 if not _initialized: init() if _initialized and not isinstance(_initialized, Exception): if not self._lib and _lib: self._lib = _lib if not self._snd and self._filename: if self._lib == "pyo": self._snd = pyo.SfPlayer(self._filename, loop=self._loop) elif self._lib == "pyglet": snd = pyglet.media.load(self._filename, streaming=False) self._ch = pyglet.media.Player() self._snd = snd elif self._lib == "pygame": self._snd = pygame.mixer.Sound(self._filename) elif self._lib == "wx": self._snd = wx.Sound(self._filename) def _get_ch(self): return _ch.get((self._filename, self._loop)) def _set_ch(self, ch): _ch[(self._filename, self._loop)] = ch _ch = property(_get_ch, _set_ch) def _fade(self, fade_ms, fade_in, thread): volume = self.volume if fade_ms and ((fade_in and volume < 1) or (not fade_in and volume)): count = 200 for i in xrange(count + 1): if fade_in: self.volume = volume + i / float(count) * (1.0 - volume) else: self.volume = volume - i / float(count) * volume time.sleep(fade_ms / 1000.0 / count) if self._thread is not thread: # If we are no longer the current thread, return immediately return if not self.volume: self.stop() def _get_volume(self): volume = 1.0 if self._snd: if self._lib == "pyo": volume = self._snd.mul elif self._lib == "pyglet": volume = self._ch.volume elif self._lib == "pygame": volume = self._snd.get_volume() return volume def _set_volume(self, volume): if self._snd and self._lib != "wx": if self._lib == "pyo": self._snd.mul = volume elif self._lib == "pyglet": self._ch.volume = volume elif self._lib == "pygame": self._snd.set_volume(volume) return True return False def _get_snd(self): return _snd.get((self._filename, self._loop)) def _set_snd(self, snd): _snd[(self._filename, self._loop)] = snd _snd = property(_get_snd, _set_snd) def fade(self, fade_ms, fade_in=None): """ Fade in/out. If fade_in is None, fade in/out depending on current volume. """ if fade_in is None: fade_in = not self.volume if fade_in and not self.is_playing: return self.play(fade_ms=fade_ms) elif self._snd and self._lib != "wx": self._thread += 1 threading.Thread(target=self._fade, args=(fade_ms, fade_in, self._thread)).start() return True return False @property def is_playing(self): if self._lib == "pyo": return bool(self._snd and self._snd.isOutputting()) elif self._lib == "pyglet": return bool(self._ch and self._ch.playing and self._ch.source and (self._loop or time.time() - self._play_timestamp < self._ch.source.duration)) elif self._lib == "pygame": return bool(self._ch and self._ch.get_busy()) return self._is_playing def play(self, fade_ms=0): if self._snd: volume = self.volume self.stop() if self._lib == "pyglet": # Can't reuse the player, won't replay the sound under Mac OS X # and Linux even when seeking to start position which allows # replaying the sound under Windows. self._ch.delete() self._ch = pyglet.media.Player() self.volume = volume if not self.is_playing and fade_ms and volume == 1: self.volume = 0 self._play_timestamp = time.time() if self._lib == "pyo": self._snd.out() elif self._lib == "pyglet": if self._loop: snd = pyglet.media.SourceGroup(self._snd.audio_format, self._snd.video_format) snd.loop = True snd.queue(self._snd) else: snd = self._snd self._ch.queue(snd) self._ch.play() elif self._lib == "pygame": self._ch = self._snd.play(-1 if self._loop else 0, fade_ms=0) elif self._lib == "wx" and self._snd.IsOk(): flags = wx.SOUND_ASYNC if self._loop: flags |= wx.SOUND_LOOP # The best we can do is have the correct state reflected # for looping sounds only self._is_playing = True # wx.Sound.Play is supposed to return True on success. # When I tested this, it always returned False, but still # played the sound. self._snd.Play(flags) if self._lib: self._play_count += 1 if fade_ms and self._lib != "wx": self.fade(fade_ms, True) return True return False @property def play_count(self): return self._play_count def safe_fade(self, fade_ms, fade_in=None): """ Like fade(), but catch any exceptions """ if not _initialized: safe_init() try: return self.fade(fade_ms, fade_in) except Exception, exception: return exception def safe_play(self, fade_ms=0): """ Like play(), but catch any exceptions """ if not _initialized: safe_init() try: return self.play(fade_ms) except Exception, exception: return exception def safe_stop(self, fade_ms=0): """ Like stop(), but catch any exceptions """ try: return self.stop(fade_ms) except Exception, exception: return exception def stop(self, fade_ms=0): if self._snd and self.is_playing: if self._lib == "wx": self._snd.Stop() self._is_playing = False elif fade_ms: self.fade(fade_ms, False) else: if self._lib == "pyglet": self._ch.pause() else: self._snd.stop() if self._lib == "pygame": self._ch = None return True else: return False volume = property(_get_volume, _set_volume) if __name__ == "__main__": import wx from config import get_data_path sound = Sound(get_data_path("theme/engine_hum_loop.wav"), True) app = wx.App(0) frame = wx.Frame(None, -1, "Test") frame.Bind(wx.EVT_CLOSE, lambda event: (sound.stop(1000) and _lib != "wx" and time.sleep(1), event.Skip())) panel = wx.Panel(frame) panel.Sizer = wx.BoxSizer() button = wx.Button(panel, -1, "Play") button.Bind(wx.EVT_BUTTON, lambda event: not sound.is_playing and sound.play(3000)) panel.Sizer.Add(button, 1) button = wx.Button(panel, -1, "Stop") button.Bind(wx.EVT_BUTTON, lambda event: sound.is_playing and sound.stop(3000)) panel.Sizer.Add(button, 1) panel.Sizer.SetSizeHints(frame) frame.Show() app.MainLoop() DisplayCAL-3.1.0.0/DisplayCAL/beep.wav0000644000076500000000000005147412647526531017077 0ustar devwheel00000000000000RIFF4SWAVEfmt DdataS64$%+*^^mnTTllMLuxAB CCZYuu ) * =< xw<>^\  KI./  YWgfLL 8 7 (($% fg** Z Z \]a_45wu y y bcxw  |{LM}{xyi h   nm ACCBH I  32FI_^  & (  hfPS  EEED /-ut77vw]\gg II24 ,+NO""10 dd53km!"""$$t u ~~hf77N O 55QQ xw) ' gfhiAAPP  WW  - + hg \ [ DC    11 aajja `  DDed)*225 6 53 ~  FF  )) YWE F FG iis s --67ggwwQSJI srzz fgmlVX\ [ bb 87. - NO   >=! ! __ )(I K POEE ML%% u u ~~00t t  USC C  yztw   42$$uu;<  mk\^ \]NN= < DC~~a ` ,-ONrr 99&'OQVV   KL@>ab32<< zz==\]  JL/-  WYfgMM 7 7 &&%' ef+, X X ]]a`56uu y z abww  }~KK}{xyi h   on CBCBG I  11IJ^`   % '  ghRS  EDCC -.us77wu[]hg  JJ13 ,,OM!$// bc55mm!!#!%'t v ~gg89O N 65PPyx( ) hhhi@AON  YX  , + ig ] ] CC     22abkka _  ! BCed+,125 5 33 }  FF  )+ XWD E IH jls q -,79fgwwRTJH sr|| ffmnXX[ Z bc 89. . OP   ;= _` ()J K PMFGKL%% t t ~}10r u  TUD D  yytu   44$$ut::  km][ \ZNP= < DEb b --ONqp <9&%PQWW   JL@@bc21<; yx=?\]   KK./  VXegNM 9 7 &(%& fg,+ X Y ^\_`54tw y y baxw  }}JJ~}xyi g   mn !BBBBH H  12HH^_  ' '  fgRQ  EFCD .-uu79xvZ[hh  JI42 +-OO"!01 dd44ln"" "'$t t ~hg89N O 66POzx( ( ghih?@PP  YX + , gg [ \ DB     22abkja `  BCdf,*125 4 43 ~~  GG  *( ZYE E IG kjr s ,,88ffvwSQJJ ss{| hgllWX\ \ `` 79- . QO  =>!  __ ))K L NMEG MJ&& t u }}10s t  UT  ! ts][UT65  89onQQ||32morsGFMN55##,,_^onTUlmMNvxBB EDXYuu + ) =; yx=>\\!  JK/.  YWefNL 7 7 ('$% he*+ Y Y ^]`_56vt y y bawy  ~}KL{{yyi i  on!BACBH H  22IH_^  ' '  hhOP  EDDE ..tv88vv\]hg  II22 ,+PO!"/0 ee44mm !"!&&u t ~}ih99N N 54QQ yx' ) hghhA>PO  WY - - ff ] [ BC     12 ackj^ _   CDed,)037 5 34 |}  FE  )) WZF D IH iks r ,-76ghwvQQJJ ts{{ gflmVV\ Z ac 88- / QP   ==" ! _` *+J K NOFEKK&$ t t |}11s s  USC D  zzuv   22#$vu;;  ml[[ [\PN< < DD` b ,,MOqq ::'(PNVW   KL@>bd11<< xz>=]\  JJ./  XWfgML 7 7 ('#% fg+, X X ^^__76ts x y abxx  }|KL||yyi i  ooACCBH H  43HI_^  & '  ggQQ  FCDB ..ut98ww\Zgh KI23 -,NN"#0/ dd55mn !""&'s t }fh8:N P 46QP xx( ( gghg>@OO  VX  * + gf \ \ CB    13bakj_ `   CCde+)225 6 43 |  FF  ** ZYE E HH kjq s -,78ggxxQRKJ ss{z ghmkWW[ [ cb :8/ / QP  =>! ~`a *+K L ONFE MK%% u v |}10t t  TTC D  zzvw   34%"tv;:  lk[^ \\NN; < DDb a ,-NMqq ::''NQXX   LK?@bb21;: zy>>^^ II-/  YWdgNM 8 6 ()%# ee*+ Y W \^``66ut y y abxx  ~}JK}|wzj g   lo CBBBH H  34HH^^   ( (  hgPR  EECF /.vv78wx[[hg  II33 +,NO$#//  dd53kn !!&&s r ~gg78N O 56PPxy( ) ghhh>@ON  WW - * gg \ \ BC    31!a`jka a  BBee*)128 6 23 |~  GG  +( YYC E HH kir s .-87gfxvRQIJ tq{| hfkmVW] \ `b 99. / QO   ==! ! `_ ))L L NNFE KL%$ u s }|21t t  TU  " ut[[TS57 87noQQ}|41mntsHHOMDisplayCAL-3.1.0.0/DisplayCAL/camera_shutter.wav0000644000076500000000000007236612647526531021175 0ustar devwheel00000000000000RIFFtWAVEfmt DXdatat~~}}~~~~}}}}~~~~}}~~||{{~~||}}}}~~}}}}}}}}{{zz~~zz{{~~}}{{zz{{||{{{{}}yy~~||{{}}}}}}~~tt~~ttppgg[[llssss~~}}ssee__[[tt{{{{ssvv||uuooxxjj__dduu{{TT[[xxbbnnvvmm}}ttMMNNccqqggkk}}llhhoozzwwee^^ppxx^^OOggzzooyyqqbbeeppvvwwzz}}||nnnnuuzzttxxxxnnqqttvv}}vvoommxxyylljjqq{{{{||ssooooss{{qquu||{{vvooooww~~xxkkoowwuu{{}}ttww{{}}}}}}{{{{wwuu}}{{xx{{}}~~~~rrss}}||||~~{{zz}}~~zzwwyy}}{{||}}~~{{uuoorr}}~~{{wwwwzz}}||||{{||}}{{~~~~||zz{{}}zzww||}}}}~~}}||yyzz~~}}}}~~}}}}}}~~~~}}~~~~~~~~~~~~}}}}~~~~~~||}}}}}}~~~~||||~~~~~~}}~~~~}}{{}}}}||}}||}}}}}}~~}}}}~~~~~~||~~}}}}}}}}xx{{||{{~~{{}}{{uu{{vvrrttvvvvqqzz}}vvuuxxttxx}}~~~~{{ttww{{xxwwxx}}~~zz}}{{uuww~~||wwttxx{{}}{{{{~~}}{{xx{{~~||{{}}~~||}}}}}}}}}}~~}}~~}}||}}}}}}||||~~}}}}}}}}}}{{{{}}~~}}||||~~~~}}}}~~~~}}||||~~~~~~}}~~~~~~}}}}~~~~~~}}}}~~}}}}~~~~~~~~}}}}}}}}~~}}}}}}}}}}~~~~}}}}}}~~}}}}||}}~~~~}}}}~~}}}}}}}}~~~~~~||}}}}~~~~}}~~}}}}}}~~~~}}}}}}}}~~~~}}}}~~~~~~~~~~}}~~~~~~}}~~}}}}}}{{||}}||~~}}}}{{yyzzrroovv{{vvpprr}}||vvqqqqvvzzuuttyyzzwwzz||yyrrsszzxxttuu{{~~yyzz}}}}yyxx{{~~~~~~}}~~~~~~~~~~~~}}~~~~~~~~}}}}}}}}}}}}~~}}}}~~}}{{}}~~}}~~~~~~~~}}}}||}}}}}}}}~~~~~~~~~~~~~~}}}}}}~~~~~~~~}}~~}}~~~~~~}}}}~~~~{{{{}}}}{{||}}}}}}}}~~~~~~}}}}~~||}}~~~~~~}}~~}}~~~~~~}}~~~~~~}}}}}}}}}}~~}}}}~~~~~~~~}}~~}}||}}~~~~~~~~~~~~}}~~~~}}~~~~~~~~~~}}}}~~~~}}}}~~}}}}~~~~~~~~}}~~~~}}}}~~~~}}~~~~}}~~~~~~~~~~~~}}~~}}~~~~}}}}}}}}~~~~~~~~~~~~~~}}}}~~~~}}}}}}}}~~}}||}}~~~~~~~~~~~~~~}}}}~~}}~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}~~}}||||}}}}||||~~}}}}~~~~{{vv||{{rrrrxxzzzzxx||}}}}}}~~}}}}{{xxxx}}{{xxvvxxzz{{}}yyww{{yyuuyy{{||||yy{{}}}}}}{{xxxxzz~~~~||zzzz{{}}}}{{{{||~~~~{{yyzz~~}}{{{{{{~~}}{{zz{{}}zzxxwwxx}}~~}}||||{{zz{{}}}}{{{{}}yy``oozzhhooqqjjllvveessgggg{{rrbboojjggzz^^YYuujjttssxxvvooxx~~}}xxvvrrooss{{}}uuqqssxx}}{{zz{{~~~~~~~~{{yy{{||yy{{}}}}{{~~}}~~}}{{{{yyyy~~}}yyxx~~}}{{}}}}{{yy{{||{{}}~~~~}}{{{{}}||||||zzzz{{}}}}}}||{{||}}}}~~}}}}}}||}}~~~~}}}}}}}}}}}}}}zz{{}}}}}}||yywwxxzz}}~~{{{{~~}}{{{{{{{{}}}}{{{{~~~~~~}}{{yyzz||}}~~}}||}}}}||}}~~}}{{||~~}}}}}}{{}}~~}}}}{{xxwwww{{}}}}||||}}{{{{{{}}~~~~~~||zz{{}}}}~~~~}}||||}}~~}}||}}~~~~~~~~~~}}}}}}~~}}}}~~}}}}}}~~}}}}~~~~~~}}}}~~~~~~~~~~~~~~}}}}~~~~~~~~~~~~}}~~~~~~}}}}~~~~}}}}~~}}}}}}}}}}}}}}}}}}~~}}||}}}}||}}{{}}~~}}||}}~~{{||}}||~~zz}}{{rryy{{zzzzsswwyyvvvvttvvxxzz}}zzww{{yyzz}}xx||}}{{}}}}zzvvuu{{||xxxxzz{{{{~~wwuu{{~~zzxxzz}}}}||}}}}||~~}}||~~||{{{{}}~~~~}}}}}}~~{{||}}||||}}||{{yyxxxx{{~~~~}}}}~~||{{zz{{~~}}}}~~}}||zz~~{{{{xx||||zz~~}}{{zz||yyvvqqvv}}xxxxzz~~zzvvssssttxxzzxxwwxx~~||~~xxqqxx}}zzxx}}}}~~||{{}}xxyy~~~~{{{{}}{{xx}}}}{{}}}}yy{{||{{}}~~}}||||||xxvvxx}}{{{{}}}}~~~~~~||||||~~}}{{}}{{zz{{}}~~~~~~~~~~}}||||}}{{zzxxyy{{~~~~}}||||}}}}~~~~~~~~~~{{{{{{}}~~}}}}}}}}{{||}}~~~~}}}}}}~~~~~~~~~~~~~~~~}}}}}}~~~~~~}}}}}}~~~~~~}}}}}}~~~~~~~~}}}}~~~~}}~~~~}}}}~~~~}}~~~~~~~~~~}}||}}~~~~~~~~~~~~}}}}}}}}}}~~}}~~~~~~~~~~~~}}}}~~~~~~~~}}}}~~~~}}}}~~~~}}}}~~}}}}~~~~}}}}~~~~~~~~~~}}}}}}~~~~}}}}~~~~}}}}}}~~~~}}~~~~~~~~}}}}~~}}{{{{}}~~}}}}~~~~~~~~~~~~~~}}~~~~}}~~~~~~~~}}~~~~}}}}}}}}~~~~}}||||}}~~~~~~}}}}}}}}}}}}||||}}~~~~}}}}}}}}}}}}{{yy{{~~~~~~}}~~}}}}}}~~~~~~}}{{{{||}}||||{{{{{{}}~~}}}}}}}}}}~~}}{{{{{{{{}}}}~~~~~~}}}}}}||||||}}~~~~}}{{{{||||}}}}||{{{{{{{{||}}~~~~}}~~}}}}}}}}~~}}}}}}}}}}}}}}}}~~}}}}}}}}||||||}}||}}}}}}~~~~~~}}{{{{{{{{{{{{{{{{}}~~~~}}||||||}}{{wwww{{~~}}}}}}~~}}{{yyzz||~~~~~~}}||||}}~~~~~~||}}}}~~||{{||~~~~~~~~}}}}||}}~~~~~~~~~~}}}}}}}}}}}}}}~~~~~~~~~~}}~~}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}~~~~}}~~~~~~~~}}}}}}~~~~}}}}}}}}}}}}~~~~}}}}}}}}~~~~~~}}||||}}}}}}~~~~~~}}}}~~}}}}}}~~~~~~~~}}}}||{{{{}}}}~~}}}}}}~~~~}}~~~~}}}}}}~~~~~~~~}}}}~~~~~~~~~~}}~~~~~~~~~~~~}}}}~~~~~~~~~~~~}}~~}}}}}}}}~~~~}}||}}~~~~~~~~~~}}}}}}~~{{zz{{}}~~~~~~~~~~}}}}~~~~}}}}}}~~~~~~~~~~}}}}||}}~~~~~~~~}}~~}}||||||}}~~}}||{{{{{{}}}}||}}~~~~~~}}||{{{{}}}}{{zzzz{{}}}}||{{||||}}~~}}}}||}}~~~~}}}}}}}}}}}}}}}}~~}}}}~~}}||||||||}}~~~~}}}}~~}}}}||||}}}}~~}}}}}}~~~~}}||}}}}}}~~}}{{}}}}~~~~}}}}~~~~~~}}~~~~}}}}~~~~~~||||||}}~~~~~~}}~~}}}}~~~~}}}}~~}}}}{{zz||~~}}}}}}}}||{{||||}}~~}}{{}}~~~~~~yy}}xxzz~~}}||||{{~~}}{{{{||{{{{}}}}~~}}}}}}}}~~}}}}}}}}||||}}}}~~||}}~~}}}}}}{{||}}}}||xxxxyyzz||~~}}||{{||}}~~~~}}||{{{{}}}}{{zz{{{{}}}}||||||}}}}~~}}{{zzzz{{}}~~}}{{{{{{}}~~}}{{{{{{}}~~~~}}}}}}||||~~}}{{zzzz{{||~~~~||{{yyxxyy{{}}~~}}{{{{{{{{{{}}}}||}}}}}}}}}}{{yy{{{{yy{{zz{{zz{{xx}}zzvvvvwwzz{{wwoovv{{oommrryywwuu{{}}ttrrvv{{zz}}}}ssqqvvyyyy~~yyuussvvxx{{~~~~{{zz{{{{yy{{}}}}xxvvvvxx||~~xxxx{{{{{{{{wwuuvvzz}}{{xxvvvvuuxx{{}}~~}}||yyxxxxyy}}||yyxxwwyy}}||{{zzzz}}~~}}}}~~}}}}}}~~}}~~~~||zzyyyy{{~~||{{{{{{{{{{zzzz}}}}zzxxyy{{{{zz{{}}~~}}}}}}{{{{}}~~}}{{||}}~~{{yy{{~~~~~~}}xxvvyyzz{{}}{{{{}}~~~~~~~~~~}}zzxxzz}}}}}}}}}}||||}}}}{{zz{{||~~~~~~~~}}||}}}}||}}~~}}||{{{{{{||}}~~~~}}~~}}{{zzyyzz{{||}}}}}}~~~~}}}}||{{zzzz{{}}~~}}}}}}||}}||}}}}{{{{{{}}}}||||~~}}}}}}{{{{{{{{}}}}}}}}}}~~~~}}||{{{{||}}~~~~}}~~}}~~~~}}}}}}~~||zzzz{{~~}}||||}}~~~~~~~~}}||}}}}~~}}{{{{}}{{{{{{}}}}}}}}~~~~~~}}}}}}}}~~~~{{zz{{||}}}}}}}}zzxxxx{{}}~~}}}}}}}}}}||}}~~}}{{xxzz||~~~~||{{{{{{}}||zzyyzz{{||}}~~}}}}{{zz{{||~~~~}}}}{{{{||}}}}}}||{{}}}}||||}}}}}}}}~~}}||{{||}}}}}}~~~~}}{{zz{{||}}||||}}||zz{{{{||}}~~~~}}{{||}}}}}}~~~~~~}}{{||~~}}{{zz{{||}}~~~~||zzyy{{{{{{{{||||||~~}}||{{}}}}}}}}}}}}~~}}||{{||||||~~}}}}||||}}~~~~~~}}{{yyxxxxzz~~~~}}~~~~~~}}}}}}}}}}~~{{zz{{}}}}{{zzyyyyyyyy{{~~}}}}}}}}||}}~~{{yyxxyy}}~~}}{{zz{{{{}}}}{{{{{{||}}||{{zzzz||~~}}}}||}}}}}}~~}}||{{{{{{{{}}}}||{{{{{{||}}~~}}}}}}||}}~~{{zzzz{{||}}~~}}{{{{{{}}}}{{{{{{}}}}||{{{{{{{{~~~~}}||{{zz{{}}}}||{{{{}}~~||{{{{||}}}}}}}}}}}}||{{}}}}{{{{{{||}}}}}}||||||~~}}||{{{{}}~~}}{{{{}}~~}}{{{{{{||}}}}~~}}{{{{{{{{~~~~||{{zzzz{{}}~~}}}}}}||||}}}}||{{{{}}~~}}{{{{zz{{~~||{{||zzxxxxzz}}}}zzzz}}~~{{yyyy{{}}{{{{||}}}}{{zzyy{{}}}}{{{{{{||}}~~}}{{zzzz{{||~~}}}}||||||}}}}||{{{{{{{{||}}}}}}||{{{{||~~~~}}{{zzzz{{||~~}}{{yyyy{{}}}}{{zzzz{{{{}}}}~~||{{{{{{||}}~~||{{zzzz{{{{}}}}{{{{{{{{}}||zzxxxxxxzz{{~~~~}}}}}}}}}}~~}}{{yyxxyyzz||~~}}||||||}}~~}}{{{{zzzz{{||}}~~||||{{{{||}}~~}}{{zzyyzzzz||~~}}||||||}}~~~~}}||{{{{{{{{}}}}}}||{{{{||}}}}||{{zzzz{{||~~}}}}}}||||}}~~~~}}{{{{{{{{{{~~~~}}}}}}||}}~~~~}}{{{{{{{{}}~~~~~~}}}}}}}}}}}}}}||{{{{||}}}}}}}}}}}}~~}}}}}}}}}}}}}}}}~~~~~~}}}}~~~~~~}}}}}}}}}}}}~~~~~~~~~~~~}}}}}}}}}}}}}}~~}}}}}}~~}}||||||||||||||}}}}~~}}}}~~~~}}{{{{||}}}}}}~~~~}}}}}}}}~~~~~~~~~~}}}}}}}}}}~~~~~~~~~~~~~~}}}}||}}}}~~~~~~~~~~~~~~~~~~~~~~}}}}}}~~~~~~~~~~~~~~~~}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}~~~~~~~~~~}}}}}}~~~~~~~~}}}}}}}}~~~~~~~~~~~~~~~~~~~~}}}}~~}}~~~~~~~~}}}}}}~~~~~~}}}}~~~~~~}}}}}}}}~~~~}}}}}}}}~~}}}}}}}}}}~~~~}}}}}}~~~~~~~~}}~~~~~~~~~~~~~~}}}}}}}}~~~~~~~~}}}}}}~~~~~~~~~~~~~~}}}}}}}}}}~~}}}}~~~~}}}}~~~~~~~~~~~~}}}}}}}}}}~~}}}}}}~~}}}}{{~~{{ww}}}}||||}}~~}}{{}}}}||}}||~~}}||{{}}}}}}~~~~}}}}}}}}}}~~}}}}}}}}~~}}~~~~~~}}}}}}}}}}~~}}{{||~~~~}}}}}}~~~~~~}}}}~~~~~~~~}}}}}}}}~~~~~~~~~~~~~~}}}}}}~~~~~~~~~~~~}}}}~~~~~~~~~~~~~~~~~~~~~~}}}}}}~~~~}}}}~~~~}}}}~~~~}}~~~~~~~~~~~~~~}}}}~~}}}}}}}}~~~~~~~~}}}}~~~~}}}}||||}}~~}}}}}}||||||}}}}~~~~~~~~}}}}~~}}}}}}}}~~~~}}~~~~~~}}}}||||||}}}}~~~~~~~~}}}}}}}}~~~~}}}}~~}}}}~~~~~~}}}}~~~~}}||~~~~~~}}||}}~~}}}}~~~~~~~~~~~~}}~~~~~~~~~~~~}}}}~~~~}}}}}}}}~~}}}}~~~~~~~~}}}}~~}}}}}}}}~~}}||||||}}}}~~}}||}}~~~~~~~~}}}}}}~~}}~~~~}}}}||||}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}||}}}}}}~~~~}}}}~~~~~~~~}}}}~~~~~~~~~~~~}}}}~~~~}}}}}}}}~~}}}}~~}}}}}}~~~~~~~~}}}}}}~~~~}}}}}}}}}}~~~~~~~~~~~~}}~~~~}}}}~~~~~~~~~~~~~~~~~~}}}}~~~~}}~~~~}}}}~~~~}}}}}}}}~~~~~~~~~~~~~~~~}}}}||}}~~}}}}}}}}~~~~}}}}}}~~~~}}||||}}}}~~~~~~~~~~~~~~}}~~~~~~}}}}~~~~~~~~~~~~~~}}}}}}~~~~}}}}}}~~}}||||||||}}~~~~~~~~}}}}~~}}}}}}~~~~~~~~}}}}}}~~~~~~~~}}}}}}}}~~~~||{{||}}~~}}}}~~~~~~}}}}~~~~}}}}}}}}}}~~}}}}||||}}~~~~}}}}}}}}~~~~}}}}}}}}~~}}}}}}~~}}}}}}}}}}}}}}~~}}{{{{{{{{}}}}||||}}}}~~~~||||{{{{}}}}}}~~}}}}}}}}~~~~~~}}}}}}~~}}}}}}}}}}}}~~~~}}}}}}||}}~~~~}}}}}}||}}~~~~~~~~~~~~~~~~~~}}}}~~}}}}||||}}~~}}}}}}}}}}~~~~~~~~~~~~~~~~~~}}}}~~}}}}}}}}}}~~}}}}||}}~~~~~~~~~~~~~~}}~~~~}}~~~~~~}}}}~~~~~~~~}}~~~~}}}}~~~~~~~~~~}}~~}}||{{||}}~~}}~~}}{{||}}~~~~~~}}}}~~~~}}~~~~}}}}}}~~}}}}~~~~}}}}}}~~~~~~~~}}{{||}}}}~~~~~~~~}}||}}}}~~}}~~~~}}||||}}~~~~}}}}}}}}}}~~}}||}}}}}}}}}}~~}}~~~~~~~~~~~~~~~~~~~~~~~~}}~~~~}}}}~~}}~~~~}}}}}}}}~~~~~~}}}}}}~~~~}}~~~~}}~~~~}}}}~~~~~~~~}}}}}}}}~~~~}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}~~}}}}~~~~~~}}}}||||}}~~}}~~~~}}}}~~~~}}}}}}}}~~~~}}~~~~~~~~~~~~~~~~}}~~~~~~~~}}}}}}}}~~~~}}}}~~~~}}}}}}~~~~~~~~~~}}{{yy}}||vvvv||~~zzzz}}||}}}}vvvv}}}}{{{{{{{{zzyyxxzz}}~~}}~~~~}}~~}}{{xxxxxxxx||}}{{yyzz}}{{vvrrrruuxx}}}}||}}}}{{||}}{{}}~~}}||}}~~~~}}{{yyyyyyzz{{}}}}{{{{{{||{{{{||{{zz||}}~~}}}}||{{}}}}||}}~~~~}}~~}}{{||}}{{yy{{}}}}}}}}~~||}}~~}}}}~~}}{{||}}~~~~~~||||}}}}}}~~~~}}~~~~}}~~~~~~{{yyxxxxzz{{}}}}}}}}}}~~}}||}}}}}}~~}}}}~~}}}}~~~~}}}}}}||}}}}}}||||}}}}}}}}~~}}~~~~~~~~}}}}}}}}~~~~~~}}}}~~~~~~~~~~~~~~~~~~~~}}}}}}~~~~~~~~}}}}~~~~~~~~}}}}~~}}||||}}~~~~}}}}}}~~~~~~}}~~~~}}}}}}}}}}}}}}~~~~}}~~||}}~~~~}}~~||{{{{}}{{xxttzz}}||~~zz{{{{wwzzuuwwyy}}zz{{ssllxxxx}}~~~~yyqq}}}}wwvvuuvv}}}}}}{{rrvv||xxwwvvvv}}~~||{{zz||~~~~~~{{xxxx{{~~}}~~~~||{{zzzz~~~~{{zzyy{{~~~~}}~~}}||}}~~}}}}}}}}~~}}~~}}}}}}}}~~}}}}~~}}}}~~}}~~~~||||}}~~~~zzxxzzzz{{}}}}}}}}}}~~}}{{yyyy{{~~}}||}}~~||zzxx{{~~~~{{||}}}}}}{{}}}}{{zzwwxx~~~~}}{{{{||}}}}}}}}||yyvvwwzz{{~~~~~~~~||{{{{zzxxzz{{}}~~}}{{yywwvvvvwwxxzz{{{{{{||~~}}xxrrooxxkkbblltt}}xx{{||{{yyvv{{~~~~}}}}{{||}}vvuuzzxxoonnvv}}||zzzz~~{{{{~~}}~~}}}}~~~~~~~~}}~~}}}}~~~~}}{{}}~~}}}}~~~~}}~~~~~~~~}}~~~~}}||||~~}}||}}~~~~}}}}||{{}}}}{{||~~~~~~}}}}~~}}}}}}~~~~}}}}~~~~}}}}}}}}}}~~~~~~~~}}{{||}}}}~~~~~~~~}}~~~~~~~~~~~~}}}}~~}}}}}}}}~~~~}}~~~~~~~~~~~~}}~~~~~~~~~~}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}~~~~~~~~}}~~~~~~~~~~~~}}~~~~~~~~}}}}}}~~~~}}}}~~~~~~~~~~~~}}}}}}~~~~}}~~~~~~~~}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~DisplayCAL-3.1.0.0/DisplayCAL/ccmx.py0000644000076500000000000000627212647526531016745 0ustar devwheel00000000000000# -*- coding: utf-8 -*- from __future__ import with_statement # Python 2.5 import codecs import os import sys import time import demjson CCMX_TEMPLATE = '''CCMX DESCRIPTOR "%(Name)s" KEYWORD "INSTRUMENT" INSTRUMENT "%(Device)s" KEYWORD "DISPLAY" DISPLAY "%(Display)s" KEYWORD "DISPLAY_TYPE_BASE_ID" DISPLAY_TYPE_BASE_ID "1" KEYWORD "REFERENCE" REFERENCE "%(ReferenceDevice)s" ORIGINATOR "%(Originator)s" CREATED "%(DateTime)s" KEYWORD "COLOR_REP" COLOR_REP "XYZ" NUMBER_OF_FIELDS 3 BEGIN_DATA_FORMAT XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 3 BEGIN_DATA %(MatrixXYZ)s END_DATA ''' def convert_devicecorrections_to_ccmx(path, target_dir): """ Convert iColorDisplay DeviceCorrections.txt to individual Argyll CCMX files """ with codecs.open(path, 'r', 'utf8') as devcorrections_file: lines = devcorrections_file.read().strip().splitlines() # Convert to JSON # The DeviceCorrections.txt format is as follows, so a conversion is pretty # straightforward: # "Description here, e.g. Instrument X for Monitor Y" = # { # Name = "Description here, e.g. Instrument X for Monitor Y" # Device = "Instrument X" # Display = "Monitor Y" # ReferenceDevice = "eye-one Pro Rev.D" # MatrixXYZ = "3 3 1482250784 1.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 1.0 " # } # "Description here, e.g. Instrument X for Monitor Y" = # { # Name = "Description here, e.g. Instrument X for Monitor Y" # Device = "Instrument X" # Display = "Monitor Y" # ReferenceDevice = "eye-one Pro Rev.D" # MatrixXYZ = "3 3 1482250784 1.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 1.0 " # } # ...etc. # NOTE: The first three numbers in MatrixXYZ are irrelevant for our purposes. for i, line in enumerate(lines): parts = line.strip().split('=') if len(parts) == 2: for j, part in enumerate(parts): part = part.strip() if part and not part.startswith('"') and not part.endswith('"'): parts[j] = '"%s"' % part if parts[-1].strip() not in('', '{') and i < len(lines) - 1: parts[-1] += ',' lines[i] = ':'.join(parts) devcorrections_data = '{%s}' % ''.join(lines).replace(',}', '}') # Parse JSON devcorrections = demjson.decode(devcorrections_data) # Convert to ccmx imported = 0 skipped = 0 for name, devcorrection in devcorrections.iteritems(): values = {'DateTime': time.strftime('%a %b %d %H:%M:%S %Y'), 'Originator': "Quato iColorDisplay", 'Name': "%s & %s" % (devcorrection.get("Device"), devcorrection.get("Display"))} for key in ('Device', 'Display', 'ReferenceDevice', 'MatrixXYZ'): value = devcorrection.get(key) if value is None: break if key == 'MatrixXYZ': # The first three numbers in the matrix are irrelevant for our # purposes (see format example above). matrix = value.split()[3:] value = '\n'.join([' '.join(part) for part in (matrix[0:3], matrix[3:6], matrix[6:9])]) values[key] = value if value is None: skipped += 1 continue imported += 1 with codecs.open(os.path.join(target_dir, name + '.ccmx'), 'w', 'utf8') as ccmx: ccmx.write(CCMX_TEMPLATE % values) return imported, skipped if __name__ == '__main__': convert_devicecorrections_to_ccmx(sys.argv[1], os.path.dirname(sys.argv[1])) DisplayCAL-3.1.0.0/DisplayCAL/CGATS.py0000644000076500000000000013223712647526531016655 0ustar devwheel00000000000000# -*- coding: utf-8 -*- """ Simple CGATS file parser class Copyright (C) 2008 Florian Hoech """ from __future__ import with_statement import math, os, re, sys import colormath import x3dom from log import safe_print from util_io import GzipFileProper, StringIOu as StringIO def get_device_value_labels(color_rep=None): return filter(bool, map(lambda v: v[1] if not color_rep or v[0] == color_rep else False, {"CMYK": ("CMYK_C", "CMYK_M", "CMYK_Y", "CMYK_K"), "RGB": ("RGB_R", "RGB_G", "RGB_B")}.iteritems())) def rpad(value, width): """ Right-pad a value to a given width. value is converted to a string first. If value wasn't a number originally, return the quoted string. """ strval = str(value) if not isinstance(value, (int, float, long, complex)): return '"%s"' % strval i = strval.find(".") if i > -1: if i < width - 1: strval = str(round(value, width - i - 1)).ljust(width, '0') else: strval = str(int(round(value))) return strval def rcut(value, width): """ Cut off any chars beyond width on the right-hand side. value is converted to a string first. If value wasn't a number originally, return the quoted string. """ strval = str(value) if not isinstance(value, (int, float, long, complex)): return '"%s"' % strval i = strval.find(".") if i > -1: if i < width - 1: strval = str(round(value, width - i - 1)) else: strval = str(int(round(value))) return strval def sort_RGB_gray_to_top(a, b): if a[0] == a[1] == a[2]: if b[0] == b[1] == b[2] and a[0] > b[0]: return 1 return -1 else: return 0 def sort_RGB_to_top_factory(i1, i2, i3, i4): def sort_RGB_to_top(a, b): if a[i1] == a[i2] and not a[i3] and a[i4]: if b[i1] == b[i2] and not b[i3] and b[i4] and a[i4] > b[i4]: return 1 return -1 else: return 0 return sort_RGB_to_top def sort_RGB_white_to_top(a, b): sum1, sum2 = sum(a[:3]), sum(b[:3]) if sum1 == 300: return -1 else: return 0 def sort_by_HSI(a, b): a = list(colormath.RGB2HSI(*a[:3])) b = list(colormath.RGB2HSI(*b[:3])) a[0] = round(a[0], 12) b[0] = round(b[0], 12) if a > b: return 1 elif a < b: return -1 else: return 0 def sort_by_HSL(a, b): a = list(colormath.RGB2HSL(*a[:3])) b = list(colormath.RGB2HSL(*b[:3])) a[0] = round(a[0], 12) b[0] = round(b[0], 12) if a > b: return 1 elif a < b: return -1 else: return 0 def sort_by_HSV(a, b): a = list(colormath.RGB2HSV(*a[:3])) b = list(colormath.RGB2HSV(*b[:3])) a[0] = round(a[0], 12) b[0] = round(b[0], 12) if a > b: return 1 elif a < b: return -1 else: return 0 def sort_by_RGB(a, b): if a[:3] > b[:3]: return 1 elif a[:3] < b[:3]: return -1 else: return 0 def sort_by_RGB_sum(a, b): sum1, sum2 = sum(a[:3]), sum(b[:3]) if sum1 > sum2: return 1 elif sum1 < sum2: return -1 else: return 0 def sort_by_L(a, b): Lab1 = colormath.XYZ2Lab(*a[3:]) Lab2 = colormath.XYZ2Lab(*b[3:]) if Lab1[0] > Lab2[0]: return 1 elif Lab1[0] < Lab2[0]: return -1 else: return 0 class CGATSError(Exception): pass class CGATSInvalidError(CGATSError, IOError): pass class CGATSInvalidOperationError(CGATSError): pass class CGATSKeyError(CGATSError, KeyError): pass class CGATSTypeError(CGATSError, TypeError): pass class CGATSValueError(CGATSError, ValueError): pass class CGATS(dict): """ CGATS structure. CGATS files are treated mostly as 'soup', so only basic checking is in place. """ datetime = None filename = None fileName = property(lambda self: self.filename, lambda self, filename: setattr(self, "filename", filename)) key = None _modified = False mtime = None parent = None root = None type = 'ROOT' vmaxlen = 0 def __init__(self, cgats=None, normalize_fields=False, file_identifier="CTI3"): """ Return a CGATS instance. cgats can be a path, a string holding CGATS data, or a file object. If normalize_fields evaluates to True, convert all KEYWORDs and all fields in DATA_FORMAT to UPPERCASE and SampleId or SampleName to SAMPLE_ID or SAMPLE_NAME respectively file_identifier is used as fallback if no file identifier is present """ self.normalize_fields = normalize_fields self.file_identifier = file_identifier self.root = self self._keys = [] if cgats: if isinstance(cgats, list): raw_lines = cgats else: if isinstance(cgats, basestring): if cgats.find('\n') < 0 and cgats.find('\r') < 0: # assume filename cgats = open(cgats, 'rU') self.filename = cgats.name else: # assume text cgats = StringIO(cgats) elif isinstance(cgats, file): self.filename = cgats.name elif not isinstance(cgats, StringIO): raise CGATSInvalidError('Unsupported type: %s' % type(cgats)) if self.filename not in ('', None): self.mtime = os.stat(self.filename).st_mtime cgats.seek(0) raw_lines = cgats.readlines() cgats.close() context = self for raw_line in raw_lines: # strip control chars and leading/trailing whitespace line = re.sub('[^\x09\x20-\x7E\x80-\xFF]', '', raw_line.strip()) comment_offset = line.find('#') if comment_offset >= 0: # strip comment line = line[:comment_offset].strip() values = [value.strip('"') for value in line.split()] if line[:6] == 'BEGIN_': key = line[6:] if key in context: # Start new CGATS new = len(self) self[new] = CGATS() self[new].key = '' self[new].parent = self self[new].root = self.root self[new].type = '' context = self[new] if line == 'BEGIN_DATA_FORMAT': context['DATA_FORMAT'] = CGATS() context['DATA_FORMAT'].key = 'DATA_FORMAT' context['DATA_FORMAT'].parent = context context['DATA_FORMAT'].root = self context['DATA_FORMAT'].type = 'DATA_FORMAT' context = context['DATA_FORMAT'] elif line == 'END_DATA_FORMAT': context = context.parent elif line == 'BEGIN_DATA': context['DATA'] = CGATS() context['DATA'].key = 'DATA' context['DATA'].parent = context context['DATA'].root = self context['DATA'].type = 'DATA' context = context['DATA'] elif line == 'END_DATA': context = context.parent elif line[:6] == 'BEGIN_': key = line[6:] context[key] = CGATS() context[key].key = key context[key].parent = context context[key].root = self context[key].type = 'SECTION' context = context[key] elif line[:4] == 'END_': context = context.parent elif context.type in ('DATA_FORMAT', 'DATA'): if len(values): context = context.add_data(values) elif context.type == 'SECTION': context = context.add_data(line) elif len(values) > 1: if values[0] == 'Date:': context.datetime = line else: match = re.match( '([^"]+?)(?:\s+("[^"]+"|[^\s]+))?(?:\s*#(.*))?$', line) if match: key, value, comment = match.groups() if value != None: context = context.add_data({key: value.strip('"')}) else: context = context.add_data({key: ''}) elif values and values[0] not in ('Comment:', 'Date:') and \ len(line) >= 3 and not re.search("[^ 0-9A-Za-z]", line): context = self.add_data(line) self.setmodified(False) def __delattr__(self, name): del self[name] self.setmodified() def __delitem__(self, name): if (self.type not in ('DATA', 'DATA_FORMAT', 'KEYWORDS', 'SECTION') and name in self._keys): self._keys.remove(name) dict.__delitem__(self, name) self.setmodified() def __getattr__(self, name): if name in self: return self[name] else: raise AttributeError(name) def __getitem__(self, name): if name == -1: return self.get(len(self) - 1) elif name in ('NUMBER_OF_FIELDS', 'NUMBER_OF_SETS'): return getattr(self, name) elif name in self: if str(name).upper() in ('INDEX', 'SAMPLE_ID', 'SAMPLEID'): if type(self.get(name)) not in (int, float): return self.get(name) if str(name).upper() == 'INDEX': return self.key if type(self.get(name)) == float: return 1.0 / (self.NUMBER_OF_SETS - 1) * self.key return self.key + 1 return self.get(name) raise CGATSKeyError(name) def get(self, name, default=None): if name == -1: return dict.get(self, len(self) - 1, default) elif name in ('NUMBER_OF_FIELDS', 'NUMBER_OF_SETS'): return getattr(self, name, default) else: return dict.get(self, name, default) def get_colorants(self): color_rep = (self.queryv1("COLOR_REP") or "").split("_") if len(color_rep) == 2: query = {} colorants = [] for i in xrange(len(color_rep[0])): for j, channelname in enumerate(color_rep[0]): query["_".join([color_rep[0], channelname])] = {i: 100}.get(j, 0) colorants.append(self.queryi1(query)) return colorants def get_descriptor(self): """ Return descriptor """ desc = self.queryv1("DESCRIPTOR") is_ccss = self.get(0, self).type == "CCSS" if not desc or desc == "Not specified" or is_ccss: if not is_ccss: desc = self.queryv1("INSTRUMENT") if desc: display = self.queryv1("DISPLAY") if display: desc += " & " + display else: tech = self.queryv1("TECHNOLOGY") if tech: if (desc and desc != "Not specified" and desc != "CCSS for " + tech): display = desc else: display = self.queryv1("DISPLAY") if display: tech += " (%s)" % display desc = tech if not desc and self.filename: desc = os.path.splitext(os.path.basename(self.filename))[0] return desc def __setattr__(self, name, value): if name == '_keys': object.__setattr__(self, name, value) elif name == 'modified': self.setmodified(value) elif name in ('datetime', 'filename', 'fileName', 'file_identifier', 'key', 'mtime', 'normalize_fields', 'parent', 'root', 'type', 'vmaxlen'): object.__setattr__(self, name, value) self.setmodified() else: self[name] = value def __setitem__(self, name, value): if (self.type not in ('DATA', 'DATA_FORMAT', 'KEYWORDS', 'SECTION') and not name in self): self._keys.append(name) dict.__setitem__(self, name, value) self.setmodified() def setmodified(self, modified=True): """ Set 'modified' state on the 'root' object. """ if self.root and self.root._modified != modified: object.__setattr__(self.root, '_modified', modified) def __str__(self): result = [] data = None if self.type == 'SAMPLE': result.append(' '.join(rpad(self[item], self.parent.vmaxlen + (1 if self[item] < 0 else 0)) for item in self.parent.parent['DATA_FORMAT'].values())) elif self.type == 'DATA': data = self elif self.type == 'DATA_FORMAT': result.append(' '.join(self.values())) else: if self.datetime: result.append(self.datetime) if self.type == 'SECTION': result.append('BEGIN_' + self.key) elif self.parent and self.parent.type == 'ROOT': result.append(self.type.ljust(7)) # Make sure CGATS file # identifiers are always # a minimum of 7 characters result.append('') if self.type in ('DATA', 'DATA_FORMAT', 'KEYWORDS', 'SECTION'): iterable = self else: iterable = self._keys for key in iterable: value = self[key] if key == 'DATA': data = value elif type(value) in (float, int, str, unicode): if key not in ('NUMBER_OF_FIELDS', 'NUMBER_OF_SETS'): if type(key) == int: result.append(str(value)) else: if 'KEYWORDS' in self and \ key in self['KEYWORDS'].values(): result.append('KEYWORD "%s"' % key) result.append('%s "%s"' % (key, value)) elif type(value) in (int, float): result.append('%s %s' % (key, value)) else: result.append('%s "%s"' % (key, value)) elif key not in ('DATA_FORMAT', 'KEYWORDS'): if (value.type == 'SECTION' and result[-1:] and result[-1:][0] != ''): result.append('') result.append(str(value)) if self.type == 'SECTION': result.append('END_' + self.key) if self.type == 'SECTION' or data: result.append('') if data and data.parent['DATA_FORMAT']: if 'KEYWORDS' in data.parent: for item in data.parent['DATA_FORMAT'].values(): if item in data.parent['KEYWORDS'].values(): result.append('KEYWORD "%s"' % item) result.append('NUMBER_OF_FIELDS %s' % len(data.parent['DATA_FORMAT'])) result.append('BEGIN_DATA_FORMAT') result.append(' '.join(data.parent['DATA_FORMAT'].values())) result.append('END_DATA_FORMAT') result.append('') result.append('NUMBER_OF_SETS %s' % (len(data))) result.append('BEGIN_DATA') for key in data: result.append(' '.join([rpad(data[key][item], data.vmaxlen + (1 if data[key][item] < 0 else 0)) for item in data.parent['DATA_FORMAT'].values()])) result.append('END_DATA') return '\n'.join(result) def add_keyword(self, keyword, value=None): """ Add a keyword to the list of keyword values. """ if self.type in ('DATA', 'DATA_FORMAT', 'KEYWORDS', 'SECTION'): context = self.parent elif self.type == 'SAMPLE': context = self.parent.parent else: context = self if not 'KEYWORDS' in context: context['KEYWORDS'] = CGATS() context['KEYWORDS'].key = 'KEYWORDS' context['KEYWORDS'].parent = context context['KEYWORDS'].root = self.root context['KEYWORDS'].type = 'KEYWORDS' if not keyword in context['KEYWORDS'].values(): newkey = len(context['KEYWORDS']) while newkey in context['KEYWORDS']: newkey += 1 context['KEYWORDS'][newkey] = keyword if value != None: context[keyword] = value def add_section(self, key, value): self[key] = CGATS() self[key].key = key self[key].parent = self self[key].root = self self[key].type = 'SECTION' self[key].add_data(value) def remove_keyword(self, keyword, remove_value=True): """ Remove a keyword from the list of keyword values. """ if self.type in ('DATA', 'DATA_FORMAT', 'KEYWORDS', 'SECTION'): context = self.parent elif self.type == 'SAMPLE': context = self.parent.parent else: context = self for key in context['KEYWORDS'].keys(): if context['KEYWORDS'][key] == keyword: del context['KEYWORDS'][key] if remove_value: del context[keyword] def insert(self, key=None, data=None): """ Insert data at index key. Also see add_data method. """ self.add_data(data, key) def append(self, data): """ Append data. Also see add_data method. """ self.add_data(data) def get_data(self, field_names=None): data = self.queryv1("DATA") if not data: return False elif field_names: data = data.queryi(field_names) return data def get_RGB_XYZ_values(self): field_names = ("RGB_R", "RGB_G", "RGB_B", "XYZ_X", "XYZ_Y", "XYZ_Z") data = self.get_data(field_names) if not data: return False valueslist = [] for key, item in data.iteritems(): values = [] for field_name in field_names: values.append(item[field_name]) valueslist.append(values) return data, valueslist def set_RGB_XYZ_values(self, valueslist): field_names = ("RGB_R", "RGB_G", "RGB_B", "XYZ_X", "XYZ_Y", "XYZ_Z") for i, values in enumerate(valueslist): for j, field_name in enumerate(field_names): self[i][field_name] = values[j] def checkerboard(self): data, valueslist = self.get_RGB_XYZ_values() if not valueslist: return False valueslist *= 2 valueslist.sort(sort_by_L) valueslist.sort(sort_RGB_white_to_top) split = len(valueslist) / 2 valueslist1 = valueslist[:split] valueslist2 = valueslist[split:] valueslist2.reverse() valueslist = valueslist1 + valueslist2 checkerboard = [] for i in xrange(split): if i % 2 == 1: i = len(valueslist) - 1 - i values = valueslist[i] checkerboard.append(values) return data.set_RGB_XYZ_values(checkerboard) def sort_RGB_gray_to_top(self): data, valueslist = self.get_RGB_XYZ_values() if not valueslist: return False valueslist.sort(sort_RGB_gray_to_top) return data.set_RGB_XYZ_values(valueslist) def sort_RGB_to_top(self, r=0, g=0, b=0): """ Sort quantities of R, G or B (or combinations) to top. Example: sort_RGB_to_top(True, 0, 0) - sort red values to top Example: sort_RGB_to_top(0, True, True) - sort cyan values to top """ data, valueslist = self.get_RGB_XYZ_values() if not valueslist: return False if r and g and b: fn = sort_RGB_gray_to_top elif r and g: fn = sort_RGB_to_top_factory(0, 1, 2, 0) elif r and b: fn = sort_RGB_to_top_factory(0, 2, 1, 0) elif g and b: fn = sort_RGB_to_top_factory(1, 2, 0, 1) elif r: fn = sort_RGB_to_top_factory(1, 2, 1, 0) elif g: fn = sort_RGB_to_top_factory(0, 2, 0, 1) elif b: fn = sort_RGB_to_top_factory(0, 1, 0, 2) valueslist.sort(fn) return data.set_RGB_XYZ_values(valueslist) def sort_RGB_white_to_top(self): data, valueslist = self.get_RGB_XYZ_values() if not valueslist: return False valueslist.sort(sort_RGB_white_to_top) return data.set_RGB_XYZ_values(valueslist) def sort_by_HSI(self): data, valueslist = self.get_RGB_XYZ_values() if not valueslist: return False valueslist.sort(sort_by_HSI) return data.set_RGB_XYZ_values(valueslist) def sort_by_HSL(self): data, valueslist = self.get_RGB_XYZ_values() if not valueslist: return False valueslist.sort(sort_by_HSL) return data.set_RGB_XYZ_values(valueslist) def sort_by_HSV(self): data, valueslist = self.get_RGB_XYZ_values() if not valueslist: return False valueslist.sort(sort_by_HSV) return data.set_RGB_XYZ_values(valueslist) def sort_by_L(self): data, valueslist = self.get_RGB_XYZ_values() if not valueslist: return False valueslist.sort(sort_by_L) return data.set_RGB_XYZ_values(valueslist) def sort_by_RGB(self): data, valueslist = self.get_RGB_XYZ_values() if not valueslist: return False valueslist.sort(sort_by_RGB) return data.set_RGB_XYZ_values(valueslist) def sort_by_RGB_sum(self): data, valueslist = self.get_RGB_XYZ_values() if not valueslist: return False valueslist.sort(sort_by_RGB_sum) return data.set_RGB_XYZ_values(valueslist) @property def modified(self): if self.root: return self.root._modified return self._modified def moveby1(self, start, inc=1): """ Move items from start by icrementing or decrementing their key by inc. """ r = xrange(start, len(self) + 1) if inc > 0: r = reversed(r) for key in r: if key in self: if key + inc < 0: break else: self[key].key += inc self[key + inc] = self[key] if key == len(self) - 1: break def add_data(self, data, key=None): """ Add data to the CGATS structure. data can be a CGATS instance, a dict, a list, a tuple, or a string or unicode instance. """ context = self if self.type == 'DATA': if isinstance(data, (dict, list, tuple)): if self.parent['DATA_FORMAT']: fl, il = len(self.parent['DATA_FORMAT']), len(data) if fl != il: raise CGATSTypeError('DATA entries take exactly %s ' 'values (%s given)' % (fl, il)) dataset = CGATS() i = -1 for item in self.parent['DATA_FORMAT'].values(): i += 1 if isinstance(data, dict): try: value = data[item] except KeyError: raise CGATSKeyError(item) else: value = data[i] if item.upper() in ('INDEX', 'SAMPLE_ID', 'SAMPLEID'): if self.root.normalize_fields and \ item.upper() == 'SAMPLEID': item = 'SAMPLE_ID' # allow alphanumeric INDEX / SAMPLE_ID if isinstance(value, basestring): match = re.match( '(?:\d+|((?:\d*\.\d+|\d+)(?:e[+-]?\d+)?))$', value) if match: if match.groups()[0]: value = float(value) else: value = int(value) elif item.upper() not in ('SAMPLE_NAME', 'SAMPLE_LOC', 'SAMPLENAME'): try: value = float(value) except ValueError: raise CGATSValueError('Invalid data type for ' '%s (expected float, ' 'got %s)' % (item, type(value))) else: lencheck = len(str(abs(value)).split("e")[0]) if lencheck > self.vmaxlen: self.vmaxlen = lencheck elif self.root.normalize_fields and \ item.upper() == 'SAMPLENAME': item = 'SAMPLE_NAME' dataset[item] = value if type(key) == int: # accept only integer keys. # move existing items self.moveby1(key) else: key = len(self) dataset.key = key dataset.parent = self dataset.root = self.root dataset.type = 'SAMPLE' self[key] = dataset else: raise CGATSInvalidOperationError('Cannot add to DATA ' 'because of missing DATA_FORMAT') else: raise CGATSTypeError('Invalid data type for %s (expected ' 'CGATS, dict, list or tuple, got %s)' % (self.type, type(data))) elif self.type == 'ROOT': if isinstance(data, basestring) and data.find('\n') < 0 and \ data.find('\r') < 0: if type(key) == int: # accept only integer keys. # move existing items self.moveby1(key) else: key = len(self) self[key] = CGATS() self[key].key = key self[key].parent = self self[key].root = self.root self[key].type = data context = self[key] elif not len(self): context = self.add_data(self.file_identifier) # create root element context = context.add_data(data, key) else: raise CGATSTypeError('Invalid data type for %s (expected str ' 'or unicode without line endings, got %s)' % (self.type, type(data))) elif self.type == 'SECTION': if isinstance(data, basestring): if type(key) == int: # accept only integer keys. # move existing items self.moveby1(key) else: key = len(self) self[key] = data else: raise CGATSTypeError('Invalid data type for %s (expected str' 'or unicode, got %s)' % (self.type, type(data))) elif self.type in ('DATA_FORMAT', 'KEYWORDS') or \ (self.parent and self.parent.type == 'ROOT'): if isinstance(data, (dict, list, tuple)): for var in data: if var in ('NUMBER_OF_FIELDS', 'NUMBER_OF_SETS'): self[var] = None else: if isinstance(data, dict): if self.type in ('DATA_FORMAT', 'KEYWORDS'): key, value = len(self), data[var] else: key, value = var, data[var] else: key, value = len(self), var if self.root.normalize_fields: if isinstance(value, basestring): value = value.upper() if value == 'SAMPLEID': value = 'SAMPLE_ID' elif value == 'SAMPLENAME': value = 'SAMPLE_NAME' if var == 'KEYWORD': if value != 'KEYWORD': self.add_keyword(value) else: safe_print('Warning: cannot add keyword ' '"KEYWORD"') else: if isinstance(value, basestring): match = re.match( '(?:\d+|((?:\d*\.\d+|\d+)(?:e[+-]?\d+)?))$', value) if match: if match.groups()[0]: value = float(value) else: value = int(value) if self.type in ('DATA_FORMAT', 'KEYWORDS'): raise CGATSTypeError('Invalid data ' 'type for %s ' '(expected str ' 'or unicode, got ' '%s)' % (self.type, type(value))) self[key] = value else: raise CGATSTypeError('Invalid data type for %s (expected ' 'CGATS, dict, list or tuple, got %s)' % (self.type, type(data))) else: raise CGATSInvalidOperationError('Cannot add data to %s' % self.type) return context def export_3d(self, filename, colorspace="RGB", RGB_black_offset=40, normalize_RGB_white=False, compress=True, format="VRML"): if colorspace not in ("DIN99", "DIN99b", "DIN99c", "DIN99d", "LCH(ab)", "LCH(uv)", "Lab", "Luv", "Lu'v'", "RGB", "xyY", "HSI", "HSL", "HSV"): raise ValueError("export_3d: Unknown colorspace %r" % colorspace) data = self.queryv1("DATA") if self.queryv1("ACCURATE_EXPECTED_VALUES") == "true": cat = "Bradford" else: cat = "XYZ scaling" radius = 15.0 / (len(data) ** (1.0 / 3.0)) scale = 1.0 if colorspace.startswith("DIN99"): if colorspace == "DIN99": scale = 100.0 / 40 else: scale = 100.0 / 50 radius /= scale white = data.queryi1({"RGB_R": 100, "RGB_G": 100, "RGB_B": 100}) if white: white = white["XYZ_X"], white["XYZ_Y"], white["XYZ_Z"] else: white = "D50" white = colormath.get_whitepoint(white) d50 = colormath.get_whitepoint("D50") if colorspace == "Lu'v'": white_u_, white_v_ = colormath.XYZ2Lu_v_(*d50)[1:] elif colorspace == "xyY": white_x, white_y = colormath.XYZ2xyY(*d50)[:2] vrml = """#VRML V2.0 utf8 Transform { children [ NavigationInfo { type "EXAMINE" } DirectionalLight { direction 0 0 -1 direction 0 -1 0 } Viewpoint { fieldOfView %(fov)s position 0 0 %(z)s } %(axes)s %(children)s ] } """ child = """ # Sphere Transform { translation %(x).6f %(y).6f %(z).6f children [ Shape{ geometry Sphere { radius %(radius).6f} appearance Appearance { material Material { diffuseColor %(R).6f %(G).6f %(B).6f} } } ] } """ axes = "" if (colorspace not in ("Lab", "Luv") and not colorspace.startswith("DIN99")): if colorspace in ("Lu'v'", "xyY"): maxz = scale = 100 maxxy = 200 radius /= 2.0 if colorspace == "Lu'v'": xlabel, ylabel, zlabel = "u' 0.6", "v' 0.6", "L* 100" offsetx, offsety = -.3, -.3 scale = maxxy / .6 else: xlabel, ylabel, zlabel = "x 0.8", "y 0.8", "Y 100" offsetx, offsety = -.4, -.4 scale = maxxy / .8 axes = x3dom.get_vrml_axes(xlabel, ylabel, zlabel, offsetx * scale, offsety * scale, 0, maxxy, maxxy, maxz) elif colorspace in ("LCH(ab)", "LCH(uv)"): if colorspace == "LCH(ab)": xlabel, ylabel, zlabel = "H(ab)", "C(ab)", "L*" else: xlabel, ylabel, zlabel = "H(uv)", "C(uv)", "L*" axes = x3dom.get_vrml_axes(xlabel, ylabel, zlabel, -180, -100, 0, 360, 200, 100, False) else: if colorspace.startswith("DIN99"): axes += """Transform { translation %.1f %.1f -50.0 children [ Shape { geometry Text { string ["%s"] fontStyle FontStyle { family "SANS" style "BOLD" size %.1f } } appearance Appearance { material Material { diffuseColor 0.7 0.7 0.7 } } } ] } """ % (100 / scale, 100 / scale, colorspace, 10.0 / scale) (pxlabel, nxlabel, pylabel, nylabel, pllabel) = ('"a", "+%i"' % (100 / scale), '"a", "-%i"' % (100 / scale), '"b +%i"' % (100 / scale), '"b -%i"' % (100 / scale), '"L", "+100"') else: if colorspace == "Luv": x = "u" y = "v" else: x = "a" y = "b" (pxlabel, nxlabel, pylabel, nylabel, pllabel) = ('"%s*", "+100"' % x, '"%s*", "-100"' % x, '"%s* +100"' % y, '"%s* -100"' % y, '"L*", "+100"') values = {"wh": 2.0 / scale, "ab": 100.0 / scale, "aboffset": 50.0 / scale, "fontsize": 10.0 / scale, "ap": 102.0 / scale, "an": 108.0 / scale, "Ln": 3.0, "bp0": 3.0, "bp1": 103.0 / scale, "bn0": 3.0, "bn1": 107.0 / scale, "pxlabel": pxlabel, "nxlabel": nxlabel, "pylabel": pylabel, "nylabel": nylabel, "pllabel": pllabel} axes += """# L* axis Transform { translation 0.0 0.0 0.0 children [ Shape { geometry Box { size %(wh).1f %(wh).1f 100.0 } appearance Appearance { material Material { diffuseColor 0.7 0.7 0.7 } } } ] } # L* axis label Transform { translation -%(Ln).1f -%(wh).1f 55.0 children [ Shape { geometry Text { string [%(pllabel)s] fontStyle FontStyle { family "SANS" style "BOLD" size %(fontsize).1f } } appearance Appearance { material Material { diffuseColor 0.7 0.7 0.7} } } ] } # +x axis Transform { translation %(aboffset).1f 0.0 -50.0 children [ Shape { geometry Box { size %(ab).1f %(wh).1f %(wh).1f } appearance Appearance { material Material { diffuseColor 1.0 0.0 0.0 } } } ] } # +x axis label Transform { translation %(ap).1f -%(wh).1f -50.0 children [ Shape { geometry Text { string [%(pxlabel)s] fontStyle FontStyle { family "SANS" style "BOLD" size %(fontsize).1f } } appearance Appearance { material Material { diffuseColor 1.0 0.0 0.0} } } ] } # -x axis Transform { translation -%(aboffset).1f 0.0 -50.0 children [ Shape { geometry Box { size %(ab).1f %(wh).1f %(wh).1f } appearance Appearance { material Material { diffuseColor 0.0 1.0 0.0 } } } ] } # -x axis label Transform { translation -%(an).1f -%(wh).1f -50.0 children [ Shape { geometry Text { string [%(nxlabel)s] fontStyle FontStyle { family "SANS" style "BOLD" size %(fontsize).1f } } appearance Appearance { material Material { diffuseColor 0.0 1.0 0.0} } } ] } # +y axis Transform { translation 0.0 %(aboffset).1f -50.0 children [ Shape { geometry Box { size %(wh).1f %(ab).1f %(wh).1f } appearance Appearance { material Material { diffuseColor 1.0 1.0 0.0 } } } ] } # +y axis label Transform { translation -%(bp0).1f %(bp1).1f -50.0 children [ Shape { geometry Text { string [%(pylabel)s] fontStyle FontStyle { family "SANS" style "BOLD" size %(fontsize).1f } } appearance Appearance { material Material { diffuseColor 1.0 1.0 0.0} } } ] } # -y axis Transform { translation 0.0 -%(aboffset).1f -50.0 children [ Shape { geometry Box { size %(wh).1f %(ab).1f %(wh).1f } appearance Appearance { material Material { diffuseColor 0.0 0.0 1.0 } } } ] } # -y axis label Transform { translation -%(bn0).1f -%(bn1).1f -50.0 children [ Shape { geometry Text { string [%(nylabel)s] fontStyle FontStyle { family "SANS" style "BOLD" size %(fontsize).1f } } appearance Appearance { material Material { diffuseColor 0.0 0.0 1.0} } } ] } # Zero Transform { translation -%(Ln).1f -%(wh).1f -55.0 children [ Shape { geometry Text { string ["0"] fontStyle FontStyle { family "SANS" style "BOLD" size %(fontsize).1f } } appearance Appearance { material Material { diffuseColor 0.7 0.7 0.7} } } ] } """ % values children = [] sqrt3_100 = math.sqrt(3) * 100 sqrt3_50 = math.sqrt(3) * 50 for entry in data.itervalues(): X, Y, Z = colormath.adapt(entry["XYZ_X"], entry["XYZ_Y"], entry["XYZ_Z"], white, cat=cat) L, a, b = colormath.XYZ2Lab(X, Y, Z) if colorspace == "RGB": # Fudge device locations into Lab space x, y, z = (entry["RGB_G"] - 50, entry["RGB_B"] - 50, entry["RGB_R"] - 50) elif colorspace == "HSI": H, S, z = colormath.RGB2HSI(entry["RGB_R"] / 100.0, entry["RGB_G"] / 100.0, entry["RGB_B"] / 100.0) rad = H * 360 * math.pi / 180 x, y = S * z * math.cos(rad), S * z * math.sin(rad) # Fudge device locations into Lab space x, y, z = x * sqrt3_100, y * sqrt3_100, z * sqrt3_100 - sqrt3_50 elif colorspace == "HSL": H, S, z = colormath.RGB2HSL(entry["RGB_R"] / 100.0, entry["RGB_G"] / 100.0, entry["RGB_B"] / 100.0) rad = H * 360 * math.pi / 180 if z > .5: S *= 1 - z else: S *= z x, y = S * math.cos(rad), S * math.sin(rad) # Fudge device locations into Lab space x, y, z = x * sqrt3_100, y * sqrt3_100, z * sqrt3_100 - sqrt3_50 elif colorspace == "HSV": H, S, z = colormath.RGB2HSV(entry["RGB_R"] / 100.0, entry["RGB_G"] / 100.0, entry["RGB_B"] / 100.0) rad = H * 360 * math.pi / 180 x, y = S * z * math.cos(rad), S * z * math.sin(rad) # Fudge device locations into Lab space x, y, z = x * sqrt3_50, y * sqrt3_50, z * sqrt3_100 - sqrt3_50 elif colorspace == "Lab": x, y, z = a, b, L - 50 elif colorspace in ("DIN99", "DIN99b"): if colorspace == "DIN99": L99, a99, b99 = colormath.Lab2DIN99(L, a, b) else: L99, a99, b99 = colormath.Lab2DIN99b(L, a, b) x, y, z = a99, b99, L99 - 50 elif colorspace in ("DIN99c", "DIN99d"): if colorspace == "DIN99c": L99, a99, b99 = colormath.XYZ2DIN99c(X, Y, Z) else: L99, a99, b99 = colormath.XYZ2DIN99d(X, Y, Z) x, y, z = a99, b99, L99 - 50 elif colorspace in ("LCH(ab)", "LCH(uv)"): if colorspace == "LCH(ab)": L, C, H = colormath.Lab2LCHab(L, a, b) else: L, u, v = colormath.XYZ2Luv(X, Y, Z) L, C, H = colormath.Luv2LCHuv(L, u, v) x, y, z = H - 180, C - 100, L - 50 elif colorspace == "Luv": L, u, v = colormath.XYZ2Luv(X, Y, Z) x, y, z = u, v, L - 50 elif colorspace == "Lu'v'": L, u_, v_ = colormath.XYZ2Lu_v_(X, Y, Z) x, y, z = ((u_ + offsetx) * scale, (v_ + offsety) * scale, L / 100.0 * maxz - 50) elif colorspace == "xyY": x, y, Y = colormath.XYZ2xyY(X, Y, Z) x, y, z = ((x + offsetx) * scale, (y + offsety) * scale, Y / 100.0 * maxz - 50) if RGB_black_offset != 40: # Keep reference hue and saturation # Lab to sRGB using reference black offset of 40 like Argyll CMS R, G, B = colormath.Lab2RGB(L * (100.0 - 40.0) / 100.0 + 40.0, a, b, scale=.7, noadapt=not normalize_RGB_white) H_ref, S_ref, V_ref = colormath.RGB2HSV(R, G, B) # Lab to sRGB using actual black offset R, G, B = colormath.Lab2RGB(L * (100.0 - RGB_black_offset) / 100.0 + RGB_black_offset, a, b, scale=.7, noadapt=not normalize_RGB_white) if RGB_black_offset != 40: H, S, V = colormath.RGB2HSV(R, G, B) # Use reference H and S to go back to RGB R, G, B = colormath.HSV2RGB(H_ref, S_ref, V) children.append(child % {"x": x, "y": y, "z": z, "R": R + .05, "G": G + .05, "B": B + .05, "radius": radius}) children = "".join(children) # Choose viewpoint fov and z position based on colorspace fov = 45 z = 340 if colorspace in ("LCH(ab)", "LCH(uv)"): # Use a very narrow field of view for LCH fov /= 16.0 z *= 16 elif colorspace.startswith("DIN99"): fov /= scale out = vrml % {"children": children, "axes": axes, "fov": fov / 180.0 * math.pi, "z": z} if format != "VRML": safe_print("Generating", format) x3d = x3dom.vrml2x3dom(out) if format == "HTML": out = x3d.html(title=os.path.basename(filename)) else: out = x3d.x3d() if compress: writer = GzipFileProper else: writer = open safe_print("Writing", filename) with writer(filename, "wb") as outfile: outfile.write(out) @property def NUMBER_OF_FIELDS(self): """Get number of fields""" if 'DATA_FORMAT' in self: return len(self['DATA_FORMAT']) return 0 @property def NUMBER_OF_SETS(self): """Get number of sets""" if 'DATA' in self: return len(self['DATA']) return 0 def query(self, query, query_value = None, get_value = False, get_first = False): """ Return CGATS object of items or values where query matches. Query can be a dict with key / value pairs, a tuple or a string. Return empty CGATS object if no matching items found. """ modified = self.modified if not get_first: result = CGATS() else: result = None if not isinstance(query, dict): if type(query) not in (list, tuple): query = (query, ) items = [self] + [self[key] for key in self] for item in items: if isinstance(item, (dict, list, tuple)): if not get_first: n = len(result) if get_value: result_n = CGATS() else: result_n = None match_count = 0 for query_key in query: if query_key in item or (type(item) is CGATS and ((query_key == 'NUMBER_OF_FIELDS' and 'DATA_FORMAT' in item) or (query_key == 'NUMBER_OF_SETS' and 'DATA' in item))): if query_value is None and isinstance(query, dict): current_query_value = query[query_key] else: current_query_value = query_value if current_query_value != None: if item[query_key] != current_query_value: break if get_value: result_n[len(result_n)] = item[query_key] match_count += 1 else: break if match_count == len(query): if not get_value: result_n = item if result_n != None: if get_first: if get_value and isinstance(result_n, dict) and \ len(result_n) == 1: result = result_n[0] else: result = result_n break elif len(result_n): if get_value and isinstance(result_n, dict) and \ len(result_n) == 1: result[n] = result_n[0] else: result[n] = result_n if type(item) == CGATS and item != self: result_n = item.query(query, query_value, get_value, get_first) if result_n != None: if get_first: result = result_n break elif len(result_n): for i in result_n: n = len(result) if result_n[i] not in result.values(): result[n] = result_n[i] if isinstance(result, CGATS): result.setmodified(modified) return result def queryi(self, query, query_value=None): """ Query and return matching items. See also query method. """ return self.query(query, query_value, get_value=False, get_first=False) def queryi1(self, query, query_value=None): """ Query and return first matching item. See also query method. """ return self.query(query, query_value, get_value=False, get_first=True) def queryv(self, query, query_value=None): """ Query and return matching values. See also query method. """ return self.query(query, query_value, get_value=True, get_first=False) def queryv1(self, query, query_value=None): """ Query and return first matching value. See also query method. """ return self.query(query, query_value, get_value=True, get_first=True) def remove(self, item): """ Remove an item from the internal CGATS structure. """ if type(item) == CGATS: key = item.key else: key = item maxindex = len(self) - 1 result = self[key] if type(key) == int and key != maxindex: self.moveby1(key + 1, -1) name = len(self) - 1 if (self.type not in ('DATA', 'DATA_FORMAT', 'KEYWORDS', 'SECTION') and name in self._keys): self._keys.remove(name) dict.pop(self, name) self.setmodified() return result def fix_device_values_scaling(self, color_rep=None): """ Attempt to fix device value scaling so that max = 100 Return number of fixed DATA sections """ fixed = 0 for labels in get_device_value_labels(color_rep): for dataset in self.query("DATA").itervalues(): for item in dataset.queryi(labels).itervalues(): for label in labels: if item[label] > 100: dataset.scale_device_values(color_rep=color_rep) fixed += 1 break return fixed def scale_device_values(self, factor=100.0 / 255, color_rep=None): """ Scales device values by multiplying with factor. """ for labels in get_device_value_labels(color_rep): for data in self.queryv("DATA").itervalues(): for item in data.queryi(labels).itervalues(): for label in labels: item[label] *= factor def adapt(self, whitepoint_source=None, whitepoint_destination=None, cat="Bradford"): """ Perform chromatic adaptation if possible (needs XYZ or LAB) Return number of affected DATA sections. """ n = 0 for dataset in self.query("DATA").itervalues(): if not dataset.has_cie(): continue if not whitepoint_source: whitepoint_source = dataset.get_white_cie("XYZ") if whitepoint_source: n += 1 for item in dataset.queryv1("DATA").itervalues(): if "XYZ_X" in item: X, Y, Z = item["XYZ_X"], item["XYZ_Y"], item["XYZ_Z"] else: X, Y, Z = colormath.Lab2XYZ(item["LAB_L"], item["LAB_A"], item["LAB_B"], scale=100) X, Y, Z = colormath.adapt(X, Y, Z, whitepoint_source, whitepoint_destination, cat) if "LAB_L" in item: (item["LAB_L"], item["LAB_A"], item["LAB_B"]) = colormath.XYZ2Lab(X, Y, Z) if "XYZ_X" in item: item["XYZ_X"], item["XYZ_Y"], item["XYZ_Z"] = X, Y, Z return n def apply_bpc(self, bp_out=(0, 0, 0), weight=False): """ Apply black point compensation. Scales XYZ so that black (RGB 0) = zero. Needs a CGATS structure with RGB and XYZ data and atleast one black and white patch. Return number of affected DATA sections. """ n = 0 for dataset in self.query("DATA").itervalues(): if dataset.type.strip() == "CAL": is_Lab = False labels = ("RGB_R", "RGB_G", "RGB_B") data = dataset.queryi(labels) # Get black black1 = data.queryi1({"RGB_I": 0}) # Get white white1 = data.queryi1({"RGB_I": 1}) if not black1 or not white1: # Can't apply bpc continue black = [] white = [] for label in labels: black.append(black1[label]) white.append(white1[label]) max_v = 1.0 else: is_Lab = "_LAB" in (dataset.queryv1("COLOR_REP") or "") if is_Lab: labels = ("LAB_L", "LAB_A", "LAB_B") index = 0 # Index of L* in labels else: labels = ("XYZ_X", "XYZ_Y", "XYZ_Z") index = 1 # Index of Y in labels data = dataset.queryi(("RGB_R", "RGB_G", "RGB_B") + labels) # Get blacks blacks = data.queryi({"RGB_R": 0, "RGB_G": 0, "RGB_B": 0}) # Get whites whites = data.queryi({"RGB_R": 100, "RGB_G": 100, "RGB_B": 100}) if not blacks or not whites: # Can't apply bpc continue black = [0, 0, 0] for i in blacks: if blacks[i][labels[index]] > black[index]: for j, label in enumerate(labels): black[j] = blacks[i][label] if is_Lab: black = colormath.Lab2XYZ(*black) white = [0, 0, 0] for i in whites: if whites[i][labels[index]] > white[index]: for j, label in enumerate(labels): white[j] = whites[i][label] if is_Lab: max_v = 100.0 white = colormath.Lab2XYZ(*white) else: max_v = white[1] black = [v / max_v for v in black] white = [v / max_v for v in white] # Apply black point compensation n += 1 for i in data: values = data[i].queryv1(labels).values() if is_Lab: values = colormath.Lab2XYZ(*values) else: values = [v / max_v for v in values] values = colormath.apply_bpc(values[0], values[1], values[2], black, bp_out, white, weight) values = [v * max_v for v in values] if is_Lab: values = colormath.XYZ2Lab(*values) for j, label in enumerate(labels): if is_Lab and j > 0: data[i][label] = values[j] else: data[i][label] = max(0.0, values[j]) return n def get_white_cie(self, colorspace=None): """ Get the 'white' from the CIE values (if any). """ data_format = self.has_cie() if data_format: if "RGB_R" in data_format.values(): white = {"RGB_R": 100, "RGB_G": 100, "RGB_B": 100} elif "CMYK_C" in data_format.values(): white = {"CMYK_C": 0, "CMYK_M": 0, "CMYK_Y": 0, "CMYK_K": 0} else: white = None if white: white = self.queryi1(white) if not white: for key in ("LUMINANCE_XYZ_CDM2", "APPROX_WHITE_POINT"): white = self.queryv1(key) if white: try: white = [float(v) for v in white.split()] except ValueError: white = None else: if len(white) == 3: white = [v / white[1] * 100 for v in white] white = {"XYZ_X": white[0], "XYZ_Y": white[1], "XYZ_Z": white[2]} break else: white = None if not white: return if white and (("XYZ_X" in white and "XYZ_Y" in white and "XYZ_Z" in white) or ("LAB_L" in white and "LAB_B" in white and "LAB_B" in white)): if colorspace == "XYZ": if "XYZ_X" in white: return white["XYZ_X"], white["XYZ_Y"], white["XYZ_Z"] else: return colormath.Lab2XYZ(white["LAB_L"], white["LAB_A"], white["LAB_B"], scale=100) elif colorspace == "Lab": if "LAB_L" in white: return white["LAB_L"], white["LAB_A"], white["LAB_B"] else: return colormath.XYZ2Lab(white["XYZ_X"], white["XYZ_Y"], white["XYZ_Z"]) return white def has_cie(self): """ Check if DATA_FORMAT defines any CIE XYZ or LAB columns. Return the DATA_FORMAT on success or None on failure. """ data_format = self.queryv1("DATA_FORMAT") if data_format: cie = {} for ch in ("L", "A", "B"): cie[ch] = "LAB_%s" % ch in data_format.values() if len(cie.values()) in (0, 3): for ch in ("X", "Y", "Z"): cie[ch] = "XYZ_%s" % ch in data_format.values() if len(filter(lambda v: v is not None, cie.itervalues())) in (3, 6): return data_format pop = remove def write(self, stream_or_filename=None): """ Write CGATS text to stream. """ if not stream_or_filename: stream_or_filename = self.filename if isinstance(stream_or_filename, basestring): stream = open(stream_or_filename, "w") else: stream = stream_or_filename stream.write(str(self)) if isinstance(stream_or_filename, basestring): stream.close() DisplayCAL-3.1.0.0/DisplayCAL/colord.py0000644000076500000000000002342012647526531017267 0ustar devwheel00000000000000# -*- coding: utf-8 -*- from __future__ import with_statement from binascii import hexlify import os import re import subprocess as sp import sys import warnings from time import sleep try: if not "--use-gi" in sys.argv: raise ImportError("") from gi.repository import Colord from gi.repository import Gio except ImportError: Colord = None Gio = None else: cancellable = Gio.Cancellable.new(); if sys.platform not in ("darwin", "win32"): from defaultpaths import xdg_data_home from util_os import which from util_str import safe_str, safe_unicode import localization as lang if not Colord or not hasattr(Colord, 'quirk_vendor_name'): from config import get_data_path import demjson quirk_cache = {'suffixes': [], 'vendor_names': {}} prefix = "/org/freedesktop/ColorManager/" device_ids = {} def client_connect(): """ Connect to colord """ client = Colord.Client.new() # Connect to colord if not client.connect_sync(cancellable): raise CDError("Couldn't connect to colord") return client def device_connect(client, device_id): """ Connect to device """ if isinstance(device_id, unicode): device_id = device_id.encode('UTF-8') try: device = client.find_device_sync(device_id, cancellable) except Exception, exception: raise CDError(exception.args[0]) # Connect to device if not device.connect_sync(cancellable): raise CDError("Couldn't connect to device with ID %r" % device_id) return device def device_id_from_edid(edid, quirk=True, use_serial_32=True, truncate_edid_strings=False): """ Assemble device key from EDID """ # https://github.com/hughsie/colord/blob/master/doc/device-and-profile-naming-spec.txt # Should match device ID returned by gcm_session_get_output_id in # gnome-settings-daemon/plugins/color/gsd-color-state.c # and Edid::deviceId in colord-kde/colord-kded/Edid.cpp respectively if "hash" in edid: device_id = device_ids.get(edid["hash"]) if device_id: return device_id elif sys.platform not in ("darwin", "win32") and which("colormgr"): try: device = find("device-by-property", ["OutputEdidMd5", edid["hash"]]) except CDError, exception: warnings.warn(safe_str(exception), Warning) else: device_id = re.search(r":\s*(xrandr-[^\r\n]+)", device) if device_id: device_id = device_id.groups()[0] device_ids[edid["hash"]] = device_id return device_id parts = ["xrandr"] edid_keys = ["manufacturer", "monitor_name", "serial_ascii"] if use_serial_32: edid_keys.append("serial_32") for name in edid_keys: value = edid.get(name) if value: if name == "serial_32" and "serial_ascii" in edid: # Only add numeric serial if no ascii serial continue elif name == "manufacturer": if quirk: value = quirk_manufacturer(value) elif isinstance(value, basestring) and truncate_edid_strings: # Older versions of colord used only the first 12 bytes value = value[:12] parts.append(str(value)) if len(parts) > 1: device_id = "-".join(parts) if "hash" in edid: device_ids[edid["hash"]] = device_id return device_id def find(what, search): colormgr = which("colormgr") if not colormgr: raise CDError("colormgr helper program not found") if not isinstance(search, list): search = [search] args = ["find-%s" % what] + search try: p = sp.Popen([safe_str(colormgr)] + args, stdout=sp.PIPE, stderr=sp.STDOUT) stdout, stderr = p.communicate() except Exception, exception: raise CDError(safe_str(exception)) else: errmsg = "Could not find %s for %s" % (what, search) if p.returncode != 0: raise CDObjectQueryError(stdout.strip() or errmsg) result = stdout.strip() if not result: raise CDObjectNotFoundError(errmsg) return result def get_default_profile(device_id): """ Get default profile filename for device """ if not Colord: colormgr = which("colormgr") if not colormgr: raise CDError("colormgr helper program not found") # Find device object path device = get_object_path(device_id, "device") # Get default profile try: p = sp.Popen([safe_str(colormgr), "device-get-default-profile", device], stdout=sp.PIPE, stderr=sp.STDOUT) stdout, stderr = p.communicate() except Exception, exception: raise CDError(safe_str(exception)) else: errmsg = "Couldn't get default profile for device %s" % device_id if p.returncode != 0: raise CDError(stdout.strip() or errmsg) match = re.search(":\s*([^\r\n]+\.ic[cm])", stdout, re.I) if match: return safe_unicode(match.groups()[0]) else: raise CDError(errmsg) client = client_connect() # Connect to existing device device = device_connect(client, device_id) # Get default profile profile = device.get_default_profile() if not profile: # No assigned profile return # Connect to profile if not profile.connect_sync(cancellable): raise CDError("Couldn't get default profile for device ID %r" % device_id) filename = profile.get_filename() if not isinstance(filename, unicode): filename = filename.decode('UTF-8') return filename def get_object_path(search, object_type): result = find(object_type, search) if result: result = result.splitlines()[0].split(":", 1)[-1].strip() if not result: raise CDObjectNotFoundError("Could not find object path for %s" % search) return result def install_profile(device_id, profile, profile_installname=None, timeout=5, logfn=None): """ Install profile for device profile_installname filename of the installed profile (full path). The profile is copied to this location. If profile_installname is None, it defaults to ~/.local/share/icc/ timeout Time to allow for colord to pick up new profiles (recommended not below 2 secs) """ if profile.ID == "\0" * 16: profile.calculateID() profile_id = "icc-" + hexlify(profile.ID) # Write profile to destination if not profile_installname: profile_installname = os.path.join(xdg_data_home, 'icc', os.path.basename(profile.fileName)) profile_installdir = os.path.dirname(profile_installname) if not os.path.isdir(profile_installdir): os.makedirs(profile_installdir) profile.write(profile_installname) if isinstance(profile_installname, unicode): profile_installname = profile_installname.encode('UTF-8') if Colord: client = client_connect() else: colormgr = which("colormgr") if not colormgr: raise CDError("colormgr helper program not found") profile = None # Query colord for newly added profile for i in xrange(int(timeout / 1.0)): try: if Colord: profile = client.find_profile_sync(profile_id, cancellable) else: profile = get_object_path(profile_id, "profile") except CDObjectQueryError, exception: # Profile not found pass if profile: break # Give colord time to pick up the profile sleep(1) if not profile: raise CDTimeout("Querying for profile %r returned no result for %s secs" % (profile_id, timeout)) errmsg = "Could not make profile %s default for device %s" % (profile_id, device_id) if Colord: # Connect to profile if not profile.connect_sync(cancellable): raise CDError("Could not connect to profile") # Connect to existing device device = device_connect(client, device_id) # Add profile to device try: device.add_profile_sync(Colord.DeviceRelation.HARD, profile, cancellable) except Exception, exception: # Profile may already have been added warnings.warn(safe_str(exception), Warning) # Make profile default for device if not device.make_profile_default_sync(profile, cancellable): raise CDError(errmsg) else: # Find device object path device = get_object_path(device_id, "device") if logfn: logfn("-" * 80) logfn(lang.getstr("commandline")) from worker import printcmdline cmd = safe_str(colormgr) # Add profile to device # (Ignore returncode as profile may already have been added) args = [cmd, "device-add-profile", device, profile] printcmdline(args[0], args[1:], fn=logfn) if logfn: logfn("") try: p = sp.Popen(args, stdout=sp.PIPE, stderr=sp.STDOUT) stdout, stderr = p.communicate() except Exception, exception: raise CDError(safe_str(exception)) if logfn and stdout.strip(): logfn(stdout.strip()) if logfn: logfn("") logfn(lang.getstr("commandline")) # Make profile default for device args = [cmd, "device-make-profile-default", device, profile] printcmdline(args[0], args[1:], fn=logfn) if logfn: logfn("") try: p = sp.Popen(args, stdout=sp.PIPE, stderr=sp.STDOUT) stdout, stderr = p.communicate() except Exception, exception: raise CDError(safe_str(exception)) else: if p.returncode != 0: raise CDError(stdout.strip() or errmsg) if logfn and stdout.strip(): logfn(stdout.strip()) def quirk_manufacturer(manufacturer): if Colord and hasattr(Colord, 'quirk_vendor_name'): return Colord.quirk_vendor_name(manufacturer) if not quirk_cache['suffixes'] or not quirk_cache['vendor_names']: quirk_filename = get_data_path('quirk.json') if quirk_filename: with open(quirk_filename) as quirk_file: quirk = demjson.decode(quirk_file.read()) quirk_cache['suffixes'] = quirk['suffixes'] quirk_cache['vendor_names'] = quirk['vendor_names'] # Correct some company names for old, new in quirk_cache['vendor_names'].iteritems(): if manufacturer.startswith(old): manufacturer = new break # Get rid of suffixes for suffix in quirk_cache['suffixes']: if manufacturer.endswith(suffix): manufacturer = manufacturer[0:len(manufacturer) - len(suffix)] manufacturer = manufacturer.rstrip() return manufacturer class CDError(Exception): pass class CDObjectQueryError(CDError): pass class CDObjectNotFoundError(CDObjectQueryError): pass class CDTimeout(CDError): pass if __name__ == "__main__": import sys for arg in sys.argv[1:]: print get_default_profile(arg) DisplayCAL-3.1.0.0/DisplayCAL/ColorLookupTable.fx0000644000076500000000000000506212647526531021214 0ustar devwheel00000000000000// Color Look Up Table Shader ================================================== // Configuration --------------------------------------------------------------- #define CLUT_ENABLED 1 // Key to toggle CLUT on or off. See MSDN, "Virtual-Key Codes", // msdn.microsoft.com/library/windows/desktop/dd375731%28v=vs.85%29.aspx // for a list of key codes. #define CLUT_TOGGLEKEY 0x24 // 0x24 = HOME key // NOTE that only textures with a height of 2 ^ n and a width of ^ 2 // will work correctly! E.g. x: 256x16, 1024x32, 4096x64 #define CLUT_TEXTURE "ColorLookupTable.png" #define CLUT_TEXTURE_WIDTH ${WIDTH} #define CLUT_SIZE ${HEIGHT} // END Configuration ----------------------------------------------------------- #pragma message "\nColor Look Up Table Shader ${VERSION}\n" #pragma reshade showtogglemessage texture2D ColorLookupTable_texColor : COLOR; texture ColorLookupTable_texCLUT < string source = CLUT_TEXTURE; > { Width = CLUT_TEXTURE_WIDTH; Height = CLUT_SIZE; Format = ${FORMAT}; }; sampler2D ColorLookupTable_samplerColor { Texture = ColorLookupTable_texColor; MinFilter = LINEAR; MagFilter = LINEAR; MipFilter = LINEAR; AddressU = Clamp; AddressV = Clamp; }; sampler2D ColorLookupTable_samplerCLUT { Texture = ColorLookupTable_texCLUT; MinFilter = LINEAR; MagFilter = LINEAR; MipFilter = LINEAR; AddressU = Clamp; AddressV = Clamp; }; void ColorLookupTable_VS(in uint id : SV_VertexID, out float4 position : SV_Position, out float2 texcoord : TEXCOORD0) { texcoord.x = (id == 2) ? 2.0 : 0.0; texcoord.y = (id == 1) ? 2.0 : 0.0; position = float4(texcoord * float2(2.0, -2.0) + float2(-1.0, 1.0), 0.0, 1.0); } #define CLUTscale float2(1.0 / CLUT_TEXTURE_WIDTH, 1.0 / CLUT_SIZE) float4 ColorLookupTable_PS(in float4 position : SV_Position, in float2 texcoord : TEXCOORD) : SV_Target { float4 color = tex2D(ColorLookupTable_samplerColor, texcoord.xy); float3 CLUTcoord = float3((color.rg * (CLUT_SIZE - 1) + 0.5) * CLUTscale, color.b * (CLUT_SIZE - 1)); float shift = floor(CLUTcoord.z); CLUTcoord.x += shift * CLUTscale.y; color.rgb = lerp(tex2D(ColorLookupTable_samplerCLUT, CLUTcoord.xy).rgb, tex2D(ColorLookupTable_samplerCLUT, float2(CLUTcoord.x + CLUTscale.y, CLUTcoord.y)).rgb, CLUTcoord.z - shift); return color; } technique ColorLookupTable < bool enabled = CLUT_ENABLED; toggle = CLUT_TOGGLEKEY; > { pass { VertexShader = ColorLookupTable_VS; PixelShader = ColorLookupTable_PS; } } DisplayCAL-3.1.0.0/DisplayCAL/colormath.py0000644000076500000000000022064612647526531020006 0ustar devwheel00000000000000# -*- coding: utf-8 -*- import logging import math import sys def get_transfer_function_phi(alpha, gamma): return (math.pow(1 + alpha, gamma) * math.pow(gamma - 1, gamma - 1)) / (math.pow(alpha, gamma - 1) * math.pow(gamma, gamma)) LSTAR_E = 216.0 / 24389.0 # Intent of CIE standard, actual CIE standard = 0.008856 LSTAR_K = 24389.0 / 27.0 # Intent of CIE standard, actual CIE standard = 903.3 REC709_K0 = 0.081 # 0.099 / (1.0 / 0.45 - 1) REC709_P = 4.5 # get_transfer_function_phi(0.099, 1.0 / 0.45) SMPTE240M_K0 = 0.0913 # 0.1115 / (1.0 / 0.45 - 1) SMPTE240M_P = 4.0 # get_transfer_function_phi(0.1115, 1.0 / 0.45) SMPTE2084_M1 = (2610.0 / 4096) * .25 SMPTE2084_M2 = (2523.0 / 4096) * 128 SMPTE2084_C1 = (3424.0 / 4096) SMPTE2084_C2 = (2413.0 / 4096) * 32 SMPTE2084_C3 = (2392.0 / 4096) * 32 SRGB_K0 = 0.04045 # 0.055 / (2.4 - 1) SRGB_P = 12.92 # get_transfer_function_phi(0.055, 2.4) standard_illuminants = { # 1st level is the standard name => illuminant definitions # 2nd level is the illuminant name => CIE XYZ coordinates # (Y should always assumed to be 1.0 and is not explicitly defined) None: {"E": {"X": 1.00000, "Z": 1.00000}}, "ASTM E308-01": {"A": {"X": 1.09850, "Z": 0.35585}, "C": {"X": 0.98074, "Z": 1.18232}, "D50": {"X": 0.96422, "Z": 0.82521}, "D55": {"X": 0.95682, "Z": 0.92149}, "D65": {"X": 0.95047, "Z": 1.08883}, "D75": {"X": 0.94972, "Z": 1.22638}, "F2": {"X": 0.99186, "Z": 0.67393}, "F7": {"X": 0.95041, "Z": 1.08747}, "F11": {"X": 1.00962, "Z": 0.64350}}, "ICC": {"D50": {"X": 0.9642, "Z": 0.8249}, "D65": {"X": 0.9505, "Z": 1.0890}}, "Wyszecki & Stiles": {"A": {"X": 1.09828, "Z": 0.35547}, "B": {"X": 0.99072, "Z": 0.85223}, "C": {"X": 0.98041, "Z": 1.18103}, "D55": {"X": 0.95642, "Z": 0.92085}, "D65": {"X": 0.95017, "Z": 1.08813}, "D75": {"X": 0.94939, "Z": 1.22558}} } def specialpow(a, b): """ Wrapper for power, Rec. 601/709, SMPTE 240M, sRGB and L* functions Positive b = power, -2.4 = sRGB, -3.0 = L*, -240 = SMPTE 240M, -601 = Rec. 601, -709 = Rec. 709 (Rec. 601 and 709 transfer functions are identical) """ if b >= 0.0: # Power curve if a < 0.0: return -math.pow(-a, b) else: return math.pow(a, b) if a < 0.0: signScale = -1.0 a = -a else: signScale = 1.0 if b in (1.0 / -601, 1.0 / -709): # XYZ -> RGB, Rec. 601/709 TRC if a < REC709_K0 / REC709_P: v = a * REC709_P else: v = 1.099 * math.pow(a, 0.45) - 0.099 elif b == 1.0 / -240: # XYZ -> RGB, SMPTE 240M TRC if a < SMPTE240M_K0 / SMPTE240M_P: v = a * SMPTE240M_P else: v = 1.1115 * math.pow(a, 0.45) - 0.1115 elif b == 1.0 / -3.0: # XYZ -> RGB, L* TRC if a <= LSTAR_E: v = 0.01 * a * LSTAR_K else: v = 1.16 * math.pow(a, 1.0 / 3.0) - 0.16 elif b == 1.0 / -2.4: # XYZ -> RGB, sRGB TRC if a <= SRGB_K0 / SRGB_P: v = a * SRGB_P else: v = 1.055 * math.pow(a, 1.0 / 2.4) - 0.055 elif b == 1.0 / -2084: # XYZ -> RGB, SMPTE 2084 (PQ) v = ((2413.0 * (a ** SMPTE2084_M1) + 107) / (2392.0 * (a ** SMPTE2084_M1) + 128)) ** SMPTE2084_M2 elif b == -2.4: # RGB -> XYZ, sRGB TRC if a <= SRGB_K0: v = a / SRGB_P else: v = math.pow((a + 0.055) / 1.055, 2.4) elif b == -3.0: # RGB -> XYZ, L* TRC if a <= 0.08: # E * K * 0.01 v = 100.0 * a / LSTAR_K else: v = math.pow((a + 0.16) / 1.16, 3.0) elif b == -240: # RGB -> XYZ, SMPTE 240M TRC if a < SMPTE240M_K0: v = a / SMPTE240M_P else: v = math.pow((0.1115 + a) / 1.1115, 1.0 / 0.45) elif b in (-601, -709): # RGB -> XYZ, Rec. 601/709 TRC if a < REC709_K0: v = a / REC709_P else: v = math.pow((a + .099) / 1.099, 1.0 / 0.45) elif b == -2084: # RGB -> XYZ, SMPTE 2084 (PQ) # See https://www.smpte.org/sites/default/files/2014-05-06-EOTF-Miller-1-2-handout.pdf v = (max(a ** (1.0 / SMPTE2084_M2) - SMPTE2084_C1, 0) / (SMPTE2084_C2 - SMPTE2084_C3 * a ** (1.0 / SMPTE2084_M2))) ** (1.0 / SMPTE2084_M1) else: raise ValueError("Invalid gamma %s" % b) return v * signScale def DICOM(j, inverse=False): if inverse: log10Y = math.log10(j) A = 71.498068 B = 94.593053 C = 41.912053 D = 9.8247004 E = 0.28175407 F = -1.1878455 G = -0.18014349 H = 0.14710899 I = -0.017046845 return (A + B * log10Y + C * math.pow(log10Y, 2) + D * math.pow(log10Y, 3) + E * math.pow(log10Y, 4) + F * math.pow(log10Y, 5) + G * math.pow(log10Y, 6) + H * math.pow(log10Y, 7) + I * math.pow(log10Y, 8)) else: logj = math.log(j) a = -1.3011877 b = -2.5840191E-2 c = 8.0242636E-2 d = -1.0320229E-1 e = 1.3646699E-1 f = 2.8745620E-2 g = -2.5468404E-2 h = -3.1978977E-3 k = 1.2992634E-4 m = 1.3635334E-3 return ((a + c * logj + e * math.pow(logj, 2) + g * math.pow(logj, 3) + m * math.pow(logj, 4)) / (1 + b * logj + d * math.pow(logj, 2) + f * math.pow(logj, 3) + h * math.pow(logj, 4) + k * math.pow(logj, 5))) rgb_spaces = { # http://brucelindbloom.com/WorkingSpaceInfo.html # ACES: https://github.com/ampas/aces-dev/blob/master/docs/ACES_1.0.1.pdf?raw=true # Adobe RGB: http://www.adobe.com/digitalimag/pdfs/AdobeRGB1998.pdf # DCI P3: http://www.hp.com/united-states/campaigns/workstations/pdfs/lp2480zx-dci--p3-emulation.pdf # http://dcimovies.com/specification/DCI_DCSS_v12_with_errata_2012-1010.pdf # Rec. 2020: http://en.wikipedia.org/wiki/Rec._2020 # # name gamma white primaries # point Rx Ry RY Gx Gy GY Bx By BY "ACES RGB": (1.0, (0.95265, 1.0, 1.00883), (0.7347, 0.2653, 0.343961), (0.0000, 1.0000, 0.728164), (0.0001,-0.0770,-0.072125)), "Adobe RGB (1998)": (2 + 51 / 256.0, "D65", (0.6400, 0.3300, 0.297361), (0.2100, 0.7100, 0.627355), (0.1500, 0.0600, 0.075285)), "Apple RGB": (1.8, "D65", (0.6250, 0.3400, 0.244634), (0.2800, 0.5950, 0.672034), (0.1550, 0.0700, 0.083332)), "Best RGB": (2.2, "D50", (0.7347, 0.2653, 0.228457), (0.2150, 0.7750, 0.737352), (0.1300, 0.0350, 0.034191)), "Beta RGB": (2.2, "D50", (0.6888, 0.3112, 0.303273), (0.1986, 0.7551, 0.663786), (0.1265, 0.0352, 0.032941)), "Bruce RGB": (2.2, "D65", (0.6400, 0.3300, 0.240995), (0.2800, 0.6500, 0.683554), (0.1500, 0.0600, 0.075452)), "CIE RGB": (2.2, "E", (0.7350, 0.2650, 0.176204), (0.2740, 0.7170, 0.812985), (0.1670, 0.0090, 0.010811)), "ColorMatch RGB": (1.8, "D50", (0.6300, 0.3400, 0.274884), (0.2950, 0.6050, 0.658132), (0.1500, 0.0750, 0.066985)), "DCI P3 RGB": (2.6, (0.89459, 1.0, 0.95442), (0.6800, 0.3200, 0.209475), (0.2650, 0.6900, 0.721592), (0.1500, 0.0600, 0.068903)), "Don RGB 4": (2.2, "D50", (0.6960, 0.3000, 0.278350), (0.2150, 0.7650, 0.687970), (0.1300, 0.0350, 0.033680)), "ECI RGB": (1.8, "D50", (0.6700, 0.3300, 0.320250), (0.2100, 0.7100, 0.602071), (0.1400, 0.0800, 0.077679)), "ECI RGB v2": (-3.0, "D50", (0.6700, 0.3300, 0.320250), (0.2100, 0.7100, 0.602071), (0.1400, 0.0800, 0.077679)), "Ekta Space PS5": (2.2, "D50", (0.6950, 0.3050, 0.260629), (0.2600, 0.7000, 0.734946), (0.1100, 0.0050, 0.004425)), "NTSC 1953 RGB": (2.2, "C", (0.6700, 0.3300, 0.298839), (0.2100, 0.7100, 0.586811), (0.1400, 0.0800, 0.114350)), "PAL/SECAM RGB": (2.2, "D65", (0.6400, 0.3300, 0.222021), (0.2900, 0.6000, 0.706645), (0.1500, 0.0600, 0.071334)), "ProPhoto RGB": (1.8, "D50", (0.7347, 0.2653, 0.288040), (0.1596, 0.8404, 0.711874), (0.0366, 0.0001, 0.000086)), "Rec. 709 RGB": (-709, "D65", (0.6400, 0.3300, 0.212656), (0.3000, 0.6000, 0.715158), (0.1500, 0.0600, 0.072186)), "Rec. 2020 RGB": (-709, "D65", (0.7080, 0.2920, 0.262694), (0.1700, 0.7970, 0.678009), (0.1310, 0.0460, 0.059297)), "SMPTE-C RGB": (2.2, "D65", (0.6300, 0.3400, 0.212395), (0.3100, 0.5950, 0.701049), (0.1550, 0.0700, 0.086556)), "SMPTE 240M RGB": (-240, "D65", (0.6300, 0.3400, 0.212395), (0.3100, 0.5950, 0.701049), (0.1550, 0.0700, 0.086556)), "sRGB": (-2.4, "D65", (0.6400, 0.3300, 0.212656), (0.3000, 0.6000, 0.715158), (0.1500, 0.0600, 0.072186)), "Wide Gamut RGB": (2.2, "D50", (0.7350, 0.2650, 0.258187), (0.1150, 0.8260, 0.724938), (0.1570, 0.0180, 0.016875)) } def get_cat_matrix(cat="Bradford"): if isinstance(cat, basestring): cat = cat_matrices[cat] if not isinstance(cat, Matrix3x3): cat = Matrix3x3(cat) return cat def cbrt(x): return math.pow(x, 1.0 / 3.0) if x >= 0 else -math.pow(-x, 1.0 / 3.0) def var(a): """ Variance """ s = 0.0 l = len(a) while l: l -= 1 s += a[l] l = len(a) m = s / l s = 0.0 while l: l -= 1 s += (a[l] - m) ** 2 return s / len(a) def XYZ2LMS(X, Y, Z, cat="Bradford"): """ Convert from XYZ to cone response domain """ cat = get_cat_matrix(cat) p, y, b = cat * [X, Y, Z] return p, y, b def LMS_wp_adaption_matrix(whitepoint_source=None, whitepoint_destination=None, cat="Bradford"): """ Prepare a matrix to match the whitepoints in cone response domain """ # chromatic adaption # based on formula http://brucelindbloom.com/Eqn_ChromAdapt.html # cat = adaption matrix or predefined choice ('CAT02', 'Bradford', # 'Von Kries', 'XYZ Scaling', see cat_matrices), defaults to 'Bradford' cat = get_cat_matrix(cat) XYZWS = get_whitepoint(whitepoint_source) XYZWD = get_whitepoint(whitepoint_destination) if XYZWS[1] <= 1.0 and XYZWD[1] > 1.0: # make sure the scaling is identical XYZWS = [v * 100 for v in XYZWS] if XYZWD[1] <= 1.0 and XYZWS[1] > 1.0: # make sure the scaling is identical XYZWD = [v * 100 for v in XYZWD] Ls, Ms, Ss = XYZ2LMS(XYZWS[0], XYZWS[1], XYZWS[2], cat) Ld, Md, Sd = XYZ2LMS(XYZWD[0], XYZWD[1], XYZWD[2], cat) return Matrix3x3([[Ld/Ls, 0, 0], [0, Md/Ms, 0], [0, 0, Sd/Ss]]) def wp_adaption_matrix(whitepoint_source=None, whitepoint_destination=None, cat="Bradford"): """ Prepare a matrix to match the whitepoints in cone response doamin and transform back to XYZ """ # chromatic adaption # based on formula http://brucelindbloom.com/Eqn_ChromAdapt.html # cat = adaption matrix or predefined choice ('CAT02', 'Bradford', # 'Von Kries', 'XYZ Scaling', see cat_matrices), defaults to 'Bradford' cat = get_cat_matrix(cat) return cat.inverted() * LMS_wp_adaption_matrix(whitepoint_source, whitepoint_destination, cat) * cat def adapt(X, Y, Z, whitepoint_source=None, whitepoint_destination=None, cat="Bradford"): """ Transform XYZ under source illuminant to XYZ under destination illuminant """ # chromatic adaption # based on formula http://brucelindbloom.com/Eqn_ChromAdapt.html # cat = adaption matrix or predefined choice ('CAT02', 'Bradford', # 'Von Kries', 'XYZ Scaling', see cat_matrices), defaults to 'Bradford' return wp_adaption_matrix(whitepoint_source, whitepoint_destination, cat) * (X, Y, Z) def apply_bpc(X, Y, Z, bp_in, bp_out, wp_out="D50", weight=False): """ Apply black point compensation """ wp_out = get_whitepoint(wp_out) XYZ = [X, Y, Z] if weight: L = XYZ2Lab(*[v * 100 for v in (X, Y, Z)])[0] bp_in_Lab = XYZ2Lab(*[v * 100 for v in bp_in]) bp_out_Lab = XYZ2Lab(*[v * 100 for v in bp_out]) vv = (L - bp_in_Lab[0]) / (100.0 - bp_in_Lab[0]) # 0 at bp, 1 at wp vv = 1.0 - vv if vv < 0.0: vv = 0.0 elif vv > 1.0: vv = 1.0 vv = math.pow(vv, min(40.0, 40.0 / (max(bp_in_Lab[0], bp_out_Lab[0]) or 1.0))) bp_in = Lab2XYZ(*[v * vv for v in bp_in_Lab]) bp_out = Lab2XYZ(*[v * vv for v in bp_out_Lab]) for i, v in enumerate(XYZ): XYZ[i] = ((wp_out[i] - bp_out[i]) * v - wp_out[i] * (bp_in[i] - bp_out[i])) / (wp_out[i] - bp_in[i]) return XYZ def avg(*args): return float(sum(args)) / len(args) def interp(x, xp, fp, left=None, right=None): """ One-dimensional linear interpolation similar to numpy.interp Values do NOT have to be monotonically increasing interp(0, [0, 0], [0, 1]) will return 0 """ if not isinstance(x, (int, long, float, complex)): yi = [] for n in x: yi.append(interp(n, xp, fp, left, right)) return yi if x in xp: return fp[xp.index(x)] elif x < xp[0]: return fp[0] if left is None else left elif x > xp[-1]: return fp[-1] if right is None else right else: # Interpolate lower = 0 higher = len(fp) - 1 for i, v in enumerate(xp): if v < x and i > lower: lower = i elif v > x and i < higher: higher = i step = float(x - xp[lower]) steps = (xp[higher] - xp[lower]) / step return fp[lower] + (fp[higher] - fp[lower]) / steps def compute_bpc(bp_in, bp_out): """ Black point compensation. Implemented as a linear scaling in XYZ. Black points should come relative to the white point. Fills and returns a matrix/offset element. [matrix]*bp_in + offset = bp_out [matrix]*D50 + offset = D50 """ # This is a linear scaling in the form ax+b, where # a = (bp_out - D50) / (bp_in - D50) # b = - D50* (bp_out - bp_in) / (bp_in - D50) D50 = get_standard_illuminant("D50") tx = bp_in[0] - D50[0] ty = bp_in[1] - D50[1] tz = bp_in[2] - D50[2] ax = (bp_out[0] - D50[0]) / tx ay = (bp_out[1] - D50[1]) / ty az = (bp_out[2] - D50[2]) / tz bx = - D50[0] * (bp_out[0] - bp_in[0]) / tx by = - D50[1] * (bp_out[1] - bp_in[1]) / ty bz = - D50[2] * (bp_out[2] - bp_in[2]) / tz matrix = Matrix3x3([[ax, 0, 0], [0, ay, 0] [0, 0, az]]) offset = [bx, by, bz] return matrix, offset def delta(L1, a1, b1, L2, a2, b2, method="1976", p1=None, p2=None, p3=None): """ Compute the delta of two samples CIE 1994 & CMC calculation code derived from formulas on www.brucelindbloom.com CIE 1994 code uses some alterations seen on www.farbmetrik-gall.de/cielab/korrcielab/cie94.html (see notes in code below) CIE 2000 calculation code derived from Excel spreadsheet available at www.ece.rochester.edu/~gsharma/ciede2000 method: either "CIE94", "CMC", "CIE2K" or "CIE76" (default if method is not set) p1, p2, p3 arguments have different meaning for each calculation method: CIE 1994: If p1 is not None, calculation will be adjusted for textiles, otherwise graphics arts (default if p1 is not set) CMC(l:c): p1 equals l (lightness) weighting factor and p2 equals c (chroma) weighting factor. Commonly used values are CMC(1:1) for perceptability (default if p1 and p2 are not set) and CMC(2:1) for acceptability CIE 2000: p1 becomes kL (lightness) weighting factor, p2 becomes kC (chroma) weighting factor and p3 becomes kH (hue) weighting factor (all three default to 1 if not set) """ if isinstance(method, basestring): method = method.lower() else: method = str(int(method)) if method in ("94", "1994", "cie94", "cie1994"): textiles = p1 dL = L1 - L2 C1 = math.sqrt(math.pow(a1, 2) + math.pow(b1, 2)) C2 = math.sqrt(math.pow(a2, 2) + math.pow(b2, 2)) dC = C1 - C2 dH2 = math.pow(a1 - a2, 2) + math.pow(b1 - b2, 2) - math.pow(dC, 2) dH = math.sqrt(dH2) if dH2 > 0 else 0 SL = 1.0 K1 = 0.048 if textiles else 0.045 K2 = 0.014 if textiles else 0.015 # brucelindbloom.com formula originally used C1 instead of C_, # but the results are different from ProfileMaker/MeasureTool # implementation, so use this instead # (found on www.farbmetrik-gall.de/cielab/korrcielab/cie94.html) C_ = (math.sqrt((1 + (K1 * C1)) * (1 + (K1 * C2))) - 1) / K1 SC = 1.0 + K1 * C_ SH = 1.0 + K2 * C_ KL = 2.0 if textiles else 1.0 KC = 1.0 KH = 1.0 dE = math.sqrt(math.pow(dL / (KL * SL), 2) + math.pow(dC / (KC * SC), 2) + math.pow(dH / (KH * SH), 2)) elif method in ("cmc(2:1)", "cmc21", "cmc(1:1)", "cmc11", "cmc"): if method in ("cmc(2:1)", "cmc21"): p1 = 2.0 l = p1 if isinstance(p1, (float, int)) else 1.0 c = p2 if isinstance(p2, (float, int)) else 1.0 dL = L1 - L2 C1 = math.sqrt(math.pow(a1, 2) + math.pow(b1, 2)) C2 = math.sqrt(math.pow(a2, 2) + math.pow(b2, 2)) dC = C1 - C2 dH2 = math.pow(a1 - a2, 2) + math.pow(b1 - b2, 2) - math.pow(dC, 2) dH = math.sqrt(dH2) if dH2 > 0 else 0 SL = 0.511 if L1 < 16 else (0.040975 * L1) / (1 + 0.01765 * L1) SC = (0.0638 * C1) / (1 + 0.0131 * C1) + 0.638 F = math.sqrt(math.pow(C1, 4) / (math.pow(C1, 4) + 1900.0)) H1 = math.degrees(math.atan2(b1, a1)) + (0 if b1 >= 0 else 360.0) T = 0.56 + abs(0.2 * math.cos(math.radians(H1 + 168.0))) if 164 <= H1 and H1 <= 345 else 0.36 + abs(0.4 * math.cos(math.radians(H1 + 35))) SH = SC * (F * T + 1 - F) dE = math.sqrt(math.pow(dL / (l * SL), 2) + math.pow(dC / (c * SC), 2) + math.pow(dH / SH, 2)) elif method in ("00", "2k", "2000", "cie00", "cie2k", "cie2000"): pow25_7 = math.pow(25, 7) k_L = p1 if isinstance(p1, (float, int)) else 1.0 k_C = p2 if isinstance(p2, (float, int)) else 1.0 k_H = p3 if isinstance(p3, (float, int)) else 1.0 C1 = math.sqrt(math.pow(a1, 2) + math.pow(b1, 2)) C2 = math.sqrt(math.pow(a2, 2) + math.pow(b2, 2)) C_avg = avg(C1, C2) G = .5 * (1 - math.sqrt(math.pow(C_avg, 7) / (math.pow(C_avg, 7) + pow25_7))) L1_ = L1 a1_ = (1 + G) * a1 b1_ = b1 L2_ = L2 a2_ = (1 + G) * a2 b2_ = b2 C1_ = math.sqrt(math.pow(a1_, 2) + math.pow(b1_, 2)) C2_ = math.sqrt(math.pow(a2_, 2) + math.pow(b2_, 2)) h1_ = 0 if a1_ == 0 and b1_ == 0 else math.degrees(math.atan2(b1_, a1_)) + (0 if b1_ >= 0 else 360.0) h2_ = 0 if a2_ == 0 and b2_ == 0 else math.degrees(math.atan2(b2_, a2_)) + (0 if b2_ >= 0 else 360.0) dh_cond = 1.0 if h2_ - h1_ > 180 else (2.0 if h2_ - h1_ < -180 else 0) dh_ = h2_ - h1_ if dh_cond == 0 else (h2_ - h1_ - 360.0 if dh_cond == 1 else h2_ + 360.0 - h1_) dL_ = L2_ - L1_ dL = dL_ dC_ = C2_ - C1_ dC = dC_ dH_ = 2 * math.sqrt(C1_ * C2_) * math.sin(math.radians(dh_ / 2.0)) dH = dH_ L__avg = avg(L1_, L2_) C__avg = avg(C1_, C2_) h__avg_cond = 3.0 if C1_ * C2_ == 0 else (0 if abs(h2_ - h1_) <= 180 else (1.0 if h2_ + h1_ < 360 else 2.0)) h__avg = h1_ + h2_ if h__avg_cond == 3 else (avg(h1_, h2_) if h__avg_cond == 0 else (avg(h1_, h2_) + 180.0 if h__avg_cond == 1 else avg(h1_, h2_) - 180.0)) AB = math.pow(L__avg - 50.0, 2) # (L'_ave-50)^2 S_L = 1 + .015 * AB / math.sqrt(20.0 + AB) S_C = 1 + .045 * C__avg T = (1 - .17 * math.cos(math.radians(h__avg - 30.0)) + .24 * math.cos(math.radians(2.0 * h__avg)) + .32 * math.cos(math.radians(3.0 * h__avg + 6.0)) - .2 * math.cos(math.radians(4 * h__avg - 63.0))) S_H = 1 + .015 * C__avg * T dTheta = 30.0 * math.exp(-1 * math.pow((h__avg - 275.0) / 25.0, 2)) R_C = 2.0 * math.sqrt(math.pow(C__avg, 7) / (math.pow(C__avg, 7) + pow25_7)) R_T = -math.sin(math.radians(2.0 * dTheta)) * R_C AJ = dL_ / S_L / k_L # dL' / k_L / S_L AK = dC_ / S_C / k_C # dC' / k_C / S_C AL = dH_ / S_H / k_H # dH' / k_H / S_H dE = math.sqrt(math.pow(AJ, 2) + math.pow(AK, 2) + math.pow(AL, 2) + R_T * AK * AL) else: # dE 1976 dL = L1 - L2 C1 = math.sqrt(math.pow(a1, 2) + math.pow(b1, 2)) C2 = math.sqrt(math.pow(a2, 2) + math.pow(b2, 2)) dC = C1 - C2 dH2 = math.pow(a1 - a2, 2) + math.pow(b1 - b2, 2) - math.pow(dC, 2) dH = math.sqrt(dH2) if dH2 > 0 else 0 dE = math.sqrt(math.pow(dL, 2) + math.pow(a1 - a2, 2) + math.pow(b1 - b2, 2)) return {"E": dE, "L": dL, "C": dC, "H": dH, "a": a1 - a2, "b": b1 - b2} def is_similar_matrix(matrix1, matrix2, digits=3): """ Compare two matrices and check if they are the same up to n digits after the decimal point """ return matrix1.rounded(digits) == matrix2.rounded(digits) def get_gamma(values, scale=1.0, vmin=0.0, vmax=1.0, average=True, least_squares=False): """ Return average or least squares gamma or a list of gamma values """ if least_squares: logxy = [] logx2 = [] else: gammas = [] vmin /= scale vmax /= scale for x, y in values: x /= scale y = (y / scale - vmin) * (vmax + vmin) if x > 0 and x < 1 and y > 0: if least_squares: logxy.append(math.log(x) * math.log(y)) logx2.append(math.pow(math.log(x), 2)) else: gammas.append(math.log(y) / math.log(x)) if average or least_squares: if least_squares: if not logxy or not logx2: return 0 return sum(logxy) / sum(logx2) else: if not gammas: return 0 return sum(gammas) / len(gammas) else: return gammas def guess_cat(chad, whitepoint_source=None, whitepoint_destination=None): """ Try and guess the chromatic adaption transform used in a chromatic adaption matrix as found in an ICC profile's 'chad' tag """ if chad == [[1, 0, 0], [0, 1, 0], [0, 0, 1]]: return "None" for cat in cat_matrices: if is_similar_matrix((chad * cat_matrices[cat].inverted() * LMS_wp_adaption_matrix(whitepoint_destination, whitepoint_source, cat)).inverted(), cat_matrices[cat], 2): return cat def CIEDCCT2xyY(T, scale=1.0): """ Convert from CIE correlated daylight temperature to xyY. T = temperature in Kelvin. Based on formula from http://brucelindbloom.com/Eqn_T_to_xy.html """ if isinstance(T, basestring): # Assume standard illuminant, e.g. "D50" return XYZ2xyY(*get_standard_illuminant(T, scale=scale)) if 4000 <= T and T <= 7000: xD = (((-4.607 * math.pow(10, 9)) / math.pow(T, 3)) + ((2.9678 * math.pow(10, 6)) / math.pow(T, 2)) + ((0.09911 * math.pow(10, 3)) / T) + 0.244063) elif 7000 < T and T <= 25000: xD = (((-2.0064 * math.pow(10, 9)) / math.pow(T, 3)) + ((1.9018 * math.pow(10, 6)) / math.pow(T, 2)) + ((0.24748 * math.pow(10, 3)) / T) + 0.237040) else: return None yD = -3 * math.pow(xD, 2) + 2.87 * xD - 0.275 return xD, yD, scale def CIEDCCT2XYZ(T, scale=1.0): """ Convert from CIE correlated daylight temperature to XYZ. T = temperature in Kelvin. """ xyY = CIEDCCT2xyY(T, scale) if xyY: return xyY2XYZ(*xyY) def DIN992Lab(L99, a99, b99, kCH=1.0, kE=1.0): C99, H99 = DIN99familyab2DIN99CH(a99, b99) return DIN99LCH2Lab(L99, C99, H99, kCH, kE) def DIN99b2Lab(L99, a99, b99): C99, H99 = DIN99familyab2DIN99CH(a99, b99) return DIN99bcdLCH2Lab(L99, C99, H99, 0, 303.67, .0039, 26, .83, 23, .075) def DIN99c2Lab(L99, a99, b99, whitepoint=None): C99, H99 = DIN99familyab2DIN99CH(a99, b99) return DIN99bcdLCH2Lab(L99, C99, H99, .1, 317.651, .0037, 0, .94, 23, .066, whitepoint) def DIN99d2Lab(L99, a99, b99, whitepoint=None): C99, H99 = DIN99familyab2DIN99CH(a99, b99) return DIN99bcdLCH2Lab(L99, C99, H99, .12, 325.221, .0036, 50, 1.14, 22.5, .06, whitepoint) def DIN99LCH2Lab(L99, C99, H99, kCH, kE=1.0): G = (math.exp(.045 * C99 * kCH * kE) - 1) / .045 return DIN99familyLHCG2Lab(L99, H99, C99, G, kE, 105.51, .0158, 16, .7) def DIN99bcdLCH2Lab(L99, C99, H99, x, l1, l2, deg, f1, c1, c2, whitepoint=None): G = (math.exp(C99 / c1) - 1) / c2 H99 -= deg L, a, b = DIN99familyLHCG2Lab(L99, H99, C99, G, 1.0, l1, l2, deg, f1) if x: X, Y, Z = Lab2XYZ(L, a, b, whitepoint, scale=100) X = (X + x * Z) / (1 + x) L, a, b = XYZ2Lab(X, Y, Z, whitepoint) return L, a, b def DIN99familyLHCG2Lab(L99, H99, C99, G, kE, l1, l2, deg, f1): L = (math.exp((L99 * kE) / l1) - 1) / l2 h99ef = H99 * math.pi / 180 e = G * math.cos(h99ef) f = G * math.sin(h99ef) rad = deg * math.pi / 180 a = e * math.cos(rad) - (f / f1) * math.sin(rad) b = e * math.sin(rad) + (f / f1) * math.cos(rad) return L, a, b def DIN99familyCH2DIN99ab(C99, H99): h99ef = H99 * math.pi / 180 return C99 * math.cos(h99ef), C99 * math.sin(h99ef) def DIN99familyab2DIN99CH(a99, b99): C99 = math.sqrt(math.pow(a99, 2) + math.pow(b99, 2)) if a99 > 0: if b99 >= 0: h99ef = math.atan2(b99, a99) else: h99ef = 2 * math.pi + math.atan2(b99, a99) elif a99 < 0: h99ef = math.atan2(b99, a99) else: if b99 > 0: h99ef = math.pi / 2 elif b99 < 0: h99ef = (3 * math.pi) / 2 else: h99ef = 0.0 H99 = h99ef * 180 / math.pi return C99, H99 def HSV2RGB(H, S, V, scale=1.0): if S == 0: return (V * scale, ) * 3 else: h = H * 6.0 if h == 6: h = 0 i = int(h) component_1 = V * (1.0 - S) component_2 = V * (1.0 - S * (h - i)) component_3 = V * (1.0 - S * (1.0 - (h - i))) if i == 0: R = V G = component_3 B = component_1 elif i == 1: R = component_2 G = V B = component_1 elif i == 2: R = component_1 G = V B = component_3 elif i == 3: R = component_1 G = component_2 B = V elif i == 4: R = component_3 G = component_1 B = V else: R = V G = component_1 B = component_2 return R * scale, G * scale, B * scale def get_DBL_MIN(): t = "0.0" i = 10 n = 0 while True: if i > 1: i -= 1 else: t += "0" i = 9 if float(t + str(i)) == 0.0: if n > 1: break n += 1 t += str(i) i = 10 else: if n > 1: n -= 1 DBL_MIN = float(t + str(i)) return DBL_MIN DBL_MIN = get_DBL_MIN() def LCHab2Lab(L, C, H): a = C * math.cos(H * math.pi / 180.0) b = C * math.sin(H * math.pi / 180.0) return L, a, b def Lab2DIN99(L, a, b, kCH=1.0, kE=1.0): L99, C99, H99 = Lab2DIN99LCH(L, a, b, kCH, kE) a99, b99 = DIN99familyCH2DIN99ab(C99, H99) return L99, a99, b99 def Lab2DIN99b(L, a, b, kE=1.0): L99, C99, H99 = Lab2DIN99bLCH(L, a, b, kE) a99, b99 = DIN99familyCH2DIN99ab(C99, H99) return L99, a99, b99 def Lab2DIN99c(L, a, b, kE=1.0, whitepoint=None): X, Y, Z = Lab2XYZ(L, a, b, whitepoint, scale=100) return XYZ2DIN99c(X, Y, Z, whitepoint) def Lab2DIN99d(L, a, b, kE=1.0, whitepoint=None): X, Y, Z = Lab2XYZ(L, a, b, whitepoint, scale=100) return XYZ2DIN99d(X, Y, Z, whitepoint) def Lab2DIN99LCH(L, a, b, kCH=1.0, kE=1.0): L99, G, h99ef, rad = Lab2DIN99familyLGhrad(L, a, b, kE, 105.51, .0158, 16, .7) C99 = math.log(1 + .045 * G) / .045 * kCH * kE H99 = h99ef * 180 / math.pi return L99, C99, H99 def Lab2DIN99bLCH(L, a, b, kE=1.0): return Lab2DIN99bcdLCH(L, a, b, 303.67, .0039, 26, .83, 23, .075) def Lab2DIN99bcdLCH(L, a, b, l1, l2, deg, f1, c1, c2): L99, G, h99ef, rad = Lab2DIN99familyLGhrad(L, a, b, 1.0, l1, l2, deg, f1) C99 = c1 * math.log(1 + c2 * G) H99 = h99ef * 180 / math.pi + deg return L99, C99, H99 def Lab2DIN99familyLGhrad(L, a, b, kE, l1, l2, deg, f1): L99 = (1.0 / kE) * l1 * math.log(1 + l2 * L) rad = deg * math.pi / 180 if rad: ar = math.cos(rad) # a rotation term br = math.sin(rad) # b rotation term e = a * ar + b * br f = f1 * (b * ar - a * br) else: e = a f = f1 * b G = math.sqrt(math.pow(e, 2) + math.pow(f, 2)) h99ef = math.atan2(f, e) return L99, G, h99ef, rad def Lab2LCHab(L, a, b): C = math.sqrt(math.pow(a, 2) + math.pow(b, 2)) H = 180.0 * math.atan2(b, a) / math.pi if (H < 0.0): H += 360.0 return L, C, H def Lab2Luv(L, a, b, whitepoint=None, scale=100): X, Y, Z = Lab2XYZ(L, a, b, whitepoint, scale) return XYZ2Luv(X, Y, Z, whitepoint) def Lab2RGB(L, a, b, rgb_space=None, scale=1.0, round_=False, clamp=True, whitepoint=None, noadapt=False, cat="Bradford"): """ Convert from Lab to RGB """ X, Y, Z = Lab2XYZ(L, a, b, whitepoint) if not noadapt: X, Y, Z = adapt(X, Y, Z, whitepoint, rgb_space[1] if rgb_space else "D65", cat) return XYZ2RGB(X, Y, Z, rgb_space, scale, round_, clamp) def Lab2XYZ(L, a, b, whitepoint=None, scale=1.0): """ Convert from Lab to XYZ. The input L value needs to be in the nominal range [0.0, 100.0] and other input values scaled accordingly. The output XYZ values are in the nominal range [0.0, scale]. whitepoint can be string (e.g. "D50"), a tuple of XYZ coordinates or color temperature as float or int. Defaults to D50 if not set. Based on formula from http://brucelindbloom.com/Eqn_Lab_to_XYZ.html """ fy = (L + 16) / 116.0 fx = a / 500.0 + fy fz = fy - b / 200.0 if math.pow(fx, 3.0) > LSTAR_E: xr = math.pow(fx, 3.0) else: xr = (116.0 * fx - 16) / LSTAR_K if L > LSTAR_K * LSTAR_E: yr = math.pow((L + 16) / 116.0, 3.0) else: yr = L / LSTAR_K if math.pow(fz, 3.0) > LSTAR_E: zr = math.pow(fz, 3.0) else: zr = (116.0 * fz - 16) / LSTAR_K Xr, Yr, Zr = get_whitepoint(whitepoint, scale) X = xr * Xr Y = yr * Yr Z = zr * Zr return X, Y, Z def Lab2xyY(L, a, b, whitepoint=None, scale=1.0): X, Y, Z = Lab2XYZ(L, a, b, whitepoint, scale) return XYZ2xyY(X, Y, Z, whitepoint) def Luv2LCHuv(L, u, v): C = math.sqrt(math.pow(u, 2) + math.pow(v, 2)) H = 180.0 * math.atan2(v, u) / math.pi if (H < 0.0): H += 360.0 return L, C, H def Luv2RGB(L, u, v, rgb_space=None, scale=1.0, round_=False, clamp=True, whitepoint=None): """ Convert from Luv to RGB """ X, Y, Z = Luv2XYZ(L, u, v, whitepoint) return XYZ2RGB(X, Y, Z, rgb_space, scale, round_, clamp) def u_v_2xy(u, v): """ Convert from u'v' to xy """ x = (9.0 * u) / (6 * u - 16 * v + 12) y = (4 * v) / (6 * u - 16 * v + 12) return x, y def Luv2XYZ(L, u, v, whitepoint=None, scale=1.0): """ Convert from Luv to XYZ """ Xr, Yr, Zr = get_whitepoint(whitepoint) Y = math.pow((L + 16.0) / 116.0, 3) if L > LSTAR_K * LSTAR_E else L / LSTAR_K uo = (4.0 * Xr) / (Xr + 15.0 * Yr + 3.0 * Zr) vo = (9.0 * Yr) / (Xr + 15.0 * Yr + 3.0 * Zr) a = (1.0 / 3.0) * (((52.0 * L) / (u + 13 * L * uo)) -1) b = -5.0 * Y c = -(1.0 / 3.0) d = Y * (((39.0 * L) / (v + 13 * L * vo)) - 5) X = (d - b) / (a - c) Z = X * a + b return tuple([v * scale for v in X, Y, Z]) def RGB2HSI(R, G, B, scale=1.0): I = (R + G + B) / 3.0 if I: S = 1 - min(R, G, B) / I else: S = 0 if not R == G == B: H = math.atan2(math.sqrt(3) * (G - B), 2 * R - G - B) / math.pi / 2 if H < 0: H += 1.0 if H > 1: H -= 1.0 else: H = 0 return H * scale, S * scale, I * scale def RGB2HSL(R, G, B, scale=1.0): RGB_min = min(R, G, B) RGB_max = max(R, G, B) delta = RGB_max - RGB_min L = (RGB_max + RGB_min) / 2.0 if delta == 0: # Gray H = 0 S = 0 else: if L < .5: S = delta / (RGB_max + RGB_min) else: S = delta / (2.0 - RGB_max - RGB_min) delta_R = (((RGB_max - R) / 6.0) + (delta / 2.0) ) / delta delta_G = (((RGB_max - G) / 6.0) + (delta / 2.0) ) / delta delta_B = (((RGB_max - B) / 6.0) + (delta / 2.0) ) / delta if R == RGB_max: H = delta_B - delta_G elif G == RGB_max: H = (1.0 / 3.0) + delta_R - delta_B elif B == RGB_max: H = (2.0 / 3.0) + delta_G - delta_R if H < 0: H += 1.0 if H > 1: H -= 1.0 return H * scale, S * scale, L * scale def RGB2HSV(R, G, B, scale=1.0): RGB_min = min( R, G, B ) RGB_max = max( R, G, B ) delta = RGB_max - RGB_min V = RGB_max if ( delta == 0 ): # Gray H = 0 S = 0 else: S = delta / RGB_max delta_R = (((RGB_max - R) / 6.0) + (delta / 2.0) ) / delta delta_G = (((RGB_max - G) / 6.0) + (delta / 2.0) ) / delta delta_B = (((RGB_max - B) / 6.0) + (delta / 2.0) ) / delta if R == RGB_max: H = delta_B - delta_G elif G == RGB_max: H = (1.0 / 3.0) + delta_R - delta_B elif B == RGB_max: H = (2.0 / 3.0) + delta_G - delta_R if H < 0: H += 1.0 if H > 1: H -= 1.0 return H * scale, S * scale, V * scale def RGB2Lab(R, G, B, rgb_space=None, whitepoint=None, noadapt=False, cat="Bradford"): X, Y, Z = RGB2XYZ(R, G, B, rgb_space, scale=100) if not noadapt: X, Y, Z = adapt(X, Y, Z, rgb_space[1] if rgb_space else "D65", whitepoint, cat) return XYZ2Lab(X, Y, Z, whitepoint=whitepoint) def RGB2XYZ(R, G, B, rgb_space=None, scale=1.0): """ Convert from RGB to XYZ. Use optional RGB colorspace definition, which can be a named colorspace (e.g. "CIE RGB") or must be a tuple in the following format: (gamma, whitepoint, red, green, blue) whitepoint can be a string (e.g. "D50"), a tuple of XYZ coordinates, or a color temperatur in degrees K (float or int). Gamma should be a float. The RGB primaries red, green, blue should be lists or tuples of xyY coordinates (only x and y will be used, so Y can be zero or None). If no colorspace is given, it defaults to sRGB. Based on formula from http://brucelindbloom.com/Eqn_RGB_to_XYZ.html Implementation Notes: 1. The transformation matrix [M] is calculated from the RGB reference primaries as discussed here: http://brucelindbloom.com/Eqn_RGB_XYZ_Matrix.html 2. The gamma values for many common RGB color spaces may be found here: http://brucelindbloom.com/WorkingSpaceInfo.html#Specifications 3. Your input RGB values may need to be scaled before using the above. For example, if your values are in the range [0, 255], you must first divide each by 255.0. 4. The output XYZ values are in the nominal range [0.0, scale]. 5. The XYZ values will be relative to the same reference white as the RGB system. If you want XYZ relative to a different reference white, you must apply a chromatic adaptation transform [http://brucelindbloom.com/Eqn_ChromAdapt.html] to the XYZ color to convert it from the reference white of the RGB system to the desired reference white. 6. Sometimes the more complicated special case of sRGB shown above is replaced by a "simplified" version using a straight gamma function with gamma = 2.2. """ trc, whitepoint, rxyY, gxyY, bxyY, matrix = get_rgb_space(rgb_space) RGB = [R, G, B] is_trc = isinstance(trc, (list, tuple)) for i, v in enumerate(RGB): if is_trc: gamma = trc[i] else: gamma = trc if isinstance(gamma, (list, tuple)): RGB[i] = interp(v, [n / float(len(gamma) - 1) for n in xrange(len(gamma))], gamma) else: RGB[i] = specialpow(v, gamma) XYZ = matrix * RGB return tuple(v * scale for v in XYZ) def RGBsaturation(R, G, B, saturation, rgb_space=None): """ (De)saturate a RGB color in CIE xy and return the RGB and xyY values """ wx, wy, wY = XYZ2xyY(*RGB2XYZ(1, 1, 1, rgb_space=rgb_space)) x, y, Y = XYZ2xyY(*RGB2XYZ(R, G, B, rgb_space=rgb_space)) x, y, Y = wx + (x - wx) * saturation, wy + (y - wy) * saturation, Y return xyY2RGB(x, y, Y, rgb_space=rgb_space), (x, y, Y) def rgb_to_xyz_matrix(rx, ry, gx, gy, bx, by, whitepoint=None, scale=1.0): """ Create and return an RGB to XYZ matrix. """ whitepoint = get_whitepoint(whitepoint, scale) Xr, Yr, Zr = xyY2XYZ(rx, ry, scale) Xg, Yg, Zg = xyY2XYZ(gx, gy, scale) Xb, Yb, Zb = xyY2XYZ(bx, by, scale) Sr, Sg, Sb = Matrix3x3(((Xr, Xg, Xb), (Yr, Yg, Yb), (Zr, Zg, Zb))).inverted() * whitepoint return Matrix3x3(((Sr * Xr, Sg * Xg, Sb * Xb), (Sr * Yr, Sg * Yg, Sb * Yb), (Sr * Zr, Sg * Zg, Sb * Zb))) def get_rgb_space(rgb_space=None, scale=1.0): """ Return gamma, whitepoint, primaries and RGB -> XYZ matrix """ if not rgb_space: rgb_space = "sRGB" if isinstance(rgb_space, basestring): rgb_space = rgb_spaces[rgb_space] cachehash = id(rgb_space), scale cache = get_rgb_space.cache.get(cachehash, None) if cache: return cache gamma = rgb_space[0] or rgb_spaces["sRGB"][0] whitepoint = get_whitepoint(rgb_space[1] or rgb_spaces["sRGB"][1], scale) rx, ry, rY = rgb_space[2] or rgb_spaces["sRGB"][2] gx, gy, gY = rgb_space[3] or rgb_spaces["sRGB"][3] bx, by, bY = rgb_space[4] or rgb_spaces["sRGB"][4] matrix = rgb_to_xyz_matrix(rx, ry, gx, gy, bx, by, whitepoint, scale) rgb_space = gamma, whitepoint, (rx, ry, rY), (gx, gy, gY), (bx, by, bY), matrix get_rgb_space.cache[cachehash] = rgb_space return rgb_space get_rgb_space.cache = {} def get_standard_illuminant(illuminant_name="D50", priority=("ICC", "ASTM E308-01", "Wyszecki & Stiles", None), scale=1.0): """ Return a standard illuminant as XYZ coordinates. """ cachehash = illuminant_name, tuple(priority), scale cache = get_standard_illuminant.cache.get(cachehash, None) if cache: return cache illuminant = None for standard_name in priority: if not standard_name in standard_illuminants: raise ValueError('Unrecognized standard "%s"' % standard_name) illuminant = standard_illuminants.get(standard_name).get(illuminant_name.upper(), None) if illuminant: illuminant = illuminant["X"] * scale, 1.0 * scale, illuminant["Z"] * scale get_standard_illuminant.cache[cachehash] = illuminant return illuminant raise ValueError('Unrecognized illuminant "%s"' % illuminant_name) get_standard_illuminant.cache = {} def get_whitepoint(whitepoint=None, scale=1.0): """ Return a whitepoint as XYZ coordinates """ if isinstance(whitepoint, (list, tuple)): return whitepoint if not whitepoint: whitepoint = "D50" cachehash = whitepoint, scale cache = get_whitepoint.cache.get(cachehash, None) if cache: return cache if isinstance(whitepoint, basestring): whitepoint = get_standard_illuminant(whitepoint) elif isinstance(whitepoint, (float, int)): whitepoint = CIEDCCT2XYZ(whitepoint) if scale > 1.0 and whitepoint[1] == 100: scale = 1.0 if whitepoint[1] * scale > 100: ValueError("Y value out of range after scaling: %s" % (whitepoint[1] * scale)) whitepoint = tuple(v * scale for v in whitepoint) get_whitepoint.cache[cachehash] = whitepoint return whitepoint get_whitepoint.cache = {} def planckianCT2XYZ(T, scale=1.0): """ Convert from planckian temperature to XYZ. T = temperature in Kelvin. """ xyY = planckianCT2xyY(T, scale) if xyY: return xyY2XYZ(*xyY) def planckianCT2xyY(T, scale=1.0): """ Convert from planckian temperature to xyY. T = temperature in Kelvin. Formula from http://en.wikipedia.org/wiki/Planckian_locus """ if 1667 <= T and T <= 4000: x = ( -0.2661239 * (math.pow(10, 9) / math.pow(T, 3)) - 0.2343580 * (math.pow(10, 6) / math.pow(T, 2)) + 0.8776956 * (math.pow(10, 3) / T) + 0.179910) elif 4000 <= T and T <= 25000: x = ( -3.0258469 * (math.pow(10, 9) / math.pow(T, 3)) + 2.1070379 * (math.pow(10, 6) / math.pow(T, 2)) + 0.2226347 * (math.pow(10, 3) / T) + 0.24039) else: return None if 1667 <= T and T <= 2222: y = ( -1.1063814 * math.pow(x, 3) - 1.34811020 * math.pow(x, 2) + 2.18555832 * x - 0.20219683) elif 2222 <= T and T <= 4000: y = ( -0.9549476 * math.pow(x, 3) - 1.37418593 * math.pow(x, 2) + 2.09137015 * x - 0.16748867) elif 4000 <= T and T <= 25000: y = ( 3.0817580 * math.pow(x, 3) - 5.87338670 * math.pow(x, 2) + 3.75112997 * x - 0.37001483) return x, y, scale def xyY2CCT(x, y, Y=1.0): """ Convert from xyY to correlated color temperature. """ return XYZ2CCT(*xyY2XYZ(x, y, Y)) def xyY2Lab(x, y, Y=1.0, whitepoint=None): X, Y, Z = xyY2XYZ(x, y, Y) return XYZ2Lab(X, Y, Z, whitepoint) def xyY2Lu_v_(x, y, Y=1.0, whitepoint=None): X, Y, Z = xyY2XYZ(x, y, Y) return XYZ2Lu_v_(X, Y, Z, whitepoint) def xyY2RGB(x, y, Y, rgb_space=None, scale=1.0, round_=False, clamp=True): """ Convert from xyY to RGB """ X, Y, Z = xyY2XYZ(x, y, Y) return XYZ2RGB(X, Y, Z, rgb_space, scale, round_, clamp) def xyY2XYZ(x, y, Y=1.0): """ Convert from xyY to XYZ. Based on formula from http://brucelindbloom.com/Eqn_xyY_to_XYZ.html Implementation Notes: 1. Watch out for the case where y = 0. In that case, X = Y = Z = 0 is returned. 2. The output XYZ values are in the nominal range [0.0, Y[xyY]]. """ if y == 0: return 0, 0, 0 X = (x * Y) / y Z = ((1 - x - y) * Y) / y return X, Y, Z def LERP(a,b,c): """ LERP(a,b,c) = linear interpolation macro. Is 'a' when c == 0.0 and 'b' when c == 1.0 """ return (b - a) * c + a def XYZ2CCT(X, Y, Z): """ Convert from XYZ to correlated color temperature. Derived from ANSI C implementation by Bruce Lindbloom http://brucelindbloom.com/Eqn_XYZ_to_T.html Return: correlated color temperature if successful, else None. Description: This is an implementation of Robertson's method of computing the correlated color temperature of an XYZ color. It can compute correlated color temperatures in the range [1666.7K, infinity]. Reference: "Color Science: Concepts and Methods, Quantitative Data and Formulae", Second Edition, Gunter Wyszecki and W. S. Stiles, John Wiley & Sons, 1982, pp. 227, 228. """ rt = [ # reciprocal temperature (K) DBL_MIN, 10.0e-6, 20.0e-6, 30.0e-6, 40.0e-6, 50.0e-6, 60.0e-6, 70.0e-6, 80.0e-6, 90.0e-6, 100.0e-6, 125.0e-6, 150.0e-6, 175.0e-6, 200.0e-6, 225.0e-6, 250.0e-6, 275.0e-6, 300.0e-6, 325.0e-6, 350.0e-6, 375.0e-6, 400.0e-6, 425.0e-6, 450.0e-6, 475.0e-6, 500.0e-6, 525.0e-6, 550.0e-6, 575.0e-6, 600.0e-6 ] uvt = [ [0.18006, 0.26352, -0.24341], [0.18066, 0.26589, -0.25479], [0.18133, 0.26846, -0.26876], [0.18208, 0.27119, -0.28539], [0.18293, 0.27407, -0.30470], [0.18388, 0.27709, -0.32675], [0.18494, 0.28021, -0.35156], [0.18611, 0.28342, -0.37915], [0.18740, 0.28668, -0.40955], [0.18880, 0.28997, -0.44278], [0.19032, 0.29326, -0.47888], [0.19462, 0.30141, -0.58204], [0.19962, 0.30921, -0.70471], [0.20525, 0.31647, -0.84901], [0.21142, 0.32312, -1.0182], [0.21807, 0.32909, -1.2168], [0.22511, 0.33439, -1.4512], [0.23247, 0.33904, -1.7298], [0.24010, 0.34308, -2.0637], [0.24792, 0.34655, -2.4681], # Note: 0.24792 is a corrected value # for the error found in W&S as 0.24702 [0.25591, 0.34951, -2.9641], [0.26400, 0.35200, -3.5814], [0.27218, 0.35407, -4.3633], [0.28039, 0.35577, -5.3762], [0.28863, 0.35714, -6.7262], [0.29685, 0.35823, -8.5955], [0.30505, 0.35907, -11.324], [0.31320, 0.35968, -15.628], [0.32129, 0.36011, -23.325], [0.32931, 0.36038, -40.770], [0.33724, 0.36051, -116.45] ] if ((X < 1.0e-20 and Y < 1.0e-20 and Z < 1.0e-20) or X + 15.0 * Y + 3.0 * Z == 0): return None # protect against possible divide-by-zero failure us = (4.0 * X) / (X + 15.0 * Y + 3.0 * Z) vs = (6.0 * Y) / (X + 15.0 * Y + 3.0 * Z) dm = 0.0 i = 0 while i < 31: di = (vs - uvt[i][1]) - uvt[i][2] * (us - uvt[i][0]) if i > 0 and ((di < 0.0 and dm >= 0.0) or (di >= 0.0 and dm < 0.0)): break # found lines bounding (us, vs) : i-1 and i dm = di i += 1 if (i == 31): # bad XYZ input, color temp would be less than minimum of 1666.7 # degrees, or too far towards blue return None di = di / math.sqrt(1.0 + uvt[i ][2] * uvt[i ][2]) dm = dm / math.sqrt(1.0 + uvt[i - 1][2] * uvt[i - 1][2]) p = dm / (dm - di) # p = interpolation parameter, 0.0 : i-1, 1.0 : i p = 1.0 / (LERP(rt[i - 1], rt[i], p)) return p def XYZ2DIN99(X, Y, Z, whitepoint=None): X, Y, Z = (max(v, 0) for v in (X, Y, Z)) L, a, b = XYZ2Lab(X, Y, Z, whitepoint) return Lab2DIN99(L, a, b) def XYZ2DIN99b(X, Y, Z, whitepoint=None): L, a, b = XYZ2Lab(X, Y, Z, whitepoint) return Lab2DIN99b(L, a, b) def XYZ2DIN99c(X, Y, Z, whitepoint=None): return XYZ2DIN99cd(X, Y, Z, .1, 317.651, .0037, 0, .94, 23, .066, whitepoint) def XYZ2DIN99cd(X, Y, Z, x, l1, l2, deg, f1, c1, c2, whitepoint=None): L99, C99, H99 = XYZ2DIN99cdLCH(X, Y, Z, x, l1, l2, deg, f1, c1, c2, whitepoint) a99, b99 = DIN99familyCH2DIN99ab(C99, H99) return L99, a99, b99 def XYZ2DIN99cdLCH(X, Y, Z, x, l1, l2, deg, f1, c1, c2, whitepoint=None): X = (1 + x) * X - x * Z L, a, b = XYZ2Lab(X, Y, Z, whitepoint) return Lab2DIN99bcdLCH(L, a, b, l1, l2, deg, f1, c1, c2) def XYZ2DIN99d(X, Y, Z, whitepoint=None): return XYZ2DIN99cd(X, Y, Z, .12, 325.221, .0036, 50, 1.14, 22.5, .06, whitepoint) def XYZ2Lab(X, Y, Z, whitepoint=None): """ Convert from XYZ to Lab. The input Y value needs to be in the nominal range [0.0, 100.0] and other input values scaled accordingly. The output L value is in the nominal range [0.0, 100.0]. whitepoint can be string (e.g. "D50"), a tuple of XYZ coordinates or color temperature as float or int. Defaults to D50 if not set. Based on formula from http://brucelindbloom.com/Eqn_XYZ_to_Lab.html """ Xr, Yr, Zr = get_whitepoint(whitepoint, 100) xr = X / Xr yr = Y / Yr zr = Z / Zr fx = cbrt(xr) if xr > LSTAR_E else (LSTAR_K * xr + 16) / 116.0 fy = cbrt(yr) if yr > LSTAR_E else (LSTAR_K * yr + 16) / 116.0 fz = cbrt(zr) if zr > LSTAR_E else (LSTAR_K * zr + 16) / 116.0 L = 116 * fy - 16 a = 500 * (fx - fy) b = 200 * (fy - fz) return L, a, b def XYZ2Lu_v_(X, Y, Z, whitepoint=None): """ Convert from XYZ to CIE Lu'v' """ if X + Y + Z == 0: # We can't check for X == Y == Z == 0 because they may actually add up # to 0, thus resulting in ZeroDivisionError later L, u_, v_ = XYZ2Lu_v_(*get_whitepoint(whitepoint)) return 0.0, u_, v_ Xr, Yr, Zr = get_whitepoint(whitepoint, 100) yr = Y / Yr L = 116.0 * cbrt(yr) - 16.0 if yr > LSTAR_E else LSTAR_K * yr u_ = (4.0 * X) / (X + 15.0 * Y + 3.0 * Z) v_ = (9.0 * Y) / (X + 15.0 * Y + 3.0 * Z) return L, u_, v_ def XYZ2Luv(X, Y, Z, whitepoint=None): """ Convert from XYZ to Luv """ if X + Y + Z == 0: # We can't check for X == Y == Z == 0 because they may actually add up # to 0, thus resulting in ZeroDivisionError later L, u, v = XYZ2Luv(*get_whitepoint(whitepoint)) return 0.0, u, v Xr, Yr, Zr = get_whitepoint(whitepoint, 100) yr = Y / Yr L = 116.0 * cbrt(yr) - 16.0 if yr > LSTAR_E else LSTAR_K * yr u_ = (4.0 * X) / (X + 15.0 * Y + 3.0 * Z) v_ = (9.0 * Y) / (X + 15.0 * Y + 3.0 * Z) u_r = (4.0 * Xr) / (Xr + 15.0 * Yr + 3.0 * Zr) v_r = (9.0 * Yr) / (Xr + 15.0 * Yr + 3.0 * Zr) u = 13.0 * L * (u_ - u_r) v = 13.0 * L * (v_ - v_r) return L, u, v def XYZ2RGB(X, Y, Z, rgb_space=None, scale=1.0, round_=False, clamp=True): """ Convert from XYZ to RGB. Use optional RGB colorspace definition, which can be a named colorspace (e.g. "CIE RGB") or must be a tuple in the following format: (gamma, whitepoint, red, green, blue) whitepoint can be a string (e.g. "D50"), a tuple of XYZ coordinates, or a color temperatur in degrees K (float or int). Gamma should be a float. The RGB primaries red, green, blue should be lists or tuples of xyY coordinates (only x and y will be used, so Y can be zero or None). If no colorspace is given, it defaults to sRGB. Based on formula from http://brucelindbloom.com/Eqn_XYZ_to_RGB.html Implementation Notes: 1. The transformation matrix [M] is calculated from the RGB reference primaries as discussed here: http://brucelindbloom.com/Eqn_RGB_XYZ_Matrix.html 2. gamma is the gamma value of the RGB color system used. Many common ones may be found here: http://brucelindbloom.com/WorkingSpaceInfo.html#Specifications 3. The output RGB values are in the nominal range [0.0, scale]. 4. If the input XYZ color is not relative to the same reference white as the RGB system, you must first apply a chromatic adaptation transform [http://brucelindbloom.com/Eqn_ChromAdapt.html] to the XYZ color to convert it from its own reference white to the reference white of the RGB system. 5. Sometimes the more complicated special case of sRGB shown above is replaced by a "simplified" version using a straight gamma function with gamma = 2.2. """ trc, whitepoint, rxyY, gxyY, bxyY, matrix = get_rgb_space(rgb_space) RGB = matrix.inverted() * [X, Y, Z] is_trc = isinstance(trc, (list, tuple)) for i, v in enumerate(RGB): if is_trc: gamma = trc[i] else: gamma = trc if isinstance(gamma, (list, tuple)): RGB[i] = interp(v, gamma, [n / float(len(gamma) - 1) for n in xrange(len(gamma))]) else: RGB[i] = specialpow(v, 1.0 / gamma) if clamp: RGB[i] = min(1.0, max(0.0, RGB[i])) RGB[i] *= scale if round_ is not False: RGB[i] = round(RGB[i], round_) return RGB def XYZ2xyY(X, Y, Z, whitepoint=None): """ Convert from XYZ to xyY. Based on formula from http://brucelindbloom.com/Eqn_XYZ_to_xyY.html Implementation Notes: 1. Watch out for black, where X = Y = Z = 0. In that case, x and y are set to the chromaticity coordinates of the reference whitepoint. 2. The output Y value is in the nominal range [0.0, Y[XYZ]]. """ if X + Y + Z == 0: # We can't check for X == Y == Z == 0 because they may actually add up # to 0, thus resulting in ZeroDivisionError later x, y, Y = XYZ2xyY(*get_whitepoint(whitepoint)) return x, y, 0.0 x = X / (X + Y + Z) y = Y / (X + Y + Z) return x, y, Y def xy_CCT_delta(x, y, daylight=True, method=2000): """ Return CCT and delta to locus """ cct = xyY2CCT(x, y) d = None if cct: locus = None if daylight: # Daylight locus if 4000 <= cct <= 25000: locus = CIEDCCT2XYZ(cct, 100.0) else: # Planckian locus if 1667 <= cct <= 25000: locus = planckianCT2XYZ(cct, 100.0) if locus: L1, a1, b1 = xyY2Lab(x, y, 100.0) L2, a2, b2 = XYZ2Lab(*locus) d = delta(L1, a1, b1, L2, a2, b2, method) return cct, d def dmatrixz(nrl, nrh, ncl, nch): # Adapted from ArgyllCMS numlib/numsup.c #nrl # Row low index #nrh # Row high index #ncl # Col low index #nch # Col high index m = {} if nrh < nrl: # Prevent failure for 0 dimension nrh = nrl if nch < ncl: nch = ncl rows = nrh - nrl + 1 cols = nch - ncl + 1 for i in xrange(rows): m[i + nrl] = {} for j in xrange(cols): m[i][j + ncl] = 0 return m def dvector(nl, nh): # Adapted from ArgyllCMS numlib/numsup.c #nl # Lowest index #nh # Highest index return {} def gam_fit(gf, v): # Adapted from ArgyllCMS xicc/xicc.c """ gamma + input offset function handed to powell() """ gamma = v[0] rv = 0.0 if gamma < 0.0: rv += 100.0 * -gamma gamma = 1e-4 t1 = math.pow(gf.bp, 1.0 / gamma); t2 = math.pow(gf.wp, 1.0 / gamma); b = t1 / (t2 - t1) # Offset a = math.pow(t2 - t1, gamma) # Gain # Comput 50% output for this technical gamma # (All values are without output offset being added in) t1 = a * math.pow(0.5 + b, gamma) t1 = t1 - gf.thyr rv += t1 * t1 return rv def linmin(cp, xi, di, ftol, func, fdata): # Adapted from ArgyllCMS numlib/powell.c """ Line bracketing and minimisation routine. Return value at minimum. """ POWELL_GOLD = 1.618034 POWELL_CGOLD = 0.3819660 POWELL_MAXIT = 100 #cp # Start point, and returned value #xi[] # Search vector #di # Dimensionality #ftol # Tolerance to stop on #func # Error function to evaluate #fdata # Opaque data for func() #ax, xx, bx # Search vector multipliers #af, xf, bf # Function values at those points #xt, XT # Trial point XT = {} if di <= 10: xt = XT else: xt = dvector(0, di-1) # Vector for trial point # -------------------------- # First bracket the solution logging.debug("linmin: Bracketing solution") # The line is measured as startpoint + offset * search vector. # (Search isn't symetric, but it seems to depend on cp being # best current solution ?) ax = 0.0 for i in xrange(di): xt[i] = cp[i] + ax * xi[i] af = func(fdata, xt) # xx being vector offset 0.618 xx = 1.0 / POWELL_GOLD for i in xrange(di): xt[i] = cp[i] + xx * xi[i] xf = func(fdata, xt) logging.debug("linmin: Initial points a:%f:%f -> b:%f:%f" % (ax, af, xx, xf)) # Fix it so that we are decreasing from point a -> x if xf > af: tt = ax ax = xx xx = tt tt = af af = xf xf = tt logging.debug("linmin: Ordered Initial points a:%f:%f -> b:%f:%f" % (ax, af, xx, xf)) bx = xx + POWELL_GOLD * (xx-ax) # Guess b beyond a -> x for i in xrange(di): xt[i] = cp[i] + bx * xi[i] bf = func(fdata, xt) logging.debug("linmin: Initial bracket a:%f:%f x:%f:%f b:%f:%f" % (ax, af, xx, xf, bx, bf)) # While not bracketed while xf > bf: logging.debug("linmin: Not bracketed because xf %f > bf %f" % (xf, bf)) logging.debug(" ax = %f, xx = %f, bx = %f" % (ax, xx, bx)) # Compute ux by parabolic interpolation from a, x & b q = (xx - bx) * (xf - af) r = (xx - ax) * (xf - bf) tt = q - r if tt >= 0.0 and tt < 1e-20: # If +ve too small tt = 1e-20 elif tt <= 0.0 and tt > -1e-20: # If -ve too small tt = -1e-20 ux = xx - ((xx - bx) * q - (xx - ax) * r) / (2.0 * tt) ulim = xx + 100.0 * (bx - xx) # Extrapolation limit if (xx - ux) * (ux - bx) > 0.0: # u is between x and b for i in xrange(di): # Evaluate u xt[i] = cp[i] + ux * xi[i] uf = func(fdata, xt) if uf < bf: # Minimum is between x and b ax = xx af = xf xx = ux xf = uf break elif uf > xf: # Minimum is between a and u bx = ux bf = uf break # Parabolic fit didn't work, look further out in direction of b ux = bx + POWELL_GOLD * (bx - xx) elif (bx - ux) * (ux - ulim) > 0.0: # u is between b and limit for i in xrange(di): # Evaluate u xt[i] = cp[i] + ux * xi[i] uf = func(fdata, xt) if uf > bf: # Minimum is between x and u ax = xx af = xf xx = bx xf = bf bx = ux bf = uf break xx = bx xf = bf # Continue looking bx = ux bf = uf ux = bx + POWELL_GOLD * (bx - xx) # Test beyond b elif (ux - ulim) * (ulim - bx) >= 0.0: # u is beyond limit ux = ulim else: # u is to left side of x ? ux = bx + POWELL_GOLD * (bx - xx) # Evaluate u, and move into place at b for i in xrange(di): xt[i] = cp[i] + ux * xi[i] uf = func(fdata, xt) ax = xx af = xf xx = bx xf = bf bx = ux bf = uf logging.debug("linmin: Got bracket a:%f:%f x:%f:%f b:%f:%f" % (ax, af, xx, xf, bx, bf)) # Got bracketed minimum between a -> x -> b # --------------------------------------- # Now use brent minimiser bewteen a and b if True: # a and b bracket solution # x is best function value so far # w is second best function value so far # v is previous second best, or third best # u is most recently tested point #wx, vx, ux # Search vector multipliers #wf vf = 0.0 #uf # Function values at those points de = 0.0 # Distance moved on previous step e = 0.0 # Distance moved on 2nd previous step # Make sure a and b are in ascending order if ax > bx: tt = ax ax = bx bx = tt tt = af af = bf bf = tt wx = vx = xx # Initial values of other center points wf = xf = xf for iter in xrange(1, POWELL_MAXIT + 1): mx = 0.5 * (ax + bx) # m is center of bracket values #if ABSTOL: #tol1 = ftol # Absolute tollerance #else: tol1 = ftol * abs(xx) + 1e-10 tol2 = 2.0 * tol1 logging.debug("linmin: Got bracket a:%f:%f x:%f:%f b:%f:%f" % (ax, af, xx, xf, bx, bf)) # See if we're done if abs(xx - mx) <= (tol2 - 0.5 * (bx - ax)): logging.debug("linmin: We're done because %f <= %f" % (abs(xx - mx), tol2 - 0.5 * (bx - ax))) break if abs(e) > tol1: # Do a trial parabolic fit r = (xx - wx) * (xf-vf) q = (xx - vx) * (xf-wf) p = (xx - vx) * q - (xx-wx) * r q = 2.0 * (q - r) if q > 0.0: p = -p else: q = -q te = e # Save previous e value e = de # Previous steps distance moved logging.debug("linmin: Trial parabolic fit") if (abs(p) >= abs(0.5 * q * te) or p <= q * (ax - xx) or p >= q * (bx - xx)): # Give up on the parabolic fit, and use the golden section search e = ax - xx if xx >= mx else bx - xx # Override previous distance moved */ de = POWELL_CGOLD * e logging.debug("linmin: Moving to golden section search") else: # Use parabolic fit de = p / q # Change in xb ux = xx + de # Trial point according to parabolic fit if (ux - ax) < tol2 or (bx - ux) < tol2: if (mx - xx) > 0.0: # Don't use parabolic, use tol1 de = tol1 # tol1 is +ve else: de = -tol1 logging.debug("linmin: Using parabolic fit") else: # Keep using the golden section search e = ax - xx if xx >= mx else bx - xx # Override previous distance moved de = POWELL_CGOLD * e logging.debug("linmin: Continuing golden section search") if abs(de) >= tol1: # If de moves as much as tol1 would ux = xx + de # use it logging.debug("linmin: ux = %f = xx %f + de %f" % (ux, xx, de)) else: # else move by tol1 in direction de if de > 0.0: ux = xx + tol1 logging.debug("linmin: ux = %f = xx %f + tol1 %f" % (ux, xx, tol1)) else: ux = xx - tol1 logging.debug("linmin: ux = %f = xx %f - tol1 %f" % (ux, xx, tol1)) # Evaluate function for i in xrange(di): xt[i] = cp[i] + ux * xi[i] uf = func(fdata, xt) if uf <= xf: # Found new best solution if ux >= xx: ax = xx af = xf # New lower bracket else: bx = xx bf = xf # New upper bracket vx = wx vf = wf # New previous 2nd best solution wx = xx wf = xf # New 2nd best solution from previous best xx = ux xf = uf # New best solution from latest logging.debug("linmin: found new best solution") else: # Found a worse solution if ux < xx: ax = ux af = uf # New lower bracket else: bx = ux bf = uf # New upper bracket if uf <= wf or wx == xx: # New 2nd best solution, or equal best vx = wx vf = wf # New previous 2nd best solution wx = ux wf = uf # New 2nd best from latest elif uf <= vf or vx == xx or vx == wx: # New 3rd best, or equal 1st & 2nd vx = ux vf = uf # New previous 2nd best from latest logging.debug("linmin: found new worse solution") # !!! should do something if iter > POWELL_MAXIT !!!! # Solution is at xx, xf # Compute solution vector for i in xrange(di): cp[i] += xx * xi[i] return xf def powell(di, cp, s, ftol, maxit, func, fdata, prog=None, pdata=None): # Adapted from ArgyllCMS powell.c """ Standard interface for powell function return True on sucess, False on failure due to excessive iterions Result will be in cp """ DBL_EPSILON = 2.2204460492503131e-016 #di # Dimentionality #cp # Initial starting point #s # Size of initial search area #ftol # Tolerance of error change to stop on #maxit # Maximum iterations allowed #func # Error function to evaluate #fdata # Opaque data needed by function #prog # Optional progress percentage callback #pdata # Opaque data needed by prog() #dmtx # Direction vector #sp # Sarting point before exploring all the directions #xpt # Extrapolated point #svec # Search vector #retv # Returned function value at p #stopth # Current stop threshold */ startdel = -1.0 # Initial change in function value #curdel # Current change in function value pc = 0 # Percentage complete dmtx = dmatrixz(0, di - 1, 0, di - 1) # Zero filled spt = dvector(0, di - 1) xpt = dvector(0, di - 1) svec = dvector(0, di - 1) # Create initial direction matrix by # placing search start on diagonal for i in xrange(di): dmtx[i][i] = s[i] # Save the starting point spt[i] = cp[i] if prog: # Report initial progress prog(pdata, pc) # Initial function evaluation retv = func(fdata, cp) # Iterate untill we converge on a solution, or give up. for iter in xrange(1, maxit): #lretv # Last function return value ibig = 0 # Index of biggest delta del_ = 0.0 # Biggest function value decrease #pretv # Previous function return value pretv = retv # Save return value at top of iteration # Loop over all directions in the set for i in xrange(di): logging.debug("Looping over direction %d" % i) for j in xrange(di): # Extract this direction to make search vector svec[j] = dmtx[j][i] # Minimize in that direction lretv = retv retv = linmin(cp, svec, di, ftol, func, fdata) # Record bigest function decrease, and dimension it occured on if abs(lretv - retv) > del_: del_ = abs(lretv - retv) ibig = i #if ABSTOL: #stopth = ftol # Absolute tollerance #else stopth = ftol * 0.5 * (abs(pretv) + abs(retv) + DBL_EPSILON) curdel = abs(pretv - retv) if startdel < 0.0: startdel = curdel elif curdel > 0 and startdel > 0: tt = (100.0 * math.pow((math.log(curdel) - math.log(startdel)) / (math.log(stopth) - math.log(startdel)), 4.0) + 0.5) if tt > pc and tt < 100: pc = tt if prog: # Report initial progress prog(pdata, pc) # If we have had at least one change of direction and # reached a suitable tollerance, then finish if iter > 1 and curdel <= stopth: logging.debug("Reached stop tollerance because curdel %f <= stopth " "%f" % (curdel, stopth)) break logging.debug("Not stopping because curdel %f > stopth %f" % (curdel, stopth)) for i in xrange(di): svec[i] = cp[i] - spt[i] # Average direction moved after minimization round xpt[i] = cp[i] + svec[i] # Extrapolated point after round of minimization spt[i] = cp[i] # New start point for next round # Function value at extrapolated point lretv = func(fdata, xpt) if lretv < pretv: # If extrapolation is an improvement t1 = pretv - retv - del_ t2 = pretv - lretv t = 2.0 * (pretv -2.0 * retv + lretv) * t1 * t1 - del_ * t2 * t2 if t < 0.0: # Move to the minimum of the new direction retv = linmin(cp, svec, di, ftol, func, fdata) for i in xrange(di): # Save the new direction dmtx[i][ibig] = svec[i] # by replacing best previous if prog: # Report final progress prog(pdata, 100) if iter < maxit: return True logging.debug("powell: returning False due to excessive iterations") return False # Failed due to execessive iterations def xicc_tech_gamma(egamma, off, outoffset=0.0): # Adapted from ArgyllCMS xicc.c """ Given the effective gamma and the output offset Y, return the technical gamma needed for the correct 50% response. """ gf = gam_fits() op = {} sa = {} if off <= 0.0: return egamma # We set up targets without outo being added outo = off * outoffset # Offset acounted for in output gf.bp = off - outo # Black value for 0 % input gf.wp = 1.0 - outo # White value for 100% input gf.thyr = math.pow(0.5, egamma) - outo # Advetised 50% target op[0] = egamma sa[0] = 0.1 if not powell(1, op, sa, 1e-6, 500, gam_fit, gf): logging.warn("Computing effective gamma and input offset is inaccurate") return op[0] class gam_fits(object): # Adapted from ArgyllCMS xicc/xicc.c def __init__(self, wp=1.0, thyr=.2, bp=0.0): self.wp = wp # 100% input target self.thyr = thyr # 50% input target self.bp = bp # 0% input target class Interp(object): def __init__(self, xp, fp, left=None, right=None): self.xp = xp self.fp = fp self.left = left self.right = right self.lookup = {} def __call__(self, x): if not x in self.lookup: self.lookup[x] = interp(x, self.xp, self.fp, self.left, self.right) return self.lookup[x] class BT1886(object): # Adapted from ArgyllCMS xicc/xicc.c """ BT.1886 like transfer function """ def __init__(self, matrix, XYZbp, outoffset=0.0, gamma=2.4, apply_trc=True): """ Setup BT.1886 for the given target If apply_trc is False, apply only the black point blending portion of BT.1886 mapping. Note that this will only work correctly for an output offset of 1.0 """ if not apply_trc and outoffset < 1: raise ValueError("Output offset must be 1.0 when not applying gamma") self.bwd_matrix = matrix.inverted() self.fwd_matrix = matrix self.gamma = gamma Lab = XYZ2Lab(*[v * 100 for v in XYZbp]) # For bp blend self.outL = Lab[0] # a* b* correction needed self.tab = list(Lab) self.tab[0] = 0 # 0 because bt1886 maps L to target if XYZbp[1] < 0: XYZbp = list(XYZbp) XYZbp[1] = 0.0 # Offset acounted for in output self.outo = XYZbp[1] * outoffset # Balance of offset accounted for in input ino = XYZbp[1] - self.outo # Input offset black to 1/pow bkipow = math.pow(ino, 1.0 / self.gamma) # Input offset white to 1/pow wtipow = math.pow(1.0 - self.outo, 1.0 / self.gamma) # non-linear Y that makes input offset proportion of black point self.ingo = bkipow / (wtipow - bkipow) # Scale to make input of 1 map to 1.0 - self.outo self.outsc = pow(wtipow - bkipow, self.gamma) self.apply_trc = apply_trc def apply(self, X, Y, Z): """ Apply BT.1886 black offset and gamma curve to the XYZ out of the input profile. Do this in the colorspace defined by the input profile matrix lookup, so it will be relative XYZ. We assume that BT.1886 does a Rec709 to gamma viewing adjustment, on top of any source profile transfer curve (i.e. BT.1886 viewing adjustment is assumed to be the mismatch between Rec709 curve and the output offset pure 2.4 gamma curve) """ logging.debug("bt1886 XYZ in %f %f %f" % (X, Y, Z)) out = self.bwd_matrix * (X, Y, Z) logging.debug("bt1886 RGB in %f %f %f" % (out[0], out[1], out[2])) for j in xrange(3): vv = out[j] if self.apply_trc: # Convert linear light to Rec709 transfer curve if vv < 0.018: vv = 4.5 * vv else: vv = 1.099 * math.pow(vv, 0.45) - 0.099 # Apply input offset vv = vv + self.ingo # Apply power and scale if vv > 0.0: if self.apply_trc: vv = self.outsc * math.pow(vv, self.gamma) else: vv *= self.outsc # Apply output portion of offset vv += self.outo out[j] = vv out = self.fwd_matrix * out logging.debug("bt1886 RGB bt.1886 %f %f %f" % (out[0], out[1], out[2])) out = list(XYZ2Lab(*[v * 100 for v in out])) logging.debug("bt1886 Lab after Y adj. %f %f %f" % (out[0], out[1], out[2])) # Blend ab to required black point offset self.tab[] as L approaches black. vv = (out[0] - self.outL) / (100.0 - self.outL) # 0 at bp, 1 at wp vv = 1.0 - vv if vv < 0.0: vv = 0.0 elif vv > 1.0: vv = 1.0 vv = math.pow(vv, 40.0) out[0] += vv * self.tab[0] out[1] += vv * self.tab[1] out[2] += vv * self.tab[2] logging.debug("bt1886 Lab after wp adj. %f %f %f" % (out[0], out[1], out[2])) out = Lab2XYZ(*out) logging.debug("bt1886 XYZ out %f %f %f" % (out[0], out[1], out[2])) return out class Matrix3x3(list): """ Simple 3x3 matrix """ def __init__(self, matrix=None): if matrix: self.update(matrix) def update(self, matrix): if len(matrix) != 3: raise ValueError('Invalid number of rows for 3x3 matrix: %i' % len(matrix)) while len(self): self.pop() for row in matrix: if len(row) != 3: raise ValueError('Invalid number of columns for 3x3 matrix: %i' % len(row)) self.append([]) for column in row: self[-1].append(column) def __add__(self, matrix): instance = self.__class__() instance.update([[self[0][0] + matrix[0][0], self[0][1] + matrix[0][1], self[0][2] + matrix[0][2]], [self[1][0] + matrix[1][0], self[1][1] + matrix[1][1], self[1][2] + matrix[1][2]], [self[2][0] + matrix[2][0], self[2][1] + matrix[2][1], self[2][2] + matrix[2][2]]]) return instance def __iadd__(self, matrix): # inplace self.update(self.__add__(matrix)) return self def __imul__(self, matrix): # inplace self.update(self.__mul__(matrix)) return self def __mul__(self, matrix): if not isinstance(matrix[0], (list, tuple)): return [matrix[0] * self[0][0] + matrix[1] * self[0][1] + matrix[2] * self[0][2], matrix[0] * self[1][0] + matrix[1] * self[1][1] + matrix[2] * self[1][2], matrix[0] * self[2][0] + matrix[1] * self[2][1] + matrix[2] * self[2][2]] instance = self.__class__() instance.update([[self[0][0]*matrix[0][0] + self[0][1]*matrix[1][0] + self[0][2]*matrix[2][0], self[0][0]*matrix[0][1] + self[0][1]*matrix[1][1] + self[0][2]*matrix[2][1], self[0][0]*matrix[0][2] + self[0][1]*matrix[1][2] + self[0][2]*matrix[2][2]], [self[1][0]*matrix[0][0] + self[1][1]*matrix[1][0] + self[1][2]*matrix[2][0], self[1][0]*matrix[0][1] + self[1][1]*matrix[1][1] + self[1][2]*matrix[2][1], self[1][0]*matrix[0][2] + self[1][1]*matrix[1][2] + self[1][2]*matrix[2][2]], [self[2][0]*matrix[0][0] + self[2][1]*matrix[1][0] + self[2][2]*matrix[2][0], self[2][0]*matrix[0][1] + self[2][1]*matrix[1][1] + self[2][2]*matrix[2][1], self[2][0]*matrix[0][2] + self[2][1]*matrix[1][2] + self[2][2]*matrix[2][2]]]) return instance def adjoint(self): return self.cofactors().transposed() def cofactors(self): instance = self.__class__() instance.update([[(self[1][1]*self[2][2] - self[1][2]*self[2][1]), -1 * (self[1][0]*self[2][2] - self[1][2]*self[2][0]), (self[1][0]*self[2][1] - self[1][1]*self[2][0])], [-1 * (self[0][1]*self[2][2] - self[0][2]*self[2][1]), (self[0][0]*self[2][2] - self[0][2]*self[2][0]), -1 * (self[0][0]*self[2][1] -self[0][1]*self[2][0])], [(self[0][1]*self[1][2] - self[0][2]*self[1][1]), -1 * (self[0][0]*self[1][2] - self[1][0]*self[0][2]), (self[0][0]*self[1][1] - self[0][1]*self[1][0])]]) return instance def determinant(self): return ((self[0][0]*self[1][1]*self[2][2] + self[1][0]*self[2][1]*self[0][2] + self[0][1]*self[1][2]*self[2][0]) - (self[2][0]*self[1][1]*self[0][2] + self[1][0]*self[0][1]*self[2][2] + self[2][1]*self[1][2]*self[0][0])) def invert(self): # inplace self.update(self.inverted()) def inverted(self): determinant = self.determinant() matrix = self.adjoint() instance = self.__class__() instance.update([[matrix[0][0] / determinant, matrix[0][1] / determinant, matrix[0][2] / determinant], [matrix[1][0] / determinant, matrix[1][1] / determinant, matrix[1][2] / determinant], [matrix[2][0] / determinant, matrix[2][1] / determinant, matrix[2][2] / determinant]]) return instance def rounded(self, digits=3): matrix = self.__class__() for row in self: matrix.append([]) for column in row: matrix[-1].append(round(column, digits)) return matrix def transpose(self): self.update(self.transposed()) def transposed(self): instance = self.__class__() instance.update([[self[0][0], self[1][0], self[2][0]], [self[0][1], self[1][1], self[2][1]], [self[0][2], self[1][2], self[2][2]]]) return instance class NumberTuple(tuple): def __repr__(self): return "(%s)" % ", ".join(str(value) for value in self) def round(self, digits=4): return self.__class__(round(value, digits) for value in self) # Chromatic adaption transform matrices # Bradford, von Kries (= HPE normalized to D65) from http://brucelindbloom.com/Eqn_ChromAdapt.html # CAT02 from http://en.wikipedia.org/wiki/CIECAM02#CAT02 # HPE normalized to illuminant E, CAT97s from http://en.wikipedia.org/wiki/LMS_color_space#CAT97s # CMCCAT97 from 'Performance Of Five Chromatic Adaptation Transforms Using # Large Number Of Color Patches', http://hrcak.srce.hr/file/95370 # CMCCAT2000, Sharp from 'Computational colour science using MATLAB' # ISBN 0470845627, http://books.google.com/books?isbn=0470845627 # Cross-verification of the matrix numbers has been done using various sources, # most notably 'Chromatic Adaptation Performance of Different RGB Sensors' # http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.14.918&rep=rep1&type=pdf cat_matrices = {"Bradford": Matrix3x3([[ 0.89510, 0.26640, -0.16140], [-0.75020, 1.71350, 0.03670], [ 0.03890, -0.06850, 1.02960]]), "CAT02": Matrix3x3([[ 0.7328, 0.4296, -0.1624], [-0.7036, 1.6975, 0.0061], [ 0.0030, 0.0136, 0.9834]]), "CAT97s": Matrix3x3([[ 0.8562, 0.3372, -0.1934], [-0.8360, 1.8327, 0.0033], [ 0.0357, -0.0469, 1.0112]]), "CMCCAT97": Matrix3x3([[ 0.8951, -0.7502, 0.0389], [ 0.2664, 1.7135, 0.0685], [-0.1614, 0.0367, 1.0296]]), "CMCCAT2000": Matrix3x3([[ 0.7982, 0.3389, -0.1371], [-0.5918, 1.5512, 0.0406], [ 0.0008, 0.0239, 0.9753]]), # Hunt-Pointer-Estevez, equal-energy illuminant "HPE normalized to illuminant E": Matrix3x3([[ 0.38971, 0.68898, -0.07868], [-0.22981, 1.18340, 0.04641], [ 0.00000, 0.00000, 1.00000]]), # Süsstrunk et al.15 optimized spectrally sharpened matrix "Sharp": Matrix3x3([[ 1.2694, -0.0988, -0.1706], [-0.8364, 1.8006, 0.0357], [ 0.0297, -0.0315, 1.0018]]), # 'Von Kries' as found on Bruce Lindbloom's site: # Hunt-Pointer-Estevez normalized to D65 # (maybe I should call it that instead of 'Von Kries' # to avoid ambiguity?) "HPE normalized to illuminant D65": Matrix3x3([[ 0.40024, 0.70760, -0.08081], [-0.22630, 1.16532, 0.04570], [ 0.00000, 0.00000, 0.91822]]), "XYZ scaling": Matrix3x3([[1, 0, 0], [0, 1, 0], [0, 0, 1]])} def test(): for i in range(4): if i == 0: wp = "native" elif i == 1: wp = "D50" XYZ = get_standard_illuminant(wp) elif i == 2: wp = "D65" XYZ = get_standard_illuminant(wp) elif i == 3: XYZ = get_standard_illuminant("D65", ("ASTM E308-01", )) wp = " ".join([str(v) for v in XYZ]) print ("RGB and corresponding XYZ (nominal range 0.0 - 1.0) with " "whitepoint %s" % wp) for name in rgb_spaces: spc = rgb_spaces[name] if i == 0: XYZ = CIEDCCT2XYZ(spc[1]) spc = spc[0], XYZ, spc[2], spc[3], spc[4] print "%s 1.0, 1.0, 1.0 = XYZ" % name, \ [str(round(v, 4)) for v in RGB2XYZ(1.0, 1.0, 1.0, spc)] print "%s 1.0, 0.0, 0.0 = XYZ" % name, \ [str(round(v, 4)) for v in RGB2XYZ(1.0, 0.0, 0.0, spc)] print "%s 0.0, 1.0, 0.0 = XYZ" % name, \ [str(round(v, 4)) for v in RGB2XYZ(0.0, 1.0, 0.0, spc)] print "%s 0.0, 0.0, 1.0 = XYZ" % name, \ [str(round(v, 4)) for v in RGB2XYZ(0.0, 0.0, 1.0, spc)] print "" if __name__ == '__main__': test()DisplayCAL-3.1.0.0/DisplayCAL/config.py0000644000076500000000000015221112653526636017256 0ustar devwheel00000000000000# -*- coding: utf-8 -*- """ Runtime configuration and user settings parser """ import ConfigParser ConfigParser.DEFAULTSECT = "Default" from decimal import Decimal import locale import math import os import re import string import sys from time import gmtime, strftime, timezone if sys.platform == "win32": import _winreg from argyll_names import observers, viewconds, intents, video_encodings from defaultpaths import appdata, commonappdata if sys.platform == "win32": from defaultpaths import commonprogramfiles elif sys.platform == "darwin": from defaultpaths import library, library_home, prefs, prefs_home else: from defaultpaths import (xdg_config_dir_default, xdg_config_home, xdg_data_home, xdg_data_home_default, xdg_data_dirs) from defaultpaths import (autostart, autostart_home, iccprofiles, iccprofiles_home) from meta import name as appname, build, lastmod, version from options import ascii, debug, verbose from safe_print import enc, fs_enc, original_codepage from util_io import StringIOu as StringIO from util_os import (expanduseru, expandvarsu, getenvu, is_superuser, listdir_re, which) from util_str import create_replace_function, safe_unicode, strtr import encodedstdio # Runtime configuration if ascii: enc = "ASCII" exe = unicode(sys.executable, fs_enc) exedir = os.path.dirname(exe) exename = os.path.basename(exe) isexe = sys.platform != "darwin" and getattr(sys, "frozen", False) if isexe and os.getenv("_MEIPASS2"): os.environ["_MEIPASS2"] = os.getenv("_MEIPASS2").replace("/", os.path.sep) pyfile = (exe if isexe else (os.path.isfile(sys.argv[0]) and sys.argv[0]) or os.path.join(os.path.dirname(__file__), "main.py")) pypath = exe if isexe else os.path.abspath(unicode(pyfile, fs_enc)) # Mac OS X: isapp should only be true for standalone, not 0install isapp = sys.platform == "darwin" and \ exe.split(os.path.sep)[-3:-1] == ["Contents", "MacOS"] and \ os.path.exists(os.path.join(exedir, "..", "Resources", "xrc")) if isapp: pyname, pyext = os.path.splitext(exe.split(os.path.sep)[-4]) pydir = os.path.normpath(os.path.join(exedir, "..", "Resources")) else: pyname, pyext = os.path.splitext(os.path.basename(pypath)) pydir = os.path.dirname(exe if isexe else os.path.abspath(unicode(__file__, fs_enc))) data_dirs = [pydir] extra_data_dirs = [] # Search directories on PATH for data directories so Argyll reference files # can be found automatically if Argyll directory not explicitly configured for dir_ in getenvu("PATH", "").split(os.pathsep): dir_parent = os.path.dirname(dir_) if os.path.isdir(os.path.join(dir_parent, "ref")): extra_data_dirs.append(dir_parent) appbasename = appname # If old user data directory exists, use its basename if os.path.isdir(os.path.join(appdata, "dispcalGUI")): appbasename = "dispcalGUI" data_dirs.append(os.path.join(appdata, appname)) datahome = os.path.join(appdata, appbasename) if sys.platform == "win32": if pydir.lower().startswith(exedir.lower()) and pydir != exedir: # We are installed in a subfolder of the executable directory (e.g. # C:\Python26\Lib\site-packages\DisplayCAL) - we nee to add # the executable directory to the data directories so files in # subfolders of the executable directory which are not in # Lib\site-packages\DisplayCAL can be found # (e.g. Scripts\displaycal-apply-profiles) data_dirs.append(exedir) script_ext = ".cmd" scale_adjustment_factor = 1.0 config_sys = os.path.join(commonappdata[0], appbasename) confighome = os.path.join(appdata, appbasename) logdir = os.path.join(datahome, "logs") if appbasename != appname: data_dirs.extend(os.path.join(dir_, appname) for dir_ in commonappdata) data_dirs.append(os.path.join(commonprogramfiles, appname)) data_dirs.append(datahome) data_dirs.extend(os.path.join(dir_, appbasename) for dir_ in commonappdata) data_dirs.append(os.path.join(commonprogramfiles, appbasename)) exe_ext = ".exe" profile_ext = ".icm" else: if sys.platform == "darwin": script_ext = ".command" mac_create_app = True scale_adjustment_factor = 1.0 config_sys = os.path.join(prefs, appbasename) confighome = os.path.join(prefs_home, appbasename) logdir = os.path.join(expanduseru("~"), "Library", "Logs", appbasename) if appbasename != appname: data_dirs.append(os.path.join(commonappdata[0], appname)) data_dirs.append(datahome) data_dirs.append(os.path.join(commonappdata[0], appbasename)) else: script_ext = ".sh" scale_adjustment_factor = 1.0 config_sys = os.path.join(xdg_config_dir_default, appbasename) confighome = os.path.join(xdg_config_home, appbasename) logdir = os.path.join(datahome, "logs") if appbasename != appname: datahome_default = os.path.join(xdg_data_home_default, appname) if not datahome_default in data_dirs: data_dirs.append(datahome_default) data_dirs.extend(os.path.join(dir_, appname) for dir_ in xdg_data_dirs) data_dirs.append(datahome) datahome_default = os.path.join(xdg_data_home_default, appbasename) if not datahome_default in data_dirs: data_dirs.append(datahome_default) data_dirs.extend(os.path.join(dir_, appbasename) for dir_ in xdg_data_dirs) extra_data_dirs.extend(os.path.join(dir_, "argyllcms") for dir_ in xdg_data_dirs) extra_data_dirs.extend(os.path.join(dir_, "color", "argyll") for dir_ in xdg_data_dirs) exe_ext = "" profile_ext = ".icc" storage = os.path.join(datahome, "storage") resfiles = [ # Only essentials "argyll_instruments.json", "lang/en.json", "beep.wav", "camera_shutter.wav", "linear.cal", "test.cal", "ref/ClayRGB1998.gam", "ref/sRGB.gam", "ref/verify_extended.ti1", "ti1/d3-e4-s0-g25-m3-b3-f0-crossover.ti1", "ti1/d3-e4-s0-g49-m3-b3-f0-crossover.ti1", "ti1/d3-e4-s13-g37-m4-b4-f0.ti1", "ti1/d3-e4-s17-g49-m5-b5-f0.ti1", "xrc/extra.xrc", "xrc/gamap.xrc", "xrc/main.xrc", "xrc/mainmenu.xrc", "xrc/report.xrc", "xrc/synthicc.xrc" ] bitmaps = {} # Does the device not support iterative calibration? uncalibratable_displays = ("Untethered$", ) # Can the device generate patterns of its own? patterngenerators = ("madVR$", "Resolve$", "Chromecast ", "Prisma ", "Prisma$") non_argyll_displays = uncalibratable_displays + ("Resolve$", ) # Is the device directly connected or e.g. driven via network? # (note that madVR can technically be both, but the endpoint is always directly # connected to a display so we have videoLUT access via madVR's API. Only # devices which don't support that are considered 'untethered' in this context) untethered_displays = non_argyll_displays + ("Web$", "Chromecast ", "Prisma ", "Prisma$") # Is the device not an actual display device (i.e. is it not a TV or monitor)? virtual_displays = untethered_displays + ("madVR$", ) def is_special_display(display_no=None, tests=virtual_displays): display_name = get_display_name(display_no) for test in tests: if re.match(test, display_name): return True return False def is_uncalibratable_display(display_no=None): return is_special_display(display_no, uncalibratable_displays) def is_patterngenerator(display_no=None): return is_special_display(display_no, patterngenerators) def is_non_argyll_display(display_no=None): return is_special_display(display_no, non_argyll_displays) def is_untethered_display(display_no=None): return is_special_display(display_no, untethered_displays) def is_virtual_display(display_no=None): return is_special_display(display_no, virtual_displays) def check_3dlut_format(devicename): if get_display_name(None, True) == devicename: if devicename == "Prisma": return (getcfg("3dlut.format") == "3dl" and getcfg("3dlut.size") == 17 and getcfg("3dlut.bitdepth.input") == 10 and getcfg("3dlut.bitdepth.output") == 12) def getbitmap(name, display_missing_icon=True, scale=True): """ Create (if necessary) and return a named bitmap. name has to be a relative path to a png file, omitting the extension, e.g. 'theme/mybitmap' or 'theme/icons/16x16/myicon', which is searched for in the data directories. If a matching file is not found, a placeholder bitmap is returned. The special name 'empty' will always return a transparent bitmap of the given size, e.g. '16x16/empty' or just 'empty' (size defaults to 16x16 if not given). """ from wxaddons import wx if not name in bitmaps: parts = name.split("/") w = 16 h = 16 size = [] if len(parts) > 1: size = parts[-2].split("x") if len(size) == 2: try: w, h = map(int, size) except ValueError: size = [] ow, oh = w, h set_default_app_dpi() if scale: scale = getcfg("app.dpi") / get_default_dpi() else: scale = 1 if scale > 1: # HighDPI support w = int(round(w * scale)) h = int(round(h * scale)) if parts[-1] == "empty": bitmaps[name] = wx.EmptyBitmap(w, h, depth=-1) dc = wx.MemoryDC() dc.SelectObject(bitmaps[name]) dc.SetBackground(wx.Brush("black")) dc.Clear() dc.SelectObject(wx.NullBitmap) bitmaps[name].SetMaskColour("black") else: if parts[-1].startswith(appname): parts[-1] = parts[-1].lower() oname = parts[-1] name2x = oname + "@2x" name4x = oname + "@4x" path = None for i in xrange(5): if scale > 1: if len(size) == 2: # Icon if i == 0: # HighDPI support. Try scaled size parts[-2] = "%ix%i" % (w, h) elif i == 1: if scale < 1.75 or scale == 2: continue # HighDPI support. Try @4x version parts[-2] = "%ix%i" % (ow, oh) parts[-1] = name4x elif i == 2: # HighDPI support. Try @2x version parts[-2] = "%ix%i" % (ow, oh) parts[-1] = name2x elif i == 3: # HighDPI support. Try original size times two parts[-2] = "%ix%i" % (ow * 2, oh * 2) parts[-1] = oname else: # Try original size parts[-2] = "%ix%i" % (ow, oh) else: # Theme graphic if i in (0, 3): continue elif i == 1: if scale < 1.75 or scale == 2: continue # HighDPI support. Try @4x version parts[-1] = name4x elif i == 2: # HighDPI support. Try @2x version parts[-1] = name2x else: # Try original size parts[-1] = oname if (sys.platform not in ("darwin", "win32") and parts[-1].startswith(appname)): # Search /usr/share/icons on Linux first path = get_data_path(os.path.join(parts[-2], "apps", parts[-1]) + ".png") if not path: path = get_data_path(os.path.sep.join(parts) + ".png") if path or scale == 1: break if path: bitmaps[name] = wx.Bitmap(path) if scale > 1 and i: rescale = False if i in (1, 2): # HighDPI support. 4x/2x version, determine scaled size w, h = [int(round(v / (2 * (3 - i)) * scale)) for v in bitmaps[name].Size] rescale = True elif len(size) == 2: # HighDPI support. Icon rescale = True if rescale and (bitmaps[name].Size[0] != w or bitmaps[name].Size[1] != h): # HighDPI support. Rescale img = bitmaps[name].ConvertToImage() if not hasattr(wx, "IMAGE_QUALITY_BILINEAR"): quality = wx.IMAGE_QUALITY_NORMAL elif oname == "rgbsquares": # Hmm. Everything else looks great with bicubic, # but this one gets jaggy unless we use bilinear quality = wx.IMAGE_QUALITY_BILINEAR elif scale < 1.5 or i == 1: quality = wx.IMAGE_QUALITY_BICUBIC else: quality = wx.IMAGE_QUALITY_BILINEAR img.Rescale(w, h, quality=quality) bitmaps[name] = img.ConvertToBitmap() else: img = wx.EmptyImage(w, h) img.SetMaskColour(0, 0, 0) img.InitAlpha() bmp = img.ConvertToBitmap() bitmaps[name] = bmp dc = wx.MemoryDC() dc.SelectObject(bitmaps[name]) if display_missing_icon: bmp = wx.ArtProvider.GetBitmap(wx.ART_MISSING_IMAGE, size=(w, h)) dc.DrawBitmap(bmp, 0, 0, True) dc.SelectObject(wx.NullBitmap) return bitmaps[name] def get_bitmap_as_icon(size, name, scale=True): """ Like geticon, but return a wx.Icon instance """ from wxaddons import wx icon = wx.EmptyIcon() if sys.platform == "darwin" and wx.VERSION >= (2, 9) and size > 128: # FIXME: wxMac 2.9 doesn't support icon sizes above 128 size = 128 bmp = geticon(size, name, scale) icon.CopyFromBitmap(bmp) return icon def get_argyll_data_dir(): if getcfg("argyll.version") < "1.5.0": argyll_data_dirname = "color" else: argyll_data_dirname = "ArgyllCMS" if sys.platform == "darwin" and getcfg("argyll.version") < "1.5.0": return os.path.join(library if is_superuser() else library_home, argyll_data_dirname) else: return os.path.join(commonappdata[0] if is_superuser() else appdata, argyll_data_dirname) def get_display_name(n=None, include_geometry=False): """ Return name of currently configured display """ if n is None: n = getcfg("display.number") - 1 displays = getcfg("displays") if n >= 0 and n < len(displays): if include_geometry: return displays[n] else: return split_display_name(displays[n]) return "" def split_display_name(display): """ Split and return name part of display E.g. 'LCD2690WUXi @ 0, 0, 1920x1200' -> 'LCD2690WUXi' 'madVR' -> 'madVR' """ if "@" in display and not display.startswith("Chromecast "): display = "@".join(display.split("@")[:-1]) return display.strip() def get_argyll_display_number(geometry): """ Translate from wx display geometry to Argyll display index """ geometry = "%i, %i, %ix%i" % tuple(geometry) for i, display in enumerate(getcfg("displays")): if display.find("@ " + geometry) > -1: if debug: from log import safe_print safe_print("[D] Found display %s at index %i" % (geometry, i)) return i def get_display_number(display_no): """ Translate from Argyll display index to wx display index """ if is_virtual_display(display_no): return 0 from wxaddons import wx try: display = getcfg("displays")[display_no] except IndexError: return 0 else: for i in xrange(wx.Display.GetCount()): geometry = "%i, %i, %ix%i" % tuple(wx.Display(i).Geometry) if display.find("@ " + geometry) > -1: if debug: from log import safe_print safe_print("[D] Found display %s at index %i" % (geometry, i)) return i return 0 def get_display_rects(): """ Return the Argyll enumerated display coordinates and sizes """ from wxaddons import wx display_rects = [] for i, display in enumerate(getcfg("displays")): match = re.search("@ (-?\d+), (-?\d+), (\d+)x(\d+)", display) if match: display_rects.append(wx.Rect(*[int(item) for item in match.groups()])) return display_rects def get_icon_bundle(sizes, name): """ Return a wx.IconBundle with given icon sizes """ from wxaddons import wx iconbundle = wx.IconBundle() for size in sizes: iconbundle.AddIcon(get_bitmap_as_icon(size, name, False)) return iconbundle def get_instrument_name(): """ Return name of currently configured instrument """ n = getcfg("comport.number") - 1 instrument_names = getcfg("instruments") if n >= 0 and n < len(instrument_names): return instrument_names[n] return "" def get_measureframe_dimensions(dimensions_measureframe=None, percent=10): """ return measurement area size adjusted for percentage of screen area """ if not dimensions_measureframe: dimensions_measureframe = getcfg("dimensions.measureframe") dimensions_measureframe = [float(n) for n in dimensions_measureframe.split(",")] dimensions_measureframe[2] *= defaults["size.measureframe"] dimensions_measureframe[2] /= get_display_rects()[0][2] dimensions_measureframe[2] *= percent return ",".join([str(min(n, 50)) for n in dimensions_measureframe]) def geticon(size, name, scale=True): """ Convenience function for getbitmap('theme/icons//'). """ return getbitmap("theme/icons/%(size)sx%(size)s/%(name)s" % {"size": size, "name": name}, scale=scale) def get_data_path(relpath, rex=None): """ Search data_dirs for relpath and return the path or a file list. If relpath is a file, return the full path, if relpath is a directory, return a list of files in the intersection of searched directories. """ if (not relpath or relpath.endswith(os.path.sep) or (isinstance(os.path.altsep, basestring) and relpath.endswith(os.path.altsep))): return None dirs = list(data_dirs) argyll_dir = (getcfg("argyll.dir") or os.path.dirname(os.path.realpath(which("dispcal") or ""))) if argyll_dir and os.path.isdir(os.path.join(argyll_dir, "..", "ref")): dirs.append(os.path.dirname(argyll_dir)) dirs.extend(extra_data_dirs) intersection = [] paths = [] for dir_ in dirs: curpath = os.path.join(dir_, relpath) if (dir_.endswith("/argyll") and (relpath + "/").startswith("ref/") and not os.path.exists(curpath)): # Work-around distribution-specific differences for location # of Argyll reference files # Fedora and Ubuntu: /usr/share/color/argyll/ref # openSUSE: /usr/share/color/argyll pth = relpath.split("/", 1)[-1] if pth != "ref": curpath = os.path.join(dir_, pth) else: curpath = dir_ if os.path.exists(curpath): curpath = os.path.normpath(curpath) if os.path.isdir(curpath): try: filelist = listdir_re(curpath, rex) except Exception, exception: from log import safe_print safe_print(u"Error - directory '%s' listing failed: %s" % tuple(safe_unicode(s) for s in (curpath, exception))) else: for filename in filelist: if not filename in intersection: intersection.append(filename) paths.append(os.path.join(curpath, filename)) else: return curpath if paths: paths.sort(key=lambda path: os.path.basename(path).lower()) return None if len(paths) == 0 else paths def get_default_dpi(): if sys.platform == "darwin": return 72.0 else: return 96.0 def runtimeconfig(pyfile): """ Configure remaining runtime options and return runtype. You need to pass in a path to the calling script (e.g. use the __file__ attribute). """ from log import setup_logging setup_logging(logdir, pyname, pyext) if debug or verbose >= 1: from log import safe_print if debug: safe_print("[D] pydir:", pydir) if isapp: runtype = ".app" elif isexe: if debug: safe_print("[D] _MEIPASS2 or pydir:", getenvu("_MEIPASS2", exedir)) if getenvu("_MEIPASS2", exedir) not in data_dirs: data_dirs.insert(1, getenvu("_MEIPASS2", exedir)) runtype = exe_ext else: pydir_parent = os.path.dirname(pydir) if debug: safe_print("[D] dirname(os.path.abspath(sys.argv[0])):", os.path.dirname(os.path.abspath(sys.argv[0]))) safe_print("[D] pydir parent:", pydir_parent) if (os.path.dirname(os.path.abspath(sys.argv[0])).decode(fs_enc) == pydir_parent and pydir_parent not in data_dirs): # Add the parent directory of the package directory to our list # of data directories if it is the directory containing the # currently run script (e.g. when running from source) data_dirs.insert(1, pydir_parent) runtype = pyext for dir_ in sys.path: if not isinstance(dir_, unicode): dir_ = unicode(dir_, fs_enc) dir_ = os.path.abspath(os.path.join(dir_, appname)) if dir_ not in data_dirs and os.path.isdir(dir_): data_dirs.append(dir_) if debug: safe_print("[D] from sys.path:", dir_) if sys.platform not in ("darwin", "win32"): data_dirs.extend([os.path.join(dir_, "doc", appname + "-" + version) for dir_ in xdg_data_dirs + [xdg_data_home]]) data_dirs.extend([os.path.join(dir_, "doc", "packages", appname) for dir_ in xdg_data_dirs + [xdg_data_home]]) data_dirs.extend([os.path.join(dir_, "doc", appname) for dir_ in xdg_data_dirs + [xdg_data_home]]) data_dirs.extend([os.path.join(dir_, "doc", appname.lower()) # Debian for dir_ in xdg_data_dirs + [xdg_data_home]]) data_dirs.extend([os.path.join(dir_, "icons", "hicolor") for dir_ in xdg_data_dirs + [xdg_data_home]]) if debug: safe_print("[D] Data files search paths:\n[D]", "\n[D] ".join(data_dirs)) defaults["calibration.file"] = get_data_path("presets/default.icc") or "" defaults["measurement_report.chart"] = get_data_path(os.path.join("ref", "verify_extended.ti1")) or "" return runtype # User settings cfg = ConfigParser.RawConfigParser() cfg.optionxform = str valid_ranges = { "3dlut.trc_gamma": [0.000001, 10], "3dlut.trc_output_offset": [0.0, 1.0], "app.port": [1, 65535], "gamma": [0.000001, 10], "trc": [0.000001, 10], "calibration.ambient_viewcond_adjust.lux": [0, sys.maxint], "calibration.black_luminance": [0.000001, 100000], "calibration.black_output_offset": [0, 1], "calibration.black_point_correction": [0, 1], "calibration.black_point_rate": [0.05, 20], "calibration.luminance": [0.000001, 100000], "iccgamut.surface_detail": [1.0, 50.0], "measurement_report.trc_gamma": [0.01, 10], "measurement_report.trc_output_offset": [0.0, 1.0], "measure.display_settle_time_mult": [0.000001, 10000.0], "measure.min_display_update_delay_ms": [20, 60000], "patterngenerator.apl": [0.0, 1.0], "patterngenerator.resolve.port": [1, 65535], "synthprofile.trc_gamma": [0.01, 10], "synthprofile.trc_output_offset": [0.0, 1.0], "tc_export_repeat_patch_max": [1, 1000], "tc_export_repeat_patch_min": [1, 1000], "tc_vrml_black_offset": [0, 40], "webserver.portnumber": [1, 65535], "whitepoint.colortemp": [1000, 15000], } valid_values = { "3d.format": ["HTML", "VRML", "X3D"], "3dlut.bitdepth.input": [8, 10, 12, 14, 16], "3dlut.bitdepth.output": [8, 10, 12, 14, 16], "3dlut.encoding.input": list(video_encodings), # collink: xvYCC output encoding is not supported "3dlut.encoding.output": filter(lambda v: v not in ("T", "x", "X"), video_encodings), "3dlut.format": ["3dl", "cube", "eeColor", "madVR", "mga", "png", "ReShade", "spi3d"], "3dlut.image.layout": ["h", "v"], "3dlut.image.order": ["rgb", "bgr"], "3dlut.rendering_intent": intents, "3dlut.size": [16, 17, 24, 32, 33, 64, 65], "3dlut.trc_gamma_type": ["b", "B"], "calibration.quality": ["v", "l", "m", "h", "u"], "colorimeter_correction.observer": observers, "colorimeter_correction.observer.reference": observers, "colorimeter_correction.type": ["matrix", "spectral"], # Measurement modes as supported by Argyll -y parameter # 'l' = 'n' (non-refresh-type display, e.g. LCD) # 'c' = 'r' (refresh-type display, e.g. CRT) # We map 'l' and 'c' to "n" and "r" in # worker.Worker.add_measurement_features if using Argyll >= 1.5 # See http://www.argyllcms.com/doc/instruments.html # for description of per-instrument supported modes "measurement_mode": [None, "auto"] + list(string.digits[1:] + string.ascii_letters), "gamap_default_intent": ["a", "r", "p", "s"], "gamap_perceptual_intent": intents, "gamap_saturation_intent": intents, "gamap_src_viewcond": viewconds, "gamap_out_viewcond": ["mt", "mb", "md", "jm", "jd"], "measurement_report.trc_gamma_type": ["b", "B"], "observer": observers, "patterngenerator.prisma.preset": ["Movie", "Sports", "Game", "Animation", "PC/Mac", "Black+White", "Custom-1", "Custom-2"], "patterngenerator.resolve.use_video_levels": [0, 1], "profile.black_point_compensation": [0, 1], "profile.install_scope": ["l", "u"], "profile.quality": ["l", "m", "h", "u"], "profile.quality.b2a": ["l", "m", "h", "u", "n", None], "profile.b2a.hires.size": [-1, 9, 17, 33, 45, 65], "profile.type": ["g", "G", "l", "s", "S", "x", "X"], "synthprofile.black_point_compensation": [0, 1], "synthprofile.trc_gamma_type": ["g", "G"], "tc_algo": ["", "t", "r", "R", "q", "Q", "i", "I"], # Q = Argyll >= 1.1.0 "tc_vrml_use_D50": [0, 1], "tc_vrml_cie_colorspace": ["DIN99", "DIN99b", "DIN99c", "DIN99d", "LCH(ab)", "LCH(uv)", "Lab", "Luv", "Lu'v'", "xyY"], "tc_vrml_device_colorspace": ["HSI", "HSL", "HSV", "RGB"], "testchart.auto_optimize": [0, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18], "trc": ["240", "709", "l", "s", ""], "trc.type": ["g", "G"], "uniformity.cols": [3, 5, 7, 9], "uniformity.rows": [3, 5, 7, 9], "whitepoint.colortemp.locus": ["t", "T"] } defaults = { "3d.format": "HTML", "3dlut.apply_black_offset": 0, "3dlut.apply_trc": 1, "3dlut.bitdepth.input": 10, "3dlut.bitdepth.output": 12, "3dlut.create": 0, "3dlut.trc_gamma": 2.4, "3dlut.trc_gamma.backup": 2.4, "3dlut.trc_gamma_type": "B", "3dlut.trc_output_offset": 0.0, "3dlut.encoding.input": "n", "3dlut.encoding.input.backup": "n", "3dlut.encoding.output": "n", "3dlut.encoding.output.backup": "n", "3dlut.format": "cube", "3dlut.gamap.use_b2a": 0, "3dlut.image.layout": "h", "3dlut.image.order": "rgb", "3dlut.input.profile": "", "3dlut.abstract.profile": "", "3dlut.enable": 1, "3dlut.output.profile": "", "3dlut.output.profile.apply_cal": 1, "3dlut.rendering_intent": "aw", "3dlut.use_abstract_profile": 0, "3dlut.size": 65, "3dlut.tab.enable": 0, "3dlut.tab.enable.backup": 0, "allow_skip_sensor_cal": 0, "app.allow_network_clients": 0, "app.dpi": get_default_dpi(), "app.port": 15411, "argyll.debug": 0, "argyll.dir": None, "argyll.version": "0.0.0", "drift_compensation.blacklevel": 0, "drift_compensation.whitelevel": 0, "calibration.ambient_viewcond_adjust": 0, "calibration.ambient_viewcond_adjust.lux": 500.0, "calibration.autoload": 0, "calibration.black_luminance": 0.000001, "calibration.black_luminance.backup": 0.000001, "calibration.black_output_offset": 1.0, "calibration.black_output_offset.backup": 1.0, "calibration.black_point_correction": 0.0, "calibration.black_point_correction.auto": 0, "calibration.black_point_correction_choice.show": 1, "calibration.black_point_hack": 0, "calibration.black_point_rate": 4.0, "calibration.black_point_rate.enabled": 0, "calibration.continue_next": 0, "calibration.file": "", "calibration.file.previous": None, "calibration.interactive_display_adjustment": 1, "calibration.interactive_display_adjustment.backup": 1, "calibration.luminance": 120.0, "calibration.luminance.backup": 120.0, "calibration.quality": "l", "calibration.update": 0, "calibration.use_video_lut": 1, "calibration.use_video_lut.backup": 1, "colorimeter_correction.instrument": None, "colorimeter_correction.instrument.reference": None, "colorimeter_correction.measurement_mode": "l", "colorimeter_correction.measurement_mode.reference.adaptive": 1, "colorimeter_correction.measurement_mode.reference.highres": 0, "colorimeter_correction.measurement_mode.reference.projector": 0, "colorimeter_correction.measurement_mode.reference": "l", "colorimeter_correction.observer": "1931_2", "colorimeter_correction.observer.reference": "1931_2", "colorimeter_correction.testchart": "ccxx.ti1", "colorimeter_correction_matrix_file": "AUTO:", "colorimeter_correction.type": "matrix", "comport.number": 1, "comport.number.backup": 1, # Note: worker.Worker.enumerate_displays_and_ports() overwrites copyright "copyright": "No copyright. Created with %s %s and Argyll CMS" % (appname, version), "dimensions.measureframe": "0.5,0.5,1.5", "dimensions.measureframe.unzoomed": "0.5,0.5,1.5", "display.number": 1, "display_lut.link": 1, "display_lut.number": 1, "display.technology": "LCD", "displays": "", "dry_run": 0, "enumerate_ports.auto": 0, "extra_args.collink": "", "extra_args.colprof": "", "extra_args.dispcal": "", "extra_args.dispread": "", "extra_args.spotread": "", "extra_args.targen": "", "gamap_profile": "", "gamap_perceptual": 0, "gamap_perceptual_intent": "p", "gamap_saturation": 0, "gamap_saturation_intent": "s", "gamap_default_intent": "p", "gamma": 2.2, "iccgamut.surface_detail": 6.0, "instruments": "", "last_launch": "99", "log.autoshow": 0, "log.show": 0, "lang": "en", # The last_[...]_path defaults are set in localization.py "lut_viewer.show": 0, "lut_viewer.show_actual_lut": 0, "madtpg.host": "localhost", "madtpg.native": 1, "madtpg.port": 60562, "measurement_mode": "l", "measurement_mode.adaptive": 1, "measurement_mode.backup": "l", "measurement_mode.highres": 0, "measurement_mode.projector": 0, "measurement_report.apply_black_offset": 0, "measurement_report.apply_trc": 0, "measurement_report.trc_gamma": 2.4, "measurement_report.trc_gamma.backup": 2.4, "measurement_report.trc_gamma_type": "B", "measurement_report.trc_output_offset": 0.0, "measurement_report.chart": "", "measurement_report.chart.fields": "RGB", "measurement_report.devlink_profile": "", "measurement_report.output_profile": "", "measurement_report.whitepoint.simulate": 0, "measurement_report.whitepoint.simulate.relative": 0, "measurement_report.simulation_profile": "", "measurement_report.use_devlink_profile": 0, "measurement_report.use_simulation_profile": 0, "measurement_report.use_simulation_profile_as_output": 0, "measurement.name.expanded": u"", "measurement.play_sound": 1, "measurement.save_path": expanduseru("~"), "measure.darken_background": 0, "measure.darken_background.show_warning": 1, "measure.display_settle_time_mult": 1.0, "measure.display_settle_time_mult.backup": 1.0, "measure.min_display_update_delay_ms": 20, "measure.min_display_update_delay_ms.backup": 20, "measure.override_display_settle_time_mult": 0, "measure.override_display_settle_time_mult.backup": 0, "measure.override_min_display_update_delay_ms": 0, "measure.override_min_display_update_delay_ms.backup": 0, "observer": "1931_2", "observer.backup": "1931_2", "patterngenerator.apl": .22, "patterngenerator.prisma.argyll": 0, "patterngenerator.prisma.host": "", "patterngenerator.prisma.preset": "Custom-1", "patterngenerator.prisma.port": 80, "patterngenerator.prisma.use_video_levels": 1, "patterngenerator.resolve": "CM", "patterngenerator.resolve.port": 20002, "patterngenerator.resolve.use_video_levels": 0, "position.x": 50, "position.y": 50, "position.info.x": 50, "position.info.y": 50, "position.lut_viewer.x": 50, "position.lut_viewer.y": 50, "position.lut3dframe.x": 50, "position.lut3dframe.y": 50, "position.profile_info.x": 50, "position.profile_info.y": 50, "position.progress.x": 50, "position.progress.y": 50, "position.reportframe.x": 50, "position.reportframe.y": 50, "position.scripting.x": 50, "position.scripting.y": 50, "position.synthiccframe.x": 50, "position.synthiccframe.y": 50, "position.tcgen.x": 50, "position.tcgen.y": 50, "profile.black_point_compensation": 0, "profile.create_gamut_views": 1, "profile.install_scope": "l" if (sys.platform != "win32" and os.geteuid() == 0) # or # (sys.platform == "win32" and # sys.getwindowsversion() >= (6, )) else "u", # Linux, OSX "profile.license": "Public Domain", "profile.load_on_login": 1, "profile.name": u" ".join([ u"%dns", u"%out", u"%Y-%m-%d %H-%M", u"%cb", u"%wp", u"%cB", u"%ck", u"%cg", u"%cq-%pq", u"%pt" ]), "profile.name.expanded": u"", "profile.quality": "h", "profile.quality.b2a": "h", "profile.b2a.hires": 1, "profile.b2a.hires.diagpng": 1, "profile.b2a.hires.size": -1, "profile.b2a.hires.smooth": 1, "profile.save_path": storage, # directory "profile.type": "X", "profile.update": 0, "profile_loader.error.show_msg": 1, "profile_loader.fix_profile_associations": 0, "profile_loader.known_apps": ";".join(["basiccolor display.exe", "calclient.exe", "coloreyes display pro.exe", "colormunkidisplay.exe", "colornavigator.exe", "dell ultrasharp calibration solution.exe", "hp_dreamcolor_calibration_solution.exe", "i1profiler.exe", "icolordisplay.exe", "spectraview profiler.exe", "spyder3elite.exe", "spyder3express.exe", "spyder3pro.exe", "spyder4elite.exe", "spyder4express.exe", "spyder4pro.exe", "spyder5elite.exe", "spyder5express.exe", "spyder5pro.exe"]), "profile_loader.known_window_classes": ";".join(["CalClient.exe"]), "profile_loader.reset_gamma_ramps": 0, "profile_loader.verify_calibration": 0, "recent_cals": "", "report.pack_js": 1, "settings.changed": 0, "show_advanced_options": 0, "show_donation_message": 1, "size.info.w": 512, "size.info.h": 384, "size.lut3dframe.w": 512, "size.lut3dframe.h": 384, "size.measureframe": 300, "size.profile_info.w": 432, "size.profile_info.split.w": 960, "size.profile_info.h": 552, "size.lut_viewer.w": 432, "size.lut_viewer.h": 552, "size.reportframe.w": 512, "size.reportframe.h": 256, "size.scripting.w": 512, "size.scripting.h": 384, "size.synthiccframe.w": 512, "size.synthiccframe.h": 384, "skip_legacy_serial_ports": 1, "skip_scripts": 1, "splash.zoom": 0, "startup_sound.enable": 1, "sudo.preserve_environment": 1, "synthprofile.black_luminance": 0.0, "synthprofile.luminance": 120.0, "synthprofile.trc_gamma": 2.4, "synthprofile.trc_gamma_type": "G", "synthprofile.trc_output_offset": 0.0, "tc_adaption": 0.1, "tc_add_ti3_relative": 1, "tc_algo": "", "tc_angle": 0.3333, "tc_black_patches": 4, "tc_export_repeat_patch_max": 1, "tc_export_repeat_patch_min": 1, "tc_filter": 0, "tc_filter_L": 50, "tc_filter_a": 0, "tc_filter_b": 0, "tc_filter_rad": 255, "tc_fullspread_patches": 0, "tc_gamma": 1.0, "tc_gray_patches": 9, "tc_multi_bcc": 0, "tc_multi_bcc_steps": 0, "tc_multi_steps": 3, "tc_neutral_axis_emphasis": 0.5, "tc_dark_emphasis": 0.0, "tc_precond": 0, "tc_precond_profile": "", "tc.saturation_sweeps": 5, "tc.saturation_sweeps.custom.R": 0.0, "tc.saturation_sweeps.custom.G": 0.0, "tc.saturation_sweeps.custom.B": 0.0, "tc_single_channel_patches": 0, "tc_vrml_black_offset": 40, "tc_vrml_cie": 0, "tc_vrml_cie_colorspace": "Lab", "tc_vrml_device_colorspace": "RGB", "tc_vrml_device": 1, "tc_vrml_use_D50": 0, "tc_white_patches": 4, "tc.show": 0, "testchart.auto_optimize": 5, "testchart.auto_optimize.fix_zero_blackpoint": 0, "testchart.file": "auto", "testchart.file.backup": "auto", "testchart.reference": "", "ti3.check_sanity.auto": 0, "trc": 2.2, "trc.backup": 2.2, "trc.should_use_viewcond_adjust.show_msg": 1, "trc.type": "g", "trc.type.backup": "g", "uniformity.cols": 5, "uniformity.measure.continuous": 0, "uniformity.rows": 5, "untethered.measure.auto": 1, "untethered.measure.manual.delay": 0.75, "untethered.max_delta.chroma": 0.5, "untethered.min_delta": 1.5, "untethered.min_delta.lightness": 1.0, "update_check": 1, "use_fancy_progress": 1, "use_separate_lut_access": 0, "vrml.compress": 1, "webserver.portnumber": 8080, "whitepoint.colortemp": 5000, "whitepoint.colortemp.backup": 5000, "whitepoint.colortemp.locus": "t", "whitepoint.x": 0.345741, "whitepoint.x.backup": 0.345741, "whitepoint.y": 0.358666, "whitepoint.y.backup": 0.358666, "x3dom.cache": 1, "x3dom.embed": 0 } lcode, lenc = locale.getdefaultlocale() if lcode: defaults["lang"] = lcode.split("_")[0].lower() testchart_defaults = { "s": {None: "auto"}, # shaper + matrix "l": {None: "auto"}, # lut "g": {None: "auto"} # gamma + matrix } def _init_testcharts(): for testcharts in testchart_defaults.values(): for chart in filter(lambda value: value != "auto", testcharts.values()): resfiles.append(os.path.join("ti1", chart)) testchart_defaults["G"] = testchart_defaults["g"] testchart_defaults["S"] = testchart_defaults["s"] for key in ("X", "x"): testchart_defaults[key] = testchart_defaults["l"] def getcfg(name, fallback=True, raw=False): """ Get and return an option value from the configuration. If fallback evaluates to True and the option is not set, return its default value. """ if name == "profile.name.expanded" and is_ccxx_testchart(): name = "measurement.name.expanded" value = None hasdef = name in defaults if hasdef: defval = defaults[name] deftype = type(defval) if cfg.has_option(ConfigParser.DEFAULTSECT, name): try: value = unicode(cfg.get(ConfigParser.DEFAULTSECT, name), "UTF-8") except UnicodeDecodeError: pass else: # Check for invalid types and return default if wrong type if raw: pass elif (name != "trc" or value not in valid_values["trc"]) and \ hasdef and deftype in (Decimal, int, float): try: value = deftype(value) except ValueError: value = defval else: valid_range = valid_ranges.get(name) if valid_range: value = min(max(valid_range[0], value), valid_range[1]) elif name in valid_values and value not in valid_values[name]: value = defval elif name.startswith("dimensions.measureframe"): try: value = [max(0, float(n)) for n in value.split(",")] if len(value) != 3: raise ValueError() except ValueError: value = defaults[name] else: value[0] = min(value[0], 1) value[1] = min(value[1], 1) value[2] = min(value[2], 50) value = ",".join([str(n) for n in value]) elif name == "profile.quality" and getcfg("profile.type") in ("g", "G"): # default to high quality for gamma + matrix value = "h" elif name == "trc.type" and getcfg("trc") in valid_values["trc"]: value = "g" elif name in valid_values and value not in valid_values[name]: if debug: print "Invalid config value for %s: %s" % (name, value), value = None elif name == "copyright": # Make sure DisplayCAL and Argyll version are up-to-date pattern = re.compile("(%s(?:\s*v(?:ersion|\.)?)?\s*)\d+(?:\.\d+)*" % appname, re.I) repl = create_replace_function("\\1%s", version) value = re.sub(pattern, repl, value) if appbasename != appname: pattern = re.compile("(%s(?:\s*v(?:ersion|\.)?)?\s*)\d+(?:\.\d+)*" % appbasename, re.I) repl = create_replace_function("\\1%s", version) value = re.sub(pattern, repl, value) pattern = re.compile("(Argyll(?:\s*CMS)?)((?:\s*v(?:ersion|\.)?)?\s*)\d+(?:\.\d+)*", re.I) if defval.split()[-1] != "CMS": repl = create_replace_function("\\1\\2%s", defval.split()[-1]) else: repl = "\\1" value = re.sub(pattern, repl, value) elif name == "measurement_mode": # Map n and r measurement modes to canonical l and c # - the inverse mapping happens per-instrument in # Worker.add_measurement_features(). That way we can have # compatibility with old and current Argyll CMS value = {"n": "l", "r": "c"}.get(value, value) if value is None: if hasdef and fallback: value = defval if debug > 1: print name, "- falling back to", value else: if debug and not hasdef: print "Warning - unknown option:", name if raw: return value if (value and isinstance(value, basestring) and name.endswith("file") and name != "colorimeter_correction_matrix_file" and (name != "testchart.file" or value != "auto") and (not os.path.isabs(value) or not os.path.exists(value))): # colorimeter_correction_matrix_file is special because it's # not (only) a path if debug: print "%s does not exist: %s" % (name, value), # Normalize path (important, this turns altsep into sep under # Windows) value = os.path.normpath(value) # Check if this is a relative path covered by data_dirs if (value.split(os.path.sep)[-3:-2] == [appname] or not os.path.isabs(value)) and ( value.split(os.path.sep)[-2:-1] == ["presets"] or value.split(os.path.sep)[-2:-1] == ["ref"] or value.split(os.path.sep)[-2:-1] == ["ti1"]): value = os.path.join(*value.split(os.path.sep)[-2:]) value = get_data_path(value) elif hasdef: value = None if not value and hasdef: value = defval if debug > 1: print name, "- falling back to", value elif name in ("displays", "instruments"): value = [strtr(v, [("%" + hex(ord(os.pathsep))[2:].upper(), os.pathsep), ("%25", "%")]) for v in value.split(os.pathsep)] return value def hascfg(name, fallback=True): """ Check if an option name exists in the configuration. Returns a boolean. If fallback evaluates to True and the name does not exist, check defaults also. """ if cfg.has_option(ConfigParser.DEFAULTSECT, name): return True elif fallback: return name in defaults return False def get_ccxx_testchart(): """ Get the path to the default chart for CCMX/CCSS creation """ return get_data_path(os.path.join("ti1", defaults["colorimeter_correction.testchart"])) def get_current_profile(include_display_profile=False): """ Get the currently selected profile (if any) """ path = getcfg("calibration.file", False) if path: import ICCProfile as ICCP try: profile = ICCP.ICCProfile(path) except (IOError, ICCP.ICCProfileInvalidError), exception: return return profile elif include_display_profile: return get_display_profile() def get_display_profile(display_no=None): if display_no is None: display_no = max(getcfg("display.number") - 1, 0) if is_virtual_display(display_no): return None import ICCProfile as ICCP try: return ICCP.get_display_profile(display_no) except Exception, exception: from log import _safe_print, log _safe_print("ICCP.get_display_profile(%s):" % display_no, exception, fn=log) standard_profiles = [] def get_standard_profiles(paths_only=False): if not standard_profiles: import ICCProfile as ICCP from log import safe_print # Reference profiles (Argyll + DisplayCAL) ref_icc = get_data_path("ref", "\.ic[cm]$") or [] # Other profiles installed on the system other_icc = [] rex = re.compile("\.ic[cm]$", re.IGNORECASE) for icc_dir in set(iccprofiles + iccprofiles_home): for dirpath, dirnames, basenames in os.walk(icc_dir): for basename in filter(rex.search, basenames): filename, ext = os.path.splitext(basename.lower()) if (filename.endswith("_bas") or filename.endswith("_eci") or filename.endswith("adobergb1998") or filename.startswith("eci-rgb") or filename.startswith("ecirgb") or filename.startswith("ekta space") or filename.startswith("ektaspace") or filename.startswith("fogra") or filename.startswith("gracol") or filename.startswith("iso") or filename.startswith("lstar-") or filename.startswith("pso_") or filename.startswith("prophoto") or filename.startswith("psr_") or filename.startswith("psrgravure") or filename.startswith("snap") or filename.startswith("srgb") or filename.startswith("swop") or filename in ("applergb", "bestrgb", "betargb", "brucergb", "ciergb", "cie-rgb", "colormatchrgb", "donrgb", "widegamutrgb")): other_icc.append(os.path.join(dirpath, basename)) for path in ref_icc + other_icc: try: profile = ICCP.ICCProfile(path, load=False) except EnvironmentError: pass except Exception, exception: safe_print(exception) else: if (profile.version < 4 and profile.profileClass != "nmcl" and profile.colorSpace != "GRAY" and profile.connectionColorSpace in ("Lab", "XYZ")): standard_profiles.append(profile) if paths_only: return [profile.fileName for profile in standard_profiles] return standard_profiles def get_total_patches(white_patches=None, black_patches=None, single_channel_patches=None, gray_patches=None, multi_steps=None, multi_bcc_steps=None, fullspread_patches=None): if white_patches is None: white_patches = getcfg("tc_white_patches") if black_patches is None and getcfg("argyll.version") >= "1.6": black_patches = getcfg("tc_black_patches") if single_channel_patches is None: single_channel_patches = getcfg("tc_single_channel_patches") single_channel_patches_total = single_channel_patches * 3 if gray_patches is None: gray_patches = getcfg("tc_gray_patches") if gray_patches == 0 and single_channel_patches > 0 and white_patches > 0: gray_patches = 2 if multi_steps is None: multi_steps = getcfg("tc_multi_steps") if multi_bcc_steps is None and getcfg("argyll.version") >= "1.6": multi_bcc_steps = getcfg("tc_multi_bcc_steps") if fullspread_patches is None: fullspread_patches = getcfg("tc_fullspread_patches") total_patches = 0 if multi_steps > 1: multi_patches = int(math.pow(multi_steps, 3)) if multi_bcc_steps > 1: multi_patches += int(math.pow(multi_bcc_steps - 1, 3)) total_patches += multi_patches white_patches -= 1 # white always in multi channel patches multi_step = 255.0 / (multi_steps - 1) multi_values = [] multi_bcc_values = [] if multi_bcc_steps > 1: multi_bcc_step = multi_step for i in range(multi_bcc_steps): multi_values.append(str(multi_bcc_step * i)) for i in range(multi_bcc_steps * 2 - 1): multi_bcc_values.append(str(multi_bcc_step / 2.0 * i)) else: for i in range(multi_steps): multi_values.append(str(multi_step * i)) if single_channel_patches > 1: single_channel_step = 255.0 / (single_channel_patches - 1) for i in range(single_channel_patches): if str(single_channel_step * i) in multi_values: single_channel_patches_total -= 3 if gray_patches > 1: gray_step = 255.0 / (gray_patches - 1) for i in range(gray_patches): if (str(gray_step * i) in multi_values or str(gray_step * i) in multi_bcc_values): gray_patches -= 1 elif gray_patches > 1: white_patches -= 1 # white always in gray patches single_channel_patches_total -= 3 # black always in gray patches elif single_channel_patches_total: # black always only once in single channel patches single_channel_patches_total -= 2 total_patches += max(0, white_patches) + \ max(0, single_channel_patches_total) + \ max(0, gray_patches) + fullspread_patches if black_patches: if gray_patches > 1 or single_channel_patches_total or multi_steps: black_patches -= 1 # black always in other patches total_patches += black_patches return total_patches def get_verified_path(cfg_item_name, path=None): """ Verify and return dir and filename for a path from the user cfg, or a given path """ defaultPath = path or getcfg(cfg_item_name) defaultDir = expanduseru("~") defaultFile = "" if defaultPath: if os.path.exists(defaultPath): defaultDir, defaultFile = (os.path.dirname(defaultPath), os.path.basename(defaultPath)) elif (defaults.get(cfg_item_name) and os.path.exists(defaults[cfg_item_name])): defaultDir, defaultFile = (os.path.dirname(defaults[cfg_item_name]), os.path.basename(defaults[cfg_item_name])) elif os.path.exists(os.path.dirname(defaultPath)): defaultDir = os.path.dirname(defaultPath) return defaultDir, defaultFile def is_ccxx_testchart(testchart=None): """ Check wether the testchart is the default chart for CCMX/CCSS creation """ testchart = testchart or getcfg("testchart.file") return testchart == get_ccxx_testchart() def is_profile(filename=None, include_display_profile=False): filename = filename or getcfg("calibration.file", False) if filename: if os.path.exists(filename): import ICCProfile as ICCP try: profile = ICCP.ICCProfile(filename) except (IOError, ICCP.ICCProfileInvalidError): pass else: return True elif include_display_profile: return bool(get_display_profile()) return False def makecfgdir(which="user", worker=None): if which == "user": if not os.path.exists(confighome): try: os.makedirs(confighome) except Exception, exception: from log import safe_print safe_print(u"Warning - could not create configuration directory " "'%s': %s" % (confighome, safe_unicode(exception))) return False elif not os.path.exists(config_sys): try: if sys.platform == "win32": os.makedirs(config_sys) else: result = worker.exec_cmd("mkdir", ["-p", config_sys], capture_output=True, low_contrast=False, skip_scripts=True, silent=True, asroot=True) if isinstance(result, Exception): raise result except Exception, exception: from log import safe_print safe_print(u"Warning - could not create configuration directory " "'%s': %s" % (config_sys, safe_unicode(exception))) return False return True def initcfg(module=None): """ Initialize the configuration. Read in settings if the configuration file exists, else create the settings directory if nonexistent. """ if module: cfgbasename = "%s-%s" % (appbasename, module) else: cfgbasename = appbasename makecfgdir() if os.path.exists(confighome) and \ not os.path.exists(os.path.join(confighome, cfgbasename + ".ini")): # Set a few defaults which have None as possible value and thus cannot # be set in the 'defaults' collection setcfg("gamap_src_viewcond", "mt") setcfg("gamap_out_viewcond", "mt") # Set default preset setcfg("calibration.file", defaults["calibration.file"]) # Read cfg cfgnames = [] if module != "3DLUT-maker": cfgnames.append(appbasename) if module: cfgnames.append(cfgbasename) else: cfgnames.extend("%s-%s" % (appbasename, othermod) for othermod in ("synthprofile", "testchart-editor")) cfgroots = [confighome] if module == "apply-profiles": cfgroots.append(config_sys) cfgfiles = [] for cfgname in cfgnames: for cfgroot in cfgroots: cfgfile = os.path.join(cfgroot, cfgname + ".ini") if os.path.isfile(cfgfile): cfgfiles.append(cfgfile) # Make user config take precedence break cfgfiles.sort(key=lambda cfgfile: os.stat(cfgfile).st_mtime) try: cfg.read(cfgfiles) # This won't raise an exception if the file does not exist, only # if it can't be parsed except Exception, exception: from log import safe_print safe_print("Warning - could not parse configuration files:\n%s" % "\n".join(cfgfiles)) # Fix Python 2.7 ConfigParser option values being lists instead of # strings in case of a ParsingError. http://bugs.python.org/issue2414 all_sections = [ConfigParser.DEFAULTSECT] all_sections.extend(cfg.sections()) for section in all_sections: for name, val in cfg.items(section): if isinstance(val, list): cfg.set(section, name, "\n".join(val)) dpiset = False def set_default_app_dpi(): """ Set application DPI """ # Only call this after creating the wx.App object! global dpiset if not dpiset and not getcfg("app.dpi", False): # HighDPI support dpiset = True from wxaddons import wx if sys.platform in ("darwin", "win32"): # Determine screen DPI dpi = wx.ScreenDC().GetPPI()[0] else: if "gtk3" in wx.PlatformInfo: from util_os import which txt_scale = 1 if which("gsettings"): import subprocess as sp p = sp.Popen(["gsettings", "get", "org.gnome.desktop.interface", "text-scaling-factor"], stdin=sp.PIPE, stdout=sp.PIPE, stderr=sp.PIPE) stdout, stderr = p.communicate() if stdout: try: txt_scale = float(stdout) except ValueError: pass else: # Linux. Determine font scaling factor font = wx.Font(256, wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_NORMAL) txt_scale = font.GetPixelSize()[0] / 256.0 or 1 dpi = int(round(get_default_dpi() * txt_scale)) defaults["app.dpi"] = dpi dpiset = True def setcfg(name, value): """ Set an option value in the configuration. """ if value is None: cfg.remove_option(ConfigParser.DEFAULTSECT, name) else: if name in ("displays", "instruments") and isinstance(value, (list, tuple)): value = os.pathsep.join(strtr(v, [("%", "%25"), (os.pathsep, "%" + hex(ord(os.pathsep))[2:].upper())]) for v in value) cfg.set(ConfigParser.DEFAULTSECT, name, unicode(value).encode("UTF-8")) def writecfg(which="user", worker=None, module=None, options=()): """ Write configuration file. which: 'user' or 'system' worker: worker instance if which == 'system' """ if module: cfgbasename = "%s-%s" % (appbasename, module) else: cfgbasename = appbasename if which == "user": # user config - stores everything and overrides system-wide config cfgfilename = os.path.join(confighome, cfgbasename + ".ini") try: io = StringIO() cfg.write(io) io.seek(0) lines = io.read().strip("\n").split("\n") if options: optionlines = [] for optionline in lines[1:]: for option in options: if optionline.startswith(option): optionlines.append(optionline) else: optionlines = lines[1:] # Sorting works as long as config has only one section lines = lines[:1] + sorted(optionlines) cfgfile = open(cfgfilename, "wb") cfgfile.write(os.linesep.join(lines) + os.linesep) cfgfile.close() except Exception, exception: from log import safe_print safe_print(u"Warning - could not write user configuration file " "'%s': %s" % (cfgfilename, safe_unicode(exception))) return False else: # system-wide config - only stores essentials ie. Argyll directory cfgfilename1 = os.path.join(confighome, cfgbasename + ".local.ini") cfgfilename2 = os.path.join(config_sys, cfgbasename + ".ini") if sys.platform == "win32": cfgfilename = cfgfilename2 else: cfgfilename = cfgfilename1 try: cfgfile = open(cfgfilename, "wb") if getcfg("argyll.dir"): cfgfile.write(os.linesep.join(["[Default]", "%s = %s" % ("argyll.dir", getcfg("argyll.dir"))]) + os.linesep) cfgfile.close() if sys.platform != "win32": # on Linux and OS X, we write the file to the users's config dir # then 'su mv' it to the system-wide config dir result = worker.exec_cmd("mv", ["-f", cfgfilename1, cfgfilename2], capture_output=True, low_contrast=False, skip_scripts=True, silent=True, asroot=True) if isinstance(result, Exception): raise result except Exception, exception: from log import safe_print safe_print(u"Warning - could not write system-wide configuration file " "'%s': %s" % (cfgfilename2, safe_unicode(exception))) return False return True _init_testcharts() runtype = runtimeconfig(pyfile) DisplayCAL-3.1.0.0/DisplayCAL/debughelpers.py0000644000076500000000000000601212647526531020454 0ustar devwheel00000000000000# -*- coding: utf-8 -*- import inspect import sys import traceback import config from config import fs_enc from log import logbuffer, safe_print from meta import name as appname from options import debug from util_str import safe_unicode wxEventTypes = {} def getevtobjname(event, window=None): """ Get and return the event object's name. """ try: event_object = event.GetEventObject() if not event_object and window: event_object = window.FindWindowById(event.GetId()) if event_object and hasattr(event_object, "GetName"): return event_object.GetName() except Exception, exception: pass def getevttype(event): """ Get and return the event object's type. """ if not wxEventTypes: from wxaddons import wx try: for name in dir(wx): if name.find("EVT_") == 0: attr = getattr(wx, name) if hasattr(attr, "evtType"): wxEventTypes[attr.evtType[0]] = name except Exception, exception: pass typeId = event.GetEventType() if typeId in wxEventTypes: return wxEventTypes[typeId] def handle_error(error, parent=None, silent=False): """ Log an error string and show an error dialog. """ if isinstance(error, tuple): # We got a tuple. Assume (etype, value, tb) tbstr = "".join(traceback.format_exception(*error)) error = error[1] else: tbstr = traceback.format_exc() if (tbstr.strip() != "None" and isinstance(error, Exception) and (debug or not isinstance(error, EnvironmentError) or not getattr(error, "filename", None))): # Print a traceback if in debug mode, for non environment errors, and # for environment errors not related to files safe_print(tbstr) else: safe_print(error) if not silent: try: from wxaddons import wx app = wx.GetApp() if app is None and parent is None: app = wx.App(redirect=False) # wxPython 3 bugfix: We also need a toplevel window frame = wx.Frame(None) parent = False else: frame = None if parent is None: parent = wx.GetActiveWindow() if parent: try: parent.IsShownOnScreen() except: # If the parent is still being constructed, we can't use it parent = None if isinstance(error, Warning): icon = wx.ICON_WARNING elif isinstance(error, Exception): icon = wx.ICON_ERROR else: icon = wx.ICON_INFORMATION dlg = wx.MessageDialog(parent if parent not in (False, None) and parent.IsShownOnScreen() else None, safe_unicode(error), appname, wx.OK | icon) if frame: # wxPython 3 bugfix: We need to use CallLater and MainLoop wx.CallLater(1, dlg.ShowModal) wx.CallLater(1, frame.Close) app.MainLoop() else: dlg.ShowModal() dlg.Destroy() except Exception, exception: safe_print("Warning: handle_error():", safe_unicode(exception)) def print_callstack(): """ Print call stack """ stack = inspect.stack() indent = "" for frame, filename, linenum, funcname, line, exc in reversed(stack[1:]): safe_print(indent, funcname, filename, linenum, repr("".join(line).strip())) indent += " " class ResourceError(Exception): pass DisplayCAL-3.1.0.0/DisplayCAL/defaultpaths.py0000644000076500000000000001411312647526531020470 0ustar devwheel00000000000000# -*- coding: utf-8 -*- import os import sys if sys.platform == "win32": try: from win32com.shell.shell import SHGetSpecialFolderPath from win32com.shell.shellcon import (CSIDL_APPDATA, CSIDL_COMMON_APPDATA, CSIDL_COMMON_STARTUP, CSIDL_LOCAL_APPDATA, CSIDL_PROFILE, CSIDL_PROGRAMS, CSIDL_COMMON_PROGRAMS, CSIDL_PROGRAM_FILES_COMMON, CSIDL_STARTUP, CSIDL_SYSTEM) except ImportError: import ctypes (CSIDL_APPDATA, CSIDL_COMMON_APPDATA, CSIDL_COMMON_STARTUP, CSIDL_LOCAL_APPDATA, CSIDL_PROFILE, CSIDL_PROGRAMS, CSIDL_COMMON_PROGRAMS, CSIDL_PROGRAM_FILES_COMMON, CSIDL_STARTUP, CSIDL_SYSTEM) = (26, 35, 24, 28, 40, 43, 2, 23, 7, 37) MAX_PATH = 260 def SHGetSpecialFolderPath(hwndOwner, nFolder, create=0): """ ctypes wrapper around shell32.SHGetSpecialFolderPathW """ buffer = ctypes.create_unicode_buffer(u'\0' * MAX_PATH) ctypes.windll.shell32.SHGetSpecialFolderPathW(0, buffer, nFolder, create) return buffer.value from util_os import expanduseru, expandvarsu, getenvu home = expanduseru("~") if sys.platform == "win32": # Always specify create=1 for SHGetSpecialFolderPath so we don't get an # exception if the folder does not yet exist try: library_home = appdata = SHGetSpecialFolderPath(0, CSIDL_APPDATA, 1) except Exception, exception: raise Exception("FATAL - Could not get/create user application data folder: %s" % exception) try: localappdata = SHGetSpecialFolderPath(0, CSIDL_LOCAL_APPDATA, 1) except Exception, exception: localappdata = os.path.join(appdata, "Local") cache = localappdata # Argyll CMS uses ALLUSERSPROFILE for local system wide app related data # Note: On Windows Vista and later, ALLUSERSPROFILE and COMMON_APPDATA # are actually the same ('C:\ProgramData'), but under Windows XP the former # points to 'C:\Documents and Settings\All Users' while COMMON_APPDATA # points to 'C:\Documents and Settings\All Users\Application Data' allusersprofile = getenvu("ALLUSERSPROFILE") if allusersprofile: commonappdata = [allusersprofile] else: try: commonappdata = [SHGetSpecialFolderPath(0, CSIDL_COMMON_APPDATA, 1)] except Exception, exception: raise Exception("FATAL - Could not get/create common application data folder: %s" % exception) library = commonappdata[0] try: commonprogramfiles = SHGetSpecialFolderPath(0, CSIDL_PROGRAM_FILES_COMMON, 1) except Exception, exception: raise Exception("FATAL - Could not get/create common program files folder: %s" % exception) try: autostart = SHGetSpecialFolderPath(0, CSIDL_COMMON_STARTUP, 1) except Exception, exception: autostart = None try: autostart_home = SHGetSpecialFolderPath(0, CSIDL_STARTUP, 1) except Exception, exception: autostart_home = None try: iccprofiles = [os.path.join(SHGetSpecialFolderPath(0, CSIDL_SYSTEM), "spool", "drivers", "color")] except Exception, exception: raise Exception("FATAL - Could not get system folder: %s" % exception) iccprofiles_home = iccprofiles try: programs = SHGetSpecialFolderPath(0, CSIDL_PROGRAMS, 1) except Exception, exception: programs = None try: commonprograms = [SHGetSpecialFolderPath(0, CSIDL_COMMON_PROGRAMS, 1)] except Exception, exception: commonprograms = [] elif sys.platform == "darwin": library_home = os.path.join(home, "Library") cache = os.path.join(library_home, "Caches") library = os.path.join(os.path.sep, "Library") prefs = os.path.join(os.path.sep, "Library", "Preferences") prefs_home = os.path.join(home, "Library", "Preferences") appdata = os.path.join(home, "Library", "Application Support") commonappdata = [os.path.join(os.path.sep, "Library", "Application Support")] autostart = autostart_home = None iccprofiles = [os.path.join(os.path.sep, "Library", "ColorSync", "Profiles"), os.path.join(os.path.sep, "System", "Library", "ColorSync", "Profiles")] iccprofiles_home = [os.path.join(home, "Library", "ColorSync", "Profiles")] programs = os.path.join(os.path.sep, "Applications") commonprograms = [] else: cache = xdg_cache_home = getenvu("XDG_CACHE_HOME", expandvarsu("$HOME/.cache")) xdg_config_home = getenvu("XDG_CONFIG_HOME", expandvarsu("$HOME/.config")) xdg_config_dir_default = "/etc/xdg" xdg_config_dirs = [os.path.normpath(pth) for pth in getenvu("XDG_CONFIG_DIRS", xdg_config_dir_default).split(os.pathsep)] if not xdg_config_dir_default in xdg_config_dirs: xdg_config_dirs.append(xdg_config_dir_default) xdg_data_home_default = expandvarsu("$HOME/.local/share") library_home = appdata = xdg_data_home = getenvu("XDG_DATA_HOME", xdg_data_home_default) xdg_data_dirs_default = "/usr/local/share:/usr/share:/var/lib" xdg_data_dirs = [os.path.normpath(pth) for pth in getenvu("XDG_DATA_DIRS", xdg_data_dirs_default).split(os.pathsep)] for dir_ in xdg_data_dirs_default.split(os.pathsep): if not dir_ in xdg_data_dirs: xdg_data_dirs.append(dir_) commonappdata = xdg_data_dirs library = commonappdata[0] autostart = None for dir_ in xdg_config_dirs: if os.path.exists(dir_): autostart = os.path.join(dir_, "autostart") break if not autostart: autostart = os.path.join(xdg_config_dir_default, "autostart") autostart_home = os.path.join(xdg_config_home, "autostart") iccprofiles = [] for dir_ in xdg_data_dirs: if os.path.exists(dir_): iccprofiles.append(os.path.join(dir_, "color", "icc")) iccprofiles.append("/var/lib/color") iccprofiles_home = [os.path.join(xdg_data_home, "color", "icc"), os.path.join(xdg_data_home, "icc"), expandvarsu("$HOME/.color/icc")] programs = os.path.join(xdg_data_home, "applications") commonprograms = [os.path.join(dir_, "applications") for dir_ in xdg_data_dirs] if sys.platform in ("darwin", "win32"): iccprofiles_display = iccprofiles iccprofiles_display_home = iccprofiles_home else: iccprofiles_display = [os.path.join(dir_, "devices", "display") for dir_ in iccprofiles] iccprofiles_display_home = [os.path.join(dir_, "devices", "display") for dir_ in iccprofiles_home] del dir_ DisplayCAL-3.1.0.0/DisplayCAL/demjson.py0000644000076500000000000025343612647526531017460 0ustar devwheel00000000000000# -*- coding: utf-8 -*- # r""" A JSON data encoder and decoder. This Python module implements the JSON (http://json.org/) data encoding format; a subset of ECMAScript (aka JavaScript) for encoding primitive data types (numbers, strings, booleans, lists, and associative arrays) in a language-neutral simple text-based syntax. It can encode or decode between JSON formatted strings and native Python data types. Normally you would use the encode() and decode() functions defined by this module, but if you want more control over the processing you can use the JSON class. This implementation tries to be as completely cormforming to all intricacies of the standards as possible. It can operate in strict mode (which only allows JSON-compliant syntax) or a non-strict mode (which allows much more of the whole ECMAScript permitted syntax). This includes complete support for Unicode strings (including surrogate-pairs for non-BMP characters), and all number formats including negative zero and IEEE 754 non-numbers such a NaN or Infinity. The JSON/ECMAScript to Python type mappings are: ---JSON--- ---Python--- null None undefined undefined (note 1) Boolean (true,false) bool (True or False) Integer int or long (note 2) Float float String str or unicode ( "..." or u"..." ) Array [a, ...] list ( [...] ) Object {a:b, ...} dict ( {...} ) -- Note 1. an 'undefined' object is declared in this module which represents the native Python value for this type when in non-strict mode. -- Note 2. some ECMAScript integers may be up-converted to Python floats, such as 1e+40. Also integer -0 is converted to float -0, so as to preserve the sign (which ECMAScript requires). In addition, when operating in non-strict mode, several IEEE 754 non-numbers are also handled, and are mapped to specific Python objects declared in this module: NaN (not a number) nan (float('nan')) Infinity, +Infinity inf (float('inf')) -Infinity neginf (float('-inf')) When encoding Python objects into JSON, you may use types other than native lists or dictionaries, as long as they support the minimal interfaces required of all sequences or mappings. This means you can use generators and iterators, tuples, UserDict subclasses, etc. To make it easier to produce JSON encoded representations of user defined classes, if the object has a method named json_equivalent(), then it will call that method and attempt to encode the object returned from it instead. It will do this recursively as needed and before any attempt to encode the object using it's default strategies. Note that any json_equivalent() method should return "equivalent" Python objects to be encoded, not an already-encoded JSON-formatted string. There is no such aid provided to decode JSON back into user-defined classes as that would dramatically complicate the interface. When decoding strings with this module it may operate in either strict or non-strict mode. The strict mode only allows syntax which is conforming to RFC 4627 (JSON), while the non-strict allows much more of the permissible ECMAScript syntax. The following are permitted when processing in NON-STRICT mode: * Unicode format control characters are allowed anywhere in the input. * All Unicode line terminator characters are recognized. * All Unicode white space characters are recognized. * The 'undefined' keyword is recognized. * Hexadecimal number literals are recognized (e.g., 0xA6, 0177). * String literals may use either single or double quote marks. * Strings may contain \x (hexadecimal) escape sequences, as well as the \v and \0 escape sequences. * Lists may have omitted (elided) elements, e.g., [,,,,,], with missing elements interpreted as 'undefined' values. * Object properties (dictionary keys) can be of any of the types: string literals, numbers, or identifiers (the later of which are treated as if they are string literals)---as permitted by ECMAScript. JSON only permits strings literals as keys. Concerning non-strict and non-ECMAScript allowances: * Octal numbers: If you allow the 'octal_numbers' behavior (which is never enabled by default), then you can use octal integers and octal character escape sequences (per the ECMAScript standard Annex B.1.2). This behavior is allowed, if enabled, because it was valid JavaScript at one time. * Multi-line string literals: Strings which are more than one line long (contain embedded raw newline characters) are never permitted. This is neither valid JSON nor ECMAScript. Some other JSON implementations may allow this, but this module considers that behavior to be a mistake. References: * JSON (JavaScript Object Notation) * RFC 4627. The application/json Media Type for JavaScript Object Notation (JSON) * ECMA-262 3rd edition (1999) * IEEE 754-1985: Standard for Binary Floating-Point Arithmetic. """ __author__ = "Deron Meranda " __date__ = "2008-03-19" __version__ = "1.3" __credits__ = """Copyright (c) 2006-2008 Deron E. Meranda Licensed under GNU GPL 3.0 or later. See LICENSE.txt included with this software. 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 . """ # ------------------------------ # useful global constants content_type = 'application/json' file_ext = 'json' hexdigits = '0123456789ABCDEFabcdef' octaldigits = '01234567' # ---------------------------------------------------------------------- # Decimal and float types. # # If a JSON number can not be stored in a Python float without loosing # precision and the Python has the decimal type, then we will try to # use decimal instead of float. To make this determination we need to # know the limits of the float type, but Python doesn't have an easy # way to tell what the largest floating-point number it supports. So, # we detemine the precision and scale of the float type by testing it. try: # decimal module was introduced in Python 2.4 import decimal except ImportError: decimal = None def determine_float_precision(): """Returns a tuple (significant_digits, max_exponent) for the float type. """ import math # Just count the digits in pi. The last two decimal digits # may only be partial digits, so discount for them. whole, frac = repr(math.pi).split('.') sigdigits = len(whole) + len(frac) - 2 # This is a simple binary search. We find the largest exponent # that the float() type can handle without going infinite or # raising errors. maxexp = None minv = 0; maxv = 1000 while True: if minv+1 == maxv: maxexp = minv - 1 break elif maxv < minv: maxexp = None break m = (minv + maxv) // 2 try: f = repr(float( '1e+%d' % m )) except ValueError: f = None else: if not f or f[0] < '0' or f[0] > '9': f = None if not f: # infinite maxv = m else: minv = m return sigdigits, maxexp float_sigdigits, float_maxexp = determine_float_precision() # ---------------------------------------------------------------------- # The undefined value. # # ECMAScript has an undefined value (similar to yet distinct from null). # Neither Python or strict JSON have support undefined, but to allow # JavaScript behavior we must simulate it. class _undefined_class(object): """Represents the ECMAScript 'undefined' value.""" __slots__ = [] def __repr__(self): return self.__module__ + '.undefined' def __str__(self): return 'undefined' def __nonzero__(self): return False undefined = _undefined_class() del _undefined_class # ---------------------------------------------------------------------- # Non-Numbers: NaN, Infinity, -Infinity # # ECMAScript has official support for non-number floats, although # strict JSON does not. Python doesn't either. So to support the # full JavaScript behavior we must try to add them into Python, which # is unfortunately a bit of black magic. If our python implementation # happens to be built on top of IEEE 754 we can probably trick python # into using real floats. Otherwise we must simulate it with classes. def _nonnumber_float_constants(): """Try to return the Nan, Infinity, and -Infinity float values. This is unnecessarily complex because there is no standard platform- independent way to do this in Python as the language (opposed to some implementation of it) doesn't discuss non-numbers. We try various strategies from the best to the worst. If this Python interpreter uses the IEEE 754 floating point standard then the returned values will probably be real instances of the 'float' type. Otherwise a custom class object is returned which will attempt to simulate the correct behavior as much as possible. """ try: # First, try (mostly portable) float constructor. Works under # Linux x86 (gcc) and some Unices. nan = float('nan') inf = float('inf') neginf = float('-inf') except ValueError: try: # Try the AIX (PowerPC) float constructors nan = float('NaNQ') inf = float('INF') neginf = float('-INF') except ValueError: try: # Next, try binary unpacking. Should work under # platforms using IEEE 754 floating point. import struct, sys xnan = '7ff8000000000000'.decode('hex') # Quiet NaN xinf = '7ff0000000000000'.decode('hex') xcheck = 'bdc145651592979d'.decode('hex') # -3.14159e-11 # Could use float.__getformat__, but it is a new python feature, # so we use sys.byteorder. if sys.byteorder == 'big': nan = struct.unpack('d', xnan)[0] inf = struct.unpack('d', xinf)[0] check = struct.unpack('d', xcheck)[0] else: nan = struct.unpack('d', xnan[::-1])[0] inf = struct.unpack('d', xinf[::-1])[0] check = struct.unpack('d', xcheck[::-1])[0] neginf = - inf if check != -3.14159e-11: raise ValueError('Unpacking raw IEEE 754 floats does not work') except (ValueError, TypeError): # Punt, make some fake classes to simulate. These are # not perfect though. For instance nan * 1.0 == nan, # as expected, but 1.0 * nan == 0.0, which is wrong. class nan(float): """An approximation of the NaN (not a number) floating point number.""" def __repr__(self): return 'nan' def __str__(self): return 'nan' def __add__(self,x): return self def __radd__(self,x): return self def __sub__(self,x): return self def __rsub__(self,x): return self def __mul__(self,x): return self def __rmul__(self,x): return self def __div__(self,x): return self def __rdiv__(self,x): return self def __divmod__(self,x): return (self,self) def __rdivmod__(self,x): return (self,self) def __mod__(self,x): return self def __rmod__(self,x): return self def __pow__(self,exp): return self def __rpow__(self,exp): return self def __neg__(self): return self def __pos__(self): return self def __abs__(self): return self def __lt__(self,x): return False def __le__(self,x): return False def __eq__(self,x): return False def __neq__(self,x): return True def __ge__(self,x): return False def __gt__(self,x): return False def __complex__(self,*a): raise NotImplementedError('NaN can not be converted to a complex') if decimal: nan = decimal.Decimal('NaN') else: nan = nan() class inf(float): """An approximation of the +Infinity floating point number.""" def __repr__(self): return 'inf' def __str__(self): return 'inf' def __add__(self,x): return self def __radd__(self,x): return self def __sub__(self,x): return self def __rsub__(self,x): return self def __mul__(self,x): if x is neginf or x < 0: return neginf elif x == 0: return nan else: return self def __rmul__(self,x): return self.__mul__(x) def __div__(self,x): if x == 0: raise ZeroDivisionError('float division') elif x < 0: return neginf else: return self def __rdiv__(self,x): if x is inf or x is neginf or x is nan: return nan return 0.0 def __divmod__(self,x): if x == 0: raise ZeroDivisionError('float divmod()') elif x < 0: return (nan,nan) else: return (self,self) def __rdivmod__(self,x): if x is inf or x is neginf or x is nan: return (nan, nan) return (0.0, x) def __mod__(self,x): if x == 0: raise ZeroDivisionError('float modulo') else: return nan def __rmod__(self,x): if x is inf or x is neginf or x is nan: return nan return x def __pow__(self, exp): if exp == 0: return 1.0 else: return self def __rpow__(self, x): if -1 < x < 1: return 0.0 elif x == 1.0: return 1.0 elif x is nan or x is neginf or x < 0: return nan else: return self def __neg__(self): return neginf def __pos__(self): return self def __abs__(self): return self def __lt__(self,x): return False def __le__(self,x): if x is self: return True else: return False def __eq__(self,x): if x is self: return True else: return False def __neq__(self,x): if x is self: return False else: return True def __ge__(self,x): return True def __gt__(self,x): return True def __complex__(self,*a): raise NotImplementedError('Infinity can not be converted to a complex') if decimal: inf = decimal.Decimal('Infinity') else: inf = inf() class neginf(float): """An approximation of the -Infinity floating point number.""" def __repr__(self): return '-inf' def __str__(self): return '-inf' def __add__(self,x): return self def __radd__(self,x): return self def __sub__(self,x): return self def __rsub__(self,x): return self def __mul__(self,x): if x is self or x < 0: return inf elif x == 0: return nan else: return self def __rmul__(self,x): return self.__mul__(self) def __div__(self,x): if x == 0: raise ZeroDivisionError('float division') elif x < 0: return inf else: return self def __rdiv__(self,x): if x is inf or x is neginf or x is nan: return nan return -0.0 def __divmod__(self,x): if x == 0: raise ZeroDivisionError('float divmod()') elif x < 0: return (nan,nan) else: return (self,self) def __rdivmod__(self,x): if x is inf or x is neginf or x is nan: return (nan, nan) return (-0.0, x) def __mod__(self,x): if x == 0: raise ZeroDivisionError('float modulo') else: return nan def __rmod__(self,x): if x is inf or x is neginf or x is nan: return nan return x def __pow__(self,exp): if exp == 0: return 1.0 else: return self def __rpow__(self, x): if x is nan or x is inf or x is inf: return nan return 0.0 def __neg__(self): return inf def __pos__(self): return self def __abs__(self): return inf def __lt__(self,x): return True def __le__(self,x): return True def __eq__(self,x): if x is self: return True else: return False def __neq__(self,x): if x is self: return False else: return True def __ge__(self,x): if x is self: return True else: return False def __gt__(self,x): return False def __complex__(self,*a): raise NotImplementedError('-Infinity can not be converted to a complex') if decimal: neginf = decimal.Decimal('-Infinity') else: neginf = neginf(0) return nan, inf, neginf nan, inf, neginf = _nonnumber_float_constants() del _nonnumber_float_constants # ---------------------------------------------------------------------- # String processing helpers unsafe_string_chars = '"\\' + ''.join([chr(i) for i in range(0x20)]) def skipstringsafe( s, start=0, end=None ): i = start #if end is None: # end = len(s) while i < end and s[i] not in unsafe_string_chars: #c = s[i] #if c in unsafe_string_chars: # break i += 1 return i def skipstringsafe_slow( s, start=0, end=None ): i = start if end is None: end = len(s) while i < end: c = s[i] if c == '"' or c == '\\' or ord(c) <= 0x1f: break i += 1 return i def extend_list_with_sep( orig_seq, extension_seq, sepchar='' ): if not sepchar: orig_seq.extend( extension_seq ) else: for i, x in enumerate(extension_seq): if i > 0: orig_seq.append( sepchar ) orig_seq.append( x ) def extend_and_flatten_list_with_sep( orig_seq, extension_seq, separator='' ): for i, part in enumerate(extension_seq): if i > 0 and separator: orig_seq.append( separator ) orig_seq.extend( part ) # ---------------------------------------------------------------------- # Unicode helpers # # JSON requires that all JSON implementations must support the UTF-32 # encoding (as well as UTF-8 and UTF-16). But earlier versions of # Python did not provide a UTF-32 codec. So we must implement UTF-32 # ourselves in case we need it. def utf32le_encode( obj, errors='strict' ): """Encodes a Unicode string into a UTF-32LE encoded byte string.""" import struct try: import cStringIO as sio except ImportError: import StringIO as sio f = sio.StringIO() write = f.write pack = struct.pack for c in obj: n = ord(c) if 0xD800 <= n <= 0xDFFF: # surrogate codepoints are prohibited by UTF-32 if errors == 'ignore': continue elif errors == 'replace': n = ord('?') else: cname = 'U+%04X'%n raise UnicodeError('UTF-32 can not encode surrogate characters',cname) write( pack('L', n) ) return f.getvalue() def utf32le_decode( obj, errors='strict' ): """Decodes a UTF-32LE byte string into a Unicode string.""" if len(obj) % 4 != 0: raise UnicodeError('UTF-32 decode error, data length not a multiple of 4 bytes') import struct unpack = struct.unpack chars = [] i = 0 for i in range(0, len(obj), 4): seq = obj[i:i+4] n = unpack('L',seq)[0] chars.append( unichr(n) ) return u''.join( chars ) def auto_unicode_decode( s ): """Takes a string and tries to convert it to a Unicode string. This will return a Python unicode string type corresponding to the input string (either str or unicode). The character encoding is guessed by looking for either a Unicode BOM prefix, or by the rules specified by RFC 4627. When in doubt it is assumed the input is encoded in UTF-8 (the default for JSON). """ if isinstance(s, unicode): return s if len(s) < 4: return s.decode('utf8') # not enough bytes, assume default of utf-8 # Look for BOM marker import codecs bom2 = s[:2] bom4 = s[:4] a, b, c, d = map(ord, s[:4]) # values of first four bytes if bom4 == codecs.BOM_UTF32_LE: encoding = 'utf-32le' s = s[4:] elif bom4 == codecs.BOM_UTF32_BE: encoding = 'utf-32be' s = s[4:] elif bom2 == codecs.BOM_UTF16_LE: encoding = 'utf-16le' s = s[2:] elif bom2 == codecs.BOM_UTF16_BE: encoding = 'utf-16be' s = s[2:] # No BOM, so autodetect encoding used by looking at first four bytes # according to RFC 4627 section 3. elif a==0 and b==0 and c==0 and d!=0: # UTF-32BE encoding = 'utf-32be' elif a==0 and b!=0 and c==0 and d!=0: # UTF-16BE encoding = 'utf-16be' elif a!=0 and b==0 and c==0 and d==0: # UTF-32LE encoding = 'utf-32le' elif a!=0 and b==0 and c!=0 and d==0: # UTF-16LE encoding = 'utf-16le' else: #if a!=0 and b!=0 and c!=0 and d!=0: # UTF-8 # JSON spec says default is UTF-8, so always guess it # if we can't guess otherwise encoding = 'utf8' # Make sure the encoding is supported by Python try: cdk = codecs.lookup(encoding) except LookupError: if encoding.startswith('utf-32') \ or encoding.startswith('ucs4') \ or encoding.startswith('ucs-4'): # Python doesn't natively have a UTF-32 codec, but JSON # requires that it be supported. So we must decode these # manually. if encoding.endswith('le'): unis = utf32le_decode(s) else: unis = utf32be_decode(s) else: raise JSONDecodeError('this python has no codec for this character encoding',encoding) else: # Convert to unicode using a standard codec unis = s.decode(encoding) return unis def surrogate_pair_as_unicode( c1, c2 ): """Takes a pair of unicode surrogates and returns the equivalent unicode character. The input pair must be a surrogate pair, with c1 in the range U+D800 to U+DBFF and c2 in the range U+DC00 to U+DFFF. """ n1, n2 = ord(c1), ord(c2) if n1 < 0xD800 or n1 > 0xDBFF or n2 < 0xDC00 or n2 > 0xDFFF: raise JSONDecodeError('illegal Unicode surrogate pair',(c1,c2)) a = n1 - 0xD800 b = n2 - 0xDC00 v = (a << 10) | b v += 0x10000 return unichr(v) def unicode_as_surrogate_pair( c ): """Takes a single unicode character and returns a sequence of surrogate pairs. The output of this function is a tuple consisting of one or two unicode characters, such that if the input character is outside the BMP range then the output is a two-character surrogate pair representing that character. If the input character is inside the BMP then the output tuple will have just a single character...the same one. """ n = ord(c) if n < 0x10000: return (unichr(n),) # in BMP, surrogate pair not required v = n - 0x10000 vh = (v >> 10) & 0x3ff # highest 10 bits vl = v & 0x3ff # lowest 10 bits w1 = 0xD800 | vh w2 = 0xDC00 | vl return (unichr(w1), unichr(w2)) # ---------------------------------------------------------------------- # Type identification def isnumbertype( obj ): """Is the object of a Python number type (excluding complex)?""" return isinstance(obj, (int,long,float)) \ and not isinstance(obj, bool) \ or obj is nan or obj is inf or obj is neginf def isstringtype( obj ): """Is the object of a Python string type?""" if isinstance(obj, basestring): return True # Must also check for some other pseudo-string types import types, UserString return isinstance(obj, types.StringTypes) \ or isinstance(obj, UserString.UserString) \ or isinstance(obj, UserString.MutableString) # ---------------------------------------------------------------------- # Numeric helpers def decode_hex( hexstring ): """Decodes a hexadecimal string into it's integer value.""" # We don't use the builtin 'hex' codec in python since it can # not handle odd numbers of digits, nor raise the same type # of exceptions we want to. n = 0 for c in hexstring: if '0' <= c <= '9': d = ord(c) - ord('0') elif 'a' <= c <= 'f': d = ord(c) - ord('a') + 10 elif 'A' <= c <= 'F': d = ord(c) - ord('A') + 10 else: raise JSONDecodeError('not a hexadecimal number',hexstring) # Could use ((n << 4 ) | d), but python 2.3 issues a FutureWarning. n = (n * 16) + d return n def decode_octal( octalstring ): """Decodes an octal string into it's integer value.""" n = 0 for c in octalstring: if '0' <= c <= '7': d = ord(c) - ord('0') else: raise JSONDecodeError('not an octal number',octalstring) # Could use ((n << 3 ) | d), but python 2.3 issues a FutureWarning. n = (n * 8) + d return n # ---------------------------------------------------------------------- # Exception classes. class JSONError(ValueError): """Our base class for all JSON-related errors. """ def pretty_description(self): err = self.args[0] if len(self.args) > 1: err += ': ' for anum, a in enumerate(self.args[1:]): if anum > 1: err += ', ' astr = repr(a) if len(astr) > 20: astr = astr[:20] + '...' err += astr return err class JSONDecodeError(JSONError): """An exception class raised when a JSON decoding error (syntax error) occurs.""" class JSONEncodeError(JSONError): """An exception class raised when a python object can not be encoded as a JSON string.""" #---------------------------------------------------------------------- # The main JSON encoder/decoder class. class JSON(object): """An encoder/decoder for JSON data streams. Usually you will call the encode() or decode() methods. The other methods are for lower-level processing. Whether the JSON parser runs in strict mode (which enforces exact compliance with the JSON spec) or the more forgiving non-string mode can be affected by setting the 'strict' argument in the object's initialization; or by assigning True or False to the 'strict' property of the object. You can also adjust a finer-grained control over strictness by allowing or preventing specific behaviors. You can get a list of all the available behaviors by accessing the 'behaviors' property. Likewise the allowed_behaviors and prevented_behaviors list which behaviors will be allowed and which will not. Call the allow() or prevent() methods to adjust these. """ _escapes_json = { # character escapes in JSON '"': '"', '/': '/', '\\': '\\', 'b': '\b', 'f': '\f', 'n': '\n', 'r': '\r', 't': '\t', } _escapes_js = { # character escapes in Javascript '"': '"', '\'': '\'', '\\': '\\', 'b': '\b', 'f': '\f', 'n': '\n', 'r': '\r', 't': '\t', 'v': '\v', '0': '\x00' } # Following is a reverse mapping of escape characters, used when we # output JSON. Only those escapes which are always safe (e.g., in JSON) # are here. It won't hurt if we leave questionable ones out. _rev_escapes = {'\n': '\\n', '\t': '\\t', '\b': '\\b', '\r': '\\r', '\f': '\\f', '"': '\\"', '\\': '\\\\'} def __init__(self, strict=False, compactly=True, escape_unicode=False): """Creates a JSON encoder/decoder object. If 'strict' is set to True, then only strictly-conforming JSON output will be produced. Note that this means that some types of values may not be convertable and will result in a JSONEncodeError exception. If 'compactly' is set to True, then the resulting string will have all extraneous white space removed; if False then the string will be "pretty printed" with whitespace and indentation added to make it more readable. If 'escape_unicode' is set to True, then all non-ASCII characters will be represented as a unicode escape sequence; if False then the actual real unicode character will be inserted if possible. The 'escape_unicode' can also be a function, which when called with a single argument of a unicode character will return True if the character should be escaped or False if it should not. If you wish to extend the encoding to ba able to handle additional types, you should subclass this class and override the encode_default() method. """ import sys self._set_strictness(strict) self._encode_compactly = compactly try: # see if we were passed a predicate function b = escape_unicode(u'A') self._encode_unicode_as_escapes = escape_unicode except (ValueError, NameError, TypeError): # Just set to True or False. We could use lambda x:True # to make it more consistent (always a function), but it # will be too slow, so we'll make explicit tests later. self._encode_unicode_as_escapes = bool(escape_unicode) self._sort_dictionary_keys = True # The following is a boolean map of the first 256 characters # which will quickly tell us which of those characters never # need to be escaped. self._asciiencodable = [32 <= c < 128 and not self._rev_escapes.has_key(chr(c)) for c in range(0,255)] def _set_strictness(self, strict): """Changes the strictness behavior. Pass True to be very strict about JSON syntax, or False to be looser. """ self._allow_any_type_at_start = not strict self._allow_all_numeric_signs = not strict self._allow_comments = not strict self._allow_control_char_in_string = not strict self._allow_hex_numbers = not strict self._allow_initial_decimal_point = not strict self._allow_js_string_escapes = not strict self._allow_non_numbers = not strict self._allow_nonescape_characters = not strict # "\z" -> "z" self._allow_nonstring_keys = not strict self._allow_omitted_array_elements = not strict self._allow_single_quoted_strings = not strict self._allow_trailing_comma_in_literal = not strict self._allow_undefined_values = not strict self._allow_unicode_format_control_chars = not strict self._allow_unicode_whitespace = not strict # Always disable this by default self._allow_octal_numbers = False def allow(self, behavior): """Allow the specified behavior (turn off a strictness check). The list of all possible behaviors is available in the behaviors property. You can see which behaviors are currently allowed by accessing the allowed_behaviors property. """ p = '_allow_' + behavior if hasattr(self, p): setattr(self, p, True) else: raise AttributeError('Behavior is not known',behavior) def prevent(self, behavior): """Prevent the specified behavior (turn on a strictness check). The list of all possible behaviors is available in the behaviors property. You can see which behaviors are currently prevented by accessing the prevented_behaviors property. """ p = '_allow_' + behavior if hasattr(self, p): setattr(self, p, False) else: raise AttributeError('Behavior is not known',behavior) def _get_behaviors(self): return sorted([ n[len('_allow_'):] for n in self.__dict__ \ if n.startswith('_allow_')]) behaviors = property(_get_behaviors, doc='List of known behaviors that can be passed to allow() or prevent() methods') def _get_allowed_behaviors(self): return sorted([ n[len('_allow_'):] for n in self.__dict__ \ if n.startswith('_allow_') and getattr(self,n)]) allowed_behaviors = property(_get_allowed_behaviors, doc='List of known behaviors that are currently allowed') def _get_prevented_behaviors(self): return sorted([ n[len('_allow_'):] for n in self.__dict__ \ if n.startswith('_allow_') and not getattr(self,n)]) prevented_behaviors = property(_get_prevented_behaviors, doc='List of known behaviors that are currently prevented') def _is_strict(self): return not self.allowed_behaviors strict = property(_is_strict, _set_strictness, doc='True if adherence to RFC 4627 syntax is strict, or False is more generous ECMAScript syntax is permitted') def isws(self, c): """Determines if the given character is considered as white space. Note that Javscript is much more permissive on what it considers to be whitespace than does JSON. Ref. ECMAScript section 7.2 """ if not self._allow_unicode_whitespace: return c in ' \t\n\r' else: if not isinstance(c,unicode): c = unicode(c) if c in u' \t\n\r\f\v': return True import unicodedata return unicodedata.category(c) == 'Zs' def islineterm(self, c): """Determines if the given character is considered a line terminator. Ref. ECMAScript section 7.3 """ if c == '\r' or c == '\n': return True if c == u'\u2028' or c == u'\u2029': # unicodedata.category(c) in ['Zl', 'Zp'] return True return False def strip_format_control_chars(self, txt): """Filters out all Unicode format control characters from the string. ECMAScript permits any Unicode "format control characters" to appear at any place in the source code. They are to be ignored as if they are not there before any other lexical tokenization occurs. Note that JSON does not allow them. Ref. ECMAScript section 7.1. """ import unicodedata txt2 = filter( lambda c: unicodedata.category(unicode(c)) != 'Cf', txt ) return txt2 def decode_null(self, s, i=0): """Intermediate-level decoder for ECMAScript 'null' keyword. Takes a string and a starting index, and returns a Python None object and the index of the next unparsed character. """ if i < len(s) and s[i:i+4] == 'null': return None, i+4 raise JSONDecodeError('literal is not the JSON "null" keyword', s) def encode_undefined(self): """Produces the ECMAScript 'undefined' keyword.""" return 'undefined' def encode_null(self): """Produces the JSON 'null' keyword.""" return 'null' def decode_boolean(self, s, i=0): """Intermediate-level decode for JSON boolean literals. Takes a string and a starting index, and returns a Python bool (True or False) and the index of the next unparsed character. """ if s[i:i+4] == 'true': return True, i+4 elif s[i:i+5] == 'false': return False, i+5 raise JSONDecodeError('literal value is not a JSON boolean keyword',s) def encode_boolean(self, b): """Encodes the Python boolean into a JSON Boolean literal.""" if bool(b): return 'true' return 'false' def decode_number(self, s, i=0, imax=None): """Intermediate-level decoder for JSON numeric literals. Takes a string and a starting index, and returns a Python suitable numeric type and the index of the next unparsed character. The returned numeric type can be either of a Python int, long, or float. In addition some special non-numbers may also be returned such as nan, inf, and neginf (technically which are Python floats, but have no numeric value.) Ref. ECMAScript section 8.5. """ if imax is None: imax = len(s) # Detect initial sign character(s) if not self._allow_all_numeric_signs: if s[i] == '+' or (s[i] == '-' and i+1 < imax and \ s[i+1] in '+-'): raise JSONDecodeError('numbers in strict JSON may only have a single "-" as a sign prefix',s[i:]) sign = +1 j = i # j will point after the sign prefix while j < imax and s[j] in '+-': if s[j] == '-': sign = sign * -1 j += 1 # Check for ECMAScript symbolic non-numbers if s[j:j+3] == 'NaN': if self._allow_non_numbers: return nan, j+3 else: raise JSONDecodeError('NaN literals are not allowed in strict JSON') elif s[j:j+8] == 'Infinity': if self._allow_non_numbers: if sign < 0: return neginf, j+8 else: return inf, j+8 else: raise JSONDecodeError('Infinity literals are not allowed in strict JSON') elif s[j:j+2] in ('0x','0X'): if self._allow_hex_numbers: k = j+2 while k < imax and s[k] in hexdigits: k += 1 n = sign * decode_hex( s[j+2:k] ) return n, k else: raise JSONDecodeError('hexadecimal literals are not allowed in strict JSON',s[i:]) else: # Decimal (or octal) number, find end of number. # General syntax is: \d+[\.\d+][e[+-]?\d+] k = j # will point to end of digit sequence could_be_octal = ( k+1 < imax and s[k] == '0' ) # first digit is 0 decpt = None # index into number of the decimal point, if any ept = None # index into number of the e|E exponent start, if any esign = '+' # sign of exponent sigdigits = 0 # number of significant digits (approx, counts end zeros) while k < imax and (s[k].isdigit() or s[k] in '.+-eE'): c = s[k] if c not in octaldigits: could_be_octal = False if c == '.': if decpt is not None or ept is not None: break else: decpt = k-j elif c in 'eE': if ept is not None: break else: ept = k-j elif c in '+-': if not ept: break esign = c else: #digit if not ept: sigdigits += 1 k += 1 number = s[j:k] # The entire number as a string #print 'NUMBER IS: ', repr(number), ', sign', sign, ', esign', esign, \ # ', sigdigits', sigdigits, \ # ', decpt', decpt, ', ept', ept # Handle octal integers first as an exception. If octal # is not enabled (the ECMAScipt standard) then just do # nothing and treat the string as a decimal number. if could_be_octal and self._allow_octal_numbers: n = sign * decode_octal( number ) return n, k # A decimal number. Do a quick check on JSON syntax restrictions. if number[0] == '.' and not self._allow_initial_decimal_point: raise JSONDecodeError('numbers in strict JSON must have at least one digit before the decimal point',s[i:]) elif number[0] == '0' and \ len(number) > 1 and number[1].isdigit(): if self._allow_octal_numbers: raise JSONDecodeError('initial zero digit is only allowed for octal integers',s[i:]) else: raise JSONDecodeError('initial zero digit must not be followed by other digits (octal numbers are not permitted)',s[i:]) # Make sure decimal point is followed by a digit if decpt is not None: if decpt+1 >= len(number) or not number[decpt+1].isdigit(): raise JSONDecodeError('decimal point must be followed by at least one digit',s[i:]) # Determine the exponential part if ept is not None: if ept+1 >= len(number): raise JSONDecodeError('exponent in number is truncated',s[i:]) try: exponent = int(number[ept+1:]) except ValueError: raise JSONDecodeError('not a valid exponent in number',s[i:]) ##print 'EXPONENT', exponent else: exponent = 0 # Try to make an int/long first. if decpt is None and exponent >= 0: # An integer if ept: n = int(number[:ept]) else: n = int(number) n *= sign if exponent: n *= 10**exponent if n == 0 and sign < 0: # minus zero, must preserve negative sign so make a float n = -0.0 else: try: if decimal and (abs(exponent) > float_maxexp or sigdigits > float_sigdigits): try: n = decimal.Decimal(number) n = n.normalize() except decimal.Overflow: if sign<0: n = neginf else: n = inf else: n *= sign else: n = float(number) * sign except ValueError: raise JSONDecodeError('not a valid JSON numeric literal', s[i:j]) return n, k def encode_number(self, n): """Encodes a Python numeric type into a JSON numeric literal. The special non-numeric values of float('nan'), float('inf') and float('-inf') are translated into appropriate JSON literals. Note that Python complex types are not handled, as there is no ECMAScript equivalent type. """ if isinstance(n, complex): if n.imag: raise JSONEncodeError('Can not encode a complex number that has a non-zero imaginary part',n) n = n.real if isinstance(n, (int,long)): return str(n) if decimal and isinstance(n, decimal.Decimal): return str(n) global nan, inf, neginf if n is nan: return 'NaN' elif n is inf: return 'Infinity' elif n is neginf: return '-Infinity' elif isinstance(n, float): # Check for non-numbers. # In python nan == inf == -inf, so must use repr() to distinguish reprn = repr(n).lower() if ('inf' in reprn and '-' in reprn) or n == neginf: return '-Infinity' elif 'inf' in reprn or n is inf: return 'Infinity' elif 'nan' in reprn or n is nan: return 'NaN' return repr(n) else: raise TypeError('encode_number expected an integral, float, or decimal number type',type(n)) def decode_string(self, s, i=0, imax=None): """Intermediate-level decoder for JSON string literals. Takes a string and a starting index, and returns a Python string (or unicode string) and the index of the next unparsed character. """ if imax is None: imax = len(s) if imax < i+2 or s[i] not in '"\'': raise JSONDecodeError('string literal must be properly quoted',s[i:]) closer = s[i] if closer == '\'' and not self._allow_single_quoted_strings: raise JSONDecodeError('string literals must use double quotation marks in strict JSON',s[i:]) i += 1 # skip quote if self._allow_js_string_escapes: escapes = self._escapes_js else: escapes = self._escapes_json ccallowed = self._allow_control_char_in_string chunks = [] _append = chunks.append done = False high_surrogate = None while i < imax: c = s[i] # Make sure a high surrogate is immediately followed by a low surrogate if high_surrogate and (i+1 >= imax or s[i:i+2] != '\\u'): raise JSONDecodeError('High unicode surrogate must be followed by a low surrogate',s[i:]) if c == closer: i += 1 # skip end quote done = True break elif c == '\\': # Escaped character i += 1 if i >= imax: raise JSONDecodeError('escape in string literal is incomplete',s[i-1:]) c = s[i] if '0' <= c <= '7' and self._allow_octal_numbers: # Handle octal escape codes first so special \0 doesn't kick in yet. # Follow Annex B.1.2 of ECMAScript standard. if '0' <= c <= '3': maxdigits = 3 else: maxdigits = 2 for k in range(i, i+maxdigits+1): if k >= imax or s[k] not in octaldigits: break n = decode_octal(s[i:k]) if n < 128: _append( chr(n) ) else: _append( unichr(n) ) i = k continue if escapes.has_key(c): _append(escapes[c]) i += 1 elif c == 'u' or c == 'x': i += 1 if c == 'u': digits = 4 else: # c== 'x' if not self._allow_js_string_escapes: raise JSONDecodeError(r'string literals may not use the \x hex-escape in strict JSON',s[i-1:]) digits = 2 if i+digits >= imax: raise JSONDecodeError('numeric character escape sequence is truncated',s[i-1:]) n = decode_hex( s[i:i+digits] ) if high_surrogate: # Decode surrogate pair and clear high surrogate _append( surrogate_pair_as_unicode( high_surrogate, unichr(n) ) ) high_surrogate = None elif n < 128: # ASCII chars always go in as a str _append( chr(n) ) elif 0xd800 <= n <= 0xdbff: # high surrogate if imax < i + digits + 2 or s[i+digits] != '\\' or s[i+digits+1] != 'u': raise JSONDecodeError('High unicode surrogate must be followed by a low surrogate',s[i-2:]) high_surrogate = unichr(n) # remember until we get to the low surrogate elif 0xdc00 <= n <= 0xdfff: # low surrogate raise JSONDecodeError('Low unicode surrogate must be proceeded by a high surrogate',s[i-2:]) else: # Other chars go in as a unicode char _append( unichr(n) ) i += digits else: # Unknown escape sequence if self._allow_nonescape_characters: _append( c ) i += 1 else: raise JSONDecodeError('unsupported escape code in JSON string literal',s[i-1:]) elif ord(c) <= 0x1f: # A control character if self.islineterm(c): raise JSONDecodeError('line terminator characters must be escaped inside string literals',s[i:]) elif ccallowed: _append( c ) i += 1 else: raise JSONDecodeError('control characters must be escaped inside JSON string literals',s[i:]) else: # A normal character; not an escape sequence or end-quote. # Find a whole sequence of "safe" characters so we can append them # all at once rather than one a time, for speed. j = i i += 1 while i < imax and s[i] not in unsafe_string_chars and s[i] != closer: i += 1 _append(s[j:i]) if not done: raise JSONDecodeError('string literal is not terminated with a quotation mark',s) s = ''.join( chunks ) return s, i def encode_string(self, s): """Encodes a Python string into a JSON string literal. """ # Must handle instances of UserString specially in order to be # able to use ord() on it's simulated "characters". import UserString if isinstance(s, (UserString.UserString, UserString.MutableString)): def tochar(c): return c.data else: # Could use "lambda c:c", but that is too slow. So we set to None # and use an explicit if test inside the loop. tochar = None chunks = [] chunks.append('"') revesc = self._rev_escapes asciiencodable = self._asciiencodable encunicode = self._encode_unicode_as_escapes i = 0 imax = len(s) while i < imax: if tochar: c = tochar(s[i]) else: c = s[i] cord = ord(c) if cord < 256 and asciiencodable[cord] and isinstance(encunicode, bool): # Contiguous runs of plain old printable ASCII can be copied # directly to the JSON output without worry (unless the user # has supplied a custom is-encodable function). j = i i += 1 while i < imax: if tochar: c = tochar(s[i]) else: c = s[i] cord = ord(c) if cord < 256 and asciiencodable[cord]: i += 1 else: break chunks.append( unicode(s[j:i]) ) elif revesc.has_key(c): # Has a shortcut escape sequence, like "\n" chunks.append(revesc[c]) i += 1 elif cord <= 0x1F: # Always unicode escape ASCII-control characters chunks.append(r'\u%04x' % cord) i += 1 elif 0xD800 <= cord <= 0xDFFF: # A raw surrogate character! This should never happen # and there's no way to include it in the JSON output. # So all we can do is complain. cname = 'U+%04X' % cord raise JSONEncodeError('can not include or escape a Unicode surrogate character',cname) elif cord <= 0xFFFF: # Other BMP Unicode character if isinstance(encunicode, bool): doesc = encunicode else: doesc = encunicode( c ) if doesc: chunks.append(r'\u%04x' % cord) else: chunks.append( c ) i += 1 else: # ord(c) >= 0x10000 # Non-BMP Unicode if isinstance(encunicode, bool): doesc = encunicode else: doesc = encunicode( c ) if doesc: for surrogate in unicode_as_surrogate_pair(c): chunks.append(r'\u%04x' % ord(surrogate)) else: chunks.append( c ) i += 1 chunks.append('"') return ''.join( chunks ) def skip_comment(self, txt, i=0): """Skips an ECMAScript comment, either // or /* style. The contents of the comment are returned as a string, as well as the index of the character immediately after the comment. """ if i+1 >= len(txt) or txt[i] != '/' or txt[i+1] not in '/*': return None, i if not self._allow_comments: raise JSONDecodeError('comments are not allowed in strict JSON',txt[i:]) multiline = (txt[i+1] == '*') istart = i i += 2 while i < len(txt): if multiline: if txt[i] == '*' and i+1 < len(txt) and txt[i+1] == '/': j = i+2 break elif txt[i] == '/' and i+1 < len(txt) and txt[i+1] == '*': raise JSONDecodeError('multiline /* */ comments may not nest',txt[istart:i+1]) else: if self.islineterm(txt[i]): j = i # line terminator is not part of comment break i += 1 if i >= len(txt): if not multiline: j = len(txt) # // comment terminated by end of file is okay else: raise JSONDecodeError('comment was never terminated',txt[istart:]) return txt[istart:j], j def skipws(self, txt, i=0, imax=None, skip_comments=True): """Skips whitespace. """ if not self._allow_comments and not self._allow_unicode_whitespace: if imax is None: imax = len(txt) while i < imax and txt[i] in ' \r\n\t': i += 1 return i else: return self.skipws_any(txt, i, imax, skip_comments) def skipws_any(self, txt, i=0, imax=None, skip_comments=True): """Skips all whitespace, including comments and unicode whitespace Takes a string and a starting index, and returns the index of the next non-whitespace character. If skip_comments is True and not running in strict JSON mode, then comments will be skipped over just like whitespace. """ if imax is None: imax = len(txt) while i < imax: if txt[i] == '/': cmt, i = self.skip_comment(txt, i) if i < imax and self.isws(txt[i]): i += 1 else: break return i def decode_composite(self, txt, i=0, imax=None): """Intermediate-level JSON decoder for composite literal types (array and object). Takes text and a starting index, and returns either a Python list or dictionary and the index of the next unparsed character. """ if imax is None: imax = len(txt) i = self.skipws(txt, i, imax) starti = i if i >= imax or txt[i] not in '{[': raise JSONDecodeError('composite object must start with "[" or "{"',txt[i:]) if txt[i] == '[': isdict = False closer = ']' obj = [] else: isdict = True closer = '}' obj = {} i += 1 # skip opener i = self.skipws(txt, i, imax) if i < imax and txt[i] == closer: # empty composite i += 1 done = True else: saw_value = False # set to false at beginning and after commas done = False while i < imax: i = self.skipws(txt, i, imax) if i < imax and (txt[i] == ',' or txt[i] == closer): c = txt[i] i += 1 if c == ',': if not saw_value: # no preceeding value, an elided (omitted) element if isdict: raise JSONDecodeError('can not omit elements of an object (dictionary)') if self._allow_omitted_array_elements: if self._allow_undefined_values: obj.append( undefined ) else: obj.append( None ) else: raise JSONDecodeError('strict JSON does not permit omitted array (list) elements',txt[i:]) saw_value = False continue else: # c == closer if not saw_value and not self._allow_trailing_comma_in_literal: if isdict: raise JSONDecodeError('strict JSON does not allow a final comma in an object (dictionary) literal',txt[i-2:]) else: raise JSONDecodeError('strict JSON does not allow a final comma in an array (list) literal',txt[i-2:]) done = True break # Decode the item if isdict and self._allow_nonstring_keys: r = self.decodeobj(txt, i, identifier_as_string=True) else: r = self.decodeobj(txt, i, identifier_as_string=False) if r: if saw_value: # two values without a separating comma raise JSONDecodeError('values must be separated by a comma', txt[i:r[1]]) saw_value = True i = self.skipws(txt, r[1], imax) if isdict: key = r[0] # Ref 11.1.5 if not isstringtype(key): if isnumbertype(key): if not self._allow_nonstring_keys: raise JSONDecodeError('strict JSON only permits string literals as object properties (dictionary keys)',txt[starti:]) else: raise JSONDecodeError('object properties (dictionary keys) must be either string literals or numbers',txt[starti:]) if i >= imax or txt[i] != ':': raise JSONDecodeError('object property (dictionary key) has no value, expected ":"',txt[starti:]) i += 1 i = self.skipws(txt, i, imax) rval = self.decodeobj(txt, i) if rval: i = self.skipws(txt, rval[1], imax) obj[key] = rval[0] else: raise JSONDecodeError('object property (dictionary key) has no value',txt[starti:]) else: # list obj.append( r[0] ) else: # not r if isdict: raise JSONDecodeError('expected a value, or "}"',txt[i:]) elif not self._allow_omitted_array_elements: raise JSONDecodeError('expected a value or "]"',txt[i:]) else: raise JSONDecodeError('expected a value, "," or "]"',txt[i:]) # end while if not done: if isdict: raise JSONDecodeError('object literal (dictionary) is not terminated',txt[starti:]) else: raise JSONDecodeError('array literal (list) is not terminated',txt[starti:]) return obj, i def decode_javascript_identifier(self, name): """Convert a JavaScript identifier into a Python string object. This method can be overriden by a subclass to redefine how JavaScript identifiers are turned into Python objects. By default this just converts them into strings. """ return name def decodeobj(self, txt, i=0, imax=None, identifier_as_string=False, only_object_or_array=False): """Intermediate-level JSON decoder. Takes a string and a starting index, and returns a two-tuple consting of a Python object and the index of the next unparsed character. If there is no value at all (empty string, etc), the None is returned instead of a tuple. """ if imax is None: imax = len(txt) obj = None i = self.skipws(txt, i, imax) if i >= imax: raise JSONDecodeError('Unexpected end of input') c = txt[i] if c == '[' or c == '{': obj, i = self.decode_composite(txt, i, imax) elif only_object_or_array: raise JSONDecodeError('JSON document must start with an object or array type only', txt[i:i+20]) elif c == '"' or c == '\'': obj, i = self.decode_string(txt, i, imax) elif c.isdigit() or c in '.+-': obj, i = self.decode_number(txt, i, imax) elif c.isalpha() or c in'_$': j = i while j < imax and (txt[j].isalnum() or txt[j] in '_$'): j += 1 kw = txt[i:j] if kw == 'null': obj, i = None, j elif kw == 'true': obj, i = True, j elif kw == 'false': obj, i = False, j elif kw == 'undefined': if self._allow_undefined_values: obj, i = undefined, j else: raise JSONDecodeError('strict JSON does not allow undefined elements',txt[i:]) elif kw == 'NaN' or kw == 'Infinity': obj, i = self.decode_number(txt, i) else: if identifier_as_string: obj, i = self.decode_javascript_identifier(kw), j else: raise JSONDecodeError('unknown keyword or identifier',kw) else: raise JSONDecodeError('can not decode value',txt[i:]) return obj, i def decode(self, txt): """Decodes a JSON-endoded string into a Python object.""" if self._allow_unicode_format_control_chars: txt = self.strip_format_control_chars(txt) r = self.decodeobj(txt, 0, only_object_or_array=not self._allow_any_type_at_start) if not r: raise JSONDecodeError('can not decode value',txt) else: obj, i = r i = self.skipws(txt, i) if i < len(txt): raise JSONDecodeError('unexpected or extra text',txt[i:]) return obj def encode(self, obj, nest_level=0): """Encodes the Python object into a JSON string representation. This method will first attempt to encode an object by seeing if it has a json_equivalent() method. If so than it will call that method and then recursively attempt to encode the object resulting from that call. Next it will attempt to determine if the object is a native type or acts like a squence or dictionary. If so it will encode that object directly. Finally, if no other strategy for encoding the object of that type exists, it will call the encode_default() method. That method currently raises an error, but it could be overridden by subclasses to provide a hook for extending the types which can be encoded. """ chunks = [] self.encode_helper(chunks, obj, nest_level) return ''.join( chunks ) def encode_helper(self, chunklist, obj, nest_level): #print 'encode_helper(chunklist=%r, obj=%r, nest_level=%r)'%(chunklist,obj,nest_level) if hasattr(obj, 'json_equivalent'): json = self.encode_equivalent( obj, nest_level=nest_level ) if json is not None: chunklist.append( json ) return if obj is None: chunklist.append( self.encode_null() ) elif obj is undefined: if self._allow_undefined_values: chunklist.append( self.encode_undefined() ) else: raise JSONEncodeError('strict JSON does not permit "undefined" values') elif isinstance(obj, bool): chunklist.append( self.encode_boolean(obj) ) elif isinstance(obj, (int,long,float,complex)) or \ (decimal and isinstance(obj, decimal.Decimal)): chunklist.append( self.encode_number(obj) ) elif isinstance(obj, basestring) or isstringtype(obj): chunklist.append( self.encode_string(obj) ) else: self.encode_composite(chunklist, obj, nest_level) def encode_composite(self, chunklist, obj, nest_level): """Encodes just dictionaries, lists, or sequences. Basically handles any python type for which iter() can create an iterator object. This method is not intended to be called directly. Use the encode() method instead. """ #print 'encode_complex_helper(chunklist=%r, obj=%r, nest_level=%r)'%(chunklist,obj,nest_level) try: # Is it a dictionary or UserDict? Try iterkeys method first. it = obj.iterkeys() except AttributeError: try: # Is it a sequence? Try to make an iterator for it. it = iter(obj) except TypeError: it = None if it is not None: # Does it look like a dictionary? Check for a minimal dict or # UserDict interface. isdict = hasattr(obj, '__getitem__') and hasattr(obj, 'keys') compactly = self._encode_compactly if isdict: chunklist.append('{') if compactly: dictcolon = ':' else: dictcolon = ' : ' else: chunklist.append('[') #print nest_level, 'opening sequence:', repr(chunklist) if not compactly: indent0 = ' ' * nest_level indent = ' ' * (nest_level+1) chunklist.append(' ') sequence_chunks = [] # use this to allow sorting afterwards if dict try: # while not StopIteration numitems = 0 while True: obj2 = it.next() if obj2 is obj: raise JSONEncodeError('trying to encode an infinite sequence',obj) if isdict and not isstringtype(obj2): # Check JSON restrictions on key types if isnumbertype(obj2): if not self._allow_nonstring_keys: raise JSONEncodeError('object properties (dictionary keys) must be strings in strict JSON',obj2) else: raise JSONEncodeError('object properties (dictionary keys) can only be strings or numbers in ECMAScript',obj2) # Encode this item in the sequence and put into item_chunks item_chunks = [] self.encode_helper( item_chunks, obj2, nest_level=nest_level+1 ) if isdict: item_chunks.append(dictcolon) obj3 = obj[obj2] self.encode_helper(item_chunks, obj3, nest_level=nest_level+2) #print nest_level, numitems, 'item:', repr(obj2) #print nest_level, numitems, 'sequence_chunks:', repr(sequence_chunks) #print nest_level, numitems, 'item_chunks:', repr(item_chunks) #extend_list_with_sep(sequence_chunks, item_chunks) sequence_chunks.append(item_chunks) #print nest_level, numitems, 'new sequence_chunks:', repr(sequence_chunks) numitems += 1 except StopIteration: pass if isdict and self._sort_dictionary_keys: sequence_chunks.sort() # Note sorts by JSON repr, not original Python object if compactly: sep = ',' else: sep = ',\n' + indent #print nest_level, 'closing sequence' #print nest_level, 'chunklist:', repr(chunklist) #print nest_level, 'sequence_chunks:', repr(sequence_chunks) extend_and_flatten_list_with_sep( chunklist, sequence_chunks, sep ) #print nest_level, 'new chunklist:', repr(chunklist) if not compactly: if numitems > 1: chunklist.append('\n' + indent0) else: chunklist.append(' ') if isdict: chunklist.append('}') else: chunklist.append(']') else: # Can't create an iterator for the object json2 = self.encode_default( obj, nest_level=nest_level ) chunklist.append( json2 ) def encode_equivalent( self, obj, nest_level=0 ): """This method is used to encode user-defined class objects. The object being encoded should have a json_equivalent() method defined which returns another equivalent object which is easily JSON-encoded. If the object in question has no json_equivalent() method available then None is returned instead of a string so that the encoding will attempt the next strategy. If a caller wishes to disable the calling of json_equivalent() methods, then subclass this class and override this method to just return None. """ if hasattr(obj, 'json_equivalent') \ and callable(getattr(obj,'json_equivalent')): obj2 = obj.json_equivalent() if obj2 is obj: # Try to prevent careless infinite recursion raise JSONEncodeError('object has a json_equivalent() method that returns itself',obj) json2 = self.encode( obj2, nest_level=nest_level ) return json2 else: return None def encode_default( self, obj, nest_level=0 ): """This method is used to encode objects into JSON which are not straightforward. This method is intended to be overridden by subclasses which wish to extend this encoder to handle additional types. """ raise JSONEncodeError('can not encode object into a JSON representation',obj) # ------------------------------ def encode( obj, strict=False, compactly=True, escape_unicode=False, encoding=None ): """Encodes a Python object into a JSON-encoded string. If 'strict' is set to True, then only strictly-conforming JSON output will be produced. Note that this means that some types of values may not be convertable and will result in a JSONEncodeError exception. If 'compactly' is set to True, then the resulting string will have all extraneous white space removed; if False then the string will be "pretty printed" with whitespace and indentation added to make it more readable. If 'escape_unicode' is set to True, then all non-ASCII characters will be represented as a unicode escape sequence; if False then the actual real unicode character will be inserted. If no encoding is specified (encoding=None) then the output will either be a Python string (if entirely ASCII) or a Python unicode string type. However if an encoding name is given then the returned value will be a python string which is the byte sequence encoding the JSON value. As the default/recommended encoding for JSON is UTF-8, you should almost always pass in encoding='utf8'. """ import sys encoder = None # Custom codec encoding function bom = None # Byte order mark to prepend to final output cdk = None # Codec to use if encoding is not None: import codecs try: cdk = codecs.lookup(encoding) except LookupError: cdk = None if cdk: pass elif not cdk: # No built-in codec was found, see if it is something we # can do ourself. encoding = encoding.lower() if encoding.startswith('utf-32') or encoding.startswith('utf32') \ or encoding.startswith('ucs4') \ or encoding.startswith('ucs-4'): # Python doesn't natively have a UTF-32 codec, but JSON # requires that it be supported. So we must decode these # manually. if encoding.endswith('le'): encoder = utf32le_encode elif encoding.endswith('be'): encoder = utf32be_encode else: encoder = utf32be_encode bom = codecs.BOM_UTF32_BE elif encoding.startswith('ucs2') or encoding.startswith('ucs-2'): # Python has no UCS-2, but we can simulate with # UTF-16. We just need to force us to not try to # encode anything past the BMP. encoding = 'utf-16' if not escape_unicode and not callable(escape_unicode): escape_unicode = lambda c: (0xD800 <= ord(c) <= 0xDFFF) or ord(c) >= 0x10000 else: raise JSONEncodeError('this python has no codec for this character encoding',encoding) if not escape_unicode and not callable(escape_unicode): if encoding and encoding.startswith('utf'): # All UTF-x encodings can do the whole Unicode repertoire, so # do nothing special. pass else: # Even though we don't want to escape all unicode chars, # the encoding being used may force us to do so anyway. # We must pass in a function which says which characters # the encoding can handle and which it can't. def in_repertoire( c, encoding_func ): try: x = encoding_func( c, errors='strict' ) except UnicodeError: return False return True if encoder: escape_unicode = lambda c: not in_repertoire(c, encoder) elif cdk: escape_unicode = lambda c: not in_repertoire(c, cdk[0]) else: pass # Let the JSON object deal with it j = JSON( strict=strict, compactly=compactly, escape_unicode=escape_unicode ) unitxt = j.encode( obj ) if encoder: txt = encoder( unitxt ) elif encoding is not None: txt = unitxt.encode( encoding ) else: txt = unitxt if bom: txt = bom + txt return txt def decode( txt, strict=False, encoding=None, **kw ): """Decodes a JSON-encoded string into a Python object. If 'strict' is set to True, then those strings that are not entirely strictly conforming to JSON will result in a JSONDecodeError exception. The input string can be either a python string or a python unicode string. If it is already a unicode string, then it is assumed that no character set decoding is required. However, if you pass in a non-Unicode text string (i.e., a python type 'str') then an attempt will be made to auto-detect and decode the character encoding. This will be successful if the input was encoded in any of UTF-8, UTF-16 (BE or LE), or UTF-32 (BE or LE), and of course plain ASCII works too. Note though that if you know the character encoding, then you should convert to a unicode string yourself, or pass it the name of the 'encoding' to avoid the guessing made by the auto detection, as with python_object = demjson.decode( input_bytes, encoding='utf8' ) Optional keywords arguments must be of the form allow_xxxx=True/False or prevent_xxxx=True/False where each will allow or prevent the specific behavior, after the evaluation of the 'strict' argument. For example, if strict=True then by also passing 'allow_comments=True' then comments will be allowed. If strict=False then prevent_comments=True will allow everything except comments. """ # Initialize the JSON object j = JSON( strict=strict ) for keyword, value in kw.items(): if keyword.startswith('allow_'): behavior = keyword[6:] allow = bool(value) elif keyword.startswith('prevent_'): behavior = keyword[8:] allow = not bool(value) else: raise ValueError('unknown keyword argument', keyword) if allow: j.allow(behavior) else: j.prevent(behavior) # Convert the input string into unicode if needed. if isinstance(txt,unicode): unitxt = txt else: if encoding is None: unitxt = auto_unicode_decode( txt ) else: cdk = None # codec decoder = None import codecs try: cdk = codecs.lookup(encoding) except LookupError: encoding = encoding.lower() decoder = None if encoding.startswith('utf-32') \ or encoding.startswith('ucs4') \ or encoding.startswith('ucs-4'): # Python doesn't natively have a UTF-32 codec, but JSON # requires that it be supported. So we must decode these # manually. if encoding.endswith('le'): decoder = utf32le_decode elif encoding.endswith('be'): decoder = utf32be_decode else: if txt.startswith( codecs.BOM_UTF32_BE ): decoder = utf32be_decode txt = txt[4:] elif txt.startswith( codecs.BOM_UTF32_LE ): decoder = utf32le_decode txt = txt[4:] else: if encoding.startswith('ucs'): raise JSONDecodeError('UCS-4 encoded string must start with a BOM') decoder = utf32be_decode # Default BE for UTF, per unicode spec elif encoding.startswith('ucs2') or encoding.startswith('ucs-2'): # Python has no UCS-2, but we can simulate with # UTF-16. We just need to force us to not try to # encode anything past the BMP. encoding = 'utf-16' if decoder: unitxt = decoder(txt) elif encoding: unitxt = txt.decode(encoding) else: raise JSONDecodeError('this python has no codec for this character encoding',encoding) # Check that the decoding seems sane. Per RFC 4627 section 3: # "Since the first two characters of a JSON text will # always be ASCII characters [RFC0020], ..." # # This check is probably not necessary, but it allows us to # raise a suitably descriptive error rather than an obscure # syntax error later on. # # Note that the RFC requirements of two ASCII characters seems # to be an incorrect statement as a JSON string literal may # have as it's first character any unicode character. Thus # the first two characters will always be ASCII, unless the # first character is a quotation mark. And in non-strict # mode we can also have a few other characters too. if len(unitxt) > 2: first, second = unitxt[:2] if first in '"\'': pass # second can be anything inside string literal else: if ((ord(first) < 0x20 or ord(first) > 0x7f) or \ (ord(second) < 0x20 or ord(second) > 0x7f)) and \ (not j.isws(first) and not j.isws(second)): # Found non-printable ascii, must check unicode # categories to see if the character is legal. # Only whitespace, line and paragraph separators, # and format control chars are legal here. import unicodedata catfirst = unicodedata.category(unicode(first)) catsecond = unicodedata.category(unicode(second)) if catfirst not in ('Zs','Zl','Zp','Cf') or \ catsecond not in ('Zs','Zl','Zp','Cf'): raise JSONDecodeError('the decoded string is gibberish, is the encoding correct?',encoding) # Now ready to do the actual decoding obj = j.decode( unitxt ) return obj # end file DisplayCAL-3.1.0.0/DisplayCAL/DisplayCAL.py0000644000076500000000000204364412653526636017751 0ustar devwheel00000000000000# -*- coding: utf-8 -*- """ DisplayCAL A graphical user interface for the Argyll CMS display calibration utilities Copyright (C) 2008, 2009 Florian Hoech 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 """ from __future__ import with_statement import sys # Standard modules import datetime import decimal Decimal = decimal.Decimal import glob import httplib import math import os import platform if sys.platform == "darwin": from platform import mac_ver import re import shutil import socket import subprocess as sp import threading import traceback import urllib import urllib2 import zipfile if sys.platform == "win32": import _winreg from hashlib import md5 from time import gmtime, localtime, sleep, strftime, strptime, struct_time from zlib import crc32 # 3rd party modules import demjson # Config import config from config import (autostart, autostart_home, build, script_ext, defaults, enc, exe, exe_ext, fs_enc, getbitmap, geticon, get_ccxx_testchart, get_current_profile, get_display_profile, get_data_path, getcfg, get_total_patches, get_verified_path, hascfg, is_ccxx_testchart, is_profile, initcfg, isapp, isexe, profile_ext, pydir, resfiles, setcfg, writecfg) # Custom modules import CGATS import ICCProfile as ICCP import audio import ccmx import colord import colormath import localization as lang import madvr import pyi_md5pickuphelper import report if sys.platform == "win32": import util_win from util_win import win_ver import wexpect from argyll_cgats import (cal_to_fake_profile, can_update_cal, ti3_to_ti1, vcgt_to_cal, verify_ti1_rgb_xyz) from argyll_instruments import (get_canonical_instrument_name, instruments) from argyll_names import viewconds from colormath import (CIEDCCT2xyY, planckianCT2xyY, xyY2CCT, XYZ2CCT, XYZ2Lab, XYZ2xyY) from debughelpers import ResourceError, getevtobjname, getevttype, handle_error from edid import pnpidcache, get_manufacturer_name from log import log, logbuffer, safe_print from meta import (VERSION, VERSION_BASE, author, name as appname, domain, version, version_short) from options import debug, test, verbose from ordereddict import OrderedDict from trash import trash, TrashAborted, TrashcanUnavailableError from util_decimal import float2dec, stripzeros from util_http import encode_multipart_formdata from util_io import StringIOu as StringIO, TarFileProper from util_list import index_fallback_ignorecase, intlist, natsort from util_os import (expanduseru, get_program_file, getenvu, is_superuser, launch_file, listdir_re, waccess, whereis, which) from util_str import (ellipsis, safe_str, safe_unicode, strtr, universal_newlines, wrap) import util_x from worker import (Error, Info, UnloggedError, UnloggedInfo, UnloggedWarning, Warn, Worker, check_create_dir, check_file_isfile, check_set_argyll_bin, check_ti3, check_ti3_criteria1, check_ti3_criteria2, get_arg, get_argyll_util, get_cfg_option_from_args, get_options_from_cal, get_argyll_version, get_current_profile_path, get_options_from_profile, get_options_from_ti3, make_argyll_compatible_path, parse_argument_string, set_argyll_bin, show_result_dialog, technology_strings_170, technology_strings_171, check_argyll_bin) from wxLUT3DFrame import LUT3DFrame try: from wxLUTViewer import LUTFrame except ImportError: LUTFrame = None if sys.platform in ("darwin", "win32") or isexe: from wxMeasureFrame import MeasureFrame from wxDisplayUniformityFrame import DisplayUniformityFrame from wxProfileInfo import ProfileInfoFrame from wxReportFrame import ReportFrame from wxSynthICCFrame import SynthICCFrame from wxTestchartEditor import TestchartEditor from wxaddons import (wx, BetterWindowDisabler, CustomEvent, CustomGridCellEvent) from wxfixes import (ThemedGenButton, BitmapWithThemedButton, PlateButton, set_bitmap_labels, TempXmlResource) from wxwindows import (AboutDialog, AuiBetterTabArt, BaseApp, BaseFrame, BetterStaticFancyText, BetterLinkCtrl, BorderGradientButton, BitmapBackgroundPanel, BitmapBackgroundPanelText, ConfirmDialog, CustomGrid, CustomCellBoolRenderer, FileDrop, HtmlInfoDialog, HyperLinkCtrl, InfoDialog, LogWindow, ProgressDialog, TooltipWindow, get_gradient_panel) import floatspin import xh_fancytext import xh_filebrowsebutton import xh_floatspin import xh_hstretchstatbmp import xh_bitmapctrls # wxPython try: # Only wx.lib.aui.AuiNotebook looks reasonable across _all_ platforms. # Other tabbed book controls like wx.Notebook or wx.aui.AuiNotebook are # impossible to get to look right under GTK because there's no way to # set the correct background color for the pages. from wx.lib.agw import aui except ImportError: # Fall back to wx.aui under ancient wxPython versions from wx import aui from wx import xrc from wx.lib import delayedresult, platebtn from wx.lib.art import flagart from wx.lib.scrolledpanel import ScrolledPanel import wx.html def swap_dict_keys_values(mydict): """ Swap dictionary keys and values """ return dict([(v, k) for (k, v) in mydict.iteritems()]) def app_update_check(parent=None, silent=False, snapshot=False, argyll=False): """ Check for application update. Show an error dialog if a failure occurs. """ if argyll: if parent and hasattr(parent, "worker"): argyll_version = parent.worker.argyll_version else: argyll_version = intlist(getcfg("argyll.version").split(".")) curversion_tuple = tuple(argyll_version) version_file = "Argyll/VERSION" readme_file = "Argyll/ChangesSummary.html" elif snapshot: # Snapshot curversion_tuple = VERSION version_file = "SNAPSHOT_VERSION" readme_file = "SNAPSHOT_README.html" else: # Stable safe_print(lang.getstr("update_check")) curversion_tuple = VERSION_BASE version_file = "VERSION" readme_file = "README.html" resp = http_request(parent, domain, "GET", "/" + version_file, failure_msg=lang.getstr("update_check.fail"), silent=silent) if resp is False: if silent: # Check if we need to run instrument setup wx.CallAfter(parent.check_instrument_setup, check_donation, (parent, snapshot)) return data = resp.read() if not wx.GetApp(): return try: newversion_tuple = tuple(int(n) for n in data.split(".")) except ValueError: safe_print(lang.getstr("update_check.fail.version", domain)) if not silent: wx.CallAfter(InfoDialog, parent, msg=lang.getstr("update_check.fail.version", domain), ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error"), log=False) return newversion_tuple = (0, 0, 0, 0) if newversion_tuple > curversion_tuple: # Get changelog resp = http_request(parent, domain, "GET", "/" + readme_file, silent=True) chglog = None if resp: readme = safe_unicode(resp.read(), "utf-8") if argyll: chglog = readme else: chglog = re.search('
' '.+?

.+?

' '.+?
.+?', readme, re.S) chglog = chglog.group() chglog = re.sub('
', "", chglog) chglog = re.sub("<\/?d[l|d]>", "", chglog) chglog = re.sub("<(?:h2|dt)>.+?", "", chglog) chglog = re.sub("

.+?

", "", chglog) chglog = re.sub(r"(.+?)", r"

\1

", chglog, flags=re.I | re.S) chglog = re.sub('(.+?)', r"\1", chglog, flags=re.I | re.S) if not wx.GetApp(): return wx.CallAfter(app_update_confirm, parent, newversion_tuple, chglog, snapshot, argyll, silent) elif not argyll and not snapshot and VERSION > VERSION_BASE: app_update_check(parent, silent, True) elif not argyll: if silent: safe_print(lang.getstr("update_check.uptodate", appname)) if check_argyll_bin(): app_update_check(parent, silent, argyll=True) elif silent: wx.CallAfter(parent.set_argyll_bin_handler, True, silent, parent.check_instrument_setup, (check_donation, (parent, snapshot))) else: wx.CallAfter(parent.set_argyll_bin_handler, True) elif not silent: wx.CallAfter(app_uptodate, parent) else: safe_print(lang.getstr("update_check.uptodate", "Argyll CMS")) # Check if we need to run instrument setup wx.CallAfter(parent.check_instrument_setup, check_donation, (parent, snapshot)) def check_donation(parent, snapshot): # Show donation popup if user did not choose "don't show again". # Reset donation popup after a major update. if (not snapshot and VERSION[0] > tuple(intlist(getcfg("last_launch").split(".")))[0]): setcfg("show_donation_message", 1) setcfg("last_launch", version) if getcfg("show_donation_message"): wx.CallAfter(donation_message, parent) def app_uptodate(parent=None): """ Show a dialog confirming application is up-to-date """ dlg = InfoDialog(parent, msg=lang.getstr("update_check.uptodate", appname), ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-information"), show=False) update_check = wx.CheckBox(dlg, -1, lang.getstr("update_check.onstartup")) update_check.SetValue(getcfg("update_check")) dlg.Bind(wx.EVT_CHECKBOX, lambda event: setcfg("update_check", int(event.IsChecked())), id=update_check.GetId()) dlg.sizer3.Add(update_check, flag=wx.TOP | wx.ALIGN_LEFT, border=12) dlg.sizer0.SetSizeHints(dlg) dlg.sizer0.Layout() dlg.ShowModalThenDestroy() if parent and getattr(parent, "menuitem_app_auto_update_check", None): parent.menuitem_app_auto_update_check.Check(bool(getcfg("update_check"))) def app_update_confirm(parent=None, newversion_tuple=(0, 0, 0, 0), chglog=None, snapshot=False, argyll=False, silent=False): """ Show a dialog confirming application update, with cancel option """ zeroinstall = (not argyll and os.path.exists(os.path.normpath(os.path.join(pydir, "..", appname + ".pyw"))) and re.match("sha\d+(?:new)?", os.path.basename(os.path.dirname(pydir))) and (which("0install-win.exe") or which("0install"))) download = argyll and not check_argyll_bin() if zeroinstall or sys.platform in ("darwin", "win32") or argyll: ok = lang.getstr("download" if download else "update_now") alt = lang.getstr("go_to_website") else: ok = lang.getstr("go_to_website") alt = None newversion = ".".join(str(n) for n in newversion_tuple) if argyll: newversion_desc = "Argyll CMS" else: newversion_desc = appname newversion_desc += " " + newversion if snapshot: newversion_desc += " Beta" if download: msg = lang.getstr("download") + " " + newversion_desc else: msg = lang.getstr("update_check.new_version", newversion_desc) dlg = ConfirmDialog(parent, msg=msg, ok=ok, alt=alt, cancel=lang.getstr("cancel"), bitmap=geticon(32, "dialog-information"), log=True) scale = getcfg("app.dpi") / config.get_default_dpi() if scale < 1: scale = 1 if (argyll and sys.platform not in ("darwin", "win32") and not whereis("libXss.so")): sizer = wx.BoxSizer(wx.HORIZONTAL) dlg.sizer3.Insert(0, sizer, flag=wx.BOTTOM | wx.ALIGN_LEFT, border=12) sizer.Add(wx.StaticBitmap(dlg, -1, geticon(16, "dialog-warning"))) warning_text = lang.getstr("library.not_found.warning", (lang.getstr("libXss.so"), "libXss.so")) warning = wx.StaticText(dlg, -1, warning_text) warning.ForegroundColour = "#F07F00" sizer.Add(warning, flag=wx.LEFT, border=8) warning.Wrap((500 - 16 - 8) * scale) if chglog: htmlwnd = wx.html.HtmlWindow(dlg, -1, size=(500 * scale, 300 * scale), style=wx.BORDER_THEME) if "gtk3" in wx.PlatformInfo: size = int(round(dlg.message.Font.PointSize * scale)) else: size = -1 htmlwnd.SetStandardFonts(size) htmlwnd.SetPage(chglog) htmlwnd.Bind(wx.html.EVT_HTML_LINK_CLICKED, lambda event: launch_file(event.GetLinkInfo().Href)) dlg.sizer3.Add(htmlwnd, 1, flag=wx.TOP | wx.ALIGN_LEFT | wx.EXPAND, border=12) update_check = wx.CheckBox(dlg, -1, lang.getstr("update_check.onstartup")) update_check.SetValue(getcfg("update_check")) dlg.Bind(wx.EVT_CHECKBOX, lambda event: setcfg("update_check", int(event.IsChecked())), id=update_check.GetId()) dlg.sizer3.Add(update_check, flag=wx.TOP | wx.ALIGN_LEFT, border=12) dlg.sizer0.SetSizeHints(dlg) dlg.sizer0.Layout() dlg.Center() result = dlg.ShowModal() dlg.Destroy() if parent and getattr(parent, "menuitem_app_auto_update_check", None): parent.menuitem_app_auto_update_check.Check(bool(getcfg("update_check"))) if result == wx.ID_OK and (zeroinstall or (sys.platform in ("darwin", "win32") or argyll)): if parent and hasattr(parent, "worker"): worker = parent.worker else: worker = Worker() if snapshot: # Snapshot folder = "/snapshot" else: # Stable folder = "" if zeroinstall: if parent: parent.Close() else: wx.GetApp().ExitMainLoop() if sys.platform == "win32": kwargs = dict(stdin=sp.PIPE, stdout=sp.PIPE, stderr=sp.PIPE) else: kwargs = {} sp.Popen([zeroinstall.encode(fs_enc), "run", "--refresh", "--version", newversion, "http://%s/0install/%s.xml" % (domain.lower(), appname)], **kwargs) else: consumer = worker.process_download dlname = appname if argyll: consumer = worker.process_argyll_download dlname = "Argyll" if sys.platform == "win32": # Determine 32 or 64 bit OS key = _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE, r"SYSTEM\CurrentControlSet\Control" r"\Session Manager\Environment") try: value = _winreg.QueryValueEx(key, "PROCESSOR_ARCHITECTURE")[0] except WindowsError: value = "x86" finally: _winreg.CloseKey(key) if value.lower() == "amd64": suffix = "_win64_exe.zip" else: # Assume win32 suffix = "_win32_exe.zip" elif sys.platform == "darwin": # We only support OS X 10.5+ suffix = "_osx10.6_x86_64_bin.tgz" else: # Linux if platform.architecture()[0] == "64bit": # Assume x86_64 suffix = "_linux_x86_64_bin.tgz" else: # Assume x86 suffix = "_linux_x86_bin.tgz" elif sys.platform == "win32": if snapshot: # Snapshots are only avaialble as ZIP suffix = "-win32.zip" else: # Regular stable versions are available as setup suffix = "-Setup.exe" else: suffix = ".dmg" worker.start(consumer, worker.download, ckwargs={"exit": dlname == appname}, wargs=("http://%s/download%s/%s-%s%s" % (domain.lower(), folder, dlname, newversion, suffix),), progress_msg=lang.getstr("downloading"), fancy=False) return elif result != wx.ID_CANCEL: path = "/" if argyll: path += "argyll" if sys.platform == "darwin": path += "-mac" elif sys.platform == "win32": path += "-win" else: # Linux path += "-linux" launch_file("http://" + domain + path) elif not argyll: # Check for Argyll update if check_argyll_bin(): parent.app_update_check_handler(None, silent, True) elif silent: parent.set_argyll_bin_handler(True, silent, parent.check_instrument_setup, (check_donation, (parent, snapshot))) else: parent.set_argyll_bin_handler(True) return if silent: # Check if we need to run instrument setup parent.check_instrument_setup(check_donation, (parent, snapshot)) def donation_message(parent=None): """ Show donation message """ dlg = ConfirmDialog(parent, title=lang.getstr("welcome"), msg=lang.getstr("donation_message"), ok=lang.getstr("contribute"), cancel=lang.getstr("not_now"), bitmap=getbitmap("theme/headericon"), bitmap_margin=0) header = wx.StaticText(dlg, -1, lang.getstr("donation_header")) font = header.Font font.PointSize += 4 header.SetFont(font) dlg.sizer3.Insert(0, header, flag=wx.BOTTOM, border=14) if sys.platform == "win32": font = dlg.message.Font font.PointSize += 1 dlg.message.SetFont(font) chkbox = wx.CheckBox(dlg.buttonpanel, -1, lang.getstr("dialog.do_not_show_again")) dlg.sizer2.Insert(0, chkbox, flag=wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL | wx.RIGHT, border=max(dlg.sizer3.MinSize[0] - dlg.sizer2.MinSize[0] - chkbox.Size[0], 12)) dlg.sizer2.Insert(0, (88, -1)) dlg.buttonpanel.Layout() dlg.sizer0.SetSizeHints(dlg) dlg.sizer0.Layout() if dlg.ShowModal() == wx.ID_OK: launch_file("http://" + domain + "/#donate") show_again = False else: show_again = not chkbox.Value setcfg("show_donation_message", int(show_again)) dlg.Destroy() def colorimeter_correction_web_check_choose(resp, parent=None): """ Let user choose a colorimeter correction and confirm overwrite """ if resp is not False: data = resp.read() if data.strip().startswith("CC"): cgats = CGATS.CGATS(data) else: InfoDialog(parent, msg=lang.getstr("colorimeter_correction.web_check.failure"), ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-information")) return else: return dlg = ConfirmDialog(parent, title=lang.getstr("colorimeter_correction.web_check"), msg=lang.getstr("colorimeter_correction.web_check.choose"), ok=lang.getstr("ok"), cancel=lang.getstr("cancel"), bitmap=geticon(32, "dialog-information"), nowrap=True) scale = getcfg("app.dpi") / config.get_default_dpi() if scale < 1: scale = 1 dlg_list_ctrl = wx.ListCtrl(dlg, -1, size=(640 * scale, 150 * scale), style=wx.LC_REPORT | wx.LC_SINGLE_SEL, name="colorimeter_corrections") dlg_list_ctrl.InsertColumn(0, lang.getstr("type")) dlg_list_ctrl.InsertColumn(1, lang.getstr("description")) dlg_list_ctrl.InsertColumn(2, lang.getstr("display.manufacturer")) dlg_list_ctrl.InsertColumn(3, lang.getstr("display")) dlg_list_ctrl.InsertColumn(4, lang.getstr("instrument")) dlg_list_ctrl.InsertColumn(5, lang.getstr("reference")) dlg_list_ctrl.InsertColumn(6, lang.getstr("observer")) dlg_list_ctrl.InsertColumn(7, lang.getstr("created")) dlg_list_ctrl.SetColumnWidth(0, 50) dlg_list_ctrl.SetColumnWidth(1, 250) dlg_list_ctrl.SetColumnWidth(2, 150) dlg_list_ctrl.SetColumnWidth(3, 100) dlg_list_ctrl.SetColumnWidth(4, 75) dlg_list_ctrl.SetColumnWidth(5, 75) dlg_list_ctrl.SetColumnWidth(6, 75) dlg_list_ctrl.SetColumnWidth(7, 150) types = {"CCSS": lang.getstr("spectral").replace(":", ""), "CCMX": lang.getstr("matrix").replace(":", "")} for i in cgats: index = dlg_list_ctrl.InsertStringItem(i, "") ccxx_type = cgats[i].type.strip() dlg_list_ctrl.SetStringItem(index, 0, types.get(ccxx_type, ccxx_type)) dlg_list_ctrl.SetStringItem(index, 1, get_canonical_instrument_name(cgats[i].queryv1("DESCRIPTOR") or "")) dlg_list_ctrl.SetStringItem(index, 2, cgats[i].queryv1("MANUFACTURER") or "") dlg_list_ctrl.SetStringItem(index, 3, cgats[i].queryv1("DISPLAY")) dlg_list_ctrl.SetStringItem(index, 4, get_canonical_instrument_name(cgats[i].queryv1("INSTRUMENT") or "")) dlg_list_ctrl.SetStringItem(index, 5, get_canonical_instrument_name(cgats[i].queryv1("REFERENCE") or "")) created = cgats[i].queryv1("CREATED") if created: try: created = strptime(created) except ValueError: datetmp = re.search("\w+ (\w{3}) (\d{2}) (\d{2}(?::[0-5][0-9]){2}) (\d{4})", created) if datetmp: datetmp = "%s-%s-%s %s" % (datetmp.groups()[3], {"Jan": "01", "Feb": "02", "Mar": "03", "Apr": "04", "May": "05", "Jun": "06", "Jul": "07", "Aug": "08", "Sep": "09", "Oct": "10", "Nov": "11", "Dec": "12"}.get(datetmp.groups()[0]), datetmp.groups()[1], datetmp.groups()[2]) try: created = strptime(datetmp, "%Y-%m-%d %H:%M:%S") except ValueError: pass if isinstance(created, struct_time): created = strftime("%Y-%m-%d %H:%M:%S", created) dlg_list_ctrl.SetStringItem(index, 6, parent.observers_ab.get(cgats[i].queryv1("REFERENCE_OBSERVER"), lang.getstr("unknown" if ccxx_type == "CCMX" else "not_applicable"))) dlg_list_ctrl.SetStringItem(index, 7, created or "") dlg.Bind(wx.EVT_LIST_ITEM_SELECTED, lambda event: dlg.ok.Enable(), dlg_list_ctrl) dlg.Bind(wx.EVT_LIST_ITEM_DESELECTED, lambda event: dlg.ok.Disable(), dlg_list_ctrl) dlg.Bind(wx.EVT_LIST_ITEM_ACTIVATED, lambda event: dlg.EndModal(wx.ID_OK), dlg_list_ctrl) dlg.sizer3.Add(dlg_list_ctrl, 1, flag=wx.TOP | wx.ALIGN_LEFT, border=12) if len(cgats) > 1: # We got several matches dlg.ok.Disable() else: item = dlg_list_ctrl.GetItem(0) dlg_list_ctrl.SetItemState(item.GetId(), wx.LIST_STATE_SELECTED, wx.LIST_STATE_SELECTED) dlg.sizer0.SetSizeHints(dlg) dlg.sizer0.Layout() dlg.Center() result = dlg.ShowModal() index = dlg_list_ctrl.GetNextItem(-1, wx.LIST_NEXT_ALL, wx.LIST_STATE_SELECTED) dlg.Destroy() if result != wx.ID_OK: return False # Important: Do not use parsed CGATS, order of keywords may be # different than raw data so MD5 will be different cgats = re.sub("\n(CCMX|CCSS)( *\n)", "\n<>\n\\1\\2", data).split("\n<>\n") colorimeter_correction_check_overwrite(parent, cgats[index]) def colorimeter_correction_check_overwrite(parent=None, cgats=None, update_comports=False): """ Check if a colorimeter correction file will be overwritten and present a dialog to confirm or cancel the operation. Write the file. """ result = check_create_dir(config.get_argyll_data_dir()) if isinstance(result, Exception): show_result_dialog(result, parent) return path = get_cgats_path(cgats) if os.path.isfile(path): dlg = ConfirmDialog(parent, msg=lang.getstr("dialog.confirm_overwrite", path), ok=lang.getstr("ok"), cancel=lang.getstr("cancel"), bitmap=geticon(32, "dialog-information")) result = dlg.ShowModal() dlg.Destroy() if result != wx.ID_OK: return False try: cgatsfile = open(path, 'wb') cgatsfile.write(cgats) cgatsfile.close() except EnvironmentError, exception: show_result_dialog(exception, parent) return False if getcfg("colorimeter_correction_matrix_file").split(":")[0] != "AUTO": setcfg("colorimeter_correction_matrix_file", ":" + path) if update_comports: cgats = CGATS.CGATS(cgats) instrument = (cgats.queryv1("INSTRUMENT") or getcfg("colorimeter_correction.instrument")) if instrument: instrument = get_canonical_instrument_name(instrument) else: instrument = None if instrument and instrument in parent.worker.instruments: setcfg("comport.number", parent.worker.instruments.index(instrument) + 1) parent.update_comports(force=True) else: parent.update_colorimeter_correction_matrix_ctrl_items(True) return True def get_argyll_data_files(scope, wildcard): """ Get paths of Argyll data files. scope should be a string containing "l" (local system) and/or "u" (user) """ data_files = [] if sys.platform != "darwin": if "l" in scope: for commonappdata in config.commonappdata: data_files += glob.glob(os.path.join(commonappdata, "color", wildcard)) data_files += glob.glob(os.path.join(commonappdata, "ArgyllCMS", wildcard)) if "u" in scope: data_files += glob.glob(os.path.join(config.appdata, "color", wildcard)) else: if "l" in scope: data_files += glob.glob(os.path.join(config.library, "color", wildcard)) data_files += glob.glob(os.path.join(config.library, "ArgyllCMS", wildcard)) if "u" in scope: data_files += glob.glob(os.path.join(config.library_home, "color", wildcard)) if "u" in scope: data_files += glob.glob(os.path.join(config.appdata, "ArgyllCMS", wildcard)) return data_files def get_cgats_measurement_mode(cgats, instrument): base_id = cgats.queryv1("DISPLAY_TYPE_BASE_ID") refresh = cgats.queryv1("DISPLAY_TYPE_REFRESH") mode = None if base_id: # IMPORTANT: Make changes aswell in the following locations: # - DisplayCAL.MainFrame.create_colorimeter_correction_handler # - DisplayCAL.MainFrame.get_ccxx_measurement_modes # - DisplayCAL.MainFrame.set_ccxx_measurement_mode # - worker.Worker.check_add_display_type_base_id # - worker.Worker.instrument_can_use_ccxx if instrument in ("ColorHug", "ColorHug2"): mode = {1: "F", 2: "R"}.get(base_id) elif instrument == "ColorMunki Smile": mode = {1: "f"}.get(base_id) elif instrument == "Colorimtre HCFR": mode = {1: "R"}.get(base_id) elif instrument == "K-10": mode = {1: "F"}.get(base_id) else: mode = {1: "l", 2: "c", 3: "g"}.get(base_id) elif refresh == "NO": mode = "l" elif refresh == "YES": mode = "c" return mode def get_cgats_path(cgats): descriptor = re.search('\nDESCRIPTOR\s+"(.+?)"\n', cgats) if descriptor: descriptor = descriptor.groups()[0] description = safe_unicode(descriptor or lang.getstr("unnamed"), "UTF-8") name = re.sub(r"[\\/:*?\"<>|]+", "_", make_argyll_compatible_path(description))[:255] return os.path.join(config.get_argyll_data_dir(), "%s.%s" % (name, cgats[:7].strip().lower())) def get_header(parent, bitmap=None, label=None, size=(-1, 60), x=80, y=40, repeat_sub_bitmap_h=(220, 0, 2, 60)): w, h = 222, 60 scale = getcfg("app.dpi") / config.get_default_dpi() if scale > 1: size = tuple(int(math.floor(v * scale)) if v > 0 else v for v in size) x, y = [int(round(v * scale)) if v else v for v in (x, y)] repeat_sub_bitmap_h = tuple(int(math.floor(v * scale)) for v in repeat_sub_bitmap_h) w, h = [int(round(v * scale)) for v in (w, h)] header = BitmapBackgroundPanelText(parent) header.label_x = x header.label_y = y header.scalebitmap = (False, ) * 2 header.textshadow = False header.SetBackgroundColour("#336699") header.SetForegroundColour("#FFFFFF") header.SetMaxFontSize(11) label = label or lang.getstr("header") if not bitmap: bitmap = getbitmap("theme/header", False) if bitmap.Size[0] >= w and bitmap.Size[1] >= h: bitmap = bitmap.GetSubBitmap((0, 0, w, h)) header.MinSize = size header.repeat_sub_bitmap_h = repeat_sub_bitmap_h header.SetBitmap(bitmap) header.SetLabel(label) return header def upload_colorimeter_correction(parent=None, params=None): """ Upload colorimeter correction to online database """ path = "/index.php" failure_msg = lang.getstr("colorimeter_correction.upload.failure") # Check for duplicate resp = http_request(parent, "colorimetercorrections." + domain, "GET", path, # Remove CREATED date for calculating hash {"get": True, "hash": md5(re.sub('\nCREATED\s+".+?"\n', "\n\n", safe_str(params['cgats'], "UTF-8")).strip()).hexdigest()}, silent=True) if resp and resp.read().strip().startswith("CC"): wx.CallAfter(InfoDialog, parent, msg=lang.getstr("colorimeter_correction.upload.exists"), ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-information")) return else: # Upload params['put'] = True resp = http_request(parent, domain, "POST", path, params, failure_msg=failure_msg) if resp is not False: if resp.status == 201: wx.CallAfter(InfoDialog, parent, msg=lang.getstr("colorimeter_correction.upload.success"), ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-information")) else: wx.CallAfter(InfoDialog, parent, msg="\n\n".join([failure_msg, resp.read().strip()]), ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error")) def http_request(parent=None, domain=None, request_type="GET", path="", params=None, files=None, headers=None, charset="UTF-8", failure_msg="", silent=False): """ HTTP request wrapper """ if params is None: params = {} if files: content_type, params = encode_multipart_formdata(params.iteritems(), files) else: for key in params: params[key] = safe_str(params[key], charset) params = urllib.urlencode(params) if headers is None: if sys.platform == "darwin": # Python's platform.platform output is useless under Mac OS X # (e.g. 'Darwin-15.0.0-x86_64-i386-64bit' for Mac OS X 10.11 El Capitan) oscpu = "Mac OS X %s; %s" % (mac_ver()[0], mac_ver()[-1]) elif sys.platform == "win32": machine = platform.machine() oscpu = "%s; %s" % (" ".join(filter(lambda v: v, win_ver())), {"AMD64": "x86_64"}.get(machine, machine)) else: # Linux oscpu = "%s; %s" % (' '.join(platform.dist()), platform.machine()) headers = {"User-Agent": "%s/%s (%s)" % (appname, version, oscpu)} if request_type == "GET": path += '?' + params params = None else: if files: headers.update({"Content-Type": content_type, "Content-Length": str(len(params))}) else: headers.update({"Content-Type": "application/x-www-form-urlencoded", "Accept": "text/plain"}) conn = httplib.HTTPConnection(domain) try: conn.request(request_type, path, params, headers) resp = conn.getresponse() except (socket.error, httplib.HTTPException), exception: msg = " ".join([failure_msg, lang.getstr("connection.fail", " ".join([str(arg) for arg in exception.args]))]).strip() safe_print(msg) if not silent: wx.CallAfter(InfoDialog, parent, msg=msg, ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error"), log=False) return False if resp.status >= 400: uri = "http://" + domain + path msg = " ".join([failure_msg, lang.getstr("connection.fail.http", " ".join([str(resp.status), resp.reason]))]).strip() + "\n" + uri safe_print(msg) html = universal_newlines(resp.read().strip()) html = re.sub(r"", "", html, re.I | re.S) html = re.sub(r"", "", html, re.I | re.S) safe_print(html) if not silent: wx.CallAfter(HtmlInfoDialog, parent, msg=msg, html=html, ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error"), log=False) return False return resp def install_scope_handler(event=None, dlg=None): dlg = dlg or event.EventObject.TopLevelParent auth_needed = dlg.install_systemwide.GetValue() if hasattr(dlg.ok, "SetAuthNeeded"): dlg.ok.SetAuthNeeded(auth_needed) if hasattr(dlg, "alt"): dlg.alt.SetAuthNeeded(auth_needed) dlg.buttonpanel.Layout() class Dummy(object): """ Useful if we need an object to attach arbitrary attributes.""" pass class ExtraArgsFrame(BaseFrame): """ Extra commandline arguments window. """ def __init__(self, parent): self.res = TempXmlResource(get_data_path(os.path.join("xrc", "extra.xrc"))) self.res.InsertHandler(xh_floatspin.FloatSpinCtrlXmlHandler()) self.res.InsertHandler(xh_hstretchstatbmp.HStretchStaticBitmapXmlHandler()) self.res.InsertHandler(xh_bitmapctrls.BitmapButton()) self.res.InsertHandler(xh_bitmapctrls.StaticBitmap()) if hasattr(wx, "PreFrame"): # Classic pre = wx.PreFrame() self.res.LoadOnFrame(pre, parent, "extra_args") self.PostCreate(pre) else: # Phoenix wx.Frame.__init__(self) self.res.LoadFrame(self, parent, "extra_args") self.init() self.Bind(wx.EVT_CLOSE, self.OnClose, self) self.SetIcons(config.get_icon_bundle([256, 48, 32, 16], appname)) self.set_child_ctrls_as_attrs(self) child = self.environment_label font = child.Font font.SetWeight(wx.BOLD) child.Font = font # Bind event handlers self.Bind(wx.EVT_TEXT, self.extra_args_handler, id=self.extra_args_dispcal_ctrl.GetId()) self.Bind(wx.EVT_TEXT, self.extra_args_handler, id=self.extra_args_dispread_ctrl.GetId()) self.Bind(wx.EVT_TEXT, self.extra_args_handler, id=self.extra_args_spotread_ctrl.GetId()) self.Bind(wx.EVT_TEXT, self.extra_args_handler, id=self.extra_args_colprof_ctrl.GetId()) self.Bind(wx.EVT_TEXT, self.extra_args_handler, id=self.extra_args_collink_ctrl.GetId()) self.Bind(wx.EVT_TEXT, self.extra_args_handler, id=self.extra_args_targen_ctrl.GetId()) self.setup_language() self.update_controls() def OnClose(self, event): self.Hide() def extra_args_handler(self, event): mapping = {self.extra_args_dispcal_ctrl.GetId(): "extra_args.dispcal", self.extra_args_dispread_ctrl.GetId(): "extra_args.dispread", self.extra_args_spotread_ctrl.GetId(): "extra_args.spotread", self.extra_args_colprof_ctrl.GetId(): "extra_args.colprof", self.extra_args_collink_ctrl.GetId(): "extra_args.collink", self.extra_args_targen_ctrl.GetId(): "extra_args.targen"} pref = mapping.get(event.GetId()) if pref: ctrl = self.FindWindowById(event.GetId()) value = ctrl.GetValue() setcfg(pref, value) def update_controls(self): self.extra_args_dispcal_ctrl.ChangeValue(getcfg("extra_args.dispcal")) self.extra_args_dispread_ctrl.ChangeValue(getcfg("extra_args.dispread")) self.extra_args_spotread_ctrl.ChangeValue(getcfg("extra_args.spotread")) self.extra_args_colprof_ctrl.ChangeValue(getcfg("extra_args.colprof")) self.extra_args_collink_ctrl.ChangeValue(getcfg("extra_args.collink")) self.extra_args_targen_ctrl.ChangeValue(getcfg("extra_args.targen")) self.Sizer.SetSizeHints(self) self.Sizer.Layout() class GamapFrame(BaseFrame): """ Gamut mapping options window. """ def __init__(self, parent): self.res = TempXmlResource(get_data_path(os.path.join("xrc", "gamap.xrc"))) self.res.InsertHandler(xh_filebrowsebutton.FileBrowseButtonWithHistoryXmlHandler()) self.res.InsertHandler(xh_hstretchstatbmp.HStretchStaticBitmapXmlHandler()) self.res.InsertHandler(xh_bitmapctrls.BitmapButton()) self.res.InsertHandler(xh_bitmapctrls.StaticBitmap()) if hasattr(wx, "PreFrame"): # Classic pre = wx.PreFrame() self.res.LoadOnFrame(pre, parent, "gamapframe") self.PostCreate(pre) else: # Phoenix wx.Frame.__init__(self) self.res.LoadFrame(self, parent, "gamapframe") self.init() self.Bind(wx.EVT_CLOSE, self.OnClose, self) self.SetIcons(config.get_icon_bundle([256, 48, 32, 16], appname)) self.panel = self.FindWindowByName("panel") self.set_child_ctrls_as_attrs(self) child = self.gamut_mapping_ciecam02_label font = child.Font font.SetWeight(wx.BOLD) child.Font = font self.gamap_profile = self.FindWindowByName("gamap_profile") self.gamap_profile.changeCallback = self.gamap_profile_handler self.gamap_profile.SetHistory(get_data_path("ref", "\.(icm|icc)$")) self.gamap_profile.SetMaxFontSize(11) self.droptarget = FileDrop(self) self.droptarget.drophandlers = { ".icc": self.drop_handler, ".icm": self.drop_handler } self.gamap_profile.SetDropTarget(self.droptarget) # Bind event handlers self.Bind(wx.EVT_CHECKBOX, self.gamap_perceptual_cb_handler, id=self.gamap_perceptual_cb.GetId()) self.Bind(wx.EVT_CHOICE, self.gamap_perceptual_intent_handler, id=self.gamap_perceptual_intent_ctrl.GetId()) self.Bind(wx.EVT_CHECKBOX, self.gamap_saturation_cb_handler, id=self.gamap_saturation_cb.GetId()) self.Bind(wx.EVT_CHOICE, self.gamap_saturation_intent_handler, id=self.gamap_saturation_intent_ctrl.GetId()) self.Bind(wx.EVT_CHOICE, self.gamap_src_viewcond_handler, id=self.gamap_src_viewcond_ctrl.GetId()) self.Bind(wx.EVT_CHOICE, self.gamap_out_viewcond_handler, id=self.gamap_out_viewcond_ctrl.GetId()) self.Bind(wx.EVT_CHOICE, self.gamap_default_intent_handler, id=self.gamap_default_intent_ctrl.GetId()) self.Bind(wx.EVT_CHECKBOX, self.profile_quality_b2a_ctrl_handler, id=self.low_quality_b2a_cb.GetId()) self.Bind(wx.EVT_CHECKBOX, self.profile_quality_b2a_ctrl_handler, id=self.b2a_hires_cb.GetId()) for v in config.valid_values["profile.b2a.hires.size"]: if v > -1: v = "%sx%sx%s" % ((v, ) * 3) else: v = lang.getstr("auto") self.b2a_size_ctrl.Append(v) self.Bind(wx.EVT_CHOICE, self.b2a_size_ctrl_handler, id=self.b2a_size_ctrl.GetId()) self.Bind(wx.EVT_CHECKBOX, self.profile_quality_b2a_ctrl_handler, id=self.b2a_smooth_cb.GetId()) self.viewconds_ab = OrderedDict() self.viewconds_ba = {} self.viewconds_out_ab = OrderedDict() self.intents_ab = OrderedDict() self.intents_ba = OrderedDict() self.default_intent_ab = {} self.default_intent_ba = {} for i, ri in enumerate(config.valid_values["gamap_default_intent"]): self.default_intent_ab[i] = ri self.default_intent_ba[ri] = i self.setup_language() self.update_controls() self.update_layout() def OnClose(self, event): self.Hide() def b2a_size_ctrl_handler(self, event): v = config.valid_values["profile.b2a.hires.size"][self.b2a_size_ctrl.GetSelection()] if v != getcfg("profile.b2a.hires.size") and self.Parent and \ hasattr(self.Parent, "profile_settings_changed"): self.Parent.profile_settings_changed() setcfg("profile.b2a.hires.size", v) def drop_handler(self, path): self.gamap_profile.SetPath(path) self.gamap_profile_handler() def gamap_profile_handler(self, event=None): v = self.gamap_profile.GetPath() p = bool(v) and os.path.exists(v) if p: try: profile = ICCP.ICCProfile(v) except (IOError, ICCP.ICCProfileInvalidError), exception: p = False InfoDialog(self, msg=lang.getstr("profile.invalid") + "\n" + v, ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error")) self.gamap_profile.SetPath("") v = None else: if event: # pre-select suitable viewing condition if profile.profileClass == "prtr": self.gamap_src_viewcond_ctrl.SetStringSelection( lang.getstr("gamap.viewconds.pp")) else: self.gamap_src_viewcond_ctrl.SetStringSelection( lang.getstr("gamap.viewconds.mt")) self.gamap_src_viewcond_handler() enable_gamap = getcfg("profile.type") in ("l", "x", "X") self.gamap_perceptual_cb.Enable(enable_gamap) self.gamap_perceptual_intent_ctrl.Enable(self.gamap_perceptual_cb.GetValue()) self.gamap_saturation_cb.Enable(enable_gamap) self.gamap_saturation_intent_ctrl.Enable(self.gamap_saturation_cb.GetValue()) c = self.gamap_perceptual_cb.GetValue() or \ self.gamap_saturation_cb.GetValue() self.gamap_profile.Enable(c) self.gamap_src_viewcond_ctrl.Enable(p and c) self.gamap_out_viewcond_ctrl.Enable(p and c) if not ((p and c) or getcfg("profile.b2a.hires")): setcfg("gamap_default_intent", "p") self.gamap_default_intent_ctrl.SetSelection(self.default_intent_ba[getcfg("gamap_default_intent")]) self.gamap_default_intent_ctrl.Enable((p and c) or (getcfg("profile.b2a.hires") and enable_gamap)) if v != getcfg("gamap_profile") and self.Parent and \ hasattr(self.Parent, "profile_settings_changed"): self.Parent.profile_settings_changed() setcfg("gamap_profile", v or None) def gamap_perceptual_cb_handler(self, event=None): v = self.gamap_perceptual_cb.GetValue() if not v: self.gamap_saturation_cb.SetValue(False) self.gamap_saturation_cb_handler() if int(v) != getcfg("gamap_perceptual") and self.Parent and \ hasattr(self.Parent, "profile_settings_changed"): self.Parent.profile_settings_changed() setcfg("gamap_perceptual", int(v)) self.gamap_profile_handler() def gamap_perceptual_intent_handler(self, event=None): v = self.intents_ba[self.gamap_perceptual_intent_ctrl.GetStringSelection()] if v != getcfg("gamap_perceptual_intent") and self.Parent and \ hasattr(self.Parent, "profile_settings_changed"): self.Parent.profile_settings_changed() setcfg("gamap_perceptual_intent", v) def gamap_saturation_cb_handler(self, event=None): v = self.gamap_saturation_cb.GetValue() if v: self.gamap_perceptual_cb.SetValue(True) self.gamap_perceptual_cb_handler() if int(v) != getcfg("gamap_saturation") and self.Parent and \ hasattr(self.Parent, "profile_settings_changed"): self.Parent.profile_settings_changed() setcfg("gamap_saturation", int(v)) self.gamap_profile_handler() def gamap_saturation_intent_handler(self, event=None): v = self.intents_ba[self.gamap_saturation_intent_ctrl.GetStringSelection()] if v != getcfg("gamap_saturation_intent") and self.Parent and \ hasattr(self.Parent, "profile_settings_changed"): self.Parent.profile_settings_changed() setcfg("gamap_saturation_intent", v) def gamap_src_viewcond_handler(self, event=None): v = self.viewconds_ba[self.gamap_src_viewcond_ctrl.GetStringSelection()] if v != getcfg("gamap_src_viewcond") and self.Parent and \ hasattr(self.Parent, "profile_settings_changed"): self.Parent.profile_settings_changed() setcfg("gamap_src_viewcond", v) def gamap_out_viewcond_handler(self, event=None): v = self.viewconds_ba[self.gamap_out_viewcond_ctrl.GetStringSelection()] if v != getcfg("gamap_out_viewcond") and self.Parent and \ hasattr(self.Parent, "profile_settings_changed"): self.Parent.profile_settings_changed() setcfg("gamap_out_viewcond", v) def gamap_default_intent_handler(self, event=None): v = self.gamap_default_intent_ctrl.GetSelection() if (self.default_intent_ab[v] != getcfg("gamap_default_intent") and self.Parent and hasattr(self.Parent, "profile_settings_changed")): self.Parent.profile_settings_changed() setcfg("gamap_default_intent", self.default_intent_ab[v]) def profile_quality_b2a_ctrl_handler(self, event): if (event.GetId() == self.low_quality_b2a_cb.GetId() and self.low_quality_b2a_cb.GetValue()): self.b2a_hires_cb.Enable(False) else: self.b2a_hires_cb.Enable(getcfg("profile.type") in ("l", "x", "X")) hires = self.b2a_hires_cb.GetValue() self.low_quality_b2a_cb.Enable(not hires) if hires: if event.GetId() == self.b2a_smooth_cb.GetId(): setcfg("profile.b2a.hires.smooth", int(self.b2a_smooth_cb.GetValue())) else: self.b2a_smooth_cb.SetValue(bool(getcfg("profile.b2a.hires.smooth"))) else: self.b2a_smooth_cb.SetValue(False) if self.low_quality_b2a_cb.GetValue(): v = "l" else: v = None if (v != getcfg("profile.quality.b2a") or hires != getcfg("profile.b2a.hires")) and self.Parent: self.Parent.profile_settings_changed() setcfg("profile.quality.b2a", v) setcfg("profile.b2a.hires", int(hires)) self.b2a_size_ctrl.Enable(hires) self.b2a_smooth_cb.Enable(hires) self.gamap_profile_handler() if self.Parent: self.Parent.update_bpc() self.Parent.lut3d_update_b2a_controls() if hasattr(self.Parent, "lut3dframe"): self.Parent.lut3dframe.update_controls() def setup_language(self): """ Substitute translated strings for menus, controls, labels and tooltips. """ BaseFrame.setup_language(self) self.gamap_profile.dialogTitle = lang.getstr("gamap.profile") self.gamap_profile.fileMask = lang.getstr("filetype.icc") + "|*.icc;*.icm" intents = list(config.intents) if (self.Parent and hasattr(self.Parent, "worker") and self.Parent.worker.argyll_version < [1, 3, 3]): intents.remove("pa") if (self.Parent and hasattr(self.Parent, "worker") and self.Parent.worker.argyll_version < [1, 8, 3]): intents.remove("lp") for v in intents: lstr = lang.getstr("gamap.intents.%s" % v) self.intents_ab[v] = lstr self.intents_ba[lstr] = v self.gamap_perceptual_intent_ctrl.SetItems( self.intents_ab.values()) self.gamap_saturation_intent_ctrl.SetItems( self.intents_ab.values()) self.viewconds_ab[None] = lang.getstr("default") self.viewconds_ba[lang.getstr("default")] = None for v in viewconds: if self.Parent and hasattr(self.Parent, "worker") and ( (v == "pc" and self.Parent.worker.argyll_version < [1, 1, 1]) or (v == "tv" and self.Parent.worker.argyll_version < [1, 6, 0])): continue lstr = lang.getstr("gamap.viewconds.%s" % v) self.viewconds_ab[v] = lstr self.viewconds_ba[lstr] = v if v not in ("pp", "pe", "pc", "pcd", "ob", "cx"): self.viewconds_out_ab[v] = lstr self.gamap_src_viewcond_ctrl.SetItems( self.viewconds_ab.values()) self.gamap_out_viewcond_ctrl.SetItems( [lang.getstr("default")] + self.viewconds_out_ab.values()) self.gamap_default_intent_ctrl.SetItems([lang.getstr("gamap.intents." + v) for v in config.valid_values["gamap_default_intent"]]) def update_controls(self): """ Update controls with values from the configuration """ # B2A quality enable_gamap = getcfg("profile.type") in ("l", "x", "X") enable_b2a_extra = getcfg("profile.type") in ("l", "x", "X") b2a_hires = enable_b2a_extra and bool(getcfg("profile.b2a.hires")) self.low_quality_b2a_cb.SetValue(enable_gamap and getcfg("profile.quality.b2a") in ("l", "n") and not b2a_hires) self.low_quality_b2a_cb.Enable(enable_gamap and not b2a_hires) self.b2a_hires_cb.SetValue(b2a_hires) self.b2a_hires_cb.Enable(enable_b2a_extra and not self.low_quality_b2a_cb.GetValue()) self.b2a_size_ctrl.SetSelection( config.valid_values["profile.b2a.hires.size"].index( getcfg("profile.b2a.hires.size"))) self.b2a_size_ctrl.Enable(b2a_hires) self.b2a_smooth_cb.SetValue(b2a_hires and bool(getcfg("profile.b2a.hires.smooth"))) self.b2a_smooth_cb.Enable(b2a_hires) # CIECAM02 self.gamap_profile.SetPath(getcfg("gamap_profile")) self.gamap_perceptual_cb.SetValue(enable_gamap and bool(getcfg("gamap_perceptual"))) self.gamap_perceptual_intent_ctrl.SetStringSelection( self.intents_ab.get(getcfg("gamap_perceptual_intent"), self.intents_ab.get(defaults["gamap_perceptual_intent"]))) self.gamap_saturation_cb.SetValue(enable_gamap and bool(getcfg("gamap_saturation"))) self.gamap_saturation_intent_ctrl.SetStringSelection( self.intents_ab.get(getcfg("gamap_saturation_intent"), self.intents_ab.get(defaults["gamap_saturation_intent"]))) self.gamap_src_viewcond_ctrl.SetStringSelection( self.viewconds_ab.get(getcfg("gamap_src_viewcond", False), self.viewconds_ab.get(defaults.get("gamap_src_viewcond")))) self.gamap_out_viewcond_ctrl.SetStringSelection( self.viewconds_ab.get(getcfg("gamap_out_viewcond"), self.viewconds_ab.get(defaults.get("gamap_out_viewcond")))) self.gamap_profile_handler() class MainFrame(ReportFrame, BaseFrame): """ Display calibrator main application window. """ lut3d_apply_cal_ctrl_handler = LUT3DFrame.__dict__["lut3d_apply_cal_ctrl_handler"] lut3d_bind_event_handlers = LUT3DFrame.__dict__["lut3d_bind_event_handlers"] lut3d_create_consumer = LUT3DFrame.__dict__["lut3d_create_consumer"] lut3d_create_handler = LUT3DFrame.__dict__["lut3d_create_handler"] lut3d_create_producer = LUT3DFrame.__dict__["lut3d_create_producer"] lut3d_bitdepth_input_ctrl_handler = LUT3DFrame.__dict__["lut3d_bitdepth_input_ctrl_handler"] lut3d_bitdepth_output_ctrl_handler = LUT3DFrame.__dict__["lut3d_bitdepth_output_ctrl_handler"] lut3d_encoding_input_ctrl_handler = LUT3DFrame.__dict__["lut3d_encoding_input_ctrl_handler"] lut3d_encoding_output_ctrl_handler = LUT3DFrame.__dict__["lut3d_encoding_output_ctrl_handler"] lut3d_enable_size_controls = LUT3DFrame.__dict__["lut3d_enable_size_controls"] lut3d_format_ctrl_handler = LUT3DFrame.__dict__["lut3d_format_ctrl_handler"] lut3d_gamut_mapping_mode_handler = LUT3DFrame.__dict__["lut3d_gamut_mapping_mode_handler"] lut3d_rendering_intent_ctrl_handler = LUT3DFrame.__dict__["lut3d_rendering_intent_ctrl_handler"] lut3d_setup_encoding_ctrl = LUT3DFrame.__dict__["lut3d_setup_encoding_ctrl"] lut3d_setup_language = LUT3DFrame.__dict__["lut3d_setup_language"] lut3d_show_bitdepth_controls = LUT3DFrame.__dict__["lut3d_show_bitdepth_controls"] lut3d_show_encoding_controls = LUT3DFrame.__dict__["lut3d_show_encoding_controls"] lut3d_show_trc_controls = LUT3DFrame.__dict__["lut3d_show_trc_controls"] lut3d_set_option = LUT3DFrame.__dict__["lut3d_set_option"] lut3d_size_ctrl_handler = LUT3DFrame.__dict__["lut3d_size_ctrl_handler"] lut3d_snap_size = LUT3DFrame.__dict__["lut3d_snap_size"] lut3d_trc_ctrl_handler = LUT3DFrame.__dict__["lut3d_trc_ctrl_handler"] lut3d_trc_gamma_ctrl_handler = LUT3DFrame.__dict__["lut3d_trc_gamma_ctrl_handler"] lut3d_trc_gamma_type_ctrl_handler = LUT3DFrame.__dict__["lut3d_trc_gamma_type_ctrl_handler"] lut3d_trc_black_output_offset_ctrl_handler = LUT3DFrame.__dict__["lut3d_trc_black_output_offset_ctrl_handler"] lut3d_update_encoding_controls = LUT3DFrame.__dict__["lut3d_update_encoding_controls"] lut3d_update_shared_controls = LUT3DFrame.__dict__["lut3d_update_shared_controls"] lut3d_update_trc_control = LUT3DFrame.__dict__["lut3d_update_trc_control"] lut3d_update_trc_controls = LUT3DFrame.__dict__["lut3d_update_trc_controls"] # XYZbpout will be set to the blackpoint of the selected profile. This is # used to determine if 3D LUT or measurement report black output offset # controls should be shown. Set a initial value slightly above zero so # output offset controls are shown if the selected profile doesn't exist # and "Create 3D LUT after profiling" is disabled. XYZbpout = [0.001, 0.001, 0.001] def __init__(self, worker): # Check for required resource files and get pre-canned testcharts self.dist_testcharts = [] self.dist_testchart_names = [] missing = [] for filename in resfiles: path, ext = (get_data_path(os.path.sep.join(filename.split("/"))), os.path.splitext(filename)[1]) if (not path or not os.path.isfile(path)): missing.append(filename) elif ext.lower() == ".ti1": self.dist_testcharts.append(path) self.dist_testchart_names.append(os.path.basename(path)) if missing: wx.CallAfter(show_result_dialog, lang.getstr("resources.notfound.warning") + "\n" + safe_unicode("\n".join(missing)), self) # Initialize GUI self.res = TempXmlResource(get_data_path(os.path.join("xrc", "main.xrc"))) self.res.InsertHandler(xh_fancytext.StaticFancyTextCtrlXmlHandler()) self.res.InsertHandler(xh_floatspin.FloatSpinCtrlXmlHandler()) self.res.InsertHandler(xh_hstretchstatbmp.HStretchStaticBitmapXmlHandler()) self.res.InsertHandler(xh_bitmapctrls.BitmapButton()) self.res.InsertHandler(xh_bitmapctrls.StaticBitmap()) if hasattr(wx, "PreFrame"): # Classic pre = wx.PreFrame() self.res.LoadOnFrame(pre, None, "mainframe") self.PostCreate(pre) else: # Phoenix wx.Frame.__init__(self) self.res.LoadFrame(self, None, "mainframe") self.init() self.worker = worker self.worker.owner = self result = self.worker.create_tempdir() if isinstance(result, Exception): safe_print(result) if sys.platform == "win32": self.maxprofilenamelength = 254 - len(self.worker.tempdir or "") else: self.maxprofilenamelength = 255 self.init_frame() self.init_defaults() self.set_child_ctrls_as_attrs(self) self.init_infoframe() if sys.platform in ("darwin", "win32") or isexe: self.init_measureframe() self.init_menus() self.init_controls() self.show_advanced_options_handler() self.setup_language() self.update_displays(update_ccmx_items=False) self.update_comports() self.update_controls(update_ccmx_items=False) self.set_size(True, True) self.calpanel.SetScrollRate(2, 2) x, y = getcfg("position.x", False), getcfg("position.y", False) if not None in (x, y): self.SetSaneGeometry(x, y) else: self.Center() self.Bind(wx.EVT_MOVE, self.OnMove, self) if verbose >= 1: safe_print(lang.getstr("success")) # Check for and load default calibration if len(self.worker.displays): if getcfg("calibration.file", False): # Load LUT curves from last used .cal file self.load_cal(silent=True) else: # Load LUT curves from current display profile (if any, and # if it contains curves) self.load_display_profile_cal(None) self.init_timers() if verbose >= 1: safe_print(lang.getstr("ready")) def log(self): """ Append log buffer contents to the log window. """ # We do this after all initialization because the log.log() function # expects the window to be fully created and accessible via # wx.GetApp().frame.infoframe if not hasattr(self, "logoffset"): # Skip the very first line, which is just '=' * 80 self.logoffset = 1 else: self.logoffset = 0 logbuffer.seek(0) self.infoframe.Log("".join([line.decode("UTF-8", "replace") for line in logbuffer][self.logoffset:]).rstrip()) logbuffer.truncate(0) def init_defaults(self): """ Initialize GUI-specific defaults. """ defaults.update({ "position.info.x": self.GetDisplay().ClientArea[0] + 30, "position.info.y": self.GetDisplay().ClientArea[1] + 30, "position.lut_viewer.x": self.GetDisplay().ClientArea[0] + 40, "position.lut_viewer.y": self.GetDisplay().ClientArea[1] + 40, "position.progress.x": self.GetDisplay().ClientArea[0] + 30, "position.progress.y": self.GetDisplay().ClientArea[1] + 30, "position.x": self.GetDisplay().ClientArea[0] + 20, "position.y": self.GetDisplay().ClientArea[1] + 20 }) self.recent_cals = getcfg("recent_cals").split(os.pathsep) while "" in self.recent_cals: self.recent_cals.remove("") self.recent_cals.insert(0, "") self.presets = [] presets = get_data_path("presets", ".*\.(?:icc|icm)$") if isinstance(presets, list): self.presets = natsort(presets) self.presets.reverse() for preset in self.presets: if not preset in self.recent_cals: self.recent_cals.insert(1, preset) self.static_labels = [] self.updatingctrls = False # Left side - internal enumeration, right side - commmandline self.whitepoint_colortemp_loci_ab = { 0: "t", 1: "T" } # Left side - commmandline, right side - internal enumeration self.whitepoint_colortemp_loci_ba = { "t": 0, "T": 1 } # Left side - commmandline, right side - internal enumeration self.quality_ab = { 1: "v", 2: "l", 3: "m", 4: "h", 5: "u" } self.quality_b2a_ab = { 0: "n", 1: "l", 2: "m", 3: "h", 4: "u" } # Left side - commmandline, right side - internal enumeration self.quality_ba = swap_dict_keys_values(self.quality_ab) self.testchart_defaults = config.testchart_defaults self.testcharts = [] self.testchart_names = [] # Left side - commmandline, right side - .cal file self.trc_ab = { "l": "L_STAR", "709": "REC709", "s": "sRGB", "240": "SMPTE240M" } # Left side - .cal file, right side - commmandline self.trc_ba = swap_dict_keys_values(self.trc_ab) # Left side - internal enumeration, right side - commmandline self.trc_types_ab = { 0: "g", 1: "G" } # Left side - commmandline, right side - internal enumeration self.trc_types_ba = swap_dict_keys_values(self.trc_types_ab) self.trc_presets = [ "1.8", "2.0", "2.2", "2.4" ] self.whitepoint_presets = [ "5000", "5500", "6000", "6500" ] def init_frame(self): """ Initialize the main window and its event handlers. Controls are initialized in a separate step (see init_controls). """ # UGLY HACK: This 'safe_print' call fixes a GTK assertion and # segfault under Arch Linux when setting the window title safe_print("") title = "%s %s" % (appname, version_short) if VERSION > VERSION_BASE: title += " Beta" self.SetTitle(title) self.SetMaxSize((-1, -1)) self.SetIcons(config.get_icon_bundle([256, 48, 32, 16], appname)) self.Bind(wx.EVT_CLOSE, self.OnClose, self) self.Bind(wx.EVT_SIZE, self.OnResize, self) self.droptarget = FileDrop(self) self.droptarget.drophandlers = { ".7z": self.cal_drop_handler, ".cal": self.cal_drop_handler, ".ccmx": self.ccxx_drop_handler, ".ccss": self.ccxx_drop_handler, ".icc": self.cal_drop_handler, ".icm": self.cal_drop_handler, ".tar.gz": self.cal_drop_handler, ".ti1": self.ti1_drop_handler, ".ti3": self.ti3_drop_handler, ".tgz": self.cal_drop_handler, ".zip": self.cal_drop_handler } # Main panel self.panel = self.FindWindowByName("panel") self.panel.SetDropTarget(self.droptarget) # Header # Its width also determines the initial min width of the main window # after SetSizeHints and Layout self.header = get_header(self.panel) self.headerpanel = self.FindWindowByName("headerpanel") self.headerpanel.ContainingSizer.Insert(0, self.header, flag=wx.EXPAND) y = 60 w = 80 h = 120 scale = getcfg("app.dpi") / config.get_default_dpi() if scale > 1: y, w, h = [int(math.floor(v * scale)) for v in (y, w, h)] self.header_btm = BitmapBackgroundPanel(self.headerpanel, size=(w, -1)) self.header_btm.BackgroundColour = "#336699" self.header_btm.scalebitmap = False, False header_bmp = getbitmap("theme/header", False) if header_bmp.Size[0] >= w and header_bmp.Size[1] >= h + y: header_bmp = header_bmp.GetSubBitmap((0, y, w, h)) self.header_btm.SetBitmap(header_bmp) self.headerpanel.Sizer.Insert(0, self.header_btm, flag=wx.ALIGN_TOP | wx.EXPAND) #separator = BitmapBackgroundPanel(self.panel, size=(-1, 1)) #separator.SetBackgroundColour(wx.SystemSettings.GetColour(wx.SYS_COLOUR_3DSHADOW)) #self.panel.Sizer.Insert(2, separator, flag=wx.EXPAND) # Calibration settings panel self.calpanel = self.FindWindowByName("calpanel") self.display_instrument_panel = self.FindWindowByName("display_instrument_panel") self.calibration_settings_panel = self.FindWindowByName("calibration_settings_panel") self.profile_settings_panel = self.FindWindowByName("profile_settings_panel") self.lut3d_settings_panel = self.FindWindowByName("lut3d_settings_panel") # Verification / measurement report res = TempXmlResource(get_data_path(os.path.join("xrc", "report.xrc"))) res.InsertHandler(xh_fancytext.StaticFancyTextCtrlXmlHandler()) res.InsertHandler(xh_filebrowsebutton.FileBrowseButtonWithHistoryXmlHandler()) res.InsertHandler(xh_hstretchstatbmp.HStretchStaticBitmapXmlHandler()) res.InsertHandler(xh_bitmapctrls.BitmapButton()) res.InsertHandler(xh_bitmapctrls.StaticBitmap()) self.mr_settings_panel = res.LoadPanel(self.calpanel, "panel") self.calpanel.Sizer.Add(self.mr_settings_panel, 1, flag=wx.EXPAND) # Make info panels use theme color for panel_name in ["display_instrument_info_panel", "calibration_settings_info_panel", "profile_settings_info_panel", "lut3d_settings_info_panel", "mr_settings_info_panel"]: panel = self.FindWindowByName(panel_name) panel.BackgroundColour = wx.SystemSettings.GetColour(wx.SYS_COLOUR_WINDOW) # Button panel self.buttonpanel = self.FindWindowByName("buttonpanel") sizer = self.buttonpanel.ContainingSizer if hasattr(sizer, "GetItemIndex"): # wxPython 2.8.12+ separator = BitmapBackgroundPanel(self.panel, size=(-1, 1)) separator.SetBackgroundColour(wx.SystemSettings.GetColour(wx.SYS_COLOUR_3DSHADOW)) sizer.Insert(sizer.GetItemIndex(self.buttonpanel), separator, flag=wx.EXPAND) self.buttonpanelheader = BitmapBackgroundPanel(self.panel, size=(-1, 15)) bmp = getbitmap("theme/gradient", False) if bmp.Size[0] >= 8 and bmp.Size[1] >= 96: bmp = bmp.GetSubBitmap((0, 1, 8, 15)).ConvertToImage().Mirror(False).ConvertToBitmap() image = bmp.ConvertToImage() databuffer = image.GetDataBuffer() for i, byte in enumerate(databuffer): if byte > "\0": databuffer[i] = chr(int(min(round(ord(byte) * (255.0 / 223.0)), 255))) bmp = image.ConvertToBitmap() self.buttonpanelheader.SetBitmap(bmp) sizer.Insert(sizer.GetItemIndex(self.buttonpanel), self.buttonpanelheader, flag=wx.EXPAND) bgcolor = self.buttonpanel.BackgroundColour self.buttonpanel.SetBackgroundColour(wx.Colour(*[int(v * .93) for v in bgcolor])) self.buttonpanelheader.SetBackgroundColour(self.buttonpanel.BackgroundColour) self.buttonpanelheader.blend = True # Tab panel self.tabpanel = self.FindWindowByName("tabpanel") sizer = self.tabpanel.ContainingSizer if hasattr(sizer, "GetItemIndex"): # wxPython 2.8.12+ separator = BitmapBackgroundPanel(self.panel, size=(-1, 1)) separator.SetBackgroundColour(wx.SystemSettings.GetColour(wx.SYS_COLOUR_3DSHADOW)) sizer.Insert(sizer.GetItemIndex(self.tabpanel) + 1, separator, flag=wx.EXPAND) self.tabpanelheader = BitmapBackgroundPanel(self.panel, size=(-1, 15)) self.tabpanelfooter = BitmapBackgroundPanel(self.panel, size=(-1, 15)) bmp = getbitmap("theme/gradient", False) if bmp.Size[0] >= 8 and bmp.Size[1] >= 96: sub = bmp.GetSubBitmap((0, 1, 8, 15)).ConvertToImage() bmp = sub.Mirror(False).ConvertToBitmap() image2 = bmp.ConvertToImage() databuffer = image2.GetDataBuffer() for i, byte in enumerate(databuffer): if byte > "\0": databuffer[i] = chr(int(min(round((ord(byte) - 153) * (255.0 / 70.0)), 255))) bmp = image2.ConvertToBitmap() self.tabpanelheader.SetBitmap(bmp) bmp = image.Mirror(False).ConvertToBitmap() self.tabpanelfooter.SetBitmap(bmp) sizer.Insert(sizer.GetItemIndex(self.tabpanel), self.tabpanelheader, flag=wx.EXPAND) sizer.Insert(sizer.GetItemIndex(self.tabpanel) + 1, self.tabpanelfooter, flag=wx.EXPAND) bgcolor = self.tabpanel.BackgroundColour self.tabpanel.SetBackgroundColour(wx.Colour(*[int(v * .2125) for v in bgcolor])) self.tabpanel.ForegroundColour = "#EEEEEE" self.tabpanelheader.SetBackgroundColour(self.tabpanel.BackgroundColour) self.tabpanelheader.blend = True self.tabpanelfooter.SetBackgroundColour(self.tabpanel.BackgroundColour) self.tabpanelfooter.blend = True # Add tab buttons self.display_instrument_btn = PlateButton(self.tabpanel, -1, label="display-instrument", bmp=geticon(48, "display-instrument"), style=platebtn.PB_STYLE_GRADIENT | platebtn.PB_STYLE_TOGGLE) self.display_instrument_btn.Bind(wx.EVT_TOGGLEBUTTON, self.tab_select_handler) self.tabpanel.Sizer.Insert(1, self.display_instrument_btn, flag=wx.LEFT, border=8) self.calibration_settings_btn = PlateButton(self.tabpanel, -1, label="calibration", bmp=geticon(48, "calibration"), style=platebtn.PB_STYLE_GRADIENT | platebtn.PB_STYLE_TOGGLE) self.calibration_settings_btn.Bind(wx.EVT_TOGGLEBUTTON, self.tab_select_handler) self.tabpanel.Sizer.Insert(2, self.calibration_settings_btn, flag=wx.LEFT, border=8) self.profile_settings_btn = PlateButton(self.tabpanel, -1, label="profiling", bmp=geticon(48, "profiling"), style=platebtn.PB_STYLE_GRADIENT | platebtn.PB_STYLE_TOGGLE) self.profile_settings_btn.Bind(wx.EVT_TOGGLEBUTTON, self.tab_select_handler) self.tabpanel.Sizer.Insert(3, self.profile_settings_btn, flag=wx.LEFT, border=8) self.lut3d_settings_btn = PlateButton(self.tabpanel, -1, label="3dlut", bmp=geticon(48, "3dlut"), style=platebtn.PB_STYLE_GRADIENT | platebtn.PB_STYLE_TOGGLE) self.lut3d_settings_btn.Bind(wx.EVT_TOGGLEBUTTON, self.tab_select_handler) self.tabpanel.Sizer.Insert(4, self.lut3d_settings_btn, flag=wx.LEFT, border=8) self.mr_settings_btn = PlateButton(self.tabpanel, -1, label="verification", bmp=geticon(48, "dialog-ok"), style=platebtn.PB_STYLE_GRADIENT | platebtn.PB_STYLE_TOGGLE) self.mr_settings_btn.Bind(wx.EVT_TOGGLEBUTTON, self.tab_select_handler) self.tabpanel.Sizer.Insert(5, self.mr_settings_btn, flag=wx.LEFT | wx.RIGHT, border=8) for btn in (self.display_instrument_btn, self.calibration_settings_btn, self.profile_settings_btn, self.lut3d_settings_btn, self.mr_settings_btn): set_bitmap_labels(btn, True, False, False) btn.SetPressColor(wx.Colour(0x66, 0x66, 0x66)) btn.SetLabelColor(self.tabpanel.ForegroundColour, wx.WHITE) self.tab_select_handler(self.display_instrument_btn) self.profile_info = {} def init_timers(self): """ Setup the timers for display/instrument detection and profile name. """ self.update_profile_name_timer = wx.Timer(self) self.Bind(wx.EVT_TIMER, self.update_profile_name, self.update_profile_name_timer) def OnMove(self, event=None): # When moving, check if we are on another screen and resize if needed. if self.IsShownOnScreen() and not self.IsMaximized() and not \ self.IsIconized(): x, y = self.GetScreenPosition() setcfg("position.x", x) setcfg("position.y", y) display_client_rect = self.GetDisplay().ClientArea if (not hasattr(self, "display_client_rect") or self.display_client_rect != display_client_rect): # We just moved to this workspace if sys.platform not in ("darwin", "win32"): # Linux safety_margin = 40 else: safety_margin = 20 resize = False if (self.Size[0] > display_client_rect[2] or self.Size[1] > display_client_rect[3] - safety_margin): # Our size is too large for that workspace, adjust resize = True elif (self.Size[0] < (self.Size[0] - self.calpanel.Size[0] + self.calpanel.VirtualSize[0]) or self.Size[1] < (self.Size[1] - self.calpanel.Size[1] + self.calpanel.VirtualSize[1])): # Our full size fits on that workspace resize = True self.display_client_rect = display_client_rect if resize: wx.CallAfter(self.set_size, True) if event: event.Skip() def OnResize(self, event): # Hide the header bitmap on small screens scale = getcfg("app.dpi") / config.get_default_dpi() if scale < 1: scale = 1 self.header.GetContainingSizer().Show( self.header, self.Size[1] > 480 * scale) event.Skip() def cal_drop_handler(self, path): """ Drag'n'drop handler for .cal files. Settings and calibration are loaded from dropped files. """ if not self.worker.is_working(): self.load_cal_handler(None, path) def ccxx_drop_handler(self, path): """ Drag'n'drop handler for .ccmx/.ccss files. """ if not self.worker.is_working(): self.colorimeter_correction_matrix_ctrl_handler(None, path) def ti1_drop_handler(self, path): """ Drag'n'drop handler for .ti1 files. Dropped files are added to the testchart chooser and selected. """ if not self.worker.is_working(): self.testchart_btn_handler(None, path) def ti3_drop_handler(self, path): """ Drag'n'drop handler for .ti3 files. Dropped files are used to create an ICC profile. """ if not self.worker.is_working(): self.create_profile_handler(None, path) def init_gamapframe(self): """ Create & initialize the gamut mapping options window and its controls. """ self.gamapframe = GamapFrame(self) def init_infoframe(self, show=None): """ Create & initialize the info (log) window and its controls. """ self.infoframe = LogWindow(self) self.infoframe.Bind(wx.EVT_CLOSE, self.infoframe_close_handler, self.infoframe) self.infoframe.SetIcons(config.get_icon_bundle([256, 48, 32, 16], appname)) if show: self.infoframe_toggle_handler(show=show) def init_lut3dframe(self): """ Create & initialize the 3D LUT creation window and its controls. """ self.lut3dframe = LUT3DFrame(self) def init_reportframe(self): """ Create & initialize the measurement report creation window and its controls. """ self.reportframe = ReportFrame(self) self.reportframe.measurement_report_btn.Bind(wx.EVT_BUTTON, self.measurement_report_handler) def init_synthiccframe(self): """ Create & initialize the 3D LUT creation window and its controls. """ self.synthiccframe = SynthICCFrame(self) def infoframe_close_handler(self, event): self.infoframe_toggle_handler(event) def setup_language(self): """ Substitute translated strings for menus, controls, labels and tooltips. """ # Set language specific defaults lang.update_defaults() # Translate controls and labels BaseFrame.setup_language(self) settings = [lang.getstr("settings.new")] for cal in self.recent_cals[1:]: lstr = lang.getstr(os.path.basename(cal)) if cal == getcfg("calibration.file", False) and getcfg("settings.changed"): lstr = "* " + lstr settings.append(lstr) self.calibration_file_ctrl.SetItems(settings) self.observers_ab = OrderedDict() for observer in config.valid_values["observer"]: self.observers_ab[observer] = lang.getstr("observer." + observer) self.observers_ba = swap_dict_keys_values(self.observers_ab) self.observer_ctrl.SetItems(self.observers_ab.values()) self.whitepoint_ctrl.SetItems([lang.getstr("as_measured"), lang.getstr("whitepoint.colortemp"), lang.getstr("whitepoint.xy")]) self.whitepoint_colortemp_loci = [ lang.getstr("whitepoint.colortemp.locus.daylight"), lang.getstr("whitepoint.colortemp.locus.blackbody") ] self.whitepoint_colortemp_locus_ctrl.SetItems( self.whitepoint_colortemp_loci) self.luminance_ctrl.SetItems([lang.getstr("as_measured"), lang.getstr("custom")]) self.black_luminance_ctrl.SetItems([lang.getstr("as_measured"), lang.getstr("custom")]) self.trc_ctrl.SetItems([lang.getstr("as_measured"), "Gamma 2.2", lang.getstr("trc.lstar"), lang.getstr("trc.rec709"), lang.getstr("trc.rec1886"), lang.getstr("trc.smpte240m"), lang.getstr("trc.srgb"), lang.getstr("custom")]) self.trc_types = [ lang.getstr("trc.type.relative"), lang.getstr("trc.type.absolute") ] self.trc_type_ctrl.SetItems(self.trc_types) self.update_profile_type_ctrl_items() self.default_testchart_names = [] for testcharts in self.testchart_defaults.values(): for chart in testcharts.values(): chart = lang.getstr(chart) if not chart in self.default_testchart_names: self.default_testchart_names.append(chart) self.lut3d_setup_language() self.mr_setup_language() def set_size(self, set_height=False, fit_width=False): if not self.IsFrozen(): self.Freeze() self.SetMinSize((0, 0)) if set_height: if sys.platform not in ("darwin", "win32"): # Linux safety_margin = 40 else: safety_margin = 20 borders_tb = self.Size[1] - self.ClientSize[1] height = min(self.GetDisplay().ClientArea[3] - borders_tb - safety_margin, self.header.Size[1] + self.headerpanel.Sizer.MinSize[1] + 1 + ((getattr(self, "tabpanelheader", None) and self.tabpanelheader.Size[1] + 1) or 0) + self.tabpanel.Sizer.MinSize[1] + ((getattr(self, "tabpanelfooter", None) and self.tabpanelfooter.Size[1] + 1) or 0) + self.display_instrument_panel.Sizer.MinSize[1] + ((getattr(self, "buttonpanelheader", None) and self.buttonpanelheader.Size[1] + 1) or 0) + self.buttonpanel.Sizer.MinSize[1]) else: height = self.ClientSize[1] borders_lr = self.Size[0] - self.ClientSize[0] scale = getcfg("app.dpi") / config.get_default_dpi() margin = 34 header_min_h = 64 if scale > 1: margin = int(round(margin * scale)) header_min_h = int(round(header_min_h * scale)) size = (min(self.GetDisplay().ClientArea[2], max(self.GetMinSize()[0], max(self.display_instrument_panel.Sizer.MinSize[0], self.calibration_settings_panel.Sizer.MinSize[0], self.profile_settings_panel.Sizer.MinSize[0], self.lut3d_settings_panel.Sizer.MinSize[0], self.mr_settings_panel.Sizer.MinSize[0]) + margin, self.tabpanel.GetSizer().GetMinSize()[0])), height) self.SetMaxSize((-1, -1)) if not self.IsMaximized() and not self.IsIconized(): self.SetClientSize(((size[0] if fit_width else max(size[0], self.Size[0])) - borders_lr, size[1])) self.SetMinSize((size[0], self.GetSize()[1] - self.calpanel.GetSize()[1] + header_min_h)) if self.IsFrozen(): self.Thaw() if self.IsShown(): self.calpanel.Layout() def update_profile_type_ctrl(self): self.profile_type_ctrl.SetSelection( self.profile_types_ba.get(getcfg("profile.type"), self.profile_types_ba.get(defaults["profile.type"], 0))) def update_profile_type_ctrl_items(self): """ Populate the profile type control with available choices depending on Argyll version. """ self.profile_types = [ lang.getstr("profile.type.lut.lab"), lang.getstr("profile.type.shaper_matrix"), lang.getstr("profile.type.single_shaper_matrix"), lang.getstr("profile.type.gamma_matrix"), lang.getstr("profile.type.single_gamma_matrix") ] self.profile_types_ab = {} profile_types_index = 0 if self.worker.argyll_version[0:3] > [1, 1, 0] or ( self.worker.argyll_version[0:3] == [1, 1, 0] and not "Beta" in self.worker.argyll_version_string and not "RC1" in self.worker.argyll_version_string and not "RC2" in self.worker.argyll_version_string and not "RC3" in self.worker.argyll_version_string): # Argyll 1.1.0_RC3 had a bug when using -aX # which was fixed in 1.1.0_RC4 self.profile_types.insert(profile_types_index, lang.getstr("profile.type.lut_matrix.xyz")) self.profile_types_ab[profile_types_index] = "X" # XYZ LUT + accurate matrix profile_types_index += 1 if self.worker.argyll_version[0:3] > [1, 1, 0] or ( self.worker.argyll_version[0:3] == [1, 1, 0] and not "Beta" in self.worker.argyll_version_string and not "RC1" in self.worker.argyll_version_string and not "RC2" in self.worker.argyll_version_string): # Windows wants matrix tags in XYZ LUT profiles, # which is satisfied with Argyll >= 1.1.0_RC3 self.profile_types.insert(profile_types_index, lang.getstr("profile.type.lut_rg_swapped_matrix.xyz")) self.profile_types_ab[profile_types_index] = "x" # XYZ LUT + dummy matrix (R <-> G swapped) profile_types_index += 1 elif sys.platform != "win32": self.profile_types.insert(profile_types_index, lang.getstr("profile.type.lut.xyz")) self.profile_types_ab[profile_types_index] = "x" # XYZ LUT profile_types_index += 1 self.profile_type_ctrl.SetItems(self.profile_types) self.profile_types_ab[profile_types_index] = "l" self.profile_types_ab[profile_types_index + 1] = "s" self.profile_types_ab[profile_types_index + 2] = "S" self.profile_types_ab[profile_types_index + 3] = "g" self.profile_types_ab[profile_types_index + 4] = "G" self.profile_types_ba = swap_dict_keys_values(self.profile_types_ab) def init_measureframe(self): """ Create & initialize the measurement window and its controls. """ self.measureframe = MeasureFrame(self, -1) def init_menus(self): """ Initialize the menus and menuitem event handlers. """ res = TempXmlResource(get_data_path(os.path.join("xrc", "mainmenu.xrc"))) self.menubar = res.LoadMenuBar("menu") file_ = self.menubar.GetMenu(self.menubar.FindMenu("menu.file")) menuitem = file_.FindItemById(file_.FindItem("calibration.load")) self.Bind(wx.EVT_MENU, self.load_cal_handler, menuitem) menuitem = file_.FindItemById(file_.FindItem("testchart.set")) self.Bind(wx.EVT_MENU, self.testchart_btn_handler, menuitem) self.menuitem_testchart_edit = file_.FindItemById(file_.FindItem("testchart.edit")) self.Bind(wx.EVT_MENU, self.create_testchart_btn_handler, self.menuitem_testchart_edit) menuitem = file_.FindItemById(file_.FindItem("profile.set_save_path")) self.Bind(wx.EVT_MENU, self.profile_save_path_btn_handler, menuitem) self.menuitem_profile_info = file_.FindItemById(file_.FindItem("profile.info")) self.Bind(wx.EVT_MENU, self.profile_info_handler, self.menuitem_profile_info) if sys.platform != "darwin" or wx.VERSION >= (2, 9): file_.AppendSeparator() self.menuitem_prefs = file_.Append( -1 if wx.VERSION < (2, 9) else wx.ID_PREFERENCES, "&" + "menuitem.set_argyll_bin") self.Bind(wx.EVT_MENU, self.set_argyll_bin_handler, self.menuitem_prefs) if sys.platform != "darwin" or wx.VERSION >= (2, 9): file_.AppendSeparator() self.menuitem_quit = file_.Append( -1 if wx.VERSION < (2, 9) else wx.ID_EXIT, "&menuitem.quit\tCtrl+Q") self.Bind(wx.EVT_MENU, self.OnClose, self.menuitem_quit) options = self.menubar.GetMenu(self.menubar.FindMenu("menu.options")) self.menuitem_measure_testchart = options.FindItemById( options.FindItem("measure.testchart")) self.Bind(wx.EVT_MENU, self.measure_handler, self.menuitem_measure_testchart) self.menuitem_create_profile = options.FindItemById( options.FindItem("create_profile")) self.Bind(wx.EVT_MENU, self.create_profile_handler, self.menuitem_create_profile) self.menuitem_create_profile_from_edid = options.FindItemById( options.FindItem("create_profile_from_edid")) self.Bind(wx.EVT_MENU, self.create_profile_from_edid, self.menuitem_create_profile_from_edid) self.menuitem_profile_hires_b2a = options.FindItemById( options.FindItem("profile.b2a.hires")) self.Bind(wx.EVT_MENU, self.profile_hires_b2a_handler, self.menuitem_profile_hires_b2a) self.menuitem_install_display_profile = options.FindItemById( options.FindItem("install_display_profile")) self.Bind(wx.EVT_MENU, self.select_install_profile_handler, self.menuitem_install_display_profile) self.menuitem_profile_share = options.FindItemById( options.FindItem("profile.share")) self.Bind(wx.EVT_MENU, self.profile_share_handler, self.menuitem_profile_share) self.menuitem_load_lut_from_cal_or_profile = options.FindItemById( options.FindItem("calibration.load_from_cal_or_profile")) self.Bind(wx.EVT_MENU, self.load_profile_cal_handler, self.menuitem_load_lut_from_cal_or_profile) self.menuitem_load_lut_from_display_profile = options.FindItemById( options.FindItem("calibration.load_from_display_profile")) self.Bind(wx.EVT_MENU, self.load_display_profile_cal, self.menuitem_load_lut_from_display_profile) self.menuitem_lut_reset = options.FindItemById( options.FindItem("calibration.reset")) self.Bind(wx.EVT_MENU, self.reset_cal, self.menuitem_lut_reset) menuitem = options.FindItemById( options.FindItem("detect_displays_and_ports")) self.Bind(wx.EVT_MENU, self.check_update_controls, menuitem) self.menuitem_use_separate_lut_access = options.FindItemById( options.FindItem("use_separate_lut_access")) self.Bind(wx.EVT_MENU, self.use_separate_lut_access_handler, self.menuitem_use_separate_lut_access) self.menuitem_do_not_use_video_lut = options.FindItemById( options.FindItem("calibration.do_not_use_video_lut")) self.Bind(wx.EVT_MENU, self.do_not_use_video_lut_handler, self.menuitem_do_not_use_video_lut) self.menuitem_allow_skip_sensor_cal = options.FindItemById( options.FindItem("allow_skip_sensor_cal")) self.Bind(wx.EVT_MENU, self.allow_skip_sensor_cal_handler, self.menuitem_allow_skip_sensor_cal) self.menuitem_calibrate_instrument = options.FindItemById( options.FindItem("calibrate_instrument")) self.Bind(wx.EVT_MENU, self.calibrate_instrument_handler, self.menuitem_calibrate_instrument) self.menuitem_show_advanced_options = options.FindItemById( options.FindItem("show_advanced_options")) self.Bind(wx.EVT_MENU, self.show_advanced_options_handler, self.menuitem_show_advanced_options) self.menuitem_enable_3dlut_tab = options.FindItemById( options.FindItem("3dlut.tab.enable")) self.Bind(wx.EVT_MENU, self.enable_3dlut_tab_handler, self.menuitem_enable_3dlut_tab) menuitem = options.FindItemById(options.FindItem("extra_args")) self.Bind(wx.EVT_MENU, self.extra_args_handler, menuitem) self.menuitem_enable_argyll_debug = options.FindItemById( options.FindItem("enable_argyll_debug")) self.Bind(wx.EVT_MENU, self.enable_argyll_debug_handler, self.menuitem_enable_argyll_debug) self.menuitem_enable_dry_run = options.FindItemById( options.FindItem("dry_run")) self.Bind(wx.EVT_MENU, self.enable_dry_run_handler, self.menuitem_enable_dry_run) self.menuitem_startup_sound = options.FindItemById( options.FindItem("startup_sound.enable")) self.Bind(wx.EVT_MENU, self.startup_sound_enable_handler, self.menuitem_startup_sound) self.menuitem_use_fancy_progress = options.FindItemById( options.FindItem("use_fancy_progress")) self.Bind(wx.EVT_MENU, self.use_fancy_progress_handler, self.menuitem_use_fancy_progress) menuitem = options.FindItemById(options.FindItem("restore_defaults")) self.Bind(wx.EVT_MENU, self.restore_defaults_handler, menuitem) tools = self.menubar.GetMenu(self.menubar.FindMenu("menu.tools")) self.menuitem_report_uncalibrated = tools.FindItemById( tools.FindItem("report.uncalibrated")) self.Bind(wx.EVT_MENU, self.report_uncalibrated_handler, self.menuitem_report_uncalibrated) self.menuitem_report_calibrated = tools.FindItemById( tools.FindItem("report.calibrated")) self.Bind(wx.EVT_MENU, self.report_calibrated_handler, self.menuitem_report_calibrated) self.menuitem_calibration_verify = tools.FindItemById( tools.FindItem("calibration.verify")) self.Bind(wx.EVT_MENU, self.verify_calibration_handler, self.menuitem_calibration_verify) menuitem = tools.FindItemById( tools.FindItem("measurement_report.update")) self.Bind(wx.EVT_MENU, self.update_measurement_report, menuitem) self.menuitem_measure_uniformity = tools.FindItemById( tools.FindItem("report.uniformity")) self.Bind(wx.EVT_MENU, self.measure_uniformity_handler, self.menuitem_measure_uniformity) self.menuitem_measurement_file_check = tools.FindItemById( tools.FindItem("measurement_file.check_sanity")) self.Bind(wx.EVT_MENU, self.measurement_file_check_handler, self.menuitem_measurement_file_check) self.menuitem_measurement_file_check_auto = tools.FindItemById( tools.FindItem("measurement_file.check_sanity.auto")) self.Bind(wx.EVT_MENU, self.measurement_file_check_auto_handler, self.menuitem_measurement_file_check_auto) self.menuitem_import_colorimeter_correction = tools.FindItemById( tools.FindItem("colorimeter_correction.import")) self.Bind(wx.EVT_MENU, self.import_colorimeter_corrections_handler, self.menuitem_import_colorimeter_correction) self.menuitem_create_colorimeter_correction = tools.FindItemById( tools.FindItem("colorimeter_correction.create")) self.Bind(wx.EVT_MENU, self.create_colorimeter_correction_handler, self.menuitem_create_colorimeter_correction) self.menuitem_upload_colorimeter_correction = tools.FindItemById( tools.FindItem("colorimeter_correction.upload")) self.Bind(wx.EVT_MENU, self.upload_colorimeter_correction_handler, self.menuitem_upload_colorimeter_correction) self.menuitem_synthicc_create = tools.FindItemById( tools.FindItem("synthicc.create")) self.Bind(wx.EVT_MENU, self.synthicc_create_handler, self.menuitem_synthicc_create) self.menuitem_install_argyll_instrument_conf = tools.FindItemById( tools.FindItem("argyll.instrument.configuration_files.install")) self.menuitem_uninstall_argyll_instrument_conf = tools.FindItemById( tools.FindItem("argyll.instrument.configuration_files.uninstall")) if sys.platform in ("darwin", "win32") and not test: tools.RemoveItem(self.menuitem_install_argyll_instrument_conf) tools.RemoveItem(self.menuitem_uninstall_argyll_instrument_conf) else: # Linux may need instrument access being setup self.Bind(wx.EVT_MENU, self.install_argyll_instrument_conf, self.menuitem_install_argyll_instrument_conf) self.Bind(wx.EVT_MENU, self.uninstall_argyll_instrument_conf, self.menuitem_uninstall_argyll_instrument_conf) self.menuitem_install_argyll_instrument_drivers = tools.FindItemById( tools.FindItem("argyll.instrument.drivers.install")) self.menuitem_uninstall_argyll_instrument_drivers = tools.FindItemById( tools.FindItem("argyll.instrument.drivers.uninstall")) if sys.platform == "win32" or test: # Windows may need an Argyll CMS instrument driver self.Bind(wx.EVT_MENU, self.install_argyll_instrument_drivers, self.menuitem_install_argyll_instrument_drivers) else: # Other OS do not need an Argyll CMS instrument driver tools.RemoveItem(self.menuitem_install_argyll_instrument_drivers) if (sys.platform == "win32" and sys.getwindowsversion() >= (6, )) or test: # Windows Vista and newer can uninstall Argyll CMS instrument driver self.Bind(wx.EVT_MENU, self.uninstall_argyll_instrument_drivers, self.menuitem_uninstall_argyll_instrument_drivers) else: # Other OS cannot uninstall Argyll CMS instrument driver tools.RemoveItem(self.menuitem_uninstall_argyll_instrument_drivers) self.menuitem_enable_spyder2 = tools.FindItemById( tools.FindItem("enable_spyder2")) self.Bind(wx.EVT_MENU, self.enable_spyder2_handler, self.menuitem_enable_spyder2) self.menuitem_show_lut = tools.FindItemById( tools.FindItem("calibration.show_lut")) self.Bind(wx.EVT_MENU, self.init_lut_viewer, self.menuitem_show_lut) self.menuitem_show_log = tools.FindItemById(tools.FindItem("infoframe.toggle")) self.Bind(wx.EVT_MENU, self.infoframe_toggle_handler, self.menuitem_show_log) self.menuitem_log_autoshow = tools.FindItemById( tools.FindItem("log.autoshow")) self.Bind(wx.EVT_MENU, self.infoframe_autoshow_handler, self.menuitem_log_autoshow) languages = self.menubar.GetMenu(self.menubar.FindMenu("menu.language")) llist = [(lang.ldict[lcode].get("!language", ""), lcode) for lcode in lang.ldict] llist.sort() for lstr, lcode in llist: menuitem = languages.Append(-1, "&" + lstr, kind=wx.ITEM_RADIO) if (lcode.upper().replace("EN", "US") in flagart.catalog): if (sys.platform in ("darwin", "win32") or menuitem.GetKind() == wx.ITEM_NORMAL): # This can fail under Linux with wxPython 3.0 # because only normal menu items can have bitmaps # there. Working fine on all other platforms. menuitem.SetBitmap( flagart.catalog[lcode.upper().replace("EN", "US")].getBitmap()) if lang.getcode() == lcode: menuitem.Check() font = menuitem.Font font.SetWeight(wx.BOLD) menuitem.SetFont(font) # Map numerical event id to language string lang.ldict[lcode].menuitem_id = menuitem.GetId() self.Bind(wx.EVT_MENU, self.set_language_handler, menuitem) help = self.menubar.GetMenu(self.menubar.FindMenu("menu.help")) self.menuitem_about = help.Insert(0, -1 if wx.VERSION < (2, 9) else wx.ID_ABOUT, "&menu.about") self.Bind(wx.EVT_MENU, self.aboutdialog_handler, self.menuitem_about) self.menuitem_readme = help.FindItemById(help.FindItem("readme")) self.menuitem_readme.Enable(isinstance(get_data_path("README.html"), basestring)) self.Bind(wx.EVT_MENU, self.readme_handler, self.menuitem_readme) self.menuitem_license = help.FindItemById(help.FindItem("license")) self.menuitem_license.Enable(isinstance(get_data_path("LICENSE.txt"), basestring) or os.path.isfile("/usr/share/common-licenses/GPL-3")) self.Bind(wx.EVT_MENU, self.license_handler, self.menuitem_license) menuitem = help.FindItemById(help.FindItem("help_support")) self.Bind(wx.EVT_MENU, self.help_support_handler, menuitem) menuitem = help.FindItemById(help.FindItem("bug_report")) self.Bind(wx.EVT_MENU, self.bug_report_handler, menuitem) self.menuitem_app_auto_update_check = help.FindItemById( help.FindItem("update_check.onstartup")) self.Bind(wx.EVT_MENU, self.app_auto_update_check_handler, self.menuitem_app_auto_update_check) menuitem = help.FindItemById(help.FindItem("update_check")) self.Bind(wx.EVT_MENU, self.app_update_check_handler, menuitem) if sys.platform == "darwin": wx.GetApp().SetMacAboutMenuItemId(self.menuitem_about.GetId()) wx.GetApp().SetMacPreferencesMenuItemId(self.menuitem_prefs.GetId()) wx.GetApp().SetMacExitMenuItemId(self.menuitem_quit.GetId()) wx.GetApp().SetMacHelpMenuTitleName(lang.getstr("menu.help")) def update_menus(self): """ Enable/disable menu items based on available Argyll functionality. """ self.menuitem_testchart_edit.Enable(self.create_testchart_btn.Enabled) self.menuitem_measure_testchart.Enable(bool(self.worker.displays) and bool(self.worker.instruments)) self.menuitem_create_profile.Enable(bool(self.worker.displays)) edid = self.worker.get_display_edid() self.menuitem_create_profile_from_edid.Enable(bool(self.worker.displays and edid and edid.get("monitor_name", edid.get("ascii", edid["product_id"])) and edid["red_x"] and edid["red_y"] and edid["green_x"] and edid["green_y"] and edid["blue_x"] and edid["blue_y"])) self.menuitem_profile_hires_b2a.Enable(self.worker.argyll_version > [0, 0, 0]) self.menuitem_install_display_profile.Enable(bool(self.worker.displays) and not config.is_virtual_display()) calibration_loading_supported = self.worker.calibration_loading_supported self.menuitem_load_lut_from_cal_or_profile.Enable( bool(self.worker.displays) and calibration_loading_supported) self.menuitem_load_lut_from_display_profile.Enable( bool(self.worker.displays) and calibration_loading_supported) has_separate_lut_access = self.worker.has_separate_lut_access() self.menuitem_use_separate_lut_access.Check(has_separate_lut_access or bool(getcfg("use_separate_lut_access"))) self.menuitem_use_separate_lut_access.Enable(not has_separate_lut_access) has_lut_access = self.worker.has_lut_access() do_not_use_video_lut = (self.worker.argyll_version >= [1, 3, 3] and (not has_lut_access or not getcfg("calibration.use_video_lut"))) self.menuitem_do_not_use_video_lut.Check(do_not_use_video_lut) self.menuitem_do_not_use_video_lut.Enable(self.worker.argyll_version >= [1, 3, 3] and has_lut_access) self.menuitem_allow_skip_sensor_cal.Check(bool(getcfg("allow_skip_sensor_cal"))) self.menuitem_calibrate_instrument.Enable( bool(self.worker.get_instrument_features().get("sensor_cal"))) self.menuitem_enable_3dlut_tab.Check(bool(getcfg("3dlut.tab.enable"))) self.menuitem_enable_argyll_debug.Check(bool(getcfg("argyll.debug"))) self.menuitem_enable_dry_run.Check(bool(getcfg("dry_run"))) self.menuitem_startup_sound.Check(bool(getcfg("startup_sound.enable"))) self.menuitem_use_fancy_progress.Check(bool(getcfg("use_fancy_progress"))) spyd2en = get_argyll_util("spyd2en") spyder2_firmware_exists = self.worker.spyder2_firmware_exists() if sys.platform == "win32" or test: self.menuitem_install_argyll_instrument_drivers.Enable(bool(get_data_path("usb/ArgyllCMS.inf"))) if sys.platform not in ("darwin", "win32") or test: installed = self.worker.get_argyll_instrument_conf("installed") installable = self.worker.get_argyll_instrument_conf() # Only enable if not yet installed and installable self.menuitem_install_argyll_instrument_conf.Enable( bool(not installed and installable)) # Only enable if installed and (re-)installable self.menuitem_uninstall_argyll_instrument_conf.Enable( bool(installed and installable)) self.menuitem_enable_spyder2.Enable(bool(spyd2en)) self.menuitem_enable_spyder2.Check(bool(spyd2en) and spyder2_firmware_exists) self.menuitem_show_lut.Enable(bool(LUTFrame) and self.worker.argyll_version > [0, 0, 0]) self.menuitem_show_lut.Check(bool(getcfg("lut_viewer.show"))) if hasattr(self, "lut_viewer"): self.lut_viewer.update_controls() self.menuitem_lut_reset.Enable(bool(self.worker.displays) and calibration_loading_supported) self.menuitem_report_calibrated.Enable(bool(self.worker.displays) and bool(self.worker.instruments) and not config.is_non_argyll_display()) self.menuitem_report_uncalibrated.Enable(bool(self.worker.displays) and bool(self.worker.instruments) and not config.is_non_argyll_display()) self.menuitem_calibration_verify.Enable(bool(self.worker.displays) and bool(self.worker.instruments) and not config.is_non_argyll_display()) self.mr_settings_btn.Enable(bool(self.worker.displays) and bool(self.worker.instruments)) self.menuitem_measure_uniformity.Enable(bool(self.worker.displays) and bool(self.worker.instruments)) self.menuitem_measurement_file_check_auto.Check(bool(getcfg("ti3.check_sanity.auto"))) self.menuitem_create_colorimeter_correction.Enable(bool(get_argyll_util("ccxxmake"))) self.menuitem_show_log.Check(bool(getcfg("log.show"))) self.menuitem_log_autoshow.Enable(not bool(getcfg("log.show"))) self.menuitem_log_autoshow.Check(bool(getcfg("log.autoshow"))) self.menuitem_app_auto_update_check.Check(bool(getcfg("update_check"))) def init_controls(self): """ Initialize the main window controls and their event handlers. """ for child in (self.display_box_label, self.instrument_box_label, self.calibration_settings_label, self.profile_settings_label, self.lut3d_settings_label, self.mr_settings_label): font = child.Font font.SetWeight(wx.BOLD) child.Font = font # Settings file controls # ====================== # Settings file dropdown self.Bind(wx.EVT_CHOICE, self.calibration_file_ctrl_handler, id=self.calibration_file_ctrl.GetId()) self.Bind(wx.EVT_BUTTON, self.load_cal_handler, id=self.calibration_file_btn.GetId()) self.Bind(wx.EVT_BUTTON, self.create_session_archive_handler, id=self.create_session_archive_btn.GetId()) self.Bind(wx.EVT_BUTTON, self.delete_calibration_handler, id=self.delete_calibration_btn.GetId()) self.Bind(wx.EVT_BUTTON, self.install_profile_handler, id=self.install_profile_btn.GetId()) self.Bind(wx.EVT_BUTTON, self.profile_info_handler, id=self.profile_info_btn.GetId()) # Update calibration checkbox self.Bind(wx.EVT_CHECKBOX, self.calibration_update_ctrl_handler, id=self.calibration_update_cb.GetId()) # Display self.Bind(wx.EVT_CHOICE, self.display_ctrl_handler, id=self.display_ctrl.GetId()) self.Bind(wx.EVT_CHOICE, self.display_lut_ctrl_handler, id=self.display_lut_ctrl.GetId()) self.Bind(wx.EVT_BUTTON, self.display_lut_link_ctrl_handler, id=self.display_lut_link_ctrl.GetId()) # Instrument self.Bind(wx.EVT_CHOICE, self.comport_ctrl_handler, id=self.comport_ctrl.GetId()) self.Bind(wx.EVT_CHOICE, self.measurement_mode_ctrl_handler, id=self.measurement_mode_ctrl.GetId()) self.Bind(wx.EVT_BUTTON, self.check_update_controls, id=self.detect_displays_and_ports_btn.GetId()) # Display update delay & settle time min_val, max_val = config.valid_ranges["measure.min_display_update_delay_ms"] self.min_display_update_delay_ms.SetRange(min_val, max_val) min_val, max_val = config.valid_ranges["measure.display_settle_time_mult"] self.display_settle_time_mult.SetDigits(len(str(stripzeros(min_val)).split(".")[-1])) self.display_settle_time_mult.SetIncrement(min_val) self.display_settle_time_mult.SetRange(min_val, max_val) self.Bind(wx.EVT_CHECKBOX, self.display_delay_handler, id=self.override_min_display_update_delay_ms.GetId()) self.Bind(wx.EVT_TEXT, self.display_delay_handler, id=self.min_display_update_delay_ms.GetId()) self.Bind(wx.EVT_CHECKBOX, self.display_delay_handler, id=self.override_display_settle_time_mult.GetId()) self.Bind(floatspin.EVT_FLOATSPIN, self.display_delay_handler, id=self.display_settle_time_mult.GetId()) # Observer self.observer_ctrl.Bind(wx.EVT_CHOICE, self.observer_ctrl_handler) # Colorimeter correction matrix self.Bind(wx.EVT_CHOICE, self.colorimeter_correction_matrix_ctrl_handler, id=self.colorimeter_correction_matrix_ctrl.GetId()) self.Bind(wx.EVT_BUTTON, self.colorimeter_correction_matrix_ctrl_handler, id=self.colorimeter_correction_matrix_btn.GetId()) self.Bind(wx.EVT_BUTTON, self.colorimeter_correction_web_handler, id=self.colorimeter_correction_web_btn.GetId()) self.colorimeter_correction_create_btn.Bind(wx.EVT_BUTTON, self.create_colorimeter_correction_handler) # Calibration settings # ==================== # Whitepoint self.Bind(wx.EVT_CHOICE, self.whitepoint_ctrl_handler, id=self.whitepoint_ctrl.GetId()) self.Bind(wx.EVT_COMBOBOX, self.whitepoint_ctrl_handler, id=self.whitepoint_colortemp_textctrl.GetId()) self.whitepoint_colortemp_textctrl.SetItems(self.whitepoint_presets) self.whitepoint_colortemp_textctrl.Bind( wx.EVT_KILL_FOCUS, self.whitepoint_ctrl_handler) self.Bind(wx.EVT_CHOICE, self.whitepoint_colortemp_locus_ctrl_handler, id=self.whitepoint_colortemp_locus_ctrl.GetId()) self.whitepoint_x_textctrl.Bind(floatspin.EVT_FLOATSPIN, self.whitepoint_ctrl_handler) self.whitepoint_y_textctrl.Bind(floatspin.EVT_FLOATSPIN, self.whitepoint_ctrl_handler) self.Bind(wx.EVT_BUTTON, self.ambient_measure_handler, id=self.whitepoint_measure_btn.GetId()) # White luminance self.Bind(wx.EVT_CHOICE, self.luminance_ctrl_handler, id=self.luminance_ctrl.GetId()) self.luminance_textctrl.Bind(floatspin.EVT_FLOATSPIN, self.luminance_ctrl_handler) self.Bind(wx.EVT_CHECKBOX, self.whitelevel_drift_compensation_handler, id=self.whitelevel_drift_compensation.GetId()) # Black luminance self.Bind(wx.EVT_CHOICE, self.black_luminance_ctrl_handler, id=self.black_luminance_ctrl.GetId()) self.black_luminance_textctrl.Bind(floatspin.EVT_FLOATSPIN, self.black_luminance_ctrl_handler) self.Bind(wx.EVT_CHECKBOX, self.blacklevel_drift_compensation_handler, id=self.blacklevel_drift_compensation.GetId()) # Tonal response curve (TRC) self.Bind(wx.EVT_CHOICE, self.trc_ctrl_handler, id=self.trc_ctrl.GetId()) self.trc_textctrl.SetItems(self.trc_presets) self.trc_textctrl.SetValue(str(defaults["gamma"])) self.Bind(wx.EVT_COMBOBOX, self.trc_ctrl_handler, id=self.trc_textctrl.GetId()) self.trc_textctrl.Bind(wx.EVT_KILL_FOCUS, self.trc_ctrl_handler) self.Bind(wx.EVT_CHOICE, self.trc_type_ctrl_handler, id=self.trc_type_ctrl.GetId()) # Viewing condition adjustment for ambient in Lux self.Bind(wx.EVT_CHECKBOX, self.ambient_viewcond_adjust_ctrl_handler, id=self.ambient_viewcond_adjust_cb.GetId()) self.ambient_viewcond_adjust_textctrl.Bind( floatspin.EVT_FLOATSPIN, self.ambient_viewcond_adjust_ctrl_handler) self.Bind(wx.EVT_BUTTON, self.ambient_measure_handler, id=self.ambient_measure_btn.GetId()) # Black level output offset self.Bind(wx.EVT_SLIDER, self.black_output_offset_ctrl_handler, id=self.black_output_offset_ctrl.GetId()) self.Bind(wx.EVT_TEXT, self.black_output_offset_ctrl_handler, id=self.black_output_offset_intctrl.GetId()) # Black point hue correction self.Bind(wx.EVT_CHECKBOX, self.black_point_correction_auto_handler, id=self.black_point_correction_auto_cb.GetId()) self.Bind(wx.EVT_SLIDER, self.black_point_correction_ctrl_handler, id=self.black_point_correction_ctrl.GetId()) self.Bind(wx.EVT_TEXT, self.black_point_correction_ctrl_handler, id=self.black_point_correction_intctrl.GetId()) # Black point correction rate self.Bind(wx.EVT_SLIDER, self.black_point_rate_ctrl_handler, id=self.black_point_rate_ctrl.GetId()) self.Bind(floatspin.EVT_FLOATSPIN, self.black_point_rate_ctrl_handler, id=self.black_point_rate_floatctrl.GetId()) # Calibration quality self.Bind(wx.EVT_SLIDER, self.calibration_quality_ctrl_handler, id=self.calibration_quality_ctrl.GetId()) # Interactive display adjustment self.Bind(wx.EVT_CHECKBOX, self.interactive_display_adjustment_ctrl_handler, id=self.interactive_display_adjustment_cb.GetId()) # Profiling settings # ================== # Testchart file self.Bind(wx.EVT_CHOICE, self.testchart_ctrl_handler, id=self.testchart_ctrl.GetId()) self.Bind(wx.EVT_BUTTON, self.testchart_btn_handler, id=self.testchart_btn.GetId()) self.Bind(wx.EVT_BUTTON, self.create_testchart_btn_handler, id=self.create_testchart_btn.GetId()) self.testchart_patches_amount_ctrl.SetRange(config.valid_values["testchart.auto_optimize"][1], config.valid_values["testchart.auto_optimize"][-1]) self.testchart_patches_amount_ctrl.Bind(wx.EVT_SLIDER, self.testchart_patches_amount_ctrl_handler) # Profile quality self.Bind(wx.EVT_SLIDER, self.profile_quality_ctrl_handler, id=self.profile_quality_ctrl.GetId()) # Profile type self.Bind(wx.EVT_CHOICE, self.profile_type_ctrl_handler, id=self.profile_type_ctrl.GetId()) # Advanced (gamut mapping) self.Bind(wx.EVT_BUTTON, self.gamap_btn_handler, id=self.gamap_btn.GetId()) # Black point compensation self.Bind(wx.EVT_CHECKBOX, self.black_point_compensation_ctrl_handler, id=self.black_point_compensation_cb.GetId()) # Profile name self.Bind(wx.EVT_TEXT, self.profile_name_ctrl_handler, id=self.profile_name_textctrl.GetId()) self.profile_name_info_btn.Bind(wx.EVT_BUTTON, self.profile_name_info_btn_handler) self.profile_name_info_btn.SetToolTipString(lang.getstr("profile.name")) self.Bind(wx.EVT_BUTTON, self.profile_save_path_btn_handler, id=self.profile_save_path_btn.GetId()) # 3D LUT controls # =============== self.lut3d_create_cb.Bind(wx.EVT_CHECKBOX, self.lut3d_create_cb_handler) self.lut3d_init_input_profiles() self.lut3d_input_profile_ctrl.Bind(wx.EVT_CHOICE, self.lut3d_input_colorspace_handler) self.lut3d_bind_event_handlers() # Main buttons # ============ for btn_name in ("calibrate_btn", "calibrate_and_profile_btn", "profile_btn", "lut3d_create_btn", "measurement_report_btn"): btn = getattr(self, btn_name) # wx.Button does not look correct when a custom background color is # set because the button label background inherits the button # background. Replace with ThemedGenButton which does not have # that issue subst = BorderGradientButton(btn.Parent, bitmap=geticon(16, "start"), label=btn.Label, name=btn.Name) subst.SetBackgroundColour(btn.Parent.BackgroundColour) subst.SetTopStartColour(wx.Colour(252, 252, 252)) subst.SetTopEndColour(wx.Colour(224, 224, 224)) subst.SetBottomStartColour(wx.Colour(224, 224, 224)) subst.SetBottomEndColour(wx.Colour(166, 166, 166)) subst.SetForegroundColour(wx.Colour(0, 0, 0)) subst.SetPressedTopColour(wx.Colour(166, 166, 166)) subst.SetPressedBottomColour(wx.Colour(224, 224, 224)) setattr(self, btn_name, subst) btn.ContainingSizer.Replace(btn, subst) btn.Destroy() self.Bind(wx.EVT_BUTTON, self.calibrate_btn_handler, id=self.calibrate_btn.GetId()) self.Bind(wx.EVT_BUTTON, self.calibrate_and_profile_btn_handler, id=self.calibrate_and_profile_btn.GetId()) self.Bind(wx.EVT_BUTTON, self.profile_btn_handler, id=self.profile_btn.GetId()) self.lut3d_create_btn.Bind(wx.EVT_BUTTON, self.lut3d_create_handler) self.measurement_report_btn.Bind(wx.EVT_BUTTON, self.measurement_report_handler) def set_language_handler(self, event): """ Set a new language globally and on-the-fly. """ for lcode in lang.ldict: if lang.ldict[lcode].menuitem_id == event.GetId(): # Get the previously marked menu item menuitem = self.menubar.FindItemById( lang.ldict[lang.getcode()].menuitem_id) if hasattr(self, "tcframe"): if not self.tcframe.tc_close_handler(): # Do not change language, mark previous menu item menuitem.Check() return self.tcframe.Destroy() del self.tcframe # Set the previously marked menu item's font weight to normal font = menuitem.Font font.SetWeight(wx.NORMAL) menuitem.SetFont(font) # Set the currently marked menu item's font weight to bold menuitem = self.menubar.FindItemById(lang.ldict[lcode].menuitem_id) font = menuitem.Font font.SetWeight(wx.BOLD) menuitem.SetFont(font) setcfg("lang", lcode) writecfg() self.panel.Freeze() self.header.SetLabel(lang.getstr("header")) self.setup_language() if hasattr(self, "extra_args"): self.extra_args.Sizer.SetSizeHints(self.extra_args) self.extra_args.Sizer.Layout() if hasattr(self, "gamapframe"): self.gamapframe.panel.Freeze() self.gamapframe.setup_language() self.gamapframe.update_layout() self.gamapframe.panel.Thaw() if getattr(self, "lut3dframe", None): self.lut3dframe.panel.Freeze() self.lut3dframe.setup_language() self.lut3dframe.update_controls() self.lut3dframe.update_layout() self.lut3dframe.panel.Thaw() if getattr(self, "reportframe", None): self.reportframe.panel.Freeze() self.reportframe.setup_language() self.reportframe.update_controls() self.reportframe.update_layout() self.reportframe.panel.Thaw() if getattr(self, "synthiccframe", None): self.synthiccframe.panel.Freeze() self.synthiccframe.setup_language() self.synthiccframe.update_controls() self.synthiccframe.update_layout() self.synthiccframe.panel.Thaw() self.update_measurement_modes() self.update_controls() self.update_displays() self.set_testcharts() self.update_layout() self.panel.Thaw() if hasattr(self, "aboutdialog"): self.aboutdialog.Destroy() del self.aboutdialog log_txt = self.infoframe.log_txt.GetValue().encode("UTF-8", "replace") if log_txt: # Remember current log window contents if not self.infoframe.IsShownOnScreen(): # Append buffer of non-shown log window logbuffer.seek(0) log_txt += logbuffer.read() logbuffer.truncate(0) logbuffer.write(log_txt) self.infoframe.Destroy() self.init_infoframe(show=getcfg("log.show")) if sys.platform in ("darwin", "win32") or isexe: self.measureframe.Destroy() self.init_measureframe() if hasattr(self, "lut_viewer"): self.lut_viewer.Destroy() del self.lut_viewer if getcfg("lut_viewer.show"): # Using wx.CallAfter fixes wrong positioning under wxGTK # with wxPython 3 wx.CallAfter(self.init_lut_viewer, show=True) if hasattr(self, "profile_name_tooltip_window"): self.profile_name_tooltip_window.Destroy() del self.profile_name_tooltip_window wx.CallAfter(self.Raise) break def update_layout(self): """ Update main window layout. """ self.set_size(False, True) def restore_defaults_handler(self, event=None, include=(), exclude=(), override=None): if event: dlg = ConfirmDialog(self, msg=lang.getstr("app.confirm_restore_defaults"), ok=lang.getstr("ok"), cancel=lang.getstr("cancel"), bitmap=getbitmap( "theme/icons/32x32/dialog-warning")) result = dlg.ShowModal() dlg.Destroy() if result != wx.ID_OK: return if getcfg("settings.changed"): self.settings_discard_changes() skip = [ "allow_skip_sensor_cal", "app.allow_network_clients", "app.port", "argyll.dir", "argyll.version", "calibration.autoload", "calibration.black_point_rate.enabled", "calibration.file.previous", "calibration.update", "colorimeter_correction.instrument", "colorimeter_correction.instrument.reference", "colorimeter_correction.measurement_mode", "colorimeter_correction.measurement_mode.reference", "colorimeter_correction.measurement_mode.reference.projector", "colorimeter_correction_matrix_file", "comport.number", "copyright", "display.number", "display.technology", "display_lut.link", "display_lut.number", "displays", "dry_run", "enumerate_ports.auto", "gamma", "iccgamut.surface_detail", "instruments", "lang", "last_3dlut_path", "last_cal_path", "last_cal_or_icc_path", "last_colorimeter_ti3_path", "last_filedialog_path", "last_icc_path", "last_reference_ti3_path", "last_testchart_export_path", "last_ti1_path", "last_ti3_path", "last_vrml_path", "log.show", "lut_viewer.show", "lut_viewer.show_actual_lut", "measurement_mode", "measurement_mode.projector", "measurement.name.expanded", "measurement.play_sound", "measurement.save_path", "patterngenerator.apl", "patterngenerator.resolve", "patterngenerator.resolve.port", "patterngenerator.resolve.use_video_levels", "profile.b2a.hires.diagpng", "profile.create_gamut_views", "profile.install_scope", "profile.license", "profile.load_on_login", "profile.name", "profile.name.expanded", "profile.save_path", "profile_loader.error.show_msg", "profile_loader.fix_profile_associations", "profile_loader.known_apps", "profile_loader.known_window_classes", "profile_loader.reset_gamma_ramps", "profile_loader.verify_calibration", "profile.update", "position.x", "position.y", "position.info.x", "position.info.y", "position.lut_viewer.x", "position.lut_viewer.y", "position.lut3dframe.x", "position.lut3dframe.y", "position.synthiccframe.x", "position.synthiccframe.y", "position.profile_info.x", "position.profile_info.y", "position.progress.x", "position.progress.y", "position.reportframe.x", "position.reportframe.y", "position.scripting.x", "position.scripting.y", "position.tcgen.x", "position.tcgen.y", "recent_cals", "report.pack_js", "settings.changed", "show_advanced_options", "show_donation_message", "skip_legacy_serial_ports", "skip_scripts", "sudo.preserve_environment", "tc_precond_profile", "tc_vrml_cie", "tc_vrml_cie_colorspace", "tc_vrml_device", "tc_vrml_device_colorspace", "tc.show", "testchart.auto_optimize.fix_zero_blackpoint", "uniformity.measure.continuous", "untethered.measure.auto", "untethered.measure.manual.delay", "untethered.max_delta.chroma", "untethered.min_delta", "untethered.min_delta.lightness", "update_check", "webserver.portnumber", "x3dom.cache", "x3dom.embed" ] override_default = { "app.dpi": None, "calibration.black_luminance": None, "calibration.luminance": None, "gamap_src_viewcond": "mt", "gamap_out_viewcond": "mt", "testchart.file": "auto", "trc": defaults["gamma"], "whitepoint.colortemp": None, "whitepoint.x": None, "whitepoint.y": None } if override: override_default.update(override) override = override_default for name in defaults: if name not in skip and name not in override: if (len(include) == 0 or False in [name.find(item) != 0 for item in include]) and \ (len(exclude) == 0 or not (False in [name.find(item) != 0 for item in exclude])): if name.endswith(".backup"): if name == "measurement_mode.backup": setcfg("measurement_mode", getcfg("measurement_mode.backup")) default = None else: default = defaults[name] if verbose >= 3: safe_print("Restoring %s to %s" % (name, default)) setcfg(name, default) for name in override: if (len(include) == 0 or False in [name.find(item) != 0 for item in include]) and \ (len(exclude) == 0 or not (False in [name.find(item) != 0 for item in exclude])): setcfg(name, override[name]) if event: writecfg() self.update_displays() self.update_controls() self.update_menus() if hasattr(self, "tcframe"): self.tcframe.tc_update_controls() def cal_changed(self, setchanged=True): """ Called internally when calibration settings controls are changed. Exceptions are the calibration quality and interactive display adjustment controls, which do not cause a 'calibration changed' event. """ if not self.updatingctrls and self.IsShownOnScreen(): # update_controls which is called from cal_changed might cause a # another cal_changed call, in which case we can skip it if debug: safe_print("[D] cal_changed") if setchanged: setcfg("settings.changed", 1) self.worker.options_dispcal = [] if getcfg("calibration.file", False): setcfg("calibration.file", None) # Load LUT curves from current display profile (if any, and if # it contains curves) self.load_display_profile_cal(None) self.calibration_file_ctrl.SetStringSelection( lang.getstr("settings.new")) self.calibration_file_ctrl.SetToolTip(None) self.create_session_archive_btn.Disable() self.delete_calibration_btn.Disable() self.install_profile_btn.Disable() do_update_controls = self.calibration_update_cb.GetValue() self.calibration_update_cb.SetValue(False) setcfg("calibration.update", 0) self.calibration_update_cb.Disable() setcfg("profile.update", 0) if do_update_controls: self.update_controls() self.settings_discard_changes(keep_changed_state=True) def update_displays(self, update_ccmx_items=False, set_height=False): """ Update the display selector controls. """ if debug: safe_print("[D] update_displays") self.panel.Freeze() self.displays = [] for item in self.worker.displays: self.displays.append(item.replace("[PRIMARY]", lang.getstr("display.primary"))) self.displays[-1] = lang.getstr(self.displays[-1]) self.display_ctrl.SetItems(self.displays) self.display_ctrl.Enable(len(self.worker.displays) > 1) display_lut_sizer = self.display_ctrl.GetContainingSizer() display_sizer = self.display_lut_link_ctrl.GetContainingSizer() comport_sizer = self.comport_ctrl.GetContainingSizer() use_lut_ctrl = self.worker.has_separate_lut_access() or \ bool(getcfg("use_separate_lut_access")) menubar = self.GetMenuBar() options = menubar.GetMenu(menubar.FindMenu(lang.getstr("menu.options"))) menuitem = options.FindItemById( options.FindItem(lang.getstr("use_separate_lut_access"))) menuitem.Check(use_lut_ctrl) if use_lut_ctrl: self.display_lut_ctrl.Clear() for i, disp in enumerate(self.displays): if self.worker.lut_access[i]: self.display_lut_ctrl.Append(disp) comport_sizer.SetCols(1) comport_sizer.SetRows(2) else: comport_sizer.SetCols(2) comport_sizer.SetRows(1) setcfg("display_lut.link", 1) display_lut_sizer.Show(self.display_label, use_lut_ctrl) display_lut_sizer.Show(self.display_lut_label, use_lut_ctrl) display_lut_sizer.Show(self.display_lut_ctrl, use_lut_ctrl) display_sizer.Show(self.display_lut_link_ctrl, use_lut_ctrl) self.get_set_display(update_ccmx_items) self.calpanel.Layout() self.panel.Thaw() if self.IsShown(): self.set_size(set_height) self.update_scrollbars() def update_scrollbars(self): self.Freeze() self.calpanel.SetVirtualSize(self.calpanel.GetBestVirtualSize()) self.Thaw() def update_comports(self, force=False): """ Update the comport selector control. """ self.comport_ctrl.Freeze() self.comport_ctrl.SetItems(self.worker.instruments) if self.worker.instruments: self.comport_ctrl.SetSelection( min(max(0, len(self.worker.instruments) - 1), max(0, int(getcfg("comport.number")) - 1))) self.comport_ctrl.Enable(len(self.worker.instruments) > 1) self.comport_ctrl.Thaw() self.comport_ctrl_handler(force=force) def update_measurement_mode(self): """ Update the measurement mode control. """ measurement_mode = getcfg("measurement_mode") instrument_features = self.worker.get_instrument_features() if instrument_features.get("adaptive_mode") and ( self.worker.argyll_version[0:3] > [1, 1, 0] or ( self.worker.argyll_version[0:3] == [1, 1, 0] and not "Beta" in self.worker.argyll_version_string and not "RC1" in self.worker.argyll_version_string and not "RC2" in self.worker.argyll_version_string)) and \ getcfg("measurement_mode.adaptive"): measurement_mode += "V" if instrument_features.get("highres_mode") and \ getcfg("measurement_mode.highres"): measurement_mode += "H" self.measurement_mode_ctrl.SetSelection( min(self.measurement_modes_ba[self.get_instrument_type()].get( measurement_mode, 1), len(self.measurement_mode_ctrl.GetItems()) - 1)) def get_measurement_modes(self, instrument_name, instrument_type, cfgname="measurement_mode"): measurement_mode = getcfg(cfgname) #if self.get_instrument_type() == "spect": #measurement_mode = strtr(measurement_mode, {"c": "", "l": ""}) if instrument_name != "DTP92": measurement_modes = dict({instrument_type: [lang.getstr("measurement_mode.refresh"), lang.getstr("measurement_mode.lcd")]}) measurement_modes_ab = dict({instrument_type: ["c", "l"]}) else: measurement_modes = dict({instrument_type: [lang.getstr("measurement_mode.refresh")]}) measurement_modes_ab = dict({instrument_type: ["c"]}) if (instrument_name in ("Spyder4", "Spyder5") and self.worker.spyder4_cal_exists()): # Spyder4 Argyll CMS >= 1.3.6 # Spyder5 Argyll CMS >= 1.7.0 # See http://www.argyllcms.com/doc/instruments.html#spyd4 # for description of supported modes measurement_modes[instrument_type].extend([lang.getstr("measurement_mode.lcd.ccfl"), lang.getstr("measurement_mode.lcd.wide_gamut.ccfl"), lang.getstr("measurement_mode.lcd.white_led"), lang.getstr("measurement_mode.lcd.wide_gamut.rgb_led"), lang.getstr("measurement_mode.lcd.ccfl.2")]) if self.worker.argyll_version >= [1, 5, 0]: measurement_modes_ab[instrument_type].extend(["f", "L", "e", "B", "x"]) else: measurement_modes_ab[instrument_type].extend(["3", "4", "5", "6", "7"]) elif instrument_name in ("ColorHug", "ColorHug2"): # Argyll CMS 1.3.6, spectro/colorhug.c, colorhug_disptypesel # Note: projector mode (-yp) is not the same as ColorMunki # projector mode! (-p) # ColorHug2 needs Argyll CMS 1.7 measurement_modes[instrument_type].extend([lang.getstr("projector"), lang.getstr("measurement_mode.lcd.white_led"), lang.getstr("measurement_mode.factory"), lang.getstr("measurement_mode.raw"), lang.getstr("auto")]) measurement_modes_ab[instrument_type].extend(["p", "e", "F", "R", "auto"]) elif (instrument_name == "DTP94" and self.worker.argyll_version >= [1, 5, 0]): # Argyll CMS 1.5.x introduces new measurement mode measurement_modes[instrument_type].extend([lang.getstr("measurement_mode.generic")]) measurement_modes_ab[instrument_type].append("g") elif instrument_name == "ColorMunki Smile": # Only supported in Argyll CMS 1.5.x and newer measurement_modes[instrument_type] = [lang.getstr("measurement_mode.lcd.ccfl"), lang.getstr("measurement_mode.lcd.white_led")] measurement_modes_ab[instrument_type] = ["f", "e"] elif (instrument_name == "Colorimtre HCFR" and self.worker.argyll_version >= [1, 5, 0]): # Argyll CMS 1.5.x introduces new measurement mode measurement_modes[instrument_type].extend([lang.getstr("measurement_mode.raw")]) measurement_modes_ab[instrument_type].append("R") elif instrument_name == "K-10": measurement_modes[instrument_type] = [] measurement_modes_ab[instrument_type] = [] for mode, desc in self.worker.get_instrument_measurement_modes().iteritems(): measurement_modes[instrument_type].append(lang.getstr(desc)) measurement_modes_ab[instrument_type].append(mode) if not measurement_mode in measurement_modes_ab[instrument_type]: measurement_mode = "F" instrument_features = self.worker.get_instrument_features(instrument_name) if instrument_features.get("projector_mode") and \ self.worker.argyll_version >= [1, 1, 0]: # Projector mode introduced in Argyll 1.1.0 Beta measurement_modes[instrument_type].append(lang.getstr("projector")) measurement_modes_ab[instrument_type].append("p") if not measurement_mode in measurement_modes_ab[instrument_type]: if measurement_modes_ab[instrument_type]: measurement_mode = measurement_modes_ab[instrument_type][0] else: measurement_mode = defaults["measurement_mode"] if instrument_features.get("adaptive_mode") and ( self.worker.argyll_version[0:3] > [1, 1, 0] or ( self.worker.argyll_version[0:3] == [1, 1, 0] and not "Beta" in self.worker.argyll_version_string and not "RC1" in self.worker.argyll_version_string and not "RC2" in self.worker.argyll_version_string)): # Adaptive mode introduced in Argyll 1.1.0 RC3 for key in iter(measurement_modes): instrument_modes = list(measurement_modes[key]) for i, mode in reversed(zip(xrange(0, len(instrument_modes)), instrument_modes)): if mode == lang.getstr("default"): mode = lang.getstr("measurement_mode.adaptive") else: mode = "%s %s" % (mode, lang.getstr("measurement_mode.adaptive")) measurement_modes[key].insert(i + 1, mode) modesig = measurement_modes_ab[key][i] measurement_modes_ab[key].insert(i + 1, (modesig or "") + "V") if getcfg(cfgname + ".adaptive"): measurement_mode += "V" if instrument_features.get("highres_mode"): for key in iter(measurement_modes): instrument_modes = list(measurement_modes[key]) for i, mode in reversed(zip(xrange(0, len(instrument_modes)), instrument_modes)): if mode == lang.getstr("default"): mode = lang.getstr("measurement_mode.highres") else: mode = "%s %s" % (mode, lang.getstr("measurement_mode.highres")) measurement_modes[key].insert(i + 1, mode) modesig = measurement_modes_ab[key][i] measurement_modes_ab[key].insert(i + 1, (modesig or "") + "H") if getcfg(cfgname + ".highres"): measurement_mode += "H" measurement_modes_ab = dict(zip(measurement_modes_ab.keys(), [dict(zip(range(len(measurement_modes_ab[key])), measurement_modes_ab[key])) for key in measurement_modes_ab])) measurement_modes_ba = dict(zip(measurement_modes_ab.keys(), [swap_dict_keys_values(measurement_modes_ab[key]) for key in measurement_modes_ab])) return (measurement_mode, measurement_modes, measurement_modes_ab, measurement_modes_ba) def update_measurement_modes(self): """ Populate the measurement mode control. """ instrument_name = self.worker.get_instrument_name() instrument_type = self.get_instrument_type() (measurement_mode, measurement_modes, measurement_modes_ab, measurement_modes_ba) = self.get_measurement_modes(instrument_name, instrument_type) self.measurement_modes_ab = measurement_modes_ab self.measurement_modes_ba = measurement_modes_ba self.measurement_mode_ctrl.Freeze() self.measurement_mode_ctrl.SetItems(measurement_modes[instrument_type]) self.measurement_mode_ctrl.SetSelection( min(self.measurement_modes_ba[instrument_type].get(measurement_mode, 1), len(measurement_modes[instrument_type]) - 1)) measurement_mode = self.get_measurement_mode() or "l" if measurement_mode != "auto": measurement_mode = measurement_mode[0] setcfg("measurement_mode", measurement_mode) self.measurement_mode_ctrl.Enable( bool(self.worker.instruments) and len(measurement_modes[instrument_type]) > 1) self.measurement_mode_ctrl.Thaw() def update_colorimeter_correction_matrix_ctrl(self): """ Show or hide the colorimeter correction matrix controls """ self.panel.Freeze() self.update_adjustment_controls() instrument_features = self.worker.get_instrument_features() show_control = (self.worker.instrument_can_use_ccxx(False) and not is_ccxx_testchart() and getcfg("measurement_mode") != "auto") self.colorimeter_correction_matrix_ctrl.GetContainingSizer().Show( self.colorimeter_correction_matrix_ctrl, show_control) self.colorimeter_correction_matrix_label.GetContainingSizer().Show( self.colorimeter_correction_matrix_label, show_control) self.colorimeter_correction_matrix_btn.GetContainingSizer().Show( self.colorimeter_correction_matrix_btn, show_control) self.colorimeter_correction_web_btn.GetContainingSizer().Show( self.colorimeter_correction_web_btn, show_control) self.colorimeter_correction_create_btn.ContainingSizer.Show( self.colorimeter_correction_create_btn, show_control) self.calpanel.Layout() self.panel.Thaw() if self.IsShown(): wx.CallAfter(self.set_size, True) wx.CallLater(1, self.update_scrollbars) def delete_colorimeter_correction_matrix_ctrl_item(self, path): if path in self.ccmx_cached_paths: self.ccmx_cached_paths.remove(path) if path in self.ccmx_cached_descriptors: del self.ccmx_cached_descriptors[path] if path in self.ccmx_instruments: del self.ccmx_instruments[path] delete = False for key, value in self.ccmx_mapping.iteritems(): if value == path: delete = True break if delete: del self.ccmx_mapping[key] def update_colorimeter_correction_matrix_ctrl_items(self, force=False, warn_on_mismatch=False, update_measurement_mode=True): """ Show the currently selected correction matrix and list all files in ccmx directories below force If True, reads the ccmx directory again, otherwise uses a previously cached result if available """ items = [lang.getstr("colorimeter_correction.file.none"), lang.getstr("auto")] self.ccmx_item_paths = [] index = 0 ccxx_path = None ccmx = getcfg("colorimeter_correction_matrix_file").split(":", 1) if len(ccmx) > 1 and not os.path.isfile(ccmx[1]): ccmx = ccmx[:1] if force or not getattr(self, "ccmx_cached_paths", None): ccmx_paths = get_argyll_data_files("lu", "*.ccmx") ccss_paths = get_argyll_data_files("lu", "*.ccss") ccmx_paths.sort(key=os.path.basename) ccss_paths.sort(key=os.path.basename) self.ccmx_cached_paths = ccmx_paths + ccss_paths self.ccmx_cached_descriptors = {} self.ccmx_instruments = {} self.ccmx_mapping = {} types = {"ccss": lang.getstr("spectral").replace(":", ""), "ccmx": lang.getstr("matrix").replace(":", "")} add_basename_to_desc_on_mismatch = False for i, path in enumerate(self.ccmx_cached_paths): if self.ccmx_cached_descriptors.get(path): desc = self.ccmx_cached_descriptors[path] elif os.path.isfile(path): try: cgats = CGATS.CGATS(path) except (IOError, CGATS.CGATSError), exception: safe_print("%s:" % path, exception) continue desc = safe_unicode(cgats.get_descriptor(), "UTF-8") # If the description is not the same as the 'sane' # filename, add the filename after the description # (max 31 chars) # See also colorimeter_correction_check_overwite, the # way the filename is processed must be the same if (add_basename_to_desc_on_mismatch and re.sub(r"[\\/:*?\"<>|]+", "_", make_argyll_compatible_path(desc)) != os.path.splitext(os.path.basename(path))[0]): desc = "%s <%s>" % (ellipsis(desc, 66, "m"), ellipsis(os.path.basename(path), 31, "m")) else: desc = ellipsis(desc, 100, "m") self.ccmx_cached_descriptors[path] = desc self.ccmx_instruments[path] = get_canonical_instrument_name( str(cgats.queryv1("INSTRUMENT") or ""), {"DTP94-LCD mode": "DTP94", "eye-one display": "i1 Display", "Spyder 2 LCD": "Spyder2", "Spyder 3": "Spyder3"}) key = "%s\0%s" % (self.ccmx_instruments[path], str(cgats.queryv1("DISPLAY") or "")) if (not self.ccmx_mapping.get(key) or (len(ccmx) > 1 and path == ccmx[1])): # Prefer the selected CCMX self.ccmx_mapping[key] = path else: continue if (self.worker.get_instrument_name().lower().replace(" ", "") in self.ccmx_instruments.get(path, "").lower().replace(" ", "") or (path.lower().endswith(".ccss") and self.worker.instrument_supports_ccss())): # Only add the correction to the list if it matches the # currently selected instrument or if it is a CCSS if len(ccmx) > 1 and ccmx[0] != "AUTO" and ccmx[1] == path: ccxx_path = path items.append("%s: %s" % (types.get(os.path.splitext(path)[1].lower()[1:]), desc)) self.ccmx_item_paths.append(path) items_paths = [] for i, item in enumerate(items[2:]): items_paths.append({"item": item, "path": self.ccmx_item_paths[i]}) items_paths.sort(key=lambda item_path: item_path["item"].lower()) for i, item_path in enumerate(items_paths): items[i + 2] = item_path["item"] self.ccmx_item_paths[i] = item_path["path"] if ccxx_path: index = self.ccmx_item_paths.index(ccxx_path) + 2 if (len(ccmx) > 1 and ccmx[1] and ccmx[1] not in self.ccmx_cached_paths and (not ccmx[1].lower().endswith(".ccss") or self.worker.instrument_supports_ccss())): self.ccmx_cached_paths.insert(0, ccmx[1]) desc = self.ccmx_cached_descriptors.get(ccmx[1]) if not desc and os.path.isfile(ccmx[1]): try: cgats = CGATS.CGATS(ccmx[1]) except (IOError, CGATS.CGATSError), exception: safe_print("%s:" % ccmx[1], exception) else: desc = safe_unicode(cgats.get_descriptor(), "UTF-8") # If the description is not the same as the 'sane' # filename, add the filename after the description # (max 31 chars) # See also colorimeter_correction_check_overwite, the # way the filename is processed must be the same if (add_basename_to_desc_on_mismatch and re.sub(r"[\\/:*?\"<>|]+", "_", make_argyll_compatible_path(desc)) != os.path.splitext(os.path.basename(ccmx[1]))[0]): desc = "%s <%s>" % (ellipsis(desc, 66, "m"), ellipsis(os.path.basename(ccmx[1]), 31, "m")) else: desc = ellipsis(desc, 100, "m") self.ccmx_cached_descriptors[ccmx[1]] = desc self.ccmx_instruments[ccmx[1]] = get_canonical_instrument_name( str(cgats.queryv1("INSTRUMENT") or ""), {"DTP94-LCD mode": "DTP94", "eye-one display": "i1 Display", "Spyder 2 LCD": "Spyder2", "Spyder 3": "Spyder3"}) key = "%s\0%s" % (self.ccmx_instruments[ccmx[1]], str(cgats.queryv1("DISPLAY") or "")) self.ccmx_mapping[key] = ccmx[1] if (desc and (self.worker.get_instrument_name().lower().replace(" ", "") in self.ccmx_instruments.get(ccmx[1], "").lower().replace(" ", "") or ccmx[1].lower().endswith(".ccss"))): # Only add the correction to the list if it matches the # currently selected instrument or if it is a CCSS items.insert(2, "%s: %s" % (types.get(os.path.splitext(ccmx[1])[1].lower()[1:]), desc)) self.ccmx_item_paths.insert(0, ccmx[1]) if ccmx[0] != "AUTO": index = 2 if ccmx[0] == "AUTO": if len(ccmx) < 2: ccmx.append("") display_name = self.worker.get_display_name(False, True, False) if self.worker.instrument_supports_ccss(): # Prefer CCSS ccmx[1] = self.ccmx_mapping.get("\0%s" % display_name, "") if not self.worker.instrument_supports_ccss() or not ccmx[1]: ccmx[1] = self.ccmx_mapping.get("%s\0%s" % (self.worker.get_instrument_name(), display_name), "") if (self.worker.instrument_can_use_ccxx() and len(ccmx) > 1 and ccmx[1] and ccmx[1] not in self.ccmx_item_paths): # CCMX does not match the currently selected instrument, # don't use ccmx = [""] if warn_on_mismatch: show_result_dialog(Warn(lang.getstr("colorimeter_correction.instrument_mismatch")), self) elif ccmx[0] == "AUTO": index = 1 if ccmx[1]: items[1] += " (%s: %s)" % (types.get(os.path.splitext(ccmx[1])[1].lower()[1:]), self.ccmx_cached_descriptors[ccmx[1]]) else: items[1] += " (%s)" % lang.getstr("colorimeter_correction.file.none") use_ccmx = (self.worker.instrument_can_use_ccxx(False) and len(ccmx) > 1 and ccmx[1]) tech = None if use_ccmx: mode = None try: cgats = CGATS.CGATS(ccmx[1]) except (IOError, CGATS.CGATSError), exception: safe_print("%s:" % ccmx[1], exception) else: if getcfg("measurement_mode") != "auto": tech = cgats.queryv1("TECHNOLOGY") # Set appropriate measurement mode # IMPORTANT: Make changes aswell in the following locations: # - DisplayCAL.get_cgats_measurement_mode mode = get_cgats_measurement_mode(cgats, self.worker.get_instrument_name()) observer = cgats.queryv1("OBSERVER") if observer in self.observers_ab: setcfg("observer", observer) self.update_observer_ctrl() if mode or (getcfg("measurement_mode") != "auto" and not self.worker.instrument_can_use_ccxx()): if (update_measurement_mode or mode == getcfg("measurement_mode")): setcfg("measurement_mode", mode) self.update_measurement_mode() else: ccmx = ["", ""] index = 0 tech = None if not tech: tech = self.worker.get_instrument_measurement_modes().get( getcfg("measurement_mode")) setcfg("display.technology", tech) setcfg("colorimeter_correction_matrix_file", ":".join(ccmx)) self.colorimeter_correction_matrix_ctrl.Freeze() self.colorimeter_correction_matrix_ctrl.SetItems(items) self.colorimeter_correction_matrix_ctrl.SetSelection(index) self.colorimeter_correction_matrix_ctrl.Thaw() if use_ccmx: tooltip = ccmx[1] else: tooltip = "" self.update_main_controls() self.colorimeter_correction_matrix_ctrl.SetToolTipString(tooltip) self.update_estimated_measurement_times() self.show_observer_ctrl() def update_main_controls(self): """ Enable/disable the calibrate and profile buttons based on available Argyll functionality. """ self.panel.Freeze() update_cal = self.calibration_update_cb.GetValue() self.measurement_mode_ctrl.Enable( bool(self.worker.instruments) and len(self.measurement_mode_ctrl.GetItems()) > 1) update_profile = update_cal and is_profile() self.whitepoint_measure_btn.Enable(bool(self.worker.instruments) and not update_cal) self.ambient_measure_btn.Enable(bool(self.worker.instruments) and not update_cal) lut3d_create_btn_show = (self.lut3d_settings_panel.IsShown() and not getcfg("3dlut.create")) mr_btn_show = self.mr_settings_panel.IsShown() enable_cal = (not config.is_uncalibratable_display() and (self.interactive_display_adjustment_cb.GetValue() or self.trc_ctrl.GetSelection() > 0)) calibrate_and_profile_btn_show = (not lut3d_create_btn_show and not mr_btn_show and enable_cal and not update_profile) calibrate_btn_show = (not lut3d_create_btn_show and not mr_btn_show and enable_cal) profile_btn_show = (not lut3d_create_btn_show and not mr_btn_show and not calibrate_and_profile_btn_show and not update_cal) if ((config.is_uncalibratable_display() and self.calibration_settings_panel.IsShown()) or (not getcfg("3dlut.tab.enable") and self.lut3d_settings_panel.IsShown())): self.tab_select_handler(self.display_instrument_btn) if (config.is_uncalibratable_display() and not self.calibration_settings_btn.IsEnabled()): self.calibration_settings_btn._pressed = False self.calibration_settings_btn._SetState(platebtn.PLATE_NORMAL) self.calibration_settings_btn.Enable(not config.is_uncalibratable_display()) self.lut3d_settings_btn.Enable(bool(getcfg("3dlut.tab.enable"))) self.calibrate_btn.Show(not calibrate_and_profile_btn_show and calibrate_btn_show) self.calibrate_btn.Enable(not calibrate_and_profile_btn_show and calibrate_btn_show and not is_ccxx_testchart() and bool(self.worker.displays) and bool(self.worker.instruments)) self.calibrate_and_profile_btn.Show(calibrate_and_profile_btn_show) self.calibrate_and_profile_btn.Enable(calibrate_and_profile_btn_show and not is_ccxx_testchart() and bool(self.worker.displays) and bool(self.worker.instruments)) self.profile_btn.Show(profile_btn_show) self.profile_btn.Enable(profile_btn_show and bool(self.worker.displays) and bool(self.worker.instruments)) self.lut3d_create_btn.Show(lut3d_create_btn_show) self.measurement_report_btn.Show(mr_btn_show) self.buttonpanel.Layout() self.lut3d_create_btn.Enable(is_profile() and getcfg("calibration.file", False) not in self.presets) if getcfg("calibration.file", False) in self.presets[1:]: self.measurement_report_btn.Disable() self.panel.Layout() self.panel.Thaw() def update_calibration_file_ctrl(self, silent=False): """ Update items shown in the calibration file control and set a tooltip with the path of the currently selected file """ cal = getcfg("calibration.file", False) if cal: result = check_file_isfile(cal, silent=silent) if isinstance(result, Exception) and not silent: show_result_dialog(result, self) else: result = False if not isinstance(result, Exception) and result: filename, ext = os.path.splitext(cal) if not cal in self.recent_cals: self.recent_cals.append(cal) recent_cals = [] for recent_cal in self.recent_cals: if recent_cal not in self.presets: recent_cals.append(recent_cal) setcfg("recent_cals", os.pathsep.join(recent_cals)) self.calibration_file_ctrl.Append( lang.getstr(os.path.basename(cal))) # The case-sensitive index could fail because of # case insensitive file systems, e.g. if the # stored filename string is # "C:\Users\Name\AppData\DisplayCAL\storage\MyFile" # but the actual filename is # "C:\Users\Name\AppData\DisplayCAL\storage\myfile" # (maybe because the user renamed the file) idx = index_fallback_ignorecase(self.recent_cals, cal) self.calibration_file_ctrl.SetSelection(idx) self.calibration_file_ctrl.SetToolTipString(cal) if ext.lower() in (".icc", ".icm"): profile_path = cal else: profile_path = filename + profile_ext profile_exists = os.path.exists(profile_path) else: filename = None if cal in self.recent_cals[1:]: # The case-sensitive index could fail because of # case insensitive file systems, e.g. if the # stored filename string is # "C:\Users\Name\AppData\DisplayCAL\storage\MyFile" # but the actual filename is # "C:\Users\Name\AppData\DisplayCAL\storage\myfile" # (maybe because the user renamed the file) idx = index_fallback_ignorecase(self.recent_cals, cal) self.recent_cals.remove(cal) self.calibration_file_ctrl.Delete(idx) cal = None self.calibration_file_ctrl.SetStringSelection( lang.getstr("settings.new")) self.calibration_file_ctrl.SetToolTip(None) setcfg("calibration.file", None) setcfg("calibration.update", 0) profile_path = None profile_exists = False return cal, filename, profile_path, profile_exists def update_controls(self, update_profile_name=True, update_ccmx_items=True, silent=False): """ Update all controls based on configuration and available Argyll functionality. """ self.updatingctrls = True self.panel.Freeze() (cal, filename, profile_path, profile_exists) = self.update_calibration_file_ctrl(silent) self.create_session_archive_btn.Enable(bool(cal) and cal not in self.presets) self.delete_calibration_btn.Enable(bool(cal) and cal not in self.presets) self.install_profile_btn.Enable(profile_exists and profile_path == cal and cal not in self.presets) is_profile_ = is_profile(include_display_profile=True) self.profile_info_btn.Enable(is_profile_) enable_update = (bool(cal) and os.path.exists(filename + ".cal") and can_update_cal(filename + ".cal")) if not enable_update: setcfg("calibration.update", 0) update_cal = getcfg("calibration.update") self.calibration_update_cb.Enable(enable_update) self.calibration_update_cb.SetValue(bool(update_cal)) if not update_cal or not profile_exists: setcfg("profile.update", 0) update_profile = update_cal and profile_exists enable_profile = not(update_profile) if update_ccmx_items: self.update_colorimeter_correction_matrix_ctrl_items() self.update_measurement_mode() self.update_observer_ctrl() for name in ("min_display_update_delay_ms", "display_settle_time_mult"): value = bool(getcfg("measure.override_%s" % name)) getattr(self, "override_%s" % name).SetValue(value) self.update_display_delay_ctrl(name, value) self.update_adjustment_controls() self.whitepoint_colortemp_textctrl.Enable(not update_cal) self.whitepoint_colortemp_locus_ctrl.Enable(not update_cal) self.whitepoint_x_textctrl.Enable(not update_cal) self.whitepoint_y_textctrl.Enable(not update_cal) self.luminance_textctrl.Enable(not update_cal) self.black_luminance_textctrl.Enable(not update_cal) self.trc_ctrl.Enable(not update_cal) self.trc_textctrl.Enable(not update_cal) self.trc_type_ctrl.Enable(not update_cal) self.ambient_viewcond_adjust_cb.Enable(not update_cal) self.black_output_offset_ctrl.Enable(not update_cal) self.black_output_offset_intctrl.Enable(not update_cal) self.black_point_correction_auto_cb.Enable(not update_cal) self.black_point_correction_ctrl.Enable(not update_cal) self.black_point_correction_intctrl.Enable(not update_cal) self.update_black_point_rate_ctrl() self.update_drift_compensation_ctrls() self.testchart_btn.Enable(enable_profile) self.testchart_patches_amount_ctrl.Enable(enable_profile) self.create_testchart_btn.Enable(enable_profile) self.profile_type_ctrl.Enable(enable_profile) self.whitepoint_colortemp_locus_ctrl.SetSelection( self.whitepoint_colortemp_loci_ba.get( getcfg("whitepoint.colortemp.locus"), self.whitepoint_colortemp_loci_ba.get( defaults["whitepoint.colortemp.locus"]))) self.whitelevel_drift_compensation.SetValue( bool(getcfg("drift_compensation.whitelevel"))) self.blacklevel_drift_compensation.SetValue( bool(getcfg("drift_compensation.blacklevel"))) trc = getcfg("trc") bt1886 = (trc == 2.4 and getcfg("trc.type") == "G" and getcfg("calibration.black_output_offset") == 0) if trc in ("l", "709", "240", "s"): self.trc_type_ctrl.SetSelection(0) if trc == "l": self.trc_ctrl.SetSelection(2) elif trc == "709": self.trc_ctrl.SetSelection(3) elif trc == "240": self.trc_ctrl.SetSelection(5) elif trc == "s": self.trc_ctrl.SetSelection(6) elif bt1886: self.trc_ctrl.SetSelection(4) self.trc_textctrl.SetValue(str(trc)) self.trc_type_ctrl.SetSelection(1) else: if trc: if (trc == 2.2 and getcfg("trc.type") == "g" and getcfg("calibration.black_output_offset") == 1): # Gamma 2.2 relative 100% output offset self.trc_ctrl.SetSelection(1) else: # Custom self.trc_ctrl.SetSelection(7) self.trc_textctrl.SetValue(str(trc)) else: self.trc_ctrl.SetSelection(0) self.trc_type_ctrl.SetSelection( self.trc_types_ba.get(getcfg("trc.type"), self.trc_types_ba.get(defaults["trc.type"]))) self.show_trc_controls() self.ambient_viewcond_adjust_cb.SetValue( bool(int(getcfg("calibration.ambient_viewcond_adjust")))) self.ambient_viewcond_adjust_textctrl.SetValue( getcfg("calibration.ambient_viewcond_adjust.lux")) self.ambient_viewcond_adjust_textctrl.Enable( not update_cal and bool(int(getcfg("calibration.ambient_viewcond_adjust")))) self.update_profile_type_ctrl() self.update_black_output_offset_ctrl() self.black_point_correction_ctrl.SetValue( int(Decimal(str(getcfg("calibration.black_point_correction"))) * 100)) self.black_point_correction_intctrl.SetValue( int(Decimal(str(getcfg("calibration.black_point_correction"))) * 100)) self.black_point_rate_ctrl.SetValue( int(Decimal(str(getcfg("calibration.black_point_rate"))) * 100)) self.black_point_rate_floatctrl.SetValue( getcfg("calibration.black_point_rate")) q = self.quality_ba.get(getcfg("calibration.quality"), self.quality_ba.get( defaults["calibration.quality"])) self.calibration_quality_ctrl.SetValue(q) self.set_calibration_quality_label(self.quality_ab[q]) self.update_bpc(enable_profile) self.testchart_ctrl.Enable(enable_profile) if self.set_default_testchart() is None: self.set_testchart(update_profile_name=not update_profile_name) simple_gamma_model = self.get_profile_type() in ("g", "G") if simple_gamma_model: q = 3 else: q = self.quality_ba.get(getcfg("profile.quality"), self.quality_ba.get( defaults["profile.quality"])) - 1 self.profile_quality_ctrl.SetValue(q) if q == 1: self.profile_quality_info.SetLabel( lang.getstr("calibration.quality.low")) elif q == 2: self.profile_quality_info.SetLabel( lang.getstr("calibration.quality.medium")) elif q == 3: self.profile_quality_info.SetLabel( lang.getstr("calibration.quality.high")) elif q == 4: self.profile_quality_info.SetLabel( lang.getstr("calibration.quality.ultra")) self.profile_quality_ctrl.Enable(enable_profile and not simple_gamma_model) enable_gamap = self.get_profile_type() in ("l", "x", "X") self.gamap_btn.Enable(enable_profile and enable_gamap) if getattr(self, "extra_args", None): self.extra_args.update_controls() if hasattr(self, "gamapframe"): self.gamapframe.update_controls() if (self.lut3d_settings_panel.IsShown() or self.mr_settings_panel.IsShown()): if self.mr_settings_panel.IsShown(): self.mr_update_controls() else: self.set_profile("output") self.lut3d_update_controls() if getattr(self, "lut3dframe", None): self.lut3dframe.update_controls() if getattr(self, "reportframe", None): self.reportframe.update_controls() if update_profile_name: self.profile_name_textctrl.ChangeValue(getcfg("profile.name")) self.update_profile_name() self.update_main_controls() self.panel.Thaw() self.updatingctrls = False def update_trc_control(self): if self.trc_ctrl.GetSelection() in (1, 4, 7): if (getcfg("trc.type") == "G" and getcfg("calibration.black_output_offset") == 0 and getcfg("trc") == 2.4): self.trc_ctrl.SetSelection(4) # BT.1886 elif (getcfg("trc.type") == "g" and getcfg("calibration.black_output_offset") == 1 and getcfg("trc") == 2.2): # Gamma 2.2 relative 100% output offset self.trc_ctrl.SetSelection(1) else: self.trc_ctrl.SetSelection(7) # Custom def show_trc_controls(self, freeze=False): show_advanced_options = bool(getcfg("show_advanced_options")) if freeze: self.panel.Freeze() for ctrl in (self.trc_gamma_label, self.trc_textctrl, self.trc_type_ctrl): ctrl.Show(self.trc_ctrl.GetSelection() == 7 or (self.trc_ctrl.GetSelection() in (1, 4) and show_advanced_options)) for ctrl in (self.black_output_offset_label, self.black_output_offset_ctrl, self.black_output_offset_intctrl, self.black_output_offset_intctrl_label): ctrl.Show(self.trc_ctrl.GetSelection() == 7 or (self.trc_ctrl.GetSelection() > 0 and show_advanced_options)) for ctrl in (self.ambient_viewcond_adjust_cb, self.ambient_viewcond_adjust_textctrl, self.ambient_viewcond_adjust_textctrl_label, self.ambient_measure_btn, self.black_point_correction_label, self.black_point_correction_auto_cb): ctrl.GetContainingSizer().Show(ctrl, self.trc_ctrl.GetSelection() > 0 and show_advanced_options) self.update_black_point_rate_ctrl() for ctrl in (self.calibration_quality_label, self.calibration_quality_ctrl, self.calibration_quality_info, self.cal_meas_time): ctrl.GetContainingSizer().Show(ctrl, self.trc_ctrl.GetSelection() > 0) # Make the height of the last row in the calibration settings sizer # match the other rows if self.trc_ctrl.GetSelection() > 0: minheight = self.trc_ctrl.Size[1] + 8 else: minheight = 0 self.calibration_quality_ctrl.ContainingSizer.SetMinSize((0, minheight)) self.black_point_correction_auto_handler() if freeze: self.panel.Thaw() def update_black_output_offset_ctrl(self): self.black_output_offset_ctrl.SetValue( int(Decimal(str(getcfg("calibration.black_output_offset"))) * 100)) self.black_output_offset_intctrl.SetValue( int(Decimal(str(getcfg("calibration.black_output_offset"))) * 100)) def update_black_point_rate_ctrl(self): self.panel.Freeze() enable = not(self.calibration_update_cb.GetValue()) show = (self.trc_ctrl.GetSelection() > 0 and bool(getcfg("show_advanced_options")) and defaults["calibration.black_point_rate.enabled"]) self.black_point_rate_label.GetContainingSizer().Show( self.black_point_rate_label, show) self.black_point_rate_ctrl.GetContainingSizer().Show( self.black_point_rate_ctrl, show) self.black_point_rate_ctrl.Enable( enable and getcfg("calibration.black_point_correction") < 1 and defaults["calibration.black_point_rate.enabled"]) self.black_point_rate_floatctrl.GetContainingSizer().Show( self.black_point_rate_floatctrl, show) self.black_point_rate_floatctrl.Enable( enable and getcfg("calibration.black_point_correction") < 1 and defaults["calibration.black_point_rate.enabled"]) self.calpanel.Layout() self.panel.Thaw() def update_bpc(self, enable_profile=True): enable_bpc = ((self.get_profile_type() in ("s", "S") or (self.get_profile_type() in ("l", "x", "X") and (getcfg("profile.b2a.hires") or getcfg("profile.quality.b2a") in ("l", "n")))) and enable_profile) self.black_point_compensation_cb.Enable(enable_bpc) self.black_point_compensation_cb.SetValue(enable_bpc and bool(int(getcfg("profile.black_point_compensation")))) def update_drift_compensation_ctrls(self): self.panel.Freeze() self.blacklevel_drift_compensation.GetContainingSizer().Show( self.blacklevel_drift_compensation, self.worker.argyll_version >= [1, 3, 0]) self.whitelevel_drift_compensation.GetContainingSizer().Show( self.whitelevel_drift_compensation, self.worker.argyll_version >= [1, 3, 0]) self.calpanel.Layout() self.panel.Thaw() def update_estimated_measurement_time(self, which): """ Update the estimated measurement time shown """ if which == "testchart": patches = int(self.testchart_patches_amount.Label) elif which == "cal": # See dispcal.c if getcfg("calibration.quality") == "v": # Very low isteps = 10 rsteps = 16 maxits = 1 mxrpts = 10 elif getcfg("calibration.quality") == "l": # Low isteps = 12 rsteps = 32 maxits = 2 mxrpts = 10 elif getcfg("calibration.quality") == "m": # Medium isteps = 16 rsteps = 64 maxits = 3 mxrpts = 12 elif getcfg("calibration.quality") == "h": # High isteps = 20 rsteps = 96 maxits = 4 mxrpts = 16 elif getcfg("calibration.quality") == "u": # Ultra isteps = 24 rsteps = 128 maxits = 5 mxrpts = 24 # 1st iteration rsteps /= 1 << (maxits - 1) patches = rsteps # 2nd..nth iteration for i in xrange(maxits - 1): rsteps *= 2 patches += rsteps # Multiply by estimated repeats patches *= mxrpts / 1.5 # Amount of precal patches is always 9 patches += 9 # Initial amount of cal patches is always isteps * 4 patches += isteps * 4 elif which == "chart": patches = int(self.chart_patches_amount.Label) ReportFrame.update_estimated_measurement_time(self, which, patches) def update_estimated_measurement_times(self): self.update_estimated_measurement_time("cal") self.update_estimated_measurement_time("testchart") self.update_estimated_measurement_time("chart") def blacklevel_drift_compensation_handler(self, event): setcfg("drift_compensation.blacklevel", int(self.blacklevel_drift_compensation.GetValue())) self.update_estimated_measurement_times() def whitelevel_drift_compensation_handler(self, event): setcfg("drift_compensation.whitelevel", int(self.whitelevel_drift_compensation.GetValue())) self.update_estimated_measurement_times() def calibration_update_ctrl_handler(self, event): if debug: safe_print("[D] calibration_update_ctrl_handler called for ID %s " "%s event type %s %s" % (event.GetId(), getevtobjname(event, self), event.GetEventType(), getevttype(event))) setcfg("calibration.update", int(self.calibration_update_cb.GetValue())) setcfg("profile.update", int(self.calibration_update_cb.GetValue() and is_profile())) self.update_controls() def enable_spyder2_handler(self, event, check_instrument_setup=False, callafter=None, callafter_args=None): self.update_menus() if check_set_argyll_bin(): msg = lang.getstr("oem.import.auto") if sys.platform == "win32": msg = " ".join([lang.getstr("oem.import.auto_windows"), msg]) dlg = ConfirmDialog(self, title=lang.getstr("enable_spyder2"), msg=msg, ok=lang.getstr("auto"), cancel=lang.getstr("cancel"), bitmap=geticon(32, "dialog-information"), alt=lang.getstr("file.select")) needroot = self.worker.argyll_version < [1, 2, 0] dlg.install_user = wx.RadioButton(dlg, -1, lang.getstr("install_user"), style=wx.RB_GROUP) dlg.install_user.Enable(not needroot) dlg.install_user.SetValue(not needroot) dlg.sizer3.Add(dlg.install_user, flag=wx.TOP | wx.ALIGN_LEFT, border=16) dlg.install_systemwide = wx.RadioButton(dlg, -1, lang.getstr("install_local_system")) dlg.install_user.Enable(not needroot) dlg.install_systemwide.SetValue(needroot) dlg.install_user.Bind(wx.EVT_RADIOBUTTON, install_scope_handler) dlg.install_systemwide.Bind(wx.EVT_RADIOBUTTON, install_scope_handler) install_scope_handler(dlg=dlg) dlg.sizer3.Add(dlg.install_systemwide, flag=wx.TOP | wx.ALIGN_LEFT, border=4) dlg.sizer0.SetSizeHints(dlg) dlg.sizer0.Layout() if event: choice = dlg.ShowModal() else: choice = wx.ID_OK asroot = dlg.install_systemwide.GetValue() dlg.Destroy() if choice == wx.ID_CANCEL: return if choice == wx.ID_OK: # Auto path = None if sys.platform in ("darwin", "win32"): # Look for Spyder.lib/CVSpyder.dll ourself because spyd2en # will only try some fixed paths if sys.platform == "darwin": wildcard = os.path.join(os.path.sep, "Applications", "Spyder2*", "Spyder2*.app", "Contents", "MacOSClassic", "Spyder.lib") else: wildcard = os.path.join(getenvu("PROGRAMFILES", ""), "ColorVision", "Spyder2*", "CVSpyder.dll") for path in glob.glob(wildcard): break else: # Prompt for installer executable defaultDir, defaultFile = expanduseru("~"), "" dlg = wx.FileDialog(self, lang.getstr("file.select"), defaultDir=defaultDir, defaultFile=defaultFile, wildcard=lang.getstr("filetype.any") + "|*", style=wx.FD_OPEN | wx.FD_FILE_MUST_EXIST) dlg.Center(wx.BOTH) result = dlg.ShowModal() path = dlg.GetPath() dlg.Destroy() if result != wx.ID_OK: return if asroot: result = self.worker.authenticate(get_argyll_util("spyd2en"), lang.getstr("enable_spyder2"), self) if result not in (True, None): if isinstance(result, Exception): show_result_dialog(result, self) return self.worker.start(self.enable_spyder2_consumer, self.enable_spyder2_producer, cargs=(check_instrument_setup, callafter, callafter_args), wargs=(path, asroot), progress_msg=lang.getstr("enable_spyder2"), fancy=False) return (event and None) or True def enable_spyder2(self, path, asroot): cmd, args = get_argyll_util("spyd2en"), ["-v"] if asroot and self.worker.argyll_version >= [1, 2, 0]: args.append("-Sl") if path: args.append(path) result = self.worker.exec_cmd(cmd, args, capture_output=True, skip_scripts=True, silent=False, asroot=asroot, title=lang.getstr("enable_spyder2")) if asroot and sys.platform == "win32": # Wait for async process sleep(1) result = get_argyll_data_files("l", "spyd2PLD.bin") return result def enable_spyder2_producer(self, path, asroot): if not path: result = self.enable_spyder2(path, asroot) if result and not isinstance(result, Exception): return result if getcfg("dry_run"): return path = self.worker.download("http://%s/spyd2" % domain.lower()) if isinstance(path, Exception): return path elif not path: # Cancelled return return self.enable_spyder2(path, asroot) def enable_spyder2_consumer(self, result, check_instrument_setup, callafter=None, callafter_args=()): if not isinstance(result, Exception) and result: result = UnloggedInfo(lang.getstr("enable_spyder2_success")) self.update_menus() elif result is False: result = UnloggedError("".join(self.worker.errors)) if result: show_result_dialog(result, self) if check_instrument_setup: self.check_instrument_setup(callafter, callafter_args) elif callafter: wx.CallAfter(callafter, *callafter_args) def extra_args_handler(self, event): if not hasattr(self, "extra_args"): self.extra_args = ExtraArgsFrame(self) self.extra_args.Center() if self.extra_args.IsShownOnScreen(): self.extra_args.Raise() else: self.extra_args.Show() def startup_sound_enable_handler(self, event): setcfg("startup_sound.enable", int(self.menuitem_startup_sound.IsChecked())) def use_fancy_progress_handler(self, event): setcfg("use_fancy_progress", int(self.menuitem_use_fancy_progress.IsChecked())) def use_separate_lut_access_handler(self, event): setcfg("use_separate_lut_access", int(self.menuitem_use_separate_lut_access.IsChecked())) self.update_displays(set_height=True) def do_not_use_video_lut_handler(self, event): do_not_use_video_lut = self.menuitem_do_not_use_video_lut.IsChecked() is_patterngenerator = config.is_patterngenerator() if do_not_use_video_lut != is_patterngenerator: dlg = ConfirmDialog(self, msg=lang.getstr("calibration.do_not_use_video_lut.warning"), ok=lang.getstr("yes"), cancel=lang.getstr("no"), bitmap=geticon(32, "dialog-warning"), log=False) result = dlg.ShowModal() dlg.Destroy() if result != wx.ID_OK: self.menuitem_do_not_use_video_lut.Check(is_patterngenerator) return setcfg("calibration.use_video_lut", int(not do_not_use_video_lut)) if not is_patterngenerator: setcfg("calibration.use_video_lut.backup", None) def calibrate_instrument_handler(self, event): self.worker.start(lambda result: show_result_dialog(result, self) if isinstance(result, Exception) else None, self.worker.calibrate_instrument_producer, fancy=False) def allow_skip_sensor_cal_handler(self, event): setcfg("allow_skip_sensor_cal", int(self.menuitem_allow_skip_sensor_cal.IsChecked())) def update_adjustment_controls(self): update_cal = getcfg("calibration.update") auto = self.get_measurement_mode() == "auto" do_cal = bool(getcfg("calibration.interactive_display_adjustment", False) or getcfg("trc")) enable = (not update_cal and not auto and do_cal) for option in ("whitepoint.colortemp", "whitepoint.x", "whitepoint.y", "calibration.luminance", "calibration.black_luminance", "calibration.interactive_display_adjustment"): backup = getcfg("%s.backup" % option, False) if auto and backup is None: # Backup current settings setcfg("%s.backup" % option, getcfg(option, False)) elif not auto and backup is not None: setcfg(option, getcfg("%s.backup" % option)) setcfg("%s.backup" % option, None) if auto or not do_cal: setcfg("whitepoint.colortemp", None) setcfg("whitepoint.x", None) setcfg("whitepoint.y", None) self.whitepoint_colortemp_textctrl.Hide() self.whitepoint_colortemp_label.Hide() self.whitepoint_x_textctrl.Hide() self.whitepoint_x_label.Hide() self.whitepoint_y_textctrl.Hide() self.whitepoint_y_label.Hide() self.whitepoint_measure_btn.Hide() self.luminance_ctrl.SetSelection(0) self.luminance_textctrl.Hide() self.luminance_textctrl_label.Hide() setcfg("calibration.luminance", None) self.black_luminance_textctrl.Hide() self.black_luminance_textctrl_label.Hide() setcfg("calibration.black_luminance", None) setcfg("calibration.interactive_display_adjustment", 0) self.whitepoint_ctrl.Enable(enable) self.luminance_ctrl.Enable(enable) self.black_luminance_ctrl.Enable(enable) self.interactive_display_adjustment_cb.Enable(not update_cal and not auto) self.interactive_display_adjustment_cb.SetValue(not update_cal and bool(int(getcfg("calibration.interactive_display_adjustment")))) self.whitepoint_colortemp_textctrl.SetValue( str(stripzeros(getcfg("whitepoint.colortemp")))) if getcfg("whitepoint.colortemp", False): self.whitepoint_ctrl.SetSelection(1) elif getcfg("whitepoint.x", False) and getcfg("whitepoint.y", False): self.whitepoint_x_textctrl.SetValue(getcfg("whitepoint.x")) self.whitepoint_y_textctrl.SetValue(getcfg("whitepoint.y")) self.whitepoint_ctrl.SetSelection(2) else: self.whitepoint_ctrl.SetSelection(0) self.whitepoint_ctrl_handler( CustomEvent(wx.EVT_CHOICE.evtType[0], self.whitepoint_ctrl), False) show_advanced_options = bool(getcfg("show_advanced_options")) for ctrl in (self.whitepoint_colortemp_locus_label, self.whitepoint_colortemp_locus_ctrl): ctrl.Show(self.whitepoint_ctrl.GetSelection() in (0, 1) and not auto and do_cal and show_advanced_options) if getcfg("calibration.luminance", False): self.luminance_ctrl.SetSelection(1) else: self.luminance_ctrl.SetSelection(0) self.luminance_textctrl.SetValue(getcfg("calibration.luminance")) self.luminance_textctrl.Show(bool(getcfg("calibration.luminance", False))) self.luminance_textctrl_label.Show(bool(getcfg("calibration.luminance", False))) if getcfg("calibration.black_luminance", False): self.black_luminance_ctrl.SetSelection(1) else: self.black_luminance_ctrl.SetSelection(0) self.black_luminance_textctrl.SetValue( getcfg("calibration.black_luminance")) self.black_luminance_textctrl.Show( bool(show_advanced_options and getcfg("calibration.black_luminance", False))) self.black_luminance_textctrl_label.Show( bool(show_advanced_options and getcfg("calibration.black_luminance", False))) def enable_3dlut_tab_handler(self, event): setcfg("3dlut.tab.enable", int(self.menuitem_enable_3dlut_tab.IsChecked())) setcfg("3dlut.tab.enable.backup", getcfg("3dlut.tab.enable")) if not getcfg("3dlut.tab.enable"): setcfg("3dlut.create", 0) self.lut3d_update_controls() self.update_main_controls() def enable_argyll_debug_handler(self, event): if not getcfg("argyll.debug"): dlg = ConfirmDialog(self, msg=lang.getstr("argyll.debug.warning1"), ok=lang.getstr("ok"), cancel=lang.getstr("cancel"), bitmap=geticon(32, "dialog-warning"), log=False) result = dlg.ShowModal() dlg.Destroy() if result != wx.ID_OK: self.menuitem_enable_argyll_debug.Check(False) return InfoDialog(self, msg=lang.getstr("argyll.debug.warning2"), bitmap=geticon(32, "dialog-warning"), log=False) setcfg("argyll.debug", int(self.menuitem_enable_argyll_debug.IsChecked())) def enable_dry_run_handler(self, event): setcfg("dry_run", int(self.menuitem_enable_dry_run.IsChecked())) def enable_menus(self, enable=True): for menu, label in self.menubar.GetMenus(): for item in menu.GetMenuItems(): item.Enable(enable) if enable: self.update_menus() def lut3d_check_bpc(self): if getcfg("3dlut.create") and getcfg("profile.black_point_compensation"): # Warn about BPC if creating 3D LUT dlg = ConfirmDialog(self, msg=lang.getstr("black_point_compensation.3dlut.warning"), ok=lang.getstr("turn_off"), cancel=lang.getstr("setting.keep_current"), bitmap=geticon(32, "dialog-warning")) if dlg.ShowModal() == wx.ID_OK: setcfg("profile.black_point_compensation", 0) self.update_bpc() def lut3d_create_cb_handler(self, event): v = int(self.lut3d_create_cb.GetValue()) if v != getcfg("3dlut.create"): self.profile_settings_changed() setcfg("3dlut.create", v) self.calpanel.Freeze() self.lut3d_show_trc_controls() self.lut3d_update_apply_cal_control() self.lut3d_update_b2a_controls() self.calpanel.Thaw() self.lut3d_check_bpc() self.update_main_controls() def lut3d_init_input_profiles(self): self.input_profiles = OrderedDict() for profile_filename in ["ACES.icm", "DCI_XYZ.icm", "Rec709.icm", "Rec2020.icm", "EBU3213_PAL.icm", "SMPTE_RP145_NTSC.icm", "SMPTE431_P3.icm", getcfg("3dlut.input.profile")]: if not os.path.isabs(profile_filename): profile_filename = get_data_path("ref/" + profile_filename) if profile_filename: try: profile = ICCP.ICCProfile(profile_filename) except (IOError, ICCP.ICCProfileInvalidError), exception: safe_print("%s:" % profile_filename, exception) else: if profile_filename not in self.input_profiles.values(): desc = profile.getDescription() desc = re.sub(r"\s*(?:color profile|primaries with " "\S+ transfer function)$", "", desc) self.input_profiles[desc] = profile_filename self.input_profiles.sort() self.lut3d_input_profile_ctrl.SetItems(self.input_profiles.keys()) def lut3d_input_colorspace_handler(self, event): if event: self.lut3d_set_option("3dlut.input.profile", self.input_profiles[self.lut3d_input_profile_ctrl.GetStringSelection()], event) lut3d_input_profile = ICCP.ICCProfile(getcfg("3dlut.input.profile")) if (lut3d_input_profile and "rTRC" in lut3d_input_profile.tags and "gTRC" in lut3d_input_profile.tags and "bTRC" in lut3d_input_profile.tags and lut3d_input_profile.tags.rTRC == lut3d_input_profile.tags.gTRC == lut3d_input_profile.tags.bTRC and isinstance(lut3d_input_profile.tags.rTRC, ICCP.CurveType)): tf = lut3d_input_profile.tags.rTRC.get_transfer_function() # Set gamma to profile gamma if single gamma profile if tf[0][0].startswith("Gamma"): if not getcfg("3dlut.trc_gamma.backup", False): # Backup current gamma setcfg("3dlut.trc_gamma.backup", getcfg("3dlut.trc_gamma")) setcfg("3dlut.trc_gamma", round(tf[0][1], 2)) # Restore previous gamma if not single gamma # profile elif getcfg("3dlut.trc_gamma.backup", False): setcfg("3dlut.trc_gamma", getcfg("3dlut.trc_gamma.backup")) setcfg("3dlut.trc_gamma.backup", None) self.lut3d_update_trc_controls() self.lut3d_show_trc_controls() if getattr(self, "lut3dframe", None): self.lut3dframe.update_controls() self.lut3d_input_profile_ctrl.SetToolTipString( getcfg("3dlut.input.profile")) def lut3d_set_path(self, path=None): # 3D LUT filename with crcr32 hash before extension - up to DCG 2.9.0.7 profile_save_path = os.path.splitext(path or getcfg("calibration.file") or defaults["calibration.file"])[0] lut3d = [getcfg("3dlut.gamap.use_b2a") and "gg" or "G", "i" + getcfg("3dlut.rendering_intent"), "r%i" % getcfg("3dlut.size"), "e" + getcfg("3dlut.encoding.input"), "E" + getcfg("3dlut.encoding.output"), "I%s:%s:%s" % (getcfg("3dlut.trc_gamma_type"), getcfg("3dlut.trc_output_offset"), getcfg("3dlut.trc_gamma"))] if getcfg("3dlut.format") == "3dl": lut3d.append(str(getcfg("3dlut.bitdepth.input"))) if getcfg("3dlut.format") in ("3dl", "png", "ReShade"): lut3d.append(str(getcfg("3dlut.bitdepth.output"))) lut3d_ext = getcfg("3dlut.format") if lut3d_ext == "eeColor": lut3d_ext = "txt" elif lut3d_ext == "madVR": lut3d_ext = "3dlut" elif lut3d_ext == "ReShade": lut3d_ext = "png" input_profname = os.path.splitext(os.path.basename(getcfg("3dlut.input.profile")))[0] self.lut3d_path = ".".join([profile_save_path, input_profname, "%X" % (crc32("-".join(lut3d)) & 0xFFFFFFFF), lut3d_ext]) if not os.path.isfile(self.lut3d_path): # 3D LUT filename with plain options before extension - DCG 2.9.0.8+ enc_in = lut3d[3][1:] enc_out = lut3d[4][1:] encoding = enc_in if enc_in != enc_out: encoding += enc_out if getcfg("3dlut.output.profile.apply_cal"): cal_exclude = "" else: cal_exclude = "e" lut3dp = [lut3d[5][1].replace("b", "bb") + lut3d[5][3:].replace(":", ","), # TRC cal_exclude, lut3d[0], # Gamut mapping mode lut3d[1][1:], # Rendering intent encoding, lut3d[2][1:]] # Resolution bitdepth_in = None bitdepth_out = None if len(lut3d) > 6: bitdepth_in = lut3d[6] # Input bitdepth if len(lut3d) > 7: bitdepth_out = lut3d[7] # Output bitdepth if bitdepth_in or bitdepth_out: bitdepth = bitdepth_in if bitdepth_out and bitdepth_in != bitdepth_out: bitdepth += bitdepth_out lut3dp.append(bitdepth) self.lut3d_path = ".".join([profile_save_path, input_profname, "".join(lut3dp), lut3d_ext]) devlink = os.path.splitext(self.lut3d_path)[0] + profile_ext setcfg("measurement_report.devlink_profile", devlink) def lut3d_show_controls(self): show = True#bool(getcfg("3dlut.create")) self.lut3d_input_profile_label.Show(show) self.lut3d_input_profile_ctrl.Show(show) self.lut3d_show_trc_controls() self.lut3d_show_encoding_controls(show) self.lut3d_format_label.Show(show) self.lut3d_format_ctrl.Show(show) show_advanced_options = getcfg("show_advanced_options") for ctrl in (self.lut3d_apply_cal_cb, self.gamut_mapping_mode, self.gamut_mapping_inverse_a2b, self.gamut_mapping_b2a): ctrl.GetContainingSizer().Show(ctrl, show_advanced_options and show) for ctrl in (self.lut3d_size_label, self.lut3d_size_ctrl): ctrl.GetContainingSizer().Show(ctrl, show) def lut3d_update_apply_cal_control(self): profile = not getcfg("3dlut.create") and get_current_profile(True) enable_apply_cal = bool(getcfg("3dlut.create") or (profile and isinstance(profile.tags.get("vcgt"), ICCP.VideoCardGammaType))) self.lut3d_apply_cal_cb.SetValue(enable_apply_cal and bool(getcfg("3dlut.output.profile.apply_cal"))) self.lut3d_apply_cal_cb.Enable(enable_apply_cal) def lut3d_update_b2a_controls(self): # Allow using B2A instead of inverse A2B? if getcfg("3dlut.create"): allow_b2a_gamap = (getcfg("profile.type") in ("l", "x", "X") and getcfg("profile.b2a.hires")) else: profile = get_current_profile(True) allow_b2a_gamap = (profile and "B2A0" in profile.tags and isinstance(profile.tags.B2A0, ICCP.LUT16Type) and profile.tags.B2A0.clut_grid_steps >= 17) self.gamut_mapping_b2a.Enable(bool(allow_b2a_gamap)) if not allow_b2a_gamap: setcfg("3dlut.gamap.use_b2a", 0) self.gamut_mapping_inverse_a2b.SetValue( not getcfg("3dlut.gamap.use_b2a")) self.gamut_mapping_b2a.SetValue( bool(getcfg("3dlut.gamap.use_b2a"))) def lut3d_update_controls(self): self.lut3d_create_cb.SetValue(bool(getcfg("3dlut.create"))) lut3d_input_profile = getcfg("3dlut.input.profile") if not lut3d_input_profile in self.input_profiles.values(): if not lut3d_input_profile: lut3d_input_profile = defaults["3dlut.input.profile"] setcfg("3dlut.input.profile", lut3d_input_profile) if lut3d_input_profile in self.input_profiles.values(): self.lut3d_input_profile_ctrl.SetSelection( self.input_profiles.values().index(lut3d_input_profile)) self.lut3d_input_colorspace_handler(None) self.lut3d_update_apply_cal_control() self.lut3d_update_b2a_controls() self.lut3d_update_shared_controls() self.lut3d_update_encoding_controls() self.lut3d_show_controls() def profile_quality_warning_handler(self, event): q = self.get_profile_quality() if q == "u": InfoDialog(self, msg=lang.getstr("quality.ultra.warning"), ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-warning"), log=False) def profile_quality_ctrl_handler(self, event): if debug: safe_print("[D] profile_quality_ctrl_handler called for ID %s %s " "event type %s %s" % (event.GetId(), getevtobjname(event, self), event.GetEventType(), getevttype(event))) oldq = getcfg("profile.quality") q = self.get_profile_quality() if q == oldq: return if q == "l": self.profile_quality_info.SetLabel( lang.getstr("calibration.quality.low")) elif q == "m": self.profile_quality_info.SetLabel(lang.getstr( "calibration.quality.medium")) elif q == "h": self.profile_quality_info.SetLabel(lang.getstr( "calibration.quality.high")) elif q == "u": self.profile_quality_info.SetLabel(lang.getstr( "calibration.quality.ultra")) self.profile_settings_changed() setcfg("profile.quality", q) self.update_profile_name() self.set_default_testchart(False) wx.CallAfter(self.check_testchart_patches_amount) def calibration_file_ctrl_handler(self, event): if debug: safe_print("[D] calibration_file_ctrl_handler called for ID %s %s " "event type %s %s" % (event.GetId(), getevtobjname(event, self), event.GetEventType(), getevttype(event))) sel = self.calibration_file_ctrl.GetSelection() if sel > 0: self.load_cal_handler(None, path=self.recent_cals[sel]) else: self.cal_changed(setchanged=False) if getattr(self, "lut3dframe", None): self.lut3dframe.set_profile("output") if getattr(self, "reportframe", None): self.reportframe.set_profile("output") ### Set measurement report dest profile to current ##setcfg("measurement_report.output_profile", ##get_current_profile_path()) if (self.lut3d_settings_panel.IsShown() or self.mr_settings_panel.IsShown()): if self.mr_settings_panel.IsShown(): self.mr_update_controls() else: self.set_profile("output") if self.lut3d_settings_panel.IsShown(): self.lut3d_show_trc_controls() self.update_main_controls() def settings_discard_changes(self, sel=None, keep_changed_state=False): """ Update the calibration file control and remove the leading asterisk (*) from items """ if sel is None: sel = self.calibration_file_ctrl.GetSelection() if not keep_changed_state: setcfg("settings.changed", 0) items = self.calibration_file_ctrl.GetItems() changed = False for j, item in enumerate(items): #if j != sel and item[0] == "*": if item[0] == "*": items[j] = item[2:] changed = True if changed: self.calibration_file_ctrl.Freeze() self.calibration_file_ctrl.SetItems(items) self.calibration_file_ctrl.SetSelection(sel) self.calibration_file_ctrl.Thaw() def settings_confirm_discard(self): """ Show a dialog for user to confirm or cancel discarding changed settings """ sel = self.calibration_file_ctrl.GetSelection() cal = getcfg("calibration.file", False) or "" if not cal in self.recent_cals: self.recent_cals.append(cal) # The case-sensitive index could fail because of # case insensitive file systems, e.g. if the # stored filename string is # "C:\Users\Name\AppData\DisplayCAL\storage\MyFile" # but the actual filename is # "C:\Users\Name\AppData\DisplayCAL\storage\myfile" # (maybe because the user renamed the file) idx = index_fallback_ignorecase(self.recent_cals, cal) self.calibration_file_ctrl.SetSelection(idx) dlg = ConfirmDialog(self, msg=lang.getstr("warning.discard_changes"), ok=lang.getstr("ok"), cancel=lang.getstr("cancel"), bitmap=geticon(32, "dialog-warning")) result = dlg.ShowModal() dlg.Destroy() if result != wx.ID_OK: return False self.settings_discard_changes(sel) return True def calibration_quality_ctrl_handler(self, event): if debug: safe_print("[D] calibration_quality_ctrl_handler called for ID %s " "%s event type %s %s" % (event.GetId(), getevtobjname(event, self), event.GetEventType(), getevttype(event))) q = self.get_calibration_quality() self.set_calibration_quality_label(q) if q != getcfg("calibration.quality"): self.profile_settings_changed() setcfg("calibration.quality", q) self.update_estimated_measurement_time("cal") self.update_profile_name() def set_calibration_quality_label(self, q): if q == "v": self.calibration_quality_info.SetLabel( lang.getstr("calibration.speed.veryhigh")) elif q == "l": self.calibration_quality_info.SetLabel( lang.getstr("calibration.speed.high")) elif q == "m": self.calibration_quality_info.SetLabel( lang.getstr("calibration.speed.medium")) elif q == "h": self.calibration_quality_info.SetLabel( lang.getstr("calibration.speed.low")) elif q == "u": self.calibration_quality_info.SetLabel( lang.getstr("calibration.speed.verylow")) def interactive_display_adjustment_ctrl_handler(self, event): if debug: safe_print("[D] interactive_display_adjustment_ctrl_handler called " "for ID %s %s event type %s %s" % (event.GetId(), getevtobjname(event, self), event.GetEventType(), getevttype(event))) v = int(self.interactive_display_adjustment_cb.GetValue()) if v != getcfg("calibration.interactive_display_adjustment"): setcfg("calibration.interactive_display_adjustment", v) self.profile_settings_changed() self.panel.Freeze() self.update_adjustment_controls() self.calpanel.Layout() self.calpanel.Refresh() self.panel.Thaw() self.update_main_controls() self.update_profile_name() def black_point_compensation_ctrl_handler(self, event): v = int(self.black_point_compensation_cb.GetValue()) if v != getcfg("profile.black_point_compensation"): self.profile_settings_changed() setcfg("profile.black_point_compensation", v) self.lut3d_check_bpc() def black_point_correction_auto_handler(self, event=None): if event: auto = self.black_point_correction_auto_cb.GetValue() setcfg("calibration.black_point_correction.auto", int(auto)) self.cal_changed() self.update_profile_name() else: auto = getcfg("calibration.black_point_correction.auto") self.black_point_correction_auto_cb.SetValue(bool(auto)) show = (self.trc_ctrl.GetSelection() > 0 and bool(getcfg("show_advanced_options")) and not auto) self.calpanel.Freeze() self.black_point_correction_ctrl.Show(show) self.black_point_correction_intctrl.Show(show) self.black_point_correction_intctrl_label.Show(show) self.calpanel.Layout() self.calpanel.Refresh() self.calpanel.Thaw() def black_point_correction_ctrl_handler(self, event): if debug: safe_print("[D] black_point_correction_ctrl_handler called for ID " "%s %s event type %s %s" % (event.GetId(), getevtobjname(event, self), event.GetEventType(), getevttype(event))) if event.GetId() == self.black_point_correction_intctrl.GetId(): self.black_point_correction_ctrl.SetValue( self.black_point_correction_intctrl.GetValue()) else: self.black_point_correction_intctrl.SetValue( self.black_point_correction_ctrl.GetValue()) v = self.get_black_point_correction() if float(v) != getcfg("calibration.black_point_correction"): self.cal_changed() setcfg("calibration.black_point_correction", v) self.black_point_rate_ctrl.Enable( getcfg("calibration.black_point_correction") < 1 and defaults["calibration.black_point_rate.enabled"]) self.black_point_rate_floatctrl.Enable( getcfg("calibration.black_point_correction") < 1 and defaults["calibration.black_point_rate.enabled"]) self.update_profile_name() def black_point_rate_ctrl_handler(self, event): if debug: safe_print("[D] black_point_rate_ctrl_handler called for ID %s %s " "event type %s %s" % (event.GetId(), getevtobjname(event, self), event.GetEventType(), getevttype(event))) if event.GetId() == self.black_point_rate_floatctrl.GetId(): self.black_point_rate_ctrl.SetValue( int(round(self.black_point_rate_floatctrl.GetValue() * 100))) else: self.black_point_rate_floatctrl.SetValue( self.black_point_rate_ctrl.GetValue() / 100.0) v = self.get_black_point_rate() if v != str(getcfg("calibration.black_point_rate")): self.cal_changed() setcfg("calibration.black_point_rate", v) self.update_profile_name() def black_output_offset_ctrl_handler(self, event): if debug: safe_print("[D] black_output_offset_ctrl_handler called for ID %s " "%s event type %s %s" % (event.GetId(), getevtobjname(event, self), event.GetEventType(), getevttype(event))) if event.GetId() == self.black_output_offset_intctrl.GetId(): self.black_output_offset_ctrl.SetValue( self.black_output_offset_intctrl.GetValue()) else: self.black_output_offset_intctrl.SetValue( self.black_output_offset_ctrl.GetValue()) v = self.get_black_output_offset() if float(v) != getcfg("calibration.black_output_offset"): self.cal_changed() setcfg("calibration.black_output_offset", v) self.update_profile_name() self.update_trc_control() self.show_trc_controls(True) def ambient_measure_handler(self, event): """ Start measuring ambient illumination """ if not check_set_argyll_bin(): return # Minimum Windows version: XP or Server 2003 if sys.platform == "win32" and sys.getwindowsversion() < (5, 1): show_result_dialog(Error(lang.getstr("windows.version.unsupported"))) return safe_print("-" * 80) safe_print(lang.getstr("ambient.measure")) self.stop_timers() self.worker.interactive = False self.worker.start(self.ambient_measure_consumer, self.ambient_measure_producer, ckwargs={"event_id": event.GetId()}, progress_title=lang.getstr("ambient.measure"), interactive_frame="ambient") def ambient_measure_producer(self): """ Process spotread output for ambient readings """ cmd = get_argyll_util("spotread") args = ["-v", "-a", "-x"] if getcfg("extra_args.spotread").strip(): args += parse_argument_string(getcfg("extra_args.spotread")) result = self.worker.add_measurement_features(args, False, allow_nondefault_observer=True, ambient=True) if isinstance(result, Exception): return result return self.worker.exec_cmd(cmd, args, capture_output=True, skip_scripts=True) def ambient_measure_consumer(self, result=None, event_id=None): self.start_timers() if not result or isinstance(result, Exception): if getattr(self.worker, "subprocess", None): self.worker.quit_terminate_cmd() if isinstance(result, Exception): show_result_dialog(result, self) return safe_print(lang.getstr("success")) result = re.sub("[^\t\n\r\x20-\x7f]", "", "".join(self.worker.output)).strip() if not result: wx.Bell() return if getcfg("whitepoint.colortemp.locus") == "T": K = re.search("Planckian temperature += (\d+(?:\.\d+)?)K", result, re.I) else: K = re.search("Daylight temperature += (\d+(?:\.\d+)?)K", result, re.I) Yxy = re.search("Yxy: (\d+(?:\.\d+)) (\d+(?:\.\d+)) (\d+(?:\.\d+))", result) lux = re.search("Ambient = (\d+(?:\.\d+)) Lux", result, re.I) set_whitepoint = event_id == self.whitepoint_measure_btn.GetId() set_ambient = event_id == self.ambient_measure_btn.GetId() if (set_whitepoint and not set_ambient and lux and getcfg("show_advanced_options")): dlg = ConfirmDialog(self, msg=lang.getstr("ambient.set"), ok=lang.getstr("yes"), cancel=lang.getstr("no"), bitmap=geticon(32, "dialog-question")) set_ambient = dlg.ShowModal() == wx.ID_OK dlg.Destroy() if set_ambient: if lux: self.ambient_viewcond_adjust_textctrl.SetValue(float(lux.groups()[0])) self.ambient_viewcond_adjust_cb.SetValue(True) self.ambient_viewcond_adjust_ctrl_handler( CustomEvent(wx.EVT_CHECKBOX.evtType[0], self.ambient_viewcond_adjust_cb)) else: show_result_dialog(Error(lang.getstr("ambient.measure.light_level.missing")), self) if not set_whitepoint and (K or Yxy): dlg = ConfirmDialog(self, msg=lang.getstr("whitepoint.set"), ok=lang.getstr("yes"), cancel=lang.getstr("no"), bitmap=geticon(32, "dialog-question")) set_whitepoint = dlg.ShowModal() == wx.ID_OK dlg.Destroy() if set_whitepoint: if not K and not Yxy: # Monochrome reading? show_result_dialog(Error(lang.getstr("ambient.measure.color.unsupported", self.comport_ctrl.GetStringSelection())), self) return if K: if not Yxy: self.whitepoint_ctrl.SetSelection(1) self.whitepoint_colortemp_textctrl.SetValue(K.groups()[0]) if Yxy: if not K: self.whitepoint_ctrl.SetSelection(2) Y, x, y = Yxy.groups() self.whitepoint_x_textctrl.SetValue(float(x)) self.whitepoint_y_textctrl.SetValue(float(y)) self.whitepoint_ctrl_handler(CustomEvent(wx.EVT_CHOICE.evtType[0], self.whitepoint_ctrl)) def ambient_viewcond_adjust_ctrl_handler(self, event): if event.GetId() == self.ambient_viewcond_adjust_textctrl.GetId() and \ (not self.ambient_viewcond_adjust_cb.GetValue() or getcfg("calibration.ambient_viewcond_adjust.lux") == self.ambient_viewcond_adjust_textctrl.GetValue()): event.Skip() return if debug: safe_print("[D] ambient_viewcond_adjust_ctrl_handler called for ID " "%s %s event type %s %s" % (event.GetId(), getevtobjname(event, self), event.GetEventType(), getevttype(event))) if event.GetId() == self.ambient_viewcond_adjust_textctrl.GetId(): if self.ambient_viewcond_adjust_textctrl.GetValue(): self.ambient_viewcond_adjust_cb.SetValue(True) else: self.ambient_viewcond_adjust_cb.SetValue(False) if self.ambient_viewcond_adjust_cb.GetValue(): self.ambient_viewcond_adjust_textctrl.Enable() v = self.ambient_viewcond_adjust_textctrl.GetValue() if v: if v < 0.000001 or v > sys.maxint: wx.Bell() self.ambient_viewcond_adjust_textctrl.SetValue( getcfg("calibration.ambient_viewcond_adjust.lux")) if event.GetId() == self.ambient_viewcond_adjust_cb.GetId(): self.ambient_viewcond_adjust_textctrl.SetFocus() else: self.ambient_viewcond_adjust_textctrl.Disable() v1 = int(self.ambient_viewcond_adjust_cb.GetValue()) v2 = self.ambient_viewcond_adjust_textctrl.GetValue() if v1 != getcfg("calibration.ambient_viewcond_adjust") or \ v2 != getcfg("calibration.ambient_viewcond_adjust.lux", False): self.cal_changed() setcfg("calibration.ambient_viewcond_adjust", v1) setcfg("calibration.ambient_viewcond_adjust.lux", v2) self.update_profile_name() if event.GetEventType() == wx.EVT_KILL_FOCUS.evtType[0]: event.Skip() def ambient_viewcond_adjust_info_handler(self, event): InfoDialog(self, msg=lang.getstr("calibration.ambient_viewcond_adjust.info"), ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-information"), log=False) def black_luminance_ctrl_handler(self, event): if event.GetId() == self.black_luminance_textctrl.GetId() and ( self.black_luminance_ctrl.GetSelection() != 1 or getcfg("calibration.black_luminance") == self.black_luminance_textctrl.GetValue() or not self.black_luminance_ctrl.IsShown()): event.Skip() return if debug: safe_print("[D] black_luminance_ctrl_handler called for ID %s %s " "event type %s %s" % (event.GetId(), getevtobjname(event, self), event.GetEventType(), getevttype(event))) self.calpanel.Freeze() if self.black_luminance_ctrl.GetSelection() == 1: # cd/m2 self.black_luminance_textctrl.Show() self.black_luminance_textctrl_label.Show() try: v = self.black_luminance_textctrl.GetValue() if v < 0.000001 or v > 100000: raise ValueError() except ValueError: wx.Bell() self.black_luminance_textctrl.SetValue( getcfg("calibration.black_luminance")) if (event.GetId() == self.black_luminance_ctrl.GetId() and self.black_luminance_ctrl.GetSelection() == 1): self.black_luminance_textctrl.SetFocus() else: self.black_luminance_textctrl.Hide() self.black_luminance_textctrl_label.Hide() self.calpanel.Layout() self.calpanel.Refresh() self.calpanel.Thaw() v = self.get_black_luminance() if v != str(getcfg("calibration.black_luminance", False)): self.cal_changed() setcfg("calibration.black_luminance", v) self.update_profile_name() if event.GetEventType() == wx.EVT_KILL_FOCUS.evtType[0]: event.Skip() def luminance_ctrl_handler(self, event): if event.GetId() == self.luminance_textctrl.GetId() and ( self.luminance_ctrl.GetSelection() != 1 or getcfg("calibration.luminance") == self.luminance_textctrl.GetValue()): event.Skip() return if debug: safe_print("[D] luminance_ctrl_handler called for ID %s %s event " "type %s %s" % (event.GetId(), getevtobjname(event, self), event.GetEventType(), getevttype(event))) self.calpanel.Freeze() if self.luminance_ctrl.GetSelection() == 1: # cd/m2 self.luminance_textctrl.Show() self.luminance_textctrl_label.Show() try: v = self.luminance_textctrl.GetValue() if v < 0.000001 or v > 100000: raise ValueError() except ValueError: wx.Bell() self.luminance_textctrl.SetValue( getcfg("calibration.luminance")) if (event.GetId() == self.luminance_ctrl.GetId() and self.luminance_ctrl.GetSelection() == 1): self.luminance_textctrl.SetFocus() else: self.luminance_textctrl.Hide() self.luminance_textctrl_label.Hide() self.calpanel.Layout() self.calpanel.Refresh() self.calpanel.Thaw() v = self.get_luminance() if v != str(getcfg("calibration.luminance", False)): self.cal_changed() setcfg("calibration.luminance", v) self.update_profile_name() if event.GetEventType() == wx.EVT_KILL_FOCUS.evtType[0]: event.Skip() def whitepoint_colortemp_locus_ctrl_handler(self, event): if debug: safe_print("[D] whitepoint_colortemp_locus_ctrl_handler called for " "ID %s %s event type %s %s" % (event.GetId(), getevtobjname(event, self), event.GetEventType(), getevttype(event))) v = self.get_whitepoint_locus() if v != getcfg("whitepoint.colortemp.locus"): setcfg("whitepoint.colortemp.locus", v) self.whitepoint_ctrl_handler( CustomEvent(wx.EVT_CHOICE.evtType[0], self.whitepoint_ctrl), False) self.cal_changed() self.update_profile_name() def whitepoint_ctrl_handler(self, event, cal_changed=True): if event.GetId() == self.whitepoint_colortemp_textctrl.GetId() and ( self.whitepoint_ctrl.GetSelection() != 1 or str(int(getcfg("whitepoint.colortemp"))) == self.whitepoint_colortemp_textctrl.GetValue()): event.Skip() return if event.GetId() == self.whitepoint_x_textctrl.GetId() and ( self.whitepoint_ctrl.GetSelection() != 2 or getcfg("whitepoint.x") == self.whitepoint_x_textctrl.GetValue()): event.Skip() return if event.GetId() == self.whitepoint_y_textctrl.GetId() and ( self.whitepoint_ctrl.GetSelection() != 2 or getcfg("whitepoint.y") == self.whitepoint_y_textctrl.GetValue()): event.Skip() return if debug: safe_print("[D] whitepoint_ctrl_handler called for ID %s %s event " "type %s %s" % (event.GetId(), getevtobjname(event, self), event.GetEventType(), getevttype(event))) self.calpanel.Freeze() show_advanced_options = bool(getcfg("show_advanced_options")) if self.whitepoint_ctrl.GetSelection() == 2: # x,y chromaticity coordinates self.whitepoint_colortemp_locus_label.Hide() self.whitepoint_colortemp_locus_ctrl.Hide() self.whitepoint_colortemp_textctrl.Hide() self.whitepoint_colortemp_label.Hide() self.whitepoint_x_textctrl.Show() self.whitepoint_x_label.Show() self.whitepoint_y_textctrl.Show() self.whitepoint_y_label.Show() try: v = self.whitepoint_x_textctrl.GetValue() if v < 0 or v > 1: raise ValueError() except ValueError: wx.Bell() self.whitepoint_x_textctrl.SetValue(getcfg("whitepoint.x")) try: v = self.whitepoint_y_textctrl.GetValue() if v < 0 or v > 1: raise ValueError() except ValueError: wx.Bell() self.whitepoint_y_textctrl.SetValue(getcfg("whitepoint.y")) x = self.whitepoint_x_textctrl.GetValue() y = self.whitepoint_y_textctrl.GetValue() k = xyY2CCT(x, y, 1.0) if k: self.whitepoint_colortemp_textctrl.SetValue( str(stripzeros(math.ceil(k)))) else: self.whitepoint_colortemp_textctrl.SetValue("") if cal_changed: if not getcfg("whitepoint.colortemp") and \ x == getcfg("whitepoint.x") and \ y == getcfg("whitepoint.y"): cal_changed = False setcfg("whitepoint.colortemp", None) setcfg("whitepoint.x", x) setcfg("whitepoint.y", y) if (event.GetId() == self.whitepoint_ctrl.GetId() and self.whitepoint_ctrl.GetSelection() == 2 and not self.updatingctrls): self.whitepoint_x_textctrl.SetFocus() elif self.whitepoint_ctrl.GetSelection() == 1: self.whitepoint_colortemp_locus_label.Show(show_advanced_options) self.whitepoint_colortemp_locus_ctrl.Show(show_advanced_options) self.whitepoint_colortemp_textctrl.Show() self.whitepoint_colortemp_label.Show() self.whitepoint_x_textctrl.Hide() self.whitepoint_x_label.Hide() self.whitepoint_y_textctrl.Hide() self.whitepoint_y_label.Hide() try: v = float( self.whitepoint_colortemp_textctrl.GetValue().replace( ",", ".")) if v < 1000 or v > 15000: raise ValueError() self.whitepoint_colortemp_textctrl.SetValue(str(stripzeros(v))) except ValueError: wx.Bell() self.whitepoint_colortemp_textctrl.SetValue( str(stripzeros(getcfg("whitepoint.colortemp")))) if cal_changed: v = float(self.whitepoint_colortemp_textctrl.GetValue()) if getcfg("whitepoint.colortemp") == v and not \ getcfg("whitepoint.x") and not getcfg("whitepoint.y"): cal_changed = False setcfg("whitepoint.colortemp", int(v)) setcfg("whitepoint.x", None) setcfg("whitepoint.y", None) if (event.GetId() == self.whitepoint_ctrl.GetId() and self.whitepoint_ctrl.GetSelection() == 1 and not self.updatingctrls): self.whitepoint_colortemp_textctrl.SetFocus() self.whitepoint_colortemp_textctrl.SelectAll() else: self.whitepoint_colortemp_locus_label.Show(show_advanced_options) self.whitepoint_colortemp_locus_ctrl.Show(show_advanced_options) self.whitepoint_colortemp_textctrl.Hide() self.whitepoint_colortemp_label.Hide() self.whitepoint_x_textctrl.Hide() self.whitepoint_x_label.Hide() self.whitepoint_y_textctrl.Hide() self.whitepoint_y_label.Hide() if not getcfg("whitepoint.colortemp") and \ not getcfg("whitepoint.x") and not getcfg("whitepoint.y"): cal_changed = False setcfg("whitepoint.colortemp", None) self.whitepoint_colortemp_textctrl.SetValue( str(stripzeros(getcfg("whitepoint.colortemp")))) setcfg("whitepoint.x", None) setcfg("whitepoint.y", None) self.whitepoint_measure_btn.Show(self.whitepoint_ctrl.GetSelection() > 0) self.calpanel.Layout() self.calpanel.Refresh() self.calpanel.Thaw() self.show_observer_ctrl() if self.whitepoint_ctrl.GetSelection() != 2: if getcfg("whitepoint.colortemp.locus") == "T": # Planckian locus xyY = planckianCT2xyY(getcfg("whitepoint.colortemp")) else: # Daylight locus xyY = CIEDCCT2xyY(getcfg("whitepoint.colortemp")) if xyY: self.whitepoint_x_textctrl.SetValue(round(xyY[0], 4)) self.whitepoint_y_textctrl.SetValue(round(xyY[1], 6)) else: self.whitepoint_x_textctrl.SetValue(0) self.whitepoint_y_textctrl.SetValue(0) if cal_changed and not self.updatingctrls: self.cal_changed() self.update_profile_name() if event.GetEventType() == wx.EVT_KILL_FOCUS.evtType[0]: event.Skip() def trc_type_ctrl_handler(self, event): if debug: safe_print("[D] trc_type_ctrl_handler called for ID %s %s event " "type %s %s" % (event.GetId(), getevtobjname(event, self), event.GetEventType(), getevttype(event))) v = self.get_trc_type() if v != getcfg("trc.type"): setcfg("trc.type", v) self.cal_changed() self.update_profile_name() self.update_trc_control() self.show_trc_controls(True) def trc_ctrl_handler(self, event, cal_changed=True): if event.GetId() == self.trc_textctrl.GetId() and ( self.trc_ctrl.GetSelection() not in (1, 4, 7) or stripzeros(getcfg("trc")) == stripzeros(self.trc_textctrl.GetValue())): event.Skip() self.show_trc_controls(True) return if debug: safe_print("[D] trc_ctrl_handler called for ID %s %s event type %s " "%s" % (event.GetId(), getevtobjname(event, self), event.GetEventType(), getevttype(event))) self.panel.Freeze() unload_cal = True if event.GetId() == self.trc_ctrl.GetId(): bt1886 = (getcfg("trc.type") == "G" and getcfg("calibration.black_output_offset") == 0 and getcfg("trc") == 2.4) if self.trc_ctrl.GetSelection() == 1: # Gamma 2.2 self.trc_textctrl.SetValue("2.2") setcfg("trc.type", "g") self.trc_type_ctrl.SetSelection(0) setcfg("calibration.black_output_offset", 1) self.black_output_offset_ctrl.SetValue(100) self.black_output_offset_intctrl.SetValue(100) elif self.trc_ctrl.GetSelection() == 4: # BT.1886 if not bt1886 and not getcfg("trc.backup", False): setcfg("trc.backup", self.trc_textctrl.GetValue().replace(",", ".")) setcfg("trc.type.backup", getcfg("trc.type")) setcfg("calibration.black_output_offset.backup", getcfg("calibration.black_output_offset")) self.trc_textctrl.SetValue("2.4") setcfg("trc.type", "G") self.trc_type_ctrl.SetSelection(1) setcfg("calibration.black_output_offset", 0) self.black_output_offset_ctrl.SetValue(0) self.black_output_offset_intctrl.SetValue(0) elif self.trc_ctrl.GetSelection() not in (0, 1, 7): self.restore_trc_backup() if getcfg("calibration.black_output_offset.backup") is not None: setcfg("calibration.black_output_offset", getcfg("calibration.black_output_offset.backup")) setcfg("calibration.black_output_offset.backup", None) self.update_black_output_offset_ctrl() elif self.trc_ctrl.GetSelection() == 0: # As measured unload_cal = False if self.trc_ctrl.GetSelection() in (1, 4, 7): try: v = float(self.trc_textctrl.GetValue().replace(",", ".")) if v == 0 or v > 10: raise ValueError() except ValueError: wx.Bell() self.trc_textctrl.SetValue(str(getcfg("trc"))) else: if str(v) != self.trc_textctrl.GetValue(): self.trc_textctrl.SetValue(str(v)) if event.GetId() == self.trc_ctrl.GetId(): # Have to use CallAfter, otherwise only part of the text will # be selected (wxPython bug?) wx.CallAfter(self.trc_textctrl.SetFocus) wx.CallLater(1, self.trc_textctrl.SelectAll) trc = self.get_trc() if cal_changed: if trc != str(getcfg("trc")): if unload_cal: self.cal_changed() else: self.worker.options_dispcal = [] self.profile_settings_changed() setcfg("trc", trc) if cal_changed: self.update_profile_name() if event.GetId() != self.trc_ctrl.GetId(): self.update_trc_control() else: self.lut3d_update_apply_cal_control() self.update_adjustment_controls() self.show_trc_controls() self.calpanel.Layout() self.calpanel.Refresh() self.panel.Thaw() self.set_size(True) self.update_scrollbars() self.update_main_controls() if event.GetEventType() == wx.EVT_KILL_FOCUS.evtType[0]: event.Skip() if (trc in ("240", "709", "s") and not (bool(int(getcfg("calibration.ambient_viewcond_adjust"))) and getcfg("calibration.ambient_viewcond_adjust.lux")) and getcfg("trc.should_use_viewcond_adjust.show_msg") and getcfg("show_advanced_options")): dlg = InfoDialog(self, msg=lang.getstr("trc.should_use_viewcond_adjust"), ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-information"), show=False, log=False) chk = wx.CheckBox(dlg, -1, lang.getstr("dialog.do_not_show_again")) dlg.Bind(wx.EVT_CHECKBOX, self.should_use_viewcond_adjust_handler, id=chk.GetId()) dlg.sizer3.Add(chk, flag=wx.TOP | wx.ALIGN_LEFT, border=12) dlg.sizer0.SetSizeHints(dlg) dlg.sizer0.Layout() dlg.ShowModalThenDestroy() def restore_trc_backup(self): if getcfg("trc.backup"): setcfg("trc", getcfg("trc.backup")) setcfg("trc.backup", None) self.trc_textctrl.SetValue(str(getcfg("trc"))) if getcfg("trc.type.backup"): setcfg("trc.type", getcfg("trc.type.backup")) setcfg("trc.type.backup", None) self.trc_type_ctrl.SetSelection( self.trc_types_ba.get(getcfg("trc.type"), self.trc_types_ba.get(defaults["trc.type"]))) def should_use_viewcond_adjust_handler(self, event): setcfg("trc.should_use_viewcond_adjust.show_msg", int(not event.GetEventObject().GetValue())) def check_overwrite(self, ext="", filename=None): if not filename: filename = getcfg("profile.name.expanded") + ext dst_file = os.path.join(getcfg("profile.save_path"), getcfg("profile.name.expanded"), filename) else: dst_file = os.path.join(getcfg("profile.save_path"), filename) if os.path.exists(dst_file): dlg = ConfirmDialog(self, msg=lang.getstr("warning.already_exists", filename), ok=lang.getstr("ok"), cancel=lang.getstr("cancel"), bitmap=geticon(32, "dialog-warning")) result = dlg.ShowModal() dlg.Destroy() if result != wx.ID_OK: return False return True def measure_uniformity_handler(self, event): """ Start measuring display device uniformity """ dlg = ConfirmDialog(self, msg=lang.getstr("patch.layout.select"), ok=lang.getstr("ok"), cancel=lang.getstr("cancel"), bitmap=geticon(32, "dialog-information")) sizer = wx.BoxSizer(wx.HORIZONTAL) dlg.sizer3.Add(sizer, flag=wx.TOP, border=12) cols = wx.Choice(dlg, -1, choices=map(str, config.valid_values["uniformity.cols"])) rows = wx.Choice(dlg, -1, choices=map(str, config.valid_values["uniformity.rows"])) cols.SetStringSelection(str(getcfg("uniformity.cols"))) rows.SetStringSelection(str(getcfg("uniformity.rows"))) sizer.Add(cols, flag=wx.ALIGN_CENTER_VERTICAL) sizer.Add(wx.StaticText(dlg, -1, "x"), flag=wx.LEFT | wx.RIGHT | wx.ALIGN_CENTER_VERTICAL, border=4) sizer.Add(rows, flag=wx.ALIGN_CENTER_VERTICAL) dlg.sizer0.SetSizeHints(dlg) dlg.sizer0.Layout() dlg.ok.SetDefault() result = dlg.ShowModal() if result == wx.ID_OK: setcfg("uniformity.cols", int(cols.GetStringSelection())) setcfg("uniformity.rows", int(rows.GetStringSelection())) dlg.Destroy() if result != wx.ID_OK: return if isinstance(getattr(self.worker, "terminal", None), DisplayUniformityFrame): self.worker.terminal.Destroy() self.worker.terminal = None self.HideAll() self.worker.interactive = True self.worker.start(self.measure_uniformity_consumer, self.measure_uniformity_producer, resume=False, continue_next=False, interactive_frame="uniformity") def measure_uniformity_producer(self): cmd, args = get_argyll_util("spotread"), ["-v", "-e", "-T"] if cmd: result = self.worker.add_measurement_features(args, display=False) if isinstance(result, Exception): return result return self.worker.exec_cmd(cmd, args, skip_scripts=True) else: wx.CallAfter(show_result_dialog, Error(lang.getstr("argyll.util.not_found", "spotread")), self) def measure_uniformity_consumer(self, result): self.Show() if isinstance(result, Exception): show_result_dialog(result, self) if getcfg("dry_run"): return for i, line in enumerate(self.worker.output): if line.startswith("spotread: Warning"): show_result_dialog(Warn(line.strip()), self) def profile_share_get_meta_error(self, profile): """ Check for required metadata in profile to allow sharing. The treshold for average delta E 1976 is 1.0 """ if ("meta" in profile.tags and isinstance(profile.tags.meta, ICCP.DictType)): try: avg_dE76 = float(profile.tags.meta.getvalue("ACCURACY_dE76_avg")) except (TypeError, ValueError): return lang.getstr("profile.share.meta_missing") else: threshold = 1.0 if avg_dE76 and avg_dE76 > threshold: return lang.getstr("profile.share.avg_dE_too_high", ("%.2f" % avg_dE76, "%.2f" % threshold)) else: # Check for EDID metadata metadata = profile.tags.meta if "EDID_mnft" in metadata: # Check and correct manufacturer if necessary manufacturer = get_manufacturer_name(metadata["EDID_mnft"]) if manufacturer: manufacturer = colord.quirk_manufacturer(manufacturer) if (not "EDID_manufacturer" in metadata or metadata["EDID_manufacturer"] != manufacturer): metadata["EDID_manufacturer"] = manufacturer if (not "EDID_model_id" in metadata or (not "EDID_model" in metadata and metadata["EDID_model_id"] == "0") or not "EDID_mnft_id" in metadata or not "EDID_mnft" in metadata or not "EDID_manufacturer" in metadata or not "OPENICC_automatic_generated" in metadata): return lang.getstr("profile.share.meta_missing") if ("B2A0" in profile.tags and isinstance(profile.tags.B2A0, ICCP.LUT16Type) and profile.tags.B2A0.input_entries_count < 1024): # 1024 is the Argyll value for a medium quality profile return lang.getstr("profile.share.b2a_resolution_too_low") else: return lang.getstr("profile.share.meta_missing") def profile_share_handler(self, event): """ Share ICC profile via http://icc.opensuse.org """ # Select profile profile = get_current_profile(include_display_profile=True) ignore = not profile or self.profile_share_get_meta_error(profile) kwargs = {"ignore_current_profile": ignore, "prefer_current_profile": isinstance(event.EventObject, wx.Button), "title": lang.getstr("profile.share")} profile = self.select_profile(**kwargs) if not profile: return # Check meta and profcheck data error = self.profile_share_get_meta_error(profile) if error: InfoDialog(getattr(self, "modaldlg", self), msg=error, ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error")) return # Get options from profile options_dispcal, options_colprof = get_options_from_profile(profile) gamma = None for option in options_dispcal: if option.startswith("g") or option.startswith("G"): option = option[1:] gamma = {"240": "SMPTE 240M", "709": "Rec. 709", "l": "L*", "s": "sRGB"}.get(option, "Gamma %s" % option) metadata = profile.tags.meta # Model will be shown in overview on http://icc.opensuse.org model = metadata.getvalue("EDID_model", profile.getDeviceModelDescription() or metadata["EDID_model_id"], None) description = model date = metadata.getvalue("EDID_date", "", None).split("-T") if len(date) == 2: year = int(date[0]) week = int(date[1]) date = datetime.date(int(year), 1, 1) + datetime.timedelta(weeks=week) description += " '" + strftime("%y", date.timetuple()) if isinstance(profile.tags.get("vcgt"), ICCP.VideoCardGammaType): if profile.tags.vcgt.is_linear(): vcgt = "linear VCGT" else: vcgt = "VCGT" else: vcgt = "no VCGT" if vcgt: description += ", " + vcgt whitepoint = "%iK" % round(XYZ2CCT(*profile.tags.wtpt.values())) description += ", " + whitepoint description += u", %i cd/m²" % profile.tags.lumi.Y if gamma: description += ", " + gamma instrument = metadata.getvalue("MEASUREMENT_device") if instrument: for instrument_name in instruments: if instrument_name.lower() == instrument: instrument = instrument_name break description += ", " + instrument description += ", " + strftime("%Y-%m-%d", profile.dateTime.timetuple()) dlg = ConfirmDialog( getattr(self, "modaldlg", self), title=lang.getstr("profile.share"), msg=lang.getstr("profile.share.enter_info"), ok=lang.getstr("upload"), cancel=lang.getstr("cancel"), bitmap=geticon(32, appname + "-profile-info"), alt=lang.getstr("save"), wrap=100) # Description field boxsizer = wx.StaticBoxSizer(wx.StaticBox(dlg, -1, lang.getstr("description")), wx.VERTICAL) dlg.sizer3.Add(boxsizer, 1, flag=wx.TOP | wx.EXPAND, border=12) if sys.platform not in ("darwin", "win32"): boxsizer.Add((1, 8)) dlg.description_txt_ctrl = wx.TextCtrl(dlg, -1, description) boxsizer.Add(dlg.description_txt_ctrl, 1, flag=wx.ALL | wx.EXPAND, border=4) # Display properties boxsizer = wx.StaticBoxSizer(wx.StaticBox(dlg, -1, lang.getstr("display.properties")), wx.VERTICAL) dlg.sizer3.Add(boxsizer, 1, flag=wx.TOP | wx.EXPAND, border=12) if sys.platform not in ("darwin", "win32"): boxsizer.Add((1, 8)) box_gridsizer = wx.FlexGridSizer(0, 1, 0, 0) boxsizer.Add(box_gridsizer, 1, flag=wx.ALL, border=4) # Display panel surface type, connection gridsizer = wx.FlexGridSizer(0, 4, 4, 8) box_gridsizer.Add(gridsizer, 1, wx.ALIGN_LEFT) # Panel surface type gridsizer.Add(wx.StaticText(dlg, -1, lang.getstr("panel.surface")), 1, flag=wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL) paneltypes = ["glossy", "matte"] dlg.panel_ctrl = wx.Choice(dlg, -1, choices=[""] + [lang.getstr(panel) for panel in paneltypes]) panel_surface = metadata.getvalue("SCREEN_surface", "") try: index = dlg.panel_ctrl.GetItems().index(lang.getstr(panel_surface)) except ValueError: index = 0 dlg.panel_ctrl.SetSelection(index) gridsizer.Add(dlg.panel_ctrl, 1, flag=wx.RIGHT | wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL, border=8) # Connection type gridsizer.Add(wx.StaticText(dlg, -1, lang.getstr("display.connection.type")), 1, flag=wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL) connections = ["dvi", "displayport", "hdmi", "internal", "vga"] dlg.connection_ctrl = wx.Choice(dlg, -1, choices=[lang.getstr(contype) for contype in connections]) connection_type = metadata.getvalue("CONNECTION_type", "dvi") try: index = dlg.connection_ctrl.GetItems().index(lang.getstr(connection_type)) except ValueError: index = 0 dlg.connection_ctrl.SetSelection(index) gridsizer.Add(dlg.connection_ctrl, 1, flag=wx.RIGHT | wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL, border=8) if sys.platform == "darwin": display_settings_tabs = wx.Notebook(dlg, -1) else: display_settings_tabs = aui.AuiNotebook(dlg, -1, style=aui.AUI_NB_TOP) display_settings_tabs._agwFlags = aui.AUI_NB_TOP try: art = AuiBetterTabArt() if sys.platform == "win32": art.SetDefaultColours(aui.StepColour(dlg.BackgroundColour, 96)) display_settings_tabs.SetArtProvider(art) except Exception, exception: safe_print(exception) pass dlg.display_settings = display_settings_tabs # Column layout scale = getcfg("app.dpi") / config.get_default_dpi() if scale < 1: scale = 1 display_settings = ((# 1st tab lang.getstr("osd") + ": " + lang.getstr("settings.basic"), # Tab title 2, # Number of columns (# 1st (left) column (("preset", 150), ("brightness", 50), ("contrast", 50), ("trc.gamma", 50), ("blacklevel", 50), ("hue", 50)), # 2nd (right) column (("", 0), ("whitepoint.colortemp", 125), ("whitepoint", 50), ("saturation", 50)))), (# 2nd tab lang.getstr("osd") + ": " + lang.getstr("settings.additional"), # Tab title 3, # Number of columns (# 1st (left) column (("hue", 50), ), # 2nd (middle) column (("offset", 50), ), # 3rd (right) column (("saturation", 50), )))) display_settings_ctrls = [] for tab_num, settings in enumerate(display_settings): panel = wx.Panel(display_settings_tabs, -1) panel.SetSizer(wx.BoxSizer(wx.VERTICAL)) gridsizer = wx.FlexGridSizer(0, settings[1] * 2, 4, 12) panel.GetSizer().Add(gridsizer, 1, wx.ALL | wx.EXPAND, border=8) display_settings_tabs.AddPage(panel, settings[0]) ctrls = [] texts = [] for column in settings[2]: for name, width in column: if name in ("whitepoint", ): components = ("red", "green", "blue") elif tab_num == 1 and name in ("hue", "offset", "saturation"): components = ("red", "green", "blue", "cyan", "magenta", "yellow") else: components = ("", ) nameprefix = name for component in components: if component: name = nameprefix + "_" + component if name: label = name if ("_" in label): label = label.split("_") for i, part in enumerate(label): label[i] = lang.getstr(part) label = " ".join(label) else: label = lang.getstr(label) text = wx.StaticText(panel, -1, label) ctrl = wx.TextCtrl(panel, -1, metadata.getvalue("OSD_settings_%s" % re.sub("[ .]", "_", name), ""), size=(width * scale, -1), name=name) else: text = (0, 0) ctrl = (0, 0) texts.append(text) ctrls.append(ctrl) display_settings_ctrls.append(ctrl) # Add the controls to the sizer rows = int(math.ceil(len(ctrls) / float(settings[1]))) for row_num in range(rows): for column_num in range(settings[1]): ctrl_index = row_num + column_num * rows if ctrl_index < len(ctrls): gridsizer.Add(texts[ctrl_index], 1, flag=wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_LEFT) gridsizer.Add(ctrls[ctrl_index], 1, flag=wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_LEFT | wx.RIGHT, border=4) if isinstance(display_settings_tabs, aui.AuiNotebook): if sys.platform != "win32": display_settings_tabs.SetTabCtrlHeight(display_settings_tabs.GetTabCtrlHeight() + 2) height = display_settings_tabs.GetHeightForPageHeight(panel.Sizer.MinSize[1]) else: height = -1 display_settings_tabs.SetMinSize((dlg.sizer3.MinSize[0] - 16, height)) box_gridsizer.Add(display_settings_tabs, 1, flag=wx.TOP | wx.ALIGN_LEFT, border=8) # License field ##dlg.sizer3.Add(wx.StaticText(dlg, -1, lang.getstr("license")), 1, ##flag=wx.TOP | wx.ALIGN_LEFT, border=12) ##dlg.license_ctrl = wx.Choice(dlg, -1, ##choices=["http://www.color.org/registry/icc_license_2011.txt", ##"http://www.gzip.org/zlib/zlib_license.html"]) ##dlg.license_ctrl.SetSelection(0) ##sizer4 = wx.BoxSizer(wx.HORIZONTAL) ##dlg.sizer3.Add(sizer4, 1, ##flag=wx.TOP | wx.ALIGN_LEFT, border=4) ##sizer4.Add(dlg.license_ctrl, 1, ##flag=wx.RIGHT | wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL, ##border=8) # License link button ##dlg.license_link_ctrl = wx.BitmapButton(dlg, -1, ##geticon(16, "dialog-information"), ##style=wx.NO_BORDER) ##dlg.license_link_ctrl.SetToolTipString(lang.getstr("license")) ##dlg.Bind(wx.EVT_BUTTON, ##lambda event: launch_file(dlg.license_ctrl.GetValue()), ##dlg.license_link_ctrl) ##sizer4.Add(dlg.license_link_ctrl, flag=wx.ALIGN_LEFT | ##wx.ALIGN_CENTER_VERTICAL) # Link to ICC Profile Taxi service hyperlink = HyperLinkCtrl(dlg.buttonpanel, -1, label="icc.opensuse.org", URL="http://icc.opensuse.org") dlg.sizer2.Insert(0, hyperlink, flag=wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL | wx.RIGHT, border=dlg.sizer3.MinSize[0] - dlg.sizer2.MinSize[0] - hyperlink.Size[0]) dlg.description_txt_ctrl.SetFocus() dlg.sizer0.SetSizeHints(dlg) dlg.sizer0.Layout() dlg.Center() result = dlg.ShowModal() if result == wx.ID_CANCEL: return # Get meta prefix prefixes = (metadata.getvalue("prefix", "", None) or "CONNECTION_").split(",") if not "CONNECTION_" in prefixes: prefixes.append("CONNECTION_") # Update meta panel = dlg.panel_ctrl.GetSelection() if panel > 0: metadata["SCREEN_surface"] = paneltypes[panel - 1] if not "SCREEN_" in prefixes: prefixes.append("SCREEN_") # Update meta metadata["CONNECTION_type"] = connections[dlg.connection_ctrl.GetSelection()] for ctrl in display_settings_ctrls: if isinstance(ctrl, wx.TextCtrl) and ctrl.GetValue().strip(): metadata["OSD_settings_%s" % re.sub("[ .]", "_", ctrl.Name)] = ctrl.GetValue().strip() if not "OSD_" in prefixes: prefixes.append("OSD_") # Set meta prefix metadata["prefix"] = ",".join(prefixes) # Calculate profile ID profile.calculateID() # Save profile try: profile.write() except EnvironmentError, exception: show_result_dialog(exception, self) if result != wx.ID_OK: return # Get profile data data = profile.data # Add metadata which should not be reflected in profile metadata["model"] = model metadata["vcgt"] = int("vcgt" in profile.tags) # Upload params = {"description": dlg.description_txt_ctrl.GetValue(), ##"licence": dlg.license_ctrl.GetValue()} "licence": "http://www.color.org/registry/icc_license_2011.txt"} files = [("metadata", "metadata.json", '{"org":{"freedesktop":{"openicc":{"device":{"monitor":[%s]}}}}}' % metadata.to_json()), ("profile", "profile.icc", data)] self.worker.interactive = False self.worker.start(self.profile_share_consumer, http_request, ckwargs={}, wkwargs={"domain": domain.lower() if test else "icc.opensuse.org", "request_type": "POST", "path": "/print_r_post.php" if test else "/upload", "params": params, "files": files}, progress_msg=lang.getstr("profile.share"), stop_timers=False, cancelable=False, show_remaining_time=False, fancy=False) def profile_share_consumer(self, result, parent=None): """ This function receives the response from the profile upload """ if result is not False: safe_print(safe_unicode(result.read().strip(), "UTF-8")) parent = parent or getattr(self, "modaldlg", self) dlg = InfoDialog(parent, msg=lang.getstr("profile.share.success"), ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-information"), show=False) # Link to ICC Profile Taxi service hyperlink = HyperLinkCtrl(dlg.buttonpanel, -1, label="icc.opensuse.org", URL="http://icc.opensuse.org") border = (dlg.sizer3.MinSize[0] - dlg.sizer2.MinSize[0] - hyperlink.Size[0]) if border < 24: border = 24 dlg.sizer2.Insert(0, hyperlink, flag=wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL | wx.RIGHT, border=border) dlg.sizer2.Insert(0, (44, 1)) dlg.sizer0.SetSizeHints(dlg) dlg.sizer0.Layout() dlg.ok.SetDefault() dlg.ShowModalThenDestroy(parent) def install_argyll_instrument_conf(self, event=None, uninstall=False): if uninstall: filenames = self.worker.get_argyll_instrument_conf("installed") if filenames: dlgs = [] dlg = ConfirmDialog(self, title=lang.getstr("argyll.instrument.configuration_files.uninstall"), msg=lang.getstr("dialog.confirm_delete"), ok=lang.getstr("delete"), cancel=lang.getstr("cancel"), bitmap=geticon(32, "dialog-warning")) dlgs.append(dlg) dlg.sizer3.Add((0, 8)) chks = [] for filename in filenames: dlg.sizer3.Add((0, 4)) chk = wx.CheckBox(dlg, -1, filename) chks.append(chk) chk.SetValue(os.path.basename(filename) != "69-cd-sensors.rules") dlg.sizer3.Add(chk, flag=wx.ALIGN_LEFT) dlg.sizer0.SetSizeHints(dlg) dlg.sizer0.Layout() dlg.Center() result = dlg.ShowModal() filenames = [] if result == wx.ID_OK: for chk in chks: if chk.GetValue(): filenames.append(chk.Label) for filename in filenames: if os.path.basename(filename) == "69-cd-sensors.rules": dlg = ConfirmDialog(self, title=lang.getstr("argyll.instrument.configuration_files.uninstall"), msg=lang.getstr("warning.system_file", filename), ok=lang.getstr("continue"), cancel=lang.getstr("cancel"), bitmap=geticon(32, "dialog-warning")) dlgs.append(dlg) result = dlg.ShowModal() if result != wx.ID_OK: break for dlg in dlgs: dlg.Destroy() if not filenames or result != wx.ID_OK: return cmd = "rm" else: filenames = None cmd = "cp" result = self.worker.authenticate(which(cmd)) if result not in (True, None): if isinstance(result, Exception): show_result_dialog(result, self) return self.worker.start(self.install_argyll_instrument_conf_consumer, self.worker.install_argyll_instrument_conf, ckwargs={"uninstall": uninstall}, wkwargs={"uninstall": uninstall, "filenames": filenames}, fancy=False) def install_argyll_instrument_conf_consumer(self, result, uninstall=False): if isinstance(result, Exception): show_result_dialog(result, self) elif result is False: show_result_dialog(Error("".join(self.worker.errors)), self) else: self.update_menus() if uninstall: msgid = "argyll.instrument.configuration_files.uninstall.success" else: msgid = "argyll.instrument.configuration_files.install.success" show_result_dialog(Info(lang.getstr(msgid)), self) def install_argyll_instrument_drivers(self, event=None, uninstall=False): if uninstall: title = "argyll.instrument.drivers.uninstall" msg = "argyll.instrument.drivers.uninstall.confirm" else: title = "argyll.instrument.drivers.install" msg = "argyll.instrument.drivers.install.confirm" dlg = ConfirmDialog(self, title=lang.getstr(title), msg=lang.getstr(msg), ok=lang.getstr("ok"), cancel=lang.getstr("cancel"), bitmap=geticon(32, "dialog-information")) dlg.launch_devman = wx.CheckBox(dlg, -1, lang.getstr("device_manager.launch")) dlg.launch_devman.SetValue(uninstall) dlg.sizer3.Add(dlg.launch_devman, flag=wx.TOP | wx.ALIGN_LEFT, border=12) if hasattr(dlg.ok, "SetAuthNeeded"): dlg.ok.SetAuthNeeded(True) dlg.sizer0.SetSizeHints(dlg) dlg.sizer0.Layout() result = dlg.ShowModal() launch_devman = dlg.launch_devman.IsChecked() dlg.Destroy() if result != wx.ID_OK: return if not uninstall and sys.getwindowsversion() >= (6, 2): key = _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE, r"SYSTEM\CurrentControlSet\Control", 0, _winreg.KEY_READ | _winreg.KEY_QUERY_VALUE) try: value = _winreg.QueryValueEx(key, "SystemStartOptions")[0] except WindowsError: value = "" if (not "TESTSIGNING" in value and not "DISABLE_INTEGRITY_CHECKS" in value): dlg = ConfirmDialog(self, title=lang.getstr("argyll.instrument.drivers.install"), msg=lang.getstr("argyll.instrument.drivers.install.restart"), ok=lang.getstr("ok"), cancel=lang.getstr("cancel"), bitmap=geticon(32, "dialog-warning")) result = dlg.ShowModal() dlg.Destroy() if result != wx.ID_OK: return self.worker.exec_cmd(which("shutdown.exe"), ["/r", "/o", "/t", "0"], capture_output=True, skip_scripts=True, working_dir=False) return self.worker.start(lambda result: show_result_dialog(result, self) if isinstance(result, Exception) else 0, self.worker.install_argyll_instrument_drivers, wargs=(uninstall, launch_devman), fancy=False) def uninstall_argyll_instrument_conf(self, event=None): self.install_argyll_instrument_conf(uninstall=True) def uninstall_argyll_instrument_drivers(self, event=None): self.install_argyll_instrument_drivers(uninstall=True) def install_profile_handler(self, event=None, profile_path=None, install_3dlut=None): """ Install a profile. Show an error dialog if the profile is invalid or unsupported (only 'mntr' RGB profiles are allowed) """ if not check_set_argyll_bin(): return if profile_path is None: profile_path = getcfg("calibration.file", False) if profile_path: result = check_file_isfile(profile_path) if isinstance(result, Exception): show_result_dialog(result, self) else: result = False if install_3dlut is None: install_3dlut = self.lut3d_settings_panel.IsShown() if not isinstance(result, Exception) and result: try: profile = ICCP.ICCProfile(profile_path) except (IOError, ICCP.ICCProfileInvalidError), exception: InfoDialog(self, msg=lang.getstr("profile.invalid") + "\n" + profile_path, ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error")) return if profile.profileClass != "mntr" or \ profile.colorSpace != "RGB": InfoDialog(self, msg=lang.getstr("profile.unsupported", (profile.profileClass, profile.colorSpace)) + "\n" + profile_path, ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error")) return setcfg("calibration.file.previous", getcfg("calibration.file", False)) self.profile_finish( True, profile_path=profile_path, skip_scripts=True, allow_show_log=False, install_3dlut=install_3dlut) def select_install_profile_handler(self, event): """ Show a dialog for user to select a profile for installation """ defaultDir, defaultFile = get_verified_path("last_icc_path") dlg = wx.FileDialog(self, lang.getstr("install_display_profile"), defaultDir=defaultDir, defaultFile=defaultFile, wildcard=lang.getstr("filetype.icc") + "|*.icc;*.icm", style=wx.FD_OPEN | wx.FD_FILE_MUST_EXIST) dlg.Center(wx.BOTH) result = dlg.ShowModal() path = dlg.GetPath() dlg.Destroy() if result == wx.ID_OK: setcfg("last_icc_path", path) setcfg("last_cal_or_icc_path", path) self.install_profile_handler(profile_path=path, install_3dlut=False) def load_profile_cal_handler(self, event): """ Show a dialog for user to select a profile to load calibration (vcgt) from. """ if not check_set_argyll_bin(): return defaultDir, defaultFile = get_verified_path("last_cal_or_icc_path") dlg = wx.FileDialog(self, lang.getstr("calibration.load_from_cal_or_profile"), defaultDir=defaultDir, defaultFile=defaultFile, wildcard=lang.getstr("filetype.cal_icc") + "|*.cal;*.icc;*.icm", style=wx.FD_OPEN | wx.FD_FILE_MUST_EXIST) dlg.Center(wx.BOTH) result = dlg.ShowModal() path = dlg.GetPath() dlg.Destroy() if result == wx.ID_OK: if not os.path.exists(path): InfoDialog(self, msg=lang.getstr("file.missing", path), ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error")) return setcfg("last_cal_or_icc_path", path) if verbose >= 1: safe_print(lang.getstr("calibration.loading")) safe_print(path) if os.path.splitext(path)[1].lower() in (".icc", ".icm"): try: profile = ICCP.ICCProfile(path) except (IOError, ICCP.ICCProfileInvalidError), exception: if verbose >= 1: safe_print(lang.getstr("failure")) InfoDialog(self, msg=lang.getstr("profile.invalid") + "\n" + path, ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error")) return setcfg("last_icc_path", path) if self.install_cal(capture_output=True, profile_path=path, skip_scripts=True, silent=not getcfg("dry_run"), title=lang.getstr("calibration.load_from_profile")) is True: self.lut_viewer_load_lut(profile=profile) if verbose >= 1: safe_print(lang.getstr("success")) elif not getcfg("dry_run"): if verbose >= 1: safe_print(lang.getstr("failure")) InfoDialog(self, msg=lang.getstr("calibration.load_error") + "\n" + path, ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error")) else: setcfg("last_cal_path", path) if self.install_cal(capture_output=True, cal=path, skip_scripts=True, silent=not getcfg("dry_run"), title=lang.getstr("calibration.load_from_cal")) is True: self.lut_viewer_load_lut(profile=cal_to_fake_profile(path)) if verbose >= 1: safe_print(lang.getstr("success")) elif not getcfg("dry_run"): if verbose >= 1: safe_print(lang.getstr("failure")) def preview_handler(self, event=None, preview=False): """ Preview profile calibration (vcgt). Toggle between profile curves and previous calibration curves. """ if preview or self.preview.GetValue(): cal = self.cal else: cal = getcfg("calibration.file.previous") if self.cal == cal: cal = False elif not cal: cal = True if cal is False: # linear profile = None else: if cal is True: # display profile profile = get_display_profile() if not profile: cal = False elif cal.lower().endswith(".icc") or \ cal.lower().endswith(".icm"): try: profile = ICCP.ICCProfile(cal) except (IOError, ICCP.ICCProfileInvalidError), exception: show_result_dialog(exception, self) profile = None else: profile = cal_to_fake_profile(cal) if profile: if verbose >= 1: safe_print(lang.getstr("calibration.loading")) if profile.fileName: safe_print(profile.fileName) else: if verbose >= 1: safe_print(lang.getstr("calibration.resetting")) if self.install_cal(capture_output=True, cal=cal, skip_scripts=True, silent=True, title=lang.getstr("calibration.load_from_cal_or_profile")) is True: self.lut_viewer_load_lut(profile=profile) if verbose >= 1: safe_print(lang.getstr("success")) else: if verbose >= 1: safe_print(lang.getstr("failure")) def profile_load_on_login_handler(self, event=None): setcfg("profile.load_on_login", int(self.profile_load_on_login.GetValue())) if sys.platform == "win32" and sys.getwindowsversion() >= (6, 1): self.profile_load_on_login.Enable(is_superuser() or not util_win.calibration_management_isenabled()) self.profile_load_by_os.Enable(is_superuser() and self.profile_load_on_login.GetValue()) if (not self.profile_load_on_login.GetValue() and self.profile_load_by_os.GetValue() and is_superuser()): self.profile_load_by_os.SetValue(False) self.profile_load_by_os_handler() def profile_load_by_os_handler(self, event=None): if is_superuser(): # Enable calibration management under Windows 7 try: util_win.enable_calibration_management(self.profile_load_by_os.GetValue()) except Exception, exception: safe_print("util_win.enable_calibration_management(True): %s" % safe_unicode(exception)) def install_cal(self, capture_output=False, cal=None, profile_path=None, skip_scripts=False, silent=False, title=appname): """ 'Install' (load) a calibration from a calibration file or profile """ if config.is_virtual_display(): return True # Install using dispwin cmd, args = self.worker.prepare_dispwin(cal, profile_path, False) if not isinstance(cmd, Exception): result = self.worker.exec_cmd(cmd, args, capture_output, low_contrast=False, skip_scripts=skip_scripts, silent=silent, title=title) else: result = cmd if not isinstance(result, Exception) and result: if not silent: if cal is False: InfoDialog(self, msg=lang.getstr("calibration.reset_success"), ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-information"), log=False) else: InfoDialog(self, msg=lang.getstr("calibration.load_success"), ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-information"), log=False) elif not silent: if isinstance(result, Exception) and getcfg("dry_run"): show_result_dialog(result, self) return if cal is False: InfoDialog(self, msg=lang.getstr("calibration.reset_error"), ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error"), log=False) else: InfoDialog(self, msg=lang.getstr("calibration.load_error"), ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error"), log=False) return result def update_measurement_report(self, event=None): """ Show file dialog to select a HTML measurement report for updating. Update the selected report and show it afterwards. """ defaultDir, defaultFile = get_verified_path("last_filedialog_path") dlg = wx.FileDialog(self, lang.getstr("measurement_report.update"), defaultDir=defaultDir, defaultFile=defaultFile, wildcard=lang.getstr("filetype.html") + "|*.html;*.htm", style=wx.FD_OPEN | wx.FD_FILE_MUST_EXIST) dlg.Center(wx.BOTH) result = dlg.ShowModal() if result == wx.ID_OK: path = dlg.GetPath() setcfg("last_filedialog_path", path) dlg.Destroy() if result != wx.ID_OK: return try: report.update(path, pack=getcfg("report.pack_js")) except (IOError, OSError), exception: show_result_dialog(exception) else: # show report wx.CallAfter(launch_file, path) def verify_calibration_handler(self, event): if check_set_argyll_bin(): self.setup_measurement(self.verify_calibration) def verify_calibration(self): if self.measure_auto(self.verify_calibration): return safe_print("-" * 80) progress_msg = lang.getstr("calibration.verify") safe_print(progress_msg) self.worker.interactive = False self.worker.start(self.result_consumer, self.worker.verify_calibration, progress_msg=progress_msg, pauseable=True, resume=bool(getattr(self, "measure_auto_after", None))) def select_profile(self, parent=None, title=appname, msg=None, check_profile_class=True, ignore_current_profile=False, prefer_current_profile=False): """ Selects the currently configured profile or display profile. Falls back to user choice via FileDialog if both not set. """ if not parent: parent = self if not msg: msg = lang.getstr("profile.choose") if ignore_current_profile: profile = None else: profile = get_current_profile(include_display_profile=True) if profile and not prefer_current_profile: dlg = ConfirmDialog(self, title=title, msg=msg, ok=lang.getstr("profile.current"), cancel=lang.getstr("cancel"), alt=lang.getstr("browse"), bitmap=geticon(32, appname + "-profile-info")) dlg.ok.SetDefault() result = dlg.ShowModal() if result == wx.ID_CANCEL: return elif result != wx.ID_OK: profile = None if not profile: defaultDir, defaultFile = get_verified_path("last_icc_path") dlg = wx.FileDialog(parent, msg, defaultDir=defaultDir, defaultFile=defaultFile, wildcard=lang.getstr("filetype.icc") + "|*.icc;*.icm", style=wx.FD_OPEN | wx.FD_FILE_MUST_EXIST) dlg.Center(wx.BOTH) result = dlg.ShowModal() if result == wx.ID_OK: path = dlg.GetPath() setcfg("last_icc_path", path) setcfg("last_cal_or_icc_path", path) dlg.Destroy() if result != wx.ID_OK: return try: profile = ICCP.ICCProfile(path) except (IOError, ICCP.ICCProfileInvalidError), exception: InfoDialog(parent, msg=lang.getstr("profile.invalid") + "\n" + path, ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error")) return if check_profile_class and (profile.profileClass != "mntr" or profile.colorSpace != "RGB"): InfoDialog(parent, msg=lang.getstr("profile.unsupported", (profile.profileClass, profile.colorSpace)) + "\n" + path, ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error")) return return profile def measurement_report_create_handler(self, event): """ Assign and initialize the report creation window """ if not getattr(self, "reportframe", None): self.init_reportframe() if self.reportframe.IsShownOnScreen(): self.reportframe.Raise() else: self.reportframe.Show(not self.reportframe.IsShownOnScreen()) def measurement_report_handler(self, event, path=None): if sys.platform == "darwin" or debug: self.focus_handler(event) if not check_set_argyll_bin(): return sim_ti3 = None sim_gray = None # select measurement data (ti1 or ti3) chart = getcfg("measurement_report.chart") try: chart = CGATS.CGATS(chart, True) except (IOError, CGATS.CGATSError), exception: show_result_dialog(exception, getattr(self, "reportframe", self)) return fields = getcfg("measurement_report.chart.fields") # profile(s) paths = [] use_sim = getcfg("measurement_report.use_simulation_profile") use_sim_as_output = getcfg("measurement_report.use_simulation_profile_as_output") use_devlink = getcfg("measurement_report.use_devlink_profile") ##if not use_sim or not use_sim_as_output: ##paths.append(getcfg("measurement_report.output_profile")) if use_sim: if use_sim_as_output and use_devlink: paths.append(getcfg("measurement_report.devlink_profile")) paths.append(getcfg("measurement_report.simulation_profile")) sim_profile = None devlink = None oprof = profile = get_current_profile(True) for i, profilepath in enumerate(paths): try: profile = ICCP.ICCProfile(profilepath) except (IOError, ICCP.ICCProfileInvalidError), exception: InfoDialog(getattr(self, "reportframe", self), msg=lang.getstr("profile.invalid") + "\n" + profilepath, ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error")) return if i in (0, 1) and use_sim: if use_sim_as_output and profile.colorSpace == "RGB": if i == 0 and use_devlink: devlink = profile else: if profile.colorSpace != "RGB": devlink = None sim_profile = profile profile = oprof if not profile and not oprof: show_result_dialog(Error(lang.getstr("display_profile.not_detected", config.get_display_name(None, True))), getattr(self, "reportframe", self)) return colormanaged = (use_sim and use_sim_as_output and not sim_profile and config.get_display_name(None, True) in ("madVR", "Prisma") and getcfg("3dlut.enable")) if debug: for n, p in {"profile": profile, "devlink": devlink, "sim_profile": sim_profile, "oprof": oprof}.iteritems(): if p: safe_print(n, p.getDescription()) if use_sim: if sim_profile: mprof = sim_profile else: mprof = profile apply_map = (use_sim and mprof.colorSpace == "RGB" and isinstance(mprof.tags.get("rXYZ"), ICCP.XYZType) and isinstance(mprof.tags.get("gXYZ"), ICCP.XYZType) and isinstance(mprof.tags.get("bXYZ"), ICCP.XYZType)) apply_off = (apply_map and getcfg("measurement_report.apply_black_offset")) apply_trc = (apply_map and getcfg("measurement_report.apply_trc")) bt1886 = None if apply_trc or apply_off: # TRC BT.1886-like, gamma with black offset, or just black offset try: odata = self.worker.xicclu(oprof, (0, 0, 0), pcs="x") if len(odata) != 1 or len(odata[0]) != 3: raise ValueError("Blackpoint is invalid: %s" % odata) except Exception, exception: show_result_dialog(exception, getattr(self, "reportframe", self)) return XYZbp = odata[0] if apply_trc: # TRC BT.1886-like gamma = getcfg("measurement_report.trc_gamma") gamma_type = getcfg("measurement_report.trc_gamma_type") outoffset = getcfg("measurement_report.trc_output_offset") if gamma_type == "b": # Get technical gamma needed to achieve effective gamma gamma = colormath.xicc_tech_gamma(gamma, XYZbp[1], outoffset) else: # Just black offset outoffset = 1.0 gamma = 0.0 for channel in "rgb": gamma += mprof.tags[channel + "TRC"].get_gamma() gamma /= 3.0 rXYZ = mprof.tags.rXYZ.values() gXYZ = mprof.tags.gXYZ.values() bXYZ = mprof.tags.bXYZ.values() mtx = colormath.Matrix3x3([[rXYZ[0], gXYZ[0], bXYZ[0]], [rXYZ[1], gXYZ[1], bXYZ[1]], [rXYZ[2], gXYZ[2], bXYZ[2]]]) bt1886 = colormath.BT1886(mtx, XYZbp, outoffset, gamma, apply_trc) if apply_trc: # Make sure the profile has the expected Rec. 709 TRC # for BT.1886 for i, channel in enumerate(("r", "g", "b")): if channel + "TRC" in mprof.tags: mprof.tags[channel + "TRC"].set_trc(-709) if sim_profile: sim_intent = ("a" if getcfg("measurement_report.whitepoint.simulate") else "r") void, sim_ti3, sim_gray = self.worker.chart_lookup(chart, sim_profile, check_missing_fields=True, intent=sim_intent, bt1886=bt1886) # NOTE: we ignore the ti1 and gray patches here # only the ti3 is valuable at this point if not sim_ti3: return intent = ("r" if sim_intent == "r" or getcfg("measurement_report.whitepoint.simulate.relative") else "a") bt1886 = None else: sim_intent = None intent = "r" if fields in ("LAB", "XYZ"): if getcfg("measurement_report.whitepoint.simulate"): sim_intent = "a" if not getcfg("measurement_report.whitepoint.simulate.relative"): intent = "a" else: chart.fix_device_values_scaling() chart.adapt(cat=profile.guess_cat() or "Bradford") # lookup test patches ti1, ti3_ref, gray = self.worker.chart_lookup(sim_ti3 or chart, profile, bool(sim_ti3) or fields in ("LAB", "XYZ"), fields=None if bool(sim_ti3) else fields, intent=intent, bt1886=bt1886) if not ti3_ref: return if not gray and sim_gray: gray = sim_gray if devlink: void, ti1, void = self.worker.chart_lookup(ti1, devlink, check_missing_fields=True, white_patches=1, white_patches_total=False) if not ti1: return # let the user choose a location for the result defaultFile = u"Measurement Report %s — %s — %s" % (version_short, re.sub(r"[\\/:*?\"<>|]+", "_", self.display_ctrl.GetStringSelection().replace(" " + lang.getstr("display.primary"), "")), strftime("%Y-%m-%d %H-%M.html")) if not path: defaultDir = get_verified_path(None, os.path.join(getcfg("profile.save_path"), defaultFile))[0] dlg = wx.FileDialog(getattr(self, "reportframe", self), lang.getstr("save_as"), defaultDir, defaultFile, wildcard=lang.getstr("filetype.html") + "|*.html;*.htm", style=wx.SAVE | wx.FD_OVERWRITE_PROMPT) dlg.Center(wx.BOTH) result = dlg.ShowModal() if result == wx.ID_OK: path = dlg.GetPath() if not waccess(path, os.W_OK): show_result_dialog(Error(lang.getstr("error.access_denied.write", path)), getattr(self, "reportframe", self)) return dlg.Destroy() if result != wx.ID_OK: return save_path = os.path.splitext(path)[0] + ".html" setcfg("last_filedialog_path", save_path) # check if file(s) already exist if os.path.exists(save_path): dlg = ConfirmDialog( getattr(self, "reportframe", self), msg=lang.getstr("dialog.confirm_overwrite", save_path), ok=lang.getstr("overwrite"), cancel=lang.getstr("cancel"), bitmap=geticon(32, "dialog-warning")) result = dlg.ShowModal() dlg.Destroy() if result != wx.ID_OK: return # setup for measurement self.setup_measurement(self.measurement_report, ti1, oprof, profile, sim_profile, intent, sim_intent, devlink, ti3_ref, sim_ti3, save_path, chart, gray, apply_trc, colormanaged, use_sim_as_output) def measurement_report(self, ti1, oprof, profile, sim_profile, intent, sim_intent, devlink, ti3_ref, sim_ti3, save_path, chart, gray, apply_trc, colormanaged, use_sim_as_output): safe_print("-" * 80) progress_msg = lang.getstr("measurement_report") safe_print(progress_msg) # setup temp dir temp = self.worker.create_tempdir() if isinstance(temp, Exception): show_result_dialog(temp, getattr(self, "reportframe", self)) return # filenames name, ext = os.path.splitext(os.path.basename(save_path)) ti1_path = os.path.join(temp, name + ".ti1") profile_path = os.path.join(temp, name + ".icc") # write ti1 to temp dir try: ti1_file = open(ti1_path, "w") except EnvironmentError, exception: InfoDialog(getattr(self, "reportframe", self), msg=lang.getstr("error.file.create", ti1_path), ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error")) self.worker.wrapup(False) return ti1_file.write(str(ti1)) ti1_file.close() # write profile to temp dir profile.write(profile_path) # Check if we need to apply calibration if (not use_sim_as_output or (devlink and not "-a" in parse_argument_string( devlink.tags.get("meta", {}).get("collink.args", {}).get("value", "-a" if getcfg("3dlut.output.profile.apply_cal") else "")))): calprof = oprof else: calprof = profile if isinstance(calprof.tags.get("vcgt"), ICCP.VideoCardGammaType): # Extract calibration from profile try: cgats = vcgt_to_cal(calprof) except (IOError, CGATS.CGATSInvalidError, CGATS.CGATSInvalidOperationError, CGATS.CGATSKeyError, CGATS.CGATSTypeError, CGATS.CGATSValueError), exception: wx.CallAfter(show_result_dialog, Error(lang.getstr("cal_extraction_failed")), getattr(self, "reportframe", self)) self.Show() return cal_path = os.path.join(temp, name + ".cal") cgats.write(cal_path) else: # Use linear calibration cal_path = get_data_path("linear.cal") # start readings self.worker.dispread_after_dispcal = False self.worker.interactive = config.get_display_name() == "Untethered" self.worker.start(self.measurement_report_consumer, self.worker.measure_ti1, cargs=(os.path.splitext(ti1_path)[0] + ".ti3", profile, sim_profile, intent, sim_intent, devlink, ti3_ref, sim_ti3, save_path, chart, gray, apply_trc), wargs=(ti1_path, cal_path, colormanaged), progress_msg=progress_msg, pauseable=True) def measurement_report_consumer(self, result, ti3_path, profile, sim_profile, intent, sim_intent, devlink, ti3_ref, sim_ti3, save_path, chart, gray, apply_trc): self.Show() if not isinstance(result, Exception) and result: # get item 0 of the ti3 to strip the CAL part from the measured data try: ti3_measured = CGATS.CGATS(ti3_path)[0] except (IOError, CGATS.CGATSInvalidError, CGATS.CGATSInvalidOperationError, CGATS.CGATSKeyError, CGATS.CGATSTypeError, CGATS.CGATSValueError), exc: result = exc else: safe_print(lang.getstr("success")) result = self.measurement_file_check_confirm(ti3_measured) # cleanup self.worker.wrapup(False if not isinstance(result, Exception) else result) if isinstance(result, Exception) or not result: if isinstance(result, Exception): wx.CallAfter(show_result_dialog, result, getattr(self, "reportframe", self)) return # Account for additional white patches white_rgb = {'RGB_R': 100, 'RGB_G': 100, 'RGB_B': 100} white_ref = ti3_ref.queryi(white_rgb) if devlink: # Remove additional white patch (device white = 100 before # accounting for effect of devicelink) # This is always the first patch ONLY ti3_measured.DATA.remove(0) # The new offset is the difference in length between measured and # ref because the white patch is always added at the start offset = len(ti3_measured.DATA) - len(ti3_ref.DATA) # Set full white RGB to 100 for i in xrange(offset): for label in ("RGB_R", "RGB_G", "RGB_B"): ti3_measured.DATA[i][label] = 100.0 # Restore original device values for i in ti3_ref.DATA: for label in ("RGB_R", "RGB_G", "RGB_B"): ti3_measured.DATA[i + offset][label] = ti3_ref.DATA[i][label] # White patches (device white = 100 after accounting for effect of # devicelink) white_measured = ti3_measured.queryi(white_rgb) # Update white cd/m2 luminance = float(ti3_measured.LUMINANCE_XYZ_CDM2.split()[1]) white_XYZ_cdm2 = [0, 0, 0] for i, label in enumerate(("XYZ_X", "XYZ_Y", "XYZ_Z")): white_XYZ_cdm2[i] = white_measured[0][label] * luminance / 100.0 ti3_measured.LUMINANCE_XYZ_CDM2 = "%.6f %.6f %.6f" % tuple(white_XYZ_cdm2) # Scale to actual white Y after accounting for effect of devicelink scale = 100.0 / white_measured[0]["XYZ_Y"] for i in ti3_measured.DATA: for label in ("XYZ_X", "XYZ_Y", "XYZ_Z"): ti3_measured.DATA[i][label] *= scale else: white_measured = ti3_measured.queryi(white_rgb) offset = max(len(white_measured) - len(white_ref), 0) # If patches were removed from the measured TI3, we need to remove them # from reference and simulation TI3 if isinstance(result, tuple): ref_removed = [] sim_removed = [] for item in reversed(result[0]): key = item.key - offset ref_removed.insert(0, ti3_ref.DATA.pop(key)) if sim_ti3: sim_removed.insert(0, sim_ti3.DATA.pop(key)) for item in ref_removed: safe_print("Removed patch #%i from reference TI3: %s" % (item.key, item)) for item in sim_removed: safe_print("Removed patch #%i from simulation TI3: %s" % (item.key, item)) # Update offset white_ref = ti3_ref.queryi(white_rgb) offset = max(len(white_measured) - len(white_ref), 0) # Determine if we should use planckian locus for assumed target wp # Detection will only work for profiles created by DisplayCAL planckian = False if (profile.tags.get("CIED", "") or profile.tags.get("targ", ""))[0:4] == "CTI3": options_dispcal = get_options_from_profile(profile)[0] for option in options_dispcal: if option.startswith("T"): planckian = True break # calculate amount of calibration grayscale tone values cal_entrycount = 256 if isinstance(profile.tags.get("vcgt"), ICCP.VideoCardGammaType): rgb = [[], [], []] vcgt = profile.tags.vcgt if "data" in vcgt: # table cal_entrycount = vcgt['entryCount'] for i in range(0, cal_entrycount): for j in range(0, 3): rgb[j].append(float(vcgt['data'][j][i]) / (math.pow(256, vcgt['entrySize']) - 1) * 255) else: # formula step = 100.0 / 255.0 for i in range(0, cal_entrycount): # float2dec(v) fixes miniscule deviations in the calculated gamma for j, name in enumerate(("red", "green", "blue")): vmin = float2dec(vcgt[name + "Min"] * 255) v = float2dec(math.pow(step * i / 100.0, vcgt[name + "Gamma"])) vmax = float2dec(vcgt[name + "Max"] * 255) rgb[j].append(float2dec(vmin + v * (vmax - vmin), 8)) cal_rgblevels = [len(set(round(n) for n in channel)) for channel in rgb] else: # Assume linear with all steps cal_rgblevels = [256, 256, 256] if not chart.filename.lower().endswith(".ti1") or sim_ti3: # make the device values match for i in ti3_ref.DATA: for color in ("RGB_R", "RGB_G", "RGB_B"): if sim_ti3 and sim_ti3.DATA[i].get(color) is not None: ti3_ref.DATA[i][color] = sim_ti3.DATA[i][color] else: ti3_ref.DATA[i][color] = ti3_measured.DATA[i + offset][color] cat = "Bradford" # create a 'joined' ti3 from ref ti3, with XYZ values from measured ti3 # this makes sure CMYK data in the original ref will be present in # the newly joined ti3 ti3_joined = CGATS.CGATS(str(ti3_ref))[0] ti3_joined.LUMINANCE_XYZ_CDM2 = ti3_measured.LUMINANCE_XYZ_CDM2 # add XYZ to DATA_FORMAT if not yet present labels_xyz = ("XYZ_X", "XYZ_Y", "XYZ_Z") if not "XYZ_X" in ti3_joined.DATA_FORMAT.values() and \ not "XYZ_Y" in ti3_joined.DATA_FORMAT.values() and \ not "XYZ_Z" in ti3_joined.DATA_FORMAT.values(): ti3_joined.DATA_FORMAT.add_data(labels_xyz) # set XYZ in joined ti3 to XYZ of measurements for i in ti3_joined.DATA: for color in labels_xyz: ti3_joined.DATA[i][color] = ti3_measured.DATA[i + offset][color] wtpt_profile_norm = tuple(n * 100 for n in profile.tags.wtpt.values()) if isinstance(profile.tags.get("chad"), ICCP.chromaticAdaptionTag): # undo chromatic adaption of profile whitepoint WX, WY, WZ = profile.tags.chad.inverted() * wtpt_profile_norm wtpt_profile_norm = tuple((n / WY) * 100.0 for n in (WX, WY, WZ)) # guess chromatic adaption transform (Bradford, CAT02...) cat = profile.guess_cat() or cat elif isinstance(profile.tags.get("arts"), ICCP.chromaticAdaptionTag): cat = profile.guess_cat() or cat if "lumi" in profile.tags and isinstance(profile.tags.lumi, ICCP.XYZType): # calculate unscaled whitepoint scale = profile.tags.lumi.Y / 100.0 wtpt_profile = tuple(n * scale for n in wtpt_profile_norm) else: wtpt_profile = wtpt_profile_norm if sim_profile: wtpt_sim_profile_norm = tuple(n * 100 for n in sim_profile.tags.wtpt.values()) if "chad" in sim_profile.tags: # undo chromatic adaption of profile whitepoint WX, WY, WZ = sim_profile.tags.chad.inverted() * wtpt_sim_profile_norm wtpt_sim_profile_norm = tuple((n / WY) * 100.0 for n in (WX, WY, WZ)) wtpt_measured = tuple(float(n) for n in ti3_joined.LUMINANCE_XYZ_CDM2.split()) # normalize so that Y = 100 wtpt_measured_norm = tuple((n / wtpt_measured[1]) * 100 for n in wtpt_measured) if intent != "a" and sim_intent != "a": white = ti3_joined.queryi(white_rgb) for i in white: white[i].update({'XYZ_X': wtpt_measured_norm[0], 'XYZ_Y': wtpt_measured_norm[1], 'XYZ_Z': wtpt_measured_norm[2]}) black = ti3_joined.queryi1({'RGB_R': 0, 'RGB_G': 0, 'RGB_B': 0}) if black: bkpt_measured_norm = black["XYZ_X"], black["XYZ_Y"], black["XYZ_Z"] bkpt_measured = tuple(wtpt_measured[1] / 100 * n for n in bkpt_measured_norm) else: bkpt_measured_norm = None bkpt_measured = None # set Lab values labels_Lab = ("LAB_L", "LAB_A", "LAB_B") for data in (ti3_ref, ti3_joined): if "XYZ_X" in data.DATA_FORMAT.values() and \ "XYZ_Y" in data.DATA_FORMAT.values() and \ "XYZ_Z" in data.DATA_FORMAT.values(): if not "LAB_L" in data.DATA_FORMAT.values() and \ not "LAB_A" in data.DATA_FORMAT.values() and \ not "LAB_B" in data.DATA_FORMAT.values(): # add Lab fields to DATA_FORMAT if not present data.DATA_FORMAT.add_data(labels_Lab) has_Lab = False else: has_Lab = True if data is ti3_joined or not has_Lab: for i in data.DATA: X, Y, Z = [data.DATA[i][color] for color in labels_xyz] if data is ti3_joined: # we need to adapt the measured values to D50 #print X, Y, Z, '->', X, Y, Z = colormath.adapt(X, Y, Z, wtpt_measured_norm, cat=cat) #print X, Y, Z Lab = XYZ2Lab(X, Y, Z) for j, color in enumerate(labels_Lab): data.DATA[i][color] = Lab[j] if data is ti3_ref and sim_intent == "a" and intent == "a": for i in data.DATA: # we need to adapt the reference values to D50 L, a, b = [data.DATA[i][color] for color in labels_Lab] X, Y, Z = colormath.Lab2XYZ(L, a, b, scale=100) #print X, Y, Z, '->', X, Y, Z = colormath.adapt(X, Y, Z, wtpt_profile_norm, cat=cat) #print X, Y, Z Lab = XYZ2Lab(X, Y, Z) for j, color in enumerate(labels_Lab): data.DATA[i][color] = Lab[j] # gather data for report instrument = self.comport_ctrl.GetStringSelection() measurement_mode = self.measurement_mode_ctrl.GetStringSelection() instrument += u" \u2014 " + measurement_mode observer = get_cfg_option_from_args("observer", "-Q", self.worker.options_dispread) if observer != defaults["observer"]: instrument += u" \u2014 " + self.observers_ab.get(observer, observer) ccmx = "None" reference_observer = None if self.worker.instrument_can_use_ccxx(): ccmx = getcfg("colorimeter_correction_matrix_file").split(":", 1) if len(ccmx) > 1 and ccmx[1]: ccmxpath = ccmx[1] ccmx = os.path.basename(ccmx[1]) try: cgats = CGATS.CGATS(ccmxpath) except (IOError, CGATS.CGATSError), exception: safe_print("%s:" % ccmxpath, exception) else: desc = safe_unicode(cgats.get_descriptor(), "UTF-8") # If the description is not the same as the 'sane' # filename, add the filename after the description # (max 31 chars) # See also colorimeter_correction_check_overwite, the # way the filename is processed must be the same if (re.sub(r"[\\/:*?\"<>|]+", "_", make_argyll_compatible_path(desc)) != os.path.splitext(ccmx)[0]): ccmx = "%s &lt;%s&gt;" % (desc, ellipsis(ccmx, 31, "m")) if cgats.get(0, cgats).type == "CCMX": reference_observer = cgats.queryv1("REFERENCE_OBSERVER") if (reference_observer and reference_observer != defaults["observer"]): reference_observer = self.observers_ab.get(reference_observer, reference_observer) if not reference_observer.lower() in ccmx.lower(): ccmx += u" \u2014 " + reference_observer else: ccmx = "None" use_sim = getcfg("measurement_report.use_simulation_profile") use_sim_as_output = getcfg("measurement_report.use_simulation_profile_as_output") if not sim_profile and use_sim and use_sim_as_output: sim_profile = profile if (getcfg("measurement_report.trc_gamma") != 2.4 or getcfg("measurement_report.trc_gamma_type") != "B" or getcfg("measurement_report.trc_output_offset")): trc = '' else: trc = "BT.1886" placeholders2data = {"${PLANCKIAN}": 'checked="checked"' if planckian else "", "${DISPLAY}": self.display_ctrl.GetStringSelection().replace(" " + lang.getstr("display.primary"), ""), "${INSTRUMENT}": instrument, "${CORRECTION_MATRIX}": ccmx, "${BLACKPOINT}": "%f %f %f" % (bkpt_measured if bkpt_measured else (-1, ) * 3), "${WHITEPOINT}": "%f %f %f" % wtpt_measured, "${WHITEPOINT_NORMALIZED}": "%f %f %f" % wtpt_measured_norm, "${PROFILE}": profile.getDescription(), "${PROFILE_WHITEPOINT}": "%f %f %f" % wtpt_profile, "${PROFILE_WHITEPOINT_NORMALIZED}": "%f %f %f" % wtpt_profile_norm, "${SIMULATION_PROFILE}": sim_profile.getDescription() if sim_profile else '', "${TRC_GAMMA}": str(getcfg("measurement_report.trc_gamma") if apply_trc else 'null'), "${TRC_GAMMA_TYPE}": str(getcfg("measurement_report.trc_gamma_type") if apply_trc else ''), "${TRC_OUTPUT_OFFSET}": str(getcfg("measurement_report.trc_output_offset") if apply_trc else 0), "${TRC}": trc if apply_trc else '', "${WHITEPOINT_SIMULATION}": str(sim_intent == "a").lower(), "${WHITEPOINT_SIMULATION_RELATIVE}": str(sim_intent == "a" and intent == "r").lower(), "${DEVICELINK_PROFILE}": devlink.getDescription() if devlink else '', "${TESTCHART}": os.path.basename(chart.filename), "${ADAPTION}": str(profile.guess_cat(False) or cat), "${DATETIME}": strftime("%Y-%m-%d %H:%M:%S"), "${REF}": str(ti3_ref).decode(enc, "replace").replace('"', """), "${MEASURED}": str(ti3_joined).decode(enc, "replace").replace('"', """), "${CAL_ENTRYCOUNT}": str(cal_entrycount), "${CAL_RGBLEVELS}": repr(cal_rgblevels), "${GRAYSCALE}": repr(gray) if gray else 'null', "${REPORT_VERSION}": version_short} # create report try: report.create(save_path, placeholders2data, getcfg("report.pack_js")) except (IOError, OSError), exception: show_result_dialog(exception, self) else: # show report wx.CallAfter(launch_file, save_path) def load_cal(self, cal=None, silent=False): """ Load a calibration from a .cal file or ICC profile. Defaults to currently configured file if cal parameter is not given. """ load_vcgt = getcfg("calibration.autoload") or cal if not cal: cal = getcfg("calibration.file", False) if cal: if check_set_argyll_bin(): if verbose >= 1 and load_vcgt: safe_print(lang.getstr("calibration.loading")) safe_print(cal) if not load_vcgt or \ self.install_cal(capture_output=True, cal=cal, skip_scripts=True, silent=silent, title=lang.getstr("calibration.load_from_cal_or_profile")) is True: if (cal.lower().endswith(".icc") or cal.lower().endswith(".icm")): try: profile = ICCP.ICCProfile(cal) except (IOError, ICCP.ICCProfileInvalidError), exception: safe_print(exception) profile = None else: profile = cal_to_fake_profile(cal) self.lut_viewer_load_lut(profile=profile) if verbose >= 1 and silent and load_vcgt: safe_print(lang.getstr("success")) return True if verbose >= 1 and load_vcgt: safe_print(lang.getstr("failure")) return False def reset_cal(self, event=None): """ Reset video card gamma table to linear """ if check_set_argyll_bin(): if verbose >= 1: safe_print(lang.getstr("calibration.resetting")) if self.install_cal(capture_output=True, cal=False, skip_scripts=True, silent=not (getcfg("dry_run") and event), title=lang.getstr("calibration.reset")) is True: profile = ICCP.ICCProfile() profile._data = "\0" * 128 profile._tags.desc = ICCP.TextDescriptionType("", "desc") profile._tags.vcgt = ICCP.VideoCardGammaTableType("", "vcgt") profile._tags.vcgt.update({ "channels": 3, "entryCount": 256, "entrySize": 1, "data": [range(0, 256), range(0, 256), range(0, 256)] }) profile.size = len(profile.data) profile.is_loaded = True self.lut_viewer_load_lut(profile=profile) if verbose >= 1: safe_print(lang.getstr("success")) return True if verbose >= 1 and not getcfg("dry_run"): safe_print(lang.getstr("failure")) return False def load_display_profile_cal(self, event=None, lut_viewer_load_lut=True): """ Load calibration (vcgt) from current display profile """ profile = get_display_profile() if check_set_argyll_bin(): if verbose >= 1 and (getcfg("calibration.autoload") or event): safe_print( lang.getstr("calibration.loading_from_display_profile")) if profile and profile.fileName: safe_print(profile.fileName) if (not getcfg("calibration.autoload") and not event) or \ self.install_cal(capture_output=True, cal=True, skip_scripts=True, silent=not (getcfg("dry_run") and event), title=lang.getstr("calibration.load_from_display_profile")) is True: if lut_viewer_load_lut: self.lut_viewer_load_lut(profile=profile) if verbose >= 1 and (getcfg("calibration.autoload") or event): safe_print(lang.getstr("success")) return True if (verbose >= 1 and not getcfg("dry_run") and (getcfg("calibration.autoload") or event)): safe_print(lang.getstr("failure")) return False def report_calibrated_handler(self, event): """ Report on calibrated display and exit """ self.setup_measurement(self.report) def report_uncalibrated_handler(self, event): """ Report on uncalibrated display and exit """ self.setup_measurement(self.report, False) def report(self, report_calibrated=True): if check_set_argyll_bin(): if self.measure_auto(self.report, report_calibrated): return safe_print("-" * 80) if report_calibrated: progress_msg = lang.getstr("report.calibrated") else: progress_msg = lang.getstr("report.uncalibrated") safe_print(progress_msg) self.worker.interactive = False self.worker.start(self.result_consumer, self.worker.report, wkwargs={"report_calibrated": report_calibrated}, progress_msg=progress_msg, pauseable=True, resume=bool(getattr(self, "measure_auto_after", None))) def result_consumer(self, result): """ Generic result consumer. Shows the info window on success if enabled in the configuration or an info/warn/error dialog if result was an exception. """ if isinstance(result, Exception) and result: wx.CallAfter(show_result_dialog, result, self) else: wx.CallAfter(self.infoframe_toggle_handler, show=True) self.worker.wrapup(False) self.Show() def calibrate_btn_handler(self, event): if sys.platform == "darwin" or debug: self.focus_handler(event) if (not isinstance(event, CustomEvent) and not getcfg("profile.update") and (not getcfg("calibration.update") or is_profile()) and getcfg("trc")): update_profile = getcfg("calibration.update") and is_profile() if update_profile: msg = lang.getstr("calibration.update_profile_choice") ok = lang.getstr("profile.update") else: msg = lang.getstr("calibration.create_fast_matrix_shaper_choice") ok = lang.getstr("calibration.create_fast_matrix_shaper") dlg = ConfirmDialog(self, msg=msg, ok=ok, alt=lang.getstr("button.calibrate"), cancel=lang.getstr("cancel"), bitmap=geticon(32, "dialog-question")) result = dlg.ShowModal() dlg.Destroy() if result == wx.ID_CANCEL: return if update_profile and result == wx.ID_OK: setcfg("profile.update", 1) else: result = None self.worker.dispcal_create_fast_matrix_shaper = result == wx.ID_OK self.update_profile_name_timer.Stop() if check_set_argyll_bin() and self.check_overwrite(".cal") and \ ((not getcfg("profile.update") and not self.worker.dispcal_create_fast_matrix_shaper) or self.check_overwrite(profile_ext)): self.setup_measurement(self.just_calibrate) else: self.update_profile_name_timer.Start(1000) def just_calibrate(self): """ Just calibrate, optionally creating a fast matrix shaper profile """ if self.measure_auto(self.just_calibrate): return safe_print("-" * 80) safe_print(lang.getstr("button.calibrate")) setcfg("calibration.continue_next", 0) if getcfg("calibration.interactive_display_adjustment") and \ not getcfg("calibration.update"): # Interactive adjustment, do not show progress dialog self.worker.interactive = True else: # No interactive adjustment, show progress dialog self.worker.interactive = False self.worker.start_calibration(self.just_calibrate_finish, remove=True, progress_msg=lang.getstr("calibration"), resume=bool(getattr(self, "measure_auto_after", None))) def just_calibrate_finish(self, result): start_timers = True if not isinstance(result, Exception) and result: wx.CallAfter(self.update_calibration_file_ctrl) if getcfg("log.autoshow"): wx.CallAfter(self.infoframe_toggle_handler, show=True) if getcfg("profile.update") or \ self.worker.dispcal_create_fast_matrix_shaper: start_timers = False wx.CallAfter(self.profile_finish, True, success_msg=lang.getstr("calibration.complete"), install_3dlut=getcfg("3dlut.create")) elif getcfg("trc"): wx.CallAfter(self.load_cal, silent=True) wx.CallAfter(InfoDialog, self, msg=lang.getstr("calibration.complete"), ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-information")) else: if isinstance(result, Exception): wx.CallAfter(show_result_dialog, result, self) elif not getcfg("dry_run"): wx.CallAfter(InfoDialog, self, msg=lang.getstr("calibration.incomplete"), ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error")) self.Show(start_timers=start_timers) def setup_measurement(self, pending_function, *pending_function_args, **pending_function_kwargs): if not self.setup_patterngenerator(self): return writecfg() if pending_function_kwargs.get("wrapup", True): self.worker.wrapup(False) if "wrapup" in pending_function_kwargs: del pending_function_kwargs["wrapup"] self.HideAll() self.set_pending_function(pending_function, *pending_function_args, **pending_function_kwargs) if ((config.is_virtual_display() and config.get_display_name() not in ("Resolve", "Prisma") and not config.get_display_name().startswith("Chromecast ") and not config.get_display_name().startswith("Prisma ")) or getcfg("dry_run")): self.call_pending_function() elif sys.platform in ("darwin", "win32") or isexe: self.measureframe.Show() else: wx.CallAfter(self.start_measureframe_subprocess) def setup_patterngenerator(self, parent=None, title=appname, upload=False): retval = True if config.get_display_name(None, True) == "Prisma": # Ask for prisma hostname or IP dlg = ConfirmDialog(parent, title=title, msg=lang.getstr("patterngenerator.prisma.specify_host"), ok=lang.getstr("continue"), cancel=lang.getstr("cancel"), bitmap=geticon(32, "dialog-question")) host = getcfg("patterngenerator.prisma.host") dlg.host = wx.ComboBox(dlg, -1, host) def check_host_empty(event): dlg.ok.Enable(bool(dlg.host.GetValue())) dlg.host.Bind(wx.EVT_TEXT, check_host_empty) dlg.host.Bind(wx.EVT_COMBOBOX, check_host_empty) dlg.sizer3.Add(dlg.host, 0, flag=wx.TOP | wx.ALIGN_LEFT | wx.EXPAND, border=12) dlg.errormsg = wx.StaticText(dlg, -1, "") dlg.sizer3.Add(dlg.errormsg, 0, flag=wx.TOP | wx.ALIGN_LEFT | wx.EXPAND, border=6) if upload: # Show preset selection & filename sizer = wx.BoxSizer(wx.HORIZONTAL) dlg.sizer3.Add(sizer, 0, flag=wx.TOP | wx.ALIGN_LEFT | wx.EXPAND, border=12) sizer.Add(wx.StaticText(dlg, -1, lang.getstr("3dlut.holder.assign_preset")), flag=wx.ALIGN_CENTER_VERTICAL) preset = wx.Choice(dlg, -1, choices=config.valid_values["patterngenerator.prisma.preset"]) preset.SetStringSelection(getcfg("patterngenerator.prisma.preset")) sizer.Add(preset, flag=wx.LEFT | wx.ALIGN_CENTER_VERTICAL, border=8) # Filename basename = os.path.basename(getcfg("3dlut.input.profile")) name = os.path.splitext(basename)[0] # Shorten long name gamut = {"SMPTE_RP145_NTSC": "NTSC", "EBU3213_PAL": "PAL", "SMPTE431_P3": "P3"}.get(name, name) # Use file created date & time for filename filename = strftime("%%s-%Y%m%dT%H%M%S.3dl", localtime(os.stat(self.lut3d_path).st_ctime)) % gamut dlg.sizer3.Add(wx.StaticText(dlg, -1, "%s: %s" % (lang.getstr("filename.upload"), filename)), flag=wx.TOP | wx.ALIGN_LEFT, border=12) else: # Show levels selection dlg.tvlevels = wx.RadioButton(dlg, -1, lang.getstr("3dlut.encoding.type_t"), style=wx.RB_GROUP) dlg.sizer3.Add(dlg.tvlevels, 0, flag=wx.TOP | wx.ALIGN_LEFT, border=12) dlg.pclevels = wx.RadioButton(dlg, -1, lang.getstr("3dlut.encoding.type_n")) dlg.sizer3.Add(dlg.pclevels, 0, flag=wx.TOP | wx.ALIGN_LEFT, border=4) if getcfg("patterngenerator.prisma.use_video_levels"): dlg.tvlevels.SetValue(True) else: dlg.pclevels.SetValue(True) dlg.sizer0.SetSizeHints(dlg) dlg.sizer0.Layout() def check_host(host): try: ip = socket.gethostbyname(host) except socket.error, exception: result = exception else: result = ip wx.CallAfter(check_host_consumer, result) def check_host_consumer(result): if not dlg: return if isinstance(result, Exception): dlg.Freeze() dlg.errormsg.Label = lang.getstr("host.invalid.lookup_failed") dlg.errormsg.ForegroundColour = wx.Colour(204, 0, 0) dlg.ok.Enable() dlg.Thaw() wx.Bell() else: dlg.EndModal(wx.ID_OK) def check_host_handler(event): host = dlg.host.GetValue() if host: dlg.Freeze() dlg.errormsg.Label = lang.getstr("please_wait") dlg.errormsg.ForegroundColour = wx.SystemSettings.GetColour(wx.SYS_COLOUR_WINDOWTEXT) dlg.ok.Disable() dlg.sizer0.SetSizeHints(dlg) dlg.sizer0.Layout() dlg.Thaw() thread = threading.Thread(target=check_host, args=(host, )) thread.start() else: wx.Bell() def add_client(addr_client): if not dlg: return name = addr_client[1]["name"] if sys.platform != "win32" and not name.endswith(".local"): name += ".local" dlg.host.Append(name) if not dlg.host.GetValue(): dlg.host.SetSelection(0) check_host_empty(None) def discover(): self.worker.patterngenerator.bind("on_client_added", lambda addr_client: wx.CallAfter(add_client, addr_client)) self.worker.patterngenerator.listen() self.worker.patterngenerator.announce() thread = threading.Thread(target=discover) dlg.ok.Bind(wx.EVT_BUTTON, check_host_handler) dlg.ok.Enable(bool(host)) if self.worker.patterngenerator: self.worker.patterngenerator.disconnect_client() else: self.worker.setup_patterngenerator() wx.CallAfter(thread.start) result = dlg.ShowModal() self.worker.patterngenerator.listening = False host = dlg.host.GetValue() if result == wx.ID_OK: if upload: setcfg("patterngenerator.prisma.preset", preset.GetStringSelection()) retval = filename else: setcfg("patterngenerator.prisma.use_video_levels", int(dlg.tvlevels.GetValue())) dlg.Destroy() if result != wx.ID_OK or not host: return setcfg("patterngenerator.prisma.host", host) self.worker.patterngenerator.host = host return retval def start_measureframe_subprocess(self): args = u'"%s" -c "%s"' % (exe, "import sys;" "sys.path.insert(0, %r);" "import wxMeasureFrame;" "wxMeasureFrame.main();" "sys.exit(wxMeasureFrame.MeasureFrame.exitcode)" % pydir) if wx.Display.GetCount() == 1 and len(self.worker.display_rects) > 1: # Separate X screens, TwinView or similar display = wx.Display(0) geometry = display.Geometry union = wx.Rect() xy = [] for rect in self.worker.display_rects: if rect[:2] in xy or rect[2:] == geometry[2:]: # Overlapping x y coordinates or screen filling whole # reported geometry, so assume separate X screens union = None break xy.append(rect[:2]) union = union.Union(rect) if union == geometry: # Assume TwinView or similar where Argyll enumerates 1+n # displays but wx only 'sees' one that is the union of them pass else: # Assume separate X screens try: x_hostname, x_display, x_screen = util_x.get_display() except ValueError, exception: InfoDialog(self, msg=safe_unicode(exception), ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error")) self.Show(start_timers=True) return args = "DISPLAY=%s:%s.%s %s" % (x_hostname, x_display, getcfg("display.number") - 1, args) delayedresult.startWorker(self.measureframe_consumer, self.measureframe_subprocess, wargs=(args, )) def measureframe_subprocess(self, args): returncode = -1 try: p = sp.Popen(args.encode(fs_enc), shell=True, stdin=sp.PIPE, stdout=sp.PIPE, stderr=sp.PIPE) except Exception, exception: stderr = safe_str(exception) else: self._measureframe_subprocess = p stdout, stderr = p.communicate() returncode = self._measureframe_subprocess.returncode del self._measureframe_subprocess return returncode, stderr def measureframe_consumer(self, delayedResult): returncode, stderr = delayedResult.get() if returncode != -1: config.initcfg() self.get_set_display() if returncode != 255: self.Show(start_timers=True) self.restore_measurement_mode() self.restore_testchart() if returncode != 0 and stderr and stderr.strip(): InfoDialog(self, msg=safe_unicode(stderr.strip()), ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error")) else: self.call_pending_function() def get_set_display(self, update_ccmx_items=False): """ Get the currently configured display number, and set the display device selection """ if debug: safe_print("[D] get_set_display") if self.worker.displays: self.display_ctrl.SetSelection( min(max(0, len(self.worker.displays) - 1), max(0, getcfg("display.number") - 1))) self.display_ctrl_handler( CustomEvent(wx.EVT_CHOICE.evtType[0], self.display_ctrl), load_lut=False, update_ccmx_items=update_ccmx_items) def get_ccxx_measurement_modes(self, instrument_name, swap=False): """ Get measurement modes suitable for colorimeter correction creation """ # IMPORTANT: Make changes aswell in the following locations: # - DisplayCAL.MainFrame.create_colorimeter_correction_handler # - DisplayCAL.MainFrame.set_ccxx_measurement_mode # - DisplayCAL.MainFrame.update_colorimeter_correction_matrix_ctrl_items # - worker.Worker.check_add_display_type_base_id # - worker.Worker.instrument_can_use_ccxx modes = {"ColorHug": {"F": lang.getstr("measurement_mode.factory"), "R": lang.getstr("measurement_mode.raw")}, "ColorHug2": {"F": lang.getstr("measurement_mode.factory"), "R": lang.getstr("measurement_mode.raw")}, "ColorMunki Smile": {"f": lang.getstr("measurement_mode.lcd.ccfl")}, "Colorimtre HCFR": {"R": lang.getstr("measurement_mode.raw")}, "K-10": {"F": lang.getstr("measurement_mode.factory")}}.get( instrument_name, {"c": lang.getstr("measurement_mode.refresh"), "l": lang.getstr("measurement_mode.lcd")}) if swap: modes = swap_dict_keys_values(modes) return modes def set_ccxx_measurement_mode(self): """ Set measurement mode suitable for colorimeter correction creation """ # IMPORTANT: Make changes aswell in the following locations: # - DisplayCAL.MainFrame.create_colorimeter_correction_handler # - DisplayCAL.MainFrame.get_ccxx_measurement_modes # - DisplayCAL.MainFrame.update_colorimeter_correction_matrix_ctrl_items # - worker.Worker.check_add_display_type_base_id # - worker.Worker.instrument_can_use_ccxx measurement_mode = None if getcfg("measurement_mode") == "auto": # Make changes in worker.Worker.add_instrument_features too! if self.worker.get_instrument_name() == "ColorHug": measurement_mode = "R" elif self.worker.get_instrument_name() == "ColorHug2": measurement_mode = "F" else: measurement_mode = "l" elif (self.worker.get_instrument_name() in ("ColorHug", "ColorHug2") and getcfg("measurement_mode") not in ("F", "R")): # Automatically set factory measurement mode if not already # factory or raw measurement mode measurement_mode = "F" elif (self.worker.get_instrument_name() == "ColorMunki Smile" and getcfg("measurement_mode") != "f"): # Automatically set LCD measurement mode if not already # LCD CCFL measurement mode measurement_mode = "f" elif (self.worker.get_instrument_name() == "Colorimtre HCFR" and getcfg("measurement_mode") != "R"): # Automatically set raw measurement mode if not already # raw measurement mode measurement_mode = "R" elif (self.worker.get_instrument_name() in ("Spyder4", "Spyder5") and getcfg("measurement_mode") not in ("l", "c")): # Automatically set LCD measurement mode if not already # LCD or refresh measurement mode measurement_mode = "l" if not getcfg("measurement_mode.backup", False): setcfg("measurement_mode.backup", getcfg("measurement_mode")) if measurement_mode: setcfg("measurement_mode", measurement_mode) self.update_measurement_mode() def set_pending_function(self, pending_function, *pending_function_args, **pending_function_kwargs): self.pending_function = pending_function self.pending_function_args = pending_function_args self.pending_function_kwargs = pending_function_kwargs def call_pending_function(self): # Needed for proper display updates under GNOME writecfg() if sys.platform in ("darwin", "win32") or isexe: self.measureframe.Hide() if debug: safe_print("[D] Calling pending function with args:", self.pending_function_args) wx.CallLater(100, self.pending_function, *self.pending_function_args, **self.pending_function_kwargs) self.pending_function = None def calibrate_and_profile_btn_handler(self, event): """ Setup calibration and characterization measurements """ if sys.platform == "darwin" or debug: self.focus_handler(event) self.update_profile_name_timer.Stop() if check_set_argyll_bin() and self.check_overwrite(".cal") and \ self.check_overwrite(".ti3") and self.check_overwrite(profile_ext): self.setup_measurement(self.calibrate_and_profile) else: self.update_profile_name_timer.Start(1000) def calibrate_and_profile(self): """ Start calibration measurements """ if self.measure_auto(self.calibrate_and_profile): return safe_print("-" * 80) safe_print(lang.getstr("button.calibrate_and_profile").replace("&&", "&")) setcfg("calibration.continue_next", 1) self.worker.dispcal_create_fast_matrix_shaper = False self.worker.dispread_after_dispcal = True if getcfg("calibration.interactive_display_adjustment") and \ not getcfg("calibration.update"): # Interactive adjustment, do not show progress dialog self.worker.interactive = True else: # No interactive adjustment, show progress dialog self.worker.interactive = False self.worker.start_calibration(self.calibrate_finish, progress_msg=lang.getstr("calibration"), continue_next=True, resume=bool(getattr(self, "measure_auto_after", None))) def calibrate_finish(self, result): """ Start characterization measurements """ self.worker.interactive = False if not isinstance(result, Exception) and result: wx.CallAfter(self.update_calibration_file_ctrl) if getcfg("trc"): cal = True else: cal = get_data_path("linear.cal") self.worker.start_measurement(self.calibrate_and_profile_finish, apply_calibration=cal, progress_msg=lang.getstr("measuring.characterization"), resume=True, continue_next=True) else: if isinstance(result, Exception): wx.CallAfter(show_result_dialog, result, self) self.Show() def calibrate_and_profile_finish(self, result): """ Build profile from characterization measurements """ start_timers = True if not isinstance(result, Exception) and result: result = self.check_copy_ti3() if not isinstance(result, Exception) and result: start_timers = False wx.CallAfter(self.start_profile_worker, lang.getstr("calibration_profiling.complete"), resume=True) else: if isinstance(result, Exception): wx.CallAfter(show_result_dialog, result, self) elif not getcfg("dry_run"): wx.CallAfter(InfoDialog, self, msg=lang.getstr("profiling.incomplete"), ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error")) self.Show(start_timers=start_timers) def check_copy_ti3(self): result = self.measurement_file_check_confirm(parent=getattr(self.worker, "progress_wnd", self)) if isinstance(result, tuple): result = self.worker.wrapup(copy=True, remove=False, ext_filter=[".ti3"]) if isinstance(result, Exception) or not result: self.worker.stop_progress() return result def start_profile_worker(self, success_msg, resume=False): name = getcfg("profile.name.expanded") path = os.path.join(getcfg("profile.save_path"), name, name + profile_ext) self.lut3d_set_path(path) continue_next = (getcfg("3dlut.create") and not os.path.isfile(self.lut3d_path)) self.worker.interactive = False self.worker.start(self.profile_finish, self.worker.create_profile, ckwargs={"success_msg": success_msg, "failure_msg": lang.getstr( "profiling.incomplete"), "install_3dlut": getcfg("3dlut.create")}, wkwargs={"tags": True}, progress_msg=lang.getstr("create_profile"), resume=resume, continue_next=continue_next) def gamap_btn_handler(self, event): if not hasattr(self, "gamapframe"): self.init_gamapframe() if self.gamapframe.IsShownOnScreen(): self.gamapframe.Raise() else: self.gamapframe.Center() self.gamapframe.SetPosition((-1, self.GetPosition()[1] + self.GetSize()[1] - self.gamapframe.GetSize()[1] - 100)) self.gamapframe.Show(not self.gamapframe.IsShownOnScreen()) def current_cal_choice(self, silent=False): """ Prompt user to either keep or clear the current calibration, with option to embed or not embed Return None if the current calibration should be embedded Return False if no calibration should be embedded Return filename if a .cal file should be used Return wx.ID_CANCEL if whole operation should be cancelled """ if config.is_uncalibratable_display(): return False cal = getcfg("calibration.file", False) if cal: filename, ext = os.path.splitext(cal) if ext.lower() in (".icc", ".icm"): self.worker.options_dispcal = [] try: profile = ICCP.ICCProfile(cal) except (IOError, ICCP.ICCProfileInvalidError), exception: InfoDialog(self, msg=lang.getstr("profile.invalid") + "\n" + path, ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error")) self.update_profile_name_timer.Start(1000) return wx.ID_CANCEL else: # get dispcal options if present self.worker.options_dispcal = [ "-" + arg for arg in get_options_from_profile(profile)[0]] if os.path.isfile(filename + ".cal"): cal = filename + ".cal" else: cal = None if (self.worker.argyll_version < [1, 1, 0] or not self.worker.has_lut_access()): # If Argyll < 1.1, we cannot save the current VideoLUT to use it. # For web, there is no point in using the current VideoLUT as it # may not be from the display we render on (and we cannot save it # to begin with as there is no VideoLUT access). # So an existing .cal file or no calibration are the only options. can_use_current_cal = False else: can_use_current_cal = True if cal: msgstr = "dialog.cal_info" icon = "information" elif can_use_current_cal: msgstr = "dialog.current_cal_warning" icon = "warning" else: msgstr = "dialog.linear_cal_info" icon = "information" dlg = ConfirmDialog(self, msg=lang.getstr(msgstr, os.path.basename(cal) if cal else None), ok=lang.getstr("continue"), cancel=lang.getstr("cancel"), bitmap=geticon(32, "dialog-%s" % icon)) border = 12 if can_use_current_cal or cal: dlg.reset_cal_ctrl = wx.CheckBox(dlg, -1, lang.getstr("calibration.use_linear_instead")) dlg.sizer3.Add(dlg.reset_cal_ctrl, flag=wx.TOP | wx.ALIGN_LEFT, border=border) border = 4 dlg.embed_cal_ctrl = wx.CheckBox(dlg, -1, lang.getstr("calibration.embed")) def embed_cal_ctrl_handler(event): embed_cal = dlg.embed_cal_ctrl.GetValue() dlg.reset_cal_ctrl.Enable(embed_cal) if not embed_cal: dlg.reset_cal_ctrl.SetValue(True) if can_use_current_cal or cal: dlg.embed_cal_ctrl.Bind(wx.EVT_CHECKBOX, embed_cal_ctrl_handler) dlg.embed_cal_ctrl.SetValue(bool(can_use_current_cal or cal)) dlg.sizer3.Add(dlg.embed_cal_ctrl, flag=wx.TOP | wx.ALIGN_LEFT, border=border) dlg.sizer0.SetSizeHints(dlg) dlg.sizer0.Layout() if silent: result = wx.ID_OK else: result = dlg.ShowModal() if can_use_current_cal or cal: reset_cal = dlg.reset_cal_ctrl.GetValue() embed_cal = dlg.embed_cal_ctrl.GetValue() dlg.Destroy() if result == wx.ID_CANCEL: self.update_profile_name_timer.Start(1000) return wx.ID_CANCEL if not embed_cal: if can_use_current_cal and reset_cal: self.reset_cal() return False elif not (can_use_current_cal or cal) or reset_cal: return get_data_path("linear.cal") elif cal: return cal def restore_measurement_mode(self): if getcfg("measurement_mode.backup", False): setcfg("measurement_mode", getcfg("measurement_mode.backup")) setcfg("measurement_mode.backup", None) if getcfg("comport.number.backup", False): setcfg("comport.number", getcfg("comport.number.backup")) setcfg("comport.number.backup", None) self.update_comports() else: self.update_measurement_mode() if getcfg("observer.backup", False): setcfg("observer", getcfg("observer.backup")) setcfg("observer.backup", None) def restore_testchart(self): if getcfg("testchart.file.backup", False): self.set_testchart(getcfg("testchart.file.backup")) setcfg("testchart.file.backup", None) def measure_auto(self, measure_auto_after, *measure_auto_after_args): """ Automatically create a CCMX with EDID reference """ if (getcfg("measurement_mode") == "auto" and not getattr(self, "measure_auto_after", None)): if not self.worker.get_display_edid(): self.measure_auto_finish(Error("EDID not available")) return True self.measure_auto_after = measure_auto_after self.measure_auto_after_args = measure_auto_after_args if not is_ccxx_testchart(): ccxx_testchart = get_ccxx_testchart() if not ccxx_testchart: self.measure_auto_finish(Error(lang.getstr("not_found", lang.getstr("ccxx.ti1")))) return True setcfg("testchart.file.backup", getcfg("testchart.file")) self.set_testchart(ccxx_testchart) self.just_measure(get_data_path("linear.cal"), self.measure_auto_finish) return True def measure_auto_finish(self, result): ti3_path = os.path.join(self.worker.tempdir or "", getcfg("profile.name.expanded") + ".ti3") self.restore_testchart() if isinstance(result, Exception) or not result: self.measure_auto_after = None if isinstance(result, Exception): wx.CallAfter(show_result_dialog, result, self) self.Show() self.worker.stop_progress() else: edid = self.worker.get_display_edid() defaultFile = edid.get("monitor_name", edid.get("ascii", str(edid["product_id"]))) + profile_ext profile_path = os.path.join(self.worker.tempdir, defaultFile) profile = ICCP.ICCProfile.from_edid(edid) try: profile.write(profile_path) except Exception, exception: self.measure_auto_finish(exception) return luminance = None if self.worker.get_instrument_name() == "ColorHug": # Get the factory calibration so we can do luminance scaling # NOTE that this currently only works for the ColorHug, # NOT the ColorHug2! (but it's probably not needed for the # ColorHug2 anyway) for line in self.worker.output: if line.lower().startswith("serial number:"): serial = line.split(":", 1)[-1].strip() calibration = "calibration-%s.ti3" % serial path = os.path.join(config.get_argyll_data_dir(), calibration) if not os.path.isfile(path): safe_print("Retrieving factory calibration for " "ColorHug", serial) url = ("https://raw.githubusercontent.com/hughski" "/colorhug-calibration/master/data/" + calibration) try: response = urllib2.urlopen(url) except Exception, exception: self.measure_auto_finish(exception) return body = response.read() response.close() if body.strip().startswith("CTI3"): safe_print("Successfully retrieved", url) try: with open(path, "wb") as calibrationfile: calibrationfile.write(body) except Exception, exception: safe_print(exception) else: safe_print("Got unexpected answer from %s:" % url) safe_print(body) if os.path.isfile(path): safe_print("Using factory calibration", path) try: cgats = CGATS.CGATS(path) except (IOError, CGATS.CGATSError), exception: safe_print(exception) else: white = cgats.queryi1({"RGB_R": 1, "RGB_G": 1, "RGB_B": 1}) if white: luminance = white["XYZ_Y"] safe_print("Using luminance %.2f from " "factory calibration" % luminance) if self.create_colorimeter_correction_handler(None, [profile_path, ti3_path], luminance=luminance): self.measure_auto_after(*self.measure_auto_after_args) else: self.Show() self.worker.stop_progress() self.measure_auto_after = None def measure_handler(self, event=None): if is_ccxx_testchart(): # Allow different location to store measurements path = getcfg("profile.save_path") if path: if not waccess(path, os.W_OK): show_result_dialog(Error(lang.getstr("error.access_denied.write", path)), self) return setcfg("measurement.save_path", path) setcfg("measurement.name.expanded", "%s & %s %s" % (self.worker.get_instrument_name(), self.worker.get_display_name(), strftime("%Y-%m-%d %H-%M-%S"))) else: self.restore_measurement_mode() self.restore_testchart() return self.update_profile_name_timer.Stop() if check_set_argyll_bin() and self.check_overwrite(".ti3"): if is_ccxx_testchart(): # Use linear calibration for measuring CCXX testchart apply_calibration = get_data_path("linear.cal") else: apply_calibration = self.current_cal_choice() if apply_calibration != wx.ID_CANCEL: self.setup_measurement(self.just_measure, apply_calibration) else: self.restore_measurement_mode() self.restore_testchart() self.update_profile_name_timer.Start(1000) def profile_btn_handler(self, event): """ Setup characterization measurements """ if sys.platform == "darwin" or debug: self.focus_handler(event) self.update_profile_name_timer.Stop() if check_set_argyll_bin() and self.check_overwrite(".ti3") and \ self.check_overwrite(profile_ext): apply_calibration = self.current_cal_choice(silent=isinstance(event, CustomEvent)) if apply_calibration != wx.ID_CANCEL: self.setup_measurement(self.just_profile, apply_calibration) else: self.update_profile_name_timer.Start(1000) def just_measure(self, apply_calibration, consumer=None): if self.measure_auto(self.just_measure, apply_calibration): return safe_print("-" * 80) safe_print(lang.getstr("measure")) self.worker.dispread_after_dispcal = False self.worker.interactive = config.get_display_name() == "Untethered" setcfg("calibration.file.previous", None) continue_next = bool(consumer) resume = bool(getattr(self, "measure_auto_after", None)) if not consumer: consumer = self.just_measure_finish self.worker.start_measurement(consumer, apply_calibration, progress_msg=lang.getstr("measuring.characterization"), continue_next=continue_next, resume=resume) def just_measure_finish(self, result): if not isinstance(result, Exception) and result: result = self.check_copy_ti3() self.worker.wrapup(copy=False, remove=True) if isinstance(result, Exception) or not result: if isinstance(result, Exception): wx.CallAfter(show_result_dialog, result, self) elif is_ccxx_testchart(): try: cgats = CGATS.CGATS(os.path.join(getcfg("measurement.save_path"), getcfg("measurement.name.expanded"), getcfg("measurement.name.expanded")) + ".ti3") except Exception, exception: wx.CallAfter(show_result_dialog, exception, self) else: if cgats.queryv1("INSTRUMENT_TYPE_SPECTRAL") == "YES": setcfg("last_reference_ti3_path", cgats.filename) else: setcfg("last_colorimeter_ti3_path", cgats.filename) if getcfg("comport.number.backup", False): # Measurements were started from colorimeter correction # creation dialog paths = [] if (getcfg("last_reference_ti3_path", False) and os.path.isfile(getcfg("last_reference_ti3_path")) and (getcfg("colorimeter_correction.type") == "spectral" or (getcfg("last_colorimeter_ti3_path", False) and os.path.isfile(getcfg("last_colorimeter_ti3_path")) and self.worker.get_instrument_name() == getcfg("colorimeter_correction.instrument")))): paths.append(getcfg("last_reference_ti3_path")) if (self.worker.get_instrument_name() == getcfg("colorimeter_correction.instrument")): paths.append(getcfg("last_colorimeter_ti3_path")) wx.CallAfter(self.create_colorimeter_correction_handler, True, paths=paths) else: wx.CallAfter(self.just_measure_show_result, os.path.join(getcfg("profile.save_path"), getcfg("profile.name.expanded"), getcfg("profile.name.expanded") + ".ti3")) self.Show(start_timers=True) self.restore_measurement_mode() self.restore_testchart() def just_measure_show_result(self, path): dlg = ConfirmDialog(self, msg=lang.getstr("measurements.complete"), ok=lang.getstr("ok"), cancel=lang.getstr("cancel"), bitmap=geticon(32, "dialog-question")) if dlg.ShowModal() == wx.ID_OK: launch_file(os.path.dirname(path)) dlg.Destroy() def just_profile(self, apply_calibration): """ Start characterization measurements """ if self.measure_auto(self.just_profile, apply_calibration): return safe_print("-" * 80) safe_print(lang.getstr("button.profile")) self.worker.dispread_after_dispcal = False self.worker.interactive = config.get_display_name() == "Untethered" setcfg("calibration.file.previous", None) self.worker.start_measurement(self.just_profile_finish, apply_calibration, progress_msg=lang.getstr("measuring.characterization"), continue_next=config.get_display_name() != "Untethered", resume=bool(getattr(self, "measure_auto_after", None))) def just_profile_finish(self, result): """ Build profile from characterization measurements """ start_timers = True if not isinstance(result, Exception) and result: result = self.check_copy_ti3() if not isinstance(result, Exception) and result: start_timers = False wx.CallAfter(self.start_profile_worker, lang.getstr("profiling.complete"), resume=True) else: if isinstance(result, Exception): wx.CallAfter(show_result_dialog, result, self) elif not getcfg("dry_run"): wx.CallAfter(InfoDialog, self, msg=lang.getstr("profiling.incomplete"), ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error")) self.Show(start_timers=start_timers) def profile_finish(self, result, profile_path=None, success_msg="", failure_msg="", preview=True, skip_scripts=False, allow_show_log=True, install_3dlut=False): if not isinstance(result, Exception) and result: if getcfg("log.autoshow") and allow_show_log: self.infoframe_toggle_handler(show=True) self.install_3dlut = install_3dlut if profile_path: profile_save_path = os.path.splitext(profile_path)[0] else: profile_save_path = os.path.join( getcfg("profile.save_path"), getcfg("profile.name.expanded"), getcfg("profile.name.expanded")) profile_path = profile_save_path + profile_ext self.cal = profile_path profile = None filename, ext = os.path.splitext(profile_path) extra = [] cinfo = [] vinfo = [] has_cal = False try: profile = ICCP.ICCProfile(profile_path) except (IOError, ICCP.ICCProfileInvalidError), exception: InfoDialog(self, msg=lang.getstr("profile.invalid") + "\n" + profile_path, ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error")) self.start_timers(True) setcfg("calibration.file.previous", None) return else: has_cal = isinstance(profile.tags.get("vcgt"), ICCP.VideoCardGammaType) if profile.profileClass != "mntr" or \ profile.colorSpace != "RGB": InfoDialog(self, msg=lang.getstr("profiling.complete"), ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-information")) self.start_timers(True) setcfg("calibration.file.previous", None) return if getcfg("calibration.file", False) != profile_path: # Load profile (options_dispcal, options_colprof) = get_options_from_profile(profile) if options_dispcal or options_colprof: cal = profile_save_path + ".cal" sel = self.calibration_file_ctrl.GetSelection() if options_dispcal and self.recent_cals[sel] == cal: self.recent_cals.remove(cal) self.calibration_file_ctrl.Delete(sel) if getcfg("settings.changed"): self.settings_discard_changes() if options_dispcal and options_colprof: self.load_cal_handler(None, path=profile_path, update_profile_name=False, silent=True, load_vcgt=False) else: setcfg("calibration.file", profile_path) setcfg("3dlut.output.profile", profile_path) setcfg("measurement_report.output_profile", profile_path) self.update_controls(update_profile_name=False) # Get 3D LUT options self.lut3d_set_path() # Check if we want to automatically create 3D LUT if (install_3dlut and getcfg("3dlut.create") and not os.path.isfile(self.lut3d_path)): # Update curve viewer if shown self.lut_viewer_load_lut(profile=profile) # Create 3D LUT self.lut3d_create_handler(None) return elif hasattr(self.worker, "_disabler"): # This shouldn't happen self.worker.stop_progress() if "meta" in profile.tags: for key in ("avg", "max", "rms"): try: dE = float(profile.tags.meta.getvalue("ACCURACY_dE76_%s" % key)) except (TypeError, ValueError): pass else: lstr = lang.getstr("profile.self_check") + ":" if not lstr in extra: extra.append(lstr) extra.append(u" %s %.2f" % (lang.getstr("profile.self_check.%s" % key), dE)) gamuts = (("srgb", "sRGB", ICCP.GAMUT_VOLUME_SRGB), ("adobe-rgb", "Adobe RGB", ICCP.GAMUT_VOLUME_ADOBERGB), ("dci-p3", "DCI P3", ICCP.GAMUT_VOLUME_SMPTE431_P3)) for key, name, volume in gamuts: try: gamut_coverage = float(profile.tags.meta.getvalue("GAMUT_coverage(%s)" % key)) except (TypeError, ValueError): gamut_coverage = None if gamut_coverage: cinfo.append("%.1f%% %s" % (gamut_coverage * 100, name)) try: gamut_volume = float(profile.tags.meta.getvalue("GAMUT_volume")) except (TypeError, ValueError): gamut_volume = None if gamut_volume: for key, name, volume in gamuts: vinfo.append("%.1f%% %s" % (gamut_volume * ICCP.GAMUT_VOLUME_SRGB / volume * 100, name)) if len(vinfo) == len(cinfo): break if config.is_virtual_display() or install_3dlut: installable = False title = appname if self.lut3d_path and os.path.isfile(self.lut3d_path): # 3D LUT file already exists if (getcfg("3dlut.format") in ("madVR", "ReShade") or config.check_3dlut_format("Prisma")): ok = lang.getstr("3dlut.install") else: ok = lang.getstr("3dlut.save_as") else: ok = lang.getstr("3dlut.create") cancel = lang.getstr("cancel") else: # Check if profile is a LUT-type, and if yes, if LUT is of high # enough resolution (we assume anything >= 17 to be ok) if ("B2A0" in profile.tags and isinstance(profile.tags.B2A0, ICCP.LUT16Type) and profile.tags.B2A0.clut_grid_steps < 17): # Nope. Not allowing to install. Offer to re-generate B2A # tables. dlg = ConfirmDialog(self, msg=lang.getstr("profile.b2a.lowres.warning"), bitmap=geticon(32, "dialog-warning")) choice = dlg.ShowModal() if choice == wx.ID_OK: self.profile_hires_b2a_handler(None, profile) return installable = True title = lang.getstr("profile.install") ok = lang.getstr("profile.install") cancel = lang.getstr("profile.do_not_install") if not success_msg: if installable: success_msg = lang.getstr("dialog.install_profile", (os.path.basename(profile_path), self.display_ctrl.GetStringSelection())) else: success_msg = lang.getstr("profiling.complete") if extra: extra = ",".join(extra).replace(":,", ":").replace(",,", "\n") success_msg = "\n\n".join([success_msg, extra]).strip() # Always load calibration curves self.load_cal(cal=profile_path, silent=True) # Check profile metadata share_profile = None if not self.profile_share_get_meta_error(profile): share_profile = lang.getstr("profile.share") dlg = ConfirmDialog(self, msg=success_msg, title=title, ok=ok, cancel=cancel, bitmap=geticon(32, appname + "-profile-info"), alt=share_profile) if cinfo or vinfo: gamut_info_sizer = wx.FlexGridSizer(2, 2, 0, 24) dlg.sizer3.Add(gamut_info_sizer, flag=wx.TOP, border=14) if cinfo: label = wx.StaticText(dlg, -1, lang.getstr("gamut.coverage")) font = label.GetFont() font.SetWeight(wx.BOLD) label.SetFont(font) gamut_info_sizer.Add(label) if vinfo: label = wx.StaticText(dlg, -1, lang.getstr("gamut.volume")) font = label.GetFont() font.SetWeight(wx.BOLD) label.SetFont(font) else: label = (1, 1) gamut_info_sizer.Add(label) if cinfo: gamut_info_sizer.Add(wx.StaticText(dlg, -1, "\n".join(cinfo))) if vinfo: gamut_info_sizer.Add(wx.StaticText(dlg, -1, "\n".join(vinfo))) self.modaldlg = dlg if share_profile: # Show share profile button dlg.Unbind(wx.EVT_BUTTON, dlg.alt) dlg.Bind(wx.EVT_BUTTON, self.profile_share_handler, id=dlg.alt.GetId()) if preview and has_cal and self.worker.calibration_loading_supported: # Show calibration preview checkbox self.preview = wx.CheckBox(dlg, -1, lang.getstr("calibration.preview")) self.preview.SetValue(True) dlg.Bind(wx.EVT_CHECKBOX, self.preview_handler, id=self.preview.GetId()) dlg.sizer3.Add(self.preview, flag=wx.TOP | wx.ALIGN_LEFT, border=14) if LUTFrame and not ProfileInfoFrame: # Disabled, use profile information window instead self.show_lut = wx.CheckBox(dlg, -1, lang.getstr( "calibration.show_lut")) dlg.Bind(wx.EVT_CHECKBOX, self.show_lut_handler, id=self.show_lut.GetId()) dlg.sizer3.Add(self.show_lut, flag=wx.TOP | wx.ALIGN_LEFT, border=4) self.show_lut.SetValue(bool(getcfg("lut_viewer.show"))) if not getattr(self, "lut_viewer", None): self.init_lut_viewer(profile=profile, show=getcfg("lut_viewer.show")) else: dlg.sizer3.Add((0, 10)) self.show_profile_info = wx.CheckBox(dlg, -1, lang.getstr("profile.info.show")) dlg.Bind(wx.EVT_CHECKBOX, self.profile_info_handler, id=self.show_profile_info.GetId()) dlg.sizer3.Add(self.show_profile_info, flag=wx.TOP | wx.ALIGN_LEFT, border=4) if profile.ID == "\0" * 16: id = profile.calculateID(False) else: id = profile.ID if id in self.profile_info: self.show_profile_info.SetValue( self.profile_info[id].IsShownOnScreen()) if installable: if sys.platform != "darwin" or test: self.profile_load_on_login = wx.CheckBox(dlg, -1, lang.getstr("profile.load_on_login")) self.profile_load_on_login.SetValue( bool(getcfg("profile.load_on_login") or (sys.platform == "win32" and sys.getwindowsversion() >= (6, 1) and util_win.calibration_management_isenabled()))) dlg.Bind(wx.EVT_CHECKBOX, self.profile_load_on_login_handler, id=self.profile_load_on_login.GetId()) dlg.sizer3.Add(self.profile_load_on_login, flag=wx.TOP | wx.ALIGN_LEFT, border=14) dlg.sizer3.Add((1, 4)) if (sys.platform == "win32" and sys.getwindowsversion() >= (6, 1)): self.profile_load_by_os = wx.CheckBox(dlg, -1, lang.getstr("profile.load_on_login.handled_by_os")) self.profile_load_by_os.SetValue( bool(util_win.calibration_management_isenabled())) dlg.Bind(wx.EVT_CHECKBOX, self.profile_load_by_os_handler, id=self.profile_load_by_os.GetId()) dlg.sizer3.Add(self.profile_load_by_os, flag=wx.LEFT | wx.ALIGN_LEFT, border=16) dlg.sizer3.Add((1, 4)) self.profile_load_on_login_handler() if ((sys.platform == "darwin" or (sys.platform != "win32" and self.worker.argyll_version >= [1, 1, 0])) and (os.geteuid() == 0 or which("sudo"))) or \ (sys.platform == "win32" and sys.getwindowsversion() >= (6, ) and self.worker.argyll_version > [1, 1, 1]) or test: # Linux, OSX or Vista and later # NOTE: System install scope is currently not implemented # correctly in dispwin 1.1.0, but a patch is trivial and # should be in the next version # 2010-06-18: Do not offer system install in DisplayCAL when # installing via GCM or oyranos FIXME: oyranos-monitor can't # be run via sudo self.install_profile_user = wx.RadioButton( dlg, -1, lang.getstr("profile.install_user"), style=wx.RB_GROUP) self.install_profile_user.SetValue( getcfg("profile.install_scope") == "u") dlg.Bind(wx.EVT_RADIOBUTTON, self.install_profile_scope_handler, id=self.install_profile_user.GetId()) dlg.sizer3.Add(self.install_profile_user, flag=wx.TOP | wx.ALIGN_LEFT, border=10) self.install_profile_systemwide = wx.RadioButton( dlg, -1, lang.getstr("profile.install_local_system")) self.install_profile_systemwide.SetValue( getcfg("profile.install_scope") == "l") dlg.Bind(wx.EVT_RADIOBUTTON, self.install_profile_scope_handler, id=self.install_profile_systemwide.GetId()) dlg.sizer3.Add(self.install_profile_systemwide, flag=wx.TOP | wx.ALIGN_LEFT, border=4) if sys.platform == "darwin" and \ os.path.isdir("/Network/Library/ColorSync/Profiles"): self.install_profile_network = wx.RadioButton( dlg, -1, lang.getstr("profile.install_network")) self.install_profile_network.SetValue( getcfg("profile.install_scope") == "n") dlg.Bind(wx.EVT_RADIOBUTTON, self.install_profile_scope_handler, id=self.install_profile_network.GetId()) dlg.sizer3.Add(self.install_profile_network, flag=wx.TOP | wx.ALIGN_LEFT, border=4) self.install_profile_scope_handler(None) else: setcfg("profile.install_scope", "u") dlg.sizer0.SetSizeHints(dlg) dlg.sizer0.Layout() dlg.ok.SetDefault() dlg._disabler = BetterWindowDisabler([dlg, getattr(self, "lut_viewer", None)] + self.profile_info.values()) dlg.profile = profile dlg.profile_path = profile_path dlg.skip_scripts = skip_scripts dlg.preview = preview dlg.OnCloseIntercept = self.profile_finish_close_handler # Make sure we stay under our dialog self.Bind(wx.EVT_ACTIVATE, self.modaldlg_raise_handler) dlg.Show() else: if isinstance(result, Exception): show_result_dialog(result, self) if getcfg("dry_run"): return InfoDialog(self, msg=failure_msg, ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error")) if sys.platform == "darwin": # For some reason, the call to enable_menus() in Show() # sometimes isn't enough under Mac OS X (e.g. after calibrate & # profile) self.enable_menus() self.start_timers(True) setcfg("calibration.file.previous", None) def profile_finish_close_handler(self, event): if event.GetEventObject() == self.modaldlg: result = wx.ID_CANCEL else: result = event.GetId() lut3d = config.is_virtual_display() or self.install_3dlut # madVR has an API for installing 3D LUTs # Prisma has a HTTP REST interface for uploading and # configuring 3D LUTs install_3dlut_api = (getcfg("3dlut.format") == "madVR" or config.check_3dlut_format("Prisma")) if result != wx.ID_OK or lut3d: if self.modaldlg.preview: if getcfg("calibration.file", False): # Load LUT curves from last used .cal file self.load_cal(silent=True) if not getcfg("calibration.autoload"): # Reload display profile into videoLUT self.load_display_profile_cal(True, False) else: # Load LUT curves from current display profile (if any, # and if it contains curves) self.load_display_profile_cal(True) if getattr(self, "preview", None): self.preview.SetValue(False) if (result != wx.ID_OK or not self.lut3d_path or not os.path.isfile(self.lut3d_path) or not install_3dlut_api): self.profile_finish_consumer() if result == wx.ID_OK: producer = None if lut3d: if self.lut3d_path and os.path.isfile(self.lut3d_path): # 3D LUT file already exists if install_3dlut_api: filename = self.setup_patterngenerator(self.modaldlg, lang.getstr("3dlut.install"), True) if not filename: return producer = self.worker.install_3dlut wargs = (self.lut3d_path, filename) wkwargs = None progress_msg = lang.getstr("3dlut.install") else: # Copy to user-selectable location wx.CallAfter(self.lut3d_create_handler, None, copy_from_path=self.lut3d_path) else: # Need to create 3D LUT wx.CallAfter(self.lut3d_create_handler, None) else: if getcfg("profile.install_scope") in ("l", "n"): result = self.worker.authenticate("dispwin", lang.getstr("profile.install"), self.modaldlg) if result not in (True, None): if isinstance(result, Exception): show_result_dialog(result, parent=self.modaldlg) self.modaldlg.Raise() return producer = self.worker.install_profile wargs = () wkwargs = {"profile_path": self.modaldlg.profile_path, "skip_scripts": self.modaldlg.skip_scripts} progress_msg = lang.getstr("profile.install") if producer: safe_print("-" * 80) safe_print(progress_msg) self.worker.interactive = False self.worker.start(self.profile_finish_consumer, producer, wargs=wargs, wkwargs=wkwargs, parent=self.modaldlg, progress_msg=progress_msg, stop_timers=False, fancy=False) def profile_finish_consumer(self, result=None): if isinstance(result, Exception): show_result_dialog(result, parent=self.modaldlg) if not getcfg("dry_run") and not isinstance(result, (Info, Warning)): self.modaldlg.Raise() return elif result: # Check all profile install methods argyll_install, colord_install, oy_install, loader_install = result allgood = (argyll_install in (None, True) and colord_install in (None, True) and oy_install in (None, True) and loader_install in (None, True)) somegood = (argyll_install is True or colord_install is True or oy_install is True or loader_install is True) linux = sys.platform not in ("darwin", "win32") if allgood: msg = lang.getstr("profile.install.success") icon = "dialog-information" elif somegood and linux: msg = lang.getstr("profile.install.warning") icon = "dialog-warning" else: msg = lang.getstr("profile.install.error") icon = "dialog-error" dlg = InfoDialog(self.modaldlg, msg=msg, ok=lang.getstr("ok"), bitmap=geticon(32, icon), show=False) if not allgood and linux: sizer = wx.FlexGridSizer(0, 2, 8, 8) dlg.sizer3.Add(sizer, 1, flag=wx.TOP, border=12) for name, result in (("Argyll CMS", argyll_install), ("colord", colord_install), ("Oyranos", oy_install), (lang.getstr("profile_loader"), loader_install)): if result is not None: if result is True: icon = "checkmark" result = lang.getstr("ok") elif isinstance(result, Warning): icon = "dialog-warning" else: icon = "x" if not result: result = lang.getstr("failure") result = wrap(safe_unicode(result)) sizer.Add(wx.StaticBitmap(dlg, -1, geticon(16, icon)), flag=wx.TOP, border=2) sizer.Add(wx.StaticText(dlg, -1, ": ".join([name, result]))) dlg.sizer0.SetSizeHints(dlg) dlg.sizer0.Layout() dlg.ok.SetDefault() dlg.ShowModalThenDestroy(self.modaldlg) # Unbind automatic lowering self.Unbind(wx.EVT_ACTIVATE) self.Raise() del self.modaldlg._disabler self.modaldlg.Destroy() # The C part of modaldlg will not be gone instantly, so we must # dereference it before we can delete the python attribute self.modaldlg = None del self.modaldlg if sys.platform == "darwin": # For some reason, the call to enable_menus() in Show() # sometimes isn't enough under Mac OS X (e.g. after calibrate & # profile) self.enable_menus() self.start_timers(True) setcfg("calibration.file.previous", None) def profile_info_close_handler(self, event): if getattr(self, "show_profile_info", None): # If the profile install dialog is shown, just hide info window self.profile_info[event.GetEventObject().profileID].Hide() self.show_profile_info.SetValue(False) else: # Remove the frame from the hash table self.profile_info.pop(event.GetEventObject().profileID) # Closes the window event.Skip() def profile_info_handler(self, event=None, profile=None): if profile: pass elif (event and event.GetEventObject() is getattr(self, "show_profile_info", False)): # Use the profile that was requested to be installed profile = self.modaldlg.profile else: profile = self.select_profile(title=lang.getstr("profile.info"), check_profile_class=False, prefer_current_profile=True, ignore_current_profile=event and event.GetEventObject() is not self.profile_info_btn) if not profile: return if profile.ID == "\0" * 16: id = profile.calculateID(False) else: id = profile.ID show = (not getattr(self, "show_profile_info", None) or self.show_profile_info.GetValue()) if show: if not id in self.profile_info: # Create profile info window and store in hash table self.profile_info[id] = ProfileInfoFrame(None, -1) self.profile_info[id].Unbind(wx.EVT_CLOSE) self.profile_info[id].Bind(wx.EVT_CLOSE, self.profile_info_close_handler) if (not self.profile_info[id].profile or self.profile_info[id].profile.calculateID(False) != id): # Load profile if info window has no profile or ID is different self.profile_info[id].profileID = id self.profile_info[id].LoadProfile(profile) if self.profile_info.get(id): if self.profile_info[id].IsIconized() and show: self.profile_info[id].Restore() else: self.profile_info[id].Show(show) if show: self.profile_info[id].Raise() def get_commands(self): return (self.get_common_commands() + ["3DLUT-maker [create filename]", "calibrate", "calibrate-profile", "create-colorimeter-correction", "create-profile [filename]", "curve-viewer [filename]", appname + " [filename]", "enable-spyder2", "import-colorimeter-corrections [filename...]", "install-profile [filename]", "load ", "measure", "measure-uniformity", "measurement-report [filename]", "profile", "profile-info [filename]", "report-calibrated", "report-uncalibrated", "synthprofile [filename]", "testchart-editor [filename | create filename]", "verify-calibration"]) def process_data(self, data): """ Process data """ if not self.IsShownOnScreen() and data[0] != "measure": # If we were hidden, perform necessary cleanup in case the # measurement window is shown and we're not starting measurements if isinstance(getattr(self, "_measureframe_subprocess", None), sp.Popen): self._measureframe_subprocess.terminate() elif hasattr(self, "measureframe"): self.measureframe.close_handler(None) else: return "busy" response = "ok" if data[0] == "3DLUT-maker" and (len(data) == 1 or (len(data) == 3 and data[1] == "create")): # 3D LUT maker if len(data) == 3: self.lut3d_create_handler(None, data[-1]) else: self.tab_select_handler(self.lut3d_settings_btn, True) elif data[0] == "curve-viewer" and len(data) < 3: # Curve viewer profile = None if len(data) == 2: path = data[1] if not os.path.isfile(path) and not os.path.isabs(path): path = get_data_path(path) if not path: return "fail" try: profile = ICCP.ICCProfile(path) except (IOError, ICCP.ICCProfileInvalidError), exception: return "fail" wx.CallAfter(self.init_lut_viewer, profile=profile, show=True) elif data[0] == "profile-info" and len(data) < 3: # Profile info profile = None if len(data) == 2: path = data[1] if not os.path.isfile(path) and not os.path.isabs(path): path = get_data_path(path) if not path: return "fail" try: profile = ICCP.ICCProfile(path) except (IOError, ICCP.ICCProfileInvalidError), exception: return "fail" wx.CallAfter(self.profile_info_handler, profile=profile) elif data[0] == "synthprofile" and len(data) < 3: # Synthetic profile creator self.synthicc_create_handler(None) if len(data) == 2: response = self.synthiccframe.process_data(data) elif data[0] == "testchart-editor" and (len(data) < 3 or (len(data) == 3 and data[1] == "create")): # Testchart editor if len(data) == 2: path = data[1] if not os.path.isfile(path) and not os.path.isabs(path): path = get_data_path(path) if not path: return "fail" else: path = None if not hasattr(self, "tcframe"): self.init_tcframe(path=path) setcfg("tc.show", 1) self.tcframe.Show() else: if self.tcframe.IsIconized(): self.tcframe.Restore() else: self.tcframe.Show() if path: self.tcframe.tc_load_cfg_from_ti1(path=path) self.tcframe.Raise() if len(data) == 3: # Create testchart response = self.tcframe.process_data(data) elif (data[0] == appname and len(data) < 3) or (data[0] == "load" and len(data) == 2): # Main window if self.IsIconized(): self.Restore() self.Raise() if len(data) == 2: path = data[1] if not os.path.isfile(path) and not os.path.isabs(path): path = get_data_path(path) if not path: return "fail" else: self.droptarget.OnDropFiles(0, 0, [path]) elif data[0] == "calibrate" and len(data) == 1: # Calibrate wx.CallAfter(self.calibrate_btn_handler, CustomEvent(wx.EVT_BUTTON.evtType[0], self.calibrate_btn)) elif data[0] == "calibrate-profile" and len(data) == 1: # Calibrate & profile wx.CallAfter(self.calibrate_and_profile_btn_handler, CustomEvent(wx.EVT_BUTTON.evtType[0], self.calibrate_and_profile_btn)) elif data[0] == "create-profile" and len(data) < 3: if len(data) == 2: profile_path = data[1] else: profile_path = None wx.CallAfter(self.create_profile_handler, None, path=profile_path) elif data[0] == "import-colorimeter-corrections": wx.CallAfter(self.import_colorimeter_corrections_handler, None, paths=data[1:]) elif data[0] == "install-profile" and len(data) < 3: if len(data) == 2: wx.CallAfter(self.install_profile_handler, profile_path=data[1], install_3dlut=False) else: wx.CallAfter(self.select_install_profile_handler, None) elif data[0] == "measure" and len(data) == 1: # Start measurement if getattr(self, "pending_function", None): if isinstance(getattr(self, "_measureframe_subprocess", None), sp.Popen): p = self._measureframe_subprocess self._measureframe_subprocess = Dummy() self._measureframe_subprocess.returncode = 255 p.terminate() else: self.worker.wrapup(False) self.HideAll() self.call_pending_function() else: response = "fail" elif data[0] == "measurement-report" and len(data) < 3: # Measurement report if len(data) == 2: wx.CallAfter(self.measurement_report_handler, CustomEvent(wx.EVT_BUTTON.evtType[0], self.measurement_report_btn), path=data[1]) else: self.tab_select_handler(self.mr_settings_btn, True) elif data[0] == "profile" and len(data) == 1: # Profile wx.CallAfter(self.profile_btn_handler, CustomEvent(wx.EVT_BUTTON.evtType[0], self.profile_btn)) elif data[0] == "refresh" and len(data) == 1: # Refresh main window self.update_displays() self.update_controls() self.update_menus() if hasattr(self, "tcframe"): self.tcframe.tc_update_controls() elif data[0] == "restore-defaults": # Restore defaults wx.CallAfter(self.restore_defaults_handler, include=data[1:]) elif data[0] == "setlanguage" and len(data) == 2: setcfg("lang", data[1]) menuitem = self.menubar.FindItemById(lang.ldict[lang.getcode()].menuitem_id) event = CustomEvent(wx.EVT_MENU.typeId, menuitem) wx.CallAfter(self.set_language_handler, event) elif (data[0] in ("create-colorimeter-correction", "enable-spyder2", "measure-uniformity", "report-calibrated", "report-uncalibrated", "verify-calibration")) and len(data) == 1: wx.CallAfter(getattr(self, data[0].replace("-", "_") + "_handler"), True) else: response = "invalid" return response def modaldlg_raise_handler(self, event): """ Prevent modal dialog from being lowered (keep on top) """ self.modaldlg.Raise() def observer_ctrl_handler(self, event): observer = self.observers_ba.get(self.observer_ctrl.GetStringSelection()) setcfg("observer", observer) def init_lut_viewer(self, event=None, profile=None, show=None): if debug: safe_print("[D] init_lut_viewer", profile.getDescription() if profile else None, "show:", show) if LUTFrame: lut_viewer = getattr(self, "lut_viewer", None) if not lut_viewer: self.lut_viewer = LUTFrame(None, -1) self.lut_viewer.client.worker = self.worker self.lut_viewer.update_controls() self.lut_viewer.Bind(wx.EVT_CLOSE, self.lut_viewer_close_handler, self.lut_viewer) if not profile and not hasattr(self, "current_cal"): path = getcfg("calibration.file", False) if path: name, ext = os.path.splitext(path) if ext.lower() in (".icc", ".icm"): try: profile = ICCP.ICCProfile(path) except (IOError, ICCP.ICCProfileInvalidError), \ exception: msg = lang.getstr("profile.invalid") + "\n" + path if event or not lut_viewer: show_result_dialog(Error(msg), self) else: safe_print(msg) profile = None else: profile = cal_to_fake_profile(path) else: profile = get_display_profile() or False if show is None: show = not self.lut_viewer.IsShownOnScreen() if debug: safe_print("[D] init_lut_viewer (2)", profile.getDescription() if profile else None, "show:", show) self.show_lut_handler(profile=profile, show=show) def lut_viewer_load_lut(self, event=None, profile=None, force_draw=False): if debug: safe_print("[D] lut_viewer_load_lut", profile.getDescription() if profile else None, "force_draw:", force_draw) if LUTFrame: self.current_cal = profile if getattr(self, "lut_viewer", None) and \ (self.lut_viewer.IsShownOnScreen() or force_draw): self.lut_viewer.load_lut(profile) def show_lut_handler(self, event=None, profile=None, show=None): if debug: safe_print("[D] show_lut_handler", profile.getDescription() if profile else None, "show:", show) if show is None: show = bool((hasattr(self, "show_lut") and self.show_lut and self.show_lut.GetValue()) or (not hasattr(self, "show_lut") or not self.show_lut)) setcfg("lut_viewer.show", int(show)) if not profile and hasattr(self, "current_cal"): profile = self.current_cal if show: self.lut_viewer_load_lut(event, profile, force_draw=True) if getattr(self, "lut_viewer", None): self.menuitem_show_lut.Check(show) if self.lut_viewer.IsIconized() and show: self.lut_viewer.Restore() else: self.lut_viewer.Show(show) if show: self.lut_viewer.Raise() def lut_viewer_close_handler(self, event=None): setcfg("lut_viewer.show", 0) self.lut_viewer.Hide() self.menuitem_show_lut.Check(False) if hasattr(self, "show_lut") and self.show_lut: self.show_lut.SetValue(self.lut_viewer.IsShownOnScreen()) def show_advanced_options_handler(self, event=None): """ Show or hide advanced calibration settings """ show_advanced_options = bool(getcfg("show_advanced_options")) if event: show_advanced_options = not show_advanced_options setcfg("show_advanced_options", int(show_advanced_options)) self.panel.Freeze() self.menuitem_show_advanced_options.Check(show_advanced_options) self.override_display_settle_time_mult.Show( show_advanced_options and getcfg("argyll.version") >= "1.7") self.display_settle_time_mult.Show( show_advanced_options and getcfg("argyll.version") >= "1.7") for ctrl in (self.override_min_display_update_delay_ms, self.min_display_update_delay_ms, self.min_display_update_delay_ms_label, self.black_luminance_label, self.black_luminance_ctrl, # Profiling options self.black_point_compensation_cb, self.profile_type_label, self.profile_type_ctrl, self.gamap_btn): ctrl.GetContainingSizer().Show(ctrl, show_advanced_options) self.whitepoint_colortemp_locus_label.Show(show_advanced_options and self.whitepoint_ctrl.GetSelection() != 2) self.whitepoint_colortemp_locus_ctrl.Show(show_advanced_options and self.whitepoint_ctrl.GetSelection() != 2) self.black_luminance_textctrl.Show(show_advanced_options and bool(getcfg("calibration.black_luminance", False))) self.black_luminance_textctrl_label.Show(show_advanced_options and bool(getcfg("calibration.black_luminance", False))) self.lut3d_show_controls() if event: self.show_observer_ctrl() self.show_trc_controls() self.calpanel.Layout() self.calpanel.Refresh() self.panel.Thaw() if event: self.set_size(True) self.update_scrollbars() def show_observer_ctrl(self): self.panel.Freeze() show = bool((getcfg("calibration.interactive_display_adjustment", False) or getcfg("trc")) and getcfg("show_advanced_options") and self.worker.instrument_can_use_nondefault_observer()) self.observer_label.Show(show) self.observer_ctrl.Show(show) self.calpanel.Layout() self.panel.Thaw() self.update_scrollbars() def update_observer_ctrl(self): self.observer_ctrl.SetStringSelection(self.observers_ab[getcfg("observer")]) def install_profile_scope_handler(self, event): if self.install_profile_systemwide.GetValue(): setcfg("profile.install_scope", "l") if hasattr(self.modaldlg.ok, "SetAuthNeeded"): self.modaldlg.ok.SetAuthNeeded(True) elif sys.platform == "darwin" and \ os.path.isdir("/Network/Library/ColorSync/Profiles") and \ self.install_profile_network.GetValue(): setcfg("profile.install_scope", "n") elif self.install_profile_user.GetValue(): setcfg("profile.install_scope", "u") if hasattr(self.modaldlg.ok, "SetAuthNeeded"): self.modaldlg.ok.SetAuthNeeded(False) self.modaldlg.buttonpanel.Layout() def start_timers(self, wrapup=False): if wrapup: self.worker.wrapup(False) if not self.update_profile_name_timer.IsRunning(): self.update_profile_name_timer.Start(1000) def stop_timers(self): self.update_profile_name_timer.Stop() def synthicc_create_handler(self, event): """ Assign and initialize the synthetic ICC creation window """ if not getattr(self, "synthiccframe", None): self.init_synthiccframe() if self.synthiccframe.IsShownOnScreen(): if self.synthiccframe.IsIconized(): self.synthiccframe.Restore() self.synthiccframe.Raise() else: self.synthiccframe.Show(not self.synthiccframe.IsShownOnScreen()) def tab_select_handler(self, event, update_main_controls=False): if hasattr(event, "EventObject") and not event.EventObject.IsEnabled(): return self.panel.Freeze() btn2tab = {self.display_instrument_btn: self.display_instrument_panel, self.calibration_settings_btn: self.calibration_settings_panel, self.profile_settings_btn: self.profile_settings_panel, self.lut3d_settings_btn: self.lut3d_settings_panel, self.mr_settings_btn: self.mr_settings_panel} for btn, tab in btn2tab.iteritems(): if event.GetId() == btn.Id: if tab is self.mr_settings_panel and not tab.IsShown(): if not hasattr(self, "XYZbpin"): self.mr_init_controls() else: self.mr_update_controls() elif tab is self.lut3d_settings_panel and not tab.IsShown(): self.set_profile("output") self.lut3d_show_trc_controls() if hasattr(self, "install_profile_btn"): if tab is self.lut3d_settings_panel: self.install_profile_btn.SetToolTipString( lang.getstr("3dlut.install")) else: self.install_profile_btn.SetToolTipString( lang.getstr("profile.install")) tab.Show() btn._pressed = True btn._SetState(platebtn.PLATE_PRESSED) else: tab.Hide() btn._pressed = False btn._SetState(platebtn.PLATE_NORMAL) self.calpanel.Layout() if isinstance(event, wx.Event) or update_main_controls: self.update_main_controls() self.panel.Thaw() self.update_scrollbars() self.calpanel.Layout() def colorimeter_correction_matrix_ctrl_handler(self, event, path=None): measurement_mode = getcfg("measurement_mode") if (event and event.GetId() == self.colorimeter_correction_matrix_ctrl.GetId()): ccmx = getcfg("colorimeter_correction_matrix_file").split(":", 1) if self.colorimeter_correction_matrix_ctrl.GetSelection() == 0: # Off ccmx = ["", ""] elif self.colorimeter_correction_matrix_ctrl.GetSelection() == 1: # Auto ccmx = ["AUTO", ""] else: path = self.ccmx_item_paths[ self.colorimeter_correction_matrix_ctrl.GetSelection() - 2] ccmx = ["", path] setcfg("colorimeter_correction_matrix_file", ":".join(ccmx)) self.update_colorimeter_correction_matrix_ctrl_items() else: if not path: ccmx = getcfg("colorimeter_correction_matrix_file").split(":", 1) defaultDir, defaultFile = get_verified_path(None, ccmx.pop()) dlg = wx.FileDialog(self, lang.getstr("colorimeter_correction_matrix_file.choose"), defaultDir=defaultDir if defaultFile else config.get_argyll_data_dir(), defaultFile=defaultFile, wildcard=lang.getstr("filetype.ccmx") + "|*.ccmx;*.ccss", style=wx.FD_OPEN | wx.FD_FILE_MUST_EXIST) dlg.Center(wx.BOTH) if dlg.ShowModal() == wx.ID_OK: path = dlg.GetPath() dlg.Destroy() if path: if (getcfg("colorimeter_correction_matrix_file").split(":")[0] != "AUTO" or path not in self.ccmx_cached_paths): setcfg("colorimeter_correction_matrix_file", ":" + path) self.update_colorimeter_correction_matrix_ctrl_items(warn_on_mismatch=True) if measurement_mode != getcfg("measurement_mode"): # Check if black point correction should be turned on self.measurement_mode_ctrl_handler() def colorimeter_correction_web_handler(self, event): """ Check the web for cccmx or ccss files """ if self.worker.instrument_supports_ccss(): filetype = 'ccss,ccmx' else: filetype = 'ccmx' params = {'get': True, 'type': filetype, 'display': self.worker.get_display_name(False, True) or "Unknown", 'instrument': self.worker.get_instrument_name() or "Unknown"} self.worker.interactive = False self.worker.start(colorimeter_correction_web_check_choose, http_request, ckwargs={"parent": self}, wargs=(self, "colorimetercorrections." + domain, "GET", "/index.php", params), progress_msg=lang.getstr("colorimeter_correction.web_check"), stop_timers=False, cancelable=False, show_remaining_time=False, fancy=False) def create_colorimeter_correction_handler(self, event=None, paths=None, luminance=None): """ Create a CCSS or CCMX file from one or more .ti3 files Atleast one of the ti3 files must be a measured with a spectrometer. """ parent = self if event else None id_measure_reference = wx.NewId() id_measure_colorimeter = wx.NewId() if not paths: dlg = ConfirmDialog(parent, title=lang.getstr("colorimeter_correction.create"), msg=lang.getstr("colorimeter_correction.create.info"), ok=lang.getstr("colorimeter_correction.create"), cancel=lang.getstr("cancel"), alt=lang.getstr("browse"), bitmap=geticon(32, "dialog-information"), wrap=90) # Colorimeter correction type # We deliberately don't use RadioBox because there's no way to # set the correct background color (this matters under MSWindows # where the dialog background is usually white) unless you use # Phoenix. boxsizer = wx.StaticBoxSizer(wx.StaticBox(dlg, -1, lang.getstr("type")), wx.VERTICAL) dlg.sizer3.Add(boxsizer, 1, flag=wx.TOP | wx.EXPAND, border=12) if sys.platform not in ("darwin", "win32"): boxsizer.Add((1, 8)) dlg.correction_type_matrix = wx.RadioButton(dlg, -1, lang.getstr("matrix"), style=wx.RB_GROUP) boxsizer.Add(dlg.correction_type_matrix, flag=wx.ALL | wx.EXPAND, border=4) dlg.correction_type_spectral = wx.RadioButton(dlg, -1, lang.getstr("spectral") + " (i1 DisplayPro, " "ColorMunki " "Display, Spyder4/5)") boxsizer.Add(dlg.correction_type_spectral, flag=wx.ALL | wx.EXPAND, border=4) {"matrix": dlg.correction_type_matrix, "spectral": dlg.correction_type_spectral}.get( getcfg("colorimeter_correction.type"), "matrix").SetValue(True) # Get instruments reference_instruments = [] colorimeters = [] for instrument in self.worker.instruments: if instruments.get(instrument, {}).get("spectral"): reference_instruments.append(instrument) else: colorimeters.append(instrument) # Reference instrument boxsizer = wx.StaticBoxSizer(wx.StaticBox(dlg, -1, "%s (%s)" % (lang.getstr("instrument"), lang.getstr("reference"))), wx.VERTICAL) dlg.sizer3.Add(boxsizer, 1, flag=wx.TOP | wx.EXPAND, border=12) if sys.platform not in ("darwin", "win32"): boxsizer.Add((1, 8)) hsizer = wx.BoxSizer(wx.HORIZONTAL) boxsizer.Add(hsizer, flag=wx.EXPAND) dlg.reference_instrument = wx.Choice(dlg, -1, choices=reference_instruments) hsizer.Add(dlg.reference_instrument, 1, flag=wx.LEFT | wx.TOP | wx.BOTTOM | wx.ALIGN_CENTER_VERTICAL, border=4) hsizer.Add(wx.StaticText(dlg, -1, lang.getstr("measurement_mode")), flag=wx.LEFT | wx.RIGHT | wx.ALIGN_CENTER_VERTICAL, border=8) dlg.measurement_mode_reference = wx.Choice(dlg, -1, choices=[]) def set_ok_btn_state(): dlg.ok.Enable(bool(getcfg("last_reference_ti3_path", False) and os.path.isfile(getcfg("last_reference_ti3_path")) and ((getcfg("last_colorimeter_ti3_path", False) and os.path.isfile(getcfg("last_colorimeter_ti3_path"))) or dlg.correction_type_spectral.GetValue()))) def check_last_ccxx_ti3(event): cfgname = "colorimeter_correction.measurement_mode" if event.GetId() in (dlg.instrument.Id, dlg.measurement_mode.Id, dlg.observer_ctrl.Id): name = "colorimeter" instrument = dlg.instrument.GetStringSelection() measurement_mode = self.get_ccxx_measurement_modes( instrument, True).get(dlg.measurement_mode.GetStringSelection()) observer_ctrl = dlg.observer_ctrl else: name = "reference" cfgname += "." + name instrument = dlg.reference_instrument.GetStringSelection() if hasattr(dlg, "modes_ab"): measurement_mode = dlg.modes_ab["spect"][ dlg.measurement_mode_reference.GetSelection()] else: measurement_mode = None observer_ctrl = dlg.observer_reference_ctrl if self.worker.instrument_can_use_nondefault_observer(instrument): observer = self.observers_ba[observer_ctrl.GetStringSelection()] else: observer = None if getcfg("last_%s_ti3_path.backup" % name, False): setcfg("last_%s_ti3_path" % name, getcfg("last_%s_ti3_path.backup" % name)) setcfg("last_%s_ti3_path.backup" % name, None) ti3 = getcfg("last_%s_ti3_path" % name, False) if ti3: if os.path.isfile(ti3): try: cgats = CGATS.CGATS(ti3) except (IOError, CGATS.CGATSError), exception: show_result_dialog(exception, dlg) cgats = CGATS.CGATS() cgats_instrument = cgats.queryv1("TARGET_INSTRUMENT") if cgats_instrument: cgats_instrument = get_canonical_instrument_name( cgats_instrument) if name == "reference": if getcfg(cfgname + ".projector"): cgats_measurement_mode = "p" else: cgats_measurement_mode = getcfg(cfgname) else: cgats_measurement_mode = get_cgats_measurement_mode( cgats, cgats_instrument) if cgats_measurement_mode: instrument_features = self.worker.get_instrument_features(instrument) if (instrument_features.get("adaptive_mode") and getcfg(cfgname + ".adaptive")): cgats_measurement_mode += "V" if (instrument_features.get("highres_mode") and cgats.queryv1("SPECTRAL_BANDS") > 36): cgats_measurement_mode += "H" cgats_observer = cgats.queryv1("OBSERVER") if (cgats_instrument != instrument or cgats_measurement_mode != measurement_mode or cgats_observer != observer): setcfg("last_%s_ti3_path.backup" % name, getcfg("last_%s_ti3_path" % name)) setcfg("last_%s_ti3_path" % name, None) else: setcfg("last_%s_ti3_path" % name, None) ti3 = getcfg("last_%s_ti3_path" % name, False) if ti3: bmp = geticon(16, "checkmark") else: bmp = geticon(16, "empty") getattr(dlg, "measure_" + name).SetBitmapLabel(bmp) getattr(dlg, "measure_" + name).Refresh() getattr(dlg, "measure_" + name)._bmp.SetToolTipString(ti3 or "") if isinstance(event, wx.Event): set_ok_btn_state() dlg.measurement_mode_reference.Bind(wx.EVT_CHOICE, check_last_ccxx_ti3) hsizer.Add(dlg.measurement_mode_reference, flag=wx.RIGHT | wx.TOP | wx.BOTTOM | wx.ALIGN_CENTER_VERTICAL, border=8) # Make measure button height match instrument choice height btn_h = dlg.reference_instrument.Size[1] if sys.platform == "win32" and sys.getwindowsversion() < (6, 2): # Windows 7 / Vista / XP btn_h += 2 dlg.measure_reference = BitmapWithThemedButton(dlg, id_measure_reference, geticon(16, "empty"), lang.getstr("measure"), size=(-1, btn_h)) if sys.platform == "win32": dlg.measure_reference.SetBackgroundColour(dlg.BackgroundColour) dlg.measure_reference.Bind(wx.EVT_BUTTON, dlg.OnClose) hsizer.Add(dlg.measure_reference, flag=wx.RIGHT | wx.TOP | wx.BOTTOM | wx.ALIGN_CENTER_VERTICAL, border=4) dlg.measure_reference.Enable(bool(self.worker.displays and reference_instruments)) dlg.observer_reference_label = wx.StaticText(dlg, -1, lang.getstr("observer")) hsizer = wx.BoxSizer(wx.HORIZONTAL) boxsizer.Add(hsizer, flag=wx.BOTTOM, border=8) hsizer.Add(dlg.observer_reference_label, flag=wx.LEFT | wx.ALIGN_CENTER_VERTICAL, border=4) dlg.observer_reference_ctrl = wx.Choice(dlg, -1, choices=self.observers_ab.values()) dlg.observer_reference_ctrl.Bind(wx.EVT_CHOICE, check_last_ccxx_ti3) hsizer.Add(dlg.observer_reference_ctrl, flag=wx.LEFT | wx.ALIGN_CENTER_VERTICAL, border=8) dlg.observer_reference_ctrl.SetStringSelection( self.observers_ab[getcfg("colorimeter_correction.observer.reference")]) dlg.observer_reference_label.Show(bool(getcfg("show_advanced_options"))) dlg.observer_reference_ctrl.Show(bool(getcfg("show_advanced_options"))) def reference_instrument_handler(event): mode, modes, dlg.modes_ab, modes_ba = self.get_measurement_modes( dlg.reference_instrument.GetStringSelection(), "spect", "colorimeter_correction.measurement_mode.reference") dlg.measurement_mode_reference.SetItems(modes["spect"]) dlg.measurement_mode_reference.SetSelection( min(modes_ba["spect"].get(mode, 1), len(modes["spect"]) - 1)) dlg.measurement_mode_reference.Enable(len(modes["spect"]) > 1) boxsizer.Layout() if event: check_last_ccxx_ti3(event) instrument = getcfg("colorimeter_correction.instrument.reference") if instrument in reference_instruments: dlg.reference_instrument.SetStringSelection(instrument) elif reference_instruments: dlg.reference_instrument.SetSelection(0) else: dlg.measurement_mode_reference.Disable() if reference_instruments: reference_instrument_handler(None) if len(reference_instruments) < 2: dlg.reference_instrument.Disable() else: dlg.reference_instrument.Bind(wx.EVT_CHOICE, reference_instrument_handler) # Instrument boxsizer = wx.StaticBoxSizer(wx.StaticBox(dlg, -1, lang.getstr("instrument")), wx.VERTICAL) dlg.sizer3.Add(boxsizer, 1, flag=wx.TOP | wx.EXPAND, border=12) if sys.platform not in ("darwin", "win32"): boxsizer.Add((1, 8)) hsizer = wx.BoxSizer(wx.HORIZONTAL) boxsizer.Add(hsizer, flag=wx.EXPAND) dlg.instrument = wx.Choice(dlg, -1, choices=colorimeters) hsizer.Add(dlg.instrument, 1, flag=wx.LEFT | wx.TOP | wx.BOTTOM | wx.ALIGN_CENTER_VERTICAL, border=4) hsizer.Add(wx.StaticText(dlg, -1, lang.getstr("measurement_mode")), flag=wx.LEFT | wx.RIGHT | wx.ALIGN_CENTER_VERTICAL, border=8) dlg.measurement_mode = wx.Choice(dlg, -1, choices=[]) dlg.measurement_mode.Bind(wx.EVT_CHOICE, check_last_ccxx_ti3) hsizer.Add(dlg.measurement_mode, flag=wx.RIGHT | wx.TOP | wx.BOTTOM | wx.ALIGN_CENTER_VERTICAL, border=8) dlg.measure_colorimeter = BitmapWithThemedButton(dlg, id_measure_colorimeter, geticon(16, "empty"), lang.getstr("measure"), size=(-1, btn_h)) if sys.platform == "win32": dlg.measure_colorimeter.SetBackgroundColour(dlg.BackgroundColour) dlg.measure_colorimeter.Bind(wx.EVT_BUTTON, dlg.OnClose) hsizer.Add(dlg.measure_colorimeter, flag=wx.RIGHT | wx.TOP | wx.BOTTOM | wx.ALIGN_CENTER_VERTICAL, border=4) dlg.measure_colorimeter.Enable(bool(self.worker.displays and colorimeters)) dlg.observer_label = wx.StaticText(dlg, -1, lang.getstr("observer")) hsizer = wx.BoxSizer(wx.HORIZONTAL) boxsizer.Add(hsizer, flag=wx.BOTTOM, border=8) hsizer.Add(dlg.observer_label, flag=wx.LEFT | wx.ALIGN_CENTER_VERTICAL, border=4) dlg.observer_ctrl = wx.Choice(dlg, -1, choices=self.observers_ab.values()) dlg.observer_ctrl.Bind(wx.EVT_CHOICE, check_last_ccxx_ti3) hsizer.Add(dlg.observer_ctrl, flag=wx.LEFT | wx.ALIGN_CENTER_VERTICAL, border=8) dlg.observer_ctrl.SetStringSelection( self.observers_ab[getcfg("colorimeter_correction.observer")]) def show_observer_ctrl(): instrument_name = dlg.instrument.GetStringSelection() show = bool(getcfg("show_advanced_options") and self.worker.instrument_can_use_nondefault_observer(instrument_name) and getcfg("colorimeter_correction.observer") != defaults["colorimeter_correction.observer"]) dlg.observer_label.Show(show) dlg.observer_ctrl.Show(show) def instrument_handler(event): dlg.Freeze() modes = self.get_ccxx_measurement_modes( dlg.instrument.GetStringSelection()) dlg.measurement_mode.SetItems(modes.values()) dlg.measurement_mode.SetStringSelection( modes.get(getcfg("colorimeter_correction.measurement_mode"), modes.values()[-1])) dlg.measurement_mode.Enable(len(modes) > 1) show_observer_ctrl() boxsizer.Layout() if event: check_last_ccxx_ti3(event) dlg.sizer0.SetSizeHints(dlg) dlg.sizer0.Layout() dlg.Refresh() dlg.Thaw() instrument = getcfg("colorimeter_correction.instrument") if instrument in colorimeters: dlg.instrument.SetStringSelection(instrument) elif colorimeters: dlg.instrument.SetSelection(0) else: dlg.measurement_mode.Disable() if colorimeters: instrument_handler(None) if len(colorimeters) < 2: dlg.instrument.Disable() else: dlg.instrument.Bind(wx.EVT_CHOICE, instrument_handler) # Bind event handlers def correction_type_handler(event): dlg.Freeze() for item in list(boxsizer.Children) + [boxsizer.StaticBox]: if isinstance(item, (wx.SizerItem, wx.Window)): item.Show(dlg.correction_type_matrix.GetValue()) show_observer_ctrl() set_ok_btn_state() dlg.sizer0.SetSizeHints(dlg) dlg.sizer0.Layout() dlg.Refresh() dlg.Thaw() dlg.correction_type_matrix.Bind(wx.EVT_RADIOBUTTON, correction_type_handler) dlg.correction_type_spectral.Bind(wx.EVT_RADIOBUTTON, correction_type_handler) # Layout check_last_ccxx_ti3(dlg.measurement_mode_reference) check_last_ccxx_ti3(dlg.measurement_mode) correction_type_handler(None) result = dlg.ShowModal() if result in (id_measure_reference, id_measure_colorimeter): setcfg("colorimeter_correction.instrument.reference", dlg.reference_instrument.GetStringSelection()) mode, modes, modes_ab, modes_ba = self.get_measurement_modes( dlg.reference_instrument.GetStringSelection(), "spect", "colorimeter_correction.measurement_mode.reference") mode = modes_ab.get("spect", {}).get( dlg.measurement_mode_reference.GetSelection()) or "l" setcfg("colorimeter_correction.measurement_mode.reference", (strtr(mode, {"V": "", "H": ""}) if mode else None) or None) setcfg("colorimeter_correction.measurement_mode.reference.adaptive", 1 if mode and "V" in mode else 0) setcfg("colorimeter_correction.measurement_mode.reference.highres", 1 if mode and "H" in mode else 0) setcfg("colorimeter_correction.measurement_mode.reference.projector", 1 if mode and "p" in mode else None) observer = self.observers_ba.get(dlg.observer_reference_ctrl.GetStringSelection()) setcfg("colorimeter_correction.observer.reference", observer) observer = self.observers_ba.get(dlg.observer_ctrl.GetStringSelection()) setcfg("colorimeter_correction.observer", observer) setcfg("colorimeter_correction.instrument", dlg.instrument.GetStringSelection()) modes = self.get_ccxx_measurement_modes( dlg.instrument.GetStringSelection(), True) if dlg.measurement_mode.GetStringSelection() in modes: setcfg("colorimeter_correction.measurement_mode", modes[dlg.measurement_mode.GetStringSelection()]) elif result == wx.ID_OK: paths = [getcfg("last_reference_ti3_path")] if dlg.correction_type_matrix.GetValue(): paths.append(getcfg("last_colorimeter_ti3_path")) # Restore previous TI3 paths (if any) for name in ("colorimeter", "reference"): if getcfg("last_%s_ti3_path.backup" % name, False): setcfg("last_%s_ti3_path" % name, getcfg("last_%s_ti3_path.backup" % name)) setcfg("last_%s_ti3_path.backup" % name, None) if result != wx.ID_CANCEL: setcfg("colorimeter_correction.type", {True: "matrix", False: "spectral"}[dlg.correction_type_matrix.GetValue()]) dlg.Destroy() else: result = -1 if result == wx.ID_CANCEL: return elif result in (id_measure_reference, id_measure_colorimeter): # Select CCXX testchart ccxx_testchart = get_ccxx_testchart() if not ccxx_testchart: show_result_dialog(Error(lang.getstr("not_found", lang.getstr("ccxx.ti1"))), self) return if not is_ccxx_testchart(): # Backup testchart selection setcfg("testchart.file.backup", getcfg("testchart.file")) self.set_testchart(ccxx_testchart) # Backup instrument selection setcfg("comport.number.backup", getcfg("comport.number")) # Backup observer setcfg("observer.backup", getcfg("observer")) if result == id_measure_reference: # Switch to reference instrument setcfg("comport.number", self.worker.instruments.index( getcfg("colorimeter_correction.instrument.reference")) + 1) # Set measurement mode setcfg("measurement_mode", getcfg("colorimeter_correction.measurement_mode.reference")) setcfg("measurement_mode.adaptive", getcfg("colorimeter_correction.measurement_mode.reference.adaptive")) setcfg("measurement_mode.highres", getcfg("colorimeter_correction.measurement_mode.reference.highres")) setcfg("measurement_mode.projector", getcfg("colorimeter_correction.measurement_mode.reference.projector")) # Set observer setcfg("observer", getcfg("colorimeter_correction.observer.reference")) else: # Switch to colorimeter setcfg("comport.number", self.worker.instruments.index( getcfg("colorimeter_correction.instrument")) + 1) # Set measurement mode setcfg("measurement_mode", getcfg("colorimeter_correction.measurement_mode")) # Set observer setcfg("observer", getcfg("colorimeter_correction.observer")) self.measure_handler() return try: ccxx_testchart = get_ccxx_testchart() if not ccxx_testchart: raise Error(lang.getstr("not_found", lang.getstr("ccxx.ti1"))) ccxx = CGATS.CGATS(ccxx_testchart) except (Error, IOError, CGATS.CGATSInvalidError, CGATS.CGATSInvalidOperationError, CGATS.CGATSKeyError, CGATS.CGATSTypeError, CGATS.CGATSValueError), exception: show_result_dialog(exception, self) return cgats_list = [] reference_ti3 = None colorimeter_ti3 = None spectral = False if getcfg("colorimeter_correction.type") == "matrix": ti3_range = (0, 1) else: ti3_range = (0, ) for n in xrange(len(paths or ti3_range)): path = None if not paths: if reference_ti3: defaultDir, defaultFile = get_verified_path("last_colorimeter_ti3_path") msg = lang.getstr("measurement_file.choose.colorimeter") else: defaultDir, defaultFile = get_verified_path("last_reference_ti3_path") msg = lang.getstr("measurement_file.choose.reference") dlg = wx.FileDialog(parent, msg, defaultDir=defaultDir, defaultFile=defaultFile, wildcard=lang.getstr("filetype.ti3") + "|*.ti3;*.icm;*.icc", style=wx.FD_OPEN | wx.FD_FILE_MUST_EXIST) dlg.Center(wx.BOTH) if dlg.ShowModal() == wx.ID_OK: path = dlg.GetPath() dlg.Destroy() else: path = paths[n] if path: try: if os.path.splitext(path.lower())[1] in (".icm", ".icc"): profile = ICCP.ICCProfile(path) cgats = self.worker.ti1_lookup_to_ti3(ccxx, profile, pcs="x", intent="a")[1] cgats.add_keyword("DATA_SOURCE", profile.tags.get("meta", {}).get("DATA_source", {}).get("value", "").upper() or "Unknown") if cgats.DATA_SOURCE == "EDID": instrument = "EDID" else: targ = profile.tags.get("CIED", profile.tags.get("targ", "")) instrument = None if targ[0:4] == "CTI3": targ = CGATS.CGATS(targ) instrument = targ.queryv1("TARGET_INSTRUMENT") if not instrument: instrument = profile.tags.get("meta", {}).get("MEASUREMENT_device", {}).get("value", "Unknown") cgats.add_keyword("TARGET_INSTRUMENT", instrument) spectral = "YES" if instruments.get(get_canonical_instrument_name(cgats.TARGET_INSTRUMENT), {}).get("spectral", False) else "NO" cgats.add_keyword("INSTRUMENT_TYPE_SPECTRAL", spectral) cgats.ARGYLL_COLPROF_ARGS = CGATS.CGATS() cgats.ARGYLL_COLPROF_ARGS.key = "ARGYLL_COLPROF_ARGS" cgats.ARGYLL_COLPROF_ARGS.parent = cgats cgats.ARGYLL_COLPROF_ARGS.root = cgats cgats.ARGYLL_COLPROF_ARGS.type = "SECTION" display = profile.tags.get("meta", {}).get("EDID_model", {}).get("value", "").encode("UTF-7") manufacturer = profile.tags.get("meta", {}).get("EDID_manufacturer", {}).get("value", "").encode("UTF-7") cgats.ARGYLL_COLPROF_ARGS.add_data('-M "%s" -A "%s"' % (display, manufacturer)) cgats = CGATS.CGATS(str(cgats)) else: cgats = CGATS.CGATS(path) if not cgats.queryv1("DATA"): raise CGATS.CGATSError("Missing DATA") except Exception, exception: safe_print(exception) InfoDialog(self, title=lang.getstr("colorimeter_correction.create"), msg=lang.getstr("error.measurement.file_invalid", path), ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error")) return else: cgats_list.append(cgats) # Check if measurement contains spectral values # Check if instrument type is spectral if (cgats.queryv1("SPECTRAL_BANDS") or cgats.queryv1("DATA_SOURCE") == "EDID"): if reference_ti3: # We already have a reference ti3 reference_ti3 = None break reference_ti3 = cgats setcfg("last_reference_ti3_path", path) if cgats.queryv1("SPECTRAL_BANDS"): spectral = True if (event and getcfg("colorimeter_correction.type") == "matrix"): result = -1 else: result = wx.ID_OK if result == wx.ID_OK: break elif result == wx.ID_CANCEL: return elif cgats.queryv1("INSTRUMENT_TYPE_SPECTRAL") == "YES": if reference_ti3: # We already have a reference ti3 reference_ti3 = None break reference_ti3 = cgats setcfg("last_reference_ti3_path", path) elif cgats.queryv1("INSTRUMENT_TYPE_SPECTRAL") == "NO": if colorimeter_ti3: # We already have a colorimeter ti3 colorimeter_ti3 = None break colorimeter_ti3 = cgats setcfg("last_colorimeter_ti3_path", path) else: # User canceled dialog return # Check if atleast one file has been measured with a reference if not reference_ti3: InfoDialog(self, title=lang.getstr("colorimeter_correction.create"), msg=lang.getstr("error.measurement.one_reference"), ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error")) return if event: cfgname = "colorimeter_correction.measurement_mode" else: cfgname = "measurement_mode" if len(cgats_list) == 2: if not colorimeter_ti3: # If 2 files, check if atleast one file has NOT been measured # with a spectro (CCMX creation) InfoDialog(self, title=lang.getstr("colorimeter_correction.create"), msg=lang.getstr("error.measurement.one_colorimeter"), ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error")) return # Use only the device combinations from CCXX testchart reference_new = CGATS.CGATS("BEGIN_DATA\nEND_DATA") reference_new.DATA_FORMAT = reference_ti3.queryv1("DATA_FORMAT") colorimeter_new = CGATS.CGATS("BEGIN_DATA\nEND_DATA") colorimeter_new.DATA_FORMAT = colorimeter_ti3.queryv1("DATA_FORMAT") data_reference = reference_ti3.queryv1("DATA") data_colorimeter = colorimeter_ti3.queryv1("DATA") required = ccxx.queryv(("RGB_R", "RGB_G", "RGB_B")) devicecombination2name = {"RGB_R=100 RGB_G=100 RGB_B=100": "white", "RGB_R=100 RGB_G=0 RGB_B=0": "red", "RGB_R=0 RGB_G=100 RGB_B=0": "green", "RGB_R=0 RGB_G=0 RGB_B=100": "blue"} for i, values in required.iteritems(): patch = OrderedDict([("RGB_R", values[0]), ("RGB_G", values[1]), ("RGB_B", values[2])]) devicecombination = " ".join(["=".join([key, "%i" % value]) for key, value in patch.iteritems()]) name = devicecombination2name.get(devicecombination, devicecombination) item = data_reference.queryi1(patch) if item: reference_new.DATA.add_data(item) else: show_result_dialog(lang.getstr("error.testchart.missing_fields", (os.path.basename(reference_ti3.filename), lang.getstr(name)))) return item = data_colorimeter.queryi1(patch) if item: colorimeter_new.DATA.add_data(item) else: show_result_dialog(lang.getstr("error.testchart.missing_fields", (os.path.basename(colorimeter_ti3.filename), lang.getstr(name)))) return reference_ti3.queryi1("DATA").DATA = reference_new.DATA colorimeter_ti3.queryi1("DATA").DATA = colorimeter_new.DATA # If the reference comes from EDID, normalize luminance if reference_ti3.queryv1("DATA_SOURCE") == "EDID": white = colorimeter_ti3.queryi1("DATA").queryi1({"RGB_R": 100, "RGB_G": 100, "RGB_B": 100}) if luminance: scale = luminance / 100.0 else: scale = 1.0 white = " ".join([str(v) for v in (white["XYZ_X"] * scale, white["XYZ_Y"] * scale, white["XYZ_Z"] * scale)]) colorimeter_ti3.queryi1("DATA").LUMINANCE_XYZ_CDM2 = white # Add display base ID if missing self.worker.check_add_display_type_base_id(colorimeter_ti3, cfgname) elif not spectral: # If 1 file, check if it contains spectral values (CCSS creation) InfoDialog(self, title=lang.getstr("colorimeter_correction.create"), msg=lang.getstr("error.measurement.missing_spectral"), ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error")) return # Add display type for cgats in cgats_list: if not cgats.queryv1("DISPLAY_TYPE_REFRESH"): cgats[0].add_keyword("DISPLAY_TYPE_REFRESH", {"c": "YES", "l": "NO"}.get(getcfg(cfgname), "NO")) safe_print("Added DISPLAY_TYPE_REFRESH %r" % cgats[0].DISPLAY_TYPE_REFRESH) options_dispcal, options_colprof = get_options_from_ti3(reference_ti3) display = None manufacturer = None manufacturer_display = None for option in options_colprof: if option.startswith("M"): display = option[1:].strip(' "') elif option.startswith("A"): manufacturer = option[1:].strip(' "') if manufacturer: quirk_manufacturer = colord.quirk_manufacturer(manufacturer) if (manufacturer and display and not quirk_manufacturer.lower() in display.lower()): manufacturer_display = " ".join([quirk_manufacturer, display]) elif display: manufacturer_display = display if len(cgats_list) == 2: instrument = colorimeter_ti3.queryv1("TARGET_INSTRUMENT") if instrument: instrument = safe_unicode(instrument, "UTF-8") instrument = get_canonical_instrument_name(instrument) description = "%s & %s" % (instrument or self.worker.get_instrument_name(), manufacturer_display or self.worker.get_display_name(True)) else: description = manufacturer_display or self.worker.get_display_name(True) target_instrument = reference_ti3.queryv1("TARGET_INSTRUMENT") if target_instrument: target_instrument = safe_unicode(target_instrument, "UTF-8") target_instrument = get_canonical_instrument_name(target_instrument) description = "%s (%s)" % (description, target_instrument) args = [] tech = {"YES": "Unknown"}.get(reference_ti3.queryv1("DISPLAY_TYPE_REFRESH"), "LCD") if self.worker.argyll_version >= [1, 7, 1]: technology_strings = technology_strings_171 else: technology_strings = technology_strings_170 if event: # Allow user to alter description, display and instrument dlg = ConfirmDialog( parent, title=lang.getstr("colorimeter_correction.create"), msg=lang.getstr("colorimeter_correction.create.details"), ok=lang.getstr("ok"), cancel=lang.getstr("cancel"), bitmap=geticon(32, "dialog-information")) boxsizer = wx.StaticBoxSizer(wx.StaticBox(dlg, -1, lang.getstr("description")), wx.VERTICAL) dlg.sizer3.Add(boxsizer, 1, flag=wx.TOP | wx.EXPAND, border=12) if sys.platform not in ("darwin", "win32"): boxsizer.Add((1, 8)) dlg.description_txt_ctrl = wx.TextCtrl(dlg, -1, description, size=(400, -1)) boxsizer.Add(dlg.description_txt_ctrl, 1, flag=wx.ALL | wx.ALIGN_LEFT | wx.EXPAND, border=4) if not display: boxsizer = wx.StaticBoxSizer(wx.StaticBox(dlg, -1, lang.getstr("display")), wx.VERTICAL) dlg.sizer3.Add(boxsizer, 1, flag=wx.TOP | wx.EXPAND, border=12) if sys.platform not in ("darwin", "win32"): boxsizer.Add((1, 8)) dlg.display_txt_ctrl = wx.TextCtrl(dlg, -1, self.worker.get_display_name(True, True), size=(400, -1)) boxsizer.Add(dlg.display_txt_ctrl, 1, flag=wx.ALL | wx.ALIGN_LEFT | wx.EXPAND, border=4) if not manufacturer: boxsizer = wx.StaticBoxSizer(wx.StaticBox(dlg, -1, lang.getstr("display.manufacturer")), wx.VERTICAL) dlg.sizer3.Add(boxsizer, 1, flag=wx.TOP | wx.EXPAND, border=12) if sys.platform not in ("darwin", "win32"): boxsizer.Add((1, 8)) dlg.manufacturer_txt_ctrl = wx.TextCtrl(dlg, -1, self.worker.get_display_edid().get("manufacturer", ""), size=(400, -1)) boxsizer.Add(dlg.manufacturer_txt_ctrl, 1, flag=wx.ALL | wx.ALIGN_LEFT | wx.EXPAND, border=4) # Display technology boxsizer = wx.StaticBoxSizer(wx.StaticBox(dlg, -1, lang.getstr("display.tech")), wx.VERTICAL) dlg.sizer3.Add(boxsizer, 1, flag=wx.TOP | wx.EXPAND, border=12) if sys.platform not in ("darwin", "win32"): boxsizer.Add((1, 8)) loctech = {} techloc = {} for technology_string in technology_strings.values(): key = technology_string.lower().replace(" ", "_") loc = lang.getstr(key) if loc == key: loc = technology_string loctech[loc] = technology_string techloc[technology_string] = loc dlg.display_tech_ctrl = wx.Choice(dlg, -1, choices=sorted(loctech.keys())) dlg.display_tech_ctrl.SetStringSelection(techloc[tech]) boxsizer.Add(dlg.display_tech_ctrl, flag=wx.ALL | wx.ALIGN_LEFT | wx.EXPAND, border=4) dlg.description_txt_ctrl.SetFocus() dlg.sizer0.SetSizeHints(dlg) dlg.sizer0.Layout() dlg.Center() result = dlg.ShowModal() description = safe_str(dlg.description_txt_ctrl.GetValue().strip(), "UTF-8") if not display: display = dlg.display_txt_ctrl.GetValue() if (dlg.display_tech_ctrl.IsEnabled() and dlg.display_tech_ctrl.GetStringSelection()): tech = loctech[dlg.display_tech_ctrl.GetStringSelection()] if not manufacturer: manufacturer = dlg.manufacturer_txt_ctrl.GetValue() dlg.Destroy() else: result = wx.ID_OK description += " AUTO" args.extend(["-E", description]) args.extend(["-I", safe_str(display.strip(), "UTF-8")]) ccxxmake_version = get_argyll_version("ccxxmake") if reference_ti3 and (not colorimeter_ti3 or ccxxmake_version >= [1, 7]): if ccxxmake_version >= [1, 7]: args.extend(["-t", dict((v, k) for k, v in technology_strings.iteritems())[tech]]) else: args.extend(["-T", safe_str(tech, "UTF-8")]) if result != wx.ID_OK: return # Prepare our files cwd = self.worker.create_tempdir() ti3_tmp_names = [] if reference_ti3: reference_ti3.write(os.path.join(cwd, 'reference.ti3')) ti3_tmp_names.append('reference.ti3') if colorimeter_ti3: # Create CCMX colorimeter_ti3.write(os.path.join(cwd, 'colorimeter.ti3')) ti3_tmp_names.append('colorimeter.ti3') name = "correction" ext = ".ccmx" # CCSS-capable instruments enable creating a CCMX that maps from # non-standard observer A used for the colorimeter measurements # to non-standard observer B used for the reference measurements. # To get correct readings (= matching reference observer B) when # using such a CCMX, observer A needs to be used, not observer B. observer = colorimeter_ti3.queryv1("OBSERVER") reference_observer = reference_ti3.queryv1("OBSERVER") else: # Create CCSS args.append("-S") name = "calibration" ext = ".ccss" observer = None reference_observer = None args.append("-f") args.append(",".join(ti3_tmp_names)) args.append(name + ext) result = self.worker.create_ccxx(args, cwd) source = os.path.join(self.worker.tempdir, name + ext) if isinstance(result, Exception): show_result_dialog(result, self) elif result and os.path.isfile(source): # Important: Do not use parsed CGATS, order of keywords may be # different than raw data so MD5 will be different try: cgatsfile = open(source, "rb") except Exception, exception: show_result_dialog(exception, self) self.worker.wrapup(False) return cgats = universal_newlines(cgatsfile.read()) cgatsfile.close() if (reference_ti3[0].get("TARGET_INSTRUMENT") and not re.search('\nREFERENCE\s+".+?"\n', cgats)): # By default, CCSS files don't contain reference instrument cgats = re.sub('(\nDISPLAY\s+"[^"]*"\n)', '\nREFERENCE "%s"\\1' % reference_ti3[0].get("TARGET_INSTRUMENT"), cgats) if not re.search('\nTECHNOLOGY\s+".+?"\n', cgats) and tech: # By default, CCMX files don't contain technology string cgats = re.sub('(\nDISPLAY\s+"[^"]*"\n)', '\nTECHNOLOGY "%s"\\1' % safe_str(tech, "UTF-8"), cgats) manufacturer_id = None if manufacturer: if not pnpidcache: # Populate pnpidcache get_manufacturer_name("???") manufacturers = dict([name, id] for id, name in pnpidcache.iteritems()) manufacturer_id = manufacturers.get(manufacturer) if manufacturer_id and not re.search('\nMANUFACTURER_ID\s+".+?"\n', cgats): # By default, CCMX/CCSS files don't contain manufacturer ID cgats = re.sub('(\nDISPLAY\s+"[^"]*"\n)', '\nMANUFACTURER_ID "%s"\\1' % safe_str(manufacturer_id, "UTF-8"), cgats) if manufacturer and not re.search('\nMANUFACTURER\s+".+?"\n', cgats): # By default, CCMX/CCSS files don't contain manufacturer cgats = re.sub('(\nDISPLAY\s+"[^"]*"\n)', '\nMANUFACTURER "%s"\\1' % safe_str(manufacturer, "UTF-8"), cgats) if observer and not re.search('\nOBSERVER\s+".+?"\n', cgats): # By default, CCMX/CCSS files don't contain observer cgats = re.sub('(\nDISPLAY\s+"[^"]*"\n)', '\nOBSERVER "%s"\\1' % safe_str(observer, "UTF-8"), cgats) if (reference_observer and not re.search('\nREFERENCE_OBSERVER\s+".+?"\n', cgats)): # By default, CCMX/CCSS files don't contain observer cgats = re.sub('(\nDISPLAY\s+"[^"]*"\n)', '\nREFERENCE_OBSERVER "%s"\\1' % safe_str(reference_observer, "UTF-8"), cgats) result = check_create_dir(config.get_argyll_data_dir()) if isinstance(result, Exception): show_result_dialog(result, self) self.worker.wrapup(False) return if event: if colorimeter_ti3: # CCMX # Show reference vs corrected colorimeter values along with # delta E matrix = colormath.Matrix3x3() ccmx = CGATS.CGATS(cgats) for i, sample in ccmx.queryv1("DATA").iteritems(): matrix.append([]) for component in "XYZ": matrix[i].append(sample["XYZ_%s" % component]) dlg = ConfirmDialog(parent, msg=lang.getstr("colorimeter_correction.create.success"), ok=lang.getstr("save"), cancel=lang.getstr("testchart.discard"), bitmap=geticon(32, "dialog-information")) sizer = wx.BoxSizer(wx.HORIZONTAL) dlg.sizer3.Add(sizer, 1, flag=wx.TOP | wx.EXPAND, border=12) labels = ("%s (%s)" % (get_canonical_instrument_name( reference_ti3.queryv1("TARGET_INSTRUMENT") or lang.getstr("instrument")), lang.getstr("reference")), "%s (%s)" % (get_canonical_instrument_name( ccmx.queryv1("INSTRUMENT") or lang.getstr("instrument")), lang.getstr("corrected"))) scale = getcfg("app.dpi") / config.get_default_dpi() if scale < 1: scale = 1 for i, label in enumerate(labels): txt = wx.StaticText(dlg, -1, label, size=(80 * scale * (3 + i), -1), style=wx.ALIGN_CENTER_HORIZONTAL) font = txt.Font font.SetWeight(wx.BOLD) txt.Font = font sizer.Add(txt, flag=wx.LEFT, border=40) if "gtk3" in wx.PlatformInfo: style = wx.BORDER_SIMPLE else: style = wx.BORDER_THEME grid = CustomGrid(dlg, -1, size=(640 * scale + wx.SystemSettings_GetMetric(wx.SYS_VSCROLL_X), -1), style=style) grid.Size = grid.Size[0], grid.GetDefaultRowSize() * 4 dlg.sizer3.Add(grid, flag=wx.TOP | wx.ALIGN_LEFT, border=4) grid.DisableDragColSize() grid.DisableDragRowSize() grid.SetCellHighlightPenWidth(0) grid.SetCellHighlightROPenWidth(0) grid.SetColLabelSize(grid.GetDefaultRowSize()) grid.SetDefaultCellAlignment(wx.ALIGN_CENTER, wx.ALIGN_CENTER) grid.SetMargins(0, 0) grid.SetRowLabelAlignment(wx.ALIGN_RIGHT, wx.ALIGN_CENTER) grid.SetRowLabelSize(40) grid.SetScrollRate(0, 5) grid.draw_horizontal_grid_lines = False grid.draw_vertical_grid_lines = False grid.EnableEditing(False) grid.EnableGridLines(False) grid.CreateGrid(0, 9) for i, label in enumerate(["x", "y", "Y", "", "", "x", "y", "Y", u"ΔE*00"]): if i in (3, 4): # Rectangular (width = height) size = grid.GetDefaultRowSize() else: size = 80 * scale grid.SetColSize(i, size) grid.SetColLabelValue(i, label) grid.BeginBatch() white_abs = [] for j, meas in enumerate((reference_ti3, colorimeter_ti3)): # Get absolute whitepoint white = (meas.queryv1("LUMINANCE_XYZ_CDM2") or colormath.get_whitepoint("D65", scale=100)) if isinstance(white, basestring): white = [float(v) for v in white.split()] white_abs.append(white) white_ref = [v / white_abs[0][1] for v in white_abs[0]] ref_data = reference_ti3.queryv1("DATA") tgt_data = colorimeter_ti3.queryv1("DATA") for i, ref in ref_data.iteritems(): tgt = tgt_data[i] grid.AppendRows(1) row = grid.GetNumberRows() - 1 grid.SetRowLabelValue(row, "%d" % ref.SAMPLE_ID) XYZ = [] XYZabs = [] for j, sample in enumerate((ref, tgt)): # Get samples XYZ.append([]) for component in "XYZ": XYZ[j].append(sample["XYZ_%s" % component]) # Scale to absolute brightness XYZabs.append(list(XYZ[j])) for k, value in enumerate(XYZabs[j]): XYZabs[j][k] = value * white_abs[j][1] / 100.0 if j == 1: # Apply matrix to colorimeter measurements XYZabs[j] = matrix * XYZabs[j] # Set cell values for k, value in enumerate(colormath.XYZ2xyY(*XYZabs[j])): grid.SetCellValue(row, j * 5 + k, "%.4f" % value) # Show sRGB approximation of measured patch X, Y, Z = [v / max(white_abs[0][1], (matrix * white_abs[1])[1]) for v in XYZabs[j]] # Adapt from reference white to D65 X, Y, Z = colormath.adapt(X, Y, Z, white_ref, "D65") # Convert XYZ to sRGB RGB = [int(round(v)) for v in colormath.XYZ2RGB(X, Y, Z, scale=255)] grid.SetCellBackgroundColour(row, 3 + j, wx.Colour(*RGB)) if debug or verbose > 1: safe_print("ref %.6f %.6f %.6f, " % tuple(XYZabs[0]), "col %.6f %.6f %.6f" % tuple(XYZabs[1])) Lab_ref = colormath.XYZ2Lab(*XYZabs[0] + [white_abs[0]]) Lab_tgt = colormath.XYZ2Lab(*XYZabs[1] + [white_abs[0]]) if debug or verbose > 1: safe_print("ref Lab %.6f %.6f %.6f, " % Lab_ref, "col Lab %.6f %.6f %.6f" % Lab_tgt) grid.SetCellValue(row, 8, "%.4f" % colormath.delta(*Lab_ref + Lab_tgt + ("00", ))["E"]) grid.DefaultCellBackgroundColour = grid.LabelBackgroundColour grid.EndBatch() dlg.sizer0.SetSizeHints(dlg) dlg.sizer0.Layout() if dlg.ShowModal() != wx.ID_OK: self.worker.wrapup(False) return if colorimeter_correction_check_overwrite(self, cgats, True): self.upload_colorimeter_correction(cgats) else: path = get_cgats_path(cgats) with open(path, "wb") as cgatsfile: cgatsfile.write(cgats) setcfg("colorimeter_correction_matrix_file", ":" + path) elif result is not None: InfoDialog(self, title=lang.getstr("colorimeter_correction.create"), msg=lang.getstr("colorimeter_correction.create.failure") + "\n" + "\n".join(self.worker.errors), ok=lang.getstr("cancel"), bitmap=geticon(32, "dialog-error")) self.worker.wrapup(False) return True def upload_colorimeter_correction(self, cgats): """ Ask the user if he wants to upload a colorimeter correction to the online database. Upload the file. """ dlg = ConfirmDialog(self, msg=lang.getstr("colorimeter_correction.upload.confirm"), ok=lang.getstr("ok"), cancel=lang.getstr("cancel"), bitmap=geticon(32, "dialog-information")) result = dlg.ShowModal() dlg.Destroy() if result == wx.ID_OK: params = {"cgats": cgats} # Upload correction self.worker.interactive = False self.worker.start(lambda result: result, upload_colorimeter_correction, wargs=(self, params), progress_msg=lang.getstr("colorimeter_correction.upload"), stop_timers=False, cancelable=False, show_remaining_time=False, fancy=False) def upload_colorimeter_correction_handler(self, event): """ Let user choose a ccss/ccmx file to upload """ path = None defaultDir, defaultFile = get_verified_path("last_filedialog_path") dlg = wx.FileDialog(self, lang.getstr("colorimeter_correction_matrix_file.choose"), defaultDir=defaultDir, defaultFile=defaultFile, wildcard=lang.getstr("filetype.ccmx") + "|*.ccmx;*.ccss", style=wx.FD_OPEN | wx.FD_FILE_MUST_EXIST) dlg.Center(wx.BOTH) if dlg.ShowModal() == wx.ID_OK: path = dlg.GetPath() dlg.Destroy() if path: setcfg("last_filedialog_path", path) # Important: Do not use parsed CGATS, order of keywords may be # different than raw data so MD5 will be different cgatsfile = open(path, "rb") cgats = cgatsfile.read() cgatsfile.close() originator = re.search('\nORIGINATOR\s+"Argyll', cgats) if not originator: InfoDialog(self, msg=lang.getstr("colorimeter_correction.upload.deny"), ok=lang.getstr("cancel"), bitmap=geticon(32, "dialog-error")) else: self.upload_colorimeter_correction(cgats) def comport_ctrl_handler(self, event=None, force=False): if debug and event: safe_print("[D] comport_ctrl_handler called for ID %s %s event " "type %s %s" % (event.GetId(), getevtobjname(event, self), event.GetEventType(), getevttype(event))) if self.comport_ctrl.GetSelection() > -1: setcfg("comport.number", self.comport_ctrl.GetSelection() + 1) self.menuitem_calibrate_instrument.Enable( bool(self.worker.get_instrument_features().get("sensor_cal"))) self.update_measurement_modes() self.update_colorimeter_correction_matrix_ctrl() self.update_colorimeter_correction_matrix_ctrl_items(force) def import_colorimeter_corrections_handler(self, event, paths=None, callafter=None, callafter_args=()): """ Convert correction matrices from other profiling softwares to Argyll's CCMX or CCSS format (or to spyd4cal.bin in case of the Spyder4/5) Currently supported: iColor Display (native import to CCMX), i1 Profiler (import to CCSS via Argyll CMS >= 1.3.4) Spyder4/5 (import to spyd4cal.bin via Argyll CMS >= 1.3.6) """ msg = " ".join([lang.getstr("oem.import.auto"), lang.getstr("oem.import.auto.download_selection")]) if sys.platform == "win32": msg = " ".join([lang.getstr("oem.import.auto_windows"), msg]) result = None i1d3 = False i1d3ccss = None spyd4 = False spyd4en = None icd = False oeminst = get_argyll_util("oeminst") importers = [] if not oeminst: i1d3ccss = get_argyll_util("i1d3ccss") spyd4en = get_argyll_util("spyd4en") dlg = ConfirmDialog(self, title=lang.getstr("colorimeter_correction.import"), msg=msg, ok=lang.getstr("auto"), cancel=lang.getstr("cancel"), bitmap=geticon(32, "dialog-information"), alt=lang.getstr("file.select")) dlg.sizer3.Add((1, 8)) for (name, desc, instruments, importer) in [("i1d3", "i1 Profiler", ("i1 DisplayPro, ColorMunki Display", "Spyder4", "Spyder5"), i1d3ccss or oeminst), ("icd", "iColor Display", ("DTP94", "i1 Display 2", "Spyder2", "Spyder3"), True), ("spyd4", "Spyder4/5", ("Spyder4", "Spyder5"), spyd4en or oeminst)]: if importer: for instrument in instruments: if instrument not in desc: desc += " (%s)" % ", ".join(instruments) break setattr(dlg, name, wx.CheckBox(dlg, -1, desc)) for instrument in instruments: if instruments == ("i1 DisplayPro, ColorMunki Display", "Spyder4", "Spyder5"): check = "" in self.ccmx_instruments.itervalues() elif instruments == ("Spyder4", "Spyder5"): check = self.worker.spyder4_cal_exists() else: check = instrument in self.ccmx_instruments.itervalues() if instrument in self.worker.instruments and not check: getattr(dlg, name).SetValue(True) break dlg.sizer3.Add(getattr(dlg, name), flag=wx.TOP | wx.ALIGN_LEFT, border=8) dlg.install_user = wx.RadioButton(dlg, -1, lang.getstr("install_user"), style=wx.RB_GROUP) dlg.install_user.SetValue(True) dlg.sizer3.Add(dlg.install_user, flag=wx.TOP | wx.ALIGN_LEFT, border=16) dlg.install_systemwide = wx.RadioButton(dlg, -1, lang.getstr("install_local_system")) dlg.install_user.Bind(wx.EVT_RADIOBUTTON, install_scope_handler) dlg.install_systemwide.Bind(wx.EVT_RADIOBUTTON, install_scope_handler) install_scope_handler(dlg=dlg) dlg.sizer3.Add(dlg.install_systemwide, flag=wx.TOP | wx.ALIGN_LEFT, border=4) dlg.sizer0.SetSizeHints(dlg) dlg.sizer0.Layout() if event: choice = dlg.ShowModal() elif paths: choice = wx.ID_ANY else: choice = wx.ID_OK for name, importer in [("i1d3", i1d3ccss or oeminst), ("spyd4", spyd4en or oeminst), ("icd", True)]: if importer and getattr(dlg, name).GetValue(): importers.append((name, importer)) asroot = dlg.install_systemwide.GetValue() dlg.Destroy() if choice == wx.ID_CANCEL: return if choice != wx.ID_OK and not paths: dlg = wx.FileDialog(self, lang.getstr("colorimeter_correction.import.choose"), wildcard=lang.getstr("filetype.any") + "|*.cab;*.edr;*.exe;*.txt", style=wx.FD_OPEN | wx.FD_FILE_MUST_EXIST) dlg.Center(wx.BOTH) choice2 = dlg.ShowModal() paths = [dlg.GetPath()] dlg.Destroy() if choice2 != wx.ID_OK: return elif not paths: paths = [] if asroot: result = self.worker.authenticate(oeminst or i1d3ccss or spyd4en, lang.getstr("colorimeter_correction.import"), self) if result not in (True, None): if isinstance(result, Exception): show_result_dialog(result, self) return self.worker.interactive = False self.worker.start(self.import_colorimeter_corrections_consumer, self.import_colorimeter_corrections_producer, cargs=(callafter, callafter_args), wargs=(result, i1d3, i1d3ccss, spyd4, spyd4en, icd, oeminst, paths, choice == wx.ID_OK, asroot, importers), progress_msg=lang.getstr("colorimeter_correction.import"), fancy=False) return (event and None) or True def import_colorimeter_correction(self, result, i1d3, i1d3ccss, spyd4, spyd4en, icd, oeminst, path, asroot): """ Import colorimter correction(s) from path """ if path and os.path.exists(path): filename, ext = os.path.splitext(path) kind = None if ext.lower() == ".txt": kind = "icd" result = True else: icolordisplay = "icolordisplay" in os.path.basename(path).lower() if ext.lower() == ".dmg": if icolordisplay: kind = "icd" result = self.worker.exec_cmd(which("hdiutil"), ["attach", path], capture_output=True, skip_scripts=True) if result and not isinstance(result, Exception): for path in glob.glob(os.path.join(os.path.sep, "Volumes", "iColorDisplay*", "iColorDisplay*.app", "Contents", "Resources", "DeviceCorrections.txt")): break else: result = Error(lang.getstr("file.missing", "DeviceCorrections.txt")) elif i1d3ccss and ext.lower() == ".edr": kind = "xrite" elif ext.lower() in (".cab", ".exe"): if icolordisplay: kind = "icd" sevenzip = get_program_file("7z", "7-zip") if sevenzip: if not getcfg("dry_run"): # Extract from NSIS installer temp = self.worker.create_tempdir() if isinstance(temp, Exception): result = temp else: result = self.worker.exec_cmd(sevenzip, ["e", "-y", path, "DeviceCorrections.txt"], capture_output=True, skip_scripts=True, working_dir=temp) if (result and not isinstance(result, Exception)): path = os.path.join(temp, "DeviceCorrections.txt") else: self.worker.wrapup(False) else: result = Error(lang.getstr("file.missing", "7z" + exe_ext)) elif i1d3ccss and ("colormunki" in os.path.basename(path).lower() or "i1profiler" in os.path.basename(path).lower()): # Assume X-Rite installer kind = "xrite" elif spyd4en and "spyder4" in os.path.basename(path).lower(): # Assume Spyder4/5 kind = "spyder4" if kind == "icd": if (not getcfg("dry_run") and result and not isinstance(result, Exception)): # Assume iColorDisplay DeviceCorrections.txt ccmx_dir = config.get_argyll_data_dir() if not os.path.exists(ccmx_dir): result = check_create_dir(ccmx_dir) if isinstance(result, Exception): return result, i1d3, spyd4, icd safe_print(lang.getstr("colorimeter_correction.import")) safe_print(path) try: imported, skipped = ccmx.convert_devicecorrections_to_ccmx(path, ccmx_dir) if imported == 0: raise Info() except (UnicodeDecodeError, demjson.JSONDecodeError), exception: if isinstance(exception, demjson.JSONDecodeError): exception = exception.pretty_description() result = Error(lang.getstr("file.invalid") + "\n" + safe_unicode(exception)) except Info: result = False except Exception, exception: result = exception else: result = icd = True if skipped > 0: result = Warn(lang.getstr("colorimeter_correction.import.partial_warning", ("iColor Display", skipped, imported + skipped))) self.worker.wrapup(False) elif kind == "xrite": # Import .edr if asroot and sys.platform == "win32": ccss = get_argyll_data_files("l", "*.ccss") result = i1d3 = self.worker.import_edr([path], asroot=asroot) if asroot and sys.platform == "win32": result = i1d3 = get_argyll_data_files("l", "*.ccss") != ccss elif kind == "spyder4": # Import spyd4cal.bin result = spyd4 = self.worker.import_spyd4cal([path], asroot=asroot) if asroot and sys.platform == "win32": result = spyd4 = get_argyll_data_files("l", "spyd4cal.bin") elif oeminst and not icolordisplay: if asroot and sys.platform == "win32": ccss = get_argyll_data_files("l", "*.ccss") result = self.worker.import_colorimeter_corrections(oeminst, [path], asroot) if (".ccss" in "".join(self.worker.output) or (asroot and sys.platform == "win32" and get_argyll_data_files("l", "*.ccss") != ccss)): i1d3 = result if ("spyd4cal.bin" in "".join(self.worker.output) or (asroot and sys.platform == "win32" and get_argyll_data_files("l", "spyd4cal.bin"))): spyd4 = result else: result = Error(lang.getstr("error.file_type_unsupported") + "\n" + path) return result, i1d3, spyd4, icd def import_colorimeter_corrections_producer(self, result, i1d3, i1d3ccss, spyd4, spyd4en, icd, oeminst, paths, auto, asroot, importers): """ Import colorimetercorrections from paths """ if (oeminst or i1d3ccss or spyd4en) and auto: # Automatically import OEM files self.worker.create_tempdir() for importer in filter(lambda importer: importer, [oeminst, i1d3ccss, spyd4en]): if asroot and sys.platform == "win32": ccss = get_argyll_data_files("l", "*.ccss") result = self.worker.import_colorimeter_corrections(importer, asroot=asroot) if isinstance(result, Exception) or not result: continue if (".ccss" in "".join(self.worker.output) or (asroot and sys.platform == "win32" and get_argyll_data_files("l", "*.ccss") != ccss)): i1d3 = result if ("spyd4cal.bin" in "".join(self.worker.output) or (asroot and sys.platform == "win32" and get_argyll_data_files("l", "spyd4cal.bin"))): spyd4 = result if importer == oeminst: break self.worker.wrapup(False) if auto and not paths: paths = [] # Look for iColorDisplay if sys.platform == "win32": paths += glob.glob(os.path.join(getenvu("PROGRAMFILES", ""), "Quato", "iColorDisplay", "DeviceCorrections.txt")) elif sys.platform == "darwin": paths += glob.glob(os.path.join(os.path.sep, "Applications", "iColorDisplay*.app", "DeviceCorrections.txt")) paths += glob.glob(os.path.join(os.path.sep, "Volumes", "iColorDisplay*", "iColorDisplay*.app", "DeviceCorrections.txt")) if (oeminst or i1d3ccss) and not i1d3: # Look for *.edr files if sys.platform == "win32": paths += glob.glob(os.path.join(getenvu("PROGRAMFILES", ""), "X-Rite", "Devices", "i1d3", "Calibrations", "*.edr")) elif sys.platform == "darwin": paths += glob.glob(os.path.join(os.path.sep, "Library", "Application Support", "X-Rite", "Devices", "i1d3xrdevice", "Contents", "Resources", "Calibrations", "*.edr")) paths += glob.glob(os.path.join(os.path.sep, "Volumes", "i1Profiler", "*.exe")) paths += glob.glob(os.path.join(os.path.sep, "Volumes", "ColorMunki Display", "*.exe")) if (oeminst or spyd4en) and not spyd4: # Look for dccmtr.dll if sys.platform == "win32": paths += glob.glob(os.path.join(getenvu("PROGRAMFILES", ""), "Datacolor", "Spyder4*", "dccmtr.dll")) paths += glob.glob(os.path.join(getenvu("PROGRAMFILES", ""), "Datacolor", "Spyder5*", "dccmtr.dll")) elif sys.platform == "darwin": # Look for setup.exe on CD-ROM paths += glob.glob(os.path.join(os.path.sep, "Volumes", "Datacolor", "Data", "setup.exe")) paths += glob.glob(os.path.join(os.path.sep, "Volumes", "Datacolor_ISO", "Data", "setup.exe")) for path in paths: (result, i1d3, spyd4, icd) = self.import_colorimeter_correction(result, i1d3, i1d3ccss, spyd4, spyd4en, icd, oeminst, path, asroot) paths = [] for name, importer in importers: imported = locals().get(name, False) if not imported and auto: # Automatic download if name == "icd" and sys.platform == "darwin": name += ".dmg" self.worker.recent.clear() self.worker.lastmsg.clear() result = self.worker.download("http://%s/%s" % (domain.lower(), name)) if isinstance(result, Exception): break elif result: paths.append(result) else: # Cancelled result = None break if not isinstance(result, Exception) and result: for path in paths: (result, i1d3, spyd4, icd) = self.import_colorimeter_correction(result, i1d3, i1d3ccss, spyd4, spyd4en, icd, oeminst, path, asroot) return result, i1d3, spyd4, icd def import_colorimeter_corrections_consumer(self, results, callafter=None, callafter_args=()): result, i1d3, spyd4, icd = results if isinstance(result, Exception): show_result_dialog(result, self) imported = [] if i1d3 and not isinstance(i1d3, Exception): imported.append("i1 Profiler/ColorMunki Display") if spyd4 and not isinstance(spyd4, Exception): imported.append("Spyder4/5") self.update_measurement_modes() if icd and not isinstance(icd, Exception): imported.append("iColor Display") if imported: self.update_colorimeter_correction_matrix_ctrl_items(True) InfoDialog(self, msg=lang.getstr("colorimeter_correction.import.success", "\n".join(imported)), ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-information")) elif result is not None: error = ("".join(self.worker.errors) or lang.getstr("colorimeter_correction.import.failure")) show_result_dialog(UnloggedError(error), self) if callafter: wx.CallAfter(callafter, *callafter_args) def import_session_archive(self, path): """ Import compressed session archive """ filename, ext = os.path.splitext(path) basename = os.path.basename(filename) # Without extension if self.check_overwrite(filename=basename): self.worker.start(self.import_session_archive_consumer, self.import_session_archive_producer, cargs=(basename, ), wargs=(path, basename, ext), progress_msg=lang.getstr("archive.import"), fancy=False) def import_session_archive_producer(self, path, basename, ext): temp = self.worker.create_tempdir() if isinstance(temp, Exception): return temp if ext.lower() == ".7z": sevenzip = get_program_file("7z", "7-zip") if sevenzip: # Extract from 7z archive (flat hierarchy, not using dirnames) result = self.worker.exec_cmd(sevenzip, ["e", "-y", path], capture_output=True, log_output=False, skip_scripts=True, working_dir=temp) if not result or isinstance(result, Exception): return result # Check if a session archive is_session_archive = False for ext in (".icc", ".icm", ".cal"): if os.path.isfile(os.path.join(temp, basename + ext)): is_session_archive = True break if not is_session_archive: # Doesn't seem to be a session archive return Error(lang.getstr("error.not_a_session_archive", os.path.basename(path))) if os.path.isdir(os.path.join(temp, basename)): # Remove empty directory shutil.rmtree(os.path.join(temp, basename)) else: return Error(lang.getstr("file.missing", "7z" + exe_ext)) else: if (path.lower().endswith(".tgz") or path.lower().endswith(".tar.gz")): # Gzipped TAR archive archive = TarFileProper.open(path, "r", encoding="UTF-8") getinfo = archive.getmember getnames = archive.getnames else: # ZIP archive = zipfile.ZipFile(path, "r") getinfo = archive.getinfo getnames = archive.namelist try: with archive: # Check if a session archive info = None for ext in (".icc", ".icm", ".cal"): for name in (basename + "/" + basename + ext, basename + ext): if isinstance(archive, zipfile.ZipFile): # If the ZIP file was created with Unicode # names stored in the file, 'name' will already # be Unicode. Otherwise, it'll either be 7-bit # ASCII or (legacy) cp437 encoding names = (name, safe_str(name, "cp437")) else: # Gzipped TAR archive, assume UTF-8 names = (safe_str(name, "UTF-8"), ) for name in names: try: info = getinfo(name) except KeyError: continue break if info: break if info: break if not info: # Doesn't seem to be a session archive return Error(lang.getstr("error.not_a_session_archive", os.path.basename(path))) # Extract from archive (flat hierarchy, not using dirnames) for name in getnames(): if not isinstance(archive, zipfile.ZipFile): # Gzipped TAR archive.extract(name, temp, False) continue # If the ZIP file was created with Unicode names stored # in the file, 'name' will already be Unicode. # Otherwise, it'll either be 7-bit ASCII or (legacy) # cp437 encoding outname = safe_unicode(name, "cp437") with open(os.path.join(temp, os.path.basename(outname)), "wb") as outfile: outfile.write(archive.read(name)) except Exception, exception: from traceback import format_exc safe_print(traceback.format_exc()) return exception return os.path.join(getcfg("profile.save_path"), basename, basename + ext) def import_session_archive_consumer(self, result, basename): if result and not isinstance(result, Exception): # Copy to storage folder self.worker.wrapup(dst_path=os.path.join(getcfg("profile.save_path"), basename, basename + ".ext")) # Load settings from profile self.load_cal_handler(None, result) else: show_result_dialog(result) self.worker.wrapup(False) def display_ctrl_handler(self, event, load_lut=True, update_ccmx_items=True): if debug: safe_print("[D] display_ctrl_handler called for ID %s %s event " "type %s %s" % (event.GetId(), getevtobjname(event, self), event.GetEventType(), getevttype(event))) display_no = self.display_ctrl.GetSelection() profile = None if display_no > -1: setcfg("display.number", display_no + 1) if load_lut: profile = get_display_profile(display_no) if not getcfg("calibration.file", False): # Current self.profile_info_btn.Enable(bool(profile)) if self.display_lut_link_ctrl.IsShown(): self.display_lut_link_ctrl_handler(CustomEvent( wx.EVT_BUTTON.evtType[0], self.display_lut_link_ctrl), bool(int(getcfg("display_lut.link")))) if load_lut: if debug: safe_print("[D] display_ctrl_handler -> lut_viewer_load_lut", profile.getDescription() if profile else None) self.lut_viewer_load_lut(profile=profile) if debug: safe_print("[D] display_ctrl_handler -> lut_viewer_load_lut END") # Check if the selected display is a pattern generator. If so, # don't use videoLUT for calibration. Restore previous value # when switching back to a display with videoLUT access. if config.is_patterngenerator(): if getcfg("calibration.use_video_lut.backup", False) is None: setcfg("calibration.use_video_lut.backup", getcfg("calibration.use_video_lut")) setcfg("calibration.use_video_lut", 0) elif getcfg("calibration.use_video_lut.backup", False) is not None: setcfg("calibration.use_video_lut", getcfg("calibration.use_video_lut.backup")) setcfg("calibration.use_video_lut.backup", None) update_delay_ctrls = False if config.get_display_name() == "Resolve": # Special case: Resolve. Needs a minimum display update delay of # atleast 600 ms for repeatable measurements. This is a Resolve # issue. There seem to be quite a few bugs that were introduced in # Resolve via the version 10.1.x to 11.x transition. if getcfg("measure.min_display_update_delay_ms.backup", False) is None: setcfg("measure.override_min_display_update_delay_ms.backup", getcfg("measure.override_min_display_update_delay_ms")) setcfg("measure.min_display_update_delay_ms.backup", getcfg("measure.min_display_update_delay_ms")) setcfg("measure.override_min_display_update_delay_ms", 1) setcfg("measure.min_display_update_delay_ms", 600) update_delay_ctrls = True elif getcfg("measure.min_display_update_delay_ms.backup", False) is not None: setcfg("measure.override_min_display_update_delay_ms", getcfg("measure.override_min_display_update_delay_ms.backup")) setcfg("measure.min_display_update_delay_ms", getcfg("measure.min_display_update_delay_ms.backup")) setcfg("measure.override_min_display_update_delay_ms.backup", None) setcfg("measure.min_display_update_delay_ms.backup", None) update_delay_ctrls = True if (config.is_virtual_display() or config.get_display_name() == "SII REPEATER"): # Enable 3D LUT tab for madVR, Resolve & eeColor if getcfg("3dlut.tab.enable.backup", False) is None: setcfg("3dlut.tab.enable.backup", getcfg("3dlut.tab.enable")) setcfg("3dlut.tab.enable", 1) elif (getcfg("3dlut.tab.enable.backup", False) is not None and not getcfg("3dlut.create")): setcfg("3dlut.tab.enable", getcfg("3dlut.tab.enable.backup")) setcfg("3dlut.tab.enable.backup", None) if update_delay_ctrls: override = bool(getcfg("measure.override_min_display_update_delay_ms")) getattr(self, "override_min_display_update_delay_ms").SetValue(override) self.update_display_delay_ctrl("min_display_update_delay_ms", override) # Check if display is calibratable at all. Unset calibration update # checkbox if this is not the case. if config.is_uncalibratable_display(): setcfg("calibration.update", False) self.calibration_update_cb.SetValue(False) if self.IsShownOnScreen(): self.update_menus() if (update_ccmx_items and getcfg("colorimeter_correction_matrix_file").split(":")[0] == "AUTO"): self.update_colorimeter_correction_matrix_ctrl_items() else: self.update_estimated_measurement_times() self.update_main_controls() if getattr(self, "reportframe", None): self.reportframe.update_controls() if getattr(self, "lut3dframe", None): self.lut3dframe.update_controls() ##if (event and not isinstance(event, CustomEvent) and ##not getcfg("calibration.file", False)): ### Set measurement report dest profile to current ##setcfg("measurement_report.output_profile", ##get_current_profile_path()) if not isinstance(event, CustomEvent): if config.get_display_name().startswith("Chromecast "): # Show a warning re Chromecast limitation show_result_dialog(UnloggedWarning(lang.getstr("chromecast_limitations_warning")), parent=self) if (config.get_display_name() == "Untethered" and getcfg("testchart.file") == "auto"): # Untethered does not support auto-optimization self.set_testchart() def display_delay_handler(self, event): mapping = {self.override_min_display_update_delay_ms.GetId(): "measure.override_min_display_update_delay_ms", self.min_display_update_delay_ms.GetId(): "measure.min_display_update_delay_ms", self.override_display_settle_time_mult.GetId(): "measure.override_display_settle_time_mult", self.display_settle_time_mult.GetId(): "measure.display_settle_time_mult"} pref = mapping.get(event.GetId()) if pref: ctrl = self.FindWindowById(event.GetId()) value = ctrl.GetValue() if ctrl.Name.startswith("override_"): self.update_display_delay_ctrl(ctrl.Name[9:], value) value = int(value) setcfg(pref, value) self.update_estimated_measurement_times() def update_display_delay_ctrl(self, name, enable): spinctrl = getattr(self, name) spinctrl.Enable(enable) spinvalue = getcfg("measure.%s" % name) if not enable: # Restore previous environment variable value backup = os.getenv("ARGYLL_%s_BACKUP" % name.upper()) current = os.getenv("ARGYLL_%s" % name.upper()) if backup or current: valuetype = type(defaults["measure.%s" % name]) try: spinvalue = valuetype(backup or current) except (TypeError, ValueError): pass spinctrl.SetValue(spinvalue) def display_lut_ctrl_handler(self, event): if debug: safe_print("[D] display_lut_ctrl_handler called for ID %s %s event " "type %s %s" % (event.GetId(), getevtobjname(event, self), event.GetEventType(), getevttype(event))) try: i = self.displays.index(self.display_lut_ctrl.GetStringSelection()) except ValueError: i = min(0, self.display_ctrl.GetSelection()) setcfg("display_lut.number", i + 1) def display_lut_link_ctrl_handler(self, event, link=None): if debug: safe_print("[D] display_lut_link_ctrl_handler called for ID %s %s " "event type %s %s" % (event.GetId(), getevtobjname(event, self), event.GetEventType(), getevttype(event))) bitmap_link = geticon(16, "stock_lock") bitmap_unlink = geticon(16, "stock_lock-open") if link is None: link = not bool(int(getcfg("display_lut.link"))) link = (not len(self.worker.displays) or (link and self.worker.lut_access[max(min(len(self.worker.displays), getcfg("display.number")), 0) - 1])) lut_no = -1 if link: self.display_lut_link_ctrl.SetBitmapLabel(bitmap_link) try: lut_no = self.display_lut_ctrl.Items.index(self.display_ctrl.GetStringSelection()) except ValueError: pass else: self.display_lut_link_ctrl.SetBitmapLabel(bitmap_unlink) set_bitmap_labels(self.display_lut_link_ctrl) if lut_no < 0: try: lut_no = self.display_lut_ctrl.Items.index(self.display_ctrl.Items[getcfg("display_lut.number") - 1]) except (IndexError, ValueError): lut_no = min(0, self.display_ctrl.GetSelection()) self.display_lut_ctrl.SetSelection(lut_no) self.display_lut_ctrl.Enable(not link and self.display_lut_ctrl.GetCount() > 1) setcfg("display_lut.link", int(link)) try: i = self.displays.index(self.display_lut_ctrl.Items[lut_no]) except (IndexError, ValueError): i = min(0, self.display_ctrl.GetSelection()) setcfg("display_lut.number", i + 1) def measurement_mode_ctrl_handler(self, event=None): if debug: safe_print("[D] measurement_mode_ctrl_handler called for ID %s %s " "event type %s %s" % (event.GetId(), getevtobjname(event, self), event.GetEventType(), getevttype(event))) v = self.get_measurement_mode() if v and "p" in v and self.worker.argyll_version < [1, 1, 0]: self.measurement_mode_ctrl.SetSelection( self.measurement_modes_ba[self.get_instrument_type()].get( defaults["measurement_mode"], 1)) v = None InfoDialog(self, msg=lang.getstr("projector_mode_unavailable"), ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-information")) if v and "V" in v and self.worker.argyll_version < [1, 1, 0] or ( self.worker.argyll_version[0:3] == [1, 1, 0] and ( "Beta" in self.worker.argyll_version_string or "RC1" in self.worker.argyll_version_string or "RC2" in self.worker.argyll_version_string)): # adaptive emissive mode was added in RC3 self.measurement_mode_ctrl.SetSelection( self.measurement_modes_ba[self.get_instrument_type()].get( defaults["measurement_mode"], 1)) v = None InfoDialog(self, msg=lang.getstr("adaptive_mode_unavailable"), ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-information")) cal_changed = v != getcfg("measurement_mode") and \ getcfg("calibration.file", False) not in self.presets[1:] setcfg("measurement_mode", (strtr(v, {"V": "", "H": ""}) if v else None) or None) instrument_features = self.worker.get_instrument_features() if instrument_features.get("adaptive_mode"): setcfg("measurement_mode.adaptive", 1 if v and "V" in v else 0) if instrument_features.get("highres_mode"): setcfg("measurement_mode.highres", 1 if v and "H" in v else 0) if (v and self.worker.get_instrument_name() in ("ColorHug", "ColorHug2") and "p" in v): # ColorHug projector mode is just a correction matrix # Avoid setting ColorMunki projector mode v = v.replace("p", "") # ColorMunki projector mode is an actual special sensor dial position setcfg("measurement_mode.projector", 1 if v and "p" in v else None) self.update_colorimeter_correction_matrix_ctrl() self.update_colorimeter_correction_matrix_ctrl_items(update_measurement_mode=False) if (v and self.get_trc() and (not "c" in v or "p" in v) and float(self.get_black_point_correction()) > 0 and getcfg("calibration.black_point_correction_choice.show") and not getcfg("calibration.black_point_correction.auto")): if "c" in v: ok = lang.getstr("calibration.turn_on_black_point_correction") else: ok = lang.getstr("turn_off") title = "calibration.black_point_correction" msg = "calibration.black_point_correction_choice" cancel = "setting.keep_current" dlg = ConfirmDialog(self, title=lang.getstr(title), msg=lang.getstr(msg), ok=ok, cancel=lang.getstr(cancel), bitmap=geticon(32, "dialog-question")) chk = wx.CheckBox(dlg, -1, lang.getstr("dialog.do_not_show_again")) dlg.Bind(wx.EVT_CHECKBOX, self.black_point_correction_choice_dialog_handler, id=chk.GetId()) dlg.sizer3.Add(chk, flag=wx.TOP | wx.ALIGN_LEFT, border=12) dlg.sizer0.SetSizeHints(dlg) dlg.sizer0.Layout() result = dlg.ShowModal() dlg.Destroy() if result == wx.ID_OK: if "c" in v: bkpt_corr = 1.0 else: bkpt_corr = 0.0 if not cal_changed and \ bkpt_corr != getcfg("calibration.black_point_correction"): self.cal_changed() setcfg("calibration.black_point_correction", bkpt_corr) self.update_controls(update_profile_name=False) self.update_profile_name() if v == "auto": wx.CallAfter(show_result_dialog, UnloggedInfo(lang.getstr("display.reset.info")), self) def black_point_correction_choice_dialog_handler(self, event): setcfg("calibration.black_point_correction_choice.show", int(not event.GetEventObject().GetValue())) def profile_type_ctrl_handler(self, event): if debug and event: safe_print("[D] profile_type_ctrl_handler called for ID %s %s " "event type %s %s" % (event.GetId(), getevtobjname(event, self), event.GetEventType(), getevttype(event))) v = self.get_profile_type() lut_type = v in ("l", "x", "X") self.gamap_btn.Enable(lut_type) proftype_changed = False if v in ("l", "x", "X"): # XYZ LUT type if getcfg("profile.type") not in ("l", "x", "X"): # Disable black point compensation for LUT profiles setcfg("profile.black_point_compensation", 0) proftype_changed = True elif v in ("s", "S"): # Shaper + matrix type if getcfg("profile.type") not in ("s", "S"): # Enable black point compensation for shaper profiles setcfg("profile.black_point_compensation", 1) else: setcfg("profile.black_point_compensation", 0) if v in ("s", "S", "g", "G"): if getcfg("profile.type") not in ("s", "S", "g", "G"): proftype_changed = True self.update_bpc() self.profile_quality_ctrl.Enable(v not in ("g", "G")) if v in ("g", "G"): self.profile_quality_ctrl.SetValue(3) self.profile_quality_info.SetLabel( lang.getstr("calibration.quality.high")) if v != getcfg("profile.type"): self.profile_settings_changed() setcfg("profile.type", v) if hasattr(self, "gamapframe"): self.gamapframe.update_controls() self.set_default_testchart(force=proftype_changed) self.update_profile_name() if event: self.check_testchart_patches_amount() def check_testchart_patches_amount(self): """ Check if the selected testchart has at least the recommended amount of patches. Give user the choice to use the recommended amount if patch count is lower. """ recommended = {"G": 9, "g": 11, "l": 238, "lh": 124, "S": 36, "s": 36, "X": 238, "Xh": 124, "x": 238, "xh": 124} # lower quality actually needs *higher* patchcount while high quality # can get away with fewer patches and still improved result recommended = recommended.get(self.get_profile_type() + self.get_profile_quality(), recommended[self.get_profile_type()]) patches = int(self.testchart_patches_amount.GetLabel()) if recommended > patches and not is_ccxx_testchart(): self.profile_quality_ctrl.Disable() dlg = ConfirmDialog( self, msg=lang.getstr("profile.testchart_recommendation"), ok=lang.getstr("OK"), cancel=lang.getstr("cancel"), bitmap=geticon(32, "dialog-question")) result = dlg.ShowModal() self.profile_quality_ctrl.Enable(not getcfg("profile.update") and self.get_profile_type() not in ("g", "G")) dlg.Destroy() if result == wx.ID_OK: setcfg("testchart.auto_optimize", max(config.valid_values["testchart.auto_optimize"][1], int(round(colormath.cbrt(recommended))))) self.set_testchart("auto") def measurement_file_check_auto_handler(self, event): if not getcfg("ti3.check_sanity.auto"): dlg = ConfirmDialog(self, msg=lang.getstr("measurement_file.check_sanity.auto.warning"), ok=lang.getstr("ok"), cancel=lang.getstr("cancel"), bitmap=geticon(32, "dialog-warning"), log=False) result = dlg.ShowModal() dlg.Destroy() if result != wx.ID_OK: self.menuitem_measurement_file_check_auto.Check(False) return setcfg("ti3.check_sanity.auto", int(self.menuitem_measurement_file_check_auto.IsChecked())) def measurement_file_check_handler(self, event): # select measurement data (ti3 or profile) path = None defaultDir, defaultFile = get_verified_path("last_ti3_path") dlg = wx.FileDialog(self, lang.getstr("measurement_file.choose"), defaultDir=defaultDir, defaultFile=defaultFile, wildcard=lang.getstr("filetype.icc_ti3") + "|*.icc;*.icm;*.ti3", style=wx.FD_OPEN | wx.FD_FILE_MUST_EXIST) dlg.Center(wx.BOTH) result = dlg.ShowModal() if result == wx.ID_OK: path = dlg.GetPath() dlg.Destroy() if path: if not os.path.exists(path): show_result_dialog(Error(lang.getstr("file.missing", path)), self) return tags = OrderedDict() # Get filename and extension of file filename, ext = os.path.splitext(path) if ext.lower() != ".ti3": try: profile = ICCP.ICCProfile(path) except (IOError, ICCP.ICCProfileInvalidError), exception: show_result_dialog(Error(lang.getstr("profile.invalid") + "\n" + path), self) return if (profile.tags.get("CIED", "") or profile.tags.get("targ", ""))[0:4] != "CTI3": show_result_dialog(Error(lang.getstr("profile.no_embedded_ti3") + "\n" + path), self) return ti3 = StringIO(profile.tags.get("CIED", "") or profile.tags.get("targ", "")) else: profile = None try: ti3 = open(path, "rU") except Exception, exception: show_result_dialog(Error(lang.getstr("error.file.open", path)), self) return setcfg("last_ti3_path", path) ti3 = CGATS.CGATS(ti3) if self.measurement_file_check_confirm(ti3, True): if ti3.modified: if profile: # Regenerate the profile? dlg = ConfirmDialog(self, msg=lang.getstr("profile.confirm_regeneration"), ok=lang.getstr("ok"), cancel=lang.getstr("cancel"), bitmap=geticon(32, "dialog-information")) dlg.Center() result = dlg.ShowModal() if result == wx.ID_OK: self.worker.wrapup(False) tmp_working_dir = self.worker.create_tempdir() if isinstance(tmp_working_dir, Exception): show_result_dialog(tmp_working_dir, self) return profile.tags.targ = ICCP.TextType("text\0\0\0\0" + str(ti3) + "\0", "targ") profile.tags.DevD = profile.tags.CIED = profile.tags.targ tmp_path = os.path.join(tmp_working_dir, os.path.basename(path)) profile.write(tmp_path) self.create_profile_handler(None, tmp_path, True) else: dlg = wx.FileDialog(self, lang.getstr("save_as"), os.path.dirname(path), os.path.basename(path), wildcard=lang.getstr("filetype.ti3") + "|*.ti3", style=wx.SAVE | wx.FD_OVERWRITE_PROMPT) dlg.Center(wx.BOTH) result = dlg.ShowModal() path = dlg.GetPath() dlg.Destroy() if result == wx.ID_OK: if not waccess(path, os.W_OK): show_result_dialog(Error(lang.getstr("error.access_denied.write", path)), self) return try: ti3.write(path) except EnvironmentError, exception: show_result_dialog(exception, self) else: show_result_dialog(UnloggedInfo(lang.getstr("errors.none_found")), self) def measurement_file_check_confirm(self, ti3=None, force=False, parent=None): if not getcfg("ti3.check_sanity.auto") and not force: return True if not ti3: profile_save_path = self.worker.tempdir if profile_save_path and os.path.isdir(profile_save_path): profile_name = getcfg("profile.name.expanded") ti3 = os.path.join(profile_save_path, make_argyll_compatible_path(profile_name) + ".ti3") if not os.path.isfile(ti3): ti3 = None if not ti3: # Let the caller handle missing files return True try: if not isinstance(ti3, CGATS.CGATS): ti3 = CGATS.CGATS(ti3) ti3_1 = verify_ti1_rgb_xyz(ti3) except (IOError, CGATS.CGATSError), exception: show_result_dialog(exception, self) return False suspicious = check_ti3(ti3_1) if not suspicious: return True self.Show(start_timers=False) dlg = MeasurementFileCheckSanityDialog(parent or self, ti3_1, suspicious, force) result = dlg.ShowModal() if result == wx.ID_OK: indexes = [] for index in xrange(dlg.grid.GetNumberRows()): if dlg.grid.GetCellValue(index, 0) == "": indexes.insert(0, index) data = ti3_1.queryv1("DATA") removed = [] for index in indexes: removed.insert(0, data.pop(dlg.suspicious_items[index])) for item in removed: safe_print("Removed patch #%i from TI3: %s" % (item.key, item)) for index, fields in dlg.mods.iteritems(): if index not in indexes: item = dlg.suspicious_items[index] for field, value in fields.iteritems(): old = item[field] if old != value: item[field] = value safe_print(u"Updated patch #%s in TI3: %s %.4f \u2192 %.4f" % (item.SAMPLE_ID, field, old, value)) dlg.Destroy() if result == wx.ID_CANCEL: return False elif result == wx.ID_OK: if ti3.modified: if ti3.filename and os.path.exists(ti3.filename) and not force: try: ti3.write() except EnvironmentError, exception: show_result_dialog(exception, self) return False safe_print("Written updated TI3 to", ti3.filename) return removed, ti3 return True def profile_name_ctrl_handler(self, event): if debug: safe_print("[D] profile_name_ctrl_handler called for ID %s %s " "event type %s %s" % (event.GetId(), getevtobjname(event, self), event.GetEventType(), getevttype(event))) oldval = self.profile_name_textctrl.GetValue() if not self.check_profile_name() or len(oldval) > self.maxprofilenamelength: wx.Bell() x = self.profile_name_textctrl.GetInsertionPoint() if oldval == "": newval = defaults.get("profile.name", "") else: newval = re.sub(r"[\\/:*?\"<>|]+", "", oldval).lstrip("-")[:self.maxprofilenamelength] self.profile_name_textctrl.ChangeValue(newval) self.profile_name_textctrl.SetInsertionPoint(x - (len(oldval) - len(newval))) self.update_profile_name() def create_profile_name_btn_handler(self, event): self.update_profile_name() def create_session_archive_handler(self, event): """ Create 7z or ZIP archive of the currently selected profile folder """ filename = getcfg("calibration.file", False) if not filename: return path_name, ext = os.path.splitext(filename) # Check for 7-Zip sevenzip = get_program_file("7z", "7-zip") if sevenzip: format = "7z" else: format = "zip" wildcard = lang.getstr("filetype." + format) + "|*." + format if format == "7z": wildcard += "|" + lang.getstr("filetype.zip") + "|*.zip" wildcard += "|" + lang.getstr("filetype.tgz") + "|*.tgz" # Ask where to save archive defaultDir, defaultFile = get_verified_path("last_archive_save_path") dlg = wx.FileDialog(self, lang.getstr("archive.create"), defaultDir, "%s.%s" % (os.path.basename(path_name), format), wildcard=wildcard, style=wx.SAVE | wx.FD_OVERWRITE_PROMPT) dlg.Center(wx.BOTH) result = dlg.ShowModal() archive_path = dlg.GetPath() if sevenzip and dlg.GetFilterIndex(): # ZIP or TGZ sevenzip = None dlg.Destroy() if result != wx.ID_OK: return setcfg("last_archive_save_path", archive_path) dirname = os.path.dirname(filename) dirfilenames = [os.path.join(dirname, filename) for filename in os.listdir(dirname)] dirfilenames.sort() # Select filenames filenames = (glob.glob(path_name + "*") + glob.glob(os.path.join(dirname, "*.ccmx")) + glob.glob(os.path.join(dirname, "*.ccss"))) filenames.sort() lut3d_ext = ["." + strtr(lut3d_format, {"eeColor": "txt", "madVR": "3dlut"}) for lut3d_format in config.valid_values["3dlut.format"]] has_3dlut = False for filename in filenames: if os.path.splitext(filename)[1].lower() in lut3d_ext: has_3dlut = True break if has_3dlut: # Should 3D LUT files be included? dlg = ConfirmDialog(self, msg=lang.getstr("archive.include_3dluts"), ok=lang.getstr("no"), alt=lang.getstr("yes"), cancel=lang.getstr("cancel"), bitmap=geticon(32, "dialog-question")) result = dlg.ShowModal() if result == wx.ID_CANCEL: return if result != wx.ID_OK: # Include 3D LUTs lut3d_ext = None self.worker.interactive = False self.worker.start(self.create_session_archive_consumer, self.create_session_archive_producer, wargs=(dirname, dirfilenames, filenames, archive_path, lut3d_ext if has_3dlut else None, sevenzip), progress_msg=lang.getstr("archive.create"), stop_timers=False, cancelable=bool(sevenzip), fancy=False) def create_session_archive_producer(self, dirname, dirfilenames, filenames, archive_path, exclude_ext, sevenzip): """ Create session archive """ if sevenzip: # Create 7z archive if filenames == dirfilenames: # Add whole folder to archive, so that the 7z archive # has one folder in it containing all files filenames = [dirname] if os.path.isfile(archive_path): os.remove(archive_path) args = ["a", "-y"] if exclude_ext: for ext in exclude_ext: args.append("-xr!*" + ext) return self.worker.exec_cmd(sevenzip, args + [archive_path] + filenames, capture_output=True) else: # Create gzipped TAR or ZIP archive dirbasename = "" if filenames == dirfilenames: # Add whole folder to archive, so that the ZIP archive # has one folder in it containing all files dirbasename = os.path.basename(dirname) if (archive_path.lower().endswith(".tgz") or archive_path.lower().endswith(".tar.gz")): # Create gzipped tar archive archive = TarFileProper.open(archive_path, "w:gz", encoding="UTF-8") writefile = archive.add else: archive = zipfile.ZipFile(archive_path, "w", zipfile.ZIP_DEFLATED) writefile = archive.write try: with archive: for filename in filenames: if exclude_ext: if os.path.splitext(filename)[1].lower() in exclude_ext: continue writefile(filename, os.path.join(dirbasename, os.path.basename(filename))) except Exception, exception: return exception else: return True def create_session_archive_consumer(self, result): if not result: result = UnloggedError("".join(self.worker.errors)) if isinstance(result, Exception): show_result_dialog(result, parent=self) def profile_save_path_btn_handler(self, event): defaultPath = os.path.join(*get_verified_path("profile.save_path")) profile_name = getcfg("profile.name.expanded") dlg = wx.DirDialog(self, lang.getstr("dialog.set_profile_save_path", profile_name), defaultPath=defaultPath) dlg.Center(wx.BOTH) if dlg.ShowModal() == wx.ID_OK: path = dlg.GetPath() profile_save_dir = os.path.join(path, profile_name) if not os.path.isdir(profile_save_dir): try: os.makedirs(profile_save_dir) except: pass if not waccess(os.path.join(profile_save_dir, profile_name), os.W_OK): show_result_dialog(Error(lang.getstr("error.access_denied.write", path)), self) return try: os.rmdir(profile_save_dir) except: pass setcfg("profile.save_path", path) self.update_profile_name() dlg.Destroy() def profile_name_info_btn_handler(self, event): if not hasattr(self, "profile_name_tooltip_window"): self.profile_name_tooltip_window = TooltipWindow( self, msg=self.profile_name_info(), cols=2, title=lang.getstr("profile.name"), bitmap=geticon(32, "dialog-information")) else: self.profile_name_tooltip_window.Show() self.profile_name_tooltip_window.Raise() def profile_name_info(self): info = ["%nn " + lang.getstr("computer.name"), "%dn " + lang.getstr("display"), "%dns " + lang.getstr("display_short"), "%dnw " + lang.getstr("display") + " (" + lang.getstr("windows_only") + ")", "%dnws " + lang.getstr("display_short") + " (" + lang.getstr("windows_only") + ")", "%out " + lang.getstr("display.output"), "%ds " + lang.getstr("edid.serial") + " (" + lang.getstr("if_available") + ")", "%crc32 " + lang.getstr("edid.crc32") + " (" + lang.getstr("if_available") + ")", "%in " + lang.getstr("instrument"), "%im " + lang.getstr("measurement_mode"), "%wp " + lang.getstr("whitepoint"), "%cb " + lang.getstr("calibration.luminance"), "%cB " + lang.getstr("calibration.black_luminance"), "%cg " + lang.getstr("trc"), "%ca " + lang.getstr("calibration.ambient_viewcond_adjust"), "%cf " + lang.getstr("calibration.black_output_offset"), "%ck " + lang.getstr("calibration.black_point_correction")] if defaults["calibration.black_point_rate.enabled"]: info.append("%cA " + lang.getstr("calibration.black_point_rate")) info.extend(["%cq " + lang.getstr("calibration.speed"), "%pq " + lang.getstr("profile.quality"), "%pt " + lang.getstr("profile.type"), "%tpa " + lang.getstr("testchart.info")]) return lang.getstr("profile.name.placeholders") + "\n" + \ "\n".join(info) def profile_hires_b2a_handler(self, event, profile=None): if not profile: profile = self.select_profile(title=lang.getstr("profile.b2a.hires"), ignore_current_profile=True) if profile: if not ("A2B0" in profile.tags or "A2B1" in profile.tags): result = Error(lang.getstr("profile.required_tags_missing", " %s ".join(["A2B0", "A2B1"]) % lang.getstr("or"))) elif (("A2B0" in profile.tags and not isinstance(profile.tags.A2B0, ICCP.LUT16Type)) or ("A2B1" in profile.tags and not isinstance(profile.tags.A2B1, ICCP.LUT16Type))): result = Error(lang.getstr("profile.required_tags_missing", "LUT16Type")) elif profile.connectionColorSpace not in ("XYZ", "Lab"): result = Error(lang.getstr("profile.unsupported", (profile.connectionColorSpace, profile.connectionColorSpace))) else: result = None if result: show_result_dialog(result, self) else: self.interactive = False ##self.profile_hires_b2a_consumer(self.worker.update_profile_B2A(profile), profile) self.worker.start(self.profile_hires_b2a_consumer, self.worker.update_profile_B2A, cargs=(profile, ), wargs=(profile, )) def profile_hires_b2a_consumer(self, result, profile): self.start_timers() if isinstance(result, Exception): show_result_dialog(result, self) elif result: if not profile.fileName or not os.path.isfile(profile.fileName): # Let the user choose a location for the profile defaultDir, defaultFile = os.path.split(profile.fileName) dlg = wx.FileDialog(self, lang.getstr("save_as"), defaultDir, defaultFile, wildcard=lang.getstr("filetype.icc") + "|*" + profile_ext, style=wx.SAVE | wx.FD_OVERWRITE_PROMPT) dlg.Center(wx.BOTH) result = dlg.ShowModal() profile_save_path = dlg.GetPath() dlg.Destroy() else: result = wx.ID_OK profile_save_path = profile.fileName if result == wx.ID_OK: filename, ext = os.path.splitext(profile_save_path) if ext.lower() not in (".icc", ".icm"): profile_save_path += profile_ext if not waccess(profile_save_path, os.W_OK): show_result_dialog(Error(lang.getstr("error.access_denied.write", profile_save_path)), self) return profile.setDescription(os.path.basename(filename)) profile.calculateID() profile.write(profile_save_path) if profile_save_path == get_current_profile_path(): self.lut3d_update_b2a_controls() self.install_profile_handler(None, profile_save_path) else: show_result_dialog(lang.getstr("error.profile.file_not_created"), self) def create_profile_handler(self, event, path=None, skip_ti3_check=False): """ Create profile from existing measurements """ if not check_set_argyll_bin(): return if path is None: selectedpaths = [] # select measurement data (ti3 or profile) defaultDir, defaultFile = get_verified_path("last_ti3_path") dlg = wx.FileDialog(self, lang.getstr("create_profile"), defaultDir=defaultDir, defaultFile=defaultFile, wildcard=lang.getstr("filetype.icc_ti3") + "|*.icc;*.icm;*.ti3", style=wx.FD_OPEN | wx.FD_FILE_MUST_EXIST | wx.FD_MULTIPLE) dlg.Center(wx.BOTH) result = dlg.ShowModal() if result == wx.ID_OK: selectedpaths = dlg.GetPaths() dlg.Destroy() elif path: selectedpaths = [path] collected_ti3s = [] for path in selectedpaths: if not os.path.exists(path): InfoDialog(self, msg=lang.getstr("file.missing", path), ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error")) return tags = OrderedDict() # Get filename and extension of source file source_filename, source_ext = os.path.splitext(path) if source_ext.lower() != ".ti3": try: profile = ICCP.ICCProfile(path) except (IOError, ICCP.ICCProfileInvalidError), exception: InfoDialog(self, msg=lang.getstr("profile.invalid") + "\n" + path, ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error")) return if (profile.tags.get("CIED", "") or profile.tags.get("targ", ""))[0:4] != "CTI3": InfoDialog(self, msg=lang.getstr("profile.no_embedded_ti3") + "\n" + path, ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error")) return ti3 = StringIO(profile.tags.get("CIED", "") or profile.tags.get("targ", "")) # Preserve custom tags for tagname in ("mmod", "meta"): if tagname in profile.tags: tags[tagname] = profile.tags[tagname] else: try: ti3 = open(path, "rU") except Exception, exception: InfoDialog(self, msg=lang.getstr("error.file.open", path), ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error")) return ti3_lines = [line.strip() for line in ti3] ti3.close() if not "CAL" in ti3_lines: dlg = ConfirmDialog(self, msg=lang.getstr("dialog.ti3_no_cal_info"), ok=lang.getstr("continue"), cancel=lang.getstr("cancel"), bitmap=geticon(32, "dialog-warning")) result = dlg.ShowModal() dlg.Destroy() if result != wx.ID_OK: return collected_ti3s.append((path, ti3_lines)) if collected_ti3s: if len(collected_ti3s) > 1: source_filename = os.path.splitext(defaults["last_ti3_path"])[0] source_ext = ".ti3" path = collected_ti3s[0][0] is_tmp = False tmp_working_dir = self.worker.tempdir if tmp_working_dir: if sys.platform == "win32": if path.lower().startswith(tmp_working_dir.lower()): is_tmp = True elif path.startswith(tmp_working_dir): is_tmp = True if is_tmp: defaultDir, defaultFile = get_verified_path("last_ti3_path") else: defaultDir, defaultFile = os.path.split(path) setcfg("last_ti3_path", path) # let the user choose a location for the profile dlg = wx.FileDialog(self, lang.getstr("save_as"), defaultDir, os.path.basename(source_filename) + profile_ext, wildcard=lang.getstr("filetype.icc") + "|*" + profile_ext, style=wx.SAVE | wx.FD_OVERWRITE_PROMPT) dlg.Center(wx.BOTH) result = dlg.ShowModal() profile_save_path = os.path.split(dlg.GetPath()) profile_save_path = os.path.join(profile_save_path[0], make_argyll_compatible_path(profile_save_path[1])) dlg.Destroy() if result == wx.ID_OK: if not waccess(profile_save_path, os.W_OK): show_result_dialog(Error(lang.getstr("error.access_denied.write", profile_save_path)), self) return filename, ext = os.path.splitext(profile_save_path) if ext.lower() not in (".icc", ".icm"): profile_save_path += profile_ext if os.path.exists(profile_save_path): dlg = ConfirmDialog( self, msg=lang.getstr("dialog.confirm_overwrite", (profile_save_path)), ok=lang.getstr("overwrite"), cancel=lang.getstr("cancel"), bitmap=geticon(32, "dialog-warning")) result = dlg.ShowModal() dlg.Destroy() if result != wx.ID_OK: return setcfg("last_cal_or_icc_path", profile_save_path) setcfg("last_icc_path", profile_save_path) # get filename and extension of target file profile_name = os.path.basename( os.path.splitext(profile_save_path)[0]) # create temporary working dir tmp_working_dir = self.worker.create_tempdir() if isinstance(tmp_working_dir, Exception): self.worker.wrapup(False) show_result_dialog(tmp_working_dir, self) return # Copy ti3 to temp dir ti3_tmp_path = os.path.join(tmp_working_dir, make_argyll_compatible_path(profile_name + ".ti3")) if len(collected_ti3s) > 1: # Collect files for averaging collected_paths = [] for ti3_path, ti3_lines in collected_ti3s: collected_path = os.path.join(tmp_working_dir, os.path.basename(ti3_path)) with open(collected_path, "w") as ti3_file: ti3_file.write("\n".join(ti3_lines)) collected_paths.append(collected_path) # Average the TI3 files args = ["-v"] + collected_paths + [ti3_tmp_path] cmd = get_argyll_util("average") result = self.worker.exec_cmd(cmd, args, capture_output=True, skip_scripts=True) for collected_path in collected_paths: os.remove(collected_path) if isinstance(result, Exception) or not result: self.worker.wrapup(False) show_result_dialog(result or Error("\n".join(self.worker.errors)), self) return path = ti3_tmp_path self.worker.options_dispcal = [] self.worker.options_targen = [] display_name = None display_manufacturer = None try: if source_ext.lower() == ".ti3": if path != ti3_tmp_path: shutil.copyfile(path, ti3_tmp_path) else: # Binary mode because we want to avoid automatic # newlines conversion ti3 = open(ti3_tmp_path, "wb") ti3.write(profile.tags.get("CIED", "") or profile.tags.get("targ", "")) ti3.close() # Get dispcal options if present self.worker.options_dispcal = [ "-" + arg for arg in get_options_from_profile(profile)[0]] if "dmdd" in profile.tags: display_name = profile.getDeviceModelDescription() if "dmnd" in profile.tags: display_manufacturer = profile.getDeviceManufacturerDescription() if is_tmp and path != ti3_tmp_path: profile.close() os.remove(path) ti3 = CGATS.CGATS(ti3_tmp_path) if ti3.queryv1("COLOR_REP") and \ ti3.queryv1("COLOR_REP")[:3] == "RGB": self.worker.options_targen = ["-d3"] except Exception, exception: handle_error(Error(u"Error - temporary .ti3 file could not " u"be created: " + safe_unicode(exception)), parent=self) self.worker.wrapup(False) return setcfg("calibration.file.previous", None) safe_print("-" * 80) if (not skip_ti3_check and not self.measurement_file_check_confirm(ti3)): self.worker.wrapup(False) return # Run colprof self.worker.interactive = False self.worker.start( self.profile_finish, self.worker.create_profile, ckwargs={ "profile_path": profile_save_path, "failure_msg": lang.getstr( "error.profile.file_not_created"), "install_3dlut": getcfg("3dlut.create")}, wkwargs={"dst_path": profile_save_path, "display_name": display_name, "display_manufacturer": display_manufacturer, "tags": tags}, progress_msg=lang.getstr("create_profile")) def create_profile_from_edid(self, event): edid = self.worker.get_display_edid() defaultFile = edid.get("monitor_name", edid.get("ascii", str(edid["product_id"]))) + profile_ext defaultDir = get_verified_path(None, os.path.join(getcfg("profile.save_path"), defaultFile))[0] # let the user choose a location for the profile dlg = wx.FileDialog(self, lang.getstr("save_as"), defaultDir, defaultFile, wildcard=lang.getstr("filetype.icc") + "|*" + profile_ext, style=wx.SAVE | wx.FD_OVERWRITE_PROMPT) dlg.Center(wx.BOTH) result = dlg.ShowModal() profile_save_path = os.path.split(dlg.GetPath()) profile_save_path = os.path.join(profile_save_path[0], make_argyll_compatible_path(profile_save_path[1])) dlg.Destroy() if result == wx.ID_OK: if not waccess(profile_save_path, os.W_OK): show_result_dialog(Error(lang.getstr("error.access_denied.write", profile_save_path)), self) return profile = ICCP.ICCProfile.from_edid(edid) try: profile.write(profile_save_path) except Exception, exception: InfoDialog(self, msg=safe_unicode(exception), ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error")) else: if getcfg("profile.create_gamut_views"): safe_print("-" * 80) safe_print(lang.getstr("gamut.view.create")) self.worker.interactive = False self.worker.start(self.create_profile_from_edid_finish, self.worker.calculate_gamut, cargs=(profile, ), wargs=(profile_save_path, ), progress_msg=lang.getstr("gamut.view.create"), resume=False) else: self.create_profile_from_edid_finish(True, profile) def create_profile_from_edid_finish(self, result, profile): if isinstance(result, Exception): show_result_dialog(result, self) elif result: if isinstance(result, tuple): profile.set_gamut_metadata(result[0], result[1]) prefixes = profile.tags.meta.getvalue("prefix", "", None).split(",") # Set license profile.tags.meta["License"] = getcfg("profile.license") # Set device ID device_id = self.worker.get_device_id(quirk=True) if device_id: profile.tags.meta["MAPPING_device_id"] = device_id prefixes.append("MAPPING_") profile.tags.meta["prefix"] = ",".join(prefixes) profile.calculateID() safe_print("-" * 80) try: profile.write() except Exception, exception: show_result_dialog(exception, self) return self.profile_finish(True, profile.fileName, install_3dlut=getcfg("3dlut.create")) def create_profile_name(self): """ Replace placeholders in profile name with values from configuration """ profile_name = self.profile_name_textctrl.GetValue() # Computername if "%nn" in profile_name: profile_name = profile_name.replace("%nn", safe_unicode(platform.node()) or "\0") # Windows display name (EnumDisplayDevices / DeviceString) if "%dnws" in profile_name: display_win32_short = self.worker.get_display_name_short(False, False) profile_name = profile_name.replace("%dnws", display_win32_short or "\0") if "%dnw" in profile_name: display_win32 = self.worker.get_display_name(True, False) profile_name = profile_name.replace("%dnw", display_win32 or "\0") # EDID if "%ds" in profile_name or "%crc32" in profile_name: edid = self.worker.get_display_edid() # Serial if "%ds" in profile_name: serial = edid.get("serial_ascii", hex(edid.get("serial_32", 0))[2:]) if serial and serial not in ("0", "1010101", "fffffff"): profile_name = profile_name.replace("%ds", serial) else: profile_name = profile_name.replace("%ds", "\0") # CRC32 if "%crc32" in profile_name: if edid.get("edid"): profile_name = profile_name.replace("%crc32", "%X" % (crc32(edid["edid"]) & 0xFFFFFFFF)) else: profile_name = profile_name.replace("%crc32", "\0") # Display name if "%dns" in profile_name: display_short = self.worker.get_display_name_short(False, True) profile_name = profile_name.replace("%dns", display_short or "\0") if "%dn" in profile_name: display = self.worker.get_display_name(True, True) profile_name = profile_name.replace("%dn", display or "\0") # Output # if config.is_virtual_display(): output = "\0" else: output = "#%s" % getcfg("display.number") profile_name = profile_name.replace("%out", output or "\0") # Instrument name if "%in" in profile_name: instrument = self.comport_ctrl.GetStringSelection() profile_name = profile_name.replace("%in", instrument or "\0") # Measurement mode if "%im" in profile_name: mode = "" measurement_mode = self.get_measurement_mode() if measurement_mode: if "c" in measurement_mode: mode += lang.getstr("measurement_mode.refresh") elif "l" in measurement_mode: mode += lang.getstr("measurement_mode.lcd") if "p" in measurement_mode: if mode: mode += "-" mode += lang.getstr("projector") if "V" in measurement_mode: if mode: mode += "-" mode += lang.getstr("measurement_mode.adaptive") if "H" in measurement_mode: if mode: mode += "-" mode += lang.getstr("measurement_mode.highres") else: mode += lang.getstr("default") profile_name = profile_name.replace("%im", mode) trc = self.get_trc() do_cal = self.interactive_display_adjustment_cb.GetValue() or trc # Whitepoint if "%wp" in profile_name: whitepoint = self.get_whitepoint() whitepoint_locus = self.get_whitepoint_locus() if isinstance(whitepoint, str): if whitepoint.find(",") < 0: if whitepoint_locus == "t": whitepoint = "D" + whitepoint else: whitepoint += "K" else: whitepoint = "x ".join(whitepoint.split(",")) + "y" profile_name = profile_name.replace("%wp", (do_cal and whitepoint) or "\0") # Luminance if "%cb" in profile_name: luminance = self.get_luminance() profile_name = profile_name.replace("%cb", "\0" if luminance is None or not do_cal else luminance + u"cdm²") # Black luminance if "%cB" in profile_name: black_luminance = self.get_black_luminance() profile_name = profile_name.replace("%cB", "\0" if black_luminance is None or not do_cal else black_luminance + u"cdm²") # TRC / black output offset if "%cg" in profile_name or "%cf" in profile_name: black_output_offset = self.get_black_output_offset() # TRC if "%cg" in profile_name and trc: trc_type = self.get_trc_type() bt1886 = (trc == "2.4" and trc_type == "G" and black_output_offset == "0") if bt1886: trc = "Rec. 1886" elif trc not in ("l", "709", "s", "240"): if trc_type == "G": trc += " (%s)" % lang.getstr("trc.type.absolute").lower() else: trc = strtr(trc, {"l": "L", "709": "Rec. 709", "s": "sRGB", "240": "SMPTE240M"}) profile_name = profile_name.replace("%cg", trc or "\0") # Ambient adjustment if "%ca" in profile_name: ambient = self.get_ambient() profile_name = profile_name.replace("%ca", "\0" if ambient is None or not trc else ambient + "lx") # Black output offset if "%cf" in profile_name: f = int(float(black_output_offset) * 100) profile_name = profile_name.replace("%cf", ("%i%%" % f) if trc else "\0") # Black point correction / rate if "%ck" in profile_name or "%cA" in profile_name: black_point_correction = self.get_black_point_correction() # Black point correction if "%ck" in profile_name: k = int(float(black_point_correction) * 100) auto = self.black_point_correction_auto_cb.GetValue() profile_name = profile_name.replace("%ck", (str(k) + "% " if k > 0 and k < 100 else "") + (lang.getstr("neutral") if k > 0 else "\0").lower() if trc and not auto else "\0") # Black point rate if "%cA" in profile_name: black_point_rate = self.get_black_point_rate() if black_point_rate and float(black_point_correction) < 1 and trc: profile_name = profile_name.replace("%cA", black_point_rate) else: profile_name = profile_name.replace("%cA", "\0") # Calibration / profile quality if "%cq" in profile_name or "%pq" in profile_name: calibration_quality = self.get_calibration_quality() profile_quality = getcfg("profile.quality") aspects = { "c": calibration_quality if trc else "", "p": profile_quality } msgs = { "u": "VS", "h": "S", "m": "M", "l": "F", "v": "VF", "": "\0" } quality = {} if "%cq" in profile_name: quality["c"] = msgs[aspects["c"]] if "%pq" in profile_name: quality["p"] = msgs[aspects["p"]] if len(quality) == 2 and (quality["c"] == quality["p"] or quality["c"] == "\0"): profile_name = re.sub("%cq\W*%pq", quality["p"], profile_name) for q in quality: profile_name = profile_name.replace("%%%sq" % q, quality[q]) # Profile type if "%pt" in profile_name: profile_type = { "G": "1xGamma+MTX", "g": "3xGamma+MTX", "l": "LabLUT", "S": "1xCurve+MTX", "s": "3xCurve+MTX", "X": "XYZLUT+MTX", "x": "XYZLUT" }.get(self.get_profile_type()) profile_name = profile_name.replace("%pt", profile_type or "\0") # Amount of test patches if "%tpa" in profile_name: profile_name = profile_name.replace("%tpa", self.testchart_patches_amount.GetLabel()) # Date / time directives = ( "a", "A", "b", "B", "d", "H", "I", "j", "m", "M", "p", "S", "U", "w", "W", "y", "Y" ) for directive in directives: if "%%%s" % directive in profile_name: try: profile_name = profile_name.replace("%%%s" % directive, strftime("%%%s" % directive)) except UnicodeDecodeError: pass # All whitespace to space profile_name = re.sub("\s", " ", profile_name) # Get rid of inserted NULL bytes # Try to keep spacing intact if "\0" in profile_name: profile_name = re.sub("^(\0[_\- ]?)+|([_\- ]?\0)+$", "", profile_name) # Surrounded by underscores while "_\0" in profile_name or "\0_" in profile_name: while re.search("_\0+_", profile_name): profile_name = re.sub("_\0+_", "_", profile_name) profile_name = re.sub("_\0+", "_", profile_name) profile_name = re.sub("\0+_", "_", profile_name) # Surrounded by dashes while "-\0" in profile_name or "\0-" in profile_name: while re.search("-\0+-", profile_name): profile_name = re.sub("-\0+-", "-", profile_name) profile_name = re.sub("-\0+", "-", profile_name) profile_name = re.sub("\0+-", "-", profile_name) # Surrounded by whitespace while " \0" in profile_name or "\0 " in profile_name: while re.search(" \0+ ", profile_name): profile_name = re.sub(" \0+ ", " ", profile_name) profile_name = re.sub(" \0+", " ", profile_name) profile_name = re.sub("\0+ ", " ", profile_name) profile_name = re.sub("\0+", "", profile_name) # Get rid of characters considered invalid for filenames and shorten # to a length of chars # Also strip leading dashes which might trick Argyll tools into # mistaking parts of the profile name as an option parameter return re.sub(r"[\\/:*?\"<>|]+", "_", profile_name).lstrip("-")[:self.maxprofilenamelength] def update_profile_name(self, event=None): profile_name = self.create_profile_name() if not self.check_profile_name(profile_name): self.profile_name_textctrl.ChangeValue(getcfg("profile.name")) profile_name = self.create_profile_name() if not self.check_profile_name(profile_name): self.profile_name_textctrl.ChangeValue( defaults.get("profile.name", "")) profile_name = self.create_profile_name() profile_name = make_argyll_compatible_path(profile_name) if profile_name != self.profile_name.GetLabel(): setcfg("profile.name", self.profile_name_textctrl.GetValue()) self.profile_name.SetToolTipString(profile_name) self.profile_name.SetLabel(profile_name.replace("&", "&&")) setcfg("profile.name.expanded", profile_name) def check_profile_name(self, profile_name=None): if profile_name is None: profile_name = self.profile_name_textctrl.GetValue() if (re.match(r"^[^\\/:*?\"<>|]+$", profile_name) and not profile_name.startswith("-")): return True else: return False def get_ambient(self): if self.ambient_viewcond_adjust_cb.GetValue(): return str(stripzeros( self.ambient_viewcond_adjust_textctrl.GetValue())) return None def get_instrument_type(self): # Return the instrument type, "color" (colorimeter) or "spect" # (spectrometer) spect = self.worker.get_instrument_features().get("spectral", False) return "spect" if spect else "color" def get_measurement_mode(self): """ Return the measurement mode as string. Examples Argyll options -V -H (adaptive highres mode) Returned string 'VH' Argyll option -yl Returned string 'l' Argyll options -p -H (projector highres mode) Returned string 'pH' """ return self.measurement_modes_ab.get(self.get_instrument_type(), {}).get( self.measurement_mode_ctrl.GetSelection()) def get_profile_type(self): return self.profile_types_ab.get(self.profile_type_ctrl.GetSelection(), getcfg("profile.type")) def get_whitepoint(self): if self.whitepoint_ctrl.GetSelection() == 0: # Native return None elif self.whitepoint_ctrl.GetSelection() == 1: # Color temperature in kelvin return str(stripzeros( self.whitepoint_colortemp_textctrl.GetValue().replace(",", "."))) elif self.whitepoint_ctrl.GetSelection() == 2: x = self.whitepoint_x_textctrl.GetValue() try: x = round(x, 4) except ValueError: pass y = self.whitepoint_y_textctrl.GetValue() try: y = round(y, 4) except ValueError: pass return str(stripzeros(x)) + "," + str(stripzeros(y)) def get_whitepoint_locus(self): n = self.whitepoint_colortemp_locus_ctrl.GetSelection() if not n in self.whitepoint_colortemp_loci_ab: n = 0 return str(self.whitepoint_colortemp_loci_ab[n]) def get_luminance(self): if self.luminance_ctrl.GetSelection() == 0: return None else: return str(stripzeros(self.luminance_textctrl.GetValue())) def get_black_luminance(self): if self.black_luminance_ctrl.GetSelection() == 0: return None else: return str(stripzeros( self.black_luminance_textctrl.GetValue())) def get_black_output_offset(self): return str(Decimal(self.black_output_offset_ctrl.GetValue()) / 100) def get_black_point_correction(self): return str(Decimal(self.black_point_correction_ctrl.GetValue()) / 100) def get_black_point_rate(self): if defaults["calibration.black_point_rate.enabled"]: return str(self.black_point_rate_floatctrl.GetValue()) else: return None def get_trc_type(self): if self.trc_type_ctrl.GetSelection() == 1: return "G" else: return "g" def get_trc(self): if self.trc_ctrl.GetSelection() in (1, 4, 7): return str(stripzeros(self.trc_textctrl.GetValue().replace(",", "."))) elif self.trc_ctrl.GetSelection() == 2: return "l" elif self.trc_ctrl.GetSelection() == 3: return "709" elif self.trc_ctrl.GetSelection() == 5: return "240" elif self.trc_ctrl.GetSelection() == 6: return "s" else: return "" def get_calibration_quality(self): return self.quality_ab[self.calibration_quality_ctrl.GetValue()] def get_profile_quality(self): return self.quality_ab[self.profile_quality_ctrl.GetValue() + 1] def profile_settings_changed(self): ##cal = getcfg("calibration.file", False) ##if cal: ##filename, ext = os.path.splitext(cal) ##if ext.lower() in (".icc", ".icm"): ##if not os.path.exists(filename + ".cal") and \ ##not cal in self.presets: ##self.cal_changed() ##return if not self.updatingctrls: setcfg("settings.changed", 1) if self.calibration_file_ctrl.GetStringSelection()[0] != "*": sel = self.calibration_file_ctrl.GetSelection() if sel > 0: items = self.calibration_file_ctrl.GetItems() items[sel] = "* " + items[sel] self.calibration_file_ctrl.Freeze() self.calibration_file_ctrl.SetItems(items) self.calibration_file_ctrl.SetSelection(sel) self.calibration_file_ctrl.Thaw() def testchart_ctrl_handler(self, event): if debug: safe_print("[D] testchart_ctrl_handler called for ID %s %s event " "type %s %s" % (event.GetId(), getevtobjname(event, self), event.GetEventType(), getevttype(event))) self.set_testchart(self.testcharts[self.testchart_ctrl.GetSelection()]) wx.CallAfter(self.check_testchart_patches_amount) def testchart_btn_handler(self, event, path=None): if path is None: defaultDir, defaultFile = get_verified_path("testchart.file") dlg = wx.FileDialog(self, lang.getstr("dialog.set_testchart"), defaultDir=defaultDir, defaultFile=defaultFile, wildcard=lang.getstr("filetype.icc_ti1_ti3") + "|*.icc;*.icm;*.ti1;*.ti3", style=wx.FD_OPEN | wx.FD_FILE_MUST_EXIST) dlg.Center(wx.BOTH) result = dlg.ShowModal() if result == wx.ID_OK: path = dlg.GetPath() dlg.Destroy() if path: if not os.path.exists(path): InfoDialog(self, msg=lang.getstr("file.missing", path), ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error")) return filename, ext = os.path.splitext(path) if ext.lower() in (".icc", ".icm"): try: profile = ICCP.ICCProfile(path) except (IOError, ICCP.ICCProfileInvalidError), exception: InfoDialog(self, msg=lang.getstr("profile.invalid") + "\n" + path, ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error")) return ti3_lines = [line.strip() for line in StringIO(profile.tags.get("CIED", "") or profile.tags.get("targ", ""))] if not "CTI3" in ti3_lines: InfoDialog(self, msg=lang.getstr("profile.no_embedded_ti3") + "\n" + path, ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error")) return self.set_testchart(path) writecfg() self.profile_settings_changed() def testchart_patches_amount_ctrl_handler(self, event): auto = self.testchart_patches_amount_ctrl.GetValue() if event: setcfg("testchart.auto_optimize", auto) self.profile_settings_changed() proftype = getcfg("profile.type") if auto > 4: s = min(auto, 11) * 4 - 3 g = s * 3 - 2 patches_amount = get_total_patches(4, 4, s, g, auto, auto, 0) + 154 if event and proftype not in ("l", "x", "X"): setcfg("profile.type", "x" if getcfg("3dlut.create") else "X") else: if auto == 3: patches_amount = 73 else: patches_amount = 97 if event and proftype not in ("g", "G", "s", "S"): setcfg("profile.type", "S" if getcfg("trc") else "s") if proftype != getcfg("profile.type"): self.update_profile_type_ctrl() # Reset profile type to previous value so the handler method will # recognize a change in profile type and update BPC accordingly setcfg("profile.type", proftype) self.profile_type_ctrl_handler(None) self.testchart_patches_amount.SetLabel(str(patches_amount)) self.update_estimated_measurement_time("testchart") self.update_profile_name() def create_testchart_btn_handler(self, event): if not hasattr(self, "tcframe"): self.init_tcframe() elif not hasattr(self.tcframe, "ti1") or \ getcfg("testchart.file") not in (self.tcframe.ti1.filename, "auto"): self.tcframe.tc_load_cfg_from_ti1(cfg="testchart.file", parent_set_chart_methodname="set_testchart") setcfg("tc.show", 1) self.tcframe.Show() self.tcframe.Raise() return def init_tcframe(self, path=None): self.tcframe = TestchartEditor(self, path=path) def set_default_testchart(self, alert=True, force=False): path = getcfg("testchart.file") ##print "set_default_testchart", path if getcfg("profile.type") in ("l", "x", "X"): # cLUT if getcfg("testchart.auto_optimize") < 5: setcfg("testchart.auto_optimize", 5) else: # Gamma or shaper + matrix if getcfg("testchart.auto_optimize") > 4: setcfg("testchart.auto_optimize", 3) if path == "auto": self.set_testchart(path) return if os.path.basename(path) in self.dist_testchart_names: path = self.dist_testcharts[ self.dist_testchart_names.index(os.path.basename(path))] if debug: safe_print("[D] set_default_testchart testchart.file:", path) setcfg("testchart.file", path) if force or (lang.getstr(os.path.basename(path)) in [""] + self.default_testchart_names) or not os.path.isfile(path): if (not force and lang.getstr(os.path.basename(path)) in [""] + self.default_testchart_names): ti1 = os.path.basename(path) else: ti1 = self.testchart_defaults[self.get_profile_type()].get( self.get_profile_quality(), self.testchart_defaults[self.get_profile_type()][None]) if ti1 != "auto": path = get_data_path(os.path.join("ti1", ti1)) if not path or not os.path.isfile(path): if alert: InfoDialog(self, msg=lang.getstr("error.testchart.missing", ti1), ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error")) elif verbose >= 1: safe_print(lang.getstr("error.testchart.missing", ti1)) return False else: path = ti1 self.set_testchart(path) return True return None def set_testcharts(self, path=None): idx = self.testchart_ctrl.GetSelection() self.testchart_ctrl.Freeze() self.testchart_ctrl.SetItems(self.get_testchart_names(path)) self.testchart_ctrl.SetSelection(idx) self.testchart_ctrl.Thaw() def set_testchart(self, path=None, update_profile_name=True): if path is None: path = getcfg("testchart.file") ##print "set_testchart", path if path == "auto" and config.get_display_name() == "Untethered": self._current_testchart_path = path if self.IsShown(): wx.CallAfter(show_result_dialog, UnloggedInfo(lang.getstr("testchart.auto_optimize.untethered.unsupported")), self) path = getcfg("calibration.file", False) if not path or path.lower().endswith(".cal"): path = defaults["testchart.file"] self.create_testchart_btn.Enable(path != "auto" and not getcfg("profile.update")) self.menuitem_testchart_edit.Enable(self.create_testchart_btn.Enabled) self.testchart_patches_amount_label.Show(path == "auto") self.testchart_patches_amount_ctrl.Show(path == "auto") if path == "auto": if path != getcfg("testchart.file"): self.profile_settings_changed() setcfg("testchart.file", path) if path not in self.testcharts: self.set_testcharts(path) self.testchart_ctrl.SetSelection(0) self.testchart_ctrl.SetToolTipString("") self.worker.options_targen = ["-d3"] auto = getcfg("testchart.auto_optimize") or 7 self.testchart_patches_amount_ctrl.SetValue(auto) self.testchart_patches_amount_ctrl_handler(None) self._current_testchart_path = path else: self.set_testchart_from_path(path) self.check_testchart() if update_profile_name: self.update_profile_name() def set_testchart_from_path(self, path): result = check_file_isfile(path) if isinstance(result, Exception): show_result_dialog(result, self) self.set_default_testchart(force=True) return if getattr(self, "_current_testchart_path", None) == path: # Nothing to do return filename, ext = os.path.splitext(path) try: if ext.lower() in (".ti1", ".ti3"): if ext.lower() == ".ti3": ti1 = CGATS.CGATS(ti3_to_ti1(open(path, "rU"))) else: ti1 = CGATS.CGATS(path) else: # icc or icm profile profile = ICCP.ICCProfile(path) ti1 = CGATS.CGATS(ti3_to_ti1(profile.tags.get("CIED", "") or profile.tags.get("targ", ""))) try: ti1_1 = verify_ti1_rgb_xyz(ti1) except CGATS.CGATSError, exception: msg = {CGATS.CGATSKeyError: lang.getstr("error.testchart.missing_fields", (path, "RGB_R, RGB_G, RGB_B, " " XYZ_X, XYZ_Y, XYZ_Z"))}.get(exception.__class__, lang.getstr("error.testchart.invalid", path) + "\n" + lang.getstr(safe_str(exception))) InfoDialog(self, msg=msg, ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error")) self.set_default_testchart(force=True) return if path != getcfg("calibration.file", False): self.profile_settings_changed() if debug: safe_print("[D] set_testchart testchart.file:", path) setcfg("testchart.file", path) if path not in self.testcharts: self.set_testcharts(path) # The case-sensitive index could fail because of # case insensitive file systems, e.g. if the # stored filename string is # "C:\Users\Name\AppData\DisplayCAL\storage\MyFile" # but the actual filename is # "C:\Users\Name\AppData\DisplayCAL\storage\myfile" # (maybe because the user renamed the file) idx = index_fallback_ignorecase(self.testcharts, path) self.testchart_ctrl.SetSelection(idx) self.testchart_ctrl.SetToolTipString(path) if ti1.queryv1("COLOR_REP") and \ ti1.queryv1("COLOR_REP")[:3] == "RGB": self.worker.options_targen = ["-d3"] self.testchart_patches_amount.SetLabel( str(ti1.queryv1("NUMBER_OF_SETS"))) self._current_testchart_path = path except Exception, exception: error = traceback.format_exc() if debug else exception InfoDialog(self, msg=lang.getstr("error.testchart.read", path) + "\n\n" + safe_unicode(error), ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error")) self.set_default_testchart(force=True) else: self.update_estimated_measurement_time("testchart") if hasattr(self, "tcframe") and \ self.tcframe.IsShownOnScreen() and \ (not hasattr(self.tcframe, "ti1") or getcfg("testchart.file") != self.tcframe.ti1.filename): self.tcframe.tc_load_cfg_from_ti1(cfg="testchart.file", parent_set_chart_methodname="set_testchart") def check_testchart(self): if is_ccxx_testchart(): self.set_ccxx_measurement_mode() else: self.restore_measurement_mode() self.update_colorimeter_correction_matrix_ctrl() if not self.updatingctrls: self.update_main_controls() def get_testchart_names(self, path=None): testchart_names = [] self.testcharts = [] if path is None: path = getcfg("testchart.file") ##print "get_testchart_names", path if path != "auto" and os.path.exists(path): testchart_dir = os.path.dirname(path) try: testcharts = listdir_re(testchart_dir, "\.(?:icc|icm|ti1|ti3)$") except Exception, exception: safe_print(u"Error - directory '%s' listing failed: %s" % tuple(safe_unicode(s) for s in (testchart_dir, exception))) else: for testchart_name in testcharts: if testchart_name not in testchart_names: testchart_names.append(testchart_name) self.testcharts.append(os.pathsep.join((testchart_name, testchart_dir))) default_testcharts = get_data_path("ti1", "\.(?:icc|icm|ti1|ti3)$") if isinstance(default_testcharts, list): for testchart in default_testcharts: testchart_dir = os.path.dirname(testchart) testchart_name = os.path.basename(testchart) if testchart_name not in testchart_names: testchart_names.append(testchart_name) self.testcharts.append(os.pathsep.join((testchart_name, testchart_dir))) self.testcharts = ["auto"] + natsort(self.testcharts) self.testchart_names = [] i = 0 for chart in self.testcharts: chart = chart.split(os.pathsep) chart.reverse() self.testcharts[i] = os.path.join(*chart) if chart[-1] == "auto": testchart_name = "auto_optimized" else: testchart_name = chart[-1] self.testchart_names.append(lang.getstr(testchart_name)) i += 1 return self.testchart_names def set_argyll_bin_handler(self, event, silent=False, callafter=None, callafter_args=()): """ Set Argyll CMS binary executables directory """ if (getattr(self.worker, "thread", None) and self.worker.thread.isAlive()): wx.Bell() return if ((event and set_argyll_bin(self, silent, callafter, callafter_args)) or (not event and check_argyll_bin())): self.check_update_controls(True, callafter=callafter, callafter_args=callafter_args) def check_update_controls(self, event=None, silent=False, callafter=None, callafter_args=()): """ Update controls and menuitems when changes in displays or instruments are detected. Return True if update was needed and carried out, False otherwise. """ argyll_bin_dir = self.worker.argyll_bin_dir argyll_version = list(self.worker.argyll_version) displays = list(self.worker.displays) comports = list(self.worker.instruments) if event: # Explicitly called from menu enumerate_ports = True else: # Use configured value enumerate_ports = getcfg("enumerate_ports.auto") if event or silent: args = (self.check_update_controls_consumer, self.check_update_controls_producer) kwargs = dict(cargs=(argyll_bin_dir, argyll_version, displays, comports, event, callafter, callafter_args), wargs=(silent, ), wkwargs={"enumerate_ports": enumerate_ports}) if silent: self.thread = delayedresult.startWorker(*args, **kwargs) else: kwargs["progress_msg"] = lang.getstr("enumerating_displays_and_comports") kwargs["stop_timers"] = False kwargs["show_remaining_time"] = False kwargs["fancy"] = False self.worker.start(*args, **kwargs) else: self.worker.enumerate_displays_and_ports(silent, enumerate_ports=enumerate_ports) return self.check_update_controls_consumer(True, argyll_bin_dir, argyll_version, displays, comports, event, callafter, callafter_args) def check_update_controls_producer(self, silent=False, enumerate_ports=True): result = self.worker.enumerate_displays_and_ports(silent, enumerate_ports=enumerate_ports) if sys.platform == "win32": # Update profile loader configuration if running try: for host in self.get_scripting_hosts(): ip_port, name = host.split(None, 1) if name == appname + "-apply-profiles": ip, port = ip_port.split(":", 1) port = int(port) conn_result = self.connect(ip, port) if isinstance(conn_result, Exception): raise conn_result # Check if we're actually connected to the right # application (if it terminated unexpectedly, something # else may have grabbed the port) self.conn.send_command("getappname") response = self.conn.get_single_response() if response == appname + "-apply-profiles": self.conn.send_command('setcfg "argyll.dir" "%s"' % safe_str(getcfg("argyll.dir"), "UTF-8")) response = self.conn.get_single_response() if response != "ok": safe_print("Warning - could not update profile " "loader configuration: setcfg returned", response) del self.conn break except Exception, exception: safe_print("Warning - could not update profile loader " "configuration:", exception) return result def check_update_controls_consumer(self, result, argyll_bin_dir, argyll_version, displays, comports, event=None, callafter=None, callafter_args=None): if argyll_bin_dir != self.worker.argyll_bin_dir or \ argyll_version != self.worker.argyll_version: self.show_advanced_options_handler() self.worker.measurement_modes = {} self.update_measurement_modes() if comports == self.worker.instruments: self.update_colorimeter_correction_matrix_ctrl() self.update_black_point_rate_ctrl() self.update_drift_compensation_ctrls() self.update_profile_type_ctrl_items() self.profile_type_ctrl.SetSelection( self.profile_types_ba.get(getcfg("profile.type"), self.profile_types_ba.get(defaults["profile.type"], 0))) self.lut3d_init_input_profiles() self.lut3d_update_controls() if hasattr(self, "aboutdialog"): if self.aboutdialog.IsShownOnScreen(): self.aboutdialog_handler(None) if hasattr(self, "extra_args"): self.extra_args.update_controls() if hasattr(self, "gamapframe"): visible = self.gamapframe.IsShownOnScreen() self.gamapframe.Close() self.gamapframe.Destroy() del self.gamapframe if visible: self.gamap_btn_handler(None) if getattr(self, "lut3dframe", None): visible = self.lut3dframe.IsShownOnScreen() self.lut3dframe.Close() self.lut3dframe.Destroy() del self.lut3dframe if visible: self.lut3d_create_handler(None) if getattr(self, "reportframe", None): visible = self.reportframe.IsShownOnScreen() self.reportframe.Close() self.reportframe.Destroy() del self.reportframe if visible: self.measurement_report_create_handler(None) if hasattr(self, "tcframe"): visible = self.tcframe.IsShownOnScreen() self.tcframe.tc_close_handler() self.tcframe.Destroy() del self.tcframe if visible: self.create_testchart_btn_handler(None) if displays != self.worker.displays: self.update_displays(update_ccmx_items=True) if verbose >= 1: safe_print(lang.getstr("display_detected")) if comports != self.worker.instruments: self.update_comports() if verbose >= 1: safe_print(lang.getstr("comport_detected")) if event: # Check if we should import colorimeter corrections # or other instrument setup self.check_instrument_setup() if displays != self.worker.displays or \ comports != self.worker.instruments: if self.IsShownOnScreen(): self.update_menus() self.update_main_controls() returnvalue = True else: returnvalue = False if len(self.worker.displays): if getcfg("calibration.file", False): # Load LUT curves from last used .cal file self.load_cal(silent=True) else: # Load LUT curves from current display profile (if any, # and if it contains curves) self.load_display_profile_cal(None) if callafter: callafter(*callafter_args) return returnvalue def check_instrument_setup(self, callafter=None, callafter_args=()): # Check if we should import colorimeter corrections # or do other instrument specific setup if getcfg("colorimeter_correction_matrix_file") in ("AUTO:", ""): # Check for applicable corrections ccmx_instruments = self.ccmx_instruments.itervalues() i1d3 = ("i1 DisplayPro, ColorMunki Display" in self.worker.instruments and not "" in ccmx_instruments) icd = (("DTP94" in self.worker.instruments and not "DTP94" in ccmx_instruments) or ("i1 Display 2" in self.worker.instruments and not "i1 Display 2" in ccmx_instruments) or ("Spyder2" in self.worker.instruments and not "Spyder2" in ccmx_instruments) or ("Spyder3" in self.worker.instruments and not "Spyder3" in ccmx_instruments)) else: # Already using a suitable correction i1d3 = False icd = False spyd2 = ("Spyder2" in self.worker.instruments and not self.worker.spyder2_firmware_exists()) spyd4 = (("Spyder4" in self.worker.instruments or "Spyder5" in self.worker.instruments) and not self.worker.spyder4_cal_exists()) if spyd2: spyd2 = self.enable_spyder2_handler(True, i1d3 or icd or spyd4, callafter=callafter, callafter_args=callafter_args) result = spyd2 if not spyd2 and (i1d3 or icd or spyd4): result = self.import_colorimeter_corrections_handler(True, callafter=callafter, callafter_args=callafter_args) if not result and callafter: callafter(*callafter_args) def load_cal_handler(self, event, path=None, update_profile_name=True, silent=False, load_vcgt=True): """ Load settings and calibration """ if not check_set_argyll_bin(): return if path is None: wildcard = lang.getstr("filetype.cal_icc") + "|*.cal;*.icc;*.icm" sevenzip = get_program_file("7z", "7-zip") if sevenzip: wildcard += ";*.7z" wildcard += ";*.tar.gz;*.tgz;*.zip" defaultDir, defaultFile = get_verified_path("last_cal_or_icc_path") dlg = wx.FileDialog(self, lang.getstr("dialog.load_cal"), defaultDir=defaultDir, defaultFile=defaultFile, wildcard=wildcard, style=wx.FD_OPEN | wx.FD_FILE_MUST_EXIST) dlg.Center(wx.BOTH) if dlg.ShowModal() == wx.ID_OK: path = dlg.GetPath() dlg.Destroy() if path: if getcfg("settings.changed") and not self.settings_confirm_discard(): return if not os.path.exists(path): sel = self.calibration_file_ctrl.GetSelection() if len(self.recent_cals) > sel and \ self.recent_cals[sel] == path: self.recent_cals.remove(self.recent_cals[sel]) recent_cals = [] for recent_cal in self.recent_cals: if recent_cal not in self.presets: recent_cals.append(recent_cal) setcfg("recent_cals", os.pathsep.join(recent_cals)) self.calibration_file_ctrl.Delete(sel) cal = getcfg("calibration.file", False) or "" if not cal in self.recent_cals: self.recent_cals.append(cal) # The case-sensitive index could fail because of # case insensitive file systems, e.g. if the # stored filename string is # "C:\Users\Name\AppData\DisplayCAL\storage\MyFile" # but the actual filename is # "C:\Users\Name\AppData\DisplayCAL\storage\myfile" # (maybe because the user renamed the file) idx = index_fallback_ignorecase(self.recent_cals, cal) self.calibration_file_ctrl.SetSelection(idx) InfoDialog(self, msg=lang.getstr("file.missing", path), ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error")) return filename, ext = os.path.splitext(path) if ext.lower() in (".7z", ".tar.gz", ".tgz", ".zip"): self.import_session_archive(path) return if ext.lower() in (".icc", ".icm"): try: profile = ICCP.ICCProfile(path) except (IOError, ICCP.ICCProfileInvalidError), exception: InfoDialog(self, msg=lang.getstr("profile.invalid") + "\n" + path, ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error")) return if profile.profileClass != "mntr" or \ profile.colorSpace != "RGB": InfoDialog(self, msg=lang.getstr("profile.unsupported", (profile.profileClass, profile.colorSpace)) + "\n" + path, ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error")) return cal = StringIO(profile.tags.get("CIED", "") or profile.tags.get("targ", "")) else: try: cal = open(path, "rU") except Exception, exception: InfoDialog(self, msg=lang.getstr("error.file.open", path), ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error")) return ti3_lines = [line.strip() for line in cal] cal.close() setcfg("last_cal_or_icc_path", path) update_ccmx_items = True set_size = True display_match = False instrument_id = None instrument_match = False if ext.lower() in (".icc", ".icm"): setcfg("last_icc_path", path) if path not in self.presets: setcfg("3dlut.output.profile", path) setcfg("measurement_report.output_profile", path) # Disable 3D LUT tab when switching from madVR / Resolve setcfg("3dlut.tab.enable", 0) setcfg("3dlut.tab.enable.backup", 0) (options_dispcal, options_colprof) = get_options_from_profile(profile) # Get and set the display # First try to find the correct display by comparing # the model (if present) display_name = profile.getDeviceModelDescription() # Second try to find the correct display by comparing # the EDID hash (if present) edid_md5 = profile.tags.get("meta", {}).get("EDID_md5", {}).get("value") if display_name or edid_md5: display_name_indexes = [] edid_md5_indexes = [] for i, edid in enumerate(self.worker.display_edid): if display_name in (edid.get("monitor_name", False), self.worker.display_names[i]): display_name_indexes.append(i) if edid_md5 == edid.get("hash", False): edid_md5_indexes.append(i) if len(display_name_indexes) == 1: display_index = display_name_indexes[0] safe_print("Found display device matching model " "description at index #%i" % display_index) elif len(edid_md5_indexes) == 1: display_index = edid_md5_indexes[0] safe_print("Found display device matching EDID MD5 " "at index #%i" % display_index) else: # We got several matches. As we can't be sure which # is the right one, do nothing. display_index = None if display_index is not None: # Found it display_match = True setcfg("display.number", display_index + 1) self.get_set_display() if config.get_display_name() in ("madVR", "Resolve", "SII REPEATER"): # Don't disable 3D LUT tab when switching from # madVR / Resolve / eeColor setcfg("3dlut.tab.enable.backup", 1) # Get and set the instrument instrument_id = profile.tags.get("meta", {}).get("MEASUREMENT_device", {}).get("value") if instrument_id: for i, instrument in enumerate(self.worker.instruments): if instrument.lower() == instrument_id: # Found it instrument_match = True setcfg("comport.number", i + 1) self.update_comports() # No need to update ccmx items in update_controls, # as comport_ctrl_handler took care of it update_ccmx_items = False # comport_ctrl_handler already called set_size set_size = False break else: try: (options_dispcal, options_colprof) = get_options_from_cal(path) except (IOError, CGATS.CGATSError), exception: InfoDialog(self, msg=lang.getstr("calibration.file.invalid") + "\n" + path, ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error")) return black_point_correction = False if options_dispcal or options_colprof: if debug: safe_print("[D] options_dispcal:", options_dispcal) if debug: safe_print("[D] options_colprof:", options_colprof) ccxxsetting = getcfg("colorimeter_correction_matrix_file").split(":", 1)[0] ccmx = None # Check if TRC was set trc = False if options_dispcal: for o in options_dispcal: if o[0] in ("g", "G"): trc = True # Restore defaults self.restore_defaults_handler( include=("calibration", "drift_compensation", "measure.darken_background", "measure.override_min_display_update_delay_ms", "measure.min_display_update_delay_ms", "measure.override_display_settle_time_mult", "measure.display_settle_time_mult", "observer", "trc", "whitepoint"), exclude=("calibration.black_point_correction_choice.show", "calibration.update", "calibration.use_video_lut", "measure.darken_background.show_warning", "trc.should_use_viewcond_adjust.show_msg"), override={"trc": ""} if not trc else None) # Parse options if options_dispcal: self.worker.options_dispcal = ["-" + arg for arg in options_dispcal] for o in options_dispcal: if o[0] == "d" and o[1:] in ("web", "madvr"): # Special case web and madvr so it can be used in # preset templates which are TI3 files for i, display_name in enumerate(self.worker.display_names): if (display_name.lower() == o[1:] and getcfg("display.number") != i + 1): # Found it display_match = True setcfg("display.number", i + 1) self.get_set_display() break continue if o[0] == "m": setcfg("calibration.interactive_display_adjustment", 0) continue ##if o[0] == "o": ##setcfg("profile.update", 1) ##continue ##if o[0] == "u": ##setcfg("calibration.update", 1) ##continue if o[0] == "q": setcfg("calibration.quality", o[1]) continue if o[0] == "y" and getcfg("measurement_mode") != "auto": setcfg("measurement_mode", o[1]) continue if o[0] in ("t", "T"): setcfg("whitepoint.colortemp.locus", o[0]) if o[1:]: setcfg("whitepoint.colortemp", int(float(o[1:]))) setcfg("whitepoint.x", None) setcfg("whitepoint.y", None) continue if o[0] == "w": o = o[1:].split(",") setcfg("whitepoint.colortemp", None) setcfg("whitepoint.x", o[0]) setcfg("whitepoint.y", o[1]) continue if o[0] == "b": setcfg("calibration.luminance", o[1:]) continue if o[0] in ("g", "G"): setcfg("trc.type", o[0]) setcfg("trc", o[1:]) continue if o[0] == "f": setcfg("calibration.black_output_offset", o[1:]) continue if o[0] == "a": setcfg("calibration.ambient_viewcond_adjust", 1) setcfg("calibration.ambient_viewcond_adjust.lux", o[1:]) continue if o[0] == "k": if stripzeros(o[1:]) >= 0: black_point_correction = True setcfg("calibration.black_point_correction", o[1:]) continue if o[0] == "A": setcfg("calibration.black_point_rate", o[1:]) continue if o[0] == "B": setcfg("calibration.black_luminance", o[1:]) continue if o[0] in ("p", "P") and len(o[1:]) >= 5: setcfg("dimensions.measureframe", o[1:]) setcfg("dimensions.measureframe.unzoomed", o[1:]) continue if o[0] == "V": setcfg("measurement_mode.adaptive", 1) continue if o[0:2] == "YA": setcfg("measurement_mode.adaptive", 0) continue if o[0] == "H": setcfg("measurement_mode.highres", 1) continue if o[0] == "p" and len(o[1:]) == 0: setcfg("measurement_mode.projector", 1) continue if o[0] == "F": setcfg("measure.darken_background", 1) continue if o[0] == "X": o = o.split(None, 1) ccmx = o[-1][1:-1] if not os.path.isabs(ccmx): ccmx = os.path.join(os.path.dirname(path), ccmx) # Need to update ccmx items again even if # comport_ctrl_handler already did update_ccmx_items = True continue if o[0] == "I": if "b" in o[1:]: setcfg("drift_compensation.blacklevel", 1) if "w" in o[1:]: setcfg("drift_compensation.whitelevel", 1) continue if o[0] == "Q": setcfg("observer", o[1:]) # Need to update ccmx items again even if # comport_ctrl_handler already did because CCMX # observer may override calibration observer update_ccmx_items = True continue if trc and not black_point_correction: setcfg("calibration.black_point_correction.auto", 1) if not ccmx: ccxx = (glob.glob(os.path.join(os.path.dirname(path), "*.ccmx")) or glob.glob(os.path.join(os.path.dirname(path), "*.ccss"))) if ccxx and len(ccxx) == 1: ccmx = ccxx[0] update_ccmx_items = True if ccmx: setcfg("colorimeter_correction_matrix_file", "%s:%s" % (ccxxsetting, ccmx)) if options_colprof: # restore defaults self.restore_defaults_handler( include=("profile", "gamap_", "3dlut.create", "3dlut.output.profile.apply_cal", "testchart.auto_optimize"), exclude=("3dlut.tab.enable.backup", "profile.update", "profile.name", "gamap_default_intent", "testchart.auto_optimize.fix_zero_blackpoint")) for o in options_colprof: if o[0] == "q": setcfg("profile.quality", o[1]) continue if o[0] == "b": setcfg("profile.quality.b2a", o[1] or "l") continue if o[0] == "a": setcfg("profile.type", o[1]) continue if o[0] in ("s", "S"): o = o.split(None, 1) setcfg("gamap_profile", o[-1][1:-1]) setcfg("gamap_perceptual", 1) if o[0] == "S": setcfg("gamap_saturation", 1) continue if o[0] == "c": setcfg("gamap_src_viewcond", o[1:]) continue if o[0] == "d": setcfg("gamap_out_viewcond", o[1:]) continue if o[0] == "t": setcfg("gamap_perceptual_intent", o[1:]) continue if o[0] == "T": setcfg("gamap_saturation_intent", o[1:]) continue setcfg("calibration.file", path) if "CTI3" in ti3_lines: if debug: safe_print("[D] load_cal_handler testchart.file:", path) setcfg("testchart.file", path) if 'USE_BLACK_POINT_COMPENSATION "YES"' in ti3_lines: setcfg("profile.black_point_compensation", 1) elif 'USE_BLACK_POINT_COMPENSATION "NO"' in ti3_lines: setcfg("profile.black_point_compensation", 0) if 'HIRES_B2A "YES"' in ti3_lines: setcfg("profile.b2a.hires", 1) elif 'HIRES_B2A "NO"' in ti3_lines: setcfg("profile.b2a.hires", 0) if 'SMOOTH_B2A "YES"' in ti3_lines: if not 'HIRES_B2A "NO"' in ti3_lines: setcfg("profile.b2a.hires", 1) setcfg("profile.b2a.hires.smooth", 1) elif 'SMOOTH_B2A "NO"' in ti3_lines: if not 'HIRES_B2A "YES"' in ti3_lines: setcfg("profile.b2a.hires", 0) setcfg("profile.b2a.hires.smooth", 0) if 'BEGIN_DATA_FORMAT' in ti3_lines: cfgend = ti3_lines.index('BEGIN_DATA_FORMAT') cfgpart = CGATS.CGATS("\n".join(ti3_lines[:cfgend])) for keyword, cfgname in {"SMOOTH_B2A_SIZE": "profile.b2a.hires.size", "HIRES_B2A_SIZE": "profile.b2a.hires.size", "MIN_DISPLAY_UPDATE_DELAY_MS": "measure.min_display_update_delay_ms", "DISPLAY_SETTLE_TIME_MULT": "measure.display_settle_time_mult", "AUTO_OPTIMIZE": "testchart.auto_optimize", "3DLUT_SOURCE_PROFILE": "3dlut.input.profile", "3DLUT_GAMMA": "3dlut.trc_gamma", "3DLUT_DEGREE_OF_BLACK_OUTPUT_OFFSET": "3dlut.trc_output_offset", "3DLUT_INPUT_ENCODING": "3dlut.encoding.input", "3DLUT_OUTPUT_ENCODING": "3dlut.encoding.output", "3DLUT_GAMUT_MAPPING_MODE": "3dlut.gamap.use_b2a", "3DLUT_RENDERING_INTENT": "3dlut.rendering_intent", "3DLUT_FORMAT": "3dlut.format", "3DLUT_SIZE": "3dlut.size", "3DLUT_INPUT_BITDEPTH": "3dlut.bitdepth.input", "3DLUT_OUTPUT_BITDEPTH": "3dlut.bitdepth.output", "3DLUT_APPLY_CAL": "3dlut.output.profile.apply_cal"}.iteritems(): cfgvalue = cfgpart.queryv1(keyword) if keyword in ("MIN_DISPLAY_UPDATE_DELAY_MS", "DISPLAY_SETTLE_TIME_MULT"): backup = getcfg("measure.override_%s.backup" % keyword.lower(), False) if (cfgvalue is not None and display_match and (instrument_match or not instrument_id)): # Only set display update delay if a matching # display/instrument stored in profile meta # tag or no instrument ID (i.e. a preset) if backup is None: setcfg("measure.override_%s.backup" % keyword.lower(), getcfg("measure.override_" + keyword.lower())) setcfg("measure.%s.backup" % keyword.lower(), getcfg("measure." + keyword.lower())) setcfg("measure.override_" + keyword.lower(), 1) elif backup is not None: setcfg("measure.override_" + keyword.lower(), backup) cfgvalue = getcfg("measure.%s.backup" % keyword.lower()) setcfg("measure.override_%s.backup" % keyword.lower(), None) setcfg("measure.%s.backup" % keyword.lower(), None) elif cfgvalue is not None: if keyword == "AUTO_OPTIMIZE" and cfgvalue: setcfg("testchart.file", "auto") elif keyword == "3DLUT_GAMMA": try: cfgvalue = float(cfgvalue) except: pass else: if cfgvalue < 0: gamma_type = "B" cfgvalue = abs(cfgvalue) else: gamma_type = "b" setcfg("3dlut.trc_gamma_type", gamma_type) # Sync measurement report settings setcfg("measurement_report.trc_gamma_type", gamma_type) setcfg("measurement_report.apply_black_offset", 0) setcfg("measurement_report.apply_trc", 1) elif keyword == "3DLUT_GAMUT_MAPPING_MODE": if cfgvalue == "G": cfgvalue = 0 else: cfgvalue = 1 if keyword.startswith("3DLUT"): setcfg("3dlut.create", 1) setcfg("3dlut.tab.enable", 1) setcfg("3dlut.tab.enable.backup", 1) if cfgvalue is not None: cfgvalue = safe_unicode(cfgvalue, "UTF-7") setcfg(cfgname, cfgvalue) # Sync measurement report settings if cfgname == "3dlut.input.profile": setcfg("measurement_report.simulation_profile", cfgvalue) setcfg("measurement_report.use_simulation_profile", 1) setcfg("measurement_report.use_simulation_profile_as_output", 1) elif cfgname in ("3dlut.trc_gamma", "3dlut.trc_output_offset"): cfgname = cfgname.replace("3dlut", "measurement_report") setcfg(cfgname, cfgvalue) elif cfgname == "3dlut.format": if cfgvalue == "madVR": setcfg("3dlut.enable", 1) if cfgvalue in ("eeColor", "madVR"): setcfg("measurement_report.use_devlink_profile", 0) if not display_match: self.update_menus() if not update_ccmx_items: self.update_estimated_measurement_time("cal") self.lut3d_set_path() if config.get_display_name() == "Resolve": setcfg("3dlut.enable", 0) setcfg("measurement_report.use_devlink_profile", 1) elif config.get_display_name(None, True) == "Prisma": setcfg("3dlut.enable", 1) setcfg("measurement_report.use_devlink_profile", 0) self.update_controls( update_profile_name=update_profile_name, update_ccmx_items=update_ccmx_items) if set_size: self.set_size(True) writecfg() if ext.lower() in (".icc", ".icm"): if load_vcgt: # load calibration into lut self.load_cal(silent=True) if options_dispcal and options_colprof: return elif options_dispcal: msg = lang.getstr("settings_loaded.cal_and_lut") else: msg = lang.getstr("settings_loaded.profile_and_lut") elif options_dispcal and options_colprof: msg = lang.getstr("settings_loaded.cal_and_profile") elif options_dispcal: if not load_vcgt: msg = lang.getstr("settings_loaded.cal") else: # load calibration into lut self.load_cal(silent=True) msg = lang.getstr("settings_loaded.cal_and_lut") else: msg = lang.getstr("settings_loaded.profile") #if not silent: #InfoDialog(self, msg=msg + "\n" + path, ok=lang.getstr("ok"), #bitmap=geticon(32, "dialog-information")) return elif ext.lower() in (".icc", ".icm"): sel = self.calibration_file_ctrl.GetSelection() if len(self.recent_cals) > sel and self.recent_cals[sel] == path: self.recent_cals.remove(self.recent_cals[sel]) self.calibration_file_ctrl.Delete(sel) cal = getcfg("calibration.file", False) or "" if not cal in self.recent_cals: self.recent_cals.append(cal) # The case-sensitive index could fail because of # case insensitive file systems, e.g. if the # stored filename string is # "C:\Users\Name\AppData\DisplayCAL\storage\MyFile" # but the actual filename is # "C:\Users\Name\AppData\DisplayCAL\storage\myfile" # (maybe because the user renamed the file) idx = index_fallback_ignorecase(self.recent_cals, cal) self.calibration_file_ctrl.SetSelection(idx) if not silent: InfoDialog(self, msg=lang.getstr("no_settings") + "\n" + path, ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error")) return # Old .cal file without ARGYLL_DISPCAL_ARGS section setcfg("last_cal_path", path) # Restore defaults self.restore_defaults_handler( include=("calibration", "profile.update", "measure.override_min_display_update_delay_ms", "measure.min_display_update_delay_ms", "measure.override_display_settle_time_mult", "measure.display_settle_time_mult", "trc", "whitepoint"), exclude=("calibration.black_point_correction_choice.show", "calibration.update", "trc.should_use_viewcond_adjust.show_msg")) self.worker.options_dispcal = [] settings = [] for line in ti3_lines: line = line.strip().split(" ", 1) if len(line) > 1: value = line[1][1:-1] # strip quotes if line[0] == "DEVICE_CLASS": if value != "DISPLAY": InfoDialog(self, msg=lang.getstr( "calibration.file.invalid") + "\n" + path, ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error")) return elif line[0] == "DEVICE_TYPE": measurement_mode = value.lower()[0] if measurement_mode in ("c", "l"): setcfg("measurement_mode", measurement_mode) self.worker.options_dispcal.append("-y" + measurement_mode) elif line[0] == "NATIVE_TARGET_WHITE": setcfg("whitepoint.colortemp", None) setcfg("whitepoint.x", None) setcfg("whitepoint.y", None) settings.append(lang.getstr("whitepoint")) elif line[0] == "TARGET_WHITE_XYZ": XYZ = value.split() i = 0 try: for component in XYZ: # Normalize to 0.0 - 1.0 XYZ[i] = float(component) / 100 i += 1 except ValueError, exception: continue x, y, Y = XYZ2xyY(XYZ[0], XYZ[1], XYZ[2]) k = XYZ2CCT(XYZ[0], XYZ[1], XYZ[2]) if not lang.getstr("whitepoint") in settings: setcfg("whitepoint.colortemp", None) setcfg("whitepoint.x", round(x, 6)) setcfg("whitepoint.y", round(y, 6)) self.worker.options_dispcal.append( "-w%s,%s" % (getcfg("whitepoint.x"), getcfg("whitepoint.y"))) settings.append(lang.getstr("whitepoint")) setcfg("calibration.luminance", stripzeros(round(Y * 100, 3))) self.worker.options_dispcal.append( "-b%s" % getcfg("calibration.luminance")) settings.append(lang.getstr("calibration.luminance")) elif line[0] == "TARGET_GAMMA": setcfg("trc", None) if value in ("L_STAR", "REC709", "SMPTE240M", "sRGB"): setcfg("trc.type", "g") if value == "L_STAR": setcfg("trc", "l") elif value == "REC709": setcfg("trc", "709") elif value == "SMPTE240M": setcfg("trc", "240") elif value == "sRGB": setcfg("trc", "s") else: try: value = stripzeros(value) if float(value) < 0: setcfg("trc.type", "G") value = abs(value) else: setcfg("trc.type", "g") setcfg("trc", value) except ValueError: continue self.worker.options_dispcal.append( "-" + getcfg("trc.type") + str(getcfg("trc"))) settings.append(lang.getstr("trc")) elif line[0] == "DEGREE_OF_BLACK_OUTPUT_OFFSET": setcfg("calibration.black_output_offset", stripzeros(value)) self.worker.options_dispcal.append( "-f%s" % getcfg("calibration.black_output_offset")) settings.append( lang.getstr("calibration.black_output_offset")) elif line[0] == "BLACK_POINT_CORRECTION": if stripzeros(value) >= 0: black_point_correction = True setcfg("calibration.black_point_correction", stripzeros(value)) self.worker.options_dispcal.append( "-k%s" % getcfg("calibration.black_point_correction")) settings.append( lang.getstr("calibration.black_point_correction")) elif line[0] == "TARGET_BLACK_BRIGHTNESS": setcfg("calibration.black_luminance", stripzeros(value)) self.worker.options_dispcal.append( "-B%s" % getcfg("calibration.black_luminance")) settings.append(lang.getstr("calibration.black_luminance")) elif line[0] == "QUALITY": setcfg("calibration.quality", value.lower()[0]) self.worker.options_dispcal.append( "-q" + getcfg("calibration.quality")) settings.append(lang.getstr("calibration.quality")) if not black_point_correction: setcfg("calibration.black_point_correction.auto", 1) setcfg("calibration.file", path) self.update_controls(update_profile_name=update_profile_name) if "CTI3" in ti3_lines: if debug: safe_print("[D] load_cal_handler testchart.file:", path) setcfg("testchart.file", path) writecfg() if load_vcgt: # load calibration into lut self.load_cal(silent=True) if len(settings) == 0: msg = lang.getstr("no_settings") else: msg = lang.getstr("settings_loaded", ", ".join(settings)) if not silent and len(settings) == 0: InfoDialog(self, msg=msg + "\n" + path, ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-information")) if (load_vcgt and getattr(self, "lut_viewer", None) and sys.platform == "win32"): # Needed under Windows when using double buffering self.lut_viewer.Refresh() def delete_calibration_handler(self, event): cal = getcfg("calibration.file", False) if cal and os.path.exists(cal): caldir = os.path.dirname(cal) try: dircontents = os.listdir(caldir) except Exception, exception: InfoDialog(self, msg=safe_unicode(exception), ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error")) return self.related_files = {} for entry in dircontents: fn, ext = os.path.splitext(entry) if ext.lower() in (".app", script_ext): fn, ext = os.path.splitext(fn) if (fn.startswith(os.path.splitext(os.path.basename(cal))[0]) or ext.lower() in (".ccss", ".ccmx")): self.related_files[entry] = True self.dlg = dlg = ConfirmDialog( self, msg=lang.getstr("dialog.confirm_delete"), ok=lang.getstr("delete"), cancel=lang.getstr("cancel"), bitmap=geticon(32, "dialog-warning")) if self.related_files: scale = getcfg("app.dpi") / config.get_default_dpi() if scale < 1: scale = 1 scrolled = ScrolledPanel(dlg, -1, style=wx.VSCROLL) sizer = scrolled.Sizer = wx.BoxSizer(wx.VERTICAL) dlg.sizer3.Add(scrolled, flag=wx.TOP | wx.EXPAND, border=12) for i, related_file in enumerate(self.related_files): if i: sizer.Add((0, 4)) chk = wx.CheckBox(scrolled, -1, related_file) chk.SetValue(self.related_files[related_file]) dlg.Bind(wx.EVT_CHECKBOX, self.delete_calibration_related_handler, id=chk.GetId()) sizer.Add(chk, flag=wx.ALIGN_LEFT) scrolled.SetupScrolling() scrolled.MinSize = (min(scrolled.GetVirtualSize()[0] + 4 * scale + wx.SystemSettings_GetMetric(wx.SYS_VSCROLL_X), self.GetDisplay().ClientArea[2] - (12 * 3 + 32) * scale), min(((chk.Size[1] + 4) * min(len(self.related_files), 20) - 4) * scale, max(self.GetDisplay().ClientArea[3] - dlg.Size[1] - 40 * scale, chk.Size[1]))) dlg.sizer0.SetSizeHints(dlg) dlg.sizer0.Layout() dlg.Center() result = dlg.ShowModal() dlg.Destroy() if result == wx.ID_OK: delete_related_files = [] if self.related_files: for related_file in self.related_files: if self.related_files[related_file]: delete_related_files.append( os.path.join(os.path.dirname(cal), related_file)) if sys.platform == "darwin": trashcan = lang.getstr("trashcan.mac") elif sys.platform == "win32": trashcan = lang.getstr("trashcan.windows") else: trashcan = lang.getstr("trashcan.linux") orphan_related_files = delete_related_files try: if (sys.platform == "darwin" and len(delete_related_files) + 1 == len(dircontents) and ".DS_Store" in dircontents) or \ len(delete_related_files) == len(dircontents): # Delete whole folder deleted = trash([os.path.dirname(cal)]) else: deleted = trash(delete_related_files) orphan_related_files = filter(lambda related_file: os.path.exists(related_file), delete_related_files) if orphan_related_files: InfoDialog(self, msg=lang.getstr("error.deletion", trashcan) + "\n\n" + "\n".join(os.path.basename(related_file) for related_file in orphan_related_files), ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error")) except TrashAborted, exception: if exception.args[0] == -1: # Whole operation was aborted return except TrashcanUnavailableError, exception: InfoDialog(self, msg=lang.getstr("error.trashcan_unavailable", trashcan), ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error")) except Exception, exception: InfoDialog(self, msg=lang.getstr("error.deletion", trashcan) + "\n\n" + safe_unicode(exception), ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error")) # The case-sensitive index could fail because of # case insensitive file systems, e.g. if the # stored filename string is # "C:\Users\Name\AppData\DisplayCAL\storage\MyFile" # but the actual filename is # "C:\Users\Name\AppData\DisplayCAL\storage\myfile" # (maybe because the user renamed the file) idx = index_fallback_ignorecase(self.recent_cals, cal) self.recent_cals.remove(cal) self.calibration_file_ctrl.Delete(idx) setcfg("calibration.file", None) setcfg("settings.changed", 1) recent_cals = [] for recent_cal in self.recent_cals: if recent_cal not in self.presets: recent_cals.append(recent_cal) setcfg("recent_cals", os.pathsep.join(recent_cals)) update_colorimeter_correction_matrix_ctrl_items = False update_testcharts = False for path in delete_related_files: if path not in orphan_related_files: if (os.path.splitext(path)[1].lower() in (".ccss", ".ccmx")): self.delete_colorimeter_correction_matrix_ctrl_item(path) update_colorimeter_correction_matrix_ctrl_items = True elif path in self.testcharts: update_testcharts = True if update_testcharts: self.set_testcharts() self.update_controls(False, update_colorimeter_correction_matrix_ctrl_items) self.load_display_profile_cal() def delete_calibration_related_handler(self, event): chk = self.dlg.FindWindowById(event.GetId()) self.related_files[chk.GetLabel()]=chk.GetValue() def aboutdialog_handler(self, event): if hasattr(self, "aboutdialog"): self.aboutdialog.Destroy() self.aboutdialog = AboutDialog(self, -1, lang.getstr("menu.about"), size=(100, 100)) self.aboutdialog.BackgroundColour = wx.SystemSettings.GetColour(wx.SYS_COLOUR_WINDOW) items = [] items.append(get_header(self.aboutdialog, getbitmap("theme/header", False), label=wrap(lang.getstr("header"), 32), size=(320, 120), repeat_sub_bitmap_h=(220, 0, 2, 180))) bmp = getbitmap("theme/gradient", False) if bmp.Size[0] >= 8 and bmp.Size[1] >= 96: separator = BitmapBackgroundPanel(self.aboutdialog, size=(-1, 1)) separator.SetBackgroundColour(wx.SystemSettings.GetColour(wx.SYS_COLOUR_3DSHADOW)) items.append(separator) shadow = BitmapBackgroundPanel(self.aboutdialog, size=(-1, 15)) bmp = bmp.GetSubBitmap((0, 1, 8, 15)).ConvertToImage().Mirror(False).ConvertToBitmap() image = bmp.ConvertToImage() databuffer = image.GetDataBuffer() for i, byte in enumerate(databuffer): if byte > "\0": databuffer[i] = chr(int(min(round(ord(byte) * (255.0 / 223.0)), 255))) bmp = image.ConvertToBitmap() shadow.BackgroundColour = self.aboutdialog.BackgroundColour shadow.SetBitmap(bmp) shadow.blend = True items.append(shadow) items.append((1, 8)) version_title = version_short if VERSION > VERSION_BASE: version_title += " Beta" items.append(wx.StaticText(self.aboutdialog, -1, u"%s %s © %s" % (appname, version_title, author))) items.append(HyperLinkCtrl( self.aboutdialog, -1, label=domain, URL="http://%s" % domain)) items.append(wx.StaticText(self.aboutdialog, -1, "")) items.append(wx.StaticText(self.aboutdialog, -1, u"Argyll CMS %s © Graeme Gill" % self.worker.argyll_version_string)) items.append(HyperLinkCtrl( self.aboutdialog, -1, label="argyllcms.com", URL="http://www.argyllcms.com")) items.append(wx.StaticText(self.aboutdialog, -1, "")) items.append(wx.StaticText(self.aboutdialog, -1, u"%s:" % lang.getstr("translations"))) lauthors = {} for lcode in lang.ldict: lauthor = lang.ldict[lcode].get("!author", "") language = lang.ldict[lcode].get("!language", "") if lauthor and language: if not lauthors.get(lauthor): lauthors[lauthor] = [] lauthors[lauthor].append(language) lauthors = [(lauthors[lauthor], lauthor) for lauthor in lauthors] lauthors.sort() for langs, lauthor in lauthors: items.append(wx.StaticText(self.aboutdialog, -1, "%s - %s" % (", ".join(langs), lauthor))) items.append(wx.StaticText(self.aboutdialog, -1, "")) match = re.match("([^(]+)\s*(\([^(]+\))?\s*(\[[^[]+\])?", sys.version) if match: pyver_long = match.groups() else: pyver_long = [sys.version] items.append(wx.StaticText(self.aboutdialog, -1, "Python " + pyver_long[0].strip())) items.append(HyperLinkCtrl( self.aboutdialog, -1, label="python.org", URL="http://www.python.org")) items.append(wx.StaticText(self.aboutdialog, -1, "")) items.append(wx.StaticText(self.aboutdialog, -1, "wxPython " + wx.version())) items.append(HyperLinkCtrl( self.aboutdialog, -1, label="wxpython.org", URL="http://www.wxpython.org")) items.append(wx.StaticText(self.aboutdialog, -1, "")) items.append(wx.StaticText(self.aboutdialog, -1, lang.getstr("audio.lib", "%s %s" % (audio._lib, audio._lib_version)))) items.append(wx.StaticText(self.aboutdialog, -1, "")) for item in items: if isinstance(item, HyperLinkCtrl): item.BackgroundColour = self.aboutdialog.BackgroundColour self.aboutdialog.add_items(items) self.aboutdialog.ok.BackgroundColour = self.aboutdialog.BackgroundColour self.aboutdialog.Layout() self.aboutdialog.Center() self.aboutdialog.Show() def readme_handler(self, event): readme = get_data_path("README.html") if readme: launch_file(readme) def license_handler(self, event): license = get_data_path("LICENSE.txt") if not license: # Debian license = "/usr/share/common-licenses/GPL-3" if license and os.path.isfile(license): launch_file(license) def help_support_handler(self, event): launch_file("http://%s/#help" % domain) def bug_report_handler(self, event): launch_file("http://%s/#reportbug" % domain) def app_update_check_handler(self, event, silent=False, argyll=False): if not hasattr(self, "app_update_check") or \ not self.app_update_check.isAlive(): self.app_update_check = threading.Thread(target=app_update_check, args=(self, silent, False, argyll)) self.app_update_check.start() def app_auto_update_check_handler(self, event): setcfg("update_check", int(self.menuitem_app_auto_update_check.IsChecked())) def infoframe_toggle_handler(self, event=None, show=None): if show is None: show = not self.infoframe.IsShownOnScreen() setcfg("log.show", int(show)) if show: self.log() else: logbuffer.truncate(0) self.infoframe.Show(show) self.menuitem_show_log.Check(show) self.menuitem_log_autoshow.Enable(not show) def infoframe_autoshow_handler(self, event): setcfg("log.autoshow", int(self.menuitem_log_autoshow.IsChecked())) def HideAll(self): self.stop_timers() if hasattr(self, "gamapframe"): self.gamapframe.Hide() if hasattr(self, "aboutdialog"): self.aboutdialog.Hide() if hasattr(self, "extra_args"): self.extra_args.Hide() logbuffer.truncate(0) self.infoframe.Hide() if hasattr(self, "tcframe"): self.tcframe.Hide() if getattr(self, "lut_viewer", None) and \ self.lut_viewer.IsShownOnScreen(): self.lut_viewer.Hide() if getattr(self, "lut3dframe", None): self.lut3dframe.Hide() if getattr(self, "reportframe", None): self.reportframe.Hide() if getattr(self, "synthiccframe", None): self.synthiccframe.Hide() for profile_info in self.profile_info.values(): profile_info.Close() self.Hide() self.enable_menus(False) def Show(self, show=True, start_timers=True): if not self.IsShownOnScreen(): if hasattr(self, "tcframe"): self.tcframe.Show(getcfg("tc.show")) if getcfg("log.show"): wx.CallAfter(self.infoframe_toggle_handler, show=True) if (LUTFrame and getcfg("lut_viewer.show") and self.worker.argyll_version > [0, 0, 0]): if getattr(self, "lut_viewer", None): self.init_lut_viewer(show=True) else: # Using wx.CallAfter fixes wrong positioning under wxGTK # with wxPython 3 on first initialization wx.CallAfter(self.init_lut_viewer, show=True) else: setcfg("lut_viewer.show", 0) for profile_info in reversed(self.profile_info.values()): profile_info.Show() if start_timers: self.start_timers() self.enable_menus() wx.Frame.Show(self, show) def OnClose(self, event=None): if (getattr(self.worker, "thread", None) and self.worker.thread.isAlive()): self.worker.abort_subprocess(True) return if sys.platform == "darwin" or debug: self.focus_handler(event) if not hasattr(self, "tcframe") or self.tcframe.tc_close_handler(): # If resources are missing, XRC shows an error dialog. # If the user never closees that dialog before he quits the # application, this dialog will hinder exiting the main loop. win = self.get_top_window() if isinstance(win, wx.Dialog) and win.IsModal(): win.Raise() wx.Bell() return writecfg() if getattr(self, "thread", None) and self.thread.isAlive(): self.Disable() if debug: safe_print("Waiting for child thread to exit...") self.thread.join() self.listening = False if isinstance(getattr(self.worker, "madtpg", None), madvr.MadTPG_Net): self.worker.madtpg.shutdown() self.HideAll() if self.worker.tempdir and os.path.isdir(self.worker.tempdir): self.worker.wrapup(False) wx.GetApp().ExitMainLoop() class StartupFrame(wx.Frame): def __init__(self): title = "%s %s" % (appname, version_short) if VERSION > VERSION_BASE: title += " Beta" wx.Frame.__init__(self, None, title="%s: %s" % (title, lang.getstr("startup")), style=wx.FRAME_SHAPED | wx.NO_BORDER) self.SetIcons(config.get_icon_bundle([256, 48, 32, 16], appname)) if wx.VERSION >= (2, 8, 12, 1): # Setup shape. Required to get rid of window shadow under Ubuntu. # Note that shaped windows seem to be broken (won't show at all) # with wxGTK 2.8.12.0 and possibly earlier. self.mask_bmp = getbitmap("theme/splash-mask") if wx.Platform == "__WXGTK__": # wxGTK requires that the window be created before you can # set its shape, so delay the call to SetWindowShape until # this event. self.Bind(wx.EVT_WINDOW_CREATE, self.SetWindowShape) else: # On wxMSW and wxMac the window has already been created. self.SetWindowShape() # Setup splash screen self.splash_bmp = getbitmap("theme/splash") self.splash_anim = [] for pth in get_data_path("theme/splash_anim", r"\.png$") or []: self.splash_anim.append(wx.Bitmap(pth)) self.zoom_scales = [] if getcfg("splash.zoom"): # Zoom in instead of fade numframes = 15 self.splash_alpha = self.splash_bmp.ConvertToImage().GetAlphaData() minv = 1.0 / self.splash_bmp.Size[0] for x in xrange(numframes): scale = minv + colormath.specialpow(0.35 + x / (numframes - 1.0) * (1 - 0.35), -2084) * (1 - minv) self.zoom_scales.append(scale) self.zoom_scales.append(1.02) self.zoom_scales.append(1.0) # Fade in major version number self.splash_version_anim = [] splash_version = getbitmap("theme/splash_version") if splash_version: im = splash_version.ConvertToImage() for alpha in [0, .2, .4, .6, .8, 1, .95, .9, .85, .8, .75]: imcopy = im.AdjustChannels(1, 1, 1, alpha) self.splash_version_anim.append(imcopy.ConvertToBitmap()) self.frame = 0 clientarea = self.GetDisplay().ClientArea self.splash_x, self.splash_y = (clientarea[0] + int(clientarea[2] / 2.0 - self.splash_bmp.Size[0] / 2.0), clientarea[1] + int(clientarea[3] / 2.0 - self.splash_bmp.Size[1] / 2.0)) self.Pulse("\n".join([lang.getstr("welcome_back" if hascfg("recent_cals") else "welcome"), lang.getstr("startup")])) self._bufferbitmap = wx.EmptyBitmap(self.splash_bmp.Size[0], self.splash_bmp.Size[1]) self._buffereddc = wx.MemoryDC(self._bufferbitmap) self.worker = Worker() # Grab a bitmap of the screen area we're going to draw on if sys.platform != "darwin": dc = wx.ScreenDC() # Grabbing from ScreenDC is not supported under Mac OS X self._buffereddc.Blit(0, 0, self.splash_bmp.Size[0], self.splash_bmp.Size[1], dc, self.splash_x, self.splash_y) elif not isinstance(self.worker.create_tempdir(), Exception): # Use screencapture utility under Mac OS X splashdimensions = (self.splash_x, self.splash_y, self.splash_bmp.Size[0], self.splash_bmp.Size[1]) is_mavericks = intlist(mac_ver()[0].split(".")) >= [10, 9] if is_mavericks: # Under 10.9 we can specify screen region as arguments extra_args = ["-R%i,%i,%i,%i" % splashdimensions] else: extra_args = [] bmp_path = os.path.join(self.worker.tempdir, "screencap.png") if self.worker.exec_cmd(which("screencapture"), extra_args + ["-x", "screencap.png"], capture_output=True, skip_scripts=True, silent=True) and os.path.isfile(bmp_path): bmp = wx.Bitmap(bmp_path) if bmp.IsOk(): if (not is_mavericks and bmp.Size[0] >= self.splash_x + self.splash_bmp.Size[0] and bmp.Size[1] >= self.splash_y + self.splash_bmp.Size[1]): # Pre 10.9 we have to get the splashscreen region # from the full screenshot bitmap bmp = bmp.GetSubBitmap(splashdimensions) elif (is_mavericks and bmp.Size[0] == self.splash_bmp.Size[0] * 2 and bmp.Size[1] == self.splash_bmp.Size[1] * 2): # Retina, screencapture is double our bitmap size if wx.VERSION > (3, ): quality = wx.IMAGE_QUALITY_BILINEAR else: quality = wx.IMAGE_QUALITY_HIGH img = bmp.ConvertToImage() img.Rescale(self.splash_bmp.Size[0], self.splash_bmp.Size[1], quality) bmp = img.ConvertToBitmap() self._buffereddc.DrawBitmap(bmp, 0, 0) self.worker.wrapup(False) self.SetClientSize(self.splash_bmp.Size) self.SetPosition((self.splash_x, self.splash_y)) self.Bind(wx.EVT_ERASE_BACKGROUND, self.OnEraseBackground) self.Bind(wx.EVT_PAINT, self.OnPaint) if len(self.zoom_scales): self._alpha = 255 else: self.SetTransparent(0) self._alpha = 0 audio.safe_init() if audio._lib: safe_print(lang.getstr("audio.lib", "%s %s" % (audio._lib, audio._lib_version))) # Startup sound # Needs to be stereo! if getcfg("startup_sound.enable"): self.startup_sound = audio.Sound(get_data_path("theme/intro_new.wav")) self.startup_sound.volume = .8 self.startup_sound.safe_play() self.Show() # We need to use CallLater instead of CallAfter otherwise dialogs # will not show while the main frame is not yet initialized wx.CallLater(1, self.startup) def startup(self): if self.IsShown() and self._alpha < 255: self._alpha += 15 self.SetTransparent(self._alpha) if sys.platform not in ("darwin", "win32"): self.Refresh() self.Update() wx.CallLater(1, self.startup) return if self.frame < (len(self.zoom_scales) + len(self.splash_anim) + len(self.splash_version_anim)) - 1: self.frame += 1 self.Refresh() self.Update() if self.frame < len(self.zoom_scales): wx.CallLater(1, self.startup) else: wx.CallLater(1000 / 30.0, self.startup) return # Give 10 seconds for display & instrument enumeration to run. # This should be plenty and will kill the subprocess in case it hangs. self.timeout = wx.CallLater(10000, self.worker.abort_subprocess) delayedresult.startWorker(self.setup_frame, self.worker.enumerate_displays_and_ports, wkwargs={"enumerate_ports": getcfg("enumerate_ports.auto") or not getcfg("instruments", raw=True), "silent": True}) def setup_frame(self, result): if self.timeout.IsRunning(): self.timeout.Stop() self.timeout = None if verbose >= 1: safe_print(lang.getstr("initializing_gui")) app = wx.GetApp() app.frame = MainFrame(self.worker) self.setup_frame_finish(app) def setup_frame_finish(self, app): if self.IsShown() and self._alpha > 0: self._alpha -= 15 self.SetTransparent(self._alpha) if sys.platform not in ("darwin", "win32"): self.Refresh() self.Update() wx.CallLater(1, self.setup_frame_finish, app) return app.SetTopWindow(app.frame) app.frame.listen() app.frame.Show() app.process_argv(1) wx.CallAfter(app.frame.Raise) # Check for updates if configured if getcfg("update_check"): # Give time for the main window to gain focus before checking for # update, otherwise the main window may steal the update # confirmation dialog's focus which looks weird wx.CallAfter(app.frame.app_update_check_handler, None, silent=True) else: # Check if we need to run instrument setup wx.CallAfter(app.frame.check_instrument_setup, check_donation, (app.frame, VERSION > VERSION_BASE)) # If resources are missing, XRC shows an error dialog which immediately # gets hidden when we close ourselves because we are the parent. # Hide instead. win = app.frame.get_top_window() if isinstance(win, wx.Dialog): self.Hide() else: self.Close() def OnEraseBackground(self, event): pass def OnPaint(self, event): if sys.platform != "win32": # AutoBufferedPaintDCFactory is the magic needed for crisp text # rendering in HiDPI mode under OS X and Linux cls = wx.AutoBufferedPaintDCFactory else: cls = wx.BufferedPaintDC self.Draw(cls(self)) def Draw(self, dc): # Background dc.SetBackgroundMode(wx.TRANSPARENT) if isinstance(dc, wx.ScreenDC): dc.StartDrawingOnTop() x, y = self.splash_x, self.splash_y else: dc.Clear() if hasattr(self, "_buffereddc"): dc.Blit(0, 0, self.splash_bmp.Size[0], self.splash_bmp.Size[1], self._buffereddc, 0, 0) x = y = 0 if self.frame < len(self.zoom_scales): pdc = dc bufferbitmap = wx.EmptyBitmap(self.splash_bmp.Size[0], self.splash_bmp.Size[1]) dc = wx.MemoryDC() dc.SelectObject(bufferbitmap) dc.SetBackgroundMode(wx.TRANSPARENT) dc.DrawBitmap(self.splash_bmp, x, y) # Text rect = wx.Rect(0, int(self.splash_bmp.Size[1] * 0.75), self.splash_bmp.Size[0], 40) dc.SetFont(self.GetFont()) # Version label label_str = version_short if VERSION > VERSION_BASE: label_str += " Beta" dc.SetTextForeground("#101010") yoff = 10 scale = getcfg("app.dpi") / config.get_default_dpi() if scale > 1: yoff = int(round(yoff * scale)) yoff -= 10 dc.DrawLabel(label_str, wx.Rect(rect.x, 110 + yoff, rect.width, 32), wx.ALIGN_CENTER | wx.ALIGN_TOP) dc.SetTextForeground(wx.BLACK) dc.DrawLabel(label_str, wx.Rect(rect.x, 111 + yoff, rect.width, 32), wx.ALIGN_CENTER | wx.ALIGN_TOP) dc.SetTextForeground("#CCCCCC") dc.DrawLabel(label_str, wx.Rect(rect.x, 112 + yoff, rect.width, 32), wx.ALIGN_CENTER | wx.ALIGN_TOP) # Message dc.SetTextForeground("#101010") dc.DrawLabel(self._msg, wx.Rect(rect.x, rect.y + 2, rect.width, rect.height), wx.ALIGN_CENTER | wx.ALIGN_TOP) dc.SetTextForeground(wx.BLACK) dc.DrawLabel(self._msg, wx.Rect(rect.x, rect.y + 1, rect.width, rect.height), wx.ALIGN_CENTER | wx.ALIGN_TOP) dc.SetTextForeground("#CCCCCC") dc.DrawLabel(self._msg, rect, wx.ALIGN_CENTER | wx.ALIGN_TOP) if self.frame < len(self.zoom_scales): # Zoom dc.DrawBitmap(self.splash_anim[0], x, y) dc.SelectObject(wx.NullBitmap) scale = self.zoom_scales[self.frame] frame = bufferbitmap.ConvertToImage() frame.SetAlphaData(self.splash_alpha) if scale < 1: frame = frame.Blur(int(round(1 * (1 - scale)))) if wx.VERSION > (3, ): quality = wx.IMAGE_QUALITY_BILINEAR else: quality = wx.IMAGE_QUALITY_HIGH frame.Rescale(max(int(round(self.splash_bmp.Size[0] * scale)), 1), max(int(round(self.splash_bmp.Size[1] * scale)), 1), quality) frame.Resize(self.splash_bmp.Size, (int(round(self.splash_bmp.Size[0] / 2 - frame.Width / 2)), int(round(self.splash_bmp.Size[1] / 2 - frame.Height / 2)))) pdc.DrawBitmap(frame.ConvertToBitmap(), x, y) else: # Animation if self.splash_anim: dc.DrawBitmap(self.splash_anim[min(self.frame - len(self.zoom_scales), len(self.splash_anim) - 1)], x, y) if self.frame > len(self.zoom_scales) + len(self.splash_anim) - 1: dc.DrawBitmap(self.splash_version_anim[self.frame - len(self.zoom_scales) - len(self.splash_anim)], x, y) if isinstance(dc, wx.ScreenDC): dc.EndDrawingOnTop() def Pulse(self, msg=None): if msg: self._msg = msg if self.IsShown(): self.Refresh() self.Update() return True, False def SetWindowShape(self, *evt): r = wx.RegionFromBitmapColour(self.mask_bmp, wx.BLACK) self.hasShape = self.SetShape(r) UpdatePulse = Pulse class MeasurementFileCheckSanityDialog(ConfirmDialog): def __init__(self, parent, ti3, suspicious, force=False): scale = getcfg("app.dpi") / config.get_default_dpi() if scale < 1: scale = 1 ConfirmDialog.__init__(self, parent, title=os.path.basename(ti3.filename) if ti3.filename else lang.getstr("measurement_file.check_sanity"), ok=lang.getstr("ok"), cancel=lang.getstr("cancel"), alt=lang.getstr("invert_selection"), bitmap=geticon(32, "dialog-warning"), wrap=120) msg_col1 = lang.getstr("warning.suspicious_delta_e") msg_col2 = lang.getstr("warning.suspicious_delta_e.info") margin = 12 dlg = self dlg.sizer3.Remove(0) # Remove message textbox dlg.message.Destroy() dlg.sizer4 = wx.BoxSizer(wx.HORIZONTAL) dlg.sizer3.Add(dlg.sizer4) dlg.message_col1 = wx.StaticText(dlg, -1, msg_col1) dlg.message_col1.Wrap(450 * scale) dlg.sizer4.Add(dlg.message_col1, flag=wx.RIGHT, border = 20) dlg.message_col2 = wx.StaticText(dlg, -1, msg_col2) dlg.message_col2.Wrap(450 * scale) dlg.sizer4.Add(dlg.message_col2, flag=wx.LEFT, border = 20) dlg.Unbind(wx.EVT_BUTTON, dlg.alt) dlg.Bind(wx.EVT_BUTTON, dlg.invert_selection_handler, id=dlg.alt.GetId()) dlg.select_all_btn = wx.Button(dlg.buttonpanel, -1, lang.getstr("deselect_all")) dlg.sizer2.Insert(2, (margin, margin)) dlg.sizer2.Insert(2, dlg.select_all_btn) dlg.Bind(wx.EVT_BUTTON, dlg.select_all_handler, id=dlg.select_all_btn.GetId()) dlg.ti3 = ti3 dlg.suspicious = suspicious dlg.mods = {} dlg.force = force if "gtk3" in wx.PlatformInfo: style = wx.BORDER_SIMPLE else: style = wx.BORDER_THEME dlg.grid = CustomGrid(dlg, -1, size=(940 * scale, 200 * scale), style=style) grid = dlg.grid grid.DisableDragRowSize() grid.SetCellHighlightPenWidth(0) grid.SetCellHighlightROPenWidth(0) grid.SetDefaultCellAlignment(wx.ALIGN_CENTER, wx.ALIGN_CENTER) grid.SetMargins(0, 0) grid.SetRowLabelAlignment(wx.ALIGN_RIGHT, wx.ALIGN_CENTER) grid.SetScrollRate(5, 5) grid.draw_horizontal_grid_lines = False grid.draw_vertical_grid_lines = False grid.CreateGrid(0, 15) grid.SetColLabelSize(int(round(self.grid.GetDefaultRowSize() * 2.4))) dc = wx.MemoryDC(wx.EmptyBitmap(1, 1)) dc.SetFont(grid.GetLabelFont()) w, h = dc.GetTextExtent("99%s" % dlg.ti3.DATA[dlg.ti3.NUMBER_OF_SETS - 1].SAMPLE_ID) grid.SetRowLabelSize(max(w, grid.GetDefaultRowSize())) w, h = dc.GetTextExtent("9999999999") for i in xrange(grid.GetNumberCols()): if i in (4, 5) or i > 8: attr = wx.grid.GridCellAttr() attr.SetReadOnly(True) grid.SetColAttr(i, attr) if i == 0: size = 22 * scale elif i in (4, 5): size = self.grid.GetDefaultRowSize() else: size = w grid.SetColSize(i, size) for i, label in enumerate(["", "R %", "G %", "B %", "", "", "X", "Y", "Z", u"\u0394E*00\nXYZ A/B", u"0.5 \u0394E*00\nRGB A/B", u"\u0394E*00\nRGB-XYZ", u"\u0394L*00\nRGB-XYZ", u"\u0394C*00\nRGB-XYZ", u"\u0394H*00\nRGB-XYZ"]): grid.SetColLabelValue(i, label) attr = wx.grid.GridCellAttr() #attr.SetReadOnly(True) attr.SetRenderer(CustomCellBoolRenderer()) grid.SetColAttr(0, attr) font = grid.GetDefaultCellFont() if font.PointSize > 11: font.PointSize = 11 grid.SetDefaultCellFont(font) grid.DisableDragColSize() grid.EnableGridLines(False) black = ti3.queryi1({"RGB_R": 0, "RGB_G": 0, "RGB_B": 0}) if black: black = black["XYZ_X"], black["XYZ_Y"], black["XYZ_Z"] dlg.black = black white = ti3.queryi1({"RGB_R": 100, "RGB_G": 100, "RGB_B": 100}) if white: white = white["XYZ_X"], white["XYZ_Y"], white["XYZ_Z"] dlg.white = white dlg.suspicious_items = [] grid.BeginBatch() for i, (prev, item, delta, sRGB_delta, prev_delta_to_sRGB, delta_to_sRGB) in enumerate(suspicious): for cur in (prev, item): if cur and cur not in dlg.suspicious_items: dlg.suspicious_items.append(cur) grid.AppendRows(1) row = grid.GetNumberRows() - 1 grid.SetRowLabelValue(row, "%d" % cur.SAMPLE_ID) RGB = [] for k, label in enumerate("RGB"): value = cur["RGB_%s" % label] grid.SetCellValue(row, 1 + k, "%.4f" % value) RGB.append(value) XYZ = [] for k, label in enumerate("XYZ"): value = cur["XYZ_%s" % label] grid.SetCellValue(row, 6 + k, "%.4f" % value) XYZ.append(value) if cur is prev: dlg.update_row(row, RGB, XYZ, None, None, prev_delta_to_sRGB) else: dlg.update_row(row, RGB, XYZ, delta, sRGB_delta, delta_to_sRGB) grid.EndBatch() grid.Bind(wx.EVT_KEY_DOWN, dlg.key_handler) grid.Bind(wx.grid.EVT_GRID_CELL_CHANGE, dlg.cell_change_handler) grid.Bind(wx.grid.EVT_GRID_CELL_LEFT_CLICK, dlg.cell_click_handler) dlg.sizer3.Add(grid, 1, flag=wx.TOP | wx.ALIGN_LEFT, border=12) dlg.buttonpanel.Layout() dlg.sizer0.SetSizeHints(dlg) dlg.sizer0.Layout() # This workaround is needed to update cell colours grid.SelectAll() grid.ClearSelection() dlg.Center() def cell_change_handler(self, event): dlg = self grid = dlg.grid if event.Col > 0: item = dlg.suspicious_items[event.Row] label = "_RGB__XYZ"[event.Col] if event.Col < 6: label = "RGB_%s" % label else: label = "XYZ_%s" % label strval = "0" + grid.GetCellValue(event.Row, event.Col).replace(",", ".") try: value = float(strval) if (label[:3] == "RGB" or label == "XYZ_Y") and value > 100: raise ValueError("Value %r is invalid" % value) elif value < 0: raise ValueError("Negative value %r is invalid" % value) except ValueError: wx.Bell() strval = "%.4f" % item[label] if "." in strval: strval = strval.rstrip("0").rstrip(".") grid.SetCellValue(event.Row, event.Col, re.sub("^0+(?!\.)", "", strval) or "0") else: grid.SetCellValue(event.Row, event.Col, re.sub("^0+(?!\.)", "", strval) or "0") RGB = [] for i in (1, 2, 3): RGB.append(float(grid.GetCellValue(event.Row, i))) XYZ = [] for i in (6, 7, 8): XYZ.append(float(grid.GetCellValue(event.Row, i))) # Update row (sRGBLab, Lab, delta_to_sRGB, criteria1, debuginfo) = check_ti3_criteria1(RGB, XYZ, dlg.black, dlg.white, print_debuginfo=True) if grid.GetCellValue(event.Row, 9): prev = dlg.suspicious_items[event.Row - 1] prev_RGB = prev["RGB_R"], prev["RGB_G"], prev["RGB_B"] prev_XYZ = prev["XYZ_X"], prev["XYZ_Y"], prev["XYZ_Z"] (prev_sRGBLab, prev_Lab, prev_delta_to_sRGB, prev_criteria1, prev_debuginfo) = check_ti3_criteria1(prev_RGB, prev_XYZ, dlg.black, dlg.white, print_debuginfo=False) (delta, sRGB_delta, criteria2) = check_ti3_criteria2(prev_Lab, Lab, prev_sRGBLab, sRGBLab, prev_RGB, RGB) else: delta, sRGB_delta = (None, ) * 2 dlg.update_row(event.Row, RGB, XYZ, delta, sRGB_delta, delta_to_sRGB) if item[label] != value: if not dlg.mods.get(event.Row): dlg.mods[event.Row] = {} dlg.mods[event.Row][label] = value dlg.ok.Enable(not dlg.force or bool(dlg.mods)) # This workaround is needed to update cell colours cells = grid.GetSelection() grid.SelectAll() grid.ClearSelection() for row, col in cells: grid.SelectBlock(row, col, row, col, True) else: dlg.check_select_status() def cell_click_handler(self, event): if event.Col == 0: if self.grid.GetCellValue(event.Row, event.Col): value = "" else: value = "1" self.grid.SetCellValue(event.Row, event.Col, value) self.check_select_status() event.Skip() def check_select_status(self, has_false_values=None, has_true_values=None): dlg = self if None in (has_false_values, has_true_values): for index in xrange(dlg.grid.GetNumberRows()): if dlg.grid.GetCellValue(index, 0) != "1": has_false_values = True else: has_true_values = True dlg.ok.Enable(has_false_values or not self.force or bool(dlg.mods)) if has_true_values: dlg.select_all_btn.SetLabel(lang.getstr("deselect_all")) else: dlg.select_all_btn.SetLabel(lang.getstr("select_all")) def invert_selection_handler(self, event): dlg = self has_false_values = False has_true_values = False for index in xrange(dlg.grid.GetNumberRows()): if dlg.grid.GetCellValue(index, 0) == "1": value = "" has_false_values = True else: value = "1" has_true_values = True dlg.grid.SetCellValue(index, 0, value) self.check_select_status(has_false_values, has_true_values) def key_handler(self, event): dlg = self if event.KeyCode == wx.WXK_SPACE: if dlg.grid.GridCursorCol == 0: dlg.cell_click_handler(CustomGridCellEvent(wx.grid.EVT_GRID_CELL_CHANGE.evtType[0], dlg.grid, dlg.grid.GridCursorRow, dlg.grid.GridCursorCol)) else: event.Skip() def mark_cell(self, row, col, ok=False): grid = self.grid font = grid.GetCellFont(row, col) font.SetWeight(wx.FONTWEIGHT_NORMAL if ok else wx.FONTWEIGHT_BOLD) grid.SetCellFont(row, col, font) grid.SetCellTextColour(row, col, grid.GetDefaultCellTextColour() if ok else wx.Colour(204, 0, 0)) def select_all_handler(self, event): dlg = self if dlg.select_all_btn.GetLabel() == lang.getstr("select_all"): value = "1" else: value = "" for index in xrange(dlg.grid.GetNumberRows()): dlg.grid.SetCellValue(index, 0, value) self.check_select_status(not value, value) def update_row(self, row, RGB, XYZ, delta, sRGB_delta, delta_to_sRGB): dlg = self grid = dlg.grid RGB255 = [int(round(float(str(v * 2.55)))) for v in RGB] dlg.grid.SetCellBackgroundColour(row, 4, wx.Colour(*RGB255)) if dlg.white: XYZ = colormath.adapt(XYZ[0], XYZ[1], XYZ[2], dlg.white, "D65") RGB255 = [int(round(float(str(v)))) for v in colormath.XYZ2RGB(XYZ[0] / 100.0, XYZ[1] / 100.0, XYZ[2] / 100.0, scale=255)] dlg.grid.SetCellBackgroundColour(row, 5, wx.Colour(*RGB255)) grid.SetCellValue(row, 0, "1" if (not delta or (delta["E_ok"] and delta["L_ok"])) and delta_to_sRGB["ok"] else "") for col in xrange(3): dlg.mark_cell(row, 6 + col, (not delta or (delta["E_ok"] and (delta["L_ok"] or col != 1))) and delta_to_sRGB["ok"]) if delta: grid.SetCellValue(row, 9, "%.2f" % delta["E"]) dlg.mark_cell(row, 9, delta["E_ok"]) if sRGB_delta: grid.SetCellValue(row, 10, "%.2f" % sRGB_delta["E"]) for col, ELCH in enumerate("ELCH"): grid.SetCellValue(row, 11 + col, "%.2f" % delta_to_sRGB[ELCH]) dlg.mark_cell(row, 11 + col, delta_to_sRGB["%s_ok" % ELCH]) def main(): initcfg() lang.init() # Startup messages if verbose >= 1: safe_print(lang.getstr("startup")) if sys.platform != "darwin": if not autostart: safe_print(lang.getstr("warning.autostart_system")) if not autostart_home: safe_print(lang.getstr("warning.autostart_user")) app = BaseApp(0) # Don't redirect stdin/stdout app.TopWindow = StartupFrame() app.MainLoop() if __name__ == "__main__": main() DisplayCAL-3.1.0.0/DisplayCAL/edid.py0000644000076500000000000003125012650252610016676 0ustar devwheel00000000000000# -*- coding: utf-8 -*- from hashlib import md5 import codecs import math import os import string import struct import sys if sys.platform == "win32": from threading import _MainThread, currentThread wmi = None if sys.getwindowsversion() >= (6, ): # Use WMI for Vista/Win7 import pythoncom try: import wmi except: pass else: # Use registry as fallback for Win2k/XP/2003 import _winreg import pywintypes import win32api elif sys.platform != "darwin": try: import xrandr except ImportError: xrandr = None else: import binascii import re import subprocess as sp import config from log import log, safe_print from util_str import make_ascii_printable, strtr if sys.platform == "win32": import util_win HEADER = (0, 8) MANUFACTURER_ID = (8, 10) PRODUCT_ID = (10, 12) SERIAL_32 = (12, 16) WEEK_OF_MANUFACTURE = 16 YEAR_OF_MANUFACTURE = 17 EDID_VERSION = 18 EDID_REVISION = 19 MAX_H_SIZE_CM = 21 MAX_V_SIZE_CM = 22 GAMMA = 23 FEATURES = 24 LO_RG_XY = 25 LO_BW_XY = 26 HI_R_X = 27 HI_R_Y = 28 HI_G_X = 29 HI_G_Y = 30 HI_B_X = 31 HI_B_Y = 32 HI_W_X = 33 HI_W_Y = 34 BLOCKS = ((54, 72), (72, 90), (90, 108), (108, 126)) BLOCK_TYPE = 3 BLOCK_CONTENTS = (5, 18) BLOCK_TYPE_SERIAL_ASCII = "\xff" BLOCK_TYPE_ASCII = "\xfe" BLOCK_TYPE_MONITOR_NAME = "\xfc" BLOCK_TYPE_COLOR_POINT = "\xfb" BLOCK_TYPE_COLOR_MANAGEMENT_DATA = "\xf9" EXTENSION_FLAG = 126 CHECKSUM = 127 BLOCK_DI_EXT = "\x40" TRC = (81, 127) pnpidcache = {} def combine_hi_8lo(hi, lo): return hi << 8 | lo def get_edid(display_no=0, display_name=None, device=None): """ Get and parse EDID. Return dict. On Mac OS X, you need to specify a display name. On all other platforms, you need to specify a display number (zero-based). """ edid = None if sys.platform == "win32": if not device: # The ordering will work as long as Argyll continues using # EnumDisplayMonitors monitors = util_win.get_real_display_devices_info() moninfo = monitors[display_no] device = util_win.get_active_display_device(moninfo["Device"]) if not device: return {} id = device.DeviceID.split("\\")[1] wmi_connection = None not_main_thread = currentThread().__class__ is not _MainThread if wmi: if not_main_thread: pythoncom.CoInitialize() wmi_connection = wmi.WMI(namespace="WMI") if wmi_connection: # Use WMI for Vista/Win7 # http://msdn.microsoft.com/en-us/library/Aa392707 try: msmonitors = wmi_connection.WmiMonitorDescriptorMethods() except Exception, exception: if not_main_thread: pythoncom.CoUninitialize() raise WMIError(exception) for msmonitor in msmonitors: if msmonitor.InstanceName.split("\\")[1] == id: try: edid = msmonitor.WmiGetMonitorRawEEdidV1Block(0) except: # No EDID entry pass else: edid = "".join(chr(i) for i in edid[0]) break if not_main_thread: pythoncom.CoUninitialize() elif sys.getwindowsversion() < (6, ): # Use registry as fallback for Win2k/XP/2003 # http://msdn.microsoft.com/en-us/library/ff546173%28VS.85%29.aspx # "The Enum tree is reserved for use by operating system components, # and its layout is subject to change. (...) Drivers and Windows # applications must not access the Enum tree directly." # But do we care? Probably not, as older Windows' API isn't likely # gonna change. driver = "\\".join(device.DeviceID.split("\\")[-2:]) subkey = "\\".join(["SYSTEM", "CurrentControlSet", "Enum", "DISPLAY", id]) try: key = _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE, subkey) except WindowsError: # Registry error safe_print("Windows registry error: Key", "\\".join(["HKEY_LOCAL_MACHINE", subkey]), "does not exist.") return {} numsubkeys, numvalues, mtime = _winreg.QueryInfoKey(key) for i in range(numsubkeys): hkname = _winreg.EnumKey(key, i) hk = _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE, "\\".join([subkey, hkname])) try: test = _winreg.QueryValueEx(hk, "Driver")[0] except WindowsError: # No Driver entry continue if test == driver: # Found our display device try: devparms = _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE, "\\".join([subkey, hkname, "Device Parameters"])) except WindowsError: # No Device Parameters (registry error?) safe_print("Windows registry error: Key", "\\".join(["HKEY_LOCAL_MACHINE", subkey, hkname, "Device Parameters"]), "does not exist.") continue try: edid = _winreg.QueryValueEx(devparms, "EDID")[0] except WindowsError: # No EDID entry pass else: raise WMIError("No WMI connection") elif sys.platform == "darwin": # Get EDID via ioreg p = sp.Popen(["ioreg", "-c", "IODisplay", "-S", "-w0"], stdout=sp.PIPE) stdout, stderr = p.communicate() if stdout: for edid in [binascii.unhexlify(edid_hex) for edid_hex in re.findall('"IODisplayEDID"\s*=\s*<([0-9A-Fa-f]*)>', stdout)]: if edid and len(edid) >= 128: parsed_edid = parse_edid(edid) if parsed_edid.get("monitor_name", parsed_edid.get("ascii")) == display_name: # On Mac OS X, you need to specify a display name # because the order is unknown return parsed_edid return {} elif xrandr: # Check XrandR output properties edid = None for key in ("EDID", "EDID_DATA"): try: edid = xrandr.get_output_property(display_no, key, xrandr.XA_INTEGER) except ValueError: pass else: break if not edid: # Check X11 atoms for key in ("XFree86_DDC_EDID1_RAWDATA", "XFree86_DDC_EDID2_RAWDATA"): if display_no > 0: key += "_%s" % display_no try: edid = xrandr.get_atom(key) except ValueError: pass else: break if edid: edid = "".join(chr(i) for i in edid) if edid and len(edid) >= 128: return parse_edid(edid) return {} def parse_manufacturer_id(block): """ Parse the manufacturer id and return decoded string. The range is always ASCII charcode 64 to 95. """ h = combine_hi_8lo(ord(block[0]), ord(block[1])) manufacturer_id = [] for shift in (10, 5, 0): manufacturer_id.append(chr(((h >> shift) & 0x1f) + ord('A') - 1)) return "".join(manufacturer_id).strip() def get_manufacturer_name(manufacturer_id): """ Try and get a nice descriptive string for our manufacturer id. This uses either hwdb or pnp.ids which will be looked for in several places. If it can't find the file, it returns None. Examples: SAM -> Samsung Electric Company NEC -> NEC Corporation hwdb/pnp.ids can be created from Excel data available from Microsoft: http://www.microsoft.com/whdc/system/pnppwr/pnp/pnpid.mspx """ if not pnpidcache: paths = ["/usr/lib/udev/hwdb.d/20-acpi-vendor.hwdb", # systemd "/usr/share/hwdata/pnp.ids", # hwdata, e.g. Red Hat "/usr/share/misc/pnp.ids", # pnputils, e.g. Debian "/usr/share/libgnome-desktop/pnp.ids"] # fallback gnome-desktop if sys.platform in ("darwin", "win32"): paths.append(os.path.join(config.pydir, "pnp.ids")) # fallback for path in paths: if os.path.isfile(path): try: pnp_ids = codecs.open(path, "r", "UTF-8", "replace") except IOError: pass else: id, name = None, None try: for line in pnp_ids: if path.endswith("hwdb"): if line.strip().startswith("acpi:"): id = line.split(":")[1][:3] continue elif line.strip().startswith("ID_VENDOR_FROM_DATABASE"): name = line.split("=", 1)[1].strip() else: continue if not id or not name or id in pnpidcache: continue else: try: # Strip leading/trailing whitespace # (non-breaking spaces too) id, name = line.strip(string.whitespace + u"\u00a0").split(None, 1) except ValueError: continue pnpidcache[id] = name except OSError: continue finally: pnp_ids.close() break return pnpidcache.get(manufacturer_id) def edid_get_bit(value, bit): return (value & (1 << bit)) >> bit def edid_get_bits(value, begin, end): mask = (1 << (end - begin + 1)) - 1 return (value >> begin) & mask def edid_decode_fraction(high, low): result = 0.0 high = (high << 2) | low for i in xrange(0, 10): result += edid_get_bit(high, i) * math.pow(2, i - 10) return result def edid_parse_string(desc): # Return value should match colord's cd_edid_parse_string in cd-edid.c # Remember: In C, NULL terminates a string, so do the same here # Replace newline with NULL, then strip anything after first NULL byte # (if any), then strip trailing whitespace desc = strtr(desc[:13], {"\n": "\0", "\r": "\0"}).split("\0")[0].rstrip() if desc: # Replace all non-printable chars with NULL # Afterwards, the amount of NULL bytes is the number of replaced chars desc = make_ascii_printable(desc, subst="\0") if desc.count("\0") <= 4: # Only use string if max 4 replaced chars # Replace any NULL chars with dashes to make a printable string return desc.replace("\0", "-") def parse_edid(edid): """ Parse raw EDID data (binary string) and return dict. """ hash = md5(edid).hexdigest() header = edid[HEADER[0]:HEADER[1]] manufacturer_id = parse_manufacturer_id(edid[MANUFACTURER_ID[0]:MANUFACTURER_ID[1]]) manufacturer = get_manufacturer_name(manufacturer_id) product_id = struct.unpack(" i / 5: white_x = edid_decode_fraction(ord(edid[i + 2]), edid_get_bits(ord(edid[i + 1]), 2, 3)) result["white_x_" + str(ord(block[i]))] = white_x if not result.get("white_x"): result["white_x"] = white_x white_y = edid_decode_fraction(ord(edid[i + 3]), edid_get_bits(ord(edid[i + 1]), 0, 1)) result["white_y_" + str(ord(block[i]))] = white_y if not result.get("white_y"): result["white_y"] = white_y if block[i + 4] != "\xff": gamma = ord(block[i + 4]) / 100.0 + 1 result["gamma_" + str(ord(block[i]))] = gamma if not result.get("gamma"): result["gamma"] = gamma elif block[BLOCK_TYPE] == BLOCK_TYPE_COLOR_MANAGEMENT_DATA: # TODO: Implement? How could it be used? result["color_management_data"] = block[BLOCK_CONTENTS[0]:BLOCK_CONTENTS[1]] result["ext_flag"] = ord(edid[EXTENSION_FLAG]) result["checksum"] = ord(edid[CHECKSUM]) result["checksum_valid"] = sum(ord(char) for char in edid) % 256 == 0 if len(edid) > 128 and result["ext_flag"] > 0: # Parse extension blocks block = edid[128:] while block: if block[0] == BLOCK_DI_EXT: if block[TRC[0]] != "\0": # TODO: Implement pass block = block[128:] return result class WMIError(Exception): pass DisplayCAL-3.1.0.0/DisplayCAL/embeddedimage.py0000644000076500000000000000465212647526531020547 0ustar devwheel00000000000000#---------------------------------------------------------------------- # Name: wx.lib.embeddedimage # Purpose: Defines a class used for embedding PNG images in Python # code. The primary method of using this module is via # the code generator in wx.tools.img2py. # # Author: Anthony Tuininga # # Created: 26-Nov-2007 # RCS-ID: $Id: embeddedimage.py 59672 2009-03-20 20:59:42Z RD $ # Copyright: (c) 2007 by Anthony Tuininga # Licence: wxWindows license #---------------------------------------------------------------------- import base64 import cStringIO import wx try: b64decode = base64.b64decode except AttributeError: b64decode = base64.decodestring class PyEmbeddedImage(object): """ PyEmbeddedImage is primarily intended to be used by code generated by img2py as a means of embedding image data in a python module so the image can be used at runtime without needing to access the image from an image file. This makes distributing icons and such that an application uses simpler since tools like py2exe will automatically bundle modules that are imported, and the application doesn't have to worry about how to locate the image files on the user's filesystem. The class can also be used for image data that may be acquired from some other source at runtime, such as over the network or from a database. In this case pass False for isBase64 (unless the data actually is base64 encoded.) Any image type that wx.ImageFromStream can handle should be okay. """ def __init__(self, data, isBase64=True): self.data = data self.isBase64 = isBase64 def GetBitmap(self): return wx.BitmapFromImage(self.GetImage()) def GetData(self): if self.isBase64: data = b64decode(self.data) return data def GetIcon(self): icon = wx.EmptyIcon() icon.CopyFromBitmap(self.GetBitmap()) return icon def GetImage(self): stream = cStringIO.StringIO(self.GetData()) return wx.ImageFromStream(stream) # added for backwards compatibility getBitmap = GetBitmap getData = GetData getIcon = GetIcon getImage = GetImage # define properties, for convenience Bitmap = property(GetBitmap) Icon = property(GetIcon) Image = property(GetImage) DisplayCAL-3.1.0.0/DisplayCAL/encodedstdio.py0000644000076500000000000001244612647526531020457 0ustar devwheel00000000000000# -*- coding: utf-8 -*- import codecs import locale import os import sys from encoding import get_encoding _codecs = {} _stdio = {} def codec_register_alias(alias, name): """ Register an alias for encoding 'name' """ _codecs[alias] = codecs.CodecInfo(name=alias, encode=codecs.getencoder(name), decode=codecs.getdecoder(name), incrementalencoder=codecs.getincrementalencoder(name), incrementaldecoder=codecs.getincrementaldecoder(name), streamwriter=codecs.getwriter(name), streamreader=codecs.getreader(name)) def conditional_decode(text, encoding='UTF-8', errors='strict'): """ Decode text if not unicode """ if not isinstance(text, unicode): text = text.decode(encoding, errors) return text def conditional_encode(text, encoding='UTF-8', errors='strict'): """ Encode text if unicode """ if isinstance(text, unicode): text = text.encode(encoding, errors) return text def encodestdio(encodings=None, errors=None): """ After this function is called, Unicode strings written to stdout/stderr are automatically encoded and strings read from stdin automatically decoded with the given encodings and error handling. encodings and errors can be a dict with mappings for stdin/stdout/stderr, e.g. encodings={'stdin': 'UTF-8', 'stdout': 'UTF-8', 'stderr': 'UTF-8'} or errors={'stdin': 'strict', 'stdout': 'replace', 'stderr': 'replace'} In the case of errors, stdin uses a default 'strict' error handling and stdout/stderr both use 'replace'. """ if not encodings: encodings = {'stdin': None, 'stdout': None, 'stderr': None} if not errors: errors = {'stdin': 'strict', 'stdout': 'replace', 'stderr': 'replace'} for stream_name in set(encodings.keys() + errors.keys()): stream = getattr(sys, stream_name) encoding = encodings.get(stream_name) if not encoding: encoding = get_encoding(stream) error_handling = errors.get(stream_name, 'strict') if isinstance(stream, EncodedStream): stream.encoding = encoding stream.errors = error_handling else: setattr(sys, stream_name, EncodedStream(stream, encoding, error_handling)) def read(stream, size=-1): """ Read from stream. Uses os.read() if stream is a tty, stream.read() otherwise. """ if stream.isatty(): data = os.read(stream.fileno(), size) else: data = stream.read(size) return data def write(stream, data): """ Write to stream. Uses os.write() if stream is a tty, stream.write() otherwise. """ if stream.isatty(): os.write(stream.fileno(), data) else: stream.write(data) class EncodedStream(object): """ Unicode strings written to an EncodedStream are automatically encoded and strings read from it automtically decoded with the given encoding and error handling. Uses os.read() and os.write() for proper handling of unicode codepages for stdout/stderr under Windows """ def __init__(self, stream, encoding='UTF-8', errors='strict'): self.stream = stream self.encoding = encoding self.errors = errors def __getattr__(self, name): return getattr(self.stream, name) def __iter__(self): return iter(self.readlines()) def __setattr__(self, name, value): if name == 'softspace': setattr(self.stream, name, value) else: object.__setattr__(self, name, value) def next(self): return self.readline() def read(self, size=-1): return conditional_decode(read(self.stream, size), self.encoding, self.errors) def readline(self, size=-1): return conditional_decode(self.stream.readline(size), self.encoding, self.errors) def readlines(self, size=-1): return [conditional_decode(line, self.encoding, self.errors) for line in self.stream.readlines(size)] def xreadlines(self): return self def write(self, text): write(self.stream, conditional_encode(text, self.encoding, self.errors)) def writelines(self, lines): for line in lines: self.write(line) # Store references to original stdin/stdout/stderr for _stream_name in ('stdin', 'stdout', 'stderr'): _stream = getattr(sys, _stream_name) if isinstance(_stream, EncodedStream): _stdio[_stream_name] = _stream.stream else: _stdio[_stream_name] = _stream # Register codec aliases for codepages 65000 and 65001 codec_register_alias('65000', 'utf_7') codec_register_alias('65001', 'utf_8') codec_register_alias('cp65000', 'utf_7') codec_register_alias('cp65001', 'utf_8') codecs.register(lambda alias: _codecs.get(alias)) if __name__ == '__main__': test = u'test \u00e4\u00f6\u00fc\ufffe test' try: print test except (LookupError, IOError, UnicodeError), exception: print 'could not print %r:' % test, exception print 'wrapping stdout/stderr via encodestdio()' encodestdio() print test print 'exiting normally' DisplayCAL-3.1.0.0/DisplayCAL/encoding.py0000644000076500000000000000241312647526531017572 0ustar devwheel00000000000000# -*- coding: utf-8 -*- import locale import sys if sys.platform == "win32": from ctypes import windll def get_encoding(stream): """ Return stream encoding. """ enc = None if stream in (sys.stdin, sys.stdout, sys.stderr): if sys.platform == "darwin": # There is no way to determine it reliably under OS X 10.4? return "UTF-8" elif sys.platform == "win32": if sys.version_info >= (2, 6): # Windows/Python 2.6+: If a locale is set, the actual encoding # of stdio changes, but the encoding attribute isn't updated enc = locale.getlocale()[1] if not enc: try: # GetConsoleCP and GetConsoleOutputCP return zero if # we're not running as console executable. Fall back # to GetOEMCP if stream is (sys.stdin): enc = "cp%i" % (windll.kernel32.GetConsoleCP() or windll.kernel32.GetOEMCP()) else: enc = "cp%i" % (windll.kernel32.GetConsoleOutputCP() or windll.kernel32.GetOEMCP()) except: pass enc = enc or getattr(stream, "encoding", None) or \ locale.getpreferredencoding() or sys.getdefaultencoding() return enc def get_encodings(): """ Return console encoding, filesystem encoding. """ enc = get_encoding(sys.stdout) fs_enc = sys.getfilesystemencoding() or enc return enc, fs_enc DisplayCAL-3.1.0.0/DisplayCAL/floatspin.py0000644000076500000000000017360412647526531020016 0ustar devwheel00000000000000# --------------------------------------------------------------------------- # # FLOATSPIN Control wxPython IMPLEMENTATION # Python Code By: # # Andrea Gavana, @ 16 Nov 2005 # Latest Revision: 03 Jan 2014, 23.00 GMT # # Modifications for DisplayCAL: # - Select text on focus # - Always accept "," (comma) as decimal point # - Only call SyncSpinToText if TextCtrl value has actually changed # - Set value to min/max if not in range # - Use a different method for tab traversal because the original code didn't # work under wxGTK # - If CMD or CTRL are held, don't block keycodes that are not allowed (fixes # copy/paste/select all keyboard shortcuts not working) # - Do default action if return key is pressed (currently only works if the # default item is a button) # - Fix children not reflecting enbled state under wxMac # # TODO List/Caveats # # 1. Ay Idea? # # For All Kind Of Problems, Requests Of Enhancements And Bug Reports, Please # Write To Me At: # # andrea.gavana@gmail.com # andrea.gavana@maerskoil.com # # Or, Obviously, To The wxPython Mailing List!!! # # # End Of Comments # --------------------------------------------------------------------------- # """ :class:`FloatSpin` implements a floating point :class:`SpinCtrl`. Description =========== :class:`FloatSpin` implements a floating point :class:`SpinCtrl`. It is built using a custom :class:`PyControl`, composed by a :class:`TextCtrl` and a :class:`SpinButton`. In order to correctly handle floating points numbers without rounding errors or non-exact floating point representations, :class:`FloatSpin` uses the great :class:`FixedPoint` class from Tim Peters. What you can do: - Set the number of representative digits for your floating point numbers; - Set the floating point format (``%f``, ``%F``, ``%e``, ``%E``, ``%g``, ``%G``); - Set the increment of every ``EVT_FLOATSPIN`` event; - Set minimum, maximum values for :class:`FloatSpin` as well as its range; - Change font and colour for the underline :class:`TextCtrl`. Usage ===== Usage example:: import wx import wx.lib.agw.floatspin as FS class MyFrame(wx.Frame): def __init__(self, parent): wx.Frame.__init__(self, parent, -1, "FloatSpin Demo") panel = wx.Panel(self) floatspin = FS.FloatSpin(panel, -1, pos=(50, 50), min_val=0, max_val=1, increment=0.01, value=0.1, agwStyle=FS.FS_LEFT) floatspin.SetFormat("%f") floatspin.SetDigits(2) # our normal wxApp-derived class, as usual app = wx.App(0) frame = MyFrame(None) app.SetTopWindow(frame) frame.Show() app.MainLoop() Events ====== :class:`FloatSpin` catches 3 different types of events: 1) Spin events: events generated by spinning up/down the spinbutton; 2) Char events: playing with up/down arrows of the keyboard increase/decrease the value of :class:`FloatSpin`; 3) Mouse wheel event: using the wheel will change the value of :class:`FloatSpin`. In addition, there are some other functionalities: - It remembers the initial value as a default value, call meth:~FloatSpin.SetToDefaultValue`, or press ``Esc`` to return to it; - ``Shift`` + arrow = 2 * increment (or ``Shift`` + mouse wheel); - ``Ctrl`` + arrow = 10 * increment (or ``Ctrl`` + mouse wheel); - ``Alt`` + arrow = 100 * increment (or ``Alt`` + mouse wheel); - Combinations of ``Shift``, ``Ctrl``, ``Alt`` increment the :class:`FloatSpin` value by the product of the factors; - ``PgUp`` & ``PgDn`` = 10 * increment * the product of the ``Shift``, ``Ctrl``, ``Alt`` factors; - ``Space`` sets the control's value to it's last valid state. Window Styles ============= This class supports the following window styles: =============== =========== ================================================== Window Styles Hex Value Description =============== =========== ================================================== ``FS_READONLY`` 0x1 Sets :class:`FloatSpin` as read-only control. ``FS_LEFT`` 0x2 Horizontally align the underlying :class:`TextCtrl` on the left. ``FS_CENTRE`` 0x4 Horizontally align the underlying :class:`TextCtrl` on center. ``FS_RIGHT`` 0x8 Horizontally align the underlying :class:`TextCtrl` on the right. =============== =========== ================================================== Events Processing ================= This class processes the following events: ================= ================================================== Event Name Description ================= ================================================== ``EVT_FLOATSPIN`` Emitted when the user changes the value of :class:`FloatSpin`, either with the mouse or with the keyboard. ================= ================================================== License And Version =================== :class:`FloatSpin` control is distributed under the wxPython license. Latest revision: Andrea Gavana @ 03 Jan 2014, 23.00 GMT Version 0.9 Backward Incompatibilities ========================== Modifications to allow `min_val` or `max_val` to be ``None`` done by: James Bigler, SCI Institute, University of Utah, March 14, 2007 :note: Note that the changes I made will break backward compatibility, because I changed the contructor's parameters from `min` / `max` to `min_val` / `max_val` to be consistent with the other functions and to eliminate any potential confusion with the built in `min` and `max` functions. You specify open ranges like this (you can equally do this in the constructor):: SetRange(min_val=1, max_val=None) # [1, ] SetRange(min_val=None, max_val=0) # [ , 0] or no range:: SetRange(min_val=None, max_val=None) # [ , ] """ def Property(func): return property(**func()) #---------------------------------------------------------------------- # Beginning Of FLOATSPIN wxPython Code #---------------------------------------------------------------------- import wx import locale from math import ceil, floor # Set The Styles For The Underline wx.TextCtrl FS_READONLY = 1 """ Sets :class:`FloatSpin` as read-only control. """ FS_LEFT = 2 """ Horizontally align the underlying :class:`TextCtrl` on the left. """ FS_CENTRE = 4 """ Horizontally align the underlying :class:`TextCtrl` on center. """ FS_RIGHT = 8 """ Horizontally align the underlying :class:`TextCtrl` on the right. """ # Define The FloatSpin Event wxEVT_FLOATSPIN = wx.NewEventType() #-----------------------------------# # FloatSpinEvent #-----------------------------------# EVT_FLOATSPIN = wx.PyEventBinder(wxEVT_FLOATSPIN, 1) """ Emitted when the user changes the value of :class:`FloatSpin`, either with the mouse or""" \ """ with the keyboard. """ # ---------------------------------------------------------------------------- # # Class FloatSpinEvent # ---------------------------------------------------------------------------- # class FloatSpinEvent(wx.PyCommandEvent): """ This event will be sent when a ``EVT_FLOATSPIN`` event is mapped in the parent. """ def __init__(self, eventType, eventId=1, nSel=-1, nOldSel=-1): """ Default class constructor. :param `eventType`: the event type; :param `eventId`: the event identifier; :param `nSel`: the current selection; :param `nOldSel`: the old selection. """ wx.PyCommandEvent.__init__(self, eventType, eventId) self._eventType = eventType def SetPosition(self, pos): """ Sets event position. :param `pos`: an integer specyfing the event position. """ self._position = pos def GetPosition(self): """ Returns event position. """ return self._position #---------------------------------------------------------------------------- # FloatTextCtrl #---------------------------------------------------------------------------- class FloatTextCtrl(wx.TextCtrl): """ A class which holds a :class:`TextCtrl`, one of the two building blocks of :class:`FloatSpin`. """ def __init__(self, parent, id=wx.ID_ANY, value="", pos=wx.DefaultPosition, size=wx.DefaultSize, style=wx.TE_NOHIDESEL | wx.TE_PROCESS_ENTER, validator=wx.DefaultValidator, name=wx.TextCtrlNameStr): """ Default class constructor. Used internally. Do not call directly this class in your code! :param `parent`: the :class:`FloatTextCtrl` parent; :param `id`: an identifier for the control: a value of -1 is taken to mean a default; :param `value`: default text value; :param `pos`: the control position. A value of (-1, -1) indicates a default position, chosen by either the windowing system or wxPython, depending on platform; :param `size`: the control size. A value of (-1, -1) indicates a default size, chosen by either the windowing system or wxPython, depending on platform; :param `style`: the window style; :param `validator`: the window validator; :param `name`: the window name. """ wx.TextCtrl.__init__(self, parent, id, value, pos, size, style, validator, name) self._parent = parent self._selection = (-1, -1) self._value = value self.Bind(wx.EVT_WINDOW_DESTROY, self.OnDestroy) self.Bind(wx.EVT_KEY_DOWN, self.OnKeyDown) self.Bind(wx.EVT_SET_FOCUS, self.OnFocus) self.Bind(wx.EVT_KILL_FOCUS, self.OnKillFocus) def OnDestroy(self, event): """ Handles the ``wx.EVT_WINDOW_DESTROY`` event for :class:`FloatTextCtrl`. :param `event`: a :class:`WindowDestroyEvent` event to be processed. :note: This method tries to correctly handle the control destruction under MSW. """ if self._parent: self._parent._textctrl = None self._parent = None def OnKeyDown(self, event): """ Handles the ``wx.EVT_KEYDOWN`` event for :class:`FloatTextCtrl`. :param `event`: a :class:`KeyEvent` event to be processed. """ if self._parent: self._parent.OnKeyDown(event) def OnFocus(self, event): self._value = self.Value self.RestoreSelection() event.Skip() def OnKillFocus(self, event): """ Handles the ``wx.EVT_KILL_FOCUS`` event for :class:`FloatTextCtrl`. :param `event`: a :class:`FocusEvent` event to be processed. :note: This method synchronizes the :class:`SpinButton` and the :class:`TextCtrl` when focus is lost. """ self._selection = self.GetSelection() if self._parent and self.Value != self._value: self._parent.SyncSpinToText(True) self.SetSelection(0, 0) event.Skip() def RestoreSelection(self): """ Restores the selection under Mac OS X, selects all under other platforms (consistent with default wx.TextCtrl behaviour) """ if "__WXMAC__" in wx.PlatformInfo and self._selection != (-1, -1): self.SetSelection(*self._selection) else: self.SelectAll() #---------------------------------------------------------------------------- # # FloatSpin # This Is The Main Class Implementation # ---------------------------------------------------------------------------- # class FloatSpin(wx.PyControl): """ :class:`FloatSpin` implements a floating point :class:`SpinCtrl`. It is built using a custom :class:`PyControl`, composed by a :class:`TextCtrl` and a :class:`SpinButton`. In order to correctly handle floating points numbers without rounding errors or non-exact floating point representations, :class:`FloatSpin` uses the great :class:`FixedPoint` class from Tim Peters. """ _spinwidth = 0 def __init__(self, parent, id=wx.ID_ANY, pos=wx.DefaultPosition, size=(95,-1), style=0, value=0.0, min_val=None, max_val=None, increment=1.0, digits=-1, agwStyle=FS_LEFT, name="FloatSpin"): """ Default class constructor. :param `parent`: the :class:`FloatSpin` parent; :param `id`: an identifier for the control: a value of -1 is taken to mean a default; :param `pos`: the control position. A value of (-1, -1) indicates a default position, chosen by either the windowing system or wxPython, depending on platform; :param `size`: the control size. A value of (-1, -1) indicates a default size, chosen by either the windowing system or wxPython, depending on platform; :param `style`: the window style; :param `value`: is the current value for :class:`FloatSpin`; :param `min_val`: the minimum value, ignored if ``None``; :param `max_val`: the maximum value, ignored if ``None``; :param `increment`: the increment for every :class:`FloatSpinEvent` event; :param `digits`: number of representative digits for your floating point numbers; :param `agwStyle`: one of the following bits: =============== =========== ================================================== Window Styles Hex Value Description =============== =========== ================================================== ``FS_READONLY`` 0x1 Sets :class:`FloatSpin` as read-only control. ``FS_LEFT`` 0x2 Horizontally align the underlying :class:`TextCtrl` on the left. ``FS_CENTRE`` 0x4 Horizontally align the underlying :class:`TextCtrl` on center. ``FS_RIGHT`` 0x8 Horizontally align the underlying :class:`TextCtrl` on the right. =============== =========== ================================================== :param `name`: the window name. """ wx.PyControl.__init__(self, parent, id, pos, size, style|wx.NO_BORDER| wx.NO_FULL_REPAINT_ON_RESIZE | wx.CLIP_CHILDREN, wx.DefaultValidator, name) # Don't call SetRange here, because it will try to modify # self._value whose value doesn't exist yet. self.SetRangeDontClampValue(min_val, max_val) self._value = self.ClampValue(FixedPoint(str(value), 20)) self._defaultvalue = self._value self._increment = FixedPoint(str(increment), 20) self._spinmodifier = FixedPoint(str(1.0), 20) self._digits = digits self._snapticks = False self._spinbutton = None self._ignore_spin_event = False self._textctrl = None self._spinctrl_bestsize = wx.Size(-999, -999) self._enabled = True # start Philip Semanchuk addition # The textbox & spin button are drawn slightly differently # depending on the platform. The difference is most pronounced # under OS X. if "__WXMAC__" in wx.PlatformInfo: self._gap = 8 self._spin_top = 3 self._text_left = 4 self._text_top = 4 elif "__WXMSW__" in wx.PlatformInfo: self._gap = 1 self._spin_top = 0 self._text_left = 0 self._text_top = 0 else: # GTK if "gtk3" in wx.PlatformInfo: self._gap = 1 else: self._gap = -1 self._spin_top = 0 self._text_left = 0 self._text_top = 0 # end Philip Semanchuk addition self.SetLabel(name) self.SetForegroundColour(parent.GetForegroundColour()) width = size[0] height = size[1] best_size = self.DoGetBestSize() if width == -1: width = best_size.GetWidth() if height == -1: height = best_size.GetHeight() self._validkeycode = [43, 44, 45, 46, 69, 101] self._validkeycode.extend(range(48, 58)) self._validkeycode.extend([wx.WXK_BACK, wx.WXK_DELETE, wx.WXK_LEFT, wx.WXK_RIGHT, wx.WXK_NUMPAD0, wx.WXK_NUMPAD1, wx.WXK_NUMPAD2, wx.WXK_NUMPAD3, wx.WXK_NUMPAD4, wx.WXK_NUMPAD5, wx.WXK_NUMPAD6, wx.WXK_NUMPAD7, wx.WXK_NUMPAD8, wx.WXK_NUMPAD9, wx.WXK_NUMPAD_ADD, wx.WXK_NUMPAD_DECIMAL, wx.WXK_NUMPAD_SEPARATOR, wx.WXK_NUMPAD_SUBTRACT]) self._spinbutton = wx.SpinButton(self, wx.ID_ANY, wx.DefaultPosition, size=(-1, height), style=wx.SP_ARROW_KEYS | wx.SP_VERTICAL | wx.SP_WRAP) self._spinbutton.SetRange(-2 ** 32 / 2.0, 2 ** 32 / 2.0 - 1) self._spinbutton.AcceptsFocusFromKeyboard = lambda: False if "gtk3" in wx.PlatformInfo: if not FloatSpin._spinwidth: spin = wx.SpinCtrl(self, -1) text = wx.TextCtrl(self, -1) FloatSpin._spinwidth = spin.Size[0] - text.Size[0] + 11 spin.Destroy() text.Destroy() self._spinbutton.MaxSize = FloatSpin._spinwidth, height txtstyle = wx.TE_NOHIDESEL | wx.TE_PROCESS_ENTER if agwStyle & FS_RIGHT: txtstyle = txtstyle | wx.TE_RIGHT elif agwStyle & FS_CENTRE: txtstyle = txtstyle | wx.TE_CENTER if agwStyle & FS_READONLY: txtstyle = txtstyle | wx.TE_READONLY self._textctrl = FloatTextCtrl(self, wx.ID_ANY, "", wx.DefaultPosition, (width-self._spinbutton.GetSize().GetWidth(), height), txtstyle) # start Philip Semanchuk addition # Setting the textctrl's size in the ctor also sets its min size. # But the textctrl is entirely controlled by the parent floatspin # control and should accept whatever size its parent dictates, so # here we tell it to forget its min size. self._textctrl.SetMinSize(wx.DefaultSize) # Setting the spin buttons's size in the ctor also sets its min size. # Under OS X that results in a rendering artifact because spin buttons # are a little shorter than textboxes. # Setting the min size to the default allows OS X to draw the spin # button correctly. However, Windows and KDE take the call to # SetMinSize() as a cue to size the spin button taller than the # textbox, so we avoid the call there. if "__WXMAC__" in wx.PlatformInfo: self._spinbutton.SetMinSize(wx.DefaultSize) # end Philip Semanchuk addition self._mainsizer = wx.BoxSizer(wx.HORIZONTAL) # Ensure the spin button is shown, and the text widget takes # all remaining free space self._mainsizer.Add(self._textctrl, 1) if "gtk3" in wx.PlatformInfo: self._mainsizer.Add((self._gap, 1), 0) self._mainsizer.Add(self._spinbutton, 0) self.SetSizer(self._mainsizer) self._mainsizer.Layout() self.SetFormat() if not (agwStyle & FS_READONLY): self.Bind(wx.EVT_SPIN_UP, self.OnSpinUp) self.Bind(wx.EVT_SPIN_DOWN, self.OnSpinDown) self._spinbutton.Bind(wx.EVT_LEFT_DOWN, self.OnSpinMouseDown) self._spinbutton.Bind(wx.EVT_LEFT_UP, self.OnSpinMouseUp) self._textctrl.Bind(wx.EVT_TEXT_ENTER, self.OnTextEnter) self._textctrl.Bind(wx.EVT_MOUSEWHEEL, self.OnMouseWheel) self._spinbutton.Bind(wx.EVT_MOUSEWHEEL, self.OnMouseWheel) self.Bind(wx.EVT_SET_FOCUS, self.OnFocus) if not "gtk3" in wx.PlatformInfo: self.Bind(wx.EVT_SIZE, self.OnSize) if hasattr(self, "SetBestSize"): # Not Phoenix # start Philip Semanchuk move self.SetBestSize((width, height)) # end Philip Semanchuk move def OnDestroy(self, event): """ Handles the ``wx.EVT_WINDOW_DESTROY`` event for :class:`FloatSpin`. :param `event`: a :class:`WindowDestroyEvent` event to be processed. :note: This method tries to correctly handle the control destruction under MSW. """ # Null This Since MSW Sends KILL_FOCUS On Deletion if self._textctrl: self._textctrl._parent = None self._textctrl.Destroy() self._textctrl = None self._spinbutton.Destroy() self._spinbutton = None def DoGetBestSize(self): """ Gets the size which best suits the window: for a control, it would be the minimal size which doesn't truncate the control, for a panel - the same size as it would have after a call to `Fit()`. :note: Overridden from :class:`PyControl`. """ if self._spinctrl_bestsize.x == -999: spin = wx.SpinCtrl(self, -1) self._spinctrl_bestsize = spin.GetBestSize() # oops something went wrong, set to reasonable value if self._spinctrl_bestsize.GetWidth() < 20: self._spinctrl_bestsize.SetWidth(95) if self._spinctrl_bestsize.GetHeight() < 10: self._spinctrl_bestsize.SetHeight(22) spin.Destroy() return self._spinctrl_bestsize def DoSendEvent(self): """ Send the event to the parent. """ event = wx.CommandEvent(wx.wxEVT_COMMAND_SPINCTRL_UPDATED, self.GetId()) event.SetEventObject(self) event.SetInt(int(self._value + 0.5)) if self._textctrl: event.SetString(self._textctrl.GetValue()) self.GetEventHandler().ProcessEvent(event) eventOut = FloatSpinEvent(wxEVT_FLOATSPIN, self.GetId()) eventOut.SetPosition(int(self._value + 0.5)) eventOut.SetEventObject(self) self.GetEventHandler().ProcessEvent(eventOut) def Disable(self): self.Enable(False) def Enable(self, enable=True): """ Enable the child controls. This is needed under wxMac """ wx.PyControl.Enable(self, enable) self._enabled = enable if self._textctrl: self._textctrl.Enable(enable) self._spinbutton.Enable(enable) @Property def Enabled(): def fget(self): return self._enabled def fset(self, enable=True): self.Enable(enable) return locals() def IsEnabled(self): return self._enabled def OnSpinMouseDown(self, event): """ Handles the ``wx.EVT_LEFT_DOWN`` event for :class:`FloatSpin`. :param `event`: a :class:`MouseEvent` event to be processed. :note: This method works on the underlying :class:`SpinButton`. """ modifier = FixedPoint(str(1.0), 20) if event.ShiftDown(): modifier = modifier*2.0 if event.ControlDown(): modifier = modifier*10.0 if event.AltDown(): modifier = modifier*100.0 self._spinmodifier = modifier self._ignore_spin_event = False event.Skip() def OnSpinMouseUp(self, event): """ Handles the ``wx.EVT_LEFT_UP`` event for :class:`FloatSpin`. :param `event`: a :class:`MouseEvent` event to be processed. :note: This method works on the underlying :class:`SpinButton`. """ if self._textctrl: if "__WXMSW__" in wx.PlatformInfo: self._textctrl.SetFocus() self._textctrl.SelectAll() elif not "__WXMAC__" in wx.PlatformInfo: self._textctrl.SetFocus() self._textctrl.SetSelection(0, 0) self._ignore_spin_event = False event.Skip() def OnSpinUp(self, event): """ Handles the ``wx.EVT_SPIN_UP`` event for :class:`FloatSpin`. :param `event`: a :class:`SpinEvent` event to be processed. """ if self._ignore_spin_event: self._ignore_spin_event = False return if self._textctrl and self._textctrl.IsModified(): self.SyncSpinToText(False) if self.InRange(self._value + self._increment*self._spinmodifier): self._value = self._value + self._increment*self._spinmodifier elif self._max is not None: self._value = self._max self.SetValue(self._value) if "__WXMAC__" in wx.PlatformInfo: self._textctrl.SelectAll() self.DoSendEvent() def OnSpinDown(self, event): """ Handles the ``wx.EVT_SPIN_DOWN`` event for :class:`FloatSpin`. :param `event`: a :class:`SpinEvent` event to be processed. """ if self._ignore_spin_event: self._ignore_spin_event = False return if self._textctrl and self._textctrl.IsModified(): self.SyncSpinToText(False) if self.InRange(self._value - self._increment*self._spinmodifier): self._value = self._value - self._increment*self._spinmodifier elif self._min is not None: self._value = self._min self.SetValue(self._value) if "__WXMAC__" in wx.PlatformInfo: self._textctrl.SelectAll() self.DoSendEvent() def OnTextEnter(self, event): """ Handles the ``wx.EVT_TEXT_ENTER`` event for :class:`FloatSpin`. :param `event`: a :class:`KeyEvent` event to be processed. :note: This method works on the underlying :class:`TextCtrl`. """ self.SyncSpinToText(True) event.Skip() def OnKeyDown(self, event): """ Handles the ``wx.EVT_KEYDOWN`` event for :class:`FloatSpin`. :param `event`: a :class:`KeyEvent` event to be processed. :note: This method works on the underlying :class:`TextCtrl`. """ modifier = FixedPoint(str(1.0), 20) if event.ShiftDown(): modifier = modifier*2.0 if event.ControlDown(): modifier = modifier*10.0 if event.AltDown(): modifier = modifier*100.0 keycode = event.GetKeyCode() if keycode == wx.WXK_UP: if self._textctrl and self._textctrl.IsModified(): self.SyncSpinToText(False) self.SetValue(self._value + self._increment*modifier) self.DoSendEvent() elif keycode == wx.WXK_DOWN: if self._textctrl and self._textctrl.IsModified(): self.SyncSpinToText(False) self.SetValue(self._value - self._increment*modifier) self.DoSendEvent() elif keycode == wx.WXK_PAGEUP: if self._textctrl and self._textctrl.IsModified(): self.SyncSpinToText(False) self.SetValue(self._value + 10.0*self._increment*modifier) self.DoSendEvent() elif keycode == wx.WXK_PAGEDOWN: if self._textctrl and self._textctrl.IsModified(): self.SyncSpinToText(False) self.SetValue(self._value - 10.0*self._increment*modifier) self.DoSendEvent() elif keycode == wx.WXK_SPACE: self.SetValue(self._value) if self._textctrl: self._textctrl.SelectAll() event.Skip(False) elif keycode == wx.WXK_ESCAPE: self.SetToDefaultValue() if self._textctrl: self._textctrl.SelectAll() self.DoSendEvent() elif keycode == wx.WXK_TAB: # The original event code doesn't work under wxGTK focus_next_keyboard_focusable_control(event.EventObject) elif keycode in (wx.WXK_RETURN, wx.WXK_NUMPAD_ENTER): default = self.TopLevelParent.DefaultItem if (default and default.Enabled and default.IsShownOnScreen() and isinstance(default, wx.Button)): default.ProcessEvent(wx.PyCommandEvent(wx.EVT_BUTTON.typeId, default.GetId())) else: if (not event.CmdDown() and not event.ControlDown() and keycode not in self._validkeycode): return event.Skip() def OnMouseWheel(self, event): """ Handles the ``wx.EVT_MOUSEWHEEL`` event for :class:`FloatSpin`. :param `event`: a :class:`MouseEvent` event to be processed. """ modifier = FixedPoint(str(1.0), 20) if event.ShiftDown(): modifier = modifier*2.0 if event.ControlDown(): modifier = modifier*10.0 if event.AltDown(): modifier = modifier*100.0 if self._textctrl and self._textctrl.IsModified(): self.SyncSpinToText(False) if event.GetWheelRotation() > 0: self.SetValue(self._value + self._increment*modifier) else: self.SetValue(self._value - self._increment*modifier) if self._textctrl: if "__WXMAC__" in wx.PlatformInfo: self._textctrl.SelectAll() else: self._textctrl.SetFocus() self._textctrl.SetSelection(0, 0) self.DoSendEvent() def OnSize(self, event): """ Handles the ``wx.EVT_SIZE`` event for :class:`FloatSpin`. :param `event`: a :class:`SizeEvent` event to be processed. :note: This method resizes the text control and reposition the spin button when resized. """ # start Philip Semanchuk addition event_width = event.GetSize().width self._textctrl.SetPosition((self._text_left, self._text_top)) text_width, text_height = self._textctrl.Size spin_width, _ = self._spinbutton.Size text_width = event_width - (spin_width + self._gap + self._text_left) self._textctrl.SetSize(wx.Size(text_width, event.GetSize().height)) # The spin button is always snug against the right edge of the # control. self._spinbutton.SetPosition((event_width - spin_width, self._spin_top)) event.Skip() # end Philip Semanchuk addition def ReplaceDoubleZero(self, strs): """ Replaces the (somewhat) python ugly `+e000` with `+e00`. :param `strs`: a string (possibly) containing a `+e00` substring. """ if self._textformat not in ["%g", "%e", "%E", "%G"]: return strs if strs.find("e+00") >= 0: strs = strs.replace("e+00", "e+0") elif strs.find("e-00") >= 0: strs = strs.replace("e-00", "e-0") elif strs.find("E+00") >= 0: strs = strs.replace("E+00", "E+0") elif strs.find("E-00") >= 0: strs = strs.replace("E-00", "E-0") return strs def SetValue(self, value): """ Sets the :class:`FloatSpin` value. :param `value`: the new value. """ if not self._textctrl or not self.InRange(value): return if self._snapticks and self._increment != 0.0: finite, snap_value = self.IsFinite(value) if not finite: # FIXME What To Do About A Failure? if (snap_value - floor(snap_value) < ceil(snap_value) - snap_value): value = self._defaultvalue + floor(snap_value)*self._increment else: value = self._defaultvalue + ceil(snap_value)*self._increment decimal = locale.localeconv()["decimal_point"] strs = ("%100." + str(self._digits) + self._textformat[1])%value strs = strs.replace(".", decimal) strs = strs.replace(",", ".") strs = strs.strip() strs = self.ReplaceDoubleZero(strs) # Sync spinbutton so that events generated by it match up with the # actual spin direction. # This fixes an issue under GTK and Mac OS X where the EVT_SPIN event # generated by pressing the spin up/down buttons is dependent on the # spin button value (e.g. if the down button is pressed when the button # value is at its minimum, there will always be a EVT_SPIN_UP generated # under GTK, and no event at all under Mac OS X). min_val = self._min if self._min is not None else self._spinbutton.Min max_val = self._max if self._max is not None else self._spinbutton.Max # Scale the value to the spinbutton range spinvalue = int(round(((value - min_val) / float(max_val - min_val)) * self._spinbutton.Max)) # Setting the spin button value causes a EVT_SPIN event to be generated # under GTK, which we need to ignore self._ignore_spin_event = True self._spinbutton.SetValue(spinvalue) if value != self._value or strs != self._textctrl.GetValue(): self._textctrl.SetValue(strs) self._textctrl.DiscardEdits() self._value = value def GetValue(self): """ Returns the :class:`FloatSpin` value. """ return float(self._value) def SetRangeDontClampValue(self, min_val, max_val): """ Sets the allowed range. :param `min_val`: the minimum value for :class:`FloatSpin`. If it is ``None`` it is ignored; :param `max_val`: the maximum value for :class:`FloatSpin`. If it is ``None`` it is ignored. :note: This method doesn't modify the current value. """ if (min_val != None): self._min = FixedPoint(str(min_val), 20) else: self._min = None if (max_val != None): self._max = FixedPoint(str(max_val), 20) else: self._max = None def SetRange(self, min_val, max_val): """ Sets the allowed range. :param `min_val`: the minimum value for :class:`FloatSpin`. If it is ``None`` it is ignored; :param `max_val`: the maximum value for :class:`FloatSpin`. If it is ``None`` it is ignored. :note: This method doesn't modify the current value. :note: You specify open ranges like this (you can equally do this in the constructor):: SetRange(min_val=1, max_val=None) SetRange(min_val=None, max_val=0) or no range:: SetRange(min_val=None, max_val=None) """ self.SetRangeDontClampValue(min_val, max_val) value = self.ClampValue(self._value) if (value != self._value): self.SetValue(value) def ClampValue(self, var): """ Clamps `var` between `_min` and `_max` depending if the range has been specified. :param `var`: the value to be clamped. :return: A clamped copy of `var`. """ if (self._min != None): if (var < self._min): var = self._min return var if (self._max != None): if (var > self._max): var = self._max return var def SetIncrement(self, increment): """ Sets the increment for every ``EVT_FLOATSPIN`` event. :param `increment`: a floating point number specifying the :class:`FloatSpin` increment. """ if increment < 1./10.0**self._digits: raise Exception("\nERROR: Increment Should Be Greater Or Equal To 1/(10**digits).") self._increment = FixedPoint(str(increment), 20) self.SetValue(self._value) def GetIncrement(self): """ Returns the increment for every ``EVT_FLOATSPIN`` event. """ return self._increment def SetDigits(self, digits=-1): """ Sets the number of digits to show. :param `digits`: the number of digits to show. If `digits` < 0, :class:`FloatSpin` tries to calculate the best number of digits based on input values passed in the constructor. """ if digits < 0: incr = str(self._increment) if incr.find(".") < 0: digits = 0 else: digits = len(incr[incr.find(".")+1:]) self._digits = digits self.SetValue(self._value) def GetDigits(self): """ Returns the number of digits shown. """ return self._digits def SetFormat(self, fmt="%f"): """ Set the string format to use. :param `fmt`: the new string format to use. One of the following strings: ====== ================================= Format Description ====== ================================= 'e' Floating point exponential format (lowercase) 'E' Floating point exponential format (uppercase) 'f' Floating point decimal format 'F' Floating point decimal format 'g' Floating point format. Uses lowercase exponential format if exponent is less than -4 or not less than precision, decimal format otherwise 'G' Floating point format. Uses uppercase exponential format if exponent is less than -4 or not less than precision, decimal format otherwise ====== ================================= """ if fmt not in ["%f", "%g", "%e", "%E", "%F", "%G"]: raise Exception('\nERROR: Bad Float Number Format: ' + repr(fmt) + '. It Should Be ' \ 'One Of "%f", "%g", "%e", "%E", "%F", "%G"') self._textformat = fmt if self._digits < 0: self.SetDigits() else: self.SetValue(self._value) def GetFormat(self): """ Returns the string format in use. :see: :meth:`~FloatSpin.SetFormat` for a list of valid string formats. """ return self._textformat def SetDefaultValue(self, defaultvalue): """ Sets the :class:`FloatSpin` default value. :param `defaultvalue`: a floating point value representing the new default value for :class:`FloatSpin`. """ if self.InRange(defaultvalue): self._defaultvalue = FixedPoint(str(defaultvalue), 20) def GetDefaultValue(self): """ Returns the :class:`FloatSpin` default value. """ return self._defaultvalue def IsDefaultValue(self): """ Returns whether the current value is the default value or not. """ return self._value == self._defaultvalue def SetToDefaultValue(self): """ Sets :class:`FloatSpin` value to its default value. """ self.SetValue(self._defaultvalue) def SetSnapToTicks(self, forceticks=True): """ Force the value to always be divisible by the increment. Initially ``False``. :param `forceticks`: ``True`` to force the snap to ticks option, ``False`` otherwise. :note: This uses the default value as the basis, you will get strange results for very large differences between the current value and default value when the increment is very small. """ if self._snapticks != forceticks: self._snapticks = forceticks self.SetValue(self._value) def GetSnapToTicks(self): """ Returns whether the snap to ticks option is active or not. """ return self._snapticks def OnFocus(self, event): """ Handles the ``wx.EVT_SET_FOCUS`` event for :class:`FloatSpin`. :param `event`: a :class:`FocusEvent` event to be processed. """ if self._textctrl: self._textctrl.SetFocus() event.Skip() def SyncSpinToText(self, send_event=True, force_valid=True): """ Synchronize the underlying :class:`TextCtrl` with :class:`SpinButton`. :param `send_event`: ``True`` to send a ``EVT_FLOATSPIN`` event, ``False`` otherwise; :param `force_valid`: ``True`` to force a valid value (i.e. inside the provided range), ``False`` otherwise. """ if not self._textctrl: return curr = self._textctrl.GetValue() curr = curr.strip() decimal = locale.localeconv()["decimal_point"] curr = curr.replace(decimal, ".") curr = curr.replace(",", ".") if curr: try: curro = float(curr) curr = FixedPoint(curr, 20) except: self.SetValue(self._value) return if force_valid or not self.HasRange() or self.InRange(curr): if force_valid and self.HasRange(): curr = self.ClampValue(curr) if self._value != curr: self.SetValue(curr) if send_event: self.DoSendEvent() elif force_valid: # textctrl is out of sync, discard and reset self.SetValue(self.GetValue()) def SetFont(self, font=None): """ Sets the underlying :class:`TextCtrl` font. :param `font`: a valid instance of :class:`Font`. """ if font is None: font = wx.SystemSettings_GetFont(wx.SYS_DEFAULT_GUI_FONT) if not self._textctrl: return False return self._textctrl.SetFont(font) def GetFont(self): """ Returns the underlying :class:`TextCtrl` font. """ if not self._textctrl: return self.GetFont() return self._textctrl.GetFont() def GetMin(self): """ Returns the minimum value for :class:`FloatSpin`. It can be a number or ``None`` if no minimum is present. """ return self._min def GetMax(self): """ Returns the maximum value for :class:`FloatSpin`. It can be a number or ``None`` if no minimum is present. """ return self._max def HasRange(self): """ Returns whether :class:`FloatSpin` range has been set or not. """ return (self._min != None) or (self._max != None) def InRange(self, value): """ Returns whether a value is inside :class:`FloatSpin` range. :param `value`: the value to test. """ if (not self.HasRange()): return True if (self._min != None): if (value < self._min): return False if (self._max != None): if (value > self._max): return False return True def GetTextCtrl(self): """ Returns the underlying :class:`TextCtrl`. """ return self._textctrl def IsFinite(self, value): """ Tries to determine if a value is finite or infinite/NaN. :param `value`: the value to test. """ try: snap_value = (value - self._defaultvalue)/self._increment finite = True except: finite = False snap_value = None return finite, snap_value if wx.VERSION >= (3, ): # Use wx.SpinCtrlDouble EVT_FLOATSPIN = wx.EVT_SPINCTRLDOUBLE class FloatSpin(wx.SpinCtrlDouble): _spinwidth = 0 def __init__(self, parent, id=wx.ID_ANY, pos=wx.DefaultPosition, size=(95,-1), style=0, value=0.0, min_val=None, max_val=None, increment=1.0, digits=-1, agwStyle=FS_LEFT, name="FloatSpin"): if "gtk3" in wx.PlatformInfo: if not FloatSpin._spinwidth: spin = wx.SpinCtrl(parent, -1) text = wx.TextCtrl(parent, -1) FloatSpin._spinwidth = spin.Size[0] - text.Size[0] + 11 spin.Destroy() text.Destroy() size = size[0] + FloatSpin._spinwidth, size[1] wx.SpinCtrlDouble.__init__(self, parent, id, str(value), pos, size, style, min_val or 0, max_val or 100, value, increment, name) if digits > -1: self.SetDigits(digits) # Class FixedPoint, version 0.0.4. # Released to the public domain 28-Mar-2001, # by Tim Peters (tim.one@home.com). # Provided as-is; use at your own risk; no warranty; no promises; enjoy! # 28-Mar-01 ver 0.0,4 # Use repr() instead of str() inside __str__, because str(long) changed # since this was first written (used to produce trailing "L", doesn't # now). # # 09-May-99 ver 0,0,3 # Repaired __sub__(FixedPoint, string); was blowing up. # Much more careful conversion of float (now best possible). # Implemented exact % and divmod. # # 14-Oct-98 ver 0,0,2 # Added int, long, frac. Beefed up docs. Removed DECIMAL_POINT # and MINUS_SIGN globals to discourage bloating this class instead # of writing formatting wrapper classes (or subclasses) # # 11-Oct-98 ver 0,0,1 # posted to c.l.py __version__ = 0, 0, 4 # The default value for the number of decimal digits carried after the # decimal point. This only has effect at compile-time. DEFAULT_PRECISION = 2 """ The default value for the number of decimal digits carried after the decimal point. This only has effect at compile-time. """ class FixedPoint(object): """ FixedPoint objects support decimal arithmetic with a fixed number of digits (called the object's precision) after the decimal point. The number of digits before the decimal point is variable & unbounded. The precision is user-settable on a per-object basis when a FixedPoint is constructed, and may vary across FixedPoint objects. The precision may also be changed after construction via `FixedPoint.set_precision(p)`. Note that if the precision of a FixedPoint is reduced via :meth:`FixedPoint.set_precision() `, information may be lost to rounding. Example:: >>> x = FixedPoint("5.55") # precision defaults to 2 >>> print x 5.55 >>> x.set_precision(1) # round to one fraction digit >>> print x 5.6 >>> print FixedPoint("5.55", 1) # same thing setting to 1 in constructor 5.6 >>> repr(x) # returns constructor string that reproduces object exactly "FixedPoint('5.6', 1)" >>> When :class:`FixedPoint` objects of different precision are combined via + - * /, the result is computed to the larger of the inputs' precisions, which also becomes the precision of the resulting :class:`FixedPoint` object. Example:: >>> print FixedPoint("3.42") + FixedPoint("100.005", 3) 103.425 >>> When a :class:`FixedPoint` is combined with other numeric types (ints, floats, strings representing a number) via + - * /, then similarly the computation is carried out using -- and the result inherits -- the :class:`FixedPoint`'s precision. Example:: >>> print FixedPoint(1) / 7 0.14 >>> print FixedPoint(1, 30) / 7 0.142857142857142857142857142857 >>> The string produced by `str(x)` (implictly invoked by `print`) always contains at least one digit before the decimal point, followed by a decimal point, followed by exactly `x.get_precision()` digits. If `x` is negative, `str(x)[0] == "-"`. The :class:`FixedPoint` constructor can be passed an int, long, string, float, :class:`FixedPoint`, or any object convertible to a float via `float()` or to a long via `long()`. Passing a precision is optional; if specified, the precision must be a non-negative int. There is no inherent limit on the size of the precision, but if very very large you'll probably run out of memory. Note that conversion of floats to :class:`FixedPoint` can be surprising, and should be avoided whenever possible. Conversion from string is exact (up to final rounding to the requested precision), so is greatly preferred. Example:: >>> print FixedPoint(1.1e30) 1099999999999999993725589651456.00 >>> print FixedPoint("1.1e30") 1100000000000000000000000000000.00 >>> """ # the exact value is self.n / 10**self.p; # self.n is a long; self.p is an int def __init__(self, value=0, precision=DEFAULT_PRECISION): """ Default class constructor. :param `value`: the initial value; :param `precision`: must be an int >= 0, and defaults to ``DEFAULT_PRECISION``. """ self.n = self.p = 0 self.set_precision(precision) p = self.p if isinstance(value, type("42.3e5")): n, exp = _string2exact(value) # exact value is n*10**exp = n*10**(exp+p)/10**p effective_exp = exp + p if effective_exp > 0: n = n * _tento(effective_exp) elif effective_exp < 0: n = _roundquotient(n, _tento(-effective_exp)) self.n = n return if isinstance(value, type(42)) or isinstance(value, type(42L)): self.n = long(value) * _tento(p) return if isinstance(value, FixedPoint): temp = value.copy() temp.set_precision(p) self.n, self.p = temp.n, temp.p return if isinstance(value, type(42.0)): # XXX ignoring infinities and NaNs and overflows for now import math f, e = math.frexp(abs(value)) assert f == 0 or 0.5 <= f < 1.0 # |value| = f * 2**e exactly # Suck up CHUNK bits at a time; 28 is enough so that we suck # up all bits in 2 iterations for all known binary double- # precision formats, and small enough to fit in an int. CHUNK = 28 top = 0L # invariant: |value| = (top + f) * 2**e exactly while f: f = math.ldexp(f, CHUNK) digit = int(f) assert digit >> CHUNK == 0 top = (top << CHUNK) | digit f = f - digit assert 0.0 <= f < 1.0 e = e - CHUNK # now |value| = top * 2**e exactly # want n such that n / 10**p = top * 2**e, or # n = top * 10**p * 2**e top = top * _tento(p) if e >= 0: n = top << e else: n = _roundquotient(top, 1L << -e) if value < 0: n = -n self.n = n return if isinstance(value, type(42-42j)): raise TypeError("can't convert complex to FixedPoint: " + `value`) # can we coerce to a float? yes = 1 try: asfloat = float(value) except: yes = 0 if yes: self.__init__(asfloat, p) return # similarly for long yes = 1 try: aslong = long(value) except: yes = 0 if yes: self.__init__(aslong, p) return raise TypeError("can't convert to FixedPoint: " + `value`) def get_precision(self): """ Return the precision of this :class:`FixedPoint`. :note: The precision is the number of decimal digits carried after the decimal point, and is an int >= 0. """ return self.p def set_precision(self, precision=DEFAULT_PRECISION): """ Change the precision carried by this :class:`FixedPoint` to `precision`. :param `precision`: must be an int >= 0, and defaults to ``DEFAULT_PRECISION``. :note: If `precision` is less than this :class:`FixedPoint`'s current precision, information may be lost to rounding. """ try: p = int(precision) except: raise TypeError("precision not convertable to int: " + `precision`) if p < 0: raise ValueError("precision must be >= 0: " + `precision`) if p > self.p: self.n = self.n * _tento(p - self.p) elif p < self.p: self.n = _roundquotient(self.n, _tento(self.p - p)) self.p = p def __str__(self): n, p = self.n, self.p i, f = divmod(abs(n), _tento(p)) if p: frac = repr(f)[:-1] frac = "0" * (p - len(frac)) + frac else: frac = "" return "-"[:n<0] + \ repr(i)[:-1] + \ "." + frac def __repr__(self): return "FixedPoint" + `(str(self), self.p)` def copy(self): """ Create a copy of the current :class:`FixedPoint`. """ return _mkFP(self.n, self.p) __copy__ = __deepcopy__ = copy def __cmp__(self, other): if (other is None): return 1 xn, yn, p = _norm(self, other) return cmp(xn, yn) def __hash__(self): # caution! == values must have equal hashes, and a FixedPoint # is essentially a rational in unnormalized form. There's # really no choice here but to normalize it, so hash is # potentially expensive. n, p = self.__reduce() # Obscurity: if the value is an exact integer, p will be 0 now, # so the hash expression reduces to hash(n). So FixedPoints # that happen to be exact integers hash to the same things as # their int or long equivalents. This is Good. But if a # FixedPoint happens to have a value exactly representable as # a float, their hashes may differ. This is a teensy bit Bad. return hash(n) ^ hash(p) def __nonzero__(self): return self.n != 0 def __neg__(self): return _mkFP(-self.n, self.p) def __abs__(self): if self.n >= 0: return self.copy() else: return -self def __add__(self, other): n1, n2, p = _norm(self, other) # n1/10**p + n2/10**p = (n1+n2)/10**p return _mkFP(n1 + n2, p) __radd__ = __add__ def __sub__(self, other): if not isinstance(other, FixedPoint): other = FixedPoint(other, self.p) return self.__add__(-other) def __rsub__(self, other): return (-self) + other def __mul__(self, other): n1, n2, p = _norm(self, other) # n1/10**p * n2/10**p = (n1*n2/10**p)/10**p return _mkFP(_roundquotient(n1 * n2, _tento(p)), p) __rmul__ = __mul__ def __div__(self, other): n1, n2, p = _norm(self, other) if n2 == 0: raise ZeroDivisionError("FixedPoint division") if n2 < 0: n1, n2 = -n1, -n2 # n1/10**p / (n2/10**p) = n1/n2 = (n1*10**p/n2)/10**p return _mkFP(_roundquotient(n1 * _tento(p), n2), p) def __rdiv__(self, other): n1, n2, p = _norm(self, other) return _mkFP(n2, p) / self def __divmod__(self, other): n1, n2, p = _norm(self, other) if n2 == 0: raise ZeroDivisionError("FixedPoint modulo") # floor((n1/10**p)/(n2*10**p)) = floor(n1/n2) q = n1 / n2 # n1/10**p - q * n2/10**p = (n1 - q * n2)/10**p return q, _mkFP(n1 - q * n2, p) def __rdivmod__(self, other): n1, n2, p = _norm(self, other) return divmod(_mkFP(n2, p), self) def __mod__(self, other): return self.__divmod__(other)[1] def __rmod__(self, other): n1, n2, p = _norm(self, other) return _mkFP(n2, p).__mod__(self) # caution! float can lose precision def __float__(self): n, p = self.__reduce() return float(n) / float(_tento(p)) # XXX should this round instead? # XXX note e.g. long(-1.9) == -1L and long(1.9) == 1L in Python # XXX note that __int__ inherits whatever __long__ does, # XXX and .frac() is affected too def __long__(self): answer = abs(self.n) / _tento(self.p) if self.n < 0: answer = -answer return answer def __int__(self): return int(self.__long__()) def frac(self): """ Returns fractional portion as a :class:`FixedPoint`. :note: In :class:`FixedPoint`, this equality holds true:: x = x.frac() + long(x) """ return self - long(self) # return n, p s.t. self == n/10**p and n % 10 != 0 def __reduce(self): n, p = self.n, self.p if n == 0: p = 0 while p and n % 10 == 0: p = p - 1 n = n / 10 return n, p # return 10L**n def _tento(n, cache={}): try: return cache[n] except KeyError: answer = cache[n] = 10L ** n return answer # return xn, yn, p s.t. # p = max(x.p, y.p) # x = xn / 10**p # y = yn / 10**p # # x must be FixedPoint to begin with; if y is not FixedPoint, # it inherits its precision from x. # # Note that this is called a lot, so default-arg tricks are helpful. def _norm(x, y, isinstance=isinstance, FixedPoint=FixedPoint, _tento=_tento): assert isinstance(x, FixedPoint) if not isinstance(y, FixedPoint): y = FixedPoint(y, x.p) xn, yn = x.n, y.n xp, yp = x.p, y.p if xp > yp: yn = yn * _tento(xp - yp) p = xp elif xp < yp: xn = xn * _tento(yp - xp) p = yp else: p = xp # same as yp return xn, yn, p def _mkFP(n, p, FixedPoint=FixedPoint): f = FixedPoint() f.n = n f.p = p return f # divide x by y, rounding to int via nearest-even # y must be > 0 # XXX which rounding modes are useful? def _roundquotient(x, y): assert y > 0 n, leftover = divmod(x, y) c = cmp(leftover << 1, y) # c < 0 <-> leftover < y/2, etc if c > 0 or (c == 0 and (n & 1) == 1): n = n + 1 return n # crud for parsing strings import re # There's an optional sign at the start, and an optional exponent # at the end. The exponent has an optional sign and at least one # digit. In between, must have either at least one digit followed # by an optional fraction, or a decimal point followed by at least # one digit. Yuck. _parser = re.compile(r""" \s* (?P[-+])? ( (?P\d+) (\. (?P\d*))? | \. (?P\d+) ) ([eE](?P[-+]? \d+))? \s* $ """, re.VERBOSE).match del re # return n, p s.t. float string value == n * 10**p exactly def _string2exact(s): m = _parser(s) if m is None: raise ValueError("can't parse as number: " + `s`) exp = m.group('exp') if exp is None: exp = 0 else: exp = int(exp) intpart = m.group('int') if intpart is None: intpart = "0" fracpart = m.group('onlyfrac') else: fracpart = m.group('frac') if fracpart is None or fracpart == "": fracpart = "0" assert intpart assert fracpart i, f = long(intpart), long(fracpart) nfrac = len(fracpart) i = i * _tento(nfrac) + f exp = exp - nfrac if m.group('sign') == "-": i = -i return i, exp def get_all_keyboard_focusable_children(parent): """ Get all keyboard focusable children of parent """ children = [] try: iter(parent.Children) # Under Mac OS X panels may have non-iterator children except: pass else: for child in parent.Children: if child.Enabled and child.IsShownOnScreen(): if child.AcceptsFocusFromKeyboard(): if not isinstance(child, wx.RadioButton) or child.Value: children.append(child) if child.Children: children.extend(get_all_keyboard_focusable_children(child)) return children def focus_next_keyboard_focusable_control(control): """ Focus the next control in tab order that can gain focus. If the shift key is held down, tab order is reversed. """ # Find the last panel in the hierarchy of parents parent = control.Parent focusparent = None while parent: if isinstance(parent, (wx.Panel, wx.PyPanel)): focusparent = parent parent = parent.Parent if focusparent: children = get_all_keyboard_focusable_children(focusparent) if wx.GetKeyState(wx.WXK_SHIFT): children = list(reversed(children)) for i, child in enumerate(children): if child is control: for next in children[i + 1:] + children[:i]: if next is not child.Parent: next.SetFocus() break break DisplayCAL-3.1.0.0/DisplayCAL/gtypes.py0000644000076500000000000000055712647526531017326 0ustar devwheel00000000000000# -*- coding: utf-8 -*- from ctypes import Structure, c_char_p, c_int, c_uint class gchar_p(c_char_p): # represents "[const] gchar*" pass class gint(c_int): pass class guint(c_uint): pass class guint32(c_uint): pass class GQuark(guint32): pass class GError(Structure): _fields_ = [("domain", GQuark), ("code", gint), ("message", gchar_p)] DisplayCAL-3.1.0.0/DisplayCAL/ICCProfile.py0000644000076500000000000041344612653526636017742 0ustar devwheel00000000000000# -*- coding: utf-8 -*- from copy import copy from hashlib import md5 import binascii import ctypes import datetime import locale import math import os import re import struct import sys import warnings import zlib from itertools import izip, imap from time import localtime, mktime, strftime from UserString import UserString if sys.platform == "win32": import _winreg else: import subprocess as sp if sys.platform == "darwin": from platform import mac_ver if sys.platform == "win32": try: import win32api import win32gui except ImportError: pass try: import colord except ImportError: class Colord: Colord = None def quirk_manufacturer(self, manufacturer): return manufacturer def which(self, executable, paths=None): return None colord = Colord() import colormath import edid import imfile from colormath import NumberTuple from defaultpaths import iccprofiles, iccprofiles_home from encoding import get_encodings from ordereddict import OrderedDict try: from log import safe_print except ImportError: from safe_print import safe_print from util_decimal import float2dec from util_list import intlist from util_str import hexunescape, safe_str, safe_unicode if sys.platform not in ("darwin", "win32"): from edid import get_edid from util_x import get_display try: import xrandr except ImportError: xrandr = None elif sys.platform == "win32": import util_win if sys.getwindowsversion() < (6, ): # WCS only available under Vista and later mscms = None else: mscms = util_win._get_mscms_dll_handle() if mscms: mscms.WcsGetDefaultColorProfileSize.restype = ctypes.c_bool mscms.WcsGetDefaultColorProfile.restype = ctypes.c_bool mscms.WcsAssociateColorProfileWithDevice.restype = ctypes.c_bool mscms.WcsDisassociateColorProfileFromDevice.restype = ctypes.c_bool elif sys.platform == "darwin": from util_mac import osascript # Gamut volumes in cubic colorspace units (L*a*b*) as reported by Argyll's # iccgamut GAMUT_VOLUME_SRGB = 833675.435316 # rel. col. GAMUT_VOLUME_ADOBERGB = 1209986.014983 # rel. col. GAMUT_VOLUME_SMPTE431_P3 = 1176953.485921 # rel. col. # http://msdn.microsoft.com/en-us/library/dd371953%28v=vs.85%29.aspx COLORPROFILESUBTYPE = {"NONE": 0x0000, "RGB_WORKING_SPACE": 0x0001, "PERCEPTUAL": 0x0002, "ABSOLUTE_COLORIMETRIC": 0x0004, "RELATIVE_COLORIMETRIC": 0x0008, "SATURATION": 0x0010, "CUSTOM_WORKING_SPACE": 0x0020} # http://msdn.microsoft.com/en-us/library/dd371955%28v=vs.85%29.aspx (wrong) # http://msdn.microsoft.com/en-us/library/windows/hardware/ff546018%28v=vs.85%29.aspx (ok) COLORPROFILETYPE = {"ICC": 0, "DMP": 1, "CAMP": 2, "GMMP": 3} WCS_PROFILE_MANAGEMENT_SCOPE = {"SYSTEM_WIDE": 0, "CURRENT_USER": 1} debug = "-d" in sys.argv[1:] or "--debug" in sys.argv[1:] enc, fs_enc = get_encodings() cmms = {"argl": "Argyll CMS", "ADBE": "Adobe", "ACMS": "Agfa", "Agfa": "Agfa", "APPL": "Apple", "appl": "Apple", "CCMS": "ColorGear", "UCCM": "ColorGear Lite", "DL&C": "Digital Light & Color", "EFI ": "EFI", "FF ": "Fuji Film", "HCMM": "Harlequin RIP", "LgoS": "LogoSync", "HDM ": "Heidelberg", "Lino": "Linotype", "lino": "Linotype", "lcms": "Little CMS", "KCMS": "Kodak", "MCML": "Konica Minolta", "MSFT": "Microsoft", "SIGN": "Mutoh", "RGMS": "DeviceLink", "SICC": "SampleICC", "32BT": "the imaging factory", "WTG ": "Ware to Go", "zc00": "Zoran"} encodings = { "mac": { 141: "africaans", 36: "albanian", 85: "amharic", 12: "arabic", 51: "armenian", 68: "assamese", 134: "aymara", 49: "azerbaijani-cyrllic", 50: "azerbaijani-arabic", 129: "basque", 67: "bengali", 137: "dzongkha", 142: "breton", 44: "bulgarian", 77: "burmese", 46: "byelorussian", 78: "khmer", 130: "catalan", 92: "chewa", 33: "simpchinese", 19: "tradchinese", 18: "croatian", 38: "czech", 7: "danish", 4: "dutch", 0: "roman", 94: "esperanto", 27: "estonian", 30: "faeroese", 31: "farsi", 13: "finnish", 34: "flemish", 1: "french", 140: "galician", 144: "scottishgaelic", 145: "manxgaelic", 52: "georgian", 2: "german", 14: "greek-monotonic", 148: "greek-polytonic", 133: "guarani", 69: "gujarati", 10: "hebrew", 21: "hindi", 26: "hungarian", 15: "icelandic", 81: "indonesian", 143: "inuktitut", 35: "irishgaelic", 146: "irishgaelic-dotsabove", 3: "italian", 11: "japanese", 138: "javaneserom", 73: "kannada", 61: "kashmiri", 48: "kazakh", 90: "kiryarwanda", 54: "kirghiz", 91: "rundi", 23: "korean", 60: "kurdish", 79: "lao", 131: "latin", 28: "latvian", 24: "lithuanian", 43: "macedonian", 93: "malagasy", 83: "malayroman-latin", 84: "malayroman-arabic", 72: "malayalam", 16: "maltese", 66: "marathi", 53: "moldavian", 57: "mongolian", 58: "mongolian-cyrillic", 64: "nepali", 9: "norwegian", 71: "oriya", 87: "oromo", 59: "pashto", 25: "polish", 8: "portuguese", 70: "punjabi", 132: "quechua", 37: "romanian", 32: "russian", 29: "sami", 65: "sanskrit", 42: "serbian", 62: "sindhi", 76: "sinhalese", 39: "slovak", 40: "slovenian", 88: "somali", 6: "spanish", 139: "sundaneserom", 89: "swahili", 5: "swedish", 82: "tagalog", 55: "tajiki", 74: "tamil", 135: "tatar", 75: "telugu", 22: "thai", 63: "tibetan", 86: "tigrinya", 147: "tongan", 17: "turkish", 56: "turkmen", 136: "uighur", 45: "ukrainian", 20: "urdu", 47: "uzbek", 80: "vietnamese", 128: "welsh", 41: "yiddish" } } colorants = { 0: { "description": "unknown", "channels": () }, 1: { "description": "ITU-R BT.709", "channels": ((0.64, 0.33), (0.3, 0.6), (0.15, 0.06)) }, 2: { "description": "SMPTE RP145-1994", "channels": ((0.63, 0.34), (0.31, 0.595), (0.155, 0.07)) }, 3: { "description": "EBU Tech.3213-E", "channels": ((0.64, 0.33), (0.29, 0.6), (0.15, 0.06)) }, 4: { "description": "P22", "channels": ((0.625, 0.34), (0.28, 0.605), (0.155, 0.07)) } } geometry = { 0: "unknown", 1: "0/45 or 45/0", 2: "0/d or d/0" } illuminants = { 0: "unknown", 1: "D50", 2: "D65", 3: "D93", 4: "F2", 5: "D55", 6: "A", 7: "E", 8: "F8" } observers = { 0: "unknown", 1: "CIE 1931", 2: "CIE 1964" } manufacturers = {"ADBE": "Adobe Systems Incorporated", "APPL": "Apple Computer, Inc.", "agfa": "Agfa Graphics N.V.", "argl": "Argyll CMS", "bICC": "basICColor GmbH", "DL&C": "Digital Light & Color", "EPSO": "Seiko Epson Corporation", "HDM ": "Heidelberger Druckmaschinen AG", "HP ": "Hewlett-Packard", "KODA": "Kodak", "lcms": "Little CMS", "MONS": "Monaco Systems Inc.", "MSFT": "Microsoft Corporation", "qato": "QUATOGRAPHIC Technology GmbH", "XRIT": "X-Rite"} platform = {"APPL": "Apple", "MSFT": "Microsoft", "SGI ": "Silicon Graphics", "SUNW": "Sun Microsystems"} profileclass = {"scnr": "Input device profile", "mntr": "Display device profile", "prtr": "Output device profile", "link": "DeviceLink profile", "spac": "Color space Conversion profile", "abst": "Abstract profile", "nmcl": "Named color profile"} tags = {"A2B0": "Device to PCS: Intent 0", "A2B1": "Device to PCS: Intent 1", "A2B2": "Device to PCS: Intent 2", "B2A0": "PCS to device: Intent 0", "B2A1": "PCS to device: Intent 1", "B2A2": "PCS to device: Intent 2", "CIED": "Characterization measurement values", # Non-standard "DevD": "Characterization device values", # Non-standard "arts": "Absolute to media relative transform", # Non-standard (Argyll) "bkpt": "Media black point", "bTRC": "Blue tone response curve", "bXYZ": "Blue matrix column", "chad": "Chromatic adaptation transform", "clro": "Colorant order", "cprt": "Copyright", "desc": "Description", "dmnd": "Device manufacturer name", "dmdd": "Device model name", "gamt": "Out of gamut tag", "gTRC": "Green tone response curve", "gXYZ": "Green matrix column", "kTRC": "Gray tone response curve", "lumi": "Luminance", "meas": "Measurement type", "mmod": "Make and model", "ncl2": "Named colors", "rTRC": "Red tone response curve", "rXYZ": "Red matrix column", "targ": "Characterization target", "tech": "Technology", "vcgt": "Video card gamma table", "view": "Viewing conditions", "vued": "Viewing conditions description", "wtpt": "Media white point"} tech = {"fscn": "Film scanner", "dcam": "Digital camera", "rscn": "Reflective scanner", "ijet": "Ink jet printer", "twax": "Thermal wax printer", "epho": "Electrophotographic printer", "esta": "Electrostatic printer", "dsub": "Dye sublimation printer", "rpho": "Photographic paper printer", "fprn": "Film writer", "vidm": "Video monitor", "vidc": "Video camera", "pjtv": "Projection television", "CRT ": "Cathode ray tube display", "PMD ": "Passive matrix display", "AMD ": "Active matrix display", "KPCD": "Photo CD", "imgs": "Photo imagesetter", "grav": "Gravure", "offs": "Offset lithography", "silk": "Silkscreen", "flex": "Flexography"} def PCSLab_dec_to_uInt16(L, a, b): return [v * (655.35, 256, 256)[i] + (0, 32768, 32768)[i] for i, v in enumerate((L, a, b))] def PCSLab_uInt16_to_dec(L_uInt16, a_uInt16, b_uInt16): return [(v - (0, 32768, 32768)[i]) / (65535.0, 32768.0, 32768.0)[i] * (100, 128, 128)[i] for i, v in enumerate((L_uInt16, a_uInt16, b_uInt16))] def Property(func): return property(**func()) def _colord_get_display_profile(display_no=0, path_only=False): edid = get_edid(display_no) if edid: # Try a range of possible device IDs device_ids = [colord.device_id_from_edid(edid, quirk=True), colord.device_id_from_edid(edid, quirk=True, truncate_edid_strings=True), colord.device_id_from_edid(edid, quirk=True, use_serial_32=False), colord.device_id_from_edid(edid, quirk=True, use_serial_32=False, truncate_edid_strings=True), colord.device_id_from_edid(edid, quirk=False), colord.device_id_from_edid(edid, quirk=False, truncate_edid_strings=True), colord.device_id_from_edid(edid, quirk=False, use_serial_32=False), colord.device_id_from_edid(edid, quirk=False, use_serial_32=False, truncate_edid_strings=True)] elif xrandr: # XrandR fallback display_name = xrandr.get_display_name(display_no) if display_name: edid = {"monitor_name": display_name} device_ids = [colord.device_id_from_edid(edid)] if edid: for device_id in OrderedDict.fromkeys(device_ids).iterkeys(): if device_id: try: profile_path = colord.get_default_profile(device_id) except colord.CDObjectQueryError: # Device ID was not found, try next one continue except colord.CDError, exception: warnings.warn(safe_str(exception, enc), Warning) else: if profile_path: if path_only: return profile_path return ICCProfile(profile_path) break return None def _wcs_get_display_profile(devicekey, scope=WCS_PROFILE_MANAGEMENT_SCOPE["CURRENT_USER"], profile_type=COLORPROFILETYPE["ICC"], profile_subtype=COLORPROFILESUBTYPE["NONE"], profile_id=0, path_only=False): buflen = ctypes.c_ulong() if not mscms.WcsGetDefaultColorProfileSize(scope, devicekey, profile_type, profile_subtype, profile_id, ctypes.byref(buflen)): raise util_win.get_windows_error(ctypes.windll.kernel32.GetLastError()) buf = ctypes.create_unicode_buffer(u'\0' * buflen.value) if not mscms.WcsGetDefaultColorProfile(scope, devicekey, profile_type, profile_subtype, profile_id, buflen, ctypes.byref(buf)): raise util_win.get_windows_error(ctypes.windll.kernel32.GetLastError()) if buf.value: if path_only: return os.path.join(iccprofiles[0], buf.value) return ICCProfile(buf.value) def _winreg_get_display_profile(monkey, current_user=False, path_only=False): filename = None try: if current_user and sys.getwindowsversion() >= (6, ): # Vista / Windows 7 ONLY # User has to place a check in 'use my settings for this device' # in the color management control panel at least once to cause # this key to be created, otherwise it won't exist subkey = "\\".join(["Software", "Microsoft", "Windows NT", "CurrentVersion", "ICM", "ProfileAssociations", "Display"] + monkey) key = _winreg.OpenKey(_winreg.HKEY_CURRENT_USER, subkey) else: subkey = "\\".join(["SYSTEM", "CurrentControlSet", "Control", "Class"] + monkey) key = _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE, subkey) numsubkeys, numvalues, mtime = _winreg.QueryInfoKey(key) for i in range(numvalues): name, value, type_ = _winreg.EnumValue(key, i) if name == "ICMProfile": if type_ == _winreg.REG_BINARY: # Win2k/XP # convert to list of strings value = value.decode('utf-16').split("\0") elif type_ == _winreg.REG_MULTI_SZ: # Vista / Windows 7 # nothing to be done, _winreg returns a list of strings pass if isinstance(value, list): while "" in value: value.remove("") while value: # last existing file in the list is active if os.path.isfile(os.path.join(iccprofiles[0], value[-1])): filename = value[-1] break value = value[:-1] else: if os.path.isfile(os.path.join(iccprofiles[0], value)): filename = value elif name == "UsePerUserProfiles" and not value: filename = None break except WindowsError, exception: if exception.args[0] == 2: # Key does not exist pass else: raise except Exception, exception: raise if not filename and not current_user: # fall back to sRGB filename = os.path.join(iccprofiles[0], "sRGB Color Space Profile.icm") if filename: if path_only: return os.path.join(iccprofiles[0], filename) return ICCProfile(filename) return None def _xrandr_get_display_profile(display_no=0, x_hostname="", x_display=0, x_screen=0): try: property = xrandr.get_output_property(display_no, "_ICC_PROFILE", xrandr.XA_CARDINAL, x_hostname, x_display, x_screen) except ValueError, exception: warnings.warn(safe_str(exception, enc), Warning) else: if property: return ICCProfile("".join(chr(i) for i in property)) return None def _x11_get_display_profile(display_no=0, x_hostname="", x_display=0, x_screen=0): try: atom = xrandr.get_atom("_ICC_PROFILE" + ("" if display_no == 0 else "_%s" % display_no), xrandr.XA_CARDINAL, x_hostname, x_display, x_screen) except ValueError, exception: warnings.warn(safe_str(exception, enc), Warning) else: if atom: return ICCProfile("".join(chr(i) for i in atom)) return None def get_display_profile(display_no=0, x_hostname="", x_display=0, x_screen=0, win_get_correct_profile=False, path_only=False, devicekey=None): """ Return ICC Profile for display n or None """ profile = None if sys.platform == "win32": if not "win32api" in sys.modules: raise ImportError("pywin32 not available") if not devicekey: # The ordering will work as long as Argyll continues using # EnumDisplayMonitors monitors = util_win.get_real_display_devices_info() moninfo = monitors[display_no] if not mscms and not devicekey: # Via GetICMProfile. Sucks royally in a multi-monitor setup # where one monitor is disabled, because it'll always get # the profile of the first monitor regardless if that is the active # one or not. Yuck. Also, in this case it does not reflect runtime # changes to profile assignments. Double yuck. buflen = ctypes.c_ulong() dc = win32gui.CreateDC(moninfo["Device"], None, None) try: ctypes.windll.gdi32.GetICMProfileW(dc, ctypes.byref(buflen), None) if buflen.value: buf = ctypes.create_unicode_buffer(u'\0' * buflen.value) if ctypes.windll.gdi32.GetICMProfileW(dc, ctypes.byref(buflen), ctypes.byref(buf)): if path_only: profile = buf.value else: profile = ICCProfile(buf.value) finally: win32gui.DeleteDC(dc) else: if devicekey: device = None elif win_get_correct_profile: # This would be the correct way. Unfortunately that is not # what other apps (or Windows itself) do. device = util_win.get_active_display_device(moninfo["Device"]) else: # This is wrong, but it's what other apps use. Matches # GetICMProfile sucky behavior i.e. should return the same # profile, but atleast reflects runtime changes to profile # assignments. device = win32api.EnumDisplayDevices(moninfo["Device"], 0) if device: devicekey = device.DeviceKey if devicekey: if mscms: # Via WCS return _wcs_get_display_profile(unicode(devicekey), path_only=path_only) # Via registry - NEVER monkey = devicekey.split("\\")[-2:] # pun totally intended # current user profile = _winreg_get_display_profile(monkey, True, path_only=path_only) if not profile: # system profile = _winreg_get_display_profile(monkey, path_only=path_only) else: if sys.platform == "darwin": if intlist(mac_ver()[0].split(".")) >= [10, 6]: options = ["Image Events"] else: options = ["ColorSyncScripting"] else: options = ["_ICC_PROFILE"] display = get_display() if not x_hostname: x_hostname = display[0] if not x_display: x_display = display[1] if not x_screen: x_screen = display[2] for option in options: if sys.platform == "darwin": # applescript: one-based index applescript = ['tell app "%s"' % option, 'set displayProfile to location of display profile of display %i' % (display_no + 1), 'return POSIX path of displayProfile', 'end tell'] retcode, output, errors = osascript(applescript) if retcode == 0 and output.strip(): filename = output.strip("\n").decode(fs_enc) if path_only: profile = filename else: profile = ICCProfile(filename) elif errors.strip(): raise IOError(errors.strip()) else: # Linux # Try colord if colord.which("colormgr"): profile = _colord_get_display_profile(display_no, path_only=path_only) if profile: return profile if path_only: # No way to figure out the profile path from X atom return # Try XrandR if xrandr and option == "_ICC_PROFILE": if debug: safe_print("Using XrandR") profile = _xrandr_get_display_profile(display_no, x_hostname, x_display, x_screen) if profile: return profile if debug: safe_print("Couldn't get _ICC_PROFILE XrandR output property") safe_print("Using X11") # Try X11 profile = _x11_get_display_profile(display_no, x_hostname, x_display, x_screen) if profile: return profile if debug: safe_print("Couldn't get _ICC_PROFILE X atom") # Read up to 8 MB of any X properties if debug: safe_print("Using xprop") atom = "%s%s" % (option, "" if display_no == 0 else "_%s" % display_no) tgt_proc = sp.Popen(["xprop", "-display", "%s:%s.%s" % (x_hostname, x_display, x_screen), "-len", "8388608", "-root", "-notype", atom], stdin=sp.PIPE, stdout=sp.PIPE, stderr=sp.PIPE) stdout, stderr = [data.strip("\n") for data in tgt_proc.communicate()] if stdout: if sys.platform == "darwin": filename = unicode(stdout, "UTF-8") if path_only: profile = filename else: profile = ICCProfile(filename) else: raw = [item.strip() for item in stdout.split("=")] if raw[0] == atom and len(raw) == 2: bin = "".join([chr(int(part)) for part in raw[1].split(", ")]) profile = ICCProfile(bin) elif stderr and tgt_proc.wait() != 0: raise IOError(stderr) if profile: break return profile def _wcs_set_display_profile(devicekey, profile_name): mscms.WcsDisassociateColorProfileFromDevice( WCS_PROFILE_MANAGEMENT_SCOPE["CURRENT_USER"], profile_name, devicekey) return mscms.WcsAssociateColorProfileWithDevice( WCS_PROFILE_MANAGEMENT_SCOPE["CURRENT_USER"], profile_name, devicekey) def set_display_profile(profile_name, display_no=0, use_active_display_device=False, devicekey=None): # Currently only implemented for Windows. # The profile to be assigned has to be already installed! if not devicekey: monitors = util_win.get_real_display_devices_info() moninfo = monitors[display_no] if use_active_display_device: # This would be the correct way. Unfortunately that is not # what other apps (and Windows itself) do. device = util_win.get_active_display_device(moninfo["Device"]) else: # This is wrong, but it's what other apps (and Windows itself) use. device = win32api.EnumDisplayDevices(moninfo["Device"], 0) devicekey = device.DeviceKey if mscms: return _wcs_set_display_profile(unicode(devicekey), profile_name) else: # TODO: Implement for XP return False def hexrepr(bytestring, mapping=None): hexrepr = "0x%s" % binascii.hexlify(bytestring).upper() ascii = safe_unicode(re.sub("[^\x20-\x7e]", "", bytestring)).encode("ASCII", "replace") if ascii == bytestring: hexrepr += " '%s'" % ascii if mapping: value = mapping.get(ascii) if value: hexrepr += " " + value return hexrepr def dateTimeNumber(binaryString): """ Byte Offset Content Encoded as... 0..1 number of the year (actual year, e.g. 1994) uInt16Number 2..3 number of the month (1-12) uInt16Number 4..5 number of the day of the month (1-31) uInt16Number 6..7 number of hours (0-23) uInt16Number 8..9 number of minutes (0-59) uInt16Number 10..11 number of seconds (0-59) uInt16Number """ Y, m, d, H, M, S = [uInt16Number(chunk) for chunk in (binaryString[:2], binaryString[2:4], binaryString[4:6], binaryString[6:8], binaryString[8:10], binaryString[10:12])] return datetime.datetime(*(Y, m, d, H, M, S)) def dateTimeNumber_tohex(dt): data = [uInt16Number_tohex(n) for n in dt.timetuple()[:6]] return "".join(data) def s15Fixed16Number(binaryString): return struct.unpack(">i", binaryString)[0] / 65536.0 def s15Fixed16Number_tohex(num): return struct.pack(">i", int(round(num * 65536))) def u16Fixed16Number(binaryString): return struct.unpack(">I", binaryString)[0] / 65536.0 def u16Fixed16Number_tohex(num): return struct.pack(">I", int(round(num * 65536)) & 0xFFFFFFFF) def u8Fixed8Number(binaryString): return struct.unpack(">H", binaryString)[0] / 256.0 def u8Fixed8Number_tohex(num): return struct.pack(">H", int(round(num * 256))) def uInt16Number(binaryString): return struct.unpack(">H", binaryString)[0] def uInt16Number_tohex(num): return struct.pack(">H", int(round(num))) def uInt32Number(binaryString): return struct.unpack(">I", binaryString)[0] def uInt32Number_tohex(num): return struct.pack(">I", int(round(num))) def uInt64Number(binaryString): return struct.unpack(">Q", binaryString)[0] def uInt64Number_tohex(num): return struct.pack(">Q", int(round(num))) def uInt8Number(binaryString): return struct.unpack(">H", "\0" + binaryString)[0] def uInt8Number_tohex(num): return struct.pack(">H", int(round(num)))[1] def videoCardGamma(tagData, tagSignature): reserved = uInt32Number(tagData[4:8]) tagType = uInt32Number(tagData[8:12]) if tagType == 0: # table return VideoCardGammaTableType(tagData, tagSignature) elif tagType == 1: # formula return VideoCardGammaFormulaType(tagData, tagSignature) class CRInterpolation(object): """ Catmull-Rom interpolation. Curve passes through the points exactly, with neighbouring points influencing curvature. points[] should be at least 3 points long. """ def __init__(self, points): self.points = points def __call__(self, pos): lbound = int(math.floor(pos) - 1) ubound = int(math.ceil(pos) + 1) t = pos % 1.0 if abs((lbound + 1) - pos) < 0.0001: # sitting on a datapoint, so just return that return self.points[lbound + 1] if lbound < 0: p = self.points[:ubound + 1] # extend to the left linearly while len(p) < 4: p.insert(0, p[0] - (p[1] - p[0])) else: p = self.points[lbound:ubound + 1] # extend to the right linearly while len(p) < 4: p.append(p[-1] - (p[-2] - p[-1])) t2 = t * t return 0.5 * ((2 * p[1]) + (-p[0] + p[2]) * t + ((2 * p[0]) - (5 * p[1]) + (4 * p[2]) - p[3]) * t2 + (-p[0] + (3 * p[1]) - (3 * p[2]) + p[3]) * (t2 * t)) class ADict(dict): """ Convenience class for dictionary key access via attributes. Instead of writing aodict[key], you can also write aodict.key """ def __init__(self, *args, **kwargs): dict.__init__(self, *args, **kwargs) def __getattr__(self, name): if name in self: return self[name] else: return self.__getattribute__(name) def __setattr__(self, name, value): self[name] = value class AODict(ADict, OrderedDict): def __init__(self, *args, **kwargs): OrderedDict.__init__(self, *args, **kwargs) def __setattr__(self, name, value): if name == "_keys": object.__setattr__(self, name, value) else: self[name] = value class ICCProfileTag(object): def __init__(self, tagData, tagSignature): self.tagData = tagData self.tagSignature = tagSignature def __setattr__(self, name, value): if not isinstance(self, dict) or name in ("_keys", "tagData", "tagSignature"): object.__setattr__(self, name, value) else: self[name] = value def __repr__(self): """ t.__repr__() <==> repr(t) """ if isinstance(self, OrderedDict): return OrderedDict.__repr__(self) elif isinstance(self, dict): return dict.__repr__(self) elif isinstance(self, UserString): return UserString.__repr__(self) elif isinstance(self, list): return list.__repr__(self) else: if not self: return "%s.%s()" % (self.__class__.__module__, self.__class__.__name__) return "%s.%s(%r)" % (self.__class__.__module__, self.__class__.__name__, self.tagData) class Text(ICCProfileTag, UserString, str): def __init__(self, seq): UserString.__init__(self, seq) def __unicode__(self): return unicode(self.data, fs_enc, errors="replace") class Colorant(object): def __init__(self, binaryString="\0" * 4): self._type = uInt32Number(binaryString) self._channels = [] def __getitem__(self, key): return self.__getattribute__(key) def __iter__(self): return iter(self.keys()) def __repr__(self): items = [] for key, value in (("type", self.type), ("description", self.description)): items.append("%s: %s" % (repr(key), repr(value))) channels = [] for xy in self.channels: channels.append("[%s]" % ", ".join([str(v) for v in xy])) items.append("'channels': [%s]" % ", ".join(channels)) return "{%s}" % ", ".join(items) def __setitem__(self, key, value): object.__setattr__(self, key, value) @Property def channels(): def fget(self): if not self._channels and self._type and self._type in colorants: return [list(xy) for xy in colorants[self._type]["channels"]] return self._channels def fset(self, channels): self._channels = channels return locals() @Property def description(): def fget(self): return colorants.get(self._type, colorants[0])["description"] def fset(self, value): pass return locals() def get(self, key, default=None): return getattr(self, key, default) def items(self): return zip(self.keys(), self.values()) def iteritems(self): return izip(self.keys(), self.itervalues()) iterkeys = __iter__ def itervalues(self): return imap(self.get, self.keys()) def keys(self): return ["type", "description", "channels"] def round(self, digits=4): colorant = self.__class__() colorant.type = self.type for xy in self.channels: colorant._channels.append([round(value, digits) for value in xy]) return colorant @Property def type(): def fget(self): return self._type def fset(self, value): if value and value != self._type and value in colorants: self._channels = [] self._type = value return locals() def update(self, *args, **kwargs): if len(args) > 1: raise TypeError("update expected at most 1 arguments, got %i" % len(args)) for iterable in args + tuple(kwargs.items()): if hasattr(iterable, "iteritems"): self.update(iterable.iteritems()) elif hasattr(iterable, "keys"): for key in iterable.keys(): self[key] = iterable[key] else: for key, val in iterable: self[key] = val def values(self): return map(self.get, self.keys()) class Geometry(ADict): def __init__(self, binaryString): self.type = uInt32Number(binaryString) self.description = geometry[self.type] class Illuminant(ADict): def __init__(self, binaryString): self.type = uInt32Number(binaryString) self.description = illuminants[self.type] class LUT16Type(ICCProfileTag): def __init__(self, tagData=None, tagSignature=None, profile=None): ICCProfileTag.__init__(self, tagData, tagSignature) self.profile = profile self._matrix = None self._input = None self._clut = None self._output = None self._i = (tagData and uInt8Number(tagData[8])) or 0 # Input channel count self._o = (tagData and uInt8Number(tagData[9])) or 0 # Output channel count self._g = (tagData and uInt8Number(tagData[10])) or 0 # cLUT grid res self._n = (tagData and uInt16Number(tagData[48:50])) or 0 # Input channel entries count self._m = (tagData and uInt16Number(tagData[50:52])) or 0 # Output channel entries count def apply_bpc(self, bp_out=(0, 0, 0), weight=False): pcs = self.profile and self.profile.connectionColorSpace if pcs == "Lab": bp = colormath.Lab2XYZ(*PCSLab_uInt16_to_dec(*self.clut[0][0])) wp = colormath.Lab2XYZ(*PCSLab_uInt16_to_dec(*self.clut[-1][-1])) elif not pcs or pcs == "XYZ": if not pcs: warnings.warn("LUT16Type.apply_bpc: PCS not specified, " "assuming XYZ", Warning) bp = [v / 65535.0 for v in self.clut[0][0]] wp = [v / 65535.0 for v in self.clut[-1][-1]] else: raise ValueError("LUT16Type.apply_bpc: Unsupported PCS %r" % pcs) if bp != list(bp_out): D50 = colormath.get_whitepoint("D50") for block in self.clut: for i, row in enumerate(block): if pcs == "Lab": X, Y, Z = colormath.Lab2XYZ(*PCSLab_uInt16_to_dec(*row)) else: X, Y, Z = [v / 65535.0 for v in row] XYZ = colormath.apply_bpc(X, Y, Z, bp, bp_out, wp, weight=weight) if pcs == "Lab": L, a, b = colormath.XYZ2Lab(*XYZ + [D50]) block[i] = [min(max(0, v), 65535) for v in PCSLab_dec_to_uInt16(L, a, b)] else: block[i] = [max(v, 0) * 65535.0 for v in XYZ] @Property def clut(): def fget(self): if self._clut is None: i, o, g, n = self._i, self._o, self._g, self._n tagData = self._tagData self._clut = [[[uInt16Number(tagData[52 + n * i * 2 + o * 2 * (g * x + y) + z * 2: 54 + n * i * 2 + o * 2 * (g * x + y) + z * 2]) for z in xrange(o)] for y in xrange(g)] for x in xrange(g ** i / g)] return self._clut def fset(self, value): self._clut = value return locals() def clut_writepng(self, stream_or_filename): """ Write the cLUT as PNG image organized in * sized squares, ordered vertically """ if len(self.clut[0][0]) != 3: raise NotImplementedError("clut_writepng: output channels != 3") imfile.write(self.clut, stream_or_filename) @property def clut_grid_steps(self): """ Return number of grid points per dimension. """ return self._g @Property def input(): def fget(self): if self._input is None: i, n = self._i, self._n tagData = self._tagData self._input = [[uInt16Number(tagData[52 + n * 2 * z + y * 2: 54 + n * 2 * z + y * 2]) for y in xrange(n)] for z in xrange(i)] return self._input def fset(self, value): self._input = value return locals() @property def input_channels_count(self): """ Return number of input channels. """ return self._i @property def input_entries_count(self): """ Return number of entries per input channel. """ return self._n def invert(self): """ Invert input and output tables. """ # Invert input/output 1d LUTs for channel in (self.input, self.output): for e, entries in enumerate(channel): lut = OrderedDict() maxv = len(entries) - 1.0 for i, entry in enumerate(entries): lut[entry / 65535.0 * maxv] = i / maxv * 65535 xp = lut.keys() fp = lut.values() for i in xrange(len(entries)): if not i in lut: lut[i] = colormath.interp(i, xp, fp) lut.sort() channel[e] = lut.values() @Property def matrix(): def fget(self): if self._matrix is None: tagData = self._tagData return colormath.Matrix3x3([(s15Fixed16Number(tagData[12:16]), s15Fixed16Number(tagData[16:20]), s15Fixed16Number(tagData[20:24])), (s15Fixed16Number(tagData[24:28]), s15Fixed16Number(tagData[28:32]), s15Fixed16Number(tagData[32:36])), (s15Fixed16Number(tagData[36:40]), s15Fixed16Number(tagData[40:44]), s15Fixed16Number(tagData[44:48]))]) return self._matrix def fset(self, value): self._matrix = value return locals() @Property def output(): def fget(self): if self._output is None: i, o, g, n, m = self._i, self._o,self._g, self._n, self._m tagData = self._tagData self._output = [[uInt16Number(tagData[52 + n * i * 2 + m * 2 * z + y * 2 + g ** i * o * 2: 54 + n * i * 2 + m * 2 * z + y * 2 + g ** i * o * 2]) for y in xrange(m)] for z in xrange(o)] return self._output def fset(self, value): self._output = value return locals() @property def output_channels_count(self): """ Return number of output channels. """ return self._o @property def output_entries_count(self): """ Return number of entries per output channel. """ return self._m @Property def tagData(): doc = """ Return raw tag data. """ def fget(self): if (self._matrix, self._input, self._clut, self._output) == (None, ) * 4: return self._tagData tagData = ["mft2", "\0" * 4, uInt8Number_tohex(len(self.input)), uInt8Number_tohex(len(self.output)), uInt8Number_tohex(len(self.clut and self.clut[0])), "\0", s15Fixed16Number_tohex(self.matrix[0][0]), s15Fixed16Number_tohex(self.matrix[0][1]), s15Fixed16Number_tohex(self.matrix[0][2]), s15Fixed16Number_tohex(self.matrix[1][0]), s15Fixed16Number_tohex(self.matrix[1][1]), s15Fixed16Number_tohex(self.matrix[1][2]), s15Fixed16Number_tohex(self.matrix[2][0]), s15Fixed16Number_tohex(self.matrix[2][1]), s15Fixed16Number_tohex(self.matrix[2][2]), uInt16Number_tohex(len(self.input and self.input[0])), uInt16Number_tohex(len(self.output and self.output[0]))] for entries in self.input: tagData.extend(uInt16Number_tohex(v) for v in entries) for block in self.clut: for entries in block: tagData.extend(uInt16Number_tohex(v) for v in entries) for entries in self.output: tagData.extend(uInt16Number_tohex(v) for v in entries) return "".join(tagData) def fset(self, tagData): self._tagData = tagData return locals() class Observer(ADict): def __init__(self, binaryString): self.type = uInt32Number(binaryString) self.description = observers[self.type] class ChromaticityType(ICCProfileTag, Colorant): def __init__(self, tagData=None, tagSignature=None): ICCProfileTag.__init__(self, tagData, tagSignature) if not tagData: Colorant.__init__(self, uInt32Number_tohex(1)) return deviceChannelsCount = uInt16Number(tagData[8:10]) Colorant.__init__(self, uInt32Number_tohex(uInt16Number(tagData[10:12]))) channels = tagData[12:] for count in xrange(deviceChannelsCount): self._channels.append([u16Fixed16Number(channels[:4]), u16Fixed16Number(channels[4:8])]) channels = channels[8:] __repr__ = Colorant.__repr__ @Property def tagData(): doc = """ Return raw tag data. """ def fget(self): tagData = ["chrm", "\0" * 4, uInt16Number_tohex(len(self.channels))] tagData.append(uInt16Number_tohex(self.type)) for channel in self.channels: for xy in channel: tagData.append(u16Fixed16Number_tohex(xy)) return "".join(tagData) def fset(self, tagData): pass return locals() class ColorantTableType(ICCProfileTag, AODict): def __init__(self, tagData=None, tagSignature=None, pcs=None): ICCProfileTag.__init__(self, tagData, tagSignature) AODict.__init__(self) if not tagData: return colorantCount = uInt32Number(tagData[8:12]) data = tagData[12:] for count in xrange(colorantCount): pcsvalues = [uInt16Number(data[32:34]), uInt16Number(data[34:36]), uInt16Number(data[36:38])] for i, pcsvalue in enumerate(pcsvalues): if pcs in ("Lab", "RGB", "CMYK", "YCbr"): keys = ["L", "a", "b"] if i == 0: # L* range 0..100 + (25500 / 65280.0) pcsvalues[i] = pcsvalue / 65536.0 * 256 / 255.0 * 100 else: # a, b range -128..127 + (255 / 256.0) pcsvalues[i] = -128 + (pcsvalue / 65536.0 * 256) elif pcs == "XYZ": # X, Y, Z range 0..100 + (32767 / 32768.0) keys = ["X", "Y", "Z"] pcsvalues[i] = pcsvalue / 32768.0 * 100 else: safe_print("Warning: Non-standard profile connection " "space '%s'" % pcs) return end = data[:32].find("\0") if end < 0: end = 32 name = data[:end] self[name] = AODict(zip(keys, pcsvalues)) data = data[38:] class CurveType(ICCProfileTag, list): def __init__(self, tagData=None, tagSignature=None, profile=None): ICCProfileTag.__init__(self, tagData, tagSignature) self.profile = profile self._transfer_function = {} if not tagData: return curveEntriesCount = uInt32Number(tagData[8:12]) curveEntries = tagData[12:] if curveEntriesCount == 1: # Gamma self.append(u8Fixed8Number(curveEntries[:2])) elif curveEntriesCount: # Curve for count in xrange(curveEntriesCount): self.append(uInt16Number(curveEntries[:2])) curveEntries = curveEntries[2:] else: # Identity self.append(1.0) def __delitem__(self, y): list.__delitem__(self, y) self._transfer_function = {} def __delslice__(self, i, j): list.__delslice__(self, i, j) self._transfer_function = {} def __iadd__(self, y): list.__iadd__(self, y) self._transfer_function = {} def __imul__(self, y): list.__imul__(self, y) self._transfer_function = {} def __setitem__(self, i, y): list.__setitem__(self, i, y) self._transfer_function = {} def __setslice__(self, i, j, y): list.__setslice__(self, i, j, y) self._transfer_function = {} def append(self, object): list.append(self, object) self._transfer_function = {} def apply_bpc(self, black_Y_out=0, weight=False): if len(self) < 2: return D50_xyY = colormath.XYZ2xyY(*colormath.get_whitepoint("D50")) bp_in = colormath.xyY2XYZ(D50_xyY[0], D50_xyY[1], self[0] / 65535.0) bp_out = colormath.xyY2XYZ(D50_xyY[0], D50_xyY[1], black_Y_out) wp_out = colormath.xyY2XYZ(D50_xyY[0], D50_xyY[1], self[-1] / 65535.0) for i, v in enumerate(self): X, Y, Z = colormath.xyY2XYZ(D50_xyY[0], D50_xyY[1], v / 65535.0) self[i] = colormath.apply_bpc(X, Y, Z, bp_in, bp_out, wp_out, weight)[1] * 65535.0 def extend(self, iterable): list.extend(self, iterable) self._transfer_function = {} def get_gamma(self, use_vmin_vmax=False, average=True, least_squares=False, slice=(0.01, 0.99)): """ Return average or least squares gamma or a list of gamma values """ if len(self) <= 1: if len(self): values = self else: # Identity values = [1.0] if average or least_squares: return values[0] return [values[0]] else: start = slice[0] * 100 end = slice[1] * 100 values = [] for i, y in enumerate(self): n = colormath.XYZ2Lab(0, y / 65535.0 * 100, 0)[0] if n >= start and n <= end: values.append((i / (len(self) - 1.0) * 65535.0, y)) vmin = 0 vmax = 65535.0 if use_vmin_vmax: if len(self) > 2: vmin = self[0] vmax = self[-1] return colormath.get_gamma(values, 65535.0, vmin, vmax, average, least_squares) def get_transfer_function(self, best=True, slice=(0.05, 0.95)): """ Return transfer function name, exponent and match percentage """ if len(self) == 1: # Gamma return ("Gamma %.2f" % self[0], self[0]), 1.0 if not len(self): # Identity return ("Gamma 1.0", 1.0), 1.0 transfer_function = self._transfer_function.get((best, slice)) if transfer_function: return transfer_function trc = CurveType() match = {} vmin = self[0] vmax = self[-1] gamma = colormath.get_gamma([((len(self) / 2 - 1) / (len(self) - 1.0) * 65535.0, self[len(self) / 2 - 1])], 65535.0, vmin, vmax) for name, exp in (("Rec. 709", -709), ("Rec. 1886", -1886), ("SMPTE 240M", -240), ("SMPTE 2084", -2084), ("DICOM", -1023), ("L*", -3.0), ("sRGB", -2.4), ("Gamma %.2f" % gamma, gamma)): if name in ("DICOM", "Rec. 1886", "SMPTE 2084"): if self.profile and isinstance(self.profile.tags.get("lumi"), XYZType): white_cdm2 = self.profile.tags.lumi.Y else: white_cdm2 = 100.0 black_Y = vmin / 65535.0 black_cdm2 = black_Y * white_cdm2 try: if name == "DICOM": trc.set_dicom_trc(black_cdm2, white_cdm2, size=len(self)) elif name == "Rec. 1886": trc.set_bt1886_trc(black_Y, size=len(self)) elif name == "SMPTE 2084": trc.set_smpte2084_trc(black_cdm2, white_cdm2, size=len(self)) except ValueError: continue else: trc.set_trc(exp, len(self), vmin, vmax) if self == trc: match[(name, exp)] = 1.0 else: match[(name, exp)] = 0.0 count = 0 start = slice[0] * len(self) end = slice[1] * len(self) for i, n in enumerate(self): ##n = colormath.XYZ2Lab(0, n / 65535.0 * 100, 0)[0] if i >= start and i <= end: n = colormath.get_gamma([(i / (len(self) - 1.0) * 65535.0, n)], 65535.0, vmin, vmax, False) if n: n = n[0] ##n2 = colormath.XYZ2Lab(0, trc[i] / 65535.0 * 100, 0)[0] n2 = colormath.get_gamma([(i / (len(self) - 1.0) * 65535.0, trc[i])], 65535.0, vmin, vmax, False) if n2 and n2[0]: n2 = n2[0] match[(name, exp)] += 1 - (max(n, n2) - min(n, n2)) / n2 count += 1 if count: match[(name, exp)] /= count if not best: self._transfer_function[(best, slice)] = match return match match, (name, exp) = sorted(zip(match.values(), match.keys()))[-1] self._transfer_function[(best, slice)] = (name, exp), match return (name, exp), match def insert(self, object): list.insert(self, object) self._transfer_function = {} def pop(self, index): list.pop(self, index) self._transfer_function = {} def remove(self, value): list.remove(self, value) self._transfer_function = {} def reverse(self): list.reverse(self) self._transfer_function = {} def set_bt1886_trc(self, black_Y=0, outoffset=0.0, gamma=2.4, gamma_type="B", size=None): """ Set the response to the BT. 1886 curve This response is special in that it depends on the actual black level of the display. """ if gamma_type in ("b", "g"): # Get technical gamma needed to achieve effective gamma gamma = colormath.xicc_tech_gamma(gamma, black_Y, outoffset) rXYZ = colormath.RGB2XYZ(1.0, 0, 0) gXYZ = colormath.RGB2XYZ(0, 1.0, 0) bXYZ = colormath.RGB2XYZ(0, 0, 1.0) mtx = colormath.Matrix3x3([[rXYZ[0], gXYZ[0], bXYZ[0]], [rXYZ[1], gXYZ[1], bXYZ[1]], [rXYZ[2], gXYZ[2], bXYZ[2]]]) wXYZ = colormath.RGB2XYZ(1.0, 1.0, 1.0) x, y = colormath.XYZ2xyY(*wXYZ)[:2] XYZbp = colormath.xyY2XYZ(x, y, black_Y) bt1886 = colormath.BT1886(mtx, XYZbp, outoffset, gamma) self.set_trc(-709, size) for i, v in enumerate(self): X, Y, Z = colormath.xyY2XYZ(x, y, v / 65535.0) self[i] = bt1886.apply(X, Y, Z)[1] * 65535.0 def set_dicom_trc(self, black_cdm2=.05, white_cdm2=100, size=None): """ Set the response to the DICOM Grayscale Standard Display Function This response is special in that it depends on the actual black and white level of the display. """ # See http://medical.nema.org/Dicom/2011/11_14pu.pdf # Luminance levels depend on the start level of 0.05 cd/m2 # and end level of 4000 cd/m2 if black_cdm2 < .05 or black_cdm2 >= white_cdm2: raise ValueError("The black level of %f cd/m2 is out of range " "for DICOM. Valid range begins at 0.05 cd/m2." % black_cdm2) if white_cdm2 > 4000 or white_cdm2 <= black_cdm2: raise ValueError("The white level of %f cd/m2 is out of range " "for DICOM. Valid range is up to 4000 cd/m2." % white_cdm2) black_jndi = colormath.DICOM(black_cdm2, True) white_jndi = colormath.DICOM(white_cdm2, True) white_dicomY = math.pow(10, colormath.DICOM(white_jndi)) if not size: size = len(self) if size < 2: size = 1024 self[:] = [] for i in xrange(size): v = math.pow(10, colormath.DICOM(black_jndi + (float(i) / (size - 1)) * (white_jndi - black_jndi))) / white_dicomY self.append(v * 65535) def set_smpte2084_trc(self, black_cdm2=.05, white_cdm2=100, size=None): """ Set the response to the SMPTE 2084 perceptual quantizer (PQ) function This response is special in that it depends on the actual black and white level of the display. """ # See https://www.smpte.org/sites/default/files/2014-05-06-EOTF-Miller-1-2-handout.pdf # Luminance levels depend on the end level of 10000 cd/m2 if black_cdm2 < 0 or black_cdm2 >= white_cdm2: raise ValueError("The black level of %f cd/m2 is out of range " "for SMPTE 2084. Valid range begins at 0 cd/m2." % black_cdm2) if white_cdm2 > 10000 or white_cdm2 <= black_cdm2: raise ValueError("The white level of %f cd/m2 is out of range " "for SMPTE 2084. Valid range is up to 10000 cd/m2." % white_cdm2) mini = colormath.specialpow(black_cdm2 / 10000.0, 1.0 / -2084) maxi = colormath.specialpow(white_cdm2 / 10000.0, 1.0 / -2084) white_smpte2084Y = colormath.specialpow(maxi, -2084) if not size: size = len(self) if size < 2: size = 1024 self[:] = [] for i in xrange(size): n = i / (size - 1.0) v = colormath.specialpow(mini + n * (maxi - mini), -2084) self.append(v / white_smpte2084Y * 65535) def set_trc(self, power=2.2, size=None, vmin=0, vmax=65535): """ Set the response to a certain function. Positive power, or -2.4 = sRGB, -3.0 = L*, -240 = SMPTE 240M, -601 = Rec. 601, -709 = Rec. 709 (Rec. 601 and 709 transfer functions are identical) """ if not size: size = len(self) or 1024 if size == 1: if power >= 0.0 and not vmin: self[:] = [power] return else: size = 1024 self[:] = [] for i in xrange(0, size): self.append(vmin + colormath.specialpow(float(i) / (size - 1), power) * (vmax - vmin)) def sort(self, cmp=None, key=None, reverse=False): list.sort(self, cmp, key, reverse) self._transfer_function = {} @Property def tagData(): doc = """ Return raw tag data. """ def fget(self): if len(self) == 1 and self[0] == 1.0: # Identity curveEntriesCount = 0 else: curveEntriesCount = len(self) tagData = ["curv", "\0" * 4, uInt32Number_tohex(curveEntriesCount)] if curveEntriesCount == 1: # Gamma tagData.append(u8Fixed8Number_tohex(self[0])) elif curveEntriesCount: # Curve for curveEntry in self: tagData.append(uInt16Number_tohex(curveEntry)) return "".join(tagData) def fset(self, tagData): pass return locals() class DateTimeType(ICCProfileTag, datetime.datetime): def __new__(cls, tagData, tagSignature): dt = dateTimeNumber(tagData[8:20]) return datetime.datetime.__new__(cls, dt.year, dt.month, dt.day, dt.hour, dt.minute, dt.second) class DictList(list): def __getitem__(self, key): for item in self: if item[0] == key: return item raise KeyError(key) def __setitem__(self, key, value): if not isinstance(value, DictListItem): self.append(DictListItem((key, value))) class DictListItem(list): def __iadd__(self, value): self[-1] += value return self class DictType(ICCProfileTag, AODict): """ ICC dictType Tag Implements all features of 'Dictionary Type and Metadata TAG Definition' (ICC spec revision 2010-02-25), including shared data (the latter will only be effective for mutable types, ie. MultiLocalizedUnicodeType) Examples: tag[key] Returns the (non-localized) value tag.getname(key, locale='en_US') Returns the localized name if present tag.getvalue(key, locale='en_US') Returns the localized value if present tag[key] = value Sets the (non-localized) value """ def __init__(self, tagData=None, tagSignature=None): ICCProfileTag.__init__(self, tagData, tagSignature) AODict.__init__(self) if not tagData: return numrecords = uInt32Number(tagData[8:12]) recordlen = uInt32Number(tagData[12:16]) if recordlen not in (16, 24, 32): safe_print("Error (non-critical): '%s' invalid record length " "(expected 16, 24 or 32, got %s)" % (tagData[:4], recordlen)) return elements = {} for n in range(0, numrecords): record = tagData[16 + n * recordlen:16 + (n + 1) * recordlen] if len(record) < recordlen: safe_print("Error (non-critical): '%s' record %s too short " "(expected %s bytes, got %s bytes)" % (tagData[:4], n, recordlen, len(record))) break for key, offsetpos in (("name", 0), ("value", 8), ("display_name", 16), ("display_value", 24)): if (offsetpos in (0, 8) or recordlen == offsetpos + 8 or recordlen == offsetpos + 16): # Required: # Bytes 0..3, 4..7: Name offset and size # Bytes 8..11, 12..15: Value offset and size # Optional: # Bytes 16..23, 24..23: Display name offset and size # Bytes 24..27, 28..31: Display value offset and size offset = uInt32Number(record[offsetpos:offsetpos + 4]) size = uInt32Number(record[offsetpos + 4:offsetpos + 8]) if offset > 0: if (offset, size) in elements: # Use existing element if same offset and size # This will really only make a difference for # mutable types ie. MultiLocalizedUnicodeType data = elements[(offset, size)] else: data = tagData[offset:offset + size] try: if key.startswith("display_"): data = MultiLocalizedUnicodeType(data, "mluc") else: data = data.decode("UTF-16-BE", "replace").rstrip("\0") except Exception, exception: safe_print("Error (non-critical): could not " "decode '%s', offset %s, length %s" % (tagData[:4], offset, size)) # Remember element by offset and size elements[(offset, size)] = data if key == "name": name = data self[name] = "" else: self.get(name)[key] = data def __getitem__(self, name): return self.get(name).value def __setitem__(self, name, value): AODict.__setitem__(self, name, ADict(value=value)) @Property def tagData(): doc = """ Return raw tag data. """ def fget(self): numrecords = len(self) recordlen = 16 keys = ("name", "value") for value in self.itervalues(): if "display_value" in value: recordlen = 32 break elif "display_name" in value: recordlen = 24 if recordlen > 16: keys += ("display_name", ) if recordlen > 24: keys += ("display_value", ) tagData = ["dict", "\0" * 4, uInt32Number_tohex(numrecords), uInt32Number_tohex(recordlen)] storage_offset = 16 + numrecords * recordlen storage = [] elements = [] offsets = [] for item in self.iteritems(): for key in keys: if key == "name": element = item[0] else: element = item[1].get(key) if element is None: offset = 0 size = 0 else: if element in elements: # Use existing offset and size if same element offset, size = offsets[elements.index(element)] else: offset = storage_offset + len("".join(storage)) if isinstance(element, MultiLocalizedUnicodeType): data = element.tagData else: data = unicode(element).encode("UTF-16-BE") size = len(data) if isinstance(element, MultiLocalizedUnicodeType): # Remember element, offset and size elements.append(element) offsets.append((offset, size)) # Pad all data with binary zeros so it lies on # 4-byte boundaries padding = int(math.ceil(size / 4.0)) * 4 - size data += "\0" * padding storage.append(data) tagData.append(uInt32Number_tohex(offset)) tagData.append(uInt32Number_tohex(size)) tagData.extend(storage) return "".join(tagData) def fset(self, tagData): pass return locals() def getname(self, name, default=None, locale="en_US"): """ Convenience function to get (localized) names """ item = self.get(name, default) if item is default: return default if locale and "display_name" in item: return item.display_name.get_localized_string(*locale.split("_")) else: return name def getvalue(self, name, default=None, locale="en_US"): """ Convenience function to get (localized) values """ item = self.get(name, default) if item is default: return default if locale and "display_value" in item: return item.display_value.get_localized_string(*locale.split("_")) else: return item.value def setitem(self, name, value, display_name=None, display_value=None): """ Convenience function to set items display_name and display_value (if given) should be dict types with country -> language -> string mappings, e.g.: {"en": {"US": u"localized string"}, "de": {"DE": u"localized string", "CH": u"localized string"}} """ self[name] = value item = self.get(name) if display_name: item.display_name = MultiLocalizedUnicodeType() item.display_name.update(display_name) if display_value: item.display_value = MultiLocalizedUnicodeType() item.display_value.update(display_value) def to_json(self, encoding="UTF-8", errors="replace", locale="en_US"): """ Return a JSON representation Display names/values are used if present. """ json = [] for name in self: value = self.getvalue(name, None, locale) name = self.getname(name, None, locale) #try: #value = str(int(value)) #except ValueError: #try: #value = str(float(value)) #except ValueError: value = '"%s"' % repr(unicode(value))[2:-1].replace('"', '\\"') json.append('"%s": %s' % tuple([re.sub(r"\\x([0-9a-f]{2})", "\\u00\\1", item) for item in [repr(unicode(name))[2:-1], value]])) return "{%s}" % ",\n".join(json) class MakeAndModelType(ICCProfileTag, ADict): def __init__(self, tagData, tagSignature): ICCProfileTag.__init__(self, tagData, tagSignature) self.update({"manufacturer": tagData[10:12], "model": tagData[14:16]}) class MeasurementType(ICCProfileTag, ADict): def __init__(self, tagData, tagSignature): ICCProfileTag.__init__(self, tagData, tagSignature) self.update({ "observer": Observer(tagData[8:12]), "backing": XYZNumber(tagData[12:24]), "geometry": Geometry(tagData[24:28]), "flare": u16Fixed16Number(tagData[28:32]), "illuminantType": Illuminant(tagData[32:36]) }) class MultiLocalizedUnicodeType(ICCProfileTag, AODict): # ICC v4 def __init__(self, tagData=None, tagSignature=None): ICCProfileTag.__init__(self, tagData, tagSignature) AODict.__init__(self) if not tagData: return recordsCount = uInt32Number(tagData[8:12]) recordSize = uInt32Number(tagData[12:16]) # 12 if recordSize != 12: safe_print("Warning (non-critical): '%s' invalid record length " "(expected 12, got %s)" % (tagData[:4], recordSize)) if recordSize < 12: recordSize = 12 records = tagData[16:16 + recordSize * recordsCount] for count in xrange(recordsCount): record = records[:recordSize] if len(record) < 12: continue recordLanguageCode = record[:2] recordCountryCode = record[2:4] recordLength = uInt32Number(record[4:8]) recordOffset = uInt32Number(record[8:12]) self.add_localized_string(recordLanguageCode, recordCountryCode, unicode(tagData[recordOffset:recordOffset + recordLength], "utf-16-be", "replace")) records = records[recordSize:] def __str__(self): return unicode(self).encode(sys.getdefaultencoding()) def __unicode__(self): """ Return tag as string. """ # TODO: Needs some work re locales # (currently if en-UK or en-US is not found, simply the first entry # is returned) if "en" in self: for countryCode in ("UK", "US"): if countryCode in self["en"]: return self["en"][countryCode] elif len(self): return self.values()[0].values()[0] else: return u"" def add_localized_string(self, languagecode, countrycode, localized_string): """ Convenience function for adding localized strings """ if languagecode not in self: self[languagecode] = AODict() self[languagecode][countrycode] = localized_string.strip("\0") def get_localized_string(self, languagecode="en", countrycode="US"): """ Convenience function for retrieving localized strings Falls back to first locale available if the requested one isn't """ try: return self[languagecode][countrycode] except KeyError: return unicode(self) @Property def tagData(): doc = """ Return raw tag data. """ def fget(self): tagData = ["mluc", "\0" * 4] recordsCount = 0 for languageCode in self: for countryCode in self[languageCode]: recordsCount += 1 tagData.append(uInt32Number_tohex(recordsCount)) recordSize = 12 tagData.append(uInt32Number_tohex(recordSize)) storage_offset = 16 + recordSize * recordsCount storage = [] offsets = [] for languageCode in self: for countryCode in self[languageCode]: tagData.append(languageCode + countryCode) data = self[languageCode][countryCode].encode("UTF-16-BE") if data in storage: offset, recordLength = offsets[storage.index(data)] else: recordLength = len(data) offset = len("".join(storage)) offsets.append((offset, recordLength)) storage.append(data) tagData.append(uInt32Number_tohex(recordLength)) tagData.append(uInt32Number_tohex(storage_offset + offset)) tagData.append("".join(storage)) return "".join(tagData) def fset(self, tagData): pass return locals() class s15Fixed16ArrayType(ICCProfileTag, list): def __init__(self, tagData=None, tagSignature=None): ICCProfileTag.__init__(self, tagData, tagSignature) if tagData: data = tagData[8:] while data: self.append(s15Fixed16Number(data[0:4])) data = data[4:] @Property def tagData(): doc = """ Return raw tag data. """ def fget(self): tagData = ["sf32", "\0" * 4] for value in self: tagData.append(s15Fixed16Number_tohex(value)) return "".join(tagData) def fset(self, tagData): pass return locals() def SignatureType(tagData, tagSignature): tag = Text(tagData[8:12].rstrip("\0")) tag.tagData = tagData tag.tagSignature = tagSignature return tag class TextDescriptionType(ICCProfileTag, ADict): # ICC v2 def __init__(self, tagData=None, tagSignature=None): ICCProfileTag.__init__(self, tagData, tagSignature) self.ASCII = "" if not tagData: return ASCIIDescriptionLength = uInt32Number(tagData[8:12]) if ASCIIDescriptionLength: ASCIIDescription = tagData[12:12 + ASCIIDescriptionLength].strip("\0\n\r ") if ASCIIDescription: self.ASCII = ASCIIDescription unicodeOffset = 12 + ASCIIDescriptionLength self.unicodeLanguageCode = uInt32Number( tagData[unicodeOffset:unicodeOffset + 4]) unicodeDescriptionLength = uInt32Number(tagData[unicodeOffset + 4:unicodeOffset + 8]) if unicodeDescriptionLength: if unicodeOffset + 8 + unicodeDescriptionLength * 2 > len(tagData): # Damn you MS. The Unicode character count should be the number of # double-byte characters (including trailing unicode NUL), not the # number of bytes as in the profiles created by Vista and later safe_print("Warning (non-critical): '%s' Unicode part end points " "past the tag data, assuming number of bytes instead " "of number of characters for length" % tagData[:4]) unicodeDescriptionLength /= 2 if tagData[unicodeOffset + 8 + unicodeDescriptionLength:unicodeOffset + 8 + unicodeDescriptionLength + 2] == "\0\0": safe_print("Warning (non-critical): '%s' Unicode part " "seems to be a single-byte string (double-byte " "string expected)" % tagData[:4]) charBytes = 1 # fix for fubar'd desc else: charBytes = 2 unicodeDescription = tagData[unicodeOffset + 8:unicodeOffset + 8 + (unicodeDescriptionLength) * charBytes] try: if charBytes == 1: unicodeDescription = unicode(unicodeDescription, errors="replace") else: if unicodeDescription[:2] == "\xfe\xff": # UTF-16 Big Endian if debug: safe_print("UTF-16 Big endian") unicodeDescription = unicodeDescription[2:] if len(unicodeDescription.split(" ")) == \ unicodeDescriptionLength - 1: safe_print("Warning (non-critical): '%s' " "Unicode part starts with UTF-16 big " "endian BOM, but actual contents seem " "to be UTF-16 little endian" % tagData[:4]) # fix fubar'd desc unicodeDescription = unicode( "\0".join(unicodeDescription.split(" ")), "utf-16-le", errors="replace") else: unicodeDescription = unicode(unicodeDescription, "utf-16-be", errors="replace") elif unicodeDescription[:2] == "\xff\xfe": # UTF-16 Little Endian if debug: safe_print("UTF-16 Little endian") unicodeDescription = unicodeDescription[2:] if unicodeDescription[0] == "\0": safe_print("Warning (non-critical): '%s' " "Unicode part starts with UTF-16 " "little endian BOM, but actual " "contents seem to be UTF-16 big " "endian" % tagData[:4]) # fix fubar'd desc unicodeDescription = unicode(unicodeDescription, "utf-16-be", errors="replace") else: unicodeDescription = unicode(unicodeDescription, "utf-16-le", errors="replace") else: if debug: safe_print("ASSUMED UTF-16 Big Endian") unicodeDescription = unicode(unicodeDescription, "utf-16-be", errors="replace") unicodeDescription = unicodeDescription.strip("\0\n\r ") if unicodeDescription: if unicodeDescription.find("\0") < 0: self.Unicode = unicodeDescription else: safe_print("Error (non-critical): could not decode " "'%s' Unicode part - null byte(s) " "encountered" % tagData[:4]) except UnicodeDecodeError: safe_print("UnicodeDecodeError (non-critical): could not " "decode '%s' Unicode part" % tagData[:4]) else: charBytes = 1 macOffset = unicodeOffset + 8 + unicodeDescriptionLength * charBytes self.macScriptCode = 0 if len(tagData) > macOffset + 2: self.macScriptCode = uInt16Number(tagData[macOffset:macOffset + 2]) macDescriptionLength = ord(tagData[macOffset + 2]) if macDescriptionLength: try: macDescription = unicode(tagData[macOffset + 3:macOffset + 3 + macDescriptionLength], "mac-" + encodings["mac"][self.macScriptCode], errors="replace").strip("\0\n\r ") if macDescription: self.Macintosh = macDescription except KeyError: safe_print("KeyError (non-critical): could not " "decode '%s' Macintosh part (unsupported " "encoding %s)" % (tagData[:4], self.macScriptCode)) except LookupError: safe_print("LookupError (non-critical): could not " "decode '%s' Macintosh part (unsupported " "encoding '%s')" % (tagData[:4], encodings["mac"][self.macScriptCode])) except UnicodeDecodeError: safe_print("UnicodeDecodeError (non-critical): could not " "decode '%s' Macintosh part" % tagData[:4]) @Property def tagData(): doc = """ Return raw tag data. """ def fget(self): tagData = ["desc", "\0" * 4, uInt32Number_tohex(len(self.ASCII) + 1), # count of ASCII chars + 1 safe_unicode(self.ASCII).encode("ASCII", "replace") + "\0", # ASCII desc, \0 terminated uInt32Number_tohex(self.get("unicodeLanguageCode", 0))] if "Unicode" in self: tagData.extend([uInt32Number_tohex(len(self.Unicode) + 2), # count of Unicode chars + 2 (UTF-16-BE BOM + trailing UTF-16 NUL, 1 char = 2 byte) "\xfe\xff" + self.Unicode.encode("utf-16-be", "replace") + "\0\0"]) # Unicode desc, \0\0 terminated else: tagData.append(uInt32Number_tohex(0)) # Unicode desc length = 0 tagData.append(uInt16Number_tohex(self.get("macScriptCode", 0))) if "Macintosh" in self: macDescription = self.Macintosh[:66] tagData.extend([uInt8Number_tohex(len(macDescription) + 1), # count of Macintosh chars + 1 macDescription.encode("mac-" + encodings["mac"][self.get("macScriptCode", 0)], "replace") + ("\0" * (67 - len(macDescription)))]) else: tagData.extend(["\0", # Mac desc length = 0 "\0" * 67]) return "".join(tagData) def fset(self, tagData): pass return locals() def __str__(self): return unicode(self).encode(sys.getdefaultencoding()) def __unicode__(self): if not "Unicode" in self and len(safe_unicode(self.ASCII)) < 67: # Do not use Macintosh description if ASCII length >= 67 localizedTypes = ("Macintosh", "ASCII") else: localizedTypes = ("Unicode", "ASCII") for localizedType in localizedTypes: if localizedType in self: value = self[localizedType] if not isinstance(value, unicode): # Even ASCII description may contain non-ASCII chars, so # assume system encoding and convert to unicode, replacing # unknown chars value = safe_unicode(value) return value def TextType(tagData, tagSignature): tag = Text(tagData[8:].rstrip("\0")) tag.tagData = tagData tag.tagSignature = tagSignature return tag class VideoCardGammaType(ICCProfileTag, ADict): # Private tag # http://developer.apple.com/documentation/GraphicsImaging/Reference/ColorSync_Manager/Reference/reference.html#//apple_ref/doc/uid/TP30000259-CH3g-C001473 def __init__(self, tagData, tagSignature): ICCProfileTag.__init__(self, tagData, tagSignature) def is_linear(self, r=True, g=True, b=True): r_points, g_points, b_points, linear_points = self.get_values() if ((r and g and b and r_points == g_points == b_points) or (r and g and r_points == g_points) or not (g or b)): points = r_points elif ((r and b and r_points == b_points) or (g and b and g_points == b_points) or not (r or g)): points = b_points elif g: points = g_points return points == linear_points def get_unique_values(self, r=True, g=True, b=True): r_points, g_points, b_points, linear_points = self.get_values() r_unique = set(round(y) for x, y in r_points) g_unique = set(round(y) for x, y in g_points) b_unique = set(round(y) for x, y in b_points) return r_unique, g_unique, b_unique def get_values(self, r=True, g=True, b=True): r_points = [] g_points = [] b_points = [] linear_points = [] vcgt = self if "data" in vcgt: # table data = list(vcgt['data']) while len(data) < 3: data.append(data[0]) irange = range(0, vcgt['entryCount']) vmax = math.pow(256, vcgt['entrySize']) - 1 for i in irange: j = i * (255.0 / (vcgt['entryCount'] - 1)) linear_points.append([j, int(round(i / float(vcgt['entryCount'] - 1) * 65535))]) if r: n = int(round(float(data[0][i]) / vmax * 65535)) r_points.append([j, n]) if g: n = int(round(float(data[1][i]) / vmax * 65535)) g_points.append([j, n]) if b: n = int(round(float(data[2][i]) / vmax * 65535)) b_points.append([j, n]) else: # formula irange = range(0, 256) step = 100.0 / 255.0 for i in irange: linear_points.append([i, i / 255.0 * 65535]) if r: vmin = vcgt["redMin"] * 65535 v = math.pow(step * i / 100.0, vcgt["redGamma"]) vmax = vcgt["redMax"] * 65535 r_points.append([i, int(round(vmin + v * (vmax - vmin)))]) if g: vmin = vcgt["greenMin"] * 65535 v = math.pow(step * i / 100.0, vcgt["greenGamma"]) vmax = vcgt["greenMax"] * 65535 g_points.append([i, int(round(vmin + v * (vmax - vmin)))]) if b: vmin = vcgt["blueMin"] * 65535 v = math.pow(step * i / 100.0, vcgt["blueGamma"]) vmax = vcgt["blueMax"] * 65535 b_points.append([i, int(round(vmin + v * (vmax - vmin)))]) return r_points, g_points, b_points, linear_points def printNormalizedValues(self, amount=None, digits=12): """ Normalizes and prints all values in the vcgt (range of 0.0...1.0). For a 256-entry table with linear values from 0 to 65535: # REF C1 C2 C3 001 0.000000000000 0.000000000000 0.000000000000 0.000000000000 002 0.003921568627 0.003921568627 0.003921568627 0.003921568627 003 0.007843137255 0.007843137255 0.007843137255 0.007843137255 ... You can also specify the amount of values to print (where a value lesser than the entry count will leave out intermediate values) and the number of digits. """ if amount is None: if hasattr(self, 'entryCount'): amount = self.entryCount else: amount = 256 # common value values = self.getNormalizedValues(amount) entryCount = len(values) channels = len(values[0]) header = ['REF'] for k in xrange(channels): header.append('C' + str(k + 1)) header = [title.ljust(digits + 2) for title in header] safe_print("#".ljust(len(str(amount)) + 1) + " ".join(header)) for i, value in enumerate(values): formatted_values = [str(round(channel, digits)).ljust(digits + 2, '0') for channel in value] safe_print(str(i + 1).rjust(len(str(amount)), '0'), str(round(i / float(entryCount - 1), digits)).ljust(digits + 2, '0'), " ".join(formatted_values)) class VideoCardGammaFormulaType(VideoCardGammaType): def __init__(self, tagData, tagSignature): VideoCardGammaType.__init__(self, tagData, tagSignature) data = tagData[12:] self.update({ "redGamma": u16Fixed16Number(data[0:4]), "redMin": u16Fixed16Number(data[4:8]), "redMax": u16Fixed16Number(data[8:12]), "greenGamma": u16Fixed16Number(data[12:16]), "greenMin": u16Fixed16Number(data[16:20]), "greenMax": u16Fixed16Number(data[20:24]), "blueGamma": u16Fixed16Number(data[24:28]), "blueMin": u16Fixed16Number(data[28:32]), "blueMax": u16Fixed16Number(data[32:36]) }) def getNormalizedValues(self, amount=None): if amount is None: amount = 256 # common value step = 1.0 / float(amount - 1) rgb = AODict([("red", []), ("green", []), ("blue", [])]) for i in xrange(0, amount): for key in rgb: rgb[key].append(float(self[key + "Min"]) + math.pow(step * i / 1.0, float(self[key + "Gamma"])) * float(self[key + "Max"] - self[key + "Min"])) return zip(*rgb.values()) def getTableType(self, entryCount=256, entrySize=2): """ Return gamma as table type. """ maxValue = math.pow(256, entrySize) - 1 tagData = [self.tagData[:8], uInt32Number_tohex(0), # type 0 = table uInt16Number_tohex(3), # channels uInt16Number_tohex(entryCount), uInt16Number_tohex(entrySize)] int2hex = { 1: uInt8Number_tohex, 2: uInt16Number_tohex, 4: uInt32Number_tohex, 8: uInt64Number_tohex } for key in ("red", "green", "blue"): for i in xrange(0, entryCount): vmin = float(self[key + "Min"]) vmax = float(self[key + "Max"]) gamma = float(self[key + "Gamma"]) v = (vmin + math.pow(1.0 / (entryCount - 1) * i, gamma) * float(vmax - vmin)) tagData.append(int2hex[entrySize](round(v * maxValue))) return VideoCardGammaTableType("".join(tagData), self.tagSignature) class VideoCardGammaTableType(VideoCardGammaType): def __init__(self, tagData, tagSignature): VideoCardGammaType.__init__(self, tagData, tagSignature) if not tagData: self.update({"channels": 0, "entryCount": 0, "entrySize": 0, "data": []}) return data = tagData[12:] channels = uInt16Number(data[0:2]) entryCount = uInt16Number(data[2:4]) entrySize = uInt16Number(data[4:6]) self.update({ "channels": channels, "entryCount": entryCount, "entrySize": entrySize, "data": [] }) hex2int = { 1: uInt8Number, 2: uInt16Number, 4: uInt32Number, 8: uInt64Number } i = 0 while i < channels: self.data.append([]) j = 0 while j < entryCount: index = 6 + i * entryCount * entrySize + j * entrySize self.data[i].append(hex2int[entrySize](data[index:index + entrySize])) j = j + 1 i = i + 1 def getNormalizedValues(self, amount=None): if amount is None: amount = self.entryCount maxValue = math.pow(256, self.entrySize) - 1 values = zip(*[[entry / maxValue for entry in channel] for channel in self.data]) if amount <= self.entryCount: step = self.entryCount / float(amount - 1) all = values values = [] for i, value in enumerate(all): if i == 0 or (i + 1) % step < 1 or i + 1 == self.entryCount: values.append(value) return values def getFormulaType(self): """ Return formula representing gamma value at 50% input. """ maxValue = math.pow(256, self.entrySize) - 1 tagData = [self.tagData[:8], uInt32Number_tohex(1)] # type 1 = formula data = list(self.data) while len(data) < 3: data.append(data[0]) for channel in data: l = (len(channel) - 1) / 2.0 floor = float(channel[int(math.floor(l))]) ceil = float(channel[int(math.ceil(l))]) vmin = channel[0] / maxValue vmax = channel[-1] / maxValue v = (vmin + ((floor + ceil) / 2.0) * (vmax - vmin)) / maxValue gamma = (math.log(v) / math.log(.5)) print vmin, gamma, vmax tagData.append(u16Fixed16Number_tohex(gamma)) tagData.append(u16Fixed16Number_tohex(vmin)) tagData.append(u16Fixed16Number_tohex(vmax)) return VideoCardGammaFormulaType("".join(tagData), self.tagSignature) def resize(self, length=128): data = [[], [], []] for i, channel in enumerate(self.data): for j in xrange(0, length): j *= (len(channel) - 1) / float(length - 1) if int(j) != j: floor = channel[int(math.floor(j))] ceil = channel[min(int(math.ceil(j)), len(channel) - 1)] interpolated = xrange(floor, ceil + 1) fraction = j - int(j) index = int(round(fraction * (ceil - floor))) v = interpolated[index] else: v = channel[int(j)] data[i].append(v) self.data = data self.entryCount = len(data[0]) def resized(self, length=128): resized = self.__class__(self.tagData, self.tagSignature) resized.resize(length) return resized def smooth_cr(self, length=64): """ Smooth video LUT curves (Catmull-Rom). """ resized = self.resized(length) for i in xrange(0, len(self.data)): step = float(length - 1) / (len(self.data[i]) - 1) interpolation = CRInterpolation(resized.data[i]) for j in xrange(0, len(self.data[i])): self.data[i][j] = interpolation(j * step) def smooth_avg(self, passes=1, window=None): """ Smooth video LUT curves (moving average). passses Number of passes window Tuple or list containing weighting factors. Its length determines the size of the window to use. Defaults to (1.0, 1.0, 1.0) """ if not window or len(window) < 3 or len(window) % 2 != 1: window = (1.0, 1.0, 1.0) for x in xrange(0, passes): data = [[], [], []] for i, channel in enumerate(self.data): for j, v in enumerate(channel): tmpwindow = window while j > 0 and j < len(channel) - 1 and len(tmpwindow) >= 3: tl = (len(tmpwindow) - 1) / 2 # print j, tl, tmpwindow if tl > 0 and j - tl >= 0 and j + tl <= len(channel) - 1: windowslice = channel[j - tl:j + tl + 1] windowsize = 0 for k, weight in enumerate(tmpwindow): windowsize += float(weight) * windowslice[k] v = windowsize / sum(tmpwindow) break else: tmpwindow = tmpwindow[1:-1] data[i].append(v) self.data = data self.entryCount = len(data[0]) @Property def tagData(): doc = """ Return raw tag data. """ def fget(self): tagData = ["vcgt", "\0" * 4, uInt32Number_tohex(0), # type 0 = table uInt16Number_tohex(len(self.data)), # channels uInt16Number_tohex(self.entryCount), uInt16Number_tohex(self.entrySize)] int2hex = { 1: uInt8Number_tohex, 2: uInt16Number_tohex, 4: uInt32Number_tohex, 8: uInt64Number_tohex } for channel in self.data: for i in xrange(0, self.entryCount): tagData.append(int2hex[self.entrySize](channel[i])) return "".join(tagData) def fset(self, tagData): pass return locals() class ViewingConditionsType(ICCProfileTag, ADict): def __init__(self, tagData, tagSignature): ICCProfileTag.__init__(self, tagData, tagSignature) self.update({ "illuminant": XYZNumber(tagData[8:20]), "surround": XYZNumber(tagData[20:32]), "illuminantType": Illuminant(tagData[32:36]) }) class XYZNumber(AODict): """ Byte Offset Content Encoded as... 0..3 CIE X s15Fixed16Number 4..7 CIE Y s15Fixed16Number 8..11 CIE Z s15Fixed16Number """ def __init__(self, binaryString="\0" * 12): AODict.__init__(self) self.X, self.Y, self.Z = [s15Fixed16Number(chunk) for chunk in (binaryString[:4], binaryString[4:8], binaryString[8:12])] def __repr__(self): XYZ = [] for key, value in self.iteritems(): XYZ.append("(%s, %s)" % (repr(key), str(value))) return "%s.%s([%s])" % (self.__class__.__module__, self.__class__.__name__, ", ".join(XYZ)) def adapt(self, whitepoint_source=None, whitepoint_destination=None, cat="Bradford"): XYZ = self.__class__() XYZ.X, XYZ.Y, XYZ.Z = colormath.adapt(self.X, self.Y, self.Z, whitepoint_source, whitepoint_destination, cat) return XYZ def round(self, digits=4): XYZ = self.__class__() for key in self: XYZ[key] = round(self[key], digits) return XYZ def tohex(self): data = [s15Fixed16Number_tohex(n) for n in self.values()] return "".join(data) @property def hex(self): return self.tohex() @property def Lab(self): return colormath.XYZ2Lab(*[v * 100 for v in self.values()]) @property def xyY(self): return NumberTuple(colormath.XYZ2xyY(self.X, self.Y, self.Z)) class XYZType(ICCProfileTag, XYZNumber): def __init__(self, tagData="\0" * 20, tagSignature=None, profile=None): ICCProfileTag.__init__(self, tagData, tagSignature) XYZNumber.__init__(self, tagData[8:20]) self.profile = profile __repr__ = XYZNumber.__repr__ def __setattr__(self, name, value): if name in ("_keys", "profile", "tagData", "tagSignature"): object.__setattr__(self, name, value) else: self[name] = value def adapt(self, whitepoint_source=None, whitepoint_destination=None, cat=None): if self.profile and isinstance(self.profile.tags.get("arts"), chromaticAdaptionTag): cat = self.profile.tags.arts else: cat = "Bradford" XYZ = self.__class__(profile=self.profile) XYZ.X, XYZ.Y, XYZ.Z = colormath.adapt(self.X, self.Y, self.Z, whitepoint_source, whitepoint_destination, cat) return XYZ @property def ir(self): """ Get illuminant-relative values """ pcs_illuminant = self.profile.illuminant.values() if "chad" in self.profile.tags and self.profile.creator != "appl": # Apple profiles have a bug where they contain a 'chad' tag, # but the media white is not under PCS illuminant if self is self.profile.tags.wtpt: XYZ = self.__class__(profile=self.profile) XYZ.X, XYZ.Y, XYZ.Z = self.values() else: # Go from XYZ mediawhite-relative under PCS illuminant to XYZ # under PCS illuminant if isinstance(self.profile.tags.get("arts"), chromaticAdaptionTag): cat = self.profile.tags.arts else: cat = "XYZ scaling" XYZ = self.adapt(pcs_illuminant, self.profile.tags.wtpt.values(), cat=cat) # Go from XYZ under PCS illuminant to XYZ illuminant-relative XYZ.X, XYZ.Y, XYZ.Z = self.profile.tags.chad.inverted() * XYZ.values() return XYZ else: if self in (self.profile.tags.wtpt, self.profile.tags.get("bkpt")): # For profiles without 'chad' tag, the white/black point should # already be illuminant-relative return self elif "chad" in self.profile.tags: XYZ = self.__class__(profile=self.profile) # Go from XYZ under PCS illuminant to XYZ illuminant-relative XYZ.X, XYZ.Y, XYZ.Z = self.profile.tags.chad.inverted() * self.values() return XYZ else: # Go from XYZ under PCS illuminant to XYZ illuminant-relative return self.adapt(pcs_illuminant, self.profile.tags.wtpt.values()) @property def pcs(self): """ Get PCS-relative values """ if (self in (self.profile.tags.wtpt, self.profile.tags.get("bkpt")) and (not "chad" in self.profile.tags or self.profile.creator == "appl")): # Apple profiles have a bug where they contain a 'chad' tag, # but the media white is not under PCS illuminant if "chad" in self.profile.tags: XYZ = self.__class__(profile=self.profile) XYZ.X, XYZ.Y, XYZ.Z = self.profile.tags.chad * self.values() return XYZ pcs_illuminant = self.profile.illuminant.values() return self.adapt(self.profile.tags.wtpt.values(), pcs_illuminant) else: # Values should already be under PCS illuminant return self @Property def tagData(): doc = """ Return raw tag data. """ def fget(self): tagData = ["XYZ ", "\0" * 4] tagData.append(self.tohex()) return "".join(tagData) def fset(self, tagData): pass return locals() @property def xyY(self): if self is self.profile.tags.get("bkpt"): ref = self.profile.tags.bkpt else: ref = self.profile.tags.wtpt return NumberTuple(colormath.XYZ2xyY(self.X, self.Y, self.Z, (ref.X, 1.0, ref.Z))) class chromaticAdaptionTag(colormath.Matrix3x3, s15Fixed16ArrayType): def __init__(self, tagData=None, tagSignature=None): ICCProfileTag.__init__(self, tagData, tagSignature) if tagData: data = tagData[8:] if data: matrix = [] while data: if len(matrix) == 0 or len(matrix[-1]) == 3: matrix.append([]) matrix[-1].append(s15Fixed16Number(data[0:4])) data = data[4:] self.update(matrix) @Property def tagData(): doc = """ Return raw tag data. """ def fget(self): tagData = ["sf32", "\0" * 4] for row in self: for column in row: tagData.append(s15Fixed16Number_tohex(column)) return "".join(tagData) def fset(self, tagData): pass return locals() def get_cat(self): """ Compare to known CAT matrices and return matching name (if any) """ for cat_name, cat_matrix in colormath.cat_matrices.iteritems(): if colormath.is_similar_matrix(self, cat_matrix, 4): return cat_name class NamedColor2Value(object): def __init__(self, valueData="\0" * 38, deviceCoordCount=0, pcs="XYZ", device="RGB"): self._pcsname = pcs self._devicename = device end = valueData[0:32].find("\0") if end < 0: end = 32 self.rootName = valueData[0:end] self.pcsvalues = [ uInt16Number(valueData[32:34]), uInt16Number(valueData[34:36]), uInt16Number(valueData[36:38])] self.pcs = AODict() for i, pcsvalue in enumerate(self.pcsvalues): if pcs == "Lab": if i == 0: # L* range 0..100 + (25500 / 65280.0) self.pcs[pcs[i]] = pcsvalue / 65536.0 * 256 / 255.0 * 100 else: # a, b range -128..127 + (255/256.0) self.pcs[pcs[i]] = -128 + (pcsvalue / 65536.0 * 256) elif pcs == "XYZ": # X, Y, Z range 0..100 + (32767 / 32768.0) self.pcs[pcs[i]] = pcsvalue / 32768.0 * 100 deviceCoords = [] if deviceCoordCount > 0: for i in xrange(38, 38+deviceCoordCount*2, 2): deviceCoords.append( uInt16Number( valueData[i:i+2])) self.devicevalues = deviceCoords if device == "Lab": # L* range 0..100 + (25500 / 65280.0) # a, b range range -128..127 + (255 / 256.0) self.device = tuple(v / 65536.0 * 256 / 255.0 * 100 if i == 0 else -128 + (v / 65536.0 * 256) for i, v in enumerate(deviceCoords)) elif device == "XYZ": # X, Y, Z range 0..100 + (32767 / 32768.0) self.device = tuple(v / 32768.0 * 100 for v in deviceCoords) else: # Device range 0..100 self.device = tuple(v / 65535.0 * 100 for v in deviceCoords) @property def name(self): return unicode(Text(self.rootName.strip('\0')), 'latin-1') def __repr__(self): pcs = [] dev = [] for key, value in self.pcs.iteritems(): pcs.append("%s=%s" % (str(key), str(value))) for value in self.device: dev.append("%s" % value) return "%s(%s, {%s}, [%s])" % ( self.__class__.__name__, self.name, ", ".join(pcs), ", ".join(dev)) @Property def tagData(): doc = """ Return raw tag data. """ def fget(self): valueData = [] valueData.append(self.rootName.ljust(32, "\0")) valueData.extend( [uInt16Number_tohex(pcsval) for pcsval in self.pcsvalues]) valueData.extend( [uInt16Number_tohex(deviceval) for deviceval in self.devicevalues]) return "".join(valueData) def fset(self, tagData): pass return locals() class NamedColor2ValueTuple(tuple): __slots__ = () REPR_OUTPUT_SIZE = 10 def __repr__(self): data = list(self[:self.REPR_OUTPUT_SIZE + 1]) if len(data) > self.REPR_OUTPUT_SIZE: data[-1] = "...(remaining elements truncated)..." return repr(data) @Property def tagData(): doc = """ Return raw tag data. """ def fget(self): return "".join([val.tagData for val in self]) def fset(self, tagData): pass return locals() class NamedColor2Type(ICCProfileTag, AODict): REPR_OUTPUT_SIZE = 10 def __init__(self, tagData="\0" * 84, tagSignature=None, pcs=None, device=None): ICCProfileTag.__init__(self, tagData, tagSignature) AODict.__init__(self) colorCount = uInt32Number(tagData[12:16]) deviceCoordCount = uInt32Number(tagData[16:20]) stride = 38 + 2*deviceCoordCount self.vendorData = tagData[8:12] self.colorCount = colorCount self.deviceCoordCount = deviceCoordCount self._prefix = Text(tagData[20:52]) self._suffix = Text(tagData[52:84]) self._pcsname = pcs self._devicename = device keys = [] values = [] if colorCount > 0: start = 84 end = start + (stride*colorCount) for i in xrange(start, end, stride): nc2 = NamedColor2Value( tagData[i:i+stride], deviceCoordCount, pcs=pcs, device=device) keys.append(nc2.name) values.append(nc2) self.update(OrderedDict(zip(keys, values))) def __setattr__(self, name, value): object.__setattr__(self, name, value) @property def prefix(self): return unicode(self._prefix.strip('\0'), 'latin-1') @property def suffix(self): return unicode(self._suffix.strip('\0'), 'latin-1') @property def colorValues(self): return NamedColor2ValueTuple(self.values()) def add_color(self, rootName, *deviceCoordinates, **pcsCoordinates): if self._pcsname == "Lab": keys = ["L", "a", "b"] elif self._pcsname == "XYZ": keys = ["X", "Y", "Z"] else: keys = ["X", "Y", "Z"] if not set(pcsCoordinates.keys()).issuperset(set(keys)): raise ICCProfileInvalidError("Can't add namedColor2 without all 3 PCS coordinates: '%s'" % set(keys) - set(pcsCoordinates.keys())) if len(deviceCoordinates) != self.deviceCoordCount: raise ICCProfileInvalidError("Can't add namedColor2 without all %s device coordinates (called with %s)" % ( self.deviceCoordCount, len(deviceCoordinates))) nc2value = NamedColor2Value() nc2value._pcsname = self._pcsname nc2value._devicename = self._devicename nc2value.rootName = rootName if rootName in self.keys(): raise ICCProfileInvalidError("Can't add namedColor2 with existant name: '%s'" % rootName) nc2value.devicevalues = [] nc2value.device = tuple(deviceCoordinates) nc2value.pcs = AODict(copy(pcsCoordinates)) for idx, key in enumerate(keys): val = nc2value.pcs[key] if key == "L": nc2value.pcsvalues[idx] = val * 65536 / (256 / 255.0) / 100.0 elif key in ("a", "b"): nc2value.pcsvalues[idx] = (val + 128) * 65536 / 256.0 elif key in ("X", "Y", "Z"): nc2value.pcsvalues[idx] = val * 32768 / 100.0 for idx, val in enumerate(nc2value.device): if self._devicename == "Lab": if idx == 0: # L* range 0..100 + (25500 / 65280.0) nc2value.devicevalues[idx] = val * 65536 / (256 / 255.0) / 100.0 else: # a, b range -128..127 + (255/256.0) nc2value.devicevalues[idx] = (val + 128) * 65536 / 256.0 elif self._devicename == "XYZ": # X, Y. Z range 0..100 + (32767 / 32768.0) nc2value.devicevalues[idx] = val * 32768 / 100.0 else: # Device range 0..100 nc2value.devicevalues[idx] = val * 65535 / 100.0 self[nc2value.name] = nc2value def __repr__(self): data = self.items()[:self.REPR_OUTPUT_SIZE + 1] if len(data) > self.REPR_OUTPUT_SIZE: data[-1] = ('...', "(remaining elements truncated)") return repr(OrderedDict(data)) @Property def tagData(): doc = """ Return raw tag data. """ def fget(self): tagData = ["ncl2", "\0" * 4, self.vendorData, uInt32Number_tohex(len(self.items())), uInt32Number_tohex(self.deviceCoordCount), self._prefix.ljust(32), self._suffix.ljust(32)] tagData.append(self.colorValues.tagData) return "".join(tagData) def fset(self, tagData): pass return locals() tagSignature2Tag = { "arts": chromaticAdaptionTag, "chad": chromaticAdaptionTag } typeSignature2Type = { "chrm": ChromaticityType, "clrt": ColorantTableType, "curv": CurveType, "desc": TextDescriptionType, # ICC v2 "dict": DictType, # ICC v2 + v4 "dtim": DateTimeType, "meas": MeasurementType, "mluc": MultiLocalizedUnicodeType, # ICC v4 "mft2": LUT16Type, "mmod": MakeAndModelType, # Apple private tag "ncl2": NamedColor2Type, "sf32": s15Fixed16ArrayType, "sig ": SignatureType, "text": TextType, "vcgt": videoCardGamma, "view": ViewingConditionsType, "XYZ ": XYZType } class ICCProfileInvalidError(IOError): pass class ICCProfile: """ Returns a new ICCProfile object. Optionally initialized with a string containing binary profile data or a filename, or a file-like object. Also if the 'load' keyword argument is False (default True), only the header will be read initially and loading of the tags will be deferred to when they are accessed the first time. """ def __init__(self, profile=None, load=True): self.ID = "\0" * 16 self._data = "" self._file = None self._tags = AODict() self.fileName = None self.is_loaded = False self.size = 0 if profile is not None: data = None if type(profile) in (str, unicode): if profile.find("\0") < 0: # filename if (not os.path.isfile(profile) and not os.path.sep in profile and (not isinstance(os.path.altsep, basestring) or not os.path.altsep in profile)): for path in iccprofiles_home + filter(lambda x: x not in iccprofiles_home, iccprofiles): if os.path.isdir(path): for path, dirs, files in os.walk(path): path = os.path.join(path, profile) if os.path.isfile(path): profile = path break if os.path.isfile(path): break profile = open(profile, "rb") else: # binary string data = profile self.is_loaded = True if not data: # file object self._file = profile self.fileName = self._file.name self._file.seek(0) data = self._file.read(128) self.close() if not data or len(data) < 128: raise ICCProfileInvalidError("Not enough data") if data[36:40] != "acsp": raise ICCProfileInvalidError("Profile signature mismatch - " "expected 'acsp', found '" + data[36:40] + "'") header = data[:128] self.size = uInt32Number(header[0:4]) self.preferredCMM = header[4:8] minorrev_bugfixrev = binascii.hexlify(header[8:12][1]) self.version = float(str(ord(header[8:12][0])) + "." + str(int("0x0" + minorrev_bugfixrev[0], 16)) + str(int("0x0" + minorrev_bugfixrev[1], 16))) self.profileClass = header[12:16] self.colorSpace = header[16:20].strip() self.connectionColorSpace = header[20:24].strip() try: self.dateTime = dateTimeNumber(header[24:36]) except ValueError: raise ICCProfileInvalidError("Profile creation date/time invalid") self.platform = header[40:44] flags = uInt32Number(header[44:48]) self.embedded = flags & 1 != 0 self.independent = flags & 2 == 0 deviceAttributes = uInt64Number(header[56:64]) self.device = { "manufacturer": header[48:52], "model": header[52:56], "attributes": { "reflective": deviceAttributes & 1 == 0, "glossy": deviceAttributes & 2 == 0, "positive": deviceAttributes & 4 == 0, "color": deviceAttributes & 8 == 0 } } self.intent = uInt32Number(header[64:68]) self.illuminant = XYZNumber(header[68:80]) self.creator = header[80:84] if header[84:100] != "\0" * 16: self.ID = header[84:100] self._data = data[:self.size] if load: self.tags else: # Default to RGB display device profile self.preferredCMM = "" self.version = 2.4 self.profileClass = "mntr" self.colorSpace = "RGB" self.connectionColorSpace = "XYZ" self.dateTime = datetime.datetime.now() self.platform = "" self.embedded = False self.independent = True self.device = { "manufacturer": "", "model": "", "attributes": { "reflective": True, "glossy": True, "positive": True, "color": True } } self.intent = 0 self.illuminant = XYZNumber("\0\0\xf6\xd6\0\x01\0\0\0\0\xd3-") # D50 self.creator = "" def __del__(self): self.close() def __len__(self): """ Return the number of tags. Can also be used in boolean comparisons (profiles with no tags evaluate to false) """ return len(self.tags) @property def data(self): """ Get raw binary profile data. This will re-assemble the various profile parts (header, tag table and data) on-the-fly. """ # Assemble tag table and tag data tagCount = len(self.tags) tagTable = [] tagTableSize = tagCount * 12 tagsData = [] tagsDataOffset = [] tagDataOffset = 128 + 4 + tagTableSize for tagSignature in self.tags: tagData = self.tags[tagSignature].tagData tagDataSize = len(tagData) # Pad all data with binary zeros so it lies on 4-byte boundaries padding = int(math.ceil(tagDataSize / 4.0)) * 4 - tagDataSize tagData += "\0" * padding tagTable.append(tagSignature) if tagData in tagsData: tagTable.append(uInt32Number_tohex(tagsDataOffset[tagsData.index(tagData)])) else: tagTable.append(uInt32Number_tohex(tagDataOffset)) tagTable.append(uInt32Number_tohex(tagDataSize)) if not tagData in tagsData: tagsData.append(tagData) tagsDataOffset.append(tagDataOffset) tagDataOffset += tagDataSize + padding header = self.header(tagTableSize, len("".join(tagsData))) data = "".join([header, uInt32Number_tohex(tagCount), "".join(tagTable), "".join(tagsData)]) return data def header(self, tagTableSize, tagDataSize): "Profile Header" # Profile size: 128 bytes header + 4 bytes tag count + tag table + data header = [uInt32Number_tohex(128 + 4 + tagTableSize + tagDataSize), self.preferredCMM[:4].ljust(4, " ") if self.preferredCMM else "\0" * 4, # Next three lines are ICC version chr(int(str(self.version).split(".")[0])), binascii.unhexlify(("%.2f" % self.version).split(".")[1]), "\0" * 2, self.profileClass[:4].ljust(4, " "), self.colorSpace[:4].ljust(4, " "), self.connectionColorSpace[:4].ljust(4, " "), dateTimeNumber_tohex(self.dateTime), "acsp", self.platform[:4].ljust(4, " ") if self.platform else "\0" * 4,] flags = 0 if self.embedded: flags += 1 if not self.independent: flags += 2 header.extend([uInt32Number_tohex(flags), self.device["manufacturer"][:4].rjust(4, "\0") if self.device["manufacturer"] else "\0" * 4, self.device["model"][:4].rjust(4, "\0") if self.device["model"] else "\0" * 4]) deviceAttributes = 0 for name, bit in {"reflective": 1, "glossy": 2, "positive": 4, "color": 8}.iteritems(): if not self.device["attributes"][name]: deviceAttributes += bit header.extend([uInt64Number_tohex(deviceAttributes), uInt32Number_tohex(self.intent), self.illuminant.tohex(), self.creator[:4].ljust(4, " ") if self.creator else "\0" * 4, self.ID[:16].ljust(16, "\0"), self._data[100:128] if len(self._data[100:128]) == 28 else "\0" * 28]) return "".join(header) @property def tags(self): "Profile Tag Table" if not self._tags: self.load() if self._data and len(self._data) > 131: # tag table and tagged element data tagCount = uInt32Number(self._data[128:132]) if debug: print "tagCount:", tagCount tagTable = self._data[132:132 + tagCount * 12] discard_len = 0 tags = {} while tagTable: tag = tagTable[:12] if len(tag) < 12: raise ICCProfileInvalidError("Tag table is truncated") tagSignature = tag[:4] if debug: print "tagSignature:", tagSignature tagDataOffset = uInt32Number(tag[4:8]) if debug: print " tagDataOffset:", tagDataOffset tagDataSize = uInt32Number(tag[8:12]) if debug: print " tagDataSize:", tagDataSize if tagSignature in self._tags: safe_print("Error (non-critical): Tag '%s' already " "encountered. Skipping..." % tagSignature) else: if (tagDataOffset, tagDataSize) in tags: if debug: print " tagDataOffset and tagDataSize indicate shared tag" self._tags[tagSignature] = tags[(tagDataOffset, tagDataSize)] else: start = tagDataOffset - discard_len if debug: print " tagData start:", start end = tagDataOffset - discard_len + tagDataSize if debug: print " tagData end:", end tagData = self._data[start:end] if len(tagData) < tagDataSize: raise ICCProfileInvalidError("Tag data for tag %r (offet %i, size %i) is truncated" % (tagSignature, tagDataOffset, tagDataSize)) typeSignature = tagData[:4] if len(typeSignature) < 4: raise ICCProfileInvalidError("Tag type signature for tag %r (offet %i, size %i) is truncated" % (tagSignature, tagDataOffset, tagDataSize)) if debug: print " typeSignature:", typeSignature try: if tagSignature in tagSignature2Tag: tag = tagSignature2Tag[tagSignature](tagData, tagSignature) elif typeSignature in typeSignature2Type: args = tagData, tagSignature if typeSignature in ("clrt", "ncl2"): args += (self.connectionColorSpace, ) if typeSignature == "ncl2": args += (self.colorSpace, ) elif typeSignature in ("XYZ ", "mft2", "curv"): args += (self, ) tag = typeSignature2Type[typeSignature](*args) else: tag = ICCProfileTag(tagData, tagSignature) except Exception, exception: raise ICCProfileInvalidError("Couldn't parse tag %r (type %r, offet %i, size %i): %r" % (tagSignature, typeSignature, tagDataOffset, tagDataSize, exception)) self._tags[tagSignature] = tags[(tagDataOffset, tagDataSize)] = tag tagTable = tagTable[12:] self._data = self._data[:128] return self._tags def calculateID(self, setID=True): """ Calculates, sets, and returns the profile's ID (checksum). Calling this function always recalculates the checksum on-the-fly, in contrast to just accessing the ID property. The entire profile, based on the size field in the header, is used to calculate the ID after the values in the Profile Flags field (bytes 44 to 47), Rendering Intent field (bytes 64 to 67) and Profile ID field (bytes 84 to 99) in the profile header have been temporarily replaced with zeros. """ data = self.data[:44] + "\0\0\0\0" + self.data[48:64] + "\0\0\0\0" + \ self.data[68:84] + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + \ self.data[100:] ID = md5(data).digest() if setID: self.ID = ID return ID def close(self): """ Closes the associated file object (if any). """ if self._file and not self._file.closed: self._file.close() @staticmethod def from_edid(edid, iccv4=False, cat="Bradford"): """ Create an ICC Profile from EDID data and return it You may override the gamma from EDID by setting it to a list of curve values. """ description = edid.get("monitor_name", edid.get("ascii", str(edid["product_id"] or edid["hash"]))) manufacturer = edid.get("manufacturer", "") manufacturer_id = edid["edid"][8:10] model_name = description model_id = edid["edid"][10:12] copyright = "Created from EDID" # Get chromaticities of primaries xy = {} for color in ("red", "green", "blue", "white"): x, y = edid.get(color + "_x", 0.0), edid.get(color + "_y", 0.0) xy[color[0] + "x"] = x xy[color[0] + "y"] = y gamma = edid.get("gamma", 2.2) profile = ICCProfile.from_chromaticities(xy["rx"], xy["ry"], xy["gx"], xy["gy"], xy["bx"], xy["by"], xy["wx"], xy["wy"], gamma, description, copyright, manufacturer, model_name, manufacturer_id, model_id, iccv4, cat) profile.set_edid_metadata(edid) spec_prefixes = "DATA_,OPENICC_" prefixes = (profile.tags.meta.getvalue("prefix", "", None) or spec_prefixes).split(",") for prefix in spec_prefixes.split(","): if not prefix in prefixes: prefixes.append(prefix) profile.tags.meta["prefix"] = ",".join(prefixes) profile.tags.meta["OPENICC_automatic_generated"] = "1" profile.tags.meta["DATA_source"] = "edid" profile.calculateID() return profile @staticmethod def from_chromaticities(rx, ry, gx, gy, bx, by, wx, wy, gamma, description, copyright, manufacturer=None, model_name=None, manufacturer_id="\0\0", model_id="\0\0", iccv4=False, cat="Bradford"): """ Create an ICC Profile from chromaticities and return it """ wXYZ = colormath.xyY2XYZ(wx, wy, 1.0) # Calculate RGB to XYZ matrix from chromaticities and white mtx = colormath.rgb_to_xyz_matrix(rx, ry, gx, gy, bx, by, wXYZ) rgb = {"r": (1.0, 0.0, 0.0), "g": (0.0, 1.0, 0.0), "b": (0.0, 0.0, 1.0)} XYZ = {} for color in "rgb": # Calculate XYZ for primaries XYZ[color] = mtx * rgb[color] profile = ICCProfile.from_XYZ(XYZ["r"], XYZ["g"], XYZ["b"], wXYZ, gamma, description, copyright, manufacturer, model_name, manufacturer_id, model_id, iccv4, cat) return profile @staticmethod def from_XYZ(rXYZ, gXYZ, bXYZ, wXYZ, gamma, description, copyright, manufacturer=None, model_name=None, manufacturer_id="\0\0", model_id="\0\0", iccv4=False, cat="Bradford"): """ Create an ICC Profile from XYZ values and return it """ profile = ICCProfile() if iccv4: profile.version = 4.2 profile.setDescription(description) profile.setCopyright(copyright) if manufacturer: profile.setDeviceManufacturerDescription(manufacturer) if model_name: profile.setDeviceModelDescription(model_name) profile.device["manufacturer"] = "\0\0" + manufacturer_id[1] + manufacturer_id[0] profile.device["model"] = "\0\0" + model_id[1] + model_id[0] # Add Apple-specific 'mmod' tag (TODO: need full spec) if manufacturer_id != "\0\0" or model_id != "\0\0": mmod = ("mmod" + ("\x00" * 6) + manufacturer_id + ("\x00" * 2) + model_id[1] + model_id[0] + ("\x00" * 4) + ("\x00" * 20)) profile.tags.mmod = ICCProfileTag(mmod, "mmod") profile.tags.wtpt = XYZType(profile=profile) D50 = colormath.get_whitepoint("D50") if iccv4: # Set wtpt to D50 and store actual white -> D50 transform in chad (profile.tags.wtpt.X, profile.tags.wtpt.Y, profile.tags.wtpt.Z) = D50 profile.tags.chad = chromaticAdaptionTag() matrix = colormath.wp_adaption_matrix(wXYZ, D50, cat) profile.tags.chad.update(matrix) else: # Store actual white in wtpt (profile.tags.wtpt.X, profile.tags.wtpt.Y, profile.tags.wtpt.Z) = wXYZ profile.tags.chrm = ChromaticityType() profile.tags.chrm.type = 0 for color in "rgb": X, Y, Z = locals()[color + "XYZ"] # Get chromaticity of primary x, y = colormath.XYZ2xyY(X, Y, Z)[:2] profile.tags.chrm.channels.append((x, y)) # Write XYZ and TRC tags (don't forget to adapt to D50) tagname = color + "XYZ" profile.tags[tagname] = XYZType(profile=profile) (profile.tags[tagname].X, profile.tags[tagname].Y, profile.tags[tagname].Z) = colormath.adapt(X, Y, Z, wXYZ, D50, cat) tagname = color + "TRC" profile.tags[tagname] = CurveType(profile=profile) if isinstance(gamma, (list, tuple)): profile.tags[tagname].extend(gamma) else: profile.tags[tagname].set_trc(gamma, 1) profile.calculateID() return profile def set_blackpoint(self, XYZbp): self.tags.bkpt = XYZType(tagSignature="bkpt", profile=self) self.tags.bkpt.X, self.tags.bkpt.Y, self.tags.bkpt.Z = XYZbp def apply_black_offset(self, XYZbp): # Apply only the black point blending portion of BT.1886 mapping rXYZ = self.tags.rXYZ.values() gXYZ = self.tags.gXYZ.values() bXYZ = self.tags.bXYZ.values() mtx = colormath.Matrix3x3([[rXYZ[0], gXYZ[0], bXYZ[0]], [rXYZ[1], gXYZ[1], bXYZ[1]], [rXYZ[2], gXYZ[2], bXYZ[2]]]) gamma = 0.0 for channel in "rgb": cgamma = self.tags[channel + "TRC"].get_gamma() gamma += cgamma if len(self.tags[channel + "TRC"]) == 1: self.tags[channel + "TRC"] = CurveType(profile=self) self.tags[channel + "TRC"].set_trc(cgamma, 1024) gamma /= 3.0 bt1886 = colormath.BT1886(mtx, XYZbp, 1.0, gamma, False) values = OrderedDict() for i, channel in enumerate(("r", "g", "b")): if self.tags[channel + "TRC"][0] != 0: # So we can hit the target blackpoint self.tags[channel + "TRC"].apply_bpc() for j, v in enumerate(self.tags[channel + "TRC"]): if not values.get(j): values[j] = [] values[j].append(v / 65535.0) self.tags[channel + "TRC"] = CurveType(profile=self) for i, (r, g, b) in values.iteritems(): X, Y, Z = mtx * (r, g, b) values[i] = bt1886.apply(X, Y, Z) for i, XYZ in values.iteritems(): rgb = mtx.inverted() * XYZ for j, channel in enumerate(("r", "g", "b")): self.tags[channel + "TRC"].append(max(min(rgb[j] * 65535, 65535), 0)) self.set_blackpoint(XYZbp) def set_bt1886_trc(self, XYZbp, outoffset=0.0, gamma=2.4, gamma_type="B", size=None): if gamma_type in ("b", "g"): # Get technical gamma needed to achieve effective gamma gamma = colormath.xicc_tech_gamma(gamma, XYZbp[1], outoffset) rXYZ = self.tags.rXYZ.values() gXYZ = self.tags.gXYZ.values() bXYZ = self.tags.bXYZ.values() mtx = colormath.Matrix3x3([[rXYZ[0], gXYZ[0], bXYZ[0]], [rXYZ[1], gXYZ[1], bXYZ[1]], [rXYZ[2], gXYZ[2], bXYZ[2]]]) bt1886 = colormath.BT1886(mtx, XYZbp, outoffset, gamma) values = OrderedDict() for i, channel in enumerate(("r", "g", "b")): self.tags[channel + "TRC"] = CurveType(profile=self) self.tags[channel + "TRC"].set_trc(-709, size) for j, v in enumerate(self.tags[channel + "TRC"]): if not values.get(j): values[j] = [] values[j].append(v / 65535.0) for i, (r, g, b) in values.iteritems(): X, Y, Z = mtx * (r, g, b) values[i] = bt1886.apply(X, Y, Z) for i, XYZ in values.iteritems(): rgb = mtx.inverted() * XYZ for j, channel in enumerate(("r", "g", "b")): self.tags[channel + "TRC"][i] = max(min(rgb[j] * 65535, 65535), 0) self.set_blackpoint(XYZbp) def set_dicom_trc(self, XYZbp, white_cdm2=100, size=1024): """ Set the response to the DICOM Grayscale Standard Display Function This response is special in that it depends on the actual black and white level of the display. XYZbp Black point in absolute XYZ, Y range 0..white_cdm2 """ # See http://medical.nema.org/Dicom/2011/11_14pu.pdf # Luminance levels depend on the start level of 0.05 cd/m2 # and end level of 4000 cd/m2 if XYZbp[1] < .05 or XYZbp[1] >= white_cdm2: raise ValueError("The black level of %f cd/m2 is out of range " "for DICOM. Valid range begins at 0.05 cd/m2." % XYZbp[1]) if white_cdm2 > 4000 or white_cdm2 <= XYZbp[1]: raise ValueError("The white level of %f cd/m2 is out of range " "for DICOM. Valid range is up to 4000 cd/m2." % white_cdm2) black_jndi = colormath.DICOM(XYZbp[1], True) white_jndi = colormath.DICOM(white_cdm2, True) white_dicomY = math.pow(10, colormath.DICOM(white_jndi)) rXYZ = self.tags.rXYZ.values() gXYZ = self.tags.gXYZ.values() bXYZ = self.tags.bXYZ.values() mtx = colormath.Matrix3x3([[rXYZ[0], gXYZ[0], bXYZ[0]], [rXYZ[1], gXYZ[1], bXYZ[1]], [rXYZ[2], gXYZ[2], bXYZ[2]]]).inverted() if size < 2: size = 1024 values = [] for i in xrange(size): v = math.pow(10, colormath.DICOM(black_jndi + (float(i) / (size - 1)) * (white_jndi - black_jndi))) / white_dicomY values.append(v) XYZbp = [v / white_cdm2 for v in XYZbp] rgbbp = mtx * XYZbp # Optimize for uInt16Number encoding rgbbp = [round(max(v, 0) * 65535) / 65535 for v in rgbbp] minv = values[0] maxX = (1.0 - rgbbp[0]) / (values[-1] - minv) maxY = (1.0 - rgbbp[1]) / (values[-1] - minv) maxZ = (1.0 - rgbbp[2]) / (values[-1] - minv) for channel in "rgb": self.tags["%sTRC" % channel] = CurveType(profile=self) for i in xrange(size): rgb = (rgbbp[0] + (values[i] - minv) * maxX, rgbbp[1] + (values[i] - minv) * maxY, rgbbp[2] + (values[i] - minv) * maxZ) for j in xrange(3): self.tags["%sTRC" % "rgb"[j]].append(min(rgb[j] * 65535, 65535)) self.set_blackpoint(XYZbp) def set_smpte2084_trc(self, XYZbp, white_cdm2=100, size=1024): """ Set the response to the SMPTE 2084 perceptual quantizer (PQ) function This response is special in that it depends on the actual black and white level of the display. XYZbp Black point in absolute XYZ, Y range 0..white_cdm2 """ # See https://www.smpte.org/sites/default/files/2014-05-06-EOTF-Miller-1-2-handout.pdf # Luminance levels depend on the end level of 10000 cd/m2 if XYZbp[1] < 0 or XYZbp[1] >= white_cdm2: raise ValueError("The black level of %f cd/m2 is out of range " "for SMPTE 2084. Valid range begins at 0 cd/m2." % XYZbp[1]) if white_cdm2 > 10000 or white_cdm2 <= XYZbp[1]: raise ValueError("The white level of %f cd/m2 is out of range " "for SMPTE 2084. Valid range is up to 10000 cd/m2." % white_cdm2) rXYZ = self.tags.rXYZ.values() gXYZ = self.tags.gXYZ.values() bXYZ = self.tags.bXYZ.values() mtx = colormath.Matrix3x3([[rXYZ[0], gXYZ[0], bXYZ[0]], [rXYZ[1], gXYZ[1], bXYZ[1]], [rXYZ[2], gXYZ[2], bXYZ[2]]]).inverted() if size < 2: size = 1024 values = [] mini = colormath.specialpow((mtx * XYZbp)[1] / 10000.0, 1.0 / -2084) maxi = colormath.specialpow(white_cdm2 / 10000.0, 1.0 / -2084) for i in xrange(size): n = i / (size - 1.0) v = colormath.specialpow(mini + n * (maxi - mini), -2084) values.append(v) XYZbp = [v / white_cdm2 for v in XYZbp] rgbbp = mtx * XYZbp # Optimize for uInt16Number encoding rgbbp = [round(max(v, 0) * 65535) / 65535 for v in rgbbp] minv = values[0] maxX = (1.0 - rgbbp[0]) / (values[-1] - minv) maxY = (1.0 - rgbbp[1]) / (values[-1] - minv) maxZ = (1.0 - rgbbp[2]) / (values[-1] - minv) for channel in "rgb": self.tags["%sTRC" % channel] = CurveType(profile=self) for i in xrange(size): rgb = (rgbbp[0] + (values[i] - minv) * maxX, rgbbp[1] + (values[i] - minv) * maxY, rgbbp[2] + (values[i] - minv) * maxZ) for j in xrange(3): self.tags["%sTRC" % "rgb"[j]].append(min(rgb[j] * 65535, 65535)) self.set_blackpoint(XYZbp) def set_localizable_desc(self, tagname, description, languagecode="en", countrycode="US"): # Handle ICCv2 <> v4 differences and encoding if self.version < 4: self.tags[tagname] = TextDescriptionType() if isinstance(description, unicode): asciidesc = description.encode("ASCII", "asciize") else: asciidesc = description self.tags[tagname].ASCII = asciidesc if asciidesc != description: self.tags[tagname].Unicode = description else: self.set_localizable_text(self, tagname, description, languagecode, countrycode) def set_localizable_text(self, tagname, text, languagecode="en", countrycode="US"): # Handle ICCv2 <> v4 differences and encoding if self.version < 4: if isinstance(text, unicode): text = text.encode("ASCII", "asciize") self.tags[tagname] = TextType("text\0\0\0\0%s\0" % text, tagname) else: self.tags[tagname] = MultiLocalizedUnicodeType() self.tags[tagname].add_localized_string(languagecode, countrycode, text) def setCopyright(self, copyright, languagecode="en", countrycode="US"): self.set_localizable_text("cprt", copyright, languagecode, countrycode) def setDescription(self, description, languagecode="en", countrycode="US"): self.set_localizable_desc("desc", description, languagecode, countrycode) def setDeviceManufacturerDescription(self, description, languagecode="en", countrycode="US"): self.set_localizable_desc("dmnd", description, languagecode, countrycode) def setDeviceModelDescription(self, description, languagecode="en", countrycode="US"): self.set_localizable_desc("dmdd", description, languagecode, countrycode) def getCopyright(self): """ Return profile copyright. """ return unicode(self.tags.get("cprt", "")) def getDescription(self): """ Return profile description. """ return unicode(self.tags.get("desc", "")) def getDeviceManufacturerDescription(self): """ Return device manufacturer description. """ return unicode(self.tags.get("dmnd", "")) def getDeviceModelDescription(self): """ Return device model description. """ return unicode(self.tags.get("dmdd", "")) def getViewingConditionsDescription(self): """ Return viewing conditions description. """ return unicode(self.tags.get("vued", "")) def guess_cat(self, matrix=True): """ Get or guess chromatic adaptation transform. If 'matrix' is True, and 'arts' tag is present, return actual matrix instead of name. """ illuminant = self.illuminant.values() if isinstance(self.tags.get("chad"), chromaticAdaptionTag): return colormath.guess_cat(self.tags.chad, self.tags.chad.inverted() * illuminant, illuminant) elif isinstance(self.tags.get("arts"), chromaticAdaptionTag): if matrix: return self.tags.arts return self.tags.arts.get_cat() def isSame(self, profile, force_calculation=False): """ Compare the ID of profiles. Returns a boolean indicating if the profiles have the same ID. profile can be a ICCProfile instance, a binary string containing profile data, a filename or a file object. """ if not isinstance(profile, self.__class__): profile = self.__class__(profile) if force_calculation or self.ID == "\0" * 16: id1 = self.calculateID(False) else: id1 = self.ID if force_calculation or profile.ID == "\0" * 16: id2 = profile.calculateID(False) else: id2 = profile.ID return id1 == id2 def load(self): """ Loads the profile from the file object. Normally, you don't need to call this method, since the ICCProfile class automatically loads the profile when necessary (load does nothing if the profile was passed in as a binary string). """ if not self.is_loaded and self._file: if self._file.closed: self._file = open(self._file.name, "rb") self._file.seek(len(self._data)) self._data += self._file.read(self.size - len(self._data)) self._file.close() self.is_loaded = True def print_info(self): safe_print("=" * 80) safe_print("ICC profile information") safe_print("-" * 80) safe_print("File name:", os.path.basename(self.fileName or "")) for label, value in self.get_info(): if not value: safe_print(label) else: safe_print(label + ":", value) def get_info(self): info = DictList() info["Size"] = "%i Bytes (%.2f KiB)" % (self.size, self.size / 1024.0) info["Preferred CMM"] = hexrepr(self.preferredCMM, cmms) info["ICC version"] = "%s" % self.version info["Profile class"] = profileclass.get(self.profileClass, self.profileClass) info["Color model"] = self.colorSpace info["Profile connection space (PCS)"] = self.connectionColorSpace info["Created"] = strftime("%Y-%m-%d %H:%M:%S", self.dateTime.timetuple()) info["Platform"] = platform.get(self.platform, hexrepr(self.platform)) info["Is embedded"] = {True: "Yes"}.get(self.embedded, "No") info["Can be used independently"] = {True: "Yes"}.get(self.independent, "No") info["Device"] = "" info[" Manufacturer"] = "0x%s" % binascii.hexlify(self.device["manufacturer"]).upper() if (self.device["manufacturer"][0:2] == "\0\0" and self.device["manufacturer"][2:4] != "\0\0"): mnft_id = self.device["manufacturer"][3] + self.device["manufacturer"][2] mnft_id = edid.parse_manufacturer_id(mnft_id) manufacturer = edid.get_manufacturer_name(mnft_id) else: manufacturer = safe_unicode(re.sub("[^\x20-\x7e]", "", self.device["manufacturer"])).encode("ASCII", "replace") if manufacturer != self.device["manufacturer"]: manufacturer = None else: manufacturer = "'%s'" % manufacturer if manufacturer is not None: info[" Manufacturer"] += " %s" % manufacturer info[" Model"] = hexrepr(self.device["model"]) info[" Attributes"] = "\n".join([{True: "Reflective"}.get(self.device["attributes"]["reflective"], "Transparency"), {True: "Glossy"}.get(self.device["attributes"]["glossy"], "Matte"), {True: "Positive"}.get(self.device["attributes"]["positive"], "Negative"), {True: "Color"}.get(self.device["attributes"]["color"], "Black & white")]) info["Default rendering intent"] = {0: "Perceptual", 1: "Media-relative colorimetric", 2: "Saturation", 3: "ICC-absolute colorimetric"}.get(self.intent, "Unknown") info["PCS illuminant XYZ"] = " ".join([" ".join(["%6.2f" % (v * 100) for v in self.illuminant.values()]), "(xy %s," % " ".join("%6.4f" % v for v in self.illuminant.xyY[:2]), "CCT %iK)" % (colormath.XYZ2CCT(*self.illuminant.values()) or 0)]) info["Creator"] = hexrepr(self.creator, manufacturers) info["Checksum"] = "0x%s" % binascii.hexlify(self.ID).upper() calcID = self.calculateID(False) if self.ID != "\0" * 16: info[" Checksum OK"] = {True: "Yes"}.get(self.ID == calcID, "No") if self.ID != calcID: info[" Calculated checksum"] = "0x%s" % binascii.hexlify(calcID).upper() for sig, tag in self.tags.iteritems(): name = tags.get(sig, "'%s'" % sig) if isinstance(tag, chromaticAdaptionTag): info[name] = self.guess_cat(False) or "Unknown" name = " Matrix" for i, row in enumerate(tag): if i > 0: name = " " * 2 info[name] = " ".join("%6.4f" % v for v in row) elif isinstance(tag, ChromaticityType): info["Chromaticity (illuminant-relative)"] = "" for i, channel in enumerate(tag.channels): if self.colorSpace.endswith("CLR"): colorant_name = "" else: colorant_name = "(%s) " % self.colorSpace[i:i + 1] info[" Channel %i %sxy" % (i + 1, colorant_name)] = " ".join( "%6.4f" % v for v in channel) elif isinstance(tag, ColorantTableType): info["Colorants (PCS-relative)"] = "" maxlen = max(map(len, tag.keys())) for colorant_name, colorant in tag.iteritems(): values = colorant.values() if "".join(colorant.keys()) == "Lab": values = colormath.Lab2XYZ(*values) else: values = [v / 100.0 for v in values] XYZxy = [" ".join("%6.2f" % v for v in colorant.values())] if values != [0, 0, 0]: XYZxy.append("(xy %s)" % " ".join("%6.4f" % v for v in colormath.XYZ2xyY(*values)[:2])) info[" %s %s" % (colorant_name, "".join(colorant.keys()))] = " ".join(XYZxy) elif isinstance(tag, CurveType): if len(tag) == 1: info[name] = "Gamma %3.2f" % tag[0] elif len(tag): info[name] = "" info[" Number of entries"] = "%i" % len(tag) #info[" Average gamma"] = "%3.2f" % tag.get_gamma() transfer_function = tag.get_transfer_function(slice=(0, 1.0)) if round(transfer_function[1], 2) == 1.0: value = u"%s" % ( transfer_function[0][0]) else: transfer_function = tag.get_transfer_function(slice=(0.00, 1.00)) if transfer_function[1] >= .95: value = u"≈ %s (Δ %.2f%%)" % ( transfer_function[0][0], 100 - transfer_function[1] * 100) else: value = "Unknown" info[" Transfer function"] = value info[" Minimum Y"] = "%6.4f" % (tag[0] / 65535.0 * 100) info[" Maximum Y"] = "%6.2f" % (tag[-1] / 65535.0 * 100) elif isinstance(tag, DictType): if sig == "meta": name = "Metadata" else: name = "Generic name-value data" info[name] = "" for key in tag: key = tag.getname(key) value = tag.getvalue(key) if key == "prefix": value = "\n".join(value.split(",")) info[" %s" % key] = value elif isinstance(tag, LUT16Type): info[name] = "" name = " Matrix" for i, row in enumerate(tag.matrix): if i > 0: name = " " * 2 info[name] = " ".join("%6.4f" % v for v in row) info[" Input Table"] = "" info[" Channels"] = "%i" % tag.input_channels_count info[" Number of entries per channel"] = "%i" % tag.input_entries_count info[" Color Look Up Table"] = "" info[" Grid Steps"] = "%i" % tag.clut_grid_steps info[" Entries"] = "%i" % (tag.clut_grid_steps ** tag.input_channels_count) info[" Output Table"] = "" info[" Channels"] = "%i" % tag.output_channels_count info[" Number of entries per channel"] = "%i" % tag.output_entries_count elif isinstance(tag, MakeAndModelType): info[name] = "" info[" Manufacturer"] = "0x%s %s" % ( binascii.hexlify(tag.manufacturer).upper(), edid.get_manufacturer_name(edid.parse_manufacturer_id(tag.manufacturer)) or "") info[" Model"] = "0x%s" % binascii.hexlify(tag.model).upper() elif isinstance(tag, MeasurementType): info[name] = "" info[" Observer"] = tag.observer.description info[" Backing XYZ"] = " ".join("%6.2f" % v for v in tag.backing.values()) info[" Geometry"] = tag.geometry.description info[" Flare"] = "%.2f%%" % (tag.flare * 100) info[" Illuminant"] = tag.illuminantType.description elif isinstance(tag, MultiLocalizedUnicodeType): info[name] = "" for language, countries in tag.iteritems(): for country, value in countries.iteritems(): if country.strip("\0 "): country = "/" + country info[" %s%s" % (language, country)] = value elif isinstance(tag, NamedColor2Type): info[name] = "" info[" Device color components"] = "%i" % ( tag.deviceCoordCount,) info[" Colors (PCS-relative)"] = "%i (%i Bytes) " % ( tag.colorCount, len(tag.tagData)) i = 1 for k, v in tag.iteritems(): pcsout = [] devout = [] for kk, vv in v.pcs.iteritems(): pcsout.append("%03.2f" % vv) for vv in v.device: devout.append("%03.2f" % vv) formatstr = " %%0%is %%s%%s%%s" % len(str(tag.colorCount)) key = formatstr % (i, tag.prefix, k, tag.suffix) info[key] = "%s %s" % ("".join(v.pcs.keys()), " ".join(pcsout)) if (self.colorSpace != self.connectionColorSpace or " ".join(pcsout) != " ".join(devout)): info[key] += " (%s %s)" % (self.colorSpace, " ".join(devout)) i += 1 elif isinstance(tag, Text): if sig == "cprt": info[name] = unicode(tag) elif sig == "tech": info[name] = tech.get(tag, "Unknown") elif tag.find("\n") > -1 or tag.find("\r") > -1: info[name] = "[%i Bytes]" % len(tag) else: info[name] = (unicode(tag)[:60 - len(name)] + ("...[%i more Bytes]" % (len(tag) - (60 - len(name))) if len(tag) > 60 - len(name) else "")) elif isinstance(tag, TextDescriptionType): if not tag.get("Unicode") and not tag.get("Macintosh"): info["%s (ASCII)" % name] = safe_unicode(tag.ASCII) else: info[name] = "" info[" ASCII"] = safe_unicode(tag.ASCII) if tag.get("Unicode"): info[" Unicode"] = tag.Unicode if tag.get("Macintosh"): info[" Macintosh"] = tag.Macintosh elif isinstance(tag, VideoCardGammaFormulaType): info[name] = "" #linear = tag.is_linear() #info[" Is linear"] = {0: "No", 1: "Yes"}[linear] for key in ("red", "green", "blue"): info[" %s gamma" % key.capitalize()] = "%.2f" % tag[key + "Gamma"] info[" %s minimum" % key.capitalize()] = "%.2f" % tag[key + "Min"] info[" %s maximum" % key.capitalize()] = "%.2f" % tag[key + "Max"] elif isinstance(tag, VideoCardGammaTableType): info[name] = "" info[" Bitdepth"] = "%i" % (tag.entrySize * 8) info[" Channels"] = "%i" % tag.channels info[" Number of entries per channel"] = "%i" % tag.entryCount r_points, g_points, b_points, linear_points = tag.get_values() points = r_points, g_points, b_points #if r_points == g_points == b_points == linear_points: #info[" Is linear" % i] = {True: "Yes"}.get(points[i] == linear_points, "No") #else: if True: unique = tag.get_unique_values() for i, channel in enumerate(tag.data): scale = math.pow(2, tag.entrySize * 8) - 1 vmin = 0 vmax = scale gamma = colormath.get_gamma([((len(channel) / 2 - 1) / (len(channel) - 1.0) * scale, channel[len(channel) / 2 - 1])], scale, vmin, vmax, False, False) if gamma: info[" Channel %i gamma at 50%% input" % (i + 1)] = "%.2f" % gamma[0] vmin = channel[0] vmax = channel[-1] info[" Channel %i minimum" % (i + 1)] = "%6.4f%%" % (vmin / scale * 100) info[" Channel %i maximum" % (i + 1)] = "%6.2f%%" % (vmax / scale * 100) info[" Channel %i unique values" % (i + 1)] = "%i @ 8 Bit" % len(unique[i]) info[" Channel %i is linear" % (i + 1)] = {True: "Yes"}.get(points[i] == linear_points, "No") elif isinstance(tag, ViewingConditionsType): info[name] = "" info[" Illuminant"] = tag.illuminantType.description info[" Illuminant XYZ"] = "%s (xy %s)" % ( " ".join("%6.2f" % v for v in tag.illuminant.values()), " ".join("%6.4f" % v for v in tag.illuminant.xyY[:2])) XYZxy = [" ".join("%6.2f" % v for v in tag.surround.values())] if tag.surround.values() != [0, 0, 0]: XYZxy.append("(xy %s)" % " ".join("%6.4f" % v for v in tag.surround.xyY[:2])) info[" Surround XYZ"] = " ".join(XYZxy) elif isinstance(tag, XYZType): if sig == "lumi": info[name] = u"%.2f cd/m²" % self.tags.lumi.Y elif sig in ("bkpt", "wtpt"): format = {"bkpt": "%6.4f", "wtpt": "%6.2f"}[sig] info[name] = "" if self.profileClass == "mntr" and sig == "wtpt": info[" Is illuminant"] = "Yes" if self.profileClass == "mntr" or "chad" in self.tags: label = "Illuminant-relative" else: label = "PCS-relative" #if (self.connectionColorSpace == "Lab" and #self.profileClass == "prtr"): if self.profileClass == "prtr": color = [" ".join([format % v for v in tag.ir.Lab])] info[" %s Lab" % label] = " ".join(color) else: color = [" ".join(format % (v * 100) for v in tag.ir.values())] if tag.ir.values() != [0, 0, 0]: xy = " ".join("%6.4f" % v for v in tag.ir.xyY[:2]) color.append("(xy %s)" % xy) cct, delta = colormath.xy_CCT_delta(*tag.ir.xyY[:2]) else: cct = None info[" %s XYZ" % label] = " ".join(color) if cct: info[" %s CCT" % label] = "%iK" % cct if delta: info[u" ΔE 2000 to daylight locus"] = "%.2f" % delta["E"] kwargs = {"daylight": False} cct, delta = colormath.xy_CCT_delta(*tag.ir.xyY[:2], **kwargs) if delta: info[u" ΔE 2000 to blackbody locus"] = "%.2f" % delta["E"] if "chad" in self.tags: color = [" ".join(format % (v * 100) for v in tag.pcs.values())] if tag.pcs.values() != [0, 0, 0]: xy = " ".join("%6.4f" % v for v in tag.pcs.xyY[:2]) color.append("(xy %s)" % xy) info[" PCS-relative XYZ"] = " ".join(color) cct, delta = colormath.xy_CCT_delta(*tag.pcs.xyY[:2]) if cct: info[" PCS-relative CCT"] = "%iK" % cct #if delta: #info[u" ΔE 2000 to daylight locus"] = "%.2f" % delta["E"] #kwargs = {"daylight": False} #cct, delta = colormath.xy_CCT_delta(*tag.pcs.xyY[:2], **kwargs) #if delta: #info[u" ΔE 2000 to blackbody locus"] = "%.2f" % delta["E"] else: info[name] = "" info[" Illuminant-relative XYZ"] = " ".join( [" ".join("%6.2f" % (v * 100) for v in tag.ir.values()), "(xy %s)" % " ".join("%6.4f" % v for v in tag.ir.xyY[:2])]) info[" PCS-relative XYZ"] = " ".join( [" ".join("%6.2f" % (v * 100) for v in tag.values()), "(xy %s)" % " ".join("%6.4f" % v for v in tag.xyY[:2])]) elif isinstance(tag, ICCProfileTag): info[name] = "[%i Bytes]" % len(tag.tagData) return info def get_rgb_space(self): tags = self.tags if not "wtpt" in tags: return False rgb_space = [[], tags.wtpt.ir.values()] for component in ("r", "g", "b"): if (not "%sXYZ" % component in tags or not "%sTRC" % component in tags or not isinstance(tags["%sTRC" % component], CurveType)): return False rgb_space.append(tags["%sXYZ" % component].ir.xyY) if len(tags["%sTRC" % component]) > 1: rgb_space[0].append([v / 65535.0 for v in tags["%sTRC" % component]]) else: rgb_space[0].append(tags["%sTRC" % component][0]) return rgb_space def read(self, profile): """ Read profile from binary string, filename or file object. Same as self.__init__(profile) """ self.__init__(profile) def set_edid_metadata(self, edid): """ Sets metadata from EDID Key names follow the ICC meta Tag for Monitor Profiles specification http://www.oyranos.org/wiki/index.php?title=ICC_meta_Tag_for_Monitor_Profiles_0.1 and the GNOME Color Manager metadata specification http://gitorious.org/colord/master/blobs/master/doc/metadata-spec.txt """ if not "meta" in self.tags: self.tags.meta = DictType() spec_prefixes = "EDID_" prefixes = (self.tags.meta.getvalue("prefix", "", None) or spec_prefixes).split(",") for prefix in spec_prefixes.split(","): if not prefix in prefixes: prefixes.append(prefix) # OpenICC keys (some shared with GCM) self.tags.meta.update((("prefix", ",".join(prefixes)), ("EDID_mnft", edid["manufacturer_id"]), ("EDID_mnft_id", struct.unpack(">H", edid["edid"][8:10])[0]), ("EDID_model_id", edid["product_id"]), ("EDID_date", "%0.4i-T%i" % (edid["year_of_manufacture"], edid["week_of_manufacture"])), ("EDID_red_x", edid["red_x"]), ("EDID_red_y", edid["red_y"]), ("EDID_green_x", edid["green_x"]), ("EDID_green_y", edid["green_y"]), ("EDID_blue_x", edid["blue_x"]), ("EDID_blue_y", edid["blue_y"]), ("EDID_white_x", edid["white_x"]), ("EDID_white_y", edid["white_y"]))) manufacturer = edid.get("manufacturer") if manufacturer: self.tags.meta["EDID_manufacturer"] = colord.quirk_manufacturer(manufacturer) if "gamma" in edid: self.tags.meta["EDID_gamma"] = edid["gamma"] monitor_name = edid.get("monitor_name", edid.get("ascii")) if monitor_name: self.tags.meta["EDID_model"] = monitor_name if edid.get("serial_ascii"): self.tags.meta["EDID_serial"] = edid["serial_ascii"] elif edid.get("serial_32"): self.tags.meta["EDID_serial"] = str(edid["serial_32"]) # GCM keys self.tags.meta["EDID_md5"] = edid["hash"] def set_gamut_metadata(self, gamut_volume=None, gamut_coverage=None): """ Sets gamut volume and coverage metadata keys """ if gamut_volume or gamut_coverage: if not "meta" in self.tags: self.tags.meta = DictType() # Update meta prefix prefixes = (self.tags.meta.getvalue("prefix", "", None) or "GAMUT_").split(",") if not "GAMUT_" in prefixes: prefixes.append("GAMUT_") self.tags.meta["prefix"] = ",".join(prefixes) if gamut_volume: # Set gamut size self.tags.meta["GAMUT_volume"] = gamut_volume if gamut_coverage: # Set gamut coverage for key, factor in gamut_coverage.iteritems(): self.tags.meta["GAMUT_coverage(%s)" % key] = factor def write(self, stream_or_filename=None): """ Write profile to stream. This will re-assemble the various profile parts (header, tag table and data) on-the-fly. """ if not stream_or_filename: if self._file: if not self._file.closed: self.close() stream_or_filename = self.fileName if isinstance(stream_or_filename, basestring): stream = open(stream_or_filename, "wb") if not self.fileName: self.fileName = stream_or_filename else: stream = stream_or_filename stream.write(self.data) if isinstance(stream_or_filename, basestring): stream.close() DisplayCAL-3.1.0.0/DisplayCAL/imfile.py0000644000076500000000000002774612647526531017271 0ustar devwheel00000000000000# -*- coding: utf-8 -*- from __future__ import with_statement import math import os import struct import time import zlib from meta import name as appname, version from util_str import safe_str def write(data, stream_or_filename, bitdepth=16, format=None, dimensions=None, extrainfo=None): Image(data, bitdepth, extrainfo).write(stream_or_filename, format, dimensions) class Image(object): """ Write 8 or 16 bit image files in DPX, PNG or TIFF format. Writing of single color images is highly optimized when using a single pixel as image data and setting dimensions explicitly. """ def __init__(self, data, bitdepth=16, extrainfo=None): self.bitdepth = bitdepth self.data = data self.extrainfo = extrainfo or {} def _pack(self, n): n = int(round(n)) if self.bitdepth == 16: data = struct.pack(">H", n) elif self.bitdepth == 8: data = chr(n) else: raise ValueError("Unsupported bitdepth: %r" % self.bitdepth) return data def _write_dpx(self, stream, dimensions=None): # Very helpful: http://www.fileformat.info/format/dpx/egff.htm # http://www.simplesystems.org/users/bfriesen/dpx/S268M_Revised.pdf # Generic file header (768 bytes) stream.write("SDPX") # Magic number stream.write(struct.pack(">I", 8192)) # Offset to image data stream.write("V2.0\0\0\0\0") # ASCII version # Optimize for single color optimize = len(self.data) == 1 and len(self.data[0]) == 1 and dimensions # Image data imgdata = [] # 10-bit code adapted from GraphicsMagick dpx.c:WriteSamples if self.bitdepth == 10: shifts = (22, 12, 2) # RGB for i, scanline in enumerate(self.data): if self.bitdepth == 10: packed = [] for RGB in scanline: packed_u32 = 0 for datum, sample in enumerate(RGB): packed_u32 |= (sample << shifts[datum]) packed.append(struct.pack(">I", packed_u32)) scanline = "".join(packed) else: scanline = "".join("".join(self._pack(v) for v in RGB) for RGB in scanline) if not optimize: # Pad lines with binary zeros so they end on 4-byte boundaries scanline = scanline.ljust(int(math.ceil(len(scanline) / 4.0)) * 4, "\0") imgdata.append(scanline) imgdata = "".join(imgdata) if optimize: # Optimize for single color imgdata *= dimensions[0] # Pad lines with binary zeros so they end on 4-byte boundaries imgdata = imgdata.ljust(int(math.ceil(len(imgdata) / 4.0)) * 4, "\0") imgdata *= dimensions[1] w, h = dimensions else: w, h = len(self.data[0]), len(self.data) # Generic file header (cont.) stream.write(struct.pack(">I", 8192 + len(imgdata))) # File size stream.write("\0\0\0\1") # DittoKey (1 = not same as previous frame) stream.write(struct.pack(">I", 768 + 640 + 256)) # Generic section header length stream.write(struct.pack(">I", 256 + 128)) # Industry-specific section header length stream.write(struct.pack(">I", 0)) # User-defined data length stream.write(safe_str(stream.name or "").ljust(100, "\0")[-100:]) # File name # Date & timestamp tzoffset = round((time.mktime(time.localtime()) - time.mktime(time.gmtime())) / 60.0 / 60.0) if tzoffset < 0: tzoffset = "%.2i" % tzoffset else: tzoffset = "+%.2i" % tzoffset stream.write(time.strftime("%Y:%m:%d:%H:%M:%S") + tzoffset + "\0\0") stream.write(safe_str("%s %s" % (appname, version)).ljust(100, "\0")) # Creator stream.write("\0" * 200) # Project stream.write("\0" * 200) # Copyright stream.write("\xff" * 4) # EncryptKey 0xffffffff = not encrypted stream.write("\0" * 104) # Reserved # Generic image header (640 bytes) stream.write("\0\0") # Orientation 0 = left to right, top to bottom stream.write("\0\1") # Number of image elements stream.write(struct.pack(">I", w)) # Pixels per line stream.write(struct.pack(">I", h)) # Lines per image element # Generic image header - image element stream.write("\0" * 4) # 0 = unsigned data stream.write("\0" * 4) # Reference low data code value stream.write("\xff" * 4) # Reference low quantity stream.write(struct.pack(">I", 2 ** self.bitdepth - 1)) # Reference high data code value stream.write("\xff" * 4) # Reference high quantity stream.write(chr(50)) # Descriptor 50 = RGB stream.write("\2") # Transfer 2 = linear stream.write("\2") # Colorimetric 2 = not applicable stream.write(chr(self.bitdepth)) # BitSize stream.write("\0\1") # Packing 1 = filled 32-bit words stream.write("\0\0") # Encoding 0 = not encoded stream.write(struct.pack(">I", 8192)) # Image data offset stream.write("\0" * 4) # End of line padding stream.write("\0" * 4) # End of image padding stream.write("RGB / Linear".ljust(32, "\0")) # Description # Seven additional unused image elements stream.write("\0" * 72 * 7) # Generic image header (cont.) stream.write("\0" * 52) # Reserved # Generic image source header (256 bytes) sw, sh = [self.extrainfo.get("original_" + dim, locals()[dim[0]]) for dim in ("width", "height")] # X offset stream.write(struct.pack(">I", self.extrainfo.get("offset_x", (sw - w) / 2))) # Y offset stream.write(struct.pack(">I", self.extrainfo.get("offset_y", (sh - h) / 2))) # X center stream.write(struct.pack(">f", self.extrainfo.get("center_x", sw / 2.0))) # Y center stream.write(struct.pack(">f", self.extrainfo.get("center_y", sh / 2.0))) stream.write(struct.pack(">I", sw)) # X original size stream.write(struct.pack(">I", sh)) # Y original size stream.write("\0" * 100) # Source image file name stream.write("\0" * 24) # Source image date & timestamp stream.write("\0" * 32) # Input device name stream.write("\0" * 32) # Input device serial number stream.write("\0" * 2 * 4) # Border stream.write("\0\0\0\1" * 2) # Pixel aspect ratio stream.write("\xff" * 4) # X scanned size stream.write("\xff" * 4) # Y scanned size stream.write("\0" * 20) # Reserved # Industry-specific film info header (256 bytes) stream.write("\0" * 2) # Film mfg. ID code stream.write("\0" * 2) # Film type stream.write("\0" * 2) # Offset in perfs stream.write("\0" * 6) # Prefix stream.write("\0" * 4) # Count stream.write("\0" * 32) # Format # Frame position in sequence stream.write(struct.pack(">I", self.extrainfo.get("frame_position", 2 ** 32 - 1))) # Sequence length stream.write(struct.pack(">I", self.extrainfo.get("sequence_length", 2 ** 32 - 1))) # Held count stream.write(struct.pack(">I", self.extrainfo.get("held_count", 1))) # Frame rate of original if "frame_rate" in self.extrainfo: stream.write(struct.pack(">f", self.extrainfo["frame_rate"])) else: stream.write("\xff" * 4) # Shutter angle of camera in degrees stream.write("\xff" * 4) stream.write("\0" * 32) # Frame identification - e.g. keyframe stream.write("\0" * 100) # Slate stream.write("\0" * 56) # Reserved # Industry-specific TV info header (128 bytes) # SMPTE time code stream.write("".join(chr(int(str(v), 16)) for v in self.extrainfo.get("timecode", ["ff"] * 4))) stream.write("\xff" * 4) # User bits stream.write("\xff") # Interlace stream.write("\xff") # Field number stream.write("\xff") # Video signal standard stream.write("\0") # Zero for byte alignment stream.write("\xff" * 4) # H sampling rate Hz stream.write("\xff" * 4) # V sampling rate Hz # Temporal sampling or frame rate Hz if "frame_rate" in self.extrainfo: stream.write(struct.pack(">f", self.extrainfo["frame_rate"])) else: stream.write("\xff" * 4) stream.write("\xff" * 4) # Time offset in ms from sync to 1st pixel stream.write("\xff" * 4) # Gamma stream.write("\xff" * 4) # Black level code value stream.write("\xff" * 4) # Black gain stream.write("\xff" * 4) # Breakpoint stream.write("\xff" * 4) # Reference white level code value stream.write("\xff" * 4) # Integration time in s stream.write("\0" * 76) # Reserved # Padding so image data begins at 8K boundary stream.write("\0" * 6144) # Write image data stream.write(imgdata) def _write_png(self, stream, dimensions=None): # Header stream.write("\x89PNG\r\n\x1a\n") # IHDR image header length stream.write(struct.pack(">I", 13)) # IHDR image header chunk type ihdr = ["IHDR"] # Optimize for single color optimize = len(self.data) == 1 and len(self.data[0]) == 1 and dimensions # IHDR: width, height if optimize: w, h = dimensions else: w, h = len(self.data[0]), len(self.data) ihdr.extend([struct.pack(">I", w), struct.pack(">I", h)]) # IHDR: Bit depth ihdr.append(chr(self.bitdepth)) # IHDR: Color type 2 (truecolor) ihdr.append("\2") # IHDR: Compression method 0 (deflate) ihdr.append("\0") # IHDR: Filter method 0 (adaptive) ihdr.append("\0") # IHDR: Interlace method 0 (none) ihdr.append("\0") ihdr = "".join(ihdr) stream.write(ihdr) stream.write(struct.pack(">I", zlib.crc32(ihdr) & 0xFFFFFFFF)) # IDAT image data chunk type imgdata = [] for i, scanline in enumerate(self.data): # Add a scanline, filter type 0 imgdata.append("\0") for RGB in scanline: RGB = "".join(self._pack(v) for v in RGB) if optimize: RGB *= dimensions[0] imgdata.append(RGB) imgdata = "".join(imgdata) if optimize: imgdata *= dimensions[1] imgdata = zlib.compress(imgdata, 9) stream.write(struct.pack(">I", len(imgdata))) idat = ["IDAT"] idat.append(imgdata) idat = "".join(idat) stream.write(idat) stream.write(struct.pack(">I", zlib.crc32(idat) & 0xFFFFFFFF)) # IEND chunk stream.write("\0" * 4) stream.write("IEND") stream.write(struct.pack(">I", zlib.crc32("IEND") & 0xFFFFFFFF)) def _write_tiff(self, stream, dimensions=None): # Very helpful: http://www.fileformat.info/format/tiff/corion.htm # Header stream.write("MM\0*") # Note: We use big-endian byte order # Offset of image directory stream.write("\0\0\0\x08") # Image data imgdata = [] for i, scanline in enumerate(self.data): for RGB in scanline: imgdata.append("".join(self._pack(v) for v in RGB)) imgdata = "".join(imgdata) if len(self.data) == 1 and len(self.data[0]) == 1 and dimensions: # Optimize for single color imgdata *= dimensions[0] * dimensions[1] w, h = dimensions else: w, h = len(self.data[0]), len(self.data) # Image file directory (IFD) # Tag, type, length, offset or data, is data (otherwise offset) ifd = [(0x100, 3, 1, w, True), # ImageWidth (0x101, 3, 1, h, True), # ImageLength (0x106, 3, 1, 2, True), # PhotometricInterpretation (0x115, 3, 1, 3, True), # SamplesPerPixel (0x117, 4, 1, len(imgdata), True) # StripByteCounts ] # BitsPerSample ifd.append((0x102, 3, 3, 10 + (len(ifd) + 2) * 12 + 4, False)) # StripOffsets ifd.append((0x111, 3, 1, 10 + (len(ifd) + 1) * 12 + 4 + 6, True)) ifd.sort() # Must be ascending order! stream.write(struct.pack(">H", len(ifd))) # Number of entries for tag, tagtype, length, payload, is_data in ifd: stream.write(struct.pack(">H", tag)) stream.write(struct.pack(">H", tagtype)) stream.write(struct.pack(">I", length)) if is_data and tagtype == 3: # A word left-aligned in a dword stream.write(struct.pack(">H", payload)) stream.write("\0\0") else: stream.write(struct.pack(">I", payload)) # PlanarConfiguration default is 1 = RGBRGBRGB... # End of IFD stream.write("\0" * 4) # BitsPerSample (6 bytes) stream.write(struct.pack(">H", self.bitdepth) * 3) # Write image data stream.write(imgdata) def write(self, stream_or_filename, format=None, dimensions=None): if not format: if isinstance(stream_or_filename, basestring): format = os.path.splitext(stream_or_filename)[1].lstrip(".").upper() if format == "TIF": format += "F" else: format = "PNG" if not hasattr(self, "_write_" + format.lower()): raise ValueError("Unsupported format: %r" % format) if isinstance(stream_or_filename, basestring): stream = open(stream_or_filename, "wb") else: stream = stream_or_filename with stream: getattr(self, "_write_" + format.lower())(stream, dimensions) DisplayCAL-3.1.0.0/DisplayCAL/jsondict.py0000644000076500000000000000772012647526531017627 0ustar devwheel00000000000000# -*- coding: utf-8 -*- import codecs import os import demjson from config import get_data_path from debughelpers import handle_error from util_str import safe_unicode class JSONDict(dict): """ JSON dictionary with key -> value mappings. The actual mappings are loaded from the source JSON file when they are accessed. """ def __init__(self, path=None, encoding="UTF-8", errors="strict"): dict.__init__(self) self._isloaded = False self.path = path self.encoding = encoding self.errors = errors def __cmp__(self, other): self.load() return dict.__cmp__(self, other) def __contains__(self, key): self.load() return dict.__contains__(self, key) def __delitem__(self, key): self.load() dict.__delitem__(self, key) def __delslice__(self, i, j): self.load() dict.__delslice__(self, i, j) def __eq__(self, other): self.load() return dict.__eq__(self, other) def __ge__(self, other): self.load() return dict.__ge__(self, other) def __getitem__(self, name): self.load() return dict.__getitem__(self, name) def __getslice__(self, i, j): self.load() return dict.__getslice__(self, i, j) def __gt__(self, other): self.load() return dict.__gt__(self, other) def __iter__(self): self.load() return dict.__iter__(self) def __le__(self, other): self.load() return dict.__le__(self, other) def __len__(self): self.load() return dict.__len__(self) def __lt__(self, other): self.load() return dict.__lt__(self, other) def __ne__(self, other): self.load() return dict.__ne__(self, other) def __repr__(self): self.load() return dict.__repr__(self) def __setitem__(self, name, value): self.load() dict.__setitem__(self, name, value) def __sizeof__(self): self.load() return dict.__sizeof__(self) def clear(self): if not self._isloaded: self._isloaded = True dict.clear(self) def copy(self): self.load() return dict.copy(self) def get(self, name, fallback=None): self.load() return dict.get(self, name, fallback) def has_key(self, name): self.load() return dict.has_key(self, name) def items(self): self.load() return dict.items(self) def iteritems(self): self.load() return dict.iteritems(self) def iterkeys(self): self.load() return dict.iterkeys(self) def itervalues(self): self.load() return dict.itervalues(self) def keys(self): self.load() return dict.keys(self) def load(self, path=None, encoding=None, errors=None): if not self._isloaded and (path or self.path): self._isloaded = True if not path: path = self.path if path and not os.path.isabs(path): path = get_data_path(path) if path and os.path.isfile(path): self.path = path if encoding: self.encoding = encoding if errors: self.errors = errors else: handle_error(UserWarning(u"Warning - JSON file '%s' not found" % safe_unicode(path))) return try: jsonfile = codecs.open(path, "rU", self.encoding, self.errors) try: dict.update(self, demjson.decode(jsonfile.read())) except (UnicodeDecodeError, demjson.JSONDecodeError), exception: handle_error(UserWarning( u"Warning - JSON file '%s': %s" % tuple(safe_unicode(s) for s in (path, safe_unicode(exception).capitalize() if isinstance(exception, demjson.JSONDecodeError) else exception)))) except Exception, exception: handle_error(UserWarning(u"Warning - JSON file '%s': %s" % tuple(safe_unicode(s) for s in (path, exception)))) else: jsonfile.close() def pop(self, key, *args): self.load() return dict.pop(self, key, *args) def popitem(self, name, value): self.load() return dict.popitem(self, name, value) def setdefault(self, name, value=None): self.load() return dict.setdefault(self, name, value) def update(self, other): self.load() dict.update(self, other) def values(self): self.load() return dict.values(self) DisplayCAL-3.1.0.0/DisplayCAL/jspacker.py0000644000076500000000000005426712647526531017624 0ustar devwheel00000000000000# -*- coding: utf-8 -*- ## ParseMaster, version 1.0 (pre-release) (2005/05/12) x6 ## Copyright 2005, Dean Edwards ## Web: http://dean.edwards.name/ ## ## This software is licensed under the CC-GNU LGPL ## Web: http://creativecommons.org/licenses/LGPL/2.1/ ## ## Ported to Python by Florian Schulze import os, re, sys # a multi-pattern parser class Pattern: def __init__(self, expression, replacement, length): self.expression = expression self.replacement = replacement self.length = length def __str__(self): return "(" + self.expression + ")" class Patterns(list): def __str__(self): return '|'.join([str(e) for e in self]) class ParseMaster: # constants EXPRESSION = 0 REPLACEMENT = 1 LENGTH = 2 GROUPS = re.compile(r"""\(""", re.M)#g SUB_REPLACE = re.compile(r"""\$\d""", re.M) INDEXED = re.compile(r"""^\$\d+$""", re.M) TRIM = re.compile(r"""(['"])\1\+(.*)\+\1\1$""", re.M) ESCAPE = re.compile(r"""\\.""", re.M)#g #QUOTE = re.compile(r"""'""", re.M) DELETED = re.compile("""\x01[^\x01]*\x01""", re.M)#g def __init__(self): # private self._patterns = Patterns() # patterns stored by index self._escaped = [] self.ignoreCase = False self.escapeChar = None def DELETE(self, match, offset): return "\x01" + match.group(offset) + "\x01" def _repl(self, a, o, r, i): while (i): m = a.group(o+i-1) if m is None: s = "" else: s = m r = r.replace("$" + str(i), s) i = i - 1 r = ParseMaster.TRIM.sub("$1", r) return r # public def add(self, expression="^$", replacement=None): if replacement is None: replacement = self.DELETE # count the number of sub-expressions # - add one because each pattern is itself a sub-expression length = len(ParseMaster.GROUPS.findall(self._internalEscape(str(expression)))) + 1 # does the pattern deal with sub-expressions? if (isinstance(replacement, str) and ParseMaster.SUB_REPLACE.match(replacement)): # a simple lookup? (e.g. "$2") if (ParseMaster.INDEXED.match(replacement)): # store the index (used for fast retrieval of matched strings) replacement = int(replacement[1:]) - 1 else: # a complicated lookup (e.g. "Hello $2 $1") # build a function to do the lookup i = length r = replacement replacement = lambda a,o: self._repl(a,o,r,i) # pass the modified arguments self._patterns.append(Pattern(expression, replacement, length)) # execute the global replacement def execute(self, string): if self.ignoreCase: r = re.compile(str(self._patterns), re.I | re.M) else: r = re.compile(str(self._patterns), re.M) string = self._escape(string, self.escapeChar) string = r.sub(self._replacement, string) string = self._unescape(string, self.escapeChar) string = ParseMaster.DELETED.sub("", string) return string # clear the patterns collections so that this object may be re-used def reset(self): self._patterns = Patterns() # this is the global replace function (it's quite complicated) def _replacement(self, match): i = 1 # loop through the patterns for pattern in self._patterns: if match.group(i) is not None: replacement = pattern.replacement if callable(replacement): return replacement(match, i) elif isinstance(replacement, (int, long)): return match.group(replacement+i) else: return replacement else: i = i+pattern.length # encode escaped characters def _escape(self, string, escapeChar=None): def repl(match): char = match.group(1) self._escaped.append(char) return escapeChar if escapeChar is None: return string r = re.compile("\\"+escapeChar+"(.)", re.M) result = r.sub(repl, string) return result # decode escaped characters def _unescape(self, string, escapeChar=None): def repl(match): try: #result = eval("'"+escapeChar + self._escaped.pop(0)+"'") result = escapeChar + self._escaped.pop(0) return result except IndexError: return escapeChar if escapeChar is None: return string r = re.compile("\\"+escapeChar, re.M) result = r.sub(repl, string) return result def _internalEscape(self, string): return ParseMaster.ESCAPE.sub("", string) ## packer, version 2.0 (2005/04/20) ## Copyright 2004-2005, Dean Edwards ## License: http://creativecommons.org/licenses/LGPL/2.1/ ## Ported to Python by Florian Schulze ## http://dean.edwards.name/packer/ class JavaScriptPacker: def __init__(self): pass def basicCompression(self, script): return self.getCompressionParseMaster(False, script) def specialCompression(self, script): return self.getCompressionParseMaster(True, script) def getCompressionParseMaster(self, specialChars, script): IGNORE = "$1" parser = ParseMaster() parser.escapeChar = '\\' # protect strings parser.add(r"""'[^'\n\r]*'""", IGNORE) parser.add(r'"[^"\n\r]*"', IGNORE) # remove comments parser.add(r"""//[^\n\r]*[\n\r]""") parser.add(r"""/\*[^*]*\*+([^/][^*]*\*+)*/""") # protect regular expressions parser.add(r"""\s+(\/[^\/\n\r\*][^\/\n\r]*\/g?i?)""", "$2") parser.add(r"""[^\w\$\/'"*)\?:]\/[^\/\n\r\*][^\/\n\r]*\/g?i?""", IGNORE) # remove: ;;; doSomething(); if specialChars: parser.add(""";;;[^\n\r]+[\n\r]""") # remove redundant semi-colons parser.add(r"""\(;;\)""", "$2") # protect for (;;) loops parser.add(r""";+\s*([};])""", "$2") # apply the above script = parser.execute(script) # remove white-space parser.add(r"""(\b|\$)\s+(\b|\$)""", "$2 $3") parser.add(r"""([+\-])\s+([+\-])""", "$2 $3") parser.add(r"""\s+""", "") return parser.execute(script) def getEncoder(self, ascii): mapping = {} base = ord('0') mapping.update(dict([(i, chr(i+base)) for i in range(10)])) base = ord('a') mapping.update(dict([(i+10, chr(i+base)) for i in range(26)])) base = ord('A') mapping.update(dict([(i+36, chr(i+base)) for i in range(26)])) base = 161 mapping.update(dict([(i+62, chr(i+base)) for i in range(95)])) # zero encoding # characters: 0123456789 def encode10(charCode): return str(charCode) # inherent base36 support # characters: 0123456789abcdefghijklmnopqrstuvwxyz def encode36(charCode): l = [] remainder = charCode while 1: result, remainder = divmod(remainder, 36) l.append(mapping[remainder]) if not result: break remainder = result l.reverse() return "".join(l) # hitch a ride on base36 and add the upper case alpha characters # characters: 0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ def encode62(charCode): l = [] remainder = charCode while 1: result, remainder = divmod(remainder, 62) l.append(mapping[remainder]) if not result: break remainder = result l.reverse() return "".join(l) # use high-ascii values def encode95(charCode): l = [] remainder = charCode while 1: result, remainder = divmod(remainder, 95) l.append(mapping[remainder+62]) if not result: break remainder = result l.reverse() return "".join(l) if ascii <= 10: return encode10 elif ascii <= 36: return encode36 elif ascii <= 62: return encode62 return encode95 def escape(self, script): script = script.replace("\\","\\\\") script = script.replace("'","\\'") script = script.replace('\n','\\n') #return re.sub(r"""([\\'](?!\n))""", "\\$1", script) return script def escape95(self, script): result = [] for x in script: if x>'\xa1': x = "\\x%0x" % ord(x) result.append(x) return "".join(result) def encodeKeywords(self, script, encoding, fastDecode): # escape high-ascii values already in the script (i.e. in strings) if (encoding > 62): script = self.escape95(script) # create the parser parser = ParseMaster() encode = self.getEncoder(encoding) # for high-ascii, don't encode single character low-ascii if encoding > 62: regexp = r"""\w\w+""" else: regexp = r"""\w+""" # build the word list keywords = self.analyze(script, regexp, encode) encoded = keywords['encoded'] # encode def repl(match, offset): return encoded.get(match.group(offset), "") parser.add(regexp, repl) # if encoded, wrap the script in a decoding function script = parser.execute(script) script = self.bootStrap(script, keywords, encoding, fastDecode) return script def analyze(self, script, regexp, encode): # analyse # retreive all words in the script regexp = re.compile(regexp, re.M) all = regexp.findall(script) sorted = [] # list of words sorted by frequency encoded = {} # dictionary of word->encoding protected = {} # instances of "protected" words if all: unsorted = [] _protected = {} values = {} count = {} all.reverse() for word in all: word = "$"+word if word not in count: count[word] = 0 j = len(unsorted) unsorted.append(word) # make a dictionary of all of the protected words in this script # these are words that might be mistaken for encoding values[j] = encode(j) _protected["$"+values[j]] = j count[word] = count[word] + 1 # prepare to sort the word list, first we must protect # words that are also used as codes. we assign them a code # equivalent to the word itself. # e.g. if "do" falls within our encoding range # then we store keywords["do"] = "do"; # this avoids problems when decoding sorted = [None] * len(unsorted) for word in unsorted: if word in _protected and isinstance(_protected[word], int): sorted[_protected[word]] = word[1:] protected[_protected[word]] = True count[word] = 0 unsorted.sort(lambda a,b: count[b]-count[a]) j = 0 for i in range(len(sorted)): if sorted[i] is None: sorted[i] = unsorted[j][1:] j = j + 1 encoded[sorted[i]] = values[i] return {'sorted': sorted, 'encoded': encoded, 'protected': protected} def encodePrivate(self, charCode): return "_"+str(charCode) def encodeSpecialChars(self, script): parser = ParseMaster() # replace: $name -> n, $$name -> $$na def repl(match, offset): #print offset, match.groups() length = len(match.group(offset + 2)) start = length - max(length - len(match.group(offset + 3)), 0) return match.group(offset + 1)[start:start+length] + match.group(offset + 4) parser.add(r"""((\$+)([a-zA-Z\$_]+))(\d*)""", repl) # replace: _name -> _0, double-underscore (__name) is ignored regexp = r"""\b_[A-Za-z\d]\w*""" # build the word list keywords = self.analyze(script, regexp, self.encodePrivate) # quick ref encoded = keywords['encoded'] def repl(match, offset): return encoded.get(match.group(offset), "") parser.add(regexp, repl) return parser.execute(script) # build the boot function used for loading and decoding def bootStrap(self, packed, keywords, encoding, fastDecode): ENCODE = re.compile(r"""\$encode\(\$count\)""") # $packed: the packed script #packed = self.escape(packed) #packed = [packed[x*10000:(x+1)*10000] for x in range((len(packed)/10000)+1)] #packed = "'" + "'+\n'".join(packed) + "'\n" packed = "'" + self.escape(packed) + "'" # $count: number of words contained in the script count = len(keywords['sorted']) # $ascii: base for encoding ascii = min(count, encoding) or 1 # $keywords: list of words contained in the script for i in keywords['protected']: keywords['sorted'][i] = "" # convert from a string to an array keywords = "'" + "|".join(keywords['sorted']) + "'.split('|')" encoding_functions = { 10: """ function($charCode) { return $charCode; }""", 36: """ function($charCode) { return $charCode.toString(36); }""", 62: """ function($charCode) { return ($charCode < _encoding ? "" : arguments.callee(parseInt($charCode / _encoding))) + (($charCode = $charCode % _encoding) > 35 ? String.fromCharCode($charCode + 29) : $charCode.toString(36)); }""", 95: """ function($charCode) { return ($charCode < _encoding ? "" : arguments.callee($charCode / _encoding)) + String.fromCharCode($charCode % _encoding + 161); }""" } # $encode: encoding function (used for decoding the script) encode = encoding_functions[encoding] encode = encode.replace('_encoding',"$ascii") encode = encode.replace('arguments.callee', "$encode") if ascii > 10: inline = "$count.toString($ascii)" else: inline = "$count" # $decode: code snippet to speed up decoding if fastDecode: # create the decoder decode = r"""// does the browser support String.replace where the // replacement value is a function? if (!''.replace(/^/, String)) { // decode all the values we need while ($count--) { $decode[$encode($count)] = $keywords[$count] || $encode($count); } // global replacement function $keywords = [function($encoded){return $decode[$encoded]}]; // generic match $encode = function(){return'\\w+'}; // reset the loop counter - we are now doing a global replace $count = 1; }""" if encoding > 62: decode = decode.replace('\\\\w', "[\\xa1-\\xff]") else: # perform the encoding inline for lower ascii values if ascii < 36: decode = ENCODE.sub(inline, decode) # special case: when $count==0 there ar no keywords. i want to keep # the basic shape of the unpacking funcion so i'll frig the code... if not count: raise NotImplemented #) $decode = $decode.replace(/(\$count)\s*=\s*1/, "$1=0"); # boot function unpack = r"""function($packed, $ascii, $count, $keywords, $encode, $decode) { while ($count--) { if ($keywords[$count]) { $packed = $packed.replace(new RegExp("\\b" + $encode($count) + "\\b", "g"), $keywords[$count]); } } return $packed; }""" if fastDecode: # insert the decoder #unpack = re.sub(r"""\{""", "{" + decode + ";", unpack) unpack = unpack.replace('{', "{" + decode + ";", 1) if encoding > 62: # high-ascii # get rid of the word-boundaries for regexp matches unpack = re.sub(r"""'\\\\b'\s*\+|\+\s*'\\\\b'""", "", unpack) if ascii > 36 or encoding > 62 or fastDecode: # insert the encode function #unpack = re.sub(r"""\{""", "{$encode=" + encode + ";", unpack) unpack = unpack.replace('{', "{$encode=" + encode + ";", 1) else: # perform the encoding inline unpack = ENCODE.sub(inline, unpack) # pack the boot function too unpack = self.pack(unpack, 0, False, True) # arguments params = [packed, str(ascii), str(count), keywords] if fastDecode: # insert placeholders for the decoder params.extend(['0', "{}"]) # the whole thing return "eval(" + unpack + "(" + ",".join(params) + "))\n"; def pack(self, script, encoding=0, fastDecode=False, specialChars=False, compaction=True): script = script+"\n" self._encoding = encoding self._fastDecode = fastDecode if specialChars: script = self.specialCompression(script) script = self.encodeSpecialChars(script) else: if compaction: script = self.basicCompression(script) if encoding: script = self.encodeKeywords(script, encoding, fastDecode) return script def run(): p = JavaScriptPacker() script = open(sys.argv[1]).read() result = p.pack(script, encoding=62, fastDecode=True, compaction=True) open(sys.argv[1] + 'pack', 'w').write(result) def run1(): test_scripts = [] test_scripts.append(("""// ----------------------------------------------------------------------- // public interface // ----------------------------------------------------------------------- cssQuery.toString = function() { return "function cssQuery() {\n [version " + version + "]\n}"; };""", 0, False, False, """cssQuery.toString=function(){return"function cssQuery() {\n [version "+version+"]\n}"};""")) test_scripts.append(("""function test(_localvar) { var $name = 'foo'; var $$dummy = 2; return $name + $$dummy; }""", 0, False, True, """function test(_0){var n='foo';var du=2;return n+du}""")) test_scripts.append(("""function _test($localvar) { var $name = 1; var _dummy = 2; var __foo = 3; return $name + _dummy + $localvar + __foo; }""", 0, False, True, """function _1(l){var n=1;var _0=2;var __foo=3;return n+_0+l+__foo}""")) test_scripts.append(("""function _test($localvar) { var $name = 1; var _dummy = 2; var __foo = 3; return $name + _dummy + $localvar + __foo; } function _bar(_ocalvar) { var $name = 1; var _dummy = 2; var __foo = 3; return $name + _dummy + $localvar + __foo; }""", 0, False, True, """function _3(l){var n=1;var _0=2;var __foo=3;return n+_0+l+__foo}function _2(_1){var n=1;var _0=2;var __foo=3;return n+_0+l+__foo}""")) test_scripts.append(("cssQuery1.js", 0, False, False, "cssQuery1-p1.js")) test_scripts.append(("cssQuery.js", 0, False, False, "cssQuery-p1.js")) test_scripts.append(("pack.js", 0, False, False, "pack-p1.js")) test_scripts.append(("cssQuery.js", 0, False, True, "cssQuery-p2.js")) # the following ones are different, because javascript might use an # unstable sort algorithm while python uses an stable sort algorithm test_scripts.append(("pack.js", 0, False, True, "pack-p2.js")) test_scripts.append(("test.js", 0, False, True, """function _4(l){var n=1;var _0=2;var __foo=3;return n+_0+l+__foo}function _3(_1){var n=1;var _2=2;var __foo=3;return n+_2+l+__foo}""")) test_scripts.append(("test.js", 10, False, False, """eval(function(p,a,c,k,e,d){while(c--){if(k[c]){p=p.replace(new RegExp("\\b"+e(c)+"\\b","g"),k[c])}}return p}('8 13($6){0 $4=1;0 7=2;0 5=3;9 $4+7+$6+5}8 11(12){0 $4=1;0 10=2;0 5=3;9 $4+10+$6+5}',10,14,'var||||name|__foo|localvar|_dummy|function|return|_2|_bar|_ocalvar|_test'.split('|'))) """)) test_scripts.append(("test.js", 62, False, False, """eval(function(p,a,c,k,e,d){while(c--){if(k[c]){p=p.replace(new RegExp("\\b"+e(c)+"\\b","g"),k[c])}}return p}('8 d($6){0 $4=1;0 7=2;0 5=3;9 $4+7+$6+5}8 b(c){0 $4=1;0 a=2;0 5=3;9 $4+a+$6+5}',14,14,'var||||name|__foo|localvar|_dummy|function|return|_2|_bar|_ocalvar|_test'.split('|'))) """)) test_scripts.append(("test.js", 95, False, False, "test-p4.js")) test_scripts.append(("cssQuery.js", 0, False, True, "cssQuery-p3.js")) test_scripts.append(("cssQuery.js", 62, False, True, "cssQuery-p4.js")) import difflib p = JavaScriptPacker() for script, encoding, fastDecode, specialChars, expected in test_scripts: if os.path.exists(script): _script = open(script).read() else: _script = script if os.path.exists(expected): _expected = open(expected).read() else: _expected = expected print script[:20], encoding, fastDecode, specialChars, expected[:20] print "="*40 result = p.pack(_script, encoding, fastDecode, specialChars) print len(result), len(_script) if (result != _expected): print "ERROR!!!!!!!!!!!!!!!!" print _expected print result #print list(difflib.unified_diff(result, _expected)) if __name__=='__main__': run() DisplayCAL-3.1.0.0/DisplayCAL/lang/0000755000076500000000000000000012653527012016343 5ustar devwheel00000000000000DisplayCAL-3.1.0.0/DisplayCAL/lang/de.json0000644000076500000000000025450212653526635017650 0ustar devwheel00000000000000{ "*": "Note to translators: Keys which are not yet translated are marked with a leading asterisk (*) and are indented with two tabs instead of one. Please remove the asterisk when translated.", "!author": "Florian Höch", "!language": "Deutsch", "!language_name": "GERMAN", "3dlut": "3D LUT", "3dlut.1dlut.videolut.nonlinear": "Die Grafikkarten-Gammatabelle des Anzeigegeräts enthält nichtlineare Kalibrierungskurven, und die 3D LUT enthält angewendete Kalibrierungskurven. Bitte setzen Sie die Grafikkarten-Gammatabelle vor jeder Verwendung der 3D LUT in einen linearen Zustand zurück, oder erstellen Sie eine 3D LUT ohne angewendete Kaliebrierungskurven (in letzterem Fall aktivieren Sie „Erweiterte Optionen zeigen“ im „Optionen“-Menü und deaktivieren Sie „Kaliebrierung (vcgt) anwenden“ sowie „Nach Profilierung 3D LUT erstellen“, und erzeugen Sie eine neue 3D LUT).", "3dlut.bitdepth.input": "3D LUT Eingabe-Bittiefe", "3dlut.bitdepth.output": "3D LUT Ausgabe-Bittiefe", "3dlut.create": "3D LUT erstellen...", "3dlut.create_after_profiling": "Nach Profilierung 3D LUT erstellen", "3dlut.enable": "3D LUT verwenden", "3dlut.encoding.input": "Eingabe-Kodierung", "3dlut.encoding.output": "Ausgabe-Kodierung", "3dlut.encoding.output.warning.madvr": "Warnung: Diese Ausgabe-Kodierung ist nicht empfohlen und wird „Clipping“ verursachen, falls madVR nicht ausgabeseitig auf „TV-Pegel (16-235)“ unter „Geräte“ → „%s“ → „Eigenschaften“ eingestellt ist. Benutzung auf eigene Gefahr!", "3dlut.encoding.type_2": "TV Rec. 2020 YCbCr UHD", "3dlut.encoding.type_5": "TV Rec. 709 1250/50Hz YCbCr HD", "3dlut.encoding.type_6": "TV Rec. 601 YCbCr SD", "3dlut.encoding.type_7": "TV Rec. 709 1125/60Hz YCbCr HD", "3dlut.encoding.type_C": "TV Rec. 2020 konstante Luminanz YCbCr UHD", "3dlut.encoding.type_T": "TV RGB 16-235 (WTW abschneiden)", "3dlut.encoding.type_X": "TV xvYCC Rec. 709 YCbCr HD", "3dlut.encoding.type_n": "Voller Bereich RGB 0-255", "3dlut.encoding.type_t": "TV RGB 16-235", "3dlut.encoding.type_x": "TV xvYCC Rec. 601 YCbCr (Rec. 709 Primärfarben) SD", "3dlut.format": "3D LUT Dateiformat", "3dlut.format.3dl": "Autodesk Lustre / Kodak Look Manager System (.3dl)", "*3dlut.format.ReShade": "ReShade (.png, .fx)", "3dlut.format.cube": "IRIDAS (.cube)", "3dlut.format.eeColor": "eeColor Processor (.txt)", "3dlut.format.madVR": "madVR (.3dlut)", "3dlut.format.mga": "Pandora (.mga)", "*3dlut.format.png": "PNG (.png)", "3dlut.format.spi3d": "Sony Imageworks (.spi3d)", "3dlut.frame.title": "3D LUT erstellen", "3dlut.holder.assign_preset": "3D LUT folgender Voreinstellung zuweisen:", "3dlut.holder.out_of_memory": "%s hat keinen ausreichenden 3D LUT Speicherplatz mehr (mindestens %i KB benötigt). Bitte löschen Sie einige 3D LUTs von %s, um Platz zu schaffen. Konsultieren Sie die Dokumentation Ihres %s, um weitere Informationen zu erhalten.", "3dlut.input.colorspace": "Quellfarbraum", "3dlut.input.profile": "Quellprofil", "3dlut.install": "3D LUT installieren", "3dlut.install.failure": "Installation der 3D LUT ist fehlgeschlagen (unbekannter Fehler).", "3dlut.install.success": "3D LUT erfolgreich installiert!", "3dlut.install.unsupported": "Das gewählte 3D LUT Format unterstützt keine Installation.", "3dlut.save_as": "3D LUT sichern unter...", "3dlut.settings": "3D LUT Einstellungen", "3dlut.size": "3D LUT Größe", "3dlut.tab.enable": "3D-LUT-Reiter aktivieren", "3dlut.use_abstract_profile": "Abstraktes (“Look”) Profil", "CMP_Digital_Target-3.cie": "CMP Digital Target 3", "CMP_Digital_Target-4.cie": "CMP Digital Target 4", "CMYK_IDEAlliance_ControlStrip_2009.ti1": "IDEAlliance Control Strip 2009", "ColorChecker.cie": "ColorChecker", "ColorCheckerDC.cie": "ColorChecker DC", "ColorCheckerPassport.cie": "ColorChecker Passport", "ColorCheckerSG.cie": "ColorChecker SG", "FograStrip2.ti1": "Fogra-Medienkeil CMYK V2.0", "FograStrip3.ti1": "Fogra-Medienkeil CMYK V3.0", "ISO_12646-2008_color_accuracy_and_gray_balance.ti1": "ISO 12646:2008 Farbgenauigkeit und Graubalance", "QPcard_201.cie": "QPcard 201", "QPcard_202.cie": "QPcard 202", "SpyderChecker.cie": "SpyderCHECKR", "Untethered": "Nicht verbunden", "[rgb]TRC": "Farbtonwiedergabekurven", "aborted": "...abgebrochen.", "aborting": "Breche ab, bitte warten (dies kann einige Sekunden dauern)...", "abstract_profile": "Abstraktes Profil", "active_matrix_display": "Aktiv-Matrix Anzeigegerät", "adaptive_mode_unavailable": "Der adaptive Modus ist erst mit Argyll CMS 1.1.0 RC3 oder neuer verfügbar.", "allow_skip_sensor_cal": "Überspringen der Spektrometer-Kalibrierung erlauben", "ambient.measure": "Umgebungslicht messen", "ambient.measure.color.unsupported": "%s: Die Farbe des Umgebungslichts konnte mit diesem Messgerät nicht ermittelt werden, da es scheinbar nur einen monochromen Umgebungslichtsensor besitzt (es wurde nur ein Helligkeitswert zurückgegeben).", "ambient.measure.light_level.missing": "Es wurde kein Helligkeitswert zurückgegeben.", "ambient.set": "Möchten sie auch die Umgebungshelligkeit auf den gemessenen Wert setzen?", "app.client.connect": "Skript-Client %s:%s hat Verbindung hergestellt", "app.client.disconnect": "Skript-Client %s:%s hat Verbindung getrennt", "app.client.ignored": "Verbindungsversuch von Skript-Client %s:%s abgewiesen: %s", "app.client.network.disallowed": "Verbindungsversuch von Skript-Client %s:%s abgewiesen: Netzwerkclients sind nicht zugelassen.", "app.confirm_restore_defaults": "Wollen Sie wirklich Ihre Einstellungen verwerfen und die Standardeinstellungen wiederherstellen?", "app.detected.calibration_loading_disabled": "%s erkannt. Kalibrierung laden deaktiviert.", "app.detection_lost.calibration_loading_enabled": "%s nicht länger erkannt. Kalibrierung laden aktiviert.", "app.incoming_message": "Skript-Anfrage erhalten von %s:%s: %s", "app.incoming_message.invalid": "Skript-Anfrage ungültig!", "app.listening": "Starte Skript-Host unter %s:%s", "app.otherinstance": "%s läuft bereits.", "app.otherinstance.notified": "Bereits laufende Instanz wurde benachrichtigt.", "app.restart_request": "Bitte starten Sie die Anwendung neu.", "apply": "Anwenden", "apply_black_output_offset": "Schwarzausgabeoffset anwenden (100%)", "apply_cal": "Kalibrierung (vcgt) anwenden", "apply_cal.error": "Kalibrierung konnte nicht angewendet werden.", "apply_trc": "Tonwertkurve anwenden", "archive.create": "Komprimierte Archivdatei erstellen...", "archive.import": "Archivdatei importieren...", "archive.include_3dluts": "Möchten Sie auch 3D-LUT-Dateien dem Archiv hinzufügen (nicht empfohlen, führt zu größerer Archivdatei)?", "argyll.debug.warning1": "Bitte benutzen Sie diese Option nur, wenn Sie Debugging-Informationen wirklich benötigen (z.B. zur tiefgreifenden Fehlersuche in Argyll CMS)! In der Regel ist diese Option nur für Software-Entwickler zum Auffinden und Beheben von Problemen nützlich. Möchten Sie die Debugging-Ausgabe wirklich aktivieren?", "argyll.debug.warning2": "Bitte vergessen Sie nicht, die Debugging-Ausgabe für den normalen Betrieb der Software wieder zu deaktivieren.", "argyll.dir": "Argyll-CMS-Programmverzeichnis:", "argyll.dir.invalid": "Argyll-CMS-Programmdateien nicht gefunden!\nBitte legen Sie das Verzeichnis fest, in dem sich die ausführbaren Dateien mit den folgenden möglichen Namen und eventuellem „argyll-“-Präfix oder „-argyll“-Suffix befinden: %s", "argyll.error.detail": "Detaillierte Argyll-CMS-Fehlermeldung:", "argyll.instrument.configuration_files.install": "Argyll CMS Messgeräte-Konfigurationsdateien installieren...", "argyll.instrument.configuration_files.install.success": "Installation der Argyll CMS Messgeräte-Konfigurationsdateien abgeschlossen.", "argyll.instrument.configuration_files.uninstall": "Argyll CMS Messgeräte-Konfigurationsdateien deinstallieren...", "argyll.instrument.configuration_files.uninstall.success": "Deinstallation der Argyll CMS Messgeräte-Konfigurationsdateien abgeschlossen.", "argyll.instrument.driver.missing": "Eventuell ist der Argyll-CMS-Treiber für Ihr Messgarät nicht oder nicht korrekt installiert. Bitte überprüfen Sie, ob Ihr Messgerät im Geräte-Manager von Windows unter „Argyll LibUSB-1.0A devices“ angezeigt wird und installieren Sie ggf. den Argyll-CMS-Treiber. Folgen Sie dazu der Anleitung in der Dokumentation.", "argyll.instrument.drivers.install": "Argyll CMS Messgeräte-Treiber installieren...", "argyll.instrument.drivers.install.confirm": "Sie müssen die Argyll-CMS-spezifischen Treiber nur dann installieren, wenn Ihr Messgerät kein ColorMunki Display, i1 Display Pro, Huey, ColorHug, specbos oder K-10 ist.\n\nHinweis: Falls Sie bereits einen Hersteller-Treiber für Ihr Messgerät installiert haben, müssen Sie nach der Argyll-CMS-Treiberinstallation manuell im Geräte-Manager von Windows zu dem neu installierten Treiber umschalten. Wählen Sie dazu per Rechtsklick auf Ihren Messgeräte-Eintrag den Menüpunkt „Treibersoftware aktualisieren...“, dann „Auf dem Computer nach Treibersoftware suchen“, „Aus einer Liste von Gerätetreibern auswählen“ und schliesslich den zu Ihrem Messgerät passenden Argyll-Treiber aus der Liste.\n\nMöchten Sie fortfahren?", "argyll.instrument.drivers.install.failure": "Installation der Argyll CMS Messgeräte-Treiber fehlgeschlagen.", "argyll.instrument.drivers.install.restart": "Zur Installation der Argyll-CMS-Messgeräte-Treiber müssen Sie das Erzwingen der Treibersignatur deaktivieren. Dazu muss ein System-Neustart durchgeführt werden. Wählen Sie auf der Seite, die daraufhin erscheint, die Option „Problembehandlung“, dann „Erweiterte Optionen“, „Starteinstellungen“ und schließlich „Neu starten“. Beim Neustart wählen Sie in den Startoptionen „Erzwingen der Treibersignatur deaktivieren“. Nach dem Neustart wählen Sie den Menüpunkt „Argyll CMS Messgeräte-Treiber installieren...“ erneut, um die Treiber zu installlieren. Falls die Option „Problembehandlung“ nicht angezeigt wird, befolgen Sie den in der DisplayCAL-Dokumentation im Abschnitt “Messgeräte-Installation unter Windows” beschriebenen alternativen Weg, die Treibersignatur-Prüfung zu deaktivieren.", "argyll.instrument.drivers.uninstall": "Argyll CMS Messgeräte-Treiber deinstallieren...", "argyll.instrument.drivers.uninstall.confirm": "Hinweis: Die Deinstallation wirkt sich nicht auf gerade verwendete Messgeräte-Treiber aus, sondern entfernt den Treiber nur aus dem Windows-Treiberspeicher. Um zu einem installierten Hersteller-Treiber für Ihr Messgerät zurück zu wechseln, müssen Sie manuell im Geräte-Manager von Windows zu dem Hersteller-Treiber umschalten. Wählen Sie dazu per Rechtsklick auf Ihren Messgeräte-Eintrag den Menüpunkt „Treibersoftware aktualisieren...“, dann „Auf dem Computer nach Treibersoftware suchen“, „Aus einer Liste von Gerätetreibern auswählen“ und schliesslich den zu Ihrem Messgerät passenden Hersteller-Treiber aus der Liste.\n\nMöchten Sie fortfahren?", "argyll.instrument.drivers.uninstall.failure": "Deinstallation der Argyll CMS Messgeräte-Treiber fehlgeschlagen.", "argyll.instrument.drivers.uninstall.success": "Deinstallation der Argyll CMS Messgeräte-Treiber abgeschlossen.", "argyll.util.not_found": "Argyll CMS „%s“ Hilfsprogramm nicht gefunden!", "as_measured": "Wie gemessen", "attributes": "Attribute", "audio.lib": "Audio-Modul: %s", "auth": "Authentifizierung", "auth.failed": "Authentifizierung fehlgeschlagen.", "auto": "Automatisch", "auto_optimized": "Automatisch optimiert", "autostart_remove_old": "Entferne alten Autostart-Eintrag", "backing_xyz": "Messunterlage XYZ", "backlight": "Hintergrundbeleuchtung", "bitdepth": "Bittiefe", "black": "Schwarz", "black_lab": "Schwarz Lab", "black_point": "Schwarzpunkt", "black_point_compensation": "Tiefenkompensierung", "black_point_compensation.3dlut.warning": "Wenn Sie eine 3D LUT erstellen möchten, sollten Sie die Tiefenkompensierungs-Profileinstellung ausschalten, da sie die Funktion der Tonwertkurvenanpassung beeinflusst. Möchten Sie die Tiefenkompensierung jetzt ausschalten?", "black_point_compensation.info": "Tiefenkompensierung verhindert effektiv den Verlust von Tiefenzeichnung, wirkt sich aber negativ auf die Genauigkeit der Farbkonvertierung aus.", "black_white": "Schwarzweiss", "black_xyz": "Schwarz XYZ", "blacklevel": "Schwarzwert", "blue": "Blau", "blue_gamma": "Blau Gamma", "blue_lab": "Blau Lab", "blue_matrix_column": "Blauer Matrix-Farbwert", "blue_maximum": "Blau Maximum", "blue_minimum": "Blau Minimum", "blue_tone_response_curve": "Blaue Farbtonwiedergabekurve", "blue_xyz": "Blau XYZ", "brightness": "Helligkeit", "browse": "Durchsuchen...", "bug_report": "Fehler melden...", "button.calibrate": "Nur Kalibrieren", "button.calibrate_and_profile": "Kalibrieren & profilieren", "button.profile": "Nur profilieren", "cal_extraction_failed": "Konnte die Kalibrierungsdaten nicht aus dem Profil extrahieren.", "calculated_checksum": "Errechnete Prüfsumme", "calibrate_instrument": "Spektrometer-Kalibrierung durchführen", "calibration": "Kalibrierung", "calibration.ambient_viewcond_adjust": "Umgebungshelligkeits-Anpassung", "calibration.ambient_viewcond_adjust.info": "Um eine Anpassung der Betrachtungsbedingungen während der Berechnung der Kalibrierungskurven durchzuführen, aktivieren Sie das Kontrollkästchen und tragen die Umgebungshelligkeit ein. Sie können die Umgebungshelligkeit auch messen, falls von Ihrem Messgerät unterstützt.", "calibration.black_luminance": "Schwarzluminanz", "calibration.black_output_offset": "Schwarzausgabeoffset", "calibration.black_point_correction": "Schwarztonkorrektur", "calibration.black_point_correction_choice": "Sie können die Schwarztonkorrektur ausschalten, um den Schwarzwert gering zu halten und den Kontrast zu verbessern (empfohlen für LCD), oder einschalten, um Schwarz auf den Farbton des gewählten Weißpunkts zu optimieren (empfohlen für CRT). Bitte wählen Sie Ihre bevorzugte Schwarztonkorrektur-Einstellung.", "calibration.black_point_rate": "Rate", "calibration.check_all": "Einstellungen überprüfen", "calibration.complete": "Kalibrierung abgeschlossen!", "calibration.create_fast_matrix_shaper": "Matrix-Profil erstellen", "calibration.create_fast_matrix_shaper_choice": "Möchten Sie aus den Messwerten der Kalibrierung ein einfaches Matrix-Profil erstellen oder nur kalibrieren?", "calibration.do_not_use_video_lut": "Zum Anwenden der Kalibrierung nicht die Grafikkarten-Gammatabelle verwenden", "calibration.do_not_use_video_lut.warning": "Wollen Sie die empfohlene Einstellung wirklich ändern?", "calibration.embed": "Kalibrierungskurven in Profil einbetten", "calibration.file": "Einstellungen", "calibration.file.invalid": "Die gewählte Einstellungsdatei ist ungültig.", "calibration.file.none": "", "calibration.incomplete": "Die Kalibrierung wurde nicht abgeschlossen.", "calibration.interactive_display_adjustment": "Interaktive Anzeigegeräte-Einstellung", "calibration.interactive_display_adjustment.black_level.crt": "Wählen Sie „Messung starten“ und benutzen Sie den Helligkeits- und/oder die RGB-Versatz-Regler Ihres Anzeigegerätes, um den gewünschten Schwarzpegel einzustellen.", "calibration.interactive_display_adjustment.black_point.crt": "Wählen Sie „Messung starten“ und benutzen Sie die RGB-Versatz-Regler Ihres Anzeigegerätes, um den gewünschten Schwarzpunkt einzustellen.", "calibration.interactive_display_adjustment.check_all": "Wählen Sie „Messung starten“, um alle Einstellungen zu überprüfen.", "calibration.interactive_display_adjustment.generic_hint.plural": "Eine gute Übereinstimmung ist erreicht, wenn die Balken in die markierte mittige Position gebracht werden können.", "calibration.interactive_display_adjustment.generic_hint.singular": "Eine gute Übereinstimmung ist erreicht, wenn der Balken in die markierte mittige Position gebracht werden kann.", "calibration.interactive_display_adjustment.start": "Messung starten", "calibration.interactive_display_adjustment.stop": "Messung stoppen", "calibration.interactive_display_adjustment.white_level.crt": "Wählen Sie „Messung starten“ und benutzen Sie den Kontrast- und/oder die RGB-Zuwachs-Regler Ihres Anzeigegerätes, um den gewünschten Weißpegel einzustellen.", "calibration.interactive_display_adjustment.white_level.lcd": "Wählen Sie „Messung starten“ und benutzen Sie den Hintegrundbeleuchtungs- bzw. Helligkeitsregler Ihres Anzeigegerätes, um den gewünschten Weißpegel einzustellen.", "calibration.interactive_display_adjustment.white_point": "Wählen Sie „Messung starten“ und benutzen Sie die Farbtemperatur- und/oder RGB-Zuwachs-Regler Ihres Anzeigegerätes, um den gewünschten Weißpunkt einzustellen.", "calibration.load": "Einstellungen laden...", "calibration.load.handled_by_os": "Kalibrierung wird vom Betriebssystem geladen.", "calibration.load_error": "Kalibrierungskurven konnten nicht geladen werden.", "calibration.load_from_cal": "Kalibrierungskurven aus Kalibrierungsdatei laden...", "calibration.load_from_cal_or_profile": "Kalibrierungskurven aus Kalibrierungsdatei oder Profil laden...", "calibration.load_from_display_profile": "Kalibrierungskurven von aktuellem Anzeigegeräteprofil laden", "calibration.load_from_display_profiles": "Kalibrierung von aktuellen Anzeigegeräteprofilen laden", "calibration.load_from_profile": "Kalibrierungskurven aus Profil laden...", "calibration.load_success": "Kalibrierungskurven geladen.", "calibration.loading": "Lade Kalibrierungskurven aus Datei...", "calibration.loading_from_display_profile": "Lade Kalibrierungskurven des aktuellen Anzeigegeräteprofils...", "calibration.luminance": "Weißluminanz", "calibration.lut_viewer.title": "Kurven", "calibration.preserve": "Kalibrierungszustand aufrechterhalten", "calibration.preview": "Kalibrierungsvorschau", "calibration.quality": "Kalibrierungsqualität", "calibration.quality.high": "Hoch", "calibration.quality.low": "Niedrig", "calibration.quality.medium": "Mittel", "calibration.quality.ultra": "Ultra", "calibration.quality.verylow": "Sehr niedrig", "calibration.reset": "Grafikkarten-Gammatabelle zurücksetzen", "calibration.reset_error": "Grafikkarten-Gammatabelle konnte nicht zurückgesetzt werden.", "calibration.reset_success": "Grafikkarten-Gammatabelle zurückgesetzt.", "calibration.resetting": "Setze Grafikkarten-Gammatabelle zurück...", "calibration.settings": "Kalibrierungseinstellungen", "calibration.show_actual_lut": "Kalibrierungskurven aus der Grafikkarte zeigen", "calibration.show_lut": "Kurven zeigen", "calibration.skip": "Weiter zur Profilierung", "calibration.speed": "Kalibrierungsgeschwindigkeit", "calibration.speed.high": "Hoch", "calibration.speed.low": "Niedrig", "calibration.speed.medium": "Mittel", "calibration.speed.veryhigh": "Sehr hoch", "calibration.speed.verylow": "Sehr niedrig", "calibration.start": "Weiter zur Kalibrierung", "calibration.turn_on_black_point_correction": "Einschalten", "calibration.update": "Kalibrierung aktualisieren", "calibration.update_profile_choice": "Möchten Sie auch die Kalibrierungskurven im bestehenden Profil aktualisieren oder nur kalibrieren?", "calibration.use_linear_instead": "Lineare Kalibrierung stattdessen verwenden", "calibration.verify": "Kalibrierung überprüfen", "calibration_profiling.complete": "Kalibrierung und Profilierung abgeschlossen!", "calibrationloader.description": "Setzt ICC-Profile und lädt Kalibrierungskurven für alle konfigurierten Anzeigegeräte", "can_be_used_independently": "Kann unabhängig verwendet werden", "cancel": "Abbrechen", "cathode_ray_tube_display": "Kathodenstrahlröhrenmonitor", "ccxx.ti1": "Testform für Colorimeter-Korrektur", "centered": "Zentriert", "channel_1_c_xy": "Kanal 1 (C) xy", "channel_1_gamma_at_50_input": "Kanal 1 Gamma bei 50% Stimulus", "channel_1_is_linear": "Kanal 1 ist linear", "channel_1_maximum": "Kanal 1 Maximum", "channel_1_minimum": "Kanal 1 Minimum", "channel_1_r_xy": "Kanal 1 (R) xy", "channel_1_unique_values": "Kanal 1 eindeutige Tonwerte", "channel_2_g_xy": "Kanal 2 (G) xy", "channel_2_gamma_at_50_input": "Kanal 2 Gamma bei 50% Stimulus", "channel_2_is_linear": "Kanal 2 ist linear", "channel_2_m_xy": "Kanal 2 (M) xy", "channel_2_maximum": "Kanal 2 Maximum", "channel_2_minimum": "Kanal 2 Minimum", "channel_2_unique_values": "Kanal 2 eindeutige Tonwerte", "channel_3_b_xy": "Kanal 3 (B) xy", "channel_3_gamma_at_50_input": "Kanal 3 Gamma bei 50% Stimulus", "channel_3_is_linear": "Kanal 3 ist linear", "channel_3_maximum": "Kanal 3 Maximum", "channel_3_minimum": "Kanal 3 Minimum", "channel_3_unique_values": "Kanal 3 eindeutige Tonwerte", "channel_3_y_xy": "Kanal 3 (Y) xy", "channel_4_k_xy": "Kanal 4 (K) xy", "channels": "Kanäle", "characterization_device_values": "Gerätefarbwerte", "characterization_measurement_values": "Farbmesswerte", "characterization_target": "Charakterisierungsdaten", "checking_lut_access": "Überprüfe Grafikkarten-Gammatabellen-Zugriff auf Anzeigegerät %s...", "checksum": "Prüfsumme", "checksum_ok": "Prüfsumme OK", "chromatic_adaptation_matrix": "Matrix zur chromatischen Anpassung", "chromatic_adaptation_transform": "Methode zur chromatischen Anpassung", "chromaticity_illuminant_relative": "Chromatizität (Leuchtmittel-Bezug)", "chromecast_limitations_warning": "Bitte beachten Sie, dass die Genauigkeit über Chromecast nicht so gut ist wie über eine direkte Verbindung zum Anzeigegerät oder madTPG, da Chromecast RGB in YCbCr konvertiert und hochskaliert.", "clear": "Löschen", "color": "Farbe", "color.custom": "Benutzerdefinierte Farbe", "color_look_up_table": "Farbwerte-Tabelle", "color_model": "Farbmodell", "color_space_conversion_profile": "Farbraum-Konvertierungsprofil", "colorant_order": "Farbmittel-Druckreihenfolge", "colorants_pcs_relative": "Farbmittel (PCS-Bezug)", "colorconfig_remove_old": "Entferne alte Anzeigegeräte-Konfigurationsdatei", "colorimeter_correction.create": "Colorimeter-Korrektur erstellen...", "colorimeter_correction.create.details": "Bitte überprüfen Sie die angezeigten Informationen und ändern diese wenn nötig. Die Beschreibung sollte auch wichtige Zusatzinformationen enthalten (z.B. spezielle Anzeigegeräte-Einstellungen, Abweichung vom CIE-Normbeobachter o.ä.).", "colorimeter_correction.create.failure": "Erstellen der Korrektur fehlgeschlagen.", "colorimeter_correction.create.info": "Um eine Colorimeter-Korrektur zu erstellen, müssen Sie zuerst einige Farbfelder mit einem Spektrometer messen, und falls Sie eine Korrekturmatrix statt einer Spektralkorrektur erstellen möchten, auch mit dem zu korrigierenden Colorimeter.\nAlternativ können Sie per Auswahl von „Durchsuchen...“ auch bereits erzeugte Messwerte verwenden.", "colorimeter_correction.create.success": "Korrektur erfolgreich erstellt.", "colorimeter_correction.file.none": "Keine", "colorimeter_correction.import": "Colorimeter-Korrekturen von anderer Anzeigegeräteprofilierungs-Software importieren...", "colorimeter_correction.import.choose": "Bitte wählen Sie eine Datei mit Colorimeter-Korrekturen aus.", "colorimeter_correction.import.failure": "Es konnte keine Colorimeter-Korrektur importiert werden.", "colorimeter_correction.import.partial_warning": "Nicht alle Colorimeter-Korrekturen konnten von %s importiert werden. %i von %i Einträge mussten übersprungen werden.", "colorimeter_correction.import.success": "Colorimeter-Korrekturen wurden erfolgreich von folgenden Softwares importiert:\n\n%s", "colorimeter_correction.instrument_mismatch": "Die gewählte Colorimeter-Korrektur ist nicht für das gewählte Messgerät geeignet.", "colorimeter_correction.upload": "Colorimeter-Korrektur hochladen...", "colorimeter_correction.upload.confirm": "Möchten Sie die Colorimeter-Korrekturdatei in die Online-Datenbank hochladen (empfohlen)? Hochgeladene Dateien werden als lizenzfrei („Public Domain“) behandelt, damit sie uneingeschränkt genutzt werden können.", "colorimeter_correction.upload.deny": "Diese Korrekturdatei darf nicht hochgeladen werden.", "colorimeter_correction.upload.exists": "Die Colorimeter-Korrekturdatei existiert bereits in der Datenbank.", "colorimeter_correction.upload.failure": "Die Korrekturdatei konnte nicht in die Online-Datenbank eingetragen werden.", "colorimeter_correction.upload.success": "Die Korrekturdatei wurde in die Online-Datenbank eingetragen.", "colorimeter_correction.web_check": "Online nach Colorimeter-Korrektur suchen...", "colorimeter_correction.web_check.choose": "Für das gewählte Anzeige- und Messgerät wurden folgende Colorimeter-Korrekturen gefunden:", "colorimeter_correction.web_check.failure": "Für das gewählte Anzeige- und Messgerät wurden keine Colorimeter-Korrekturen gefunden.", "colorimeter_correction_matrix_file": "Korrektur", "colorimeter_correction_matrix_file.choose": "Colorimeter-Korrektur auswählen", "colors_pcs_relative": "Farben (PCS-Bezug)", "colorspace": "Farbraum", "colorspace.show_outline": "Umriss zeigen", "commandline": "Befehlszeile:", "commands": "Befehle", "comparison_profile": "Vergleichsprofil", "comport_detected": "Eine Änderung in der Messgeräte-/Port-Konfiguration wurde erkannt.", "compression.gzip": "GZIP-Komprimierung", "computer.name": "Computername", "connected.to.at": "Verbunden mit %s unter %s:%s", "connecting.to": "Verbinde mit %s:%s...", "connection.broken": "Verbindung abgebrochen", "connection.established": "Verbindung hergestellt", "connection.fail": "Verbindungs-Fehler (%s)", "connection.fail.http": "HTTP-Fehler %s", "connection.waiting": "Warte auf Verbindung unter", "continue": "Fortfahren", "contrast": "Kontrast", "contribute": "Einen Beitrag leisten", "converting": "Konvertiere", "copyright": "Urheberrecht", "corrected": "korrigiert", "create_and_preview": "Erstellen & Vorschau", "create_ccss_or_ccmx": "Möchten Sie eine Korrekturmatrix für herkömmliche Colorimeter erstellen (CCMX) oder eine Spektralkalibration für das i1 Display Pro und ColorMunki Display (CCSS)?", "create_profile": "Profil aus Messwertdatei erstellen...", "create_profile_from_edid": "Profil aus EDID erstellen...", "created": "Erstellt", "creator": "Ersteller", "current": "Aktuell", "custom": "Benutzerdefiniert", "cyan": "Cyan", "d3-e4-s0-g25-m3-b3-f0-crossover.ti1": "Standard-Testform für Matrix-Profile", "d3-e4-s0-g49-m3-b3-f0-crossover.ti1": "Erweiterte Testform für Matrix-Profile", "d3-e4-s0-g9-m3-b3-f0-crossover.ti1": "Kleine Testform für Matrix-Profile", "d3-e4-s0-g97-m3-b3-f0-crossover.ti1": "Sehr große Testform für Matrix-Profile", "d3-e4-s13-g37-m4-b4-f0.ti1": "Kleine Testform für LUT-Profile", "d3-e4-s17-g49-m5-b5-f0.ti1": "Standard-Testform für LUT-Profile", "d3-e4-s21-g61-m6-b6-f0.ti1": "Erweiterte Testform für LUT-Profile", "d3-e4-s25-g73-m0-f679-cRec709_Gamma22.ti1": "Große Testform für LUT-Profile, optimiert für Gamma 2.2 mit Rec.-709-Primärfarben (D65)", "d3-e4-s25-g73-m0-f679-caRGB.ti1": "Große Testform für LUT-Profile, optimiert für Gamma 2.2 mit AdobeRGB-Primärfarben (D65)", "d3-e4-s25-g73-m0-f679-ceRGBv2.ti1": "Große Testform für LUT-Profile, optimiert für L* mit NTSC-1953-Primärfarben (D50)", "d3-e4-s25-g73-m0-f679-csRGB.ti1": "Große Testform für LUT-Profile, optimiert für sRGB (D65)", "d3-e4-s25-g73-m7-b7-f0.ti1": "Große Testform für LUT-Profile", "d3-e4-s29-g85-m0-f994-cRec709_Gamma22.ti1": "Sehr große Testform für LUT-Profile, optimiert für Gamma 2.2 mit Rec.-709-Primärfarben (D65)", "d3-e4-s29-g85-m0-f994-caRGB.ti1": "Sehr große Testform für LUT-Profile, optimiert für Gamma 2.2 mit AdobeRGB-Primärfarben (D65)", "d3-e4-s29-g85-m0-f994-ceRGBv2.ti1": "Sehr große Testform für LUT-Profile, optimiert für L* mit NTSC-1953-Primärfarben (D50)", "d3-e4-s29-g85-m0-f994-csRGB.ti1": "Sehr große Testform für LUT-Profile, optimiert für sRGB (D65)", "d3-e4-s29-g85-m8-b8-f0.ti1": "Sehr große Testform für LUT-Profile", "d3-e4-s33-g97-m0-f1399-cRec709_Gamma22.ti1": "XXL Testform für LUT-Profile, optimiert für Gamma 2.2 mit Rec.-709-Primärfarben (D65)", "d3-e4-s33-g97-m0-f1399-caRGB.ti1": "XXL Testform für LUT-Profile, optimiert für Gamma 2.2 mit AdobeRGB-Primärfarben (D65)", "d3-e4-s33-g97-m0-f1399-ceRGBv2.ti1": "XXL Testform für LUT-Profile, optimiert für L* mit NTSC-1953-Primärfarben (D50)", "d3-e4-s33-g97-m0-f1399-csRGB.ti1": "XXL Testform für LUT-Profile, optimiert für sRGB (D65)", "d3-e4-s33-g97-m9-b9-f0.ti1": "XXL Testform für LUT-Profile", "d3-e4-s37-g109-m0-f1906-cRec709_Gamma22.ti1": "XXXL Testform für LUT-Profile, optimiert für Gamma 2.2 mit Rec.-709-Primärfarben (D65)", "d3-e4-s37-g109-m0-f1906-caRGB.ti1": "XXXL Testform für LUT-Profile, optimiert für Gamma 2.2 mit AdobeRGB-Primärfarben (D65)", "d3-e4-s37-g109-m0-f1906-ceRGBv2.ti1": "XXXL Testform für LUT-Profile, optimiert für L* mit NTSC-1953-Primärfarben (D50)", "d3-e4-s37-g109-m0-f1906-csRGB.ti1": "XXXL Testform für LUT-Profile, optimiert für sRGB (D65)", "d3-e4-s37-g109-m10-b10-f0.ti1": "XXXL Testform für LUT-Profile", "d3-e4-s41-g121-m0-f2527-cRec709_Gamma22.ti1": "Gigantische Testform für LUT-Profile, optimiert für Gamma 2.2 mit Rec.-709-Primärfarben (D65)", "d3-e4-s41-g121-m0-f2527-caRGB.ti1": "Gigantische Testform für LUT-Profile, optimiert für Gamma 2.2 mit AdobeRGB-Primärfarben (D65)", "d3-e4-s41-g121-m0-f2527-ceRGBv2.ti1": "Gigantische Testform für LUT-Profile, optimiert für L* mit NTSC-1953-Primärfarben (D50)", "d3-e4-s41-g121-m0-f2527-csRGB.ti1": "Gigantische Testform für LUT-Profile, optimiert für sRGB (D65)", "d3-e4-s41-g121-m11-b11-f0.ti1": "Gigantische Testform für LUT-Profile", "deactivated": "deaktiviert", "default": "Standard", "default.icc": "Standard (Gamma 2.2)", "default_crt": "Standard-CRT", "default_rendering_intent": "Standard-Farbübertragung", "delete": "Löschen", "delta_e_2000_to_blackbody_locus": "ΔE 2000 zu Schwarzkörper-Farbort", "delta_e_2000_to_daylight_locus": "ΔE 2000 zu Tageslicht-Farbort", "delta_e_to_locus": "ΔE*00 zu %s-Farbort", "description": "Beschreibung", "description_ascii": "Beschreibung (ASCII)", "description_macintosh": "Beschreibung (Macintosh)", "description_unicode": "Beschreibung (Unicode)", "deselect_all": "Alles abwählen", "detect_displays_and_ports": "Anzeigegeräte- und Messgeräte-Erkennung", "device": "Gerät", "device.name.placeholder": "", "device_color_components": "Gerätefarbwerte-Komponenten", "device_manager.launch": "Geräte-Manager starten", "device_manufacturer_name": "Gerätehersteller", "device_manufacturer_name_ascii": "Gerätehersteller (ASCII)", "device_manufacturer_name_macintosh": "Gerätehersteller (Macintosh)", "device_manufacturer_name_unicode": "Gerätehersteller (Unicode)", "device_model_name": "Gerätemodell", "device_model_name_ascii": "Gerätemodell (ASCII)", "device_model_name_macintosh": "Gerätemodell (Macintosh)", "device_model_name_unicode": "Gerätemodell (Unicode)", "device_to_pcs_intent_0": "Gerät zu PCS: Anpassungsart 0", "device_to_pcs_intent_1": "Gerät zu PCS: Anpassungsart 1", "device_to_pcs_intent_2": "Gerät zu PCS: Anpassungsart 2", "devicelink_profile": "Geräteverküpfungs-Profil", "dialog.argyll.notfound.choice": "Argyll CMS, das Farbmanagement-System, das benötigt wird, um DisplayCAL zu verwenden, scheint nicht auf diesem Computer installiert zu sein. Möchten Sie es automatisch herunterladen oder selbst danach suchen?", "dialog.cal_info": "Die Kalibrierungsdatei “%s” wird verwendet. Wollen Sie fortfahren?", "dialog.confirm_cancel": "Möchten Sie wirklich abbrechen?", "dialog.confirm_delete": "Möchten Sie die gewählte(n) Datei(en) wirklich löschen?", "dialog.confirm_overwrite": "Die Datei “%s” existiert bereits. Möchten Sie die Datei überschreiben?", "dialog.current_cal_warning": "Die gerade geladenen Kalibrierungskurven werden verwendet. Wollen Sie fortfahren?", "dialog.do_not_show_again": "Diese Meldung nicht erneut anzeigen", "dialog.enter_password": "Bitte geben Sie Ihr Kennwort ein.", "dialog.install_profile": "Möchten Sie das Profil „%s“ installieren und als Standard für Anzeigegerät „%s“ setzen?", "dialog.linear_cal_info": "Lineare Kalibrierungskurven werden verwendet. Wollen Sie fortfahren?", "dialog.load_cal": "Einstellungen laden", "dialog.select_argyll_version": "Version %s von Argyll CMS wurde gefunden. Die zur Zeit ausgewählte Version ist %s. Möchten Sie die neuere Version verwenden?", "dialog.set_argyll_bin": "Bitte wählen Sie das Argyll-CMS-Programmverzeichnis aus.", "dialog.set_profile_save_path": "Profilordner „%s“ erzeugen in:", "dialog.set_testchart": "Testform auswählen", "dialog.ti3_no_cal_info": "Die Messwerte enthalten keine Kalibrierungskurven. Wollen Sie wirklich fortfahren?", "digital_camera": "Digitale Kamera", "direction.backward": "PCS → B2A → Gerät", "direction.backward.inverted": "PCS ← B2A ← Gerät", "direction.forward": "Gerät → A2B → PCS", "direction.forward.inverted": "Gerät ← A2B ← PCS", "disconnected.from": "Verbindung mit %s:%s getrennt", "display": "Anzeigegerät", "display-instrument": "Anzeige- & Messgerät", "display.connection.type": "Anschlusstyp", "display.manufacturer": "Anzeigegerätehersteller", "display.output": "Ausgang #", "display.primary": "(Primär)", "display.properties": "Anzeigegeräteeingenschaften", "display.reset.info": "Bitte setzen Sie das Anzeigegerät auf die Werkseinstellungen zurück und stellen danach die Helligkeit auf einen angenehmen Wert ein.", "display.settings": "Anzeigegeräteeinstellungen", "display.tech": "Anzeigegerätetechnologie", "display_detected": "Eine Änderung in der Anzeigegerätekonfiguration wurde erkannt.", "display_device_profile": "Anzeigegeräteprofil", "display_lut.link": "Anzeigegerät und Grafikkarten-Gammatabellen-Zugriff getrennt oder gemeinsam ändern", "display_profile.not_detected": "Es wurde kein aktuelles Profil für das Anzeigegerät „%s“ erkannt.", "display_profile.save_as": "Das aktuelle Profil für Anzeigegerät „%s“ existiert gerade nur im Arbeitsspeicher. Bitte speichern Sie es zuerst in eine Datei.", "display_short": "Anzeigegerät (Kurzname)", "displayport": "DisplayPort", "dlp_screen": "DLP-Bildschirm", "donation_header": "Ihre Unterstützung ist willkommen!", "donation_message": "Bitte erwägen Sie einen finanziellen Beitrag, falls Sie die Entwicklung von, technische Hilfestellung für, und weitere Verfügbarkeit von DisplayCAL und Argyll CMS unterstützen möchten. Da DisplayCAL ohne Argyll CMS nicht nutzbar ist, werden alle erhaltenen finanziellen Beiträge auf beide Projekte aufgeteilt.\nFür nicht-kommerzielle, unregelmäßige private Verwendung ist ein einmaliger Beitrag angmessen. Falls Sie DisplayCAL professionell/kommerziell einsetzen, würde ein jährlicher oder monatlicher Beitrag die weitere Verfügbarkeit beider Projekte sehr unterstützen.\n\nDanke an alle Unterstützer!", "download": "Herunterladen", "download_fail_empty_response": "Download fehlgeschlagen: %s gab ein leeres Dokument zurück.", "download_fail_wrong_size": "Download fehlgeschlagen: Die Datei hat nicht die erwartete Größe von %s Bytes (%s Bytes erhalten).", "downloading": "Wird heruntergeladen", "drift_compensation.blacklevel": "Schwarzabgleich-Drift-Kompensierung", "drift_compensation.blacklevel.info": "Schwarzabgleich-Drift-Kompensierung versucht, Messwertabweichungen verursacht durch ein sich erwärmendes Messgerät auszugleichen. Dazu wird in gewissen Zeitabständen ein schwarzes Farbfeld gemessen, was die Messzeit insgesamt verlängert. Viele Colorimeter haben eine eingebaute Temperaturkompensierung, was eine Schwarzabgleich-Drift-Kompensierung überflüssig macht, allerdings fehlt diese bei den meisten Spektrometern.", "drift_compensation.whitelevel": "Weißluminanz-Drift-Kompensierung", "drift_compensation.whitelevel.info": "Weißluminanz-Drift-Kompensierung versucht, Messwertabweichungen verursacht durch Helligkeitsänderungen eines sich erwärmenden Anzeigegerätes ausgleichen. Dazu wird in gewissen Zeitabständen ein weißes Farbfeld gemessen, was die Messzeit insgesamt verlängert.", "dry_run": "Trockenlauf", "dry_run.end": "Trockenlauf beendet.", "dry_run.info": "Trockenlauf. Schauen Sie im Protokoll nach, um die Befehlszeile zu sehen.", "dvi": "DVI", "dye_sublimation_printer": "Sublimationsdrucker", "edid.crc32": "EDID-CRC32-Prüfsumme", "edid.serial": "EDID-Seriennummer", "elapsed_time": "Verstrichene Zeit", "electrophotographic_printer": "Elektrophotographischer Drucker", "electrostatic_printer": "Elektrostatischer Drucker", "enable_argyll_debug": "Argyll CMS Debugging-Ausgabe aktivieren", "enable_spyder2": "Spyder 2 Colorimeter freischalten...", "enable_spyder2_failure": "Spyder 2 konnte nicht freigeschaltet werden. Bitte installieren Sie die Spyder 2 Software manuell (falls noch nicht geschehen) und führen dann diese Funktion erneut aus.", "enable_spyder2_success": "Spyder 2 wurde erfolgreich freigeschaltet.", "entries": "Einträge", "enumerate_ports.auto": "Automatische Messgeräte-Erkennung", "enumerating_displays_and_comports": "Anzeigegeräte- und Messgeräte-Erkennung...", "environment": "Umgebung", "error": "Fehler", "error.access_denied.write": "Sie haben keinen Schreibzugriff auf %s", "error.already_exists": "Der Name „%s“ kann nicht verwendet werden, da bereits ein anderes Objekt mit diesem Namen existiert. Bitte wählen Sie einen anderen Namen oder ein anderes Verzeichnis.", "error.autostart_creation": "Der Autostart-Eintrag für %s, um die Kalibrierungskurven bei der Anmeldung zu laden, konnte nicht angelegt werden.", "error.autostart_remove_old": "Der alte Autostart-Eintrag, welcher Kalibrierungskurven bei der Anmeldung lädt, konnte nicht entfernt werden: %s", "error.autostart_system": "Der systemweite Autostart-Eintrag, um die Kalibrierungskurven bei der Anmeldung zu laden, konnte nicht angelegt werden, weil das systemweite Autostart-Verzeichnis nicht ermittelt werden konnte.", "error.autostart_user": "Der benutzerspezifische Autostart-Eintrag, um die Kalibrierungskurven bei der Anmeldung zu laden, konnte nicht angelegt werden, weil das benutzerspezifische Autostart-Verzeichnis nicht ermittelt werden konnte.", "error.cal_extraction": "Die Kalibrierung konnte nicht aus dem Profil “%s” extrahiert werden.", "error.calibration.file_missing": "Die Kalibrierungsdatei „%s“ fehlt.", "error.calibration.file_not_created": "Es wurde keine Kalibrierungsdatei erstellt.", "error.colorconfig_remove_old": "Die alte Konfigurationsdatei, die Anzeigegeräten Profile zuordnet, konnte nicht entfernt werden: %s", "error.copy_failed": "Die Datei „%s“ konnte nicht nach „%s“ kopiert werden.", "error.deletion": "Beim Bewegen von Dateien in den %s ist ein Fehler aufgetreten. Einige Dateien wurden eventuell nicht entfernt.", "error.dir_creation": "Das Verzeichnis „%s“ konnte nicht erstellt werden. Eventuell bestehen keine Zugriffsrechte. Bitte erlauben Sie den Schreibzugriff oder wählen Sie ein anderes Verzeichnis.", "error.dir_notdir": "Das Verzeichnis „%s“ konnte nicht erstellt werden, da bereits ein anderes Objekt mit diesem Namen existiert. Bitte wählen Sie ein anderes Verzeichnis.", "error.file.create": "Die Datei „%s“ konnte nicht erstellt werden.", "error.file.open": "Die Datei „%s“ konnte nicht geöffnet werden.", "error.file_type_unsupported": "Nicht unterstützter Dateityp.", "error.generic": "Es ist ein interner Fehler aufgetreten.\n\nFehlernummer: %s\nFehlermeldung: %s", "error.measurement.file_invalid": "Die Messwertedatei „%s“ ist ungültig.", "error.measurement.file_missing": "Die Messwertedatei „%s“ fehlt.", "error.measurement.file_not_created": "Es wurde keine Messwertedatei erstellt.", "error.measurement.missing_spectral": "Die Messwertdatei enthält keine Spektralwerte.", "error.measurement.one_colorimeter": "Es wird genau eine Colorimeter-Messwertdatei benötigt.", "error.measurement.one_reference": "Es wird genau eine Referenzmesswertdatei benötigt.", "error.no_displays_detected": "Achtung: Es wurden kein Anzeigegerät erkannt.", "error.no_files_extracted_from_archive": "Es wurden keine Dateien von „%s“ extrahiert.", "error.not_a_session_archive": "Die Archivdatei „%s“ scheint kein gültiges Sitzungsarchiv zu sein.", "error.profile.file_missing": "Die Profildatei „%s“ fehlt.", "error.profile.file_not_created": "Es wurde keine Profildatei erstellt.", "error.source_dest_same": "Quell- und Zieldatei sind identisch.", "error.testchart.creation_failed": "Die Testform „%s“ konnte nicht erstellt werden. Eventuell bestehen keine Zugriffsrechte, oder die Quelldatei ist nicht vorhanden.", "error.testchart.invalid": "Die Testform „%s“ ist ungültig.", "error.testchart.missing": "Die Testform „%s“ existiert nicht.", "error.testchart.missing_fields": "Der Testform „%s“ fehlen folgende Felder: %s", "error.testchart.read": "Die Testform „%s“ konnte nicht gelesen werden.", "error.tmp_creation": "Konnte das temporäre Arbeitsverzeichnis nicht erstellen.", "error.trashcan_unavailable": "Der %s ist nicht verfügbar. Es wurden keine Dateien entfernt.", "errors.none_found": "Keine Fehler gefunden.", "estimated_measurement_time": "Geschätzte Messzeit ungefähr %s Stunde(n) %s Minuten", "export": "Exportieren...", "extra_args": "Zusätzliche Befehlszeilen-Parameter setzen...", "factory_default": "Werksstandard", "failure": "...fehlgeschlagen!", "file.invalid": "Datei ungültig.", "file.missing": "Die Datei „%s“ existiert nicht.", "file.notfile": "„%s“ ist keine Datei.", "file.select": "Datei auswählen", "filename.upload": "Upload-Dateiname", "filetype.7z": "7-Zip-Dateien", "filetype.any": "Alle Dateitypen", "filetype.cal": "Kalibrierungsdateien (*.cal)", "filetype.cal_icc": "Kalibrierungsdateien und Profile (*.cal;*.icc;*.icm)", "filetype.ccmx": "Korrekturmatrizen/Spektralkalibrierungen (*.ccmx;*.ccss)", "filetype.html": "HTML-Dateien (*.html;*.htm)", "filetype.icc": "Profile (*.icc;*.icm)", "filetype.icc_mpp": "Profile (*.icc;*.icm;*.mpp)", "filetype.icc_ti1_ti3": "Testformdateien (*.icc;*.icm;*.ti1;*.ti3)", "filetype.icc_ti3": "Messwertdateien (*.icc;*.icm;*.ti3)", "filetype.log": "Protokolldateien (*.log)", "filetype.png": "Portable Network Graphics (*.png)", "filetype.tgz": "Komprimiertes TAR-Archiv", "filetype.ti1": "Testformdateien (*.ti1)", "filetype.ti1_ti3_txt": "Testformdateien (*.ti1), Messwertdateien (*.ti3;*.txt)", "filetype.ti3": "Messwertdateien (*.ti3)", "filetype.tif": "Tagged Image File (*.tif)", "filetype.txt": "DeviceCorrections.txt", "filetype.vrml": "VRML-Dateien (*.wrl)", "filetype.x3d": "X3D-Dateien (*.x3d)", "filetype.zip": "ZIP-Dateien", "film_scanner": "Filmscanner", "film_writer": "Filmbelichter", "finish": "Fertigstellen", "flare": "Streulicht", "flexography": "Flexodruck", "forced": "forciert", "format.select": "Bitte wählen Sie das gewünschte Format.", "gamap.default_intent": "Standard-Farbübertragung", "gamap.intents.a": "Absolut farbmetrisch", "gamap.intents.aa": "Absolutes Erscheinungsbild", "gamap.intents.aw": "Absolut farbmetrisch mit Weißpunkt-Skalierung", "gamap.intents.la": "Luminanz angleichen", "gamap.intents.lp": "Luminanz erhaltende Wahrnehmung", "gamap.intents.ms": "Sättigung erhalten", "gamap.intents.p": "Wahrnehmung", "gamap.intents.pa": "Wahrnehmungs-Erscheinungsbild", "gamap.intents.r": "Relativ farbmetrisch", "gamap.intents.s": "Sättigung", "gamap.out_viewcond": "Betrachtungsbedingungen (Ziel)", "gamap.perceptual": "Gamut-Mapping für Wahrnehmungs-Farbübertragung", "gamap.profile": "Quellprofil", "gamap.saturation": "Gamut-Mapping für Sättigungs-Farbübertragung", "gamap.src_viewcond": "Betrachtungsbedingungen (Quelle)", "gamap.viewconds.cx": "Dias auf Leuchtkasten", "gamap.viewconds.jd": "Projektor in lichtloser Umgebung", "gamap.viewconds.jm": "Projektor in abgedunkelter Umgebung", "gamap.viewconds.mb": "Monitor in heller Arbeitsumgebung", "gamap.viewconds.md": "Monitor in abgedunkelter Arbeitsumgebung", "gamap.viewconds.mt": "Monitor in typischer Arbeitsumgebung", "gamap.viewconds.ob": "Außenaufnahme in hellem Licht", "gamap.viewconds.pc": "Druck unter Normlicht (kritische Abmusterung nach ISO-3664 P1)", "gamap.viewconds.pcd": "Photo CD - Außenaufnahme", "gamap.viewconds.pe": "Druck unter Normlicht (Abmusterung nach CIE 116-1995)", "gamap.viewconds.pp": "Druck (ISO-3664 P2)", "gamap.viewconds.tv": "TV/Filmstudio", "gamapframe.title": "Erweiterte Gamut-Mapping-Einstellungen", "gamut": "Farbumfang", "gamut.coverage": "Farbraumabdeckung", "gamut.view.create": "Generiere Gamut-Ansichten...", "gamut.volume": "Farbraumvolumen", "gamut_mapping.ciecam02": "CIECAM02 Gamut-Mapping", "gamut_mapping.mode": "Gamut-Mapping Modus", "gamut_mapping.mode.b2a": "Bezugsfarbraum-zu-Gerätefarbraum", "gamut_mapping.mode.inverse_a2b": "Invers Gerätefarbraum-zu-Bezugsfarbraum", "gamut_plot.tooltip": "Klicken und ziehen Sie die Maus im Diagramm, um den Ausschnitt zu verschieben, oder zoomen Sie mit dem Mausrad und den +/- Tasten. Doppelklick setzt die Ansicht zurück.", "generic_name_value_data": "Generische Wertetabelle", "geometry": "Messgeometrie", "glossy": "Glänzend", "go_to_website": "Gehe zur Website", "gravure": "Tiefdruck", "gray_tone_response_curve": "Graue Farbtonwiedergabekurve", "grayscale": "Graustufen", "green": "Grün", "green_gamma": "Grün Gamma", "green_lab": "Grün Lab", "green_matrix_column": "Grüner Matrix-Farbwert", "green_maximum": "Grün Maximum", "green_minimum": "Grün Minimum", "green_tone_response_curve": "Grüne Farbtonwiedergabekurve", "green_xyz": "Grün XYZ", "grid_steps": "Raster-Schritte", "hdmi": "HDMI", "header": "Anzeigegeräte-Kalibrierung und Charakterisierung powered by Argyll CMS", "help_support": "Hilfe und Unterstützung...", "host.invalid.lookup_failed": "Ungültiger Host (Adressauflösung fehlgeschlagen)", "hue": "Farbton", "icc_absolute_colorimetric": "ICC-absolut farbmetrisch", "icc_version": "ICC-Version", "if_available": "falls verfügbar", "illuminant": "Leuchtmittel", "illuminant_relative_cct": "Leuchtmittel-Bezug CCT", "illuminant_relative_lab": "Leuchtmittel-Bezug Lab", "illuminant_relative_xyz": "Leuchtmittel-Bezug XYZ", "illuminant_xyz": "Leuchtmittel XYZ", "illumination": "Beleuchtung", "in": "Eingang", "info.3dlut_settings": "Eine 3D LUT (LUT = Look Up Table) oder ein ICC-Geräteverknüpfungs-Profil können von manchen farbverwaltungsfähigen Applikationen zur vollständigen Farbkorrektur der Anzeige verwendet werden.\n\nMehrere (zusäzliche) 3D LUTs von einem existierenden Profil erzeugen\nMit dem gewünschten Profil unter Einstellungen gewählt, deaktivieren Sie „Nach Profilierung 3D LUT erstellen“.\n\nDen richtigen Quellfarbraum und eine passende Tonwertkurve auswählen\nFür 3D LUTs und ICC-Geräteverknüpfungs-Profile müssen der Quellfarbraum und die Tonwertkurve vor Erstellung der 3D LUT festgelegt werden, und sind fester Bestandteil der gesamten Farbtransformation (ungleich ICC-Geräteprofilen, die dynamisch verknüpft werden). Zum Bespiel wird HD-Videomaterial üblicherweise entsprechend dem Rec.-709-Farbstandard und einer Gamma-Tonwertkurve mit dem Exponenten 2.2-2.4 (relativ mit Schwarzausgabeoffset von 100%) oder Rec. 1886 Tonwertkurve (absolut mit Schwarzausgabeoffset 0%) aufbereitet. Eine Mischung von Rec.-1886-ähnlicher und exponentieller Gamma-Kurve ist ebenfalls möglich, indem das Schwarzausgabeoffset auf einen Wert zwischen 0% und 100% gesetzt wird.\n\nGamma „absolut“ vs. „relativ“\nUm den Schwarzwert eines Anzeigegerätes zu berücksichtigen, muss die Tonwertkurve entsprechend versetzt und skaliert werden.\n„Absolut“ resultiert in einer tatsächlichen Ausgabe bei 50% Eingabe, die nicht derjenigen einer idealisierten Gammakurve entspricht (es sei denn der Schwarzwert ist null).\n„Relativ“ resultiert in einer tatsächlichen Ausgabe bei 50% Eingabe, die derjenigen einer idealisierten Gammakurve entspricht.\n\nFarbübertragung\nFalls Sie auf einen Weißpunkt kalibriert haben, der von dem des gewählten Quellfarbraums abweicht, und Sie diesen stattdessen für die 3D LUT verwenden möchten, wählen Sie „Relativ farbmetrisch“. Anderenfalls wählen Sie „Absolut farbmetrisch mit Weißpunkt-Skalierung“ (Weißpunkt-Skalierung verhindert Clipping im absolut farbmetrischen Modus, das anderenfalls auftreten könnte falls der Quellfarbraum-Weißpunkt außerhalb des Anzeigegeräte-Farbraums liegt). Außerdem haben Sie die Möglichkeit, eine nicht-farbmetrische Farbübertragung zu verwenden, die den Quellfarbraum komprimiert oder ausdehnt, um in den Anzeigegeräte-Farbraum zu passen (nicht empfohlen, wenn farbmetrische Genauigkeit erforderlich ist).", "info.calibration_settings": "Kalibrierung wird durch interaktive Einstellung des Anzeigegeräts zur Erreichung des gewählten Weißpunkts und/oder der gewählten Luminanz als auch optional durch Generierung von 1D-LUT-Kalibrierungskurven (LUT = Look Up Table) zur Erreichung der gewählten Tonwertkurve und Graubalance ausgeführt. Bitte beachten Sie, falls Sie während der Kalibrierung ausschliesslich das Anzeigegerät einstellen und die Generierung von 1D-LUT-Kurven auslassen möchten, dass die Tonwertkurven-Einstellung in diesem Fall auf „Wie gemessen“ gesetzt werden muss. 1D-LUT-Kalibrierung kann nicht zur vollständigen Farbkorrektur der Anzeige verwendet werden, dazu müssen Sie ein ICC-Geräteprofil oder eine 3D LUT erstellen und diese mit farbverwaltungsfähigen Applikationen verwenden. 1D-LUT-Kalibrierung kann jedoch die Profilierung und 3D-LUT-Kalibrierung ergänzen und unterstützen.", "info.display_instrument": "Falls das Anzeigegerät OLED-, Plasma- oder andere Technologie mit variabler Helligkeitsregelung abhängig vom Bildinhalt verwendet, aktivieren Sie Weißluminanz-Drift-Kompensierung.\n\nFalls das Messgerät ein Spektrometer ist und Sie es im Kontaktmodus auf einem Anzeigegerät mit stabilem Schwarzwert verwenden, so können Sie auch Schwarzabgleich-Drift-Kompensierung aktivieren.\n\nFalls das Messgerät ein Colorimeter ist, sollten Sie eine für das Anzeigegerät oder dessen Anzeigetechnologie geeignete Korrektur verwenden. Beachten Sie, dass manche Messgeräte (ColorHug, ColorHug2, K-10, Spyder4/5) eine Korrektur in einigen ihrer Messmodi beinhalten.", "info.display_instrument.warmup": "Sie sollten das Anzeigegerät mindestens 30 Minuten aufwärmen lassen, bevor Sie mit Messungen beginnen. Falls Sie das Messgerät im Kontaktmodus verwenden, so ist es eine gute Idee, es während dieser Zeit am Anzeigegerät zu belassen.", "info.mr_settings": "Sie können die Genauigkeit eines ICC-Geräteprofils oder einer 3D LUT mit einem Messwertreport überprüfen, welcher detaillierte Statistiken über die Farbfehler der gemessenen Felder enthält.\n\nWenn Sie eine 3D LUT überprüfen, stellen Sie sicher, dass Sie die selben Einstellungen verwenden, die zur Erstellung der 3D LUT zur Anwendung kamen.", "info.profile_settings": "Profilierung ist der Prozess der Charakterisierung eines Anzeigegeräts, bei dem seine vollständige Wiedergabecharakteristik in einem ICC-Geräteprofil aufgezeichnet wird. Das ICC-Geräteprofil kann von Applikationen, die ICC-Farbverwaltung unterstützen, zur vollständigen Farbkorrektur der Anzeige verwendet werden, und/oder es kann zur Erstellung einer 3D LUT (LUT = Look Up Table) dienen, welche denselben Zweck für Applikationen erfüllt, die 3D LUTs unterstützen.\n\nDie Anzahl der Messfelder hat Auswirkungen auf die erreichbare Genauigkeit des resultierenden Profils. Für ein ausreichend genaues 3x3-Matrix-und-Kurven-basiertes Profil können bereits einige dutzend Messfelder genug sein, falls das Anzeigegerät gute additive Farbmischungseigenschaften und Linearität besitzt. Einige professionelle Anzeigegeräte fallen in diese Kategorie. Für höchstmögliche Genauigkeit empfiehlt sich ein LUT-basiertes Profil von mehreren hundert bis zu mehreren tausend Messfeldern. Die „Automatisch optimiert“ Testform-Einstellung berücksichtigt Nichtlinearitäten und tatsächliche Wiedergabecharakteristik eines Anzeigegeräts, und sollte für bestmögliche Resultate verwendet werden. Mit dieser Einstellung lässt sich per Schieberegler ein Kompromiss zwischen Profilgenauigkeit und Mess- sowie Profilberechnungszeit wählen.", "infoframe.default_text": "", "infoframe.title": "Protokoll", "infoframe.toggle": "Protokollfenster zeigen", "initial": "Start", "initializing_gui": "Initialisiere GUI...", "ink_jet_printer": "Tintenstrahldrucker", "input_device_profile": "Eingabegeräteprofil", "input_table": "Eingabe-Tabelle", "install_display_profile": "Anzeigegeräteprofil installieren...", "install_local_system": "Systemweit installieren", "install_user": "Nur für aktuellen Benutzer installieren", "instrument": "Messgerät", "instrument.calibrate": "Setzen Sie das Messgerät auf einen dunklen, nichtreflektierenden Untergrund oder auf eine eventuell zum Messgerät-Zubehör gehörende Kalibrierplatte und drücken Sie dann OK, um das Messgerät zu eichen.", "instrument.calibrate.colormunki": "Drehen Sie den ColorMunki-Sensor in die Kalibrierposition und drücken Sie dann OK, um das Messgerät zu eichen.", "instrument.calibrate.reflective": "Setzen Sie das Messgerät auf die zum Messgerät-Zubehör gehörende Weißkachel mit der Seriennummer %s und drücken Sie dann OK, um das Messgerät zu eichen.", "instrument.calibrating": "Messgerätekalibrierung...", "instrument.connect": "Bitte schließen Sie jetzt Ihr Messgerät an.", "instrument.initializing": "Initialisiere Messgerät, bitte warten...", "instrument.measure_ambient": "Falls Ihr Messgerät einen speziellen Aufsatz zur Umgebungslichtmessung benötigt, bringen Sie diesen bitte an. Platzieren Sie das Messgerät zur Umgebungslichtmessung mit der nach oben gerichteten Messöffnung neben Ihrem Anzeigegerät, oder legen Sie zur Messung eines Normlichtkastens eine Metamerie-freie Graukarte hinein und richten Sie das Messgerät darauf. Weitere Infos zum Messen von Umgebungslicht entnehmen Sie bitte der Dokumentation Ihres Messgeräts. Klicken Sie zum Durchführen der Messung auf OK.", "instrument.place_on_screen": "Setzen Sie das Messgerät auf die Messfläche und klicken Sie OK, um fortzufahren.", "instrument.place_on_screen.madvr": "(%i) Bitte setzen Sie Ihr %s auf die Messfläche", "instrument.reposition_sensor": "Die Messung konnte nicht durchgeführt werden, weil sich der Messgerätesensor in der falschen Position befindet. Bitte korrigieren Sie die Sensorposition und klicken Sie OK, um fortzufahren.", "internal": "Intern", "invert_selection": "Auswahl umkehren", "is_embedded": "Ist eingebettet", "is_illuminant": "Ist Leuchtmittel", "is_linear": "Ist linear", "laptop.icc": "Laptop (Gamma 2.2)", "libXss.so": "X11-Erweiterung für Bildschirmschoner", "library.not_found.warning": "Die Bibliothek „%s“ (%s) wurde nicht gefunden. Bitte stellen Sie sicher, dass diese installiert ist, bevor Sie fortfahren.", "license": "Lizenz", "license_info": "Lizensiert unter der GPL", "linear": "linear", "locale.set": "Setze Lokalisierung: %s", "log.autoshow": "Protokollfenster automatisch zeigen", "luminance": "Helligkeit", "lut_access": "Grafikkarten-Gammatabellen-Zugriff", "madhcnet.outdated": "Die installierte Version von %s gefunden unter %s ist veraltet. Bitte aktualisieren Sie auf die neueste madVR-Version (mindestens %i.%i.%i.%i).", "madtpg.launch.failure": "madTPG wurde nicht gefunden oder konnte nicht gestartet werden.", "madvr.not_found": "Der madVR-DirectShow-Filter wurde nicht in der Registrierungsdatenbank gefunden. Bitte stellen Sie sicher, dass madVR installiert ist.", "madvr.outdated": "Die benutzte Version von madVR ist veraltet. Bitte aktualisieren Sie auf die neueste Version (mindestens %i.%i.%i.%i).", "magenta": "Magenta", "make_and_model": "Gerätehersteller und Modell", "manufacturer": "Hersteller", "matrix": "Matrix", "matte": "Matt", "max": "Max", "maximal": "Maximal", "measure": "Messen", "measure.darken_background": "Schwarzer Hintergrund", "measure.darken_background.warning": "Achtung: Wenn „Schwarzer Hintergrund“ gewählt ist, verdeckt er den gesamten Bildschirm und Sie werden das Einstellungsfenster nicht sehen können! Falls Sie eine Mehrschirmkonfiguration verwenden, verschieben Sie das Einstellungsfenster vor der Messung auf einen anderen Bildschirm, oder benutzen Sie die Tastatur (um die Messung abzubrechen, drücken Sie Q. Falls die Messung bereits läuft, drücken Sie nach einer kurzen Pause nochmals Q).", "measure.override_display_settle_time_mult": "Anzeigegerät-Ausregelzeit-Multiplikator", "measure.override_min_display_update_delay_ms": "Minimale Anzeigegerät-Aktualisierungsverzögerung", "measure.testchart": "Testform messen", "measureframe.center": "Zentrieren", "measureframe.info": "Platzieren Sie das Messfenster an der gewünschten Stelle und passen Sie gegebenenfalls die Größe an. In etwa die gesamte Fensterfläche wird zur Anzeige der Messfelder genutzt, der Kreis dient nur als Positionierhilfe für ihr Messgerät.\nPlatzieren Sie das Messgerät auf dem Messfenster und klicken Sie dann auf „Messung starten“. Um abzubrechen und zum Hauptfenster zurückzukehren, schließen Sie das Messfenster.", "measureframe.infobutton": "Info", "measureframe.measurebutton": "Messung starten", "measureframe.title": "Messfenster", "measureframe.zoomin": "Vergrößern", "measureframe.zoommax": "Maximieren/Wiederherstellen", "measureframe.zoomnormal": "Normale Größe", "measureframe.zoomout": "Verkleinern", "measurement.play_sound": "Akustische Rückmeldung bei fortlaufender Messung", "measurement.set_save_path": "Messwertdatei in folgendem Ordner speichern:", "measurement.untethered": "Nicht verbundene Messung", "measurement_file.check_sanity": "Messwertdatei überprüfen...", "measurement_file.check_sanity.auto": "Messwertdateien automatisch überprüfen", "measurement_file.check_sanity.auto.warning": "Bitte beachten Sie, dass es sich bei der automatischen Messwertüberprüfung um ein experimentelles Feature handelt. Verwendung auf eigene Gefahr.", "measurement_file.choose": "Bitte eine Messwertdatei auswählen", "measurement_file.choose.colorimeter": "Bitte eine Colorimeter-Messwertdatei auswählen", "measurement_file.choose.reference": "Bitte eine Referenz-Messwertdatei auswählen", "measurement_mode": "Modus", "measurement_mode.adaptive": "Adaptiv", "measurement_mode.dlp": "DLP", "measurement_mode.factory": "Werkskalibrierung", "measurement_mode.generic": "Generisch", "measurement_mode.highres": "HiRes", "measurement_mode.lcd": "LCD (generisch)", "measurement_mode.lcd.ccfl": "LCD (CCFL)", "measurement_mode.lcd.ccfl.2": "LCD (CCFL Typ 2)", "measurement_mode.lcd.oled": "LCD (OLED)", "measurement_mode.lcd.white_led": "LCD (Weisse LED)", "measurement_mode.lcd.wide_gamut.ccfl": "Wide Gamut LCD (CCFL)", "measurement_mode.lcd.wide_gamut.rgb_led": "Wide Gamut LCD (RGB LED)", "measurement_mode.raw": "Raw", "measurement_mode.refresh": "Refresh (generisch)", "measurement_report": "Messwertreport...", "measurement_report.update": "Messwert- oder Ausleuchtungs-Report aktualisieren...", "measurement_report_choose_chart": "Bitte wählen Sie die zu messende Testform.", "measurement_report_choose_chart_or_reference": "Bitte wählen Sie eine Testform oder Referenzdatei.", "measurement_report_choose_profile": "Bitte wählen Sie das zu überprüfende Profil.", "measurement_type": "Messungsart", "measurements.complete": "Messung abgeschlossen! Möchten Sie den Ordner mit den Messwertdateien öffnen?", "measuring.characterization": "Messe Farbfelder für Charakterisierung...", "media_black_point": "Medien-Schwarzpunkt", "media_relative_colorimetric": "Medien-relativ farbmetrisch", "media_white_point": "Medien-Weißpunkt", "menu.about": "Über...", "menu.file": "Datei", "menu.help": "?", "menu.language": "Sprache", "menu.options": "Optionen", "menu.tools": "Werkzeuge", "menuitem.quit": "Beenden", "menuitem.set_argyll_bin": "Argyll-CMS-Programmverzeichnis festlegen...", "metadata": "Metadaten", "min": "Min", "minimal": "Minimal", "model": "Modell", "named_color_profile": "Farbwerte-Profil", "named_colors": "Farbwerte", "native": "Nativ", "negative": "Negativ", "no": "Nein", "no_settings": "Die Datei enthält keine Einstellungen.", "none": "Keine", "not_applicable": "Nicht zutreffend", "not_connected": "Nicht verbunden", "not_found": "„%s“ wurde nicht gefunden.", "not_now": "Nicht jetzt", "number_of_entries": "Anzahl Werte", "number_of_entries_per_channel": "Anzahl Werte pro Kanal", "observer": "Beobachter", "observer.1931_2": "CIE 1931 2°", "observer.1955_2": "Stiles & Birch 1955 2°", "observer.1964_10": "CIE 1964 10°", "observer.1964_10c": "CIE 1964 10° / 1931 2° Hybrid", "observer.1978_2": "Judd & Voss 1978 2°", "observer.shaw": "Shaw & Fairchild 1997 2°", "oem.import.auto": "Falls Ihr Colorimeter mit einer Software-CD für Windows geliefert wurde, legen Sie diese bitte ein (brechen Sie eine eventuell automatisch startende Software-Installation ab).\n\nFalls Sie keine CD besitzen und die benötigten Dateien nicht automatisch gefunden werden können, werden diese aus dem Web heruntergeladen.", "oem.import.auto.download_selection": "Eine Vorauswahl wurde anhand der erkannten Messgeräte festgelegt. Bitte wählen Sie die herunterzuladende(n) Datei(en) (die Gesamt-Datenmenge beträgt je nach Auswahl bis zu mehrere hundert MB).", "oem.import.auto_windows": "Falls Sie die Hersteller-Software Ihres Colorimeters installiert haben, können die benötigten Dateien in den meisten Fällen automatisch gefunden werden.", "office_web.icc": "Büro & Web (D65, Gamma 2.2)", "offset": "Versatz", "offset_lithography": "Offsetdruck", "ok": "OK", "or": "oder", "osd": "OSD", "other": "Andere", "out": "Ausgang", "out_of_gamut_tag": "Gamut-Prüftabelle", "output.profile": "Zielprofil", "output_device_profile": "Ausgabegeräteprofil", "output_offset": "Ausgabe-Offset", "output_table": "Ausgabe-Tabelle", "overwrite": "Überschreiben", "panel.surface": "Paneloberfläche", "panel.type": "Panel-Typ", "passive_matrix_display": "Passiv-Matrix Anzeigegerät", "patch.layout.select": "Bitte wählen Sie eine Messfeld-Anordnung:", "patches": "Felder", "patterngenerator.prisma.specify_host": "Bitte geben Sie den Host-Namen Ihres Prisma Video-Prozessors an, zum Beispiel prisma-0123 (Windows) bzw. prisma-0123.local (Linux/Mac OS X). Sie finden den Host-Namen auf einem Etikett an der Unterseite Ihres Prisma, solang er nicht über das administrative Web-Interface geändert wurde. Alternativ geben Sie die IP-Adresse ein (falls bekannt), z.B. 192.168.1.234", "patterngenerator.sync_lost": "Synchronisierung mit Testfeld-Generator verloren.", "pause": "Pause", "pcs_illuminant_xyz": "PCS-Leuchtmittel XYZ", "pcs_relative_cct": "PCS-Bezug CCT", "pcs_relative_lab": "PCS-Bezug Lab", "pcs_relative_xyz": "PCS-Bezug XYZ", "pcs_to_device_intent_0": "PCS zu Gerät: Anpassungsart 0", "pcs_to_device_intent_1": "PCS zu Gerät: Anpassungsart 1", "pcs_to_device_intent_2": "PCS zu Gerät: Anpassungsart 2", "perceptual": "Wahrnehmung", "photo.icc": "Photo (D50, Gamma 2.2)", "photo_imagesetter": "Photo-Filmbelichter", "photographic_paper_printer": "Fotopapier-Drucker", "platform": "Plattform", "please_wait": "Bitte warten...", "port.invalid": "Ungültige Portnummer: %s", "positive": "Positiv", "preferred_cmm": "Bevorzugtes CMM", "prepress.icc": "Druckvorstufe (D50, 130 cd/m², L*)", "preset": "Voreinstellung", "preview": "Vorschau", "profile": "Profil", "profile.advanced_gamap": "Erweitert...", "profile.b2a.hires": "Effektive Auflösung der farbmetrischen Bezugsfarbraum-zu-Gerätefarbraum-Tabelle verbessern", "profile.b2a.lowres.warning": "Das Profil enthält scheinbar keine hochauflösende Bezugsfarbraum-zu-Gerätefarbraum-Tabellen, die zur Verwendung als Anzeigegeräteprofil notwendig sind. Möchten Sie hochauflösende Tabellen jetzt erzeugen? Das wird einige Minuten dauern.", "profile.b2a.smooth": "Glätten", "profile.choose": "Bitte wählen Sie ein Profil.", "profile.confirm_regeneration": "Möchten Sie das Profil neu erstellen?", "profile.created": "Das Profil wurde erstellt.", "profile.current": "Aktuelles Profil", "profile.do_not_install": "Profil nicht installieren", "profile.iccv4.unsupported": "ICC-Profile der Version 4 werden nicht unterstützt.", "profile.import.success": "Das Profil wurde importiert. Sie müssen es eventuell manuell in den Systemeinstellungen „Farbe“ zuweisen und aktivieren.", "profile.info": "Profilinformationen", "profile.info.show": "Profilinformationen zeigen", "profile.install": "Profil installieren", "profile.install.error": "Das Profil konnte nicht installiert/aktiviert werden.", "profile.install.osx_manual_select": "Das Profil wurde installiert. Bitte aktivieren Sie es in der Systemeinstellung „Monitore“.", "profile.install.success": "Das Profil wurde installiert und aktiviert.", "profile.install.virtual.unsupported": "Profile können nicht für virtuelle Anzeigegeräte installiert werden.", "profile.install.warning": "Das Profil wurde installiert, allerdings sind Probleme aufgetreten.", "profile.install_local_system": "Profil als Systemstandard installieren", "profile.install_network": "Profil im Netzwerk installieren", "profile.install_user": "Profil nur für aktuellen Benutzer installieren", "profile.invalid": "Ungültiges Profil.", "profile.load_error": "Anzeigegeräteprofil konnte nicht geladen werden.", "profile.load_on_login": "Kalibrierung beim Anmelden laden", "profile.load_on_login.handled_by_os": "Kalibrierung vom Betriebssystem laden lassen (niedrige Präzision und Zuverlässigkeit)", "profile.name": "Profilname", "profile.name.create": "Profilname erzeugen", "profile.name.placeholders": "Sie können folgende Platzhalter im Profilnamen verwenden:\n\n%a Abgekürzter Wochentagsname\n%A Voller Wochentagsname\n%b Abgekürzter Monatsname\n%B Voller Monatsname\n%d Tag des Monats\n%H Stunde (24-Stunden-Format)\n%I Stunde (12-Stunden-Format)\n%j Tag des Jahres\n%m Monat\n%M Minute\n%p AM/PM\n%S Sekunde\n%U Woche (Sonntag als erster Wochentag)\n%w Wochentag (Sonntag ist 0)\n%W Woche (Montag als erster Wochentag)\n%y Jahr ohne Jahrhundert\n%Y Jahr inklusive Jahrhundert", "profile.no_embedded_ti3": "Das Profil enthält keine Argyll-kompatiblen Messwerte.", "profile.no_vcgt": "Das Profil enthält keine Kalibrierungskurven.", "profile.only_named_color": "Nur Profile des Typs „Named Color“ können verwendet werden.", "profile.quality": "Profilqualität", "profile.quality.b2a.low": "Niedrige Qualität für Bezugsfarbraum-zu-Gerätefarbraum-Tabellen verwenden", "profile.quality.b2a.low.info": "Wählen Sie diese Option, wenn das Profil ausschliesslich mit inversem Gerätefarbraum-zu-Bezugsfarbraum-Gamut-Mapping zum Erstellen eines DeviceLinks oder einer 3D LUT verwendet werden soll", "profile.required_tags_missing": "Es fehlen benötigte Tags im Profil: %s", "profile.self_check": "Profil-Selbsttest ΔE*76", "profile.self_check.avg": "Durchschnitt", "profile.self_check.max": "Maximum", "profile.self_check.rms": "RMS", "profile.set_save_path": "Ablagepfad auswählen...", "profile.settings": "Profilierungseinstellungen", "profile.share": "Profil hochladen...", "profile.share.avg_dE_too_high": "Das Profil weist ein zu hohes Delta E auf (ist = %s, Schwellenwert = %s).", "profile.share.b2a_resolution_too_low": "Die Bezugsfarbraum-zu-Gerätefarbraum-Tabellen des Profils sind zu niedrig aufgelöst.", "profile.share.enter_info": "Sie können Ihr Profil mit anderen Nutzern über den OpenSUSE „ICC Profile Taxi“-Service teilen.\n\nBitte geben Sie dazu eine aussagekräftige Beschreibung und die zutreffenden Anzeigegeräteeigenschaften an. Lesen Sie die Anzeigegeräteeinstellungen vom On-Screen-Menü ihres Anzeigegerätes ab und tragen nur die für ihr Anzeigegerät zutreffenden Einstellungen ein, die von Standardeinstellungen abweichen.\nEin Beispiel: Für die meisten Anzeigegeräte sind das der Name der gewählten Voreinstellung, Helligkeit, Kontrast, Farbtemperatur und/oder Weißpunkt-RGB-Werte, sowie Gamma. Bei Laptops und Notebooks in der Regel nur die Helligkeit. Falls Sie bei der Kalibrierung ihres Anzeigegerätes weitere Einstellungen gemacht haben, tragen Sie auch diese ein falls möglich.", "profile.share.meta_missing": "Das Profil enthält nicht die notwendigen Meta-Informationen.", "profile.share.success": "Profil erfolgreich hochgeladen.", "profile.testchart_recommendation": "Um ein hochwertiges Profil zu erzeugen, wird eine Testform mit einer höheren Anzahl Testfelder empfohlen, die dann allerdings auch mehr Zeit zum Messen benötigt. Möchten Sie die empfohlene Testform verwenden?", "profile.type": "Profiltyp", "profile.type.gamma_matrix": "Gamma + Matrix", "profile.type.lut.lab": "L*a*b* LUT", "profile.type.lut.xyz": "XYZ LUT", "profile.type.lut_matrix.xyz": "XYZ LUT + Matrix", "profile.type.lut_rg_swapped_matrix.xyz": "XYZ LUT + vertauschte Matrix", "profile.type.shaper_matrix": "Kurven + Matrix", "profile.type.single_gamma_matrix": "Einzelnes Gamma + Matrix", "profile.type.single_shaper_matrix": "Einzelne Kurve + Matrix", "profile.unsupported": "Nicht unterstützter Profil-Typ (%s) und/oder -Farbraum (%s).", "profile.update": "Profil aktualisieren", "profile_class": "Profilklasse", "profile_connection_space_pcs": "Bezugsfarbraum (PCS)", "profile_loader": "Profil-Lader", "profile_loader.exit_warning": "Möchten Sie den Profil-Lader wirklich beenden? Die Kalibrierung wird dann nicht mehr automatisch neu geladen, wenn sich die Anzeigegerätekonfiguration ändert!", "profile_loader.fix_profile_associations": "Profilzuweisungen automatisch reparieren", "profile_loader.fix_profile_associations_warning": "So lange der Profil-Lader läuft, kann er sich um Profilzuweisungen kümmern, wenn Sie die Anzeigegerätekonfiguration ändern.\n\nBevor Sie fortfahren, stellen Sie bitte sicher, dass die oben gezeigten Profilzuweisungen korrekt sind. Falls dies nicht der Fall ist, folgen Sie diesen Schritten:\n\n1. Öffnen Sie die Windows-Anzeigeeinstellungen.\n2. Aktivieren Sie alle angeschlossenen Anzeigegeräte („Diese Anzeigen erweitern“).\n3. Öffnen Sie die Windows-Farbverwaltungs-Einstellungen in der Systemsteuerung.\n4. Stellen Sie sicher, dass jedem Anzeigegerät das korrekte Profil zugewiesen ist. Dann schliessen Sie die Farbverwaltung.\n5. In den Windows-Anzeigeeinstellungen, kehren Sie zur vorherigen Anzeigekonfiguration zurück.\n6. Nun können Sie „Profilzuweisungen automatisch reparieren“ aktivieren.", "profile_loader.info": "Kalibrierungszustand wurde heute bisher %i mal (wieder)hergestellt.\nRechtsklick aufs Icon für Menü.", "profiling": "Profilierung", "profiling.complete": "Profilierung abgeschlossen!", "profiling.incomplete": "Die Profilierung wurde nicht abgeschlossen.", "projection_television": "Rückprojektions-Fernseher", "projector": "Projektor", "projector_mode_unavailable": "Der Projektor-Modus ist erst mit Argyll CMS 1.1.0 Beta oder neuer verfügbar.", "quality.ultra.warning": "Ultra-Qualität sollte so gut wie nie benutzt werden, ausser um damit zu belegen, dass sie so gut wie nie benutzt werden sollte (sehr lange Verarbeitungszeit!). Verwenden Sie stattdessen hohe oder mittlere Qualität.", "readme": "LiesMich", "ready": "Bereit.", "red": "Rot", "red_gamma": "Rot Gamma", "red_lab": "Rot Lab", "red_matrix_column": "Roter Matrix-Farbwert", "red_maximum": "Rot Maximum", "red_minimum": "Rot Minimum", "red_tone_response_curve": "Rote Farbtonwiedergabekurve", "red_xyz": "Rot XYZ", "reference": "Referenz", "reflective": "Aufsicht", "reflective_scanner": "Auflicht-Scanner", "remaining_time": "Verbleibende Zeit (ca.)", "rendering_intent": "Farbübertragung", "report.calibrated": "Kalibriertes Anzeigegerät messen (Kurzreport)", "report.uncalibrated": "Unkalibriertes Anzeigegerät messen (Kurzreport)", "report.uniformity": "Anzeigegeräteausleuchtung messen...", "resources.notfound.error": "Kritischer Fehler: Eine benötigte Datei wurde nicht gefunden:", "resources.notfound.warning": "Warnung: Einige benötigte Dateien wurden nicht gefunden:", "response.invalid": "Ungültige Antwort von %s: %s", "response.invalid.missing_key": "Ungültige Antwort von %s: Fehlender Schlüssel „%s“: %s", "response.invalid.value": "Ungültige Antwort von %s: Wert von Schlüssel „%s“ entspricht nicht dem erwarteten Wert „%s“: %s", "restore_defaults": "Standardeinstellungen wiederherstellen", "rgb.trc": "RGB Übertragungsfunktion", "rgb.trc.averaged": "gemittelte RGB Übertragungsfunktion", "sRGB.icc": "sRGB", "saturation": "Sättigung", "save": "Sichern", "save_as": "Sichern unter...", "scripting-client": "DisplayCAL Skript-Client", "scripting-client.cmdhelptext": "Drücken Sie die Tabulator-Taste bei leerer Befehlszeile zur Anzeige der möglichen Befehle im momentanen Kontext, oder zur Autovervollständigung bei bereits eingetippten Anfangsbuchstaben. Tippen Sie „getcommands“ für eine Liste unterstützter Befehle und möglicher Parameter der verbundenen Applikation.", "scripting-client.detected-hosts": "Erkannte Skript-Hosts:", "select_all": "Alles auswählen", "setting.keep_current": "Aktuelle Einstellung beibehalten", "settings.additional": "Weitere Einstellungen", "settings.basic": "Grundlegende Einstellungen", "settings.new": "", "settings_loaded": "Kalibrierungskurven und die folgenden Einstellungen wurden geladen: %s. Andere Kalibrierungseinstellungen wurden auf Standardwerte zurückgesetzt und die Profilierungseinstellungen nicht verändert.", "settings_loaded.all": "Einstellungen und Kalibrierungskurven wurden geladen.", "settings_loaded.cal": "Das Profil enthielt nur Kalibrierungseinstellungen. Andere Einstellungen wurden nicht verändert. Keine Kalibrierungskurven gefunden.", "settings_loaded.cal_and_lut": "Das Profil enthielt nur Kalibrierungseinstellungen. Andere Einstellungen wurden nicht verändert und die Kalibrierungskurven geladen.", "settings_loaded.cal_and_profile": "Einstellungen wurden geladen. Keine Kalibrierungskurven gefunden.", "settings_loaded.profile": "Das Profil enthielt nur Profilierungseinstellungen. Andere Einstellungen wurden nicht verändert. Keine Kalibrierungskurven gefunden.", "settings_loaded.profile_and_lut": "Das Profil enthielt nur Profilierungseinstellungen. Andere Einstellungen wurden nicht verändert und die Kalibrierungskurven geladen.", "show_advanced_options": "Erweiterte Optionen zeigen", "silkscreen": "Siebdruck", "simulation_profile": "Simulationsprofil", "size": "Größe", "softproof.icc": "Softproof (D55, 160 cd/m², L*)", "spectral": "Spektral", "startup": "Starte...", "startup_sound.enable": "Start-Klang aktivieren", "success": "...ok.", "surround_xyz": "Umgebungslicht XYZ", "synthicc.create": "Synthethisches ICC Profil erzeugen...", "target": "Ziel", "tc.3d": "3D-Datei zur Diagnose erstellen", "tc.I": "Kubisches Raster (wahrnehmungsorientiert)", "tc.Q": "Wahrnehmungsorientiert füllend (quasi-zufällig)", "tc.R": "Wahrnehmungsorientiert (zufällig)", "tc.adaption": "Anpassung", "tc.algo": "Verteilung", "tc.angle": "Winkel", "tc.black": "Schwarze Felder", "tc.dark_emphasis": "Betonung dunkler Bereiche", "tc.fullspread": "Iterative Felder", "tc.gray": "Neutrale Felder", "tc.i": "Kubisches Raster (Geräte-Farbraum)", "tc.limit.sphere": "Felder auf Kugel begrenzen", "tc.limit.sphere_radius": "Radius", "tc.multidim": "Multidimensional", "tc.multidim.patches": "Schritte = %s Felder (%s neutrale)", "tc.neutral_axis_emphasis": "Grauachsengewichtung", "tc.ofp": "Optimierte Fernste-Punkte-Abtastung", "tc.patch": "Feld", "tc.patches.gray": "grau", "tc.patches.selected": "ausgewählt", "tc.patches.total": "Felder gesamt", "tc.precond": "Profil zur Vorkonditionierung", "tc.precond.notset": "Bitte wählen Sie ein Profil zur Vorkonditionierung.", "tc.preview.create": "Erstelle Vorschau, bitte warten...", "tc.q": "Geräte-Farbraum füllend (quasi-zufällig)", "tc.r": "Geräte-Farbraum (zufällig)", "tc.single": "Einzelkanal-Felder", "tc.single.perchannel": "pro Kanal", "tc.t": "Inkrementelle Ferne-Punkte-Abtastung", "tc.vrml.black_offset": "RGB Schwarz-Offset (L*)", "tc.vrml.device": "Geräte-Farborte", "tc.vrml.lab": "Lab-Farborte", "tc.vrml.save_as": "VRML-Datei(en) sichern unter...", "tc.vrml.use_D50": "Neutrales RGB-Weiß", "tc.white": "Weiße Felder", "technology": "Technologie", "tempdir_should_still_contain_files": "Erzeugte Dateien sollten sich noch im temporären Verzeichnis „%s“ befinden.", "testchart.add_saturation_sweeps": "Sättigungsfelder hinzufügen", "testchart.add_ti3_patches": "Referenzfelder hinzufügen...", "testchart.auto_optimize.untethered.unsupported": "Das virtuelle nicht verbundene Anzeigegerät unterstützt keine automatische Testform-Optimierung.", "testchart.change_patch_order": "Feldreihenfolge ändern", "testchart.confirm_select": "Datei gespeichert. Möchten Sie diese Testform auswählen?", "testchart.create": "Testform erstellen", "testchart.discard": "Verwerfen", "testchart.dont_select": "Nicht auswählen", "testchart.edit": "Testform bearbeiten...", "testchart.export.repeat_patch": "Jedes Feld wiederholen:", "testchart.file": "Testform", "testchart.info": "Anzahl Felder in gewählter Testform", "testchart.invalid": "Testform ungültig!", "testchart.optimize_for_untethered_auto_mode": "Für nicht verbundenen Messmodus optimieren", "testchart.patches_amount": "Feldanzahl", "testchart.read": "Lese Testform...", "testchart.save_or_discard": "Die Testform wurde nicht gesichert.", "testchart.select": "Auswählen", "testchart.separate_fixed_points": "Bitte wählen Sie die Felder, die in einem separaten Arbeitsschritt hinzugefügt werden sollen.", "testchart.set": "Testform auswählen...", "testchart.sort_RGB_blue_to_top": "RGB-Blau nach oben", "testchart.sort_RGB_cyan_to_top": "RGB-Cyan nach oben", "testchart.sort_RGB_gray_to_top": "RGB-Grau nach oben", "testchart.sort_RGB_green_to_top": "RGB-Grün nach oben", "testchart.sort_RGB_magenta_to_top": "RGB-Magenta nach oben", "testchart.sort_RGB_red_to_top": "RGB-Rot nach oben", "testchart.sort_RGB_white_to_top": "RGB-Weiß nach oben", "testchart.sort_RGB_yellow_to_top": "RGB-Gelb nach oben", "testchart.sort_by_HSI": "Nach HSI sortieren", "testchart.sort_by_HSL": "Nach HSL sortieren", "testchart.sort_by_HSV": "Nach HSV sortieren", "testchart.sort_by_L": "Nach L* sortieren", "testchart.sort_by_RGB": "Nach RGB sortieren", "testchart.sort_by_RGB_sum": "Nach Summe von RGB sortieren", "testchart_or_reference": "Testform oder Referenz", "thermal_wax_printer": "Thermosublimationsdrucker", "tone_values": "Tonwertstufen", "transfer_function": "Übertragungsfunktion", "translations": "Übersetzungen", "transparency": "Durchsicht", "trashcan.linux": "Mülleimer", "trashcan.mac": "Papierkorb", "trashcan.windows": "Papierkorb", "trc": "Tonwertkurve", "trc.dicom": "DICOM", "trc.gamma": "Gamma", "trc.lstar": "L*", "trc.rec1886": "Rec. 1886", "trc.rec709": "Rec. 709", "trc.should_use_viewcond_adjust": "Wenn Sie die Rec.-709-, SMPTE-240M- oder sRGB-Kurven verwenden, sollten Sie auch eine Anpassung der Betrachtungsbedingungen an Ihr Umgebungslicht durchführen, um ein korrektes Ergebnis zu erhalten. Aktivieren Sie hierzu das Kontrollkästchen „Umgebungshelligkeit“ und geben Sie einen Wert in Lux ein, oder messen Sie das Umgebungslicht während der Kalibrierung (falls von Ihrem Messgerät unterstützt).", "*trc.smpte2084": "SMPTE 2084", "trc.smpte240m": "SMPTE 240M", "trc.srgb": "sRGB", "trc.type.absolute": "Absolut", "trc.type.relative": "Relativ", "turn_off": "Ausschalten", "type": "Typ", "udev_hotplug.unavailable": "Weder udev noch hotplug wurden erkannt.", "uninstall_display_profile": "Anzeigegeräteprofil deinstallieren...", "unknown": "Unbekannt", "unmodified": "Unverändert", "unnamed": "Unbenannt", "update_check": "Auf Programmaktualisierung überprüfen...", "update_check.fail": "Programmaktualisierungsüberprüfung fehlgeschlagen:", "update_check.fail.version": "Versionsdatei vom Server %s konnte nicht korrekt interpretiert werden.", "update_check.new_version": "Es ist eine Programmaktualisierung verfügbar: %s", "update_check.onstartup": "Beim Start auf Programmaktualisierung überprüfen", "update_check.uptodate": "%s ist auf dem neuesten Stand.", "update_now": "Jetzt aktualisieren", "upload": "Hochladen", "use_fancy_progress": "Ausgefallene Fortschrittsanzeige verwenden", "use_separate_lut_access": "Gesonderten Grafikkarten-Gammatabellen-Zugriff verwenden", "use_simulation_profile_as_output": "Simulationsprofil als Zielprofil verwenden", "vcgt": "Kalibrierungskurven", "vcgt.mismatch": "Die Grafikkarten-Gammatabelle für Anzeigegerät %s stimmt nicht mit dem gewünschten Zustand überein.", "vcgt.unknown_format": "Unbekanntes Grafikkarten-Gammatabellen-Format in Profil „%s“.", "verification": "Überprüfung", "verification.settings": "Überprüfungseinstellungen", "verify.ti1": "Überprüfungs-Testform", "verify_extended.ti1": "Erweiterte Überprüfungs-Testform", "verify_grayscale.ti1": "Graubalance-Überprüfungs-Testform", "verify_large.ti1": "Große Überprüfungs-Testform", "verify_video.ti1": "Überprüfungs-Testform (Video)", "verify_video_extended.ti1": "Erweiterte Überprüfungs-Testform (Video)", "verify_video_large.ti1": "Große Überprüfungs-Testform (Video)", "verify_video_xl.ti1": "Sehr große Überprüfungs-Testform (Video)", "verify_video_xxl.ti1": "XXL Überprüfungs-Testform (Video)", "verify_video_xxxl.ti1": "XXXL Überprüfungs-Testform (Video)", "verify_xl.ti1": "Sehr große Überprüfungs-Testform", "verify_xxl.ti1": "XXL Überprüfungs-Testform", "verify_xxxl.ti1": "XXXL Überprüfungs-Testform", "vga": "VGA", "video.icc": "Video (D65, Rec. 1886)", "video_Prisma.icc": "Video 3D LUT für Prisma (D65, Rec. 709 / Rec. 1886)", "video_ReShade.icc": "Video 3D LUT für ReShade (D65, Rec. 709 / Rec. 1886)", "video_camera": "Video-Kamera", "video_card_gamma_table": "Grafikkarten-Gammatabelle", "video_eeColor.icc": "Video 3D LUT für eeColor (D65, Rec. 709 / Rec. 1886)", "video_madVR.icc": "Video 3D LUT für madVR (D65, Rec. 709 / Rec. 1886)", "video_monitor": "Video-Monitor", "video_resolve.icc": "Video 3D LUT für Resolve (D65, Rec. 709 / Rec. 1886)", "view.3d": "3D-Ansicht", "viewing_conditions": "Betrachtungbedingungen", "viewing_conditions_description": "Beschreibung der Betrachtungbedingungen", "vrml_to_x3d_converter": "VRML zu X3D Konverter", "warning": "Warnung", "warning.already_exists": "Die Datei „%s“ existiert bereits am gewählten Ort und wird überschrieben. Wollen Sie wirklich fortfahren?", "warning.autostart_system": "Das systemweite Autostart-Verzeichnis konnte nicht ermittelt werden.", "warning.autostart_user": "Das benutzerspezifische Autostart-Verzeichnis konnte nicht ermittelt werden.", "warning.copy_failed_continue": "Die Datei „%s“ konnte nicht nach „%s“ kopiert werden. Fahre fort...", "warning.discard_changes": "Möchten Sie die Änderungen an den aktuellen Einstellungen wirklich verwerfen?", "warning.input_value_clipping": "Warnung: Eingabewerte unterhalb des Ziel-Schwarzpunkts werden abgeschnitten!", "warning.no_comports_detected": "Es wurde kein Messgerät erkannt.", "warning.suspicious_delta_e": "Warnung: Verdächtige Messwerte wurden gefunden. Bitte beachten Sie, dass die Prüfung ein in gewissem Unfang sRGB-ähnliches Anzeigegerät annimmt. Weicht Ihr Anzeigegerät über eine bestimmte Toleranzschwelle hinaus davon ab (z.B. Bildschirme mit sehr breitem Gamut oder Tonwertkurve stark abweichend von sRGB), so sind gefundene Fehler eventuell nicht aussagekräftig.\n\nEines oder alle der folgenden Kriterien trafen zu:\n\n• Aufeinanderfolgende Farbfelder mit unterschiedlichen RGB-Werten, aber verdächtig niedrigem ΔE*00 der Messwerte gegeneinander.\n• RGB-Grau mit aufsteigenden RGB-Werten gegenüber dem vorherigenn Farbfeld, aber fallender Helligkeit (L*).\n• RGB-Grau mit absteigenden RGB-Werten gegenüber dem vorherigenn Farbfeld, aber steigender Helligkeit (L*).\n• Ungewöhnlich hohes ΔE*00 und ΔL*00 oder ΔH*00 oder ΔC*00 der gemessenen Werte zum sRGB-Äquivalent der RGB-Werte.\n\nDies könnte auf Messfehler hindeuten. Werte, die als problematisch erachtet werden (was nicht stimmen muss!), werden rot hervorgehaben. Überprüfen Sie die Messwerte sorgfältig und wählen Sie Felder, die Sie übernehmen möchten. Sie können die RGB- und XYZ-Werte auch bearbeiten.", "warning.suspicious_delta_e.info": "Erklärung der Δ-Spalten:\n\nΔE*00 XYZ A/B: ΔE*00 der Messwerte des Farbfelds zu den Messwerten des vorherigen Farbfelds. Fehlt dieser Wert, so war er für die Prüfung nicht ausschlaggebend. Ist er angegeben, so wurde er als zu niedrig vermutet.\n\n0.5 ΔE*00 RGB A/B: ΔE*00 des sRGB-Äquivalents der RGB-Werte des Farbfelds zum sRGB-Äquivalent der RGB-Werte des vorherigen Farbfelds (Faktor 0.5). Ist dieser Wert angegeben, so gibt er den Vergleichswert (Mindestwert) an, der bei der Prüfung auf vermutet zu niedriges ΔE*00 XYZ A/B Verwendung fand. Er dient als sehr grobe Orientierung.\n\nΔE*00 RGB-XYZ: ΔE*00 der Messwerte zum sRGB-Äquivalent der RGB-Werte.\nΔL*00 RGB-XYZ: ΔL*00 der Messwerte zum sRGB-Äquivalent der RGB-Werte.\nΔC*00 RGB-XYZ: ΔC*00 der Messwerte zum sRGB-Äquivalent der RGB-Werte.\nΔH*00 RGB-XYZ: ΔH*00 der Messwerte zum sRGB-Äquivalent der RGB-Werte.", "warning.system_file": "Warnung: “%s” ist eine Systemdatei. Möchten Sie wirklich fortfahren?", "webserver.waiting": "Webserver wartet unter", "welcome": "Willkommen!", "welcome_back": "Willkommen zurück!", "white": "Weiß", "whitepoint": "Weißpunkt", "whitepoint.colortemp": "Farbtemperatur", "whitepoint.colortemp.locus.blackbody": "Schwarzkörper", "whitepoint.colortemp.locus.curve": "Farbtemperatur-Kurve", "whitepoint.colortemp.locus.daylight": "Tageslicht", "whitepoint.set": "Möchten sie auch den Weißpunkt auf den gemessenen Wert setzen?", "whitepoint.simulate": "Weißpunkt simulieren", "whitepoint.simulate.relative": "Relativ zum Zielprofil-Weißpunkt", "whitepoint.xy": "Farbort", "window.title": "DisplayCAL", "windows.version.unsupported": "Diese Version von Windows wird nicht unterstützt.", "windows_only": "Nur Windows", "working_dir": "Arbeitsverzeichnis:", "yellow": "Gelb", "yellow_lab": "Gelb Lab", "yellow_xyz": "Gelb XYZ", "yes": "Ja", } DisplayCAL-3.1.0.0/DisplayCAL/lang/en.json0000644000076500000000000023704712653526635017667 0ustar devwheel00000000000000{ "*": "Note to translators: Keys which are not yet translated are marked with a leading asterisk (*) and are indented with two tabs instead of one. Please remove the asterisk when translated.", "!author": "Florian Höch", "!language": "English", "!language_name": "ENGLISH", "3dlut": "3D LUT", "3dlut.1dlut.videolut.nonlinear": "The display device's video card gamma tables 1D LUT calibration is non-linear, but the 3D LUT contains applied 1D LUT calibration. Make sure to manually reset the video card gamma tables to linear before using the 3D LUT, or create a 3D LUT without calibration applied (to do the latter, enable “Show advanced options” in the “Options” menu and disable “Apply calibration (vcgt)” as well as “Create 3D LUT after profiling” in the 3D LUT settings, then create a new 3D LUT).", "3dlut.bitdepth.input": "3D LUT input bitdepth", "3dlut.bitdepth.output": "3D LUT output bitdepth", "3dlut.create": "Create 3D LUT...", "3dlut.create_after_profiling": "Create 3D LUT after profiling", "3dlut.encoding.input": "Input encoding", "3dlut.encoding.output": "Output encoding", "3dlut.encoding.output.warning.madvr": "Warning: This output encoding is not recommended and will cause clipping if madVR is not set up to output “TV levels (16-235)” under “Devices” → “%s” → “Properties”. Use at own risk!", "3dlut.encoding.type_2": "TV Rec. 2020 YCbCr UHD", "3dlut.encoding.type_5": "TV Rec. 709 1250/50Hz YCbCr HD", "3dlut.encoding.type_6": "TV Rec. 601 YCbCr SD", "3dlut.encoding.type_7": "TV Rec. 709 1125/60Hz YCbCr HD", "3dlut.encoding.type_C": "TV Rec. 2020 Constant Luminance YCbCr UHD", "3dlut.encoding.type_T": "TV RGB 16-235 (clip WTW)", "3dlut.encoding.type_X": "TV xvYCC Rec. 709 YCbCr HD", "3dlut.encoding.type_n": "Full range RGB 0-255", "3dlut.encoding.type_t": "TV RGB 16-235", "3dlut.encoding.type_x": "TV xvYCC Rec. 601 YCbCr (Rec. 709 Primaries) SD", "3dlut.format": "3D LUT file format", "3dlut.format.3dl": "Autodesk Lustre / Kodak Look Manager System (.3dl)", "3dlut.format.cube": "IRIDAS (.cube)", "3dlut.format.eeColor": "eeColor Processor (.txt)", "3dlut.format.madVR": "madVR (.3dlut)", "3dlut.format.mga": "Pandora (.mga)", "3dlut.format.png": "PNG (.png)", "3dlut.format.ReShade": "ReShade (.png, .fx)", "3dlut.format.spi3d": "Sony Imageworks (.spi3d)", "3dlut.frame.title": "Create 3D LUT", "3dlut.holder.assign_preset": "Assign 3D LUT to preset:", "3dlut.holder.out_of_memory": "%s is out of 3D LUT storage space (at least %i KB required). Please delete a few 3D LUTs from %s to make space for new ones. See your %s's documentation for more information.", "3dlut.input.colorspace": "Source colorspace", "3dlut.input.profile": "Source profile", "3dlut.install": "Install 3D LUT", "3dlut.install.failure": "3D LUT installation failed (unknown error).", "3dlut.install.success": "3D LUT installation successful!", "3dlut.install.unsupported": "3D LUT installation is not supported for the selected 3D LUT format.", "3dlut.enable": "Enable 3D LUT", "3dlut.save_as": "Save 3D LUT as...", "3dlut.settings": "3D LUT settings", "3dlut.size": "3D LUT size", "3dlut.tab.enable": "Enable 3D LUT tab", "3dlut.use_abstract_profile": "Abstract (“Look”) profile", "CMP_Digital_Target-3.cie": "CMP Digital Target 3", "CMP_Digital_Target-4.cie": "CMP Digital Target 4", "CMYK_IDEAlliance_ControlStrip_2009.ti1": "IDEAlliance Control Strip 2009", "ColorChecker.cie": "ColorChecker", "ColorCheckerDC.cie": "ColorChecker DC", "ColorCheckerPassport.cie": "ColorChecker Passport", "ColorCheckerSG.cie": "ColorChecker SG", "FograStrip2.ti1": "Fogra Media Wedge CMYK V2.0", "FograStrip3.ti1": "Fogra Media Wedge CMYK V3.0", "QPcard_201.cie": "QPcard 201", "QPcard_202.cie": "QPcard 202", "SpyderChecker.cie": "SpyderCHECKR", "Untethered": "Untethered", "[rgb]TRC": "Tone response curves", "aborted": "...aborted.", "aborting": "Aborting, please wait (this may take a few seconds)...", "abstract_profile": "Abstract profile", "active_matrix_display": "Active matrix display", "adaptive_mode_unavailable": "Adaptive mode is only available with Argyll CMS 1.1.0 RC3 or newer.", "allow_skip_sensor_cal": "Allow skipping of spectrometer self-calibration", "ambient.measure": "Measure ambient", "ambient.measure.color.unsupported": "%s: The color of ambient light could not be determined using this instrument because its ambient sensor seems to be monochromatic (only got a light level reading).", "ambient.measure.light_level.missing": "Didn't get a light level reading.", "ambient.set": "Do you also want to set the ambient light level to the measured value?", "app.confirm_restore_defaults": "Do you really want to discard your changes and restore defaults?", "app.client.connect": "Scripting client %s:%s connected", "app.client.disconnect": "Scripting client %s:%s disconnected", "app.client.ignored": "Refused connection attempt of scripting client %s:%s: %s", "app.client.network.disallowed": "Refused connection attempt of scripting client %s:%s: Network clients are not allowed.", "app.detected.calibration_loading_disabled": "Detected %s. Calibration loading disabled.", "app.detection_lost.calibration_loading_enabled": "No longer detecting %s. Calibration loading enabled.", "app.incoming_message": "Received scripting request from %s:%s: %s", "app.incoming_message.invalid": "Scripting request invalid!", "app.listening": "Setting up scripting host at %s:%s", "app.otherinstance": "%s is already running.", "app.otherinstance.notified": "Already running instance has been notified.", "app.restart_request": "Please restart the application.", "apply": "Apply", "apply_cal": "Apply calibration (vcgt)", "apply_black_output_offset": "Apply black output offset (100%)", "apply_cal.error": "Calibration could not be applied.", "apply_trc": "Apply tone response curve", "archive.create": "Create compressed archive...", "archive.import": "Import archive...", "archive.include_3dluts": "Do you want to include 3D LUT files in the archive (not recommended, leads to larger archive file size)?", "argyll.debug.warning1": "Please only use this option if you actually need debugging information (e.g. for troubleshooting Argyll CMS functionality)! It is normally only useful for software developers to aid in problem diagnosis and resolution. Are you sure you want to enable debugging output?", "argyll.debug.warning2": "Please remember to disable debugging output for normal operation of the software.", "argyll.dir": "Argyll CMS executable directory:", "argyll.dir.invalid": "Argyll CMS executables not found!\nPlease select the directory which contains the executable files (maybe prefixed or suffixed “argyll-” / “-argyll”): %s", "argyll.error.detail": "Detailed Argyll CMS error message:", "argyll.instrument.driver.missing": "The Argyll CMS driver for your measurement device seems not to be installed or installed incorrectly. Please check if your measurement device is shown in Windows' Device Manager under „Argyll LibUSB-1.0A devices“ and (re-)install the driver if necessary. Please read the documentation for installation instructions.", "argyll.instrument.configuration_files.install": "Install Argyll CMS instrument configuration files...", "argyll.instrument.configuration_files.install.success": "Installation of Argyll CMS instrument configuration files complete.", "argyll.instrument.configuration_files.uninstall": "Uninstall Argyll CMS instrument configuration files...", "argyll.instrument.configuration_files.uninstall.success": "Uninstallation of Argyll CMS instrument configuration files complete.", "argyll.instrument.drivers.install": "Install Argyll CMS instrument drivers...", "argyll.instrument.drivers.install.confirm": "You only need to install the Argyll CMS specific drivers if you have a measurement instrument that is not a ColorMunki Display, i1 Display Pro, Huey, ColorHug, specbos or K-10.\n\nNote: If you already have a vendor driver for your instrument installed, you'll have to use Windows' Device Manager to manually switch to the Argyll CMS driver after it has been installed. To do that, right click on the instrument and select “Update Driver Software...”, then choose “Browse my computer for driver software”, “Let me pick from a list of device drivers on my computer” and finally select the Argyll driver for your instrument from the list.\n\nDo you want to proceed?", "argyll.instrument.drivers.install.failure": "Installation of Argyll CMS instrument drivers failed.", "argyll.instrument.drivers.install.restart": "You need to disable Driver Signature Enforcement to install the Argyll CMS instrument drivers. For this purpose, the system needs to be restarted. Select “Troubleshoot” on the page that will appear, then “Advanced Options”, “Startup Settings” and finally “Restart”. On startup, select “Disable Driver Signature Enforcement”. After the restart, choose “Install Argyll CMS instrument drivers...” in the menu again to install the drivers. If you don't see the “Troubleshoot” option, please refer to the DisplayCAL documentation section “Instrument driver installation under Windows” for an alternate method to disable Driver Signature Enforcement.", "argyll.instrument.drivers.uninstall": "Uninstall Argyll CMS instrument drivers...", "argyll.instrument.drivers.uninstall.confirm": "Note: Uninstallation doesn't affect instrument drivers that are currently in use, but just removes the driver from Windows' Driver Store. If you want to switch back to an installed vendor-supplied driver for your instrument, you'll have to use Windows' Device Manager to manually switch to the vendor driver. To do that, right click on the instrument and select “Update Driver Software...”, then choose “Browse my computer for driver software”, “Let me pick from a list of device drivers on my computer” and finally select the vendor driver for your instrument from the list.\n\nDo you want to proceed?", "argyll.instrument.drivers.uninstall.failure": "Uninstallation of Argyll CMS instrument drivers failed.", "argyll.instrument.drivers.uninstall.success": "Uninstallation of Argyll CMS instrument drivers complete.", "argyll.util.not_found": "Argyll CMS “%s” executable not found!", "as_measured": "As measured", "attributes": "Attributes", "audio.lib": "Audio module: %s", "auth": "Authentification", "auth.failed": "Authentification failed.", "auto": "Auto", "auto_optimized": "Auto-optimized", "autostart_remove_old": "Removing old autostart entry", "backing_xyz": "Backing XYZ", "backlight": "Backlight", "bitdepth": "Bitdepth", "black": "Black", "black_lab": "Black Lab", "black_point": "Black point", "black_point_compensation": "Black point compensation", "black_point_compensation.3dlut.warning": "When creating a 3D LUT, the black point compensation profiling setting should be turned off, because it affects the function of the tone curve adjustment. Would you like to turn off black point compensation?", "black_point_compensation.info": "Black point compensation effectively prevents black crush, but reduces the accuracy of color conversion.", "black_white": "Black & white", "black_xyz": "Black XYZ", "blacklevel": "Black level", "blue": "Blue", "blue_gamma": "Blue gamma", "blue_lab": "Blue Lab", "blue_matrix_column": "Blue matrix column", "blue_maximum": "Blue maximum", "blue_minimum": "Blue minimum", "blue_tone_response_curve": "Blue tone response curve", "blue_xyz": "Blue XYZ", "brightness": "Brightness", "browse": "Browse...", "bug_report": "Report a bug...", "button.calibrate": "Calibrate only", "button.calibrate_and_profile": "Calibrate & profile", "button.profile": "Profile only", "cal_extraction_failed": "Could not extract calibration data from the profile.", "calculated_checksum": "Calculated checksum", "calibrate_instrument": "Spectrometer self-calibration", "calibration": "Calibration", "calibration.ambient_viewcond_adjust": "Ambient light level adjustment", "calibration.ambient_viewcond_adjust.info": "To perform a viewing condition adjustment when computing calibration curves, tick the checkbox and enter your ambient light level. You can also optionally measure ambient light, if supported by your instrument.", "calibration.black_luminance": "Black level", "calibration.black_output_offset": "Black output offset", "calibration.black_point_correction": "Black point correction", "calibration.black_point_correction_choice": "You may turn off black point correction, to optimize black level and contrast ratio (recommended for most LCD monitors), or you can turn it on to make black the same hue as the whitepoint (recommended for most CRT monitors). Please select your black point correction preference.", "calibration.black_point_rate": "Rate", "calibration.check_all": "Check settings", "calibration.complete": "Calibration complete!", "calibration.create_fast_matrix_shaper": "Create matrix profile", "calibration.create_fast_matrix_shaper_choice": "Do you want to create a fast matrix shaper profile from calibration measurements or just calibrate?", "calibration.do_not_use_video_lut": "Do not use video card gamma table to apply calibration", "calibration.do_not_use_video_lut.warning": "Do you really want to change the recommended setting?", "calibration.embed": "Embed calibration curves in profile", "calibration.file": "Settings", "calibration.file.invalid": "The chosen settings file is invalid.", "calibration.file.none": "", "calibration.incomplete": "Calibration has not been finished.", "calibration.interactive_display_adjustment": "Interactive display adjustment", "calibration.interactive_display_adjustment.black_level.crt": "Select “Start measurement” and adjust your display's brightness and/or RGB offset controls to match the desired level.", "calibration.interactive_display_adjustment.black_point.crt": "Select “Start measurement” and adjust your display's RGB offset controls to match the desired black point.", "calibration.interactive_display_adjustment.check_all": "Select “Start measurement” to check on the overall settings.", "calibration.interactive_display_adjustment.generic_hint.plural": "A good match is obtained if all bars can be brought to the marked position in the center.", "calibration.interactive_display_adjustment.generic_hint.singular": "A good match is obtained if the bar can be brought to the marked position in the center.", "calibration.interactive_display_adjustment.start": "Start measurement", "calibration.interactive_display_adjustment.stop": "Stop measurement", "calibration.interactive_display_adjustment.white_level.crt": "Select “Start measurement” and adjust your display's contrast and/or RGB gain controls to match the desired level.", "calibration.interactive_display_adjustment.white_level.lcd": "Select “Start measurement” and adjust your display's backlight/brightness control to match the desired level.", "calibration.interactive_display_adjustment.white_point": "Select “Start measurement” and adjust your display's color temperature and/or RGB gain controls to match the desired white point.", "setting.keep_current": "Keep current setting", "calibration.load": "Load settings...", "calibration.load.handled_by_os": "Calibration loading is handled by the operating system.", "calibration.load_error": "Calibration curves could not be loaded.", "calibration.load_from_cal": "Load calibration curves from calibration file...", "calibration.load_from_cal_or_profile": "Load calibration curves from calibration file or profile...", "calibration.load_from_display_profile": "Load calibration curves from current display device profile", "calibration.load_from_display_profiles": "Load calibration from current display device profile(s)", "calibration.load_from_profile": "Load calibration curves from profile...", "calibration.load_success": "Calibration curves successfully loaded.", "calibration.loading": "Loading calibration curves from file...", "calibration.loading_from_display_profile": "Loading calibration curves of current display device profile...", "calibration.luminance": "White level", "calibration.lut_viewer.title": "Curves", "calibration.preserve": "Preserve calibration state", "calibration.preview": "Preview calibration", "calibration.quality": "Calibration quality", "calibration.quality.high": "High", "calibration.quality.low": "Low", "calibration.quality.medium": "Medium", "calibration.quality.ultra": "Ultra", "calibration.quality.verylow": "Very low", "calibration.reset": "Reset video card gamma table", "calibration.reset_error": "Video card gamma table could not be reset.", "calibration.reset_success": "Video card gamma table successfully reset.", "calibration.resetting": "Resetting video card gamma table to linear...", "calibration.settings": "Calibration settings", "calibration.show_actual_lut": "Show calibration curves from video card", "calibration.show_lut": "Show curves", "calibration.skip": "Continue on to profiling", "calibration.speed": "Calibration speed", "calibration.speed.high": "High", "calibration.speed.low": "Low", "calibration.speed.medium": "Medium", "calibration.speed.veryhigh": "Very high", "calibration.speed.verylow": "Very low", "calibration.start": "Continue on to calibration", "turn_off": "Turn off", "calibration.turn_on_black_point_correction": "Turn on", "calibration.update": "Update calibration", "calibration.update_profile_choice": "Do you want to also update the calibration curves in the existing profile or just calibrate?", "calibration.use_linear_instead": "Use linear calibration instead", "calibration.verify": "Verify calibration", "calibration_profiling.complete": "Calibration and profiling complete!", "calibrationloader.description": "Sets ICC profiles and loads calibration curves for all configured display devices", "can_be_used_independently": "Can be used independently", "cancel": "Cancel", "cathode_ray_tube_display": "Cathode ray tube display", "ccxx.ti1": "Testchart for colorimeter correction", "centered": "Centered", "channel_1_c_xy": "Channel 1 (C) xy", "channel_1_gamma_at_50_input": "Channel 1 gamma at 50% input", "channel_1_is_linear": "Channel 1 is linear", "channel_1_maximum": "Channel 1 maximum", "channel_1_minimum": "Channel 1 minimum", "channel_1_r_xy": "Channel 1 (R) xy", "channel_1_unique_values": "Channel 1 unique values", "channel_2_g_xy": "Channel 2 (G) xy", "channel_2_gamma_at_50_input": "Channel 2 gamma at 50% input", "channel_2_is_linear": "Channel 2 is linear", "channel_2_m_xy": "Channel 2 (M) xy", "channel_2_maximum": "Channel 2 maximum", "channel_2_minimum": "Channel 2 minimum", "channel_2_unique_values": "Channel 2 unique values", "channel_3_b_xy": "Channel 3 (B) xy", "channel_3_gamma_at_50_input": "Channel 3 gamma at 50% input", "channel_3_is_linear": "Channel 3 is linear", "channel_3_maximum": "Channel 3 maximum", "channel_3_minimum": "Channel 3 minimum", "channel_3_unique_values": "Channel 3 unique values", "channel_3_y_xy": "Channel 3 (Y) xy", "channel_4_k_xy": "Channel 4 (K) xy", "channels": "Channels", "characterization_device_values": "Characterization device values", "characterization_measurement_values": "Characterization measurement values", "characterization_target": "Characterization target", "checking_lut_access": "Checking video card gamma table access for display %s...", "checksum": "Checksum", "checksum_ok": "Checksum OK", "chromatic_adaptation_matrix": "Chromatic adaptation matrix", "chromatic_adaptation_transform": "Chromatic adaptation transform", "chromaticity_illuminant_relative": "Chromaticity (illuminant-relative)", "chromecast_limitations_warning": "Please note that Chromecast accuracy is not as good as a directly connected display or madTPG, due to the Chromecast using RGB to YCbCr conversion and upscaling.", "clear": "Clear", "color": "Color", "color.custom": "Custom color", "color_look_up_table": "Color Look Up Table", "color_model": "Color model", "color_space_conversion_profile": "Color space Conversion profile", "colorant_order": "Colorant order", "colorants_pcs_relative": "Colorants (PCS-relative)", "colorconfig_remove_old": "Removing old display configuration file", "colorimeter_correction.create": "Create colorimeter correction...", "colorimeter_correction.create.details": "Please check the fields below and change them when necessary. The description should also contain important details (e.g. specific display settings, non-default CIE observer or the like).", "colorimeter_correction.create.failure": "Correction creation failed.", "colorimeter_correction.create.info": "To create a colorimeter correction, you first need to measure the required test colors with a spectrometer, and in case you want to create a correction matrix instead of a spectral correction, also with the colorimeter.\nAlternatively you can also use existing measurements by choosing “Browse...”.", "colorimeter_correction.create.success": "Correction successfully created.", "colorimeter_correction.file.none": "None", "colorimeter_correction.import": "Import colorimeter corrections from other display profiling software...", "colorimeter_correction.import.choose": "Please choose the colorimeter correction file to import.", "colorimeter_correction.import.failure": "No colorimeter corrections could be imported.", "colorimeter_correction.import.success": "Colorimeter corrections have been successfully imported from the following softwares:\n\n%s", "colorimeter_correction.import.partial_warning": "Not all colorimeter corrections could be imported from %s. %i of %i entries had to be skipped.", "colorimeter_correction.instrument_mismatch": "The selected colorimeter correction is not suitable for the selected instrument.", "colorimeter_correction.upload": "Upload colorimeter correction...", "colorimeter_correction.upload.confirm": "Do you want to upload the colorimeter correction to the online database (recommended)? Any uploaded files will be assumed to have been placed in the public domain, so that they can be used freely.", "colorimeter_correction.upload.deny": "This colorimeter correction may not be uploaded.", "colorimeter_correction.upload.exists": "The colorimeter correction already exists in the database.", "colorimeter_correction.upload.failure": "The correction couldn't be entered into the online database.", "colorimeter_correction.upload.success": "The correction was successfully uploaded to the online database.", "colorimeter_correction.web_check": "Check online for colorimeter correction...", "colorimeter_correction.web_check.choose": "The folowing colorimeter corrections for the selected display and instrument have been found:", "colorimeter_correction.web_check.failure": "No colorimeter corrections for the selected display and instrument have been found.", "colorimeter_correction_matrix_file": "Correction", "colorimeter_correction_matrix_file.choose": "Choose colorimeter correction", "colors_pcs_relative": "Colors (PCS-relative)", "colorspace": "Colorspace", "colorspace.show_outline": "Show outline", "commandline": "Command line:", "commands": "Commands", "comparison_profile": "Comparison profile", "comport_detected": "A change in the instrument/port configuration has been detected.", "compression.gzip": "GZIP compression", "computer.name": "Computername", "connected.to.at": "Connected to %s at %s:%s", "connecting.to": "Connecting to %s:%s...", "connection.broken": "Connection broken", "connection.established": "Connection established", "connection.fail": "Connection error (%s)", "connection.fail.http": "HTTP error %s", "connection.waiting": "Waiting for connection at", "continue": "Continue", "contrast": "Contrast", "contribute": "Contribute", "converting": "Converting", "copyright": "Copyright", "corrected": "corrected", "create_and_preview": "Create & Preview", "create_ccss_or_ccmx": "Do you want to create a correction matrix for ordinary colorimeters (CCMX) or a calibration spectral sample for the i1 Display Pro and ColorMunki Display (CCSS)?", "create_profile": "Create profile from measurement data...", "create_profile_from_edid": "Create profile from extended display identification data...", "created": "Created", "creator": "Creator", "current": "Current", "custom": "Custom", "cyan": "Cyan", "d3-e4-s0-g25-m3-b3-f0-crossover.ti1": "Default testchart for matrix profiles", "d3-e4-s0-g49-m3-b3-f0-crossover.ti1": "Extended testchart for matrix profiles", "d3-e4-s0-g9-m3-b3-f0-crossover.ti1": "Small testchart for matrix profiles", "d3-e4-s0-g97-m3-b3-f0-crossover.ti1": "Very large testchart for matrix profiles", "d3-e4-s13-g37-m4-b4-f0.ti1": "Small testchart for LUT profiles", "d3-e4-s17-g49-m5-b5-f0.ti1": "Default testchart for LUT profiles", "d3-e4-s21-g61-m6-b6-f0.ti1": "Extended testchart for LUT profiles", "d3-e4-s25-g73-m0-f679-cRec709_Gamma22.ti1": "Large testchart for LUT profiles, optimized for Gamma 2.2 with Rec. 709 primaries (D65)", "d3-e4-s25-g73-m0-f679-caRGB.ti1": "Large testchart for LUT profiles, optimized for Gamma 2.2 with AdobeRGB primaries (D65)", "d3-e4-s25-g73-m0-f679-ceRGBv2.ti1": "Large testchart for LUT profiles, optimized for L* with NTSC 1953 primaries (D50)", "d3-e4-s25-g73-m0-f679-csRGB.ti1": "Large testchart for LUT profiles, optimized for sRGB (D65)", "d3-e4-s25-g73-m7-b7-f0.ti1": "Large testchart for LUT profiles", "d3-e4-s29-g85-m0-f994-cRec709_Gamma22.ti1": "Very large testchart for LUT profiles, optimized for Gamma 2.2 with Rec. 709 primaries (D65)", "d3-e4-s29-g85-m0-f994-caRGB.ti1": "Very large testchart for LUT profiles, optimized for Gamma 2.2 with AdobeRGB primaries (D65)", "d3-e4-s29-g85-m0-f994-ceRGBv2.ti1": "Very large testchart for LUT profiles, optimized for L* with NTSC 1953 primaries (D50)", "d3-e4-s29-g85-m0-f994-csRGB.ti1": "Very large testchart for LUT profiles, optimized for sRGB (D65)", "d3-e4-s29-g85-m8-b8-f0.ti1": "Very large testchart for LUT profiles", "d3-e4-s33-g97-m0-f1399-cRec709_Gamma22.ti1": "XXL testchart for LUT profiles, optimized for Gamma 2.2 with Rec. 709 primaries (D65)", "d3-e4-s33-g97-m0-f1399-caRGB.ti1": "XXL testchart for LUT profiles, optimized for Gamma 2.2 with AdobeRGB primaries (D65)", "d3-e4-s33-g97-m0-f1399-ceRGBv2.ti1": "XXL testchart for LUT profiles, optimized for L* with NTSC 1953 primaries (D50)", "d3-e4-s33-g97-m0-f1399-csRGB.ti1": "XXL testchart for LUT profiles, optimized for sRGB (D65)", "d3-e4-s33-g97-m9-b9-f0.ti1": "XXL testchart for LUT profiles", "d3-e4-s37-g109-m0-f1906-cRec709_Gamma22.ti1": "XXXL testchart for LUT profiles, optimized for Gamma 2.2 with Rec. 709 primaries (D65)", "d3-e4-s37-g109-m0-f1906-caRGB.ti1": "XXXL testchart for LUT profiles, optimized for Gamma 2.2 with AdobeRGB primaries (D65)", "d3-e4-s37-g109-m0-f1906-ceRGBv2.ti1": "XXXL testchart for LUT profiles, optimized for L* with NTSC 1953 primaries (D50)", "d3-e4-s37-g109-m0-f1906-csRGB.ti1": "XXXL testchart for LUT profiles, optimized for sRGB (D65)", "d3-e4-s37-g109-m10-b10-f0.ti1": "XXXL testchart for LUT profiles", "d3-e4-s41-g121-m0-f2527-cRec709_Gamma22.ti1": "Massive testchart for LUT profiles, optimized for Gamma 2.2 with Rec. 709 primaries (D65)", "d3-e4-s41-g121-m0-f2527-caRGB.ti1": "Massive testchart for LUT profiles, optimized for Gamma 2.2 with AdobeRGB primaries (D65)", "d3-e4-s41-g121-m0-f2527-ceRGBv2.ti1": "Massive testchart for LUT profiles, optimized for L* with NTSC 1953 primaries (D50)", "d3-e4-s41-g121-m0-f2527-csRGB.ti1": "Massive testchart for LUT profiles, optimized for sRGB (D65)", "d3-e4-s41-g121-m11-b11-f0.ti1": "Massive testchart for LUT profiles", "deactivated": "deactivated", "default": "Default", "default.icc": "Default (Gamma 2.2)", "default_crt": "Default CRT", "default_rendering_intent": "Default rendering intent", "delete": "Delete", "delta_e_2000_to_blackbody_locus": "ΔE 2000 to blackbody locus", "delta_e_2000_to_daylight_locus": "ΔE 2000 to daylight locus", "delta_e_to_locus": "ΔE*00 to %s locus", "description": "Description", "description_ascii": "Description (ASCII)", "description_macintosh": "Description (Macintosh)", "description_unicode": "Description (Unicode)", "deselect_all": "Deselect all", "detect_displays_and_ports": "Detect display devices and instruments", "device": "Device", "device.name.placeholder": "", "device_color_components": "Device color components", "device_manager.launch": "Launch Device Manager", "device_manufacturer_name": "Device manufacturer name", "device_manufacturer_name_ascii": "Device manufacturer name (ASCII)", "device_manufacturer_name_macintosh": "Device manufacturer name (Macintosh)", "device_manufacturer_name_unicode": "Device manufacturer name (Unicode)", "device_model_name": "Device model name", "device_model_name_ascii": "Device model name (ASCII)", "device_model_name_macintosh": "Device model name (Macintosh)", "device_model_name_unicode": "Device model name (Unicode)", "device_to_pcs_intent_0": "Device to PCS: Intent 0", "device_to_pcs_intent_1": "Device to PCS: Intent 1", "device_to_pcs_intent_2": "Device to PCS: Intent 2", "devicelink_profile": "DeviceLink profile", "dialog.argyll.notfound.choice": "Argyll CMS, the color engine that is needed to run DisplayCAL, doesn't seem to be installed on this computer. Dow you want to automatically download it or browse for it manually?", "dialog.cal_info": "The calibration file “%s” will be used. Do you want to continue?", "dialog.confirm_cancel": "Do you really want to cancel?", "dialog.confirm_delete": "Do you really want to delete the selected file(s)?", "dialog.confirm_overwrite": "The file “%s” already exists. Do you want to overwrite it?", "dialog.current_cal_warning": "The current calibration curves will be used. Do you want to continue?", "dialog.do_not_show_again": "Do not show this message again", "dialog.enter_password": "Please enter your password.", "dialog.install_profile": "Do you want to install the profile “%s” and make it the default for display “%s”?", "dialog.linear_cal_info": "Linear calibration curves will be used. Do you want to continue?", "dialog.load_cal": "Load settings", "dialog.select_argyll_version": "Version %s of Argyll CMS was found. The currently selected version is %s. Do you want to use the newer version?", "dialog.set_argyll_bin": "Please locate the directory where the Argyll CMS executables reside.", "dialog.set_profile_save_path": "Create profile directory “%s” here:", "dialog.set_testchart": "Choose testchart file", "dialog.ti3_no_cal_info": "The measurement data does not contain calibration curves. Do you really want to continue?", "digital_camera": "Digital camera", "direction.backward": "PCS → B2A → device", "direction.backward.inverted": "PCS ← B2A ← device", "direction.forward": "Device → A2B → PCS", "direction.forward.inverted": "Device ← A2B ← PCS", "disconnected.from": "Disconnected from %s:%s", "display": "Display", "display-instrument": "Display & instrument", "display.connection.type": "Connection", "display.manufacturer": "Display device manufacturer", "display.output": "Output #", "display.primary": "(Primary)", "display.properties": "Display device properties", "display.reset.info": "Please reset the display device to factory defaults, then adjust its brightness to a comfortable level.", "display.settings": "Display device settings", "display.tech": "Display technology", "display_detected": "A change in the display device configuration has been detected.", "display_device_profile": "Display device profile", "display_lut.link": "Link/unlink display and video card gamma table access", "display_profile.not_detected": "No current profile detected for display “%s”", "display_profile.save_as": "The current profile for display “%s” only exists in memory. Please save it to a file first.", "display_short": "Display device (abbreviated)", "displayport": "DisplayPort", "dlp_screen": "DLP Screen", "donation_header": "Your support is appreciated!", "donation_message": "If you would like to support the development of, technical assistance with, and continued availability of DisplayCAL and Argyll CMS, please consider a financial contribution. As DisplayCAL wouldn't be useful without Argyll CMS, all contributions received for DisplayCAL will be split between both projects.\nFor light personal non-commercial use, a one-time contribution may be appropriate. If you're using DisplayCAL professionally, an annual or monthly contribution would make a great deal of difference in ensuring that both projects continue to be available.\n\nThanks to all contributors!", "download": "Download", "downloading": "Downloading", "download_fail_empty_response": "Download failed: %s returned an empty document.", "download_fail_wrong_size": "Download failed: The file does not have the expected size of %s bytes (received %s bytes).", "drift_compensation.blacklevel": "Black level drift compensation", "drift_compensation.blacklevel.info": "Black level drift compensation tries to counter measurement deviations caused by black calibration drift of a warming up measurement device. For this purpose, a black test patch is measured periodically, which increases the overall time needed for measurements. Many colorimeters have built-in temperature compensation, in which case black level drift compensation should not be needed, but most spectrometers are not temperature compensated.", "drift_compensation.whitelevel": "White level drift compensation", "drift_compensation.whitelevel.info": "White level drift compensation tries to counter measurement deviations caused by luminance changes of a warming up display device. For this purpose, a white test patch is measured periodically, which increases the overall time needed for measurements.", "dry_run": "Dry run", "dry_run.end": "Dry run ended.", "dry_run.info": "Dry run. Check the log to see the command line.", "dvi": "DVI", "dye_sublimation_printer": "Dye sublimation printer", "edid.crc32": "EDID CRC32 checksum", "edid.serial": "EDID serial", "elapsed_time": "Elapsed time", "electrophotographic_printer": "Electrophotographic printer", "electrostatic_printer": "Electrostatic printer", "enable_argyll_debug": "Enable Argyll CMS debugging output", "enable_spyder2": "Enable Spyder 2 Colorimeter...", "enable_spyder2_failure": "Spyder 2 could not be enabled. Please install the Spyder 2 software manually if it hasn't been installed yet, then run this command again.", "enable_spyder2_success": "Spyder 2 successfully enabled.", "enumerate_ports.auto": "Automatically detect instruments", "enumerating_displays_and_comports": "Enumerating display devices and communication ports...", "entries": "Entries", "environment": "Environment", "error": "Error", "error.access_denied.write": "You do not have write access to %s", "error.already_exists": "The name “%s” can not be used, because another object of the same name already exists. Please choose another name or another directory.", "error.autostart_creation": "Creation of the autostart entry for %s to load the calibration curves on login has failed.", "error.autostart_remove_old": "The old autostart entry which loads calibration curves on login could not be removed: %s", "error.autostart_system": "The system-wide autostart entry to load the calibration curves on login could not be created, because the system-wide autostart directory could not be determined.", "error.autostart_user": "The user-specific autostart entry to load the calibration curves on login could not be created, because the user-specific autostart directory could not be determined.", "error.cal_extraction": "The calibration could not be extracted from “%s”.", "error.calibration.file_missing": "The calibration file “%s” is missing.", "error.calibration.file_not_created": "No calibration file has been created.", "error.colorconfig_remove_old": "The old configuration file mapping profiles to displays could not be removed: %s", "error.copy_failed": "The file “%s” could not be copied to “%s”.", "error.deletion": "An error occured while moving files to the %s. Some files might not have been removed.", "error.dir_creation": "The directory “%s” could not be created. Maybe there are access restrictions. Please allow writing access or choose another directory.", "error.dir_notdir": "The directory “%s” could not be created, because another object of the same name already exists. Please choose another directory.", "error.file.create": "The file “%s” could not be created.", "error.file.open": "The file “%s” could not be opened.", "error.file_type_unsupported": "Unsupported filetype.", "error.generic": "An internal error occured.\n\nError code: %s\nError message: %s", "error.measurement.file_invalid": "The measurement file „%s“ is invalid.", "error.measurement.file_missing": "The measurement file “%s” is missing.", "error.measurement.file_not_created": "No measurement file has been created.", "error.measurement.missing_spectral": "The measurement file does not contain spectral values.", "error.measurement.one_colorimeter": "Exactly one colorimeter measurement is needed.", "error.measurement.one_reference": "Exactly one reference measurement is needed.", "error.no_displays_detected": "No display devices could be detected.", "error.no_files_extracted_from_archive": "No files have been extracted from “%s”.", "error.not_a_session_archive": "The archive “%s” doesn't seem to be a session archive.", "error.profile.file_missing": "The profile “%s” is missing.", "error.profile.file_not_created": "No profile has been created.", "error.source_dest_same": "Source and target file are the same.", "error.testchart.creation_failed": "The testchart file “%s” could not be created. Maybe there are access restrictions, or the source file does not exist.", "error.testchart.invalid": "The testchart file “%s” is invalid.", "error.testchart.missing": "The testchart file “%s” is missing.", "error.testchart.missing_fields": "The testchart file „%s“ does not contain required fields: %s", "error.testchart.read": "The testchart file “%s” could not be read.", "error.tmp_creation": "Could not create temporary working directory.", "error.trashcan_unavailable": "The %s is not available. No files were removed.", "errors.none_found": "No errors found.", "estimated_measurement_time": "Estimated measurement time approximately %s hour(s) %s minutes", "export": "Export...", "extra_args": "Set additional commandline arguments...", "factory_default": "Factory Default", "failure": "...failed!", "file.invalid": "File invalid.", "file.missing": "The file “%s” does not exist.", "file.notfile": "“%s” is not a file.", "file.select": "Select file", "filename.upload": "Upload filename", "filetype.7z": "7-Zip files", "filetype.any": "Any Filetype", "filetype.cal": "Calibration files (*.cal)", "filetype.cal_icc": "Calibration and profile files (*.cal;*.icc;*.icm)", "filetype.ccmx": "Correction matrices/Calibration spectral samples (*.ccmx;*.ccss)", "filetype.html": "HTML files (*.html;*.htm)", "filetype.icc": "Profile files (*.icc;*.icm)", "filetype.icc_mpp": "Profile files (*.icc;*.icm;*.mpp)", "filetype.icc_ti1_ti3": "Testchart files (*.icc;*.icm;*.ti1;*.ti3)", "filetype.icc_ti3": "Measurement files (*.icc;*.icm;*.ti3)", "filetype.log": "Log files (*.log)", "filetype.png": "Portable Network Graphics (*.png)", "filetype.tgz": "Compressed TAR archive", "filetype.ti1": "Testchart files (*.ti1)", "filetype.ti1_ti3_txt": "Testchart files (*.ti1), Measurement files (*.ti3;*.txt)", "filetype.ti3": "Measurement files (*.ti3)", "filetype.tif": "Tagged Image File (*.tif)", "filetype.txt": "DeviceCorrections.txt", "filetype.vrml": "VRML files (*.wrl)", "filetype.x3d": "X3D files (*.x3d)", "filetype.zip": "ZIP files", "film_scanner": "Film scanner", "film_writer": "Film writer", "finish": "Finish", "flare": "Flare", "flexography": "Flexography", "forced": "forced", "format.select": "Please select the desired format.", "gamap.default_intent": "Default rendering intent", "gamap.intents.a": "Absolute colorimetric", "gamap.intents.aa": "Absolute appearance", "gamap.intents.aw": "Absolute colorimetric with white point scaling", "gamap.intents.la": "Luminance matched appearance", "gamap.intents.lp": "Luminance preserving perceptual", "gamap.intents.ms": "Preserve saturation", "gamap.intents.p": "Perceptual", "gamap.intents.pa": "Perceptual appearance", "gamap.intents.r": "Relative colorimetric", "gamap.intents.s": "Saturation", "gamap.out_viewcond": "Target viewing conditions", "gamap.perceptual": "Gamut mapping for perceptual intent", "gamap.profile": "Source profile", "gamap.saturation": "Gamut mapping for saturation intent", "gamap.src_viewcond": "Source viewing conditions", "gamap.viewconds.cx": "Cut sheet transparencies on a viewing box", "gamap.viewconds.jd": "Projector in dark environment", "gamap.viewconds.jm": "Projector in dim environment", "gamap.viewconds.mb": "Monitor in bright work environment", "gamap.viewconds.md": "Monitor in darkened work environment", "gamap.viewconds.mt": "Monitor in typical work environment", "gamap.viewconds.ob": "Original scene - bright Outdoors", "gamap.viewconds.pc": "Critical print evaluation environment (ISO-3664 P1)", "gamap.viewconds.pcd": "Photo CD - original scene outdoors", "gamap.viewconds.pe": "Print evaluation environment (CIE 116-1995)", "gamap.viewconds.pp": "Practical reflection print (ISO-3664 P2)", "gamap.viewconds.tv": "Television/film studio", "gamapframe.title": "Advanced gamut mapping options", "gamut": "Gamut", "gamut.coverage": "Gamut coverage", "gamut.view.create": "Generating gamut views...", "gamut.volume": "Gamut volume", "gamut_mapping.ciecam02": "CIECAM02 gamut mapping", "gamut_mapping.mode": "Gamut mapping mode", "gamut_mapping.mode.b2a": "PCS-to-device", "gamut_mapping.mode.inverse_a2b": "Inverse device-to-PCS", "gamut_plot.tooltip": "Click and drag the mouse inside the plot to move the viewport, or zoom with the mouse wheel and +/- keys. Double-click resets the viewport.", "generic_name_value_data": "Generic name-value data", "geometry": "Geometry", "glossy": "Glossy", "go_to_website": "Go to Website", "gravure": "Gravure", "gray_tone_response_curve": "Gray tone response curve", "grayscale": "grayscale", "green": "Green", "green_gamma": "Green gamma", "green_lab": "Green Lab", "green_matrix_column": "Green matrix column", "green_maximum": "Green maximum", "green_minimum": "Green minimum", "green_tone_response_curve": "Green tone response curve", "green_xyz": "Green XYZ", "grid_steps": "Grid Steps", "header": "Display calibration and characterization powered by Argyll CMS", "hdmi": "HDMI", "help_support": "Help and support...", "host.invalid.lookup_failed": "Invalid host (address lookup failed)", "hue": "Hue", "icc_absolute_colorimetric": "ICC-absolute colorimetric", "icc_version": "ICC version", "if_available": "if available", "illuminant": "Illuminant", "illuminant_relative_cct": "Illuminant-relative CCT", "illuminant_relative_lab": "Illuminant-relative Lab", "illuminant_relative_xyz": "Illuminant-relative XYZ", "illuminant_xyz": "Illuminant XYZ", "illumination": "Illumination", "in": "In", "info.3dlut_settings": "A 3D LUT (LUT = Look Up Table) or ICC device link profile can be used by 3D LUT or ICC device link capable applications for full display color correction.\n\nCreating several (additional) 3D LUTs from an existing profile\nWith the desired profile selected under “Settings”, uncheck the “Create 3D LUT after profiling” checkbox.\n\nChoosing the right source colorspace and tone response curve\nFor 3D LUTs and ICC device link profiles, the source colorspace and tone response curve need to be set in advance and become a fixed part of the overall color transformation (unlike ICC device profiles which are linked dynamically on-the-fly). As an example, HD video material is usually mastered according to the Rec. 709 standard with either a pure power gamma of around 2.2-2.4 (relative with black output offset of 100%) or Rec. 1886 tone response curve (absolute with black output offset 0%). A split between Rec. 1886-like and pure power is also possible by setting black output offset to a value between 0% and 100%.\n\n“Absolute” vs. “relative” gamma\nTo accomodate a non-zero black level of a real display, the tone response curve needs to be offset and scaled accordingly.\n“Absolute” gamma results in an actual output at 50% input which doesn't match that of an idealized power curve (unless the black level is zero).\n“Relative” gamma results in an actual output at 50% input which matches that of an idealized power curve.\n\nRendering intent\nIf you have calibrated to a different whitepoint than the one mandated by the source colorspace, and want to use that for the 3D LUT instead, select “Relative colorimetric”. Otherwise, select “Absolute colorimetric with white point scaling” (white point scaling will prevent clipping in absolute colorimetric mode that could happen if the source colorspace whitepoint is outside of the display gamut). You also have the option to use a non-colorimetric rendering intent that may compress or expand the source colorspace to fit within the display gamut (not recommended when colorimetric accuracy is required).", "info.calibration_settings": "Calibration is done by interactively adjusting the display to meet the chosen whitepoint and/or luminance as well as optionally creating 1D LUT calibration curves (LUT = Look Up Table) to meet the chosen tone response curve and ensure gray balance. Note that if during calibration you only want to adjust the display and skip the generation of 1D LUT curves, you need to set the tone response curve to “As measured”. 1D LUT calibration can not be used for full display color correction, you need to create a ICC device profile or 3D LUT and use them with applications that support them for that purpose. 1D LUT calibration complements profiling and 3D LUT calibration though.", "info.display_instrument": "If your display is a OLED, Plasma or other technology with variable light output depending on picture content, enable white level drift compensation.\n\nIf your instrument is a spectrometer and you use it in contact mode on a display with stable black level, you may want to enable instrument black level drift compensation.\n\nIf your instrument is a colorimeter, you should use a correction suitable for your display or display technology type. Note that some instruments (ColorHug, ColorHug2, K-10, Spyder4/5) may have a correction built into some of their measurement modes.", "info.display_instrument.warmup": "You should let the display warm up for at least 30 minutes before commencing measurements. If you use your instrument in contact mode, it is a good idea to leave it on the display during that time as well.", "info.profile_settings": "Profiling is the process of characterizing the display and recording its response in a ICC device profile. The ICC device profile can be used by applications that support ICC color management for full display color correction, and/or it can be used to create a 3D LUT (LUT = Look Up Table) which serves the same purpose for applications that support 3D LUTs.\n\nThe amount of patches measured influences the attainable accuracy of the resulting profile. For a reasonable quality 3x3 matrix and curves based profile, a few dozen patches can be enough if the display has good additive color mixing properties and linearity. Some professional displays fall into that category. If the highest possible accuracy is desired, a LUT-based profile from around several hundred up to several thousand patches is recommended. The “Auto-optimized” testchart setting automatically takes into account the non-linearities and actual response of the display, and should be used for best quality results. With this, you can adjust a slider to choose a compromise between resulting profile accuracy and measurement as well as computation time.", "info.mr_settings": "You can verify the accuracy of an ICC profile or 3D LUT via a measurement report that contains detailed statistics about the color errors of the measured patches.\n\nWhen verifying a 3D LUT, make sure to use the same settings as the 3D LUT was created with.", "infoframe.default_text": "", "infoframe.title": "Log", "infoframe.toggle": "Show log window", "initial": "Initial", "initializing_gui": "Initializing GUI...", "ink_jet_printer": "Ink jet printer", "input_device_profile": "Input device profile", "input_table": "Input Table", "install_display_profile": "Install display device profile...", "install_local_system": "Install system-wide", "install_user": "Install for current user only", "instrument": "Instrument", "instrument.calibrate": "Place the instrument on a dark, matte surface or onto its calibration plate and press OK to calibrate the instrument.", "instrument.calibrate.colormunki": "Set the ColorMunki sensor to calibration position and press OK to calibrate the instrument.", "instrument.calibrate.reflective": "Place the instrument onto its reflective white reference serial no. %s and press OK to calibrate the instrument.", "instrument.calibrating": "Calibrating instrument...", "instrument.connect": "Please connect your measurement instrument now.", "instrument.initializing": "Setting up the instrument, please wait...", "instrument.measure_ambient": "If your instrument requires a special cap to measure ambient, please attach it. To measure ambient light, place the instrument upwards, beside the display. Or if you want to measure a viewing booth, put a metamerism-free gray card inside the booth and point the instrument towards it. Further instructions how to measure ambient may be available in your instrument's documentation. Press OK to commence measurement.", "instrument.place_on_screen": "Place the instrument on the test window and click OK to continue.", "instrument.place_on_screen.madvr": "(%i) Please place your %s on the test area", "instrument.reposition_sensor": "The measurement failed because the instrument sensor is in the wrong position. Please correct the sensor position, then click OK to continue.", "internal": "Internal", "invert_selection": "Invert selection", "is_embedded": "Is embedded", "is_illuminant": "Is illuminant", "is_linear": "Is linear", "ISO_12646-2008_color_accuracy_and_gray_balance.ti1": "ISO 12646:2008 color accuracy and gray balance", "laptop.icc": "Laptop (Gamma 2.2)", "library.not_found.warning": "The library “%s” (%s) was not found. Please make sure it is installed before proceeding.", "libXss.so": "X11 screen saver extension", "license": "License", "license_info": "Licensed under the GPL", "linear": "linear", "locale.set": "Setting locale: %s", "log.autoshow": "Show log window automatically", "luminance": "Luminance", "lut_access": "Video card gamma table access", "madhcnet.outdated": "The installed version of %s found at %s is outdated. Please update to the latest madVR version (at least %i.%i.%i.%i).", "madtpg.launch.failure": "madTPG was not found or could not be launched.", "madvr.not_found": "madVR DirectShow filter was not found in the registry. Please make sure it is installed.", "madvr.outdated": "The used version of madVR is outdated. Please update to the latest version (at least %i.%i.%i.%i).", "magenta": "Magenta", "make_and_model": "Make and model", "manufacturer": "Manufacturer", "matrix": "Matrix", "matte": "Matte", "max": "Max", "maximal": "Maximal", "measure": "Measure", "measure.darken_background": "Black background", "measure.darken_background.warning": "Attention: If „black background“ is chosen, it will cover the whole screen and you will not be able to see the display adjustment window! If you have a multi-screen setup, move the display adjustment window to another screen before starting the measurement, or use the keyboard (to abort the measurement, press Q. If the measurement is already running, wait briefly, then press Q again).", "measure.override_display_settle_time_mult": "Override display settle time multiplier", "measure.override_min_display_update_delay_ms": "Override minimum display update delay", "measure.testchart": "Measure testchart", "measureframe.center": "Center", "measureframe.info": "Move the measurement window to the desired screen position and resize if needed. Approximately the whole window area will be used to display measurement patches, the circle is just there as a guide to help you place your measurement device.\nPlace the measurement device on the window and click on „Start measurement“. To cancel and return to the main window, close the measurement window.", "measureframe.infobutton": "Info", "measureframe.measurebutton": "Start measurement", "measureframe.title": "Measurement area", "measureframe.zoomin": "Enlarge", "measureframe.zoommax": "Maximize/Restore", "measureframe.zoomnormal": "Normal size", "measureframe.zoomout": "Shrink", "measurement.play_sound": "Acoustic feedback on continuous measurements", "measurement.set_save_path": "Save the measurement file in the following folder:", "measurement.untethered": "Untethered measurement", "measurement_file.check_sanity": "Check measurement file...", "measurement_file.check_sanity.auto": "Automatically check measurements", "measurement_file.check_sanity.auto.warning": "Please note automatic checking of measurements is an experimental feature. Use at own risk.", "measurement_file.choose": "Please choose a measurement file", "measurement_file.choose.colorimeter": "Please choose a colorimeter measurement file", "measurement_file.choose.reference": "Please choose a reference measurement file", "measurement_mode": "Mode", "measurement_mode.adaptive": "Adaptive", "measurement_mode.dlp": "DLP", "measurement_mode.factory": "Factory calibration", "measurement_mode.generic": "Generic", "measurement_mode.highres": "HiRes", "measurement_mode.lcd": "LCD (generic)", "measurement_mode.lcd.ccfl": "LCD (CCFL)", "measurement_mode.lcd.ccfl.2": "LCD (CCFL Type 2)", "measurement_mode.lcd.oled": "LCD (OLED)", "measurement_mode.lcd.white_led": "LCD (White LED)", "measurement_mode.lcd.wide_gamut.ccfl": "Wide Gamut LCD (CCFL)", "measurement_mode.lcd.wide_gamut.rgb_led": "Wide Gamut LCD (RGB LED)", "measurement_mode.raw": "Raw", "measurement_mode.refresh": "Refresh (generic)", "measurement_report": "Measurement report...", "measurement_report.update": "Update measurement or uniformity report...", "measurement_report_choose_chart": "Please choose the testchart to measure.", "measurement_report_choose_chart_or_reference": "Please choose a testchart or reference.", "measurement_report_choose_profile": "Please choose the profile to validate.", "measurement_type": "Measurement type", "measurements.complete": "Measurements complete! Do you want to open the folder containing the measurement files?", "measuring.characterization": "Measuring color swatches for characterization...", "media_black_point": "Media black point", "media_relative_colorimetric": "Media-relative colorimetric", "media_white_point": "Media white point", "menu.about": "About...", "menu.file": "File", "menu.help": "?", "menu.language": "Language", "menu.options": "Options", "menu.tools": "Tools", "menuitem.quit": "Quit", "menuitem.set_argyll_bin": "Locate Argyll CMS executables...", "metadata": "Metadata", "min": "Min", "minimal": "Minimal", "model": "Model", "named_color_profile": "Named color profile", "named_colors": "Named colors", "native": "Native", "negative": "Negative", "no": "No", "not_applicable": "Not applicable", "not_connected": "Not connected", "not_found": "“%s” was not found.", "not_now": "Not now", "no_settings": "The file does not contain settings.", "none": "None", "number_of_entries": "Number of entries", "number_of_entries_per_channel": "Number of entries per channel", "observer": "Observer", "observer.1931_2": "CIE 1931 2°", "observer.1955_2": "Stiles & Birch 1955 2°", "observer.1964_10": "CIE 1964 10°", "observer.1964_10c": "CIE 1964 10° / 1931 2° hybrid", "observer.1978_2": "Judd & Voss 1978 2°", "observer.shaw": "Shaw & Fairchild 1997 2°", "oem.import.auto": "If your colorimeter came with a software CD for Windows, please insert it now (abort any possibly automatic software installation).\n\nIf you don't have a CD and the required files cannot be found otherwise, they will be downloaded from the Web.", "oem.import.auto.download_selection": "A preselection was made based on the detected instrument(s). Please select the file(s) to download (total download size can add up to several hundred MB depending on the selection).", "oem.import.auto_windows": "If the vendor software for your colorimeter is installed, the required files can be found automatically in most cases.", "office_web.icc": "Office & Web (D65, Gamma 2.2)", "offset": "Offset", "offset_lithography": "Offset lithography", "ok": "OK", "or": "or", "osd": "OSD", "other": "Other", "out": "Out", "out_of_gamut_tag": "Out of gamut tag", "output.profile": "Target profile", "output_device_profile": "Output device profile", "output_offset": "Output offset", "output_table": "Output Table", "overwrite": "Overwrite", "panel.surface": "Panel surface", "panel.type": "Panel type", "passive_matrix_display": "Passive matrix display", "patch.layout.select": "Please select a patch layout:", "patches": "Patches", "patterngenerator.prisma.specify_host": "Please specify the hostname of your Prisma Video Processor, e.g. prisma-0123 (Windows) or prisma-0123.local (Linux/Mac OS X). You can find the hostname on a label at the underside of the Prisma, unless it was changed via the Prisma's administrative web interface. Alternatively, enter the IP address (if known), e.g. 192.168.1.234", "patterngenerator.sync_lost": "Lost sync with the pattern generator.", "pause": "Pause", "pcs_illuminant_xyz": "PCS illuminant XYZ", "pcs_relative_cct": "PCS-relative CCT", "pcs_relative_lab": "PCS-relative Lab", "pcs_relative_xyz": "PCS-relative XYZ", "pcs_to_device_intent_0": "PCS to device: Intent 0", "pcs_to_device_intent_1": "PCS to device: Intent 1", "pcs_to_device_intent_2": "PCS to device: Intent 2", "perceptual": "Perceptual", "photo.icc": "Photo (D50, Gamma 2.2)", "photo_imagesetter": "Photo imagesetter", "photographic_paper_printer": "Photographic paper printer", "platform": "Platform", "please_wait": "Please wait...", "port.invalid": "Invalid port: %s", "positive": "Positive", "preferred_cmm": "Preferred CMM", "prepress.icc": "Prepress (D50, 130 cd/m², L*)", "preset": "Preset", "preview": "Preview", "profile": "Profile", "profile.advanced_gamap": "Advanced...", "profile.b2a.hires": "Enhance effective resolution of colorimetric PCS-to-device table", "profile.b2a.lowres.warning": "The profile is seemingly missing high-quality PCS-to-device tables, which are essential for proper operation. Do you want to generate high-quality tables now? This will take a few minutes.", "profile.b2a.smooth": "Smoothing", "profile.choose": "Please choose a profile.", "profile.confirm_regeneration": "Do you want to regenerate the profile?", "profile.created": "The profile has been successfully created.", "profile.current": "Current profile", "profile.do_not_install": "Don't install profile", "profile.iccv4.unsupported": "Version 4 ICC profiles are not supported.", "profile.import.success": "The profile has been imported. You may need to manually assign and activate it under “Color” system settings.", "profile.info": "Profile information", "profile.info.show": "Show profile information", "profile.install": "Install profile", "profile.install.error": "The profile could not be installed/activated.", "profile.install.osx_manual_select": "The profile has been installed. Please activate it in the “Displays” system preferences pane.", "profile.install.success": "The profile has been installed and activated.", "profile.install.virtual.unsupported": "Profiles cannot be installed for virtual display devices.", "profile.install_local_system": "Install profile as system default", "profile.install_network": "Install profile network-wide", "profile.install_user": "Install profile for current user only", "profile.install.warning": "The profile has been installed, but there may be problems.", "profile.invalid": "Invalid profile.", "profile.load_error": "Display profile couldn't be loaded.", "profile.load_on_login": "Load calibration on login", "profile.load_on_login.handled_by_os": "Let the operating system handle calibration loading (low precision and reliability)", "profile.name": "Profile name", "profile.name.create": "Generate profile name", "profile.name.placeholders": "You may use the following placeholders in the profile name:\n\n%a Abbreviated weekday name\n%A Full weekday name\n%b Abbreviated month name\n%B Full month name\n%d Day of the month\n%H Hour (24-hour clock)\n%I Hour (12-hour clock)\n%j Day of the year\n%m Month\n%M Minute\n%p AM/PM\n%S Second\n%U Week (Sunday as first day of the week)\n%w Weekday (sunday is 0)\n%W Week (Monday as first day of the week)\n%y Year without century\n%Y Year with century", "profile.no_embedded_ti3": "The profile does not contain Argyll compatible measurement data.", "profile.no_vcgt": "The profile does not contain calibration curves.", "profile.only_named_color": "Only profiles of type “Named Color” can be used.", "profile.quality": "Profile quality", "profile.quality.b2a.low": "Low quality PCS-to-device tables", "profile.quality.b2a.low.info": "Choose this option if the profile is only going to be used with inverse device-to-PCS gamut mapping to create a DeviceLink or 3D LUT", "profile.required_tags_missing": "The profile is missing required tags: %s", "profile.self_check": "Profile self check ΔE*76", "profile.self_check.avg" : "average", "profile.self_check.max" : "maximum", "profile.self_check.rms" : "RMS", "profile.set_save_path": "Choose save path...", "profile.settings": "Profiling settings", "profile.share": "Upload profile...", "profile.share.avg_dE_too_high": "The profile yields a too high delta E (actual = %s, threshold = %s).", "profile.share.b2a_resolution_too_low": "The resolution of the profile's PCS to device tables is too low.", "profile.share.enter_info": "You may share your profile with other users via the OpenSUSE “ICC Profile Taxi” service.\n\nPlease provide a meaningful description and enter display device properties below. Read display device settings from your display device's OSD and only enter settings applicable to your display device which have changed from defaults.\nExample: For most display devices, these are the name of the chosen preset, brightness, contrast, color temperature and/or whitepoint RGB gains, as well as gamma. On laptops and notebooks, usually only the brightness. If you have changed additional settings while calibrating your display device, enter them too if possible.", "profile.share.meta_missing": "The profile does not contain the necessary meta information.", "profile.share.success": "Profile uploaded successfully.", "profile.testchart_recommendation": "For a higher quality profile, a testchart with more samples is recommended, but it will take more time to measure. Do you want to use the recommended testchart?", "profile.type": "Profile type", "profile.type.gamma_matrix": "Gamma + matrix", "profile.type.lut.lab": "L*a*b* LUT", "profile.type.lut.xyz": "XYZ LUT", "profile.type.lut_matrix.xyz": "XYZ LUT + matrix", "profile.type.lut_rg_swapped_matrix.xyz": "XYZ LUT + swapped matrix", "profile.type.shaper_matrix": "Curves + matrix", "profile.type.single_gamma_matrix": "Single gamma + matrix", "profile.type.single_shaper_matrix": "Single curve + matrix", "profile.unsupported": "Unsupported profile type (%s) and/or colorspace (%s).", "profile.update": "Update profile", "profile_class": "Profile class", "profile_connection_space_pcs": "Profile connection space (PCS)", "profile_loader": "Profile loader", "profile_loader.exit_warning": "Do you really want to quit the profile loader? Calibration will no longer be automatically reloaded if you change the display configuration!", "profile_loader.fix_profile_associations": "Automatically fix profile associations", "profile_loader.fix_profile_associations_warning": "As long as the profile loader is running, it can take care of profile associations when you change the display configuration.\n\nBefore you proceed, please make sure the profile associations shown above are correct. If they aren't, follow these steps:\n\n1. Open Windows display settings.\n2. Activate all connected displays (extended desktop).\n3. Open Windows color management settings from the Windows control panel.\n4. Make sure each display device has the correct profile assigned. Then close color management settings.\n5. In Windows display settings, revert to the previous display configuration and close display settings.\n6. Now you can enable “Automatically fix profile associations”.", "profile_loader.info": "Calibration state was (re)applied %i time(s) so far today.\nRight-click icon for menu.", "profiling": "Profiling", "profiling.complete": "Profiling complete!", "profiling.incomplete": "Profiling has not been finished.", "projection_television": "Projection television", "projector": "Projector", "projector_mode_unavailable": "Projector mode is only available with Argyll CMS 1.1.0 Beta or newer.", "quality.ultra.warning": "Ultra quality should almost never be used, except to prove that it should almost never be used (long processing time!). Maybe choose high or medium quality instead.", "readme": "ReadMe", "ready": "Ready.", "red": "Red", "red_gamma": "Red gamma", "red_lab": "Red Lab", "red_matrix_column": "Red matrix column", "red_maximum": "Red maximum", "red_minimum": "Red minimum", "red_tone_response_curve": "Red tone response curve", "red_xyz": "Red XYZ", "reference": "Reference", "reflective": "Reflective", "reflective_scanner": "Reflective scanner", "remaining_time": "Remaining time (ca.)", "rendering_intent": "Rendering intent", "report.calibrated": "Report on calibrated display device", "report.uncalibrated": "Report on uncalibrated display device", "report.uniformity": "Measure display device uniformity...", "resources.notfound.error": "Fatal error: A required file has not been found:", "resources.notfound.warning": "Warning: Some required files have not been found:", "response.invalid": "Invalid response from %s: %s", "response.invalid.missing_key": "Invalid response from %s: Missing key “%s”: %s", "response.invalid.value": "Invalid response from %s: Value of key “%s” does not match expected value “%s”: %s", "restore_defaults": "Restore defaults", "rgb.trc": "RGB transfer function", "rgb.trc.averaged": "averaged RGB transfer function", "sRGB.icc": "sRGB", "saturation": "Saturation", "save": "Save", "save_as": "Save as...", "scripting-client": "DisplayCAL Scripting Client", "scripting-client.cmdhelptext": "Press the tab key at an empty command prompt to view the possible commands in the current context, or to auto-complete already typed initial letters. Type “getcommands” for a list of supported commands and possible parameters for the connected application.", "scripting-client.detected-hosts": "Detected scripting hosts:", "select_all": "Select all", "settings.additional": "Additional settings", "settings.basic": "Basic settings", "settings.new": "", "settings_loaded": "Calibration curves and the following calibration settings have been loaded: %s. Other calibration options have been restored to default and profiling options have not been changed.", "settings_loaded.all": "Settings and calibration curves have been loaded.", "settings_loaded.cal": "The profile contained just calibration settings. Other options have not been changed. No calibration curves have been found.", "settings_loaded.cal_and_lut": "The profile contained just calibration settings. Other options have not been changed and calibration curves have been loaded.", "settings_loaded.cal_and_profile": "Settings have been loaded. No calibration curves have been found.", "settings_loaded.profile": "The profile contained just profiling settings. Other options have not been changed. No calibration curves have been found.", "settings_loaded.profile_and_lut": "The profile contained just profiling settings. Other options have not been changed and calibration curves have been loaded.", "show_advanced_options": "Show advanced options", "silkscreen": "Silkscreen", "simulation_profile": "Simulation profile", "size": "Size", "softproof.icc": "Softproof (D55, 160 cd/m², L*)", "spectral": "Spectral", "startup": "Starting up...", "startup_sound.enable": "Enable startup sound", "success": "...ok.", "surround_xyz": "Surround XYZ", "synthicc.create": "Create synthetic ICC profile...", "target": "Target", "tc.3d": "Create diagnostic 3D file", "tc.I": "Perceptual space body centered cubic grid", "tc.Q": "Perceptual space filling quasi-random", "tc.R": "Perceptual space random", "tc.adaption": "Adaption", "tc.algo": "Distribution", "tc.angle": "Angle", "tc.black": "Black patches", "tc.dark_emphasis": "Dark region emphasis", "tc.fullspread": "Iterative patches", "tc.gray": "Neutral patches", "tc.i": "Device space body centered cubic grid", "tc.limit.sphere": "Limit samples to sphere", "tc.limit.sphere_radius": "Radius", "tc.multidim": "Multidimensional", "tc.multidim.patches": "steps = %s patches (%s neutral)", "tc.neutral_axis_emphasis": "Neutral axis emphasis", "tc.ofp": "Optimized farthest point sampling", "tc.patch": "Patch", "tc.patches.gray": "neutral", "tc.patches.selected": "selected", "tc.patches.total": "Total patches", "tc.precond": "Preconditioning profile", "tc.precond.notset": "Please select a preconditioning profile.", "tc.preview.create": "Creating preview, please wait...", "tc.q": "Device space filling quasi-random", "tc.r": "Device space random", "tc.single": "Single channel patches", "tc.single.perchannel": "per channel", "tc.t": "Incremental far point sampling", "tc.vrml.black_offset": "RGB black offset (L*)", "tc.vrml.device": "Device locations", "tc.vrml.lab": "Lab locations", "tc.vrml.save_as": "Save VRML file(s) as...", "tc.vrml.use_D50": "Neutral RGB white", "tc.white": "White patches", "technology": "Technology", "tempdir_should_still_contain_files": "Created files should still be in the temporary directory “%s”.", "testchart.add_saturation_sweeps": "Add saturation sweeps", "testchart.add_ti3_patches": "Add reference patches...", "testchart.auto_optimize.untethered.unsupported": "The untethered virtual display does not support testchart auto-optimization.", "testchart.change_patch_order": "Change patch order", "testchart.confirm_select": "File saved. Do you want to select this testchart?", "testchart.create": "Create testchart", "testchart.discard": "Discard", "testchart.dont_select": "Don't select", "testchart.edit": "Edit testchart...", "testchart.export.repeat_patch": "Repeat each patch:", "testchart.file": "Testchart", "testchart.info": "Amount of patches in selected testchart", "testchart.invalid": "The testchart file is invalid!", "testchart.optimize_for_untethered_auto_mode": "Optimize for untethered in auto mode", "testchart.patches_amount": "Amount of patches", "testchart.read": "Reading testchart...", "testchart.save_or_discard": "The testchart has not been saved.", "testchart.select": "Select", "testchart.separate_fixed_points": "Please choose the patches to add in a separate step.", "testchart.set": "Choose testchart file...", "testchart.sort_RGB_gray_to_top": "Sort RGB gray to top", "testchart.sort_RGB_blue_to_top": "Sort RGB blue to top", "testchart.sort_RGB_cyan_to_top": "Sort RGB cyan to top", "testchart.sort_RGB_green_to_top": "Sort RGB green to top", "testchart.sort_RGB_magenta_to_top": "Sort RGB magenta to top", "testchart.sort_RGB_red_to_top": "Sort RGB red to top", "testchart.sort_RGB_yellow_to_top": "Sort RGB yellow to top", "testchart.sort_RGB_white_to_top": "Sort RGB white to top", "testchart.sort_by_HSI": "Sort by HSI", "testchart.sort_by_HSL": "Sort by HSL", "testchart.sort_by_HSV": "Sort by HSV", "testchart.sort_by_L": "Sort by L*", "testchart.sort_by_RGB": "Sort by RGB", "testchart.sort_by_RGB_sum": "Sort by sum of RGB", "testchart_or_reference": "Testchart or reference", "thermal_wax_printer": "Thermal wax printer", "tone_values": "Tone values", "transfer_function": "Transfer function", "translations": "Translations", "transparency": "Transparency", "trashcan.linux": "trash", "trashcan.mac": "trash", "trashcan.windows": "recycle bin", "trc": "Tone curve", "trc.dicom": "DICOM", "trc.gamma": "Gamma", "trc.lstar": "L*", "trc.rec1886": "Rec. 1886", "trc.rec709": "Rec. 709", "trc.should_use_viewcond_adjust": "When using the SMPTE 240M, Rec. 709 or sRGB curves, you should use an adjustment for your ambient light levels as well to get correct results. To do that, tick the checkbox near “Ambient light level” and enter a value in Lux. You can also optionally measure ambient light while calibrating, if supported by your instrument.", "trc.smpte240m": "SMPTE 240M", "trc.smpte2084": "SMPTE 2084", "trc.srgb": "sRGB", "trc.type.absolute": "Absolute", "trc.type.relative": "Relative", "type": "Type", "udev_hotplug.unavailable": "Neither udev nor hotplug detected.", "uninstall_display_profile": "Uninstall display device profile...", "unknown": "Unknown", "unmodified": "Unmodified", "unnamed": "Unnamed", "update_check": "Check for application update...", "update_check.fail": "Check for application update failed:", "update_check.fail.version": "Remote version file from server %s couldn't be parsed.", "update_check.new_version": "An update is available: %s", "update_check.onstartup": "Check for application update on startup", "update_check.uptodate": "%s is up-to-date.", "update_now": "Update now", "upload": "Upload", "use_fancy_progress": "Use fancy progress dialog", "use_separate_lut_access": "Use separate video card gamma table access", "use_simulation_profile_as_output": "Use simulation profile as target profile", "vcgt": "Calibration curves", "vcgt.mismatch": "The video card gamma tables for display %s do not match the desired state.", "vcgt.unknown_format": "Unknown video card gamma table format in profile “%s”.", "verification": "Verification", "verification.settings": "Verification settings", "verify.ti1": "Verification testchart", "verify_extended.ti1": "Extended verification testchart", "verify_grayscale.ti1": "Graybalance verification testchart", "verify_large.ti1": "Large verification testchart", "verify_xl.ti1": "Extra large verification testchart", "verify_xxl.ti1": "XXL verification testchart", "verify_xxxl.ti1": "XXXL verification testchart", "verify_video.ti1": "Verification testchart (video)", "verify_video_extended.ti1": "Extended verification testchart (video)", "verify_video_large.ti1": "Large verification testchart (video)", "verify_video_xl.ti1": "Extra large verification testchart (video)", "verify_video_xxl.ti1": "XXL verification testchart (video)", "verify_video_xxxl.ti1": "XXXL verification testchart (video)", "vga": "VGA", "video.icc": "Video (D65, Rec. 1886)", "video_camera": "Video camera", "video_card_gamma_table": "Video card gamma table", "video_eeColor.icc": "Video 3D LUT for eeColor (D65, Rec. 709 / Rec. 1886)", "video_madVR.icc": "Video 3D LUT for madVR (D65, Rec. 709 / Rec. 1886)", "video_monitor": "Video monitor", "video_Prisma.icc": "Video 3D LUT for Prisma (D65, Rec. 709 / Rec. 1886)", "video_ReShade.icc": "Video 3D LUT for ReShade (D65, Rec. 709 / Rec. 1886)", "video_resolve.icc": "Video 3D LUT for Resolve (D65, Rec. 709 / Rec. 1886)", "view.3d": "3D view", "viewing_conditions": "Viewing conditions", "viewing_conditions_description": "Viewing conditions description", "vrml_to_x3d_converter": "VRML to X3D converter", "warning": "Warning", "warning.already_exists": "The file “%s” already exists at the chosen location and will be overwritten. Do you want to continue?", "warning.autostart_system": "The system-wide autostart directory could not be determined.", "warning.autostart_user": "The user-specific autostart directory could not be determined.", "warning.copy_failed_continue": "The file “%s” could not be copied to “%s”. Continuing...", "warning.discard_changes": "Do you really want to discard the changes to the current settings?", "warning.input_value_clipping": "Warning: Input values below the target blackpoint will be clipped!", "warning.no_comports_detected": "No instrument could be detected.", "warning.suspicious_delta_e": "Warning: Suspicious measurements have been found. Please note this check assumes an sRGB-like display device. If your display device differs from this assumption (e.g. if it has a very wide gamut or a tone response too far from sRGB), then errors found are probably not meaningful.\n\nOne or all of the following criteria matched:\n\n• Consecutive patches with different RGB numbers, but suspiciously low ΔE*00 of the measurements against each other.\n• RGB gray with increasing RGB numbers towards the previous patch, but declining lightness (L*).\n• RGB gray with decreasing RGB numbers towards the previous patch, but rising lightness (L*).\n• Unusually high ΔE*00 and ΔL*00 or ΔH*00 or ΔC*00 of measurements to the sRGB equivalent of the RGB numbers.\n\nThis could hint at measurement errors. Values that are considered problematic (which does not have to be true!) are highlighted in red. Check the measurements carefully and mark the ones you want to accept. You can also edit the RGB and XYZ values.", "warning.suspicious_delta_e.info": "Explanation of the Δ columns:\n\nΔE*00 XYZ A/B: ΔE*00 of measured values towards measured values of the previous patch. If this value is missing, it wasn't a factor while checking. If it is present, then it is assumed to be too low.\n\n0.5 ΔE*00 RGB A/B: ΔE*00 of the sRGB equivalent of the RGB numbers towards the sRGB equivalent of the RGB numbers of the previous patch (with a factor of 0.5). If this value is present, it represents the comparison (minimal) value during checking for assumed too low ΔE*00 XYZ A/B. It serves as a very rough orientation.\n\nΔE*00 RGB-XYZ: ΔE*00 of measured values towards the sRGB equivalent of the RGB numbers.\nΔL*00 RGB-XYZ: ΔL*00 of measured values towards the sRGB equivalent of the RGB numbers.\nΔC*00 RGB-XYZ: ΔC*00 of measured values towards the sRGB equivalent of the RGB numbers.\nΔH*00 RGB-XYZ: ΔH*00 of measured values towards the sRGB equivalent of the RGB numbers.", "warning.system_file": "Warning: “%s” is a system file. Do you really want to continue?", "webserver.waiting": "Webserver waiting at", "welcome": "Welcome!", "welcome_back": "Welcome back!", "white": "White", "whitepoint": "Whitepoint", "whitepoint.colortemp": "Color temperature", "whitepoint.colortemp.locus.blackbody": "Blackbody", "whitepoint.colortemp.locus.curve": "Color temperature curve", "whitepoint.colortemp.locus.daylight": "Daylight", "whitepoint.set": "Do you also want to set the whitepoint to the measured value?", "whitepoint.simulate": "Simulate whitepoint", "whitepoint.simulate.relative": "Relative to target profile whitepoint", "whitepoint.xy": "Chromaticity coordinates", "window.title": "DisplayCAL", "windows.version.unsupported": "This version of Windows is not supported.", "windows_only": "Windows only", "working_dir": "Working directory:", "yellow": "Yellow", "yellow_lab": "Yellow Lab", "yellow_xyz": "Yellow XYZ", "yes": "Yes", } DisplayCAL-3.1.0.0/DisplayCAL/lang/es.json0000644000076500000000000024640212653526635017667 0ustar devwheel00000000000000{ "*": "Note to translators: Keys which are not yet translated are marked with a leading asterisk (*) and are indented with two tabs instead of one. Please remove the asterisk when translated.", "!author": "Roberto Quintero", "!language": "Español", "!language_name": "SPANISH", "*3dlut": "3D LUT", "*3dlut.1dlut.videolut.nonlinear": "The display device's video card gamma tables 1D LUT calibration is non-linear, but the 3D LUT contains applied 1D LUT calibration. Make sure to manually reset the video card gamma tables to linear before using the 3D LUT, or create a 3D LUT without calibration applied (to do the latter, enable “Show advanced options” in the “Options” menu and disable “Apply calibration (vcgt)” as well as “Create 3D LUT after profiling” in the 3D LUT settings, then create a new 3D LUT).", "3dlut.bitdepth.input": "Profundidad de bits de entrada 3D LUT", "3dlut.bitdepth.output": "Profundidad de bits de salida 3D LUT", "3dlut.create": "Crear 3D LUT...", "*3dlut.create_after_profiling": "Create 3D LUT after profiling", "*3dlut.enable": "Enable 3D LUT", "*3dlut.encoding.input": "Input encoding", "*3dlut.encoding.output": "Output encoding", "*3dlut.encoding.output.warning.madvr": "Warning: This output encoding is not recommended and will cause clipping if madVR is not set up to output “TV levels (16-235)” under “Devices” → “%s” → “Properties”. Use at own risk!", "*3dlut.encoding.type_2": "TV Rec. 2020 YCbCr UHD", "*3dlut.encoding.type_5": "TV Rec. 709 1250/50Hz YCbCr HD", "*3dlut.encoding.type_6": "TV Rec. 601 YCbCr SD", "*3dlut.encoding.type_7": "TV Rec. 709 1125/60Hz YCbCr HD", "*3dlut.encoding.type_C": "TV Rec. 2020 Constant Luminance YCbCr UHD", "*3dlut.encoding.type_T": "TV RGB 16-235 (clip WTW)", "*3dlut.encoding.type_X": "TV xvYCC Rec. 709 YCbCr HD", "*3dlut.encoding.type_n": "Full range RGB 0-255", "*3dlut.encoding.type_t": "TV RGB 16-235", "*3dlut.encoding.type_x": "TV xvYCC Rec. 601 YCbCr (Rec. 709 Primaries) SD", "3dlut.format": "Formato de archivo 3D LUT", "*3dlut.format.3dl": "Autodesk Lustre / Kodak Look Manager System (.3dl)", "*3dlut.format.ReShade": "ReShade (.png, .fx)", "*3dlut.format.cube": "IRIDAS (.cube)", "*3dlut.format.eeColor": "eeColor Processor (.txt)", "*3dlut.format.madVR": "madVR (.3dlut)", "*3dlut.format.mga": "Pandora (.mga)", "*3dlut.format.png": "PNG (.png)", "*3dlut.format.spi3d": "Sony Imageworks (.spi3d)", "3dlut.frame.title": "Crear 3D LUT", "*3dlut.holder.assign_preset": "Assign 3D LUT to preset:", "*3dlut.holder.out_of_memory": "%s is out of 3D LUT storage space (at least %i KB required). Please delete a few 3D LUTs from %s to make space for new ones. See your %s's documentation for more information.", "*3dlut.input.colorspace": "Source colorspace", "3dlut.input.profile": "Perfil de origen", "*3dlut.install": "Install 3D LUT", "*3dlut.install.failure": "3D LUT installation failed (unknown error).", "*3dlut.install.success": "3D LUT installation successful!", "*3dlut.install.unsupported": "3D LUT installation is not supported for the selected 3D LUT format.", "*3dlut.save_as": "Save 3D LUT as...", "*3dlut.settings": "3D LUT settings", "3dlut.size": "Tamaño 3D LUT", "*3dlut.tab.enable": "Enable 3D LUT tab", "*3dlut.use_abstract_profile": "Abstract (“Look”) profile", "*CMP_Digital_Target-3.cie": "CMP Digital Target 3", "*CMP_Digital_Target-4.cie": "CMP Digital Target 4", "*CMYK_IDEAlliance_ControlStrip_2009.ti1": "IDEAlliance Control Strip 2009", "*ColorChecker.cie": "ColorChecker", "*ColorCheckerDC.cie": "ColorChecker DC", "*ColorCheckerPassport.cie": "ColorChecker Passport", "*ColorCheckerSG.cie": "ColorChecker SG", "*FograStrip2.ti1": "Fogra Media Wedge CMYK V2.0", "*FograStrip3.ti1": "Fogra Media Wedge CMYK V3.0", "*ISO_12646-2008_color_accuracy_and_gray_balance.ti1": "ISO 12646:2008 color accuracy and gray balance", "*QPcard_201.cie": "QPcard 201", "*QPcard_202.cie": "QPcard 202", "*SpyderChecker.cie": "SpyderCHECKR", "*Untethered": "Untethered", "[rgb]TRC": "Curva de respuesta tonal", "aborted": "...abortada.", "aborting": "Abortando, por favor espere (esto llevará unos segundos)...", "*abstract_profile": "Abstract profile", "*active_matrix_display": "Active matrix display", "adaptive_mode_unavailable": "El modo adaptivo esta solo disponible con Argyll CMS 1.1.0 RC3 o reciente.", "allow_skip_sensor_cal": "Permitir saltarse la autocalibración del espectrofotometro", "ambient.measure": "Medicion ambiente", "*ambient.measure.color.unsupported": "%s: The color of ambient light could not be determined using this instrument because its ambient sensor seems to be monochromatic (only got a light level reading).", "*ambient.measure.light_level.missing": "Didn't get a light level reading.", "ambient.set": "¿Desea tambien ajustar la luz ambiente a los niveles medidos?", "*app.client.connect": "Scripting client %s:%s connected", "*app.client.disconnect": "Scripting client %s:%s disconnected", "*app.client.ignored": "Refused connection attempt of scripting client %s:%s: %s", "*app.client.network.disallowed": "Refused connection attempt of scripting client %s:%s: Network clients are not allowed.", "app.confirm_restore_defaults": "¿Desea descartar sus cambios y restaurar los valores por defecto?", "*app.detected.calibration_loading_disabled": "Detected %s. Calibration loading disabled.", "*app.detection_lost.calibration_loading_enabled": "No longer detecting %s. Calibration loading enabled.", "*app.incoming_message": "Received scripting request from %s:%s: %s", "*app.incoming_message.invalid": "Scripting request invalid!", "*app.listening": "Setting up scripting host at %s:%s", "*app.otherinstance": "%s is already running.", "*app.otherinstance.notified": "Already running instance has been notified.", "app.restart_request": "Por favor reinicie la aplicación.", "apply": "Aplicar", "*apply_black_output_offset": "Apply black output offset (100%)", "apply_cal": "Aplicar calibracion (vcgt)", "apply_cal.error": "La calibracion no puede ser aplicada.", "*apply_trc": "Apply tone response curve", "*archive.create": "Create compressed archive...", "*archive.import": "Import archive...", "*archive.include_3dluts": "Do you want to include 3D LUT files in the archive (not recommended, leads to larger archive file size)?", "argyll.debug.warning1": "Por favor utilize solo esta opcion si necesita informacion de depuracion (p.e. para solucionar problemas en la funcionalidad de Argyll CMS)! Normalmente solo es util para desarrolladoes de software para ayudar en el diagnostico de problemas y su resolucion. ¿Está seguro de querer activar la salida de depuración?", "argyll.debug.warning2": "Por favor recuerde desactivar la salida de depuración para un funcionamiento normal del programa.", "argyll.dir": "Directorio de ejecutables de Argyll CMS:", "argyll.dir.invalid": "Los ejecutables de Argyll CMS no se han encontrado!\nPor favor seleccione el directorio que contiene los archivos ejecutables (quizá el prefijo o sufijo “argyll-” / “-argyll”): %s", "argyll.error.detail": "Mensaje de error de Argyll CMS detallado:", "*argyll.instrument.configuration_files.install": "Install Argyll CMS instrument configuration files...", "*argyll.instrument.configuration_files.install.success": "Installation of Argyll CMS instrument configuration files complete.", "*argyll.instrument.configuration_files.uninstall": "Uninstall Argyll CMS instrument configuration files...", "*argyll.instrument.configuration_files.uninstall.success": "Uninstallation of Argyll CMS instrument configuration files complete.", "argyll.instrument.driver.missing": "El controlador Argyll CMS para su instrumento de medición parece no estar instalado o está instalado incorrectamente. Por favor compruebe que su instruemento de medición se muestra en Windows' gestor de perifericos debajo de „Argyll LibUSB-1.0A devices“ y (re-)instalar el controlador si es necesario. Por favor lea la documentacion para instrucciones de instalación.", "*argyll.instrument.drivers.install": "Install Argyll CMS instrument drivers...", "*argyll.instrument.drivers.install.confirm": "You only need to install the Argyll CMS specific drivers if you have a measurement instrument that is not a ColorMunki Display, i1 Display Pro, Huey, ColorHug, specbos or K-10.\n\nNote: If you already have a vendor driver for your instrument installed, you'll have to use Windows' Device Manager to manually switch to the Argyll CMS driver after it has been installed. To do that, right click on the instrument and select “Update Driver Software...”, then choose “Browse my computer for driver software”, “Let me pick from a list of device drivers on my computer” and finally select the Argyll driver for your instrument from the list.\n\nDo you want to proceed?", "*argyll.instrument.drivers.install.failure": "Installation of Argyll CMS instrument drivers failed.", "*argyll.instrument.drivers.install.restart": "You need to disable Driver Signature Enforcement to install the Argyll CMS instrument drivers. For this purpose, the system needs to be restarted. Select “Troubleshoot” on the page that will appear, then “Advanced Options”, “Startup Settings” and finally “Restart”. On startup, select “Disable Driver Signature Enforcement”. After the restart, choose “Install Argyll CMS instrument drivers...” in the menu again to install the drivers. If you don't see the “Troubleshoot” option, please refer to the DisplayCAL documentation section “Instrument driver installation under Windows” for an alternate method to disable Driver Signature Enforcement.", "*argyll.instrument.drivers.uninstall": "Uninstall Argyll CMS instrument drivers...", "*argyll.instrument.drivers.uninstall.confirm": "Note: Uninstallation doesn't affect instrument drivers that are currently in use, but just removes the driver from Windows' Driver Store. If you want to switch back to an installed vendor-supplied driver for your instrument, you'll have to use Windows' Device Manager to manually switch to the vendor driver. To do that, right click on the instrument and select “Update Driver Software...”, then choose “Browse my computer for driver software”, “Let me pick from a list of device drivers on my computer” and finally select the vendor driver for your instrument from the list.\n\nDo you want to proceed?", "*argyll.instrument.drivers.uninstall.failure": "Uninstallation of Argyll CMS instrument drivers failed.", "*argyll.instrument.drivers.uninstall.success": "Uninstallation of Argyll CMS instrument drivers complete.", "argyll.util.not_found": "El ejecutable de Argyll CMS “%s” no se encuentra!", "as_measured": "Nativo", "*attributes": "Attributes", "*audio.lib": "Audio module: %s", "auth": "Autentificacion", "auth.failed": "Autentificacion fallida.", "auto": "Auto", "*auto_optimized": "Auto-optimized", "autostart_remove_old": "Removiendo la entrada antigua de autoinicio", "*backing_xyz": "Backing XYZ", "backlight": "Luz de fondo", "*bitdepth": "Bitdepth", "black": "Negro", "*black_lab": "Black Lab", "black_point": "Punto negro", "black_point_compensation": "Compensación del punto negro", "*black_point_compensation.3dlut.warning": "When creating a 3D LUT, the black point compensation profiling setting should be turned off, because it affects the function of the tone curve adjustment. Would you like to turn off black point compensation?", "black_point_compensation.info": "La compensación del punto negro previene el aplastamiento del negro, pero reduce la precisión de la conversión de color.", "*black_white": "Black & white", "*black_xyz": "Black XYZ", "blacklevel": "Nivel de negro", "blue": "Azul", "*blue_gamma": "Blue gamma", "*blue_lab": "Blue Lab", "*blue_matrix_column": "Blue matrix column", "*blue_maximum": "Blue maximum", "*blue_minimum": "Blue minimum", "*blue_tone_response_curve": "Blue tone response curve", "*blue_xyz": "Blue XYZ", "brightness": "Brillo", "browse": "Seleccionar...", "bug_report": "Notificar un error...", "button.calibrate": "Solo calibrar", "button.calibrate_and_profile": "Calibrar y perfilar", "button.profile": "Solo perfilar", "cal_extraction_failed": "No se pueden extraer datos de calibracion del perfil.", "*calculated_checksum": "Calculated checksum", "*calibrate_instrument": "Spectrometer self-calibration", "calibration": "Calibracion", "calibration.ambient_viewcond_adjust": "Nivel de luz ambiente", "calibration.ambient_viewcond_adjust.info": "Para realizar un ajuste de las condiciones de visualización cuando se calculan las curvas de calibración, active la casilla e introduzca su nivel de luz ambiente. Opcionalmente puede medir la luz ambiente mientras calibra, si lo soporta su instrumento.", "calibration.black_luminance": "Nivel de negro", "calibration.black_output_offset": "Compensacion salida del negro", "calibration.black_point_correction": "Corrección punto negro", "calibration.black_point_correction_choice": "Debe desactivar la corrección del punto negro, para optimizar el nivel de negro y el ratio de contraste (recomendado para la mayoria de los monitores LCD), o puede activarlo para hacer el negro del mismo matiz que el punto blanco (recomendado para la mayoria de los monitores CRT). Por favor seleccione su preferencia de corrección de punto negro.", "calibration.black_point_rate": "Tasa", "calibration.check_all": "Comprobrar ajustes", "calibration.complete": "Calibración completada!", "calibration.create_fast_matrix_shaper": "Crear perfil de matriz", "calibration.create_fast_matrix_shaper_choice": "¿Quiere crear un perfil de matriz rapido de las mediciones de calibracion o solo calibrar?", "*calibration.do_not_use_video_lut": "Do not use video card gamma table to apply calibration", "*calibration.do_not_use_video_lut.warning": "Do you really want to change the recommended setting?", "*calibration.embed": "Embed calibration curves in profile", "calibration.file": "Ajustes", "calibration.file.invalid": "El archivo de configuración seleccionado no es valido.", "calibration.file.none": "", "calibration.incomplete": "La calibración no ha terminado.", "calibration.interactive_display_adjustment": "Ajuste del monitor interactivo", "calibration.interactive_display_adjustment.black_level.crt": "Seleccione “Comenzar medicion” y ajustar el brillo de su pantalla y/o los controles desplazamiento RGB para conseguir el nivel deseado.", "calibration.interactive_display_adjustment.black_point.crt": "Seleccione “Comenzar medicion” y ajustar los controles desplazamiento RGB de su pantalla para conseguir el punto negro deseado.", "calibration.interactive_display_adjustment.check_all": "Seleccione “Comenzar medicion” para comprobar los ajustes generales.", "calibration.interactive_display_adjustment.generic_hint.plural": "Un buen resultado se obtiene si todas las barras pueden ser llevadas a la posición marcada en el centro.", "calibration.interactive_display_adjustment.generic_hint.singular": "Un buen resultado se obtiene si la barra puede ser llevada a la posición marcada en el centro.", "calibration.interactive_display_adjustment.start": "Comenzar medicion", "calibration.interactive_display_adjustment.stop": "Parar medicion", "calibration.interactive_display_adjustment.white_level.crt": "Seleccione “Comenzar medicion” y ajustar el contraste de su pantalla y/o los controles de ganancia RGB para conseguir el nivel deseado.", "calibration.interactive_display_adjustment.white_level.lcd": "Seleccione “Comenzar medicion” y ajustar los controles luz de fondo/brillo de su pantalla para conseguir el punto negro deseado.", "calibration.interactive_display_adjustment.white_point": "Seleccione “Comenzar medicion” y ajustar los controles temperatura de color y/o ganacia RGB de su pantalla para conseguir el punto blanco deseado.", "calibration.load": "Cargando ajustes...", "*calibration.load.handled_by_os": "Calibration loading is handled by the operating system.", "calibration.load_error": "Las curvas de calibración no pueden ser cargadas.", "calibration.load_from_cal": "Cargando curvas de calibración desde el archivo de calibracion...", "calibration.load_from_cal_or_profile": "Cargando curvas de calibración desde el archivo de calibración o del perfil...", "calibration.load_from_display_profile": "Cargar curvas de calibración desde el perfil de pantalla actual", "*calibration.load_from_display_profiles": "Load calibration from current display device profile(s)", "calibration.load_from_profile": "Cargar curvas de calibración desde el perfil...", "calibration.load_success": "Curvas de calibración cargadas correctamente.", "calibration.loading": "Cargando curvas de calibración desde archivo...", "calibration.loading_from_display_profile": "Cargar curvas de calibración del perfil de pantalla actual...", "calibration.luminance": "Nivel de blanco", "calibration.lut_viewer.title": "Curvas", "*calibration.preserve": "Preserve calibration state", "calibration.preview": "Calibracion previa", "calibration.quality": "Calidad de la calibración", "calibration.quality.high": "Alta", "calibration.quality.low": "Baja", "calibration.quality.medium": "Media", "calibration.quality.ultra": "Ultra", "calibration.quality.verylow": "Muy baja", "calibration.reset": "Resetear curvas de calibración", "calibration.reset_error": "Las curvas de calibración no pueden ser reseteadas.", "calibration.reset_success": "Curvas de calibración reseteadas correctamente.", "calibration.resetting": "Reseteando curvas de calibración a valores por defecto...", "calibration.settings": "Valores de calibración", "calibration.show_actual_lut": "Mostrar curvas de calibracion de la tarjeta grafica", "calibration.show_lut": "Mostrar curvas", "*calibration.skip": "Continue on to profiling", "calibration.speed": "Velocidad de la calibración", "calibration.speed.high": "Alta", "calibration.speed.low": "Baja", "calibration.speed.medium": "Media", "calibration.speed.veryhigh": "Muy alta", "calibration.speed.verylow": "Muy baja", "calibration.start": "Continúe con la calibración", "calibration.turn_on_black_point_correction": "Activar", "calibration.update": "Calibración actualizada", "calibration.update_profile_choice": "¿Quiere actualizar también las curvas de calibración en el perfil existente o solo calibrar?", "*calibration.use_linear_instead": "Use linear calibration instead", "calibration.verify": "Verificando calibración", "calibration_profiling.complete": "Calibración y perfilado completado!", "calibrationloader.description": "Establece los perfiles ICC y carga curvas de calibración para todos los dispositivos de visualización configurados", "*can_be_used_independently": "Can be used independently", "cancel": "Cancelar", "*cathode_ray_tube_display": "Cathode ray tube display", "ccxx.ti1": "Carta de ajustes para correcion de colorimetro", "*centered": "Centered", "*channel_1_c_xy": "Channel 1 (C) xy", "*channel_1_gamma_at_50_input": "Channel 1 gamma at 50% input", "*channel_1_is_linear": "Channel 1 is linear", "*channel_1_maximum": "Channel 1 maximum", "*channel_1_minimum": "Channel 1 minimum", "*channel_1_r_xy": "Channel 1 (R) xy", "*channel_1_unique_values": "Channel 1 unique values", "*channel_2_g_xy": "Channel 2 (G) xy", "*channel_2_gamma_at_50_input": "Channel 2 gamma at 50% input", "*channel_2_is_linear": "Channel 2 is linear", "*channel_2_m_xy": "Channel 2 (M) xy", "*channel_2_maximum": "Channel 2 maximum", "*channel_2_minimum": "Channel 2 minimum", "*channel_2_unique_values": "Channel 2 unique values", "*channel_3_b_xy": "Channel 3 (B) xy", "*channel_3_gamma_at_50_input": "Channel 3 gamma at 50% input", "*channel_3_is_linear": "Channel 3 is linear", "*channel_3_maximum": "Channel 3 maximum", "*channel_3_minimum": "Channel 3 minimum", "*channel_3_unique_values": "Channel 3 unique values", "*channel_3_y_xy": "Channel 3 (Y) xy", "*channel_4_k_xy": "Channel 4 (K) xy", "*channels": "Channels", "*characterization_device_values": "Characterization device values", "*characterization_measurement_values": "Characterization measurement values", "*characterization_target": "Characterization target", "checking_lut_access": "Chequeando acceso calibración para la pantalla %s...", "*checksum": "Checksum", "*checksum_ok": "Checksum OK", "*chromatic_adaptation_matrix": "Chromatic adaptation matrix", "*chromatic_adaptation_transform": "Chromatic adaptation transform", "*chromaticity_illuminant_relative": "Chromaticity (illuminant-relative)", "*chromecast_limitations_warning": "Please note that Chromecast accuracy is not as good as a directly connected display or madTPG, due to the Chromecast using RGB to YCbCr conversion and upscaling.", "clear": "Limpiar", "*color": "Color", "*color.custom": "Custom color", "*color_look_up_table": "Color Look Up Table", "*color_model": "Color model", "*color_space_conversion_profile": "Color space Conversion profile", "*colorant_order": "Colorant order", "*colorants_pcs_relative": "Colorants (PCS-relative)", "colorconfig_remove_old": "Eliminando archivo de ajustes de pantalla antiguo", "colorimeter_correction.create": "Crear correccion de colorimetro...", "colorimeter_correction.create.details": "Por favor comprobar los campos de abajo y cambiarlos cuando sea necesario. La descripcion puede contener detalles importantes (p.e. ajustes de pantalla especificas, observador no CIE por defecto o similar).", "colorimeter_correction.create.failure": "Creacion de correcion fallada.", "colorimeter_correction.create.info": "Para crear una correcion de matriz de colorimetro (CCMX) o un ejemplo de archivo de calibracion espectral (CCSS), primero nedesita medir “carta de ajustes para correcion de colorimetro” con un espectrofotometro, y en caso de crear un archivo CCMX, tambien con el colorimetro.", "colorimeter_correction.create.success": "Correcion creada con exito.", "colorimeter_correction.file.none": "Ninguno", "colorimeter_correction.import": "Importar correciones de colorimetro desde otros programas de calibracion de pantallas...", "colorimeter_correction.import.choose": "Por favor seleccione el archivo de correccion de colorimetro a importar.", "colorimeter_correction.import.failure": "No se pueden importar las correciones de colorimetro.", "*colorimeter_correction.import.partial_warning": "Not all colorimeter corrections could be imported from %s. %i of %i entries had to be skipped.", "colorimeter_correction.import.success": "Las correciones de colorimetro han sido importadas con exito de los siguientes programas:\n\n%s", "*colorimeter_correction.instrument_mismatch": "The selected colorimeter correction is not suitable for the selected instrument.", "colorimeter_correction.upload": "Subir correcion de colorimetro...", "colorimeter_correction.upload.confirm": "¿Quiere subir la correccion de colorimetro a la base de datos en linea (recomendado)? Cualquier archivo subido se asume será de dominio publico, asi que pueden ser usados libremente.", "colorimeter_correction.upload.deny": "Esta correccion de colorimetro no puede ser subida.", "colorimeter_correction.upload.exists": "La correcion de colorimetro ya existe en la base de datos.", "colorimeter_correction.upload.failure": "La correccion no pudo ser introducida en la base de datos en linea.", "colorimeter_correction.upload.success": "La correcion fue subida con exito a la base de datos en linea.", "colorimeter_correction.web_check": "Comprobar en linea para correcion de colorimetro...", "colorimeter_correction.web_check.choose": "Se han encontrado las siguientes correciones de colorimetro para la pantalla e instrumento seleccionado :", "colorimeter_correction.web_check.failure": "No se han encontrado correciones de colorimetro para la pantalla y el instrumento seleccionado.", "colorimeter_correction_matrix_file": "Correccion", "colorimeter_correction_matrix_file.choose": "seleccionar correcion de colorimetro", "*colors_pcs_relative": "Colors (PCS-relative)", "colorspace": "Espacio de color", "colorspace.show_outline": "Mostrar borde", "commandline": "Linea de comandos:", "*commands": "Commands", "comparison_profile": "Perfil de comparacion", "comport_detected": "Ha sido detectado un cambio en el instrumento/puerto de ajustes.", "*compression.gzip": "GZIP compression", "*computer.name": "Computername", "*connected.to.at": "Connected to %s at %s:%s", "*connecting.to": "Connecting to %s:%s...", "*connection.broken": "Connection broken", "*connection.established": "Connection established", "connection.fail": "Error de Conexion (%s)", "connection.fail.http": "Error HTTP %s", "*connection.waiting": "Waiting for connection at", "continue": "Continuar", "contrast": "Contraste", "*contribute": "Contribute", "*converting": "Converting", "*copyright": "Copyright", "corrected": "corregido", "create_and_preview": "Crear & Previo", "create_ccss_or_ccmx": "¿Desea crear una correcion de matriz para colorimetros ordinarios (CCMX) o un ejemplo de calibracion espectral para el i1 Display Pro y el ColorMunki (CCSS)?", "create_profile": "Crear perfil desde datos de medición...", "create_profile_from_edid": "Crear perfil a partir de EDID...", "created": "Creado", "*creator": "Creator", "current": "Actual", "custom": "Otro", "cyan": "Cian", "*d3-e4-s0-g25-m3-b3-f0-crossover.ti1": "Default testchart for matrix profiles", "*d3-e4-s0-g49-m3-b3-f0-crossover.ti1": "Extended testchart for matrix profiles", "*d3-e4-s0-g9-m3-b3-f0-crossover.ti1": "Small testchart for matrix profiles", "*d3-e4-s0-g97-m3-b3-f0-crossover.ti1": "Very large testchart for matrix profiles", "*d3-e4-s13-g37-m4-b4-f0.ti1": "Small testchart for LUT profiles", "*d3-e4-s17-g49-m5-b5-f0.ti1": "Default testchart for LUT profiles", "*d3-e4-s21-g61-m6-b6-f0.ti1": "Extended testchart for LUT profiles", "*d3-e4-s25-g73-m0-f679-cRec709_Gamma22.ti1": "Large testchart for LUT profiles, optimized for Gamma 2.2 with Rec. 709 primaries (D65)", "*d3-e4-s25-g73-m0-f679-caRGB.ti1": "Large testchart for LUT profiles, optimized for Gamma 2.2 with AdobeRGB primaries (D65)", "*d3-e4-s25-g73-m0-f679-ceRGBv2.ti1": "Large testchart for LUT profiles, optimized for L* with NTSC 1953 primaries (D50)", "*d3-e4-s25-g73-m0-f679-csRGB.ti1": "Large testchart for LUT profiles, optimized for sRGB (D65)", "*d3-e4-s25-g73-m7-b7-f0.ti1": "Large testchart for LUT profiles", "*d3-e4-s29-g85-m0-f994-cRec709_Gamma22.ti1": "Very large testchart for LUT profiles, optimized for Gamma 2.2 with Rec. 709 primaries (D65)", "*d3-e4-s29-g85-m0-f994-caRGB.ti1": "Very large testchart for LUT profiles, optimized for Gamma 2.2 with AdobeRGB primaries (D65)", "*d3-e4-s29-g85-m0-f994-ceRGBv2.ti1": "Very large testchart for LUT profiles, optimized for L* with NTSC 1953 primaries (D50)", "*d3-e4-s29-g85-m0-f994-csRGB.ti1": "Very large testchart for LUT profiles, optimized for sRGB (D65)", "*d3-e4-s29-g85-m8-b8-f0.ti1": "Very large testchart for LUT profiles", "*d3-e4-s33-g97-m0-f1399-cRec709_Gamma22.ti1": "XXL testchart for LUT profiles, optimized for Gamma 2.2 with Rec. 709 primaries (D65)", "*d3-e4-s33-g97-m0-f1399-caRGB.ti1": "XXL testchart for LUT profiles, optimized for Gamma 2.2 with AdobeRGB primaries (D65)", "*d3-e4-s33-g97-m0-f1399-ceRGBv2.ti1": "XXL testchart for LUT profiles, optimized for L* with NTSC 1953 primaries (D50)", "*d3-e4-s33-g97-m0-f1399-csRGB.ti1": "XXL testchart for LUT profiles, optimized for sRGB (D65)", "*d3-e4-s33-g97-m9-b9-f0.ti1": "XXL testchart for LUT profiles", "*d3-e4-s37-g109-m0-f1906-cRec709_Gamma22.ti1": "XXXL testchart for LUT profiles, optimized for Gamma 2.2 with Rec. 709 primaries (D65)", "*d3-e4-s37-g109-m0-f1906-caRGB.ti1": "XXXL testchart for LUT profiles, optimized for Gamma 2.2 with AdobeRGB primaries (D65)", "*d3-e4-s37-g109-m0-f1906-ceRGBv2.ti1": "XXXL testchart for LUT profiles, optimized for L* with NTSC 1953 primaries (D50)", "*d3-e4-s37-g109-m0-f1906-csRGB.ti1": "XXXL testchart for LUT profiles, optimized for sRGB (D65)", "*d3-e4-s37-g109-m10-b10-f0.ti1": "XXXL testchart for LUT profiles", "*d3-e4-s41-g121-m0-f2527-cRec709_Gamma22.ti1": "Massive testchart for LUT profiles, optimized for Gamma 2.2 with Rec. 709 primaries (D65)", "*d3-e4-s41-g121-m0-f2527-caRGB.ti1": "Massive testchart for LUT profiles, optimized for Gamma 2.2 with AdobeRGB primaries (D65)", "*d3-e4-s41-g121-m0-f2527-ceRGBv2.ti1": "Massive testchart for LUT profiles, optimized for L* with NTSC 1953 primaries (D50)", "*d3-e4-s41-g121-m0-f2527-csRGB.ti1": "Massive testchart for LUT profiles, optimized for sRGB (D65)", "*d3-e4-s41-g121-m11-b11-f0.ti1": "Massive testchart for LUT profiles", "*deactivated": "deactivated", "default": "Por defecto", "*default.icc": "Default (Gamma 2.2)", "*default_crt": "Default CRT", "*default_rendering_intent": "Default rendering intent", "delete": "Borrar", "*delta_e_2000_to_blackbody_locus": "ΔE 2000 to blackbody locus", "*delta_e_2000_to_daylight_locus": "ΔE 2000 to daylight locus", "delta_e_to_locus": "ΔE*00 a %s locus", "description": "Descripcion", "*description_ascii": "Description (ASCII)", "*description_macintosh": "Description (Macintosh)", "*description_unicode": "Description (Unicode)", "*deselect_all": "Deselect all", "detect_displays_and_ports": "Detectar pantallas e instrumentos", "*device": "Device", "*device.name.placeholder": "", "*device_color_components": "Device color components", "*device_manager.launch": "Launch Device Manager", "*device_manufacturer_name": "Device manufacturer name", "*device_manufacturer_name_ascii": "Device manufacturer name (ASCII)", "*device_manufacturer_name_macintosh": "Device manufacturer name (Macintosh)", "*device_manufacturer_name_unicode": "Device manufacturer name (Unicode)", "*device_model_name": "Device model name", "*device_model_name_ascii": "Device model name (ASCII)", "*device_model_name_macintosh": "Device model name (Macintosh)", "*device_model_name_unicode": "Device model name (Unicode)", "*device_to_pcs_intent_0": "Device to PCS: Intent 0", "*device_to_pcs_intent_1": "Device to PCS: Intent 1", "*device_to_pcs_intent_2": "Device to PCS: Intent 2", "*devicelink_profile": "DeviceLink profile", "*dialog.argyll.notfound.choice": "Argyll CMS, the color engine that is needed to run DisplayCAL, doesn't seem to be installed on this computer. Dow you want to automatically download it or browse for it manually?", "*dialog.cal_info": "The calibration file “%s” will be used. Do you want to continue?", "*dialog.confirm_cancel": "Do you really want to cancel?", "dialog.confirm_delete": "Realmente desea borrar el(los) archivo(s) seleccionado(s)?", "dialog.confirm_overwrite": "El archivo “%s” ya existe. ¿Desea sobreescribirlo?", "dialog.current_cal_warning": "Las curvas de calibracion actual seran usadas. ¿Desea continuar?", "dialog.do_not_show_again": "No mostrar este mensaje de nuevo", "dialog.enter_password": "Por favor introduzca su contraseña.", "dialog.install_profile": "Desea instalar el perfil “%s” y hacerlo predeterminado para la pantalla “%s”?", "*dialog.linear_cal_info": "Linear calibration curves will be used. Do you want to continue?", "dialog.load_cal": "Cargar configuración", "*dialog.select_argyll_version": "Version %s of Argyll CMS was found. The currently selected version is %s. Do you want to use the newer version?", "dialog.set_argyll_bin": "Por favor localizar el directorio donde residen los ejecutables de Argyll.", "dialog.set_profile_save_path": "Crear directorio de perfil “%s” aqui:", "dialog.set_testchart": "Escoja el archivo de carta de ajustes", "dialog.ti3_no_cal_info": "Los datos de medicion no contienen curvas de calibracion. ¿Realmente desea continuar?", "*digital_camera": "Digital camera", "*direction.backward": "PCS → B2A → device", "*direction.backward.inverted": "PCS ← B2A ← device", "*direction.forward": "Device → A2B → PCS", "*direction.forward.inverted": "Device ← A2B ← PCS", "*disconnected.from": "Disconnected from %s:%s", "display": "Pantalla", "*display-instrument": "Display & instrument", "display.connection.type": "Conexion", "display.manufacturer": "Fabricante de pantalla", "*display.output": "Output #", "display.primary": "(Primaria)", "display.properties": "Propiedades de pantalla", "*display.reset.info": "Please reset the display device to factory defaults, then adjust its brightness to a comfortable level.", "display.settings": "ajustes de pantalla", "display.tech": "tecnologia de pantalla", "display_detected": "Se ha detectado un cambio en la ajustes de la pantalla.", "*display_device_profile": "Display device profile", "display_lut.link": "Enlace/desenlace acceso a pantalla y calibración", "*display_profile.not_detected": "No current profile detected for display “%s”", "*display_profile.save_as": "The current profile for display “%s” only exists in memory. Please save it to a file first.", "display_short": "Pantalla (abreviado)", "displayport": "DisplayPort", "*dlp_screen": "DLP Screen", "*donation_header": "Your support is appreciated!", "*donation_message": "If you would like to support the development of, technical assistance with, and continued availability of DisplayCAL and Argyll CMS, please consider a financial contribution. As DisplayCAL wouldn't be useful without Argyll CMS, all contributions received for DisplayCAL will be split between both projects.\nFor light personal non-commercial use, a one-time contribution may be appropriate. If you're using DisplayCAL professionally, an annual or monthly contribution would make a great deal of difference in ensuring that both projects continue to be available.\n\nThanks to all contributors!", "*download": "Download", "*download_fail_empty_response": "Download failed: %s returned an empty document.", "*download_fail_wrong_size": "Download failed: The file does not have the expected size of %s bytes (received %s bytes).", "*downloading": "Downloading", "drift_compensation.blacklevel": "Compensacion de la desviacion del nivel del negro", "drift_compensation.blacklevel.info": "La compensacion de la desviacion del nivel del negro trata de contar desviaciones de la medicion por desviacion de la calibracion del negro marcadas por las advertencias del instrumento de medicion. Para este proposito, un parche de negro es medido periodicamente, lo que incrementa el tiempo total necesario para las mediciones. Muchos colorimetros tiene incorporada compensacion de temepratura, en cuyo caso la compensacion de la desviacion del negro no es necesaria, pero la mayor parte de los espectrofotometros no tiene compensacion de temperatura.", "drift_compensation.whitelevel": "Desviacion de la compensacion del nivel de blanco", "drift_compensation.whitelevel.info": "La desviacion de la compensacion del nivel de blanco trata de contar desviaciones de la medicion causadas por cambios de luminancia marcadas por las advertencias de la pantalla. Para este proposito, un parche de blanco es medido periodicamente, lo que incrementa el tiempo total necesario para las mediciones.", "*dry_run": "Dry run", "*dry_run.end": "Dry run ended.", "*dry_run.info": "Dry run. Check the log to see the command line.", "dvi": "DVI", "*dye_sublimation_printer": "Dye sublimation printer", "*edid.crc32": "EDID CRC32 checksum", "*edid.serial": "EDID serial", "elapsed_time": "Tiempo transcurrido", "*electrophotographic_printer": "Electrophotographic printer", "*electrostatic_printer": "Electrostatic printer", "enable_argyll_debug": "Activar salida de errores Argyll CMS", "enable_spyder2": "Activar colorimetro Spyder 2 ...", "enable_spyder2_failure": "Spyder 2 no puede ser activado.", "enable_spyder2_success": "Spyder 2 activado correctamente.", "*entries": "Entries", "enumerate_ports.auto": "Detectar automaticamente instrumentos", "enumerating_displays_and_comports": "Enumeranado pantallas y puertos de comunicación...", "*environment": "Environment", "error": "Error", "error.access_denied.write": "No tiene acceso de escritura a %s", "error.already_exists": "El nombre “%s” no pude ser usado, porque otro objeto del mismo nombre todavia existe. Por favor escoja otro nombre u otro directotio.", "error.autostart_creation": "La creación de la entrada de autoarranque para %s para cargar las curvas de calibración en la entrada ha fallado.", "error.autostart_remove_old": "La entrada de autoarranque antigua que carga las curvas de calibracion al inicio del sistema no puede ser eliminada: %s", "error.autostart_system": "La entrada de autoarranque del sistema que carga las curvas de calibracion al inicio no puede ser creada, porque el directorio de autoarranque del sistema no se puede determinar.", "error.autostart_user": "La entrada de autoarrqnue de usuario que carga las curvas de clibracion al inicio no puede ser creada, porque el directorio de autoarranque del usuario no se puede determinar.", "error.cal_extraction": "La calibracion no puede ser extraida de “%s”.", "error.calibration.file_missing": "El archivo de calibración “%s” no se encuentra.", "error.calibration.file_not_created": "El archivo de calibración no ha sido creado.", "error.colorconfig_remove_old": "El archivo antiguo de ajustes asignado a perfiles de pantallas no puede ser eliminado: %s", "error.copy_failed": "El archivo “%s” no se puede copiar en “%s”.", "error.deletion": "Ocurrio un error mientras se movian archivos a %s. Algunos archivos no se han eliminado.", "error.dir_creation": "El directorio “%s” no puede ser creado. Quizás haya restricciones de acceso. Por favor permita el acceso de escritura o escoja otro directorio.", "error.dir_notdir": "El directorio “%s” no puede ser creado, porque otro objeto del mismo nombre existe. Por favor escoja otro directorio.", "error.file.create": "El archivo “%s” no se puede crear.", "error.file.open": "El archivo “%s” no se puede abrir.", "error.file_type_unsupported": "Tipo de archivo no soportado.", "error.generic": "Un error de sistema ha ocurrido.\n\nCodigo de error: %s\nMensaje de error: %s", "error.measurement.file_invalid": "El archivo de medicion „%s“ no es valido.", "error.measurement.file_missing": "El archivo de medición “%s” no se encuentra.", "error.measurement.file_not_created": "No se ha creado archivo de medición.", "error.measurement.missing_spectral": "El archivo de medicion no contiene valores espectrales.", "error.measurement.one_colorimeter": "Se necesita exactamente una medicion de colorimetro.", "error.measurement.one_reference": "Se necesita exactamente una medicion de referencia.", "error.no_displays_detected": "Ninguna pantalla ha sido detectada.", "*error.no_files_extracted_from_archive": "No files have been extracted from “%s”.", "*error.not_a_session_archive": "The archive “%s” doesn't seem to be a session archive.", "error.profile.file_missing": "El perfil “%s” no se encuentra.", "error.profile.file_not_created": "Ningun perfil ha sido creado.", "error.source_dest_same": "El archivo de origen y destino es el mismo.", "error.testchart.creation_failed": "El archivo de carta de ajustes “%s” no puede ser creado. Quizas haya restricciones de acceso, o el archivo de origen no existe.", "error.testchart.invalid": "El archivo de carta de ajustes “%s” no es valido.", "error.testchart.missing": "El archivo de carta de ajustes “%s” no se encuentra.", "error.testchart.missing_fields": "El archivo de carta de ajustes „%s“ no contiene los campos requeridos: %s", "error.testchart.read": "El archivo de carta de ajustes “%s” no se puede leer.", "error.tmp_creation": "No se puede crear directorio de trabajo temporal.", "error.trashcan_unavailable": "El %s no esta disponible. No se eliminaron archivos.", "*errors.none_found": "No errors found.", "*estimated_measurement_time": "Estimated measurement time approximately %s hour(s) %s minutes", "export": "Exportar...", "extra_args": "Establecer argumentos adicionales de línea de comandos...", "*factory_default": "Factory Default", "failure": "...fallado!", "*file.invalid": "File invalid.", "file.missing": "El archivo no existe “%s” no existe.", "file.notfile": "“%s” no es un archivo.", "file.select": "Seleccionar archivo", "*filename.upload": "Upload filename", "*filetype.7z": "7-Zip files", "filetype.any": "Cualquier tipo de archivo", "filetype.cal": "Archivos de calibracion (*.cal)", "filetype.cal_icc": "Archivos de calibracion y perfiles (*.cal;*.icc;*.icm)", "filetype.ccmx": "Matrices de correccion/Ejemplos de calibration espectral (*.ccmx;*.ccss)", "filetype.html": "Archivos HTML (*.html;*.htm)", "filetype.icc": "Archivos de perfil (*.icc;*.icm)", "filetype.icc_mpp": "Archivos de perfil (*.icc;*.icm;*.mpp)", "filetype.icc_ti1_ti3": "Archivos carta de pruebas (*.icc;*.icm;*.ti1;*.ti3)", "filetype.icc_ti3": "Archivos de medicion (*.icc;*.icm;*.ti3)", "filetype.log": "Archivos Log (*.log)", "filetype.png": "Portable Network Graphics (*.png)", "*filetype.tgz": "Compressed TAR archive", "filetype.ti1": "Archivos carta de ajustes (*.ti1)", "filetype.ti1_ti3_txt": "Archivos de carta de ajustes (*.ti1), Archivos de medicion (*.ti3;*.txt)", "filetype.ti3": "Archivos de medicion (*.icc;*.icm;*.ti3)", "filetype.tif": "Tagged Image File (*.tif)", "filetype.txt": "Correcciones periferico.txt", "*filetype.vrml": "VRML files (*.wrl)", "*filetype.x3d": "X3D files (*.x3d)", "*filetype.zip": "ZIP files", "*film_scanner": "Film scanner", "*film_writer": "Film writer", "*finish": "Finish", "*flare": "Flare", "*flexography": "Flexography", "*forced": "forced", "*format.select": "Please select the desired format.", "gamap.default_intent": "Intento de renderizado por defecto para el perfil de la pantalla", "gamap.intents.a": "Absoluto colorimetrico", "gamap.intents.aa": "Apariencia absoluto", "gamap.intents.aw": "Colorimetrico absoluto con escalado de punto blanco", "gamap.intents.la": "Apariencia de luminancia ajustada", "*gamap.intents.lp": "Luminance preserving perceptual", "gamap.intents.ms": "Preservar saturacion", "gamap.intents.p": "Perceptual", "gamap.intents.pa": "Apariencia perceptual", "gamap.intents.r": "Relativo colorimetrico", "gamap.intents.s": "Saturacion", "gamap.out_viewcond": "Condiciones de visualizacion de salida", "gamap.perceptual": "Aplicar mapeado de gama a la tabla perceptual", "gamap.profile": "Perfil de origen", "gamap.saturation": "Aplicar mapeado de gama a la tabla saturacion", "gamap.src_viewcond": "Condiciones de visualizacion de entrada", "gamap.viewconds.cx": "Cortar hoja de transparencias en una caja de luz", "gamap.viewconds.jd": "Proyector en entorno oscuro", "gamap.viewconds.jm": "Proyector en entorno tenue", "gamap.viewconds.mb": "Monitor en entorno de trabajo claro", "gamap.viewconds.md": "Monitor en entorno de trabajo oscuro", "gamap.viewconds.mt": "Monitor en entorno de trabajo tipico", "gamap.viewconds.ob": "Escena original - Exteriores claro", "*gamap.viewconds.pc": "Critical print evaluation environment (ISO-3664 P1)", "gamap.viewconds.pcd": "Photo CD - Escena original exteriores", "gamap.viewconds.pe": "Evaluacion entorno de impresion (CIE 116-1995)", "gamap.viewconds.pp": "Impresion reflexiva practica (ISO-3664 P2)", "*gamap.viewconds.tv": "Television/film studio", "gamapframe.title": "Opciones de mapeado de gama avanzadas", "gamut": "Gama", "gamut.coverage": "Cobertura de la gama", "gamut.view.create": "Generanado vistas de gama...", "gamut.volume": "Volumen de gama", "*gamut_mapping.ciecam02": "CIECAM02 gamut mapping", "*gamut_mapping.mode": "Gamut mapping mode", "*gamut_mapping.mode.b2a": "PCS-to-device", "*gamut_mapping.mode.inverse_a2b": "Inverse device-to-PCS", "gamut_plot.tooltip": "Pulsar y arrastrar el raton dentro de la zona para mover el punto de vision, o hacer zoom con la rueda del raton y +/- teclas. Doble pulsacion reinicia el punto de vision.", "*generic_name_value_data": "Generic name-value data", "*geometry": "Geometry", "glossy": "Brillante", "go_to_website": "ir a la pagina web", "*gravure": "Gravure", "*gray_tone_response_curve": "Gray tone response curve", "grayscale": "escala de gris", "green": "Verde", "*green_gamma": "Green gamma", "*green_lab": "Green Lab", "*green_matrix_column": "Green matrix column", "*green_maximum": "Green maximum", "*green_minimum": "Green minimum", "*green_tone_response_curve": "Green tone response curve", "*green_xyz": "Green XYZ", "*grid_steps": "Grid Steps", "hdmi": "HDMI", "*header": "Display calibration and characterization powered by Argyll CMS", "help_support": "Ayuda y soporte...", "*host.invalid.lookup_failed": "Invalid host (address lookup failed)", "hue": "Color", "*icc_absolute_colorimetric": "ICC-absolute colorimetric", "*icc_version": "ICC version", "*if_available": "if available", "*illuminant": "Illuminant", "*illuminant_relative_cct": "Illuminant-relative CCT", "*illuminant_relative_lab": "Illuminant-relative Lab", "*illuminant_relative_xyz": "Illuminant-relative XYZ", "*illuminant_xyz": "Illuminant XYZ", "illumination": "Iluminacion", "in": "Entrada", "*info.3dlut_settings": "A 3D LUT (LUT = Look Up Table) or ICC device link profile can be used by 3D LUT or ICC device link capable applications for full display color correction.\n\nCreating several (additional) 3D LUTs from an existing profile\nWith the desired profile selected under “Settings”, uncheck the “Create 3D LUT after profiling” checkbox.\n\nChoosing the right source colorspace and tone response curve\nFor 3D LUTs and ICC device link profiles, the source colorspace and tone response curve need to be set in advance and become a fixed part of the overall color transformation (unlike ICC device profiles which are linked dynamically on-the-fly). As an example, HD video material is usually mastered according to the Rec. 709 standard with either a pure power gamma of around 2.2-2.4 (relative with black output offset of 100%) or Rec. 1886 tone response curve (absolute with black output offset 0%). A split between Rec. 1886-like and pure power is also possible by setting black output offset to a value between 0% and 100%.\n\n“Absolute” vs. “relative” gamma\nTo accomodate a non-zero black level of a real display, the tone response curve needs to be offset and scaled accordingly.\n“Absolute” gamma results in an actual output at 50% input which doesn't match that of an idealized power curve (unless the black level is zero).\n“Relative” gamma results in an actual output at 50% input which matches that of an idealized power curve.\n\nRendering intent\nIf you have calibrated to a different whitepoint than the one mandated by the source colorspace, and want to use that for the 3D LUT instead, select “Relative colorimetric”. Otherwise, select “Absolute colorimetric with white point scaling” (white point scaling will prevent clipping in absolute colorimetric mode that could happen if the source colorspace whitepoint is outside of the display gamut). You also have the option to use a non-colorimetric rendering intent that may compress or expand the source colorspace to fit within the display gamut (not recommended when colorimetric accuracy is required).", "*info.calibration_settings": "Calibration is done by interactively adjusting the display to meet the chosen whitepoint and/or luminance as well as optionally creating 1D LUT calibration curves (LUT = Look Up Table) to meet the chosen tone response curve and ensure gray balance. Note that if during calibration you only want to adjust the display and skip the generation of 1D LUT curves, you need to set the tone response curve to “As measured”. 1D LUT calibration can not be used for full display color correction, you need to create a ICC device profile or 3D LUT and use them with applications that support them for that purpose. 1D LUT calibration complements profiling and 3D LUT calibration though.", "*info.display_instrument": "If your display is a OLED, Plasma or other technology with variable light output depending on picture content, enable white level drift compensation.\n\nIf your instrument is a spectrometer and you use it in contact mode on a display with stable black level, you may want to enable instrument black level drift compensation.\n\nIf your instrument is a colorimeter, you should use a correction suitable for your display or display technology type. Note that some instruments (ColorHug, ColorHug2, K-10, Spyder4/5) may have a correction built into some of their measurement modes.", "*info.display_instrument.warmup": "You should let the display warm up for at least 30 minutes before commencing measurements. If you use your instrument in contact mode, it is a good idea to leave it on the display during that time as well.", "*info.mr_settings": "You can verify the accuracy of an ICC profile or 3D LUT via a measurement report that contains detailed statistics about the color errors of the measured patches.\n\nWhen verifying a 3D LUT, make sure to use the same settings as the 3D LUT was created with.", "*info.profile_settings": "Profiling is the process of characterizing the display and recording its response in a ICC device profile. The ICC device profile can be used by applications that support ICC color management for full display color correction, and/or it can be used to create a 3D LUT (LUT = Look Up Table) which serves the same purpose for applications that support 3D LUTs.\n\nThe amount of patches measured influences the attainable accuracy of the resulting profile. For a reasonable quality 3x3 matrix and curves based profile, a few dozen patches can be enough if the display has good additive color mixing properties and linearity. Some professional displays fall into that category. If the highest possible accuracy is desired, a LUT-based profile from around several hundred up to several thousand patches is recommended. The “Auto-optimized” testchart setting automatically takes into account the non-linearities and actual response of the display, and should be used for best quality results. With this, you can adjust a slider to choose a compromise between resulting profile accuracy and measurement as well as computation time.", "infoframe.default_text": "", "infoframe.title": "Info", "infoframe.toggle": "Mostrar/ocultar ventana de informacion", "initial": "Inicial", "initializing_gui": "Inicializando GUI...", "*ink_jet_printer": "Ink jet printer", "*input_device_profile": "Input device profile", "*input_table": "Input Table", "install_display_profile": "Instalar perfil del monitor...", "*install_local_system": "Install system-wide", "*install_user": "Install for current user only", "instrument": "Instrumento/Puerto", "instrument.calibrate": "Poner el instrumento en una superficie oscura, mate o en su placa y presionar OK para calibrar el instrumento.", "instrument.calibrate.colormunki": "Poner el sensor ColorMunki en posicion de calibracion y presionar OK para calibrar el instrumento.", "*instrument.calibrate.reflective": "Place the instrument onto its reflective white reference serial no. %s and press OK to calibrate the instrument.", "instrument.calibrating": "Calibrando instrumento...", "*instrument.connect": "Please connect your measurement instrument now.", "instrument.initializing": "Configurando instrumento, por favor espere...", "instrument.measure_ambient": "Si su instrumento requiere de una tapa especial para medir la luz ambiente, por favor coloquela. Para medir la luz ambiente, coloque el instrumento hacia arriba, al lado de la pantalla. O si desea medir una caja de luz, coloque una carta de gris sin metamerismo dentro de la caja de luz y ponga el instrumento hacia ella. Instrucciones adicionales de como medir la luz ambiente pueden estar disponibles en la documentacion del instrumento. Presione OK para comenzar la medicion.", "instrument.place_on_screen": "Coloque el instrumwento en la ventana de test. Pulse OK. Presione ESC, Q o CTRL^C para abortar, cualquier otra tecla para iniciar la medición.", "*instrument.place_on_screen.madvr": "(%i) Please place your %s on the test area", "*instrument.reposition_sensor": "The measurement failed because the instrument sensor is in the wrong position. Please correct the sensor position, then click OK to continue.", "internal": "Interno", "*invert_selection": "Invert selection", "*is_embedded": "Is embedded", "*is_illuminant": "Is illuminant", "*is_linear": "Is linear", "laptop.icc": "Portatil (Gamma 2.2)", "*libXss.so": "X11 screen saver extension", "*library.not_found.warning": "The library “%s” (%s) was not found. Please make sure it is installed before proceeding.", "license": "Licencia", "license_info": "Licenciado bajo la GPL", "linear": "lineal", "locale.set": "Setting locale: %s", "log.autoshow": "Mostar ventana de log automaticamente", "*luminance": "Luminance", "lut_access": "Acceso a calibración", "*madhcnet.outdated": "The installed version of %s found at %s is outdated. Please update to the latest madVR version (at least %i.%i.%i.%i).", "*madtpg.launch.failure": "madTPG was not found or could not be launched.", "*madvr.not_found": "madVR DirectShow filter was not found in the registry. Please make sure it is installed.", "*madvr.outdated": "The used version of madVR is outdated. Please update to the latest version (at least %i.%i.%i.%i).", "magenta": "Magenta", "*make_and_model": "Make and model", "*manufacturer": "Manufacturer", "matrix": "Matriz", "matte": "Mate", "max": "Max", "maximal": "Maximo", "measure": "Medicion", "measure.darken_background": "Color de fondo negro", "*measure.darken_background.warning": "Attention: If „black background“ is chosen, it will cover the whole screen and you will not be able to see the display adjustment window! If you have a multi-screen setup, move the display adjustment window to another screen before starting the measurement, or use the keyboard (to abort the measurement, press Q. If the measurement is already running, wait briefly, then press Q again).", "*measure.override_display_settle_time_mult": "Override display settle time multiplier", "*measure.override_min_display_update_delay_ms": "Override minimum display update delay", "measure.testchart": "Carta de pruebas de ajustes", "measureframe.center": "Centro", "measureframe.info": "Mover la ventana de medicion a la posición de pantalla deseada y redimensionarla si es necesario. Aproximadamente todo el area de la ventana se utilizara para mostrar los parches de medicion, el circulo es como una guia para ayudarle a situar su instrumento de medicion.\nSitue el instrumento de medicion en la pantalla y pulse en „Comenzar medicion“. Para cancelar y volver a la pantalla principal, cierre la ventana de medicion.", "measureframe.infobutton": "Info", "measureframe.measurebutton": "Comenzar medicion", "measureframe.title": "Area de medicion", "measureframe.zoomin": "Aumentar", "measureframe.zoommax": "Maximizar/Restaurar", "measureframe.zoomnormal": "Tamaño normal", "measureframe.zoomout": "Encoger", "measurement.play_sound": "Aviso acustico en la medicion continua", "measurement.set_save_path": "Guardar el archivo de medicion en la siguiente carpeta:", "*measurement.untethered": "Untethered measurement", "*measurement_file.check_sanity": "Check measurement file...", "*measurement_file.check_sanity.auto": "Automatically check measurements", "*measurement_file.check_sanity.auto.warning": "Please note automatic checking of measurements is an experimental feature. Use at own risk.", "measurement_file.choose": "Por favor seleccione un archivo de medicion", "measurement_file.choose.colorimeter": "Por favor seleccione un archivo de medicion de colorimetro", "measurement_file.choose.reference": "Por favor seleccione un archivo de medicion de referencia", "measurement_mode": "Tipo", "measurement_mode.adaptive": "Adaptivo", "*measurement_mode.dlp": "DLP", "measurement_mode.factory": "Calibration de fabrica", "*measurement_mode.generic": "Generic", "measurement_mode.highres": "AltaRes", "measurement_mode.lcd": "LCD (genérico)", "measurement_mode.lcd.ccfl": "LCD (CCFL)", "measurement_mode.lcd.ccfl.2": "LCD (CCFL Type 2)", "*measurement_mode.lcd.oled": "LCD (OLED)", "measurement_mode.lcd.white_led": "LCD (LED Blanco)", "measurement_mode.lcd.wide_gamut.ccfl": "LCD Gama Amplia(CCFL)", "measurement_mode.lcd.wide_gamut.rgb_led": "LCD Gama Amplia (RGB LED)", "measurement_mode.raw": "Raw", "measurement_mode.refresh": "Refresco (generico)", "*measurement_report": "Measurement report...", "*measurement_report.update": "Update measurement or uniformity report...", "measurement_report_choose_chart": "Por favor seleccione la carta de ajustes a medir.", "measurement_report_choose_chart_or_reference": "Por favor seleccione una carta de ajustes o referencia.", "measurement_report_choose_profile": "Por favor seleccione el perfil a validar.", "*measurement_type": "Measurement type", "measurements.complete": "Mediciones completadas! ¿Desea abrir la carpeta que contiene los archivos de medicion?", "measuring.characterization": "Midiendo muestras de color para caracterizacion...", "*media_black_point": "Media black point", "*media_relative_colorimetric": "Media-relative colorimetric", "*media_white_point": "Media white point", "menu.about": "Acerca...", "menu.file": "Archivo", "menu.help": "?", "menu.language": "Idioma", "menu.options": "Opciones", "menu.tools": "Herramientas", "menuitem.quit": "Salir", "menuitem.set_argyll_bin": "Localizar ejecutables de Argyll CMS...", "*metadata": "Metadata", "min": "Min", "minimal": "Minimo", "*model": "Model", "*named_color_profile": "Named color profile", "*named_colors": "Named colors", "native": "Nativo", "*negative": "Negative", "no": "No", "no_settings": "El archivo no contiene ajustes.", "*none": "None", "*not_applicable": "Not applicable", "*not_connected": "Not connected", "*not_found": "“%s” was not found.", "*not_now": "Not now", "*number_of_entries": "Number of entries", "*number_of_entries_per_channel": "Number of entries per channel", "*observer": "Observer", "*observer.1931_2": "CIE 1931 2°", "*observer.1955_2": "Stiles & Birch 1955 2°", "*observer.1964_10": "CIE 1964 10°", "*observer.1964_10c": "CIE 1964 10° / 1931 2° hybrid", "*observer.1978_2": "Judd & Voss 1978 2°", "*observer.shaw": "Shaw & Fairchild 1997 2°", "*oem.import.auto": "If your colorimeter came with a software CD for Windows, please insert it now (abort any possibly automatic software installation).\n\nIf you don't have a CD and the required files cannot be found otherwise, they will be downloaded from the Web.", "*oem.import.auto.download_selection": "A preselection was made based on the detected instrument(s). Please select the file(s) to download (total download size can add up to several hundred MB depending on the selection).", "*oem.import.auto_windows": "If the vendor software for your colorimeter is installed, the required files can be found automatically in most cases.", "office_web.icc": "Oficina y Web (D65, Gamma 2.2)", "offset": "Offset", "*offset_lithography": "Offset lithography", "ok": "OK", "or": "o", "osd": "OSD", "other": "Otro", "out": "Salida", "*out_of_gamut_tag": "Out of gamut tag", "output.profile": "Perfil de destino", "*output_device_profile": "Output device profile", "*output_offset": "Output offset", "*output_table": "Output Table", "overwrite": "Sobreescribir", "panel.surface": "Superficie del panel", "panel.type": "Tipo de panel", "*passive_matrix_display": "Passive matrix display", "*patch.layout.select": "Please select a patch layout:", "patches": "Parches", "*patterngenerator.prisma.specify_host": "Please specify the hostname of your Prisma Video Processor, e.g. prisma-0123 (Windows) or prisma-0123.local (Linux/Mac OS X). You can find the hostname on a label at the underside of the Prisma, unless it was changed via the Prisma's administrative web interface. Alternatively, enter the IP address (if known), e.g. 192.168.1.234", "*patterngenerator.sync_lost": "Lost sync with the pattern generator.", "pause": "Pausa", "*pcs_illuminant_xyz": "PCS illuminant XYZ", "*pcs_relative_cct": "PCS-relative CCT", "*pcs_relative_lab": "PCS-relative Lab", "*pcs_relative_xyz": "PCS-relative XYZ", "*pcs_to_device_intent_0": "PCS to device: Intent 0", "*pcs_to_device_intent_1": "PCS to device: Intent 1", "*pcs_to_device_intent_2": "PCS to device: Intent 2", "*perceptual": "Perceptual", "photo.icc": "Foto (D50, Gamma 2.2)", "*photo_imagesetter": "Photo imagesetter", "*photographic_paper_printer": "Photographic paper printer", "*platform": "Platform", "please_wait": "Por favor esperar...", "*port.invalid": "Invalid port: %s", "*positive": "Positive", "*preferred_cmm": "Preferred CMM", "prepress.icc": "Preprensa (D50, 130 cd/m², L*)", "preset": "Preestablecido", "preview": "Previo", "profile": "Perfil", "profile.advanced_gamap": "Avanzado...", "*profile.b2a.hires": "Enhance effective resolution of colorimetric PCS-to-device table", "*profile.b2a.lowres.warning": "The profile is seemingly missing high-quality PCS-to-device tables, which are essential for proper operation. Do you want to generate high-quality tables now? This will take a few minutes.", "*profile.b2a.smooth": "Smoothing", "*profile.choose": "Please choose a profile.", "*profile.confirm_regeneration": "Do you want to regenerate the profile?", "profile.created": "El perfil ha sido creado correctamente.", "profile.current": "Perfil actual", "profile.do_not_install": "No instalar el perfil", "*profile.iccv4.unsupported": "Version 4 ICC profiles are not supported.", "*profile.import.success": "The profile has been imported. You may need to manually assign and activate it under “Color” system settings.", "profile.info": "Information de perfil", "profile.info.show": "Mostrar information del perfil", "profile.install": "Instalar el perfil", "profile.install.error": "El perfil no puede ser instalado/activado.", "profile.install.osx_manual_select": "El perfil ha sido instalado. Por favor activelo en el panel de preferencias del sistema “Pantallas”.", "profile.install.success": "El perfil ha sido instalado y activado.", "*profile.install.virtual.unsupported": "Profiles cannot be installed for virtual display devices.", "*profile.install.warning": "The profile has been installed, but there may be problems.", "profile.install_local_system": "Instalar perfil en todo el sistema", "profile.install_network": "Instalar perfil en toda la red", "profile.install_user": "Instalar perfil solo para el usuario actual", "profile.invalid": "Perfil no valido.", "profile.load_error": "El perfil de pantalla no puede ser cargado.", "profile.load_on_login": "Cargar la calibracion en la entrada", "profile.load_on_login.handled_by_os": "Dejar al sistema operativo el manejo de la carga de la calibracion (baja precisión y fiabilidad)", "profile.name": "Nombre del perfil", "profile.name.create": "Generar nombre del perfil", "profile.name.placeholders": "Debe de utilizar los siguientes argumentos en el nombre de perfil:\n\n%a Nombre del dia de la semana abreviado\n%A Nombre del dia de la semana completo\n%b Nombre del mes abreviado\n%B Nombre del mes completo\n%d Dia del mes\n%H Hora (reloj 24-horas)\n%I Hora (reloj12-horas)\n%j Dia del año\n%m Mes\n%M Minuto\n%p AM/PM\n%S Segundos\n%U Semana (Domingo como primer dia de la semana)\n%w Dia de la semana (domingo es 0)\n%W Semana (Lunes como primer dia de la semana)\n%y Año sin el siglo\n%Y Año con el siglo", "profile.no_embedded_ti3": "El perfil no contiene datos de medicion compatibles con Argyll.", "profile.no_vcgt": "El perfil no contiene curvas de calibracion.", "*profile.only_named_color": "Only profiles of type “Named Color” can be used.", "profile.quality": "Calidad del perfil", "*profile.quality.b2a.low": "Low quality PCS-to-device tables", "*profile.quality.b2a.low.info": "Choose this option if the profile is only going to be used with inverse device-to-PCS gamut mapping to create a DeviceLink or 3D LUT", "*profile.required_tags_missing": "The profile is missing required tags: %s", "*profile.self_check": "Profile self check ΔE*76", "*profile.self_check.avg": "average", "*profile.self_check.max": "maximum", "*profile.self_check.rms": "RMS", "profile.set_save_path": "Seleccionar ruta de guardado...", "profile.settings": "Opciones de perfilado", "profile.share": "Subido perfil...", "profile.share.avg_dE_too_high": "El perfil muestra un valor delta E demasiado alto (actual = %s, umbral = %s).", "*profile.share.b2a_resolution_too_low": "The resolution of the profile's PCS to device tables is too low.", "profile.share.enter_info": "Puede compartir su perfil con otros usuarios via el servicio OpenSUSE “ICC Profile Taxi”.\n\nPor favor proporcione una descripcion significativa e introduzca las propiedades de la pantalla mas abajo. Leer ajustes de la pantalla del menu OSD de la misma y aplicar solo las ajustes aplicables a la pantalla que se alteraron de las que trae por defecto.\nEjemplo: Para la mayor parte de las pantallas, estos son los nombres de los preajustes escogidos, brillo, contraste, color temperatura y/o ganancia del punto blanco RGB, asi como la gamma. En portatiles and ultraligeros, habitualmente solo el brillo. Si ha cambiado ajustes adicionales mientras calibraba su pantalla, introduzcalas si es posible.", "profile.share.meta_missing": "El perfil no contiene la meta informacion necesaria.", "profile.share.success": "Perfil subido satisfactoriamente.", "profile.testchart_recommendation": "Para un perfil de mayor calidad, es recomendable una carta de ajustes con mas parches, pero llevará mas tiempo medirla. ¿Desea usar la carta de ajustes recomendada?", "profile.type": "Tipo de perfil", "profile.type.gamma_matrix": "Gamma + matriz", "profile.type.lut.lab": "L*a*b* LUT", "profile.type.lut.xyz": "XYZ LUT", "profile.type.lut_matrix.xyz": "XYZ LUT + matriz", "profile.type.lut_rg_swapped_matrix.xyz": "XYZ LUT + matriz swapped", "profile.type.shaper_matrix": "Curvas + matriz", "profile.type.single_gamma_matrix": "Gamma simple + matriz", "profile.type.single_shaper_matrix": "Curva simple + matriz", "profile.unsupported": "Tipo de perfil no soportado (%s) y/o espacio de color (%s).", "profile.update": "Actualizar perfil", "*profile_class": "Profile class", "*profile_connection_space_pcs": "Profile connection space (PCS)", "*profile_loader": "Profile loader", "*profile_loader.exit_warning": "Do you really want to quit the profile loader? Calibration will no longer be automatically reloaded if you change the display configuration!", "*profile_loader.fix_profile_associations": "Automatically fix profile associations", "*profile_loader.fix_profile_associations_warning": "As long as the profile loader is running, it can take care of profile associations when you change the display configuration.\n\nBefore you proceed, please make sure the profile associations shown above are correct. If they aren't, follow these steps:\n\n1. Open Windows display settings.\n2. Activate all connected displays (extended desktop).\n3. Open Windows color management settings from the Windows control panel.\n4. Make sure each display device has the correct profile assigned. Then close color management settings.\n5. In Windows display settings, revert to the previous display configuration and close display settings.\n6. Now you can enable “Automatically fix profile associations”.", "*profile_loader.info": "Calibration state was (re)applied %i time(s) so far today.\nRight-click icon for menu.", "*profiling": "Profiling", "profiling.complete": "Perfilado completado!", "profiling.incomplete": "El perfilado todavia no ha terminado.", "*projection_television": "Projection television", "projector": "Proyector", "projector_mode_unavailable": "El modo proyector esta solo disponible con Argyll CMS 1.1.0 Beta o mas actual.", "quality.ultra.warning": "La calidad Ultra no deberia ser usada nunca, excepto para probar que no deberia ser nunca usada (tiempo muy largo de procesado!). Quizas deberia escoger calidad media o alta.", "readme": "Leame", "ready": "Listo.", "red": "Rojo", "*red_gamma": "Red gamma", "*red_lab": "Red Lab", "*red_matrix_column": "Red matrix column", "*red_maximum": "Red maximum", "*red_minimum": "Red minimum", "*red_tone_response_curve": "Red tone response curve", "*red_xyz": "Red XYZ", "reference": "Referencia", "*reflective": "Reflective", "*reflective_scanner": "Reflective scanner", "*remaining_time": "Remaining time (ca.)", "rendering_intent": "Intento de renderizado", "report.calibrated": "Informe de pantalla calibrada", "report.uncalibrated": "Informe de pantalla no calibrada", "*report.uniformity": "Measure display device uniformity...", "resources.notfound.error": "Error fatal: no se encuentra el archivo requerido:", "resources.notfound.warning": "Cuidado: no se encuentran algunos archivos requeridos:", "*response.invalid": "Invalid response from %s: %s", "*response.invalid.missing_key": "Invalid response from %s: Missing key “%s”: %s", "*response.invalid.value": "Invalid response from %s: Value of key “%s” does not match expected value “%s”: %s", "restore_defaults": "Restaurar valores por defecto", "rgb.trc": "Funcion de transferencia RGB", "rgb.trc.averaged": "Funcion de transferencia RGB promedio", "sRGB.icc": "sRGB", "saturation": "Saturacion", "save": "Guardar", "save_as": "Guardar como...", "*scripting-client": "DisplayCAL Scripting Client", "*scripting-client.cmdhelptext": "Press the tab key at an empty command prompt to view the possible commands in the current context, or to auto-complete already typed initial letters. Type “getcommands” for a list of supported commands and possible parameters for the connected application.", "*scripting-client.detected-hosts": "Detected scripting hosts:", "*select_all": "Select all", "setting.keep_current": "Mantener valores actuales", "settings.additional": "ajustes adicionales", "settings.basic": "ajustes basicas", "settings.new": "", "settings_loaded": "Las siguientes ajustes de calibracion han sido cargadas: %s. Otras opciones de calibracion han sido restauradas a sus valores por defecto y las opciones de perfilado no han sido cambiadas. Las curvas calibración han sido cargadas.", "settings_loaded.all": "ajustes y curvas calibración han sido cargadas.", "settings_loaded.cal": "El perfil solo contiene ajsutes de calibracion. Otras opciones no se han cambiado. No se han encontrado curvas de calibracion.", "settings_loaded.cal_and_lut": "El perfil solo contiene ajsutes de calibracion. Otras opciones no se han cambiado y las curvas de calibracion se han cargado.", "settings_loaded.cal_and_profile": "Las ajustes han sido cargadas. No se han encontrado curvas calibración.", "settings_loaded.profile": "El perfil contiene solo ajustes del perfil. Otras opciones no han sido cambiadas. No se han encontrado curvas calibración.", "settings_loaded.profile_and_lut": "El perfil contiene solo ajustes del perfil. Otras opciones no han sido cambiadas y las curvas calibración han sido cargadas.", "show_advanced_options": "Mostar opciones avanzadas", "*silkscreen": "Silkscreen", "*simulation_profile": "Simulation profile", "*size": "Size", "*softproof.icc": "Softproof (D55, 160 cd/m², L*)", "spectral": "Espectral", "startup": "Comenzando...", "*startup_sound.enable": "Enable startup sound", "success": "...hecho.", "*surround_xyz": "Surround XYZ", "*synthicc.create": "Create synthetic ICC profile...", "target": "Destino", "tc.3d": "Crear archivo 3D de diagnostico", "tc.I": "Cuerpo espacial del dipositivo centrado en rejilla cubica perceptual", "tc.Q": "Llenado de espacio perceptual quasi-random", "tc.R": "Espacio perceptual aleatorio", "tc.adaption": "Adaptacion", "tc.algo": "Distribucion", "tc.angle": "Angulo", "*tc.black": "Black patches", "*tc.dark_emphasis": "Dark region emphasis", "tc.fullspread": "Parches interactivos", "tc.gray": "Parches neutros", "tc.i": "Cuerpo espacial del dipositivo centrado en rejilla cubica", "tc.limit.sphere": "Limitar ejemplos a esfera", "tc.limit.sphere_radius": "Radio", "tc.multidim": "Multidimensional", "tc.multidim.patches": "pasos = %s parches (%s neutral)", "*tc.neutral_axis_emphasis": "Neutral axis emphasis", "tc.ofp": "Punto de ejemplo mas lejano optimizado", "tc.patch": "Parche", "tc.patches.gray": "Neutral", "tc.patches.selected": "Seleccionado", "tc.patches.total": "Parches totales", "tc.precond": "Precondicionando perfil", "*tc.precond.notset": "Please select a preconditioning profile.", "tc.preview.create": "Creando previo, por favor espere...", "tc.q": "Llenado del espacio de dispositivo quasi-random", "tc.r": "Espacio del dispositivo aleatorio", "tc.single": "Parches de un canal", "tc.single.perchannel": "Por canal", "tc.t": "Punto de ejemplo lejano incremental", "*tc.vrml.black_offset": "RGB black offset (L*)", "tc.vrml.device": "Localizacion de dispositivos", "tc.vrml.lab": "Localizaciones Lab", "*tc.vrml.save_as": "Save VRML file(s) as...", "*tc.vrml.use_D50": "Neutral RGB white", "tc.white": "Parches blancos", "*technology": "Technology", "*tempdir_should_still_contain_files": "Created files should still be in the temporary directory “%s”.", "*testchart.add_saturation_sweeps": "Add saturation sweeps", "*testchart.add_ti3_patches": "Add reference patches...", "*testchart.auto_optimize.untethered.unsupported": "The untethered virtual display does not support testchart auto-optimization.", "*testchart.change_patch_order": "Change patch order", "testchart.confirm_select": "Archivo guardado. Desea seleccionar este testchart?", "testchart.create": "Crear archivo de carta de ajustes", "testchart.discard": "Descartar", "testchart.dont_select": "No seleccionar", "testchart.edit": "Editar carta de ajustes...", "*testchart.export.repeat_patch": "Repeat each patch:", "testchart.file": "Carta de ajustes", "testchart.info": "Numero de parches en la carta de ajustes seleccionado", "testchart.invalid": "El archivo carta de ajustes no es valido!", "*testchart.optimize_for_untethered_auto_mode": "Optimize for untethered in auto mode", "*testchart.patches_amount": "Amount of patches", "testchart.read": "Leyendo carta de ajustes...", "testchart.save_or_discard": "La carta de ajustes no ha sido guardado.", "testchart.select": "Seleccionar", "*testchart.separate_fixed_points": "Please choose the patches to add in a separate step.", "testchart.set": "Seleccione archivo carta de ajustes...", "*testchart.sort_RGB_blue_to_top": "Sort RGB blue to top", "*testchart.sort_RGB_cyan_to_top": "Sort RGB cyan to top", "*testchart.sort_RGB_gray_to_top": "Sort RGB gray to top", "*testchart.sort_RGB_green_to_top": "Sort RGB green to top", "*testchart.sort_RGB_magenta_to_top": "Sort RGB magenta to top", "*testchart.sort_RGB_red_to_top": "Sort RGB red to top", "*testchart.sort_RGB_white_to_top": "Sort RGB white to top", "*testchart.sort_RGB_yellow_to_top": "Sort RGB yellow to top", "*testchart.sort_by_HSI": "Sort by HSI", "*testchart.sort_by_HSL": "Sort by HSL", "*testchart.sort_by_HSV": "Sort by HSV", "*testchart.sort_by_L": "Sort by L*", "*testchart.sort_by_RGB": "Sort by RGB", "*testchart.sort_by_RGB_sum": "Sort by sum of RGB", "*testchart_or_reference": "Testchart or reference", "*thermal_wax_printer": "Thermal wax printer", "tone_values": "Valores tonales", "*transfer_function": "Transfer function", "translations": "Traducciones", "*transparency": "Transparency", "trashcan.linux": "papelera", "trashcan.mac": "papelera", "trashcan.windows": "papelera de reciclaje", "trc": "Curva tonal", "*trc.dicom": "DICOM", "trc.gamma": "Gamma", "trc.lstar": "L*", "trc.rec1886": "Rec. 1886", "trc.rec709": "Rec. 709", "trc.should_use_viewcond_adjust": "Cuando se usan las curvas SMPTE 240M, Rec. 709 o sRGB, debe usar un ajuste en las condiciones de visualizacion para los niveles de luz ambiente tan buenos como pueda para obtener los resultados que desee. Para hacer esto, marque la casilla cerca de “Nivel de luz ambiente” e introduzca un valor en Lux. Opcionalmente puede medir la luz ambiente cuando realiza una calibracion, si lo soporta su instrumento.", "*trc.smpte2084": "SMPTE 2084", "trc.smpte240m": "SMPTE 240M", "trc.srgb": "sRGB", "trc.type.absolute": "Absoluto", "trc.type.relative": "Relativo", "turn_off": "Desactivar", "type": "Tipo", "*udev_hotplug.unavailable": "Neither udev nor hotplug detected.", "uninstall_display_profile": "Desinstalar perfil de pantalla...", "unknown": "desconocido", "*unmodified": "Unmodified", "unnamed": "Sin nombre", "update_check": "Comprobar actualizacion de la aplicacion...", "update_check.fail": "Comprobar fallo de actualizacion de la aplicacion:", "update_check.fail.version": "Version del archivo remoto desde el servidor %s no se pudo analizar.", "update_check.new_version": "Una actualizacion esta disponible: %s", "update_check.onstartup": "Comprobar actualizacion de la aplicacion al inicio", "update_check.uptodate": "%s esta actualizada.", "*update_now": "Update now", "upload": "Subir", "*use_fancy_progress": "Use fancy progress dialog", "use_separate_lut_access": "Usar acceso separado a la tabla de gamma de la tarjeta grafica ", "*use_simulation_profile_as_output": "Use simulation profile as target profile", "vcgt": "Curvas de calibracion", "*vcgt.mismatch": "The video card gamma tables for display %s do not match the desired state.", "*vcgt.unknown_format": "Unknown video card gamma table format in profile “%s”.", "*verification": "Verification", "*verification.settings": "Verification settings", "verify.ti1": "Carta de ajustes de verificacion de perfil", "verify_extended.ti1": "Carta de ajustes de verificacion de perfil extendida", "*verify_grayscale.ti1": "Graybalance verification testchart", "*verify_large.ti1": "Large verification testchart", "*verify_video.ti1": "Verification testchart (video)", "*verify_video_extended.ti1": "Extended verification testchart (video)", "*verify_video_large.ti1": "Large verification testchart (video)", "*verify_video_xl.ti1": "Extra large verification testchart (video)", "*verify_video_xxl.ti1": "XXL verification testchart (video)", "*verify_video_xxxl.ti1": "XXXL verification testchart (video)", "*verify_xl.ti1": "Extra large verification testchart", "*verify_xxl.ti1": "XXL verification testchart", "*verify_xxxl.ti1": "XXXL verification testchart", "vga": "VGA", "video.icc": "Video (D65, Rec. 1886)", "*video_Prisma.icc": "Video 3D LUT for Prisma (D65, Rec. 709 / Rec. 1886)", "*video_ReShade.icc": "Video 3D LUT for ReShade (D65, Rec. 709 / Rec. 1886)", "*video_camera": "Video camera", "*video_card_gamma_table": "Video card gamma table", "*video_eeColor.icc": "Video 3D LUT for eeColor (D65, Rec. 709 / Rec. 1886)", "*video_madVR.icc": "Video 3D LUT for madVR (D65, Rec. 709 / Rec. 1886)", "*video_monitor": "Video monitor", "*video_resolve.icc": "Video 3D LUT for Resolve (D65, Rec. 709 / Rec. 1886)", "*view.3d": "3D view", "*viewing_conditions": "Viewing conditions", "*viewing_conditions_description": "Viewing conditions description", "*vrml_to_x3d_converter": "VRML to X3D converter", "warning": "Cuidado", "warning.already_exists": "El archivo “%s” ya existe en la localizacion escogida y será sobreescrito. Desea continuar?", "warning.autostart_system": "El directorio de autoarranque del sistema no se pudo determinar.", "warning.autostart_user": "El directorio de autoarranque específico del usuario no se pudo determinar.", "warning.copy_failed_continue": "El archivo “%s” no puede ser copiado en “%s”. Continuando...", "warning.discard_changes": "¿Realmente desea descartar los cambios en la configuración actual?", "*warning.input_value_clipping": "Warning: Input values below the target blackpoint will be clipped!", "warning.no_comports_detected": "Ningun instrumento ha sido detectado.", "*warning.suspicious_delta_e": "Warning: Suspicious measurements have been found. Please note this check assumes an sRGB-like display device. If your display device differs from this assumption (e.g. if it has a very wide gamut or a tone response too far from sRGB), then errors found are probably not meaningful.\n\nOne or all of the following criteria matched:\n\n• Consecutive patches with different RGB numbers, but suspiciously low ΔE*00 of the measurements against each other.\n• RGB gray with increasing RGB numbers towards the previous patch, but declining lightness (L*).\n• RGB gray with decreasing RGB numbers towards the previous patch, but rising lightness (L*).\n• Unusually high ΔE*00 and ΔL*00 or ΔH*00 or ΔC*00 of measurements to the sRGB equivalent of the RGB numbers.\n\nThis could hint at measurement errors. Values that are considered problematic (which does not have to be true!) are highlighted in red. Check the measurements carefully and mark the ones you want to accept. You can also edit the RGB and XYZ values.", "*warning.suspicious_delta_e.info": "Explanation of the Δ columns:\n\nΔE*00 XYZ A/B: ΔE*00 of measured values towards measured values of the previous patch. If this value is missing, it wasn't a factor while checking. If it is present, then it is assumed to be too low.\n\n0.5 ΔE*00 RGB A/B: ΔE*00 of the sRGB equivalent of the RGB numbers towards the sRGB equivalent of the RGB numbers of the previous patch (with a factor of 0.5). If this value is present, it represents the comparison (minimal) value during checking for assumed too low ΔE*00 XYZ A/B. It serves as a very rough orientation.\n\nΔE*00 RGB-XYZ: ΔE*00 of measured values towards the sRGB equivalent of the RGB numbers.\nΔL*00 RGB-XYZ: ΔL*00 of measured values towards the sRGB equivalent of the RGB numbers.\nΔC*00 RGB-XYZ: ΔC*00 of measured values towards the sRGB equivalent of the RGB numbers.\nΔH*00 RGB-XYZ: ΔH*00 of measured values towards the sRGB equivalent of the RGB numbers.", "*warning.system_file": "Warning: “%s” is a system file. Do you really want to continue?", "*webserver.waiting": "Webserver waiting at", "*welcome": "Welcome!", "*welcome_back": "Welcome back!", "white": "Blanco", "whitepoint": "Punto blanco", "whitepoint.colortemp": "Temperatura", "whitepoint.colortemp.locus.blackbody": "Cuerpo negro", "whitepoint.colortemp.locus.curve": "Curva de la temperatura de color", "whitepoint.colortemp.locus.daylight": "Luz dia", "whitepoint.set": "¿También desea establecer el punto blanco con el valor medido?", "*whitepoint.simulate": "Simulate whitepoint", "*whitepoint.simulate.relative": "Relative to target profile whitepoint", "whitepoint.xy": "Coordenadas cromaticidad", "window.title": "DisplayCAL", "*windows.version.unsupported": "This version of Windows is not supported.", "*windows_only": "Windows only", "working_dir": "Directorio de trabajo:", "yellow": "Amarillo", "*yellow_lab": "Yellow Lab", "*yellow_xyz": "Yellow XYZ", "yes": "Si", } DisplayCAL-3.1.0.0/DisplayCAL/lang/fr.json0000644000076500000000000025774112653526635017677 0ustar devwheel00000000000000{ "*": "Note to translators: Keys which are not yet translated are marked with a leading asterisk (*) and are indented with two tabs instead of one. Please remove the asterisk when translated.", "!author": "Loïc Guégant, François Leclerc", "!language": "Français", "!language_name": "FRENCH", "3dlut": "3D LUT", "*3dlut.1dlut.videolut.nonlinear": "The display device's video card gamma tables 1D LUT calibration is non-linear, but the 3D LUT contains applied 1D LUT calibration. Make sure to manually reset the video card gamma tables to linear before using the 3D LUT, or create a 3D LUT without calibration applied (to do the latter, enable “Show advanced options” in the “Options” menu and disable “Apply calibration (vcgt)” as well as “Create 3D LUT after profiling” in the 3D LUT settings, then create a new 3D LUT).", "3dlut.bitdepth.input": "Résolution d'entrée de la table de correspondance 3D", "3dlut.bitdepth.output": "Résolution de sortie de la table de correspondance 3D", "3dlut.create": "Créer une table de correspondance 3D...", "3dlut.create_after_profiling": "Créer la 3D LUT après la caractérisation", "3dlut.enable": "Activer la table de correspondance 3D", "3dlut.encoding.input": "Encodage d'entrée", "3dlut.encoding.output": "Encodage de sortie", "3dlut.encoding.output.warning.madvr": "Attention: Cet encodage de sortie n'est pas recommandé et causera du clipping si madVR n'est pas configuré en sortie “TV levels (16-235)” dans l'onglet “Devices” → “%s” → “Properties”. Utiliser à vos propres risques!", "3dlut.encoding.type_2": "TV Rec. 2020 YCbCr UHD", "3dlut.encoding.type_5": "TV Rec. 709 1250/50Hz YCbCr HD", "3dlut.encoding.type_6": "TV Rec. 601 YCbCr SD", "3dlut.encoding.type_7": "TV Rec. 709 1125/60Hz YCbCr HD", "3dlut.encoding.type_C": "TV Rec. 2020 Constant Luminance YCbCr UHD", "*3dlut.encoding.type_T": "TV RGB 16-235 (clip WTW)", "3dlut.encoding.type_X": "TV xvYCC Rec. 709 YCbCr HD", "3dlut.encoding.type_n": "Étendue complète RGB 0-255", "3dlut.encoding.type_t": "TV RGB 16-235", "3dlut.encoding.type_x": "TV xvYCC Rec. 601 YCbCr (primaires Rec. 709) SD", "3dlut.format": "Format de fichier de table de correspondance 3D", "3dlut.format.3dl": "Autodesk Lustre / Kodak Look Manager System (.3dl)", "*3dlut.format.ReShade": "ReShade (.png, .fx)", "3dlut.format.cube": "IRIDAS (.cube)", "3dlut.format.eeColor": "eeColor Processor (.txt)", "3dlut.format.madVR": "madVR (.3dlut)", "3dlut.format.mga": "Pandora (.mga)", "*3dlut.format.png": "PNG (.png)", "3dlut.format.spi3d": "Sony Imageworks (.spi3d)", "3dlut.frame.title": "Créer une table de correspondance 3D", "*3dlut.holder.assign_preset": "Assign 3D LUT to preset:", "*3dlut.holder.out_of_memory": "%s is out of 3D LUT storage space (at least %i KB required). Please delete a few 3D LUTs from %s to make space for new ones. See your %s's documentation for more information.", "3dlut.input.colorspace": "Espace de couleur source", "3dlut.input.profile": "Profil source", "3dlut.install": "Installer 3D LUT", "3dlut.install.failure": "Echec installation 3D LUT (erreur inconnue).", "3dlut.install.success": "3D LUT installée avec succès!", "3dlut.install.unsupported": "L'installation automatique de la 3D LUT n'est pas supportée pour le format de 3D LUT spécifié.", "3dlut.save_as": "Enregistrer 3D LUT sous...", "3dlut.settings": "Paramètres 3D LUT", "3dlut.size": "Taille de la table de correspondance 3D", "*3dlut.tab.enable": "Enable 3D LUT tab", "3dlut.use_abstract_profile": "Profil abstrait (« Look »)", "*CMP_Digital_Target-3.cie": "CMP Digital Target 3", "*CMP_Digital_Target-4.cie": "CMP Digital Target 4", "*CMYK_IDEAlliance_ControlStrip_2009.ti1": "IDEAlliance Control Strip 2009", "*ColorChecker.cie": "ColorChecker", "*ColorCheckerDC.cie": "ColorChecker DC", "*ColorCheckerPassport.cie": "ColorChecker Passport", "*ColorCheckerSG.cie": "ColorChecker SG", "*FograStrip2.ti1": "Fogra Media Wedge CMYK V2.0", "*FograStrip3.ti1": "Fogra Media Wedge CMYK V3.0", "*ISO_12646-2008_color_accuracy_and_gray_balance.ti1": "ISO 12646:2008 color accuracy and gray balance", "*QPcard_201.cie": "QPcard 201", "*QPcard_202.cie": "QPcard 202", "*SpyderChecker.cie": "SpyderCHECKR", "Untethered": "Autonome", "[rgb]TRC": "Courbes de réponse du ton", "aborted": "... interrompu.", "aborting": "Interruption, veuillez patienter (cela peut prendre quelques secondes)...", "*abstract_profile": "Abstract profile", "*active_matrix_display": "Active matrix display", "adaptive_mode_unavailable": "Le mode Adaptatif n'est disponible qu'avec Argyll CMS 1.1.0 RC3 ou ultérieur.", "allow_skip_sensor_cal": "Autoriser à passer l'autocalibrage du spectromètre", "ambient.measure": "Mesurer la lumière ambiante", "ambient.measure.color.unsupported": "%s: La couleur de la lumière ambiante ne peut pas être déterminée avec l'instrument de mesure choisi car son capteur semble être monochromatique (seul un niveau de lumière a pu être mesuré).", "ambient.measure.light_level.missing": "Ne peut pas obtenir une lecture de niveau de lumière", "ambient.set": "Voulez-vous également régler le niveau de lumière ambiante à la valeur mesurée ?", "*app.client.connect": "Scripting client %s:%s connected", "*app.client.disconnect": "Scripting client %s:%s disconnected", "*app.client.ignored": "Refused connection attempt of scripting client %s:%s: %s", "*app.client.network.disallowed": "Refused connection attempt of scripting client %s:%s: Network clients are not allowed.", "app.confirm_restore_defaults": "Voulez-vous réellement annuler vos modifications et restaurer les valeurs par défaut ?", "*app.detected.calibration_loading_disabled": "Detected %s. Calibration loading disabled.", "*app.detection_lost.calibration_loading_enabled": "No longer detecting %s. Calibration loading enabled.", "*app.incoming_message": "Received scripting request from %s:%s: %s", "*app.incoming_message.invalid": "Scripting request invalid!", "*app.listening": "Setting up scripting host at %s:%s", "*app.otherinstance": "%s is already running.", "*app.otherinstance.notified": "Already running instance has been notified.", "app.restart_request": "Veuillez redémarrer l'application.", "apply": "Appliquer", "apply_black_output_offset": "Appliquer les offsets de sortie du noir (100%)", "apply_cal": "Appliquer le calibrage (vcgt)", "apply_cal.error": "Le calibrage n'a pu être appliqué.", "apply_trc": "Appliquer le mappage de gamma", "*archive.create": "Create compressed archive...", "*archive.import": "Import archive...", "*archive.include_3dluts": "Do you want to include 3D LUT files in the archive (not recommended, leads to larger archive file size)?", "argyll.debug.warning1": "Veuillez utiliser cette option uniquement si vous avez vraiment besoin d'information de débogage (p. ex. pour le dépannage d'une fonctionnalité d'Argyll CMS) ! Ceci est en principe utile uniquement aux développeurs du logiciel pour aider au diagnostic et à la résolution de problèmes. Êtes-vous sûr(e) de vouloir activer la sortie du débogage ?", "argyll.debug.warning2": "N'oubliez pas de désactiver la sortie du débogage pour le fonctionnement normal du logiciel.", "argyll.dir": "Répertoire des exécutables Argyll CMS :", "argyll.dir.invalid": "Exécutables Argyll CMS introuvables.\nVeuillez sélectionner le répertoire contenant les fichiers exécutables (peut-être préfixé ou suffixé « argyll- » / « -argyll ») : %s", "argyll.error.detail": "Message d'erreur détaillé d'Argyll CMS :", "*argyll.instrument.configuration_files.install": "Install Argyll CMS instrument configuration files...", "*argyll.instrument.configuration_files.install.success": "Installation of Argyll CMS instrument configuration files complete.", "*argyll.instrument.configuration_files.uninstall": "Uninstall Argyll CMS instrument configuration files...", "*argyll.instrument.configuration_files.uninstall.success": "Uninstallation of Argyll CMS instrument configuration files complete.", "argyll.instrument.driver.missing": "Le pilote d'Argyll CMS pour votre périphérique de mesure ne semble pas installé ou installé incorrectement. Veuillez vérifier que votre périphérique de mesure apparaît dans le gestionnaire de périphériques de Windows sous « Argyll LibUSB-1.0A devices » et (ré-)installez le pilote si nécessaire. Veuillez consulter la documentation pour les instructions d'installation.", "*argyll.instrument.drivers.install": "Install Argyll CMS instrument drivers...", "*argyll.instrument.drivers.install.confirm": "You only need to install the Argyll CMS specific drivers if you have a measurement instrument that is not a ColorMunki Display, i1 Display Pro, Huey, ColorHug, specbos or K-10.\n\nNote: If you already have a vendor driver for your instrument installed, you'll have to use Windows' Device Manager to manually switch to the Argyll CMS driver after it has been installed. To do that, right click on the instrument and select “Update Driver Software...”, then choose “Browse my computer for driver software”, “Let me pick from a list of device drivers on my computer” and finally select the Argyll driver for your instrument from the list.\n\nDo you want to proceed?", "*argyll.instrument.drivers.install.failure": "Installation of Argyll CMS instrument drivers failed.", "*argyll.instrument.drivers.install.restart": "You need to disable Driver Signature Enforcement to install the Argyll CMS instrument drivers. For this purpose, the system needs to be restarted. Select “Troubleshoot” on the page that will appear, then “Advanced Options”, “Startup Settings” and finally “Restart”. On startup, select “Disable Driver Signature Enforcement”. After the restart, choose “Install Argyll CMS instrument drivers...” in the menu again to install the drivers. If you don't see the “Troubleshoot” option, please refer to the DisplayCAL documentation section “Instrument driver installation under Windows” for an alternate method to disable Driver Signature Enforcement.", "*argyll.instrument.drivers.uninstall": "Uninstall Argyll CMS instrument drivers...", "*argyll.instrument.drivers.uninstall.confirm": "Note: Uninstallation doesn't affect instrument drivers that are currently in use, but just removes the driver from Windows' Driver Store. If you want to switch back to an installed vendor-supplied driver for your instrument, you'll have to use Windows' Device Manager to manually switch to the vendor driver. To do that, right click on the instrument and select “Update Driver Software...”, then choose “Browse my computer for driver software”, “Let me pick from a list of device drivers on my computer” and finally select the vendor driver for your instrument from the list.\n\nDo you want to proceed?", "*argyll.instrument.drivers.uninstall.failure": "Uninstallation of Argyll CMS instrument drivers failed.", "*argyll.instrument.drivers.uninstall.success": "Uninstallation of Argyll CMS instrument drivers complete.", "argyll.util.not_found": "Exécutable Argyll CMS « %s » introuvable.", "as_measured": "Tel que mesuré", "*attributes": "Attributes", "*audio.lib": "Audio module: %s", "auth": "Authentification", "auth.failed": "Échec de l'authentification.", "auto": "Automatique", "*auto_optimized": "Auto-optimized", "autostart_remove_old": "Suppression de l'ancienne entrée de démarrage automatique", "*backing_xyz": "Backing XYZ", "backlight": "Rétroéclairage", "*bitdepth": "Bitdepth", "black": "Noir", "*black_lab": "Black Lab", "black_point": "Point noir", "black_point_compensation": "Compensation du point noir", "black_point_compensation.3dlut.warning": "Durant la création de la 3D LUT, la compensation du point noir doit être désactivée car elle affecte la fonction d'ajustement de la courbe de ton. Voulez-vous désactiver la compensation du point noir?", "black_point_compensation.info": "La compensation du point noir empêche efficacement la réduction du noir, mais réduit la précision de la conversion des couleurs.", "black_white": "Noir & blanc", "black_xyz": "Noir XYZ", "blacklevel": "Niveau de noir", "blue": "Bleu", "blue_gamma": "Gamma bleu", "*blue_lab": "Blue Lab", "*blue_matrix_column": "Blue matrix column", "*blue_maximum": "Blue maximum", "*blue_minimum": "Blue minimum", "*blue_tone_response_curve": "Blue tone response curve", "blue_xyz": "Bleu XYZ", "brightness": "Luminosité", "browse": "Sélectionner...", "bug_report": "Rapporter un bogue...", "button.calibrate": "Calibrer uniquement", "button.calibrate_and_profile": "Calibrer & caractériser", "button.profile": "Caractériser uniquement", "cal_extraction_failed": "Échec de l'extraction des données de calibrage à partir du profil.", "calculated_checksum": "Calculated checksum", "calibrate_instrument": "Calibration du spectromètre", "calibration": "Calibrage", "calibration.ambient_viewcond_adjust": "Niveau de luminosité ambiante", "calibration.ambient_viewcond_adjust.info": "Pour réaliser un ajustement des conditions de visualisation \nlors du calcul des courbes de calibrage, cochez la case et \nsaisissez votre niveau de luminosité ambiante. Vous pouvez \néventuellement mesurer aussi la luminosité ambiante au \ncours du calibrage, si votre instrument le permet.", "calibration.black_luminance": "Niveau de noir", "calibration.black_output_offset": "Compensation du noir restitué", "calibration.black_point_correction": "Correction du point noir", "calibration.black_point_correction_choice": "Vous pouvez désactiver la correction du point noir pour optimiser le niveau de noir et le taux de contraste (recommandé pour la plupart des écrans cathodiques). Veuillez indiquer votre choix pour la correction du point noir.", "calibration.black_point_rate": "Taux", "calibration.check_all": "Vérifier les réglages", "calibration.complete": "Calibrage terminé.", "calibration.create_fast_matrix_shaper": "Créer un profil de matrice", "calibration.create_fast_matrix_shaper_choice": "Voulez-vous créer un profil de façonnage de matrice rapide à partir des mesures de calibrage ou juste calibrer ?", "calibration.do_not_use_video_lut": "Ne pas utiliser la table gamma de la carte vidéo pour appliquer le calibrage", "calibration.do_not_use_video_lut.warning": "Voulez-vous vraiment changer le réglage recommandé ?", "calibration.embed": "Incorporer les courbes de calibrage dans le profil", "calibration.file": "Réglages", "calibration.file.invalid": "Le fichier de réglages sélectionné est invalide.", "calibration.file.none": "", "calibration.incomplete": "Le calibrage n'a pas été achevé.", "calibration.interactive_display_adjustment": "Réglage interactif de l'écran", "calibration.interactive_display_adjustment.black_level.crt": "Sélectionnez « Commencer la mesure » et ajustez la luminosité et/ou les contrôles de décalage RVB de votre écran pour obtenir le niveau désiré.", "calibration.interactive_display_adjustment.black_point.crt": "Sélectionnez « Commencer la mesure » et ajustez les contrôles de décalage RVB de votre écran pour obtenir le point noir désiré.", "calibration.interactive_display_adjustment.check_all": "Sélectionnez « Commencer la mesure » pour contrôler l'ensemble des réglages.", "calibration.interactive_display_adjustment.generic_hint.plural": "Une bonne correspondance est obtenue si toutes les barres peuvent être amenées à la position indiquée au centre.", "calibration.interactive_display_adjustment.generic_hint.singular": "Une bonne correspondance est obtenue si la barre peut être amenée à la position indiquée au centre.", "calibration.interactive_display_adjustment.start": "Commencer la mesure", "calibration.interactive_display_adjustment.stop": "Arrêter la mesure", "calibration.interactive_display_adjustment.white_level.crt": "Sélectionnez « Commencer la mesure » et ajustez le contraste et/ou les contrôles de gain RVB de votre écran pour obtenir le niveau désiré.", "calibration.interactive_display_adjustment.white_level.lcd": "Sélectionnez « Commencer la mesure » et ajustez le contrôle de rétro-éclairage/luminosité de votre écran pour obtenir le niveau désiré.", "calibration.interactive_display_adjustment.white_point": "Sélectionnez « Commencer la mesure » et ajustez les contrôles de température des couleurs et/ou de gain RVB de vote écran pour obtenir le point blanc désiré.", "calibration.load": "Charger des réglages...", "*calibration.load.handled_by_os": "Calibration loading is handled by the operating system.", "calibration.load_error": "Les courbes de la table de correspondance n'ont pas pu être chargées.", "calibration.load_from_cal": "Charger les courbes de la table de correspondance à partir du fichier de calibrage...", "calibration.load_from_cal_or_profile": "Charger les courbes de la table de correspondance à partir du fichier de calibrage ou du profil...", "calibration.load_from_display_profile": "Charger les courbes de la table de correspondance à partir du profil actuel du périphérique d'affichage...", "*calibration.load_from_display_profiles": "Load calibration from current display device profile(s)", "calibration.load_from_profile": "Charger les courbes de la table de correspondance à partir du profil...", "calibration.load_success": "Les courbes de la table de correspondance ont été chargées avec succès.", "calibration.loading": "Chargement des courbes de la table de correspondance à partir du fichier...", "calibration.loading_from_display_profile": "Chargement des courbes de la table de correspondance du profil actuel du périphérique d'affichage...", "calibration.luminance": "Niveau de blanc", "calibration.lut_viewer.title": "Courbes", "*calibration.preserve": "Preserve calibration state", "calibration.preview": "Aperçu du calibrage", "calibration.quality": "Qualité du calibrage", "calibration.quality.high": "Haute", "calibration.quality.low": "Basse", "calibration.quality.medium": "Moyenne", "calibration.quality.ultra": "Ultra", "calibration.quality.verylow": "Très basse", "calibration.reset": "Réinitialiser les courbes de la table de correspondance", "calibration.reset_error": "Les courbes de la table de correspondance n'ont pas pu être réinitialisées.", "calibration.reset_success": "Les courbes de la table de correspondance ont été réinitialisées avec succès.", "calibration.resetting": "Réinitialisation linéaire des courbes de la table de correspondance...", "calibration.settings": "Réglages du calibrage", "calibration.show_actual_lut": "Afficher les courbes de calibrage de la carte vidéo", "calibration.show_lut": "Afficher les courbes", "calibration.skip": "Continuer à la caractérisation", "calibration.speed": "Vitesse du calibrage", "calibration.speed.high": "Haute", "calibration.speed.low": "Basse", "calibration.speed.medium": "Moyenne", "calibration.speed.veryhigh": "Très haute", "calibration.speed.verylow": "Très basse", "calibration.start": "Poursuivre le calibrage", "calibration.turn_on_black_point_correction": "Activer", "calibration.update": "Mettre à jour le calibrage", "calibration.update_profile_choice": "Voulez-vous également mettre à jour les courbes de calibrage dans le profil existant ou juste calibrer ?", "calibration.use_linear_instead": "Utiliser le calibrage linéaire à la place", "calibration.verify": "Vérifier le calibrage", "calibration_profiling.complete": "Calibrage et caractérisation terminés.", "calibrationloader.description": "Charge les courbes de calibrage à partir du profil ICC pour l'écran %s", "can_be_used_independently": "Ne peut pas être utilisé indépendamment", "cancel": "Annuler", "*cathode_ray_tube_display": "Cathode ray tube display", "ccxx.ti1": "Grille de test pour la correction du colorimètre", "centered": "Centré", "*channel_1_c_xy": "Channel 1 (C) xy", "*channel_1_gamma_at_50_input": "Channel 1 gamma at 50% input", "*channel_1_is_linear": "Channel 1 is linear", "*channel_1_maximum": "Channel 1 maximum", "*channel_1_minimum": "Channel 1 minimum", "*channel_1_r_xy": "Channel 1 (R) xy", "*channel_1_unique_values": "Channel 1 unique values", "*channel_2_g_xy": "Channel 2 (G) xy", "*channel_2_gamma_at_50_input": "Channel 2 gamma at 50% input", "*channel_2_is_linear": "Channel 2 is linear", "*channel_2_m_xy": "Channel 2 (M) xy", "*channel_2_maximum": "Channel 2 maximum", "*channel_2_minimum": "Channel 2 minimum", "*channel_2_unique_values": "Channel 2 unique values", "*channel_3_b_xy": "Channel 3 (B) xy", "*channel_3_gamma_at_50_input": "Channel 3 gamma at 50% input", "*channel_3_is_linear": "Channel 3 is linear", "*channel_3_maximum": "Channel 3 maximum", "*channel_3_minimum": "Channel 3 minimum", "*channel_3_unique_values": "Channel 3 unique values", "*channel_3_y_xy": "Channel 3 (Y) xy", "*channel_4_k_xy": "Channel 4 (K) xy", "*channels": "Channels", "*characterization_device_values": "Characterization device values", "*characterization_measurement_values": "Characterization measurement values", "*characterization_target": "Characterization target", "checking_lut_access": "Contrôle de l'accès à la table de correspondance pour l'écran %s...", "*checksum": "Checksum", "*checksum_ok": "Checksum OK", "*chromatic_adaptation_matrix": "Chromatic adaptation matrix", "*chromatic_adaptation_transform": "Chromatic adaptation transform", "*chromaticity_illuminant_relative": "Chromaticity (illuminant-relative)", "*chromecast_limitations_warning": "Please note that Chromecast accuracy is not as good as a directly connected display or madTPG, due to the Chromecast using RGB to YCbCr conversion and upscaling.", "clear": "Effacer", "*color": "Color", "color.custom": "Couleur personnalisée", "*color_look_up_table": "Color Look Up Table", "*color_model": "Color model", "*color_space_conversion_profile": "Color space Conversion profile", "*colorant_order": "Colorant order", "*colorants_pcs_relative": "Colorants (PCS-relative)", "colorconfig_remove_old": "Suppression de l'ancien fichier de configuration de l'écran", "colorimeter_correction.create": "Créer une correction du colorimètre...", "colorimeter_correction.create.details": "Veuillez vérifier les champs ci-dessous et les changer si nécessaire. La description peut également contenir des détails importants (p. ex. des réglages spécifiques à l'écran, un observateur CIE non-standard ou ce genre de chose).", "colorimeter_correction.create.failure": "Échec de la création de la correction.", "colorimeter_correction.create.info": "Pour créer une matrice de correction du colorimètre (CCMX) ou un fichier d'échantillons de spectre de calibrage (CCSS), vous devez d'abord mesurer la « Grille de test pour la correction du colorimètre » à l'aide d'un spectromètre, et au cas où vous voulez créer une CCMX, également avec le colorimètre.", "colorimeter_correction.create.success": "Correction créée.", "colorimeter_correction.file.none": "Aucune", "colorimeter_correction.import": "Importer les corrections du colorimètre d'un autre logiciel de profilage d'écrans...", "colorimeter_correction.import.choose": "Veuillez choisir le fichier de correction de colorimètre à importer.", "colorimeter_correction.import.failure": "Aucune correction de colorimètre n'a pu être importée.", "*colorimeter_correction.import.partial_warning": "Not all colorimeter corrections could be imported from %s. %i of %i entries had to be skipped.", "colorimeter_correction.import.success": "Les corrections du colorimètre ont été importées depuis les logiciels suivants :\n\n%s", "colorimeter_correction.instrument_mismatch": "La correction de colorimètre sélectionnée ne convient pas à l'instrument sélectionné.", "colorimeter_correction.upload": "Charger la correction du colorimètre...", "colorimeter_correction.upload.confirm": "Voulez-vous charger la correction du colorimètre vers la base de données en ligne (recommandé) ? Tout fichier chargé sera considéré comme placé dans le domaine public, de sorte à pouvoir être utilisé librement.", "colorimeter_correction.upload.deny": "Cette correction de colorimètre ne peut être chargée.", "colorimeter_correction.upload.exists": "La correction du colorimètre existe déjà dans la base de données.", "colorimeter_correction.upload.failure": "La correction n'a pu être entrée dans la base de données en ligne.", "colorimeter_correction.upload.success": "La correction a été chargée dans la base de données en ligne.", "colorimeter_correction.web_check": "Chercher en ligne une correction de colorimètre...", "colorimeter_correction.web_check.choose": "Les corrections de colorimètre suivantes pour les écran et instrument sélectionnés ont été trouvées :", "colorimeter_correction.web_check.failure": "Aucune correction de colorimètre pour les écran et instrument sélectionnés n'a été trouvée.", "colorimeter_correction_matrix_file": "Matrice", "colorimeter_correction_matrix_file.choose": "Choisir une matrice de correction", "*colors_pcs_relative": "Colors (PCS-relative)", "colorspace": "Espace de couleurs", "colorspace.show_outline": "Afficher le contour", "commandline": "Ligne de commande :", "*commands": "Commands", "comparison_profile": "Profil de comparaison", "comport_detected": "Une modification de la configuration de l'instrument ou du port a été détectée.", "compression.gzip": "Compression GZIP", "computer.name": "Nom de l'ordinateur", "*connected.to.at": "Connected to %s at %s:%s", "*connecting.to": "Connecting to %s:%s...", "*connection.broken": "Connection broken", "*connection.established": "Connection established", "connection.fail": "Erreur de connexion (%s)", "connection.fail.http": "Erreur HTTP %s", "*connection.waiting": "Waiting for connection at", "continue": "Continuer", "contrast": "Contraste", "*contribute": "Contribute", "converting": "Conversion", "copyright": "Droit d'auteur", "corrected": "corrigé", "create_and_preview": "Création & aperçu", "create_ccss_or_ccmx": "Voulez-vous créer une matrice de correction pour les colorimètres ordinaires (CCMX) ou un échantillon de spectre de calibrage pour les i1 Display Pro et ColorMunki Display (CCSS)?", "create_profile": "Créer un profil à partir des données mesurées...", "create_profile_from_edid": "Créer un profil à partir des données d'identification étendues de l'écran...", "created": "Créé", "creator": "Créateur", "current": "Courant", "custom": "Personnalisé", "cyan": "Cyan", "d3-e4-s0-g25-m3-b3-f0-crossover.ti1": "Grille de test par défaut pour profils de matrice", "d3-e4-s0-g49-m3-b3-f0-crossover.ti1": "Grille de test étendue pour profils de matrice", "d3-e4-s0-g9-m3-b3-f0-crossover.ti1": "Petite grille de test pour profils de matrice", "d3-e4-s0-g97-m3-b3-f0-crossover.ti1": "Très grande grille de test pour profils de matrice", "d3-e4-s13-g37-m4-b4-f0.ti1": "Petite grille de test pour profils de tables de correspondance", "d3-e4-s17-g49-m5-b5-f0.ti1": "Grille de test par défaut pour profils de tables de correspondance", "d3-e4-s21-g61-m6-b6-f0.ti1": "Grille de test étendue pour profils de tables de correspondance", "d3-e4-s25-g73-m0-f679-cRec709_Gamma22.ti1": "Grande grille de test pour profils de tables de correspondance, optimisée pour Gamma 2.2 avec primaires Rec. 709 (D65)", "d3-e4-s25-g73-m0-f679-caRGB.ti1": "Grande grille de test pour profils de tables de correspondance, optimisée pour Gamma 2.2 avec primaires AdobeRGB (D65)", "d3-e4-s25-g73-m0-f679-ceRGBv2.ti1": "Grande grille de test pour profils de tables de correspondance, optimisée pour L* avec primaires NTSC 1953 (D50)", "d3-e4-s25-g73-m0-f679-csRGB.ti1": "Grande grille de test pour profils de tables de correspondance, optimisée pour sRGB (D65)", "d3-e4-s25-g73-m7-b7-f0.ti1": "Grande grille de test pour profils de tables de correspondance", "d3-e4-s29-g85-m0-f994-cRec709_Gamma22.ti1": "Très grande grille de test pour profils de tables de correspondance, optimisée pour Gamma 2.2 avec primaires Rec. 709 (D65)", "d3-e4-s29-g85-m0-f994-caRGB.ti1": "Très grande grille de test pour profils de tables de correspondance, optimisée pour Gamma 2.2 avec primaires AdobeRGB (D65)", "d3-e4-s29-g85-m0-f994-ceRGBv2.ti1": "Très grande grille de test pour profils de tables de correspondance, optimisée pour L* avec primaires NTSC 1953 (D50)", "d3-e4-s29-g85-m0-f994-csRGB.ti1": "Très grande grille de test pour profils de tables de correspondance, optimisée pour sRGB (D65)", "d3-e4-s29-g85-m8-b8-f0.ti1": "Très grande grille de test pour profils de tables de correspondance", "d3-e4-s33-g97-m0-f1399-cRec709_Gamma22.ti1": "Grille de test XXL pour profils de tables de correspondance, optimisée pour Gamma 2.2 avec primaires Rec. 709 (D65)", "d3-e4-s33-g97-m0-f1399-caRGB.ti1": "Grille de test XXL pour profils de tables de correspondance, optimisée pour Gamma 2.2 avec primaires AdobeRGB (D65)", "d3-e4-s33-g97-m0-f1399-ceRGBv2.ti1": "Grille de test XXL pour profils de tables de correspondance, optimisée pour L* avec primaires NTSC 1953 (D50)", "d3-e4-s33-g97-m0-f1399-csRGB.ti1": "Grille de test XXL pour profils de tables de correspondance, optimisée pour sRGB (D65)", "d3-e4-s33-g97-m9-b9-f0.ti1": "Grille de test XXL pour profils de tables de correspondance", "d3-e4-s37-g109-m0-f1906-cRec709_Gamma22.ti1": "Grille de test XXXL pour profils de tables de correspondance, optimisée pour Gamma 2.2 avec primaires Rec. 709 (D65)", "d3-e4-s37-g109-m0-f1906-caRGB.ti1": "Grille de test XXXL pour profils de tables de correspondance, optimisée pour Gamma 2.2 avec primaires AdobeRGB (D65)", "d3-e4-s37-g109-m0-f1906-ceRGBv2.ti1": "Grille de test XXXL pour profils de tables de correspondance, optimisée pour L* avec primaires NTSC 1953 (D50)", "d3-e4-s37-g109-m0-f1906-csRGB.ti1": "Grille de test XXXL pour profils de tables de correspondance, optimisée pour sRGB (D65)", "d3-e4-s37-g109-m10-b10-f0.ti1": "Grille de test XXXL pour profils de tables de correspondance", "d3-e4-s41-g121-m0-f2527-cRec709_Gamma22.ti1": "Grille de test massive pour profils de tables de correspondance, optimisée pour Gamma 2.2 avec primaires Rec. 709 (D65)", "d3-e4-s41-g121-m0-f2527-caRGB.ti1": "Grille de test massive pour profils de tables de correspondance, optimisée pour Gamma 2.2 avec primaires AdobeRGB (D65)", "d3-e4-s41-g121-m0-f2527-ceRGBv2.ti1": "Grille de test massive pour profils de tables de correspondance, optimisée pour L* avec primaires NTSC 1953 (D50)", "d3-e4-s41-g121-m0-f2527-csRGB.ti1": "Grille de test massive pour profils de tables de correspondance, optimisée pour sRGB (D65)", "d3-e4-s41-g121-m11-b11-f0.ti1": "Grille de test massive pour profils de tables de correspondance", "*deactivated": "deactivated", "default": "Valeur par défaut", "default.icc": "Défaut (Gamma 2.2)", "default_crt": "Défaut CRT", "*default_rendering_intent": "Default rendering intent", "delete": "Supprimer", "*delta_e_2000_to_blackbody_locus": "ΔE 2000 to blackbody locus", "*delta_e_2000_to_daylight_locus": "ΔE 2000 to daylight locus", "delta_e_to_locus": "ΔE*00 vers locus %s", "description": "Description", "*description_ascii": "Description (ASCII)", "*description_macintosh": "Description (Macintosh)", "*description_unicode": "Description (Unicode)", "*deselect_all": "Deselect all", "detect_displays_and_ports": "Détecter les périphériques d'affichage et les instruments", "*device": "Device", "device.name.placeholder": "", "*device_color_components": "Device color components", "*device_manager.launch": "Launch Device Manager", "*device_manufacturer_name": "Device manufacturer name", "*device_manufacturer_name_ascii": "Device manufacturer name (ASCII)", "*device_manufacturer_name_macintosh": "Device manufacturer name (Macintosh)", "*device_manufacturer_name_unicode": "Device manufacturer name (Unicode)", "*device_model_name": "Device model name", "*device_model_name_ascii": "Device model name (ASCII)", "*device_model_name_macintosh": "Device model name (Macintosh)", "*device_model_name_unicode": "Device model name (Unicode)", "*device_to_pcs_intent_0": "Device to PCS: Intent 0", "*device_to_pcs_intent_1": "Device to PCS: Intent 1", "*device_to_pcs_intent_2": "Device to PCS: Intent 2", "devicelink_profile": "Profil de lien de périphérique", "*dialog.argyll.notfound.choice": "Argyll CMS, the color engine that is needed to run DisplayCAL, doesn't seem to be installed on this computer. Dow you want to automatically download it or browse for it manually?", "dialog.cal_info": "Le fichier de calibrage “%s” sera utilisé. Voulez-vous continuer ?", "dialog.confirm_cancel": "Voulez-vous vraiment annuler ?", "dialog.confirm_delete": "Voulez-vous vraiment supprimer le(s) fichier(s) sélectionné(s) ?", "dialog.confirm_overwrite": "Le fichier « %s » existe déjà. Voulez-vous l'écraser ?", "dialog.current_cal_warning": "Le profil contiendra les courbes de calibrage actuelles. Voulez-vous continuer ?", "dialog.do_not_show_again": "Ne plus afficher ce message", "dialog.enter_password": "Veuillez saisir votre mot de passe.", "dialog.install_profile": "Voulez-vous installer le profil « %s » et en faire le profil par défaut pour l'écran « %s » ?", "dialog.linear_cal_info": "Les courbes de calibrage linéaires seront utilisées. Voulez-vous continuer ?", "dialog.load_cal": "Charger les réglages", "*dialog.select_argyll_version": "Version %s of Argyll CMS was found. The currently selected version is %s. Do you want to use the newer version?", "dialog.set_argyll_bin": "Veuillez indiquer le répertoire dans lequel se trouvent les exécutables d'Argyll CMS.", "dialog.set_profile_save_path": "Créer le répertoire du profil « %s » ici :", "dialog.set_testchart": "Sélectionner un fichier de grille de test", "dialog.ti3_no_cal_info": "Les données de mesure ne contiennent pas de courbes de calibrage. Voulez-vous réellement continuer ?", "*digital_camera": "Digital camera", "*direction.backward": "PCS → B2A → device", "*direction.backward.inverted": "PCS ← B2A ← device", "*direction.forward": "Device → A2B → PCS", "*direction.forward.inverted": "Device ← A2B ← PCS", "*disconnected.from": "Disconnected from %s:%s", "display": "Périphérique d'affichage", "display-instrument": "Affichage & instrument", "display.connection.type": "Connexion", "display.manufacturer": "Fabricant du périphérique d'affichage", "*display.output": "Output #", "display.primary": "(Primaire)", "display.properties": "Propriétés du périphérique d'affichage", "*display.reset.info": "Please reset the display device to factory defaults, then adjust its brightness to a comfortable level.", "display.settings": "Réglages du périphérique d'affichage", "display.tech": "Technologie de l'écran", "display_detected": "Une modification de la configuration du périphérique d'affichage a été détectée.", "*display_device_profile": "Display device profile", "display_lut.link": "Lier/délier l'accès à l'écran et à la table de correspondance", "*display_profile.not_detected": "No current profile detected for display “%s”", "*display_profile.save_as": "The current profile for display “%s” only exists in memory. Please save it to a file first.", "display_short": "Périphérique d'affichage (abrégé)", "displayport": "DisplayPort", "*dlp_screen": "DLP Screen", "*donation_header": "Your support is appreciated!", "*donation_message": "If you would like to support the development of, technical assistance with, and continued availability of DisplayCAL and Argyll CMS, please consider a financial contribution. As DisplayCAL wouldn't be useful without Argyll CMS, all contributions received for DisplayCAL will be split between both projects.\nFor light personal non-commercial use, a one-time contribution may be appropriate. If you're using DisplayCAL professionally, an annual or monthly contribution would make a great deal of difference in ensuring that both projects continue to be available.\n\nThanks to all contributors!", "*download": "Download", "*download_fail_empty_response": "Download failed: %s returned an empty document.", "*download_fail_wrong_size": "Download failed: The file does not have the expected size of %s bytes (received %s bytes).", "*downloading": "Downloading", "drift_compensation.blacklevel": "Compensation de la dérive du niveau de noir", "drift_compensation.blacklevel.info": "La compensation de la dérive du niveau de noir tente de prendre en compte les déviations de mesure causées par la dérive du calibrage du noir d'un périphérique de mesure s'échauffant. À cette fin, un échantillon de test noir est mesuré périodiquement, augmentant la durée totale nécessaire aux mesures. De nombreux colorimètres ont une compensation de la température intégrée, auquel cas la compensation de la dérive du niveau de noir n'est pas nécessaire, mais la plupart des spectromètres ne sont pas compensés en température.", "drift_compensation.whitelevel": "Compensation de la dérive du niveau de blanc", "drift_compensation.whitelevel.info": "La compensation de la dérive du niveau de blanc tente de prendre en compte les déviations de mesure causées par les changements de luminosité d'un périphérique d'affichage s'échauffant. À cette fin, un échantillon de test blanc est mesuré périodiquement, augmentant la durée totale nécessaire aux mesures.", "dry_run": "Simulation", "dry_run.end": "Simulation terminée.", "dry_run.info": "Simulation. Vérifiez le journal pour voir la ligne de commande.", "dvi": "DVI", "*dye_sublimation_printer": "Dye sublimation printer", "edid.crc32": "Somme de contrôle EDID CRC32", "edid.serial": "N° de série EDID", "elapsed_time": "Temps écoulé", "*electrophotographic_printer": "Electrophotographic printer", "*electrostatic_printer": "Electrostatic printer", "enable_argyll_debug": "Activer la sortie du diagnostic d'Argyll CMS", "enable_spyder2": "Activer le colorimètre Spyder 2...", "enable_spyder2_failure": "Spyder 2 n'a pas pu être activé.", "enable_spyder2_success": "Spyder 2 a été activé avec succès.", "*entries": "Entries", "enumerate_ports.auto": "Détecter automatiquement les instruments", "enumerating_displays_and_comports": "Inventaire des périphériques d'affichage et des ports de communication...", "*environment": "Environment", "error": "Erreur", "error.access_denied.write": "Vous n'avez pas l'accès en écriture à %s", "error.already_exists": "Le nom « %s » ne peut pas être utilisé, car un autre objet du même nom existe déjà. Veuillez choisir un autre nom ou un autre répertoire.", "error.autostart_creation": "La création d'une entrée de démarrage automatique pour que %s charge les courbes de calibrage à la connexion a échoué.", "error.autostart_remove_old": "L'ancienne entrée d'autodémarrage qui charge les courbes de calibrage à la connexion n'a pu être supprimée : %s", "error.autostart_system": "L'entrée d'autodémarrage système pour charger les courbes de calibrage à la connexion n'a pas pu être créée car le répertoire d'autodémarrage système n'a pas pu être déterminé.", "error.autostart_user": "L'entrée d'autodémarrage spécifique à l'utilisateur/trice pour charger les courbes de calibrage à la connexion n'a pas pu être créée car le répertoire d'autodémarrage spécifique à l'utilisateur/trice n'a pas pu être déterminé.", "error.cal_extraction": "Le calibrage n'a pas pu être extrait de « %s ».", "error.calibration.file_missing": "Le fichier de calibrage « %s » est manquant.", "error.calibration.file_not_created": "Aucun fichier de calibrage n'a été créé.", "error.colorconfig_remove_old": "L'ancien fichier de configuration associant les profils aux écrans n'a pu être supprimé : %s", "error.copy_failed": "Le fichier « %s » n'a pas pu être copié vers « %s ».", "error.deletion": "Une erreur s'est produite pendant le déplacement des fichiers vers la %s. Certains fichiers peuvent ne pas avoir été supprimés.", "error.dir_creation": "Le répertoire « %s » n'a pas pu être créé. Il y a peut-être des restrictions d'accès. Veuillez autoriser l'accès en écriture ou sélectionner un répertoire différent.", "error.dir_notdir": "Le répertoire « %s » n'a pas pu être créé, car un autre objet du même nom existe déjà. Veuillez sélectionner un autre répertoire.", "error.file.create": "Le fichier « %s » n'a pu être créé.", "error.file.open": "Le fichier « %s » n'a pas pu être ouvert.", "error.file_type_unsupported": "Type de fichier non supporté.", "error.generic": "Une erreur interne est survenue.\n\nCode erreur : %s\nMessage d'erreur : %s", "error.measurement.file_invalid": "Le fichier de mesure « %s » est invalide.", "error.measurement.file_missing": "Le fichier de mesure « %s » est manquant.", "error.measurement.file_not_created": "Aucun fichier de mesure n'a été créé.", "error.measurement.missing_spectral": "Le fichier de mesure ne contient pas de valeurs spectrales.", "error.measurement.one_colorimeter": "Une mesure de colorimètre exactement est nécessaire.", "error.measurement.one_reference": "Une mesure de référence du spectromètre exactement est nécessaire.", "error.no_displays_detected": "Aucun périphérique d'affichage n'a pu être détecté.", "*error.no_files_extracted_from_archive": "No files have been extracted from “%s”.", "*error.not_a_session_archive": "The archive “%s” doesn't seem to be a session archive.", "error.profile.file_missing": "Le profil « %s » est manquant.", "error.profile.file_not_created": "Aucun profil n'a été créé.", "error.source_dest_same": "Les fichiers source et cible sont les mêmes.", "error.testchart.creation_failed": "Le fichier de grille de test « %s » n'a pas pu être créé. Peut-être y a-t-il des restrictions d'accès, ou bien le fichier source n'existe pas.", "error.testchart.invalid": "Le fichier de grille de test « %s » est invalide.", "error.testchart.missing": "Le fichier de grille de test « %s » est manquant.", "error.testchart.missing_fields": "Le fichier de grille de test « %s » ne contient pas les champs requis : %s", "error.testchart.read": "Le fichier de grille de test « %s » n'a pas pu être lu.", "error.tmp_creation": "Il n'a pas été possible de créer un répertoire de travail temporaire.", "error.trashcan_unavailable": "La %s n'est pas disponible. Aucun fichier n'a été supprimé.", "errors.none_found": "Aucune erreur trouvée.", "estimated_measurement_time": "Temps de mesure approximatif: %s heure(s) %s minutes", "export": "Exporter...", "extra_args": "Définir des arguments de ligne de commande supplémentaires...", "*factory_default": "Factory Default", "failure": "... échec !", "file.invalid": "Fichier invalide.", "file.missing": "Le fichier « %s » n'existe pas.", "file.notfile": "« %s » n'est pas un fichier.", "file.select": "Sélectionnez un fichier", "*filename.upload": "Upload filename", "*filetype.7z": "7-Zip files", "filetype.any": "Tout type de fichier", "filetype.cal": "Fichiers de calibrages (*.cal)", "filetype.cal_icc": "Fichiers de calibrages et de profils (*.cal;*.icc;*.icm)", "filetype.ccmx": "Matrices de correction (*.ccmx;*.ccss)", "filetype.html": "Fichiers HTML (*.html;*.htm)", "filetype.icc": "Fichiers de profils (*.icc;*.icm)", "filetype.icc_mpp": "Fichiers de profils (*.icc;*.icm;*.mpp)", "filetype.icc_ti1_ti3": "Fichiers de grilles de tests (*.icc;*.icm;*.ti1;*.ti3)", "filetype.icc_ti3": "Fichiers de mesures (*.icc;*.icm;*.ti3)", "filetype.log": "Fichiers journaux (*.log)", "filetype.png": "Portable Network Graphics (*.png)", "*filetype.tgz": "Compressed TAR archive", "filetype.ti1": "Fichiers de grilles de tests (*.ti1)", "filetype.ti1_ti3_txt": "Fichiers de grilles de tests (*.ti1), fichiers de mesures (*.ti3;*.txt)", "filetype.ti3": "Fichiers de mesures (*.icc;*.icm;*.ti3)", "filetype.tif": "Tagged Image File (*.tif)", "filetype.txt": "Corrections_du_peripherique.txt", "filetype.vrml": "Fichiers VRML (*.wrl)", "*filetype.x3d": "X3D files (*.x3d)", "*filetype.zip": "ZIP files", "*film_scanner": "Film scanner", "*film_writer": "Film writer", "finish": "Finir", "*flare": "Flare", "*flexography": "Flexography", "*forced": "forced", "*format.select": "Please select the desired format.", "gamap.default_intent": "Intention de rendu par défaut pour le profil du périphérique d'affichage", "gamap.intents.a": "Colorimétrie absolue", "gamap.intents.aa": "Apparence absolue", "gamap.intents.aw": "Colorimétrie absolue avec échantillonnage du point blanc", "gamap.intents.la": "Apparence correspondant à la luminance", "*gamap.intents.lp": "Luminance preserving perceptual", "gamap.intents.ms": "Préserver la saturation", "gamap.intents.p": "Perceptuel", "gamap.intents.pa": "Apparence perceptuelle", "gamap.intents.r": "Colorimétrie relative", "gamap.intents.s": "Saturation", "gamap.out_viewcond": "Conditions de visualisation cibles", "gamap.perceptual": "Appliquer la correspondance de l'espace de couleurs à la table perceptuelle", "gamap.profile": "Profil source", "gamap.saturation": "Appliquer la correspondance de l'espace de couleurs à la table de saturation", "gamap.src_viewcond": "Conditions de visualisation sources", "gamap.viewconds.cx": "Transparents sur une table lumineuse", "gamap.viewconds.jd": "Projecteur en environnement obscur", "gamap.viewconds.jm": "Projecteur en environnement sombre", "gamap.viewconds.mb": "Moniteur en environnement de travail lumineux", "gamap.viewconds.md": "Moniteur en environnement de travail assombri", "gamap.viewconds.mt": "Moniteur en environnement de travail type", "gamap.viewconds.ob": "Scène originale - Extérieur lumineux", "*gamap.viewconds.pc": "Critical print evaluation environment (ISO-3664 P1)", "gamap.viewconds.pcd": "CD photo - scène originale en extérieur", "gamap.viewconds.pe": "Environnement de contrôle d'impression (CIE 116-1995)", "gamap.viewconds.pp": "Impression pratique réfléchissante (ISO-3664 P2)", "*gamap.viewconds.tv": "Television/film studio", "gamapframe.title": "Options avancées de correspondance de l'espace de couleurs", "gamut": "Gamut", "gamut.coverage": "Étendue du gamut", "gamut.view.create": "Génération des vues du gamut...", "gamut.volume": "Volume du gamut", "*gamut_mapping.ciecam02": "CIECAM02 gamut mapping", "*gamut_mapping.mode": "Gamut mapping mode", "*gamut_mapping.mode.b2a": "PCS-to-device", "*gamut_mapping.mode.inverse_a2b": "Inverse device-to-PCS", "gamut_plot.tooltip": "Cliquez-tirez la souris à l'intérieur du graphique pour déplacer la zone affichée, ou zoomez avec la molette de la souris et les touches +/-. Double-cliquer réinitialise la zone affichée.", "*generic_name_value_data": "Generic name-value data", "*geometry": "Geometry", "glossy": "Brillant", "go_to_website": "Aller au site Internet", "*gravure": "Gravure", "*gray_tone_response_curve": "Gray tone response curve", "grayscale": "échelle de gris", "green": "Vert", "*green_gamma": "Green gamma", "*green_lab": "Green Lab", "*green_matrix_column": "Green matrix column", "*green_maximum": "Green maximum", "*green_minimum": "Green minimum", "*green_tone_response_curve": "Green tone response curve", "*green_xyz": "Green XYZ", "*grid_steps": "Grid Steps", "hdmi": "HDMI", "*header": "Display calibration and characterization powered by Argyll CMS", "help_support": "Aide et support...", "*host.invalid.lookup_failed": "Invalid host (address lookup failed)", "hue": "Teinte", "*icc_absolute_colorimetric": "ICC-absolute colorimetric", "*icc_version": "ICC version", "if_available": "si disponible", "*illuminant": "Illuminant", "*illuminant_relative_cct": "Illuminant-relative CCT", "*illuminant_relative_lab": "Illuminant-relative Lab", "*illuminant_relative_xyz": "Illuminant-relative XYZ", "*illuminant_xyz": "Illuminant XYZ", "illumination": "Illumination", "in": "Dans", "*info.3dlut_settings": "A 3D LUT (LUT = Look Up Table) or ICC device link profile can be used by 3D LUT or ICC device link capable applications for full display color correction.\n\nCreating several (additional) 3D LUTs from an existing profile\nWith the desired profile selected under “Settings”, uncheck the “Create 3D LUT after profiling” checkbox.\n\nChoosing the right source colorspace and tone response curve\nFor 3D LUTs and ICC device link profiles, the source colorspace and tone response curve need to be set in advance and become a fixed part of the overall color transformation (unlike ICC device profiles which are linked dynamically on-the-fly). As an example, HD video material is usually mastered according to the Rec. 709 standard with either a pure power gamma of around 2.2-2.4 (relative with black output offset of 100%) or Rec. 1886 tone response curve (absolute with black output offset 0%). A split between Rec. 1886-like and pure power is also possible by setting black output offset to a value between 0% and 100%.\n\n“Absolute” vs. “relative” gamma\nTo accomodate a non-zero black level of a real display, the tone response curve needs to be offset and scaled accordingly.\n“Absolute” gamma results in an actual output at 50% input which doesn't match that of an idealized power curve (unless the black level is zero).\n“Relative” gamma results in an actual output at 50% input which matches that of an idealized power curve.\n\nRendering intent\nIf you have calibrated to a different whitepoint than the one mandated by the source colorspace, and want to use that for the 3D LUT instead, select “Relative colorimetric”. Otherwise, select “Absolute colorimetric with white point scaling” (white point scaling will prevent clipping in absolute colorimetric mode that could happen if the source colorspace whitepoint is outside of the display gamut). You also have the option to use a non-colorimetric rendering intent that may compress or expand the source colorspace to fit within the display gamut (not recommended when colorimetric accuracy is required).", "info.calibration_settings": "La Calibration est faite en ajustant l'affichage de manière interactive afin d'obtenir le point blanc choisi et/ou la luminance mais sert également à la création de courbes de calibration 1D LUT (LUT = Look Up Table) de manière à obtenir la courbe des tons choisie et à assurer une bonne balance de gris. Notez que si durant la calibration vous voulez seulement ajuster le diffuseur sans passer par la génération des courbes 1D LUT, vous devez paramétrer la courbe des tons sur “Tel que mesuré”. La calibration 1D LUT ne peut pas être utilisée pour une correction complète des couleurs. Vous devez créer un profil ICC ou une 3D LUT et utiliser des applications qui supportent ces deux formats. La calibration 1D LUT est un complèment à la caractérisation mais également la la calibration 3D LUT. Elle n'est pas indispensable mais conseillée", "info.display_instrument": "Si votre diffuseur est un OLED, Plasma ou une autre technologie à lumière de sortie variable en fonction de l'image, activez la compensation de la dérive du point blanc.\n\nSi votre instrument est un spectromètre et que vous l'utilisez en mode contact sur un diffuseur avec un niveau de noir stable, vous devriez peut-être activer la compensation de la dérive du niveau de noir.\n\nSi votre instrument est un colorimètre, vous devriez utiliser une correction correspondant à votre diffuseur ou à son type de technologie. Veuillez noter que quelques instruments (ColorHug, ColorHug2, K-10, Spyder4/5) peuvent possèder une correction en dur dans certains de leurs modes de mesure.", "info.display_instrument.warmup": "Vous devriez laisser votre diffuseur chauffer au moins 30 minutes avant de commencer les mesures. Si vous utilisez votre instrument en mode contact, il est préférable de le positionner sur votre diffuseur pendant ce temps également.", "info.mr_settings": "Vous pouvez vérifier la précision de correction d'un profil ICC ou d'une 3D LUT via un rapport de mesure qui contient les statistiques avancées sur les erreurs de couleurs à partir de mesures de patchs.\n\nQuand vous vérifiez une 3D LUT, assurez-vous d'utilisez les mêmes paramètres que ceux spécifiés lors de sa création.", "info.profile_settings": "La Caractérisation comme son nom l'indique, est la procédure de caractérisation du diffuseur et l'enregistrement de sa réponse dans un profil ICC. Le profil ICC du diffuseur peut être utilisé par des applications qui supportent le management de couleur ICC pour une correction complète des couleurs du diffuseur, et/ou il peut être utilisé pour créer une 3D LUT (LUT = Look Up Table) qui a la même fonction pour les applications supportant ce format.", "infoframe.default_text": "", "infoframe.title": "Info", "infoframe.toggle": "Afficher la fenêtre du journal", "initial": "Initial", "initializing_gui": "Initialisation de l'interface graphique utilisateur/trice...", "*ink_jet_printer": "Ink jet printer", "*input_device_profile": "Input device profile", "*input_table": "Input Table", "install_display_profile": "Installer le profil du périphérique d'affichage...", "*install_local_system": "Install system-wide", "*install_user": "Install for current user only", "instrument": "Instrument", "instrument.calibrate": "Placez l'instrument sur une surface sombre, mate ou sur son support de calibrage et appuyez sur Valider pour calibrer l'instrument.", "instrument.calibrate.colormunki": "Réglez le capteur ColorMunki sur la position calibrage et appuyez sur OK pour calibrer l'instrument.", "*instrument.calibrate.reflective": "Place the instrument onto its reflective white reference serial no. %s and press OK to calibrate the instrument.", "instrument.calibrating": "Calibrage de l'instrument...", "*instrument.connect": "Please connect your measurement instrument now.", "instrument.initializing": "Connexion à l'instrument...", "instrument.measure_ambient": "Si votre instrument requiert une coiffe spéciale pour mesurer la lumière ambiante, veuillez l'attacher. Pour mesurer la lumière ambiante, placez l'instrument vers le haut, à côté de l'écran, ou si vous voulez mesurer une cabine de visionnage, placez une carte grise sans métamérisme à l'intérieur de la cabine et pointez l'instrument vers elle. Des instructions complémentaires sur la façon de mesurer la lumière ambiante peuvent être disponibles dans la documentation de votre instrument. Appuyez sur Valider pour commencer la mesure.", "instrument.place_on_screen": "1. Cliquez sur Valider. Après 1 à 3 secondes, la fenêtre de mesure va apparaître.\n2. Placez l'instrument sur la fenêtre de mesure.\n3. Appuyez sur Échap, Q ou Ctrl+C pour abandonner, ou sur toute autre touche pour commencer la mesure.", "*instrument.place_on_screen.madvr": "(%i) Please place your %s on the test area", "instrument.reposition_sensor": "La mesure a échoué car le capteur de l'instrument est dans la mauvaise position. Veuillez corriger la position du capteur, puis cliquer sur OK pour continuer.", "internal": "Interne", "invert_selection": "Inverser la sélection", "*is_embedded": "Is embedded", "*is_illuminant": "Is illuminant", "*is_linear": "Is linear", "laptop.icc": "Ordinateur portable (Gamma 2.2)", "*libXss.so": "X11 screen saver extension", "*library.not_found.warning": "The library “%s” (%s) was not found. Please make sure it is installed before proceeding.", "license": "Licence", "license_info": "Sous licence GPL", "linear": "linéaire", "locale.set": "Réglage local : %s", "log.autoshow": "Afficher la fenêtre du journal automatiquement", "*luminance": "Luminance", "lut_access": "Accès à la table de correspondance", "*madhcnet.outdated": "The installed version of %s found at %s is outdated. Please update to the latest madVR version (at least %i.%i.%i.%i).", "*madtpg.launch.failure": "madTPG was not found or could not be launched.", "*madvr.not_found": "madVR DirectShow filter was not found in the registry. Please make sure it is installed.", "*madvr.outdated": "The used version of madVR is outdated. Please update to the latest version (at least %i.%i.%i.%i).", "magenta": "Magenta", "*make_and_model": "Make and model", "*manufacturer": "Manufacturer", "matrix": "Matrice", "matte": "Mat", "max": "Max", "maximal": "Maximal", "measure": "Mesurer", "measure.darken_background": "Arrière-plan noir", "measure.darken_background.warning": "Attention : si „arrière-plan noir“ est choisi, il couvrira tout l'écran et vous ne pourrez pas voir la fenêtre d'ajustement du périphérique d'affichage ! Si vous avez un réglage multi-écrans, déplacez la fenêtre d'ajustement du périphérique d'affichage vers un autre écran avant de commencer la mesure, ou utilisez le clavier (pour interrompre la mesure, pressez Q. Si la mesure est déjà en cours, attendez un instant puis pressez Q à nouveau).", "*measure.override_display_settle_time_mult": "Override display settle time multiplier", "*measure.override_min_display_update_delay_ms": "Override minimum display update delay", "measure.testchart": "Grille de test de mesure", "measureframe.center": "Centrer", "measureframe.info": "Déplacez la fenêtre de mesure à l'endroit désiré de l'écran et redimensionnez-la si besoin. Pratiquement toute la surface de la fenêtre sera utilisée pour afficher les échantillons à mesurer, le cercle n'est là que pour vous servir de guide pour placer votre périphérique de mesure.\nPlacez le périphérique de mesure sur la fenêtre et cliquez sur « Commencer la mesure ». Pour annuler et revenir à la fenêtre principale, fermez la fenêtre de mesure.", "measureframe.infobutton": "Info", "measureframe.measurebutton": "Commencer la mesure", "measureframe.title": "Zone de mesure", "measureframe.zoomin": "Agrandir", "measureframe.zoommax": "Maximiser / restaurer", "measureframe.zoomnormal": "Taille normale", "measureframe.zoomout": "Réduire", "measurement.play_sound": "Effets sonores au cours des mesures", "measurement.set_save_path": "Enregistrer le fichier de mesure dans le répertoire suivant :", "measurement.untethered": "Mesure autonome", "measurement_file.check_sanity": "Vérifier le fichier de mesure...", "measurement_file.check_sanity.auto": "Vérifier automatiquement les mesures", "measurement_file.check_sanity.auto.warning": "Veuillez noter que la vérification automatique des mesures est une fonctionnalité expérimentale. À utiliser à vos propres risques.", "measurement_file.choose": "Veuillez choisir un fichier de mesure", "measurement_file.choose.colorimeter": "Veuillez choisir un fichier de mesure du colorimètre", "measurement_file.choose.reference": "Veuillez choisir un fichier de mesure du spectromètre", "measurement_mode": "Mode", "measurement_mode.adaptive": "Adaptatif", "measurement_mode.dlp": "DLP", "measurement_mode.factory": "Calibrage d'usine", "measurement_mode.generic": "Générique", "measurement_mode.highres": "Haute résolution", "measurement_mode.lcd": "LCD (générique)", "measurement_mode.lcd.ccfl": "LCD (CCFL)", "measurement_mode.lcd.ccfl.2": "LCD (CCFL type 2)", "measurement_mode.lcd.oled": "LCD (OLED)", "measurement_mode.lcd.white_led": "LCD (LED blanc)", "measurement_mode.lcd.wide_gamut.ccfl": "LCD à gamut étendu (CCFL)", "measurement_mode.lcd.wide_gamut.rgb_led": "LCD à gamut étendu (LED RVB)", "measurement_mode.raw": "Brut", "measurement_mode.refresh": "À rafraîchissement (générique)", "measurement_report": "Rapport de mesure...", "measurement_report.update": "Mettre à jour le rapport de mesure...", "measurement_report_choose_chart": "Veuillez choisir la grille de test à mesurer.", "measurement_report_choose_chart_or_reference": "Veuillez choisir une grille de test ou une référence.", "measurement_report_choose_profile": "Veuillez choisir le profil à valider.", "*measurement_type": "Measurement type", "measurements.complete": "Mesures effectuées ! Voulez-vous ouvrir le répertoire contenant les fichiers de mesure ?", "measuring.characterization": "Mesure des échantillons de couleurs pour la caractérisation...", "*media_black_point": "Media black point", "*media_relative_colorimetric": "Media-relative colorimetric", "*media_white_point": "Media white point", "menu.about": "À propos...", "menu.file": "Fichier", "menu.help": "?", "menu.language": "Langue", "menu.options": "Options", "menu.tools": "Outils", "menuitem.quit": "Quitter", "menuitem.set_argyll_bin": "Localiser les exécutables Argyll CMS...", "*metadata": "Metadata", "min": "Min", "minimal": "Minimal", "*model": "Model", "*named_color_profile": "Named color profile", "*named_colors": "Named colors", "native": "Natif", "*negative": "Negative", "no": "Non", "no_settings": "Le fichier ne contient pas de réglages.", "*none": "None", "*not_applicable": "Not applicable", "*not_connected": "Not connected", "*not_found": "“%s” was not found.", "*not_now": "Not now", "*number_of_entries": "Number of entries", "*number_of_entries_per_channel": "Number of entries per channel", "*observer": "Observer", "*observer.1931_2": "CIE 1931 2°", "*observer.1955_2": "Stiles & Birch 1955 2°", "*observer.1964_10": "CIE 1964 10°", "*observer.1964_10c": "CIE 1964 10° / 1931 2° hybrid", "*observer.1978_2": "Judd & Voss 1978 2°", "*observer.shaw": "Shaw & Fairchild 1997 2°", "*oem.import.auto": "If your colorimeter came with a software CD for Windows, please insert it now (abort any possibly automatic software installation).\n\nIf you don't have a CD and the required files cannot be found otherwise, they will be downloaded from the Web.", "*oem.import.auto.download_selection": "A preselection was made based on the detected instrument(s). Please select the file(s) to download (total download size can add up to several hundred MB depending on the selection).", "*oem.import.auto_windows": "If the vendor software for your colorimeter is installed, the required files can be found automatically in most cases.", "office_web.icc": "Bureautique & Internet (D65, Gamma 2.2)", "offset": "Décalage", "*offset_lithography": "Offset lithography", "ok": "Valider", "or": "ou", "osd": "OSD", "other": "Autre", "out": "Hors", "*out_of_gamut_tag": "Out of gamut tag", "output.profile": "Profil cible", "*output_device_profile": "Output device profile", "*output_offset": "Output offset", "*output_table": "Output Table", "overwrite": "Écraser", "panel.surface": "Surface du panneau", "panel.type": "Type de panneau", "*passive_matrix_display": "Passive matrix display", "*patch.layout.select": "Please select a patch layout:", "patches": "Échantillons", "*patterngenerator.prisma.specify_host": "Please specify the hostname of your Prisma Video Processor, e.g. prisma-0123 (Windows) or prisma-0123.local (Linux/Mac OS X). You can find the hostname on a label at the underside of the Prisma, unless it was changed via the Prisma's administrative web interface. Alternatively, enter the IP address (if known), e.g. 192.168.1.234", "*patterngenerator.sync_lost": "Lost sync with the pattern generator.", "pause": "Pause", "*pcs_illuminant_xyz": "PCS illuminant XYZ", "*pcs_relative_cct": "PCS-relative CCT", "*pcs_relative_lab": "PCS-relative Lab", "*pcs_relative_xyz": "PCS-relative XYZ", "*pcs_to_device_intent_0": "PCS to device: Intent 0", "*pcs_to_device_intent_1": "PCS to device: Intent 1", "*pcs_to_device_intent_2": "PCS to device: Intent 2", "*perceptual": "Perceptual", "photo.icc": "Photographie (D50, Gamma 2.2)", "*photo_imagesetter": "Photo imagesetter", "*photographic_paper_printer": "Photographic paper printer", "*platform": "Platform", "please_wait": "Veuillez patienter...", "*port.invalid": "Invalid port: %s", "*positive": "Positive", "*preferred_cmm": "Preferred CMM", "prepress.icc": "Pré-presse (D50, 130 cd/m², L*)", "preset": "Pré-réglage", "preview": "Aperçu", "profile": "Profil", "profile.advanced_gamap": "Avancé...", "*profile.b2a.hires": "Enhance effective resolution of colorimetric PCS-to-device table", "*profile.b2a.lowres.warning": "The profile is seemingly missing high-quality PCS-to-device tables, which are essential for proper operation. Do you want to generate high-quality tables now? This will take a few minutes.", "*profile.b2a.smooth": "Smoothing", "profile.choose": "Veuillez choisir un profil.", "profile.confirm_regeneration": "Voulez-vous régénérer le profil ?", "profile.created": "Le profil a été créé avec succès.", "profile.current": "Profil courant", "profile.do_not_install": "Ne pas installer le profil", "*profile.iccv4.unsupported": "Version 4 ICC profiles are not supported.", "*profile.import.success": "The profile has been imported. You may need to manually assign and activate it under “Color” system settings.", "profile.info": "Information du profil", "profile.info.show": "Afficher l'information du profil", "profile.install": "Installer le profil", "profile.install.error": "Le profil n'a pas pu être installé/activé.", "profile.install.osx_manual_select": "Le profil a été installé. Veuillez l'activer dans le panneau « Écrans » des préférences du système.", "profile.install.success": "Le profil a été installé et activé.", "profile.install.virtual.unsupported": "Les profils ne peuvent être installés pour le périphérique d'affichage virtuel.", "*profile.install.warning": "The profile has been installed, but there may be problems.", "profile.install_local_system": "Installer le profil sur l'ensemble du système", "profile.install_network": "Installer le profil sur l'ensemble du réseau", "profile.install_user": "Installer le profil pour l'utilisateur courant uniquement", "profile.invalid": "Profil invalide.", "profile.load_error": "Le profil d'affichage n'a pu être chargé.", "profile.load_on_login": "Charger le calibrage à la connexion", "profile.load_on_login.handled_by_os": "Laisser le système d'exploitation traiter le chargement du calibrage (faible précision et de la fiabilité)", "profile.name": "Nom du profil", "profile.name.create": "Générer le nom du profil", "profile.name.placeholders": "Vous pouvez utiliser les paramètres de substitution suivants dans le nom du profil :\n\n%a Nom du jour de la semaine abrégé\n%A Nom complet du jour de la semaine\n%b Nom du mois abrégé\n%B Nom complet du mois\n%d Jour du mois\n%H Heure (sur 24 heures)\n%I Heure (sur 12 heures)\n%j Jour de l'année\n%m Mois\n%M Minute\n%p AM/PM\n%S Secondes\n%U Semaine (avec dimanche comme premier jour de la semaine)\n%w Jour de la semaine (dimanche correspondant à 0)\n%W Semaine (avec lundi comme premier jour de la semaine)\n%y Année sans le siècle\n%Y Année avec le siècle", "profile.no_embedded_ti3": "Le profil ne contient pas de donnée de mesure compatible avec Argyll.", "profile.no_vcgt": "Le profil ne contient pas de courbes d'une table de correspondance", "*profile.only_named_color": "Only profiles of type “Named Color” can be used.", "profile.quality": "Qualité du profil", "profile.quality.b2a.low": "Table B2A de basse qualité", "profile.quality.b2a.low.info": "Choisissez cette option si le profil doit être utilisé avec un mappage de gamut A2B inverse pour créer une liaison entre périphériques ou une table de correspondance 3D", "profile.required_tags_missing": "Le profil manque des balises : %s", "profile.self_check": "Auto-contrôle du profil ΔE*76", "profile.self_check.avg": "moyenne", "profile.self_check.max": "maximum", "profile.self_check.rms": "RMS", "profile.set_save_path": "Sélectionner le chemin d'enregistrement...", "profile.settings": "Réglages de la caractérisation", "profile.share": "Charger le profil...", "profile.share.avg_dE_too_high": "Le profil produit un delta E trop élevé (actuel = %s, seuil = %s).", "*profile.share.b2a_resolution_too_low": "The resolution of the profile's PCS to device tables is too low.", "profile.share.enter_info": "Vous pouvez partager votre profil avec les autres utilisateurs via le service OpenSUSE « ICC Profile Taxi ».\n\nVeuillez fournir une description significative et entrer les propriétés du périphérique d'affichage ci-dessous. Consultez les réglages du périphérique d'affichage depuis l'OSD de votre périphérique d'affichage et n'entrez que les réglages applicables à votre périphérique d'affichage qui ont changé par rapport aux valeurs par défaut.\nExemple : pour la plupart des périphériques d'affichage, il s'agit du nom de la présélection choisie, luminosité, contraste, température des couleurs et/ou niveaux RVB du point blanc, ainsi que le gamma. Sur les portables et notebooks, généralement uniquement la luminosité. Si vous avez modifié des réglages supplémentaires au cours du calibrage de votre périphérique d'affichage, entrez-les également si possible.", "profile.share.meta_missing": "Le profil ne contient pas la méta-information nécessaire.", "profile.share.success": "Profil chargé.", "profile.testchart_recommendation": "Pour une qualité de profil élevée, une grille de test contenant plus d'échantillons est recommandée, mais celle-ci prendra plus de temps à mesurer. Voulez-vous utiliser la grille de test recommandée ?", "profile.type": "Type de profil", "profile.type.gamma_matrix": "Gamma + matrice", "profile.type.lut.lab": "Table L*a*b*", "profile.type.lut.xyz": "Table XYZ", "profile.type.lut_matrix.xyz": "Table XYZ + matrice", "profile.type.lut_rg_swapped_matrix.xyz": "Table XYZ + matrice d'inversion", "profile.type.shaper_matrix": "Courbes + matrice", "profile.type.single_gamma_matrix": "Gamma unique + matrice", "profile.type.single_shaper_matrix": "Courbe unique + matrice", "profile.unsupported": "Type de profil (%s) ou espace de couleurs (%s) non supporté.", "profile.update": "Mettre à jour le profil", "*profile_class": "Profile class", "*profile_connection_space_pcs": "Profile connection space (PCS)", "*profile_loader": "Profile loader", "*profile_loader.exit_warning": "Do you really want to quit the profile loader? Calibration will no longer be automatically reloaded if you change the display configuration!", "*profile_loader.fix_profile_associations": "Automatically fix profile associations", "*profile_loader.fix_profile_associations_warning": "As long as the profile loader is running, it can take care of profile associations when you change the display configuration.\n\nBefore you proceed, please make sure the profile associations shown above are correct. If they aren't, follow these steps:\n\n1. Open Windows display settings.\n2. Activate all connected displays (extended desktop).\n3. Open Windows color management settings from the Windows control panel.\n4. Make sure each display device has the correct profile assigned. Then close color management settings.\n5. In Windows display settings, revert to the previous display configuration and close display settings.\n6. Now you can enable “Automatically fix profile associations”.", "*profile_loader.info": "Calibration state was (re)applied %i time(s) so far today.\nRight-click icon for menu.", "profiling": "Caractérisation", "profiling.complete": "Caractérisation achevée.", "profiling.incomplete": "La caractérisation n'a pas été achevée.", "*projection_television": "Projection television", "projector": "Projecteur", "projector_mode_unavailable": "Le mode Projecteur n'est disponible qu'avec Argyll CMS 1.1.0 Bêta ou ultérieur.", "quality.ultra.warning": "La qualité Ultra ne devrait pratiquement jamais être utilisée, excepté pour prouver qu'elle ne devrait pratiquement jamais être utilisée (durée de traitement longue). Préférez plutôt une qualité moyenne ou élevée.", "readme": "Lisez-moi", "ready": "Prêt.", "red": "Rouge", "*red_gamma": "Red gamma", "*red_lab": "Red Lab", "*red_matrix_column": "Red matrix column", "*red_maximum": "Red maximum", "*red_minimum": "Red minimum", "*red_tone_response_curve": "Red tone response curve", "*red_xyz": "Red XYZ", "reference": "Référence", "*reflective": "Reflective", "*reflective_scanner": "Reflective scanner", "*remaining_time": "Remaining time (ca.)", "rendering_intent": "Intention de rendu", "report.calibrated": "Établir un rapport sur le périphérique d'affichage calibré", "report.uncalibrated": "Établir un rapport sur le périphérique d'affichage non calibré", "report.uniformity": "Mesurer l'uniformité du périphérique d'affichage...", "resources.notfound.error": "Erreur fatale - un fichier requis n'a pas été trouvé :", "resources.notfound.warning": "Attention - des fichiers requis n'ont pas été trouvés :", "*response.invalid": "Invalid response from %s: %s", "*response.invalid.missing_key": "Invalid response from %s: Missing key “%s”: %s", "*response.invalid.value": "Invalid response from %s: Value of key “%s” does not match expected value “%s”: %s", "restore_defaults": "Restaurer les valeurs par défaut", "rgb.trc": "Fonction de transfert RVB", "rgb.trc.averaged": "Fonction de transfert RVB moyen", "*sRGB.icc": "sRGB", "saturation": "Saturation", "save": "Enregistrer", "save_as": "Enregistrer sous...", "*scripting-client": "DisplayCAL Scripting Client", "*scripting-client.cmdhelptext": "Press the tab key at an empty command prompt to view the possible commands in the current context, or to auto-complete already typed initial letters. Type “getcommands” for a list of supported commands and possible parameters for the connected application.", "*scripting-client.detected-hosts": "Detected scripting hosts:", "select_all": "Sélectionner tout", "setting.keep_current": "Conserver le réglage actuel", "settings.additional": "Réglages supplémentaires", "settings.basic": "Réglages basiques", "settings.new": "", "settings_loaded": "Les courbes de la table de correspondance et les réglages de calibrage suivants ont été chargés : %s. Les autres options de calibrage ont été restaurés à leurs valeurs par défaut et les options de caractérisation n'ont pas été modifiées.", "settings_loaded.all": "Les réglages et les courbes de la table de correspondance ont été chargés.", "settings_loaded.cal": "Le profil ne contenait que des réglages de calibrage. Les autres options n'ont pas été modifiées. Aucune courbe de calibrage n'a été trouvée.", "settings_loaded.cal_and_lut": "Le profil ne contenait que des réglages de calibrage. Les autres options n'ont pas été modifiées et les courbes de calibrage ont été chargées.", "settings_loaded.cal_and_profile": "Les réglages ont été chargés. Aucune courbe d'une table de correspondance n'a été trouvée.", "settings_loaded.profile": "Le profil ne contenait que des réglages de caractérisation. Les autres options n'ont pas été modifiées. Aucune courbe d'une table de correspondance n'a été trouvée.", "settings_loaded.profile_and_lut": "Le profil ne contenait que des réglages de caractérisation. Les autres options n'ont pas été modifiées et les courbes de la table de correspondance ont été chargées.", "show_advanced_options": "Afficher les options avancées", "*silkscreen": "Silkscreen", "simulation_profile": "Profil de simulation", "*size": "Size", "*softproof.icc": "Softproof (D55, 160 cd/m², L*)", "spectral": "Spectral", "startup": "Démarrage...", "*startup_sound.enable": "Enable startup sound", "success": "... opération effectuée.", "*surround_xyz": "Surround XYZ", "synthicc.create": "Créer un profil ICC synthétique...", "target": "Cible", "tc.3d": "Créer un fichier de diagnostic 3D", "tc.I": "Grille cubique centrée de l'espace perceptuel", "tc.Q": "Distribution quasi-aléatoire du remplissage de l'espace perceptuel", "tc.R": "Distribution aléatoire dans l'espace perceptuel", "tc.adaption": "Adaptation", "tc.algo": "Distribution", "tc.angle": "Angle", "tc.black": "Échantillons de noir", "tc.dark_emphasis": "Accentuation des zones sombres", "tc.fullspread": "Échantillons itératifs", "tc.gray": "Échantillons neutres", "tc.i": "Grille cubique centrée de l'espace du périphérique", "tc.limit.sphere": "Limiter les sondages à la sphère", "tc.limit.sphere_radius": "Rayon", "tc.multidim": "Multidimensionnel", "tc.multidim.patches": "étapes = %s échantillons (%s neutres)", "tc.neutral_axis_emphasis": "Accentuation de l'axe neutre", "tc.ofp": "Échantillonnage optimisé du point le plus éloigné", "tc.patch": "Échantillon", "tc.patches.gray": "neutre", "tc.patches.selected": "sélectionné(s) ", "tc.patches.total": "Nombre total d'échantillons ", "tc.precond": "Préconditionnement du profil", "*tc.precond.notset": "Please select a preconditioning profile.", "tc.preview.create": "Création de l'aperçu en cours, veuillez patienter...", "tc.q": "Distribution quasi-aléatoire du remplissage de l'espace du périphérique", "tc.r": "Distribution aléatoire dans l'espace du périphérique", "tc.single": "Échantillons de canal unique", "tc.single.perchannel": "par canal", "tc.t": "Échantillonnage incrémentiel du point éloigné", "tc.vrml.black_offset": "Décalage du noir RGB (L*)", "tc.vrml.device": "Emplacements des périphériques", "tc.vrml.lab": "Emplacements des Lab", "tc.vrml.save_as": "Enregistrer le(s) fichier(s) sous...", "tc.vrml.use_D50": "Blanc RGB neutre", "tc.white": "Échantillons de blancs", "technology": "Technologie", "tempdir_should_still_contain_files": "Les fichiers créés devraient être encore dans le répertoire temporaire “%s”.", "testchart.add_saturation_sweeps": "Ajouter des courbes de saturation", "testchart.add_ti3_patches": "Ajouter des échantillons de référence...", "*testchart.auto_optimize.untethered.unsupported": "The untethered virtual display does not support testchart auto-optimization.", "testchart.change_patch_order": "Changer l'ordre des échantillons", "testchart.confirm_select": "Fichier enregistré. Voulez-vous sélectionner cette grille de test ?", "testchart.create": "Créer une grille de test", "testchart.discard": "Supprimer", "testchart.dont_select": "Ne pas sélectionner", "testchart.edit": "Éditer la grille de test...", "testchart.export.repeat_patch": "Répéter chaque échantillon :", "testchart.file": "Grille de test", "testchart.info": "Nombre d'échantillons de la grille de test sélectionnée", "testchart.invalid": "Le fichier de grille de test est invalide.", "testchart.optimize_for_untethered_auto_mode": "Optimiser pour Autonome en mode automatique", "testchart.patches_amount": "Nombre de patches", "testchart.read": "Lecture de la grille de test...", "testchart.save_or_discard": "La grille de test n'a pas été enregistrée.", "testchart.select": "Sélectionner", "*testchart.separate_fixed_points": "Please choose the patches to add in a separate step.", "testchart.set": "Sélectionner un fichier de grille de test", "*testchart.sort_RGB_blue_to_top": "Sort RGB blue to top", "*testchart.sort_RGB_cyan_to_top": "Sort RGB cyan to top", "testchart.sort_RGB_gray_to_top": "Ordonner le gris RGB vers le haut", "*testchart.sort_RGB_green_to_top": "Sort RGB green to top", "*testchart.sort_RGB_magenta_to_top": "Sort RGB magenta to top", "*testchart.sort_RGB_red_to_top": "Sort RGB red to top", "testchart.sort_RGB_white_to_top": "Ordonner le blanc RGB vers le haut", "*testchart.sort_RGB_yellow_to_top": "Sort RGB yellow to top", "testchart.sort_by_HSI": "Ordonner par HSI", "testchart.sort_by_HSL": "Ordonner par HSL", "testchart.sort_by_HSV": "Ordonner par HSV", "testchart.sort_by_L": "Ordonner par L*", "testchart.sort_by_RGB": "Ordonner par RGB", "testchart.sort_by_RGB_sum": "Ordonner par somme de RGB", "testchart_or_reference": "Grille de test ou référence", "*thermal_wax_printer": "Thermal wax printer", "tone_values": "Valeurs de teinte", "transfer_function": "Fonction de transfert", "translations": "Traductions ", "transparency": "Transparence", "trashcan.linux": "corbeille", "trashcan.mac": "corbeille", "trashcan.windows": "corbeille", "trc": "Courbe des tons", "*trc.dicom": "DICOM", "trc.gamma": "Gamma", "trc.lstar": "L*", "trc.rec1886": "Rec. 1886", "trc.rec709": "Rec. 709", "trc.should_use_viewcond_adjust": "Si vous utilisez les courbes SMPTE 240M, Rec. 709 ou sRVB, vous devriez recourir à un ajustement des niveaux de votre lumière ambiante afin d'obtenir des résultats corrects. Pour cela, cochez la case à côté de « Niveau de luminosité ambiante » et saisissez une valeur en Lux. Vous pouvez éventuellement mesurer aussi la luminosité ambiante au cours du calibrage, si votre instrument le permet.", "*trc.smpte2084": "SMPTE 2084", "trc.smpte240m": "SMPTE 240M", "trc.srgb": "sRVB", "trc.type.absolute": "Absolu", "trc.type.relative": "Relatif", "turn_off": "Désactiver", "type": "Type", "*udev_hotplug.unavailable": "Neither udev nor hotplug detected.", "uninstall_display_profile": "Désinstallation du profil du périphérique d'affichage...", "unknown": "inconnu", "*unmodified": "Unmodified", "unnamed": "Sans nom", "update_check": "Vérifier la mise à jour de l'application...", "update_check.fail": "Échec de la vérification de la mise à jour de l'application :", "update_check.fail.version": "La version du fichier distant du serveur %s n'a pu être analysée.", "update_check.new_version": "Une mise à jour est disponible : %s", "update_check.onstartup": "Vérifier la mise à jour de l'application au démarrage", "update_check.uptodate": "%s est à jour.", "update_now": "Mettre à jour maintenant", "upload": "Chargement", "*use_fancy_progress": "Use fancy progress dialog", "use_separate_lut_access": "Utiliser un accès séparé à la table du gamma de la carte vidéo", "use_simulation_profile_as_output": "Utiliser un profil de simulation comme profil cible", "vcgt": "Courbes de calibrage", "*vcgt.mismatch": "The video card gamma tables for display %s do not match the desired state.", "*vcgt.unknown_format": "Unknown video card gamma table format in profile “%s”.", "verification": "Vérification", "verification.settings": "Paramètres de vérification", "verify.ti1": "Grille de test de vérification du profil", "verify_extended.ti1": "Grille de test étendue de vérification du profil", "*verify_grayscale.ti1": "Graybalance verification testchart", "*verify_large.ti1": "Large verification testchart", "*verify_video.ti1": "Verification testchart (video)", "*verify_video_extended.ti1": "Extended verification testchart (video)", "*verify_video_large.ti1": "Large verification testchart (video)", "*verify_video_xl.ti1": "Extra large verification testchart (video)", "*verify_video_xxl.ti1": "XXL verification testchart (video)", "*verify_video_xxxl.ti1": "XXXL verification testchart (video)", "*verify_xl.ti1": "Extra large verification testchart", "*verify_xxl.ti1": "XXL verification testchart", "*verify_xxxl.ti1": "XXXL verification testchart", "vga": "VGA", "video.icc": "Vidéo (D65, Rec. 1886)", "*video_Prisma.icc": "Video 3D LUT for Prisma (D65, Rec. 709 / Rec. 1886)", "*video_ReShade.icc": "Video 3D LUT for ReShade (D65, Rec. 709 / Rec. 1886)", "*video_camera": "Video camera", "*video_card_gamma_table": "Video card gamma table", "video_eeColor.icc": "Video 3D LUT pour eeColor (D65, Rec. 709 / Rec. 1886)", "video_madVR.icc": "Video 3D LUT pour madVR (D65, Rec. 709 / Rec. 1886)", "*video_monitor": "Video monitor", "video_resolve.icc": "Video 3D LUT pour Resolve (D65, Rec. 709 / Rec. 1886)", "view.3d": "Vue 3D", "*viewing_conditions": "Viewing conditions", "*viewing_conditions_description": "Viewing conditions description", "*vrml_to_x3d_converter": "VRML to X3D converter", "warning": "Attention", "warning.already_exists": "Le fichier « %s » existe déjà à l'emplacement choisi et sera écrasé. Voulez-vous continuer ?", "warning.autostart_system": "Le répertoire d'autodémarrage système n'a pu être déterminé.", "warning.autostart_user": "Le répertoire d'autodémarrage spécifique à l'utilisateur/trice n'a pu être déterminé.", "warning.copy_failed_continue": "Le fichier « %s » ne peut être copié sous « %s ». Poursuite...", "warning.discard_changes": "Voulez-vous réellement annuler les modifications des réglages actuels ?", "*warning.input_value_clipping": "Warning: Input values below the target blackpoint will be clipped!", "warning.no_comports_detected": "Aucun instrument n'a pu être détecté.", "warning.suspicious_delta_e": "Attention : des mesures suspectes ont été trouvées. Veuillez noter que ce contrôle suppose un périphérique d'affichage de type sRGB. Si votre périphérique d'affichage diffère de ce pré-supposé (p. ex. s'il a un très grand gamut ou une réponse de ton trop éloignée de sRGB), alors les erreurs trouvées ne sont probablement pas significatives.\n\nUn ou plusieurs de ces critères ont été vérifiés :\n\n• Échantillons consécutifs avec différents nombres RGB, mais ΔE*00 étrangement bas des mesures entre eux.\n• Gris RGB avec nombres RGB croissants par rapport à l'échantillon précédent, mais luminosité décroissante (L*).\n• Gris RGB avec nombres RGB décroissants par rapport à l'échantillon précédent, mais luminosité croissante (L*).\n• ΔE*00 et ΔL*00 ou ΔH*00 ou ΔC*00 anormalement élevés des mesures par rapport à l'équivalent sRGB des nombres RGB.\n\nCeci pourrait signifier des erreurs de mesure. Les valeurs considérées comme problématiques (ce qui ne l'est pas forcément !) sont surlignées en rouge. Contrôlez les mesures soigneusement et marquez celles que vous voulez accepter. Vous pouvez également éditer les valeurs RGB et XYZ.", "warning.suspicious_delta_e.info": "Explication des colonnes Δ :\n\nΔE*00 XYZ A/B : ΔE*00 des valeurs mesurées par rapport aux valeurs mesurées de l'échantillon précédent. Si cette valeur est manquante, elle n'était pas un facteur pendant la vérification. Si elle est présente, alors elle est supposée trop basse.\n\n0.5 ΔE*00 RGB A/B : ΔE*00 de l'équivalent sRGB des nombres RGB par rapport à l'équivalent sRGB des nombres RGB de l'échantillon précédent (avec un facteur de 0,5). Si cette valeur est présente, elle représente la valeur (minimale) de comparaison pendant la vérification pour ΔE*00 XYZ A/B considéré trop bas. Elle sert d'orientation très grossière.\n\nΔE*00 RGB-XYZ : ΔE*00 des valeurs mesurées par rapport à l'équivalent sRGB des nombres RGB.\nΔL*00 RGB-XYZ : ΔL*00 des valeurs mesurées par rapport à l'équivalent sRGB des nombres RGB.\nΔC*00 RGB-XYZ : ΔC*00 des valeurs mesurées par rapport à l'équivalent sRGB des nombres RGB.\nΔH*00 RGB-XYZ : ΔH*00 des valeurs mesurées par rapport à l'équivalent sRGB des nombres RGB.", "*warning.system_file": "Warning: “%s” is a system file. Do you really want to continue?", "webserver.waiting": "Serveur web en attente à", "welcome": "Bienvenue!", "welcome_back": "Bienvenue à nouveau!", "white": "Blanc", "whitepoint": "Point blanc", "whitepoint.colortemp": "Température", "whitepoint.colortemp.locus.blackbody": "Corps noir", "whitepoint.colortemp.locus.curve": "Courbe de température des couleurs", "whitepoint.colortemp.locus.daylight": "Lumière du jour", "whitepoint.set": "Voulez-vous également régler le point blanc à la valeur mesurée ?", "whitepoint.simulate": "Simuler le point blanc", "whitepoint.simulate.relative": "Relatif au point blanc du profil cible", "whitepoint.xy": "Coordonnées chromatiques", "window.title": "DisplayCAL", "windows.version.unsupported": "Cette version de Windows n'est pas supportée.", "windows_only": "Windows uniquement", "working_dir": "Répertoire de travail :", "yellow": "Jaune", "*yellow_lab": "Yellow Lab", "*yellow_xyz": "Yellow XYZ", "yes": "Oui", } DisplayCAL-3.1.0.0/DisplayCAL/lang/it.json0000644000076500000000000024521712653526635017677 0ustar devwheel00000000000000{ "*": "Note to translators: Keys which are not yet translated are marked with a leading asterisk (*) and are indented with two tabs instead of one. Please remove the asterisk when translated.", "!author": "Tommaso Schiavinotto", "!language": "Italiano", "!language_name": "ITALIAN", "*3dlut": "3D LUT", "*3dlut.1dlut.videolut.nonlinear": "The display device's video card gamma tables 1D LUT calibration is non-linear, but the 3D LUT contains applied 1D LUT calibration. Make sure to manually reset the video card gamma tables to linear before using the 3D LUT, or create a 3D LUT without calibration applied (to do the latter, enable “Show advanced options” in the “Options” menu and disable “Apply calibration (vcgt)” as well as “Create 3D LUT after profiling” in the 3D LUT settings, then create a new 3D LUT).", "*3dlut.bitdepth.input": "3D LUT input bitdepth", "*3dlut.bitdepth.output": "3D LUT output bitdepth", "*3dlut.create": "Create 3D LUT...", "*3dlut.create_after_profiling": "Create 3D LUT after profiling", "*3dlut.enable": "Enable 3D LUT", "*3dlut.encoding.input": "Input encoding", "*3dlut.encoding.output": "Output encoding", "*3dlut.encoding.output.warning.madvr": "Warning: This output encoding is not recommended and will cause clipping if madVR is not set up to output “TV levels (16-235)” under “Devices” → “%s” → “Properties”. Use at own risk!", "*3dlut.encoding.type_2": "TV Rec. 2020 YCbCr UHD", "*3dlut.encoding.type_5": "TV Rec. 709 1250/50Hz YCbCr HD", "*3dlut.encoding.type_6": "TV Rec. 601 YCbCr SD", "*3dlut.encoding.type_7": "TV Rec. 709 1125/60Hz YCbCr HD", "*3dlut.encoding.type_C": "TV Rec. 2020 Constant Luminance YCbCr UHD", "*3dlut.encoding.type_T": "TV RGB 16-235 (clip WTW)", "*3dlut.encoding.type_X": "TV xvYCC Rec. 709 YCbCr HD", "*3dlut.encoding.type_n": "Full range RGB 0-255", "*3dlut.encoding.type_t": "TV RGB 16-235", "*3dlut.encoding.type_x": "TV xvYCC Rec. 601 YCbCr (Rec. 709 Primaries) SD", "*3dlut.format": "3D LUT file format", "*3dlut.format.3dl": "Autodesk Lustre / Kodak Look Manager System (.3dl)", "*3dlut.format.ReShade": "ReShade (.png, .fx)", "*3dlut.format.cube": "IRIDAS (.cube)", "*3dlut.format.eeColor": "eeColor Processor (.txt)", "*3dlut.format.madVR": "madVR (.3dlut)", "*3dlut.format.mga": "Pandora (.mga)", "*3dlut.format.png": "PNG (.png)", "*3dlut.format.spi3d": "Sony Imageworks (.spi3d)", "*3dlut.frame.title": "Create 3D LUT", "*3dlut.holder.assign_preset": "Assign 3D LUT to preset:", "*3dlut.holder.out_of_memory": "%s is out of 3D LUT storage space (at least %i KB required). Please delete a few 3D LUTs from %s to make space for new ones. See your %s's documentation for more information.", "*3dlut.input.colorspace": "Source colorspace", "*3dlut.input.profile": "Source profile", "*3dlut.install": "Install 3D LUT", "*3dlut.install.failure": "3D LUT installation failed (unknown error).", "*3dlut.install.success": "3D LUT installation successful!", "*3dlut.install.unsupported": "3D LUT installation is not supported for the selected 3D LUT format.", "*3dlut.save_as": "Save 3D LUT as...", "*3dlut.settings": "3D LUT settings", "*3dlut.size": "3D LUT size", "*3dlut.tab.enable": "Enable 3D LUT tab", "*3dlut.use_abstract_profile": "Abstract (“Look”) profile", "*CMP_Digital_Target-3.cie": "CMP Digital Target 3", "*CMP_Digital_Target-4.cie": "CMP Digital Target 4", "*CMYK_IDEAlliance_ControlStrip_2009.ti1": "IDEAlliance Control Strip 2009", "*ColorChecker.cie": "ColorChecker", "*ColorCheckerDC.cie": "ColorChecker DC", "*ColorCheckerPassport.cie": "ColorChecker Passport", "*ColorCheckerSG.cie": "ColorChecker SG", "*FograStrip2.ti1": "Fogra Media Wedge CMYK V2.0", "*FograStrip3.ti1": "Fogra Media Wedge CMYK V3.0", "*ISO_12646-2008_color_accuracy_and_gray_balance.ti1": "ISO 12646:2008 color accuracy and gray balance", "*QPcard_201.cie": "QPcard 201", "*QPcard_202.cie": "QPcard 202", "*SpyderChecker.cie": "SpyderCHECKR", "*Untethered": "Untethered", "*[rgb]TRC": "Tone response curves", "aborted": "...annullato.", "*aborting": "Aborting, please wait (this may take a few seconds)...", "*abstract_profile": "Abstract profile", "*active_matrix_display": "Active matrix display", "*adaptive_mode_unavailable": "Adaptive mode is only available with Argyll CMS 1.1.0 RC3 or newer.", "*allow_skip_sensor_cal": "Allow skipping of spectrometer self-calibration", "*ambient.measure": "Measure ambient", "*ambient.measure.color.unsupported": "%s: The color of ambient light could not be determined using this instrument because its ambient sensor seems to be monochromatic (only got a light level reading).", "*ambient.measure.light_level.missing": "Didn't get a light level reading.", "*ambient.set": "Do you also want to set the ambient light level to the measured value?", "*app.client.connect": "Scripting client %s:%s connected", "*app.client.disconnect": "Scripting client %s:%s disconnected", "*app.client.ignored": "Refused connection attempt of scripting client %s:%s: %s", "*app.client.network.disallowed": "Refused connection attempt of scripting client %s:%s: Network clients are not allowed.", "app.confirm_restore_defaults": "Vuoi davvero perdere le tue modifiche e usare le impostazioni predefinite?", "*app.detected.calibration_loading_disabled": "Detected %s. Calibration loading disabled.", "*app.detection_lost.calibration_loading_enabled": "No longer detecting %s. Calibration loading enabled.", "*app.incoming_message": "Received scripting request from %s:%s: %s", "*app.incoming_message.invalid": "Scripting request invalid!", "*app.listening": "Setting up scripting host at %s:%s", "*app.otherinstance": "%s is already running.", "*app.otherinstance.notified": "Already running instance has been notified.", "app.restart_request": "Riavviare l'applicazione, prego.", "apply": "Applicare", "*apply_black_output_offset": "Apply black output offset (100%)", "*apply_cal": "Apply calibration (vcgt)", "*apply_cal.error": "Calibration could not be applied.", "*apply_trc": "Apply tone response curve", "*archive.create": "Create compressed archive...", "*archive.import": "Import archive...", "*archive.include_3dluts": "Do you want to include 3D LUT files in the archive (not recommended, leads to larger archive file size)?", "*argyll.debug.warning1": "Please only use this option if you actually need debugging information (e.g. for troubleshooting Argyll CMS functionality)! It is normally only useful for software developers to aid in problem diagnosis and resolution. Are you sure you want to enable debugging output?", "*argyll.debug.warning2": "Please remember to disable debugging output for normal operation of the software.", "argyll.dir": "Directory con gli eseguibili di Argyll CMS:", "argyll.dir.invalid": "Gli eseguibili Argyll CMS non sono stati trovati!\nSeleziona la directory che contiene gli eseguibili (prefisso o suffisso forse “argyll-” / “-argyll”): %s", "*argyll.error.detail": "Detailed Argyll CMS error message:", "*argyll.instrument.configuration_files.install": "Install Argyll CMS instrument configuration files...", "*argyll.instrument.configuration_files.install.success": "Installation of Argyll CMS instrument configuration files complete.", "*argyll.instrument.configuration_files.uninstall": "Uninstall Argyll CMS instrument configuration files...", "*argyll.instrument.configuration_files.uninstall.success": "Uninstallation of Argyll CMS instrument configuration files complete.", "*argyll.instrument.driver.missing": "The Argyll CMS driver for your measurement device seems not to be installed or installed incorrectly. Please check if your measurement device is shown in Windows' Device Manager under „Argyll LibUSB-1.0A devices“ and (re-)install the driver if necessary. Please read the documentation for installation instructions.", "*argyll.instrument.drivers.install": "Install Argyll CMS instrument drivers...", "*argyll.instrument.drivers.install.confirm": "You only need to install the Argyll CMS specific drivers if you have a measurement instrument that is not a ColorMunki Display, i1 Display Pro, Huey, ColorHug, specbos or K-10.\n\nNote: If you already have a vendor driver for your instrument installed, you'll have to use Windows' Device Manager to manually switch to the Argyll CMS driver after it has been installed. To do that, right click on the instrument and select “Update Driver Software...”, then choose “Browse my computer for driver software”, “Let me pick from a list of device drivers on my computer” and finally select the Argyll driver for your instrument from the list.\n\nDo you want to proceed?", "*argyll.instrument.drivers.install.failure": "Installation of Argyll CMS instrument drivers failed.", "*argyll.instrument.drivers.install.restart": "You need to disable Driver Signature Enforcement to install the Argyll CMS instrument drivers. For this purpose, the system needs to be restarted. Select “Troubleshoot” on the page that will appear, then “Advanced Options”, “Startup Settings” and finally “Restart”. On startup, select “Disable Driver Signature Enforcement”. After the restart, choose “Install Argyll CMS instrument drivers...” in the menu again to install the drivers. If you don't see the “Troubleshoot” option, please refer to the DisplayCAL documentation section “Instrument driver installation under Windows” for an alternate method to disable Driver Signature Enforcement.", "*argyll.instrument.drivers.uninstall": "Uninstall Argyll CMS instrument drivers...", "*argyll.instrument.drivers.uninstall.confirm": "Note: Uninstallation doesn't affect instrument drivers that are currently in use, but just removes the driver from Windows' Driver Store. If you want to switch back to an installed vendor-supplied driver for your instrument, you'll have to use Windows' Device Manager to manually switch to the vendor driver. To do that, right click on the instrument and select “Update Driver Software...”, then choose “Browse my computer for driver software”, “Let me pick from a list of device drivers on my computer” and finally select the vendor driver for your instrument from the list.\n\nDo you want to proceed?", "*argyll.instrument.drivers.uninstall.failure": "Uninstallation of Argyll CMS instrument drivers failed.", "*argyll.instrument.drivers.uninstall.success": "Uninstallation of Argyll CMS instrument drivers complete.", "*argyll.util.not_found": "Argyll CMS “%s” executable not found!", "as_measured": "Nativo", "*attributes": "Attributes", "*audio.lib": "Audio module: %s", "*auth": "Authentification", "*auth.failed": "Authentification failed.", "*auto": "Auto", "*auto_optimized": "Auto-optimized", "*autostart_remove_old": "Removing old autostart entry", "*backing_xyz": "Backing XYZ", "*backlight": "Backlight", "*bitdepth": "Bitdepth", "*black": "Black", "*black_lab": "Black Lab", "*black_point": "Black point", "*black_point_compensation": "Black point compensation", "*black_point_compensation.3dlut.warning": "When creating a 3D LUT, the black point compensation profiling setting should be turned off, because it affects the function of the tone curve adjustment. Would you like to turn off black point compensation?", "*black_point_compensation.info": "Black point compensation effectively prevents black crush, but reduces the accuracy of color conversion.", "*black_white": "Black & white", "*black_xyz": "Black XYZ", "*blacklevel": "Black level", "*blue": "Blue", "*blue_gamma": "Blue gamma", "*blue_lab": "Blue Lab", "*blue_matrix_column": "Blue matrix column", "*blue_maximum": "Blue maximum", "*blue_minimum": "Blue minimum", "*blue_tone_response_curve": "Blue tone response curve", "*blue_xyz": "Blue XYZ", "*brightness": "Brightness", "browse": "Selezionare...", "*bug_report": "Report a bug...", "button.calibrate": "Calibra solamente", "button.calibrate_and_profile": "Calibra & Crea profilo", "button.profile": "Crea solamente il profilo", "cal_extraction_failed": "Impossibile estrare i dati di calibrazione dal profilo.", "*calculated_checksum": "Calculated checksum", "*calibrate_instrument": "Spectrometer self-calibration", "*calibration": "Calibration", "calibration.ambient_viewcond_adjust": "Livello della luce ambientale", "calibration.ambient_viewcond_adjust.info": "Per eseguire una correzione sulle condizioni di visualizzazione quando vengono calcolate le curve di calibrazione, spunta la casella ed inserisci il livello della luce ambientale. Se lo strumento lo permette, è possibile misurare la luce ambientale durante la calibrazione.", "calibration.black_luminance": "Livello del nero", "calibration.black_output_offset": "Compensazione per il livello di uscita del nero", "calibration.black_point_correction": "Correzione del punto di nero", "calibration.black_point_correction_choice": "La correzione del punto di nero può essere disabilitata, per ottimizzare il livello di nero ed il rapporto di contrasto (raccomandato per la maggior parte dei monitor LCD), può essere invece abilitata per fare in modo che il nero abbia la stessa tinta del punto di bianco (raccomandato per la maggior parte dei monitor CRT). Imposta la tua preferenza sulla correzione del punto di nero.", "calibration.black_point_rate": "Rapporto", "*calibration.check_all": "Check settings", "calibration.complete": "Calibrazione completa!", "*calibration.create_fast_matrix_shaper": "Create matrix profile", "*calibration.create_fast_matrix_shaper_choice": "Do you want to create a fast matrix shaper profile from calibration measurements or just calibrate?", "*calibration.do_not_use_video_lut": "Do not use video card gamma table to apply calibration", "*calibration.do_not_use_video_lut.warning": "Do you really want to change the recommended setting?", "*calibration.embed": "Embed calibration curves in profile", "calibration.file": "Impostazioni", "calibration.file.invalid": "Il file delle impostazioni scelto non è valido.", "calibration.file.none": "", "calibration.incomplete": "La calibrazione non è stata completata.", "calibration.interactive_display_adjustment": "Correzione interattiva dello schermo", "*calibration.interactive_display_adjustment.black_level.crt": "Select “Start measurement” and adjust your display's brightness and/or RGB offset controls to match the desired level.", "*calibration.interactive_display_adjustment.black_point.crt": "Select “Start measurement” and adjust your display's RGB offset controls to match the desired black point.", "*calibration.interactive_display_adjustment.check_all": "Select “Start measurement” to check on the overall settings.", "*calibration.interactive_display_adjustment.generic_hint.plural": "A good match is obtained if all bars can be brought to the marked position in the center.", "*calibration.interactive_display_adjustment.generic_hint.singular": "A good match is obtained if the bar can be brought to the marked position in the center.", "*calibration.interactive_display_adjustment.start": "Start measurement", "*calibration.interactive_display_adjustment.stop": "Stop measurement", "*calibration.interactive_display_adjustment.white_level.crt": "Select “Start measurement” and adjust your display's contrast and/or RGB gain controls to match the desired level.", "*calibration.interactive_display_adjustment.white_level.lcd": "Select “Start measurement” and adjust your display's backlight/brightness control to match the desired level.", "*calibration.interactive_display_adjustment.white_point": "Select “Start measurement” and adjust your display's color temperature and/or RGB gain controls to match the desired white point.", "calibration.load": "Caricamento delle impostazioni...", "*calibration.load.handled_by_os": "Calibration loading is handled by the operating system.", "calibration.load_error": "Impossibile leggere le curve calibrazione.", "calibration.load_from_cal": "Caricamento delle curve calibrazione dal file di calibrazione...", "calibration.load_from_cal_or_profile": "Caricamento delle curve calibrazione dal file di calibrazione o di profilo...", "calibration.load_from_display_profile": "Caricamento delle curve calibrazione dal profilo corrente dello schermo", "*calibration.load_from_display_profiles": "Load calibration from current display device profile(s)", "calibration.load_from_profile": "Caricamento delle curve di calibrazione dal profilo...", "calibration.load_success": "Lettura delle curve calibrazione completata con successo.", "calibration.loading": "Caricamento delle curve calibrazione da file...", "calibration.loading_from_display_profile": "Caricamento delle curve calibrazione dell'attuale profilo dello schermo in corso...", "calibration.luminance": "Livello di bianco", "*calibration.lut_viewer.title": "Curves", "*calibration.preserve": "Preserve calibration state", "calibration.preview": "Anteprima calibrazione", "calibration.quality": "Qualità calibrazione", "calibration.quality.high": "Alta", "calibration.quality.low": "Bassa", "calibration.quality.medium": "Media", "calibration.quality.ultra": "Ultra", "*calibration.quality.verylow": "Very low", "calibration.reset": "Ripristino curve calibrazione", "calibration.reset_error": "Le curve calibrazione non possono essere ripristinate.", "calibration.reset_success": "Le curve calibrazione sono state ripristinate con successo.", "calibration.resetting": "Ripristino delle curve calibrazione a lineari in corso...", "calibration.settings": "Impostazioni per la calibrazione", "*calibration.show_actual_lut": "Show calibration curves from video card", "*calibration.show_lut": "Show curves", "*calibration.skip": "Continue on to profiling", "calibration.speed": "Velocità calibrazione", "calibration.speed.high": "Alta", "calibration.speed.low": "Bassa", "calibration.speed.medium": "Media", "calibration.speed.veryhigh": "Molto alta", "calibration.speed.verylow": "Molto bassa", "*calibration.start": "Continue on to calibration", "calibration.turn_on_black_point_correction": "Abilita", "calibration.update": "Aggiorna calibrazione", "*calibration.update_profile_choice": "Do you want to also update the calibration curves in the existing profile or just calibrate?", "*calibration.use_linear_instead": "Use linear calibration instead", "calibration.verify": "Verifica calibrazione", "calibration_profiling.complete": "Calibrazione e creazione profilo completati!", "*calibrationloader.description": "Sets ICC profiles and loads calibration curves for all configured display devices", "*can_be_used_independently": "Can be used independently", "cancel": "Annulla", "*cathode_ray_tube_display": "Cathode ray tube display", "*ccxx.ti1": "Testchart for colorimeter correction", "*centered": "Centered", "*channel_1_c_xy": "Channel 1 (C) xy", "*channel_1_gamma_at_50_input": "Channel 1 gamma at 50% input", "*channel_1_is_linear": "Channel 1 is linear", "*channel_1_maximum": "Channel 1 maximum", "*channel_1_minimum": "Channel 1 minimum", "*channel_1_r_xy": "Channel 1 (R) xy", "*channel_1_unique_values": "Channel 1 unique values", "*channel_2_g_xy": "Channel 2 (G) xy", "*channel_2_gamma_at_50_input": "Channel 2 gamma at 50% input", "*channel_2_is_linear": "Channel 2 is linear", "*channel_2_m_xy": "Channel 2 (M) xy", "*channel_2_maximum": "Channel 2 maximum", "*channel_2_minimum": "Channel 2 minimum", "*channel_2_unique_values": "Channel 2 unique values", "*channel_3_b_xy": "Channel 3 (B) xy", "*channel_3_gamma_at_50_input": "Channel 3 gamma at 50% input", "*channel_3_is_linear": "Channel 3 is linear", "*channel_3_maximum": "Channel 3 maximum", "*channel_3_minimum": "Channel 3 minimum", "*channel_3_unique_values": "Channel 3 unique values", "*channel_3_y_xy": "Channel 3 (Y) xy", "*channel_4_k_xy": "Channel 4 (K) xy", "*channels": "Channels", "*characterization_device_values": "Characterization device values", "*characterization_measurement_values": "Characterization measurement values", "*characterization_target": "Characterization target", "checking_lut_access": "Controllo dell'accesso per il calibrazione per il monitor %s...", "*checksum": "Checksum", "*checksum_ok": "Checksum OK", "*chromatic_adaptation_matrix": "Chromatic adaptation matrix", "*chromatic_adaptation_transform": "Chromatic adaptation transform", "*chromaticity_illuminant_relative": "Chromaticity (illuminant-relative)", "*chromecast_limitations_warning": "Please note that Chromecast accuracy is not as good as a directly connected display or madTPG, due to the Chromecast using RGB to YCbCr conversion and upscaling.", "clear": "Pulire", "*color": "Color", "*color.custom": "Custom color", "*color_look_up_table": "Color Look Up Table", "*color_model": "Color model", "*color_space_conversion_profile": "Color space Conversion profile", "*colorant_order": "Colorant order", "*colorants_pcs_relative": "Colorants (PCS-relative)", "*colorconfig_remove_old": "Removing old display configuration file", "*colorimeter_correction.create": "Create colorimeter correction...", "*colorimeter_correction.create.details": "Please check the fields below and change them when necessary. The description should also contain important details (e.g. specific display settings, non-default CIE observer or the like).", "*colorimeter_correction.create.failure": "Correction creation failed.", "*colorimeter_correction.create.info": "To create a colorimeter correction, you first need to measure the required test colors with a spectrometer, and in case you want to create a correction matrix instead of a spectral correction, also with the colorimeter.\nAlternatively you can also use existing measurements by choosing “Browse...”.", "*colorimeter_correction.create.success": "Correction successfully created.", "*colorimeter_correction.file.none": "None", "*colorimeter_correction.import": "Import colorimeter corrections from other display profiling software...", "*colorimeter_correction.import.choose": "Please choose the colorimeter correction file to import.", "*colorimeter_correction.import.failure": "No colorimeter corrections could be imported.", "*colorimeter_correction.import.partial_warning": "Not all colorimeter corrections could be imported from %s. %i of %i entries had to be skipped.", "*colorimeter_correction.import.success": "Colorimeter corrections have been successfully imported from the following softwares:\n\n%s", "*colorimeter_correction.instrument_mismatch": "The selected colorimeter correction is not suitable for the selected instrument.", "*colorimeter_correction.upload": "Upload colorimeter correction...", "*colorimeter_correction.upload.confirm": "Do you want to upload the colorimeter correction to the online database (recommended)? Any uploaded files will be assumed to have been placed in the public domain, so that they can be used freely.", "*colorimeter_correction.upload.deny": "This colorimeter correction may not be uploaded.", "*colorimeter_correction.upload.exists": "The colorimeter correction already exists in the database.", "*colorimeter_correction.upload.failure": "The correction couldn't be entered into the online database.", "*colorimeter_correction.upload.success": "The correction was successfully uploaded to the online database.", "*colorimeter_correction.web_check": "Check online for colorimeter correction...", "*colorimeter_correction.web_check.choose": "The folowing colorimeter corrections for the selected display and instrument have been found:", "*colorimeter_correction.web_check.failure": "No colorimeter corrections for the selected display and instrument have been found.", "*colorimeter_correction_matrix_file": "Correction", "*colorimeter_correction_matrix_file.choose": "Choose colorimeter correction", "*colors_pcs_relative": "Colors (PCS-relative)", "*colorspace": "Colorspace", "*colorspace.show_outline": "Show outline", "commandline": "Linea di comando:", "*commands": "Commands", "*comparison_profile": "Comparison profile", "comport_detected": "È stata rilevata una modifica nella configurazione dello strumento o della porta.", "*compression.gzip": "GZIP compression", "*computer.name": "Computername", "*connected.to.at": "Connected to %s at %s:%s", "*connecting.to": "Connecting to %s:%s...", "*connection.broken": "Connection broken", "*connection.established": "Connection established", "*connection.fail": "Connection error (%s)", "*connection.fail.http": "HTTP error %s", "*connection.waiting": "Waiting for connection at", "continue": "Continua", "*contrast": "Contrast", "*contribute": "Contribute", "*converting": "Converting", "*copyright": "Copyright", "corrected": "corretto", "create_and_preview": "Crea & Mostra anteprima", "*create_ccss_or_ccmx": "Do you want to create a correction matrix for ordinary colorimeters (CCMX) or a calibration spectral sample for the i1 Display Pro and ColorMunki Display (CCSS)?", "create_profile": "Creazione del profilo dai dati di misurazione...", "*create_profile_from_edid": "Create profile from extended display identification data...", "*created": "Created", "*creator": "Creator", "*current": "Current", "custom": "Altro", "*cyan": "Cyan", "*d3-e4-s0-g25-m3-b3-f0-crossover.ti1": "Default testchart for matrix profiles", "*d3-e4-s0-g49-m3-b3-f0-crossover.ti1": "Extended testchart for matrix profiles", "*d3-e4-s0-g9-m3-b3-f0-crossover.ti1": "Small testchart for matrix profiles", "*d3-e4-s0-g97-m3-b3-f0-crossover.ti1": "Very large testchart for matrix profiles", "*d3-e4-s13-g37-m4-b4-f0.ti1": "Small testchart for LUT profiles", "*d3-e4-s17-g49-m5-b5-f0.ti1": "Default testchart for LUT profiles", "*d3-e4-s21-g61-m6-b6-f0.ti1": "Extended testchart for LUT profiles", "*d3-e4-s25-g73-m0-f679-cRec709_Gamma22.ti1": "Large testchart for LUT profiles, optimized for Gamma 2.2 with Rec. 709 primaries (D65)", "*d3-e4-s25-g73-m0-f679-caRGB.ti1": "Large testchart for LUT profiles, optimized for Gamma 2.2 with AdobeRGB primaries (D65)", "*d3-e4-s25-g73-m0-f679-ceRGBv2.ti1": "Large testchart for LUT profiles, optimized for L* with NTSC 1953 primaries (D50)", "*d3-e4-s25-g73-m0-f679-csRGB.ti1": "Large testchart for LUT profiles, optimized for sRGB (D65)", "*d3-e4-s25-g73-m7-b7-f0.ti1": "Large testchart for LUT profiles", "*d3-e4-s29-g85-m0-f994-cRec709_Gamma22.ti1": "Very large testchart for LUT profiles, optimized for Gamma 2.2 with Rec. 709 primaries (D65)", "*d3-e4-s29-g85-m0-f994-caRGB.ti1": "Very large testchart for LUT profiles, optimized for Gamma 2.2 with AdobeRGB primaries (D65)", "*d3-e4-s29-g85-m0-f994-ceRGBv2.ti1": "Very large testchart for LUT profiles, optimized for L* with NTSC 1953 primaries (D50)", "*d3-e4-s29-g85-m0-f994-csRGB.ti1": "Very large testchart for LUT profiles, optimized for sRGB (D65)", "*d3-e4-s29-g85-m8-b8-f0.ti1": "Very large testchart for LUT profiles", "*d3-e4-s33-g97-m0-f1399-cRec709_Gamma22.ti1": "XXL testchart for LUT profiles, optimized for Gamma 2.2 with Rec. 709 primaries (D65)", "*d3-e4-s33-g97-m0-f1399-caRGB.ti1": "XXL testchart for LUT profiles, optimized for Gamma 2.2 with AdobeRGB primaries (D65)", "*d3-e4-s33-g97-m0-f1399-ceRGBv2.ti1": "XXL testchart for LUT profiles, optimized for L* with NTSC 1953 primaries (D50)", "*d3-e4-s33-g97-m0-f1399-csRGB.ti1": "XXL testchart for LUT profiles, optimized for sRGB (D65)", "*d3-e4-s33-g97-m9-b9-f0.ti1": "XXL testchart for LUT profiles", "*d3-e4-s37-g109-m0-f1906-cRec709_Gamma22.ti1": "XXXL testchart for LUT profiles, optimized for Gamma 2.2 with Rec. 709 primaries (D65)", "*d3-e4-s37-g109-m0-f1906-caRGB.ti1": "XXXL testchart for LUT profiles, optimized for Gamma 2.2 with AdobeRGB primaries (D65)", "*d3-e4-s37-g109-m0-f1906-ceRGBv2.ti1": "XXXL testchart for LUT profiles, optimized for L* with NTSC 1953 primaries (D50)", "*d3-e4-s37-g109-m0-f1906-csRGB.ti1": "XXXL testchart for LUT profiles, optimized for sRGB (D65)", "*d3-e4-s37-g109-m10-b10-f0.ti1": "XXXL testchart for LUT profiles", "*d3-e4-s41-g121-m0-f2527-cRec709_Gamma22.ti1": "Massive testchart for LUT profiles, optimized for Gamma 2.2 with Rec. 709 primaries (D65)", "*d3-e4-s41-g121-m0-f2527-caRGB.ti1": "Massive testchart for LUT profiles, optimized for Gamma 2.2 with AdobeRGB primaries (D65)", "*d3-e4-s41-g121-m0-f2527-ceRGBv2.ti1": "Massive testchart for LUT profiles, optimized for L* with NTSC 1953 primaries (D50)", "*d3-e4-s41-g121-m0-f2527-csRGB.ti1": "Massive testchart for LUT profiles, optimized for sRGB (D65)", "*d3-e4-s41-g121-m11-b11-f0.ti1": "Massive testchart for LUT profiles", "*deactivated": "deactivated", "*default": "Default", "*default.icc": "Default (Gamma 2.2)", "*default_crt": "Default CRT", "*default_rendering_intent": "Default rendering intent", "*delete": "Delete", "*delta_e_2000_to_blackbody_locus": "ΔE 2000 to blackbody locus", "*delta_e_2000_to_daylight_locus": "ΔE 2000 to daylight locus", "*delta_e_to_locus": "ΔE*00 to %s locus", "*description": "Description", "*description_ascii": "Description (ASCII)", "*description_macintosh": "Description (Macintosh)", "*description_unicode": "Description (Unicode)", "*deselect_all": "Deselect all", "detect_displays_and_ports": "Rileva schermo e strumenti", "*device": "Device", "*device.name.placeholder": "", "*device_color_components": "Device color components", "*device_manager.launch": "Launch Device Manager", "*device_manufacturer_name": "Device manufacturer name", "*device_manufacturer_name_ascii": "Device manufacturer name (ASCII)", "*device_manufacturer_name_macintosh": "Device manufacturer name (Macintosh)", "*device_manufacturer_name_unicode": "Device manufacturer name (Unicode)", "*device_model_name": "Device model name", "*device_model_name_ascii": "Device model name (ASCII)", "*device_model_name_macintosh": "Device model name (Macintosh)", "*device_model_name_unicode": "Device model name (Unicode)", "*device_to_pcs_intent_0": "Device to PCS: Intent 0", "*device_to_pcs_intent_1": "Device to PCS: Intent 1", "*device_to_pcs_intent_2": "Device to PCS: Intent 2", "*devicelink_profile": "DeviceLink profile", "*dialog.argyll.notfound.choice": "Argyll CMS, the color engine that is needed to run DisplayCAL, doesn't seem to be installed on this computer. Dow you want to automatically download it or browse for it manually?", "*dialog.cal_info": "The calibration file “%s” will be used. Do you want to continue?", "*dialog.confirm_cancel": "Do you really want to cancel?", "*dialog.confirm_delete": "Do you really want to delete the selected file(s)?", "dialog.confirm_overwrite": "Il file “%s” già esiste. Sovrascrivere?", "*dialog.current_cal_warning": "The current calibration curves will be used. Do you want to continue?", "dialog.do_not_show_again": "Non mostrare più questo messaggio", "*dialog.enter_password": "Please enter your password.", "dialog.install_profile": "Installare il profilo “%s” e renderlo quello predefinito per il monitor “%s”?", "*dialog.linear_cal_info": "Linear calibration curves will be used. Do you want to continue?", "dialog.load_cal": "Caricamento impostazioni", "*dialog.select_argyll_version": "Version %s of Argyll CMS was found. The currently selected version is %s. Do you want to use the newer version?", "dialog.set_argyll_bin": "Individuare la cartella dove si trovano gli eseguibili di Argyll CMS.", "dialog.set_profile_save_path": "Creare la directory dei profili “%s” qui:", "dialog.set_testchart": "Scegliere il file con il testchart", "dialog.ti3_no_cal_info": "I dati di misurazione non contengono curve di calibrazione. Continuare?", "*digital_camera": "Digital camera", "*direction.backward": "PCS → B2A → device", "*direction.backward.inverted": "PCS ← B2A ← device", "*direction.forward": "Device → A2B → PCS", "*direction.forward.inverted": "Device ← A2B ← PCS", "*disconnected.from": "Disconnected from %s:%s", "display": "Schermo", "*display-instrument": "Display & instrument", "*display.connection.type": "Connection", "*display.manufacturer": "Display device manufacturer", "*display.output": "Output #", "display.primary": "(Primario)", "*display.properties": "Display device properties", "*display.reset.info": "Please reset the display device to factory defaults, then adjust its brightness to a comfortable level.", "*display.settings": "Display device settings", "*display.tech": "Display technology", "display_detected": "Rilevato un cambiamento nella configurazione dello schermo.", "*display_device_profile": "Display device profile", "display_lut.link": "Collega/Scollega schermo e accesso a calibrazione", "*display_profile.not_detected": "No current profile detected for display “%s”", "*display_profile.save_as": "The current profile for display “%s” only exists in memory. Please save it to a file first.", "*display_short": "Display device (abbreviated)", "*displayport": "DisplayPort", "*dlp_screen": "DLP Screen", "*donation_header": "Your support is appreciated!", "*donation_message": "If you would like to support the development of, technical assistance with, and continued availability of DisplayCAL and Argyll CMS, please consider a financial contribution. As DisplayCAL wouldn't be useful without Argyll CMS, all contributions received for DisplayCAL will be split between both projects.\nFor light personal non-commercial use, a one-time contribution may be appropriate. If you're using DisplayCAL professionally, an annual or monthly contribution would make a great deal of difference in ensuring that both projects continue to be available.\n\nThanks to all contributors!", "*download": "Download", "*download_fail_empty_response": "Download failed: %s returned an empty document.", "*download_fail_wrong_size": "Download failed: The file does not have the expected size of %s bytes (received %s bytes).", "*downloading": "Downloading", "*drift_compensation.blacklevel": "Black level drift compensation", "*drift_compensation.blacklevel.info": "Black level drift compensation tries to counter measurement deviations caused by black calibration drift of a warming up measurement device. For this purpose, a black test patch is measured periodically, which increases the overall time needed for measurements. Many colorimeters have built-in temperature compensation, in which case black level drift compensation should not be needed, but most spectrometers are not temperature compensated.", "*drift_compensation.whitelevel": "White level drift compensation", "*drift_compensation.whitelevel.info": "White level drift compensation tries to counter measurement deviations caused by luminance changes of a warming up display device. For this purpose, a white test patch is measured periodically, which increases the overall time needed for measurements.", "*dry_run": "Dry run", "*dry_run.end": "Dry run ended.", "*dry_run.info": "Dry run. Check the log to see the command line.", "*dvi": "DVI", "*dye_sublimation_printer": "Dye sublimation printer", "*edid.crc32": "EDID CRC32 checksum", "*edid.serial": "EDID serial", "elapsed_time": "Tempo trascorso", "*electrophotographic_printer": "Electrophotographic printer", "*electrostatic_printer": "Electrostatic printer", "*enable_argyll_debug": "Enable Argyll CMS debugging output", "enable_spyder2": "Attivazione colorimetro Spyder 2...", "enable_spyder2_failure": "Impossibile attivare Spyder 2 .", "enable_spyder2_success": "Spyder 2 attivato con successo.", "*entries": "Entries", "*enumerate_ports.auto": "Automatically detect instruments", "enumerating_displays_and_comports": "Elenco degli schermi e delle porte di comunicazione in corso...", "*environment": "Environment", "error": "Errore", "*error.access_denied.write": "You do not have write access to %s", "error.already_exists": "Impossibile usare il nome “%s”, perché un altro oggetto con lo stesso nome già esiste. Scegliere un'altro nome o cartella.", "error.autostart_creation": "La creazione della voce di partenza automatica per far caricare a %s le curve di calibrazione è fallita.", "*error.autostart_remove_old": "The old autostart entry which loads calibration curves on login could not be removed: %s", "*error.autostart_system": "The system-wide autostart entry to load the calibration curves on login could not be created, because the system-wide autostart directory could not be determined.", "*error.autostart_user": "The user-specific autostart entry to load the calibration curves on login could not be created, because the user-specific autostart directory could not be determined.", "error.cal_extraction": "Impossibile estrarre la calibrazione da “%s”.", "error.calibration.file_missing": "Manca il file di calibrazione “%s”.", "error.calibration.file_not_created": "Non è stato creato alcun file di calibrazione.", "*error.colorconfig_remove_old": "The old configuration file mapping profiles to displays could not be removed: %s", "error.copy_failed": "Impossibile copiare il file “%s” in “%s”.", "*error.deletion": "An error occured while moving files to the %s. Some files might not have been removed.", "error.dir_creation": "Impossibile creare la cartella “%s”. Forse ci sono restrizioni sull'accesso. Permettere l'accesso in scrittura o scegliere un'altra cartella.", "error.dir_notdir": "Impossibile creare la cartella “%s” perché un altro oggetto con lo stesso nome già esiste. Scegliere un'altra cartella.", "*error.file.create": "The file “%s” could not be created.", "*error.file.open": "The file “%s” could not be opened.", "error.file_type_unsupported": "Tipo di file non gestito.", "error.generic": "Errore di sistema.\n\nCodice d'errore: %s\nMessaggio d'errore: %s", "*error.measurement.file_invalid": "The measurement file „%s“ is invalid.", "error.measurement.file_missing": "Manca il file delle misure “%s”.", "error.measurement.file_not_created": "Non è stato creato alcun file di misure.", "*error.measurement.missing_spectral": "The measurement file does not contain spectral values.", "*error.measurement.one_colorimeter": "Exactly one colorimeter measurement is needed.", "*error.measurement.one_reference": "Exactly one reference measurement is needed.", "error.no_displays_detected": "Non è stato creato alcun file di misurazioni.", "*error.no_files_extracted_from_archive": "No files have been extracted from “%s”.", "*error.not_a_session_archive": "The archive “%s” doesn't seem to be a session archive.", "error.profile.file_missing": "Manca il profilo “%s”.", "error.profile.file_not_created": "Non è stato creato alcun profilo.", "*error.source_dest_same": "Source and target file are the same.", "error.testchart.creation_failed": "Impossibile creare il file di testchart “%s”. Forse ci sono restrizioni sull'accesso oppure il file di origine non esiste.", "error.testchart.invalid": "Il file di testchart “%s” non è valido.", "error.testchart.missing": "Manca il file di testchart “%s”.", "*error.testchart.missing_fields": "The testchart file „%s“ does not contain required fields: %s", "error.testchart.read": "Impossibile leggere il file di testchart “%s”.", "error.tmp_creation": "Impossibile creare una cartella di lavoro temporanea.", "*error.trashcan_unavailable": "The %s is not available. No files were removed.", "*errors.none_found": "No errors found.", "*estimated_measurement_time": "Estimated measurement time approximately %s hour(s) %s minutes", "export": "Esportazione...", "*extra_args": "Set additional commandline arguments...", "*factory_default": "Factory Default", "failure": "...fallito!", "*file.invalid": "File invalid.", "file.missing": "Il file “%s” non esiste.", "file.notfile": "“%s” non è un file.", "*file.select": "Select file", "*filename.upload": "Upload filename", "*filetype.7z": "7-Zip files", "*filetype.any": "Any Filetype", "filetype.cal": "File di calibrazione(*.cal)", "filetype.cal_icc": "File di calibrazione e profilo (*.cal;*.icc;*.icm)", "*filetype.ccmx": "Correction matrices/Calibration spectral samples (*.ccmx;*.ccss)", "*filetype.html": "HTML files (*.html;*.htm)", "filetype.icc": "File di profile (*.icc;*.icm)", "filetype.icc_mpp": "File di profilo (*.icc;*.icm;*.mpp)", "filetype.icc_ti1_ti3": "File di testchart (*.icc;*.icm;*.ti1;*.ti3)", "*filetype.icc_ti3": "Measurement files (*.icc;*.icm;*.ti3)", "filetype.log": "File di log (*.log)", "filetype.png": "Portable Network Graphics (*.png)", "*filetype.tgz": "Compressed TAR archive", "filetype.ti1": "File di testchart (*.ti1)", "*filetype.ti1_ti3_txt": "Testchart files (*.ti1), Measurement files (*.ti3;*.txt)", "filetype.ti3": "File di misurazioni (*.icc;*.icm;*.ti3)", "filetype.tif": "Tagged Image File (*.tif)", "*filetype.txt": "DeviceCorrections.txt", "*filetype.vrml": "VRML files (*.wrl)", "*filetype.x3d": "X3D files (*.x3d)", "*filetype.zip": "ZIP files", "*film_scanner": "Film scanner", "*film_writer": "Film writer", "*finish": "Finish", "*flare": "Flare", "*flexography": "Flexography", "*forced": "forced", "*format.select": "Please select the desired format.", "*gamap.default_intent": "Default rendering intent", "*gamap.intents.a": "Absolute colorimetric", "*gamap.intents.aa": "Absolute appearance", "*gamap.intents.aw": "Absolute colorimetric with white point scaling", "*gamap.intents.la": "Luminance matched appearance", "*gamap.intents.lp": "Luminance preserving perceptual", "*gamap.intents.ms": "Preserve saturation", "*gamap.intents.p": "Perceptual", "*gamap.intents.pa": "Perceptual appearance", "*gamap.intents.r": "Relative colorimetric", "*gamap.intents.s": "Saturation", "gamap.out_viewcond": "Condizioni di visualizzazione obiettivo", "gamap.perceptual": "Applicare la mappatura di gamut alla tabella percettiva", "gamap.profile": "Profilo di origine", "gamap.saturation": "Applicare la mappatura di gamut alla tabella di saturazione", "gamap.src_viewcond": "Condizioni di visualizzazione di partenza", "gamap.viewconds.cx": "Fogli trasparenti ritagliati su una scatola per la visualizzazione", "gamap.viewconds.jd": "Proiettore in un ambiente buio", "gamap.viewconds.jm": "Proiettore in un ambiente con luce soffusa", "gamap.viewconds.mb": "Monitor in un ambiente di lavoro ben illuminato", "gamap.viewconds.md": "Monitor in un ambiente di lavoro buio", "gamap.viewconds.mt": "Monitor in un ambiente di lavoro", "gamap.viewconds.ob": "Scena originale - all'aperto molto illuminato", "*gamap.viewconds.pc": "Critical print evaluation environment (ISO-3664 P1)", "gamap.viewconds.pcd": "Photo CD - scena originale all'aperto", "gamap.viewconds.pe": "Ambiente di valutazione di stampa (CIE 116-1995)", "gamap.viewconds.pp": "Stampa riflessa realistica (ISO-3664 P2)", "*gamap.viewconds.tv": "Television/film studio", "gamapframe.title": "Opzioni avanze per la mappatura di gamut", "*gamut": "Gamut", "*gamut.coverage": "Gamut coverage", "*gamut.view.create": "Generating gamut views...", "*gamut.volume": "Gamut volume", "*gamut_mapping.ciecam02": "CIECAM02 gamut mapping", "*gamut_mapping.mode": "Gamut mapping mode", "*gamut_mapping.mode.b2a": "PCS-to-device", "*gamut_mapping.mode.inverse_a2b": "Inverse device-to-PCS", "*gamut_plot.tooltip": "Click and drag the mouse inside the plot to move the viewport, or zoom with the mouse wheel and +/- keys. Double-click resets the viewport.", "*generic_name_value_data": "Generic name-value data", "*geometry": "Geometry", "*glossy": "Glossy", "*go_to_website": "Go to Website", "*gravure": "Gravure", "*gray_tone_response_curve": "Gray tone response curve", "*grayscale": "grayscale", "*green": "Green", "*green_gamma": "Green gamma", "*green_lab": "Green Lab", "*green_matrix_column": "Green matrix column", "*green_maximum": "Green maximum", "*green_minimum": "Green minimum", "*green_tone_response_curve": "Green tone response curve", "*green_xyz": "Green XYZ", "*grid_steps": "Grid Steps", "*hdmi": "HDMI", "*header": "Display calibration and characterization powered by Argyll CMS", "*help_support": "Help and support...", "*host.invalid.lookup_failed": "Invalid host (address lookup failed)", "*hue": "Hue", "*icc_absolute_colorimetric": "ICC-absolute colorimetric", "*icc_version": "ICC version", "*if_available": "if available", "*illuminant": "Illuminant", "*illuminant_relative_cct": "Illuminant-relative CCT", "*illuminant_relative_lab": "Illuminant-relative Lab", "*illuminant_relative_xyz": "Illuminant-relative XYZ", "*illuminant_xyz": "Illuminant XYZ", "*illumination": "Illumination", "*in": "In", "*info.3dlut_settings": "A 3D LUT (LUT = Look Up Table) or ICC device link profile can be used by 3D LUT or ICC device link capable applications for full display color correction.\n\nCreating several (additional) 3D LUTs from an existing profile\nWith the desired profile selected under “Settings”, uncheck the “Create 3D LUT after profiling” checkbox.\n\nChoosing the right source colorspace and tone response curve\nFor 3D LUTs and ICC device link profiles, the source colorspace and tone response curve need to be set in advance and become a fixed part of the overall color transformation (unlike ICC device profiles which are linked dynamically on-the-fly). As an example, HD video material is usually mastered according to the Rec. 709 standard with either a pure power gamma of around 2.2-2.4 (relative with black output offset of 100%) or Rec. 1886 tone response curve (absolute with black output offset 0%). A split between Rec. 1886-like and pure power is also possible by setting black output offset to a value between 0% and 100%.\n\n“Absolute” vs. “relative” gamma\nTo accomodate a non-zero black level of a real display, the tone response curve needs to be offset and scaled accordingly.\n“Absolute” gamma results in an actual output at 50% input which doesn't match that of an idealized power curve (unless the black level is zero).\n“Relative” gamma results in an actual output at 50% input which matches that of an idealized power curve.\n\nRendering intent\nIf you have calibrated to a different whitepoint than the one mandated by the source colorspace, and want to use that for the 3D LUT instead, select “Relative colorimetric”. Otherwise, select “Absolute colorimetric with white point scaling” (white point scaling will prevent clipping in absolute colorimetric mode that could happen if the source colorspace whitepoint is outside of the display gamut). You also have the option to use a non-colorimetric rendering intent that may compress or expand the source colorspace to fit within the display gamut (not recommended when colorimetric accuracy is required).", "*info.calibration_settings": "Calibration is done by interactively adjusting the display to meet the chosen whitepoint and/or luminance as well as optionally creating 1D LUT calibration curves (LUT = Look Up Table) to meet the chosen tone response curve and ensure gray balance. Note that if during calibration you only want to adjust the display and skip the generation of 1D LUT curves, you need to set the tone response curve to “As measured”. 1D LUT calibration can not be used for full display color correction, you need to create a ICC device profile or 3D LUT and use them with applications that support them for that purpose. 1D LUT calibration complements profiling and 3D LUT calibration though.", "*info.display_instrument": "If your display is a OLED, Plasma or other technology with variable light output depending on picture content, enable white level drift compensation.\n\nIf your instrument is a spectrometer and you use it in contact mode on a display with stable black level, you may want to enable instrument black level drift compensation.\n\nIf your instrument is a colorimeter, you should use a correction suitable for your display or display technology type. Note that some instruments (ColorHug, ColorHug2, K-10, Spyder4/5) may have a correction built into some of their measurement modes.", "*info.display_instrument.warmup": "You should let the display warm up for at least 30 minutes before commencing measurements. If you use your instrument in contact mode, it is a good idea to leave it on the display during that time as well.", "*info.mr_settings": "You can verify the accuracy of an ICC profile or 3D LUT via a measurement report that contains detailed statistics about the color errors of the measured patches.\n\nWhen verifying a 3D LUT, make sure to use the same settings as the 3D LUT was created with.", "*info.profile_settings": "Profiling is the process of characterizing the display and recording its response in a ICC device profile. The ICC device profile can be used by applications that support ICC color management for full display color correction, and/or it can be used to create a 3D LUT (LUT = Look Up Table) which serves the same purpose for applications that support 3D LUTs.\n\nThe amount of patches measured influences the attainable accuracy of the resulting profile. For a reasonable quality 3x3 matrix and curves based profile, a few dozen patches can be enough if the display has good additive color mixing properties and linearity. Some professional displays fall into that category. If the highest possible accuracy is desired, a LUT-based profile from around several hundred up to several thousand patches is recommended. The “Auto-optimized” testchart setting automatically takes into account the non-linearities and actual response of the display, and should be used for best quality results. With this, you can adjust a slider to choose a compromise between resulting profile accuracy and measurement as well as computation time.", "infoframe.default_text": "", "infoframe.title": "Informazioni", "infoframe.toggle": "Mostrare/Nascondere finestra delle informazioni", "*initial": "Initial", "initializing_gui": "Inizializzazione interfaccia grafica...", "*ink_jet_printer": "Ink jet printer", "*input_device_profile": "Input device profile", "*input_table": "Input Table", "install_display_profile": "Installa il profilo del monitor...", "*install_local_system": "Install system-wide", "*install_user": "Install for current user only", "instrument": "Strumento/Porta", "*instrument.calibrate": "Place the instrument on a dark, matte surface or onto its calibration plate and press OK to calibrate the instrument.", "*instrument.calibrate.colormunki": "Set the ColorMunki sensor to calibration position and press OK to calibrate the instrument.", "*instrument.calibrate.reflective": "Place the instrument onto its reflective white reference serial no. %s and press OK to calibrate the instrument.", "*instrument.calibrating": "Calibrating instrument...", "*instrument.connect": "Please connect your measurement instrument now.", "*instrument.initializing": "Setting up the instrument, please wait...", "*instrument.measure_ambient": "If your instrument requires a special cap to measure ambient, please attach it. To measure ambient light, place the instrument upwards, beside the display. Or if you want to measure a viewing booth, put a metamerism-free gray card inside the booth and point the instrument towards it. Further instructions how to measure ambient may be available in your instrument's documentation. Press OK to commence measurement.", "instrument.place_on_screen": "Posizionare lo strumento sulla finestra di test. Clicca su OK. Premere ESC, Q o CTRL^C per annullare, qualsiasi altro tasto avvierà la misurazione.", "*instrument.place_on_screen.madvr": "(%i) Please place your %s on the test area", "*instrument.reposition_sensor": "The measurement failed because the instrument sensor is in the wrong position. Please correct the sensor position, then click OK to continue.", "*internal": "Internal", "*invert_selection": "Invert selection", "*is_embedded": "Is embedded", "*is_illuminant": "Is illuminant", "*is_linear": "Is linear", "*laptop.icc": "Laptop (Gamma 2.2)", "*libXss.so": "X11 screen saver extension", "*library.not_found.warning": "The library “%s” (%s) was not found. Please make sure it is installed before proceeding.", "*license": "License", "license_info": "Rilasciato sotto licenza GPL", "*linear": "linear", "locale.set": "Impostazioni della locale: %s", "*log.autoshow": "Show log window automatically", "*luminance": "Luminance", "lut_access": "Accesso a calibrazione", "*madhcnet.outdated": "The installed version of %s found at %s is outdated. Please update to the latest madVR version (at least %i.%i.%i.%i).", "*madtpg.launch.failure": "madTPG was not found or could not be launched.", "*madvr.not_found": "madVR DirectShow filter was not found in the registry. Please make sure it is installed.", "*madvr.outdated": "The used version of madVR is outdated. Please update to the latest version (at least %i.%i.%i.%i).", "*magenta": "Magenta", "*make_and_model": "Make and model", "*manufacturer": "Manufacturer", "*matrix": "Matrix", "*matte": "Matte", "*max": "Max", "*maximal": "Maximal", "measure": "Misurazione", "measure.darken_background": "Sfondo nero", "*measure.darken_background.warning": "Attention: If „black background“ is chosen, it will cover the whole screen and you will not be able to see the display adjustment window! If you have a multi-screen setup, move the display adjustment window to another screen before starting the measurement, or use the keyboard (to abort the measurement, press Q. If the measurement is already running, wait briefly, then press Q again).", "*measure.override_display_settle_time_mult": "Override display settle time multiplier", "*measure.override_min_display_update_delay_ms": "Override minimum display update delay", "*measure.testchart": "Measure testchart", "measureframe.center": "Centrare", "measureframe.info": "Spostare la finestra di misurazione nella posizione dello schermo desiderata e ridimensionarla se necessario. Tutta l'area sarà usata approssimativamente per mostrare i campioni, il cerchio è solo una guida per l'aiuto al posizionamento dello strumento di misurazione.\nPosizionare lo strumento di misurazione sulla finestra e premere su „Avvio misurazione“. Per annullare e ritornare alla finestra principale chiudere la finestra di misurazione.", "measureframe.infobutton": "Informazioni", "measureframe.measurebutton": "Avvio misurazione", "measureframe.title": "Area di misurazione", "measureframe.zoomin": "Allargare", "measureframe.zoommax": "Massimizzare/Ripristinare", "measureframe.zoomnormal": "Dimensioni normali", "measureframe.zoomout": "Restringere", "*measurement.play_sound": "Acoustic feedback on continuous measurements", "*measurement.set_save_path": "Save the measurement file in the following folder:", "*measurement.untethered": "Untethered measurement", "*measurement_file.check_sanity": "Check measurement file...", "*measurement_file.check_sanity.auto": "Automatically check measurements", "*measurement_file.check_sanity.auto.warning": "Please note automatic checking of measurements is an experimental feature. Use at own risk.", "*measurement_file.choose": "Please choose a measurement file", "*measurement_file.choose.colorimeter": "Please choose a colorimeter measurement file", "*measurement_file.choose.reference": "Please choose a reference measurement file", "measurement_mode": "Modalità", "*measurement_mode.adaptive": "Adaptive", "*measurement_mode.dlp": "DLP", "*measurement_mode.factory": "Factory calibration", "*measurement_mode.generic": "Generic", "*measurement_mode.highres": "HiRes", "measurement_mode.lcd": "LCD (generico)", "*measurement_mode.lcd.ccfl": "LCD (CCFL)", "*measurement_mode.lcd.ccfl.2": "LCD (CCFL Type 2)", "*measurement_mode.lcd.oled": "LCD (OLED)", "*measurement_mode.lcd.white_led": "LCD (White LED)", "*measurement_mode.lcd.wide_gamut.ccfl": "Wide Gamut LCD (CCFL)", "*measurement_mode.lcd.wide_gamut.rgb_led": "Wide Gamut LCD (RGB LED)", "*measurement_mode.raw": "Raw", "*measurement_mode.refresh": "Refresh (generic)", "*measurement_report": "Measurement report...", "*measurement_report.update": "Update measurement or uniformity report...", "*measurement_report_choose_chart": "Please choose the testchart to measure.", "*measurement_report_choose_chart_or_reference": "Please choose a testchart or reference.", "*measurement_report_choose_profile": "Please choose the profile to validate.", "*measurement_type": "Measurement type", "*measurements.complete": "Measurements complete! Do you want to open the folder containing the measurement files?", "*measuring.characterization": "Measuring color swatches for characterization...", "*media_black_point": "Media black point", "*media_relative_colorimetric": "Media-relative colorimetric", "*media_white_point": "Media white point", "menu.about": "A riguardo...", "menu.file": "File", "menu.help": "?", "menu.language": "Lingua", "*menu.options": "Options", "*menu.tools": "Tools", "menuitem.quit": "Esci", "menuitem.set_argyll_bin": "Trova gli eseguibili di Argyll CMS...", "*metadata": "Metadata", "*min": "Min", "*minimal": "Minimal", "*model": "Model", "*named_color_profile": "Named color profile", "*named_colors": "Named colors", "native": "Nativo", "*negative": "Negative", "no": "No", "no_settings": "Il file non contiene impostazioni.", "*none": "None", "*not_applicable": "Not applicable", "*not_connected": "Not connected", "*not_found": "“%s” was not found.", "*not_now": "Not now", "*number_of_entries": "Number of entries", "*number_of_entries_per_channel": "Number of entries per channel", "*observer": "Observer", "*observer.1931_2": "CIE 1931 2°", "*observer.1955_2": "Stiles & Birch 1955 2°", "*observer.1964_10": "CIE 1964 10°", "*observer.1964_10c": "CIE 1964 10° / 1931 2° hybrid", "*observer.1978_2": "Judd & Voss 1978 2°", "*observer.shaw": "Shaw & Fairchild 1997 2°", "*oem.import.auto": "If your colorimeter came with a software CD for Windows, please insert it now (abort any possibly automatic software installation).\n\nIf you don't have a CD and the required files cannot be found otherwise, they will be downloaded from the Web.", "*oem.import.auto.download_selection": "A preselection was made based on the detected instrument(s). Please select the file(s) to download (total download size can add up to several hundred MB depending on the selection).", "*oem.import.auto_windows": "If the vendor software for your colorimeter is installed, the required files can be found automatically in most cases.", "*office_web.icc": "Office & Web (D65, Gamma 2.2)", "*offset": "Offset", "*offset_lithography": "Offset lithography", "ok": "OK", "or": "o", "*osd": "OSD", "other": "Altro", "*out": "Out", "*out_of_gamut_tag": "Out of gamut tag", "*output.profile": "Target profile", "*output_device_profile": "Output device profile", "*output_offset": "Output offset", "*output_table": "Output Table", "overwrite": "Sovrascrivi", "*panel.surface": "Panel surface", "*panel.type": "Panel type", "*passive_matrix_display": "Passive matrix display", "*patch.layout.select": "Please select a patch layout:", "patches": "Campioni", "*patterngenerator.prisma.specify_host": "Please specify the hostname of your Prisma Video Processor, e.g. prisma-0123 (Windows) or prisma-0123.local (Linux/Mac OS X). You can find the hostname on a label at the underside of the Prisma, unless it was changed via the Prisma's administrative web interface. Alternatively, enter the IP address (if known), e.g. 192.168.1.234", "*patterngenerator.sync_lost": "Lost sync with the pattern generator.", "pause": "Pausa", "*pcs_illuminant_xyz": "PCS illuminant XYZ", "*pcs_relative_cct": "PCS-relative CCT", "*pcs_relative_lab": "PCS-relative Lab", "*pcs_relative_xyz": "PCS-relative XYZ", "*pcs_to_device_intent_0": "PCS to device: Intent 0", "*pcs_to_device_intent_1": "PCS to device: Intent 1", "*pcs_to_device_intent_2": "PCS to device: Intent 2", "*perceptual": "Perceptual", "*photo.icc": "Photo (D50, Gamma 2.2)", "*photo_imagesetter": "Photo imagesetter", "*photographic_paper_printer": "Photographic paper printer", "*platform": "Platform", "*please_wait": "Please wait...", "*port.invalid": "Invalid port: %s", "*positive": "Positive", "*preferred_cmm": "Preferred CMM", "*prepress.icc": "Prepress (D50, 130 cd/m², L*)", "*preset": "Preset", "preview": "Anteprima", "profile": "Profilo", "profile.advanced_gamap": "Avanzato...", "*profile.b2a.hires": "Enhance effective resolution of colorimetric PCS-to-device table", "*profile.b2a.lowres.warning": "The profile is seemingly missing high-quality PCS-to-device tables, which are essential for proper operation. Do you want to generate high-quality tables now? This will take a few minutes.", "*profile.b2a.smooth": "Smoothing", "*profile.choose": "Please choose a profile.", "*profile.confirm_regeneration": "Do you want to regenerate the profile?", "profile.created": "Il profilo è stato creato con successo.", "*profile.current": "Current profile", "profile.do_not_install": "Non installare il profilo", "*profile.iccv4.unsupported": "Version 4 ICC profiles are not supported.", "*profile.import.success": "The profile has been imported. You may need to manually assign and activate it under “Color” system settings.", "*profile.info": "Profile information", "*profile.info.show": "Show profile information", "profile.install": "Installare il profilo", "profile.install.error": "Impossibile installare e attivare il profilo.", "*profile.install.osx_manual_select": "The profile has been installed. Please activate it in the “Displays” system preferences pane.", "profile.install.success": "Il profilo è stato installato ed attivato.", "*profile.install.virtual.unsupported": "Profiles cannot be installed for virtual display devices.", "*profile.install.warning": "The profile has been installed, but there may be problems.", "*profile.install_local_system": "Install profile as system default", "*profile.install_network": "Install profile network-wide", "*profile.install_user": "Install profile for current user only", "profile.invalid": "Profilo non valido.", "*profile.load_error": "Display profile couldn't be loaded.", "*profile.load_on_login": "Load calibration on login", "profile.load_on_login.handled_by_os": "Sistema operativo (di bassa precisione ed affidabilità)", "profile.name": "Nome del profile", "profile.name.create": "Generare il nome del profilo", "*profile.name.placeholders": "You may use the following placeholders in the profile name:\n\n%a Abbreviated weekday name\n%A Full weekday name\n%b Abbreviated month name\n%B Full month name\n%d Day of the month\n%H Hour (24-hour clock)\n%I Hour (12-hour clock)\n%j Day of the year\n%m Month\n%M Minute\n%p AM/PM\n%S Second\n%U Week (Sunday as first day of the week)\n%w Weekday (sunday is 0)\n%W Week (Monday as first day of the week)\n%y Year without century\n%Y Year with century", "profile.no_embedded_ti3": "Il profilo non contiene dati di misurazione compatibili con Argyll.", "*profile.no_vcgt": "The profile does not contain calibration curves.", "*profile.only_named_color": "Only profiles of type “Named Color” can be used.", "profile.quality": "Qualita del profilo", "*profile.quality.b2a.low": "Low quality PCS-to-device tables", "*profile.quality.b2a.low.info": "Choose this option if the profile is only going to be used with inverse device-to-PCS gamut mapping to create a DeviceLink or 3D LUT", "*profile.required_tags_missing": "The profile is missing required tags: %s", "*profile.self_check": "Profile self check ΔE*76", "*profile.self_check.avg": "average", "*profile.self_check.max": "maximum", "*profile.self_check.rms": "RMS", "profile.set_save_path": "Scegli un percorso per salvare...", "profile.settings": "Impostazioni per la creazione del profilo", "*profile.share": "Upload profile...", "*profile.share.avg_dE_too_high": "The profile yields a too high delta E (actual = %s, threshold = %s).", "*profile.share.b2a_resolution_too_low": "The resolution of the profile's PCS to device tables is too low.", "*profile.share.enter_info": "You may share your profile with other users via the OpenSUSE “ICC Profile Taxi” service.\n\nPlease provide a meaningful description and enter display device properties below. Read display device settings from your display device's OSD and only enter settings applicable to your display device which have changed from defaults.\nExample: For most display devices, these are the name of the chosen preset, brightness, contrast, color temperature and/or whitepoint RGB gains, as well as gamma. On laptops and notebooks, usually only the brightness. If you have changed additional settings while calibrating your display device, enter them too if possible.", "*profile.share.meta_missing": "The profile does not contain the necessary meta information.", "*profile.share.success": "Profile uploaded successfully.", "*profile.testchart_recommendation": "For a higher quality profile, a testchart with more samples is recommended, but it will take more time to measure. Do you want to use the recommended testchart?", "profile.type": "Tipo di profilo", "*profile.type.gamma_matrix": "Gamma + matrix", "*profile.type.lut.lab": "L*a*b* LUT", "*profile.type.lut.xyz": "XYZ LUT", "*profile.type.lut_matrix.xyz": "XYZ LUT + matrix", "*profile.type.lut_rg_swapped_matrix.xyz": "XYZ LUT + swapped matrix", "*profile.type.shaper_matrix": "Curves + matrix", "*profile.type.single_gamma_matrix": "Single gamma + matrix", "*profile.type.single_shaper_matrix": "Single curve + matrix", "profile.unsupported": "Tipo di profilo (%s) e/o spazio di colore (%s) non supportato.", "profile.update": "Aggiornamento profilo", "*profile_class": "Profile class", "*profile_connection_space_pcs": "Profile connection space (PCS)", "*profile_loader": "Profile loader", "*profile_loader.exit_warning": "Do you really want to quit the profile loader? Calibration will no longer be automatically reloaded if you change the display configuration!", "*profile_loader.fix_profile_associations": "Automatically fix profile associations", "*profile_loader.fix_profile_associations_warning": "As long as the profile loader is running, it can take care of profile associations when you change the display configuration.\n\nBefore you proceed, please make sure the profile associations shown above are correct. If they aren't, follow these steps:\n\n1. Open Windows display settings.\n2. Activate all connected displays (extended desktop).\n3. Open Windows color management settings from the Windows control panel.\n4. Make sure each display device has the correct profile assigned. Then close color management settings.\n5. In Windows display settings, revert to the previous display configuration and close display settings.\n6. Now you can enable “Automatically fix profile associations”.", "*profile_loader.info": "Calibration state was (re)applied %i time(s) so far today.\nRight-click icon for menu.", "*profiling": "Profiling", "profiling.complete": "Creazione del profilo completa!", "profiling.incomplete": "La creazione del profilo non è stata completata.", "*projection_television": "Projection television", "*projector": "Projector", "*projector_mode_unavailable": "Projector mode is only available with Argyll CMS 1.1.0 Beta or newer.", "quality.ultra.warning": "La qualità di livello Ultra non dovrebbe quasi mai essere usata, tranne che per dimostrare che non dovrebbe quasi mai essere usata (tempi di elaborazioni lunghi!). Scegliere invece qualità media o alta.", "*readme": "ReadMe", "ready": "Pronto.", "*red": "Red", "*red_gamma": "Red gamma", "*red_lab": "Red Lab", "*red_matrix_column": "Red matrix column", "*red_maximum": "Red maximum", "*red_minimum": "Red minimum", "*red_tone_response_curve": "Red tone response curve", "*red_xyz": "Red XYZ", "*reference": "Reference", "*reflective": "Reflective", "*reflective_scanner": "Reflective scanner", "*remaining_time": "Remaining time (ca.)", "*rendering_intent": "Rendering intent", "report.calibrated": "Rapporto sullo schermo calibrato", "report.uncalibrated": "Rapporto sullo schermo non calibrato", "*report.uniformity": "Measure display device uniformity...", "*resources.notfound.error": "Fatal error: A required file has not been found:", "*resources.notfound.warning": "Warning: Some required files have not been found:", "*response.invalid": "Invalid response from %s: %s", "*response.invalid.missing_key": "Invalid response from %s: Missing key “%s”: %s", "*response.invalid.value": "Invalid response from %s: Value of key “%s” does not match expected value “%s”: %s", "restore_defaults": "Ripristina i valori predefiniti", "*rgb.trc": "RGB transfer function", "*rgb.trc.averaged": "averaged RGB transfer function", "sRGB.icc": "sRGB", "*saturation": "Saturation", "*save": "Save", "save_as": "Salva con nome...", "*scripting-client": "DisplayCAL Scripting Client", "*scripting-client.cmdhelptext": "Press the tab key at an empty command prompt to view the possible commands in the current context, or to auto-complete already typed initial letters. Type “getcommands” for a list of supported commands and possible parameters for the connected application.", "*scripting-client.detected-hosts": "Detected scripting hosts:", "*select_all": "Select all", "setting.keep_current": "Mantieni le impostazioni attuali", "*settings.additional": "Additional settings", "*settings.basic": "Basic settings", "*settings.new": "", "settings_loaded": "Sono state caricate le curve calibrazione e le seguenti impostazioni di calibrazione: %s. Le altre opzioni di calibrazione sono state ripristinate ai valori predefiniti e le opzioni di profilo non sono state modificate.", "settings_loaded.all": "Sono state caricate le impostazioni e le curve calibrazione.", "*settings_loaded.cal": "The profile contained just calibration settings. Other options have not been changed. No calibration curves have been found.", "*settings_loaded.cal_and_lut": "The profile contained just calibration settings. Other options have not been changed and calibration curves have been loaded.", "settings_loaded.cal_and_profile": "Sono state caricate le impostazioni. Le curve calibrazione non sono state trovate.", "settings_loaded.profile": "Il profilo contiene solo le impostazioni del profilo. Le altre opzioni non sono state modificate. Le curve calibrazione non sono state trovate.", "settings_loaded.profile_and_lut": "Il profilo contiene solo le impostazioni del profilo. Le altre opzioni non sono state modificate e le curve calibrazione sono state caricate.", "*show_advanced_options": "Show advanced options", "*silkscreen": "Silkscreen", "*simulation_profile": "Simulation profile", "*size": "Size", "*softproof.icc": "Softproof (D55, 160 cd/m², L*)", "*spectral": "Spectral", "startup": "Avvio...", "*startup_sound.enable": "Enable startup sound", "success": "...ok.", "*surround_xyz": "Surround XYZ", "*synthicc.create": "Create synthetic ICC profile...", "*target": "Target", "tc.3d": "Creazione del file VRML diagnostico 3D", "tc.I": "Perceptual space body centered cubic grid", "*tc.Q": "Perceptual space filling quasi-random", "tc.R": "Spazio percettivo casuale", "tc.adaption": "Adattamento", "tc.algo": "Distribuzione", "tc.angle": "Angolo", "*tc.black": "Black patches", "*tc.dark_emphasis": "Dark region emphasis", "tc.fullspread": "Campioni iterativi", "tc.gray": "Campioni neutri", "tc.i": "Device space body centered cubic grid", "tc.limit.sphere": "Limitare il campionamento alla sfera", "tc.limit.sphere_radius": "Raggio", "tc.multidim": "Multidimensionale", "tc.multidim.patches": "passi = %s Campioni (%s neutri)", "*tc.neutral_axis_emphasis": "Neutral axis emphasis", "tc.ofp": "Campionamento con punto più remoto ottimizzato", "tc.patch": "Campione", "tc.patches.gray": "neutro", "tc.patches.selected": "selezionato", "tc.patches.total": "Totale campioni", "tc.precond": "Precondizionamento del profilo", "*tc.precond.notset": "Please select a preconditioning profile.", "tc.preview.create": "Creazione dell'anteprima, attendere prego...", "tc.q": "Riempimento dello spazio del dispositivo quasi-random", "tc.r": "Spazio del dispositivo casuale", "tc.single": "Campioni su singolo canale", "tc.single.perchannel": "per canale", "tc.t": "Campionamento con punto remoto incrementale", "*tc.vrml.black_offset": "RGB black offset (L*)", "tc.vrml.device": "Posizioni del dispositivo", "tc.vrml.lab": "Posizioni del Lab", "*tc.vrml.save_as": "Save VRML file(s) as...", "*tc.vrml.use_D50": "Neutral RGB white", "tc.white": "Campioni bianchi", "*technology": "Technology", "*tempdir_should_still_contain_files": "Created files should still be in the temporary directory “%s”.", "*testchart.add_saturation_sweeps": "Add saturation sweeps", "*testchart.add_ti3_patches": "Add reference patches...", "*testchart.auto_optimize.untethered.unsupported": "The untethered virtual display does not support testchart auto-optimization.", "*testchart.change_patch_order": "Change patch order", "testchart.confirm_select": "File salvato. Selezionare il testchart?", "testchart.create": "Creazione testchart", "testchart.discard": "Scartare", "testchart.dont_select": "Non selezionare", "testchart.edit": "Modifica testchart...", "*testchart.export.repeat_patch": "Repeat each patch:", "testchart.file": "Testchart", "testchart.info": "Numero di campioni nel testchart selezionati", "testchart.invalid": "Il file di testchart non è valido!", "*testchart.optimize_for_untethered_auto_mode": "Optimize for untethered in auto mode", "*testchart.patches_amount": "Amount of patches", "testchart.read": "Lettura testchart...", "testchart.save_or_discard": "Il testchart non è stato salvato.", "testchart.select": "Selezionare", "*testchart.separate_fixed_points": "Please choose the patches to add in a separate step.", "testchart.set": "Scegli il file di testchart...", "*testchart.sort_RGB_blue_to_top": "Sort RGB blue to top", "*testchart.sort_RGB_cyan_to_top": "Sort RGB cyan to top", "*testchart.sort_RGB_gray_to_top": "Sort RGB gray to top", "*testchart.sort_RGB_green_to_top": "Sort RGB green to top", "*testchart.sort_RGB_magenta_to_top": "Sort RGB magenta to top", "*testchart.sort_RGB_red_to_top": "Sort RGB red to top", "*testchart.sort_RGB_white_to_top": "Sort RGB white to top", "*testchart.sort_RGB_yellow_to_top": "Sort RGB yellow to top", "*testchart.sort_by_HSI": "Sort by HSI", "*testchart.sort_by_HSL": "Sort by HSL", "*testchart.sort_by_HSV": "Sort by HSV", "*testchart.sort_by_L": "Sort by L*", "*testchart.sort_by_RGB": "Sort by RGB", "*testchart.sort_by_RGB_sum": "Sort by sum of RGB", "*testchart_or_reference": "Testchart or reference", "*thermal_wax_printer": "Thermal wax printer", "*tone_values": "Tone values", "*transfer_function": "Transfer function", "*translations": "Translations", "*transparency": "Transparency", "*trashcan.linux": "trash", "*trashcan.mac": "trash", "*trashcan.windows": "recycle bin", "trc": "Curva dei toni", "*trc.dicom": "DICOM", "trc.gamma": "Gamma", "trc.lstar": "L*", "trc.rec1886": "Rec. 1886", "trc.rec709": "Rec. 709", "trc.should_use_viewcond_adjust": "Per ottenere i risultati voluti, quando vengono usate le curve SMPTE 240M, Rec. 709 o sRGB, si dovrebbero applicare anche delle correzioni alle condizioni di visualizzazione per i livelli della luce ambientale. Per ottenere questo deve essere spuntata la casella vicino a “Livello di luce ambientale” e deve essere inserito un valore in Lux. Facoltativamente è possibile misurare la luce ambientale durante la calibrazione se lo strumento mette a disposizione questa funzionalità.", "*trc.smpte2084": "SMPTE 2084", "trc.smpte240m": "SMPTE 240M", "trc.srgb": "sRGB", "trc.type.absolute": "Absoluta", "trc.type.relative": "Relativa", "turn_off": "Disabilita", "*type": "Type", "*udev_hotplug.unavailable": "Neither udev nor hotplug detected.", "*uninstall_display_profile": "Uninstall display device profile...", "*unknown": "Unknown", "*unmodified": "Unmodified", "unnamed": "Senza nome", "*update_check": "Check for application update...", "*update_check.fail": "Check for application update failed:", "*update_check.fail.version": "Remote version file from server %s couldn't be parsed.", "*update_check.new_version": "An update is available: %s", "*update_check.onstartup": "Check for application update on startup", "*update_check.uptodate": "%s is up-to-date.", "*update_now": "Update now", "*upload": "Upload", "*use_fancy_progress": "Use fancy progress dialog", "*use_separate_lut_access": "Use separate video card gamma table access", "*use_simulation_profile_as_output": "Use simulation profile as target profile", "*vcgt": "Calibration curves", "*vcgt.mismatch": "The video card gamma tables for display %s do not match the desired state.", "*vcgt.unknown_format": "Unknown video card gamma table format in profile “%s”.", "*verification": "Verification", "*verification.settings": "Verification settings", "*verify.ti1": "Verification testchart", "*verify_extended.ti1": "Extended verification testchart", "*verify_grayscale.ti1": "Graybalance verification testchart", "*verify_large.ti1": "Large verification testchart", "*verify_video.ti1": "Verification testchart (video)", "*verify_video_extended.ti1": "Extended verification testchart (video)", "*verify_video_large.ti1": "Large verification testchart (video)", "*verify_video_xl.ti1": "Extra large verification testchart (video)", "*verify_video_xxl.ti1": "XXL verification testchart (video)", "*verify_video_xxxl.ti1": "XXXL verification testchart (video)", "*verify_xl.ti1": "Extra large verification testchart", "*verify_xxl.ti1": "XXL verification testchart", "*verify_xxxl.ti1": "XXXL verification testchart", "*vga": "VGA", "*video.icc": "Video (D65, Rec. 1886)", "*video_Prisma.icc": "Video 3D LUT for Prisma (D65, Rec. 709 / Rec. 1886)", "*video_ReShade.icc": "Video 3D LUT for ReShade (D65, Rec. 709 / Rec. 1886)", "*video_camera": "Video camera", "*video_card_gamma_table": "Video card gamma table", "*video_eeColor.icc": "Video 3D LUT for eeColor (D65, Rec. 709 / Rec. 1886)", "*video_madVR.icc": "Video 3D LUT for madVR (D65, Rec. 709 / Rec. 1886)", "*video_monitor": "Video monitor", "*video_resolve.icc": "Video 3D LUT for Resolve (D65, Rec. 709 / Rec. 1886)", "*view.3d": "3D view", "*viewing_conditions": "Viewing conditions", "*viewing_conditions_description": "Viewing conditions description", "*vrml_to_x3d_converter": "VRML to X3D converter", "warning": "Attenzione", "warning.already_exists": "Il file “%s” già esiste nella posizione scelta e sarà sovrascritto. Continuare?", "*warning.autostart_system": "The system-wide autostart directory could not be determined.", "*warning.autostart_user": "The user-specific autostart directory could not be determined.", "warning.copy_failed_continue": "Impossibile copiare il file “%s” in “%s”. Continua...", "*warning.discard_changes": "Do you really want to discard the changes to the current settings?", "*warning.input_value_clipping": "Warning: Input values below the target blackpoint will be clipped!", "warning.no_comports_detected": "Non è stato rilevato nessuno strumento di calibrazione.", "*warning.suspicious_delta_e": "Warning: Suspicious measurements have been found. Please note this check assumes an sRGB-like display device. If your display device differs from this assumption (e.g. if it has a very wide gamut or a tone response too far from sRGB), then errors found are probably not meaningful.\n\nOne or all of the following criteria matched:\n\n• Consecutive patches with different RGB numbers, but suspiciously low ΔE*00 of the measurements against each other.\n• RGB gray with increasing RGB numbers towards the previous patch, but declining lightness (L*).\n• RGB gray with decreasing RGB numbers towards the previous patch, but rising lightness (L*).\n• Unusually high ΔE*00 and ΔL*00 or ΔH*00 or ΔC*00 of measurements to the sRGB equivalent of the RGB numbers.\n\nThis could hint at measurement errors. Values that are considered problematic (which does not have to be true!) are highlighted in red. Check the measurements carefully and mark the ones you want to accept. You can also edit the RGB and XYZ values.", "*warning.suspicious_delta_e.info": "Explanation of the Δ columns:\n\nΔE*00 XYZ A/B: ΔE*00 of measured values towards measured values of the previous patch. If this value is missing, it wasn't a factor while checking. If it is present, then it is assumed to be too low.\n\n0.5 ΔE*00 RGB A/B: ΔE*00 of the sRGB equivalent of the RGB numbers towards the sRGB equivalent of the RGB numbers of the previous patch (with a factor of 0.5). If this value is present, it represents the comparison (minimal) value during checking for assumed too low ΔE*00 XYZ A/B. It serves as a very rough orientation.\n\nΔE*00 RGB-XYZ: ΔE*00 of measured values towards the sRGB equivalent of the RGB numbers.\nΔL*00 RGB-XYZ: ΔL*00 of measured values towards the sRGB equivalent of the RGB numbers.\nΔC*00 RGB-XYZ: ΔC*00 of measured values towards the sRGB equivalent of the RGB numbers.\nΔH*00 RGB-XYZ: ΔH*00 of measured values towards the sRGB equivalent of the RGB numbers.", "*warning.system_file": "Warning: “%s” is a system file. Do you really want to continue?", "*webserver.waiting": "Webserver waiting at", "*welcome": "Welcome!", "*welcome_back": "Welcome back!", "*white": "White", "whitepoint": "Punto di bianco", "whitepoint.colortemp": "Temperatura", "whitepoint.colortemp.locus.blackbody": "Corpo nero", "*whitepoint.colortemp.locus.curve": "Color temperature curve", "whitepoint.colortemp.locus.daylight": "Luce diurna", "*whitepoint.set": "Do you also want to set the whitepoint to the measured value?", "*whitepoint.simulate": "Simulate whitepoint", "*whitepoint.simulate.relative": "Relative to target profile whitepoint", "whitepoint.xy": "Coordinate della cromaticità", "window.title": "DisplayCAL", "*windows.version.unsupported": "This version of Windows is not supported.", "*windows_only": "Windows only", "working_dir": "Directory di lavoro:", "*yellow": "Yellow", "*yellow_lab": "Yellow Lab", "*yellow_xyz": "Yellow XYZ", "yes": "Sì", } DisplayCAL-3.1.0.0/DisplayCAL/lib/0000755000076500000000000000000012653527012016170 5ustar devwheel00000000000000DisplayCAL-3.1.0.0/DisplayCAL/lib/__init__.py0000644000076500000000000000000112647526510020275 0ustar devwheel00000000000000#DisplayCAL-3.1.0.0/DisplayCAL/lib/agw/0000755000076500000000000000000012653527012016746 5ustar devwheel00000000000000DisplayCAL-3.1.0.0/DisplayCAL/lib/agw/__init__.py0000644000076500000000000001366312647526510021075 0ustar devwheel00000000000000 """ This is the Advanced Generic Widgets package (AGW). It provides many custom-drawn wxPython controls: some of them can be used as a replacement of the platform native controls, others are simply an addition to the already rich wxPython widgets set. Description: AGW contains many different modules, listed below. Items labelled with an asterisk were already present in `wx.lib` before: - AdvancedSplash: reproduces the behaviour of `wx.SplashScreen`, with more advanced features like custom shapes and text animations; - AquaButton: this is another custom-drawn button class which *approximatively* mimics the behaviour of Aqua buttons on the Mac; - AUI: a pure-Python implementation of `wx.aui`, with many bug fixes and new features like HUD docking and L{AuiNotebook} tab arts; - BalloonTip: allows you to display tooltips in a balloon style window (actually a frame), similarly to the Windows XP balloon help; - ButtonPanel (*): a panel with gradient background shading with the possibility to add buttons and controls still respecting the gradient background; - CubeColourDialog: an alternative implementation of `wx.ColourDialog`, it offers different functionalities like colour wheel and RGB cube; - CustomTreeCtrl (*): mimics the behaviour of `wx.TreeCtrl`, with almost the same base functionalities plus a bunch of enhancements and goodies; - FlatMenu: as the name implies, it is a generic menu implementation, offering the same `wx.MenuBar`/`wx.Menu`/`wx.ToolBar` capabilities and much more; - FlatNotebook (*): a full implementation of the `wx.Notebook`, and designed to be a drop-in replacement for `wx.Notebook` with enhanced capabilities; - FloatSpin: this class implements a floating point spinctrl, cabable (in theory) of handling infinite-precision floating point numbers; - FoldPanelBar (*): a control that contains multiple panels that can be expanded or collapsed a la Windows Explorer/Outlook command bars; - FourWaySplitter: this is a layout manager which manages four children like four panes in a window, similar to many CAD software interfaces; - GenericMessageDialog: it is a possible replacement for the standard `wx.MessageDialog`, with a fancier look and extended functionalities; - GradientButton: another custom-drawn button class which mimics Windows CE mobile gradient buttons, using a tri-vertex blended gradient background; - HyperLinkCtrl (*): this widget acts line an hyper link in a typical browser; - HyperTreeList: a class that mimics the behaviour of `wx.gizmos.TreeListCtrl`, with almost the same base functionalities plus some more enhancements; - KnobCtrl: a widget which lets the user select a numerical value by rotating it, like a slider with a wheel shape; - LabelBook and FlatImageBook: these are a quasi-full implementations of `wx.ListBook`, with additional features; - MultiDirDialog: it represents a possible replacement for `wx.DirDialog`, with the additional ability of selecting multiple folders at once and a fancier look; - PeakMeter: this widget mimics the behaviour of LED equalizers that are usually found in stereos and MP3 players; - PersistentControls: widgets which automatically save their state when they are destroyed and restore it when they are recreated, even during another program invocation; - PieCtrl and ProgressPie: these are simple classes that reproduce the behavior of a pie chart, in a static or progress-gauge-like way; - PyBusyInfo: constructs a busy info window and displays a message in it: it is similar to `wx.BusyInfo`; - PyCollapsiblePane: a pure Python implementation of the original wxWidgets C++ code of `wx.CollapsiblePane`, with customizable buttons; - PyGauge: a generic `wx.Gauge` implementation, it supports the determinate mode functions as `wx.Gauge`; - PyProgress: it is similar to `wx.ProgressDialog` in indeterminated mode, but with a different gauge appearance and a different spinning behavior; - RibbonBar: the RibbonBar library is a set of classes for writing a ribbon user interface, similar to the user interface present in recent versions of Microsoft Office; - RulerCtrl: it implements a ruler window that can be placed on top, bottom, left or right to any wxPython widget. It is somewhat similar to the rulers you can find in text editors software; - ShapedButton: this class tries to fill the lack of "custom shaped" controls in wxPython. It can be used to build round buttons or elliptic buttons; - SpeedMeter: this widget tries to reproduce the behavior of some car controls (but not only), by creating an "angular" control; - SuperToolTip: a class that mimics the behaviour of `wx.TipWindow` and generic tooltips, with many features and highly customizable; - ThumbnailCtrl: a widget that can be used to display a series of images in a "thumbnail" format; it mimics, for example, the Windows Explorer behavior when you select the "view thumbnails" option; - ToasterBox: a cross-platform widget to make the creation of MSN-style "toaster" popups easier; - UltimateListCtrl: mimics the behaviour of `wx.ListCtrl`, with almost the same base functionalities plus some more enhancements; - ZoomBar: a class that *appoximatively* mimics the behaviour of the Mac Dock, inside a `wx.Panel`. Bugs and Limitations: many, patches and fixes welcome :-D See the demos for an example of what AGW can do, and on how to use it. Copyright: Andrea Gavana License: Same as the version of wxPython you are using it with. SVN for latest code: http://svn.wxwidgets.org/viewvc/wx/wxPython/3rdParty/AGW/ Mailing List: wxpython-users@lists.wxwidgets.org My personal web page: http://xoomer.alice.it/infinity77 Please let me know if you are using AGW! You can contact me at: andrea.gavana@gmail.com gavana@kpo.kz AGW version: 0.9.1 Last updated: 21 Jun 2011, 22.00 GMT """ __version__ = "0.9.1" __author__ = "Andrea Gavana " DisplayCAL-3.1.0.0/DisplayCAL/lib/agw/artmanager.py0000644000076500000000000021253512647526510021456 0ustar devwheel00000000000000""" This module contains drawing routines and customizations for the AGW widgets L{LabelBook} and L{FlatMenu}. """ import wx import cStringIO import random from fmresources import * # ---------------------------------------------------------------------------- # # Class DCSaver # ---------------------------------------------------------------------------- # _ = wx.GetTranslation _libimported = None if wx.Platform == "__WXMSW__": osVersion = wx.GetOsVersion() # Shadows behind menus are supported only in XP if osVersion[1] == 5 and osVersion[2] == 1: try: import win32api import win32con import winxpgui _libimported = "MH" except: try: import ctypes _libimported = "ctypes" except: pass else: _libimported = None class DCSaver(object): """ Construct a DC saver. The dc is copied as-is. """ def __init__(self, pdc): """ Default class constructor. :param `pdc`: an instance of `wx.DC`. """ self._pdc = pdc self._pen = pdc.GetPen() self._brush = pdc.GetBrush() def __del__(self): """ While destructing, restores the dc pen and brush. """ if self._pdc: self._pdc.SetPen(self._pen) self._pdc.SetBrush(self._brush) # ---------------------------------------------------------------------------- # # Class RendererBase # ---------------------------------------------------------------------------- # class RendererBase(object): """ Base class for all theme renderers. """ def __init__(self): """ Default class constructor. Intentionally empty. """ pass def DrawButtonBorders(self, dc, rect, penColour, brushColour): """ Draws borders for buttons. :param `dc`: an instance of `wx.DC`; :param `rect`: the button's client rectangle; :param `penColour`: a valid `wx.Colour` for the pen border; :param `brushColour`: a valid `wx.Colour` for the brush. """ # Keep old pen and brush dcsaver = DCSaver(dc) dc.SetPen(wx.Pen(penColour)) dc.SetBrush(wx.Brush(brushColour)) dc.DrawRectangleRect(rect) def DrawBitmapArea(self, dc, xpm_name, rect, baseColour, flipSide): """ Draws the area below a bitmap and the bitmap itself using a gradient shading. :param `dc`: an instance of `wx.DC`; :param `xpm_name`: a name of a XPM bitmap; :param `rect`: the bitmap client rectangle; :param `baseColour`: a valid `wx.Colour` for the bitmap background; :param `flipSide`: ``True`` to flip the gradient direction, ``False`` otherwise. """ # draw the gradient area if not flipSide: ArtManager.Get().PaintDiagonalGradientBox(dc, rect, wx.WHITE, ArtManager.Get().LightColour(baseColour, 20), True, False) else: ArtManager.Get().PaintDiagonalGradientBox(dc, rect, ArtManager.Get().LightColour(baseColour, 20), wx.WHITE, True, False) # draw arrow arrowDown = wx.BitmapFromXPMData(xpm_name) arrowDown.SetMask(wx.Mask(arrowDown, wx.WHITE)) dc.DrawBitmap(arrowDown, rect.x + 1 , rect.y + 1, True) def DrawBitmapBorders(self, dc, rect, penColour, bitmapBorderUpperLeftPen): """ Draws borders for a bitmap. :param `dc`: an instance of `wx.DC`; :param `rect`: the button's client rectangle; :param `penColour`: a valid `wx.Colour` for the pen border; :param `bitmapBorderUpperLeftPen`: a valid `wx.Colour` for the pen upper left border. """ # Keep old pen and brush dcsaver = DCSaver(dc) # lower right size dc.SetPen(wx.Pen(penColour)) dc.DrawLine(rect.x, rect.y + rect.height - 1, rect.x + rect.width, rect.y + rect.height - 1) dc.DrawLine(rect.x + rect.width - 1, rect.y, rect.x + rect.width - 1, rect.y + rect.height) # upper left side dc.SetPen(wx.Pen(bitmapBorderUpperLeftPen)) dc.DrawLine(rect.x, rect.y, rect.x + rect.width, rect.y) dc.DrawLine(rect.x, rect.y, rect.x, rect.y + rect.height) def GetMenuFaceColour(self): """ Returns the foreground colour for the menu. """ return ArtManager.Get().LightColour(wx.SystemSettings_GetColour(wx.SYS_COLOUR_3DFACE), 80) def GetTextColourEnable(self): """ Returns the colour used for text colour when enabled. """ return wx.BLACK def GetTextColourDisable(self): """ Returns the colour used for text colour when disabled. """ return ArtManager.Get().LightColour(wx.SystemSettings_GetColour(wx.SYS_COLOUR_GRAYTEXT), 30) def GetFont(self): """ Returns the font used for text. """ return wx.SystemSettings_GetFont(wx.SYS_DEFAULT_GUI_FONT) # ---------------------------------------------------------------------------- # # Class RendererXP # ---------------------------------------------------------------------------- # class RendererXP(RendererBase): """ Xp-Style renderer. """ def __init__(self): """ Default class constructor. """ RendererBase.__init__(self) def DrawButton(self, dc, rect, state, input=None): """ Draws a button using the XP theme. :param `dc`: an instance of `wx.DC`; :param `rect`: the button's client rectangle; :param `state`: the button state; :param `input`: a flag used to call the right method. """ if input is None or type(input) == type(False): self.DrawButtonTheme(dc, rect, state, input) else: self.DrawButtonColour(dc, rect, state, input) def DrawButtonTheme(self, dc, rect, state, useLightColours=None): """ Draws a button using the XP theme. :param `dc`: an instance of `wx.DC`; :param `rect`: the button's client rectangle; :param `state`: the button state; :param `useLightColours`: ``True`` to use light colours, ``False`` otherwise. """ # switch according to the status if state == ControlFocus: penColour = ArtManager.Get().FrameColour() brushColour = ArtManager.Get().BackgroundColour() elif state == ControlPressed: penColour = ArtManager.Get().FrameColour() brushColour = ArtManager.Get().HighlightBackgroundColour() else: penColour = ArtManager.Get().FrameColour() brushColour = ArtManager.Get().BackgroundColour() # Draw the button borders self.DrawButtonBorders(dc, rect, penColour, brushColour) def DrawButtonColour(self, dc, rect, state, colour): """ Draws a button using the XP theme. :param `dc`: an instance of `wx.DC`; :param `rect`: the button's client rectangle; :param `state`: the button state; :param `colour`: a valid `wx.Colour` instance. """ # switch according to the status if statet == ControlFocus: penColour = colour brushColour = ArtManager.Get().LightColour(colour, 75) elif state == ControlPressed: penColour = colour brushColour = ArtManager.Get().LightColour(colour, 60) else: penColour = colour brushColour = ArtManager.Get().LightColour(colour, 75) # Draw the button borders self.DrawButtonBorders(dc, rect, penColour, brushColour) def DrawMenuBarBg(self, dc, rect): """ Draws the menu bar background according to the active theme. :param `dc`: an instance of `wx.DC`; :param `rect`: the menu bar's client rectangle. """ # For office style, we simple draw a rectangle with a gradient colouring artMgr = ArtManager.Get() vertical = artMgr.GetMBVerticalGradient() dcsaver = DCSaver(dc) # fill with gradient startColour = artMgr.GetMenuBarFaceColour() if artMgr.IsDark(startColour): startColour = artMgr.LightColour(startColour, 50) endColour = artMgr.LightColour(startColour, 90) artMgr.PaintStraightGradientBox(dc, rect, startColour, endColour, vertical) # Draw the border if artMgr.GetMenuBarBorder(): dc.SetPen(wx.Pen(startColour)) dc.SetBrush(wx.TRANSPARENT_BRUSH) dc.DrawRectangleRect(rect) def DrawToolBarBg(self, dc, rect): """ Draws the toolbar background according to the active theme. :param `dc`: an instance of `wx.DC`; :param `rect`: the toolbar's client rectangle. """ artMgr = ArtManager.Get() if not artMgr.GetRaiseToolbar(): return # For office style, we simple draw a rectangle with a gradient colouring vertical = artMgr.GetMBVerticalGradient() dcsaver = DCSaver(dc) # fill with gradient startColour = artMgr.GetMenuBarFaceColour() if artMgr.IsDark(startColour): startColour = artMgr.LightColour(startColour, 50) startColour = artMgr.LightColour(startColour, 20) endColour = artMgr.LightColour(startColour, 90) artMgr.PaintStraightGradientBox(dc, rect, startColour, endColour, vertical) artMgr.DrawBitmapShadow(dc, rect) def GetTextColourEnable(self): """ Returns the colour used for text colour when enabled. """ return wx.BLACK # ---------------------------------------------------------------------------- # # Class RendererMSOffice2007 # ---------------------------------------------------------------------------- # class RendererMSOffice2007(RendererBase): """ Windows MS Office 2007 style. """ def __init__(self): """ Default class constructor. """ RendererBase.__init__(self) def GetColoursAccordingToState(self, state): """ Returns a `wx.Colour` according to the menu item state. :param `state`: one of the following bits: ==================== ======= ========================== Item State Value Description ==================== ======= ========================== ``ControlPressed`` 0 The item is pressed ``ControlFocus`` 1 The item is focused ``ControlDisabled`` 2 The item is disabled ``ControlNormal`` 3 Normal state ==================== ======= ========================== """ # switch according to the status if state == ControlFocus: upperBoxTopPercent = 95 upperBoxBottomPercent = 50 lowerBoxTopPercent = 40 lowerBoxBottomPercent = 90 concaveUpperBox = True concaveLowerBox = True elif state == ControlPressed: upperBoxTopPercent = 75 upperBoxBottomPercent = 90 lowerBoxTopPercent = 90 lowerBoxBottomPercent = 40 concaveUpperBox = True concaveLowerBox = True elif state == ControlDisabled: upperBoxTopPercent = 100 upperBoxBottomPercent = 100 lowerBoxTopPercent = 70 lowerBoxBottomPercent = 70 concaveUpperBox = True concaveLowerBox = True else: upperBoxTopPercent = 90 upperBoxBottomPercent = 50 lowerBoxTopPercent = 30 lowerBoxBottomPercent = 75 concaveUpperBox = True concaveLowerBox = True return upperBoxTopPercent, upperBoxBottomPercent, lowerBoxTopPercent, lowerBoxBottomPercent, \ concaveUpperBox, concaveLowerBox def DrawButton(self, dc, rect, state, useLightColours): """ Draws a button using the MS Office 2007 theme. :param `dc`: an instance of `wx.DC`; :param `rect`: the button's client rectangle; :param `state`: the button state; :param `useLightColours`: ``True`` to use light colours, ``False`` otherwise. """ self.DrawButtonColour(dc, rect, state, ArtManager.Get().GetThemeBaseColour(useLightColours)) def DrawButtonColour(self, dc, rect, state, colour): """ Draws a button using the MS Office 2007 theme. :param `dc`: an instance of `wx.DC`; :param `rect`: the button's client rectangle; :param `state`: the button state; :param `colour`: a valid `wx.Colour` instance. """ artMgr = ArtManager.Get() # Keep old pen and brush dcsaver = DCSaver(dc) # Define the rounded rectangle base on the given rect # we need an array of 9 points for it baseColour = colour # Define the middle points leftPt = wx.Point(rect.x, rect.y + (rect.height / 2)) rightPt = wx.Point(rect.x + rect.width-1, rect.y + (rect.height / 2)) # Define the top region top = wx.RectPP((rect.GetLeft(), rect.GetTop()), rightPt) bottom = wx.RectPP(leftPt, (rect.GetRight(), rect.GetBottom())) upperBoxTopPercent, upperBoxBottomPercent, lowerBoxTopPercent, lowerBoxBottomPercent, \ concaveUpperBox, concaveLowerBox = self.GetColoursAccordingToState(state) topStartColour = artMgr.LightColour(baseColour, upperBoxTopPercent) topEndColour = artMgr.LightColour(baseColour, upperBoxBottomPercent) bottomStartColour = artMgr.LightColour(baseColour, lowerBoxTopPercent) bottomEndColour = artMgr.LightColour(baseColour, lowerBoxBottomPercent) artMgr.PaintStraightGradientBox(dc, top, topStartColour, topEndColour) artMgr.PaintStraightGradientBox(dc, bottom, bottomStartColour, bottomEndColour) rr = wx.Rect(rect.x, rect.y, rect.width, rect.height) dc.SetBrush(wx.TRANSPARENT_BRUSH) frameColour = artMgr.LightColour(baseColour, 60) dc.SetPen(wx.Pen(frameColour)) dc.DrawRectangleRect(rr) wc = artMgr.LightColour(baseColour, 80) dc.SetPen(wx.Pen(wc)) rr.Deflate(1, 1) dc.DrawRectangleRect(rr) def DrawMenuBarBg(self, dc, rect): """ Draws the menu bar background according to the active theme. :param `dc`: an instance of `wx.DC`; :param `rect`: the menu bar's client rectangle. """ # Keep old pen and brush dcsaver = DCSaver(dc) artMgr = ArtManager.Get() baseColour = artMgr.GetMenuBarFaceColour() dc.SetBrush(wx.Brush(wx.SystemSettings_GetColour(wx.SYS_COLOUR_3DFACE))) dc.SetPen(wx.Pen(wx.SystemSettings_GetColour(wx.SYS_COLOUR_3DFACE))) dc.DrawRectangleRect(rect) # Define the rounded rectangle base on the given rect # we need an array of 9 points for it regPts = [wx.Point() for ii in xrange(9)] radius = 2 regPts[0] = wx.Point(rect.x, rect.y + radius) regPts[1] = wx.Point(rect.x+radius, rect.y) regPts[2] = wx.Point(rect.x+rect.width-radius-1, rect.y) regPts[3] = wx.Point(rect.x+rect.width-1, rect.y + radius) regPts[4] = wx.Point(rect.x+rect.width-1, rect.y + rect.height - radius - 1) regPts[5] = wx.Point(rect.x+rect.width-radius-1, rect.y + rect.height-1) regPts[6] = wx.Point(rect.x+radius, rect.y + rect.height-1) regPts[7] = wx.Point(rect.x, rect.y + rect.height - radius - 1) regPts[8] = regPts[0] # Define the middle points factor = artMgr.GetMenuBgFactor() leftPt1 = wx.Point(rect.x, rect.y + (rect.height / factor)) leftPt2 = wx.Point(rect.x, rect.y + (rect.height / factor)*(factor-1)) rightPt1 = wx.Point(rect.x + rect.width, rect.y + (rect.height / factor)) rightPt2 = wx.Point(rect.x + rect.width, rect.y + (rect.height / factor)*(factor-1)) # Define the top region topReg = [wx.Point() for ii in xrange(7)] topReg[0] = regPts[0] topReg[1] = regPts[1] topReg[2] = wx.Point(regPts[2].x+1, regPts[2].y) topReg[3] = wx.Point(regPts[3].x + 1, regPts[3].y) topReg[4] = wx.Point(rightPt1.x, rightPt1.y+1) topReg[5] = wx.Point(leftPt1.x, leftPt1.y+1) topReg[6] = topReg[0] # Define the middle region middle = wx.RectPP(leftPt1, wx.Point(rightPt2.x - 2, rightPt2.y)) # Define the bottom region bottom = wx.RectPP(leftPt2, wx.Point(rect.GetRight() - 1, rect.GetBottom())) topStartColour = artMgr.LightColour(baseColour, 90) topEndColour = artMgr.LightColour(baseColour, 60) bottomStartColour = artMgr.LightColour(baseColour, 40) bottomEndColour = artMgr.LightColour(baseColour, 20) topRegion = wx.RegionFromPoints(topReg) artMgr.PaintGradientRegion(dc, topRegion, topStartColour, topEndColour) artMgr.PaintStraightGradientBox(dc, bottom, bottomStartColour, bottomEndColour) artMgr.PaintStraightGradientBox(dc, middle, topEndColour, bottomStartColour) def DrawToolBarBg(self, dc, rect): """ Draws the toolbar background according to the active theme. :param `dc`: an instance of `wx.DC`; :param `rect`: the toolbar's client rectangle. """ artMgr = ArtManager.Get() if not artMgr.GetRaiseToolbar(): return # Keep old pen and brush dcsaver = DCSaver(dc) baseColour = artMgr.GetMenuBarFaceColour() baseColour = artMgr.LightColour(baseColour, 20) dc.SetBrush(wx.Brush(wx.SystemSettings_GetColour(wx.SYS_COLOUR_3DFACE))) dc.SetPen(wx.Pen(wx.SystemSettings_GetColour(wx.SYS_COLOUR_3DFACE))) dc.DrawRectangleRect(rect) radius = 2 # Define the rounded rectangle base on the given rect # we need an array of 9 points for it regPts = [None]*9 regPts[0] = wx.Point(rect.x, rect.y + radius) regPts[1] = wx.Point(rect.x+radius, rect.y) regPts[2] = wx.Point(rect.x+rect.width-radius-1, rect.y) regPts[3] = wx.Point(rect.x+rect.width-1, rect.y + radius) regPts[4] = wx.Point(rect.x+rect.width-1, rect.y + rect.height - radius - 1) regPts[5] = wx.Point(rect.x+rect.width-radius-1, rect.y + rect.height-1) regPts[6] = wx.Point(rect.x+radius, rect.y + rect.height-1) regPts[7] = wx.Point(rect.x, rect.y + rect.height - radius - 1) regPts[8] = regPts[0] # Define the middle points factor = artMgr.GetMenuBgFactor() leftPt1 = wx.Point(rect.x, rect.y + (rect.height / factor)) rightPt1 = wx.Point(rect.x + rect.width, rect.y + (rect.height / factor)) leftPt2 = wx.Point(rect.x, rect.y + (rect.height / factor)*(factor-1)) rightPt2 = wx.Point(rect.x + rect.width, rect.y + (rect.height / factor)*(factor-1)) # Define the top region topReg = [None]*7 topReg[0] = regPts[0] topReg[1] = regPts[1] topReg[2] = wx.Point(regPts[2].x+1, regPts[2].y) topReg[3] = wx.Point(regPts[3].x + 1, regPts[3].y) topReg[4] = wx.Point(rightPt1.x, rightPt1.y+1) topReg[5] = wx.Point(leftPt1.x, leftPt1.y+1) topReg[6] = topReg[0] # Define the middle region middle = wx.RectPP(leftPt1, wx.Point(rightPt2.x - 2, rightPt2.y)) # Define the bottom region bottom = wx.RectPP(leftPt2, wx.Point(rect.GetRight() - 1, rect.GetBottom())) topStartColour = artMgr.LightColour(baseColour, 90) topEndColour = artMgr.LightColour(baseColour, 60) bottomStartColour = artMgr.LightColour(baseColour, 40) bottomEndColour = artMgr.LightColour(baseColour, 20) topRegion = wx.RegionFromPoints(topReg) artMgr.PaintGradientRegion(dc, topRegion, topStartColour, topEndColour) artMgr.PaintStraightGradientBox(dc, bottom, bottomStartColour, bottomEndColour) artMgr.PaintStraightGradientBox(dc, middle, topEndColour, bottomStartColour) artMgr.DrawBitmapShadow(dc, rect) def GetTextColourEnable(self): """ Returns the colour used for text colour when enabled. """ return wx.NamedColour("MIDNIGHT BLUE") # ---------------------------------------------------------------------------- # # Class ArtManager # ---------------------------------------------------------------------------- # class ArtManager(wx.EvtHandler): """ This class provides various art utilities, such as creating shadow, providing lighter / darker colours for a given colour, etc... """ _alignmentBuffer = 7 _menuTheme = StyleXP _verticalGradient = False _renderers = {StyleXP: None, Style2007: None} _bmpShadowEnabled = False _ms2007sunken = False _drowMBBorder = True _menuBgFactor = 5 _menuBarColourScheme = _("Default") _raiseTB = True _bitmaps = {} _transparency = 255 def __init__(self): """ Default class constructor. """ wx.EvtHandler.__init__(self) self._menuBarBgColour = wx.SystemSettings_GetColour(wx.SYS_COLOUR_3DFACE) # connect an event handler to the system colour change event self.Bind(wx.EVT_SYS_COLOUR_CHANGED, self.OnSysColourChange) def SetTransparency(self, amount): """ Sets the alpha channel value for transparent windows. :param `amount`: the actual transparency value (between 0 and 255). """ if self._transparency == amount: return if amount < 0 or amount > 255: raise Exception("Invalid transparency value") self._transparency = amount def GetTransparency(self): """ Returns the alpha channel value for transparent windows. """ return self._transparency def ConvertToBitmap(self, xpm, alpha=None): """ Convert the given image to a bitmap, optionally overlaying an alpha channel to it. :param `xpm`: a list of strings formatted as XPM; :param `alpha`: a list of alpha values, the same size as the xpm bitmap. """ if alpha is not None: img = wx.BitmapFromXPMData(xpm) img = img.ConvertToImage() x, y = img.GetWidth(), img.GetHeight() img.InitAlpha() for jj in xrange(y): for ii in xrange(x): img.SetAlpha(ii, jj, alpha[jj*x+ii]) else: stream = cStringIO.StringIO(xpm) img = wx.ImageFromStream(stream) return wx.BitmapFromImage(img) def Initialize(self): """ Initializes the bitmaps and colours. """ # create wxBitmaps from the xpm's self._rightBottomCorner = self.ConvertToBitmap(shadow_center_xpm, shadow_center_alpha) self._bottom = self.ConvertToBitmap(shadow_bottom_xpm, shadow_bottom_alpha) self._bottomLeft = self.ConvertToBitmap(shadow_bottom_left_xpm, shadow_bottom_left_alpha) self._rightTop = self.ConvertToBitmap(shadow_right_top_xpm, shadow_right_top_alpha) self._right = self.ConvertToBitmap(shadow_right_xpm, shadow_right_alpha) # initialise the colour map self.InitColours() self.SetMenuBarColour(self._menuBarColourScheme) # Create common bitmaps self.FillStockBitmaps() def FillStockBitmaps(self): """ Initializes few standard bitmaps. """ bmp = self.ConvertToBitmap(arrow_down, alpha=None) bmp.SetMask(wx.Mask(bmp, wx.Colour(0, 128, 128))) self._bitmaps.update({"arrow_down": bmp}) bmp = self.ConvertToBitmap(arrow_up, alpha=None) bmp.SetMask(wx.Mask(bmp, wx.Colour(0, 128, 128))) self._bitmaps.update({"arrow_up": bmp}) def GetStockBitmap(self, name): """ Returns a bitmap from a stock. :param `name`: the bitmap name. :return: The stock bitmap, if `name` was found in the stock bitmap dictionary. Othewise, `wx.NullBitmap` is returned. """ if self._bitmaps.has_key(name): return self._bitmaps[name] return wx.NullBitmap def Get(self): """ Accessor to the unique art manager object. """ if not hasattr(self, "_instance"): self._instance = ArtManager() self._instance.Initialize() # Initialize the renderers map self._renderers[StyleXP] = RendererXP() self._renderers[Style2007] = RendererMSOffice2007() return self._instance Get = classmethod(Get) def Free(self): """ Destructor for the unique art manager object. """ if hasattr(self, "_instance"): del self._instance Free = classmethod(Free) def OnSysColourChange(self, event): """ Handles the ``wx.EVT_SYS_COLOUR_CHANGED`` event for L{ArtManager}. :param `event`: a `wx.SysColourChangedEvent` event to be processed. """ # reinitialise the colour map self.InitColours() def LightColour(self, colour, percent): """ Return light contrast of `colour`. The colour returned is from the scale of `colour` ==> white. :param `colour`: the input colour to be brightened; :param `percent`: determines how light the colour will be. `percent` = 100 returns white, `percent` = 0 returns `colour`. """ end_colour = wx.WHITE rd = end_colour.Red() - colour.Red() gd = end_colour.Green() - colour.Green() bd = end_colour.Blue() - colour.Blue() high = 100 # We take the percent way of the colour from colour -. white i = percent r = colour.Red() + ((i*rd*100)/high)/100 g = colour.Green() + ((i*gd*100)/high)/100 b = colour.Blue() + ((i*bd*100)/high)/100 return wx.Colour(r, g, b) def DarkColour(self, colour, percent): """ Like the L{LightColour} function, but create the colour darker by `percent`. :param `colour`: the input colour to be darkened; :param `percent`: determines how dark the colour will be. `percent` = 100 returns black, `percent` = 0 returns `colour`. """ end_colour = wx.BLACK rd = end_colour.Red() - colour.Red() gd = end_colour.Green() - colour.Green() bd = end_colour.Blue() - colour.Blue() high = 100 # We take the percent way of the colour from colour -. white i = percent r = colour.Red() + ((i*rd*100)/high)/100 g = colour.Green() + ((i*gd*100)/high)/100 b = colour.Blue() + ((i*bd*100)/high)/100 return wx.Colour(r, g, b) def PaintStraightGradientBox(self, dc, rect, startColour, endColour, vertical=True): """ Paint the rectangle with gradient colouring; the gradient lines are either horizontal or vertical. :param `dc`: an instance of `wx.DC`; :param `rect`: the rectangle to be filled with gradient shading; :param `startColour`: the first colour of the gradient shading; :param `endColour`: the second colour of the gradient shading; :param `vertical`: ``True`` for gradient colouring in the vertical direction, ``False`` for horizontal shading. """ dcsaver = DCSaver(dc) if vertical: high = rect.GetHeight()-1 direction = wx.SOUTH else: high = rect.GetWidth()-1 direction = wx.EAST if high < 1: return dc.GradientFillLinear(rect, startColour, endColour, direction) def PaintGradientRegion(self, dc, region, startColour, endColour, vertical=True): """ Paint a region with gradient colouring. :param `dc`: an instance of `wx.DC`; :param `region`: a region to be filled with gradient shading (an instance of `wx.Region`); :param `startColour`: the first colour of the gradient shading; :param `endColour`: the second colour of the gradient shading; :param `vertical`: ``True`` for gradient colouring in the vertical direction, ``False`` for horizontal shading. """ # The way to achieve non-rectangle memDC = wx.MemoryDC() rect = region.GetBox() bitmap = wx.EmptyBitmap(rect.width, rect.height) memDC.SelectObject(bitmap) # Colour the whole rectangle with gradient rr = wx.Rect(0, 0, rect.width, rect.height) self.PaintStraightGradientBox(memDC, rr, startColour, endColour, vertical) # Convert the region to a black and white bitmap with the white pixels being inside the region # we draw the bitmap over the gradient coloured rectangle, with mask set to white, # this will cause our region to be coloured with the gradient, while area outside the # region will be painted with black. then we simply draw the bitmap to the dc with mask set to # black tmpRegion = wx.Region(rect.x, rect.y, rect.width, rect.height) tmpRegion.Offset(-rect.x, -rect.y) regionBmp = tmpRegion.ConvertToBitmap() regionBmp.SetMask(wx.Mask(regionBmp, wx.WHITE)) # The function ConvertToBitmap() return a rectangle bitmap # which is shorter by 1 pixl on the height and width (this is correct behavior, since # DrawLine does not include the second point as part of the line) # we fix this issue by drawing our own line at the bottom and left side of the rectangle memDC.SetPen(wx.BLACK_PEN) memDC.DrawBitmap(regionBmp, 0, 0, True) memDC.DrawLine(0, rr.height - 1, rr.width, rr.height - 1) memDC.DrawLine(rr.width - 1, 0, rr.width - 1, rr.height) memDC.SelectObject(wx.NullBitmap) bitmap.SetMask(wx.Mask(bitmap, wx.BLACK)) dc.DrawBitmap(bitmap, rect.x, rect.y, True) def PaintDiagonalGradientBox(self, dc, rect, startColour, endColour, startAtUpperLeft=True, trimToSquare=True): """ Paint rectangle with gradient colouring; the gradient lines are diagonal and may start from the upper left corner or from the upper right corner. :param `dc`: an instance of `wx.DC`; :param `rect`: the rectangle to be filled with gradient shading; :param `startColour`: the first colour of the gradient shading; :param `endColour`: the second colour of the gradient shading; :param `startAtUpperLeft`: ``True`` to start the gradient lines at the upper left corner of the rectangle, ``False`` to start at the upper right corner; :param `trimToSquare`: ``True`` to trim the gradient lines in a square. """ # Save the current pen and brush savedPen = dc.GetPen() savedBrush = dc.GetBrush() # gradient fill from colour 1 to colour 2 with top to bottom if rect.height < 1 or rect.width < 1: return # calculate some basic numbers size = rect.width sizeX = sizeY = 0 proportion = 1 if rect.width > rect.height: if trimToSquare: size = rect.height sizeX = sizeY = rect.height - 1 else: proportion = float(rect.height)/float(rect.width) size = rect.width sizeX = rect.width - 1 sizeY = rect.height -1 else: if trimToSquare: size = rect.width sizeX = sizeY = rect.width - 1 else: sizeX = rect.width - 1 size = rect.height sizeY = rect.height - 1 proportion = float(rect.width)/float(rect.height) # calculate gradient coefficients col2 = endColour col1 = startColour rf, gf, bf = 0, 0, 0 rstep = float(col2.Red() - col1.Red())/float(size) gstep = float(col2.Green() - col1.Green())/float(size) bstep = float(col2.Blue() - col1.Blue())/float(size) # draw the upper triangle for i in xrange(size): currCol = wx.Colour(col1.Red() + rf, col1.Green() + gf, col1.Blue() + bf) dc.SetBrush(wx.Brush(currCol, wx.SOLID)) dc.SetPen(wx.Pen(currCol)) if startAtUpperLeft: if rect.width > rect.height: dc.DrawLine(rect.x + i, rect.y, rect.x, int(rect.y + proportion*i)) dc.DrawPoint(rect.x, int(rect.y + proportion*i)) else: dc.DrawLine(int(rect.x + proportion*i), rect.y, rect.x, rect.y + i) dc.DrawPoint(rect.x, rect.y + i) else: if rect.width > rect.height: dc.DrawLine(rect.x + sizeX - i, rect.y, rect.x + sizeX, int(rect.y + proportion*i)) dc.DrawPoint(rect.x + sizeX, int(rect.y + proportion*i)) else: xTo = (int(rect.x + sizeX - proportion * i) > rect.x and [int(rect.x + sizeX - proportion*i)] or [rect.x])[0] dc.DrawLine(xTo, rect.y, rect.x + sizeX, rect.y + i) dc.DrawPoint(rect.x + sizeX, rect.y + i) rf += rstep/2 gf += gstep/2 bf += bstep/2 # draw the lower triangle for i in xrange(size): currCol = wx.Colour(col1.Red() + rf, col1.Green() + gf, col1.Blue() + bf) dc.SetBrush(wx.Brush(currCol, wx.SOLID)) dc.SetPen(wx.Pen(currCol)) if startAtUpperLeft: if rect.width > rect.height: dc.DrawLine(rect.x + i, rect.y + sizeY, rect.x + sizeX, int(rect.y + proportion * i)) dc.DrawPoint(rect.x + sizeX, int(rect.y + proportion * i)) else: dc.DrawLine(int(rect.x + proportion * i), rect.y + sizeY, rect.x + sizeX, rect.y + i) dc.DrawPoint(rect.x + sizeX, rect.y + i) else: if rect.width > rect.height: dc.DrawLine(rect.x, (int)(rect.y + proportion * i), rect.x + sizeX - i, rect.y + sizeY) dc.DrawPoint(rect.x + sizeX - i, rect.y + sizeY) else: xTo = (int(rect.x + sizeX - proportion*i) > rect.x and [int(rect.x + sizeX - proportion*i)] or [rect.x])[0] dc.DrawLine(rect.x, rect.y + i, xTo, rect.y + sizeY) dc.DrawPoint(xTo, rect.y + sizeY) rf += rstep/2 gf += gstep/2 bf += bstep/2 # Restore the pen and brush dc.SetPen( savedPen ) dc.SetBrush( savedBrush ) def PaintCrescentGradientBox(self, dc, rect, startColour, endColour, concave=True): """ Paint a region with gradient colouring. The gradient is in crescent shape which fits the 2007 style. :param `dc`: an instance of `wx.DC`; :param `rect`: the rectangle to be filled with gradient shading; :param `startColour`: the first colour of the gradient shading; :param `endColour`: the second colour of the gradient shading; :param `concave`: ``True`` for a concave effect, ``False`` for a convex one. """ diagonalRectWidth = rect.GetWidth()/4 spare = rect.width - 4*diagonalRectWidth leftRect = wx.Rect(rect.x, rect.y, diagonalRectWidth, rect.GetHeight()) rightRect = wx.Rect(rect.x + 3 * diagonalRectWidth + spare, rect.y, diagonalRectWidth, rect.GetHeight()) if concave: self.PaintStraightGradientBox(dc, rect, self.MixColours(startColour, endColour, 50), endColour) self.PaintDiagonalGradientBox(dc, leftRect, startColour, endColour, True, False) self.PaintDiagonalGradientBox(dc, rightRect, startColour, endColour, False, False) else: self.PaintStraightGradientBox(dc, rect, endColour, self.MixColours(endColour, startColour, 50)) self.PaintDiagonalGradientBox(dc, leftRect, endColour, startColour, False, False) self.PaintDiagonalGradientBox(dc, rightRect, endColour, startColour, True, False) def FrameColour(self): """ Return the surrounding colour for a control. """ return wx.SystemSettings_GetColour(wx.SYS_COLOUR_ACTIVECAPTION) def BackgroundColour(self): """ Returns the background colour of a control when not in focus. """ return self.LightColour(self.FrameColour(), 75) def HighlightBackgroundColour(self): """ Returns the background colour of a control when it is in focus. """ return self.LightColour(self.FrameColour(), 60) def MixColours(self, firstColour, secondColour, percent): """ Return mix of input colours. :param `firstColour`: the first colour to be mixed, an instance of `wx.Colour`; :param `secondColour`: the second colour to be mixed, an instance of `wx.Colour`; :param `percent`: the relative percentage of `firstColour` with respect to `secondColour`. """ # calculate gradient coefficients redOffset = float((secondColour.Red() * (100 - percent) / 100) - (firstColour.Red() * percent / 100)) greenOffset = float((secondColour.Green() * (100 - percent) / 100) - (firstColour.Green() * percent / 100)) blueOffset = float((secondColour.Blue() * (100 - percent) / 100) - (firstColour.Blue() * percent / 100)) return wx.Colour(firstColour.Red() + redOffset, firstColour.Green() + greenOffset, firstColour.Blue() + blueOffset) def RandomColour(): """ Creates a random colour. """ r = random.randint(0, 255) # Random value betweem 0-255 g = random.randint(0, 255) # Random value betweem 0-255 b = random.randint(0, 255) # Random value betweem 0-255 return wx.Colour(r, g, b) def IsDark(self, colour): """ Returns whether a colour is dark or light. :param `colour`: an instance of `wx.Colour`. """ evg = (colour.Red() + colour.Green() + colour.Blue())/3 if evg < 127: return True return False def TruncateText(self, dc, text, maxWidth): """ Truncates a given string to fit given width size. if the text does not fit into the given width it is truncated to fit. the format of the fixed text is . :param `dc`: an instance of `wx.DC`; :param `text`: the text to be (eventually) truncated; :param `maxWidth`: the maximum width allowed for the text. """ textLen = len(text) tempText = text rectSize = maxWidth fixedText = "" textW, textH = dc.GetTextExtent(text) if rectSize >= textW: return text # The text does not fit in the designated area, # so we need to truncate it a bit suffix = ".." w, h = dc.GetTextExtent(suffix) rectSize -= w for i in xrange(textLen, -1, -1): textW, textH = dc.GetTextExtent(tempText) if rectSize >= textW: fixedText = tempText fixedText += ".." return fixedText tempText = tempText[:-1] def DrawButton(self, dc, rect, theme, state, input=None): """ Colour rectangle according to the theme. :param `dc`: an instance of `wx.DC`; :param `rect`: the rectangle to be filled with gradient shading; :param `theme`: the theme to use to draw the button; :param `state`: the button state; :param `input`: a flag used to call the right method. """ if input is None or type(input) == type(False): self.DrawButtonTheme(dc, rect, theme, state, input) else: self.DrawButtonColour(dc, rect, theme, state, input) def DrawButtonTheme(self, dc, rect, theme, state, useLightColours=True): """ Draws a button using the appropriate theme. :param `dc`: an instance of `wx.DC`; :param `rect`: the button's client rectangle; :param `theme`: the theme to use to draw the button; :param `state`: the button state; :param `useLightColours`: ``True`` to use light colours, ``False`` otherwise. """ renderer = self._renderers[theme] # Set background colour if non given by caller renderer.DrawButton(dc, rect, state, useLightColours) def DrawButtonColour(self, dc, rect, theme, state, colour): """ Draws a button using the appropriate theme. :param `dc`: an instance of `wx.DC`; :param `rect`: the button's client rectangle; :param `theme`: the theme to use to draw the button; :param `state`: the button state; :param `colour`: a valid `wx.Colour` instance. """ renderer = self._renderers[theme] renderer.DrawButton(dc, rect, state, colour) def CanMakeWindowsTransparent(self): """ Used internally. :return: ``True`` if the system supports transparency of toplevel windows, otherwise returns ``False``. """ if wx.Platform == "__WXMSW__": version = wx.GetOsDescription() found = version.find("XP") >= 0 or version.find("2000") >= 0 or version.find("NT") >= 0 return found elif wx.Platform == "__WXMAC__": return True else: return False # on supported windows systems (Win2000 and greater), this function # will make a frame window transparent by a certain amount def MakeWindowTransparent(self, wnd, amount): """ Used internally. Makes a toplevel window transparent if the system supports it. :param `wnd`: the toplevel window to make transparent; :param `amount`: the window transparency to apply. """ if wnd.GetSize() == (0, 0): return # this API call is not in all SDKs, only the newer ones, so # we will runtime bind this if wx.Platform == "__WXMSW__": hwnd = wnd.GetHandle() if not hasattr(self, "_winlib"): if _libimported == "MH": self._winlib = win32api.LoadLibrary("user32") elif _libimported == "ctypes": self._winlib = ctypes.windll.user32 if _libimported == "MH": pSetLayeredWindowAttributes = win32api.GetProcAddress(self._winlib, "SetLayeredWindowAttributes") if pSetLayeredWindowAttributes is None: return exstyle = win32api.GetWindowLong(hwnd, win32con.GWL_EXSTYLE) if 0 == (exstyle & 0x80000): win32api.SetWindowLong(hwnd, win32con.GWL_EXSTYLE, exstyle | 0x80000) winxpgui.SetLayeredWindowAttributes(hwnd, 0, amount, 2) elif _libimported == "ctypes": style = self._winlib.GetWindowLongA(hwnd, 0xffffffecL) style |= 0x00080000 self._winlib.SetWindowLongA(hwnd, 0xffffffecL, style) self._winlib.SetLayeredWindowAttributes(hwnd, 0, amount, 2) else: if not wnd.CanSetTransparent(): return wnd.SetTransparent(amount) return # assumption: the background was already drawn on the dc def DrawBitmapShadow(self, dc, rect, where=BottomShadow|RightShadow): """ Draws a shadow using background bitmap. :param `dc`: an instance of `wx.DC`; :param `rect`: the bitmap's client rectangle; :param `where`: where to draw the shadow. This can be any combination of the following bits: ========================== ======= ================================ Shadow Settings Value Description ========================== ======= ================================ ``RightShadow`` 1 Right side shadow ``BottomShadow`` 2 Not full bottom shadow ``BottomShadowFull`` 4 Full bottom shadow ========================== ======= ================================ """ shadowSize = 5 # the rect must be at least 5x5 pixles if rect.height < 2*shadowSize or rect.width < 2*shadowSize: return # Start by drawing the right bottom corner if where & BottomShadow or where & BottomShadowFull: dc.DrawBitmap(self._rightBottomCorner, rect.x+rect.width, rect.y+rect.height, True) # Draw right side shadow xx = rect.x + rect.width yy = rect.y + rect.height - shadowSize if where & RightShadow: while yy - rect.y > 2*shadowSize: dc.DrawBitmap(self._right, xx, yy, True) yy -= shadowSize dc.DrawBitmap(self._rightTop, xx, yy - shadowSize, True) if where & BottomShadow: xx = rect.x + rect.width - shadowSize yy = rect.height + rect.y while xx - rect.x > 2*shadowSize: dc.DrawBitmap(self._bottom, xx, yy, True) xx -= shadowSize dc.DrawBitmap(self._bottomLeft, xx - shadowSize, yy, True) if where & BottomShadowFull: xx = rect.x + rect.width - shadowSize yy = rect.height + rect.y while xx - rect.x >= 0: dc.DrawBitmap(self._bottom, xx, yy, True) xx -= shadowSize dc.DrawBitmap(self._bottom, xx, yy, True) def DropShadow(self, wnd, drop=True): """ Adds a shadow under the window (Windows Only). :param `wnd`: the window for which we are dropping a shadow; :param `drop`: ``True`` to drop a shadow, ``False`` to remove it. """ if not self.CanMakeWindowsTransparent() or not _libimported: return if "__WXMSW__" in wx.Platform: hwnd = wnd.GetHandle() if not hasattr(self, "_winlib"): if _libimported == "MH": self._winlib = win32api.LoadLibrary("user32") elif _libimported == "ctypes": self._winlib = ctypes.windll.user32 if _libimported == "MH": csstyle = win32api.GetWindowLong(hwnd, win32con.GCL_STYLE) else: csstyle = self._winlib.GetWindowLongA(hwnd, win32con.GCL_STYLE) if drop: if csstyle & CS_DROPSHADOW: return else: csstyle |= CS_DROPSHADOW #Nothing to be done else: if csstyle & CS_DROPSHADOW: csstyle &= ~(CS_DROPSHADOW) else: return #Nothing to be done win32api.SetWindowLong(hwnd, win32con.GCL_STYLE, csstyle) def GetBitmapStartLocation(self, dc, rect, bitmap, text="", style=0): """ Returns the top left `x` and `y` cordinates of the bitmap drawing. :param `dc`: an instance of `wx.DC`; :param `rect`: the bitmap's client rectangle; :param `bitmap`: the bitmap associated with the button; :param `text`: the button label; :param `style`: the button style. This can be one of the following bits: ============================== ======= ================================ Button style Value Description ============================== ======= ================================ ``BU_EXT_XP_STYLE`` 1 A button with a XP style ``BU_EXT_2007_STYLE`` 2 A button with a MS Office 2007 style ``BU_EXT_LEFT_ALIGN_STYLE`` 4 A left-aligned button ``BU_EXT_CENTER_ALIGN_STYLE`` 8 A center-aligned button ``BU_EXT_RIGHT_ALIGN_STYLE`` 16 A right-aligned button ``BU_EXT_RIGHT_TO_LEFT_STYLE`` 32 A button suitable for right-to-left languages ============================== ======= ================================ """ alignmentBuffer = self.GetAlignBuffer() # get the startLocationY fixedTextWidth = fixedTextHeight = 0 if not text: fixedTextHeight = bitmap.GetHeight() else: fixedTextWidth, fixedTextHeight = dc.GetTextExtent(text) startLocationY = rect.y + (rect.height - fixedTextHeight)/2 # get the startLocationX if style & BU_EXT_RIGHT_TO_LEFT_STYLE: startLocationX = rect.x + rect.width - alignmentBuffer - bitmap.GetWidth() else: if style & BU_EXT_RIGHT_ALIGN_STYLE: maxWidth = rect.x + rect.width - (2 * alignmentBuffer) - bitmap.GetWidth() # the alignment is for both sides # get the truncaed text. The text may stay as is, it is not a must that is will be trancated fixedText = self.TruncateText(dc, text, maxWidth) # get the fixed text dimentions fixedTextWidth, fixedTextHeight = dc.GetTextExtent(fixedText) # calculate the start location startLocationX = maxWidth - fixedTextWidth elif style & BU_EXT_LEFT_ALIGN_STYLE: # calculate the start location startLocationX = alignmentBuffer else: # meaning BU_EXT_CENTER_ALIGN_STYLE maxWidth = rect.x + rect.width - (2 * alignmentBuffer) - bitmap.GetWidth() # the alignment is for both sides # get the truncaed text. The text may stay as is, it is not a must that is will be trancated fixedText = self.TruncateText(dc, text, maxWidth) # get the fixed text dimentions fixedTextWidth, fixedTextHeight = dc.GetTextExtent(fixedText) if maxWidth > fixedTextWidth: # calculate the start location startLocationX = (maxWidth - fixedTextWidth) / 2 else: # calculate the start location startLocationX = maxWidth - fixedTextWidth # it is very important to validate that the start location is not less than the alignment buffer if startLocationX < alignmentBuffer: startLocationX = alignmentBuffer return startLocationX, startLocationY def GetTextStartLocation(self, dc, rect, bitmap, text, style=0): """ Returns the top left `x` and `y` cordinates of the text drawing. In case the text is too long, the text is being fixed (the text is cut and a '...' mark is added in the end). :param `dc`: an instance of `wx.DC`; :param `rect`: the text's client rectangle; :param `bitmap`: the bitmap associated with the button; :param `text`: the button label; :param `style`: the button style. :see: L{GetBitmapStartLocation} for a list of valid button styles. """ alignmentBuffer = self.GetAlignBuffer() # get the bitmap offset bitmapOffset = 0 if bitmap != wx.NullBitmap: bitmapOffset = bitmap.GetWidth() # get the truncated text. The text may stay as is, it is not a must that is will be trancated maxWidth = rect.x + rect.width - (2 * alignmentBuffer) - bitmapOffset # the alignment is for both sides fixedText = self.TruncateText(dc, text, maxWidth) # get the fixed text dimentions fixedTextWidth, fixedTextHeight = dc.GetTextExtent(fixedText) startLocationY = (rect.height - fixedTextHeight) / 2 + rect.y # get the startLocationX if style & BU_EXT_RIGHT_TO_LEFT_STYLE: startLocationX = maxWidth - fixedTextWidth + alignmentBuffer else: if style & BU_EXT_LEFT_ALIGN_STYLE: # calculate the start location startLocationX = bitmapOffset + alignmentBuffer elif style & BU_EXT_RIGHT_ALIGN_STYLE: # calculate the start location startLocationX = maxWidth - fixedTextWidth + bitmapOffset + alignmentBuffer else: # meaning wxBU_EXT_CENTER_ALIGN_STYLE # calculate the start location startLocationX = (maxWidth - fixedTextWidth) / 2 + bitmapOffset + alignmentBuffer # it is very important to validate that the start location is not less than the alignment buffer if startLocationX < alignmentBuffer: startLocationX = alignmentBuffer return startLocationX, startLocationY, fixedText def DrawTextAndBitmap(self, dc, rect, text, enable=True, font=wx.NullFont, fontColour=wx.BLACK, bitmap=wx.NullBitmap, grayBitmap=wx.NullBitmap, style=0): """ Draws the text & bitmap on the input dc. :param `dc`: an instance of `wx.DC`; :param `rect`: the text and bitmap client rectangle; :param `text`: the button label; :param `enable`: ``True`` if the button is enabled, ``False`` otherwise; :param `font`: the font to use to draw the text, an instance of `wx.Font`; :param `fontColour`: the colour to use to draw the text, an instance of `wx.Colour`; :param `bitmap`: the bitmap associated with the button; :param `grayBitmap`: a greyed-out version of the input `bitmap` representing a disabled bitmap; :param `style`: the button style. :see: L{GetBitmapStartLocation} for a list of valid button styles. """ # enable colours if enable: dc.SetTextForeground(fontColour) else: dc.SetTextForeground(wx.SystemSettings_GetColour(wx.SYS_COLOUR_GRAYTEXT)) # set the font if font == wx.NullFont: font = wx.SystemSettings_GetFont(wx.SYS_DEFAULT_GUI_FONT) dc.SetFont(font) startLocationX = startLocationY = 0 if bitmap != wx.NullBitmap: # calculate the bitmap start location startLocationX, startLocationY = self.GetBitmapStartLocation(dc, rect, bitmap, text, style) # draw the bitmap if enable: dc.DrawBitmap(bitmap, startLocationX, startLocationY, True) else: dc.DrawBitmap(grayBitmap, startLocationX, startLocationY, True) # calculate the text start location location, labelOnly = self.GetAccelIndex(text) startLocationX, startLocationY, fixedText = self.GetTextStartLocation(dc, rect, bitmap, labelOnly, style) # after all the caculations are finished, it is time to draw the text # underline the first letter that is marked with a '&' if location == -1 or font.GetUnderlined() or location >= len(fixedText): # draw the text dc.DrawText(fixedText, startLocationX, startLocationY) else: # underline the first '&' before = fixedText[0:location] underlineLetter = fixedText[location] after = fixedText[location+1:] # before dc.DrawText(before, startLocationX, startLocationY) # underlineLetter if "__WXGTK__" not in wx.Platform: w1, h = dc.GetTextExtent(before) font.SetUnderlined(True) dc.SetFont(font) dc.DrawText(underlineLetter, startLocationX + w1, startLocationY) else: w1, h = dc.GetTextExtent(before) dc.DrawText(underlineLetter, startLocationX + w1, startLocationY) # Draw the underline ourselves since using the Underline in GTK, # causes the line to be too close to the letter uderlineLetterW, uderlineLetterH = dc.GetTextExtent(underlineLetter) curPen = dc.GetPen() dc.SetPen(wx.BLACK_PEN) dc.DrawLine(startLocationX + w1, startLocationY + uderlineLetterH - 2, startLocationX + w1 + uderlineLetterW, startLocationY + uderlineLetterH - 2) dc.SetPen(curPen) # after w2, h = dc.GetTextExtent(underlineLetter) font.SetUnderlined(False) dc.SetFont(font) dc.DrawText(after, startLocationX + w1 + w2, startLocationY) def CalcButtonBestSize(self, label, bmp): """ Returns the best fit size for the supplied label & bitmap. :param `label`: the button label; :param `bmp`: the bitmap associated with the button. """ if "__WXMSW__" in wx.Platform: HEIGHT = 22 else: HEIGHT = 26 dc = wx.MemoryDC() dc.SelectBitmap(wx.EmptyBitmap(1, 1)) dc.SetFont(wx.SystemSettings_GetFont(wx.SYS_DEFAULT_GUI_FONT)) width, height, dummy = dc.GetMultiLineTextExtent(label) width += 2*self.GetAlignBuffer() if bmp.Ok(): # allocate extra space for the bitmap heightBmp = bmp.GetHeight() + 2 if height < heightBmp: height = heightBmp width += bmp.GetWidth() + 2 if height < HEIGHT: height = HEIGHT dc.SelectBitmap(wx.NullBitmap) return wx.Size(width, height) def GetMenuFaceColour(self): """ Returns the colour used for the menu foreground. """ renderer = self._renderers[self.GetMenuTheme()] return renderer.GetMenuFaceColour() def GetTextColourEnable(self): """ Returns the colour used for enabled menu items. """ renderer = self._renderers[self.GetMenuTheme()] return renderer.GetTextColourEnable() def GetTextColourDisable(self): """ Returns the colour used for disabled menu items. """ renderer = self._renderers[self.GetMenuTheme()] return renderer.GetTextColourDisable() def GetFont(self): """ Returns the font used by this theme. """ renderer = self._renderers[self.GetMenuTheme()] return renderer.GetFont() def GetAccelIndex(self, label): """ Returns the mnemonic index of the label and the label stripped of the ampersand mnemonic (e.g. 'lab&el' ==> will result in 3 and labelOnly = label). :param `label`: a string containining an ampersand. """ indexAccel = 0 while True: indexAccel = label.find("&", indexAccel) if indexAccel == -1: return indexAccel, label if label[indexAccel:indexAccel+2] == "&&": label = label[0:indexAccel] + label[indexAccel+1:] indexAccel += 1 else: break labelOnly = label[0:indexAccel] + label[indexAccel+1:] return indexAccel, labelOnly def GetThemeBaseColour(self, useLightColours=True): """ Returns the theme (Blue, Silver, Green etc.) base colour, if no theme is active it return the active caption colour, lighter in 30%. :param `useLightColours`: ``True`` to use light colours, ``False`` otherwise. """ if not useLightColours and not self.IsDark(self.FrameColour()): return wx.NamedColour("GOLD") else: return self.LightColour(self.FrameColour(), 30) def GetAlignBuffer(self): """ Return the padding buffer for a text or bitmap. """ return self._alignmentBuffer def SetMenuTheme(self, theme): """ Set the menu theme, possible values (Style2007, StyleXP, StyleVista). :param `theme`: a rendering theme class, either `StyleXP`, `Style2007` or `StyleVista`. """ self._menuTheme = theme def GetMenuTheme(self): """ Returns the currently used menu theme. """ return self._menuTheme def AddMenuTheme(self, render): """ Adds a new theme to the stock. :param `render`: a rendering theme class, which must be derived from L{RendererBase}. """ # Add new theme lastRenderer = len(self._renderers) self._renderers[lastRenderer] = render return lastRenderer def SetMS2007ButtonSunken(self, sunken): """ Sets MS 2007 button style sunken or not. :param `sunken`: ``True`` to have a sunken border effect, ``False`` otherwise. """ self._ms2007sunken = sunken def GetMS2007ButtonSunken(self): """ Returns the sunken flag for MS 2007 buttons. """ return self._ms2007sunken def GetMBVerticalGradient(self): """ Returns ``True`` if the menu bar should be painted with vertical gradient. """ return self._verticalGradient def SetMBVerticalGradient(self, v): """ Sets the menu bar gradient style. :param `v`: ``True`` for a vertical shaded gradient, ``False`` otherwise. """ self._verticalGradient = v def DrawMenuBarBorder(self, border): """ Enables menu border drawing (XP style only). :param `border`: ``True`` to draw the menubar border, ``False`` otherwise. """ self._drowMBBorder = border def GetMenuBarBorder(self): """ Returns menu bar border drawing flag. """ return self._drowMBBorder def GetMenuBgFactor(self): """ Gets the visibility depth of the menu in Metallic style. The higher the value, the menu bar will look more raised """ return self._menuBgFactor def DrawDragSash(self, rect): """ Draws resize sash. :param `rect`: the sash client rectangle. """ dc = wx.ScreenDC() mem_dc = wx.MemoryDC() bmp = wx.EmptyBitmap(rect.width, rect.height) mem_dc.SelectObject(bmp) mem_dc.SetBrush(wx.WHITE_BRUSH) mem_dc.SetPen(wx.Pen(wx.WHITE, 1)) mem_dc.DrawRectangle(0, 0, rect.width, rect.height) dc.Blit(rect.x, rect.y, rect.width, rect.height, mem_dc, 0, 0, wx.XOR) def TakeScreenShot(self, rect, bmp): """ Takes a screenshot of the screen at given position & size (rect). :param `rect`: the screen rectangle we wish to capture; :param `bmp`: currently unused. """ # Create a DC for the whole screen area dcScreen = wx.ScreenDC() # Create a Bitmap that will later on hold the screenshot image # Note that the Bitmap must have a size big enough to hold the screenshot # -1 means using the current default colour depth bmp = wx.EmptyBitmap(rect.width, rect.height) # Create a memory DC that will be used for actually taking the screenshot memDC = wx.MemoryDC() # Tell the memory DC to use our Bitmap # all drawing action on the memory DC will go to the Bitmap now memDC.SelectObject(bmp) # Blit (in this case copy) the actual screen on the memory DC # and thus the Bitmap memDC.Blit( 0, # Copy to this X coordinate 0, # Copy to this Y coordinate rect.width, # Copy this width rect.height, # Copy this height dcScreen, # From where do we copy? rect.x, # What's the X offset in the original DC? rect.y # What's the Y offset in the original DC? ) # Select the Bitmap out of the memory DC by selecting a new # uninitialized Bitmap memDC.SelectObject(wx.NullBitmap) def DrawToolBarBg(self, dc, rect): """ Draws the toolbar background according to the active theme. :param `dc`: an instance of `wx.DC`; :param `rect`: the toolbar's client rectangle. """ renderer = self._renderers[self.GetMenuTheme()] # Set background colour if non given by caller renderer.DrawToolBarBg(dc, rect) def DrawMenuBarBg(self, dc, rect): """ Draws the menu bar background according to the active theme. :param `dc`: an instance of `wx.DC`; :param `rect`: the menubar's client rectangle. """ renderer = self._renderers[self.GetMenuTheme()] # Set background colour if non given by caller renderer.DrawMenuBarBg(dc, rect) def SetMenuBarColour(self, scheme): """ Sets the menu bar colour scheme to use. :param `scheme`: a string representing a colour scheme (i.e., 'Default', 'Dark', 'Dark Olive Green', 'Generic'). """ self._menuBarColourScheme = scheme # set default colour if scheme in self._colourSchemeMap.keys(): self._menuBarBgColour = self._colourSchemeMap[scheme] def GetMenuBarColourScheme(self): """ Returns the current colour scheme. """ return self._menuBarColourScheme def GetMenuBarFaceColour(self): """ Returns the menu bar face colour. """ return self._menuBarBgColour def GetMenuBarSelectionColour(self): """ Returns the menu bar selection colour. """ return self._menuBarSelColour def InitColours(self): """ Initialise the colour map. """ self._colourSchemeMap = {_("Default"): wx.SystemSettings_GetColour(wx.SYS_COLOUR_3DFACE), _("Dark"): wx.BLACK, _("Dark Olive Green"): wx.NamedColour("DARK OLIVE GREEN"), _("Generic"): wx.SystemSettings_GetColour(wx.SYS_COLOUR_ACTIVECAPTION)} def GetColourSchemes(self): """ Returns the available colour schemes. """ return self._colourSchemeMap.keys() def CreateGreyBitmap(self, bmp): """ Creates a grey bitmap image from the input bitmap. :param `bmp`: a valid `wx.Bitmap` object to be greyed out. """ img = bmp.ConvertToImage() return wx.BitmapFromImage(img.ConvertToGreyscale()) def GetRaiseToolbar(self): """ Returns ``True`` if we are dropping a shadow under a toolbar. """ return self._raiseTB def SetRaiseToolbar(self, rais): """ Enables/disables toobar shadow drop. :param `rais`: ``True`` to drop a shadow below a toolbar, ``False`` otherwise. """ self._raiseTB = rais DisplayCAL-3.1.0.0/DisplayCAL/lib/agw/fmresources.py0000644000076500000000000003237212647526510021671 0ustar devwheel00000000000000import wx # Overall menu styles StyleDefault = 0 StyleXP = 1 Style2007 = 2 StyleVista = 3 # Menu shadows RightShadow = 1 # Right side shadow BottomShadow = 2 # Not full bottom shadow BottomShadowFull = 4 # Full bottom shadow # Button styles BU_EXT_XP_STYLE = 1 BU_EXT_2007_STYLE = 2 BU_EXT_LEFT_ALIGN_STYLE = 4 BU_EXT_CENTER_ALIGN_STYLE = 8 BU_EXT_RIGHT_ALIGN_STYLE = 16 BU_EXT_RIGHT_TO_LEFT_STYLE = 32 # Control state ControlPressed = 0 ControlFocus = 1 ControlDisabled = 2 ControlNormal = 3 # FlatMenu styles FM_OPT_IS_LCD = 1 """ Use this style if your computer uses a LCD screen. """ FM_OPT_MINIBAR = 2 """ Use this if you plan to use the toolbar only. """ FM_OPT_SHOW_CUSTOMIZE = 4 """ Show "customize link" in the `More` menu, you will need to write your own handler. See demo. """ FM_OPT_SHOW_TOOLBAR = 8 """ Set this option is you are planning to use the toolbar. """ # Control status ControlStatusNoFocus = 0 ControlStatusFocus = 1 ControlStatusPressed = 2 # HitTest constants NoWhere = 0 MenuItem = 1 ToolbarItem = 2 DropDownArrowButton = 3 FTB_ITEM_TOOL = 0 FTB_ITEM_SEPARATOR = 1 FTB_ITEM_CHECK = 2 FTB_ITEM_RADIO = 3 FTB_ITEM_RADIO_MENU = 4 FTB_ITEM_CUSTOM = 5 LargeIcons = 32 SmallIcons = 16 MENU_HT_NONE = 0 MENU_HT_ITEM = 1 MENU_HT_SCROLL_UP = 2 MENU_HT_SCROLL_DOWN = 3 MENU_DEC_TOP = 0 MENU_DEC_BOTTOM = 1 MENU_DEC_LEFT = 2 MENU_DEC_RIGHT = 3 DROP_DOWN_ARROW_WIDTH = 16 SPACER = 12 MARGIN = 3 TOOLBAR_SPACER = 4 TOOLBAR_MARGIN = 4 SEPARATOR_WIDTH = 12 SCROLL_BTN_HEIGHT = 20 CS_DROPSHADOW = 0x00020000 INB_BOTTOM = 1 INB_LEFT = 2 INB_RIGHT = 4 INB_TOP = 8 INB_BORDER = 16 INB_SHOW_ONLY_TEXT = 32 INB_SHOW_ONLY_IMAGES = 64 INB_FIT_BUTTON = 128 INB_DRAW_SHADOW = 256 INB_USE_PIN_BUTTON = 512 INB_GRADIENT_BACKGROUND = 1024 INB_WEB_HILITE = 2048 INB_NO_RESIZE = 4096 INB_FIT_LABELTEXT = 8192 INB_DEFAULT_STYLE = INB_BORDER | INB_TOP | INB_USE_PIN_BUTTON INB_TAB_AREA_BACKGROUND_COLOUR = 100 INB_ACTIVE_TAB_COLOUR = 101 INB_TABS_BORDER_COLOUR = 102 INB_TEXT_COLOUR = 103 INB_ACTIVE_TEXT_COLOUR = 104 INB_HILITE_TAB_COLOUR = 105 INB_LABEL_BOOK_DEFAULT = INB_DRAW_SHADOW | INB_BORDER | INB_USE_PIN_BUTTON | INB_LEFT # HitTest results IMG_OVER_IMG = 0 IMG_OVER_PIN = 1 IMG_OVER_EW_BORDER = 2 IMG_NONE = 3 # Pin button states INB_PIN_NONE = 0 INB_PIN_HOVER = 200 INB_PIN_PRESSED = 201 # Windows Vista Colours rgbSelectOuter = wx.Colour(170, 200, 245) rgbSelectInner = wx.Colour(230, 250, 250) rgbSelectTop = wx.Colour(210, 240, 250) rgbSelectBottom = wx.Colour(185, 215, 250) check_mark_xpm = [" 16 16 16 1", "` c #000000", ". c #800000", "# c #008000", "a c #808000", "b c #000080", "c c #800080", "d c #008080", "e c #808080", "f c #c0c0c0", "g c #ff0000", "h c #00ff00", "i c #ffff00", "j c #0000ff", "k c #ff00ff", "l c #00ffff", "m c #ffffff", "mmmmmmmmmmmmmmmm", "mmmmmmmmmmmmmmmm", "mmmmmmmmmmmmmmmm", "mmmmmmmmmmmmmmmm", "mmmmmmmmmmmmmmmm", "mmmmmmmmmm`mmmmm", "mmmmmmmmm``mmmmm", "mmmm`mmm```mmmmm", "mmmm``m```mmmmmm", "mmmm`````mmmmmmm", "mmmmm```mmmmmmmm", "mmmmmm`mmmmmmmmm", "mmmmmmmmmmmmmmmm", "mmmmmmmmmmmmmmmm", "mmmmmmmmmmmmmmmm", "mmmmmmmmmmmmmmmm" ] radio_item_xpm = [" 16 16 16 1", "` c #000000", ". c #800000", "# c #008000", "a c #808000", "b c #000080", "c c #800080", "d c #008080", "e c #808080", "f c #c0c0c0", "g c #ff0000", "h c #00ff00", "i c #ffff00", "j c #0000ff", "k c #ff00ff", "l c #00ffff", "m c #ffffff", "mmmmmmmmmmmmmmmm", "mmmmmmmmmmmmmmmm", "mmmmmmmmmmmmmmmm", "mmmmmmmmmmmmmmmm", "mmmmmmmmmmmmmmmm", "mmmmmmmmmmmmmmmm", "mmmmmm```mmmmmmm", "mmmmm`````mmmmmm", "mmmmm`````mmmmmm", "mmmmmm```mmmmmmm", "mmmmmmmmmmmmmmmm", "mmmmmmmmmmmmmmmm", "mmmmmmmmmmmmmmmm", "mmmmmmmmmmmmmmmm", "mmmmmmmmmmmmmmmm", "mmmmmmmmmmmmmmmm"] menu_right_arrow_xpm = [ " 16 16 8 1", "` c #ffffff", ". c #000000", "# c #000000", "a c #000000", "b c #000000", "c c #000000", "d c #000000", "e c #000000", "````````````````", "````````````````", "````````````````", "````````````````", "````````````````", "``````.`````````", "``````..````````", "``````...```````", "``````....``````", "``````...```````", "``````..````````", "``````.`````````", "````````````````", "````````````````", "````````````````", "````````````````" ] #---------------------------------- # Shadow images #---------------------------------- shadow_right_xpm = ["5 5 1 1"," c Black"," "," "," "," "," "] # shadow_right.xpm 5x5 shadow_right_alpha = [168, 145, 115, 76, 46, 168, 145, 115, 76, 46, 168, 145, 115, 76, 46, 168, 145, 115, 76, 46, 168, 145, 115, 76, 46] shadow_right_top_xpm = ["5 10 1 1"," c Black"," "," "," "," ", " "," "," "," "," "," "] shadow_right_top_alpha = [40, 35, 28, 18, 11, 67, 58, 46, 31, 18, 101, 87, 69, 46, 28, 128, 110, 87, 58, 35, 148, 128, 101, 67, 40, 161, 139, 110, 73, 44, 168, 145, 115, 76, 46, 168, 145, 115, 76, 46, 168, 145, 115, 76, 46, 168, 145, 115, 76, 46] # shadow_buttom.xpm 5x5 shadow_bottom_alpha = [184, 184, 184, 184, 184, 168, 168, 168, 168, 168, 145, 145, 145, 145, 145, 115, 115, 115, 115, 115, 76, 76, 76, 76, 76] shadow_bottom_left_xpm = ["10 5 1 1"," c Black"," "," ", " "," "," "] shadow_bottom_left_alpha = [22, 44, 73, 110, 139, 161, 176, 184, 184, 184, 20, 40, 67, 101, 128, 148, 161, 168, 168, 168, 17, 35, 58, 87, 110, 128, 139, 145, 145, 145, 13, 28, 46, 69, 87, 101, 110, 115, 115, 115, 9, 18, 31, 46, 58, 67, 73, 76, 76, 76] shadow_center_xpm = ["5 5 1 1"," c Black"," "," "," "," "," "] shadow_center_alpha = [161, 139, 110, 73, 44, 148, 128, 101, 67, 40, 128, 110, 87, 58, 35, 101, 87, 69, 46, 28, 67, 58, 46, 31, 18] shadow_bottom_xpm = ["5 5 1 1"," c Black"," "," "," "," "," "] arrow_down_xpm = ["16 16 3 1", ". c Black", "X c #FFFFFF", " c #008080", " ", " ", " ", " ", " ....... ", " XXXXXXX ", " ", " ....... ", " X.....X ", " X...X ", " X.X ", " X ", " ", " ", " ", " "] #--------------------------------------------- # Pin images #--------------------------------------------- pin_left_xpm = [" 16 16 8 1", "` c #ffffff", ". c #000000", "# c #808080", "a c #000000", "b c #000000", "c c #000000", "d c #000000", "e c #000000", "````````````````", "````````````````", "```````.````````", "```````.````````", "```````.......``", "```````.`````.``", "`````...`````.``", "``......#####.``", "`````...#####.``", "```````.......``", "```````.......``", "```````.````````", "```````.````````", "````````````````", "````````````````", "````````````````"] pin_down_xpm = [" 16 16 8 1", "` c #ffffff", ". c #000000", "# c #808080", "a c #000000", "b c #000000", "c c #000000", "d c #000000", "e c #000000", "````````````````", "````````````````", "````.......`````", "````.``##..`````", "````.``##..`````", "````.``##..`````", "````.``##..`````", "````.``##..`````", "``...........```", "``````...```````", "``````...```````", "```````.````````", "```````.````````", "```````.````````", "````````````````", "````````````````"] arrow_up = 'BM\xf6\x00\x00\x00\x00\x00\x00\x00v\x00\x00\x00(\x00\x00\x00\x10\x00\x00\ \x00\x10\x00\x00\x00\x01\x00\x04\x00\x00\x00\x00\x00\x80\x00\x00\x00\x12\x0b\x00\x00\x12\ \x0b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\x00\x80\x80\x00\ \x00w\xfcM\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00""""""""""""""""""""""""""""""""""\x00\x00\x00\x02""""\x11\x11\ \x11\x12""""""""""""\x00\x00\x00\x02""""\x10\x00\x00\x12""""!\x00\x01""""""\x10\x12""""""!\ """"""""""""""""""""""""""""""""""""' arrow_down = 'BM\xf6\x00\x00\x00\x00\x00\x00\x00v\x00\x00\x00(\x00\x00\x00\x10\x00\x00\x00\ \x10\x00\x00\x00\x01\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x0b\x00\x00\x12\x0b\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\x00\x80\x80\x00\x00w\ \xfcM\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00"""""""""""""""""""""""""""""""""""!"""""""\x10\x12"""""!\x00\x01\ """""\x10\x00\x00\x12""""\x00\x00\x00\x02""""""""""""\x11\x11\x11\x12""""\x00\x00\x00\x02\ """"""""""""""""""""""""""""""""""' menu_up_arrow_xpm = ["16 16 2 1", ". c Black", " c White", " ", " ", " ", " ", " ", " ", " . ", " ... ", " ..... ", " ", " ", " ", " ", " ", " ", " "] menu_down_arrow_xpm = ["16 16 2 1", ". c Black", " c White", " ", " ", " ", " ", " ", " ", " ..... ", " ... ", " . ", " ", " ", " ", " ", " ", " ", " "] def getMenuUpArrowBitmap(): bmp = wx.BitmapFromXPMData(menu_up_arrow_xpm) bmp.SetMask(wx.Mask(bmp, wx.WHITE)) return bmp def getMenuDownArrowBitmap(): bmp = wx.BitmapFromXPMData(menu_down_arrow_xpm) bmp.SetMask(wx.Mask(bmp, wx.WHITE)) return bmp DisplayCAL-3.1.0.0/DisplayCAL/lib/agw/fourwaysplitter.py0000644000076500000000000010372512647526510022620 0ustar devwheel00000000000000# --------------------------------------------------------------------------------- # # FOURWAYSPLITTER wxPython IMPLEMENTATION # # Andrea Gavana, @ 03 Nov 2006 # Latest Revision: 14 Apr 2010, 12.00 GMT # # # TODO List # # 1. Any idea? # # For All Kind Of Problems, Requests Of Enhancements And Bug Reports, Please # Write To Me At: # # gavana@kpo.kz # andrea.gavana@gmail.com # # Or, Obviously, To The wxPython Mailing List!!! # # # End Of Comments # --------------------------------------------------------------------------------- # """ FourWaySplitter is a layout manager which manages 4 children like 4 panes in a window. Description =========== The FourWaySplitter is a layout manager which manages four children like four panes in a window. You can use a four-way splitter for example in a CAD program where you may want to maintain three orthographic views, and one oblique view of a model. The FourWaySplitter allows interactive repartitioning of the panes by means of moving the central splitter bars. When the FourWaySplitter is itself resized, each child is proportionally resized, maintaining the same split-percentage. The main characteristics of FourWaySplitter are: - Handles horizontal, vertical or four way sizing via the sashes; - Delayed or live update when resizing; - Possibility to swap windows; - Setting the vertical and horizontal split fractions; - Possibility to expand a window by hiding the onther 3. And a lot more. See the demo for a complete review of the functionalities. Supported Platforms =================== FourWaySplitter has been tested on the following platforms: * Windows (Windows XP); * Linux Ubuntu (Dapper 6.06) Window Styles ============= This class supports the following window styles: ================== =========== ================================================== Window Styles Hex Value Description ================== =========== ================================================== ``SP_NOSASH`` 0x10 No sash will be drawn on `FourWaySplitter`. ``SP_LIVE_UPDATE`` 0x80 Don't draw XOR line but resize the child windows immediately. ``SP_3DBORDER`` 0x200 Draws a 3D effect border. ================== =========== ================================================== Events Processing ================= This class processes the following events: ================================== ================================================== Event Name Description ================================== ================================================== ``EVT_SPLITTER_SASH_POS_CHANGED`` The sash position was changed. This event is generated after the user releases the mouse after dragging the splitter. Processes a `wx.wxEVT_COMMAND_SPLITTER_SASH_POS_CHANGED` event. ``EVT_SPLITTER_SASH_POS_CHANGING`` The sash position is in the process of being changed. You may prevent this change from happening by calling `Veto` or you may also modify the position of the tracking bar to properly reflect the position that would be set if the drag were to be completed at this point. Processes a `wx.wxEVT_COMMAND_SPLITTER_SASH_POS_CHANGING` event. ================================== ================================================== License And Version =================== FourWaySplitter is distributed under the wxPython license. Latest Revision: Andrea Gavana @ 14 Apr 2010, 12.00 GMT Version 0.4 """ __docformat__ = "epytext" import wx _RENDER_VER = (2,6,1,1) # Tolerance for mouse shape and sizing _TOLERANCE = 5 # Modes NOWHERE = 0 FLAG_CHANGED = 1 FLAG_PRESSED = 2 # FourWaySplitter styles SP_NOSASH = wx.SP_NOSASH """ No sash will be drawn on `FourWaySplitter`. """ SP_LIVE_UPDATE = wx.SP_LIVE_UPDATE """ Don't draw XOR line but resize the child windows immediately. """ SP_3DBORDER = wx.SP_3DBORDER """ Draws a 3D effect border. """ # FourWaySplitter events EVT_SPLITTER_SASH_POS_CHANGING = wx.EVT_SPLITTER_SASH_POS_CHANGING """ The sash position is in the process of being changed. You may prevent this change""" \ """ from happening by calling `Veto` or you may also modify the position of the tracking""" \ """ bar to properly reflect the position that would be set if the drag were to be""" \ """ completed at this point. Processes a `wx.wxEVT_COMMAND_SPLITTER_SASH_POS_CHANGING` event.""" EVT_SPLITTER_SASH_POS_CHANGED = wx.EVT_SPLITTER_SASH_POS_CHANGED """ The sash position was changed. This event is generated after the user releases the""" \ """ mouse after dragging the splitter. Processes a `wx.wxEVT_COMMAND_SPLITTER_SASH_POS_CHANGED` event. """ # ---------------------------------------------------------------------------- # # Class FourWaySplitterEvent # ---------------------------------------------------------------------------- # class FourWaySplitterEvent(wx.PyCommandEvent): """ This event class is almost the same as `wx.SplitterEvent` except it adds an accessor for the sash index that is being changed. The same event type IDs and event binders are used as with `wx.SplitterEvent`. """ def __init__(self, evtType=wx.wxEVT_NULL, splitter=None): """ Default class constructor. :param `evtType`: the event type; :param `splitter`: the associated L{FourWaySplitter} window. """ wx.PyCommandEvent.__init__(self, evtType) if splitter: self.SetEventObject(splitter) self.SetId(splitter.GetId()) self.sashIdx = -1 self.sashPos = -1 self.isAllowed = True def SetSashIdx(self, idx): """ Sets the index of the sash currently involved in the event. :param `idx`: an integer between 0 and 3, representing the index of the sash involved in the event. """ self.sashIdx = idx def SetSashPosition(self, pos): """ In the case of ``EVT_SPLITTER_SASH_POS_CHANGED`` events, sets the new sash position. In the case of ``EVT_SPLITTER_SASH_POS_CHANGING`` events, sets the new tracking bar position so visual feedback during dragging will represent that change that will actually take place. Set to -1 from the event handler code to prevent repositioning. :param `pos`: the new sash position. :note: May only be called while processing ``EVT_SPLITTER_SASH_POS_CHANGING`` and ``EVT_SPLITTER_SASH_POS_CHANGED`` events. """ self.sashPos = pos def GetSashIdx(self): """ Returns the index of the sash currently involved in the event. """ return self.sashIdx def GetSashPosition(self): """ Returns the new sash position. :note: May only be called while processing ``EVT_SPLITTER_SASH_POS_CHANGING`` and ``EVT_SPLITTER_SASH_POS_CHANGED`` events. """ return self.sashPos # methods from wx.NotifyEvent def Veto(self): """ Prevents the change announced by this event from happening. :note: It is in general a good idea to notify the user about the reasons for vetoing the change because otherwise the applications behaviour (which just refuses to do what the user wants) might be quite surprising. """ self.isAllowed = False def Allow(self): """ This is the opposite of L{Veto}: it explicitly allows the event to be processed. For most events it is not necessary to call this method as the events are allowed anyhow but some are forbidden by default (this will be mentioned in the corresponding event description). """ self.isAllowed = True def IsAllowed(self): """ Returns ``True`` if the change is allowed (L{Veto} hasn't been called) or ``False`` otherwise (if it was). """ return self.isAllowed # ---------------------------------------------------------------------------- # # Class FourWaySplitter # ---------------------------------------------------------------------------- # class FourWaySplitter(wx.PyPanel): """ This class is very similar to `wx.SplitterWindow` except that it allows for four windows and two sashes. Many of the same styles, constants, and methods behave the same as in `wx.SplitterWindow`. However, in addition of the ability to drag the vertical and the horizontal sash, by dragging at the intersection between the two sashes, it is possible to resize the four windows at the same time. :note: These things are not yet supported: * Minimum pane size (minimum of what? Width? Height?); * Using negative sash positions to indicate a position offset from the end; * User controlled unsplitting with double clicks on the sash (but supported via the L{FourWaySplitter.SetExpanded} method); * Sash gravity. """ def __init__(self, parent, id=wx.ID_ANY, pos=wx.DefaultPosition, size=wx.DefaultSize, style=0, agwStyle=0, name="FourWaySplitter"): """ Default class constructor. :param `parent`: parent window. Must not be ``None``; :param `id`: window identifier. A value of -1 indicates a default value; :param `pos`: the control position. A value of (-1, -1) indicates a default position, chosen by either the windowing system or wxPython, depending on platform; :param `size`: the control size. A value of (-1, -1) indicates a default size, chosen by either the windowing system or wxPython, depending on platform; :param `style`: the underlying `wx.PyPanel` window style; :param `agwStyle`: the AGW-specific window style. It can be a combination of the following bits: ================== =========== ================================================== Window Styles Hex Value Description ================== =========== ================================================== ``SP_NOSASH`` 0x10 No sash will be drawn on L{FourWaySplitter}. ``SP_LIVE_UPDATE`` 0x80 Don't draw XOR line but resize the child windows immediately. ``SP_3DBORDER`` 0x200 Draws a 3D effect border. ================== =========== ================================================== :param `name`: the window name. """ # always turn on tab traversal style |= wx.TAB_TRAVERSAL # and turn off any border styles style &= ~wx.BORDER_MASK style |= wx.BORDER_NONE self._agwStyle = agwStyle # initialize the base class wx.PyPanel.__init__(self, parent, id, pos, size, style, name) self.SetBackgroundStyle(wx.BG_STYLE_CUSTOM) self._windows = [] self._splitx = 0 self._splity = 0 self._expanded = -1 self._fhor = 5000 self._fver = 5000 self._offx = 0 self._offy = 0 self._mode = NOWHERE self._flags = 0 self._isHot = False self._sashTrackerPen = wx.Pen(wx.BLACK, 2, wx.SOLID) self._sashCursorWE = wx.StockCursor(wx.CURSOR_SIZEWE) self._sashCursorNS = wx.StockCursor(wx.CURSOR_SIZENS) self._sashCursorSIZING = wx.StockCursor(wx.CURSOR_SIZING) self.Bind(wx.EVT_PAINT, self.OnPaint) self.Bind(wx.EVT_MOTION, self.OnMotion) self.Bind(wx.EVT_SIZE, self.OnSize) self.Bind(wx.EVT_LEFT_DOWN, self.OnLeftDown) self.Bind(wx.EVT_LEFT_UP, self.OnLeftUp) self.Bind(wx.EVT_LEAVE_WINDOW, self.OnLeaveWindow) self.Bind(wx.EVT_ENTER_WINDOW, self.OnEnterWindow) def SetAGWWindowStyleFlag(self, agwStyle): """ Sets the L{FourWaySplitter} window style flags. :param `agwStyle`: the AGW-specific window style. This can be a combination of the following bits: ================== =========== ================================================== Window Styles Hex Value Description ================== =========== ================================================== ``SP_NOSASH`` 0x10 No sash will be drawn on L{FourWaySplitter}. ``SP_LIVE_UPDATE`` 0x80 Don't draw XOR line but resize the child windows immediately. ``SP_3DBORDER`` 0x200 Draws a 3D effect border. ================== =========== ================================================== """ self._agwStyle = agwStyle self.Refresh() def GetAGWWindowStyleFlag(self): """ Returns the L{FourWaySplitter} window style. :see: L{SetAGWWindowStyleFlag} for a list of possible window styles. """ return self._agwStyle def AppendWindow(self, window): """ Add a new window to the splitter at the right side or bottom of the window stack. :param `window`: an instance of `wx.Window`. """ self.InsertWindow(len(self._windows), window) def InsertWindow(self, idx, window, sashPos=-1): """ Insert a new window into the splitter at the position given in `idx`. :param `idx`: the index at which the window will be inserted; :param `window`: an instance of `wx.Window`; :param `sashPos`: the sash position after the window insertion. """ assert window not in self._windows, "A window can only be in the splitter once!" self._windows.insert(idx, window) self._SizeWindows() def DetachWindow(self, window): """ Removes the window from the stack of windows managed by the splitter. The window will still exist so you should `Hide` or `Destroy` it as needed. :param `window`: an instance of `wx.Window`. """ assert window in self._windows, "Unknown window!" idx = self._windows.index(window) del self._windows[idx] self._SizeWindows() def ReplaceWindow(self, oldWindow, newWindow): """ Replaces `oldWindow` (which is currently being managed by the splitter) with `newWindow`. The `oldWindow` window will still exist so you should `Hide` or `Destroy` it as needed. :param `oldWindow`: an instance of `wx.Window`; :param `newWindow`: another instance of `wx.Window`. """ assert oldWindow in self._windows, "Unknown window!" idx = self._windows.index(oldWindow) self._windows[idx] = newWindow self._SizeWindows() def ExchangeWindows(self, window1, window2): """ Trade the positions in the splitter of the two windows. :param `window1`: an instance of `wx.Window`; :param `window2`: another instance of `wx.Window`. """ assert window1 in self._windows, "Unknown window!" assert window2 in self._windows, "Unknown window!" idx1 = self._windows.index(window1) idx2 = self._windows.index(window2) self._windows[idx1] = window2 self._windows[idx2] = window1 if "__WXMSW__" in wx.Platform: self.Freeze() self._SizeWindows() if "__WXMSW__" in wx.Platform: self.Thaw() def GetWindow(self, idx): """ Returns the window at the index `idx`. :param `idx`: the index at which the window is located. """ if len(self._windows) > idx: return self._windows[idx] return None # Get top left child def GetTopLeft(self): """ Returns the top left window (window index: 0). """ return self.GetWindow(0) # Get top right child def GetTopRight(self): """ Returns the top right window (window index: 1). """ return self.GetWindow(1) # Get bottom left child def GetBottomLeft(self): """ Returns the bottom left window (window index: 2). """ return self.GetWindow(2) # Get bottom right child def GetBottomRight(self): """ Returns the bottom right window (window index: 3). """ return self.GetWindow(3) def DoGetBestSize(self): """ Gets the size which best suits the window: for a control, it would be the minimal size which doesn't truncate the control, for a panel - the same size as it would have after a call to `Fit()`. :note: Overridden from `wx.PyPanel`. """ if not self._windows: # something is better than nothing... return wx.Size(10, 10) width = height = 0 border = self._GetBorderSize() tl = self.GetTopLeft() tr = self.GetTopRight() bl = self.GetBottomLeft() br = self.GetBottomRight() for win in self._windows: w, h = win.GetEffectiveMinSize() width += w height += h if tl and tr: width += self._GetSashSize() if bl and br: height += self._GetSashSize() return wx.Size(width+2*border, height+2*border) # Recompute layout def _SizeWindows(self): """ Recalculate the layout based on split positions and split fractions. :see: L{SetHSplit} and L{SetVSplit} for more information about split fractions. """ win0 = self.GetTopLeft() win1 = self.GetTopRight() win2 = self.GetBottomLeft() win3 = self.GetBottomRight() width, height = self.GetSize() barSize = self._GetSashSize() border = self._GetBorderSize() if self._expanded < 0: totw = width - barSize - 2*border toth = height - barSize - 2*border self._splitx = (self._fhor*totw)/10000 self._splity = (self._fver*toth)/10000 rightw = totw - self._splitx bottomh = toth - self._splity if win0: win0.SetDimensions(0, 0, self._splitx, self._splity) win0.Show() if win1: win1.SetDimensions(self._splitx + barSize, 0, rightw, self._splity) win1.Show() if win2: win2.SetDimensions(0, self._splity + barSize, self._splitx, bottomh) win2.Show() if win3: win3.SetDimensions(self._splitx + barSize, self._splity + barSize, rightw, bottomh) win3.Show() else: if self._expanded < len(self._windows): for ii, win in enumerate(self._windows): if ii == self._expanded: win.SetDimensions(0, 0, width-2*border, height-2*border) win.Show() else: win.Hide() # Determine split mode def GetMode(self, pt): """ Determines the split mode for L{FourWaySplitter}. :param `pt`: the point at which the mouse has been clicked, an instance of `wx.Point`. :return: One of the following 3 split modes: ================= ============================== Split Mode Description ================= ============================== ``wx.HORIZONTAL`` the user has clicked on the horizontal sash ``wx.VERTICAL`` The user has clicked on the vertical sash ``wx.BOTH`` The user has clicked at the intersection between the 2 sashes ================= ============================== """ barSize = self._GetSashSize() flag = wx.BOTH if pt.x < self._splitx - _TOLERANCE: flag &= ~wx.VERTICAL if pt.y < self._splity - _TOLERANCE: flag &= ~wx.HORIZONTAL if pt.x >= self._splitx + barSize + _TOLERANCE: flag &= ~wx.VERTICAL if pt.y >= self._splity + barSize + _TOLERANCE: flag &= ~wx.HORIZONTAL return flag # Move the split intelligently def MoveSplit(self, x, y): """ Moves the split accordingly to user action. :param `x`: the new splitter `x` coordinate; :param `y`: the new splitter `y` coordinate. """ width, height = self.GetSize() barSize = self._GetSashSize() if x < 0: x = 0 if y < 0: y = 0 if x > width - barSize: x = width - barSize if y > height - barSize: y = height - barSize self._splitx = x self._splity = y # Adjust layout def AdjustLayout(self): """ Adjust layout of L{FourWaySplitter}. Mainly used to recalculate the correct values for split fractions. """ width, height = self.GetSize() barSize = self._GetSashSize() border = self._GetBorderSize() self._fhor = (width > barSize and \ [(10000*self._splitx+(width-barSize-1))/(width-barSize)] \ or [0])[0] self._fver = (height > barSize and \ [(10000*self._splity+(height-barSize-1))/(height-barSize)] \ or [0])[0] self._SizeWindows() # Button being pressed def OnLeftDown(self, event): """ Handles the ``wx.EVT_LEFT_DOWN`` event for L{FourWaySplitter}. :param `event`: a `wx.MouseEvent` event to be processed. """ if not self.IsEnabled(): return pt = event.GetPosition() self.CaptureMouse() self._mode = self.GetMode(pt) if self._mode: self._offx = pt.x - self._splitx self._offy = pt.y - self._splity if not self.GetAGWWindowStyleFlag() & wx.SP_LIVE_UPDATE: self.DrawSplitter(wx.ClientDC(self)) self.DrawTrackSplitter(self._splitx, self._splity) self._flags |= FLAG_PRESSED # Button being released def OnLeftUp(self, event): """ Handles the ``wx.EVT_LEFT_UP`` event for L{FourWaySplitter}. :param `event`: a `wx.MouseEvent` event to be processed. """ if not self.IsEnabled(): return if self.HasCapture(): self.ReleaseMouse() flgs = self._flags self._flags &= ~FLAG_CHANGED self._flags &= ~FLAG_PRESSED if flgs & FLAG_PRESSED: if not self.GetAGWWindowStyleFlag() & wx.SP_LIVE_UPDATE: self.DrawTrackSplitter(self._splitx, self._splity) self.DrawSplitter(wx.ClientDC(self)) self.AdjustLayout() if flgs & FLAG_CHANGED: event = FourWaySplitterEvent(wx.wxEVT_COMMAND_SPLITTER_SASH_POS_CHANGED, self) event.SetSashIdx(self._mode) event.SetSashPosition(wx.Point(self._splitx, self._splity)) self.GetEventHandler().ProcessEvent(event) self._mode = NOWHERE def OnLeaveWindow(self, event): """ Handles the ``wx.EVT_LEAVE_WINDOW`` event for L{FourWaySplitter}. :param `event`: a `wx.MouseEvent` event to be processed. """ self.SetCursor(wx.STANDARD_CURSOR) self._RedrawIfHotSensitive(False) def OnEnterWindow(self, event): """ Handles the ``wx.EVT_ENTER_WINDOW`` event for L{FourWaySplitter}. :param `event`: a `wx.MouseEvent` event to be processed. """ self._RedrawIfHotSensitive(True) def _RedrawIfHotSensitive(self, isHot): """ Used internally. Redraw the splitter if we are using a hot-sensitive splitter. :param `isHot`: ``True`` if the splitter is in a hot state, ``False`` otherwise. """ if not wx.VERSION >= _RENDER_VER: return if wx.RendererNative.Get().GetSplitterParams(self).isHotSensitive: self._isHot = isHot dc = wx.ClientDC(self) self.DrawSplitter(dc) def OnMotion(self, event): """ Handles the ``wx.EVT_MOTION`` event for L{FourWaySplitter}. :param `event`: a `wx.MouseEvent` event to be processed. """ if self.HasFlag(wx.SP_NOSASH): return pt = event.GetPosition() # Moving split if self._flags & FLAG_PRESSED: oldsplitx = self._splitx oldsplity = self._splity if self._mode == wx.BOTH: self.MoveSplit(pt.x - self._offx, pt.y - self._offy) elif self._mode == wx.VERTICAL: self.MoveSplit(pt.x - self._offx, self._splity) elif self._mode == wx.HORIZONTAL: self.MoveSplit(self._splitx, pt.y - self._offy) # Send a changing event if not self.DoSendChangingEvent(wx.Point(self._splitx, self._splity)): self._splitx = oldsplitx self._splity = oldsplity return if oldsplitx != self._splitx or oldsplity != self._splity: if not self.GetAGWWindowStyleFlag() & wx.SP_LIVE_UPDATE: self.DrawTrackSplitter(oldsplitx, oldsplity) self.DrawTrackSplitter(self._splitx, self._splity) else: self.AdjustLayout() self._flags |= FLAG_CHANGED # Change cursor based on position ff = self.GetMode(pt) if ff == wx.BOTH: self.SetCursor(self._sashCursorSIZING) elif ff == wx.VERTICAL: self.SetCursor(self._sashCursorWE) elif ff == wx.HORIZONTAL: self.SetCursor(self._sashCursorNS) else: self.SetCursor(wx.STANDARD_CURSOR) event.Skip() def OnPaint(self, event): """ Handles the ``wx.EVT_PAINT`` event for L{FourWaySplitter}. :param `event`: a `wx.PaintEvent` event to be processed. """ if self: dc = wx.PaintDC(self) self.DrawSplitter(dc) def OnSize(self, event): """ Handles the ``wx.EVT_SIZE`` event for L{FourWaySplitter}. :param `event`: a `wx.SizeEvent` event to be processed. """ parent = wx.GetTopLevelParent(self) if parent.IsIconized(): event.Skip() return self._SizeWindows() def DoSendChangingEvent(self, pt): """ Sends a ``EVT_SPLITTER_SASH_POS_CHANGING`` event. :param `pt`: the point at which the splitter is being positioned. """ # send the event event = FourWaySplitterEvent(wx.wxEVT_COMMAND_SPLITTER_SASH_POS_CHANGING, self) event.SetSashIdx(self._mode) event.SetSashPosition(pt) if self.GetEventHandler().ProcessEvent(event) and not event.IsAllowed(): # the event handler vetoed the change or missing event.Skip() return False else: # or it might have changed the value return True def _GetSashSize(self): """ Used internally. """ if self.HasFlag(wx.SP_NOSASH): return 0 if wx.VERSION >= _RENDER_VER: return wx.RendererNative.Get().GetSplitterParams(self).widthSash else: return 5 def _GetBorderSize(self): """ Used internally. """ if wx.VERSION >= _RENDER_VER: return wx.RendererNative.Get().GetSplitterParams(self).border else: return 0 # Draw the horizontal split def DrawSplitter(self, dc): """ Actually draws the sashes. :param `dc`: an instance of `wx.DC`. """ backColour = self.GetBackgroundColour() dc.SetBrush(wx.Brush(backColour, wx.SOLID)) dc.SetPen(wx.Pen(backColour)) dc.Clear() if wx.VERSION >= _RENDER_VER: if self.HasFlag(wx.SP_3DBORDER): wx.RendererNative.Get().DrawSplitterBorder( self, dc, self.GetClientRect()) else: barSize = self._GetSashSize() # if we are not supposed to use a sash then we're done. if self.HasFlag(wx.SP_NOSASH): return flag = 0 if self._isHot: flag = wx.CONTROL_CURRENT width, height = self.GetSize() if self._mode & wx.VERTICAL: if wx.VERSION >= _RENDER_VER: wx.RendererNative.Get().DrawSplitterSash(self, dc, self.GetClientSize(), self._splitx, wx.VERTICAL, flag) else: dc.DrawRectangle(self._splitx, 0, barSize, height) if self._mode & wx.HORIZONTAL: if wx.VERSION >= _RENDER_VER: wx.RendererNative.Get().DrawSplitterSash(self, dc, self.GetClientSize(), self._splity, wx.VERTICAL, flag) else: dc.DrawRectangle(0, self._splity, width, barSize) def DrawTrackSplitter(self, x, y): """ Draws a fake sash in case we don't have ``wx.SP_LIVE_UPDATE`` style. :param `x`: the `x` position of the sash; :param `y`: the `y` position of the sash. :note: This method relies on `wx.ScreenDC` which is currently unavailable on wxMac. """ # Draw a line to represent the dragging sash, for when not # doing live updates w, h = self.GetClientSize() dc = wx.ScreenDC() dc.SetLogicalFunction(wx.INVERT) dc.SetPen(self._sashTrackerPen) dc.SetBrush(wx.TRANSPARENT_BRUSH) if self._mode == wx.VERTICAL: x1 = x y1 = 2 x2 = x y2 = h-2 if x1 > w: x1 = w x2 = w elif x1 < 0: x1 = 0 x2 = 0 x1, y1 = self.ClientToScreenXY(x1, y1) x2, y2 = self.ClientToScreenXY(x2, y2) dc.DrawLine(x1, y1, x2, y2) dc.SetLogicalFunction(wx.COPY) elif self._mode == wx.HORIZONTAL: x1 = 2 y1 = y x2 = w-2 y2 = y if y1 > h: y1 = h y2 = h elif y1 < 0: y1 = 0 y2 = 0 x1, y1 = self.ClientToScreenXY(x1, y1) x2, y2 = self.ClientToScreenXY(x2, y2) dc.DrawLine(x1, y1, x2, y2) dc.SetLogicalFunction(wx.COPY) elif self._mode == wx.BOTH: x1 = 2 x2 = w-2 y1 = y y2 = y x1, y1 = self.ClientToScreenXY(x1, y1) x2, y2 = self.ClientToScreenXY(x2, y2) dc.DrawLine(x1, y1, x2, y2) x1 = x x2 = x y1 = 2 y2 = h-2 x1, y1 = self.ClientToScreenXY(x1, y1) x2, y2 = self.ClientToScreenXY(x2, y2) dc.DrawLine(x1, y1, x2, y2) dc.SetLogicalFunction(wx.COPY) # Change horizontal split [fraction*10000] def SetHSplit(self, s): """ Change horizontal split fraction. :param `s`: the split fraction, which is an integer value between 0 and 10000 (inclusive), indicating how much space to allocate to the leftmost panes. For example, to split the panes at 35 percent, use:: fourSplitter.SetHSplit(3500) """ if s < 0: s = 0 if s > 10000: s =10000 if s != self._fhor: self._fhor = s self._SizeWindows() # Change vertical split [fraction*10000] def SetVSplit(self, s): """ Change vertical split fraction. :param `s`: the split fraction, which is an integer value between 0 and 10000 (inclusive), indicating how much space to allocate to the topmost panes. For example, to split the panes at 35 percent, use:: fourSplitter.SetVSplit(3500) """ if s < 0: s = 0 if s > 10000: s =10000 if s != self._fver: self._fver = s self._SizeWindows() # Expand one or all of the four panes def SetExpanded(self, expanded): """ This method is used to expand one of the four window to fill the whole client size (when `expanded` >= 0) or to return to the four-window view (when `expanded` < 0). :param `expanded`: an integer >= 0 to expand a window to fill the whole client size, or an integer < 0 to return to the four-window view. """ if expanded >= 4: raise Exception("ERROR: SetExpanded: index out of range: %d"%expanded) if self._expanded != expanded: self._expanded = expanded self._SizeWindows() DisplayCAL-3.1.0.0/DisplayCAL/lib/agw/gradientbutton.py0000644000076500000000000004674012647526510022371 0ustar devwheel00000000000000# --------------------------------------------------------------------------------- # # GRADIENTBUTTON wxPython IMPLEMENTATION # # Andrea Gavana, @ 07 October 2008 # Latest Revision: 27 Nov 2009, 17.00 GMT # # # TODO List # # 1) Anything to do? # # # For all kind of problems, requests of enhancements and bug reports, please # write to me at: # # andrea.gavana@gmail.com # gavana@kpo.kz # # Or, obviously, to the wxPython mailing list!!! # # # End Of Comments # --------------------------------------------------------------------------------- # """ GradientButton is another custom-drawn button class which mimics Windows CE mobile gradient buttons. Description =========== GradientButton is another custom-drawn button class which mimics Windows CE mobile gradient buttons, using a tri-vertex blended gradient plus some ClearType bold font (best effect with Tahoma Bold). GradientButton supports: * Triple blended gradient background, with customizable colours; * Custom colours for the "pressed" state; * Rounded-corners buttons; * Text-only or image+text buttons. And a lot more. Check the demo for an almost complete review of the functionalities. Supported Platforms =================== GradientButton has been tested on the following platforms: * Windows (Windows XP). Window Styles ============= `No particular window styles are available for this class.` Events Processing ================= This class processes the following events: ================= ================================================== Event Name Description ================= ================================================== ``wx.EVT_BUTTON`` Process a `wx.wxEVT_COMMAND_BUTTON_CLICKED` event, when the button is clicked. ================= ================================================== License And Version =================== GradientButton is distributed under the wxPython license. Latest Revision: Andrea Gavana @ 27 Nov 2009, 17.00 GMT Version 0.3 """ import wx HOVER = 1 CLICK = 2 class GradientButtonEvent(wx.PyCommandEvent): """ Event sent from L{GradientButton} when the button is activated. """ def __init__(self, eventType, eventId): """ Default class constructor. :param `eventType`: the event type; :param `eventId`: the event identifier. """ wx.PyCommandEvent.__init__(self, eventType, eventId) self.isDown = False self.theButton = None def SetButtonObj(self, btn): """ Sets the event object for the event. :param `btn`: the button object, an instance of L{GradientButton}. """ self.theButton = btn def GetButtonObj(self): """ Returns the object associated with this event. """ return self.theButton class GradientButton(wx.PyControl): """ This is the main class implementation of L{GradientButton}. """ def __init__(self, parent, id=wx.ID_ANY, bitmap=None, label="", pos=wx.DefaultPosition, size=wx.DefaultSize, style=wx.NO_BORDER, validator=wx.DefaultValidator, name="gradientbutton"): """ Default class constructor. :param `parent`: the L{GradientButton} parent; :param `id`: window identifier. A value of -1 indicates a default value; :param `bitmap`: the button bitmap (if any); :param `label`: the button text label; :param `pos`: the control position. A value of (-1, -1) indicates a default position, chosen by either the windowing system or wxPython, depending on platform; :param `size`: the control size. A value of (-1, -1) indicates a default size, chosen by either the windowing system or wxPython, depending on platform; :param `style`: the button style (unused); :param `validator`: the validator associated to the button; :param `name`: the button name. """ wx.PyControl.__init__(self, parent, id, pos, size, style, validator, name) self.Bind(wx.EVT_PAINT, self.OnPaint) self.Bind(wx.EVT_ERASE_BACKGROUND, lambda event: None) self.Bind(wx.EVT_SIZE, self.OnSize) self.Bind(wx.EVT_LEFT_DOWN, self.OnLeftDown) self.Bind(wx.EVT_LEFT_UP, self.OnLeftUp) self.Bind(wx.EVT_LEAVE_WINDOW, self.OnMouseLeave) self.Bind(wx.EVT_ENTER_WINDOW, self.OnMouseEnter) self.Bind(wx.EVT_SET_FOCUS, self.OnGainFocus) self.Bind(wx.EVT_KILL_FOCUS, self.OnLoseFocus) self.Bind(wx.EVT_KEY_DOWN, self.OnKeyDown) self.Bind(wx.EVT_KEY_UP, self.OnKeyUp) self.Bind(wx.EVT_LEFT_DCLICK, self.OnLeftDown) self._mouseAction = None self._bitmap = bitmap self._hasFocus = False self.SetLabel(label) self.InheritAttributes() self.SetInitialSize(size) # The following defaults are better suited to draw the text outline self._bottomStartColour = wx.BLACK rgba = self._bottomStartColour.Red(), self._bottomStartColour.Green(), \ self._bottomStartColour.Blue(), self._bottomStartColour.Alpha() self._bottomEndColour = self.LightColour(self._bottomStartColour, 20) self._topStartColour = self.LightColour(self._bottomStartColour, 40) self._topEndColour = self.LightColour(self._bottomStartColour, 25) self._pressedTopColour = self.LightColour(self._bottomStartColour, 20) self._pressedBottomColour = wx.Colour(*rgba) self.SetForegroundColour(wx.WHITE) for method in dir(self): if method.endswith("Colour"): newMethod = method[0:-6] + "Colour" if not hasattr(self, newMethod): setattr(self, newMethod, method) def LightColour(self, colour, percent): """ Return light contrast of `colour`. The colour returned is from the scale of `colour` ==> white. :param `colour`: the input colour to be brightened; :param `percent`: determines how light the colour will be. `percent` = 100 returns white, `percent` = 0 returns `colour`. """ end_colour = wx.WHITE rd = end_colour.Red() - colour.Red() gd = end_colour.Green() - colour.Green() bd = end_colour.Blue() - colour.Blue() high = 100 # We take the percent way of the colour from colour -. white i = percent r = colour.Red() + ((i*rd*100)/high)/100 g = colour.Green() + ((i*gd*100)/high)/100 b = colour.Blue() + ((i*bd*100)/high)/100 return wx.Colour(r, g, b) def OnSize(self, event): """ Handles the ``wx.EVT_SIZE`` event for L{GradientButton}. :param `event`: a `wx.SizeEvent` event to be processed. """ event.Skip() self.Refresh() def OnLeftDown(self, event): """ Handles the ``wx.EVT_LEFT_DOWN`` event for L{GradientButton}. :param `event`: a `wx.MouseEvent` event to be processed. """ if not self.IsEnabled(): return self._mouseAction = CLICK self.CaptureMouse() self.Refresh() event.Skip() def OnLeftUp(self, event): """ Handles the ``wx.EVT_LEFT_UP`` event for L{GradientButton}. :param `event`: a `wx.MouseEvent` event to be processed. """ if not self.IsEnabled() or not self.HasCapture(): return pos = event.GetPosition() rect = self.GetClientRect() if self.HasCapture(): self.ReleaseMouse() if rect.Contains(pos): self._mouseAction = HOVER self.Notify() else: self._mouseAction = None self.Refresh() event.Skip() def OnMouseEnter(self, event): """ Handles the ``wx.EVT_ENTER_WINDOW`` event for L{GradientButton}. :param `event`: a `wx.MouseEvent` event to be processed. """ if not self.IsEnabled(): return self._mouseAction = HOVER self.Refresh() event.Skip() def OnMouseLeave(self, event): """ Handles the ``wx.EVT_LEAVE_WINDOW`` event for L{GradientButton}. :param `event`: a `wx.MouseEvent` event to be processed. """ self._mouseAction = None self.Refresh() event.Skip() def OnGainFocus(self, event): """ Handles the ``wx.EVT_SET_FOCUS`` event for L{GradientButton}. :param `event`: a `wx.FocusEvent` event to be processed. """ self._hasFocus = True self.Refresh() self.Update() def OnLoseFocus(self, event): """ Handles the ``wx.EVT_KILL_FOCUS`` event for L{GradientButton}. :param `event`: a `wx.FocusEvent` event to be processed. """ self._hasFocus = False self.Refresh() self.Update() def OnKeyDown(self, event): """ Handles the ``wx.EVT_KEY_DOWN`` event for L{GradientButton}. :param `event`: a `wx.KeyEvent` event to be processed. """ if self._hasFocus and event.GetKeyCode() == ord(" "): self._mouseAction = HOVER self.Refresh() event.Skip() def OnKeyUp(self, event): """ Handles the ``wx.EVT_KEY_UP`` event for L{GradientButton}. :param `event`: a `wx.KeyEvent` event to be processed. """ if self._hasFocus and event.GetKeyCode() == ord(" "): self._mouseAction = HOVER self.Notify() self.Refresh() event.Skip() def OnPaint(self, event): """ Handles the ``wx.EVT_PAINT`` event for L{GradientButton}. :param `event`: a `wx.PaintEvent` event to be processed. """ dc = wx.BufferedPaintDC(self) gc = wx.GraphicsContext.Create(dc) dc.SetBackground(wx.Brush(self.GetParent().GetBackgroundColour())) dc.Clear() clientRect = self.GetClientRect() gradientRect = wx.Rect(*clientRect) capture = wx.Window.GetCapture() x, y, width, height = clientRect gradientRect.SetHeight(gradientRect.GetHeight()/2 + ((capture==self and [1] or [0])[0])) if capture != self: if self._mouseAction == HOVER: topStart, topEnd = self.LightColour(self._topStartColour, 10), self.LightColour(self._topEndColour, 10) else: topStart, topEnd = self._topStartColour, self._topEndColour rc1 = wx.Rect(x, y, width, height/2) path1 = self.GetPath(gc, rc1, 8) br1 = gc.CreateLinearGradientBrush(x, y, x, y+height/2, topStart, topEnd) gc.SetBrush(br1) gc.FillPath(path1) #draw main path4 = gc.CreatePath() path4.AddRectangle(x, y+height/2-8, width, 8) path4.CloseSubpath() gc.SetBrush(br1) gc.FillPath(path4) else: rc1 = wx.Rect(x, y, width, height) path1 = self.GetPath(gc, rc1, 8) gc.SetPen(wx.Pen(self._pressedTopColour)) gc.SetBrush(wx.Brush(self._pressedTopColour)) gc.FillPath(path1) gradientRect.Offset((0, gradientRect.GetHeight())) if capture != self: if self._mouseAction == HOVER: bottomStart, bottomEnd = self.LightColour(self._bottomStartColour, 10), self.LightColour(self._bottomEndColour, 10) else: bottomStart, bottomEnd = self._bottomStartColour, self._bottomEndColour rc3 = wx.Rect(x, y+height/2, width, height/2) path3 = self.GetPath(gc, rc3, 8) br3 = gc.CreateLinearGradientBrush(x, y+height/2, x, y+height, bottomStart, bottomEnd) gc.SetBrush(br3) gc.FillPath(path3) #draw main path4 = gc.CreatePath() path4.AddRectangle(x, y+height/2, width, 8) path4.CloseSubpath() gc.SetBrush(br3) gc.FillPath(path4) shadowOffset = 0 else: rc2 = wx.Rect(x+1, gradientRect.height/2, gradientRect.width, gradientRect.height) path2 = self.GetPath(gc, rc2, 8) gc.SetPen(wx.Pen(self._pressedBottomColour)) gc.SetBrush(wx.Brush(self._pressedBottomColour)) gc.FillPath(path2) shadowOffset = 1 font = gc.CreateFont(self.GetFont(), self.GetForegroundColour()) gc.SetFont(font) label = self.GetLabel() tw, th = gc.GetTextExtent(label) if self._bitmap: bw, bh = self._bitmap.GetWidth(), self._bitmap.GetHeight() else: bw = bh = 0 pos_x = (width-bw-tw)/2+shadowOffset # adjust for bitmap and text to centre if self._bitmap: pos_y = (height-bh)/2+shadowOffset gc.DrawBitmap(self._bitmap, pos_x, pos_y, bw, bh) # draw bitmap if available pos_x = pos_x + 2 # extra spacing from bitmap gc.DrawText(label, pos_x + bw + shadowOffset, (height-th)/2+shadowOffset) def GetPath(self, gc, rc, r): """ Returns a rounded `wx.GraphicsPath` rectangle. :param `gc`: an instance of `wx.GraphicsContext`; :param `rc`: a client rectangle; :param `r`: the radious of the rounded part of the rectangle. """ x, y, w, h = rc path = gc.CreatePath() path.AddRoundedRectangle(x, y, w, h, r) path.CloseSubpath() return path def SetInitialSize(self, size=None): """ Given the current font and bezel width settings, calculate and set a good size. :param `size`: an instance of `wx.Size`. """ if size is None: size = wx.DefaultSize wx.PyControl.SetInitialSize(self, size) SetBestSize = SetInitialSize def AcceptsFocus(self): """ Can this window be given focus by mouse click? :note: Overridden from `wx.PyControl`. """ return self.IsShown() and self.IsEnabled() def GetDefaultAttributes(self): """ Overridden base class virtual. By default we should use the same font/colour attributes as the native `wx.Button`. """ return wx.Button.GetClassDefaultAttributes() def ShouldInheritColours(self): """ Overridden base class virtual. Buttons usually don't inherit the parent's colours. :note: Overridden from `wx.PyControl`. """ return False def Enable(self, enable=True): """ Enables/disables the button. :param `enable`: ``True`` to enable the button, ``False`` to disable it. :note: Overridden from `wx.PyControl`. """ wx.PyControl.Enable(self, enable) self.Refresh() def SetTopStartColour(self, colour): """ Sets the top start colour for the gradient shading. :param `colour`: a valid `wx.Colour` object. """ self._topStartColour = colour self.Refresh() def GetTopStartColour(self): """ Returns the top start colour for the gradient shading. """ return self._topStartColour def SetTopEndColour(self, colour): """ Sets the top end colour for the gradient shading. :param `colour`: a valid `wx.Colour` object. """ self._topEndColour = colour self.Refresh() def GetTopEndColour(self): """ Returns the top end colour for the gradient shading. """ return self._topEndColour def SetBottomStartColour(self, colour): """ Sets the top bottom colour for the gradient shading. :param `colour`: a valid `wx.Colour` object. """ self._bottomStartColour = colour self.Refresh() def GetBottomStartColour(self): """ Returns the bottom start colour for the gradient shading. """ return self._bottomStartColour def SetBottomEndColour(self, colour): """ Sets the bottom end colour for the gradient shading. :param `colour`: a valid `wx.Colour` object. """ self._bottomEndColour = colour self.Refresh() def GetBottomEndColour(self): """ Returns the bottom end colour for the gradient shading. """ return self._bottomEndColour def SetPressedTopColour(self, colour): """ Sets the pressed top start colour for the gradient shading. :param `colour`: a valid `wx.Colour` object. """ self._pressedTopColour = colour self.Refresh() def GetPressedTopColour(self): """ Returns the pressed top start colour for the gradient shading. """ return self._pressedTopColour def SetPressedBottomColour(self, colour): """ Sets the pressed bottom start colour for the gradient shading. :param `colour`: a valid `wx.Colour` object. """ self._pressedBottomColour = colour self.Refresh() def GetPressedBottomColour(self): """ Returns the pressed bottom start colour for the gradient shading. """ return self._pressedBottomColour def SetForegroundColour(self, colour): """ Sets the L{GradientButton} foreground (text) colour. :param `colour`: a valid `wx.Colour` object. :note: Overridden from `wx.PyControl`. """ wx.PyControl.SetForegroundColour(self, colour) self.Refresh() def DoGetBestSize(self): """ Overridden base class virtual. Determines the best size of the button based on the label and bezel size. """ label = self.GetLabel() if not label: return wx.Size(112, 48) dc = wx.ClientDC(self) dc.SetFont(self.GetFont()) retWidth, retHeight = dc.GetTextExtent(label) bmpWidth = bmpHeight = 0 constant = 15 if self._bitmap: bmpWidth, bmpHeight = self._bitmap.GetWidth()+10, self._bitmap.GetHeight() retWidth += bmpWidth retHeight = max(bmpHeight, retHeight) constant = 15 return wx.Size(retWidth+constant, retHeight+constant) def SetDefault(self): """ Sets the default button. """ tlw = wx.GetTopLevelParent(self) if hasattr(tlw, 'SetDefaultItem'): tlw.SetDefaultItem(self) def Notify(self): """ Actually sends a ``wx.EVT_BUTTON`` event to the listener (if any). """ evt = GradientButtonEvent(wx.wxEVT_COMMAND_BUTTON_CLICKED, self.GetId()) evt.SetButtonObj(self) evt.SetEventObject(self) self.GetEventHandler().ProcessEvent(evt) DisplayCAL-3.1.0.0/DisplayCAL/lib/agw/labelbook.py0000644000076500000000000032477412647526510021300 0ustar devwheel00000000000000# --------------------------------------------------------------------------- # # LABELBOOK And FLATIMAGEBOOK Widgets wxPython IMPLEMENTATION # # Original C++ Code From Eran, embedded in the FlatMenu source code # # # License: wxWidgets license # # # Python Code By: # # Andrea Gavana, @ 03 Nov 2006 # Latest Revision: 17 Jan 2011, 15.00 GMT # # # For All Kind Of Problems, Requests Of Enhancements And Bug Reports, Please # Write To Me At: # # andrea.gavana@gmail.com # gavana@kpo.kz # # Or, Obviously, To The wxPython Mailing List!!! # # TODO: # LabelBook - Support IMB_SHOW_ONLY_IMAGES # LabelBook - An option for the draw border to only draw the border # between the controls and the pages so the background # colour can flow into the window background # # # # End Of Comments # --------------------------------------------------------------------------- # """ LabelBook and FlatImageBook are a quasi-full generic and owner-drawn implementations of `wx.Notebook`. Description =========== LabelBook and FlatImageBook are a quasi-full implementations of the `wx.Notebook`, and designed to be a drop-in replacement for `wx.Notebook`. The API functions are similar so one can expect the function to behave in the same way. LabelBook anf FlatImageBook share their appearance with `wx.Toolbook` and `wx.Listbook`, while having more options for custom drawings, label positioning, mouse pointing and so on. Moreover, they retain also some visual characteristics of the Outlook address book. Some features: - They are generic controls; - Supports for left, right, top (FlatImageBook only), bottom (FlatImageBook only) book styles; - Possibility to draw images only, text only or both (FlatImageBook only); - Support for a "pin-button", that allows the user to shrink/expand the book tab area; - Shadows behind tabs (LabelBook only); - Gradient shading of the tab area (LabelBook only); - Web-like mouse pointing on tabs style (LabelBook only); - Many customizable colours (tab area, active tab text, tab borders, active tab, highlight) - LabelBook only. And much more. See the demo for a quasi-complete review of all the functionalities of LabelBook and FlatImageBook. Supported Platforms =================== LabelBook and FlatImageBook have been tested on the following platforms: * Windows (Windows XP); * Linux Ubuntu (Dapper 6.06) Window Styles ============= This class supports the following window styles: =========================== =========== ================================================== Window Styles Hex Value Description =========================== =========== ================================================== ``INB_BOTTOM`` 0x1 Place labels below the page area. Available only for `FlatImageBook`. ``INB_LEFT`` 0x2 Place labels on the left side. Available only for `FlatImageBook`. ``INB_RIGHT`` 0x4 Place labels on the right side. ``INB_TOP`` 0x8 Place labels above the page area. ``INB_BORDER`` 0x10 Draws a border around `LabelBook` or `FlatImageBook`. ``INB_SHOW_ONLY_TEXT`` 0x20 Shows only text labels and no images. Available only for `LabelBook`. ``INB_SHOW_ONLY_IMAGES`` 0x40 Shows only tab images and no label texts. Available only for `LabelBook`. ``INB_FIT_BUTTON`` 0x80 Displays a pin button to show/hide the book control. ``INB_DRAW_SHADOW`` 0x100 Draw shadows below the book tabs. Available only for `LabelBook`. ``INB_USE_PIN_BUTTON`` 0x200 Displays a pin button to show/hide the book control. ``INB_GRADIENT_BACKGROUND`` 0x400 Draws a gradient shading on the tabs background. Available only for `LabelBook`. ``INB_WEB_HILITE`` 0x800 On mouse hovering, tabs behave like html hyperlinks. Available only for `LabelBook`. ``INB_NO_RESIZE`` 0x1000 Don't allow resizing of the tab area. ``INB_FIT_LABELTEXT`` 0x2000 Will fit the tab area to the longest text (or text+image if you have images) in all the tabs. =========================== =========== ================================================== Events Processing ================= This class processes the following events: =================================== ================================================== Event Name Description =================================== ================================================== ``EVT_IMAGENOTEBOOK_PAGE_CHANGED`` Notify client objects when the active page in `ImageNotebook` has changed. ``EVT_IMAGENOTEBOOK_PAGE_CHANGING`` Notify client objects when the active page in `ImageNotebook` is about to change. ``EVT_IMAGENOTEBOOK_PAGE_CLOSED`` Notify client objects when a page in `ImageNotebook` has been closed. ``EVT_IMAGENOTEBOOK_PAGE_CLOSING`` Notify client objects when a page in `ImageNotebook` is closing. =================================== ================================================== License And Version =================== LabelBook and FlatImageBook are distributed under the wxPython license. Latest Revision: Andrea Gavana @ 17 Jan 2011, 15.00 GMT Version 0.5. """ __docformat__ = "epytext" #---------------------------------------------------------------------- # Beginning Of IMAGENOTEBOOK wxPython Code #---------------------------------------------------------------------- import wx from artmanager import ArtManager, DCSaver from fmresources import * # Check for the new method in 2.7 (not present in 2.6.3.3) if wx.VERSION_STRING < "2.7": wx.Rect.Contains = lambda self, point: wx.Rect.Inside(self, point) # FlatImageBook and LabelBook styles INB_BOTTOM = 1 """ Place labels below the page area. Available only for `FlatImageBook`.""" INB_LEFT = 2 """ Place labels on the left side. Available only for `FlatImageBook`.""" INB_RIGHT = 4 """ Place labels on the right side. """ INB_TOP = 8 """ Place labels above the page area. """ INB_BORDER = 16 """ Draws a border around `LabelBook` or `FlatImageBook`. """ INB_SHOW_ONLY_TEXT = 32 """ Shows only text labels and no images. Available only for `LabelBook`.""" INB_SHOW_ONLY_IMAGES = 64 """ Shows only tab images and no label texts. Available only for `LabelBook`.""" INB_FIT_BUTTON = 128 """ Displays a pin button to show/hide the book control. """ INB_DRAW_SHADOW = 256 """ Draw shadows below the book tabs. Available only for `LabelBook`.""" INB_USE_PIN_BUTTON = 512 """ Displays a pin button to show/hide the book control. """ INB_GRADIENT_BACKGROUND = 1024 """ Draws a gradient shading on the tabs background. Available only for `LabelBook`.""" INB_WEB_HILITE = 2048 """ On mouse hovering, tabs behave like html hyperlinks. Available only for `LabelBook`.""" INB_NO_RESIZE = 4096 """ Don't allow resizing of the tab area. """ INB_FIT_LABELTEXT = 8192 """ Will fit the tab area to the longest text (or text+image if you have images) in all the tabs. """ wxEVT_IMAGENOTEBOOK_PAGE_CHANGED = wx.wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED wxEVT_IMAGENOTEBOOK_PAGE_CHANGING = wx.wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGING wxEVT_IMAGENOTEBOOK_PAGE_CLOSING = wx.NewEventType() wxEVT_IMAGENOTEBOOK_PAGE_CLOSED = wx.NewEventType() #-----------------------------------# # ImageNotebookEvent #-----------------------------------# EVT_IMAGENOTEBOOK_PAGE_CHANGED = wx.EVT_NOTEBOOK_PAGE_CHANGED """ Notify client objects when the active page in `ImageNotebook` has changed. """ EVT_IMAGENOTEBOOK_PAGE_CHANGING = wx.EVT_NOTEBOOK_PAGE_CHANGING """ Notify client objects when the active page in `ImageNotebook` is about to change. """ EVT_IMAGENOTEBOOK_PAGE_CLOSING = wx.PyEventBinder(wxEVT_IMAGENOTEBOOK_PAGE_CLOSING, 1) """ Notify client objects when a page in `ImageNotebook` is closing. """ EVT_IMAGENOTEBOOK_PAGE_CLOSED = wx.PyEventBinder(wxEVT_IMAGENOTEBOOK_PAGE_CLOSED, 1) """ Notify client objects when a page in `ImageNotebook` has been closed. """ # ---------------------------------------------------------------------------- # # Class ImageNotebookEvent # ---------------------------------------------------------------------------- # class ImageNotebookEvent(wx.PyCommandEvent): """ This events will be sent when a ``EVT_IMAGENOTEBOOK_PAGE_CHANGED``, ``EVT_IMAGENOTEBOOK_PAGE_CHANGING``, ``EVT_IMAGENOTEBOOK_PAGE_CLOSING``, ``EVT_IMAGENOTEBOOK_PAGE_CLOSED`` is mapped in the parent. """ def __init__(self, eventType, eventId=1, sel=-1, oldsel=-1): """ Default class constructor. :param `eventType`: the event type; :param `eventId`: the event identifier; :param `sel`: the current selection; :param `oldsel`: the old selection. """ wx.PyCommandEvent.__init__(self, eventType, eventId) self._eventType = eventType self._sel = sel self._oldsel = oldsel self._allowed = True def SetSelection(self, s): """ Sets the event selection. :param `s`: an integer specifying the new selection. """ self._sel = s def SetOldSelection(self, s): """ Sets the event old selection. :param `s`: an integer specifying the old selection. """ self._oldsel = s def GetSelection(self): """ Returns the event selection. """ return self._sel def GetOldSelection(self): """ Returns the old event selection. """ return self._oldsel def Veto(self): """ Prevents the change announced by this event from happening. :note: It is in general a good idea to notify the user about the reasons for vetoing the change because otherwise the applications behaviour (which just refuses to do what the user wants) might be quite surprising. """ self._allowed = False def Allow(self): """ This is the opposite of L{Veto}: it explicitly allows the event to be processed. For most events it is not necessary to call this method as the events are allowed anyhow but some are forbidden by default (this will be mentioned in the corresponding event description). """ self._allowed = True def IsAllowed(self): """ Returns ``True`` if the change is allowed (L{Veto} hasn't been called) or ``False`` otherwise (if it was). """ return self._allowed # ---------------------------------------------------------------------------- # # Class ImageInfo # ---------------------------------------------------------------------------- # class ImageInfo(object): """ This class holds all the information (caption, image, etc...) belonging to a single tab in L{LabelBook}. """ def __init__(self, strCaption="", imageIndex=-1): """ Default class constructor. :param `strCaption`: the tab caption; :param `imageIndex`: the tab image index based on the assigned (set) `wx.ImageList` (if any). """ self._pos = wx.Point() self._size = wx.Size() self._strCaption = strCaption self._ImageIndex = imageIndex self._captionRect = wx.Rect() def SetCaption(self, value): """ Sets the tab caption. :param `value`: the new tab caption. """ self._strCaption = value def GetCaption(self): """ Returns the tab caption. """ return self._strCaption def SetPosition(self, value): """ Sets the tab position. :param `value`: the new tab position, an instance of `wx.Point`. """ self._pos = value def GetPosition(self): """ Returns the tab position. """ return self._pos def SetSize(self, value): """ Sets the tab size. :param `value`: the new tab size, an instance of `wx.Size`. """ self._size = value def GetSize(self): """ Returns the tab size. """ return self._size def SetImageIndex(self, value): """ Sets the tab image index. :param `value`: an index into the image list.. """ self._ImageIndex = value def GetImageIndex(self): """ Returns the tab image index. """ return self._ImageIndex def SetTextRect(self, rect): """ Sets the client rectangle available for the tab text. :param `rect`: the tab text client rectangle, an instance of `wx.Rect`. """ self._captionRect = rect def GetTextRect(self): """ Returns the client rectangle available for the tab text. """ return self._captionRect # ---------------------------------------------------------------------------- # # Class ImageContainerBase # ---------------------------------------------------------------------------- # class ImageContainerBase(wx.Panel): """ Base class for L{FlatImageBook} image container. """ def __init__(self, parent, id=wx.ID_ANY, pos=wx.DefaultPosition, size=wx.DefaultSize, style=0, agwStyle=0, name="ImageContainerBase"): """ Default class constructor. :param `parent`: parent window. Must not be ``None``; :param `id`: window identifier. A value of -1 indicates a default value; :param `pos`: the control position. A value of (-1, -1) indicates a default position, chosen by either the windowing system or wxPython, depending on platform; :param `size`: the control size. A value of (-1, -1) indicates a default size, chosen by either the windowing system or wxPython, depending on platform; :param `style`: the underlying `wx.Panel` window style; :param `agwStyle`: the AGW-specific window style. This can be a combination of the following bits: =========================== =========== ================================================== Window Styles Hex Value Description =========================== =========== ================================================== ``INB_BOTTOM`` 0x1 Place labels below the page area. Available only for L{FlatImageBook}. ``INB_LEFT`` 0x2 Place labels on the left side. Available only for L{FlatImageBook}. ``INB_RIGHT`` 0x4 Place labels on the right side. ``INB_TOP`` 0x8 Place labels above the page area. ``INB_BORDER`` 0x10 Draws a border around L{LabelBook} or L{FlatImageBook}. ``INB_SHOW_ONLY_TEXT`` 0x20 Shows only text labels and no images. Available only for L{LabelBook}. ``INB_SHOW_ONLY_IMAGES`` 0x40 Shows only tab images and no label texts. Available only for L{LabelBook}. ``INB_FIT_BUTTON`` 0x80 Displays a pin button to show/hide the book control. ``INB_DRAW_SHADOW`` 0x100 Draw shadows below the book tabs. Available only for L{LabelBook}. ``INB_USE_PIN_BUTTON`` 0x200 Displays a pin button to show/hide the book control. ``INB_GRADIENT_BACKGROUND`` 0x400 Draws a gradient shading on the tabs background. Available only for L{LabelBook}. ``INB_WEB_HILITE`` 0x800 On mouse hovering, tabs behave like html hyperlinks. Available only for L{LabelBook}. ``INB_NO_RESIZE`` 0x1000 Don't allow resizing of the tab area. ``INB_FIT_LABELTEXT`` 0x2000 Will fit the tab area to the longest text (or text+image if you have images) in all the tabs. =========================== =========== ================================================== :param `name`: the window name. """ self._nIndex = -1 self._nImgSize = 16 self._ImageList = None self._nHoeveredImgIdx = -1 self._bCollapsed = False self._tabAreaSize = (-1, -1) self._nPinButtonStatus = INB_PIN_NONE self._pagesInfoVec = [] self._pinBtnRect = wx.Rect() wx.Panel.__init__(self, parent, id, pos, size, style | wx.NO_BORDER | wx.NO_FULL_REPAINT_ON_RESIZE, name) def HasAGWFlag(self, flag): """ Tests for existance of flag in the style. :param `flag`: a window style. This can be a combination of the following bits: =========================== =========== ================================================== Window Styles Hex Value Description =========================== =========== ================================================== ``INB_BOTTOM`` 0x1 Place labels below the page area. Available only for L{FlatImageBook}. ``INB_LEFT`` 0x2 Place labels on the left side. Available only for L{FlatImageBook}. ``INB_RIGHT`` 0x4 Place labels on the right side. ``INB_TOP`` 0x8 Place labels above the page area. ``INB_BORDER`` 0x10 Draws a border around L{LabelBook} or L{FlatImageBook}. ``INB_SHOW_ONLY_TEXT`` 0x20 Shows only text labels and no images. Available only for L{LabelBook}. ``INB_SHOW_ONLY_IMAGES`` 0x40 Shows only tab images and no label texts. Available only for L{LabelBook}. ``INB_FIT_BUTTON`` 0x80 Displays a pin button to show/hide the book control. ``INB_DRAW_SHADOW`` 0x100 Draw shadows below the book tabs. Available only for L{LabelBook}. ``INB_USE_PIN_BUTTON`` 0x200 Displays a pin button to show/hide the book control. ``INB_GRADIENT_BACKGROUND`` 0x400 Draws a gradient shading on the tabs background. Available only for L{LabelBook}. ``INB_WEB_HILITE`` 0x800 On mouse hovering, tabs behave like html hyperlinks. Available only for L{LabelBook}. ``INB_NO_RESIZE`` 0x1000 Don't allow resizing of the tab area. ``INB_FIT_LABELTEXT`` 0x2000 Will fit the tab area to the longest text (or text+image if you have images) in all the tabs. =========================== =========== ================================================== """ style = self.GetParent().GetAGWWindowStyleFlag() res = (style & flag and [True] or [False])[0] return res def ClearFlag(self, flag): """ Removes flag from the style. :param `flag`: a window style flag. :see: L{HasAGWFlag} for a list of possible window style flags. """ parent = self.GetParent() agwStyle = parent.GetAGWWindowStyleFlag() agwStyle &= ~(flag) parent.SetAGWWindowStyleFlag(agwStyle) def AssignImageList(self, imglist): """ Assigns an image list to the L{ImageContainerBase}. :param `imglist`: an instance of `wx.ImageList`. """ if imglist and imglist.GetImageCount() != 0: self._nImgSize = imglist.GetBitmap(0).GetHeight() self._ImageList = imglist parent = self.GetParent() agwStyle = parent.GetAGWWindowStyleFlag() parent.SetAGWWindowStyleFlag(agwStyle) def GetImageList(self): """ Return the image list for L{ImageContainerBase}. """ return self._ImageList def GetImageSize(self): """ Returns the image size inside the L{ImageContainerBase} image list. """ return self._nImgSize def FixTextSize(self, dc, text, maxWidth): """ Fixes the text, to fit `maxWidth` value. If the text length exceeds `maxWidth` value this function truncates it and appends two dots at the end. ("Long Long Long Text" might become "Long Long..."). :param `dc`: an instance of `wx.DC`; :param `text`: the text to fix/truncate; :param `maxWidth`: the maximum allowed width for the text, in pixels. """ return ArtManager.Get().TruncateText(dc, text, maxWidth) def CanDoBottomStyle(self): """ Allows the parent to examine the children type. Some implementation (such as L{LabelBook}), does not support top/bottom images, only left/right. """ return False def AddPage(self, caption, selected=False, imgIdx=-1): """ Adds a page to the container. :param `caption`: specifies the text for the new tab; :param `selected`: specifies whether the page should be selected; :param `imgIdx`: specifies the optional image index for the new tab. """ self._pagesInfoVec.append(ImageInfo(caption, imgIdx)) if selected or len(self._pagesInfoVec) == 1: self._nIndex = len(self._pagesInfoVec)-1 self.Refresh() def InsertPage(self, page_idx, caption, selected=False, imgIdx=-1): """ Inserts a page into the container at the specified position. :param `page_idx`: specifies the position for the new tab; :param `caption`: specifies the text for the new tab; :param `selected`: specifies whether the page should be selected; :param `imgIdx`: specifies the optional image index for the new tab. """ self._pagesInfoVec.insert(page_idx, ImageInfo(caption, imgIdx)) if selected or len(self._pagesInfoVec) == 1: self._nIndex = len(self._pagesInfoVec)-1 self.Refresh() def SetPageImage(self, page, imgIdx): """ Sets the image for the given page. :param `page`: the index of the tab; :param `imgIdx`: specifies the optional image index for the tab. """ imgInfo = self._pagesInfoVec[page] imgInfo.SetImageIndex(imgIdx) def SetPageText(self, page, text): """ Sets the tab caption for the given page. :param `page`: the index of the tab; :param `text`: the new tab caption. """ imgInfo = self._pagesInfoVec[page] imgInfo.SetCaption(text) def GetPageImage(self, page): """ Returns the image index for the given page. :param `page`: the index of the tab. """ imgInfo = self._pagesInfoVec[page] return imgInfo.GetImageIndex() def GetPageText(self, page): """ Returns the tab caption for the given page. :param `page`: the index of the tab. """ imgInfo = self._pagesInfoVec[page] return imgInfo.GetCaption() def ClearAll(self): """ Deletes all the pages in the container. """ self._pagesInfoVec = [] self._nIndex = wx.NOT_FOUND def DoDeletePage(self, page): """ Does the actual page deletion. :param `page`: the index of the tab. """ # Remove the page from the vector book = self.GetParent() self._pagesInfoVec.pop(page) if self._nIndex >= page: self._nIndex = self._nIndex - 1 # The delete page was the last first on the array, # but the book still has more pages, so we set the # active page to be the first one (0) if self._nIndex < 0 and len(self._pagesInfoVec) > 0: self._nIndex = 0 # Refresh the tabs if self._nIndex >= 0: book._bForceSelection = True book.SetSelection(self._nIndex) book._bForceSelection = False if not self._pagesInfoVec: # Erase the page container drawings dc = wx.ClientDC(self) dc.Clear() def OnSize(self, event): """ Handles the ``wx.EVT_SIZE`` event for L{ImageContainerBase}. :param `event`: a `wx.SizeEvent` event to be processed. """ self.Refresh() # Call on paint event.Skip() def OnEraseBackground(self, event): """ Handles the ``wx.EVT_ERASE_BACKGROUND`` event for L{ImageContainerBase}. :param `event`: a `wx.EraseEvent` event to be processed. :note: This method is intentionally empty to reduce flicker. """ pass def HitTest(self, pt): """ Returns the index of the tab at the specified position or ``wx.NOT_FOUND`` if ``None``, plus the flag style of L{HitTest}. :param `pt`: an instance of `wx.Point`, to test for hits. :return: The index of the tab at the specified position plus the hit test flag, which can be one of the following bits: ====================== ======= ================================ HitTest Flags Value Description ====================== ======= ================================ ``IMG_OVER_IMG`` 0 The mouse is over the tab icon ``IMG_OVER_PIN`` 1 The mouse is over the pin button ``IMG_OVER_EW_BORDER`` 2 The mouse is over the east-west book border ``IMG_NONE`` 3 Nowhere ====================== ======= ================================ """ style = self.GetParent().GetAGWWindowStyleFlag() if style & INB_USE_PIN_BUTTON: if self._pinBtnRect.Contains(pt): return -1, IMG_OVER_PIN for i in xrange(len(self._pagesInfoVec)): if self._pagesInfoVec[i].GetPosition() == wx.Point(-1, -1): break # For Web Hover style, we test the TextRect if not self.HasAGWFlag(INB_WEB_HILITE): buttonRect = wx.RectPS(self._pagesInfoVec[i].GetPosition(), self._pagesInfoVec[i].GetSize()) else: buttonRect = self._pagesInfoVec[i].GetTextRect() if buttonRect.Contains(pt): return i, IMG_OVER_IMG if self.PointOnSash(pt): return -1, IMG_OVER_EW_BORDER else: return -1, IMG_NONE def PointOnSash(self, pt): """ Tests whether pt is located on the sash. :param `pt`: an instance of `wx.Point`, to test for hits. """ # Check if we are on a the sash border cltRect = self.GetClientRect() if self.HasAGWFlag(INB_LEFT) or self.HasAGWFlag(INB_TOP): if pt.x > cltRect.x + cltRect.width - 4: return True else: if pt.x < 4: return True return False def OnMouseLeftDown(self, event): """ Handles the ``wx.EVT_LEFT_DOWN`` event for L{ImageContainerBase}. :param `event`: a `wx.MouseEvent` event to be processed. """ newSelection = -1 event.Skip() # Support for collapse/expand style = self.GetParent().GetAGWWindowStyleFlag() if style & INB_USE_PIN_BUTTON: if self._pinBtnRect.Contains(event.GetPosition()): self._nPinButtonStatus = INB_PIN_PRESSED dc = wx.ClientDC(self) self.DrawPin(dc, self._pinBtnRect, not self._bCollapsed) return # Incase panel is collapsed, there is nothing # to check if self._bCollapsed: return tabIdx, where = self.HitTest(event.GetPosition()) if where == IMG_OVER_IMG: self._nHoeveredImgIdx = -1 if tabIdx == -1: return self.GetParent().SetSelection(tabIdx) def OnMouseLeaveWindow(self, event): """ Handles the ``wx.EVT_LEAVE_WINDOW`` event for L{ImageContainerBase}. :param `event`: a `wx.MouseEvent` event to be processed. """ bRepaint = self._nHoeveredImgIdx != -1 self._nHoeveredImgIdx = -1 # Make sure the pin button status is NONE # incase we were in pin button style style = self.GetParent().GetAGWWindowStyleFlag() if style & INB_USE_PIN_BUTTON: self._nPinButtonStatus = INB_PIN_NONE dc = wx.ClientDC(self) self.DrawPin(dc, self._pinBtnRect, not self._bCollapsed) # Restore cursor wx.SetCursor(wx.StockCursor(wx.CURSOR_ARROW)) if bRepaint: self.Refresh() def OnMouseLeftUp(self, event): """ Handles the ``wx.EVT_LEFT_UP`` event for L{ImageContainerBase}. :param `event`: a `wx.MouseEvent` event to be processed. """ style = self.GetParent().GetAGWWindowStyleFlag() if style & INB_USE_PIN_BUTTON: bIsLabelContainer = not self.CanDoBottomStyle() if self._pinBtnRect.Contains(event.GetPosition()): self._nPinButtonStatus = INB_PIN_NONE self._bCollapsed = not self._bCollapsed if self._bCollapsed: # Save the current tab area width self._tabAreaSize = self.GetSize() if bIsLabelContainer: self.SetSizeHints(20, self._tabAreaSize.y) else: if style & INB_BOTTOM or style & INB_TOP: self.SetSizeHints(self._tabAreaSize.x, 20) else: self.SetSizeHints(20, self._tabAreaSize.y) else: if bIsLabelContainer: self.SetSizeHints(self._tabAreaSize.x, -1) else: # Restore the tab area size if style & INB_BOTTOM or style & INB_TOP: self.SetSizeHints(-1, self._tabAreaSize.y) else: self.SetSizeHints(self._tabAreaSize.x, -1) self.GetParent().GetSizer().Layout() self.Refresh() return def OnMouseMove(self, event): """ Handles the ``wx.EVT_MOTION`` event for L{ImageContainerBase}. :param `event`: a `wx.MouseEvent` event to be processed. """ style = self.GetParent().GetAGWWindowStyleFlag() if style & INB_USE_PIN_BUTTON: # Check to see if we are in the pin button rect if not self._pinBtnRect.Contains(event.GetPosition()) and self._nPinButtonStatus == INB_PIN_PRESSED: self._nPinButtonStatus = INB_PIN_NONE dc = wx.ClientDC(self) self.DrawPin(dc, self._pinBtnRect, not self._bCollapsed) imgIdx, where = self.HitTest(event.GetPosition()) self._nHoeveredImgIdx = imgIdx if not self._bCollapsed: if self._nHoeveredImgIdx >= 0 and self._nHoeveredImgIdx < len(self._pagesInfoVec): # Change the cursor to be Hand if self.HasAGWFlag(INB_WEB_HILITE) and self._nHoeveredImgIdx != self._nIndex: wx.SetCursor(wx.StockCursor(wx.CURSOR_HAND)) else: # Restore the cursor only if we have the Web hover style set, # and we are not currently hovering the sash if self.HasAGWFlag(INB_WEB_HILITE) and not self.PointOnSash(event.GetPosition()): wx.SetCursor(wx.StockCursor(wx.CURSOR_ARROW)) # Dont display hover effect when hoevering the # selected label if self._nHoeveredImgIdx == self._nIndex: self._nHoeveredImgIdx = -1 self.Refresh() def DrawPin(self, dc, rect, downPin): """ Draw a pin button, that allows collapsing of the image panel. :param `dc`: an instance of `wx.DC`; :param `rect`: the pin button client rectangle; :param `downPin`: ``True`` if the pin button is facing downwards, ``False`` if it is facing leftwards. """ # Set the bitmap according to the button status if downPin: pinBmp = wx.BitmapFromXPMData(pin_down_xpm) else: pinBmp = wx.BitmapFromXPMData(pin_left_xpm) xx = rect.x + 2 if self._nPinButtonStatus in [INB_PIN_HOVER, INB_PIN_NONE]: dc.SetBrush(wx.TRANSPARENT_BRUSH) dc.SetPen(wx.BLACK_PEN) dc.DrawRectangle(xx, rect.y, 16, 16) # Draw upper and left border with grey colour dc.SetPen(wx.WHITE_PEN) dc.DrawLine(xx, rect.y, xx + 16, rect.y) dc.DrawLine(xx, rect.y, xx, rect.y + 16) elif self._nPinButtonStatus == INB_PIN_PRESSED: dc.SetBrush(wx.TRANSPARENT_BRUSH) dc.SetPen(wx.Pen(wx.NamedColour("LIGHT GREY"))) dc.DrawRectangle(xx, rect.y, 16, 16) # Draw upper and left border with grey colour dc.SetPen(wx.BLACK_PEN) dc.DrawLine(xx, rect.y, xx + 16, rect.y) dc.DrawLine(xx, rect.y, xx, rect.y + 16) # Set the masking pinBmp.SetMask(wx.Mask(pinBmp, wx.WHITE)) # Draw the new bitmap dc.DrawBitmap(pinBmp, xx, rect.y, True) # Save the pin rect self._pinBtnRect = rect # ---------------------------------------------------------------------------- # # Class ImageContainer # ---------------------------------------------------------------------------- # class ImageContainer(ImageContainerBase): """ Base class for L{FlatImageBook} image container. """ def __init__(self, parent, id=wx.ID_ANY, pos=wx.DefaultPosition, size=wx.DefaultSize, style=0, agwStyle=0, name="ImageContainer"): """ Default class constructor. :param `parent`: parent window. Must not be ``None``; :param `id`: window identifier. A value of -1 indicates a default value; :param `pos`: the control position. A value of (-1, -1) indicates a default position, chosen by either the windowing system or wxPython, depending on platform; :param `size`: the control size. A value of (-1, -1) indicates a default size, chosen by either the windowing system or wxPython, depending on platform; :param `style`: the underlying `wx.Panel` window style; :param `agwStyle`: the AGW-specific window style. This can be a combination of the following bits: =========================== =========== ================================================== Window Styles Hex Value Description =========================== =========== ================================================== ``INB_BOTTOM`` 0x1 Place labels below the page area. Available only for L{FlatImageBook}. ``INB_LEFT`` 0x2 Place labels on the left side. Available only for L{FlatImageBook}. ``INB_RIGHT`` 0x4 Place labels on the right side. ``INB_TOP`` 0x8 Place labels above the page area. ``INB_BORDER`` 0x10 Draws a border around L{LabelBook} or L{FlatImageBook}. ``INB_SHOW_ONLY_TEXT`` 0x20 Shows only text labels and no images. Available only for L{LabelBook}. ``INB_SHOW_ONLY_IMAGES`` 0x40 Shows only tab images and no label texts. Available only for L{LabelBook}. ``INB_FIT_BUTTON`` 0x80 Displays a pin button to show/hide the book control. ``INB_DRAW_SHADOW`` 0x100 Draw shadows below the book tabs. Available only for L{LabelBook}. ``INB_USE_PIN_BUTTON`` 0x200 Displays a pin button to show/hide the book control. ``INB_GRADIENT_BACKGROUND`` 0x400 Draws a gradient shading on the tabs background. Available only for L{LabelBook}. ``INB_WEB_HILITE`` 0x800 On mouse hovering, tabs behave like html hyperlinks. Available only for L{LabelBook}. ``INB_NO_RESIZE`` 0x1000 Don't allow resizing of the tab area. ``INB_FIT_LABELTEXT`` 0x2000 Will fit the tab area to the longest text (or text+image if you have images) in all the tabs. =========================== =========== ================================================== :param `name`: the window name. """ ImageContainerBase.__init__(self, parent, id, pos, size, style, agwStyle, name) self.Bind(wx.EVT_PAINT, self.OnPaint) self.Bind(wx.EVT_SIZE, self.OnSize) self.Bind(wx.EVT_LEFT_DOWN, self.OnMouseLeftDown) self.Bind(wx.EVT_LEFT_UP, self.OnMouseLeftUp) self.Bind(wx.EVT_ERASE_BACKGROUND, self.OnEraseBackground) self.Bind(wx.EVT_MOTION, self.OnMouseMove) self.Bind(wx.EVT_LEAVE_WINDOW, self.OnMouseLeaveWindow) def OnSize(self, event): """ Handles the ``wx.EVT_SIZE`` event for L{ImageContainer}. :param `event`: a `wx.SizeEvent` event to be processed. """ ImageContainerBase.OnSize(self, event) event.Skip() def OnMouseLeftDown(self, event): """ Handles the ``wx.EVT_LEFT_DOWN`` event for L{ImageContainer}. :param `event`: a `wx.MouseEvent` event to be processed. """ ImageContainerBase.OnMouseLeftDown(self, event) event.Skip() def OnMouseLeftUp(self, event): """ Handles the ``wx.EVT_LEFT_UP`` event for L{ImageContainer}. :param `event`: a `wx.MouseEvent` event to be processed. """ ImageContainerBase.OnMouseLeftUp(self, event) event.Skip() def OnEraseBackground(self, event): """ Handles the ``wx.EVT_ERASE_BACKGROUND`` event for L{ImageContainer}. :param `event`: a `wx.EraseEvent` event to be processed. """ ImageContainerBase.OnEraseBackground(self, event) def OnMouseMove(self, event): """ Handles the ``wx.EVT_MOTION`` event for L{ImageContainer}. :param `event`: a `wx.MouseEvent` event to be processed. """ ImageContainerBase.OnMouseMove(self, event) event.Skip() def OnMouseLeaveWindow(self, event): """ Handles the ``wx.EVT_LEAVE_WINDOW`` event for L{ImageContainer}. :param `event`: a `wx.MouseEvent` event to be processed. """ ImageContainerBase.OnMouseLeaveWindow(self, event) event.Skip() def CanDoBottomStyle(self): """ Allows the parent to examine the children type. Some implementation (such as L{LabelBook}), does not support top/bottom images, only left/right. """ return True def OnPaint(self, event): """ Handles the ``wx.EVT_PAINT`` event for L{ImageContainer}. :param `event`: a `wx.PaintEvent` event to be processed. """ dc = wx.BufferedPaintDC(self) style = self.GetParent().GetAGWWindowStyleFlag() backBrush = wx.WHITE_BRUSH if style & INB_BORDER: borderPen = wx.Pen(wx.SystemSettings_GetColour(wx.SYS_COLOUR_3DSHADOW)) else: borderPen = wx.TRANSPARENT_PEN size = self.GetSize() # Background dc.SetBrush(backBrush) borderPen.SetWidth(1) dc.SetPen(borderPen) dc.DrawRectangle(0, 0, size.x, size.y) bUsePin = (style & INB_USE_PIN_BUTTON and [True] or [False])[0] if bUsePin: # Draw the pin button clientRect = self.GetClientRect() pinRect = wx.Rect(clientRect.GetX() + clientRect.GetWidth() - 20, 2, 20, 20) self.DrawPin(dc, pinRect, not self._bCollapsed) if self._bCollapsed: return borderPen = wx.BLACK_PEN borderPen.SetWidth(1) dc.SetPen(borderPen) dc.DrawLine(0, size.y, size.x, size.y) dc.DrawPoint(0, size.y) clientSize = 0 bUseYcoord = (style & INB_RIGHT or style & INB_LEFT) if bUseYcoord: clientSize = size.GetHeight() else: clientSize = size.GetWidth() # We reserver 20 pixels for the 'pin' button # The drawing of the images start position. This is # depenedent of the style, especially when Pin button # style is requested if bUsePin: if style & INB_TOP or style & INB_BOTTOM: pos = (style & INB_BORDER and [0] or [1])[0] else: pos = (style & INB_BORDER and [20] or [21])[0] else: pos = (style & INB_BORDER and [0] or [1])[0] nPadding = 4 # Pad text with 2 pixels on the left and right nTextPaddingLeft = 2 count = 0 for i in xrange(len(self._pagesInfoVec)): count = count + 1 # incase the 'fit button' style is applied, we set the rectangle width to the # text width plus padding # Incase the style IS applied, but the style is either LEFT or RIGHT # we ignore it normalFont = wx.SystemSettings_GetFont(wx.SYS_DEFAULT_GUI_FONT) dc.SetFont(normalFont) textWidth, textHeight = dc.GetTextExtent(self._pagesInfoVec[i].GetCaption()) # Restore font to be normal normalFont.SetWeight(wx.FONTWEIGHT_NORMAL) dc.SetFont(normalFont) # Default values for the surronounding rectangle # around a button rectWidth = self._nImgSize * 2 # To avoid the recangle to 'touch' the borders rectHeight = self._nImgSize * 2 # Incase the style requires non-fixed button (fit to text) # recalc the rectangle width if style & INB_FIT_BUTTON and \ not ((style & INB_LEFT) or (style & INB_RIGHT)) and \ not self._pagesInfoVec[i].GetCaption() == "" and \ not (style & INB_SHOW_ONLY_IMAGES): rectWidth = ((textWidth + nPadding * 2) > rectWidth and [nPadding * 2 + textWidth] or [rectWidth])[0] # Make the width an even number if rectWidth % 2 != 0: rectWidth += 1 # Check that we have enough space to draw the button # If Pin button is used, consider its space as well (applicable for top/botton style) # since in the left/right, its size is already considered in 'pos' pinBtnSize = (bUsePin and [20] or [0])[0] if pos + rectWidth + pinBtnSize > clientSize: break # Calculate the button rectangle modRectWidth = ((style & INB_LEFT or style & INB_RIGHT) and [rectWidth - 2] or [rectWidth])[0] modRectHeight = ((style & INB_LEFT or style & INB_RIGHT) and [rectHeight] or [rectHeight - 2])[0] if bUseYcoord: buttonRect = wx.Rect(1, pos, modRectWidth, modRectHeight) else: buttonRect = wx.Rect(pos , 1, modRectWidth, modRectHeight) # Check if we need to draw a rectangle around the button if self._nIndex == i: # Set the colours penColour = wx.SystemSettings_GetColour(wx.SYS_COLOUR_ACTIVECAPTION) brushColour = ArtManager.Get().LightColour(wx.SystemSettings_GetColour(wx.SYS_COLOUR_ACTIVECAPTION), 75) dc.SetPen(wx.Pen(penColour)) dc.SetBrush(wx.Brush(brushColour)) # Fix the surrounding of the rect if border is set if style & INB_BORDER: if style & INB_TOP or style & INB_BOTTOM: buttonRect = wx.Rect(buttonRect.x + 1, buttonRect.y, buttonRect.width - 1, buttonRect.height) else: buttonRect = wx.Rect(buttonRect.x, buttonRect.y + 1, buttonRect.width, buttonRect.height - 1) dc.DrawRectangleRect(buttonRect) if self._nHoeveredImgIdx == i: # Set the colours penColour = wx.SystemSettings_GetColour(wx.SYS_COLOUR_ACTIVECAPTION) brushColour = ArtManager.Get().LightColour(wx.SystemSettings_GetColour(wx.SYS_COLOUR_ACTIVECAPTION), 90) dc.SetPen(wx.Pen(penColour)) dc.SetBrush(wx.Brush(brushColour)) # Fix the surrounding of the rect if border is set if style & INB_BORDER: if style & INB_TOP or style & INB_BOTTOM: buttonRect = wx.Rect(buttonRect.x + 1, buttonRect.y, buttonRect.width - 1, buttonRect.height) else: buttonRect = wx.Rect(buttonRect.x, buttonRect.y + 1, buttonRect.width, buttonRect.height - 1) dc.DrawRectangleRect(buttonRect) if bUseYcoord: rect = wx.Rect(0, pos, rectWidth, rectWidth) else: rect = wx.Rect(pos, 0, rectWidth, rectWidth) # Incase user set both flags: # INB_SHOW_ONLY_TEXT and INB_SHOW_ONLY_IMAGES # We override them to display both if style & INB_SHOW_ONLY_TEXT and style & INB_SHOW_ONLY_IMAGES: style ^= INB_SHOW_ONLY_TEXT style ^= INB_SHOW_ONLY_IMAGES self.GetParent().SetAGWWindowStyleFlag(style) # Draw the caption and text imgTopPadding = 10 if not style & INB_SHOW_ONLY_TEXT and self._pagesInfoVec[i].GetImageIndex() != -1: if bUseYcoord: imgXcoord = self._nImgSize / 2 imgYcoord = (style & INB_SHOW_ONLY_IMAGES and [pos + self._nImgSize / 2] or [pos + imgTopPadding])[0] else: imgXcoord = pos + (rectWidth / 2) - (self._nImgSize / 2) imgYcoord = (style & INB_SHOW_ONLY_IMAGES and [self._nImgSize / 2] or [imgTopPadding])[0] self._ImageList.Draw(self._pagesInfoVec[i].GetImageIndex(), dc, imgXcoord, imgYcoord, wx.IMAGELIST_DRAW_TRANSPARENT, True) # Draw the text if not style & INB_SHOW_ONLY_IMAGES and not self._pagesInfoVec[i].GetCaption() == "": dc.SetFont(normalFont) # Check if the text can fit the size of the rectangle, # if not truncate it fixedText = self._pagesInfoVec[i].GetCaption() if not style & INB_FIT_BUTTON or (style & INB_LEFT or (style & INB_RIGHT)): fixedText = self.FixTextSize(dc, self._pagesInfoVec[i].GetCaption(), self._nImgSize *2 - 4) # Update the length of the text textWidth, textHeight = dc.GetTextExtent(fixedText) if bUseYcoord: textOffsetX = ((rectWidth - textWidth) / 2 ) textOffsetY = (not style & INB_SHOW_ONLY_TEXT and [pos + self._nImgSize + imgTopPadding + 3] or \ [pos + ((self._nImgSize * 2 - textHeight) / 2 )])[0] else: textOffsetX = (rectWidth - textWidth) / 2 + pos + nTextPaddingLeft textOffsetY = (not style & INB_SHOW_ONLY_TEXT and [self._nImgSize + imgTopPadding + 3] or \ [((self._nImgSize * 2 - textHeight) / 2 )])[0] dc.SetTextForeground(wx.SystemSettings_GetColour(wx.SYS_COLOUR_WINDOWTEXT)) dc.DrawText(fixedText, textOffsetX, textOffsetY) # Update the page info self._pagesInfoVec[i].SetPosition(buttonRect.GetPosition()) self._pagesInfoVec[i].SetSize(buttonRect.GetSize()) pos += rectWidth # Update all buttons that can not fit into the screen as non-visible for ii in xrange(count, len(self._pagesInfoVec)): self._pagesInfoVec[ii].SetPosition(wx.Point(-1, -1)) # Draw the pin button if bUsePin: clientRect = self.GetClientRect() pinRect = wx.Rect(clientRect.GetX() + clientRect.GetWidth() - 20, 2, 20, 20) self.DrawPin(dc, pinRect, not self._bCollapsed) # ---------------------------------------------------------------------------- # # Class LabelContainer # ---------------------------------------------------------------------------- # class LabelContainer(ImageContainerBase): """ Base class for L{LabelBook}. """ def __init__(self, parent, id=wx.ID_ANY, pos=wx.DefaultPosition, size=wx.DefaultSize, style=0, agwStyle=0, name="LabelContainer"): """ Default class constructor. :param `parent`: parent window. Must not be ``None``; :param `id`: window identifier. A value of -1 indicates a default value; :param `pos`: the control position. A value of (-1, -1) indicates a default position, chosen by either the windowing system or wxPython, depending on platform; :param `size`: the control size. A value of (-1, -1) indicates a default size, chosen by either the windowing system or wxPython, depending on platform; :param `style`: the underlying `wx.Panel` window style; :param `agwStyle`: the AGW-specific window style. This can be a combination of the following bits: =========================== =========== ================================================== Window Styles Hex Value Description =========================== =========== ================================================== ``INB_BOTTOM`` 0x1 Place labels below the page area. Available only for L{FlatImageBook}. ``INB_LEFT`` 0x2 Place labels on the left side. Available only for L{FlatImageBook}. ``INB_RIGHT`` 0x4 Place labels on the right side. ``INB_TOP`` 0x8 Place labels above the page area. ``INB_BORDER`` 0x10 Draws a border around L{LabelBook} or L{FlatImageBook}. ``INB_SHOW_ONLY_TEXT`` 0x20 Shows only text labels and no images. Available only for L{LabelBook}. ``INB_SHOW_ONLY_IMAGES`` 0x40 Shows only tab images and no label texts. Available only for L{LabelBook}. ``INB_FIT_BUTTON`` 0x80 Displays a pin button to show/hide the book control. ``INB_DRAW_SHADOW`` 0x100 Draw shadows below the book tabs. Available only for L{LabelBook}. ``INB_USE_PIN_BUTTON`` 0x200 Displays a pin button to show/hide the book control. ``INB_GRADIENT_BACKGROUND`` 0x400 Draws a gradient shading on the tabs background. Available only for L{LabelBook}. ``INB_WEB_HILITE`` 0x800 On mouse hovering, tabs behave like html hyperlinks. Available only for L{LabelBook}. ``INB_NO_RESIZE`` 0x1000 Don't allow resizing of the tab area. ``INB_FIT_LABELTEXT`` 0x2000 Will fit the tab area to the longest text (or text+image if you have images) in all the tabs. =========================== =========== ================================================== :param `name`: the window name. """ ImageContainerBase.__init__(self, parent, id, pos, size, style, agwStyle, name) self._nTabAreaWidth = 100 self._oldCursor = wx.NullCursor self._coloursMap = {} self._skin = wx.NullBitmap self._sashRect = wx.Rect() self.Bind(wx.EVT_PAINT, self.OnPaint) self.Bind(wx.EVT_SIZE, self.OnSize) self.Bind(wx.EVT_LEFT_DOWN, self.OnMouseLeftDown) self.Bind(wx.EVT_LEFT_UP, self.OnMouseLeftUp) self.Bind(wx.EVT_MOTION, self.OnMouseMove) self.Bind(wx.EVT_LEAVE_WINDOW, self.OnMouseLeaveWindow) self.Bind(wx.EVT_ERASE_BACKGROUND, self.OnEraseBackground) def OnSize(self, event): """ Handles the ``wx.EVT_SIZE`` event for L{LabelContainer}. :param `event`: a `wx.SizeEvent` event to be processed. """ ImageContainerBase.OnSize(self, event) event.Skip() def OnEraseBackground(self, event): """ Handles the ``wx.EVT_ERASE_BACKGROUND`` event for L{LabelContainer}. :param `event`: a `wx.EraseEvent` event to be processed. """ ImageContainerBase.OnEraseBackground(self, event) def GetTabAreaWidth(self): """ Returns the width of the tab area. """ return self._nTabAreaWidth def SetTabAreaWidth(self, width): """ Sets the width of the tab area. :param `width`: the width of the tab area, in pixels. """ self._nTabAreaWidth = width def CanDoBottomStyle(self): """ Allows the parent to examine the children type. Some implementation (such as L{LabelBook}), does not support top/bottom images, only left/right. """ return False def SetBackgroundBitmap(self, bmp): """ Sets the background bitmap for the control. :param `bmp`: a valid `wx.Bitmap` object. """ self._skin = bmp def OnPaint(self, event): """ Handles the ``wx.EVT_PAINT`` event for L{LabelContainer}. :param `event`: a `wx.PaintEvent` event to be processed. """ style = self.GetParent().GetAGWWindowStyleFlag() dc = wx.BufferedPaintDC(self) backBrush = wx.Brush(self._coloursMap[INB_TAB_AREA_BACKGROUND_COLOUR]) if self.HasAGWFlag(INB_BORDER): borderPen = wx.Pen(self._coloursMap[INB_TABS_BORDER_COLOUR]) else: borderPen = wx.TRANSPARENT_PEN size = self.GetSize() # Set the pen & brush dc.SetBrush(backBrush) dc.SetPen(borderPen) # Incase user set both flags, we override them to display both # INB_SHOW_ONLY_TEXT and INB_SHOW_ONLY_IMAGES if style & INB_SHOW_ONLY_TEXT and style & INB_SHOW_ONLY_IMAGES: style ^= INB_SHOW_ONLY_TEXT style ^= INB_SHOW_ONLY_IMAGES self.GetParent().SetAGWWindowStyleFlag(style) if self.HasAGWFlag(INB_GRADIENT_BACKGROUND) and not self._skin.Ok(): # Draw graident in the background area startColour = self._coloursMap[INB_TAB_AREA_BACKGROUND_COLOUR] endColour = ArtManager.Get().LightColour(self._coloursMap[INB_TAB_AREA_BACKGROUND_COLOUR], 50) ArtManager.Get().PaintStraightGradientBox(dc, wx.Rect(0, 0, size.x / 2, size.y), startColour, endColour, False) ArtManager.Get().PaintStraightGradientBox(dc, wx.Rect(size.x / 2, 0, size.x / 2, size.y), endColour, startColour, False) else: # Draw the border and background if self._skin.Ok(): dc.SetBrush(wx.TRANSPARENT_BRUSH) self.DrawBackgroundBitmap(dc) dc.DrawRectangleRect(wx.Rect(0, 0, size.x, size.y)) # Draw border if self.HasAGWFlag(INB_BORDER) and self.HasAGWFlag(INB_GRADIENT_BACKGROUND): # Just draw the border with transparent brush dc.SetBrush(wx.TRANSPARENT_BRUSH) dc.DrawRectangleRect(wx.Rect(0, 0, size.x, size.y)) bUsePin = (self.HasAGWFlag(INB_USE_PIN_BUTTON) and [True] or [False])[0] if bUsePin: # Draw the pin button clientRect = self.GetClientRect() pinRect = wx.Rect(clientRect.GetX() + clientRect.GetWidth() - 20, 2, 20, 20) self.DrawPin(dc, pinRect, not self._bCollapsed) if self._bCollapsed: return dc.SetPen(wx.BLACK_PEN) self.SetSizeHints(self._nTabAreaWidth, -1) # We reserve 20 pixels for the pin button posy = 20 count = 0 for i in xrange(len(self._pagesInfoVec)): count = count+1 # Default values for the surronounding rectangle # around a button rectWidth = self._nTabAreaWidth if self.HasAGWFlag(INB_SHOW_ONLY_TEXT): font = wx.SystemSettings_GetFont(wx.SYS_DEFAULT_GUI_FONT) font.SetPointSize(font.GetPointSize() * self.GetParent().GetFontSizeMultiple()) if self.GetParent().GetFontBold(): font.SetWeight(wx.FONTWEIGHT_BOLD) dc.SetFont(font) w, h = dc.GetTextExtent(self._pagesInfoVec[i].GetCaption()) rectHeight = h * 2 else: rectHeight = self._nImgSize * 2 # Check that we have enough space to draw the button if posy + rectHeight > size.GetHeight(): break # Calculate the button rectangle posx = 0 buttonRect = wx.Rect(posx, posy, rectWidth, rectHeight) indx = self._pagesInfoVec[i].GetImageIndex() if indx == -1: bmp = wx.NullBitmap else: bmp = self._ImageList.GetBitmap(indx) self.DrawLabel(dc, buttonRect, self._pagesInfoVec[i].GetCaption(), bmp, self._pagesInfoVec[i], self.HasAGWFlag(INB_LEFT) or self.HasAGWFlag(INB_TOP), i, self._nIndex == i, self._nHoeveredImgIdx == i) posy += rectHeight # Update all buttons that can not fit into the screen as non-visible for ii in xrange(count, len(self._pagesInfoVec)): self._pagesInfoVec[i].SetPosition(wx.Point(-1, -1)) if bUsePin: clientRect = self.GetClientRect() pinRect = wx.Rect(clientRect.GetX() + clientRect.GetWidth() - 20, 2, 20, 20) self.DrawPin(dc, pinRect, not self._bCollapsed) def DrawBackgroundBitmap(self, dc): """ Draws a bitmap as the background of the control. :param `dc`: an instance of `wx.DC`. """ clientRect = self.GetClientRect() width = clientRect.GetWidth() height = clientRect.GetHeight() coveredY = coveredX = 0 xstep = self._skin.GetWidth() ystep = self._skin.GetHeight() bmpRect = wx.Rect(0, 0, xstep, ystep) if bmpRect != clientRect: mem_dc = wx.MemoryDC() bmp = wx.EmptyBitmap(width, height) mem_dc.SelectObject(bmp) while coveredY < height: while coveredX < width: mem_dc.DrawBitmap(self._skin, coveredX, coveredY, True) coveredX += xstep coveredX = 0 coveredY += ystep mem_dc.SelectObject(wx.NullBitmap) #self._skin = bmp dc.DrawBitmap(bmp, 0, 0) else: dc.DrawBitmap(self._skin, 0, 0) def OnMouseLeftUp(self, event): """ Handles the ``wx.EVT_LEFT_UP`` event for L{LabelContainer}. :param `event`: a `wx.MouseEvent` event to be processed. """ if self.HasAGWFlag(INB_NO_RESIZE): ImageContainerBase.OnMouseLeftUp(self, event) return if self.HasCapture(): self.ReleaseMouse() # Sash was being dragged? if not self._sashRect.IsEmpty(): # Remove sash ArtManager.Get().DrawDragSash(self._sashRect) self.Resize(event) self._sashRect = wx.Rect() return self._sashRect = wx.Rect() # Restore cursor if self._oldCursor.Ok(): wx.SetCursor(self._oldCursor) self._oldCursor = wx.NullCursor ImageContainerBase.OnMouseLeftUp(self, event) def Resize(self, event): """ Actually resizes the tab area. :param `event`: an instance of `wx.SizeEvent`. """ # Resize our size self._tabAreaSize = self.GetSize() newWidth = self._tabAreaSize.x x = event.GetX() if self.HasAGWFlag(INB_BOTTOM) or self.HasAGWFlag(INB_RIGHT): newWidth -= event.GetX() else: newWidth = x if newWidth < 100: # Dont allow width to be lower than that newWidth = 100 self.SetSizeHints(newWidth, self._tabAreaSize.y) # Update the tab new area width self._nTabAreaWidth = newWidth self.GetParent().Freeze() self.GetParent().GetSizer().Layout() self.GetParent().Thaw() def OnMouseMove(self, event): """ Handles the ``wx.EVT_MOTION`` event for L{LabelContainer}. :param `event`: a `wx.MouseEvent` event to be processed. """ if self.HasAGWFlag(INB_NO_RESIZE): ImageContainerBase.OnMouseMove(self, event) return # Remove old sash if not self._sashRect.IsEmpty(): ArtManager.Get().DrawDragSash(self._sashRect) if event.LeftIsDown(): if not self._sashRect.IsEmpty(): # Progress sash, and redraw it clientRect = self.GetClientRect() pt = self.ClientToScreen(wx.Point(event.GetX(), 0)) self._sashRect = wx.RectPS(pt, wx.Size(4, clientRect.height)) ArtManager.Get().DrawDragSash(self._sashRect) else: # Sash is not being dragged if self._oldCursor.Ok(): wx.SetCursor(self._oldCursor) self._oldCursor = wx.NullCursor else: if self.HasCapture(): self.ReleaseMouse() if self.PointOnSash(event.GetPosition()): # Change cursor to EW cursor self._oldCursor = self.GetCursor() wx.SetCursor(wx.StockCursor(wx.CURSOR_SIZEWE)) elif self._oldCursor.Ok(): wx.SetCursor(self._oldCursor) self._oldCursor = wx.NullCursor self._sashRect = wx.Rect() ImageContainerBase.OnMouseMove(self, event) def OnMouseLeftDown(self, event): """ Handles the ``wx.EVT_LEFT_DOWN`` event for L{LabelContainer}. :param `event`: a `wx.MouseEvent` event to be processed. """ if self.HasAGWFlag(INB_NO_RESIZE): ImageContainerBase.OnMouseLeftDown(self, event) return imgIdx, where = self.HitTest(event.GetPosition()) if IMG_OVER_EW_BORDER == where and not self._bCollapsed: # We are over the sash if not self._sashRect.IsEmpty(): ArtManager.Get().DrawDragSash(self._sashRect) else: # first time, begin drawing sash self.CaptureMouse() # Change mouse cursor self._oldCursor = self.GetCursor() wx.SetCursor(wx.StockCursor(wx.CURSOR_SIZEWE)) clientRect = self.GetClientRect() pt = self.ClientToScreen(wx.Point(event.GetX(), 0)) self._sashRect = wx.RectPS(pt, wx.Size(4, clientRect.height)) ArtManager.Get().DrawDragSash(self._sashRect) else: ImageContainerBase.OnMouseLeftDown(self, event) def OnMouseLeaveWindow(self, event): """ Handles the ``wx.EVT_LEAVE_WINDOW`` event for L{LabelContainer}. :param `event`: a `wx.MouseEvent` event to be processed. """ if self.HasAGWFlag(INB_NO_RESIZE): ImageContainerBase.OnMouseLeaveWindow(self, event) return # If Sash is being dragged, ignore this event if not self.HasCapture(): ImageContainerBase.OnMouseLeaveWindow(self, event) def DrawRegularHover(self, dc, rect): """ Draws a rounded rectangle around the current tab. :param `dc`: an instance of `wx.DC`; :param `rect`: the current tab client rectangle. """ # The hovered tab with default border dc.SetBrush(wx.TRANSPARENT_BRUSH) dc.SetPen(wx.Pen(wx.WHITE)) # We draw CCW if self.HasAGWFlag(INB_RIGHT) or self.HasAGWFlag(INB_TOP): # Right images # Upper line dc.DrawLine(rect.x + 1, rect.y, rect.x + rect.width, rect.y) # Right line (white) dc.DrawLine(rect.x + rect.width, rect.y, rect.x + rect.width, rect.y + rect.height) # Bottom diagnol - we change pen dc.SetPen(wx.Pen(self._coloursMap[INB_TABS_BORDER_COLOUR])) # Bottom line dc.DrawLine(rect.x + rect.width, rect.y + rect.height, rect.x, rect.y + rect.height) else: # Left images # Upper line white dc.DrawLine(rect.x, rect.y, rect.x + rect.width - 1, rect.y) # Left line dc.DrawLine(rect.x, rect.y, rect.x, rect.y + rect.height) # Bottom diagnol, we change the pen dc.SetPen(wx.Pen(self._coloursMap[INB_TABS_BORDER_COLOUR])) # Bottom line dc.DrawLine(rect.x, rect.y + rect.height, rect.x + rect.width, rect.y + rect.height) def DrawWebHover(self, dc, caption, xCoord, yCoord): """ Draws a web style hover effect (cursor set to hand & text is underlined). :param `dc`: an instance of `wx.DC`; :param `caption`: the tab caption text; :param `xCoord`: the x position of the tab caption; :param `yCoord`: the y position of the tab caption. """ # Redraw the text with underlined font underLinedFont = wx.SystemSettings_GetFont(wx.SYS_DEFAULT_GUI_FONT) underLinedFont.SetPointSize(underLinedFont.GetPointSize() * self.GetParent().GetFontSizeMultiple()) if self.GetParent().GetFontBold(): underLinedFont.SetWeight(wx.FONTWEIGHT_BOLD) underLinedFont.SetUnderlined(True) dc.SetFont(underLinedFont) dc.DrawText(caption, xCoord, yCoord) def SetColour(self, which, colour): """ Sets a colour for a parameter. :param `which`: can be one of the following parameters: ================================== ======= ================================== Colour Key Value Description ================================== ======= ================================== ``INB_TAB_AREA_BACKGROUND_COLOUR`` 100 The tab area background colour ``INB_ACTIVE_TAB_COLOUR`` 101 The active tab background colour ``INB_TABS_BORDER_COLOUR`` 102 The tabs border colour ``INB_TEXT_COLOUR`` 103 The tab caption text colour ``INB_ACTIVE_TEXT_COLOUR`` 104 The active tab caption text colour ``INB_HILITE_TAB_COLOUR`` 105 The tab caption highlight text colour ================================== ======= ================================== :param `colour`: a valid `wx.Colour` object. """ self._coloursMap[which] = colour def GetColour(self, which): """ Returns a colour for a parameter. :param `which`: the colour key. :see: L{SetColour} for a list of valid colour keys. """ if not self._coloursMap.has_key(which): return wx.Colour() return self._coloursMap[which] def InitializeColours(self): """ Initializes the colours map to be used for this control. """ # Initialize map colours self._coloursMap.update({INB_TAB_AREA_BACKGROUND_COLOUR: ArtManager.Get().LightColour(ArtManager.Get().FrameColour(), 50)}) self._coloursMap.update({INB_ACTIVE_TAB_COLOUR: ArtManager.Get().GetMenuFaceColour()}) self._coloursMap.update({INB_TABS_BORDER_COLOUR: wx.SystemSettings_GetColour(wx.SYS_COLOUR_3DSHADOW)}) self._coloursMap.update({INB_HILITE_TAB_COLOUR: wx.NamedColour("LIGHT BLUE")}) self._coloursMap.update({INB_TEXT_COLOUR: wx.WHITE}) self._coloursMap.update({INB_ACTIVE_TEXT_COLOUR: wx.BLACK}) # dont allow bright colour one on the other if not ArtManager.Get().IsDark(self._coloursMap[INB_TAB_AREA_BACKGROUND_COLOUR]) and \ not ArtManager.Get().IsDark(self._coloursMap[INB_TEXT_COLOUR]): self._coloursMap[INB_TEXT_COLOUR] = ArtManager.Get().DarkColour(self._coloursMap[INB_TEXT_COLOUR], 100) def DrawLabel(self, dc, rect, text, bmp, imgInfo, orientationLeft, imgIdx, selected, hover): """ Draws a label using the specified dc. :param `dc`: an instance of `wx.DC`; :param `rect`: the text client rectangle; :param `text`: the actual text string; :param `bmp`: a bitmap to be drawn next to the text; :param `imgInfo`: an instance of L{ImageInfo}; :param `orientationLeft`: ``True`` if the book has the ``INB_RIGHT`` or ``INB_LEFT`` style set; :param `imgIdx`: the tab image index; :param `selected`: ``True`` if the tab is selected, ``False`` otherwise; :param `hover`: ``True`` if the tab is being hovered with the mouse, ``False`` otherwise. """ dcsaver = DCSaver(dc) nPadding = 6 if orientationLeft: rect.x += nPadding rect.width -= nPadding else: rect.width -= nPadding textRect = wx.Rect(*rect) imgRect = wx.Rect(*rect) font = wx.SystemSettings_GetFont(wx.SYS_DEFAULT_GUI_FONT) font.SetPointSize(font.GetPointSize() * self.GetParent().GetFontSizeMultiple()) if self.GetParent().GetFontBold(): font.SetWeight(wx.FONTWEIGHT_BOLD) dc.SetFont(font) # First we define the rectangle for the text w, h = dc.GetTextExtent(text) #------------------------------------------------------------------------- # Label layout: # [ nPadding | Image | nPadding | Text | nPadding ] #------------------------------------------------------------------------- # Text bounding rectangle textRect.x += nPadding textRect.y = rect.y + (rect.height - h)/2 textRect.width = rect.width - 2 * nPadding if bmp.Ok() and not self.HasAGWFlag(INB_SHOW_ONLY_TEXT): textRect.x += (bmp.GetWidth() + nPadding) textRect.width -= (bmp.GetWidth() + nPadding) textRect.height = h # Truncate text if needed caption = ArtManager.Get().TruncateText(dc, text, textRect.width) # Image bounding rectangle if bmp.Ok() and not self.HasAGWFlag(INB_SHOW_ONLY_TEXT): imgRect.x += nPadding imgRect.width = bmp.GetWidth() imgRect.y = rect.y + (rect.height - bmp.GetHeight())/2 imgRect.height = bmp.GetHeight() # Draw bounding rectangle if selected: # First we colour the tab dc.SetBrush(wx.Brush(self._coloursMap[INB_ACTIVE_TAB_COLOUR])) if self.HasAGWFlag(INB_BORDER): dc.SetPen(wx.Pen(self._coloursMap[INB_TABS_BORDER_COLOUR])) else: dc.SetPen(wx.Pen(self._coloursMap[INB_ACTIVE_TAB_COLOUR])) labelRect = wx.Rect(*rect) if orientationLeft: labelRect.width += 3 else: labelRect.width += 3 labelRect.x -= 3 dc.DrawRoundedRectangleRect(labelRect, 3) if not orientationLeft and self.HasAGWFlag(INB_DRAW_SHADOW): dc.SetPen(wx.BLACK_PEN) dc.DrawPoint(labelRect.x + labelRect.width - 1, labelRect.y + labelRect.height - 1) # Draw the text & bitmap if caption != "": if selected: dc.SetTextForeground(self._coloursMap[INB_ACTIVE_TEXT_COLOUR]) else: dc.SetTextForeground(self._coloursMap[INB_TEXT_COLOUR]) dc.DrawText(caption, textRect.x, textRect.y) imgInfo.SetTextRect(textRect) else: imgInfo.SetTextRect(wx.Rect()) if bmp.Ok() and not self.HasAGWFlag(INB_SHOW_ONLY_TEXT): dc.DrawBitmap(bmp, imgRect.x, imgRect.y, True) # Drop shadow if self.HasAGWFlag(INB_DRAW_SHADOW) and selected: sstyle = 0 if orientationLeft: sstyle = BottomShadow else: sstyle = BottomShadowFull | RightShadow if self.HasAGWFlag(INB_WEB_HILITE): # Always drop shadow for this style ArtManager.Get().DrawBitmapShadow(dc, rect, sstyle) else: if imgIdx+1 != self._nHoeveredImgIdx: ArtManager.Get().DrawBitmapShadow(dc, rect, sstyle) # Draw hover effect if hover: if self.HasAGWFlag(INB_WEB_HILITE) and caption != "": self.DrawWebHover(dc, caption, textRect.x, textRect.y) else: self.DrawRegularHover(dc, rect) # Update the page information bout position and size imgInfo.SetPosition(rect.GetPosition()) imgInfo.SetSize(rect.GetSize()) # ---------------------------------------------------------------------------- # # Class FlatBookBase # ---------------------------------------------------------------------------- # class FlatBookBase(wx.Panel): """ Base class for the containing window for L{LabelBook} and L{FlatImageBook}. """ def __init__(self, parent, id=wx.ID_ANY, pos=wx.DefaultPosition, size=wx.DefaultSize, style=0, agwStyle=0, name="FlatBookBase"): """ Default class constructor. :param `parent`: parent window. Must not be ``None``; :param `id`: window identifier. A value of -1 indicates a default value; :param `pos`: the control position. A value of (-1, -1) indicates a default position, chosen by either the windowing system or wxPython, depending on platform; :param `size`: the control size. A value of (-1, -1) indicates a default size, chosen by either the windowing system or wxPython, depending on platform; :param `style`: the underlying `wx.Panel` window style; :param `agwStyle`: the AGW-specific window style. This can be a combination of the following bits: =========================== =========== ================================================== Window Styles Hex Value Description =========================== =========== ================================================== ``INB_BOTTOM`` 0x1 Place labels below the page area. Available only for L{FlatImageBook}. ``INB_LEFT`` 0x2 Place labels on the left side. Available only for L{FlatImageBook}. ``INB_RIGHT`` 0x4 Place labels on the right side. ``INB_TOP`` 0x8 Place labels above the page area. ``INB_BORDER`` 0x10 Draws a border around L{LabelBook} or L{FlatImageBook}. ``INB_SHOW_ONLY_TEXT`` 0x20 Shows only text labels and no images. Available only for L{LabelBook}. ``INB_SHOW_ONLY_IMAGES`` 0x40 Shows only tab images and no label texts. Available only for L{LabelBook}. ``INB_FIT_BUTTON`` 0x80 Displays a pin button to show/hide the book control. ``INB_DRAW_SHADOW`` 0x100 Draw shadows below the book tabs. Available only for L{LabelBook}. ``INB_USE_PIN_BUTTON`` 0x200 Displays a pin button to show/hide the book control. ``INB_GRADIENT_BACKGROUND`` 0x400 Draws a gradient shading on the tabs background. Available only for L{LabelBook}. ``INB_WEB_HILITE`` 0x800 On mouse hovering, tabs behave like html hyperlinks. Available only for L{LabelBook}. ``INB_NO_RESIZE`` 0x1000 Don't allow resizing of the tab area. ``INB_FIT_LABELTEXT`` 0x2000 Will fit the tab area to the longest text (or text+image if you have images) in all the tabs. =========================== =========== ================================================== :param `name`: the window name. """ self._pages = None self._bInitializing = True self._pages = None self._bForceSelection = False self._windows = [] self._fontSizeMultiple = 1.0 self._fontBold = False style |= wx.TAB_TRAVERSAL self._agwStyle = agwStyle wx.Panel.__init__(self, parent, id, pos, size, style, name) self._bInitializing = False def SetAGWWindowStyleFlag(self, agwStyle): """ Sets the window style. :param `agwStyle`: can be a combination of the following bits: =========================== =========== ================================================== Window Styles Hex Value Description =========================== =========== ================================================== ``INB_BOTTOM`` 0x1 Place labels below the page area. Available only for L{FlatImageBook}. ``INB_LEFT`` 0x2 Place labels on the left side. Available only for L{FlatImageBook}. ``INB_RIGHT`` 0x4 Place labels on the right side. ``INB_TOP`` 0x8 Place labels above the page area. ``INB_BORDER`` 0x10 Draws a border around L{LabelBook} or L{FlatImageBook}. ``INB_SHOW_ONLY_TEXT`` 0x20 Shows only text labels and no images. Available only for L{LabelBook}. ``INB_SHOW_ONLY_IMAGES`` 0x40 Shows only tab images and no label texts. Available only for L{LabelBook}. ``INB_FIT_BUTTON`` 0x80 Displays a pin button to show/hide the book control. ``INB_DRAW_SHADOW`` 0x100 Draw shadows below the book tabs. Available only for L{LabelBook}. ``INB_USE_PIN_BUTTON`` 0x200 Displays a pin button to show/hide the book control. ``INB_GRADIENT_BACKGROUND`` 0x400 Draws a gradient shading on the tabs background. Available only for L{LabelBook}. ``INB_WEB_HILITE`` 0x800 On mouse hovering, tabs behave like html hyperlinks. Available only for L{LabelBook}. ``INB_NO_RESIZE`` 0x1000 Don't allow resizing of the tab area. ``INB_FIT_LABELTEXT`` 0x2000 Will fit the tab area to the longest text (or text+image if you have images) in all the tabs. =========================== =========== ================================================== """ self._agwStyle = agwStyle # Check that we are not in initialization process if self._bInitializing: return if not self._pages: return # Detach the windows attached to the sizer if self.GetSelection() >= 0: self._mainSizer.Detach(self._windows[self.GetSelection()]) self._mainSizer.Detach(self._pages) # Create new sizer with the requested orientaion className = self.GetName() if className == "LabelBook": self._mainSizer = wx.BoxSizer(wx.HORIZONTAL) else: if agwStyle & INB_LEFT or agwStyle & INB_RIGHT: self._mainSizer = wx.BoxSizer(wx.HORIZONTAL) else: self._mainSizer = wx.BoxSizer(wx.VERTICAL) self.SetSizer(self._mainSizer) # Add the tab container and the separator self._mainSizer.Add(self._pages, 0, wx.EXPAND) if className == "FlatImageBook": if agwStyle & INB_LEFT or agwStyle & INB_RIGHT: self._pages.SetSizeHints(self._pages._nImgSize * 2, -1) else: self._pages.SetSizeHints(-1, self._pages._nImgSize * 2) # Attach the windows back to the sizer to the sizer if self.GetSelection() >= 0: self.DoSetSelection(self._windows[self.GetSelection()]) if agwStyle & INB_FIT_LABELTEXT: self.ResizeTabArea() self._mainSizer.Layout() dummy = wx.SizeEvent() wx.PostEvent(self, dummy) self._pages.Refresh() def GetAGWWindowStyleFlag(self): """ Returns the L{FlatBookBase} window style. :see: L{SetAGWWindowStyleFlag} for a list of possible window style flags. """ return self._agwStyle def HasAGWFlag(self, flag): """ Returns whether a flag is present in the L{FlatBookBase} style. :param `flag`: one of the possible L{FlatBookBase} window styles. :see: L{SetAGWWindowStyleFlag} for a list of possible window style flags. """ agwStyle = self.GetAGWWindowStyleFlag() res = (agwStyle & flag and [True] or [False])[0] return res def AddPage(self, page, text, select=False, imageId=-1): """ Adds a page to the book. :param `page`: specifies the new page; :param `text`: specifies the text for the new page; :param `select`: specifies whether the page should be selected; :param `imageId`: specifies the optional image index for the new page. :note: The call to this function generates the page changing events. """ if not page: return page.Reparent(self) self._windows.append(page) if select or len(self._windows) == 1: self.DoSetSelection(page) else: page.Hide() self._pages.AddPage(text, select, imageId) self.ResizeTabArea() self.Refresh() def InsertPage(self, page_idx, page, text, select=False, imageId=-1): """ Inserts a page into the book at the specified position. :param `page_idx`: specifies the position for the new page; :param `page`: specifies the new page; :param `text`: specifies the text for the new page; :param `select`: specifies whether the page should be selected; :param `imageId`: specifies the optional image index for the new page. :note: The call to this function generates the page changing events. """ if not page: return page.Reparent(self) self._windows.insert(page_idx, page) if select or len(self._windows) == 1: self.DoSetSelection(page) else: page.Hide() self._pages.InsertPage(page_idx, text, select, imageId) self.ResizeTabArea() self.Refresh() def DeletePage(self, page): """ Deletes the specified page, and the associated window. :param `page`: an integer specifying the page to be deleted. :note: The call to this function generates the page changing events. """ if page >= len(self._windows) or page < 0: return # Fire a closing event event = ImageNotebookEvent(wxEVT_IMAGENOTEBOOK_PAGE_CLOSING, self.GetId()) event.SetSelection(page) event.SetEventObject(self) self.GetEventHandler().ProcessEvent(event) # The event handler allows it? if not event.IsAllowed(): return False self.Freeze() # Delete the requested page pageRemoved = self._windows[page] # If the page is the current window, remove it from the sizer # as well if page == self.GetSelection(): self._mainSizer.Detach(pageRemoved) # Remove it from the array as well self._windows.pop(page) # Now we can destroy it in wxWidgets use Destroy instead of delete pageRemoved.Destroy() self._mainSizer.Layout() self._pages.DoDeletePage(page) self.ResizeTabArea() self.Thaw() # Fire a closed event closedEvent = ImageNotebookEvent(wxEVT_IMAGENOTEBOOK_PAGE_CLOSED, self.GetId()) closedEvent.SetSelection(page) closedEvent.SetEventObject(self) self.GetEventHandler().ProcessEvent(closedEvent) def RemovePage(self, page): """ Deletes the specified page, without deleting the associated window. :param `page`: an integer specifying the page to be removed. :note: The call to this function generates the page changing events. """ if page >= len(self._windows): return False # Fire a closing event event = ImageNotebookEvent(wxEVT_IMAGENOTEBOOK_PAGE_CLOSING, self.GetId()) event.SetSelection(page) event.SetEventObject(self) self.GetEventHandler().ProcessEvent(event) # The event handler allows it? if not event.IsAllowed(): return False self.Freeze() # Remove the requested page pageRemoved = self._windows[page] # If the page is the current window, remove it from the sizer # as well if page == self.GetSelection(): self._mainSizer.Detach(pageRemoved) # Remove it from the array as well self._windows.pop(page) self._mainSizer.Layout() self.ResizeTabArea() self.Thaw() self._pages.DoDeletePage(page) # Fire a closed event closedEvent = ImageNotebookEvent(wxEVT_IMAGENOTEBOOK_PAGE_CLOSED, self.GetId()) closedEvent.SetSelection(page) closedEvent.SetEventObject(self) self.GetEventHandler().ProcessEvent(closedEvent) return True def ResizeTabArea(self): """ Resizes the tab area if the control has the ``INB_FIT_LABELTEXT`` style set. """ agwStyle = self.GetAGWWindowStyleFlag() if agwStyle & INB_FIT_LABELTEXT == 0: return if agwStyle & INB_LEFT or agwStyle & INB_RIGHT: dc = wx.MemoryDC() dc.SelectObject(wx.EmptyBitmap(1, 1)) font = wx.SystemSettings_GetFont(wx.SYS_DEFAULT_GUI_FONT) font.SetPointSize(font.GetPointSize()*self._fontSizeMultiple) if self.GetFontBold(): font.SetWeight(wx.FONTWEIGHT_BOLD) dc.SetFont(font) maxW = 0 for page in xrange(self.GetPageCount()): caption = self._pages.GetPageText(page) w, h = dc.GetTextExtent(caption) maxW = max(maxW, w) maxW += 24 #TODO this is 6*4 6 is nPadding from drawlabel if not agwStyle & INB_SHOW_ONLY_TEXT: maxW += self._pages._nImgSize * 2 maxW = max(maxW, 100) self._pages.SetSizeHints(maxW, -1) self._pages._nTabAreaWidth = maxW def DeleteAllPages(self): """ Deletes all the pages in the book. """ if not self._windows: return self.Freeze() for win in self._windows: win.Destroy() self._windows = [] self.Thaw() # remove old selection self._pages.ClearAll() self._pages.Refresh() def SetSelection(self, page): """ Changes the selection from currently visible/selected page to the page given by page. :param `page`: an integer specifying the page to be selected. :note: The call to this function generates the page changing events. """ if page >= len(self._windows): return if page == self.GetSelection() and not self._bForceSelection: return oldSelection = self.GetSelection() # Generate an event that indicates that an image is about to be selected event = ImageNotebookEvent(wxEVT_IMAGENOTEBOOK_PAGE_CHANGING, self.GetId()) event.SetSelection(page) event.SetOldSelection(oldSelection) event.SetEventObject(self) self.GetEventHandler().ProcessEvent(event) # The event handler allows it? if not event.IsAllowed() and not self._bForceSelection: return self.DoSetSelection(self._windows[page]) # Now we can update the new selection self._pages._nIndex = page # Refresh calls the OnPaint of this class self._pages.Refresh() # Generate an event that indicates that an image was selected eventChanged = ImageNotebookEvent(wxEVT_IMAGENOTEBOOK_PAGE_CHANGED, self.GetId()) eventChanged.SetEventObject(self) eventChanged.SetOldSelection(oldSelection) eventChanged.SetSelection(page) self.GetEventHandler().ProcessEvent(eventChanged) def AssignImageList(self, imglist): """ Assigns an image list to the control. :param `imglist`: an instance of `wx.ImageList`. """ self._pages.AssignImageList(imglist) # Force change self.SetAGWWindowStyleFlag(self.GetAGWWindowStyleFlag()) def GetSelection(self): """ Returns the current selection. """ if self._pages: return self._pages._nIndex else: return -1 def DoSetSelection(self, window): """ Select the window by the provided pointer. :param `window`: an instance of `wx.Window`. """ curSel = self.GetSelection() agwStyle = self.GetAGWWindowStyleFlag() # Replace the window in the sizer self.Freeze() # Check if a new selection was made bInsertFirst = (agwStyle & INB_BOTTOM or agwStyle & INB_RIGHT) if curSel >= 0: # Remove the window from the main sizer self._mainSizer.Detach(self._windows[curSel]) self._windows[curSel].Hide() if bInsertFirst: self._mainSizer.Insert(0, window, 1, wx.EXPAND) else: self._mainSizer.Add(window, 1, wx.EXPAND) window.Show() self._mainSizer.Layout() self.Thaw() def GetImageList(self): """ Returns the associated image list. """ return self._pages.GetImageList() def GetPageCount(self): """ Returns the number of pages in the book. """ return len(self._windows) def GetFontBold(self): """ Gets the font bold status. """ return self._fontBold def SetFontBold(self, bold): """ Sets whether the page captions are bold or not. :param `bold`: ``True`` or ``False``. """ self._fontBold = bold def GetFontSizeMultiple(self): """ Gets the font size multiple for the page captions. """ return self._fontSizeMultiple def SetFontSizeMultiple(self, multiple): """ Sets the font size multiple for the page captions. :param `multiple`: The multiple to be applied to the system font to get the our font size. """ self._fontSizeMultiple = multiple def SetPageImage(self, page, imageId): """ Sets the image index for the given page. :param `page`: an integer specifying the page index; :param `image`: an index into the image list. """ self._pages.SetPageImage(page, imageId) self._pages.Refresh() def SetPageText(self, page, text): """ Sets the text for the given page. :param `page`: an integer specifying the page index; :param `text`: the new tab label. """ self._pages.SetPageText(page, text) self._pages.Refresh() def GetPageText(self, page): """ Returns the text for the given page. :param `page`: an integer specifying the page index. """ return self._pages.GetPageText(page) def GetPageImage(self, page): """ Returns the image index for the given page. :param `page`: an integer specifying the page index. """ return self._pages.GetPageImage(page) def GetPage(self, page): """ Returns the window at the given page position. :param `page`: an integer specifying the page to be returned. """ if page >= len(self._windows): return return self._windows[page] def GetCurrentPage(self): """ Returns the currently selected notebook page or ``None``. """ if self.GetSelection() < 0: return return self.GetPage(self.GetSelection()) def AdvanceSelection(self, forward=True): """ Cycles through the tabs. :param `forward`: if ``True``, the selection is advanced in ascending order (to the right), otherwise the selection is advanced in descending order. :note: The call to this function generates the page changing events. """ nSel = self.GetSelection() if nSel < 0: return nMax = self.GetPageCount() - 1 if forward: newSelection = (nSel == nMax and [0] or [nSel + 1])[0] else: newSelection = (nSel == 0 and [nMax] or [nSel - 1])[0] self.SetSelection(newSelection) def ChangeSelection(self, page): """ Changes the selection for the given page, returning the previous selection. :param `page`: an integer specifying the page to be selected. :note: The call to this function does not generate the page changing events. """ if page < 0 or page >= self.GetPageCount(): return oldPage = self.GetSelection() self.DoSetSelection(page) return oldPage CurrentPage = property(GetCurrentPage, doc="See `GetCurrentPage`") Page = property(GetPage, doc="See `GetPage`") PageCount = property(GetPageCount, doc="See `GetPageCount`") PageImage = property(GetPageImage, SetPageImage, doc="See `GetPageImage, SetPageImage`") PageText = property(GetPageText, SetPageText, doc="See `GetPageText, SetPageText`") Selection = property(GetSelection, SetSelection, doc="See `GetSelection, SetSelection`") # ---------------------------------------------------------------------------- # # Class FlatImageBook # ---------------------------------------------------------------------------- # class FlatImageBook(FlatBookBase): """ Default implementation of the image book, it is like a `wx.Notebook`, except that images are used to control the different pages. This container is usually used for configuration dialogs etc. :note: Currently, this control works properly for images of size 32x32 and bigger. """ def __init__(self, parent, id=wx.ID_ANY, pos=wx.DefaultPosition, size=wx.DefaultSize, style=0, agwStyle=0, name="FlatImageBook"): """ Default class constructor. :param `parent`: parent window. Must not be ``None``; :param `id`: window identifier. A value of -1 indicates a default value; :param `pos`: the control position. A value of (-1, -1) indicates a default position, chosen by either the windowing system or wxPython, depending on platform; :param `size`: the control size. A value of (-1, -1) indicates a default size, chosen by either the windowing system or wxPython, depending on platform; :param `style`: the underlying `wx.Panel` window style; :param `agwStyle`: the AGW-specific window style. This can be a combination of the following bits: =========================== =========== ================================================== Window Styles Hex Value Description =========================== =========== ================================================== ``INB_BOTTOM`` 0x1 Place labels below the page area. Available only for L{FlatImageBook}. ``INB_LEFT`` 0x2 Place labels on the left side. Available only for L{FlatImageBook}. ``INB_RIGHT`` 0x4 Place labels on the right side. ``INB_TOP`` 0x8 Place labels above the page area. ``INB_BORDER`` 0x10 Draws a border around L{LabelBook} or L{FlatImageBook}. ``INB_SHOW_ONLY_TEXT`` 0x20 Shows only text labels and no images. Available only for L{LabelBook}. ``INB_SHOW_ONLY_IMAGES`` 0x40 Shows only tab images and no label texts. Available only for L{LabelBook}. ``INB_FIT_BUTTON`` 0x80 Displays a pin button to show/hide the book control. ``INB_DRAW_SHADOW`` 0x100 Draw shadows below the book tabs. Available only for L{LabelBook}. ``INB_USE_PIN_BUTTON`` 0x200 Displays a pin button to show/hide the book control. ``INB_GRADIENT_BACKGROUND`` 0x400 Draws a gradient shading on the tabs background. Available only for L{LabelBook}. ``INB_WEB_HILITE`` 0x800 On mouse hovering, tabs behave like html hyperlinks. Available only for L{LabelBook}. ``INB_NO_RESIZE`` 0x1000 Don't allow resizing of the tab area. ``INB_FIT_LABELTEXT`` 0x2000 Will fit the tab area to the longest text (or text+image if you have images) in all the tabs. =========================== =========== ================================================== :param `name`: the window name. """ FlatBookBase.__init__(self, parent, id, pos, size, style, agwStyle, name) self._pages = self.CreateImageContainer() if agwStyle & INB_LEFT or agwStyle & INB_RIGHT: self._mainSizer = wx.BoxSizer(wx.HORIZONTAL) else: self._mainSizer = wx.BoxSizer(wx.VERTICAL) self.SetSizer(self._mainSizer) # Add the tab container to the sizer self._mainSizer.Add(self._pages, 0, wx.EXPAND) if agwStyle & INB_LEFT or agwStyle & INB_RIGHT: self._pages.SetSizeHints(self._pages.GetImageSize() * 2, -1) else: self._pages.SetSizeHints(-1, self._pages.GetImageSize() * 2) self._mainSizer.Layout() def CreateImageContainer(self): """ Creates the image container class for L{FlatImageBook}. """ return ImageContainer(self, wx.ID_ANY, agwStyle=self.GetAGWWindowStyleFlag()) # ---------------------------------------------------------------------------- # # Class LabelBook # ---------------------------------------------------------------------------- # class LabelBook(FlatBookBase): """ An implementation of a notebook control - except that instead of having tabs to show labels, it labels to the right or left (arranged horizontally). """ def __init__(self, parent, id=wx.ID_ANY, pos=wx.DefaultPosition, size=wx.DefaultSize, style=0, agwStyle=0, name="LabelBook"): """ Default class constructor. :param `parent`: parent window. Must not be ``None``; :param `id`: window identifier. A value of -1 indicates a default value; :param `pos`: the control position. A value of (-1, -1) indicates a default position, chosen by either the windowing system or wxPython, depending on platform; :param `size`: the control size. A value of (-1, -1) indicates a default size, chosen by either the windowing system or wxPython, depending on platform; :param `style`: the underlying `wx.Panel` window style; :param `agwStyle`: the AGW-specific window style. This can be a combination of the following bits: =========================== =========== ================================================== Window Styles Hex Value Description =========================== =========== ================================================== ``INB_BOTTOM`` 0x1 Place labels below the page area. Available only for L{FlatImageBook}. ``INB_LEFT`` 0x2 Place labels on the left side. Available only for L{FlatImageBook}. ``INB_RIGHT`` 0x4 Place labels on the right side. ``INB_TOP`` 0x8 Place labels above the page area. ``INB_BORDER`` 0x10 Draws a border around L{LabelBook} or L{FlatImageBook}. ``INB_SHOW_ONLY_TEXT`` 0x20 Shows only text labels and no images. Available only for L{LabelBook}. ``INB_SHOW_ONLY_IMAGES`` 0x40 Shows only tab images and no label texts. Available only for L{LabelBook}. ``INB_FIT_BUTTON`` 0x80 Displays a pin button to show/hide the book control. ``INB_DRAW_SHADOW`` 0x100 Draw shadows below the book tabs. Available only for L{LabelBook}. ``INB_USE_PIN_BUTTON`` 0x200 Displays a pin button to show/hide the book control. ``INB_GRADIENT_BACKGROUND`` 0x400 Draws a gradient shading on the tabs background. Available only for L{LabelBook}. ``INB_WEB_HILITE`` 0x800 On mouse hovering, tabs behave like html hyperlinks. Available only for L{LabelBook}. ``INB_NO_RESIZE`` 0x1000 Don't allow resizing of the tab area. ``INB_FIT_LABELTEXT`` 0x2000 Will fit the tab area to the longest text (or text+image if you have images) in all the tabs. =========================== =========== ================================================== :param `name`: the window name. """ FlatBookBase.__init__(self, parent, id, pos, size, style, agwStyle, name) self._pages = self.CreateImageContainer() # Label book specific initialization self._mainSizer = wx.BoxSizer(wx.HORIZONTAL) self.SetSizer(self._mainSizer) # Add the tab container to the sizer self._mainSizer.Add(self._pages, 0, wx.EXPAND) self._pages.SetSizeHints(self._pages.GetTabAreaWidth(), -1) # Initialize the colours maps self._pages.InitializeColours() self.Bind(wx.EVT_SIZE, self.OnSize) def CreateImageContainer(self): """ Creates the image container (LabelContainer) class for L{FlatImageBook}. """ return LabelContainer(self, wx.ID_ANY, agwStyle=self.GetAGWWindowStyleFlag()) def SetColour(self, which, colour): """ Sets the colour for the specified parameter. :param `which`: the colour key; :param `colour`: a valid `wx.Colour` instance. :see: L{LabelContainer.SetColour} for a list of valid colour keys. """ self._pages.SetColour(which, colour) def GetColour(self, which): """ Returns the colour for the specified parameter. :param `which`: the colour key. :see: L{LabelContainer.SetColour} for a list of valid colour keys. """ return self._pages.GetColour(which) def OnSize(self, event): """ Handles the ``wx.EVT_SIZE`` event for L{LabelBook}. :param `event`: a `wx.SizeEvent` event to be processed. """ self._pages.Refresh() event.Skip() DisplayCAL-3.1.0.0/DisplayCAL/lib/agw/pygauge.py0000644000076500000000000002624012647526510020772 0ustar devwheel00000000000000# --------------------------------------------------------------------------------- # # PYGAUGE wxPython IMPLEMENTATION # # Mark Reed, @ 28 Jul 2010 # Latest Revision: 02 Aug 2010, 09.00 GMT # # TODO List # # 1. Indeterminate mode (see wx.Gauge) # 2. Vertical bar # 3. Bitmap support (bar, background) # 4. UpdateFunction - Pass a function to PyGauge which will be called every X # milliseconds and the value will be updated to the returned value. # 5. Currently the full gradient is drawn from 0 to value. Perhaps the gradient # should be drawn from 0 to range and clipped at 0 to value. # 6. Add a label? # # For All Kind Of Problems, Requests Of Enhancements And Bug Reports, Please # Write To The: # # wxPython Mailing List!!! # # End Of Comments # --------------------------------------------------------------------------------- # """ PyGauge is a generic `wx.Gauge` implementation. Description =========== PyGauge supports the determinate mode functions as `wx.Gauge` and adds an L{Update} function which takes a value and a time parameter. The `value` is added to the current value over a period of `time` milliseconds. Supported Platforms =================== PyGauge has been tested on the following platforms: * Windows (Windows XP); License And Version =================== PyGauge is distributed under the wxPython license. PyGauge has been kindly contributed to the AGW library by Mark Reed. Latest Revision: Andrea Gavana @ 02 Aug 2010, 09.00 GMT Version 0.1 """ import wx import copy class PyGauge(wx.PyWindow): """ This class provides a visual alternative for `wx.Gauge`. It currently only support determinate mode (see L{PyGauge.SetValue} and L{PyGauge.SetRange}) """ def __init__(self, parent, id=wx.ID_ANY, range=100, pos=wx.DefaultPosition, size=(-1,30), style=0): """ Default class constructor. :param `parent`: parent window. Must not be ``None``; :param `id`: window identifier. A value of -1 indicates a default value; :param `pos`: the control position. A value of (-1, -1) indicates a default position, chosen by either the windowing system or wxPython, depending on platform; :param `size`: the control size. A value of (-1, -1) indicates a default size, chosen by either the windowing system or wxPython, depending on platform; :param `style`: the underlying `wx.PyWindow` window style. """ wx.PyWindow.__init__(self, parent, id, pos, size, style) self._size = size self._border_colour = None self._barColour = self._barColourSorted = [wx.Colour(212,228,255)] self._barGradient = self._barGradientSorted = None self._border_padding = 0 self._range = range self._value = [0] self._valueSorted = [0] self._timerId = wx.NewId() self._timer = None self.Bind(wx.EVT_PAINT, self.OnPaint) self.Bind(wx.EVT_ERASE_BACKGROUND, self.OnEraseBackground) self.Bind(wx.EVT_TIMER, self.OnTimer) def DoGetBestSize(self): """ Overridden base class virtual. Determines the best size of the button based on the label and bezel size. """ return wx.Size(self._size[0], self._size[1]) def GetBorderColour(self): """ Returns the L{PyGauge} border colour. """ return self._border_colour def SetBorderColour(self, colour): """ Sets the L{PyGauge} border colour. :param `colour`: an instance of `wx.Colour`. """ self._border_colour = colour SetBorderColor = SetBorderColour GetBorderColor = GetBorderColour def GetBarColour(self): """ Returns the L{PyGauge} main bar colour. """ return self._barColour[0] def SetBarColour(self, colour): """ Sets the L{PyGauge} main bar colour. :param `colour`: an instance of `wx.Colour`. """ if type(colour) != type([]): self._barColour = [colour] else: self._barColour = list(colour) self.SortForDisplay() SetBarColor = SetBarColour GetBarColor = GetBarColour def GetBarGradient(self): """ Returns a tuple containing the gradient start and end colours. """ if self._barGradient is None: return None return self._barGradient[0] def SetBarGradient(self, gradient): """ Sets the bar gradient. :param `gradient`: a tuple containing the gradient start and end colours. :note: This overrides the bar colour previously set with L{SetBarColour}. """ if type(gradient) != type([]): self._barGradient = [gradient] else: self._barGradient = list(gradient) self.SortForDisplay() def GetBorderPadding(self): """ Gets the border padding. """ return self._border_padding def SetBorderPadding(self, padding): """ Sets the border padding. :param `padding`: pixels between the border and the progress bar. """ self._border_padding = padding def GetRange(self): """ Returns the maximum value of the gauge. """ return self._range def SetRange(self, range): """ Sets the range of the gauge. The gauge length is its value as a proportion of the range. :param `range`: The maximum value of the gauge. """ if range <= 0: raise Exception("ERROR:\n Gauge range must be greater than 0.") self._range = range def GetValue(self): """ Returns the current position of the gauge. """ return self._value[0] def SetValue(self, value): """ Sets the current position of the gauge. :param `value`: an integer specifying the current position of the gauge. """ if type(value) != type([]): self._value = [value] else: self._value = list(value) self.SortForDisplay() for v in self._value: if v < 0 or v > self._range: raise Exception("ERROR:\n Gauge value must be between 0 and its range.") def OnEraseBackground(self, event): """ Handles the ``wx.EVT_ERASE_BACKGROUND`` event for L{PyGauge}. :param `event`: a `wx.EraseEvent` event to be processed. :note: This method is intentionally empty to reduce flicker. """ pass def OnPaint(self, event): """ Handles the ``wx.EVT_PAINT`` event for L{PyGauge}. :param `event`: a `wx.PaintEvent` event to be processed. """ dc = wx.BufferedPaintDC(self) rect = self.GetClientRect() dc.SetBackground(wx.Brush(self.GetBackgroundColour())) dc.Clear() colour = self.GetBackgroundColour() dc.SetBrush(wx.Brush(colour)) dc.SetPen(wx.Pen(colour)) dc.DrawRectangleRect(rect) if self._border_colour: dc.SetPen(wx.Pen(self.GetBorderColour())) dc.DrawRectangleRect(rect) pad = 1 + self.GetBorderPadding() rect.Deflate(pad,pad) if self.GetBarGradient(): for i, gradient in enumerate(self._barGradientSorted): c1,c2 = gradient w = rect.width * (float(self._valueSorted[i]) / self._range) r = copy.copy(rect) r.width = w dc.GradientFillLinear(r, c1, c2, wx.EAST) else: for i, colour in enumerate(self._barColourSorted): dc.SetBrush(wx.Brush(colour)) dc.SetPen(wx.Pen(colour)) w = rect.width * (float(self._valueSorted[i]) / self._range) r = copy.copy(rect) r.width = w dc.DrawRectangleRect(r) def OnTimer(self,event): """ Handles the ``wx.EVT_TIMER`` event for L{PyGauge}. :param `event`: a `wx.TimerEvent` event to be processed. """ if self._timerId == event.GetId(): stop_timer = True for i, v in enumerate(self._value): self._value[i] += self._update_step[i] if self._update_step[i] > 0: if self._value[i] > self._update_value[i]: self._value[i] = self._update_value[i] else: stop_timer = False else: if self._value[i] < self._update_value[i]: self._value[i] = self._update_value[i] else: stop_timer = False if stop_timer: self._timer.Stop() self.SortForDisplay() self.Refresh() def Update(self, value, time=0): """ Update the gauge by adding `value` to it over `time` milliseconds. The `time` parameter **must** be a multiple of 50 milliseconds. :param `value`: The value to be added to the gauge; :param `time`: The length of time in milliseconds that it will take to move the gauge. """ if type(value) != type([]): value = [value] if len(value) != len(self._value): raise Exception("ERROR:\n len(value) != len(self.GetValue())") self._update_value = [] self._update_step = [] for i, v in enumerate(self._value): if value[i]+v <= 0 or value[i]+v > self._range: raise Exception("ERROR:\n Gauge value must be between 0 and its range. ") self._update_value.append(value[i] + v) self._update_step.append(float(value[i])/(time/50)) #print self._update_ if not self._timer: self._timer = wx.Timer(self, self._timerId) self._timer.Start(100) def SortForDisplay(self): """ Internal method which sorts things so we draw the longest bar first. """ if self.GetBarGradient(): tmp = sorted(zip(self._value,self._barGradient)); tmp.reverse() a,b = zip(*tmp) self._valueSorted = list(a) self._barGradientSorted = list(b) else: tmp = sorted(zip(self._value,self._barColour)); tmp.reverse() a,b = zip(*tmp) self._valueSorted = list(a) self._barColourSorted = list(b) DisplayCAL-3.1.0.0/DisplayCAL/lib32/0000755000076500000000000000000012653527012016335 5ustar devwheel00000000000000DisplayCAL-3.1.0.0/DisplayCAL/lib32/__init__.py0000644000076500000000000000000112647526510020442 0ustar devwheel00000000000000#DisplayCAL-3.1.0.0/DisplayCAL/lib32/python26/0000755000076500000000000000000012653527012020026 5ustar devwheel00000000000000DisplayCAL-3.1.0.0/DisplayCAL/lib32/python26/__init__.py0000644000076500000000000000000112647526510022133 0ustar devwheel00000000000000#DisplayCAL-3.1.0.0/DisplayCAL/lib32/python26/RealDisplaySizeMM.pyd0000644000076500000000000002300012647526510024042 0ustar devwheel00000000000000MZ@ !L!This program cannot be run in DOS mode. $!T@T@T@U@]8V@]8U@]8V@JV@sS@T@e@]8[@]8U@]8U@RichT@PELpV!  C `&^!x@P!@ .textZ `.rdata @@.datal0@.rsrc@ @@.relocP"@BHT$LD$XVW8L$QR3D$H u _^Hj D$4h0P  tU- ujjՋu>]_3^H397t F<u QW tDjhՃtT$4Rl  8tT$0 D$`Q PQ H+JH +HJL$d@]9_^H̡2u5h0h$02D PH 2u2á2Vt$t'W= tP׃FtP׃V׃_^Ul$tPS W39}t9VI8tPӃAtPӃRGt>u^UӃ_[]3QL$ $Ph0Q  uYjh0 Yhjjh1h1 ́tS3ۉ\$92ufh0h$02D PH 2;uD$P23[t92uD$P3[tÍL$QhSS uT$R3[tËD$UVW;= - <3VD$L$QVP2=2twL$QVh,0Ճ@P׃T$8RVh@0Ճ@P׋$PVhX0Ճ@P׃$QVhl0Ճ@P׃$<RVh0Ճ@P׃uD$$ B@uT$jL$QFVQ2@uT$ 2HD$0u2Q‹HPQH RPQRP$h0Q $Rl L$4 BD$4 $yt_^][tP3_^][tQVt$u^YU39.tD$;tE<uV]3^YSh ؃uV[]3^YËW'5l Pփu$K5 QS֋T$RE _[]3^YË|$HQփCuS W_[]3^YW_[]^ỸSUVP33؃u ^][W;jjjW u/5 tWփCtPփSփ_^]3[Ë- jVjVD$V 5 tWփCtPփS֋D$_^][QL$ $Ph0Q  uYË$RPh0  YËVh\ V YYd5`5u3@^Ã&BhT!$fY3^ËUQQ39E u9 2~< 2}  h  SVW T5d y58 E P\53;th< jWSօuE X5j^t jEUnhandledExceptionFilterSetUnhandledExceptionFilterIsDebuggerPresentKERNEL32.dll_strduppV&&&&P&RealDisplaySizeMM.pydinitRealDisplaySizeMM\\.\DISPLAYVEnumDisplayDevicesAUSER32Mon %d, name '%s' Mon %d, string '%s' Mon %d, flags 0x%x Mon %d, id '%s' Mon %d, key '%s' (Primary Display)%s, at %d, %d, width %d, height %d%si(i,i)iiRealDisplaySizeMMRealDisplaySizeMM(int displayNum) Return the size (in mm) of a given display.GetXRandROutputXIDGetXRandROutputXID(int displayNum) Return the XRandR output X11 ID of a given display.00H1 `1RealDisplaySizeMMN@D0 HX@ PADPADDINGXXPADDINGPADDINGXXPADDINGPADD!0=0D0R00011:1?1E1O1V1[1d1j1~11*212A2G2Z2_2e222222222222)3/3V3d3r333334/4E4L4q4x445B5W5555+6B6H6666666666677)747J7S7k777777777778 8*8/8@8X8p8v888888899 99909M9Z9r999::g:u:::::::::2;7;X;];<>">(>.>4>:>J>Z>`>f>l>r>x>>>>>>>>>>>>>>>>>> ?? ?%?+?1?G?N?V? 000<1@11111110111111DisplayCAL-3.1.0.0/DisplayCAL/lib32/python26/RealDisplaySizeMM.so0000755000076500000000000011166512650252610023700 0ustar devwheel00000000000000ELF44 ($!$&$&.>>,.>>QtdRtd.>>$$c6%, (3")!$1#2&0 *' -/4. +5 )@9`$)*+,./012345CE爢wx;wqX|ۧI%|j6cۏ)^j] + 7IA*GY:"(@? $ t 1 w   &@% lH 2A@pM R@__gmon_start___init_fini__cxa_finalize_Jv_RegisterClassesnull_error_handlerg_error_handler_triggeredinitRealDisplaySizeMMPy_InitModule4free_disppathsfreefree_a_disppathget_displaysgetenvstrncpystrrchrstrchrXOpenDisplayXSetErrorHandlerXineramaQueryExtensioncallocXCloseDisplay__strcat_chkXRRQueryExtensionXRRQueryVersionXineramaIsActiveXineramaQueryScreensXF86VidModeGetMonitor__sprintf_chk__strdupXF86VidModeQueryExtensionstrcpyXFreeXRRGetOutputInfoXRRGetCrtcGammaXRRFreeGammaXRRGetCrtcInforeallocXRRFreeCrtcInfoXRRFreeOutputInfodlopendlsymXRRGetScreenResourcesXRRFreeScreenResourcesget_a_displaymallocPyArg_ParseTuplePy_BuildValuecallback_ddebuglibX11.so.6libXinerama.so.1libXrandr.so.2libXxf86vm.so.1libpthread.so.0libc.so.6__stack_chk_fail_edata__bss_start_endGLIBC_2.1.3GLIBC_2.4GLIBC_2.3.4GLIBC_2.0si 7ii Cti Mii Y?@@@@@@@???5?&@@@ @@@@@ @ $@ (@ ,@ 0@4@8@<@@@D@H@L@P@T@X@\@`@d@h@l@p@t@x@ |@!@"@#@$@%@&@'@(US[2tn X[ hhhhh h($h0(h8p,h@`0hHP4hP@8hX0<h` @hhDhpHhxLhPhThXh\h`hdhhhplh`phPth@xh0|h hhhhhhhh h(h0UVS*0u]t$)p9s A9rƃ[^]US.ë/tt $҃[]Ë$Ðo/U勁1]fUSK/D$D$ D$D$$N[]Ð&UWVS Ev.tTUt@։׃t&t$bPt $Q$EűE$1 [^_]É'Uuu]p.t%t$Ft$4$]u]ÍvUWVS).|eE1DžXDžT$U$D$cD$ED$: $t*D$.$ixw@0@ $Dž!$+{ $(TD$XD$$\Dž\$D$ \1\9D$$,[uΉ$V $DžMe3 |[^_]Í&D$D$d$plvUE:0.0EP&TD$XD$$uZLD$PD$ $$P5$k<\D$ ${t\Dž*4$Džt&D$dD$4$84v 4D8Dž`t&(Dž,D$@ $D$t,t 8Vt$D$ (D$dD$4$<BD$ BD$B D$Bt$D$D$D$t$ `4$4$ 2 B9 9\DžHDžDD$:$et@D$.$t,D$D$L$t$ $17$qt@pp BAB ABABD$HD$$T$L$ *t&ppp @@ AD AADAW(D$4$ $t&t$$ $*,Lv $t\`DžDžDžL DD$$щ4$DžI.AusF9BT$D$$>fxuB떉D$$tuB$D$F\IDž8BL$D$$EBD$ $z DD$$,_PPP ABAB A BABAB$A0B(Bt$(L$ D$dD$D$4$`BD$ BD$B D$B $D$t$T$ D$D$ t&9 D@$;A$u͋|$D$dD$ D$4$D$t$$ t6 $ AD$:4$t@D$.$t,D$D$T$L$ $e0$ $g$}5D$ $2t$t$ LD4$D$ $9\$w&$B $d4$Dž_D$$s$ $4$4$$$ $Dž4$ $h4$J$l$Džg4$!$$%84$$TDž $4$$Džt&'UWV1Sz Et>E8t(ut81&9Ut(DžuE1$ [^_]Ë}v$,thBFBFB F BFBFBFBFB F B$F$B(F($t)@$Ft-E$ [^_]ËF$4$<4$1E$/ U(]E6óD$E }u$B|$1҅u]Ћu}]Ðt&E1$ct p($t$<$Ht&U8]E3D$u}BD$E $1҅u]Ћu}]Ðt&E1$EEU܋$tD$:$tBD$.$ft,M܋AD$D$$D$4D$ 4$tV4$U܋BHMp<$E܉$UDt$$T$4$1E܉$kEfM܉ $UE묋 $ÐUS>ûUVSÚt&Ћu[^]US[` Y[RealDisplaySizeMMDISPLAY.0ARGYLL_IGNORE_XRANDR1_2libXrandr.soXRRGetScreenResourcesCurrentScreen %d, Output %s[ Clone of %d ].%dScreen %di(i,i)GetXRandROutputXID%s at %d, %d, width %d, height %dRealDisplaySizeMM(int displayNum) Return the size (in mm) of a given display.GetXRandROutputXID(int displayNum) Return the XRandR output X11 ID of a given display.  $o@X c ?8 x `o( oo o>V f v &6FVfv&6FVfv@$"x%>%0"%GCC: (Ubuntu 4.3.3-5ubuntu4) 4.3.3GCC: (Ubuntu 4.3.3-5ubuntu4) 4.3.3GCC: (Ubuntu 4.3.3-5ubuntu4) 4.3.3GCC: (Ubuntu 4.3.3-5ubuntu4) 4.3.3GCC: (Ubuntu 4.3.3-5ubuntu4) 4.3.3GCC: (Ubuntu 4.3.3-5ubuntu4) 4.3.3$ "$x$%< $x%.null_error_handlerginitRealDisplaySizeMM}free_disppathsfree_a_disppathget_displays"get_a_display$callback_ddebug%g_error_handler_triggeredt/build/buildd/glibc-2.9/build-tree/i386-libc/csu/crti.S/build/buildd/glibc-2.9/csuGNU AS 2.19.1%$$P 0| w 6 intZr, 8aI_4oM Z ;17- Z# #  # # # )# +# G# # h#$ #(  #, "#0 $#4 &Z#8 *Z#< ,z#@ 0>#D 1L#F :2#G 6#H ?#L } H#T I#X DJ#\ K#` *L%#d NZ#h >P#l _A  (# # Z#    'O no q W \  jG x k#  kD# kD x C#  CD# C# W D#  E# E# I # $ J #  K<#  Lo#$  M#( N#, < R#0  S#4 T#8 " X#< @ Y#@  Z#D  [c#H Y \#L w _#P b#T d#X  h #\  k#` ~ o#d k r#h V v #l  w#p z#t  {#x  |`#| $ }D# ~v# ~ %# W 1# 7 #  =# W u# m I# f  # # v#  v#  v#  v#  v#   # 0#G l `fvvvJK vvvw vvvv Zv vV  Z555v FLvav lrvvG ZvvB Zvv Zvvv )/Iv )c _ezvz v, R buf #obj v#len # # Z#  Z# # e z# j z#  z#$  #(_  h n Z v ZR    v h ջ  Z vvv  Z v   Z' v  c  |#  |#  |#  |#  |# j |# { # h U#  U#  U#$ , #( U#, t |#0  |#4 |#8  |#< l |#@ 8 #D U#H U#L U#P ' U#T  U#X  |#\  |#` # |#d  |#h  |#l r #p |#t  |#x h |#| |# F |# 6 |#  |# , |#  |# U# ' (  #  |#  ;#  ;#  a#  #  #   # @ |#  ;#$ o  R s # !|# z "# #  % F &# D 'I# ` (T# H )#  *] #  + #6 ,^ D /   Q 0   v^ 1Z6v6Z  2HNvcv 3 4{Zvv 5) 6 q 7` 8v% 9v vvZ^ :` ;` < = >7 ?U[vuDvv5 @vDc  R    z ^ &# @ 'f#  (Z# *#   |` a #get |#set #doc # # ;  , vv ZvvXID GE QE RE ed m l T Z# )T# ! j# L# ZjTZ GC  9# 2#  Z#  E# 1 E# n  E# j Z#  Z#p \ Z# Z# \# %P! 9"# N ## _$# %Z# W%Z# &Z# .&Z# W 'Z# X (# )Z#$ *\#(  +{#, z,#0 -E#4 .E#8 S/Z#< /Z#@ 0Z#D `1Z#H 2#Lb\ 3n8 99# :Z# Y ;Z# O <Z# = 9# #fdZ# Z# Z# " Z# # # # #$ ~Z#( l#,  Z#0 G!Z#4 "Z#8 #Z#< . $Z#@  %#D &Z#H 'Z#L (#P Q(#T )Z#X *E#\ +E#` [,#d e-#h o.#l y/#p )00#tdb1#x 2#| 5# 6Z# 7Z# 8# 9E# :E# ;Z# <Z# 6=# ># ?Z# @#  Z Z# N # # E# 7# 7# 7#hi#lo# p C # # \# t7# uC# e7# fC#k " #Z#  $S# d%S# &S# W'S# D(T >"> #>b'( )E8id# 0# W0# E# F0# V0# Y0# Q0# -0# -0#$ }0#( a #, 0#0 E#4 S # # Z# S# Z# Y# Z# _#O8U # # a #  Z# E# TE# '# {# Z# S# Z#$ Y#( Z#, Z#0 U#4Pp0D% E#xFZ#yFZ# G0# WG0# H# HI# JZ# KY# tL#$ 7MZ#( 8NY#,Oge{ fZ#redg{# 0 h{# i{# >j1,@, a A# \B#sxCZ#syCZ# swDZ#shDZ# MZ# RNZ# i OZ# S#$ T#(Wz_ #{Z# {Z#G |7y ww_w%  c !Z__s B Z(ixZ xidZ!T (,"k Zg#T $evݝ%,&>gX'@>( _ i@Z(&3p'3() Z"*@>+iZm+jZ  kZ,Z,Z,&-Z".evbZu|.erbZu|,ZO, Z,,?Z+xaij"Y-Z"~-p"|/ m pp0A 112k )3@11/@!-I|+evbZ+erbZ pp0 114 114!11511/8!,? !(/5"," jjZ60, ,"X,1-"/x" pp]4!114!114!114("115P11(x, >"- A-& $A j" c " e[%7H Q( !""8ixQZ%,R]+rvR(+iSZ9v0""y#:v'+ v(+ixZH+xidZh3""16h;<7 ~_#ix~Z! _!T ( pp!.!!Z=119v"$$$:v'+ v+ixZ! _5y#1#6;#<#;#<#0<#d;#3`##11"$$ q$ - $@>>?aZ@? Z@Lj/tmp/ccxq91nO.s/build/buildd/glibc-2.9/csuGNU AS 2.19.1U%% : ; I$ > $ > $ >   I : ;  : ;I8 : ; : ; I8 I !I/ &I' II : ; I8 '  : ; : ;I : ; : ;< : ; I : ;I8 .? : ; ' I : ; I: ; I.: ;' I : ;I 4: ;I!4: ;I".? : ; ' I@#: ; I $: ; I %.? : ;' @&.? : ;' @': ;I( ).? : ; I@*4: ; I+4: ;I,4: ;I-4: ;I .4: ;I / U01X Y1121X Y31X Y41UX Y51UX Y6 U7.? : ;' I@8: ;I9.: ;' I@:: ;I ;41<41= >4: ; I? < ?4: ; I?  U%o /build/buildd/glibc-2.9/build-tree/i386-libc/csu../sysdeps/genericcrti.Sinitfini.c !/!=Z!gg//$!/!=Z! DisplayCAL/usr/include/bits/usr/lib/gcc/i486-linux-gnu/4.3.3/include/usr/include/usr/include/sys/usr/include/python2.6/usr/include/X11/usr/include/X11/extensionsRealDisplaySizeMM.cstring3.hstdio2.hstddef.htypes.hstdio.hlibio.htypes.hpyport.hobject.hmethodobject.hdescrobject.hX.hXlib.hxf86vmode.hXinerama.hrandr.hXrandr.h׼f!0~֑;MMgy fKgu{f <}XeK=wKQ&"^ *!\-d0?z(( [v,hz(zf[fzffz.zfJz,2z.HIf&b:=z<,בYב z*YY #"fmXeYK1E.(}.+ing|fg|f1{f{ tX2?ge=gt3 -? 9Y==h{f{-{ff{.H|-<{f{f- {<, ~.w9~֑-//~."/>N.F.~&\*辔H>T-YJ dm%B'Bs=-Y֔8pjy\<>,L=k<8Fj<>,>fj=xX,-/4u>R=-YrXP& /tmpccxq91nO.s< !!!$-!!!| LB HAB AwAB FpMAB FF%AB C 1AB BC0"|AB F["tAB FX_XGCtp_clear_objectGetXRandROutputXIDmax_request_size_shortbuf__pad3binaryfunccoercion_IO_lock_tstridesnb_inplace_powerprivate1_IO_buf_endPyGetSetDefsetattrofunclast_request_readnoutputselftp_deallocnb_inplace_xormonitorreadonlytp_as_mappingnb_inplace_subtractSubpixelOrder_IO_write_endext_datassizessizeobjargproctp_namerooty_orgbits_per_rgbtp_as_bufferbitmap_bit_order_XRRModeInfotp_initRRCrtc_old_offset_markerstp_traverselenfuncWindowresourceidnb_subtractndimtp_weaklistxrr_founddisplay_namegetattrfuncnb_nonzero_IO_FILEml_methrotationdestructorEMPTYRROutputtp_weaklistoffsetvTotalgetbufferprocVisualnmodesq_itemtp_getattr_postp_cachemyscreenmap_entriesnb_inplace_addsq_ass_slicedescrsetfuncroot_depthstrcat_IO_save_enddnbufwidth_mmnb_inplace_floor_dividebf_getwritebufferhSyncEnd__lennvsyncnb_orlong long unsigned intnb_inplace_remainderconfigTimestampblack_pixelnb_multiplystrncpyscrnresinitprocbf_releasebufferhashfuncDisplayCAL/RealDisplaySizeMM.ctp_iternexttp_printvSyncEndPyBufferProcsXineramaScreenInfotp_allocsave_undersresource_allocsubpixel_order_IO_backup_basecharbufferprocnb_positivednameinquiryreleasebufferprocnclonemotion_bufferscreen_number_filenoreadbufferprocmin_keycode__pad4tp_hash__pad5crtcinpossible_IO_markerprivate_datatp_setattroshapeXF86VidModeMonitortp_richcompareqlen_XDisplay_IO_read_basetp_getattrodefsixbf_getbufferssizessizeargfuncserialdcountstdinmax_keycodegettertp_mroroot_visualnscreenstp_subclassesvSyncStartnb_coerce__fmtbf_getcharbufferhTotalbf_getsegcountPy_ssize_tcmapnpreferredXErrorEventget_xrandr_output_xidtp_getsetmodesfree_a_disppath_XRRCrtcInfo_XRRCrtcGammatp_compare_modesq_slicevendorinternalGNU C 4.3.3mydisplaynb_octmheightprivate17sq_inplace_concatuscreenlong long intnb_negativenhsyncnb_powerbufferinfonb_inplace_rshiftdotClockwritebufferproc_typeobjectnb_inplace_divideheight_mmtp_as_sequenceRotationsq_concatsetattrfuncoutputs_IO_write_baseconnectionvisualidPyCFunctionbitmap_unitmax_mapsdescription_IO_save_basevisitprocmwidthbacking_storetp_memberscallback_ddebugnb_remainderPyObjectdesc1desc2nb_rshiftPyMappingMethodsnb_dividedescrgetfuncpixmap_format_XrmHashBucketRectp_base__quad_tallocfunctdisppnb_inplace_ordispbits_per_pixelobjobjprocmp_length__pad1__pad2tp_docred_masktp_methodsnb_andtp_itemsizeobjobjargprocsetterproto_major_version_vtable_offsetrequestbyte_ordernb_true_divideminvx_orgtp_basicsizeargsgreennb_floor_dividebf_getreadbufferlong doublesprintfnull_error_handlertp_descr_gettimestampmp_subscriptConnectioniternextfuncRRModenb_longtp_flagsncrtcob_sizesq_lengthg_error_handler_triggered_IO_read_endDepthdefault_gcproto_minor_versionshort inttp_callget_a_displaytp_iterml_nametp_freeblue_maskob_refcnttp_version_tagRealDisplaySizeMM_methodscrtcgamtp_basestp_dict_XExtDataml_docclosurebluePyMethodDefminor_codetp_reproutinameLensq_containssq_ass_item_XRRGetScreenResourcesCurrentfreefunc__ssize_tndepthsPy_bufferrscreenreprfuncmp_ass_subscript_XPrivateprivate2private3private4private5nb_floatprivate8private9nb_intnb_invert_lockVisualIDrequest_codenb_xornb_hexPySequenceMethodsfree_privatenformatsget_real_screen_size_mmscanline_padScreensegcountprocXF86VidModeSyncRangemm_widthwhite_pixelPyMemberDef__destXPointerPyNumberMethodsunsigned charnb_inplace_lshifttp_is_gcnb_index_sbufmin_mapsnvisualscrtcs__srctraverseproc_IO_write_ptrtp_dictoffsetmodeFlags_XRROutputInfoprintfuncnb_inplace_andternaryfuncXRRModeFlagstp_strget_displaysml_flagsbitmap_padclonesnameLengthxdefaultserror_code_XRRScreenResourcesstdoutScreenFormatsuboffsetsgetattrofuncclassrichcmpfuncgreen_masktp_as_number__off_thSkewtp_descr_setColormaptp_newnb_lshiftprivate6nb_absoluteshort unsigned intreleasedefault_screensq_inplace_repeatroot_input_maskob_typemajvTimenb_addtp_del_IO_read_ptrnb_inplace_true_dividenb_inplace_multiplynewfuncndispshSyncStartprivate10private11private12private13private14private15private16_chainprivate18private19tp_setattrmodelsq_repeatfree_disppaths_flags2initRealDisplaySizeMM/home/fhoech/displaycal_cur_columnunaryfunc_nextbname__off64_t_unused2_IO_buf_basemm_heightgetiterfuncnb_divmodrotations t tu !t!#t#hupqtqstsupuWutt=u9V9=u@AtACtCeu Yu{u{eu{9u{2V2Yu|'u{Vu|(PKu|V-u{-Ku|+u{9Yu{'u{Ku{ u{ P u{ P Q u{Q V PV +u{9GPYu{ou{Ku{uPwu{9Yu|'u|Ku|P<u|PPP9Yu|u|u|eu|9Yu|u|'u|Ku|Reu|Yu{u{eu{9Yu{'u{Ku{ u{ ? u|? +u{Yu{]u{Ku{wu{Yu|wu|Ku|Yu|wu|Ku|Q(QQ9Yu{'u{Ku{+u{9Yu|'u|Ku|+u|9Yu|'u|Ku|+u|  P * PV e PpqtqstsupuuupWupmWmoupoWwVVPoVRRtt,u,u up,upV,VP(P01t13t3u0llu l{upupl{u\u\PP]VpuVVlwWP 2 $$`8-KK(Bw s3Pv +wDw x ` l J V w ` l J V   1 J P ? k ` f P V f l ^ a  PppP < @ $$.symtab.strtab.shstrtab.gnu.hash.dynsym.dynstr.gnu.version.gnu.version_r.rel.dyn.rel.plt.init.text.fini.rodata.eh_frame.ctors.dtors.jcr.dynamic.got.got.plt.data.bss.comment.debug_aranges.debug_pubnames.debug_info.debug_abbrev.debug_line.debug_frame.debug_str.debug_loc.debug_rangeslo@@% `-XXc5o lBo( ( PQ x x `Z  8 c  0^@ @ io$$u2$$|} & &>.>.>.>.?/?/@0P @001p822%X|V\ Tb0\c~"t-`}x;T #= tA@X ( x    @   $ $ &>>>>??@@  >%>3>@ V@e@s@ > &>P$ @0AA0"| 1"t C?Y@f>s$$ 0$ w >pM $ 7 F Zm@$ @H %5EX^k 1 @+=% Jfw uA@");  initfini.ccrtstuff.c__CTOR_LIST____DTOR_LIST____JCR_LIST____do_global_dtors_auxcompleted.6635dtor_idx.6637frame_dummy__CTOR_END____FRAME_END____JCR_END____do_global_ctors_auxRealDisplaySizeMM.cRealDisplaySizeMM_methodsxrr_found.14971_XRRGetScreenResourcesCurrent.14974GetXRandROutputXIDRealDisplaySizeMM_GLOBAL_OFFSET_TABLE___dso_handle__DTOR_END____i686.get_pc_thunk.cx__stack_chk_fail_local__i686.get_pc_thunk.bx_DYNAMICXineramaQueryScreensXFreeXRRFreeScreenResourcesfree_a_disppathXRRFreeCrtcInfoXRRGetOutputInfonull_error_handler__gmon_start___Jv_RegisterClassesrealloc@@GLIBC_2.0g_error_handler_triggeredstrchr@@GLIBC_2.0getenv@@GLIBC_2.0_finicallback_ddebugcalloc@@GLIBC_2.0strncpy@@GLIBC_2.0XineramaQueryExtensioninitRealDisplaySizeMMXRRQueryExtensionXRRGetCrtcGammaXRRQueryVersionstrrchr@@GLIBC_2.0dlsymXOpenDisplay__strcat_chk@@GLIBC_2.3.4PyArg_ParseTuplefree@@GLIBC_2.0XCloseDisplayXF86VidModeQueryExtensionget_a_displayXRRGetScreenResourcesstrcpy@@GLIBC_2.0XRRFreeGammaPy_BuildValue__bss_startmalloc@@GLIBC_2.0get_displays__stack_chk_fail@@GLIBC_2.4free_disppathsXineramaIsActivePy_InitModule4_endXRRGetCrtcInfo__sprintf_chk@@GLIBC_2.3.4XSetErrorHandlerXF86VidModeGetMonitor_edatadlopen__cxa_finalize@@GLIBC_2.1.3__strdup@@GLIBC_2.0XRRFreeOutputInfo_initDisplayCAL-3.1.0.0/DisplayCAL/lib32/python27/0000755000076500000000000000000012653527012020027 5ustar devwheel00000000000000DisplayCAL-3.1.0.0/DisplayCAL/lib32/python27/__init__.py0000644000076500000000000000000112647526510022134 0ustar devwheel00000000000000#DisplayCAL-3.1.0.0/DisplayCAL/lib32/python27/RealDisplaySizeMM.pyd0000644000076500000000000002200012647526510024042 0ustar devwheel00000000000000MZ@ !L!This program cannot be run in DOS mode. $ qHHH׉IAIAJALo^dOHyAGAIAIRichHPELzpV!  C P&^!x@!@ .textZ `.rdata @@.datal0@.reloc@ @BHT$LD$XVW8L$QR3D$H u _^Hj D$4h0P  tU- ujjՋu>]_3^H397t F<u QW tDjhՃtT$4Rl  8tT$0 D$`Q PQ H+JH +HJL$d@]9_^H̡2u5h0h$02D PH 2u2á2Vt$t'W= tP׃FtP׃V׃_^Ul$tPS W39}t9VI8tPӃAtPӃRGt>u^UӃ_[]3QL$ $Ph0Q  uYjh0 Yhjjh1h1 ́tS3ۉ\$92ufh0h$02D PH 2;uD$P23[t92uD$P3[tÍL$QhSS uT$R3[tËD$UVW;= - <3VD$L$QVP2=2twL$QVh,0Ճ@P׃T$8RVh@0Ճ@P׋$PVhX0Ճ@P׃$QVhl0Ճ@P׃$<RVh0Ճ@P׃uD$$ B@uT$jL$QFVQ2@uT$ 2HD$0u2Q‹HPQH RPQRP$h0Q $Rl L$4 BD$4 $yt_^][tP3_^][tQVt$u^YU39.tD$;tE<uV]3^YSh ؃uV[]3^YËW'5l Pփu$K5 QS֋T$RE _[]3^YË|$HQփCuS W_[]3^YW_[]^ỸSUVP33؃u ^][W;jjjW u/5 tWփCtPփSփ_^]3[Ë- jVjVD$V 5 tWփCtPփS֋D$_^][QL$ $Ph0Q  uYË$RPh0  YËVh\ V YYd5`5u3@^Ã&BhT!$fY3^ËUQQ39E u9 2~< 2}  h  SVW T5d y58 E P\53;th< jWSօuE X5j^t jEUnhandledExceptionFilterSetUnhandledExceptionFilterIsDebuggerPresentKERNEL32.dll_strdupzpV&&&&P&RealDisplaySizeMM.pydinitRealDisplaySizeMM\\.\DISPLAYVEnumDisplayDevicesAUSER32Mon %d, name '%s' Mon %d, string '%s' Mon %d, flags 0x%x Mon %d, id '%s' Mon %d, key '%s' (Primary Display)%s, at %d, %d, width %d, height %d%si(i,i)iiRealDisplaySizeMMRealDisplaySizeMM(int displayNum) Return the size (in mm) of a given display.GetXRandROutputXIDGetXRandROutputXID(int displayNum) Return the XRandR output X11 ID of a given display.00H1 `1RealDisplaySizeMMN@D!0=0D0R00011:1?1E1O1V1[1d1j1~11*212A2G2Z2_2e222222222222)3/3V3d3r333334/4E4L4q4x445B5W5555+6B6H6666666666677)747J7S7k777777777778 8*8/8@8X8p8v888888899 99909M9Z9r999::g:u:::::::::2;7;X;];<>">(>.>4>:>J>Z>`>f>l>r>x>>>>>>>>>>>>>>>>>> ?? ?%?+?1?G?N?V? 000<1@11111110111111DisplayCAL-3.1.0.0/DisplayCAL/lib32/python27/RealDisplaySizeMM.so0000755000076500000000000011177512650252610023703 0ustar devwheel00000000000000ELF44 ($!%%.>>4L.>>QtdRtd.>>$$%6#%(!$-1,/"' &+ *.20) 45 3 )@9`$)-0|ۧ;w|CEwxqXb戢ˎ)^j6I%j] + 7IA*GY:"( y 2(AAt) &A  M ? RAx# AlH __gmon_start___init_fini__cxa_finalize_Jv_RegisterClassesnull_error_handlerg_error_handler_triggeredinitRealDisplaySizeMMPy_InitModule4free_disppathsfreefree_a_disppathget_displaysgetenvstrncpystrrchrstrchrXOpenDisplayXSetErrorHandlerXineramaQueryExtensioncallocXCloseDisplay__strcat_chkXRRQueryExtensionXRRQueryVersionXineramaIsActiveXineramaQueryScreensXF86VidModeGetMonitor__sprintf_chk__strdupXF86VidModeQueryExtensionstrcpyXFreeXRRGetOutputInfoXRRGetCrtcGammaXRRFreeGammaXRRGetCrtcInforeallocXRRFreeCrtcInfoXRRFreeOutputInfodlopendlsymXRRGetScreenResourcesXRRFreeScreenResourcesget_a_displaymallocPyArg_ParseTuplePy_BuildValuecallback_ddebuglibX11.so.6libXinerama.so.1libXrandr.so.2libXxf86vm.so.1libpthread.so.0libc.so.6__stack_chk_fail_edata__bss_start_endGLIBC_2.1.3GLIBC_2.4GLIBC_2.3.4GLIBC_2.0si 7ii Cti Mii Y@@@@@@@?1???2?&@@@ @0@@@@ @ $@ (@ ,@ 0@ 4@8@<@@@D@H@L@P@T@X@\@`@-d@h@l@p@t@x@)|@@*@@ @!@"@#@$@%@&@'@(US[4t~I4X[ hhhhh h($h0(h8p,h@`0hHP4hP@8hX0<h` @hhDhpHhxLhPhThXh\h`hdhhhplh`phPth@xh0|h hhhhhhhh h(h0h8ph@`hHPhP@UVS1u]t$ )p9s A  9rƃ[^]US.Û0tt $҃[]Ë$Ð_0U勁1]fUS;0D$D$ D$D$$N[]Ð&UWVS Ev/tVEtBƉǃt&Ћt $0Pt $$uʋE$ [^_]Í&Uuu]`/t%t$Ft$4$]u]ÍvUWVS/|eE1DžXDžT$U$D$cD$ED$: $t*D$.$9xw@0@ $Dž!${ $(TD$XD$$\Dž\$D$v \1\9D$$,+uΉ$v $DžMe3 |[^_]Í&D$D$d$@lvUE:0.0EP&TD$XD$$uZLD$PD$ $$P5$k<\D$ $;t\Dž*4$kDžt&D$dD$4$4v $D(DžPt&(Dž,D$@ $D$t,t 8Vt$D$ (D$dD$4$<BD$ BD$B D$Bt$D$D$D$t$ `4$4$ 2 B9 9\DžHDžDD$:$5t@D$.$t,D$D$L$t$ $17$qt@pp BAB ABABD$HD$$T$L$ *t&ppp @@ AD AADAW(D$4$f $t&t$$ $J,Lv $t\PDžDžDžL0,DD$$щ$DžI(@umF9BT$D$$fxuB뜉D$$rtuB$0$r\IDž>BL$D$$Q>D$ $V DD$$,A!PPP ABAB A BABAB$A0B(Bt$(L$ D$dD$D$4$`BD$ BD$B D$B $D$t$T$ D$D$ 9 D@$;A$u͋|$D$dD$ D$4$)D$t$$ t6 $0 AD$:4$yt@D$.$t,D$D$T$L$ $u0$ $G$9D$ $B0t$t$,L D4$D$ $|9\$&$ $D4$DžoD$$S$ $4$4$$t$ $8Dž4${ $H4$$L$Džw4$$$H4$$Dž$ 4$$JDžt&'UWV1S Et68t&ut31 f9Ut(DžuE$1 [^_]Ë}v$,thBFBFB F BFBFBFBFB F B$F$B(F($t)@$Ft-E$C [^_]ËF$~4$v<4$1gE$ /&U(]EVD$E }u$2|$ 1҅u]Ћu}]Ðt&E1$#t p($t$<$Ht&U8]ECD$u}2D$E $1҅u]Ћu}]Ðt&E1$EE$D$:$tBD$.$Yt,M܋AD$D$$D$$D$ 4$tY4$U܋BHMp<$E܉$U4t$$T$ v4$1E܉$[EfM܉ $EE멋 $ÐUS^UVS=êt&Ћu[^]US[p@Y[RealDisplaySizeMMDISPLAY.0ARGYLL_IGNORE_XRANDR1_2libXrandr.soXRRGetScreenResourcesCurrentScreen %d, Output %s[ Clone of %d ].%dScreen %di(i,i)GetXRandROutputXID%s at %d, %d, width %d, height %dRealDisplaySizeMM(int displayNum) Return the size (in mm) of a given display.GetXRandROutputXID(int displayNum) Return the XRandR output X11 ID of a given display. x#oH c ?X ( `o ool o>& 6 F V f v   & 6 F V f v &6FVfv@#!h$.$ !$GCC: (Ubuntu 4.3.3-5ubuntu4) 4.3.3GCC: (Ubuntu 4.3.3-5ubuntu4) 4.3.3GCC: (Ubuntu 4.3.3-5ubuntu4) 4.3.3GCC: (Ubuntu 4.3.3-5ubuntu4) 4.3.3GCC: (Ubuntu 4.3.3-5ubuntu4) 4.3.3GCC: (Ubuntu 4.3.3-5ubuntu4) 4.3.3$ "x#x$% #x;%Nnull_error_handlerinitRealDisplaySizeMMfree_disppathsfree_a_disppath get_displays"get_a_display%callback_ddebug(%g_error_handler_triggeredt/build/buildd/glibc-2.9/build-tree/i386-libc/csu/crti.S/build/buildd/glibc-2.9/csuGNU AS 2.19.17%#[ 0  A inte}7 8aTj?oX Z F1B- Z# #  # # ## 4# +# R# # s#$ #(  #, "#0 $#4 &Z#8 *Z#< ,z#@ 0>#D 1L#F :2#G 6#H ?#L H#T I#X DJ#\ &K#` 5L%#d NZ#h IP#l _L  3# # Z#    'Z nz  b g  jG k#  kD# kD E#  ED# E# W F# ) G# G# K # / L*#  M\#  N#$  O#(  P#, G T#0  U#4 V#8 - Z#< K [#@  \#D  ]#H d ^#L w a#P d#T f#X  j #\  m#`  q#d v t#h a x-#l # y9#p |#t  }&#x  ~#| / D# v# E# b Q# B #  ]# b # x i# q  # # v#  v#  v# * v#  v#   # 0#G l) `fvvvJK vvv vvvv Zv vV  Z555v FLvav lrvvG ZvvB Zvv Zvvv  )/Iv )n _ezvz v4 ` buf #obj v#len # # Z#  Z#  # p z# j z#  z#$  ` #(  #0 p j   Z v Zp    v s  Z vv  Z v' % + ZE v  ۃ  |#  |#  |#  |#  |# u |#  # s U#  U#  U#$ 7 #( U#,  |#0  |#4 |#8 |#< w |#@ C #D U#H U#L U#P 2 U#T  U#X  |#\  |#` . |#d  |#h  |#l r #p |#t  |#x s |#| |# Q |# A |#  |# 7 |#  |# U# E ( / #  |#  ;#  ;#  a# % #  #   # K |#  ;#$   !r ~ "# #|# $# %;  ' Q (# O )I# k *T# S +#  ,{ #  - #A .~ O 1  \ 2*vi 36<ZVvVZ+ 4hnvv 5 6Zvv 74 8 | 9` :v0 ; v-vvZi <` =` > ? @B Au{vDvv@ BvD / r    | i &# K '#  (Z# *#    ~ l #get #set #doc # #,F  , vv ZvvXID GE QE RE eo m l t Z# 4t# , # W$# /Ztz /GC 3 93# =# * Z#  E# < E# y  E# j Z#  Z# | Z# Z# |#9 EP! 9"3# Y ## _$# %Z# b%Z# &Z# 9&Z# b 'Z# c (# )Z#$ *|#( " +#, ,#0 -E#4 .E#8 ^/Z#< /Z#@ 0Z#D k1Z#H 2#Lg 38( 993# :Z# d ;Z# Z <Z# = 93# #fdZ# Z# Z# - Z# # # # #$ Z#( w #,   Z#0 R!Z#4 "Z#8 #Z#< 9 $Z#@  %#D &Z#H 'Z#L (#P \(#T )Z#X *E#\ +E#` f,$#d p-$#h z.$#l /$#p )00#tdb1#x 22#| 5# 6Z# !7Z# "84# 9E# :E# ;Z# <Z# A=$# >$# ?Z# @#  ( Z2": Z# Y 8# # E# 7# 7# 7#>hi#lo# { c # # g# 7# c# p7# qc#v " #Z# # $S# d%S# &S# b'S# O(t >"> #>m'( )E8id# 0# b0# E# Q0# a0# d0# \0# 80# 80#$ 0#( l #, 0#0 P#4 s # # Z# s# Z# y# Z# #Z8u # # l #  Z# E# _E# 2# # Z# s# Z#$ y#( Z#, Z#0 u#4[0DE E#xFZ#yFZ# G0# bG0# H# SI# JZ# Ky# L#$ BMZ#( CNy#,Oe fZ#redg# ; h# i# >jQ,@L l A# gB#sxCZ#syCZ# swDZ#shDZ# MZ# ]NZ# t OZ# S#$ T#(Wz .{Z# {Z#R |Wy w!wjw% !n !Z__s M ZHixZ xidZ!_ HL"v Z#_ 8$evݽ%,&>yX'K>(q i@ZH&3 '3H)z"*K>+iZm+jZ  kZ,Z,Z,&-(z".evbZu|.erbZu|,ZO, Z,(8,JZ+xai"Y-z"~-"|/ pp0a 11293(P11/@>!-i|+evbZ+erbZ pp0 114 !114&!11511/X!,J !H/U"," jjZ60, ,"X,<-"/x9" pp]4!114!114"114(!"115P11(|, >"- $A-1 $ A " c " {E7S QH!#8ixQZ%,R]+rvRH+iSZ9v !!#:v'6 v(+ixZH+xidZh3p!!1$6h;/<;B ~ $ix~Z! !_ H pp!9!(8!Z=119v!#$:v'6 v+ixZ! 5#1#6;#<#;#<#0<#d;#3M"y"11"$8$ $ - $@>>?aZA? ZALj/tmp/ccxq91nO.s/build/buildd/glibc-2.9/csuGNU AS 2.19.1U%% : ; I$ > $ > $ >   I : ;  : ;I8 : ; : ; I8 I !I/ &I' II : ; I8 '  : ; : ;I : ; : ;< : ; I : ;I8 .? : ; ' I : ; I: ; I.: ;' I : ;I 4: ;I!4: ;I".? : ; ' I@#: ; I $: ; I %.? : ;' @&.? : ;' @': ;I( ).? : ; I@*4: ; I+4: ;I,4: ;I-4: ;I .4: ;I / U01X Y1121X Y31X Y41UX Y51UX Y6 U7.? : ;' I@8: ;I9.: ;' I@:: ;I ;41<41= >4: ; I? < ?4: ; I?  U%o /build/buildd/glibc-2.9/build-tree/i386-libc/csu../sysdeps/genericcrti.Sinitfini.c !/!=Z!gg//x#!/!=Z! DisplayCAL/usr/include/bits/usr/lib/gcc/i486-linux-gnu/4.3.3/include/usr/include/usr/include/sys/usr/local/include/python2.7/usr/include/X11/usr/include/X11/extensionsRealDisplaySizeMM.cstring3.hstdio2.hstddef.htypes.hstdio.hlibio.htypes.hpyport.hobject.hmethodobject.hdescrobject.hX.hXlib.hxf86vmode.hXinerama.hrandr.hXrandr.h׼f!0~֑;Miguy fKgu{f <}XeK=wKQ&"^ *!\-d0?z(( [v,hz(zf[fzffz.zfJz,2z.HIf&b:=z<,בYב z*YY #"fmXeYK1E.(}.+ing|fg|f1{f{ t2?tge=gt3 - 9Y==h{f{-{ff{.H|/<{f{f- {<, ~.w9~֑-//~."/>N.F.~&\*j>T-YJ dm%B'Bs=-Yf8pjy\<>,L=k<8Fj<>,>f@=xX,-/4u>R#=-YrXP& /tmpccxq91nO.s !!!#-!!!| LB HAB AyAB FMAB FFAB C)AB BC !|AB F[!tAB FX_XGCtp_clear_objectGetXRandROutputXIDmax_request_size_shortbuf__pad3binaryfunccoercion_IO_lock_tstridesnb_inplace_powerprivate1_IO_buf_endPyGetSetDefsetattrofunclast_request_readnoutputselftp_deallocnb_inplace_xormonitorreadonlytp_as_mappingnb_inplace_subtractSubpixelOrder_IO_write_endext_datassizessizeobjargproctp_namerooty_orgbits_per_rgbtp_as_bufferbitmap_bit_order_XRRModeInfotp_initRRCrtc_old_offset_markerstp_traverselenfuncWindowresourceidnb_subtractndimtp_weaklistxrr_foundsmalltabledisplay_namegetattrfuncnb_nonzero_IO_FILEml_methrotationdestructorEMPTYRROutputtp_weaklistoffsetvTotalgetbufferprocVisualnmodesq_itemtp_getattr_postp_cachemyscreenmap_entriesnb_inplace_addsq_ass_slicedescrsetfuncroot_depthstrcat_IO_save_enddnbufwidth_mmnb_inplace_floor_dividebf_getwritebufferhSyncEnd__lennvsyncnb_orlong long unsigned intnb_inplace_remainderconfigTimestampblack_pixelnb_multiplystrncpyscrnresinitprocbf_releasebufferhashfuncDisplayCAL/RealDisplaySizeMM.ctp_iternexttp_printvSyncEndPyBufferProcsXineramaScreenInfotp_allocsave_undersresource_allocsubpixel_order_IO_backup_basecharbufferprocnb_positivednameinquiryreleasebufferprocnclonemotion_bufferscreen_number_filenoreadbufferprocmin_keycode__pad4tp_hash__pad5crtcinpossible_IO_markerprivate_datatp_setattroshapeXF86VidModeMonitortp_richcompareqlen_XDisplay_IO_read_basetp_getattrodefsixbf_getbufferssizessizeargfuncserialdcountstdinmax_keycodegettertp_mroroot_visualnscreenstp_subclassesvSyncStartnb_coerce__fmtbf_getcharbufferhTotalbf_getsegcountPy_ssize_tcmapnpreferredXErrorEventget_xrandr_output_xidtp_getsetmodesfree_a_disppath_XRRCrtcInfo_XRRCrtcGammatp_compare_modesq_slicevendorinternalGNU C 4.3.3mydisplaynb_octmheightprivate17sq_inplace_concatuscreenlong long intnb_negativenhsyncnb_powerbufferinfonb_inplace_rshiftdotClockwritebufferproc_typeobjectnb_inplace_divideheight_mmtp_as_sequenceRotationsq_concatsetattrfuncoutputs_IO_write_baseconnectionvisualidPyCFunctionbitmap_unitmax_mapsdescription_IO_save_basevisitprocmwidthbacking_storetp_memberscallback_ddebugnb_remainderPyObjectdesc1desc2nb_rshiftPyMappingMethodsnb_dividedescrgetfuncpixmap_format_XrmHashBucketRectp_base__quad_tallocfunctdisppnb_inplace_ordispbits_per_pixelobjobjprocmp_length__pad1__pad2tp_docred_masktp_methodsnb_andtp_itemsizeobjobjargprocsetterproto_major_version_vtable_offsetrequestbyte_ordernb_true_divideminvx_orgtp_basicsizeargsgreennb_floor_dividebf_getreadbufferlong doublesprintfnull_error_handlertp_descr_gettimestampmp_subscriptConnectioniternextfuncRRModenb_longtp_flagsncrtcob_sizesq_lengthg_error_handler_triggered_IO_read_endDepthdefault_gcproto_minor_versionshort inttp_callget_a_displaytp_iterml_nametp_freeblue_maskob_refcnttp_version_tagRealDisplaySizeMM_methodscrtcgamtp_basestp_dict_XExtDataml_docclosurebluePyMethodDefminor_codetp_reproutinameLensq_containssq_ass_item_XRRGetScreenResourcesCurrentfreefunc__ssize_tndepthsPy_bufferrscreenreprfuncmp_ass_subscript_XPrivateprivate2private3private4private5nb_floatprivate8private9nb_intnb_invert_lockVisualIDrequest_codenb_xornb_hexPySequenceMethodsfree_privatenformatsget_real_screen_size_mmscanline_padScreensegcountprocXF86VidModeSyncRangemm_widthwhite_pixelPyMemberDef__destXPointerPyNumberMethodsunsigned charnb_inplace_lshifttp_is_gcnb_index_sbufmin_mapsnvisualscrtcs__srctraverseproc_IO_write_ptrtp_dictoffsetmodeFlags_XRROutputInfoprintfuncnb_inplace_andternaryfuncXRRModeFlagstp_strget_displaysml_flagsbitmap_padclonesnameLengthxdefaultserror_code_XRRScreenResourcesstdoutScreenFormatsuboffsetsgetattrofuncclassrichcmpfuncgreen_masktp_as_number__off_thSkewtp_descr_setColormaptp_newnb_lshiftprivate6nb_absoluteshort unsigned intreleasedefault_screensq_inplace_repeatroot_input_maskob_typemajvTimenb_addtp_del_IO_read_ptrnb_inplace_true_dividenb_inplace_multiplynewfuncndispshSyncStartprivate10private11private12private13private14private15private16_chainprivate18private19tp_setattrmodelsq_repeatfree_disppaths_flags2initRealDisplaySizeMM/home/fhoech/displaycal_cur_columnunaryfunc_nextbname__off64_t_unused2_IO_buf_basemm_heightgetiterfuncnb_divmodrotations t tu !t!#t#hupqtqstsupuWutt=u9V9=u@AtACtCUu Yu{u{Uu{9u{2V2Yu|'u{Vu|(PKu|V-u{-Ku|u{9Yu{'u{Ku{ u{ P u{ P E u{E J PJ u{9GPYu{ou{Ku{e|Pgzu{9Yu|'u|Ku|P,u|PPP9Yu|u|u|Uu|9Yu|u|'u|Ku|RUu|Yu{u{Uu{9Yu{'u{Ku{ u{ - u|- u{Yu{]u{Ku{gzu{Yu|wu|Ku|Yu|wu|Ku|Q(QQ9Yu{'u{Ku{u{9Yu|'u|Ku|u|9Yu|'u|Ku|u|  P  PJ Y P`atactcu`uuupWupUWUWupWWgVVPWVRRtt u u up upV VPPttuLLu L[upcupL[u\yu\P-:VMUVnVLWWP  x##`8-KK(Bw s3Pv szg4zg x ` l J V zg} ` l J V    J P / [ ` f P V { f l N Q `-PceP-ymv  ##.symtab.strtab.shstrtab.gnu.hash.dynsym.dynstr.gnu.version.gnu.version_r.rel.dyn.rel.plt.init.text.fini.rodata.eh_frame.ctors.dtors.jcr.dynamic.got.got.plt.data.bss.comment.debug_aranges.debug_pubnames.debug_info.debug_abbrev.debug_line.debug_frame.debug_str.debug_loc.debug_rangestoHH`% `-c5ol l lBo PQ ( ( `Z  X c 0^  iox#x#u2##|}%%>.>.>.>.?/?/@0P A111pX23&Y|\ b0c"%u-}; #= AHl  (       x# # %>>>>??@A  >%>3>@ VAeAsP >%>@# @0$A A !| 1!t C?Y@f>s#  #  >M $ 7 F ZmAx# AH %5EX^k) A+= Jfy u(AA");  initfini.ccrtstuff.c__CTOR_LIST____DTOR_LIST____JCR_LIST____do_global_dtors_auxcompleted.6635dtor_idx.6637frame_dummy__CTOR_END____FRAME_END____JCR_END____do_global_ctors_auxRealDisplaySizeMM.cRealDisplaySizeMM_methodsxrr_found.15233_XRRGetScreenResourcesCurrent.15236GetXRandROutputXIDRealDisplaySizeMM_GLOBAL_OFFSET_TABLE___dso_handle__DTOR_END____i686.get_pc_thunk.cx__stack_chk_fail_local__i686.get_pc_thunk.bx_DYNAMICXineramaQueryScreensXFreeXRRFreeScreenResourcesfree_a_disppathXRRFreeCrtcInfoXRRGetOutputInfonull_error_handler__gmon_start___Jv_RegisterClassesrealloc@@GLIBC_2.0g_error_handler_triggeredstrchr@@GLIBC_2.0getenv@@GLIBC_2.0_finicallback_ddebugcalloc@@GLIBC_2.0strncpy@@GLIBC_2.0XineramaQueryExtensioninitRealDisplaySizeMMXRRQueryExtensionXRRGetCrtcGammaXRRQueryVersionstrrchr@@GLIBC_2.0dlsymXOpenDisplay__strcat_chk@@GLIBC_2.3.4PyArg_ParseTuplefree@@GLIBC_2.0XCloseDisplayXF86VidModeQueryExtensionget_a_displayXRRGetScreenResourcesstrcpy@@GLIBC_2.0XRRFreeGammaPy_BuildValue__bss_startmalloc@@GLIBC_2.0get_displays__stack_chk_fail@@GLIBC_2.4free_disppathsXineramaIsActivePy_InitModule4_endXRRGetCrtcInfo__sprintf_chk@@GLIBC_2.3.4XSetErrorHandlerXF86VidModeGetMonitor_edatadlopen__cxa_finalize@@GLIBC_2.1.3__strdup@@GLIBC_2.0XRRFreeOutputInfo_initDisplayCAL-3.1.0.0/DisplayCAL/lib32/RealDisplaySizeMM.so0000644000076500000000000010666412650252610022207 0ustar devwheel00000000000000 9D P=  __TEXT __text__TEXT __picsymbolstub1__TEXT __cstring__TEXTC__DATA  __dyld__DATA  __nl_symbol_ptr__DATA  __la_symbol_ptr__DATA \ __const__DATA h h__cfstring__DATA x x__data__DATA 8 8__LINKEDIT00 DtJ׶%  81H5< P))/4/4x0# 4/usr/lib/libgcc_s.1.dylib 4o/usr/lib/libSystem.B.dylib|B}|}cx= H}| x= N |B}h|=kk }iN |88B8}H|P/0123456789:;<=?ABCDEFG@8?FD7GE3402/1:65AC9B<;= __mh_bundle_headerdyld_stub_binding_helper__dyld_func_lookup_GetXRandROutputXID_RealDisplaySizeMMdyld__mach_header_RealDisplaySizeMM_methods_callback_ddebug_free_a_disppath_free_disppaths_get_a_display_get_displays_initRealDisplaySizeMM_CFDictionaryGetCount_CFDictionaryGetKeysAndValues_CFDictionaryGetValue_CFRelease_CFStringGetCString_CFStringGetCStringPtr_CGDisplayBounds_CGDisplayIOServicePort_CGDisplayIsMain_CGDisplayScreenSize_CGGetActiveDisplayList_IODisplayCreateInfoDictionary_PyArg_ParseTuple_Py_BuildValue_Py_InitModule4___CFConstantStringClassReference___stack_chk_fail___stack_chk_guard_calloc_free_malloc_sprintf$LDBL128_strcmp_strdup_strncpy/Users/Shared/dispcalGUI/displaycal/DisplayCAL/RealDisplaySizeMM.c/Users/Shared/dispcalGUI/displaycal/build/temp.macosx-10.5-fat-2.7/DisplayCAL/RealDisplaySizeMM.o_initRealDisplaySizeMM_GetXRandROutputXID_free_disppaths_free_a_disppath_get_displays_get_a_display_RealDisplaySizeMM_RealDisplaySizeMM_methods_callback_ddebug h__TEXT __text__TEXTP P__cstring__TEXTp+p__symbol_stub__TEXT__stub_helper__TEXT  __unwind_info__TEXTH__DATA  __dyld__DATA  __nl_symbol_ptr__DATA  __la_symbol_ptr__DATA X __cfstring__DATAl l __data__DATA 8__LINKEDIT00 d%ԑYv"00 0Xx0x2l5I9 P**08/83M 4/usr/lib/libgcc_s.1.dylib 4o/usr/lib/libSystem.B.dylibX+ X US$[D$D$ D$D$ $3 $[fDU(]u[ED$ t$E $ 1҅tD$4$ ‰Ћ]uUWVS}tSt>_Dt$ Pt $ $ ދủ}[^_ [^_DUS]t2t$V Ct$G ][: [f.U(]u}[ U1ҍt$D$$ t,DžDD M3 ]u}Ët$ 8tt$D$$P K@D$$U 4tcD11u$fD8BF9vCD$$‹4uĉ $ 8$}Dž\1p,u $U M 48dD$, $4`,pB`,tB `,xB,|Bd$(D$$H‹$D$$Lƅ$.LD$$p@___CFConstantStringClassReferenceQql@___stack_chk_guardq@dyld_stub_binderqq>@_CFDictionaryGetCountq>@_CFDictionaryGetKeysAndValuesq>@_CFDictionaryGetValueq >@_CFReleaseq$>@_CFStringGetCStringq(>@_CFStringGetCStringPtrq,>@_CGDisplayBoundsq0>@_CGDisplayIOServicePortq4>@_CGDisplayIsMainq8>@_CGDisplayScreenSizeq<>@_CGGetActiveDisplayListq@>@_IODisplayCreateInfoDictionaryqD>@_PyArg_ParseTupleqH>@_Py_BuildValueqL>@_Py_InitModule4qP@___stack_chk_failqT@_callocqX@_freeq\@_mallocq`@_sprintfqd@_strdupqh@_strncpy_initRealDisplaySizeMM=free_Bget_ecallback_ddebug%disppaths[a_disppath`&'displays}a_display'4A ":@JZjz *:JZjz    $ ( , 0 4 8 < @ D H L P T X \ ` d h t        dd f.V.n$$PNP.$$PNP. $ $pNp.$$PNP.$$N.p$p$ N .$$N&  dP.dAUh v    p =S^r!0@btl ? 0123456789:;<=>@BCDEFG@@A0123456789:;<=>@BCDEFG __mh_bundle_headerdyld_stub_binding_helper__dyld_func_lookup_GetXRandROutputXID_RealDisplaySizeMM stub helpersdyld__mach_header_RealDisplaySizeMM_methods_callback_ddebug_free_a_disppath_free_disppaths_get_a_display_get_displays_initRealDisplaySizeMM_CFDictionaryGetCount_CFDictionaryGetKeysAndValues_CFDictionaryGetValue_CFRelease_CFStringGetCString_CFStringGetCStringPtr_CGDisplayBounds_CGDisplayIOServicePort_CGDisplayIsMain_CGDisplayScreenSize_CGGetActiveDisplayList_IODisplayCreateInfoDictionary_PyArg_ParseTuple_Py_BuildValue_Py_InitModule4___CFConstantStringClassReference___stack_chk_fail___stack_chk_guard_calloc_free_malloc_sprintf_strdup_strncpydyld_stub_binder/Users/Shared/dispcalGUI/displaycal/DisplayCAL/RealDisplaySizeMM.c/Users/Shared/dispcalGUI/displaycal/build/temp.macosx-10.5-fat-2.7/DisplayCAL/RealDisplaySizeMM.o_initRealDisplaySizeMM_GetXRandROutputXID_free_disppaths_free_a_disppath_get_displays_get_a_display_RealDisplaySizeMM_RealDisplaySizeMM_methods_callback_ddebugDisplayCAL-3.1.0.0/DisplayCAL/lib64/0000755000076500000000000000000012653527012016342 5ustar devwheel00000000000000DisplayCAL-3.1.0.0/DisplayCAL/lib64/__init__.py0000644000076500000000000000000112647526507020455 0ustar devwheel00000000000000#DisplayCAL-3.1.0.0/DisplayCAL/lib64/python26/0000755000076500000000000000000012653527012020033 5ustar devwheel00000000000000DisplayCAL-3.1.0.0/DisplayCAL/lib64/python26/__init__.py0000644000076500000000000000000112647526507022146 0ustar devwheel00000000000000#DisplayCAL-3.1.0.0/DisplayCAL/lib64/python26/RealDisplaySizeMM.so0000755000076500000000000012507312650252610023703 0ustar devwheel00000000000000ELF>0@@@8@%"** -- - 0 -- - PtdH)H)H)LLQtdRtd-- - HHc7(-)'$*#&2  %31+ !. 05/"4,6 *@ @9 b$*+,-/0123456CE爢wx;wqX|ۧI%|j6cۏ)^ ~&C\ + : Ll-"rm,;eS"1 ?  ' $+ @u )1   l 51 1  9R1 __gmon_start___init_fini__cxa_finalize_Jv_RegisterClassesnull_error_handlerg_error_handler_triggeredinitRealDisplaySizeMMPy_InitModule4_64free_disppathsfreefree_a_disppathget_displaysgetenvstrncpystrrchrstrchrXOpenDisplayXSetErrorHandlerXineramaQueryExtensioncallocXCloseDisplay__strcat_chkXRRQueryExtensionXRRQueryVersionXRRGetOutputInfoXineramaIsActiveXineramaQueryScreensXRRFreeScreenResourcesXF86VidModeQueryExtensionXF86VidModeGetMonitor__sprintf_chk__strdupstrcpy__stack_chk_failXRRGetCrtcGammaXRRFreeGammaXFreeXRRGetCrtcInforeallocXRRFreeCrtcInfoXRRFreeOutputInfodlopendlsymXRRGetScreenResourcesget_a_displaymallocPyArg_ParseTuplePy_BuildValuecallback_ddebuglibX11.so.6libXinerama.so.1libXrandr.so.2libXxf86vm.so.1libpthread.so.0libc.so.6_edata__bss_start_endGLIBC_2.4GLIBC_2.3.4GLIBC_2.2.5ii :ti Dui P/ @1 @1 `1 'h1 0&x1 (1 b(1 %1 (/ /  / 6/ 0 0 0 0  0 (0 00  80  @0  H0  P0 X0 `0 h0 p0 x0 0 0 0 0 0 0 0 0 0 0 0 0 0  0 !0 "0 #1 $1 %1 &1 ' 1 ((1 )H"H52 %4 @%2 h%* h%" h% h% h%  h% h% hp% h`% h P% h @% h 0% h % h % h% h% h% h% h% h% h% h% h%z hp%r h`%j hP%b h@%Z h0%R h %J h%B h%: h%2 h %* h!%" h"% h#% h$%  h%HH HtHÐU=h HATSubH=x t H= rHS L%D H= L)HHXH9s DHBH AH H9r [A\fUH= Ht"H HtH= IAÐH 1H59 H=A11ATHIUStdHHtGH1H8Ht[H;HGHt HGH;D$H|$XH d1KI$LD$XH H|$HBDJD$BD$B$1 H|$HI$HHC7$$;$ D$DŽ$:DŽ$LAHt2.HHt H HEH1pHD$pIcLL$I$HHHH$%I$Dh I$Dh$I$Dh(I$@I$@I $IHcA HDAI $IHcA HDAfDH|$Xvv[H|$pfD#sLHD$(&HLT$(t0HH$H$$ @ $HDŽ$$d1EHc$H\$pHHHHH H$ZH$ LIRH$LLT$(HH$LT$(H$$H$LT$(HcHHH$LT$(Hc$H$HDH$@LT$(HHD$x HT$xHHLT$(U$H H\$xHH$HH(H$HABHA BHABHAH 3BIBHHB0HH$HC(JHB8$dH|$@$MJA1LT$(HL$xLD$@H|$8HH BDJD$BD$B$1?$LT$(HT$xL$AHIAD9$~kIEHK0EH9H0uH|$@H UEd1LT$(Dd$0Ht$@H|$8HD$xLT$(DL$0HHD$xHH|$8LT$(tHHCLT$(LT$(:LHLT$(tAHǾ.HHLT$(t'D$H H1LT$(HT$xLHLT$(HHLT$(H$LT$( $LT$($LH$LH$HDŽ$H=HHH tH5Hg $Hc$ILHHtyH$HH$LT$(tgHc$H$H$H$H$LHHDŽ$H$H$L1vfDLc1HDŽ$cAU1E1ATAUSHYHHt?H8t.1Eu@:fDA9Dt.HcH\H;uHE1RHL[]A\A]HÐ@HItkHHIEHBIEHBIEHBIEHB IE HB(IE(HB0IE0HB8IE8HH8YHIEt%HHxDHIEt&HaI}2L*@LE1H3DSHH51HHT$ 1҅uHH[fD|$ 1Ht HNjX8H=H1=HHH[fH\$Hl$HLd$Ll$H8HT$H51J1҅uHH\$Hl$ Ld$(Ll$0H8Ë|$11HIH8HH:HNHt3.HlHt!EE H pHH1HHHt^HIcE HHHD` X$LH L HډH H=1 Hf.H`LP11ʐUHSHH( HtH HHHuH[ÐHHRealDisplaySizeMMDISPLAY.0ARGYLL_IGNORE_XRANDR1_2libXrandr.soXRRGetScreenResourcesCurrentScreen %d, Output %s[ Clone of %d ].%dScreen %di(i,i)GetXRandROutputXID%s at %d, %d, width %d, height %dRealDisplaySizeMM(int displayNum) Return the size (in mm) of a given display.GetXRandROutputXID(int displayNum) Return the XRandR output X11 ID of a given display.;LhxHx @zRx X4PLXuBGA l9D$ l$H+BGD A(D0PgAP F[@  'o  \ /    o oo< o- .>N^n~.>N^n~@1 '0&(b(%(GCC: (Ubuntu 4.3.3-5ubuntu4) 4.3.3GCC: (Ubuntu 4.3.3-5ubuntu4) 4.3.3GCC: (Ubuntu 4.3.3-5ubuntu4) 4.3.3GCC: (Ubuntu 4.3.3-5ubuntu4) 4.3.3GCC: (Ubuntu 4.3.3-5ubuntu4) 4.3.3L0 ',yf<Q&'y%enull_error_handlerinitRealDisplaySizeMMfree_disppaths free_a_disppath@get_displays #get_a_display%callback_ddebug%g_error_handler_triggeredu/build/buildd/glibc-2.9/build-tree/amd64-libc/csu/crti.S/build/buildd/glibc-2.9/csuGNU AS 2.19.1%v'G 8w | - int_@i+iD i ;17-z b# # # # # #( +#0 >#8 #@ h#H #P  #X "#` $#h &b#p *b#t ,p#x 0F# 1T# :2# 6# ?{# t H# { I# DJ# K# *L-# Nb# 5P# _A # # b#  z  ZF nro q S  jP o k#  k^# k^ o C#  C^# C# W D#  E# E#( I#0 $ J5#8  Kg#@  L#H  M#P N#X 3 R#`  S#h T#p " X#x 7 Y#  Z#  [# Y \# w _# bi# d#  h #  k# ~ o # k r# M v8#  wD# z%#  {1#  |# $ }^# ~# u P# N \# . #  h# W # d t# ]  # # #  #  #  #  #  # y M#P l' zdK n  b )V 4:bOOO `f{ G bB b b, CIc, CZ y 2P l buf #obj #len # # b#  b#$ #( e #0 j #8  #@  #HV   b  bl     _  b v  b  ! ' bA  8 َ  #  #  #  #  # a #( { #0 h o#8  o#@ ~ o#H , #P o#X k #`  #h #p #x l # 8 )# o# o# o# ' o# o#  #  #  #  #  # r # #  # _ # # = # - # # , #  # o# A P : #  #  U#  U#  {#  #(  #0   #8 @ #@  U#H   } j # !# q "# #F 0 % = &8# D 'c# ` (n# H )#  *w #  + #(6 , ; / Q 0#)5U 1AGbaab  2sy  3 4b 5   6 h 7z 8i  98bU :z ;z < =  > . ?^, @^ : }   z% U &# @ '#  (b# *# +( | X #get #set #doc # # 7N ;  ,  bXID G8 Q8 R8 e[ m l  b# #  # L6#Ab AGC8E 9E# 2 #  b#  8# ( 8# e  8#( j b#0  b#4 b# b# #K W! 9"E# E ## _$ #  %b# N%b# &b# .&b#$ N 'b#( O (#0 )b#8 *#@  +#H z,+#P -8#X .8#` S/b#h /b#l 0b#p `1b#t 2i#xS 38: 99E# :b# P ;b# F <b#=(  9E# #fdb# b# b#  b# # #( #0 #8 ub#@ l(#H  b#P G!b#T "b#X #b#\ % $b#`  %.#h &b#p 'b#t (#x H(# )b# *8# +8# R,6# \-6# f.6# p/6# )0M#db1:# z2P# 5# 6b# 7b# 8F# 98# :8# ;b# <b# 6=6# >6# ?b# @#  (: 4bP@L( b# E V# # 8# ?# ?#! ?#"\hi#lo#g 0z # # \# t?# uz# e?# fz#(k " #b#  $[# d%[#  &[# N'[# D( F"F #Fb'( )z8Pid#  M# NM# 8# =M# VM# YM# HM#$ -M#( -M#, }M#0 X #8 M#@ <'#H2@ # # b# # b# #( b#0 #8 F` # # X # b# | 8# K8#( '#0 {#2 b#4 #8 b#@ #H b#P b#T #XG@D\ E#xFb#yFb#  GM# NGM# H# HI# Jb#$ K#( kL#0 7Mb#4 8N#8O e fb#redg# ' h# i#Fjh@@c X A# \B#sxCb#syCb#swDb#shDb# Mb# RNb#$ ` Ob#( S#0 T#8Wz #{b# {b#> |ny w w_w-   Z !b)__s B  !b_"ixb#xidb$K _c%b b w&K VU'evT( =w)>@*7>`+P,i@b_)3>@*3_v-$".7 ,ib,jb#kb/b/b/0"~1evbb|1erbb|/bC / b /V /6b* ,xai" 0"}0"|2 #pp3Pp 445c{60P442!/# #jjb+0/ ,#( /1-# 2!#pp]3""d!443!"!447!4470!448449%/ ># 2"0{,evbb ,erbba#pp38Xh"447`"448442"/6 !_0  1 0 e% 1 " c # \:? Q_$%#;ixQb/R,rvR_c,iSb<%'&$*T*" w1ixbl,xidb6)% &4;+=F>R!. ~$"ix~b$ $K _#pp$%$V$b?44<0&v'P%*?*" b,ixb$ 8$@4+$+p=6$>B$=N$>Y$>e$O=q$6&&44#e%V P% {% 0 k% `1 @@Aab 1 A b 1 us /build/buildd/glibc-2.9/build-tree/amd64-libc/csu/crtn.S/build/buildd/glibc-2.9/csuGNU AS 2.19.1U%% : ; I$ > $ > $ >   I : ;  : ;I8 : ; : ; I8 I !I/ &I : ; ' II : ; I8 '  : ; : ;I : ; : ;< : ; I : ; : ;I8  : ; .? : ; ' I : ; I: ; I !.: ;' I ": ;I#4: ;I$4: ;I%.? : ; ' I@ &: ; I ': ; I (.? : ;' @ ).? : ;' @*: ;I+ U,4: ;I-.? : ; I@.4: ; I/4: ;I04: ;I 14: ;I 2 U31X Y4151X Y61X Y71UX Y81UX Y9 :.? : ;' I@;: ;I<.: ;' I@=41>41? @4: ; I? < A4: ; I?  U%O /build/buildd/glibc-2.9/build-tree/amd64-libc/csucrti.S 0 Ku=/0K K '$ DisplayCAL/usr/include/bits/usr/lib/gcc/x86_64-linux-gnu/4.3.3/include/usr/include/usr/include/sys/usr/include/python2.6/usr/include/X11/usr/include/X11/extensionsRealDisplaySizeMM.cstring3.hstdio2.hstddef.htypes.hstdio.hlibio.htypes.hpyport.hobject.hmethodobject.hdescrobject.hX.hXlib.hxf86vmode.hXinerama.hrandr.hXrandr.h <~/;Y1?YyDyX ,>,f; =/YY>{}t%. X}t![KQ -r0"z` \{w+w|f|"%~ ~N1<:#~yxfg;==Bzf%zW%zXzXXzXMUug [z.%zJ:ILTzPYz $ 䃃 %"hX~tʃs=-z;u=?~/ 9 ;{tX=g{ft=h{t{.{X{<+|/{*( {' &%Ƀf1-.R Ƀs~ 2Tj= dQ%BCPu=;Y NN\L,Z[;=X/j r>f@!x ;=4M9>[=sYR{O /build/buildd/glibc-2.9/build-tree/amd64-libc/csucrtn.S K 'Kx  $@uBGA 9D$ l,$+BGD A(D0%gAP $0&F[@_XGCtp_clear_objectGetXRandROutputXIDmax_request_size_shortbuf__pad3binaryfunccoercion_IO_lock_tstridesnb_inplace_powerprivate1_IO_buf_endPyGetSetDefsetattrofunclast_request_readnoutputselftp_deallocnb_inplace_xormonitorreadonlytp_as_mappingnb_inplace_subtractSubpixelOrder_IO_write_endext_datassizessizeobjargproctp_namerooty_orgbits_per_rgbtp_as_bufferbitmap_bit_order_XRRModeInfotp_initRRCrtc_old_offset_markerstp_traverselenfuncWindowresourceidnb_subtractndimtp_weaklistxrr_founddisplay_namegetattrfuncnb_nonzero_IO_FILEml_methrotationdestructorEMPTYRROutputtp_weaklistoffsetvTotalgetbufferprocVisualnmodesq_itemtp_getattr_postp_cachemyscreenmap_entriesnb_inplace_addsq_ass_slicedescrsetfuncroot_depthstrcat_IO_save_enddnbufwidth_mmnb_inplace_floor_dividebf_getwritebufferhSyncEnd__lennvsyncnb_orlong long unsigned intnb_inplace_remainderconfigTimestampblack_pixelnb_multiplystrncpyscrnresinitprocbf_releasebufferhashfuncDisplayCAL/RealDisplaySizeMM.ctp_iternexttp_printvSyncEndPyBufferProcsXineramaScreenInfotp_allocsave_undersresource_allocsubpixel_order_IO_backup_basecharbufferprocnb_positivednameinquiryreleasebufferprocnclonemotion_bufferscreen_number_filenoreadbufferprocmin_keycode__pad4tp_hash__pad5crtcinpossible_IO_markerprivate_datatp_setattroshapeXF86VidModeMonitortp_richcompareqlen_XDisplay_IO_read_basetp_getattrodefsixbf_getbufferssizessizeargfuncserialdcountstdinmax_keycodegettertp_mroroot_visualnscreenstp_subclassesvSyncStartnb_coerce__fmtbf_getcharbufferhTotalbf_getsegcountPy_ssize_tcmapnpreferredXErrorEventget_xrandr_output_xidtp_getsetmodesfree_a_disppath_XRRCrtcInfo_XRRCrtcGammatp_compare_modesq_slicevendorinternalGNU C 4.3.3mydisplaynb_octmheightprivate17sq_inplace_concatuscreenlong long intnb_negativenhsyncnb_powerbufferinfonb_inplace_rshiftdotClockwritebufferproc_typeobjectnb_inplace_divideheight_mmtp_as_sequenceRotationsq_concatsetattrfuncoutputs_IO_write_baseconnectionvisualidPyCFunctionbitmap_unitmax_mapsdescription_IO_save_basevisitprocmwidthbacking_storetp_memberscallback_ddebugnb_remainderPyObjectdesc1desc2nb_rshiftPyMappingMethodsnb_dividedescrgetfuncpixmap_format_XrmHashBucketRectp_baseallocfunctdisppnb_inplace_ordispbits_per_pixelobjobjprocmp_length__pad1__pad2tp_docred_masktp_methodsnb_andtp_itemsizeobjobjargprocsetterproto_major_version_vtable_offsetrequestbyte_ordernb_true_divideminvx_orgtp_basicsizeargsgreennb_floor_dividebf_getreadbufferlong doublesprintfnull_error_handlertp_descr_gettimestampmp_subscriptConnectioniternextfuncRRModenb_longtp_flagsncrtcob_sizesq_lengthg_error_handler_triggered_IO_read_endDepthdefault_gcproto_minor_versionshort inttp_callget_a_displaytp_iterml_nametp_freeblue_maskob_refcnttp_version_tagRealDisplaySizeMM_methodscrtcgamtp_basestp_dict_XExtDataml_docclosurebluePyMethodDefminor_codetp_reproutinameLensq_containssq_ass_item_XRRGetScreenResourcesCurrentfreefunc__ssize_tndepthsPy_bufferrscreenreprfuncmp_ass_subscript_XPrivateprivate2private3private4private5nb_floatprivate8private9nb_intnb_invert_lockVisualIDrequest_codenb_xornb_hexPySequenceMethodsfree_privatenformatsget_real_screen_size_mmscanline_padScreensegcountprocXF86VidModeSyncRangemm_widthwhite_pixelPyMemberDef__destXPointerPyNumberMethodsunsigned charnb_inplace_lshifttp_is_gcnb_index_sbufmin_mapsnvisualscrtcs__srctraverseproc_IO_write_ptrtp_dictoffsetmodeFlags_XRROutputInfoprintfuncnb_inplace_andternaryfuncXRRModeFlagstp_strget_displaysml_flagsbitmap_padclonesnameLengthxdefaultserror_code_XRRScreenResourcesstdoutScreenFormatsuboffsetsgetattrofuncclassrichcmpfuncgreen_masktp_as_number__off_thSkewtp_descr_setColormaptp_newnb_lshiftprivate6nb_absoluteshort unsigned intreleasedefault_screensq_inplace_repeatroot_input_maskob_typemajvTimenb_addtp_del_IO_read_ptrnb_inplace_true_dividenb_inplace_multiplynewfuncndispshSyncStartprivate10private11private12private13private14private15private16_chainprivate18private19tp_setattrmodelsq_repeatfree_disppaths_flags2initRealDisplaySizeMM/home/fhoech/displaycal_cur_columnunaryfunc_nextbname__off64_t_unused2_IO_buf_basemm_heightgetiterfuncnb_divmodrotations02w29w9:w:w 0<U<D\DIUISU\\UIVPwwUSSUw}wd{dw7{{w { w9w{ w | {| w 5 {5 w { w ${$KwK}{x{xSQSQ7{<z{zP{w{w{9PS]P]{ ] d {d | w| S w {w P K{7{F{\P{8\8:P:{9 { w \w | w| { \ . \. { K\PBw7{y{P w9w{ w| w Powo|7w P w|9|w | | w| | ]wMkPPYP7||9}|7{{9}{P^9}^7{%{9$ {$ w { w K{;{7wew {9{w {| {7{F{w{9 { w K{P 8P  P Z 2 Z Z  Pw7{Fw9w{ w { w { Kw% > P> K P P7{{ { {| {7{{ { {| {R Rwwww w(w0U\\PPSVPS]]QPQPQwww UTUSPP ;w;fw -U GTGNUTpTtfTTk]PT\SP0fSTaVP0G''<S @@`  K | <:  K .  | :<F  K <F  N y < K AF $ 7   <A  sHhxqX`Hm  p0PfyPf"'''.symtab.strtab.shstrtab.gnu.hash.dynsym.dynstr.gnu.version.gnu.version_r.rela.dyn.rela.plt.init.text.fini.rodata.eh_frame_hdr.eh_frame.ctors.dtors.jcr.dynamic.got.got.plt.data.bss.comment.debug_aranges.debug_pubnames.debug_info.debug_abbrev.debug_line.debug_frame.debug_str.debug_loc.debug_rangespo% (- \5o< < nBo @Q [ e`pk00q''w2''H)H)L))- -- -- -- -/ /(/ /H@1 @1 1 1(12@33&Z_^Xd0'0eu2v=`K $< # <      0 ' 'H))- - - - / / @1 1  !  0'- 5- C- P Pf1 u1  - *-  '`1 `1  1 . %gA 0&FS/ i@1 v- -  9  # 71 Q 'W1 g{ .@N"j $+1   5I @uXi}1 1   initfini.ccall_gmon_startcrtstuff.c__CTOR_LIST____DTOR_LIST____JCR_LIST____do_global_dtors_auxcompleted.6997dtor_idx.6999frame_dummy__CTOR_END____FRAME_END____JCR_END____do_global_ctors_auxRealDisplaySizeMM.cRealDisplaySizeMM_methodsxrr_found.15326_XRRGetScreenResourcesCurrent.15329GetXRandROutputXIDRealDisplaySizeMM_GLOBAL_OFFSET_TABLE___dso_handle__DTOR_END___DYNAMICXineramaQueryScreensXFreeXRRFreeScreenResourcesfree_a_disppathXRRFreeCrtcInfoPy_InitModule4_64XRRGetOutputInfonull_error_handler__gmon_start___Jv_RegisterClassesg_error_handler_triggered_finicallback_ddebugmalloc@@GLIBC_2.2.5XineramaQueryExtensioninitRealDisplaySizeMMXRRQueryExtensionXRRGetCrtcGammaXRRQueryVersiondlsymXOpenDisplay__strcat_chk@@GLIBC_2.3.4PyArg_ParseTuple__strdup@@GLIBC_2.2.5free@@GLIBC_2.2.5XCloseDisplay__cxa_finalize@@GLIBC_2.2.5XF86VidModeQueryExtensionget_a_displaystrrchr@@GLIBC_2.2.5XRRGetScreenResourcesXRRFreeGammastrchr@@GLIBC_2.2.5getenv@@GLIBC_2.2.5Py_BuildValue__bss_startget_displays__stack_chk_fail@@GLIBC_2.4strcpy@@GLIBC_2.2.5free_disppathsXineramaIsActivecalloc@@GLIBC_2.2.5_endstrncpy@@GLIBC_2.2.5XRRGetCrtcInfo__sprintf_chk@@GLIBC_2.3.4XSetErrorHandlerXF86VidModeGetMonitorrealloc@@GLIBC_2.2.5_edatadlopenXRRFreeOutputInfo_initDisplayCAL-3.1.0.0/DisplayCAL/lib64/python27/0000755000076500000000000000000012653527012020034 5ustar devwheel00000000000000DisplayCAL-3.1.0.0/DisplayCAL/lib64/python27/__init__.py0000644000076500000000000000000112647526507022147 0ustar devwheel00000000000000#DisplayCAL-3.1.0.0/DisplayCAL/lib64/python27/RealDisplaySizeMM.so0000755000076500000000000012521312650252610023700 0ustar devwheel00000000000000ELF>@@8@%")) -- - (P -- - PtdX(X(X(LLQtdRtd-- - HH%7%()#&.2-0$ !',*+"31 5 6 /  4*@ @9 b$*.1|ۧ;w|CEwxqXb戢ˎ)^j6I% ~&C\ + : Ll-"rm,;eS PB  u52 "1  #+)1   9? `R1  &1 l p__gmon_start___init_fini__cxa_finalize_Jv_RegisterClassesnull_error_handlerg_error_handler_triggeredinitRealDisplaySizeMMPy_InitModule4_64free_disppathsfreefree_a_disppathget_displaysgetenvstrncpystrrchrstrchrXOpenDisplayXSetErrorHandlerXineramaQueryExtensioncallocXCloseDisplay__strcat_chkXRRQueryExtensionXRRQueryVersionXRRGetOutputInfoXineramaIsActiveXineramaQueryScreensXRRFreeScreenResourcesXF86VidModeQueryExtensionXF86VidModeGetMonitor__sprintf_chk__strdupstrcpy__stack_chk_failXRRGetCrtcGammaXRRFreeGammaXFreeXRRGetCrtcInforeallocXRRFreeCrtcInfoXRRFreeOutputInfodlopendlsymXRRGetScreenResourcesget_a_displaymallocPyArg_ParseTuplePy_BuildValuecallback_ddebuglibX11.so.6libXinerama.so.1libXrandr.so.2libXxf86vm.so.1libpthread.so.0libc.so.6_edata__bss_start_endGLIBC_2.4GLIBC_2.3.4GLIBC_2.2.5ii :ti Dui P`1 `1 1 &1 @%1 '1 r'1 $1 (/ 2/ /  / 3/ 0 0 0 0 1 0 (0 00 80  @0  H0  P0  X0 `0 h0 p0 x0 0 0 0 0 0 0 .0 0 0 0 0 0 0 *0 0 0 +1  1 !1 "1 # 1 $(1 %01 &81 '@1 (H1 )HbH5" %$ @%" h% h% h%  h% h% h% h% hp% h`% h P% h @% h 0% h % h % h% h% h% h% h% h% h%z h%r h%j hp%b h`%Z hP%R h@%J h0%B h %: h%2 h%* h%" h % h!% h"%  h#% h$% h%% h&% h'p% h(`% h)PHH= HtHÐU=8 HATSubH=( t H= BH L% H  L)HHXH9s DHBH AH H9r [A\fUH= Ht"H HtH= IAÐHq 1H5  H=ZA11ATHIUStdHHtMH1HfHHHt H%H;HGHt HH;HcIHHu[]LA\[]A\ff.HSHt'H?HtH{HtH[[H=H\$Hl$Ld$Ll$Lt$L|$HdH%(H$1DŽ$DŽ$HL$@cHL-Ƅ$:LXHt(.HvHex@0@LHIHD$xH=BHH-z HHH$H$LA$AHDŽ$$$Hc2HHD$xHD$h$1ۅD$9@HL$hHcHHuHLHD$xDH$dH3%(HD$xH$H$L$L$L$L$H@H5ddLlL$@DŽ$@:0.0Ƅ$DEH$H$LOH$H$L/$!$H- HH1 A$ H$H$HD$xDŽ$DŽ$HT$8HL$0$H=W H B HHc$ILHHtH$H$=H$DŽ${ 8fDHpH0H$C $9$H$Lc$LH$HB(JHfx0uH$A LFH$L.HH$t!$DŽ$LHD$xBH$$$9$|1 H|$xAHL$xH\$xHHHHHH LfDH5 dLD.H$H$H$H$DŽ$H\$`H$HD$XHT$PHL$HH\$@II$HTm@ I$Dh$I$Dh(H$HI $BABI $ABI $AB I $AHT$`Ht$XLt:HDŽ$I$LHT$Hp$tH$Ht >D$H|$PH d1kI$LD$PH H|$@BDJD$BD$B$1-H|$@I$HHC7$$;$D$DŽ$:DŽ$LAHt2.HHt H HEH1HD$hIcLL$I$8HHH$%I$Dh I$Dh$I$Dh(I$@I$@I $IHcA HDAI $IHcA HDAfDH|$PvkH|$hfD{LHD$ HLT$ t0HH|$x@H$$@ $HD$x$z1kHc$H\$hHHHHH H$dH$L-IRH$LLT$ HH$LT$ H|$x$H|$xLT$ HcHHHD$xLT$ HHc$HDH\$x@LT$ HHD$pAHT$pHHLT$ K$H H\$pHH$HH(H$HABHA BHABHAH *BIBHHB0HH$HC(JHB8$dH|$8$MJA1LT$ HL$pLD$8H|$0HH BDJD$BD$B$1v$LT$ HT$pLl$xAHDIAD9$~kIEHK0EH9H0uH|$8H MEd1LT$ Dd$(Ht$8H|$0HD$pLT$ DL$(HHD$pHH|$0LT$ |HHCLT$ {LT$ :LHLT$ tAHǾ.HHLT$ t'D$H H1RLT$ HT$pLHLT$ HHLT$ H$LT$ $LT$ $LJH$LH|$xHD$xH=HHH tH5Hu $Hc$ILHHtH$&HHD$xLT$ tdHc$H$"H$(H$H$LHHD$xH$H$L1fL{1DHD$xfffff.AU1E1ATAUSHHHt?H8t.1Eu@:fDA9Dt.HcH\H;uHE1HL[]A\A]HÐ@.HItkHHIEHBIEHBIEHBIEHB IE HB(IE(HB0IE0HB8IE8HH8iHIEt%HHxTHIEt&H3aI}BL:@LE1*H3DSHH51HHT$ 1҅uHH[fD|$ 1Ht HNjX8H=H1]HHH[fH\$Hl$HLd$Ll$H8HT$H51Z1҅uHH\$Hl$ Ld$(Ll$0H8Ë|$11HIH8'HH:HnHt3.HHt!EE H pHH1HHHt^HIcE HHHD` X$LH L HډH H=1*Hf.HpL11ʐUHSHH HtH  HHHuH[ÐHHRealDisplaySizeMMDISPLAY.0ARGYLL_IGNORE_XRANDR1_2libXrandr.soXRRGetScreenResourcesCurrentScreen %d, Output %s[ Clone of %d ].%dScreen %di(i,i)GetXRandROutputXID%s at %d, %d, width %d, height %dRealDisplaySizeMM(int displayNum) Return the size (in mm) of a given display.GetXRandROutputXID(int displayNum) Return the XRandR output X11 ID of a given display.;Lh8Hx @zRx 4LuBGA l9D$ B l$H+BGD A(D0PgAP F[@  &oh \ /     o` oo o- .>N^n~.>N^n~.>N^n`1 &@%'r'$(GCC: (Ubuntu 4.3.3-5ubuntu4) 4.3.3GCC: (Ubuntu 4.3.3-5ubuntu4) 4.3.3GCC: (Ubuntu 4.3.3-5ubuntu4) 4.3.3GCC: (Ubuntu 4.3.3-5ubuntu4) 4.3.3GCC: (Ubuntu 4.3.3-5ubuntu4) 4.3.3L &,y`&<q&&y%null_error_handlerinitRealDisplaySizeMMfree_disppaths-free_a_disppath`get_displays@#get_a_display%callback_ddebug%g_error_handler_triggeredu/build/buildd/glibc-2.9/build-tree/amd64-libc/csu/crti.S/build/buildd/glibc-2.9/csuGNU AS 2.19.1%`&R 8  8 intjKi6iO i F1B-z b# #  # # ## +#( +#0 I#8 #@ s#H #P  #X "#` $#h &b#p *b#t ,p#x 0F# 1T# :2# 6# ?{#  H# I# DJ# &K# 5L-# Nb# @P# _L *# # b#  z  eQ n}z  ^  jP z k#  k^# k^ z E#  E^# E# W F# G# G#( K7#0 / LU#8  M#@  N#H  O#P P#X > T#`  U#h V#p - Z #x B [#  \#  ]# d ^# w a# di# f#  j4 #  m#  q,# v t# X xX# # yd# |E#  }Q#  ~# / ^# # p# Y |# 9 #  # b # o # h # # #  #  # * #  #  7# M#P l'  zdK y  b )V 4:bOOO `f{ G bB b b,  CIc, Ce y 2` z buf #obj #len # # b#  b#$  #( p #0 j #8  #@  z #H  #X  a   b  b     j  b    b4  ? E b_  8 ۮ  #  #  #  #  # l #(  #0 s o#8  o#@  o#H 7 #P o#X v #`  #h #p  #x w # C )# o# o# o# 2 o# o#  #  # % #  #  # r # #  # j # # H # 8 #  # 7 #  # o# _ P Z #  #  U#  U#  {#  #(  #0   #8 K #@  U#H   ! u "# ## | $# %f 0 '  H (8# O )c# k *n# S +#  , #  - #(A . F 1%+7\ 2CIU` 3agbb+ 4 5 6b 7 + 8 s 9z :i,' ;8>Xb` <z =z > ?  @ 9 A^7 B^ Z    |E ` &# K '#  (b# *# K( ~ c #get #set #doc # # WY F  ,  bXID G8 Q8 R8 ef m l  b# +# # # WV#ab aGC8e 9e# =*# ! b#  8# 3 8# p  8#( j b#0  b#4 b# b# #k w! 9"e# P ## _$@# %b# Y%b# &b# 9&b#$ Y 'b#( Z (#0 )b#8 *#@  +#H ,K#P -8#X .8#` ^/b#h /b#l 0b#p k1b#t 2i#x^ 38Z 99e# :b# [ ;b# Q <b#=(, 9e# 2#fdb# b# b# $ b# # #( #0 #8 b#@ wH#H  b#P R!b#T "b#X #b#\ 0 $b#`  %N#h &b#p 'b#t (2#x S(2# )b# *8# +8# ],V# g-V# q.V# {/V# )0M#db1Z# 2p# 5# 6b# !7b# "8f# 98# :8# ;b# <b# A=V# >V# ?b# @# ,H8Z Tbp`l( b# P v# # 8# ?# ?#! ?#"|$hi#lo#r 0 # # g# ?# # p?# q#($v/ " #b#  $[# d%[# &[# Y'[# O( F"F #Fm'( )8P"id<# M# YM# 8# HM# aM# dM# SM#$ 8M#( 8M#, M#0 c #8 M#@ GG#HR@ 5# 5# b# # b# #( b#0 #81&"-Q` 5# 1# c #  b# 8# V8#( 2#0 #2 b#4 #8 b#@ #H b#P b#T #X<R@D| E5#xFb#yFb# GM# YGM# H<# SI# Jb#$ K#( vL#0 BMb#4 CN#8O e fb#redg# 2 h# i#Fj@@ c A# gB#sxCb#syCb#swDb#shDb# Mb# ]Nb#$ k Ob#( S1#0 T&#8Wz .{b# {b#I |y wwjw- e !bI__s M  !b"ixb#xidb$V %m b`pw&V vU'evT(pw)>'*B>'`+P,i@b)3IQ`*3-'P##.B',ib,jb#kb/b/b/ 0(#~1evbb|1erbb|/bV / b /(v /Ab= ,xai# 0#}0#|2!#pp3 4456`442"/(# #jjb+0/ ,.#; /<-4# 2!#pp]3!!!4<413 !!4<417!4470!4<4184<419U/ >:# 2"0{,evbb ,erbbt#pp3h"4<417`"4<4184<412"/A !0  2 0( % 1 # c (# |:J Q#$##;ixQb/R',rvRv,iSb<$7%9$*g*- 1ixbl,xidb6I%%4[+=f>r!9 ~$"ix~b$ $V #pp$0$(v$b?4<41<@%&p%*R*- u,ixb$ 89$@4K$+p=V$>b$=n$>y$>$b=$6%&4<41(#%v@p% % 0 % 1 @@Aab 1 A b 1 uy /build/buildd/glibc-2.9/build-tree/amd64-libc/csu/crtn.S/build/buildd/glibc-2.9/csuGNU AS 2.19.1U%% : ; I$ > $ > $ >   I : ;  : ;I8 : ; : ; I8 I !I/ &I : ; ' II : ; I8 '  : ; : ;I : ; : ;< : ; I : ; : ;I8  : ; .? : ; ' I : ; I: ; I !.: ;' I ": ;I#4: ;I$4: ;I%.? : ; ' I@ &: ; I ': ; I (.? : ;' @ ).? : ;' @*: ;I+ U,4: ;I-.? : ; I@.4: ; I/4: ;I04: ;I 14: ;I 2 U31X Y4151X Y61X Y71UX Y81UX Y9 :.? : ;' I@;: ;I<.: ;' I@=41>41? @4: ; I? < A4: ; I?  U%O /build/buildd/glibc-2.9/build-tree/amd64-libc/csucrti.S  Ku=/0K K &$ DisplayCAL/usr/include/bits/usr/lib/gcc/x86_64-linux-gnu/4.3.3/include/usr/include/usr/include/sys/usr/local/include/python2.7/usr/include/X11/usr/include/X11/extensionsRealDisplaySizeMM.cstring3.hstdio2.hstddef.htypes.hstdio.hlibio.htypes.hpyport.hobject.hmethodobject.hdescrobject.hX.hXlib.hxf86vmode.hXinerama.hrandr.hXrandr.h `<~/;Y1=>yDyX ,>,f; =/YY>{}t%. X}t![KQ *r0XzX (\{w+w|f|%~  ~N1<:#X~ybxfYWg;==Bz.%zW%zXzXXzXMUug [z.%zJ:ILTzPYz $ 䃃 %"hX~ts=z;u=?~/ 6 8{tX=g{ft=h{t{.{X{<+|.{*( {' &%Ƀft1-+R ɃsX~փ#2Tj= dQ%BCPu=;Y NN\L,Z[;=X/j r>f@!x ;=4M9>[=sYR{O /build/buildd/glibc-2.9/build-tree/amd64-libc/csucrtn.S K &Kx `p$uBGA 9D$PB l,#+BGD A(D0$gAP $@%F[@_XGCtp_clear_objectGetXRandROutputXIDmax_request_size_shortbuf__pad3binaryfunccoercion_IO_lock_tstridesnb_inplace_powerprivate1_IO_buf_endPyGetSetDefsetattrofunclast_request_readnoutputselftp_deallocnb_inplace_xormonitorreadonlytp_as_mappingnb_inplace_subtractSubpixelOrder_IO_write_endext_datassizessizeobjargproctp_namerooty_orgbits_per_rgbtp_as_bufferbitmap_bit_order_XRRModeInfotp_initRRCrtc_old_offset_markerstp_traverselenfuncWindowresourceidnb_subtractndimtp_weaklistxrr_foundsmalltabledisplay_namegetattrfuncnb_nonzero_IO_FILEml_methrotationdestructorEMPTYRROutputtp_weaklistoffsetvTotalgetbufferprocVisualnmodesq_itemtp_getattr_postp_cachemyscreenmap_entriesnb_inplace_addsq_ass_slicedescrsetfuncroot_depthstrcat_IO_save_enddnbufwidth_mmnb_inplace_floor_dividebf_getwritebufferhSyncEnd__lennvsyncnb_orlong long unsigned intnb_inplace_remainderconfigTimestampblack_pixelnb_multiplystrncpyscrnresinitprocbf_releasebufferhashfuncDisplayCAL/RealDisplaySizeMM.ctp_iternexttp_printvSyncEndPyBufferProcsXineramaScreenInfotp_allocsave_undersresource_allocsubpixel_order_IO_backup_basecharbufferprocnb_positivednameinquiryreleasebufferprocnclonemotion_bufferscreen_number_filenoreadbufferprocmin_keycode__pad4tp_hash__pad5crtcinpossible_IO_markerprivate_datatp_setattroshapeXF86VidModeMonitortp_richcompareqlen_XDisplay_IO_read_basetp_getattrodefsixbf_getbufferssizessizeargfuncserialdcountstdinmax_keycodegettertp_mroroot_visualnscreenstp_subclassesvSyncStartnb_coerce__fmtbf_getcharbufferhTotalbf_getsegcountPy_ssize_tcmapnpreferredXErrorEventget_xrandr_output_xidtp_getsetmodesfree_a_disppath_XRRCrtcInfo_XRRCrtcGammatp_compare_modesq_slicevendorinternalGNU C 4.3.3mydisplaynb_octmheightprivate17sq_inplace_concatuscreenlong long intnb_negativenhsyncnb_powerbufferinfonb_inplace_rshiftdotClockwritebufferproc_typeobjectnb_inplace_divideheight_mmtp_as_sequenceRotationsq_concatsetattrfuncoutputs_IO_write_baseconnectionvisualidPyCFunctionbitmap_unitmax_mapsdescription_IO_save_basevisitprocmwidthbacking_storetp_memberscallback_ddebugnb_remainderPyObjectdesc1desc2nb_rshiftPyMappingMethodsnb_dividedescrgetfuncpixmap_format_XrmHashBucketRectp_baseallocfunctdisppnb_inplace_ordispbits_per_pixelobjobjprocmp_length__pad1__pad2tp_docred_masktp_methodsnb_andtp_itemsizeobjobjargprocsetterproto_major_version_vtable_offsetrequestbyte_ordernb_true_divideminvx_orgtp_basicsizeargsgreennb_floor_dividebf_getreadbufferlong doublesprintfnull_error_handlertp_descr_gettimestampmp_subscriptConnectioniternextfuncRRModenb_longtp_flagsncrtcob_sizesq_lengthg_error_handler_triggered_IO_read_endDepthdefault_gcproto_minor_versionshort inttp_callget_a_displaytp_iterml_nametp_freeblue_maskob_refcnttp_version_tagRealDisplaySizeMM_methodscrtcgamtp_basestp_dict_XExtDataml_docclosurebluePyMethodDefminor_codetp_reproutinameLensq_containssq_ass_item_XRRGetScreenResourcesCurrentfreefunc__ssize_tndepthsPy_bufferrscreenreprfuncmp_ass_subscript_XPrivateprivate2private3private4private5nb_floatprivate8private9nb_intnb_invert_lockVisualIDrequest_codenb_xornb_hexPySequenceMethodsfree_privatenformatsget_real_screen_size_mmscanline_padScreensegcountprocXF86VidModeSyncRangemm_widthwhite_pixelPyMemberDef__destXPointerPyNumberMethodsunsigned charnb_inplace_lshifttp_is_gcnb_index_sbufmin_mapsnvisualscrtcs__srctraverseproc_IO_write_ptrtp_dictoffsetmodeFlags_XRROutputInfoprintfuncnb_inplace_andternaryfuncXRRModeFlagstp_strget_displaysml_flagsbitmap_padclonesnameLengthxdefaultserror_code_XRRScreenResourcesstdoutScreenFormatsuboffsetsgetattrofuncclassrichcmpfuncgreen_masktp_as_number__off_thSkewtp_descr_setColormaptp_newnb_lshiftprivate6nb_absoluteshort unsigned intreleasedefault_screensq_inplace_repeatroot_input_maskob_typemajvTimenb_addtp_del_IO_read_ptrnb_inplace_true_dividenb_inplace_multiplynewfuncndispshSyncStartprivate10private11private12private13private14private15private16_chainprivate18private19tp_setattrmodelsq_repeatfree_disppaths_flags2initRealDisplaySizeMM/home/fhoech/displaycal_cur_columnunaryfunc_nextbname__off64_t_unused2_IO_buf_basemm_heightgetiterfuncnb_divmodrotations02w29w9:w:w 0<U<D\DLULSU\\UINVSVPwwUSSUw2w^{^w${hq{qw{ww{wV {V w  { ] w] u {u w { w2{r{r{S{QSQ${g{g|P{w{w{0Sy]P]{]A {A V wV j S 9 {9 Q P^ {${3{\P{(\(*P*{{Q \Q V wV { f \ \ ^ {^ \P?w${i{Pww{wV e we q Piwi|$wPw||w|V wV | wMkPPAhP$||2|${{2{Ph^2^${){ { V wV { w {8{$wUw{{w{V {${3{w{Y {Y ^ w^ {P(PP Z Z Z Pw${3ww{V wV { w { w  P ( P P${q{{y{V {${q{{y{V {Rt R@BwBIwIMwMNw NRw(Rkw0@WUW\k\Z]PerPrSVPkSG]k]grQrPQPQpqwqww ptUp{T{USPPw&wUTU0T4&T+]@CPSTWP&S!VP&&<S (H  V )* ^  V *)3 ^  )3p x   B   .3 d i ).xS(HX`Qo8@(Mej] z 0&9@&|joW]QTCI&&.symtab.strtab.shstrtab.gnu.hash.dynsym.dynstr.gnu.version.gnu.version_r.rela.dyn.rela.plt.init.text.fini.rodata.eh_frame_hdr.eh_frame.ctors.dtors.jcr.dynamic.got.got.plt.data.bss.comment.debug_aranges.debug_pubnames.debug_info.debug_abbrev.debug_line.debug_frame.debug_str.debug_loc.debug_rangesxo`% hh(-\5o nBo` ` @Q [  e`kHq&&w2&&X(X(L((- -- -- -- -/ /(/ /h`1 `1 1 1(12`34& [^d0'0e2Hw=`@KК $< h#h `       & &X((- - - - / / `1 1  !  '- 5- C- P f1 u1  - )-  &1 `2  1 . $gA @%FS/ i`1 v- -  9 ` # 71 Q &W1 g{ p.@N"j #+1  PB 5I uXi}2 1   initfini.ccall_gmon_startcrtstuff.c__CTOR_LIST____DTOR_LIST____JCR_LIST____do_global_dtors_auxcompleted.6997dtor_idx.6999frame_dummy__CTOR_END____FRAME_END____JCR_END____do_global_ctors_auxRealDisplaySizeMM.cRealDisplaySizeMM_methodsxrr_found.15586_XRRGetScreenResourcesCurrent.15589GetXRandROutputXIDRealDisplaySizeMM_GLOBAL_OFFSET_TABLE___dso_handle__DTOR_END___DYNAMICXineramaQueryScreensXFreeXRRFreeScreenResourcesfree_a_disppathXRRFreeCrtcInfoPy_InitModule4_64XRRGetOutputInfonull_error_handler__gmon_start___Jv_RegisterClassesg_error_handler_triggered_finicallback_ddebugmalloc@@GLIBC_2.2.5XineramaQueryExtensioninitRealDisplaySizeMMXRRQueryExtensionXRRGetCrtcGammaXRRQueryVersiondlsymXOpenDisplay__strcat_chk@@GLIBC_2.3.4PyArg_ParseTuple__strdup@@GLIBC_2.2.5free@@GLIBC_2.2.5XCloseDisplay__cxa_finalize@@GLIBC_2.2.5XF86VidModeQueryExtensionget_a_displaystrrchr@@GLIBC_2.2.5XRRGetScreenResourcesXRRFreeGammastrchr@@GLIBC_2.2.5getenv@@GLIBC_2.2.5Py_BuildValue__bss_startget_displays__stack_chk_fail@@GLIBC_2.4strcpy@@GLIBC_2.2.5free_disppathsXineramaIsActivecalloc@@GLIBC_2.2.5_endstrncpy@@GLIBC_2.2.5XRRGetCrtcInfo__sprintf_chk@@GLIBC_2.3.4XSetErrorHandlerXF86VidModeGetMonitorrealloc@@GLIBC_2.2.5_edatadlopenXRRFreeOutputInfo_initDisplayCAL-3.1.0.0/DisplayCAL/lib64/RealDisplaySizeMM.so0000644000076500000000000007605012650252610022207 0ustar devwheel00000000000000+ @<(  t__TEXT__text__TEXT__symbol_stub__TEXT __stub_helper__TEXT __cstring__TEXT.__unwind_info__TEXTH__DATA__nl_symbol_ptr__DATA __la_symbol_ptr__DATA \ __data__DATAh0h__cfstring__DATA__common__DATA8__LINKEDIT   "0  h "@#E@' P%%+|&1e47 ]@$  * 4/usr/lib/libSystem.B.dylib& # +,#USWVXt @ED$D$$1 ($1D$|$$t<$1@D$$F1\&D$$ HG9rЉى\1t P d L H DT<$`$XD$$ÉhƉ\$$woA$D$PD$ $`5DžaD$pL$t<$1Džlt$D$Džu7t$$D$ D$2tDtp$D$ƅu5pt$$D$ D$2dDt;t7dD$<$u!t$u4$D$1ElC9ht$Tp$F`$lXufE)EnownE(unkElTƋHtH pHh@`\$HELD$$`D$ hD$pD$tD$t$DD$ 4$D$D$Rl$h 4$S AC\9΋D$x$,t,p,|؉,xz߉ËJ pB tA$_<$\$4$$`$ T$ĉÅɋT\t $@t$4`$<$14$( $ @;Eu ^_[]UVPutGt7t $FHt $F$ũ^]^]UVPut't$zFt$k^]a^]USWV 1M9tG4u$=1E$ÅuE׋FCFCNK$uC$$봋u@$Cu$4$k4$߉ ^_[]UXmL$$D$D$ D$2]USWVYMED$oD$E $1tTE$1ۅt#F$4$fn,fn,@\$|$E썀q$^_[]UVXML$t$E $fu14$D$T^]% %%%%% %$%(%,%0%4%8%<%@%D%H%L%P%T%X%\%`%dhhh@zh\phmfh\hRhHh>h4h *h) hNhf h{h%hhhhhhhhDisplayProductNameen_US(unknown)%s, at %d, %d, width %d, height %d%s (Primary Display)RealDisplaySizeMMRealDisplaySizeMM(int displayNum) Return the size (in mm) of a given display.GetXRandROutputXIDGetXRandROutputXID(int displayNum) Return the XRandR output X11 ID of a given display.i(i,i)44 4    8BLV`jt~1 D W! `ASApQ ppQ>@___CFConstantStringClassReferenceQq@___stack_chk_guard@dyld_stub_binderq >@_CFDictionaryGetCountq>@_CFDictionaryGetKeysAndValuesq>@_CFDictionaryGetValueq>@_CFReleaseq>@_CFStringGetCStringq >@_CFStringGetCStringPtrq$>@_CGDisplayBoundsq(>@_CGDisplayIOServicePortq,>@_CGDisplayIsMainq0>@_CGDisplayScreenSizeq4>@_CGGetActiveDisplayListq8>@_IODisplayCreateInfoDictionaryq<>@_PyArg_ParseTupleq@>@_Py_BuildValueqD>@_Py_InitModule4qH@___sprintf_chkqL@___stack_chk_failqP@_callocqT@_freeqX@_mallocq\@_strcmpq`@_strdupqd@_strncpy_get_>free_ZinitRealDisplaySizeMMcallback_ddebugdisplaysUa_display} disppathssa_disppathx! Y9A d'dFfV.$$N. $ $YNY. $ $9N9. $ $N. $ $ANA.1 $1 $N. $ $GNG&&hA dR1 e yh     .DOcz!1Sbt+,-./0123456789;<>?@ABCD@=+,-./0123456789;<>?@ABC /Users/Shared/dispcalGUI/displaycal/DisplayCAL/RealDisplaySizeMM.c/Users/Shared/dispcalGUI/displaycal/build/temp.macosx-10.8-intel-2.7/DisplayCAL/RealDisplaySizeMM.o_get_displays_free_disppaths_free_a_disppath_get_a_display_initRealDisplaySizeMM_RealDisplaySizeMM_GetXRandROutputXID_RealDisplaySizeMM_methods_callback_ddebug_RealDisplaySizeMM_GetXRandROutputXID_RealDisplaySizeMM_methods_callback_ddebug_free_a_disppath_free_disppaths_get_a_display_get_displays_initRealDisplaySizeMM_CFDictionaryGetCount_CFDictionaryGetKeysAndValues_CFDictionaryGetValue_CFRelease_CFStringGetCString_CFStringGetCStringPtr_CGDisplayBounds_CGDisplayIOServicePort_CGDisplayIsMain_CGDisplayScreenSize_CGGetActiveDisplayList_IODisplayCreateInfoDictionary_PyArg_ParseTuple_Py_BuildValue_Py_InitModule4___CFConstantStringClassReference___sprintf_chk___stack_chk_fail___stack_chk_guard_calloc_free_malloc_strcmp_strdup_strncpydyld_stub_binder (__TEXT __text__TEXTYIY__stubs__TEXT__stub_helper__TEXT,,__cstring__TEXT$.$__unwind_info__TEXTRlR__eh_frame__TEXT@(__DATA  __got__DATA  __nl_symbol_ptr__DATA  __la_symbol_ptr__DATA  __data__DATA ` __cfstring__DATA0! 0!__common__DATAP!H__LINKEDIT00( "000`p0 2D3EX8 P%%+71=2%O3$  * 8/usr/lib/libSystem.B.dylib& 3+03UHAWAVAUATSHHH HHEE1H<11P<qiH<cILE1MFHHLHHH;EuLHH[A\A]A^A_]UHAWAVSPIMt`I>HtFMHHt HI?HGHt HI?HcMh4h *h) hNhf h|LEAS%5hhhhhhhhDisplayProductNameen_US(unknown)%s, at %d, %d, width %d, height %d%s (Primary Display)RealDisplaySizeMMRealDisplaySizeMM(int displayNum) Return the size (in mm) of a given display.GetXRandROutputXIDGetXRandROutputXID(int displayNum) Return the XRandR output X11 ID of a given display.i(i,i)((XY@@@ ([p azRx ,yAC P$L'}AC F$t|>AC B,AC J$9"AC $3yAC E$>AC ,6@JT^hr|d$!`ASAp0Q>@___CFConstantStringClassReferenceQq@___stack_chk_guard@dyld_stub_binderq>@_CFDictionaryGetCountq >@_CFDictionaryGetKeysAndValuesq(>@_CFDictionaryGetValueq0>@_CFReleaseq8>@_CFStringGetCStringq@>@_CFStringGetCStringPtrqH>@_CGDisplayBoundsqP>@_CGDisplayIOServicePortqX>@_CGDisplayIsMainq`>@_CGDisplayScreenSizeqh>@_CGGetActiveDisplayListqp>@_IODisplayCreateInfoDictionaryqx>@_PyArg_ParseTupleq>@_Py_BuildValueq>@_Py_InitModule4_64q@___sprintf_chkq@___stack_chk_failq@_callocq@_freeq@_mallocq@_strcmpq@_strdupq@_strncpy_get_>free_ZinitRealDisplaySizeMMcallback_ddebugdisplaysUa_display}(disppathssa_disppathx2335B( }>"y d'dFfV.Y$Y$N.7$7$}N}.$$>N>.$$N.$$"N".$$yNy.d$d$>N>&& A dRedy  P!7Y.DOcz!4Vew+,-./0123456789;<>?@ABC=D@+,-./0123456789;<>?@ABC /Users/Shared/dispcalGUI/displaycal/DisplayCAL/RealDisplaySizeMM.c/Users/Shared/dispcalGUI/displaycal/build/temp.macosx-10.8-intel-2.7/DisplayCAL/RealDisplaySizeMM.o_get_displays_free_disppaths_free_a_disppath_get_a_display_initRealDisplaySizeMM_RealDisplaySizeMM_GetXRandROutputXID_RealDisplaySizeMM_methods_callback_ddebug_RealDisplaySizeMM_GetXRandROutputXID_RealDisplaySizeMM_methods_callback_ddebug_free_a_disppath_free_disppaths_get_a_display_get_displays_initRealDisplaySizeMM_CFDictionaryGetCount_CFDictionaryGetKeysAndValues_CFDictionaryGetValue_CFRelease_CFStringGetCString_CFStringGetCStringPtr_CGDisplayBounds_CGDisplayIOServicePort_CGDisplayIsMain_CGDisplayScreenSize_CGGetActiveDisplayList_IODisplayCreateInfoDictionary_PyArg_ParseTuple_Py_BuildValue_Py_InitModule4_64___CFConstantStringClassReference___sprintf_chk___stack_chk_fail___stack_chk_guard_calloc_free_malloc_strcmp_strdup_strncpydyld_stub_binderDisplayCAL-3.1.0.0/DisplayCAL/linear.cal0000644000076500000000000002330412647526531017367 0ustar devwheel00000000000000CAL DESCRIPTOR "Argyll Device Calibration Curves" ORIGINATOR "Argyll synthcal" CREATED "Sun Oct 06 00:13:42 2013" KEYWORD "DEVICE_CLASS" DEVICE_CLASS "DISPLAY" KEYWORD "COLOR_REP" COLOR_REP "RGB" KEYWORD "RGB_I" NUMBER_OF_FIELDS 4 BEGIN_DATA_FORMAT RGB_I RGB_R RGB_G RGB_B END_DATA_FORMAT NUMBER_OF_SETS 256 BEGIN_DATA 0.00000 0.00000 0.00000 0.00000 3.92157e-003 3.92157e-003 3.92157e-003 3.92157e-003 7.84314e-003 7.84314e-003 7.84314e-003 7.84314e-003 0.0117647 0.0117647 0.0117647 0.0117647 0.0156863 0.0156863 0.0156863 0.0156863 0.0196078 0.0196078 0.0196078 0.0196078 0.0235294 0.0235294 0.0235294 0.0235294 0.0274510 0.0274510 0.0274510 0.0274510 0.0313725 0.0313725 0.0313725 0.0313725 0.0352941 0.0352941 0.0352941 0.0352941 0.0392157 0.0392157 0.0392157 0.0392157 0.0431373 0.0431373 0.0431373 0.0431373 0.0470588 0.0470588 0.0470588 0.0470588 0.0509804 0.0509804 0.0509804 0.0509804 0.0549020 0.0549020 0.0549020 0.0549020 0.0588235 0.0588235 0.0588235 0.0588235 0.0627451 0.0627451 0.0627451 0.0627451 0.0666667 0.0666667 0.0666667 0.0666667 0.0705882 0.0705882 0.0705882 0.0705882 0.0745098 0.0745098 0.0745098 0.0745098 0.0784314 0.0784314 0.0784314 0.0784314 0.0823529 0.0823529 0.0823529 0.0823529 0.0862745 0.0862745 0.0862745 0.0862745 0.0901961 0.0901961 0.0901961 0.0901961 0.0941176 0.0941176 0.0941176 0.0941176 0.0980392 0.0980392 0.0980392 0.0980392 0.101961 0.101961 0.101961 0.101961 0.105882 0.105882 0.105882 0.105882 0.109804 0.109804 0.109804 0.109804 0.113725 0.113725 0.113725 0.113725 0.117647 0.117647 0.117647 0.117647 0.121569 0.121569 0.121569 0.121569 0.125490 0.125490 0.125490 0.125490 0.129412 0.129412 0.129412 0.129412 0.133333 0.133333 0.133333 0.133333 0.137255 0.137255 0.137255 0.137255 0.141176 0.141176 0.141176 0.141176 0.145098 0.145098 0.145098 0.145098 0.149020 0.149020 0.149020 0.149020 0.152941 0.152941 0.152941 0.152941 0.156863 0.156863 0.156863 0.156863 0.160784 0.160784 0.160784 0.160784 0.164706 0.164706 0.164706 0.164706 0.168627 0.168627 0.168627 0.168627 0.172549 0.172549 0.172549 0.172549 0.176471 0.176471 0.176471 0.176471 0.180392 0.180392 0.180392 0.180392 0.184314 0.184314 0.184314 0.184314 0.188235 0.188235 0.188235 0.188235 0.192157 0.192157 0.192157 0.192157 0.196078 0.196078 0.196078 0.196078 0.200000 0.200000 0.200000 0.200000 0.203922 0.203922 0.203922 0.203922 0.207843 0.207843 0.207843 0.207843 0.211765 0.211765 0.211765 0.211765 0.215686 0.215686 0.215686 0.215686 0.219608 0.219608 0.219608 0.219608 0.223529 0.223529 0.223529 0.223529 0.227451 0.227451 0.227451 0.227451 0.231373 0.231373 0.231373 0.231373 0.235294 0.235294 0.235294 0.235294 0.239216 0.239216 0.239216 0.239216 0.243137 0.243137 0.243137 0.243137 0.247059 0.247059 0.247059 0.247059 0.250980 0.250980 0.250980 0.250980 0.254902 0.254902 0.254902 0.254902 0.258824 0.258824 0.258824 0.258824 0.262745 0.262745 0.262745 0.262745 0.266667 0.266667 0.266667 0.266667 0.270588 0.270588 0.270588 0.270588 0.274510 0.274510 0.274510 0.274510 0.278431 0.278431 0.278431 0.278431 0.282353 0.282353 0.282353 0.282353 0.286275 0.286275 0.286275 0.286275 0.290196 0.290196 0.290196 0.290196 0.294118 0.294118 0.294118 0.294118 0.298039 0.298039 0.298039 0.298039 0.301961 0.301961 0.301961 0.301961 0.305882 0.305882 0.305882 0.305882 0.309804 0.309804 0.309804 0.309804 0.313725 0.313725 0.313725 0.313725 0.317647 0.317647 0.317647 0.317647 0.321569 0.321569 0.321569 0.321569 0.325490 0.325490 0.325490 0.325490 0.329412 0.329412 0.329412 0.329412 0.333333 0.333333 0.333333 0.333333 0.337255 0.337255 0.337255 0.337255 0.341176 0.341176 0.341176 0.341176 0.345098 0.345098 0.345098 0.345098 0.349020 0.349020 0.349020 0.349020 0.352941 0.352941 0.352941 0.352941 0.356863 0.356863 0.356863 0.356863 0.360784 0.360784 0.360784 0.360784 0.364706 0.364706 0.364706 0.364706 0.368627 0.368627 0.368627 0.368627 0.372549 0.372549 0.372549 0.372549 0.376471 0.376471 0.376471 0.376471 0.380392 0.380392 0.380392 0.380392 0.384314 0.384314 0.384314 0.384314 0.388235 0.388235 0.388235 0.388235 0.392157 0.392157 0.392157 0.392157 0.396078 0.396078 0.396078 0.396078 0.400000 0.400000 0.400000 0.400000 0.403922 0.403922 0.403922 0.403922 0.407843 0.407843 0.407843 0.407843 0.411765 0.411765 0.411765 0.411765 0.415686 0.415686 0.415686 0.415686 0.419608 0.419608 0.419608 0.419608 0.423529 0.423529 0.423529 0.423529 0.427451 0.427451 0.427451 0.427451 0.431373 0.431373 0.431373 0.431373 0.435294 0.435294 0.435294 0.435294 0.439216 0.439216 0.439216 0.439216 0.443137 0.443137 0.443137 0.443137 0.447059 0.447059 0.447059 0.447059 0.450980 0.450980 0.450980 0.450980 0.454902 0.454902 0.454902 0.454902 0.458824 0.458824 0.458824 0.458824 0.462745 0.462745 0.462745 0.462745 0.466667 0.466667 0.466667 0.466667 0.470588 0.470588 0.470588 0.470588 0.474510 0.474510 0.474510 0.474510 0.478431 0.478431 0.478431 0.478431 0.482353 0.482353 0.482353 0.482353 0.486275 0.486275 0.486275 0.486275 0.490196 0.490196 0.490196 0.490196 0.494118 0.494118 0.494118 0.494118 0.498039 0.498039 0.498039 0.498039 0.501961 0.501961 0.501961 0.501961 0.505882 0.505882 0.505882 0.505882 0.509804 0.509804 0.509804 0.509804 0.513725 0.513725 0.513725 0.513725 0.517647 0.517647 0.517647 0.517647 0.521569 0.521569 0.521569 0.521569 0.525490 0.525490 0.525490 0.525490 0.529412 0.529412 0.529412 0.529412 0.533333 0.533333 0.533333 0.533333 0.537255 0.537255 0.537255 0.537255 0.541176 0.541176 0.541176 0.541176 0.545098 0.545098 0.545098 0.545098 0.549020 0.549020 0.549020 0.549020 0.552941 0.552941 0.552941 0.552941 0.556863 0.556863 0.556863 0.556863 0.560784 0.560784 0.560784 0.560784 0.564706 0.564706 0.564706 0.564706 0.568627 0.568627 0.568627 0.568627 0.572549 0.572549 0.572549 0.572549 0.576471 0.576471 0.576471 0.576471 0.580392 0.580392 0.580392 0.580392 0.584314 0.584314 0.584314 0.584314 0.588235 0.588235 0.588235 0.588235 0.592157 0.592157 0.592157 0.592157 0.596078 0.596078 0.596078 0.596078 0.600000 0.600000 0.600000 0.600000 0.603922 0.603922 0.603922 0.603922 0.607843 0.607843 0.607843 0.607843 0.611765 0.611765 0.611765 0.611765 0.615686 0.615686 0.615686 0.615686 0.619608 0.619608 0.619608 0.619608 0.623529 0.623529 0.623529 0.623529 0.627451 0.627451 0.627451 0.627451 0.631373 0.631373 0.631373 0.631373 0.635294 0.635294 0.635294 0.635294 0.639216 0.639216 0.639216 0.639216 0.643137 0.643137 0.643137 0.643137 0.647059 0.647059 0.647059 0.647059 0.650980 0.650980 0.650980 0.650980 0.654902 0.654902 0.654902 0.654902 0.658824 0.658824 0.658824 0.658824 0.662745 0.662745 0.662745 0.662745 0.666667 0.666667 0.666667 0.666667 0.670588 0.670588 0.670588 0.670588 0.674510 0.674510 0.674510 0.674510 0.678431 0.678431 0.678431 0.678431 0.682353 0.682353 0.682353 0.682353 0.686275 0.686275 0.686275 0.686275 0.690196 0.690196 0.690196 0.690196 0.694118 0.694118 0.694118 0.694118 0.698039 0.698039 0.698039 0.698039 0.701961 0.701961 0.701961 0.701961 0.705882 0.705882 0.705882 0.705882 0.709804 0.709804 0.709804 0.709804 0.713725 0.713725 0.713725 0.713725 0.717647 0.717647 0.717647 0.717647 0.721569 0.721569 0.721569 0.721569 0.725490 0.725490 0.725490 0.725490 0.729412 0.729412 0.729412 0.729412 0.733333 0.733333 0.733333 0.733333 0.737255 0.737255 0.737255 0.737255 0.741176 0.741176 0.741176 0.741176 0.745098 0.745098 0.745098 0.745098 0.749020 0.749020 0.749020 0.749020 0.752941 0.752941 0.752941 0.752941 0.756863 0.756863 0.756863 0.756863 0.760784 0.760784 0.760784 0.760784 0.764706 0.764706 0.764706 0.764706 0.768627 0.768627 0.768627 0.768627 0.772549 0.772549 0.772549 0.772549 0.776471 0.776471 0.776471 0.776471 0.780392 0.780392 0.780392 0.780392 0.784314 0.784314 0.784314 0.784314 0.788235 0.788235 0.788235 0.788235 0.792157 0.792157 0.792157 0.792157 0.796078 0.796078 0.796078 0.796078 0.800000 0.800000 0.800000 0.800000 0.803922 0.803922 0.803922 0.803922 0.807843 0.807843 0.807843 0.807843 0.811765 0.811765 0.811765 0.811765 0.815686 0.815686 0.815686 0.815686 0.819608 0.819608 0.819608 0.819608 0.823529 0.823529 0.823529 0.823529 0.827451 0.827451 0.827451 0.827451 0.831373 0.831373 0.831373 0.831373 0.835294 0.835294 0.835294 0.835294 0.839216 0.839216 0.839216 0.839216 0.843137 0.843137 0.843137 0.843137 0.847059 0.847059 0.847059 0.847059 0.850980 0.850980 0.850980 0.850980 0.854902 0.854902 0.854902 0.854902 0.858824 0.858824 0.858824 0.858824 0.862745 0.862745 0.862745 0.862745 0.866667 0.866667 0.866667 0.866667 0.870588 0.870588 0.870588 0.870588 0.874510 0.874510 0.874510 0.874510 0.878431 0.878431 0.878431 0.878431 0.882353 0.882353 0.882353 0.882353 0.886275 0.886275 0.886275 0.886275 0.890196 0.890196 0.890196 0.890196 0.894118 0.894118 0.894118 0.894118 0.898039 0.898039 0.898039 0.898039 0.901961 0.901961 0.901961 0.901961 0.905882 0.905882 0.905882 0.905882 0.909804 0.909804 0.909804 0.909804 0.913725 0.913725 0.913725 0.913725 0.917647 0.917647 0.917647 0.917647 0.921569 0.921569 0.921569 0.921569 0.925490 0.925490 0.925490 0.925490 0.929412 0.929412 0.929412 0.929412 0.933333 0.933333 0.933333 0.933333 0.937255 0.937255 0.937255 0.937255 0.941176 0.941176 0.941176 0.941176 0.945098 0.945098 0.945098 0.945098 0.949020 0.949020 0.949020 0.949020 0.952941 0.952941 0.952941 0.952941 0.956863 0.956863 0.956863 0.956863 0.960784 0.960784 0.960784 0.960784 0.964706 0.964706 0.964706 0.964706 0.968627 0.968627 0.968627 0.968627 0.972549 0.972549 0.972549 0.972549 0.976471 0.976471 0.976471 0.976471 0.980392 0.980392 0.980392 0.980392 0.984314 0.984314 0.984314 0.984314 0.988235 0.988235 0.988235 0.988235 0.992157 0.992157 0.992157 0.992157 0.996078 0.996078 0.996078 0.996078 1.00000 1.00000 1.00000 1.00000 END_DATA DisplayCAL-3.1.0.0/DisplayCAL/localization.py0000644000076500000000000000733312647526531020502 0ustar devwheel00000000000000# -*- coding: utf-8 -*- import __builtin__ import locale import os import re import demjson from config import data_dirs, defaults, getcfg, storage from debughelpers import handle_error from jsondict import JSONDict from log import safe_print from util_os import expanduseru from util_str import safe_unicode def init(set_wx_locale=False): """ Populate translation dict with found language strings and set locale. If set_wx_locale is True, set locale also for wxPython. """ langdirs = [] for dir_ in data_dirs: langdirs.append(os.path.join(dir_, "lang")) for langdir in langdirs: if os.path.exists(langdir) and os.path.isdir(langdir): try: langfiles = os.listdir(langdir) except Exception, exception: safe_print(u"Warning - directory '%s' listing failed: %s" % tuple(safe_unicode(s) for s in (langdir, exception))) else: for filename in langfiles: name, ext = os.path.splitext(filename) if ext.lower() == ".json" and name.lower() not in ldict: path = os.path.join(langdir, filename) ldict[name.lower()] = JSONDict(path) if len(ldict) == 0: handle_error(UserWarning("Warning: No language files found. The " "following places have been searched:\n%s" % "\n".join(langdirs))) def update_defaults(): defaults.update({ "last_3dlut_path": os.path.join(expanduseru("~"), getstr("unnamed")), "last_archive_save_path": os.path.join(expanduseru("~"), getstr("unnamed")), "last_cal_path": os.path.join(storage, getstr("unnamed")), "last_cal_or_icc_path": os.path.join(storage, getstr("unnamed")), "last_colorimeter_ti3_path": os.path.join(expanduseru("~"), getstr("unnamed")), "last_testchart_export_path": os.path.join(expanduseru("~"), getstr("unnamed")), "last_filedialog_path": os.path.join(expanduseru("~"), getstr("unnamed")), "last_icc_path": os.path.join(storage, getstr("unnamed")), "last_reference_ti3_path": os.path.join(expanduseru("~"), getstr("unnamed")), "last_ti1_path": os.path.join(storage, getstr("unnamed")), "last_ti3_path": os.path.join(storage, getstr("unnamed")), "last_vrml_path": os.path.join(storage, getstr("unnamed")) }) def getcode(): """ Get language code from config """ lcode = getcfg("lang") if not lcode in ldict: # fall back to default lcode = defaults["lang"] if not lcode in ldict: # fall back to english lcode = "en" return lcode def getstr(id_str, strvars=None, lcode=None): """ Get a translated string from the dictionary """ if not lcode: lcode = getcode() if not lcode in ldict or not id_str in ldict[lcode]: # fall back to english lcode = "en" if lcode in ldict and id_str in ldict[lcode]: lstr = ldict[lcode][id_str] if strvars is not None: if not isinstance(strvars, (list, tuple)): strvars = [strvars] fmt = re.findall(r"%\d?(?:\.\d+)?[deEfFgGiorsxX]", lstr) if len(fmt) == len(strvars): if not isinstance(strvars, list): strvars = list(strvars) for i, s in enumerate(strvars): if fmt[i].endswith("s"): s = safe_unicode(s) elif not fmt[i].endswith("r"): try: if fmt[i][-1] in "dioxX": s = int(s) else: s = float(s) except ValueError: s = 0 strvars[i] = s lstr %= tuple(strvars) return lstr else: return id_str def gettext(text): if not catalog and defaults["lang"] in ldict: for id_str in ldict[defaults["lang"]]: lstr = ldict[defaults["lang"]][id_str] catalog[lstr] = {} catalog[lstr].id_str = id_str lcode = getcode() if catalog and text in catalog and not lcode in catalog[text]: catalog[text][lcode] = ldict[lcode].get(catalog[text].id_str, text) return catalog.get(text, {}).get(lcode, text) ldict = {} catalog = {} DisplayCAL-3.1.0.0/DisplayCAL/log.py0000644000076500000000000002136312647526531016572 0ustar devwheel00000000000000# -*- coding: utf-8 -*- from codecs import EncodedFile from hashlib import md5 import logging import logging.handlers import os import re import sys import warnings from time import localtime, strftime, time from meta import name as appname, script2pywname from options import debug from safe_print import SafePrinter, safe_print as _safe_print from util_io import StringIOu as StringIO from util_str import safe_str, safe_unicode logging.raiseExceptions = 0 logging._warnings_showwarning = warnings.showwarning if debug: loglevel = logging.DEBUG else: loglevel = logging.INFO logger = None def showwarning(message, category, filename, lineno, file=None, line=""): """ Implementation of showwarnings which redirects to logging, which will first check to see if the file parameter is None. If a file is specified, it will delegate to the original warnings implementation of showwarning. Otherwise, it will call warnings.formatwarning and will log the resulting string to a warnings logger named "py.warnings" with level logging.WARNING. UNlike the default implementation, the line is omitted from the warning, and the warning does not end with a newline. """ if file is not None: if logging._warnings_showwarning is not None: logging._warnings_showwarning(message, category, filename, lineno, file, line) else: s = warnings.formatwarning(message, category, filename, lineno, line) logger = logging.getLogger("py.warnings") if not logger.handlers: if hasattr(sys.stderr, "isatty") and sys.stderr.isatty(): handler = logging.StreamHandler() else: handler = logging.NullHandler() logger.addHandler(handler) logger.warning("%s", s.strip()) warnings.showwarning = showwarning logbuffer = EncodedFile(StringIO(), "UTF-8", errors="replace") def wx_log(logwindow, msg): if logwindow.IsShownOnScreen(): logwindow.Log(msg) class DummyLogger(): def critical(self, msg, *args, **kwargs): pass def debug(self, msg, *args, **kwargs): pass def error(self, msg, *args, **kwargs): pass def exception(self, msg, *args, **kwargs): pass def info(self, msg, *args, **kwargs): pass def log(self, level, msg, *args, **kwargs): pass def warning(self, msg, *args, **kwargs): pass class Log(): def __call__(self, msg, fn=None): """ Log a message. Optionally use function 'fn' instead of logging.info. """ global logger msg = msg.replace("\r\n", "\n").replace("\r", "") if fn is None and logger and logger.handlers: fn = logger.info if fn: for line in msg.split("\n"): fn(line) if "wx" in sys.modules: from wxaddons import wx if wx.GetApp() is not None and \ hasattr(wx.GetApp(), "frame") and \ hasattr(wx.GetApp().frame, "infoframe"): wx.CallAfter(wx_log, wx.GetApp().frame.infoframe, msg) def flush(self): pass def write(self, msg): self(msg.rstrip()) log = Log() class LogFile(): """ Logfile class. Default is to not rotate. """ def __init__(self, filename, logdir, when="never", backupCount=0): self._logger = get_file_logger(md5(safe_str(filename, "UTF-8")).hexdigest(), when=when, backupCount=backupCount, logdir=logdir, filename=filename) def close(self): for handler in reversed(self._logger.handlers): handler.close() self._logger.removeHandler(handler) def flush(self): for handler in self._logger.handlers: handler.flush() def write(self, msg): for line in msg.rstrip().replace("\r\n", "\n").replace("\r", "").split("\n"): self._logger.info(line) class SafeLogger(SafePrinter): """ Print and log safely, avoiding any UnicodeDe-/EncodingErrors on strings and converting all other objects to safe string representations. """ def __init__(self, log=True, print_=hasattr(sys.stdout, "isatty") and sys.stdout.isatty()): SafePrinter.__init__(self) self.log = log self.print_ = print_ def write(self, *args, **kwargs): if kwargs.get("print_", self.print_): _safe_print(*args, **kwargs) if kwargs.get("log", self.log): kwargs.update(fn=log, encoding=None) _safe_print(*args, **kwargs) safe_log = SafeLogger(print_=False) safe_print = SafeLogger() def get_file_logger(name, level=loglevel, when="midnight", backupCount=5, logdir=None, filename=None): """ Return logger object. A TimedRotatingFileHandler (if when == "never") or FileHandler will be used. """ global _logdir if logdir is None: logdir = _logdir logger = logging.getLogger(name) if not filename: filename = name logfile = os.path.join(logdir, filename + ".log") for handler in logger.handlers: if (isinstance(handler, logging.FileHandler) and handler.baseFilename == os.path.abspath(logfile)): return logger logger.propagate = 0 logger.setLevel(level) if not os.path.exists(logdir): try: os.makedirs(logdir) except Exception, exception: safe_print(u"Warning - log directory '%s' could not be created: %s" % tuple(safe_unicode(s) for s in (logdir, exception))) elif when != "never" and os.path.exists(logfile): try: logstat = os.stat(logfile) except Exception, exception: safe_print(u"Warning - os.stat('%s') failed: %s" % tuple(safe_unicode(s) for s in (logfile, exception))) else: # rollover needed? t = logstat.st_mtime try: mtime = localtime(t) except ValueError, exception: # This can happen on Windows because localtime() is buggy on # that platform. See: # http://stackoverflow.com/questions/4434629/zipfile-module-in-python-runtime-problems # http://bugs.python.org/issue1760357 # To overcome this problem, we ignore the real modification # date and force a rollover t = time() - 60 * 60 * 24 mtime = localtime(t) # Deal with DST now = localtime() dstNow = now[-1] dstThen = mtime[-1] if dstNow != dstThen: if dstNow: addend = 3600 else: addend = -3600 mtime = localtime(t + addend) if now[:3] > mtime[:3]: # do rollover logbackup = logfile + strftime(".%Y-%m-%d", mtime) if os.path.exists(logbackup): try: os.remove(logbackup) except Exception, exception: safe_print(u"Warning - logfile backup '%s' could not " u"be removed during rollover: %s" % tuple(safe_unicode(s) for s in (logbackup, exception))) try: os.rename(logfile, logbackup) except Exception, exception: safe_print(u"Warning - logfile '%s' could not be renamed " u"to '%s' during rollover: %s" % tuple(safe_unicode(s) for s in (logfile, os.path.basename(logbackup), exception))) # Adapted from Python 2.6's # logging.handlers.TimedRotatingFileHandler.getFilesToDelete extMatch = re.compile(r"^\d{4}-\d{2}-\d{2}$") baseName = os.path.basename(logfile) try: fileNames = os.listdir(logdir) except Exception, exception: safe_print(u"Warning - log directory '%s' listing failed " u"during rollover: %s" % tuple(safe_unicode(s) for s in (logdir, exception))) else: result = [] prefix = baseName + "." plen = len(prefix) for fileName in fileNames: if fileName[:plen] == prefix: suffix = fileName[plen:] if extMatch.match(suffix): result.append(os.path.join(logdir, fileName)) result.sort() if len(result) > backupCount: for logbackup in result[:len(result) - backupCount]: try: os.remove(logbackup) except Exception, exception: safe_print(u"Warning - logfile backup '%s' " u"could not be removed during " u"rollover: %s" % tuple(safe_unicode(s) for s in (logbackup, exception))) if os.path.exists(logdir): try: if when != "never": filehandler = logging.handlers.TimedRotatingFileHandler(logfile, when=when, backupCount=backupCount) else: filehandler = logging.FileHandler(logfile) fileformatter = logging.Formatter("%(asctime)s %(message)s") filehandler.setFormatter(fileformatter) logger.addHandler(filehandler) except Exception, exception: safe_print(u"Warning - logging to file '%s' not possible: %s" % tuple(safe_unicode(s) for s in (logfile, exception))) return logger def setup_logging(logdir, name=appname, ext=".py", backupCount=5): """ Setup the logging facility. """ global _logdir, logger _logdir = logdir name = script2pywname(name) if (name.startswith(appname) or name.startswith("dispcalGUI") or ext in (".app", ".exe", ".pyw")): logger = get_file_logger(None, loglevel, "midnight", backupCount, filename=name) streamhandler = logging.StreamHandler(logbuffer) streamformatter = logging.Formatter("%(asctime)s %(message)s") streamhandler.setFormatter(streamformatter) logger.addHandler(streamhandler) DisplayCAL-3.1.0.0/DisplayCAL/madvr.py0000644000076500000000000011513712653526636017130 0ustar devwheel00000000000000# -*- coding: utf-8 -*- # See developers/interfaces/madTPG.h in the madVR package from __future__ import with_statement from ConfigParser import RawConfigParser from StringIO import StringIO from binascii import unhexlify from time import sleep, time from zlib import crc32 import ctypes import errno import getpass import os import platform import socket import struct import sys import threading if sys.platform == "win32": import _winreg if sys.platform == "win32": import win32api import localization as lang from log import safe_print as log_safe_print from meta import name as appname, version from ordereddict import OrderedDict from util_str import safe_str, safe_unicode CALLBACK = ctypes.CFUNCTYPE(None, ctypes.c_void_p, ctypes.POINTER(None), ctypes.c_char_p, ctypes.c_ulong, ctypes.c_ulonglong, ctypes.c_char_p, ctypes.c_ulonglong, ctypes.c_bool) min_version = (0, 87, 14, 0) # Search for madTPG on the local PC, connect to the first found instance CM_ConnectToLocalInstance = 0 # Search for madTPG on the LAN, connect to the first found instance CM_ConnectToLanInstance = 1 # Start madTPG on the local PC and connect to it CM_StartLocalInstance = 2 # Search local PC and LAN, and let the user choose which instance to connect to CM_ShowListDialog = 3 # Let the user enter the IP address of a PC which runs madTPG, then connect CM_ShowIpAddrDialog = 4 # fail immediately CM_Fail = 5 _methodnames = ("ConnectEx", "Disable3dlut", "Enable3dlut", "GetBlackAndWhiteLevel", "GetDeviceGammaRamp", "GetSelected3dlut", "GetVersion", "IsDisableOsdButtonPressed", "IsStayOnTopButtonPressed", "IsUseFullscreenButtonPressed", "SetDisableOsdButton", "SetDeviceGammaRamp", "SetOsdText", "GetPatternConfig", "SetPatternConfig", "ShowProgressBar", "SetProgressBarPos", "SetSelected3dlut", "SetStayOnTopButton", "SetUseFullscreenButton", "ShowRGB", "ShowRGBEx", "Load3dlutFile", "Disconnect", "Quit", "Load3dlutFromArray256") _autonet_methodnames = ("AddConnectionCallback", "Listen", "Announce") _lock = threading.RLock() def safe_print(*args): with _lock: log_safe_print(*args) def inet_pton(ip_string): """ inet_pton(string) -> packed IP representation Convert an IP address in string format to the packed binary format used in low-level network functions. """ if ":" in ip_string: # IPv6 return "".join([unhexlify(block.rjust(4, "0")) for block in ip_string.split(":")]) else: # IPv4 return "".join([chr(int(block)) for block in ip_string.split(".")]) def trunc(value, length): """ For string types, return value truncated to length """ if isinstance(value, basestring): value = safe_str(value) if len(repr(value)) > length: value = value[:length - 3 - len(str(length)) - len(repr(value)) + len(value)] return "%r[:%i]" % (value, length) return repr(value) class H3DLUT(object): """ 3D LUT file format used by madVR """ # https://sourceforge.net/projects/thr3dlut def __init__(self, filename): with open(filename, "rb") as lut: data = lut.read() self.signature = data[:4] self.fileVersion = struct.unpack("B", c)[0] for c in struct.pack(">I", version.value)) return result and version def show_rgb(self, r, g, b, bgr=None, bgg=None, bgb=None): """ Shows a specific RGB color test pattern """ if not None in (bgr, bgg, bgb): return self.mad.madVR_ShowRGBEx(r, g, b, bgr, bgg, bgb) else: return self.mad.madVR_ShowRGB(r, g, b) @property def uri(self): return self.dllpath class MadTPG_Net(object): """ Implementation of madVR network protocol in pure python """ # Wireshark filter to help ananlyze traffic: # (tcp.dstport != 1900 and tcp.dstport != 443) or (udp.dstport != 1900 and udp.dstport != 137 and udp.dstport != 138 and udp.dstport != 5355 and udp.dstport != 547 and udp.dstport != 10111) def __init__(self): self._cast_sockets = {} self._casts = [] self._client_sockets = OrderedDict() self._commandno = 0 self._commands = {} hostname = socket.gethostname() self._host = socket.gethostbyname(hostname) self._incoming = {} self._ips = [i[4][0] for i in socket.getaddrinfo(hostname, None)] self._pid = 0 self._reset() self._server_sockets = {} self._threads = [] #self.broadcast_ports = (39568, 41513, 45817, 48591, 48912) self.broadcast_ports = (37018, 10658, 63922, 53181, 4287) self.clients = OrderedDict() self.debug = 0 self.listening = True #self.multicast_ports = (34761, ) self.multicast_ports = (51591, ) self._event_handlers = {"on_client_added": [], "on_client_confirmed": [], "on_client_removed": [], "on_client_updated": []} #self.server_ports = (37612, 43219, 47815, 48291, 48717) self.server_ports = (60562, 51130, 54184, 41916, 19902) ip = self._host.split(".") ip.pop() ip.append("255") self.broadcast_ip = ".".join(ip) self.multicast_ip = "235.117.220.191" def listen(self): self.listening = True # Connection listen sockets for port in self.server_ports: if ("", port) in self._server_sockets: continue sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) sock.settimeout(0) try: sock.bind(("", port)) sock.listen(1) thread = threading.Thread(target=self._conn_accept_handler, args=(sock, "", port)) self._threads.append(thread) thread.start() except socket.error, exception: safe_print("MadTPG_Net: TCP Port %i: %s" % (port, exception)) # Broadcast listen sockets for port in self.broadcast_ports: if (self.broadcast_ip, port) in self._cast_sockets: continue sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) sock.settimeout(0) try: sock.bind(("", port)) thread = threading.Thread(target=self._cast_receive_handler, args=(sock, self.broadcast_ip, port)) self._threads.append(thread) thread.start() except socket.error, exception: safe_print("MadTPG_Net: UDP Port %i: %s" % (port, exception)) # Multicast listen socket for port in self.multicast_ports: if (self.multicast_ip, port) in self._cast_sockets: continue sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 32) sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, struct.pack("4sl", socket.inet_aton(self.multicast_ip), socket.INADDR_ANY)) sock.settimeout(0) try: sock.bind(("", port)) thread = threading.Thread(target=self._cast_receive_handler, args=(sock, self.multicast_ip, port)) self._threads.append(thread) thread.start() except socket.error, exception: safe_print("MadTPG_Net: UDP Port %i: %s" % (port, exception)) def bind(self, event_name, handler): """ Bind a handler to an event """ if not event_name in self._event_handlers: self._event_handlers[event_name] = [] self._event_handlers[event_name].append(handler) def unbind(self, event_name, handler=None): """ Unbind (remove) a handler from an event If handler is None, remove all handlers for the event. """ if event_name in self._event_handlers: if handler in self._event_handlers[event_name]: self._event_handlers[event_name].remove(handler) return handler else: return self._event_handlers.pop(event_name) def _dispatch_event(self, event_name, event_data=None): """ Dispatch events """ if self.debug: safe_print("MadTPG_Net: Dispatching", event_name) for handler in self._event_handlers.get(event_name, []): handler(event_data) def _reset(self): self._client_socket = None def _conn_accept_handler(self, sock, host, port): if self.debug: safe_print("MadTPG_Net: Entering incoming connection thread for port", port) self._server_sockets[(host, port)] = sock while getattr(self, "listening", False): try: # Wait for connection conn, addr = sock.accept() except socket.timeout, exception: # Should never happen for non-blocking socket safe_print("MadTPG_Net: In incoming connection thread for port %i:" % port, exception) continue except socket.error, exception: if exception.errno == errno.EWOULDBLOCK: sleep(.05) continue safe_print("MadTPG_Net: Exception in incoming connection " "thread for %s:%i:" % addr[:2], exception) break conn.settimeout(0) with _lock: if self.debug: safe_print("MadTPG_Net: Incoming connection from %s:%s to %s:%s" % (addr[:2] + conn.getsockname()[:2])) if addr in self._client_sockets: if self.debug: safe_print("MadTPG_Net: Already connected from %s:%s to %s:%s" % (addr[:2] + conn.getsockname()[:2])) self._shutdown(conn, addr) else: self._client_sockets[addr] = conn thread = threading.Thread(target=self._receive_handler, args=(addr, conn, )) self._threads.append(thread) thread.start() self._server_sockets.pop((host, port)) self._shutdown(sock, (host, port)) if self.debug: safe_print("MadTPG_Net: Exiting incoming connection thread for port", port) def _receive_handler(self, addr, conn): if self.debug: safe_print("MadTPG_Net: Entering receiver thread for %s:%s" % addr[:2]) self._incoming[addr] = [] hello = self._hello(conn) blob = "" send_bye = True while (hello and addr in self._client_sockets and getattr(self, "listening", False)): # Wait for incoming message try: incoming = conn.recv(4096) except socket.timeout, exception: # Should never happen for non-blocking socket safe_print("MadTPG_Net: In receiver thread for %s:%i:" % addr[:2], exception) continue except socket.error, exception: if exception.errno == errno.EWOULDBLOCK: sleep(.001) continue if exception.errno not in (errno.EBADF, errno.ECONNRESET) or self.debug: safe_print("MadTPG_Net: In receiver thread for %s:%i:" % addr[:2], exception) send_bye = False break else: with _lock: if not incoming: # Connection broken if self.debug: safe_print("MadTPG_Net: Client %s:%i stopped sending" % addr[:2]) break blob += incoming if self.debug: safe_print("MadTPG_Net: Received from %s:%s:" % addr[:2]) while blob and addr in self._client_sockets: try: record, blob = self._parse(blob) except ValueError, exception: safe_print("MadTPG_Net:", exception) # Invalid, discard blob = "" else: if record is None: # Need more data break self._process(record, conn) with _lock: self._remove_client(addr, send_bye=addr in self._client_sockets and send_bye) self._incoming.pop(addr) if self.debug: safe_print("MadTPG_Net: Exiting receiver thread for %s:%s" % addr[:2]) def _remove_client(self, addr, send_bye=True): """ Remove client from list of connected clients """ if addr in self._client_sockets: conn = self._client_sockets.pop(addr) if send_bye: self._send(conn, "bye", component=self.clients.get(addr, {}).get("component", "")) if addr in self.clients: client = self.clients.pop(addr) if self.debug: safe_print("MadTPG_Net: Removed client %s:%i" % addr[:2]) self._dispatch_event("on_client_removed", (addr, client)) if (self._client_socket and self._client_socket == conn): self._reset() self._shutdown(conn, addr) def _cast_receive_handler(self, sock, host, port): if host == self.broadcast_ip: cast = "broadcast" elif host == self.multicast_ip: cast = "multicast" else: cast = "unknown" if self.debug: safe_print("MadTPG_Net: Entering receiver thread for %s port %i" % (cast, port)) self._cast_sockets[(host, port)] = sock while getattr(self, "listening", False): try: data, addr = sock.recvfrom(4096) except socket.timeout, exception: safe_print("MadTPG_Net: In receiver thread for %s port %i:" % (cast, port), exception) continue except socket.error, exception: if exception.errno == errno.EWOULDBLOCK: sleep(.05) continue if exception.errno != errno.ECONNRESET or self.debug: safe_print("MadTPG_Net: In receiver thread for %s port %i:" % (cast, port), exception) break else: with _lock: if self.debug: safe_print("MadTPG_Net: Received %s from %s:%s: %r" % (cast, addr[0], addr[1], data)) if not addr in self._casts: for c_port in self.server_ports: if (addr[0], c_port) in self._client_sockets: if self.debug: safe_print("MadTPG_Net: Already connected to %s:%s" % (addr[0], c_port)) elif (("", c_port) in self._server_sockets and addr[0] in self._ips): if self.debug: safe_print("MadTPG_Net: Don't connect to self %s:%s" % (addr[0], c_port)) else: conn = self._get_client_socket(addr[0], c_port) threading.Thread(target=self._connect, args=(conn, addr[0], c_port)).start() else: self._casts.remove(addr) if self.debug: safe_print("MadTPG_Net: Ignoring own %s from %s:%s" % (cast, addr[0], addr[1])) self._cast_sockets.pop((host, port)) self._shutdown(sock, (host, port)) if self.debug: safe_print("MadTPG_Net: Exiting %s receiver thread for port %i" % (cast, port)) def __del__(self): self.shutdown() def _shutdown(self, sock, addr): try: # Will fail if the socket isn't connected, i.e. if there # was an error during the call to connect() sock.shutdown(socket.SHUT_RDWR) except socket.error, exception: if exception.errno != errno.ENOTCONN: safe_print("MadTPG_Net: SHUT_RDWR for %s:%i failed:" % addr[:2], exception) sock.close() def shutdown(self): self.disconnect() self.listening = False while self._threads: thread = self._threads.pop() if thread.isAlive(): thread.join() def __getattr__(self, name): # Instead of writing individual method wrappers, we use Python's magic # to handle this for us. Note that we're sticking to pythonic method # names, so 'disable_3dlut' instead of 'Disable3dlut' etc. # Convert from pythonic method name to CamelCase methodname = "".join(part.capitalize() for part in name.split("_")) if methodname == "ShowRgb": methodname = "ShowRGB" # Check if this is a madVR method we support if methodname not in _methodnames: raise AttributeError("%r object has no attribute %r" % (self.__class__.__name__, name)) # Call the method and return the result return MadTPG_Net_Sender(self, self._client_socket, methodname) def announce(self): """ Anounce ourselves """ for port in self.multicast_ports: sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 32) sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_LOOP, 0) sock.settimeout(1) sock.connect((self.multicast_ip, port)) addr = sock.getsockname() self._casts.append(addr) if self.debug: safe_print("MadTPG_Net: Sending multicast from %s:%s to port %i" % (addr[0], addr[1], port)) sock.sendall(struct.pack(" inet_pton(remote[0]) or (inet_pton(local[0]) == inet_pton(remote[0]) and self.clients[remote]["processId"] < os.getpid())) def _expect(self, conn, commandno=-1, command=None, params=(), component="", timeout=3): """ Wait until expected reply or timeout. Return reply params or False. """ if not isinstance(params, (list, tuple)): params = (params, ) addr = conn.getpeername() start = end = time() while end - start < timeout: for reply in self._incoming.get(addr, []): r_commandno, r_command, r_params, r_component = reply if (commandno in (r_commandno, -1) and command in (r_command, None) and not params or (r_params in params) and component in (r_component, None)): self._incoming[addr].remove(reply) return r_params sleep(0.001) end = time() if self.debug: safe_print("MadTPG_Net: Timeout exceeded while waiting for reply") return False def _wait_for_client(self, addr=None, timeout=1): """ Wait for (first) madTPG client connection and handshake """ start = end = time() while end - start < timeout: clients = self.clients.copy() if clients: if addr: c_addrs = [addr] else: c_addrs = clients.keys() for c_addr in c_addrs: client = clients.get(c_addr) conn = self._client_sockets.get(c_addr) if (client and client["component"] == "madTPG" and client.get("confirmed") and conn and self._send(conn, "StartTestPattern")): self._client_socket = conn return True sleep(0.001) end = time() return False def _parse(self, blob=""): """ Consume blob, return record + remaining blob """ if len(blob) < 12: return None, blob crc = struct.unpack(" len(blob): raise ValueError("Corrupt madVR packet: Expected component " "len %i, got %i" % (b - a, len(blob[a:b]))) record["component"] = blob[a:b] a = b + 8 if a > len(blob): raise ValueError("Corrupt madVR packet: Expected instance " "len %i, got %i" % (a - b, len(blob[b:a]))) record["instance"] = struct.unpack(" len(blob): raise ValueError("Corrupt madVR packet: Expected sizeOfCommand " "len %i, got %i" % (b - a, len(blob[a:b]))) record["sizeOfCommand"] = struct.unpack(" len(blob): raise ValueError("Corrupt madVR packet: Expected command " "len %i, got %i" % (a - b, len(blob[b:a]))) record["command"] = command = blob[b:a] b = a + 4 if b > len(blob): raise ValueError("Corrupt madVR packet: Expected sizeOfParams " "len %i, got %i" % (b - a, len(blob[a:b]))) record["sizeOfParams"] = struct.unpack(" record["len"] + 12: raise ValueError("Corrupt madVR packet: Expected params " "len %i, got %i" % (a - b, len(blob[b:a]))) params = blob[b:a] if self.debug > 1: record["rawParams"] = params if command == "hello": io = StringIO("[Default]\n" + "\n".join(params.decode("UTF-16-LE", "replace").strip().split("\t"))) cfg = RawConfigParser() cfg.optionxform = str cfg.readfp(io) params = OrderedDict(cfg.items("Default")) # Convert version strings to tuples with integers for param in ("mvr", "exe"): param += "Version" if param in params: values = params[param].split(".") for i, value in enumerate(values): try: values[i] = int(value) except ValueError: pass params[param] = tuple(values) elif command == "reply": commandno = record["commandNo"] repliedcomamnd = self._commands.get(commandno) if repliedcomamnd: self._commands.pop(commandno) if repliedcomamnd == "GetBlackAndWhiteLevel": if len(params) == 8: params = struct.unpack(" 2: if isinstance(value, dict): safe_print(" %s:" % key) for subkey, subvalue in value.iteritems(): if self.debug < 2 and subkey != "exeFile": continue safe_print(" %s = %s" % (subkey.ljust(16), trunc(subvalue, 56))) elif self.debug > 1: safe_print(" %s = %s" % (key.ljust(16), trunc(value, 58))) blob = blob[a:] return record, blob def _assemble(self, conn, commandno=1, command="", params="", component="madTPG"): """ Assemble packet """ magic = "mad." data = struct.pack(" 1: with _lock: safe_print("MadTPG_Net: Assembled madVR packet:") self._parse(packet) return packet def _send(self, conn, command="", params="", component="madTPG"): """ Send madTPG command and return reply """ if not conn: return False self._commandno += 1 commandno = self._commandno try: packet = self._assemble(conn, commandno, command, params, component) if self.debug: safe_print("MadTPG_Net: Sending command %i %r to %s:%s" % ((commandno, command) + conn.getpeername()[:2])) while packet: try: bytes_sent = conn.send(packet) except socket.error, exception: if exception.errno == errno.EAGAIN: # Mac OS X: Resource temporarily unavailable sleep(0.001) if bytes_sent == -1: continue else: raise if bytes_sent == 0: raise socket.error(errno.ENOLINK, "Link has been severed") packet = packet[bytes_sent:] except socket.error, exception: safe_print("MadTPG_Net: Sending command %i %r failed" % (commandno, command), exception) return False if command not in ("confirm", "hello", "reply", "bye") and not command.startswith("store:"): self._commands[commandno] = command # Get reply if self.debug: safe_print("MadTPG_Net: Expecting reply for command %i %r" % (commandno, command)) return self._expect(conn, commandno, "reply") return True @property def uri(self): return "%s:%s" % (self._client_socket and self._client_socket.getpeername()[:2] or ("0.0.0.0", 0)) class MadTPG_Net_Sender(object): def __init__(self, madtpg, conn, command): self.madtpg = madtpg self._conn = conn if command == "Quit": command = "Exit" self.command = command def __call__(self, *args, **kwargs): if self.command == "Load3dlutFile": lut = H3DLUT(args[0]) lutdata = lut.LUTDATA self.command = "Load3dlut" elif self.command == "Load3dlutFromArray256": lutdata = args[0] self.command = "Load3dlut" if self.command == "Load3dlut": params = struct.pack("= 3: r, g, b = args[:3] if len(args) > 3: bgr = args[3] if len(args) > 4: bgg = args[4] if len(args) > 5: bgb = args[5] rgb = r, g, b if not None in (bgr, bgg, bgb): command += "Ex" rgb += (bgr, bgg, bgb) if None in (r, g, b): raise TypeError("show_rgb() takes at least 4 arguments (%i given)" % len(filter(lambda v: v, rgb))) params = "|".join(str(v) for v in rgb) else: params = str(*args) return self.madtpg._send(self._conn, self.command, params) if __name__ == "__main__": import config config.initcfg() lang.init() if sys.platform == "win32": madtpg = MadTPG() else: madtpg = MadTPG_Net() if madtpg.connect(method3=CM_StartLocalInstance, timeout3=5000): madtpg.show_rgb(1, 0, 0) DisplayCAL-3.1.0.0/DisplayCAL/main.py0000644000076500000000000002735212653526636016744 0ustar devwheel00000000000000# -*- coding: utf-8 -*- from __future__ import with_statement from time import sleep import errno import logging import os import platform import socket import sys import subprocess as sp import threading import traceback if sys.platform == "darwin": from platform import mac_ver import posix # Python version check from meta import py_minversion, py_maxversion pyver = sys.version_info[:2] if pyver < py_minversion or pyver > py_maxversion: raise RuntimeError("Need Python version >= %s <= %s, got %s" % (".".join(str(n) for n in py_minversion), ".".join(str(n) for n in py_maxversion), sys.version.split()[0])) from config import (autostart_home, confighome, datahome, enc, exe, exe_ext, exedir, exename, get_data_path, getcfg, fs_enc, initcfg, isapp, isexe, logdir, pydir, pyname, pypath, resfiles, runtype, appbasename) from debughelpers import ResourceError, handle_error from log import log, safe_print from meta import VERSION, VERSION_BASE, VERSION_STRING, build, name as appname from options import debug, verbose from util_str import safe_str, safe_unicode if sys.platform == "win32": from util_win import win_ver import ctypes from wxaddons import wx from wxwindows import BaseApp def _excepthook(etype, value, tb): handle_error((etype, value, tb)) sys.excepthook = _excepthook def main(module=None): if module: name = "%s-%s" % (appbasename, module) else: name = appbasename log("=" * 80) if verbose >= 1: version = VERSION_STRING if VERSION > VERSION_BASE: version += " Beta" safe_print(pyname + runtype, version, build) if sys.platform == "darwin": # Python's platform.platform output is useless under Mac OS X # (e.g. 'Darwin-15.0.0-x86_64-i386-64bit' for Mac OS X 10.11 El Capitan) safe_print("Mac OS X %s %s" % (mac_ver()[0], mac_ver()[-1])) elif sys.platform == "win32": machine = platform.machine() safe_print(*filter(lambda v: v, win_ver()) + ({"AMD64": "x86_64"}.get(machine, machine), )) else: # Linux safe_print(' '.join(platform.dist()), platform.machine()) safe_print("Python " + sys.version) safe_print("wxPython " + wx.version()) safe_print("Encoding: " + enc) safe_print("File system encoding: " + fs_enc) if sys.platform == "win32" and sys.getwindowsversion() >= (6, 2): # HighDPI support try: shcore = ctypes.windll.shcore except: pass else: if hasattr(shcore, "SetProcessDpiAwareness"): try: # 1 = System DPI aware (wxWpython currently does not # support per-monitor DPI) shcore.SetProcessDpiAwareness(1) except Exception, exception: safe_print("Warning - SetProcessDpiAwareness() failed:", exception) lockfilename = None port = 0 # Allow multiple instances only for curve viewer, profile info, # scripting client, synthetic profile creator and testchart editor multi_instance = ("curve-viewer", "profile-info", "scripting-client", "synthprofile", "testchart-editor") try: initcfg() host = "127.0.0.1" if module not in multi_instance: # Check lockfile(s) and probe port(s) incoming = None lockfilebasenames = [] if module: lockfilebasenames.append(name) if module not in ("3DLUT-maker", "VRML-to-X3D-converter", "apply-profiles"): lockfilebasenames.append(appbasename) for lockfilebasename in lockfilebasenames: lockfilename = os.path.join(confighome, "%s.lock" % lockfilebasename) if os.path.isfile(lockfilename): try: with open(lockfilename) as lockfile: port = lockfile.read().strip() except EnvironmentError, exception: # This shouldn't happen safe_print("Warning - could not read lockfile %s:" % lockfilename, exception) port = getcfg("app.port") else: try: port = int(port) except ValueError: # This shouldn't happen safe_print("Warning - invalid port number:", port) port = getcfg("app.port") appsocket = AppSocket() if not appsocket: break else: incoming = None if appsocket.connect(host, port): # Other instance already running? # Get appname to check if expected app is actually # running under that port if appsocket.send("getappname"): incoming = appsocket.read() if incoming.rstrip("\4") != pyname: incoming = None if incoming: # Send module/appname and args as UTF-8 data = [module or appname] if module != "3DLUT-maker": for arg in sys.argv[1:]: data.append(safe_str(safe_unicode(arg), "UTF-8")) data = sp.list2cmdline(data) if appsocket.send(data): incoming = appsocket.read() appsocket.close() if incoming and incoming.rstrip("\4") == "ok": # Successfully sent our request break if incoming is not None: # Other instance running? import localization as lang lang.init() if incoming.rstrip("\4") == "ok": # Successfully sent our request safe_print(lang.getstr("app.otherinstance.notified")) else: # Other instance busy? handle_error(lang.getstr("app.otherinstance", name)) # Exit return lockfilename = os.path.join(confighome, "%s.lock" % name) # Create listening socket appsocket = AppSocket() if appsocket: sys._appsocket = appsocket.socket if getcfg("app.allow_network_clients"): host = "" for port in (getcfg("app.port"), 0): try: sys._appsocket.bind((host, port)) except socket.error, exception: if port == 0: safe_print("Warning - could not bind to %s:%s:" % (host, port), exception) del sys._appsocket break else: try: sys._appsocket.settimeout(.2) except socket.error, exception: safe_print("Warning - could not set socket " "timeout:", exception) del sys._appsocket break try: sys._appsocket.listen(1) except socket.error, exception: safe_print("Warning - could not listen on " "socket:", exception) del sys._appsocket break try: port = sys._appsocket.getsockname()[1] except socket.error, exception: safe_print("Warning - could not get socket " "address:", exception) del sys._appsocket break if module in multi_instance: mode = "a" else: mode = "w" write_lockfile(lockfilename, mode, str(port)) break BaseApp.register_exitfunc(_exit, lockfilename, port) # Check for required resource files mod2res = {"3DLUT-maker": ["xrc/3dlut.xrc"], "curve-viewer": [], "profile-info": [], "scripting-client": [], "synthprofile": ["xrc/synthicc.xrc"], "testchart-editor": [], "VRML-to-X3D-converter": []} for filename in mod2res.get(module, resfiles): path = get_data_path(os.path.sep.join(filename.split("/"))) if not path or not os.path.isfile(path): import localization as lang lang.init() raise ResourceError(lang.getstr("resources.notfound.error") + "\n" + filename) # Create main data dir if it does not exist if not os.path.exists(datahome): try: os.makedirs(datahome) except Exception, exception: handle_error(UserWarning("Warning - could not create " "directory '%s'" % datahome)) elif sys.platform == "darwin": # Check & fix permissions if necessary import getpass user = getpass.getuser().decode(fs_enc) script = [] for directory in (confighome, datahome, logdir): if (os.path.isdir(directory) and not os.access(directory, os.W_OK)): script.append("chown -R '%s' '%s'" % (user, directory)) if script: sp.call(['osascript', '-e', 'do shell script "%s" with administrator privileges' % ";".join(script).encode(fs_enc)]) # Initialize & run if module == "3DLUT-maker": from wxLUT3DFrame import main elif module == "curve-viewer": from wxLUTViewer import main elif module == "profile-info": from wxProfileInfo import main elif module == "scripting-client": from wxScriptingClient import main elif module == "synthprofile": from wxSynthICCFrame import main elif module == "testchart-editor": from wxTestchartEditor import main elif module == "VRML-to-X3D-converter": from wxVRML2X3D import main elif module == "apply-profiles": from profile_loader import main else: from DisplayCAL import main main() except Exception, exception: if isinstance(exception, ResourceError): error = exception else: error = Error(u"Fatal error: " + safe_unicode(traceback.format_exc())) handle_error(error) _exit(lockfilename, port) def _exit(lockfilename, port): for thread in threading.enumerate(): if (thread.isAlive() and thread is not threading.currentThread() and not thread.isDaemon()): safe_print("Waiting for thread %s to exit" % thread.getName()) thread.join() if lockfilename and os.path.isfile(lockfilename): # Each lockfile may contain multiple ports of running instances try: with open(lockfilename) as lockfile: ports = lockfile.read().splitlines() except EnvironmentError, exception: safe_print("Warning - could not read lockfile %s: %r" % (lockfilename, exception)) ports = [] else: # Remove ourself if port and str(port) in ports: ports.remove(str(port)) # Determine if instances still running. If not still running, # remove from list of ports for i in reversed(xrange(len(ports))): try: port = int(ports[i]) except ValueError: # This shouldn't happen continue appsocket = AppSocket() if not appsocket: break if not appsocket.connect("127.0.0.1", port): # Other instance probably died del ports[i] appsocket.close() if ports: # Write updated lockfile write_lockfile(lockfilename, "w", "\n".join(ports)) # If no ports of running instances, ok to remove lockfile if not ports: try: os.remove(lockfilename) except EnvironmentError, exception: safe_print("Warning - could not remove lockfile %s: %r" % (lockfilename, exception)) safe_print("Exiting") logging.shutdown() def main_3dlut_maker(): main("3DLUT-maker") def main_curve_viewer(): main("curve-viewer") def main_profile_info(): main("profile-info") def main_synthprofile(): main("synthprofile") def main_testchart_editor(): main("testchart-editor") def write_lockfile(lockfilename, mode, contents): try: # Create lockfile with open(lockfilename, mode) as lockfile: lockfile.write("%s\n" % contents) except EnvironmentError, exception: # This shouldn't happen safe_print("Warning - could not write lockfile %s:" % lockfilename, exception) class AppSocket(object): def __init__(self): try: self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) except socket.error, exception: # This shouldn't happen safe_print("Warning - could not create TCP socket:", exception) def __getattr__(self, name): return getattr(self.socket, name) def __nonzero__(self): return hasattr(self, "socket") def connect(self, host, port): try: self.socket.connect((host, port)) except socket.error, exception: # Other instance probably died safe_print("Connection to %s:%s failed:" % (host, port), exception) return False return True def read(self): incoming = "" while not "\4" in incoming: try: incoming += self.socket.recv(1024) except socket.error, exception: if exception.errno == errno.EWOULDBLOCK: sleep(.05) continue safe_print("Warning - could not receive data:", exception) break return incoming def send(self, data): try: self.socket.sendall(data + "\n") except socket.error, exception: # Connection lost? safe_print("Warning - could not send data %r:" % data, exception) return False return True class Error(Exception): pass if __name__ == "__main__": main() DisplayCAL-3.1.0.0/DisplayCAL/meta.py0000644000076500000000000000426012653526636016737 0ustar devwheel00000000000000# -*- coding: utf-8 -*- """ Meta information """ import re import sys try: from __version__ import (BUILD_DATE as build, LASTMOD as lastmod, VERSION, VERSION_BASE, VERSION_STRING) except ImportError: build = lastmod = "0000-00-00T00:00:00.0Z" VERSION = VERSION_BASE = (0, 0, 0, 0) VERSION_STRING = ".".join(str(n) for n in VERSION) if sys.version_info[:2] < (3, ): author = "Florian Höch".decode("utf8") else: author = "Florian Höch" author_ascii = "Florian Hoech" author_email = "florian@displaycal.net" description = ("A graphical front-end for display calibration and profiling " "using Argyll CMS") longdesc = "\n".join(["Calibrates and characterizes display devices using a hardware sensor,", "driven by the open source color management system Argyll CMS.", "Supports multi-display setups and a variety of available settings like ", "customizable whitepoint, luminance, black level, tone response curve ", "as well as the creation of matrix and look-up-table ICC profiles with ", "optional gamut mapping. Calibrations and profiles can be verified ", "through measurements, and profiles can be installed to make them ", "available to color management aware applications.", "Profile installation can utilize Argyll CMS, Oyranos and/or GNOME ", "Color Manager if available, for flexible integration."]) domain = "displaycal.net" name = "DisplayCAL" name_html = 'DisplayCAL' py_maxversion = (2, 7) py_minversion = (2, 6) version = VERSION_STRING version_lin = VERSION_STRING # Linux version_mac = VERSION_STRING # Mac OS X version_win = VERSION_STRING # Windows version_src = VERSION_STRING version_short = re.sub("(?:\.0){1,2}$", "", version) version_tuple = VERSION # only ints allowed and must be exactly 4 values wx_minversion = (2, 8, 8) def script2pywname(script): """ Convert all-lowercase script name to mixed-case pyw name """ a2b = {name + "-3dlut-maker": name + "-3DLUT-maker", name + "-vrml-to-x3d-converter": name + "-VRML-to-X3D-converter"} if script.lower().startswith(name.lower()): pyw = name + script[len(name):] return a2b.get(pyw, pyw) return script DisplayCAL-3.1.0.0/DisplayCAL/network.py0000644000076500000000000000252212647526531017476 0ustar devwheel00000000000000# -*- coding: utf-8 -*- import errno import socket import localization as lang from log import safe_print from util_str import safe_str, safe_unicode class ScriptingClientSocket(socket.socket): def __del__(self): self.disconnect() def __enter__(self): return self def __exit__(self, etype, value, tb): self.disconnect() def __init__(self): socket.socket.__init__(self) self.recv_buffer = "" def disconnect(self): try: # Will fail if the socket isn't connected, i.e. if there was an # error during the call to connect() self.shutdown(socket.SHUT_RDWR) except socket.error, exception: if exception.errno != errno.ENOTCONN: safe_print(exception) self.close() def get_single_response(self): # Buffer received data until EOT (response end marker) and return # single response (additional data will still be in the buffer) while not "\4" in self.recv_buffer: incoming = self.recv(4096) if incoming == "": raise socket.error(lang.getstr("connection.broken")) self.recv_buffer += incoming end = self.recv_buffer.find("\4") single_response = self.recv_buffer[:end] self.recv_buffer = self.recv_buffer[end + 1:] return safe_unicode(single_response, "UTF-8") def send_command(self, command): # Automatically append newline (command end marker) self.sendall(safe_str(command, "UTF-8") + "\n") DisplayCAL-3.1.0.0/DisplayCAL/options.py0000644000076500000000000000217612647526531017505 0ustar devwheel00000000000000# -*- coding: utf-8 -*- """ Parse commandline options. """ import sys # use only ascii? ascii = "--ascii" in sys.argv[1:] # debug level (default: 0 = off) if "-d2" in sys.argv[1:] or "--debug=2" in sys.argv[1:]: debug = 2 elif "-d1" in sys.argv[1:] or "--debug=1" in sys.argv[1:] or \ "-d" in sys.argv[1:] or "--debug" in sys.argv[1:]: debug = 1 else: debug = 0 # >= 1 prints debug messages # use alternate patch preview in the testchart editor? tc_use_alternate_preview = "-ap" in sys.argv[1:] or "--alternate-preview" in \ sys.argv[1:] # test some features even if they are not available test = "-t" in sys.argv[1:] or "--test" in sys.argv[1:] test_require_sensor_cal = "-s" in sys.argv[1:] or "--test_require_sensor_cal" in sys.argv[1:] # verbosity level (default: 1) if "-v4" in sys.argv[1:] or "--verbose=4" in sys.argv[1:]: verbose = 4 elif "-v3" in sys.argv[1:] or "--verbose=3" in sys.argv[1:]: verbose = 3 elif "-v2" in sys.argv[1:] or "--verbose=2" in sys.argv[1:]: verbose = 2 elif "-v0" in sys.argv[1:] or "--verbose=0" in sys.argv[1:]: verbose = 0 # off else: verbose = 1 # >= 1 prints some status information DisplayCAL-3.1.0.0/DisplayCAL/ordereddict.py0000644000076500000000000001557112647526531020305 0ustar devwheel00000000000000# -*- coding: utf-8 -*- from itertools import izip, imap def is_nan(obj): """ Return boolean indicating if obj is considered not a number. """ try: obj + 1 except TypeError: return True return False class OrderedDict(dict): """ Simple ordered dictionary. Compatible with Python 3's OrderedDict, though performance is inferior as the approach is different (but should be more memory efficient), and implements several sequence methods (__delslice__, __getslice__, __setslice__, index, insert, reverse, sort). """ missing = object() def __init__(self, *args, **kwargs): self._keys = [] if args or kwargs: self.update(*args, **kwargs) def __delitem__(self, key): dict.__delitem__(self, key) self._keys.remove(key) def __delslice__(self, i, j): """ Delete a range of keys. """ for key in iter(self._keys[i:j]): del self[key] def __eq__(self, other): """ od.__eq__(y) <==> od==y. Comparison to another OD is order-sensitive while comparison to a regular mapping is order-insensitive. """ if isinstance(other, OrderedDict): return len(self) == len(other) and \ all(p == q for p, q in zip(self.items(), other.items())) return dict.__eq__(self, other) def __getslice__(self, i, j): """ Get a range of keys. Return a new OrderedDict. """ keys = self._keys[i:j] return self.__class__(zip(keys, map(self.get, keys))) def __iter__(self): return iter(self._keys) def __ne__(self, other): return not self == other def __reduce__(self): 'Return state information for pickling' items = [[k, self[k]] for k in self] tmp = self._keys del self._keys inst_dict = vars(self).copy() self._keys = tmp if inst_dict: return (self.__class__, (items,), inst_dict) return self.__class__, (items,) def __repr__(self): """ od.__repr__() <==> repr(od) """ if not self: return "%s.%s()" % (self.__class__.__module__, self.__class__.__name__) return "%s.%s(%r)" % (self.__class__.__module__, self.__class__.__name__, self.items()) def __reversed__(self): """ od.__reversed__() -- return a reverse iterator over the keys """ return reversed(self._keys) def __setitem__(self, key, value): if not key in self._keys: self._keys.append(key) dict.__setitem__(self, key, value) def __setslice__(self, i, j, iterable): """ Set a range of keys. """ for key in iter(self._keys[i:j]): dict.__delitem__(self, key) self._keys[i:j] = self.__class__(iterable).keys() self.update(iterable) def clear(self): dict.clear(self) del self._keys[:] def copy(self): return self.__class__(self) def delslice(self, key1, key2): """ Like __delslice__, but takes keys instead of numerical key positions. """ if key1: if key2: del self[self.index(key1):self.index(key2)] else: del self[self.index(key1):] elif key2: del self[:self.index(key2)] else: self.clear() @classmethod def fromkeys(cls, iterable, value=None): """ Return new dict with keys from S and values equal to v. v defaults to None. """ d = cls() for key in iterable: d[key] = value return d def getslice(self, key1, key2): """ Like __getslice__, but takes keys instead of numerical key positions. """ if key1: if key2: return self[self.index(key1):self.index(key2)] else: return self[self.index(key1):] elif key2: return self[:self.index(key2)] else: return self.copy() def index(self, key, start=0, stop=missing): """ Return numerical position of key. Raise KeyError if the key is not present. """ if start != 0 or stop is not OrderedDict.missing: if stop is not OrderedDict.missing: iterable = self._keys[start:stop] else: iterable = self._keys[start:] else: iterable = self._keys if not key in iterable: raise KeyError(key) return self._keys.index(key) def insert(self, i, key, value): """ Insert key before index and assign value to self[key]. If the key is already present, it is overwritten. """ if key in self: del self[key] self._keys.insert(i, key) dict.__setitem__(self, key, value) def items(self): return zip(self._keys, self.values()) def iteritems(self): return izip(self._keys, self.itervalues()) iterkeys = __iter__ def itervalues(self): return imap(self.get, self._keys) def key(self, value, start=0, stop=missing): """ Return key of first value. Raise ValueError if the value is not present. """ if start != 0 or stop is not OrderedDict.missing: if stop is not OrderedDict.missing: iterable = self[start:stop] else: iterable = self[start:] else: iterable = self for item in iterable.iteritems(): if item[1] == value: return item[0] raise ValueError(value) def keys(self): return self._keys[:] def pop(self, key, *args): if key in self: self._keys.remove(key) return dict.pop(self, key, *args) def popitem(self, last=True): """ od.popitem() -> (k, v), return and remove a (key, value) pair. Pairs are returned in LIFO order if last is true or FIFO order if false. """ if last: key = self._keys[-1] else: key = self._keys[0] return key, self.pop(key) def rename(self, key, name): """ Rename a key in-place. """ i = self.index(key) value = self.pop(key) self.insert(i, name, value) def reverse(self): """ Reverse keys in-place. """ self._keys.reverse() def setdefault(self, key, value=None): if not key in self: self[key] = value return self[key] def setslice(self, key1, key2, iterable): """ Like __setslice__, but takes keys instead of numerical key positions. """ if key1: if key2: self[self.index(key1):self.index(key2)] = iterable else: self[self.index(key1):] = iterable elif key2: self[:self.index(key2)] = iterable else: self[:] = iterable def sort(self, *args, **kwargs): """ Sort keys in-place. """ self._keys.sort(*args, **kwargs) def update(self, *args, **kwargs): if len(args) > 1: raise TypeError("update expected at most 1 arguments, got %i" % len(args)) for iterable in args + tuple(kwargs.items()): if hasattr(iterable, "iteritems"): self.update(iterable.iteritems()) elif hasattr(iterable, "keys"): for key in iterable.keys(): self[key] = iterable[key] else: for key, val in iterable: self[key] = val def values(self): return map(self.get, self._keys) __init__.__doc__ = dict.__init__.__doc__ __delitem__.__doc__ = dict.__delitem__.__doc__ __iter__.__doc__ = dict.__iter__.__doc__ __setitem__.__doc__ = dict.__setitem__.__doc__ clear.__doc__ = dict.clear.__doc__ copy.__doc__ = dict.copy.__doc__ items.__doc__ = dict.items.__doc__ iteritems.__doc__ = dict.iteritems.__doc__ itervalues.__doc__ = dict.itervalues.__doc__ keys.__doc__ = dict.keys.__doc__ pop.__doc__ = dict.pop.__doc__ setdefault.__doc__ = dict.setdefault.__doc__ update.__doc__ = dict.update.__doc__ values.__doc__ = dict.values.__doc__ DisplayCAL-3.1.0.0/DisplayCAL/patterngenerators.py0000644000076500000000000003314712647526531021563 0ustar devwheel00000000000000# -*- coding: utf-8 -*- from socket import (AF_INET, SHUT_RDWR, SO_BROADCAST, SO_REUSEADDR, SOCK_DGRAM, SOCK_STREAM, SOL_SOCKET, error, gethostbyname, gethostname, socket, timeout) from time import sleep import errno import httplib import struct import threading import urllib import urlparse import demjson import localization as lang from log import safe_print from util_http import encode_multipart_formdata from util_str import safe_unicode _lock = threading.RLock() def _shutdown(sock, addr): try: # Will fail if the socket isn't connected, i.e. if there # was an error during the call to connect() sock.shutdown(SHUT_RDWR) except error, exception: if exception.errno != errno.ENOTCONN: safe_print("MadTPG_Net: SHUT_RDWR for %s:%i failed:" % addr[:2], exception) sock.close() class GenHTTPPatternGeneratorClient(object): """ Generic pattern generator client using HTTP REST interface """ def __init__(self, host, port, bits, use_video_levels=False, logfile=None): self.host = host self.port = port self.bits = bits self.use_video_levels = use_video_levels self.logfile = logfile def wait(self): self.connect() def __del__(self): self.disconnect_client() def _conn_exc(self, exception): msg = lang.getstr("connection.fail", safe_unicode(exception)) raise Exception(msg) def _request(self, method, url, params=None, headers=None, validate=None): try: self.conn.request(method, url, params, headers or {}) resp = self.conn.getresponse() except (error, httplib.HTTPException), exception: self._conn_exc(exception) else: if resp.status == httplib.OK: return self._validate(resp, url, validate) else: raise Exception("%s %s" % (resp.status, resp.reason)) def _shutdown(self): # Override this method in subclass! pass def _validate(self, resp, url, validate): # Override this method in subclass! pass def connect(self): self.ip = gethostbyname(self.host) self.conn = httplib.HTTPConnection(self.ip, self.port) self.conn.connect() def disconnect_client(self): self.listening = False if hasattr(self, "conn"): self._shutdown() self.conn.close() del self.conn def send(self, rgb=(0, 0, 0), bgrgb=(0, 0, 0), bits=None, use_video_levels=None, x=0, y=0, w=1, h=1): rgb, bgrgb, bits = self._get_rgb(rgb, bgrgb, bits, use_video_levels) # Override this method in subclass! class GenTCPSockPatternGeneratorServer(object): """ Generic pattern generator server using TCP sockets """ def __init__(self, port, bits, use_video_levels=False, logfile=None): self.port = port self.bits = bits self.use_video_levels = use_video_levels self.socket = socket(AF_INET, SOCK_STREAM) self.socket.settimeout(1) self.socket.bind(('', port)) self.socket.listen(1) self.listening = False self.logfile = logfile def wait(self): self.listening = True if self.logfile: self.logfile.write(lang.getstr("connection.waiting") + (" %s:%s\n" % (gethostbyname(gethostname()), self.port))) while self.listening: try: self.conn, addr = self.socket.accept() except timeout: continue self.conn.settimeout(1) break if self.listening: if self.logfile: self.logfile.write(lang.getstr("connection.established") + "\n") def __del__(self): self.disconnect_client() self.socket.close() def _get_rgb(self, rgb, bgrgb, bits=None, use_video_levels=None): """ The RGB range should be 0..1 """ if not bits: bits = self.bits if use_video_levels is None: use_video_levels = self.use_video_levels bitv = 2 ** bits - 1 if use_video_levels: minv = 16.0 / 255.0 maxv = 235.0 / 255.0 - minv else: minv = 0.0 maxv = 1.0 rgb = [round(minv * bitv + v * bitv * maxv) for v in rgb] bgrgb = [round(minv * bitv + v * bitv * maxv) for v in bgrgb] return rgb, bgrgb, bits def disconnect_client(self): self.listening = False if hasattr(self, "conn"): try: self.conn.shutdown(SHUT_RDWR) except error, exception: if exception.errno != errno.ENOTCONN: safe_print("Warning - could not shutdown pattern generator " "connection:", exception) self.conn.close() del self.conn def send(self, rgb=(0, 0, 0), bgrgb=(0, 0, 0), use_video_levels=None, x=0, y=0, w=1, h=1): for server, bits in ((ResolveLSPatternGeneratorServer, 8), (ResolveCMPatternGeneratorServer, 10)): server.__dict__["send"](self, rgb, bgrgb, bits, use_video_levels, x, y, w, h) class PrismaPatternGeneratorClient(GenHTTPPatternGeneratorClient): """ Prisma HTTP REST interface """ def __init__(self, host, port=80, use_video_levels=False, logfile=None): GenHTTPPatternGeneratorClient.__init__(self, host, port, 8, use_video_levels=use_video_levels, logfile=logfile) self.prod_prisma = 2 self.oem_qinc = 1024 self.prod_oem = (struct.pack("' '' '' '' % tuple(rgb + [x, y, w, h])) self.conn.sendall("%s%s" % (struct.pack(">I", len(xml)), xml)) class ResolveCMPatternGeneratorServer(GenTCPSockPatternGeneratorServer): def __init__(self, port=20002, bits=10, use_video_levels=False, logfile=None): GenTCPSockPatternGeneratorServer.__init__(self, port, bits, use_video_levels, logfile) def send(self, rgb=(0, 0, 0), bgrgb=(0, 0, 0), bits=None, use_video_levels=None, x=0, y=0, w=1, h=1): """ Send an RGB color to the pattern generator. The RGB range should be 0..1 """ rgb, bgrgb, bits = self._get_rgb(rgb, bgrgb, bits, use_video_levels) xml = ('' '' '' '' '' % tuple(rgb + [bits] + bgrgb + [bits, x, y, w, h])) self.conn.sendall("%s%s" % (struct.pack(">I", len(xml)), xml)) if __name__ == "__main__": patterngenerator = GenTCPSockPatternGeneratorServer() DisplayCAL-3.1.0.0/DisplayCAL/pnp.ids0000644000076500000000000015341712647526531016743 0ustar devwheel00000000000000AAA Avolites Ltd AAE Anatek Electronics Inc. AAT Ann Arbor Technologies ABA ABBAHOME INC. ABC AboCom System Inc ABD Allen Bradley Company ABE Alcatel Bell ABO D-Link Systems Inc ABT Anchor Bay Technologies, Inc. ABV Advanced Research Technology ACA Ariel Corporation ACB Aculab Ltd ACC Accton Technology Corporation ACD AWETA BV ACE Actek Engineering Pty Ltd ACG A&R Cambridge Ltd ACH Archtek Telecom Corporation ACI Ancor Communications Inc ACK Acksys ACL Apricot Computers ACM Acroloop Motion Control Systems Inc ACO Allion Computer Inc. ACP Aspen Tech Inc ACR Acer Technologies ACS Altos Computer Systems ACT Applied Creative Technology ACU Acculogic ACV ActivCard S.A ADA Addi-Data GmbH ADB Aldebbaron ADC Acnhor Datacomm ADD Advanced Peripheral Devices Inc ADE Arithmos, Inc. ADH Aerodata Holdings Ltd ADI ADI Systems Inc ADK Adtek System Science Company Ltd ADL ASTRA Security Products Ltd ADM Ad Lib MultiMedia Inc ADN Analog & Digital Devices Tel. Inc ADP Adaptec Inc ADR Nasa Ames Research Center ADS Analog Devices Inc ADT Adtek ADT Aved Display Technologies ADV Advanced Micro Devices Inc ADX Adax Inc AEC Antex Electronics Corporation AED Advanced Electronic Designs, Inc. AEI Actiontec Electric Inc AEJ Alpha Electronics Company AEM ASEM S.p.A. AEN Avencall AEP Aetas Peripheral International AET Aethra Telecomunicazioni S.r.l. AFA Alfa Inc AGC Beijing Aerospace Golden Card Electronic Engineering Co.,Ltd. AGI Artish Graphics Inc AGL Argolis AGM Advan Int'l Corporation AGT Agilent Technologies AHC Advantech Co., Ltd. AIC Arnos Insturments & Computer Systems AIE Altmann Industrieelektronik AII Amptron International Inc. AIL Altos India Ltd AIM AIMS Lab Inc AIR Advanced Integ. Research Inc AIS Alien Internet Services AIW Aiwa Company Ltd AIX ALTINEX, INC. AJA AJA Video Systems, Inc. AKB Akebia Ltd AKE AKAMI Electric Co.,Ltd AKI AKIA Corporation AKL AMiT Ltd AKM Asahi Kasei Microsystems Company Ltd AKP Atom Komplex Prylad AKY Askey Computer Corporation ALA Alacron Inc ALC Altec Corporation ALD In4S Inc ALG Realtek Semiconductor Corp. ALH AL Systems ALI Acer Labs ALJ Altec Lansing ALK Acrolink Inc ALL Alliance Semiconductor Corporation ALM Acutec Ltd. ALN Alana Technologies ALO Algolith Inc. ALP Alps Electric Company Ltd ALR Advanced Logic ALS Avance Logic Inc ALS Texas Advanced optoelectronics Solutions, Inc ALT Altra ALV AlphaView LCD ALX ALEXON Co.,Ltd. AMA Asia Microelectronic Development Inc AMB Ambient Technologies, Inc. AMC Attachmate Corporation AMD Amdek Corporation AMI American Megatrends Inc AML Anderson Multimedia Communications (HK) Limited AMN Amimon LTD. AMO Amino Technologies PLC and Amino Communications Limited AMP AMP Inc AMS ARMSTEL, Inc. AMT AMT International Industry AMX AMX LLC ANA Anakron ANC Ancot AND Adtran Inc ANI Anigma Inc ANK Anko Electronic Company Ltd ANL Analogix Semiconductor, Inc ANO Anorad Corporation ANP Andrew Network Production ANR ANR Ltd ANS Ansel Communication Company ANT Ace CAD Enterprise Company Ltd ANX Acer Netxus Inc AOA AOpen Inc. AOE Advanced Optics Electronics, Inc. AOL America OnLine AOT Alcatel APC American Power Conversion APD AppliAdata APE Alpine Electronics, Inc. APG Horner Electric Inc API A Plus Info Corporation APL Aplicom Oy APM Applied Memory Tech APN Appian Tech Inc APP Apple Computer Inc APR Aprilia s.p.a. APS Autologic Inc APT Audio Processing Technology Ltd APV A+V Link APX AP Designs Ltd ARC Alta Research Corporation ARE ICET S.p.A. ARG Argus Electronics Co., LTD ARI Argosy Research Inc ARK Ark Logic Inc ARL Arlotto Comnet Inc ARM Arima ARO Poso International B.V. ARS Arescom Inc ART Corion Industrial Corporation ASC Ascom Strategic Technology Unit ASD USC Information Sciences Institute ASE AseV Display Labs ASI Ahead Systems ASK Ask A/S ASL AccuScene Corporation Ltd ASM ASEM S.p.A. ASN Asante Tech Inc ASP ASP Microelectronics Ltd AST AST Research Inc ASU Asuscom Network Inc ASX AudioScience ASY Rockwell Collins / Airshow Systems ATA Allied Telesyn International (Asia) Pte Ltd ATC Ably-Tech Corporation ATD Alpha Telecom Inc ATE Innovate Ltd ATH Athena Informatica S.R.L. ATI Allied Telesis KK ATK Allied Telesyn Int'l ATL Arcus Technology Ltd ATM ATM Ltd ATN Athena Smartcard Solutions Ltd. ATO ASTRO DESIGN, INC. ATP Alpha-Top Corporation ATT AT&T ATV Office Depot, Inc. ATX Athenix Corporation AUI Alps Electric Inc AUO AU Optronics AUR Aureal Semiconductor AUT Autotime Corporation AVA Avaya Communication AVC Auravision Corporation AVD Avid Electronics Corporation AVE Add Value Enterpises (Asia) Pte Ltd AVI Nippon Avionics Co.,Ltd AVL Avalue Technology Inc. AVM AVM GmbH AVN Advance Computer Corporation AVO Avocent Corporation AVR AVer Information Inc. AVT Avtek (Electronics) Pty Ltd AVV SBS Technologies (Canada), Inc. (was Avvida Systems, Inc.) AVX A/Vaux Electronics AVX AVerMedia Technologies, Inc. AWC Access Works Comm Inc AWL Aironet Wireless Communications, Inc AWS Wave Systems AXB Adrienne Electronics Corporation AXC AXIOMTEK CO., LTD. AXE D-Link Systems Inc AXI American Magnetics AXL Axel AXO Axonic Labs LLC AXP American Express AXT Axtend Technologies Inc AXX Axxon Computer Corporation AXY AXYZ Automation Services, Inc AYD Aydin Displays AYR Airlib, Inc AZM AZ Middelheim - Radiotherapy AZT Aztech Systems Ltd BAC Biometric Access Corporation BAN Banyan BBB an-najah university BBH B&Bh BBL Brain Boxes Limited BCC Beaver Computer Corporaton BCD Barco GmbH BCM Broadcom BCQ Deutsche Telekom Berkom GmbH BCS Booria CAD/CAM systems BDO Brahler ICS BDR Blonder Tongue Labs, Inc. BDS Barco Display Systems BEC Elektro Beckhoff GmbH BEI Beckworth Enterprises Inc BEK Beko Elektronik A.S. BEL Beltronic Industrieelektronik GmbH BEO Baug & Olufsen BFE B.F. Engineering Corporation BGB Barco Graphics N.V BGT Budzetron Inc BHZ BitHeadz, Inc. BIC Big Island Communications BII Boeckeler Instruments Inc BIL Billion Electric Company Ltd BIO BioLink Technologies International, Inc. BIT Bit 3 Computer BLI Busicom BLN BioLink Technologies BLP Bloomberg L.P. BMD Blackmagic Design BMI Benson Medical Instruments Company BML BIOMED Lab BMS BIOMEDISYS BNE Bull AB BNK Banksia Tech Pty Ltd BNO Bang & Olufsen BNS Boulder Nonlinear Systems BOB Rainy Orchard BOE BOE BOI NINGBO BOIGLE DIGITAL TECHNOLOGY CO.,LTD BOS BOS BPD Micro Solutions, Inc. BPU Best Power BRA Braemac Pty Ltd BRC BARC BRG Bridge Information Co., Ltd BRI Boca Research Inc BRM Braemar Inc BRO BROTHER INDUSTRIES,LTD. BSE Bose Corporation BSL Biomedical Systems Laboratory BSN BRIGHTSIGN, LLC BST BodySound Technologies, Inc. BTC Bit 3 Computer BTE Brilliant Technology BTF Bitfield Oy BTI BusTech Inc BTO BioTao Ltd BUF Yasuhiko Shirai Melco Inc BUG B.U.G., Inc. BUJ ATI Tech Inc BUL Bull BUR Bernecker & Rainer Ind-Eletronik GmbH BUS BusTek BUT 21ST CENTURY ENTERTAINMENT BWK Bitworks Inc. BXE Buxco Electronics BYD byd:sign corporation CAA Castles Automation Co., Ltd CAC CA & F Elettronica CAG CalComp CAI Canon Inc. CAL Acon CAM Cambridge Audio CAN Canopus Company Ltd CAN Carrera Computer Inc CAN CORNEA CAR Cardinal Company Ltd CAS CASIO COMPUTER CO.,LTD CAT Consultancy in Advanced Technology CAV Cavium Networks, Inc CBI ComputerBoards Inc CBR Cebra Tech A/S CBT Cabletime Ltd CBX Cybex Computer Products Corporation CCC C-Cube Microsystems CCI Cache CCJ CONTEC CO.,LTD. CCL CCL/ITRI CCP Capetronic USA Inc CDC Core Dynamics Corporation CDD Convergent Data Devices CDE Colin.de CDG Christie Digital Systems Inc CDI Concept Development Inc CDK Cray Communications CDN Codenoll Technical Corporation CDP CalComp CDS Computer Diagnostic Systems CDT IBM Corporation CDV Convergent Design Inc. CEA Consumer Electronics Association CEC Chicony Electronics Company Ltd CED Cambridge Electronic Design Ltd CEF Cefar Digital Vision CEI Crestron Electronics, Inc. CEM MEC Electronics GmbH CEN Centurion Technologies P/L CEP C-DAC CER Ceronix CET TEC CORPORATION CFG Atlantis CGA Chunghwa Picture Tubes, LTD CGS Chyron Corp CGT congatec AG CHA Chase Research PLC CHC Chic Technology Corp. CHD ChangHong Electric Co.,Ltd CHE Acer Inc CHG Sichuan Changhong Electric CO, LTD. CHI Chrontel Inc CHL Chloride-R&D CHM CHIC TECHNOLOGY CORP. CHO Sichuang Changhong Corporation CHP CH Products CHS Agentur Chairos CHT Chunghwa Picture Tubes,LTD. CHY Cherry GmbH CIC Comm. Intelligence Corporation CII Cromack Industries Inc CIL Citicom Infotech Private Limited CIN Citron GmbH CIP Ciprico Inc CIR Cirrus Logic Inc CIS Cisco Systems Inc CIT Citifax Limited CKC The Concept Keyboard Company Ltd CKJ Carina System Co., Ltd. CLA Clarion Company Ltd CLD COMMAT L.t.d. CLE Classe Audio CLG CoreLogic CLI Cirrus Logic Inc CLM CrystaLake Multimedia CLO Clone Computers CLT automated computer control systems CLV Clevo Company CLX CardLogix CMC CMC Ltd CMD Colorado MicroDisplay, Inc. CMG Chenming Mold Ind. Corp. CMI C-Media Electronics CMM Comtime GmbH CMN Chimei Innolux Corporation CMO Chi Mei Optoelectronics corp. CMR Cambridge Research Systems Ltd CMS CompuMaster Srl CMX Comex Electronics AB CNB American Power Conversion CNC Alvedon Computers Ltd CNE Cine-tal CNI Connect Int'l A/S CNN Canon Inc CNT COINT Multimedia Systems COB COBY Electronics Co., Ltd COD CODAN Pty. Ltd. COI Codec Inc. COL Rockwell Collins, Inc. COM Comtrol Corporation CON Contec Company Ltd COO coolux GmbH COR Corollary Inc COS CoStar Corporation COT Core Technology Inc COW Polycow Productions COX Comrex CPC Ciprico Inc CPD CompuAdd CPI Computer Peripherals Inc CPL Compal Electronics Inc CPM Capella Microsystems Inc. CPQ Compaq Computer Company CPT cPATH CPX Powermatic Data Systems CRC CONRAC GmbH CRD Cardinal Technical Inc CRE Creative Labs Inc CRI Crio Inc. CRL Creative Logic CRN Cornerstone Imaging CRO Extraordinary Technologies PTY Limited CRQ Cirque Corporation CRS Crescendo Communication Inc CRV Cerevo Inc. CRX Cyrix Corporation CSB Transtex SA CSC Crystal Semiconductor CSD Cresta Systems Inc CSE Concept Solutions & Engineering CSI Cabletron System Inc CSM Cosmic Engineering Inc. CSO California Institute of Technology CSS CSS Laboratories CST CSTI Inc CTA CoSystems Inc CTC CTC Communication Development Company Ltd CTE Chunghwa Telecom Co., Ltd. CTL Creative Technology Ltd CTM Computerm Corporation CTN Computone Products CTP Computer Technology Corporation CTS Comtec Systems Co., Ltd. CTX Creatix Polymedia GmbH CUB Cubix Corporation CUK Calibre UK Ltd CVA Covia Inc. CVI Colorado Video, Inc. CVS Clarity Visual Systems CWR Connectware Inc CXT Conexant Systems CYB CyberVision CYC Cylink Corporation CYD Cyclades Corporation CYL Cyberlabs CYT Cytechinfo Inc CYV Cyviz AS CYW Cyberware CYX Cyrix Corporation CZE Carl Zeiss AG DAC Digital Acoustics Corporation DAE Digatron Industrie Elektronik GmbH DAI DAIS SET Ltd. DAK Daktronics DAL Digital Audio Labs Inc DAN Danelec Marine A/S DAS DAVIS AS DAT Datel Inc DAU Daou Tech Inc DAV Davicom Semiconductor Inc DAW DA2 Technologies Inc DAX Data Apex Ltd DBD Diebold Inc. DBI DigiBoard Inc DBK Databook Inc DBL Doble Engineering Company DBN DB Networks Inc DCA Digital Communications Association DCC Dale Computer Corporation DCD Datacast LLC DCE dSPACE GmbH DCI Concepts Inc DCL Dynamic Controls Ltd DCM DCM Data Products DCO Dialogue Technology Corporation DCR Decros Ltd DCS Diamond Computer Systems Inc DCT Dancall Telecom A/S DCV Datatronics Technology Inc DDA DA2 Technologies Corporation DDD Danka Data Devices DDE Datasat Digital Entertainment DDI Data Display AG DDS Barco, n.v. DDT Datadesk Technologies Inc DDV Delta Information Systems, Inc DEC Digital Equipment Corporation DEI Deico Electronics DEL Dell Inc. DEN Densitron Computers Ltd DEX idex displays DFI DFI DFK SharkTec A/S DFT DEI Holdings dba Definitive Technology DGA Digiital Arts Inc DGC Data General Corporation DGI DIGI International DGK DugoTech Co., LTD DGP Digicorp European sales S.A. DGS Diagsoft Inc DGT Dearborn Group Technology DGT The Dearborn Group DHP DH Print DHQ Quadram DHT Projectavision Inc DIA Diadem DIG Digicom S.p.A. DII Dataq Instruments Inc DIM dPict Imaging, Inc. DIN Daintelecom Co., Ltd DIS Diseda S.A. DIT Dragon Information Technology DJE Capstone Visual Product Development DJP Maygay Machines, Ltd DKY Datakey Inc DLB Dolby Laboratories Inc. DLC Diamond Lane Comm. Corporation DLG Digital-Logic GmbH DLK D-Link Systems Inc DLL Dell Inc DLT Digitelec Informatique Park Cadera DMB Digicom Systems Inc DMC Dune Microsystems Corporation DMM Dimond Multimedia Systems Inc DMP D&M Holdings Inc, Professional Business Company DMS DOME imaging systems DMT Distributed Management Task Force, Inc. (DMTF) DMV NDS Ltd DNA DNA Enterprises, Inc. DNG Apache Micro Peripherals Inc DNI Deterministic Networks Inc. DNT Dr. Neuhous Telekommunikation GmbH DNV DiCon DOL Dolman Technologies Group Inc DOM Dome Imaging Systems DON DENON, Ltd. DOT Dotronic Mikroelektronik GmbH DPA DigiTalk Pro AV DPC Delta Electronics Inc DPI DocuPoint DPL Digital Projection Limited DPM ADPM Synthesis sas DPS Digital Processing Systems DPT DPT DPX DpiX, Inc. DQB Datacube Inc DRB Dr. Bott KG DRC Data Ray Corp. DRD DIGITAL REFLECTION INC. DRI Data Race Inc DRS DRS Defense Solutions, LLC DSD DS Multimedia Pte Ltd DSI Digitan Systems Inc DSM DSM Digital Services GmbH DSP Domain Technology Inc DTA DELTATEC DTC DTC Tech Corporation DTE Dimension Technologies, Inc. DTI Diversified Technology, Inc. DTK Dynax Electronics (HK) Ltd DTL e-Net Inc DTN Datang Telephone Co DTO Deutsche Thomson OHG DTT Design & Test Technology, Inc. DTX Data Translation DUA Dosch & Amand GmbH & Company KG DUN NCR Corporation DVD Dictaphone Corporation DVL Devolo AG DVS Digital Video System DVT Data Video DWE Daewoo Electronics Company Ltd DXC Digipronix Control Systems DXD DECIMATOR DESIGN PTY LTD DXL Dextera Labs Inc DXP Data Expert Corporation DXS Signet DYC Dycam Inc DYM Dymo-CoStar Corporation DYN Askey Computer Corporation DYX Dynax Electronics (HK) Ltd EAS Evans and Sutherland Computer EBH Data Price Informatica EBT HUALONG TECHNOLOGY CO., LTD ECA Electro Cam Corp. ECC ESSential Comm. Corporation ECI Enciris Technologies ECK Eugene Chukhlomin Sole Proprietorship, d.b.a. ECL Excel Company Ltd ECM E-Cmos Tech Corporation ECO Echo Speech Corporation ECP Elecom Company Ltd ECS Elitegroup Computer Systems Company Ltd ECT Enciris Technologies EDC e.Digital Corporation EDG Electronic-Design GmbH EDI Edimax Tech. Company Ltd EDM EDMI EDT Emerging Display Technologies Corp EEE ET&T Technology Company Ltd EEH EEH Datalink GmbH EEP E.E.P.D. GmbH EES EE Solutions, Inc. EGA Elgato Systems LLC EGD EIZO GmbH Display Technologies EGL Eagle Technology EGN Egenera, Inc. EGO Ergo Electronics EHJ Epson Research EHN Enhansoft EIC Eicon Technology Corporation EKA MagTek Inc. EKC Eastman Kodak Company EKS EKSEN YAZILIM ELA ELAD srl ELC Electro Scientific Ind ELE Elecom Company Ltd ELG Elmeg GmbH Kommunikationstechnik ELI Edsun Laboratories ELL Electrosonic Ltd ELM Elmic Systems Inc ELO Elo TouchSystems Inc ELO Tyco Electronics ELS ELSA GmbH ELT Element Labs, Inc. ELX Elonex PLC EMB Embedded computing inc ltd EMC eMicro Corporation EME EMiNE TECHNOLOGY COMPANY, LTD. EMG EMG Consultants Inc EMI Ex Machina Inc EMK Emcore Corporation EMO ELMO COMPANY, LIMITED EMU Emulex Corporation ENC Eizo Nanao Corporation END ENIDAN Technologies Ltd ENE ENE Technology Inc. ENI Efficient Networks ENS Ensoniq Corporation ENT Enterprise Comm. & Computing Inc EPC Empac EPH Epiphan Systems Inc. EPI Envision Peripherals, Inc EPN EPiCON Inc. EPS KEPS EQP Equipe Electronics Ltd. EQX Equinox Systems Inc ERG Ergo System ERI Ericsson Mobile Communications AB ERN Ericsson, Inc. ERP Euraplan GmbH ERT Escort Insturments Corporation ESA Elbit Systems of America ESC Eden Sistemas de Computacao S/A ESD Ensemble Designs, Inc ESG ELCON Systemtechnik GmbH ESI Extended Systems, Inc. ESK ES&S ESL Esterline Technologies ESN eSATURNUS ESS ESS Technology Inc EST Embedded Solution Technology ESY E-Systems Inc ETC Everton Technology Company Ltd ETD ELAN MICROELECTRONICS CORPORATION ETH Etherboot Project ETI Eclipse Tech Inc ETK eTEK Labs Inc. ETL Evertz Microsystems Ltd. ETS Electronic Trade Solutions Ltd ETT E-Tech Inc EUT Ericsson Mobile Networks B.V. EVE Advanced Micro Peripherals Ltd EVI eviateg GmbH EVX Everex EXA Exabyte EXC Excession Audio EXI Exide Electronics EXN RGB Systems, Inc. dba Extron Electronics EXP Data Export Corporation EXT Exatech Computadores & Servicos Ltda EXX Exxact GmbH EXY Exterity Ltd EYE eyevis GmbH EZE EzE Technologies EZP Storm Technology FAR Farallon Computing FBI Interface Corporation FCB Furukawa Electric Company Ltd FCG First International Computer Ltd FCS Focus Enhancements, Inc. FDC Future Domain FDT Fujitsu Display Technologies Corp. FEC FURUNO ELECTRIC CO., LTD. FEL Fellowes & Questec FEN Fen Systems Ltd. FER Ferranti Int'L FFC FUJIFILM Corporation FFI Fairfield Industries FGD Lisa Draexlmaier GmbH FGL Fujitsu General Limited. FHL FHLP FIC Formosa Industrial Computing Inc FIL Forefront Int'l Ltd FIN Finecom Co., Ltd. FIR Chaplet Systems Inc FIS FLY-IT Simulators FIT Feature Integration Technology Inc. FJC Fujitsu Takamisawa Component Limited FJS Fujitsu Spain FJT F.J. Tieman BV FLE ADTI Media, Inc FLI Faroudja Laboratories FLY Butterfly Communications FMA Fast Multimedia AG FMC Ford Microelectronics Inc FMI Fellowes, Inc. FMI Fujitsu Microelect Inc FML Fujitsu Microelect Ltd FMZ Formoza-Altair FNC Fanuc LTD FNI Funai Electric Co., Ltd. FOA FOR-A Company Limited FOS Foss Tecator FOX HON HAI PRECISON IND.CO.,LTD. FPE Fujitsu Peripherals Ltd FPS Deltec Corporation FPX Cirel Systemes FRC Force Computers FRD Freedom Scientific BLV FRE Forvus Research Inc FRI Fibernet Research Inc FRO FARO Technologies FRS South Mountain Technologies, LTD FSC Future Systems Consulting KK FSI Fore Systems Inc FST Modesto PC Inc FTC Futuretouch Corporation FTE Frontline Test Equipment Inc. FTG FTG Data Systems FTI FastPoint Technologies, Inc. FTL FUJITSU TEN LIMITED FTN Fountain Technologies Inc FTR Mediasonic FTW MindTribe Product Engineering, Inc. FUJ Fujitsu Ltd FUN sisel muhendislik FUS Fujitsu Siemens Computers GmbH FVC First Virtual Corporation FVX C-C-C Group Plc FWA Attero Tech, LLC FWR Flat Connections Inc FXX Fuji Xerox FZC Founder Group Shenzhen Co. FZI FZI Forschungszentrum Informatik GAG Gage Applied Sciences Inc GAL Galil Motion Control GAU Gaudi Co., Ltd. GCC GCC Technologies Inc GCI Gateway Comm. Inc GCS Grey Cell Systems Ltd GDC General Datacom GDI G. Diehl ISDN GmbH GDS GDS GDT Vortex Computersysteme GmbH GED General Dynamics C4 Systems GEF GE Fanuc Embedded Systems GEH GE Intelligent Platforms - Huntsville GEM Gem Plus GEN Genesys ATE Inc GEO GEO Sense GER GERMANEERS GmbH GES GES Singapore Pte Ltd GET Getac Technology Corporation GFM GFMesstechnik GmbH GFN Gefen Inc. GGL Google Inc. GIC General Inst. Corporation GIM Guillemont International GIP GI Provision Ltd GIS AT&T Global Info Solutions GJN Grand Junction Networks GLD Goldmund - Digital Audio SA GLE AD electronics GLM Genesys Logic GLS Gadget Labs LLC GMK GMK Electronic Design GmbH GML General Information Systems GMM GMM Research Inc GMN GEMINI 2000 Ltd GMX GMX Inc GND Gennum Corporation GNN GN Nettest Inc GNZ Gunze Ltd GRA Graphica Computer GRE GOLD RAIN ENTERPRISES CORP. GRH Granch Ltd GRM Garmin International GRV Advanced Gravis GRY Robert Gray Company GSB NIPPONDENCHI CO,.LTD GSC General Standards Corporation GSM Goldstar Company Ltd GST Graphic SystemTechnology GSY Grossenbacher Systeme AG GTC Graphtec Corporation GTI Goldtouch GTK G-Tech Corporation GTM Garnet System Company Ltd GTS Geotest Marvin Test Systems Inc GTT General Touch Technology Co., Ltd. GUD Guntermann & Drunck GmbH GUZ Guzik Technical Enterprises GVC GVC Corporation GVL Global Village Communication GWI GW Instruments GWY Gateway 2000 GZE GUNZE Limited HAE Haider electronics HAI Haivision Systems Inc. HAL Halberthal HAN Hanchang System Corporation HAR Harris Corporation HAY Hayes Microcomputer Products Inc HCA DAT HCE Hitachi Consumer Electronics Co., Ltd HCL HCL America Inc HCM HCL Peripherals HCP Hitachi Computer Products Inc HCW Hauppauge Computer Works Inc HDC HardCom Elektronik & Datateknik HDI HD-INFO d.o.o. HDV Holografika kft. HEC Hisense Electric Co., Ltd. HEC Hitachi Engineering Company Ltd HEL Hitachi Micro Systems Europe Ltd HER Ascom Business Systems HET HETEC Datensysteme GmbH HHC HIRAKAWA HEWTECH CORP. HHI Fraunhofer Heinrich-Hertz-Institute HIB Hibino Corporation HIC Hitachi Information Technology Co., Ltd. HIK Hikom Co., Ltd. HIL Hilevel Technology HIQ Kaohsiung Opto Electronics Americas, Inc. HIT Hitachi America Ltd HJI Harris & Jeffries Inc HKA HONKO MFG. CO., LTD. HKG Josef Heim KG HMC Hualon Microelectric Corporation HMK hmk Daten-System-Technik BmbH HMX HUMAX Co., Ltd. HNS Hughes Network Systems HOB HOB Electronic GmbH HOE Hosiden Corporation HOL Holoeye Photonics AG HON Sonitronix HPA Zytor Communications HPC Hewlett Packard Co. HPD Hewlett Packard HPI Headplay, Inc. HPK HAMAMATSU PHOTONICS K.K. HPQ HP HPR H.P.R. Electronics GmbH HRC Hercules HRE Qingdao Haier Electronics Co., Ltd. HRI Hall Research HRL Herolab GmbH HRS Harris Semiconductor HRT HERCULES HSC Hagiwara Sys-Com Company Ltd HSD HannStar Display Corp HSM AT&T Microelectronics HSP HannStar Display Corp HTC Hitachi Ltd HTI Hampshire Company, Inc. HTK Holtek Microelectronics Inc HTX Hitex Systementwicklung GmbH HUB GAI-Tronics, A Hubbell Company HUM IMP Electronics Ltd. HWA Harris Canada Inc HWC DBA Hans Wedemeyer HWD Highwater Designs Ltd HWP Hewlett Packard HXM Hexium Ltd. HYC Hypercope Gmbh Aachen HYD Hydis Technologies.Co.,LTD HYO HYC CO., LTD. HYP Hyphen Ltd HYR Hypertec Pty Ltd HYT Heng Yu Technology (HK) Limited HYV Hynix Semiconductor IAF Institut f r angewandte Funksystemtechnik GmbH IAI Integration Associates, Inc. IAT IAT Germany GmbH IBC Integrated Business Systems IBI INBINE.CO.LTD IBM IBM Brasil IBM IBM France IBP IBP Instruments GmbH IBR IBR GmbH ICA ICA Inc ICC BICC Data Networks Ltd ICD ICD Inc ICE IC Ensemble ICI Infotek Communication Inc ICM Intracom SA ICN Sanyo Icon ICO Intel Corp ICP ICP Electronics, Inc./iEi Technology Corp. ICS Integrated Circuit Systems ICV Inside Contactless ICX ICCC A/S IDC International Datacasting Corporation IDE IDE Associates IDK IDK Corporation IDN Idneo Technologies IDO IDEO Product Development IDP Integrated Device Technology, Inc. IDS Interdigital Sistemas de Informacao IDT International Display Technology IDX IDEXX Labs IEC Interlace Engineering Corporation IEE IEE IEI Interlink Electronics IFS In Focus Systems Inc IFT Informtech IFX Infineon Technologies AG IFZ Infinite Z IGC Intergate Pty Ltd IGM IGM Communi IHE InHand Electronics IIC ISIC Innoscan Industrial Computers A/S III Intelligent Instrumentation IIN IINFRA Co., Ltd IKS Ikos Systems Inc ILC Image Logic Corporation ILS Innotech Corporation IMA Imagraph IMB ART s.r.l. IMC IMC Networks IMD ImasDe Canarias S.A. IME Imagraph IMG IMAGENICS Co., Ltd. IMI International Microsystems Inc IMM Immersion Corporation IMN Impossible Production IMP Impinj IMP Impression Products Incorporated IMT Inmax Technology Corporation INC Home Row Inc IND ILC INE Inventec Electronics (M) Sdn. Bhd. INF Inframetrics Inc ING Integraph Corporation INI Initio Corporation INK Indtek Co., Ltd. INL InnoLux Display Corporation INM InnoMedia Inc INN Innovent Systems, Inc. INO Innolab Pte Ltd INP Interphase Corporation INS Ines GmbH INT Interphase Corporation inu Inovatec S.p.A. INV Inviso, Inc. INX Communications Supply Corporation (A division of WESCO) INZ Best Buy IOA CRE Technology Corporation IOD I-O Data Device Inc IOM Iomega ION Inside Out Networks IOS i-O Display System IOT I/OTech Inc IPC IPC Corporation IPD Industrial Products Design, Inc. IPI Intelligent Platform Management Interface (IPMI) forum (Intel, HP, NEC, Dell) IPM IPM Industria Politecnica Meridionale SpA IPN Performance Technologies IPP IP Power Technologies GmbH IPR Ithaca Peripherals IPS IPS, Inc. (Intellectual Property Solutions, Inc.) IPT International Power Technologies IPW IPWireless, Inc IQI IneoQuest Technologies, Inc IQT IMAGEQUEST Co., Ltd IRD IRdata ISA Symbol Technologies ISC Id3 Semiconductors ISG Insignia Solutions Inc ISI Interface Solutions ISL Isolation Systems ISM Image Stream Medical ISP IntreSource Systems Pte Ltd ISR INSIS Co., LTD. ISS ISS Inc IST Intersolve Technologies ISY International Integrated Systems,Inc.(IISI) ITA Itausa Export North America ITC Intercom Inc ITD Internet Technology Corporation ITE Integrated Tech Express Inc ITK ITK Telekommunikation AG ITL Inter-Tel ITM ITM inc. ITN The NTI Group ITP IT-PRO Consulting und Systemhaus GmbH ITR Infotronic America, Inc. ITS IDTECH ITT I&T Telecom. ITX integrated Technology Express Inc IUC ICSL IVI Intervoice Inc IVM Iiyama North America IVS Intevac Photonics Inc. IWR Icuiti Corporation IWX Intelliworxx, Inc. IXD Intertex Data AB JAC Astec Inc JAE Japan Aviation Electronics Industry, Limited JAS Janz Automationssysteme AG JAT Jaton Corporation JAZ Carrera Computer Inc JCE Jace Tech Inc JDL Japan Digital Laboratory Co.,Ltd. JEN N-Vision JET JET POWER TECHNOLOGY CO., LTD. JFX Jones Futurex Inc JGD University College JIC Jaeik Information & Communication Co., Ltd. JKC JVC KENWOOD Corporation JMT Micro Technical Company Ltd JPC JPC Technology Limited JPW Wallis Hamilton Industries JQE CNet Technical Inc JSD JS DigiTech, Inc JSI Jupiter Systems, Inc. JSK SANKEN ELECTRIC CO., LTD JTS JS Motorsports JTY jetway security micro,inc JUK Janich & Klass Computertechnik GmbH JUP Jupiter Systems JVC JVC JWD Video International Inc. JWL Jewell Instruments, LLC JWS JWSpencer & Co. JWY Jetway Information Co., Ltd KAR Karna KBI Kidboard Inc KBL Kobil Systems GmbH KCD Chunichi Denshi Co.,LTD. KCL Keycorp Ltd KDE KDE KDK Kodiak Tech KDM Korea Data Systems Co., Ltd. KDS KDS USA KDT KDDI Technology Corporation KEC Kyushu Electronics Systems Inc KEM Kontron Embedded Modules GmbH KES Kesa Corporation KEY Key Tech Inc KFC SCD Tech KFE Komatsu Forest KFX Kofax Image Products KGL KEISOKU GIKEN Co.,Ltd. KIS KiSS Technology A/S KMC Mitsumi Company Ltd KME KIMIN Electronics Co., Ltd. KML Kensington Microware Ltd KNC Konica corporation KNX Nutech Marketing PTL KOB Kobil Systems GmbH KOD Eastman Kodak Company KOE KOLTER ELECTRONIC KOL Kollmorgen Motion Technologies Group KOU KOUZIRO Co.,Ltd. KOW KOWA Company,LTD. KPC King Phoenix Company KRL Krell Industries Inc. KRM Kroma Telecom KRY Kroy LLC KSC Kinetic Systems Corporation KSL Karn Solutions Ltd. KSX King Tester Corporation KTC Kingston Tech Corporation KTD Takahata Electronics Co.,Ltd. KTE K-Tech KTG Kayser-Threde GmbH KTI Konica Technical Inc KTK Key Tronic Corporation KTN Katron Tech Inc KUR Kurta Corporation KVA Kvaser AB KVX KeyView KWD Kenwood Corporation KYC Kyocera Corporation KYE KYE Syst Corporation KYK Samsung Electronics America Inc KZI K-Zone International co. Ltd. KZN K-Zone International LAB ACT Labs Ltd LAC LaCie LAF Microline LAG Laguna Systems LAN Sodeman Lancom Inc LAS LASAT Comm. A/S LAV Lava Computer MFG Inc LBO Lubosoft LCC LCI LCD Toshiba Matsushita Display Technology Co., Ltd LCE La Commande Electronique LCI Lite-On Communication Inc LCM Latitude Comm. LCN LEXICON LCS Longshine Electronics Company LCT Labcal Technologies LDT LogiDataTech Electronic GmbH LEC Lectron Company Ltd LED Long Engineering Design Inc LEG Legerity, Inc LEN Lenovo Group Limited LEO First International Computer Inc LEX Lexical Ltd LGC Logic Ltd LGI Logitech Inc LGS LG Semicom Company Ltd LGX Lasergraphics, Inc. LHA Lars Haagh ApS LHE Lung Hwa Electronics Company Ltd LHT Lighthouse Technologies Limited LIN Lenovo Beijing Co. Ltd. LIP Linked IP GmbH LIT Lithics Silicon Technology LJX Datalogic Corporation LKM Likom Technology Sdn. Bhd. LLL L-3 Communications LMG Lucent Technologies LMI Lexmark Int'l Inc LMP Leda Media Products LMT Laser Master LND Land Computer Company Ltd LNK Link Tech Inc LNR Linear Systems Ltd. LNT LANETCO International LNV Lenovo LOC Locamation B.V. LOE Loewe Opta GmbH LOG Logicode Technology Inc LOL Litelogic Operations Ltd LPE El-PUSK Co., Ltd. LPI Design Technology LPL LG Philips LSC LifeSize Communications LSD Intersil Corporation LSI Loughborough Sound Images LSJ LSI Japan Company Ltd LSL Logical Solutions LSY LSI Systems Inc LTC Labtec Inc LTI Jongshine Tech Inc LTK Lucidity Technology Company Ltd LTN Litronic Inc LTS LTS Scale LLC LTV Leitch Technology International Inc. LTW Lightware, Inc LUC Lucent Technologies LUM Lumagen, Inc. LUX Luxxell Research Inc LVI LVI Low Vision International AB LWC Labway Corporation LWR Lightware Visual Engineering LWW Lanier Worldwide LXC LXCO Technologies AG LXN Luxeon LXS ELEA CardWare LZX Lightwell Company Ltd MAC MAC System Company Ltd MAD Xedia Corporation MAE Maestro Pty Ltd MAG MAG InnoVision MAI Mutoh America Inc MAL Meridian Audio Ltd MAN LGIC MAS Mass Inc. MAT Matsushita Electric Ind. Company Ltd MAX Rogen Tech Distribution Inc MAY Maynard Electronics MAZ MAZeT GmbH MBC MBC MBD Microbus PLC MBM Marshall Electronics MBV Moreton Bay MCA American Nuclear Systems Inc MCC Micro Industries MCD McDATA Corporation MCE Metz-Werke GmbH & Co KG MCG Motorola Computer Group MCI Micronics Computers MCL Motorola Communications Israel MCM Metricom Inc MCN Micron Electronics Inc MCO Motion Computing Inc. MCP Magni Systems Inc MCQ Mat's Computers MCR Marina Communicaitons MCS Micro Computer Systems MCT Microtec MDA Media4 Inc MDC Midori Electronics MDD MODIS MDG Madge Networks MDI Micro Design Inc MDK Mediatek Corporation MDO Panasonic MDR Medar Inc MDS Micro Display Systems Inc MDT Magus Data Tech MDV MET Development Inc MDX MicroDatec GmbH MDY Microdyne Inc MEC Mega System Technologies Inc MED Messeltronik Dresden GmbH MEE Mitsubishi Electric Engineering Co., Ltd. MEG Abeam Tech Ltd MEI Panasonic Industry Company MEJ Mac-Eight Co., LTD. MEL Mitsubishi Electric Corporation MEN MEN Mikroelectronik Nueruberg GmbH MEP Meld Technology MEQ Matelect Ltd. MET Metheus Corporation MEX MSC Vertriebs GmbH MFG MicroField Graphics Inc MFI Micro Firmware MFR MediaFire Corp. MGA Mega System Technologies, Inc. MGC Mentor Graphics Corporation MGE Schneider Electric S.A. MGL M-G Technology Ltd MGT Megatech R & D Company MIC Micom Communications Inc MID miro Displays MII Mitec Inc MIL Marconi Instruments Ltd MIM Mimio – A Newell Rubbermaid Company MIN Minicom Digital Signage MIP micronpc.com MIR Miro Computer Prod. MIS Modular Industrial Solutions Inc MIT MCM Industrial Technology GmbH MJI MARANTZ JAPAN, INC. MJS MJS Designs MKC Media Tek Inc. MKT MICROTEK Inc. MKV Trtheim Technology MLD Deep Video Imaging Ltd MLG Micrologica AG MLI McIntosh Laboratory Inc. MLM Millennium Engineering Inc MLN Mark Levinson MLS Milestone EPE MLX Mylex Corporation MMA Micromedia AG MMD Micromed Biotecnologia Ltd MMF Minnesota Mining and Manufacturing MMI Multimax MMM Electronic Measurements MMN MiniMan Inc MMS MMS Electronics MNC Mini Micro Methods Ltd MNL Monorail Inc MNP Microcom MOD Modular Technology MOM Momentum Data Systems MOS Moses Corporation MOT Motorola UDS MPC M-Pact Inc MPI Mediatrix Peripherals Inc MPJ Microlab MPL Maple Research Inst. Company Ltd MPN Mainpine Limited MPS mps Software GmbH MPX Micropix Technologies, Ltd. MQP MultiQ Products AB MRA Miranda Technologies Inc MRC Marconi Simulation & Ty-Coch Way Training MRD MicroDisplay Corporation MRK Maruko & Company Ltd MRL Miratel MRO Medikro Oy MRT Merging Technologies MSA Micro Systemation AB MSC Mouse Systems Corporation MSD Datenerfassungs- und Informationssysteme MSF M-Systems Flash Disk Pioneers MSG MSI GmbH MSH Microsoft MSI Microstep MSK Megasoft Inc MSL MicroSlate Inc. MSM Advanced Digital Systems MSP Mistral Solutions [P] Ltd. MSR MASPRO DENKOH Corp. MST MS Telematica MSU motorola MSV Mosgi Corporation MSX Micomsoft Co., Ltd. MSY MicroTouch Systems Inc MTB Media Technologies Ltd. MTC Mars-Tech Corporation MTD MindTech Display Co. Ltd MTE MediaTec GmbH MTH Micro-Tech Hearing Instruments MTI MaxCom Technical Inc MTI Motorola Inc. MTK Microtek International Inc. MTL Mitel Corporation MTM Motium MTN Mtron Storage Technology Co., Ltd. MTR Mitron computer Inc MTS Multi-Tech Systems MTU Mark of the Unicorn Inc MTX Matrox MUD Multi-Dimension Institute MUK mainpine limited MVD Microvitec PLC MVI Media Vision Inc MVM SOBO VISION MVS Microvision MVX COM 1 MWI Multiwave Innovation Pte Ltd MWR mware MWY Microway Inc MXD MaxData Computer GmbH & Co.KG MXI Macronix Inc MXL Hitachi Maxell, Ltd. MXP Maxpeed Corporation MXT Maxtech Corporation MXV MaxVision Corporation MYA Monydata MYR Myriad Solutions Ltd MYX Micronyx Inc NAC Ncast Corporation NAD NAD Electronics NAK Nakano Engineering Co.,Ltd. NAL Network Alchemy NAT NaturalPoint Inc. NAV Navigation Corporation NAX Naxos Tecnologia NBL N*Able Technologies Inc NBS National Key Lab. on ISN NBT NingBo Bestwinning Technology CO., Ltd NCA Nixdorf Company NCC NCR Corporation NCE Norcent Technology, Inc. NCI NewCom Inc NCL NetComm Ltd NCR NCR Electronics NCS Northgate Computer Systems NCT NEC CustomTechnica, Ltd. NDC National DataComm Corporaiton NDI National Display Systems NDK Naitoh Densei CO., LTD. NDL Network Designers NDS Nokia Data NEC NEC Corporation NEO NEO TELECOM CO.,LTD. NET Mettler Toledo NEU NEUROTEC - EMPRESA DE PESQUISA E DESENVOLVIMENTO EM BIOMEDICINA NEX Nexgen Mediatech Inc., NFC BTC Korea Co., Ltd NFS Number Five Software NGC Network General NGS A D S Exports NHT Vinci Labs NIC National Instruments Corporation NIS Nissei Electric Company NIT Network Info Technology NIX Seanix Technology Inc NLC Next Level Communications NME Navico, Inc. NMP Nokia Mobile Phones NMS Natural Micro System NMV NEC-Mitsubishi Electric Visual Systems Corporation NMX Neomagic NNC NNC NOE NordicEye AB NOI North Invent A/S NOK Nokia Display Products NOR Norand Corporation NOT Not Limited Inc NPI Network Peripherals Inc NRL U.S. Naval Research Lab NRT Beijing Northern Radiantelecom Co. NRV Taugagreining hf NSC National Semiconductor Corporation NSI NISSEI ELECTRIC CO.,LTD NSP Nspire System Inc. NSS Newport Systems Solutions NST Network Security Technology Co NTC NeoTech S.R.L NTI New Tech Int'l Company NTL National Transcomm. Ltd NTN Nuvoton Technology Corporation NTR N-trig Innovative Technologies, Inc. NTS Nits Technology Inc. NTT NTT Advanced Technology Corporation NTW Networth Inc NTX Netaccess Inc NUG NU Technology, Inc. NUI NU Inc. NVC NetVision Corporation NVD Nvidia NVI NuVision US, Inc. NVL Novell Inc NVT Navatek Engineering Corporation NWC NW Computer Engineering NWP NovaWeb Technologies Inc NWS Newisys, Inc. NXC NextCom K.K. NXG Nexgen NXP NXP Semiconductors bv. NXQ Nexiq Technologies, Inc. NXS Technology Nexus Secure Open Systems AB NYC nakayo telecommunications,inc. OAK Oak Tech Inc OAS Oasys Technology Company OBS Optibase Technologies OCD Macraigor Systems Inc OCN Olfan OCS Open Connect Solutions ODM ODME Inc. ODR Odrac OEC ORION ELECTRIC CO.,LTD OEI Optum Engineering Inc. OIC Option Industrial Computers OIM Option International OIN Option International OKI OKI Electric Industrial Company Ltd OLC Olicom A/S OLD Olidata S.p.A. OLI Olivetti OLT Olitec S.A. OLV Olitec S.A. OLY OLYMPUS CORPORATION OMC OBJIX Multimedia Corporation OMN Omnitel OMR Omron Corporation ONE Oneac Corporation ONK ONKYO Corporation ONL OnLive, Inc ONS On Systems Inc ONW OPEN Networks Ltd ONX SOMELEC Z.I. Du Vert Galanta OOS OSRAM OPC Opcode Inc OPI D.N.S. Corporation OPP OPPO Digital, Inc. OPT OPTi Inc OPV Optivision Inc OQI Oksori Company Ltd ORG ORGA Kartensysteme GmbH ORI OSR Open Systems Resources, Inc. ORN ORION ELECTRIC CO., LTD. OSA OSAKA Micro Computer, Inc. OSP OPTI-UPS Corporation OSR Oksori Company Ltd OTB outsidetheboxstuff.com OTI Orchid Technology OTM Optoma Corporation OTT OPTO22, Inc. OUK OUK Company Ltd OVR Oculus VR, Inc. OWL Mediacom Technologies Pte Ltd OXU Oxus Research S.A. OYO Shadow Systems OZC OZ Corporation OZO Tribe Computer Works Inc PAC Pacific Avionics Corporation PAD Promotion and Display Technology Ltd. PAK Many CNC System Co., Ltd. PAM Peter Antesberger Messtechnik PAN The Panda Project PAR Parallan Comp Inc PBI Pitney Bowes PBL Packard Bell Electronics PBN Packard Bell NEC PBV Pitney Bowes PCA Philips BU Add On Card PCB OCTAL S.A. PCC PowerCom Technology Company Ltd PCG First Industrial Computer Inc PCI Pioneer Computer Inc PCK PCBANK21 PCL pentel.co.,ltd PCM PCM Systems Corporation PCO Performance Concepts Inc., PCP Procomp USA Inc PCS TOSHIBA PERSONAL COMPUTER SYSTEM CORPRATION PCT PC-Tel Inc PCW Pacific CommWare Inc PCX PC Xperten PDM Psion Dacom Plc. PDN AT&T Paradyne PDR Pure Data Inc PDS PD Systems International Ltd PDT PDTS - Prozessdatentechnik und Systeme PDV Prodrive B.V. PEC POTRANS Electrical Corp. PEI PEI Electronics Inc PEL Primax Electric Ltd PEN Interactive Computer Products Inc PEP Peppercon AG PER Perceptive Signal Technologies PET Practical Electronic Tools PFT Telia ProSoft AB PGI PACSGEAR, Inc. PGM Paradigm Advanced Research Centre PGP propagamma kommunikation PGS Princeton Graphic Systems PHC Pijnenburg Beheer N.V. PHE Philips Medical Systems Boeblingen GmbH PHI DO NOT USE - PHI PHL Philips Consumer Electronics Company PHO Photonics Systems Inc. PHS Philips Communication Systems PHY Phylon Communications PIE Pacific Image Electronics Company Ltd PIM Prism, LLC PIO Pioneer Electronic Corporation PIX Pixie Tech Inc PJA Projecta PJD Projectiondesign AS PJT Pan Jit International Inc. PKA Acco UK ltd. PLC Pro-Log Corporation PLF Panasonic Avionics Corporation PLM PROLINK Microsystems Corp. PLT PT Hartono Istana Teknologi PLV PLUS Vision Corp. PLX Parallax Graphics PLY Polycom Inc. PMC PMC Consumer Electronics Ltd PMD TDK USA Corporation PMM Point Multimedia System PMT Promate Electronic Co., Ltd. PMX Photomatrix PNG Microsoft PNG P.I. Engineering Inc PNL Panelview, Inc. PNP Microsoft PNR Planar Systems, Inc. PNS PanaScope PNX Phoenix Technologies, Ltd. POL PolyComp (PTY) Ltd. PON Perpetual Technologies, LLC POR Portalis LC PPC Phoenixtec Power Company Ltd PPD MEPhI PPI Practical Peripherals PPM Clinton Electronics Corp. PPP Purup Prepress AS PPR PicPro PPX Perceptive Pixel Inc. PQI Pixel Qi PRA PRO/AUTOMATION PRC PerComm PRD Praim S.R.L. PRF Digital Electronics Corporation PRG The Phoenix Research Group Inc PRI Priva Hortimation BV PRM Prometheus PRO Proteon PRS Leutron Vision PRT Parade Technologies, Ltd. PRX Proxima Corporation PSA Advanced Signal Processing Technologies PSC Philips Semiconductors PSD Peus-Systems GmbH PSE Practical Solutions Pte., Ltd. PSI PSI-Perceptive Solutions Inc PSL Perle Systems Limited PSM Prosum PST Global Data SA PSY Prodea Systems Inc. PTA PAR Tech Inc. PTC PS Technology Corporation PTG Cipher Systems Inc PTH Pathlight Technology Inc PTI Promise Technology Inc PTL Pantel Inc PTS Plain Tree Systems Inc PTW DO NOT USE - PTW PUL Pulse-Eight Ltd PVC DO NOT USE - PVC PVG Proview Global Co., Ltd PVI Prime view international Co., Ltd PVM Penta Studiotechnik GmbH PVN Pixel Vision PVP Klos Technologies, Inc. PXC Phoenix Contact PXE PIXELA CORPORATION PXL The Moving Pixel Company PXM Proxim Inc QCC QuakeCom Company Ltd QCH Metronics Inc QCI Quanta Computer Inc QCK Quick Corporation QCL Quadrant Components Inc QCP Qualcomm Inc QDI Quantum Data Incorporated QDM Quadram QDS Quanta Display Inc. QFF Padix Co., Inc. QFI Quickflex, Inc QLC Q-Logic QQQ Chuomusen Co., Ltd. QSI Quantum Solutions, Inc. QTD Quantum 3D Inc QTH Questech Ltd QTI Quicknet Technologies Inc QTM Quantum QTR Qtronix Corporation QUA Quatographic AG QUE Questra Consulting QVU Quartics RAC Racore Computer Products Inc RAD Radisys Corporation RAI Rockwell Automation/Intecolor RAN Rancho Tech Inc RAR Raritan, Inc. RAS RAScom Inc RAT Rent-A-Tech RAY Raylar Design, Inc. RCE Parc d'Activite des Bellevues RCH Reach Technology Inc RCI RC International RCN Radio Consult SRL RCO Rockwell Collins RDI Rainbow Displays, Inc. RDM Tremon Enterprises Company Ltd RDN RADIODATA GmbH RDS Radius Inc REA Real D REC ReCom RED Research Electronics Development Inc REF Reflectivity, Inc. REH Rehan Electronics Ltd. REL Reliance Electric Ind Corporation REM SCI Systems Inc. REN Renesas Technology Corp. RES ResMed Pty Ltd RET Resonance Technology, Inc. REX RATOC Systems, Inc. RGB RGB Spectrum RGL Robertson Geologging Ltd RHD RightHand Technologies RHM Rohm Company Ltd RHT Red Hat, Inc. RIC RICOH COMPANY, LTD. RII Racal Interlan Inc RIO Rios Systems Company Ltd RIT Ritech Inc RIV Rivulet Communications RJA Roland Corporation RJS Advanced Engineering RKC Reakin Technolohy Corporation RLD MEPCO RLN RadioLAN Inc RMC Raritan Computer, Inc RMP Research Machines RMT Roper Mobile RNB Rainbow Technologies ROB Robust Electronics GmbH ROH Rohm Co., Ltd. ROK Rockwell International ROP Roper International Ltd ROS Rohde & Schwarz RPI RoomPro Technologies RPT R.P.T.Intergroups RRI Radicom Research Inc RSC PhotoTelesis RSH ADC-Centre RSI Rampage Systems Inc RSN Radiospire Networks, Inc. RSQ R Squared RSS Rockwell Semiconductor Systems RSV Ross Video Ltd RSX Rapid Tech Corporation RTC Relia Technologies RTI Rancho Tech Inc RTK DO NOT USE - RTK RTL Realtek Semiconductor Company Ltd RTS Raintree Systems RUN RUNCO International RUP Ups Manufactoring s.r.l. RVC RSI Systems Inc RVI Realvision Inc RVL Reveal Computer Prod RWC Red Wing Corporation RXT Tectona SoftSolutions (P) Ltd., SAA Sanritz Automation Co.,Ltd. SAE Saab Aerotech SAG Sedlbauer SAI Sage Inc SAK Saitek Ltd SAM Samsung Electric Company SAN Sanyo Electric Co.,Ltd. SAS Stores Automated Systems Inc SAT Shuttle Tech SBC Shanghai Bell Telephone Equip Mfg Co SBD Softbed - Consulting & Development Ltd SBI SMART Technologies Inc. SBS SBS-or Industrial Computers GmbH SBT Senseboard Technologies AB SCB SeeCubic B.V. SCC SORD Computer Corporation SCD Sanyo Electric Company Ltd SCE Sun Corporation SCH Schlumberger Cards SCI System Craft SCL Sigmacom Co., Ltd. SCM SCM Microsystems Inc SCN Scanport, Inc. SCO SORCUS Computer GmbH SCP Scriptel Corporation SCR Systran Corporation SCS Nanomach Anstalt SCT Smart Card Technology SDA SAT (Societe Anonyme) SDD Intrada-SDD Ltd SDE Sherwood Digital Electronics Corporation SDF SODIFF E&T CO., Ltd. SDH Communications Specialies, Inc. SDI Samtron Displays Inc SDK SAIT-Devlonics SDR SDR Systems SDS SunRiver Data System SDT Siemens AG SDX SDX Business Systems Ltd SEA Seanix Technology Inc. SEB system elektronik GmbH SEC Seiko Epson Corporation SEE SeeColor Corporation SEG DO NOT USE - SEG SEI Seitz & Associates Inc SEL Way2Call Communications SEM Samsung Electronics Company Ltd SEN Sencore SEO SEOS Ltd SEP SEP Eletronica Ltda. SER Sony Ericsson Mobile Communications Inc. SES Session Control LLC SET SendTek Corporation SFM TORNADO Company SFT Mikroforum Ring 3 SGC Spectragraphics Corporation SGD Sigma Designs, Inc. SGE Kansai Electric Company Ltd SGI Scan Group Ltd SGL Super Gate Technology Company Ltd SGM SAGEM SGO Logos Design A/S SGT Stargate Technology SGW Shanghai Guowei Science and Technology Co., Ltd. SGX Silicon Graphics Inc SGZ Systec Computer GmbH SHC ShibaSoku Co., Ltd. SHG Soft & Hardware development Goldammer GmbH SHI Jiangsu Shinco Electronic Group Co., Ltd SHP Sharp Corporation SHR Digital Discovery SHT Shin Ho Tech SIA SIEMENS AG SIB Sanyo Electric Company Ltd SIC Sysmate Corporation SID Seiko Instruments Information Devices Inc SIE Siemens SIG Sigma Designs Inc SII Silicon Image, Inc. SIL Silicon Laboratories, Inc SIM S3 Inc SIN Singular Technology Co., Ltd. SIR Sirius Technologies Pty Ltd SIS Silicon Integrated Systems Corporation SIT Sitintel SIU Seiko Instruments USA Inc SIX Zuniq Data Corporation SJE Sejin Electron Inc SKD Schneider & Koch SKT Samsung Electro-Mechanics Company Ltd SKY SKYDATA S.P.A. SLA Systeme Lauer GmbH&Co KG SLB Shlumberger Ltd SLC Syslogic Datentechnik AG SLF StarLeaf SLH Silicon Library Inc. SLI Symbios Logic Inc SLK Silitek Corporation SLM Solomon Technology Corporation SLR Schlumberger Technology Corporate SLS Schnick-Schnack-Systems GmbH SLT Salt Internatioinal Corp. SLX Specialix SMA SMART Modular Technologies SMB Schlumberger SMC Standard Microsystems Corporation SME Sysmate Company SMI SpaceLabs Medical Inc SMK SMK CORPORATION SML Sumitomo Metal Industries, Ltd. SMM Shark Multimedia Inc SMO STMicroelectronics SMP Simple Computing SMR B.& V. s.r.l. SMS Silicom Multimedia Systems Inc SMT Silcom Manufacturing Tech Inc SNC Sentronic International Corp. SNI Siemens Microdesign GmbH SNK S&K Electronics SNO SINOSUN TECHNOLOGY CO., LTD SNP Siemens Nixdorf Info Systems SNS Cirtech (UK) Ltd SNT SuperNet Inc SNW Snell & Wilcox SNX Sonix Comm. Ltd SNY Sony SOI Silicon Optix Corporation SOL Solitron Technologies Inc SON Sony SOR Sorcus Computer GmbH SOT Sotec Company Ltd SOY SOYO Group, Inc SPC SpinCore Technologies, Inc SPE SPEA Software AG SPH G&W Instruments GmbH SPI SPACE-I Co., Ltd. SPK SpeakerCraft SPL Smart Silicon Systems Pty Ltd SPN Sapience Corporation SPR pmns GmbH SPS Synopsys Inc SPT Sceptre Tech Inc SPU SIM2 Multimedia S.P.A. SPX Simplex Time Recorder Co. SQT Sequent Computer Systems Inc SRC Integrated Tech Express Inc SRD Setred SRF Surf Communication Solutions Ltd SRG Intuitive Surgical, Inc. SRS SR-Systems e.K. SRT SeeReal Technologies GmbH SSC Sierra Semiconductor Inc SSD FlightSafety International SSE Samsung Electronic Co. SSI S-S Technology Inc SSJ Sankyo Seiki Mfg.co., Ltd SSP Spectrum Signal Proecessing Inc SSS S3 Inc SST SystemSoft Corporation STA ST Electronics Systems Assembly Pte Ltd STB STB Systems Inc STC STAC Electronics STD STD Computer Inc STE SII Ido-Tsushin Inc STF Starflight Electronics STG StereoGraphics Corp. STH Semtech Corporation STI Smart Tech Inc STK SANTAK CORP. STL SigmaTel Inc STM SGS Thomson Microelectronics STN Samsung Electronics America STO Stollmann E+V GmbH STP StreamPlay Ltd STR Starlight Networks Inc STS SITECSYSTEM CO., LTD. STT Star Paging Telecom Tech (Shenzhen) Co. Ltd. STU Sentelic Corporation STW Starwin Inc. STX ST-Ericsson STY SDS Technologies SUB Subspace Comm. Inc SUM Summagraphics Corporation SUN Sun Electronics Corporation SUP Supra Corporation SUR Surenam Computer Corporation SVA SGEG SVC Intellix Corp. SVD SVD Computer SVI Sun Microsystems SVS SVSI SVT SEVIT Co., Ltd. SWC Software Café SWI Sierra Wireless Inc. SWL Sharedware Ltd SWS Static SWT Software Technologies Group,Inc. SXB Syntax-Brillian SXD Silex technology, Inc. SXG SELEX GALILEO SXL SolutionInside SXT SHARP TAKAYA ELECTRONIC INDUSTRY CO.,LTD. SYC Sysmic SYE SY Electronics Ltd SYK Stryker Communications SYL Sylvania Computer Products SYM Symicron Computer Communications Ltd. SYN Synaptics Inc SYP SYPRO Co Ltd SYS Sysgration Ltd SYT Seyeon Tech Company Ltd SYV SYVAX Inc SYX Prime Systems, Inc. TAA Tandberg TAB Todos Data System AB TAG Teles AG TAI Toshiba America Info Systems Inc TAM Tamura Seisakusyo Ltd TAS Taskit Rechnertechnik GmbH TAT Teleliaison Inc TAX Taxan (Europe) Ltd TBB Triple S Engineering Inc TBC Turbo Communication, Inc TBS Turtle Beach System TCC Tandon Corporation TCD Taicom Data Systems Co., Ltd. TCE Century Corporation TCH Interaction Systems, Inc TCI Tulip Computers Int'l B.V. TCJ TEAC America Inc TCL Technical Concepts Ltd TCM 3Com Corporation TCN Tecnetics (PTY) Ltd TCO Thomas-Conrad Corporation TCR Thomson Consumer Electronics TCS Tatung Company of America Inc TCT Telecom Technology Centre Co. Ltd. TCX FREEMARS Heavy Industries TDC Teradici TDD Tandberg Data Display AS TDK TDK USA Corporation TDM Tandem Computer Europe Inc TDP 3D Perception TDS Tri-Data Systems Inc TDT TDT TDV TDVision Systems, Inc. TDY Tandy Electronics TEA TEAC System Corporation TEC Tecmar Inc TEK Tektronix Inc TEL Promotion and Display Technology Ltd. TER TerraTec Electronic GmbH TGC Toshiba Global Commerce Solutions, Inc. TGI TriGem Computer Inc TGM TriGem Computer,Inc. TGS Torus Systems Ltd TGV Grass Valley Germany GmbH THN Thundercom Holdings Sdn. Bhd. TIC Trigem KinfoComm TIP TIPTEL AG TIV OOO Technoinvest TIX Tixi.Com GmbH TKC Taiko Electric Works.LTD TKN Teknor Microsystem Inc TKO TouchKo, Inc. TKS TimeKeeping Systems, Inc. TLA Ferrari Electronic GmbH TLD Telindus TLF Teleforce.,co,ltd TLI TOSHIBA TELI CORPORATION TLK Telelink AG TLS Teleste Educational OY TLT Dai Telecom S.p.A. TLV S3 Inc TLX Telxon Corporation TMC Techmedia Computer Systems Corporation TME AT&T Microelectronics TMI Texas Microsystem TMM Time Management, Inc. TMR Taicom International Inc TMS Trident Microsystems Ltd TMT T-Metrics Inc. TMX Thermotrex Corporation TNC TNC Industrial Company Ltd TNJ DO NOT USE - TNJ TNM TECNIMAGEN SA TNY Tennyson Tech Pty Ltd TOE TOEI Electronics Co., Ltd. TOG The OPEN Group TON TONNA TOP Orion Communications Co., Ltd. TOS Toshiba Corporation TOU Touchstone Technology TPC Touch Panel Systems Corporation TPE Technology Power Enterprises Inc TPJ Junnila TPK TOPRE CORPORATION TPR Topro Technology Inc TPS Teleprocessing Systeme GmbH TPT Thruput Ltd TPV Top Victory Electronics ( Fujian ) Company Ltd TPZ Ypoaz Systems Inc TRA TriTech Microelectronics International TRC Trioc AB TRD Trident Microsystem Inc TRE Tremetrics TRI Tricord Systems TRL Royal Information TRM Tekram Technology Company Ltd TRN Datacommunicatie Tron B.V. TRS Torus Systems Ltd TRT Tritec Electronic AG TRU Aashima Technology B.V. TRV Trivisio Prototyping GmbH TRX Trex Enterprises TSB Toshiba America Info Systems Inc TSC Sanyo Electric Company Ltd TSD TechniSat Digital GmbH TSE Tottori Sanyo Electric TSF Racal-Airtech Software Forge Ltd TSG The Software Group Ltd TSI TeleVideo Systems TSL Tottori SANYO Electric Co., Ltd. TSP U.S. Navy TST Transtream Inc TSV TRANSVIDEO TSY TouchSystems TTA Topson Technology Co., Ltd. TTB National Semiconductor Japan Ltd TTC Telecommunications Techniques Corporation TTE TTE, Inc. TTI Trenton Terminals Inc TTK Totoku Electric Company Ltd TTL 2-Tel B.V. TTS TechnoTrend Systemtechnik GmbH TTY TRIDELITY Display Solutions GmbH TUA T+A elektroakustik GmbH TUT Tut Systems TVD Tecnovision TVI Truevision TVM Taiwan Video & Monitor Corporation TVO TV One Ltd TVR TV Interactive Corporation TVS TVS Electronics Limited TVV TV1 GmbH TWA Tidewater Association TWE Kontron Electronik TWH Twinhead International Corporation TWI Easytel oy TWK TOWITOKO electronics GmbH TWX TEKWorx Limited TXL Trixel Ltd TXN Texas Insturments TXT Textron Defense System TYN Tyan Computer Corporation UAS Ultima Associates Pte Ltd UBI Ungermann-Bass Inc UBL Ubinetics Ltd. UDN Uniden Corporation UEC Ultima Electronics Corporation UEG Elitegroup Computer Systems Company Ltd UEI Universal Electronics Inc UET Universal Empowering Technologies UFG UNIGRAF-USA UFO UFO Systems Inc UHB XOCECO UIC Uniform Industrial Corporation UJR Ueda Japan Radio Co., Ltd. ULT Ultra Network Tech UMC United Microelectr Corporation UMG Umezawa Giken Co.,Ltd UMM Universal Multimedia UNA Unisys DSD UNB Unisys Corporation UNC Unisys Corporation UND Unisys Corporation UNE Unisys Corporation UNF Unisys Corporation UNI Uniform Industry Corp. UNI Unisys Corporation UNM Unisys Corporation UNO Unisys Corporation UNP Unitop UNS Unisys Corporation UNT Unisys Corporation UNY Unicate UPP UPPI UPS Systems Enhancement URD Video Computer S.p.A. USA Utimaco Safeware AG USD U.S. Digital Corporation USI Universal Scientific Industrial Co., Ltd. USR U.S. Robotics Inc UTD Up to Date Tech UWC Uniwill Computer Corp. VAD Vaddio, LLC VAL Valence Computing Corporation VAR Varian Australia Pty Ltd VBR VBrick Systems Inc. VBT Valley Board Ltda VCC Virtual Computer Corporation VCI VistaCom Inc VCJ Victor Company of Japan, Limited VCM Vector Magnetics, LLC VCX VCONEX VDA Victor Data Systems VDC VDC Display Systems VDM Vadem VDO Video & Display Oriented Corporation VDS Vidisys GmbH & Company VDT Viditec, Inc. VEC Vector Informatik GmbH VEK Vektrex VES Vestel Elektronik Sanayi ve Ticaret A. S. VFI VeriFone Inc VHI Macrocad Development Inc. VIA VIA Tech Inc VIB Tatung UK Ltd VIC Victron B.V. VID Ingram Macrotron Germany VIK Viking Connectors VIM Via Mons Ltd. VIN Vine Micros Ltd VIR Visual Interface, Inc VIS Visioneer VIT Visitech AS VIZ VIZIO, Inc VLB ValleyBoard Ltda. VLK Vislink International Ltd VLT VideoLan Technologies VMI Vermont Microsystems VML Vine Micros Limited VMW VMware Inc., VNC Vinca Corporation VOB MaxData Computer AG VPI Video Products Inc VPR Best Buy VQ@ Vision Quest VRC Virtual Resources Corporation VSC ViewSonic Corporation VSD 3M VSI VideoServer VSN Ingram Macrotron VSP Vision Systems GmbH VSR V-Star Electronics Inc. VTC VTel Corporation VTG Voice Technologies Group Inc VTI VLSI Tech Inc VTK Viewteck Co., Ltd. VTL Vivid Technology Pte Ltd VTM Miltope Corporation VTN VIDEOTRON CORP. VTS VTech Computers Ltd VTV VATIV Technologies VTX Vestax Corporation VUT Vutrix (UK) Ltd VWB Vweb Corp. WAC Wacom Tech WAL Wave Access WAN DO NOT USE - WAN WAV Wavephore WBN MicroSoftWare WBS WB Systemtechnik GmbH WCI Wisecom Inc WCS Woodwind Communications Systems Inc WDC Western Digital WDE Westinghouse Digital Electronics WEB WebGear Inc WEC Winbond Electronics Corporation WEL W-DEV WEY WEY Design AG WHI Whistle Communications WII Innoware Inc WIL WIPRO Information Technology Ltd WIN Wintop Technology Inc WIP Wipro Infotech WKH Uni-Take Int'l Inc. WLD Wildfire Communications Inc WML Wolfson Microelectronics Ltd WMO Westermo Teleindustri AB WMT Winmate Communication Inc WNI WillNet Inc. WNV Winnov L.P. WNX Wincor Nixdorf International GmbH WPA Matsushita Communication Industrial Co., Ltd. WPI Wearnes Peripherals International (Pte) Ltd WRC WiNRADiO Communications WSC CIS Technology Inc WSP Wireless And Smart Products Inc. WST Wistron Corporation WTC ACC Microelectronics WTI WorkStation Tech WTK Wearnes Thakral Pte WTS Restek Electric Company Ltd WVM Wave Systems Corporation WVV WolfVision GmbH WWV World Wide Video, Inc. WXT Woxter Technology Co. Ltd WYS Wyse Technology WYT Wooyoung Image & Information Co.,Ltd. XAC XAC Automation Corp XAD Alpha Data XDM XDM Ltd. XER DO NOT USE - XER XFG Jan Strapko - FOTO XFO EXFO Electro Optical Engineering XIN Xinex Networks Inc XIO Xiotech Corporation XIR Xirocm Inc XIT Xitel Pty ltd XLX Xilinx, Inc. XMM C3PO S.L. XNT XN Technologies, Inc. XOC DO NOT USE - XOC XQU SHANGHAI SVA-DAV ELECTRONICS CO., LTD XRC Xircom Inc XRO XORO ELECTRONICS (CHENGDU) LIMITED XSN Xscreen AS XST XS Technologies Inc XSY XSYS XTD Icuiti Corporation XTE X2E GmbH XTL Crystal Computer XTN X-10 (USA) Inc XYC Xycotec Computer GmbH YED Y-E Data Inc YHQ Yokogawa Electric Corporation YHW Exacom SA YMH Yamaha Corporation YOW American Biometric Company ZAN Zandar Technologies plc ZAX Zefiro Acoustics ZAZ Zazzle Technologies ZBR Zebra Technologies International, LLC ZCT ZeitControl cardsystems GmbH ZDS Zenith Data Systems ZGT Zenith Data Systems ZIC Nationz Technologies Inc. ZMT Zalman Tech Co., Ltd. ZMZ Z Microsystems ZNI Zetinet Inc ZNX Znyx Adv. Systems ZOW Zowie Intertainment, Inc ZRN Zoran Corporation ZSE Zenith Data Systems ZTC ZyDAS Technology Corporation ZTE ZTE Corporation ZTI Zoom Telephonics Inc ZTM ZT Group Int'l Inc. ZTT Z3 Technology ZYD Zydacron Inc ZYP Zypcom Inc ZYT Zytex Computers ZYX Zyxel ZZZ Boca Research Inc DisplayCAL-3.1.0.0/DisplayCAL/postinstall.py0000644000076500000000000002607312647526531020370 0ustar devwheel00000000000000# -*- coding: utf-8 -*- from StringIO import StringIO from subprocess import call from os.path import basename, splitext from glob import glob import os import shutil import sys import traceback from meta import name from util_os import relpath, which recordfile_name = "INSTALLED_FILES" if not sys.stdout.isatty(): sys.stdout = StringIO() if sys.platform == "win32": try: create_shortcut # this function is only available within bdist_wininst installers except NameError: try: from pythoncom import (CoCreateInstance, CLSCTX_INPROC_SERVER, IID_IPersistFile) from win32com.shell import shell import win32con except ImportError: def create_shortcut(*args): pass else: def create_shortcut(*args): shortcut = CoCreateInstance( shell.CLSID_ShellLink, None, CLSCTX_INPROC_SERVER, shell.IID_IShellLink ) shortcut.SetPath(args[0]) shortcut.SetDescription(args[1]) if len(args) > 3: shortcut.SetArguments(args[3]) if len(args) > 4: shortcut.SetWorkingDirectory(args[4]) if len(args) > 5: shortcut.SetIconLocation(args[5], args[6] if len(args) > 6 else 0) shortcut.SetShowCmd(win32con.SW_SHOWNORMAL) shortcut.QueryInterface(IID_IPersistFile).Save(args[2], 0) try: directory_created # this function is only available within bdist_wininst installers except NameError: def directory_created(path): pass try: file_created # this function is only available within bdist_wininst installers except NameError: try: import win32api except ImportError: def file_created(path): pass else: def file_created(path): if os.path.exists(recordfile_name): installed_files = [] if os.path.exists(recordfile_name): recordfile = open(recordfile_name, "r") installed_files.extend(line.rstrip("\n") for line in recordfile) recordfile.close() try: path.decode("ASCII") except (UnicodeDecodeError, UnicodeEncodeError): # the contents of the record file used by distutils # must be ASCII GetShortPathName allows us to avoid # any issues with encoding because it returns the # short path as 7-bit string (while still being a # valid path) path = win32api.GetShortPathName(path) installed_files.append(path) recordfile = open(recordfile_name, "w") recordfile.write("\n".join(installed_files)) recordfile.close() try: get_special_folder_path # this function is only available within bdist_wininst installers except NameError: try: from win32com.shell import shell, shellcon except ImportError: def get_special_folder_path(csidl_string): pass else: def get_special_folder_path(csidl_string): return shell.SHGetSpecialFolderPath(0, getattr(shellcon, csidl_string), 1) def postinstall(prefix=None): if sys.platform == "darwin": # TODO: implement pass elif sys.platform == "win32": if prefix is None: # assume we are running from bdist_wininst installer modpath = os.path.dirname(os.path.abspath(__file__)) else: # assume we are running from source dir, # or from install dir modpath = prefix if os.path.exists(modpath): mainicon = os.path.join(modpath, "theme", "icons", name + ".ico") if os.path.exists(mainicon): try: startmenu_programs_common = get_special_folder_path( "CSIDL_COMMON_PROGRAMS") startmenu_programs = get_special_folder_path( "CSIDL_PROGRAMS") startmenu_common = get_special_folder_path( "CSIDL_COMMON_STARTMENU") startmenu = get_special_folder_path("CSIDL_STARTMENU") except OSError, exception: traceback.print_exc() return else: filenames = (filter(lambda filename: not filename.endswith("-script.py") and not filename.endswith("-script.pyw") and not filename.endswith(".manifest") and not filename.endswith(".pyc") and not filename.endswith(".pyo") and not filename.endswith("_postinstall.py"), glob(os.path.join(sys.prefix, "Scripts", name + "*"))) + ["LICENSE.txt", "README.html", "Uninstall"]) installed_shortcuts = [] for path in (startmenu_programs_common, startmenu_programs): if path: grppath = os.path.join(path, name) if path == startmenu_programs: group = relpath(grppath, startmenu) else: group = relpath(grppath, startmenu_common) if not os.path.exists(grppath): try: os.makedirs(grppath) except Exception, exception: # maybe insufficient privileges? pass if os.path.exists(grppath): print ("Created start menu group '%s' in " "%s") % (name, (unicode(path, "MBCS", "replace") if type(path) != unicode else path).encode("MBCS", "replace")) else: print ("Failed to create start menu group '%s' in " "%s") % (name, (unicode(path, "MBCS", "replace") if type(path) != unicode else path).encode("MBCS", "replace")) continue directory_created(grppath) for filename in filenames: lnkname = splitext(basename(filename))[0] lnkpath = os.path.join( grppath, lnkname + ".lnk") if os.path.exists(lnkpath): try: os.remove(lnkpath) except Exception, exception: # maybe insufficient privileges? print ("Failed to create start menu entry '%s' in " "%s") % (lnkname, (unicode(grppath, "MBCS", "replace") if type(grppath) != unicode else grppath).encode("MBCS", "replace")) continue if not os.path.exists(lnkpath): if lnkname != "Uninstall": tgtpath = os.path.join(modpath, filename) try: if lnkname == "Uninstall": uninstaller = os.path.join( sys.prefix, "Remove%s.exe" % name) if os.path.exists(uninstaller): create_shortcut( uninstaller, lnkname, lnkpath, '-u "%s-wininst.log"' % os.path.join(sys.prefix, name), sys.prefix, os.path.join( modpath, "theme", "icons", name + "-uninstall.ico")) else: # When running from a # bdist_wininst or bdist_msi # installer, sys.executable # points to the installer # executable, not python.exe create_shortcut( os.path.join(sys.prefix, "python.exe"), lnkname, lnkpath, '"%s" uninstall ' '--record="%s"' % ( os.path.join( modpath, "setup.py"), os.path.join( modpath, "INSTALLED_FILES") ), sys.prefix, os.path.join( modpath, "theme", "icons", name + "-uninstall.ico")) elif lnkname.startswith(name): # When running from a # bdist_wininst or bdist_msi # installer, sys.executable # points to the installer # executable, not python.exe icon = os.path.join(modpath, "theme", "icons", lnkname + ".ico") if not os.path.isfile(icon): icon = mainicon if filename.endswith(".exe"): exe = filename args = "" else: exe = os.path.join(sys.prefix, "pythonw.exe") args = '"%s"' % tgtpath create_shortcut(exe, lnkname, lnkpath, args, modpath, icon) else: create_shortcut( tgtpath, lnkname, lnkpath, "", modpath) except Exception, exception: # maybe insufficient privileges? print ("Failed to create start menu entry '%s' in " "%s") % (lnkname, (unicode(grppath, "MBCS", "replace") if type(grppath) != unicode else grppath).encode("MBCS", "replace")) continue print ("Installed start menu entry '%s' to " "%s") % (lnkname, (unicode(group, "MBCS", "replace") if type(group) != unicode else group).encode("MBCS", "replace")) file_created(lnkpath) installed_shortcuts.append(filename) if installed_shortcuts == filenames: break else: print "warning - '%s' not found" % icon.encode("MBCS", "replace") if os.path.exists(recordfile_name): irecordfile_name = os.path.join(modpath, "INSTALLED_FILES") irecordfile = open(irecordfile_name, "w") irecordfile.close() file_created(irecordfile_name) shutil.copy2(recordfile_name, irecordfile_name) else: print "warning - '%s' not found" % modpath.encode("MBCS", "replace") else: # Linux/Unix if prefix is None: prefix = sys.prefix if which("touch"): call(["touch", "--no-create", prefix + "/share/icons/hicolor"]) if which("xdg-icon-resource"): ##print "installing icon resources..." ##for size in [16, 22, 24, 32, 48, 256]: ##call(["xdg-icon-resource", "install", "--noupdate", "--novendor", ##"--size", str(size), prefix + ##("/share/%s/theme/icons/%sx%s/%s.png" % (name, size, size, ##name))]) call(["xdg-icon-resource", "forceupdate"]) if which("xdg-desktop-menu"): ##print "installing desktop menu entry..." ##call(["xdg-desktop-menu", "install", "--novendor", (prefix + ##"/share/%s/%s.desktop" % (name, name))]) call(["xdg-desktop-menu", "forceupdate"]) def postuninstall(prefix=None): if sys.platform == "darwin": # TODO: implement pass elif sys.platform == "win32": # nothing to do pass else: # Linux/Unix if prefix is None: prefix = sys.prefix if which("xdg-desktop-menu"): ##print "uninstalling desktop menu entry..." ##call(["xdg-desktop-menu", "uninstall", prefix + ##("/share/applications/%s.desktop" % name)]) call(["xdg-desktop-menu", "forceupdate"]) if which("xdg-icon-resource"): ##print "uninstalling icon resources..." ##for size in [16, 22, 24, 32, 48, 256]: ##call(["xdg-icon-resource", "uninstall", "--noupdate", "--size", ##str(size), name]) call(["xdg-icon-resource", "forceupdate"]) def main(): prefix = None for arg in sys.argv[1:]: arg = arg.split("=") if len(arg) == 2: if arg[0] == "--prefix": prefix = arg[1] try: if "-remove" in sys.argv[1:]: postuninstall(prefix) else: postinstall(prefix) except Exception, exception: traceback.print_exc() if __name__ == "__main__": main() DisplayCAL-3.1.0.0/DisplayCAL/presets/0000755000076500000000000000000012653527012017107 5ustar devwheel00000000000000DisplayCAL-3.1.0.0/DisplayCAL/presets/default.icc0000644000076500000000000006413412647526507021236 0ustar devwheel00000000000000h\argl mntrRGB XYZ ; acspMSFT-argl0N{Z( desc cprt/wtptbkptvcgtrXYZgXYZ$bXYZ8rTRCL gTRCL bTRCL targ X]artsh0,desc'DisplayCAL calibration preset: DefaulttextCreated with DisplayCAL and Argyll CMSXYZ TXYZ vcgt  !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~  !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~  !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~XYZ o8XYZ bXYZ $curv  *5AO^o+Jj%O{ >sY]3lk  { :  h ;  n^VV_p?nD-~*: !_""#$Y%%&'v(C))*+,f-A../0123{4h5W6H7<829+:%;"<"=$>(?.@7ABBOC_DqEFGHIKL3MXNOPRS5TiUVXYOZ[]^\_`b?cdf8ghjGkmnloq>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~  !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~  !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~XYZ o8XYZ bXYZ $curv  *5AO^o+Jj%O{ >sY]3lk  { :  h ;  n^VV_p?nD-~*: !_""#$Y%%&'v(C))*+,f-A../0123{4h5W6H7<829+:%;"<"=$>(?.@7ABBOC_DqEFGHIKL3MXNOPRS5TiUVXYOZ[]^\_`b?cdf8ghjGkmnloqpXYZ vcgt  !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~  !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~  !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~XYZ o8XYZ bXYZ $curv  *5AO^o+Jj%O{ >sY]3lk  { :  h ;  n^VV_p?nD-~*: !_""#$Y%%&'v(C))*+,f-A../0123{4h5W6H7<829+:%;"<"=$>(?.@7ABBOC_DqEFGHIKL3MXNOPRS5TiUVXYOZ[]^\_`b?cdf8ghjGkmnloq>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~  !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~  !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~XYZ o8XYZ bXYZ $curv  *5AO^o+Jj%O{ >sY]3lk  { :  h ;  n^VV_p?nD-~*: !_""#$Y%%&'v(C))*+,f-A../0123{4h5W6H7<829+:%;"<"=$>(?.@7ABBOC_DqEFGHIKL3MXNOPRS5TiUVXYOZ[]^\_`b?cdf8ghjGkmnloq>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~  !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~  !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~XYZ o8XYZ bXYZ $curv9Ur9Ur9Vs9]$O{8j?x*h*m A ! o  b d  t 2\+pQ:*""*:Rs4iJ !@!"#I#$%h&"&'(]) )*+x,E--./0l1I2(3 3456789~:u;ol?q@yABCDEFGIJ?KdLMNPQIRSTV7WzXZ [W\]_P`bcgdf1gijykmdnp]qsdtvxxy{1|~h VdՍU㔰U- ̡xsqt{ؽ@kƛAπ YةWߵ|U@>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~  !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~  !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~XYZ o8XYZ bXYZ $curv9Ur9Ur9Vs9]$O{8j?x*h*m A ! o  b d  t 2\+pQ:*""*:Rs4iJ !@!"#I#$%h&"&'(]) )*+x,E--./0l1I2(3 3456789~:u;ol?q@yABCDEFGIJ?KdLMNPQIRSTV7WzXZ [W\]_P`bcgdf1gijykmdnp]qsdtvxxy{1|~h VdՍU㔰U- ̡xsqt{ؽ@kƛAπ YةWߵ|U@>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~  !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~  !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~XYZ o8XYZ bXYZ $curv(<Pcw 9To2W}%SM2o/sG*z  r y 2 U ^<!%Af,fLD !P""#p$*$%&d'&'(){*F++,-.a/:0012345i6U7B839%:;< =>?@ ABC#D0E?FQGeH|IJKLNO9PaQRSUVPWXY[=\~]_ `Rabd>efh@ijl[mo$pqsftvJwy9z|2}7Fх_P5ܕ2⚔Iy9¨V%ʱ{W7±ĥƜȕʒ̑ΔЙҡԭֻ.NqM3ttextCTI3 DESCRIPTOR "Argyll Calibration Target chart information 3" ORIGINATOR "Argyll dispread" CREATED "Sat Mar 14 19:00:55 2009" KEYWORD "DEVICE_CLASS" DEVICE_CLASS "DISPLAY" KEYWORD "APPROX_WHITE_POINT" APPROX_WHITE_POINT "95.106486 100.000000 108.844025" KEYWORD "COLOR_REP" COLOR_REP "RGB_XYZ" KEYWORD "BLACK_COLOR_PATCHES" BLACK_COLOR_PATCHES "4" KEYWORD "COMP_GREY_STEPS" COMP_GREY_STEPS "49" KEYWORD "MULTI_DIM_BCC_STEPS" MULTI_DIM_BCC_STEPS "5" KEYWORD "MULTI_DIM_STEPS" MULTI_DIM_STEPS "5" KEYWORD "SINGLE_DIM_STEPS" SINGLE_DIM_STEPS "17" KEYWORD "WHITE_COLOR_PATCHES" WHITE_COLOR_PATCHES "4" KEYWORD "AUTO_OPTIMIZE" AUTO_OPTIMIZE "6" BEGIN_ARGYLL_COLPROF_ARGS -qh -aX END_ARGYLL_COLPROF_ARGS NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT SAMPLE_ID RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 271 BEGIN_DATA 1 100.000 100.000 100.000 95.1065 100.000 108.844 2 12.5000 37.5000 12.5000 5.94993 9.61866 3.74740 3 12.5000 62.5000 12.5000 14.1814 26.0794 6.49125 4 12.5000 87.5000 87.5000 40.9488 58.8934 79.2939 5 37.5000 87.5000 87.5000 45.0999 61.0337 79.4884 6 0.00000 25.0000 25.0000 3.71049 4.96568 6.38934 7 0.00000 25.0000 50.0000 6.62643 6.13187 21.7479 8 25.0000 75.0000 75.0000 30.9153 42.8005 56.4485 9 50.0000 75.0000 75.0000 37.5774 46.2355 56.7606 10 12.5000 0.00000 0.00000 1.58591 1.30210 1.02745 11 10.4167 10.4167 10.4167 2.00521 2.05749 2.15195 12 25.0000 0.00000 0.00000 3.07728 2.07105 1.09734 13 31.2500 0.00000 0.00000 4.24932 2.67536 1.15226 14 37.5000 0.00000 0.00000 5.73696 3.44239 1.22197 15 43.7500 0.00000 0.00000 7.56070 4.38272 1.30742 16 50.0000 0.00000 0.00000 9.73934 5.50603 1.40951 17 62.5000 37.5000 62.5000 25.5656 19.0418 35.8409 18 87.5000 37.5000 62.5000 41.5030 27.2592 36.5877 19 0.00000 0.00000 0.00000 1.00000 1.00000 1.00000 20 75.0000 0.00000 0.00000 22.3346 12.0002 1.99970 21 81.2500 0.00000 0.00000 26.5283 14.1625 2.19621 22 87.5000 0.00000 0.00000 31.1672 16.5543 2.41358 23 93.7500 0.00000 0.00000 36.2638 19.1821 2.65240 24 100.000 0.00000 0.00000 41.8302 22.0522 2.91323 25 62.5000 62.5000 12.5000 27.8253 33.1142 7.13058 26 75.0000 75.0000 50.0000 44.6598 50.5248 28.3139 27 8.33333 8.33333 8.33333 1.71786 1.75519 1.82265 28 0.00000 12.5000 0.00000 1.50806 2.01598 1.16935 29 0.00000 43.7500 0.00000 6.68900 12.3764 2.89635 30 0.00000 50.0000 0.00000 8.57817 16.1542 3.52608 31 0.00000 56.2500 0.00000 10.7902 20.5776 4.26342 32 0.00000 62.5000 0.00000 13.3391 25.6747 5.11306 33 12.5000 62.5000 37.5000 15.9983 26.8060 16.0610 34 0.00000 0.00000 0.00000 1.00000 1.00000 1.00000 35 0.00000 6.25000 0.00000 1.18254 1.36502 1.06085 36 0.00000 75.0000 0.00000 19.5000 37.9948 7.16671 37 0.00000 81.2500 0.00000 23.1365 45.2667 8.37888 38 0.00000 87.5000 0.00000 27.1590 53.3106 9.71972 39 0.00000 93.7500 0.00000 31.5784 62.1482 11.1929 40 0.00000 100.000 0.00000 36.4052 71.8005 12.8018 41 6.25000 6.25000 6.25000 1.48518 1.51041 1.55601 42 0.00000 0.00000 12.5000 1.25645 1.10256 2.35074 43 0.00000 0.00000 18.7500 1.52439 1.20972 3.76201 44 0.00000 0.00000 25.0000 1.90921 1.36363 5.78891 45 0.00000 0.00000 31.2500 2.42221 1.56879 8.49092 46 0.00000 0.00000 37.5000 3.07334 1.82920 11.9205 47 0.00000 0.00000 43.7500 3.87158 2.14845 16.1249 48 0.00000 0.00000 50.0000 4.82515 2.52982 21.1475 49 0.00000 0.00000 56.2500 5.94168 2.97636 27.0283 50 0.00000 0.00000 62.5000 7.22826 3.49091 33.8049 51 0.00000 0.00000 68.7500 8.69161 4.07616 41.5125 52 0.00000 0.00000 75.0000 10.3380 4.73463 50.1844 53 0.00000 0.00000 81.2500 12.1736 5.46873 59.8524 54 0.00000 0.00000 87.5000 14.2040 6.28076 70.5467 55 0.00000 0.00000 93.7500 16.4347 7.17291 82.2963 56 0.00000 0.00000 100.000 18.8711 8.14731 95.1290 57 0.00000 50.0000 100.000 26.4493 23.3015 97.6550 58 75.0000 50.0000 100.000 47.7839 34.3017 98.6547 59 0.00000 0.00000 6.25000 1.09214 1.03685 1.48530 60 2.08333 2.08333 2.08333 1.15175 1.15964 1.17390 61 4.16667 4.16667 4.16667 1.30372 1.31952 1.34806 62 12.5000 12.5000 12.5000 2.35042 2.42064 2.54755 63 14.5833 14.5833 14.5833 2.75638 2.84772 3.01278 64 16.6667 16.6667 16.6667 3.22584 3.34159 3.55077 65 18.7500 18.7500 18.7500 3.76135 3.90494 4.16445 66 20.8333 20.8333 20.8333 4.36533 4.54033 4.85660 67 22.9167 22.9167 22.9167 5.04007 5.25016 5.62984 68 25.0000 25.0000 25.0000 5.78777 6.03673 6.48668 69 27.0833 27.0833 27.0833 6.61052 6.90226 7.42953 70 29.1667 29.1667 29.1667 7.51032 7.84886 8.46069 71 31.2500 31.2500 31.2500 8.48913 8.87856 9.58238 72 6.25000 0.00000 0.00000 1.21051 1.10854 1.00986 73 33.3333 33.3333 33.3333 9.54879 9.99333 10.7967 74 35.4167 35.4167 35.4167 10.6911 11.1951 12.1058 75 39.5833 39.5833 39.5833 13.2307 13.8667 15.0161 76 41.6667 41.6667 41.6667 14.6313 15.3402 16.6212 77 43.7500 43.7500 43.7500 16.1213 16.9076 18.3287 78 45.8333 45.8333 45.8333 17.7021 18.5707 20.1403 79 47.9167 47.9167 47.9167 19.3754 20.3310 22.0579 80 50.0000 50.0000 50.0000 21.1427 22.1901 24.0831 81 52.0833 52.0833 52.0833 23.0052 24.1495 26.2175 82 54.1667 54.1667 54.1667 24.9646 26.2107 28.4629 83 56.2500 56.2500 56.2500 27.0221 28.3752 30.8208 84 58.3333 58.3333 58.3333 29.1791 30.6444 33.2927 85 60.4167 60.4167 60.4167 31.4370 33.0197 35.8802 86 62.5000 62.5000 62.5000 33.7971 35.5025 38.5847 87 64.5833 64.5833 64.5833 36.2605 38.0941 41.4078 88 66.6667 66.6667 66.6667 38.8287 40.7958 44.3509 89 68.7500 68.7500 68.7500 41.5028 43.6089 47.4154 90 70.8333 70.8333 70.8333 44.2840 46.5348 50.6026 91 72.9167 72.9167 72.9167 47.1736 49.5746 53.9140 92 75.0000 75.0000 75.0000 50.1727 52.7296 57.3508 93 77.0833 77.0833 77.0833 53.2824 56.0011 60.9145 94 79.1667 79.1667 79.1667 56.5039 59.3901 64.6063 95 81.2500 81.2500 81.2500 59.8383 62.8979 68.4275 96 83.3333 83.3333 83.3333 63.2868 66.5257 72.3793 97 85.4167 85.4167 85.4167 66.8503 70.2745 76.4631 98 87.5000 87.5000 87.5000 70.5301 74.1456 80.6800 99 89.5833 89.5833 89.5833 74.3270 78.1400 85.0312 100 91.6667 91.6667 91.6667 78.2423 82.2589 89.5180 101 93.7500 93.7500 93.7500 82.2769 86.5032 94.1415 102 95.8333 95.8333 95.8333 86.4317 90.8742 98.9029 103 97.9167 97.9167 97.9167 90.7080 95.3727 103.803 104 25.0000 25.0000 0.00000 4.87856 5.67311 1.69777 105 50.0000 25.0000 0.00000 11.5406 9.10808 2.00994 106 75.0000 25.0000 0.00000 24.1359 15.6023 2.60014 107 100.000 25.0000 0.00000 43.6314 25.6542 3.51366 108 100.000 75.0000 0.00000 60.3302 59.0470 9.07994 109 50.0000 50.0000 0.00000 17.3175 20.6603 3.93559 110 75.0000 50.0000 0.00000 29.9128 27.1544 4.52578 111 100.000 50.0000 0.00000 49.4083 37.2064 5.43931 112 100.000 100.000 100.000 95.1065 100.000 108.844 113 50.0000 75.0000 0.00000 28.2393 42.5008 7.57622 114 75.0000 75.0000 0.00000 40.8346 48.9950 8.16642 115 25.0000 75.0000 0.00000 21.5773 39.0658 7.26405 116 25.0000 100.000 0.00000 38.4825 72.8716 12.8992 117 50.0000 100.000 0.00000 45.1445 76.3065 13.2113 118 75.0000 100.000 0.00000 57.7399 82.8007 13.8015 119 100.000 100.000 0.00000 77.2354 92.8527 14.7151 120 25.0000 0.00000 25.0000 3.98649 2.43468 5.88625 121 50.0000 0.00000 25.0000 10.6485 5.86966 6.19842 122 75.0000 0.00000 25.0000 23.2439 12.3638 6.78862 123 75.0000 25.0000 25.0000 25.0451 15.9659 7.38905 124 87.5000 37.5000 37.5000 37.3481 25.5975 14.7033 125 56.2500 0.00000 0.00000 12.2903 6.82130 1.52904 126 100.000 0.00000 25.0000 42.7394 22.4158 7.70214 127 100.000 25.0000 25.0000 44.5407 26.0178 8.30257 128 100.000 25.0000 50.0000 47.4566 27.1840 23.6611 129 50.0000 25.0000 25.0000 12.4498 9.47171 6.79885 130 50.0000 50.0000 25.0000 18.2267 21.0239 8.72450 131 75.0000 50.0000 25.0000 30.8220 27.5181 9.31470 132 100.000 50.0000 25.0000 50.3176 37.5700 10.2282 133 25.0000 50.0000 25.0000 11.5647 17.5889 8.41233 134 25.0000 75.0000 25.0000 22.4865 39.4295 12.0530 135 50.0000 75.0000 25.0000 29.1485 42.8645 12.3651 136 75.0000 75.0000 25.0000 41.7438 49.3586 12.9553 137 100.000 75.0000 25.0000 61.2394 59.4106 13.8689 138 25.0000 50.0000 0.00000 10.6555 17.2253 3.62342 139 25.0000 100.000 25.0000 39.3917 73.2352 17.6881 140 50.0000 100.000 25.0000 46.0538 76.6702 18.0003 141 75.0000 100.000 25.0000 58.6491 83.1644 18.5905 142 100.000 100.000 25.0000 78.1446 93.2163 19.5040 143 25.0000 0.00000 50.0000 6.90243 3.60087 21.2448 144 50.0000 0.00000 50.0000 13.5645 7.03585 21.5570 145 75.0000 0.00000 50.0000 26.1598 13.5300 22.1472 146 100.000 0.00000 50.0000 45.6553 23.5820 23.0607 147 100.000 50.0000 75.0000 58.7464 40.9410 54.6237 148 100.000 50.0000 100.000 67.2794 44.3537 99.5683 149 50.0000 25.0000 50.0000 15.3658 10.6379 22.1574 150 75.0000 25.0000 50.0000 27.9611 17.1321 22.7476 151 100.000 25.0000 75.0000 52.9695 29.3888 52.6981 152 25.0000 25.0000 50.0000 8.70371 7.20292 21.8452 153 25.0000 50.0000 50.0000 14.4806 18.7551 23.7709 154 75.0000 50.0000 50.0000 33.7380 28.6843 24.6733 155 100.000 50.0000 50.0000 53.2335 38.7362 25.5868 156 100.000 75.0000 50.0000 64.1553 60.5768 29.2274 157 87.5000 62.5000 62.5000 49.7345 43.7199 39.3315 158 87.5000 87.5000 62.5000 63.5544 71.3558 43.9382 159 100.000 100.000 75.0000 86.5734 96.5873 63.8995 160 0.00000 68.7500 0.00000 16.2382 31.4721 6.07943 161 0.00000 100.000 25.0000 37.3144 72.1641 17.5907 162 0.00000 100.000 50.0000 40.2304 73.3303 32.9493 163 50.0000 100.000 50.0000 48.9697 77.8364 33.3588 164 75.0000 100.000 50.0000 61.5650 84.3305 33.9490 165 100.000 100.000 50.0000 81.0605 94.3825 34.8625 166 25.0000 0.00000 75.0000 12.4153 5.80568 50.2817 167 50.0000 0.00000 75.0000 19.0774 9.24066 50.5939 168 75.0000 0.00000 75.0000 31.6727 15.7348 51.1841 169 100.000 0.00000 75.0000 51.1682 25.7868 52.0976 170 100.000 0.00000 100.000 59.7013 29.1995 97.0422 171 25.0000 25.0000 75.0000 14.2166 9.40773 50.8822 172 50.0000 25.0000 75.0000 20.8787 12.8427 51.1944 173 75.0000 25.0000 75.0000 33.4740 19.3369 51.7845 174 0.00000 31.2500 0.00000 3.81760 6.63441 1.93921 175 0.00000 37.5000 0.00000 5.10758 9.21400 2.36920 176 25.0000 50.0000 75.0000 19.9935 20.9599 52.8078 177 50.0000 50.0000 75.0000 26.6555 24.3949 53.1200 178 75.0000 50.0000 75.0000 39.2509 30.8891 53.7102 179 100.000 75.0000 75.0000 69.6682 62.7816 58.2644 180 100.000 75.0000 100.000 78.2013 66.1943 103.209 181 0.00000 0.00000 0.00000 1.00000 1.00000 1.00000 182 12.5000 37.5000 37.5000 7.76682 10.3453 13.3171 183 25.0000 75.0000 50.0000 25.4024 40.5957 27.4115 184 25.0000 100.000 50.0000 42.3076 74.4014 33.0466 185 25.0000 100.000 75.0000 47.8205 76.6062 62.0836 186 50.0000 100.000 75.0000 54.4826 80.0412 62.3958 187 75.0000 100.000 75.0000 67.0779 86.5354 62.9859 188 100.000 100.000 100.000 95.1065 100.000 108.844 189 25.0000 0.00000 100.000 20.9484 9.21837 95.2263 190 50.0000 0.00000 100.000 27.6104 12.6533 95.5385 191 75.0000 0.00000 100.000 40.2058 19.1475 96.1287 192 75.0000 75.0000 100.000 58.7057 56.1423 102.295 193 0.00000 25.0000 100.000 20.6724 11.7494 95.7294 194 25.0000 25.0000 100.000 22.7497 12.8204 95.8267 195 50.0000 25.0000 100.000 29.4117 16.2554 96.1389 196 75.0000 25.0000 100.000 42.0070 22.7496 96.7291 197 100.000 25.0000 100.000 61.5026 32.8015 97.6426 198 0.00000 0.00000 0.00000 1.00000 1.00000 1.00000 199 25.0000 50.0000 100.000 28.5266 24.3726 97.7524 200 50.0000 50.0000 100.000 35.1886 27.8076 98.0645 201 50.0000 75.0000 100.000 46.1104 49.6481 101.705 202 12.5000 62.5000 62.5000 20.1532 28.4677 37.9454 203 12.5000 62.5000 87.5000 27.1290 31.2576 74.6872 204 25.0000 75.0000 100.000 39.4484 46.2132 101.393 205 0.00000 50.0000 50.0000 12.4033 17.6840 23.6735 206 0.00000 75.0000 75.0000 28.8380 41.7294 56.3511 207 0.00000 100.000 75.0000 45.7432 75.5351 61.9862 208 0.00000 100.000 100.000 54.2763 78.9478 106.931 209 25.0000 100.000 100.000 56.3536 80.0189 107.028 210 50.0000 100.000 100.000 63.0157 83.4539 107.340 211 75.0000 100.000 100.000 75.6110 89.9480 107.930 212 62.5000 0.00000 0.00000 15.2297 8.33690 1.66678 213 68.7500 0.00000 0.00000 18.5730 10.0607 1.82344 214 100.000 100.000 100.000 95.1065 100.000 108.844 215 0.00000 25.0000 0.00000 2.80128 4.60205 1.60043 216 37.5000 37.5000 12.5000 10.1010 11.7590 3.94191 217 62.5000 37.5000 12.5000 19.5938 16.6535 4.38672 218 87.5000 37.5000 12.5000 35.5312 24.8708 5.13352 219 37.5000 12.5000 12.5000 6.50147 4.56093 2.74206 220 62.5000 12.5000 12.5000 15.9942 9.45544 3.18687 221 87.5000 12.5000 12.5000 31.9317 17.6728 3.93367 222 87.5000 62.5000 12.5000 43.7627 41.3315 7.87738 223 37.5000 62.5000 12.5000 18.3325 28.2197 6.68576 224 37.5000 87.5000 12.5000 32.1524 55.8555 11.2924 225 62.5000 87.5000 12.5000 41.6451 60.7500 11.7372 226 87.5000 87.5000 12.5000 57.5826 68.9674 12.4840 227 12.5000 12.5000 37.5000 4.16730 3.14728 12.1173 228 37.5000 12.5000 37.5000 8.31836 5.28757 12.3118 229 62.5000 12.5000 37.5000 17.8111 10.1821 12.7566 230 87.5000 12.5000 37.5000 33.7486 18.3995 13.5034 231 87.5000 62.5000 37.5000 45.5796 42.0582 17.4471 232 62.5000 37.5000 37.5000 21.4106 17.3801 13.9565 233 62.5000 62.5000 37.5000 29.6421 33.8408 16.7003 234 37.5000 37.5000 37.5000 11.9179 12.4856 13.5116 235 37.5000 62.5000 37.5000 20.1494 28.9463 16.2555 236 50.0000 75.0000 50.0000 32.0645 44.0306 27.7237 237 12.5000 87.5000 12.5000 28.0013 53.7152 11.0979 238 12.5000 87.5000 37.5000 29.8182 54.4419 20.6677 239 37.5000 87.5000 37.5000 33.9692 56.5822 20.8622 240 62.5000 87.5000 37.5000 43.4620 61.4767 21.3070 241 87.5000 87.5000 37.5000 59.3994 69.6941 22.0538 242 18.7500 0.00000 0.00000 2.19807 1.61773 1.05614 243 37.5000 12.5000 62.5000 12.4733 6.94928 34.1962 244 62.5000 12.5000 62.5000 21.9661 11.8438 34.6410 245 87.5000 12.5000 62.5000 37.9035 20.0612 35.3878 246 87.5000 12.5000 87.5000 44.8792 22.8510 72.1296 247 87.5000 37.5000 87.5000 48.4787 30.0490 73.3295 248 87.5000 62.5000 87.5000 56.7102 46.5097 76.0733 249 0.00000 18.7500 0.00000 2.03889 3.07749 1.34630 250 0.00000 50.0000 25.0000 9.48738 16.5179 8.31499 251 0.00000 75.0000 25.0000 20.4092 38.3584 11.9556 252 0.00000 75.0000 50.0000 23.3251 39.5246 27.3142 253 12.5000 87.5000 62.5000 33.9731 56.1036 42.5521 254 37.5000 87.5000 62.5000 38.1242 58.2439 42.7466 255 62.5000 87.5000 62.5000 47.6169 63.1384 43.1914 256 12.5000 12.5000 62.5000 8.32223 4.80899 34.0017 257 12.5000 12.5000 87.5000 15.2979 7.59883 70.7435 258 37.5000 12.5000 87.5000 19.4490 9.73913 70.9380 259 62.5000 12.5000 87.5000 28.9418 14.6336 71.3828 260 12.5000 37.5000 62.5000 11.9217 12.0070 35.2016 261 12.5000 37.5000 87.5000 18.8975 14.7969 71.9433 262 37.5000 37.5000 87.5000 23.0485 16.9371 72.1379 263 62.5000 37.5000 87.5000 32.5413 21.8317 72.5827 264 37.5000 37.5000 62.5000 16.0728 14.1473 35.3961 265 37.5000 62.5000 62.5000 24.3043 30.6080 38.1399 266 37.5000 62.5000 87.5000 31.2800 33.3978 74.8817 267 62.5000 62.5000 87.5000 40.7728 38.2924 75.3265 268 62.5000 87.5000 87.5000 54.5927 65.9282 79.9332 269 0.00000 25.0000 75.0000 12.1393 8.33668 50.7848 270 0.00000 50.0000 75.0000 17.9162 19.8888 52.7105 271 0.00000 75.0000 100.000 37.3711 45.1421 101.296 END_DATA CAL DESCRIPTOR "Argyll Device Calibration State" ORIGINATOR "Argyll dispcal" CREATED "Sat Mar 14 19:07:36 2009" KEYWORD "DEVICE_CLASS" DEVICE_CLASS "DISPLAY" KEYWORD "COLOR_REP" COLOR_REP "RGB" BEGIN_ARGYLL_DISPCAL_ARGS -ql -w0.3127,0.3290 -gs -f1 -k0 END_ARGYLL_DISPCAL_ARGS KEYWORD "RGB_I" NUMBER_OF_FIELDS 4 BEGIN_DATA_FORMAT RGB_I RGB_R RGB_G RGB_B END_DATA_FORMAT NUMBER_OF_SETS 256 BEGIN_DATA 0.00000 0.00000 0.00000 0.00000 0.00392 0.00392 0.00392 0.00392 0.00784 0.00784 0.00784 0.00784 0.01176 0.01176 0.01176 0.01176 0.01569 0.01569 0.01569 0.01569 0.01961 0.01961 0.01961 0.01961 0.02353 0.02353 0.02353 0.02353 0.02745 0.02745 0.02745 0.02745 0.03137 0.03137 0.03137 0.03137 0.03529 0.03529 0.03529 0.03529 0.03922 0.03922 0.03922 0.03922 0.04314 0.04314 0.04314 0.04314 0.04706 0.04706 0.04706 0.04706 0.05098 0.05098 0.05098 0.05098 0.05490 0.05490 0.05490 0.05490 0.05882 0.05882 0.05882 0.05882 0.06275 0.06275 0.06275 0.06275 0.06667 0.06667 0.06667 0.06667 0.07059 0.07059 0.07059 0.07059 0.07451 0.07451 0.07451 0.07451 0.07843 0.07843 0.07843 0.07843 0.08235 0.08235 0.08235 0.08235 0.08627 0.08627 0.08627 0.08627 0.09020 0.09020 0.09020 0.09020 0.09412 0.09412 0.09412 0.09412 0.09804 0.09804 0.09804 0.09804 0.10196 0.10196 0.10196 0.10196 0.10588 0.10588 0.10588 0.10588 0.10980 0.10980 0.10980 0.10980 0.11373 0.11373 0.11373 0.11373 0.11765 0.11765 0.11765 0.11765 0.12157 0.12157 0.12157 0.12157 0.12549 0.12549 0.12549 0.12549 0.12941 0.12941 0.12941 0.12941 0.13333 0.13333 0.13333 0.13333 0.13725 0.13725 0.13725 0.13725 0.14118 0.14118 0.14118 0.14118 0.14510 0.14510 0.14510 0.14510 0.14902 0.14902 0.14902 0.14902 0.15294 0.15294 0.15294 0.15294 0.15686 0.15686 0.15686 0.15686 0.16078 0.16078 0.16078 0.16078 0.16471 0.16471 0.16471 0.16471 0.16863 0.16863 0.16863 0.16863 0.17255 0.17255 0.17255 0.17255 0.17647 0.17647 0.17647 0.17647 0.18039 0.18039 0.18039 0.18039 0.18431 0.18431 0.18431 0.18431 0.18824 0.18824 0.18824 0.18824 0.19216 0.19216 0.19216 0.19216 0.19608 0.19608 0.19608 0.19608 0.20000 0.20000 0.20000 0.20000 0.20392 0.20392 0.20392 0.20392 0.20784 0.20784 0.20784 0.20784 0.21176 0.21176 0.21176 0.21176 0.21569 0.21569 0.21569 0.21569 0.21961 0.21961 0.21961 0.21961 0.22353 0.22353 0.22353 0.22353 0.22745 0.22745 0.22745 0.22745 0.23137 0.23137 0.23137 0.23137 0.23529 0.23529 0.23529 0.23529 0.23922 0.23922 0.23922 0.23922 0.24314 0.24314 0.24314 0.24314 0.24706 0.24706 0.24706 0.24706 0.25098 0.25098 0.25098 0.25098 0.25490 0.25490 0.25490 0.25490 0.25882 0.25882 0.25882 0.25882 0.26275 0.26275 0.26275 0.26275 0.26667 0.26667 0.26667 0.26667 0.27059 0.27059 0.27059 0.27059 0.27451 0.27451 0.27451 0.27451 0.27843 0.27843 0.27843 0.27843 0.28235 0.28235 0.28235 0.28235 0.28627 0.28627 0.28627 0.28627 0.29020 0.29020 0.29020 0.29020 0.29412 0.29412 0.29412 0.29412 0.29804 0.29804 0.29804 0.29804 0.30196 0.30196 0.30196 0.30196 0.30588 0.30588 0.30588 0.30588 0.30980 0.30980 0.30980 0.30980 0.31373 0.31373 0.31373 0.31373 0.31765 0.31765 0.31765 0.31765 0.32157 0.32157 0.32157 0.32157 0.32549 0.32549 0.32549 0.32549 0.32941 0.32941 0.32941 0.32941 0.33333 0.33333 0.33333 0.33333 0.33725 0.33725 0.33725 0.33725 0.34118 0.34118 0.34118 0.34118 0.34510 0.34510 0.34510 0.34510 0.34902 0.34902 0.34902 0.34902 0.35294 0.35294 0.35294 0.35294 0.35686 0.35686 0.35686 0.35686 0.36078 0.36078 0.36078 0.36078 0.36471 0.36471 0.36471 0.36471 0.36863 0.36863 0.36863 0.36863 0.37255 0.37255 0.37255 0.37255 0.37647 0.37647 0.37647 0.37647 0.38039 0.38039 0.38039 0.38039 0.38431 0.38431 0.38431 0.38431 0.38824 0.38824 0.38824 0.38824 0.39216 0.39216 0.39216 0.39216 0.39608 0.39608 0.39608 0.39608 0.40000 0.40000 0.40000 0.40000 0.40392 0.40392 0.40392 0.40392 0.40784 0.40784 0.40784 0.40784 0.41176 0.41176 0.41176 0.41176 0.41569 0.41569 0.41569 0.41569 0.41961 0.41961 0.41961 0.41961 0.42353 0.42353 0.42353 0.42353 0.42745 0.42745 0.42745 0.42745 0.43137 0.43137 0.43137 0.43137 0.43529 0.43529 0.43529 0.43529 0.43922 0.43922 0.43922 0.43922 0.44314 0.44314 0.44314 0.44314 0.44706 0.44706 0.44706 0.44706 0.45098 0.45098 0.45098 0.45098 0.45490 0.45490 0.45490 0.45490 0.45882 0.45882 0.45882 0.45882 0.46275 0.46275 0.46275 0.46275 0.46667 0.46667 0.46667 0.46667 0.47059 0.47059 0.47059 0.47059 0.47451 0.47451 0.47451 0.47451 0.47843 0.47843 0.47843 0.47843 0.48235 0.48235 0.48235 0.48235 0.48627 0.48627 0.48627 0.48627 0.49020 0.49020 0.49020 0.49020 0.49412 0.49412 0.49412 0.49412 0.49804 0.49804 0.49804 0.49804 0.50196 0.50196 0.50196 0.50196 0.50588 0.50588 0.50588 0.50588 0.50980 0.50980 0.50980 0.50980 0.51373 0.51373 0.51373 0.51373 0.51765 0.51765 0.51765 0.51765 0.52157 0.52157 0.52157 0.52157 0.52549 0.52549 0.52549 0.52549 0.52941 0.52941 0.52941 0.52941 0.53333 0.53333 0.53333 0.53333 0.53725 0.53725 0.53725 0.53725 0.54118 0.54118 0.54118 0.54118 0.54510 0.54510 0.54510 0.54510 0.54902 0.54902 0.54902 0.54902 0.55294 0.55294 0.55294 0.55294 0.55686 0.55686 0.55686 0.55686 0.56078 0.56078 0.56078 0.56078 0.56471 0.56471 0.56471 0.56471 0.56863 0.56863 0.56863 0.56863 0.57255 0.57255 0.57255 0.57255 0.57647 0.57647 0.57647 0.57647 0.58039 0.58039 0.58039 0.58039 0.58431 0.58431 0.58431 0.58431 0.58824 0.58824 0.58824 0.58824 0.59216 0.59216 0.59216 0.59216 0.59608 0.59608 0.59608 0.59608 0.60000 0.60000 0.60000 0.60000 0.60392 0.60392 0.60392 0.60392 0.60784 0.60784 0.60784 0.60784 0.61176 0.61176 0.61176 0.61176 0.61569 0.61569 0.61569 0.61569 0.61961 0.61961 0.61961 0.61961 0.62353 0.62353 0.62353 0.62353 0.62745 0.62745 0.62745 0.62745 0.63137 0.63137 0.63137 0.63137 0.63529 0.63529 0.63529 0.63529 0.63922 0.63922 0.63922 0.63922 0.64314 0.64314 0.64314 0.64314 0.64706 0.64706 0.64706 0.64706 0.65098 0.65098 0.65098 0.65098 0.65490 0.65490 0.65490 0.65490 0.65882 0.65882 0.65882 0.65882 0.66275 0.66275 0.66275 0.66275 0.66667 0.66667 0.66667 0.66667 0.67059 0.67059 0.67059 0.67059 0.67451 0.67451 0.67451 0.67451 0.67843 0.67843 0.67843 0.67843 0.68235 0.68235 0.68235 0.68235 0.68627 0.68627 0.68627 0.68627 0.69020 0.69020 0.69020 0.69020 0.69412 0.69412 0.69412 0.69412 0.69804 0.69804 0.69804 0.69804 0.70196 0.70196 0.70196 0.70196 0.70588 0.70588 0.70588 0.70588 0.70980 0.70980 0.70980 0.70980 0.71373 0.71373 0.71373 0.71373 0.71765 0.71765 0.71765 0.71765 0.72157 0.72157 0.72157 0.72157 0.72549 0.72549 0.72549 0.72549 0.72941 0.72941 0.72941 0.72941 0.73333 0.73333 0.73333 0.73333 0.73725 0.73725 0.73725 0.73725 0.74118 0.74118 0.74118 0.74118 0.74510 0.74510 0.74510 0.74510 0.74902 0.74902 0.74902 0.74902 0.75294 0.75294 0.75294 0.75294 0.75686 0.75686 0.75686 0.75686 0.76078 0.76078 0.76078 0.76078 0.76471 0.76471 0.76471 0.76471 0.76863 0.76863 0.76863 0.76863 0.77255 0.77255 0.77255 0.77255 0.77647 0.77647 0.77647 0.77647 0.78039 0.78039 0.78039 0.78039 0.78431 0.78431 0.78431 0.78431 0.78824 0.78824 0.78824 0.78824 0.79216 0.79216 0.79216 0.79216 0.79608 0.79608 0.79608 0.79608 0.80000 0.80000 0.80000 0.80000 0.80392 0.80392 0.80392 0.80392 0.80784 0.80784 0.80784 0.80784 0.81176 0.81176 0.81176 0.81176 0.81569 0.81569 0.81569 0.81569 0.81961 0.81961 0.81961 0.81961 0.82353 0.82353 0.82353 0.82353 0.82745 0.82745 0.82745 0.82745 0.83137 0.83137 0.83137 0.83137 0.83529 0.83529 0.83529 0.83529 0.83922 0.83922 0.83922 0.83922 0.84314 0.84314 0.84314 0.84314 0.84706 0.84706 0.84706 0.84706 0.85098 0.85098 0.85098 0.85098 0.85490 0.85490 0.85490 0.85490 0.85882 0.85882 0.85882 0.85882 0.86275 0.86275 0.86275 0.86275 0.86667 0.86667 0.86667 0.86667 0.87059 0.87059 0.87059 0.87059 0.87451 0.87451 0.87451 0.87451 0.87843 0.87843 0.87843 0.87843 0.88235 0.88235 0.88235 0.88235 0.88627 0.88627 0.88627 0.88627 0.89020 0.89020 0.89020 0.89020 0.89412 0.89412 0.89412 0.89412 0.89804 0.89804 0.89804 0.89804 0.90196 0.90196 0.90196 0.90196 0.90588 0.90588 0.90588 0.90588 0.90980 0.90980 0.90980 0.90980 0.91373 0.91373 0.91373 0.91373 0.91765 0.91765 0.91765 0.91765 0.92157 0.92157 0.92157 0.92157 0.92549 0.92549 0.92549 0.92549 0.92941 0.92941 0.92941 0.92941 0.93333 0.93333 0.93333 0.93333 0.93725 0.93725 0.93725 0.93725 0.94118 0.94118 0.94118 0.94118 0.94510 0.94510 0.94510 0.94510 0.94902 0.94902 0.94902 0.94902 0.95294 0.95294 0.95294 0.95294 0.95686 0.95686 0.95686 0.95686 0.96078 0.96078 0.96078 0.96078 0.96471 0.96471 0.96471 0.96471 0.96863 0.96863 0.96863 0.96863 0.97255 0.97255 0.97255 0.97255 0.97647 0.97647 0.97647 0.97647 0.98039 0.98039 0.98039 0.98039 0.98431 0.98431 0.98431 0.98431 0.98824 0.98824 0.98824 0.98824 0.99216 0.99216 0.99216 0.99216 0.99608 0.99608 0.99608 0.99608 1.00000 1.00000 1.00000 1.00000 END_DATA sf32%D3֮? e wDisplayCAL-3.1.0.0/DisplayCAL/presets/video.icc0000644000076500000000000006414412647526507020721 0ustar devwheel00000000000000hdargl mntrRGB XYZ ;:acspMSFT-argl, p,KR desc cprt/wtptbkptvcgtrXYZ gXYZ bXYZ4rTRCH gTRCH bTRCH targ T]artsh8,desc%DisplayCAL calibration preset: VideotextCreated with DisplayCAL and Argyll CMSXYZ QXYZ vcgt  !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~  !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~  !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~XYZ o8XYZ bXYZ $curv #+4>IUcq+Gc.U}0`3l!a,sSD G [  N % u`TPTbx*V*ndp# !K""#$M%%&'v(G))*+,-^.@/%0 0123456789:;<=>?@B C$D@E^FGHIK!LPMNOQ(ReSTV,WuXZ[^\^_b`bcdfLgi$jlm~nptqsutvx y{,|~W񁏃/҆x!͋}/䐝Yٗf1Р|W5̯ò 'Imԕ UߍJ%tw4textCTI3 DESCRIPTOR "Argyll Calibration Target chart information 3" ORIGINATOR "Argyll dispread" CREATED "Sat Mar 14 19:00:55 2009" KEYWORD "DEVICE_CLASS" DEVICE_CLASS "DISPLAY" KEYWORD "APPROX_WHITE_POINT" APPROX_WHITE_POINT "95.106486 100.000000 108.844025" KEYWORD "COLOR_REP" COLOR_REP "RGB_XYZ" KEYWORD "BLACK_COLOR_PATCHES" BLACK_COLOR_PATCHES "4" KEYWORD "COMP_GREY_STEPS" COMP_GREY_STEPS "49" KEYWORD "MULTI_DIM_BCC_STEPS" MULTI_DIM_BCC_STEPS "5" KEYWORD "MULTI_DIM_STEPS" MULTI_DIM_STEPS "5" KEYWORD "SINGLE_DIM_STEPS" SINGLE_DIM_STEPS "17" KEYWORD "WHITE_COLOR_PATCHES" WHITE_COLOR_PATCHES "4" KEYWORD "AUTO_OPTIMIZE" AUTO_OPTIMIZE "9" BEGIN_ARGYLL_COLPROF_ARGS -qh -aX END_ARGYLL_COLPROF_ARGS NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT SAMPLE_ID RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 271 BEGIN_DATA 1 100.000 100.000 100.000 95.1065 100.000 108.844 2 12.5000 37.5000 12.5000 5.94993 9.61866 3.74740 3 12.5000 62.5000 12.5000 14.1814 26.0794 6.49125 4 12.5000 87.5000 87.5000 40.9488 58.8934 79.2939 5 37.5000 87.5000 87.5000 45.0999 61.0337 79.4884 6 0.00000 25.0000 25.0000 3.71049 4.96568 6.38934 7 0.00000 25.0000 50.0000 6.62643 6.13187 21.7479 8 25.0000 75.0000 75.0000 30.9153 42.8005 56.4485 9 50.0000 75.0000 75.0000 37.5774 46.2355 56.7606 10 12.5000 0.00000 0.00000 1.58591 1.30210 1.02745 11 10.4167 10.4167 10.4167 2.00521 2.05749 2.15195 12 25.0000 0.00000 0.00000 3.07728 2.07105 1.09734 13 31.2500 0.00000 0.00000 4.24932 2.67536 1.15226 14 37.5000 0.00000 0.00000 5.73696 3.44239 1.22197 15 43.7500 0.00000 0.00000 7.56070 4.38272 1.30742 16 50.0000 0.00000 0.00000 9.73934 5.50603 1.40951 17 62.5000 37.5000 62.5000 25.5656 19.0418 35.8409 18 87.5000 37.5000 62.5000 41.5030 27.2592 36.5877 19 0.00000 0.00000 0.00000 1.00000 1.00000 1.00000 20 75.0000 0.00000 0.00000 22.3346 12.0002 1.99970 21 81.2500 0.00000 0.00000 26.5283 14.1625 2.19621 22 87.5000 0.00000 0.00000 31.1672 16.5543 2.41358 23 93.7500 0.00000 0.00000 36.2638 19.1821 2.65240 24 100.000 0.00000 0.00000 41.8302 22.0522 2.91323 25 62.5000 62.5000 12.5000 27.8253 33.1142 7.13058 26 75.0000 75.0000 50.0000 44.6598 50.5248 28.3139 27 8.33333 8.33333 8.33333 1.71786 1.75519 1.82265 28 0.00000 12.5000 0.00000 1.50806 2.01598 1.16935 29 0.00000 43.7500 0.00000 6.68900 12.3764 2.89635 30 0.00000 50.0000 0.00000 8.57817 16.1542 3.52608 31 0.00000 56.2500 0.00000 10.7902 20.5776 4.26342 32 0.00000 62.5000 0.00000 13.3391 25.6747 5.11306 33 12.5000 62.5000 37.5000 15.9983 26.8060 16.0610 34 0.00000 0.00000 0.00000 1.00000 1.00000 1.00000 35 0.00000 6.25000 0.00000 1.18254 1.36502 1.06085 36 0.00000 75.0000 0.00000 19.5000 37.9948 7.16671 37 0.00000 81.2500 0.00000 23.1365 45.2667 8.37888 38 0.00000 87.5000 0.00000 27.1590 53.3106 9.71972 39 0.00000 93.7500 0.00000 31.5784 62.1482 11.1929 40 0.00000 100.000 0.00000 36.4052 71.8005 12.8018 41 6.25000 6.25000 6.25000 1.48518 1.51041 1.55601 42 0.00000 0.00000 12.5000 1.25645 1.10256 2.35074 43 0.00000 0.00000 18.7500 1.52439 1.20972 3.76201 44 0.00000 0.00000 25.0000 1.90921 1.36363 5.78891 45 0.00000 0.00000 31.2500 2.42221 1.56879 8.49092 46 0.00000 0.00000 37.5000 3.07334 1.82920 11.9205 47 0.00000 0.00000 43.7500 3.87158 2.14845 16.1249 48 0.00000 0.00000 50.0000 4.82515 2.52982 21.1475 49 0.00000 0.00000 56.2500 5.94168 2.97636 27.0283 50 0.00000 0.00000 62.5000 7.22826 3.49091 33.8049 51 0.00000 0.00000 68.7500 8.69161 4.07616 41.5125 52 0.00000 0.00000 75.0000 10.3380 4.73463 50.1844 53 0.00000 0.00000 81.2500 12.1736 5.46873 59.8524 54 0.00000 0.00000 87.5000 14.2040 6.28076 70.5467 55 0.00000 0.00000 93.7500 16.4347 7.17291 82.2963 56 0.00000 0.00000 100.000 18.8711 8.14731 95.1290 57 0.00000 50.0000 100.000 26.4493 23.3015 97.6550 58 75.0000 50.0000 100.000 47.7839 34.3017 98.6547 59 0.00000 0.00000 6.25000 1.09214 1.03685 1.48530 60 2.08333 2.08333 2.08333 1.15175 1.15964 1.17390 61 4.16667 4.16667 4.16667 1.30372 1.31952 1.34806 62 12.5000 12.5000 12.5000 2.35042 2.42064 2.54755 63 14.5833 14.5833 14.5833 2.75638 2.84772 3.01278 64 16.6667 16.6667 16.6667 3.22584 3.34159 3.55077 65 18.7500 18.7500 18.7500 3.76135 3.90494 4.16445 66 20.8333 20.8333 20.8333 4.36533 4.54033 4.85660 67 22.9167 22.9167 22.9167 5.04007 5.25016 5.62984 68 25.0000 25.0000 25.0000 5.78777 6.03673 6.48668 69 27.0833 27.0833 27.0833 6.61052 6.90226 7.42953 70 29.1667 29.1667 29.1667 7.51032 7.84886 8.46069 71 31.2500 31.2500 31.2500 8.48913 8.87856 9.58238 72 6.25000 0.00000 0.00000 1.21051 1.10854 1.00986 73 33.3333 33.3333 33.3333 9.54879 9.99333 10.7967 74 35.4167 35.4167 35.4167 10.6911 11.1951 12.1058 75 39.5833 39.5833 39.5833 13.2307 13.8667 15.0161 76 41.6667 41.6667 41.6667 14.6313 15.3402 16.6212 77 43.7500 43.7500 43.7500 16.1213 16.9076 18.3287 78 45.8333 45.8333 45.8333 17.7021 18.5707 20.1403 79 47.9167 47.9167 47.9167 19.3754 20.3310 22.0579 80 50.0000 50.0000 50.0000 21.1427 22.1901 24.0831 81 52.0833 52.0833 52.0833 23.0052 24.1495 26.2175 82 54.1667 54.1667 54.1667 24.9646 26.2107 28.4629 83 56.2500 56.2500 56.2500 27.0221 28.3752 30.8208 84 58.3333 58.3333 58.3333 29.1791 30.6444 33.2927 85 60.4167 60.4167 60.4167 31.4370 33.0197 35.8802 86 62.5000 62.5000 62.5000 33.7971 35.5025 38.5847 87 64.5833 64.5833 64.5833 36.2605 38.0941 41.4078 88 66.6667 66.6667 66.6667 38.8287 40.7958 44.3509 89 68.7500 68.7500 68.7500 41.5028 43.6089 47.4154 90 70.8333 70.8333 70.8333 44.2840 46.5348 50.6026 91 72.9167 72.9167 72.9167 47.1736 49.5746 53.9140 92 75.0000 75.0000 75.0000 50.1727 52.7296 57.3508 93 77.0833 77.0833 77.0833 53.2824 56.0011 60.9145 94 79.1667 79.1667 79.1667 56.5039 59.3901 64.6063 95 81.2500 81.2500 81.2500 59.8383 62.8979 68.4275 96 83.3333 83.3333 83.3333 63.2868 66.5257 72.3793 97 85.4167 85.4167 85.4167 66.8503 70.2745 76.4631 98 87.5000 87.5000 87.5000 70.5301 74.1456 80.6800 99 89.5833 89.5833 89.5833 74.3270 78.1400 85.0312 100 91.6667 91.6667 91.6667 78.2423 82.2589 89.5180 101 93.7500 93.7500 93.7500 82.2769 86.5032 94.1415 102 95.8333 95.8333 95.8333 86.4317 90.8742 98.9029 103 97.9167 97.9167 97.9167 90.7080 95.3727 103.803 104 25.0000 25.0000 0.00000 4.87856 5.67311 1.69777 105 50.0000 25.0000 0.00000 11.5406 9.10808 2.00994 106 75.0000 25.0000 0.00000 24.1359 15.6023 2.60014 107 100.000 25.0000 0.00000 43.6314 25.6542 3.51366 108 100.000 75.0000 0.00000 60.3302 59.0470 9.07994 109 50.0000 50.0000 0.00000 17.3175 20.6603 3.93559 110 75.0000 50.0000 0.00000 29.9128 27.1544 4.52578 111 100.000 50.0000 0.00000 49.4083 37.2064 5.43931 112 100.000 100.000 100.000 95.1065 100.000 108.844 113 50.0000 75.0000 0.00000 28.2393 42.5008 7.57622 114 75.0000 75.0000 0.00000 40.8346 48.9950 8.16642 115 25.0000 75.0000 0.00000 21.5773 39.0658 7.26405 116 25.0000 100.000 0.00000 38.4825 72.8716 12.8992 117 50.0000 100.000 0.00000 45.1445 76.3065 13.2113 118 75.0000 100.000 0.00000 57.7399 82.8007 13.8015 119 100.000 100.000 0.00000 77.2354 92.8527 14.7151 120 25.0000 0.00000 25.0000 3.98649 2.43468 5.88625 121 50.0000 0.00000 25.0000 10.6485 5.86966 6.19842 122 75.0000 0.00000 25.0000 23.2439 12.3638 6.78862 123 75.0000 25.0000 25.0000 25.0451 15.9659 7.38905 124 87.5000 37.5000 37.5000 37.3481 25.5975 14.7033 125 56.2500 0.00000 0.00000 12.2903 6.82130 1.52904 126 100.000 0.00000 25.0000 42.7394 22.4158 7.70214 127 100.000 25.0000 25.0000 44.5407 26.0178 8.30257 128 100.000 25.0000 50.0000 47.4566 27.1840 23.6611 129 50.0000 25.0000 25.0000 12.4498 9.47171 6.79885 130 50.0000 50.0000 25.0000 18.2267 21.0239 8.72450 131 75.0000 50.0000 25.0000 30.8220 27.5181 9.31470 132 100.000 50.0000 25.0000 50.3176 37.5700 10.2282 133 25.0000 50.0000 25.0000 11.5647 17.5889 8.41233 134 25.0000 75.0000 25.0000 22.4865 39.4295 12.0530 135 50.0000 75.0000 25.0000 29.1485 42.8645 12.3651 136 75.0000 75.0000 25.0000 41.7438 49.3586 12.9553 137 100.000 75.0000 25.0000 61.2394 59.4106 13.8689 138 25.0000 50.0000 0.00000 10.6555 17.2253 3.62342 139 25.0000 100.000 25.0000 39.3917 73.2352 17.6881 140 50.0000 100.000 25.0000 46.0538 76.6702 18.0003 141 75.0000 100.000 25.0000 58.6491 83.1644 18.5905 142 100.000 100.000 25.0000 78.1446 93.2163 19.5040 143 25.0000 0.00000 50.0000 6.90243 3.60087 21.2448 144 50.0000 0.00000 50.0000 13.5645 7.03585 21.5570 145 75.0000 0.00000 50.0000 26.1598 13.5300 22.1472 146 100.000 0.00000 50.0000 45.6553 23.5820 23.0607 147 100.000 50.0000 75.0000 58.7464 40.9410 54.6237 148 100.000 50.0000 100.000 67.2794 44.3537 99.5683 149 50.0000 25.0000 50.0000 15.3658 10.6379 22.1574 150 75.0000 25.0000 50.0000 27.9611 17.1321 22.7476 151 100.000 25.0000 75.0000 52.9695 29.3888 52.6981 152 25.0000 25.0000 50.0000 8.70371 7.20292 21.8452 153 25.0000 50.0000 50.0000 14.4806 18.7551 23.7709 154 75.0000 50.0000 50.0000 33.7380 28.6843 24.6733 155 100.000 50.0000 50.0000 53.2335 38.7362 25.5868 156 100.000 75.0000 50.0000 64.1553 60.5768 29.2274 157 87.5000 62.5000 62.5000 49.7345 43.7199 39.3315 158 87.5000 87.5000 62.5000 63.5544 71.3558 43.9382 159 100.000 100.000 75.0000 86.5734 96.5873 63.8995 160 0.00000 68.7500 0.00000 16.2382 31.4721 6.07943 161 0.00000 100.000 25.0000 37.3144 72.1641 17.5907 162 0.00000 100.000 50.0000 40.2304 73.3303 32.9493 163 50.0000 100.000 50.0000 48.9697 77.8364 33.3588 164 75.0000 100.000 50.0000 61.5650 84.3305 33.9490 165 100.000 100.000 50.0000 81.0605 94.3825 34.8625 166 25.0000 0.00000 75.0000 12.4153 5.80568 50.2817 167 50.0000 0.00000 75.0000 19.0774 9.24066 50.5939 168 75.0000 0.00000 75.0000 31.6727 15.7348 51.1841 169 100.000 0.00000 75.0000 51.1682 25.7868 52.0976 170 100.000 0.00000 100.000 59.7013 29.1995 97.0422 171 25.0000 25.0000 75.0000 14.2166 9.40773 50.8822 172 50.0000 25.0000 75.0000 20.8787 12.8427 51.1944 173 75.0000 25.0000 75.0000 33.4740 19.3369 51.7845 174 0.00000 31.2500 0.00000 3.81760 6.63441 1.93921 175 0.00000 37.5000 0.00000 5.10758 9.21400 2.36920 176 25.0000 50.0000 75.0000 19.9935 20.9599 52.8078 177 50.0000 50.0000 75.0000 26.6555 24.3949 53.1200 178 75.0000 50.0000 75.0000 39.2509 30.8891 53.7102 179 100.000 75.0000 75.0000 69.6682 62.7816 58.2644 180 100.000 75.0000 100.000 78.2013 66.1943 103.209 181 0.00000 0.00000 0.00000 1.00000 1.00000 1.00000 182 12.5000 37.5000 37.5000 7.76682 10.3453 13.3171 183 25.0000 75.0000 50.0000 25.4024 40.5957 27.4115 184 25.0000 100.000 50.0000 42.3076 74.4014 33.0466 185 25.0000 100.000 75.0000 47.8205 76.6062 62.0836 186 50.0000 100.000 75.0000 54.4826 80.0412 62.3958 187 75.0000 100.000 75.0000 67.0779 86.5354 62.9859 188 100.000 100.000 100.000 95.1065 100.000 108.844 189 25.0000 0.00000 100.000 20.9484 9.21837 95.2263 190 50.0000 0.00000 100.000 27.6104 12.6533 95.5385 191 75.0000 0.00000 100.000 40.2058 19.1475 96.1287 192 75.0000 75.0000 100.000 58.7057 56.1423 102.295 193 0.00000 25.0000 100.000 20.6724 11.7494 95.7294 194 25.0000 25.0000 100.000 22.7497 12.8204 95.8267 195 50.0000 25.0000 100.000 29.4117 16.2554 96.1389 196 75.0000 25.0000 100.000 42.0070 22.7496 96.7291 197 100.000 25.0000 100.000 61.5026 32.8015 97.6426 198 0.00000 0.00000 0.00000 1.00000 1.00000 1.00000 199 25.0000 50.0000 100.000 28.5266 24.3726 97.7524 200 50.0000 50.0000 100.000 35.1886 27.8076 98.0645 201 50.0000 75.0000 100.000 46.1104 49.6481 101.705 202 12.5000 62.5000 62.5000 20.1532 28.4677 37.9454 203 12.5000 62.5000 87.5000 27.1290 31.2576 74.6872 204 25.0000 75.0000 100.000 39.4484 46.2132 101.393 205 0.00000 50.0000 50.0000 12.4033 17.6840 23.6735 206 0.00000 75.0000 75.0000 28.8380 41.7294 56.3511 207 0.00000 100.000 75.0000 45.7432 75.5351 61.9862 208 0.00000 100.000 100.000 54.2763 78.9478 106.931 209 25.0000 100.000 100.000 56.3536 80.0189 107.028 210 50.0000 100.000 100.000 63.0157 83.4539 107.340 211 75.0000 100.000 100.000 75.6110 89.9480 107.930 212 62.5000 0.00000 0.00000 15.2297 8.33690 1.66678 213 68.7500 0.00000 0.00000 18.5730 10.0607 1.82344 214 100.000 100.000 100.000 95.1065 100.000 108.844 215 0.00000 25.0000 0.00000 2.80128 4.60205 1.60043 216 37.5000 37.5000 12.5000 10.1010 11.7590 3.94191 217 62.5000 37.5000 12.5000 19.5938 16.6535 4.38672 218 87.5000 37.5000 12.5000 35.5312 24.8708 5.13352 219 37.5000 12.5000 12.5000 6.50147 4.56093 2.74206 220 62.5000 12.5000 12.5000 15.9942 9.45544 3.18687 221 87.5000 12.5000 12.5000 31.9317 17.6728 3.93367 222 87.5000 62.5000 12.5000 43.7627 41.3315 7.87738 223 37.5000 62.5000 12.5000 18.3325 28.2197 6.68576 224 37.5000 87.5000 12.5000 32.1524 55.8555 11.2924 225 62.5000 87.5000 12.5000 41.6451 60.7500 11.7372 226 87.5000 87.5000 12.5000 57.5826 68.9674 12.4840 227 12.5000 12.5000 37.5000 4.16730 3.14728 12.1173 228 37.5000 12.5000 37.5000 8.31836 5.28757 12.3118 229 62.5000 12.5000 37.5000 17.8111 10.1821 12.7566 230 87.5000 12.5000 37.5000 33.7486 18.3995 13.5034 231 87.5000 62.5000 37.5000 45.5796 42.0582 17.4471 232 62.5000 37.5000 37.5000 21.4106 17.3801 13.9565 233 62.5000 62.5000 37.5000 29.6421 33.8408 16.7003 234 37.5000 37.5000 37.5000 11.9179 12.4856 13.5116 235 37.5000 62.5000 37.5000 20.1494 28.9463 16.2555 236 50.0000 75.0000 50.0000 32.0645 44.0306 27.7237 237 12.5000 87.5000 12.5000 28.0013 53.7152 11.0979 238 12.5000 87.5000 37.5000 29.8182 54.4419 20.6677 239 37.5000 87.5000 37.5000 33.9692 56.5822 20.8622 240 62.5000 87.5000 37.5000 43.4620 61.4767 21.3070 241 87.5000 87.5000 37.5000 59.3994 69.6941 22.0538 242 18.7500 0.00000 0.00000 2.19807 1.61773 1.05614 243 37.5000 12.5000 62.5000 12.4733 6.94928 34.1962 244 62.5000 12.5000 62.5000 21.9661 11.8438 34.6410 245 87.5000 12.5000 62.5000 37.9035 20.0612 35.3878 246 87.5000 12.5000 87.5000 44.8792 22.8510 72.1296 247 87.5000 37.5000 87.5000 48.4787 30.0490 73.3295 248 87.5000 62.5000 87.5000 56.7102 46.5097 76.0733 249 0.00000 18.7500 0.00000 2.03889 3.07749 1.34630 250 0.00000 50.0000 25.0000 9.48738 16.5179 8.31499 251 0.00000 75.0000 25.0000 20.4092 38.3584 11.9556 252 0.00000 75.0000 50.0000 23.3251 39.5246 27.3142 253 12.5000 87.5000 62.5000 33.9731 56.1036 42.5521 254 37.5000 87.5000 62.5000 38.1242 58.2439 42.7466 255 62.5000 87.5000 62.5000 47.6169 63.1384 43.1914 256 12.5000 12.5000 62.5000 8.32223 4.80899 34.0017 257 12.5000 12.5000 87.5000 15.2979 7.59883 70.7435 258 37.5000 12.5000 87.5000 19.4490 9.73913 70.9380 259 62.5000 12.5000 87.5000 28.9418 14.6336 71.3828 260 12.5000 37.5000 62.5000 11.9217 12.0070 35.2016 261 12.5000 37.5000 87.5000 18.8975 14.7969 71.9433 262 37.5000 37.5000 87.5000 23.0485 16.9371 72.1379 263 62.5000 37.5000 87.5000 32.5413 21.8317 72.5827 264 37.5000 37.5000 62.5000 16.0728 14.1473 35.3961 265 37.5000 62.5000 62.5000 24.3043 30.6080 38.1399 266 37.5000 62.5000 87.5000 31.2800 33.3978 74.8817 267 62.5000 62.5000 87.5000 40.7728 38.2924 75.3265 268 62.5000 87.5000 87.5000 54.5927 65.9282 79.9332 269 0.00000 25.0000 75.0000 12.1393 8.33668 50.7848 270 0.00000 50.0000 75.0000 17.9162 19.8888 52.7105 271 0.00000 75.0000 100.000 37.3711 45.1421 101.296 END_DATA CAL DESCRIPTOR "Argyll Device Calibration State" ORIGINATOR "Argyll dispcal" CREATED "Sat Mar 14 19:07:36 2009" KEYWORD "DEVICE_CLASS" DEVICE_CLASS "DISPLAY" KEYWORD "COLOR_REP" COLOR_REP "RGB" BEGIN_ARGYLL_DISPCAL_ARGS -qm -w0.3127,0.3290 -G2.4 -f0 -k0 END_ARGYLL_DISPCAL_ARGS KEYWORD "RGB_I" NUMBER_OF_FIELDS 4 BEGIN_DATA_FORMAT RGB_I RGB_R RGB_G RGB_B END_DATA_FORMAT NUMBER_OF_SETS 256 BEGIN_DATA 0.00000 0.00000 0.00000 0.00000 0.00392 0.00392 0.00392 0.00392 0.00784 0.00784 0.00784 0.00784 0.01176 0.01176 0.01176 0.01176 0.01569 0.01569 0.01569 0.01569 0.01961 0.01961 0.01961 0.01961 0.02353 0.02353 0.02353 0.02353 0.02745 0.02745 0.02745 0.02745 0.03137 0.03137 0.03137 0.03137 0.03529 0.03529 0.03529 0.03529 0.03922 0.03922 0.03922 0.03922 0.04314 0.04314 0.04314 0.04314 0.04706 0.04706 0.04706 0.04706 0.05098 0.05098 0.05098 0.05098 0.05490 0.05490 0.05490 0.05490 0.05882 0.05882 0.05882 0.05882 0.06275 0.06275 0.06275 0.06275 0.06667 0.06667 0.06667 0.06667 0.07059 0.07059 0.07059 0.07059 0.07451 0.07451 0.07451 0.07451 0.07843 0.07843 0.07843 0.07843 0.08235 0.08235 0.08235 0.08235 0.08627 0.08627 0.08627 0.08627 0.09020 0.09020 0.09020 0.09020 0.09412 0.09412 0.09412 0.09412 0.09804 0.09804 0.09804 0.09804 0.10196 0.10196 0.10196 0.10196 0.10588 0.10588 0.10588 0.10588 0.10980 0.10980 0.10980 0.10980 0.11373 0.11373 0.11373 0.11373 0.11765 0.11765 0.11765 0.11765 0.12157 0.12157 0.12157 0.12157 0.12549 0.12549 0.12549 0.12549 0.12941 0.12941 0.12941 0.12941 0.13333 0.13333 0.13333 0.13333 0.13725 0.13725 0.13725 0.13725 0.14118 0.14118 0.14118 0.14118 0.14510 0.14510 0.14510 0.14510 0.14902 0.14902 0.14902 0.14902 0.15294 0.15294 0.15294 0.15294 0.15686 0.15686 0.15686 0.15686 0.16078 0.16078 0.16078 0.16078 0.16471 0.16471 0.16471 0.16471 0.16863 0.16863 0.16863 0.16863 0.17255 0.17255 0.17255 0.17255 0.17647 0.17647 0.17647 0.17647 0.18039 0.18039 0.18039 0.18039 0.18431 0.18431 0.18431 0.18431 0.18824 0.18824 0.18824 0.18824 0.19216 0.19216 0.19216 0.19216 0.19608 0.19608 0.19608 0.19608 0.20000 0.20000 0.20000 0.20000 0.20392 0.20392 0.20392 0.20392 0.20784 0.20784 0.20784 0.20784 0.21176 0.21176 0.21176 0.21176 0.21569 0.21569 0.21569 0.21569 0.21961 0.21961 0.21961 0.21961 0.22353 0.22353 0.22353 0.22353 0.22745 0.22745 0.22745 0.22745 0.23137 0.23137 0.23137 0.23137 0.23529 0.23529 0.23529 0.23529 0.23922 0.23922 0.23922 0.23922 0.24314 0.24314 0.24314 0.24314 0.24706 0.24706 0.24706 0.24706 0.25098 0.25098 0.25098 0.25098 0.25490 0.25490 0.25490 0.25490 0.25882 0.25882 0.25882 0.25882 0.26275 0.26275 0.26275 0.26275 0.26667 0.26667 0.26667 0.26667 0.27059 0.27059 0.27059 0.27059 0.27451 0.27451 0.27451 0.27451 0.27843 0.27843 0.27843 0.27843 0.28235 0.28235 0.28235 0.28235 0.28627 0.28627 0.28627 0.28627 0.29020 0.29020 0.29020 0.29020 0.29412 0.29412 0.29412 0.29412 0.29804 0.29804 0.29804 0.29804 0.30196 0.30196 0.30196 0.30196 0.30588 0.30588 0.30588 0.30588 0.30980 0.30980 0.30980 0.30980 0.31373 0.31373 0.31373 0.31373 0.31765 0.31765 0.31765 0.31765 0.32157 0.32157 0.32157 0.32157 0.32549 0.32549 0.32549 0.32549 0.32941 0.32941 0.32941 0.32941 0.33333 0.33333 0.33333 0.33333 0.33725 0.33725 0.33725 0.33725 0.34118 0.34118 0.34118 0.34118 0.34510 0.34510 0.34510 0.34510 0.34902 0.34902 0.34902 0.34902 0.35294 0.35294 0.35294 0.35294 0.35686 0.35686 0.35686 0.35686 0.36078 0.36078 0.36078 0.36078 0.36471 0.36471 0.36471 0.36471 0.36863 0.36863 0.36863 0.36863 0.37255 0.37255 0.37255 0.37255 0.37647 0.37647 0.37647 0.37647 0.38039 0.38039 0.38039 0.38039 0.38431 0.38431 0.38431 0.38431 0.38824 0.38824 0.38824 0.38824 0.39216 0.39216 0.39216 0.39216 0.39608 0.39608 0.39608 0.39608 0.40000 0.40000 0.40000 0.40000 0.40392 0.40392 0.40392 0.40392 0.40784 0.40784 0.40784 0.40784 0.41176 0.41176 0.41176 0.41176 0.41569 0.41569 0.41569 0.41569 0.41961 0.41961 0.41961 0.41961 0.42353 0.42353 0.42353 0.42353 0.42745 0.42745 0.42745 0.42745 0.43137 0.43137 0.43137 0.43137 0.43529 0.43529 0.43529 0.43529 0.43922 0.43922 0.43922 0.43922 0.44314 0.44314 0.44314 0.44314 0.44706 0.44706 0.44706 0.44706 0.45098 0.45098 0.45098 0.45098 0.45490 0.45490 0.45490 0.45490 0.45882 0.45882 0.45882 0.45882 0.46275 0.46275 0.46275 0.46275 0.46667 0.46667 0.46667 0.46667 0.47059 0.47059 0.47059 0.47059 0.47451 0.47451 0.47451 0.47451 0.47843 0.47843 0.47843 0.47843 0.48235 0.48235 0.48235 0.48235 0.48627 0.48627 0.48627 0.48627 0.49020 0.49020 0.49020 0.49020 0.49412 0.49412 0.49412 0.49412 0.49804 0.49804 0.49804 0.49804 0.50196 0.50196 0.50196 0.50196 0.50588 0.50588 0.50588 0.50588 0.50980 0.50980 0.50980 0.50980 0.51373 0.51373 0.51373 0.51373 0.51765 0.51765 0.51765 0.51765 0.52157 0.52157 0.52157 0.52157 0.52549 0.52549 0.52549 0.52549 0.52941 0.52941 0.52941 0.52941 0.53333 0.53333 0.53333 0.53333 0.53725 0.53725 0.53725 0.53725 0.54118 0.54118 0.54118 0.54118 0.54510 0.54510 0.54510 0.54510 0.54902 0.54902 0.54902 0.54902 0.55294 0.55294 0.55294 0.55294 0.55686 0.55686 0.55686 0.55686 0.56078 0.56078 0.56078 0.56078 0.56471 0.56471 0.56471 0.56471 0.56863 0.56863 0.56863 0.56863 0.57255 0.57255 0.57255 0.57255 0.57647 0.57647 0.57647 0.57647 0.58039 0.58039 0.58039 0.58039 0.58431 0.58431 0.58431 0.58431 0.58824 0.58824 0.58824 0.58824 0.59216 0.59216 0.59216 0.59216 0.59608 0.59608 0.59608 0.59608 0.60000 0.60000 0.60000 0.60000 0.60392 0.60392 0.60392 0.60392 0.60784 0.60784 0.60784 0.60784 0.61176 0.61176 0.61176 0.61176 0.61569 0.61569 0.61569 0.61569 0.61961 0.61961 0.61961 0.61961 0.62353 0.62353 0.62353 0.62353 0.62745 0.62745 0.62745 0.62745 0.63137 0.63137 0.63137 0.63137 0.63529 0.63529 0.63529 0.63529 0.63922 0.63922 0.63922 0.63922 0.64314 0.64314 0.64314 0.64314 0.64706 0.64706 0.64706 0.64706 0.65098 0.65098 0.65098 0.65098 0.65490 0.65490 0.65490 0.65490 0.65882 0.65882 0.65882 0.65882 0.66275 0.66275 0.66275 0.66275 0.66667 0.66667 0.66667 0.66667 0.67059 0.67059 0.67059 0.67059 0.67451 0.67451 0.67451 0.67451 0.67843 0.67843 0.67843 0.67843 0.68235 0.68235 0.68235 0.68235 0.68627 0.68627 0.68627 0.68627 0.69020 0.69020 0.69020 0.69020 0.69412 0.69412 0.69412 0.69412 0.69804 0.69804 0.69804 0.69804 0.70196 0.70196 0.70196 0.70196 0.70588 0.70588 0.70588 0.70588 0.70980 0.70980 0.70980 0.70980 0.71373 0.71373 0.71373 0.71373 0.71765 0.71765 0.71765 0.71765 0.72157 0.72157 0.72157 0.72157 0.72549 0.72549 0.72549 0.72549 0.72941 0.72941 0.72941 0.72941 0.73333 0.73333 0.73333 0.73333 0.73725 0.73725 0.73725 0.73725 0.74118 0.74118 0.74118 0.74118 0.74510 0.74510 0.74510 0.74510 0.74902 0.74902 0.74902 0.74902 0.75294 0.75294 0.75294 0.75294 0.75686 0.75686 0.75686 0.75686 0.76078 0.76078 0.76078 0.76078 0.76471 0.76471 0.76471 0.76471 0.76863 0.76863 0.76863 0.76863 0.77255 0.77255 0.77255 0.77255 0.77647 0.77647 0.77647 0.77647 0.78039 0.78039 0.78039 0.78039 0.78431 0.78431 0.78431 0.78431 0.78824 0.78824 0.78824 0.78824 0.79216 0.79216 0.79216 0.79216 0.79608 0.79608 0.79608 0.79608 0.80000 0.80000 0.80000 0.80000 0.80392 0.80392 0.80392 0.80392 0.80784 0.80784 0.80784 0.80784 0.81176 0.81176 0.81176 0.81176 0.81569 0.81569 0.81569 0.81569 0.81961 0.81961 0.81961 0.81961 0.82353 0.82353 0.82353 0.82353 0.82745 0.82745 0.82745 0.82745 0.83137 0.83137 0.83137 0.83137 0.83529 0.83529 0.83529 0.83529 0.83922 0.83922 0.83922 0.83922 0.84314 0.84314 0.84314 0.84314 0.84706 0.84706 0.84706 0.84706 0.85098 0.85098 0.85098 0.85098 0.85490 0.85490 0.85490 0.85490 0.85882 0.85882 0.85882 0.85882 0.86275 0.86275 0.86275 0.86275 0.86667 0.86667 0.86667 0.86667 0.87059 0.87059 0.87059 0.87059 0.87451 0.87451 0.87451 0.87451 0.87843 0.87843 0.87843 0.87843 0.88235 0.88235 0.88235 0.88235 0.88627 0.88627 0.88627 0.88627 0.89020 0.89020 0.89020 0.89020 0.89412 0.89412 0.89412 0.89412 0.89804 0.89804 0.89804 0.89804 0.90196 0.90196 0.90196 0.90196 0.90588 0.90588 0.90588 0.90588 0.90980 0.90980 0.90980 0.90980 0.91373 0.91373 0.91373 0.91373 0.91765 0.91765 0.91765 0.91765 0.92157 0.92157 0.92157 0.92157 0.92549 0.92549 0.92549 0.92549 0.92941 0.92941 0.92941 0.92941 0.93333 0.93333 0.93333 0.93333 0.93725 0.93725 0.93725 0.93725 0.94118 0.94118 0.94118 0.94118 0.94510 0.94510 0.94510 0.94510 0.94902 0.94902 0.94902 0.94902 0.95294 0.95294 0.95294 0.95294 0.95686 0.95686 0.95686 0.95686 0.96078 0.96078 0.96078 0.96078 0.96471 0.96471 0.96471 0.96471 0.96863 0.96863 0.96863 0.96863 0.97255 0.97255 0.97255 0.97255 0.97647 0.97647 0.97647 0.97647 0.98039 0.98039 0.98039 0.98039 0.98431 0.98431 0.98431 0.98431 0.98824 0.98824 0.98824 0.98824 0.99216 0.99216 0.99216 0.99216 0.99608 0.99608 0.99608 0.99608 1.00000 1.00000 1.00000 1.00000 END_DATA sf32%D3֮? e wDisplayCAL-3.1.0.0/DisplayCAL/presets/video_eeColor.icc0000644000076500000000000035372412647526507022376 0ustar devwheel00000000000000argl mntrRGB XYZ ;acspMSFT-argl*\>;Vdesc,cprt/wtptbkptvcgtrXYZgXYZ0bXYZDrTRCXgTRCXbTRCXtargharts@,dmddlgdesc'DisplayCAL calibration preset: eeColortextCreated with DisplayCAL and Argyll CMSXYZ QXYZ vcgt  !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~  !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~  !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~XYZ o8XYZ bXYZ $curv3textCTI3 DESCRIPTOR "Argyll Calibration Target chart information 3" ORIGINATOR "Argyll dispread" CREATED "Sat Mar 14 19:00:55 2009" KEYWORD "DEVICE_CLASS" DEVICE_CLASS "DISPLAY" KEYWORD "APPROX_WHITE_POINT" APPROX_WHITE_POINT "95.045781 100.000003 108.905751" KEYWORD "DARK_REGION_EMPHASIS" DARK_REGION_EMPHASIS "1.6" KEYWORD "ACCURATE_EXPECTED_VALUES" ACCURATE_EXPECTED_VALUES "true" KEYWORD "COLOR_REP" COLOR_REP "RGB_XYZ" KEYWORD "BLACK_COLOR_PATCHES" BLACK_COLOR_PATCHES "4" KEYWORD "COMP_GREY_STEPS" COMP_GREY_STEPS "97" KEYWORD "SINGLE_DIM_STEPS" SINGLE_DIM_STEPS "33" KEYWORD "WHITE_COLOR_PATCHES" WHITE_COLOR_PATCHES "4" KEYWORD "USE_BLACK_POINT_COMPENSATION" USE_BLACK_POINT_COMPENSATION "NO" KEYWORD "HIRES_B2A" HIRES_B2A "NO" KEYWORD "AUTO_OPTIMIZE" AUTO_OPTIMIZE "9" KEYWORD "3DLUT_SOURCE_PROFILE" 3DLUT_SOURCE_PROFILE "ref/Rec709.icm" KEYWORD "3DLUT_GAMMA" 3DLUT_GAMMA "-2.4" KEYWORD "3DLUT_DEGREE_OF_BLACK_OUTPUT_OFFSET" 3DLUT_DEGREE_OF_BLACK_OUTPUT_OFFSET "0.0" KEYWORD "3DLUT_INPUT_ENCODING" 3DLUT_INPUT_ENCODING "t" KEYWORD "3DLUT_OUTPUT_ENCODING" 3DLUT_OUTPUT_ENCODING "t" KEYWORD "3DLUT_GAMUT_MAPPING_MODE" 3DLUT_GAMUT_MAPPING_MODE "G" KEYWORD "3DLUT_RENDERING_INTENT" 3DLUT_RENDERING_INTENT "aw" KEYWORD "3DLUT_FORMAT" 3DLUT_FORMAT "eeColor" KEYWORD "3DLUT_SIZE" 3DLUT_SIZE "65" BEGIN_ARGYLL_COLPROF_ARGS -qh -bl -ax -M "SII REPEATER" END_ARGYLL_COLPROF_ARGS NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT SAMPLE_ID RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 1399 BEGIN_DATA 1 100.0000000 100.0000000 100.0000000 95.04580000 100.0000000 108.9060000 2 36.18660000 40.25050000 29.03860000 10.43240000 12.41520000 8.082730000 3 75.62240000 56.57030000 28.01850000 33.62140000 32.37170000 10.24120000 4 82.79480000 56.83720000 43.69100000 40.46860000 35.84890000 20.10110000 5 19.47590000 14.15960000 0.000000000 1.614820000 1.553530000 0.214771000 6 20.94060000 9.655240000 0.000000000 1.533610000 1.101250000 0.131754000 7 21.64610000 0.000000000 9.880980000 1.535610000 0.778814000 0.651906000 8 64.49270000 50.86790000 23.72350000 24.56660000 24.58230000 7.448250000 9 78.94490000 73.49390000 36.37540000 44.63550000 49.75270000 17.48580000 10 0.000000000 15.10070000 0.000000000 0.559497000 1.119080000 0.186522000 11 0.000000000 9.493670000 0.000000000 0.201613000 0.403256000 0.067212600 12 11.29030000 0.000000000 0.000000000 0.340406000 0.175489000 0.015935900 13 13.15790000 0.000000000 0.000000000 0.476651000 0.245728000 0.022314200 14 13.21410000 8.186610000 0.000000000 0.626698000 0.539183000 0.071050300 15 6.646220000 6.646220000 6.646220000 0.244634000 0.257385000 0.280307000 16 9.493670000 9.493670000 9.493670000 0.535904000 0.563838000 0.614052000 17 15.10070000 0.000000000 0.000000000 0.645261000 0.332651000 0.030207600 18 17.12330000 0.000000000 0.000000000 0.850733000 0.438578000 0.039826700 19 19.23080000 0.000000000 0.000000000 1.098130000 0.566119000 0.051408600 20 21.42860000 0.000000000 0.000000000 1.393190000 0.718230000 0.065221500 21 23.72260000 0.000000000 0.000000000 1.742400000 0.898261000 0.081569800 22 26.11940000 0.000000000 0.000000000 2.153160000 1.110020000 0.100799000 23 28.62600000 0.000000000 0.000000000 2.633900000 1.357850000 0.123305000 24 31.25000000 0.000000000 0.000000000 3.194240000 1.646720000 0.149537000 25 34.00000000 0.000000000 0.000000000 3.845230000 1.982330000 0.180013000 26 36.88520000 0.000000000 0.000000000 4.599570000 2.371210000 0.215327000 27 39.91600000 0.000000000 0.000000000 5.471880000 2.820920000 0.256164000 28 43.10340000 0.000000000 0.000000000 6.479100000 3.340170000 0.303316000 29 46.46020000 0.000000000 0.000000000 7.640830000 3.939070000 0.357702000 30 50.00000000 0.000000000 0.000000000 8.979910000 4.629410000 0.420390000 31 53.73830000 0.000000000 0.000000000 10.52300000 5.424900000 0.492628000 32 57.69230000 0.000000000 0.000000000 12.30120000 6.341650000 0.575877000 33 61.88120000 0.000000000 0.000000000 14.35140000 7.398570000 0.671854000 34 66.32650000 0.000000000 0.000000000 16.71680000 8.618020000 0.782591000 35 71.05260000 0.000000000 0.000000000 19.44890000 10.02650000 0.910491000 36 76.08700000 0.000000000 0.000000000 22.60880000 11.65550000 1.058420000 37 81.46070000 0.000000000 0.000000000 26.26990000 13.54290000 1.229810000 38 87.20930000 0.000000000 0.000000000 30.52020000 15.73410000 1.428790000 39 93.37350000 0.000000000 0.000000000 35.46650000 18.28400000 1.660350000 40 100.0000000 0.000000000 0.000000000 41.23850000 21.25960000 1.930560000 41 13.02300000 15.75260000 0.000000000 1.079970000 1.468310000 0.226506000 42 10.68380000 10.68380000 10.68380000 0.694840000 0.731058000 0.796164000 43 4.491020000 0.000000000 0.000000000 0.044824300 0.023108300 0.002098430 44 7.201650000 7.201650000 7.201650000 0.291861000 0.307074000 0.334421000 45 0.000000000 1.445090000 0.000000000 0.003210470 0.006421420 0.001070290 46 0.000000000 2.941180000 0.000000000 0.015321700 0.030645700 0.005107870 47 0.000000000 4.491020000 0.000000000 0.038866600 0.077738900 0.012957100 48 7.763980000 7.763980000 7.763980000 0.344338000 0.362287000 0.394551000 49 0.000000000 13.15790000 0.000000000 0.413298000 0.826656000 0.137783000 50 0.000000000 17.12330000 0.000000000 0.737658000 1.475430000 0.245916000 51 0.000000000 19.23080000 0.000000000 0.952175000 1.904490000 0.317431000 52 0.000000000 21.42860000 0.000000000 1.208020000 2.416210000 0.402721000 53 0.000000000 23.72260000 0.000000000 1.510810000 3.021850000 0.503667000 54 0.000000000 26.11940000 0.000000000 1.866980000 3.734230000 0.622403000 55 0.000000000 28.62600000 0.000000000 2.283820000 4.567970000 0.761366000 56 0.000000000 31.25000000 0.000000000 2.769680000 5.539770000 0.923340000 57 0.000000000 34.00000000 0.000000000 3.334140000 6.668780000 1.111520000 58 0.000000000 36.88520000 0.000000000 3.988220000 7.977030000 1.329570000 59 0.000000000 39.91600000 0.000000000 4.744590000 9.489890000 1.581730000 60 0.000000000 43.10340000 0.000000000 5.617940000 11.23670000 1.872880000 61 0.000000000 46.46020000 0.000000000 6.625260000 13.25150000 2.208690000 62 0.000000000 50.00000000 0.000000000 7.786350000 15.57390000 2.595770000 63 0.000000000 53.73830000 0.000000000 9.124320000 18.25000000 3.041810000 64 0.000000000 57.69230000 0.000000000 10.66620000 21.33400000 3.555850000 65 0.000000000 61.88120000 0.000000000 12.44390000 24.88960000 4.148480000 66 0.000000000 66.32650000 0.000000000 14.49490000 28.99200000 4.832240000 67 0.000000000 71.05260000 0.000000000 16.86390000 33.73020000 5.621980000 68 0.000000000 76.08700000 0.000000000 19.60380000 39.21050000 6.535400000 69 0.000000000 81.46070000 0.000000000 22.77820000 45.55980000 7.593680000 70 0.000000000 87.20930000 0.000000000 26.46360000 52.93120000 8.822290000 71 0.000000000 93.37350000 0.000000000 30.75250000 61.50950000 10.25210000 72 0.000000000 100.0000000 0.000000000 35.75730000 71.51990000 11.92060000 73 28.34880000 100.0000000 70.37100000 46.66960000 76.18290000 55.93060000 74 67.98480000 100.0000000 74.26580000 62.78950000 84.37210000 62.15630000 75 83.59200000 100.0000000 74.15010000 72.91270000 89.59460000 62.46250000 76 100.0000000 100.0000000 79.29620000 87.83280000 97.11460000 70.92110000 77 9.863630000 9.892620000 0.000000000 0.473628000 0.571849000 0.085421100 78 0.000000000 0.000000000 2.941180000 0.007734280 0.003093910 0.040730200 79 0.000000000 0.000000000 4.491020000 0.019619500 0.007848320 0.103320000 80 0.000000000 0.000000000 6.097560000 0.038438800 0.015376500 0.202426000 81 0.000000000 0.000000000 13.15790000 0.208629000 0.083457100 1.098680000 82 0.000000000 0.000000000 17.12330000 0.372364000 0.148955000 1.960940000 83 0.000000000 0.000000000 19.23080000 0.480650000 0.192272000 2.531190000 84 0.000000000 0.000000000 21.42860000 0.609797000 0.243934000 3.211300000 85 0.000000000 0.000000000 23.72260000 0.762647000 0.305078000 4.016240000 86 0.000000000 0.000000000 26.11940000 0.942436000 0.376999000 4.963040000 87 0.000000000 0.000000000 28.62600000 1.152850000 0.461170000 6.071130000 88 0.000000000 0.000000000 31.25000000 1.398110000 0.559281000 7.362710000 89 0.000000000 0.000000000 34.00000000 1.683050000 0.673263000 8.863250000 90 0.000000000 0.000000000 36.88520000 2.013220000 0.805340000 10.60200000 91 0.000000000 0.000000000 39.91600000 2.395030000 0.958075000 12.61270000 92 0.000000000 0.000000000 43.10340000 2.835890000 1.134430000 14.93430000 93 0.000000000 0.000000000 46.46020000 3.344380000 1.337840000 17.61210000 94 0.000000000 0.000000000 50.00000000 3.930490000 1.572300000 20.69870000 95 0.000000000 0.000000000 53.73830000 4.605880000 1.842470000 24.25540000 96 0.000000000 0.000000000 66.32650000 7.316920000 2.926960000 38.53230000 97 0.000000000 0.000000000 71.05260000 8.512740000 3.405320000 44.82970000 98 0.000000000 0.000000000 76.08700000 9.895840000 3.958590000 52.11330000 99 0.000000000 0.000000000 81.46070000 11.49830000 4.599600000 60.55200000 100 0.000000000 0.000000000 87.20930000 13.35860000 5.343790000 70.34900000 101 0.000000000 0.000000000 93.37350000 15.52360000 6.209840000 81.75010000 102 0.000000000 0.000000000 100.0000000 18.05000000 7.220460000 95.05460000 103 55.83310000 0.000000000 79.89610000 22.46440000 10.30840000 58.55950000 104 65.71360000 65.46360000 80.69580000 41.72460000 41.11790000 64.77050000 105 0.000000000 16.36620000 11.20940000 0.814484000 1.394420000 0.994951000 106 11.90480000 11.90480000 11.90480000 0.881537000 0.927487000 1.010090000 107 7.763980000 0.000000000 0.000000000 0.149401000 0.077020800 0.006994160 108 0.000000000 7.763980000 0.000000000 0.129544000 0.259107000 0.043186600 109 0.000000000 0.000000000 7.763980000 0.065392700 0.026158800 0.344370000 110 0.000000000 6.097560000 0.000000000 0.076147800 0.152307000 0.025385700 111 6.097560000 0.000000000 0.000000000 0.087820400 0.045274000 0.004111270 112 0.000000000 0.000000000 1.445090000 0.001620620 0.000648290 0.008534490 113 0.476190000 0.476190000 0.476190000 0.000742788 0.000781505 0.000851104 114 0.957854000 0.957854000 0.957854000 0.003454370 0.003634430 0.003958100 115 1.445090000 1.445090000 1.445090000 0.008533690 0.008978510 0.009778110 116 9.493670000 0.000000000 0.000000000 0.232518000 0.119870000 0.010885200 117 1.937980000 1.937980000 1.937980000 0.016272000 0.017120200 0.018644900 118 0.000000000 0.000000000 9.493670000 0.101773000 0.040711700 0.535954000 119 2.436650000 2.436650000 2.436650000 0.026923800 0.028327200 0.030850000 120 2.941180000 2.941180000 2.941180000 0.040726400 0.042849200 0.046665300 121 3.451680000 3.451680000 3.451680000 0.057908400 0.060926800 0.066352800 122 3.968250000 3.968250000 3.968250000 0.078694900 0.082796800 0.090170500 123 4.491020000 4.491020000 4.491020000 0.103310000 0.108695000 0.118376000 124 5.020080000 5.020080000 5.020080000 0.131981000 0.138860000 0.151227000 125 0.000000000 0.000000000 11.29030000 0.148995000 0.059601800 0.784634000 126 5.555560000 5.555560000 5.555560000 0.164935000 0.173533000 0.188987000 127 6.097560000 6.097560000 6.097560000 0.202407000 0.212957000 0.231923000 128 8.333330000 8.333330000 8.333330000 0.402325000 0.423296000 0.460994000 129 12.52720000 12.52720000 12.52720000 0.986096000 1.037500000 1.129890000 130 13.15790000 13.15790000 13.15790000 1.098580000 1.155840000 1.258780000 131 13.79690000 13.79690000 13.79690000 1.219340000 1.282900000 1.397150000 132 14.44440000 14.44440000 14.44440000 1.348750000 1.419050000 1.545430000 133 15.76580000 15.76580000 15.76580000 1.635060000 1.720280000 1.873490000 134 16.43990000 16.43990000 16.43990000 1.792770000 1.886220000 2.054200000 135 17.12330000 17.12330000 17.12330000 1.960760000 2.062960000 2.246680000 136 17.81610000 17.81610000 17.81610000 2.139470000 2.250990000 2.451450000 137 18.51850000 18.51850000 18.51850000 2.329370000 2.450790000 2.669050000 138 19.23080000 19.23080000 19.23080000 2.530960000 2.662880000 2.900030000 139 19.95310000 19.95310000 19.95310000 2.744730000 2.887800000 3.144980000 140 20.68560000 20.68560000 20.68560000 2.971230000 3.126100000 3.404510000 141 21.42860000 21.42860000 21.42860000 3.211000000 3.378370000 3.679240000 142 22.18230000 22.18230000 22.18230000 3.464630000 3.645220000 3.969850000 143 23.72260000 23.72260000 23.72260000 4.015870000 4.225190000 4.601480000 144 24.50980000 24.50980000 24.50980000 4.314770000 4.539670000 4.943970000 145 25.30860000 25.30860000 25.30860000 4.630100000 4.871440000 5.305280000 146 26.11940000 26.11940000 26.11940000 4.962580000 5.221250000 5.686240000 147 26.94240000 26.94240000 26.94240000 5.312950000 5.589890000 6.087710000 148 27.77780000 27.77780000 27.77780000 5.682010000 5.978180000 6.510580000 149 28.62600000 28.62600000 28.62600000 6.070570000 6.386990000 6.955800000 150 29.48720000 29.48720000 29.48720000 6.479480000 6.817220000 7.424350000 151 30.36180000 30.36180000 30.36180000 6.909660000 7.269820000 7.917250000 152 31.25000000 31.25000000 31.25000000 7.362030000 7.745770000 8.435590000 153 32.15220000 32.15220000 32.15220000 7.837590000 8.246120000 8.980490000 154 33.06880000 33.06880000 33.06880000 8.337360000 8.771940000 9.553140000 155 34.00000000 34.00000000 34.00000000 8.862420000 9.324370000 10.15480000 156 34.94620000 34.94620000 34.94620000 9.413920000 9.904620000 10.78670000 157 35.90790000 35.90790000 35.90790000 9.993030000 10.51390000 11.45030000 158 36.88520000 36.88520000 36.88520000 10.60100000 11.15360000 12.14690000 159 37.87880000 37.87880000 37.87880000 11.23920000 11.82500000 12.87810000 160 38.88890000 38.88890000 38.88890000 11.90880000 12.52960000 13.64540000 161 39.91600000 39.91600000 39.91600000 12.61150000 13.26890000 14.45060000 162 40.96050000 40.96050000 40.96050000 13.34870000 14.04450000 15.29520000 163 42.02280000 42.02280000 42.02280000 14.12190000 14.85800000 16.18120000 164 43.10340000 43.10340000 43.10340000 14.93290000 15.71130000 17.11050000 165 44.20290000 44.20290000 44.20290000 15.78340000 16.60610000 18.08500000 166 45.32160000 45.32160000 45.32160000 16.67530000 17.54450000 19.10700000 167 46.46020000 46.46020000 46.46020000 17.61050000 18.52840000 20.17850000 168 47.61900000 47.61900000 47.61900000 18.59100000 19.56000000 21.30200000 169 48.79880000 48.79880000 48.79880000 19.61900000 20.64160000 22.47990000 170 50.00000000 50.00000000 50.00000000 20.69670000 21.77560000 23.71480000 171 51.22320000 51.22320000 51.22320000 21.82670000 22.96440000 25.00950000 172 52.46910000 52.46910000 52.46910000 23.01130000 24.21070000 26.36680000 173 53.73830000 53.73830000 53.73830000 24.25320000 25.51740000 27.78990000 174 55.03140000 55.03140000 55.03140000 25.55520000 26.88730000 29.28180000 175 56.34920000 56.34920000 56.34920000 26.92030000 28.32360000 30.84600000 176 57.69230000 57.69230000 57.69230000 28.35170000 29.82950000 32.48600000 177 59.06150000 59.06150000 59.06150000 29.85250000 31.40860000 34.20580000 178 60.45750000 60.45750000 60.45750000 31.42640000 33.06450000 36.00910000 179 61.88120000 61.88120000 61.88120000 33.07690000 34.80100000 37.90030000 180 63.33330000 63.33330000 63.33330000 34.80800000 36.62230000 39.88380000 181 64.81480000 64.81480000 64.81480000 36.62380000 38.53280000 41.96440000 182 66.32650000 66.32650000 66.32650000 38.52870000 40.53700000 44.14710000 183 67.86940000 67.86940000 67.86940000 40.52730000 42.63970000 46.43710000 184 69.44440000 69.44440000 69.44440000 42.62450000 44.84630000 48.84020000 185 71.05260000 71.05260000 71.05260000 44.82550000 47.16200000 51.36210000 186 72.69500000 72.69500000 72.69500000 47.13590000 49.59280000 54.00940000 187 74.37280000 74.37280000 74.37280000 49.56140000 52.14480000 56.78870000 188 76.08700000 76.08700000 76.08700000 52.10840000 54.82460000 59.70710000 189 77.83880000 77.83880000 77.83880000 54.78350000 57.63910000 62.77220000 190 79.62960000 79.62960000 79.62960000 57.59360000 60.59570000 65.99220000 191 81.46070000 81.46070000 81.46070000 60.54640000 63.70230000 69.37550000 192 83.33330000 83.33330000 83.33330000 63.64960000 66.96740000 72.93130000 193 85.24900000 85.24900000 85.24900000 66.91200000 70.39970000 76.66940000 194 87.20930000 87.20930000 87.20930000 70.34240000 74.00900000 80.60010000 195 89.21570000 89.21570000 89.21570000 73.95070000 77.80530000 84.73450000 196 91.26980000 91.26980000 91.26980000 77.74700000 81.79960000 89.08440000 197 100.0000000 100.0000000 91.96320000 92.00840000 98.78500000 92.91030000 198 100.0000000 81.60980000 76.74380000 74.19320000 71.03720000 62.66260000 199 100.0000000 84.45000000 86.88810000 79.14620000 75.87800000 79.93090000 200 10.94810000 0.000000000 9.601720000 0.422464000 0.205741000 0.564354000 201 0.000000000 0.000000000 15.10070000 0.282430000 0.112979000 1.487330000 202 0.000000000 10.33340000 22.67520000 0.933476000 0.762126000 3.717550000 203 29.91970000 0.000000000 42.70670000 5.681600000 2.608070000 14.76950000 204 44.35130000 0.000000000 67.30290000 14.45470000 6.579090000 40.11370000 205 49.52420000 69.01080000 78.69820000 35.26760000 40.43180000 61.81220000 206 23.75210000 70.09500000 0.000000000 18.11520000 33.63920000 5.538480000 207 53.09250000 71.70330000 0.000000000 27.45220000 39.69580000 6.215520000 208 100.0000000 85.42810000 33.11380000 68.11600000 72.47760000 18.72450000 209 100.0000000 91.35830000 69.54470000 78.67070000 83.13580000 54.46620000 210 46.72430000 20.89060000 43.02070000 11.70290000 7.402950000 15.61430000 211 66.90700000 19.55090000 51.63590000 22.24650000 12.44730000 23.34420000 212 0.000000000 0.000000000 57.69230000 5.384230000 2.153830000 28.35430000 213 0.000000000 45.59070000 80.88170000 17.67500000 17.24030000 61.72840000 214 0.000000000 62.98100000 84.26860000 25.32340000 30.82840000 69.54960000 215 0.000000000 45.08500000 59.05490000 11.86950000 14.67140000 31.91550000 216 0.000000000 64.62960000 71.11170000 22.22020000 30.79730000 49.47620000 217 0.000000000 52.38060000 57.51790000 13.97350000 19.39080000 31.04160000 218 0.000000000 69.86820000 68.43220000 24.08930000 35.64120000 46.69180000 219 0.000000000 70.48080000 100.0000000 34.61680000 40.35660000 100.5780000 220 0.000000000 79.35790000 100.0000000 39.55510000 50.23390000 102.2240000 221 0.000000000 88.78420000 100.0000000 45.57600000 62.27660000 104.2310000 222 0.000000000 41.38020000 31.03300000 6.512640000 10.82310000 8.962870000 223 0.000000000 58.32010000 30.07070000 12.20790000 22.36190000 10.40700000 224 47.77500000 37.97340000 0.000000000 12.37600000 12.69220000 1.797710000 225 61.25000000 46.87190000 0.000000000 20.78650000 20.74470000 2.908840000 226 70.64520000 60.11200000 0.000000000 30.87940000 33.25200000 4.791160000 227 83.29470000 84.23340000 0.000000000 52.10640000 63.26250000 9.465270000 228 65.23390000 68.26600000 0.000000000 31.56060000 39.19800000 5.902970000 229 68.39920000 78.31160000 14.21970000 39.02120000 51.09640000 9.103550000 230 74.32500000 100.0000000 38.72730000 59.47160000 83.48650000 24.72720000 231 79.58850000 100.0000000 84.97470000 73.33500000 89.43500000 79.53460000 232 0.000000000 18.62310000 21.20980000 1.483450000 2.013140000 3.435440000 233 0.000000000 25.31750000 31.72670000 3.188680000 4.064940000 8.193120000 234 0.000000000 34.90900000 45.97710000 6.801720000 8.374630000 18.38980000 235 68.27620000 43.77400000 49.31960000 27.44230000 22.33530000 22.85580000 236 76.82380000 70.03830000 53.78700000 44.04710000 46.43160000 30.83190000 237 0.000000000 32.92980000 28.79140000 4.275250000 6.682900000 7.184590000 238 0.000000000 73.75240000 63.54720000 24.96480000 39.27720000 41.17270000 239 0.000000000 100.0000000 77.27440000 45.99600000 75.61560000 65.83920000 240 0.000000000 100.0000000 88.30430000 49.48760000 77.01240000 84.22670000 241 0.000000000 100.0000000 100.0000000 53.80730000 78.74040000 106.9750000 242 0.000000000 39.39160000 61.53190000 10.81250000 11.69960000 34.20710000 243 0.000000000 44.09460000 100.0000000 23.95600000 19.03330000 97.02350000 244 0.000000000 52.35390000 100.0000000 26.66540000 24.45240000 97.92680000 245 0.000000000 61.07990000 100.0000000 30.14230000 31.40680000 99.08590000 246 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 247 41.54630000 0.000000000 12.81390000 6.172290000 3.159260000 1.316250000 248 70.31060000 0.000000000 23.65710000 19.76310000 10.10090000 4.881600000 249 84.78780000 0.000000000 47.23920000 32.15640000 16.17690000 19.61110000 250 100.0000000 0.000000000 52.92420000 45.69230000 23.04130000 25.38520000 251 100.0000000 0.000000000 63.08060000 47.79090000 23.88080000 36.43710000 252 100.0000000 0.000000000 86.90030000 54.49320000 26.56190000 71.73250000 253 68.22890000 19.45920000 60.43860000 24.73070000 13.51140000 32.56630000 254 48.72460000 0.000000000 34.30220000 10.20000000 5.060170000 9.434580000 255 53.83400000 0.000000000 45.04880000 13.68920000 6.696250000 16.95140000 256 67.68530000 0.000000000 45.44390000 20.66480000 10.28540000 17.59420000 257 81.86040000 0.000000000 57.65320000 31.93040000 15.84010000 29.55520000 258 85.37840000 0.000000000 88.42760000 42.90120000 20.52610000 73.89210000 259 35.12170000 51.67870000 44.44730000 15.53660000 20.08960000 18.96210000 260 35.46710000 50.54140000 54.26730000 16.89880000 20.00510000 27.63910000 261 35.06590000 58.32980000 61.56210000 21.25310000 26.46190000 36.54150000 262 37.98160000 74.68580000 93.19550000 39.18280000 46.35280000 87.91110000 263 64.46880000 83.77100000 100.0000000 57.97760000 63.76650000 103.8650000 264 78.79220000 83.70940000 100.0000000 66.64850000 68.17850000 104.2600000 265 100.0000000 91.11700000 100.0000000 88.43020000 86.76780000 106.7000000 266 24.52780000 0.000000000 30.82510000 3.231760000 1.509370000 7.232100000 267 26.78640000 0.000000000 70.09100000 10.53740000 4.478100000 43.61270000 268 32.26250000 0.000000000 100.0000000 21.47630000 8.986810000 95.21500000 269 41.60570000 26.46420000 100.0000000 25.96590000 14.15420000 95.97590000 270 43.49310000 55.64040000 100.0000000 34.50830000 30.32830000 98.64760000 271 49.41410000 69.26280000 100.0000000 42.74380000 43.62120000 100.7790000 272 87.38650000 68.53030000 100.0000000 64.28200000 54.17770000 101.6820000 273 100.0000000 70.32150000 100.0000000 75.77310000 61.45180000 102.4810000 274 57.05340000 10.24880000 17.93840000 12.65460000 6.830390000 2.813580000 275 81.57000000 0.000000000 14.12310000 26.59130000 13.68040000 2.517210000 276 100.0000000 100.0000000 53.18250000 81.49750000 94.58040000 37.55820000 277 23.05960000 26.79320000 0.000000000 3.611640000 4.793350000 0.734901000 278 34.13740000 29.37270000 0.000000000 6.296380000 6.834130000 0.987346000 279 32.55640000 80.25540000 32.30620000 27.04300000 46.49410000 15.43350000 280 58.17970000 100.0000000 36.82360000 50.29410000 78.78240000 23.07030000 281 83.54270000 100.0000000 54.40440000 68.25880000 87.72880000 38.14210000 282 89.27070000 100.0000000 66.01880000 75.12900000 90.98060000 51.56490000 283 66.72690000 72.46480000 50.02420000 38.48400000 45.52900000 27.38440000 284 100.0000000 87.27330000 56.80130000 72.94790000 76.35770000 38.16730000 285 57.75510000 51.51830000 31.22700000 22.04240000 23.54810000 10.70030000 286 100.0000000 53.93300000 31.98570000 51.90720000 40.24400000 12.74600000 287 100.0000000 64.63140000 35.47410000 56.77890000 49.38620000 16.22570000 288 100.0000000 67.54200000 48.16870000 59.94480000 52.88140000 26.02760000 289 50.82600000 34.81090000 23.64250000 13.57790000 12.12570000 5.592940000 290 74.50760000 34.78060000 23.70110000 25.85550000 18.44470000 6.187360000 291 74.80590000 60.99490000 100.0000000 51.88550000 42.56120000 100.0930000 292 75.51760000 71.74190000 100.0000000 57.51420000 53.13900000 101.8380000 293 0.000000000 70.77200000 33.60510000 18.35810000 34.09410000 14.21170000 294 0.000000000 85.54980000 37.24240000 27.42510000 51.56380000 19.28640000 295 0.000000000 100.0000000 38.83460000 38.01200000 72.42180000 23.79400000 296 0.000000000 100.0000000 53.37790000 40.29550000 73.33530000 35.81970000 297 0.000000000 23.42150000 12.51660000 1.655870000 3.012900000 1.474050000 298 0.000000000 33.74690000 14.29130000 3.530000000 6.660170000 2.411030000 299 76.51200000 42.82270000 64.60180000 35.33030000 25.63780000 39.28060000 300 90.95650000 61.21350000 65.16050000 52.66620000 44.37710000 42.67610000 301 35.83790000 17.90660000 19.48910000 5.626100000 4.051600000 3.080030000 302 51.74140000 23.38280000 26.49130000 12.11790000 8.307800000 6.060970000 303 86.42750000 51.87350000 84.87650000 50.94940000 37.34610000 70.49200000 304 100.0000000 57.73610000 100.0000000 69.97250000 49.84980000 100.5470000 305 0.000000000 45.49680000 16.16890000 6.655130000 12.78600000 3.837800000 306 15.40400000 54.88520000 32.03670000 11.70890000 20.05580000 10.99450000 307 25.43920000 100.0000000 91.44970000 52.61790000 78.49930000 90.10720000 308 33.60700000 100.0000000 100.0000000 57.55550000 80.67260000 107.1510000 309 0.000000000 35.99710000 66.56310000 11.15450000 10.51070000 40.09540000 310 0.000000000 37.62620000 83.49760000 16.30660000 13.19000000 65.32080000 311 25.70480000 0.000000000 22.66030000 2.768260000 1.347470000 3.728610000 312 100.0000000 0.000000000 25.12220000 42.10360000 21.60570000 6.486400000 313 100.0000000 0.000000000 34.27690000 42.95180000 21.94500000 10.95330000 314 100.0000000 0.000000000 43.47890000 44.12900000 22.41590000 17.15240000 315 16.94390000 0.000000000 19.64370000 1.334900000 0.630008000 2.691180000 316 15.27790000 8.502690000 21.40190000 1.428370000 0.901001000 3.286270000 317 11.55950000 25.56510000 33.91570000 3.813350000 4.416590000 9.425510000 318 0.000000000 53.56840000 44.48770000 12.10100000 19.33940000 19.03010000 319 0.000000000 65.37960000 51.20780000 18.18600000 29.74650000 26.49600000 320 0.000000000 82.14170000 58.76390000 28.80570000 48.64440000 37.25950000 321 0.000000000 100.0000000 65.27270000 42.82100000 74.34550000 49.11920000 322 17.92590000 21.10810000 13.36620000 2.325500000 2.908900000 1.570930000 323 24.55140000 17.89220000 17.91850000 3.103020000 2.758380000 2.525640000 324 32.26720000 35.31460000 82.87670000 18.99400000 13.79320000 64.25970000 325 20.95070000 32.28680000 39.12180000 6.593070000 7.552180000 13.12150000 326 37.29560000 37.04950000 52.32510000 13.08390000 12.22260000 24.43800000 327 46.70300000 100.0000000 79.55160000 54.40020000 79.87020000 69.75730000 328 56.97890000 100.0000000 100.0000000 65.77650000 84.91080000 107.5360000 329 0.000000000 43.67700000 24.89290000 6.631510000 11.90730000 6.393010000 330 0.000000000 70.38840000 45.80690000 19.76090000 34.33750000 22.57910000 331 49.68160000 69.57050000 48.97210000 28.70950000 38.26910000 25.55620000 332 100.0000000 70.42320000 68.15070000 65.54230000 57.44310000 48.34500000 333 53.40590000 35.08430000 32.46350000 15.47310000 13.10500000 9.683100000 334 71.03330000 33.87260000 31.11420000 24.12880000 17.18840000 9.304860000 335 100.0000000 53.27580000 42.16010000 52.89220000 40.24650000 19.14000000 336 100.0000000 77.17180000 53.54310000 66.03140000 63.53800000 32.73470000 337 100.0000000 21.12680000 0.000000000 42.40940000 23.60170000 2.320910000 338 100.0000000 21.04540000 18.88240000 42.86120000 23.76660000 4.749060000 339 100.0000000 21.68090000 40.48210000 44.94840000 24.72710000 15.35320000 340 100.0000000 19.02560000 51.30270000 46.32770000 24.78350000 24.14390000 341 51.58180000 24.09540000 0.000000000 11.18010000 8.084860000 0.971428000 342 71.14940000 23.40830000 0.000000000 20.97430000 12.99100000 1.402330000 343 84.52920000 36.02010000 0.000000000 32.28080000 22.26150000 2.595950000 344 100.0000000 36.08740000 0.000000000 45.03940000 28.86210000 3.197710000 345 100.0000000 73.56880000 0.000000000 59.44360000 57.67260000 7.999690000 346 100.0000000 86.17350000 0.000000000 67.01580000 72.81800000 10.52400000 347 15.10070000 15.10070000 15.10070000 1.487190000 1.564710000 1.704060000 348 10.08490000 10.08490000 10.08490000 0.612056000 0.643959000 0.701309000 349 0.000000000 11.29030000 0.000000000 0.295161000 0.590365000 0.098399100 350 11.29030000 11.29030000 11.29030000 0.784561000 0.825456000 0.898969000 351 40.36230000 32.79050000 25.84320000 9.606860000 9.417190000 6.137270000 352 47.73890000 38.56910000 47.42830000 16.01010000 14.38120000 20.27580000 353 47.51700000 39.87250000 62.61730000 19.20860000 16.18500000 35.90530000 354 59.89720000 62.95070000 100.0000000 44.33070000 39.95280000 99.98780000 355 65.58440000 75.65990000 100.0000000 53.72090000 54.35600000 102.2730000 356 100.0000000 80.84430000 100.0000000 81.68940000 73.28520000 104.4530000 357 45.74350000 22.67340000 29.48030000 9.981640000 7.034360000 7.278390000 358 53.92080000 28.84010000 42.45540000 15.66620000 11.20620000 15.71520000 359 75.30950000 29.37450000 44.14200000 27.50940000 17.42540000 17.57770000 360 38.12510000 41.34480000 22.11150000 10.72600000 13.06440000 5.381190000 361 37.85270000 75.21170000 41.88290000 26.64260000 41.80040000 20.61920000 362 44.94770000 100.0000000 44.47740000 45.90030000 76.39790000 28.25450000 363 27.82910000 42.06700000 60.86510000 13.85740000 14.35010000 33.78830000 364 45.53960000 54.98260000 60.91670000 22.97550000 25.38920000 35.49780000 365 50.84600000 73.25150000 74.56890000 36.81720000 44.65890000 56.30190000 366 58.24590000 83.01470000 75.60540000 46.06580000 57.87310000 59.89470000 367 41.79670000 60.83140000 53.76490000 22.65020000 28.93640000 28.56060000 368 52.81550000 100.0000000 57.36450000 51.20410000 78.86900000 40.39600000 369 52.66790000 100.0000000 69.15840000 53.84640000 79.91880000 54.63510000 370 63.00490000 100.0000000 83.41090000 62.80050000 84.06240000 76.40560000 371 28.23840000 0.000000000 17.02260000 2.923680000 1.464790000 2.055330000 372 44.93150000 13.47710000 100.0000000 25.58450000 11.75150000 95.53220000 373 56.74050000 24.06330000 100.0000000 31.46820000 16.45240000 96.12950000 374 70.66040000 33.59710000 100.0000000 40.51140000 23.62180000 97.03690000 375 86.98590000 44.71320000 100.0000000 54.48830000 35.04640000 98.50550000 376 23.51830000 10.56320000 76.16640000 11.88310000 5.358990000 52.39810000 377 38.74230000 20.56940000 76.20250000 16.15720000 8.821790000 52.89550000 378 59.54810000 39.57380000 75.90410000 27.68750000 20.04860000 54.00770000 379 72.45280000 58.73980000 76.83110000 41.50840000 36.70560000 57.89050000 380 93.37350000 93.37350000 93.37350000 81.74250000 86.00330000 93.66260000 381 95.52850000 95.52850000 95.52850000 85.94890000 90.42900000 98.48230000 382 97.73660000 97.73660000 97.73660000 90.37880000 95.08980000 103.5580000 383 0.000000000 15.57160000 35.87560000 2.492600000 1.954910000 10.17380000 384 0.000000000 19.86960000 35.08170000 2.826180000 2.767670000 9.836340000 385 27.00260000 20.61760000 50.36790000 7.420640000 5.011740000 21.51350000 386 26.97610000 29.77110000 61.05270000 10.89920000 8.610580000 33.05190000 387 41.67990000 28.86190000 62.91330000 14.85750000 10.35940000 35.36250000 388 45.94140000 77.64390000 71.80230000 36.66280000 48.32450000 53.05850000 389 47.79290000 80.80180000 83.00370000 42.48890000 53.73860000 70.94300000 390 46.83360000 84.04540000 100.0000000 50.22460000 60.02910000 103.5520000 391 0.000000000 21.06240000 64.94430000 8.148840000 5.120820000 37.17600000 392 0.000000000 29.32450000 67.53760000 10.02210000 7.862490000 40.89930000 393 0.000000000 48.99920000 72.75430000 16.41530000 18.48380000 49.70770000 394 100.0000000 49.20250000 74.82600000 58.29300000 40.10810000 54.66890000 395 100.0000000 64.00690000 80.14890000 65.73690000 52.50670000 64.82720000 396 57.06540000 42.30960000 47.42200000 20.90060000 18.37720000 20.78400000 397 62.55650000 48.61410000 48.63840000 25.71670000 23.69730000 22.60750000 398 22.94690000 22.94690000 22.94690000 3.732700000 3.927270000 4.277020000 399 25.02750000 20.22760000 23.59470000 3.777880000 3.440350000 4.415270000 400 25.09310000 20.96920000 34.81140000 4.895900000 4.029210000 9.811340000 401 100.0000000 37.77550000 37.72810000 47.55720000 30.51260000 14.47380000 402 100.0000000 39.36850000 47.13230000 49.29280000 31.84640000 21.64230000 403 100.0000000 46.32630000 60.42730000 53.78340000 36.81210000 35.52010000 404 100.0000000 60.04890000 63.27230000 59.48270000 47.19590000 40.55120000 405 58.97390000 17.19250000 0.000000000 13.65450000 8.144180000 0.852494000 406 82.86290000 20.24720000 0.000000000 28.34100000 16.19380000 1.632350000 407 100.0000000 56.66120000 18.74620000 51.94430000 41.94590000 7.741180000 408 100.0000000 77.13630000 20.41770000 61.99010000 61.88860000 11.55330000 409 100.0000000 100.0000000 21.17330000 77.58970000 93.01710000 16.97890000 410 10.24510000 0.000000000 17.23850000 0.652821000 0.292900000 2.002950000 411 0.000000000 12.12380000 19.33590000 0.831656000 0.885062000 2.676800000 412 0.000000000 0.000000000 61.88120000 6.281580000 2.512790000 33.08000000 413 42.03990000 0.000000000 85.33520000 18.86810000 8.256090000 67.35420000 414 57.02950000 0.000000000 100.0000000 30.04260000 13.40300000 95.61610000 415 78.47000000 0.000000000 100.0000000 42.24540000 19.69390000 96.18730000 416 100.0000000 0.000000000 100.0000000 59.28850000 28.48010000 96.98520000 417 100.0000000 24.20990000 100.0000000 60.86840000 31.64020000 97.51190000 418 37.22360000 0.000000000 35.69940000 6.566480000 3.168800000 10.08650000 419 46.36570000 0.000000000 50.64270000 11.64910000 5.538560000 21.64440000 420 57.03430000 0.000000000 64.07960000 18.77760000 8.896980000 36.28130000 421 100.0000000 0.000000000 74.74930000 50.75570000 25.06680000 52.05020000 422 100.0000000 36.75840000 74.33500000 54.59820000 32.93740000 52.76080000 423 100.0000000 41.64100000 86.47080000 59.55680000 36.91970000 72.71190000 424 100.0000000 42.18430000 100.0000000 64.64630000 39.19660000 98.77130000 425 63.15820000 0.000000000 28.23930000 16.12970000 8.186080000 6.594990000 426 74.75620000 0.000000000 36.88390000 23.76130000 12.01720000 11.61930000 427 85.46240000 0.000000000 35.39810000 31.03080000 15.78490000 11.05120000 428 0.000000000 17.76410000 50.28520000 4.779700000 3.191680000 21.22580000 429 0.000000000 17.81970000 86.07750000 13.78560000 6.803070000 68.62520000 430 0.000000000 16.51100000 100.0000000 18.73090000 8.582350000 95.28160000 431 0.000000000 35.62870000 100.0000000 21.74550000 14.61200000 96.28660000 432 41.47440000 38.77230000 100.0000000 28.45350000 19.19150000 96.81710000 433 47.94840000 48.96450000 100.0000000 33.67560000 26.31570000 97.91700000 434 62.63830000 53.19290000 100.0000000 41.71230000 32.66470000 98.71900000 435 19.99000000 35.89980000 32.71870000 6.500080000 8.750990000 9.453920000 436 25.64450000 100.0000000 45.32760000 40.99300000 73.85320000 28.69900000 437 66.12700000 100.0000000 50.96560000 56.46310000 81.72080000 34.28600000 438 44.36640000 53.42320000 28.54190000 17.05640000 22.03280000 9.357920000 439 48.49150000 65.47570000 33.87810000 24.15380000 33.17620000 13.88350000 440 59.17360000 73.79380000 78.23160000 41.85410000 47.57180000 62.11740000 441 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 442 2.941180000 0.000000000 0.000000000 0.017670400 0.009109590 0.000827230 443 8.909850000 8.909850000 8.909850000 0.466089000 0.490383000 0.534056000 444 44.40240000 84.74530000 0.000000000 31.76340000 53.26340000 8.607160000 445 44.03720000 100.0000000 0.000000000 42.54910000 75.02130000 12.23850000 446 73.93760000 100.0000000 0.000000000 56.98530000 82.46350000 12.91430000 447 86.67970000 100.0000000 0.000000000 65.87140000 87.04460000 13.33030000 448 100.0000000 100.0000000 0.000000000 76.99580000 92.77950000 13.85110000 449 100.0000000 100.0000000 66.02370000 84.23940000 95.67720000 51.99760000 450 35.78880000 15.73370000 0.000000000 4.916600000 3.443800000 0.405651000 451 41.69810000 25.61310000 0.000000000 7.811900000 6.682220000 0.878167000 452 55.59570000 34.65640000 0.000000000 14.81680000 12.80100000 1.690110000 453 84.58290000 47.60900000 0.000000000 35.52610000 28.69350000 3.666440000 454 100.0000000 50.03240000 0.000000000 49.03590000 36.85570000 4.530040000 455 100.0000000 62.38890000 0.000000000 53.90800000 46.60060000 6.154260000 456 19.76820000 43.91870000 0.000000000 7.021040000 12.31090000 2.006290000 457 26.64670000 64.35390000 39.42340000 18.14420000 29.22160000 16.90000000 458 24.80520000 66.87960000 100.0000000 34.73410000 37.73770000 100.0660000 459 44.74760000 92.09100000 100.0000000 54.91630000 70.51410000 105.3290000 460 78.54690000 92.35400000 100.0000000 72.31640000 79.76290000 106.1970000 461 89.83530000 91.55390000 100.0000000 80.07780000 82.91950000 106.3980000 462 89.83820000 100.0000000 100.0000000 86.38750000 95.53640000 108.5000000 463 100.0000000 100.0000000 100.0000000 95.04580000 100.0000000 108.9060000 464 30.61980000 36.57930000 0.000000000 6.970120000 9.406820000 1.448420000 465 32.22310000 46.29290000 0.000000000 9.989990000 14.90840000 2.351210000 466 48.54030000 50.96630000 11.69310000 16.69550000 20.64520000 3.948760000 467 48.08970000 56.97300000 0.000000000 18.61860000 25.00270000 3.844950000 468 57.42180000 57.83970000 11.96540000 23.07030000 27.79820000 5.037330000 469 83.20730000 73.44680000 0.000000000 45.66340000 50.47010000 7.335580000 470 52.45290000 47.03090000 18.35860000 17.21690000 18.92930000 5.021450000 471 55.73800000 49.73010000 38.12780000 21.26300000 22.13460000 14.50220000 472 60.26610000 53.12200000 54.81130000 27.24680000 26.69770000 28.93280000 473 11.27770000 6.767730000 15.84690000 0.749378000 0.492244000 1.701600000 474 0.000000000 8.603320000 12.70520000 0.355521000 0.402004000 1.071380000 475 0.000000000 10.11480000 40.20410000 2.664990000 1.436910000 12.89110000 476 0.000000000 12.55950000 55.24120000 5.267010000 2.703920000 25.89670000 477 21.39250000 33.55170000 87.90110000 18.21900000 12.63000000 72.72660000 478 26.32970000 47.19720000 100.0000000 27.10010000 22.06840000 97.44370000 479 50.08370000 55.35810000 68.38280000 26.57820000 27.25830000 44.87740000 480 85.07940000 54.25090000 68.95970000 46.19270000 36.72490000 46.43600000 481 100.0000000 92.72810000 91.14350000 86.24540000 87.72640000 89.54530000 482 100.0000000 100.0000000 100.0000000 95.04580000 100.0000000 108.9060000 483 11.28200000 27.83220000 24.77960000 3.326090000 4.805010000 5.151920000 484 0.000000000 26.38200000 38.65840000 4.140730000 4.710250000 12.39150000 485 0.000000000 24.79990000 51.26250000 5.817880000 4.992810000 22.42090000 486 13.04630000 27.16830000 63.48920000 9.149820000 6.971790000 35.70050000 487 0.000000000 44.00680000 41.68240000 8.514450000 12.81490000 15.83310000 488 29.05200000 83.18820000 46.05850000 29.85610000 50.42700000 25.35870000 489 46.75420000 87.43330000 52.95160000 38.81980000 59.00840000 32.71630000 490 47.64710000 87.38550000 82.90270000 46.60870000 62.11100000 72.17410000 491 0.000000000 31.64850000 21.24880000 3.446540000 5.935760000 4.101780000 492 0.000000000 58.77640000 18.51730000 11.55430000 22.40260000 6.033710000 493 45.54840000 71.56150000 15.20880000 24.73240000 38.14960000 7.564200000 494 49.77640000 91.76190000 17.57810000 38.88360000 63.94070000 12.36050000 495 23.13920000 56.89240000 0.000000000 11.99320000 21.53930000 3.525550000 496 24.88550000 100.0000000 0.000000000 37.69310000 72.51780000 12.01120000 497 74.45340000 100.0000000 22.42230000 57.98600000 82.90160000 16.47760000 498 87.13760000 100.0000000 24.13940000 67.01480000 87.54250000 17.51980000 499 28.24970000 33.96910000 28.37460000 7.016560000 8.426690000 7.183570000 500 40.83400000 32.94620000 31.87820000 10.32420000 9.772500000 8.998580000 501 100.0000000 32.93960000 52.07860000 48.64700000 29.19920000 25.60570000 502 100.0000000 37.20870000 63.52700000 51.95890000 32.05350000 38.33160000 503 100.0000000 57.13860000 69.88230000 59.88830000 45.42910000 48.63360000 504 38.55020000 21.43610000 36.89510000 8.291930000 5.836890000 11.24850000 505 59.73370000 26.33850000 35.94760000 17.08280000 11.41010000 11.27390000 506 64.42260000 24.89420000 42.18150000 20.06360000 12.52490000 15.53480000 507 20.40940000 12.95690000 10.43770000 1.776510000 1.494530000 0.851985000 508 18.15310000 19.76930000 4.327400000 1.997210000 2.529660000 0.477815000 509 15.82200000 24.03100000 26.11490000 3.211410000 3.854370000 5.512790000 510 16.84860000 68.86050000 37.15060000 18.60700000 32.72530000 16.05640000 511 36.11830000 69.92240000 52.33110000 25.01620000 36.56360000 28.51330000 512 84.02830000 79.77710000 57.78090000 55.28350000 60.17520000 37.01970000 513 100.0000000 82.61000000 67.17900000 72.25480000 71.25550000 49.39170000 514 61.04100000 71.12810000 25.12030000 31.69460000 41.33450000 10.84220000 515 68.58690000 87.43940000 23.39920000 45.35280000 62.81200000 13.61280000 516 88.46170000 89.84230000 41.40930000 62.34150000 73.78330000 24.56680000 517 87.92100000 100.0000000 42.21950000 69.53750000 88.62160000 27.64420000 518 62.40780000 74.11230000 38.27490000 35.30750000 45.41860000 18.35300000 519 64.63950000 92.82480000 40.04880000 48.56500000 69.82570000 23.56470000 520 72.65580000 94.01150000 54.77130000 56.44640000 74.88960000 36.65570000 521 19.65700000 30.38680000 9.637400000 3.861770000 5.844960000 1.476080000 522 18.01450000 32.87220000 0.000000000 4.046900000 6.682290000 1.076570000 523 81.31420000 41.81490000 18.22190000 31.84820000 24.17140000 5.225230000 524 86.69920000 59.27730000 20.18930000 41.98520000 38.39070000 8.001700000 525 100.0000000 67.48680000 21.58350000 56.91640000 51.62650000 10.21320000 526 20.86420000 17.95120000 9.943050000 2.244810000 2.359220000 0.927664000 527 22.75300000 20.64220000 0.000000000 2.702270000 3.044970000 0.445348000 528 32.28610000 31.02060000 9.641560000 6.262250000 7.262050000 1.623650000 529 33.81240000 45.31770000 13.41980000 10.28880000 14.59090000 3.416180000 530 32.64550000 53.64630000 9.055120000 12.69810000 20.03080000 3.678000000 531 16.38040000 5.029340000 10.35840000 0.944802000 0.546849000 0.701951000 532 17.12060000 0.000000000 13.06010000 1.055670000 0.520523000 1.120610000 533 16.12000000 7.635410000 15.99720000 1.190450000 0.762066000 1.764980000 534 14.83030000 12.22600000 17.37040000 1.356050000 1.176750000 2.169970000 535 20.51510000 0.000000000 55.24110000 6.159820000 2.610300000 25.83150000 536 74.18930000 22.33360000 77.55190000 33.03000000 17.80030000 55.78780000 537 85.03970000 22.49630000 90.64660000 44.76360000 23.39290000 78.39140000 538 36.66110000 0.000000000 25.40800000 5.425220000 2.694420000 4.883080000 539 83.11890000 0.000000000 23.41580000 28.20140000 14.45310000 5.188420000 540 91.53260000 45.31090000 27.02380000 41.23270000 30.44820000 9.028370000 541 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 542 0.000000000 53.78440000 36.34230000 11.09020000 19.06390000 13.30940000 543 38.99700000 65.36770000 40.87710000 21.76040000 31.76790000 18.21350000 544 52.79210000 66.72470000 56.35360000 29.92000000 36.63860000 32.29750000 545 52.71670000 57.01310000 51.25340000 24.63050000 27.64650000 25.79370000 546 60.92910000 59.45420000 51.23240000 29.41270000 31.60250000 26.28570000 547 67.88940000 63.26750000 59.15770000 36.35020000 37.47930000 35.14170000 548 76.06570000 70.33510000 61.42700000 45.26720000 47.10640000 39.10400000 549 36.00080000 22.01870000 17.04370000 6.011450000 4.960370000 2.572590000 550 43.59980000 36.13760000 17.68790000 10.85680000 11.21110000 3.688030000 551 45.43090000 43.84860000 33.04630000 14.68820000 16.05050000 10.61100000 552 46.88420000 78.69230000 33.58550000 30.54370000 46.89790000 16.02990000 553 17.18100000 93.68350000 15.55630000 32.13600000 62.52190000 11.95500000 554 17.97250000 92.65330000 55.58420000 36.14050000 62.94330000 36.24890000 555 21.30290000 92.87220000 100.0000000 49.81580000 68.71500000 105.2500000 556 24.17560000 49.33120000 53.00780000 13.84480000 17.84360000 26.14120000 557 69.11040000 57.15880000 54.24930000 33.45210000 32.21730000 29.10610000 558 72.34530000 56.41780000 59.02930000 36.05290000 33.00840000 34.15220000 559 35.10160000 49.96010000 34.99290000 13.69030000 18.39010000 12.22680000 560 42.17870000 49.53100000 33.34740000 15.41680000 19.08410000 11.32510000 561 53.43340000 59.86010000 42.54300000 24.71510000 29.59650000 18.85340000 562 74.57350000 63.26860000 55.49540000 39.64090000 39.26270000 31.40230000 563 86.98430000 70.00270000 56.86280000 51.88340000 50.37500000 34.32700000 564 94.08190000 73.57610000 72.48340000 63.16430000 58.56940000 54.59760000 565 21.01220000 12.04690000 17.42020000 2.061480000 1.523470000 2.212440000 566 67.23400000 0.000000000 13.82860000 17.45670000 8.972560000 2.031960000 567 100.0000000 0.000000000 14.56500000 41.49930000 21.36400000 3.304320000 568 100.0000000 45.15130000 18.09440000 47.88060000 33.87210000 6.218590000 569 100.0000000 89.28010000 19.59460000 69.60460000 77.19470000 13.85780000 570 100.0000000 100.0000000 38.09140000 79.15660000 93.64390000 25.23050000 571 16.27190000 17.98520000 22.17040000 2.239440000 2.298630000 3.770440000 572 14.01670000 45.18920000 62.41860000 13.18320000 15.31070000 35.81880000 573 18.99200000 51.11520000 73.09580000 18.30220000 20.52320000 50.48850000 574 19.29350000 57.83830000 92.59640000 27.07260000 28.11990000 83.88880000 575 47.13690000 59.24230000 91.46800000 34.02980000 32.61580000 82.26460000 576 46.88860000 75.85580000 100.0000000 45.31970000 50.18880000 101.9110000 577 13.27060000 40.50610000 24.58790000 6.211070000 10.38160000 6.001820000 578 11.90310000 47.30160000 23.21880000 8.001850000 14.27320000 6.146540000 579 0.000000000 71.81600000 21.39940000 17.87280000 34.77550000 8.957360000 580 9.889460000 25.83390000 9.706380000 2.183620000 3.818930000 1.182160000 581 66.03030000 25.08600000 9.544040000 18.36440000 11.99180000 1.886680000 582 68.38000000 33.12260000 0.000000000 21.02410000 15.51190000 1.886280000 583 81.43930000 38.47530000 43.58590000 33.53690000 23.45050000 17.99240000 584 91.13970000 43.87750000 61.26930000 45.61520000 31.47960000 35.88670000 585 33.51640000 46.49130000 23.12900000 11.08230000 15.48040000 6.184890000 586 41.62470000 65.55930000 22.50950000 20.80860000 31.62480000 8.569430000 587 39.09880000 29.02660000 9.436070000 7.683660000 7.445380000 1.558600000 588 47.65710000 35.45630000 10.02090000 11.85140000 11.52470000 2.200800000 589 72.18710000 56.16390000 12.81340000 30.38980000 30.57140000 5.331130000 590 80.37700000 58.44370000 65.95180000 43.70790000 37.99040000 42.90780000 591 88.99580000 66.08200000 77.95220000 56.72700000 49.38430000 61.25130000 592 91.78460000 73.08740000 89.61560000 66.27960000 59.17130000 82.26950000 593 24.47440000 46.03020000 28.64020000 9.511440000 14.40700000 8.329140000 594 22.24320000 69.76370000 29.14370000 18.90990000 33.65850000 11.78620000 595 74.92220000 89.93040000 46.43160000 53.50810000 69.23410000 28.05050000 596 82.95900000 88.94490000 59.03810000 60.64430000 71.63820000 40.32250000 597 100.0000000 91.52230000 81.48580000 82.17210000 84.72180000 72.33400000 598 45.03450000 20.66470000 52.65840000 12.65480000 7.670970000 23.90220000 599 53.72920000 24.35500000 81.69030000 23.68950000 13.25290000 61.95400000 600 27.83380000 8.828420000 31.77830000 4.098730000 2.200590000 7.812470000 601 40.60120000 8.930590000 44.13610000 8.844300000 4.476090000 16.05720000 602 57.20970000 7.029410000 56.08440000 17.23990000 8.457820000 27.24550000 603 67.41690000 10.07980000 66.29390000 24.86620000 12.31650000 39.37840000 604 83.71920000 0.000000000 70.83600000 36.35410000 17.76490000 45.83560000 605 78.52330000 20.52290000 61.06100000 31.43010000 17.12950000 33.62400000 606 100.0000000 21.23380000 62.69100000 48.88630000 26.21350000 36.36480000 607 85.00120000 20.52480000 42.07850000 32.63490000 18.14490000 15.88120000 608 91.13290000 64.17060000 53.73370000 51.70560000 46.13490000 30.31840000 609 100.0000000 73.08180000 61.08780000 65.28550000 59.58720000 40.06610000 610 26.15040000 14.93200000 9.012800000 2.795420000 2.241010000 0.761094000 611 28.26600000 12.03120000 0.000000000 2.901060000 1.999520000 0.233081000 612 43.58280000 13.49900000 0.000000000 7.075830000 4.296910000 0.456543000 613 43.09630000 43.43380000 81.19570000 23.60600000 19.33270000 62.32750000 614 60.56650000 83.41310000 83.83020000 49.93220000 59.95210000 73.13390000 615 60.93400000 83.22900000 90.50130000 52.24530000 60.71250000 84.93190000 616 73.41490000 90.51630000 92.78380000 64.92900000 74.34410000 91.17210000 617 72.72810000 100.0000000 92.15440000 71.31040000 88.10660000 92.30020000 618 24.05490000 40.86220000 44.31740000 9.806520000 12.12370000 17.62450000 619 34.20180000 39.96800000 61.33950000 14.81510000 13.99010000 34.21510000 620 50.52100000 45.41190000 60.22910000 21.40660000 19.70660000 33.69940000 621 54.01600000 47.19750000 77.55110000 27.82110000 23.33320000 57.12900000 622 20.08960000 19.16670000 27.73920000 3.229870000 2.944120000 6.036910000 623 17.10040000 79.29850000 27.88650000 23.40630000 43.81530000 12.92870000 624 47.49680000 79.54390000 56.12300000 34.70430000 49.39740000 34.26750000 625 49.89310000 81.19930000 65.98360000 38.78950000 52.74040000 46.05410000 626 72.75430000 42.32810000 32.11090000 27.37040000 21.95290000 10.57490000 627 82.87780000 46.15940000 30.98950000 35.18930000 27.67900000 10.68310000 628 65.25250000 35.72640000 21.69030000 20.47140000 16.00090000 5.292600000 629 72.08460000 41.91780000 20.33430000 25.90260000 21.13510000 5.562930000 630 82.65980000 65.20770000 30.75010000 42.43990000 42.45230000 13.03090000 631 85.57390000 80.61410000 49.40870000 55.36550000 61.14920000 28.95590000 632 9.743040000 18.03620000 16.55700000 1.418900000 1.919200000 2.108330000 633 0.000000000 23.28540000 20.45090000 2.000530000 3.120840000 3.381330000 634 0.000000000 57.74660000 55.13530000 15.56170000 23.32770000 29.22700000 635 0.000000000 57.39860000 71.30380000 19.12620000 24.52770000 48.69510000 636 0.000000000 72.90340000 85.56570000 30.65620000 40.81750000 73.41520000 637 0.000000000 82.17610000 86.25440000 36.25960000 51.66040000 76.40720000 638 43.25030000 90.55320000 92.11920000 50.34300000 66.89050000 89.24350000 639 64.01310000 92.11460000 100.0000000 63.35930000 74.89160000 105.7290000 640 37.18560000 29.46270000 52.97830000 11.57940000 9.066310000 24.53770000 641 53.80240000 31.14780000 77.38360000 23.57090000 15.04760000 55.49690000 642 57.91760000 38.96520000 100.0000000 34.95670000 22.61660000 97.13550000 643 17.27420000 0.000000000 39.70910000 3.235130000 1.394310000 12.51000000 644 22.49960000 9.290780000 40.04310000 4.155040000 2.148900000 12.83790000 645 26.37300000 50.72010000 39.38780000 12.56040000 18.13560000 15.03020000 646 28.82490000 54.96190000 52.78630000 16.69010000 22.32640000 26.64180000 647 39.54670000 56.26410000 55.18790000 20.33880000 24.90710000 29.33380000 648 43.21670000 57.96170000 73.49440000 26.46210000 28.58120000 52.18530000 649 0.000000000 12.92710000 12.89570000 0.597116000 0.874942000 1.183630000 650 56.85900000 33.03400000 9.660840000 15.14900000 12.44340000 2.157920000 651 69.44780000 42.66730000 0.000000000 23.98960000 20.52330000 2.697330000 652 79.21360000 54.23070000 0.000000000 34.01170000 31.35460000 4.259880000 653 86.49030000 64.75280000 0.000000000 43.71890000 42.95090000 5.986690000 654 92.79830000 65.60920000 11.23070000 49.28740000 46.40300000 7.131530000 655 29.17280000 18.80550000 0.000000000 3.652300000 3.228650000 0.430743000 656 28.51560000 37.41760000 51.03910000 10.83990000 11.22380000 23.15090000 657 36.41860000 49.54730000 58.91270000 17.74260000 19.82650000 32.44390000 658 65.21250000 52.54370000 65.49630000 31.90670000 28.51950000 41.12850000 659 73.16400000 64.87650000 65.76840000 41.73200000 41.18280000 43.39670000 660 59.45370000 27.83610000 22.47730000 15.96720000 11.34160000 4.898290000 661 75.84910000 71.31640000 19.93170000 39.97560000 45.78980000 9.457690000 662 83.17420000 71.03910000 26.41190000 45.32310000 48.27970000 11.99310000 663 34.87770000 0.000000000 55.46690000 9.004920000 4.071940000 26.19480000 664 34.53240000 9.466650000 64.63450000 11.09190000 5.217230000 36.65660000 665 50.89930000 12.50310000 82.43510000 21.51130000 10.27490000 62.71680000 666 69.01010000 16.04420000 100.0000000 36.92980000 17.90260000 96.12170000 667 0.000000000 9.480420000 28.66380000 1.357200000 0.864532000 6.155810000 668 9.978890000 18.24330000 31.29340000 2.509790000 2.390770000 7.680040000 669 10.13370000 18.70570000 45.06590000 4.291940000 3.181490000 16.78180000 670 27.04720000 16.36700000 65.57660000 10.12910000 5.389160000 37.91210000 671 45.82180000 36.82510000 79.19860000 22.19350000 16.09280000 58.58740000 672 58.23390000 50.20080000 90.00280000 34.72970000 27.91250000 78.60670000 673 0.000000000 84.93780000 21.55530000 25.58920000 50.19360000 11.57800000 674 0.000000000 100.0000000 21.82760000 36.39240000 71.77390000 15.26480000 675 25.66410000 100.0000000 27.61850000 38.89430000 73.01400000 17.62870000 676 80.52120000 31.17720000 31.83290000 29.81980000 19.29570000 9.785600000 677 91.70420000 31.54770000 37.10210000 38.95430000 24.04510000 13.27810000 678 90.23710000 34.52550000 63.04480000 42.89190000 26.47590000 37.15320000 679 91.56160000 46.34520000 78.42920000 51.13790000 34.92380000 59.49360000 680 91.24330000 100.0000000 82.22860000 81.20660000 93.59460000 75.31320000 681 31.82140000 38.19640000 36.47830000 9.595450000 11.11360000 11.93780000 682 30.55530000 38.20240000 41.25570000 9.923680000 11.21440000 15.14100000 683 30.25970000 89.50930000 67.57440000 38.62180000 60.63340000 49.62600000 684 48.70020000 89.08840000 75.88430000 46.04630000 63.77610000 61.45090000 685 67.93730000 92.74280000 78.81670000 58.61360000 73.96210000 67.23910000 686 25.48940000 42.06780000 32.45230000 8.885100000 12.31120000 9.870990000 687 37.70120000 57.75460000 32.00750000 16.99160000 24.46230000 11.55120000 688 54.84670000 60.02530000 34.01680000 24.32900000 29.62550000 13.26790000 689 58.19120000 82.06230000 42.48220000 38.43300000 53.86470000 22.76950000 690 23.85990000 31.32110000 19.31260000 5.033360000 6.671320000 3.565510000 691 28.86210000 37.43070000 19.10200000 7.274590000 9.810820000 3.992810000 692 27.75920000 53.29410000 17.48600000 11.81090000 19.34490000 5.155470000 693 25.62090000 58.69930000 26.11720000 14.08600000 23.60240000 8.752490000 694 83.31550000 70.96980000 65.40290000 51.51870000 50.71220000 44.26190000 695 84.98240000 81.82770000 75.02310000 61.43110000 64.71440000 59.54310000 696 21.85560000 19.64770000 16.07330000 2.777130000 2.876160000 2.107040000 697 19.78060000 23.52310000 36.12960000 4.575010000 4.338060000 10.67930000 698 19.55040000 28.37630000 46.99610000 6.808710000 6.439830000 18.86210000 699 21.27100000 53.84450000 46.30250000 13.85420000 20.36390000 20.60010000 700 32.63660000 75.84370000 49.32390000 26.79500000 42.27290000 26.74210000 701 9.296120000 17.96540000 10.41760000 1.166640000 1.804110000 0.941093000 702 11.62640000 19.93890000 6.612350000 1.440020000 2.267690000 0.602626000 703 36.32110000 81.79470000 15.14410000 27.71460000 48.37750000 9.367210000 704 43.83890000 100.0000000 24.00490000 43.26480000 75.29980000 16.35750000 705 20.14560000 42.31670000 10.09510000 6.727700000 11.46420000 2.468930000 706 27.20660000 84.78290000 0.000000000 27.22650000 50.96050000 8.401720000 707 58.23280000 84.99840000 53.24140000 42.07940000 58.30310000 32.69060000 708 79.22280000 85.91870000 72.24270000 59.14830000 67.49390000 56.19210000 709 43.77480000 27.74120000 35.68380000 10.70640000 8.467620000 10.88170000 710 69.12360000 39.13290000 39.93590000 25.24650000 19.48200000 14.99780000 711 78.84320000 48.09370000 45.08620000 34.72830000 28.15450000 20.01460000 712 41.04650000 25.09110000 26.08910000 8.467680000 6.794180000 5.792550000 713 43.67160000 29.00900000 24.65860000 9.850370000 8.473420000 5.469120000 714 57.24700000 38.03990000 50.98100000 20.46340000 16.41200000 23.59130000 715 63.21830000 37.94490000 60.00190000 25.15640000 18.59240000 33.02990000 716 25.02050000 9.456150000 51.08270000 6.278920000 3.057800000 21.85560000 717 71.57470000 0.000000000 73.98450000 29.06900000 13.91120000 49.92410000 718 74.65340000 11.40000000 81.66340000 33.54540000 16.40590000 61.99940000 719 86.75910000 15.62960000 100.0000000 48.82830000 23.98360000 96.66840000 720 54.72160000 14.51550000 68.32050000 19.27340000 9.795480000 41.80950000 721 100.0000000 21.96480000 74.55020000 51.97560000 27.59570000 52.18220000 722 100.0000000 23.25010000 86.64850000 55.85430000 29.41920000 71.77040000 723 100.0000000 54.99710000 87.10590000 64.16330000 45.79290000 75.29700000 724 13.66940000 22.76260000 0.000000000 1.897950000 3.026630000 0.484189000 725 19.02520000 24.63370000 10.20580000 2.833170000 3.883610000 1.225760000 726 15.39720000 24.68270000 14.63440000 2.585610000 3.749990000 1.969310000 727 56.87270000 24.90190000 10.58300000 13.73030000 9.558990000 1.798990000 728 76.07810000 35.66230000 91.63420000 41.20100000 25.01770000 80.73120000 729 22.20000000 13.94390000 100.0000000 20.02540000 8.935940000 95.28170000 730 84.66790000 31.30690000 100.0000000 49.42910000 27.52570000 97.32050000 731 37.17870000 14.04210000 28.35970000 6.286690000 3.818470000 6.325710000 732 44.66840000 21.22830000 34.86670000 9.969910000 6.691110000 10.09030000 733 58.18100000 24.62320000 46.93670000 17.59160000 11.10850000 19.14520000 734 87.83390000 36.03170000 51.04250000 38.90400000 25.20500000 24.37390000 735 52.78360000 21.37710000 35.49880000 13.16840000 8.358920000 10.61950000 736 71.03220000 20.81890000 47.61840000 24.10080000 13.70000000 19.88000000 737 80.81230000 22.41070000 55.20620000 32.03250000 17.92840000 27.38920000 738 52.50290000 15.07810000 39.55670000 12.90380000 7.209020000 13.01830000 739 89.57760000 10.90290000 45.79520000 35.88600000 18.53190000 18.66910000 740 100.0000000 22.78460000 30.10810000 43.90920000 24.54030000 9.175450000 741 100.0000000 38.96610000 28.14980000 46.84940000 30.70440000 9.281960000 742 100.0000000 76.22370000 39.79890000 63.29940000 61.57720000 21.02330000 743 100.0000000 90.10400000 47.69480000 73.21540000 79.54900000 30.06750000 744 28.89730000 61.73290000 48.87420000 18.80600000 27.64050000 23.94010000 745 34.94950000 72.69240000 60.65610000 27.82840000 39.97680000 37.75940000 746 67.47540000 75.35750000 75.46870000 46.27290000 51.22640000 58.39760000 747 77.72330000 83.28260000 76.74160000 57.68970000 64.07870000 62.18570000 748 58.11440000 65.73460000 80.46930000 37.90470000 39.34750000 64.26630000 749 68.98370000 83.47910000 80.96760000 53.60880000 62.01360000 68.61580000 750 78.24500000 90.83850000 80.48270000 64.18610000 74.77060000 69.74020000 751 39.56340000 46.68410000 46.03820000 15.33980000 17.47000000 19.74560000 752 39.04990000 70.56480000 75.26030000 31.48540000 39.77570000 56.65770000 753 45.53060000 75.69990000 85.26470000 39.40610000 47.62620000 73.74990000 754 88.27200000 80.96840000 100.0000000 71.87070000 68.33580000 104.0150000 755 30.26620000 24.27010000 61.16330000 10.68820000 7.161330000 32.91080000 756 35.56730000 32.07120000 71.66490000 15.85300000 11.52400000 46.86000000 757 20.76450000 10.52910000 30.83470000 2.910730000 1.719600000 7.294480000 758 17.50940000 14.13270000 31.85210000 2.835180000 2.011240000 7.881380000 759 14.56360000 7.749620000 33.65860000 2.371000000 1.223730000 8.739630000 760 11.98030000 21.39490000 55.96370000 6.627490000 4.622250000 26.93900000 761 10.11670000 44.89670000 90.67240000 20.96530000 18.25000000 78.70040000 762 21.24040000 55.85960000 100.0000000 29.35160000 27.79680000 98.43070000 763 0.000000000 28.64560000 82.97680000 14.26140000 9.364850000 63.82070000 764 0.000000000 26.73490000 100.0000000 20.01510000 11.15100000 95.70970000 765 26.01060000 75.66050000 100.0000000 39.54640000 47.04910000 101.6100000 766 61.90840000 10.83850000 14.10080000 14.87800000 8.042550000 2.041760000 767 67.73010000 12.90590000 9.728820000 18.00820000 9.859400000 1.517110000 768 78.12990000 27.79300000 16.50770000 26.44910000 16.77300000 3.644650000 769 89.98800000 51.64230000 21.89920000 41.69930000 33.83460000 7.686240000 770 89.15680000 77.82800000 77.90800000 63.06720000 61.89790000 63.26450000 771 88.69880000 78.68160000 90.87150000 67.40600000 64.39230000 85.52860000 772 36.59070000 27.46250000 35.52590000 8.457470000 7.240860000 10.66820000 773 35.77920000 25.55150000 42.54340000 8.836040000 6.877900000 15.30530000 774 63.92000000 66.76370000 59.89700000 35.96490000 39.69820000 36.41610000 775 75.38760000 77.54730000 59.69330000 48.39860000 54.62740000 38.41380000 776 43.72380000 44.76850000 39.69050000 15.15760000 16.60650000 14.80520000 777 79.41020000 44.54380000 50.71490000 34.93180000 26.50570000 24.53110000 778 87.81460000 51.55460000 62.11090000 45.64970000 35.16720000 37.57790000 779 46.67210000 31.37420000 43.81030000 13.45080000 10.74280000 16.77100000 780 49.12410000 34.57860000 54.79480000 16.90510000 13.29690000 26.87440000 781 68.91670000 46.60100000 69.29490000 32.91220000 25.93830000 45.50160000 782 73.75250000 47.33510000 100.0000000 46.06400000 31.91050000 98.34410000 783 20.41850000 25.08640000 68.22640000 10.74700000 7.177500000 41.62950000 784 21.26710000 54.41540000 68.34850000 18.56580000 22.59270000 44.35390000 785 21.13110000 61.43960000 81.11670000 24.99220000 29.75420000 64.13800000 786 15.39690000 72.79180000 56.53490000 23.60800000 37.97980000 33.07890000 787 30.27220000 100.0000000 58.67940000 44.32470000 75.29110000 41.49220000 788 28.89860000 100.0000000 81.94840000 50.09690000 77.56670000 73.39860000 789 51.18170000 100.0000000 90.58800000 59.73390000 82.20300000 88.84570000 790 18.35740000 43.01520000 76.09580000 16.48250000 15.65690000 54.03750000 791 25.00140000 41.99780000 84.05210000 19.57960000 16.54830000 66.72960000 792 31.41090000 59.00470000 82.87530000 26.37970000 28.85850000 66.77610000 793 29.69900000 73.19840000 86.87520000 34.10650000 42.78230000 75.89360000 794 39.54270000 82.41800000 92.00410000 43.75840000 55.52020000 87.17880000 795 26.35040000 19.46190000 14.34850000 3.425200000 3.187890000 1.757890000 796 30.81660000 24.76470000 8.940710000 4.847440000 4.954090000 1.168310000 797 51.91350000 27.95140000 17.40620000 12.30620000 9.517000000 3.211950000 798 59.66690000 39.56370000 20.68790000 18.46360000 16.36120000 5.143540000 799 67.99170000 59.36080000 20.76020000 29.57890000 32.04300000 7.607500000 800 68.37510000 59.87240000 38.66270000 31.67890000 33.25460000 16.45290000 801 81.27620000 69.01730000 41.95030000 44.63060000 46.18600000 20.56730000 802 100.0000000 71.98380000 77.93080000 69.02310000 60.14230000 62.64690000 803 26.26190000 16.58880000 22.36370000 3.536910000 2.767380000 3.858950000 804 35.04700000 17.66140000 59.01810000 10.56020000 5.962560000 30.26280000 805 58.70750000 48.69180000 68.48470000 27.97840000 24.42190000 44.39070000 806 65.89950000 50.08080000 76.87950000 34.41900000 28.17560000 56.69110000 807 65.21410000 53.50210000 86.43140000 38.24070000 31.61690000 72.74280000 808 27.06650000 27.15410000 22.24110000 5.023910000 5.532500000 4.272110000 809 37.88950000 35.31200000 21.20110000 9.098800000 10.00160000 4.573290000 810 36.49980000 38.63670000 11.15750000 9.056290000 11.20900000 2.447270000 811 42.34130000 42.95490000 0.000000000 11.80530000 14.36340000 2.150350000 812 55.47560000 52.50190000 0.000000000 19.95460000 23.15740000 3.418350000 813 76.55450000 57.38450000 37.53620000 35.54910000 33.73500000 15.60490000 814 87.12530000 56.87610000 100.0000000 58.84270000 43.59710000 99.92650000 815 23.41250000 18.87030000 92.10730000 17.67050000 8.725660000 79.71570000 816 23.75670000 26.55110000 100.0000000 21.73340000 11.99290000 95.78170000 817 23.51790000 36.81240000 100.0000000 23.73040000 16.04420000 96.45850000 818 0.000000000 15.03870000 71.23710000 9.115890000 4.533800000 45.27090000 819 13.13390000 11.44050000 84.40330000 13.21020000 5.825460000 65.59030000 820 23.40030000 0.000000000 86.73630000 14.89060000 6.151900000 69.59180000 821 30.52560000 82.59170000 85.60940000 39.33880000 53.65700000 75.51140000 822 27.57600000 14.73950000 15.45400000 3.253740000 2.430650000 1.855350000 823 46.63490000 10.61360000 10.91830000 8.100220000 4.542420000 1.175460000 824 49.99330000 27.20380000 23.22510000 11.74690000 9.002930000 4.934250000 825 74.24540000 25.05120000 22.42600000 23.80000000 14.72030000 5.119910000 826 81.09320000 42.16010000 36.91330000 33.37760000 24.91850000 13.62130000 827 58.68070000 46.17380000 39.47560000 21.64250000 20.59050000 15.08540000 828 61.35030000 76.09540000 54.40210000 38.42250000 48.37260000 32.11550000 829 66.12540000 76.02670000 62.27190000 42.54430000 50.25070000 40.84250000 830 0.000000000 85.08570000 49.59580000 28.92800000 51.68230000 28.68910000 831 10.53400000 92.01340000 63.15140000 36.63690000 62.33460000 44.53190000 832 40.94710000 28.17990000 18.25800000 8.422650000 7.568070000 3.264580000 833 100.0000000 32.40630000 14.33690000 44.49050000 27.36100000 4.257590000 834 100.0000000 51.60970000 50.96990000 53.68690000 39.59770000 26.30560000 835 100.0000000 62.56750000 53.94140000 58.63220000 48.61830000 30.63830000 836 18.94880000 35.11170000 20.20700000 5.177600000 7.920170000 4.065200000 837 17.37540000 58.69230000 42.45010000 14.69780000 23.70560000 18.17490000 838 16.64260000 62.44560000 53.30420000 18.01840000 27.61340000 28.09620000 839 13.81360000 70.22980000 79.91810000 27.99270000 37.56080000 63.56350000 840 15.82700000 93.62380000 80.69380000 42.91110000 66.74640000 69.65150000 841 12.93780000 97.81400000 94.22920000 50.35820000 74.69900000 94.78330000 842 26.59190000 25.60550000 31.36630000 5.436470000 5.293070000 8.123740000 843 24.85190000 29.32420000 38.23370000 6.516790000 6.683090000 12.36630000 844 27.98710000 31.00830000 45.17150000 8.372880000 7.995640000 17.58060000 845 48.27530000 65.43690000 62.63120000 28.83380000 35.00940000 39.04820000 846 54.54980000 73.88490000 65.79580000 36.44200000 45.24040000 44.49320000 847 16.33650000 21.91510000 18.81660000 2.494450000 3.117250000 2.871850000 848 15.58310000 19.37090000 37.26160000 3.717650000 3.115150000 11.19630000 849 19.94810000 17.08950000 41.13640000 4.483740000 3.106310000 13.77690000 850 36.86440000 16.85320000 40.81180000 7.820990000 4.798990000 13.69610000 851 38.07260000 33.91280000 39.75760000 10.62100000 10.12330000 13.83900000 852 39.76770000 44.39690000 49.58560000 15.28180000 16.33330000 22.57610000 853 38.83820000 49.18550000 67.54300000 20.27760000 20.72380000 42.84850000 854 45.25340000 62.91740000 67.94430000 27.83310000 32.61930000 45.26980000 855 51.62810000 62.67820000 71.13850000 30.97000000 33.98190000 49.66690000 856 80.24220000 68.30650000 74.16220000 50.23060000 47.77250000 55.60280000 857 81.66510000 75.57260000 79.86050000 56.73590000 56.65080000 65.64220000 858 10.00700000 7.606290000 25.23400000 1.258500000 0.731725000 4.654040000 859 13.45270000 0.000000000 27.03560000 1.517120000 0.664693000 5.377400000 860 38.75420000 7.677200000 75.97110000 15.11680000 6.841610000 52.22110000 861 69.57370000 0.000000000 87.00920000 31.86100000 14.89010000 70.86370000 862 89.15070000 60.64520000 93.90100000 59.65530000 46.61130000 88.23750000 863 32.01160000 17.66440000 27.97890000 5.254160000 3.754740000 6.194410000 864 35.44040000 23.09410000 28.69610000 6.795860000 5.483940000 6.775880000 865 34.16380000 27.73180000 30.08020000 7.301540000 6.777710000 7.662140000 866 49.99820000 40.54560000 39.09890000 16.17850000 15.36670000 14.10930000 867 49.09800000 45.13000000 51.54460000 19.04520000 18.56020000 24.60690000 868 58.48090000 61.38060000 68.54810000 32.76440000 34.12970000 46.09620000 869 67.19920000 61.10670000 83.30390000 41.38650000 37.91070000 68.44670000 870 81.04840000 65.72380000 88.63440000 54.02860000 47.34610000 78.85430000 871 100.0000000 68.98770000 90.14730000 71.41160000 58.61930000 82.86600000 872 100.0000000 78.60200000 89.70540000 76.50960000 69.06300000 83.80370000 873 70.05840000 82.47060000 0.000000000 42.25930000 56.53180000 8.684970000 874 80.26920000 86.90470000 14.84610000 51.96510000 65.74540000 11.37800000 875 91.27030000 93.37560000 9.299470000 64.58450000 78.94190000 12.34390000 876 37.87690000 59.84480000 0.000000000 16.43690000 25.63750000 4.082420000 877 38.07400000 70.59150000 0.000000000 21.55600000 35.79320000 5.772930000 878 59.62050000 86.24950000 0.000000000 39.05090000 58.47560000 9.229210000 879 59.82670000 100.0000000 0.000000000 49.08170000 78.38900000 12.54430000 880 60.28770000 100.0000000 22.26230000 49.97170000 78.77120000 16.04750000 881 71.40600000 20.87850000 27.88440000 21.89130000 12.85370000 7.031440000 882 91.39610000 27.18320000 73.93690000 45.16520000 25.23690000 51.19300000 883 92.52880000 33.11210000 82.74820000 49.81210000 28.97500000 65.35290000 884 78.69870000 29.57060000 69.77860000 34.98420000 20.73210000 45.03850000 885 81.84240000 41.34510000 80.89320000 42.99040000 28.46550000 62.57960000 886 86.11180000 63.11320000 82.55100000 54.51660000 46.03040000 68.07050000 887 71.24740000 100.0000000 63.99440000 62.08660000 84.31230000 48.45190000 888 76.71650000 100.0000000 100.0000000 76.82960000 90.60900000 108.0530000 889 100.0000000 100.0000000 100.0000000 95.04580000 100.0000000 108.9060000 890 51.32810000 19.33590000 17.55760000 10.87000000 6.989010000 2.838600000 891 81.60820000 16.98080000 20.05280000 27.62580000 15.25630000 4.251420000 892 86.66620000 21.06800000 29.86020000 32.53250000 18.35310000 8.459000000 893 53.69280000 0.000000000 20.64050000 11.06490000 5.639430000 3.448980000 894 55.57810000 14.96940000 23.91940000 12.65710000 7.250220000 4.803310000 895 56.25500000 22.58510000 53.03060000 17.46690000 10.50120000 24.55530000 896 62.03470000 27.00290000 75.38200000 26.13390000 15.33510000 52.40250000 897 68.26460000 72.44200000 82.96980000 47.37950000 49.16840000 69.74690000 898 71.59770000 81.96390000 94.84990000 58.93590000 62.80530000 93.24300000 899 11.90110000 82.51170000 72.68880000 32.76160000 50.63980000 54.96010000 900 0.000000000 86.28700000 80.73100000 37.12500000 56.21740000 67.98400000 901 0.000000000 87.51640000 71.12470000 35.20080000 56.75490000 53.82050000 902 75.55560000 92.06090000 73.45120000 61.23030000 74.76440000 59.20530000 903 32.67890000 0.000000000 13.41390000 3.741930000 1.903940000 1.311230000 904 31.42690000 8.489940000 9.491790000 3.493550000 2.023380000 0.739693000 905 48.64320000 9.936640000 43.67820000 11.59530000 5.971370000 15.84580000 906 61.68080000 11.11170000 42.85250000 17.33410000 9.035960000 15.50590000 907 65.46480000 0.000000000 57.05460000 21.49710000 10.47550000 28.43000000 908 93.02220000 10.48130000 59.87840000 41.26740000 20.97180000 32.50120000 909 93.75350000 13.28680000 76.87590000 46.32990000 23.34210000 55.12510000 910 13.40800000 8.545560000 12.24210000 0.834796000 0.647289000 1.014090000 911 8.880180000 19.05410000 23.58510000 1.886750000 2.270920000 4.285680000 912 0.000000000 17.69510000 26.94970000 1.802500000 1.989820000 5.580970000 913 24.81140000 22.84260000 83.95160000 15.59910000 8.686830000 65.25230000 914 30.71680000 51.12150000 84.42010000 23.68820000 22.91310000 68.36510000 915 40.28500000 54.58560000 79.73410000 25.99660000 26.15530000 61.17500000 916 46.74080000 67.25990000 84.28570000 35.08350000 38.84610000 70.61190000 917 37.22150000 9.549400000 18.09400000 5.316890000 2.995660000 2.501500000 918 44.34980000 0.000000000 22.65540000 7.587470000 3.831960000 3.952500000 919 44.64790000 9.365870000 29.58430000 8.435780000 4.496260000 6.920110000 920 58.27010000 0.000000000 33.39280000 14.19150000 7.129270000 9.107490000 921 81.20510000 17.10800000 33.76850000 28.48310000 15.58540000 10.19780000 922 81.98150000 52.77930000 32.05990000 36.88970000 31.86710000 11.95980000 923 89.86630000 66.30120000 46.67430000 50.46370000 47.12660000 24.14560000 924 71.80480000 49.42420000 38.28340000 29.68000000 26.31760000 14.96830000 925 72.80000000 57.19000000 46.04260000 34.25800000 32.81600000 21.71450000 926 89.73020000 57.15720000 52.98120000 47.40830000 39.43880000 28.51510000 927 35.62410000 74.25880000 22.28930000 23.50850000 39.63090000 9.896320000 928 44.97320000 92.39710000 32.95750000 38.73460000 64.39960000 18.62740000 929 0.000000000 31.02000000 32.82600000 4.282930000 6.073690000 9.112540000 930 0.000000000 29.98560000 49.46620000 6.367980000 6.594360000 21.05890000 931 14.46500000 32.30160000 56.04380000 8.617480000 8.281460000 27.62350000 932 12.02760000 38.52470000 62.79710000 11.26760000 11.57460000 35.64770000 933 0.000000000 55.52880000 86.75520000 23.01240000 24.89690000 72.81510000 934 61.19670000 73.93140000 86.88590000 45.65760000 49.32900000 76.56730000 935 33.77550000 32.76560000 24.56810000 7.687030000 8.431040000 5.539860000 936 86.36770000 36.53450000 26.05850000 34.71910000 23.58830000 7.638200000 937 43.45890000 18.74320000 19.34640000 7.984100000 5.395780000 3.173640000 938 47.15980000 15.94380000 72.44980000 17.41190000 8.886120000 47.37110000 939 94.25500000 15.18750000 90.21090000 51.16430000 25.55570000 77.66810000 940 60.95530000 7.524820000 92.16520000 29.08950000 13.43360000 80.13180000 941 76.20180000 16.07210000 93.67510000 38.95980000 19.23180000 83.60790000 942 22.33490000 9.448260000 20.95910000 2.306380000 1.418100000 3.196570000 943 32.30040000 21.85040000 21.86000000 5.333180000 4.547830000 3.936380000 944 32.61760000 27.00830000 24.38010000 6.329230000 6.152810000 5.099350000 945 33.02240000 35.27250000 41.87220000 9.881800000 10.15360000 15.38600000 946 41.53290000 33.70110000 48.21500000 12.86970000 11.07030000 20.47800000 947 40.73540000 39.26520000 47.93210000 13.88000000 13.53560000 20.65600000 948 45.27520000 40.15510000 35.15190000 13.83710000 14.06130000 11.47760000 949 60.36090000 40.45710000 41.37790000 21.06680000 17.81680000 15.91630000 950 71.74630000 51.22430000 47.47210000 31.58740000 28.07060000 22.13450000 951 80.33760000 65.64880000 47.62780000 43.18320000 42.89310000 24.51740000 952 69.44660000 48.23470000 27.06170000 26.70850000 24.33250000 8.629660000 953 89.60630000 89.68040000 26.58190000 61.51580000 73.37840000 16.05640000 954 27.80370000 33.42660000 10.07600000 5.798110000 7.743900000 1.797280000 955 45.46640000 48.52940000 20.27950000 15.11780000 18.55650000 5.616640000 956 52.55640000 60.39410000 23.15260000 22.53930000 29.04830000 8.208560000 957 58.87030000 57.08370000 26.57330000 24.25960000 27.86370000 9.230630000 958 68.24330000 68.50640000 27.92560000 34.45280000 40.74090000 11.77090000 959 93.03510000 70.62730000 28.31390000 52.95240000 51.87650000 13.12190000 960 23.60300000 12.99950000 27.39670000 3.172340000 2.111990000 5.727330000 961 29.70780000 9.169240000 27.39500000 4.091180000 2.265520000 5.707790000 962 55.71130000 7.265520000 27.91930000 12.59450000 6.533020000 6.317030000 963 60.99610000 10.64610000 50.03890000 18.10050000 9.261640000 21.47150000 964 60.38670000 31.13590000 61.55480000 22.55660000 14.99040000 34.25010000 965 62.99510000 55.97900000 62.69500000 31.37240000 30.24610000 38.07070000 966 78.23760000 86.51820000 85.25420000 62.75150000 69.48930000 76.72170000 967 86.88270000 93.04920000 93.57230000 76.38380000 82.88440000 93.72430000 968 25.91930000 24.32220000 16.05210000 4.036180000 4.413010000 2.332430000 969 92.52810000 29.44310000 27.67260000 38.26380000 23.20960000 8.072790000 970 93.09680000 43.52290000 36.66390000 42.96140000 30.43840000 14.02530000 971 93.23620000 57.50150000 38.92800000 48.20730000 40.31080000 17.12130000 972 92.89330000 79.14710000 43.76380000 59.37850000 62.01330000 24.21110000 973 39.86480000 56.22260000 22.23530000 16.19570000 23.23460000 7.098300000 974 43.87840000 85.59220000 42.00200000 34.81340000 55.34190000 22.88990000 975 65.09800000 88.15050000 64.29700000 49.97280000 65.20010000 45.77090000 976 16.39050000 31.74530000 44.23610000 6.642200000 7.334070000 16.80300000 977 16.35290000 35.04550000 52.73490000 8.751470000 9.292110000 24.49460000 978 19.52160000 82.20810000 66.22480000 31.66770000 49.98650000 46.20330000 979 33.44030000 81.95220000 70.76190000 35.22530000 51.45260000 52.29560000 980 36.82270000 92.95540000 80.15040000 46.12830000 67.70620000 68.79660000 981 28.94450000 25.93420000 44.86170000 7.633310000 6.306250000 17.04600000 982 30.80460000 25.39280000 74.48080000 14.29190000 8.882270000 50.45440000 983 74.77430000 12.74300000 35.19970000 23.96150000 12.71490000 10.71270000 984 77.02670000 8.900220000 47.26850000 26.87610000 13.71390000 19.43870000 985 88.45840000 15.09600000 52.99420000 36.51570000 19.13910000 25.18350000 986 87.83730000 46.81370000 67.98330000 45.46720000 32.54870000 44.37810000 987 89.14820000 75.39260000 83.46730000 63.37520000 59.79390000 71.78530000 988 29.18910000 40.29660000 68.94290000 15.56060000 14.29420000 43.69810000 989 29.84900000 86.23980000 80.95900000 40.05180000 57.67200000 68.47820000 990 6.238760000 37.03560000 53.02900000 8.589660000 9.885750000 24.90270000 991 10.53270000 37.08830000 75.58680000 14.08220000 12.12610000 52.72230000 992 12.80030000 39.16630000 92.81950000 20.32120000 15.46270000 82.22540000 993 36.46140000 43.17030000 93.22220000 25.58960000 19.77450000 83.54830000 994 34.95320000 60.93350000 92.01980000 31.14790000 32.17920000 83.36760000 995 38.64640000 61.95710000 100.0000000 35.62390000 34.80470000 99.45290000 996 13.54190000 48.60270000 34.92100000 9.608530000 15.60850000 11.86250000 997 9.878450000 51.88920000 48.90410000 12.44530000 18.52570000 22.54220000 998 12.63890000 62.46190000 65.49880000 20.25610000 28.47840000 41.73770000 999 26.64480000 67.43530000 67.79910000 24.96170000 34.30000000 45.55570000 1000 40.60160000 68.59070000 66.61080000 28.67230000 37.09640000 44.36480000 1001 59.29950000 75.19960000 72.09200000 40.96100000 48.46430000 53.26530000 1002 59.92170000 94.23720000 86.50840000 57.87610000 74.91050000 80.19930000 1003 13.33200000 35.75840000 44.56980000 7.268210000 8.924870000 17.33940000 1004 10.54820000 42.87570000 51.78450000 10.09160000 12.95600000 24.22300000 1005 12.50540000 50.40910000 53.14330000 12.84780000 17.87310000 26.33130000 1006 8.450030000 52.51220000 62.34810000 15.23900000 19.99420000 36.53100000 1007 21.68840000 52.28740000 81.25070000 21.45510000 22.49490000 63.14040000 1008 49.88730000 52.09890000 91.87170000 32.43860000 27.64670000 82.14620000 1009 8.821240000 11.39540000 34.97880000 2.290520000 1.421130000 9.543800000 1010 14.59930000 14.98260000 61.72490000 7.395750000 3.907620000 33.10790000 1011 14.10740000 9.424530000 66.73070000 8.169320000 3.649570000 39.14260000 1012 23.90850000 29.84270000 93.30490000 19.77390000 12.11950000 82.53540000 1013 26.65150000 67.24050000 92.27610000 32.31380000 37.08870000 84.73730000 1014 17.89220000 22.98490000 29.23840000 3.554220000 3.785250000 6.874170000 1015 26.78680000 20.34020000 28.39470000 4.485660000 3.780880000 6.429460000 1016 30.12370000 18.37680000 33.22310000 5.407810000 3.882360000 8.849140000 1017 39.45870000 61.06610000 46.46550000 20.76650000 28.26280000 21.89560000 1018 44.97080000 69.61170000 58.38480000 28.76070000 38.12190000 34.81550000 1019 57.41040000 71.52190000 92.14250000 44.35620000 46.52700000 85.67240000 1020 76.11660000 55.58930000 70.16670000 40.73900000 34.63920000 47.94590000 1021 93.79200000 55.65580000 77.77690000 56.05830000 42.33200000 59.65510000 1022 93.54370000 62.35040000 88.69020000 62.12380000 49.20940000 78.88790000 1023 93.27060000 86.37000000 99.62020000 79.18690000 77.21740000 104.5550000 1024 50.82430000 52.68700000 57.71800000 23.43450000 24.42880000 31.73030000 1025 56.30380000 54.33480000 64.63740000 27.92140000 27.47480000 40.06950000 1026 63.38460000 57.47190000 72.36450000 34.56850000 32.50000000 50.90450000 1027 44.35940000 53.94440000 49.01870000 19.86580000 23.46750000 23.20640000 1028 45.06340000 92.48350000 68.64550000 45.14760000 67.06760000 51.93020000 1029 57.65870000 91.95190000 72.34080000 50.87350000 69.34480000 57.12360000 1030 30.71030000 56.12140000 37.03770000 15.14360000 22.47480000 14.18890000 1031 51.82790000 58.64280000 79.25340000 31.59850000 31.45440000 61.14310000 1032 75.95290000 61.71630000 91.81500000 49.85190000 42.33860000 83.95780000 1033 28.58140000 17.89510000 39.54690000 5.784250000 3.917550000 12.75150000 1034 30.53800000 14.37190000 45.23990000 6.692420000 3.830830000 16.92020000 1035 36.82620000 10.14340000 50.76480000 8.880520000 4.455000000 21.69370000 1036 84.72980000 78.93860000 66.61600000 57.28770000 60.23730000 47.33030000 1037 86.59390000 86.56590000 69.11000000 64.09390000 70.77100000 52.26470000 1038 11.68160000 42.48370000 14.08000000 6.050840000 11.17040000 3.106490000 1039 14.85290000 51.38550000 12.49370000 9.077130000 16.93400000 3.766120000 1040 51.33520000 51.82630000 34.47620000 19.67660000 22.45220000 12.39290000 1041 51.70760000 53.32240000 42.85720000 21.43830000 24.04520000 18.19020000 1042 79.76050000 79.24270000 91.25410000 61.27490000 61.70930000 86.04530000 1043 81.73540000 87.69640000 94.06730000 69.03330000 73.53880000 93.26200000 1044 9.637480000 16.56100000 24.79220000 1.766090000 1.831010000 4.665040000 1045 8.426810000 13.51910000 29.12300000 1.814890000 1.448580000 6.459980000 1046 29.53530000 40.93160000 48.68120000 11.54170000 12.96610000 21.32070000 1047 38.04610000 44.01390000 56.41150000 15.93100000 16.35380000 29.17990000 1048 46.55480000 47.72860000 57.25200000 19.99890000 20.13470000 30.58340000 1049 67.00280000 48.95870000 56.38940000 29.64860000 25.73020000 30.24370000 1050 18.13890000 12.95410000 14.93710000 1.640760000 1.406900000 1.630470000 1051 40.61070000 24.20300000 9.311020000 7.359960000 6.127100000 1.305980000 1052 47.37990000 22.08160000 8.279160000 9.343210000 6.723850000 1.200300000 1053 59.47990000 77.73100000 16.96070000 34.06710000 48.02560000 9.386050000 1054 61.64680000 91.38040000 18.90750000 44.02250000 66.18130000 12.88180000 1055 23.27830000 28.63140000 32.07190000 5.436460000 6.023690000 8.635230000 1056 32.20900000 28.59560000 39.40860000 8.020880000 7.248730000 13.18220000 1057 43.28980000 28.28540000 75.01950000 18.35840000 11.65880000 51.56670000 1058 51.45690000 30.18050000 91.93790000 27.13440000 16.06440000 80.31460000 1059 65.84450000 63.02620000 92.61690000 44.65510000 40.49430000 85.38980000 1060 71.43360000 73.38670000 93.26790000 53.27020000 52.55460000 88.50440000 1061 38.04620000 29.77510000 88.46990000 21.20120000 13.03460000 73.66540000 1062 37.36090000 48.47580000 87.41200000 25.43190000 22.35890000 73.35540000 1063 54.43930000 79.15380000 93.34380000 47.72370000 54.55780000 89.32870000 1064 63.50630000 93.57760000 93.23920000 61.56840000 75.82840000 92.50440000 1065 7.926100000 22.22180000 22.13220000 2.119590000 2.959780000 3.891350000 1066 20.51110000 27.32790000 20.88240000 3.903730000 5.007570000 3.780760000 1067 37.49590000 37.15300000 31.78370000 10.27200000 11.14380000 9.216210000 1068 74.66300000 72.09790000 46.93730000 42.52340000 47.38050000 24.83310000 1069 81.02140000 74.97800000 72.27170000 53.77750000 54.88250000 54.08170000 1070 93.26940000 83.10560000 77.29120000 69.42520000 69.94450000 63.53570000 1071 96.17430000 84.30100000 91.37660000 77.21260000 74.56000000 87.91450000 1072 62.02400000 20.07320000 22.91680000 16.17750000 9.811710000 4.746380000 1073 79.57570000 21.57180000 46.55990000 29.53750000 16.65930000 19.27210000 1074 79.02520000 34.05020000 61.16250000 34.04070000 21.80790000 34.50650000 1075 75.49590000 45.70120000 57.92530000 34.04610000 26.41040000 31.77740000 1076 92.74940000 90.56920000 63.87260000 70.43980000 78.23020000 46.68950000 1077 33.55570000 27.28480000 17.71980000 6.192170000 6.196900000 2.974320000 1078 32.86590000 41.70760000 35.46260000 10.64080000 13.03040000 11.63260000 1079 31.26790000 45.19930000 44.57690000 12.48800000 15.34370000 18.30890000 1080 35.22930000 63.20930000 79.35880000 28.05230000 32.56560000 61.71050000 1081 43.36800000 66.49810000 91.32720000 35.92960000 38.45700000 83.02890000 1082 30.92420000 51.28010000 68.64200000 19.24340000 21.22980000 44.44300000 1083 35.07750000 56.26140000 67.82570000 21.89700000 25.38520000 44.03120000 1084 64.49050000 70.17700000 75.58710000 41.87960000 44.82650000 57.56980000 1085 75.29530000 79.85080000 84.20070000 56.26070000 59.94030000 73.42360000 1086 89.18920000 93.83860000 86.60860000 76.31230000 83.97880000 81.15360000 1087 88.84590000 100.0000000 92.35600000 82.70530000 93.97260000 93.21270000 1088 9.169040000 15.34010000 17.51500000 1.185940000 1.426070000 2.264120000 1089 11.28350000 12.36420000 20.07640000 1.228760000 1.107560000 2.918540000 1090 7.758740000 8.455170000 19.87400000 0.822165000 0.596167000 2.780200000 1091 37.05060000 66.94820000 32.07420000 20.92090000 32.57990000 12.94640000 1092 73.04610000 79.71690000 48.48070000 46.06140000 55.56720000 27.54910000 1093 85.73830000 92.63570000 52.06020000 63.91560000 77.32030000 34.07180000 1094 42.95560000 20.41270000 13.78870000 7.747210000 5.578960000 1.880820000 1095 93.23600000 18.43900000 9.688770000 36.32620000 20.00370000 2.504840000 1096 53.58320000 0.000000000 12.81250000 10.65310000 5.469250000 1.525770000 1097 57.05280000 69.13620000 43.46470000 30.77150000 39.10520000 21.06680000 1098 56.63430000 91.68720000 48.33310000 45.00290000 66.64090000 29.61360000 1099 57.64850000 92.69780000 62.50090000 48.96660000 69.43430000 44.47750000 1100 19.66130000 58.77220000 58.02510000 17.71590000 24.99770000 32.47310000 1101 25.31460000 72.47990000 65.01490000 26.63030000 39.07570000 42.84380000 1102 11.02960000 36.82280000 36.45380000 6.258540000 8.898830000 11.67090000 1103 11.08770000 43.95170000 37.99980000 8.340490000 12.75720000 13.28950000 1104 65.58080000 67.43090000 37.18470000 33.38660000 39.29040000 16.56660000 1105 92.19480000 67.75010000 38.05720000 51.83380000 49.02100000 18.03480000 1106 66.72170000 47.29710000 10.64440000 23.95810000 22.56580000 3.779300000 1107 81.13310000 65.01260000 12.86390000 40.10750000 41.24670000 6.888590000 1108 92.60500000 86.12580000 8.715340000 60.65800000 69.48420000 10.65750000 1109 91.92170000 89.50420000 84.66040000 74.79940000 78.71380000 76.85130000 1110 68.42910000 64.66880000 71.64680000 40.28470000 40.12080000 51.06700000 1111 76.06900000 74.16780000 81.98420000 52.79120000 53.38250000 68.64730000 1112 89.64880000 73.63660000 96.86260000 67.49940000 59.93680000 96.21880000 1113 36.52590000 6.653190000 21.80120000 5.227210000 2.758580000 3.576900000 1114 45.40580000 9.620080000 18.95960000 7.938100000 4.346670000 2.862660000 1115 50.43670000 16.98590000 27.54760000 10.93750000 6.592140000 6.249590000 1116 62.85560000 28.05740000 31.33260000 18.44460000 12.59050000 8.829420000 1117 74.96280000 28.10250000 36.59350000 26.05200000 16.45780000 12.17380000 1118 89.32660000 30.69140000 43.10650000 37.67180000 23.04530000 17.33020000 1119 89.64230000 44.38940000 44.27510000 41.42550000 29.90610000 19.35750000 1120 64.91420000 31.97110000 9.849500000 18.96650000 14.08850000 2.298380000 1121 75.57230000 33.04720000 10.03440000 25.52090000 17.79350000 2.692290000 1122 85.30450000 79.87770000 19.61210000 51.39130000 58.82440000 11.27690000 1123 91.97640000 79.68920000 61.08980000 62.11910000 63.53970000 40.99810000 1124 18.44450000 13.68490000 22.03320000 2.100660000 1.677010000 3.611060000 1125 69.69420000 9.399170000 28.09330000 19.94390000 10.44670000 6.763860000 1126 79.69080000 9.507240000 27.21740000 26.26500000 13.72150000 6.672710000 1127 89.23370000 22.50290000 63.57020000 40.11000000 21.90520000 37.04940000 1128 88.40270000 36.11390000 70.74130000 43.68430000 27.19880000 47.14010000 1129 94.37940000 63.35040000 72.77930000 58.38940000 48.51770000 53.32860000 1130 77.39320000 52.24080000 54.37640000 36.77270000 31.14120000 28.85060000 1131 89.80560000 53.02650000 56.77220000 46.61200000 36.58420000 31.84730000 1132 89.38130000 64.63480000 61.41770000 52.08970000 46.47090000 38.61110000 1133 67.01150000 67.30320000 53.09530000 36.55290000 40.54850000 29.41230000 1134 66.27060000 82.77150000 71.18130000 48.82470000 59.20870000 53.65460000 1135 68.45550000 90.74980000 85.06040000 59.44910000 72.06890000 77.06110000 1136 10.56100000 29.55440000 16.94690000 3.107780000 5.197270000 2.747290000 1137 9.419710000 27.77370000 28.89620000 3.542420000 4.862820000 6.920990000 1138 47.57470000 39.55580000 26.80870000 13.69870000 13.85170000 7.183010000 1139 47.46410000 44.96910000 24.97900000 15.02960000 16.80460000 6.929630000 1140 58.34210000 65.54960000 52.19370000 31.05190000 36.47820000 28.04740000 1141 77.32340000 66.97260000 79.27410000 49.06240000 46.02530000 63.06800000 1142 28.64910000 12.54000000 19.04060000 3.480660000 2.292060000 2.723960000 1143 29.54650000 9.256680000 22.15070000 3.670380000 2.099560000 3.649900000 1144 50.48150000 14.17850000 51.93040000 13.93030000 7.411190000 23.08860000 1145 77.42820000 12.19430000 66.32560000 31.16090000 15.73830000 39.74750000 1146 77.62030000 43.55920000 72.91680000 38.38400000 27.28280000 50.47970000 1147 69.42030000 43.44190000 76.22470000 34.13050000 24.93290000 55.09150000 1148 69.38470000 46.96830000 90.08200000 39.59010000 28.82700000 78.67240000 1149 78.01820000 53.59180000 91.09420000 47.66220000 36.33810000 81.56770000 1150 40.79090000 47.71840000 39.45060000 15.09950000 17.94600000 14.90260000 1151 47.11630000 57.82050000 46.32210000 21.92110000 26.83000000 21.43930000 1152 9.684760000 14.42450000 6.067540000 0.786834000 1.152280000 0.380259000 1153 14.39040000 15.77450000 10.77410000 1.330690000 1.584830000 0.940377000 1154 9.530100000 23.48020000 17.24070000 2.089550000 3.226440000 2.494010000 1155 17.55600000 44.99320000 44.68800000 10.14280000 14.04020000 18.26860000 1156 47.28120000 55.38510000 55.70680000 22.67660000 25.59050000 29.87480000 1157 8.005570000 13.64210000 10.49610000 0.734212000 1.028190000 0.825008000 1158 11.34220000 6.732770000 5.279080000 0.466539000 0.377860000 0.195099000 1159 24.64160000 8.972740000 8.451470000 2.151190000 1.364280000 0.563062000 1160 28.54250000 8.715170000 13.62580000 3.009360000 1.773370000 1.364630000 1161 43.15720000 25.57530000 48.38680000 11.93640000 8.377500000 20.15670000 1162 46.67550000 48.20700000 67.32470000 22.46570000 21.37600000 42.57580000 1163 56.65420000 54.09060000 75.41710000 30.78130000 28.48980000 54.74870000 1164 77.76180000 55.02310000 81.42090000 44.81470000 36.04520000 64.80130000 1165 10.91450000 24.90070000 39.37790000 4.321330000 4.454530000 12.81690000 1166 8.910710000 23.56170000 44.53360000 4.737580000 4.300080000 16.55140000 1167 10.90510000 28.75220000 58.06560000 8.082570000 6.959600000 29.54290000 1168 12.08640000 32.00430000 78.12750000 13.80310000 10.23780000 56.22790000 1169 26.70110000 73.10540000 77.97320000 30.65730000 41.25320000 61.08790000 1170 24.41660000 82.41640000 91.71720000 40.15100000 53.67090000 86.47280000 1171 25.14990000 84.20730000 100.0000000 44.53280000 57.24850000 103.3160000 1172 15.82950000 93.94440000 72.45990000 40.77120000 66.26410000 57.22950000 1173 88.46500000 95.03620000 71.81970000 72.18080000 83.66730000 58.03320000 1174 29.62620000 31.23430000 16.76420000 5.962590000 7.140220000 2.926950000 1175 45.06340000 60.42080000 12.51640000 19.13880000 27.37420000 5.254990000 1176 51.48780000 81.02320000 11.46160000 32.24210000 50.02280000 8.763710000 1177 75.94400000 92.85820000 10.16440000 53.01420000 72.42010000 11.80490000 1178 76.26360000 93.50490000 63.61470000 60.24720000 76.08530000 46.50000000 1179 91.95130000 92.47350000 79.68370000 75.34750000 82.27220000 69.32640000 1180 66.68820000 75.49130000 68.92960000 44.14920000 50.44580000 49.15190000 1181 70.05020000 83.15650000 89.97000000 56.99100000 63.11260000 84.16800000 1182 79.31170000 94.97110000 89.47950000 70.82670000 82.27180000 86.24080000 1183 14.25120000 38.59180000 29.99520000 6.251060000 9.615260000 8.223390000 1184 8.576980000 46.06510000 74.32870000 16.08780000 16.86100000 51.67780000 1185 12.73000000 51.19000000 90.41140000 23.10410000 22.41400000 78.90930000 1186 12.45520000 62.94490000 93.80200000 29.02240000 32.33080000 86.90420000 1187 9.281660000 24.74920000 75.45220000 11.59480000 7.317300000 51.72510000 1188 7.275710000 25.22980000 87.85760000 15.43750000 8.958540000 72.08690000 1189 14.97540000 19.30710000 75.43060000 11.30310000 6.131650000 51.47960000 1190 63.18110000 16.90190000 78.22670000 26.25780000 13.38600000 56.33300000 1191 71.47950000 24.04780000 87.85470000 34.84050000 18.70430000 72.94060000 1192 57.67410000 39.96870000 66.27600000 24.35570000 18.77680000 40.62950000 1193 72.73410000 59.75600000 67.73610000 39.66210000 36.66960000 45.15630000 1194 74.36260000 75.45880000 67.33520000 48.31070000 52.61020000 47.25640000 1195 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 1196 7.710020000 10.15680000 6.203640000 0.420937000 0.559623000 0.295110000 1197 7.612170000 4.618980000 10.11310000 0.301345000 0.203224000 0.636356000 1198 30.28710000 63.57770000 15.43310000 16.48460000 28.07080000 6.102600000 1199 34.00210000 92.80980000 14.70120000 34.45770000 62.78500000 11.69870000 1200 39.94850000 95.35840000 90.38020000 52.14040000 73.02820000 87.09130000 1201 21.70130000 28.66040000 27.26250000 4.757880000 5.732790000 6.283750000 1202 20.63100000 33.10070000 25.73260000 5.336990000 7.312590000 5.910750000 1203 61.14130000 38.88710000 28.48010000 19.59650000 16.62170000 8.151090000 1204 61.80640000 61.36260000 42.29090000 29.24860000 32.90010000 19.06460000 1205 44.91050000 59.22180000 40.26050000 20.83030000 27.22990000 16.95180000 1206 49.99250000 74.18350000 43.04700000 30.34600000 42.84450000 21.49280000 1207 67.69390000 83.84290000 52.49630000 46.12810000 59.30520000 31.94880000 1208 74.54440000 84.85120000 63.39050000 53.15190000 63.62630000 44.19840000 1209 12.65390000 32.43660000 9.078530000 3.535910000 6.275350000 1.508440000 1210 10.27680000 30.78420000 23.05510000 3.672750000 5.789010000 4.678200000 1211 10.37250000 31.07700000 36.38210000 4.971880000 6.399540000 11.21190000 1212 11.43210000 38.40340000 43.03950000 7.534660000 10.02800000 16.35490000 1213 0.000000000 40.73120000 45.85760000 8.210030000 11.22130000 18.76730000 1214 41.42260000 45.38370000 73.28320000 21.34030000 19.29080000 50.35870000 1215 51.42930000 53.84570000 82.97730000 30.69290000 28.04580000 66.56150000 1216 71.81530000 12.78580000 20.17470000 20.83310000 11.25440000 3.873980000 1217 72.59920000 7.440620000 54.75370000 25.30950000 12.66860000 26.26870000 1218 79.93730000 60.33610000 54.23330000 41.67200000 38.41550000 29.85340000 1219 64.04890000 23.69560000 16.88540000 17.34840000 11.13930000 3.128620000 1220 91.04910000 27.31500000 18.62540000 36.06180000 21.59760000 4.616840000 1221 90.03810000 39.30900000 16.64050000 37.67680000 26.19360000 4.903400000 1222 33.24830000 15.57040000 10.78940000 4.394080000 3.138230000 1.081010000 1223 35.44630000 11.28760000 91.72670000 19.43700000 8.734100000 78.90840000 1224 45.95460000 18.11990000 91.08340000 22.99310000 11.39610000 78.03310000 1225 15.55610000 14.89220000 5.936390000 1.267720000 1.455000000 0.403999000 1226 17.05060000 13.77280000 9.164060000 1.393950000 1.386170000 0.687679000 1227 14.69930000 10.39800000 8.937570000 0.943539000 0.841757000 0.579899000 1228 8.826190000 11.11870000 14.22730000 0.731206000 0.772028000 1.409100000 1229 6.437110000 8.179000000 15.38370000 0.538399000 0.459239000 1.602370000 1230 5.951050000 52.34510000 69.99720000 16.93250000 20.56360000 46.25320000 1231 9.232850000 58.92620000 83.86440000 23.65070000 27.36650000 68.28670000 1232 11.68040000 75.69230000 92.35900000 34.90280000 45.01610000 86.28780000 1233 6.351260000 81.46890000 92.34760000 38.03030000 51.68030000 87.38760000 1234 20.31460000 89.10210000 91.43460000 43.80560000 62.05910000 87.37030000 1235 53.01520000 87.00210000 93.97770000 52.28500000 64.21920000 92.17250000 1236 90.00530000 86.71960000 92.77820000 74.15830000 75.26770000 90.85350000 1237 1.445090000 0.000000000 0.000000000 0.003702600 0.001908800 0.000173336 1238 13.56080000 92.53170000 32.87570000 32.21840000 61.18440000 18.30520000 1239 75.42190000 91.66890000 36.61140000 53.68830000 71.29190000 21.31280000 1240 93.20680000 90.72590000 54.20300000 68.88870000 77.82890000 35.99660000 1241 25.23860000 18.16100000 7.137190000 2.890610000 2.730340000 0.659536000 1242 33.00280000 20.03620000 9.726100000 4.750990000 3.983980000 1.081250000 1243 34.38430000 18.05020000 84.68600000 17.29310000 8.698370000 66.41070000 1244 20.91300000 24.27940000 50.46040000 6.920950000 5.465110000 21.71200000 1245 18.31900000 35.01640000 65.28960000 11.61190000 10.45110000 38.45190000 1246 26.02460000 45.68080000 70.68180000 16.93460000 17.23510000 46.54470000 1247 25.36540000 49.93070000 94.62990000 25.76810000 22.96230000 86.87110000 1248 38.32000000 35.31740000 63.14590000 15.19450000 12.45620000 36.02760000 1249 48.48260000 37.88230000 70.32140000 20.94190000 16.11370000 45.62400000 1250 15.86020000 14.00440000 26.27860000 2.147950000 1.700780000 5.221500000 1251 11.25920000 57.31340000 24.49210000 11.66920000 21.52880000 7.828860000 1252 6.114910000 62.53930000 41.61760000 15.45050000 26.57130000 18.07580000 1253 11.65980000 78.14880000 46.01220000 24.43040000 43.08330000 24.18920000 1254 14.06040000 79.97310000 37.75400000 24.54390000 44.88210000 18.47680000 1255 17.52700000 91.53340000 44.67530000 33.39910000 60.56410000 26.01320000 1256 35.24230000 92.67390000 45.58610000 37.61660000 63.92870000 27.17030000 1257 30.23550000 90.43260000 30.76500000 32.98400000 59.40110000 16.80820000 1258 82.53420000 93.02630000 30.24750000 58.84020000 75.46670000 18.28740000 1259 76.54930000 50.64270000 17.87660000 31.32950000 27.99310000 5.898000000 1260 88.61980000 52.67390000 42.68610000 43.12370000 34.87400000 19.00910000 1261 46.81620000 22.14060000 64.82460000 16.02570000 9.385250000 37.43590000 1262 63.01910000 20.12970000 90.18320000 30.37200000 15.55960000 76.78320000 1263 62.74990000 34.35550000 90.29340000 32.62920000 20.22020000 77.76670000 1264 78.85570000 72.28420000 90.75750000 56.55430000 53.47170000 83.78110000 1265 43.60790000 35.14440000 38.61250000 12.45930000 11.48970000 13.23120000 1266 53.61020000 34.11960000 41.08170000 16.37940000 13.13770000 15.04720000 1267 63.65740000 36.33140000 48.52960000 22.81140000 17.06200000 21.38460000 1268 67.88780000 45.08940000 60.21150000 29.71230000 23.84340000 34.04030000 1269 82.68240000 53.54650000 75.09630000 45.81170000 35.94680000 54.92140000 1270 23.28060000 4.536670000 17.00300000 2.078180000 1.088020000 2.022280000 1271 22.31120000 9.006000000 13.01760000 1.905820000 1.225510000 1.204210000 1272 20.50680000 12.76300000 5.439990000 1.681200000 1.437070000 0.345561000 1273 20.12340000 16.56160000 53.16690000 6.397710000 3.796260000 23.97720000 1274 27.88470000 32.22340000 54.42860000 10.18620000 9.102990000 26.05010000 1275 28.21660000 35.95750000 73.02990000 15.36520000 12.47520000 48.99580000 1276 46.51770000 39.06810000 90.42260000 26.65250000 18.78840000 78.04330000 1277 18.78970000 3.835200000 25.62730000 1.974800000 0.954450000 4.817730000 1278 31.80020000 6.725560000 37.60000000 5.513710000 2.740170000 11.24600000 1279 32.74740000 63.83470000 57.92570000 22.29700000 30.64870000 33.21490000 1280 35.99050000 80.31010000 61.21150000 32.56750000 48.85660000 39.86160000 1281 42.42790000 96.78820000 60.61650000 45.54070000 72.19260000 42.99900000 1282 29.58180000 40.62190000 27.14470000 8.788020000 11.73280000 7.178030000 1283 58.82760000 44.15440000 31.13110000 20.14990000 19.02200000 9.877090000 1284 65.89420000 52.92000000 37.14780000 27.34450000 26.95730000 14.48100000 1285 65.54560000 59.30100000 46.12240000 30.90950000 32.37720000 21.87180000 1286 82.27590000 65.23240000 65.46260000 47.93480000 44.63710000 43.35290000 1287 93.31010000 76.94330000 68.03030000 63.24250000 61.53910000 49.09880000 1288 94.38990000 87.19740000 72.69500000 71.72830000 75.22070000 57.66010000 1289 93.41810000 86.60820000 88.17210000 75.25290000 75.90970000 82.41950000 1290 53.29130000 49.27330000 45.26100000 21.02850000 21.66960000 19.62500000 1291 62.37610000 54.22280000 47.45890000 27.41580000 27.54500000 22.24160000 1292 91.18730000 9.951890000 15.16290000 34.17450000 17.91700000 3.151450000 1293 93.68130000 12.80220000 23.14710000 36.83570000 19.48410000 5.607180000 1294 93.29800000 11.62470000 31.56030000 37.14700000 19.45260000 9.286770000 1295 93.14560000 14.33110000 40.28450000 38.21900000 20.16110000 14.68790000 1296 91.41500000 8.841860000 67.03280000 41.51280000 20.79200000 41.08250000 1297 87.18510000 7.726400000 80.24420000 41.75380000 20.43070000 60.05180000 1298 68.97070000 31.56980000 60.38760000 27.00300000 17.43830000 33.14650000 1299 70.30620000 35.01200000 70.62150000 30.95830000 20.26950000 46.30880000 1300 70.04770000 37.30100000 81.59260000 34.47610000 22.50940000 63.01300000 1301 83.50610000 46.67820000 91.22150000 49.18380000 33.59010000 81.19400000 1302 94.26810000 47.41200000 92.40100000 58.31570000 38.59580000 83.89430000 1303 56.97610000 47.18090000 55.63660000 23.79260000 21.86620000 29.02470000 1304 57.40670000 65.13240000 66.43910000 33.43920000 37.06720000 43.88880000 1305 58.48010000 65.43010000 91.85320000 41.71440000 40.66050000 84.13440000 1306 21.72170000 33.39130000 34.89950000 6.422240000 7.862090000 10.52250000 1307 19.10780000 70.51180000 48.41640000 21.32750000 35.19120000 24.86320000 1308 19.13660000 82.18150000 56.59680000 29.47210000 49.07610000 34.97680000 1309 15.73280000 89.28060000 85.84270000 41.47440000 61.26080000 77.27010000 1310 13.14380000 65.54740000 81.53350000 26.11950000 33.10210000 65.40170000 1311 12.04630000 70.55520000 93.17840000 32.45020000 39.59680000 86.92920000 1312 4.513480000 91.46300000 94.78410000 45.47490000 65.21690000 94.28930000 1313 17.98960000 62.08440000 70.43570000 21.83330000 28.89920000 48.20100000 1314 14.92120000 76.46260000 72.87940000 29.44730000 43.56230000 54.03950000 1315 10.53370000 76.24820000 78.82790000 30.68430000 43.82310000 62.91090000 1316 8.995660000 66.30180000 60.48030000 20.66270000 31.46410000 36.29330000 1317 56.66090000 65.58880000 61.02650000 32.05790000 36.81970000 37.35180000 1318 57.96780000 79.17440000 61.99260000 40.13320000 51.72610000 40.92580000 1319 16.14690000 62.13910000 17.29770000 13.68670000 25.65620000 6.226740000 1320 19.62630000 70.39090000 14.48530000 17.92650000 33.73830000 6.918520000 1321 18.75500000 81.69550000 15.67290000 24.26870000 46.50760000 9.304650000 1322 35.64330000 87.24060000 58.30180000 36.26050000 57.37630000 38.04620000 1323 24.92420000 44.02250000 39.28730000 10.14000000 13.69690000 14.23270000 1324 92.92030000 45.22180000 52.72970000 45.75000000 32.34380000 26.98950000 1325 91.71690000 72.48310000 77.26680000 61.95340000 56.91470000 61.37710000 1326 50.51570000 43.21630000 45.91840000 18.09440000 17.34040000 19.47730000 1327 55.52440000 42.02250000 57.62460000 21.99060000 18.60390000 30.58170000 1328 36.07860000 17.71890000 24.27490000 5.978770000 4.170240000 4.694980000 1329 41.67640000 14.34360000 24.83720000 7.360030000 4.438660000 4.891180000 1330 43.45160000 10.27280000 35.63710000 8.700990000 4.626050000 10.21770000 1331 68.34510000 12.02140000 38.94220000 20.46340000 10.79050000 12.89480000 1332 67.66660000 35.09350000 43.31510000 23.90980000 17.30190000 17.10550000 1333 53.50820000 30.18810000 33.67710000 14.63910000 11.16740000 10.02290000 1334 71.86360000 62.81730000 32.32400000 34.30810000 36.60760000 13.15190000 1335 55.52360000 43.89520000 23.64600000 17.91180000 17.82770000 6.466460000 1336 65.09090000 81.61000000 32.75360000 40.46010000 54.63270000 16.53960000 1337 40.60920000 50.10750000 9.305230000 13.60370000 18.61630000 3.386940000 1338 54.06280000 66.41680000 10.19650000 25.32060000 34.62370000 5.973020000 1339 62.58200000 66.33770000 12.90490000 29.41150000 36.66680000 6.575480000 1340 90.31720000 75.18700000 18.93540000 52.52550000 55.37720000 10.35630000 1341 89.48070000 81.32160000 35.49380000 56.83850000 62.77830000 18.81940000 1342 98.27870000 91.75180000 35.16350000 71.09590000 80.37260000 21.26680000 1343 53.47620000 73.28290000 28.89250000 29.63700000 41.94020000 12.70090000 1344 53.65560000 85.70130000 29.22480000 37.16160000 56.82840000 15.33520000 1345 25.53130000 38.87220000 9.246350000 6.620030000 10.04690000 2.093790000 1346 23.95260000 42.48480000 55.87110000 12.23940000 13.80970000 28.32060000 1347 23.89400000 47.63030000 56.71840000 13.95430000 16.98390000 29.72800000 1348 24.95660000 55.99290000 63.00750000 18.47120000 23.59500000 37.83940000 1349 32.50820000 64.17840000 73.71190000 26.19560000 32.45500000 53.26050000 1350 33.49440000 77.67230000 75.77190000 34.03980000 46.87030000 58.65260000 1351 46.67130000 31.61110000 34.29710000 12.27350000 10.34630000 10.34270000 1352 49.19460000 29.84490000 58.92890000 16.80930000 11.73040000 30.94820000 1353 55.96940000 30.62240000 68.08590000 21.90720000 14.33110000 42.23770000 1354 36.67160000 22.12650000 51.97220000 10.11690000 6.645710000 23.18150000 1355 56.52030000 20.23980000 62.19990000 19.17680000 10.73430000 34.36150000 1356 67.49460000 24.26130000 68.50830000 26.81510000 15.27300000 42.71730000 1357 81.48440000 33.32100000 84.20440000 41.84340000 24.87820000 67.42190000 1358 19.53530000 40.04690000 18.23540000 6.343270000 10.31560000 3.898350000 1359 26.70980000 50.32530000 24.44240000 10.97430000 17.28930000 7.028070000 1360 89.22210000 59.03820000 30.11230000 44.60060000 39.50320000 12.02920000 1361 49.38740000 32.18660000 14.95290000 11.97160000 10.52760000 2.849940000 1362 57.01390000 42.63330000 12.37190000 17.65160000 17.22060000 3.348820000 1363 57.80090000 49.55300000 9.913030000 20.09820000 21.68200000 3.712670000 1364 66.62030000 61.83290000 10.42610000 29.42770000 33.59910000 5.590180000 1365 75.93830000 74.17920000 8.014210000 41.12090000 48.71430000 7.603570000 1366 75.64920000 80.25540000 27.85390000 45.45290000 56.03330000 14.11070000 1367 77.49100000 81.11840000 40.41580000 48.56630000 58.25830000 21.58820000 1368 24.77270000 24.47010000 9.836810000 3.644070000 4.267270000 1.208430000 1369 65.28400000 40.67320000 12.31800000 21.26970000 18.28550000 3.354600000 1370 79.37380000 45.25940000 10.80200000 31.20220000 25.35560000 3.958610000 1371 92.59050000 45.22340000 9.589990000 41.16330000 30.47820000 4.259310000 1372 92.47240000 57.14200000 10.38800000 45.28590000 38.83680000 5.760290000 1373 95.79270000 77.77170000 7.755180000 58.15510000 60.51340000 8.957810000 1374 43.17080000 39.10300000 8.697070000 11.12000000 12.45520000 2.258100000 1375 49.89060000 37.95120000 31.44550000 14.60030000 13.66700000 9.298290000 1376 56.27290000 39.58540000 84.24400000 28.68410000 20.27380000 67.29370000 1377 57.78570000 44.18990000 94.83090000 34.34060000 24.65830000 87.13890000 1378 13.37640000 12.20150000 44.46690000 3.881240000 2.169880000 16.13280000 1379 10.57270000 8.880130000 49.82920000 4.369720000 2.060550000 20.61530000 1380 45.72370000 9.076480000 58.66210000 13.14490000 6.402610000 29.81940000 1381 58.30920000 3.686140000 72.81920000 21.60270000 10.13640000 47.91540000 1382 83.37590000 20.10710000 76.70540000 38.77120000 20.38330000 54.69380000 1383 53.79250000 30.63750000 50.23060000 17.16850000 12.32900000 22.28690000 1384 67.89000000 32.08250000 52.52890000 24.91120000 16.69310000 24.87310000 1385 77.93560000 36.69560000 53.81320000 32.39770000 22.02260000 26.76020000 1386 17.58500000 8.598190000 8.065160000 1.135240000 0.817757000 0.470715000 1387 37.30110000 11.91510000 6.228700000 5.086930000 3.111110000 0.543597000 1388 39.72790000 10.50970000 13.16740000 5.876450000 3.379660000 1.438010000 1389 52.89750000 16.18610000 8.935880000 10.90510000 6.579240000 1.162250000 1390 77.62440000 16.42250000 8.832210000 24.38540000 13.56040000 1.787600000 1391 89.14880000 30.58670000 9.217900000 34.77030000 21.83650000 2.882700000 1392 90.72860000 29.02860000 54.79040000 40.45610000 23.79750000 27.65580000 1393 92.21300000 32.89750000 91.93040000 52.60610000 29.99110000 81.64630000 1394 35.18160000 9.191850000 33.10820000 5.920540000 3.147640000 8.616690000 1395 54.29950000 11.14590000 33.15610000 12.64560000 6.761220000 8.986300000 1396 64.76240000 18.56730000 32.91780000 18.31100000 10.56740000 9.291030000 1397 61.77100000 34.81750000 31.00780000 19.18270000 14.94590000 9.078140000 1398 64.85870000 42.99050000 38.01170000 23.65050000 20.23660000 13.93420000 1399 90.52570000 75.10450000 51.01810000 56.29110000 56.82920000 29.53920000 END_DATA CAL DESCRIPTOR "Argyll Device Calibration State" ORIGINATOR "Argyll dispcal" CREATED "Sat Mar 14 19:07:36 2009" KEYWORD "DEVICE_CLASS" DEVICE_CLASS "DISPLAY" KEYWORD "COLOR_REP" COLOR_REP "RGB" BEGIN_ARGYLL_DISPCAL_ARGS -qm -w0.3127,0.3290 -f0 -k0 END_ARGYLL_DISPCAL_ARGS KEYWORD "RGB_I" NUMBER_OF_FIELDS 4 BEGIN_DATA_FORMAT RGB_I RGB_R RGB_G RGB_B END_DATA_FORMAT NUMBER_OF_SETS 256 BEGIN_DATA 0.00000 0.00000 0.00000 0.00000 0.00392 0.00392 0.00392 0.00392 0.00784 0.00784 0.00784 0.00784 0.01176 0.01176 0.01176 0.01176 0.01569 0.01569 0.01569 0.01569 0.01961 0.01961 0.01961 0.01961 0.02353 0.02353 0.02353 0.02353 0.02745 0.02745 0.02745 0.02745 0.03137 0.03137 0.03137 0.03137 0.03529 0.03529 0.03529 0.03529 0.03922 0.03922 0.03922 0.03922 0.04314 0.04314 0.04314 0.04314 0.04706 0.04706 0.04706 0.04706 0.05098 0.05098 0.05098 0.05098 0.05490 0.05490 0.05490 0.05490 0.05882 0.05882 0.05882 0.05882 0.06275 0.06275 0.06275 0.06275 0.06667 0.06667 0.06667 0.06667 0.07059 0.07059 0.07059 0.07059 0.07451 0.07451 0.07451 0.07451 0.07843 0.07843 0.07843 0.07843 0.08235 0.08235 0.08235 0.08235 0.08627 0.08627 0.08627 0.08627 0.09020 0.09020 0.09020 0.09020 0.09412 0.09412 0.09412 0.09412 0.09804 0.09804 0.09804 0.09804 0.10196 0.10196 0.10196 0.10196 0.10588 0.10588 0.10588 0.10588 0.10980 0.10980 0.10980 0.10980 0.11373 0.11373 0.11373 0.11373 0.11765 0.11765 0.11765 0.11765 0.12157 0.12157 0.12157 0.12157 0.12549 0.12549 0.12549 0.12549 0.12941 0.12941 0.12941 0.12941 0.13333 0.13333 0.13333 0.13333 0.13725 0.13725 0.13725 0.13725 0.14118 0.14118 0.14118 0.14118 0.14510 0.14510 0.14510 0.14510 0.14902 0.14902 0.14902 0.14902 0.15294 0.15294 0.15294 0.15294 0.15686 0.15686 0.15686 0.15686 0.16078 0.16078 0.16078 0.16078 0.16471 0.16471 0.16471 0.16471 0.16863 0.16863 0.16863 0.16863 0.17255 0.17255 0.17255 0.17255 0.17647 0.17647 0.17647 0.17647 0.18039 0.18039 0.18039 0.18039 0.18431 0.18431 0.18431 0.18431 0.18824 0.18824 0.18824 0.18824 0.19216 0.19216 0.19216 0.19216 0.19608 0.19608 0.19608 0.19608 0.20000 0.20000 0.20000 0.20000 0.20392 0.20392 0.20392 0.20392 0.20784 0.20784 0.20784 0.20784 0.21176 0.21176 0.21176 0.21176 0.21569 0.21569 0.21569 0.21569 0.21961 0.21961 0.21961 0.21961 0.22353 0.22353 0.22353 0.22353 0.22745 0.22745 0.22745 0.22745 0.23137 0.23137 0.23137 0.23137 0.23529 0.23529 0.23529 0.23529 0.23922 0.23922 0.23922 0.23922 0.24314 0.24314 0.24314 0.24314 0.24706 0.24706 0.24706 0.24706 0.25098 0.25098 0.25098 0.25098 0.25490 0.25490 0.25490 0.25490 0.25882 0.25882 0.25882 0.25882 0.26275 0.26275 0.26275 0.26275 0.26667 0.26667 0.26667 0.26667 0.27059 0.27059 0.27059 0.27059 0.27451 0.27451 0.27451 0.27451 0.27843 0.27843 0.27843 0.27843 0.28235 0.28235 0.28235 0.28235 0.28627 0.28627 0.28627 0.28627 0.29020 0.29020 0.29020 0.29020 0.29412 0.29412 0.29412 0.29412 0.29804 0.29804 0.29804 0.29804 0.30196 0.30196 0.30196 0.30196 0.30588 0.30588 0.30588 0.30588 0.30980 0.30980 0.30980 0.30980 0.31373 0.31373 0.31373 0.31373 0.31765 0.31765 0.31765 0.31765 0.32157 0.32157 0.32157 0.32157 0.32549 0.32549 0.32549 0.32549 0.32941 0.32941 0.32941 0.32941 0.33333 0.33333 0.33333 0.33333 0.33725 0.33725 0.33725 0.33725 0.34118 0.34118 0.34118 0.34118 0.34510 0.34510 0.34510 0.34510 0.34902 0.34902 0.34902 0.34902 0.35294 0.35294 0.35294 0.35294 0.35686 0.35686 0.35686 0.35686 0.36078 0.36078 0.36078 0.36078 0.36471 0.36471 0.36471 0.36471 0.36863 0.36863 0.36863 0.36863 0.37255 0.37255 0.37255 0.37255 0.37647 0.37647 0.37647 0.37647 0.38039 0.38039 0.38039 0.38039 0.38431 0.38431 0.38431 0.38431 0.38824 0.38824 0.38824 0.38824 0.39216 0.39216 0.39216 0.39216 0.39608 0.39608 0.39608 0.39608 0.40000 0.40000 0.40000 0.40000 0.40392 0.40392 0.40392 0.40392 0.40784 0.40784 0.40784 0.40784 0.41176 0.41176 0.41176 0.41176 0.41569 0.41569 0.41569 0.41569 0.41961 0.41961 0.41961 0.41961 0.42353 0.42353 0.42353 0.42353 0.42745 0.42745 0.42745 0.42745 0.43137 0.43137 0.43137 0.43137 0.43529 0.43529 0.43529 0.43529 0.43922 0.43922 0.43922 0.43922 0.44314 0.44314 0.44314 0.44314 0.44706 0.44706 0.44706 0.44706 0.45098 0.45098 0.45098 0.45098 0.45490 0.45490 0.45490 0.45490 0.45882 0.45882 0.45882 0.45882 0.46275 0.46275 0.46275 0.46275 0.46667 0.46667 0.46667 0.46667 0.47059 0.47059 0.47059 0.47059 0.47451 0.47451 0.47451 0.47451 0.47843 0.47843 0.47843 0.47843 0.48235 0.48235 0.48235 0.48235 0.48627 0.48627 0.48627 0.48627 0.49020 0.49020 0.49020 0.49020 0.49412 0.49412 0.49412 0.49412 0.49804 0.49804 0.49804 0.49804 0.50196 0.50196 0.50196 0.50196 0.50588 0.50588 0.50588 0.50588 0.50980 0.50980 0.50980 0.50980 0.51373 0.51373 0.51373 0.51373 0.51765 0.51765 0.51765 0.51765 0.52157 0.52157 0.52157 0.52157 0.52549 0.52549 0.52549 0.52549 0.52941 0.52941 0.52941 0.52941 0.53333 0.53333 0.53333 0.53333 0.53725 0.53725 0.53725 0.53725 0.54118 0.54118 0.54118 0.54118 0.54510 0.54510 0.54510 0.54510 0.54902 0.54902 0.54902 0.54902 0.55294 0.55294 0.55294 0.55294 0.55686 0.55686 0.55686 0.55686 0.56078 0.56078 0.56078 0.56078 0.56471 0.56471 0.56471 0.56471 0.56863 0.56863 0.56863 0.56863 0.57255 0.57255 0.57255 0.57255 0.57647 0.57647 0.57647 0.57647 0.58039 0.58039 0.58039 0.58039 0.58431 0.58431 0.58431 0.58431 0.58824 0.58824 0.58824 0.58824 0.59216 0.59216 0.59216 0.59216 0.59608 0.59608 0.59608 0.59608 0.60000 0.60000 0.60000 0.60000 0.60392 0.60392 0.60392 0.60392 0.60784 0.60784 0.60784 0.60784 0.61176 0.61176 0.61176 0.61176 0.61569 0.61569 0.61569 0.61569 0.61961 0.61961 0.61961 0.61961 0.62353 0.62353 0.62353 0.62353 0.62745 0.62745 0.62745 0.62745 0.63137 0.63137 0.63137 0.63137 0.63529 0.63529 0.63529 0.63529 0.63922 0.63922 0.63922 0.63922 0.64314 0.64314 0.64314 0.64314 0.64706 0.64706 0.64706 0.64706 0.65098 0.65098 0.65098 0.65098 0.65490 0.65490 0.65490 0.65490 0.65882 0.65882 0.65882 0.65882 0.66275 0.66275 0.66275 0.66275 0.66667 0.66667 0.66667 0.66667 0.67059 0.67059 0.67059 0.67059 0.67451 0.67451 0.67451 0.67451 0.67843 0.67843 0.67843 0.67843 0.68235 0.68235 0.68235 0.68235 0.68627 0.68627 0.68627 0.68627 0.69020 0.69020 0.69020 0.69020 0.69412 0.69412 0.69412 0.69412 0.69804 0.69804 0.69804 0.69804 0.70196 0.70196 0.70196 0.70196 0.70588 0.70588 0.70588 0.70588 0.70980 0.70980 0.70980 0.70980 0.71373 0.71373 0.71373 0.71373 0.71765 0.71765 0.71765 0.71765 0.72157 0.72157 0.72157 0.72157 0.72549 0.72549 0.72549 0.72549 0.72941 0.72941 0.72941 0.72941 0.73333 0.73333 0.73333 0.73333 0.73725 0.73725 0.73725 0.73725 0.74118 0.74118 0.74118 0.74118 0.74510 0.74510 0.74510 0.74510 0.74902 0.74902 0.74902 0.74902 0.75294 0.75294 0.75294 0.75294 0.75686 0.75686 0.75686 0.75686 0.76078 0.76078 0.76078 0.76078 0.76471 0.76471 0.76471 0.76471 0.76863 0.76863 0.76863 0.76863 0.77255 0.77255 0.77255 0.77255 0.77647 0.77647 0.77647 0.77647 0.78039 0.78039 0.78039 0.78039 0.78431 0.78431 0.78431 0.78431 0.78824 0.78824 0.78824 0.78824 0.79216 0.79216 0.79216 0.79216 0.79608 0.79608 0.79608 0.79608 0.80000 0.80000 0.80000 0.80000 0.80392 0.80392 0.80392 0.80392 0.80784 0.80784 0.80784 0.80784 0.81176 0.81176 0.81176 0.81176 0.81569 0.81569 0.81569 0.81569 0.81961 0.81961 0.81961 0.81961 0.82353 0.82353 0.82353 0.82353 0.82745 0.82745 0.82745 0.82745 0.83137 0.83137 0.83137 0.83137 0.83529 0.83529 0.83529 0.83529 0.83922 0.83922 0.83922 0.83922 0.84314 0.84314 0.84314 0.84314 0.84706 0.84706 0.84706 0.84706 0.85098 0.85098 0.85098 0.85098 0.85490 0.85490 0.85490 0.85490 0.85882 0.85882 0.85882 0.85882 0.86275 0.86275 0.86275 0.86275 0.86667 0.86667 0.86667 0.86667 0.87059 0.87059 0.87059 0.87059 0.87451 0.87451 0.87451 0.87451 0.87843 0.87843 0.87843 0.87843 0.88235 0.88235 0.88235 0.88235 0.88627 0.88627 0.88627 0.88627 0.89020 0.89020 0.89020 0.89020 0.89412 0.89412 0.89412 0.89412 0.89804 0.89804 0.89804 0.89804 0.90196 0.90196 0.90196 0.90196 0.90588 0.90588 0.90588 0.90588 0.90980 0.90980 0.90980 0.90980 0.91373 0.91373 0.91373 0.91373 0.91765 0.91765 0.91765 0.91765 0.92157 0.92157 0.92157 0.92157 0.92549 0.92549 0.92549 0.92549 0.92941 0.92941 0.92941 0.92941 0.93333 0.93333 0.93333 0.93333 0.93725 0.93725 0.93725 0.93725 0.94118 0.94118 0.94118 0.94118 0.94510 0.94510 0.94510 0.94510 0.94902 0.94902 0.94902 0.94902 0.95294 0.95294 0.95294 0.95294 0.95686 0.95686 0.95686 0.95686 0.96078 0.96078 0.96078 0.96078 0.96471 0.96471 0.96471 0.96471 0.96863 0.96863 0.96863 0.96863 0.97255 0.97255 0.97255 0.97255 0.97647 0.97647 0.97647 0.97647 0.98039 0.98039 0.98039 0.98039 0.98431 0.98431 0.98431 0.98431 0.98824 0.98824 0.98824 0.98824 0.99216 0.99216 0.99216 0.99216 0.99608 0.99608 0.99608 0.99608 1.00000 1.00000 1.00000 1.00000 END_DATA sf32%D3֮? e wdesc SII REPEATERDisplayCAL-3.1.0.0/DisplayCAL/presets/video_madVR.icc0000644000076500000000000035352012647526507022011 0ustar devwheel00000000000000Pargl mntrRGB XYZ ;acspMSFT-argl5W@*-i߬ desc cprt/wtptbkptvcgtrXYZ gXYZ bXYZ4rTRCHgTRCHbTRCHtargXarts$,desc%DisplayCAL calibration preset: madVRtextCreated with DisplayCAL and Argyll CMSXYZ QXYZ vcgt  !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~  !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~  !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~XYZ o8XYZ bXYZ $curv3textCTI3 DESCRIPTOR "Argyll Calibration Target chart information 3" ORIGINATOR "Argyll dispread" CREATED "Sat Mar 14 19:00:55 2009" KEYWORD "DEVICE_CLASS" DEVICE_CLASS "DISPLAY" KEYWORD "APPROX_WHITE_POINT" APPROX_WHITE_POINT "95.045781 100.000003 108.905751" KEYWORD "DARK_REGION_EMPHASIS" DARK_REGION_EMPHASIS "1.6" KEYWORD "ACCURATE_EXPECTED_VALUES" ACCURATE_EXPECTED_VALUES "true" KEYWORD "COLOR_REP" COLOR_REP "RGB_XYZ" KEYWORD "BLACK_COLOR_PATCHES" BLACK_COLOR_PATCHES "4" KEYWORD "COMP_GREY_STEPS" COMP_GREY_STEPS "97" KEYWORD "SINGLE_DIM_STEPS" SINGLE_DIM_STEPS "33" KEYWORD "WHITE_COLOR_PATCHES" WHITE_COLOR_PATCHES "4" KEYWORD "USE_BLACK_POINT_COMPENSATION" USE_BLACK_POINT_COMPENSATION "NO" KEYWORD "HIRES_B2A" HIRES_B2A "NO" KEYWORD "AUTO_OPTIMIZE" AUTO_OPTIMIZE "9" KEYWORD "3DLUT_SOURCE_PROFILE" 3DLUT_SOURCE_PROFILE "ref/Rec709.icm" KEYWORD "3DLUT_GAMMA" 3DLUT_GAMMA "-2.4" KEYWORD "3DLUT_DEGREE_OF_BLACK_OUTPUT_OFFSET" 3DLUT_DEGREE_OF_BLACK_OUTPUT_OFFSET "0.0" KEYWORD "3DLUT_INPUT_ENCODING" 3DLUT_INPUT_ENCODING "t" KEYWORD "3DLUT_OUTPUT_ENCODING" 3DLUT_OUTPUT_ENCODING "t" KEYWORD "3DLUT_GAMUT_MAPPING_MODE" 3DLUT_GAMUT_MAPPING_MODE "G" KEYWORD "3DLUT_RENDERING_INTENT" 3DLUT_RENDERING_INTENT "aw" KEYWORD "3DLUT_FORMAT" 3DLUT_FORMAT "madVR" KEYWORD "3DLUT_SIZE" 3DLUT_SIZE "65" BEGIN_ARGYLL_COLPROF_ARGS -qh -bl -ax END_ARGYLL_COLPROF_ARGS NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT SAMPLE_ID RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 1399 BEGIN_DATA 1 100.0000000 100.0000000 100.0000000 95.04580000 100.0000000 108.9060000 2 36.18660000 40.25050000 29.03860000 10.43240000 12.41520000 8.082730000 3 75.62240000 56.57030000 28.01850000 33.62140000 32.37170000 10.24120000 4 82.79480000 56.83720000 43.69100000 40.46860000 35.84890000 20.10110000 5 19.47590000 14.15960000 0.000000000 1.614820000 1.553530000 0.214771000 6 20.94060000 9.655240000 0.000000000 1.533610000 1.101250000 0.131754000 7 21.64610000 0.000000000 9.880980000 1.535610000 0.778814000 0.651906000 8 64.49270000 50.86790000 23.72350000 24.56660000 24.58230000 7.448250000 9 78.94490000 73.49390000 36.37540000 44.63550000 49.75270000 17.48580000 10 0.000000000 15.10070000 0.000000000 0.559497000 1.119080000 0.186522000 11 0.000000000 9.493670000 0.000000000 0.201613000 0.403256000 0.067212600 12 11.29030000 0.000000000 0.000000000 0.340406000 0.175489000 0.015935900 13 13.15790000 0.000000000 0.000000000 0.476651000 0.245728000 0.022314200 14 13.21410000 8.186610000 0.000000000 0.626698000 0.539183000 0.071050300 15 6.646220000 6.646220000 6.646220000 0.244634000 0.257385000 0.280307000 16 9.493670000 9.493670000 9.493670000 0.535904000 0.563838000 0.614052000 17 15.10070000 0.000000000 0.000000000 0.645261000 0.332651000 0.030207600 18 17.12330000 0.000000000 0.000000000 0.850733000 0.438578000 0.039826700 19 19.23080000 0.000000000 0.000000000 1.098130000 0.566119000 0.051408600 20 21.42860000 0.000000000 0.000000000 1.393190000 0.718230000 0.065221500 21 23.72260000 0.000000000 0.000000000 1.742400000 0.898261000 0.081569800 22 26.11940000 0.000000000 0.000000000 2.153160000 1.110020000 0.100799000 23 28.62600000 0.000000000 0.000000000 2.633900000 1.357850000 0.123305000 24 31.25000000 0.000000000 0.000000000 3.194240000 1.646720000 0.149537000 25 34.00000000 0.000000000 0.000000000 3.845230000 1.982330000 0.180013000 26 36.88520000 0.000000000 0.000000000 4.599570000 2.371210000 0.215327000 27 39.91600000 0.000000000 0.000000000 5.471880000 2.820920000 0.256164000 28 43.10340000 0.000000000 0.000000000 6.479100000 3.340170000 0.303316000 29 46.46020000 0.000000000 0.000000000 7.640830000 3.939070000 0.357702000 30 50.00000000 0.000000000 0.000000000 8.979910000 4.629410000 0.420390000 31 53.73830000 0.000000000 0.000000000 10.52300000 5.424900000 0.492628000 32 57.69230000 0.000000000 0.000000000 12.30120000 6.341650000 0.575877000 33 61.88120000 0.000000000 0.000000000 14.35140000 7.398570000 0.671854000 34 66.32650000 0.000000000 0.000000000 16.71680000 8.618020000 0.782591000 35 71.05260000 0.000000000 0.000000000 19.44890000 10.02650000 0.910491000 36 76.08700000 0.000000000 0.000000000 22.60880000 11.65550000 1.058420000 37 81.46070000 0.000000000 0.000000000 26.26990000 13.54290000 1.229810000 38 87.20930000 0.000000000 0.000000000 30.52020000 15.73410000 1.428790000 39 93.37350000 0.000000000 0.000000000 35.46650000 18.28400000 1.660350000 40 100.0000000 0.000000000 0.000000000 41.23850000 21.25960000 1.930560000 41 13.02300000 15.75260000 0.000000000 1.079970000 1.468310000 0.226506000 42 10.68380000 10.68380000 10.68380000 0.694840000 0.731058000 0.796164000 43 4.491020000 0.000000000 0.000000000 0.044824300 0.023108300 0.002098430 44 7.201650000 7.201650000 7.201650000 0.291861000 0.307074000 0.334421000 45 0.000000000 1.445090000 0.000000000 0.003210470 0.006421420 0.001070290 46 0.000000000 2.941180000 0.000000000 0.015321700 0.030645700 0.005107870 47 0.000000000 4.491020000 0.000000000 0.038866600 0.077738900 0.012957100 48 7.763980000 7.763980000 7.763980000 0.344338000 0.362287000 0.394551000 49 0.000000000 13.15790000 0.000000000 0.413298000 0.826656000 0.137783000 50 0.000000000 17.12330000 0.000000000 0.737658000 1.475430000 0.245916000 51 0.000000000 19.23080000 0.000000000 0.952175000 1.904490000 0.317431000 52 0.000000000 21.42860000 0.000000000 1.208020000 2.416210000 0.402721000 53 0.000000000 23.72260000 0.000000000 1.510810000 3.021850000 0.503667000 54 0.000000000 26.11940000 0.000000000 1.866980000 3.734230000 0.622403000 55 0.000000000 28.62600000 0.000000000 2.283820000 4.567970000 0.761366000 56 0.000000000 31.25000000 0.000000000 2.769680000 5.539770000 0.923340000 57 0.000000000 34.00000000 0.000000000 3.334140000 6.668780000 1.111520000 58 0.000000000 36.88520000 0.000000000 3.988220000 7.977030000 1.329570000 59 0.000000000 39.91600000 0.000000000 4.744590000 9.489890000 1.581730000 60 0.000000000 43.10340000 0.000000000 5.617940000 11.23670000 1.872880000 61 0.000000000 46.46020000 0.000000000 6.625260000 13.25150000 2.208690000 62 0.000000000 50.00000000 0.000000000 7.786350000 15.57390000 2.595770000 63 0.000000000 53.73830000 0.000000000 9.124320000 18.25000000 3.041810000 64 0.000000000 57.69230000 0.000000000 10.66620000 21.33400000 3.555850000 65 0.000000000 61.88120000 0.000000000 12.44390000 24.88960000 4.148480000 66 0.000000000 66.32650000 0.000000000 14.49490000 28.99200000 4.832240000 67 0.000000000 71.05260000 0.000000000 16.86390000 33.73020000 5.621980000 68 0.000000000 76.08700000 0.000000000 19.60380000 39.21050000 6.535400000 69 0.000000000 81.46070000 0.000000000 22.77820000 45.55980000 7.593680000 70 0.000000000 87.20930000 0.000000000 26.46360000 52.93120000 8.822290000 71 0.000000000 93.37350000 0.000000000 30.75250000 61.50950000 10.25210000 72 0.000000000 100.0000000 0.000000000 35.75730000 71.51990000 11.92060000 73 28.34880000 100.0000000 70.37100000 46.66960000 76.18290000 55.93060000 74 67.98480000 100.0000000 74.26580000 62.78950000 84.37210000 62.15630000 75 83.59200000 100.0000000 74.15010000 72.91270000 89.59460000 62.46250000 76 100.0000000 100.0000000 79.29620000 87.83280000 97.11460000 70.92110000 77 9.863630000 9.892620000 0.000000000 0.473628000 0.571849000 0.085421100 78 0.000000000 0.000000000 2.941180000 0.007734280 0.003093910 0.040730200 79 0.000000000 0.000000000 4.491020000 0.019619500 0.007848320 0.103320000 80 0.000000000 0.000000000 6.097560000 0.038438800 0.015376500 0.202426000 81 0.000000000 0.000000000 13.15790000 0.208629000 0.083457100 1.098680000 82 0.000000000 0.000000000 17.12330000 0.372364000 0.148955000 1.960940000 83 0.000000000 0.000000000 19.23080000 0.480650000 0.192272000 2.531190000 84 0.000000000 0.000000000 21.42860000 0.609797000 0.243934000 3.211300000 85 0.000000000 0.000000000 23.72260000 0.762647000 0.305078000 4.016240000 86 0.000000000 0.000000000 26.11940000 0.942436000 0.376999000 4.963040000 87 0.000000000 0.000000000 28.62600000 1.152850000 0.461170000 6.071130000 88 0.000000000 0.000000000 31.25000000 1.398110000 0.559281000 7.362710000 89 0.000000000 0.000000000 34.00000000 1.683050000 0.673263000 8.863250000 90 0.000000000 0.000000000 36.88520000 2.013220000 0.805340000 10.60200000 91 0.000000000 0.000000000 39.91600000 2.395030000 0.958075000 12.61270000 92 0.000000000 0.000000000 43.10340000 2.835890000 1.134430000 14.93430000 93 0.000000000 0.000000000 46.46020000 3.344380000 1.337840000 17.61210000 94 0.000000000 0.000000000 50.00000000 3.930490000 1.572300000 20.69870000 95 0.000000000 0.000000000 53.73830000 4.605880000 1.842470000 24.25540000 96 0.000000000 0.000000000 66.32650000 7.316920000 2.926960000 38.53230000 97 0.000000000 0.000000000 71.05260000 8.512740000 3.405320000 44.82970000 98 0.000000000 0.000000000 76.08700000 9.895840000 3.958590000 52.11330000 99 0.000000000 0.000000000 81.46070000 11.49830000 4.599600000 60.55200000 100 0.000000000 0.000000000 87.20930000 13.35860000 5.343790000 70.34900000 101 0.000000000 0.000000000 93.37350000 15.52360000 6.209840000 81.75010000 102 0.000000000 0.000000000 100.0000000 18.05000000 7.220460000 95.05460000 103 55.83310000 0.000000000 79.89610000 22.46440000 10.30840000 58.55950000 104 65.71360000 65.46360000 80.69580000 41.72460000 41.11790000 64.77050000 105 0.000000000 16.36620000 11.20940000 0.814484000 1.394420000 0.994951000 106 11.90480000 11.90480000 11.90480000 0.881537000 0.927487000 1.010090000 107 7.763980000 0.000000000 0.000000000 0.149401000 0.077020800 0.006994160 108 0.000000000 7.763980000 0.000000000 0.129544000 0.259107000 0.043186600 109 0.000000000 0.000000000 7.763980000 0.065392700 0.026158800 0.344370000 110 0.000000000 6.097560000 0.000000000 0.076147800 0.152307000 0.025385700 111 6.097560000 0.000000000 0.000000000 0.087820400 0.045274000 0.004111270 112 0.000000000 0.000000000 1.445090000 0.001620620 0.000648290 0.008534490 113 0.476190000 0.476190000 0.476190000 0.000742788 0.000781505 0.000851104 114 0.957854000 0.957854000 0.957854000 0.003454370 0.003634430 0.003958100 115 1.445090000 1.445090000 1.445090000 0.008533690 0.008978510 0.009778110 116 9.493670000 0.000000000 0.000000000 0.232518000 0.119870000 0.010885200 117 1.937980000 1.937980000 1.937980000 0.016272000 0.017120200 0.018644900 118 0.000000000 0.000000000 9.493670000 0.101773000 0.040711700 0.535954000 119 2.436650000 2.436650000 2.436650000 0.026923800 0.028327200 0.030850000 120 2.941180000 2.941180000 2.941180000 0.040726400 0.042849200 0.046665300 121 3.451680000 3.451680000 3.451680000 0.057908400 0.060926800 0.066352800 122 3.968250000 3.968250000 3.968250000 0.078694900 0.082796800 0.090170500 123 4.491020000 4.491020000 4.491020000 0.103310000 0.108695000 0.118376000 124 5.020080000 5.020080000 5.020080000 0.131981000 0.138860000 0.151227000 125 0.000000000 0.000000000 11.29030000 0.148995000 0.059601800 0.784634000 126 5.555560000 5.555560000 5.555560000 0.164935000 0.173533000 0.188987000 127 6.097560000 6.097560000 6.097560000 0.202407000 0.212957000 0.231923000 128 8.333330000 8.333330000 8.333330000 0.402325000 0.423296000 0.460994000 129 12.52720000 12.52720000 12.52720000 0.986096000 1.037500000 1.129890000 130 13.15790000 13.15790000 13.15790000 1.098580000 1.155840000 1.258780000 131 13.79690000 13.79690000 13.79690000 1.219340000 1.282900000 1.397150000 132 14.44440000 14.44440000 14.44440000 1.348750000 1.419050000 1.545430000 133 15.76580000 15.76580000 15.76580000 1.635060000 1.720280000 1.873490000 134 16.43990000 16.43990000 16.43990000 1.792770000 1.886220000 2.054200000 135 17.12330000 17.12330000 17.12330000 1.960760000 2.062960000 2.246680000 136 17.81610000 17.81610000 17.81610000 2.139470000 2.250990000 2.451450000 137 18.51850000 18.51850000 18.51850000 2.329370000 2.450790000 2.669050000 138 19.23080000 19.23080000 19.23080000 2.530960000 2.662880000 2.900030000 139 19.95310000 19.95310000 19.95310000 2.744730000 2.887800000 3.144980000 140 20.68560000 20.68560000 20.68560000 2.971230000 3.126100000 3.404510000 141 21.42860000 21.42860000 21.42860000 3.211000000 3.378370000 3.679240000 142 22.18230000 22.18230000 22.18230000 3.464630000 3.645220000 3.969850000 143 23.72260000 23.72260000 23.72260000 4.015870000 4.225190000 4.601480000 144 24.50980000 24.50980000 24.50980000 4.314770000 4.539670000 4.943970000 145 25.30860000 25.30860000 25.30860000 4.630100000 4.871440000 5.305280000 146 26.11940000 26.11940000 26.11940000 4.962580000 5.221250000 5.686240000 147 26.94240000 26.94240000 26.94240000 5.312950000 5.589890000 6.087710000 148 27.77780000 27.77780000 27.77780000 5.682010000 5.978180000 6.510580000 149 28.62600000 28.62600000 28.62600000 6.070570000 6.386990000 6.955800000 150 29.48720000 29.48720000 29.48720000 6.479480000 6.817220000 7.424350000 151 30.36180000 30.36180000 30.36180000 6.909660000 7.269820000 7.917250000 152 31.25000000 31.25000000 31.25000000 7.362030000 7.745770000 8.435590000 153 32.15220000 32.15220000 32.15220000 7.837590000 8.246120000 8.980490000 154 33.06880000 33.06880000 33.06880000 8.337360000 8.771940000 9.553140000 155 34.00000000 34.00000000 34.00000000 8.862420000 9.324370000 10.15480000 156 34.94620000 34.94620000 34.94620000 9.413920000 9.904620000 10.78670000 157 35.90790000 35.90790000 35.90790000 9.993030000 10.51390000 11.45030000 158 36.88520000 36.88520000 36.88520000 10.60100000 11.15360000 12.14690000 159 37.87880000 37.87880000 37.87880000 11.23920000 11.82500000 12.87810000 160 38.88890000 38.88890000 38.88890000 11.90880000 12.52960000 13.64540000 161 39.91600000 39.91600000 39.91600000 12.61150000 13.26890000 14.45060000 162 40.96050000 40.96050000 40.96050000 13.34870000 14.04450000 15.29520000 163 42.02280000 42.02280000 42.02280000 14.12190000 14.85800000 16.18120000 164 43.10340000 43.10340000 43.10340000 14.93290000 15.71130000 17.11050000 165 44.20290000 44.20290000 44.20290000 15.78340000 16.60610000 18.08500000 166 45.32160000 45.32160000 45.32160000 16.67530000 17.54450000 19.10700000 167 46.46020000 46.46020000 46.46020000 17.61050000 18.52840000 20.17850000 168 47.61900000 47.61900000 47.61900000 18.59100000 19.56000000 21.30200000 169 48.79880000 48.79880000 48.79880000 19.61900000 20.64160000 22.47990000 170 50.00000000 50.00000000 50.00000000 20.69670000 21.77560000 23.71480000 171 51.22320000 51.22320000 51.22320000 21.82670000 22.96440000 25.00950000 172 52.46910000 52.46910000 52.46910000 23.01130000 24.21070000 26.36680000 173 53.73830000 53.73830000 53.73830000 24.25320000 25.51740000 27.78990000 174 55.03140000 55.03140000 55.03140000 25.55520000 26.88730000 29.28180000 175 56.34920000 56.34920000 56.34920000 26.92030000 28.32360000 30.84600000 176 57.69230000 57.69230000 57.69230000 28.35170000 29.82950000 32.48600000 177 59.06150000 59.06150000 59.06150000 29.85250000 31.40860000 34.20580000 178 60.45750000 60.45750000 60.45750000 31.42640000 33.06450000 36.00910000 179 61.88120000 61.88120000 61.88120000 33.07690000 34.80100000 37.90030000 180 63.33330000 63.33330000 63.33330000 34.80800000 36.62230000 39.88380000 181 64.81480000 64.81480000 64.81480000 36.62380000 38.53280000 41.96440000 182 66.32650000 66.32650000 66.32650000 38.52870000 40.53700000 44.14710000 183 67.86940000 67.86940000 67.86940000 40.52730000 42.63970000 46.43710000 184 69.44440000 69.44440000 69.44440000 42.62450000 44.84630000 48.84020000 185 71.05260000 71.05260000 71.05260000 44.82550000 47.16200000 51.36210000 186 72.69500000 72.69500000 72.69500000 47.13590000 49.59280000 54.00940000 187 74.37280000 74.37280000 74.37280000 49.56140000 52.14480000 56.78870000 188 76.08700000 76.08700000 76.08700000 52.10840000 54.82460000 59.70710000 189 77.83880000 77.83880000 77.83880000 54.78350000 57.63910000 62.77220000 190 79.62960000 79.62960000 79.62960000 57.59360000 60.59570000 65.99220000 191 81.46070000 81.46070000 81.46070000 60.54640000 63.70230000 69.37550000 192 83.33330000 83.33330000 83.33330000 63.64960000 66.96740000 72.93130000 193 85.24900000 85.24900000 85.24900000 66.91200000 70.39970000 76.66940000 194 87.20930000 87.20930000 87.20930000 70.34240000 74.00900000 80.60010000 195 89.21570000 89.21570000 89.21570000 73.95070000 77.80530000 84.73450000 196 91.26980000 91.26980000 91.26980000 77.74700000 81.79960000 89.08440000 197 100.0000000 100.0000000 91.96320000 92.00840000 98.78500000 92.91030000 198 100.0000000 81.60980000 76.74380000 74.19320000 71.03720000 62.66260000 199 100.0000000 84.45000000 86.88810000 79.14620000 75.87800000 79.93090000 200 10.94810000 0.000000000 9.601720000 0.422464000 0.205741000 0.564354000 201 0.000000000 0.000000000 15.10070000 0.282430000 0.112979000 1.487330000 202 0.000000000 10.33340000 22.67520000 0.933476000 0.762126000 3.717550000 203 29.91970000 0.000000000 42.70670000 5.681600000 2.608070000 14.76950000 204 44.35130000 0.000000000 67.30290000 14.45470000 6.579090000 40.11370000 205 49.52420000 69.01080000 78.69820000 35.26760000 40.43180000 61.81220000 206 23.75210000 70.09500000 0.000000000 18.11520000 33.63920000 5.538480000 207 53.09250000 71.70330000 0.000000000 27.45220000 39.69580000 6.215520000 208 100.0000000 85.42810000 33.11380000 68.11600000 72.47760000 18.72450000 209 100.0000000 91.35830000 69.54470000 78.67070000 83.13580000 54.46620000 210 46.72430000 20.89060000 43.02070000 11.70290000 7.402950000 15.61430000 211 66.90700000 19.55090000 51.63590000 22.24650000 12.44730000 23.34420000 212 0.000000000 0.000000000 57.69230000 5.384230000 2.153830000 28.35430000 213 0.000000000 45.59070000 80.88170000 17.67500000 17.24030000 61.72840000 214 0.000000000 62.98100000 84.26860000 25.32340000 30.82840000 69.54960000 215 0.000000000 45.08500000 59.05490000 11.86950000 14.67140000 31.91550000 216 0.000000000 64.62960000 71.11170000 22.22020000 30.79730000 49.47620000 217 0.000000000 52.38060000 57.51790000 13.97350000 19.39080000 31.04160000 218 0.000000000 69.86820000 68.43220000 24.08930000 35.64120000 46.69180000 219 0.000000000 70.48080000 100.0000000 34.61680000 40.35660000 100.5780000 220 0.000000000 79.35790000 100.0000000 39.55510000 50.23390000 102.2240000 221 0.000000000 88.78420000 100.0000000 45.57600000 62.27660000 104.2310000 222 0.000000000 41.38020000 31.03300000 6.512640000 10.82310000 8.962870000 223 0.000000000 58.32010000 30.07070000 12.20790000 22.36190000 10.40700000 224 47.77500000 37.97340000 0.000000000 12.37600000 12.69220000 1.797710000 225 61.25000000 46.87190000 0.000000000 20.78650000 20.74470000 2.908840000 226 70.64520000 60.11200000 0.000000000 30.87940000 33.25200000 4.791160000 227 83.29470000 84.23340000 0.000000000 52.10640000 63.26250000 9.465270000 228 65.23390000 68.26600000 0.000000000 31.56060000 39.19800000 5.902970000 229 68.39920000 78.31160000 14.21970000 39.02120000 51.09640000 9.103550000 230 74.32500000 100.0000000 38.72730000 59.47160000 83.48650000 24.72720000 231 79.58850000 100.0000000 84.97470000 73.33500000 89.43500000 79.53460000 232 0.000000000 18.62310000 21.20980000 1.483450000 2.013140000 3.435440000 233 0.000000000 25.31750000 31.72670000 3.188680000 4.064940000 8.193120000 234 0.000000000 34.90900000 45.97710000 6.801720000 8.374630000 18.38980000 235 68.27620000 43.77400000 49.31960000 27.44230000 22.33530000 22.85580000 236 76.82380000 70.03830000 53.78700000 44.04710000 46.43160000 30.83190000 237 0.000000000 32.92980000 28.79140000 4.275250000 6.682900000 7.184590000 238 0.000000000 73.75240000 63.54720000 24.96480000 39.27720000 41.17270000 239 0.000000000 100.0000000 77.27440000 45.99600000 75.61560000 65.83920000 240 0.000000000 100.0000000 88.30430000 49.48760000 77.01240000 84.22670000 241 0.000000000 100.0000000 100.0000000 53.80730000 78.74040000 106.9750000 242 0.000000000 39.39160000 61.53190000 10.81250000 11.69960000 34.20710000 243 0.000000000 44.09460000 100.0000000 23.95600000 19.03330000 97.02350000 244 0.000000000 52.35390000 100.0000000 26.66540000 24.45240000 97.92680000 245 0.000000000 61.07990000 100.0000000 30.14230000 31.40680000 99.08590000 246 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 247 41.54630000 0.000000000 12.81390000 6.172290000 3.159260000 1.316250000 248 70.31060000 0.000000000 23.65710000 19.76310000 10.10090000 4.881600000 249 84.78780000 0.000000000 47.23920000 32.15640000 16.17690000 19.61110000 250 100.0000000 0.000000000 52.92420000 45.69230000 23.04130000 25.38520000 251 100.0000000 0.000000000 63.08060000 47.79090000 23.88080000 36.43710000 252 100.0000000 0.000000000 86.90030000 54.49320000 26.56190000 71.73250000 253 68.22890000 19.45920000 60.43860000 24.73070000 13.51140000 32.56630000 254 48.72460000 0.000000000 34.30220000 10.20000000 5.060170000 9.434580000 255 53.83400000 0.000000000 45.04880000 13.68920000 6.696250000 16.95140000 256 67.68530000 0.000000000 45.44390000 20.66480000 10.28540000 17.59420000 257 81.86040000 0.000000000 57.65320000 31.93040000 15.84010000 29.55520000 258 85.37840000 0.000000000 88.42760000 42.90120000 20.52610000 73.89210000 259 35.12170000 51.67870000 44.44730000 15.53660000 20.08960000 18.96210000 260 35.46710000 50.54140000 54.26730000 16.89880000 20.00510000 27.63910000 261 35.06590000 58.32980000 61.56210000 21.25310000 26.46190000 36.54150000 262 37.98160000 74.68580000 93.19550000 39.18280000 46.35280000 87.91110000 263 64.46880000 83.77100000 100.0000000 57.97760000 63.76650000 103.8650000 264 78.79220000 83.70940000 100.0000000 66.64850000 68.17850000 104.2600000 265 100.0000000 91.11700000 100.0000000 88.43020000 86.76780000 106.7000000 266 24.52780000 0.000000000 30.82510000 3.231760000 1.509370000 7.232100000 267 26.78640000 0.000000000 70.09100000 10.53740000 4.478100000 43.61270000 268 32.26250000 0.000000000 100.0000000 21.47630000 8.986810000 95.21500000 269 41.60570000 26.46420000 100.0000000 25.96590000 14.15420000 95.97590000 270 43.49310000 55.64040000 100.0000000 34.50830000 30.32830000 98.64760000 271 49.41410000 69.26280000 100.0000000 42.74380000 43.62120000 100.7790000 272 87.38650000 68.53030000 100.0000000 64.28200000 54.17770000 101.6820000 273 100.0000000 70.32150000 100.0000000 75.77310000 61.45180000 102.4810000 274 57.05340000 10.24880000 17.93840000 12.65460000 6.830390000 2.813580000 275 81.57000000 0.000000000 14.12310000 26.59130000 13.68040000 2.517210000 276 100.0000000 100.0000000 53.18250000 81.49750000 94.58040000 37.55820000 277 23.05960000 26.79320000 0.000000000 3.611640000 4.793350000 0.734901000 278 34.13740000 29.37270000 0.000000000 6.296380000 6.834130000 0.987346000 279 32.55640000 80.25540000 32.30620000 27.04300000 46.49410000 15.43350000 280 58.17970000 100.0000000 36.82360000 50.29410000 78.78240000 23.07030000 281 83.54270000 100.0000000 54.40440000 68.25880000 87.72880000 38.14210000 282 89.27070000 100.0000000 66.01880000 75.12900000 90.98060000 51.56490000 283 66.72690000 72.46480000 50.02420000 38.48400000 45.52900000 27.38440000 284 100.0000000 87.27330000 56.80130000 72.94790000 76.35770000 38.16730000 285 57.75510000 51.51830000 31.22700000 22.04240000 23.54810000 10.70030000 286 100.0000000 53.93300000 31.98570000 51.90720000 40.24400000 12.74600000 287 100.0000000 64.63140000 35.47410000 56.77890000 49.38620000 16.22570000 288 100.0000000 67.54200000 48.16870000 59.94480000 52.88140000 26.02760000 289 50.82600000 34.81090000 23.64250000 13.57790000 12.12570000 5.592940000 290 74.50760000 34.78060000 23.70110000 25.85550000 18.44470000 6.187360000 291 74.80590000 60.99490000 100.0000000 51.88550000 42.56120000 100.0930000 292 75.51760000 71.74190000 100.0000000 57.51420000 53.13900000 101.8380000 293 0.000000000 70.77200000 33.60510000 18.35810000 34.09410000 14.21170000 294 0.000000000 85.54980000 37.24240000 27.42510000 51.56380000 19.28640000 295 0.000000000 100.0000000 38.83460000 38.01200000 72.42180000 23.79400000 296 0.000000000 100.0000000 53.37790000 40.29550000 73.33530000 35.81970000 297 0.000000000 23.42150000 12.51660000 1.655870000 3.012900000 1.474050000 298 0.000000000 33.74690000 14.29130000 3.530000000 6.660170000 2.411030000 299 76.51200000 42.82270000 64.60180000 35.33030000 25.63780000 39.28060000 300 90.95650000 61.21350000 65.16050000 52.66620000 44.37710000 42.67610000 301 35.83790000 17.90660000 19.48910000 5.626100000 4.051600000 3.080030000 302 51.74140000 23.38280000 26.49130000 12.11790000 8.307800000 6.060970000 303 86.42750000 51.87350000 84.87650000 50.94940000 37.34610000 70.49200000 304 100.0000000 57.73610000 100.0000000 69.97250000 49.84980000 100.5470000 305 0.000000000 45.49680000 16.16890000 6.655130000 12.78600000 3.837800000 306 15.40400000 54.88520000 32.03670000 11.70890000 20.05580000 10.99450000 307 25.43920000 100.0000000 91.44970000 52.61790000 78.49930000 90.10720000 308 33.60700000 100.0000000 100.0000000 57.55550000 80.67260000 107.1510000 309 0.000000000 35.99710000 66.56310000 11.15450000 10.51070000 40.09540000 310 0.000000000 37.62620000 83.49760000 16.30660000 13.19000000 65.32080000 311 25.70480000 0.000000000 22.66030000 2.768260000 1.347470000 3.728610000 312 100.0000000 0.000000000 25.12220000 42.10360000 21.60570000 6.486400000 313 100.0000000 0.000000000 34.27690000 42.95180000 21.94500000 10.95330000 314 100.0000000 0.000000000 43.47890000 44.12900000 22.41590000 17.15240000 315 16.94390000 0.000000000 19.64370000 1.334900000 0.630008000 2.691180000 316 15.27790000 8.502690000 21.40190000 1.428370000 0.901001000 3.286270000 317 11.55950000 25.56510000 33.91570000 3.813350000 4.416590000 9.425510000 318 0.000000000 53.56840000 44.48770000 12.10100000 19.33940000 19.03010000 319 0.000000000 65.37960000 51.20780000 18.18600000 29.74650000 26.49600000 320 0.000000000 82.14170000 58.76390000 28.80570000 48.64440000 37.25950000 321 0.000000000 100.0000000 65.27270000 42.82100000 74.34550000 49.11920000 322 17.92590000 21.10810000 13.36620000 2.325500000 2.908900000 1.570930000 323 24.55140000 17.89220000 17.91850000 3.103020000 2.758380000 2.525640000 324 32.26720000 35.31460000 82.87670000 18.99400000 13.79320000 64.25970000 325 20.95070000 32.28680000 39.12180000 6.593070000 7.552180000 13.12150000 326 37.29560000 37.04950000 52.32510000 13.08390000 12.22260000 24.43800000 327 46.70300000 100.0000000 79.55160000 54.40020000 79.87020000 69.75730000 328 56.97890000 100.0000000 100.0000000 65.77650000 84.91080000 107.5360000 329 0.000000000 43.67700000 24.89290000 6.631510000 11.90730000 6.393010000 330 0.000000000 70.38840000 45.80690000 19.76090000 34.33750000 22.57910000 331 49.68160000 69.57050000 48.97210000 28.70950000 38.26910000 25.55620000 332 100.0000000 70.42320000 68.15070000 65.54230000 57.44310000 48.34500000 333 53.40590000 35.08430000 32.46350000 15.47310000 13.10500000 9.683100000 334 71.03330000 33.87260000 31.11420000 24.12880000 17.18840000 9.304860000 335 100.0000000 53.27580000 42.16010000 52.89220000 40.24650000 19.14000000 336 100.0000000 77.17180000 53.54310000 66.03140000 63.53800000 32.73470000 337 100.0000000 21.12680000 0.000000000 42.40940000 23.60170000 2.320910000 338 100.0000000 21.04540000 18.88240000 42.86120000 23.76660000 4.749060000 339 100.0000000 21.68090000 40.48210000 44.94840000 24.72710000 15.35320000 340 100.0000000 19.02560000 51.30270000 46.32770000 24.78350000 24.14390000 341 51.58180000 24.09540000 0.000000000 11.18010000 8.084860000 0.971428000 342 71.14940000 23.40830000 0.000000000 20.97430000 12.99100000 1.402330000 343 84.52920000 36.02010000 0.000000000 32.28080000 22.26150000 2.595950000 344 100.0000000 36.08740000 0.000000000 45.03940000 28.86210000 3.197710000 345 100.0000000 73.56880000 0.000000000 59.44360000 57.67260000 7.999690000 346 100.0000000 86.17350000 0.000000000 67.01580000 72.81800000 10.52400000 347 15.10070000 15.10070000 15.10070000 1.487190000 1.564710000 1.704060000 348 10.08490000 10.08490000 10.08490000 0.612056000 0.643959000 0.701309000 349 0.000000000 11.29030000 0.000000000 0.295161000 0.590365000 0.098399100 350 11.29030000 11.29030000 11.29030000 0.784561000 0.825456000 0.898969000 351 40.36230000 32.79050000 25.84320000 9.606860000 9.417190000 6.137270000 352 47.73890000 38.56910000 47.42830000 16.01010000 14.38120000 20.27580000 353 47.51700000 39.87250000 62.61730000 19.20860000 16.18500000 35.90530000 354 59.89720000 62.95070000 100.0000000 44.33070000 39.95280000 99.98780000 355 65.58440000 75.65990000 100.0000000 53.72090000 54.35600000 102.2730000 356 100.0000000 80.84430000 100.0000000 81.68940000 73.28520000 104.4530000 357 45.74350000 22.67340000 29.48030000 9.981640000 7.034360000 7.278390000 358 53.92080000 28.84010000 42.45540000 15.66620000 11.20620000 15.71520000 359 75.30950000 29.37450000 44.14200000 27.50940000 17.42540000 17.57770000 360 38.12510000 41.34480000 22.11150000 10.72600000 13.06440000 5.381190000 361 37.85270000 75.21170000 41.88290000 26.64260000 41.80040000 20.61920000 362 44.94770000 100.0000000 44.47740000 45.90030000 76.39790000 28.25450000 363 27.82910000 42.06700000 60.86510000 13.85740000 14.35010000 33.78830000 364 45.53960000 54.98260000 60.91670000 22.97550000 25.38920000 35.49780000 365 50.84600000 73.25150000 74.56890000 36.81720000 44.65890000 56.30190000 366 58.24590000 83.01470000 75.60540000 46.06580000 57.87310000 59.89470000 367 41.79670000 60.83140000 53.76490000 22.65020000 28.93640000 28.56060000 368 52.81550000 100.0000000 57.36450000 51.20410000 78.86900000 40.39600000 369 52.66790000 100.0000000 69.15840000 53.84640000 79.91880000 54.63510000 370 63.00490000 100.0000000 83.41090000 62.80050000 84.06240000 76.40560000 371 28.23840000 0.000000000 17.02260000 2.923680000 1.464790000 2.055330000 372 44.93150000 13.47710000 100.0000000 25.58450000 11.75150000 95.53220000 373 56.74050000 24.06330000 100.0000000 31.46820000 16.45240000 96.12950000 374 70.66040000 33.59710000 100.0000000 40.51140000 23.62180000 97.03690000 375 86.98590000 44.71320000 100.0000000 54.48830000 35.04640000 98.50550000 376 23.51830000 10.56320000 76.16640000 11.88310000 5.358990000 52.39810000 377 38.74230000 20.56940000 76.20250000 16.15720000 8.821790000 52.89550000 378 59.54810000 39.57380000 75.90410000 27.68750000 20.04860000 54.00770000 379 72.45280000 58.73980000 76.83110000 41.50840000 36.70560000 57.89050000 380 93.37350000 93.37350000 93.37350000 81.74250000 86.00330000 93.66260000 381 95.52850000 95.52850000 95.52850000 85.94890000 90.42900000 98.48230000 382 97.73660000 97.73660000 97.73660000 90.37880000 95.08980000 103.5580000 383 0.000000000 15.57160000 35.87560000 2.492600000 1.954910000 10.17380000 384 0.000000000 19.86960000 35.08170000 2.826180000 2.767670000 9.836340000 385 27.00260000 20.61760000 50.36790000 7.420640000 5.011740000 21.51350000 386 26.97610000 29.77110000 61.05270000 10.89920000 8.610580000 33.05190000 387 41.67990000 28.86190000 62.91330000 14.85750000 10.35940000 35.36250000 388 45.94140000 77.64390000 71.80230000 36.66280000 48.32450000 53.05850000 389 47.79290000 80.80180000 83.00370000 42.48890000 53.73860000 70.94300000 390 46.83360000 84.04540000 100.0000000 50.22460000 60.02910000 103.5520000 391 0.000000000 21.06240000 64.94430000 8.148840000 5.120820000 37.17600000 392 0.000000000 29.32450000 67.53760000 10.02210000 7.862490000 40.89930000 393 0.000000000 48.99920000 72.75430000 16.41530000 18.48380000 49.70770000 394 100.0000000 49.20250000 74.82600000 58.29300000 40.10810000 54.66890000 395 100.0000000 64.00690000 80.14890000 65.73690000 52.50670000 64.82720000 396 57.06540000 42.30960000 47.42200000 20.90060000 18.37720000 20.78400000 397 62.55650000 48.61410000 48.63840000 25.71670000 23.69730000 22.60750000 398 22.94690000 22.94690000 22.94690000 3.732700000 3.927270000 4.277020000 399 25.02750000 20.22760000 23.59470000 3.777880000 3.440350000 4.415270000 400 25.09310000 20.96920000 34.81140000 4.895900000 4.029210000 9.811340000 401 100.0000000 37.77550000 37.72810000 47.55720000 30.51260000 14.47380000 402 100.0000000 39.36850000 47.13230000 49.29280000 31.84640000 21.64230000 403 100.0000000 46.32630000 60.42730000 53.78340000 36.81210000 35.52010000 404 100.0000000 60.04890000 63.27230000 59.48270000 47.19590000 40.55120000 405 58.97390000 17.19250000 0.000000000 13.65450000 8.144180000 0.852494000 406 82.86290000 20.24720000 0.000000000 28.34100000 16.19380000 1.632350000 407 100.0000000 56.66120000 18.74620000 51.94430000 41.94590000 7.741180000 408 100.0000000 77.13630000 20.41770000 61.99010000 61.88860000 11.55330000 409 100.0000000 100.0000000 21.17330000 77.58970000 93.01710000 16.97890000 410 10.24510000 0.000000000 17.23850000 0.652821000 0.292900000 2.002950000 411 0.000000000 12.12380000 19.33590000 0.831656000 0.885062000 2.676800000 412 0.000000000 0.000000000 61.88120000 6.281580000 2.512790000 33.08000000 413 42.03990000 0.000000000 85.33520000 18.86810000 8.256090000 67.35420000 414 57.02950000 0.000000000 100.0000000 30.04260000 13.40300000 95.61610000 415 78.47000000 0.000000000 100.0000000 42.24540000 19.69390000 96.18730000 416 100.0000000 0.000000000 100.0000000 59.28850000 28.48010000 96.98520000 417 100.0000000 24.20990000 100.0000000 60.86840000 31.64020000 97.51190000 418 37.22360000 0.000000000 35.69940000 6.566480000 3.168800000 10.08650000 419 46.36570000 0.000000000 50.64270000 11.64910000 5.538560000 21.64440000 420 57.03430000 0.000000000 64.07960000 18.77760000 8.896980000 36.28130000 421 100.0000000 0.000000000 74.74930000 50.75570000 25.06680000 52.05020000 422 100.0000000 36.75840000 74.33500000 54.59820000 32.93740000 52.76080000 423 100.0000000 41.64100000 86.47080000 59.55680000 36.91970000 72.71190000 424 100.0000000 42.18430000 100.0000000 64.64630000 39.19660000 98.77130000 425 63.15820000 0.000000000 28.23930000 16.12970000 8.186080000 6.594990000 426 74.75620000 0.000000000 36.88390000 23.76130000 12.01720000 11.61930000 427 85.46240000 0.000000000 35.39810000 31.03080000 15.78490000 11.05120000 428 0.000000000 17.76410000 50.28520000 4.779700000 3.191680000 21.22580000 429 0.000000000 17.81970000 86.07750000 13.78560000 6.803070000 68.62520000 430 0.000000000 16.51100000 100.0000000 18.73090000 8.582350000 95.28160000 431 0.000000000 35.62870000 100.0000000 21.74550000 14.61200000 96.28660000 432 41.47440000 38.77230000 100.0000000 28.45350000 19.19150000 96.81710000 433 47.94840000 48.96450000 100.0000000 33.67560000 26.31570000 97.91700000 434 62.63830000 53.19290000 100.0000000 41.71230000 32.66470000 98.71900000 435 19.99000000 35.89980000 32.71870000 6.500080000 8.750990000 9.453920000 436 25.64450000 100.0000000 45.32760000 40.99300000 73.85320000 28.69900000 437 66.12700000 100.0000000 50.96560000 56.46310000 81.72080000 34.28600000 438 44.36640000 53.42320000 28.54190000 17.05640000 22.03280000 9.357920000 439 48.49150000 65.47570000 33.87810000 24.15380000 33.17620000 13.88350000 440 59.17360000 73.79380000 78.23160000 41.85410000 47.57180000 62.11740000 441 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 442 2.941180000 0.000000000 0.000000000 0.017670400 0.009109590 0.000827230 443 8.909850000 8.909850000 8.909850000 0.466089000 0.490383000 0.534056000 444 44.40240000 84.74530000 0.000000000 31.76340000 53.26340000 8.607160000 445 44.03720000 100.0000000 0.000000000 42.54910000 75.02130000 12.23850000 446 73.93760000 100.0000000 0.000000000 56.98530000 82.46350000 12.91430000 447 86.67970000 100.0000000 0.000000000 65.87140000 87.04460000 13.33030000 448 100.0000000 100.0000000 0.000000000 76.99580000 92.77950000 13.85110000 449 100.0000000 100.0000000 66.02370000 84.23940000 95.67720000 51.99760000 450 35.78880000 15.73370000 0.000000000 4.916600000 3.443800000 0.405651000 451 41.69810000 25.61310000 0.000000000 7.811900000 6.682220000 0.878167000 452 55.59570000 34.65640000 0.000000000 14.81680000 12.80100000 1.690110000 453 84.58290000 47.60900000 0.000000000 35.52610000 28.69350000 3.666440000 454 100.0000000 50.03240000 0.000000000 49.03590000 36.85570000 4.530040000 455 100.0000000 62.38890000 0.000000000 53.90800000 46.60060000 6.154260000 456 19.76820000 43.91870000 0.000000000 7.021040000 12.31090000 2.006290000 457 26.64670000 64.35390000 39.42340000 18.14420000 29.22160000 16.90000000 458 24.80520000 66.87960000 100.0000000 34.73410000 37.73770000 100.0660000 459 44.74760000 92.09100000 100.0000000 54.91630000 70.51410000 105.3290000 460 78.54690000 92.35400000 100.0000000 72.31640000 79.76290000 106.1970000 461 89.83530000 91.55390000 100.0000000 80.07780000 82.91950000 106.3980000 462 89.83820000 100.0000000 100.0000000 86.38750000 95.53640000 108.5000000 463 100.0000000 100.0000000 100.0000000 95.04580000 100.0000000 108.9060000 464 30.61980000 36.57930000 0.000000000 6.970120000 9.406820000 1.448420000 465 32.22310000 46.29290000 0.000000000 9.989990000 14.90840000 2.351210000 466 48.54030000 50.96630000 11.69310000 16.69550000 20.64520000 3.948760000 467 48.08970000 56.97300000 0.000000000 18.61860000 25.00270000 3.844950000 468 57.42180000 57.83970000 11.96540000 23.07030000 27.79820000 5.037330000 469 83.20730000 73.44680000 0.000000000 45.66340000 50.47010000 7.335580000 470 52.45290000 47.03090000 18.35860000 17.21690000 18.92930000 5.021450000 471 55.73800000 49.73010000 38.12780000 21.26300000 22.13460000 14.50220000 472 60.26610000 53.12200000 54.81130000 27.24680000 26.69770000 28.93280000 473 11.27770000 6.767730000 15.84690000 0.749378000 0.492244000 1.701600000 474 0.000000000 8.603320000 12.70520000 0.355521000 0.402004000 1.071380000 475 0.000000000 10.11480000 40.20410000 2.664990000 1.436910000 12.89110000 476 0.000000000 12.55950000 55.24120000 5.267010000 2.703920000 25.89670000 477 21.39250000 33.55170000 87.90110000 18.21900000 12.63000000 72.72660000 478 26.32970000 47.19720000 100.0000000 27.10010000 22.06840000 97.44370000 479 50.08370000 55.35810000 68.38280000 26.57820000 27.25830000 44.87740000 480 85.07940000 54.25090000 68.95970000 46.19270000 36.72490000 46.43600000 481 100.0000000 92.72810000 91.14350000 86.24540000 87.72640000 89.54530000 482 100.0000000 100.0000000 100.0000000 95.04580000 100.0000000 108.9060000 483 11.28200000 27.83220000 24.77960000 3.326090000 4.805010000 5.151920000 484 0.000000000 26.38200000 38.65840000 4.140730000 4.710250000 12.39150000 485 0.000000000 24.79990000 51.26250000 5.817880000 4.992810000 22.42090000 486 13.04630000 27.16830000 63.48920000 9.149820000 6.971790000 35.70050000 487 0.000000000 44.00680000 41.68240000 8.514450000 12.81490000 15.83310000 488 29.05200000 83.18820000 46.05850000 29.85610000 50.42700000 25.35870000 489 46.75420000 87.43330000 52.95160000 38.81980000 59.00840000 32.71630000 490 47.64710000 87.38550000 82.90270000 46.60870000 62.11100000 72.17410000 491 0.000000000 31.64850000 21.24880000 3.446540000 5.935760000 4.101780000 492 0.000000000 58.77640000 18.51730000 11.55430000 22.40260000 6.033710000 493 45.54840000 71.56150000 15.20880000 24.73240000 38.14960000 7.564200000 494 49.77640000 91.76190000 17.57810000 38.88360000 63.94070000 12.36050000 495 23.13920000 56.89240000 0.000000000 11.99320000 21.53930000 3.525550000 496 24.88550000 100.0000000 0.000000000 37.69310000 72.51780000 12.01120000 497 74.45340000 100.0000000 22.42230000 57.98600000 82.90160000 16.47760000 498 87.13760000 100.0000000 24.13940000 67.01480000 87.54250000 17.51980000 499 28.24970000 33.96910000 28.37460000 7.016560000 8.426690000 7.183570000 500 40.83400000 32.94620000 31.87820000 10.32420000 9.772500000 8.998580000 501 100.0000000 32.93960000 52.07860000 48.64700000 29.19920000 25.60570000 502 100.0000000 37.20870000 63.52700000 51.95890000 32.05350000 38.33160000 503 100.0000000 57.13860000 69.88230000 59.88830000 45.42910000 48.63360000 504 38.55020000 21.43610000 36.89510000 8.291930000 5.836890000 11.24850000 505 59.73370000 26.33850000 35.94760000 17.08280000 11.41010000 11.27390000 506 64.42260000 24.89420000 42.18150000 20.06360000 12.52490000 15.53480000 507 20.40940000 12.95690000 10.43770000 1.776510000 1.494530000 0.851985000 508 18.15310000 19.76930000 4.327400000 1.997210000 2.529660000 0.477815000 509 15.82200000 24.03100000 26.11490000 3.211410000 3.854370000 5.512790000 510 16.84860000 68.86050000 37.15060000 18.60700000 32.72530000 16.05640000 511 36.11830000 69.92240000 52.33110000 25.01620000 36.56360000 28.51330000 512 84.02830000 79.77710000 57.78090000 55.28350000 60.17520000 37.01970000 513 100.0000000 82.61000000 67.17900000 72.25480000 71.25550000 49.39170000 514 61.04100000 71.12810000 25.12030000 31.69460000 41.33450000 10.84220000 515 68.58690000 87.43940000 23.39920000 45.35280000 62.81200000 13.61280000 516 88.46170000 89.84230000 41.40930000 62.34150000 73.78330000 24.56680000 517 87.92100000 100.0000000 42.21950000 69.53750000 88.62160000 27.64420000 518 62.40780000 74.11230000 38.27490000 35.30750000 45.41860000 18.35300000 519 64.63950000 92.82480000 40.04880000 48.56500000 69.82570000 23.56470000 520 72.65580000 94.01150000 54.77130000 56.44640000 74.88960000 36.65570000 521 19.65700000 30.38680000 9.637400000 3.861770000 5.844960000 1.476080000 522 18.01450000 32.87220000 0.000000000 4.046900000 6.682290000 1.076570000 523 81.31420000 41.81490000 18.22190000 31.84820000 24.17140000 5.225230000 524 86.69920000 59.27730000 20.18930000 41.98520000 38.39070000 8.001700000 525 100.0000000 67.48680000 21.58350000 56.91640000 51.62650000 10.21320000 526 20.86420000 17.95120000 9.943050000 2.244810000 2.359220000 0.927664000 527 22.75300000 20.64220000 0.000000000 2.702270000 3.044970000 0.445348000 528 32.28610000 31.02060000 9.641560000 6.262250000 7.262050000 1.623650000 529 33.81240000 45.31770000 13.41980000 10.28880000 14.59090000 3.416180000 530 32.64550000 53.64630000 9.055120000 12.69810000 20.03080000 3.678000000 531 16.38040000 5.029340000 10.35840000 0.944802000 0.546849000 0.701951000 532 17.12060000 0.000000000 13.06010000 1.055670000 0.520523000 1.120610000 533 16.12000000 7.635410000 15.99720000 1.190450000 0.762066000 1.764980000 534 14.83030000 12.22600000 17.37040000 1.356050000 1.176750000 2.169970000 535 20.51510000 0.000000000 55.24110000 6.159820000 2.610300000 25.83150000 536 74.18930000 22.33360000 77.55190000 33.03000000 17.80030000 55.78780000 537 85.03970000 22.49630000 90.64660000 44.76360000 23.39290000 78.39140000 538 36.66110000 0.000000000 25.40800000 5.425220000 2.694420000 4.883080000 539 83.11890000 0.000000000 23.41580000 28.20140000 14.45310000 5.188420000 540 91.53260000 45.31090000 27.02380000 41.23270000 30.44820000 9.028370000 541 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 542 0.000000000 53.78440000 36.34230000 11.09020000 19.06390000 13.30940000 543 38.99700000 65.36770000 40.87710000 21.76040000 31.76790000 18.21350000 544 52.79210000 66.72470000 56.35360000 29.92000000 36.63860000 32.29750000 545 52.71670000 57.01310000 51.25340000 24.63050000 27.64650000 25.79370000 546 60.92910000 59.45420000 51.23240000 29.41270000 31.60250000 26.28570000 547 67.88940000 63.26750000 59.15770000 36.35020000 37.47930000 35.14170000 548 76.06570000 70.33510000 61.42700000 45.26720000 47.10640000 39.10400000 549 36.00080000 22.01870000 17.04370000 6.011450000 4.960370000 2.572590000 550 43.59980000 36.13760000 17.68790000 10.85680000 11.21110000 3.688030000 551 45.43090000 43.84860000 33.04630000 14.68820000 16.05050000 10.61100000 552 46.88420000 78.69230000 33.58550000 30.54370000 46.89790000 16.02990000 553 17.18100000 93.68350000 15.55630000 32.13600000 62.52190000 11.95500000 554 17.97250000 92.65330000 55.58420000 36.14050000 62.94330000 36.24890000 555 21.30290000 92.87220000 100.0000000 49.81580000 68.71500000 105.2500000 556 24.17560000 49.33120000 53.00780000 13.84480000 17.84360000 26.14120000 557 69.11040000 57.15880000 54.24930000 33.45210000 32.21730000 29.10610000 558 72.34530000 56.41780000 59.02930000 36.05290000 33.00840000 34.15220000 559 35.10160000 49.96010000 34.99290000 13.69030000 18.39010000 12.22680000 560 42.17870000 49.53100000 33.34740000 15.41680000 19.08410000 11.32510000 561 53.43340000 59.86010000 42.54300000 24.71510000 29.59650000 18.85340000 562 74.57350000 63.26860000 55.49540000 39.64090000 39.26270000 31.40230000 563 86.98430000 70.00270000 56.86280000 51.88340000 50.37500000 34.32700000 564 94.08190000 73.57610000 72.48340000 63.16430000 58.56940000 54.59760000 565 21.01220000 12.04690000 17.42020000 2.061480000 1.523470000 2.212440000 566 67.23400000 0.000000000 13.82860000 17.45670000 8.972560000 2.031960000 567 100.0000000 0.000000000 14.56500000 41.49930000 21.36400000 3.304320000 568 100.0000000 45.15130000 18.09440000 47.88060000 33.87210000 6.218590000 569 100.0000000 89.28010000 19.59460000 69.60460000 77.19470000 13.85780000 570 100.0000000 100.0000000 38.09140000 79.15660000 93.64390000 25.23050000 571 16.27190000 17.98520000 22.17040000 2.239440000 2.298630000 3.770440000 572 14.01670000 45.18920000 62.41860000 13.18320000 15.31070000 35.81880000 573 18.99200000 51.11520000 73.09580000 18.30220000 20.52320000 50.48850000 574 19.29350000 57.83830000 92.59640000 27.07260000 28.11990000 83.88880000 575 47.13690000 59.24230000 91.46800000 34.02980000 32.61580000 82.26460000 576 46.88860000 75.85580000 100.0000000 45.31970000 50.18880000 101.9110000 577 13.27060000 40.50610000 24.58790000 6.211070000 10.38160000 6.001820000 578 11.90310000 47.30160000 23.21880000 8.001850000 14.27320000 6.146540000 579 0.000000000 71.81600000 21.39940000 17.87280000 34.77550000 8.957360000 580 9.889460000 25.83390000 9.706380000 2.183620000 3.818930000 1.182160000 581 66.03030000 25.08600000 9.544040000 18.36440000 11.99180000 1.886680000 582 68.38000000 33.12260000 0.000000000 21.02410000 15.51190000 1.886280000 583 81.43930000 38.47530000 43.58590000 33.53690000 23.45050000 17.99240000 584 91.13970000 43.87750000 61.26930000 45.61520000 31.47960000 35.88670000 585 33.51640000 46.49130000 23.12900000 11.08230000 15.48040000 6.184890000 586 41.62470000 65.55930000 22.50950000 20.80860000 31.62480000 8.569430000 587 39.09880000 29.02660000 9.436070000 7.683660000 7.445380000 1.558600000 588 47.65710000 35.45630000 10.02090000 11.85140000 11.52470000 2.200800000 589 72.18710000 56.16390000 12.81340000 30.38980000 30.57140000 5.331130000 590 80.37700000 58.44370000 65.95180000 43.70790000 37.99040000 42.90780000 591 88.99580000 66.08200000 77.95220000 56.72700000 49.38430000 61.25130000 592 91.78460000 73.08740000 89.61560000 66.27960000 59.17130000 82.26950000 593 24.47440000 46.03020000 28.64020000 9.511440000 14.40700000 8.329140000 594 22.24320000 69.76370000 29.14370000 18.90990000 33.65850000 11.78620000 595 74.92220000 89.93040000 46.43160000 53.50810000 69.23410000 28.05050000 596 82.95900000 88.94490000 59.03810000 60.64430000 71.63820000 40.32250000 597 100.0000000 91.52230000 81.48580000 82.17210000 84.72180000 72.33400000 598 45.03450000 20.66470000 52.65840000 12.65480000 7.670970000 23.90220000 599 53.72920000 24.35500000 81.69030000 23.68950000 13.25290000 61.95400000 600 27.83380000 8.828420000 31.77830000 4.098730000 2.200590000 7.812470000 601 40.60120000 8.930590000 44.13610000 8.844300000 4.476090000 16.05720000 602 57.20970000 7.029410000 56.08440000 17.23990000 8.457820000 27.24550000 603 67.41690000 10.07980000 66.29390000 24.86620000 12.31650000 39.37840000 604 83.71920000 0.000000000 70.83600000 36.35410000 17.76490000 45.83560000 605 78.52330000 20.52290000 61.06100000 31.43010000 17.12950000 33.62400000 606 100.0000000 21.23380000 62.69100000 48.88630000 26.21350000 36.36480000 607 85.00120000 20.52480000 42.07850000 32.63490000 18.14490000 15.88120000 608 91.13290000 64.17060000 53.73370000 51.70560000 46.13490000 30.31840000 609 100.0000000 73.08180000 61.08780000 65.28550000 59.58720000 40.06610000 610 26.15040000 14.93200000 9.012800000 2.795420000 2.241010000 0.761094000 611 28.26600000 12.03120000 0.000000000 2.901060000 1.999520000 0.233081000 612 43.58280000 13.49900000 0.000000000 7.075830000 4.296910000 0.456543000 613 43.09630000 43.43380000 81.19570000 23.60600000 19.33270000 62.32750000 614 60.56650000 83.41310000 83.83020000 49.93220000 59.95210000 73.13390000 615 60.93400000 83.22900000 90.50130000 52.24530000 60.71250000 84.93190000 616 73.41490000 90.51630000 92.78380000 64.92900000 74.34410000 91.17210000 617 72.72810000 100.0000000 92.15440000 71.31040000 88.10660000 92.30020000 618 24.05490000 40.86220000 44.31740000 9.806520000 12.12370000 17.62450000 619 34.20180000 39.96800000 61.33950000 14.81510000 13.99010000 34.21510000 620 50.52100000 45.41190000 60.22910000 21.40660000 19.70660000 33.69940000 621 54.01600000 47.19750000 77.55110000 27.82110000 23.33320000 57.12900000 622 20.08960000 19.16670000 27.73920000 3.229870000 2.944120000 6.036910000 623 17.10040000 79.29850000 27.88650000 23.40630000 43.81530000 12.92870000 624 47.49680000 79.54390000 56.12300000 34.70430000 49.39740000 34.26750000 625 49.89310000 81.19930000 65.98360000 38.78950000 52.74040000 46.05410000 626 72.75430000 42.32810000 32.11090000 27.37040000 21.95290000 10.57490000 627 82.87780000 46.15940000 30.98950000 35.18930000 27.67900000 10.68310000 628 65.25250000 35.72640000 21.69030000 20.47140000 16.00090000 5.292600000 629 72.08460000 41.91780000 20.33430000 25.90260000 21.13510000 5.562930000 630 82.65980000 65.20770000 30.75010000 42.43990000 42.45230000 13.03090000 631 85.57390000 80.61410000 49.40870000 55.36550000 61.14920000 28.95590000 632 9.743040000 18.03620000 16.55700000 1.418900000 1.919200000 2.108330000 633 0.000000000 23.28540000 20.45090000 2.000530000 3.120840000 3.381330000 634 0.000000000 57.74660000 55.13530000 15.56170000 23.32770000 29.22700000 635 0.000000000 57.39860000 71.30380000 19.12620000 24.52770000 48.69510000 636 0.000000000 72.90340000 85.56570000 30.65620000 40.81750000 73.41520000 637 0.000000000 82.17610000 86.25440000 36.25960000 51.66040000 76.40720000 638 43.25030000 90.55320000 92.11920000 50.34300000 66.89050000 89.24350000 639 64.01310000 92.11460000 100.0000000 63.35930000 74.89160000 105.7290000 640 37.18560000 29.46270000 52.97830000 11.57940000 9.066310000 24.53770000 641 53.80240000 31.14780000 77.38360000 23.57090000 15.04760000 55.49690000 642 57.91760000 38.96520000 100.0000000 34.95670000 22.61660000 97.13550000 643 17.27420000 0.000000000 39.70910000 3.235130000 1.394310000 12.51000000 644 22.49960000 9.290780000 40.04310000 4.155040000 2.148900000 12.83790000 645 26.37300000 50.72010000 39.38780000 12.56040000 18.13560000 15.03020000 646 28.82490000 54.96190000 52.78630000 16.69010000 22.32640000 26.64180000 647 39.54670000 56.26410000 55.18790000 20.33880000 24.90710000 29.33380000 648 43.21670000 57.96170000 73.49440000 26.46210000 28.58120000 52.18530000 649 0.000000000 12.92710000 12.89570000 0.597116000 0.874942000 1.183630000 650 56.85900000 33.03400000 9.660840000 15.14900000 12.44340000 2.157920000 651 69.44780000 42.66730000 0.000000000 23.98960000 20.52330000 2.697330000 652 79.21360000 54.23070000 0.000000000 34.01170000 31.35460000 4.259880000 653 86.49030000 64.75280000 0.000000000 43.71890000 42.95090000 5.986690000 654 92.79830000 65.60920000 11.23070000 49.28740000 46.40300000 7.131530000 655 29.17280000 18.80550000 0.000000000 3.652300000 3.228650000 0.430743000 656 28.51560000 37.41760000 51.03910000 10.83990000 11.22380000 23.15090000 657 36.41860000 49.54730000 58.91270000 17.74260000 19.82650000 32.44390000 658 65.21250000 52.54370000 65.49630000 31.90670000 28.51950000 41.12850000 659 73.16400000 64.87650000 65.76840000 41.73200000 41.18280000 43.39670000 660 59.45370000 27.83610000 22.47730000 15.96720000 11.34160000 4.898290000 661 75.84910000 71.31640000 19.93170000 39.97560000 45.78980000 9.457690000 662 83.17420000 71.03910000 26.41190000 45.32310000 48.27970000 11.99310000 663 34.87770000 0.000000000 55.46690000 9.004920000 4.071940000 26.19480000 664 34.53240000 9.466650000 64.63450000 11.09190000 5.217230000 36.65660000 665 50.89930000 12.50310000 82.43510000 21.51130000 10.27490000 62.71680000 666 69.01010000 16.04420000 100.0000000 36.92980000 17.90260000 96.12170000 667 0.000000000 9.480420000 28.66380000 1.357200000 0.864532000 6.155810000 668 9.978890000 18.24330000 31.29340000 2.509790000 2.390770000 7.680040000 669 10.13370000 18.70570000 45.06590000 4.291940000 3.181490000 16.78180000 670 27.04720000 16.36700000 65.57660000 10.12910000 5.389160000 37.91210000 671 45.82180000 36.82510000 79.19860000 22.19350000 16.09280000 58.58740000 672 58.23390000 50.20080000 90.00280000 34.72970000 27.91250000 78.60670000 673 0.000000000 84.93780000 21.55530000 25.58920000 50.19360000 11.57800000 674 0.000000000 100.0000000 21.82760000 36.39240000 71.77390000 15.26480000 675 25.66410000 100.0000000 27.61850000 38.89430000 73.01400000 17.62870000 676 80.52120000 31.17720000 31.83290000 29.81980000 19.29570000 9.785600000 677 91.70420000 31.54770000 37.10210000 38.95430000 24.04510000 13.27810000 678 90.23710000 34.52550000 63.04480000 42.89190000 26.47590000 37.15320000 679 91.56160000 46.34520000 78.42920000 51.13790000 34.92380000 59.49360000 680 91.24330000 100.0000000 82.22860000 81.20660000 93.59460000 75.31320000 681 31.82140000 38.19640000 36.47830000 9.595450000 11.11360000 11.93780000 682 30.55530000 38.20240000 41.25570000 9.923680000 11.21440000 15.14100000 683 30.25970000 89.50930000 67.57440000 38.62180000 60.63340000 49.62600000 684 48.70020000 89.08840000 75.88430000 46.04630000 63.77610000 61.45090000 685 67.93730000 92.74280000 78.81670000 58.61360000 73.96210000 67.23910000 686 25.48940000 42.06780000 32.45230000 8.885100000 12.31120000 9.870990000 687 37.70120000 57.75460000 32.00750000 16.99160000 24.46230000 11.55120000 688 54.84670000 60.02530000 34.01680000 24.32900000 29.62550000 13.26790000 689 58.19120000 82.06230000 42.48220000 38.43300000 53.86470000 22.76950000 690 23.85990000 31.32110000 19.31260000 5.033360000 6.671320000 3.565510000 691 28.86210000 37.43070000 19.10200000 7.274590000 9.810820000 3.992810000 692 27.75920000 53.29410000 17.48600000 11.81090000 19.34490000 5.155470000 693 25.62090000 58.69930000 26.11720000 14.08600000 23.60240000 8.752490000 694 83.31550000 70.96980000 65.40290000 51.51870000 50.71220000 44.26190000 695 84.98240000 81.82770000 75.02310000 61.43110000 64.71440000 59.54310000 696 21.85560000 19.64770000 16.07330000 2.777130000 2.876160000 2.107040000 697 19.78060000 23.52310000 36.12960000 4.575010000 4.338060000 10.67930000 698 19.55040000 28.37630000 46.99610000 6.808710000 6.439830000 18.86210000 699 21.27100000 53.84450000 46.30250000 13.85420000 20.36390000 20.60010000 700 32.63660000 75.84370000 49.32390000 26.79500000 42.27290000 26.74210000 701 9.296120000 17.96540000 10.41760000 1.166640000 1.804110000 0.941093000 702 11.62640000 19.93890000 6.612350000 1.440020000 2.267690000 0.602626000 703 36.32110000 81.79470000 15.14410000 27.71460000 48.37750000 9.367210000 704 43.83890000 100.0000000 24.00490000 43.26480000 75.29980000 16.35750000 705 20.14560000 42.31670000 10.09510000 6.727700000 11.46420000 2.468930000 706 27.20660000 84.78290000 0.000000000 27.22650000 50.96050000 8.401720000 707 58.23280000 84.99840000 53.24140000 42.07940000 58.30310000 32.69060000 708 79.22280000 85.91870000 72.24270000 59.14830000 67.49390000 56.19210000 709 43.77480000 27.74120000 35.68380000 10.70640000 8.467620000 10.88170000 710 69.12360000 39.13290000 39.93590000 25.24650000 19.48200000 14.99780000 711 78.84320000 48.09370000 45.08620000 34.72830000 28.15450000 20.01460000 712 41.04650000 25.09110000 26.08910000 8.467680000 6.794180000 5.792550000 713 43.67160000 29.00900000 24.65860000 9.850370000 8.473420000 5.469120000 714 57.24700000 38.03990000 50.98100000 20.46340000 16.41200000 23.59130000 715 63.21830000 37.94490000 60.00190000 25.15640000 18.59240000 33.02990000 716 25.02050000 9.456150000 51.08270000 6.278920000 3.057800000 21.85560000 717 71.57470000 0.000000000 73.98450000 29.06900000 13.91120000 49.92410000 718 74.65340000 11.40000000 81.66340000 33.54540000 16.40590000 61.99940000 719 86.75910000 15.62960000 100.0000000 48.82830000 23.98360000 96.66840000 720 54.72160000 14.51550000 68.32050000 19.27340000 9.795480000 41.80950000 721 100.0000000 21.96480000 74.55020000 51.97560000 27.59570000 52.18220000 722 100.0000000 23.25010000 86.64850000 55.85430000 29.41920000 71.77040000 723 100.0000000 54.99710000 87.10590000 64.16330000 45.79290000 75.29700000 724 13.66940000 22.76260000 0.000000000 1.897950000 3.026630000 0.484189000 725 19.02520000 24.63370000 10.20580000 2.833170000 3.883610000 1.225760000 726 15.39720000 24.68270000 14.63440000 2.585610000 3.749990000 1.969310000 727 56.87270000 24.90190000 10.58300000 13.73030000 9.558990000 1.798990000 728 76.07810000 35.66230000 91.63420000 41.20100000 25.01770000 80.73120000 729 22.20000000 13.94390000 100.0000000 20.02540000 8.935940000 95.28170000 730 84.66790000 31.30690000 100.0000000 49.42910000 27.52570000 97.32050000 731 37.17870000 14.04210000 28.35970000 6.286690000 3.818470000 6.325710000 732 44.66840000 21.22830000 34.86670000 9.969910000 6.691110000 10.09030000 733 58.18100000 24.62320000 46.93670000 17.59160000 11.10850000 19.14520000 734 87.83390000 36.03170000 51.04250000 38.90400000 25.20500000 24.37390000 735 52.78360000 21.37710000 35.49880000 13.16840000 8.358920000 10.61950000 736 71.03220000 20.81890000 47.61840000 24.10080000 13.70000000 19.88000000 737 80.81230000 22.41070000 55.20620000 32.03250000 17.92840000 27.38920000 738 52.50290000 15.07810000 39.55670000 12.90380000 7.209020000 13.01830000 739 89.57760000 10.90290000 45.79520000 35.88600000 18.53190000 18.66910000 740 100.0000000 22.78460000 30.10810000 43.90920000 24.54030000 9.175450000 741 100.0000000 38.96610000 28.14980000 46.84940000 30.70440000 9.281960000 742 100.0000000 76.22370000 39.79890000 63.29940000 61.57720000 21.02330000 743 100.0000000 90.10400000 47.69480000 73.21540000 79.54900000 30.06750000 744 28.89730000 61.73290000 48.87420000 18.80600000 27.64050000 23.94010000 745 34.94950000 72.69240000 60.65610000 27.82840000 39.97680000 37.75940000 746 67.47540000 75.35750000 75.46870000 46.27290000 51.22640000 58.39760000 747 77.72330000 83.28260000 76.74160000 57.68970000 64.07870000 62.18570000 748 58.11440000 65.73460000 80.46930000 37.90470000 39.34750000 64.26630000 749 68.98370000 83.47910000 80.96760000 53.60880000 62.01360000 68.61580000 750 78.24500000 90.83850000 80.48270000 64.18610000 74.77060000 69.74020000 751 39.56340000 46.68410000 46.03820000 15.33980000 17.47000000 19.74560000 752 39.04990000 70.56480000 75.26030000 31.48540000 39.77570000 56.65770000 753 45.53060000 75.69990000 85.26470000 39.40610000 47.62620000 73.74990000 754 88.27200000 80.96840000 100.0000000 71.87070000 68.33580000 104.0150000 755 30.26620000 24.27010000 61.16330000 10.68820000 7.161330000 32.91080000 756 35.56730000 32.07120000 71.66490000 15.85300000 11.52400000 46.86000000 757 20.76450000 10.52910000 30.83470000 2.910730000 1.719600000 7.294480000 758 17.50940000 14.13270000 31.85210000 2.835180000 2.011240000 7.881380000 759 14.56360000 7.749620000 33.65860000 2.371000000 1.223730000 8.739630000 760 11.98030000 21.39490000 55.96370000 6.627490000 4.622250000 26.93900000 761 10.11670000 44.89670000 90.67240000 20.96530000 18.25000000 78.70040000 762 21.24040000 55.85960000 100.0000000 29.35160000 27.79680000 98.43070000 763 0.000000000 28.64560000 82.97680000 14.26140000 9.364850000 63.82070000 764 0.000000000 26.73490000 100.0000000 20.01510000 11.15100000 95.70970000 765 26.01060000 75.66050000 100.0000000 39.54640000 47.04910000 101.6100000 766 61.90840000 10.83850000 14.10080000 14.87800000 8.042550000 2.041760000 767 67.73010000 12.90590000 9.728820000 18.00820000 9.859400000 1.517110000 768 78.12990000 27.79300000 16.50770000 26.44910000 16.77300000 3.644650000 769 89.98800000 51.64230000 21.89920000 41.69930000 33.83460000 7.686240000 770 89.15680000 77.82800000 77.90800000 63.06720000 61.89790000 63.26450000 771 88.69880000 78.68160000 90.87150000 67.40600000 64.39230000 85.52860000 772 36.59070000 27.46250000 35.52590000 8.457470000 7.240860000 10.66820000 773 35.77920000 25.55150000 42.54340000 8.836040000 6.877900000 15.30530000 774 63.92000000 66.76370000 59.89700000 35.96490000 39.69820000 36.41610000 775 75.38760000 77.54730000 59.69330000 48.39860000 54.62740000 38.41380000 776 43.72380000 44.76850000 39.69050000 15.15760000 16.60650000 14.80520000 777 79.41020000 44.54380000 50.71490000 34.93180000 26.50570000 24.53110000 778 87.81460000 51.55460000 62.11090000 45.64970000 35.16720000 37.57790000 779 46.67210000 31.37420000 43.81030000 13.45080000 10.74280000 16.77100000 780 49.12410000 34.57860000 54.79480000 16.90510000 13.29690000 26.87440000 781 68.91670000 46.60100000 69.29490000 32.91220000 25.93830000 45.50160000 782 73.75250000 47.33510000 100.0000000 46.06400000 31.91050000 98.34410000 783 20.41850000 25.08640000 68.22640000 10.74700000 7.177500000 41.62950000 784 21.26710000 54.41540000 68.34850000 18.56580000 22.59270000 44.35390000 785 21.13110000 61.43960000 81.11670000 24.99220000 29.75420000 64.13800000 786 15.39690000 72.79180000 56.53490000 23.60800000 37.97980000 33.07890000 787 30.27220000 100.0000000 58.67940000 44.32470000 75.29110000 41.49220000 788 28.89860000 100.0000000 81.94840000 50.09690000 77.56670000 73.39860000 789 51.18170000 100.0000000 90.58800000 59.73390000 82.20300000 88.84570000 790 18.35740000 43.01520000 76.09580000 16.48250000 15.65690000 54.03750000 791 25.00140000 41.99780000 84.05210000 19.57960000 16.54830000 66.72960000 792 31.41090000 59.00470000 82.87530000 26.37970000 28.85850000 66.77610000 793 29.69900000 73.19840000 86.87520000 34.10650000 42.78230000 75.89360000 794 39.54270000 82.41800000 92.00410000 43.75840000 55.52020000 87.17880000 795 26.35040000 19.46190000 14.34850000 3.425200000 3.187890000 1.757890000 796 30.81660000 24.76470000 8.940710000 4.847440000 4.954090000 1.168310000 797 51.91350000 27.95140000 17.40620000 12.30620000 9.517000000 3.211950000 798 59.66690000 39.56370000 20.68790000 18.46360000 16.36120000 5.143540000 799 67.99170000 59.36080000 20.76020000 29.57890000 32.04300000 7.607500000 800 68.37510000 59.87240000 38.66270000 31.67890000 33.25460000 16.45290000 801 81.27620000 69.01730000 41.95030000 44.63060000 46.18600000 20.56730000 802 100.0000000 71.98380000 77.93080000 69.02310000 60.14230000 62.64690000 803 26.26190000 16.58880000 22.36370000 3.536910000 2.767380000 3.858950000 804 35.04700000 17.66140000 59.01810000 10.56020000 5.962560000 30.26280000 805 58.70750000 48.69180000 68.48470000 27.97840000 24.42190000 44.39070000 806 65.89950000 50.08080000 76.87950000 34.41900000 28.17560000 56.69110000 807 65.21410000 53.50210000 86.43140000 38.24070000 31.61690000 72.74280000 808 27.06650000 27.15410000 22.24110000 5.023910000 5.532500000 4.272110000 809 37.88950000 35.31200000 21.20110000 9.098800000 10.00160000 4.573290000 810 36.49980000 38.63670000 11.15750000 9.056290000 11.20900000 2.447270000 811 42.34130000 42.95490000 0.000000000 11.80530000 14.36340000 2.150350000 812 55.47560000 52.50190000 0.000000000 19.95460000 23.15740000 3.418350000 813 76.55450000 57.38450000 37.53620000 35.54910000 33.73500000 15.60490000 814 87.12530000 56.87610000 100.0000000 58.84270000 43.59710000 99.92650000 815 23.41250000 18.87030000 92.10730000 17.67050000 8.725660000 79.71570000 816 23.75670000 26.55110000 100.0000000 21.73340000 11.99290000 95.78170000 817 23.51790000 36.81240000 100.0000000 23.73040000 16.04420000 96.45850000 818 0.000000000 15.03870000 71.23710000 9.115890000 4.533800000 45.27090000 819 13.13390000 11.44050000 84.40330000 13.21020000 5.825460000 65.59030000 820 23.40030000 0.000000000 86.73630000 14.89060000 6.151900000 69.59180000 821 30.52560000 82.59170000 85.60940000 39.33880000 53.65700000 75.51140000 822 27.57600000 14.73950000 15.45400000 3.253740000 2.430650000 1.855350000 823 46.63490000 10.61360000 10.91830000 8.100220000 4.542420000 1.175460000 824 49.99330000 27.20380000 23.22510000 11.74690000 9.002930000 4.934250000 825 74.24540000 25.05120000 22.42600000 23.80000000 14.72030000 5.119910000 826 81.09320000 42.16010000 36.91330000 33.37760000 24.91850000 13.62130000 827 58.68070000 46.17380000 39.47560000 21.64250000 20.59050000 15.08540000 828 61.35030000 76.09540000 54.40210000 38.42250000 48.37260000 32.11550000 829 66.12540000 76.02670000 62.27190000 42.54430000 50.25070000 40.84250000 830 0.000000000 85.08570000 49.59580000 28.92800000 51.68230000 28.68910000 831 10.53400000 92.01340000 63.15140000 36.63690000 62.33460000 44.53190000 832 40.94710000 28.17990000 18.25800000 8.422650000 7.568070000 3.264580000 833 100.0000000 32.40630000 14.33690000 44.49050000 27.36100000 4.257590000 834 100.0000000 51.60970000 50.96990000 53.68690000 39.59770000 26.30560000 835 100.0000000 62.56750000 53.94140000 58.63220000 48.61830000 30.63830000 836 18.94880000 35.11170000 20.20700000 5.177600000 7.920170000 4.065200000 837 17.37540000 58.69230000 42.45010000 14.69780000 23.70560000 18.17490000 838 16.64260000 62.44560000 53.30420000 18.01840000 27.61340000 28.09620000 839 13.81360000 70.22980000 79.91810000 27.99270000 37.56080000 63.56350000 840 15.82700000 93.62380000 80.69380000 42.91110000 66.74640000 69.65150000 841 12.93780000 97.81400000 94.22920000 50.35820000 74.69900000 94.78330000 842 26.59190000 25.60550000 31.36630000 5.436470000 5.293070000 8.123740000 843 24.85190000 29.32420000 38.23370000 6.516790000 6.683090000 12.36630000 844 27.98710000 31.00830000 45.17150000 8.372880000 7.995640000 17.58060000 845 48.27530000 65.43690000 62.63120000 28.83380000 35.00940000 39.04820000 846 54.54980000 73.88490000 65.79580000 36.44200000 45.24040000 44.49320000 847 16.33650000 21.91510000 18.81660000 2.494450000 3.117250000 2.871850000 848 15.58310000 19.37090000 37.26160000 3.717650000 3.115150000 11.19630000 849 19.94810000 17.08950000 41.13640000 4.483740000 3.106310000 13.77690000 850 36.86440000 16.85320000 40.81180000 7.820990000 4.798990000 13.69610000 851 38.07260000 33.91280000 39.75760000 10.62100000 10.12330000 13.83900000 852 39.76770000 44.39690000 49.58560000 15.28180000 16.33330000 22.57610000 853 38.83820000 49.18550000 67.54300000 20.27760000 20.72380000 42.84850000 854 45.25340000 62.91740000 67.94430000 27.83310000 32.61930000 45.26980000 855 51.62810000 62.67820000 71.13850000 30.97000000 33.98190000 49.66690000 856 80.24220000 68.30650000 74.16220000 50.23060000 47.77250000 55.60280000 857 81.66510000 75.57260000 79.86050000 56.73590000 56.65080000 65.64220000 858 10.00700000 7.606290000 25.23400000 1.258500000 0.731725000 4.654040000 859 13.45270000 0.000000000 27.03560000 1.517120000 0.664693000 5.377400000 860 38.75420000 7.677200000 75.97110000 15.11680000 6.841610000 52.22110000 861 69.57370000 0.000000000 87.00920000 31.86100000 14.89010000 70.86370000 862 89.15070000 60.64520000 93.90100000 59.65530000 46.61130000 88.23750000 863 32.01160000 17.66440000 27.97890000 5.254160000 3.754740000 6.194410000 864 35.44040000 23.09410000 28.69610000 6.795860000 5.483940000 6.775880000 865 34.16380000 27.73180000 30.08020000 7.301540000 6.777710000 7.662140000 866 49.99820000 40.54560000 39.09890000 16.17850000 15.36670000 14.10930000 867 49.09800000 45.13000000 51.54460000 19.04520000 18.56020000 24.60690000 868 58.48090000 61.38060000 68.54810000 32.76440000 34.12970000 46.09620000 869 67.19920000 61.10670000 83.30390000 41.38650000 37.91070000 68.44670000 870 81.04840000 65.72380000 88.63440000 54.02860000 47.34610000 78.85430000 871 100.0000000 68.98770000 90.14730000 71.41160000 58.61930000 82.86600000 872 100.0000000 78.60200000 89.70540000 76.50960000 69.06300000 83.80370000 873 70.05840000 82.47060000 0.000000000 42.25930000 56.53180000 8.684970000 874 80.26920000 86.90470000 14.84610000 51.96510000 65.74540000 11.37800000 875 91.27030000 93.37560000 9.299470000 64.58450000 78.94190000 12.34390000 876 37.87690000 59.84480000 0.000000000 16.43690000 25.63750000 4.082420000 877 38.07400000 70.59150000 0.000000000 21.55600000 35.79320000 5.772930000 878 59.62050000 86.24950000 0.000000000 39.05090000 58.47560000 9.229210000 879 59.82670000 100.0000000 0.000000000 49.08170000 78.38900000 12.54430000 880 60.28770000 100.0000000 22.26230000 49.97170000 78.77120000 16.04750000 881 71.40600000 20.87850000 27.88440000 21.89130000 12.85370000 7.031440000 882 91.39610000 27.18320000 73.93690000 45.16520000 25.23690000 51.19300000 883 92.52880000 33.11210000 82.74820000 49.81210000 28.97500000 65.35290000 884 78.69870000 29.57060000 69.77860000 34.98420000 20.73210000 45.03850000 885 81.84240000 41.34510000 80.89320000 42.99040000 28.46550000 62.57960000 886 86.11180000 63.11320000 82.55100000 54.51660000 46.03040000 68.07050000 887 71.24740000 100.0000000 63.99440000 62.08660000 84.31230000 48.45190000 888 76.71650000 100.0000000 100.0000000 76.82960000 90.60900000 108.0530000 889 100.0000000 100.0000000 100.0000000 95.04580000 100.0000000 108.9060000 890 51.32810000 19.33590000 17.55760000 10.87000000 6.989010000 2.838600000 891 81.60820000 16.98080000 20.05280000 27.62580000 15.25630000 4.251420000 892 86.66620000 21.06800000 29.86020000 32.53250000 18.35310000 8.459000000 893 53.69280000 0.000000000 20.64050000 11.06490000 5.639430000 3.448980000 894 55.57810000 14.96940000 23.91940000 12.65710000 7.250220000 4.803310000 895 56.25500000 22.58510000 53.03060000 17.46690000 10.50120000 24.55530000 896 62.03470000 27.00290000 75.38200000 26.13390000 15.33510000 52.40250000 897 68.26460000 72.44200000 82.96980000 47.37950000 49.16840000 69.74690000 898 71.59770000 81.96390000 94.84990000 58.93590000 62.80530000 93.24300000 899 11.90110000 82.51170000 72.68880000 32.76160000 50.63980000 54.96010000 900 0.000000000 86.28700000 80.73100000 37.12500000 56.21740000 67.98400000 901 0.000000000 87.51640000 71.12470000 35.20080000 56.75490000 53.82050000 902 75.55560000 92.06090000 73.45120000 61.23030000 74.76440000 59.20530000 903 32.67890000 0.000000000 13.41390000 3.741930000 1.903940000 1.311230000 904 31.42690000 8.489940000 9.491790000 3.493550000 2.023380000 0.739693000 905 48.64320000 9.936640000 43.67820000 11.59530000 5.971370000 15.84580000 906 61.68080000 11.11170000 42.85250000 17.33410000 9.035960000 15.50590000 907 65.46480000 0.000000000 57.05460000 21.49710000 10.47550000 28.43000000 908 93.02220000 10.48130000 59.87840000 41.26740000 20.97180000 32.50120000 909 93.75350000 13.28680000 76.87590000 46.32990000 23.34210000 55.12510000 910 13.40800000 8.545560000 12.24210000 0.834796000 0.647289000 1.014090000 911 8.880180000 19.05410000 23.58510000 1.886750000 2.270920000 4.285680000 912 0.000000000 17.69510000 26.94970000 1.802500000 1.989820000 5.580970000 913 24.81140000 22.84260000 83.95160000 15.59910000 8.686830000 65.25230000 914 30.71680000 51.12150000 84.42010000 23.68820000 22.91310000 68.36510000 915 40.28500000 54.58560000 79.73410000 25.99660000 26.15530000 61.17500000 916 46.74080000 67.25990000 84.28570000 35.08350000 38.84610000 70.61190000 917 37.22150000 9.549400000 18.09400000 5.316890000 2.995660000 2.501500000 918 44.34980000 0.000000000 22.65540000 7.587470000 3.831960000 3.952500000 919 44.64790000 9.365870000 29.58430000 8.435780000 4.496260000 6.920110000 920 58.27010000 0.000000000 33.39280000 14.19150000 7.129270000 9.107490000 921 81.20510000 17.10800000 33.76850000 28.48310000 15.58540000 10.19780000 922 81.98150000 52.77930000 32.05990000 36.88970000 31.86710000 11.95980000 923 89.86630000 66.30120000 46.67430000 50.46370000 47.12660000 24.14560000 924 71.80480000 49.42420000 38.28340000 29.68000000 26.31760000 14.96830000 925 72.80000000 57.19000000 46.04260000 34.25800000 32.81600000 21.71450000 926 89.73020000 57.15720000 52.98120000 47.40830000 39.43880000 28.51510000 927 35.62410000 74.25880000 22.28930000 23.50850000 39.63090000 9.896320000 928 44.97320000 92.39710000 32.95750000 38.73460000 64.39960000 18.62740000 929 0.000000000 31.02000000 32.82600000 4.282930000 6.073690000 9.112540000 930 0.000000000 29.98560000 49.46620000 6.367980000 6.594360000 21.05890000 931 14.46500000 32.30160000 56.04380000 8.617480000 8.281460000 27.62350000 932 12.02760000 38.52470000 62.79710000 11.26760000 11.57460000 35.64770000 933 0.000000000 55.52880000 86.75520000 23.01240000 24.89690000 72.81510000 934 61.19670000 73.93140000 86.88590000 45.65760000 49.32900000 76.56730000 935 33.77550000 32.76560000 24.56810000 7.687030000 8.431040000 5.539860000 936 86.36770000 36.53450000 26.05850000 34.71910000 23.58830000 7.638200000 937 43.45890000 18.74320000 19.34640000 7.984100000 5.395780000 3.173640000 938 47.15980000 15.94380000 72.44980000 17.41190000 8.886120000 47.37110000 939 94.25500000 15.18750000 90.21090000 51.16430000 25.55570000 77.66810000 940 60.95530000 7.524820000 92.16520000 29.08950000 13.43360000 80.13180000 941 76.20180000 16.07210000 93.67510000 38.95980000 19.23180000 83.60790000 942 22.33490000 9.448260000 20.95910000 2.306380000 1.418100000 3.196570000 943 32.30040000 21.85040000 21.86000000 5.333180000 4.547830000 3.936380000 944 32.61760000 27.00830000 24.38010000 6.329230000 6.152810000 5.099350000 945 33.02240000 35.27250000 41.87220000 9.881800000 10.15360000 15.38600000 946 41.53290000 33.70110000 48.21500000 12.86970000 11.07030000 20.47800000 947 40.73540000 39.26520000 47.93210000 13.88000000 13.53560000 20.65600000 948 45.27520000 40.15510000 35.15190000 13.83710000 14.06130000 11.47760000 949 60.36090000 40.45710000 41.37790000 21.06680000 17.81680000 15.91630000 950 71.74630000 51.22430000 47.47210000 31.58740000 28.07060000 22.13450000 951 80.33760000 65.64880000 47.62780000 43.18320000 42.89310000 24.51740000 952 69.44660000 48.23470000 27.06170000 26.70850000 24.33250000 8.629660000 953 89.60630000 89.68040000 26.58190000 61.51580000 73.37840000 16.05640000 954 27.80370000 33.42660000 10.07600000 5.798110000 7.743900000 1.797280000 955 45.46640000 48.52940000 20.27950000 15.11780000 18.55650000 5.616640000 956 52.55640000 60.39410000 23.15260000 22.53930000 29.04830000 8.208560000 957 58.87030000 57.08370000 26.57330000 24.25960000 27.86370000 9.230630000 958 68.24330000 68.50640000 27.92560000 34.45280000 40.74090000 11.77090000 959 93.03510000 70.62730000 28.31390000 52.95240000 51.87650000 13.12190000 960 23.60300000 12.99950000 27.39670000 3.172340000 2.111990000 5.727330000 961 29.70780000 9.169240000 27.39500000 4.091180000 2.265520000 5.707790000 962 55.71130000 7.265520000 27.91930000 12.59450000 6.533020000 6.317030000 963 60.99610000 10.64610000 50.03890000 18.10050000 9.261640000 21.47150000 964 60.38670000 31.13590000 61.55480000 22.55660000 14.99040000 34.25010000 965 62.99510000 55.97900000 62.69500000 31.37240000 30.24610000 38.07070000 966 78.23760000 86.51820000 85.25420000 62.75150000 69.48930000 76.72170000 967 86.88270000 93.04920000 93.57230000 76.38380000 82.88440000 93.72430000 968 25.91930000 24.32220000 16.05210000 4.036180000 4.413010000 2.332430000 969 92.52810000 29.44310000 27.67260000 38.26380000 23.20960000 8.072790000 970 93.09680000 43.52290000 36.66390000 42.96140000 30.43840000 14.02530000 971 93.23620000 57.50150000 38.92800000 48.20730000 40.31080000 17.12130000 972 92.89330000 79.14710000 43.76380000 59.37850000 62.01330000 24.21110000 973 39.86480000 56.22260000 22.23530000 16.19570000 23.23460000 7.098300000 974 43.87840000 85.59220000 42.00200000 34.81340000 55.34190000 22.88990000 975 65.09800000 88.15050000 64.29700000 49.97280000 65.20010000 45.77090000 976 16.39050000 31.74530000 44.23610000 6.642200000 7.334070000 16.80300000 977 16.35290000 35.04550000 52.73490000 8.751470000 9.292110000 24.49460000 978 19.52160000 82.20810000 66.22480000 31.66770000 49.98650000 46.20330000 979 33.44030000 81.95220000 70.76190000 35.22530000 51.45260000 52.29560000 980 36.82270000 92.95540000 80.15040000 46.12830000 67.70620000 68.79660000 981 28.94450000 25.93420000 44.86170000 7.633310000 6.306250000 17.04600000 982 30.80460000 25.39280000 74.48080000 14.29190000 8.882270000 50.45440000 983 74.77430000 12.74300000 35.19970000 23.96150000 12.71490000 10.71270000 984 77.02670000 8.900220000 47.26850000 26.87610000 13.71390000 19.43870000 985 88.45840000 15.09600000 52.99420000 36.51570000 19.13910000 25.18350000 986 87.83730000 46.81370000 67.98330000 45.46720000 32.54870000 44.37810000 987 89.14820000 75.39260000 83.46730000 63.37520000 59.79390000 71.78530000 988 29.18910000 40.29660000 68.94290000 15.56060000 14.29420000 43.69810000 989 29.84900000 86.23980000 80.95900000 40.05180000 57.67200000 68.47820000 990 6.238760000 37.03560000 53.02900000 8.589660000 9.885750000 24.90270000 991 10.53270000 37.08830000 75.58680000 14.08220000 12.12610000 52.72230000 992 12.80030000 39.16630000 92.81950000 20.32120000 15.46270000 82.22540000 993 36.46140000 43.17030000 93.22220000 25.58960000 19.77450000 83.54830000 994 34.95320000 60.93350000 92.01980000 31.14790000 32.17920000 83.36760000 995 38.64640000 61.95710000 100.0000000 35.62390000 34.80470000 99.45290000 996 13.54190000 48.60270000 34.92100000 9.608530000 15.60850000 11.86250000 997 9.878450000 51.88920000 48.90410000 12.44530000 18.52570000 22.54220000 998 12.63890000 62.46190000 65.49880000 20.25610000 28.47840000 41.73770000 999 26.64480000 67.43530000 67.79910000 24.96170000 34.30000000 45.55570000 1000 40.60160000 68.59070000 66.61080000 28.67230000 37.09640000 44.36480000 1001 59.29950000 75.19960000 72.09200000 40.96100000 48.46430000 53.26530000 1002 59.92170000 94.23720000 86.50840000 57.87610000 74.91050000 80.19930000 1003 13.33200000 35.75840000 44.56980000 7.268210000 8.924870000 17.33940000 1004 10.54820000 42.87570000 51.78450000 10.09160000 12.95600000 24.22300000 1005 12.50540000 50.40910000 53.14330000 12.84780000 17.87310000 26.33130000 1006 8.450030000 52.51220000 62.34810000 15.23900000 19.99420000 36.53100000 1007 21.68840000 52.28740000 81.25070000 21.45510000 22.49490000 63.14040000 1008 49.88730000 52.09890000 91.87170000 32.43860000 27.64670000 82.14620000 1009 8.821240000 11.39540000 34.97880000 2.290520000 1.421130000 9.543800000 1010 14.59930000 14.98260000 61.72490000 7.395750000 3.907620000 33.10790000 1011 14.10740000 9.424530000 66.73070000 8.169320000 3.649570000 39.14260000 1012 23.90850000 29.84270000 93.30490000 19.77390000 12.11950000 82.53540000 1013 26.65150000 67.24050000 92.27610000 32.31380000 37.08870000 84.73730000 1014 17.89220000 22.98490000 29.23840000 3.554220000 3.785250000 6.874170000 1015 26.78680000 20.34020000 28.39470000 4.485660000 3.780880000 6.429460000 1016 30.12370000 18.37680000 33.22310000 5.407810000 3.882360000 8.849140000 1017 39.45870000 61.06610000 46.46550000 20.76650000 28.26280000 21.89560000 1018 44.97080000 69.61170000 58.38480000 28.76070000 38.12190000 34.81550000 1019 57.41040000 71.52190000 92.14250000 44.35620000 46.52700000 85.67240000 1020 76.11660000 55.58930000 70.16670000 40.73900000 34.63920000 47.94590000 1021 93.79200000 55.65580000 77.77690000 56.05830000 42.33200000 59.65510000 1022 93.54370000 62.35040000 88.69020000 62.12380000 49.20940000 78.88790000 1023 93.27060000 86.37000000 99.62020000 79.18690000 77.21740000 104.5550000 1024 50.82430000 52.68700000 57.71800000 23.43450000 24.42880000 31.73030000 1025 56.30380000 54.33480000 64.63740000 27.92140000 27.47480000 40.06950000 1026 63.38460000 57.47190000 72.36450000 34.56850000 32.50000000 50.90450000 1027 44.35940000 53.94440000 49.01870000 19.86580000 23.46750000 23.20640000 1028 45.06340000 92.48350000 68.64550000 45.14760000 67.06760000 51.93020000 1029 57.65870000 91.95190000 72.34080000 50.87350000 69.34480000 57.12360000 1030 30.71030000 56.12140000 37.03770000 15.14360000 22.47480000 14.18890000 1031 51.82790000 58.64280000 79.25340000 31.59850000 31.45440000 61.14310000 1032 75.95290000 61.71630000 91.81500000 49.85190000 42.33860000 83.95780000 1033 28.58140000 17.89510000 39.54690000 5.784250000 3.917550000 12.75150000 1034 30.53800000 14.37190000 45.23990000 6.692420000 3.830830000 16.92020000 1035 36.82620000 10.14340000 50.76480000 8.880520000 4.455000000 21.69370000 1036 84.72980000 78.93860000 66.61600000 57.28770000 60.23730000 47.33030000 1037 86.59390000 86.56590000 69.11000000 64.09390000 70.77100000 52.26470000 1038 11.68160000 42.48370000 14.08000000 6.050840000 11.17040000 3.106490000 1039 14.85290000 51.38550000 12.49370000 9.077130000 16.93400000 3.766120000 1040 51.33520000 51.82630000 34.47620000 19.67660000 22.45220000 12.39290000 1041 51.70760000 53.32240000 42.85720000 21.43830000 24.04520000 18.19020000 1042 79.76050000 79.24270000 91.25410000 61.27490000 61.70930000 86.04530000 1043 81.73540000 87.69640000 94.06730000 69.03330000 73.53880000 93.26200000 1044 9.637480000 16.56100000 24.79220000 1.766090000 1.831010000 4.665040000 1045 8.426810000 13.51910000 29.12300000 1.814890000 1.448580000 6.459980000 1046 29.53530000 40.93160000 48.68120000 11.54170000 12.96610000 21.32070000 1047 38.04610000 44.01390000 56.41150000 15.93100000 16.35380000 29.17990000 1048 46.55480000 47.72860000 57.25200000 19.99890000 20.13470000 30.58340000 1049 67.00280000 48.95870000 56.38940000 29.64860000 25.73020000 30.24370000 1050 18.13890000 12.95410000 14.93710000 1.640760000 1.406900000 1.630470000 1051 40.61070000 24.20300000 9.311020000 7.359960000 6.127100000 1.305980000 1052 47.37990000 22.08160000 8.279160000 9.343210000 6.723850000 1.200300000 1053 59.47990000 77.73100000 16.96070000 34.06710000 48.02560000 9.386050000 1054 61.64680000 91.38040000 18.90750000 44.02250000 66.18130000 12.88180000 1055 23.27830000 28.63140000 32.07190000 5.436460000 6.023690000 8.635230000 1056 32.20900000 28.59560000 39.40860000 8.020880000 7.248730000 13.18220000 1057 43.28980000 28.28540000 75.01950000 18.35840000 11.65880000 51.56670000 1058 51.45690000 30.18050000 91.93790000 27.13440000 16.06440000 80.31460000 1059 65.84450000 63.02620000 92.61690000 44.65510000 40.49430000 85.38980000 1060 71.43360000 73.38670000 93.26790000 53.27020000 52.55460000 88.50440000 1061 38.04620000 29.77510000 88.46990000 21.20120000 13.03460000 73.66540000 1062 37.36090000 48.47580000 87.41200000 25.43190000 22.35890000 73.35540000 1063 54.43930000 79.15380000 93.34380000 47.72370000 54.55780000 89.32870000 1064 63.50630000 93.57760000 93.23920000 61.56840000 75.82840000 92.50440000 1065 7.926100000 22.22180000 22.13220000 2.119590000 2.959780000 3.891350000 1066 20.51110000 27.32790000 20.88240000 3.903730000 5.007570000 3.780760000 1067 37.49590000 37.15300000 31.78370000 10.27200000 11.14380000 9.216210000 1068 74.66300000 72.09790000 46.93730000 42.52340000 47.38050000 24.83310000 1069 81.02140000 74.97800000 72.27170000 53.77750000 54.88250000 54.08170000 1070 93.26940000 83.10560000 77.29120000 69.42520000 69.94450000 63.53570000 1071 96.17430000 84.30100000 91.37660000 77.21260000 74.56000000 87.91450000 1072 62.02400000 20.07320000 22.91680000 16.17750000 9.811710000 4.746380000 1073 79.57570000 21.57180000 46.55990000 29.53750000 16.65930000 19.27210000 1074 79.02520000 34.05020000 61.16250000 34.04070000 21.80790000 34.50650000 1075 75.49590000 45.70120000 57.92530000 34.04610000 26.41040000 31.77740000 1076 92.74940000 90.56920000 63.87260000 70.43980000 78.23020000 46.68950000 1077 33.55570000 27.28480000 17.71980000 6.192170000 6.196900000 2.974320000 1078 32.86590000 41.70760000 35.46260000 10.64080000 13.03040000 11.63260000 1079 31.26790000 45.19930000 44.57690000 12.48800000 15.34370000 18.30890000 1080 35.22930000 63.20930000 79.35880000 28.05230000 32.56560000 61.71050000 1081 43.36800000 66.49810000 91.32720000 35.92960000 38.45700000 83.02890000 1082 30.92420000 51.28010000 68.64200000 19.24340000 21.22980000 44.44300000 1083 35.07750000 56.26140000 67.82570000 21.89700000 25.38520000 44.03120000 1084 64.49050000 70.17700000 75.58710000 41.87960000 44.82650000 57.56980000 1085 75.29530000 79.85080000 84.20070000 56.26070000 59.94030000 73.42360000 1086 89.18920000 93.83860000 86.60860000 76.31230000 83.97880000 81.15360000 1087 88.84590000 100.0000000 92.35600000 82.70530000 93.97260000 93.21270000 1088 9.169040000 15.34010000 17.51500000 1.185940000 1.426070000 2.264120000 1089 11.28350000 12.36420000 20.07640000 1.228760000 1.107560000 2.918540000 1090 7.758740000 8.455170000 19.87400000 0.822165000 0.596167000 2.780200000 1091 37.05060000 66.94820000 32.07420000 20.92090000 32.57990000 12.94640000 1092 73.04610000 79.71690000 48.48070000 46.06140000 55.56720000 27.54910000 1093 85.73830000 92.63570000 52.06020000 63.91560000 77.32030000 34.07180000 1094 42.95560000 20.41270000 13.78870000 7.747210000 5.578960000 1.880820000 1095 93.23600000 18.43900000 9.688770000 36.32620000 20.00370000 2.504840000 1096 53.58320000 0.000000000 12.81250000 10.65310000 5.469250000 1.525770000 1097 57.05280000 69.13620000 43.46470000 30.77150000 39.10520000 21.06680000 1098 56.63430000 91.68720000 48.33310000 45.00290000 66.64090000 29.61360000 1099 57.64850000 92.69780000 62.50090000 48.96660000 69.43430000 44.47750000 1100 19.66130000 58.77220000 58.02510000 17.71590000 24.99770000 32.47310000 1101 25.31460000 72.47990000 65.01490000 26.63030000 39.07570000 42.84380000 1102 11.02960000 36.82280000 36.45380000 6.258540000 8.898830000 11.67090000 1103 11.08770000 43.95170000 37.99980000 8.340490000 12.75720000 13.28950000 1104 65.58080000 67.43090000 37.18470000 33.38660000 39.29040000 16.56660000 1105 92.19480000 67.75010000 38.05720000 51.83380000 49.02100000 18.03480000 1106 66.72170000 47.29710000 10.64440000 23.95810000 22.56580000 3.779300000 1107 81.13310000 65.01260000 12.86390000 40.10750000 41.24670000 6.888590000 1108 92.60500000 86.12580000 8.715340000 60.65800000 69.48420000 10.65750000 1109 91.92170000 89.50420000 84.66040000 74.79940000 78.71380000 76.85130000 1110 68.42910000 64.66880000 71.64680000 40.28470000 40.12080000 51.06700000 1111 76.06900000 74.16780000 81.98420000 52.79120000 53.38250000 68.64730000 1112 89.64880000 73.63660000 96.86260000 67.49940000 59.93680000 96.21880000 1113 36.52590000 6.653190000 21.80120000 5.227210000 2.758580000 3.576900000 1114 45.40580000 9.620080000 18.95960000 7.938100000 4.346670000 2.862660000 1115 50.43670000 16.98590000 27.54760000 10.93750000 6.592140000 6.249590000 1116 62.85560000 28.05740000 31.33260000 18.44460000 12.59050000 8.829420000 1117 74.96280000 28.10250000 36.59350000 26.05200000 16.45780000 12.17380000 1118 89.32660000 30.69140000 43.10650000 37.67180000 23.04530000 17.33020000 1119 89.64230000 44.38940000 44.27510000 41.42550000 29.90610000 19.35750000 1120 64.91420000 31.97110000 9.849500000 18.96650000 14.08850000 2.298380000 1121 75.57230000 33.04720000 10.03440000 25.52090000 17.79350000 2.692290000 1122 85.30450000 79.87770000 19.61210000 51.39130000 58.82440000 11.27690000 1123 91.97640000 79.68920000 61.08980000 62.11910000 63.53970000 40.99810000 1124 18.44450000 13.68490000 22.03320000 2.100660000 1.677010000 3.611060000 1125 69.69420000 9.399170000 28.09330000 19.94390000 10.44670000 6.763860000 1126 79.69080000 9.507240000 27.21740000 26.26500000 13.72150000 6.672710000 1127 89.23370000 22.50290000 63.57020000 40.11000000 21.90520000 37.04940000 1128 88.40270000 36.11390000 70.74130000 43.68430000 27.19880000 47.14010000 1129 94.37940000 63.35040000 72.77930000 58.38940000 48.51770000 53.32860000 1130 77.39320000 52.24080000 54.37640000 36.77270000 31.14120000 28.85060000 1131 89.80560000 53.02650000 56.77220000 46.61200000 36.58420000 31.84730000 1132 89.38130000 64.63480000 61.41770000 52.08970000 46.47090000 38.61110000 1133 67.01150000 67.30320000 53.09530000 36.55290000 40.54850000 29.41230000 1134 66.27060000 82.77150000 71.18130000 48.82470000 59.20870000 53.65460000 1135 68.45550000 90.74980000 85.06040000 59.44910000 72.06890000 77.06110000 1136 10.56100000 29.55440000 16.94690000 3.107780000 5.197270000 2.747290000 1137 9.419710000 27.77370000 28.89620000 3.542420000 4.862820000 6.920990000 1138 47.57470000 39.55580000 26.80870000 13.69870000 13.85170000 7.183010000 1139 47.46410000 44.96910000 24.97900000 15.02960000 16.80460000 6.929630000 1140 58.34210000 65.54960000 52.19370000 31.05190000 36.47820000 28.04740000 1141 77.32340000 66.97260000 79.27410000 49.06240000 46.02530000 63.06800000 1142 28.64910000 12.54000000 19.04060000 3.480660000 2.292060000 2.723960000 1143 29.54650000 9.256680000 22.15070000 3.670380000 2.099560000 3.649900000 1144 50.48150000 14.17850000 51.93040000 13.93030000 7.411190000 23.08860000 1145 77.42820000 12.19430000 66.32560000 31.16090000 15.73830000 39.74750000 1146 77.62030000 43.55920000 72.91680000 38.38400000 27.28280000 50.47970000 1147 69.42030000 43.44190000 76.22470000 34.13050000 24.93290000 55.09150000 1148 69.38470000 46.96830000 90.08200000 39.59010000 28.82700000 78.67240000 1149 78.01820000 53.59180000 91.09420000 47.66220000 36.33810000 81.56770000 1150 40.79090000 47.71840000 39.45060000 15.09950000 17.94600000 14.90260000 1151 47.11630000 57.82050000 46.32210000 21.92110000 26.83000000 21.43930000 1152 9.684760000 14.42450000 6.067540000 0.786834000 1.152280000 0.380259000 1153 14.39040000 15.77450000 10.77410000 1.330690000 1.584830000 0.940377000 1154 9.530100000 23.48020000 17.24070000 2.089550000 3.226440000 2.494010000 1155 17.55600000 44.99320000 44.68800000 10.14280000 14.04020000 18.26860000 1156 47.28120000 55.38510000 55.70680000 22.67660000 25.59050000 29.87480000 1157 8.005570000 13.64210000 10.49610000 0.734212000 1.028190000 0.825008000 1158 11.34220000 6.732770000 5.279080000 0.466539000 0.377860000 0.195099000 1159 24.64160000 8.972740000 8.451470000 2.151190000 1.364280000 0.563062000 1160 28.54250000 8.715170000 13.62580000 3.009360000 1.773370000 1.364630000 1161 43.15720000 25.57530000 48.38680000 11.93640000 8.377500000 20.15670000 1162 46.67550000 48.20700000 67.32470000 22.46570000 21.37600000 42.57580000 1163 56.65420000 54.09060000 75.41710000 30.78130000 28.48980000 54.74870000 1164 77.76180000 55.02310000 81.42090000 44.81470000 36.04520000 64.80130000 1165 10.91450000 24.90070000 39.37790000 4.321330000 4.454530000 12.81690000 1166 8.910710000 23.56170000 44.53360000 4.737580000 4.300080000 16.55140000 1167 10.90510000 28.75220000 58.06560000 8.082570000 6.959600000 29.54290000 1168 12.08640000 32.00430000 78.12750000 13.80310000 10.23780000 56.22790000 1169 26.70110000 73.10540000 77.97320000 30.65730000 41.25320000 61.08790000 1170 24.41660000 82.41640000 91.71720000 40.15100000 53.67090000 86.47280000 1171 25.14990000 84.20730000 100.0000000 44.53280000 57.24850000 103.3160000 1172 15.82950000 93.94440000 72.45990000 40.77120000 66.26410000 57.22950000 1173 88.46500000 95.03620000 71.81970000 72.18080000 83.66730000 58.03320000 1174 29.62620000 31.23430000 16.76420000 5.962590000 7.140220000 2.926950000 1175 45.06340000 60.42080000 12.51640000 19.13880000 27.37420000 5.254990000 1176 51.48780000 81.02320000 11.46160000 32.24210000 50.02280000 8.763710000 1177 75.94400000 92.85820000 10.16440000 53.01420000 72.42010000 11.80490000 1178 76.26360000 93.50490000 63.61470000 60.24720000 76.08530000 46.50000000 1179 91.95130000 92.47350000 79.68370000 75.34750000 82.27220000 69.32640000 1180 66.68820000 75.49130000 68.92960000 44.14920000 50.44580000 49.15190000 1181 70.05020000 83.15650000 89.97000000 56.99100000 63.11260000 84.16800000 1182 79.31170000 94.97110000 89.47950000 70.82670000 82.27180000 86.24080000 1183 14.25120000 38.59180000 29.99520000 6.251060000 9.615260000 8.223390000 1184 8.576980000 46.06510000 74.32870000 16.08780000 16.86100000 51.67780000 1185 12.73000000 51.19000000 90.41140000 23.10410000 22.41400000 78.90930000 1186 12.45520000 62.94490000 93.80200000 29.02240000 32.33080000 86.90420000 1187 9.281660000 24.74920000 75.45220000 11.59480000 7.317300000 51.72510000 1188 7.275710000 25.22980000 87.85760000 15.43750000 8.958540000 72.08690000 1189 14.97540000 19.30710000 75.43060000 11.30310000 6.131650000 51.47960000 1190 63.18110000 16.90190000 78.22670000 26.25780000 13.38600000 56.33300000 1191 71.47950000 24.04780000 87.85470000 34.84050000 18.70430000 72.94060000 1192 57.67410000 39.96870000 66.27600000 24.35570000 18.77680000 40.62950000 1193 72.73410000 59.75600000 67.73610000 39.66210000 36.66960000 45.15630000 1194 74.36260000 75.45880000 67.33520000 48.31070000 52.61020000 47.25640000 1195 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 1196 7.710020000 10.15680000 6.203640000 0.420937000 0.559623000 0.295110000 1197 7.612170000 4.618980000 10.11310000 0.301345000 0.203224000 0.636356000 1198 30.28710000 63.57770000 15.43310000 16.48460000 28.07080000 6.102600000 1199 34.00210000 92.80980000 14.70120000 34.45770000 62.78500000 11.69870000 1200 39.94850000 95.35840000 90.38020000 52.14040000 73.02820000 87.09130000 1201 21.70130000 28.66040000 27.26250000 4.757880000 5.732790000 6.283750000 1202 20.63100000 33.10070000 25.73260000 5.336990000 7.312590000 5.910750000 1203 61.14130000 38.88710000 28.48010000 19.59650000 16.62170000 8.151090000 1204 61.80640000 61.36260000 42.29090000 29.24860000 32.90010000 19.06460000 1205 44.91050000 59.22180000 40.26050000 20.83030000 27.22990000 16.95180000 1206 49.99250000 74.18350000 43.04700000 30.34600000 42.84450000 21.49280000 1207 67.69390000 83.84290000 52.49630000 46.12810000 59.30520000 31.94880000 1208 74.54440000 84.85120000 63.39050000 53.15190000 63.62630000 44.19840000 1209 12.65390000 32.43660000 9.078530000 3.535910000 6.275350000 1.508440000 1210 10.27680000 30.78420000 23.05510000 3.672750000 5.789010000 4.678200000 1211 10.37250000 31.07700000 36.38210000 4.971880000 6.399540000 11.21190000 1212 11.43210000 38.40340000 43.03950000 7.534660000 10.02800000 16.35490000 1213 0.000000000 40.73120000 45.85760000 8.210030000 11.22130000 18.76730000 1214 41.42260000 45.38370000 73.28320000 21.34030000 19.29080000 50.35870000 1215 51.42930000 53.84570000 82.97730000 30.69290000 28.04580000 66.56150000 1216 71.81530000 12.78580000 20.17470000 20.83310000 11.25440000 3.873980000 1217 72.59920000 7.440620000 54.75370000 25.30950000 12.66860000 26.26870000 1218 79.93730000 60.33610000 54.23330000 41.67200000 38.41550000 29.85340000 1219 64.04890000 23.69560000 16.88540000 17.34840000 11.13930000 3.128620000 1220 91.04910000 27.31500000 18.62540000 36.06180000 21.59760000 4.616840000 1221 90.03810000 39.30900000 16.64050000 37.67680000 26.19360000 4.903400000 1222 33.24830000 15.57040000 10.78940000 4.394080000 3.138230000 1.081010000 1223 35.44630000 11.28760000 91.72670000 19.43700000 8.734100000 78.90840000 1224 45.95460000 18.11990000 91.08340000 22.99310000 11.39610000 78.03310000 1225 15.55610000 14.89220000 5.936390000 1.267720000 1.455000000 0.403999000 1226 17.05060000 13.77280000 9.164060000 1.393950000 1.386170000 0.687679000 1227 14.69930000 10.39800000 8.937570000 0.943539000 0.841757000 0.579899000 1228 8.826190000 11.11870000 14.22730000 0.731206000 0.772028000 1.409100000 1229 6.437110000 8.179000000 15.38370000 0.538399000 0.459239000 1.602370000 1230 5.951050000 52.34510000 69.99720000 16.93250000 20.56360000 46.25320000 1231 9.232850000 58.92620000 83.86440000 23.65070000 27.36650000 68.28670000 1232 11.68040000 75.69230000 92.35900000 34.90280000 45.01610000 86.28780000 1233 6.351260000 81.46890000 92.34760000 38.03030000 51.68030000 87.38760000 1234 20.31460000 89.10210000 91.43460000 43.80560000 62.05910000 87.37030000 1235 53.01520000 87.00210000 93.97770000 52.28500000 64.21920000 92.17250000 1236 90.00530000 86.71960000 92.77820000 74.15830000 75.26770000 90.85350000 1237 1.445090000 0.000000000 0.000000000 0.003702600 0.001908800 0.000173336 1238 13.56080000 92.53170000 32.87570000 32.21840000 61.18440000 18.30520000 1239 75.42190000 91.66890000 36.61140000 53.68830000 71.29190000 21.31280000 1240 93.20680000 90.72590000 54.20300000 68.88870000 77.82890000 35.99660000 1241 25.23860000 18.16100000 7.137190000 2.890610000 2.730340000 0.659536000 1242 33.00280000 20.03620000 9.726100000 4.750990000 3.983980000 1.081250000 1243 34.38430000 18.05020000 84.68600000 17.29310000 8.698370000 66.41070000 1244 20.91300000 24.27940000 50.46040000 6.920950000 5.465110000 21.71200000 1245 18.31900000 35.01640000 65.28960000 11.61190000 10.45110000 38.45190000 1246 26.02460000 45.68080000 70.68180000 16.93460000 17.23510000 46.54470000 1247 25.36540000 49.93070000 94.62990000 25.76810000 22.96230000 86.87110000 1248 38.32000000 35.31740000 63.14590000 15.19450000 12.45620000 36.02760000 1249 48.48260000 37.88230000 70.32140000 20.94190000 16.11370000 45.62400000 1250 15.86020000 14.00440000 26.27860000 2.147950000 1.700780000 5.221500000 1251 11.25920000 57.31340000 24.49210000 11.66920000 21.52880000 7.828860000 1252 6.114910000 62.53930000 41.61760000 15.45050000 26.57130000 18.07580000 1253 11.65980000 78.14880000 46.01220000 24.43040000 43.08330000 24.18920000 1254 14.06040000 79.97310000 37.75400000 24.54390000 44.88210000 18.47680000 1255 17.52700000 91.53340000 44.67530000 33.39910000 60.56410000 26.01320000 1256 35.24230000 92.67390000 45.58610000 37.61660000 63.92870000 27.17030000 1257 30.23550000 90.43260000 30.76500000 32.98400000 59.40110000 16.80820000 1258 82.53420000 93.02630000 30.24750000 58.84020000 75.46670000 18.28740000 1259 76.54930000 50.64270000 17.87660000 31.32950000 27.99310000 5.898000000 1260 88.61980000 52.67390000 42.68610000 43.12370000 34.87400000 19.00910000 1261 46.81620000 22.14060000 64.82460000 16.02570000 9.385250000 37.43590000 1262 63.01910000 20.12970000 90.18320000 30.37200000 15.55960000 76.78320000 1263 62.74990000 34.35550000 90.29340000 32.62920000 20.22020000 77.76670000 1264 78.85570000 72.28420000 90.75750000 56.55430000 53.47170000 83.78110000 1265 43.60790000 35.14440000 38.61250000 12.45930000 11.48970000 13.23120000 1266 53.61020000 34.11960000 41.08170000 16.37940000 13.13770000 15.04720000 1267 63.65740000 36.33140000 48.52960000 22.81140000 17.06200000 21.38460000 1268 67.88780000 45.08940000 60.21150000 29.71230000 23.84340000 34.04030000 1269 82.68240000 53.54650000 75.09630000 45.81170000 35.94680000 54.92140000 1270 23.28060000 4.536670000 17.00300000 2.078180000 1.088020000 2.022280000 1271 22.31120000 9.006000000 13.01760000 1.905820000 1.225510000 1.204210000 1272 20.50680000 12.76300000 5.439990000 1.681200000 1.437070000 0.345561000 1273 20.12340000 16.56160000 53.16690000 6.397710000 3.796260000 23.97720000 1274 27.88470000 32.22340000 54.42860000 10.18620000 9.102990000 26.05010000 1275 28.21660000 35.95750000 73.02990000 15.36520000 12.47520000 48.99580000 1276 46.51770000 39.06810000 90.42260000 26.65250000 18.78840000 78.04330000 1277 18.78970000 3.835200000 25.62730000 1.974800000 0.954450000 4.817730000 1278 31.80020000 6.725560000 37.60000000 5.513710000 2.740170000 11.24600000 1279 32.74740000 63.83470000 57.92570000 22.29700000 30.64870000 33.21490000 1280 35.99050000 80.31010000 61.21150000 32.56750000 48.85660000 39.86160000 1281 42.42790000 96.78820000 60.61650000 45.54070000 72.19260000 42.99900000 1282 29.58180000 40.62190000 27.14470000 8.788020000 11.73280000 7.178030000 1283 58.82760000 44.15440000 31.13110000 20.14990000 19.02200000 9.877090000 1284 65.89420000 52.92000000 37.14780000 27.34450000 26.95730000 14.48100000 1285 65.54560000 59.30100000 46.12240000 30.90950000 32.37720000 21.87180000 1286 82.27590000 65.23240000 65.46260000 47.93480000 44.63710000 43.35290000 1287 93.31010000 76.94330000 68.03030000 63.24250000 61.53910000 49.09880000 1288 94.38990000 87.19740000 72.69500000 71.72830000 75.22070000 57.66010000 1289 93.41810000 86.60820000 88.17210000 75.25290000 75.90970000 82.41950000 1290 53.29130000 49.27330000 45.26100000 21.02850000 21.66960000 19.62500000 1291 62.37610000 54.22280000 47.45890000 27.41580000 27.54500000 22.24160000 1292 91.18730000 9.951890000 15.16290000 34.17450000 17.91700000 3.151450000 1293 93.68130000 12.80220000 23.14710000 36.83570000 19.48410000 5.607180000 1294 93.29800000 11.62470000 31.56030000 37.14700000 19.45260000 9.286770000 1295 93.14560000 14.33110000 40.28450000 38.21900000 20.16110000 14.68790000 1296 91.41500000 8.841860000 67.03280000 41.51280000 20.79200000 41.08250000 1297 87.18510000 7.726400000 80.24420000 41.75380000 20.43070000 60.05180000 1298 68.97070000 31.56980000 60.38760000 27.00300000 17.43830000 33.14650000 1299 70.30620000 35.01200000 70.62150000 30.95830000 20.26950000 46.30880000 1300 70.04770000 37.30100000 81.59260000 34.47610000 22.50940000 63.01300000 1301 83.50610000 46.67820000 91.22150000 49.18380000 33.59010000 81.19400000 1302 94.26810000 47.41200000 92.40100000 58.31570000 38.59580000 83.89430000 1303 56.97610000 47.18090000 55.63660000 23.79260000 21.86620000 29.02470000 1304 57.40670000 65.13240000 66.43910000 33.43920000 37.06720000 43.88880000 1305 58.48010000 65.43010000 91.85320000 41.71440000 40.66050000 84.13440000 1306 21.72170000 33.39130000 34.89950000 6.422240000 7.862090000 10.52250000 1307 19.10780000 70.51180000 48.41640000 21.32750000 35.19120000 24.86320000 1308 19.13660000 82.18150000 56.59680000 29.47210000 49.07610000 34.97680000 1309 15.73280000 89.28060000 85.84270000 41.47440000 61.26080000 77.27010000 1310 13.14380000 65.54740000 81.53350000 26.11950000 33.10210000 65.40170000 1311 12.04630000 70.55520000 93.17840000 32.45020000 39.59680000 86.92920000 1312 4.513480000 91.46300000 94.78410000 45.47490000 65.21690000 94.28930000 1313 17.98960000 62.08440000 70.43570000 21.83330000 28.89920000 48.20100000 1314 14.92120000 76.46260000 72.87940000 29.44730000 43.56230000 54.03950000 1315 10.53370000 76.24820000 78.82790000 30.68430000 43.82310000 62.91090000 1316 8.995660000 66.30180000 60.48030000 20.66270000 31.46410000 36.29330000 1317 56.66090000 65.58880000 61.02650000 32.05790000 36.81970000 37.35180000 1318 57.96780000 79.17440000 61.99260000 40.13320000 51.72610000 40.92580000 1319 16.14690000 62.13910000 17.29770000 13.68670000 25.65620000 6.226740000 1320 19.62630000 70.39090000 14.48530000 17.92650000 33.73830000 6.918520000 1321 18.75500000 81.69550000 15.67290000 24.26870000 46.50760000 9.304650000 1322 35.64330000 87.24060000 58.30180000 36.26050000 57.37630000 38.04620000 1323 24.92420000 44.02250000 39.28730000 10.14000000 13.69690000 14.23270000 1324 92.92030000 45.22180000 52.72970000 45.75000000 32.34380000 26.98950000 1325 91.71690000 72.48310000 77.26680000 61.95340000 56.91470000 61.37710000 1326 50.51570000 43.21630000 45.91840000 18.09440000 17.34040000 19.47730000 1327 55.52440000 42.02250000 57.62460000 21.99060000 18.60390000 30.58170000 1328 36.07860000 17.71890000 24.27490000 5.978770000 4.170240000 4.694980000 1329 41.67640000 14.34360000 24.83720000 7.360030000 4.438660000 4.891180000 1330 43.45160000 10.27280000 35.63710000 8.700990000 4.626050000 10.21770000 1331 68.34510000 12.02140000 38.94220000 20.46340000 10.79050000 12.89480000 1332 67.66660000 35.09350000 43.31510000 23.90980000 17.30190000 17.10550000 1333 53.50820000 30.18810000 33.67710000 14.63910000 11.16740000 10.02290000 1334 71.86360000 62.81730000 32.32400000 34.30810000 36.60760000 13.15190000 1335 55.52360000 43.89520000 23.64600000 17.91180000 17.82770000 6.466460000 1336 65.09090000 81.61000000 32.75360000 40.46010000 54.63270000 16.53960000 1337 40.60920000 50.10750000 9.305230000 13.60370000 18.61630000 3.386940000 1338 54.06280000 66.41680000 10.19650000 25.32060000 34.62370000 5.973020000 1339 62.58200000 66.33770000 12.90490000 29.41150000 36.66680000 6.575480000 1340 90.31720000 75.18700000 18.93540000 52.52550000 55.37720000 10.35630000 1341 89.48070000 81.32160000 35.49380000 56.83850000 62.77830000 18.81940000 1342 98.27870000 91.75180000 35.16350000 71.09590000 80.37260000 21.26680000 1343 53.47620000 73.28290000 28.89250000 29.63700000 41.94020000 12.70090000 1344 53.65560000 85.70130000 29.22480000 37.16160000 56.82840000 15.33520000 1345 25.53130000 38.87220000 9.246350000 6.620030000 10.04690000 2.093790000 1346 23.95260000 42.48480000 55.87110000 12.23940000 13.80970000 28.32060000 1347 23.89400000 47.63030000 56.71840000 13.95430000 16.98390000 29.72800000 1348 24.95660000 55.99290000 63.00750000 18.47120000 23.59500000 37.83940000 1349 32.50820000 64.17840000 73.71190000 26.19560000 32.45500000 53.26050000 1350 33.49440000 77.67230000 75.77190000 34.03980000 46.87030000 58.65260000 1351 46.67130000 31.61110000 34.29710000 12.27350000 10.34630000 10.34270000 1352 49.19460000 29.84490000 58.92890000 16.80930000 11.73040000 30.94820000 1353 55.96940000 30.62240000 68.08590000 21.90720000 14.33110000 42.23770000 1354 36.67160000 22.12650000 51.97220000 10.11690000 6.645710000 23.18150000 1355 56.52030000 20.23980000 62.19990000 19.17680000 10.73430000 34.36150000 1356 67.49460000 24.26130000 68.50830000 26.81510000 15.27300000 42.71730000 1357 81.48440000 33.32100000 84.20440000 41.84340000 24.87820000 67.42190000 1358 19.53530000 40.04690000 18.23540000 6.343270000 10.31560000 3.898350000 1359 26.70980000 50.32530000 24.44240000 10.97430000 17.28930000 7.028070000 1360 89.22210000 59.03820000 30.11230000 44.60060000 39.50320000 12.02920000 1361 49.38740000 32.18660000 14.95290000 11.97160000 10.52760000 2.849940000 1362 57.01390000 42.63330000 12.37190000 17.65160000 17.22060000 3.348820000 1363 57.80090000 49.55300000 9.913030000 20.09820000 21.68200000 3.712670000 1364 66.62030000 61.83290000 10.42610000 29.42770000 33.59910000 5.590180000 1365 75.93830000 74.17920000 8.014210000 41.12090000 48.71430000 7.603570000 1366 75.64920000 80.25540000 27.85390000 45.45290000 56.03330000 14.11070000 1367 77.49100000 81.11840000 40.41580000 48.56630000 58.25830000 21.58820000 1368 24.77270000 24.47010000 9.836810000 3.644070000 4.267270000 1.208430000 1369 65.28400000 40.67320000 12.31800000 21.26970000 18.28550000 3.354600000 1370 79.37380000 45.25940000 10.80200000 31.20220000 25.35560000 3.958610000 1371 92.59050000 45.22340000 9.589990000 41.16330000 30.47820000 4.259310000 1372 92.47240000 57.14200000 10.38800000 45.28590000 38.83680000 5.760290000 1373 95.79270000 77.77170000 7.755180000 58.15510000 60.51340000 8.957810000 1374 43.17080000 39.10300000 8.697070000 11.12000000 12.45520000 2.258100000 1375 49.89060000 37.95120000 31.44550000 14.60030000 13.66700000 9.298290000 1376 56.27290000 39.58540000 84.24400000 28.68410000 20.27380000 67.29370000 1377 57.78570000 44.18990000 94.83090000 34.34060000 24.65830000 87.13890000 1378 13.37640000 12.20150000 44.46690000 3.881240000 2.169880000 16.13280000 1379 10.57270000 8.880130000 49.82920000 4.369720000 2.060550000 20.61530000 1380 45.72370000 9.076480000 58.66210000 13.14490000 6.402610000 29.81940000 1381 58.30920000 3.686140000 72.81920000 21.60270000 10.13640000 47.91540000 1382 83.37590000 20.10710000 76.70540000 38.77120000 20.38330000 54.69380000 1383 53.79250000 30.63750000 50.23060000 17.16850000 12.32900000 22.28690000 1384 67.89000000 32.08250000 52.52890000 24.91120000 16.69310000 24.87310000 1385 77.93560000 36.69560000 53.81320000 32.39770000 22.02260000 26.76020000 1386 17.58500000 8.598190000 8.065160000 1.135240000 0.817757000 0.470715000 1387 37.30110000 11.91510000 6.228700000 5.086930000 3.111110000 0.543597000 1388 39.72790000 10.50970000 13.16740000 5.876450000 3.379660000 1.438010000 1389 52.89750000 16.18610000 8.935880000 10.90510000 6.579240000 1.162250000 1390 77.62440000 16.42250000 8.832210000 24.38540000 13.56040000 1.787600000 1391 89.14880000 30.58670000 9.217900000 34.77030000 21.83650000 2.882700000 1392 90.72860000 29.02860000 54.79040000 40.45610000 23.79750000 27.65580000 1393 92.21300000 32.89750000 91.93040000 52.60610000 29.99110000 81.64630000 1394 35.18160000 9.191850000 33.10820000 5.920540000 3.147640000 8.616690000 1395 54.29950000 11.14590000 33.15610000 12.64560000 6.761220000 8.986300000 1396 64.76240000 18.56730000 32.91780000 18.31100000 10.56740000 9.291030000 1397 61.77100000 34.81750000 31.00780000 19.18270000 14.94590000 9.078140000 1398 64.85870000 42.99050000 38.01170000 23.65050000 20.23660000 13.93420000 1399 90.52570000 75.10450000 51.01810000 56.29110000 56.82920000 29.53920000 END_DATA CAL DESCRIPTOR "Argyll Device Calibration State" ORIGINATOR "Argyll dispcal" CREATED "Sat Mar 14 19:07:36 2009" KEYWORD "DEVICE_CLASS" DEVICE_CLASS "DISPLAY" KEYWORD "COLOR_REP" COLOR_REP "RGB" BEGIN_ARGYLL_DISPCAL_ARGS -dmadvr -qm -w0.3127,0.3290 -f0 -k0 END_ARGYLL_DISPCAL_ARGS KEYWORD "RGB_I" NUMBER_OF_FIELDS 4 BEGIN_DATA_FORMAT RGB_I RGB_R RGB_G RGB_B END_DATA_FORMAT NUMBER_OF_SETS 256 BEGIN_DATA 0.00000 0.00000 0.00000 0.00000 0.00392 0.00392 0.00392 0.00392 0.00784 0.00784 0.00784 0.00784 0.01176 0.01176 0.01176 0.01176 0.01569 0.01569 0.01569 0.01569 0.01961 0.01961 0.01961 0.01961 0.02353 0.02353 0.02353 0.02353 0.02745 0.02745 0.02745 0.02745 0.03137 0.03137 0.03137 0.03137 0.03529 0.03529 0.03529 0.03529 0.03922 0.03922 0.03922 0.03922 0.04314 0.04314 0.04314 0.04314 0.04706 0.04706 0.04706 0.04706 0.05098 0.05098 0.05098 0.05098 0.05490 0.05490 0.05490 0.05490 0.05882 0.05882 0.05882 0.05882 0.06275 0.06275 0.06275 0.06275 0.06667 0.06667 0.06667 0.06667 0.07059 0.07059 0.07059 0.07059 0.07451 0.07451 0.07451 0.07451 0.07843 0.07843 0.07843 0.07843 0.08235 0.08235 0.08235 0.08235 0.08627 0.08627 0.08627 0.08627 0.09020 0.09020 0.09020 0.09020 0.09412 0.09412 0.09412 0.09412 0.09804 0.09804 0.09804 0.09804 0.10196 0.10196 0.10196 0.10196 0.10588 0.10588 0.10588 0.10588 0.10980 0.10980 0.10980 0.10980 0.11373 0.11373 0.11373 0.11373 0.11765 0.11765 0.11765 0.11765 0.12157 0.12157 0.12157 0.12157 0.12549 0.12549 0.12549 0.12549 0.12941 0.12941 0.12941 0.12941 0.13333 0.13333 0.13333 0.13333 0.13725 0.13725 0.13725 0.13725 0.14118 0.14118 0.14118 0.14118 0.14510 0.14510 0.14510 0.14510 0.14902 0.14902 0.14902 0.14902 0.15294 0.15294 0.15294 0.15294 0.15686 0.15686 0.15686 0.15686 0.16078 0.16078 0.16078 0.16078 0.16471 0.16471 0.16471 0.16471 0.16863 0.16863 0.16863 0.16863 0.17255 0.17255 0.17255 0.17255 0.17647 0.17647 0.17647 0.17647 0.18039 0.18039 0.18039 0.18039 0.18431 0.18431 0.18431 0.18431 0.18824 0.18824 0.18824 0.18824 0.19216 0.19216 0.19216 0.19216 0.19608 0.19608 0.19608 0.19608 0.20000 0.20000 0.20000 0.20000 0.20392 0.20392 0.20392 0.20392 0.20784 0.20784 0.20784 0.20784 0.21176 0.21176 0.21176 0.21176 0.21569 0.21569 0.21569 0.21569 0.21961 0.21961 0.21961 0.21961 0.22353 0.22353 0.22353 0.22353 0.22745 0.22745 0.22745 0.22745 0.23137 0.23137 0.23137 0.23137 0.23529 0.23529 0.23529 0.23529 0.23922 0.23922 0.23922 0.23922 0.24314 0.24314 0.24314 0.24314 0.24706 0.24706 0.24706 0.24706 0.25098 0.25098 0.25098 0.25098 0.25490 0.25490 0.25490 0.25490 0.25882 0.25882 0.25882 0.25882 0.26275 0.26275 0.26275 0.26275 0.26667 0.26667 0.26667 0.26667 0.27059 0.27059 0.27059 0.27059 0.27451 0.27451 0.27451 0.27451 0.27843 0.27843 0.27843 0.27843 0.28235 0.28235 0.28235 0.28235 0.28627 0.28627 0.28627 0.28627 0.29020 0.29020 0.29020 0.29020 0.29412 0.29412 0.29412 0.29412 0.29804 0.29804 0.29804 0.29804 0.30196 0.30196 0.30196 0.30196 0.30588 0.30588 0.30588 0.30588 0.30980 0.30980 0.30980 0.30980 0.31373 0.31373 0.31373 0.31373 0.31765 0.31765 0.31765 0.31765 0.32157 0.32157 0.32157 0.32157 0.32549 0.32549 0.32549 0.32549 0.32941 0.32941 0.32941 0.32941 0.33333 0.33333 0.33333 0.33333 0.33725 0.33725 0.33725 0.33725 0.34118 0.34118 0.34118 0.34118 0.34510 0.34510 0.34510 0.34510 0.34902 0.34902 0.34902 0.34902 0.35294 0.35294 0.35294 0.35294 0.35686 0.35686 0.35686 0.35686 0.36078 0.36078 0.36078 0.36078 0.36471 0.36471 0.36471 0.36471 0.36863 0.36863 0.36863 0.36863 0.37255 0.37255 0.37255 0.37255 0.37647 0.37647 0.37647 0.37647 0.38039 0.38039 0.38039 0.38039 0.38431 0.38431 0.38431 0.38431 0.38824 0.38824 0.38824 0.38824 0.39216 0.39216 0.39216 0.39216 0.39608 0.39608 0.39608 0.39608 0.40000 0.40000 0.40000 0.40000 0.40392 0.40392 0.40392 0.40392 0.40784 0.40784 0.40784 0.40784 0.41176 0.41176 0.41176 0.41176 0.41569 0.41569 0.41569 0.41569 0.41961 0.41961 0.41961 0.41961 0.42353 0.42353 0.42353 0.42353 0.42745 0.42745 0.42745 0.42745 0.43137 0.43137 0.43137 0.43137 0.43529 0.43529 0.43529 0.43529 0.43922 0.43922 0.43922 0.43922 0.44314 0.44314 0.44314 0.44314 0.44706 0.44706 0.44706 0.44706 0.45098 0.45098 0.45098 0.45098 0.45490 0.45490 0.45490 0.45490 0.45882 0.45882 0.45882 0.45882 0.46275 0.46275 0.46275 0.46275 0.46667 0.46667 0.46667 0.46667 0.47059 0.47059 0.47059 0.47059 0.47451 0.47451 0.47451 0.47451 0.47843 0.47843 0.47843 0.47843 0.48235 0.48235 0.48235 0.48235 0.48627 0.48627 0.48627 0.48627 0.49020 0.49020 0.49020 0.49020 0.49412 0.49412 0.49412 0.49412 0.49804 0.49804 0.49804 0.49804 0.50196 0.50196 0.50196 0.50196 0.50588 0.50588 0.50588 0.50588 0.50980 0.50980 0.50980 0.50980 0.51373 0.51373 0.51373 0.51373 0.51765 0.51765 0.51765 0.51765 0.52157 0.52157 0.52157 0.52157 0.52549 0.52549 0.52549 0.52549 0.52941 0.52941 0.52941 0.52941 0.53333 0.53333 0.53333 0.53333 0.53725 0.53725 0.53725 0.53725 0.54118 0.54118 0.54118 0.54118 0.54510 0.54510 0.54510 0.54510 0.54902 0.54902 0.54902 0.54902 0.55294 0.55294 0.55294 0.55294 0.55686 0.55686 0.55686 0.55686 0.56078 0.56078 0.56078 0.56078 0.56471 0.56471 0.56471 0.56471 0.56863 0.56863 0.56863 0.56863 0.57255 0.57255 0.57255 0.57255 0.57647 0.57647 0.57647 0.57647 0.58039 0.58039 0.58039 0.58039 0.58431 0.58431 0.58431 0.58431 0.58824 0.58824 0.58824 0.58824 0.59216 0.59216 0.59216 0.59216 0.59608 0.59608 0.59608 0.59608 0.60000 0.60000 0.60000 0.60000 0.60392 0.60392 0.60392 0.60392 0.60784 0.60784 0.60784 0.60784 0.61176 0.61176 0.61176 0.61176 0.61569 0.61569 0.61569 0.61569 0.61961 0.61961 0.61961 0.61961 0.62353 0.62353 0.62353 0.62353 0.62745 0.62745 0.62745 0.62745 0.63137 0.63137 0.63137 0.63137 0.63529 0.63529 0.63529 0.63529 0.63922 0.63922 0.63922 0.63922 0.64314 0.64314 0.64314 0.64314 0.64706 0.64706 0.64706 0.64706 0.65098 0.65098 0.65098 0.65098 0.65490 0.65490 0.65490 0.65490 0.65882 0.65882 0.65882 0.65882 0.66275 0.66275 0.66275 0.66275 0.66667 0.66667 0.66667 0.66667 0.67059 0.67059 0.67059 0.67059 0.67451 0.67451 0.67451 0.67451 0.67843 0.67843 0.67843 0.67843 0.68235 0.68235 0.68235 0.68235 0.68627 0.68627 0.68627 0.68627 0.69020 0.69020 0.69020 0.69020 0.69412 0.69412 0.69412 0.69412 0.69804 0.69804 0.69804 0.69804 0.70196 0.70196 0.70196 0.70196 0.70588 0.70588 0.70588 0.70588 0.70980 0.70980 0.70980 0.70980 0.71373 0.71373 0.71373 0.71373 0.71765 0.71765 0.71765 0.71765 0.72157 0.72157 0.72157 0.72157 0.72549 0.72549 0.72549 0.72549 0.72941 0.72941 0.72941 0.72941 0.73333 0.73333 0.73333 0.73333 0.73725 0.73725 0.73725 0.73725 0.74118 0.74118 0.74118 0.74118 0.74510 0.74510 0.74510 0.74510 0.74902 0.74902 0.74902 0.74902 0.75294 0.75294 0.75294 0.75294 0.75686 0.75686 0.75686 0.75686 0.76078 0.76078 0.76078 0.76078 0.76471 0.76471 0.76471 0.76471 0.76863 0.76863 0.76863 0.76863 0.77255 0.77255 0.77255 0.77255 0.77647 0.77647 0.77647 0.77647 0.78039 0.78039 0.78039 0.78039 0.78431 0.78431 0.78431 0.78431 0.78824 0.78824 0.78824 0.78824 0.79216 0.79216 0.79216 0.79216 0.79608 0.79608 0.79608 0.79608 0.80000 0.80000 0.80000 0.80000 0.80392 0.80392 0.80392 0.80392 0.80784 0.80784 0.80784 0.80784 0.81176 0.81176 0.81176 0.81176 0.81569 0.81569 0.81569 0.81569 0.81961 0.81961 0.81961 0.81961 0.82353 0.82353 0.82353 0.82353 0.82745 0.82745 0.82745 0.82745 0.83137 0.83137 0.83137 0.83137 0.83529 0.83529 0.83529 0.83529 0.83922 0.83922 0.83922 0.83922 0.84314 0.84314 0.84314 0.84314 0.84706 0.84706 0.84706 0.84706 0.85098 0.85098 0.85098 0.85098 0.85490 0.85490 0.85490 0.85490 0.85882 0.85882 0.85882 0.85882 0.86275 0.86275 0.86275 0.86275 0.86667 0.86667 0.86667 0.86667 0.87059 0.87059 0.87059 0.87059 0.87451 0.87451 0.87451 0.87451 0.87843 0.87843 0.87843 0.87843 0.88235 0.88235 0.88235 0.88235 0.88627 0.88627 0.88627 0.88627 0.89020 0.89020 0.89020 0.89020 0.89412 0.89412 0.89412 0.89412 0.89804 0.89804 0.89804 0.89804 0.90196 0.90196 0.90196 0.90196 0.90588 0.90588 0.90588 0.90588 0.90980 0.90980 0.90980 0.90980 0.91373 0.91373 0.91373 0.91373 0.91765 0.91765 0.91765 0.91765 0.92157 0.92157 0.92157 0.92157 0.92549 0.92549 0.92549 0.92549 0.92941 0.92941 0.92941 0.92941 0.93333 0.93333 0.93333 0.93333 0.93725 0.93725 0.93725 0.93725 0.94118 0.94118 0.94118 0.94118 0.94510 0.94510 0.94510 0.94510 0.94902 0.94902 0.94902 0.94902 0.95294 0.95294 0.95294 0.95294 0.95686 0.95686 0.95686 0.95686 0.96078 0.96078 0.96078 0.96078 0.96471 0.96471 0.96471 0.96471 0.96863 0.96863 0.96863 0.96863 0.97255 0.97255 0.97255 0.97255 0.97647 0.97647 0.97647 0.97647 0.98039 0.98039 0.98039 0.98039 0.98431 0.98431 0.98431 0.98431 0.98824 0.98824 0.98824 0.98824 0.99216 0.99216 0.99216 0.99216 0.99608 0.99608 0.99608 0.99608 1.00000 1.00000 1.00000 1.00000 END_DATA sf32%D3֮? e wDisplayCAL-3.1.0.0/DisplayCAL/presets/video_Prisma.icc0000644000076500000000000035407412647526507022240 0ustar devwheel00000000000000>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~  !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~  !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~XYZ o8XYZ bXYZ $curv3textCTI3 DESCRIPTOR "Argyll Calibration Target chart information 3" ORIGINATOR "Argyll dispread" CREATED "Sat Mar 14 19:00:55 2009" KEYWORD "DEVICE_CLASS" DEVICE_CLASS "DISPLAY" KEYWORD "APPROX_WHITE_POINT" APPROX_WHITE_POINT "95.045781 100.000003 108.905751" KEYWORD "DARK_REGION_EMPHASIS" DARK_REGION_EMPHASIS "1.6" KEYWORD "ACCURATE_EXPECTED_VALUES" ACCURATE_EXPECTED_VALUES "true" KEYWORD "COLOR_REP" COLOR_REP "RGB_XYZ" KEYWORD "BLACK_COLOR_PATCHES" BLACK_COLOR_PATCHES "4" KEYWORD "COMP_GREY_STEPS" COMP_GREY_STEPS "97" KEYWORD "SINGLE_DIM_STEPS" SINGLE_DIM_STEPS "33" KEYWORD "WHITE_COLOR_PATCHES" WHITE_COLOR_PATCHES "4" KEYWORD "USE_BLACK_POINT_COMPENSATION" USE_BLACK_POINT_COMPENSATION "NO" KEYWORD "HIRES_B2A" HIRES_B2A "NO" KEYWORD "AUTO_OPTIMIZE" AUTO_OPTIMIZE "9" KEYWORD "3DLUT_SOURCE_PROFILE" 3DLUT_SOURCE_PROFILE "ref/Rec709.icm" KEYWORD "3DLUT_GAMMA" 3DLUT_GAMMA "-2.4" KEYWORD "3DLUT_DEGREE_OF_BLACK_OUTPUT_OFFSET" 3DLUT_DEGREE_OF_BLACK_OUTPUT_OFFSET "0.0" KEYWORD "3DLUT_INPUT_ENCODING" 3DLUT_INPUT_ENCODING "t" KEYWORD "3DLUT_OUTPUT_ENCODING" 3DLUT_OUTPUT_ENCODING "t" KEYWORD "3DLUT_GAMUT_MAPPING_MODE" 3DLUT_GAMUT_MAPPING_MODE "G" KEYWORD "3DLUT_RENDERING_INTENT" 3DLUT_RENDERING_INTENT "aw" KEYWORD "3DLUT_FORMAT" 3DLUT_FORMAT "3dl" KEYWORD "3DLUT_SIZE" 3DLUT_SIZE "17" KEYWORD "3DLUT_INPUT_BITDEPTH" 3DLUT_INPUT_BITDEPTH "10" KEYWORD "3DLUT_OUTPUT_BITDEPTH" 3DLUT_OUTPUT_BITDEPTH "12" BEGIN_ARGYLL_COLPROF_ARGS -qh -bl -ax -M "Prisma" END_ARGYLL_COLPROF_ARGS NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT SAMPLE_ID RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 1399 BEGIN_DATA 1 100.0000000 100.0000000 100.0000000 95.04580000 100.0000000 108.9060000 2 36.18660000 40.25050000 29.03860000 10.43240000 12.41520000 8.082730000 3 75.62240000 56.57030000 28.01850000 33.62140000 32.37170000 10.24120000 4 82.79480000 56.83720000 43.69100000 40.46860000 35.84890000 20.10110000 5 19.47590000 14.15960000 0.000000000 1.614820000 1.553530000 0.214771000 6 20.94060000 9.655240000 0.000000000 1.533610000 1.101250000 0.131754000 7 21.64610000 0.000000000 9.880980000 1.535610000 0.778814000 0.651906000 8 64.49270000 50.86790000 23.72350000 24.56660000 24.58230000 7.448250000 9 78.94490000 73.49390000 36.37540000 44.63550000 49.75270000 17.48580000 10 0.000000000 15.10070000 0.000000000 0.559497000 1.119080000 0.186522000 11 0.000000000 9.493670000 0.000000000 0.201613000 0.403256000 0.067212600 12 11.29030000 0.000000000 0.000000000 0.340406000 0.175489000 0.015935900 13 13.15790000 0.000000000 0.000000000 0.476651000 0.245728000 0.022314200 14 13.21410000 8.186610000 0.000000000 0.626698000 0.539183000 0.071050300 15 6.646220000 6.646220000 6.646220000 0.244634000 0.257385000 0.280307000 16 9.493670000 9.493670000 9.493670000 0.535904000 0.563838000 0.614052000 17 15.10070000 0.000000000 0.000000000 0.645261000 0.332651000 0.030207600 18 17.12330000 0.000000000 0.000000000 0.850733000 0.438578000 0.039826700 19 19.23080000 0.000000000 0.000000000 1.098130000 0.566119000 0.051408600 20 21.42860000 0.000000000 0.000000000 1.393190000 0.718230000 0.065221500 21 23.72260000 0.000000000 0.000000000 1.742400000 0.898261000 0.081569800 22 26.11940000 0.000000000 0.000000000 2.153160000 1.110020000 0.100799000 23 28.62600000 0.000000000 0.000000000 2.633900000 1.357850000 0.123305000 24 31.25000000 0.000000000 0.000000000 3.194240000 1.646720000 0.149537000 25 34.00000000 0.000000000 0.000000000 3.845230000 1.982330000 0.180013000 26 36.88520000 0.000000000 0.000000000 4.599570000 2.371210000 0.215327000 27 39.91600000 0.000000000 0.000000000 5.471880000 2.820920000 0.256164000 28 43.10340000 0.000000000 0.000000000 6.479100000 3.340170000 0.303316000 29 46.46020000 0.000000000 0.000000000 7.640830000 3.939070000 0.357702000 30 50.00000000 0.000000000 0.000000000 8.979910000 4.629410000 0.420390000 31 53.73830000 0.000000000 0.000000000 10.52300000 5.424900000 0.492628000 32 57.69230000 0.000000000 0.000000000 12.30120000 6.341650000 0.575877000 33 61.88120000 0.000000000 0.000000000 14.35140000 7.398570000 0.671854000 34 66.32650000 0.000000000 0.000000000 16.71680000 8.618020000 0.782591000 35 71.05260000 0.000000000 0.000000000 19.44890000 10.02650000 0.910491000 36 76.08700000 0.000000000 0.000000000 22.60880000 11.65550000 1.058420000 37 81.46070000 0.000000000 0.000000000 26.26990000 13.54290000 1.229810000 38 87.20930000 0.000000000 0.000000000 30.52020000 15.73410000 1.428790000 39 93.37350000 0.000000000 0.000000000 35.46650000 18.28400000 1.660350000 40 100.0000000 0.000000000 0.000000000 41.23850000 21.25960000 1.930560000 41 13.02300000 15.75260000 0.000000000 1.079970000 1.468310000 0.226506000 42 10.68380000 10.68380000 10.68380000 0.694840000 0.731058000 0.796164000 43 4.491020000 0.000000000 0.000000000 0.044824300 0.023108300 0.002098430 44 7.201650000 7.201650000 7.201650000 0.291861000 0.307074000 0.334421000 45 0.000000000 1.445090000 0.000000000 0.003210470 0.006421420 0.001070290 46 0.000000000 2.941180000 0.000000000 0.015321700 0.030645700 0.005107870 47 0.000000000 4.491020000 0.000000000 0.038866600 0.077738900 0.012957100 48 7.763980000 7.763980000 7.763980000 0.344338000 0.362287000 0.394551000 49 0.000000000 13.15790000 0.000000000 0.413298000 0.826656000 0.137783000 50 0.000000000 17.12330000 0.000000000 0.737658000 1.475430000 0.245916000 51 0.000000000 19.23080000 0.000000000 0.952175000 1.904490000 0.317431000 52 0.000000000 21.42860000 0.000000000 1.208020000 2.416210000 0.402721000 53 0.000000000 23.72260000 0.000000000 1.510810000 3.021850000 0.503667000 54 0.000000000 26.11940000 0.000000000 1.866980000 3.734230000 0.622403000 55 0.000000000 28.62600000 0.000000000 2.283820000 4.567970000 0.761366000 56 0.000000000 31.25000000 0.000000000 2.769680000 5.539770000 0.923340000 57 0.000000000 34.00000000 0.000000000 3.334140000 6.668780000 1.111520000 58 0.000000000 36.88520000 0.000000000 3.988220000 7.977030000 1.329570000 59 0.000000000 39.91600000 0.000000000 4.744590000 9.489890000 1.581730000 60 0.000000000 43.10340000 0.000000000 5.617940000 11.23670000 1.872880000 61 0.000000000 46.46020000 0.000000000 6.625260000 13.25150000 2.208690000 62 0.000000000 50.00000000 0.000000000 7.786350000 15.57390000 2.595770000 63 0.000000000 53.73830000 0.000000000 9.124320000 18.25000000 3.041810000 64 0.000000000 57.69230000 0.000000000 10.66620000 21.33400000 3.555850000 65 0.000000000 61.88120000 0.000000000 12.44390000 24.88960000 4.148480000 66 0.000000000 66.32650000 0.000000000 14.49490000 28.99200000 4.832240000 67 0.000000000 71.05260000 0.000000000 16.86390000 33.73020000 5.621980000 68 0.000000000 76.08700000 0.000000000 19.60380000 39.21050000 6.535400000 69 0.000000000 81.46070000 0.000000000 22.77820000 45.55980000 7.593680000 70 0.000000000 87.20930000 0.000000000 26.46360000 52.93120000 8.822290000 71 0.000000000 93.37350000 0.000000000 30.75250000 61.50950000 10.25210000 72 0.000000000 100.0000000 0.000000000 35.75730000 71.51990000 11.92060000 73 28.34880000 100.0000000 70.37100000 46.66960000 76.18290000 55.93060000 74 67.98480000 100.0000000 74.26580000 62.78950000 84.37210000 62.15630000 75 83.59200000 100.0000000 74.15010000 72.91270000 89.59460000 62.46250000 76 100.0000000 100.0000000 79.29620000 87.83280000 97.11460000 70.92110000 77 9.863630000 9.892620000 0.000000000 0.473628000 0.571849000 0.085421100 78 0.000000000 0.000000000 2.941180000 0.007734280 0.003093910 0.040730200 79 0.000000000 0.000000000 4.491020000 0.019619500 0.007848320 0.103320000 80 0.000000000 0.000000000 6.097560000 0.038438800 0.015376500 0.202426000 81 0.000000000 0.000000000 13.15790000 0.208629000 0.083457100 1.098680000 82 0.000000000 0.000000000 17.12330000 0.372364000 0.148955000 1.960940000 83 0.000000000 0.000000000 19.23080000 0.480650000 0.192272000 2.531190000 84 0.000000000 0.000000000 21.42860000 0.609797000 0.243934000 3.211300000 85 0.000000000 0.000000000 23.72260000 0.762647000 0.305078000 4.016240000 86 0.000000000 0.000000000 26.11940000 0.942436000 0.376999000 4.963040000 87 0.000000000 0.000000000 28.62600000 1.152850000 0.461170000 6.071130000 88 0.000000000 0.000000000 31.25000000 1.398110000 0.559281000 7.362710000 89 0.000000000 0.000000000 34.00000000 1.683050000 0.673263000 8.863250000 90 0.000000000 0.000000000 36.88520000 2.013220000 0.805340000 10.60200000 91 0.000000000 0.000000000 39.91600000 2.395030000 0.958075000 12.61270000 92 0.000000000 0.000000000 43.10340000 2.835890000 1.134430000 14.93430000 93 0.000000000 0.000000000 46.46020000 3.344380000 1.337840000 17.61210000 94 0.000000000 0.000000000 50.00000000 3.930490000 1.572300000 20.69870000 95 0.000000000 0.000000000 53.73830000 4.605880000 1.842470000 24.25540000 96 0.000000000 0.000000000 66.32650000 7.316920000 2.926960000 38.53230000 97 0.000000000 0.000000000 71.05260000 8.512740000 3.405320000 44.82970000 98 0.000000000 0.000000000 76.08700000 9.895840000 3.958590000 52.11330000 99 0.000000000 0.000000000 81.46070000 11.49830000 4.599600000 60.55200000 100 0.000000000 0.000000000 87.20930000 13.35860000 5.343790000 70.34900000 101 0.000000000 0.000000000 93.37350000 15.52360000 6.209840000 81.75010000 102 0.000000000 0.000000000 100.0000000 18.05000000 7.220460000 95.05460000 103 55.83310000 0.000000000 79.89610000 22.46440000 10.30840000 58.55950000 104 65.71360000 65.46360000 80.69580000 41.72460000 41.11790000 64.77050000 105 0.000000000 16.36620000 11.20940000 0.814484000 1.394420000 0.994951000 106 11.90480000 11.90480000 11.90480000 0.881537000 0.927487000 1.010090000 107 7.763980000 0.000000000 0.000000000 0.149401000 0.077020800 0.006994160 108 0.000000000 7.763980000 0.000000000 0.129544000 0.259107000 0.043186600 109 0.000000000 0.000000000 7.763980000 0.065392700 0.026158800 0.344370000 110 0.000000000 6.097560000 0.000000000 0.076147800 0.152307000 0.025385700 111 6.097560000 0.000000000 0.000000000 0.087820400 0.045274000 0.004111270 112 0.000000000 0.000000000 1.445090000 0.001620620 0.000648290 0.008534490 113 0.476190000 0.476190000 0.476190000 0.000742788 0.000781505 0.000851104 114 0.957854000 0.957854000 0.957854000 0.003454370 0.003634430 0.003958100 115 1.445090000 1.445090000 1.445090000 0.008533690 0.008978510 0.009778110 116 9.493670000 0.000000000 0.000000000 0.232518000 0.119870000 0.010885200 117 1.937980000 1.937980000 1.937980000 0.016272000 0.017120200 0.018644900 118 0.000000000 0.000000000 9.493670000 0.101773000 0.040711700 0.535954000 119 2.436650000 2.436650000 2.436650000 0.026923800 0.028327200 0.030850000 120 2.941180000 2.941180000 2.941180000 0.040726400 0.042849200 0.046665300 121 3.451680000 3.451680000 3.451680000 0.057908400 0.060926800 0.066352800 122 3.968250000 3.968250000 3.968250000 0.078694900 0.082796800 0.090170500 123 4.491020000 4.491020000 4.491020000 0.103310000 0.108695000 0.118376000 124 5.020080000 5.020080000 5.020080000 0.131981000 0.138860000 0.151227000 125 0.000000000 0.000000000 11.29030000 0.148995000 0.059601800 0.784634000 126 5.555560000 5.555560000 5.555560000 0.164935000 0.173533000 0.188987000 127 6.097560000 6.097560000 6.097560000 0.202407000 0.212957000 0.231923000 128 8.333330000 8.333330000 8.333330000 0.402325000 0.423296000 0.460994000 129 12.52720000 12.52720000 12.52720000 0.986096000 1.037500000 1.129890000 130 13.15790000 13.15790000 13.15790000 1.098580000 1.155840000 1.258780000 131 13.79690000 13.79690000 13.79690000 1.219340000 1.282900000 1.397150000 132 14.44440000 14.44440000 14.44440000 1.348750000 1.419050000 1.545430000 133 15.76580000 15.76580000 15.76580000 1.635060000 1.720280000 1.873490000 134 16.43990000 16.43990000 16.43990000 1.792770000 1.886220000 2.054200000 135 17.12330000 17.12330000 17.12330000 1.960760000 2.062960000 2.246680000 136 17.81610000 17.81610000 17.81610000 2.139470000 2.250990000 2.451450000 137 18.51850000 18.51850000 18.51850000 2.329370000 2.450790000 2.669050000 138 19.23080000 19.23080000 19.23080000 2.530960000 2.662880000 2.900030000 139 19.95310000 19.95310000 19.95310000 2.744730000 2.887800000 3.144980000 140 20.68560000 20.68560000 20.68560000 2.971230000 3.126100000 3.404510000 141 21.42860000 21.42860000 21.42860000 3.211000000 3.378370000 3.679240000 142 22.18230000 22.18230000 22.18230000 3.464630000 3.645220000 3.969850000 143 23.72260000 23.72260000 23.72260000 4.015870000 4.225190000 4.601480000 144 24.50980000 24.50980000 24.50980000 4.314770000 4.539670000 4.943970000 145 25.30860000 25.30860000 25.30860000 4.630100000 4.871440000 5.305280000 146 26.11940000 26.11940000 26.11940000 4.962580000 5.221250000 5.686240000 147 26.94240000 26.94240000 26.94240000 5.312950000 5.589890000 6.087710000 148 27.77780000 27.77780000 27.77780000 5.682010000 5.978180000 6.510580000 149 28.62600000 28.62600000 28.62600000 6.070570000 6.386990000 6.955800000 150 29.48720000 29.48720000 29.48720000 6.479480000 6.817220000 7.424350000 151 30.36180000 30.36180000 30.36180000 6.909660000 7.269820000 7.917250000 152 31.25000000 31.25000000 31.25000000 7.362030000 7.745770000 8.435590000 153 32.15220000 32.15220000 32.15220000 7.837590000 8.246120000 8.980490000 154 33.06880000 33.06880000 33.06880000 8.337360000 8.771940000 9.553140000 155 34.00000000 34.00000000 34.00000000 8.862420000 9.324370000 10.15480000 156 34.94620000 34.94620000 34.94620000 9.413920000 9.904620000 10.78670000 157 35.90790000 35.90790000 35.90790000 9.993030000 10.51390000 11.45030000 158 36.88520000 36.88520000 36.88520000 10.60100000 11.15360000 12.14690000 159 37.87880000 37.87880000 37.87880000 11.23920000 11.82500000 12.87810000 160 38.88890000 38.88890000 38.88890000 11.90880000 12.52960000 13.64540000 161 39.91600000 39.91600000 39.91600000 12.61150000 13.26890000 14.45060000 162 40.96050000 40.96050000 40.96050000 13.34870000 14.04450000 15.29520000 163 42.02280000 42.02280000 42.02280000 14.12190000 14.85800000 16.18120000 164 43.10340000 43.10340000 43.10340000 14.93290000 15.71130000 17.11050000 165 44.20290000 44.20290000 44.20290000 15.78340000 16.60610000 18.08500000 166 45.32160000 45.32160000 45.32160000 16.67530000 17.54450000 19.10700000 167 46.46020000 46.46020000 46.46020000 17.61050000 18.52840000 20.17850000 168 47.61900000 47.61900000 47.61900000 18.59100000 19.56000000 21.30200000 169 48.79880000 48.79880000 48.79880000 19.61900000 20.64160000 22.47990000 170 50.00000000 50.00000000 50.00000000 20.69670000 21.77560000 23.71480000 171 51.22320000 51.22320000 51.22320000 21.82670000 22.96440000 25.00950000 172 52.46910000 52.46910000 52.46910000 23.01130000 24.21070000 26.36680000 173 53.73830000 53.73830000 53.73830000 24.25320000 25.51740000 27.78990000 174 55.03140000 55.03140000 55.03140000 25.55520000 26.88730000 29.28180000 175 56.34920000 56.34920000 56.34920000 26.92030000 28.32360000 30.84600000 176 57.69230000 57.69230000 57.69230000 28.35170000 29.82950000 32.48600000 177 59.06150000 59.06150000 59.06150000 29.85250000 31.40860000 34.20580000 178 60.45750000 60.45750000 60.45750000 31.42640000 33.06450000 36.00910000 179 61.88120000 61.88120000 61.88120000 33.07690000 34.80100000 37.90030000 180 63.33330000 63.33330000 63.33330000 34.80800000 36.62230000 39.88380000 181 64.81480000 64.81480000 64.81480000 36.62380000 38.53280000 41.96440000 182 66.32650000 66.32650000 66.32650000 38.52870000 40.53700000 44.14710000 183 67.86940000 67.86940000 67.86940000 40.52730000 42.63970000 46.43710000 184 69.44440000 69.44440000 69.44440000 42.62450000 44.84630000 48.84020000 185 71.05260000 71.05260000 71.05260000 44.82550000 47.16200000 51.36210000 186 72.69500000 72.69500000 72.69500000 47.13590000 49.59280000 54.00940000 187 74.37280000 74.37280000 74.37280000 49.56140000 52.14480000 56.78870000 188 76.08700000 76.08700000 76.08700000 52.10840000 54.82460000 59.70710000 189 77.83880000 77.83880000 77.83880000 54.78350000 57.63910000 62.77220000 190 79.62960000 79.62960000 79.62960000 57.59360000 60.59570000 65.99220000 191 81.46070000 81.46070000 81.46070000 60.54640000 63.70230000 69.37550000 192 83.33330000 83.33330000 83.33330000 63.64960000 66.96740000 72.93130000 193 85.24900000 85.24900000 85.24900000 66.91200000 70.39970000 76.66940000 194 87.20930000 87.20930000 87.20930000 70.34240000 74.00900000 80.60010000 195 89.21570000 89.21570000 89.21570000 73.95070000 77.80530000 84.73450000 196 91.26980000 91.26980000 91.26980000 77.74700000 81.79960000 89.08440000 197 100.0000000 100.0000000 91.96320000 92.00840000 98.78500000 92.91030000 198 100.0000000 81.60980000 76.74380000 74.19320000 71.03720000 62.66260000 199 100.0000000 84.45000000 86.88810000 79.14620000 75.87800000 79.93090000 200 10.94810000 0.000000000 9.601720000 0.422464000 0.205741000 0.564354000 201 0.000000000 0.000000000 15.10070000 0.282430000 0.112979000 1.487330000 202 0.000000000 10.33340000 22.67520000 0.933476000 0.762126000 3.717550000 203 29.91970000 0.000000000 42.70670000 5.681600000 2.608070000 14.76950000 204 44.35130000 0.000000000 67.30290000 14.45470000 6.579090000 40.11370000 205 49.52420000 69.01080000 78.69820000 35.26760000 40.43180000 61.81220000 206 23.75210000 70.09500000 0.000000000 18.11520000 33.63920000 5.538480000 207 53.09250000 71.70330000 0.000000000 27.45220000 39.69580000 6.215520000 208 100.0000000 85.42810000 33.11380000 68.11600000 72.47760000 18.72450000 209 100.0000000 91.35830000 69.54470000 78.67070000 83.13580000 54.46620000 210 46.72430000 20.89060000 43.02070000 11.70290000 7.402950000 15.61430000 211 66.90700000 19.55090000 51.63590000 22.24650000 12.44730000 23.34420000 212 0.000000000 0.000000000 57.69230000 5.384230000 2.153830000 28.35430000 213 0.000000000 45.59070000 80.88170000 17.67500000 17.24030000 61.72840000 214 0.000000000 62.98100000 84.26860000 25.32340000 30.82840000 69.54960000 215 0.000000000 45.08500000 59.05490000 11.86950000 14.67140000 31.91550000 216 0.000000000 64.62960000 71.11170000 22.22020000 30.79730000 49.47620000 217 0.000000000 52.38060000 57.51790000 13.97350000 19.39080000 31.04160000 218 0.000000000 69.86820000 68.43220000 24.08930000 35.64120000 46.69180000 219 0.000000000 70.48080000 100.0000000 34.61680000 40.35660000 100.5780000 220 0.000000000 79.35790000 100.0000000 39.55510000 50.23390000 102.2240000 221 0.000000000 88.78420000 100.0000000 45.57600000 62.27660000 104.2310000 222 0.000000000 41.38020000 31.03300000 6.512640000 10.82310000 8.962870000 223 0.000000000 58.32010000 30.07070000 12.20790000 22.36190000 10.40700000 224 47.77500000 37.97340000 0.000000000 12.37600000 12.69220000 1.797710000 225 61.25000000 46.87190000 0.000000000 20.78650000 20.74470000 2.908840000 226 70.64520000 60.11200000 0.000000000 30.87940000 33.25200000 4.791160000 227 83.29470000 84.23340000 0.000000000 52.10640000 63.26250000 9.465270000 228 65.23390000 68.26600000 0.000000000 31.56060000 39.19800000 5.902970000 229 68.39920000 78.31160000 14.21970000 39.02120000 51.09640000 9.103550000 230 74.32500000 100.0000000 38.72730000 59.47160000 83.48650000 24.72720000 231 79.58850000 100.0000000 84.97470000 73.33500000 89.43500000 79.53460000 232 0.000000000 18.62310000 21.20980000 1.483450000 2.013140000 3.435440000 233 0.000000000 25.31750000 31.72670000 3.188680000 4.064940000 8.193120000 234 0.000000000 34.90900000 45.97710000 6.801720000 8.374630000 18.38980000 235 68.27620000 43.77400000 49.31960000 27.44230000 22.33530000 22.85580000 236 76.82380000 70.03830000 53.78700000 44.04710000 46.43160000 30.83190000 237 0.000000000 32.92980000 28.79140000 4.275250000 6.682900000 7.184590000 238 0.000000000 73.75240000 63.54720000 24.96480000 39.27720000 41.17270000 239 0.000000000 100.0000000 77.27440000 45.99600000 75.61560000 65.83920000 240 0.000000000 100.0000000 88.30430000 49.48760000 77.01240000 84.22670000 241 0.000000000 100.0000000 100.0000000 53.80730000 78.74040000 106.9750000 242 0.000000000 39.39160000 61.53190000 10.81250000 11.69960000 34.20710000 243 0.000000000 44.09460000 100.0000000 23.95600000 19.03330000 97.02350000 244 0.000000000 52.35390000 100.0000000 26.66540000 24.45240000 97.92680000 245 0.000000000 61.07990000 100.0000000 30.14230000 31.40680000 99.08590000 246 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 247 41.54630000 0.000000000 12.81390000 6.172290000 3.159260000 1.316250000 248 70.31060000 0.000000000 23.65710000 19.76310000 10.10090000 4.881600000 249 84.78780000 0.000000000 47.23920000 32.15640000 16.17690000 19.61110000 250 100.0000000 0.000000000 52.92420000 45.69230000 23.04130000 25.38520000 251 100.0000000 0.000000000 63.08060000 47.79090000 23.88080000 36.43710000 252 100.0000000 0.000000000 86.90030000 54.49320000 26.56190000 71.73250000 253 68.22890000 19.45920000 60.43860000 24.73070000 13.51140000 32.56630000 254 48.72460000 0.000000000 34.30220000 10.20000000 5.060170000 9.434580000 255 53.83400000 0.000000000 45.04880000 13.68920000 6.696250000 16.95140000 256 67.68530000 0.000000000 45.44390000 20.66480000 10.28540000 17.59420000 257 81.86040000 0.000000000 57.65320000 31.93040000 15.84010000 29.55520000 258 85.37840000 0.000000000 88.42760000 42.90120000 20.52610000 73.89210000 259 35.12170000 51.67870000 44.44730000 15.53660000 20.08960000 18.96210000 260 35.46710000 50.54140000 54.26730000 16.89880000 20.00510000 27.63910000 261 35.06590000 58.32980000 61.56210000 21.25310000 26.46190000 36.54150000 262 37.98160000 74.68580000 93.19550000 39.18280000 46.35280000 87.91110000 263 64.46880000 83.77100000 100.0000000 57.97760000 63.76650000 103.8650000 264 78.79220000 83.70940000 100.0000000 66.64850000 68.17850000 104.2600000 265 100.0000000 91.11700000 100.0000000 88.43020000 86.76780000 106.7000000 266 24.52780000 0.000000000 30.82510000 3.231760000 1.509370000 7.232100000 267 26.78640000 0.000000000 70.09100000 10.53740000 4.478100000 43.61270000 268 32.26250000 0.000000000 100.0000000 21.47630000 8.986810000 95.21500000 269 41.60570000 26.46420000 100.0000000 25.96590000 14.15420000 95.97590000 270 43.49310000 55.64040000 100.0000000 34.50830000 30.32830000 98.64760000 271 49.41410000 69.26280000 100.0000000 42.74380000 43.62120000 100.7790000 272 87.38650000 68.53030000 100.0000000 64.28200000 54.17770000 101.6820000 273 100.0000000 70.32150000 100.0000000 75.77310000 61.45180000 102.4810000 274 57.05340000 10.24880000 17.93840000 12.65460000 6.830390000 2.813580000 275 81.57000000 0.000000000 14.12310000 26.59130000 13.68040000 2.517210000 276 100.0000000 100.0000000 53.18250000 81.49750000 94.58040000 37.55820000 277 23.05960000 26.79320000 0.000000000 3.611640000 4.793350000 0.734901000 278 34.13740000 29.37270000 0.000000000 6.296380000 6.834130000 0.987346000 279 32.55640000 80.25540000 32.30620000 27.04300000 46.49410000 15.43350000 280 58.17970000 100.0000000 36.82360000 50.29410000 78.78240000 23.07030000 281 83.54270000 100.0000000 54.40440000 68.25880000 87.72880000 38.14210000 282 89.27070000 100.0000000 66.01880000 75.12900000 90.98060000 51.56490000 283 66.72690000 72.46480000 50.02420000 38.48400000 45.52900000 27.38440000 284 100.0000000 87.27330000 56.80130000 72.94790000 76.35770000 38.16730000 285 57.75510000 51.51830000 31.22700000 22.04240000 23.54810000 10.70030000 286 100.0000000 53.93300000 31.98570000 51.90720000 40.24400000 12.74600000 287 100.0000000 64.63140000 35.47410000 56.77890000 49.38620000 16.22570000 288 100.0000000 67.54200000 48.16870000 59.94480000 52.88140000 26.02760000 289 50.82600000 34.81090000 23.64250000 13.57790000 12.12570000 5.592940000 290 74.50760000 34.78060000 23.70110000 25.85550000 18.44470000 6.187360000 291 74.80590000 60.99490000 100.0000000 51.88550000 42.56120000 100.0930000 292 75.51760000 71.74190000 100.0000000 57.51420000 53.13900000 101.8380000 293 0.000000000 70.77200000 33.60510000 18.35810000 34.09410000 14.21170000 294 0.000000000 85.54980000 37.24240000 27.42510000 51.56380000 19.28640000 295 0.000000000 100.0000000 38.83460000 38.01200000 72.42180000 23.79400000 296 0.000000000 100.0000000 53.37790000 40.29550000 73.33530000 35.81970000 297 0.000000000 23.42150000 12.51660000 1.655870000 3.012900000 1.474050000 298 0.000000000 33.74690000 14.29130000 3.530000000 6.660170000 2.411030000 299 76.51200000 42.82270000 64.60180000 35.33030000 25.63780000 39.28060000 300 90.95650000 61.21350000 65.16050000 52.66620000 44.37710000 42.67610000 301 35.83790000 17.90660000 19.48910000 5.626100000 4.051600000 3.080030000 302 51.74140000 23.38280000 26.49130000 12.11790000 8.307800000 6.060970000 303 86.42750000 51.87350000 84.87650000 50.94940000 37.34610000 70.49200000 304 100.0000000 57.73610000 100.0000000 69.97250000 49.84980000 100.5470000 305 0.000000000 45.49680000 16.16890000 6.655130000 12.78600000 3.837800000 306 15.40400000 54.88520000 32.03670000 11.70890000 20.05580000 10.99450000 307 25.43920000 100.0000000 91.44970000 52.61790000 78.49930000 90.10720000 308 33.60700000 100.0000000 100.0000000 57.55550000 80.67260000 107.1510000 309 0.000000000 35.99710000 66.56310000 11.15450000 10.51070000 40.09540000 310 0.000000000 37.62620000 83.49760000 16.30660000 13.19000000 65.32080000 311 25.70480000 0.000000000 22.66030000 2.768260000 1.347470000 3.728610000 312 100.0000000 0.000000000 25.12220000 42.10360000 21.60570000 6.486400000 313 100.0000000 0.000000000 34.27690000 42.95180000 21.94500000 10.95330000 314 100.0000000 0.000000000 43.47890000 44.12900000 22.41590000 17.15240000 315 16.94390000 0.000000000 19.64370000 1.334900000 0.630008000 2.691180000 316 15.27790000 8.502690000 21.40190000 1.428370000 0.901001000 3.286270000 317 11.55950000 25.56510000 33.91570000 3.813350000 4.416590000 9.425510000 318 0.000000000 53.56840000 44.48770000 12.10100000 19.33940000 19.03010000 319 0.000000000 65.37960000 51.20780000 18.18600000 29.74650000 26.49600000 320 0.000000000 82.14170000 58.76390000 28.80570000 48.64440000 37.25950000 321 0.000000000 100.0000000 65.27270000 42.82100000 74.34550000 49.11920000 322 17.92590000 21.10810000 13.36620000 2.325500000 2.908900000 1.570930000 323 24.55140000 17.89220000 17.91850000 3.103020000 2.758380000 2.525640000 324 32.26720000 35.31460000 82.87670000 18.99400000 13.79320000 64.25970000 325 20.95070000 32.28680000 39.12180000 6.593070000 7.552180000 13.12150000 326 37.29560000 37.04950000 52.32510000 13.08390000 12.22260000 24.43800000 327 46.70300000 100.0000000 79.55160000 54.40020000 79.87020000 69.75730000 328 56.97890000 100.0000000 100.0000000 65.77650000 84.91080000 107.5360000 329 0.000000000 43.67700000 24.89290000 6.631510000 11.90730000 6.393010000 330 0.000000000 70.38840000 45.80690000 19.76090000 34.33750000 22.57910000 331 49.68160000 69.57050000 48.97210000 28.70950000 38.26910000 25.55620000 332 100.0000000 70.42320000 68.15070000 65.54230000 57.44310000 48.34500000 333 53.40590000 35.08430000 32.46350000 15.47310000 13.10500000 9.683100000 334 71.03330000 33.87260000 31.11420000 24.12880000 17.18840000 9.304860000 335 100.0000000 53.27580000 42.16010000 52.89220000 40.24650000 19.14000000 336 100.0000000 77.17180000 53.54310000 66.03140000 63.53800000 32.73470000 337 100.0000000 21.12680000 0.000000000 42.40940000 23.60170000 2.320910000 338 100.0000000 21.04540000 18.88240000 42.86120000 23.76660000 4.749060000 339 100.0000000 21.68090000 40.48210000 44.94840000 24.72710000 15.35320000 340 100.0000000 19.02560000 51.30270000 46.32770000 24.78350000 24.14390000 341 51.58180000 24.09540000 0.000000000 11.18010000 8.084860000 0.971428000 342 71.14940000 23.40830000 0.000000000 20.97430000 12.99100000 1.402330000 343 84.52920000 36.02010000 0.000000000 32.28080000 22.26150000 2.595950000 344 100.0000000 36.08740000 0.000000000 45.03940000 28.86210000 3.197710000 345 100.0000000 73.56880000 0.000000000 59.44360000 57.67260000 7.999690000 346 100.0000000 86.17350000 0.000000000 67.01580000 72.81800000 10.52400000 347 15.10070000 15.10070000 15.10070000 1.487190000 1.564710000 1.704060000 348 10.08490000 10.08490000 10.08490000 0.612056000 0.643959000 0.701309000 349 0.000000000 11.29030000 0.000000000 0.295161000 0.590365000 0.098399100 350 11.29030000 11.29030000 11.29030000 0.784561000 0.825456000 0.898969000 351 40.36230000 32.79050000 25.84320000 9.606860000 9.417190000 6.137270000 352 47.73890000 38.56910000 47.42830000 16.01010000 14.38120000 20.27580000 353 47.51700000 39.87250000 62.61730000 19.20860000 16.18500000 35.90530000 354 59.89720000 62.95070000 100.0000000 44.33070000 39.95280000 99.98780000 355 65.58440000 75.65990000 100.0000000 53.72090000 54.35600000 102.2730000 356 100.0000000 80.84430000 100.0000000 81.68940000 73.28520000 104.4530000 357 45.74350000 22.67340000 29.48030000 9.981640000 7.034360000 7.278390000 358 53.92080000 28.84010000 42.45540000 15.66620000 11.20620000 15.71520000 359 75.30950000 29.37450000 44.14200000 27.50940000 17.42540000 17.57770000 360 38.12510000 41.34480000 22.11150000 10.72600000 13.06440000 5.381190000 361 37.85270000 75.21170000 41.88290000 26.64260000 41.80040000 20.61920000 362 44.94770000 100.0000000 44.47740000 45.90030000 76.39790000 28.25450000 363 27.82910000 42.06700000 60.86510000 13.85740000 14.35010000 33.78830000 364 45.53960000 54.98260000 60.91670000 22.97550000 25.38920000 35.49780000 365 50.84600000 73.25150000 74.56890000 36.81720000 44.65890000 56.30190000 366 58.24590000 83.01470000 75.60540000 46.06580000 57.87310000 59.89470000 367 41.79670000 60.83140000 53.76490000 22.65020000 28.93640000 28.56060000 368 52.81550000 100.0000000 57.36450000 51.20410000 78.86900000 40.39600000 369 52.66790000 100.0000000 69.15840000 53.84640000 79.91880000 54.63510000 370 63.00490000 100.0000000 83.41090000 62.80050000 84.06240000 76.40560000 371 28.23840000 0.000000000 17.02260000 2.923680000 1.464790000 2.055330000 372 44.93150000 13.47710000 100.0000000 25.58450000 11.75150000 95.53220000 373 56.74050000 24.06330000 100.0000000 31.46820000 16.45240000 96.12950000 374 70.66040000 33.59710000 100.0000000 40.51140000 23.62180000 97.03690000 375 86.98590000 44.71320000 100.0000000 54.48830000 35.04640000 98.50550000 376 23.51830000 10.56320000 76.16640000 11.88310000 5.358990000 52.39810000 377 38.74230000 20.56940000 76.20250000 16.15720000 8.821790000 52.89550000 378 59.54810000 39.57380000 75.90410000 27.68750000 20.04860000 54.00770000 379 72.45280000 58.73980000 76.83110000 41.50840000 36.70560000 57.89050000 380 93.37350000 93.37350000 93.37350000 81.74250000 86.00330000 93.66260000 381 95.52850000 95.52850000 95.52850000 85.94890000 90.42900000 98.48230000 382 97.73660000 97.73660000 97.73660000 90.37880000 95.08980000 103.5580000 383 0.000000000 15.57160000 35.87560000 2.492600000 1.954910000 10.17380000 384 0.000000000 19.86960000 35.08170000 2.826180000 2.767670000 9.836340000 385 27.00260000 20.61760000 50.36790000 7.420640000 5.011740000 21.51350000 386 26.97610000 29.77110000 61.05270000 10.89920000 8.610580000 33.05190000 387 41.67990000 28.86190000 62.91330000 14.85750000 10.35940000 35.36250000 388 45.94140000 77.64390000 71.80230000 36.66280000 48.32450000 53.05850000 389 47.79290000 80.80180000 83.00370000 42.48890000 53.73860000 70.94300000 390 46.83360000 84.04540000 100.0000000 50.22460000 60.02910000 103.5520000 391 0.000000000 21.06240000 64.94430000 8.148840000 5.120820000 37.17600000 392 0.000000000 29.32450000 67.53760000 10.02210000 7.862490000 40.89930000 393 0.000000000 48.99920000 72.75430000 16.41530000 18.48380000 49.70770000 394 100.0000000 49.20250000 74.82600000 58.29300000 40.10810000 54.66890000 395 100.0000000 64.00690000 80.14890000 65.73690000 52.50670000 64.82720000 396 57.06540000 42.30960000 47.42200000 20.90060000 18.37720000 20.78400000 397 62.55650000 48.61410000 48.63840000 25.71670000 23.69730000 22.60750000 398 22.94690000 22.94690000 22.94690000 3.732700000 3.927270000 4.277020000 399 25.02750000 20.22760000 23.59470000 3.777880000 3.440350000 4.415270000 400 25.09310000 20.96920000 34.81140000 4.895900000 4.029210000 9.811340000 401 100.0000000 37.77550000 37.72810000 47.55720000 30.51260000 14.47380000 402 100.0000000 39.36850000 47.13230000 49.29280000 31.84640000 21.64230000 403 100.0000000 46.32630000 60.42730000 53.78340000 36.81210000 35.52010000 404 100.0000000 60.04890000 63.27230000 59.48270000 47.19590000 40.55120000 405 58.97390000 17.19250000 0.000000000 13.65450000 8.144180000 0.852494000 406 82.86290000 20.24720000 0.000000000 28.34100000 16.19380000 1.632350000 407 100.0000000 56.66120000 18.74620000 51.94430000 41.94590000 7.741180000 408 100.0000000 77.13630000 20.41770000 61.99010000 61.88860000 11.55330000 409 100.0000000 100.0000000 21.17330000 77.58970000 93.01710000 16.97890000 410 10.24510000 0.000000000 17.23850000 0.652821000 0.292900000 2.002950000 411 0.000000000 12.12380000 19.33590000 0.831656000 0.885062000 2.676800000 412 0.000000000 0.000000000 61.88120000 6.281580000 2.512790000 33.08000000 413 42.03990000 0.000000000 85.33520000 18.86810000 8.256090000 67.35420000 414 57.02950000 0.000000000 100.0000000 30.04260000 13.40300000 95.61610000 415 78.47000000 0.000000000 100.0000000 42.24540000 19.69390000 96.18730000 416 100.0000000 0.000000000 100.0000000 59.28850000 28.48010000 96.98520000 417 100.0000000 24.20990000 100.0000000 60.86840000 31.64020000 97.51190000 418 37.22360000 0.000000000 35.69940000 6.566480000 3.168800000 10.08650000 419 46.36570000 0.000000000 50.64270000 11.64910000 5.538560000 21.64440000 420 57.03430000 0.000000000 64.07960000 18.77760000 8.896980000 36.28130000 421 100.0000000 0.000000000 74.74930000 50.75570000 25.06680000 52.05020000 422 100.0000000 36.75840000 74.33500000 54.59820000 32.93740000 52.76080000 423 100.0000000 41.64100000 86.47080000 59.55680000 36.91970000 72.71190000 424 100.0000000 42.18430000 100.0000000 64.64630000 39.19660000 98.77130000 425 63.15820000 0.000000000 28.23930000 16.12970000 8.186080000 6.594990000 426 74.75620000 0.000000000 36.88390000 23.76130000 12.01720000 11.61930000 427 85.46240000 0.000000000 35.39810000 31.03080000 15.78490000 11.05120000 428 0.000000000 17.76410000 50.28520000 4.779700000 3.191680000 21.22580000 429 0.000000000 17.81970000 86.07750000 13.78560000 6.803070000 68.62520000 430 0.000000000 16.51100000 100.0000000 18.73090000 8.582350000 95.28160000 431 0.000000000 35.62870000 100.0000000 21.74550000 14.61200000 96.28660000 432 41.47440000 38.77230000 100.0000000 28.45350000 19.19150000 96.81710000 433 47.94840000 48.96450000 100.0000000 33.67560000 26.31570000 97.91700000 434 62.63830000 53.19290000 100.0000000 41.71230000 32.66470000 98.71900000 435 19.99000000 35.89980000 32.71870000 6.500080000 8.750990000 9.453920000 436 25.64450000 100.0000000 45.32760000 40.99300000 73.85320000 28.69900000 437 66.12700000 100.0000000 50.96560000 56.46310000 81.72080000 34.28600000 438 44.36640000 53.42320000 28.54190000 17.05640000 22.03280000 9.357920000 439 48.49150000 65.47570000 33.87810000 24.15380000 33.17620000 13.88350000 440 59.17360000 73.79380000 78.23160000 41.85410000 47.57180000 62.11740000 441 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 442 2.941180000 0.000000000 0.000000000 0.017670400 0.009109590 0.000827230 443 8.909850000 8.909850000 8.909850000 0.466089000 0.490383000 0.534056000 444 44.40240000 84.74530000 0.000000000 31.76340000 53.26340000 8.607160000 445 44.03720000 100.0000000 0.000000000 42.54910000 75.02130000 12.23850000 446 73.93760000 100.0000000 0.000000000 56.98530000 82.46350000 12.91430000 447 86.67970000 100.0000000 0.000000000 65.87140000 87.04460000 13.33030000 448 100.0000000 100.0000000 0.000000000 76.99580000 92.77950000 13.85110000 449 100.0000000 100.0000000 66.02370000 84.23940000 95.67720000 51.99760000 450 35.78880000 15.73370000 0.000000000 4.916600000 3.443800000 0.405651000 451 41.69810000 25.61310000 0.000000000 7.811900000 6.682220000 0.878167000 452 55.59570000 34.65640000 0.000000000 14.81680000 12.80100000 1.690110000 453 84.58290000 47.60900000 0.000000000 35.52610000 28.69350000 3.666440000 454 100.0000000 50.03240000 0.000000000 49.03590000 36.85570000 4.530040000 455 100.0000000 62.38890000 0.000000000 53.90800000 46.60060000 6.154260000 456 19.76820000 43.91870000 0.000000000 7.021040000 12.31090000 2.006290000 457 26.64670000 64.35390000 39.42340000 18.14420000 29.22160000 16.90000000 458 24.80520000 66.87960000 100.0000000 34.73410000 37.73770000 100.0660000 459 44.74760000 92.09100000 100.0000000 54.91630000 70.51410000 105.3290000 460 78.54690000 92.35400000 100.0000000 72.31640000 79.76290000 106.1970000 461 89.83530000 91.55390000 100.0000000 80.07780000 82.91950000 106.3980000 462 89.83820000 100.0000000 100.0000000 86.38750000 95.53640000 108.5000000 463 100.0000000 100.0000000 100.0000000 95.04580000 100.0000000 108.9060000 464 30.61980000 36.57930000 0.000000000 6.970120000 9.406820000 1.448420000 465 32.22310000 46.29290000 0.000000000 9.989990000 14.90840000 2.351210000 466 48.54030000 50.96630000 11.69310000 16.69550000 20.64520000 3.948760000 467 48.08970000 56.97300000 0.000000000 18.61860000 25.00270000 3.844950000 468 57.42180000 57.83970000 11.96540000 23.07030000 27.79820000 5.037330000 469 83.20730000 73.44680000 0.000000000 45.66340000 50.47010000 7.335580000 470 52.45290000 47.03090000 18.35860000 17.21690000 18.92930000 5.021450000 471 55.73800000 49.73010000 38.12780000 21.26300000 22.13460000 14.50220000 472 60.26610000 53.12200000 54.81130000 27.24680000 26.69770000 28.93280000 473 11.27770000 6.767730000 15.84690000 0.749378000 0.492244000 1.701600000 474 0.000000000 8.603320000 12.70520000 0.355521000 0.402004000 1.071380000 475 0.000000000 10.11480000 40.20410000 2.664990000 1.436910000 12.89110000 476 0.000000000 12.55950000 55.24120000 5.267010000 2.703920000 25.89670000 477 21.39250000 33.55170000 87.90110000 18.21900000 12.63000000 72.72660000 478 26.32970000 47.19720000 100.0000000 27.10010000 22.06840000 97.44370000 479 50.08370000 55.35810000 68.38280000 26.57820000 27.25830000 44.87740000 480 85.07940000 54.25090000 68.95970000 46.19270000 36.72490000 46.43600000 481 100.0000000 92.72810000 91.14350000 86.24540000 87.72640000 89.54530000 482 100.0000000 100.0000000 100.0000000 95.04580000 100.0000000 108.9060000 483 11.28200000 27.83220000 24.77960000 3.326090000 4.805010000 5.151920000 484 0.000000000 26.38200000 38.65840000 4.140730000 4.710250000 12.39150000 485 0.000000000 24.79990000 51.26250000 5.817880000 4.992810000 22.42090000 486 13.04630000 27.16830000 63.48920000 9.149820000 6.971790000 35.70050000 487 0.000000000 44.00680000 41.68240000 8.514450000 12.81490000 15.83310000 488 29.05200000 83.18820000 46.05850000 29.85610000 50.42700000 25.35870000 489 46.75420000 87.43330000 52.95160000 38.81980000 59.00840000 32.71630000 490 47.64710000 87.38550000 82.90270000 46.60870000 62.11100000 72.17410000 491 0.000000000 31.64850000 21.24880000 3.446540000 5.935760000 4.101780000 492 0.000000000 58.77640000 18.51730000 11.55430000 22.40260000 6.033710000 493 45.54840000 71.56150000 15.20880000 24.73240000 38.14960000 7.564200000 494 49.77640000 91.76190000 17.57810000 38.88360000 63.94070000 12.36050000 495 23.13920000 56.89240000 0.000000000 11.99320000 21.53930000 3.525550000 496 24.88550000 100.0000000 0.000000000 37.69310000 72.51780000 12.01120000 497 74.45340000 100.0000000 22.42230000 57.98600000 82.90160000 16.47760000 498 87.13760000 100.0000000 24.13940000 67.01480000 87.54250000 17.51980000 499 28.24970000 33.96910000 28.37460000 7.016560000 8.426690000 7.183570000 500 40.83400000 32.94620000 31.87820000 10.32420000 9.772500000 8.998580000 501 100.0000000 32.93960000 52.07860000 48.64700000 29.19920000 25.60570000 502 100.0000000 37.20870000 63.52700000 51.95890000 32.05350000 38.33160000 503 100.0000000 57.13860000 69.88230000 59.88830000 45.42910000 48.63360000 504 38.55020000 21.43610000 36.89510000 8.291930000 5.836890000 11.24850000 505 59.73370000 26.33850000 35.94760000 17.08280000 11.41010000 11.27390000 506 64.42260000 24.89420000 42.18150000 20.06360000 12.52490000 15.53480000 507 20.40940000 12.95690000 10.43770000 1.776510000 1.494530000 0.851985000 508 18.15310000 19.76930000 4.327400000 1.997210000 2.529660000 0.477815000 509 15.82200000 24.03100000 26.11490000 3.211410000 3.854370000 5.512790000 510 16.84860000 68.86050000 37.15060000 18.60700000 32.72530000 16.05640000 511 36.11830000 69.92240000 52.33110000 25.01620000 36.56360000 28.51330000 512 84.02830000 79.77710000 57.78090000 55.28350000 60.17520000 37.01970000 513 100.0000000 82.61000000 67.17900000 72.25480000 71.25550000 49.39170000 514 61.04100000 71.12810000 25.12030000 31.69460000 41.33450000 10.84220000 515 68.58690000 87.43940000 23.39920000 45.35280000 62.81200000 13.61280000 516 88.46170000 89.84230000 41.40930000 62.34150000 73.78330000 24.56680000 517 87.92100000 100.0000000 42.21950000 69.53750000 88.62160000 27.64420000 518 62.40780000 74.11230000 38.27490000 35.30750000 45.41860000 18.35300000 519 64.63950000 92.82480000 40.04880000 48.56500000 69.82570000 23.56470000 520 72.65580000 94.01150000 54.77130000 56.44640000 74.88960000 36.65570000 521 19.65700000 30.38680000 9.637400000 3.861770000 5.844960000 1.476080000 522 18.01450000 32.87220000 0.000000000 4.046900000 6.682290000 1.076570000 523 81.31420000 41.81490000 18.22190000 31.84820000 24.17140000 5.225230000 524 86.69920000 59.27730000 20.18930000 41.98520000 38.39070000 8.001700000 525 100.0000000 67.48680000 21.58350000 56.91640000 51.62650000 10.21320000 526 20.86420000 17.95120000 9.943050000 2.244810000 2.359220000 0.927664000 527 22.75300000 20.64220000 0.000000000 2.702270000 3.044970000 0.445348000 528 32.28610000 31.02060000 9.641560000 6.262250000 7.262050000 1.623650000 529 33.81240000 45.31770000 13.41980000 10.28880000 14.59090000 3.416180000 530 32.64550000 53.64630000 9.055120000 12.69810000 20.03080000 3.678000000 531 16.38040000 5.029340000 10.35840000 0.944802000 0.546849000 0.701951000 532 17.12060000 0.000000000 13.06010000 1.055670000 0.520523000 1.120610000 533 16.12000000 7.635410000 15.99720000 1.190450000 0.762066000 1.764980000 534 14.83030000 12.22600000 17.37040000 1.356050000 1.176750000 2.169970000 535 20.51510000 0.000000000 55.24110000 6.159820000 2.610300000 25.83150000 536 74.18930000 22.33360000 77.55190000 33.03000000 17.80030000 55.78780000 537 85.03970000 22.49630000 90.64660000 44.76360000 23.39290000 78.39140000 538 36.66110000 0.000000000 25.40800000 5.425220000 2.694420000 4.883080000 539 83.11890000 0.000000000 23.41580000 28.20140000 14.45310000 5.188420000 540 91.53260000 45.31090000 27.02380000 41.23270000 30.44820000 9.028370000 541 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 542 0.000000000 53.78440000 36.34230000 11.09020000 19.06390000 13.30940000 543 38.99700000 65.36770000 40.87710000 21.76040000 31.76790000 18.21350000 544 52.79210000 66.72470000 56.35360000 29.92000000 36.63860000 32.29750000 545 52.71670000 57.01310000 51.25340000 24.63050000 27.64650000 25.79370000 546 60.92910000 59.45420000 51.23240000 29.41270000 31.60250000 26.28570000 547 67.88940000 63.26750000 59.15770000 36.35020000 37.47930000 35.14170000 548 76.06570000 70.33510000 61.42700000 45.26720000 47.10640000 39.10400000 549 36.00080000 22.01870000 17.04370000 6.011450000 4.960370000 2.572590000 550 43.59980000 36.13760000 17.68790000 10.85680000 11.21110000 3.688030000 551 45.43090000 43.84860000 33.04630000 14.68820000 16.05050000 10.61100000 552 46.88420000 78.69230000 33.58550000 30.54370000 46.89790000 16.02990000 553 17.18100000 93.68350000 15.55630000 32.13600000 62.52190000 11.95500000 554 17.97250000 92.65330000 55.58420000 36.14050000 62.94330000 36.24890000 555 21.30290000 92.87220000 100.0000000 49.81580000 68.71500000 105.2500000 556 24.17560000 49.33120000 53.00780000 13.84480000 17.84360000 26.14120000 557 69.11040000 57.15880000 54.24930000 33.45210000 32.21730000 29.10610000 558 72.34530000 56.41780000 59.02930000 36.05290000 33.00840000 34.15220000 559 35.10160000 49.96010000 34.99290000 13.69030000 18.39010000 12.22680000 560 42.17870000 49.53100000 33.34740000 15.41680000 19.08410000 11.32510000 561 53.43340000 59.86010000 42.54300000 24.71510000 29.59650000 18.85340000 562 74.57350000 63.26860000 55.49540000 39.64090000 39.26270000 31.40230000 563 86.98430000 70.00270000 56.86280000 51.88340000 50.37500000 34.32700000 564 94.08190000 73.57610000 72.48340000 63.16430000 58.56940000 54.59760000 565 21.01220000 12.04690000 17.42020000 2.061480000 1.523470000 2.212440000 566 67.23400000 0.000000000 13.82860000 17.45670000 8.972560000 2.031960000 567 100.0000000 0.000000000 14.56500000 41.49930000 21.36400000 3.304320000 568 100.0000000 45.15130000 18.09440000 47.88060000 33.87210000 6.218590000 569 100.0000000 89.28010000 19.59460000 69.60460000 77.19470000 13.85780000 570 100.0000000 100.0000000 38.09140000 79.15660000 93.64390000 25.23050000 571 16.27190000 17.98520000 22.17040000 2.239440000 2.298630000 3.770440000 572 14.01670000 45.18920000 62.41860000 13.18320000 15.31070000 35.81880000 573 18.99200000 51.11520000 73.09580000 18.30220000 20.52320000 50.48850000 574 19.29350000 57.83830000 92.59640000 27.07260000 28.11990000 83.88880000 575 47.13690000 59.24230000 91.46800000 34.02980000 32.61580000 82.26460000 576 46.88860000 75.85580000 100.0000000 45.31970000 50.18880000 101.9110000 577 13.27060000 40.50610000 24.58790000 6.211070000 10.38160000 6.001820000 578 11.90310000 47.30160000 23.21880000 8.001850000 14.27320000 6.146540000 579 0.000000000 71.81600000 21.39940000 17.87280000 34.77550000 8.957360000 580 9.889460000 25.83390000 9.706380000 2.183620000 3.818930000 1.182160000 581 66.03030000 25.08600000 9.544040000 18.36440000 11.99180000 1.886680000 582 68.38000000 33.12260000 0.000000000 21.02410000 15.51190000 1.886280000 583 81.43930000 38.47530000 43.58590000 33.53690000 23.45050000 17.99240000 584 91.13970000 43.87750000 61.26930000 45.61520000 31.47960000 35.88670000 585 33.51640000 46.49130000 23.12900000 11.08230000 15.48040000 6.184890000 586 41.62470000 65.55930000 22.50950000 20.80860000 31.62480000 8.569430000 587 39.09880000 29.02660000 9.436070000 7.683660000 7.445380000 1.558600000 588 47.65710000 35.45630000 10.02090000 11.85140000 11.52470000 2.200800000 589 72.18710000 56.16390000 12.81340000 30.38980000 30.57140000 5.331130000 590 80.37700000 58.44370000 65.95180000 43.70790000 37.99040000 42.90780000 591 88.99580000 66.08200000 77.95220000 56.72700000 49.38430000 61.25130000 592 91.78460000 73.08740000 89.61560000 66.27960000 59.17130000 82.26950000 593 24.47440000 46.03020000 28.64020000 9.511440000 14.40700000 8.329140000 594 22.24320000 69.76370000 29.14370000 18.90990000 33.65850000 11.78620000 595 74.92220000 89.93040000 46.43160000 53.50810000 69.23410000 28.05050000 596 82.95900000 88.94490000 59.03810000 60.64430000 71.63820000 40.32250000 597 100.0000000 91.52230000 81.48580000 82.17210000 84.72180000 72.33400000 598 45.03450000 20.66470000 52.65840000 12.65480000 7.670970000 23.90220000 599 53.72920000 24.35500000 81.69030000 23.68950000 13.25290000 61.95400000 600 27.83380000 8.828420000 31.77830000 4.098730000 2.200590000 7.812470000 601 40.60120000 8.930590000 44.13610000 8.844300000 4.476090000 16.05720000 602 57.20970000 7.029410000 56.08440000 17.23990000 8.457820000 27.24550000 603 67.41690000 10.07980000 66.29390000 24.86620000 12.31650000 39.37840000 604 83.71920000 0.000000000 70.83600000 36.35410000 17.76490000 45.83560000 605 78.52330000 20.52290000 61.06100000 31.43010000 17.12950000 33.62400000 606 100.0000000 21.23380000 62.69100000 48.88630000 26.21350000 36.36480000 607 85.00120000 20.52480000 42.07850000 32.63490000 18.14490000 15.88120000 608 91.13290000 64.17060000 53.73370000 51.70560000 46.13490000 30.31840000 609 100.0000000 73.08180000 61.08780000 65.28550000 59.58720000 40.06610000 610 26.15040000 14.93200000 9.012800000 2.795420000 2.241010000 0.761094000 611 28.26600000 12.03120000 0.000000000 2.901060000 1.999520000 0.233081000 612 43.58280000 13.49900000 0.000000000 7.075830000 4.296910000 0.456543000 613 43.09630000 43.43380000 81.19570000 23.60600000 19.33270000 62.32750000 614 60.56650000 83.41310000 83.83020000 49.93220000 59.95210000 73.13390000 615 60.93400000 83.22900000 90.50130000 52.24530000 60.71250000 84.93190000 616 73.41490000 90.51630000 92.78380000 64.92900000 74.34410000 91.17210000 617 72.72810000 100.0000000 92.15440000 71.31040000 88.10660000 92.30020000 618 24.05490000 40.86220000 44.31740000 9.806520000 12.12370000 17.62450000 619 34.20180000 39.96800000 61.33950000 14.81510000 13.99010000 34.21510000 620 50.52100000 45.41190000 60.22910000 21.40660000 19.70660000 33.69940000 621 54.01600000 47.19750000 77.55110000 27.82110000 23.33320000 57.12900000 622 20.08960000 19.16670000 27.73920000 3.229870000 2.944120000 6.036910000 623 17.10040000 79.29850000 27.88650000 23.40630000 43.81530000 12.92870000 624 47.49680000 79.54390000 56.12300000 34.70430000 49.39740000 34.26750000 625 49.89310000 81.19930000 65.98360000 38.78950000 52.74040000 46.05410000 626 72.75430000 42.32810000 32.11090000 27.37040000 21.95290000 10.57490000 627 82.87780000 46.15940000 30.98950000 35.18930000 27.67900000 10.68310000 628 65.25250000 35.72640000 21.69030000 20.47140000 16.00090000 5.292600000 629 72.08460000 41.91780000 20.33430000 25.90260000 21.13510000 5.562930000 630 82.65980000 65.20770000 30.75010000 42.43990000 42.45230000 13.03090000 631 85.57390000 80.61410000 49.40870000 55.36550000 61.14920000 28.95590000 632 9.743040000 18.03620000 16.55700000 1.418900000 1.919200000 2.108330000 633 0.000000000 23.28540000 20.45090000 2.000530000 3.120840000 3.381330000 634 0.000000000 57.74660000 55.13530000 15.56170000 23.32770000 29.22700000 635 0.000000000 57.39860000 71.30380000 19.12620000 24.52770000 48.69510000 636 0.000000000 72.90340000 85.56570000 30.65620000 40.81750000 73.41520000 637 0.000000000 82.17610000 86.25440000 36.25960000 51.66040000 76.40720000 638 43.25030000 90.55320000 92.11920000 50.34300000 66.89050000 89.24350000 639 64.01310000 92.11460000 100.0000000 63.35930000 74.89160000 105.7290000 640 37.18560000 29.46270000 52.97830000 11.57940000 9.066310000 24.53770000 641 53.80240000 31.14780000 77.38360000 23.57090000 15.04760000 55.49690000 642 57.91760000 38.96520000 100.0000000 34.95670000 22.61660000 97.13550000 643 17.27420000 0.000000000 39.70910000 3.235130000 1.394310000 12.51000000 644 22.49960000 9.290780000 40.04310000 4.155040000 2.148900000 12.83790000 645 26.37300000 50.72010000 39.38780000 12.56040000 18.13560000 15.03020000 646 28.82490000 54.96190000 52.78630000 16.69010000 22.32640000 26.64180000 647 39.54670000 56.26410000 55.18790000 20.33880000 24.90710000 29.33380000 648 43.21670000 57.96170000 73.49440000 26.46210000 28.58120000 52.18530000 649 0.000000000 12.92710000 12.89570000 0.597116000 0.874942000 1.183630000 650 56.85900000 33.03400000 9.660840000 15.14900000 12.44340000 2.157920000 651 69.44780000 42.66730000 0.000000000 23.98960000 20.52330000 2.697330000 652 79.21360000 54.23070000 0.000000000 34.01170000 31.35460000 4.259880000 653 86.49030000 64.75280000 0.000000000 43.71890000 42.95090000 5.986690000 654 92.79830000 65.60920000 11.23070000 49.28740000 46.40300000 7.131530000 655 29.17280000 18.80550000 0.000000000 3.652300000 3.228650000 0.430743000 656 28.51560000 37.41760000 51.03910000 10.83990000 11.22380000 23.15090000 657 36.41860000 49.54730000 58.91270000 17.74260000 19.82650000 32.44390000 658 65.21250000 52.54370000 65.49630000 31.90670000 28.51950000 41.12850000 659 73.16400000 64.87650000 65.76840000 41.73200000 41.18280000 43.39670000 660 59.45370000 27.83610000 22.47730000 15.96720000 11.34160000 4.898290000 661 75.84910000 71.31640000 19.93170000 39.97560000 45.78980000 9.457690000 662 83.17420000 71.03910000 26.41190000 45.32310000 48.27970000 11.99310000 663 34.87770000 0.000000000 55.46690000 9.004920000 4.071940000 26.19480000 664 34.53240000 9.466650000 64.63450000 11.09190000 5.217230000 36.65660000 665 50.89930000 12.50310000 82.43510000 21.51130000 10.27490000 62.71680000 666 69.01010000 16.04420000 100.0000000 36.92980000 17.90260000 96.12170000 667 0.000000000 9.480420000 28.66380000 1.357200000 0.864532000 6.155810000 668 9.978890000 18.24330000 31.29340000 2.509790000 2.390770000 7.680040000 669 10.13370000 18.70570000 45.06590000 4.291940000 3.181490000 16.78180000 670 27.04720000 16.36700000 65.57660000 10.12910000 5.389160000 37.91210000 671 45.82180000 36.82510000 79.19860000 22.19350000 16.09280000 58.58740000 672 58.23390000 50.20080000 90.00280000 34.72970000 27.91250000 78.60670000 673 0.000000000 84.93780000 21.55530000 25.58920000 50.19360000 11.57800000 674 0.000000000 100.0000000 21.82760000 36.39240000 71.77390000 15.26480000 675 25.66410000 100.0000000 27.61850000 38.89430000 73.01400000 17.62870000 676 80.52120000 31.17720000 31.83290000 29.81980000 19.29570000 9.785600000 677 91.70420000 31.54770000 37.10210000 38.95430000 24.04510000 13.27810000 678 90.23710000 34.52550000 63.04480000 42.89190000 26.47590000 37.15320000 679 91.56160000 46.34520000 78.42920000 51.13790000 34.92380000 59.49360000 680 91.24330000 100.0000000 82.22860000 81.20660000 93.59460000 75.31320000 681 31.82140000 38.19640000 36.47830000 9.595450000 11.11360000 11.93780000 682 30.55530000 38.20240000 41.25570000 9.923680000 11.21440000 15.14100000 683 30.25970000 89.50930000 67.57440000 38.62180000 60.63340000 49.62600000 684 48.70020000 89.08840000 75.88430000 46.04630000 63.77610000 61.45090000 685 67.93730000 92.74280000 78.81670000 58.61360000 73.96210000 67.23910000 686 25.48940000 42.06780000 32.45230000 8.885100000 12.31120000 9.870990000 687 37.70120000 57.75460000 32.00750000 16.99160000 24.46230000 11.55120000 688 54.84670000 60.02530000 34.01680000 24.32900000 29.62550000 13.26790000 689 58.19120000 82.06230000 42.48220000 38.43300000 53.86470000 22.76950000 690 23.85990000 31.32110000 19.31260000 5.033360000 6.671320000 3.565510000 691 28.86210000 37.43070000 19.10200000 7.274590000 9.810820000 3.992810000 692 27.75920000 53.29410000 17.48600000 11.81090000 19.34490000 5.155470000 693 25.62090000 58.69930000 26.11720000 14.08600000 23.60240000 8.752490000 694 83.31550000 70.96980000 65.40290000 51.51870000 50.71220000 44.26190000 695 84.98240000 81.82770000 75.02310000 61.43110000 64.71440000 59.54310000 696 21.85560000 19.64770000 16.07330000 2.777130000 2.876160000 2.107040000 697 19.78060000 23.52310000 36.12960000 4.575010000 4.338060000 10.67930000 698 19.55040000 28.37630000 46.99610000 6.808710000 6.439830000 18.86210000 699 21.27100000 53.84450000 46.30250000 13.85420000 20.36390000 20.60010000 700 32.63660000 75.84370000 49.32390000 26.79500000 42.27290000 26.74210000 701 9.296120000 17.96540000 10.41760000 1.166640000 1.804110000 0.941093000 702 11.62640000 19.93890000 6.612350000 1.440020000 2.267690000 0.602626000 703 36.32110000 81.79470000 15.14410000 27.71460000 48.37750000 9.367210000 704 43.83890000 100.0000000 24.00490000 43.26480000 75.29980000 16.35750000 705 20.14560000 42.31670000 10.09510000 6.727700000 11.46420000 2.468930000 706 27.20660000 84.78290000 0.000000000 27.22650000 50.96050000 8.401720000 707 58.23280000 84.99840000 53.24140000 42.07940000 58.30310000 32.69060000 708 79.22280000 85.91870000 72.24270000 59.14830000 67.49390000 56.19210000 709 43.77480000 27.74120000 35.68380000 10.70640000 8.467620000 10.88170000 710 69.12360000 39.13290000 39.93590000 25.24650000 19.48200000 14.99780000 711 78.84320000 48.09370000 45.08620000 34.72830000 28.15450000 20.01460000 712 41.04650000 25.09110000 26.08910000 8.467680000 6.794180000 5.792550000 713 43.67160000 29.00900000 24.65860000 9.850370000 8.473420000 5.469120000 714 57.24700000 38.03990000 50.98100000 20.46340000 16.41200000 23.59130000 715 63.21830000 37.94490000 60.00190000 25.15640000 18.59240000 33.02990000 716 25.02050000 9.456150000 51.08270000 6.278920000 3.057800000 21.85560000 717 71.57470000 0.000000000 73.98450000 29.06900000 13.91120000 49.92410000 718 74.65340000 11.40000000 81.66340000 33.54540000 16.40590000 61.99940000 719 86.75910000 15.62960000 100.0000000 48.82830000 23.98360000 96.66840000 720 54.72160000 14.51550000 68.32050000 19.27340000 9.795480000 41.80950000 721 100.0000000 21.96480000 74.55020000 51.97560000 27.59570000 52.18220000 722 100.0000000 23.25010000 86.64850000 55.85430000 29.41920000 71.77040000 723 100.0000000 54.99710000 87.10590000 64.16330000 45.79290000 75.29700000 724 13.66940000 22.76260000 0.000000000 1.897950000 3.026630000 0.484189000 725 19.02520000 24.63370000 10.20580000 2.833170000 3.883610000 1.225760000 726 15.39720000 24.68270000 14.63440000 2.585610000 3.749990000 1.969310000 727 56.87270000 24.90190000 10.58300000 13.73030000 9.558990000 1.798990000 728 76.07810000 35.66230000 91.63420000 41.20100000 25.01770000 80.73120000 729 22.20000000 13.94390000 100.0000000 20.02540000 8.935940000 95.28170000 730 84.66790000 31.30690000 100.0000000 49.42910000 27.52570000 97.32050000 731 37.17870000 14.04210000 28.35970000 6.286690000 3.818470000 6.325710000 732 44.66840000 21.22830000 34.86670000 9.969910000 6.691110000 10.09030000 733 58.18100000 24.62320000 46.93670000 17.59160000 11.10850000 19.14520000 734 87.83390000 36.03170000 51.04250000 38.90400000 25.20500000 24.37390000 735 52.78360000 21.37710000 35.49880000 13.16840000 8.358920000 10.61950000 736 71.03220000 20.81890000 47.61840000 24.10080000 13.70000000 19.88000000 737 80.81230000 22.41070000 55.20620000 32.03250000 17.92840000 27.38920000 738 52.50290000 15.07810000 39.55670000 12.90380000 7.209020000 13.01830000 739 89.57760000 10.90290000 45.79520000 35.88600000 18.53190000 18.66910000 740 100.0000000 22.78460000 30.10810000 43.90920000 24.54030000 9.175450000 741 100.0000000 38.96610000 28.14980000 46.84940000 30.70440000 9.281960000 742 100.0000000 76.22370000 39.79890000 63.29940000 61.57720000 21.02330000 743 100.0000000 90.10400000 47.69480000 73.21540000 79.54900000 30.06750000 744 28.89730000 61.73290000 48.87420000 18.80600000 27.64050000 23.94010000 745 34.94950000 72.69240000 60.65610000 27.82840000 39.97680000 37.75940000 746 67.47540000 75.35750000 75.46870000 46.27290000 51.22640000 58.39760000 747 77.72330000 83.28260000 76.74160000 57.68970000 64.07870000 62.18570000 748 58.11440000 65.73460000 80.46930000 37.90470000 39.34750000 64.26630000 749 68.98370000 83.47910000 80.96760000 53.60880000 62.01360000 68.61580000 750 78.24500000 90.83850000 80.48270000 64.18610000 74.77060000 69.74020000 751 39.56340000 46.68410000 46.03820000 15.33980000 17.47000000 19.74560000 752 39.04990000 70.56480000 75.26030000 31.48540000 39.77570000 56.65770000 753 45.53060000 75.69990000 85.26470000 39.40610000 47.62620000 73.74990000 754 88.27200000 80.96840000 100.0000000 71.87070000 68.33580000 104.0150000 755 30.26620000 24.27010000 61.16330000 10.68820000 7.161330000 32.91080000 756 35.56730000 32.07120000 71.66490000 15.85300000 11.52400000 46.86000000 757 20.76450000 10.52910000 30.83470000 2.910730000 1.719600000 7.294480000 758 17.50940000 14.13270000 31.85210000 2.835180000 2.011240000 7.881380000 759 14.56360000 7.749620000 33.65860000 2.371000000 1.223730000 8.739630000 760 11.98030000 21.39490000 55.96370000 6.627490000 4.622250000 26.93900000 761 10.11670000 44.89670000 90.67240000 20.96530000 18.25000000 78.70040000 762 21.24040000 55.85960000 100.0000000 29.35160000 27.79680000 98.43070000 763 0.000000000 28.64560000 82.97680000 14.26140000 9.364850000 63.82070000 764 0.000000000 26.73490000 100.0000000 20.01510000 11.15100000 95.70970000 765 26.01060000 75.66050000 100.0000000 39.54640000 47.04910000 101.6100000 766 61.90840000 10.83850000 14.10080000 14.87800000 8.042550000 2.041760000 767 67.73010000 12.90590000 9.728820000 18.00820000 9.859400000 1.517110000 768 78.12990000 27.79300000 16.50770000 26.44910000 16.77300000 3.644650000 769 89.98800000 51.64230000 21.89920000 41.69930000 33.83460000 7.686240000 770 89.15680000 77.82800000 77.90800000 63.06720000 61.89790000 63.26450000 771 88.69880000 78.68160000 90.87150000 67.40600000 64.39230000 85.52860000 772 36.59070000 27.46250000 35.52590000 8.457470000 7.240860000 10.66820000 773 35.77920000 25.55150000 42.54340000 8.836040000 6.877900000 15.30530000 774 63.92000000 66.76370000 59.89700000 35.96490000 39.69820000 36.41610000 775 75.38760000 77.54730000 59.69330000 48.39860000 54.62740000 38.41380000 776 43.72380000 44.76850000 39.69050000 15.15760000 16.60650000 14.80520000 777 79.41020000 44.54380000 50.71490000 34.93180000 26.50570000 24.53110000 778 87.81460000 51.55460000 62.11090000 45.64970000 35.16720000 37.57790000 779 46.67210000 31.37420000 43.81030000 13.45080000 10.74280000 16.77100000 780 49.12410000 34.57860000 54.79480000 16.90510000 13.29690000 26.87440000 781 68.91670000 46.60100000 69.29490000 32.91220000 25.93830000 45.50160000 782 73.75250000 47.33510000 100.0000000 46.06400000 31.91050000 98.34410000 783 20.41850000 25.08640000 68.22640000 10.74700000 7.177500000 41.62950000 784 21.26710000 54.41540000 68.34850000 18.56580000 22.59270000 44.35390000 785 21.13110000 61.43960000 81.11670000 24.99220000 29.75420000 64.13800000 786 15.39690000 72.79180000 56.53490000 23.60800000 37.97980000 33.07890000 787 30.27220000 100.0000000 58.67940000 44.32470000 75.29110000 41.49220000 788 28.89860000 100.0000000 81.94840000 50.09690000 77.56670000 73.39860000 789 51.18170000 100.0000000 90.58800000 59.73390000 82.20300000 88.84570000 790 18.35740000 43.01520000 76.09580000 16.48250000 15.65690000 54.03750000 791 25.00140000 41.99780000 84.05210000 19.57960000 16.54830000 66.72960000 792 31.41090000 59.00470000 82.87530000 26.37970000 28.85850000 66.77610000 793 29.69900000 73.19840000 86.87520000 34.10650000 42.78230000 75.89360000 794 39.54270000 82.41800000 92.00410000 43.75840000 55.52020000 87.17880000 795 26.35040000 19.46190000 14.34850000 3.425200000 3.187890000 1.757890000 796 30.81660000 24.76470000 8.940710000 4.847440000 4.954090000 1.168310000 797 51.91350000 27.95140000 17.40620000 12.30620000 9.517000000 3.211950000 798 59.66690000 39.56370000 20.68790000 18.46360000 16.36120000 5.143540000 799 67.99170000 59.36080000 20.76020000 29.57890000 32.04300000 7.607500000 800 68.37510000 59.87240000 38.66270000 31.67890000 33.25460000 16.45290000 801 81.27620000 69.01730000 41.95030000 44.63060000 46.18600000 20.56730000 802 100.0000000 71.98380000 77.93080000 69.02310000 60.14230000 62.64690000 803 26.26190000 16.58880000 22.36370000 3.536910000 2.767380000 3.858950000 804 35.04700000 17.66140000 59.01810000 10.56020000 5.962560000 30.26280000 805 58.70750000 48.69180000 68.48470000 27.97840000 24.42190000 44.39070000 806 65.89950000 50.08080000 76.87950000 34.41900000 28.17560000 56.69110000 807 65.21410000 53.50210000 86.43140000 38.24070000 31.61690000 72.74280000 808 27.06650000 27.15410000 22.24110000 5.023910000 5.532500000 4.272110000 809 37.88950000 35.31200000 21.20110000 9.098800000 10.00160000 4.573290000 810 36.49980000 38.63670000 11.15750000 9.056290000 11.20900000 2.447270000 811 42.34130000 42.95490000 0.000000000 11.80530000 14.36340000 2.150350000 812 55.47560000 52.50190000 0.000000000 19.95460000 23.15740000 3.418350000 813 76.55450000 57.38450000 37.53620000 35.54910000 33.73500000 15.60490000 814 87.12530000 56.87610000 100.0000000 58.84270000 43.59710000 99.92650000 815 23.41250000 18.87030000 92.10730000 17.67050000 8.725660000 79.71570000 816 23.75670000 26.55110000 100.0000000 21.73340000 11.99290000 95.78170000 817 23.51790000 36.81240000 100.0000000 23.73040000 16.04420000 96.45850000 818 0.000000000 15.03870000 71.23710000 9.115890000 4.533800000 45.27090000 819 13.13390000 11.44050000 84.40330000 13.21020000 5.825460000 65.59030000 820 23.40030000 0.000000000 86.73630000 14.89060000 6.151900000 69.59180000 821 30.52560000 82.59170000 85.60940000 39.33880000 53.65700000 75.51140000 822 27.57600000 14.73950000 15.45400000 3.253740000 2.430650000 1.855350000 823 46.63490000 10.61360000 10.91830000 8.100220000 4.542420000 1.175460000 824 49.99330000 27.20380000 23.22510000 11.74690000 9.002930000 4.934250000 825 74.24540000 25.05120000 22.42600000 23.80000000 14.72030000 5.119910000 826 81.09320000 42.16010000 36.91330000 33.37760000 24.91850000 13.62130000 827 58.68070000 46.17380000 39.47560000 21.64250000 20.59050000 15.08540000 828 61.35030000 76.09540000 54.40210000 38.42250000 48.37260000 32.11550000 829 66.12540000 76.02670000 62.27190000 42.54430000 50.25070000 40.84250000 830 0.000000000 85.08570000 49.59580000 28.92800000 51.68230000 28.68910000 831 10.53400000 92.01340000 63.15140000 36.63690000 62.33460000 44.53190000 832 40.94710000 28.17990000 18.25800000 8.422650000 7.568070000 3.264580000 833 100.0000000 32.40630000 14.33690000 44.49050000 27.36100000 4.257590000 834 100.0000000 51.60970000 50.96990000 53.68690000 39.59770000 26.30560000 835 100.0000000 62.56750000 53.94140000 58.63220000 48.61830000 30.63830000 836 18.94880000 35.11170000 20.20700000 5.177600000 7.920170000 4.065200000 837 17.37540000 58.69230000 42.45010000 14.69780000 23.70560000 18.17490000 838 16.64260000 62.44560000 53.30420000 18.01840000 27.61340000 28.09620000 839 13.81360000 70.22980000 79.91810000 27.99270000 37.56080000 63.56350000 840 15.82700000 93.62380000 80.69380000 42.91110000 66.74640000 69.65150000 841 12.93780000 97.81400000 94.22920000 50.35820000 74.69900000 94.78330000 842 26.59190000 25.60550000 31.36630000 5.436470000 5.293070000 8.123740000 843 24.85190000 29.32420000 38.23370000 6.516790000 6.683090000 12.36630000 844 27.98710000 31.00830000 45.17150000 8.372880000 7.995640000 17.58060000 845 48.27530000 65.43690000 62.63120000 28.83380000 35.00940000 39.04820000 846 54.54980000 73.88490000 65.79580000 36.44200000 45.24040000 44.49320000 847 16.33650000 21.91510000 18.81660000 2.494450000 3.117250000 2.871850000 848 15.58310000 19.37090000 37.26160000 3.717650000 3.115150000 11.19630000 849 19.94810000 17.08950000 41.13640000 4.483740000 3.106310000 13.77690000 850 36.86440000 16.85320000 40.81180000 7.820990000 4.798990000 13.69610000 851 38.07260000 33.91280000 39.75760000 10.62100000 10.12330000 13.83900000 852 39.76770000 44.39690000 49.58560000 15.28180000 16.33330000 22.57610000 853 38.83820000 49.18550000 67.54300000 20.27760000 20.72380000 42.84850000 854 45.25340000 62.91740000 67.94430000 27.83310000 32.61930000 45.26980000 855 51.62810000 62.67820000 71.13850000 30.97000000 33.98190000 49.66690000 856 80.24220000 68.30650000 74.16220000 50.23060000 47.77250000 55.60280000 857 81.66510000 75.57260000 79.86050000 56.73590000 56.65080000 65.64220000 858 10.00700000 7.606290000 25.23400000 1.258500000 0.731725000 4.654040000 859 13.45270000 0.000000000 27.03560000 1.517120000 0.664693000 5.377400000 860 38.75420000 7.677200000 75.97110000 15.11680000 6.841610000 52.22110000 861 69.57370000 0.000000000 87.00920000 31.86100000 14.89010000 70.86370000 862 89.15070000 60.64520000 93.90100000 59.65530000 46.61130000 88.23750000 863 32.01160000 17.66440000 27.97890000 5.254160000 3.754740000 6.194410000 864 35.44040000 23.09410000 28.69610000 6.795860000 5.483940000 6.775880000 865 34.16380000 27.73180000 30.08020000 7.301540000 6.777710000 7.662140000 866 49.99820000 40.54560000 39.09890000 16.17850000 15.36670000 14.10930000 867 49.09800000 45.13000000 51.54460000 19.04520000 18.56020000 24.60690000 868 58.48090000 61.38060000 68.54810000 32.76440000 34.12970000 46.09620000 869 67.19920000 61.10670000 83.30390000 41.38650000 37.91070000 68.44670000 870 81.04840000 65.72380000 88.63440000 54.02860000 47.34610000 78.85430000 871 100.0000000 68.98770000 90.14730000 71.41160000 58.61930000 82.86600000 872 100.0000000 78.60200000 89.70540000 76.50960000 69.06300000 83.80370000 873 70.05840000 82.47060000 0.000000000 42.25930000 56.53180000 8.684970000 874 80.26920000 86.90470000 14.84610000 51.96510000 65.74540000 11.37800000 875 91.27030000 93.37560000 9.299470000 64.58450000 78.94190000 12.34390000 876 37.87690000 59.84480000 0.000000000 16.43690000 25.63750000 4.082420000 877 38.07400000 70.59150000 0.000000000 21.55600000 35.79320000 5.772930000 878 59.62050000 86.24950000 0.000000000 39.05090000 58.47560000 9.229210000 879 59.82670000 100.0000000 0.000000000 49.08170000 78.38900000 12.54430000 880 60.28770000 100.0000000 22.26230000 49.97170000 78.77120000 16.04750000 881 71.40600000 20.87850000 27.88440000 21.89130000 12.85370000 7.031440000 882 91.39610000 27.18320000 73.93690000 45.16520000 25.23690000 51.19300000 883 92.52880000 33.11210000 82.74820000 49.81210000 28.97500000 65.35290000 884 78.69870000 29.57060000 69.77860000 34.98420000 20.73210000 45.03850000 885 81.84240000 41.34510000 80.89320000 42.99040000 28.46550000 62.57960000 886 86.11180000 63.11320000 82.55100000 54.51660000 46.03040000 68.07050000 887 71.24740000 100.0000000 63.99440000 62.08660000 84.31230000 48.45190000 888 76.71650000 100.0000000 100.0000000 76.82960000 90.60900000 108.0530000 889 100.0000000 100.0000000 100.0000000 95.04580000 100.0000000 108.9060000 890 51.32810000 19.33590000 17.55760000 10.87000000 6.989010000 2.838600000 891 81.60820000 16.98080000 20.05280000 27.62580000 15.25630000 4.251420000 892 86.66620000 21.06800000 29.86020000 32.53250000 18.35310000 8.459000000 893 53.69280000 0.000000000 20.64050000 11.06490000 5.639430000 3.448980000 894 55.57810000 14.96940000 23.91940000 12.65710000 7.250220000 4.803310000 895 56.25500000 22.58510000 53.03060000 17.46690000 10.50120000 24.55530000 896 62.03470000 27.00290000 75.38200000 26.13390000 15.33510000 52.40250000 897 68.26460000 72.44200000 82.96980000 47.37950000 49.16840000 69.74690000 898 71.59770000 81.96390000 94.84990000 58.93590000 62.80530000 93.24300000 899 11.90110000 82.51170000 72.68880000 32.76160000 50.63980000 54.96010000 900 0.000000000 86.28700000 80.73100000 37.12500000 56.21740000 67.98400000 901 0.000000000 87.51640000 71.12470000 35.20080000 56.75490000 53.82050000 902 75.55560000 92.06090000 73.45120000 61.23030000 74.76440000 59.20530000 903 32.67890000 0.000000000 13.41390000 3.741930000 1.903940000 1.311230000 904 31.42690000 8.489940000 9.491790000 3.493550000 2.023380000 0.739693000 905 48.64320000 9.936640000 43.67820000 11.59530000 5.971370000 15.84580000 906 61.68080000 11.11170000 42.85250000 17.33410000 9.035960000 15.50590000 907 65.46480000 0.000000000 57.05460000 21.49710000 10.47550000 28.43000000 908 93.02220000 10.48130000 59.87840000 41.26740000 20.97180000 32.50120000 909 93.75350000 13.28680000 76.87590000 46.32990000 23.34210000 55.12510000 910 13.40800000 8.545560000 12.24210000 0.834796000 0.647289000 1.014090000 911 8.880180000 19.05410000 23.58510000 1.886750000 2.270920000 4.285680000 912 0.000000000 17.69510000 26.94970000 1.802500000 1.989820000 5.580970000 913 24.81140000 22.84260000 83.95160000 15.59910000 8.686830000 65.25230000 914 30.71680000 51.12150000 84.42010000 23.68820000 22.91310000 68.36510000 915 40.28500000 54.58560000 79.73410000 25.99660000 26.15530000 61.17500000 916 46.74080000 67.25990000 84.28570000 35.08350000 38.84610000 70.61190000 917 37.22150000 9.549400000 18.09400000 5.316890000 2.995660000 2.501500000 918 44.34980000 0.000000000 22.65540000 7.587470000 3.831960000 3.952500000 919 44.64790000 9.365870000 29.58430000 8.435780000 4.496260000 6.920110000 920 58.27010000 0.000000000 33.39280000 14.19150000 7.129270000 9.107490000 921 81.20510000 17.10800000 33.76850000 28.48310000 15.58540000 10.19780000 922 81.98150000 52.77930000 32.05990000 36.88970000 31.86710000 11.95980000 923 89.86630000 66.30120000 46.67430000 50.46370000 47.12660000 24.14560000 924 71.80480000 49.42420000 38.28340000 29.68000000 26.31760000 14.96830000 925 72.80000000 57.19000000 46.04260000 34.25800000 32.81600000 21.71450000 926 89.73020000 57.15720000 52.98120000 47.40830000 39.43880000 28.51510000 927 35.62410000 74.25880000 22.28930000 23.50850000 39.63090000 9.896320000 928 44.97320000 92.39710000 32.95750000 38.73460000 64.39960000 18.62740000 929 0.000000000 31.02000000 32.82600000 4.282930000 6.073690000 9.112540000 930 0.000000000 29.98560000 49.46620000 6.367980000 6.594360000 21.05890000 931 14.46500000 32.30160000 56.04380000 8.617480000 8.281460000 27.62350000 932 12.02760000 38.52470000 62.79710000 11.26760000 11.57460000 35.64770000 933 0.000000000 55.52880000 86.75520000 23.01240000 24.89690000 72.81510000 934 61.19670000 73.93140000 86.88590000 45.65760000 49.32900000 76.56730000 935 33.77550000 32.76560000 24.56810000 7.687030000 8.431040000 5.539860000 936 86.36770000 36.53450000 26.05850000 34.71910000 23.58830000 7.638200000 937 43.45890000 18.74320000 19.34640000 7.984100000 5.395780000 3.173640000 938 47.15980000 15.94380000 72.44980000 17.41190000 8.886120000 47.37110000 939 94.25500000 15.18750000 90.21090000 51.16430000 25.55570000 77.66810000 940 60.95530000 7.524820000 92.16520000 29.08950000 13.43360000 80.13180000 941 76.20180000 16.07210000 93.67510000 38.95980000 19.23180000 83.60790000 942 22.33490000 9.448260000 20.95910000 2.306380000 1.418100000 3.196570000 943 32.30040000 21.85040000 21.86000000 5.333180000 4.547830000 3.936380000 944 32.61760000 27.00830000 24.38010000 6.329230000 6.152810000 5.099350000 945 33.02240000 35.27250000 41.87220000 9.881800000 10.15360000 15.38600000 946 41.53290000 33.70110000 48.21500000 12.86970000 11.07030000 20.47800000 947 40.73540000 39.26520000 47.93210000 13.88000000 13.53560000 20.65600000 948 45.27520000 40.15510000 35.15190000 13.83710000 14.06130000 11.47760000 949 60.36090000 40.45710000 41.37790000 21.06680000 17.81680000 15.91630000 950 71.74630000 51.22430000 47.47210000 31.58740000 28.07060000 22.13450000 951 80.33760000 65.64880000 47.62780000 43.18320000 42.89310000 24.51740000 952 69.44660000 48.23470000 27.06170000 26.70850000 24.33250000 8.629660000 953 89.60630000 89.68040000 26.58190000 61.51580000 73.37840000 16.05640000 954 27.80370000 33.42660000 10.07600000 5.798110000 7.743900000 1.797280000 955 45.46640000 48.52940000 20.27950000 15.11780000 18.55650000 5.616640000 956 52.55640000 60.39410000 23.15260000 22.53930000 29.04830000 8.208560000 957 58.87030000 57.08370000 26.57330000 24.25960000 27.86370000 9.230630000 958 68.24330000 68.50640000 27.92560000 34.45280000 40.74090000 11.77090000 959 93.03510000 70.62730000 28.31390000 52.95240000 51.87650000 13.12190000 960 23.60300000 12.99950000 27.39670000 3.172340000 2.111990000 5.727330000 961 29.70780000 9.169240000 27.39500000 4.091180000 2.265520000 5.707790000 962 55.71130000 7.265520000 27.91930000 12.59450000 6.533020000 6.317030000 963 60.99610000 10.64610000 50.03890000 18.10050000 9.261640000 21.47150000 964 60.38670000 31.13590000 61.55480000 22.55660000 14.99040000 34.25010000 965 62.99510000 55.97900000 62.69500000 31.37240000 30.24610000 38.07070000 966 78.23760000 86.51820000 85.25420000 62.75150000 69.48930000 76.72170000 967 86.88270000 93.04920000 93.57230000 76.38380000 82.88440000 93.72430000 968 25.91930000 24.32220000 16.05210000 4.036180000 4.413010000 2.332430000 969 92.52810000 29.44310000 27.67260000 38.26380000 23.20960000 8.072790000 970 93.09680000 43.52290000 36.66390000 42.96140000 30.43840000 14.02530000 971 93.23620000 57.50150000 38.92800000 48.20730000 40.31080000 17.12130000 972 92.89330000 79.14710000 43.76380000 59.37850000 62.01330000 24.21110000 973 39.86480000 56.22260000 22.23530000 16.19570000 23.23460000 7.098300000 974 43.87840000 85.59220000 42.00200000 34.81340000 55.34190000 22.88990000 975 65.09800000 88.15050000 64.29700000 49.97280000 65.20010000 45.77090000 976 16.39050000 31.74530000 44.23610000 6.642200000 7.334070000 16.80300000 977 16.35290000 35.04550000 52.73490000 8.751470000 9.292110000 24.49460000 978 19.52160000 82.20810000 66.22480000 31.66770000 49.98650000 46.20330000 979 33.44030000 81.95220000 70.76190000 35.22530000 51.45260000 52.29560000 980 36.82270000 92.95540000 80.15040000 46.12830000 67.70620000 68.79660000 981 28.94450000 25.93420000 44.86170000 7.633310000 6.306250000 17.04600000 982 30.80460000 25.39280000 74.48080000 14.29190000 8.882270000 50.45440000 983 74.77430000 12.74300000 35.19970000 23.96150000 12.71490000 10.71270000 984 77.02670000 8.900220000 47.26850000 26.87610000 13.71390000 19.43870000 985 88.45840000 15.09600000 52.99420000 36.51570000 19.13910000 25.18350000 986 87.83730000 46.81370000 67.98330000 45.46720000 32.54870000 44.37810000 987 89.14820000 75.39260000 83.46730000 63.37520000 59.79390000 71.78530000 988 29.18910000 40.29660000 68.94290000 15.56060000 14.29420000 43.69810000 989 29.84900000 86.23980000 80.95900000 40.05180000 57.67200000 68.47820000 990 6.238760000 37.03560000 53.02900000 8.589660000 9.885750000 24.90270000 991 10.53270000 37.08830000 75.58680000 14.08220000 12.12610000 52.72230000 992 12.80030000 39.16630000 92.81950000 20.32120000 15.46270000 82.22540000 993 36.46140000 43.17030000 93.22220000 25.58960000 19.77450000 83.54830000 994 34.95320000 60.93350000 92.01980000 31.14790000 32.17920000 83.36760000 995 38.64640000 61.95710000 100.0000000 35.62390000 34.80470000 99.45290000 996 13.54190000 48.60270000 34.92100000 9.608530000 15.60850000 11.86250000 997 9.878450000 51.88920000 48.90410000 12.44530000 18.52570000 22.54220000 998 12.63890000 62.46190000 65.49880000 20.25610000 28.47840000 41.73770000 999 26.64480000 67.43530000 67.79910000 24.96170000 34.30000000 45.55570000 1000 40.60160000 68.59070000 66.61080000 28.67230000 37.09640000 44.36480000 1001 59.29950000 75.19960000 72.09200000 40.96100000 48.46430000 53.26530000 1002 59.92170000 94.23720000 86.50840000 57.87610000 74.91050000 80.19930000 1003 13.33200000 35.75840000 44.56980000 7.268210000 8.924870000 17.33940000 1004 10.54820000 42.87570000 51.78450000 10.09160000 12.95600000 24.22300000 1005 12.50540000 50.40910000 53.14330000 12.84780000 17.87310000 26.33130000 1006 8.450030000 52.51220000 62.34810000 15.23900000 19.99420000 36.53100000 1007 21.68840000 52.28740000 81.25070000 21.45510000 22.49490000 63.14040000 1008 49.88730000 52.09890000 91.87170000 32.43860000 27.64670000 82.14620000 1009 8.821240000 11.39540000 34.97880000 2.290520000 1.421130000 9.543800000 1010 14.59930000 14.98260000 61.72490000 7.395750000 3.907620000 33.10790000 1011 14.10740000 9.424530000 66.73070000 8.169320000 3.649570000 39.14260000 1012 23.90850000 29.84270000 93.30490000 19.77390000 12.11950000 82.53540000 1013 26.65150000 67.24050000 92.27610000 32.31380000 37.08870000 84.73730000 1014 17.89220000 22.98490000 29.23840000 3.554220000 3.785250000 6.874170000 1015 26.78680000 20.34020000 28.39470000 4.485660000 3.780880000 6.429460000 1016 30.12370000 18.37680000 33.22310000 5.407810000 3.882360000 8.849140000 1017 39.45870000 61.06610000 46.46550000 20.76650000 28.26280000 21.89560000 1018 44.97080000 69.61170000 58.38480000 28.76070000 38.12190000 34.81550000 1019 57.41040000 71.52190000 92.14250000 44.35620000 46.52700000 85.67240000 1020 76.11660000 55.58930000 70.16670000 40.73900000 34.63920000 47.94590000 1021 93.79200000 55.65580000 77.77690000 56.05830000 42.33200000 59.65510000 1022 93.54370000 62.35040000 88.69020000 62.12380000 49.20940000 78.88790000 1023 93.27060000 86.37000000 99.62020000 79.18690000 77.21740000 104.5550000 1024 50.82430000 52.68700000 57.71800000 23.43450000 24.42880000 31.73030000 1025 56.30380000 54.33480000 64.63740000 27.92140000 27.47480000 40.06950000 1026 63.38460000 57.47190000 72.36450000 34.56850000 32.50000000 50.90450000 1027 44.35940000 53.94440000 49.01870000 19.86580000 23.46750000 23.20640000 1028 45.06340000 92.48350000 68.64550000 45.14760000 67.06760000 51.93020000 1029 57.65870000 91.95190000 72.34080000 50.87350000 69.34480000 57.12360000 1030 30.71030000 56.12140000 37.03770000 15.14360000 22.47480000 14.18890000 1031 51.82790000 58.64280000 79.25340000 31.59850000 31.45440000 61.14310000 1032 75.95290000 61.71630000 91.81500000 49.85190000 42.33860000 83.95780000 1033 28.58140000 17.89510000 39.54690000 5.784250000 3.917550000 12.75150000 1034 30.53800000 14.37190000 45.23990000 6.692420000 3.830830000 16.92020000 1035 36.82620000 10.14340000 50.76480000 8.880520000 4.455000000 21.69370000 1036 84.72980000 78.93860000 66.61600000 57.28770000 60.23730000 47.33030000 1037 86.59390000 86.56590000 69.11000000 64.09390000 70.77100000 52.26470000 1038 11.68160000 42.48370000 14.08000000 6.050840000 11.17040000 3.106490000 1039 14.85290000 51.38550000 12.49370000 9.077130000 16.93400000 3.766120000 1040 51.33520000 51.82630000 34.47620000 19.67660000 22.45220000 12.39290000 1041 51.70760000 53.32240000 42.85720000 21.43830000 24.04520000 18.19020000 1042 79.76050000 79.24270000 91.25410000 61.27490000 61.70930000 86.04530000 1043 81.73540000 87.69640000 94.06730000 69.03330000 73.53880000 93.26200000 1044 9.637480000 16.56100000 24.79220000 1.766090000 1.831010000 4.665040000 1045 8.426810000 13.51910000 29.12300000 1.814890000 1.448580000 6.459980000 1046 29.53530000 40.93160000 48.68120000 11.54170000 12.96610000 21.32070000 1047 38.04610000 44.01390000 56.41150000 15.93100000 16.35380000 29.17990000 1048 46.55480000 47.72860000 57.25200000 19.99890000 20.13470000 30.58340000 1049 67.00280000 48.95870000 56.38940000 29.64860000 25.73020000 30.24370000 1050 18.13890000 12.95410000 14.93710000 1.640760000 1.406900000 1.630470000 1051 40.61070000 24.20300000 9.311020000 7.359960000 6.127100000 1.305980000 1052 47.37990000 22.08160000 8.279160000 9.343210000 6.723850000 1.200300000 1053 59.47990000 77.73100000 16.96070000 34.06710000 48.02560000 9.386050000 1054 61.64680000 91.38040000 18.90750000 44.02250000 66.18130000 12.88180000 1055 23.27830000 28.63140000 32.07190000 5.436460000 6.023690000 8.635230000 1056 32.20900000 28.59560000 39.40860000 8.020880000 7.248730000 13.18220000 1057 43.28980000 28.28540000 75.01950000 18.35840000 11.65880000 51.56670000 1058 51.45690000 30.18050000 91.93790000 27.13440000 16.06440000 80.31460000 1059 65.84450000 63.02620000 92.61690000 44.65510000 40.49430000 85.38980000 1060 71.43360000 73.38670000 93.26790000 53.27020000 52.55460000 88.50440000 1061 38.04620000 29.77510000 88.46990000 21.20120000 13.03460000 73.66540000 1062 37.36090000 48.47580000 87.41200000 25.43190000 22.35890000 73.35540000 1063 54.43930000 79.15380000 93.34380000 47.72370000 54.55780000 89.32870000 1064 63.50630000 93.57760000 93.23920000 61.56840000 75.82840000 92.50440000 1065 7.926100000 22.22180000 22.13220000 2.119590000 2.959780000 3.891350000 1066 20.51110000 27.32790000 20.88240000 3.903730000 5.007570000 3.780760000 1067 37.49590000 37.15300000 31.78370000 10.27200000 11.14380000 9.216210000 1068 74.66300000 72.09790000 46.93730000 42.52340000 47.38050000 24.83310000 1069 81.02140000 74.97800000 72.27170000 53.77750000 54.88250000 54.08170000 1070 93.26940000 83.10560000 77.29120000 69.42520000 69.94450000 63.53570000 1071 96.17430000 84.30100000 91.37660000 77.21260000 74.56000000 87.91450000 1072 62.02400000 20.07320000 22.91680000 16.17750000 9.811710000 4.746380000 1073 79.57570000 21.57180000 46.55990000 29.53750000 16.65930000 19.27210000 1074 79.02520000 34.05020000 61.16250000 34.04070000 21.80790000 34.50650000 1075 75.49590000 45.70120000 57.92530000 34.04610000 26.41040000 31.77740000 1076 92.74940000 90.56920000 63.87260000 70.43980000 78.23020000 46.68950000 1077 33.55570000 27.28480000 17.71980000 6.192170000 6.196900000 2.974320000 1078 32.86590000 41.70760000 35.46260000 10.64080000 13.03040000 11.63260000 1079 31.26790000 45.19930000 44.57690000 12.48800000 15.34370000 18.30890000 1080 35.22930000 63.20930000 79.35880000 28.05230000 32.56560000 61.71050000 1081 43.36800000 66.49810000 91.32720000 35.92960000 38.45700000 83.02890000 1082 30.92420000 51.28010000 68.64200000 19.24340000 21.22980000 44.44300000 1083 35.07750000 56.26140000 67.82570000 21.89700000 25.38520000 44.03120000 1084 64.49050000 70.17700000 75.58710000 41.87960000 44.82650000 57.56980000 1085 75.29530000 79.85080000 84.20070000 56.26070000 59.94030000 73.42360000 1086 89.18920000 93.83860000 86.60860000 76.31230000 83.97880000 81.15360000 1087 88.84590000 100.0000000 92.35600000 82.70530000 93.97260000 93.21270000 1088 9.169040000 15.34010000 17.51500000 1.185940000 1.426070000 2.264120000 1089 11.28350000 12.36420000 20.07640000 1.228760000 1.107560000 2.918540000 1090 7.758740000 8.455170000 19.87400000 0.822165000 0.596167000 2.780200000 1091 37.05060000 66.94820000 32.07420000 20.92090000 32.57990000 12.94640000 1092 73.04610000 79.71690000 48.48070000 46.06140000 55.56720000 27.54910000 1093 85.73830000 92.63570000 52.06020000 63.91560000 77.32030000 34.07180000 1094 42.95560000 20.41270000 13.78870000 7.747210000 5.578960000 1.880820000 1095 93.23600000 18.43900000 9.688770000 36.32620000 20.00370000 2.504840000 1096 53.58320000 0.000000000 12.81250000 10.65310000 5.469250000 1.525770000 1097 57.05280000 69.13620000 43.46470000 30.77150000 39.10520000 21.06680000 1098 56.63430000 91.68720000 48.33310000 45.00290000 66.64090000 29.61360000 1099 57.64850000 92.69780000 62.50090000 48.96660000 69.43430000 44.47750000 1100 19.66130000 58.77220000 58.02510000 17.71590000 24.99770000 32.47310000 1101 25.31460000 72.47990000 65.01490000 26.63030000 39.07570000 42.84380000 1102 11.02960000 36.82280000 36.45380000 6.258540000 8.898830000 11.67090000 1103 11.08770000 43.95170000 37.99980000 8.340490000 12.75720000 13.28950000 1104 65.58080000 67.43090000 37.18470000 33.38660000 39.29040000 16.56660000 1105 92.19480000 67.75010000 38.05720000 51.83380000 49.02100000 18.03480000 1106 66.72170000 47.29710000 10.64440000 23.95810000 22.56580000 3.779300000 1107 81.13310000 65.01260000 12.86390000 40.10750000 41.24670000 6.888590000 1108 92.60500000 86.12580000 8.715340000 60.65800000 69.48420000 10.65750000 1109 91.92170000 89.50420000 84.66040000 74.79940000 78.71380000 76.85130000 1110 68.42910000 64.66880000 71.64680000 40.28470000 40.12080000 51.06700000 1111 76.06900000 74.16780000 81.98420000 52.79120000 53.38250000 68.64730000 1112 89.64880000 73.63660000 96.86260000 67.49940000 59.93680000 96.21880000 1113 36.52590000 6.653190000 21.80120000 5.227210000 2.758580000 3.576900000 1114 45.40580000 9.620080000 18.95960000 7.938100000 4.346670000 2.862660000 1115 50.43670000 16.98590000 27.54760000 10.93750000 6.592140000 6.249590000 1116 62.85560000 28.05740000 31.33260000 18.44460000 12.59050000 8.829420000 1117 74.96280000 28.10250000 36.59350000 26.05200000 16.45780000 12.17380000 1118 89.32660000 30.69140000 43.10650000 37.67180000 23.04530000 17.33020000 1119 89.64230000 44.38940000 44.27510000 41.42550000 29.90610000 19.35750000 1120 64.91420000 31.97110000 9.849500000 18.96650000 14.08850000 2.298380000 1121 75.57230000 33.04720000 10.03440000 25.52090000 17.79350000 2.692290000 1122 85.30450000 79.87770000 19.61210000 51.39130000 58.82440000 11.27690000 1123 91.97640000 79.68920000 61.08980000 62.11910000 63.53970000 40.99810000 1124 18.44450000 13.68490000 22.03320000 2.100660000 1.677010000 3.611060000 1125 69.69420000 9.399170000 28.09330000 19.94390000 10.44670000 6.763860000 1126 79.69080000 9.507240000 27.21740000 26.26500000 13.72150000 6.672710000 1127 89.23370000 22.50290000 63.57020000 40.11000000 21.90520000 37.04940000 1128 88.40270000 36.11390000 70.74130000 43.68430000 27.19880000 47.14010000 1129 94.37940000 63.35040000 72.77930000 58.38940000 48.51770000 53.32860000 1130 77.39320000 52.24080000 54.37640000 36.77270000 31.14120000 28.85060000 1131 89.80560000 53.02650000 56.77220000 46.61200000 36.58420000 31.84730000 1132 89.38130000 64.63480000 61.41770000 52.08970000 46.47090000 38.61110000 1133 67.01150000 67.30320000 53.09530000 36.55290000 40.54850000 29.41230000 1134 66.27060000 82.77150000 71.18130000 48.82470000 59.20870000 53.65460000 1135 68.45550000 90.74980000 85.06040000 59.44910000 72.06890000 77.06110000 1136 10.56100000 29.55440000 16.94690000 3.107780000 5.197270000 2.747290000 1137 9.419710000 27.77370000 28.89620000 3.542420000 4.862820000 6.920990000 1138 47.57470000 39.55580000 26.80870000 13.69870000 13.85170000 7.183010000 1139 47.46410000 44.96910000 24.97900000 15.02960000 16.80460000 6.929630000 1140 58.34210000 65.54960000 52.19370000 31.05190000 36.47820000 28.04740000 1141 77.32340000 66.97260000 79.27410000 49.06240000 46.02530000 63.06800000 1142 28.64910000 12.54000000 19.04060000 3.480660000 2.292060000 2.723960000 1143 29.54650000 9.256680000 22.15070000 3.670380000 2.099560000 3.649900000 1144 50.48150000 14.17850000 51.93040000 13.93030000 7.411190000 23.08860000 1145 77.42820000 12.19430000 66.32560000 31.16090000 15.73830000 39.74750000 1146 77.62030000 43.55920000 72.91680000 38.38400000 27.28280000 50.47970000 1147 69.42030000 43.44190000 76.22470000 34.13050000 24.93290000 55.09150000 1148 69.38470000 46.96830000 90.08200000 39.59010000 28.82700000 78.67240000 1149 78.01820000 53.59180000 91.09420000 47.66220000 36.33810000 81.56770000 1150 40.79090000 47.71840000 39.45060000 15.09950000 17.94600000 14.90260000 1151 47.11630000 57.82050000 46.32210000 21.92110000 26.83000000 21.43930000 1152 9.684760000 14.42450000 6.067540000 0.786834000 1.152280000 0.380259000 1153 14.39040000 15.77450000 10.77410000 1.330690000 1.584830000 0.940377000 1154 9.530100000 23.48020000 17.24070000 2.089550000 3.226440000 2.494010000 1155 17.55600000 44.99320000 44.68800000 10.14280000 14.04020000 18.26860000 1156 47.28120000 55.38510000 55.70680000 22.67660000 25.59050000 29.87480000 1157 8.005570000 13.64210000 10.49610000 0.734212000 1.028190000 0.825008000 1158 11.34220000 6.732770000 5.279080000 0.466539000 0.377860000 0.195099000 1159 24.64160000 8.972740000 8.451470000 2.151190000 1.364280000 0.563062000 1160 28.54250000 8.715170000 13.62580000 3.009360000 1.773370000 1.364630000 1161 43.15720000 25.57530000 48.38680000 11.93640000 8.377500000 20.15670000 1162 46.67550000 48.20700000 67.32470000 22.46570000 21.37600000 42.57580000 1163 56.65420000 54.09060000 75.41710000 30.78130000 28.48980000 54.74870000 1164 77.76180000 55.02310000 81.42090000 44.81470000 36.04520000 64.80130000 1165 10.91450000 24.90070000 39.37790000 4.321330000 4.454530000 12.81690000 1166 8.910710000 23.56170000 44.53360000 4.737580000 4.300080000 16.55140000 1167 10.90510000 28.75220000 58.06560000 8.082570000 6.959600000 29.54290000 1168 12.08640000 32.00430000 78.12750000 13.80310000 10.23780000 56.22790000 1169 26.70110000 73.10540000 77.97320000 30.65730000 41.25320000 61.08790000 1170 24.41660000 82.41640000 91.71720000 40.15100000 53.67090000 86.47280000 1171 25.14990000 84.20730000 100.0000000 44.53280000 57.24850000 103.3160000 1172 15.82950000 93.94440000 72.45990000 40.77120000 66.26410000 57.22950000 1173 88.46500000 95.03620000 71.81970000 72.18080000 83.66730000 58.03320000 1174 29.62620000 31.23430000 16.76420000 5.962590000 7.140220000 2.926950000 1175 45.06340000 60.42080000 12.51640000 19.13880000 27.37420000 5.254990000 1176 51.48780000 81.02320000 11.46160000 32.24210000 50.02280000 8.763710000 1177 75.94400000 92.85820000 10.16440000 53.01420000 72.42010000 11.80490000 1178 76.26360000 93.50490000 63.61470000 60.24720000 76.08530000 46.50000000 1179 91.95130000 92.47350000 79.68370000 75.34750000 82.27220000 69.32640000 1180 66.68820000 75.49130000 68.92960000 44.14920000 50.44580000 49.15190000 1181 70.05020000 83.15650000 89.97000000 56.99100000 63.11260000 84.16800000 1182 79.31170000 94.97110000 89.47950000 70.82670000 82.27180000 86.24080000 1183 14.25120000 38.59180000 29.99520000 6.251060000 9.615260000 8.223390000 1184 8.576980000 46.06510000 74.32870000 16.08780000 16.86100000 51.67780000 1185 12.73000000 51.19000000 90.41140000 23.10410000 22.41400000 78.90930000 1186 12.45520000 62.94490000 93.80200000 29.02240000 32.33080000 86.90420000 1187 9.281660000 24.74920000 75.45220000 11.59480000 7.317300000 51.72510000 1188 7.275710000 25.22980000 87.85760000 15.43750000 8.958540000 72.08690000 1189 14.97540000 19.30710000 75.43060000 11.30310000 6.131650000 51.47960000 1190 63.18110000 16.90190000 78.22670000 26.25780000 13.38600000 56.33300000 1191 71.47950000 24.04780000 87.85470000 34.84050000 18.70430000 72.94060000 1192 57.67410000 39.96870000 66.27600000 24.35570000 18.77680000 40.62950000 1193 72.73410000 59.75600000 67.73610000 39.66210000 36.66960000 45.15630000 1194 74.36260000 75.45880000 67.33520000 48.31070000 52.61020000 47.25640000 1195 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 1196 7.710020000 10.15680000 6.203640000 0.420937000 0.559623000 0.295110000 1197 7.612170000 4.618980000 10.11310000 0.301345000 0.203224000 0.636356000 1198 30.28710000 63.57770000 15.43310000 16.48460000 28.07080000 6.102600000 1199 34.00210000 92.80980000 14.70120000 34.45770000 62.78500000 11.69870000 1200 39.94850000 95.35840000 90.38020000 52.14040000 73.02820000 87.09130000 1201 21.70130000 28.66040000 27.26250000 4.757880000 5.732790000 6.283750000 1202 20.63100000 33.10070000 25.73260000 5.336990000 7.312590000 5.910750000 1203 61.14130000 38.88710000 28.48010000 19.59650000 16.62170000 8.151090000 1204 61.80640000 61.36260000 42.29090000 29.24860000 32.90010000 19.06460000 1205 44.91050000 59.22180000 40.26050000 20.83030000 27.22990000 16.95180000 1206 49.99250000 74.18350000 43.04700000 30.34600000 42.84450000 21.49280000 1207 67.69390000 83.84290000 52.49630000 46.12810000 59.30520000 31.94880000 1208 74.54440000 84.85120000 63.39050000 53.15190000 63.62630000 44.19840000 1209 12.65390000 32.43660000 9.078530000 3.535910000 6.275350000 1.508440000 1210 10.27680000 30.78420000 23.05510000 3.672750000 5.789010000 4.678200000 1211 10.37250000 31.07700000 36.38210000 4.971880000 6.399540000 11.21190000 1212 11.43210000 38.40340000 43.03950000 7.534660000 10.02800000 16.35490000 1213 0.000000000 40.73120000 45.85760000 8.210030000 11.22130000 18.76730000 1214 41.42260000 45.38370000 73.28320000 21.34030000 19.29080000 50.35870000 1215 51.42930000 53.84570000 82.97730000 30.69290000 28.04580000 66.56150000 1216 71.81530000 12.78580000 20.17470000 20.83310000 11.25440000 3.873980000 1217 72.59920000 7.440620000 54.75370000 25.30950000 12.66860000 26.26870000 1218 79.93730000 60.33610000 54.23330000 41.67200000 38.41550000 29.85340000 1219 64.04890000 23.69560000 16.88540000 17.34840000 11.13930000 3.128620000 1220 91.04910000 27.31500000 18.62540000 36.06180000 21.59760000 4.616840000 1221 90.03810000 39.30900000 16.64050000 37.67680000 26.19360000 4.903400000 1222 33.24830000 15.57040000 10.78940000 4.394080000 3.138230000 1.081010000 1223 35.44630000 11.28760000 91.72670000 19.43700000 8.734100000 78.90840000 1224 45.95460000 18.11990000 91.08340000 22.99310000 11.39610000 78.03310000 1225 15.55610000 14.89220000 5.936390000 1.267720000 1.455000000 0.403999000 1226 17.05060000 13.77280000 9.164060000 1.393950000 1.386170000 0.687679000 1227 14.69930000 10.39800000 8.937570000 0.943539000 0.841757000 0.579899000 1228 8.826190000 11.11870000 14.22730000 0.731206000 0.772028000 1.409100000 1229 6.437110000 8.179000000 15.38370000 0.538399000 0.459239000 1.602370000 1230 5.951050000 52.34510000 69.99720000 16.93250000 20.56360000 46.25320000 1231 9.232850000 58.92620000 83.86440000 23.65070000 27.36650000 68.28670000 1232 11.68040000 75.69230000 92.35900000 34.90280000 45.01610000 86.28780000 1233 6.351260000 81.46890000 92.34760000 38.03030000 51.68030000 87.38760000 1234 20.31460000 89.10210000 91.43460000 43.80560000 62.05910000 87.37030000 1235 53.01520000 87.00210000 93.97770000 52.28500000 64.21920000 92.17250000 1236 90.00530000 86.71960000 92.77820000 74.15830000 75.26770000 90.85350000 1237 1.445090000 0.000000000 0.000000000 0.003702600 0.001908800 0.000173336 1238 13.56080000 92.53170000 32.87570000 32.21840000 61.18440000 18.30520000 1239 75.42190000 91.66890000 36.61140000 53.68830000 71.29190000 21.31280000 1240 93.20680000 90.72590000 54.20300000 68.88870000 77.82890000 35.99660000 1241 25.23860000 18.16100000 7.137190000 2.890610000 2.730340000 0.659536000 1242 33.00280000 20.03620000 9.726100000 4.750990000 3.983980000 1.081250000 1243 34.38430000 18.05020000 84.68600000 17.29310000 8.698370000 66.41070000 1244 20.91300000 24.27940000 50.46040000 6.920950000 5.465110000 21.71200000 1245 18.31900000 35.01640000 65.28960000 11.61190000 10.45110000 38.45190000 1246 26.02460000 45.68080000 70.68180000 16.93460000 17.23510000 46.54470000 1247 25.36540000 49.93070000 94.62990000 25.76810000 22.96230000 86.87110000 1248 38.32000000 35.31740000 63.14590000 15.19450000 12.45620000 36.02760000 1249 48.48260000 37.88230000 70.32140000 20.94190000 16.11370000 45.62400000 1250 15.86020000 14.00440000 26.27860000 2.147950000 1.700780000 5.221500000 1251 11.25920000 57.31340000 24.49210000 11.66920000 21.52880000 7.828860000 1252 6.114910000 62.53930000 41.61760000 15.45050000 26.57130000 18.07580000 1253 11.65980000 78.14880000 46.01220000 24.43040000 43.08330000 24.18920000 1254 14.06040000 79.97310000 37.75400000 24.54390000 44.88210000 18.47680000 1255 17.52700000 91.53340000 44.67530000 33.39910000 60.56410000 26.01320000 1256 35.24230000 92.67390000 45.58610000 37.61660000 63.92870000 27.17030000 1257 30.23550000 90.43260000 30.76500000 32.98400000 59.40110000 16.80820000 1258 82.53420000 93.02630000 30.24750000 58.84020000 75.46670000 18.28740000 1259 76.54930000 50.64270000 17.87660000 31.32950000 27.99310000 5.898000000 1260 88.61980000 52.67390000 42.68610000 43.12370000 34.87400000 19.00910000 1261 46.81620000 22.14060000 64.82460000 16.02570000 9.385250000 37.43590000 1262 63.01910000 20.12970000 90.18320000 30.37200000 15.55960000 76.78320000 1263 62.74990000 34.35550000 90.29340000 32.62920000 20.22020000 77.76670000 1264 78.85570000 72.28420000 90.75750000 56.55430000 53.47170000 83.78110000 1265 43.60790000 35.14440000 38.61250000 12.45930000 11.48970000 13.23120000 1266 53.61020000 34.11960000 41.08170000 16.37940000 13.13770000 15.04720000 1267 63.65740000 36.33140000 48.52960000 22.81140000 17.06200000 21.38460000 1268 67.88780000 45.08940000 60.21150000 29.71230000 23.84340000 34.04030000 1269 82.68240000 53.54650000 75.09630000 45.81170000 35.94680000 54.92140000 1270 23.28060000 4.536670000 17.00300000 2.078180000 1.088020000 2.022280000 1271 22.31120000 9.006000000 13.01760000 1.905820000 1.225510000 1.204210000 1272 20.50680000 12.76300000 5.439990000 1.681200000 1.437070000 0.345561000 1273 20.12340000 16.56160000 53.16690000 6.397710000 3.796260000 23.97720000 1274 27.88470000 32.22340000 54.42860000 10.18620000 9.102990000 26.05010000 1275 28.21660000 35.95750000 73.02990000 15.36520000 12.47520000 48.99580000 1276 46.51770000 39.06810000 90.42260000 26.65250000 18.78840000 78.04330000 1277 18.78970000 3.835200000 25.62730000 1.974800000 0.954450000 4.817730000 1278 31.80020000 6.725560000 37.60000000 5.513710000 2.740170000 11.24600000 1279 32.74740000 63.83470000 57.92570000 22.29700000 30.64870000 33.21490000 1280 35.99050000 80.31010000 61.21150000 32.56750000 48.85660000 39.86160000 1281 42.42790000 96.78820000 60.61650000 45.54070000 72.19260000 42.99900000 1282 29.58180000 40.62190000 27.14470000 8.788020000 11.73280000 7.178030000 1283 58.82760000 44.15440000 31.13110000 20.14990000 19.02200000 9.877090000 1284 65.89420000 52.92000000 37.14780000 27.34450000 26.95730000 14.48100000 1285 65.54560000 59.30100000 46.12240000 30.90950000 32.37720000 21.87180000 1286 82.27590000 65.23240000 65.46260000 47.93480000 44.63710000 43.35290000 1287 93.31010000 76.94330000 68.03030000 63.24250000 61.53910000 49.09880000 1288 94.38990000 87.19740000 72.69500000 71.72830000 75.22070000 57.66010000 1289 93.41810000 86.60820000 88.17210000 75.25290000 75.90970000 82.41950000 1290 53.29130000 49.27330000 45.26100000 21.02850000 21.66960000 19.62500000 1291 62.37610000 54.22280000 47.45890000 27.41580000 27.54500000 22.24160000 1292 91.18730000 9.951890000 15.16290000 34.17450000 17.91700000 3.151450000 1293 93.68130000 12.80220000 23.14710000 36.83570000 19.48410000 5.607180000 1294 93.29800000 11.62470000 31.56030000 37.14700000 19.45260000 9.286770000 1295 93.14560000 14.33110000 40.28450000 38.21900000 20.16110000 14.68790000 1296 91.41500000 8.841860000 67.03280000 41.51280000 20.79200000 41.08250000 1297 87.18510000 7.726400000 80.24420000 41.75380000 20.43070000 60.05180000 1298 68.97070000 31.56980000 60.38760000 27.00300000 17.43830000 33.14650000 1299 70.30620000 35.01200000 70.62150000 30.95830000 20.26950000 46.30880000 1300 70.04770000 37.30100000 81.59260000 34.47610000 22.50940000 63.01300000 1301 83.50610000 46.67820000 91.22150000 49.18380000 33.59010000 81.19400000 1302 94.26810000 47.41200000 92.40100000 58.31570000 38.59580000 83.89430000 1303 56.97610000 47.18090000 55.63660000 23.79260000 21.86620000 29.02470000 1304 57.40670000 65.13240000 66.43910000 33.43920000 37.06720000 43.88880000 1305 58.48010000 65.43010000 91.85320000 41.71440000 40.66050000 84.13440000 1306 21.72170000 33.39130000 34.89950000 6.422240000 7.862090000 10.52250000 1307 19.10780000 70.51180000 48.41640000 21.32750000 35.19120000 24.86320000 1308 19.13660000 82.18150000 56.59680000 29.47210000 49.07610000 34.97680000 1309 15.73280000 89.28060000 85.84270000 41.47440000 61.26080000 77.27010000 1310 13.14380000 65.54740000 81.53350000 26.11950000 33.10210000 65.40170000 1311 12.04630000 70.55520000 93.17840000 32.45020000 39.59680000 86.92920000 1312 4.513480000 91.46300000 94.78410000 45.47490000 65.21690000 94.28930000 1313 17.98960000 62.08440000 70.43570000 21.83330000 28.89920000 48.20100000 1314 14.92120000 76.46260000 72.87940000 29.44730000 43.56230000 54.03950000 1315 10.53370000 76.24820000 78.82790000 30.68430000 43.82310000 62.91090000 1316 8.995660000 66.30180000 60.48030000 20.66270000 31.46410000 36.29330000 1317 56.66090000 65.58880000 61.02650000 32.05790000 36.81970000 37.35180000 1318 57.96780000 79.17440000 61.99260000 40.13320000 51.72610000 40.92580000 1319 16.14690000 62.13910000 17.29770000 13.68670000 25.65620000 6.226740000 1320 19.62630000 70.39090000 14.48530000 17.92650000 33.73830000 6.918520000 1321 18.75500000 81.69550000 15.67290000 24.26870000 46.50760000 9.304650000 1322 35.64330000 87.24060000 58.30180000 36.26050000 57.37630000 38.04620000 1323 24.92420000 44.02250000 39.28730000 10.14000000 13.69690000 14.23270000 1324 92.92030000 45.22180000 52.72970000 45.75000000 32.34380000 26.98950000 1325 91.71690000 72.48310000 77.26680000 61.95340000 56.91470000 61.37710000 1326 50.51570000 43.21630000 45.91840000 18.09440000 17.34040000 19.47730000 1327 55.52440000 42.02250000 57.62460000 21.99060000 18.60390000 30.58170000 1328 36.07860000 17.71890000 24.27490000 5.978770000 4.170240000 4.694980000 1329 41.67640000 14.34360000 24.83720000 7.360030000 4.438660000 4.891180000 1330 43.45160000 10.27280000 35.63710000 8.700990000 4.626050000 10.21770000 1331 68.34510000 12.02140000 38.94220000 20.46340000 10.79050000 12.89480000 1332 67.66660000 35.09350000 43.31510000 23.90980000 17.30190000 17.10550000 1333 53.50820000 30.18810000 33.67710000 14.63910000 11.16740000 10.02290000 1334 71.86360000 62.81730000 32.32400000 34.30810000 36.60760000 13.15190000 1335 55.52360000 43.89520000 23.64600000 17.91180000 17.82770000 6.466460000 1336 65.09090000 81.61000000 32.75360000 40.46010000 54.63270000 16.53960000 1337 40.60920000 50.10750000 9.305230000 13.60370000 18.61630000 3.386940000 1338 54.06280000 66.41680000 10.19650000 25.32060000 34.62370000 5.973020000 1339 62.58200000 66.33770000 12.90490000 29.41150000 36.66680000 6.575480000 1340 90.31720000 75.18700000 18.93540000 52.52550000 55.37720000 10.35630000 1341 89.48070000 81.32160000 35.49380000 56.83850000 62.77830000 18.81940000 1342 98.27870000 91.75180000 35.16350000 71.09590000 80.37260000 21.26680000 1343 53.47620000 73.28290000 28.89250000 29.63700000 41.94020000 12.70090000 1344 53.65560000 85.70130000 29.22480000 37.16160000 56.82840000 15.33520000 1345 25.53130000 38.87220000 9.246350000 6.620030000 10.04690000 2.093790000 1346 23.95260000 42.48480000 55.87110000 12.23940000 13.80970000 28.32060000 1347 23.89400000 47.63030000 56.71840000 13.95430000 16.98390000 29.72800000 1348 24.95660000 55.99290000 63.00750000 18.47120000 23.59500000 37.83940000 1349 32.50820000 64.17840000 73.71190000 26.19560000 32.45500000 53.26050000 1350 33.49440000 77.67230000 75.77190000 34.03980000 46.87030000 58.65260000 1351 46.67130000 31.61110000 34.29710000 12.27350000 10.34630000 10.34270000 1352 49.19460000 29.84490000 58.92890000 16.80930000 11.73040000 30.94820000 1353 55.96940000 30.62240000 68.08590000 21.90720000 14.33110000 42.23770000 1354 36.67160000 22.12650000 51.97220000 10.11690000 6.645710000 23.18150000 1355 56.52030000 20.23980000 62.19990000 19.17680000 10.73430000 34.36150000 1356 67.49460000 24.26130000 68.50830000 26.81510000 15.27300000 42.71730000 1357 81.48440000 33.32100000 84.20440000 41.84340000 24.87820000 67.42190000 1358 19.53530000 40.04690000 18.23540000 6.343270000 10.31560000 3.898350000 1359 26.70980000 50.32530000 24.44240000 10.97430000 17.28930000 7.028070000 1360 89.22210000 59.03820000 30.11230000 44.60060000 39.50320000 12.02920000 1361 49.38740000 32.18660000 14.95290000 11.97160000 10.52760000 2.849940000 1362 57.01390000 42.63330000 12.37190000 17.65160000 17.22060000 3.348820000 1363 57.80090000 49.55300000 9.913030000 20.09820000 21.68200000 3.712670000 1364 66.62030000 61.83290000 10.42610000 29.42770000 33.59910000 5.590180000 1365 75.93830000 74.17920000 8.014210000 41.12090000 48.71430000 7.603570000 1366 75.64920000 80.25540000 27.85390000 45.45290000 56.03330000 14.11070000 1367 77.49100000 81.11840000 40.41580000 48.56630000 58.25830000 21.58820000 1368 24.77270000 24.47010000 9.836810000 3.644070000 4.267270000 1.208430000 1369 65.28400000 40.67320000 12.31800000 21.26970000 18.28550000 3.354600000 1370 79.37380000 45.25940000 10.80200000 31.20220000 25.35560000 3.958610000 1371 92.59050000 45.22340000 9.589990000 41.16330000 30.47820000 4.259310000 1372 92.47240000 57.14200000 10.38800000 45.28590000 38.83680000 5.760290000 1373 95.79270000 77.77170000 7.755180000 58.15510000 60.51340000 8.957810000 1374 43.17080000 39.10300000 8.697070000 11.12000000 12.45520000 2.258100000 1375 49.89060000 37.95120000 31.44550000 14.60030000 13.66700000 9.298290000 1376 56.27290000 39.58540000 84.24400000 28.68410000 20.27380000 67.29370000 1377 57.78570000 44.18990000 94.83090000 34.34060000 24.65830000 87.13890000 1378 13.37640000 12.20150000 44.46690000 3.881240000 2.169880000 16.13280000 1379 10.57270000 8.880130000 49.82920000 4.369720000 2.060550000 20.61530000 1380 45.72370000 9.076480000 58.66210000 13.14490000 6.402610000 29.81940000 1381 58.30920000 3.686140000 72.81920000 21.60270000 10.13640000 47.91540000 1382 83.37590000 20.10710000 76.70540000 38.77120000 20.38330000 54.69380000 1383 53.79250000 30.63750000 50.23060000 17.16850000 12.32900000 22.28690000 1384 67.89000000 32.08250000 52.52890000 24.91120000 16.69310000 24.87310000 1385 77.93560000 36.69560000 53.81320000 32.39770000 22.02260000 26.76020000 1386 17.58500000 8.598190000 8.065160000 1.135240000 0.817757000 0.470715000 1387 37.30110000 11.91510000 6.228700000 5.086930000 3.111110000 0.543597000 1388 39.72790000 10.50970000 13.16740000 5.876450000 3.379660000 1.438010000 1389 52.89750000 16.18610000 8.935880000 10.90510000 6.579240000 1.162250000 1390 77.62440000 16.42250000 8.832210000 24.38540000 13.56040000 1.787600000 1391 89.14880000 30.58670000 9.217900000 34.77030000 21.83650000 2.882700000 1392 90.72860000 29.02860000 54.79040000 40.45610000 23.79750000 27.65580000 1393 92.21300000 32.89750000 91.93040000 52.60610000 29.99110000 81.64630000 1394 35.18160000 9.191850000 33.10820000 5.920540000 3.147640000 8.616690000 1395 54.29950000 11.14590000 33.15610000 12.64560000 6.761220000 8.986300000 1396 64.76240000 18.56730000 32.91780000 18.31100000 10.56740000 9.291030000 1397 61.77100000 34.81750000 31.00780000 19.18270000 14.94590000 9.078140000 1398 64.85870000 42.99050000 38.01170000 23.65050000 20.23660000 13.93420000 1399 90.52570000 75.10450000 51.01810000 56.29110000 56.82920000 29.53920000 END_DATA CAL DESCRIPTOR "Argyll Device Calibration State" ORIGINATOR "Argyll dispcal" CREATED "Sat Mar 14 19:07:36 2009" KEYWORD "DEVICE_CLASS" DEVICE_CLASS "DISPLAY" KEYWORD "COLOR_REP" COLOR_REP "RGB" BEGIN_ARGYLL_DISPCAL_ARGS -qm -w0.3127,0.3290 -f0 -k0 END_ARGYLL_DISPCAL_ARGS KEYWORD "RGB_I" NUMBER_OF_FIELDS 4 BEGIN_DATA_FORMAT RGB_I RGB_R RGB_G RGB_B END_DATA_FORMAT NUMBER_OF_SETS 256 BEGIN_DATA 0.00000 0.00000 0.00000 0.00000 0.00392 0.00392 0.00392 0.00392 0.00784 0.00784 0.00784 0.00784 0.01176 0.01176 0.01176 0.01176 0.01569 0.01569 0.01569 0.01569 0.01961 0.01961 0.01961 0.01961 0.02353 0.02353 0.02353 0.02353 0.02745 0.02745 0.02745 0.02745 0.03137 0.03137 0.03137 0.03137 0.03529 0.03529 0.03529 0.03529 0.03922 0.03922 0.03922 0.03922 0.04314 0.04314 0.04314 0.04314 0.04706 0.04706 0.04706 0.04706 0.05098 0.05098 0.05098 0.05098 0.05490 0.05490 0.05490 0.05490 0.05882 0.05882 0.05882 0.05882 0.06275 0.06275 0.06275 0.06275 0.06667 0.06667 0.06667 0.06667 0.07059 0.07059 0.07059 0.07059 0.07451 0.07451 0.07451 0.07451 0.07843 0.07843 0.07843 0.07843 0.08235 0.08235 0.08235 0.08235 0.08627 0.08627 0.08627 0.08627 0.09020 0.09020 0.09020 0.09020 0.09412 0.09412 0.09412 0.09412 0.09804 0.09804 0.09804 0.09804 0.10196 0.10196 0.10196 0.10196 0.10588 0.10588 0.10588 0.10588 0.10980 0.10980 0.10980 0.10980 0.11373 0.11373 0.11373 0.11373 0.11765 0.11765 0.11765 0.11765 0.12157 0.12157 0.12157 0.12157 0.12549 0.12549 0.12549 0.12549 0.12941 0.12941 0.12941 0.12941 0.13333 0.13333 0.13333 0.13333 0.13725 0.13725 0.13725 0.13725 0.14118 0.14118 0.14118 0.14118 0.14510 0.14510 0.14510 0.14510 0.14902 0.14902 0.14902 0.14902 0.15294 0.15294 0.15294 0.15294 0.15686 0.15686 0.15686 0.15686 0.16078 0.16078 0.16078 0.16078 0.16471 0.16471 0.16471 0.16471 0.16863 0.16863 0.16863 0.16863 0.17255 0.17255 0.17255 0.17255 0.17647 0.17647 0.17647 0.17647 0.18039 0.18039 0.18039 0.18039 0.18431 0.18431 0.18431 0.18431 0.18824 0.18824 0.18824 0.18824 0.19216 0.19216 0.19216 0.19216 0.19608 0.19608 0.19608 0.19608 0.20000 0.20000 0.20000 0.20000 0.20392 0.20392 0.20392 0.20392 0.20784 0.20784 0.20784 0.20784 0.21176 0.21176 0.21176 0.21176 0.21569 0.21569 0.21569 0.21569 0.21961 0.21961 0.21961 0.21961 0.22353 0.22353 0.22353 0.22353 0.22745 0.22745 0.22745 0.22745 0.23137 0.23137 0.23137 0.23137 0.23529 0.23529 0.23529 0.23529 0.23922 0.23922 0.23922 0.23922 0.24314 0.24314 0.24314 0.24314 0.24706 0.24706 0.24706 0.24706 0.25098 0.25098 0.25098 0.25098 0.25490 0.25490 0.25490 0.25490 0.25882 0.25882 0.25882 0.25882 0.26275 0.26275 0.26275 0.26275 0.26667 0.26667 0.26667 0.26667 0.27059 0.27059 0.27059 0.27059 0.27451 0.27451 0.27451 0.27451 0.27843 0.27843 0.27843 0.27843 0.28235 0.28235 0.28235 0.28235 0.28627 0.28627 0.28627 0.28627 0.29020 0.29020 0.29020 0.29020 0.29412 0.29412 0.29412 0.29412 0.29804 0.29804 0.29804 0.29804 0.30196 0.30196 0.30196 0.30196 0.30588 0.30588 0.30588 0.30588 0.30980 0.30980 0.30980 0.30980 0.31373 0.31373 0.31373 0.31373 0.31765 0.31765 0.31765 0.31765 0.32157 0.32157 0.32157 0.32157 0.32549 0.32549 0.32549 0.32549 0.32941 0.32941 0.32941 0.32941 0.33333 0.33333 0.33333 0.33333 0.33725 0.33725 0.33725 0.33725 0.34118 0.34118 0.34118 0.34118 0.34510 0.34510 0.34510 0.34510 0.34902 0.34902 0.34902 0.34902 0.35294 0.35294 0.35294 0.35294 0.35686 0.35686 0.35686 0.35686 0.36078 0.36078 0.36078 0.36078 0.36471 0.36471 0.36471 0.36471 0.36863 0.36863 0.36863 0.36863 0.37255 0.37255 0.37255 0.37255 0.37647 0.37647 0.37647 0.37647 0.38039 0.38039 0.38039 0.38039 0.38431 0.38431 0.38431 0.38431 0.38824 0.38824 0.38824 0.38824 0.39216 0.39216 0.39216 0.39216 0.39608 0.39608 0.39608 0.39608 0.40000 0.40000 0.40000 0.40000 0.40392 0.40392 0.40392 0.40392 0.40784 0.40784 0.40784 0.40784 0.41176 0.41176 0.41176 0.41176 0.41569 0.41569 0.41569 0.41569 0.41961 0.41961 0.41961 0.41961 0.42353 0.42353 0.42353 0.42353 0.42745 0.42745 0.42745 0.42745 0.43137 0.43137 0.43137 0.43137 0.43529 0.43529 0.43529 0.43529 0.43922 0.43922 0.43922 0.43922 0.44314 0.44314 0.44314 0.44314 0.44706 0.44706 0.44706 0.44706 0.45098 0.45098 0.45098 0.45098 0.45490 0.45490 0.45490 0.45490 0.45882 0.45882 0.45882 0.45882 0.46275 0.46275 0.46275 0.46275 0.46667 0.46667 0.46667 0.46667 0.47059 0.47059 0.47059 0.47059 0.47451 0.47451 0.47451 0.47451 0.47843 0.47843 0.47843 0.47843 0.48235 0.48235 0.48235 0.48235 0.48627 0.48627 0.48627 0.48627 0.49020 0.49020 0.49020 0.49020 0.49412 0.49412 0.49412 0.49412 0.49804 0.49804 0.49804 0.49804 0.50196 0.50196 0.50196 0.50196 0.50588 0.50588 0.50588 0.50588 0.50980 0.50980 0.50980 0.50980 0.51373 0.51373 0.51373 0.51373 0.51765 0.51765 0.51765 0.51765 0.52157 0.52157 0.52157 0.52157 0.52549 0.52549 0.52549 0.52549 0.52941 0.52941 0.52941 0.52941 0.53333 0.53333 0.53333 0.53333 0.53725 0.53725 0.53725 0.53725 0.54118 0.54118 0.54118 0.54118 0.54510 0.54510 0.54510 0.54510 0.54902 0.54902 0.54902 0.54902 0.55294 0.55294 0.55294 0.55294 0.55686 0.55686 0.55686 0.55686 0.56078 0.56078 0.56078 0.56078 0.56471 0.56471 0.56471 0.56471 0.56863 0.56863 0.56863 0.56863 0.57255 0.57255 0.57255 0.57255 0.57647 0.57647 0.57647 0.57647 0.58039 0.58039 0.58039 0.58039 0.58431 0.58431 0.58431 0.58431 0.58824 0.58824 0.58824 0.58824 0.59216 0.59216 0.59216 0.59216 0.59608 0.59608 0.59608 0.59608 0.60000 0.60000 0.60000 0.60000 0.60392 0.60392 0.60392 0.60392 0.60784 0.60784 0.60784 0.60784 0.61176 0.61176 0.61176 0.61176 0.61569 0.61569 0.61569 0.61569 0.61961 0.61961 0.61961 0.61961 0.62353 0.62353 0.62353 0.62353 0.62745 0.62745 0.62745 0.62745 0.63137 0.63137 0.63137 0.63137 0.63529 0.63529 0.63529 0.63529 0.63922 0.63922 0.63922 0.63922 0.64314 0.64314 0.64314 0.64314 0.64706 0.64706 0.64706 0.64706 0.65098 0.65098 0.65098 0.65098 0.65490 0.65490 0.65490 0.65490 0.65882 0.65882 0.65882 0.65882 0.66275 0.66275 0.66275 0.66275 0.66667 0.66667 0.66667 0.66667 0.67059 0.67059 0.67059 0.67059 0.67451 0.67451 0.67451 0.67451 0.67843 0.67843 0.67843 0.67843 0.68235 0.68235 0.68235 0.68235 0.68627 0.68627 0.68627 0.68627 0.69020 0.69020 0.69020 0.69020 0.69412 0.69412 0.69412 0.69412 0.69804 0.69804 0.69804 0.69804 0.70196 0.70196 0.70196 0.70196 0.70588 0.70588 0.70588 0.70588 0.70980 0.70980 0.70980 0.70980 0.71373 0.71373 0.71373 0.71373 0.71765 0.71765 0.71765 0.71765 0.72157 0.72157 0.72157 0.72157 0.72549 0.72549 0.72549 0.72549 0.72941 0.72941 0.72941 0.72941 0.73333 0.73333 0.73333 0.73333 0.73725 0.73725 0.73725 0.73725 0.74118 0.74118 0.74118 0.74118 0.74510 0.74510 0.74510 0.74510 0.74902 0.74902 0.74902 0.74902 0.75294 0.75294 0.75294 0.75294 0.75686 0.75686 0.75686 0.75686 0.76078 0.76078 0.76078 0.76078 0.76471 0.76471 0.76471 0.76471 0.76863 0.76863 0.76863 0.76863 0.77255 0.77255 0.77255 0.77255 0.77647 0.77647 0.77647 0.77647 0.78039 0.78039 0.78039 0.78039 0.78431 0.78431 0.78431 0.78431 0.78824 0.78824 0.78824 0.78824 0.79216 0.79216 0.79216 0.79216 0.79608 0.79608 0.79608 0.79608 0.80000 0.80000 0.80000 0.80000 0.80392 0.80392 0.80392 0.80392 0.80784 0.80784 0.80784 0.80784 0.81176 0.81176 0.81176 0.81176 0.81569 0.81569 0.81569 0.81569 0.81961 0.81961 0.81961 0.81961 0.82353 0.82353 0.82353 0.82353 0.82745 0.82745 0.82745 0.82745 0.83137 0.83137 0.83137 0.83137 0.83529 0.83529 0.83529 0.83529 0.83922 0.83922 0.83922 0.83922 0.84314 0.84314 0.84314 0.84314 0.84706 0.84706 0.84706 0.84706 0.85098 0.85098 0.85098 0.85098 0.85490 0.85490 0.85490 0.85490 0.85882 0.85882 0.85882 0.85882 0.86275 0.86275 0.86275 0.86275 0.86667 0.86667 0.86667 0.86667 0.87059 0.87059 0.87059 0.87059 0.87451 0.87451 0.87451 0.87451 0.87843 0.87843 0.87843 0.87843 0.88235 0.88235 0.88235 0.88235 0.88627 0.88627 0.88627 0.88627 0.89020 0.89020 0.89020 0.89020 0.89412 0.89412 0.89412 0.89412 0.89804 0.89804 0.89804 0.89804 0.90196 0.90196 0.90196 0.90196 0.90588 0.90588 0.90588 0.90588 0.90980 0.90980 0.90980 0.90980 0.91373 0.91373 0.91373 0.91373 0.91765 0.91765 0.91765 0.91765 0.92157 0.92157 0.92157 0.92157 0.92549 0.92549 0.92549 0.92549 0.92941 0.92941 0.92941 0.92941 0.93333 0.93333 0.93333 0.93333 0.93725 0.93725 0.93725 0.93725 0.94118 0.94118 0.94118 0.94118 0.94510 0.94510 0.94510 0.94510 0.94902 0.94902 0.94902 0.94902 0.95294 0.95294 0.95294 0.95294 0.95686 0.95686 0.95686 0.95686 0.96078 0.96078 0.96078 0.96078 0.96471 0.96471 0.96471 0.96471 0.96863 0.96863 0.96863 0.96863 0.97255 0.97255 0.97255 0.97255 0.97647 0.97647 0.97647 0.97647 0.98039 0.98039 0.98039 0.98039 0.98431 0.98431 0.98431 0.98431 0.98824 0.98824 0.98824 0.98824 0.99216 0.99216 0.99216 0.99216 0.99608 0.99608 0.99608 0.99608 1.00000 1.00000 1.00000 1.00000 END_DATA sf32%D3֮? e wdescPrismaDisplayCAL-3.1.0.0/DisplayCAL/presets/video_ReShade.icc0000644000076500000000000006451412647526507022315 0ustar devwheel00000000000000iLargl mntrRGB XYZ ;-acspMSFT-arglT>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~  !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~  !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~XYZ o8XYZ bXYZ $curvtextCTI3 DESCRIPTOR "Argyll Calibration Target chart information 3" ORIGINATOR "Argyll dispread" CREATED "Sat Mar 14 19:00:55 2009" KEYWORD "DEVICE_CLASS" DEVICE_CLASS "DISPLAY" KEYWORD "APPROX_WHITE_POINT" APPROX_WHITE_POINT "95.045781 100.000003 108.905751" KEYWORD "DARK_REGION_EMPHASIS" DARK_REGION_EMPHASIS "1.6" KEYWORD "ACCURATE_EXPECTED_VALUES" ACCURATE_EXPECTED_VALUES "true" KEYWORD "COLOR_REP" COLOR_REP "RGB_XYZ" KEYWORD "BLACK_COLOR_PATCHES" BLACK_COLOR_PATCHES "4" KEYWORD "COMP_GREY_STEPS" COMP_GREY_STEPS "97" KEYWORD "SINGLE_DIM_STEPS" SINGLE_DIM_STEPS "33" KEYWORD "WHITE_COLOR_PATCHES" WHITE_COLOR_PATCHES "4" KEYWORD "USE_BLACK_POINT_COMPENSATION" USE_BLACK_POINT_COMPENSATION "NO" KEYWORD "HIRES_B2A" HIRES_B2A "NO" KEYWORD "AUTO_OPTIMIZE" AUTO_OPTIMIZE "5" KEYWORD "3DLUT_SOURCE_PROFILE" 3DLUT_SOURCE_PROFILE "ref/Rec709.icm" KEYWORD "3DLUT_GAMMA" 3DLUT_GAMMA "-2.4" KEYWORD "3DLUT_DEGREE_OF_BLACK_OUTPUT_OFFSET" 3DLUT_DEGREE_OF_BLACK_OUTPUT_OFFSET "0.0" KEYWORD "3DLUT_INPUT_ENCODING" 3DLUT_INPUT_ENCODING "n" KEYWORD "3DLUT_OUTPUT_ENCODING" 3DLUT_OUTPUT_ENCODING "n" KEYWORD "3DLUT_GAMUT_MAPPING_MODE" 3DLUT_GAMUT_MAPPING_MODE "G" KEYWORD "3DLUT_RENDERING_INTENT" 3DLUT_RENDERING_INTENT "aw" KEYWORD "3DLUT_FORMAT" 3DLUT_FORMAT "ReShade" KEYWORD "3DLUT_SIZE" 3DLUT_SIZE "64" KEYWORD "3DLUT_OUTPUT_BITDEPTH" 3DLUT_OUTPUT_BITDEPTH "8" BEGIN_ARGYLL_COLPROF_ARGS -qh -bl -ax END_ARGYLL_COLPROF_ARGS NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT SAMPLE_ID RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 271 BEGIN_DATA 1 100.000 100.000 100.000 95.1065 100.000 108.844 2 12.5000 37.5000 12.5000 5.94993 9.61866 3.74740 3 12.5000 62.5000 12.5000 14.1814 26.0794 6.49125 4 12.5000 87.5000 87.5000 40.9488 58.8934 79.2939 5 37.5000 87.5000 87.5000 45.0999 61.0337 79.4884 6 0.00000 25.0000 25.0000 3.71049 4.96568 6.38934 7 0.00000 25.0000 50.0000 6.62643 6.13187 21.7479 8 25.0000 75.0000 75.0000 30.9153 42.8005 56.4485 9 50.0000 75.0000 75.0000 37.5774 46.2355 56.7606 10 12.5000 0.00000 0.00000 1.58591 1.30210 1.02745 11 10.4167 10.4167 10.4167 2.00521 2.05749 2.15195 12 25.0000 0.00000 0.00000 3.07728 2.07105 1.09734 13 31.2500 0.00000 0.00000 4.24932 2.67536 1.15226 14 37.5000 0.00000 0.00000 5.73696 3.44239 1.22197 15 43.7500 0.00000 0.00000 7.56070 4.38272 1.30742 16 50.0000 0.00000 0.00000 9.73934 5.50603 1.40951 17 62.5000 37.5000 62.5000 25.5656 19.0418 35.8409 18 87.5000 37.5000 62.5000 41.5030 27.2592 36.5877 19 0.00000 0.00000 0.00000 1.00000 1.00000 1.00000 20 75.0000 0.00000 0.00000 22.3346 12.0002 1.99970 21 81.2500 0.00000 0.00000 26.5283 14.1625 2.19621 22 87.5000 0.00000 0.00000 31.1672 16.5543 2.41358 23 93.7500 0.00000 0.00000 36.2638 19.1821 2.65240 24 100.000 0.00000 0.00000 41.8302 22.0522 2.91323 25 62.5000 62.5000 12.5000 27.8253 33.1142 7.13058 26 75.0000 75.0000 50.0000 44.6598 50.5248 28.3139 27 8.33333 8.33333 8.33333 1.71786 1.75519 1.82265 28 0.00000 12.5000 0.00000 1.50806 2.01598 1.16935 29 0.00000 43.7500 0.00000 6.68900 12.3764 2.89635 30 0.00000 50.0000 0.00000 8.57817 16.1542 3.52608 31 0.00000 56.2500 0.00000 10.7902 20.5776 4.26342 32 0.00000 62.5000 0.00000 13.3391 25.6747 5.11306 33 12.5000 62.5000 37.5000 15.9983 26.8060 16.0610 34 0.00000 0.00000 0.00000 1.00000 1.00000 1.00000 35 0.00000 6.25000 0.00000 1.18254 1.36502 1.06085 36 0.00000 75.0000 0.00000 19.5000 37.9948 7.16671 37 0.00000 81.2500 0.00000 23.1365 45.2667 8.37888 38 0.00000 87.5000 0.00000 27.1590 53.3106 9.71972 39 0.00000 93.7500 0.00000 31.5784 62.1482 11.1929 40 0.00000 100.000 0.00000 36.4052 71.8005 12.8018 41 6.25000 6.25000 6.25000 1.48518 1.51041 1.55601 42 0.00000 0.00000 12.5000 1.25645 1.10256 2.35074 43 0.00000 0.00000 18.7500 1.52439 1.20972 3.76201 44 0.00000 0.00000 25.0000 1.90921 1.36363 5.78891 45 0.00000 0.00000 31.2500 2.42221 1.56879 8.49092 46 0.00000 0.00000 37.5000 3.07334 1.82920 11.9205 47 0.00000 0.00000 43.7500 3.87158 2.14845 16.1249 48 0.00000 0.00000 50.0000 4.82515 2.52982 21.1475 49 0.00000 0.00000 56.2500 5.94168 2.97636 27.0283 50 0.00000 0.00000 62.5000 7.22826 3.49091 33.8049 51 0.00000 0.00000 68.7500 8.69161 4.07616 41.5125 52 0.00000 0.00000 75.0000 10.3380 4.73463 50.1844 53 0.00000 0.00000 81.2500 12.1736 5.46873 59.8524 54 0.00000 0.00000 87.5000 14.2040 6.28076 70.5467 55 0.00000 0.00000 93.7500 16.4347 7.17291 82.2963 56 0.00000 0.00000 100.000 18.8711 8.14731 95.1290 57 0.00000 50.0000 100.000 26.4493 23.3015 97.6550 58 75.0000 50.0000 100.000 47.7839 34.3017 98.6547 59 0.00000 0.00000 6.25000 1.09214 1.03685 1.48530 60 2.08333 2.08333 2.08333 1.15175 1.15964 1.17390 61 4.16667 4.16667 4.16667 1.30372 1.31952 1.34806 62 12.5000 12.5000 12.5000 2.35042 2.42064 2.54755 63 14.5833 14.5833 14.5833 2.75638 2.84772 3.01278 64 16.6667 16.6667 16.6667 3.22584 3.34159 3.55077 65 18.7500 18.7500 18.7500 3.76135 3.90494 4.16445 66 20.8333 20.8333 20.8333 4.36533 4.54033 4.85660 67 22.9167 22.9167 22.9167 5.04007 5.25016 5.62984 68 25.0000 25.0000 25.0000 5.78777 6.03673 6.48668 69 27.0833 27.0833 27.0833 6.61052 6.90226 7.42953 70 29.1667 29.1667 29.1667 7.51032 7.84886 8.46069 71 31.2500 31.2500 31.2500 8.48913 8.87856 9.58238 72 6.25000 0.00000 0.00000 1.21051 1.10854 1.00986 73 33.3333 33.3333 33.3333 9.54879 9.99333 10.7967 74 35.4167 35.4167 35.4167 10.6911 11.1951 12.1058 75 39.5833 39.5833 39.5833 13.2307 13.8667 15.0161 76 41.6667 41.6667 41.6667 14.6313 15.3402 16.6212 77 43.7500 43.7500 43.7500 16.1213 16.9076 18.3287 78 45.8333 45.8333 45.8333 17.7021 18.5707 20.1403 79 47.9167 47.9167 47.9167 19.3754 20.3310 22.0579 80 50.0000 50.0000 50.0000 21.1427 22.1901 24.0831 81 52.0833 52.0833 52.0833 23.0052 24.1495 26.2175 82 54.1667 54.1667 54.1667 24.9646 26.2107 28.4629 83 56.2500 56.2500 56.2500 27.0221 28.3752 30.8208 84 58.3333 58.3333 58.3333 29.1791 30.6444 33.2927 85 60.4167 60.4167 60.4167 31.4370 33.0197 35.8802 86 62.5000 62.5000 62.5000 33.7971 35.5025 38.5847 87 64.5833 64.5833 64.5833 36.2605 38.0941 41.4078 88 66.6667 66.6667 66.6667 38.8287 40.7958 44.3509 89 68.7500 68.7500 68.7500 41.5028 43.6089 47.4154 90 70.8333 70.8333 70.8333 44.2840 46.5348 50.6026 91 72.9167 72.9167 72.9167 47.1736 49.5746 53.9140 92 75.0000 75.0000 75.0000 50.1727 52.7296 57.3508 93 77.0833 77.0833 77.0833 53.2824 56.0011 60.9145 94 79.1667 79.1667 79.1667 56.5039 59.3901 64.6063 95 81.2500 81.2500 81.2500 59.8383 62.8979 68.4275 96 83.3333 83.3333 83.3333 63.2868 66.5257 72.3793 97 85.4167 85.4167 85.4167 66.8503 70.2745 76.4631 98 87.5000 87.5000 87.5000 70.5301 74.1456 80.6800 99 89.5833 89.5833 89.5833 74.3270 78.1400 85.0312 100 91.6667 91.6667 91.6667 78.2423 82.2589 89.5180 101 93.7500 93.7500 93.7500 82.2769 86.5032 94.1415 102 95.8333 95.8333 95.8333 86.4317 90.8742 98.9029 103 97.9167 97.9167 97.9167 90.7080 95.3727 103.803 104 25.0000 25.0000 0.00000 4.87856 5.67311 1.69777 105 50.0000 25.0000 0.00000 11.5406 9.10808 2.00994 106 75.0000 25.0000 0.00000 24.1359 15.6023 2.60014 107 100.000 25.0000 0.00000 43.6314 25.6542 3.51366 108 100.000 75.0000 0.00000 60.3302 59.0470 9.07994 109 50.0000 50.0000 0.00000 17.3175 20.6603 3.93559 110 75.0000 50.0000 0.00000 29.9128 27.1544 4.52578 111 100.000 50.0000 0.00000 49.4083 37.2064 5.43931 112 100.000 100.000 100.000 95.1065 100.000 108.844 113 50.0000 75.0000 0.00000 28.2393 42.5008 7.57622 114 75.0000 75.0000 0.00000 40.8346 48.9950 8.16642 115 25.0000 75.0000 0.00000 21.5773 39.0658 7.26405 116 25.0000 100.000 0.00000 38.4825 72.8716 12.8992 117 50.0000 100.000 0.00000 45.1445 76.3065 13.2113 118 75.0000 100.000 0.00000 57.7399 82.8007 13.8015 119 100.000 100.000 0.00000 77.2354 92.8527 14.7151 120 25.0000 0.00000 25.0000 3.98649 2.43468 5.88625 121 50.0000 0.00000 25.0000 10.6485 5.86966 6.19842 122 75.0000 0.00000 25.0000 23.2439 12.3638 6.78862 123 75.0000 25.0000 25.0000 25.0451 15.9659 7.38905 124 87.5000 37.5000 37.5000 37.3481 25.5975 14.7033 125 56.2500 0.00000 0.00000 12.2903 6.82130 1.52904 126 100.000 0.00000 25.0000 42.7394 22.4158 7.70214 127 100.000 25.0000 25.0000 44.5407 26.0178 8.30257 128 100.000 25.0000 50.0000 47.4566 27.1840 23.6611 129 50.0000 25.0000 25.0000 12.4498 9.47171 6.79885 130 50.0000 50.0000 25.0000 18.2267 21.0239 8.72450 131 75.0000 50.0000 25.0000 30.8220 27.5181 9.31470 132 100.000 50.0000 25.0000 50.3176 37.5700 10.2282 133 25.0000 50.0000 25.0000 11.5647 17.5889 8.41233 134 25.0000 75.0000 25.0000 22.4865 39.4295 12.0530 135 50.0000 75.0000 25.0000 29.1485 42.8645 12.3651 136 75.0000 75.0000 25.0000 41.7438 49.3586 12.9553 137 100.000 75.0000 25.0000 61.2394 59.4106 13.8689 138 25.0000 50.0000 0.00000 10.6555 17.2253 3.62342 139 25.0000 100.000 25.0000 39.3917 73.2352 17.6881 140 50.0000 100.000 25.0000 46.0538 76.6702 18.0003 141 75.0000 100.000 25.0000 58.6491 83.1644 18.5905 142 100.000 100.000 25.0000 78.1446 93.2163 19.5040 143 25.0000 0.00000 50.0000 6.90243 3.60087 21.2448 144 50.0000 0.00000 50.0000 13.5645 7.03585 21.5570 145 75.0000 0.00000 50.0000 26.1598 13.5300 22.1472 146 100.000 0.00000 50.0000 45.6553 23.5820 23.0607 147 100.000 50.0000 75.0000 58.7464 40.9410 54.6237 148 100.000 50.0000 100.000 67.2794 44.3537 99.5683 149 50.0000 25.0000 50.0000 15.3658 10.6379 22.1574 150 75.0000 25.0000 50.0000 27.9611 17.1321 22.7476 151 100.000 25.0000 75.0000 52.9695 29.3888 52.6981 152 25.0000 25.0000 50.0000 8.70371 7.20292 21.8452 153 25.0000 50.0000 50.0000 14.4806 18.7551 23.7709 154 75.0000 50.0000 50.0000 33.7380 28.6843 24.6733 155 100.000 50.0000 50.0000 53.2335 38.7362 25.5868 156 100.000 75.0000 50.0000 64.1553 60.5768 29.2274 157 87.5000 62.5000 62.5000 49.7345 43.7199 39.3315 158 87.5000 87.5000 62.5000 63.5544 71.3558 43.9382 159 100.000 100.000 75.0000 86.5734 96.5873 63.8995 160 0.00000 68.7500 0.00000 16.2382 31.4721 6.07943 161 0.00000 100.000 25.0000 37.3144 72.1641 17.5907 162 0.00000 100.000 50.0000 40.2304 73.3303 32.9493 163 50.0000 100.000 50.0000 48.9697 77.8364 33.3588 164 75.0000 100.000 50.0000 61.5650 84.3305 33.9490 165 100.000 100.000 50.0000 81.0605 94.3825 34.8625 166 25.0000 0.00000 75.0000 12.4153 5.80568 50.2817 167 50.0000 0.00000 75.0000 19.0774 9.24066 50.5939 168 75.0000 0.00000 75.0000 31.6727 15.7348 51.1841 169 100.000 0.00000 75.0000 51.1682 25.7868 52.0976 170 100.000 0.00000 100.000 59.7013 29.1995 97.0422 171 25.0000 25.0000 75.0000 14.2166 9.40773 50.8822 172 50.0000 25.0000 75.0000 20.8787 12.8427 51.1944 173 75.0000 25.0000 75.0000 33.4740 19.3369 51.7845 174 0.00000 31.2500 0.00000 3.81760 6.63441 1.93921 175 0.00000 37.5000 0.00000 5.10758 9.21400 2.36920 176 25.0000 50.0000 75.0000 19.9935 20.9599 52.8078 177 50.0000 50.0000 75.0000 26.6555 24.3949 53.1200 178 75.0000 50.0000 75.0000 39.2509 30.8891 53.7102 179 100.000 75.0000 75.0000 69.6682 62.7816 58.2644 180 100.000 75.0000 100.000 78.2013 66.1943 103.209 181 0.00000 0.00000 0.00000 1.00000 1.00000 1.00000 182 12.5000 37.5000 37.5000 7.76682 10.3453 13.3171 183 25.0000 75.0000 50.0000 25.4024 40.5957 27.4115 184 25.0000 100.000 50.0000 42.3076 74.4014 33.0466 185 25.0000 100.000 75.0000 47.8205 76.6062 62.0836 186 50.0000 100.000 75.0000 54.4826 80.0412 62.3958 187 75.0000 100.000 75.0000 67.0779 86.5354 62.9859 188 100.000 100.000 100.000 95.1065 100.000 108.844 189 25.0000 0.00000 100.000 20.9484 9.21837 95.2263 190 50.0000 0.00000 100.000 27.6104 12.6533 95.5385 191 75.0000 0.00000 100.000 40.2058 19.1475 96.1287 192 75.0000 75.0000 100.000 58.7057 56.1423 102.295 193 0.00000 25.0000 100.000 20.6724 11.7494 95.7294 194 25.0000 25.0000 100.000 22.7497 12.8204 95.8267 195 50.0000 25.0000 100.000 29.4117 16.2554 96.1389 196 75.0000 25.0000 100.000 42.0070 22.7496 96.7291 197 100.000 25.0000 100.000 61.5026 32.8015 97.6426 198 0.00000 0.00000 0.00000 1.00000 1.00000 1.00000 199 25.0000 50.0000 100.000 28.5266 24.3726 97.7524 200 50.0000 50.0000 100.000 35.1886 27.8076 98.0645 201 50.0000 75.0000 100.000 46.1104 49.6481 101.705 202 12.5000 62.5000 62.5000 20.1532 28.4677 37.9454 203 12.5000 62.5000 87.5000 27.1290 31.2576 74.6872 204 25.0000 75.0000 100.000 39.4484 46.2132 101.393 205 0.00000 50.0000 50.0000 12.4033 17.6840 23.6735 206 0.00000 75.0000 75.0000 28.8380 41.7294 56.3511 207 0.00000 100.000 75.0000 45.7432 75.5351 61.9862 208 0.00000 100.000 100.000 54.2763 78.9478 106.931 209 25.0000 100.000 100.000 56.3536 80.0189 107.028 210 50.0000 100.000 100.000 63.0157 83.4539 107.340 211 75.0000 100.000 100.000 75.6110 89.9480 107.930 212 62.5000 0.00000 0.00000 15.2297 8.33690 1.66678 213 68.7500 0.00000 0.00000 18.5730 10.0607 1.82344 214 100.000 100.000 100.000 95.1065 100.000 108.844 215 0.00000 25.0000 0.00000 2.80128 4.60205 1.60043 216 37.5000 37.5000 12.5000 10.1010 11.7590 3.94191 217 62.5000 37.5000 12.5000 19.5938 16.6535 4.38672 218 87.5000 37.5000 12.5000 35.5312 24.8708 5.13352 219 37.5000 12.5000 12.5000 6.50147 4.56093 2.74206 220 62.5000 12.5000 12.5000 15.9942 9.45544 3.18687 221 87.5000 12.5000 12.5000 31.9317 17.6728 3.93367 222 87.5000 62.5000 12.5000 43.7627 41.3315 7.87738 223 37.5000 62.5000 12.5000 18.3325 28.2197 6.68576 224 37.5000 87.5000 12.5000 32.1524 55.8555 11.2924 225 62.5000 87.5000 12.5000 41.6451 60.7500 11.7372 226 87.5000 87.5000 12.5000 57.5826 68.9674 12.4840 227 12.5000 12.5000 37.5000 4.16730 3.14728 12.1173 228 37.5000 12.5000 37.5000 8.31836 5.28757 12.3118 229 62.5000 12.5000 37.5000 17.8111 10.1821 12.7566 230 87.5000 12.5000 37.5000 33.7486 18.3995 13.5034 231 87.5000 62.5000 37.5000 45.5796 42.0582 17.4471 232 62.5000 37.5000 37.5000 21.4106 17.3801 13.9565 233 62.5000 62.5000 37.5000 29.6421 33.8408 16.7003 234 37.5000 37.5000 37.5000 11.9179 12.4856 13.5116 235 37.5000 62.5000 37.5000 20.1494 28.9463 16.2555 236 50.0000 75.0000 50.0000 32.0645 44.0306 27.7237 237 12.5000 87.5000 12.5000 28.0013 53.7152 11.0979 238 12.5000 87.5000 37.5000 29.8182 54.4419 20.6677 239 37.5000 87.5000 37.5000 33.9692 56.5822 20.8622 240 62.5000 87.5000 37.5000 43.4620 61.4767 21.3070 241 87.5000 87.5000 37.5000 59.3994 69.6941 22.0538 242 18.7500 0.00000 0.00000 2.19807 1.61773 1.05614 243 37.5000 12.5000 62.5000 12.4733 6.94928 34.1962 244 62.5000 12.5000 62.5000 21.9661 11.8438 34.6410 245 87.5000 12.5000 62.5000 37.9035 20.0612 35.3878 246 87.5000 12.5000 87.5000 44.8792 22.8510 72.1296 247 87.5000 37.5000 87.5000 48.4787 30.0490 73.3295 248 87.5000 62.5000 87.5000 56.7102 46.5097 76.0733 249 0.00000 18.7500 0.00000 2.03889 3.07749 1.34630 250 0.00000 50.0000 25.0000 9.48738 16.5179 8.31499 251 0.00000 75.0000 25.0000 20.4092 38.3584 11.9556 252 0.00000 75.0000 50.0000 23.3251 39.5246 27.3142 253 12.5000 87.5000 62.5000 33.9731 56.1036 42.5521 254 37.5000 87.5000 62.5000 38.1242 58.2439 42.7466 255 62.5000 87.5000 62.5000 47.6169 63.1384 43.1914 256 12.5000 12.5000 62.5000 8.32223 4.80899 34.0017 257 12.5000 12.5000 87.5000 15.2979 7.59883 70.7435 258 37.5000 12.5000 87.5000 19.4490 9.73913 70.9380 259 62.5000 12.5000 87.5000 28.9418 14.6336 71.3828 260 12.5000 37.5000 62.5000 11.9217 12.0070 35.2016 261 12.5000 37.5000 87.5000 18.8975 14.7969 71.9433 262 37.5000 37.5000 87.5000 23.0485 16.9371 72.1379 263 62.5000 37.5000 87.5000 32.5413 21.8317 72.5827 264 37.5000 37.5000 62.5000 16.0728 14.1473 35.3961 265 37.5000 62.5000 62.5000 24.3043 30.6080 38.1399 266 37.5000 62.5000 87.5000 31.2800 33.3978 74.8817 267 62.5000 62.5000 87.5000 40.7728 38.2924 75.3265 268 62.5000 87.5000 87.5000 54.5927 65.9282 79.9332 269 0.00000 25.0000 75.0000 12.1393 8.33668 50.7848 270 0.00000 50.0000 75.0000 17.9162 19.8888 52.7105 271 0.00000 75.0000 100.000 37.3711 45.1421 101.296 END_DATA CAL DESCRIPTOR "Argyll Device Calibration State" ORIGINATOR "Argyll dispcal" CREATED "Sat Mar 14 19:07:36 2009" KEYWORD "DEVICE_CLASS" DEVICE_CLASS "DISPLAY" KEYWORD "COLOR_REP" COLOR_REP "RGB" BEGIN_ARGYLL_DISPCAL_ARGS -qm -w0.3127,0.3290 -f0 -k0 END_ARGYLL_DISPCAL_ARGS KEYWORD "RGB_I" NUMBER_OF_FIELDS 4 BEGIN_DATA_FORMAT RGB_I RGB_R RGB_G RGB_B END_DATA_FORMAT NUMBER_OF_SETS 256 BEGIN_DATA 0.00000 0.00000 0.00000 0.00000 0.00392 0.00392 0.00392 0.00392 0.00784 0.00784 0.00784 0.00784 0.01176 0.01176 0.01176 0.01176 0.01569 0.01569 0.01569 0.01569 0.01961 0.01961 0.01961 0.01961 0.02353 0.02353 0.02353 0.02353 0.02745 0.02745 0.02745 0.02745 0.03137 0.03137 0.03137 0.03137 0.03529 0.03529 0.03529 0.03529 0.03922 0.03922 0.03922 0.03922 0.04314 0.04314 0.04314 0.04314 0.04706 0.04706 0.04706 0.04706 0.05098 0.05098 0.05098 0.05098 0.05490 0.05490 0.05490 0.05490 0.05882 0.05882 0.05882 0.05882 0.06275 0.06275 0.06275 0.06275 0.06667 0.06667 0.06667 0.06667 0.07059 0.07059 0.07059 0.07059 0.07451 0.07451 0.07451 0.07451 0.07843 0.07843 0.07843 0.07843 0.08235 0.08235 0.08235 0.08235 0.08627 0.08627 0.08627 0.08627 0.09020 0.09020 0.09020 0.09020 0.09412 0.09412 0.09412 0.09412 0.09804 0.09804 0.09804 0.09804 0.10196 0.10196 0.10196 0.10196 0.10588 0.10588 0.10588 0.10588 0.10980 0.10980 0.10980 0.10980 0.11373 0.11373 0.11373 0.11373 0.11765 0.11765 0.11765 0.11765 0.12157 0.12157 0.12157 0.12157 0.12549 0.12549 0.12549 0.12549 0.12941 0.12941 0.12941 0.12941 0.13333 0.13333 0.13333 0.13333 0.13725 0.13725 0.13725 0.13725 0.14118 0.14118 0.14118 0.14118 0.14510 0.14510 0.14510 0.14510 0.14902 0.14902 0.14902 0.14902 0.15294 0.15294 0.15294 0.15294 0.15686 0.15686 0.15686 0.15686 0.16078 0.16078 0.16078 0.16078 0.16471 0.16471 0.16471 0.16471 0.16863 0.16863 0.16863 0.16863 0.17255 0.17255 0.17255 0.17255 0.17647 0.17647 0.17647 0.17647 0.18039 0.18039 0.18039 0.18039 0.18431 0.18431 0.18431 0.18431 0.18824 0.18824 0.18824 0.18824 0.19216 0.19216 0.19216 0.19216 0.19608 0.19608 0.19608 0.19608 0.20000 0.20000 0.20000 0.20000 0.20392 0.20392 0.20392 0.20392 0.20784 0.20784 0.20784 0.20784 0.21176 0.21176 0.21176 0.21176 0.21569 0.21569 0.21569 0.21569 0.21961 0.21961 0.21961 0.21961 0.22353 0.22353 0.22353 0.22353 0.22745 0.22745 0.22745 0.22745 0.23137 0.23137 0.23137 0.23137 0.23529 0.23529 0.23529 0.23529 0.23922 0.23922 0.23922 0.23922 0.24314 0.24314 0.24314 0.24314 0.24706 0.24706 0.24706 0.24706 0.25098 0.25098 0.25098 0.25098 0.25490 0.25490 0.25490 0.25490 0.25882 0.25882 0.25882 0.25882 0.26275 0.26275 0.26275 0.26275 0.26667 0.26667 0.26667 0.26667 0.27059 0.27059 0.27059 0.27059 0.27451 0.27451 0.27451 0.27451 0.27843 0.27843 0.27843 0.27843 0.28235 0.28235 0.28235 0.28235 0.28627 0.28627 0.28627 0.28627 0.29020 0.29020 0.29020 0.29020 0.29412 0.29412 0.29412 0.29412 0.29804 0.29804 0.29804 0.29804 0.30196 0.30196 0.30196 0.30196 0.30588 0.30588 0.30588 0.30588 0.30980 0.30980 0.30980 0.30980 0.31373 0.31373 0.31373 0.31373 0.31765 0.31765 0.31765 0.31765 0.32157 0.32157 0.32157 0.32157 0.32549 0.32549 0.32549 0.32549 0.32941 0.32941 0.32941 0.32941 0.33333 0.33333 0.33333 0.33333 0.33725 0.33725 0.33725 0.33725 0.34118 0.34118 0.34118 0.34118 0.34510 0.34510 0.34510 0.34510 0.34902 0.34902 0.34902 0.34902 0.35294 0.35294 0.35294 0.35294 0.35686 0.35686 0.35686 0.35686 0.36078 0.36078 0.36078 0.36078 0.36471 0.36471 0.36471 0.36471 0.36863 0.36863 0.36863 0.36863 0.37255 0.37255 0.37255 0.37255 0.37647 0.37647 0.37647 0.37647 0.38039 0.38039 0.38039 0.38039 0.38431 0.38431 0.38431 0.38431 0.38824 0.38824 0.38824 0.38824 0.39216 0.39216 0.39216 0.39216 0.39608 0.39608 0.39608 0.39608 0.40000 0.40000 0.40000 0.40000 0.40392 0.40392 0.40392 0.40392 0.40784 0.40784 0.40784 0.40784 0.41176 0.41176 0.41176 0.41176 0.41569 0.41569 0.41569 0.41569 0.41961 0.41961 0.41961 0.41961 0.42353 0.42353 0.42353 0.42353 0.42745 0.42745 0.42745 0.42745 0.43137 0.43137 0.43137 0.43137 0.43529 0.43529 0.43529 0.43529 0.43922 0.43922 0.43922 0.43922 0.44314 0.44314 0.44314 0.44314 0.44706 0.44706 0.44706 0.44706 0.45098 0.45098 0.45098 0.45098 0.45490 0.45490 0.45490 0.45490 0.45882 0.45882 0.45882 0.45882 0.46275 0.46275 0.46275 0.46275 0.46667 0.46667 0.46667 0.46667 0.47059 0.47059 0.47059 0.47059 0.47451 0.47451 0.47451 0.47451 0.47843 0.47843 0.47843 0.47843 0.48235 0.48235 0.48235 0.48235 0.48627 0.48627 0.48627 0.48627 0.49020 0.49020 0.49020 0.49020 0.49412 0.49412 0.49412 0.49412 0.49804 0.49804 0.49804 0.49804 0.50196 0.50196 0.50196 0.50196 0.50588 0.50588 0.50588 0.50588 0.50980 0.50980 0.50980 0.50980 0.51373 0.51373 0.51373 0.51373 0.51765 0.51765 0.51765 0.51765 0.52157 0.52157 0.52157 0.52157 0.52549 0.52549 0.52549 0.52549 0.52941 0.52941 0.52941 0.52941 0.53333 0.53333 0.53333 0.53333 0.53725 0.53725 0.53725 0.53725 0.54118 0.54118 0.54118 0.54118 0.54510 0.54510 0.54510 0.54510 0.54902 0.54902 0.54902 0.54902 0.55294 0.55294 0.55294 0.55294 0.55686 0.55686 0.55686 0.55686 0.56078 0.56078 0.56078 0.56078 0.56471 0.56471 0.56471 0.56471 0.56863 0.56863 0.56863 0.56863 0.57255 0.57255 0.57255 0.57255 0.57647 0.57647 0.57647 0.57647 0.58039 0.58039 0.58039 0.58039 0.58431 0.58431 0.58431 0.58431 0.58824 0.58824 0.58824 0.58824 0.59216 0.59216 0.59216 0.59216 0.59608 0.59608 0.59608 0.59608 0.60000 0.60000 0.60000 0.60000 0.60392 0.60392 0.60392 0.60392 0.60784 0.60784 0.60784 0.60784 0.61176 0.61176 0.61176 0.61176 0.61569 0.61569 0.61569 0.61569 0.61961 0.61961 0.61961 0.61961 0.62353 0.62353 0.62353 0.62353 0.62745 0.62745 0.62745 0.62745 0.63137 0.63137 0.63137 0.63137 0.63529 0.63529 0.63529 0.63529 0.63922 0.63922 0.63922 0.63922 0.64314 0.64314 0.64314 0.64314 0.64706 0.64706 0.64706 0.64706 0.65098 0.65098 0.65098 0.65098 0.65490 0.65490 0.65490 0.65490 0.65882 0.65882 0.65882 0.65882 0.66275 0.66275 0.66275 0.66275 0.66667 0.66667 0.66667 0.66667 0.67059 0.67059 0.67059 0.67059 0.67451 0.67451 0.67451 0.67451 0.67843 0.67843 0.67843 0.67843 0.68235 0.68235 0.68235 0.68235 0.68627 0.68627 0.68627 0.68627 0.69020 0.69020 0.69020 0.69020 0.69412 0.69412 0.69412 0.69412 0.69804 0.69804 0.69804 0.69804 0.70196 0.70196 0.70196 0.70196 0.70588 0.70588 0.70588 0.70588 0.70980 0.70980 0.70980 0.70980 0.71373 0.71373 0.71373 0.71373 0.71765 0.71765 0.71765 0.71765 0.72157 0.72157 0.72157 0.72157 0.72549 0.72549 0.72549 0.72549 0.72941 0.72941 0.72941 0.72941 0.73333 0.73333 0.73333 0.73333 0.73725 0.73725 0.73725 0.73725 0.74118 0.74118 0.74118 0.74118 0.74510 0.74510 0.74510 0.74510 0.74902 0.74902 0.74902 0.74902 0.75294 0.75294 0.75294 0.75294 0.75686 0.75686 0.75686 0.75686 0.76078 0.76078 0.76078 0.76078 0.76471 0.76471 0.76471 0.76471 0.76863 0.76863 0.76863 0.76863 0.77255 0.77255 0.77255 0.77255 0.77647 0.77647 0.77647 0.77647 0.78039 0.78039 0.78039 0.78039 0.78431 0.78431 0.78431 0.78431 0.78824 0.78824 0.78824 0.78824 0.79216 0.79216 0.79216 0.79216 0.79608 0.79608 0.79608 0.79608 0.80000 0.80000 0.80000 0.80000 0.80392 0.80392 0.80392 0.80392 0.80784 0.80784 0.80784 0.80784 0.81176 0.81176 0.81176 0.81176 0.81569 0.81569 0.81569 0.81569 0.81961 0.81961 0.81961 0.81961 0.82353 0.82353 0.82353 0.82353 0.82745 0.82745 0.82745 0.82745 0.83137 0.83137 0.83137 0.83137 0.83529 0.83529 0.83529 0.83529 0.83922 0.83922 0.83922 0.83922 0.84314 0.84314 0.84314 0.84314 0.84706 0.84706 0.84706 0.84706 0.85098 0.85098 0.85098 0.85098 0.85490 0.85490 0.85490 0.85490 0.85882 0.85882 0.85882 0.85882 0.86275 0.86275 0.86275 0.86275 0.86667 0.86667 0.86667 0.86667 0.87059 0.87059 0.87059 0.87059 0.87451 0.87451 0.87451 0.87451 0.87843 0.87843 0.87843 0.87843 0.88235 0.88235 0.88235 0.88235 0.88627 0.88627 0.88627 0.88627 0.89020 0.89020 0.89020 0.89020 0.89412 0.89412 0.89412 0.89412 0.89804 0.89804 0.89804 0.89804 0.90196 0.90196 0.90196 0.90196 0.90588 0.90588 0.90588 0.90588 0.90980 0.90980 0.90980 0.90980 0.91373 0.91373 0.91373 0.91373 0.91765 0.91765 0.91765 0.91765 0.92157 0.92157 0.92157 0.92157 0.92549 0.92549 0.92549 0.92549 0.92941 0.92941 0.92941 0.92941 0.93333 0.93333 0.93333 0.93333 0.93725 0.93725 0.93725 0.93725 0.94118 0.94118 0.94118 0.94118 0.94510 0.94510 0.94510 0.94510 0.94902 0.94902 0.94902 0.94902 0.95294 0.95294 0.95294 0.95294 0.95686 0.95686 0.95686 0.95686 0.96078 0.96078 0.96078 0.96078 0.96471 0.96471 0.96471 0.96471 0.96863 0.96863 0.96863 0.96863 0.97255 0.97255 0.97255 0.97255 0.97647 0.97647 0.97647 0.97647 0.98039 0.98039 0.98039 0.98039 0.98431 0.98431 0.98431 0.98431 0.98824 0.98824 0.98824 0.98824 0.99216 0.99216 0.99216 0.99216 0.99608 0.99608 0.99608 0.99608 1.00000 1.00000 1.00000 1.00000 END_DATA sf32%D3֮? e wDisplayCAL-3.1.0.0/DisplayCAL/presets/video_resolve.icc0000644000076500000000000035402412647526507022457 0ustar devwheel00000000000000argl mntrRGB XYZ ;/acspMSFT-arglgw3G|desc,cprt/wtptbkptvcgtrXYZgXYZ0bXYZDrTRCXgTRCXbTRCXtarghartsׄ,dmddװbdesc'DisplayCAL calibration preset: ResolvetextCreated with DisplayCAL and Argyll CMSXYZ QXYZ vcgt  !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~  !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~  !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~XYZ o8XYZ bXYZ $curv3textCTI3 DESCRIPTOR "Argyll Calibration Target chart information 3" ORIGINATOR "Argyll dispread" CREATED "Sat Mar 14 19:00:55 2009" KEYWORD "DEVICE_CLASS" DEVICE_CLASS "DISPLAY" KEYWORD "APPROX_WHITE_POINT" APPROX_WHITE_POINT "95.045781 100.000003 108.905751" KEYWORD "DARK_REGION_EMPHASIS" DARK_REGION_EMPHASIS "1.6" KEYWORD "ACCURATE_EXPECTED_VALUES" ACCURATE_EXPECTED_VALUES "true" KEYWORD "COLOR_REP" COLOR_REP "RGB_XYZ" KEYWORD "BLACK_COLOR_PATCHES" BLACK_COLOR_PATCHES "4" KEYWORD "COMP_GREY_STEPS" COMP_GREY_STEPS "97" KEYWORD "SINGLE_DIM_STEPS" SINGLE_DIM_STEPS "33" KEYWORD "WHITE_COLOR_PATCHES" WHITE_COLOR_PATCHES "4" KEYWORD "USE_BLACK_POINT_COMPENSATION" USE_BLACK_POINT_COMPENSATION "NO" KEYWORD "MIN_DISPLAY_UPDATE_DELAY_MS" MIN_DISPLAY_UPDATE_DELAY_MS "600" KEYWORD "HIRES_B2A" HIRES_B2A "NO" KEYWORD "AUTO_OPTIMIZE" AUTO_OPTIMIZE "9" KEYWORD "3DLUT_SOURCE_PROFILE" 3DLUT_SOURCE_PROFILE "ref/Rec709.icm" KEYWORD "3DLUT_GAMMA" 3DLUT_GAMMA "-2.4" KEYWORD "3DLUT_DEGREE_OF_BLACK_OUTPUT_OFFSET" 3DLUT_DEGREE_OF_BLACK_OUTPUT_OFFSET "0.0" KEYWORD "3DLUT_INPUT_ENCODING" 3DLUT_INPUT_ENCODING "n" KEYWORD "3DLUT_OUTPUT_ENCODING" 3DLUT_OUTPUT_ENCODING "n" KEYWORD "3DLUT_GAMUT_MAPPING_MODE" 3DLUT_GAMUT_MAPPING_MODE "G" KEYWORD "3DLUT_RENDERING_INTENT" 3DLUT_RENDERING_INTENT "aw" KEYWORD "3DLUT_FORMAT" 3DLUT_FORMAT "cube" KEYWORD "3DLUT_SIZE" 3DLUT_SIZE "65" BEGIN_ARGYLL_COLPROF_ARGS -qh -bl -ax -M "Resolve" END_ARGYLL_COLPROF_ARGS NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT SAMPLE_ID RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 1399 BEGIN_DATA 1 100.0000000 100.0000000 100.0000000 95.04580000 100.0000000 108.9060000 2 36.18660000 40.25050000 29.03860000 10.43240000 12.41520000 8.082730000 3 75.62240000 56.57030000 28.01850000 33.62140000 32.37170000 10.24120000 4 82.79480000 56.83720000 43.69100000 40.46860000 35.84890000 20.10110000 5 19.47590000 14.15960000 0.000000000 1.614820000 1.553530000 0.214771000 6 20.94060000 9.655240000 0.000000000 1.533610000 1.101250000 0.131754000 7 21.64610000 0.000000000 9.880980000 1.535610000 0.778814000 0.651906000 8 64.49270000 50.86790000 23.72350000 24.56660000 24.58230000 7.448250000 9 78.94490000 73.49390000 36.37540000 44.63550000 49.75270000 17.48580000 10 0.000000000 15.10070000 0.000000000 0.559497000 1.119080000 0.186522000 11 0.000000000 9.493670000 0.000000000 0.201613000 0.403256000 0.067212600 12 11.29030000 0.000000000 0.000000000 0.340406000 0.175489000 0.015935900 13 13.15790000 0.000000000 0.000000000 0.476651000 0.245728000 0.022314200 14 13.21410000 8.186610000 0.000000000 0.626698000 0.539183000 0.071050300 15 6.646220000 6.646220000 6.646220000 0.244634000 0.257385000 0.280307000 16 9.493670000 9.493670000 9.493670000 0.535904000 0.563838000 0.614052000 17 15.10070000 0.000000000 0.000000000 0.645261000 0.332651000 0.030207600 18 17.12330000 0.000000000 0.000000000 0.850733000 0.438578000 0.039826700 19 19.23080000 0.000000000 0.000000000 1.098130000 0.566119000 0.051408600 20 21.42860000 0.000000000 0.000000000 1.393190000 0.718230000 0.065221500 21 23.72260000 0.000000000 0.000000000 1.742400000 0.898261000 0.081569800 22 26.11940000 0.000000000 0.000000000 2.153160000 1.110020000 0.100799000 23 28.62600000 0.000000000 0.000000000 2.633900000 1.357850000 0.123305000 24 31.25000000 0.000000000 0.000000000 3.194240000 1.646720000 0.149537000 25 34.00000000 0.000000000 0.000000000 3.845230000 1.982330000 0.180013000 26 36.88520000 0.000000000 0.000000000 4.599570000 2.371210000 0.215327000 27 39.91600000 0.000000000 0.000000000 5.471880000 2.820920000 0.256164000 28 43.10340000 0.000000000 0.000000000 6.479100000 3.340170000 0.303316000 29 46.46020000 0.000000000 0.000000000 7.640830000 3.939070000 0.357702000 30 50.00000000 0.000000000 0.000000000 8.979910000 4.629410000 0.420390000 31 53.73830000 0.000000000 0.000000000 10.52300000 5.424900000 0.492628000 32 57.69230000 0.000000000 0.000000000 12.30120000 6.341650000 0.575877000 33 61.88120000 0.000000000 0.000000000 14.35140000 7.398570000 0.671854000 34 66.32650000 0.000000000 0.000000000 16.71680000 8.618020000 0.782591000 35 71.05260000 0.000000000 0.000000000 19.44890000 10.02650000 0.910491000 36 76.08700000 0.000000000 0.000000000 22.60880000 11.65550000 1.058420000 37 81.46070000 0.000000000 0.000000000 26.26990000 13.54290000 1.229810000 38 87.20930000 0.000000000 0.000000000 30.52020000 15.73410000 1.428790000 39 93.37350000 0.000000000 0.000000000 35.46650000 18.28400000 1.660350000 40 100.0000000 0.000000000 0.000000000 41.23850000 21.25960000 1.930560000 41 13.02300000 15.75260000 0.000000000 1.079970000 1.468310000 0.226506000 42 10.68380000 10.68380000 10.68380000 0.694840000 0.731058000 0.796164000 43 4.491020000 0.000000000 0.000000000 0.044824300 0.023108300 0.002098430 44 7.201650000 7.201650000 7.201650000 0.291861000 0.307074000 0.334421000 45 0.000000000 1.445090000 0.000000000 0.003210470 0.006421420 0.001070290 46 0.000000000 2.941180000 0.000000000 0.015321700 0.030645700 0.005107870 47 0.000000000 4.491020000 0.000000000 0.038866600 0.077738900 0.012957100 48 7.763980000 7.763980000 7.763980000 0.344338000 0.362287000 0.394551000 49 0.000000000 13.15790000 0.000000000 0.413298000 0.826656000 0.137783000 50 0.000000000 17.12330000 0.000000000 0.737658000 1.475430000 0.245916000 51 0.000000000 19.23080000 0.000000000 0.952175000 1.904490000 0.317431000 52 0.000000000 21.42860000 0.000000000 1.208020000 2.416210000 0.402721000 53 0.000000000 23.72260000 0.000000000 1.510810000 3.021850000 0.503667000 54 0.000000000 26.11940000 0.000000000 1.866980000 3.734230000 0.622403000 55 0.000000000 28.62600000 0.000000000 2.283820000 4.567970000 0.761366000 56 0.000000000 31.25000000 0.000000000 2.769680000 5.539770000 0.923340000 57 0.000000000 34.00000000 0.000000000 3.334140000 6.668780000 1.111520000 58 0.000000000 36.88520000 0.000000000 3.988220000 7.977030000 1.329570000 59 0.000000000 39.91600000 0.000000000 4.744590000 9.489890000 1.581730000 60 0.000000000 43.10340000 0.000000000 5.617940000 11.23670000 1.872880000 61 0.000000000 46.46020000 0.000000000 6.625260000 13.25150000 2.208690000 62 0.000000000 50.00000000 0.000000000 7.786350000 15.57390000 2.595770000 63 0.000000000 53.73830000 0.000000000 9.124320000 18.25000000 3.041810000 64 0.000000000 57.69230000 0.000000000 10.66620000 21.33400000 3.555850000 65 0.000000000 61.88120000 0.000000000 12.44390000 24.88960000 4.148480000 66 0.000000000 66.32650000 0.000000000 14.49490000 28.99200000 4.832240000 67 0.000000000 71.05260000 0.000000000 16.86390000 33.73020000 5.621980000 68 0.000000000 76.08700000 0.000000000 19.60380000 39.21050000 6.535400000 69 0.000000000 81.46070000 0.000000000 22.77820000 45.55980000 7.593680000 70 0.000000000 87.20930000 0.000000000 26.46360000 52.93120000 8.822290000 71 0.000000000 93.37350000 0.000000000 30.75250000 61.50950000 10.25210000 72 0.000000000 100.0000000 0.000000000 35.75730000 71.51990000 11.92060000 73 28.34880000 100.0000000 70.37100000 46.66960000 76.18290000 55.93060000 74 67.98480000 100.0000000 74.26580000 62.78950000 84.37210000 62.15630000 75 83.59200000 100.0000000 74.15010000 72.91270000 89.59460000 62.46250000 76 100.0000000 100.0000000 79.29620000 87.83280000 97.11460000 70.92110000 77 9.863630000 9.892620000 0.000000000 0.473628000 0.571849000 0.085421100 78 0.000000000 0.000000000 2.941180000 0.007734280 0.003093910 0.040730200 79 0.000000000 0.000000000 4.491020000 0.019619500 0.007848320 0.103320000 80 0.000000000 0.000000000 6.097560000 0.038438800 0.015376500 0.202426000 81 0.000000000 0.000000000 13.15790000 0.208629000 0.083457100 1.098680000 82 0.000000000 0.000000000 17.12330000 0.372364000 0.148955000 1.960940000 83 0.000000000 0.000000000 19.23080000 0.480650000 0.192272000 2.531190000 84 0.000000000 0.000000000 21.42860000 0.609797000 0.243934000 3.211300000 85 0.000000000 0.000000000 23.72260000 0.762647000 0.305078000 4.016240000 86 0.000000000 0.000000000 26.11940000 0.942436000 0.376999000 4.963040000 87 0.000000000 0.000000000 28.62600000 1.152850000 0.461170000 6.071130000 88 0.000000000 0.000000000 31.25000000 1.398110000 0.559281000 7.362710000 89 0.000000000 0.000000000 34.00000000 1.683050000 0.673263000 8.863250000 90 0.000000000 0.000000000 36.88520000 2.013220000 0.805340000 10.60200000 91 0.000000000 0.000000000 39.91600000 2.395030000 0.958075000 12.61270000 92 0.000000000 0.000000000 43.10340000 2.835890000 1.134430000 14.93430000 93 0.000000000 0.000000000 46.46020000 3.344380000 1.337840000 17.61210000 94 0.000000000 0.000000000 50.00000000 3.930490000 1.572300000 20.69870000 95 0.000000000 0.000000000 53.73830000 4.605880000 1.842470000 24.25540000 96 0.000000000 0.000000000 66.32650000 7.316920000 2.926960000 38.53230000 97 0.000000000 0.000000000 71.05260000 8.512740000 3.405320000 44.82970000 98 0.000000000 0.000000000 76.08700000 9.895840000 3.958590000 52.11330000 99 0.000000000 0.000000000 81.46070000 11.49830000 4.599600000 60.55200000 100 0.000000000 0.000000000 87.20930000 13.35860000 5.343790000 70.34900000 101 0.000000000 0.000000000 93.37350000 15.52360000 6.209840000 81.75010000 102 0.000000000 0.000000000 100.0000000 18.05000000 7.220460000 95.05460000 103 55.83310000 0.000000000 79.89610000 22.46440000 10.30840000 58.55950000 104 65.71360000 65.46360000 80.69580000 41.72460000 41.11790000 64.77050000 105 0.000000000 16.36620000 11.20940000 0.814484000 1.394420000 0.994951000 106 11.90480000 11.90480000 11.90480000 0.881537000 0.927487000 1.010090000 107 7.763980000 0.000000000 0.000000000 0.149401000 0.077020800 0.006994160 108 0.000000000 7.763980000 0.000000000 0.129544000 0.259107000 0.043186600 109 0.000000000 0.000000000 7.763980000 0.065392700 0.026158800 0.344370000 110 0.000000000 6.097560000 0.000000000 0.076147800 0.152307000 0.025385700 111 6.097560000 0.000000000 0.000000000 0.087820400 0.045274000 0.004111270 112 0.000000000 0.000000000 1.445090000 0.001620620 0.000648290 0.008534490 113 0.476190000 0.476190000 0.476190000 0.000742788 0.000781505 0.000851104 114 0.957854000 0.957854000 0.957854000 0.003454370 0.003634430 0.003958100 115 1.445090000 1.445090000 1.445090000 0.008533690 0.008978510 0.009778110 116 9.493670000 0.000000000 0.000000000 0.232518000 0.119870000 0.010885200 117 1.937980000 1.937980000 1.937980000 0.016272000 0.017120200 0.018644900 118 0.000000000 0.000000000 9.493670000 0.101773000 0.040711700 0.535954000 119 2.436650000 2.436650000 2.436650000 0.026923800 0.028327200 0.030850000 120 2.941180000 2.941180000 2.941180000 0.040726400 0.042849200 0.046665300 121 3.451680000 3.451680000 3.451680000 0.057908400 0.060926800 0.066352800 122 3.968250000 3.968250000 3.968250000 0.078694900 0.082796800 0.090170500 123 4.491020000 4.491020000 4.491020000 0.103310000 0.108695000 0.118376000 124 5.020080000 5.020080000 5.020080000 0.131981000 0.138860000 0.151227000 125 0.000000000 0.000000000 11.29030000 0.148995000 0.059601800 0.784634000 126 5.555560000 5.555560000 5.555560000 0.164935000 0.173533000 0.188987000 127 6.097560000 6.097560000 6.097560000 0.202407000 0.212957000 0.231923000 128 8.333330000 8.333330000 8.333330000 0.402325000 0.423296000 0.460994000 129 12.52720000 12.52720000 12.52720000 0.986096000 1.037500000 1.129890000 130 13.15790000 13.15790000 13.15790000 1.098580000 1.155840000 1.258780000 131 13.79690000 13.79690000 13.79690000 1.219340000 1.282900000 1.397150000 132 14.44440000 14.44440000 14.44440000 1.348750000 1.419050000 1.545430000 133 15.76580000 15.76580000 15.76580000 1.635060000 1.720280000 1.873490000 134 16.43990000 16.43990000 16.43990000 1.792770000 1.886220000 2.054200000 135 17.12330000 17.12330000 17.12330000 1.960760000 2.062960000 2.246680000 136 17.81610000 17.81610000 17.81610000 2.139470000 2.250990000 2.451450000 137 18.51850000 18.51850000 18.51850000 2.329370000 2.450790000 2.669050000 138 19.23080000 19.23080000 19.23080000 2.530960000 2.662880000 2.900030000 139 19.95310000 19.95310000 19.95310000 2.744730000 2.887800000 3.144980000 140 20.68560000 20.68560000 20.68560000 2.971230000 3.126100000 3.404510000 141 21.42860000 21.42860000 21.42860000 3.211000000 3.378370000 3.679240000 142 22.18230000 22.18230000 22.18230000 3.464630000 3.645220000 3.969850000 143 23.72260000 23.72260000 23.72260000 4.015870000 4.225190000 4.601480000 144 24.50980000 24.50980000 24.50980000 4.314770000 4.539670000 4.943970000 145 25.30860000 25.30860000 25.30860000 4.630100000 4.871440000 5.305280000 146 26.11940000 26.11940000 26.11940000 4.962580000 5.221250000 5.686240000 147 26.94240000 26.94240000 26.94240000 5.312950000 5.589890000 6.087710000 148 27.77780000 27.77780000 27.77780000 5.682010000 5.978180000 6.510580000 149 28.62600000 28.62600000 28.62600000 6.070570000 6.386990000 6.955800000 150 29.48720000 29.48720000 29.48720000 6.479480000 6.817220000 7.424350000 151 30.36180000 30.36180000 30.36180000 6.909660000 7.269820000 7.917250000 152 31.25000000 31.25000000 31.25000000 7.362030000 7.745770000 8.435590000 153 32.15220000 32.15220000 32.15220000 7.837590000 8.246120000 8.980490000 154 33.06880000 33.06880000 33.06880000 8.337360000 8.771940000 9.553140000 155 34.00000000 34.00000000 34.00000000 8.862420000 9.324370000 10.15480000 156 34.94620000 34.94620000 34.94620000 9.413920000 9.904620000 10.78670000 157 35.90790000 35.90790000 35.90790000 9.993030000 10.51390000 11.45030000 158 36.88520000 36.88520000 36.88520000 10.60100000 11.15360000 12.14690000 159 37.87880000 37.87880000 37.87880000 11.23920000 11.82500000 12.87810000 160 38.88890000 38.88890000 38.88890000 11.90880000 12.52960000 13.64540000 161 39.91600000 39.91600000 39.91600000 12.61150000 13.26890000 14.45060000 162 40.96050000 40.96050000 40.96050000 13.34870000 14.04450000 15.29520000 163 42.02280000 42.02280000 42.02280000 14.12190000 14.85800000 16.18120000 164 43.10340000 43.10340000 43.10340000 14.93290000 15.71130000 17.11050000 165 44.20290000 44.20290000 44.20290000 15.78340000 16.60610000 18.08500000 166 45.32160000 45.32160000 45.32160000 16.67530000 17.54450000 19.10700000 167 46.46020000 46.46020000 46.46020000 17.61050000 18.52840000 20.17850000 168 47.61900000 47.61900000 47.61900000 18.59100000 19.56000000 21.30200000 169 48.79880000 48.79880000 48.79880000 19.61900000 20.64160000 22.47990000 170 50.00000000 50.00000000 50.00000000 20.69670000 21.77560000 23.71480000 171 51.22320000 51.22320000 51.22320000 21.82670000 22.96440000 25.00950000 172 52.46910000 52.46910000 52.46910000 23.01130000 24.21070000 26.36680000 173 53.73830000 53.73830000 53.73830000 24.25320000 25.51740000 27.78990000 174 55.03140000 55.03140000 55.03140000 25.55520000 26.88730000 29.28180000 175 56.34920000 56.34920000 56.34920000 26.92030000 28.32360000 30.84600000 176 57.69230000 57.69230000 57.69230000 28.35170000 29.82950000 32.48600000 177 59.06150000 59.06150000 59.06150000 29.85250000 31.40860000 34.20580000 178 60.45750000 60.45750000 60.45750000 31.42640000 33.06450000 36.00910000 179 61.88120000 61.88120000 61.88120000 33.07690000 34.80100000 37.90030000 180 63.33330000 63.33330000 63.33330000 34.80800000 36.62230000 39.88380000 181 64.81480000 64.81480000 64.81480000 36.62380000 38.53280000 41.96440000 182 66.32650000 66.32650000 66.32650000 38.52870000 40.53700000 44.14710000 183 67.86940000 67.86940000 67.86940000 40.52730000 42.63970000 46.43710000 184 69.44440000 69.44440000 69.44440000 42.62450000 44.84630000 48.84020000 185 71.05260000 71.05260000 71.05260000 44.82550000 47.16200000 51.36210000 186 72.69500000 72.69500000 72.69500000 47.13590000 49.59280000 54.00940000 187 74.37280000 74.37280000 74.37280000 49.56140000 52.14480000 56.78870000 188 76.08700000 76.08700000 76.08700000 52.10840000 54.82460000 59.70710000 189 77.83880000 77.83880000 77.83880000 54.78350000 57.63910000 62.77220000 190 79.62960000 79.62960000 79.62960000 57.59360000 60.59570000 65.99220000 191 81.46070000 81.46070000 81.46070000 60.54640000 63.70230000 69.37550000 192 83.33330000 83.33330000 83.33330000 63.64960000 66.96740000 72.93130000 193 85.24900000 85.24900000 85.24900000 66.91200000 70.39970000 76.66940000 194 87.20930000 87.20930000 87.20930000 70.34240000 74.00900000 80.60010000 195 89.21570000 89.21570000 89.21570000 73.95070000 77.80530000 84.73450000 196 91.26980000 91.26980000 91.26980000 77.74700000 81.79960000 89.08440000 197 100.0000000 100.0000000 91.96320000 92.00840000 98.78500000 92.91030000 198 100.0000000 81.60980000 76.74380000 74.19320000 71.03720000 62.66260000 199 100.0000000 84.45000000 86.88810000 79.14620000 75.87800000 79.93090000 200 10.94810000 0.000000000 9.601720000 0.422464000 0.205741000 0.564354000 201 0.000000000 0.000000000 15.10070000 0.282430000 0.112979000 1.487330000 202 0.000000000 10.33340000 22.67520000 0.933476000 0.762126000 3.717550000 203 29.91970000 0.000000000 42.70670000 5.681600000 2.608070000 14.76950000 204 44.35130000 0.000000000 67.30290000 14.45470000 6.579090000 40.11370000 205 49.52420000 69.01080000 78.69820000 35.26760000 40.43180000 61.81220000 206 23.75210000 70.09500000 0.000000000 18.11520000 33.63920000 5.538480000 207 53.09250000 71.70330000 0.000000000 27.45220000 39.69580000 6.215520000 208 100.0000000 85.42810000 33.11380000 68.11600000 72.47760000 18.72450000 209 100.0000000 91.35830000 69.54470000 78.67070000 83.13580000 54.46620000 210 46.72430000 20.89060000 43.02070000 11.70290000 7.402950000 15.61430000 211 66.90700000 19.55090000 51.63590000 22.24650000 12.44730000 23.34420000 212 0.000000000 0.000000000 57.69230000 5.384230000 2.153830000 28.35430000 213 0.000000000 45.59070000 80.88170000 17.67500000 17.24030000 61.72840000 214 0.000000000 62.98100000 84.26860000 25.32340000 30.82840000 69.54960000 215 0.000000000 45.08500000 59.05490000 11.86950000 14.67140000 31.91550000 216 0.000000000 64.62960000 71.11170000 22.22020000 30.79730000 49.47620000 217 0.000000000 52.38060000 57.51790000 13.97350000 19.39080000 31.04160000 218 0.000000000 69.86820000 68.43220000 24.08930000 35.64120000 46.69180000 219 0.000000000 70.48080000 100.0000000 34.61680000 40.35660000 100.5780000 220 0.000000000 79.35790000 100.0000000 39.55510000 50.23390000 102.2240000 221 0.000000000 88.78420000 100.0000000 45.57600000 62.27660000 104.2310000 222 0.000000000 41.38020000 31.03300000 6.512640000 10.82310000 8.962870000 223 0.000000000 58.32010000 30.07070000 12.20790000 22.36190000 10.40700000 224 47.77500000 37.97340000 0.000000000 12.37600000 12.69220000 1.797710000 225 61.25000000 46.87190000 0.000000000 20.78650000 20.74470000 2.908840000 226 70.64520000 60.11200000 0.000000000 30.87940000 33.25200000 4.791160000 227 83.29470000 84.23340000 0.000000000 52.10640000 63.26250000 9.465270000 228 65.23390000 68.26600000 0.000000000 31.56060000 39.19800000 5.902970000 229 68.39920000 78.31160000 14.21970000 39.02120000 51.09640000 9.103550000 230 74.32500000 100.0000000 38.72730000 59.47160000 83.48650000 24.72720000 231 79.58850000 100.0000000 84.97470000 73.33500000 89.43500000 79.53460000 232 0.000000000 18.62310000 21.20980000 1.483450000 2.013140000 3.435440000 233 0.000000000 25.31750000 31.72670000 3.188680000 4.064940000 8.193120000 234 0.000000000 34.90900000 45.97710000 6.801720000 8.374630000 18.38980000 235 68.27620000 43.77400000 49.31960000 27.44230000 22.33530000 22.85580000 236 76.82380000 70.03830000 53.78700000 44.04710000 46.43160000 30.83190000 237 0.000000000 32.92980000 28.79140000 4.275250000 6.682900000 7.184590000 238 0.000000000 73.75240000 63.54720000 24.96480000 39.27720000 41.17270000 239 0.000000000 100.0000000 77.27440000 45.99600000 75.61560000 65.83920000 240 0.000000000 100.0000000 88.30430000 49.48760000 77.01240000 84.22670000 241 0.000000000 100.0000000 100.0000000 53.80730000 78.74040000 106.9750000 242 0.000000000 39.39160000 61.53190000 10.81250000 11.69960000 34.20710000 243 0.000000000 44.09460000 100.0000000 23.95600000 19.03330000 97.02350000 244 0.000000000 52.35390000 100.0000000 26.66540000 24.45240000 97.92680000 245 0.000000000 61.07990000 100.0000000 30.14230000 31.40680000 99.08590000 246 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 247 41.54630000 0.000000000 12.81390000 6.172290000 3.159260000 1.316250000 248 70.31060000 0.000000000 23.65710000 19.76310000 10.10090000 4.881600000 249 84.78780000 0.000000000 47.23920000 32.15640000 16.17690000 19.61110000 250 100.0000000 0.000000000 52.92420000 45.69230000 23.04130000 25.38520000 251 100.0000000 0.000000000 63.08060000 47.79090000 23.88080000 36.43710000 252 100.0000000 0.000000000 86.90030000 54.49320000 26.56190000 71.73250000 253 68.22890000 19.45920000 60.43860000 24.73070000 13.51140000 32.56630000 254 48.72460000 0.000000000 34.30220000 10.20000000 5.060170000 9.434580000 255 53.83400000 0.000000000 45.04880000 13.68920000 6.696250000 16.95140000 256 67.68530000 0.000000000 45.44390000 20.66480000 10.28540000 17.59420000 257 81.86040000 0.000000000 57.65320000 31.93040000 15.84010000 29.55520000 258 85.37840000 0.000000000 88.42760000 42.90120000 20.52610000 73.89210000 259 35.12170000 51.67870000 44.44730000 15.53660000 20.08960000 18.96210000 260 35.46710000 50.54140000 54.26730000 16.89880000 20.00510000 27.63910000 261 35.06590000 58.32980000 61.56210000 21.25310000 26.46190000 36.54150000 262 37.98160000 74.68580000 93.19550000 39.18280000 46.35280000 87.91110000 263 64.46880000 83.77100000 100.0000000 57.97760000 63.76650000 103.8650000 264 78.79220000 83.70940000 100.0000000 66.64850000 68.17850000 104.2600000 265 100.0000000 91.11700000 100.0000000 88.43020000 86.76780000 106.7000000 266 24.52780000 0.000000000 30.82510000 3.231760000 1.509370000 7.232100000 267 26.78640000 0.000000000 70.09100000 10.53740000 4.478100000 43.61270000 268 32.26250000 0.000000000 100.0000000 21.47630000 8.986810000 95.21500000 269 41.60570000 26.46420000 100.0000000 25.96590000 14.15420000 95.97590000 270 43.49310000 55.64040000 100.0000000 34.50830000 30.32830000 98.64760000 271 49.41410000 69.26280000 100.0000000 42.74380000 43.62120000 100.7790000 272 87.38650000 68.53030000 100.0000000 64.28200000 54.17770000 101.6820000 273 100.0000000 70.32150000 100.0000000 75.77310000 61.45180000 102.4810000 274 57.05340000 10.24880000 17.93840000 12.65460000 6.830390000 2.813580000 275 81.57000000 0.000000000 14.12310000 26.59130000 13.68040000 2.517210000 276 100.0000000 100.0000000 53.18250000 81.49750000 94.58040000 37.55820000 277 23.05960000 26.79320000 0.000000000 3.611640000 4.793350000 0.734901000 278 34.13740000 29.37270000 0.000000000 6.296380000 6.834130000 0.987346000 279 32.55640000 80.25540000 32.30620000 27.04300000 46.49410000 15.43350000 280 58.17970000 100.0000000 36.82360000 50.29410000 78.78240000 23.07030000 281 83.54270000 100.0000000 54.40440000 68.25880000 87.72880000 38.14210000 282 89.27070000 100.0000000 66.01880000 75.12900000 90.98060000 51.56490000 283 66.72690000 72.46480000 50.02420000 38.48400000 45.52900000 27.38440000 284 100.0000000 87.27330000 56.80130000 72.94790000 76.35770000 38.16730000 285 57.75510000 51.51830000 31.22700000 22.04240000 23.54810000 10.70030000 286 100.0000000 53.93300000 31.98570000 51.90720000 40.24400000 12.74600000 287 100.0000000 64.63140000 35.47410000 56.77890000 49.38620000 16.22570000 288 100.0000000 67.54200000 48.16870000 59.94480000 52.88140000 26.02760000 289 50.82600000 34.81090000 23.64250000 13.57790000 12.12570000 5.592940000 290 74.50760000 34.78060000 23.70110000 25.85550000 18.44470000 6.187360000 291 74.80590000 60.99490000 100.0000000 51.88550000 42.56120000 100.0930000 292 75.51760000 71.74190000 100.0000000 57.51420000 53.13900000 101.8380000 293 0.000000000 70.77200000 33.60510000 18.35810000 34.09410000 14.21170000 294 0.000000000 85.54980000 37.24240000 27.42510000 51.56380000 19.28640000 295 0.000000000 100.0000000 38.83460000 38.01200000 72.42180000 23.79400000 296 0.000000000 100.0000000 53.37790000 40.29550000 73.33530000 35.81970000 297 0.000000000 23.42150000 12.51660000 1.655870000 3.012900000 1.474050000 298 0.000000000 33.74690000 14.29130000 3.530000000 6.660170000 2.411030000 299 76.51200000 42.82270000 64.60180000 35.33030000 25.63780000 39.28060000 300 90.95650000 61.21350000 65.16050000 52.66620000 44.37710000 42.67610000 301 35.83790000 17.90660000 19.48910000 5.626100000 4.051600000 3.080030000 302 51.74140000 23.38280000 26.49130000 12.11790000 8.307800000 6.060970000 303 86.42750000 51.87350000 84.87650000 50.94940000 37.34610000 70.49200000 304 100.0000000 57.73610000 100.0000000 69.97250000 49.84980000 100.5470000 305 0.000000000 45.49680000 16.16890000 6.655130000 12.78600000 3.837800000 306 15.40400000 54.88520000 32.03670000 11.70890000 20.05580000 10.99450000 307 25.43920000 100.0000000 91.44970000 52.61790000 78.49930000 90.10720000 308 33.60700000 100.0000000 100.0000000 57.55550000 80.67260000 107.1510000 309 0.000000000 35.99710000 66.56310000 11.15450000 10.51070000 40.09540000 310 0.000000000 37.62620000 83.49760000 16.30660000 13.19000000 65.32080000 311 25.70480000 0.000000000 22.66030000 2.768260000 1.347470000 3.728610000 312 100.0000000 0.000000000 25.12220000 42.10360000 21.60570000 6.486400000 313 100.0000000 0.000000000 34.27690000 42.95180000 21.94500000 10.95330000 314 100.0000000 0.000000000 43.47890000 44.12900000 22.41590000 17.15240000 315 16.94390000 0.000000000 19.64370000 1.334900000 0.630008000 2.691180000 316 15.27790000 8.502690000 21.40190000 1.428370000 0.901001000 3.286270000 317 11.55950000 25.56510000 33.91570000 3.813350000 4.416590000 9.425510000 318 0.000000000 53.56840000 44.48770000 12.10100000 19.33940000 19.03010000 319 0.000000000 65.37960000 51.20780000 18.18600000 29.74650000 26.49600000 320 0.000000000 82.14170000 58.76390000 28.80570000 48.64440000 37.25950000 321 0.000000000 100.0000000 65.27270000 42.82100000 74.34550000 49.11920000 322 17.92590000 21.10810000 13.36620000 2.325500000 2.908900000 1.570930000 323 24.55140000 17.89220000 17.91850000 3.103020000 2.758380000 2.525640000 324 32.26720000 35.31460000 82.87670000 18.99400000 13.79320000 64.25970000 325 20.95070000 32.28680000 39.12180000 6.593070000 7.552180000 13.12150000 326 37.29560000 37.04950000 52.32510000 13.08390000 12.22260000 24.43800000 327 46.70300000 100.0000000 79.55160000 54.40020000 79.87020000 69.75730000 328 56.97890000 100.0000000 100.0000000 65.77650000 84.91080000 107.5360000 329 0.000000000 43.67700000 24.89290000 6.631510000 11.90730000 6.393010000 330 0.000000000 70.38840000 45.80690000 19.76090000 34.33750000 22.57910000 331 49.68160000 69.57050000 48.97210000 28.70950000 38.26910000 25.55620000 332 100.0000000 70.42320000 68.15070000 65.54230000 57.44310000 48.34500000 333 53.40590000 35.08430000 32.46350000 15.47310000 13.10500000 9.683100000 334 71.03330000 33.87260000 31.11420000 24.12880000 17.18840000 9.304860000 335 100.0000000 53.27580000 42.16010000 52.89220000 40.24650000 19.14000000 336 100.0000000 77.17180000 53.54310000 66.03140000 63.53800000 32.73470000 337 100.0000000 21.12680000 0.000000000 42.40940000 23.60170000 2.320910000 338 100.0000000 21.04540000 18.88240000 42.86120000 23.76660000 4.749060000 339 100.0000000 21.68090000 40.48210000 44.94840000 24.72710000 15.35320000 340 100.0000000 19.02560000 51.30270000 46.32770000 24.78350000 24.14390000 341 51.58180000 24.09540000 0.000000000 11.18010000 8.084860000 0.971428000 342 71.14940000 23.40830000 0.000000000 20.97430000 12.99100000 1.402330000 343 84.52920000 36.02010000 0.000000000 32.28080000 22.26150000 2.595950000 344 100.0000000 36.08740000 0.000000000 45.03940000 28.86210000 3.197710000 345 100.0000000 73.56880000 0.000000000 59.44360000 57.67260000 7.999690000 346 100.0000000 86.17350000 0.000000000 67.01580000 72.81800000 10.52400000 347 15.10070000 15.10070000 15.10070000 1.487190000 1.564710000 1.704060000 348 10.08490000 10.08490000 10.08490000 0.612056000 0.643959000 0.701309000 349 0.000000000 11.29030000 0.000000000 0.295161000 0.590365000 0.098399100 350 11.29030000 11.29030000 11.29030000 0.784561000 0.825456000 0.898969000 351 40.36230000 32.79050000 25.84320000 9.606860000 9.417190000 6.137270000 352 47.73890000 38.56910000 47.42830000 16.01010000 14.38120000 20.27580000 353 47.51700000 39.87250000 62.61730000 19.20860000 16.18500000 35.90530000 354 59.89720000 62.95070000 100.0000000 44.33070000 39.95280000 99.98780000 355 65.58440000 75.65990000 100.0000000 53.72090000 54.35600000 102.2730000 356 100.0000000 80.84430000 100.0000000 81.68940000 73.28520000 104.4530000 357 45.74350000 22.67340000 29.48030000 9.981640000 7.034360000 7.278390000 358 53.92080000 28.84010000 42.45540000 15.66620000 11.20620000 15.71520000 359 75.30950000 29.37450000 44.14200000 27.50940000 17.42540000 17.57770000 360 38.12510000 41.34480000 22.11150000 10.72600000 13.06440000 5.381190000 361 37.85270000 75.21170000 41.88290000 26.64260000 41.80040000 20.61920000 362 44.94770000 100.0000000 44.47740000 45.90030000 76.39790000 28.25450000 363 27.82910000 42.06700000 60.86510000 13.85740000 14.35010000 33.78830000 364 45.53960000 54.98260000 60.91670000 22.97550000 25.38920000 35.49780000 365 50.84600000 73.25150000 74.56890000 36.81720000 44.65890000 56.30190000 366 58.24590000 83.01470000 75.60540000 46.06580000 57.87310000 59.89470000 367 41.79670000 60.83140000 53.76490000 22.65020000 28.93640000 28.56060000 368 52.81550000 100.0000000 57.36450000 51.20410000 78.86900000 40.39600000 369 52.66790000 100.0000000 69.15840000 53.84640000 79.91880000 54.63510000 370 63.00490000 100.0000000 83.41090000 62.80050000 84.06240000 76.40560000 371 28.23840000 0.000000000 17.02260000 2.923680000 1.464790000 2.055330000 372 44.93150000 13.47710000 100.0000000 25.58450000 11.75150000 95.53220000 373 56.74050000 24.06330000 100.0000000 31.46820000 16.45240000 96.12950000 374 70.66040000 33.59710000 100.0000000 40.51140000 23.62180000 97.03690000 375 86.98590000 44.71320000 100.0000000 54.48830000 35.04640000 98.50550000 376 23.51830000 10.56320000 76.16640000 11.88310000 5.358990000 52.39810000 377 38.74230000 20.56940000 76.20250000 16.15720000 8.821790000 52.89550000 378 59.54810000 39.57380000 75.90410000 27.68750000 20.04860000 54.00770000 379 72.45280000 58.73980000 76.83110000 41.50840000 36.70560000 57.89050000 380 93.37350000 93.37350000 93.37350000 81.74250000 86.00330000 93.66260000 381 95.52850000 95.52850000 95.52850000 85.94890000 90.42900000 98.48230000 382 97.73660000 97.73660000 97.73660000 90.37880000 95.08980000 103.5580000 383 0.000000000 15.57160000 35.87560000 2.492600000 1.954910000 10.17380000 384 0.000000000 19.86960000 35.08170000 2.826180000 2.767670000 9.836340000 385 27.00260000 20.61760000 50.36790000 7.420640000 5.011740000 21.51350000 386 26.97610000 29.77110000 61.05270000 10.89920000 8.610580000 33.05190000 387 41.67990000 28.86190000 62.91330000 14.85750000 10.35940000 35.36250000 388 45.94140000 77.64390000 71.80230000 36.66280000 48.32450000 53.05850000 389 47.79290000 80.80180000 83.00370000 42.48890000 53.73860000 70.94300000 390 46.83360000 84.04540000 100.0000000 50.22460000 60.02910000 103.5520000 391 0.000000000 21.06240000 64.94430000 8.148840000 5.120820000 37.17600000 392 0.000000000 29.32450000 67.53760000 10.02210000 7.862490000 40.89930000 393 0.000000000 48.99920000 72.75430000 16.41530000 18.48380000 49.70770000 394 100.0000000 49.20250000 74.82600000 58.29300000 40.10810000 54.66890000 395 100.0000000 64.00690000 80.14890000 65.73690000 52.50670000 64.82720000 396 57.06540000 42.30960000 47.42200000 20.90060000 18.37720000 20.78400000 397 62.55650000 48.61410000 48.63840000 25.71670000 23.69730000 22.60750000 398 22.94690000 22.94690000 22.94690000 3.732700000 3.927270000 4.277020000 399 25.02750000 20.22760000 23.59470000 3.777880000 3.440350000 4.415270000 400 25.09310000 20.96920000 34.81140000 4.895900000 4.029210000 9.811340000 401 100.0000000 37.77550000 37.72810000 47.55720000 30.51260000 14.47380000 402 100.0000000 39.36850000 47.13230000 49.29280000 31.84640000 21.64230000 403 100.0000000 46.32630000 60.42730000 53.78340000 36.81210000 35.52010000 404 100.0000000 60.04890000 63.27230000 59.48270000 47.19590000 40.55120000 405 58.97390000 17.19250000 0.000000000 13.65450000 8.144180000 0.852494000 406 82.86290000 20.24720000 0.000000000 28.34100000 16.19380000 1.632350000 407 100.0000000 56.66120000 18.74620000 51.94430000 41.94590000 7.741180000 408 100.0000000 77.13630000 20.41770000 61.99010000 61.88860000 11.55330000 409 100.0000000 100.0000000 21.17330000 77.58970000 93.01710000 16.97890000 410 10.24510000 0.000000000 17.23850000 0.652821000 0.292900000 2.002950000 411 0.000000000 12.12380000 19.33590000 0.831656000 0.885062000 2.676800000 412 0.000000000 0.000000000 61.88120000 6.281580000 2.512790000 33.08000000 413 42.03990000 0.000000000 85.33520000 18.86810000 8.256090000 67.35420000 414 57.02950000 0.000000000 100.0000000 30.04260000 13.40300000 95.61610000 415 78.47000000 0.000000000 100.0000000 42.24540000 19.69390000 96.18730000 416 100.0000000 0.000000000 100.0000000 59.28850000 28.48010000 96.98520000 417 100.0000000 24.20990000 100.0000000 60.86840000 31.64020000 97.51190000 418 37.22360000 0.000000000 35.69940000 6.566480000 3.168800000 10.08650000 419 46.36570000 0.000000000 50.64270000 11.64910000 5.538560000 21.64440000 420 57.03430000 0.000000000 64.07960000 18.77760000 8.896980000 36.28130000 421 100.0000000 0.000000000 74.74930000 50.75570000 25.06680000 52.05020000 422 100.0000000 36.75840000 74.33500000 54.59820000 32.93740000 52.76080000 423 100.0000000 41.64100000 86.47080000 59.55680000 36.91970000 72.71190000 424 100.0000000 42.18430000 100.0000000 64.64630000 39.19660000 98.77130000 425 63.15820000 0.000000000 28.23930000 16.12970000 8.186080000 6.594990000 426 74.75620000 0.000000000 36.88390000 23.76130000 12.01720000 11.61930000 427 85.46240000 0.000000000 35.39810000 31.03080000 15.78490000 11.05120000 428 0.000000000 17.76410000 50.28520000 4.779700000 3.191680000 21.22580000 429 0.000000000 17.81970000 86.07750000 13.78560000 6.803070000 68.62520000 430 0.000000000 16.51100000 100.0000000 18.73090000 8.582350000 95.28160000 431 0.000000000 35.62870000 100.0000000 21.74550000 14.61200000 96.28660000 432 41.47440000 38.77230000 100.0000000 28.45350000 19.19150000 96.81710000 433 47.94840000 48.96450000 100.0000000 33.67560000 26.31570000 97.91700000 434 62.63830000 53.19290000 100.0000000 41.71230000 32.66470000 98.71900000 435 19.99000000 35.89980000 32.71870000 6.500080000 8.750990000 9.453920000 436 25.64450000 100.0000000 45.32760000 40.99300000 73.85320000 28.69900000 437 66.12700000 100.0000000 50.96560000 56.46310000 81.72080000 34.28600000 438 44.36640000 53.42320000 28.54190000 17.05640000 22.03280000 9.357920000 439 48.49150000 65.47570000 33.87810000 24.15380000 33.17620000 13.88350000 440 59.17360000 73.79380000 78.23160000 41.85410000 47.57180000 62.11740000 441 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 442 2.941180000 0.000000000 0.000000000 0.017670400 0.009109590 0.000827230 443 8.909850000 8.909850000 8.909850000 0.466089000 0.490383000 0.534056000 444 44.40240000 84.74530000 0.000000000 31.76340000 53.26340000 8.607160000 445 44.03720000 100.0000000 0.000000000 42.54910000 75.02130000 12.23850000 446 73.93760000 100.0000000 0.000000000 56.98530000 82.46350000 12.91430000 447 86.67970000 100.0000000 0.000000000 65.87140000 87.04460000 13.33030000 448 100.0000000 100.0000000 0.000000000 76.99580000 92.77950000 13.85110000 449 100.0000000 100.0000000 66.02370000 84.23940000 95.67720000 51.99760000 450 35.78880000 15.73370000 0.000000000 4.916600000 3.443800000 0.405651000 451 41.69810000 25.61310000 0.000000000 7.811900000 6.682220000 0.878167000 452 55.59570000 34.65640000 0.000000000 14.81680000 12.80100000 1.690110000 453 84.58290000 47.60900000 0.000000000 35.52610000 28.69350000 3.666440000 454 100.0000000 50.03240000 0.000000000 49.03590000 36.85570000 4.530040000 455 100.0000000 62.38890000 0.000000000 53.90800000 46.60060000 6.154260000 456 19.76820000 43.91870000 0.000000000 7.021040000 12.31090000 2.006290000 457 26.64670000 64.35390000 39.42340000 18.14420000 29.22160000 16.90000000 458 24.80520000 66.87960000 100.0000000 34.73410000 37.73770000 100.0660000 459 44.74760000 92.09100000 100.0000000 54.91630000 70.51410000 105.3290000 460 78.54690000 92.35400000 100.0000000 72.31640000 79.76290000 106.1970000 461 89.83530000 91.55390000 100.0000000 80.07780000 82.91950000 106.3980000 462 89.83820000 100.0000000 100.0000000 86.38750000 95.53640000 108.5000000 463 100.0000000 100.0000000 100.0000000 95.04580000 100.0000000 108.9060000 464 30.61980000 36.57930000 0.000000000 6.970120000 9.406820000 1.448420000 465 32.22310000 46.29290000 0.000000000 9.989990000 14.90840000 2.351210000 466 48.54030000 50.96630000 11.69310000 16.69550000 20.64520000 3.948760000 467 48.08970000 56.97300000 0.000000000 18.61860000 25.00270000 3.844950000 468 57.42180000 57.83970000 11.96540000 23.07030000 27.79820000 5.037330000 469 83.20730000 73.44680000 0.000000000 45.66340000 50.47010000 7.335580000 470 52.45290000 47.03090000 18.35860000 17.21690000 18.92930000 5.021450000 471 55.73800000 49.73010000 38.12780000 21.26300000 22.13460000 14.50220000 472 60.26610000 53.12200000 54.81130000 27.24680000 26.69770000 28.93280000 473 11.27770000 6.767730000 15.84690000 0.749378000 0.492244000 1.701600000 474 0.000000000 8.603320000 12.70520000 0.355521000 0.402004000 1.071380000 475 0.000000000 10.11480000 40.20410000 2.664990000 1.436910000 12.89110000 476 0.000000000 12.55950000 55.24120000 5.267010000 2.703920000 25.89670000 477 21.39250000 33.55170000 87.90110000 18.21900000 12.63000000 72.72660000 478 26.32970000 47.19720000 100.0000000 27.10010000 22.06840000 97.44370000 479 50.08370000 55.35810000 68.38280000 26.57820000 27.25830000 44.87740000 480 85.07940000 54.25090000 68.95970000 46.19270000 36.72490000 46.43600000 481 100.0000000 92.72810000 91.14350000 86.24540000 87.72640000 89.54530000 482 100.0000000 100.0000000 100.0000000 95.04580000 100.0000000 108.9060000 483 11.28200000 27.83220000 24.77960000 3.326090000 4.805010000 5.151920000 484 0.000000000 26.38200000 38.65840000 4.140730000 4.710250000 12.39150000 485 0.000000000 24.79990000 51.26250000 5.817880000 4.992810000 22.42090000 486 13.04630000 27.16830000 63.48920000 9.149820000 6.971790000 35.70050000 487 0.000000000 44.00680000 41.68240000 8.514450000 12.81490000 15.83310000 488 29.05200000 83.18820000 46.05850000 29.85610000 50.42700000 25.35870000 489 46.75420000 87.43330000 52.95160000 38.81980000 59.00840000 32.71630000 490 47.64710000 87.38550000 82.90270000 46.60870000 62.11100000 72.17410000 491 0.000000000 31.64850000 21.24880000 3.446540000 5.935760000 4.101780000 492 0.000000000 58.77640000 18.51730000 11.55430000 22.40260000 6.033710000 493 45.54840000 71.56150000 15.20880000 24.73240000 38.14960000 7.564200000 494 49.77640000 91.76190000 17.57810000 38.88360000 63.94070000 12.36050000 495 23.13920000 56.89240000 0.000000000 11.99320000 21.53930000 3.525550000 496 24.88550000 100.0000000 0.000000000 37.69310000 72.51780000 12.01120000 497 74.45340000 100.0000000 22.42230000 57.98600000 82.90160000 16.47760000 498 87.13760000 100.0000000 24.13940000 67.01480000 87.54250000 17.51980000 499 28.24970000 33.96910000 28.37460000 7.016560000 8.426690000 7.183570000 500 40.83400000 32.94620000 31.87820000 10.32420000 9.772500000 8.998580000 501 100.0000000 32.93960000 52.07860000 48.64700000 29.19920000 25.60570000 502 100.0000000 37.20870000 63.52700000 51.95890000 32.05350000 38.33160000 503 100.0000000 57.13860000 69.88230000 59.88830000 45.42910000 48.63360000 504 38.55020000 21.43610000 36.89510000 8.291930000 5.836890000 11.24850000 505 59.73370000 26.33850000 35.94760000 17.08280000 11.41010000 11.27390000 506 64.42260000 24.89420000 42.18150000 20.06360000 12.52490000 15.53480000 507 20.40940000 12.95690000 10.43770000 1.776510000 1.494530000 0.851985000 508 18.15310000 19.76930000 4.327400000 1.997210000 2.529660000 0.477815000 509 15.82200000 24.03100000 26.11490000 3.211410000 3.854370000 5.512790000 510 16.84860000 68.86050000 37.15060000 18.60700000 32.72530000 16.05640000 511 36.11830000 69.92240000 52.33110000 25.01620000 36.56360000 28.51330000 512 84.02830000 79.77710000 57.78090000 55.28350000 60.17520000 37.01970000 513 100.0000000 82.61000000 67.17900000 72.25480000 71.25550000 49.39170000 514 61.04100000 71.12810000 25.12030000 31.69460000 41.33450000 10.84220000 515 68.58690000 87.43940000 23.39920000 45.35280000 62.81200000 13.61280000 516 88.46170000 89.84230000 41.40930000 62.34150000 73.78330000 24.56680000 517 87.92100000 100.0000000 42.21950000 69.53750000 88.62160000 27.64420000 518 62.40780000 74.11230000 38.27490000 35.30750000 45.41860000 18.35300000 519 64.63950000 92.82480000 40.04880000 48.56500000 69.82570000 23.56470000 520 72.65580000 94.01150000 54.77130000 56.44640000 74.88960000 36.65570000 521 19.65700000 30.38680000 9.637400000 3.861770000 5.844960000 1.476080000 522 18.01450000 32.87220000 0.000000000 4.046900000 6.682290000 1.076570000 523 81.31420000 41.81490000 18.22190000 31.84820000 24.17140000 5.225230000 524 86.69920000 59.27730000 20.18930000 41.98520000 38.39070000 8.001700000 525 100.0000000 67.48680000 21.58350000 56.91640000 51.62650000 10.21320000 526 20.86420000 17.95120000 9.943050000 2.244810000 2.359220000 0.927664000 527 22.75300000 20.64220000 0.000000000 2.702270000 3.044970000 0.445348000 528 32.28610000 31.02060000 9.641560000 6.262250000 7.262050000 1.623650000 529 33.81240000 45.31770000 13.41980000 10.28880000 14.59090000 3.416180000 530 32.64550000 53.64630000 9.055120000 12.69810000 20.03080000 3.678000000 531 16.38040000 5.029340000 10.35840000 0.944802000 0.546849000 0.701951000 532 17.12060000 0.000000000 13.06010000 1.055670000 0.520523000 1.120610000 533 16.12000000 7.635410000 15.99720000 1.190450000 0.762066000 1.764980000 534 14.83030000 12.22600000 17.37040000 1.356050000 1.176750000 2.169970000 535 20.51510000 0.000000000 55.24110000 6.159820000 2.610300000 25.83150000 536 74.18930000 22.33360000 77.55190000 33.03000000 17.80030000 55.78780000 537 85.03970000 22.49630000 90.64660000 44.76360000 23.39290000 78.39140000 538 36.66110000 0.000000000 25.40800000 5.425220000 2.694420000 4.883080000 539 83.11890000 0.000000000 23.41580000 28.20140000 14.45310000 5.188420000 540 91.53260000 45.31090000 27.02380000 41.23270000 30.44820000 9.028370000 541 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 542 0.000000000 53.78440000 36.34230000 11.09020000 19.06390000 13.30940000 543 38.99700000 65.36770000 40.87710000 21.76040000 31.76790000 18.21350000 544 52.79210000 66.72470000 56.35360000 29.92000000 36.63860000 32.29750000 545 52.71670000 57.01310000 51.25340000 24.63050000 27.64650000 25.79370000 546 60.92910000 59.45420000 51.23240000 29.41270000 31.60250000 26.28570000 547 67.88940000 63.26750000 59.15770000 36.35020000 37.47930000 35.14170000 548 76.06570000 70.33510000 61.42700000 45.26720000 47.10640000 39.10400000 549 36.00080000 22.01870000 17.04370000 6.011450000 4.960370000 2.572590000 550 43.59980000 36.13760000 17.68790000 10.85680000 11.21110000 3.688030000 551 45.43090000 43.84860000 33.04630000 14.68820000 16.05050000 10.61100000 552 46.88420000 78.69230000 33.58550000 30.54370000 46.89790000 16.02990000 553 17.18100000 93.68350000 15.55630000 32.13600000 62.52190000 11.95500000 554 17.97250000 92.65330000 55.58420000 36.14050000 62.94330000 36.24890000 555 21.30290000 92.87220000 100.0000000 49.81580000 68.71500000 105.2500000 556 24.17560000 49.33120000 53.00780000 13.84480000 17.84360000 26.14120000 557 69.11040000 57.15880000 54.24930000 33.45210000 32.21730000 29.10610000 558 72.34530000 56.41780000 59.02930000 36.05290000 33.00840000 34.15220000 559 35.10160000 49.96010000 34.99290000 13.69030000 18.39010000 12.22680000 560 42.17870000 49.53100000 33.34740000 15.41680000 19.08410000 11.32510000 561 53.43340000 59.86010000 42.54300000 24.71510000 29.59650000 18.85340000 562 74.57350000 63.26860000 55.49540000 39.64090000 39.26270000 31.40230000 563 86.98430000 70.00270000 56.86280000 51.88340000 50.37500000 34.32700000 564 94.08190000 73.57610000 72.48340000 63.16430000 58.56940000 54.59760000 565 21.01220000 12.04690000 17.42020000 2.061480000 1.523470000 2.212440000 566 67.23400000 0.000000000 13.82860000 17.45670000 8.972560000 2.031960000 567 100.0000000 0.000000000 14.56500000 41.49930000 21.36400000 3.304320000 568 100.0000000 45.15130000 18.09440000 47.88060000 33.87210000 6.218590000 569 100.0000000 89.28010000 19.59460000 69.60460000 77.19470000 13.85780000 570 100.0000000 100.0000000 38.09140000 79.15660000 93.64390000 25.23050000 571 16.27190000 17.98520000 22.17040000 2.239440000 2.298630000 3.770440000 572 14.01670000 45.18920000 62.41860000 13.18320000 15.31070000 35.81880000 573 18.99200000 51.11520000 73.09580000 18.30220000 20.52320000 50.48850000 574 19.29350000 57.83830000 92.59640000 27.07260000 28.11990000 83.88880000 575 47.13690000 59.24230000 91.46800000 34.02980000 32.61580000 82.26460000 576 46.88860000 75.85580000 100.0000000 45.31970000 50.18880000 101.9110000 577 13.27060000 40.50610000 24.58790000 6.211070000 10.38160000 6.001820000 578 11.90310000 47.30160000 23.21880000 8.001850000 14.27320000 6.146540000 579 0.000000000 71.81600000 21.39940000 17.87280000 34.77550000 8.957360000 580 9.889460000 25.83390000 9.706380000 2.183620000 3.818930000 1.182160000 581 66.03030000 25.08600000 9.544040000 18.36440000 11.99180000 1.886680000 582 68.38000000 33.12260000 0.000000000 21.02410000 15.51190000 1.886280000 583 81.43930000 38.47530000 43.58590000 33.53690000 23.45050000 17.99240000 584 91.13970000 43.87750000 61.26930000 45.61520000 31.47960000 35.88670000 585 33.51640000 46.49130000 23.12900000 11.08230000 15.48040000 6.184890000 586 41.62470000 65.55930000 22.50950000 20.80860000 31.62480000 8.569430000 587 39.09880000 29.02660000 9.436070000 7.683660000 7.445380000 1.558600000 588 47.65710000 35.45630000 10.02090000 11.85140000 11.52470000 2.200800000 589 72.18710000 56.16390000 12.81340000 30.38980000 30.57140000 5.331130000 590 80.37700000 58.44370000 65.95180000 43.70790000 37.99040000 42.90780000 591 88.99580000 66.08200000 77.95220000 56.72700000 49.38430000 61.25130000 592 91.78460000 73.08740000 89.61560000 66.27960000 59.17130000 82.26950000 593 24.47440000 46.03020000 28.64020000 9.511440000 14.40700000 8.329140000 594 22.24320000 69.76370000 29.14370000 18.90990000 33.65850000 11.78620000 595 74.92220000 89.93040000 46.43160000 53.50810000 69.23410000 28.05050000 596 82.95900000 88.94490000 59.03810000 60.64430000 71.63820000 40.32250000 597 100.0000000 91.52230000 81.48580000 82.17210000 84.72180000 72.33400000 598 45.03450000 20.66470000 52.65840000 12.65480000 7.670970000 23.90220000 599 53.72920000 24.35500000 81.69030000 23.68950000 13.25290000 61.95400000 600 27.83380000 8.828420000 31.77830000 4.098730000 2.200590000 7.812470000 601 40.60120000 8.930590000 44.13610000 8.844300000 4.476090000 16.05720000 602 57.20970000 7.029410000 56.08440000 17.23990000 8.457820000 27.24550000 603 67.41690000 10.07980000 66.29390000 24.86620000 12.31650000 39.37840000 604 83.71920000 0.000000000 70.83600000 36.35410000 17.76490000 45.83560000 605 78.52330000 20.52290000 61.06100000 31.43010000 17.12950000 33.62400000 606 100.0000000 21.23380000 62.69100000 48.88630000 26.21350000 36.36480000 607 85.00120000 20.52480000 42.07850000 32.63490000 18.14490000 15.88120000 608 91.13290000 64.17060000 53.73370000 51.70560000 46.13490000 30.31840000 609 100.0000000 73.08180000 61.08780000 65.28550000 59.58720000 40.06610000 610 26.15040000 14.93200000 9.012800000 2.795420000 2.241010000 0.761094000 611 28.26600000 12.03120000 0.000000000 2.901060000 1.999520000 0.233081000 612 43.58280000 13.49900000 0.000000000 7.075830000 4.296910000 0.456543000 613 43.09630000 43.43380000 81.19570000 23.60600000 19.33270000 62.32750000 614 60.56650000 83.41310000 83.83020000 49.93220000 59.95210000 73.13390000 615 60.93400000 83.22900000 90.50130000 52.24530000 60.71250000 84.93190000 616 73.41490000 90.51630000 92.78380000 64.92900000 74.34410000 91.17210000 617 72.72810000 100.0000000 92.15440000 71.31040000 88.10660000 92.30020000 618 24.05490000 40.86220000 44.31740000 9.806520000 12.12370000 17.62450000 619 34.20180000 39.96800000 61.33950000 14.81510000 13.99010000 34.21510000 620 50.52100000 45.41190000 60.22910000 21.40660000 19.70660000 33.69940000 621 54.01600000 47.19750000 77.55110000 27.82110000 23.33320000 57.12900000 622 20.08960000 19.16670000 27.73920000 3.229870000 2.944120000 6.036910000 623 17.10040000 79.29850000 27.88650000 23.40630000 43.81530000 12.92870000 624 47.49680000 79.54390000 56.12300000 34.70430000 49.39740000 34.26750000 625 49.89310000 81.19930000 65.98360000 38.78950000 52.74040000 46.05410000 626 72.75430000 42.32810000 32.11090000 27.37040000 21.95290000 10.57490000 627 82.87780000 46.15940000 30.98950000 35.18930000 27.67900000 10.68310000 628 65.25250000 35.72640000 21.69030000 20.47140000 16.00090000 5.292600000 629 72.08460000 41.91780000 20.33430000 25.90260000 21.13510000 5.562930000 630 82.65980000 65.20770000 30.75010000 42.43990000 42.45230000 13.03090000 631 85.57390000 80.61410000 49.40870000 55.36550000 61.14920000 28.95590000 632 9.743040000 18.03620000 16.55700000 1.418900000 1.919200000 2.108330000 633 0.000000000 23.28540000 20.45090000 2.000530000 3.120840000 3.381330000 634 0.000000000 57.74660000 55.13530000 15.56170000 23.32770000 29.22700000 635 0.000000000 57.39860000 71.30380000 19.12620000 24.52770000 48.69510000 636 0.000000000 72.90340000 85.56570000 30.65620000 40.81750000 73.41520000 637 0.000000000 82.17610000 86.25440000 36.25960000 51.66040000 76.40720000 638 43.25030000 90.55320000 92.11920000 50.34300000 66.89050000 89.24350000 639 64.01310000 92.11460000 100.0000000 63.35930000 74.89160000 105.7290000 640 37.18560000 29.46270000 52.97830000 11.57940000 9.066310000 24.53770000 641 53.80240000 31.14780000 77.38360000 23.57090000 15.04760000 55.49690000 642 57.91760000 38.96520000 100.0000000 34.95670000 22.61660000 97.13550000 643 17.27420000 0.000000000 39.70910000 3.235130000 1.394310000 12.51000000 644 22.49960000 9.290780000 40.04310000 4.155040000 2.148900000 12.83790000 645 26.37300000 50.72010000 39.38780000 12.56040000 18.13560000 15.03020000 646 28.82490000 54.96190000 52.78630000 16.69010000 22.32640000 26.64180000 647 39.54670000 56.26410000 55.18790000 20.33880000 24.90710000 29.33380000 648 43.21670000 57.96170000 73.49440000 26.46210000 28.58120000 52.18530000 649 0.000000000 12.92710000 12.89570000 0.597116000 0.874942000 1.183630000 650 56.85900000 33.03400000 9.660840000 15.14900000 12.44340000 2.157920000 651 69.44780000 42.66730000 0.000000000 23.98960000 20.52330000 2.697330000 652 79.21360000 54.23070000 0.000000000 34.01170000 31.35460000 4.259880000 653 86.49030000 64.75280000 0.000000000 43.71890000 42.95090000 5.986690000 654 92.79830000 65.60920000 11.23070000 49.28740000 46.40300000 7.131530000 655 29.17280000 18.80550000 0.000000000 3.652300000 3.228650000 0.430743000 656 28.51560000 37.41760000 51.03910000 10.83990000 11.22380000 23.15090000 657 36.41860000 49.54730000 58.91270000 17.74260000 19.82650000 32.44390000 658 65.21250000 52.54370000 65.49630000 31.90670000 28.51950000 41.12850000 659 73.16400000 64.87650000 65.76840000 41.73200000 41.18280000 43.39670000 660 59.45370000 27.83610000 22.47730000 15.96720000 11.34160000 4.898290000 661 75.84910000 71.31640000 19.93170000 39.97560000 45.78980000 9.457690000 662 83.17420000 71.03910000 26.41190000 45.32310000 48.27970000 11.99310000 663 34.87770000 0.000000000 55.46690000 9.004920000 4.071940000 26.19480000 664 34.53240000 9.466650000 64.63450000 11.09190000 5.217230000 36.65660000 665 50.89930000 12.50310000 82.43510000 21.51130000 10.27490000 62.71680000 666 69.01010000 16.04420000 100.0000000 36.92980000 17.90260000 96.12170000 667 0.000000000 9.480420000 28.66380000 1.357200000 0.864532000 6.155810000 668 9.978890000 18.24330000 31.29340000 2.509790000 2.390770000 7.680040000 669 10.13370000 18.70570000 45.06590000 4.291940000 3.181490000 16.78180000 670 27.04720000 16.36700000 65.57660000 10.12910000 5.389160000 37.91210000 671 45.82180000 36.82510000 79.19860000 22.19350000 16.09280000 58.58740000 672 58.23390000 50.20080000 90.00280000 34.72970000 27.91250000 78.60670000 673 0.000000000 84.93780000 21.55530000 25.58920000 50.19360000 11.57800000 674 0.000000000 100.0000000 21.82760000 36.39240000 71.77390000 15.26480000 675 25.66410000 100.0000000 27.61850000 38.89430000 73.01400000 17.62870000 676 80.52120000 31.17720000 31.83290000 29.81980000 19.29570000 9.785600000 677 91.70420000 31.54770000 37.10210000 38.95430000 24.04510000 13.27810000 678 90.23710000 34.52550000 63.04480000 42.89190000 26.47590000 37.15320000 679 91.56160000 46.34520000 78.42920000 51.13790000 34.92380000 59.49360000 680 91.24330000 100.0000000 82.22860000 81.20660000 93.59460000 75.31320000 681 31.82140000 38.19640000 36.47830000 9.595450000 11.11360000 11.93780000 682 30.55530000 38.20240000 41.25570000 9.923680000 11.21440000 15.14100000 683 30.25970000 89.50930000 67.57440000 38.62180000 60.63340000 49.62600000 684 48.70020000 89.08840000 75.88430000 46.04630000 63.77610000 61.45090000 685 67.93730000 92.74280000 78.81670000 58.61360000 73.96210000 67.23910000 686 25.48940000 42.06780000 32.45230000 8.885100000 12.31120000 9.870990000 687 37.70120000 57.75460000 32.00750000 16.99160000 24.46230000 11.55120000 688 54.84670000 60.02530000 34.01680000 24.32900000 29.62550000 13.26790000 689 58.19120000 82.06230000 42.48220000 38.43300000 53.86470000 22.76950000 690 23.85990000 31.32110000 19.31260000 5.033360000 6.671320000 3.565510000 691 28.86210000 37.43070000 19.10200000 7.274590000 9.810820000 3.992810000 692 27.75920000 53.29410000 17.48600000 11.81090000 19.34490000 5.155470000 693 25.62090000 58.69930000 26.11720000 14.08600000 23.60240000 8.752490000 694 83.31550000 70.96980000 65.40290000 51.51870000 50.71220000 44.26190000 695 84.98240000 81.82770000 75.02310000 61.43110000 64.71440000 59.54310000 696 21.85560000 19.64770000 16.07330000 2.777130000 2.876160000 2.107040000 697 19.78060000 23.52310000 36.12960000 4.575010000 4.338060000 10.67930000 698 19.55040000 28.37630000 46.99610000 6.808710000 6.439830000 18.86210000 699 21.27100000 53.84450000 46.30250000 13.85420000 20.36390000 20.60010000 700 32.63660000 75.84370000 49.32390000 26.79500000 42.27290000 26.74210000 701 9.296120000 17.96540000 10.41760000 1.166640000 1.804110000 0.941093000 702 11.62640000 19.93890000 6.612350000 1.440020000 2.267690000 0.602626000 703 36.32110000 81.79470000 15.14410000 27.71460000 48.37750000 9.367210000 704 43.83890000 100.0000000 24.00490000 43.26480000 75.29980000 16.35750000 705 20.14560000 42.31670000 10.09510000 6.727700000 11.46420000 2.468930000 706 27.20660000 84.78290000 0.000000000 27.22650000 50.96050000 8.401720000 707 58.23280000 84.99840000 53.24140000 42.07940000 58.30310000 32.69060000 708 79.22280000 85.91870000 72.24270000 59.14830000 67.49390000 56.19210000 709 43.77480000 27.74120000 35.68380000 10.70640000 8.467620000 10.88170000 710 69.12360000 39.13290000 39.93590000 25.24650000 19.48200000 14.99780000 711 78.84320000 48.09370000 45.08620000 34.72830000 28.15450000 20.01460000 712 41.04650000 25.09110000 26.08910000 8.467680000 6.794180000 5.792550000 713 43.67160000 29.00900000 24.65860000 9.850370000 8.473420000 5.469120000 714 57.24700000 38.03990000 50.98100000 20.46340000 16.41200000 23.59130000 715 63.21830000 37.94490000 60.00190000 25.15640000 18.59240000 33.02990000 716 25.02050000 9.456150000 51.08270000 6.278920000 3.057800000 21.85560000 717 71.57470000 0.000000000 73.98450000 29.06900000 13.91120000 49.92410000 718 74.65340000 11.40000000 81.66340000 33.54540000 16.40590000 61.99940000 719 86.75910000 15.62960000 100.0000000 48.82830000 23.98360000 96.66840000 720 54.72160000 14.51550000 68.32050000 19.27340000 9.795480000 41.80950000 721 100.0000000 21.96480000 74.55020000 51.97560000 27.59570000 52.18220000 722 100.0000000 23.25010000 86.64850000 55.85430000 29.41920000 71.77040000 723 100.0000000 54.99710000 87.10590000 64.16330000 45.79290000 75.29700000 724 13.66940000 22.76260000 0.000000000 1.897950000 3.026630000 0.484189000 725 19.02520000 24.63370000 10.20580000 2.833170000 3.883610000 1.225760000 726 15.39720000 24.68270000 14.63440000 2.585610000 3.749990000 1.969310000 727 56.87270000 24.90190000 10.58300000 13.73030000 9.558990000 1.798990000 728 76.07810000 35.66230000 91.63420000 41.20100000 25.01770000 80.73120000 729 22.20000000 13.94390000 100.0000000 20.02540000 8.935940000 95.28170000 730 84.66790000 31.30690000 100.0000000 49.42910000 27.52570000 97.32050000 731 37.17870000 14.04210000 28.35970000 6.286690000 3.818470000 6.325710000 732 44.66840000 21.22830000 34.86670000 9.969910000 6.691110000 10.09030000 733 58.18100000 24.62320000 46.93670000 17.59160000 11.10850000 19.14520000 734 87.83390000 36.03170000 51.04250000 38.90400000 25.20500000 24.37390000 735 52.78360000 21.37710000 35.49880000 13.16840000 8.358920000 10.61950000 736 71.03220000 20.81890000 47.61840000 24.10080000 13.70000000 19.88000000 737 80.81230000 22.41070000 55.20620000 32.03250000 17.92840000 27.38920000 738 52.50290000 15.07810000 39.55670000 12.90380000 7.209020000 13.01830000 739 89.57760000 10.90290000 45.79520000 35.88600000 18.53190000 18.66910000 740 100.0000000 22.78460000 30.10810000 43.90920000 24.54030000 9.175450000 741 100.0000000 38.96610000 28.14980000 46.84940000 30.70440000 9.281960000 742 100.0000000 76.22370000 39.79890000 63.29940000 61.57720000 21.02330000 743 100.0000000 90.10400000 47.69480000 73.21540000 79.54900000 30.06750000 744 28.89730000 61.73290000 48.87420000 18.80600000 27.64050000 23.94010000 745 34.94950000 72.69240000 60.65610000 27.82840000 39.97680000 37.75940000 746 67.47540000 75.35750000 75.46870000 46.27290000 51.22640000 58.39760000 747 77.72330000 83.28260000 76.74160000 57.68970000 64.07870000 62.18570000 748 58.11440000 65.73460000 80.46930000 37.90470000 39.34750000 64.26630000 749 68.98370000 83.47910000 80.96760000 53.60880000 62.01360000 68.61580000 750 78.24500000 90.83850000 80.48270000 64.18610000 74.77060000 69.74020000 751 39.56340000 46.68410000 46.03820000 15.33980000 17.47000000 19.74560000 752 39.04990000 70.56480000 75.26030000 31.48540000 39.77570000 56.65770000 753 45.53060000 75.69990000 85.26470000 39.40610000 47.62620000 73.74990000 754 88.27200000 80.96840000 100.0000000 71.87070000 68.33580000 104.0150000 755 30.26620000 24.27010000 61.16330000 10.68820000 7.161330000 32.91080000 756 35.56730000 32.07120000 71.66490000 15.85300000 11.52400000 46.86000000 757 20.76450000 10.52910000 30.83470000 2.910730000 1.719600000 7.294480000 758 17.50940000 14.13270000 31.85210000 2.835180000 2.011240000 7.881380000 759 14.56360000 7.749620000 33.65860000 2.371000000 1.223730000 8.739630000 760 11.98030000 21.39490000 55.96370000 6.627490000 4.622250000 26.93900000 761 10.11670000 44.89670000 90.67240000 20.96530000 18.25000000 78.70040000 762 21.24040000 55.85960000 100.0000000 29.35160000 27.79680000 98.43070000 763 0.000000000 28.64560000 82.97680000 14.26140000 9.364850000 63.82070000 764 0.000000000 26.73490000 100.0000000 20.01510000 11.15100000 95.70970000 765 26.01060000 75.66050000 100.0000000 39.54640000 47.04910000 101.6100000 766 61.90840000 10.83850000 14.10080000 14.87800000 8.042550000 2.041760000 767 67.73010000 12.90590000 9.728820000 18.00820000 9.859400000 1.517110000 768 78.12990000 27.79300000 16.50770000 26.44910000 16.77300000 3.644650000 769 89.98800000 51.64230000 21.89920000 41.69930000 33.83460000 7.686240000 770 89.15680000 77.82800000 77.90800000 63.06720000 61.89790000 63.26450000 771 88.69880000 78.68160000 90.87150000 67.40600000 64.39230000 85.52860000 772 36.59070000 27.46250000 35.52590000 8.457470000 7.240860000 10.66820000 773 35.77920000 25.55150000 42.54340000 8.836040000 6.877900000 15.30530000 774 63.92000000 66.76370000 59.89700000 35.96490000 39.69820000 36.41610000 775 75.38760000 77.54730000 59.69330000 48.39860000 54.62740000 38.41380000 776 43.72380000 44.76850000 39.69050000 15.15760000 16.60650000 14.80520000 777 79.41020000 44.54380000 50.71490000 34.93180000 26.50570000 24.53110000 778 87.81460000 51.55460000 62.11090000 45.64970000 35.16720000 37.57790000 779 46.67210000 31.37420000 43.81030000 13.45080000 10.74280000 16.77100000 780 49.12410000 34.57860000 54.79480000 16.90510000 13.29690000 26.87440000 781 68.91670000 46.60100000 69.29490000 32.91220000 25.93830000 45.50160000 782 73.75250000 47.33510000 100.0000000 46.06400000 31.91050000 98.34410000 783 20.41850000 25.08640000 68.22640000 10.74700000 7.177500000 41.62950000 784 21.26710000 54.41540000 68.34850000 18.56580000 22.59270000 44.35390000 785 21.13110000 61.43960000 81.11670000 24.99220000 29.75420000 64.13800000 786 15.39690000 72.79180000 56.53490000 23.60800000 37.97980000 33.07890000 787 30.27220000 100.0000000 58.67940000 44.32470000 75.29110000 41.49220000 788 28.89860000 100.0000000 81.94840000 50.09690000 77.56670000 73.39860000 789 51.18170000 100.0000000 90.58800000 59.73390000 82.20300000 88.84570000 790 18.35740000 43.01520000 76.09580000 16.48250000 15.65690000 54.03750000 791 25.00140000 41.99780000 84.05210000 19.57960000 16.54830000 66.72960000 792 31.41090000 59.00470000 82.87530000 26.37970000 28.85850000 66.77610000 793 29.69900000 73.19840000 86.87520000 34.10650000 42.78230000 75.89360000 794 39.54270000 82.41800000 92.00410000 43.75840000 55.52020000 87.17880000 795 26.35040000 19.46190000 14.34850000 3.425200000 3.187890000 1.757890000 796 30.81660000 24.76470000 8.940710000 4.847440000 4.954090000 1.168310000 797 51.91350000 27.95140000 17.40620000 12.30620000 9.517000000 3.211950000 798 59.66690000 39.56370000 20.68790000 18.46360000 16.36120000 5.143540000 799 67.99170000 59.36080000 20.76020000 29.57890000 32.04300000 7.607500000 800 68.37510000 59.87240000 38.66270000 31.67890000 33.25460000 16.45290000 801 81.27620000 69.01730000 41.95030000 44.63060000 46.18600000 20.56730000 802 100.0000000 71.98380000 77.93080000 69.02310000 60.14230000 62.64690000 803 26.26190000 16.58880000 22.36370000 3.536910000 2.767380000 3.858950000 804 35.04700000 17.66140000 59.01810000 10.56020000 5.962560000 30.26280000 805 58.70750000 48.69180000 68.48470000 27.97840000 24.42190000 44.39070000 806 65.89950000 50.08080000 76.87950000 34.41900000 28.17560000 56.69110000 807 65.21410000 53.50210000 86.43140000 38.24070000 31.61690000 72.74280000 808 27.06650000 27.15410000 22.24110000 5.023910000 5.532500000 4.272110000 809 37.88950000 35.31200000 21.20110000 9.098800000 10.00160000 4.573290000 810 36.49980000 38.63670000 11.15750000 9.056290000 11.20900000 2.447270000 811 42.34130000 42.95490000 0.000000000 11.80530000 14.36340000 2.150350000 812 55.47560000 52.50190000 0.000000000 19.95460000 23.15740000 3.418350000 813 76.55450000 57.38450000 37.53620000 35.54910000 33.73500000 15.60490000 814 87.12530000 56.87610000 100.0000000 58.84270000 43.59710000 99.92650000 815 23.41250000 18.87030000 92.10730000 17.67050000 8.725660000 79.71570000 816 23.75670000 26.55110000 100.0000000 21.73340000 11.99290000 95.78170000 817 23.51790000 36.81240000 100.0000000 23.73040000 16.04420000 96.45850000 818 0.000000000 15.03870000 71.23710000 9.115890000 4.533800000 45.27090000 819 13.13390000 11.44050000 84.40330000 13.21020000 5.825460000 65.59030000 820 23.40030000 0.000000000 86.73630000 14.89060000 6.151900000 69.59180000 821 30.52560000 82.59170000 85.60940000 39.33880000 53.65700000 75.51140000 822 27.57600000 14.73950000 15.45400000 3.253740000 2.430650000 1.855350000 823 46.63490000 10.61360000 10.91830000 8.100220000 4.542420000 1.175460000 824 49.99330000 27.20380000 23.22510000 11.74690000 9.002930000 4.934250000 825 74.24540000 25.05120000 22.42600000 23.80000000 14.72030000 5.119910000 826 81.09320000 42.16010000 36.91330000 33.37760000 24.91850000 13.62130000 827 58.68070000 46.17380000 39.47560000 21.64250000 20.59050000 15.08540000 828 61.35030000 76.09540000 54.40210000 38.42250000 48.37260000 32.11550000 829 66.12540000 76.02670000 62.27190000 42.54430000 50.25070000 40.84250000 830 0.000000000 85.08570000 49.59580000 28.92800000 51.68230000 28.68910000 831 10.53400000 92.01340000 63.15140000 36.63690000 62.33460000 44.53190000 832 40.94710000 28.17990000 18.25800000 8.422650000 7.568070000 3.264580000 833 100.0000000 32.40630000 14.33690000 44.49050000 27.36100000 4.257590000 834 100.0000000 51.60970000 50.96990000 53.68690000 39.59770000 26.30560000 835 100.0000000 62.56750000 53.94140000 58.63220000 48.61830000 30.63830000 836 18.94880000 35.11170000 20.20700000 5.177600000 7.920170000 4.065200000 837 17.37540000 58.69230000 42.45010000 14.69780000 23.70560000 18.17490000 838 16.64260000 62.44560000 53.30420000 18.01840000 27.61340000 28.09620000 839 13.81360000 70.22980000 79.91810000 27.99270000 37.56080000 63.56350000 840 15.82700000 93.62380000 80.69380000 42.91110000 66.74640000 69.65150000 841 12.93780000 97.81400000 94.22920000 50.35820000 74.69900000 94.78330000 842 26.59190000 25.60550000 31.36630000 5.436470000 5.293070000 8.123740000 843 24.85190000 29.32420000 38.23370000 6.516790000 6.683090000 12.36630000 844 27.98710000 31.00830000 45.17150000 8.372880000 7.995640000 17.58060000 845 48.27530000 65.43690000 62.63120000 28.83380000 35.00940000 39.04820000 846 54.54980000 73.88490000 65.79580000 36.44200000 45.24040000 44.49320000 847 16.33650000 21.91510000 18.81660000 2.494450000 3.117250000 2.871850000 848 15.58310000 19.37090000 37.26160000 3.717650000 3.115150000 11.19630000 849 19.94810000 17.08950000 41.13640000 4.483740000 3.106310000 13.77690000 850 36.86440000 16.85320000 40.81180000 7.820990000 4.798990000 13.69610000 851 38.07260000 33.91280000 39.75760000 10.62100000 10.12330000 13.83900000 852 39.76770000 44.39690000 49.58560000 15.28180000 16.33330000 22.57610000 853 38.83820000 49.18550000 67.54300000 20.27760000 20.72380000 42.84850000 854 45.25340000 62.91740000 67.94430000 27.83310000 32.61930000 45.26980000 855 51.62810000 62.67820000 71.13850000 30.97000000 33.98190000 49.66690000 856 80.24220000 68.30650000 74.16220000 50.23060000 47.77250000 55.60280000 857 81.66510000 75.57260000 79.86050000 56.73590000 56.65080000 65.64220000 858 10.00700000 7.606290000 25.23400000 1.258500000 0.731725000 4.654040000 859 13.45270000 0.000000000 27.03560000 1.517120000 0.664693000 5.377400000 860 38.75420000 7.677200000 75.97110000 15.11680000 6.841610000 52.22110000 861 69.57370000 0.000000000 87.00920000 31.86100000 14.89010000 70.86370000 862 89.15070000 60.64520000 93.90100000 59.65530000 46.61130000 88.23750000 863 32.01160000 17.66440000 27.97890000 5.254160000 3.754740000 6.194410000 864 35.44040000 23.09410000 28.69610000 6.795860000 5.483940000 6.775880000 865 34.16380000 27.73180000 30.08020000 7.301540000 6.777710000 7.662140000 866 49.99820000 40.54560000 39.09890000 16.17850000 15.36670000 14.10930000 867 49.09800000 45.13000000 51.54460000 19.04520000 18.56020000 24.60690000 868 58.48090000 61.38060000 68.54810000 32.76440000 34.12970000 46.09620000 869 67.19920000 61.10670000 83.30390000 41.38650000 37.91070000 68.44670000 870 81.04840000 65.72380000 88.63440000 54.02860000 47.34610000 78.85430000 871 100.0000000 68.98770000 90.14730000 71.41160000 58.61930000 82.86600000 872 100.0000000 78.60200000 89.70540000 76.50960000 69.06300000 83.80370000 873 70.05840000 82.47060000 0.000000000 42.25930000 56.53180000 8.684970000 874 80.26920000 86.90470000 14.84610000 51.96510000 65.74540000 11.37800000 875 91.27030000 93.37560000 9.299470000 64.58450000 78.94190000 12.34390000 876 37.87690000 59.84480000 0.000000000 16.43690000 25.63750000 4.082420000 877 38.07400000 70.59150000 0.000000000 21.55600000 35.79320000 5.772930000 878 59.62050000 86.24950000 0.000000000 39.05090000 58.47560000 9.229210000 879 59.82670000 100.0000000 0.000000000 49.08170000 78.38900000 12.54430000 880 60.28770000 100.0000000 22.26230000 49.97170000 78.77120000 16.04750000 881 71.40600000 20.87850000 27.88440000 21.89130000 12.85370000 7.031440000 882 91.39610000 27.18320000 73.93690000 45.16520000 25.23690000 51.19300000 883 92.52880000 33.11210000 82.74820000 49.81210000 28.97500000 65.35290000 884 78.69870000 29.57060000 69.77860000 34.98420000 20.73210000 45.03850000 885 81.84240000 41.34510000 80.89320000 42.99040000 28.46550000 62.57960000 886 86.11180000 63.11320000 82.55100000 54.51660000 46.03040000 68.07050000 887 71.24740000 100.0000000 63.99440000 62.08660000 84.31230000 48.45190000 888 76.71650000 100.0000000 100.0000000 76.82960000 90.60900000 108.0530000 889 100.0000000 100.0000000 100.0000000 95.04580000 100.0000000 108.9060000 890 51.32810000 19.33590000 17.55760000 10.87000000 6.989010000 2.838600000 891 81.60820000 16.98080000 20.05280000 27.62580000 15.25630000 4.251420000 892 86.66620000 21.06800000 29.86020000 32.53250000 18.35310000 8.459000000 893 53.69280000 0.000000000 20.64050000 11.06490000 5.639430000 3.448980000 894 55.57810000 14.96940000 23.91940000 12.65710000 7.250220000 4.803310000 895 56.25500000 22.58510000 53.03060000 17.46690000 10.50120000 24.55530000 896 62.03470000 27.00290000 75.38200000 26.13390000 15.33510000 52.40250000 897 68.26460000 72.44200000 82.96980000 47.37950000 49.16840000 69.74690000 898 71.59770000 81.96390000 94.84990000 58.93590000 62.80530000 93.24300000 899 11.90110000 82.51170000 72.68880000 32.76160000 50.63980000 54.96010000 900 0.000000000 86.28700000 80.73100000 37.12500000 56.21740000 67.98400000 901 0.000000000 87.51640000 71.12470000 35.20080000 56.75490000 53.82050000 902 75.55560000 92.06090000 73.45120000 61.23030000 74.76440000 59.20530000 903 32.67890000 0.000000000 13.41390000 3.741930000 1.903940000 1.311230000 904 31.42690000 8.489940000 9.491790000 3.493550000 2.023380000 0.739693000 905 48.64320000 9.936640000 43.67820000 11.59530000 5.971370000 15.84580000 906 61.68080000 11.11170000 42.85250000 17.33410000 9.035960000 15.50590000 907 65.46480000 0.000000000 57.05460000 21.49710000 10.47550000 28.43000000 908 93.02220000 10.48130000 59.87840000 41.26740000 20.97180000 32.50120000 909 93.75350000 13.28680000 76.87590000 46.32990000 23.34210000 55.12510000 910 13.40800000 8.545560000 12.24210000 0.834796000 0.647289000 1.014090000 911 8.880180000 19.05410000 23.58510000 1.886750000 2.270920000 4.285680000 912 0.000000000 17.69510000 26.94970000 1.802500000 1.989820000 5.580970000 913 24.81140000 22.84260000 83.95160000 15.59910000 8.686830000 65.25230000 914 30.71680000 51.12150000 84.42010000 23.68820000 22.91310000 68.36510000 915 40.28500000 54.58560000 79.73410000 25.99660000 26.15530000 61.17500000 916 46.74080000 67.25990000 84.28570000 35.08350000 38.84610000 70.61190000 917 37.22150000 9.549400000 18.09400000 5.316890000 2.995660000 2.501500000 918 44.34980000 0.000000000 22.65540000 7.587470000 3.831960000 3.952500000 919 44.64790000 9.365870000 29.58430000 8.435780000 4.496260000 6.920110000 920 58.27010000 0.000000000 33.39280000 14.19150000 7.129270000 9.107490000 921 81.20510000 17.10800000 33.76850000 28.48310000 15.58540000 10.19780000 922 81.98150000 52.77930000 32.05990000 36.88970000 31.86710000 11.95980000 923 89.86630000 66.30120000 46.67430000 50.46370000 47.12660000 24.14560000 924 71.80480000 49.42420000 38.28340000 29.68000000 26.31760000 14.96830000 925 72.80000000 57.19000000 46.04260000 34.25800000 32.81600000 21.71450000 926 89.73020000 57.15720000 52.98120000 47.40830000 39.43880000 28.51510000 927 35.62410000 74.25880000 22.28930000 23.50850000 39.63090000 9.896320000 928 44.97320000 92.39710000 32.95750000 38.73460000 64.39960000 18.62740000 929 0.000000000 31.02000000 32.82600000 4.282930000 6.073690000 9.112540000 930 0.000000000 29.98560000 49.46620000 6.367980000 6.594360000 21.05890000 931 14.46500000 32.30160000 56.04380000 8.617480000 8.281460000 27.62350000 932 12.02760000 38.52470000 62.79710000 11.26760000 11.57460000 35.64770000 933 0.000000000 55.52880000 86.75520000 23.01240000 24.89690000 72.81510000 934 61.19670000 73.93140000 86.88590000 45.65760000 49.32900000 76.56730000 935 33.77550000 32.76560000 24.56810000 7.687030000 8.431040000 5.539860000 936 86.36770000 36.53450000 26.05850000 34.71910000 23.58830000 7.638200000 937 43.45890000 18.74320000 19.34640000 7.984100000 5.395780000 3.173640000 938 47.15980000 15.94380000 72.44980000 17.41190000 8.886120000 47.37110000 939 94.25500000 15.18750000 90.21090000 51.16430000 25.55570000 77.66810000 940 60.95530000 7.524820000 92.16520000 29.08950000 13.43360000 80.13180000 941 76.20180000 16.07210000 93.67510000 38.95980000 19.23180000 83.60790000 942 22.33490000 9.448260000 20.95910000 2.306380000 1.418100000 3.196570000 943 32.30040000 21.85040000 21.86000000 5.333180000 4.547830000 3.936380000 944 32.61760000 27.00830000 24.38010000 6.329230000 6.152810000 5.099350000 945 33.02240000 35.27250000 41.87220000 9.881800000 10.15360000 15.38600000 946 41.53290000 33.70110000 48.21500000 12.86970000 11.07030000 20.47800000 947 40.73540000 39.26520000 47.93210000 13.88000000 13.53560000 20.65600000 948 45.27520000 40.15510000 35.15190000 13.83710000 14.06130000 11.47760000 949 60.36090000 40.45710000 41.37790000 21.06680000 17.81680000 15.91630000 950 71.74630000 51.22430000 47.47210000 31.58740000 28.07060000 22.13450000 951 80.33760000 65.64880000 47.62780000 43.18320000 42.89310000 24.51740000 952 69.44660000 48.23470000 27.06170000 26.70850000 24.33250000 8.629660000 953 89.60630000 89.68040000 26.58190000 61.51580000 73.37840000 16.05640000 954 27.80370000 33.42660000 10.07600000 5.798110000 7.743900000 1.797280000 955 45.46640000 48.52940000 20.27950000 15.11780000 18.55650000 5.616640000 956 52.55640000 60.39410000 23.15260000 22.53930000 29.04830000 8.208560000 957 58.87030000 57.08370000 26.57330000 24.25960000 27.86370000 9.230630000 958 68.24330000 68.50640000 27.92560000 34.45280000 40.74090000 11.77090000 959 93.03510000 70.62730000 28.31390000 52.95240000 51.87650000 13.12190000 960 23.60300000 12.99950000 27.39670000 3.172340000 2.111990000 5.727330000 961 29.70780000 9.169240000 27.39500000 4.091180000 2.265520000 5.707790000 962 55.71130000 7.265520000 27.91930000 12.59450000 6.533020000 6.317030000 963 60.99610000 10.64610000 50.03890000 18.10050000 9.261640000 21.47150000 964 60.38670000 31.13590000 61.55480000 22.55660000 14.99040000 34.25010000 965 62.99510000 55.97900000 62.69500000 31.37240000 30.24610000 38.07070000 966 78.23760000 86.51820000 85.25420000 62.75150000 69.48930000 76.72170000 967 86.88270000 93.04920000 93.57230000 76.38380000 82.88440000 93.72430000 968 25.91930000 24.32220000 16.05210000 4.036180000 4.413010000 2.332430000 969 92.52810000 29.44310000 27.67260000 38.26380000 23.20960000 8.072790000 970 93.09680000 43.52290000 36.66390000 42.96140000 30.43840000 14.02530000 971 93.23620000 57.50150000 38.92800000 48.20730000 40.31080000 17.12130000 972 92.89330000 79.14710000 43.76380000 59.37850000 62.01330000 24.21110000 973 39.86480000 56.22260000 22.23530000 16.19570000 23.23460000 7.098300000 974 43.87840000 85.59220000 42.00200000 34.81340000 55.34190000 22.88990000 975 65.09800000 88.15050000 64.29700000 49.97280000 65.20010000 45.77090000 976 16.39050000 31.74530000 44.23610000 6.642200000 7.334070000 16.80300000 977 16.35290000 35.04550000 52.73490000 8.751470000 9.292110000 24.49460000 978 19.52160000 82.20810000 66.22480000 31.66770000 49.98650000 46.20330000 979 33.44030000 81.95220000 70.76190000 35.22530000 51.45260000 52.29560000 980 36.82270000 92.95540000 80.15040000 46.12830000 67.70620000 68.79660000 981 28.94450000 25.93420000 44.86170000 7.633310000 6.306250000 17.04600000 982 30.80460000 25.39280000 74.48080000 14.29190000 8.882270000 50.45440000 983 74.77430000 12.74300000 35.19970000 23.96150000 12.71490000 10.71270000 984 77.02670000 8.900220000 47.26850000 26.87610000 13.71390000 19.43870000 985 88.45840000 15.09600000 52.99420000 36.51570000 19.13910000 25.18350000 986 87.83730000 46.81370000 67.98330000 45.46720000 32.54870000 44.37810000 987 89.14820000 75.39260000 83.46730000 63.37520000 59.79390000 71.78530000 988 29.18910000 40.29660000 68.94290000 15.56060000 14.29420000 43.69810000 989 29.84900000 86.23980000 80.95900000 40.05180000 57.67200000 68.47820000 990 6.238760000 37.03560000 53.02900000 8.589660000 9.885750000 24.90270000 991 10.53270000 37.08830000 75.58680000 14.08220000 12.12610000 52.72230000 992 12.80030000 39.16630000 92.81950000 20.32120000 15.46270000 82.22540000 993 36.46140000 43.17030000 93.22220000 25.58960000 19.77450000 83.54830000 994 34.95320000 60.93350000 92.01980000 31.14790000 32.17920000 83.36760000 995 38.64640000 61.95710000 100.0000000 35.62390000 34.80470000 99.45290000 996 13.54190000 48.60270000 34.92100000 9.608530000 15.60850000 11.86250000 997 9.878450000 51.88920000 48.90410000 12.44530000 18.52570000 22.54220000 998 12.63890000 62.46190000 65.49880000 20.25610000 28.47840000 41.73770000 999 26.64480000 67.43530000 67.79910000 24.96170000 34.30000000 45.55570000 1000 40.60160000 68.59070000 66.61080000 28.67230000 37.09640000 44.36480000 1001 59.29950000 75.19960000 72.09200000 40.96100000 48.46430000 53.26530000 1002 59.92170000 94.23720000 86.50840000 57.87610000 74.91050000 80.19930000 1003 13.33200000 35.75840000 44.56980000 7.268210000 8.924870000 17.33940000 1004 10.54820000 42.87570000 51.78450000 10.09160000 12.95600000 24.22300000 1005 12.50540000 50.40910000 53.14330000 12.84780000 17.87310000 26.33130000 1006 8.450030000 52.51220000 62.34810000 15.23900000 19.99420000 36.53100000 1007 21.68840000 52.28740000 81.25070000 21.45510000 22.49490000 63.14040000 1008 49.88730000 52.09890000 91.87170000 32.43860000 27.64670000 82.14620000 1009 8.821240000 11.39540000 34.97880000 2.290520000 1.421130000 9.543800000 1010 14.59930000 14.98260000 61.72490000 7.395750000 3.907620000 33.10790000 1011 14.10740000 9.424530000 66.73070000 8.169320000 3.649570000 39.14260000 1012 23.90850000 29.84270000 93.30490000 19.77390000 12.11950000 82.53540000 1013 26.65150000 67.24050000 92.27610000 32.31380000 37.08870000 84.73730000 1014 17.89220000 22.98490000 29.23840000 3.554220000 3.785250000 6.874170000 1015 26.78680000 20.34020000 28.39470000 4.485660000 3.780880000 6.429460000 1016 30.12370000 18.37680000 33.22310000 5.407810000 3.882360000 8.849140000 1017 39.45870000 61.06610000 46.46550000 20.76650000 28.26280000 21.89560000 1018 44.97080000 69.61170000 58.38480000 28.76070000 38.12190000 34.81550000 1019 57.41040000 71.52190000 92.14250000 44.35620000 46.52700000 85.67240000 1020 76.11660000 55.58930000 70.16670000 40.73900000 34.63920000 47.94590000 1021 93.79200000 55.65580000 77.77690000 56.05830000 42.33200000 59.65510000 1022 93.54370000 62.35040000 88.69020000 62.12380000 49.20940000 78.88790000 1023 93.27060000 86.37000000 99.62020000 79.18690000 77.21740000 104.5550000 1024 50.82430000 52.68700000 57.71800000 23.43450000 24.42880000 31.73030000 1025 56.30380000 54.33480000 64.63740000 27.92140000 27.47480000 40.06950000 1026 63.38460000 57.47190000 72.36450000 34.56850000 32.50000000 50.90450000 1027 44.35940000 53.94440000 49.01870000 19.86580000 23.46750000 23.20640000 1028 45.06340000 92.48350000 68.64550000 45.14760000 67.06760000 51.93020000 1029 57.65870000 91.95190000 72.34080000 50.87350000 69.34480000 57.12360000 1030 30.71030000 56.12140000 37.03770000 15.14360000 22.47480000 14.18890000 1031 51.82790000 58.64280000 79.25340000 31.59850000 31.45440000 61.14310000 1032 75.95290000 61.71630000 91.81500000 49.85190000 42.33860000 83.95780000 1033 28.58140000 17.89510000 39.54690000 5.784250000 3.917550000 12.75150000 1034 30.53800000 14.37190000 45.23990000 6.692420000 3.830830000 16.92020000 1035 36.82620000 10.14340000 50.76480000 8.880520000 4.455000000 21.69370000 1036 84.72980000 78.93860000 66.61600000 57.28770000 60.23730000 47.33030000 1037 86.59390000 86.56590000 69.11000000 64.09390000 70.77100000 52.26470000 1038 11.68160000 42.48370000 14.08000000 6.050840000 11.17040000 3.106490000 1039 14.85290000 51.38550000 12.49370000 9.077130000 16.93400000 3.766120000 1040 51.33520000 51.82630000 34.47620000 19.67660000 22.45220000 12.39290000 1041 51.70760000 53.32240000 42.85720000 21.43830000 24.04520000 18.19020000 1042 79.76050000 79.24270000 91.25410000 61.27490000 61.70930000 86.04530000 1043 81.73540000 87.69640000 94.06730000 69.03330000 73.53880000 93.26200000 1044 9.637480000 16.56100000 24.79220000 1.766090000 1.831010000 4.665040000 1045 8.426810000 13.51910000 29.12300000 1.814890000 1.448580000 6.459980000 1046 29.53530000 40.93160000 48.68120000 11.54170000 12.96610000 21.32070000 1047 38.04610000 44.01390000 56.41150000 15.93100000 16.35380000 29.17990000 1048 46.55480000 47.72860000 57.25200000 19.99890000 20.13470000 30.58340000 1049 67.00280000 48.95870000 56.38940000 29.64860000 25.73020000 30.24370000 1050 18.13890000 12.95410000 14.93710000 1.640760000 1.406900000 1.630470000 1051 40.61070000 24.20300000 9.311020000 7.359960000 6.127100000 1.305980000 1052 47.37990000 22.08160000 8.279160000 9.343210000 6.723850000 1.200300000 1053 59.47990000 77.73100000 16.96070000 34.06710000 48.02560000 9.386050000 1054 61.64680000 91.38040000 18.90750000 44.02250000 66.18130000 12.88180000 1055 23.27830000 28.63140000 32.07190000 5.436460000 6.023690000 8.635230000 1056 32.20900000 28.59560000 39.40860000 8.020880000 7.248730000 13.18220000 1057 43.28980000 28.28540000 75.01950000 18.35840000 11.65880000 51.56670000 1058 51.45690000 30.18050000 91.93790000 27.13440000 16.06440000 80.31460000 1059 65.84450000 63.02620000 92.61690000 44.65510000 40.49430000 85.38980000 1060 71.43360000 73.38670000 93.26790000 53.27020000 52.55460000 88.50440000 1061 38.04620000 29.77510000 88.46990000 21.20120000 13.03460000 73.66540000 1062 37.36090000 48.47580000 87.41200000 25.43190000 22.35890000 73.35540000 1063 54.43930000 79.15380000 93.34380000 47.72370000 54.55780000 89.32870000 1064 63.50630000 93.57760000 93.23920000 61.56840000 75.82840000 92.50440000 1065 7.926100000 22.22180000 22.13220000 2.119590000 2.959780000 3.891350000 1066 20.51110000 27.32790000 20.88240000 3.903730000 5.007570000 3.780760000 1067 37.49590000 37.15300000 31.78370000 10.27200000 11.14380000 9.216210000 1068 74.66300000 72.09790000 46.93730000 42.52340000 47.38050000 24.83310000 1069 81.02140000 74.97800000 72.27170000 53.77750000 54.88250000 54.08170000 1070 93.26940000 83.10560000 77.29120000 69.42520000 69.94450000 63.53570000 1071 96.17430000 84.30100000 91.37660000 77.21260000 74.56000000 87.91450000 1072 62.02400000 20.07320000 22.91680000 16.17750000 9.811710000 4.746380000 1073 79.57570000 21.57180000 46.55990000 29.53750000 16.65930000 19.27210000 1074 79.02520000 34.05020000 61.16250000 34.04070000 21.80790000 34.50650000 1075 75.49590000 45.70120000 57.92530000 34.04610000 26.41040000 31.77740000 1076 92.74940000 90.56920000 63.87260000 70.43980000 78.23020000 46.68950000 1077 33.55570000 27.28480000 17.71980000 6.192170000 6.196900000 2.974320000 1078 32.86590000 41.70760000 35.46260000 10.64080000 13.03040000 11.63260000 1079 31.26790000 45.19930000 44.57690000 12.48800000 15.34370000 18.30890000 1080 35.22930000 63.20930000 79.35880000 28.05230000 32.56560000 61.71050000 1081 43.36800000 66.49810000 91.32720000 35.92960000 38.45700000 83.02890000 1082 30.92420000 51.28010000 68.64200000 19.24340000 21.22980000 44.44300000 1083 35.07750000 56.26140000 67.82570000 21.89700000 25.38520000 44.03120000 1084 64.49050000 70.17700000 75.58710000 41.87960000 44.82650000 57.56980000 1085 75.29530000 79.85080000 84.20070000 56.26070000 59.94030000 73.42360000 1086 89.18920000 93.83860000 86.60860000 76.31230000 83.97880000 81.15360000 1087 88.84590000 100.0000000 92.35600000 82.70530000 93.97260000 93.21270000 1088 9.169040000 15.34010000 17.51500000 1.185940000 1.426070000 2.264120000 1089 11.28350000 12.36420000 20.07640000 1.228760000 1.107560000 2.918540000 1090 7.758740000 8.455170000 19.87400000 0.822165000 0.596167000 2.780200000 1091 37.05060000 66.94820000 32.07420000 20.92090000 32.57990000 12.94640000 1092 73.04610000 79.71690000 48.48070000 46.06140000 55.56720000 27.54910000 1093 85.73830000 92.63570000 52.06020000 63.91560000 77.32030000 34.07180000 1094 42.95560000 20.41270000 13.78870000 7.747210000 5.578960000 1.880820000 1095 93.23600000 18.43900000 9.688770000 36.32620000 20.00370000 2.504840000 1096 53.58320000 0.000000000 12.81250000 10.65310000 5.469250000 1.525770000 1097 57.05280000 69.13620000 43.46470000 30.77150000 39.10520000 21.06680000 1098 56.63430000 91.68720000 48.33310000 45.00290000 66.64090000 29.61360000 1099 57.64850000 92.69780000 62.50090000 48.96660000 69.43430000 44.47750000 1100 19.66130000 58.77220000 58.02510000 17.71590000 24.99770000 32.47310000 1101 25.31460000 72.47990000 65.01490000 26.63030000 39.07570000 42.84380000 1102 11.02960000 36.82280000 36.45380000 6.258540000 8.898830000 11.67090000 1103 11.08770000 43.95170000 37.99980000 8.340490000 12.75720000 13.28950000 1104 65.58080000 67.43090000 37.18470000 33.38660000 39.29040000 16.56660000 1105 92.19480000 67.75010000 38.05720000 51.83380000 49.02100000 18.03480000 1106 66.72170000 47.29710000 10.64440000 23.95810000 22.56580000 3.779300000 1107 81.13310000 65.01260000 12.86390000 40.10750000 41.24670000 6.888590000 1108 92.60500000 86.12580000 8.715340000 60.65800000 69.48420000 10.65750000 1109 91.92170000 89.50420000 84.66040000 74.79940000 78.71380000 76.85130000 1110 68.42910000 64.66880000 71.64680000 40.28470000 40.12080000 51.06700000 1111 76.06900000 74.16780000 81.98420000 52.79120000 53.38250000 68.64730000 1112 89.64880000 73.63660000 96.86260000 67.49940000 59.93680000 96.21880000 1113 36.52590000 6.653190000 21.80120000 5.227210000 2.758580000 3.576900000 1114 45.40580000 9.620080000 18.95960000 7.938100000 4.346670000 2.862660000 1115 50.43670000 16.98590000 27.54760000 10.93750000 6.592140000 6.249590000 1116 62.85560000 28.05740000 31.33260000 18.44460000 12.59050000 8.829420000 1117 74.96280000 28.10250000 36.59350000 26.05200000 16.45780000 12.17380000 1118 89.32660000 30.69140000 43.10650000 37.67180000 23.04530000 17.33020000 1119 89.64230000 44.38940000 44.27510000 41.42550000 29.90610000 19.35750000 1120 64.91420000 31.97110000 9.849500000 18.96650000 14.08850000 2.298380000 1121 75.57230000 33.04720000 10.03440000 25.52090000 17.79350000 2.692290000 1122 85.30450000 79.87770000 19.61210000 51.39130000 58.82440000 11.27690000 1123 91.97640000 79.68920000 61.08980000 62.11910000 63.53970000 40.99810000 1124 18.44450000 13.68490000 22.03320000 2.100660000 1.677010000 3.611060000 1125 69.69420000 9.399170000 28.09330000 19.94390000 10.44670000 6.763860000 1126 79.69080000 9.507240000 27.21740000 26.26500000 13.72150000 6.672710000 1127 89.23370000 22.50290000 63.57020000 40.11000000 21.90520000 37.04940000 1128 88.40270000 36.11390000 70.74130000 43.68430000 27.19880000 47.14010000 1129 94.37940000 63.35040000 72.77930000 58.38940000 48.51770000 53.32860000 1130 77.39320000 52.24080000 54.37640000 36.77270000 31.14120000 28.85060000 1131 89.80560000 53.02650000 56.77220000 46.61200000 36.58420000 31.84730000 1132 89.38130000 64.63480000 61.41770000 52.08970000 46.47090000 38.61110000 1133 67.01150000 67.30320000 53.09530000 36.55290000 40.54850000 29.41230000 1134 66.27060000 82.77150000 71.18130000 48.82470000 59.20870000 53.65460000 1135 68.45550000 90.74980000 85.06040000 59.44910000 72.06890000 77.06110000 1136 10.56100000 29.55440000 16.94690000 3.107780000 5.197270000 2.747290000 1137 9.419710000 27.77370000 28.89620000 3.542420000 4.862820000 6.920990000 1138 47.57470000 39.55580000 26.80870000 13.69870000 13.85170000 7.183010000 1139 47.46410000 44.96910000 24.97900000 15.02960000 16.80460000 6.929630000 1140 58.34210000 65.54960000 52.19370000 31.05190000 36.47820000 28.04740000 1141 77.32340000 66.97260000 79.27410000 49.06240000 46.02530000 63.06800000 1142 28.64910000 12.54000000 19.04060000 3.480660000 2.292060000 2.723960000 1143 29.54650000 9.256680000 22.15070000 3.670380000 2.099560000 3.649900000 1144 50.48150000 14.17850000 51.93040000 13.93030000 7.411190000 23.08860000 1145 77.42820000 12.19430000 66.32560000 31.16090000 15.73830000 39.74750000 1146 77.62030000 43.55920000 72.91680000 38.38400000 27.28280000 50.47970000 1147 69.42030000 43.44190000 76.22470000 34.13050000 24.93290000 55.09150000 1148 69.38470000 46.96830000 90.08200000 39.59010000 28.82700000 78.67240000 1149 78.01820000 53.59180000 91.09420000 47.66220000 36.33810000 81.56770000 1150 40.79090000 47.71840000 39.45060000 15.09950000 17.94600000 14.90260000 1151 47.11630000 57.82050000 46.32210000 21.92110000 26.83000000 21.43930000 1152 9.684760000 14.42450000 6.067540000 0.786834000 1.152280000 0.380259000 1153 14.39040000 15.77450000 10.77410000 1.330690000 1.584830000 0.940377000 1154 9.530100000 23.48020000 17.24070000 2.089550000 3.226440000 2.494010000 1155 17.55600000 44.99320000 44.68800000 10.14280000 14.04020000 18.26860000 1156 47.28120000 55.38510000 55.70680000 22.67660000 25.59050000 29.87480000 1157 8.005570000 13.64210000 10.49610000 0.734212000 1.028190000 0.825008000 1158 11.34220000 6.732770000 5.279080000 0.466539000 0.377860000 0.195099000 1159 24.64160000 8.972740000 8.451470000 2.151190000 1.364280000 0.563062000 1160 28.54250000 8.715170000 13.62580000 3.009360000 1.773370000 1.364630000 1161 43.15720000 25.57530000 48.38680000 11.93640000 8.377500000 20.15670000 1162 46.67550000 48.20700000 67.32470000 22.46570000 21.37600000 42.57580000 1163 56.65420000 54.09060000 75.41710000 30.78130000 28.48980000 54.74870000 1164 77.76180000 55.02310000 81.42090000 44.81470000 36.04520000 64.80130000 1165 10.91450000 24.90070000 39.37790000 4.321330000 4.454530000 12.81690000 1166 8.910710000 23.56170000 44.53360000 4.737580000 4.300080000 16.55140000 1167 10.90510000 28.75220000 58.06560000 8.082570000 6.959600000 29.54290000 1168 12.08640000 32.00430000 78.12750000 13.80310000 10.23780000 56.22790000 1169 26.70110000 73.10540000 77.97320000 30.65730000 41.25320000 61.08790000 1170 24.41660000 82.41640000 91.71720000 40.15100000 53.67090000 86.47280000 1171 25.14990000 84.20730000 100.0000000 44.53280000 57.24850000 103.3160000 1172 15.82950000 93.94440000 72.45990000 40.77120000 66.26410000 57.22950000 1173 88.46500000 95.03620000 71.81970000 72.18080000 83.66730000 58.03320000 1174 29.62620000 31.23430000 16.76420000 5.962590000 7.140220000 2.926950000 1175 45.06340000 60.42080000 12.51640000 19.13880000 27.37420000 5.254990000 1176 51.48780000 81.02320000 11.46160000 32.24210000 50.02280000 8.763710000 1177 75.94400000 92.85820000 10.16440000 53.01420000 72.42010000 11.80490000 1178 76.26360000 93.50490000 63.61470000 60.24720000 76.08530000 46.50000000 1179 91.95130000 92.47350000 79.68370000 75.34750000 82.27220000 69.32640000 1180 66.68820000 75.49130000 68.92960000 44.14920000 50.44580000 49.15190000 1181 70.05020000 83.15650000 89.97000000 56.99100000 63.11260000 84.16800000 1182 79.31170000 94.97110000 89.47950000 70.82670000 82.27180000 86.24080000 1183 14.25120000 38.59180000 29.99520000 6.251060000 9.615260000 8.223390000 1184 8.576980000 46.06510000 74.32870000 16.08780000 16.86100000 51.67780000 1185 12.73000000 51.19000000 90.41140000 23.10410000 22.41400000 78.90930000 1186 12.45520000 62.94490000 93.80200000 29.02240000 32.33080000 86.90420000 1187 9.281660000 24.74920000 75.45220000 11.59480000 7.317300000 51.72510000 1188 7.275710000 25.22980000 87.85760000 15.43750000 8.958540000 72.08690000 1189 14.97540000 19.30710000 75.43060000 11.30310000 6.131650000 51.47960000 1190 63.18110000 16.90190000 78.22670000 26.25780000 13.38600000 56.33300000 1191 71.47950000 24.04780000 87.85470000 34.84050000 18.70430000 72.94060000 1192 57.67410000 39.96870000 66.27600000 24.35570000 18.77680000 40.62950000 1193 72.73410000 59.75600000 67.73610000 39.66210000 36.66960000 45.15630000 1194 74.36260000 75.45880000 67.33520000 48.31070000 52.61020000 47.25640000 1195 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 1196 7.710020000 10.15680000 6.203640000 0.420937000 0.559623000 0.295110000 1197 7.612170000 4.618980000 10.11310000 0.301345000 0.203224000 0.636356000 1198 30.28710000 63.57770000 15.43310000 16.48460000 28.07080000 6.102600000 1199 34.00210000 92.80980000 14.70120000 34.45770000 62.78500000 11.69870000 1200 39.94850000 95.35840000 90.38020000 52.14040000 73.02820000 87.09130000 1201 21.70130000 28.66040000 27.26250000 4.757880000 5.732790000 6.283750000 1202 20.63100000 33.10070000 25.73260000 5.336990000 7.312590000 5.910750000 1203 61.14130000 38.88710000 28.48010000 19.59650000 16.62170000 8.151090000 1204 61.80640000 61.36260000 42.29090000 29.24860000 32.90010000 19.06460000 1205 44.91050000 59.22180000 40.26050000 20.83030000 27.22990000 16.95180000 1206 49.99250000 74.18350000 43.04700000 30.34600000 42.84450000 21.49280000 1207 67.69390000 83.84290000 52.49630000 46.12810000 59.30520000 31.94880000 1208 74.54440000 84.85120000 63.39050000 53.15190000 63.62630000 44.19840000 1209 12.65390000 32.43660000 9.078530000 3.535910000 6.275350000 1.508440000 1210 10.27680000 30.78420000 23.05510000 3.672750000 5.789010000 4.678200000 1211 10.37250000 31.07700000 36.38210000 4.971880000 6.399540000 11.21190000 1212 11.43210000 38.40340000 43.03950000 7.534660000 10.02800000 16.35490000 1213 0.000000000 40.73120000 45.85760000 8.210030000 11.22130000 18.76730000 1214 41.42260000 45.38370000 73.28320000 21.34030000 19.29080000 50.35870000 1215 51.42930000 53.84570000 82.97730000 30.69290000 28.04580000 66.56150000 1216 71.81530000 12.78580000 20.17470000 20.83310000 11.25440000 3.873980000 1217 72.59920000 7.440620000 54.75370000 25.30950000 12.66860000 26.26870000 1218 79.93730000 60.33610000 54.23330000 41.67200000 38.41550000 29.85340000 1219 64.04890000 23.69560000 16.88540000 17.34840000 11.13930000 3.128620000 1220 91.04910000 27.31500000 18.62540000 36.06180000 21.59760000 4.616840000 1221 90.03810000 39.30900000 16.64050000 37.67680000 26.19360000 4.903400000 1222 33.24830000 15.57040000 10.78940000 4.394080000 3.138230000 1.081010000 1223 35.44630000 11.28760000 91.72670000 19.43700000 8.734100000 78.90840000 1224 45.95460000 18.11990000 91.08340000 22.99310000 11.39610000 78.03310000 1225 15.55610000 14.89220000 5.936390000 1.267720000 1.455000000 0.403999000 1226 17.05060000 13.77280000 9.164060000 1.393950000 1.386170000 0.687679000 1227 14.69930000 10.39800000 8.937570000 0.943539000 0.841757000 0.579899000 1228 8.826190000 11.11870000 14.22730000 0.731206000 0.772028000 1.409100000 1229 6.437110000 8.179000000 15.38370000 0.538399000 0.459239000 1.602370000 1230 5.951050000 52.34510000 69.99720000 16.93250000 20.56360000 46.25320000 1231 9.232850000 58.92620000 83.86440000 23.65070000 27.36650000 68.28670000 1232 11.68040000 75.69230000 92.35900000 34.90280000 45.01610000 86.28780000 1233 6.351260000 81.46890000 92.34760000 38.03030000 51.68030000 87.38760000 1234 20.31460000 89.10210000 91.43460000 43.80560000 62.05910000 87.37030000 1235 53.01520000 87.00210000 93.97770000 52.28500000 64.21920000 92.17250000 1236 90.00530000 86.71960000 92.77820000 74.15830000 75.26770000 90.85350000 1237 1.445090000 0.000000000 0.000000000 0.003702600 0.001908800 0.000173336 1238 13.56080000 92.53170000 32.87570000 32.21840000 61.18440000 18.30520000 1239 75.42190000 91.66890000 36.61140000 53.68830000 71.29190000 21.31280000 1240 93.20680000 90.72590000 54.20300000 68.88870000 77.82890000 35.99660000 1241 25.23860000 18.16100000 7.137190000 2.890610000 2.730340000 0.659536000 1242 33.00280000 20.03620000 9.726100000 4.750990000 3.983980000 1.081250000 1243 34.38430000 18.05020000 84.68600000 17.29310000 8.698370000 66.41070000 1244 20.91300000 24.27940000 50.46040000 6.920950000 5.465110000 21.71200000 1245 18.31900000 35.01640000 65.28960000 11.61190000 10.45110000 38.45190000 1246 26.02460000 45.68080000 70.68180000 16.93460000 17.23510000 46.54470000 1247 25.36540000 49.93070000 94.62990000 25.76810000 22.96230000 86.87110000 1248 38.32000000 35.31740000 63.14590000 15.19450000 12.45620000 36.02760000 1249 48.48260000 37.88230000 70.32140000 20.94190000 16.11370000 45.62400000 1250 15.86020000 14.00440000 26.27860000 2.147950000 1.700780000 5.221500000 1251 11.25920000 57.31340000 24.49210000 11.66920000 21.52880000 7.828860000 1252 6.114910000 62.53930000 41.61760000 15.45050000 26.57130000 18.07580000 1253 11.65980000 78.14880000 46.01220000 24.43040000 43.08330000 24.18920000 1254 14.06040000 79.97310000 37.75400000 24.54390000 44.88210000 18.47680000 1255 17.52700000 91.53340000 44.67530000 33.39910000 60.56410000 26.01320000 1256 35.24230000 92.67390000 45.58610000 37.61660000 63.92870000 27.17030000 1257 30.23550000 90.43260000 30.76500000 32.98400000 59.40110000 16.80820000 1258 82.53420000 93.02630000 30.24750000 58.84020000 75.46670000 18.28740000 1259 76.54930000 50.64270000 17.87660000 31.32950000 27.99310000 5.898000000 1260 88.61980000 52.67390000 42.68610000 43.12370000 34.87400000 19.00910000 1261 46.81620000 22.14060000 64.82460000 16.02570000 9.385250000 37.43590000 1262 63.01910000 20.12970000 90.18320000 30.37200000 15.55960000 76.78320000 1263 62.74990000 34.35550000 90.29340000 32.62920000 20.22020000 77.76670000 1264 78.85570000 72.28420000 90.75750000 56.55430000 53.47170000 83.78110000 1265 43.60790000 35.14440000 38.61250000 12.45930000 11.48970000 13.23120000 1266 53.61020000 34.11960000 41.08170000 16.37940000 13.13770000 15.04720000 1267 63.65740000 36.33140000 48.52960000 22.81140000 17.06200000 21.38460000 1268 67.88780000 45.08940000 60.21150000 29.71230000 23.84340000 34.04030000 1269 82.68240000 53.54650000 75.09630000 45.81170000 35.94680000 54.92140000 1270 23.28060000 4.536670000 17.00300000 2.078180000 1.088020000 2.022280000 1271 22.31120000 9.006000000 13.01760000 1.905820000 1.225510000 1.204210000 1272 20.50680000 12.76300000 5.439990000 1.681200000 1.437070000 0.345561000 1273 20.12340000 16.56160000 53.16690000 6.397710000 3.796260000 23.97720000 1274 27.88470000 32.22340000 54.42860000 10.18620000 9.102990000 26.05010000 1275 28.21660000 35.95750000 73.02990000 15.36520000 12.47520000 48.99580000 1276 46.51770000 39.06810000 90.42260000 26.65250000 18.78840000 78.04330000 1277 18.78970000 3.835200000 25.62730000 1.974800000 0.954450000 4.817730000 1278 31.80020000 6.725560000 37.60000000 5.513710000 2.740170000 11.24600000 1279 32.74740000 63.83470000 57.92570000 22.29700000 30.64870000 33.21490000 1280 35.99050000 80.31010000 61.21150000 32.56750000 48.85660000 39.86160000 1281 42.42790000 96.78820000 60.61650000 45.54070000 72.19260000 42.99900000 1282 29.58180000 40.62190000 27.14470000 8.788020000 11.73280000 7.178030000 1283 58.82760000 44.15440000 31.13110000 20.14990000 19.02200000 9.877090000 1284 65.89420000 52.92000000 37.14780000 27.34450000 26.95730000 14.48100000 1285 65.54560000 59.30100000 46.12240000 30.90950000 32.37720000 21.87180000 1286 82.27590000 65.23240000 65.46260000 47.93480000 44.63710000 43.35290000 1287 93.31010000 76.94330000 68.03030000 63.24250000 61.53910000 49.09880000 1288 94.38990000 87.19740000 72.69500000 71.72830000 75.22070000 57.66010000 1289 93.41810000 86.60820000 88.17210000 75.25290000 75.90970000 82.41950000 1290 53.29130000 49.27330000 45.26100000 21.02850000 21.66960000 19.62500000 1291 62.37610000 54.22280000 47.45890000 27.41580000 27.54500000 22.24160000 1292 91.18730000 9.951890000 15.16290000 34.17450000 17.91700000 3.151450000 1293 93.68130000 12.80220000 23.14710000 36.83570000 19.48410000 5.607180000 1294 93.29800000 11.62470000 31.56030000 37.14700000 19.45260000 9.286770000 1295 93.14560000 14.33110000 40.28450000 38.21900000 20.16110000 14.68790000 1296 91.41500000 8.841860000 67.03280000 41.51280000 20.79200000 41.08250000 1297 87.18510000 7.726400000 80.24420000 41.75380000 20.43070000 60.05180000 1298 68.97070000 31.56980000 60.38760000 27.00300000 17.43830000 33.14650000 1299 70.30620000 35.01200000 70.62150000 30.95830000 20.26950000 46.30880000 1300 70.04770000 37.30100000 81.59260000 34.47610000 22.50940000 63.01300000 1301 83.50610000 46.67820000 91.22150000 49.18380000 33.59010000 81.19400000 1302 94.26810000 47.41200000 92.40100000 58.31570000 38.59580000 83.89430000 1303 56.97610000 47.18090000 55.63660000 23.79260000 21.86620000 29.02470000 1304 57.40670000 65.13240000 66.43910000 33.43920000 37.06720000 43.88880000 1305 58.48010000 65.43010000 91.85320000 41.71440000 40.66050000 84.13440000 1306 21.72170000 33.39130000 34.89950000 6.422240000 7.862090000 10.52250000 1307 19.10780000 70.51180000 48.41640000 21.32750000 35.19120000 24.86320000 1308 19.13660000 82.18150000 56.59680000 29.47210000 49.07610000 34.97680000 1309 15.73280000 89.28060000 85.84270000 41.47440000 61.26080000 77.27010000 1310 13.14380000 65.54740000 81.53350000 26.11950000 33.10210000 65.40170000 1311 12.04630000 70.55520000 93.17840000 32.45020000 39.59680000 86.92920000 1312 4.513480000 91.46300000 94.78410000 45.47490000 65.21690000 94.28930000 1313 17.98960000 62.08440000 70.43570000 21.83330000 28.89920000 48.20100000 1314 14.92120000 76.46260000 72.87940000 29.44730000 43.56230000 54.03950000 1315 10.53370000 76.24820000 78.82790000 30.68430000 43.82310000 62.91090000 1316 8.995660000 66.30180000 60.48030000 20.66270000 31.46410000 36.29330000 1317 56.66090000 65.58880000 61.02650000 32.05790000 36.81970000 37.35180000 1318 57.96780000 79.17440000 61.99260000 40.13320000 51.72610000 40.92580000 1319 16.14690000 62.13910000 17.29770000 13.68670000 25.65620000 6.226740000 1320 19.62630000 70.39090000 14.48530000 17.92650000 33.73830000 6.918520000 1321 18.75500000 81.69550000 15.67290000 24.26870000 46.50760000 9.304650000 1322 35.64330000 87.24060000 58.30180000 36.26050000 57.37630000 38.04620000 1323 24.92420000 44.02250000 39.28730000 10.14000000 13.69690000 14.23270000 1324 92.92030000 45.22180000 52.72970000 45.75000000 32.34380000 26.98950000 1325 91.71690000 72.48310000 77.26680000 61.95340000 56.91470000 61.37710000 1326 50.51570000 43.21630000 45.91840000 18.09440000 17.34040000 19.47730000 1327 55.52440000 42.02250000 57.62460000 21.99060000 18.60390000 30.58170000 1328 36.07860000 17.71890000 24.27490000 5.978770000 4.170240000 4.694980000 1329 41.67640000 14.34360000 24.83720000 7.360030000 4.438660000 4.891180000 1330 43.45160000 10.27280000 35.63710000 8.700990000 4.626050000 10.21770000 1331 68.34510000 12.02140000 38.94220000 20.46340000 10.79050000 12.89480000 1332 67.66660000 35.09350000 43.31510000 23.90980000 17.30190000 17.10550000 1333 53.50820000 30.18810000 33.67710000 14.63910000 11.16740000 10.02290000 1334 71.86360000 62.81730000 32.32400000 34.30810000 36.60760000 13.15190000 1335 55.52360000 43.89520000 23.64600000 17.91180000 17.82770000 6.466460000 1336 65.09090000 81.61000000 32.75360000 40.46010000 54.63270000 16.53960000 1337 40.60920000 50.10750000 9.305230000 13.60370000 18.61630000 3.386940000 1338 54.06280000 66.41680000 10.19650000 25.32060000 34.62370000 5.973020000 1339 62.58200000 66.33770000 12.90490000 29.41150000 36.66680000 6.575480000 1340 90.31720000 75.18700000 18.93540000 52.52550000 55.37720000 10.35630000 1341 89.48070000 81.32160000 35.49380000 56.83850000 62.77830000 18.81940000 1342 98.27870000 91.75180000 35.16350000 71.09590000 80.37260000 21.26680000 1343 53.47620000 73.28290000 28.89250000 29.63700000 41.94020000 12.70090000 1344 53.65560000 85.70130000 29.22480000 37.16160000 56.82840000 15.33520000 1345 25.53130000 38.87220000 9.246350000 6.620030000 10.04690000 2.093790000 1346 23.95260000 42.48480000 55.87110000 12.23940000 13.80970000 28.32060000 1347 23.89400000 47.63030000 56.71840000 13.95430000 16.98390000 29.72800000 1348 24.95660000 55.99290000 63.00750000 18.47120000 23.59500000 37.83940000 1349 32.50820000 64.17840000 73.71190000 26.19560000 32.45500000 53.26050000 1350 33.49440000 77.67230000 75.77190000 34.03980000 46.87030000 58.65260000 1351 46.67130000 31.61110000 34.29710000 12.27350000 10.34630000 10.34270000 1352 49.19460000 29.84490000 58.92890000 16.80930000 11.73040000 30.94820000 1353 55.96940000 30.62240000 68.08590000 21.90720000 14.33110000 42.23770000 1354 36.67160000 22.12650000 51.97220000 10.11690000 6.645710000 23.18150000 1355 56.52030000 20.23980000 62.19990000 19.17680000 10.73430000 34.36150000 1356 67.49460000 24.26130000 68.50830000 26.81510000 15.27300000 42.71730000 1357 81.48440000 33.32100000 84.20440000 41.84340000 24.87820000 67.42190000 1358 19.53530000 40.04690000 18.23540000 6.343270000 10.31560000 3.898350000 1359 26.70980000 50.32530000 24.44240000 10.97430000 17.28930000 7.028070000 1360 89.22210000 59.03820000 30.11230000 44.60060000 39.50320000 12.02920000 1361 49.38740000 32.18660000 14.95290000 11.97160000 10.52760000 2.849940000 1362 57.01390000 42.63330000 12.37190000 17.65160000 17.22060000 3.348820000 1363 57.80090000 49.55300000 9.913030000 20.09820000 21.68200000 3.712670000 1364 66.62030000 61.83290000 10.42610000 29.42770000 33.59910000 5.590180000 1365 75.93830000 74.17920000 8.014210000 41.12090000 48.71430000 7.603570000 1366 75.64920000 80.25540000 27.85390000 45.45290000 56.03330000 14.11070000 1367 77.49100000 81.11840000 40.41580000 48.56630000 58.25830000 21.58820000 1368 24.77270000 24.47010000 9.836810000 3.644070000 4.267270000 1.208430000 1369 65.28400000 40.67320000 12.31800000 21.26970000 18.28550000 3.354600000 1370 79.37380000 45.25940000 10.80200000 31.20220000 25.35560000 3.958610000 1371 92.59050000 45.22340000 9.589990000 41.16330000 30.47820000 4.259310000 1372 92.47240000 57.14200000 10.38800000 45.28590000 38.83680000 5.760290000 1373 95.79270000 77.77170000 7.755180000 58.15510000 60.51340000 8.957810000 1374 43.17080000 39.10300000 8.697070000 11.12000000 12.45520000 2.258100000 1375 49.89060000 37.95120000 31.44550000 14.60030000 13.66700000 9.298290000 1376 56.27290000 39.58540000 84.24400000 28.68410000 20.27380000 67.29370000 1377 57.78570000 44.18990000 94.83090000 34.34060000 24.65830000 87.13890000 1378 13.37640000 12.20150000 44.46690000 3.881240000 2.169880000 16.13280000 1379 10.57270000 8.880130000 49.82920000 4.369720000 2.060550000 20.61530000 1380 45.72370000 9.076480000 58.66210000 13.14490000 6.402610000 29.81940000 1381 58.30920000 3.686140000 72.81920000 21.60270000 10.13640000 47.91540000 1382 83.37590000 20.10710000 76.70540000 38.77120000 20.38330000 54.69380000 1383 53.79250000 30.63750000 50.23060000 17.16850000 12.32900000 22.28690000 1384 67.89000000 32.08250000 52.52890000 24.91120000 16.69310000 24.87310000 1385 77.93560000 36.69560000 53.81320000 32.39770000 22.02260000 26.76020000 1386 17.58500000 8.598190000 8.065160000 1.135240000 0.817757000 0.470715000 1387 37.30110000 11.91510000 6.228700000 5.086930000 3.111110000 0.543597000 1388 39.72790000 10.50970000 13.16740000 5.876450000 3.379660000 1.438010000 1389 52.89750000 16.18610000 8.935880000 10.90510000 6.579240000 1.162250000 1390 77.62440000 16.42250000 8.832210000 24.38540000 13.56040000 1.787600000 1391 89.14880000 30.58670000 9.217900000 34.77030000 21.83650000 2.882700000 1392 90.72860000 29.02860000 54.79040000 40.45610000 23.79750000 27.65580000 1393 92.21300000 32.89750000 91.93040000 52.60610000 29.99110000 81.64630000 1394 35.18160000 9.191850000 33.10820000 5.920540000 3.147640000 8.616690000 1395 54.29950000 11.14590000 33.15610000 12.64560000 6.761220000 8.986300000 1396 64.76240000 18.56730000 32.91780000 18.31100000 10.56740000 9.291030000 1397 61.77100000 34.81750000 31.00780000 19.18270000 14.94590000 9.078140000 1398 64.85870000 42.99050000 38.01170000 23.65050000 20.23660000 13.93420000 1399 90.52570000 75.10450000 51.01810000 56.29110000 56.82920000 29.53920000 END_DATA CAL DESCRIPTOR "Argyll Device Calibration State" ORIGINATOR "Argyll dispcal" CREATED "Sat Mar 14 19:07:36 2009" KEYWORD "DEVICE_CLASS" DEVICE_CLASS "DISPLAY" KEYWORD "COLOR_REP" COLOR_REP "RGB" BEGIN_ARGYLL_DISPCAL_ARGS -qm -w0.3127,0.3290 -f0 -k0 END_ARGYLL_DISPCAL_ARGS KEYWORD "RGB_I" NUMBER_OF_FIELDS 4 BEGIN_DATA_FORMAT RGB_I RGB_R RGB_G RGB_B END_DATA_FORMAT NUMBER_OF_SETS 256 BEGIN_DATA 0.00000 0.00000 0.00000 0.00000 0.00392 0.00392 0.00392 0.00392 0.00784 0.00784 0.00784 0.00784 0.01176 0.01176 0.01176 0.01176 0.01569 0.01569 0.01569 0.01569 0.01961 0.01961 0.01961 0.01961 0.02353 0.02353 0.02353 0.02353 0.02745 0.02745 0.02745 0.02745 0.03137 0.03137 0.03137 0.03137 0.03529 0.03529 0.03529 0.03529 0.03922 0.03922 0.03922 0.03922 0.04314 0.04314 0.04314 0.04314 0.04706 0.04706 0.04706 0.04706 0.05098 0.05098 0.05098 0.05098 0.05490 0.05490 0.05490 0.05490 0.05882 0.05882 0.05882 0.05882 0.06275 0.06275 0.06275 0.06275 0.06667 0.06667 0.06667 0.06667 0.07059 0.07059 0.07059 0.07059 0.07451 0.07451 0.07451 0.07451 0.07843 0.07843 0.07843 0.07843 0.08235 0.08235 0.08235 0.08235 0.08627 0.08627 0.08627 0.08627 0.09020 0.09020 0.09020 0.09020 0.09412 0.09412 0.09412 0.09412 0.09804 0.09804 0.09804 0.09804 0.10196 0.10196 0.10196 0.10196 0.10588 0.10588 0.10588 0.10588 0.10980 0.10980 0.10980 0.10980 0.11373 0.11373 0.11373 0.11373 0.11765 0.11765 0.11765 0.11765 0.12157 0.12157 0.12157 0.12157 0.12549 0.12549 0.12549 0.12549 0.12941 0.12941 0.12941 0.12941 0.13333 0.13333 0.13333 0.13333 0.13725 0.13725 0.13725 0.13725 0.14118 0.14118 0.14118 0.14118 0.14510 0.14510 0.14510 0.14510 0.14902 0.14902 0.14902 0.14902 0.15294 0.15294 0.15294 0.15294 0.15686 0.15686 0.15686 0.15686 0.16078 0.16078 0.16078 0.16078 0.16471 0.16471 0.16471 0.16471 0.16863 0.16863 0.16863 0.16863 0.17255 0.17255 0.17255 0.17255 0.17647 0.17647 0.17647 0.17647 0.18039 0.18039 0.18039 0.18039 0.18431 0.18431 0.18431 0.18431 0.18824 0.18824 0.18824 0.18824 0.19216 0.19216 0.19216 0.19216 0.19608 0.19608 0.19608 0.19608 0.20000 0.20000 0.20000 0.20000 0.20392 0.20392 0.20392 0.20392 0.20784 0.20784 0.20784 0.20784 0.21176 0.21176 0.21176 0.21176 0.21569 0.21569 0.21569 0.21569 0.21961 0.21961 0.21961 0.21961 0.22353 0.22353 0.22353 0.22353 0.22745 0.22745 0.22745 0.22745 0.23137 0.23137 0.23137 0.23137 0.23529 0.23529 0.23529 0.23529 0.23922 0.23922 0.23922 0.23922 0.24314 0.24314 0.24314 0.24314 0.24706 0.24706 0.24706 0.24706 0.25098 0.25098 0.25098 0.25098 0.25490 0.25490 0.25490 0.25490 0.25882 0.25882 0.25882 0.25882 0.26275 0.26275 0.26275 0.26275 0.26667 0.26667 0.26667 0.26667 0.27059 0.27059 0.27059 0.27059 0.27451 0.27451 0.27451 0.27451 0.27843 0.27843 0.27843 0.27843 0.28235 0.28235 0.28235 0.28235 0.28627 0.28627 0.28627 0.28627 0.29020 0.29020 0.29020 0.29020 0.29412 0.29412 0.29412 0.29412 0.29804 0.29804 0.29804 0.29804 0.30196 0.30196 0.30196 0.30196 0.30588 0.30588 0.30588 0.30588 0.30980 0.30980 0.30980 0.30980 0.31373 0.31373 0.31373 0.31373 0.31765 0.31765 0.31765 0.31765 0.32157 0.32157 0.32157 0.32157 0.32549 0.32549 0.32549 0.32549 0.32941 0.32941 0.32941 0.32941 0.33333 0.33333 0.33333 0.33333 0.33725 0.33725 0.33725 0.33725 0.34118 0.34118 0.34118 0.34118 0.34510 0.34510 0.34510 0.34510 0.34902 0.34902 0.34902 0.34902 0.35294 0.35294 0.35294 0.35294 0.35686 0.35686 0.35686 0.35686 0.36078 0.36078 0.36078 0.36078 0.36471 0.36471 0.36471 0.36471 0.36863 0.36863 0.36863 0.36863 0.37255 0.37255 0.37255 0.37255 0.37647 0.37647 0.37647 0.37647 0.38039 0.38039 0.38039 0.38039 0.38431 0.38431 0.38431 0.38431 0.38824 0.38824 0.38824 0.38824 0.39216 0.39216 0.39216 0.39216 0.39608 0.39608 0.39608 0.39608 0.40000 0.40000 0.40000 0.40000 0.40392 0.40392 0.40392 0.40392 0.40784 0.40784 0.40784 0.40784 0.41176 0.41176 0.41176 0.41176 0.41569 0.41569 0.41569 0.41569 0.41961 0.41961 0.41961 0.41961 0.42353 0.42353 0.42353 0.42353 0.42745 0.42745 0.42745 0.42745 0.43137 0.43137 0.43137 0.43137 0.43529 0.43529 0.43529 0.43529 0.43922 0.43922 0.43922 0.43922 0.44314 0.44314 0.44314 0.44314 0.44706 0.44706 0.44706 0.44706 0.45098 0.45098 0.45098 0.45098 0.45490 0.45490 0.45490 0.45490 0.45882 0.45882 0.45882 0.45882 0.46275 0.46275 0.46275 0.46275 0.46667 0.46667 0.46667 0.46667 0.47059 0.47059 0.47059 0.47059 0.47451 0.47451 0.47451 0.47451 0.47843 0.47843 0.47843 0.47843 0.48235 0.48235 0.48235 0.48235 0.48627 0.48627 0.48627 0.48627 0.49020 0.49020 0.49020 0.49020 0.49412 0.49412 0.49412 0.49412 0.49804 0.49804 0.49804 0.49804 0.50196 0.50196 0.50196 0.50196 0.50588 0.50588 0.50588 0.50588 0.50980 0.50980 0.50980 0.50980 0.51373 0.51373 0.51373 0.51373 0.51765 0.51765 0.51765 0.51765 0.52157 0.52157 0.52157 0.52157 0.52549 0.52549 0.52549 0.52549 0.52941 0.52941 0.52941 0.52941 0.53333 0.53333 0.53333 0.53333 0.53725 0.53725 0.53725 0.53725 0.54118 0.54118 0.54118 0.54118 0.54510 0.54510 0.54510 0.54510 0.54902 0.54902 0.54902 0.54902 0.55294 0.55294 0.55294 0.55294 0.55686 0.55686 0.55686 0.55686 0.56078 0.56078 0.56078 0.56078 0.56471 0.56471 0.56471 0.56471 0.56863 0.56863 0.56863 0.56863 0.57255 0.57255 0.57255 0.57255 0.57647 0.57647 0.57647 0.57647 0.58039 0.58039 0.58039 0.58039 0.58431 0.58431 0.58431 0.58431 0.58824 0.58824 0.58824 0.58824 0.59216 0.59216 0.59216 0.59216 0.59608 0.59608 0.59608 0.59608 0.60000 0.60000 0.60000 0.60000 0.60392 0.60392 0.60392 0.60392 0.60784 0.60784 0.60784 0.60784 0.61176 0.61176 0.61176 0.61176 0.61569 0.61569 0.61569 0.61569 0.61961 0.61961 0.61961 0.61961 0.62353 0.62353 0.62353 0.62353 0.62745 0.62745 0.62745 0.62745 0.63137 0.63137 0.63137 0.63137 0.63529 0.63529 0.63529 0.63529 0.63922 0.63922 0.63922 0.63922 0.64314 0.64314 0.64314 0.64314 0.64706 0.64706 0.64706 0.64706 0.65098 0.65098 0.65098 0.65098 0.65490 0.65490 0.65490 0.65490 0.65882 0.65882 0.65882 0.65882 0.66275 0.66275 0.66275 0.66275 0.66667 0.66667 0.66667 0.66667 0.67059 0.67059 0.67059 0.67059 0.67451 0.67451 0.67451 0.67451 0.67843 0.67843 0.67843 0.67843 0.68235 0.68235 0.68235 0.68235 0.68627 0.68627 0.68627 0.68627 0.69020 0.69020 0.69020 0.69020 0.69412 0.69412 0.69412 0.69412 0.69804 0.69804 0.69804 0.69804 0.70196 0.70196 0.70196 0.70196 0.70588 0.70588 0.70588 0.70588 0.70980 0.70980 0.70980 0.70980 0.71373 0.71373 0.71373 0.71373 0.71765 0.71765 0.71765 0.71765 0.72157 0.72157 0.72157 0.72157 0.72549 0.72549 0.72549 0.72549 0.72941 0.72941 0.72941 0.72941 0.73333 0.73333 0.73333 0.73333 0.73725 0.73725 0.73725 0.73725 0.74118 0.74118 0.74118 0.74118 0.74510 0.74510 0.74510 0.74510 0.74902 0.74902 0.74902 0.74902 0.75294 0.75294 0.75294 0.75294 0.75686 0.75686 0.75686 0.75686 0.76078 0.76078 0.76078 0.76078 0.76471 0.76471 0.76471 0.76471 0.76863 0.76863 0.76863 0.76863 0.77255 0.77255 0.77255 0.77255 0.77647 0.77647 0.77647 0.77647 0.78039 0.78039 0.78039 0.78039 0.78431 0.78431 0.78431 0.78431 0.78824 0.78824 0.78824 0.78824 0.79216 0.79216 0.79216 0.79216 0.79608 0.79608 0.79608 0.79608 0.80000 0.80000 0.80000 0.80000 0.80392 0.80392 0.80392 0.80392 0.80784 0.80784 0.80784 0.80784 0.81176 0.81176 0.81176 0.81176 0.81569 0.81569 0.81569 0.81569 0.81961 0.81961 0.81961 0.81961 0.82353 0.82353 0.82353 0.82353 0.82745 0.82745 0.82745 0.82745 0.83137 0.83137 0.83137 0.83137 0.83529 0.83529 0.83529 0.83529 0.83922 0.83922 0.83922 0.83922 0.84314 0.84314 0.84314 0.84314 0.84706 0.84706 0.84706 0.84706 0.85098 0.85098 0.85098 0.85098 0.85490 0.85490 0.85490 0.85490 0.85882 0.85882 0.85882 0.85882 0.86275 0.86275 0.86275 0.86275 0.86667 0.86667 0.86667 0.86667 0.87059 0.87059 0.87059 0.87059 0.87451 0.87451 0.87451 0.87451 0.87843 0.87843 0.87843 0.87843 0.88235 0.88235 0.88235 0.88235 0.88627 0.88627 0.88627 0.88627 0.89020 0.89020 0.89020 0.89020 0.89412 0.89412 0.89412 0.89412 0.89804 0.89804 0.89804 0.89804 0.90196 0.90196 0.90196 0.90196 0.90588 0.90588 0.90588 0.90588 0.90980 0.90980 0.90980 0.90980 0.91373 0.91373 0.91373 0.91373 0.91765 0.91765 0.91765 0.91765 0.92157 0.92157 0.92157 0.92157 0.92549 0.92549 0.92549 0.92549 0.92941 0.92941 0.92941 0.92941 0.93333 0.93333 0.93333 0.93333 0.93725 0.93725 0.93725 0.93725 0.94118 0.94118 0.94118 0.94118 0.94510 0.94510 0.94510 0.94510 0.94902 0.94902 0.94902 0.94902 0.95294 0.95294 0.95294 0.95294 0.95686 0.95686 0.95686 0.95686 0.96078 0.96078 0.96078 0.96078 0.96471 0.96471 0.96471 0.96471 0.96863 0.96863 0.96863 0.96863 0.97255 0.97255 0.97255 0.97255 0.97647 0.97647 0.97647 0.97647 0.98039 0.98039 0.98039 0.98039 0.98431 0.98431 0.98431 0.98431 0.98824 0.98824 0.98824 0.98824 0.99216 0.99216 0.99216 0.99216 0.99608 0.99608 0.99608 0.99608 1.00000 1.00000 1.00000 1.00000 END_DATA sf32%D3֮? e wdescResolveDisplayCAL-3.1.0.0/DisplayCAL/profile_loader.py0000644000076500000000000011221712653526636021001 0ustar devwheel00000000000000#!/usr/bin/env python2 # -*- coding: utf-8 -*- """ Set ICC profiles and load calibration curves for all configured display devices """ import os import sys import threading import time from meta import VERSION, VERSION_BASE, name as appname, version, version_short class ProfileLoader(object): def __init__(self): import config from config import appbasename from wxwindows import BaseApp, wx if not wx.GetApp(): app = BaseApp(0) else: app = None self.reload_count = 0 self.lock = threading.Lock() self.monitoring = True self.monitors = [] self.devices2profiles = {} self._skip = "--skip" in sys.argv[1:] self._manual_restore = config.getcfg("profile.load_on_login") self._reset_gamma_ramps = config.getcfg("profile_loader.reset_gamma_ramps") self._known_apps = set([known_app.lower() for known_app in config.defaults["profile_loader.known_apps"].split(";") + config.getcfg("profile_loader.known_apps").split(";")]) self._known_window_classes = set(config.defaults["profile_loader.known_window_classes"].split(";") + config.getcfg("profile_loader.known_window_classes").split(";")) self._madvr_instances = [] self._timestamp = time.time() self.__other_component = None self.__other_isrunning = False apply_profiles = ("--force" in sys.argv[1:] or config.getcfg("profile.load_on_login")) ##if (sys.platform == "win32" and not "--force" in sys.argv[1:] and ##sys.getwindowsversion() >= (6, 1)): ##from util_win import calibration_management_isenabled ##if calibration_management_isenabled(): ### Incase calibration loading is handled by Windows 7 and ### isn't forced ##apply_profiles = False if (sys.platform != "win32" and apply_profiles and not self._skip and not os.path.isfile(os.path.join(config.confighome, appbasename + ".lock")) and not self._is_other_running(True)): self.apply_profiles_and_warn_on_error() if sys.platform == "win32": # We create a TSR tray program only under Windows. # Linux has colord/Oyranos and respective session daemons should # take care of calibration loading import ctypes import localization as lang import madvr from log import safe_print from util_str import safe_unicode from util_win import (calibration_management_isenabled, get_display_devices) from wxwindows import BaseFrame class PLFrame(BaseFrame): def __init__(self, pl): BaseFrame.__init__(self, None) self.pl = pl self.Bind(wx.EVT_CLOSE, pl.exit) def get_commands(self): return self.get_common_commands() + ["apply-profiles"] def process_data(self, data): if data[0] == "apply-profiles" and len(data) == 1: if (not "--force" in sys.argv[1:] and calibration_management_isenabled()): return lang.getstr("calibration.load.handled_by_os") if (os.path.isfile(os.path.join(config.confighome, appbasename + ".lock")) or self.pl._is_other_running()): return "forbidden" else: self.pl._manual_restore = True return "ok" return "invalid" self.frame = PLFrame(self) class TaskBarIcon(wx.TaskBarIcon): def __init__(self, pl): super(TaskBarIcon, self).__init__() self.pl = pl self.balloon_text = None bitmap = config.geticon(16, appname + "-apply-profiles") icon = wx.EmptyIcon() icon.CopyFromBitmap(bitmap) self._active_icon = icon # Use Rec. 709 luma coefficients to convert to grayscale image = bitmap.ConvertToImage().ConvertToGreyscale(.2126, .7152, .0722) icon = wx.EmptyIcon() icon.CopyFromBitmap(image.ConvertToBitmap()) self._inactive_icon = icon self._active_icon_reset = config.get_bitmap_as_icon(16, appname + "-apply-profiles-reset") self.set_visual_state(True) self.Bind(wx.EVT_TASKBAR_LEFT_DOWN, self.on_left_down) def CreatePopupMenu(self): # Popup menu appears on right-click menu = wx.Menu() if (os.path.isfile(os.path.join(config.confighome, appbasename + ".lock")) or self.pl._is_other_running()): restore_auto = restore_manual = reset = None else: restore_manual = self.pl._set_manual_restore restore_auto = self.set_auto_restore reset = self.pl._set_reset_gamma_ramps fix = len(self.pl.monitors) > 1 for i, (display, edid, moninfo) in enumerate(self.pl.monitors): displays = get_display_devices(moninfo["Device"]) if len(displays) > 1: fix = True break if fix: fix = self.pl._toggle_fix_profile_associations for (label, method, kind, option, oxform) in (("calibration.load_from_display_profiles", restore_manual, wx.ITEM_RADIO, "profile_loader.reset_gamma_ramps", lambda v: not v), ("calibration.reset", reset, wx.ITEM_RADIO, "profile_loader.reset_gamma_ramps", None), ("-", None, False, None, None), ("calibration.preserve", restore_auto, wx.ITEM_CHECK, "profile.load_on_login", None), ("profile_loader.fix_profile_associations", fix, wx.ITEM_CHECK, "profile_loader.fix_profile_associations", None), ("-", None, False, None, None), ("menuitem.quit", self.pl.exit, False, None, None)): if label == "-": menu.AppendSeparator() else: item = wx.MenuItem(menu, -1, lang.getstr(label), kind=kind) if not method: item.Enable(False) else: menu.Bind(wx.EVT_MENU, method, id=item.Id) menu.AppendItem(item) if kind != wx.ITEM_NORMAL: if (option == "profile.load_on_login" and "--force" in sys.argv[1:]): item.Check(True) else: if not oxform: oxform = bool item.Check(oxform(config.getcfg(option))) return menu def on_left_down(self, event): self.show_balloon() def set_auto_restore(self, event): config.setcfg("profile.load_on_login", int(event.IsChecked())) self.set_visual_state() def set_visual_state(self, enumerate_windows_and_processes=False): if self.pl._should_apply_profiles(enumerate_windows_and_processes): if self.pl._reset_gamma_ramps: icon = self._active_icon_reset else: icon = self._active_icon else: icon = self._inactive_icon self.SetIcon(icon, self.pl.get_title()) def show_balloon(self, text=None, sticky=False): if wx.VERSION < (3, ): return if sticky: self.balloon_text = text elif text: self.balloon_text = None else: text = self.balloon_text if not text: if (not "--force" in sys.argv[1:] and calibration_management_isenabled()): text = lang.getstr("calibration.load.handled_by_os") + "\n" else: text = "" text += lang.getstr("profile_loader.info", self.pl.reload_count) self.ShowBalloon(self.pl.get_title(), text, 100) self.taskbar_icon = TaskBarIcon(self) try: self.gdi32 = ctypes.windll.gdi32 self.gdi32.GetDeviceGammaRamp.restype = ctypes.c_bool self.gdi32.SetDeviceGammaRamp.restype = ctypes.c_bool except Exception, exception: self.gdi32 = None safe_print(exception) self.taskbar_icon.show_balloon(safe_unicode(exception)) try: self.madvr = madvr.MadTPG() except Exception, exception: safe_print(exception) if safe_unicode(exception) != lang.getstr("madvr.not_found"): self.taskbar_icon.show_balloon(safe_unicode(exception)) else: self.madvr.add_connection_callback(self._madvr_connection_callback, None, "madVR") self.madvr.add_connection_callback(self._madvr_connection_callback, None, "madTPG") self.madvr.listen() self.madvr.announce() self.frame.listen() self._check_display_conf_thread = threading.Thread(target=self._check_display_conf, name="DisplayConfigurationMonitoring") self._check_display_conf_thread.start() if app: app.MainLoop() def apply_profiles(self, event=None, index=None): import config import localization as lang from log import safe_print from util_os import which from worker import Worker, get_argyll_util if sys.platform == "win32": self.lock.acquire() worker = Worker() errors = [] if sys.platform == "win32": separator = "-" else: separator = "=" safe_print(separator * 80) safe_print(lang.getstr("calibration.loading_from_display_profile")) # dispwin sets the _ICC_PROFILE(_n) root window atom, per-output xrandr # _ICC_PROFILE property (if xrandr is working) and loads the vcgt for the # requested screen (ucmm backend using color.jcnf), and has to be called # multiple times to setup multiple screens. # # If there is no profile configured in ucmm for the requested screen (or # ucmm support has been removed, like in the Argyll CMS versions shipped by # recent Fedora releases), it falls back to a possibly existing per-output # xrandr _ICC_PROFILE property (if xrandr is working) or _ICC_PROFILE(_n) # root window atom. dispwin = get_argyll_util("dispwin") if index is None: if dispwin: worker.enumerate_displays_and_ports(silent=True, check_lut_access=False, enumerate_ports=False, include_network_devices=False) self.monitors = [] if sys.platform == "win32" and worker.displays: self._enumerate_monitors() else: errors.append(lang.getstr("argyll.util.not_found", "dispwin")) if sys.platform != "win32": # gcm-apply sets the _ICC_PROFILE root window atom for the first screen, # per-output xrandr _ICC_PROFILE properties (if xrandr is working) and # loads the vcgt for all configured screens (device-profiles.conf) # NOTE: gcm-apply is no longer part of GNOME Color Manager since the # introduction of colord as it's no longer needed gcm_apply = which("gcm-apply") if gcm_apply: worker.exec_cmd(gcm_apply, capture_output=True, skip_scripts=True, silent=False) # oyranos-monitor sets _ICC_PROFILE(_n) root window atoms (oyranos # db backend) and loads the vcgt for all configured screens when # xcalib is installed oyranos_monitor = which("oyranos-monitor") xcalib = which("xcalib") self.profile_associations = {} results = [] for i, display in enumerate([display.replace("[PRIMARY]", lang.getstr("display.primary")) for display in worker.displays]): if config.is_virtual_display(i) or (index is not None and i != index): continue # Load profile and set vcgt if sys.platform != "win32" and oyranos_monitor: display_conf_oy_compat = worker.check_display_conf_oy_compat(i + 1) if display_conf_oy_compat: worker.exec_cmd(oyranos_monitor, ["-x", str(worker.display_rects[i][0]), "-y", str(worker.display_rects[i][1])], capture_output=True, skip_scripts=True, silent=False) if dispwin: profile_arg = worker.get_dispwin_display_profile_argument(i) if os.path.isabs(profile_arg) and os.path.isfile(profile_arg): mtime = os.stat(profile_arg).st_mtime else: mtime = 0 self.profile_associations[i] = (os.path.basename(profile_arg), mtime) if (sys.platform == "win32" or not oyranos_monitor or not display_conf_oy_compat or not xcalib or profile_arg == "-L"): # Only need to run dispwin if under Windows, or if nothing else # has already taken care of display profile and vcgt loading # (e.g. oyranos-monitor with xcalib, or colord) if worker.exec_cmd(dispwin, ["-v", "-d%i" % (i + 1), profile_arg], capture_output=True, skip_scripts=True, silent=False): errortxt = "" else: errortxt = "\n".join(worker.errors).strip() if errortxt and ((not "using linear" in errortxt and not "assuming linear" in errortxt) or len(errortxt.split("\n")) > 1): if "Failed to get the displays current ICC profile" in errortxt: # Maybe just not configured continue elif sys.platform == "win32" or \ "Failed to set VideoLUT" in errortxt or \ "We don't have access to the VideoLUT" in errortxt: errstr = lang.getstr("calibration.load_error") else: errstr = lang.getstr("profile.load_error") errors.append(": ".join([display, errstr])) continue else: results.append(display) if (config.getcfg("profile_loader.verify_calibration") or "--verify" in sys.argv[1:]): # Verify the calibration was actually loaded worker.exec_cmd(dispwin, ["-v", "-d%i" % (i + 1), "-V", profile_arg], capture_output=True, skip_scripts=True, silent=False) # The 'NOT loaded' message goes to stdout! # Other errors go to stderr errortxt = "\n".join(worker.errors + worker.output).strip() if "NOT loaded" in errortxt or \ "We don't have access to the VideoLUT" in errortxt: errors.append(": ".join([display, lang.getstr("calibration.load_error")])) if sys.platform == "win32": self.lock.release() if event: self.notify(results, errors) return errors def notify(self, results, errors, sticky=False): from wxwindows import wx if results: import localization as lang self.reload_count += 1 if self._reset_gamma_ramps: lstr = "calibration.reset_success" else: lstr = "calibration.load_success" results.insert(0, lang.getstr(lstr)) results.extend(errors) wx.CallAfter(lambda: self and self.taskbar_icon.set_visual_state()) wx.CallAfter(lambda text, sticky: self and self.taskbar_icon.show_balloon(text, sticky), "\n".join(results), sticky) def apply_profiles_and_warn_on_error(self, event=None, index=None): errors = self.apply_profiles(event, index) import config if (errors and (config.getcfg("profile_loader.error.show_msg") or "--error-dialog" in sys.argv[1:]) and not "--silent" in sys.argv[1:]): import localization as lang from wxwindows import InfoDialog, wx dlg = InfoDialog(None, msg="\n".join(errors), title=self.get_title(), ok=lang.getstr("ok"), bitmap=config.geticon(32, "dialog-error"), show=False) dlg.SetIcons(config.get_icon_bundle([256, 48, 32, 16], appname + "-apply-profiles")) dlg.do_not_show_again_cb = wx.CheckBox(dlg, -1, lang.getstr("dialog.do_not_show_again")) dlg.do_not_show_again_cb.SetValue(not bool(config.getcfg("profile_loader.error.show_msg"))) def do_not_show_again_handler(event=None): config.setcfg("profile_loader.error.show_msg", int(not dlg.do_not_show_again_cb.GetValue())) config.writecfg(module="apply-profiles", options=("argyll.dir", "profile.load_on_login", "profile_loader")) dlg.do_not_show_again_cb.Bind(wx.EVT_CHECKBOX, do_not_show_again_handler) dlg.sizer3.Add(dlg.do_not_show_again_cb, flag=wx.TOP, border=12) dlg.sizer0.SetSizeHints(dlg) dlg.sizer0.Layout() dlg.Center(wx.BOTH) dlg.ok.SetDefault() dlg.ShowModalThenDestroy() def exit(self, event=None): from util_win import calibration_management_isenabled from wxwindows import ConfirmDialog, wx import config if (self.frame and event.GetEventType() == wx.EVT_MENU.typeId and not calibration_management_isenabled()): import localization as lang from wxwindows import ConfirmDialog, wx dlg = ConfirmDialog(None, msg=lang.getstr("profile_loader.exit_warning"), title=self.get_title(), ok=lang.getstr("menuitem.quit"), bitmap=config.geticon(32, "dialog-warning")) dlg.SetIcons(config.get_icon_bundle([256, 48, 32, 16], appname + "-apply-profiles")) result = dlg.ShowModal() dlg.Destroy() if result != wx.ID_OK: return self.frame.Close() return config.writecfg(module="apply-profiles", options=("argyll.dir", "profile.load_on_login", "profile_loader")) self.taskbar_icon and self.taskbar_icon.Destroy() self.monitoring = False event.Skip() def get_title(self): import localization as lang title = "%s %s %s" % (appname, lang.getstr("profile_loader").title(), version_short) if VERSION > VERSION_BASE: title += " Beta" if "--force" in sys.argv[1:]: title += " (%s)" % lang.getstr("forced") return title def _check_display_conf(self): import ctypes import struct import _winreg import win32gui import config from config import appbasename, getcfg import ICCProfile as ICCP from wxwindows import wx import localization as lang from log import safe_print from util_win import get_active_display_device display = None current_display = None current_timestamp = 0 first_run = True self.profile_associations = {} self.profiles = {} displaycal_lockfile = os.path.join(config.confighome, appbasename + ".lock") displaycal_running = os.path.isfile(displaycal_lockfile) while self and self.monitoring: results = [] errors = [] apply_profiles = self._should_apply_profiles() # Check if display configuration changed try: key = _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE, r"SYSTEM\CurrentControlSet\Control\GraphicsDrivers\Configuration") except WindowsError: key = None numsubkeys = 0 if not self.monitors: self._enumerate_monitors() else: numsubkeys, numvalues, mtime = _winreg.QueryInfoKey(key) for i in xrange(numsubkeys): subkey = _winreg.OpenKey(key, _winreg.EnumKey(key, i)) display = _winreg.QueryValueEx(subkey, "SetId")[0] timestamp = struct.unpack(" current_timestamp: if display != current_display: if not first_run and apply_profiles: safe_print(lang.getstr("display_detected")) # One second delay to allow display configuration # to settle time.sleep(1) if not first_run or not self.monitors: self._enumerate_monitors() if getcfg("profile_loader.fix_profile_associations"): # Work-around long-standing bug in applications # querying the monitor profile not making sure # to use the active display (this affects Windows # itself as well) when only one display is # active in a multi-monitor setup. if not first_run: self._reset_display_profile_associations() self._set_display_profiles() current_display = display current_timestamp = timestamp _winreg.CloseKey(subkey) if key: _winreg.CloseKey(key) # Check profile associations if apply_profiles or first_run: for i, (display, edid, moninfo) in enumerate(self.monitors): try: profile_path = ICCP.get_display_profile(i, path_only=True) except IndexError: break except: continue if not profile_path: continue profile = os.path.basename(profile_path) if os.path.isfile(profile_path): mtime = os.stat(profile_path).st_mtime else: mtime = 0 if self.profile_associations.get(i) != (profile, mtime): if not first_run: device = get_active_display_device(moninfo["Device"]) if not device: continue safe_print(lang.getstr("display_detected")) safe_print(display, "->", profile) display_edid = get_display_name_edid(device, moninfo) self.devices2profiles[device.DeviceKey] = (display_edid, profile) self.profile_associations[i] = (profile, mtime) self.profiles[profile] = None # Check video card gamma table and (re)load calibration if # necessary if not apply_profiles or not self.gdi32: continue vcgt_values = ([], [], []) if not self._reset_gamma_ramps: # Get display profile if not self.profiles.get(profile): try: self.profiles[profile] = ICCP.ICCProfile(profile) self.profiles[profile].tags.get("vcgt") except Exception, exception: continue profile = self.profiles[profile] if isinstance(profile.tags.get("vcgt"), ICCP.VideoCardGammaType): # Get display profile vcgt vcgt_values = profile.tags.vcgt.get_values()[:3] if len(vcgt_values[0]) != 256: # Hmm. Do we need to deal with this? # I've never seen table-based vcgt with != 256 entries if (not self._reset_gamma_ramps and self._manual_restore and profile.tags.get("vcgt")): safe_print(lang.getstr("calibration.loading_from_display_profile")) safe_print(display) safe_print(lang.getstr("vcgt.unknown_format", os.path.basename(profile.fileName))) safe_print(lang.getstr("failure")) results.append(display) errors.append(lang.getstr("vcgt.unknown_format", os.path.basename(profile.fileName))) # Fall back to linear calibration tagData = "vcgt" tagData += "\0" * 4 # Reserved tagData += "\0\0\0\x01" # Formula type for channel in xrange(3): tagData += "\0\x01\0\0" # Gamma 1.0 tagData += "\0" * 4 # Min 0.0 tagData += "\0\x01\0\0" # Max 1.0 vcgt = ICCP.VideoCardGammaFormulaType(tagData, "vcgt") vcgt_values = vcgt.get_values()[:3] values = ([], [], []) if not self._manual_restore: # Get video card gamma ramp hdc = win32gui.CreateDC(moninfo["Device"], None, None) ramp = ((ctypes.c_ushort * 256) * 3)() try: result = self.gdi32.GetDeviceGammaRamp(hdc, ramp) except: continue finally: win32gui.DeleteDC(hdc) if not result: continue # Get ramp values for j, channel in enumerate(ramp): for k, v in enumerate(channel): values[j].append([float(k), v]) # Check if video card matches profile vcgt if values == vcgt_values: continue # Reload calibration. # Convert vcgt to ushort_Array_256_Array_3 vcgt_ramp = ((ctypes.c_ushort * 256) * 3)() for j in xrange(len(vcgt_values[0])): for k in xrange(3): vcgt_ramp[k][j] = vcgt_values[k][j][1] if not self._manual_restore: safe_print(lang.getstr("vcgt.mismatch", display)) # Try and prevent race condition with madVR # launching and resetting video card gamma table apply_profiles = self._should_apply_profiles() if not apply_profiles: break # Now actually reload or reset calibration if self._reset_gamma_ramps: safe_print(lang.getstr("calibration.resetting")) safe_print(display) else: safe_print(lang.getstr("calibration.loading_from_display_profile")) safe_print(display, "->", os.path.basename(profile.fileName)) hdc = win32gui.CreateDC(moninfo["Device"], None, None) try: result = self.gdi32.SetDeviceGammaRamp(hdc, vcgt_ramp) except Exception, exception: result = exception finally: win32gui.DeleteDC(hdc) if isinstance(result, Exception) or not result: if result: safe_print(result) safe_print(lang.getstr("failure")) errstr = lang.getstr("calibration.load_error") errors.append(": ".join([display, errstr])) else: safe_print(lang.getstr("success")) results.append(display) self._manual_restore = False first_run = False timestamp = time.time() localtime = list(time.localtime(self._timestamp)) localtime[3:6] = 23, 59, 59 midnight = time.mktime(localtime) + 1 if timestamp >= midnight: self.reload_count = 0 self._timestamp = timestamp if results or errors: self.notify(results, errors) else: if displaycal_running != self._displaycal_running: if displaycal_running: msg = lang.getstr("app.detection_lost.calibration_loading_enabled", appname) else: msg = lang.getstr("app.detected.calibration_loading_disabled", appname) displaycal_running = self._displaycal_running safe_print(msg) self.notify([], [msg], displaycal_running) # Wait three seconds timeout = 0 while self and self.monitoring: time.sleep(.1) timeout += .1 if timeout > 2.9 or self._manual_restore: break if getcfg("profile_loader.fix_profile_associations"): self._reset_display_profile_associations() safe_print("Display configuration monitoring thread finished") def _enumerate_monitors(self): from util_win import (get_active_display_device, get_real_display_devices_info) self.monitors = [] for i, moninfo in enumerate(get_real_display_devices_info()): # Get monitor descriptive string device = get_active_display_device(moninfo["Device"]) display, edid = get_display_name_edid(device, moninfo) self.monitors.append((display, edid, moninfo)) def _enumerate_windows_callback(self, hwnd, extra): import win32gui cls = win32gui.GetClassName(hwnd) if cls == "madHcNetQueueWindow" or self._is_known_window_class(cls): import pywintypes import win32process from util_win import get_process_filename try: thread_id, pid = win32process.GetWindowThreadProcessId(hwnd) filename = get_process_filename(pid) except pywintypes.error: return from config import exe basename = os.path.basename(filename) if (basename.lower() != "madhcctrl.exe" and filename.lower() != exe.lower()): self.__other_isrunning = True self.__other_component = os.path.splitext(basename)[0] def _is_known_window_class(self, cls): for partial in self._known_window_classes: if partial in cls: return True def _is_other_running(self, enumerate_windows_and_processes=True): """ Determine if other software that may be using the videoLUT is in use (e.g. madVR video playback, madTPG, other calibration software) """ if sys.platform != "win32": return if len(self._madvr_instances): self.__other_isrunning = True return True if enumerate_windows_and_processes: # At launch, we won't be able to determine if madVR is running via # the callback API, and we can only determine if another # calibration solution is running by enumerating windows and # processes anyway. import pywintypes import win32gui import winerror from log import safe_print from util_win import get_process_filename, get_pids other_isrunning = self.__other_isrunning self.__other_isrunning = False # Look for known window classes # Performance on C2D 3.16 GHz (Win7 x64, ~ 90 processes): ~ 1ms try: win32gui.EnumWindows(self._enumerate_windows_callback, None) except pywintypes.error, exception: safe_print("Enumerating windows failed:", exception) if not self.__other_isrunning: # Look for known processes # Performance on C2D 3.16 GHz (Win7 x64, ~ 90 processes): # ~ 6-9ms (1ms to get PIDs) try: pids = get_pids() except WindowsError, exception: safe_print("Enumerating processes failed:", exception) else: for pid in pids: try: filename = get_process_filename(pid) except (WindowsError, pywintypes.error), exception: if exception.args[0] not in (winerror.ERROR_ACCESS_DENIED, winerror.ERROR_PARTIAL_COPY, winerror.ERROR_INVALID_PARAMETER, winerror.ERROR_GEN_FAILURE): safe_print("Couldn't get filename of " "process %s:" % pid, exception) continue basename = os.path.basename(filename) if basename.lower() in self._known_apps: self.__other_isrunning = True self.__other_component = os.path.splitext(basename)[0] break if other_isrunning != self.__other_isrunning: import localization as lang if other_isrunning: lstr = "app.detection_lost.calibration_loading_enabled" else: lstr = "app.detected.calibration_loading_disabled" msg = lang.getstr(lstr, self.__other_component) safe_print(msg) self.notify([], [msg], not other_isrunning) return self.__other_isrunning def _madvr_connection_callback(self, param, connection, ip, pid, module, component, instance, is_new_instance): with self.lock: import localization as lang from log import safe_print if ip in ("127.0.0.1", "localhost", "::1", "0:0:0:0:0:0:0:1"): args = (param, connection, ip, pid, module, component, instance) if is_new_instance: apply_profiles = self._should_apply_profiles() self._madvr_instances.append(args) if apply_profiles: msg = lang.getstr("app.detected.calibration_loading_disabled", component) safe_print(msg) self.notify([], [msg], True) elif args in self._madvr_instances: self._madvr_instances.remove(args) if self._should_apply_profiles(): msg = lang.getstr("app.detection_lost.calibration_loading_enabled", component) safe_print(msg) self.notify([], [msg]) def _reset_display_profile_associations(self): import ICCProfile as ICCP from log import safe_print for devicekey, (display_edid, profile) in self.devices2profiles.iteritems(): if profile: try: current_profile = ICCP.get_display_profile(path_only=True, devicekey=devicekey) except Exception, exception: safe_print(exception) continue if not current_profile: continue current_profile = os.path.basename(current_profile) if current_profile and current_profile != profile: safe_print("Resetting profile association for %s:" % display_edid[0], current_profile, "->", profile) ICCP.set_display_profile(profile, devicekey=devicekey) def _set_display_profiles(self, dry_run=False): import win32api import ICCProfile as ICCP from log import safe_print from util_win import get_active_display_device, get_display_devices self.devices2profiles = {} for i, (display, edid, moninfo) in enumerate(self.monitors): active_device = get_active_display_device(moninfo["Device"]) for device in get_display_devices(moninfo["Device"]): try: profile = ICCP.get_display_profile(path_only=True, devicekey=device.DeviceKey) except Exception, exception: safe_print(exception) profile = None if profile: profile = os.path.basename(profile) if device.DeviceID == active_device.DeviceID: active_moninfo = moninfo else: active_moninfo = None display_edid = get_display_name_edid(device, active_moninfo) self.devices2profiles[device.DeviceKey] = (display_edid, profile) # Set the active profile device = active_device if not device: continue try: correct_profile = ICCP.get_display_profile(path_only=True, devicekey=device.DeviceKey) except Exception, exception: safe_print(exception) continue if correct_profile: correct_profile = os.path.basename(correct_profile) device = win32api.EnumDisplayDevices(moninfo["Device"], 0) current_profile = self.devices2profiles[device.DeviceKey][1] if (correct_profile and current_profile != correct_profile and not dry_run): safe_print("Fixing profile association for %s:" % display, current_profile, "->", correct_profile) ICCP.set_display_profile(os.path.basename(correct_profile), devicekey=device.DeviceKey) def _set_manual_restore(self, event): from config import setcfg setcfg("profile_loader.reset_gamma_ramps", 0) self._manual_restore = True self._reset_gamma_ramps = False def _set_reset_gamma_ramps(self, event): from config import setcfg setcfg("profile_loader.reset_gamma_ramps", 1) self._manual_restore = True self._reset_gamma_ramps = True def _should_apply_profiles(self, enumerate_windows_and_processes=True): import config from config import appbasename from util_win import calibration_management_isenabled displaycal_lockfile = os.path.join(config.confighome, appbasename + ".lock") self._displaycal_running = os.path.isfile(displaycal_lockfile) return (("--force" in sys.argv[1:] or self._manual_restore or (config.getcfg("profile.load_on_login") and not calibration_management_isenabled())) and not self._displaycal_running and not self._is_other_running(enumerate_windows_and_processes)) def _toggle_fix_profile_associations(self, event): from config import (get_default_dpi, get_icon_bundle, getcfg, geticon, setcfg) if event.IsChecked(): import ICCProfile as ICCP import localization as lang from colord import device_id_from_edid from wxwindows import ConfirmDialog, wx self._set_display_profiles(dry_run=True) dlg = ConfirmDialog(None, msg=lang.getstr("profile_loader.fix_profile_associations_warning"), title=self.get_title(), ok=lang.getstr("profile_loader.fix_profile_associations"), bitmap=geticon(32, "dialog-warning"), wrap=128) dlg.SetIcons(get_icon_bundle([256, 48, 32, 16], appname + "-apply-profiles")) numdisp = len(self.devices2profiles) scale = getcfg("app.dpi") / get_default_dpi() if scale < 1: scale = 1 list_panel = wx.Panel(dlg, -1) list_panel.BackgroundColour = wx.SystemSettings.GetColour(wx.SYS_COLOUR_3DLIGHT) list_panel.Sizer = wx.BoxSizer(wx.HORIZONTAL) hscroll = wx.SystemSettings_GetMetric(wx.SYS_HSCROLL_Y) list_ctrl = wx.ListCtrl(list_panel, -1, size=(640 * scale, (20 * numdisp + 25 + hscroll) * scale), style=wx.LC_REPORT | wx.LC_SINGLE_SEL | wx.BORDER_THEME, name="displays2profiles") list_panel.Sizer.Add(list_ctrl, 1, flag=wx.ALL, border=1) list_ctrl.InsertColumn(0, lang.getstr("display")) list_ctrl.InsertColumn(1, lang.getstr("profile")) list_ctrl.SetColumnWidth(0, int(200 * scale)) list_ctrl.SetColumnWidth(1, int(420 * scale)) for i, (display_edid, profile) in enumerate(self.devices2profiles.itervalues()): index = list_ctrl.InsertStringItem(i, "") list_ctrl.SetStringItem(index, 0, display_edid[0]) list_ctrl.SetStringItem(index, 1, profile) try: profile = ICCP.ICCProfile(profile) except (IOError, ICCP.ICCProfileInvalidError), exception: pass else: if isinstance(profile.tags.get("meta"), ICCP.DictType): # Check if profile mapping makes sense id = device_id_from_edid(display_edid[1]) if profile.tags.meta.getvalue("MAPPING_device_id") != id: list_ctrl.SetItemTextColour(index, "#FF8000") # Ignore item focus/selection list_ctrl.Bind(wx.EVT_LIST_ITEM_FOCUSED, lambda e: list_ctrl.SetItemState(e.GetIndex(), 0, wx.LIST_STATE_FOCUSED)) list_ctrl.Bind(wx.EVT_LIST_ITEM_SELECTED, lambda e: list_ctrl.SetItemState(e.GetIndex(), 0, wx.LIST_STATE_SELECTED)) dlg.sizer3.Insert(0, list_panel, 1, flag=wx.BOTTOM | wx.ALIGN_LEFT, border=12) dlg.sizer0.SetSizeHints(dlg) dlg.sizer0.Layout() result = dlg.ShowModal() dlg.Destroy() if result != wx.ID_OK: return setcfg("profile_loader.fix_profile_associations", int(event.IsChecked())) if event.IsChecked(): self._set_display_profiles() else: self._reset_display_profile_associations() def get_display_name_edid(device, moninfo=None): import localization as lang from edid import get_edid from util_str import safe_unicode if device: display = safe_unicode(device.DeviceString) else: display = lang.getstr("unknown") try: edid = get_edid(device=device) except Exception, exception: edid = {} display = edid.get("monitor_name", display) if moninfo: m_left, m_top, m_right, m_bottom = moninfo["Monitor"] m_width = m_right - m_left m_height = m_bottom - m_top display = " @ ".join([display, "%i, %i, %ix%i" % (m_left, m_top, m_width, m_height)]) else: display = "%s (%s)" % (display, lang.getstr("deactivated")) return display, edid def main(): unknown_option = None for arg in sys.argv[1:]: if arg not in ("--help", "--force", "--verify", "--silent", "--error-dialog", "-V", "--version", "--skip"): unknown_option = arg break if "--help" in sys.argv[1:] or unknown_option: if unknown_option: print "%s: unrecognized option `%s'" % (os.path.basename(sys.argv[0]), unknown_option) print "Usage: %s [OPTION]..." % os.path.basename(sys.argv[0]) print "Apply profiles to configured display devices and load calibration" print "Version %s" % version print "" print " --help Output this help text and exit" print " --force Force loading of calibration/profile (if it has been" print " disabled in %s.ini)" % appname print " --verify Verify if calibration was loaded correctly" print " --silent Do not show dialog box on error" print " --skip Skip initial loading of calibration" print " --error-dialog Force dialog box on error" print " -V, --version Output version information and exit" elif "-V" in sys.argv[1:] or "--version" in sys.argv[1:]: print "%s %s" % (os.path.basename(sys.argv[0]), version) else: import config config.initcfg("apply-profiles") if (not "--force" in sys.argv[1:] and not config.getcfg("profile.load_on_login") and sys.platform != "win32"): # Early exit incase profile loading has been disabled and isn't forced sys.exit() if "--error-dialog" in sys.argv[1:]: config.setcfg("profile_loader.error.show_msg", 1) config.writecfg(module="apply-profiles", options=("argyll.dir", "profile.load_on_login", "profile_loader")) import localization as lang lang.init() ProfileLoader() if __name__ == "__main__": main() DisplayCAL-3.1.0.0/DisplayCAL/pyi_md5pickuphelper.py0000644000076500000000000000045112647526531021766 0ustar devwheel00000000000000# -*- coding: utf-8 -*- from sys import platform if platform not in ("darwin", "win32"): try: import _md5 except ImportError: _md5 = None try: from hashlib import md5 except ImportError, exception: if platform not in ("darwin", "win32") and _md5: md5 = _md5 else: raise exceptionDisplayCAL-3.1.0.0/DisplayCAL/quirk.json0000644000076500000000000000371312647526531017464 0ustar devwheel00000000000000// From colord/lib/colord/cd_quirk.c, cd_quirk_vendor_name { "suffixes": [ "Co.", "Co", "Inc.", "Inc", "Ltd.", "Ltd", "Corporation", "Incorporated", "Limited", "GmbH", "corp." ], "vendor_names": { "Acer, inc.": "Acer", "Acer Technologies": "Acer", "AOC Intl": "AOC", "Apple Computer Inc": "Apple", "Arnos Insturments & Computer Systems": "Arnos", "ASUSTeK Computer Inc.": "ASUSTeK", "ASUSTeK Computer INC": "ASUSTeK", "ASUSTeK COMPUTER INC.": "ASUSTeK", "BTC Korea Co., Ltd": "BTC", "CASIO COMPUTER CO.,LTD": "Casio", "CLEVO": "Clevo", "Delta Electronics": "Delta", "Eizo Nanao Corporation": "Eizo", "Envision Peripherals,": "Envision", "FUJITSU": "Fujitsu", "Fujitsu Siemens Computers GmbH": "Fujitsu Siemens", "Funai Electric Co., Ltd.": "Funai", "Gigabyte Technology Co., Ltd.": "Gigabyte", "Goldstar Company Ltd": "LG", "Hewlett-Packard": "Hewlett Packard", "Hitachi America Ltd": "Hitachi", "HP": "Hewlett Packard", "HWP": "Hewlett Packard", "IBM France": "IBM", "Lenovo Group Limited": "Lenovo", "LENOVO": "Lenovo", "Iiyama North America": "Iiyama", "MARANTZ JAPAN, INC.": "Marantz", "Mitsubishi Electric Corporation": "Mitsubishi", "Nexgen Mediatech Inc.,": "Nexgen Mediatech", "NIKON": "Nikon", "Panasonic Industry Company": "Panasonic", "Philips Consumer Electronics Company": "Philips", "RGB Systems, Inc. dba Extron Electronics": "Extron", "SAM": "Samsung", "Samsung Electric Company": "Samsung", "Samsung Electronics America": "Samsung", "samsung": "Samsung", "SAMSUNG": "Samsung", "Sanyo Electric Co.,Ltd.": "Sanyo", "Sonix Technology Co.": "Sonix", "System manufacturer": "Unknown", "To Be Filled By O.E.M.": "Unknown", "Toshiba America Info Systems Inc": "Toshiba", "Toshiba Matsushita Display Technology Co.,": "Toshiba", "TOSHIBA": "Toshiba", "Unknown vendor": "Unknown", "Westinghouse Digital Electronics": "Westinghouse Digital", "Zalman Tech Co., Ltd.": "Zalman" } }DisplayCAL-3.1.0.0/DisplayCAL/RealDisplaySizeMM.c0000644000076500000240000006703612647527045021116 0ustar devstaff00000000000000#include "Python.h" #include #include #include #include #include #include #include #ifdef NT # include # include #else # include # include # include #endif #ifdef __APPLE__ /* Assume OSX Carbon */ # include # include # include #endif /* __APPLE__ */ #if defined(UNIX) && !defined(__APPLE__) # include # include # include # include # include # include # include # include # include #endif /* UNIX */ #if defined(_MSC_VER) # define DLL extern "C" __declspec(dllexport) #else # define DLL #endif #define errout stderr #ifdef DEBUG # define debug(xx) fprintf(errout, xx ) # define debug2(xx) fprintf xx # define debugr(xx) fprintf(errout, xx ) # define debugr2(xx) fprintf xx # define debugrr(xx) fprintf(errout, xx ) # define debugrr2(xx) fprintf xx #else # define debug(xx) # define debug2(xx) # define debugr(xx) # define debugr2(xx) # define debugrr(xx) # define debugrr2(xx) #endif // START disppath /* Structure to store infomation about possible displays */ typedef struct { char *name; /* Display name */ char *description; /* Description of display */ int sx,sy; /* Displays offset in pixels */ int sw,sh; /* Displays width and height in pixels*/ #ifdef NT char monid[128]; /* Monitor ID */ int prim; /* NZ if primary display monitor */ #endif /* NT */ #ifdef __APPLE__ CGDirectDisplayID ddid; #endif /* __APPLE__ */ #if defined(UNIX) && !defined(__APPLE__) int screen; /* Screen to select */ int uscreen; /* Underlying screen */ int rscreen; /* Underlying RAMDAC screen */ #if RANDR_MAJOR == 1 && RANDR_MINOR >= 2 /* Xrandr stuff - output is connected 1:1 to a display */ RRCrtc crtc; /* Associated crtc */ RROutput output; /* Associated output */ #endif /* randr >= V 1.2 */ #endif /* UNIX */ } disppath; // END disppath void free_a_disppath(disppath *path); void free_disppaths(disppath **paths); /* ----------------------------------------------- */ /* Dealing with locating displays */ int callback_ddebug = 0; /* Diagnostic global for get_displays() and get_a_display() */ #ifdef NT #define sleep(secs) Sleep((secs) * 1000) static BOOL CALLBACK MonitorEnumProc( HMONITOR hMonitor, /* handle to display monitor */ HDC hdcMonitor, /* NULL, because EnumDisplayMonitors hdc is NULL */ LPRECT lprcMonitor, /* Virtual screen coordinates of this monitor */ LPARAM dwData /* Context data */ ) { disppath ***pdisps = (disppath ***)dwData; disppath **disps = *pdisps; MONITORINFOEX pmi; int ndisps = 0; debugrr2((errout, "MonitorEnumProc() called with hMonitor = 0x%x\n",hMonitor)); /* Get some more information */ pmi.cbSize = sizeof(MONITORINFOEX); if (GetMonitorInfo(hMonitor, (MONITORINFO *)&pmi) == 0) { debugrr("get_displays failed GetMonitorInfo - ignoring display\n"); return TRUE; } /* See if it seems to be a pseudo-display */ if (strncmp(pmi.szDevice, "\\\\.\\DISPLAYV", 12) == 0) { debugrr("Seems to be invisible pseudo-display - ignoring it\n"); return TRUE; } /* Add the display to the list */ if (disps == NULL) { if ((disps = (disppath **)calloc(sizeof(disppath *), 1 + 1)) == NULL) { debugrr("get_displays failed on malloc\n"); return FALSE; } } else { /* Count current number on list */ for (ndisps = 0; disps[ndisps] != NULL; ndisps++) ; if ((disps = (disppath **)realloc(disps, sizeof(disppath *) * (ndisps + 2))) == NULL) { debugrr("get_displays failed on malloc\n"); return FALSE; } disps[ndisps+1] = NULL; /* End marker */ } if ((disps[ndisps] = calloc(sizeof(disppath),1)) == NULL) { debugrr("get_displays failed on malloc\n"); return FALSE; } if ((disps[ndisps]->name = strdup(pmi.szDevice)) == NULL) { debugrr("malloc failed\n"); return FALSE; } disps[ndisps]->prim = (pmi.dwFlags & MONITORINFOF_PRIMARY) ? 1 : 0; disps[ndisps]->sx = lprcMonitor->left; disps[ndisps]->sy = lprcMonitor->top; disps[ndisps]->sw = lprcMonitor->right - lprcMonitor->left; disps[ndisps]->sh = lprcMonitor->bottom - lprcMonitor->top; disps[ndisps]->description = NULL; debugrr2((errout, "MonitorEnumProc() set initial monitor info: %d,%d %d,%d name '%s'\n",disps[ndisps]->sx,disps[ndisps]->sy,disps[ndisps]->sw,disps[ndisps]->sh, disps[ndisps]->name)); *pdisps = disps; return TRUE; } /* Dynamically linked function support */ BOOL (WINAPI* pEnumDisplayDevices)(PVOID,DWORD,PVOID,DWORD) = NULL; /* See if we can get the wanted function calls */ /* return nz if OK */ static int setup_dyn_calls() { static int dyn_inited = 0; if (dyn_inited == 0) { dyn_inited = 1; /* EnumDisplayDevicesA was left out of lib32.lib on earlier SDK's ... */ pEnumDisplayDevices = (BOOL (WINAPI*)(PVOID,DWORD,PVOID,DWORD)) GetProcAddress(LoadLibrary("USER32"), "EnumDisplayDevicesA"); if (pEnumDisplayDevices == NULL) dyn_inited = 0; } return dyn_inited; } /* Simple up conversion from char string to wchar string */ /* Return NULL if malloc fails */ /* ~~~ Note, should probably replace this with mbstowcs() ???? */ static unsigned short *char2wchar(char *s) { unsigned char *cp; unsigned short *w, *wp; if ((w = malloc(sizeof(unsigned short) * (strlen(s) + 1))) == NULL) return w; for (cp = (unsigned char *)s, wp = w; ; cp++, wp++) { *wp = *cp; /* Zero extend */ if (*cp == 0) break; } return w; } #endif /* NT */ #if defined(UNIX) && !defined(__APPLE__) /* Hack to notice if the error handler has been triggered */ /* when a function doesn't return a value. */ int g_error_handler_triggered = 0; /* A noop X11 error handler */ int null_error_handler(Display *disp, XErrorEvent *ev) { g_error_handler_triggered = 1; return 0; } #endif /* X11 */ /* Return pointer to list of disppath. Last will be NULL. */ /* Return NULL on failure. Call free_disppaths() to free up allocation */ disppath **get_displays() { disppath **disps = NULL; #ifdef NT DISPLAY_DEVICE dd; char buf[200]; int i, j; if (setup_dyn_calls() == 0) { debugrr("Dynamic linking to EnumDisplayDevices or Vista AssociateColorProfile failed\n"); free_disppaths(disps); return NULL; } /* Create an initial list of monitors */ /* (It might be better to call pEnumDisplayDevices(NULL, i ..) instead ??, */ /* then we can use the StateFlags to distingish monitors not attached to the desktop etc.) */ if (EnumDisplayMonitors(NULL, NULL, MonitorEnumProc, (LPARAM)&disps) == 0) { debugrr("EnumDisplayMonitors failed\n"); free_disppaths(disps); return NULL; } /* Now locate detailed information about displays */ for (i = 0; ; i++) { if (disps == NULL || disps[i] == NULL) break; dd.cb = sizeof(dd); debugrr2((errout, "get_displays about to get monitor information for %d\n",i)); /* Get monitor information */ for (j = 0; ;j++) { if ((*pEnumDisplayDevices)(disps[i]->name, j, &dd, 0) == 0) { debugrr2((errout,"EnumDisplayDevices failed on '%s' Mon = %d\n",disps[i]->name,j)); if (j == 0) { strcpy(disps[i]->monid, ""); /* We won't be able to set a profile */ } break; } if (callback_ddebug) { fprintf(errout,"Mon %d, name '%s'\n",j,dd.DeviceName); fprintf(errout,"Mon %d, string '%s'\n",j,dd.DeviceString); fprintf(errout,"Mon %d, flags 0x%x\n",j,dd.StateFlags); fprintf(errout,"Mon %d, id '%s'\n",j,dd.DeviceID); fprintf(errout,"Mon %d, key '%s'\n",j,dd.DeviceKey); } if (j == 0) { strcpy(disps[i]->monid, dd.DeviceID); } } sprintf(buf,"%s, at %d, %d, width %d, height %d%s",disps[i]->name+4, disps[i]->sx, disps[i]->sy, disps[i]->sw, disps[i]->sh, disps[i]->prim ? " (Primary Display)" : ""); if ((disps[i]->description = strdup(buf)) == NULL) { debugrr("get_displays failed on malloc\n"); free_disppaths(disps); return NULL; } debugrr2((errout, "get_displays added description '%s' to display %d\n",disps[i]->description,i)); /* Note that calling EnumDisplayDevices(NULL, j, ..) for the adapter can return other */ /* information, such as the graphics card name, and additional state flags. */ /* EnumDisplaySettings() can also be called to get information such as display depth etc. */ } #ifdef NEVER /* Explore adapter information */ for (j = 0; ; j++) { /* Get adapater information */ if ((*pEnumDisplayDevices)(NULL, j, &dd, 0) == 0) break; printf("Adapt %d, name '%s'\n",j,dd.DeviceName); printf("Adapt %d, string '%s'\n",j,dd.DeviceString); printf("Adapt %d, flags 0x%x\n",j,dd.StateFlags); printf("Adapt %d, id '%s'\n",j,dd.DeviceID); printf("Adapt %d, key '%s'\n",j,dd.DeviceKey); } #endif /* NEVER */ #endif /* NT */ #ifdef __APPLE__ /* Note :- some recent releases of OS X have a feature which */ /* automatically adjusts the screen brigtness with ambient level. */ /* We may have to find a way of disabling this during calibration and profiling. */ /* See the "pset -g" command. */ int i; CGDisplayErr dstat; CGDisplayCount dcount; /* Number of display IDs */ CGDirectDisplayID *dids; /* Array of display IDs */ if ((dstat = CGGetActiveDisplayList(0, NULL, &dcount)) != kCGErrorSuccess || dcount < 1) { debugrr("CGGetActiveDisplayList #1 returned error\n"); return NULL; } if ((dids = (CGDirectDisplayID *)malloc(dcount * sizeof(CGDirectDisplayID))) == NULL) { debugrr("malloc of CGDirectDisplayID's failed\n"); return NULL; } if ((dstat = CGGetActiveDisplayList(dcount, dids, &dcount)) != kCGErrorSuccess) { debugrr("CGGetActiveDisplayList #2 returned error\n"); free(dids); return NULL; } /* Found dcount displays */ debugrr2((errout,"Found %d screens\n",dcount)); /* Allocate our list */ if ((disps = (disppath **)calloc(sizeof(disppath *), dcount + 1)) == NULL) { debugrr("get_displays failed on malloc\n"); free(dids); return NULL; } for (i = 0; i < dcount; i++) { if ((disps[i] = calloc(sizeof(disppath), 1)) == NULL) { debugrr("get_displays failed on malloc\n"); free_disppaths(disps); free(dids); return NULL; } disps[i]->ddid = dids[i]; } /* Got displays, now figure out a description for each one */ for (i = 0; i < dcount; i++) { CGRect dbound; /* Bounding rectangle of chosen display */ io_service_t dport; CFDictionaryRef ddr, pndr; CFIndex dcount; char *dp = NULL, desc[50]; char buf[200]; dbound = CGDisplayBounds(dids[i]); disps[i]->sx = dbound.origin.x; disps[i]->sy = dbound.origin.y; disps[i]->sw = dbound.size.width; disps[i]->sh = dbound.size.height; /* Try and get some information about the display */ if ((dport = CGDisplayIOServicePort(dids[i])) == MACH_PORT_NULL) { debugrr("CGDisplayIOServicePort returned error\n"); free_disppaths(disps); free(dids); return NULL; } #ifdef NEVER { io_name_t name; if (IORegistryEntryGetName(dport, name) != KERN_SUCCESS) { debugrr("IORegistryEntryGetName returned error\n"); free_disppaths(disps); free(dids); return NULL; } printf("Driver %d name = '%s'\n",i,name); } #endif if ((ddr = IODisplayCreateInfoDictionary(dport, 0)) == NULL) { debugrr("IODisplayCreateInfoDictionary returned NULL\n"); free_disppaths(disps); free(dids); return NULL; } if ((pndr = CFDictionaryGetValue(ddr, CFSTR(kDisplayProductName))) == NULL) { debugrr("CFDictionaryGetValue returned NULL\n"); CFRelease(ddr); free_disppaths(disps); free(dids); return NULL; } if ((dcount = CFDictionaryGetCount(pndr)) > 0) { const void **keys; const void **values; int j; keys = (const void **)calloc(sizeof(void *), dcount); values = (const void **)calloc(sizeof(void *), dcount); if (keys == NULL || values == NULL) { if (keys != NULL) free(keys); if (values != NULL) free(values); debugrr("malloc failed\n"); CFRelease(ddr); free_disppaths(disps); free(dids); return NULL; } CFDictionaryGetKeysAndValues(pndr, keys, values); for (j = 0; j < dcount; j++) { const char *k, *v; char kbuf[50], vbuf[50]; k = CFStringGetCStringPtr(keys[j], kCFStringEncodingMacRoman); if (k == NULL) { if (CFStringGetCString(keys[j], kbuf, 50, kCFStringEncodingMacRoman)) k = kbuf; } v = CFStringGetCStringPtr(values[j], kCFStringEncodingMacRoman); if (v == NULL) { if (CFStringGetCString(values[j], vbuf, 50, kCFStringEncodingMacRoman)) v = vbuf; } //printf("~1 got key %s and value %s\n",k,v); /* We're only grabing the english description... */ if (k != NULL && v != NULL && strcmp(k, "en_US") == 0) { strncpy(desc, v, 49); desc[49] = '\000'; dp = desc; } } free(keys); free(values); } CFRelease(ddr); if (dp == NULL) { strcpy(desc, "(unknown)"); dp = desc; } sprintf(buf,"%s, at %d, %d, width %d, height %d%s",dp, disps[i]->sx, disps[i]->sy, disps[i]->sw, disps[i]->sh, CGDisplayIsMain(dids[i]) ? " (Primary Display)" : ""); if ((disps[i]->name = strdup(dp)) == NULL || (disps[i]->description = strdup(buf)) == NULL) { debugrr("get_displays failed on malloc\n"); free_disppaths(disps); free(dids); return NULL; } } free(dids); #endif /* __APPLE__ */ #if defined(UNIX) && !defined(__APPLE__) int i, j, k; int defsix = 0; /* default screen index */ int dcount; /* Number of screens */ char *dname; char dnbuf[100]; int evb = 0, erb = 0; int majv, minv; /* Version */ Display *mydisplay; int ndisps = 0; XineramaScreenInfo *xai = NULL; char desc1[100], desc2[200]; /* There seems to be no way of getting the available displays */ /* on an X11 system. Attempting to open them in sequence */ /* takes too long. We just rely on the user supplying the */ /* right display. We can enumerate screens though. */ /* Open the base display, and then enumerate all the screens */ if ((dname = getenv("DISPLAY")) != NULL) { char *pp; strncpy(dnbuf,dname,99); dnbuf[99] = '\000'; if ((pp = strrchr(dnbuf, ':')) != NULL) { if ((pp = strchr(pp, '.')) == NULL) strcat(dnbuf,".0"); else { if (pp[1] == '\000') strcat(dnbuf,"0"); else { pp[1] = '0'; pp[2] = '\000'; } } } } else strcpy(dnbuf,":0.0"); if ((mydisplay = XOpenDisplay(dnbuf)) == NULL) { debugrr2((errout, "failed to open display '%s'\n",dnbuf)); return NULL; } #if RANDR_MAJOR == 1 && RANDR_MINOR >= 2 && !defined(DISABLE_RANDR) /* Use Xrandr 1.2 if it's available, and if it's not disabled */ if (getenv("ARGYLL_IGNORE_XRANDR1_2") == NULL && XRRQueryExtension(mydisplay, &evb, &erb) != 0 && XRRQueryVersion(mydisplay, &majv, &minv) && majv == 1 && minv >= 2) { if (XSetErrorHandler(null_error_handler) == 0) { debugrr("get_displays failed on XSetErrorHandler\n"); XCloseDisplay(mydisplay); free_disppaths(disps); return NULL; } dcount = ScreenCount(mydisplay); /* Go through all the screens */ for (i = 0; i < dcount; i++) { static void *xrr_found = NULL; /* .so handle */ static XRRScreenResources *(*_XRRGetScreenResourcesCurrent) (Display *dpy, Window window) = NULL; XRRScreenResources *scrnres; int jj; /* Screen index */ if (minv >= 3 && xrr_found == NULL) { if ((xrr_found = dlopen("libXrandr.so", RTLD_LAZY)) != NULL) _XRRGetScreenResourcesCurrent = dlsym(xrr_found, "XRRGetScreenResourcesCurrent"); } if (minv >= 3 && _XRRGetScreenResourcesCurrent != NULL) { scrnres = _XRRGetScreenResourcesCurrent(mydisplay, RootWindow(mydisplay,i)); } else { scrnres = XRRGetScreenResources(mydisplay, RootWindow(mydisplay,i)); } if (scrnres == NULL) { debugrr("XRRGetScreenResources failed\n"); XCloseDisplay(mydisplay); free_disppaths(disps); return NULL; } /* Look at all the screens outputs */ for (jj = j = 0; j < scrnres->noutput; j++) { XRROutputInfo *outi; XRRCrtcInfo *crtci; if ((outi = XRRGetOutputInfo(mydisplay, scrnres, scrnres->outputs[j])) == NULL) { debugrr("XRRGetOutputInfo failed\n"); XRRFreeScreenResources(scrnres); XCloseDisplay(mydisplay); free_disppaths(disps); return NULL; } if (outi->connection == RR_Disconnected|| outi->crtc == None) { continue; } /* Check that the VideoLUT's are accessible */ { XRRCrtcGamma *crtcgam; debugrr("Checking XRandR 1.2 VideoLUT access\n"); if ((crtcgam = XRRGetCrtcGamma(mydisplay, outi->crtc)) == NULL || crtcgam->size == 0) { if (crtcgam != NULL) XRRFreeGamma(crtcgam); free_disppaths(disps); disps = NULL; j = scrnres->noutput; i = dcount; continue; /* Abort XRandR 1.2 */ } } #ifdef NEVER { Atom *oprops; int noprop; /* Get a list of the properties of the output */ oprops = XRRListOutputProperties(mydisplay, scrnres->outputs[j], &noprop); printf("num props = %d\n", noprop); for (k = 0; k < noprop; k++) { printf("%d: atom 0x%x, name = '%s'\n", k, oprops[k], XGetAtomName(mydisplay, oprops[k])); } } #endif /* NEVER */ if ((crtci = XRRGetCrtcInfo(mydisplay, scrnres, outi->crtc)) != NULL) { char *pp; /* Add the output to the list */ if (disps == NULL) { if ((disps = (disppath **)calloc(sizeof(disppath *), 1 + 1)) == NULL) { debugrr("get_displays failed on malloc\n"); XRRFreeCrtcInfo(crtci); XRRFreeScreenResources(scrnres); XCloseDisplay(mydisplay); return NULL; } } else { if ((disps = (disppath **)realloc(disps, sizeof(disppath *) * (ndisps + 2))) == NULL) { debugrr("get_displays failed on malloc\n"); XRRFreeCrtcInfo(crtci); XRRFreeScreenResources(scrnres); XCloseDisplay(mydisplay); return NULL; } disps[ndisps+1] = NULL; /* End marker */ } /* ndisps is current display we're filling in */ if ((disps[ndisps] = calloc(sizeof(disppath),1)) == NULL) { debugrr("get_displays failed on malloc\n"); XRRFreeCrtcInfo(crtci); XRRFreeScreenResources(scrnres); XCloseDisplay(mydisplay); free_disppaths(disps); return NULL; } disps[ndisps]->screen = i; disps[ndisps]->uscreen = i; disps[ndisps]->rscreen = i; disps[ndisps]->sx = crtci->x; disps[ndisps]->sy = crtci->y; disps[ndisps]->sw = crtci->width; disps[ndisps]->sh = crtci->height; disps[ndisps]->crtc = outi->crtc; /* XID of crtc */ disps[ndisps]->output = scrnres->outputs[j]; /* XID of output */ sprintf(desc1,"Screen %d, Output %s",ndisps+1,outi->name); sprintf(desc2,"%s at %d, %d, width %d, height %d",desc1, disps[ndisps]->sx, disps[ndisps]->sy, disps[ndisps]->sw, disps[ndisps]->sh); /* See if it is a clone */ for (k = 0; k < ndisps; k++) { if (disps[k]->crtc == disps[ndisps]->crtc) { sprintf(desc1, "[ Clone of %d ]",k+1); strcat(desc2, desc1); } } if ((disps[ndisps]->description = strdup(desc2)) == NULL) { debugrr("get_displays failed on malloc\n"); XRRFreeCrtcInfo(crtci); XRRFreeScreenResources(scrnres); XCloseDisplay(mydisplay); free_disppaths(disps); return NULL; } /* Form the display name */ if ((pp = strrchr(dnbuf, ':')) != NULL) { if ((pp = strchr(pp, '.')) != NULL) { sprintf(pp,".%d",i); } } if ((disps[ndisps]->name = strdup(dnbuf)) == NULL) { debugrr("get_displays failed on malloc\n"); XRRFreeCrtcInfo(crtci); XRRFreeScreenResources(scrnres); XCloseDisplay(mydisplay); free_disppaths(disps); return NULL; } debugrr2((errout, "Display %d name = '%s'\n",ndisps,disps[ndisps]->name)); jj++; /* Next enabled index */ ndisps++; /* Now it's number of displays */ XRRFreeCrtcInfo(crtci); } XRRFreeOutputInfo(outi); } XRRFreeScreenResources(scrnres); } XSetErrorHandler(NULL); defsix = DefaultScreen(mydisplay); } #endif /* randr >= V 1.2 */ if (disps == NULL) { /* Use Older style identification */ debugrr("get_displays checking for Xinerama\n"); if (XSetErrorHandler(null_error_handler) == 0) { debugrr("get_displays failed on XSetErrorHandler\n"); XCloseDisplay(mydisplay); return NULL; } if (XineramaQueryExtension(mydisplay, &evb, &erb) != 0 && XineramaIsActive(mydisplay)) { xai = XineramaQueryScreens(mydisplay, &dcount); if (xai == NULL || dcount == 0) { debugrr("XineramaQueryScreens failed\n"); XCloseDisplay(mydisplay); return NULL; } defsix = 0; } else { dcount = ScreenCount(mydisplay); defsix = DefaultScreen(mydisplay); } /* Allocate our list */ if ((disps = (disppath **)calloc(sizeof(disppath *), dcount + 1)) == NULL) { debugrr("get_displays failed on malloc\n"); XCloseDisplay(mydisplay); return NULL; } for (i = 0; i < dcount; i++) { if ((disps[i] = calloc(sizeof(disppath), 1)) == NULL) { debugrr("get_displays failed on malloc\n"); free_disppaths(disps); XCloseDisplay(mydisplay); return NULL; } } /* Create a description for each screen */ for (i = 0; i < dcount; i++) { XF86VidModeMonitor monitor; int evb = 0, erb = 0; char *pp; /* Form the display name */ if ((pp = strrchr(dnbuf, ':')) != NULL) { if ((pp = strchr(pp, '.')) != NULL) { sprintf(pp,".%d",i); } } if ((disps[i]->name = strdup(dnbuf)) == NULL) { debugrr("get_displays failed on malloc\n"); free_disppaths(disps); XCloseDisplay(mydisplay); return NULL; } debugrr2((errout, "Display %d name = '%s'\n",i,disps[i]->name)); if (xai != NULL) { /* Xinerama */ disps[i]->screen = 0; /* We are asuming Xinerame creates a single virtual screen */ disps[i]->uscreen = i; /* We are assuming xinerama lists screens in the same order */ disps[i]->rscreen = i; disps[i]->sx = xai[i].x_org; disps[i]->sy = xai[i].y_org; disps[i]->sw = xai[i].width; disps[i]->sh = xai[i].height; } else { disps[i]->screen = i; disps[i]->uscreen = i; disps[i]->rscreen = i; disps[i]->sx = 0; /* Must be 0 */ disps[i]->sy = 0; disps[i]->sw = DisplayWidth(mydisplay, disps[i]->screen); disps[i]->sh = DisplayHeight(mydisplay, disps[i]->screen); } if (XF86VidModeQueryExtension(mydisplay, &evb, &erb) != 0) { /* Some propietary multi-screen drivers (ie. TwinView & MergeFB) */ /* don't implement the XVidMode extension properly. */ monitor.model = NULL; if (XF86VidModeGetMonitor(mydisplay, disps[i]->uscreen, &monitor) != 0 && monitor.model != NULL && monitor.model[0] != '\000') sprintf(desc1, "%s",monitor.model); else sprintf(desc1,"Screen %d",i+1); } else sprintf(desc1,"Screen %d",i+1); sprintf(desc2,"%s at %d, %d, width %d, height %d",desc1, disps[i]->sx, disps[i]->sy, disps[i]->sw, disps[i]->sh); if ((disps[i]->description = strdup(desc2)) == NULL) { debugrr("get_displays failed on malloc\n"); free_disppaths(disps); XCloseDisplay(mydisplay); return NULL; } } XSetErrorHandler(NULL); } /* Put the screen given by the display name at the top */ { disppath *tdispp; tdispp = disps[defsix]; disps[defsix] = disps[0]; disps[0] = tdispp; } if (xai != NULL) XFree(xai); XCloseDisplay(mydisplay); #endif /* UNIX X11 */ return disps; } // END get_displays void free_a_disppath(disppath *path) { if (path != NULL) { if (path->name != NULL) free(path->name); if (path->description != NULL) free(path->description); free(path); } } /* Free a whole list of display paths */ void free_disppaths(disppath **disps) { if (disps != NULL) { int i; for (i = 0; ; i++) { if (disps[i] == NULL) break; if (disps[i]->name != NULL) free(disps[i]->name); if (disps[i]->description != NULL) free(disps[i]->description); free(disps[i]); } free(disps); } } // START get_a_display disppath *get_a_display(int ix) { disppath **paths, *rv = NULL; int i; if ((paths = get_displays()) == NULL) return NULL; for (i = 0; ;i++) { if (paths[i] == NULL) { free_disppaths(paths); return NULL; } if (i == ix) break; } if ((rv = malloc(sizeof(disppath))) == NULL) { debugrr("get_a_display failed malloc\n"); free_disppaths(paths); return NULL; } *rv = *paths[i]; /* Structure copy */ if ((rv->name = strdup(paths[i]->name)) == NULL) { debugrr("get_displays failed on malloc\n"); free(rv->description); free(rv); free_disppaths(paths); return NULL; } if ((rv->description = strdup(paths[i]->description)) == NULL) { debugrr("get_displays failed on malloc\n"); free(rv); free_disppaths(paths); return NULL; } free_disppaths(paths); return rv; } // END get_a_display // MAIN typedef struct { int width_mm, height_mm; } size_mm; static size_mm get_real_screen_size_mm(int ix) { size_mm size; disppath *disp = NULL; #ifdef NT HDC hdc = NULL; #endif #ifdef __APPLE__ CGSize sz; /* Display size in mm */ #endif #if defined(UNIX) && !defined(__APPLE__) char *pp, *bname; /* base display name */ Display *mydisplay; int myscreen; /* Usual or virtual screen with Xinerama */ #endif size.width_mm = 0; size.height_mm = 0; disp = get_a_display(ix); if (disp == NULL) return size; #ifdef NT hdc = CreateDC(disp->name, NULL, NULL, NULL); if (hdc == NULL) { free_a_disppath(disp); return size; } size.width_mm = GetDeviceCaps(hdc, HORZSIZE); size.height_mm = GetDeviceCaps(hdc, VERTSIZE); DeleteDC(hdc); #endif #ifdef __APPLE__ sz = CGDisplayScreenSize(disp->ddid); size.width_mm = sz.width; size.height_mm = sz.height; #endif #if defined(UNIX) && !defined(__APPLE__) /* Create the base display name (in case of Xinerama, XRandR) */ if ((bname = strdup(disp->name)) == NULL) { free_a_disppath(disp); return size; } if ((pp = strrchr(bname, ':')) != NULL) { if ((pp = strchr(pp, '.')) != NULL) { sprintf(pp,".%d",disp->screen); } } /* open the display */ mydisplay = XOpenDisplay(bname); if(!mydisplay) { debugr2((errout,"Unable to open display '%s'\n",bname)); free(bname); free_a_disppath(disp); return size; } free(bname); debugr("Opened display OK\n"); myscreen = disp->screen; size.width_mm = DisplayWidthMM(mydisplay, myscreen); size.height_mm = DisplayHeightMM(mydisplay, myscreen); XCloseDisplay(mydisplay); #endif free_a_disppath(disp); return size; } static int get_xrandr_output_xid(int ix) { int xid = 0; #if defined(UNIX) && !defined(__APPLE__) #if RANDR_MAJOR == 1 && RANDR_MINOR >= 2 disppath *disp = NULL; disp = get_a_display(ix); if (disp == NULL) return 0; xid = disp->output; free_a_disppath(disp); #endif #endif return xid; } static PyObject * RealDisplaySizeMM(PyObject *self, PyObject *args) { int ix; size_mm size; if (!PyArg_ParseTuple(args, "i", &ix)) return NULL; size = get_real_screen_size_mm(ix); return Py_BuildValue("(i,i)", size.width_mm, size.height_mm); } static PyObject * GetXRandROutputXID(PyObject *self, PyObject *args) { int ix; int xid; if (!PyArg_ParseTuple(args, "i", &ix)) return NULL; xid = get_xrandr_output_xid(ix); return Py_BuildValue("i", xid); } static PyMethodDef RealDisplaySizeMM_methods[] = { {"RealDisplaySizeMM", RealDisplaySizeMM, METH_VARARGS, "RealDisplaySizeMM(int displayNum)\nReturn the size (in mm) of a given display."}, {"GetXRandROutputXID", GetXRandROutputXID, METH_VARARGS, "GetXRandROutputXID(int displayNum)\nReturn the XRandR output X11 ID of a given display."}, {NULL, NULL, 0, NULL} /* Sentinel - marks the end of this structure */ }; PyMODINIT_FUNC initRealDisplaySizeMM(void) { Py_InitModule("RealDisplaySizeMM", RealDisplaySizeMM_methods); } DisplayCAL-3.1.0.0/DisplayCAL/RealDisplaySizeMM.py0000644000076500000000000000136712647526531021311 0ustar devwheel00000000000000# -*- coding: utf-8 -*- import platform import sys if sys.platform == "darwin": # Mac OS X has universal binaries in two flavors: # - i386 & PPC # - i386 & x86_64 if platform.architecture()[0].startswith('64'): from lib64.RealDisplaySizeMM import * else: from lib32.RealDisplaySizeMM import * else: # Linux and Windows have separate files if platform.architecture()[0].startswith('64'): if sys.version_info[:2] == (2, 6): from lib64.python26.RealDisplaySizeMM import * elif sys.version_info[:2] == (2, 7): from lib64.python27.RealDisplaySizeMM import * else: if sys.version_info[:2] == (2, 6): from lib32.python26.RealDisplaySizeMM import * elif sys.version_info[:2] == (2, 7): from lib32.python27.RealDisplaySizeMM import * DisplayCAL-3.1.0.0/DisplayCAL/ref/0000755000076500000000000000000012653527012016176 5ustar devwheel00000000000000DisplayCAL-3.1.0.0/DisplayCAL/ref/ACES.icm0000644000076500000000000000074412647526511017416 0ustar devwheel00000000000000@mntrRGB XYZ +acsp-^?coG desc_cprtP5wtptrXYZrTRC gXYZgTRC bXYZbTRC descACEStextPublic Domain. No Warranty, Use at own risk.XYZ BXYZ \OcurvXYZ "XYZ eDisplayCAL-3.1.0.0/DisplayCAL/ref/ClayRGB1998.gam0000644000076500000000000017023112647526511020454 0ustar devwheel00000000000000GAMUT DESCRIPTOR "Argyll Gamut surface poligon data" ORIGINATOR "Argyll CMS gamut library" CREATED "Mon Feb 27 17:52:58 2012" KEYWORD "COLOR_REP" COLOR_REP "LAB" KEYWORD "GAMUT_CENTER" GAMUT_CENTER "50.000000 0.000000 0.000000" KEYWORD "CSPACE_WHITE" CSPACE_WHITE "100.000000 0.000000 0.000000" KEYWORD "GAMUT_WHITE" GAMUT_WHITE "100.000000 0.000000 0.000000" KEYWORD "CSPACE_BLACK" CSPACE_BLACK "0.000000 0.000000 0.000000" KEYWORD "GAMUT_BLACK" GAMUT_BLACK "0.000000 0.000000 0.000000" KEYWORD "CUSP_RED" CUSP_RED "62.601347 90.370785 78.149474" KEYWORD "CUSP_YELLOW" CUSP_YELLOW "97.502205 -16.478555 103.676451" KEYWORD "CUSP_GREEN" CUSP_GREEN "83.214105 -129.090229 87.172706" KEYWORD "CUSP_CYAN" CUSP_CYAN "86.448981 -83.408548 -21.777749" KEYWORD "CUSP_BLUE" CUSP_BLUE "30.210038 69.243471 -113.611880" KEYWORD "CUSP_MAGENTA" CUSP_MAGENTA "67.600524 101.303881 -50.815824" # First come the triangle verticy location KEYWORD "VERTEX_NO" NUMBER_OF_FIELDS 4 BEGIN_DATA_FORMAT VERTEX_NO LAB_L LAB_A LAB_B END_DATA_FORMAT NUMBER_OF_SETS 1135 BEGIN_DATA 0 83.214 -129.09 87.173 1 30.210 69.243 -113.61 2 62.601 90.371 78.149 3 67.601 101.30 -50.816 4 97.502 -16.479 103.68 5 84.715 -110.36 88.939 6 84.882 -108.47 89.136 7 86.549 -91.168 91.088 8 86.799 -88.802 91.379 9 87.324 -83.975 91.991 10 87.600 -81.522 92.312 11 94.693 -8.7150 101.43 12 88.177 -76.551 92.984 13 88.478 -74.041 93.334 14 83.490 -124.41 65.629 15 91.010 1.6774 98.504 16 90.102 4.2763 97.789 17 88.304 9.4672 96.382 18 89.767 -63.888 94.827 19 65.877 79.350 80.159 20 90.110 -61.335 95.222 21 91.183 -53.673 96.461 22 84.790 19.784 93.663 23 81.408 29.932 91.091 24 91.557 -51.124 96.891 25 65.873 99.535 -53.672 26 69.302 68.049 82.402 27 78.976 37.361 89.273 28 69.880 66.166 82.792 29 70.477 64.225 83.198 30 71.094 62.228 83.622 31 76.651 44.573 87.565 32 79.776 34.906 89.868 33 72.384 58.077 84.517 34 75.902 46.917 87.021 35 73.055 55.929 84.988 36 93.122 -40.991 98.688 37 93.531 -38.481 99.156 38 93.947 -35.981 99.632 39 96.577 -21.263 102.63 40 94.798 -31.019 100.60 41 95.234 -28.558 101.10 42 60.696 94.321 -62.265 43 83.809 -119.22 48.568 44 59.835 93.468 -63.698 45 62.761 90.733 61.729 46 62.792 90.802 59.321 47 54.702 88.486 -72.264 48 33.728 57.110 -107.68 49 53.854 87.682 -73.682 50 63.147 91.600 38.728 51 62.945 91.146 49.191 52 62.991 91.249 46.589 53 84.199 -113.20 32.843 54 63.205 91.731 36.106 55 38.508 41.226 -99.645 56 84.397 -110.24 26.076 57 50.499 84.563 -79.307 58 63.399 92.166 28.277 59 63.622 92.663 20.545 60 49.671 83.809 -80.697 61 63.470 92.325 25.686 62 43.461 25.511 -91.364 63 63.702 92.843 17.995 64 84.616 -107.08 19.339 65 46.697 15.649 -85.980 66 48.848 83.068 -82.079 67 66.759 99.514 -40.346 68 64.358 94.298 0.59833 69 86.220 -86.128 -17.603 70 65.300 96.364 -18.260 71 48.031 82.340 -83.453 72 65.992 97.864 -29.501 73 64.804 95.278 -8.9677 74 85.023 -101.41 8.2263 75 85.387 -96.543 -0.52662 76 81.804 -73.567 -29.068 77 80.637 -71.036 -30.910 78 50.060 5.7266 -80.405 79 42.531 77.655 -92.722 80 85.786 -91.437 -9.1395 81 75.946 -60.613 -38.350 82 74.768 -57.930 -40.227 83 41.785 77.054 -93.981 84 71.224 -49.689 -45.898 85 70.040 -46.876 -47.799 86 66.483 -38.238 -53.535 87 65.297 -35.292 -55.455 88 37.618 73.878 -101.03 89 64.110 -32.313 -57.379 90 62.924 -29.301 -59.305 91 61.739 -26.256 -61.233 92 52.352 -0.84803 -76.618 93 57.016 -13.767 -68.950 94 14.182 45.227 -74.206 95 7.1930 34.587 -56.902 96 13.509 44.218 -72.551 97 6.5231 33.160 -54.951 98 61.334 -100.62 67.948 99 18.754 52.077 -85.445 100 19.388 53.028 -87.006 101 48.802 -84.316 56.937 102 33.734 -64.711 43.698 103 39.938 -72.782 49.149 104 35.310 -66.761 45.083 105 25.554 -54.067 35.616 106 49.492 75.299 65.116 107 18.563 -44.970 27.146 108 16.735 -42.360 24.726 109 23.849 -51.849 33.673 110 40.933 65.458 56.606 111 3.2382 20.204 -41.088 112 3.7000 22.898 -43.667 113 35.339 59.026 50.687 114 34.194 57.710 49.382 115 25.885 48.157 39.067 116 24.650 46.737 37.416 117 12.962 -35.251 19.490 118 2.0511 12.797 -32.650 119 0.0000 0.0000 0.0000 120 100.00 0.0000 0.0000 121 18.252 39.381 28.427 122 0.035831 0.15948 0.057090 123 0.072059 -0.20491 0.10959 124 16.921 37.850 26.473 125 12.802 33.115 20.264 126 11.382 31.482 18.070 127 11.007 -30.725 16.660 128 8.4560 28.118 13.472 129 75.231 75.757 -38.584 130 75.811 73.859 -37.660 131 92.092 23.018 -12.123 132 93.808 17.930 -9.4750 133 91.244 25.550 -13.434 134 94.676 15.377 -8.1397 135 0.23660 0.52749 0.37176 136 0.36675 -0.78153 0.56035 137 96.430 10.259 -5.4487 138 6.9905 26.183 11.138 139 88.745 33.083 -17.309 140 97.315 7.6951 -4.0942 141 1.7200 10.731 -29.587 142 87.929 35.568 -18.579 143 99.100 2.5649 -1.3693 144 0.33820 -0.89558 0.33658 145 8.9999 -25.531 13.679 146 78.965 63.639 -32.655 147 79.642 61.467 -31.583 148 84.758 45.334 -23.532 149 2.4824 -7.0591 3.7753 150 83.991 47.723 -24.734 151 0.91361 5.7002 -19.542 152 6.9788 -19.845 10.613 153 98.076 -12.523 62.598 154 97.958 -13.329 68.967 155 3.7069 -10.541 5.6375 156 0.52569 3.2799 -12.035 157 98.464 -9.9086 45.189 158 98.892 -7.0785 29.885 159 99.910 -0.56423 2.0897 160 99.649 -2.2049 8.4038 161 99.566 -2.7341 10.523 162 0.37454 2.3368 -8.5744 163 99.249 -4.7595 19.068 164 96.207 -18.131 -6.0585 165 97.831 -10.044 -3.4609 166 98.253 -8.0266 -2.7871 167 5.2028 -14.795 7.9125 168 99.554 -1.9989 -0.71013 169 94.690 -26.201 -8.4902 170 0.47343 1.5816 0.74911 171 94.328 -28.207 -9.0707 172 89.586 -58.199 -16.703 173 4.4962 19.796 7.1639 174 1.8432 8.2043 2.9369 175 2.5871 11.515 4.1221 176 92.312 -40.040 -12.310 177 92.003 -41.964 -12.807 178 3.4701 15.446 5.5291 179 8.1299 -12.656 -11.875 180 8.3927 -10.955 -15.119 181 11.553 -25.639 0.92434 182 9.6336 -20.823 -2.0038 183 8.6794 -9.0301 -18.252 184 3.8011 14.505 6.0324 185 15.290 -33.498 6.4817 186 2.9180 10.574 4.6253 187 7.8924 -14.145 -8.5135 188 7.3801 -18.059 11.253 189 15.551 -29.973 -0.27641 190 3.7885 -10.032 3.7704 191 5.6042 -13.009 8.5520 192 2.5640 -6.5503 1.9082 193 4.1083 -8.7546 6.2770 194 1.6012 -3.8125 0.44400 195 2.8838 -5.2726 4.4148 196 8.9885 -6.8703 -21.281 197 1.9210 -2.5349 2.9506 198 7.2413 26.881 5.3961 199 7.3650 27.207 2.5638 200 15.094 -36.142 13.343 201 6.2798 28.421 -32.567 202 6.9103 28.946 -28.054 203 7.0890 28.037 -17.010 204 6.1943 25.357 -3.0027 205 11.416 -26.942 4.4734 206 6.5822 26.604 -10.298 207 7.2539 -1.9981 -24.122 208 1.7208 3.4048 -18.269 209 5.6480 24.971 -15.652 210 16.935 -39.271 15.851 211 7.5161 27.590 -0.89639 212 2.9401 4.5411 -23.933 213 97.746 3.1509 -3.4686 214 5.7580 2.2559 -26.575 215 4.8707 21.683 -1.4104 216 98.112 4.5683 -0.64120 217 6.8204 27.304 -13.724 218 5.0814 26.462 -37.985 219 96.848 5.7266 -4.8410 220 6.1210 4.5211 -29.477 221 5.1902 24.607 -23.818 222 7.6956 28.024 -4.5915 223 4.6497 20.597 3.6488 224 37.221 -62.978 24.314 225 6.6233 -5.9327 -17.980 226 5.1273 -1.6787 -20.398 227 95.956 8.3017 -6.2083 228 60.184 -95.393 50.707 229 49.186 -77.959 31.986 230 7.6839 -15.446 -5.0263 231 17.219 -35.025 5.7563 232 19.867 -27.019 -10.607 233 48.997 -81.024 41.988 234 13.133 -33.343 13.610 235 49.685 -70.411 13.607 236 4.8906 23.326 -20.647 237 7.9041 28.500 -8.1411 238 39.216 -58.218 9.5680 239 37.621 -56.992 10.162 240 7.6170 0.26714 -27.011 241 1.1065 6.1860 -15.226 242 20.058 -24.936 -13.567 243 11.204 -28.927 10.825 244 35.619 -61.640 25.070 245 8.4690 31.080 -28.890 246 36.009 -55.752 10.774 247 41.608 -72.049 38.043 248 6.3547 -7.6085 -14.718 249 37.014 -66.329 35.100 250 9.3191 -4.4789 -24.211 251 4.6529 24.684 -35.300 252 8.1415 29.013 -11.551 253 4.1753 19.742 -10.276 254 4.3838 20.871 -13.885 255 37.121 32.558 50.637 256 6.1165 -9.0949 -11.324 257 9.4753 -22.034 1.5799 258 59.102 -89.061 34.811 259 30.306 -13.567 41.724 260 37.252 37.239 51.064 261 57.938 -84.069 25.443 262 2.6715 2.8652 -20.613 263 18.814 -40.835 14.974 264 32.194 -3.6787 44.022 265 3.9958 18.705 -6.5055 266 57.692 -87.882 35.477 267 20.749 -40.985 10.877 268 35.116 49.396 49.779 269 27.586 -50.502 17.210 270 24.103 -47.646 18.824 271 3.3960 -1.3589 -15.624 272 18.614 -18.961 -19.109 273 29.828 24.276 42.669 274 31.539 -6.9018 43.233 275 66.454 -88.387 17.080 276 4.0075 20.285 -22.108 277 31.674 -17.114 43.016 278 31.159 -50.553 9.7690 279 31.660 2.9338 43.736 280 17.481 -31.471 -0.83379 281 28.911 27.178 41.755 282 4.6220 22.074 -17.339 283 3.6343 0.12746 -19.073 284 26.120 -45.151 8.7252 285 48.793 -61.026 -1.4178 286 27.514 -51.631 20.246 287 67.820 -89.439 16.559 288 4.8587 -3.3546 -17.113 289 32.397 5.9426 44.620 290 3.1875 -2.6597 -12.022 291 4.4120 -6.1417 -10.119 292 27.002 0.61230 38.519 293 22.672 -40.904 6.9462 294 94.577 14.822 -6.0414 295 39.652 -52.311 -1.3859 296 31.801 18.141 44.545 297 29.925 -43.029 -1.3654 298 33.153 8.8638 45.515 299 28.915 -37.596 39.603 300 29.571 -47.805 7.4356 301 20.583 -43.535 17.363 302 29.733 -16.993 41.011 303 8.8745 31.879 -31.600 304 38.056 -51.072 -0.92781 305 2.6504 5.9089 4.1645 306 19.373 -32.942 -1.3682 307 30.145 -27.431 41.144 308 4.6205 -4.8409 -13.689 309 20.851 -39.502 7.6336 310 28.519 6.8529 40.475 311 18.082 25.480 -62.044 312 36.339 19.714 49.145 313 31.616 -44.345 -1.8418 314 25.679 -51.957 26.925 315 20.138 25.194 -64.187 316 64.433 -76.169 -1.0978 317 3.5632 18.936 -26.523 318 33.818 -43.664 44.267 319 9.1407 -24.518 10.141 320 20.608 26.816 -66.159 321 7.5044 -16.565 -1.4137 322 28.186 13.202 40.334 323 23.723 -16.686 34.140 324 8.8115 28.916 4.8649 325 20.052 -1.5576 29.791 326 27.329 11.853 -60.387 327 28.048 29.939 40.870 328 30.955 15.460 43.517 329 26.950 39.025 39.962 330 37.972 29.856 51.248 331 35.325 13.071 -70.629 332 33.456 13.202 -68.623 333 31.022 34.903 -85.381 334 29.909 18.666 42.510 335 33.709 -40.471 -10.567 336 31.245 9.3348 43.564 337 28.680 -23.965 39.685 338 28.205 -27.471 39.079 339 5.7285 -11.515 -4.1211 340 24.973 10.156 -56.123 341 24.227 14.275 35.608 342 21.806 41.573 -80.297 343 26.053 25.298 38.270 344 3.8447 17.783 -3.0453 345 22.939 10.295 -53.937 346 29.040 15.983 41.419 347 4.2326 -7.2613 -6.3971 348 25.214 -20.375 35.849 349 19.522 5.6774 29.246 350 13.996 18.908 -51.508 351 25.417 -34.475 35.789 352 11.360 -6.6663 -24.276 353 1.0580 -0.73048 -4.5144 354 10.290 32.107 -18.907 355 30.883 -1.3427 -51.804 356 13.549 6.8952 -40.074 357 28.942 -1.3949 -49.554 358 35.357 -30.718 46.054 359 27.003 -37.691 37.526 360 13.148 4.7597 -37.608 361 25.837 37.144 38.497 362 27.365 -34.373 37.997 363 20.768 -9.0493 30.572 364 16.188 8.8053 -44.860 365 21.158 23.877 31.940 366 9.6696 -2.0619 -27.049 367 3.6237 16.404 2.0140 368 22.675 -24.034 32.699 369 24.099 20.285 35.650 370 49.157 -56.445 -8.9729 371 21.809 -31.247 31.493 372 2.0454 -1.0415 -9.7235 373 22.117 20.831 33.113 374 63.606 -67.983 -12.396 375 19.750 4.5341 -44.888 376 18.361 8.6518 -47.192 377 20.389 8.8708 30.487 378 19.767 -31.349 28.885 379 17.973 -12.624 26.786 380 20.637 31.409 31.481 381 13.355 -8.7566 -24.359 382 20.161 -27.784 29.448 383 41.620 -48.700 -9.7058 384 23.177 -20.353 33.392 385 36.539 -1.1992 -58.355 386 40.043 -47.434 -9.3442 387 48.902 -12.813 -60.696 388 7.3533 -17.508 2.0390 389 38.731 7.5264 50.699 390 62.330 -65.377 -14.381 391 21.104 -20.350 30.787 392 32.200 -37.293 -12.932 393 18.621 -8.8219 27.729 394 38.376 -1.1551 -60.479 395 3.0081 -3.7792 -8.2593 396 3.5007 17.215 -15.325 397 24.737 46.934 31.391 398 19.634 41.048 26.667 399 39.166 1.3716 50.804 400 15.598 -31.467 23.271 401 19.078 18.747 28.970 402 11.573 31.913 12.225 403 49.985 76.410 30.512 404 10.589 32.730 -21.905 405 49.924 76.273 33.315 406 49.646 75.648 49.780 407 12.975 33.506 14.388 408 39.072 -7.9956 50.305 409 35.712 59.868 24.517 410 14.639 -20.473 22.043 411 10.595 -16.256 16.187 412 16.839 -20.407 25.117 413 22.924 -1.5696 -42.561 414 14.432 35.248 13.579 415 16.360 -24.272 24.407 416 16.097 10.003 24.595 417 38.010 62.548 24.776 418 35.454 59.286 39.514 419 45.699 -11.366 -58.537 420 34.028 -36.847 -15.906 421 47.327 -40.643 -27.787 422 39.771 -31.898 -29.196 423 20.129 -12.760 29.662 424 61.454 -58.108 -23.221 425 37.238 62.045 11.166 426 37.445 62.506 5.3586 427 41.058 65.740 43.983 428 36.795 63.432 -25.040 429 49.287 -54.866 -11.450 430 12.600 -4.1523 19.298 431 35.648 59.722 27.581 432 27.223 49.823 31.703 433 9.7538 30.972 -12.608 434 35.563 61.935 -24.226 435 39.179 -17.657 50.017 436 49.338 76.099 15.078 437 36.901 61.291 23.128 438 37.144 61.835 14.118 439 13.060 33.696 11.489 440 26.008 48.434 30.081 441 38.224 64.217 -11.244 442 39.692 -4.9339 51.005 443 41.346 -33.338 -29.377 444 16.038 22.404 24.785 445 49.835 77.202 1.6866 446 35.938 61.583 -12.026 447 36.610 63.036 -22.505 448 18.508 39.958 16.034 449 13.786 -27.988 20.749 450 37.559 62.757 2.5051 451 95.357 -26.749 60.884 452 23.143 17.618 34.342 453 16.544 -1.7825 -35.120 454 49.596 77.776 -15.188 455 32.366 -35.442 -15.615 456 37.010 62.741 -10.289 457 29.013 52.515 7.8741 458 43.774 -43.187 -20.103 459 14.317 -1.8660 -32.513 460 19.802 41.426 17.939 461 37.162 63.071 -12.966 462 26.183 48.828 20.302 463 38.094 -2.9628 -58.376 464 20.477 -20.681 -19.312 465 27.733 50.968 9.1727 466 39.848 4.2711 51.568 467 11.780 32.375 5.8266 468 3.2922 15.915 -11.701 469 28.370 52.374 -6.0085 470 27.633 50.745 12.348 471 27.461 50.359 18.807 472 38.648 -20.877 49.410 473 27.961 51.473 2.9561 474 28.651 51.707 20.576 475 38.860 32.097 52.202 476 48.834 -41.975 -27.996 477 35.953 62.768 -29.244 478 15.175 25.205 23.602 479 49.707 -50.001 -18.757 480 21.156 43.047 16.347 481 28.125 53.080 -21.817 482 49.568 78.784 -31.169 483 28.224 52.055 -3.0690 484 95.747 -24.698 63.650 485 19.980 43.185 -16.453 486 26.063 49.873 -9.7391 487 27.220 51.124 -7.8657 488 20.843 -1.6354 -40.137 489 26.807 51.480 -20.957 490 49.966 80.652 -48.454 491 95.506 -24.794 36.134 492 3.2637 17.067 -23.338 493 97.109 -16.611 43.147 494 11.949 -23.969 18.122 495 19.976 41.815 10.980 496 18.559 41.458 -15.502 497 19.883 41.607 14.443 498 96.669 -18.866 42.483 499 13.163 33.925 7.9661 500 10.645 20.833 16.741 501 19.482 29.305 29.831 502 17.180 24.816 26.478 503 18.265 9.4253 27.619 504 95.092 -27.062 35.503 505 93.789 -35.535 54.126 506 25.292 50.682 -32.477 507 20.801 43.634 -8.5207 508 19.773 42.741 -13.512 509 25.907 50.782 -25.473 510 3.1128 14.795 -7.9125 511 94.933 -29.114 60.271 512 27.554 51.852 -13.589 513 61.595 -56.543 -25.471 514 20.945 -16.370 -24.831 515 34.572 62.081 -39.875 516 14.176 -24.384 21.342 517 9.3034 11.876 14.545 518 20.632 43.265 -5.4375 519 21.452 43.708 6.1811 520 7.1323 -18.887 7.0982 521 1.1302 5.7002 -7.3704 522 20.081 42.050 7.5678 523 95.876 -23.752 57.181 524 23.943 49.057 -31.739 525 12.289 20.998 -51.367 526 92.825 -41.773 61.659 527 2.9616 13.852 -4.4523 528 1.6089 7.8311 -6.6076 529 1.0065 4.9283 -4.5380 530 19.398 41.928 -7.4310 531 33.300 -10.685 -45.123 532 2.2178 10.541 -5.6375 533 1.4852 7.0591 -3.7753 534 49.856 -48.344 -21.151 535 40.329 -1.9333 51.724 536 1.3879 6.4522 -1.5484 537 18.784 31.604 28.931 538 2.0941 9.7692 -2.8051 539 2.8379 13.080 -1.6199 540 49.261 80.178 -52.137 541 1.9968 9.1623 -0.57822 542 95.866 -22.975 38.978 543 40.400 -11.847 -52.011 544 1.7601 8.7741 -10.068 545 9.6778 -21.832 14.748 546 20.331 42.604 0.93075 547 29.744 -9.1006 -42.707 548 62.040 -51.786 -32.124 549 93.837 -35.152 51.934 550 2.3689 11.484 -9.0977 551 94.914 -28.418 42.123 552 45.208 -29.004 -39.014 553 38.847 -10.174 -51.964 554 49.461 -21.341 -52.387 555 39.162 16.142 51.540 556 11.175 25.647 17.638 557 13.423 34.503 0.75378 558 40.185 -45.743 -11.943 559 97.547 -13.576 27.807 560 41.234 -18.977 -45.461 561 93.875 -35.688 71.727 562 11.856 33.998 -19.801 563 18.094 41.773 -26.016 564 97.110 -15.760 27.131 565 37.868 -17.627 -43.040 566 12.503 27.710 19.693 567 14.637 35.705 6.4258 568 9.5912 4.4102 14.891 569 94.749 -28.848 32.676 570 75.587 -21.275 83.332 571 92.748 -42.426 65.909 572 75.113 -23.907 82.792 573 18.780 41.932 -18.426 574 13.950 35.656 -9.3445 575 13.757 35.235 -6.0742 576 96.680 -17.952 26.465 577 18.062 15.986 27.494 578 1.9395 9.8936 -13.883 579 2.5484 12.604 -12.901 580 98.059 -10.936 26.315 581 1.4608 7.7628 -14.655 582 31.402 -10.876 -42.761 583 93.398 -36.243 23.674 584 65.304 -25.761 73.708 585 15.247 37.049 -7.2349 586 60.789 -48.938 -34.119 587 64.621 -11.705 73.642 588 97.991 -10.568 14.827 589 64.095 -14.411 73.046 590 73.790 7.7669 82.952 591 98.954 -5.8466 14.075 592 21.901 -26.524 -13.859 593 64.838 -28.551 73.175 594 66.638 -48.330 74.141 595 93.469 -38.126 71.164 596 93.891 -33.896 33.666 597 94.415 -30.603 29.859 598 65.068 12.324 75.154 599 38.594 -12.023 -49.771 600 97.286 -15.375 36.557 601 98.758 -6.3053 6.9940 602 97.990 -11.401 28.491 603 16.644 40.024 -25.212 604 12.644 34.267 -11.479 605 30.892 -14.807 -38.040 606 98.845 -5.7433 4.8813 607 65.074 -48.355 72.708 608 98.352 -8.9751 17.664 609 98.068 -9.2468 1.4009 610 95.983 -21.299 20.802 611 95.649 -22.928 17.991 612 65.874 27.091 76.670 613 13.660 -6.4284 -27.147 614 98.322 -8.3650 6.3023 615 99.287 -3.7018 5.5821 616 2.7568 13.905 -16.538 617 98.498 -7.2071 2.0839 618 93.440 -37.521 51.348 619 67.021 -45.533 74.583 620 14.908 36.307 -0.58313 621 34.814 62.584 -42.216 622 97.638 -12.134 12.004 623 96.327 -19.640 23.627 624 95.427 -24.564 24.522 625 63.454 30.154 74.620 626 98.674 -6.8581 9.1141 627 48.693 -36.891 58.071 628 95.324 -24.523 15.194 629 10.234 -3.8088 15.773 630 97.558 -12.683 14.146 631 14.161 36.112 -12.523 632 98.409 -7.7906 4.1893 633 64.667 -3.4852 74.039 634 98.236 -8.9301 8.4228 635 40.488 -42.286 -17.060 636 98.276 -9.4802 19.818 637 94.022 -32.861 29.254 638 95.091 -25.465 10.261 639 92.401 -44.541 63.247 640 97.212 -14.242 11.332 641 60.274 13.480 70.805 642 97.979 -9.8432 3.5065 643 61.449 -42.426 -42.755 644 61.279 -44.061 -40.620 645 97.131 -14.803 13.474 646 11.066 0.13153 17.073 647 2.6548 14.357 -24.345 648 1.6693 9.0636 -18.311 649 96.876 -15.771 8.5328 650 96.548 -17.268 5.7501 651 93.705 -34.571 26.458 652 24.209 49.608 -34.279 653 92.396 -43.762 45.226 654 16.215 -3.9840 -32.547 655 94.928 -26.687 14.573 656 95.009 -26.082 12.414 657 49.564 -30.776 59.076 658 49.981 -39.911 59.154 659 49.246 -23.094 -50.252 660 96.751 -17.453 24.286 661 49.288 -21.582 59.155 662 48.624 -28.370 -43.729 663 34.187 -18.166 -38.218 664 97.479 -13.221 16.295 665 97.891 -10.430 5.6198 666 9.4735 -7.9320 14.576 667 49.802 -18.581 59.741 668 19.362 -12.364 -27.400 669 99.023 -4.5922 0.67844 670 22.611 -3.6235 -40.165 671 38.151 19.216 50.781 672 98.588 -6.6144 -0.013868 673 40.962 -60.212 50.354 674 33.104 -27.840 -25.996 675 91.208 -51.030 34.191 676 96.792 -16.355 10.669 677 49.355 -36.791 -34.911 678 11.583 33.424 -16.766 679 49.943 -70.267 58.280 680 32.549 -16.504 -38.126 681 17.496 -10.455 -27.303 682 92.451 -43.295 43.010 683 49.345 5.1238 60.343 684 37.099 -46.540 47.182 685 49.722 -9.5417 60.033 686 49.790 -0.72009 60.480 687 96.413 -17.439 -1.2359 688 41.737 -52.183 51.262 689 26.085 -7.4447 -40.243 690 37.198 -30.691 47.742 691 69.549 -74.981 76.016 692 96.016 -19.491 -1.8703 693 92.084 -45.642 42.458 694 94.495 -28.416 4.7633 695 96.231 -18.730 2.9843 696 94.493 -27.682 -4.3025 697 97.645 -11.291 0.72718 698 48.969 10.840 60.278 699 49.915 -31.563 -41.641 700 49.189 24.188 61.192 701 39.020 -30.675 49.411 702 69.513 -61.943 76.351 703 47.501 24.655 59.669 704 95.923 -20.156 0.23596 705 22.015 -7.8039 -35.243 706 96.142 -19.361 5.1061 707 40.470 -20.983 51.078 708 49.566 -57.466 58.260 709 17.783 -8.2314 -29.976 710 94.704 -27.603 9.6490 711 16.928 40.614 -27.955 712 9.3907 18.272 14.772 713 35.632 -43.575 45.924 714 33.733 -22.036 -33.425 715 96.056 -19.982 7.2356 716 49.537 -35.051 -37.175 717 96.507 -16.778 -3.3341 718 11.245 7.0467 -37.593 719 1.8942 -1.9846 -6.2632 720 47.249 11.259 58.717 721 1.7705 -2.7565 -3.4309 722 22.308 -5.7024 -37.727 723 35.312 -46.617 45.550 724 21.196 -14.213 -27.509 725 94.408 -29.083 6.9015 726 36.766 -33.970 47.242 727 2.6360 -6.1011 0.26016 728 2.8570 -4.7223 -4.7991 729 94.130 -29.720 -4.8832 730 39.944 18.726 52.400 731 8.7953 -11.526 13.504 732 24.068 -7.6171 -37.773 733 5.3564 -13.837 4.3974 734 3.9577 -8.9762 -0.10455 735 4.0814 -8.2043 -2.9369 736 5.4537 -13.230 2.1705 737 5.5774 -12.458 -0.66183 738 92.870 -38.251 6.7505 739 92.956 -39.065 25.298 740 36.276 -54.949 46.219 741 49.874 40.877 62.833 742 12.146 34.604 -22.746 743 94.304 -29.122 -0.081520 744 92.439 -41.085 8.3597 745 7.7344 -16.482 11.817 746 25.806 -9.4814 -37.828 747 94.213 -29.827 2.0412 748 76.402 53.670 -36.880 749 33.306 -25.909 -28.506 750 25.535 -11.534 -35.373 751 25.274 -13.599 -32.877 752 86.571 -48.619 -21.387 753 8.4996 21.180 13.431 754 86.320 -50.322 -21.793 755 77.143 51.326 -35.703 756 87.654 -51.273 -19.696 757 74.895 40.638 -39.423 758 73.588 62.671 -41.366 759 21.458 -12.063 -30.136 760 74.089 -40.651 -41.237 761 75.046 -44.692 -39.717 762 74.314 38.950 -40.376 763 81.969 -39.517 -28.622 764 82.242 -37.797 -28.177 765 83.323 -40.533 -26.477 766 82.999 40.162 -26.390 767 62.313 48.945 -59.909 768 83.599 -38.784 -26.027 769 92.618 -40.332 13.237 770 81.619 40.898 -28.592 771 75.714 38.103 -38.119 772 82.423 38.417 -27.326 773 81.162 -35.040 -29.879 774 92.892 -38.820 15.969 775 89.925 -36.649 -16.027 776 90.246 -34.722 -15.508 777 92.278 -41.716 3.5233 778 92.189 -42.466 5.6707 779 49.691 60.400 64.056 780 73.152 -36.517 -42.725 781 96.450 2.4832 17.203 782 73.498 41.486 -41.680 783 93.177 -37.260 18.717 784 91.736 -48.683 57.873 785 72.964 -27.930 -42.984 786 91.079 10.056 39.538 787 78.785 32.143 -33.215 788 72.469 -30.888 -43.799 789 71.598 -26.536 -45.185 790 80.182 31.341 -30.978 791 97.431 0.38812 16.379 792 79.006 -29.467 -33.287 793 86.487 -30.470 -21.400 794 94.279 5.3862 25.498 795 80.378 -30.507 -31.101 796 90.571 -54.628 21.593 797 92.886 12.780 11.909 798 86.163 -32.364 -21.925 799 97.757 2.4067 7.8094 800 92.425 -39.781 -7.6138 801 95.473 4.5897 18.046 802 98.831 0.90116 4.9281 803 64.318 11.174 -56.835 804 79.637 29.550 -31.866 805 87.853 -31.271 -19.249 806 89.164 21.660 13.327 807 86.278 30.143 -21.251 808 86.820 -28.559 -20.861 809 94.209 4.9653 27.707 810 77.770 63.893 -25.244 811 67.850 74.029 -50.636 812 96.528 2.9637 15.040 813 97.673 1.8883 9.9410 814 8.1500 15.518 12.806 815 96.608 3.4535 12.884 816 93.314 7.5464 26.411 817 87.708 21.035 30.063 818 78.559 -23.116 -33.964 819 76.859 -23.820 -36.694 820 82.374 -27.861 -27.905 821 91.611 -26.877 -13.309 822 97.843 2.9339 5.6852 823 90.498 -55.306 23.804 824 6.4372 -9.3009 9.8793 825 65.584 52.415 -54.509 826 77.175 -22.066 -36.176 827 89.866 18.251 19.047 828 71.624 -17.371 -45.094 829 91.272 -50.455 31.968 830 8.2014 8.5881 12.798 831 71.031 -20.573 -46.070 832 72.402 27.724 -43.558 833 92.024 -46.979 62.709 834 89.986 25.946 -6.2692 835 72.934 29.467 -42.682 836 91.613 13.118 21.610 837 91.970 7.4728 40.780 838 87.121 27.600 -19.936 839 97.931 3.4700 3.5686 840 87.598 33.987 -12.239 841 90.810 -53.893 35.905 842 2.7540 1.1728 4.2779 843 92.538 -41.001 15.413 844 93.688 9.7417 15.405 845 78.888 -21.311 -33.426 846 5.5501 -2.3368 8.5744 847 89.376 15.556 34.801 848 77.501 -20.287 -35.642 849 3.3629 3.8829 5.2480 850 89.509 23.476 4.5271 851 90.974 -22.214 -14.273 852 95.397 4.1291 20.226 853 83.290 25.382 -26.053 854 75.053 -16.357 -39.554 855 85.206 26.477 -22.988 856 78.570 25.946 -33.610 857 4.1067 7.1938 6.4332 858 89.348 24.355 -16.437 859 91.540 12.701 23.833 860 94.578 7.1666 16.723 861 89.247 22.100 11.114 862 92.424 10.125 25.119 863 3.7168 -1.5649 5.7420 864 92.134 -42.221 -1.2700 865 89.694 24.438 0.18071 866 62.203 -5.4554 -60.383 867 78.938 21.465 -33.053 868 93.533 8.8348 19.788 869 90.206 21.799 -15.107 870 95.631 5.5392 13.706 871 90.024 19.107 14.605 872 90.317 13.339 33.781 873 86.468 34.967 -7.0624 874 92.804 12.314 14.092 875 80.614 -20.442 -30.662 876 89.083 21.228 15.548 877 89.944 18.674 16.822 878 85.789 -25.832 -22.472 879 96.373 2.0120 19.373 880 62.304 -13.559 -60.254 881 71.362 24.229 -45.269 882 78.440 61.741 -24.191 883 83.381 -22.244 -26.267 884 66.161 57.666 -53.528 885 70.235 -16.059 -47.338 886 94.848 -17.516 -8.1705 887 92.724 11.857 16.284 888 90.190 26.993 -10.522 889 77.531 22.317 -35.308 890 88.526 32.015 -13.093 891 62.775 -11.143 -59.471 892 90.662 15.271 22.553 893 92.095 15.820 8.4201 894 90.736 15.687 20.325 895 95.245 -15.499 -7.5349 896 4.9898 11.124 7.8402 897 89.420 23.009 6.7139 898 5.0695 4.4561 7.8974 899 61.925 -6.7872 -60.846 900 92.029 7.8215 38.534 901 91.348 -20.223 -13.669 902 91.926 14.882 12.786 903 70.985 28.686 -45.851 904 70.003 6.2669 -47.590 905 70.139 -8.1910 -47.450 906 84.680 24.631 -23.843 907 91.112 -52.689 52.458 908 76.790 -15.646 -36.755 909 92.819 14.087 -11.064 910 70.544 -14.444 -46.827 911 84.982 34.255 7.0738 912 62.490 10.947 -59.833 913 7.1770 4.8872 11.167 914 92.009 15.347 10.599 915 75.548 15.012 -38.555 916 71.293 17.940 -45.422 917 77.144 -13.828 -36.176 918 89.045 27.960 -5.4165 919 70.429 8.0257 -46.886 920 89.333 22.550 8.9096 921 77.444 15.943 -35.495 922 88.311 24.203 12.057 923 69.587 4.5201 -48.276 924 76.962 14.096 -36.284 925 70.349 14.408 -46.978 926 92.229 -41.419 -3.3931 927 76.109 -10.982 -37.823 928 86.301 27.613 18.521 929 84.760 -23.092 -24.083 930 64.142 39.767 -56.959 931 84.160 22.777 -24.687 932 88.638 18.841 29.028 933 76.481 -9.1540 -37.213 934 89.886 25.435 -4.1286 935 32.694 62.405 -61.860 936 70.816 16.172 -46.208 937 81.240 17.967 -29.389 938 83.633 46.196 -18.393 939 90.960 12.816 -14.001 940 92.516 -14.223 -11.789 941 97.325 -5.4268 -4.2044 942 5.9526 8.3867 9.3044 943 89.979 -19.528 -15.815 944 89.605 -21.509 -16.419 945 92.333 12.153 -11.846 946 87.285 32.479 -5.8077 947 62.399 3.3283 -60.019 948 90.677 -54.378 28.730 949 97.353 -0.093370 18.539 950 76.023 10.402 -37.821 951 88.229 23.774 14.281 952 91.398 11.895 28.298 953 91.550 -11.558 -13.283 954 92.920 -12.219 -11.140 955 6.9786 12.330 10.939 956 64.171 23.515 -57.007 957 96.691 3.9526 10.735 958 32.372 61.773 -59.758 959 76.488 12.249 -37.060 960 85.072 34.684 4.8466 961 88.571 25.545 5.4354 962 91.497 19.849 0.62123 963 91.314 18.860 4.9415 964 89.191 18.011 -16.744 965 86.366 34.484 -4.8973 966 83.888 28.945 41.440 967 62.769 18.658 -59.334 968 6.0158 15.249 9.4750 969 69.819 -1.8558 -47.935 970 95.110 2.3831 29.008 971 93.177 6.7363 30.854 972 85.890 32.195 6.0791 973 86.994 24.314 24.285 974 91.961 -9.5597 -12.621 975 92.744 19.383 -6.5934 976 81.692 -14.795 -28.905 977 93.330 -10.214 -10.481 978 82.872 48.572 -19.580 979 88.755 26.485 1.0664 980 75.458 -6.3055 -38.841 981 91.853 10.212 -12.618 982 92.182 16.303 6.2494 983 85.467 30.129 17.294 984 88.926 20.394 20.013 985 13.845 38.040 -36.293 986 86.785 36.466 -13.496 987 85.547 30.524 15.033 988 96.844 -0.82668 -4.9108 989 81.183 11.515 -29.529 990 64.989 37.122 -55.585 991 78.658 -6.4031 -33.700 992 81.661 13.404 -28.750 993 75.848 -4.4717 -38.201 994 81.532 42.834 9.0541 995 91.006 -6.8950 -14.099 996 82.147 15.290 -27.960 997 78.390 6.7135 -34.040 998 76.096 3.9034 -37.748 999 81.062 -10.105 -29.878 1000 82.311 46.201 -8.7890 1001 82.070 -12.887 -28.290 1002 75.668 2.0526 -38.450 1003 82.418 46.659 -10.970 1004 93.851 10.686 11.051 1005 63.237 26.351 -58.524 1006 93.055 13.740 7.5643 1007 80.461 -5.4134 -30.806 1008 91.431 -4.9054 -13.414 1009 86.149 26.848 23.058 1010 85.556 36.958 -6.1388 1011 90.912 6.3100 -14.133 1012 82.456 -10.969 -27.661 1013 90.451 4.3505 -14.876 1014 86.922 23.944 26.559 1015 84.894 33.836 9.3107 1016 90.055 -4.2256 -15.573 1017 81.456 -8.1947 -29.236 1018 82.584 10.706 -27.297 1019 85.259 35.568 0.42197 1020 85.389 29.744 19.563 1021 86.720 22.892 33.414 1022 80.319 1.1753 -30.988 1023 85.630 30.928 12.781 1024 84.782 26.710 40.268 1025 87.287 18.779 46.071 1026 96.084 0.22353 28.114 1027 80.761 45.230 7.8993 1028 80.756 3.0809 -30.275 1029 80.872 -3.5046 -30.136 1030 15.314 39.774 -36.972 1031 89.629 -6.2076 -16.260 1032 21.992 48.498 -46.784 1033 81.041 46.419 1.1194 1034 88.322 17.122 40.405 1035 89.071 5.0403 -17.046 1036 92.549 18.322 -2.3478 1037 89.549 0.41845 -16.331 1038 96.948 5.5040 4.3323 1039 92.361 17.295 1.9334 1040 81.445 48.123 -7.7652 1041 90.964 9.3916 44.050 1042 80.189 48.377 2.2246 1043 58.308 48.206 -66.523 1044 80.673 44.851 10.181 1045 83.243 32.336 33.304 1046 86.076 26.479 25.337 1047 81.834 38.244 24.012 1048 91.694 -49.059 60.035 1049 58.788 53.411 -65.699 1050 97.908 -4.9364 30.744 1051 93.771 2.2990 43.277 1052 60.021 -79.909 67.213 1053 50.133 32.594 -80.179 1054 89.747 -57.791 -9.6429 1055 90.113 -57.504 16.236 1056 94.735 0.062214 42.307 1057 81.197 41.361 18.226 1058 77.518 62.996 -20.940 1059 77.045 61.290 -12.181 1060 81.120 41.016 20.543 1061 81.278 41.716 15.919 1062 90.505 6.6884 66.277 1063 89.819 10.497 54.118 1064 89.645 -58.766 -7.5290 1065 91.375 -51.105 57.348 1066 58.715 57.087 -65.798 1067 76.266 63.024 -10.990 1068 75.736 61.127 0.31034 1069 89.702 -58.818 -2.8672 1070 76.037 57.582 10.592 1071 89.984 -58.056 11.397 1072 89.778 -58.716 1.8424 1073 86.320 20.786 49.492 1074 74.662 73.978 -30.144 1075 81.762 37.915 26.340 1076 76.046 62.242 -6.5084 1077 97.485 -7.6924 46.108 1078 91.065 -53.115 54.652 1079 80.971 40.354 25.200 1080 82.365 34.518 34.491 1081 88.888 12.816 55.205 1082 82.429 34.820 32.153 1083 75.269 59.436 11.925 1084 82.949 30.913 44.973 1085 75.871 52.025 40.293 1086 74.978 62.893 1.6090 1087 76.774 50.460 34.046 1088 93.421 0.13630 58.814 1089 20.992 47.603 -48.464 1090 22.344 49.188 -49.076 1091 90.972 -53.181 43.091 1092 76.053 52.738 33.038 1093 90.766 -55.085 51.950 1094 92.427 2.2061 62.026 1095 15.682 40.501 -39.460 1096 50.266 51.696 -79.871 1097 75.184 59.123 14.284 1098 12.752 37.061 -38.130 1099 77.279 47.198 44.672 1100 85.367 22.829 52.940 1101 75.283 54.734 34.472 1102 75.629 56.047 22.420 1103 88.800 12.320 59.674 1104 50.105 37.838 -80.203 1105 80.225 36.983 55.771 1106 78.031 44.845 45.674 1107 87.008 -82.628 16.032 1108 75.554 55.766 24.815 1109 81.662 31.166 68.903 1110 89.485 -63.607 36.212 1111 89.252 -65.227 33.528 1112 88.759 12.087 61.887 1113 79.391 39.234 57.091 1114 80.039 36.124 67.043 1115 89.096 -66.102 28.625 1116 82.489 28.658 69.845 1117 8.9578 17.699 -44.592 1118 90.476 -57.011 49.245 1119 77.886 44.227 52.801 1120 7.9025 13.824 -39.939 1121 86.665 -86.159 20.180 1122 76.438 49.106 48.493 1123 90.042 -59.626 39.378 1124 89.730 -61.923 38.906 1125 73.016 60.354 41.468 1126 27.068 57.213 -68.691 1127 73.575 57.849 47.243 1128 73.526 57.672 49.676 1129 90.198 -58.890 46.539 1130 74.163 55.328 52.955 1131 89.985 -60.180 41.608 1132 87.913 -76.577 40.808 1133 88.674 -71.184 57.907 1134 87.966 -76.674 50.109 END_DATA # And then come the triangles KEYWORD "VERTEX_0" KEYWORD "VERTEX_1" KEYWORD "VERTEX_2" NUMBER_OF_FIELDS 3 BEGIN_DATA_FORMAT VERTEX_0 VERTEX_1 VERTEX_2 END_DATA_FORMAT NUMBER_OF_SETS 2266 BEGIN_DATA 83 1 88 48 1 100 99 48 100 45 2 106 67 3 130 3 129 130 123 136 144 39 4 154 41 39 154 159 120 168 135 122 170 76 69 172 175 178 184 174 175 186 152 167 188 149 155 190 167 155 191 155 149 193 144 136 194 136 149 194 123 144 194 149 192 194 149 136 197 195 149 197 138 173 198 185 189 205 189 181 205 151 156 208 117 108 210 200 117 210 199 204 211 141 151 212 143 140 213 141 212 214 212 207 214 204 199 215 140 143 216 206 209 217 209 203 217 112 97 218 97 201 218 213 140 219 118 141 220 141 214 220 201 202 221 202 203 221 204 206 222 211 204 222 198 173 223 199 198 223 173 178 223 215 199 223 183 196 225 207 212 226 196 207 226 225 196 226 140 137 227 219 140 227 0 14 228 98 0 228 182 187 230 185 200 231 182 181 232 181 189 232 101 98 233 98 228 233 127 117 234 117 200 234 200 185 234 224 229 235 203 209 236 221 203 236 222 206 237 224 235 238 224 238 239 214 207 240 220 214 240 156 151 241 179 187 242 187 182 242 182 232 242 145 127 243 205 145 243 185 205 243 127 234 243 234 185 243 105 102 244 202 201 245 224 239 246 244 224 246 103 101 247 101 233 247 229 224 247 233 229 247 180 183 248 183 225 248 102 104 249 244 102 249 104 103 249 103 247 249 224 244 249 247 224 249 207 196 250 111 112 251 112 218 251 218 201 251 201 221 251 206 217 252 237 206 252 209 206 254 206 253 254 179 180 256 180 248 256 187 179 256 181 182 257 205 181 257 43 53 261 258 43 261 235 229 261 212 151 262 226 212 262 210 108 263 206 204 265 253 206 265 204 215 265 229 233 266 233 228 266 14 43 266 43 258 266 228 14 266 258 261 266 261 229 266 200 210 267 210 263 267 113 110 268 110 260 268 114 113 268 244 246 269 107 109 270 208 156 271 180 179 272 179 242 272 183 180 272 56 64 275 53 56 275 261 53 275 235 261 275 221 236 276 269 246 278 189 185 280 185 231 280 232 189 280 260 255 281 255 273 281 236 209 282 209 254 282 276 236 282 151 208 283 262 151 283 226 262 283 208 271 283 267 270 284 270 269 284 269 278 284 238 235 285 105 244 286 244 269 286 269 270 286 275 64 287 225 226 288 226 283 288 283 271 288 271 156 290 264 274 292 279 264 292 267 284 293 134 137 294 238 285 295 293 284 297 284 278 300 297 284 300 108 107 301 107 270 301 263 108 301 267 263 301 270 267 301 259 277 302 201 97 303 245 201 303 239 238 304 238 295 304 246 239 304 278 246 304 300 278 304 170 174 305 280 231 306 232 280 306 293 297 306 248 225 308 225 288 308 288 271 308 271 290 308 256 248 308 291 256 308 290 291 308 231 200 309 200 267 309 267 293 309 293 306 309 306 231 309 289 279 310 279 292 310 96 95 311 296 273 312 297 300 313 300 304 313 109 105 314 105 286 314 270 109 314 286 270 314 96 311 315 75 80 316 74 75 316 235 275 316 285 235 316 64 74 316 287 64 316 275 287 316 251 221 317 221 276 317 118 111 317 111 251 317 102 105 318 105 299 318 152 145 319 145 205 319 205 257 319 257 152 319 94 96 320 96 315 320 99 94 320 182 230 321 259 302 323 128 138 324 138 198 324 198 199 324 199 211 324 320 315 326 260 281 327 296 312 328 312 298 328 115 114 329 114 268 329 268 260 329 260 327 329 116 115 329 273 255 330 312 273 330 65 62 331 62 55 332 331 62 332 55 48 333 48 99 333 320 326 333 326 332 333 332 55 333 273 296 334 296 328 334 297 313 335 298 289 336 289 310 336 310 322 336 322 328 336 328 298 336 302 277 337 277 307 337 337 307 338 230 187 339 326 315 340 322 310 341 99 320 342 320 333 342 333 99 342 327 281 343 281 273 343 265 215 344 315 311 345 340 315 345 328 322 346 334 328 346 322 341 346 187 256 347 339 187 347 256 291 347 323 302 348 302 337 348 337 338 348 292 325 349 311 95 350 345 311 350 109 107 351 250 196 352 162 119 353 332 326 355 326 340 355 340 345 357 355 340 357 307 277 358 299 307 358 105 109 359 299 105 359 109 351 359 116 329 361 329 327 361 327 343 361 307 299 362 338 307 362 351 338 362 299 359 362 359 351 362 274 259 363 292 274 363 259 323 363 325 292 363 240 207 366 207 250 366 178 175 367 223 178 367 215 223 367 344 215 367 348 338 368 338 351 368 273 334 369 343 273 369 346 341 369 334 346 369 295 285 370 285 316 370 351 107 371 368 351 371 156 162 372 290 156 372 365 343 373 343 369 373 80 69 374 316 80 374 370 316 374 357 345 375 364 356 375 345 350 376 350 364 376 364 375 376 375 345 376 310 292 377 292 349 377 341 310 377 107 108 378 371 107 378 121 116 380 116 361 380 361 343 380 343 365 380 196 183 381 352 196 381 183 272 381 368 371 382 371 378 382 295 370 383 323 348 384 348 368 384 331 332 385 332 355 385 313 304 386 335 313 386 304 295 386 295 383 386 257 182 388 182 321 388 289 298 389 69 76 390 374 69 390 370 374 390 368 382 391 384 368 391 323 384 391 232 306 392 306 297 392 297 335 392 325 363 393 78 65 394 65 331 394 331 385 394 92 78 394 372 162 395 291 290 395 290 372 395 347 291 395 276 282 396 282 254 396 116 121 397 264 279 399 279 289 399 108 117 400 378 108 400 365 373 401 126 128 402 54 50 403 58 54 403 203 202 404 354 203 404 202 245 404 52 51 405 50 52 405 403 50 405 46 45 406 45 106 406 106 110 406 51 46 406 259 274 408 274 264 408 152 188 411 379 410 411 379 391 412 410 379 412 391 382 412 357 375 413 125 126 414 126 407 414 382 378 415 378 400 415 412 382 415 410 412 415 403 405 417 113 114 418 114 115 418 93 92 419 387 93 419 392 335 420 363 323 423 323 391 423 391 379 423 379 393 423 393 363 423 76 77 424 390 76 424 405 51 427 51 406 427 110 113 427 113 418 427 406 110 427 383 370 429 370 390 429 393 379 430 379 411 430 349 325 430 325 393 430 409 417 431 417 405 431 405 427 431 427 418 431 115 116 432 418 115 432 431 418 432 217 203 433 252 217 433 237 252 433 203 354 433 277 259 435 259 408 435 61 58 436 58 403 436 59 61 436 403 417 436 63 59 436 425 426 436 417 409 437 425 436 438 436 417 438 417 437 438 126 402 439 407 126 439 414 407 439 397 121 440 121 398 440 116 397 440 432 116 440 408 264 442 422 420 443 68 63 445 63 436 445 436 426 445 73 68 445 434 428 447 124 125 448 125 414 448 117 127 449 400 117 449 415 400 449 441 445 450 445 426 450 369 341 452 373 369 452 401 373 452 341 377 452 72 70 454 70 73 454 73 445 454 445 441 454 392 420 455 441 450 456 426 425 457 425 438 457 421 443 458 220 240 459 240 366 459 360 220 459 453 360 459 121 124 460 398 121 460 124 448 460 446 447 461 447 454 461 454 441 461 441 456 461 456 446 461 440 398 462 398 460 462 385 355 463 394 385 463 92 394 463 419 92 463 272 242 464 289 389 466 399 289 466 128 324 467 402 128 467 254 253 468 396 254 468 446 456 469 457 438 470 465 457 470 358 277 472 277 435 472 450 426 473 426 457 473 457 465 473 431 432 474 432 440 474 440 462 474 409 431 474 462 471 474 437 409 474 438 437 474 470 438 474 471 470 474 255 260 475 330 255 475 421 458 476 428 434 477 125 124 478 390 424 479 429 390 479 383 429 479 462 460 480 470 471 480 471 462 480 434 447 481 477 434 481 3 67 482 67 72 482 447 428 482 72 454 482 454 447 482 25 3 482 428 477 482 456 450 483 469 456 483 450 473 483 37 38 484 451 37 484 38 40 484 154 153 484 40 41 484 41 154 484 469 483 487 356 360 488 375 356 488 360 453 488 413 375 488 44 42 490 42 25 490 25 482 490 482 477 490 317 276 492 276 396 492 153 157 493 411 410 494 127 145 494 448 414 495 470 480 495 460 448 497 480 460 497 448 495 497 495 480 497 439 402 499 402 467 499 444 416 500 478 444 500 380 365 501 365 401 502 401 444 502 501 365 502 478 124 502 444 478 502 377 349 503 349 416 503 486 507 508 496 485 508 477 481 509 481 489 509 489 485 509 253 265 510 468 253 510 36 37 511 37 451 511 447 446 512 481 447 512 446 469 512 469 487 512 487 486 512 489 481 512 485 489 512 486 508 512 508 485 512 77 81 513 424 77 513 381 272 514 272 464 514 490 477 515 477 509 515 509 506 515 410 415 516 415 449 516 494 410 516 449 127 516 127 494 516 500 416 517 486 487 518 507 486 518 487 483 518 465 470 519 470 495 519 473 465 519 167 152 520 388 167 520 152 257 520 257 388 520 162 156 521 519 495 522 451 484 523 484 153 523 153 493 523 493 498 523 511 451 523 506 509 524 95 97 525 350 95 525 97 112 525 265 344 527 510 265 527 122 119 529 119 162 529 162 521 529 521 528 529 508 507 530 507 518 530 510 527 532 529 528 533 528 532 533 476 458 534 458 479 534 479 424 534 424 513 534 264 399 535 442 264 535 399 466 535 170 122 536 122 529 536 529 533 536 174 170 536 124 121 537 121 380 537 380 501 537 501 502 537 502 124 537 532 527 538 533 532 538 536 533 538 367 175 539 344 367 539 527 344 539 538 527 539 47 44 540 44 490 540 490 515 540 174 536 541 536 538 541 175 174 541 539 175 541 538 539 541 521 156 544 528 521 544 145 152 545 152 411 545 411 494 545 494 145 545 483 473 546 518 483 546 473 519 546 519 522 546 355 357 547 531 355 547 81 82 548 513 81 548 476 534 548 534 513 548 505 511 549 468 510 550 510 532 550 532 528 550 528 544 550 491 504 551 542 491 551 523 498 551 498 542 551 511 523 551 549 511 551 422 443 552 463 355 553 355 531 553 419 463 553 543 419 553 91 93 554 93 387 554 387 419 554 419 543 554 298 312 555 389 298 555 128 126 556 500 128 556 478 500 556 211 222 557 324 211 557 467 324 557 335 386 558 386 383 558 383 479 558 554 543 560 24 36 561 36 511 561 354 404 562 524 509 563 552 560 565 126 125 566 125 478 566 478 556 566 556 126 566 414 439 567 439 499 567 495 414 567 522 495 567 499 467 567 467 557 567 546 522 567 517 416 568 504 491 569 41 40 570 39 41 570 20 21 571 526 20 571 21 24 571 505 526 571 40 38 572 570 40 572 509 485 573 563 509 573 485 496 573 222 237 575 557 222 575 416 444 577 444 401 577 401 452 577 452 377 577 377 503 577 503 416 577 468 550 579 550 544 579 544 578 579 564 559 580 241 151 581 151 578 581 156 241 581 544 156 581 578 544 581 531 547 582 37 36 584 38 37 584 572 38 584 508 530 585 575 574 585 82 84 586 548 82 586 476 548 586 11 4 587 4 39 589 39 570 589 570 572 589 572 584 589 587 4 589 163 161 591 588 163 591 242 232 592 232 392 592 392 455 592 464 242 592 24 21 593 36 24 593 584 36 593 511 505 595 561 511 595 24 561 595 571 24 595 505 571 595 551 504 596 504 569 596 596 569 597 22 17 598 17 590 598 543 553 599 553 531 599 531 565 599 560 543 599 565 560 599 157 158 600 493 157 600 498 493 600 542 498 600 559 564 600 491 542 600 576 491 600 564 576 600 158 580 602 580 559 602 559 600 602 600 158 602 563 573 603 573 562 603 237 433 604 575 237 604 574 575 604 582 547 605 601 160 606 13 12 607 18 13 607 594 18 607 163 588 608 27 32 612 32 23 612 250 352 613 366 250 613 459 366 613 352 381 613 601 606 614 160 159 615 159 606 615 606 160 615 492 396 616 396 468 616 468 579 616 579 578 616 606 159 617 166 609 617 526 505 618 505 549 618 549 551 618 551 596 618 21 20 619 593 21 619 20 18 619 18 594 619 594 607 619 546 567 620 567 557 620 530 518 620 585 530 620 518 546 620 557 575 620 575 585 620 57 49 621 49 47 621 515 506 621 60 57 621 47 540 621 540 515 621 569 491 624 491 576 624 610 611 624 576 623 624 597 569 624 623 610 624 31 27 625 34 31 625 27 612 625 591 161 626 161 160 626 160 601 626 588 591 626 588 622 630 562 573 631 573 496 631 496 508 631 508 585 631 585 574 631 574 604 631 614 606 632 606 617 632 15 11 633 11 587 633 16 15 633 17 16 633 590 17 633 598 590 633 601 614 634 626 601 634 622 588 634 588 626 634 443 420 635 458 443 635 420 335 635 335 558 635 479 458 635 558 479 635 158 163 636 580 158 636 163 608 636 596 597 637 20 526 639 622 634 640 23 22 641 22 598 641 612 23 641 617 609 642 632 617 642 85 86 643 84 85 644 85 643 644 586 84 644 611 610 645 630 622 645 622 640 645 416 349 646 349 430 646 568 416 646 430 629 646 141 118 647 118 317 647 317 492 647 151 141 647 492 616 647 578 151 648 616 578 648 151 647 648 647 616 648 596 637 651 597 624 651 637 597 651 506 524 652 621 506 652 453 459 654 459 613 654 624 611 655 611 628 655 583 651 655 651 624 655 628 638 656 655 628 656 593 619 657 619 607 657 627 657 658 657 607 658 90 91 659 91 554 659 554 560 659 576 564 660 623 576 660 564 580 660 580 636 660 610 623 660 593 657 661 89 90 662 90 659 662 560 552 662 659 560 662 608 588 664 636 608 664 588 630 664 660 636 664 645 610 664 610 660 664 630 645 664 614 632 665 632 642 665 634 614 665 640 634 665 649 640 665 650 649 665 430 411 666 629 430 666 435 408 667 661 435 667 589 584 667 584 593 667 593 661 667 159 168 669 617 159 669 413 488 670 312 330 671 555 312 671 168 166 672 669 168 672 166 617 672 617 669 672 103 104 673 101 103 673 420 422 674 455 420 674 464 592 674 592 455 674 628 611 676 611 645 676 645 640 676 640 649 676 443 421 677 421 476 677 644 643 677 476 586 677 586 644 677 433 354 678 604 433 678 354 562 678 562 631 678 631 604 678 98 101 679 101 673 679 565 531 680 531 582 680 582 605 680 663 565 680 381 514 681 514 668 681 613 381 681 618 596 682 653 618 682 535 466 683 598 633 683 641 598 683 442 535 685 587 589 685 589 667 685 408 442 685 667 408 685 633 587 685 683 633 686 633 685 686 535 683 686 685 535 686 679 673 688 357 413 689 547 357 689 413 670 689 358 472 690 164 169 692 687 164 692 682 596 693 653 682 693 169 171 696 692 169 696 166 165 697 609 166 697 650 665 697 665 642 697 642 609 697 165 687 697 695 650 697 687 695 697 641 683 698 87 89 699 89 662 699 86 87 699 662 552 699 625 612 700 612 641 700 35 34 700 34 625 700 641 698 700 690 472 701 657 627 701 10 9 702 12 10 702 607 12 702 8 7 702 7 691 702 9 8 702 658 607 702 330 475 703 687 692 704 695 687 704 692 696 704 453 654 705 650 695 706 695 704 706 704 694 706 472 435 707 435 661 707 661 657 707 657 701 707 701 472 707 679 688 708 688 658 708 7 6 708 691 7 708 658 702 708 702 691 708 654 613 709 613 681 709 705 654 709 681 668 709 656 638 710 655 656 710 563 603 711 524 563 711 652 524 711 500 517 712 422 552 714 552 565 714 565 663 714 680 605 714 663 680 714 638 628 715 628 676 715 649 650 715 676 649 715 650 706 715 694 638 715 706 694 715 552 443 716 443 677 716 699 552 716 643 86 716 86 699 716 677 643 716 165 164 717 164 687 717 687 165 717 111 118 718 360 356 718 118 220 718 220 360 718 162 353 719 353 119 719 395 162 719 466 389 720 683 466 720 698 683 720 389 555 720 700 698 720 703 700 720 119 123 721 719 119 721 488 453 722 453 705 722 670 488 722 102 318 723 318 713 723 713 684 723 668 514 724 638 694 725 710 638 725 318 299 726 299 358 726 627 658 726 701 627 726 658 688 726 688 684 726 713 318 726 358 690 726 690 701 726 684 713 726 194 192 727 347 395 728 395 719 728 123 194 728 721 123 728 719 721 728 696 171 729 671 330 730 330 703 730 555 671 730 703 720 730 720 555 730 167 191 731 666 411 731 689 670 732 670 722 732 722 705 732 155 167 733 167 388 733 149 190 734 192 149 734 727 192 734 194 727 735 728 194 735 339 347 735 734 339 735 347 728 735 727 734 735 190 155 736 155 733 736 388 321 736 733 388 736 321 230 737 230 339 737 734 190 737 190 736 737 736 321 737 339 734 737 596 651 739 651 583 739 675 693 739 693 596 739 673 104 740 684 688 740 688 673 740 104 102 740 102 723 740 723 684 740 26 28 741 29 30 741 30 33 741 28 29 741 33 35 741 35 700 741 700 703 741 703 475 741 19 26 741 475 260 741 245 303 742 404 245 742 562 404 742 603 562 742 711 603 742 694 704 743 704 696 743 696 729 743 188 167 745 167 731 745 411 188 745 731 411 745 605 547 746 547 689 746 689 732 746 725 694 747 738 725 747 694 743 747 147 146 748 514 464 749 464 674 749 674 422 749 422 714 749 605 746 750 732 705 750 746 732 750 724 514 751 514 749 751 749 714 751 714 605 751 605 750 751 138 128 753 128 500 753 173 138 753 500 712 753 77 76 754 76 172 754 150 147 755 147 748 755 172 177 756 177 752 756 752 754 756 754 172 756 755 748 757 3 25 758 129 3 758 25 42 758 130 129 758 146 130 758 748 146 758 705 709 759 709 668 759 668 724 759 724 751 759 750 705 759 751 750 759 85 84 760 84 82 761 760 84 761 82 81 763 81 77 765 763 81 765 77 754 765 754 752 765 764 763 765 142 148 766 765 752 768 764 765 768 710 725 769 725 738 769 738 744 769 148 150 770 766 148 770 150 755 770 755 757 771 770 755 771 757 762 771 142 766 772 766 770 772 761 82 773 82 763 773 763 764 773 655 710 774 710 769 774 177 176 775 752 177 775 176 171 776 775 176 776 738 747 777 744 738 778 738 777 778 2 19 779 106 2 779 19 741 779 110 106 779 260 110 779 741 260 779 85 760 780 757 748 782 748 758 782 762 757 782 583 655 783 655 774 783 739 583 783 618 653 784 770 771 787 86 85 788 85 780 788 785 86 788 87 86 789 86 785 789 89 87 789 772 770 790 770 787 790 161 163 791 760 761 792 761 773 792 780 760 792 792 773 795 768 752 798 752 775 798 764 768 798 176 177 800 171 176 800 729 171 800 159 160 802 790 787 804 775 776 805 798 775 805 793 798 805 139 142 807 142 772 807 793 805 808 130 146 810 758 42 811 791 781 812 161 791 812 781 801 812 160 161 813 799 160 813 712 517 814 173 753 814 753 712 814 161 812 815 813 161 815 794 809 816 785 788 819 788 780 819 780 792 819 792 818 819 773 764 820 764 798 820 798 793 820 795 773 820 792 795 820 776 171 821 805 776 821 171 169 821 808 805 821 159 802 822 160 799 822 802 160 822 191 155 824 155 193 824 666 731 824 731 191 824 49 57 825 57 767 825 819 818 826 675 739 829 517 568 830 90 89 831 89 789 831 18 20 833 20 639 833 526 618 833 618 784 833 639 526 833 133 131 834 762 782 835 771 762 835 787 771 835 133 139 838 139 807 838 143 120 839 120 159 839 159 822 839 675 829 841 119 122 842 123 119 842 122 135 842 135 170 842 774 769 843 739 783 843 783 774 843 796 823 843 823 739 843 826 818 845 193 149 846 149 195 846 568 646 846 646 629 846 824 193 846 629 666 846 666 824 846 826 845 848 170 305 849 842 170 849 821 169 851 772 790 853 790 804 853 789 785 854 785 819 854 819 826 854 831 789 854 828 831 854 826 848 854 807 772 855 772 853 855 838 807 855 804 787 856 787 835 856 853 804 856 174 186 857 305 174 857 849 305 857 133 838 858 859 836 862 136 123 863 123 842 863 197 136 863 195 197 863 846 195 863 777 747 864 92 93 866 853 856 867 844 860 868 801 852 868 860 801 868 794 816 868 816 862 868 852 794 868 862 836 868 131 133 869 133 858 869 812 801 870 801 860 870 815 812 870 860 844 870 806 861 871 786 847 872 818 792 875 792 820 875 845 818 875 806 871 876 876 871 877 793 808 878 820 793 878 801 781 879 852 801 879 93 91 880 146 147 882 810 146 882 875 820 883 42 44 884 811 42 884 47 49 884 49 825 884 44 47 884 782 758 884 825 782 884 758 811 884 91 90 885 90 831 885 831 828 885 880 91 885 844 868 887 868 836 887 874 844 887 133 834 888 835 832 889 856 835 889 867 856 889 832 881 889 139 133 890 840 139 890 133 888 890 93 880 891 836 859 892 887 836 894 827 877 894 877 887 894 836 892 894 892 827 894 164 165 895 175 184 896 849 857 898 842 849 898 863 842 898 846 863 898 866 93 899 93 891 899 891 866 899 837 786 900 786 872 900 169 164 901 164 886 901 851 169 901 797 874 902 877 871 902 874 887 902 887 877 902 835 782 903 832 835 903 881 832 903 866 891 905 838 855 906 858 838 906 855 853 906 653 693 907 848 845 908 854 848 908 134 132 909 828 854 910 885 828 910 880 885 910 891 880 910 905 891 910 65 78 912 568 846 913 846 898 913 830 568 913 871 861 914 861 893 914 902 871 914 797 902 914 889 881 915 915 881 916 854 908 917 888 834 918 890 888 918 803 904 919 893 861 920 867 889 921 889 915 921 861 806 922 920 861 922 904 803 923 921 915 924 803 919 925 747 743 926 864 747 926 800 177 926 743 729 926 729 800 926 905 910 927 910 854 927 854 917 927 820 878 929 883 820 929 825 767 930 906 853 931 847 817 932 872 847 932 927 917 933 918 834 934 1 83 935 83 79 935 79 71 935 915 916 936 925 915 936 853 867 937 931 853 937 867 921 937 148 142 938 909 132 939 886 164 940 164 895 940 901 886 940 166 168 941 186 175 942 175 896 942 857 186 942 830 913 942 898 857 942 913 898 942 851 901 943 901 940 943 808 821 944 821 851 944 851 943 944 878 808 944 929 878 944 943 929 944 134 909 945 909 939 945 873 840 946 840 890 946 890 918 946 78 92 947 912 78 947 92 866 947 803 912 947 923 803 947 739 823 948 829 739 948 841 829 948 781 791 949 879 781 949 791 163 949 163 879 949 915 925 950 925 919 950 806 876 951 922 806 951 876 928 951 862 816 952 859 862 952 872 932 952 892 859 952 932 892 952 943 940 953 940 895 954 953 940 954 814 517 955 517 830 955 896 184 955 830 942 955 942 896 955 925 936 956 916 881 956 936 916 956 799 813 957 813 815 957 815 870 957 60 621 958 71 66 958 935 71 958 66 60 958 621 652 958 924 915 959 915 950 959 850 897 961 897 920 961 920 922 961 850 865 962 865 934 962 893 920 963 920 897 963 897 850 963 850 962 963 869 858 964 858 906 964 906 931 964 132 131 964 939 132 964 131 869 964 873 946 965 62 65 967 65 912 967 912 803 967 803 925 967 925 956 967 178 173 968 173 814 968 184 178 968 955 184 968 814 955 968 866 905 969 923 947 969 947 866 969 809 794 970 816 809 971 952 816 971 900 872 971 872 952 971 809 970 971 911 960 972 953 954 974 131 132 975 834 131 975 934 834 975 845 875 976 908 845 976 917 908 976 875 883 976 165 166 977 166 941 977 895 165 977 954 895 977 974 954 977 147 150 978 882 147 978 150 148 978 148 938 978 918 934 979 934 865 979 946 918 979 865 850 979 850 961 979 961 972 979 905 927 980 927 933 980 969 905 980 137 134 981 134 945 981 945 939 981 893 963 982 876 877 984 877 827 984 827 892 984 892 932 984 928 876 984 711 742 985 742 303 985 142 139 986 139 840 986 938 142 986 840 873 986 922 951 987 951 928 987 928 983 987 120 143 988 168 120 988 143 213 988 941 168 988 213 219 988 921 924 989 924 959 989 782 825 990 825 930 990 903 782 990 933 917 991 980 933 991 937 921 992 921 989 992 969 980 993 980 991 993 960 911 994 953 974 995 931 937 996 937 992 996 964 931 996 959 950 997 989 959 997 950 919 998 997 950 998 917 976 999 991 917 999 883 929 1001 976 883 1001 999 976 1001 919 904 1002 998 919 1002 904 923 1002 923 969 1002 969 993 1002 938 986 1003 978 938 1003 870 844 1004 844 874 1004 874 797 1004 957 870 1004 881 903 1005 956 881 1005 967 956 1005 903 990 1005 797 914 1006 914 893 1006 1004 797 1006 893 982 1006 974 977 1008 995 974 1008 977 941 1008 941 988 1008 928 984 1009 984 973 1009 873 965 1010 986 873 1010 1003 986 1010 1000 1003 1010 227 137 1011 137 981 1011 219 227 1011 981 939 1011 929 943 1012 1001 929 1012 999 1001 1012 988 219 1013 219 1011 1013 1008 988 1013 932 817 1014 973 984 1014 984 932 1014 911 972 1015 994 911 1015 995 1008 1016 991 999 1017 1007 991 1017 999 1012 1017 964 996 1018 996 992 1018 992 989 1018 972 960 1019 979 972 1019 965 946 1019 946 979 1019 1010 965 1019 983 928 1020 928 1009 1020 817 847 1021 1014 817 1021 993 991 1022 1002 993 1022 997 998 1022 998 1002 1022 961 922 1023 972 961 1023 1015 972 1023 922 987 1023 163 158 1026 879 163 1026 794 852 1026 970 794 1026 852 879 1026 989 997 1028 1018 989 1028 997 1022 1028 991 1007 1029 1022 991 1029 1007 1017 1029 1028 1022 1029 652 711 1030 711 985 1030 943 953 1031 1012 943 1031 953 995 1031 995 1016 1031 1017 1012 1031 1029 1017 1031 958 652 1032 960 994 1033 1019 960 1033 1000 1010 1033 1010 1019 1033 994 1027 1033 847 786 1034 1021 847 1034 1024 1021 1034 1025 1024 1034 939 964 1035 964 1018 1035 1011 939 1035 1013 1011 1035 1018 1028 1035 962 934 1036 934 975 1036 134 294 1036 294 137 1036 132 134 1036 975 132 1036 1008 1013 1037 1016 1008 1037 1029 1031 1037 1031 1016 1037 1013 1035 1037 1028 1029 1037 1035 1028 1037 140 216 1038 216 143 1038 143 839 1038 822 799 1038 799 957 1038 839 822 1038 957 1004 1038 1006 140 1038 1004 1006 1038 963 962 1039 982 963 1039 137 140 1039 140 1006 1039 1006 982 1039 1036 137 1039 962 1036 1039 1003 1000 1040 1000 1033 1040 786 837 1041 1025 1034 1041 1034 786 1041 1033 1027 1042 1040 1033 1042 79 83 1043 930 767 1043 990 930 1043 1005 990 1043 1027 994 1044 1014 1021 1045 1021 1024 1045 1024 966 1045 1009 973 1046 973 1014 1046 1014 1045 1046 983 1020 1047 13 18 1048 18 833 1048 833 784 1048 71 79 1049 79 1043 1049 1043 767 1049 158 157 1050 970 1026 1050 1026 158 1050 837 900 1051 1041 837 1051 5 0 1052 0 98 1052 6 5 1052 708 6 1052 98 679 1052 679 708 1052 55 62 1053 62 967 1053 967 1005 1053 172 69 1054 177 172 1054 926 177 1054 769 744 1055 796 843 1055 843 769 1055 970 1050 1056 1050 157 1056 900 971 1056 1051 900 1056 971 970 1056 987 983 1057 810 882 1058 882 978 1058 978 1003 1058 72 1058 1059 1003 1040 1059 1058 1003 1059 983 1047 1060 1057 983 1060 1015 1023 1061 1023 987 1061 987 1057 1061 994 1015 1061 1044 994 1061 16 17 1062 15 16 1062 69 80 1064 1054 69 1064 926 1054 1064 12 13 1065 784 653 1065 653 907 1065 13 1048 1065 1048 784 1065 60 66 1066 57 60 1066 767 57 1066 66 71 1066 71 1049 1066 1049 767 1066 70 72 1067 72 1059 1067 73 70 1067 80 75 1069 1064 80 1069 864 926 1069 926 1064 1069 1042 1027 1070 1068 1042 1070 1027 1044 1070 744 778 1071 1055 744 1071 778 777 1072 777 864 1072 864 1069 1072 75 74 1072 74 1071 1072 1069 75 1072 1071 778 1072 1024 1025 1073 72 67 1074 67 130 1074 130 810 1074 810 1058 1074 1058 72 1074 1020 1009 1075 1047 1020 1075 1009 1046 1075 1059 1040 1076 1067 1059 1076 73 1067 1076 1040 1042 1076 1042 1068 1076 157 153 1077 153 1056 1077 1056 157 1077 9 10 1078 10 12 1078 12 1065 1078 1065 907 1078 1060 1047 1079 1047 1075 1079 1045 966 1080 1025 1041 1081 1041 1063 1081 1073 1025 1081 1046 1045 1082 1075 1046 1082 1045 1080 1082 59 63 1083 966 1024 1084 1080 966 1084 68 73 1086 73 1076 1086 1076 1068 1086 63 68 1086 1083 63 1086 1068 1070 1086 1070 1083 1086 1079 1075 1087 1075 1082 1087 4 11 1088 154 4 1088 1051 1056 1088 1056 153 1088 153 154 1088 1041 1051 1088 1063 1041 1088 96 94 1089 94 99 1090 1089 94 1090 958 1032 1090 1032 1089 1090 693 675 1091 675 841 1091 1079 1087 1092 7 8 1093 8 9 1093 9 1078 1093 1078 907 1093 907 693 1093 693 1091 1093 11 15 1094 1088 11 1094 15 1062 1094 1062 1063 1094 1063 1088 1094 1030 985 1095 652 1030 1095 1032 652 1095 95 96 1095 96 1089 1095 1089 1032 1095 88 1 1096 83 88 1096 1043 83 1096 1070 1044 1097 58 61 1097 61 59 1097 59 1083 1097 1083 1070 1097 97 95 1098 303 97 1098 985 303 1098 95 1095 1098 1095 985 1098 1082 1080 1099 1085 1087 1099 1087 1082 1099 22 23 1100 1073 1081 1100 1024 1073 1100 1084 1024 1100 51 52 1101 1087 1085 1101 1092 1087 1101 1044 1061 1102 1097 1044 1102 54 58 1102 58 1097 1102 1061 1057 1102 1063 1062 1103 1081 1063 1103 22 1100 1103 1100 1081 1103 1 48 1104 1096 1 1104 48 55 1104 55 1053 1104 1005 1043 1104 1043 1096 1104 1053 1005 1104 31 34 1105 1084 1100 1105 1080 1084 1106 1099 1080 1106 64 56 1107 74 64 1107 1071 74 1107 1055 1071 1107 1060 1079 1108 1079 1092 1108 1057 1060 1108 1102 1057 1108 50 54 1108 54 1102 1108 52 50 1108 1101 52 1108 1092 1101 1108 32 27 1109 1105 1100 1109 841 948 1110 1110 948 1111 17 22 1112 22 1103 1112 1062 17 1112 1103 1062 1112 34 35 1113 1105 34 1113 27 31 1114 31 1105 1114 1105 1109 1114 1109 27 1114 56 53 1115 823 796 1115 796 1055 1115 53 43 1115 43 1111 1115 948 823 1115 1111 948 1115 23 32 1116 1100 23 1116 32 1109 1116 1109 1100 1116 112 111 1117 364 350 1117 356 364 1117 350 525 1117 525 112 1117 7 1093 1118 1093 1091 1118 33 30 1119 29 28 1119 30 29 1119 1084 1105 1119 1106 1084 1119 35 33 1119 1113 35 1119 1105 1113 1119 111 718 1120 718 356 1120 356 1117 1120 1117 111 1120 1055 1107 1121 1115 1055 1121 1107 56 1121 56 1115 1121 1099 1106 1122 28 26 1122 1119 28 1122 1106 1119 1122 1091 841 1123 1110 0 1124 841 1110 1124 1123 841 1124 2 45 1125 45 46 1125 1101 1085 1125 46 51 1125 51 1101 1125 100 1 1126 1 935 1126 99 100 1126 1090 99 1126 935 958 1126 958 1090 1126 2 1125 1127 1125 1085 1127 19 2 1128 2 1127 1128 1085 1099 1128 1127 1085 1128 1099 1122 1128 1118 1091 1129 1091 1123 1129 26 19 1130 1122 26 1130 19 1128 1130 1128 1122 1130 0 5 1131 5 6 1131 6 1129 1131 1123 1124 1131 1129 1123 1131 14 0 1132 0 1110 1132 43 14 1132 1111 43 1132 1110 1111 1132 6 7 1133 7 1118 1133 1118 1129 1133 1129 6 1133 1124 0 1134 0 1131 1134 1131 1124 1134 END_DATA DisplayCAL-3.1.0.0/DisplayCAL/ref/CMYK_IDEAlliance_ControlStrip_2009.ti10000644000076500000000000000401012647526511024667 0ustar devwheel00000000000000CTI3 DESCRIPTOR "Argyll Calibration Target chart information 1" ORIGINATOR "Argyll target" CREATED "Mon Jan 24 02:20:54 2011" KEYWORD "DEVICE_CLASS" DEVICE_CLASS "OUTPUT" KEYWORD "COLOR_REP" COLOR_REP "CMYK" KEYWORD "TOTAL_INK_LIMIT" TOTAL_INK_LIMIT "320" NUMBER_OF_FIELDS 9 BEGIN_DATA_FORMAT SAMPLE_ID CMYK_C CMYK_M CMYK_Y CMYK_K END_DATA_FORMAT NUMBER_OF_SETS 54 BEGIN_DATA 1 100.00 0.0000 0.0000 60.000 2 100.00 100.00 0.0000 60.000 3 100.00 0.0000 0.0000 0.0000 4 100.00 100.00 0.0000 0.0000 5 70.000 0.0000 0.0000 0.0000 6 70.000 70.000 0.0000 0.0000 7 30.000 0.0000 0.0000 0.0000 8 30.000 30.000 0.0000 0.0000 9 0.0000 100.00 0.0000 60.000 10 0.0000 100.00 100.00 60.000 11 0.0000 100.00 0.0000 0.0000 12 0.0000 100.00 100.00 0.0000 13 0.0000 70.000 0.0000 0.0000 14 0.0000 70.000 70.000 0.0000 15 0.0000 30.000 0.0000 0.0000 16 0.0000 30.000 30.000 0.0000 17 0.0000 0.0000 100.00 60.000 18 100.00 0.0000 100.00 60.000 19 0.0000 0.0000 100.00 0.0000 20 100.00 0.0000 100.00 0.0000 21 0.0000 0.0000 70.000 0.0000 22 70.000 0.0000 70.000 0.0000 23 0.0000 0.0000 30.000 0.0000 24 30.000 0.0000 30.000 0.0000 25 100.00 0.0000 40.000 0.0000 26 100.00 40.000 0.0000 0.0000 27 40.000 100.00 0.0000 0.0000 28 0.0000 100.00 40.000 0.0000 29 0.0000 40.000 100.00 0.0000 30 40.000 0.0000 100.00 0.0000 31 0.0000 40.000 70.000 40.000 32 10.000 40.000 40.000 0.0000 33 0.0000 70.000 40.000 40.000 34 20.000 70.000 70.000 0.0000 35 40.000 70.000 0.0000 40.000 36 0.0000 70.000 70.000 40.000 37 40.000 0.0000 70.000 40.000 38 70.000 0.0000 40.000 40.000 39 70.000 40.000 0.0000 40.000 40 0.0000 0.0000 0.0000 0.0000 41 0.0000 0.0000 0.0000 3.0000 42 3.1000 2.2000 2.2000 0.0000 43 0.0000 0.0000 0.0000 10.000 44 10.200 7.4000 7.4000 0.0000 45 0.0000 0.0000 0.0000 25.000 46 25.000 19.000 19.000 0.0000 47 0.0000 0.0000 0.0000 50.000 48 50.000 40.000 40.000 0.0000 49 0.0000 0.0000 0.0000 75.000 50 75.000 66.000 66.000 0.0000 51 0.0000 0.0000 0.0000 90.000 52 100.00 100.00 100.00 0.0000 53 0.0000 0.0000 0.0000 100.00 54 80.000 70.000 70.000 100.00 END_DATA DisplayCAL-3.1.0.0/DisplayCAL/ref/ColorCheckerDC.cie0000644000076500000000000001073212647526511021443 0ustar devwheel00000000000000CTI3 DESCRIPTOR "ColorChecker DC" NUMBER_OF_FIELDS 4 BEGIN_DATA_FORMAT SAMPLE_ID XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 176 BEGIN_DATA "B02" 10.26 6.986 3.709 "B03" 8.117 7.331 4.126 "B04" 21.80 21.78 12.61 "B05" 11.83 12.81 7.411 "B06" 6.141 6.924 4.000 "B07" 5.193 7.080 4.396 "B08" 4.936 6.906 6.348 "B09" 5.837 6.785 7.608 "B10" 4.628 4.874 8.564 "B11" 7.894 6.836 5.897 "C02" 24.61 13.76 6.707 "C03" 15.18 12.79 5.962 "C04" 13.65 13.08 5.052 "C05" 18.37 21.18 8.776 "C06" 9.747 12.71 6.479 "C07" 8.169 12.73 6.727 "C08" 8.828 12.27 10.85 "C09" 6.238 7.033 10.98 "C10" 6.119 6.894 14.03 "C11" 9.411 7.279 7.021 "D02" 26.07 13.73 3.872 "D03" 17.36 13.54 4.715 "D04" 21.92 21.86 4.864 "D05" 17.34 21.23 5.530 "D06" 24.38 33.36 9.102 "D07" 6.890 12.66 7.180 "D08" 12.83 21.37 18.87 "D09" 6.341 6.794 14.21 "D10" 6.253 6.521 16.70 "D11" 10.11 7.026 8.259 "E02" 39.11 22.37 7.320 "E03" 31.19 22.52 4.339 "E04" 22.89 21.65 5.058 "E05" 18.11 21.04 4.907 "E06" 38.49 47.57 20.10 "E07" 13.05 21.66 12.82 "E08" 7.659 13.01 16.31 "E09" 8.791 12.53 22.27 "E10" 10.31 12.30 30.72 "E11" 19.76 12.69 15.86 "F02" 53.36 33.43 12.94 "F03" 17.83 12.08 4.423 "F04" 34.61 33.06 9.646 "F05" 15.60 20.69 7.243 "F06" 42.14 48.63 10.75 "F07" 11.64 21.38 9.212 "F08" 8.861 12.73 18.29 "F09" 9.610 12.52 20.25 "F10" 11.63 12.47 31.36 "F11" 23.77 13.43 10.80 "G02" 49.20 32.94 17.60 "G03" 26.90 21.38 9.193 "G04" 27.90 21.97 4.960 "G05" 15.08 21.58 5.221 "G06" 40.28 47.73 6.461 "G07" 21.49 32.72 16.43 "G08" 22.09 32.00 42.71 "G09" 15.74 20.76 28.50 "G10" 11.91 12.88 26.24 "G11" 34.93 21.85 20.32 "H02" 37.02 22.47 11.24 "H03" 38.32 31.67 14.93 "H04" 18.62 13.39 3.116 "H05" 23.37 33.23 7.524 "H06" 57.55 64.84 21.95 "H07" 25.02 32.24 12.26 "H08" 24.15 32.27 38.64 "H09" 15.16 20.67 37.65 "H10" 19.31 20.90 44.42 "H11" 32.43 21.92 20.28 "I02" 24.39 21.13 17.11 "I03" 35.36 31.84 18.02 "I04" 47.14 32.50 7.072 "I05" 91.05 94.49 79.20 "I06" 34.29 35.57 30.14 "I07" 18.27 19.01 16.26 "I08" 7.787 8.054 6.973 "I09" 27.67 32.49 43.64 "I10" 32.27 32.46 51.27 "I11" 45.48 32.98 29.70 "J02" 29.77 21.40 16.95 "J03" 38.17 32.79 12.65 "J04" 64.16 47.44 9.866 "J05" 71.04 73.85 62.34 "J08" 4.741 4.946 4.354 "J09" 27.67 31.67 51.23 "J10" 46.05 46.72 65.44 "J11" 59.09 47.07 41.39 "K02" 40.60 32.83 22.06 "K03" 40.69 33.40 10.00 "K04" 59.00 47.58 11.47 "K05" 57.35 59.59 50.86 "K08" 3.822 3.972 3.481 "K09" 23.94 31.83 52.69 "K10" 24.29 21.52 41.28 "K11" 35.96 32.14 27.46 "L02" 59.57 46.56 33.19 "L03" 64.34 47.46 23.98 "L04" 45.22 34.02 4.378 "L05" 45.18 46.96 39.73 "L06" 26.04 27.07 23.03 "L07" 12.30 12.86 11.11 "L08" 3.346 3.463 3.073 "L09" 35.41 46.33 60.75 "L10" 8.770 6.822 11.54 "L11" 69.03 63.81 54.35 "M02" 75.50 64.99 51.37 "M03" 60.08 47.32 30.52 "M04" 75.29 64.82 15.18 "M05" 84.48 89.40 15.91 "M06" 16.71 21.43 21.34 "M07" 17.73 32.42 13.34 "M08" 57.69 63.19 58.65 "M09" 36.13 47.07 52.53 "M10" 7.988 6.853 9.721 "M11" 86.41 86.83 76.05 "N02" 73.00 66.51 47.63 "N03" 55.87 46.81 32.41 "N04" 70.45 65.29 18.06 "N05" 69.08 64.89 8.128 "N06" 23.68 32.73 33.70 "N07" 18.90 33.08 19.40 "N08" 59.94 64.89 69.83 "N09" 54.80 63.99 66.01 "N10" 18.75 13.31 21.89 "N11" 46.25 32.99 36.89 "O02" 52.13 47.02 35.24 "O03" 57.32 46.99 17.92 "O04" 85.43 86.17 57.30 "O05" 50.77 47.08 5.065 "O06" 26.22 32.65 32.95 "O07" 29.84 47.26 21.83 "O08" 31.00 32.48 32.12 "O09" 55.76 63.57 54.85 "O10" 25.56 21.67 26.33 "O11" 35.68 32.37 39.64 "P02" 49.15 47.54 37.87 "P03" 79.00 65.68 26.18 "P04" 88.31 86.54 43.56 "P05" 34.88 32.71 6.072 "P06" 22.26 31.83 27.11 "P07" 34.57 46.54 30.95 "P08" 19.04 21.02 26.30 "P09" 42.08 47.53 43.25 "P10" 22.06 21.29 20.40 "P11" 49.17 48.04 51.58 "Q02" 66.40 65.12 47.44 "Q03" 75.17 65.07 35.10 "Q04" 90.88 87.40 54.80 "Q05" 36.64 32.58 6.494 "Q06" 21.01 32.53 31.70 "Q07" 48.84 64.88 44.35 "Q08" 41.52 45.77 30.25 "Q09" 44.52 46.48 19.69 "Q10" 27.54 31.51 25.28 "Q11" 10.45 12.48 10.77 "R02" 34.49 33.28 23.65 "R03" 62.99 63.02 41.41 "R04" 87.86 86.91 64.56 "R05" 47.13 47.02 9.339 "R06" 31.21 46.37 35.73 "R07" 53.79 64.17 37.91 "R08" 29.66 31.97 19.21 "R09" 44.00 47.63 14.11 "R10" 13.05 12.96 6.652 "R11" 18.95 21.81 18.60 "S02" 45.00 46.92 29.57 "S03" 72.02 75.95 47.27 "S04" 3.399 3.716 17.47 "S05" 3.604 12.41 3.262 "S06" 19.54 8.953 0.481 "S07" 98.58 102.1 84.61 "S08" 0.310 0.321 0.272 "S09" 80.47 82.68 5.113 "S10" 18.81 8.361 3.465 "S11" 7.357 12.52 27.55 END_DATADisplayCAL-3.1.0.0/DisplayCAL/ref/ColorCheckerSG.cie0000644000076500000000000000465112647526511021471 0ustar devwheel00000000000000CTI3 DESCRIPTOR "ColorChecker SG" NUMBER_OF_FIELDS 4 BEGIN_DATA_FORMAT SAMPLE_ID XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 96 BEGIN_DATA "B2" 15.25 7.988 10.03 "B3" 38.96 31.43 39.81 "B4" 11.86 5.893 18.49 "B5" 16.19 18.20 47.74 "B6" 22.73 30.12 44.69 "B7" 1.581 2.706 3.100 "B8" 19.65 29.53 32.75 "B9" 3.648 3.700 1.914 "C2" 5.044 3.714 6.813 "C3" 16.19 12.85 29.44 "C4" 3.120 2.875 10.80 "C5" 25.26 29.54 48.77 "C6" 2.058 2.770 6.094 "C7" 29.15 30.48 51.32 "C8" 11.15 19.48 20.92 "C9" 20.41 31.10 14.85 "D2" 67.39 69.80 67.61 "D3" 76.91 71.85 59.79 "D4" 60.68 71.41 60.46 "D5" 77.16 72.99 54.02 "D6" 62.96 70.59 34.96 "D7" 41.61 33.77 10.58 "D8" 42.10 36.36 18.96 "D9" 10.37 19.81 10.51 "E2" 9.624 7.790 2.439 "E3" 42.68 32.85 2.514 "E4" 4.495 2.583 19.77 "E5" 96.06 99.63 82.28 "E6" 0.869 0.897 0.775 "E7" 62.63 56.47 29.26 "E8" 60.17 50.68 24.82 "E9" 1.930 3.290 1.876 "F2" 40.60 35.06 18.02 "F3" 10.56 8.563 30.72 "F4" 12.91 22.07 4.987 "F5" 59.21 60.94 51.06 "F6" 6.958 7.195 6.143 "F7" 38.78 35.62 15.20 "F8" 40.13 36.87 20.35 "F9" 18.97 30.02 20.00 "G2" 15.56 16.47 26.39 "G3" 29.34 17.89 7.934 "G4" 20.99 10.17 1.510 "G5" 36.28 37.41 31.43 "G6" 12.00 12.43 10.49 "G7" 17.41 15.20 4.790 "G8" 40.73 36.58 20.43 "G9" 22.84 32.64 8.391 "H2" 8.481 11.41 2.672 "H3" 5.910 3.517 9.226 "H4" 62.39 64.77 4.647 "H5" 19.60 20.23 16.88 "H6" 30.25 31.18 26.25 "H7" 44.31 40.76 22.85 "H8" 41.22 36.93 19.50 "H9" 11.53 21.65 3.931 "I2" 23.05 21.04 33.97 "I3" 35.82 46.48 6.389 "I4" 31.44 18.44 23.56 "I5" 9.051 9.361 7.840 "I6" 51.58 53.10 44.52 "I7" 20.00 15.98 3.085 "I8" 11.77 10.01 2.754 "I9" 18.48 32.69 6.698 "J2" 30.59 42.07 35.10 "J3" 49.88 45.89 3.702 "J4" 11.90 16.91 30.83 "J5" 2.118 2.203 1.975 "J6" 78.61 81.25 68.58 "J7" 42.12 35.78 15.35 "J8" 44.57 38.94 16.20 "J9" 36.83 33.97 6.548 "K2" 75.49 73.23 44.37 "K3" 71.11 81.84 61.22 "K4" 71.48 70.71 65.90 "K5" 61.59 69.33 67.58 "K6" 44.37 45.75 38.50 "K7" 15.99 16.52 13.67 "K8" 3.180 3.279 2.775 "K9" 28.06 34.30 5.489 "L2" 6.687 3.870 2.198 "L3" 28.50 14.72 1.722 "L4" 41.88 31.49 24.17 "L5" 43.07 32.73 17.78 "L6" 50.17 34.55 2.064 "L7" 43.03 50.84 2.747 "L8" 33.10 34.49 5.219 "L9" 36.57 49.48 5.064 "M2" 26.03 13.72 8.384 "M3" 5.377 3.204 3.942 "M4" 24.74 12.37 2.737 "M5" 40.95 23.05 3.947 "M6" 73.66 67.15 5.790 "M7" 66.53 68.33 4.188 "M8" 38.83 47.72 3.714 "M9" 4.153 3.339 0.995 END_DATADisplayCAL-3.1.0.0/DisplayCAL/ref/ISO_12646-2008_color_accuracy_and_gray_balance.ti10000644000076500000000000002076712647526511027003 0ustar devwheel00000000000000CTI1 ORIGINATOR "Argyll targen" CREATED "Mon May 18 22:11:12 2015" KEYWORD "COMP_GREY_STEPS" COMP_GREY_STEPS "21" KEYWORD "BLACK_COLOR_PATCHES" BLACK_COLOR_PATCHES "1" KEYWORD "APPROX_WHITE_POINT" APPROX_WHITE_POINT "95.106486 100.000000 108.844025" DESCRIPTOR "Argyll Calibration Target chart information 1" KEYWORD "MULTI_DIM_STEPS" MULTI_DIM_STEPS "5" KEYWORD "WHITE_COLOR_PATCHES" WHITE_COLOR_PATCHES "1" KEYWORD "COLOR_REP" COLOR_REP "RGB" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT SAMPLE_ID RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 141 BEGIN_DATA 1 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 2 5.0000 5.0000 5.0000 1.3704 1.3897 1.4245 3 10.000 10.000 10.000 1.9432 1.9923 2.0809 4 15.000 15.000 15.000 2.8451 2.9411 3.1145 5 20.000 20.000 20.000 4.1154 4.2774 4.5701 6 25.000 25.000 25.000 5.7878 6.0367 6.4867 7 30.000 30.000 30.000 7.8923 8.2507 8.8984 8 35.000 35.000 35.000 10.456 10.948 11.836 9 40.000 40.000 40.000 13.504 14.154 15.329 10 45.000 45.000 45.000 17.059 17.894 19.403 11 50.000 50.000 50.000 21.143 22.190 24.083 12 55.000 55.000 55.000 25.776 27.064 29.392 13 60.000 60.000 60.000 30.977 32.536 35.353 14 65.000 65.000 65.000 36.766 38.626 41.987 15 70.000 70.000 70.000 43.159 45.351 49.313 16 75.000 75.000 75.000 50.173 52.730 57.351 17 80.000 80.000 80.000 57.824 60.779 66.119 18 85.000 85.000 85.000 66.128 69.515 75.636 19 90.000 90.000 90.000 75.101 78.954 85.918 20 95.000 95.000 95.000 84.755 89.111 96.982 21 100.00 100.00 100.00 95.106 100.00 108.84 22 0.0000 0.0000 25.000 1.9092 1.3636 5.7889 23 0.0000 0.0000 50.000 4.8251 2.5298 21.148 24 0.0000 0.0000 75.000 10.338 4.7346 50.184 25 0.0000 0.0000 100.00 18.871 8.1473 95.129 26 0.0000 25.000 0.0000 2.8013 4.6021 1.6004 27 0.0000 25.000 25.000 3.7105 4.9657 6.3893 28 0.0000 25.000 50.000 6.6264 6.1319 21.748 29 0.0000 25.000 75.000 12.139 8.3367 50.785 30 0.0000 25.000 100.00 20.672 11.749 95.729 31 0.0000 50.000 0.0000 8.5782 16.154 3.5261 32 0.0000 50.000 25.000 9.4874 16.518 8.3150 33 0.0000 50.000 50.000 12.403 17.684 23.674 34 0.0000 50.000 75.000 17.916 19.889 52.711 35 0.0000 50.000 100.00 26.449 23.302 97.655 36 0.0000 75.000 0.0000 19.500 37.995 7.1667 37 0.0000 75.000 25.000 20.409 38.358 11.956 38 0.0000 75.000 50.000 23.325 39.525 27.314 39 0.0000 75.000 75.000 28.838 41.729 56.351 40 0.0000 75.000 100.00 37.371 45.142 101.30 41 0.0000 100.00 0.0000 36.405 71.800 12.802 42 0.0000 100.00 25.000 37.314 72.164 17.591 43 0.0000 100.00 50.000 40.230 73.330 32.949 44 0.0000 100.00 75.000 45.743 75.535 61.986 45 0.0000 100.00 100.00 54.276 78.948 106.93 46 25.000 0.0000 0.0000 3.0773 2.0711 1.0973 47 25.000 0.0000 25.000 3.9865 2.4347 5.8863 48 25.000 0.0000 50.000 6.9024 3.6009 21.245 49 25.000 0.0000 75.000 12.415 5.8057 50.282 50 25.000 0.0000 100.00 20.948 9.2184 95.226 51 25.000 25.000 0.0000 4.8786 5.6731 1.6978 52 25.000 25.000 50.000 8.7037 7.2029 21.845 53 25.000 25.000 75.000 14.217 9.4077 50.882 54 25.000 25.000 100.00 22.750 12.820 95.827 55 25.000 50.000 0.0000 10.655 17.225 3.6234 56 25.000 50.000 25.000 11.565 17.589 8.4123 57 25.000 50.000 50.000 14.481 18.755 23.771 58 25.000 50.000 75.000 19.994 20.960 52.808 59 25.000 50.000 100.00 28.527 24.373 97.752 60 25.000 75.000 0.0000 21.577 39.066 7.2641 61 25.000 75.000 25.000 22.486 39.429 12.053 62 25.000 75.000 50.000 25.402 40.596 27.412 63 25.000 75.000 75.000 30.915 42.800 56.449 64 25.000 75.000 100.00 39.448 46.213 101.39 65 25.000 100.00 0.0000 38.483 72.872 12.899 66 25.000 100.00 25.000 39.392 73.235 17.688 67 25.000 100.00 50.000 42.308 74.401 33.047 68 25.000 100.00 75.000 47.821 76.606 62.084 69 25.000 100.00 100.00 56.354 80.019 107.03 70 50.000 0.0000 0.0000 9.7393 5.5060 1.4095 71 50.000 0.0000 25.000 10.649 5.8697 6.1984 72 50.000 0.0000 50.000 13.565 7.0358 21.557 73 50.000 0.0000 75.000 19.077 9.2407 50.594 74 50.000 0.0000 100.00 27.610 12.653 95.538 75 50.000 25.000 0.0000 11.541 9.1081 2.0099 76 50.000 25.000 25.000 12.450 9.4717 6.7988 77 50.000 25.000 50.000 15.366 10.638 22.157 78 50.000 25.000 75.000 20.879 12.843 51.194 79 50.000 25.000 100.00 29.412 16.255 96.139 80 50.000 50.000 0.0000 17.317 20.660 3.9356 81 50.000 50.000 25.000 18.227 21.024 8.7245 82 50.000 50.000 75.000 26.655 24.395 53.120 83 50.000 50.000 100.00 35.189 27.808 98.064 84 50.000 75.000 0.0000 28.239 42.501 7.5762 85 50.000 75.000 25.000 29.148 42.864 12.365 86 50.000 75.000 50.000 32.065 44.031 27.724 87 50.000 75.000 75.000 37.577 46.236 56.761 88 50.000 75.000 100.00 46.110 49.648 101.70 89 50.000 100.00 0.0000 45.145 76.306 13.211 90 50.000 100.00 25.000 46.054 76.670 18.000 91 50.000 100.00 50.000 48.970 77.836 33.359 92 50.000 100.00 75.000 54.483 80.041 62.396 93 50.000 100.00 100.00 63.016 83.454 107.34 94 75.000 0.0000 0.0000 22.335 12.000 1.9997 95 75.000 0.0000 25.000 23.244 12.364 6.7886 96 75.000 0.0000 50.000 26.160 13.530 22.147 97 75.000 0.0000 75.000 31.673 15.735 51.184 98 75.000 0.0000 100.00 40.206 19.148 96.129 99 75.000 25.000 0.0000 24.136 15.602 2.6001 100 75.000 25.000 25.000 25.045 15.966 7.3891 101 75.000 25.000 50.000 27.961 17.132 22.748 102 75.000 25.000 75.000 33.474 19.337 51.785 103 75.000 25.000 100.00 42.007 22.750 96.729 104 75.000 50.000 0.0000 29.913 27.154 4.5258 105 75.000 50.000 25.000 30.822 27.518 9.3147 106 75.000 50.000 50.000 33.738 28.684 24.673 107 75.000 50.000 75.000 39.251 30.889 53.710 108 75.000 50.000 100.00 47.784 34.302 98.655 109 75.000 75.000 0.0000 40.835 48.995 8.1664 110 75.000 75.000 25.000 41.744 49.359 12.955 111 75.000 75.000 50.000 44.660 50.525 28.314 112 75.000 75.000 100.00 58.706 56.142 102.30 113 75.000 100.00 0.0000 57.740 82.801 13.802 114 75.000 100.00 25.000 58.649 83.164 18.590 115 75.000 100.00 50.000 61.565 84.331 33.949 116 75.000 100.00 75.000 67.078 86.535 62.986 117 75.000 100.00 100.00 75.611 89.948 107.93 118 100.00 0.0000 0.0000 41.830 22.052 2.9132 119 100.00 0.0000 25.000 42.739 22.416 7.7021 120 100.00 0.0000 50.000 45.655 23.582 23.061 121 100.00 0.0000 75.000 51.168 25.787 52.098 122 100.00 0.0000 100.00 59.701 29.200 97.042 123 100.00 25.000 0.0000 43.631 25.654 3.5137 124 100.00 25.000 25.000 44.541 26.018 8.3026 125 100.00 25.000 50.000 47.457 27.184 23.661 126 100.00 25.000 75.000 52.969 29.389 52.698 127 100.00 25.000 100.00 61.503 32.801 97.643 128 100.00 50.000 0.0000 49.408 37.206 5.4393 129 100.00 50.000 25.000 50.318 37.570 10.228 130 100.00 50.000 50.000 53.233 38.736 25.587 131 100.00 50.000 75.000 58.746 40.941 54.624 132 100.00 50.000 100.00 67.279 44.354 99.568 133 100.00 75.000 0.0000 60.330 59.047 9.0799 134 100.00 75.000 25.000 61.239 59.411 13.869 135 100.00 75.000 50.000 64.155 60.577 29.227 136 100.00 75.000 75.000 69.668 62.782 58.264 137 100.00 75.000 100.00 78.201 66.194 103.21 138 100.00 100.00 0.0000 77.235 92.853 14.715 139 100.00 100.00 25.000 78.145 93.216 19.504 140 100.00 100.00 50.000 81.061 94.382 34.862 141 100.00 100.00 75.000 86.573 96.587 63.900 END_DATA CTI1 ORIGINATOR "Argyll targen" KEYWORD "DENSITY_EXTREME_VALUES" DENSITY_EXTREME_VALUES "8" CREATED "May 18, 2015" DESCRIPTOR "Argyll Calibration Target chart information 1" KEYWORD "INDEX" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT INDEX RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 8 BEGIN_DATA 0 100.000 100.000 100.000 95.1065 100.000 108.844 1 0.00000 47.3607 100.000 25.6130 21.6292 97.3763 2 100.000 0.00000 79.3514 52.4258 26.2898 58.7215 3 0.00000 0.00000 58.9971 6.48583 3.19399 29.8944 4 100.000 66.6593 0.00000 56.0588 50.5054 7.65614 5 0.00000 35.6011 0.00000 4.68562 8.37021 2.22855 6 84.4444 0.00000 0.00000 28.8428 15.3558 2.30466 7 0.00000 0.00000 0.00000 1.00000 1.00000 1.00000 END_DATA CTI1 ORIGINATOR "Argyll targen" CREATED "May 18, 2015" DESCRIPTOR "Argyll Calibration Target chart information 1" KEYWORD "DEVICE_COMBINATION_VALUES" DEVICE_COMBINATION_VALUES "9" KEYWORD "INDEX" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT INDEX RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 9 BEGIN_DATA 0 100.000 100.000 100.000 95.1065 100.000 108.844 1 0.00000 100.000 100.000 54.2763 78.9478 106.931 2 100.000 0.00000 100.000 59.7013 29.1995 97.0422 3 0.00000 0.00000 100.000 18.8711 8.14731 95.1290 4 100.000 100.000 0.00000 77.2354 92.8527 14.7151 5 0.00000 100.000 0.00000 36.4052 71.8005 12.8018 6 100.000 0.00000 0.00000 41.8302 22.0522 2.91323 7 0.00000 0.00000 0.00000 1.00000 1.00000 1.00000 8 50.0000 50.0000 50.0000 21.1427 22.1901 24.0831 END_DATADisplayCAL-3.1.0.0/DisplayCAL/ref/SMPTE240M.icm0000644000076500000000000000507412647526511020137 0ustar devwheel00000000000000 R g |  & < R h ~   2 I ` w   4 L d }  ) B \ u )C]w3Ni+Gc+He4Rp'Fe!@`!Bb(Jk7Y{)Lo DhAfDj'Ms 3ZFm 5^ ) R { ! !J!t!!!""F"q"""##G#r###$$K$w$$$%'%T%%%&&3&`&&&''C'q'''()(W((())@)o)))*,*\***++K+|++, ,>,o,,--3-e---.+.].../&/Y///0$0X0001%1Y1112)2]222303e3344:4o4455F5|5566V666717h7788F8~889&9^99::@:y::;$;];;< >P>>??=?x??@+@g@@AAXAABBKBBCC?C}CCD6DtDDE.EmEEF)FhFFG%GdGGH#HcHHI$IdIIJ&JgJJK*KkKKL0LrLLM8MzMMNBNNO ONOOPP\PPQ(QlQQR9R~RSSLSSTTaTTU3UyUVVKVVWWfWWX;XXYYZYYZ2ZzZ[ [S[[\.\w\] ]S]]^0^z^__Y__`8``aadaabGbbc*cvcdd[ddeBeef)fvfgg_gghIhhi4iij jojk k]kklKllm;mmn-n}noopoppdpqqXqqrNrrsFsst>ttu7uuv2vvw.wwx+xxy)y~yz(z}z{({~{|*||}-}}~0~~5;CKU_kņx҇- .patch { border-left: 1px solid silver; } td.patch + td.patch > .patch { border-left: none; border-right: 1px solid silver; } .overview td.patch { border-bottom: none; } .overview tr.last-row td.patch { border-bottom: 1px solid silver; } div.patch, div.sample_id { padding: .125em .25em .125em 0; width: 1.75em; } td.sample_id, div.sample_id { width: auto; } .ok { color: #339900; } .warn { color: #FF3300; font-weight: bold; } .ko { color: red; font-weight: bold; } .hidden { color: white; visibility: hidden; } td.ok, td.ko { line-height: 1em; } .statonly, tr.statonly td { color: gray; } tr.verbose { display: none; } DisplayCAL-3.1.0.0/DisplayCAL/report/compare.constants.js0000644000076500000000000000614112647526510022743 0ustar devwheel00000000000000var DELTA_A_MAX = 'DELTA_A_MAX', DELTA_A_AVG = 'DELTA_A_AVG', DELTA_A_MED = 'DELTA_A_MED', // Median DELTA_A_MAD = 'DELTA_A_MAD', // Median absolute deviation DELTA_A_RANGE = 'DELTA_A_RANGE', // The 'range' between two delta values is calculated as follows: abs(delta1 - delta2) // e.g. if delta1 = -0.2 and delta2 = 0.3, the range is 0.5 DELTA_A_STDDEV = 'DELTA_A_STDDEV', // Standard deviation DELTA_A_B_RANGE = 'DELTA_A_B_RANGE', // The 'range' between two delta a b values is calculated as follows: abs(delta_a - delta_b) // e.g. if delta_a = -0.2 and delta_b = 0.3, the range is 0.5 DELTA_B_MAX = 'DELTA_B_MAX', DELTA_B_AVG = 'DELTA_B_AVG', DELTA_B_MED = 'DELTA_B_MED', // Median DELTA_B_MAD = 'DELTA_B_MAD', // Median absolute deviation DELTA_B_RANGE = 'DELTA_B_RANGE', // The 'range' between two delta values is calculated as follows: abs(delta1 - delta2) // e.g. if delta1 = -0.2 and delta2 = 0.3, the range is 0.5 DELTA_B_STDDEV = 'DELTA_B_STDDEV', // Standard deviation DELTA_E_MAX = 'DELTA_E_MAX', DELTA_E_AVG = 'DELTA_E_AVG', DELTA_E_MED = 'DELTA_E_MED', // Median DELTA_E_MAD = 'DELTA_E_MAD', // Median absolute deviation DELTA_E_RANGE = 'DELTA_E_RANGE', // The 'range' between two delta values is calculated as follows: abs(delta1 - delta2) // e.g. if delta1 = -0.2 and delta2 = 0.3, the range is 0.5 DELTA_E_STDDEV = 'DELTA_E_STDDEV', // Standard deviation DELTA_L_MAX = 'DELTA_L_MAX', DELTA_L_AVG = 'DELTA_L_AVG', DELTA_L_MED = 'DELTA_L_MED', // Median DELTA_L_MAD = 'DELTA_L_MAD', // Median absolute deviation DELTA_L_RANGE = 'DELTA_L_RANGE', // The 'range' between two delta values is calculated as follows: abs(delta1 - delta2) // e.g. if delta1 = -0.2 and delta2 = 0.3, the range is 0.5 DELTA_L_STDDEV = 'DELTA_L_STDDEV', // Standard deviation DELTA_C_MAX = 'DELTA_C_MAX', DELTA_C_AVG = 'DELTA_C_AVG', DELTA_C_MED = 'DELTA_C_MED', // Median DELTA_C_MAD = 'DELTA_C_MAD', // Median absolute deviation DELTA_C_RANGE = 'DELTA_C_RANGE', // The 'range' between two delta values is calculated as follows: abs(delta1 - delta2) // e.g. if delta1 = -0.2 and delta2 = 0.3, the range is 0.5 DELTA_C_STDDEV = 'DELTA_C_STDDEV', // Standard deviation DELTA_H_MAX = 'DELTA_H_MAX', DELTA_H_AVG = 'DELTA_H_AVG', DELTA_H_MED = 'DELTA_H_MED', // Median DELTA_H_MAD = 'DELTA_H_MAD', // Median absolute deviation DELTA_H_RANGE = 'DELTA_H_RANGE', // The 'range' between two delta values is calculated as follows: abs(delta1 - delta2) // e.g. if delta1 = -0.2 and delta2 = 0.3, the range is 0.5 DELTA_H_STDDEV = 'DELTA_H_STDDEV', // Standard deviation GAMMA_MAX = 'GAMMA_MAX', GAMMA_MIN = 'GAMMA_MIN', GAMMA_AVG = 'GAMMA_AVG', GAMMA_MED = 'GAMMA_MED', // Median GAMMA_MAD = 'GAMMA_MAD', // Median absolute deviation GAMMA_RANGE = 'GAMMA_RANGE', // The 'range' between two delta values is calculated as follows: abs(delta1 - delta2) // e.g. if delta1 = -0.2 and delta2 = 0.3, the range is 0.5 GAMMA_STDDEV = 'GAMMA_STDDEV', // Standard deviation CIE76 = 'CIE76', CIE94 = 'CIE94', CIE00 = 'CIE00', CMC11 = 'CMC11', CMC21 = 'CMC21';DisplayCAL-3.1.0.0/DisplayCAL/report/compare.css0000644000076500000000000001467312647526510021115 0ustar devwheel00000000000000a { text-decoration: none; } a:link, a:active { color: #006699; } a:visited { color: #666666; } a:hover, a:visited:hover { border-bottom: 1px dotted #0099CC; color: #0099CC; text-decoration: none; } :focus { box-shadow: none; outline: none; } html { background: #fff; border-top: 4px solid #202020; } body { font-size: 12px; margin: 17px auto; padding: 15px 20px; width: 900px; } button { background: rgb(249,249,249); /* Old browsers */ /* IE9 SVG, needs conditional override of 'filter' to 'none' */ background: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2Y5ZjlmOSIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiNjY2NjY2MiIHN0b3Atb3BhY2l0eT0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+); background: -moz-linear-gradient(top, rgba(249,249,249,1) 0%, rgba(204,204,204,1) 100%); /* FF3.6+ */ background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(249,249,249,1)), color-stop(100%,rgba(204,204,204,1))); /* Chrome,Safari4+ */ background: -webkit-linear-gradient(top, rgba(249,249,249,1) 0%,rgba(204,204,204,1) 100%); /* Chrome10+,Safari5.1+ */ background: -o-linear-gradient(top, rgba(249,249,249,1) 0%,rgba(204,204,204,1) 100%); /* Opera11.10+ */ background: -ms-linear-gradient(top, rgba(249,249,249,1) 0%,rgba(204,204,204,1) 100%); /* IE10+ */ background: linear-gradient(top, rgba(249,249,249,1) 0%,rgba(204,204,204,1) 100%); /* W3C */ border: 1px solid #999; border-radius: 15px; -moz-border-radius: 15px; -webkit-border-radius: 15px; color: #333; height: 30px; opacity: .9; padding: 0 10px; text-shadow: 1px 1px 1px #fff; } button:hover, button:focus, button:active { border-color: #09c; opacity: 1; } h2 { color: #333333; font-size: 20px; font-weight: normal; margin-bottom: 9px; } h3 { cursor: pointer; } p { line-height: 18px; } form, div.process { clear: both; } #F_out { margin-bottom: 20px; } form { margin: 0; } h1 { background: #202020; color: #fff; border: none; border-radius: 20px; -moz-border-radius: 20px; -webkit-border-radius: 20px; font-size: 12px; font-weight: lighter; padding: 12px 15px; z-index: 1; } p.error { color: #c00; font-weight: bold; } #report { /* display: none; oddly cuts off part of the summary in IE6 */ visibility: hidden; } .disabled { color: #999; } .options { line-height: 2em; margin: 6px 0 10px; width: 430px; } .functions { margin: 6px 0 10px; text-align: right; } .functions button { margin-left: 1em; } * > .functions { float: right; width: 430px; } input[type=checkbox] { vertical-align: middle; } label[for=FF_gray_balance_cal_only] { display: none; } table { width: 900px; } td, th { font-size: 12px; } .graph { position: relative; } .graph table, .graph th, .graph tr.x td, .graph .canvas, .canvas .overlay { background-color: #eee; border-radius: 10px; -moz-border-radius: 10px; -webkit-border-radius: 10px; color: #333; } .canvas .overlay { height: 900em; opacity: 0; pointer-events: none; position: absolute; width: 900em; z-index: 9999; } .graph th { padding: 0 .5em 0; } .graph .ref, .graph .act, .canvas .overlay { background: #eee; -moz-transition: all .125s linear; -webkit-transition: all .125s linear; -o-transition: all .125s linear; transition: all .125s linear; } .graph .col:hover .ref, .graph .col:hover .act, .hover .wrap.hover .ref, .hover .wrap.hover .act { -moz-transform: scale(1.6); -webkit-transform: scale(1.6); -o-transform: scale(1.6); -ms-transform: scale(1.6); transform: scale(1.6); } .hover .overlay { opacity: .9375; } .graph .act:hover, .hover .wrap.hover { z-index: 10000; } .toggle:before { content: '▼ '; font-size: 12px; position: relative; top: -2px; } .collapsed .toggle:before { content: '► '; } .collapsed .collapsed { display: none; } .dragging, .dragging * { cursor: move; } /* Pure CSS3 Tooltips */ [data-title] { cursor: default; } a[data-title] { cursor: pointer; } [data-title]:before { /* Tooltip body */ background: #333; border-radius: 0; -moz-border-radius: 0; -webkit-border-radius: 0; bottom: 0; box-shadow: 0 1px 3px rgba(0, 0, 0, .25); color: #fff; content: attr(data-title); font-size: 12px; font-weight: normal; height: 14px; left: 0; margin-left: 0; margin-top: 7px; overflow: hidden; padding: 4px 7px; text-align: center; text-overflow: ellipsis; white-space: nowrap; width: 100%; } [data-title]:after { /* Tooltip arrow */ border-bottom: 7px solid #333; border-left: 7px solid transparent; border-right: 7px solid transparent; bottom: 22px; content: ""; margin-left: -6px; margin-top: 0; } [data-title]:before, [data-title]:after { opacity: 0; pointer-events: none; position: fixed; top: auto; -moz-transform: translate3d(0, 0, 0) translateY(20px); -webkit-transform: translate3d(0, 0, 0) translateY(20px); -o-transform: translate3d(0, 0, 0) translateY(20px); -ms-transform: translate3d(0, 0, 0) translateY(20px); transform: translate3d(0, 0, 0) translateY(20px); -moz-transition: -moz-transform .25s ease, opacity .25s ease, visibility .25s ease; -webkit-transition: -webkit-transform .25s ease, opacity .25s ease, visibility .25s ease; -o-transition: -o-transform .25s ease, opacity .25s ease, visibility .25s ease; transition: transform .25s ease, opacity .25s ease, visibility .25s ease; visibility: hidden; z-index: 99999; } .canvas.dragging [data-title]:before, .canvas.dragging [data-title]:after { opacity: 0; visibility: hidden; } [data-title]:hover:after, [data-title]:hover:before { opacity: 1; -moz-transform: translate3d(0, 0, 0) translateX(0); -webkit-transform: translate3d(0, 0, 0) translateX(0); -o-transform: translate3d(0, 0, 0) translateX(0); -ms-transform: translate3d(0, 0, 0) translateX(0); transform: translate3d(0, 0, 0) translateX(0); visibility: visible; } [data-title]:hover:before, [data-title]:hover:after { -moz-transform: translate3d(0, 0, 0) translateY(0); -webkit-transform: translate3d(0, 0, 0) translateY(0); -o-transform: translate3d(0, 0, 0) translateY(0); -ms-transform: translate3d(0, 0, 0) translateY(0); transform: translate3d(0, 0, 0) translateY(0); }DisplayCAL-3.1.0.0/DisplayCAL/report/compare.functions.js0000644000076500000000000021311512647526510022740 0ustar devwheel00000000000000var p; // Array methods p=Array.prototype; p.indexof = function(v, ignore_case) { for (var i=0; i -1) ipart+=v.substr(i).length; while (v.length-1 && (data_end = src.search(_data_regexp2))>data_begin) { if (!this.data.length) { // 1st var header = lf2cr(src).substr(0, data_begin).replace(_data_format_regexp, ""); if (v = header.match(_header_regexp1)) for (i=0; i -1 && this.data_format.indexOf('CMYK_M') > -1 && this.data_format.indexOf('CMYK_Y') > -1 && this.data_format.indexOf('CMYK_K') > -1) this.device = 'CMYK'; else this.device = 'RGB'; if (comparison_criteria[this.id]) this.id = comparison_criteria[this.id].id; else this.id = this.device; return src ? true : false }; p=dataset.prototype; p.header_get = function() { var header=[], i, j, v; for (i=0; i-1) { header.push(["BEGIN_"+this.header[i][0]]); v=this.header[i][1].split("\n"); for (j=0; j 3 ? 3 : 0, // start offset for device values in fields_match (CMYK if length > 3, else RGB) devend = criteria.fields_match.length > 3 ? 6 : 2, // end offset for device values in fields_match (CMYK if length > 3, else RGB) missing_data, delta_calc_method = f['F_out'].elements['FF_delta_calc_method'].value, patch_number_html, verbosestats = f['F_out'].elements['FF_verbosestats'].checked, warn_deviation = criteria.warn_deviation, no_Lab = (this.data_format.indexof("LAB_L", true) < 0 || this.data_format.indexof("LAB_A", true) < 0 || this.data_format.indexof("LAB_B", true) < 0), no_XYZ = (this.data_format.indexof("XYZ_X", true) < 0 || this.data_format.indexof("XYZ_Y", true) < 0 || this.data_format.indexof("XYZ_Z", true) < 0), gray_balance_cal_only = f['F_out'].elements['FF_gray_balance_cal_only'].checked; if (profile_wp.length == 3) { for (var i=0; i= 1667 && colortemp < 4000) { f['F_out'].elements['FF_planckian'].checked = planckian = true; f['F_out'].elements['FF_planckian'].disabled = true; } colortemp_assumed = Math.round(colortemp / 100) * 100; if (planckian) wp_assumed = jsapi.math.color.planckianCT2XYZ(colortemp_assumed); else wp_assumed = jsapi.math.color.CIEDCorColorTemp2XYZ(colortemp_assumed); for (var i=0; i

Basic Information

', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', (e['FF_correction_matrix'].value ? '' : ''), ' ', ' ', ' ', ' ' ]; if (profile_wp.length == 3) this.report_html = this.report_html.concat([ ' ', ' ', ' ', ' ' ]); if (wp.length == 3) this.report_html = this.report_html.concat([ ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ' ]); if (bp.length == 3 && bp[0] > -1 && bp[1] > -1 && bp[2] > -1) this.report_html = this.report_html.concat([ ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ' ]); this.report_html = this.report_html.concat([ ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '
Device:' + e['FF_display'].value + '
Instrument:' + e['FF_instrument'].value + '
Correction:' + e['FF_correction_matrix'].value + '
Target profile:' + e['FF_profile'].value + '
Profile whitepoint XYZ (normalized):' + profile_wp_round.join(' ') + (profile_wp_norm_round.join(' ') != profile_wp_round.join(' ') ? ' (' + profile_wp_norm_round.join(' ') + ')' : '') + ', CCT = ' + profile_colortemp + 'K
Measured luminance:' + wp[1].accuracy(1) + ' cd/m²
Measured whitepoint XYZ (normalized):' + wp_round.join(' ') + ' (' + wp_norm_round.join(' ') + '), CCT = ' + colortemp + 'K
Assumed target whitepoint (XYZ):' + colortemp_assumed + 'K ' + (planckian ? 'blackbody' : 'daylight') + ' (' + wp_assumed_round.join(' ') + ')
Measured black luminance:' + bp[1].accuracy(4) + ' cd/m²
Contrast:' + (wp[1] / bp[1]).accuracy(1) + ':1
Testchart:' + this.testchart + '
Simulation profile:' + (SIMULATION_PROFILE || 'None') + '
Gamma mapping:' + (TRC_GAMMA ? (TRC ? TRC : TRC + ' ' + TRC_GAMMA.toFixed(2) + ' ' + {"b": "relative", "B": "absolute"}[TRC_GAMMA_TYPE] + ', black output offset ' + (TRC_OUTPUT_OFFSET * 100).toFixed(0) + '%') : (SIMULATION_PROFILE ? 'No' : 'N/A')) + '
Whitepoint simulation:' + (WHITEPOINT_SIMULATION ? 'Yes' + (WHITEPOINT_SIMULATION_RELATIVE ? ', relative to target profile whitepoint' : '') : (!DEVICELINK_PROFILE ? 'No' : 'N/A')) + '
Chromatic adaption:' + e['FF_adaption'].value + '
Devicelink profile:' + (DEVICELINK_PROFILE || 'None') + '
Evaluation criteria:' + criteria.name + '
Date:' + e['FF_datetime'].value + '
' ]); var result_start = this.report_html.length; this.report_html = this.report_html.concat([ '
', '

Summary

', '
', ' ', ' ', ' ', ' ' ]); var seen = []; for (var j=0; j(' + window.CAL_RGBLEVELS[0] + '/' + CAL_ENTRYCOUNT + ')'; } else { rules[j][3] = null; rules[j][4] = null; continue; } break; case 'CAL_GREENLEVELS': if (window.CAL_RGBLEVELS) { result[j].sum = (window.CAL_RGBLEVELS[1] / CAL_ENTRYCOUNT * 100).accuracy(1); result[j].htmlsum = result[j].sum + '%
(' + window.CAL_RGBLEVELS[1] + '/' + CAL_ENTRYCOUNT + ')'; } else { rules[j][3] = null; rules[j][4] = null; continue; } break; case 'CAL_BLUELEVELS': if (window.CAL_RGBLEVELS) { result[j].sum = (window.CAL_RGBLEVELS[2] / CAL_ENTRYCOUNT * 100).accuracy(1); result[j].htmlsum = result[j].sum + '%
(' + window.CAL_RGBLEVELS[2] + '/' + CAL_ENTRYCOUNT + ')'; } else { rules[j][3] = null; rules[j][4] = null; continue; } break; case 'CAL_GRAYLEVELS': if (window.CAL_RGBLEVELS) { var cal_graylevels = Math.min(CAL_RGBLEVELS[0], CAL_RGBLEVELS[1], CAL_RGBLEVELS[2]); result[j].sum = (cal_graylevels / CAL_ENTRYCOUNT * 100).accuracy(1); result[j].htmlsum = result[j].sum + '%
(' + cal_graylevels + '/' + CAL_ENTRYCOUNT + ')'; } else { rules[j][3] = null; rules[j][4] = null; continue; } break; case 'WHITEPOINT_MvsA': // Measured vs. assumed if (wp.length == 3) { target_Lab = jsapi.math.color.XYZ2Lab(wp_assumed[0], wp_assumed[1], wp_assumed[2]); actual_Lab = jsapi.math.color.XYZ2Lab(wp_norm[0], wp_norm[1], wp_norm[2]); // alert(rules[j] + '\ntarget_Lab: ' + target_Lab + '\nactual_Lab: ' + actual_Lab); delta = jsapi.math.color.delta(target_Lab[0], target_Lab[1], target_Lab[2], actual_Lab[0], actual_Lab[1], actual_Lab[2], rules[j][5]); result[j].E.push(delta.E); result[j].L.push(delta.L); result[j].C.push(delta.C); result[j].H.push(delta.H); result[j].a.push(delta.a); result[j].b.push(delta.b); } else { rules[j][3] = null; rules[j][4] = null; continue; } break; case 'WHITEPOINT_MvsP': // Profile vs. measured if (wp.length == 3 && profile_wp.length == 3) { target_Lab = jsapi.math.color.XYZ2Lab(profile_wp_norm[0], profile_wp_norm[1], profile_wp_norm[2]); actual_Lab = jsapi.math.color.XYZ2Lab(wp_norm[0], wp_norm[1], wp_norm[2]); // alert(rules[j] + '\ntarget_Lab: ' + target_Lab + '\nactual_Lab: ' + actual_Lab); delta = jsapi.math.color.delta(target_Lab[0], target_Lab[1], target_Lab[2], actual_Lab[0], actual_Lab[1], actual_Lab[2], rules[j][5]); result[j].E.push(delta.E); result[j].L.push(delta.L); result[j].C.push(delta.C); result[j].H.push(delta.H); result[j].a.push(delta.a); result[j].b.push(delta.b); } else { rules[j][3] = null; rules[j][4] = null; continue; } break; } }; this.report_html.push(' '); this.report_html.push('
'); this.report_html.push(' '); this.report_html.push(' '); var bar_html = []; if (result[j].sum != null && rules[j][2] && rules[j][2].indexOf("GAMMA") < 0) { if (!rules[j][3] || (rules[j][5] && rules[j][5].substr(3) != delta_calc_method.substr(3))) rgb = [204, 204, 204]; else { var rgb = [0, 255, 0], step = 255 / (rules[j][3] + rules[j][3] / 2); if (Math.abs(result[j].sum) <= rules[j][3]) { rgb[0] += Math.min(step * Math.abs(result[j].sum), 255); rgb[1] -= Math.min(step * Math.abs(result[j].sum), 255); var maxrg = Math.max(rgb[0], rgb[1]); rgb[0] *= (255 / maxrg); rgb[1] *= (255 / maxrg); rgb[0] = Math.round(rgb[0]); rgb[1] = Math.round(rgb[1]); } else rgb = [255, 0, 0]; }; for (var l = 0; l < actual_rgb_html.length; l ++) { bar_html.push(Math.abs(result[j].sum).accuracy(2) > 0 ? ' ' : ' '); }; }; this.report_html.push(' '); this.report_html.push(' '); if (rules[j][1] && rules[j][1].length > 1 && rules[j][5].substr(3) == delta_calc_method.substr(3)) seen.push(rules[j][1].join(',')); }; this.report_html.push('
CriteriaNominalRecommended# Actual Result
' + rules[j][0] + '' + (rules[j][3] ? (rules[j][2] ? '<= ' + rules[j][3] : '>= ' + rules[j][3] + '%') : ' ') + '' + (rules[j][4] ? (rules[j][2] ? '<= ' + rules[j][4] : '>= ' + rules[j][4] + '%'): ' ') + ''); patch_number_html = []; actual_rgb_html = []; target_rgb_html = []; var haspatchid = false; if (rules[j][2].indexOf("_MAX") < 0 && rules[j][2].indexOf("_MIN") < 0) { for (var k=0; k 1 && seen.indexOf(rules[j][1].join(',')) < 0 && rules[j][5].substr(3) == delta_calc_method.substr(3)) { patch_number_html.push('
 
'); haspatchid = true; if (rules[j][1][k].length == 4) // Assume CMYK target_rgb = jsapi.math.color.CMYK2RGB(rules[j][1][k][0] / 100, rules[j][1][k][1] / 100, rules[j][1][k][2] / 100, rules[j][1][k][3] / 100, 255); else target_rgb = [rules[j][1][k][0] * 2.55, rules[j][1][k][1] * 2.55, rules[j][1][k][2] * 2.55]; target_rgb_html.push('
 
'); actual_rgb_html.push('
\u2716 
'); } }; if (rules[j][1].length) { for (var k=0; k' + n.fill(String(number_of_sets).length) + ''); haspatchid = true; } target_rgb = jsapi.math.color.Lab2RGB(target_Lab[0], target_Lab[1], target_Lab[2], "D50", 255, true); actual_rgb = jsapi.math.color.Lab2RGB(actual_Lab[0], actual_Lab[1], actual_Lab[2], "D50", 255, true); target_rgb_html[k] = ('
 
'); actual_rgb_html[k] = ('
 
'); }; matched = true } } } else matched = true; if (matched) { delta = jsapi.math.color.delta(target_Lab[0], target_Lab[1], target_Lab[2], actual_Lab[0], actual_Lab[1], actual_Lab[2], rules[j][5]); result[j].E.push(delta.E); result[j].L.push(delta.L); result[j].C.push(delta.C); result[j].H.push(delta.H); result[j].a.push(delta.a); result[j].b.push(delta.b); if (actual.gamma) result[j].g.push(actual.gamma); if ((rules[j][1].length || rules[j][2].indexOf('_MAX') > -1 || rules[j][2].indexOf('_MIN') > -1) && (rules[j][2].indexOf('GAMMA') < 0 || actual.gamma)) result[j].matches.push([i, i, n]) } }; this.report_html = this.report_html.concat(patch_number_html); var number_of_sets = n; if (!rules[j][1].length || ((rules[j][1][0] == 'WHITEPOINT_MvsA' || (rules[j][1][0] == 'WHITEPOINT_MvsP' && profile_wp.length == 3)) && wp.length == 3) || result[j].matches.length >= rules[j][1].length) switch (rules[j][2]) { case DELTA_A_MAX: result[j].sum = jsapi.math.absmax(result[j].a); break; case DELTA_A_AVG: result[j].sum = jsapi.math.avg(result[j].a); break; case DELTA_A_MED: result[j].sum = jsapi.math.median(result[j].a); break; case DELTA_A_MAD: result[j].sum = jsapi.math.mad(result[j].a); break; case DELTA_A_RANGE: result[j].sum = Math.abs(jsapi.math.max(result[j].a) - jsapi.math.min(result[j].a)); break; case DELTA_A_STDDEV: result[j].sum = jsapi.math.stddev(result[j].a); break; case DELTA_A_B_RANGE: result[j].sum = Math.abs(jsapi.math.absmax(result[j].a)) + Math.abs(jsapi.math.absmax(result[j].b)); break; case DELTA_B_MAX: result[j].sum = jsapi.math.absmax(result[j].b); break; case DELTA_B_AVG: result[j].sum = jsapi.math.avg(result[j].b); break; case DELTA_B_MED: result[j].sum = jsapi.math.median(result[j].b); break; case DELTA_B_MAD: result[j].sum = jsapi.math.mad(result[j].b); break; case DELTA_B_RANGE: result[j].sum = Math.abs(jsapi.math.max(result[j].b) - jsapi.math.min(result[j].b)); break; case DELTA_B_STDDEV: result[j].sum = jsapi.math.stddev(result[j].b); break; case DELTA_E_MAX: result[j].sum = jsapi.math.absmax(result[j].E); break; case DELTA_E_AVG: result[j].sum = jsapi.math.avg(result[j].E); break; case DELTA_E_MED: result[j].sum = jsapi.math.median(result[j].E); break; case DELTA_E_MAD: result[j].sum = jsapi.math.mad(result[j].E); break; case DELTA_E_RANGE: result[j].sum = Math.abs(jsapi.math.max(result[j].E) - jsapi.math.min(result[j].E)); break; case DELTA_E_STDDEV: result[j].sum = jsapi.math.stddev(result[j].E); break; case DELTA_L_MAX: result[j].sum = jsapi.math.absmax(result[j].L); break; case DELTA_L_AVG: result[j].sum = jsapi.math.avg(result[j].L); break; case DELTA_L_MED: result[j].sum = jsapi.math.median(result[j].L); break; case DELTA_L_MAD: result[j].sum = jsapi.math.mad(result[j].L); break; case DELTA_L_RANGE: result[j].sum = Math.abs(jsapi.math.max(result[j].L) - jsapi.math.min(result[j].L)); break; case DELTA_L_STDDEV: result[j].sum = jsapi.math.stddev(result[j].L); break; case DELTA_C_MAX: result[j].sum = jsapi.math.absmax(result[j].C); break; case DELTA_C_AVG: result[j].sum = jsapi.math.avg(result[j].C); break; case DELTA_C_MED: result[j].sum = jsapi.math.median(result[j].C); break; case DELTA_C_MAD: result[j].sum = jsapi.math.mad(result[j].C); break; case DELTA_C_RANGE: result[j].sum = Math.abs(jsapi.math.max(result[j].C) - jsapi.math.min(result[j].C)); break; case DELTA_C_STDDEV: result[j].sum = jsapi.math.stddev(result[j].C); break; case DELTA_H_MAX: result[j].sum = jsapi.math.absmax(result[j].H); break; case DELTA_H_AVG: result[j].sum = jsapi.math.avg(result[j].H); break; case DELTA_H_MED: result[j].sum = jsapi.math.median(result[j].H); break; case DELTA_H_MAD: result[j].sum = jsapi.math.mad(result[j].H); break; case DELTA_H_RANGE: result[j].sum = Math.abs(jsapi.math.max(result[j].H) - jsapi.math.min(result[j].H)); break; case DELTA_H_STDDEV: result[j].sum = jsapi.math.stddev(result[j].H); break; case GAMMA_MAX: if (result[j].g.length) result[j].sum = jsapi.math.max(result[j].g); break; case GAMMA_MIN: if (result[j].g.length) result[j].sum = jsapi.math.min(result[j].g); break; case GAMMA_AVG: if (result[j].g.length) result[j].sum = jsapi.math.avg(result[j].g); break; case GAMMA_MED: if (result[j].g.length) result[j].sum = jsapi.math.median(result[j].g); break; case GAMMA_MAD: if (result[j].g.length) result[j].sum = jsapi.math.mad(result[j].g); break; case GAMMA_RANGE: if (result[j].g.length) result[j].sum = Math.abs(jsapi.math.max(result[j].g) - jsapi.math.min(result[j].g)); break; case GAMMA_STDDEV: if (result[j].g.length) result[j].sum = jsapi.math.stddev(result[j].g); break; } else if (!rules[j][1].length || (rules[j][1][0] + '').indexOf('LEVELS') < 0) missing_data = true; if (result[j].matches.length) { matched = false; for (var k=0; k' + result[j].finalmatch[2].fill(String(number_of_sets).length) + ''); haspatchid = true; var colors = get_colors(target, actual, o, no_Lab, no_XYZ, gray_balance_cal_only, true, profile_wp_norm, wp_norm, absolute, cat); target_Lab = colors.target_Lab; actual_Lab = colors.actual_Lab; target_rgb = jsapi.math.color.Lab2RGB(target_Lab[0], target_Lab[1], target_Lab[2], "D50", 255, true); actual_rgb = jsapi.math.color.Lab2RGB(actual_Lab[0], actual_Lab[1], actual_Lab[2], "D50", 255, true); target_rgb_html.push('
 
'); actual_rgb_html.push('
 
'); }; } if (!target_rgb_html.length) { target_rgb_html.push(' '); actual_rgb_html.push(' '); }; if (!haspatchid) this.report_html.push('
 
'); this.report_html.push('
' + target_rgb_html.join('') + '' + actual_rgb_html.join('') + '' + (result[j].sum != null ? result[j].htmlsum || result[j].sum.accuracy(2) : ' ') + '' + (bar_html.join('') || ' ') + 'OK ' : (result[j].sum != null && rules[j][3] ? 'warn">OK \u26a0' : 'statonly">')) + '✔' : '"> ')) : 'ko">' + (result[j].sum != null ? 'NOT OK' : '') + ' \u2716') + '
'); var pass, overachieve; for (var j=0; j rules[j][3] : Math.abs(result[j].sum) < rules[j][3])) pass = false; if (!rules[j][4]) continue; if (missing_data || isNaN(result[j].sum) || (rules[j][2] ? Math.abs(result[j].sum) > rules[j][4] : Math.abs(result[j].sum) < rules[j][4])) overachieve = false; } if (rules[j][5] && rules[j][5].substr(3) == delta_calc_method.substr(3)) for (var k=0; k -1) { this.data[result[j].matches[k][1]].actual_DE = Math.abs(rules[j][2].indexOf('_MAX') < 0 ? result[j].sum : result[j].E[k]); this.data[result[j].matches[k][1]].tolerance_DE = rules[j][3]; } else if (rules[j][2].indexOf('_L_') > -1) { this.data[result[j].matches[k][1]].actual_DL = Math.abs(rules[j][2].indexOf('_MAX') < 0 ? result[j].sum : result[j].L[k]); this.data[result[j].matches[k][1]].tolerance_DL = rules[j][3]; } else if (rules[j][2].indexOf('_A_') > -1) { this.data[result[j].matches[k][1]].actual_Da = Math.abs(rules[j][2].indexOf('_MAX') < 0 ? result[j].sum : result[j].a[k]); this.data[result[j].matches[k][1]].tolerance_Da = rules[j][3]; } else if (rules[j][2].indexOf('_B_') > -1) { this.data[result[j].matches[k][1]].actual_Db = Math.abs(rules[j][2].indexOf('_MAX') < 0 ? result[j].sum : result[j].b[k]); this.data[result[j].matches[k][1]].tolerance_Db = rules[j][3]; } else if (rules[j][2].indexOf('_C_') > -1) { this.data[result[j].matches[k][1]].actual_DC = Math.abs(rules[j][2].indexOf('_MAX') < 0 ? result[j].sum : result[j].C[k]); this.data[result[j].matches[k][1]].tolerance_DC = rules[j][3]; } else if (rules[j][2].indexOf('_H_') > -1) { this.data[result[j].matches[k][1]].actual_DH = Math.abs(rules[j][2].indexOf('_MAX') < 0 ? result[j].sum : result[j].H[k]); this.data[result[j].matches[k][1]].tolerance_DH = rules[j][3]; } }; }; this.report_html.push(''); this.result_html = this.report_html.slice(result_start); this.report_html.push('
'); this.report_html.push('
'); this.report_html.push('

Overview

'); this.report_html.push(' '); this.report_html.push(' '); var device_labels = fields_match.slice(devstart, devend + 1), device_channels = device_labels.join('').replace(/(?:CMYK|RGB)_/g, ''); this.report_html.push(' '); this.report_html.push(' '); this.report_html.push(' '); if (mode == 'Lab') labels = 'L*,a*,b*'; else if (mode == 'XYZ') labels = 'X,Y,Z'; else if (mode == 'xyY') labels = 'x,y,Y'; else if (mode == "Lu'v'") labels = "L*,u',v'"; this.report_html.push(' ' + (criteria.fields_match.join(',').indexOf('CMYK') < 0 ? '' : '') + '' + (criteria.fields_match.join(',').indexOf('CMYK') < 0 ? '' : '') + '' + /* '' + */ ''); this.report_html.push(' '); var grayscale_values = [], gamut_values = []; for (var i=0, n=0; i'); var bar_html = [], rgb = [0, 255, 0]; if (actual.tolerance_DE == null) actual.tolerance_DE = 5; if (actual.actual_DE == null) actual.actual_DE = delta.E; var step = 255 / (actual.tolerance_DE + actual.tolerance_DE / 2); if (actual.actual_DE <= actual.tolerance_DE) { rgb[0] += Math.min(step * actual.actual_DE, 255); rgb[1] -= Math.min(step * actual.actual_DE, 255); var maxrg = Math.max(rgb[0], rgb[1]); rgb[0] *= (255 / maxrg); rgb[1] *= (255 / maxrg); rgb[0] = Math.round(rgb[0]); rgb[1] = Math.round(rgb[1]); } else rgb = [255, 0, 0]; bar_html.push(actual.actual_DE.accuracy(2) > 0 ? ' ' : ' '); if (criteria.fields_match.join(',').indexOf('CMYK') > -1) var device = current_cmyk; else { var device = current_rgb; for (var j=0; j' + n.fill(String(number_of_sets).length) + '' + (criteria.fields_match.join(',').indexOf('CMYK') < 0 ? '' : '') + '' + (criteria.fields_match.join(',').indexOf('CMYK') < 0 ? '' : '') + '' + /* '' + */ ''); this.report_html.push(' '); }; this.report_html.push('
#Device ValuesNominal Values Measured ValuesΔE*' + delta_calc_method.substr(3) + ' 
 ' + device_labels.join('').replace(/\w+_/g, '') + '' + labels.split(',').join('') + 'γ  ' + labels.split(',').join('') + 'γΔL*Δa*Δb*ΔC*ΔH*ΔE* 
' + device.join('') + '' + target_color[0].accuracy(accuracy) + '' + target_color[1].accuracy(accuracy) + '' + target_color[2].accuracy(accuracy) + '' + (target.gamma ? target.gamma.accuracy(2) : ' ') + '
 
 
' + actual_color[0].accuracy(accuracy) + '' + actual_color[1].accuracy(accuracy) + '' + actual_color[2].accuracy(accuracy) + '' + (actual.gamma ? actual.gamma.accuracy(2) : ' ') + '' + delta.L.accuracy(2) + '' + delta.a.accuracy(2) + '' + delta.b.accuracy(2) + '' + delta.C.accuracy(2) + '' + delta.H.accuracy(2) + '' + delta.E.accuracy(2) + '' + bar_html.join('') + '
'); this.report_html.push('
'); if (grayscale_values.length) { grayscale_values.sort(function(a, b) { // Compare signal level if (a[0][0] < b[0][0]) return -1; if (a[0][0] > b[0][0]) return 1; // If same signal level, compare target L* if (a[3][0] < b[3][0]) return -1; if (a[3][0] > b[3][0]) return 1; return 0; }); // CCT var CCT = [], hwidth = 100 / 18, width = (100 - hwidth) / grayscale_values.length, rows = 16, start = 10000, end = 2500, rstep = (start - end) / (rows - 1), rowh = 30; CCT.push('
'); CCT.push('

Correlated Color Temperature

'); CCT.push(' '); CCT.push(''); for (var i = 0; i < grayscale_values.length; i ++) { var target_XYZ = jsapi.math.color.Lab2XYZ(grayscale_values[i][3][0], grayscale_values[i][3][1], grayscale_values[i][3][2]), actual_XYZ = jsapi.math.color.Lab2XYZ(grayscale_values[i][4][0], grayscale_values[i][4][1], grayscale_values[i][4][2]); if (!absolute) { target_XYZ = jsapi.math.color.adapt(target_XYZ[0], target_XYZ[1], target_XYZ[2], [96.42, 100, 82.49], profile_wp_norm, cat); actual_XYZ = jsapi.math.color.adapt(actual_XYZ[0], actual_XYZ[1], actual_XYZ[2], [96.42, 100, 82.49], wp_norm, cat); } window.console && console.log(target_XYZ.join(', '), actual_XYZ.join(', ')); var target_CCT = jsapi.math.color.XYZ2CorColorTemp(target_XYZ[0], target_XYZ[1], target_XYZ[2]), actual_CCT = jsapi.math.color.XYZ2CorColorTemp(actual_XYZ[0], actual_XYZ[1], actual_XYZ[2]); var rgb = [0, 255, 0], brgb = [], step = .75; if (target_CCT != actual_CCT) { rgb[0] += Math.min(step * Math.abs(target_CCT - actual_CCT), 255); rgb[1] -= Math.min(step * Math.abs(target_CCT - actual_CCT), 255); var maxrg = Math.max(rgb[0], rgb[1]); rgb[0] *= (255 / maxrg); rgb[1] *= (255 / maxrg); rgb[0] = Math.round(rgb[0]); rgb[1] = Math.round(rgb[1]); } for (var j = 0; j < 3; j ++) brgb[j] = Math.round(rgb[j] * .8); CCT.push(''); } CCT.push(''); for (var i = start - rstep; i >= end; i -= rstep) { CCT.push(''); } CCT.push(''); for (var i = 0; i < grayscale_values.length; i ++) { CCT.push(''); } CCT.push('
10000K
' + i + 'K
%' + (grayscale_values[i][0][0] / 255 * 100).accuracy(0) + '
'); //var idx = this.report_html.indexOf('
'); //this.report_html.splice(idx, 0, CCT.join('\n')); this.report_html = this.report_html.concat(CCT); // Gamma tracking var numgamma = 0; for (var i = 0; i < grayscale_values.length; i ++) { if (grayscale_values[i][1].gamma && grayscale_values[i][2].gamma) numgamma ++; } if (numgamma > 0) { var gamma_tracking = [], hwidth = 100 / 31, width = (100 - hwidth) / numgamma, rows = 21, start = 30, end = 10, rstep = (start - end) / (rows - 1), rowh = 30; gamma_tracking.push('
'); gamma_tracking.push('

Gamma

'); gamma_tracking.push(' '); gamma_tracking.push(''); for (var i = 0; i < grayscale_values.length; i ++) { if (!grayscale_values[i][1].gamma || !grayscale_values[i][2].gamma) continue; var rgb = [0, 255, 0], brgb = [], step = 255 / 2; if (grayscale_values[i][1].gamma != grayscale_values[i][2].gamma) { rgb[0] += Math.min(step * Math.abs(grayscale_values[i][1].gamma - grayscale_values[i][2].gamma) * 12.75, 255); rgb[1] -= Math.min(step * Math.abs(grayscale_values[i][1].gamma - grayscale_values[i][2].gamma) * 12.75, 255); var maxrg = Math.max(rgb[0], rgb[1]); rgb[0] *= (255 / maxrg); rgb[1] *= (255 / maxrg); rgb[0] = Math.round(rgb[0]); rgb[1] = Math.round(rgb[1]); } for (var j = 0; j < 3; j ++) brgb[j] = Math.round(rgb[j] * .8); gamma_tracking.push(''); } gamma_tracking.push(''); for (var i = start - rstep; i >= end; i -= rstep) { gamma_tracking.push(''); } gamma_tracking.push(''); for (var i = 0; i < grayscale_values.length; i ++) { if (!grayscale_values[i][1].gamma || !grayscale_values[i][2].gamma) continue; gamma_tracking.push(''); } gamma_tracking.push('
' + (start / 10).toFixed(1) + '
' + (i / 10).toFixed(1) + '
%' + (grayscale_values[i][0][0] / 255 * 100).accuracy(0) + '
'); //var idx = this.report_html.indexOf('
'); //this.report_html.splice(idx, 0, gamma_tracking.join('\n')); this.report_html = this.report_html.concat(gamma_tracking); } // numgamma > 0 // RGB Balance var rgb_balance = [], hwidth = 100 / 21, width = (100 - hwidth) / grayscale_values.length, rows = 13, start = 30, end = -30, rstep = (start - end) / (rows - 1), rowh = 30; rgb_balance.push('
'); rgb_balance.push('

RGB Gray Balance

'); rgb_balance.push(' '); rgb_balance.push(''); for (var i = 0; i < grayscale_values.length; i ++) { var target_rgb = jsapi.math.color.Lab2RGB(grayscale_values[i][3][0], grayscale_values[i][3][1], grayscale_values[i][3][2], 'D50', 100), actual_rgb = jsapi.math.color.Lab2RGB(grayscale_values[i][4][0], grayscale_values[i][4][1], grayscale_values[i][4][2], 'D50', 100); window.console && console.log(target_rgb.join(', '), actual_rgb.join(', ')); rgb_balance.push(''); } rgb_balance.push(''); for (var i = start - rstep; i >= end; i -= rstep) { rgb_balance.push(''); } rgb_balance.push(''); for (var i = 0; i < grayscale_values.length; i ++) { rgb_balance.push(''); } rgb_balance.push('
+' + start + '%
' + (i > 0 ? '+' : '') + i + '%
%' + (grayscale_values[i][0][0] / 255 * 100).accuracy(0) + '
'); //var idx = this.report_html.indexOf('
'); //this.report_html.splice(idx, 0, rgb_balance.join('\n')); this.report_html = this.report_html.concat(rgb_balance); } if (gamut_values.length) { var accuracy, offset, multiplier; switch (mode) { case "Lu'v'": xy = "u'v'"; accuracy = 4; offset = [10, 95]; multiplier = 1200; break; case 'XYZ': xy = 'XZ'; accuracy = 2; offset = [5, 95]; multiplier = 8; break; case 'xyY': xy = 'xy'; accuracy = 4; offset = [10, 95]; multiplier = 1000; break; default: xy = 'a*b*'; accuracy = 2; offset = [50, 50]; multiplier = 3; } this.report_html.push('
'); this.report_html.push('

Gamut CIE ' + xy + '

'); this.report_html.push('
'); // Sort by L* gamut_values.sort(function (a, b) { if (a[4][0] < b[4][0]) return -1; if (a[4][0] > b[4][0]) return 1; return 0; }); for (var i = 0; i < gamut_values.length; i ++) { var n = gamut_values[i][0], device_channels = gamut_values[i][1], device = gamut_values[i][2], target_color = gamut_values[i][3], target_xy, actual_color = gamut_values[i][5], actual_xy, target_rgb = gamut_values[i][6], actual_rgb = gamut_values[i][7], delta_calc_method = gamut_values[i][8], deltaE = gamut_values[i][9]; switch (mode) { case 'XYZ': target_xy = [target_color[2], target_color[0]]; actual_xy = [actual_color[2], actual_color[0]]; break; case 'xyY': target_xy = target_color; actual_xy = actual_color; break; default: target_xy = target_color.slice(1); actual_xy = actual_color.slice(1); } this.report_html.push('
'); } this.report_html.push('
'); } return this.report_html.join('\n') }; function bggridlines(rowh) { return window.btoa ? 'background-image: url(data:image/svg+xml;base64,' + btoa('') + ');' : ''; }; function trim(txt) { return txt.replace(/^\s+|\s+$/g, "") }; function lf2cr(txt) { return txt.replace(/\r\n/g, "\r").replace(/\n/g, "\r") }; function cr2lf(txt) { // CR LF = Windows // CR = Mac OS 9 // LF = Unix/Linux/Mac OS X return txt.replace(/\r\n/g, "\n").replace(/\r/g, "\n") }; function compact(txt, collapse_whitespace) { txt = trim(txt).replace(/\n\s+|\s+\n/g, "\n"); return collapse_whitespace?txt.replace(/\s+/g, " "):txt }; function comma2point(txt) { return decimal(txt) }; function decimal(txt, sr, re) { if (!sr) sr = "\\,"; if (!re) re = "."; return txt.replace(new RegExp("((^|\\s)\\-?\\d+)"+sr+"(\\d+(\\s|$))", "g"), "$1"+re+"$3") }; function toarray(txt, level) { txt=comma2point(compact(cr2lf(txt))); if (!txt) return []; if (level) { txt=txt.split(/\s/) } else { txt=txt.split("\n"); for (var i=0; i -1) current_cmyk = [actual[fields_extract_indexes_i[3]], actual[fields_extract_indexes_i[4]], actual[fields_extract_indexes_i[5]], actual[fields_extract_indexes_i[6]]]; } else { current_rgb = [actual[fields_extract_indexes_i[4]], actual[fields_extract_indexes_i[5]], actual[fields_extract_indexes_i[6]]]; if (fields_match.join(',').indexOf('CMYK') > -1) current_cmyk = [actual[fields_extract_indexes_i[0]], actual[fields_extract_indexes_i[1]], actual[fields_extract_indexes_i[2]], actual[fields_extract_indexes_i[3]]]; } for (var l=0; l 0 && current_rgb[0] < 100 && target_Lab[0] > 0 && actual_Lab[0] > 0) { var target_XYZ = jsapi.math.color.Lab2XYZ(target_Lab[0], target_Lab[1], target_Lab[2]), actual_XYZ = jsapi.math.color.Lab2XYZ(actual_Lab[0], actual_Lab[1], actual_Lab[2]); target.gamma = Math.log(target_XYZ[1]) / Math.log(current_rgb[0] / 100); actual.gamma = Math.log(actual_XYZ[1]) / Math.log(current_rgb[0] / 100); } } return {target_Lab: target_Lab, actual_Lab: actual_Lab, current_rgb: current_rgb, current_cmyk: current_cmyk}; }; function get_data(which) { var f=document.forms; if (which == "r" || !which) { data_ref=new dataset(f["F_data"].elements["FF_data_ref"].value) }; if (which == "i" || !which) { data_in=new dataset(f["F_data"].elements["FF_data_in"].value) }; if (which == "r" || !which) { if (!data_ref.data_format.length) return false; if (!data_ref.data.length) return false }; if (which == "i" || !which) { if (!data_in.data_format.length) return false; if (!data_in.data.length) return false }; return true }; function compare(set_delta_calc_method) { form_elements_set_disabled(null, true); var fe = document.forms["F_out"].elements, fe2 = document.forms["F_data"].elements; if (fe2["FF_variables"]) try { eval(fe2["FF_variables"].value); window.comparison_criteria = comparison_criteria; if (window.location.href.indexOf("?debug")>-1) alert("Comparsion criteria: " + (comparison_criteria.toSource ? comparison_criteria.toSource() : comparison_criteria)) } catch (e) { alert("Error parsing variable:\n" + e + "\nUsing default values.") }; var report = data_in.generate_report(set_delta_calc_method); document.getElementById('result').innerHTML = report; layout(); document.getElementById('reporttitle').style.visibility = "visible"; document.getElementById('report').style.visibility = "visible"; form_elements_set_disabled(null, false); if (document.getElementsByClassName) { var canvas = document.getElementsByClassName('canvas'), inner_coords, mouse_is_down, mouse_down_coords; document.addEventListener('mouseup', function (e) { for (var i = 0; i < canvas.length; i ++) { jsapi.dom.attributeRemoveWord(canvas[i], 'class', 'dragging'); } mouse_is_down = false; }); for (var i = 0; i < canvas.length; i ++) { var act = Array.prototype.slice.apply(canvas[i].getElementsByClassName('act')), ref = Array.prototype.slice.apply(canvas[i].getElementsByClassName('ref')), pts = act.concat(ref); for (var j = 0; j < pts.length; j ++) { pts[j].addEventListener('mouseenter', function (e) { var linked = this.parentNode.parentNode.getElementsByClassName('patch-' + jsapi.dom.attr(this, 'data-index')); jsapi.dom.attributeAddWord(this.parentNode.parentNode, 'class', 'hover'); for (var k = 0; k < linked.length; k ++) { jsapi.dom.attributeAddWord(linked[k].parentNode, 'class', 'hover'); if (jsapi.dom.attributeHasWord(linked[k], 'class', 'ref')) { linked[k].style.backgroundColor = jsapi.dom.attr(linked[k], 'data-bgcolor'); linked[k].style.borderColor = jsapi.dom.attr(linked[k], 'data-bordercolor'); } } }); pts[j].addEventListener('mouseleave', function (e) { var linked = this.parentNode.parentNode.getElementsByClassName('patch-' + jsapi.dom.attr(this, 'data-index')); jsapi.dom.attributeRemoveWord(this.parentNode.parentNode, 'class', 'hover'); for (var k = 0; k < linked.length; k ++) { jsapi.dom.attributeRemoveWord(linked[k].parentNode, 'class', 'hover'); if (jsapi.dom.attributeHasWord(linked[k], 'class', 'ref')) { linked[k].style.backgroundColor = ''; linked[k].style.borderColor = ''; } } }); } // Reset viewport canvas[i].addEventListener('dblclick', function () { var inner = this.getElementsByClassName('inner')[0]; this.style.fontSize = '1px'; inner.style.marginLeft = ''; inner.style.marginTop = ''; }); // Click drag viewport canvas[i].addEventListener('mousedown', function (e) { var inner = this.getElementsByClassName('inner')[0]; inner_coords = [parseFloat(inner.style.marginLeft) || 0, parseFloat(inner.style.marginTop) || 0]; jsapi.dom.attributeAddWord(this, 'class', 'dragging'); mouse_is_down = true; mouse_down_coords = [e.pageX, e.pageY]; e.preventDefault(); }); canvas[i].addEventListener('mousemove', function (e) { if (mouse_is_down) { var fontSize = parseFloat(this.style.fontSize) || 1, inner = this.getElementsByClassName('inner')[0]; inner.style.marginLeft = inner_coords[0] + (e.pageX - mouse_down_coords[0]) / fontSize + 'em'; inner.style.marginTop = inner_coords[1] + (e.pageY - mouse_down_coords[1]) / fontSize + 'em'; } }); // Mousewheel zoom canvas[i].addEventListener('wheel', function (e) { var fontSize = parseFloat(this.style.fontSize) || 1; if ((e.deltaY < 0 && fontSize < 1000) || (e.deltaY > 0 && fontSize > 1)) { if (e.deltaY < 0) fontSize += fontSize / 4; else fontSize = Math.max(fontSize - fontSize / 4, 1); this.style.fontSize = fontSize + 'px'; e.preventDefault(); } }); } } return true }; function layout() { var padding = 0, borderwidth = 0, margin = 20, maxwidth = (document.getElementById("report").offsetWidth || 900) - padding * 2 - borderwidth * 2, tables = document.getElementsByTagName("table"); for (var i = 0; i < tables.length; i ++) { if (tables[i].offsetWidth > maxwidth) { maxwidth = tables[i].offsetWidth; document.body.style.width = (maxwidth + padding * 2 + borderwidth * 2) + 'px'; } } for (var i = 0; i < tables.length; i ++) tables[i].style.width = maxwidth + 'px'; } function form_element_set_disabled(form_element, disabled) { if (!form_element || form_element.readOnly || form_element.type == "hidden" || form_element.type == "file" || jsapi.dom.attributeHasWord(form_element, "class", "fakefile") || jsapi.dom.attributeHasWord(form_element, "class", "save") || jsapi.dom.attributeHasWord(form_element, "class", "delete")) return; if (form_element.name == "FF_delta_calc_method") disabled = form_element.disabled; disabled = disabled ? "disabled" : ""; form_element.disabled = disabled; if (disabled && !jsapi.dom.attributeHasWord(form_element, "class", "disabled")) jsapi.dom.attributeAddWord(form_element, "class", "disabled"); else if (!disabled && jsapi.dom.attributeHasWord(form_element, "class", "disabled")) jsapi.dom.attributeRemoveWord(form_element, "class", "disabled"); var labels = document.getElementsByTagName("label"); for (var i=0; i= 1% luminance) average ΔC*76", window.CRITERIA_GRAYSCALE, DELTA_C_AVG, 1.0, 0.5, CIE76], ["RGB gray balance (>= 1% luminance) combined Δa*76 and Δb*76 range", window.CRITERIA_GRAYSCALE, DELTA_A_B_RANGE, 2.0, 1.5, CIE76], ["RGB gray balance (>= 1% luminance) maximum ΔC*76", window.CRITERIA_GRAYSCALE, DELTA_C_MAX, null, null, CIE76], ["RGB gray balance (>= 1% luminance) average ΔC*94", window.CRITERIA_GRAYSCALE, DELTA_C_AVG, 1.0, 0.5, CIE94], ["RGB gray balance (>= 1% luminance) combined Δa*94 and Δb*94 range", window.CRITERIA_GRAYSCALE, DELTA_A_B_RANGE, 2.0, 1.5, CIE94], ["RGB gray balance (>= 1% luminance) maximum ΔC*94", window.CRITERIA_GRAYSCALE, DELTA_C_MAX, null, null, CIE94], ["RGB gray balance (>= 1% luminance) average ΔC*00", window.CRITERIA_GRAYSCALE, DELTA_C_AVG, 1.0, 0.5, CIE00], ["RGB gray balance (>= 1% luminance) combined Δa*00 and Δb*00 range", window.CRITERIA_GRAYSCALE, DELTA_A_B_RANGE, 2.0, 1.5, CIE00], ["RGB gray balance (>= 1% luminance) maximum ΔC*00", window.CRITERIA_GRAYSCALE, DELTA_C_MAX, null, null, CIE00] ] ), CRITERIA_RULES_CMYK = CRITERIA_RULES_DEFAULT.clone(), CRITERIA_DEFAULT = { fields_compare: ['LAB_L', 'LAB_A', 'LAB_B'], name: "Default", passtext: "Nominal tolerance passed", failtext: "Nominal tolerance exceeded", passrecommendedtext: "Recommended tolerance passed", failrecommendedtext: null, delta_calc_method: CIE00, // delta calculation method for overview lock_delta_calc_method: false, warn_deviation: 5, // values with greater Delta E will be marked in the overview (informational, not a pass criteria) rules: CRITERIA_RULES_DEFAULT }, CRITERIA_CMYK = { fields_match: ['CMYK_C', 'CMYK_M', 'CMYK_Y', 'CMYK_K'], fields_compare: ['LAB_L', 'LAB_A', 'LAB_B'], id: "CMYK", name: "CMYK", strip_name: "CMYK", passtext: "Nominal tolerance passed", failtext: "Nominal tolerance exceeded", passrecommendedtext: "Recommended tolerance passed", failrecommendedtext: null, delta_calc_method: CIE00, // delta calculation method for overview lock_delta_calc_method: false, warn_deviation: 5, // values with greater Delta E will be marked in the overview (informational, not a pass criteria) rules: CRITERIA_RULES_CMYK }, CRITERIA_IDEALLIANCE = { fields_match: ['CMYK_C', 'CMYK_M', 'CMYK_Y', 'CMYK_K'], fields_compare: ['LAB_L', 'LAB_A', 'LAB_B'], id: "IDEALLIANCE", name: "IDEAlliance Control Strip 2009", passtext: "Nominal tolerance passed", failtext: "Nominal tolerance exceeded", passrecommendedtext: "Recommended tolerance passed", failrecommendedtext: null, delta_calc_method: CIE00, // delta calculation method for overview lock_delta_calc_method: true, warn_deviation: 3, // values with greater Delta E will be marked in the overview (informational, not a pass criteria) rules: CRITERIA_RULES_CMYK.concat([ // description, [[C, M, Y, K],...], DELTA_[E|L|C|H]_[MAX|AVG], max, recommended, [CIE[76|94|00]|CMC11|CMC21] ["Paper white ΔL*00", [[0, 0, 0, 0]], DELTA_L_MAX, 2, 1, CIE00], ["Paper white Δa*00", [[0, 0, 0, 0]], DELTA_A_MAX, 1, .5, CIE00], ["Paper white Δb*00", [[0, 0, 0, 0]], DELTA_B_MAX, 2, 1, CIE00], /* ["Average ΔE*00", [], DELTA_E_AVG, 2, 1, CIE00], ["Maximum ΔE*00", [], DELTA_E_MAX, 6, 3, CIE00], */ ["CMYK solids maximum ΔE*00", [ [100, 0, 0, 0], [0, 100, 0, 0], [0, 0, 100, 0], [0, 0, 0, 100] ], DELTA_E_MAX, 7, 3, CIE00], ["CMY 50% grey ΔE*00", [[50, 40, 40, 0]], DELTA_E_MAX, 1.5, 0.75, CIE00], ["CMY grey maximum ΔL*00", [ [3.1, 2.2, 2.2, 0], [10.2, 7.4, 7.4, 0], [25, 19, 19, 0], [50, 40, 40, 0], [75, 66, 66, 0] ], DELTA_L_MAX, 2, 1, CIE00], ["CMY grey maximum Δa*00", [ [3.1, 2.2, 2.2, 0], [10.2, 7.4, 7.4, 0], [25, 19, 19, 0], [50, 40, 40, 0], [75, 66, 66, 0] ], DELTA_A_MAX, 1, .5, CIE00], ["CMY grey maximum Δb*00", [ [3.1, 2.2, 2.2, 0], [10.2, 7.4, 7.4, 0], [25, 19, 19, 0], [50, 40, 40, 0], [75, 66, 66, 0] ], DELTA_B_MAX, 1, .5, CIE00], ["CMY grey maximum ΔE*00", [ [3.1, 2.2, 2.2, 0], [10.2, 7.4, 7.4, 0], [25, 19, 19, 0], [50, 40, 40, 0], [75, 66, 66, 0] ], DELTA_E_MAX, 2, 1, CIE00] ]) }, CRITERIA_ISO12647_7 = { fields_match: ['CMYK_C', 'CMYK_M', 'CMYK_Y', 'CMYK_K'], fields_compare: ['LAB_L', 'LAB_A', 'LAB_B'], passtext: "Nominal tolerance passed", failtext: "Nominal tolerance exceeded", passrecommendedtext: "Recommended tolerance passed", failrecommendedtext: null, delta_calc_method: CIE76, // delta calculation method for overview lock_delta_calc_method: true, warn_deviation: 5, // values with greater Delta E will be marked in the overview (informational, not a pass criteria) rules: CRITERIA_RULES_CMYK.concat([ // description, [[C, M, Y, K],...], DELTA_[E|L|C|H]_[MAX|AVG], max, recommended, [CIE[76|94|00]|CMC11|CMC21] ["Paper white ΔE*76", [[0, 0, 0, 0]], DELTA_E_MAX, 3, 1, CIE76], /* ["Average ΔE*", [], DELTA_E_AVG, 3, 2, CIE76], ["Maximum ΔE*", [], DELTA_E_MAX, 6, 5, CIE76], */ ["CMYK solids maximum ΔE*76", [ [100, 0, 0, 0], [0, 100, 0, 0], [0, 0, 100, 0], [0, 0, 0, 100] ], DELTA_E_MAX, 5, 3, CIE76], ["CMYK solids maximum ΔH*76", [ [100, 0, 0, 0], [0, 100, 0, 0], [0, 0, 100, 0], [0, 0, 0, 100] ], DELTA_H_MAX, 2.5, 1.5, CIE76], ["CMY grey average ΔH*76", [ [100, 85, 85, 0], [80, 65, 65, 0], [60, 45, 45, 0], [40, 27, 27, 0], [20, 12, 12, 0], [10, 6, 6, 0] ], DELTA_H_AVG, 1.5, 0.5, CIE76] ]) }, CRITERIA_FOGRA_MEDIAWEDGE_3 = CRITERIA_ISO12647_7, comparison_criteria = { // values MUST pass these criteria RGB: CRITERIA_DEFAULT.clone(), CMYK: CRITERIA_CMYK, FOGRA_MW3: CRITERIA_FOGRA_MEDIAWEDGE_3, IDEALLIANCE: CRITERIA_IDEALLIANCE }; comparison_criteria['CMYK_FOGRA_MEDIAWEDGE_V3'] = CRITERIA_FOGRA_MEDIAWEDGE_3; for (var i=27; i<=47; i++) { comparison_criteria['1x_MW2_FOGRA' + i + 'L_SB'] = CRITERIA_FOGRA_MEDIAWEDGE_3; comparison_criteria['2x_MW2_FOGRA' + i + 'L_SB'] = CRITERIA_FOGRA_MEDIAWEDGE_3; comparison_criteria['FOGRA' + i + '_MW2_SUBSET'] = CRITERIA_FOGRA_MEDIAWEDGE_3; comparison_criteria['FOGRA' + i + '_MW3_SUBSET'] = CRITERIA_FOGRA_MEDIAWEDGE_3; }; comparison_criteria['CMYK_IDEALLIANCE_CONTROLSTRIP_2009'] = CRITERIA_IDEALLIANCE; comparison_criteria['GRACOLCOATED1_ISO12647-7_CONTROLSTRIP2009_REF'] = CRITERIA_IDEALLIANCE; comparison_criteria['SWOPCOATED3_ISO12647-7_CONTROLSTRIP2009_REF'] = CRITERIA_IDEALLIANCE; comparison_criteria['SWOPCOATED5_ISO12647-7_CONTROLSTRIP2009_REF'] = CRITERIA_IDEALLIANCE; CRITERIA_FOGRA_MEDIAWEDGE_3.id = 'FOGRA_MW3'; CRITERIA_FOGRA_MEDIAWEDGE_3.name = "Fogra Media Wedge V3"; CRITERIA_FOGRA_MEDIAWEDGE_3.strip_name = "Ugra/Fogra Media Wedge CMYK V3.0"; CRITERIA_IDEALLIANCE.rules[8][3] = 2; // Average ΔE*00 nominal CRITERIA_IDEALLIANCE.rules[11][3] = 6; // Maximum ΔE*00 nominal comparison_criteria.RGB.id = 'RGB'; comparison_criteria.RGB.fields_match = ['RGB_R', 'RGB_G', 'RGB_B']; comparison_criteria.RGB.name = "RGB"; comparison_criteria.RGB.strip_name = "RGB"; comparison_criteria.RGB.rules = CRITERIA_RULES_RGB; if (window.CRITERIA_GRAYSCALE) { comparison_criteria.RGB_GRAY = comparison_criteria.RGB.clone(); comparison_criteria.RGB_GRAY.delta_calc_method = CIE00; comparison_criteria.RGB_GRAY.id = 'RGB_GRAY'; comparison_criteria.RGB_GRAY.name = "RGB + gray balance"; comparison_criteria.RGB_GRAY.rules = CRITERIA_RULES_VERIFY; }; DisplayCAL-3.1.0.0/DisplayCAL/report/jsapi-packages.js0000644000076500000000000010376212647526510022173 0ustar devwheel00000000000000/* ############################## */ /* ##### jsapi Distribution ##### */ /* ############################## */ /* 2006 Florian Hoech Function.prototype.apply.js adds apply method for functions in browsers without native implementation */ if (!Function.prototype.apply) { Function.prototype.apply = function(o, args) { o = o ? Object(o) : window; o.__apply__ = this; for (var i = 0, sargs = []; i < args.length; i ++) sargs[i] = "args[" + i + "]"; var result = eval("o.__apply__(" + sargs.join(",") + ");"); o.__apply__ = null; return result } }; /* ##### Array.prototype.pop.js ##### */ /* 2006 Ash Searle http://hexmen.com/blog/2006/12/push-and-pop/ */ if (!Array.prototype.pop) Array.prototype.pop = function() { // Removes the last element from an array and returns that element. This method changes the length of the array. var n = this.length >>> 0, value; if (n) { value = this[--n]; delete this[n] }; this.length = n; return value }; if (!Array.pop) Array.pop = function(object) { return Array.prototype.pop.apply(object) }; /* ##### Array.prototype.shift.js ##### */ /* 2006 Florian Hoech Array.prototype.shift.js adds shift method for arrays in browsers without native or incorrect implementation */ if (!Array.prototype.shift) Array.prototype.shift = function() { // Removes the first element from an array and returns that element. This method changes the length of the array. var n = this.length >>> 0, value = this[0]; for (var i = 1; i < n; i ++) this[i - 1] = this[i]; delete this[n]; this.length = n - 1 >>> 0; return value }; if (!Array.shift) Array.shift = function(object) { return Array.prototype.shift.apply(object) }; /* ##### Array.prototype.unshift.js ##### */ /* 2006 Florian Hoech Array.prototype.unshift.js adds unshift method for arrays in browsers without native or incorrect implementation */ if (!Array.prototype.unshift) Array.prototype.unshift = function() { // Adds one or more elements to the beginning of an array and returns the new length of the array. var n = this.length >>> 0; for (var i = (n - 1) >>> 0; i >= 0; i --) this[i + arguments.length] = this[i]; for (var i = arguments.length - 1; i >= 0; i --) { this[i] = arguments[i]; n = n + 1 >>> 0 }; this.length = n; return n }; /* ##### Array.prototype.push.js ##### */ /* 2006 Ash Searle http://hexmen.com/blog/2006/12/push-and-pop/ */ if (!Array.prototype.push || [].push(0) == 0) Array.prototype.push = function() { var n = this.length >>> 0; for (var i = 0; i < arguments.length; i++) { this[n] = arguments[i]; n = n + 1 >>> 0 }; this.length = n; return n }; /* ##### Array.prototype.splice.js ##### */ /* 2006 Florian Hoech Array.prototype.splice.js adds splice method for arrays in browsers without native or incorrect implementation */ if (!Array.prototype.splice || [0].splice(0, 1) === 0) Array.prototype.splice = function(index, howMany) { /* Changes the content of an array, adding new elements while removing old elements. Returns an array containing the removed elements. If only one element is removed, an array of one element is returned. Returns undefined if no arguments are passed. */ if (arguments.length == 0) return index; if (typeof index != "number") index = 0; if (index < 0) index = Math.max(0, this.length + index); if (index > this.length) { if (arguments.length > 2) index = this.length; else return [] }; if (arguments.length < 2) howMany = this.length - index; howMany = (typeof howMany == "number") ? Math.max(0, howMany) : 0; var removedElements = this.slice(index, index + howMany); var elementsToMove = this.slice(index + howMany); this.length = index; for (var i = 2; i < arguments.length; i ++) this[this.length] = arguments[i]; for (var i = 0; i < elementsToMove.length; i ++) this[this.length] = elementsToMove[i]; return removedElements }; /* ##### Number.prototype.toFixed.js ##### */ /* 2006 Florian Hoech Number.prototype.toFixed.js */ if (!Number.prototype.toFixed) { Number.prototype.toFixed = function(ln) { if (!ln) ln = 0; var i, n = Math.pow(10, ln), n = (Math.round(this * n) / n) + ""; if (ln && (i = n.indexOf(".")) < 0) { i = n.length; n += "." }; while (n.substr(i).length < ln + 1) n += "0"; return n } }; /* ##### Array.prototype.indexOf.js ##### */ /* http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Objects:Array:indexOf Summary Returns the first index at which a given element can be found in the array, or -1 if it is not present. Method of Array Implemented in: JavaScript 1.6 (Gecko 1.8b2 and later) ECMAScript Edition: none Syntax var index = array.indexOf(searchElement[, fromIndex]); Parameters searchElement Element to locate in the array. fromIndex The index at which to begin the search. Defaults to 0, i.e. the whole array will be searched. If the index is greater than or equal to the length of the array, -1 is returned, i.e. the array will not be searched. If negative, it is taken as the offset from the end of the array. Note that even when the index is negative, the array is still searched from front to back. If the calculated index is less than 0, the whole array will be searched. Description indexOf compares searchElement to elements of the Array using strict equality (the same method used by the ===, or triple-equals, operator). Compatibility indexOf is a JavaScript extension to the ECMA-262 standard; as such it may not be present in other implementations of the standard. You can work around this by inserting the following code at the beginning of your scripts, allowing use of indexOf in ECMA-262 implementations which do not natively support it. This algorithm is exactly the one used in Firefox and SpiderMonkey. Again, note that this implementation aims for absolute compatibility with indexOf in Firefox and the SpiderMonkey JavaScript engine, including in cases where the index passed to indexOf is not an integer value. If you intend to use this in real-world applications, you may not need all of the code to calculate from. Example: Using indexOf The following example uses indexOf to locate values in an array. var array = [2, 5, 9]; var index = array.indexOf(2); // index is 0 index = array.indexOf(7); // index is -1 Example: Finding all the occurrences of an element The following example uses indexOf to find all the indices of an element in a given array, using push to add them to another array as they are found. var indices = []; var idx = array.indexOf(element) while (idx != -1) { indices.push(idx); idx = array.indexOf(element, idx + 1); } */ // NOTE: semicolons added where necessary to make compatible with JavaScript compressors if (!Array.prototype.indexOf) { Array.prototype.indexOf = function(elt /*, from*/) { var len = this.length; var from = Number(arguments[1]) || 0; from = (from < 0) ? Math.ceil(from) : Math.floor(from); if (from < 0) from += len; for (; from < len; from++) { if (/* from in this && */ /* Not compatible with IE/Mac */ this[from] === elt) return from }; return -1 } }; /* ##### jsapi.js ##### */ /* 2006 Florian Hoech jsapi.js */ jsapi = function() { return new jsapi.jsapi(arguments); }; jsapi.constants = { OBJECTTYPES: { OBJECT: 0, ARRAY: 1, BOOLEAN: 2, DATE: 3, FUNCTION: 4, NUMBER: 5, REGEXP: 6, STRING: 7 } }; jsapi.extend = function(object, _this) { jsapi.jsapi.prototype.extend(object, _this) }; jsapi.jsapi = function() { var objectType; if (!jsapi.initialized) { for (var propertyName in jsapi.dom) if (typeof jsapi.dom[propertyName] == "function" && !jsapi.dom[propertyName]._args) jsapi.dom[propertyName]._args = [jsapi.dom.isNode]; for (var propertyName in jsapi.regexp) if (typeof jsapi.regexp[propertyName] == "function") jsapi.regexp[propertyName]._args = [function(argument) { return argument.constructor == RegExp; }]; for (var propertyName in jsapi.string) if (typeof jsapi.string[propertyName] == "function") jsapi.string[propertyName]._args = [function(argument) { return typeof argument == "string" || argument.constructor == String; }]; for (var propertyName in jsapi) jsapi.extend(jsapi[propertyName], jsapi[propertyName]); var arrayMethodNames = [ "every", "filter", "forEach", "indexOf", "join", "lastIndexOf", "map", "slice", "some", /* Mutator methods */ "pop", "push", "reverse", "shift", "sort", "splice", "unshift" ]; for (var i = 0; i < arrayMethodNames.length; i ++) { (function (arrayMethodName) { jsapi.jsapi.prototype[arrayMethodName] = function () { var result = Array.prototype[arrayMethodName].apply(this, arguments); return typeof result == "object" ? jsapi(result) : (result != null || arrayMethodName == "pop" || arrayMethodName == "shift" ? result : this); } })(arrayMethodNames[i]); }; jsapi.initialized = true; }; if (this.length == null) this.length = 0; for (var i = 0; i < arguments[0].length; i ++) { var object = arguments[0][i]; switch (typeof object) { case "function": objectType = jsapi.constants.OBJECTTYPES.FUNCTION; break; case "number": objectType = jsapi.constants.OBJECTTYPES.NUMBER; break; case "string": objectType = jsapi.constants.OBJECTTYPES.STRING; break; default: if (!object) continue; // null or undefined switch (object.constructor) { case Boolean: objectType = jsapi.constants.OBJECTTYPES.BOOLEAN; break; case Date: objectType = jsapi.constants.OBJECTTYPES.DATE; break; case Number: objectType = jsapi.constants.OBJECTTYPES.NUMBER; break; case RegExp: objectType = jsapi.constants.OBJECTTYPES.REGEXP; break; case String: objectType = jsapi.constants.OBJECTTYPES.STRING; break; default: objectType = jsapi.constants.OBJECTTYPES.OBJECT; } }; switch (objectType) { case jsapi.constants.OBJECTTYPES.STRING: var expression = object.split(":"); if (expression.length > 1) switch (expression[0]) { case "html": case "xhtml": case "xml": object = jsapi.dom.parseString(expression.slice(1).join(":")); break; case "xpath": object = jsapi.dom.getByXpath(expression.slice(1).join(":")); break; } else if (/<[^<]*>/.test(object)) object = jsapi.dom.parseString(object); default: if (object.constructor == Array) Array.prototype.push.apply(this, object); else if (typeof object == "object" && typeof object.length == "number" && object.constructor != String && object.constructor != Function) Array.prototype.push.apply(this, Array.prototype.slice.apply(object)); else this[this.length ++] = object; } }; }; jsapi.jsapi.prototype = { concat: function(object) { var result = jsapi(this); jsapi.jsapi.apply(result, [object]); return result }, extend: function(object, _this) { /* if _this evaluates to false, use the current result as "this"-object. otherwise, use _this as "this"-object and pass the current result as first argument. */ for (var propertyName in object) if (typeof object[propertyName] == "function" && propertyName != "$" && propertyName != "extend" && propertyName != "toString" && propertyName != "valueOf") { if (!this[propertyName]) { this[propertyName] = function() { if (this.length) { var _callbacks = arguments.callee._callbacks; for (var i = 0; i < this.length; i ++) { for (var n = 0; n < _callbacks.length; n ++) { var _this = _callbacks[n]._this || this[i], _arguments = _callbacks[n]._this ? [this[i]].concat(Array.prototype.slice.apply(arguments)) : arguments; if (_callbacks[n].hasValidArguments.apply(_callbacks[n], _arguments)) { this[i] = _callbacks[n].apply(_this, _arguments); } } } }; return this; }; this[propertyName]._callbacks = []; }; if (!object[propertyName].hasValidArguments) { if (object[propertyName]._args) object[propertyName].hasValidArguments = function() { for (var i = 0; i < this._args.length; i ++) { if (!(typeof this._args[i] == "string" ? typeof arguments[i] == this._args[i] : (typeof this._args[i] == "function" ? this._args[i](arguments[i]) : arguments[i] == this._args[i]))) { return false; } }; return true }; else object[propertyName].hasValidArguments = function() { return true }; }; object[propertyName]._this = _this; if (this[propertyName]._callbacks.indexOf(object[propertyName]) < 0) this[propertyName]._callbacks.push(object[propertyName]); } }, toString: function() { return Array.prototype.slice.apply(this).toString(); } }; /* ##### jsapi.array.js ##### */ /* 2006 Florian Hoech jsapi.array.js jsapi.js */ jsapi.array = { $: function(object) { // make array from object with only the numerical indices var array = [], n; if (object.length != null) for (var i = 0; i < object.length; i ++) array[i] = object[i]; else for (var i in object) if (!isNaN(n = parseInt(i)) && n == i) array[n] = object[i]; return array } }; jsapi.array.$._args = [null]; /* ##### jsapi.array.flat.js ##### */ /* 2006 Florian Hoech jsapi.array.search.js jsapi.array.js */ jsapi.array.flat = function(a) { var r = []; for (var i = 0; i < a.length; i ++) { if (a[i].constructor == Array) r = r.concat(jsapi.array.flat(a[i])); else r.push(a[i]) }; return r }; jsapi.array.flat._args = [Array]; /* ##### jsapi.dom.js ##### */ /* 2006 Florian Hoech jsapi.dom.js jsapi.js */ jsapi.dom = {}; /* ##### jsapi.dom.NODETYPES.js ##### */ /* 2006 Florian Hoech jsapi.dom.NODETYPES.js jsapi.dom.js */ jsapi.dom.NODETYPES = { "1": "ELEMENT", "2": "ATTRIBUTE", "3": "TEXT", "4": "CDATA_SECTION", "5": "ENTITY_REFERENCE", "6": "ENTITY", "7": "PROCESSING_INSTRUCTION", "8": "COMMENT", "9": "DOCUMENT", "10": "DOCUMENT_TYPE", "11": "DOCUMENT_FRAGMENT", "12": "NOTATION" }; /* ##### jsapi.dom.isNode.js ##### */ /* Florian Hoech jsapi.dom.isNode.js jsapi.dom.NODETYPES.js */ jsapi.dom.isNode = function(object) { return !!(object && jsapi.dom.NODETYPES[object.nodeType] && object.cloneNode); }; /* ##### jsapi.string.js ##### */ /* 2006 Florian Hoech jsapi.string.js jsapi.js */ jsapi.string = {}; /* ##### jsapi.string.trim.js ##### */ /* 2006 Florian Hoech jsapi.string.trim.js jsapi.string.js */ jsapi.string.trim = function(str) { return str.replace(/(^\s+|\s+$)/g, "") }; jsapi.string.trim._args = [String]; /* ##### jsapi.useragent.js ##### */ /* 2006 Florian Hoech jsapi.useragent.js jsapi.string.trim.js TO-DO: add KHTML */ jsapi.useragent = { $: function (ua) { ua = (ua || navigator.userAgent).toLowerCase(); var i, j, match, _match, replace = [ [/(\d+\.)(\d+)\.(\d+)(\.(\d+))?/g, "$1$2$3$5"], [/linux/g, ";linux;linux"], [/mac/, ";mac;mac"], [/microsoft ((p)ocket )?internet explorer/g, "ms$2ie"], [/win32/g, "windows"], [/windows (\w+)/g, "windows;windows $1"] ]; for (i = 0; i < replace.length; i ++) ua = ua.replace(replace[i][0], replace[i][1]); ua = ua.split(/[\(\)\[\]\{\}\,;]/); for (i in this) { if (typeof this[i] != "object" && typeof this[i] != "function") delete this[i] }; for (i = 0; i < ua.length; i ++) { match = ua[i].match(/[a-z\.\-_]+(\s+[a-z\.\-_]+)*\Wv?\d+(\.\d+)*/g); if (match) { for (j = 0; j < match.length; j ++) { _match = match[j].match(/([a-z\.\-_]+(\s[a-z\.\-_]+)*)\Wv?(\d+(\.\d+)*)/); if (!this[_match[1]] || (parseFloat(_match[3]) == _match[3] && this[_match[1]] < parseFloat(_match[3]))) this[_match[1]] = parseFloat(_match[3]) == _match[3] ? parseFloat(_match[3]) : _match[3] } } else { ua[i] = jsapi.string.trim(ua[i]); if (ua[i]) this[ua[i]] = true } }; if (this.konqueror && !this.khtml) this.khtml = true; if (this.safari === true) delete this.safari; // safari would have a version number here if (!this.gecko && this.mozilla) { this.compatible = this.mozilla; delete this.mozilla }; if (this.opera || this.safari || this.konqueror) { if (this.mozilla) delete this.mozilla; if (this.msie) delete this.msie }; return this } }; jsapi.useragent.toString = function() { var props = []; for (i in this) { if (typeof this[i] != "object" && typeof this[i] != "function") props.push((/\s/.test(i) ? "'" : "") + i + (/\s/.test(i) ? "'" : "") + ":" + (typeof this[i] == "string" ? '"' : "") + this[i] + (typeof this[i] == "string" ? '"' : "")) }; return props.join(", "); }; jsapi.useragent.$._args = [String]; jsapi.useragent.$(); /* ##### jsapi.util.js ##### */ /* 2006 Florian Hoech jsapi.util.js jsapi.js */ jsapi.util = {}; /* ##### jsapi.generic_accessor_mutator.js ##### */ /* Florian Hoech jsapi.generic_accessor_mutator.js jsapi.js jsapi.dom.js jsapi.dom.isNode.js jsapi.useragent.js jsapi.util.js */ jsapi.constants.ATTRIBUTE_ALIASES = { "class": "className", "for": "htmlFor", readonly: "readOnly", maxlength: "maxLength" }; jsapi._attribute = function(object, attributeName, value) { // if arguments.length == 2, get attribute. otherwise, if value == null, remove attribute, else set attribute switch (attributeName) { case "style": case "value": return arguments.length == 2 ? jsapi._property(object, attributeName) : jsapi._property(object, attributeName, value); default: if (jsapi.constants.ATTRIBUTE_ALIASES[attributeName]) return jsapi._property.apply(jsapi, arguments); else { if (arguments.length == 2) return object.getAttribute(attributeName); // get attribute if (value == null) object.removeAttribute(attributeName); // remove attribute else object.setAttribute(attributeName, value); // set attribute } }; return object }; jsapi._property = function(object, propertyName, value) { // if arguments.length == 2, get property. otherwise, if value == null, delete property, else set property switch (propertyName) { case "style": if (arguments.length == 2) return object.style.cssText; // get attribute object.style.cssText = value || ""; // set attribute break; }; if (jsapi.dom.isNode(object)) propertyName = jsapi.constants.ATTRIBUTE_ALIASES[propertyName] || propertyName; if (arguments.length == 2) return object[propertyName]; object[propertyName] = value; // set property if (value == null) try { delete object[propertyName] } catch (e) { }; // delete property return object }; jsapi.dom.attr = jsapi.dom.attribute = function (object, attribute, value) { return arguments.length == 2 && (typeof attribute != "object" || attribute.constructor == Array) ? jsapi._get(object, jsapi._attribute, attribute) : jsapi._set(object, jsapi._attribute, attribute, value); }; jsapi.util.prop = jsapi.util.property = function (object, property, value) { return arguments.length == 2 && (typeof property != "object" || property.constructor == Array) ? jsapi._get(object, jsapi._property, property) : jsapi._set(object, jsapi._property, property, value); }; jsapi._get = function (object, callback, property) { if (typeof property != "object") return callback(object, property); else { var result = []; for (var i = 0; i < property.length; i ++) result.push(callback(object, property[i])); return result; } }; jsapi._set = function (object, callback, property, value) { if (typeof property != "object") callback(object, property, value); else { if (property.constructor == Array) for (var i = 0; i < property.length; i ++) callback(object, property[i], value); else for (var propertyName in property) callback(object, propertyName, property[propertyName] != null ? property[propertyName] : value); }; return object; };; /* ##### jsapi.dom.attribute.js ##### */ /* 2006 Florian Hoech jsapi.dom.attribute.js jsapi.generic_accessor_mutator.js */ /* ##### jsapi.dom.attributeAddWord.js ##### */ /* 2006 Florian Hoech jsapi.dom.attributeAddWord.js jsapi.dom.attribute.js */ jsapi.dom.attributeAddWord = function(element, attr, word) { var value = jsapi.dom.attribute(element, attr); return jsapi.dom.attribute(element, attr, (value != null ? value + " " : "") + word) }; /* ##### jsapi.dom.attributeHasWord.js ##### */ /* 2006 Florian Hoech jsapi.dom.attributeHasWord.js jsapi.dom.attribute.js */ jsapi.dom.attributeHasWord = function(element, attr, word) { return (new RegExp("(^|\\s)" + word + "(\\s|$)")).test(jsapi.dom.attribute(element, attr)) }; /* ##### jsapi.dom.attributeRemoveWord.js ##### */ /* 2006 Florian Hoech jsapi.dom.attributeRemoveWord.js jsapi.dom.attribute.js */ jsapi.dom.attributeRemoveWord = function(element, attr, word) { var value = jsapi.dom.attribute(element, attr); if (value) jsapi.dom.attribute(element, attr, value.replace(new RegExp("(^|\\s+)" + word + "(\\s|$)"), "$2")); return element }; /* ##### jsapi.math.js ##### */ /* 2006 Florian Hoech jsapi.math.js jsapi.array.flat.js */ jsapi.math = { absmax: function(v) { var a = jsapi.array.flat(arguments), r = a[0]; for (var i = 0; i < a.length; i ++) if (Math.abs(r) < Math.abs(a[i])) r = a[i]; return r }, avg: function() { var a = jsapi.array.flat(arguments), r = 0; for (var i = 0; i < a.length; i ++) r += a[i]; return r / a.length }, cbrt: function(x) { return x >= 0 ? Math.pow (x, 1 / 3) : -Math.pow (-x, 1 / 3) }, deg: function(v) { return v * 180 / Math.PI }, longToUnsigned: function(num) { while (num < 0) num += 4294967296; return num }, max: function(v) { var a = jsapi.array.flat(arguments), r = a[0]; for (var i = 0; i < a.length; i ++) r = Math.max(r, a[i]); return r }, min: function(v) { var a = jsapi.array.flat(arguments), r = a[0]; for (var i = 0; i < a.length; i ++) r = Math.min(r, a[i]); return r }, rad: function(v) { return v / 180 * Math.PI } }; jsapi.math.absmax._args = [Number]; jsapi.math.avg._args = [Number]; jsapi.math.cbrt._args = [Number]; jsapi.math.deg._args = [Number]; jsapi.math.longToUnsigned._args = [Number]; jsapi.math.max._args = [Array]; jsapi.math.min._args = [Array]; jsapi.math.rad._args = [Number]; /* ##### jsapi.math.color.js ##### */ /* 2006 Florian Hoech jsapi.math.color.js jsapi.math.js */ jsapi.math.color = {}; /* ##### jsapi.math.color.XYZ2CorColorTemp.js ##### */ /* 2007 Florian Hoech jsapi.math.color.XYZ2CorColorTemp.js jsapi.math.color.js */ jsapi.math.color.XYZ2CorColorTemp = function(x, y, z) { // derived from ANSI C implementation by Bruce Lindbloom www.brucelindbloom.com // LERP(a,b,c) = linear interpolation macro, is 'a' when c == 0.0 and 'b' when c == 1.0 function LERP(a,b,c) { return (b - a) * c + a }; var rt = [ // reciprocal temperature (K) Number.MIN_VALUE, 10.0e-6, 20.0e-6, 30.0e-6, 40.0e-6, 50.0e-6, 60.0e-6, 70.0e-6, 80.0e-6, 90.0e-6, 100.0e-6, 125.0e-6, 150.0e-6, 175.0e-6, 200.0e-6, 225.0e-6, 250.0e-6, 275.0e-6, 300.0e-6, 325.0e-6, 350.0e-6, 375.0e-6, 400.0e-6, 425.0e-6, 450.0e-6, 475.0e-6, 500.0e-6, 525.0e-6, 550.0e-6, 575.0e-6, 600.0e-6 ]; var uvt = [ [0.18006, 0.26352, -0.24341], [0.18066, 0.26589, -0.25479], [0.18133, 0.26846, -0.26876], [0.18208, 0.27119, -0.28539], [0.18293, 0.27407, -0.30470], [0.18388, 0.27709, -0.32675], [0.18494, 0.28021, -0.35156], [0.18611, 0.28342, -0.37915], [0.18740, 0.28668, -0.40955], [0.18880, 0.28997, -0.44278], [0.19032, 0.29326, -0.47888], [0.19462, 0.30141, -0.58204], [0.19962, 0.30921, -0.70471], [0.20525, 0.31647, -0.84901], [0.21142, 0.32312, -1.0182], [0.21807, 0.32909, -1.2168], [0.22511, 0.33439, -1.4512], [0.23247, 0.33904, -1.7298], [0.24010, 0.34308, -2.0637], [0.24792, 0.34655, -2.4681], // Note: 0.24792 is a corrected value for the error found in W&S as 0.24702 [0.25591, 0.34951, -2.9641], [0.26400, 0.35200, -3.5814], [0.27218, 0.35407, -4.3633], [0.28039, 0.35577, -5.3762], [0.28863, 0.35714, -6.7262], [0.29685, 0.35823, -8.5955], [0.30505, 0.35907, -11.324], [0.31320, 0.35968, -15.628], [0.32129, 0.36011, -23.325], [0.32931, 0.36038, -40.770], [0.33724, 0.36051, -116.45] ]; var us, vs, p, di, dm, i; if ((x < 1e-20) && (y < 1e-20) && (z < 1e-20)) return -1; // protect against possible divide-by-zero failure us = (4 * x) / (x + 15 * y + 3 * z); vs = (6 * y) / (x + 15 * y + 3 * z); dm = 0; for (i = 0; i < 31; i++) { di = (vs - uvt[i][1]) - uvt[i][2] * (us - uvt[i][0]); if ((i > 0) && (((di < 0) && (dm >= 0)) || ((di >= 0) && (dm < 0)))) break; // found lines bounding (us, vs) : i-1 and i dm = di }; if (i == 31) return -1; // bad XYZ input, color temp would be less than minimum of 1666.7 degrees, or too far towards blue di = di / Math.sqrt(1 + uvt[i ][2] * uvt[i ][2]); dm = dm / Math.sqrt(1 + uvt[i - 1][2] * uvt[i - 1][2]); p = dm / (dm - di); // p = interpolation parameter, 0.0 : i-1, 1.0 : i return 1 / (LERP(rt[i - 1], rt[i], p)); }; /* ##### jsapi.math.color.delta.js ##### */ /* 2007 Florian Hoech jsapi.math.color.delta.js jsapi.math.color.js */ jsapi.math.color.delta = function (L1, a1, b1, L2, a2, b2, method, p1, p2, p3, debug) { /* CIE 1994 & CMC calculation code derived from formulas on www.brucelindbloom.com CIE 1994 code uses some alterations seen on www.farbmetrik-gall.de/cielab/korrcielab/cie94.html (see notes in code below) CIE 2000 calculation code derived from Excel spreadsheet available at www.ece.rochester.edu/~gsharma/ciede2000 method: either "CIE94", "CMC", "CIE2K" or "CIE76" (default if method is not set) p1, p2, p3 arguments have different meaning for each calculation method: CIE 1994: if p1 is not null, calculation will be adjusted for textiles, otherwise graphics arts (default if p1 is not set) CMC(l:c): p1 equals l (lightness) weighting factor and p2 equals c (chroma) weighting factor. commonly used values are CMC(1:1) for perceptability (default if p1 and p2 are not set) and CMC(2:1) for acceptability CIE 2000: p1 becomes kL (lightness) weighting factor, p2 becomes kC (chroma) weighting factor and p3 becomes kH (hue) weighting factor (all three default to 1 if not set) */ for (var i = 0; i < 6; i ++) if (typeof arguments[i] != "number" || isNaN(arguments[i])) return NaN; if (typeof method == "string") method = method.toLowerCase(); switch (method) { case "94": case "1994": case "cie94": case "cie1994": var textiles = p1, dL = L1 - L2, C1 = Math.sqrt(Math.pow(a1, 2) + Math.pow(b1, 2)), C2 = Math.sqrt(Math.pow(a2, 2) + Math.pow(b2, 2)), dC = C1 - C2, dH2 = Math.pow(a1 - a2, 2) + Math.pow(b1 - b2, 2) - Math.pow(dC, 2), dH = dH2 > 0 ? Math.sqrt(dH2) : 0, SL = 1, K1 = textiles ? 0.048 : 0.045, K2 = textiles ? 0.014 : 0.015, C_ = (Math.sqrt((1 + (K1 * C1)) * (1 + (K1 * C2))) - 1) / K1, // www.farbmetrik-gall.de/cielab/korrcielab/cie94.html SC = 1 + K1 * C_, // brucelindbloom.com formula originally used C1 instead of C_, but the results are different from ProfileMaker/MeasureTool implementation, so use this instead (found on www.farbmetrik-gall.de/cielab/korrcielab/cie94.html) SH = 1 + K2 * C_, // brucelindbloom.com formula originally used C1 instead of C_, but the results are different from ProfileMaker/MeasureTool implementation, so use this instead (found on www.farbmetrik-gall.de/cielab/korrcielab/cie94.html) KL = textiles ? 2 : 1, KC = 1, KH = 1, dE = Math.sqrt(Math.pow(dL / (KL * SL), 2) + Math.pow(dC / (KC * SC), 2) + Math.pow(dH / (KH * SH), 2)); break; case "cmc(2:1)": case "cmc21": p1 = 2; case "cmc(1:1)": case "cmc11": case "cmc": var l = typeof p1 == "number" ? p1 : 1, c = typeof p2 == "number" ? p2 : 1; dL = L1 - L2, C1 = Math.sqrt(Math.pow(a1, 2) + Math.pow(b1, 2)), C2 = Math.sqrt(Math.pow(a2, 2) + Math.pow(b2, 2)), dC = C1 - C2, dH2 = Math.pow(a1 - a2, 2) + Math.pow(b1 - b2, 2) - Math.pow(dC, 2), dH = dH2 > 0 ? Math.sqrt(dH2) : 0, SL = L1 < 16 ? 0.511 : (0.040975 * L1) / (1 + 0.01765 * L1), SC = (0.0638 * C1) / (1 + 0.0131 * C1) + 0.638, F = Math.sqrt(Math.pow(C1, 4) / (Math.pow(C1, 4) + 1900)), H1 = jsapi.math.deg(Math.atan2(b1, a1)) + (b1 >= 0 ? 0 : 360), T = 164 <= H1 && H1 <= 345 ? 0.56 + Math.abs(0.2 * Math.cos(jsapi.math.rad(H1 + 168))) : 0.36 + Math.abs(0.4 * Math.cos(jsapi.math.rad(H1 + 35))), SH = SC * (F * T + 1 - F), dE = Math.sqrt(Math.pow(dL / (l * SL), 2) + Math.pow(dC / (c * SC), 2) + Math.pow(dH / SH, 2)); break; case "00": case "2k": case "2000": case "cie00": case "cie2k": case "cie2000": var pow25_7 = Math.pow(25, 7), k_L = typeof p1 == "number" ? p1 : 1, k_C = typeof p2 == "number" ? p2 : 1, k_H = typeof p3 == "number" ? p3 : 1, C1 = Math.sqrt(Math.pow(a1, 2) + Math.pow(b1, 2)), C2 = Math.sqrt(Math.pow(a2, 2) + Math.pow(b2, 2)) , C_avg = jsapi.math.avg(C1, C2), G = .5 * (1 - Math.sqrt(Math.pow(C_avg, 7) / (Math.pow(C_avg, 7) + pow25_7))), L1_ = L1, a1_ = (1 + G) * a1, b1_ = b1, L2_ = L2, a2_ = (1 + G) * a2, b2_ = b2, C1_ = Math.sqrt(Math.pow(a1_, 2) + Math.pow(b1_, 2)), C2_ = Math.sqrt(Math.pow(a2_, 2) + Math.pow(b2_, 2)), h1_ = a1_ == 0 && b1_ == 0 ? 0 : jsapi.math.deg(Math.atan2(b1_, a1_)) + (b1_ >= 0 ? 0 : 360), h2_ = a2_ == 0 && b2_ == 0 ? 0 : jsapi.math.deg(Math.atan2(b2_, a2_)) + (b2_ >= 0 ? 0 : 360), dh_cond = h2_ - h1_ > 180 ? 1 : (h2_ - h1_ < -180 ? 2 : 0), dh_ = dh_cond == 0 ? h2_ - h1_ : (dh_cond == 1 ? h2_ - h1_ - 360 : h2_ + 360 - h1_), dL_ = L2_ - L1_, dL = dL_, dC_ = C2_ - C1_, dC = dC_, dH_ = 2 * Math.sqrt(C1_ * C2_) * Math.sin(jsapi.math.rad(dh_ / 2)), dH = dH_, L__avg = jsapi.math.avg(L1_, L2_), C__avg = jsapi.math.avg(C1_, C2_), h__avg_cond = C1_ * C2_ == 0 ? 3 : (Math.abs(h2_ - h1_) <= 180 ? 0 : (h2_ + h1_ < 360 ? 1 : 2)), h__avg = h__avg_cond == 3 ? h1_ + h2_ : (h__avg_cond == 0 ? jsapi.math.avg(h1_, h2_) : (h__avg_cond == 1 ? jsapi.math.avg(h1_, h2_) + 180 : jsapi.math.avg(h1_, h2_) - 180)), AB = Math.pow(L__avg - 50, 2), // (L'_ave-50)^2 S_L = 1 + .015 * AB / Math.sqrt(20 + AB), S_C = 1 + .045 * C__avg, T = 1 - .17 * Math.cos(jsapi.math.rad(h__avg - 30)) + .24 * Math.cos(jsapi.math.rad(2 * h__avg)) + .32 * Math.cos(jsapi.math.rad(3 * h__avg + 6)) - .2 * Math.cos(jsapi.math.rad(4 * h__avg - 63)), S_H = 1 + .015 * C__avg * T, dTheta = 30 * Math.exp(-1 * Math.pow((h__avg - 275) / 25, 2)), R_C = 2 * Math.sqrt(Math.pow(C__avg, 7) / (Math.pow(C__avg, 7) + pow25_7)), R_T = -Math.sin(jsapi.math.rad(2 * dTheta)) * R_C, AJ = dL_ / S_L / k_L, // dL' / k_L / S_L AK = dC_ / S_C / k_C, // dC' / k_C / S_C AL = dH_ / S_H / k_H, // dH' / k_H / S_H dE = Math.sqrt(Math.pow(AJ, 2) + Math.pow(AK, 2) + Math.pow(AL, 2) + R_T * AK * AL); if (debug) { r = (C1 + "|" + C2 + "|" + C_avg + "|" + G + "|" + L1_ + "|" + a1_ + "|" + b1_ + "|" + L2_ + "|" + a2_ + "|" + b2_ + "|" + C1_ + "|" + C2_ + "|" + h1_ + "|" + h2_ + "|" + dh_ + "|" + dL_ + "|" + dC_ + "|" + dH_ + "|" + L__avg + "|" + C__avg + "|" + h__avg + "|" + AB + "|" + S_L + "|" + S_C + "|" + T + "|" + S_H + "|" + dTheta + "|" + R_C + "|" + R_T + "|" + AJ + "|" + AK + "|" + AL + "|" + dE + "|" + dh_cond + "|" + h__avg_cond).split("|"); alpha = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; t = []; n = alpha.indexOf("G"); for (i = 0; i < r.length; i ++) { a = i + n < alpha.length ? alpha[i + n] : "A" + alpha[i + n - alpha.length]; t.push(a + ": " + r[i]); } return t.join("\n"); }; break; default: var dL = L1 - L2, C1 = Math.sqrt(Math.pow(a1, 2) + Math.pow(b1, 2)), C2 = Math.sqrt(Math.pow(a2, 2) + Math.pow(b2, 2)), dC = C1 - C2, dH2 = Math.pow(a1 - a2, 2) + Math.pow(b1 - b2, 2) - Math.pow(dC, 2), dH = dH2 > 0 ? Math.sqrt(dH2) : 0, dE = Math.sqrt(Math.pow(dL, 2) + Math.pow(a1 - a2, 2) + Math.pow(b1 - b2, 2)); if (isNaN(dH)) { if (window.location.href.indexOf("?debug")>-1) alert('a1: ' + a1 + '\na2: ' + a2 + '\nMath.pow(a1 - a2, 2): ' + Math.pow(a1 - a2, 2) + '\nb1: ' + b1 + '\nb2: ' + b2 + '\nMath.pow(b1 - b2, 2): ' + Math.pow(b1 - b2, 2) + '\ndC: ' + dC + '\nMath.pow(dC, 2): ' + Math.pow(dC, 2) + '\nMath.pow(a1 - a2, 2) + Math.pow(b1 - b2, 2) - Math.pow(dC, 2): ' + (Math.pow(a1 - a2, 2) + Math.pow(b1 - b2, 2) - Math.pow(dC, 2))); } }; return { E: dE, L: dL, C: dC, H: dH, a: a1 - a2, b: b1 - b2 }; }; DisplayCAL-3.1.0.0/DisplayCAL/report/jsapi-patches.js0000644000076500000000000004320112647526510022033 0ustar devwheel00000000000000function sortNumber(a, b) { return a - b; }; jsapi.array.flat = function(a) { var r = []; for (var i = 0; i < a.length; i ++) { if (a[i] != null && a[i].constructor == Array) r = r.concat(jsapi.array.flat(a[i])); else r.push(a[i]) }; return r }; jsapi.array.flat._args = [Array]; jsapi.math.median = function () { // http://en.wikipedia.org/wiki/Median var a = jsapi.array.flat(arguments), median, sorted = a.sort(sortNumber); if (sorted.length % 2 == 0) median = (sorted[sorted.length / 2] + sorted[sorted.length / 2 + 1]) / 2; else median = sorted[(sorted.length + 1) / 2]; return median }; jsapi.math.mad = function () { // http://en.wikipedia.org/wiki/Median_absolute_deviation var a = jsapi.array.flat(arguments), median = jsapi.math.median(a), sorted = a.sort(sortNumber); for (var i = 0; i < sorted.length; i++) sorted[i] = Math.abs(sorted[i] - median); return jsapi.math.median(sorted); }; jsapi.math.stddev = function () { // http://en.wikipedia.org/wiki/Standard_deviation // http://jsfromhell.com/array/average return Math.sqrt(jsapi.math.variance(jsapi.array.flat(arguments))); }; jsapi.math.variance = function () { // http://jsfromhell.com/array/average var a = jsapi.array.flat(arguments); for (var m, s = 0, l = a.length; l--; s += a[l]); for (m = s / a.length, l = a.length, s = 0; l--; s += Math.pow(a[l] - m, 2)); return s / a.length; }; jsapi.math.color.adapt = function (XS, YS, ZS, whitepoint_source, whitepoint_destination, MA) { // chromatic adaption // based on formula http://brucelindbloom.com/Eqn_ChromAdapt.html // MA = adaption matrix or predefined choice ('CAT02', 'Bradford', 'HPE D65', 'XYZ scaling'), // defaults to 'Bradford' if (!MA) MA = 'Bradford'; if (typeof MA == 'string') { switch (MA) { case 'XYZ scaling': MA = [[1, 0, 0], [0, 1, 0], [0, 0, 1]]; break; case 'HPE D65': MA = [[ 0.40024, 0.70760, -0.08081], [-0.22630, 1.16532, 0.04570], [ 0.00000, 0.00000, 0.91822]]; break; case 'CAT02': MA = [[ 0.7328, 0.4296, -0.1624], [-0.7036, 1.6975, 0.0061], [ 0.0030, 0.0136, 0.9834]]; break; case 'Bradford': default: MA = [[ 0.8951, 0.2664, -0.1614], [-0.7502, 1.7135, 0.0367], [ 0.0389, -0.0685, 1.0296]]; } }; if (MA.constructor != jsapi.math.Matrix3x3) MA = new jsapi.math.Matrix3x3(MA); var XYZWS = jsapi.math.color.get_whitepoint(whitepoint_source), pybs = MA.multiply(XYZWS), XYZWD = jsapi.math.color.get_whitepoint(whitepoint_destination), pybd = MA.multiply(XYZWD); return MA.invert().multiply([[pybd[0]/pybs[0], 0, 0], [0, pybd[1]/pybs[1], 0], [0, 0, pybd[2]/pybs[2]]]).multiply(MA).multiply([XS, YS, ZS]); }; jsapi.math.color.Lab2RGB = function (L, a, b, whitepoint, scale, round_) { var XYZ = jsapi.math.color.Lab2XYZ(L, a, b, whitepoint || "D50"); return jsapi.math.color.XYZ2RGB(XYZ[0], XYZ[1], XYZ[2], whitepoint || "D50", scale, round_) }; jsapi.math.color.Lab2XYZ = function(L, a, b, whitepoint, scale) { // based on http://www.easyrgb.com/math.php?MATH=M8 // whitepoint can be a color temperature in Kelvin or an array containing XYZ values if (!scale) scale = 1.0; var Y = ( L + 16 ) / 116, X = a / 500 + Y, Z = Y - b / 200; // Bruce Lindbloom's fix for the discontinuity of the CIE L* function // (http://brucelindbloom.com/LContinuity.html) var E = 216 / 24389, // Intent of CIE standard, actual CIE standard = 0.008856 K = 24389 / 27; // Intent of CIE standard, actual CIE standard = 903.3 // K / 116 is used instead of 7.787 if ( Math.pow(Y, 3) > E ) Y = Math.pow(Y, 3); else Y = ( Y - 16 / 116 ) / (K / 116); if ( Math.pow(X, 3) > E ) X = Math.pow(X, 3); else X = ( X - 16 / 116 ) / (K / 116); if ( Math.pow(Z, 3) > E ) Z = Math.pow(Z, 3); else Z = ( Z - 16 / 116 ) / (K / 116); var ref_XYZ = jsapi.math.color.get_whitepoint(whitepoint, scale); X *= ref_XYZ[0]; Y *= ref_XYZ[1]; Z *= ref_XYZ[2]; return [X, Y, Z] }; jsapi.math.color.XYZ2RGB = function (X, Y, Z, whitepoint, scale, round_) { if (!scale) scale = 1.0; var RGB = jsapi.math.color.xyz_to_rgb_matrix(0.6400, 0.3300, 0.3000, 0.6000, 0.1500, 0.0600, whitepoint || "D65", 1.0).multiply([X, Y, Z]); // sRGB for (var i = 0; i < 3; i ++) { if (RGB[i] > 0.0031308) { RGB[i] = 1.055 * Math.pow(RGB[i], 1 / 2.4) - 0.055; } else { RGB[i] *= 12.92; } RGB[i] = Math.min(1.0, Math.max(0, RGB[i])) * scale; if (round_) RGB[i] = Math.round(RGB[i]); } return RGB; }; jsapi.math.color.CIEDCorColorTemp2XYZ = function(T, scale) { var xyY = jsapi.math.color.CIEDCorColorTemp2xyY(T, scale); return jsapi.math.color.xyY2XYZ(xyY[0], xyY[1], xyY[2]); }; jsapi.math.color.CIEDCorColorTemp2xyY = function(T, scale) { // Based on formula from http://brucelindbloom.com/Eqn_T_to_xy.html if (!scale) scale = 1.0; if (typeof T == "string") { // Assume standard illuminant, e.g. "D50" var illuminant = jsapi.math.color.get_standard_illuminant(T, null, scale); return jsapi.math.color.XYZ2xyY(illuminant[0], illuminant[1], illuminant[2]); } var xD = 4000 <= T && T <= 7000 ? ((-4.607 * Math.pow(10, 9)) / Math.pow(T, 3)) + ((2.9678 * Math.pow(10, 6)) / Math.pow(T, 2)) + ((0.09911 * Math.pow(10, 3)) / T) + 0.244063 : (7000 < T && T <= 25000 ? ((-2.0064 * Math.pow(10, 9)) / Math.pow(T, 3)) + ((1.9018 * Math.pow(10, 6)) / Math.pow(T, 2)) + ((0.24748 * Math.pow(10, 3)) / T) + 0.237040 : null), yD = xD != null ? -3 * Math.pow(xD, 2) + 2.87 * xD - 0.275 : null; return xD == null ? null : [xD, yD, scale]; }; jsapi.math.color.CMYK2RGB = function(C, M, Y, K, scale, round_) { // http://www.easyrgb.com/math.php?MATH=M14 if (!scale) scale = 1.0; C = ( C * ( 1 - K ) + K ); M = ( M * ( 1 - K ) + K ); Y = ( Y * ( 1 - K ) + K ); // http://www.easyrgb.com/math.php?MATH=M12 var R, G, B; R = ( 1 - C ) * scale; G = ( 1 - M ) * scale; B = ( 1 - Y ) * scale; if (round_) { R = Math.round(R); G = Math.round(G); B = Math.round(B); } return [R, G, B]; }; jsapi.math.color.XYZ2Lab = function(X, Y, Z, whitepoint) { /* Convert from XYZ to Lab. The input Y value needs to be in the nominal range [0.0, 100.0] and other input values scaled accordingly. The output L value is in the nominal range [0.0, 100.0]. whitepoint can be string (e.g. "D50"), list/tuple of XYZ coordinates or color temperature as float or int. Defaults to D50 if not set. Based on formula from http://brucelindbloom.com/Eqn_XYZ_to_Lab.html */ whitepoint = jsapi.math.color.get_whitepoint(whitepoint, 100); var E = 216 / 24389, // Intent of CIE standard, actual CIE standard = 0.008856 K = 24389 / 27, // Intent of CIE standard, actual CIE standard = 903.3 xr = X / whitepoint[0], yr = Y / whitepoint[1], zr = Z / whitepoint[2], fx = xr > E ? jsapi.math.cbrt(xr) : (K * xr + 16) / 116, fy = yr > E ? jsapi.math.cbrt(yr) : (K * yr + 16) / 116, fz = zr > E ? jsapi.math.cbrt(zr) : (K * zr + 16) / 116, L = 116 * fy - 16, a = 500 * (fx - fy), b = 200 * (fy - fz); return [L, a, b]; }; jsapi.math.color.XYZ2Lu_v_ = function(X, Y, Z, whitepoint) { /* Convert from XYZ to CIE Lu'v' */ if (X + Y + Z == 0) { // We can't check for X == Y == Z == 0 because they may actually add up // to 0, thus resulting in ZeroDivisionError later var XYZ = jsapi.math.color.get_whitepoint(whitepoint), Lu_v_ = jsapi.math.color.XYZ2Lu_v_(XYZ[0], XYZ[1], XYZ[2]); return [0, Lu_v_[1], Lu_v_[2]]; } var XYZr = jsapi.math.color.get_whitepoint(whitepoint, 100), yr = Y / XYZr[1], L = yr > 216 / 24389 ? 116 * jsapi.math.cbrt(yr) - 16 : 24389 / 27 * yr, u_ = (4 * X) / (X + 15 * Y + 3 * Z), v_ = (9 * Y) / (X + 15 * Y + 3 * Z); return [L, u_, v_]; }; jsapi.math.color.xyY2XYZ = function(x, y, Y) { /* Convert from xyY to XYZ. Based on formula from http://brucelindbloom.com/Eqn_xyY_to_XYZ.html Implementation Notes: 1. Watch out for the case where y = 0. In that case, X = Y = Z = 0 is returned. 2. The output XYZ values are in the nominal range [0.0, Y[xyY]]. */ if (y == 0) return [0, 0, 0]; if (Y == null) Y = 1.0; var X = (x * Y) / y, Z = (1 - x - y) * Y / y; return [X, Y, Z]; }; jsapi.math.color.XYZ2xyY = function (X, Y, Z, whitepoint) { /* Convert from XYZ to xyY. Based on formula from http://brucelindbloom.com/Eqn_XYZ_to_xyY.html Implementation Notes: 1. Watch out for black, where X = Y = Z = 0. In that case, x and y are set to the chromaticity coordinates of the reference whitepoint. 2. The output Y value is in the nominal range [0.0, Y[XYZ]]. */ if (X == Y && Y == Z && Z == 0) { whitepoint = jsapi.math.color.get_whitepoint(whitepoint); var xyY = jsapi.math.color.XYZ2xyY(whitepoint[0], whitepoint[1], whitepoint[2]); return [xyY[0], xyY[1], 0.0]; } var x = X / (X + Y + Z), y = Y / (X + Y + Z); return [x, y, Y]; }; jsapi.math.color.planckianCT2XYZ = function(T) { var xyY = jsapi.math.color.planckianCT2xyY(T); return jsapi.math.color.xyY2XYZ(xyY[0], xyY[1], xyY[2]); }; jsapi.math.color.planckianCT2xyY = function (T) { /* Convert from planckian temperature to xyY. T = temperature in Kelvin. Formula from http://en.wikipedia.org/wiki/Planckian_locus */ var x, y; if (1667 <= T && T <= 4000) x = ( -0.2661239 * (Math.pow(10, 9) / Math.pow(T, 3)) - 0.2343580 * (Math.pow(10, 6) / Math.pow(T, 2)) + 0.8776956 * (Math.pow(10, 3) / T) + 0.179910); else if (4000 <= T && T <= 25000) x = ( -3.0258469 * (Math.pow(10, 9) / Math.pow(T, 3)) + 2.1070379 * (Math.pow(10, 6) / Math.pow(T, 2)) + 0.2226347 * (Math.pow(10, 3) / T) + 0.24039); else return null; if (1667 <= T && T <= 2222) y = ( -1.1063814 * Math.pow(x, 3) - 1.34811020 * Math.pow(x, 2) + 2.18555832 * x - 0.20219683); else if (2222 <= T && T <= 4000) y = ( -0.9549476 * Math.pow(x, 3) - 1.37418593 * Math.pow(x, 2) + 2.09137015 * x - 0.16748867); else if (4000 <= T && T <= 25000) y = ( 3.0817580 * Math.pow(x, 3) - 5.87338670 * Math.pow(x, 2) + 3.75112997 * x - 0.37001483); return [x, y, 1.0] }; jsapi.math.color.xyz_to_rgb_matrix = function (xr, yr, xg, yg, xb, yb, whitepoint, scale) { // Create and return an XYZ to RGB matrix if (!scale) scale = 1.0; var cachehash = [xr, yr, xg, yg, xb, yb, whitepoint, scale].join(","), cache = jsapi.math.color.xyz_to_rgb_matrix.cache[cachehash]; if (cache) return cache; whitepoint = jsapi.math.color.get_whitepoint(whitepoint, scale); var XYZr = jsapi.math.color.xyY2XYZ(xr, yr, scale), XYZg = jsapi.math.color.xyY2XYZ(xg, yg, scale), XYZb = jsapi.math.color.xyY2XYZ(xb, yb, scale), SrSgSb = new jsapi.math.Matrix3x3([[XYZr[0], XYZg[0], XYZb[0]], [XYZr[1], XYZg[1], XYZb[1]], [XYZr[2], XYZg[2], XYZb[2]]]).invert().multiply(whitepoint); return jsapi.math.color.xyz_to_rgb_matrix.cache[cachehash] = new jsapi.math.Matrix3x3([[SrSgSb[0] * XYZr[0], SrSgSb[1] * XYZg[0], SrSgSb[2] * XYZb[0]], [SrSgSb[0] * XYZr[1], SrSgSb[1] * XYZg[1], SrSgSb[2] * XYZb[1]], [SrSgSb[0] * XYZr[2], SrSgSb[1] * XYZg[2], SrSgSb[2] * XYZb[2]]]).invert(); }; jsapi.math.color.xyz_to_rgb_matrix.cache = {}; jsapi.math.color.standard_illuminants = { // 1st level is the standard name => illuminant definitions // 2nd level is the illuminant name => CIE XYZ coordinates // (Y should always assumed to be 1.0 and is not explicitly defined) "None": {"E": {"X": 1.00000, "Z": 1.00000}}, "ASTM E308-01": {"A": {"X": 1.09850, "Z": 0.35585}, "C": {"X": 0.98074, "Z": 1.18232}, "D50": {"X": 0.96422, "Z": 0.82521}, "D55": {"X": 0.95682, "Z": 0.92149}, "D65": {"X": 0.95047, "Z": 1.08883}, "D75": {"X": 0.94972, "Z": 1.22638}, "F2": {"X": 0.99186, "Z": 0.67393}, "F7": {"X": 0.95041, "Z": 1.08747}, "F11": {"X": 1.00962, "Z": 0.64350}}, "ICC": {"D50": {"X": 0.9642, "Z": 0.8249}, "D65": {"X": 0.9505, "Z": 1.0890}}, "Wyszecki & Stiles": {"A": {"X": 1.09828, "Z": 0.35547}, "B": {"X": 0.99072, "Z": 0.85223}, "C": {"X": 0.98041, "Z": 1.18103}, "D55": {"X": 0.95642, "Z": 0.92085}, "D65": {"X": 0.95017, "Z": 1.08813}, "D75": {"X": 0.94939, "Z": 1.22558}} }; jsapi.math.color.get_standard_illuminant = function (illuminant_name, priority, scale) { if (!priority) priority = ["ICC", "ASTM E308-01", "Wyszecki & Stiles", "None"]; if (!scale) scale = 1.0; var cachehash = [illuminant_name, priority, scale].join(","), cache = jsapi.math.color.get_standard_illuminant.cache[cachehash]; if (cache) return cache; var illuminant = null; for (var i = 0; i < priority.length; i ++) { if (!jsapi.math.color.standard_illuminants[priority[i]]) throw 'Unrecognized standard "' + priority[i] + '"'; illuminant = jsapi.math.color.standard_illuminants[priority[i]][illuminant_name.toUpperCase()]; if (illuminant) return jsapi.math.color.get_standard_illuminant.cache[cachehash] = [illuminant["X"] * scale, 1.0 * scale, illuminant["Z"] * scale]; } throw 'Unrecognized illuminant "' + illuminant_name + '"'; }; jsapi.math.color.get_standard_illuminant.cache = {}; jsapi.math.color.get_whitepoint = function (whitepoint, scale) { // Return a whitepoint as XYZ coordinates if (whitepoint && whitepoint.constructor == Array) return whitepoint; if (!scale) scale = 1.0; if (!whitepoint) whitepoint = "D50"; var cachehash = [whitepoint, scale].join(","), cache = jsapi.math.color.get_whitepoint.cache[cachehash]; if (cache) return cache; if (typeof whitepoint == "string") whitepoint = jsapi.math.color.get_standard_illuminant(whitepoint); else if (typeof whitepoint == "number") whitepoint = jsapi.math.color.CIEDCorColorTemp2XYZ(whitepoint); if (scale > 1.0 && whitepoint[1] == 100) scale = 1.0; if (whitepoint[1] * scale > 100) throw "Y value out of range after scaling: " + (whitepoint[1] * scale); return jsapi.math.color.get_whitepoint.cache[cachehash] = [whitepoint[0] * scale, whitepoint[1] * scale, whitepoint[2] * scale]; }; jsapi.math.color.get_whitepoint.cache = {}; jsapi.math.Matrix3x3 = function (matrix) { if (matrix.length != 3) throw 'Invalid number of rows for 3x3 matrix: ' + matrix.length; for (var i=0; i 0) str += ', '; str += '[' + this[i].join(', ') + ']'; }; return str + ']'; } }; DisplayCAL-3.1.0.0/DisplayCAL/report/print.css0000644000076500000000000000077212647526510020616 0ustar devwheel00000000000000#F_data, .options, .functions { display: none; } body { background: white; font-size: .75em; padding: 1em; } h1 { background: #333333; border-radius: 1.1em; -moz-border-radius: 1.1em; -webkit-border-radius: 1.1em; color: white; display: block; font-size: 1em; font-weight: normal; margin: 0 auto .5em; padding: .5em .9em; width: 19em; } h2 { font-weight: lighter; font-size: 2em; } p { line-height: 1.5em; } .graph th, .graph tr.x td { background: #fff; } .collapsed { display: none; } DisplayCAL-3.1.0.0/DisplayCAL/report/report.html0000644000076500000000000001167212647526510021152 0ustar devwheel00000000000000 Measurement Report ${REPORT_VERSION} — ${DISPLAY} — ${DATETIME}

Measurement Report ${REPORT_VERSION}

${DISPLAY} — ${DATETIME}





DisplayCAL-3.1.0.0/DisplayCAL/report/uniformity.functions.js0000644000076500000000000001741012647526510023517 0ustar devwheel00000000000000// Number methods p=Number.prototype; p.accuracy = function(ln) { var n = Math.pow(10, ln || 0); return Math.round(this * n) / n }; p.fill=function(ipart, fpart) { var i, v=(fpart!=null?this.toFixed(fpart):this+""); if ((i = v.indexOf(".")) > -1) ipart+=v.substr(i).length; while (v.length Ymax) Ymax = results[i][j]['XYZ'][1]; } } var scale = 100 / Ymax; for (var i = 0; i < rows * cols; i ++) { for (var j = 0; j < results[i].length; j ++) { var XYZ = results[i][j]['XYZ'], XYZ_scaled = [scale * XYZ[0], scale * XYZ[1], scale * XYZ[2]]; results[i][j]['XYZ_scaled'] = XYZ_scaled; results[i][j]['Lab'] = jsapi.math.color.XYZ2Lab(XYZ[0], XYZ[1], XYZ[2]); results[i][j]['Lab_scaled'] = jsapi.math.color.XYZ2Lab(XYZ_scaled[0], XYZ_scaled[1], XYZ_scaled[2]); results[i][j]['CCT'] = jsapi.math.color.XYZ2CorColorTemp(XYZ[0], XYZ[1], XYZ[2]); } } for (var i = 0; i < rows * cols; i ++) { var cellcontent = [], Y_diff = [], Y_diff_percent = [], rgb, deltas = [], CCT = [], CCT_diff = [], CCT_diff_percent = [], CT = [], CT_diff = [], CT_diff_percent = []; for (var j = 0; j < results[i].length; j ++) { var line = '' + (100 - j * 25) + '% RGB: ' + results[i][j]['XYZ'][1].accuracy(2) + ' cd/m²', rLab = reference[j]['Lab_scaled'], Lab = results[i][j]['Lab_scaled']; CCT.push(results[i][j]['CCT']); CT.push(results[i][j]['C' + locus.substr(0, 1) + 'T']); if (results[i] == reference) { line += ' (' + (reference[j]['XYZ'][1] / reference[0]['XYZ'][1] * 100).accuracy(2) + '%)' + /*', D50 L*a*b* = ' + results[i][j]['Lab_scaled'][0].accuracy(2) + ' ' + results[i][j]['Lab_scaled'][1].accuracy(2) + ' ' + results[i][j]['Lab_scaled'][2].accuracy(2) +*/ '\n
CCT ' + Math.round(CCT[j]) + 'K, C' + locus.substr(0, 1) + 'T ' + Math.round(CT[j]) + 'K'; } else { var curdelta = jsapi.math.color.delta(rLab[0], rLab[1], rLab[2], Lab[0], Lab[1], Lab[2], "2k"), color = 'inherit', mark = '', Y_color = color, Y_mark = mark; deltas.push(curdelta[delta]); CCT_diff.push(-(reference[j]['CCT'] - results[i][j]['CCT'])); CCT_diff_percent.push(100.0 / reference[j]['CCT'] * CCT_diff[j]); CT_diff.push(-(reference[j]['C' + locus.substr(0, 1) + 'T'] - CT[j])); CT_diff_percent.push(100.0 / reference[j]['C' + locus.substr(0, 1) + 'T'] * CT_diff[j]); Y_diff.push(-(reference[j]['XYZ'][1] - results[i][j]['XYZ'][1])); Y_diff_percent.push(100.0 / reference[0]['XYZ'][1] * Y_diff[j]); if (Math.abs(Y_diff_percent[j]) < 5) { Y_color = 'green'; Y_mark = ' \u2713\u2713'; } else if (Math.abs(Y_diff_percent[j]) < 10) { Y_color = 'green'; Y_mark = ' \u2713'; } else { Y_color = 'red'; Y_mark = ' \u2716'; } if (delta == 'E') { if (Math.abs(deltas[j]) <= 2) { color = 'green'; mark = ' \u2713\u2713'; } else if (Math.abs(deltas[j]) <= 4) { color = 'green'; mark = ' \u2713'; } else { color = 'red'; mark = ' \u2716'; } } line += ' (' + (Y_diff_percent[j] > 0 ? '+' : '') + Y_diff_percent[j].accuracy(2) + '%' + Y_mark + '), ' + deltas[j].accuracy(2) + ' Δ' + delta + '*00' + mark + '
\nCCT ' + Math.round(CCT[j]) + 'K (' + (CCT_diff_percent[j] > 0 ? '+' : '') + CCT_diff_percent[j].accuracy(2) + '%), C' + locus.substr(0, 1) + 'T ' + Math.round(CT[j]) + 'K (' + (CT_diff_percent[j] > 0 ? '+' : '') + CT_diff_percent[j].accuracy(2) + '%)'; } if (j == selected_index) { rgb = jsapi.math.color.Lab2RGB(Lab[0], Lab[1] - rLab[1], Lab[2] - rLab[2], 'D50', 255, true); if (results[i] == reference && rgb[0] < 128 && rgb[1] < 128 && rgb[2] < 128) document.getElementsByTagName('body')[0].style.color = '#fff'; else document.getElementsByTagName('body')[0].style.color = '#000'; } cellcontent.push(line); } cellcontent.push(''); cellcontent.push('Average:'); if (results[i] == reference) { line = 'CCT ' + Math.round(jsapi.math.avg(CCT)) + 'K, C' + locus.substr(0, 1) + 'T ' + Math.round(jsapi.math.avg(CT)) + 'K'; } else { var delta_avg = jsapi.math.avg(deltas), Y_diff_percent_avg = jsapi.math.avg(Y_diff_percent), color = 'inherit', mark = '', Y_color = color, Y_mark = mark; if (Math.abs(Y_diff_percent_avg) < 5) { Y_color = 'green'; Y_mark = ' \u2713\u2713'; } else if (Math.abs(Y_diff_percent_avg) < 10) { Y_color = 'green'; Y_mark = ' \u2713'; } else { Y_color = 'red'; Y_mark = ' \u2716'; } if (delta == 'E') { if (Math.abs(delta_avg) <= 2) { color = 'green'; mark = ' \u2713\u2713'; } else if (Math.abs(delta_avg) <= 4) { color = 'green'; mark = ' \u2713'; } else { color = 'red'; mark = ' \u2716'; } } line = (Y_diff_percent_avg > 0 ? '+' : '') + jsapi.math.avg(Y_diff).accuracy(2) + ' cd/m² (' + (Y_diff_percent_avg > 0 ? '+' : '') + Y_diff_percent_avg.accuracy(2) + '%' + Y_mark + '), ' + delta_avg.accuracy(2) + ' Δ' + delta + '*00' + mark + '
\nCCT ' + Math.round(jsapi.math.avg(CCT)) + 'K (' + (jsapi.math.avg(CCT_diff_percent) > 0 ? '+' : '') + jsapi.math.avg(CCT_diff_percent).accuracy(2) + '%), C' + locus.substr(0, 1) + 'T ' + Math.round(jsapi.math.avg(CT)) + 'K (' + (jsapi.math.avg(CT_diff_percent) > 0 ? '+' : '') + jsapi.math.avg(CT_diff_percent).accuracy(2) + '%)'; } cellcontent.push(line); cells.push('' + cellcontent.join('
\n') + ''); if ((i + 1) % self.cols == 0 && i + 1 < self.rows * self.cols) { cells[cells.length - 1] += '\n'; } } document.getElementsByTagName('body')[0].innerHTML = '' + cells.join('') + '
'; }; window.onload = generate_report; DisplayCAL-3.1.0.0/DisplayCAL/report/uniformity.html0000644000076500000000000000252612647526510022042 0ustar devwheel00000000000000 Uniformity Check ${REPORT_VERSION} — ${DISPLAY} — ${DATETIME}
DisplayCAL-3.1.0.0/DisplayCAL/report.py0000644000076500000000000001451112647526531017321 0ustar devwheel00000000000000# -*- coding: utf-8 -*- from time import strftime import codecs import os import re import shutil import sys from config import get_data_path, initcfg from meta import version from safe_print import safe_print import jspacker import localization as lang def create(report_path, placeholders2data, pack=True, templatename="report"): """ Create a report with all placeholders substituted by data. """ # read report template templatefilename = "%s.html" % templatename report_html_template_path = get_data_path(os.path.join("report", templatefilename)) if not report_html_template_path: raise IOError(lang.getstr("file.missing", templatefilename)) try: report_html_template = codecs.open(report_html_template_path, "r", "UTF-8") except (IOError, OSError), exception: raise exception.__class__(lang.getstr("error.file.open", report_html_template_path)) report_html = report_html_template.read() report_html_template.close() # create report for placeholder, data in placeholders2data.iteritems(): report_html = report_html.replace(placeholder, data) for include in ("base.css", "compare.css", "print.css", "jsapi-packages.js", "jsapi-patches.js", "compare.constants.js", "compare.variables.js", "compare.functions.js", "compare.init.js", "uniformity.functions.js"): path = get_data_path(os.path.join("report", include)) if not path: raise IOError(lang.getstr("file.missing", include)) try: f = codecs.open(path, "r", "UTF-8") except (IOError, OSError), exception: raise exception.__class__(lang.getstr("error.file.open", path)) if include.endswith(".js"): js = f.read() if pack: packer = jspacker.JavaScriptPacker() js = packer.pack(js, 62, True).strip() report_html = report_html.replace('src="%s">' % include, ">/**/") else: report_html = report_html.replace('@import "%s";' % include, f.read().strip()) f.close() # write report try: report_html_file = codecs.open(report_path, "w", "UTF-8") except (IOError, OSError), exception: raise exception.__class__(lang.getstr("error.file.create", report_path)) report_html_file.write(report_html) report_html_file.close() def update(report_path, pack=True): """ Update existing report with current template files. Also creates a backup copy of the old report. """ # read original report try: orig_report = codecs.open(report_path, "r", "UTF-8") except (IOError, OSError), exception: raise exception.__class__(lang.getstr("error.file.open", report_path)) orig_report_html = orig_report.read() orig_report.close() data = (("${PLANCKIAN}", 'id="FF_planckian"\s*(.*?)\s*disabled="disabled"', 0), ("${DISPLAY}", '"FF_display"\s*value="(.+?)"\s\/>', 0), ("${INSTRUMENT}", '"FF_instrument"\s*value="(.+?)"\s\/>', 0), ("${CORRECTION_MATRIX}", '"FF_correction_matrix"\s*value="(.+?)"\s\/>', 0), ("${BLACKPOINT}", '"FF_blackpoint"\s*value="(.+?)"\s\/>', 0), ("${WHITEPOINT}", '"FF_whitepoint"\s*value="(.+?)"\s\/>', 0), ("${WHITEPOINT_NORMALIZED}", '"FF_whitepoint_normalized"\s*value="(.+?)"\s\/>', 0), ("${PROFILE}", '"FF_profile"\s*value="(.+?)"\s\/>', 0), ("${PROFILE_WHITEPOINT}", '"FF_profile_whitepoint"\s*value="(.+?)"\s\/>', 0), ("${PROFILE_WHITEPOINT_NORMALIZED}", '"FF_profile_whitepoint_normalized"\s*value="(.+?)"\s\/>', 0), ("${SIMULATION_PROFILE}", 'SIMULATION_PROFILE\s*=\s*"(.+?)"[;,]', 0), ("${TRC_GAMMA}", 'BT_1886_GAMMA\s*=\s*(.+?)[;,]', 0), ("${TRC_GAMMA}", 'TRC_GAMMA\s*=\s*(.+?)[;,]', 0), ("${TRC_GAMMA_TYPE}", 'BT_1886_GAMMA_TYPE\s*=\s*"(.+?)"[;,]', 0), ("${TRC_GAMMA_TYPE}", 'TRC_GAMMA_TYPE\s*=\s*"(.+?)"[;,]', 0), ("${TRC_OUTPUT_OFFSET}", 'TRC_OUTPUT_OFFSET\s*=\s*(.+?)[;,]', 0), ("${TRC}", 'TRC\s*=\s*"(.+?)"[;,]', 0), ("${WHITEPOINT_SIMULATION}", 'WHITEPOINT_SIMULATION\s*=\s*(.+?)[;,]', 0), ("${WHITEPOINT_SIMULATION_RELATIVE}", 'WHITEPOINT_SIMULATION_RELATIVE\s*=\s*(.+?)[;,]', 0), ("${DEVICELINK_PROFILE}", 'DEVICELINK_PROFILE\s*=\s*"(.+?)"[;,]', 0), ("${TESTCHART}", '"FF_testchart"\s*value="(.+?)"\s\/>', 0), ("${ADAPTION}", '"FF_adaption"\s*value="(.+?)"\s\/>', 0), ("${DATETIME}", '"FF_datetime"\s*value="(.+?)"\s\/>', 0), ("${REF}", '"FF_data_ref"\s*value="(.+?)"\s\/>', re.DOTALL), ("${MEASURED}", '"FF_data_in"\s*value="(.+?)"\s\/>', re.DOTALL), ("${CAL_ENTRYCOUNT}", "CAL_ENTRYCOUNT\s*=\s*(.+?)[;,]$", re.M), ("${CAL_RGBLEVELS}", "CAL_RGBLEVELS\s*=\s*(.+?)[;,]$", re.M), ("${GRAYSCALE}", "CRITERIA_GRAYSCALE\s*=\s*(.+?)[;,]$", re.M), # Uniformity report ("${DISPLAY}", u"\u2014 (.+?) \u2014", 0), ("${DATETIME}", u"\u2014 .+? \u2014 (.+?)", 0), ("${ROWS}", 'rows\s*=\s*(.+?)[;,]', 0), ("${COLS}", 'cols\s*=\s*(.+?)[;,]', 0), ("${RESULTS}", 'results\s*=\s*(.+?), locus = ', 0), ("${LOCUS}", "locus\s*=\s*'([^']+)'", 0)) placeholders2data = {"${REPORT_VERSION}": version, "${CORRECTION_MATRIX}": "Unknown", "${ADAPTION}": "None", "${CAL_ENTRYCOUNT}": "null", "${CAL_RGBLEVELS}": "null", "${GRAYSCALE}": "null", "${BLACKPOINT}": "-1 -1 -1", "${TRC_GAMMA}": "null", "${TRC_OUTPUT_OFFSET}": "0", "${WHITEPOINT_SIMULATION}": "false", "${WHITEPOINT_SIMULATION_RELATIVE}": "false"} templatename = "report" for placeholder, pattern, flags in data: result = re.search(pattern, orig_report_html, flags) if result or not placeholders2data.get(placeholder): if (placeholder == "${TRC}" and not result and "${TRC_GAMMA}" in placeholders2data): default = "BT.1886" else: default = "" placeholders2data[placeholder] = result.groups()[0] if result else default if result and placeholder == "${COLS}": templatename = "uniformity" # backup original report shutil.copy2(report_path, "%s.%s" % (report_path, strftime("%Y-%m-%d_%H-%M-%S"))) create(report_path, placeholders2data, pack, templatename) if __name__ == "__main__": initcfg() lang.init() if not sys.argv[1:]: safe_print("Update existing report(s) with current template files.") safe_print("Usage: %s report1.html [report2.html...]" % os.path.basename(sys.argv[0])) else: for arg in sys.argv[1:]: try: update(arg) except (IOError, OSError), exception: safe_print(exception) DisplayCAL-3.1.0.0/DisplayCAL/safe_print.py0000644000076500000000000000552112653526636020144 0ustar devwheel00000000000000# -*- coding: utf-8 -*- import locale import os import sys from encoding import get_encoding, get_encodings from util_str import safe_unicode original_codepage = None enc, fs_enc = get_encodings() class SafePrinter(): def __init__(self, pad=False, padchar=" ", sep=" ", end="\n", file_=sys.stdout, fn=None, encoding=None): """ Write safely, avoiding any UnicodeDe-/EncodingErrors on strings and converting all other objects to safe string representations. sprint = SafePrinter(pad=False, padchar=' ', sep=' ', end='\\n', file=sys.stdout, fn=None) sprint(value, ..., pad=False, padchar=' ', sep=' ', end='\\n', file=sys.stdout, fn=None) Writes the values to a stream (default sys.stdout), honoring its encoding and replacing characters not present in the encoding with question marks silently. Optional keyword arguments: pad: pad the lines to n chars, or os.getenv('COLUMNS') if True. padchar: character to use for padding, default a space. sep: string inserted between values, default a space. end: string appended after the last value, default a newline. file: a file-like object (stream); defaults to the sys.stdout. fn: a function to execute instead of printing. """ self.pad = pad self.padchar = padchar self.sep = sep self.end = end self.file = file_ self.fn = fn self.encoding = encoding or (get_encoding(file_) if file_ else None) def __call__(self, *args, **kwargs): self.write(*args, **kwargs) def flush(self): self.file and self.file.flush() def write(self, *args, **kwargs): pad = kwargs.get("pad", self.pad) padchar = kwargs.get("padchar", self.padchar) sep = kwargs.get("sep", self.sep) end = kwargs.get("end", self.end) file_ = kwargs.get("file_", self.file) fn = kwargs.get("fn", self.fn) encoding = kwargs.get("encoding", self.encoding) strargs = [] for arg in args: if not isinstance(arg, basestring): arg = safe_unicode(arg) if isinstance(arg, unicode) and encoding: arg = arg.encode(encoding, "replace") strargs.append(arg) line = sep.join(strargs).rstrip(end) try: conwidth = int(os.getenv("COLUMNS")) except (TypeError, ValueError): conwidth = 80 if pad is not False: if pad is True: width = conwidth else: width = int(pad) line = line.ljust(width, padchar) if fn: fn(line) else: file_.write(line) if end and (sys.platform != "win32" or len(line) != conwidth or not (hasattr(file_, "isatty") and file_.isatty()) or end != "\n"): # On Windows, if a line is exactly the width of the buffer, a line # break would insert an empty line between this line and the next. # To avoid this, skip the newline in that case. file_.write(end) safe_print = SafePrinter() if __name__ == '__main__': for arg in sys.argv[1:]: safe_print(arg.decode(fs_enc)) DisplayCAL-3.1.0.0/DisplayCAL/setup.py0000644000076500000000000012272712647526531017157 0ustar devwheel00000000000000# -*- coding: utf-8 -*- """ DisplayCAL setup.py script Can be used with setuptools or pure distutils (the latter can be forced with the --use-distutils option, otherwise it will try to use setuptools by default). Also supported in addition to standard distutils/setuptools commands, are the bdist_bbfreeze, py2app and py2exe commands (if the appropriate packages are installed), which makes this file your all-around building/ bundling powerhouse for DisplayCAL. In the case of py2exe, special care is taken of Python 2.6+ and the Microsoft.VC90.CRT assembly dependency, so if building an executable on Windows with Python 2.6+ you should preferably use py2exe. Please note that bdist_bbfreeze and py2app *require* setuptools. IMPORTANT NOTE: If called from within the installed package, should only be used to uninstall (setup.py uninstall --record=INSTALLED_FILES), otherwise use the wrapper script in the root directory of the source tar.gz/zip """ from __future__ import with_statement from ConfigParser import ConfigParser from distutils.command.install import install from distutils.util import change_root, get_platform from fnmatch import fnmatch import codecs import ctypes.util import distutils.core import glob import os import platform import re import shutil import subprocess as sp import sys from time import strftime from types import StringType # Borrowed from setuptools def findall(dir=os.curdir): """Find all files under 'dir' and return the list of full filenames (relative to 'dir'). """ all_files = [] for base, dirs, files in os.walk(dir, followlinks=True): if base == os.curdir or base.startswith(os.curdir + os.sep): base = base[2:] if base: files = [os.path.join(base, f) for f in files] all_files.extend(filter(os.path.isfile, files)) return all_files import distutils.filelist distutils.filelist.findall = findall # Fix findall bug in distutils from defaultpaths import autostart, autostart_home from meta import (author, author_ascii, description, longdesc, domain, name, py_maxversion, py_minversion, version, version_tuple, wx_minversion, author_email, script2pywname) from util_os import relpath appname = name bits = platform.architecture()[0][:2] pypath = os.path.abspath(__file__) pydir = os.path.dirname(pypath) basedir = os.path.dirname(pydir) config = {"data": ["tests/*.icc"], "doc": ["LICENSE.txt", "README.html", "screenshots/*.png", "theme/*.png", "theme/*.css", "theme/*.js", "theme/icons/favicon.ico", "theme/slimbox2/*.css", "theme/slimbox2/*.js"], # Excludes for .app/.exe builds # numpy.lib.utils imports pydoc, which imports Tkinter, but # numpy.lib.utils is not even used by DisplayCAL, so omit all # Tk stuff # Use pyglet with OpenAL as audio backend. We only need # pyglet, pyglet.app and pyglet.media "excludes": {"all": ["Tkconstants", "Tkinter", "pygame", "pyglet.canvas", "pyglet.extlibs", "pyglet.font", "pyglet.gl", "pyglet.graphics", "pyglet.image", "pyglet.input", "pyglet.text", "pyglet.window", "pyo", "setuptools", "tcl", "test"], "darwin": [], "win32": ["win32com.client.genpy"]}, "package_data": {name: ["argyll_instruments.json", "beep.wav", "camera_shutter.wav", "ColorLookupTable.fx", "lang/*.json", "linear.cal", "pnp.ids", "presets/*.icc", "quirk.json", "ref/*.cie", "ref/*.gam", "ref/*.icm", "ref/*.ti1", "report/*.css", "report/*.html", "report/*.js", "technology_strings-1.7.0.json", "technology_strings-1.7.1.json", "test.cal", "theme/*.png", "theme/*.wav", "theme/icons/10x10/*.png", "theme/icons/16x16/*.png", "theme/icons/32x32/*.png", "theme/icons/72x72/*.png", "theme/jet_anim/*.png", "theme/patch_anim/*.png", "theme/splash_anim/*.png", "theme/shutter_anim/*.png", "ti1/*.ti1", "x3d-viewer/*.css", "x3d-viewer/*.html", "x3d-viewer/*.js", "xrc/*.xrc"]}, "xtra_package_data": {name: {"win32": ["theme/icons/%s-uninstall.ico" % name]}}} def add_lib_excludes(key, excludebits): for exclude in excludebits: config["excludes"][key].extend([name + ".lib" + exclude, "lib" + exclude]) for exclude in ("32", "64"): for pycompat in ("26", "27"): if (key == "win32" and (pycompat == sys.version[0] + sys.version[2] or exclude == excludebits[0])): continue config["excludes"][key].extend([name + ".lib%s.python%s" % (exclude, pycompat), name + ".lib%s.python%s.RealDisplaySizeMM" % (exclude, pycompat)]) add_lib_excludes("darwin", ["64" if bits == "32" else "32"]) add_lib_excludes("win32", ["64" if bits == "32" else "32"]) msiversion = ".".join((str(version_tuple[0]), str(version_tuple[1]), str(version_tuple[2]) + str(version_tuple[3]))) plist_dict = {"CFBundleDevelopmentRegion": "English", "CFBundleExecutable": name, "CFBundleGetInfoString": version, "CFBundleIdentifier": ".".join(reversed(domain.split("."))), "CFBundleInfoDictionaryVersion": "6.0", "CFBundleLongVersionString": version, "CFBundleName": name, "CFBundlePackageType": "APPL", "CFBundleShortVersionString": version, "CFBundleSignature": "????", "CFBundleVersion": ".".join(map(str, version_tuple)), "NSHumanReadableCopyright": u"© %s %s" % (strftime("%Y"), author), "LSMinimumSystemVersion": "10.5.0"} class Target: def __init__(self, **kwargs): self.__dict__.update(kwargs) def create_app_symlinks(dist_dir, scripts): maincontents_rel = os.path.join(name + ".app", "Contents") # Create ref, tests, ReadMe and license symlinks in directory # containing the app bundle for src, tgt in [("ref", "Reference"), ("tests", "Tests"), ("README.html", "README.html"), ("LICENSE.txt", "LICENSE.txt")]: tgt = os.path.join(dist_dir, tgt) if os.path.islink(tgt): os.unlink(tgt) os.symlink(os.path.join(maincontents_rel, "Resources", src), tgt) # Create standalone tools app bundles by symlinking to the main bundle scripts = [(script2pywname(script), desc) for script, desc in scripts] toolscripts = filter(lambda script: script != name, [script for script, desc in scripts]) for script, desc in scripts: if script in (name, name + "-apply-profiles"): continue toolname = desc.replace(name, "").strip() toolapp = os.path.join(dist_dir, toolname + ".app") if os.path.isdir(toolapp): if raw_input('WARNING: The output directory "%s" and ALL ITS ' 'CONTENTS will be REMOVED! Continue? (y/n)' % toolapp).lower() == 'y': print "Removing dir", toolapp shutil.rmtree(toolapp) else: raise SystemExit('User aborted') toolscript = os.path.join(dist_dir, maincontents_rel, 'MacOS', script) has_tool_script = os.path.exists(toolscript) if not has_tool_script: # Don't symlink, apps won't be able to run in parallel! shutil.copy(os.path.join(dist_dir, maincontents_rel, 'MacOS', appname), toolscript) toolcontents = os.path.join(toolapp, "Contents") os.makedirs(toolcontents) subdirs = ["Frameworks", "Resources"] if has_tool_script: # PyInstaller subdirs.append("MacOS") for entry in os.listdir(os.path.join(dist_dir, maincontents_rel)): if entry in subdirs: os.makedirs(os.path.join(toolcontents, entry)) for subentry in os.listdir(os.path.join(dist_dir, maincontents_rel, entry)): src = os.path.join(dist_dir, maincontents_rel, entry, subentry) tgt = os.path.join(toolcontents, entry, subentry) if subentry == "main.py": # py2app with open(src, "rb") as main_in: py = main_in.read() py = py.replace("main()", "main(%r)" % script[len(name) + 1:]) with open(tgt, "wb") as main_out: main_out.write(py) continue if subentry == name + ".icns": shutil.copy(os.path.join(pydir, "theme", "icons", "%s.icns" % script), os.path.join(toolcontents, entry, "%s.icns" % script)) continue if subentry == script: # PyInstaller os.rename(src, tgt) elif subentry not in toolscripts: os.symlink(os.path.join("..", "..", "..", maincontents_rel, entry, subentry), tgt) elif entry == "Info.plist": with codecs.open(os.path.join(dist_dir, maincontents_rel, entry), "r", "UTF-8") as info_in: infoxml = info_in.read() # CFBundleName / CFBundleDisplayName infoxml = re.sub("(Name\s*)%s" % name, lambda match: match.group(1) + toolname, infoxml) # CFBundleIdentifier infoxml = infoxml.replace(".%s" % name, ".%s" % script) # CFBundleIconFile infoxml = infoxml.replace("%s.icns" % name, "%s.icns" % script) # CFBundleExecutable infoxml = re.sub("(Executable\s*)%s" % name, lambda match: match.group(1) + script, infoxml) with codecs.open(os.path.join(toolcontents, entry), "w", "UTF-8") as info_out: info_out.write(infoxml) else: os.symlink(os.path.join("..", "..", maincontents_rel, entry), os.path.join(toolcontents, entry)) def get_data(tgt_dir, key, pkgname=None, subkey=None, excludes=None): """ Return configured data files """ files = config[key] src_dir = basedir if pkgname: files = files[pkgname] src_dir = os.path.join(src_dir, pkgname) if subkey: if subkey in files: files = files[subkey] else: files = [] data = [] for pth in files: if not filter(lambda exclude: fnmatch(pth, exclude), excludes or []): data.append((os.path.normpath(os.path.join(tgt_dir, os.path.dirname(pth))), glob.glob(os.path.join(src_dir, pth)))) return data def get_scripts(excludes=None): # It is required that each script has an accompanying .desktop file scripts = [] desktopfiles = glob.glob(os.path.join(pydir, "..", "misc", appname.lower() + "*.desktop")) def sortbyname(a, b): a, b = [os.path.splitext(v)[0] for v in (a, b)] if a > b: return 1 elif a < b: return -1 else: return 0 desktopfiles.sort(sortbyname) for desktopfile in desktopfiles: if desktopfile.startswith("z-"): continue cfg = ConfigParser() cfg.read(desktopfile) script = cfg.get("Desktop Entry", "Exec").split()[0] if not filter(lambda exclude: fnmatch(script, exclude), excludes or []): scripts.append((script, cfg.get("Desktop Entry", "Name").decode("UTF-8"))) return scripts def setup(): print "***", os.path.abspath(sys.argv[0]), " ".join(sys.argv[1:]) bdist_bbfreeze = "bdist_bbfreeze" in sys.argv[1:] bdist_dumb = "bdist_dumb" in sys.argv[1:] bdist_win = "bdist_msi" in sys.argv[1:] or "bdist_wininst" in sys.argv[1:] debug = 0 do_full_install = False do_install = False do_py2app = "py2app" in sys.argv[1:] do_py2exe = "py2exe" in sys.argv[1:] do_uninstall = "uninstall" in sys.argv[1:] doc_layout = "deb" if os.path.exists("/etc/debian_version") else "" dry_run = "-n" in sys.argv[1:] or "--dry-run" in sys.argv[1:] help = False install_data = None # data files install path (only if given) is_rpm_build = "bdist_rpm" in sys.argv[1:] or os.path.abspath(sys.argv[0]).endswith( os.path.join(os.path.sep, "rpm", "BUILD", name + "-" + version, os.path.basename(os.path.abspath(sys.argv[0])))) prefix = "" recordfile_name = None # record installed files to this file sdist = "sdist" in sys.argv[1:] setuptools = None skip_instrument_conf_files = "--skip-instrument-configuration-files" in \ sys.argv[1:] skip_postinstall = "--skip-postinstall" in sys.argv[1:] use_distutils = not bdist_bbfreeze and not do_py2app use_setuptools = not use_distutils or "--use-setuptools" in \ sys.argv[1:] or (os.path.exists("use-setuptools") and not "--use-distutils" in sys.argv[1:]) sys.path.insert(1, os.path.join(os.path.dirname(pydir), "util")) if use_setuptools: if "--use-setuptools" in sys.argv[1:] and not \ os.path.exists("use-setuptools"): open("use-setuptools", "w").close() try: from ez_setup import use_setuptools as ez_use_setuptools ez_use_setuptools() except ImportError: pass try: from setuptools import setup, Extension setuptools = True print "using setuptools" except ImportError: pass else: if os.path.exists("use-setuptools"): os.remove("use-setuptools") if not setuptools: from distutils.core import setup, Extension print "using distutils" if do_py2exe: import py2exe # ModuleFinder can't handle runtime changes to __path__, but win32com # uses them try: # if this doesn't work, try import modulefinder import py2exe.mf as modulefinder import win32com for p in win32com.__path__[1:]: modulefinder.AddPackagePath("win32com", p) for extra in ["win32com.shell"]: __import__(extra) m = sys.modules[extra] for p in m.__path__[1:]: modulefinder.AddPackagePath(extra, p) except ImportError: # no build path setup, no worries. pass if do_py2exe: origIsSystemDLL = py2exe.build_exe.isSystemDLL systemroot = os.getenv("SystemRoot").lower() def isSystemDLL(pathname): if (os.path.basename(pathname).lower() in ("gdiplus.dll", "mfc90.dll") or os.path.basename(pathname).lower().startswith("python") or os.path.basename(pathname).lower().startswith("pywintypes")): return 0 return pathname.lower().startswith(systemroot + "\\") py2exe.build_exe.isSystemDLL = isSystemDLL if do_uninstall: i = sys.argv.index("uninstall") sys.argv = sys.argv[:i] + ["install"] + sys.argv[i + 1:] install.create_home_path = lambda self: None if skip_instrument_conf_files: i = sys.argv.index("--skip-instrument-configuration-files") sys.argv = sys.argv[:i] + sys.argv[i + 1:] if skip_postinstall: i = sys.argv.index("--skip-postinstall") sys.argv = sys.argv[:i] + sys.argv[i + 1:] if "--use-distutils" in sys.argv[1:]: i = sys.argv.index("--use-distutils") sys.argv = sys.argv[:i] + sys.argv[i + 1:] if "--use-setuptools" in sys.argv[1:]: i = sys.argv.index("--use-setuptools") sys.argv = sys.argv[:i] + sys.argv[i + 1:] argv = list(sys.argv[1:]) for i, arg in enumerate(reversed(argv)): n = len(sys.argv) - i - 1 if arg in ("install", "install_lib", "install_headers", "install_scripts", "install_data"): if arg == "install": do_full_install = True do_install = True elif arg == "-d" and len(sys.argv[1:]) > i: dist_dir = sys.argv[i + 2] else: arg = arg.split("=") if arg[0] == "--debug": debug = 1 if len(arg) == 1 else int(arg[1]) sys.argv = sys.argv[:n] + sys.argv[n + 1:] elif len(arg) == 2: if arg[0] == "--dist-dir": dist_dir = arg[1] elif arg[0] == "--doc-layout": doc_layout = arg[1] sys.argv = sys.argv[:n] + sys.argv[n + 1:] elif arg[0] == "--install-data": install_data = arg[1] elif arg[0] == "--prefix": prefix = arg[1] elif arg[0] == "--record": recordfile_name = arg[1] elif arg[0] == "-h" or arg[0].startswith("--help"): help = True if not recordfile_name and (do_full_install or do_uninstall): recordfile_name = "INSTALLED_FILES" # if not do_uninstall: # sys.argv.append("--record=" + "INSTALLED_FILES") if sys.platform in ("darwin", "win32") or "bdist_egg" in sys.argv[1:]: doc = data = "." if do_py2app or do_py2exe or bdist_bbfreeze else name else: # Linux/Unix data = name if doc_layout.startswith("deb"): doc = os.path.join("doc", name.lower()) elif "suse" in doc_layout: doc = os.path.join("doc", "packages", name) else: doc = os.path.join("doc", name + "-" + version) if not install_data: data = os.path.join("share", data) doc = os.path.join("share", doc) if is_rpm_build: doc = os.path.join(os.path.sep, "usr", doc) # on Mac OS X and Windows, we want data files in the package dir # (package_data will be ignored when using py2exe) package_data = { name: config["package_data"][name] if sys.platform in ("darwin", "win32") and not do_py2app and not do_py2exe else [] } if sdist and sys.platform in ("darwin", "win32"): package_data[name].extend(["theme/icons/22x22/*.png", "theme/icons/24x24/*.png", "theme/icons/48x48/*.png", "theme/icons/128x128/*.png", "theme/icons/256x256/*.png"]) if sys.platform == "win32" and not do_py2exe: package_data[name].append("theme/icons/*.ico") # Scripts if sys.platform == 'darwin': scripts = get_scripts(excludes=[appname.lower() + '-apply-profiles']) else: scripts = get_scripts() # Doc files data_files = [] if not is_rpm_build or doc_layout.startswith("deb"): data_files += get_data(doc, "doc", excludes=["LICENSE.txt"]) if data_files: if doc_layout.startswith("deb"): data_files.append((doc, [os.path.join(pydir, "..", "dist", "copyright")])) data_files.append((os.path.join(os.path.dirname(data), "doc-base"), [os.path.join(pydir, "..", "misc", appname.lower() + "-readme")])) else: data_files.append((doc, [os.path.join(pydir, "..", "LICENSE.txt")])) if sys.platform not in ("darwin", "win32") or do_py2app or do_py2exe: # Linux/Unix or py2app/py2exe data_files += get_data(data, "package_data", name, excludes=["theme/icons/*"]) data_files += get_data(data, "data") data_files += get_data(data, "xtra_package_data", name, sys.platform) if sys.platform == "win32": data_files.extend([(os.path.join(data, "lib"), [sys.executable])]) # OpenAL DLLs for pyglet openal32 = ctypes.util.find_library("OpenAL32.dll") wrap_oal = ctypes.util.find_library("wrap_oal.dll") if openal32: oal = [openal32] if wrap_oal: oal.append(wrap_oal) else: print "WARNING: wrap_oal.dll not found!" data_files.append((data, oal)) else: print "WARNING: OpenAL32.dll not found!" elif sys.platform != "darwin": # Linux data_files.append((os.path.join(os.path.dirname(data), "appdata"), [os.path.join(pydir, "..", "dist", name + ".appdata.xml")])) data_files.append((os.path.join(os.path.dirname(data), "applications"), [os.path.join(pydir, "..", "misc", name.lower() + ".desktop")] + glob.glob(os.path.join(pydir, "..", "misc", name.lower() + "-*.desktop")))) data_files.append((autostart if os.geteuid() == 0 or prefix.startswith("/") else autostart_home, [os.path.join(pydir, "..", "misc", "z-%s-apply-profiles.desktop" % name.lower())])) data_files.append((os.path.join(os.path.dirname(data), "man", "man1"), glob.glob(os.path.join(pydir, "..", "man", "*.1")))) if not skip_instrument_conf_files: # device configuration / permission stuff if is_rpm_build: # RPM postinstall script will install these to the correct # locations. This allows us compatibility with Argyll # packages which may also contain same udev rules / hotplug # scripts, thus avoiding file conflicts data_files.append((os.path.join(data, "usb"), [os.path.join( pydir, "..", "misc", "45-Argyll.rules")])) data_files.append((os.path.join(data, "usb"), [os.path.join( pydir, "..", "misc", "55-Argyll.rules")])) data_files.append((os.path.join(data, "usb"), [os.path.join( pydir, "..", "misc", "Argyll")])) data_files.append((os.path.join(data, "usb"), [os.path.join( pydir, "..", "misc", "Argyll.usermap")])) else: devconf_files = [] if os.path.isdir("/etc/udev/rules.d"): if glob.glob("/dev/bus/usb/*/*"): # USB and serial instruments using udev, where udev # already creates /dev/bus/usb/00X/00X devices devconf_files.append( ("/etc/udev/rules.d", [os.path.join( pydir, "..", "misc", "55-Argyll.rules")])) else: # USB using udev, where there are NOT /dev/bus/usb/00X/00X # devices devconf_files.append( ("/etc/udev/rules.d", [os.path.join( pydir, "..", "misc", "45-Argyll.rules")])) else: if os.path.isdir("/etc/hotplug"): # USB using hotplug and Serial using udev # (older versions of Linux) devconf_files.append( ("/etc/hotplug/usb", [os.path.join(pydir, "..", "misc", fname) for fname in ["Argyll", "Argyll.usermap"]])) for entry in devconf_files: for fname in entry[1]: if os.path.isfile(fname): data_files.extend([(entry[0], [fname])]) for dname in ("10x10", "16x16", "22x22", "24x24", "32x32", "48x48", "72x72", "128x128", "256x256"): # Only the 10x10, 16x16, 32x32 and 72x72 icons are used exclusively # by the app, the other sizes of the app icon are used for the # desktop entry under Linux icons = [] desktopicons = [] for iconpath in glob.glob(os.path.join(pydir, "theme", "icons", dname, "*.png")): if not os.path.basename(iconpath).startswith(name.lower()) or ( sys.platform in ("darwin", "win32") and dname in ("16x16", "32x32")): icons.append(iconpath) elif sys.platform not in ("darwin", "win32"): desktopicons.append(iconpath) if icons: data_files.append((os.path.join(data, "theme", "icons", dname), icons)) if desktopicons: data_files.append((os.path.join(os.path.dirname(data), "icons", "hicolor", dname, "apps"), desktopicons)) sources = [os.path.join(name, "RealDisplaySizeMM.c")] if sys.platform == "win32": macros = [("NT", None)] libraries = ["user32", "gdi32"] link_args = None elif sys.platform == "darwin": macros = [("__APPLE__", None), ("UNIX", None)] libraries = None link_args = ["-framework Carbon", "-framework CoreFoundation", "-framework Python", "-framework IOKit"] if not help and ("build" in sys.argv[1:] or "build_ext" in sys.argv[1:] or (("install" in sys.argv[1:] or "install_lib" in sys.argv[1:]) and not "--skip-build" in sys.argv[1:])): p = sp.Popen([sys.executable, '-c', '''import os from distutils.core import setup, Extension setup(ext_modules=[Extension("%s.lib%s.RealDisplaySizeMM", sources=%r, define_macros=%r, extra_link_args=%r)])''' % (name, bits, sources, macros, link_args)] + sys.argv[1:], stdout = sp.PIPE, stderr = sp.STDOUT) lines = [] while True: o = p.stdout.readline() if o == '' and p.poll() != None: break if o[0:4] == 'gcc ': lines.append(o) print o.rstrip() if len(lines): os.environ['MACOSX_DEPLOYMENT_TARGET'] = '10.3' sp.call(lines[-1], shell = True) # fix the library else: macros = [("UNIX", None)] libraries = ["X11", "Xinerama", "Xrandr", "Xxf86vm"] link_args = None if sys.platform == "darwin": extname = "%s.lib%s.RealDisplaySizeMM" % (name, bits) else: extname = "%s.lib%s.python%s%s.RealDisplaySizeMM" % ((name, bits) + sys.version_info[:2]) RealDisplaySizeMM = Extension(extname, sources=sources, define_macros=macros, libraries=libraries, extra_link_args=link_args) ext_modules = [RealDisplaySizeMM] requires = [] if not setuptools or sys.platform != "win32": # wxPython windows installer doesn't add egg-info entry, so # a dependency check from pkg_resources would always fail requires.append( "wxPython (>= %s)" % ".".join(str(n) for n in wx_minversion)) if sys.platform == "win32": requires.append("pywin32 (>= 213.0)") packages = [name, "%s.lib" % name, "%s.lib.agw" % name] if sdist: # For source desributions we want all libraries for tmpbits in ("32", "64"): for pycompat in ("26", "27"): packages.extend(["%s.lib%s" % (name, tmpbits), "%s.lib%s.python%s" % (name, tmpbits, pycompat)]) elif sys.platform == "darwin": # On Mac OS X we only want the universal binaries packages.append("%s.lib%s" % (name, bits)) else: # On Linux/Windows we want separate libraries packages.extend(["%s.lib%s" % (name, bits), "%s.lib%s.python%s%s" % ((name, bits) + sys.version_info[:2])]) attrs = { "author": author_ascii, "author_email": author_email, "classifiers": [ "Development Status :: 5 - Production/Stable", "Environment :: MacOS X", "Environment :: Win32 (MS Windows)", "Environment :: X11 Applications", "Intended Audience :: End Users/Desktop", "License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)", "Operating System :: OS Independent", "Programming Language :: Python :: 2.6", "Programming Language :: Python :: 2.7", "Topic :: Multimedia :: Graphics", ], "data_files": data_files, "description": description, "download_url": "http://%(domain)s/" "%(name)s-%(version)s.tar.gz" % {"domain": domain, "name": name, "version": version}, "ext_modules": ext_modules, "license": "GPL v3", "long_description": longdesc, "name": name, "packages": packages, "package_data": package_data, "package_dir": { name: name }, "platforms": [ "Python >= %s <= %s" % (".".join(str(n) for n in py_minversion), ".".join(str(n) for n in py_maxversion)), "Linux/Unix with X11", "Mac OS X >= 10.4", "Windows 2000 and newer" ], "requires": requires, "provides": [name], "scripts": [], "url": "http://%s/" % domain, "version": msiversion if "bdist_msi" in sys.argv[1:] else version } if setuptools: attrs["entry_points"] = { "gui_scripts": [ "%s = %s.main:main%s" % (script, name, "" if script == name.lower() else script[len(name):].lower().replace("-", "_")) for script, desc in scripts ] } attrs["exclude_package_data"] = { name: ["RealDisplaySizeMM.c"] } attrs["include_package_data"] = sys.platform in ("darwin", "win32") install_requires = [req.replace("(", "").replace(")", "") for req in requires] attrs["install_requires"] = install_requires attrs["zip_safe"] = False else: attrs["scripts"].extend(os.path.join("scripts", script) for script, desc in filter(lambda (script, desc): script != name.lower() + "-apply-profiles" or sys.platform != "darwin", scripts)) if bdist_bbfreeze: attrs["setup_requires"] = ["bbfreeze"] if "bdist_wininst" in sys.argv[1:]: attrs["scripts"].append(os.path.join("util", name + "_postinstall.py")) if do_py2app: mainpy = os.path.join(basedir, "main.py") if not os.path.exists(mainpy): shutil.copy(os.path.join(basedir, "scripts", name.lower()), mainpy) attrs["app"] = [mainpy] dist_dir = os.path.join(pydir, "..", "dist", "py2app.%s-py%s" % (get_platform(), sys.version[:3]), name + "-" + version) from py2app.build_app import py2app as py2app_cls py2app_cls._copy_package_data = py2app_cls.copy_package_data def copy_package_data(self, package, target_dir): # Skip package data which is already included as data files if package.identifier.split('.')[0] != name: self._copy_package_data(package, target_dir) py2app_cls.copy_package_data = copy_package_data attrs["options"] = { "py2app": { "argv_emulation": True, "dist_dir": dist_dir, "excludes": config["excludes"]["all"] + config["excludes"]["darwin"], "iconfile": os.path.join(pydir, "theme", "icons", name + ".icns"), "optimize": 0, "plist": plist_dict } } attrs["setup_requires"] = ["py2app"] if do_py2exe: import wx from winmanifest_util import getmanifestxml manifest_xml = getmanifestxml(os.path.join(pydir, "..", "misc", name + (".exe.VC90.manifest" if hasattr(sys, "version_info") and sys.version_info[:2] >= (2,6) else ".exe.manifest"))) tmp_scripts_dir = os.path.join(basedir, "build", "temp.scripts") if not os.path.isdir(tmp_scripts_dir): os.makedirs(tmp_scripts_dir) for script, desc in scripts: shutil.copy(os.path.join(basedir, "scripts", script), os.path.join(tmp_scripts_dir, script2pywname(script))) attrs["windows"] = [Target(**{ "script": os.path.join(tmp_scripts_dir, script2pywname(script)), "icon_resources": [(1, os.path.join(pydir, "theme", "icons", os.path.splitext(os.path.basename(script))[0] + ".ico"))], "other_resources": [(24, 1, manifest_xml)], "copyright": u"© %s %s" % (strftime("%Y"), author), "description": desc }) for script, desc in scripts] console_scripts = [name + "-VRML-to-X3D-converter"] for console_script in console_scripts: console_script_path = os.path.join(tmp_scripts_dir, console_script + "-console") if not os.path.isfile(console_script_path): shutil.copy(os.path.join(basedir, "scripts", console_script.lower()), console_script_path) attrs["console"] = [Target(**{ "script": os.path.join(tmp_scripts_dir, script2pywname(script) + "-console"), "icon_resources": [(1, os.path.join(pydir, "theme", "icons", os.path.splitext(os.path.basename(script))[0] + ".ico"))], "other_resources": [(24, 1, manifest_xml)], "copyright": u"© %s %s" % (strftime("%Y"), author), "description": desc }) for script, desc in filter(lambda (script, desc): script2pywname(script) in console_scripts, scripts)] dist_dir = os.path.join(pydir, "..", "dist", "py2exe.%s-py%s" % (get_platform(), sys.version[:3]), name + "-" + version) attrs["options"] = { "py2exe": { "dist_dir": dist_dir, "dll_excludes": [ "iertutil.dll", "MPR.dll", "msvcm90.dll", "msvcp90.dll", "msvcr90.dll", "mswsock.dll", "urlmon.dll", "w9xpopen.exe" ], "excludes": config["excludes"]["all"] + config["excludes"]["win32"], "bundle_files": 3 if wx.VERSION >= (2, 8, 10, 1) else 1, "compressed": 1, "optimize": 0 # 0 = don’t optimize (generate .pyc) # 1 = normal optimization (like python -O) # 2 = extra optimization (like python -OO) } } if debug: attrs["options"]["py2exe"].update({ "bundle_files": 3, "compressed": 0, "optimize": 0, "skip_archive": 1 }) if setuptools: attrs["setup_requires"] = ["py2exe"] attrs["zipfile"] = os.path.join("lib", "library.zip") if (do_uninstall or do_install or bdist_win or bdist_dumb) and not help: distutils.core._setup_stop_after = "commandline" dist = setup(**attrs) distutils.core._setup_stop_after = None cmd = install(dist).get_finalized_command("install") if debug > 0: for attrname in [ "base", "data", "headers", "lib", "libbase", "platbase", "platlib", "prefix", "purelib", "root", "scripts", "userbase" ]: if attrname not in ["prefix", "root"]: attrname = "install_" + attrname if hasattr(cmd, attrname): print attrname, getattr(cmd, attrname) if debug > 1: try: from ppdir import ppdir except ImportError: pass else: ppdir(cmd, types=[dict, list, str, tuple, type, unicode]) if not install_data and sys.platform in ("darwin", "win32"): # on Mac OS X and Windows, we want data files in the package dir data_basedir = cmd.install_lib else: data_basedir = cmd.install_data data = change_root(data_basedir, data) doc = change_root(data_basedir, doc) # determine in which cases we want to make data file paths relative to # site-packages (on Mac and Windows) and when we want to make them # absolute (Linux) linux = sys.platform not in ("darwin", "win32") and (not cmd.root and setuptools) dar_win = (sys.platform in ("darwin", "win32") and (cmd.root or not setuptools)) or bdist_win if not do_uninstall and not install_data and (linux or dar_win) and \ attrs["data_files"]: if data_basedir.startswith(cmd.install_data + os.path.sep): data_basedir = relpath(data_basedir, cmd.install_data) print "*** changing basedir for data_files:", data_basedir for i, f in enumerate(attrs["data_files"]): if type(f) is StringType: attrs["data_files"][i] = change_root(data_basedir, f) else: attrs["data_files"][i] = (change_root(data_basedir, f[0]), f[1]) if do_uninstall and not help: # Quick and dirty uninstall if dry_run: print "dry run - nothing will be removed" else: from postinstall import postuninstall # Yeah, yeah - its actually pre-uninstall if cmd.root: postuninstall(prefix=change_root(cmd.root, cmd.prefix)) else: postuninstall(prefix=cmd.prefix) removed = [] visited = [] if os.path.exists(recordfile_name): paths = [(change_root(cmd.root, line.rstrip("\n")) if cmd.root else line.rstrip("\n")) for line in open(recordfile_name, "r")] else: paths = [] if not paths: # If the installed files have not been recorded, use some fallback # logic to find them paths = glob.glob(os.path.join(cmd.install_scripts, name)) if sys.platform == "win32": if setuptools: paths += glob.glob(os.path.join(cmd.install_scripts, name + ".exe")) paths += glob.glob(os.path.join(cmd.install_scripts, name + "-script.py")) else: paths += glob.glob(os.path.join(cmd.install_scripts, name + ".cmd")) paths += glob.glob(os.path.join(cmd.install_scripts, name + "_postinstall.py")) for attrname in [ "data", "headers", "lib", "libbase", "platlib", "purelib" ]: path = os.path.join(getattr(cmd, "install_" + attrname), name) if not path in paths: # Using sys.version in this way is consistent with # setuptools paths += glob.glob(path) + glob.glob(path + ("-%(version)s-py%(pyversion)s*.egg" % { "version": version, "pyversion": sys.version[:3] }) ) + glob.glob(path + ("-%(version)s-py%(pyversion)s*.egg-info" % { "version": version, "pyversion": sys.version[:3] }) ) if os.path.isabs(data) and not data in paths: for fname in [ "lang", "presets", "ref", "report", "screenshots", "tests", "theme", "ti1", "x3d-viewer", "LICENSE.txt", "README.html", "argyll_instruments.json", "beep.wav", "camera_shutter.wav", "ColorLookupTable.fx", name.lower() + ".desktop", name.lower() + "-3dlut-maker.desktop", name.lower() + "-curve-viewer.desktop", name.lower() + "-profile-info.desktop", name.lower() + "-scripting-client.desktop", name.lower() + "-synthprofile.desktop", name.lower() + "-testchart-editor.desktop", "pnp.ids", "quirk.json", "linear.cal", "technology_strings-1.7.0.json", "technology_strings-1.7.1.json", "test.cal" ]: path = os.path.join(data, fname) if not path in paths: paths += glob.glob(path) if os.path.isabs(doc) and not doc in paths: for fname in [ "screenshots", "theme", "LICENSE.txt", "README.html" ]: path = os.path.join(doc, fname) if not path in paths: paths += glob.glob(path) if sys.platform == "win32": from postinstall import get_special_folder_path startmenu_programs_common = get_special_folder_path( "CSIDL_COMMON_PROGRAMS") startmenu_programs = get_special_folder_path("CSIDL_PROGRAMS") for path in (startmenu_programs_common, startmenu_programs): if path: for filename in (name, "LICENSE", "README", "Uninstall"): paths += glob.glob(os.path.join(path, name, filename + ".lnk")) for path in paths: if os.path.exists(path): if path in visited: continue else: visited.append(path) if dry_run: print path continue try: if os.path.isfile(path): os.remove(path) elif os.path.isdir(path): os.rmdir(path) except Exception, exception: print "could'nt remove", path print " ", exception else: print "removed", path removed.append(path) while path != os.path.dirname(path): # remove parent directories if empty # could also use os.removedirs(path) but we want some status # info path = os.path.dirname(path) if os.path.isdir(path): if len(os.listdir(path)) == 0: if path in visited: continue else: visited.append(path) if dry_run: print path continue try: os.rmdir(path) except Exception, exception: print "could'nt remove", path print " ", exception else: print "removed", path removed.append(path) else: break if not removed: print len(visited), "entries found" else: print len(removed), "entries removed" else: # To have a working sdist and bdist_rpm when using distutils, # we go to the length of generating MANIFEST.in from scratch everytime, # using the information available from setup. manifest_in = ["# This file will be re-generated by setup.py - do not" "edit"] manifest_in.extend(["include LICENSE.txt", "include MANIFEST", "include MANIFEST.in", "include README.html", "include *.pyw", "include use-distutils"]) manifest_in.append("include " + os.path.basename(sys.argv[0])) manifest_in.append("include " + os.path.splitext(os.path.basename(sys.argv[0]))[0] + ".cfg") for datadir, datafiles in attrs.get("data_files", []): for datafile in datafiles: manifest_in.append("include " + ( relpath(os.path.sep.join(datafile.split("/")), basedir) or datafile)) for extmod in attrs.get("ext_modules", []): manifest_in.extend("include " + os.path.sep.join(src.split("/")) for src in extmod.sources) for pkg in attrs.get("packages", []): pkg = os.path.join(*pkg.split(".")) pkgdir = os.path.sep.join(attrs.get("package_dir", {}).get(pkg, pkg).split("/")) manifest_in.append("include " + os.path.join(pkgdir, "*.py")) manifest_in.append("include " + os.path.join(pkgdir, "*.pyd")) manifest_in.append("include " + os.path.join(pkgdir, "*.so")) for obj in attrs.get("package_data", {}).get(pkg, []): manifest_in.append("include " + os.path.sep.join([pkgdir] + obj.split("/"))) for pymod in attrs.get("py_modules", []): manifest_in.append("include " + os.path.join(*pymod.split("."))) manifest_in.append("include " + os.path.join(name, "theme", "theme-info.txt")) manifest_in.append("recursive-include %s %s %s" % (os.path.join(name, "theme", "icons"), "*.icns", "*.ico")) manifest_in.append("recursive-include %s %s" % ("autopackage", "*")) manifest_in.append("include " + os.path.join("man", "*.1")) manifest_in.append("recursive-include %s %s" % ("misc", "*")) if skip_instrument_conf_files: manifest_in.extend([ "exclude misc/Argyll", "exclude misc/*.rules", "exclude misc/*.usermap", ]) manifest_in.append("include " + os.path.join("screenshots", "*.png")) manifest_in.append("include " + os.path.join("scripts", "*")) manifest_in.append("include " + os.path.join("tests", "*")) manifest_in.append("recursive-include %s %s" % ("theme", "*")) manifest_in.append("recursive-include %s %s" % ("util", "*.cmd *.py *.sh")) if sys.platform == "win32" and not setuptools: # Only needed under Windows manifest_in.append("global-exclude .svn/*") manifest_in.append("global-exclude *~") manifest_in.append("global-exclude *.backup") manifest_in.append("global-exclude *.bak") if not dry_run: manifest = open("MANIFEST.in", "w") manifest.write("\n".join(manifest_in)) manifest.close() if os.path.exists("MANIFEST"): os.remove("MANIFEST") if bdist_bbfreeze: i = sys.argv.index("bdist_bbfreeze") if not "-d" in sys.argv[i + 1:] and \ not "--dist-dir" in sys.argv[i + 1:]: dist_dir = os.path.join(pydir, "..", "dist", "bbfreeze.%s-py%s" % (get_platform(), sys.version[:3])) sys.argv.insert(i + 1, "--dist-dir=" + dist_dir) if not "egg_info" in sys.argv[1:i]: sys.argv.insert(i, "egg_info") if do_py2app or do_py2exe: sys.path.insert(1, pydir) i = sys.argv.index("py2app" if do_py2app else "py2exe") if not "build_ext" in sys.argv[1:i]: sys.argv.insert(i, "build_ext") setup(**attrs) if dry_run or help: return if do_py2app: create_app_symlinks(dist_dir, scripts) if do_py2exe: shutil.copy(os.path.join(dist_dir, "python%s.dll" % (sys.version[0] + sys.version[2])), os.path.join(dist_dir, "lib", "python%s.dll" % (sys.version[0] + sys.version[2]))) if ((bdist_bbfreeze and sys.platform == "win32") or do_py2exe) and \ sys.version_info[:2] >= (2,6): from vc90crt import name as vc90crt_name, vc90crt_copy_files if do_py2exe: vc90crt_copy_files(dist_dir) vc90crt_copy_files(os.path.join(dist_dir, "lib")) else: vc90crt_copy_files(os.path.join(dist_dir, name + "-" + version)) if do_full_install and not is_rpm_build and not skip_postinstall: from postinstall import postinstall if sys.platform == "win32": path = os.path.join(cmd.install_lib, name) # Using sys.version in this way is consistent with setuptools for path in glob.glob(path) + glob.glob( os.path.join(path + ( "-%(version)s-py%(pyversion)s*.egg" % { "version": version, "pyversion": sys.version[:3] } ), name) ): if cmd.root: postinstall(prefix=change_root(cmd.root, path)) else: postinstall(prefix=path) elif cmd.root: postinstall(prefix=change_root(cmd.root, cmd.prefix)) else: postinstall(prefix=cmd.prefix) if __name__ == "__main__": setup() DisplayCAL-3.1.0.0/DisplayCAL/subprocess.py0000644000076500000000000000121112647526531020167 0ustar devwheel00000000000000import os import sys import subprocess26 from subprocess26 import Popen as _Popen, list2cmdline class Popen(_Popen): """ In case of an EnvironmentError when executing the child, set its filename to the first item of args """ def __init__(self, *args, **kwargs): try: _Popen.__init__(self, *args, **kwargs) except EnvironmentError, exception: if not exception.filename: if isinstance(args[0], basestring): cmd = args[0].split()[0] else: cmd = args[0][0] if not os.path.isfile(cmd) or not os.access(cmd, os.X_OK): exception.filename = cmd raise subprocess26.Popen = Popen from subprocess26 import * DisplayCAL-3.1.0.0/DisplayCAL/subprocess26.py0000644000076500000000000016426312647526531020360 0ustar devwheel00000000000000# NOTE this is actually the Python 2.7.10 subprocess module made compatible # with Python 2.6 # subprocess - Subprocesses with accessible I/O streams # # For more information about this module, see PEP 324. # # Copyright (c) 2003-2005 by Peter Astrand # # Licensed to PSF under a Contributor Agreement. # See http://www.python.org/2.4/license for licensing details. r"""subprocess - Subprocesses with accessible I/O streams This module allows you to spawn processes, connect to their input/output/error pipes, and obtain their return codes. This module intends to replace several older modules and functions: os.system os.spawn* os.popen* popen2.* commands.* Information about how the subprocess module can be used to replace these modules and functions can be found below. Using the subprocess module =========================== This module defines one class called Popen: class Popen(args, bufsize=0, executable=None, stdin=None, stdout=None, stderr=None, preexec_fn=None, close_fds=False, shell=False, cwd=None, env=None, universal_newlines=False, startupinfo=None, creationflags=0): Arguments are: args should be a string, or a sequence of program arguments. The program to execute is normally the first item in the args sequence or string, but can be explicitly set by using the executable argument. On UNIX, with shell=False (default): In this case, the Popen class uses os.execvp() to execute the child program. args should normally be a sequence. A string will be treated as a sequence with the string as the only item (the program to execute). On UNIX, with shell=True: If args is a string, it specifies the command string to execute through the shell. If args is a sequence, the first item specifies the command string, and any additional items will be treated as additional shell arguments. On Windows: the Popen class uses CreateProcess() to execute the child program, which operates on strings. If args is a sequence, it will be converted to a string using the list2cmdline method. Please note that not all MS Windows applications interpret the command line the same way: The list2cmdline is designed for applications using the same rules as the MS C runtime. bufsize, if given, has the same meaning as the corresponding argument to the built-in open() function: 0 means unbuffered, 1 means line buffered, any other positive value means use a buffer of (approximately) that size. A negative bufsize means to use the system default, which usually means fully buffered. The default value for bufsize is 0 (unbuffered). stdin, stdout and stderr specify the executed programs' standard input, standard output and standard error file handles, respectively. Valid values are PIPE, an existing file descriptor (a positive integer), an existing file object, and None. PIPE indicates that a new pipe to the child should be created. With None, no redirection will occur; the child's file handles will be inherited from the parent. Additionally, stderr can be STDOUT, which indicates that the stderr data from the applications should be captured into the same file handle as for stdout. If preexec_fn is set to a callable object, this object will be called in the child process just before the child is executed. If close_fds is true, all file descriptors except 0, 1 and 2 will be closed before the child process is executed. if shell is true, the specified command will be executed through the shell. If cwd is not None, the current directory will be changed to cwd before the child is executed. If env is not None, it defines the environment variables for the new process. If universal_newlines is true, the file objects stdout and stderr are opened as a text files, but lines may be terminated by any of '\n', the Unix end-of-line convention, '\r', the Macintosh convention or '\r\n', the Windows convention. All of these external representations are seen as '\n' by the Python program. Note: This feature is only available if Python is built with universal newline support (the default). Also, the newlines attribute of the file objects stdout, stdin and stderr are not updated by the communicate() method. The startupinfo and creationflags, if given, will be passed to the underlying CreateProcess() function. They can specify things such as appearance of the main window and priority for the new process. (Windows only) This module also defines some shortcut functions: call(*popenargs, **kwargs): Run command with arguments. Wait for command to complete, then return the returncode attribute. The arguments are the same as for the Popen constructor. Example: retcode = call(["ls", "-l"]) check_call(*popenargs, **kwargs): Run command with arguments. Wait for command to complete. If the exit code was zero then return, otherwise raise CalledProcessError. The CalledProcessError object will have the return code in the returncode attribute. The arguments are the same as for the Popen constructor. Example: check_call(["ls", "-l"]) check_output(*popenargs, **kwargs): Run command with arguments and return its output as a byte string. If the exit code was non-zero it raises a CalledProcessError. The CalledProcessError object will have the return code in the returncode attribute and output in the output attribute. The arguments are the same as for the Popen constructor. Example: output = check_output(["ls", "-l", "/dev/null"]) Exceptions ---------- Exceptions raised in the child process, before the new program has started to execute, will be re-raised in the parent. Additionally, the exception object will have one extra attribute called 'child_traceback', which is a string containing traceback information from the child's point of view. The most common exception raised is OSError. This occurs, for example, when trying to execute a non-existent file. Applications should prepare for OSErrors. A ValueError will be raised if Popen is called with invalid arguments. check_call() and check_output() will raise CalledProcessError, if the called process returns a non-zero return code. Security -------- Unlike some other popen functions, this implementation will never call /bin/sh implicitly. This means that all characters, including shell metacharacters, can safely be passed to child processes. Popen objects ============= Instances of the Popen class have the following methods: poll() Check if child process has terminated. Returns returncode attribute. wait() Wait for child process to terminate. Returns returncode attribute. communicate(input=None) Interact with process: Send data to stdin. Read data from stdout and stderr, until end-of-file is reached. Wait for process to terminate. The optional input argument should be a string to be sent to the child process, or None, if no data should be sent to the child. communicate() returns a tuple (stdout, stderr). Note: The data read is buffered in memory, so do not use this method if the data size is large or unlimited. The following attributes are also available: stdin If the stdin argument is PIPE, this attribute is a file object that provides input to the child process. Otherwise, it is None. stdout If the stdout argument is PIPE, this attribute is a file object that provides output from the child process. Otherwise, it is None. stderr If the stderr argument is PIPE, this attribute is file object that provides error output from the child process. Otherwise, it is None. pid The process ID of the child process. returncode The child return code. A None value indicates that the process hasn't terminated yet. A negative value -N indicates that the child was terminated by signal N (UNIX only). Replacing older functions with the subprocess module ==================================================== In this section, "a ==> b" means that b can be used as a replacement for a. Note: All functions in this section fail (more or less) silently if the executed program cannot be found; this module raises an OSError exception. In the following examples, we assume that the subprocess module is imported with "from subprocess import *". Replacing /bin/sh shell backquote --------------------------------- output=`mycmd myarg` ==> output = Popen(["mycmd", "myarg"], stdout=PIPE).communicate()[0] Replacing shell pipe line ------------------------- output=`dmesg | grep hda` ==> p1 = Popen(["dmesg"], stdout=PIPE) p2 = Popen(["grep", "hda"], stdin=p1.stdout, stdout=PIPE) output = p2.communicate()[0] Replacing os.system() --------------------- sts = os.system("mycmd" + " myarg") ==> p = Popen("mycmd" + " myarg", shell=True) pid, sts = os.waitpid(p.pid, 0) Note: * Calling the program through the shell is usually not required. * It's easier to look at the returncode attribute than the exitstatus. A more real-world example would look like this: try: retcode = call("mycmd" + " myarg", shell=True) if retcode < 0: print >>sys.stderr, "Child was terminated by signal", -retcode else: print >>sys.stderr, "Child returned", retcode except OSError, e: print >>sys.stderr, "Execution failed:", e Replacing os.spawn* ------------------- P_NOWAIT example: pid = os.spawnlp(os.P_NOWAIT, "/bin/mycmd", "mycmd", "myarg") ==> pid = Popen(["/bin/mycmd", "myarg"]).pid P_WAIT example: retcode = os.spawnlp(os.P_WAIT, "/bin/mycmd", "mycmd", "myarg") ==> retcode = call(["/bin/mycmd", "myarg"]) Vector example: os.spawnvp(os.P_NOWAIT, path, args) ==> Popen([path] + args[1:]) Environment example: os.spawnlpe(os.P_NOWAIT, "/bin/mycmd", "mycmd", "myarg", env) ==> Popen(["/bin/mycmd", "myarg"], env={"PATH": "/usr/bin"}) Replacing os.popen* ------------------- pipe = os.popen("cmd", mode='r', bufsize) ==> pipe = Popen("cmd", shell=True, bufsize=bufsize, stdout=PIPE).stdout pipe = os.popen("cmd", mode='w', bufsize) ==> pipe = Popen("cmd", shell=True, bufsize=bufsize, stdin=PIPE).stdin (child_stdin, child_stdout) = os.popen2("cmd", mode, bufsize) ==> p = Popen("cmd", shell=True, bufsize=bufsize, stdin=PIPE, stdout=PIPE, close_fds=True) (child_stdin, child_stdout) = (p.stdin, p.stdout) (child_stdin, child_stdout, child_stderr) = os.popen3("cmd", mode, bufsize) ==> p = Popen("cmd", shell=True, bufsize=bufsize, stdin=PIPE, stdout=PIPE, stderr=PIPE, close_fds=True) (child_stdin, child_stdout, child_stderr) = (p.stdin, p.stdout, p.stderr) (child_stdin, child_stdout_and_stderr) = os.popen4("cmd", mode, bufsize) ==> p = Popen("cmd", shell=True, bufsize=bufsize, stdin=PIPE, stdout=PIPE, stderr=STDOUT, close_fds=True) (child_stdin, child_stdout_and_stderr) = (p.stdin, p.stdout) On Unix, os.popen2, os.popen3 and os.popen4 also accept a sequence as the command to execute, in which case arguments will be passed directly to the program without shell intervention. This usage can be replaced as follows: (child_stdin, child_stdout) = os.popen2(["/bin/ls", "-l"], mode, bufsize) ==> p = Popen(["/bin/ls", "-l"], bufsize=bufsize, stdin=PIPE, stdout=PIPE) (child_stdin, child_stdout) = (p.stdin, p.stdout) Return code handling translates as follows: pipe = os.popen("cmd", 'w') ... rc = pipe.close() if rc is not None and rc % 256: print "There were some errors" ==> process = Popen("cmd", 'w', shell=True, stdin=PIPE) ... process.stdin.close() if process.wait() != 0: print "There were some errors" Replacing popen2.* ------------------ (child_stdout, child_stdin) = popen2.popen2("somestring", bufsize, mode) ==> p = Popen(["somestring"], shell=True, bufsize=bufsize stdin=PIPE, stdout=PIPE, close_fds=True) (child_stdout, child_stdin) = (p.stdout, p.stdin) On Unix, popen2 also accepts a sequence as the command to execute, in which case arguments will be passed directly to the program without shell intervention. This usage can be replaced as follows: (child_stdout, child_stdin) = popen2.popen2(["mycmd", "myarg"], bufsize, mode) ==> p = Popen(["mycmd", "myarg"], bufsize=bufsize, stdin=PIPE, stdout=PIPE, close_fds=True) (child_stdout, child_stdin) = (p.stdout, p.stdin) The popen2.Popen3 and popen2.Popen4 basically works as subprocess.Popen, except that: * subprocess.Popen raises an exception if the execution fails * the capturestderr argument is replaced with the stderr argument. * stdin=PIPE and stdout=PIPE must be specified. * popen2 closes all filedescriptors by default, but you have to specify close_fds=True with subprocess.Popen. """ import sys mswindows = (sys.platform == "win32") import os import types import traceback import gc import signal import errno # Exception classes used by this module. class CalledProcessError(Exception): """This exception is raised when a process run by check_call() or check_output() returns a non-zero exit status. The exit status will be stored in the returncode attribute; check_output() will also store the output in the output attribute. """ def __init__(self, returncode, cmd, output=None): self.returncode = returncode self.cmd = cmd self.output = output def __str__(self): return "Command '%s' returned non-zero exit status %d" % (self.cmd, self.returncode) if mswindows: import threading import msvcrt import _subprocess class STARTUPINFO: dwFlags = 0 hStdInput = None hStdOutput = None hStdError = None wShowWindow = 0 class pywintypes: error = IOError else: import select _has_poll = hasattr(select, 'poll') import fcntl import pickle # When select or poll has indicated that the file is writable, # we can write up to _PIPE_BUF bytes without risk of blocking. # POSIX defines PIPE_BUF as >= 512. _PIPE_BUF = getattr(select, 'PIPE_BUF', 512) __all__ = ["Popen", "PIPE", "STDOUT", "call", "check_call", "check_output", "CalledProcessError"] CTRL_C_EVENT = 0 CTRL_BREAK_EVENT = 1 STILL_ACTIVE = 259 if mswindows: from _subprocess import (CREATE_NEW_CONSOLE, STD_INPUT_HANDLE, STD_OUTPUT_HANDLE, STD_ERROR_HANDLE, SW_HIDE, STARTF_USESTDHANDLES, STARTF_USESHOWWINDOW) __all__.extend(["CREATE_NEW_CONSOLE", "STD_INPUT_HANDLE", "STD_OUTPUT_HANDLE", "STD_ERROR_HANDLE", "SW_HIDE", "STARTF_USESTDHANDLES", "STARTF_USESHOWWINDOW", "STARTUPINFO"]) try: MAXFD = os.sysconf("SC_OPEN_MAX") except: MAXFD = 256 _active = [] def _cleanup(): for inst in _active[:]: res = inst._internal_poll(_deadstate=sys.maxint) if res is not None: try: _active.remove(inst) except ValueError: # This can happen if two threads create a new Popen instance. # It's harmless that it was already removed, so ignore. pass PIPE = -1 STDOUT = -2 def _eintr_retry_call(func, *args): while True: try: return func(*args) except (OSError, IOError) as e: if e.errno == errno.EINTR: continue raise # XXX This function is only used by multiprocessing and the test suite, # but it's here so that it can be imported when Python is compiled without # threads. def _args_from_interpreter_flags(): """Return a list of command-line arguments reproducing the current settings in sys.flags and sys.warnoptions.""" flag_opt_map = { 'debug': 'd', # 'inspect': 'i', # 'interactive': 'i', 'optimize': 'O', 'dont_write_bytecode': 'B', 'no_user_site': 's', 'no_site': 'S', 'ignore_environment': 'E', 'verbose': 'v', 'bytes_warning': 'b', 'hash_randomization': 'R', 'py3k_warning': '3', } args = [] for flag, opt in flag_opt_map.items(): v = getattr(sys.flags, flag) if v > 0: args.append('-' + opt * v) for opt in sys.warnoptions: args.append('-W' + opt) return args def call(*popenargs, **kwargs): """Run command with arguments. Wait for command to complete, then return the returncode attribute. The arguments are the same as for the Popen constructor. Example: retcode = call(["ls", "-l"]) """ return Popen(*popenargs, **kwargs).wait() def check_call(*popenargs, **kwargs): """Run command with arguments. Wait for command to complete. If the exit code was zero then return, otherwise raise CalledProcessError. The CalledProcessError object will have the return code in the returncode attribute. The arguments are the same as for the Popen constructor. Example: check_call(["ls", "-l"]) """ retcode = call(*popenargs, **kwargs) if retcode: cmd = kwargs.get("args") if cmd is None: cmd = popenargs[0] raise CalledProcessError(retcode, cmd) return 0 def check_output(*popenargs, **kwargs): r"""Run command with arguments and return its output as a byte string. If the exit code was non-zero it raises a CalledProcessError. The CalledProcessError object will have the return code in the returncode attribute and output in the output attribute. The arguments are the same as for the Popen constructor. Example: >>> check_output(["ls", "-l", "/dev/null"]) 'crw-rw-rw- 1 root root 1, 3 Oct 18 2007 /dev/null\n' The stdout argument is not allowed as it is used internally. To capture standard error in the result, use stderr=STDOUT. >>> check_output(["/bin/sh", "-c", ... "ls -l non_existent_file ; exit 0"], ... stderr=STDOUT) 'ls: non_existent_file: No such file or directory\n' """ if 'stdout' in kwargs: raise ValueError('stdout argument not allowed, it will be overridden.') process = Popen(stdout=PIPE, *popenargs, **kwargs) output, unused_err = process.communicate() retcode = process.poll() if retcode: cmd = kwargs.get("args") if cmd is None: cmd = popenargs[0] raise CalledProcessError(retcode, cmd, output=output) return output def list2cmdline(seq): """ Translate a sequence of arguments into a command line string, using the same rules as the MS C runtime: 1) Arguments are delimited by white space, which is either a space or a tab. 2) A string surrounded by double quotation marks is interpreted as a single argument, regardless of white space contained within. A quoted string can be embedded in an argument. 3) A double quotation mark preceded by a backslash is interpreted as a literal double quotation mark. 4) Backslashes are interpreted literally, unless they immediately precede a double quotation mark. 5) If backslashes immediately precede a double quotation mark, every pair of backslashes is interpreted as a literal backslash. If the number of backslashes is odd, the last backslash escapes the next double quotation mark as described in rule 3. """ # See # http://msdn.microsoft.com/en-us/library/17w5ykft.aspx # or search http://msdn.microsoft.com for # "Parsing C++ Command-Line Arguments" result = [] needquote = False for arg in seq: bs_buf = [] # Add a space to separate this argument from the others if result: result.append(' ') needquote = (" " in arg) or ("\t" in arg) or not arg if needquote: result.append('"') for c in arg: if c == '\\': # Don't know if we need to double yet. bs_buf.append(c) elif c == '"': # Double backslashes. result.append('\\' * len(bs_buf)*2) bs_buf = [] result.append('\\"') else: # Normal char if bs_buf: result.extend(bs_buf) bs_buf = [] result.append(c) # Add remaining backslashes, if any. if bs_buf: result.extend(bs_buf) if needquote: result.extend(bs_buf) result.append('"') return ''.join(result) class Popen(object): _child_created = False # Set here since __del__ checks it def __init__(self, args, bufsize=0, executable=None, stdin=None, stdout=None, stderr=None, preexec_fn=None, close_fds=False, shell=False, cwd=None, env=None, universal_newlines=False, startupinfo=None, creationflags=0): """Create new Popen instance.""" _cleanup() if not isinstance(bufsize, (int, long)): raise TypeError("bufsize must be an integer") if mswindows: if preexec_fn is not None: raise ValueError("preexec_fn is not supported on Windows " "platforms") if close_fds and (stdin is not None or stdout is not None or stderr is not None): raise ValueError("close_fds is not supported on Windows " "platforms if you redirect stdin/stdout/stderr") else: # POSIX if startupinfo is not None: raise ValueError("startupinfo is only supported on Windows " "platforms") if creationflags != 0: raise ValueError("creationflags is only supported on Windows " "platforms") self.stdin = None self.stdout = None self.stderr = None self.pid = None self.returncode = None self.universal_newlines = universal_newlines # Input and output objects. The general principle is like # this: # # Parent Child # ------ ----- # p2cwrite ---stdin---> p2cread # c2pread <--stdout--- c2pwrite # errread <--stderr--- errwrite # # On POSIX, the child objects are file descriptors. On # Windows, these are Windows file handles. The parent objects # are file descriptors on both platforms. The parent objects # are None when not using PIPEs. The child objects are None # when not redirecting. (p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite), to_close = self._get_handles(stdin, stdout, stderr) try: self._execute_child(args, executable, preexec_fn, close_fds, cwd, env, universal_newlines, startupinfo, creationflags, shell, to_close, p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite) except Exception: # Preserve original exception in case os.close raises. exc_type, exc_value, exc_trace = sys.exc_info() for fd in to_close: try: if mswindows: fd.Close() else: os.close(fd) except EnvironmentError: pass raise exc_type, exc_value, exc_trace if mswindows: if p2cwrite is not None: p2cwrite = msvcrt.open_osfhandle(p2cwrite.Detach(), 0) if c2pread is not None: c2pread = msvcrt.open_osfhandle(c2pread.Detach(), 0) if errread is not None: errread = msvcrt.open_osfhandle(errread.Detach(), 0) if p2cwrite is not None: self.stdin = os.fdopen(p2cwrite, 'wb', bufsize) if c2pread is not None: if universal_newlines: self.stdout = os.fdopen(c2pread, 'rU', bufsize) else: self.stdout = os.fdopen(c2pread, 'rb', bufsize) if errread is not None: if universal_newlines: self.stderr = os.fdopen(errread, 'rU', bufsize) else: self.stderr = os.fdopen(errread, 'rb', bufsize) def _translate_newlines(self, data): data = data.replace("\r\n", "\n") data = data.replace("\r", "\n") return data def __del__(self, _maxint=sys.maxint): # If __init__ hasn't had a chance to execute (e.g. if it # was passed an undeclared keyword argument), we don't # have a _child_created attribute at all. if not self._child_created: # We didn't get to successfully create a child process. return # In case the child hasn't been waited on, check if it's done. self._internal_poll(_deadstate=_maxint) if self.returncode is None and _active is not None: # Child is still running, keep us alive until we can wait on it. _active.append(self) def communicate(self, input=None): """Interact with process: Send data to stdin. Read data from stdout and stderr, until end-of-file is reached. Wait for process to terminate. The optional input argument should be a string to be sent to the child process, or None, if no data should be sent to the child. communicate() returns a tuple (stdout, stderr).""" # Optimization: If we are only using one pipe, or no pipe at # all, using select() or threads is unnecessary. if [self.stdin, self.stdout, self.stderr].count(None) >= 2: stdout = None stderr = None if self.stdin: if input: try: self.stdin.write(input) except IOError as e: if e.errno != errno.EPIPE and e.errno != errno.EINVAL: raise self.stdin.close() elif self.stdout: stdout = _eintr_retry_call(self.stdout.read) self.stdout.close() elif self.stderr: stderr = _eintr_retry_call(self.stderr.read) self.stderr.close() self.wait() return (stdout, stderr) return self._communicate(input) def poll(self): return self._internal_poll() if mswindows: # # Windows methods # def _get_handles(self, stdin, stdout, stderr): """Construct and return tuple with IO objects: p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite """ to_close = set() if stdin is None and stdout is None and stderr is None: return (None, None, None, None, None, None), to_close p2cread, p2cwrite = None, None c2pread, c2pwrite = None, None errread, errwrite = None, None if stdin is None: p2cread = _subprocess.GetStdHandle(_subprocess.STD_INPUT_HANDLE) if p2cread is None: p2cread, _ = _subprocess.CreatePipe(None, 0) elif stdin == PIPE: p2cread, p2cwrite = _subprocess.CreatePipe(None, 0) elif isinstance(stdin, int): p2cread = msvcrt.get_osfhandle(stdin) else: # Assuming file-like object p2cread = msvcrt.get_osfhandle(stdin.fileno()) p2cread = self._make_inheritable(p2cread) # We just duplicated the handle, it has to be closed at the end to_close.add(p2cread) if stdin == PIPE: to_close.add(p2cwrite) if stdout is None: c2pwrite = _subprocess.GetStdHandle(_subprocess.STD_OUTPUT_HANDLE) if c2pwrite is None: _, c2pwrite = _subprocess.CreatePipe(None, 0) elif stdout == PIPE: c2pread, c2pwrite = _subprocess.CreatePipe(None, 0) elif isinstance(stdout, int): c2pwrite = msvcrt.get_osfhandle(stdout) else: # Assuming file-like object c2pwrite = msvcrt.get_osfhandle(stdout.fileno()) c2pwrite = self._make_inheritable(c2pwrite) # We just duplicated the handle, it has to be closed at the end to_close.add(c2pwrite) if stdout == PIPE: to_close.add(c2pread) if stderr is None: errwrite = _subprocess.GetStdHandle(_subprocess.STD_ERROR_HANDLE) if errwrite is None: _, errwrite = _subprocess.CreatePipe(None, 0) elif stderr == PIPE: errread, errwrite = _subprocess.CreatePipe(None, 0) elif stderr == STDOUT: errwrite = c2pwrite elif isinstance(stderr, int): errwrite = msvcrt.get_osfhandle(stderr) else: # Assuming file-like object errwrite = msvcrt.get_osfhandle(stderr.fileno()) errwrite = self._make_inheritable(errwrite) # We just duplicated the handle, it has to be closed at the end to_close.add(errwrite) if stderr == PIPE: to_close.add(errread) return (p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite), to_close def _make_inheritable(self, handle): """Return a duplicate of handle, which is inheritable""" return _subprocess.DuplicateHandle(_subprocess.GetCurrentProcess(), handle, _subprocess.GetCurrentProcess(), 0, 1, _subprocess.DUPLICATE_SAME_ACCESS) def _find_w9xpopen(self): """Find and return absolut path to w9xpopen.exe""" w9xpopen = os.path.join( os.path.dirname(_subprocess.GetModuleFileName(0)), "w9xpopen.exe") if not os.path.exists(w9xpopen): # Eeek - file-not-found - possibly an embedding # situation - see if we can locate it in sys.exec_prefix w9xpopen = os.path.join(os.path.dirname(sys.exec_prefix), "w9xpopen.exe") if not os.path.exists(w9xpopen): raise RuntimeError("Cannot locate w9xpopen.exe, which is " "needed for Popen to work with your " "shell or platform.") return w9xpopen def _execute_child(self, args, executable, preexec_fn, close_fds, cwd, env, universal_newlines, startupinfo, creationflags, shell, to_close, p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite): """Execute program (MS Windows version)""" if not isinstance(args, types.StringTypes): args = list2cmdline(args) # Process startup details if startupinfo is None: startupinfo = STARTUPINFO() if None not in (p2cread, c2pwrite, errwrite): startupinfo.dwFlags |= _subprocess.STARTF_USESTDHANDLES startupinfo.hStdInput = p2cread startupinfo.hStdOutput = c2pwrite startupinfo.hStdError = errwrite if shell: startupinfo.dwFlags |= _subprocess.STARTF_USESHOWWINDOW startupinfo.wShowWindow = _subprocess.SW_HIDE comspec = os.environ.get("COMSPEC", "cmd.exe") args = '%s /c "%s"' % (comspec, args) if (_subprocess.GetVersion() >= 0x80000000 or os.path.basename(comspec).lower() == "command.com"): # Win9x, or using command.com on NT. We need to # use the w9xpopen intermediate program. For more # information, see KB Q150956 # (http://web.archive.org/web/20011105084002/http://support.microsoft.com/support/kb/articles/Q150/9/56.asp) w9xpopen = self._find_w9xpopen() args = '"%s" %s' % (w9xpopen, args) # Not passing CREATE_NEW_CONSOLE has been known to # cause random failures on win9x. Specifically a # dialog: "Your program accessed mem currently in # use at xxx" and a hopeful warning about the # stability of your system. Cost is Ctrl+C wont # kill children. creationflags |= _subprocess.CREATE_NEW_CONSOLE def _close_in_parent(fd): fd.Close() to_close.remove(fd) # Start the process try: hp, ht, pid, tid = _subprocess.CreateProcess(executable, args, # no special security None, None, int(not close_fds), creationflags, env, cwd, startupinfo) except pywintypes.error, e: # Translate pywintypes.error to WindowsError, which is # a subclass of OSError. FIXME: We should really # translate errno using _sys_errlist (or similar), but # how can this be done from Python? raise WindowsError(*e.args) finally: # Child is launched. Close the parent's copy of those pipe # handles that only the child should have open. You need # to make sure that no handles to the write end of the # output pipe are maintained in this process or else the # pipe will not close when the child process exits and the # ReadFile will hang. if p2cread is not None: _close_in_parent(p2cread) if c2pwrite is not None: _close_in_parent(c2pwrite) if errwrite is not None: _close_in_parent(errwrite) # Retain the process handle, but close the thread handle self._child_created = True self._handle = hp self.pid = pid ht.Close() def _internal_poll(self, _deadstate=None, _WaitForSingleObject=_subprocess.WaitForSingleObject, _WAIT_OBJECT_0=_subprocess.WAIT_OBJECT_0, _GetExitCodeProcess=_subprocess.GetExitCodeProcess): """Check if child process has terminated. Returns returncode attribute. This method is called by __del__, so it can only refer to objects in its local scope. """ if self.returncode is None: if _WaitForSingleObject(self._handle, 0) == _WAIT_OBJECT_0: self.returncode = _GetExitCodeProcess(self._handle) return self.returncode def wait(self): """Wait for child process to terminate. Returns returncode attribute.""" if self.returncode is None: _subprocess.WaitForSingleObject(self._handle, _subprocess.INFINITE) self.returncode = _subprocess.GetExitCodeProcess(self._handle) return self.returncode def _readerthread(self, fh, buffer): buffer.append(fh.read()) def _communicate(self, input): stdout = None # Return stderr = None # Return if self.stdout: stdout = [] stdout_thread = threading.Thread(target=self._readerthread, args=(self.stdout, stdout)) stdout_thread.setDaemon(True) stdout_thread.start() if self.stderr: stderr = [] stderr_thread = threading.Thread(target=self._readerthread, args=(self.stderr, stderr)) stderr_thread.setDaemon(True) stderr_thread.start() if self.stdin: if input is not None: try: self.stdin.write(input) except IOError as e: if e.errno == errno.EPIPE: # communicate() should ignore broken pipe error pass elif (e.errno == errno.EINVAL and self.poll() is not None): # Issue #19612: stdin.write() fails with EINVAL # if the process already exited before the write pass else: raise self.stdin.close() if self.stdout: stdout_thread.join() if self.stderr: stderr_thread.join() # All data exchanged. Translate lists into strings. if stdout is not None: stdout = stdout[0] if stderr is not None: stderr = stderr[0] # Translate newlines, if requested. We cannot let the file # object do the translation: It is based on stdio, which is # impossible to combine with select (unless forcing no # buffering). if self.universal_newlines and hasattr(file, 'newlines'): if stdout: stdout = self._translate_newlines(stdout) if stderr: stderr = self._translate_newlines(stderr) self.wait() return (stdout, stderr) def send_signal(self, sig): """Send a signal to the process """ if sig == signal.SIGTERM: self.terminate() elif sig == CTRL_C_EVENT: os.kill(self.pid, CTRL_C_EVENT) elif sig == CTRL_BREAK_EVENT: os.kill(self.pid, CTRL_BREAK_EVENT) else: raise ValueError("Unsupported signal: %s" % sig) def terminate(self): """Terminates the process """ try: _subprocess.TerminateProcess(self._handle, 1) except OSError as e: # ERROR_ACCESS_DENIED (winerror 5) is received when the # process already died. if e.winerror != 5: raise rc = _subprocess.GetExitCodeProcess(self._handle) if rc == STILL_ACTIVE: raise self.returncode = rc kill = terminate else: # # POSIX methods # def _get_handles(self, stdin, stdout, stderr): """Construct and return tuple with IO objects: p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite """ to_close = set() p2cread, p2cwrite = None, None c2pread, c2pwrite = None, None errread, errwrite = None, None if stdin is None: pass elif stdin == PIPE: p2cread, p2cwrite = self.pipe_cloexec() to_close.update((p2cread, p2cwrite)) elif isinstance(stdin, int): p2cread = stdin else: # Assuming file-like object p2cread = stdin.fileno() if stdout is None: pass elif stdout == PIPE: c2pread, c2pwrite = self.pipe_cloexec() to_close.update((c2pread, c2pwrite)) elif isinstance(stdout, int): c2pwrite = stdout else: # Assuming file-like object c2pwrite = stdout.fileno() if stderr is None: pass elif stderr == PIPE: errread, errwrite = self.pipe_cloexec() to_close.update((errread, errwrite)) elif stderr == STDOUT: errwrite = c2pwrite elif isinstance(stderr, int): errwrite = stderr else: # Assuming file-like object errwrite = stderr.fileno() return (p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite), to_close def _set_cloexec_flag(self, fd, cloexec=True): try: cloexec_flag = fcntl.FD_CLOEXEC except AttributeError: cloexec_flag = 1 old = fcntl.fcntl(fd, fcntl.F_GETFD) if cloexec: fcntl.fcntl(fd, fcntl.F_SETFD, old | cloexec_flag) else: fcntl.fcntl(fd, fcntl.F_SETFD, old & ~cloexec_flag) def pipe_cloexec(self): """Create a pipe with FDs set CLOEXEC.""" # Pipes' FDs are set CLOEXEC by default because we don't want them # to be inherited by other subprocesses: the CLOEXEC flag is removed # from the child's FDs by _dup2(), between fork() and exec(). # This is not atomic: we would need the pipe2() syscall for that. r, w = os.pipe() self._set_cloexec_flag(r) self._set_cloexec_flag(w) return r, w def _close_fds(self, but): if hasattr(os, 'closerange'): os.closerange(3, but) os.closerange(but + 1, MAXFD) else: for i in xrange(3, MAXFD): if i == but: continue try: os.close(i) except: pass def _execute_child(self, args, executable, preexec_fn, close_fds, cwd, env, universal_newlines, startupinfo, creationflags, shell, to_close, p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite): """Execute program (POSIX version)""" if isinstance(args, types.StringTypes): args = [args] else: args = list(args) if shell: args = ["/bin/sh", "-c"] + args if executable: args[0] = executable if executable is None: executable = args[0] def _close_in_parent(fd): os.close(fd) to_close.remove(fd) # For transferring possible exec failure from child to parent # The first char specifies the exception type: 0 means # OSError, 1 means some other error. errpipe_read, errpipe_write = self.pipe_cloexec() try: try: gc_was_enabled = gc.isenabled() # Disable gc to avoid bug where gc -> file_dealloc -> # write to stderr -> hang. http://bugs.python.org/issue1336 gc.disable() try: self.pid = os.fork() except: if gc_was_enabled: gc.enable() raise self._child_created = True if self.pid == 0: # Child try: # Close parent's pipe ends if p2cwrite is not None: os.close(p2cwrite) if c2pread is not None: os.close(c2pread) if errread is not None: os.close(errread) os.close(errpipe_read) # When duping fds, if there arises a situation # where one of the fds is either 0, 1 or 2, it # is possible that it is overwritten (#12607). if c2pwrite == 0: c2pwrite = os.dup(c2pwrite) if errwrite == 0 or errwrite == 1: errwrite = os.dup(errwrite) # Dup fds for child def _dup2(a, b): # dup2() removes the CLOEXEC flag but # we must do it ourselves if dup2() # would be a no-op (issue #10806). if a == b: self._set_cloexec_flag(a, False) elif a is not None: os.dup2(a, b) _dup2(p2cread, 0) _dup2(c2pwrite, 1) _dup2(errwrite, 2) # Close pipe fds. Make sure we don't close the # same fd more than once, or standard fds. closed = set([None]) for fd in [p2cread, c2pwrite, errwrite]: if fd not in closed and fd > 2: os.close(fd) closed.add(fd) if cwd is not None: os.chdir(cwd) if preexec_fn: preexec_fn() # Close all other fds, if asked for - after # preexec_fn(), which may open FDs. if close_fds: self._close_fds(but=errpipe_write) if env is None: os.execvp(executable, args) else: os.execvpe(executable, args, env) except: exc_type, exc_value, tb = sys.exc_info() # Save the traceback and attach it to the exception object exc_lines = traceback.format_exception(exc_type, exc_value, tb) exc_value.child_traceback = ''.join(exc_lines) os.write(errpipe_write, pickle.dumps(exc_value)) # This exitcode won't be reported to applications, so it # really doesn't matter what we return. os._exit(255) # Parent if gc_was_enabled: gc.enable() finally: # be sure the FD is closed no matter what os.close(errpipe_write) # Wait for exec to fail or succeed; possibly raising exception # Exception limited to 1M data = _eintr_retry_call(os.read, errpipe_read, 1048576) finally: if p2cread is not None and p2cwrite is not None: _close_in_parent(p2cread) if c2pwrite is not None and c2pread is not None: _close_in_parent(c2pwrite) if errwrite is not None and errread is not None: _close_in_parent(errwrite) # be sure the FD is closed no matter what os.close(errpipe_read) if data != "": try: _eintr_retry_call(os.waitpid, self.pid, 0) except OSError as e: if e.errno != errno.ECHILD: raise child_exception = pickle.loads(data) raise child_exception def _handle_exitstatus(self, sts, _WIFSIGNALED=os.WIFSIGNALED, _WTERMSIG=os.WTERMSIG, _WIFEXITED=os.WIFEXITED, _WEXITSTATUS=os.WEXITSTATUS): # This method is called (indirectly) by __del__, so it cannot # refer to anything outside of its local scope. if _WIFSIGNALED(sts): self.returncode = -_WTERMSIG(sts) elif _WIFEXITED(sts): self.returncode = _WEXITSTATUS(sts) else: # Should never happen raise RuntimeError("Unknown child exit status!") def _internal_poll(self, _deadstate=None, _waitpid=os.waitpid, _WNOHANG=os.WNOHANG, _os_error=os.error, _ECHILD=errno.ECHILD): """Check if child process has terminated. Returns returncode attribute. This method is called by __del__, so it cannot reference anything outside of the local scope (nor can any methods it calls). """ if self.returncode is None: try: pid, sts = _waitpid(self.pid, _WNOHANG) if pid == self.pid: self._handle_exitstatus(sts) except _os_error as e: if _deadstate is not None: self.returncode = _deadstate if e.errno == _ECHILD: # This happens if SIGCLD is set to be ignored or # waiting for child processes has otherwise been # disabled for our process. This child is dead, we # can't get the status. # http://bugs.python.org/issue15756 self.returncode = 0 return self.returncode def wait(self): """Wait for child process to terminate. Returns returncode attribute.""" while self.returncode is None: try: pid, sts = _eintr_retry_call(os.waitpid, self.pid, 0) except OSError as e: if e.errno != errno.ECHILD: raise # This happens if SIGCLD is set to be ignored or waiting # for child processes has otherwise been disabled for our # process. This child is dead, we can't get the status. pid = self.pid sts = 0 # Check the pid and loop as waitpid has been known to return # 0 even without WNOHANG in odd situations. issue14396. if pid == self.pid: self._handle_exitstatus(sts) return self.returncode def _communicate(self, input): if self.stdin: # Flush stdio buffer. This might block, if the user has # been writing to .stdin in an uncontrolled fashion. self.stdin.flush() if not input: self.stdin.close() if _has_poll: stdout, stderr = self._communicate_with_poll(input) else: stdout, stderr = self._communicate_with_select(input) # All data exchanged. Translate lists into strings. if stdout is not None: stdout = ''.join(stdout) if stderr is not None: stderr = ''.join(stderr) # Translate newlines, if requested. We cannot let the file # object do the translation: It is based on stdio, which is # impossible to combine with select (unless forcing no # buffering). if self.universal_newlines and hasattr(file, 'newlines'): if stdout: stdout = self._translate_newlines(stdout) if stderr: stderr = self._translate_newlines(stderr) self.wait() return (stdout, stderr) def _communicate_with_poll(self, input): stdout = None # Return stderr = None # Return fd2file = {} fd2output = {} poller = select.poll() def register_and_append(file_obj, eventmask): poller.register(file_obj.fileno(), eventmask) fd2file[file_obj.fileno()] = file_obj def close_unregister_and_remove(fd): poller.unregister(fd) fd2file[fd].close() fd2file.pop(fd) if self.stdin and input: register_and_append(self.stdin, select.POLLOUT) select_POLLIN_POLLPRI = select.POLLIN | select.POLLPRI if self.stdout: register_and_append(self.stdout, select_POLLIN_POLLPRI) fd2output[self.stdout.fileno()] = stdout = [] if self.stderr: register_and_append(self.stderr, select_POLLIN_POLLPRI) fd2output[self.stderr.fileno()] = stderr = [] input_offset = 0 while fd2file: try: ready = poller.poll() except select.error, e: if e.args[0] == errno.EINTR: continue raise for fd, mode in ready: if mode & select.POLLOUT: chunk = input[input_offset : input_offset + _PIPE_BUF] try: input_offset += os.write(fd, chunk) except OSError as e: if e.errno == errno.EPIPE: close_unregister_and_remove(fd) else: raise else: if input_offset >= len(input): close_unregister_and_remove(fd) elif mode & select_POLLIN_POLLPRI: data = os.read(fd, 4096) if not data: close_unregister_and_remove(fd) fd2output[fd].append(data) else: # Ignore hang up or errors. close_unregister_and_remove(fd) return (stdout, stderr) def _communicate_with_select(self, input): read_set = [] write_set = [] stdout = None # Return stderr = None # Return if self.stdin and input: write_set.append(self.stdin) if self.stdout: read_set.append(self.stdout) stdout = [] if self.stderr: read_set.append(self.stderr) stderr = [] input_offset = 0 while read_set or write_set: try: rlist, wlist, xlist = select.select(read_set, write_set, []) except select.error, e: if e.args[0] == errno.EINTR: continue raise if self.stdin in wlist: chunk = input[input_offset : input_offset + _PIPE_BUF] try: bytes_written = os.write(self.stdin.fileno(), chunk) except OSError as e: if e.errno == errno.EPIPE: self.stdin.close() write_set.remove(self.stdin) else: raise else: input_offset += bytes_written if input_offset >= len(input): self.stdin.close() write_set.remove(self.stdin) if self.stdout in rlist: data = os.read(self.stdout.fileno(), 1024) if data == "": self.stdout.close() read_set.remove(self.stdout) stdout.append(data) if self.stderr in rlist: data = os.read(self.stderr.fileno(), 1024) if data == "": self.stderr.close() read_set.remove(self.stderr) stderr.append(data) return (stdout, stderr) def send_signal(self, sig): """Send a signal to the process """ os.kill(self.pid, sig) def terminate(self): """Terminate the process with SIGTERM """ self.send_signal(signal.SIGTERM) def kill(self): """Kill the process with SIGKILL """ self.send_signal(signal.SIGKILL) def _demo_posix(): # # Example 1: Simple redirection: Get process list # plist = Popen(["ps"], stdout=PIPE).communicate()[0] print "Process list:" print plist # # Example 2: Change uid before executing child # if os.getuid() == 0: p = Popen(["id"], preexec_fn=lambda: os.setuid(100)) p.wait() # # Example 3: Connecting several subprocesses # print "Looking for 'hda'..." p1 = Popen(["dmesg"], stdout=PIPE) p2 = Popen(["grep", "hda"], stdin=p1.stdout, stdout=PIPE) print repr(p2.communicate()[0]) # # Example 4: Catch execution error # print print "Trying a weird file..." try: print Popen(["/this/path/does/not/exist"]).communicate() except OSError, e: if e.errno == errno.ENOENT: print "The file didn't exist. I thought so..." print "Child traceback:" print e.child_traceback else: print "Error", e.errno else: print >>sys.stderr, "Gosh. No error." def _demo_windows(): # # Example 1: Connecting several subprocesses # print "Looking for 'PROMPT' in set output..." p1 = Popen("set", stdout=PIPE, shell=True) p2 = Popen('find "PROMPT"', stdin=p1.stdout, stdout=PIPE) print repr(p2.communicate()[0]) # # Example 2: Simple execution of program # print "Executing calc..." p = Popen("calc") p.wait() if __name__ == "__main__": if mswindows: _demo_windows() else: _demo_posix() DisplayCAL-3.1.0.0/DisplayCAL/technology_strings-1.7.0.json0000644000076500000000000000140312647526531022710 0ustar devwheel00000000000000{ "c": "CRT", "m": "Plasma", "l": "LCD", "1": "LCD CCFL", "2": "LCD CCFL IPS", "3": "LCD CCFL VPA", "4": "LCD CCFL TFT", "L": "LCD CCFL Wide Gamut", "5": "LCD CCFL Wide Gamut IPS", "6": "LCD CCFL Wide Gamut VPA", "7": "LCD CCFL Wide Gamut TFT", "e": "LCD White LED", "8": "LCD White LED IPS", "9": "LCD White LED VPA", "a": "LCD White LED TFT", "b": "LCD RGB LED", "b": "LCD RGB LED IPS", "c": "LCD RGB LED VPA", "d": "LCD RGB LED TFT", "h": "LCD RG Phosphor", "e": "LCD RG Phosphor IPS", "f": "LCD RG Phosphor VPA", "g": "LCD RG Phosphor TFT", "o": "LED OLED", "a": "LED AMOLED", "p": "DLP Projector", "h": "DLP Projector RGB Filter Wheel", "i": "DPL Projector RGBW Filter Wheel", "j": "DLP Projector RGBCMY Filter Wheel", "u": "Unknown" } DisplayCAL-3.1.0.0/DisplayCAL/technology_strings-1.7.1.json0000644000076500000000000000140312647526531022711 0ustar devwheel00000000000000{ "c": "CRT", "m": "Plasma", "l": "LCD", "1": "LCD CCFL", "2": "LCD CCFL IPS", "3": "LCD CCFL VPA", "4": "LCD CCFL TFT", "L": "LCD CCFL Wide Gamut", "5": "LCD CCFL Wide Gamut IPS", "6": "LCD CCFL Wide Gamut VPA", "7": "LCD CCFL Wide Gamut TFT", "e": "LCD White LED", "8": "LCD White LED IPS", "9": "LCD White LED VPA", "d": "LCD White LED TFT", "b": "LCD RGB LED", "f": "LCD RGB LED IPS", "g": "LCD RGB LED VPA", "i": "LCD RGB LED TFT", "h": "LCD RG Phosphor", "j": "LCD RG Phosphor IPS", "k": "LCD RG Phosphor VPA", "n": "LCD RG Phosphor TFT", "o": "LED OLED", "a": "LED AMOLED", "p": "DLP Projector", "q": "DLP Projector RGB Filter Wheel", "r": "DPL Projector RGBW Filter Wheel", "s": "DLP Projector RGBCMY Filter Wheel", "u": "Unknown" } DisplayCAL-3.1.0.0/DisplayCAL/tempfile.py0000644000076500000000000000033712647526531017614 0ustar devwheel00000000000000# WRAPPER FOR PYTHON 2.5 # This module exists only to make sure that other module's imports of tempfile # end up with a version that has the SpooledTemporaryFile class (introduced in # Python 2.6) from tempfile26 import * DisplayCAL-3.1.0.0/DisplayCAL/tempfile26.py0000644000076500000000000004411612647526531017767 0ustar devwheel00000000000000"""Temporary files. This module provides generic, low- and high-level interfaces for creating temporary files and directories. The interfaces listed as "safe" just below can be used without fear of race conditions. Those listed as "unsafe" cannot, and are provided for backward compatibility only. This module also provides some data items to the user: TMP_MAX - maximum number of names that will be tried before giving up. template - the default prefix for all temporary names. You may change this to control the default prefix. tempdir - If this is set to a string before the first use of any routine from this module, it will be considered as another candidate location to store temporary files. """ __all__ = [ "NamedTemporaryFile", "TemporaryFile", # high level safe interfaces "SpooledTemporaryFile", "mkstemp", "mkdtemp", # low level safe interfaces "mktemp", # deprecated unsafe interface "TMP_MAX", "gettempprefix", # constants "tempdir", "gettempdir" ] # Imports. import os as _os import errno as _errno from random import Random as _Random try: from cStringIO import StringIO as _StringIO except ImportError: from StringIO import StringIO as _StringIO try: import fcntl as _fcntl except ImportError: def _set_cloexec(fd): pass else: def _set_cloexec(fd): try: flags = _fcntl.fcntl(fd, _fcntl.F_GETFD, 0) except IOError: pass else: # flags read successfully, modify flags |= _fcntl.FD_CLOEXEC _fcntl.fcntl(fd, _fcntl.F_SETFD, flags) try: import thread as _thread except ImportError: import dummy_thread as _thread _allocate_lock = _thread.allocate_lock _text_openflags = _os.O_RDWR | _os.O_CREAT | _os.O_EXCL if hasattr(_os, 'O_NOINHERIT'): _text_openflags |= _os.O_NOINHERIT if hasattr(_os, 'O_NOFOLLOW'): _text_openflags |= _os.O_NOFOLLOW _bin_openflags = _text_openflags if hasattr(_os, 'O_BINARY'): _bin_openflags |= _os.O_BINARY if hasattr(_os, 'TMP_MAX'): TMP_MAX = _os.TMP_MAX else: TMP_MAX = 10000 template = "tmp" # Internal routines. _once_lock = _allocate_lock() if hasattr(_os, "lstat"): _stat = _os.lstat elif hasattr(_os, "stat"): _stat = _os.stat else: # Fallback. All we need is something that raises os.error if the # file doesn't exist. def _stat(fn): try: f = open(fn) except IOError: raise _os.error f.close() def _exists(fn): try: _stat(fn) except _os.error: return False else: return True class _RandomNameSequence: """An instance of _RandomNameSequence generates an endless sequence of unpredictable strings which can safely be incorporated into file names. Each string is six characters long. Multiple threads can safely use the same instance at the same time. _RandomNameSequence is an iterator.""" characters = ("abcdefghijklmnopqrstuvwxyz" + "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "0123456789_") def __init__(self): self.mutex = _allocate_lock() self.rng = _Random() self.normcase = _os.path.normcase def __iter__(self): return self def next(self): m = self.mutex c = self.characters choose = self.rng.choice m.acquire() try: letters = [choose(c) for dummy in "123456"] finally: m.release() return self.normcase(''.join(letters)) def _candidate_tempdir_list(): """Generate a list of candidate temporary directories which _get_default_tempdir will try. Unlike the _candidate_tempdir_list of tempfile.py from the stdlib, this one supports Unicode.""" from util_os import getenvu dirlist = [] # First, try the environment. for envname in 'TMPDIR', 'TEMP', 'TMP': dirname = getenvu(envname) if dirname: dirlist.append(dirname) # Failing that, try OS-specific locations. if _os.name == 'riscos': dirname = getenvu('Wimp$ScrapDir') if dirname: dirlist.append(dirname) elif _os.name == 'nt': dirlist.extend([ r'c:\temp', r'c:\tmp', r'\temp', r'\tmp' ]) else: dirlist.extend([ '/tmp', '/var/tmp', '/usr/tmp' ]) # As a last resort, the current directory. try: dirlist.append(_os.getcwd()) except (AttributeError, _os.error): dirlist.append(_os.curdir) return dirlist def _get_default_tempdir(): """Calculate the default directory to use for temporary files. This routine should be called exactly once. We determine whether or not a candidate temp dir is usable by trying to create and write to a file in that directory. If this is successful, the test file is deleted. To prevent denial of service, the name of the test file must be randomized.""" namer = _RandomNameSequence() dirlist = _candidate_tempdir_list() flags = _text_openflags for dir in dirlist: if dir != _os.curdir: dir = _os.path.normcase(_os.path.abspath(dir)) # Try only a few names per directory. for seq in xrange(100): name = namer.next() filename = _os.path.join(dir, name) try: fd = _os.open(filename, flags, 0600) fp = _os.fdopen(fd, 'w') fp.write('blat') fp.close() _os.unlink(filename) del fp, fd return dir except (OSError, IOError), e: if e[0] != _errno.EEXIST: break # no point trying more names in this directory pass raise IOError, (_errno.ENOENT, ("No usable temporary directory found in %s" % dirlist)) _name_sequence = None def _get_candidate_names(): """Common setup sequence for all user-callable interfaces.""" global _name_sequence if _name_sequence is None: _once_lock.acquire() try: if _name_sequence is None: _name_sequence = _RandomNameSequence() finally: _once_lock.release() return _name_sequence def _mkstemp_inner(dir, pre, suf, flags): """Code common to mkstemp, TemporaryFile, and NamedTemporaryFile.""" names = _get_candidate_names() for seq in xrange(TMP_MAX): name = names.next() file = _os.path.join(dir, pre + name + suf) try: fd = _os.open(file, flags, 0600) _set_cloexec(fd) return (fd, _os.path.abspath(file)) except OSError, e: if e.errno == _errno.EEXIST: continue # try again raise raise IOError, (_errno.EEXIST, "No usable temporary file name found") # User visible interfaces. def gettempprefix(): """Accessor for tempdir.template.""" return template tempdir = None def gettempdir(): """Accessor for tempfile.tempdir.""" global tempdir if tempdir is None: _once_lock.acquire() try: if tempdir is None: tempdir = _get_default_tempdir() finally: _once_lock.release() return tempdir def mkstemp(suffix="", prefix=template, dir=None, text=False): """User-callable function to create and return a unique temporary file. The return value is a pair (fd, name) where fd is the file descriptor returned by os.open, and name is the filename. If 'suffix' is specified, the file name will end with that suffix, otherwise there will be no suffix. If 'prefix' is specified, the file name will begin with that prefix, otherwise a default prefix is used. If 'dir' is specified, the file will be created in that directory, otherwise a default directory is used. If 'text' is specified and true, the file is opened in text mode. Else (the default) the file is opened in binary mode. On some operating systems, this makes no difference. The file is readable and writable only by the creating user ID. If the operating system uses permission bits to indicate whether a file is executable, the file is executable by no one. The file descriptor is not inherited by children of this process. Caller is responsible for deleting the file when done with it. """ if dir is None: dir = gettempdir() if text: flags = _text_openflags else: flags = _bin_openflags return _mkstemp_inner(dir, prefix, suffix, flags) def mkdtemp(suffix="", prefix=template, dir=None): """User-callable function to create and return a unique temporary directory. The return value is the pathname of the directory. Arguments are as for mkstemp, except that the 'text' argument is not accepted. The directory is readable, writable, and searchable only by the creating user. Caller is responsible for deleting the directory when done with it. """ if dir is None: dir = gettempdir() names = _get_candidate_names() for seq in xrange(TMP_MAX): name = names.next() file = _os.path.join(dir, prefix + name + suffix) try: _os.mkdir(file, 0700) return file except OSError, e: if e.errno == _errno.EEXIST: continue # try again raise raise IOError, (_errno.EEXIST, "No usable temporary directory name found") def mktemp(suffix="", prefix=template, dir=None): """User-callable function to return a unique temporary file name. The file is not created. Arguments are as for mkstemp, except that the 'text' argument is not accepted. This function is unsafe and should not be used. The file name refers to a file that did not exist at some point, but by the time you get around to creating it, someone else may have beaten you to the punch. """ ## from warnings import warn as _warn ## _warn("mktemp is a potential security risk to your program", ## RuntimeWarning, stacklevel=2) if dir is None: dir = gettempdir() names = _get_candidate_names() for seq in xrange(TMP_MAX): name = names.next() file = _os.path.join(dir, prefix + name + suffix) if not _exists(file): return file raise IOError, (_errno.EEXIST, "No usable temporary filename found") class _TemporaryFileWrapper: """Temporary file wrapper This class provides a wrapper around files opened for temporary use. In particular, it seeks to automatically remove the file when it is no longer needed. """ def __init__(self, file, name, delete=True): self.file = file self.name = name self.close_called = False self.delete = delete def __getattr__(self, name): # Attribute lookups are delegated to the underlying file # and cached for non-numeric results # (i.e. methods are cached, closed and friends are not) file = self.__dict__['file'] a = getattr(file, name) if not issubclass(type(a), type(0)): setattr(self, name, a) return a # The underlying __enter__ method returns the wrong object # (self.file) so override it to return the wrapper def __enter__(self): self.file.__enter__() return self # NT provides delete-on-close as a primitive, so we don't need # the wrapper to do anything special. We still use it so that # file.name is useful (i.e. not "(fdopen)") with NamedTemporaryFile. if _os.name != 'nt': # Cache the unlinker so we don't get spurious errors at # shutdown when the module-level "os" is None'd out. Note # that this must be referenced as self.unlink, because the # name TemporaryFileWrapper may also get None'd out before # __del__ is called. unlink = _os.unlink def close(self): if not self.close_called: self.close_called = True self.file.close() if self.delete: self.unlink(self.name) def __del__(self): self.close() # Need to trap __exit__ as well to ensure the file gets # deleted when used in a with statement def __exit__(self, exc, value, tb): result = self.file.__exit__(exc, value, tb) self.close() return result def NamedTemporaryFile(mode='w+b', bufsize=-1, suffix="", prefix=template, dir=None, delete=True): """Create and return a temporary file. Arguments: 'prefix', 'suffix', 'dir' -- as for mkstemp. 'mode' -- the mode argument to os.fdopen (default "w+b"). 'bufsize' -- the buffer size argument to os.fdopen (default -1). 'delete' -- whether the file is deleted on close (default True). The file is created as mkstemp() would do it. Returns an object with a file-like interface; the name of the file is accessible as file.name. The file will be automatically deleted when it is closed unless the 'delete' argument is set to False. """ if dir is None: dir = gettempdir() if 'b' in mode: flags = _bin_openflags else: flags = _text_openflags # Setting O_TEMPORARY in the flags causes the OS to delete # the file when it is closed. This is only supported by Windows. if _os.name == 'nt' and delete: flags |= _os.O_TEMPORARY (fd, name) = _mkstemp_inner(dir, prefix, suffix, flags) file = _os.fdopen(fd, mode, bufsize) return _TemporaryFileWrapper(file, name, delete) if _os.name != 'posix' or _os.sys.platform == 'cygwin': # On non-POSIX and Cygwin systems, assume that we cannot unlink a file # while it is open. TemporaryFile = NamedTemporaryFile else: def TemporaryFile(mode='w+b', bufsize=-1, suffix="", prefix=template, dir=None): """Create and return a temporary file. Arguments: 'prefix', 'suffix', 'dir' -- as for mkstemp. 'mode' -- the mode argument to os.fdopen (default "w+b"). 'bufsize' -- the buffer size argument to os.fdopen (default -1). The file is created as mkstemp() would do it. Returns an object with a file-like interface. The file has no name, and will cease to exist when it is closed. """ if dir is None: dir = gettempdir() if 'b' in mode: flags = _bin_openflags else: flags = _text_openflags (fd, name) = _mkstemp_inner(dir, prefix, suffix, flags) try: _os.unlink(name) return _os.fdopen(fd, mode, bufsize) except: _os.close(fd) raise class SpooledTemporaryFile: """Temporary file wrapper, specialized to switch from StringIO to a real file when it exceeds a certain size or when a fileno is needed. """ _rolled = False def __init__(self, max_size=0, mode='w+b', bufsize=-1, suffix="", prefix=template, dir=None): self._file = _StringIO() self._max_size = max_size self._rolled = False self._TemporaryFileArgs = (mode, bufsize, suffix, prefix, dir) def _check(self, file): if self._rolled: return max_size = self._max_size if max_size and file.tell() > max_size: self.rollover() def rollover(self): if self._rolled: return file = self._file newfile = self._file = TemporaryFile(*self._TemporaryFileArgs) del self._TemporaryFileArgs newfile.write(file.getvalue()) newfile.seek(file.tell(), 0) self._rolled = True # The method caching trick from NamedTemporaryFile # won't work here, because _file may change from a # _StringIO instance to a real file. So we list # all the methods directly. # Context management protocol def __enter__(self): if self._file.closed: raise ValueError("Cannot enter context with closed file") return self def __exit__(self, exc, value, tb): self._file.close() # file protocol def __iter__(self): return self._file.__iter__() def close(self): self._file.close() @property def closed(self): return self._file.closed @property def encoding(self): return self._file.encoding def fileno(self): self.rollover() return self._file.fileno() def flush(self): self._file.flush() def isatty(self): return self._file.isatty() @property def mode(self): return self._file.mode @property def name(self): return self._file.name @property def newlines(self): return self._file.newlines def next(self): return self._file.next def read(self, *args): return self._file.read(*args) def readline(self, *args): return self._file.readline(*args) def readlines(self, *args): return self._file.readlines(*args) def seek(self, *args): self._file.seek(*args) @property def softspace(self): return self._file.softspace def tell(self): return self._file.tell() def truncate(self): self._file.truncate() def write(self, s): file = self._file rv = file.write(s) self._check(file) return rv def writelines(self, iterable): file = self._file rv = file.writelines(iterable) self._check(file) return rv def xreadlines(self, *args): return self._file.xreadlines(*args) DisplayCAL-3.1.0.0/DisplayCAL/test.cal0000644000076500000000000002051112647526531017071 0ustar devwheel00000000000000CAL DESCRIPTOR "Argyll Device Calibration State" ORIGINATOR "Argyll dispcal" CREATED "Wed Dec 24 20:08:15 2008" KEYWORD "DEVICE_CLASS" DEVICE_CLASS "DISPLAY" KEYWORD "COLOR_REP" COLOR_REP "RGB" KEYWORD "RGB_I" NUMBER_OF_FIELDS 4 BEGIN_DATA_FORMAT RGB_I RGB_R RGB_G RGB_B END_DATA_FORMAT NUMBER_OF_SETS 256 BEGIN_DATA 0.00000 0.20000 0.20000 0.20000 0.00392 0.20235 0.20235 0.20235 0.00784 0.20471 0.20471 0.20471 0.01176 0.20706 0.20706 0.20706 0.01569 0.20941 0.20941 0.20941 0.01961 0.21176 0.21176 0.21176 0.02353 0.21412 0.21412 0.21412 0.02745 0.21647 0.21647 0.21647 0.03137 0.21882 0.21882 0.21882 0.03529 0.22118 0.22118 0.22118 0.03922 0.22353 0.22353 0.22353 0.04314 0.22588 0.22588 0.22588 0.04706 0.22824 0.22824 0.22824 0.05098 0.23059 0.23059 0.23059 0.05490 0.23294 0.23294 0.23294 0.05882 0.23529 0.23529 0.23529 0.06275 0.23765 0.23765 0.23765 0.06667 0.24000 0.24000 0.24000 0.07059 0.24235 0.24235 0.24235 0.07451 0.24471 0.24471 0.24471 0.07843 0.24706 0.24706 0.24706 0.08235 0.24941 0.24941 0.24941 0.08627 0.25176 0.25176 0.25176 0.09020 0.25412 0.25412 0.25412 0.09412 0.25647 0.25647 0.25647 0.09804 0.25882 0.25882 0.25882 0.10196 0.26118 0.26118 0.26118 0.10588 0.26353 0.26353 0.26353 0.10980 0.26588 0.26588 0.26588 0.11373 0.26824 0.26824 0.26824 0.11765 0.27059 0.27059 0.27059 0.12157 0.27294 0.27294 0.27294 0.12549 0.27529 0.27529 0.27529 0.12941 0.27765 0.27765 0.27765 0.13333 0.28000 0.28000 0.28000 0.13725 0.28235 0.28235 0.28235 0.14118 0.28471 0.28471 0.28471 0.14510 0.28706 0.28706 0.28706 0.14902 0.28941 0.28941 0.28941 0.15294 0.29176 0.29176 0.29176 0.15686 0.29412 0.29412 0.29412 0.16078 0.29647 0.29647 0.29647 0.16471 0.29882 0.29882 0.29882 0.16863 0.30118 0.30118 0.30118 0.17255 0.30353 0.30353 0.30353 0.17647 0.30588 0.30588 0.30588 0.18039 0.30824 0.30824 0.30824 0.18431 0.31059 0.31059 0.31059 0.18824 0.31294 0.31294 0.31294 0.19216 0.31529 0.31529 0.31529 0.19608 0.31765 0.31765 0.31765 0.20000 0.32000 0.32000 0.32000 0.20392 0.32235 0.32235 0.32235 0.20784 0.32471 0.32471 0.32471 0.21176 0.32706 0.32706 0.32706 0.21569 0.32941 0.32941 0.32941 0.21961 0.33176 0.33176 0.33176 0.22353 0.33412 0.33412 0.33412 0.22745 0.33647 0.33647 0.33647 0.23137 0.33882 0.33882 0.33882 0.23529 0.34118 0.34118 0.34118 0.23922 0.34353 0.34353 0.34353 0.24314 0.34588 0.34588 0.34588 0.24706 0.34824 0.34824 0.34824 0.25098 0.35059 0.35059 0.35059 0.25490 0.35294 0.35294 0.35294 0.25882 0.35529 0.35529 0.35529 0.26275 0.35765 0.35765 0.35765 0.26667 0.36000 0.36000 0.36000 0.27059 0.36235 0.36235 0.36235 0.27451 0.36471 0.36471 0.36471 0.27843 0.36706 0.36706 0.36706 0.28235 0.36941 0.36941 0.36941 0.28627 0.37176 0.37176 0.37176 0.29020 0.37412 0.37412 0.37412 0.29412 0.37647 0.37647 0.37647 0.29804 0.37882 0.37882 0.37882 0.30196 0.38118 0.38118 0.38118 0.30588 0.38353 0.38353 0.38353 0.30980 0.38588 0.38588 0.38588 0.31373 0.38824 0.38824 0.38824 0.31765 0.39059 0.39059 0.39059 0.32157 0.39294 0.39294 0.39294 0.32549 0.39529 0.39529 0.39529 0.32941 0.39765 0.39765 0.39765 0.33333 0.40000 0.40000 0.40000 0.33725 0.40235 0.40235 0.40235 0.34118 0.40471 0.40471 0.40471 0.34510 0.40706 0.40706 0.40706 0.34902 0.40941 0.40941 0.40941 0.35294 0.41176 0.41176 0.41176 0.35686 0.41412 0.41412 0.41412 0.36078 0.41647 0.41647 0.41647 0.36471 0.41882 0.41882 0.41882 0.36863 0.42118 0.42118 0.42118 0.37255 0.42353 0.42353 0.42353 0.37647 0.42588 0.42588 0.42588 0.38039 0.42824 0.42824 0.42824 0.38431 0.43059 0.43059 0.43059 0.38824 0.43294 0.43294 0.43294 0.39216 0.43529 0.43529 0.43529 0.39608 0.43765 0.43765 0.43765 0.40000 0.44000 0.44000 0.44000 0.40392 0.44235 0.44235 0.44235 0.40784 0.44471 0.44471 0.44471 0.41176 0.44706 0.44706 0.44706 0.41569 0.44941 0.44941 0.44941 0.41961 0.45176 0.45176 0.45176 0.42353 0.45412 0.45412 0.45412 0.42745 0.45647 0.45647 0.45647 0.43137 0.45882 0.45882 0.45882 0.43529 0.46118 0.46118 0.46118 0.43922 0.46353 0.46353 0.46353 0.44314 0.46588 0.46588 0.46588 0.44706 0.46824 0.46824 0.46824 0.45098 0.47059 0.47059 0.47059 0.45490 0.47294 0.47294 0.47294 0.45882 0.47529 0.47529 0.47529 0.46275 0.47765 0.47765 0.47765 0.46667 0.48000 0.48000 0.48000 0.47059 0.48235 0.48235 0.48235 0.47451 0.48471 0.48471 0.48471 0.47843 0.48706 0.48706 0.48706 0.48235 0.48941 0.48941 0.48941 0.48627 0.49176 0.49176 0.49176 0.49020 0.49412 0.49412 0.49412 0.49412 0.49647 0.49647 0.49647 0.49804 0.49882 0.49882 0.49882 0.50196 0.50118 0.50118 0.50118 0.50588 0.50353 0.50353 0.50353 0.50980 0.50588 0.50588 0.50588 0.51373 0.50824 0.50824 0.50824 0.51765 0.51059 0.51059 0.51059 0.52157 0.51294 0.51294 0.51294 0.52549 0.51529 0.51529 0.51529 0.52941 0.51765 0.51765 0.51765 0.53333 0.52000 0.52000 0.52000 0.53725 0.52235 0.52235 0.52235 0.54118 0.52471 0.52471 0.52471 0.54510 0.52706 0.52706 0.52706 0.54902 0.52941 0.52941 0.52941 0.55294 0.53176 0.53176 0.53176 0.55686 0.53412 0.53412 0.53412 0.56078 0.53647 0.53647 0.53647 0.56471 0.53882 0.53882 0.53882 0.56863 0.54118 0.54118 0.54118 0.57255 0.54353 0.54353 0.54353 0.57647 0.54588 0.54588 0.54588 0.58039 0.54824 0.54824 0.54824 0.58431 0.55059 0.55059 0.55059 0.58824 0.55294 0.55294 0.55294 0.59216 0.55529 0.55529 0.55529 0.59608 0.55765 0.55765 0.55765 0.60000 0.56000 0.56000 0.56000 0.60392 0.56235 0.56235 0.56235 0.60784 0.56471 0.56471 0.56471 0.61176 0.56706 0.56706 0.56706 0.61569 0.56941 0.56941 0.56941 0.61961 0.57176 0.57176 0.57176 0.62353 0.57412 0.57412 0.57412 0.62745 0.57647 0.57647 0.57647 0.63137 0.57882 0.57882 0.57882 0.63529 0.58118 0.58118 0.58118 0.63922 0.58353 0.58353 0.58353 0.64314 0.58588 0.58588 0.58588 0.64706 0.58824 0.58824 0.58824 0.65098 0.59059 0.59059 0.59059 0.65490 0.59294 0.59294 0.59294 0.65882 0.59529 0.59529 0.59529 0.66275 0.59765 0.59765 0.59765 0.66667 0.60000 0.60000 0.60000 0.67059 0.60235 0.60235 0.60235 0.67451 0.60471 0.60471 0.60471 0.67843 0.60706 0.60706 0.60706 0.68235 0.60941 0.60941 0.60941 0.68627 0.61176 0.61176 0.61176 0.69020 0.61412 0.61412 0.61412 0.69412 0.61647 0.61647 0.61647 0.69804 0.61882 0.61882 0.61882 0.70196 0.62118 0.62118 0.62118 0.70588 0.62353 0.62353 0.62353 0.70980 0.62588 0.62588 0.62588 0.71373 0.62824 0.62824 0.62824 0.71765 0.63059 0.63059 0.63059 0.72157 0.63294 0.63294 0.63294 0.72549 0.63529 0.63529 0.63529 0.72941 0.63765 0.63765 0.63765 0.73333 0.64000 0.64000 0.64000 0.73725 0.64235 0.64235 0.64235 0.74118 0.64471 0.64471 0.64471 0.74510 0.64706 0.64706 0.64706 0.74902 0.64941 0.64941 0.64941 0.75294 0.65176 0.65176 0.65176 0.75686 0.65412 0.65412 0.65412 0.76078 0.65647 0.65647 0.65647 0.76471 0.65882 0.65882 0.65882 0.76863 0.66118 0.66118 0.66118 0.77255 0.66353 0.66353 0.66353 0.77647 0.66588 0.66588 0.66588 0.78039 0.66824 0.66824 0.66824 0.78431 0.67059 0.67059 0.67059 0.78824 0.67294 0.67294 0.67294 0.79216 0.67529 0.67529 0.67529 0.79608 0.67765 0.67765 0.67765 0.80000 0.68000 0.68000 0.68000 0.80392 0.68235 0.68235 0.68235 0.80784 0.68471 0.68471 0.68471 0.81176 0.68706 0.68706 0.68706 0.81569 0.68941 0.68941 0.68941 0.81961 0.69176 0.69176 0.69176 0.82353 0.69412 0.69412 0.69412 0.82745 0.69647 0.69647 0.69647 0.83137 0.69882 0.69882 0.69882 0.83529 0.70118 0.70118 0.70118 0.83922 0.70353 0.70353 0.70353 0.84314 0.70588 0.70588 0.70588 0.84706 0.70824 0.70824 0.70824 0.85098 0.71059 0.71059 0.71059 0.85490 0.71294 0.71294 0.71294 0.85882 0.71529 0.71529 0.71529 0.86275 0.71765 0.71765 0.71765 0.86667 0.72000 0.72000 0.72000 0.87059 0.72235 0.72235 0.72235 0.87451 0.72471 0.72471 0.72471 0.87843 0.72706 0.72706 0.72706 0.88235 0.72941 0.72941 0.72941 0.88627 0.73176 0.73176 0.73176 0.89020 0.73412 0.73412 0.73412 0.89412 0.73647 0.73647 0.73647 0.89804 0.73882 0.73882 0.73882 0.90196 0.74118 0.74118 0.74118 0.90588 0.74353 0.74353 0.74353 0.90980 0.74588 0.74588 0.74588 0.91373 0.74824 0.74824 0.74824 0.91765 0.75059 0.75059 0.75059 0.92157 0.75294 0.75294 0.75294 0.92549 0.75529 0.75529 0.75529 0.92941 0.75765 0.75765 0.75765 0.93333 0.76000 0.76000 0.76000 0.93725 0.76235 0.76235 0.76235 0.94118 0.76471 0.76471 0.76471 0.94510 0.76706 0.76706 0.76706 0.94902 0.76941 0.76941 0.76941 0.95294 0.77176 0.77176 0.77176 0.95686 0.77412 0.77412 0.77412 0.96078 0.77647 0.77647 0.77647 0.96471 0.77882 0.77882 0.77882 0.96863 0.78118 0.78118 0.78118 0.97255 0.78353 0.78353 0.78353 0.97647 0.78588 0.78588 0.78588 0.98039 0.78824 0.78824 0.78824 0.98431 0.79059 0.79059 0.79059 0.98824 0.79294 0.79294 0.79294 0.99216 0.79529 0.79529 0.79529 0.99608 0.79765 0.79765 0.79765 1.00000 0.80000 0.80000 0.80000 END_DATA DisplayCAL-3.1.0.0/DisplayCAL/theme/0000755000076500000000000000000012653527012016524 5ustar devwheel00000000000000DisplayCAL-3.1.0.0/DisplayCAL/theme/beep_boop.wav0000644000076500000000000015424412647526531021217 0ustar devwheel00000000000000RIFFWAVEfmt "VXdatax mm##))|z,,^^JJZZ#$$#33OOih  zw 8900 EF~$$  9; !wvW W . . wv 44kjww  Y Y Z\ ef BDvw VVgg ji99ll ##SSJJ k j ut pp@@* *  88]^  00ZZk k HH551 0 ZYR Q KM33\\L M LL&&9 8 46]]c e EDFF  IH69 { y    ?>  Z \ HFgh67 UU(+uq./ QQSQ igKL `b ''utc d   rr~}GH ``9 9 G J a`25 )*   nn\^ NN cc st\] r s     GFHI; ; D C ./ IJ \\nn  n m 01 ^] VUYX ,)TK?< DBq"@G BLiQ5A a z K!+  wh 7>& C$ ( vBg~LT l ;R23nI . A!,c< F =3Kk"V` + 6v_NV  f99ar - &3V  JJx=| 7 | @ S~Bn H 9&G ~  =`4" Z -bObD X OmP h D] ^ S A(_.* D & VPF A:+. ' k % OW #Q  X /3 iU  ^ "UL  %"< Nj@  $ ?w;6 D J : [I |Y`  V  *w4Aw F%vz s V Ggal f|k'M gh&_m Q9`]9$ | I'8 ?=\s5 zq n *8R(| d y"YL \ %UHAk) 0 L*VM) G `fP5!7; V m$ eh ! 61O:-a s    CIj j A c ';fRe }h}u v w 2O7 ~ m!Qcn  U,0 } tIC9 1 ', w &tmj W n #H+* } |B h 2z HA *| 8 2CH  * xXcNM  <5SX.M ~ A^1 Y > lVc!P k z mlE -1kQw } |20ISC w r^$' @ % dD< F m& _ ~ ?*!  >lq  v FDE3 `H 0 p i ?4*rB CX/ } h& vZ  (Ge @%kgw  f0m  L\m-'` ^ mw C D<  f U Ea 1DXtw< F  vu ujK" ! * {k bZ m C+:t_ V  |-?Ya 2  qeW '9{_ r"d pf,I   MG 3z& { V H F ~ 1C`j E p u@ +@p  $ u(V? 5~Cg$ BwJ  +w n `  )3nBcad & Z  &LEi`  W"  ` uK\2 *9  .s g n q:  LON5 [ x kE   ^ 1 Vra (8gW,Mz e" @ de>;  k F%i   [*u8} \  0- 2  ]Q , GR9~S* @ 6 >`6 P]M e Q? 85 ne=^N 7b.  SG, = k +  JVa$ ]?zM 0 Rd $ !WK , " f 0` i)= iH$ ( 9_`t Z  IT # gd^  Y av'Q[ %  |{ <5 8 ( IXn  &Yp 8 Q}Om ` C M ?:b R V!j 0 g ?m: r bSpi   36|P 8EAs  Y is+L (H\ !I LNS7 y :y  I4=] h@A G  qQj$ &wn q , Em2 nL}~l6 . C|  B 7 :nY E M  |4I o a|ldze e 0Xsv p = Z\-kZ c p o  /'AqD 9 ) ]sZ+  p "  [  V,j3 + ) U W> @ .dAg}!> x lO X Xi ! X+g6] m 'BTv r @j ]@g@ F 4m=q j j r ~ $*\"?wk %X . ! r+o |5P Y _zu b KHc Hd<>.Dl V 5nt N  U N Fvz c ,J$<c" T *z}Q vo% X Z4z\ & 6D&#=~ C ^hT5 Q a ) DaKGrq / ]  F 6 a>x( T Of@$-n  z Xl;&x l qZ 2^7I, + !z  ]Og Kp55V C B ;ozFZ    E w x yN Tq_\c  E pO9 3@_ x y ; ) h 6eGU2C } x k U.{ WO - '(r  AA{K ;I?t *; /1BP7g T@  : Pg' 1q|=e b @ o r fI)  [ (rYWvW u %"_~ e 4# _ b)sq`1 w r N fUaQc .o99o_e D E / & j\yJ 8 2  dP9) H 1n@' s U 5cu b KDEK  1<T n 7  PSG  o 3.{13 SnA\K-M!  # 1Z=P2 ]A. R  FI ?k j ) p JV77N] x E N:> y ;%" ; h M1LJ j g Y  ` :E 3  L&yl\ X ?9 q > =8  7 zwp & ^  `h  01%* v  <<$9ka Fq!> . K u_ G w| 7Q.`| D 6A1 r xNP Ty I"[/ t *K9 gL; `   a;% 2| C E \ l' NtOJ  w &8XU# s)(r v?=  (z% " j ! g,yYw l  n ^:2} 9 _ F Q$ : $ IvAm k q "+g ? j@c" ] U] &  } &  rg 4 90e e>Si & 5Ht {0m W Edziu I O4, x <xL7kQ G[ >/ e $ |P   T3D \7CF f #  0 6{sxZ N ` Z +7Q  Ok / rDBv c">6  )`&  SZs, $ 5vOE & 0ZWi A l 6r + =] x \) - fD$Z W b>q/ 4 M9 \6# '  U*Ke 8 D> K &zpx 2 k,- 7 u 8  & Bv"/o V 0jqg " X 7* T p <=Oi ! C#(   )v- $ 0v  y&xULtB=oO yDn.8bKa8\16OBbP+QP=I@8E!Qt mHD@C;N MP=c@/I"KKO#"z2%g0$ );khSi@< n ]>6>kt[C[@I4~Vpo"(i5( Xu2 s%9k |}G#*>tT 3.[^0/{f;D5j8dVt5~X|!6eztsZ]:F3(%;ug2b=|cBfh"]ZJ Qr!=npEEYAJFP  6EN !,<8k\2"mX{F(_I>J)EKLKA9c^< A$ { / 737E$% fCTg8/,NV,"<PW  FF|NOgWM-@ N}#r5z8gni$3[GcEx6^i A{m!{cQm2=MF-yiyzyiM3zA7mWkN8^"(|)L)-2F/`*?hSc3sc wZ^RSeo$)[`{ KR\$y|`Ctf0ww%~qZL=%y49Y]s7G H&_D]UX}2G&-*4~/@ sMID}id#~& wjWb$-w;\W?VSY?lT2no|`l9id~y#ye8e\DlIX@K[o>\u:dJ>GT_s{}S2DJ&U6{`.7d]DsD2)*IX#yS,{gx  +\?eWX=~dIM7J[}>,x$,qB3G4t Q^EX +'/u)@>.wC/:aSE^K:M}I:#QtbJV2D*j!CI0GDN6>E< P0]xLUzc[]YjeD2(wll)'4.-R22H3 ZWcU.W;0g;1uo~0?Q}W9xH M@JqQ[X0Rh(|UgM s4m .I^p. x0`6>_Km9 .lYR,XEls_HEO`:IAF)25ee a/0 6}<KoXvs&}`)f]'r(fe!&ccN+Pr:Q1 qaC12pVwuxse1MS% F+Uf_'Z/VgqagFGQ0G\0;b\wY7 Hr&5$Yql$ip~qed)oThhA=a<{j8E$>j/'wx= p5W>?Dq~ptpyKBq\G%FFv?r]Z ]CoyK?d7MS0a$c bvzBYLW1 xd;u%b'RF}mi#_wu(F]ShvRTQ|p((ezyI3R/@iY>kf)"N~pCB,%iURMsU@K9\Lj;.o'/&S]D:%UW>|":7q#AW,l/UJWd r(A|eJ1h_? Zx4lSU2' T9e/>0WU6NA8x>YU.jFYBV%4ig;_h1@;zrwiG3f`;m9R*d=P ^N t ]"7% <"R'Q#sjlIi0~;- Y{ H#%KW=?ACD)!~Ut|=$uC)TG]WY=W/M!H8_~okzO b.4$%h OgLt4$6\cyrJ`h>;g*? U/V>kW1t=U~ @&dE Wbvd.vS7 4cM{ envh\0fj 98,G42(>Yytc4d7,+G a]Yl1rg/E45M\SW]?E}O6a>a- h!:7 =E(TV4xV=r"|"D6JK?- [Aido*D0-W%Rs ^x+)?3ftvp(wEMqC,&AeP*07S,vH4a/_o\9a*F su:M4OGMztzp6# }T.qQ 5u"V^i R3.cLp ?_9]=XOhkc<DBa8S/}@j1k\FyYX c+kbJtoYsK}lwk-3PUHODz#D0Yp@!CkC8j{UO,'lbLaX5"4mROPoD-FX?ju8)\E.:R"x].-PPDJDG L=O[D;nKDj|FG y2p^2FitcT895L_Y_~sa rkG K`P<xD+CYEnLng8 }1}f,x 't:sKQR(Iq53|9zHM@K+*e GALrdwiuCV' o?#FJ]lv $4v458u**@H3;sj|_gg=ug[a4&- m dU5})-]8Q  1'pH}n>)Yd;~ '| F(.gB_@Em 2?a "]9dedelc61Uc*9 S&D :c[f"!dt^\H@_@i:'rn10/ yLVc[&FRE]*X MB=$k?M|g5IWX l}PtbF"cg DP\b KR[(?vLkHLG i2mmSX$ f'FZT Cq /JJK b 96_in^;hY<\2( 2H "t'c"Jn{B8MQ-?\*N>Px9vMDK4OGMVl&'.v6<0BUa:;/G,zAz:NFm[6t},7/ _'"1_#"hr}2d5=+&Z . gsK Q+!-)Ta'MJ(j`d 0|hP59wh|@ 1tepd%#xh;,H|i|3],+[&q}{thq/-4n_nphx\H R.HXH'+PrY]#?H[o wI r_X>Ox `O"Si)O20Q,0G@w[llyE;Fq@\|yY g1wNEkjGiNnJ8vwjlubl2|[@Xrb69_Kj*G1 -?j~k>R7QH?uHhdL U1PQYjRo{cZdEN58LooqgGJI8cpHYW9]|Zk_o?DJ-hF*_K7o.dT_TyX`0n,lM]&X)v %0{#s_ .epNn)zw^*{!SpAUsYEvhJn>UI3qp>fFS>7,{[oVz:.QAj^NM0oMj r2xFFT } GHc%c?t:  veB t0^m jd<QS`qxD(a5Xr, 'p[u}NzTy_S!Ra)Nr$RPpu^F <Qvv&e^d4-b+pvor/72G!v7:RQlI0fM+Tm\;Q#[y4lr}6br+)cNP@*qr2/sge|e?Y0rRqBhen>M,,j=T'Sxabtmu@;7Qc&N3{sxl*ZB7U[d%bR$ W@%\,B o ?9+~ qOd9.f"t\drWUVr|h) zy.4dtVOy^z|W.fLnv1V-N^tNP/ B_y?\u89[0='*l1V2)Tccj1)BBq zL<OTW?%#~Pv9BB*8LZ3` :N0E:aX\C!Oq aL}Ra-lvv#GtuYMp-ocAjka iW`sR`ecm"  [9Oq4e;Hb59BxmV`z*"IMtO}"+HLi<7er*MA~O-OGko5gTp]3 I\T G\Z5 V0iWyz1Kw;[V jVJM@cRHrQ`2iTsIkV_c=Y `uv!sP< F)kBYP6(Woyimcsm /\0 pHwKpIH:eLI_a(_RWURqH`LO[? :uBf>_2Ek;8Esl}{mnf+m1aCfGr OGz=LBGIc'ZQAQSwr1\EiV7.LW)[CG]13Gwtzvxl^8jFhC{P~%TW{0eZD"pNLfkEhkxv5FI_tDw>Uo3 M7U/ v:-3rs^^v)u]Rzt % TaTLu(SPXvAX/hVy5!WGkj(lRoQ;;S\*5S B-#b3QF uXyuwl\d-n>uOy%VUx>dY6'nN_IZME]m?Q5kR,*CS.a;M`8/Esz||`dw7p']^el @_lRT{!u[H kgO^Xos:_Qf]6EN`2'U 88%l;G<r]f`ks]Du "JhIK:cPCwT`QTHCUq5Y3hJ7$N_0)V>>% i7;=smf`r1r'\[izGjeOD1wSF ]kE S`t1ZCeU?;Wf+'N B8,i/E9y_{Yh|k f[xq! ^h [Yp,YYD"o@]PQ:#=Hj/k;l=5*K[09]:-e:JHpbwzohj .e. jS{fLm*cR1;wRMMfI Jct8O;dW99N_-U?J$e34Cyt|uK o0hkkn muVey&ZRC$uJWWUG$JAlv=tVbJ2,L@Y83c50c<MM$n\ryZ ix#ggXu ]H_F\C-Ys 0AQ/*A@m5Z:7-H\1(\?B`02D~z~qSr Bo"`sj Iz ZH4:}UN RbLNQvo=hOjS*"LBM|(&cD<T0CK(yewoJr&i ferf}Acy&eF.8~aU FZV AIzmEn LnI 'FBG.` L5Q'GB*akIs&&s Zjv p:j8mI&x1|ej 7D[/+:mHz Ao6 *;CJ D!~Y,}2a>MiB L_{W6fyG!*"B_ZH7,]z/kzk{yz8$iA[K!x=uzfFVx}kxr5c)W_(L Q *Fk3&f;3Kl 2{Ncj<)kg(dE]v#WZC ~EBg"-wc*kKgte`L{7Uh-vV>h4gm!^JQ|2OY5|R6d4skfN]u!^bA w@Mk&o\6h;]o^OEy>IY(xZ2`:nn`UVw+Ve7uICl/ka+gEXr% XV;yGC^$sa)`Ber [XMx5Mg-!sR7j9fg cMOt-U[2wM<a,ng!\I\s#TY@vACe*o[-gA]m_VEw=M^&v[3a7kq [NS}3J`1{T7i 8ro !eM\1zX[> UzA_&p&\<i$ {SOLK|D[$ i2_8ox^IUFsQU0 fz=Z#|&yW9b6 qNK?Zz=Yw.~Z5f-vWFDQwNPp>Tm &zT2MA|LB)_?Nmt/V)Q}5V@2yTPOog?XZu#+Y6@xBRM"s[C[em0`9Ow/`P5vLR]lb>`.[o \FAs;OX#oW;b1bf #eKKl*\_3 kBJm(`S.mGQ] ``9b0Kr /_H-vSUX llGa$Ty11c:3{O[LlhLXUw80_03|S^H qoTZ^~C.e+=,MjFwid^a~R$p&@9KwKyjshe}a$}&~|IGGL{z&fmnzl(qSL9Rq0}!Zw|mqt *jUzM1Yh5~ Owrsgy/__uR `_Fz"=s'lvU~+`kgWZ`Up&%}v8yp@x%igRSRiZa)twE{c*},j_>\HfWI8kqIT  7rX*h9!hX=BblTLJnVt29_['T^'^X7)nQuFDdOfI/^R(<sdP~;wIgIy7?YSV_.[W/*lVrAL_O iL=ZW!?q+cU~3xShCz1I`O SW:fU#*t'xT5}LvDb6>sNAS,{P+oM@o~B}JW80yP&8XJ8{p@D h%-tJ'QLmH;-pp=F-mJ'n:bH8Kaf?E v-qK"(^I8`TZDJ5 yg5wT&}bU?s@ZOTJ k_?a*t"kcMz2_ZeR]cFr$9~w'wvX} ihq[IjM}4:jv(y[sht`?kO9>izq- f{ j~m@r_dD=lgf>jk ~dr ?iZpG>l^^Fn`td}u4dZ|V9aUYS'h\jiu(jS|e1\\NP6`b\"hqozPr(Q^IbFPZQ9lth ~i P ClFjW;tgJCz#cn_\,w}Inp/WoEGGUtOro^Vd{!0EBun@_@gARHcPZ cH6Y+A=Pc:o=yA/?PX,>$n@3}!Y9$L#DjZK:~;ln:}8 JUe=T6U>eXG>9 jo9 z 6KW mC }U>MFi^K?=!dr@x-%QT')r? &v\:!D$Id +eN )$EG#U+ nQ#/ge +%*["`*T]4(tm}$#il'<dC%ek !~vu )mP Pp' m r|!Q: .%zS *jf0Vr%09%tE.0k](7Zo<?'u@ <4n]4=\ p)D>uCB.p[<;ak/EJu5!J,/tTE Cji6OY x)"O@5~K GExg6Kj {HM4@}@(A_1GpuIT07 ?/BzV2Djk HO1r.@.AmJ3 K`]!LH1f% I/Ce<=OZO,TJ/XR4I]/G YY>3 bP6MbEPUZ7dZ*K(r\193yYPJrRmX cJc* vG<jR7r"%msO{~ {jdk^\xI!f6GrBo)~_mfov@e<Yh3m|9Ttowk3hIb{[$mGvE}%t|b#oSkvLn,Ql<{}/{\s bst? m;]c1wz<|T~yf|p2r@jY%vvLtKs(in%|{J}Fq&`{]Bj:gmgq Oq/s0knH4iHd]]mTh{~z<vl7%iWgNMg0X\t q|C_&g*d^>H_;VLofGV {d4uZ-9XQW?fZ#MN li;W#*W&aX9WV 3PI~dq@T~[*oR2GWELCn]@Jqe0M$3VZI5]Z*?Ajo2H_!hH-IZ@D9rc7Axh)wE$6^OG4ab">Cwt1}L$i"WK1Lk .HApx<|Iu)`N,<p:J=aw<Jy~*cM,1w?I?S}<|Gk*dK|'#DH~:G#?vEb0cIs"IKz4<(Bt?Z8fGk'MIv'.2Ds6L<h>_.TBl#;Bo+;?h2U5Z;b)E<g,(<d%F 7Z0W/I9a !!08c<6Z(M.M4X$84\+4Y%?+O-O!>.U).V1'N*BA,K.+M$%H%5>*?2*E!$D&)>)64(<&%>#<'+5'5'";"9&%2'/#$6"5%%1(/&"5!6'# 0*. $'3 "2&#.*-#,0)/&"!)-) 2. 0-&+)/&#!5*5+#3&-"+3% :%5 ) ,.! "0. '   # !                                                                                        ! !# ""% $ ! $  "  "     $ !  ! !   #  # "% &  $ # && ## &'# !  % % " ! #!                                                                                                                                                                                                                                                                     DisplayCAL-3.1.0.0/DisplayCAL/theme/checkerboard-10x10x2-333-444.png0000644000076500000000000000021012647526531023507 0ustar devwheel00000000000000PNG  IHDRW?tEXtSoftwareAdobe ImageReadyqe<PLTE333@@@թڀIDATxb`҂Al.>IENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/dashed-16x2-666.png0000644000076500000000000000022312647526531021504 0ustar devwheel00000000000000PNG  IHDRf3tEXtSoftwareAdobe ImageReadyqe<PLTEfffstRNS0JIDATxb`F0`@$ IENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/dropdown-arrow.png0000644000076500000000000000040612647526531022226 0ustar devwheel00000000000000PNG  IHDR ڛg`tEXtSoftwareAdobe ImageReadyqe<IDATxb[`S1{3i~U ɏWn3:x)_ O>ϫ W3<#}/߿{ AL?g0 v=k[}1AV$8j&Yaa;k DVIENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/dropdown-arrow@2x.png0000644000076500000000000000076612647526531022611 0ustar devwheel00000000000000PNG  IHDR"LtEXtSoftwareAdobe ImageReadyqe<IDATxڬSKKQf""ئEm"\$DڃТhղ ;{(jDR>M;s'2,+qΜ}ߝaΑ=p IQdþJ9C$ ˄_p| ɏZ:̀G)weX4E+ hjk4.2$Bd-.rMNOF.T[!-y(Wз22  $^ #HCZ[YJEn(ބj#NړPxR(;5_|QN52*Fm3l!wu|rQS8uq߮&^*ú4ŗ5Lܧ8LHs]w55]l˳aP[3yIENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/engine_hum_loop.wav0000644000076500000000000222405412647526531022433 0ustar devwheel00000000000000RIFF$( WAVEfmt "VXdata( lgJ@%rwLS$0 RtP(Oz-VYRk{4w`2J3x'T?=Ru -7&KVUkddd!]]8dUV4F'%+@x8<$AbIE7Ei\i~wfx/2zVTu3+sIj b0fQ{ A"Mx%w:J1ubOYED,:<_O~f&heI =Uu zx1GJMp83V~2hfJI{s^W?X)lNR8>{/{7McxoUd"8AA-ULx @]>I)ot,`]"f+-Y`GiuAUl,8Oa TAW^AT*T/jY'f ~^|W`:;n [M#sA !:JgSgl V   +  R w|Axc|AEXqB`}A/A;]fBopta5Ep7 y3iW5k+r+t%_)_ozq_$<.[rt=tDd6e&n 2/oSRV%qCt+d=[$TPP1nI Q;p rIZE(-:IzV:uf ##xi5$CT >wJ_sSP:"tRTvii(|\8;A% Bf/Kl(><t'S7wxY mw'n2p;+_oc2m1 , L  j  % 7 D5 ~K d   % H  8 N ~TLmG#3u"|PNCO<0QCFGRK-*MHm*w0[U^;gz6a[;Q:8 ( ! ?{ A  4 Q  c k L /     !Z  +  Q       Q 0h wX'}RYwly s,U6[ f 3 ; b =     ,  M ' HX   9K  E   S 2 n  7 * >   : q  # E[ q    O ' .d yj P tI .R h w  _ u  + V z  p WY W R1 r M W=  {tVY\70n$Q6 Xw`@#|JC%'h,^ 8g,oCY;/'Fo?8T}O=(@ CxtN&- O]AJ*PGfstG 5L "CLN6Ol""Jd4e;YDn{^%a:S#6La?'C`s(\*=*9grgKK|e f{1rR9ALza5;R+>E.QMUUF_FZ7hi[mfwY6f_iju#`/V:Gq C OU8u|pMy&_q>R'%9`  |buN Vf /%m[-hs|u^G^y=\2y}1*m4/|u1MV%' 1Jq3WS1z^=kb&BDOJ/B c??p[Bb. &G7lShy~qbYV5-'^m Hr /iFUet|=s quYagHbh x0+$ g!c%@j\CT GT x'auygW/ =SF  1 Q  [5 o  V y C # \ Q < 9 * G N E o] S oV h qP G . O   kf K 84MJvJ`9;z m U ^ D + }HC L*D)rQmy 4  4  (  `r U& ^ |+g5 ~\ao@N. jCUHYSz !" #L $X!_%;"%"b&a#&#&#&o#&#l&"&!%9!$l A$l#"!Lg ,'jS'RJ09Me.5[oxoo(O8}E'r v}2; ?} P N >V   :LGrpY  "  d t( H  ^  p q (   @ FSb[_,zb0%S o@kCT r`k5Q@*. /kq!M7J'1 I| j7   4} -My!~7 |U x       q7 Co   Z e 8.    - c\"":_q%K<TCuS QK %k=3aO d%Kr;b?p%_t&]b ` 6 W ,   + Vq  $    J * 8  &   . G \ N f s  k r    A _    `X  1 1 # F y  % Q<b^`[XgUJa@sHJOW :  G } J    Kg , . m S "  uk% ~2).cfaIgO?OfktsT#THEFX~B!{ ^ 6 : X n0y-7$  ( " e v R $ % g :  b ' K m _ [    4 *^ ]f _WQ*^x =%c.m'E]3)JA;:SX( +cIGz2hq o?\noQ+n?=mN>s\STo$g E   lu    Q   7 iEEBGLacm<n Buq;[3QS!v!.<`?5/:e"0sj-_5 $z  J   q  ; svkM$r$+CUa%(}B>sHV/,w8D 6 9Ac'f\fJ$ z k_.GQM+-:?s7-,` v  X    !I  p  ] i Wv%:dOGvKk|_YY|#-Q UG2{Sq<J un  p =  i O L@ "  |   a   t Z D [ 0 H BdaW4qd*8~'9eG%d}F !H"m"X# #G#w#Y#"mS"7}! Rp)V [^Kxy  x !   RC A 3  vO7@$N@{~uAN5OHd}R;gN $)-&CKGS7btrB<e ? !M!."!";")#"Z#"h#"0#r""!"R!!~ pHh?A#Sbd z i  yf\:]~p&e^{>vzN),TF7'o@rx#+`\1t4K+ |r*CZXp(|PvEoA+/D<$|`l.,6@b`>o [>i,pW,"]B]u }] B !  b K.TCwH2^  x -r     YSY\c4yw  \@c-NmQgI=f2ut xgKUUoFrDT F P O  ! t ' L k  g | " u  _ T! bB~l,Y-a[~   x 5p Y z   *m  V <+ >rp,22sT& UY l `G J-Q'hk[ wYi}tVZ)5J{>% }~ P9fb@#b :]\Us.fslR<62sGfO%4`{ 3#R0LU{`Jav7^FKo2 1@;U#r6_afjw&.Ya{xZNlh0Em1*?S=+ i\5Z\%bhPZFdP"!o(|-;<,h DZk93Wa_8pk:A'7V[8ttE&BUR:8Y  ^   B [ l 3  ~ X  s  * , ~ D 6 / 4 K O 8a + 4 o ' d # R  Y & { P  . Q  O #  C `c u x :j K ! } `  ]l M7m=D*v>Zjk#iInyfvK#P~jL.>V6y\.P6Nun>{X45s ])}XF7:1_L\RHXSRsrCE '9Uz$m++i%dF 2QRv*   $8 k x i ! 6  W X 6 " l */Lw)c 8 ?2[eC[YkZkC   q   c J NI \   d    7 E T M a  z [^N(epix  d "dh.5u[NA=wMU5* s6)pBQ w`ZQxJAR\bq c|r]@1 )nQ@ Z,JxSJM+^{]!7(qiH3=r}k|V\jRDkCr6Ll%[F  1`g"B |c8NMWVkS6u; 64Y ai[޵ ފM"݆܌ܣە.h9 1ٟԖP~љӭ| UʺȦfDZ/UŎʅL?ʭhʉæʙ˵c 0RṫĴ̶̵̒Ŀ̎Ĵ̑Ĺ̎,ŅTŀE0ϛǟOc ,|ʹ*` Չ2R֍ΩJ^S߮ EoK]:1 O3MF^K'&z`71eRS+\05alg<& DjB pu2 a) -6#5R$XhUPy"tW]<P#L!R5>)/ |*3sMS\Zh#'>Njn|bM\8v\QPvAl '3?VH0 7~1Dk J YYD 1vT%    \5i[JZ?aYTsN 88 `o D   BAoUM. f =   L =AD[<\$\"N:x<W$ ^*%V*F T q K | A3QONK' BY~ p   /  $G   q @ 7 2 $ 2    V f  . k  B ~ -W)76 ATmutb@Ul[4RB_Bj`xH]k< ?;C;[BtWZ.߸>Ha~I67u$0ds}\o0U/51\I)7}n_}>T"pk1M12ߐfߑ!ߩ~;Zl5އݞݦe~b ی&TߴZ9~)BثS 7ئtLܰ d٩{Tcڀg۪ۘ Qݞ ާݟMނ`>%=j!ShW "4%cN)^b9IM^U[2C.`BE=w)NyJSirV&s;qe(I\C Y rl J] G  U D y   S    _  ,Z WPxL',p[*jIzJC}gWE^{<BVjb"B+-@ S / + BS S n ! m x  &g  K &* 1G "  S  hD .  ! K t f 6 # { Q < o ` C 1 $    5   _ / o - .L?V:#Z.  j <dKG} ?gh^<F}z^8&2`_n t|geC(XoZ;@jx?"<YMb, p A!,"" # D# |# ]# I# # "k L" !ze! Z CL B_<~8`2VMpB42w{.=*P N 7  h  ^ .7Sd}kRCzvHp+cUA2Ik9>%Xd:o"6OxTF=f .?}{O!,,&2'%lI.cq( =d#5Rc1oi@]5| |V'c+T| >8{*YV/,0Z$t:har_ tO7wN*8]23 Og*X=9UO_1tD$uOKuH# ".gJsAcgm%D p2]Y @,|[B|aH^w\t\@P.o ,fD:&PtSv} %Zk7Rk@ e`j  q 8     7 $ ]V  Y  j  HmpV/%mb=ff6 ; ~ o : T  + N.  I   q |5  <G;R2-HK6 %fA^zWCp>Z":eM!f[zi  0" @ z K ? z k  V  H     G  +m$DQsoxz*`KM 8K#-TZ: \1`{&T]Ti9bl[k\aju9LyxI$q 3 Qt,*LPOD2@C0FtuH,@E^tA :V=C7Fp ''D} psN:3IzBYC;@NlfTFKixswfs95&{C < WVQKNtNyp`s 1x1Op&p"G } .    6I QV/4 Y"_ TJrVT&u}P*  J 2 a  |F q ? GX0.muAdpy?gjz"2Oeu,yj!]]]ji86I}I3/R^X%rG IbjFw5]7-b) TBl<~osh5`9<`$ivIzcH_ W1V2{R[d01W?=T K 1  &  J ui } ]1  \x{p8AmjiAb}Q"Cl;@!n/#9!djw\?9mO -f#< [`/6}YpHݾ:ݏ܆ ~[ۿښ-7ژّshAu2 <ٷFsօB5*?֪ۿ֬)ܓ׳ fWݾ؊u>ܭ78|ۇגւՂՒ'ԕdӴհ 4ҎCԲ8KҤd)fӄNPؖصp٫oY ԋډӪҙHpڼ0=ГI)ٰkҡ_ӕ؅ԮUO~ٰ~Ds7]b[C&ܹ+ݎۧ1ږޝnړH =ڧQ'iڟڇa:l$ܙܧ݉np/Vޅ-v߈ߊ\ߝ4^ޖ|;ٴ٫[إݾ׳G׿Gށזޛ\s/ڿ#mܸ&YޡW_ޛzMB64} ޾3ZLޔAFߝV!&yoK'.0Lc 1RO^G-*347`"vxeiWkU9?S)[sUT9QUU\e[|x@OFa /JIhI0!(X*vJimbv%\(Or -V2V,afZ7hY x-zs( vV.b-Kc/d^tj H  c  y[  ' p      W 9   hZ   B%Oz]&`M5k@% :E_:b:):[RT]$>7)=tvR7;CaG4Qt;V$ep(JKldDT[jNB!<"g.Eg96`m41k l<]gM+*j=PB#[ A?D<F] &&;\ jMh` E M y_  h 9 :  Y   \ q m 5  x   0  J R ZDQ$pZTs=beR/=&>M)ZEr}--8R3ygxZePAFFz8`.f%fLlp;dh.PNO(zI( qR55b 7 c 0 N  )  O { a^ -   = >G 93    f9  v .   m }x1 K m   my F >\SLtp>H<-G~; _}\n9\5ln'Wx L@Hkߨak:vG*T Zww7\FU-A,^TeuGlPc|u(my8k<>l)UF=GGQ y3w&p4lSEiVv_kd`W!_1? ZBcXf|y1x^]dsvo(`K''z`xt|2.~@ lK{V ia:"g B-XE&fsHfiR=X i47r  ~ C u y e Ab"Ve1K]mm0B<3kS#ab<(%:FYmKwjv{`r1IW[  p  > g d  . &  1 R:Y!9{=Q+`l[P ?; Jj >p Dh 6Q 2 T{OE 9iipqy2tp>|K<&XpOM t0:wT6t"uBOQ6fy(g BqXPscib c J *   *   )p p< 9YA6Iw[4>;*"`YrK)F6ICVi 6 1  = ?  X' 9') / 3> J a" + S| g  a1<)t? hK+"=}'[TO1$`~7~o/m&`y)^}7)T| ;|"Ol&%mAޥfMވSJfXj@ޔ@4ߛw4s$=u-1v>uW8"l 1^W^]VB$1  x  w !      ' X  uW o a  +f a  m S> , c+ < N h |  t j On +8   l< J~;H.*WO#wN^Fu #  / _ )  C :b p L  & x B)m >g6g qJbRi5i9\ Ngq%wVmxbX`h#[9 !"#$ %!&"'$($)%u*&+P'+'#,o(n,(,),[),|),),),w)x,m)T,h)E,?)O,()J,)s,(,(,(-(p-(-(1. ).*)$/3)/@)>0o)0m)m1l) 2l)2Y)20)73(`3(N3Z( 3'2i'1&1>&0%.$-;$,|#+"*$")i!2) ( w(ql(}(M( )o~))d**6+t+++j+.+*))g'&f%#/d"e ~'-K<hS ^ > \ 8 R %  p Q   F 7 o J Ic)_Cn : ~ [ R A *j   [M uqKg\5j]bfoIq t+[x^_6 -FJg;8T9 ucV8R+4Hx1UIe   B  ER4:K" /@ a j  ` ;T1&MhH5yn$J'ZjnX)KWx5n*O a`* }{L*"f#?w_0-aR-KZ- !=es3K+L48xE+~S .SFSremBYAuE R- B9EEzCmhI -jpA9;P5Rm2z,I<)w[U0sB{bZEG6P3v_tBCI9Fbxf,I8~JM 6tx2!:Stb qul?V6Qi.u_=.IQ-;XPHCCx], ` t ? C < X p .  0b  o + 4 \ A=GA+ C  8 P (   WsRi H f :e   P   :  e F"bD1A'xO$|n"wL^RNN i)m0:sdmH!TkeEVRFOSrNH8";:{[?Fu A  ^` ( h  z 1  TMq~vg`k_8qosLeECM:@5A6 G _  p b  ^  (   \ 7 %  #  R    T   R EkWSKV*nd_4(+67zk_t8G91p=iK;4?`N |mJb 3.'J)xA^Ez>Xg{r vX%^nSIߟsF$ޓJݕ 5qޣb7}xKO YHw^BK6+!+ =bApab'C@"P>-Fpcd,bltl\MG670? i      N " c5WkwggG6ujcP )*VH|HkN ^!qg"p#h$%O&}'V(F)*' *y h+ ,!,s!-!-#"-"0. #.{#.#.x$&/$8/p%M/%O/R&=/&!/"'.z'.'5.1(-(Y-(,*),)2,*,y*+*+{+++6,y,,,,U-m----Y.-.-.-/e-%/, /e,.+t. +-H*s-),(8,?(+'&+K'* 'M*& *&)&)&)'')Z')y'n)'\)z'5)F')&(&X(%' %B'9$&##%"$ #"X!  LmHskb&B!Nn[H02qk  3P[_w;G\&jt\gB} {PIg C G  v f 9 3 HE X   @ 1 sc      e W  b    ^  %   s / t K G  ? $ M/tw-@$<y]U_B{Ki wMO9Q^C}_\|y"uYQjj/8dW i?n~pbhs+B5?$oML/fQ{"jT;f[:f ]05T6bY9%pl-EDxf9w`9IsH1Ker= vym`puM0AMKiBa!I'r$D=[$  = s $ a      ~5 X 2 ? T l  G  f  ^M  X6sQtuvaSFOOhW Mr]Y1A#*Zo  !"k#$|$$;%`N%xk%%~%{%m%u%&?&s&&H & '0!;'!T'V"' #'#'$'\%''&N(&(' )^(u))))* *+l*+*G,*,*.-*s-/*-)x-9)3-t(,'+&+%)$(#O'"%a!B$4 ")!w5?X{t{+  n  K  d | R   T O  O wf3W dHsU*/`R0Y?: '1UA,)X(߉mTAݟVMۭݤZۥ*:ڣڂځڂڛ-Z۟Xܗ9ܗݲQ}A4YmR+G}B="Fi"9Y@dASC2y#'(6We=8M,uIb2&|u>A7Boqv0@+bdIlUwC,{97wkO4q*XWr}JDgߒrh l?TU(ckXR>([߬NEovL$Q^FNQaJ,^ l(Pz%R^64>e4luC&oklX_QNavr}Jzy)yxi=9{ cprMy4@3HF95,sf4  T  ]  E   a   7:A=t7-*XK.R   k ?:{1B~xw=~J qh P!) "!#!A$"$G#$#$c$$$$%^$O% $|%#%#%Y#%A#x%%#Z%#P%-#,%=#%S#$a#$p#$s#$^#r$C#Q$#$"#p"P#!"{!-" V! Rxi*9#*[An*;6^3Qv18oGRrOKKvF&t) 2sM>'| K %:j521+#W{`^u)~Wa;  H , m ! k ]  M } I+ S }  F )i #>   f N   |  9 . T X   %2 L+AT5cO8d `. 8\F!Jh 4p!^S|kT<$xN!\ #;@BSKLDXfP\ ^[J:{qn2Wt:K$wyf3!mAB:|&n g(^ߚޙޛ9ݚvܮ+ݷgW~#Rڜ3۷ڃیڠ>qؑ)Ve ە֛1ԾO$]rؗФYDQςքΘ$jԇ3?Җ*̹V| σʪʁΠɁKɝϖmf/Ȗ/L0SȵҎsaQչՑ˗}4ׇ׳ΏM2$ځMܺ'ߛ@fjxݑ1߫~`R?guz$3fp>+H^RB/*  Z  c # 6> j{ !"e#Y#W$$ %J%%Q%d&e &!' "b( #d)7$*%+$'_-(.X*0,<2-3E/50"72853914:4;5<6H=m6=6=6>6>7=7=(7g= 7=07I=@Zq"2  @T 'x Q S 5gk+ie{4&}$+ZgAV19=*A0tR;t/9AbD s;}A5:`GL A,]3h!Xi&A?X/}Kj j S6bzJ)YJt!Jތ[ݼݗX5״%ր?m؃M>ւa:.E_ӂJAӖը8֘Ԡ.2ر")tr٭֜tك,/ؘ֦hԏQМAОS̻˲!ǝ_Y*nņ4(|W"ǃgVǫs.dƩȃɵs!Ǿɋ=ZO_OE.ʏʮSɡRʠKm_ȼDZu4ȯƍȶȺh#zpǎ4̯ȕ ͘|͠?8˂μSϑ=,0~3<Ϯ=G[ϸw=ҠϤXeлy"'ґ әK6tط# Q_ܣܬ>+yRyujBa?g|}|Wo&q"FM5_CLR-A2a\6=qABD6^K; k G /  @q#mrP ?k=* !1!2"r""?##< #!$!\$"$\#)%$%$$&H%&%+'&'F&-(_&(O&(#&')%Q)%_)-%E)$:)$ )R$(4$(%$C(J$($'$'f%[' &?'&H''`'Z('B)'.*>(+(+f),-*-+@.+.-//.!0\/0011c12131415262L717181(81+8t17_1u7L1681A6#1o514131~20p10S00@/0=.02-n0@,70c+/~*/)-/(.( .k'f-&,%+A%*}$v)#,( #&J"%!,$ " T!fD6sH*KVukn %4 E l&~=? 3M k { V " "Cel7\00\>G[ ,0tRY`|0 bV/,J/?pCD}[YF( ,jxXB'7dx 4|   2  S  .h(0`CqkOa !"#$%&'X()* +!,"-t#^.$/$/7%f0%0%B1H&1&1&1&1M'1'1'1K(1(12)1)1O*1*1+1Z,D2 -2-3}.3+/4/4n0o516617;28293&:44X;4<5=6@?7@8B :XC6;D?<> ;z=e9<7;c6: 5Y:392t9N2918t1q8F18$17"1)7"16.155151.40)30&2_000/}/..-`.,-+-*F,8*|+)*))()O(G((h''&v'%@'$' $&G#u&"(&!%3!w% %$u$##s"n!"!1q 8 !?+7Mo|81pc/)   BW O }W *d  u 6 (ipe/c/{  . #G ^ e oZP ;; D S }7s}QC6QFdh w O  s _5 Do   a 9 ? E  d 9  O \ TfJ713 N3[n GGU 3>B1d43-9oqDY\/c\5wD;!zh+QfEw925_%NhmZT]Nw!sT9T +o@,fJ=OSaGx6nK04k'c&Gh(N G6n*@KSI/vi]qNN2"L05Vi~w|ppmuw{jur]P4;I*nbAky&OzwE-ds-=r D%9\t=VR)2|O e%_OXv8WR%Y2pZkbjyEu $~e=$B\up^#\hoT NAzs{w Oi9L)"$5I=@(0)V0Qna:F''?=v|1gVe r x  u  b  O x b m 1 K   p{ hE [. ~ $  = X Ix u     7 N _ x s q j & @ ^  y  Z $(  ( 6 `x6~X;q\L&KYs)%} 8EFtomaBIV}[S7D1sxQ-NnbNG%tvl _! p$ix&hV+zhWT/Bk[lfusaH:M8 CJ6OuC!@ A Fv 5zNCl[WYa#o%@D,&`& ]^l.CߪG"ޡlka/ݭہXݔ-;4ioڱ 4}C`FOav0 q+i&f2>g9H"x6#;j$S.faWBfh+#0<t i(euJ e!CVu?lTi:h3T l<$,}Gy/u\-tOE;;9CZs0ngL (vSj'98]KE?lKi:OylE6DgP>1.3{?'X=[bh t=;G{=@n5pk`}Es2zqS/&\e3!V"#KGU:T pM,9!u6C:W+`]zTZ df;t C)&@ n1+$ w!bGU<zcf$b1*'{Xp|Cn5B(UP<Q]my}Bu0noOV6}x3`)$h^&Ltg1Q;P bT ]X3KnR;G\%.]BMBA/Ph_oE"y Ndx%'7ND?1MOq?Q;A=6}Q@ ' 7   # o v X r 9 < j Q / J a } 1  | ~ S x  ~  b  4 8& g    T  k D + g e v a e u P +78X!= DEE W  b  ! Ul    }   i  v -= wK p ZR@+W-',g-l1ZV% X 3f7yeGHDj.u{nW(hPK(]}" 4sjV+Tk~H*1@gs;9vhvxX\"YA LHBuFk((]BA)PF JUHA<]L]+fdVo+Q{57H|/hWCObGAyIz\:&/3XdT;Vl vh:do49M`e\urhPiL']p06SRL#  9 < t  e 0 M 0 k - { j V 8 ;! K S A   ' h   81  _ZVM)@a[@0C^nPm`KU Z Oa U) 8 &   d >   \  > z^ p. . E @  >  '  [  N % UK q z  3 {  7  8'b4hwNd_QbYH*6Ll UQj*J@fJBkNQF+JALZ32~-?yyuCiLaKbhB#?$h9|U &YVZ[GAF/Cco ID yCFl v_cvL ;     Hd N  3  6 nU 9Dm=*tRHz9=]|=,{V  k M` 1{ax?^02K ,'&7 LJu[O39d@dDY:^Rs\ a r S     q8 h Pd VW ,%  a , -{  s   Rz'7W6  U K   Z K + 'n    9 e @  C 4 + 7 T }!fX{o=fL>G-!5~XR"fHE}J0QamP2oUr{,*g;D3<U0F$;oj0J`N+  \|  G!!"b""".#T#z#}#6##pg#P#g:##$"{"""ak"%"!f!! :ND ,`a[#  E O  $  g ?>   _  d  q &A =.sI6@OpG"j>2Pw-< qA 8:x{<FZC QK'Kp]][ 0+:AmIURzP2\nGtJ!.?QFNM=7$Skg^%Bso\AM.\N# &Y_YnA)A|d >KQZuIu* IrR?*KbfSm @w4`-oHF݃݃@ !Tݰ=܅ ד_SܶսۏO ڷluSӆZ1ٟӪ؀Ԕ)ՋաبٖUrٳZ{s`\7ܾ݇*`G݅Yݣin\ PT4݇-9S\ݼ G]#K%"$!u$1!=$h #### #O$0$I$lj$c$I$1%$###H"!!* #$O;yn5B\  / ;   c Yn   {  X /     0 9 `6NjanrF%by Ie!m?9TT~MYE&KO3C-m~J,s] [j04dr^3rN#O{Xa# Tg41w?Sf>p1QT[`VEJ!^\(9|$,wmdPt([:%$TLo\3h8p " A5IHeVjuss=qVACfy~9vhu@nt -(|E9w$_]9|X|ULmDG@; 4 OA 9 / *  Q  r ;  h@ q'"}`&o_1\  >p \    Uu  w u+_T,[VYD?^4fo_K`Y;s !B"# $!$b%Y&&)' Q'@ )'H &Y i&b %= $ #"K!7 6uDB$H 6i $5]H 3d n%n9m&Z&|+Bz Y  }  m U | J 2 v  Y  - D rO  L L{God,h7;4Gz^[ Q.WD!ASc'erGHl4p3W=$\v m t*a;91\4GS@%+c&5`e@b N~d*}C9߫5vޚg&ߺ{?,v+,C&ڕ :ߺ֕ޤޕiݸҊHOܳ&[ܜҸQCԭI8ރֵ޲4ذ) S^]ܑbݨI޸ ߾p10y\-EPbF&_kZ^d@GJ4f9%dY.5^V/</z.3 jSdW2#3MrwLJ Zh4PmI(BWz$H-fAd(x/EI>EK85%t%E=i h||\omFllx3{MN-~=g)tq?{4Z+fbg { #b;wQf7e\gJ_Q6z#*_+O uaj1.s f`*au*,\hOJu]54 j `f B    za  , C1 )z6Y0y1w  %   1  b {@<q2jWs';80:m9WCqwAaVce3iNV*B~S1EUI Eoc /eL 3qZ"!Q߼P߷ ow߳}wH߁ߦߟ߇(?VeEljF]ܫ#ߚإsֶԇBWڲByzmш$.%ˬ3˻t ˀm/˳/P\pC,ЀW4tbЫHj),ѿϦ҃IP+r"KWYA1ՊϳOfԋW6* 5e]ԙף؁ڊY۹؋ڱQ'޸ߍR@T5SM|8Pb*\1JyEF$AL ''O7e=z@ uQRPD>LtY3R? SILQl8/o]:IE@om"    5 p &@u%oMM7s 6BSxNX B7(  !"   W 5  )B  NeEN%  b b  s  9n  "&Nl`}<9X`ASHodT ZNxx eWy&I Wm5D j i! s   )w  V qRdD15p8aeRO'   rv J.  T $ n  P/ b~yr^}Wq3k~{4p?B \q2|}" dY#j0f1!PUPU #$Pt&v0vAD4m'6b&=h6[4DO*@W+)>zub?bpoW+ _C5^nU kcl3)Am`/!uNhp>Co(-Mzj2WzLdusUS<(2?;\j}Y'Ag'eQD''WPhzCoB KZ&T` 1,9`*E*&Wl;&bDvnDQ5hJ x   ? e  dA !  c   BI  1%1 |uUCarFCUJ~*RcvlpPQ  6! !"!!!!!!"!3"!6"! "b!!-!! )! m l 3 S  S9   a!#!!!B""""""M#"l#"y#"k#b"#!"1!\"a !)! (>EB=E{ r _ !!}!!" ""!E!M! 3 Vx_g?i{ ^B#2V]#C6E~k)&R_b."IVmGeRcp])o$rmN6WL75]v76C :  cG   ^ 9 R Tg z W ] ' 2  s } h9%*cF~$6I*wPcMfjA(PHqArE*dA)peTQaj3+a%*$)#(y"'c!& V%$"g!6 Y1}z-&$DQuA.m1loD/}cS<MLByF 6YV{'7"(O44 s(f:H r V G i  9E[4>5J|@4TVcTEW'z):g}[A[roE9) S~d\ Xd2ft3Ec}U=UZEuj=w[0 XEiN5$f*$g=޶c3ܫ?عקcժؓg؎gاա ٦֦xog]wYܭ~ۏ ݞ0ޢBߓ)f -bbg%>+a@0r(lx(4k $/_Q+3s"++9;\Si=!Y[' kl4:~:6+JLf3"e5'WuR8h5sJg<d}d n*\}A@X>2_Nb R   19C Dy-en&Lw6 ?  { ~   8    Y  M ^ , r 4yDt7XZF] 74zDu2ViC{>G+K ";q!@i7vI@W#>h R! "c " # N$ $!!r%?!%h!T&!&!&!4'!]' "'-"'^"("8("w(=#(#(-$T)$)%)A&M*'*' +(f+)+*,O+u, ,,, -,G-E-x-m--Y--(-x-,L-J,-+,*A, *+)+'Y*&)%(>$'"&!% b$4#S" ,@ '{rM F :ev_N/c><,    u   n _r!%h,Y'w $Y/`Fj7;/{O"R<7 r-cR&BX#WnynIt8h2U8]H46"FKGvl2@Dh*&|fMIyb89B.pw @al6Qk/0cvy? P6,C^zPVSac7LlS,lW le(1r!`zO*$>SLMvZ"2T&ci3 *LaAk CH ~ut@ wC.=lB1uPr|palTT@5"?gH=r:  D S   z 5 0 4pm +?1Tpp/w9vM=+U lnYio'VF=.-D|8jRk zg~sigf ' r" w  hS  0U  [}  O1   xiX6@3;Qa*:KcP(,93 6r4#!8F~D t 5 [ f 0  = + I | ^ ~ - KGj%}u>l  2 2 o P  . i g  ` - yX  Y ! G  H :AT0}FlfRV? #mn'kCu8 4ItNH6_q =s>y4o!kSW0Z.(000\ ]6L#RS\\jnyLu&3PlWPj-^qdG[?$3u5vb@R";1c-q/ C3Vxcv.NNTBP!=8gE ? ) v ^ /   y C  ; B o [  YM L=jYJ;!pHP$2`j|K"GM qt>qG"RQPZ]js -W52SIOfet4\NHmZ] `e 1 0  ^ 3m '    $ U "  4 V U w  $%xx7@ Ev'#3)a!h@ j=LIC s5  '>$]4mSirL-3D879Qr?Z0**L'zAIkuyk^C -!>{A9~!tMmcAlIt {b.&iG5P3 GAf]~ofv?ywx0 ) r  H  N  1   Mb , ~ ' w  O <  ] 9Xw /cq|T#i2QO< ~Btu 8_?dKu7JW TY pGS$!D'QJJhj }g+w[Lrk}}M!-Va@Cjs-sTa$K9(c-%VvmVSaP,4*r$iR@LSFrQLqhvQ >kT1M# =TEd(WefT3 u\IT9e[K9*|.r&-|BSE>Q=Mj!]JW{ywtmOxCGD]p%  fx  R  T p B ] 1 _, < = .  8 h  K 3   3 A  u 3 a   ? * k Q i T ' ; ; s G ~ (  m  +   @  #7 ~^  & T r w j <9  u !}FZ n  e! q   @ / ; f ; ,  " O Y ?  T:U3   i f x  E`Q>AjSAM}(T4[b `p}|m O!?" #)#]S$$8%h%m%@% c%!%$\t$2$##"1"!h!! J @; 2>r&}# '::1]hU+'J y 0.  g  486e~r`-g.&UIOwhZCE(*Avk"l^@i#hKVoRmpGX Hc)TDD).J18U=.NC9  a'a4_ QwxQSxL\wxLQ $ZmXw V5-JkTUO [5*Q?_ NT=tmJrj'|3u.`GD0G. ; p 1x W] d7 UC(9#Q>5,)7Hf   C  S / :x w z Se   P   2 k`$*!_G`*TPm D *0   H f' >g;1A' _ -  [6 M q 9xjfyTt&. W i i P *U  iWGa]   X C   ] df   X *  3  P K   lm  P v *   54o+)~  # C Z2vYk 5 I j     E-  ~ > Rn*  q ( p   b K N 3f u   l}  ( 1 s y 2 r  R 9 + Q Z a r? )  r      [ VC s   (     vJ syZ||C^?k-90%m9? 6_>p2gS5/%9)=__] =_ "D,,7UV DM=.%|8Xgo8j,\i[3hG!bmc<x=M[ZP/5>9m/+"bzeJ'f=ZXY7?x("eE .lKQ/&'<6N,7U;rJj,qGaqT-b""L;:u pw? dDJ x-    6 oa.o]R8v.s20 h u  Z J    1 U1 o fv\2]#^wXp>3b?$r&Bh7px 'Z\ephTaP]C |@#2X[)_!9ZpsqG  GO lp     7  e  S LK89ae:+G"C+0R{GTu^> MY'c[nbXn'O.yB &R" 2    @  s0 b vs@('`Z1(7t_xZRwzfR nb:nHpE27 h cI"a7?s8!_hnR 'R Sn=;809RKJX`oh`Y0 {FluEXBJM4hn-LXZL,f(Lrdr K| # O 9 I f A |B   aD  a    ?9 {e?g?W3 I\ G  e%   T  $   I  d  y z   Z  F  I m b x f  /  ` K 2 * iI  G7`{ ZNL @ & 8 Z c +   ^d I n4 2 " \ +tWDHHy[7 \t   }E u  b} wz %  pa :7nP(USqgPbd)9.JB k~g=ws%?s<^lNL>N|#y3(jBG4]~t}eI%NjG7qb%;+mIcmfL{nj(Aq~3F/CO#JTj]$JIzO7Z 4N2޻ݽFޕߟc' 3C0T Tb8 y#lf'!s[4niOG4X@M`"~jdQ_K(b,A 0SL@K& Ds:oB{22 )Y=p$AAavC~ Yyg4$=,[>[v$`: k:u|e[foS}>@.%,(ALYoDI;eM "o8YoBlEL*le[ y)HY\U z  $  x  ' !rM(fUmgOf^RMyCS:azH;:9 H wJ ' ?X DqmoEXfM4r85N2BeC6Y}%myl>HGhDo&. W  $ p d 4 >g6;ejagq5] Pl.Al+?A.l'+!:[hkwZ|bbF&D*96FVbXX)Lnc4=F#[j2jJ(;TbeV %~~%jJ;;4|O=d' R h(!mtbM?Mj]cc H?{+tV[F;S ;+z~CA)(*<[[.MEsxFuPL{-*U gOZ:3"\ ~ o , i  5  g W $  R } 7j   C0Iri2cE#-tbP)%sU [nrG?`,JJIeDzbN18/bM '[  $ j r " h } W  ' GG m 4t p M % / b  BE  9  [ 2qi98`)t f 4Of*%[iR#3 K{:,'uZ9rBxA y P{ l7 q'jIVcoC<n#G(X@X Hg W^e}FOFA?),W eS 4Il+!tv6UZOY>f(@! f$ZJ@!{\, .X~x8qNl[^OMc-mtw8no XP-JFHTK*?sxD/"~gGe,!uYQ xi$!%L!ruFt[Ib5%t=fH2w/Xlzj IP6+Kzvi2;OC]OzV,)E.O&bH/T[@7}M)Z7qZp+ L H!a#{{fhysaBD dDt[4wGA#LK O w  }  /Zej`iAl*a1hF `)EBCzUcZC[e;;  :!@!b!N!%! ii qP+f$%s_4z`n2N+:}O-r=A#jq^gfI"6or:o)Fk_6wBL J *    k  %  m a h nx r a Q H s' LY(p%DH'Oi{y0tR?N1G3g!28AeZ!zvl2*djN-3P\ :U$`%{z .z$_l>3Jg2ߒ߾8߮qg-ߜS'߽48.}Qfoqyywjv>}"3F W$uQ !)6b/aq4w)mN(0&IC"jR7'[KS ;|D~K)T|!}3R^mB6Z4EJd>L;'M_w'~#SYi{V} rAht`P|F`IEcixT*,B K4 JokkTBt RbSW !`tGW~qwoA]}-7u[UPF_wjv@t\5R(V:AA_7"sHt#O/V%~5 o FHtT-YbTW6(c1(< C=h3-]ME`n1X&55=@ 'o(tXV5YyBy)^PY@<Trfkp*W KgI>m{/+UHx8acw;UAw;4>zH Q"8jE7 y^O{_gFhO>WNED},NGJ<Gua>] gi4})G}~~1Gq5Fz~ $I ] q KI    \  5 g=GdCcSJ RG++OPW|6    C u G }&  dN  ) T B Z  o x   o '!m Vkrn~[h {9K/Qzlq2LC|<`Y"P DlN5mAq   e uh   E { jV?Z;qqp=ab/y /  +i   X^ 9 * ;- v4 8 7  "  7 K H N] nd`<i7g7T={f%?w0 :_pfl!} ZTag>(o!g\`d$3, g J#y=N=P!r'zp < cwq^3 j%n1<`* "mYT r* z@j C$'kXF%Nq'irR&me-"ssUFfk( L  M 1 VP } Gt  u h N      @   y   ; x @ Q 2   y d ^?Grv3la1Hx|P"#L)9V  f    " g{   G l R{\i_n990D13(Nu:GG"p\2dzFP !!(!" ^#n # J$!z$h!g$!Y$!$N"#"-##"m#+"#!]$c!$!]% % ]& &7!&}!9'!N'#"^'y"2'" ' #&>#d&O#%T#%@#%$#$"J$"#"#q"#e"i#G"b#A"k#;"s#L"#a"#i"#v"#"#{"#h"#O"#"l#!*#!"F!\" !u U! > Vs Nc, i)QjeBD@: U[v CA#91@Mb =[6 W` [ a V k k s  X  &uMZP##@PhH"!rYct W Q L } L  d y #  } " %oQ;[m(o @ZG@koDugAd|XKJETX \T; tk0na\|sO;,_\vEGZeyGj#x.AYz0`;oZ!#';[bt;$XeJ\tIWAV5^Ng:hberQL af(zlHso5LIJd"t?02o   l v m  {L t V  i   LD  W 3 L m  5 U  ^ g  E e  * ~ ] G /H XG p   {B b 5 1 p z  ^ E I C  e 4\s.Z<N z~|FeLK| 4|<+>0 pZ$Azp<cz^K?8  #  u i  {6  L 8 N w #q   k iTK g$PFjn;wQ0 Nh .8QZ f d u" s q6 h m M LX F 9- 3 +N 7 *v 6 =E0;;1-O {  f d 5  | # kn!=qdC_Sezwo<  C   04;7*lNR!bg`q]BePp)g  @sx! - ug  B # 18 0AqFaIm]juqc\-0{V *Kohg|C0mQHHq^ i!-C -zXu$`_~Se(QkHCtV5}@z g W;:!! ^7>iDmOY[b+>-Ce_r3#hS3 S _ lG    m qT `Y [4 Y< :-   t } l   ^    VX+> #{yp_\T$yDa(sT'ELO@ya4l0w0oZ>1KrKxacJ,/qxiNkERPfykiU3$n0ux,,xS#RR8XU+cNK$<~4xWm68{Fb$5wA7"$GXi`N70 .QJ6tp&F?]v{c.gC'ylb,T?; ~>0FP<`_s8mRj]S2gWac$E+-!f;/4/>RRz /sGvb:Bl{f]1Aab~ @#)7L"NAg{fqEr~LzOwh <K];P}"|%S|&;iN,`)en<]4{k|}@~}b>@?  F 9 .f x x j @    = }q3rlMd&<Pc[lDu4m;{0( ^ d  G 8 r  0+  D+   N x  n| ? h K   ? g  0 kj!|KK} P  x M  &   ; }      ; 4,K4|%qnO P m D + w    b  D / W 9 A J p ;  [  A  [ _|W:!lm # Q    0 Vw??^e } x Bn M  v>@nV5   *. G M _P9r)9GWu93*t@s#H=n}})a1Y~ 1F`%1rzDx"trfC6+'##.01VMs\m}lb50t>lV*Tz8aF/>lrL$:Bd -$LpPW- KbGha*OSZu^6yW.dI AtMDaSNWk0ge;DQ+B X{Ntr8NOtWpWqP]vP$T] 7eN Xsa25js,IN}?]G aB\ Q77 l  Z   c  ` h  Fs R JV x w  L < E  j      /       v)! m;[ ?Iep;H&JG\bd.J]W `1 w`5>O  ( j m   _.   li3^ZR77'=jTq4X)e>i61L@"?n~%5*_ex^ R#=)1@E6ID"r\ @4mGx;v&G  )  \   @_ ;3`dn}|hcU3[Z#l~#vQ_7.*w yeQ'+O^U#Iq<2K6$(E#%KuAgQ_fp)wmy JE/lC(oh}AHv#hmB;)aG'(2Cu\f+t|2UYA?\?GD)Y"wi#&R*25hfrr\g~/G>pnU R)Uz  M}   8A  1 w O 5  4  " s   B 1 A  ' > \ k    O.MT  *  Xm]f _n8Ow7:0y.bwN:2~,Q~e|c>b9 , *KGZ~igc~@oI9xwIh7 4PB\Ck AXkh=JNr!B}8? %(. x7QPWd8sjLN#?AB[H*/:V}_A#9A6d_|9879YRogZCLzX. Ks~tOMH(H$ /1.)m) !hm ^{9 <9eYC{^qj: Teh>Q]"S9 H;gK95#KRA0 92a?fk$Nri9T\m]eC\>piFS)ms4mVn0uH#hmz4fMe$1fg>k"EK,p2}4N"0])zot0CN?h&c# O/pT7 Q6,rxߠ5g#ne[yaL_b_j'5(C.5'V:h5C\ 4[R`l0vq~m(RGU5s= R$E'l%).a+m:sWD5f?:M iw4g xV)l;^'1ZUQr'*]b3l" @4vpfxvzwW|I%COL_/`_o_YO e%id`% df49,^aA" gh>4\d(?w-f-h&I\`I g:@f0^ p&8qk.nk.cwC)IVpQDvgUX30P|'6 !     r!%  & Ns x p g A   u i q> Y 7 5  3 #t  a  ) Wz@~8TpfvS_ G  z  3U bzJS m0ccMr#_i1~l:kk>%/:sTb/hw  o X@ 6  ; V  tq K f  S  8  D A j D I 9 1 3 8  I d y O    4 k   ."rg^gTF-9   hy *=   } U S Q  ? l m  H7L2Z+alb1ZR"e\i!M:7@r+PceY2@6zB8TIrvqT'z5Ig(  Tp  s   d "    y @  e g   ^  b # Z ),L oJ : W O M  H8 C 5B . +   y k NM 1    z / [ O jOB%}>5?3P+;O?h<{Fa,xOg7';>;XXaeUt;;qf{ nad~=OgOQY'm"CzE&uM9z z$Nb> 8QC2+H 4t}J')\@gd xp8L(t *$ e]qed.NzN'v, # J  t x 6  q N " u7 X &&Su0PVrSJD+Ro|(: t>}L ~  h , 4 : z 2 "  ? ^ m , x d 7 ]  ) 0qj=ncF/P9? f,veO1\=p9A: _`W2ggRdC )VV+/cT/.v? a  F = N   ` y t l~ Y Pr %" ) B]/v B1Hi|?}WZTZW$2 r{CH@vQ*D:-%G#8VcY1Uwy` 7My%t BL.IJ tf$dd9z8H`w cUp'8{.h bUr(O2uqM5WA2;Wrh%3i " g69g[ OR"&2=3:A1/,8N3RoR`/ln,,4}ed5H@5XbKe y<` J>ZJw97+6akiN VP_\+2\%k<l,Yv#Sh=[%K<~#Zv4QE:@TNU7Aj#CR=&<W x<>Yo5-r O{|pMKs38MnjZE$ 2?F46( T N == N Z}H %0J zg +  m %/Wf$N%sT;?\2|y +pi)kHnt:uR<k?yEf+2PL[   \ i Q y  h O W > 1 z  >   _ g  KH6Jr,O@avzjF zUkpKlm '?DZsk y&+f"T+>}>zGR F,1)1zU08RwwmZz9>R87ud4(]LaVGB.gfj'd\U59PA2}^>8;/~?g_oL) ;: E 5 g #X 8O y  @  9 w E   ] 1  z!   g  1 X Q N c q  _  m   X v G ~dB9%SH v J   57 t :- ?/ Y *|hV{&LA4}n7 .5fc{I,3|%o,%z} jHyV3b=f4wg3=2=X'dlYA"; S t;ww& |^SrV 7bZyJ!KM eV.'9'PN@*~ r.8n",69A/ g@F _#\RW -M@XpT =)D_@08d Spy |_/h(w ?=W1>%{|?thgReA@SUJi~uAv).V06!)ovP"~j g6O~Ug~c B /g c { i * jY]X5wdq$2KI  gQ.g> 2 >81cJ23=V45ifSgrAS I$&{o1f-B~ :ZkkP2.J UNlY 'O 9MN#LH2, #<  4<o*jjn )593/?8F<LDcBJbv2rq)#Eub>\G h d/,.D7pkt@5%CFuc3H;KLtkiSk78Bb['a| C00V[&pk8@1]d9,%_:@Lfp-Q-{)oT  ;R  #=   NS  "  & q{ S 3 JT  4*L.qYO} KL!b"kX#$$%?%;%'$$` $J#"! = h2MrI/ C'9]/ _ e L  zm\U<  e R #q i/X]'BC\ E#  $ !F s&; @}Q}gD1C-ZYbaCXH)X*ZdST+qf3.V'@%[vRkhk_;BcY1wOk0"E Paw$ "XdW_^+lZ48V8Waxi{eS/ai%rU>a[5u I/B"L?@M<T H *  p 6  X)B4W ^`m3Db8lD ~hnU!7j0- j{cRQgb2RS$%wg2[les Rs'm_6e8>ZJ  5E1<V*"( * 8 f   c 6QjVyulM;+lp\$ U(7$|~#S_zuIt,JEK~Cwk!LpS"w>OJCW,rinl9GpW| }K M(8_HT7_( |s5wh @ u  A 2 Y 8 } {  } K ~ k ] o  |  h y  Z    f 5A  5 G } _ Q 2  U     ) * _  G   z  ^ p?)_Op]c^of}yiMXsz`gI# <{k9PbgW> : *\>De;| mN9@    C  s O -   n,s0B 4)LP @iwukj#heW[OzAAo(Vq32y0bHAc$j(+x4-RrqY1"5qP|2A/m6*,edHE7MvXww c'3z4c_`V+2JZA:7Syo: s%BxF@#p}"f6 zswz6oFNc;6KXq^5wOh DH9*#9F 8] {n44' ?xDc`kBCkw!.jWbyx?*_?l.tS N`c1q' Oxx"O\-aV'F\F6([d\[e~$cjAy hVC"7>^  E   _ 0 / i   H] #TP2OL'9#]&7u A r@K)PeznV?2P)`^tGdWD.!/c;L4%?sFRfJ/!z{.g|6'  )FNC izJ(qo;ns *} lh J ' 9 ` M &  WxTnf82NE;8xl{ 3=<*0Jj-y1xOF-ދ@ )R5ژ٘APٽj0{٣6}֦ kykw9ܣ}ܩYE׳ݗIDؕޢ #vdً߽#ڸu߹ Bߎۿ߼ۨۈ+ckaߠB$ (ݷݛX"އH܆,ݺ܄p:p3.ۺcۯڸۯwpLމۙ7A|ܷ:"ݴD|jݹ2r4W|ߺ(]p0eG&w=F~j!t~zf5?~('i,320O1GQ x]1YJH 7f| (zZ-4@$l@Yhk:wU!w f / ? X d ' [ =  ^-(&4s,5   H        o+ *e>y-Za . K i     q Cp Es J   9 8 W   b f 8#5  p3SWstBlJREs;h?5Hh#0\=>|f &?U   M *    p! q "  Ux "La+Q t%7 _ ^ fT Z zi  x  g#*1l ` ! G H 7 & )g|JU#3GctRg?%sg _NVH3i^(tYx(= [5iQT/`:smfzXV )qd9 AOl~n)4O1T%G&b1N1[MDU0XCWC$_G)|h)\9sn Fy#a!0c0"l^V6XZ9cB`QMv11N P$$ g    | $  MhNNS& g % E1  X /  [  ] M q *  i   ~ , 4 5 8 J= 3  0 } ) $ O Y y  t  .V   W    h? R  1 S  ^   b  *RD mrr:ScS3TBpNc+p}5+u`}ArL}H(KDq $4<]u~ s2:9$/r&<lwSxPL: E % I #] X 5  V A E L|Ty:\Q@aM&WW9|cL B\R1*N,6ed5~ V]UDD:x^h+"yL}1;F]*X . Ivߪ(OU}#';1_z[O6|"+09 {XߠY+VwUQh~BؘRٔ7QՈiԢ+ԍ*}tnQ.ap'ک٬ً? ڕ6XX/تJr^ۺ(hܫ 2ھځx]9$/ $r޵ޏb]!t?m7g7BnW3%f;M*\8ni$,W<cYM'6\iar1qztoTc@(m+6@eIpc3- E | q <m e = _ n  H  h f  O 3 8K  - t H v (  e   ?Q(j 2prF`A@R)A![[-aGAR77yW&^"> &  1 p Z u Z . n a    q p ( e E / @ . h  8 w I b ve+ ;V  36   f  ~e Z5)8n5j)^-jT|hzzxm}@~xZe.vhW1MQIr ?JZ<: i)ww WpSf^kt!6 ,EEjQ1c+-E0yBXTy'Yr/FyF^+\;]\RY w(R8qR*bIc#"|7P2+Hh:w!78n-t78tvs?9XJ[7W:qPLC z[eMt31w3XE(b${Wl3LBALhޏs~guE܊|Uqntܿ}ܲGܚOq.MDذwުԖM Ҝخ֛Σչͨm̥~˸/gֆ2@bϩ۞ e'ңU(ӖbԻh.ԁհ=Uށ޳ծTc,ݱ5׫܈׃ ^܍U@ܢ;*M_dہݓݜb*5(#Q"^dUT "*1Y2=aDt Fm[ ,i[z2N>OQfhH6&s~i4q/s NR(m a-L&*qv!1$=E2{[J0PNDZIU]cX`agw9p7X>&*M y )r   &@  y 6    b MFY5@M[lqt`J:n S!"#ZQ$ (% %!&F"E'#'#($))A%)%*r&*&*V'*'*'*'M*')e'<)('~(&'&&[&&&Q%%$%$%u#%/#%"& #;&3#&#&$'$b'G%'%'r&(&(V'(''''''8'V'&&*&&v%=&$%#\%"$"$'!$q #E#"gQ"!=R`MP )2j[ :  @ Q  s F78[m.\clT<}^.$l_%}4Lz^ 6=Mqg8[E7~w?O x51NrbhbK>8}^6T,^!#YsސޚޑݦݐݳI Fjڰr5&f؅حפ֒x3_y.ZӨRת|Ҍz2v՛k%XԫXD+Օ՞ ֕֓׵׌E؋؃څٵ1Gڹۙ[ۥ(ܠg>ܩi-,ݵLݕ{݈ئszlwal]xWؼ8 4H ؅׸ 1>afxS~؍؞١_ٱLH 0[P܈}ptp8 q_G!hZ }gn"NWZa}'1zV|T@PW_t:S" VRpn  6  m r@$FS{2J6g}Jt$BCRT161M^w^G3l%~A%gc12|yRH4(<PI9U^*{IX >M)50.kV>!:xaX''fAqNrgk)_Iwn1SC`F-l61tazVC1'  D  Z  52 k  K~ S  PUv=VF;Ol!m+m*H c?fZ!!2xFRZCp +JY )gElC'A6Fc =Ve )x@di1tP"F8k)Kac=k^EFptJcX]'sb:|FnQ,K E*Lއ܋uq$ܥܨY` ە7Qm {݆g9ގJ Tdse@dݦڜ څboحأ֋[աՑ֧y ׃ז/ذدRو%E(ܥܮwqK(aOnZ'kD$_)Bf %>/6 ޗB)߹v)LB[vdIV*C d]:O>\adVX~oyh ;}5L)Lv 8I `+1k ?znrv{]t~X g[K  pKG,~<yf]igcgd z > j  { 9hi}Dmkh@wt`iT#SMOnp?)% Ri&{{ > 2 p  w c _ H H I  vt7PUCLtXcPE] #9S1)fAh%BergmY=OmV\bM}"  3lEe-DAdi4p~ \v6! \   Z \W  sw:\,I%p< J]Z4EETYxhMe>  >x e!#k $!$V#%$H&%&&&i'&'&' &'f%'$&#&" %}!#@ " i!# vdf} #w}{'zzr,Ss isiR Ct  1  } 0       C F , i ve f 9 o +Z  jbu to6f,UyR16}o!6r!M+{KZWz 7HA@0R?y3=L $16Woy(|2Q}%5)QHgK XK   ? ! N rl%P BWZb!|z9 wt!V"5#$ j%P!2&!&u"'"(b#(#)H$)$,*C%*%7+{&+D'S,(,)p-).*.+Q/ -0A.0a/102132446@5^7G68f79P8:D9;9<:=C;9>;>;>;>;>;B>i;=:j=:<:P8?8@9AN:#C/;,D<+EF>FA?Ff?F|?^EC?hD>3Ch>A=@=P?V< >;=:Be:Q?:&@;@l;\A;A;Ar;A+;~A:@C:D@9?9>V8>7O=?7<6-kbink>~ b-g+][*UWZPUdN7Wx};=B%{C!|y:Z P5(-g.]Kkg^] lG:$g$9Woc7)]|=ir"I7v7a~~.I- %2:PRg~v{h=nVv +9V[n#PC|c0FYt>A1z6JO ~        z4  3T %6GQZ(,OFDu:=gO[=nbl?Zn oR: 5n 6Y k  Che^q1[  E@ @bK}}  t `  GR , 54 =\wSEI>p+ Lt   `$ : 4 h  h gQ/ ZN-*>+zT\L|T2   _  Q  b  &  [8 5 01 g  v~ 6  N  5 H J G =[ 5CKDnIeRTcYwh_d?Y;a6m8kZppsmN6 ,aoJfI/:N n]G/H6x$f6X=wA.j޿vTߛ3ޘ0[+ؕۄגzOګ54q] ٨ڹ}]*%܎܉"ܚ܏ݖܒl.] Hf)@hٽ/qkF6޽ڊR@U܆My)4t#Fg2f\v{&:sGr]`,iU*OYXi(tckJ}%h}uK0J 3t|//4[|'lTy5q8r0>>iV]FnzJ )oO  U#>rW3B*93n:Z;~B%a`Hf[e3;qE=x]FsNw|2^k7&:^tDo> zvwaAUAd(3{-`FHyDmhV:4,<OaZ]fwH  *c9nirG$'jC,QZxiX    2[s64&qc -Rngng ; \ \ G * u Y ~ [  ^  y % [  H  m h e | G #1 xW#3?I92yq6&'#CT~"]U4q9bo/T.#{ ^o~<pgX1i.Z5M!3jy s*:c&<x:*9p~ K!]X7Ek$T][9PBe3N0 1$w!O  z t   lU ~ czd!x3]W)B9FjGxx$iP$Fe; ~K S a O ?B :u B   D]  Q   S   H> g   5 b    " K u. V   ` ^  L |  : v   P  9P ~  ] W  Ma^M'w +-Ej T"!Inf2.6;8NoZE4pi7yQ1]#J|9{6>UtB6.`f FFEkpk>se5w  JAgOMw93_ch}Hc)In?m f>[_kd%J*?^[M?(LuR! KMKk!-zpt#Q?Fp9"^b%n}N+z|~V|N] j~2p HEF8[mc1 ]7!uHe 7#,yV:z|(r1orFP|bB!j?v  4 U v dy 3[ 4q <Ps2 q%!Nb0 5 +!9!P ! ! l!;!M!>/"/G"<"%"%!GU!|  J1TZw>v`a W     ! y  Y *     V   Eg  w uH2#ZP1S r 'qDgTj_166VH dv\T:?.3 z2 g1 ~   U   :  u -^ J U V [d   / Z u  O G " l h  ;^ z G  EK    & V ~ + |  O   yl I   D  M ? ?  l 2Si5y;A ~iV;OH6:|+!,*+)+a)O+)+(*(*(*)D*')*<))S))M)?)3)((\(('(!'`'b&&%%$$'$#{#""f!T"O !S!g!!!K"W""]#?~#T#o$3$;$#&$e###"!q!&C D"6r}b)^>kT   ^ : *F);xAtt#{Z-XZkqmhS(Bn x6S_J*G\ N)pKnb/yq.D0[:MW@<}L04mhZaW dxGFi~96:i3-W +-Tq(2t ?CHVH5}t?&WM>@jYX0aK \yql7B;#_"1y{OJI+e"/OJON7Vީ;2ޭ߾ޒޏ)S(ݪݛ`<1tA7:HSZVI56ޥ1g7"0,Y 90*lA( :eY*HjC[?=- ]m#7yq e & P p<pp"@_}|&]7J\{ OR9&DH$9 !"!"- 5# #M!O$!$"5%P#%"$/&$&%1'&''M((()k)k*))+]*+*,D+-+{-+-(,.n,..,H.,Z.,X.,d.-Q.-:.-0.:-.5-.!----- --(--*--)--<--G-.T-<.[-K.[-_.g-x.J-.?-.-.,.,. ,.+x.8+O.**.)*-)-))l-(0-M(,','z,'E,'),'",',( ,R(>,(M,(c,")},_),)x,)c,)0,)+`)+6)++(*([*y()@()(;)'('(((((X(((((()F)f)))*)*=* +{*|+*,+,f+-+-,C.|,.,[/t-/-g0c.0.1$/G1f/\1z/C1o/0B/0.0W.X/-.,-(, -Q+Q,*+)+n)*)B*( *()))e)*)L*?****E+*+!+,8+A,1+\,,+P,*,*+]*2+)*~))((g('('h'5'&&%&&^%%%*%$$$g$$$,%#%#&#&_#W'4#'(#("("J)"x)W"t)!A)!(!!]( ' &u& %$T#"!A #5fO{^UJ >da=Y@VVs? kt (6  _ NK@eN? M ^ y$\3qZzI-#6UdrhQghOH`Q0v4Ev.'5md?ޅ,%ݳ!ۄ8UwڶB?3:`Z.c9$NdqX`m'\cX\ouwCvfVGM;.5Vq&m6Ukb;PHVPg7"< (e.Gzp}9S3~   * r  4 + ~ z Q "   # e & s [ 1   }D -D:1}Oidez!C<  0 Y D,  m O.tFp7\QJB5VAUK~EX>:/)c -HSx J"f]S${N#:na@Ta  [#*8kE,HFXqu&?z^}ja>i;cp6fvU2 p E | 3  2 Y k j   ( Q! Tz>m<L $/QpAbK :U}GYp&-/{!hM [{L*R-z`V lV9Z(Dp9 i7&{k3 PN5)MNMj>7<p 7QnHso!qu9tW/ Dh4#X^N':~~U \(vv Xvo06uK}ox;My(]>|yI,@kO jqZwI 8$6%fE~~E$Zl]Spvl{~FrD]=0uZ_G1 b#r^G[@k?wYCpa %   v _ 3xc(( P v 'cq^m: _!q"!t#O t$i!g%"R&#H'r$6(Q% )"&)&*'+B(,(O-{).*.*/=+G0+0Y,1,E2}-2 .3.3/u4w/4/5/O50\50V5/>5/ 5/4./4.X4.4=.3-3-3T-]3-=3,3d,2,2+c2-+1*1M*0)W0B)/(/O(R.'-',W'F,'+& +&*&)&c)&(I&.(&'%&%&c$F%#_$"v#y!"A ! @C^H+OsFuM>8"4VN^_^C.{&=M$Uho0C6,fva{G^wW1~(* \| r x t E C wVD|{'?`. `   w43[ cdqy>,c3Jcb =9PMN"?mp--d3%@ y{"T&6%yOy)cn pJj1si+%o4=u&Dx10wc*}O'~m=S\Gs?o4TA#3t"q^G&&GGR 2,^mz_3|! 1can^3OzNZ%SmKKAC$X3z^CJX hW-] 3=k_NcE;Z[w + z  H % = S^ }   y Q &  Y  ^ j}v]BL.{JnxNs! .Op6b}%/.^b# #>gF/ur2Pq!Q7M ~:}Vp>QTy3 QwACE4/Oo5V ha I d  i g ^TcQATQd^Y\OHH/0n%>e a*zv9#D`#n1YIxYS\f41<_$,Hm9{|>rw/#kf]*tn(|d9hzOJ'o PRh{[yrsJY8,001"5 WF[(P=~)X=7# 0SHrW%c 0mYweQ]', /V@Y=/`?B;u)=9w-4uG e>O9yy7iUE\UCYHTM|a{"GmGS#8h56,gNT(+C&; XuST()zAze%lCK,(i+t #(_Q D:7&i=h*+jKeJ'Q^[ xEoYC"EbqmbK6VzlE)7"crF6}Ak` E s^ 5    Aeh|_& B o  h  '   t  " O rv0KF`1qI1ZeNF"xsM&>tWB) s I 8 0 0* + 63 ; ("   ~ = i U m ; D -  .z g`  0  C  c v  g 'H   q! E Z K 2 t  `  M u & I kzgYt9c5i)fNU=*Z1 kZ1 ,dC9 0H`N@PE4Z?)bVuGjx5j vl@.*L/j=Ey]u@5AYDg!kf@bJ1kbw|;?AKhsE~!c$X~b_kR ?<{NCrwdg=7CG!" +S_ -$rs"u#k2WP,a(36]-hV7g ;_}i\,Czf22cx\"E2 HkiL3d67!g\CJI[4t `RwPNLIg !Ms! XFo]G>6QPSxc[4k),#gS8yWjv7e&;l7`]64vDL 9]T+'5aX[X3s0G L"-t gE] j.O|&EsNuV"kqmd,_l2^3W \B^iHcf K.@i D[r!ed oKr.@m!K@$Sh)\Lz2muZ0,r,8t@DT5]8|ByqC y p|Q<jQ6V v   )o Td >  E y b7 \ H    ; }^  P   ! ] Z [   C m  >  ) e <Z,EvutmgXVS)=c`_8v)nDE0w <l.pi{df*"uh%)@J)`D'ydj])m|_T < i   V .  X   +U}5s/G lj   B Z D _ F   K++09J:`PVg8A-%,aU{Yad\ionH3D%KX7X +](>1"nJ[}":O"AX?18;J.DMw_/$ s/%2`mOu%S1Hxmg4 7&X9e)HkOuE^.O:.X)ICs no5qySS? u+>K-br/{*U4c<\ P,>>G;5U$ Ju|1 T /f|i[_dSDC)T,"6G<-d-}d6" %-?d_e=qsMn'/# "\l$uxMu}W F-H0zt|LgCVH@X5nGh6c,{cbdcAhxv{gX7Db~5eU:j>BnXB4IkmtYtFnth]U>(^ k}@HXO`~j1^N2;~)3V fi pq(bH=Q(q j;|Cu)d> YiUHo)].t}flSZ~7u56v A T7O 8U8oTr*5'6N7c n?F#N},{dCc>> k^&W% tbG 2]&Zp|([9]L!.8:+2%R[j30 12HIFKvM9?C2VjTtvz=vH`sVI7/qMAc}8\SW:Xex,F7X92O5 +}g }K[bEeVE_iyD$/i%CQ"kaPIEq`9#i{I-0cR{-IUaDj$U$0opT`6]9xU}\mp, u   4 M B [  T !V)1Z>2Vb 2sM+C.{\ jI44T }8>vj4L!/YuF6]$fLtX, $ $Q|dL?;"Xf> Au`z\.EqD|8seaG1&~Fl~^My@wLwjTwrn(i\pQ[l\IESX.5YG]Z}9"NnVx+zJgnIy(SmUZGy6\s(Az_rjl`$ $[.o'>Q`osa%_RnFB&h,+#24a;0it m0VU^"w 0  g u ,o $ Mr  o & U u rtHy=V8SA0 Clh: jOk6/y#0Yl +^r~TvY3VSwIZQ`:.ms-OR!O[q:G:a'[@ ^vufPk R{Vl[?z]"P\ ,);N1H%'v yRE58:J4>? O|_#pD &0.9Fyb u7:Tsexkw^5*FUQ"7mn6Yi~XijQ sijjo.[v v@ w ? `  \ q ?  ? D q   O  J   6& Kss  (  % n 5  H @ O < z [  U K  }  f  o ) Y K S 4 1bJ]!Y1 BHD@vMhaq^mhJBJNC k,-}5wff%ecf{|)[ masi}>& XY(`DayF,1FX7ۍݐMV!ڦoUܶQܲEܹٺk6wڤ?|XPܝ[*-؏(-M9ސ72ݛٔNeܼڔ;.GwEnڌٌٞuهWEٱk/ח;oMܘԾ|Ըܚ!݈՚I PנUIߌ&܌hePGS9kEJ7>;du(m2fh9 7Di6( ;(t7lKTw*Zg>R>t`iF:AH9e4d7`7h&5*/x8P"i/>&PiP  |WC}2eZN! 9^  $ 1! = T 7   R n e  5 C . F 'E /(.h/1` C>m "EIj~tY{)Q9q%IYse;ANlq!=8x1Dmy==!` 7f Da 7 7  :  $ x 4 R U Z g h x  Q   gd  m1   V2 s {r O F    !m #r%!nZy)gKcpb@]jmqvePY-2s8)Te,"bSKdO3r|Uz<] 2 L[F~NWo'zpߚ 2ަJs/.'Kޏnގ69ݬ?gCݑ>#ޣ YbpB [2\ D>h3 :=;e?-T)ig%7" %[ {2=g gV6lY >f^U B:H?WnTBSX 1Y>N~&+z  - k6{N<} }UxCu+f.EOT l@| B mAm6! g  : & I I M 1   ' L -  b*  H `G   C cH$=J&-ZQ*j <1gFU4Z6gP`es]Hg?["b%nv~Y @#c#YL@QI!b0uoZaLX{Y@KOVl?|<)%+pLp~L|R%RshhaSL&F^9lg4 `(65    U y  2   o   Pa - V" 1' 4]  "  8  r   X y  x GQo  .EjZ}zN3{ w D t 9 \ 1 Mp"^Z~oVS,g9  'z   J  =  7  O  Y @ ? M   O  -    2 K^Yhl`NG3,5_3$R1})khC?b`!^d1G|FK7[pI^;5?j@bl:K <klb[[Ol X]Gq' )tY)0n?yj'8W@{z)p.`B&E#8-{382 skxmz Z  u I d  J v  I o ' D n c   Yy K $  # B} [R h6 t |0 zI   _   J^odAA(Y)K0+C0VY0N Wb6; o  U     | <z 2H]d38=V?e8QTE4  e xFE 2'L^{Z223;3MS<+AQ1 H*I~fG g{ `ve;Lg "MmuUuP!@28yi'- E8E({8\2z*&EgX?'j!?znEI-O50cG,Xz(8x&WE2#:]p,jPW,nr}S* z-%Cr%D^[~'}b;@P:mb$~/z`NTm7D=]\ d,*Md1?-eb : Y { B W  96h"}'9n%Gwp-76-2tO;n 8q 4  T  L6waf6r   T 6@@X{Z3OQQ=*G&<!10x/k/kN U K!!E " ,# !#y!$!K%6"%"&# 't#'#'X$U($(R%)%l)&)A'Q*'*(Y+@)+),S*)-*- +B.J+.W+/D+h/"+/*/*/`*x/*Z/)./)/).).).'*.*w.*e.t+W.,F.,0.-.--".-.}-..-L/,/,/q, 0L,:0',^0,0,08,0S,0v,0,0,0,h0-0-/,.,.,-+, +*T*))U((&'%&e$&C#+%"H$ _#f"Z!L  >[skI@  2 y  O[-{3|i\vaB{U^`sh,B]M:6i$8/&GJ{x8`XP[kVoj=/SO{VOByB63$.GY>{w'~4x7oHtalkd f+:PVQZleEJ~  _x4^v#R1D00pP3Y!c7.Gsb^2NE%JC$EJ;2BXeeu<)R|)sex,#Z+r?vB9rh ! [ d <  "q!g5dszRLKIXpc   uo 1  e " 80|%&e$oJ -[p:1!Eup0GPF2+Co=G,/u51ugPb8$RCi#Eu%{A '`-17_..e]t9rZY9ohXSqK]zl܃۰ܕZ4fۯڒS+ڣ0\v;?߉lXܝ[{g}+kGME](}49pe'W}~uZnYP#= tI,N{9i_7dk]r&7.^\enN DOr;5ta1TXLK)6]l_j\ht *GlTXr0 yާ&މa2iޗ.Xr ߢ0ߴ+Lߑ:jo($d)܉H( (FI*^YCnqa5T~SO0^?,k1GkU@)K2nc!;H]2INVvx RZ AH/>a57 c  I    Z ,   j  a . Y  J  V  n  t @!>) l C c] S * = z W 4 H!  . \M~@FK-m*mJDf,:cOK3+ mCrwUH<[|Uc$T ZtS?s2$de@.߲X!:߮$2sߕq*I&T5PE{c߬;߃*j _~=JOZ<e we#}fLT2s߀@߹I"%1jq.rN6h}]`TG.)21zFck`XLVp yo)އze,.|fm߯@# \Kv#$l9GmH;  r3rXܚLZpF߱K%lؓeج4ط ش׋ߩClGH ףݹu&8pڎ`G6+@^=٤֣k֍׻ܢEm(HzڭN܏PA;ݜLlu.`݌3mN$_h3&e)',oD0 ?yJtdMAKSs( g kFcaZ <,OX/ BgX^'iHuh `{Z-P@8RQJ4>jN U7*'5,sE0O| jgb(X811xs ZD6)r;E(Z# k r  -l   e p @ O   8l%W+BPj ,  u  Y '  N1   S  r  S* AIzc_^~gbiQ3ps 1v>fLmDN\[f @1Y'!LlZge>\VLcx79&r [\%+r}`SIO!~N8P C8N:P B-o@QK- =\61\%Rq_x @t^i+jIn,vcJ|rGh<$/5)00\zCiunRQ5Uv{&dyY}=yYd^r h(^U7 =C-'hBi2n;H=S(Q )#@~GfBJ%'WR}bGG4 Yq@s.8Fib)mqjr,35 x*8}aukc~_u4%\ &"SM   Y H W a  a ( X 0 | O z B \ k : ~ + =Qh P :\piW-Xvk %Iso 6I8 w  ?  | F > S A X  + *   w  q $ KM1X# j+:N <Zy+?|w$0P9 pO-5BBPAXx!nsS2'rn I q   " r 3  4   /W J ? $% V  b  ?kysE1o#>u)s9ceb   p , 4 w  W" 7?*;z-  | E1 _ U o)  ^ V%wv=  b8*6Q7kK`3e JKp#GIa[Z(W$4.\ t Pbn'447N*_\5ZjE -8_"5Qe0n7 (  g z 2 ` ;  J  \ Q L 2  M 3 ' V d X [ t w _    , = Z n g Y ?  1 a W | <  K ] p ' b   `'X%4{*2_#@2Mqb$$+?R7UfdA;W5.I]680iuPLߘ߹[ߔ޾pER}Vܮn5ޗ=4kl252S$[rc@Dvuzv" H=Er~2Z#\J#"^3-Y&gxJuSld?9lMUZKo p`B |GTK~\QU*D R"[01$+br-B /,)]?)oiw&y?j vB"kx_   4 W p  u      4 # - F  -& p2 VReu.z+05c(}P5f?NhG8,pY)guXL;;ls)AsHojo ;8]Y]e.)U (Lcl;o#>duv)8.];{~r/5j$,]Wwb6As6x2|}_7 ~ Y 7  m S {  i  . b b B  h w  S  C T ? P g'`X(v! !UA _ x+rx9'/>Yy`$U5Z<<2[yA1?ID*6YMXn6,s?HZj&tFE!U`A|>;ߍ޳ީݏމݘސݸީ2PޞߴzRߨz޺ljZ7ܡ{?Cݽَf7 ٓ2٤KQ` uyٰXt%M<װב8M֦Ն/dӪջӁթ]^4zԸ՟՘j֫؇60DܱDvX$Oݹ"Ih?rUdnLV{byob=zwJP7:*[\DD8 PcL-=K2spC p?T\j)|o T?G!S6#_e#^w[T<Owl'  @ S t Z   j "2 L    2 \ X X J e C T  q E i }n q ._ kD u q 7 >  b 9  | f ER    l"x3y~PBPOl*'RvcIW[o_ijif}2{5J5&5x(jc+g,PirpidJ^\aDu"s 'F9E Le^uu9\HUN&&M 6vh$Htm6LaS?n5x}n_c /W{K&vFCE 0 9 C (  a@ 8c e a 7E t  # <  ov  1 K cH&`fB20C3\~xpAn( y 0\   DH  R  < >a t  $   NX4v!D<vxd,5a `r .  r Z ?B ;:K>qI8  A L s  s ? ^  X i U6 G am o.     ? : l $ / 5  r x  [ jEPVq185DN)W)= &  ` d6s?tlo)37L l  S \+vCQ0!Ui,;B/NpA\(^ 3cHS*bAU6)fS0AO\P#NxEm 7!k ! g"!#"#"#Z#$$$$l%,%%%<&%&J&&_&'c&Q',&c'%Y'Q%7'$'#&"O&!%!;%$$#"RJ"!0!  j@RE#$&s TB{ q*=2=& m  M$ p[ {jPr>'9 sL R 2< 9 7 UO q  x $g0muLxhIA(DFc6r4M XOH 7 vX D  T( {&.bb  Z H      v;fMdZYB V  D > vu   Y G   t 0 @ - 7  " * * { 5 & M a N i z   T   ^   j K {# + @ hrE ]~0FC 3r1ofPZ9hskH-!}RX5)+ >1 ` /  Yx J =1 K m & N  0 ;`+)YM*]D\5i4E<dG  N    h 5   w =N   } 8- l ' I    m u   - W G r P # `|  + b W @   mW 5  } } s g _ { f  Y  G  a Q lhXG"vw#2twWZk2P%FlRt. H!?m"8#W#xY# #"r"O!M OZT?_a1%D9*7?#MV00{DL.jq?< `?  {  = ^  2>:L;9>A;[<4ez)xz e!wNbuIn~,8!q8/sV#/Gve`DS^vH#-AhH$[_ji)z9h:UnY>eV J\wcf+3gy6eq[ GP?z;x7XGhEO~F8%cHE%AJto{ZB2`| j[)(Rw?"!D(VXv1=C=~%4fM^a7xH"^QR sq_>a6%y9P?2C0-FF {   )  O  b S T  ~ | ^ I C T 2 = ` B  }`DQ91CYq3O# Z  [e ;      r      WpV}X$W  (  Z y 6 !P ( ? { | )` a K :  8 rl vkf.DlFJ  o&wtqz/AENYKF =arUP'^e VJ>-wrLGm  ~ ( 6  b kqbVHT n`   2 4Lf ?{C.6?+ll :Y:R8oo,\9 y#5Bg@%1mN|.tt"/vi]dQ9$WM 4 P   /  a =A 1$P {qfrlazaN#l(O}ws oj|TMrO s_%'TTd<SiJ%NZ5-P&C`z>S  B F n  Z B K 1 6 r  ;   "U  Dba79ABSk}u?o6D;U-Xp7I\ VV5x%<%s{R:o(G Ntnt,{H|1T   2  z'0YEC;A;j8 A/ Gh%]gRb[m GK:Q o!z"'#$% &_!n'N"(@#($ ) %P)%)&)g')()()*)))))).**=*r*K***:+)+)#,),(,(,-'k-&-&-(&-%_-y%-1%,$l,$,$+\$+$*#0*J#)"Q)H"(!}(!-( ' 'F';'&&&V&B&'&&!&&&Q(&=&Yb&&6&':'''kF(}()'z))'*@* N*^*B**)oT)(2,(f'l&j &eG%au$l#&#"Q" !(! & wH  ^swYZ9*4^n#t5sY^II 0  6 XE<()4<+j  k {  K  : TZ oh c 1 m Lb   M*  ( i  *o 9 Q+ AM S  X t : y  ( K 5 { q  + p $l5--}uTqu02+^9#]5ho s[D_Ep7AjWi| 5e*Qh;WV9U9{ y\B'"l8"p|-Nw5O2i(|tHY#NN^MJ($;+ |RB%S: cr#_ 64T nGcrzFj^T<4mG[NVi2?<'Q3CRQ r ZuU"K {pbAws/H I a  3 4A >K?;9'XN !!""l#m#$"$$$$h% %%%N&%&$'$S'$'$'$[($(%])%*&*}'+(`,)`-+`.k,d/-a0.W10M2!1313p2425252525Y2615?150x5/$5Z/4.64>.3-3x-2.-1-$1,\0,/,.b,-%,-+,g+/+*9*B*9))5((;'(H&U'@%&D$%g#$v".$!{# ""%|!t * m!PiXBw UY:YE ~W246Dm274o%w_j5ffoT5X+\1# Wp*'q  GZ  &    u  $ l#90  !D!""!?m!l 1 ss^;K8*f!+0q::C(n*2- $ O     Z  I {*=CI]cLXa&DU:f}M 1D[bp92߯^PߞWޕHgݣ/ݟܥܔBw7ڧWٽ؊׫ P֓7ՍԫjdJ]ԦҔoJA;ҡC/FҚxז҆׻GJ|؛ӵe>mrָtD3؟ۮكd}ܡW݌R yܒ܌ޙn8%~{ݎڳ#8ܺXf ۫عs؇5S@46N^ ؐ;شچ8RzcڈܙHi|݇ yޭ- ߴ Psai@|ߗH'ܢ ޒzxݏ<fݔ^Zfv%9LzFR" p;3mu}pj TV2'3Gk~WtrR%6:K.wpbi|<al=irR > # *: a   NI nUO)l v~ g B - f   ` eg 0sg2y ufQ*@!F-&   |o$5I|c<aEW "p1.aq]e#Kds <n .tyZ^)uPEu.)Di/F~" 3   x $ 4g S CQ :3VL )  k S W  I ]   3 ^]7 aX &  u y  ' U  !?SA ' ? 41 3  W    I O]59xP7!F_jN9|]W^PU BDbs nZSKV;' 4B~I$)tR2$f&P3CApv,#T?2K ,xYJ vV/ J(+\)@W./qquFt^hM$t55]Fieg8fF@OV+N5TFqKSerOZ;f" B!d y~}qQߕm _߈ܮ~ަ܅aݬݚ gߙ@X@G9Ss} q?~Fakw?H c"v't q>alA#<~vj,I kk ]   VN <4,  l 9 & U v  %  ` , ; )V W M  ) : @ P 2 u ^ 4 x {  }  S w 0>  m ?  n  I X 1   Z " ,  - W B O g c p k v 8 r  o [ ` C /   - ! u +  I  amjz+@RXz5Eng-Ez(dEdN6( x{*C&C. - Z  S  = @  I0 E ke | > d { [ (  g  r  z  z R x  2    .  " L  QZ   qA  , # 8Qx,c#?lH ;aeeT<(^)\+&e>/xOR84;]:_v2xj/wT4*'|TP(gFk'$,$Cn8XyIv=Z%[t\y~"Oz"[vG yO egoH/ ~';$]xgv;UBK'mBy9~k;+ 0tw[ OTae,RZ )y$;94p}{`NEc>/zY4&s"Uec5w /tX[=ZzY^C % H M t  5 i + ( 1I   `   6"4C^'10>D{ur&& ;!!"{"#Z$_ $k!5%N"t%#%#%0$%$W%$ %$$$$u$Q$@$$###T#%#"""Y"-"!!!T! ! a O  ~E5E ;  w!8""5#[c$~$>%d%HH%$gf$#"f!I z/qY,CY3tr[|~;u5_% vSFO~gHlclxcK]"T4TBu"QC0sm~ E6.`0mg&|9 ]n4) dNL/%S$FvAddickH<Hi>2LI | 8  *  - T9 II1 6 -|    |!>y&q5N6au]y9P-s`j_j2}V } k3yU $7y%:m)VOzofz/n0(KLoJP:f3+' /z|kd]  6 k[5h2t<S*FW{R:z?H ;aj"/+ 6'Gj|vxUpBF*\8} SMVUuKz;F`b \pl">VYX,* -iem4 ."7Hvkxf7S 3 ;Z 1   r0n)k5qH}3z (o m p ` 4U=-2kd)I]})^j$JBlWCWO-!DM lxOK=eze e)!!/"X#$$5%%B"&& &P!&"'""'#'w$ 'R%&&&&&u'j& (>&~((&(&)%(%(&(&'(;&'j&&&8&&\%&$'#&"&!& e&% E%+$H#"!y _J!r_F uXPJFXy2& u (  5 _ h  Lx^s0+HR}B}\zl@26\F*6N8Ni} &3+P^=WT e^nE$y04G}&=jK6m>8Yo!&p '43x'wZT^1QtnA ^) l |>j;+.|S0:h,Yi9wsIG/M:0v  <  > 0 8 R / Cd "O}bi,DL@r?/  O}?epDgu1K(uL-mCB __"\ ^ L~6zDNUN%@'8{83 | Ec    ,3MLidTR= ;wFw+v=0\[  ! l#!$7"%"&#|'$($(+%(%^)N&)&!*'*0('+(+)|,l*S-C+.,.,/-]0G.0.*1J/U1/C1/ 1/0/#0D/r/..G.--!--W,C,++**E**)f)1)(('D(D''&P'%&$%s&f$%#o%#$q"~$!$z!#%!#!# {##!#! $!$"*%#%v$z&p%5'l&'v'(R()))))!*)I*)+*z))( )@(-(O''A&%$##!!"  h q6|jiV=a)$(C7#!  I   ,B 8 M 3& N   a&   Z Pxiw`df}0 1{zAJJ I.`UqFj,*%q-@KlRyi_1 nr B3oM F &{ [  j #    8  -q)N4|j HMW3h;X&8Qkj!b IAKFJlmM8 Kq^Zr7m8 n>l4qR2JDn6!_$NLn@Pt}+gl`:#%!6[u T X t 9  + P U  KF  > .g} BX E ;o C :    T   l +   ) q  (  k P 4Rl E I d^x}L1]M7_6[T ~2d~9 ywW+y|y"`p{]._^Y;Bst=Fk`7[<69(3!$H:{#ymjDt!;Ny $ +p -I  ^ n    4   ) q + _T e  e !ML*eqC T T$,EU4y'CO-j  x  U!&o c-lT( 0 PR o  \ m T   t Q P 7  c , rXy"CiwSkKr$hFzQ}pc  $/ReK-v`#F3KO,Igr1.1l))thwz"8+sT>83+s~\Kx|/>@k?+KR<fs;PSsq6JXD~  ~ w    { f 3 7 l n k  4  #   W 0d =   ! .h I) x  z 6 b e  t  & 7 ' l t ;  oHy1Hd;n V ~ o Z z  b ? sH\+p> bG/E 9el1"G>ac S-&^FbvYNw^"dYM[gO>*8Q2md_f6B uaB5S^[1Vw~l6|w,|1(\J4-nzGYA:&GC)h"_ 7B%fE 0f~XyNqt8-+0#5:bXVkRJa#ywHz^}+n7}N(k=_skJG,p{D:a+n/ ]#fF9^X*X V+tI@R`i5IKt:v [8W%0|H!RxD J 83"w*W* Az0e8dv$( < m \  h *  # p u R i, '  q  W 9 ^lO.T9KdT 8 2 ~  V 8  t E > b e  ` "kJ)L"A!rHw{%5\Ly:I(e;nRo/a=W:b|301hrfQY/b+fh(3t 8&/p>do o`svg=c\MB=.#$%[+)8)I>_nz0L 58^ W > } E 1``1/WWE}ue8K Mc.ST | p ax =t s d P  < n  &d  N 8 otg )DHU'G e_+ f&[p((u?1't-Ez-OzD/`X7):ahn5l]uPSE5.79WPq Oho wa 5Lj Z=)wEPn.|C|q~S}[B:z~?"S < Y*6;@x8.fQyN!wLT1!b?aE*g5K=jx?OJAq/=[QVB:$U%ETN"29P'7F-ka'z|iqv, 9LvBCkZ2l,%\y+WcyUx.[Je);zI4Q*"MCn]n5pDk^k@x!@@ot`iq8Ss 7:b|DcTtHaivfZAchUnfj5}](y|9W-ߵ߱Oߣ޿Z޸߾ݜ'w߁0G@ޢڝ(ܶU(Kc١؏؍ؼ׋փ^֒ծe%8i;յ}cm;ۛפ`ٔnS#cnތ )cߒ޳!N K ph&^9Dzr?m!0@fb1({kPI|52 QP+w*8kq8r\5DFGO\k~\@B}\>8/("4eHHDO]Sg^^gV<~cS   P: B   = \i %o_lH*Wb@J2"-w2/3=*`-l$Q-X0q7%hcQx_D`6 # +%cf|m D&0Y$,u!7js,B5`EEq:mz})?(mM7.q_W{Hd?E7c[Mm CYIh4a mTMg=kWb<0x9_}:6k/bzk9jAoBL,/m7r#_N9}/S}*`,SE1H%k߲K,cި Je߮J߻w+>Z ߈ުW+s݂B6}N<" GYިw +Fc+ijdISbqmY_I1 vsdL?u\N8OFvF|& s.*-L5E2+|M"yV 1Or%z8' |O 1qV" d   c ^ I  c g =  N "aX  8 U  + z ]+g^ ) q! 1#G"$#%$E'&(')(*(+K),)5-*-*Z./*.*//*/*/ *Z0>*0{*T1*2j+22,3 -4.5/6*07B19Q25:K3[;?4<5=5>L6?6@(7A7B7C=8D8E 9F9}Gm:SHQ;$II/K?K@L'B^LHCLZDLD=D<D;C;BX:lB9A8 A 8R@a7?6>5=45<4;3:L3p92O8X2C71,615T131201>00///.F.|-g-_,`,K+J+;*4*;)(9('M'&&%%$%#{$##h"f#!" j" !3'!+t }kA6OgP 0@ X v  |d6(g &HJQE\B)!<3WX^*-&'gO~as \x"@,OOov(a~C qC? Oyo@esv9%GIRkPEL[g^wHmD| H{OO nK-"eEbg4t, Jp @ ]nrVeJ 3UI F0_kHTjNl[$?Sr$3rtvR0,6.(220 >'R$yh4"EHv)6y_\C?*/oj[o?l2*3ZS9AaUQ(1 GeK'3a}6b/|V 4_ Os{b>Ak }thP ; N n S ]  L SV(g=7w%~? ; W Se b _ _ y  Lm      1 j(   _  1 i i! -   8+  V !w  $Dxv vQ*.IzQ   !! " e g);#%JPea//ro# ]~sj  N 0x %(MBH<=#Rb/   I $ Z ,+ (O #z    j 1       0 %T-Hq 9[^e Z/ :WLqN} L  $ Q( d f Hz  </ol]r i6t~3|S7bH"8(H Zvtd:c7 mH#a]5 $;N\R7UX5:<d-!\p}?U1(,gWs8)[6&wg6NFr qWO+*2c:hdj_TpI0>hF^8 d m%(cTx xF {^&A;81'2qr-uaZ`/zPx%0+)+%<WoupAJ9T% *y_tw UIS[5 8 c`ryd,LS.b r r N 5    :>o_{h|w0N PMtn}`:'wOVn=5L/`s:q6OgcYf#2{_Fps5NDg; iK0!3*I|Oq!{ h      4 }`T*D _NhzK[2yUZ2(( <^Kj !L 'HRcqVf};)erS;5g%>l5#7!+i 6Pki 42)" g,}J%C+CBJg q o  m( {i^?ySdp%e\,yV W~[D.)]O~8 $skNm{v_qm0()u|H0ELh(LUT8 cmu bU#p7!cASz$GJkV7yf>Lkrkk9ICRpaB dL%yQ[*^}O%[?;5Vxbj`F0jZf#DMEpWpM 9> ,@?p~5I">h&&Bi/ &~T{96[y +o(1[ '/vq1K4J\&[w?hUYy-yuPOVr@_En ^sMu==Sh i n ] O 1  x .0 3d [  ( d j  l,)^|J*|M@S:hq+q  D k g  0H r  *    2 C ~ _ > i > 1 ) . w K T H & > 8 . $ . k  " <  W &y0B }T>' / T|#0Q1hl (Mc* q      ~ L    a| Gw :| Q   dx  _  ) B G O 9q"3}0*  mk  } b O} 2    @g v Uhh]K==/Q'|"tR %]NR&}hVC0Z-71;.JFFK9cX&iS4$'Ev|;*o)IEN06H^X\MEKQD<!VO|pKD w[$WXq?8Fgt|\.(\hV#$;dV`ߢ8hجY!eְهpSOP~Տ[|*7!6wүԬxIcҐ70(*_7Ҕ։`-Kr՗֤$BaSd܇K ٢t/ًv<[ވXy7[Ey@K(nVfc34dz CVd/th}LI2doAG  <K b * b`kP3OyiU(X9rF@Eo OBh#/ U e! E"1! #\!#!#!'$!$!#!#! #!p"\!!!!! W Q  QWRl0>NsSrE *r(YX4CnJ-+5?KkN1MG9/J&$9,9A=PWcfnsucb`AGo'8   P h #  j F  0  } R Y M 0 z { %  l " @ E 6f ^] 9 + LTMnpn+X).(37ipuX`8Qi2I_PY7s We'!ds Vt9M SkeHa>xOet V1fn6ymk F#|4[;o#}p:FCLwJ4,4\ET8L~k>2Mhnl*Ii|`1EzMMIut_36`VPqhpFk#IuU,   Lp  , A a ] |a h _ e  t 7  ] !?5{[ %YChcW>d.  !/"d" 2# # #,!$A!,$N!*$G!$,!#!# o# 3#{ "Z |"% "!P! [ iP<6h~& |0%rx~V0ic<l+U>jqjXNB=_ w     7dw{`E1 [f  < # )    / : @>G83M E0gSVql;S1Gh<ziuM%dk 1Hdo7*)zG).9EfW-+ yAw&8%wb,u-RyU)wDC f `7;AF>CGqTg39IPV& V`j3p a* eC-.On>];%; u`~i1k= c* m 5E z7Q!O;!s8\lb|<{"gU1]>(V.:purh3  ; w4R t  , xMb4c    e[ *R Z ;   ] n ( rU ;C0"U\R}aK00,6G/ Q!}"#s$}& T'!(#)5$*z%,&E-'M.(&z$&$%#%# %q"$!$ f# "!8!XA dZoK/2V1.  8 M K F0[5jG>f%SC~e0:'3/i`sdt[F+kM2oes5!k~Y~^x,+%>5mws_0w8M]F}=-a~S@2cek]5Ud7e` v$FtKM :g7QG@&-6 rmAYS2f[M/b@\`DOQgy@w u6~Y%|^.6kz0hRwt-@x]'Q1S`.>L<  1 u  [a Lr 7 8 P.^'AM,Zy p!{" ,#N#3$|$$W$$,$$1$$Q$$X $ $F!^$!P$!4$X"$"$$")$'#-$#Z$#$n$$ %0%%%p&%9'{&(&(T')'s*'+d(+(>,(,-)-)_-)-\*-*.+c.y,.R-.C.U/A//0/ 1P010c2020303020200_1/d0&/E/..-,[-+,:*^,),(+@'+&.,>&y,%-%-&#.K&.&J/ '/n'!0'B0 (<0S(/{(/(/(I.n(t-2(,'+'*a')"'(&'&!'e&o&A&%3&G%&$&$&.$,&#Z&#&s#&W#&3#'#7'"i'"'"'"'"'"'a"'<"'!'!}':!6' & d&R%l&%H$Y#`"@! l}z+c!XmFTL>2 /hLlN|%5J!t 2  /  I  ] f   /<2;CS]A@+_~uu)|]!y[=5 p3on*"88hawh`/?[n^oHX/ M~K'p]vLH;-05ODk5:{8C> bvg<%2{V>wI!w78Uj,%{D,HJ 3p~.JI6>G$UUYBC-?u IyJi6'"") ] 1`zqRaS<Z;;>Sb(X\ n4!ktQtRjq:tpA%;D1"cy j6[q9*k"Gg??kj7Y9w*o~)Y{Z&N7%/q:q<6<,& [ ~ s p/fH  U 3F/a#zo"Dz4]s]&7 P!+"*#X*$A C%Q!}&"'#)>%S*&+(,o)".*@/+00,0?-z1-1-1-1#-u1,0+J0*/).(-f'+-V&,m%+$+#B+#:+A#F+7#+K#+#_,#,g${-$.%.&.&1/'Q/y'Q/'8/(.(x.+(-(H-','+7'*&)?& )%($'$/&5#D%:"B$>!T#, a" s!w ~xW3"V4z<h Rj(_Thq  & =O B%c  1 \K::=8f|2CDq!Qx]v6-W__IA 7=V@3M/E>cmY8s8 clSSO@ [rivuL&3ga-b_ym,b:\j|^~"`@6"x#U)VAeUw.XDtIGH)f$O|=5~V//\)i1@M,(#t,(R>Le9I{?=_ ~%/Ov ";[#L5xR+;'!z?}4B lYxPz'.C {D(K~*^Y58RH{!>hcgg e3X4Ufv*d`0#l9xaPC#X <7me o;OK> AtSQWa%T9E?~7k?1,jI , x = q .}l!cx.^pX, $9K<E "g#$ % &!'"(q#)?$u*%6+%+b&,'P-'-t(d.).)B/z*/9+/+0,@0f-K0.U0.S0/S0a0I01*01502.0390s4^0V5|0?60"7 18v1819m2:2{;3<4<4=5O=l5b=5\=5=5<5K<5;5;U5::4948F483K736K36"352o52&525 35<3P535454)65656n6X7&7778J8*88889 8497'9787W8[67m56}4i5J342200S/A/--Z,+**p)<)#( (&1'%w&$& $%t#%#%"%p" &C"L&*"l& "l&!S&!%M!% $& $g #o"E b;`| [AB,})311yei { W +2   u   @&   [ F O IAN|Qj 9Y  O k q !  N *     P     } JM    < 8.) f t  >& x  l J,~ ]NI#jp M~ k- C C c  a    9  `  ,HkJp M [' T < L/Jm(e p`!Za_;%vagZ2hS*gl+:V:# [>BEy'QSL(ox>}z vyiO%zauhKZ|i|1F])[OIvQpWIbodELh= 7 ~ f - j 3  X } yp9S2lx`zkR\OW`sD]I1Gg{1"K$C ~{_/Cl(xAz)@ 0(FJh`'6Gw    k eO :: . } "  /  2 P m 6  |  }f  <NV9LN%<BC[:?zkW:![ |I}9KFDI!8i6{I&` Y1mCh1Y2>wP'(72^L"n?o@? PF~!-u~ ==\Gc>LZ-Ug~i>&u86 _ 4 O R  P   A4 zS R d ^ Z lu [ A , 6f S _U>9;O4%xXE5aK><}iS, a !"1s""H""":,"H!%!w %Nxd@j@x\8E?:[9<~ I 5Sl_P"(Q N 3o{O+6a<|xKhU*7s Dcngs-  -Mm.ZoxbJ guvSC+y V6wz>p}v>b ?5W9_bX#cv J`8T7UCm$zOeJ!*PN_ZXj{ RoD%b-Prw>P1*p6W=B; !Y&0EiN.%'O}bc*@d '|AI! U4 sT@,$ExU8"JcIwL&9Zp-xmphP;#q:*_ )tv @7zIw?P@QUGFH,M=|F`'EmtY 4[ >  ,  f T X e_&v pe9-xq#k^ !g2L2j -!!8"#* $ %!&B"'#($)$*%+z&F,,','-.(!-t(,(,(+W(=+ (i*'i)I'R(&Q'A&D&%U%8%$$#U$n#$*####K### $&$S$$$%Q%9&%&n&'& (V'b('('x('8(t''&D'O&&%%$-%#y$"#!|# +#* ##(#ge#7#LD$$[%J % Z&b!&!'g"L'"['D#_'#8'#'#&#y&#)&#%#%#%#\%#S%#A%#@%#<%#0%T#0%#%"$ "q$W!$ #"O"cx!5 @kDr-pp^Wd]@f2q-vD}^m|w q4fHL)6 %gq<sq(a r  0   ^fFu2ykVB@' D},%8XLb<~vPn6O- d> 2v|aFi4"/^lKY#y  +2; gtwyu!p {fr*./*)+"d%AfXE;2)BZCkHw#ZDBu!DlSR},Y]gDySo7x`^Qs@AkMBPUxl~|;ff5Vcx6gY KdTH1@]ݹ:Z8Y6=ݷS C_ZW&, 3/a&J_mK:b ~bvj'U?O=Q\RPT_]VP`t3z  kZ  " g ; y  ! a  HPN   ~G a ]  WQ<e:NN3Av  ) _    nN ?Eoh>l  .  X( '   H K] t f Y^ &   f   + c 6 d\w  h 8  ? * + e L n~   =6  0\<&L~83\)I:#l)zGi`E$p P S 2 _ CUC{P910  "CS}%&zK[]oYi]SCR/1p+' x!)S)$U?^QYeg;] eq=n2M%f0aip,ZZ VrEf%|@9m<7wpOP'R[fS85<^r#ego<VomaZ%i$W _rRYdaV&8IJ`"GcLpNxxo^9NSUNeXxF|$]0LE_RmLBN1=QuA~7H ]3D!Z U= u .feMII(u kK  9 x    t  bq2q@X"K~[8Pe RF+lMP;x,H1_opO' j=    s U ]W g {   E  ) 8> Y ~      T   G   2 cw v }   Ji/r"aat5Rv !   T sE^* hk : 0f0QOzI 'GZ6g0-O;D=TT<;go.Z(Q=rc~u&Z'g&)Cy^2pvW'*[VBI .9,x>\@^A*lAo^F@NYEWwp_/"Ua,gU1q>dH7qT86cuj%r;Z;MiH&!2_=My,@mBVdfiL2?^B'lJw y  5"tcQigv[Hf O+-LZ.UQC03p0A&+'8X?| Z 7f]![tLJB7^XuU2K!1T\6WYUTib##71hHq"@U# #1G~%l 'iK&HK}UBD{?=Y8Uk&4#)4*>Wu ~j`0GZiRmmAq1l?5/*Iqu 'MnB6 |<ߍ`}޴ުݗݻ;ޯbޞސߠ܏`8p.y> wLvޓޢߥ*߸EߚjߞߋsP3&.@s,=ߖ]Q66&*, Y"ߍC*߂u4SV"Re`{)\ _u5@ ?#!j\k:Ek (VkeA@X)s 'RJqf2L2 ymT( w^ee:asvH`,^(~!Csi)y]8 3Ry_W2KmrY@TEQWkߏ4B>D_{L/,7:r= "2CKcPQ QY]is5w4P"O# J uCt9wh Y~D<shDb8A}U@  c   , [ u N   /G~U  Z   TG   7  )   V - @R  q  N   H R i  U w J L0h=IyM~U 0z ( 3 < " ! @ ( )  & 7  s  Y v  + Y oB g P3 sXB Lc MBv. e"^E]#jpCc"m$PA2/.vH%!=!T>C=E}g *GnUgi:EF^I(@e>5H_nqfVC)|P's&k8jDiPO=vD epz/0Md&x:gO=;K_.+krP_ ^V '?P'grTC\/vaV6#1(%7:JZMr' ?`r|dB8dGVQ,p[CeMlg3g?V}J[=|r `%1: YL9nw !kchH3\#C B   59 9C F . |    7Je! xku'xI~yHeYN[rTk^%BC] Mol+ @ g#   }  n {  $ K M| SoI`>;|.x  !>{"s@## {$!%"%A#^&#&$' %/(%(%f)`&)&G*'*t'*'* ( +>(*(*(*(a*( *()()J(`)(P)'D)'S)V')(')'*'_*J'*x'<+'+L(+,(,#),)2-)e-@*}-H*-?*X-)2-~),({,'+&]+%*v$*$#{)!( (T'3&4_&Y%%;%$C${$K$9$$###N@# "v"2![! =x;`G;-04N `x k+     /   V < { g l ^ J E $ 1   q  o :   2   T     nN U T jY z  , Nfs e>y[Dav%MpAOlUd`^Qa12e5}kc@/yrhmPk[mWbP[NS$, forQrn:24nrFI=Q?c+LbI7Y0NE:Y8u\j9'i @Oc> 8BK=P U w^j]r!@UdQ0$f=+ 5;S m^)`a0l  ?2  !   U C ! r ) |Z ) gOKrx[BWAEld9DaMCgLTB8JNUHs7rLB+2G K?v,Ivw{/ero p VK H I Rx ] t w.  >  p~wpZoE<\~<fo@x%'3+sc=BC)PaYA"pvaD maq%[ v)=o{Z$ aE     `3 \ j `6`zTS9 9< YC  7 m  '" hx d  w   @kN ;4}2/)9#_PpLL8c8L(c: =b$GqjL-VbKk/լܗdۅ/ڔNՂЩ/ЉGmKu{1tPˎ\ɚP(fǿŶu7=WƎG6Acv™ʑ˫ V.ϟ!&˭;:<͌ ӄ85S{ӋS r-իTw֓eh4tّۉܶ ~y<[lLI4|etNm?=nIAuER\KFowlg:R8E}>ny\c J _74&Pv;"M#3U|.*C>G4xD"m^jPYyT(ya3I&8X^F\Wy>'|$2L  O      V}TAa`;q@!P$Qm#Z5Abl((~;|]`_q  ^! 1" "u!#"@$"$)#b%#%$q&|$&$g'Y%'%r(=&)&})'*}'*'+(+/(+"(,'-,',*'+t&P+%*$)#(A"' }&9%V#"p!S @Y2r GnKd,I>X W12   O.y\ T sxgO1+8?RZ;zHN=lW@Fa:,+-Vji@5LU3JL,UVj@MvVqFK;S{r:.j!@>u`!8xU X>FBD w@ EEJ`mk>)Aa!&o^+T &]m.$00,3$td 1 "Clz7< }Xe<~i .eQgO!P7#D1^`*L1j|r!+6<2+j)VguBA*a  =]  j   1 P  | kOvDpG p&O604 bxG0 \3!!J " _#r!?$8"% #!&$*'%;(&r)'*(+(,)-"*.}*f/*0*_0:*0)0(0(=0,'/B&w/_%/$.$R.#.b#-{#-#.O$?.%.%/&/'20(0y)31S*1* 2W+B2+Z2+Q2+22y+1-+1*D1S*0)0x)Q0)"0( 0i(0;(,09(k0:(0Y(K1(1(q2A)3)3*<4*4*K5F+5+5+5+5+5Q+35*4f*3)*3(62(/11'#0=&/V%-a$,#+"*!)Q!( 'R &%$d##" " !5 QbS9r ,2{( ia32o, 3'dN&4/tp9=?41aor/6hEqs#furVUb KT5d~i>mB}Fy3 C'ZU/CBC6H@_%^/ Q,   8   V w l S hk u      ` '   a * \/wTk1@GnOJq(HWB=aV@h!P$/>bI(c ]t}@9vV7 Ko (o(HFvt3(qxSh8p0U(^$g l 6 j:3H S0/#S}{d4 mj6/nh~]{EcsMQUpxVx<[RI-A_x}W&, 1uxF B3?}qwR$>z1LMs}&S3A-GBN |Z,EX"v  Cpf8Ho~ A-r@velM"!khH-R-5#'5zb3 > z ON Q h t   N l   g   D 9 C P  r Y 7 , kC W     P1 N BH 6  # ] n x E  o X   D w a g    . s + M n O < #  M  @ o] |vyK; Q&A Q   b 1 , " ,  7 i ( 1 [ k  b 79Ix9sv%9 )\G&BNQ *la=4Ye}*k/TyL  r e  6 D8|7`d^MJ-U(YFGSDHWqi,pW:P!)@>KS2%{]QT]k&2J1NnQ{P _ (e *q9|.zdIEdv,`5lficY`;mjHq9"?5?]ZuW7zyD:e4R9G?8TYhq#bV9&H `S1 r[ Zt9#3,Vf6 D = h { : y r _ [ E e ^ L { M  | u ~  a + C I A 3 1 H J  A  _ )   5  "  ?>  t | q  5 `U -\ : !K6t%*}|JT6wmX_[bxlPbM ,*iMU[mZ`"FK,y!Wg&VHHir7nztSkK7H(*5j(%n[(Mn)P@6/oS]YPu|([NV yT pS;U%   4 9 K  pP _U*TW=3?V P }uzDlkf\i:  Op  W O   " J   _   # t Y < 8 4 J D h 0 Q R  >i   > U h t Y 0    0  } U # L  { B ! o   R)  / u  j CA/q`j*YigUGK/ *y4zzQFNO/ Jl~ { E   h * ! A s N ]  e{_U`D;Xxkol}Qqh'3mx6+0++IHUkP}c!J_Alt aa~ g1,8 eMT i9NA 5? .0J8,5wW/R Z>~\gj! T.Zd05) v? -$o8Z^!8an,_}dM("@(m4YX7\60e E  u W   S  5 ~  ^ 2 ly@] V*Fm1wM9E2R!YKSc2 H e&!)"##n$L %M%Y%u/%$R$#X"'"=!(\ <t,TJv@MC>rZ   {! ! t"V! #"#"$#$/$'%$%%%D&A&&w&'& (&(&)&m)&)o&-*I&y*'&*&+%1+%d+%+&+B&+q&+&,&3,*'a,k'y,',',','-'%-'B-E'N-&:-p&&-%->%,$n,$,h#+"+I"h*!)e!(!?( a' &q %F $" #"!id ={ #Rkp;w7Ibp`@:\#$p(gd&@[ iBH`ixX`{k059PYa}_SP3#?0_71sd8l :  n Z  $ o ZU ?R >P v  ~ < 6 x 9 (   t N9W-hAQ B`ZdbwA 1J{CF# R:@Dg*t1kq     B&H: 'bAcAXoO[#Z[2 {):RbRd-k_w?|#z2!O+5V/Pac,# m(0B iO7pmzQ ==2{=`jr_a!n7Gy= "FEQ uK aj)?y)%a\v- ,Y_#YHy44No  ( ! : * b  >^     #,*m ( #   `d x #   E m  # u]   6   ~ #4|^ m     $ G9 N l o '6wR{5-Q %`/7Bs6:-Opw ިae޺ߨ{j68Vs[ k tA5Q^J8i#(*R"v9`<_'5&%)|"BRS?!:Du qlI|Ivg/Zk? Ek-d R p o  }  e    Wdhj jV w o d !'  / CY G\    t  )  4.    _d 1 ! U   7p2]k&*Xo0,^H  _YZ+'r{? zbDrM_C6=R{gWg-jN])@qt  dl - % t Hf4Q<! {pp s^IsH^sf2K,VjqQsE9C85YWvFK|]=YbwPSCs#% }J" h?=DR4OCKdloY-ZG5pMSJR"p]LxB$Z-;{Do%8J90%YbxW<ELZ'f d8S YB+'TTx:T<aD-_n&{+d?e?AAZP@.8~_ngp22Lc_76T G"@2Z/QUKW6cAHl{  ) ,  %  !  w  ^ F P% q HoGC  Z!"#A$& 'e!"("")#-*<%!+[&,d',I(- ){.)6/k*/+0+,1,1,2;-)3-3N.4.P5z/6 060S707`1X8181 91C91V91K91*9`18%180"8h0706/T6}/5K/49/4/3/G25/1o/0/00/0 / 1.1.W2.3.3/4n/w5/3606v17.272m838v4858585H8,67@6?7.66655`5U5443N4333x2#312)110F1/0/0//..d.h..--W--,-,-8,-+-+v-z+c-F+$-1+,+,*,*+*+*`**)*(a*3("*')&)3&)%(%'$',$D&#S%T#U$"F#]"1"!! !3 C+qmn~wS&IbW0.5y$;6_Y:N~QaLYf,@c_Wu^4;+ f|F(eMwveN|eWz?SiE 'jdF Z   > q  n  , g W S   P  |  F   ?  0 ,R bS \ L v C ~    z" ~ q2 P A v  H 5 i  ,|!^" y+PSmg( J op i$ `24F d > ,2;\UR RbhWEe~L,OKwa_" l 5 X -e `K <    D JnqcEFn"p \["7<U*,j R ~ Z  6 A   K ^  G   : S?L#dHm{<uDx44;!?+~p'Fm&(p+9>Ei! M w x s X &  S b~  f  r  nz B  5  _ !  p ? c-=lV zjtA8#pZM   Z u  0   7   -1 K  Y  c{  k h &   w %.FkG 5 } 1]<+b{7G_Kp2yQE>(%DTr+f}yK{XUC1?"-;~g~@D|V45pQL^ ="A! "8\F9p&mawN/0tXlAs^%j+~Fa)eWWE ]1.U+G2Tp1}? '  ! z U A ! 3 @ p@   OT  K  y  r  ; } & $ u ( 3 dV3)my-]gi]>TStMz&l:8mT+[c7wF) W l  F + & ~ > -  s  i(  d u }ep p      e  {?PBE  ( IBQjgap=we`Z k-xz[MQjus;`%;_) 4Q`LG36#)&,$73m64 0m* [    , E M ^ a @t  7  :   x s + h / d fz1Xa$+  y  C  ' S  BK"/4@Mj6 \n=fr2kf.r&hv@$ E:o?=g-?2" n..y }&"E*j7h/ywzzucZaw~M l_ Y0I%p|mk S vtH UZk0"u ]/S[8'>)P??qo]=p tU[<-MC!a' Xuu]* 4`Ivv _ EkoeM&u6d wqqursaR F4l7AbG1     g 1  { %  H M >  4[ fB 6 > Y `  m /   ! q0 47 @ }o 0  U5  c3  Nj)M91W@)0 eoT["l  l  =- ` t ww G ,A\ N | >)      uA AxSb2>5 E4#OoW"Eyu\`nL1y:H 0-\r`a$VMAbOVaK\t\6U:]@/OY3MQf&A\(WL$7=}SfgE ] IHeJQgEZFx:'"5%R_z7KXtL~LMoQ`G:ATPhL45&DS8o;{)A)ou+UgzI Vi^'>PrmA  7   ]  "  1 ^ q%   RW 4 n 1 D R j  N i f J    -  / ~   . f- d  0 4   =!o-`14C..B4? Kv[#e]   g :  . biu3r;s :# (d1>fY CC35<P    ! K5 ]D `G /-G|#{x(R(eP% >Fl/I*r5{0K! ^`  V   6 {Q 69Y X \()\qhO   x # 1 = T e eCo[wB'xJ Z\! a^@_E|d*_A{=JM#eiE vj;)kkvApyi\45x &zX0_+9*3A98tlG`Lh>KqFB *).NrpcO5 er(:)ߞv߂XJ<<@cލ,߇+z`U$Tp%C)tkE+DIUhvl)t~Q:q'rz:D_)wS2Z"l)E@.IPE c p t( ?|   3  \J   w 5d OM sJ Y   -/  2 ; I  >.3h1tBBb_a=j72P7mO V R L{ g@qv' \ ~Y  v v - p   l   qN  r ] 3  G 6 $ h f c )V5n#%bf!f1F(L5s^qlv1  S! !!!!>!!j!3 !  rO Q Tb99w8M$o  *!!!!!~!R ee^ uhyAI-dTBe?~O?q90AQ$>@fHE8]"M  3s a tm R70P<P r/g xv  B  g P* T>\ofMUdx&eCc%NkG3HD _:d  8 ^ ( ( d YeWi u } F@   D  ? cn. |  kc  |% j  z Y  $q 9  M iO -  ? ];Q,4S"/&m3` n,<ikmG vnK0y4>+8SjMquT8`+Zgi{KccP!mN-m%RH:7Z}khB`;he< +-3\7+1&X( --+#"fc5%JK1#-_5}\wZ}BV'f$.\{ b"xf*F|I}}??bhO{9r5[!1?4vFTHk! X:rmsq Mr W   5v q vI80x, |  L  9  W_ G(',*{84;Q9;` ^,hri`Ri & V! "y!""#"$7#}%#e&O$O'$0(%(c%)%e*%+%+%+ &d,&,&,B&L-\&-&-&E.<'.'-/8(/(Y0m)0*|1*2`+2, 3w,R3,30-3N-w3N-@38-2,i2,1Y,1+r0|+/+ /*.F*.*-)x-)H-)K-)a-)-)-)-*4. *Q.)Q.)6.)-L)-(-[(c,'+2'*&)%#)%b(+%'$S'$'%&v%&&''&''(((w))o*)N+), *,),)-$),P(N,@'+%_*d$)"' %#"O Z4X+sSvl `  O  !D O L  ~ R 3/ P k5 kp l S, N 9?  t   | _b4~W\2*" ` u i + s  _ X C R 2  d  f p < !    Zs J "  b # o G .  yC A]  \Z='% > %2^gTlX[T&:Ui>ogv4 q^KYbT,c:@QkR`J4s[dk{80uf ViNU/t8'IF}/E|H+,@yKvJ=xS~&D!t{Fu>o`~"}CJ<+<@N35+?|>,[ *Q RG > M-\S&>:A .Qj<S.hS jAYx@F4-3 `3D7!=A&xjxHpsqq1KTpd^ Gi]zvpZa8R\Pm._Ld Fa,""|B4Y`&~kP${4[5Yti92li+WrMxH.?Z|T7\wP n ^    fy   H&D~%YH  | 4.0MJ/zUP/  QX!!!8 "": " "!"!"!!("!V"!"!"!"`!"!" p" ?"J ! !+! m3 VWV9 R) 3  n Wbkw*!9c e#.k|_)#36I<I 3o  ) U @ )  ~  "  Z   3)3Oi;[CQ)76m'<!HGh<xp_'B8\D{B{WoDn8)qX)`~ N  [ F  n \ *    Fd   j>  ; e R +) F g @ q    / 2  / jN:YYNM_<4MH]p(x! .qd`bJC?0`6 Je}ha3lx3\n,d-0WMIsCR!LpA}~E+`dߨ݅ rLG@C*\uמ\d}1ez>إشٶwپEڻڸ ۪Zۡېەۊu{cceP~VZjۈۛO82pV޹B6`?rAT~"Oaz8S?/6;P(?Jip|qft<& hKZo`?R:e/zoAE v A [ Z ( X~\hl    8   g _  l @ CW)k2ZX/$}HW Z!N!A"v""!"2"+x"#A"$"!$C!& Ej e"pf-</J{c5!J]eV2|Vy4  x;ouG/:%tMQdv7,6?ic7Sz)Z=&#o-n9p DvL;txVQEF>Qf { T !L  C u   @   Y < c {  6   X +o SAsiUejaNTC aiJN V x`  o 7b  jg 3` 5$sNBsc%A@Uoe; d&p-~1IB}NY PFedd?,enwu|Vy$;l%hT#\I1Te\|\GI-=c~85pcw-X%B:4V`KOjE _kYh0JtNCFDx\|mGfJm?`2$zz"]55 $pt~({ptMsxi;QNAq8{]93XMA$)8Z. E 6 _    Uu6E+L LsDY7h;M_Gs%}c_- C T!!oQ"""#.(#3#(""h"!! !s u#q>?  #!!!J""""" C"!V! p0]r/< 7[2 } |?vG-|J7TDz7 G  O }  9 Z 8 * , 9    c   P  v  r} C " g { w ]K  @{iMa&t/} BX1 * Pu L  g d  ' h     OJ   _ x @W.JtZrT)E h6%:xN9YebR!SYj :-Qf]!l&yrmgx'gF4* q*8ib/YAFYs}VjBj~ L)*N&_u$w7H.- <bYbwX_\a$2Kwtr6&F xc~?3XSO]? E&xAh$ *3G{ ;`   d 4  '  Z  3B[Q C2|T`sXTi D8Fx? ~6 0 D= _ H $ * : R   | J  g  r |N : J g  & u 4J    q+zdSon(b*L&Peg^.8   m.!!~!!3"u"""###d"""H"C!En!I 9  KWNQs64F~'` M'`h$,V25x8^ysU0{%R `  NO HoqZ_oGnw/"6fy~.,nzgVLgv\K  1Gcw"+$ D,5XqD5*wNfU+!$:LAsK$~r|5.UN'x65ZS !f}%'o fn`cks$k50g|0/e ;X|Y< 0  a Pr'U0Y`^)Cl;gy-{.fO+8`/@ 7W^c0\i:X ?{KBMAhD:aJ^% {Pe' D}@U |Tc`+wxpXx;2`g56FOg[n {ssb]H>0Oq_f#[ V3 AKb1j  { R Aj ]u   w :vbT79^ IFQ|#Y4 WT 8 =  %  P   mcrUPk2GbJ {Po ;  0 jP l  G   J   K " [   > z  : z  y  1% X { G~;C P   Q"   . s   # F E "v   ?  7 h5^O>OF-YG=_q#~5ELAJQcpqY6 vrq[?bpW\.Nn:A K4G HI0`zGgT9^% POr1:HFIC!W]jr+#to4Nff.AX>j_x ,"  7   n K  J    ! ) I Y  E W4gj\V>:y4)w`7:wxtCp 4  A!c~!{!!!!Y!5!2!|2!]!!!(""":%#SQ#db#fC#G#"!#!< D$FH Dw[TRW}|7 Om#P&!5gKOH[W(E}hI,CJ~i:!mmd3+~Nb0j9aj>{t#^ t :  < G ~! 5  x Im 3G 'U *h < A `7  q%41NRp ?   7, ct  = wVW+t/Rq' =a    J ~eQ/2Ccs&DUTsJ"Jaty)amt{;.YoP n }rXe(~eN B n.Y'>AF#g~nCJ1@e"J2k*XyyVT6 t\|f-Ye$hP: D{mL 'B%W/iKm7nGe{[H`^ltY "S%rYo{ '9y~*_i)A;Vk N0ET*2`= *)1eK<<` z lyA[4i!^'m0g3j'I81% Ee9`PW>q{    < 3 >b K D) /o   ]Q#;CTA=]fZ9m62{kS"B3ni)F-qc$c"]^ih(G`jNiU8gX+;<m \=Y-}bdk+KJ"1 rPu)!Mb('Ll2<) 2   Z'poPrYe9(? 7HS%  k J4NiU( A (=$UZR%~0& T1   % W ' j B \   AmQ}|Nx8y >5Grh~qi{yr]hhsNaOww0^D ?v~IU(|Q TiVkRfM@pc8BDujxdB< $<[J8D8Vz8~X L5y'DRDZ#$`,8d#a1PsBZ#L*;f.;6?`GRBtscrQ[^*pr $K!!["O#$'%&>O''c(M (O!( "("T("'"j'a"&!5&P!% $>$##Q" !X D }xH9Rw !>{VvE{~snNu plM " 3 s  ` ^ \  1 S 5V7:c,4E}trmCTVR>GQ%<.*e-_r zB2I32rDUURESFD:\$Lxc3 )=D:+d I[@e}q^0uR;Y ~H\ ~P/O;iRnYQ: S]I> l>R0-Gbf6 @Cdf= ^5Oy\A.iT^tH`R}=-h -FONHHD=DIYlh\pB  ^ 3 o  i  <  [ B g J d @ S 9 ] " a 2 Z 3 `  p +jQ0`%- GsXIx7LCP6Dsu 2~T #Z"#U%*&f'm(P) W* *!*p!*!{*!*!k)!("("E' "&"%!,%!$!.$!#!#=!Y# <# *#(#~>#R#Wc#p#0##C###~$y($H$p$,$$$$%cL%~%y%%7 %h %f %/ %~%w?%$.t$n#q#"?V"! 4! & bm5vR:1$[~_MJ) rG@ov`g34P^0geK)%U g   9 & u  N[r[.. 5Avp}e{ zdm^ED4V DZf[G bE?o8V( h08V\tX@@p!7>@ +DM ,7,v _H}=Y>F5w|l%U Ae   c*  {d I"h:[=F3 3  m#!!|!!q!!e!k!! $ %j2, +q8`  d  /! ! "> >"c" q"j["'"!P! B DX65iOS=#~%0GqcI8 (6g-}b?!|[ u NC d  p Q r F ) 9a*R    n By  # s  t { 3 W w g  W  ~ #2Lp c   ? g {  } "a %5 5 ? S iT 0 3OPC  r O  3 0 Z> i H.\&5ionYw2yoT'/-~Iq'+ew~[~-Mk&e 8hE z&H$)x! RhygA)!'K/Uufotp}DZH6Dތ߈$DvxC$Jەۗ=ݜޘ'(k>87oZ:n~W;[)\xug NC jX*<'(M +7&TNJ_%_D>o{ST&rY \`}{SQhIzL( 8V]h06vwj   9 c z  * s1 ]U 0v     * 1     4 z][vD4 .c   '! }9 6   & = R 0 ` `  Q Y X5t^ 54r9%|G MO|eWvlv/? Ci Bhj*PUd(LF9|`t,pX$Xzv'  !D!_!zb!u:!!  ` U V H !A != X"X #~ # ^$ $ b%!%"!%(!%#!%!% R% $1 :$q#?"! n 7=jvzqE~ e<E% / F  C U ~ I<   K    z V ; #    " 0 2 4 (  j 9  y7DwQ^FS-s`d K 0 < ! S h f c t 7  $ ? =  _    h A : + ! G nJKW4>6z'4Jy?XVwuwB|SJd0;:y};t-7M$Hm{t-Mz{Lx `t`]dQo dBZ8>`.zR |dkT?0MB'2kc\bm{J;[Ij8a-%M7r0;^h7H1p~.i4 u \  &, G /p a 6  W qs,^d+reX?ShA)GRD|/RK@KIx!:SGhNdAO`{}E21HscH3*nI!o2l[H3SOcenyvM gPK80R`1Ya @@tIFj2F#>&GS{Eg;G eT& '4f &5h&)f#BoO.$PV+J{?a `-onD\<U(S  p2 6  3 e } /  > #i   c h v96xqxa "zt5j:1FAlepy**Q\f:3T|Z482Bg6- / 3 : F h }   SP  Rt" bL M ^ c i0 tT ih a` 5=   h[ D%.5g5g[D#1v,W{$2sd  ;  P   Hb |  ` >c$o$1#3l6*jh    . @ ZA [ ] 5   ^  I -  {,X`|^,>*q # 1  ^ p ? L Yn   I:  i? E}c2~cK "# 5 8> ) #   )   pH pf>dl0$|B:LCw7d,(M *G  dw N_ Z  > m Y%^e` tPG!# %S! 3! !!""\"O#"#"$"$"a%l"%/"%!%!%K!r% "%{ $ }$*$'##.%#"J"<"!<!r!#! yo Y! 2%}S*G$nMuf}5^];/ -Zcn[bD 0E Y ' [ P J I0LJ[?c<5eo3}9yiaUDDP?"M_kkDp &}*X H J 000373QK87? I!HWrhxFR0Gx&r Hy"'w)~3/LGyFt  t d Z w  `  < e k  h  q  Z X L ' G < " , s  # c  P h  hc    m pC sA R l  & f E d v 3u WD w v|  a (@CB4g$-'Ugf.cfR@({v]G<O7SGE>gC  R8f2&lUC/,&4UpEy!%S\bj0 Z JO  m* (t  C  n \ W O t# z(0vezGv]Uw .F n  R!+!"w"#"<#W##h$P$'o$k$$$$$p$|/$+##O"#" "Ko!k rb7Ri n&y  S PL [ n )zt20|!nX<^;V5e,( ^3m+K5y\m"0޷-ސf#8~$ڲٞY٪8ٓp[:ܑ;k~;s6oxSMay{z6:wa1xhrAFy:qH5;f5aRo[>[(:Ll|H])7xGhoݲn6xڸڅDٛ9ٮOكٞdّ-لq߈K0. ܚ X 51G׌bװz;ם#K'M׷ڗmm؜ ݍR2}ݾc^1]g0~^ڛfڹݡٯݦ٩٤.ڡݺڡyB;(Fފx &i&|-A;;r*qH-y|I64r <?]CC7$'.2pu/SXMH?P}~]_H k%h}pX0PUkua,WbS?} i*n%jl 6Zd8Og 7-av3Fd dFh !D7=6;z-rSQv I  DC!h>;Ox)@Fv<K    !w     N#   * M   J  " ! " m 0 V " J :  VV  m eF:bc-.@[80T?t&X,s} [Z  y8X$t  7p m E   ~ :Md\B, `:+j ,'hUb!.;PF:/Tn?C',JF .xv}y% TC 2U<&#c/3y3(w\6i^>MUu`|NA51HUYvow^=]6~,Nc|RyDjzt  F P p d V %  \h%BG4U#JQ%IRG{*G_  ))[1)4q]15 m} :   " F e  P &/0&+T&   E X I2f9v,$eJ;rN(>{PtwZZFu;5 /D,V& ?qWiL$D)LxR`u{&gV ,y O I "^tT}i[c~6q wYOYh)Q=J2p I e'ru~c~buIb   t R ^WBI`vBE705KR^Jfdmv=gCrPsFSKKaT] uRiJ4*1&/Y:RwCE`)j\H`'x3t-^V#T=$s|U>if3D*C ;w7Yq,dP\y~`LC<xD_krovwxd1G])rUBp)+Xy {jaT; ,Y1un(V"af=#S>@'%K>;Pz,tK04D]vy4d:mwG7)yhdE\|`4:0L5<# lq igBqXPPG9]BS[CglshsWoCok2,iFnpbd ]%)u0~xO2 u.I[ht7 -6jeROEOUxA~rVd(tkx?Wt%U>6\9Uwj_=d{~T$%&P+-Wq YvRjp4UTIRPo 9P   z& ]    | 7 \h95Z$ah8I-z2{ :%KS~; u/RES>)1lr @;L,W{xKx%-/ E  -I  -  }K  ?# H PIEEaoXAOkdT=h?j#S$CL8 R7+4eh c L ^  ;6q(&cg5"Mc0 Y}<znnx4U4(y6><* % e D  I  TK"^7 1zR. @]*/pL%yS<;3 lE0: :!T&a?~Y1k r1L%kaCQ>FAt O{Tv/bqK[ )nVB$9gT 1bf7# F ,S5-)(sBA12M'sKZ {i?e& }$)=Y[@y}U?pNF! Po2@:%Anj+ [zdR2"<}GE_**fo=1hR]'s~L v  z 5 8 / & O 9 <    PnF &O f h&Ert\O n}j,bppD;q2U_0\&IN-Q;8hb D `u}+~rBHHH~=c1x6RH;Y)2|L^DH  "  ' U     5  } H ,j9U ci}5 >"#%sS&h' L(!(?"m)")")")"C)V"(! (:!#' B&;%5$;#A"U!F }4<GZm"k@ r$Z|1XCk    w Q w  * ,}>"u;\YCq ;\}}hxz&>CeIh0A7Jz ~  X N   j ] A { VJ*.% w*v{hbaq#.uq%gV7[t2wkCz`agRR!(ek [HWaQOn"1PU{0%y(fCLxJzdrL$CU|-k11#;+>kTFNOH)^xTV#@ HDJJ![G19gZyv_IhFek J C Y _b M f!  O Y 0Pog{4K  *  A  0;  " > ] ` ;   w +  ) ( q$}   3 j :t3|#P1,GZoJ8w?eM* /+.j?@QSZYPOq4' l ,d1\8 e   v 5}   l F2N1TV]Z<N 8 { !:   V  r \ ,H 24 +    Y   oq #  _u D > 5  r : $ & ! @ C w r  Z  + C" k y k 4s % Q  q , X `t A|\$8]lJ3xL.Ri;}/2]a3gtte< c{/pj?;]Ub 6FCxy2$t4)roi8.hI]1/bVkPpR,_ehK(\a@E{O_P}_fz%heS.#a\m8:x'0KkmUg;1WoKF^ ~YZbN#l)s&bt1+ ~yx"R?nH{g)Wd'@KASF)6LZ]DJ"9j.b-yN(7 oI I^R    %   _ knFui  RdtHkqZ.,~hlN>)~2v#,: 4Yzn#?7&L|DIdtMu wnk> 2m,8~8%#_b} iXRbqw3ywfRD+z1J*5V[:`6d!fc%Xj  " _ 2  ? 0Thg=6<cuqtCYNV0(m# 1f_*&+cd~;^GUA?HMV-s  r  8 %s U < = =7 A I 4Y J] S] CS  G  3   J V (   r* M1:tWxJ(+m \=n%z0;|Gvih6J2 -@>94    E ) / U 4 IEAM,x|[ ZRd'a<2j ]!W""(.#jQ#&#" i"2!G !f: _wX4h k)!""t#.g$% %9!&!P&!7&!%!{% $5 #0"_!@uKa5rCig^:0  j[  + e  j1W[sN>F"2*S[&T((*)~Wbl@Wy\NzK4 H!uV6vbB*8=lyY&x A6jjn* !G /Z=z+w'(dmo8Dn}AZW4Mg<1FjA|7O#Z b^z5w[N%vfie>d/|~ d , ZfiFs U2  o  %   z f_Ag~aktK1_[k2rc.!Ccb9-T8 KOVM H '!!!" 2#n#$' i$k $ $ $+!$H!$_!y$e! $;!#!" "8 !# 9eZ12m BKt\%jVISQ[Ko'$~DYM\As-xub2] [ T- D/O!62m=n0<zUemo9nF00c0q|Dai  { _ d6 s   { >   |K G[NM  N$  w e7 V c    _a   " ?Z (  '2@s*O|aeEr % +  O h G C<%Lw`FOXq\) 8>qY  Dr ]8 6 + \?   B 8  J &kkc(s{LD 1Pc;zrRA:i>b+vgDoL ,%Qy]E/2"ur]9 |>1:{3D!BuZeBYT^n9S[V.j=YetyBUD43=DGvb tH$ *  !y!f!"[O"o"w""""Wl"^"g"R"k"""A#Q#C$$a%6&&+f''E'' 'M'M&@%$"!h5Y ?F I r  - 4 b   r  f] RKB L D a  ~ B} B 5 A0  b  ' qr & / R xvop ECpr 3 ;  )" i   !  TF [ 6 r!A/D"1t/+NY F %!l!y"##~#9O$$I%b % %!.&N"O&"&{#&$&$'R%]'&'&J('(())H** +++,,-K-.-f/`.-0.0.'1.m1.1[.1-}1/-:1g,0s+x0v*/f)O/:(./'.&- %,,$m,A#+"+!+k!* q* *i )9 %) (''%&8%#?"?!5 ? agvZ}Q-+ &V;I8C E6 Y~AOU OgZ BQ24g9jv;dyG0Z|pW|^<k {`k(u|dLHK"zJ .GJg  =   X B @  ? \    Di     F ,bJA]^=gbBM:fi&?>6$V=)>i9O1V#BMF\%I v 4  ?b _ V@ I  qDDoy;Mb2L=KdJ\$tm/ 2hFZXYNF@1 Eg !!%"";##IB$&$$S%X%%%%\%4Z%  %$W$#(#"!!^ nM=H@n@H| vG  T!X!$!o!6""#"I%#xU### $!$)$? $n#y#F#""%%"S!!G!x@!7! e!c!!I"!(#V"$"%$#%#&#'4$E(p$($7)$K)$J)$))]$(=$s(($'$['$&$%&'$%S$%$$$$(%#{%F#%" &"j&l"&S"& "&"&!&!N&!%!%! %!j$!#K!+#!" !t ! k A-y4GG'  CargR (=ZHm`hM;:{)i:Ty6LKd(sGf%65A&=ahmg{:i@PE@7h4;VT ~   ' g H  +cp hYF _VYaBXW \E<-gVGh`t:-~`5q5Ko\&]Uf`RU/.c8C_jHz(/Oy03B\Y /DrNr(K ATRJ}Gq9HZQj]ZTI,]"y!qt?p`jpnAhD,5(&U$J -`A9qi\^#?&^IPz]H-tP5)S@u[0 . $_ (   ( /O ly  +S >l <Vw x!<\"<)#E#6 $!!%!%"%#E&#}&#&E$&$&$v&%R&;%(&u%%%%&%i&%&%o'&(s&(&m)'/*-(+)+ *, +|-),;.K-/T./X/o0S0$1$111Z2m222l333F3V4134353!52652&5f2 5H24@2W4E23i243222130o3 03%/3G.3\-3,3+3+33*2*=2)1o)0d)[0[)/)_/).@*.*.S+.+.w,.-!/v-U/-/./1./*./-~/o-/,.,-#+,*+(*';)&&'$e&f#$ "# 8"!9H|<m4@iGJY 6 t 8 " i # v >   Y  3 [  F   !k  C  ^ Q  I KWAyQ}jD^VdO0#Av<.aJ~-sT8+~+]cxA1Yv %, xvkw)?y =BM71re$[`Rq/ 8i{U($1|K03):XM`vR 4<7|euf58^|61|hz| -'7 |i#{lT{As`,F$Kr n E|e_M=2"Jv2#ekZ}F{:V-J^ W*4~ m>9P-\/qC(   # < oH   ^-UpUzgV3:*ymESN)w rD]wWw" + ! x!J!!!k"""-#p##$$$$$%$%D%I&y%&%e'%'%C(%(%(&A)&p) &)&)% *%>*%P*%*%*%*n%*W%*C%*L%s*6%T*\%-*y%*%)&)U&B)&(''('^(((b('([' )'W)&)&)t&)Z&)g&)u&`)&7)&( '(L'('''''x&_'%'%_&6$%O#$U"`#@!"0 -# @qnlRr}N\PG  hLF    !L&!6!3!f'!' !  w 8 Sp<5Fp'QdV,Q Ko% A x  @ 1 M  [ {   e 5M   L  Y B u # - i a   G Jxw dU$Wlg5E/ (\*AP Pvq4>Fg?߯eފݞ/!ڭۉc$A_ؘKُ5W۳ېߴHlުJ< M'1kh .ߪQ ߤݻR݌!|݂ݡ7g7s&޵aއ8|VO9ޖݷHN ݮsܺ2 5ۮ@۫5ܗw܍~!m![+[;QxXh/X6!B;`N>4vD)AMOsb$Nlu6bY  ' 2 P3+  sg ?   E^v{veXv4X;JA6  !!""##j$#c%%I&"&1':'(S((u))*i*++z,}+V-+. ,.#,"/ ,z/+/+/O+/*/*/D*/*}/)x/)/*/\*/*/7+ 0+P0,05-0- 1.M1_/10101 1"2_1;21Q21<21(211111<110q1=0R1/ 1$/0}.0-0g-\0, 0G,/+(/C+.*-H*,)+-)+()'(O''&&&%%$$$$#;$D####+##P####$#$)$:%W$%$_&$&$''$j'$'$'$h'v$+'8$&#B&A#%"%#"X$!#!" <"' ! y/ 0DCEI$ 6D:)HK TC +OrEw >R-` N )A23Epk l|ZKP uM5~7vd+_+ :=v4!"4qI Lz%] D:O&r!/ X  V]   }W  } V    a 3 6 FE Q} ;KMBh`   "    YIxB);Nr>u UN5et- gtGb3?@.s4rN -`0?C C0lA96ZTt#y? L-k7/D{7ouUE5wA4vmwJ~rGE'cM17 2*  A 4 i 2o] { PJOM{.L)E6E(tTRtX 7U!iyIs!VRYdz;KESr'E j m.OB12m5 -#   Ab G a    "h Z m> :}c *  c1 : s       B [ !  +  F  1 z N|'MH`,"c y=  g D   5  (},a n0k[C|.k ,  Xn 4  6O P O  D 6 % Q C"yZOOZe(q}c+,1Y B_dbF8v)M9QKNUN+eOBEl6- j%p "M/7)0!'I7x1eY<DZalOh?fuF{>64 f 0 8hbnqV,0ozC*3KtrO%GhA167,Q+ND{rG~VHsQ,75)B8=Bm FQ *]R'xN;[OFu,ZtC<&'@d[~xu Pa /#P|O^`T1k>.s 9muwc}pusp t= O "U {Qp$:0W 2~o!npak.~ q Y9CUH @_2y 7pnqoEIW,} 0* W  k# =dQ 7   O{  4\ f#t#]'"P4] 6zR\h^!du.2[F.0B1Wlzk}^]*(V)Bo,JK  O6|Z/T0Q o|  r / W Ehk8^wfRvC:S>rgG MdE,meNmG]kZ/h9LyjP1u[~)QIN2%YI]BBU:<96[ ~16@1-"I @ Q W ~: w$ _}~=X`e,'@(c-6 5u1gb1nhAXU1N5^2OmfU'S \:ry[I -  [ 0 ' q U H L N v W " c q u Uy x u ^ %H 2 =  5   P  E )H.p<#eb"F q @ e   ;ZWmaxEQH~vqI`sgI*Iv?>OH6r-nY%z=W|8uHsq [ o  ' ` 2  8N   $ kHPzdK.LJ6V^Hel.{kcZ,Zi2p\ 8 5   r ;   A  6  N6iqtX]Zb5Wp[ u.Bh$ 7l b p   *2  re  @/ZGsj fGp|QbN &9Q-I 7,&v%Aw5=C%y$fsM46x6wr5a*- |H f&pB4c6{pC<R)'\q&27C>w* X3XG9L P u @ h G e G  yM U/ $   2 S |    E  H Mr` z!sj3 ">twk8 1((p]8;n9{^LiXJmN=m,J{8;^MlmFw k.GiI  7 u ) B 4 B J  I6 o H  2H  H y qDVF.C6Hx< l   X   )\zA {  HdfbCd>+?c*,@jzxFfI.{&'#6- \'! ~N@sN3Ap5[cnY=T #f4qeMYT05!Ik@1(e 29q1!\;%r%%.6v&p+]3nuHvg]:*dA&shNLa:1LFY_n{kAP #_?~fN, VBJ;|zoM#8RPjLFl~D   ] 0 Ho e z$ ~Z        Y L I B P R ^ . d   M jZR&_`[Z   gI  > 3 + V ( d  -  : d )  b 8 d .  X z g 5r 1c   |  E B  S W H h  & I C  " ? ;A@Qs|ZWM f)0:<&S3&DUa 8/iYa/u/%sVu t.s;$eG}yIV<qvCsUHdz +ybzOJh y   E)  /N 4 5{UKQ0BrYh ;yD ZC!(?B R!!Z"_",#P#v### #!#"##$v$;$I%$%$&[%'%i'I&'&'M'('(&((('(')'4)'=)h'B)7')&(&(&g(5&'%'%'`%l&%%$!%=$h$##c#""!;" ! 3 u\F' #Iyhb){ 4HD #cC j g % \ ^ z  a8 M ^ O_ H ( }  ! R  ;p  + $wgl="#4u}z$lvK544 '/WDXfs2]eK|Zir@[o3>.mNQu (4ov+S Zl'urPZbJ# x!TxR~#F6hnHI1\sJr(gSm/fS-tFtefabD6~3N4rE.C)^0yVCp(YCn`w15)G29*$CU#@1] SxRu-om"uHc:L5Qa+llUKTI9:cO=pu~N"G98m2 oaqj-{LE n%X$}OrX+c !-a-ddn7D( WR~m*M6kg9bbZ88:sHx|l|LR_e q:s08*t.AP/<Qx=f,wG__P'>%(SaVvB|O0Ba~Z)z0:T}6c==++Hi )Ytk  EE:MS;aEl 'PN5 R,o9Td!qySpU @Np=j?&rr'/%o|  { rc }s0])Yr) KY8;-ax?igHo JUg%NZfP721#R%G >x/)u[Y)i&2_ltme:K uv; BnBoV8~8lm XwA ZxNcAXI 1oUQdX`k"bxFBxcl)P1;|/;""i\*Js `? ? \:  N 3f&  K 3 W E 3}w  3{ 1 z - v  % h T  n ~ } >   <X $ 2G u  l T F? ': " 1v#'Y)c+I V q]?WLd+9eqG`$@oF`n~tzjnqimyxX .gY  4!r}!!! !) "X !\ !k !] /!1 ! \ PGH:Jz?Xm{%Yl#= k ` F 2L `F J c }E t  [0q+y\5G2fA\A,NsI/ iQ69m=h&9 y_?pV8$"`? O,fGnvl^C.qWP4+D@vJ Uy#j^Ez  d N 4 H VS  , X _ ? w Y "F  \  > p'  | /J h q:MW+L  |: " y K   P q u+LOJ3 ~K6K+ex3S49_< ^m"xx<)^AKm9SV?2ehV.2bgPSOAGwCCBZfzkRx~EC3PtLTraKYiHZY'Qa'v\9`^} qA)  i H   f7gT*jh<o&d%??f7 *!^?"rB#+$$:%N& &("'Y#*'Y$+'#% '%&&k&%&%%y%%$q$$$-##6"*#*!"0 "v"S"?"$"N!i!t!!  ]!IYK, ~(  \   dO  N  %  n  e Z | $   pI k b jX ~ `$s7NrA 6  x 8  , `  .    k W< #  4 `l bA \ Y *    99   TE      M [ 6O (  z  y - f R _ d I Z U ;   1 D R   8=  # k     % ^  ==l.Sm/ k u h~ W  !=8a7~;1`MQX65  {  g  ]  n H %   c v 'K  4 M2:XB  Sc^u&%Q6?+1:jW m%= | s Y N P> K9[90k)t"xf5*`pfA]TIX1v`Q4)wpAd\~1$xy=b ;  . F O <  m J U   l A: 7c ?[cbi/w+oNm@V Bi |k[*f8V0.I;ytBO ZE ?^}BPZ  G  G( Y e :`L~\vVd);!^, "_D !R"5# 1$!@%"q&#' %(4&*g'F+(y,)w-*n.f+A/,/,o0-0P- 1~-61-F1-W1-b1-1-1-2-Z2R.2.d3:/4/405F161C728N3839b4T94~94f9 5,9$58585_74645Y444333362'3120_2f010s1/0/#0]//[/.B/.A/P-J/,B/+R/[+G/*S/*R/[*e/'*/%*/.*/7*/L*0A*206*a0)j0)P0),0`(/l';/t&v.5%-#g,o"+ )d'-&`R$f"vz (h(lyUM"/ g   g K  0 ZKu]:I4a8 y? &4lB>L\~N7,%>S\icmKkb  [ 7 `{ o Yv * > { f       BP   g 44  { > ' m h @\  !NASpeBO   Q J  y U ~ s -  U L IhEpDHZ];r&#xHVd3Xp^%4r \W7O}3o)&D5p7x^pDge6,g 1z(.w^-$UbXha_d n!l""Y"9"#5#.G#<#<####"""""""/"a_"W".9"7";+"1"P"@l"""C 2# #t!#!B$."$u"$"-%"b%"%"#%[#%#%#&]$$&$1&%q&L&&('&(8'(')'*_(+(K,9),)d-*-m* .*@.+P.O+j.+s.+p.+.+.+.+.+ /+G/+n/+/,/.,D0[,0,0,0y-1.^1.1/101j1 2o2M2g3{2R42=526%36T373{737 47747i4?7464a6454B5q44H444333b32322t2B22121251>303l040v4/4`//5/Y5.^5M.O5-4t-4-3,*3/,^2+m1@+v0*/Q*.)-)1-3),(=,(+(+^(+:(+(+'+'+'+7'+&V+x&*%X*^%)$')=$(#'#]'"&"&!)&.!& % %< %x%N%}%C$d$#b#\""! ; fiLpL&7-ORNq) 440f p   z1 z h 2 b +  < d 9  y  r D    % AQFIF)2YIw{\2qJ^`q8> t  o   > _ 4   A   !   -  + 0 ) n F [ B  G }  S} 42Ma k. f >   Z/ A   O  )j ! 5 }   q= Re!LP}"wy \%|+WRGq>:[CeY(cNP544x(<a82 @Va c +&  t ! e&S %  +  Y  t2jymAKbq<d+|q_WSZ@LB ~l(e^*[m<svwpZYV;!g'(VZigp k] L B [ ~L  (:  Z     4 d  ( U Mm     R. n   B  T {  Rj   <  K] c+^M]:dyv_;OI(\   %D E ` {    R < ' P9/s6^|3 <@% g!' "v # $ % % % |% #% ~$ # "{ !a B P [ z  1 *! h!4!!#"&E"pO"-""!I!V F ^zws`b~K So|_t dR47} S%9n}9IkJ8')Sor:=)7<%C =xm d x -    N . R | 6 r ' " b  aJ u 9 >+m)h2"O}Hp70 A{LX 3d0*G`[|fC9Hg1OB }(V3kqa=T#(_4 6dfD@ P s  _ . qo Affwegj+u W   n P & 5mutCH=4YU&cy$(`)^$lRW+yHLmmO+aE߹;o! (8Ҩe4Hλ۱͜lxBrLt׀͚0ձd ӓGwqЍ)!ѭ=`ϋTАCΞ͇udvIΎϟθy*XSz2ёОѶ`C=xzSEֹלإ9kؐ[ٿ:ޢ dlB orf[#SxTD,C>:A,Z C# ^A2a*64)/jsB>P*kV 9) {X  Q+ c ( l% O N U ; O u8 ,>7C`8D^i[  5{t3,uZ`Z{&3~+N_ >bPK~w.:5NCd.R O0 P/]"L?D';vL : 7      O  G r g _ e l j h  ^ h9Q*uNS MW0k:VgLF9Iq9-U;j.' t    8 k@{)7 9 , o -   (v O E; zUXAeswirv Meqq;M {VsE-7r|fH_h'3f3F:;^@N@AiU1{z9Ugt{yx,hvV8xs'fs4?|>Oa' ="hrr/D" L4dSp3N_aTv8f-^;0v E.wa"!i,4eNQ 1|BRGgs\|{d;o:M)\]O[vr;(QD}2-0X |jM*,XLgX[HTHr8))/O>~ F    ^OiD  '& R c a" @I   I 5 Pb & 3 a i ^  d H W I # l   0 9 y u e 4  5`MEP*  D n -Y   X  #b8  \ < Y 2  bE   /p 7 tNm+Sk& B>y6.J qKp4BBm.8)8tw"+yIo]3bd&Q#R|TE8kZJ;#8f, b?^)Q-+{88"~/naqMD48uTj/9;P(Cp(FK4]x Q8-LI) w{R]4\=0b0?5Ox~JoHD~d6 <jD\Ge|Yyz|b56+. tH n(l9i\&#[`8K$b#"U`,Y[vKV2n3w_ei8ge{ 3Gr^q\I2FwR}EQ+e\ 56q}Euyzfi|f+iu]-&     < @ nCL;r0$O&8[k,gFWM U <   )9 d x )s A )&*7qnOU$oJL&K#a1bzf|C_:UBvi5^9_HZ3:lt3$i 2  k H( E L : 6 z H   1 S  <  u@ O g l qL ]& = w  tL\j> ]fbU9}!?h5Z|qTS;.lF5+iE`7Bcl3Y[dY5 guq4}7c 7-|\R4Ns33'.s)#9IVj^M(4O.9. D0 kGKM K%_2NG d_X~s=+l/Z?]6o_'Pttd4>D>fCg0KphߩMwJwOp^߀tߢ~LFUM߷f߳)Slc0#MhyMF00ߌp ݅<ܰ,wACaۮ_,+ݾ+ޅ`xiq :yb3}DY-y('kt*yTI06GbP%hm)Y LrG087vj'b _K{=hal"b%i=9|?Kh>0yGuXpjG`< ? R9`\>C'gN|Exp K|4Uyncq1y{l8S*hgKv}4Pn]K+<;>*{"D&JU(s(J_) Nr1 .g|k9kHY\wY}|<=P Tjk\X+ e1X7Rk'(Fkgi(MlEw >G8Oduz*xKOIl8j+SksO7 KZ}Xt6R [Hi g5 +=OJ^~tZ^-:Z TdOl)mnD49"%*JDy:mI?'.BkGQ}}pWu%n_K+ k k  + Pb Q b [ T3 <I 1:    .Z  l  9?e& Ei5x t C 5  oX  i % k ~ P u  X 8j'4Ew/pW:   m C   R   >8b  D@ r  / v h! B~    ~ TP A )U   5  Z9 8  . =sF@KW&j5 %|:O>'IB#c`85U0S.gpZ4#4@293+$@Vg](I<5e1NP}87jT {ds1e r{j!{#L@ppL|3kZHO^j-a;Wr >z|*W'ZBA c 4p h ?e ?  %   W&.!#9m: WMs J +h $8 1 N! a+ R   R K!LRnn;}d+7J0Qxn e g P  G$ t T Y X } v f ^  _ 8 | l  F n #  R H  >   r: O o 8   )o { N/  j D itgvJ{=Rx48iqC kLzDoV`=0"=3Y#s;]}PNb( 4 pG      a 8  . K [` ~   A  v ! 9 u  !> 8 B [S Q * -  ; z K   E. w~!|M_XxZY,Y^ }8  | : Z    7    / * 0<7AK!c|fnVD" sDY;&V 923k< +~y]9 UFx@uuy-UA{F W   {z  & k  @ d 0 s Z "  3 ) G Iq iMW}[,ky+ +^  f u j j K      y mi j p x0 * E@]zT^$N7$VT, Q-\0X%CN`OS42+T($9j*rS{DH!yEIyQCCG+VTs{u}eXD{FMr^PH@+9' p$fgeC'5&&$.)>wMP-@(Mq( \ A"a!V.cM3|K6*;ACWdpGq eAOw WwaH1Xe>~ _n s7+r}PC=N`z.$I"[)YG mZrRzE2{m:T  x::?$0E2vrWP\l # ""i! .Fv%:$f.8Y McCnxi?4k"YOSh-iJ7e  V^2eh4lS7mumD rHvj3  u  { 5d b^}L/:2R5;%@o Z ;  # , o L  4 r  { x 1 = eCL~$+f%~zY<TaFS r C . e  kM | m i   * M  V 0 U^  6  gY $ 1  R e  \   Q \ & c9  j UJ[!#o ;c Tv8L5i$Nc3P]^ E6D[> c KnlOEyU=2 "xc:,Noc O)Fdsn{}d7B)weQ](xt4gQkP bfdv.u?g,/V2G`:g)L C1 o+Xl8%u_9X -@x z,8W)Zr|rS6* j aF9#gd oKHv5s8 o'r$"P &/zzqJ   D 4  gQ  W   ` P ? 1 4 ] $ u = 5    5  cd3}_l2u D   n |.7qT<; t s ^(  sd  u  1 ~ A u ` k h j E i t ` @ T i(f@7an+s21'1kwE[0( aN6)#V7{v>nnZ.Px.yac.$!SoGb}6`AxBBM1y^9e`޻"{4Ou  ~ ~l  m  w 8  ]   Z!Bq-~cY,0v5MNf|,p`vQ]9Z`b`hT@ !!+"{i"2j"L" !bo! $ &|{v y fHr k {!}"t"s""" x"" d!  wmj3e[q X !p"""##"FU"! ;jodqPuJq6x#@ne 4 %    U L r; -: F @D Q [ ^B 7   E [  M o s     J    ; oW 0l y j $   8 U  1bk;?1%ti'=}W>kb{1r>3@ X2RXRF9oh*^O޼r9~!9ވN{ޏLވߐ'ߓ8d6/;%ߐ$C$(DߥSߟxߛ߿/5{rMN n 7_j (EVz"dV"0v0)YruguC9{;9%tbJy.9'RoF`PAgD7C">:Qmk(h3#UIk\(Jhv\~M @]M , .+sH$9*_l @   -  [ +@)jV>00&h!bo+a -9qZ $mIY2B5/a}FCMuI"HkRZHYxjn'Ieq} GiX  Z ^  mvFdv*|J$45q*P> WsM.<  DFp" w % K  y ] T v\%o-H` f!    I  x 7c  rj  % ?X J J .  e ;  e Ci   u   _b = sU4  ]      N   # T s   1+  f ;nod C5[_RDN A)x" hg 9~bGQ`8W@dpmn   \ s t ]vRYH}aKR`|ZV: +#R}QueA'.MAg\B+u,+ha#!uI3!lsUR3O-0 X q" dP'nE :[  0 0 Q MBf>   3 8  %> ) ) Az1<s  8  .      -   h  W  '6(>RLhF{l}3F  D R  B u  b  % x } _ 2   L N '/gBjfYoO!T/6CN~>  `!a "+!"!f#"$#$q$u%1%&%~&n&&&&2'&E'&;'7&&%j&$%#$"#b!" ! x8 %,fO"3G ^%J"Nh0fTR"~o 3q:dI \1~2~I^r z x>    X !c o     #-Y)gy`% ^ cH-yhz=Ku2."n w&I^ ]+%!+1kNS+  ` o E K L   4   G   o R 8 1 g ( 7 . ~ [ 7    iv T  E \  }  if  ><!AVJFX`~]ctMdu*{y@B,1?0387sR79(]svtjOF#]n\lSNJ AXBo[qtr|gBV?^*Bxp7ZVmp&V W-kڣ?dT*[iwS&ڹ[Cܕ5޾iJC[dmFSF]y\XQBm j1lK!Od6*yn`R,{3 ,V8@B{ )Xe6|D%I;A":/O;RefbvCb U4\O S N <  f  ->=Nn#MP~{G'`>~1 |o@' k;S%qe (JL:Y4V U y a  3   _  Z H jA  j +N7h/b- W  AI  e I d | J  0/ z  o sIHJ@xV(t 6'Aazg(_GARAP6,#T fmDz;cC WPWU,cYP<-jNq_}kZbNR_tC_eA |$7]HZmswx',ߞh H SmO~sA|P5bT)phVSvK _UE %S(O{j{b98Zmis58ZD5F~5X J+Tx^LG6Y|g{[=  v @+  U}  Qzj-sY.tIe=,X[`20 -i.W@1*!%j*8A.=Ua x8!i!j"f#dn#X#C#1####g##"]Y"4!W!  7?B{W9{PSKks?yCw5vr|+E\b>'^ im^Z2Z8  l ^ = X F?j!~Kw6Dy*^v8iG;!%jHVk +ot|_]WLIUzqptw^"Gm/6W4La+EKL]w,DgVFq!{LY?H^ߎM[Tw&[R3^MLI6 hpHKHWq <\RU"AM4_)$q:" \MLH_$^k`$FQ14Pj$< o.n2gn[`{//XB<Z'UJ'9k D   _ %   / 9 Y ~ b 4 : _ p  6  [   w y    I0jFSEIr9Bm^  *!Hj!|!!" >"\ " " M#J!#!P$6"$"%a#=&#&$'%%B(%(.&n)&)&'J*'*(*](*(+&)*)*)*a***e*Q+H*+*E,),)&-)-)-a).@)C.)=.(".R(-'~-?',&=,%|+$*$).#|(="V'e!-& %#"!  z;,dWKh<_P!c~c '3c)a'jQ'  u  H  ,P] +Ua.*S!|CK ~bwR? 4m/R @Z A 8up.  p1!!7!!!!!n!~!1 4 H8/OZwQ5nnoh}* m 8 i v fiWxJrc'^m:@[Ez7tkf84y3P}E,0I!w=-9,Cve SNb :we.b@6(:-eFmMvvf?N}`43ދe{7b))j{ܰR )fYPې۝ڳڠxږY};U8C9%l . 07Qg ݛZ$-' ݳޗIސ~އ{|]߅ߍ߈(j,^btTV'k!F'kI37]rq|}q<yQ=-E%Xmb+)N~* sjEt#&H^7 k  ( 8/  9|b4v)q=i;o8GCWVL:|i5^,NiqF] H}M_}!`2@\#(F;zD#m* P !"?(##O$H$$%n%$2$'$# "N <"P o!@  +wzd-.uhVd-2( zo@tv,&1iTQ_ %  :   Y' %  kF t 5 M H  aR v$W Ec7<z^4@(    2 2 '   _ zW'&c6F`it}T9+q-jh!g>CcD^"QuJl6X.}}~'Y+HEg"U4!?=k}7nORKHD + A L/r7bq Hvm\sbEEr&JE,UhrHH? n ' h_  C $BsXu#L)X6cg}}dJ(`{hyfY/u::$ .  #W O    ei N  W l F - d   i F 0 ` . 1 T  ( Y  A Y C E  >r  T n*`p -5-(IrBpv w$SB|tHw/$9b jdGYVvVkt`A _~%5_gIKVj.`D Qdr9Qwwm2GF `/~?OBPRm=rWMI|vB  /CJ En8}"f~ B`B_L(vV&fxP ޠsݓHܵ? {ڕj3LݬޢܰߪݐoP2x":o;2v޹ߔ6ܰ ܘۋ6ک^Ԝ*ת@:R֌V(Ңѐ՛шuі.ѧղ~HкϨհρՄ=U;ϼb!ӠίӉΛ|ΒKΘCξ(GΕ/LGtΒ՝"@Qhϧ^Y_WnϒzρԴπ С~0j"Ԫ`լֺ-ع}پڶ۝u2|wZ ߧJ߻ߞOfL>-lj}1\xir/0L8i@'- Q7yO!,bq FFd  < V #  = 5 @ &   $  ! F f  M m z T,9aMyaTM/'8"W=_0 [ M!!:!!!+!1I!&   [9Il8ZI|FwA1z;:;On?[E1nz9/\npNzz>g.A i nA ]  nVdP^LdQgdTkn$ g  # ) Z t ` G +8 c   $x s g Z  a 5 '  ^ I4 ;M @] gs i x b GD    m G \ \ U T  9mbCm,~} \>T9(\ejd'g/@|L~ i^bVe~MJlnI5#p7!57S2Qr}cs j%To. R &2[Yb{fl VEo@@9W}db $6  Q   4  ^   K) m87gHPD()}_C3AS ' z a  v \ K  T G |  nd  |5N{:Q,9ujld&{!CDLs ?Iz!@"O#$ b&i!'/"b)"*#2,$m-%.&/'N0v(1\)p1B*1)+)2 ,\2,2-2.Z3/3042T5[3[64l7 68j7:8I;6:<{;=<?=?>@B?uA?A?B?B?A?A~>A=V@:=9<9    . M ZX ?  % .  lv H 9 ;J `I" Oss|#XU~wM~Y} %uGcf{ueZ5SxNJ~|VCHO6oi'.VA?' zz 8I "st/GfJ6nld ; O Ic ~l i  T   ~  3  ' (R wb    ! 4d c 4  E9  = u v  5  =Z 8+!nsK $!$B D=B wGc>9a,Mo  T $  5 n & 9eGap7uR[gM2P}G%U   k  X0sKb7!BqF[K,4 ug!e 3&Gl\%a 'N8yk)RnUB6E7CtHe8jRAPDV=D%Q(/U&\pt6E*4zriG0vM  n JTv`NgGLr<(PwuN gr!A/sRf'~)X%#ha O+ G,DlXF8jD. u c ! !!" !X" "k ["!>f!b p~h_;' ^)^d7"cQmoYv{`m`r"]g Y  7  Ne6\d-  M7  j  % D crp^iv(P! ,]ou@{t ky5uq &-o[=Z*l>;!moD X!Ho) yRk wo7d]+"e9Tv], bP'8 A@5 d1^*F D zr V  ! y   _ , Ff ^ d#3^pg~|i<j0& J b  [ - r  ] RM0[w' b/tV+,A~=!mE DRiu|}T%g8"gq_"^/=I?.R$ z p Y =Z , X       xuVy  ?   f $C ;Z   { 92 ) ` \ @ 5 j H D ~ N a '/`a'dyIwcPR<}9:|aSMrG#3% " V s  @a(EQ2?f  cNt[ ^ i  } " } T O  >  F f  " i  '  g F  `mvlsh{g 2 h^ D O Y+   RI  S >  1  1 s/   lK K {.d%p6diX|xXHn x.?9#p,n6zj;]d3k]I?K:"OV$<}{ lnjs' Tn;L b-$)WM ~]B$V,o>*}v4-[?:' M,KXxNPq3b] KdC<>FHFp4uq@ W*_Z cEf[DrZ]> r.6C,on%~w6k:o O}p/G b$=e3|6"_:\w.  < V O C C   \ A S  N=  H m hT#=2{"nC |%6 ;MZlqA$jIw9sKJw60\ke3+`D101h3L>XG_S:i  *[ F 3 c  H f  m ' Y m  I ~ % T  g;an"~O?   ' ,l G T O ;1 "G O D 3     o : C   # 1 a  G hx n Z` 1 R  ?Hs%vKmXN:b3 9 % q 9.CU, T } g_ =b )s # * W F c y d Q   % WL`f#m$r~ Gn-ZIg_8o l0} ;V<M_nzu, QC"usIMx7.p-F4^p$_vL9] Gjrt2o#G = t #T >s`7ViO*(7KQhw\K= -'IOxo%5a'"Jz0bc4T e}&OC(i2y7.+S,=7K5{{cJpߧcR?:@)oG+7;rkj^g :$h 1?- ese1x*p,c2JCKdst+x}X!m>Y7lx}8AqwTk|k)2r~p6@kR6}BqLV Vu4<EZ%gV'R v x '     . JL  F . T}Y}yjYPXuRbK`V ;S/'qV ,rcC,CxJdx< W`8E{8%@*;Um~Qp>0Us1 <>P4?6DbQBzT4 2gbsQae;!z+T  @ M -  p S M y Q   R  K / `    2*KnG85rxWZ ~  a vFD11lIdKs5i*xFxVLK{UF'b.Y}tn:P e IuZL5,Ki|$[2!#%#ݯ߀.܋*܉iPct5n7%O`NN HEu;NkA'H#W=qgqPizNP~\ ` 9o 3d -6 + {C?w2)L~j%`^blbK}R,( .UMZ G m> k w  Z1M Gz]B41 -lPh ^fPP;E f A.6W{(?:PXlY@iRd\CXA74 ?   l $ q C b b  h 8 } M ` h  5dSsoPJ{- !!"m##$ %N&c&''(M)**.+,+U-,b.,G/-/ -)0,<0?,0+v/*.)-(,'=+&)%y($('#%6#$"#""!!:!&!  kj J e @~@y>=5OpQ }K> 1k {  TV   ,`h@pqzYV'm_VA|3oFs (3D/ptC 1RR*W]L- Imb1n.C{L| o2 s5LgAj B,sPbsBh5Z 'Bg$Y ]+e-Z+dz{8Bt|`tH,:`734`5 w  N  y E , T+ /MRYH-FqUs:bR Y&MBG[BNW>M;CBDY  .# (B v+=PymN3+s07*E       bR  m!ywPCE*NctJ . , RO @ cJ T Z 6Y a o W \Z ZN @4 =,Y `u1EFD,tu*k$aRqqDTuu-VDoOfjTZbdgwHlk]d1?vL`  f!!V>"x""""u"X")"!Z!!S!T! Y` wZ1hi)E  m F .'a8MiB\ Kq U!   <  "   ]  7 E l= 9      L O f Aub7-Rx28@R!7C(h7(w?C?4q/ *BNv vjFXs$yGh~I q  i=  , 2 n O t  Z E  < A ! > z T  >  Zi   Ne # St`2 {nGW#xuH?xq;N_:8w\ Srm$.q'5':x>#fCei%w|~:)n1t 4`(|H*:7CPzy 76dw{hol` Q Z Y p V V Mi RFG0%Gi5C p_ UUtvR=bM5F q7\l;zNVyQxc AUq+} n  ':  c % & ; C HK [6 r h QK      t  L#I 'c$ly;t2@A&r)7I6YpWHt'09R uk 1mLk$D3M 0RQesb jI.zLEZD*3;sQZ{~1Eh2da% "I7OWg:> /z?uMAq%_9VD:cQ,d{9=b^ؑٗ8ښ~ۤ܀Rݢ 7]ޮoy,h[ޅ& އMݗ '#:K9ARL?PN\yZu.p p{&Uoe#`?]p/ `$u(P WWL[{&}~C/wwV'}x? ;R;? izo5*1/FM;h'usHL8Pnhe { 9wSU1[j8[ s'&m$#Dg6|ge2_{=J`LWFL Ua^0u 7:;[ MjY] RXVh4f[;8/.>) F8D4!hryL=AFL q>+3(v'ycQlV_cy,k@Ji%VMcAToq-lx.8VVtJ 7O?(BaIT$sjPOb4.=X "/nA|*{/9ws=+9Ff1C2 3ai @\AW6Gb;KE~ux>/|$%CN}GK]\k#J| [~ph& M!c;k=~q?s@:7,7Q4zcij[bCe-^[1e[dWHS1 Ut5Z M1y9mW:2[FNoqdB} H) l{N[+!o9 Qfls~g_@XW 42"Kv1z;9_h ~ B=tRIupHO]R(F9u7T5EI'XH&e'  &S,fYktrw8#hO Xd4&( 1htB=^x2Tkl[U_h"Ct _!IFM#Q^)xXPHzkikQ7xoz0K]@GTp'{t_U8Kv> 2x!txDCzns2j<MOO~F%|lvL;CsB/k\n*~Q*](kQ5?L#@S\mdLBs^D?:9D618Jls'5%ku0F -ET2QUsA1 OwQBV7 }yq x {la1FbM  ~    j P6O`\[yjrU{vm&9,r %YS.5\R&  B!!,"{"W""""F"eD"^!;R! (9;YI~`xpjy.t a J  5>  @ % e 9  a  Q   V .5A>doS?:$K2VJv"'_Y}!g+[Y:vF9\K{, uVrZf==v2~z!D(Vk:yhGK.G2#Z;yTXAA4#1F3PjU~5l4n)0'nE3x/>o;? O*2>-+ QCRvIlnc hJݜ[f7 ݺ܃kX :M!:ߊޯߜWxkv\TDF:ߛ8*GߤR |ߍܭߺ9ۗ[9nݝnsNDZ-NyhL CkQ ,j{yGv6u'f]G"YSr^]5S (&y@.p    8 ^    {ac.ca3GfiV2Dal9]{J(^p|vcVBM! [ _ -  d   c t gH    K }] 8    sd AJ .   Z   FD  . O x3yf^!sPV^   >   'v Y<  [j  W   Y n u ~ gd "  aE 9-B   U1 9 i + j F0 a  7  w&O G;j=  @  GA  a J =     . Z@ : = # f jM #)  Q  Q!0,Pb U n> ) [R Ali{YC[c, [-@JZKE/q=~q97cz8'%m?( tpC!( rX{H#11;])z)Gpt!Lj":`$"`.(d !;4hO.+Rd8-[Fs[$0S  H"o u  )$($(J$*(9$'$H'$&#�&#%#% $%.$ &^$?&$&$#' %'T%*(%(%4)&)O&)&*&*&)~&Y)X&('&(%'%&"%$$#<$"#x!C#U "=0"2!3!On m 4fs y g 8 D|P   b K  d 33&d 1Om%{D!{2,8-n.|d#4)M;Iu^~ݴ-Bߑٳw2xݲx9h!"#G{#-ՠb֛e%عPvD|ܜ GޛyM0f$,Jk_ZQ.ltvPa"\_/[]0B%Qn[/dTT,vrao2p`dhECTEV(0Zk\tG/Fn>qmZv{rQ*lD"[vlor0߫ ߠ^ބV.csۤD߹Y.hؿeV8_\ێۅ=޾j#!69[2-]_R/\2SwMh>zdQ$cX6yH$n yncd4X!+4qPj,dz^ , B Z H  FqIZ 0B3X& &4$1y!G 7o!uQEYBZt\\QC)67` !"[#e#`$$I$$C$l#?\#""&"4p!_ x a-2p)KEiLB<jXNua XDc:n h d Q N Qf l & S      24 U   U   . p  " K o ] l < . L }d; MfxSZ -  E V ` qF h$ V M B= 4-h*,0l+p:rSH _  v  fx Q> M L $ agx86oTJ  ) o n)   mo   fB *s } ? ox f  V ( Gn  % U  8  m {< . . ]& $  /,4 ".Mjk5.M}zBc{w?[w&(.>5N%/  % B 7@^Q$f 2~PL[k UgE(s _!o 6  . )` ~  4   g  9 K ? ?  ~ {   vr 7 TU-|iuNVb>i:sXxY&!vr"# ]$!+%R"%"%1#%u#%s#%w#G%Z#$.#x$"$"#f"p#" #!"[!"!>" !Z k! A jZ)~S"A\5^D*VC> 3  = k ?xA) p B = k o "  m Q S N e    7   * q  + &5 IA Y, b! ] I 0 *  {   1 | 3 7  /C  , K Z j ~  0  rq   (>NBU`E/.em>*y@Q==3 be-9y*<ak@}3k]cF@ X~:ro9$0qj*]wE0s]  8 4\ZGg߫{.Xgi=hN/,c.o~$ x&^~K4{OR!w|(FY^W6&'w.8g}"|UoX[tSgw[1*S+K@^1Lp4=.M_UL.;< +2 &l!|4ta>C ,vZ7L 7$v'k!c6}[7B~'Wzb9fut4L -)smf Yq^fDy+Q"7)UE&]b7Iappai>~8xw !/ U ? R 1) e6_T pu0|(A>dr H y8zF+]jZn4#G=.\rtKT d  T *  E  Y b QJ & q#    d V mr o p /   v0  ) \\ q \$ p   [ Z  ~ ^ q9,d_:Hyg 3XZAm(&b+cfo;V[90}}97bpS1m[Fz/r<$9%sh3xy#4{xR+w(EpHh4/wY6Ufyl@n6f =M^]"?$l'Y>xA!X<;qrCMKS3e" dEa=3:h]NDgjk[`Z^Q= WL+=."7}I*QYTV>],&kw.Teohjb7V _~`1h1PU2h&xs ]2  r   I   d Q * t   jM 5C&]:"0(1KH.5'6JbhAUiiQ<l(  !!"""_##0$$%+%%%&&N'H&'n&(&+)&)&*&|*&*&&+&s+-'+u'+'7,\(s,(,~),*,*-E+5-+>-j,b-,p-e----.-Z.-...`.....././.9/K.M/ .+/-/m-.,c.,-,c-+, +,*i+)*())([)'(&(.&'m% '$&$b&w#&#%"%Z"%B"%M"%d"&" &"&# &@#%g#%|#D%c#$K#/$"z#"""!{!  z.H+}TGOnnC  u!"u"""=#"a""r2"!!!y j t+7<(#(de0fI^{%+ r1@xO] wu=5OMl)|3 ` ^  B  nH  4 h B<s_C|T43BE[iz3xjdk Oh5tvV@r  T+ zK }8RgyNf6 )iRIVދޞ@MܸVa,-d.ېY*ݪf$R*tX YX6V޸޵Xޞ\ޥ޺Mf &(*I8+~bWdw;'YM q2K7oC{  DpNuA|B"=ygraHlS9 i7sn].F7jM c$6 %{HPx?Z}^D; Y&&&Y`1a !JE1'9xF6TAw#-TG^6WAAw2l(lj#a#\j+ vSUs_|4`UOLH FhX [n>"WMFit | i)C]x w6({=(M߂/V۲ ڮخ7Lֻ۴\= ۫ڇiS1Խuڷdӊ`%H WyYS6NӹWU\Ό vwKs̗Ό̷C( ̦(̖V̀Ύ̦̕Ϳ·́dβЂ,xtӣћtҿBٻ~טۓh0ؗH؎dWQ +؜0׷ڻlڼMٟ9!١Pm۝^܁RQݦ+q݋݌4CtOܖg)`ں ܸڏۯ2۷ڻڴڞy2ۂډa׳'0֙ا*Ոוq֮Qӓ5ՄҰvbQ5ԭ,D-0ԛ?WU*~϶=CϊՒ>uС֫Y]ҷh؛W*hٷ%{؉-5ۊڅA'yx ܚg|޴"Hߎދ߯#WJ=|pwlhE7#<)5D 8iE_\6];X ^0_{]/ZT1s D d ; Kl`+NL I1Kz t(.S )gus'AIs4   duUs #o ? H j  - V   4 / E x  R h  B w t E  0_eshF'Y"! E Ki  |   : R   @  A   > g ]  8  1 Hd a C /5=v,>;$Pd[}m;Lo4g@#54=5D0$qbBN'h-"[y6By$8uQG)*N 3Qw)6P*ptuo2n\sh~QIL0^r)#R{J6Om]C@WXk]'6:cg|Fvu/^K|T$ވfer׭u׎Hw eK؝AfY3t֩-Um٫<ןtZP:tܜc"xQ~Cy?a`B7 14] {se.a#9S  k k  ; /  F J 3 o ! / 6" 1 % = [   U- ' 4$O8MR]HH&k!w$4um / b  ?Y'MUK)Z-P_a  N X yN / d o ,Q   EL(]S<y zHY]G8fd}X (I7lVtk \r!#\7zP!{C{qC0 v@bUa]Y I  > S  ?  @   e -  C  k@GkI{+-nmca `$gKhwpmJc0y<+RJgX:1ݚ܂ۂ@ۺ ݃ڕpb܎A^-ەܾ^s qދWo -tbt,De/u?@%1B\B[i`M0N!E2 ;veTjeoX?IXOs/sMb  K&Do<~~Yto0XehXUeKp N%ZAf15.k&y(TTxa4\bSCXPumhIvKCܭ߽:ފ܂۔ye B"׭n.lأ'd-޶۩ߪM_7MyH ]@tGt:y @]KCAa1 3g_mFVc * D `b ! !""#"$$ #u$V#$<#h$"$$"#"#!(# "t " y"e"z""" O#u #!U$!$m"%>#*&$&$R'%'.&Y(&()')v'N)'k)')')'o)T'W)'")&(3&(%N($%'}$z'#'0#&j" &!m% $, E$U#"1"g!k d9/Qo7`25dBNq4T|qN L 7 [ + G O }  `h *V c  , a  Z > * h K C q   W  x 5 O ` g g L=   x %M k=BT4AToZG"?O^5e   pq O 1 !    :   GwA?}U. +p Dia* c"[C SAv*S(d#*`)0,+"\h+U`eBb5+pk  0FHe\,+<^^h^/xQ^G9J߭!%ޚމ/[pBW(DڍA^nܨBq9 _VDsD{zd7s3 y axaXުZlX{n#ޖq8y۴ߒD+-Cus޿d0 ]0lg@' V(߀n|.%a4o>>>^X(M '^Kx# 13}$;f0P!Gu' |'V~J|5G`;pm: N 9&[^1zFLxM}GHPB!kebomK(Ep~uN k6 ~  `v*5 {% V )  n1  r#Ks[qy,.op/fu*VaI<;gDBDJfxh8kypYC&u2~o<w!2Pe|s9O8+rm(:{L-> |K. v " w p O  D3g5E GMol.p\L I3C"`6;R;+q9(P$+Tf5K E>&Ue\9^ޗX ݷn&A)*];EiAFuFq! CX+H2W_J a,=dc;D ~3;'R'"uC2HLek8ov)5'vXiY Ie } m Bb  [wi\=.F%@tcC 0J~JX7:@H\>O5D2 LHQ#u56)W" OY-RwkeJyCOeH~4KgJ  I  7   G Xo  v  d  _ ygs*qq )# !I"]w#H$! {$ $!$"$"$K#$#$$$O%$&&$"'%7(n%o)&*&,'-(.)N0*1+2,3-4.~59/6/N6S0u60f60H606050_50504c0E4)03/3/03T/2.2..2A.1-1Z-;1,1y,0,0+E0_+0)+/*/*/*F/*/*.*.*G.f*-I*- *-),,)+(Z+'*&)%)z$('# '!%] $#N"!)mH4/8P_s TO,BlyRstm:.vUKGA < !?,"W j#8!$"%"&#c'f#'y#P(V#i( #%("'"'K!& %#D"! 'N=$z,)=|6!t:|x{Qq4&z_ >^ 0|FM%Lq   - X " -  Q ^%4n\8=eL=fB =y=H4$Q:` B&3"jMCs& d7_|S")XzfVY4uob;swg5j{pSQ >V | C+   2   s  b uy 9  k2&bY[OV1s $=  =  : a 3  O    7  qiVQz!  C2   u F   u  ptQlpQ q0 $ I @ "  5juM3 l(b?~ pk cdh{8dsv|`;K2&A#-AL`.+aB m!y?:SI3=q>3zp=0g<X"K#Wa~Ift~Zt+8?]:U.8(xksSZyaDJa%*y$l]LPyBs!Of+  U1 m  x & {   = k  '.JYMj/^il!nZy@GKorRTD@+h#ON=QuFMrBdy d]Wn-  Ko  &N   t   w  .s$:H'lUO\a@OQ0vG*gC /r %FuG/g8'TrQph5M&k tl#&sk_d-C L.m}&r?e;| N  / e,Xs3aGfn^.GnPzgjEKX acyJ27$b ! ~4~6Z$8nr~Y  F  v0 !~ vX 8 b3 >_X}N&y*aL '^L#=%}VotD K /uU+xs1jUX.#t4Otm e    > O F6 9T c l h kz O 5 9 V o  8og  d : 7  k\  XX0T?CgY+ &6YzpzcuTSqM%|"P@QCcah,; |  u (   mW y 0     n  O  > X  ' -I     F  r   + A 9 a & E G V q <aJqH(Jxny6T8vH!n:s2_=sc#j`*D$$L6 6t  l!:!{!!v$""J " #*!$!$"[%k" &"&W#'#8($(j$)$&*$*0%;+^%+z%+%,%3,%',% ,g%+3%f+$*$D*=$)#(*#'"&!%!Q$- #g!O tLa A  [E"4I \ q o lL o d m S v ~ v^41WmO2b(j9\JcyTmb>&}g[ZF12Z& }H};b$Y^e5boqbC= CgS`pTyctE3;B hV(lDSx1*|%:PMym lC$Rm8X$qY8x T~twZ$FzfH's>Y4$Q.4~; +go.)cEv!RonQniL !j  ^  f=N(sMC   Y t n  M   I  b] CiS')3\g9%"k EXT(3[vx 5q " - 5 , i, +   Re' ys)ssT9 A _ . 7 4 X 7 { L f [ A !   < o z ^ [ $ c F  w Sv-LmhIiPF"LodK+u%  ? q /J  v t / i V EzO9R|eXu&BwdfU[&KUyeW2&4z/O~ CN\Y(-FO?z*4R}It3$Fg|dg"phk p1<5hJGd)Khj U b ~VB~\|v96RQ,)?F{BLfDHQWiR!JXpc'~wR11y"MRvzb W1.Pqe {S@;%6JhRL-4Y* G;f * |P me P<;({W4  > [s 20HLtw#a6|_wf6=R*q 5! "G$%f& ( ) !)U!*x!*x!+]!+!* w*r * z)(Ld('<'&dF&P%=p%;%N$bX$m##1#""F"!"!!!""T"""#(#>F#=#'#w"&""!A "[8Q\l lp9l5o m#Lww6#nt h ! a   * a e {l Ph $f?tH   :  u .aN sLpa-4u     |nkC^x2(m,#JQc5GL|XDea9K~Mm\9"-_' \CN*^jCW))4T%o F?`[/ |,q/yߣ?V.{ܡgk%ܢOڨڮ٨Uپ -A|j߬#}p0ۗC;݌7"ދaZ /{GdnvRUmes,T2]g^:V|U9mV7r@5RZA; GzJ@(Hc$.T[mjUom_z )`+HnWޮdWߢ &>?82Q DAGu0n7[lj m4+7_7 So4Y`;Q)D]{YMMhs`~"P2PMl+Bwq|'zRo^>}(]HlBetY]oqVED(9)= R\}c&? <6X # 9 @ $ U  : J Z i _a F    "  4 y f4 SLKNsztBLBE s 0 c R  c B U  % - 0 ', ER-z"SU%8hGGYvSK*K~7+Vuhb4]a$EK=itUvmWuQE)+C%zyg Dm}Xx^7OIF>/3A>Y;Y&:vG: 1ZBFEtCL; DWRz Dht7 BM) }G6{V,#l@;2;qHUiql;.\bu`QnATw;%>Po_9T|we=Ne&&bppMߪߓe+J jm}P߆2ܮ܎r#H'ٿ؞נQԋzӊӻ5ӏ҅ҤҘҔ}v҅iswipңo?ifT]lIo؃M٥Ҽ@)ڌaܙQՠ |Y;ڍ3ܵf]ߔQKiXSA59*>+PFsXki 9LtJJ)_)>wE"6 'h=awM5kG<~<}Bl#Db&aC^ T   i   A P t=   v N  & c  X  `{'c(flq>"tIPWEVu0T f  } v' *p6yb1'dEP+h{xcV;wq,'PbU3Zc3m1nHgPjW79MP6_)R}B 1''>=sC9bbJ]?HtufUNgQ!=k_/BuD!!;$5Hu! 22Q2 fC|09Ki^7;Zi\Pb?-Rub _+`w~lX4m=59bBd4 )  aSDC4++3`vHN ^ CtW Um~tQoH2kj <  4    2 T  | = &w ` b ,  "[ B !E  C  ( | @wb&$'X4g N`R* ,[Q;r8z.882kgk;4a5/+#AF C0,x[/^-8H6fkF:3 R}%P8t^ @,*b%A I96,E+e):yM '(5$y_g.Yz/?\p8eD:Vz+h-{Jp}I~k:*2!IO7(Q}9^cZjl{6|RhXK0DM9-%'}L! ISR,jX.ZVYrsofu&b=[otF *^7%C A 9 6v?>F1X_^j  #cx,c(x ?#8B+-QOoT_)n/}[>`gVr*Cru;7v u p t " _(RdGfL  C _X j iI E   P f l!   K    $ _T  ,;  "5`B L {    % | 0 W  tT )$@ i;E=6HjKX-Ie:IHpWi6=^[~sw q  J!Y ! "6!L#! $u"$#%#|&b$$'$'W%(%*(%"(%'=%u'$& $&K#K%x"`$!n# "! a3 SnRao`=S\,& 5 1 k l hF04 ]3#D8Q<+3uOTYr J60 >+-5Xh2FsH~a@7DWޛP:#%_Mai%CPlz,Vi`42!+t^^ +H)Wix,/] :e- 3)vEkzKFR]V8H*ޓtZr8wݚܴ@ ٗ H׊oա[Rռ4ԽGʄϙGΞFȃ?=^ǡ'dV{UςϕАYtxYw.U ǡ_3CϢ8/Aɞ ˯?m҃ϚW+tm؃՗ַb*ظذݘٙSځۅېܴW(ix!0c'[-o}j>LEJ]g:s#{~ifd5Hq   q  Q  Z   ((u Lc2S QgWbU!|H yXOX4N}F# .Ma`eY(M>>\*7AdY%^a2NX    > C  u : A. 8q  uS 7  X 2 /    L 4wz.NH*1mE}x15tKVMK#:Smrub:B/xcA$.}N  r j K } I { [H 1 0@ >` gU W AB5 N)vD"|_5q99Y3nn[cM_[OhFDtl P 7A/@zpr`oGuIvE3x@mp5ujH:R^ValHzzPkyYp_Qmus݀ݞ޾v4rܺVoۛ!Eڸy%Oح߂߬cճ/1܆Ӌadٿѯٮьٹnч2ұ٧.XӺH۴֋N; ޔl(7@NcTJ+Nd.p,[ 9 1 U?w6%:fyaPPGdf {}A)v'iUR/YZ=(=l(x)< -%# 1.@^'S, g 5 /  1 ~M g Z f(  ?  , ag  h !  eh [ v B ' E u,~|q [ N` O V Y^>4oPaX9>- r  E!!!!  $ / ] p    6 ^    d 0* ^- l ] !U!{I""#N t$ #%E!%!&p" '#'#($R($(!%(%)%))5&G)y&_)&j)&{)&)&r)&|)&W)c&D) &')%(}%('%($[($C($=($<(%e(I%(% )X&z) ')'z*t(+/)+)+A*B,*U,*G,*+\*e+)*$))4(('t'&'&$$I#q#!" ]4,Br(om6C k>> M 7  "K r<&1%@u44;+hSf;[dGM qyxz*X|_^pq^Cf@kn;4|Zߞd޼pzmc I8TdU׾tڡէBuؗӰpӳSB/p~ْt+#ۆ ՛ܓ~9E2߲s٢aI8Kܛݺ/ޤ5_F<w'/ފ7AܣuzR?%߲߁۹Vۑۅڌr߽ڀߔډߐڗߋڲߕ߶%>a۝=>ݍrQp|"x`!x>LIdV%I9v޳FwrpRQ,ڨWܢzڻWڊN6֡:JZ٫ӭb؝LҾ,~+79|ҳn):֗՗+վպFDz׺H׮,ٹصى4rڔ^?0Swۇޤ!ߤۗ߸߿Fvۜ#a5\ݺq߮qYB(1I(`wAOYAf=2\D'(w ` = z=. G.)_OF <!!! ! *! {(P7-9_  !!! "!<#u"#6#$##%7$%$ &$<&^$_&#v&n#T&"E&!& %T%$c$#O#"2"bo! , 72,~y{W*0Jm=v|$CyN?HAIL(Re`Zjs~}xU4,3 P}~}LC @h#;q>\8O8AT-P  B g 2  B C o t V 1 L 0 5  D a 3 .  KDI9bN,:=008O]{pfz~gxW% tpp )vL hW`~a<tE~#=~/QRv|>- xvCdyQ'Kvy'tAcC-PUn=߃)pݠi3UE\2݂hݲ(|XjnScG(lL$i25dN{]f mpRijuJ`rJR}o`Eu0dD_fpN[/fbyJ*UgaDMz` &c B'6RdVgG]zY$+nrm90c n&j:W]6\;\*aYqr0^d  B M~ a< n  `ZB-W L M lu %  BU=djP7#XPT>7qk (c .;tw%z x ZI  !QI)x! dd>Hu6TF3 J lX}y_!g6kycWrG ix3>UW/߶ހ4&ߓݠܫ܌Yܸ;7ܤc܉ٰCگT,ލdDf|W]m8 N߽`߻ޞޓrޏdyceW3yޅAޤ{_MaސH "ݠ݃{ehV]XOmsݒݢޝOޖޣ(ߤ߯WM9jB T[ #Y5)j$>bk&/%8 " ^ pf  c b'q}^MdyK !!q""S####bu#3#"F""!~]!! _ V 0 E$ ! %%  ^' ' '  &\V xV-#"EY q L!!O"P"Rj"T"7"!  & %g*J)l+y>g=(RL+BXs4cee8 q-.fu+?]L < O y %  @  3 l   E t & y M   S w 8r g|,u?`Tlf[#e'B>zf'o)+R{E Tl5yf(U/Kjfh *?NS^ez=o$(L:o2\ \lNY\/1Rߚ\޶ݸݎue!ߓM!ۮ* Yۄ٩) قEܝٔگ޿3߼ܭދ@B.= Tw3v~}wS AvBZv daNi/r?xCCP^kOi(Bv20;MkN~tge(t.ZU-=nW&+63 ] N    Y  f A Tc  v3   OE r   ^~ 5C ' + & , H cz[$ %2IjzzpO z 7 =  O * b'  cO(Kqq4<pxS2r]TzX`xH+\ "jCq  d!!"$##^$'%%&/'&(A'*'+','!.'B/'/0e'0&Z1&1%a1Q%0$0#."-!+ *"(%#!E.w>dPas({]`hF?%E\ r d   Qy u   l crE 4XjrE31TgtyPDh[nyT pS+&P1 4No.Q%f z'I^&'^`MHFdGoN 10"E"PA%iM2$@q0iXh]#G{\G2pTiL zx.|lbn~x"Z|7Ah} r2 S   4 P/ -   Q   z B " b l;1SkyWqab>,3y']D2 i@- U  \  M  t    G l Kp ]A 8FL!m`E \, uX0*MdXnuuu Q3IaExbsXAD4+(uw#&j^,Hf@:$v H 57 7  B 2  X c gTp]0q;  B  + %  - 2  o2 5 hcef0y D c 8  > ^ }Tqy&?'  R  Y D  B   G  x  <a @     ' AT Q t 5  G Z ,\1`}t\3  CjD . Oa^]YO[US@EYv^1ZH`.d YJz|xdr)[>\t JT`oU(@%5%k~wZF+0,g'U]sj@UdB_ECH*_M"+g>4=iag>~,D`aIM2`-/t'4pg,jK^8<8n2=zVf= CD.N fN HKj3h[9\bM>9d@ten|m3}k#u_&a*=x94m+&_,0eG[\4 2 xErIkFp%*{[m"Jt\KTC{^#Tz|\0LYS]j/\bgJ+ks^Xg+F6."MS0i)4f%({jZ%rON}JSVF?wQ#5Ia  Eo <    xvm ls Cs  r xcQ0c3G]y].|AbBR^w")Y6PxX7\! 7mO#x(-R   G m A    |D  QU  x d b ) 4D_Z0g@3 *uE*@`2%[UK2z&1"c :3%'G Fi;_{ofW`rs U0 Rl,kJ~UL0!y"Ll=}nPa<`)[#tQ;Qh   o $    g  D {  R9neK|* |@ h G , d r % m ] = )   < m | * m S Z 4 E |!:&]%?1:D#JEMmlG,lj"A%zG"3[ zAU:&) 09d :8 [+xI%uRz9}L ]uK 8s   / g .;"mf42t'kT.vh]:qM'Thba'A6yA=:h_35!=?yUFXl^8jY{9p p+5y\r8|MFA#s|6nF S6Q }J7szzA]E.Gq z@o>=P G_zrsfvknwu"XG]Sn!!},pC`Ch[~!+'"` }Q~\ /mg^5+wߞL($}E߃1?'owa}jlI(tM>:kg1j7B#C9U kMJm| /X{U0)"o50GwNP8>m}'@\)0gk=c?bp~_c/bU9T@kPM"$4#Zky$FUgz:Q4TV"djl''/b?!Hr*KFO[e'G(@zk@Y#U5Wupn3X$ZT?$mf6#K=mXoT0F_dpUAyJdN^QwquDk# Z)$  M9|q{C#~ev]](2J>|!acZt6M&_ rd JafEM #6&gZA* &Q#uv=PQ Fy5nM| =9i$O%rJINY@$[G$ * H _ 4  Z n  . xU -  ;e]&J0eh3k#RpR:/+ ^N+$`tQkD:);Rv`tq5)*+0Z!DjD/; s,0Suu@oI$r8A'gU2ab!Qd:^MgZG 8L:, 3aNyir  P 9 g 3 D k ; o ~  hfsT5g V, { d  & Q Q    T l$ Me0;+/4j/ 8?a)cSW:Na \/bFq ;S>A.epi [  u    j <i&pWr9r ~ h -   E5|@u9^"&  6]JTS 9  pp 3  u 4>-HHXqON . |d , Z x 7  }k k%1]B3\okBT&v-uGo-Hb_.,[&/{y1(V{W>Y(fDf\ g   c  & ] !    ;=0+wWv`x8t!iw` u > W gv  N  7  U    J  # vh  0 xy   0 [ t v{ k <  `.Uk23}KY'}:m,0e\KmGfO2e,U)rCSjn"%`5,,K|{1o; B5\J]ZOt/\J d,W/GXgfEw /(l*)r#etBDG7] )#w1^8eYb)|/\T+    P ! JQa0 < + f 4 ] $ ~ 3   @ y StY;$x'l"@3o#Ar&I&l9VpM:S8:'O`'  9[VKY#ex!_nMKMvlrPA_R Ji2H\8|.v24 M @ :  ( g  J ' = 9  J H  2 3% % 4Cu\=:cE*3zJ^v$)42{  ke6r@[cI@d3)W}Qe  s-P#,w?1YPPur0NS$UgJ "KM|u"ptRJf}  - b / V# wa lt S| Q E L} q  , <t W 3 <   (1~. Rs5c  Z & e F 9 * sJa@5Eg.b3 | }  ' c  ^  ( bX    6 L W 8Y Vn 1 - U9  : Bb gc4Keo&3v!x  (H  @ / ` p 8 _  `   y?C zp.e-}RYI< I ) 0 e _  meG}[, t 2 +Zt9 Ds~8n,<bX~}!;@ qq 3  U k k V 3 $  [  <  O ~ {q V ?   o ]5 R{c|{=wkU=c-' %8 R eHue2McC:iM\Dl^-VJ5$)4OWW8TDaO h VLeh\[3.IHPIcMlnuP?<^-|qUyHyj 1XIZ\Q 8T'q^7U.Pyd+7b"VK fqB޺ޛޗSެuV`kMx"Wkj%.2`b o]az7ߨ {ExV$99`deu-nhf GF1;4eADP+c zh% qU\ ~ )  $ p Q =  T ~ O G | * I      H (    . x' ( # 4   2u k6 xHx/6{RPUXD1m(;>3%"AnDpR;( GCx(yx~e>#O$1j*X^usY8Hf-fFc>'t7z e 3F6Y NyxL 4B`3 !c)UzQ}ot%uW}|l=mC%lmM1DO?߿ ߙ-ߥgߖy/rJ*nx 1v1k߱%Ccޗ46 ݦc @.0ީ2ދ c0ݖ#ݖ܎;۷D'ڛ'/[ՏלԧoiZtӗ?i=|Кͮz ;voʤFʛ+zMIrDze5ưCǺn° Onȡ XJĠIĵ9ɰÿKó‡gLɋ+4ǪǺcE^ǬD:[„zá5Ȏh7Ƴ_aV0Ȏye@@̙ʵ(o˛ AΝ[3ͩv ЫJ͊$ K;~lΡ/Ѿ#O}sӍ8'ח&@ّؗ!6۠لd ܭ( &)"* &/-d?ۣmܥ3ۊMݹ<ޭ6B4޻ <޸݁=tݧdkd+ Zwx$/dE547BYPTw5  L b F    p E  X=&   8 Y   _ 6 w { @ H y  8 S  J ) D D  Z 0 , &  l  Sd,<c"b^k& '> 3  h    c^ 1fq]jm?c  .9  \ c )+ c }f D ]  n  ' |  !N ^CT.^q- ]>Jc.T7EgLS8Bm-Nr#^&,]{hA8(jtl0l( Rst!52ov  F!H"##Gk$x%%&R&&b& m&2&?%V%)$A$#u #}" "'!r!J!E!^!~!!-&"""D2#####2#b#"Z"! JjR/! }v6{U{hjIR*F t*^DP[\qD:x  _ ! . . I m   / V , dF L4,3mPHrF F5 k\EV?fEg|"?Uleo>9 i8# h'r C]PL-V'9hQ+u 4C=-Pr1{{`AD?ekom mn&J2)  p q h S "  K N  :N-jF m ~  ~ V w YCh|6f{ !7PTQ2 [ ? : a 1b I  o . f;e|F}MfT>} K+aGfTcuO-)]PWISf^HvZCfe=^C.8pM, ,5`"LC?od?*c)Fsiugu}V^#I8e1+(>`rxmiTgV(#WyfK^f-NEw7dudD,_a=16kaK2b`Y_e-;{DE !XE [;N5$G%9JC'1hA$f{%uD ,g'-=BS5LYG#o8+2f$iUjD?ZE  TO-Rrek9D-z+-xPF7[4P@PE<Wqu5a7D Fh3#-f7 Q m t   c   2 s [ ! D   x @  c5d3-&.\O(1]X5o+=p8!yl b"IPOZcPtQ aacy<'5 S/oxav%_^qW'ca G^}>1) #*Ea5A|(AT]\_$"kNVB'DZp7l:(\MhY|cW{kv.v"P{i6nKH` p0ggm8&m [.~nzh!Fp jlu}      r @ P $    &A q  + B    M  u + .  i ,   `  w2$zLfNMrtXDbh <ljc\\kG e4 !"\"###x$v$'%$%$%"$%#\%"$!"$v =#:O"C!% !!f(5l[,|B\sB>b3?0vxU_>VBj4v    A B O  us 5  P   4 M z     .- II gQ vp zt y t y~ ti ]b bX q( m   x %> m  ,  r 8 = ' z ) %  dM w  Tv +D  1 w a M ` _ c &kd+PewU) )tg=S: Hz[> "hlD_$brz ?nu\E  p p/i ;  ' }  f LQ5 _\tyMe;p,-.*t8sXBRznWn7S:\Rt  M:'SAiF(X_kN{WI:r~Q^BHR[a 0:!JB0FbccQb`nRwF<83YowfK,m*0mZ@s9['r)cSGf1Vf[aG!T><]G:8v9.jFjW)c^'GH6Op@s4A.3-nait#658L)m$u^7[xQW8'k%%-Jk,*byOH gbMr|H((@$p7 79NjR@ 1  ,]N  N.  y&   J8 |c ;Q~ !X""#z$De$$$c%=%O%hJ% N% D%W!R%!M%"L%#p%#%#$%$%$&G%=&}%{&%&%&p%&%~&$/&$%^#7%"$!# #Z"!% sb &Va_N_.8j6%K  9` #  q  @ A   F   JM/  `WY % Ao#X:{smeV\ g8d+ vj7j/S &JLg~7Mf^"klKD[wZnic5Upmr7k4> "3 `v?KKUk>(j)hTcxN?>BUvm45(m:Hv@3!IeOQ&;$_8kmY0MBlwoH2-';]l /4IZry|v1o,S&BXyg}MaCp 'Am^Tei@(X u+| /   V  k 0 H uk+&FG+eA~2Bi?Qr1/SzzDT_ZFnzJy YZ * U   yC   #} %? #  J # . c %FE! z'(Xf7  D } G S 7 M h u 3 ~vSygx[JHaPAHUkB37yy, " z u 5 ) c  : ,d Ns y yr [t !k e m K t  Z  R a @ X 1 c % w Z r  ME  a  + .T 4 0 Q  f l  u  ) m  \ h =sI> .VpH ]   := z Y a6fa  ` iRsCu{pcl~;q%0>xZLc$]??53FFw z p@!"tU=H$c';*)0٠(L?}t%wΏYikYԏ94Ҥ/B022)ͦ5́;oIOy?ɵ&+ɠo R a,ɩ>uɥȬ3&ʩNtvF ̖r̺ͽ͋ *U@Άs+0УϡMЄfӤU{TIJ 'nٍ~>ۃTe7Qٜ݅TI۸0 ݫ 3u Ai3GWNݘ ~= ڴ,n[߭]ߵzڱ߁#tq ޏS22Yxq^6;SvY)z޳;އg_o'ފW޳ s@u-`rh.X-N,`/)YOS d/\{s ,k<=Ks3y^D o  o K +8 q- ;6ig~:*v .!-#d$h%I&P ' 'E!9(!(!W)")J"*"E+(#,,#-{$.z%7/s&_0'1(2)3$+4;,h5:- 6-6.6)/6/6/6/<6/5/I5[/4/3.P3.2.1..1.w0./...D..-.,a.3,*.+-*-k* -),Z)(,(+l(+'w*}')&&)V&z(%'$&$ &*#%"# "R!d /zm.TE34)B{  f  Z  '   m g G?2;Y)Ch0!7x$iF +YlHu$ ACyebi?, 41I4}t__]1>(#!v 1~;7qlW\Q+*<BtuO>!RHcpJ#V9JQuu =s 8Oj&~"^C>{F")KhdP%OgsL7AS}Gk_/zZHWU5(K]  D *  &  9-$0tu dpl6 44B .  $O!8!E"[ T"+!n"!u"w"`""#""!"!"!! N! D<&sw< TM}? K!'<JC_8eB]Zhf : & 3/ P | 4 2 \ b Z r p   S   k  h  #  n   n X!_yplvmU`qEMUs]59]y'R^`8|6Fd3kw<Es-?<~f0aq?C $|/,495X1r}sN/%d]RdC )PBt"Dlx;tS~bBy.A#[ceW|tI0}f?& =0'tU($eO~_2gby[Ax<t=! ~ /  7  b?m7*  B  } \ dK 8*_{z"Sn$s"^,/r 3hZ9 - Si~'L_Sd8b11$@E{BHUDj}{lBJ#8B39'%(I<bN9" ! %| Qu w   b *[(m:d0H MF  ,  v k H "      G A W 2 x   & / j %\u);{{!~"&_jf`K ty"_4Axnmoa^LGJ6@~@6<2m+<hmSMvr4bT a )  h  , 3W}R'tpOEcJi"s peqgMHi$N M13 C0%le4?GhUkV'Ii2R'-{)fX)$YGtdP#|@&w tJKVwcI)_ ls0L ;^xR  B[CG|,l<; JE^ckH'73yMN}]C Qj*dGZJ. E; O1F{$L 8]st]4Xk+6K)i2SYm[C32Eh}rz)}vjgS/QTAhX  #w   p 8 r w    owf/w[=>fBMbsoUQmhZkekl{5pb (! j=iv.{/ER1/l@Xh$= ELKwIZ<_Cqh\d,lcxJT4 <HfagO )5$xf8 P*ds~nmZD1wY6 ~M0$@0~mB [ m a  Bi 6EkZ LP{pSA E<a_  ! S _  y M l S ' _  ! 9 ? 0  O b ]M 3_ T 8"*L75O,AG|hdC_ (ol8 pXND0q/XQ dr M  x  ^I]`]Ke ; 9K    k Yy M 7O    Y [ K 5 ^ u p`Nq\^VezD w_D]8%)s^* +iJr.E4A$/WB^"Q0/gcX@kspHM/d%VpV<s\^u%o k2`8 c< ~ "*Cy3  > T U`zCv~kV7/\:SoI@ ' 5 w6 7-   sM AKz(}P'~[  T3$a''7sM!+  !`b"7#%$$ % &;!'!R(j")")S#*#o*#*#*#v*-#-*")! )$!Z(7 '-&/%5$<#a#L".!1!   } 3!!j1""w#:!$$B%% *&&&(&&&&&-&&{&J&I&Y&&&&^&^&&%%@%%Ny$-#""]A!b g|jrVN Z4c|jw?U}M0j _ [1I0` u  i (  Y  c +  * yZcR3w@  RBy}?iktB`w[YBa0!PBhe=< c'=,p 7t+@%yS]1r YzY1H$*RPupc5w(F+oQ<;i~O(Zx]ar<%&SnCm\-4jFV<K!KdmY  2|y*hTP]mn$4EOTizeeIvje;Nj( z LiL LF faU2! <~G!n(@7<600Q6apl]#fA'&Pq` Kc-B1#Oxtg\9@(;=_?/ N} P  X w  g/ @ @ ,9 .2 4/ 1 A l   o   I /  k2=>Y9ju\5%oIe {Q{gY+W~,czzMd{j_ ET$I7w,q-FYhMg8\\^ n+1DyUb n*IWNi31)  WK } q Z L C   # v U  M  X  c 7c,eY:3 v*9K*gc@s?\CoIku+{,:%_aa zE gaaP?4dJl- *Zb lm;7 NAU'lWQ0,&S޶oWw1ދ-f݆ڌڱڊuـلجٔ\f\ڔzuq ޔ۝f ݏߺgGޓaLK~i*': ;u<=Q [h4;t߭G^p*(d]NJ|eZ}1Eh-_eV`$/X P&{ pu!}}E'.zu'&dz0kj 9<QHV,A}T 7y}nOJ lE{ zsj F N)y>;Wx}Nv6w'8Wc TGHq*7w3? UBUFjV~(4(iUl"4:^^~=s X>ZNa 2Wn|S   'J o   -YF\ P[ /  G l |_]2@ e ! 7!xi!!!} "+0"{"" #w\#b#S$;h$8$+%*q%# %!&!o&"&# 'F$i'$'a%(%8(%v(&(%(%(E%)$(#(#(!"(!F( '' '&}&Y%"%N$l#Mx"]!: Ux0(< mM J  N Q26Umt03 z*M6, z|O~]n X^utID* @8zh-XS0]619DNBT=bC36X)|Y6eLC)#y.$KA) H <{X+~q<B{WWB6iw9\#+RCgc4aANHf0:-q+ {-   Qo u       ' 2 { u +  O 8  P P Dv          |T  p 93 -IhEA[u l|#Gy-1*Ez| o9 K M ?, \  m l f  w_O5WDI]e$Pt @f G b  ] & C  $ + $ C   l  v xu dJXPKIUB>#9L0e?-3{#tZ#zL#fEW)|J^K9M^"$bh@;9MC$y&G \  U  V 8jA6> "WmCEx<4_\K%(Nnp"8Vd0$(S {Kf"K-iWYcWބ<ݐ܀ܧܥ f99#Q(c*+h*|viWMBE\6#u*0nX1ST0Khm{ Z!iPDWxQDF JGre HQM5VJ-!kWnwhnzrt  L A ( 0 Y Z ,>sUoX#>VJp  @  : X{ <pk` 1 F   Q N d  f#  R:lDu r}tu. R`6#!N@xeg= 4JfDu;^<9Y$O{!V^)Qn"Fw1Xg`2SH9 Gd F| &   * l B z    ,M  6v2}36H eYr-}_@=6WnTR03n9 *9nefF<PsFx!x^'Lw-t?U!ic 8 n\ ,fy}i,:yjma5cS< } j 3 u  mcQH^oxm`) .}2R6:s%'bL;UJK>FdScrJt&gPhV8nޢqE@#ۺK{`ڏq^I8DnܟbG,{iM&bXc7ݳV2߹^  01ۖcݟuIYܕټ5/ؖڭڏؿٔpٚLI%q|ٻ,0ڞڊD۽ڕbތڽAm٦I-(١ Dh"Bۈ"lOp  !H \p9}nPI!YErdZ*\r=tpXr+maoCj[stC?2\"c5%E,'d_2wPe6J2(vmNC@u7L|*av|gd0EdV$/:Pjpf+#&wk 5 T - G n1  Hw"Jfi%aP#e|M| :9Ph   l B   ] - 5V[0  (]jo@ ~6|\P^N{{Prh^$?@V+n7TALc܊ܵ܎J+dYޥLVԍBݹ0:$vݶ݌8޲Јߴ,ҍ=Ֆr܋6ߡ~c1/4RiuG1SBM]7Nw?jAg]VA(pZ?g}F75:;;/SBhmn^"0-m>MW7>q! :p"kq0U56%RELEx8ajzJdn1{bKOFU`ޠ{W85"Xںڮڭڐtڨ7ڣٴ|j8+P[V="Dҟ67RZ`Ѣ_N\ԛN׳Yه}ܒWB E\pj;0dmL5lfa7 Rp>&-QsoKKVzNZh!i{SODOnhF.{Ws*d$$|'VR(])?h5Qr  }f  Q     t ui RU 2[ 1c  & :5 W I  & gQ#V  m   q ; R'SH 3@C&w-;Wx!|oynUCfOXw\Xry:&'sS3q[* :Y1[Knj_H"Z+~CsT!\4R}=ht&N^fmwz~g '    r    1 y  ; s   f >  3+ W n<WlJsrW3xXEw>7=<'0R" |TM6* @v3_ D /IygF=nr !d` )d4* )"G,WBh;2R$ ILp$;vVl3_]gH m58`aVZO-8-wEw#;VHQA08X W1u,4xoC0aA5zJ7zH# ` | E ; N vaEJn[zT-' RV0?-s`V;FtVN!Osu}^"0M@s#*>SX1h[zB 0iAm4 r*T*B}Ii1UjXe2B27uTBN  ! #  {B#]/alDl ! R"[!#"#"$#%m$&_%'`&!)z'|*(+)X- +.X,0r-J1s.]2Z/;3030]40414?1y4!1+4130:3020 201j01f00e010m0/~0/0/0/0/0/0/g00@0+0020/80/$0+/0./>.^/-.,8.9,o-Z+|,t*y+l)T*Z()(''%Z&$$d#p#"! } [5D) +HR(tl7-R3m&}   y ! %{ ) @ k    o 4 6 'Fo\H)o+Hh+N0Niw5U\Y>-5@R^Tn  d r ]   9 F  0 M D )  S r 1 e 7 ?  3  G  <l  W&-Y< n  .   } o H L n t  T ^ y z QN$?d1L ~F=HrWuF4( 9k`PdvffP7-EB 1R_Vke7 ^Mh|K,(Gq B M#`!]~=8q  * f w  . t h `    #A  J&pnW9iVc+}:62 0] ?   )B/I   2 g  z M ; G ;&   C 5y 4EP7 y#r*e m D ['h2{p)Vj">oNGMx )!<" .#*#< $!U%!%m"%"&#&/#%#%"y%"2%"$u!$ a$ /$j###f#,#"u"'"<k!g  ;]dgEv3eFY4FQD2G9&\ 7L  2p ] X / 3 ?l>"F/Bjuy3; *.iO-[0D@+ArFB{<'C}}MON- dYI:ki 244:H4rF-!)9]Y6T Dyk_N_K9O54R5>=$+Mhr*    Y ~ . & D ' k A,q l>S} 1K  X   E  3   C   mY y  Z =   8 ? O \C`X$N 6b_jr]?xI     )  U  : ]2  b z!wbU;bGe z(|5|$f}. F,>euF  0Oetu}<~nb{bXa]#hLq];tY2CwgPRjmc~A:Tf8/$Ia#ttkgradQwS#Wt> y>oae)P}]K0] MJrdK:9M+T7U[ /*DG5l9Rb{n@ $C &%'BzHIjd(k0x!j_A5~B/ 4R"{3]L.DXzI1    !   ~ZD'>_7LI]a&z,PV;Wjd;npnJ9>nK("&.I!bR91lt_c!  Aj W /  <8 h( gA   / ,kb'3pRrN-H.gi:n`srV_8O;q*w FA{&g-Wl+zh[b,nK~&O{'.*"5M[`WzRmVcBU;eAjMbM,4alaA   E t5  ! Y   ~ W  u z l rw c q    # N  t U  V  Ax  y   Mjp}T=X2TB{t>\ x&6MM`T4y"Sr}6vO0 QahCkO#un$8wn+i(} j{vTJJtp`(g) D)>9i;qkkpYNYbuiik`Q3' Hy~HZ Qx\JE//WfbVK9X,rHxM%sBb>j b(u k02VE.>eFZ[b;'v4].߫L2|kaރc (iV^z`&cMG?`9,-k"%AEgU/;0\SI1a8?&M{NJhfcqZe''KL * b r a ; Q  @ k P E !m Y ) )    5 ~ ) ^X ?3S !"#$ f%}! &4"&"'s#\'$'$' %'%'&'J&'&a'&9'&& '&&z&&@&&&&%&%f&%E&%6&e%&O%%7%%$%$%c$K%#$k#$"$!q# !" "Z! iN9(cJ5.8  xm ' z*}M  B 0v\`H>6QC<7]!HbpQ*:N&PZie5kr(C[{wY2l Sk\^ zl6L& ":X^#\[CWj  > [t J z 3 3 = * XB"#jdQg}m q y  k  @!s4'7@w,wP_  M yN & ) + 9 M t _ " | X  s . d  } >r<eBUG![$EEL; R8KR,V0:Ibb! aExo|"F` 9>qC`1=i\>4 f=APhu=6'xkhwPF9u+@ fQP! _7*<\VA48TI+}!!+ 41YYJEsg!sP\Z!}OhX Xa'hp6&H~Gcfn3I](74@/60=`"\y~cB2Q #:o\ k&YZ"E\zvlP_g   ~5 \ 55 D 8  y ,x ](3 3mpl@@=0fV^1ZcStw;9`@sL M - v # <  nD r0 A q5)KRkhg]rfgwQ++hw)4J})79\o q0wIliju~gJ$, R.HqEKF*&.^H9`vN|V,Aog a32[hI 3][M2h 5  |  hFK ROE Xm  R"  =B  : } C C    ! F O    X2[4CN3_gQUP$     R%  R  9y  D {  ^C~?gS[p2wL2gm7XBeue M!MkszLu}O908A+0,\": 0./&/.$n~"8Ombm0Ee%jQpUEkv2D*E{Gf \$ X:}:Zd[6#?hYEr>7TdvPwN!c1L\y5U"--$YE~Cv2f4 &HPxN  v.n~WFQzfC  =  >      c )     t  & d &   >  d {  Oj iB/C5BUmqiHpb'hK/ =)T7i7o+l3r^?}=vgQ~o1q184417V>Y|*6ۗ ܾ+7aLm6FD\ z1_+ g*wxDM/5(!`1,dfk |KDzNq&x;e eQ%v"by hiEU,7.:bo VP;=vV$l$bRMZ7c( !  H  = g % + k?JJH4/%. Z cv c m   &!!p!"!""3#K"i#"##w#o#I###`$"$"%#]&L#'#'d$("%1)&)&$*'n*(*)n*!***)*(*+(*7'c*"&)%V)#(" (!' '&&N\&b&\&1R&{B&&%7%7$&~#I" _3Ie>'C  3 a  W NG fb87 z&}GPgou=#"JXBM= 'm?,*?neP-#>1qo_QWjG .q{lxEphmbj'='1h=y]6-FzA8<!PsWz 6 N  q  * w  ! = 0 Z H v s ~ z q T 9  Y % U 1 )  :    h '  : M P QjI g/~5 QmW{XZ  P$-uDi#Fgu 9n.j;8H|G O^ Q~+*\xgW<7LM,phQxcq3 Wo\ e  )   } / S & u a : E o[r"}liN%n"??q++uLo $  "  Q   q J  I F p U z  U ` Z cy   u /  n   z   h Z% %  ' Tms`mbkYaVLJ2|/\##xItlU1 5/+%"djt>r|Z)ZnZCQ iw"L]Xe]LuW*5`-n9HnnzcCGVAi):4wa߫1X1mNۜrާoU}ܕfO׻[׫vעۮשױAجۚت؆Idۙ+$ڥy9t@ن۲ؿb $>׀װܲܬ2!*aܕv!*ٯ}'َ2ڇtTۢDV0*}`)>ٝQ۬g87ݝ8AZ1)mQޫު,}|w܌u%Fۿۨ(ܞvܙ܉DqS}#8o.]w'e4eM'2O;Ew^h`|E@9\j:tO+SW~e_V!2'V]0G{mg% ON  r  h < 8.  e 7 [P k O ( D G . O  o ; E   E  v > !  Y     9 \  l y Q y ^UH:^P;6yl~Q 3i^(G}E/h^,U{M"rDc{BW-[ECy6uqG.T2~+-JRr7XEQYEktj L   < 6 A G ! \  .  3  b N Qj[ Pb(uMtqW!  vz!U!*v"" # B#s P# Q# D#} #"aQ"g!S9! ?V8OO7*E i   e t 9  | )eJege+5vUM$l[ivbQCDgSNx_+WU-߱]Eڭ@3l;9>\ڸvT٨q\Eva2")3ݾ\ QZL1%Xzgt`5XvtAX I,2Vur>ygc !wCy[g)3/dxB-Jx .m\Q$,Zy?x(s7_7q.M#$(T2f}6rWHP0ZK2 < 0 i  6M  E e9, EHA - m , >  tB6~f'1g@bR  Q!!b "7"8" !O !_ !h r Q  7G w9R~Jf  Z!!n"& S" s"G!v"!E"! "!!v!!!v ] Q^4a},=7*=AP7 ;%GR[U9JvDIZ x  3 % w | > c  jr &  R Uh :Zd,2{*F&}nK>dH}6D?szMb!PWWLr*5}g( NtIB:3]PZ5 Q3/ cC/EX8 C.6:%i5Xq\ܜCp ڷ[ysӬӚќBЭзsЎЋϠC`ȜQ9lюƀ?o@Ѥ`c ŷΉ)SHwú˹˥×ʪEʶ!6NʋĕpŘ ́Lʹ?X\(qzЕh-&Y͖҅λLӆPwկзP#<ї.ٜcvЂ8К аϥٔϙzςss,OBU];9U?Xr seK2%+k-Z %O!aPn  ~ 1    2  C T l  ,G   Mwq;A ^mqg>  #% 'F !  G v8)s!h S N S  `Vh"!~9   M  3uL`k^^7xS\EP') :y 7 . : f t  = k /s 3;~h<d);B>$9`8#mkXxQh+m,Re0UyH2+yUWޠJ޿i߈Yނܰݎ)ݨoF" ,MMݰ>ݕD}mo#WsZه֓؎սנ֣G֫ҧ)ѷԓvMQσ#'~М $ֱѤc"ӝ؊T)՛ز#y ٹ+'٪#ف$I !7֖֫ؑ)׊טؘٹ.zRݳ=Fڕ$s kyߝ)t$v:.NDR"<nz YYXIuj=ߤߜߔ߀]Eۼڑo'~.ԵݛL&ҥyrKӗܢDݦ آtٶtd߰m 3n!^dT31hCZPcY&X,w5~xHWoTH06rE BF*Vy0  vO g7  nA + x  ]  "L]FX:u#r*4BS~V.T 3Xz;(CD=:Rw!Qyv@%O.z*dx0@oIz'; l %'lqgozXuOfeS ">-5^Bp+]   1 I 6 5 &    % zs M *1 * .  R  Y S{#VH\6 Fb@$cz#}Jobu5 . Y? E B C 9  ! !  O d * ,/WmR z;c0 "  p=+R#qXQs\1x&KI.K\<6&TzNe J9B+#oR}*tWnOwjY90(xlUl2EC"b'{IE[Fl8D>ln1v;PWu<ESP~&Y!lwhNXB`vfx+2~z9IxK(d+]%0,~g4e^OAUvxy`l _  v <  * a  =  , -  9]nz,!AJn{ & ;! ! !i"Y!"!#!X#!s#"#>"#v"#"#"r#'#p#j#c##n##W##_##V##j##e#A#w#"#"#B"#!#! $c!E$O!$?!%j!z%!&"&"`'#(#(j${)%)*%*?&6+&+'+>'+K'+>']+'*&j**&)%)%Y(l$'#& #%"'%"l$!#G!# y" ! :!^ )  Ut8>DSK}zs-XJC  !!+ Y"i! #"y###$\$%$& %K'_%'%9(%~(%(&(!&Q(#& (!&'&#'%&%&%%{%I%f%$;%$:%$F%$]%%%%%&-&&&' 't('U)(.*v( +(+S)v,)-)-O*-{*Y.*.+.J+X/+/+0W,0,11F-1-i2r.,3.3/4E0+50516 2r62636x36364W6?4 6S45W4N54443j433*3v3221n2#11V0C1n/0. 0-f/,.+=.A+-*,2*,) ,)+)Y+)+)*)*4*v*s*A****)*o)*)*(*D(+'+h'%+&X+&+f&+3&N,&, &k-&..&.+&>/;&/D&0(&A0%T0%10E%/$L/A$.#-#,s",!+!*9!1)!Z(0!'c!&!}&B"#&"%w#% $%$%6%%%%%t%%Y%V%%$$$N$## "# M"y!` ,&-c Ip,y!39?F3S{='Q0F'\%xij8]5`}oZ h 3a h s  2 '} *_""X7tY~?/83#_-dn +,{P0{[5vK%DdW^ MK`Dms+m8N'K(jm|>vzV85sUV'[i`db78 |R\C = r!  # J9DpR+     POy+$xYiWfwv#~^):]cI Z V!!;"k""#G"#$# #l " "H!J"!!a"!"T!i#6!$'!$/! %a!%!%"&~"I&"?&n# &#%&$#%Q$$Z$#4$"#!M#[ ")! SW2")f(k'"  V  4h   :   Z 6K  X 4 ]s=x$4r< l3o$; kB  ' { _)1  8 !!5"7"5#4# $tZ$>$$%<%sA%C%B%4%%$$$$$Z$ $$$"$gp$;$&$}#C#"X"!H! mL "|K;."{c[%+%R"V4{'% Yj   v 1 g m N v3 - \> 1 \* )  7 V N ,   Wf .6    +N   o   , 78 $cC+ @ R<ntRg 3juMz0"awqM<%nDCn2! -E>%^Lg J'OK^VZw+3>U%j*&@OZBvߚpZ\,chx߉|]8//Mߴ-2 ݍBڡ[K6Ӗ ([RՀaA΁Կ%TͷK̅{Ku9d'qg 4F{V7 {S|~q_/U: _f? y7 1u:<4TD*U:c  , , .  ! f 0 4 : ( % " .  9 ] k X Z R m R   a)  f & J[t !  N'  9   cM +  ? D x ] 4 a |  P %  V ' e  &  9 l e V  ]- Q  u   6  is  bz_CF/>aU"R)%n2[o /"#%v'D)*d, -!N/"a0r#H1$2g$2$2$2$2$2$q2$+2$1$g1#%1%0%0&H0='60(.0(F0)k0*0+0[,1,Y1-1-1$.1.1-1T-K1,0+0*f/)n.'V-%,#*!V)'i&$#RA" LI_ yO1Z<&=#:@fvx[BT:{  & w H  u $5  Y {r+7 :}sއfݝYcz'W1uם%ހSi֮am|ێ֘)BچpجؤaٛA٠4 q8۱C0AۖۨIoھيݦ{St٪{ޢ=0NߠQ%T3߁E+  C~߭z 5wR2Af+Te,nWyQ(A&i)'TyjnT/[ws,U}}^"(]y_jupO  l  e D  / h " R z"3   2 j #Vlj:dXqj]juzaJl%R"(7-I -7m_|~[ !"#%$$$$$n$#$#l"-W" ! %Z n'D](u"=n <; !a!""#"$C#&&#]'$(*%)%*v&+','-A(B.(.F)/)!/* /a*.*.*-+>-=+l,R++g+*x+)p+(n+s'R+&.+%*$*$a*|#)#q)"("p("'"F'"&E#:&#%m$%%W%%6%`&6% 'L%'m%2(%(%(&(R&(t&(x&/(j&'-&&%%a%$$J##"# "%!o:1W98EMbaPq#$rIKa /6 q  W)  2 ]    E q { J A  | . r    .   Q 7 F {  ^  d  ' Q x )~~}37 HfruG{ZD iF ; M (O a( b_BBzv;Lh9z#WDEfJoQ*0G}`=$V.xZ-ML!"i 6yx>~ %  ! N R I t X  [xTshOY03(\q>; Q@-GY`~n6aqM5yO7Tx_1 4?%L}%fPIzb1J^d/NV/.b],O z=~ p  9& r o 4 B z  g  c }FsO0)!X`C'* &BDo7L j!2""s##$@%%&&'a')'*h(*(+(9,](,'},'X,&+4&X+d%*$)#("'!&!f%C E$i#v! uM,:s:pUp,95u |YcT    l :  [ j _m  )0(V   ; U  0 2 S   ~ P k   \  ?2`mS;7T d a F   3  s m   +   Z m =:    BM   y o } I  bi??\QW9!f_oW>1IpHUgWr<^gDcv[:/ox$}2=xybF!t~;iYBI<6|2,v0%$eYv0LYfT  '  v9#\=-:Mpq.E;_U'|"-zn(/H iwSN*R`l_rZ\PZBa@U%K-ZZOo/ s]jNo@86U| 6b}A~0N4 .1i 2 th}zDfF/FN-"5jAPwJZ(l.jpV+ {L9;TC9'+B"sg806sF!P\=0:$0/BdhAY5 -jm-"I1Wh}fuR4 TClnRAQ.),If ;6>ixg NM $ 8 u =EX|@9Z H[sK&Ed3  < R!K!J |  z},NaP `.-W1J_'srOiyN9oOehZ}7&o`0&-N-v|.  (  L  < m  ? ( M < c  C ne  *i /i`-H   v     a  { dMzk1' =  = [  > P, c zJ N G(  Q=ku+Z ^=*"|9 ~liHLf uZ & K  q 0 q  ' A ( I  j s  A1 ?.  (   ^=  2 VC H   2 @ tc 6s   I   5 [ X # ~ ? d 9  J + / BL7c/lV8$3` O XsLV-q m }B.M!5 [(1hS!y,GHZLx!D E IQ S8}&4n:3Z :p!{)kH^g?q{QLL`v a} v  X e  7M\mot}\sVaQ@f~:T,K9jiGNZ  -0 G @XQ +/{o@ll|r ,!!"#j##1#_#r#K#"q"!V!u . 5p \qYBYea%4FIZ8sIB.0['c:JJ/Gu0 \z(a 1>~(ze(E%t"0-<y f0Sj~a)BwQ  !?!V"t"Z"l" "\ ! 5!   DJ gI1 D/D5t/7eN!Fh{}lX|Np["'! U  @ s o y $        1 T    w < [  @ r } %n U 9#[]uH+8k:(#*rList&x8 z{CU=FnkT`.1QYH'9sE] G { o   y L D3f^fp\[_co:Iv]f^ >teY\,Ejz;37A%$FJi-\] YD+Eh_*2I{1eZ {4ui(m,8M!Y&_||c]7dKkSJxo  opFkacM] -4]KHM(mGM y8XO?gey|_f*fM7 U ;   JvdX N N!!!"{#% $$%f&t'q'~5(v()x)j )T!*&" *"3*<#<*#/*#*#)#)C#W)")s"(!<(;!' e' &}&&v%B%$ $Z$G$##o#.#j" ""!g TM W}Kj4jN6|]W|,92AWHT/:'EYa=nX270"-;;Yf&{s+E@hGL[ibm*y%4yR 2^i3VAmpCoY5|GFh'i3KKyQqY FNS9~u%N* f u  x B D =  H 6 7 ?my K- yp|8}0\^y"g{O,Je a  L Y:(c'F~(Fj$}b{{i\;PoTk:Kz1O$ y@oMSf#<3M J%h`@54qq>M[>1 hFb(WYmJiߓ{"ߡݭ޴4۶'*ڇYۚXײn {٪؟^؊ָ&׀ם}NؘD*܈OR[8m8lJVi/yiLp,9H{ 1O,GCt4 UFK%oG,zn:/dzv+[JI/IjYpZU'At+=9PGZ.(%AcWEl/oZ`BJV?wz .[_Sp|  b K C ] % (   9bMW.$/')@qPhompdP0pmv+n)TLMCH<& HyuUBy_EW  i #n  sewPb* f\rYW&{?>:  om  o z  5  W i : i c 8 ,  m a  G  Y"D5b6%:ESw4g^Uuc^A|['{jlQiTgI (_; 1 ( `A@J*$ )#X]R^5}1QM$hx)m_h.@ (z R  Q Pm3gW~R 06` A  N  )x U* i          sY W* 4 w  y* ?X?jWca5qx ,*Pk\rIF kXSo/ev> DWtݠy<߰ݻ| ь ;~rչʠ(?Җ /α.Θn͌a1˖%UGʸ (Ɏzf۹WƸ7VYطv1Qڶƶ4Զ 8࿛£ 93av[s=7,?NuưT^H`a ϭNb΢#o ա֒K`_ؑخOپٮݚڞWۈMdPK670Cs>4 (;0 e><&W/;?~G o$H -52/ -Sw?cn`@\y5L   ,~ V rp } J 7 q +lZ;uyB:oSj5} Z&z)<ihN6#"?JhG~vC O      2 s V = v<wqOK fpQ/)!z-@Zu~e v0,Ja"x|Onywk%hh(Dmb/H<{sgn~|TX9 l=%#9KDE6<s2`Gngus>i7es"l  < @  [ n i l n  e V E9  , .  )eO >xg#7D&a92 H(>CKP ZazvqdGu yW 4 E W   = v  -Q tR  S [-C   !x#q %C"~&#'%(['(* )#+*',(,*--.//001"173:2i4L35b46|576f87!9899k:y::9;G;;;<;= <=]<=u<=<=<=<=9>K9R?9?8?8?t8&?)8>7=m7<6;U6=:58463422G10/.Q.l,,I**N(;)N&l'x$%"#R!1" &CaKVeQ"'q<X Z` E   3 c G }  L    l  d 4 Z   5 q   S ! 8 =) 4 !$  + AJ|'<ESBq<>F}FZ`^i{0^jv)E c_ K#}zutui"(>sA\nK[;3^>M,T&j%9DN$E:1L ME6E*[u1t jXD?py@=78 d]r8G2~PTqE?tkvU] u#x%\k&]Zp_>.]!u@z{hEb>#$#$#%.$'%$P%$`%#%N%`%_%v%G%q%%%n%%;%$$$$v$%$E$#/$3#$"#"$!!$!9$ g$x $= $ $ % E%$ g%: s%a g% R% E% %!$!$/!H$!$!# d# # "M l" "!~a!A! & I!z]#f6A w[Xd-,p9j  {i p  g #< 6j?as9 k  { K t $ sT)&Hw)q] P!D8sW, ]SK'O`ReAd%^uPEIacX/߁siLSfߙ߆ߐ:)-NAqa{|>k.` ( 5S^8` ulXnh2px)qSz)t=0vC7Uz3 G,jA1z m3}~cG$'b438ߚ}\Rܷ5t:1>aߍ uD`{ߝSebCK(zl R]# zQy(v?rb?#pVIPR{x? bF]M]-9:>s  ; h A @C2 [wde!*.:^HUjz "!#"%$W&$y'%(&])m'*(*(*).+W)A+) +)*)*)*))j)()'(&(%]'$&#%o"$!|#@"!>V3;X" &_h8 VCl` %5 3  u + u W > < / X X 3 \ u + J r5  ? o< |m Uy z U  ? n "  :UP$4H=BT&'ZzT  * 9    ?R48z,o7,B_j{W/Tabop7+ O|t:B2ix|Ig s/*,%qy)K;:LHhCC8[DO%[gN'Mqu^J4+)yO06|:o)zmK J<]ߞ܇ݺj݇'b-ef~ݭ{Zd~ܯQމ+~+BCknP g`%}hd fsT9Z&GJ.z:w}vi! `j6$wEAo;Y%V|xq~QEX;b-oLM4$  ",s*eIt[i@8ib>h5j>Jh@j6d}UF_PWzt)fU?'9Epl GVo'OHG|/c8y   U  8<H X [j { V| ~eR(mLQS$je$.q{RT~Vg?@ 1HXvyR56ZG2[JU[^o! #Q$ &,"(#*%,~&].'0)s1=*21+3+4w,55,5-5 -5,d5,=5,4O,4,H4,4,3_,3,3}-4K.K4K/4_041>52w53545_555k56#554j544y33221a15100./[-T/,,.%+w.W*;.).H) . )- ).))-R)-)-)W-),*,*/+)*})()0'U(%'#&!o%R$#!K LpjhJLCG, !  V   |MCV^)d3'b .VVq|f?V\5)%Iyeq`aqnzFu];w>-OYr#OkDOBe^~77?*u& 5W\Wvk1jy'Dw|=Fkz9QL 8^/p+ | #RH/Juk` _i}AS{6fIpV v6valUF93JWl<+{z=.A*e=TU No:K& i/5NA--1fT ly9!$=cm)T]?8 ^Bj=mli{G5$t+NFxM?|b3bb2tA  & / [ o  ;% ^  % nk  O } 1 & p Bgt`X@AA8>TG\AS:>!  ! e     h m"42HH8M"qV E]cvxX;;p^`(#{ys:,8fvm/'48a< xd4pod5}z    U f " * W t> q [h5`  U    W  %  x  L  +  V  ? 0 R A s M i W L a " M = p 3  m I  5 p  IU+}.2YN"$. kc  s X I3Fj't#x/3|f?^Q>;>m ,Mp "`@P,L":Lx, * y  m ] U R _ 9 q ~  @  | B    {9+mF"w$C T1K7R|-:?9G[Z-j?~xlb\3BQ,`1jFQ(-x &?X`~i4Qz[$rbkE: H5oi eD++U5'DL+F^YF?&T}V x4:&Wa0sSWP k3ULU<}<Sr!`*h` S=>+  V  E% 0 > Z> D O J ^ U  [ ( X ' | I ! B77^4/rvgS ]uQ|,z5Gpd vY[ '5 iH/d j.PZ%t\b(X &X ",  `*8Y  ,a<G"b4eZZ4+*8hc*lWHv{:j1\ TG<`i ms8t\D.z;Mf<eFt4Tx\P"s\%i K  u  0t 8   r-,Ci ?  ' k j  I f !  K   % @  @ G  S Z  0 '  j   tV {oCm +23TjM/I3vW`YM)<F' Sw=3F1Eza>,WLhk 1 5y   ; 7 S A x  o    3s J 5 w }hNy Q g=   l C^\mCqW)7XN A[    G " 7 L |     %J : 9 4 &> e    \ 5 S + " Q  &  u b VJ [ fOw g J G  x 1 7/ o | >V  '  * ^ L   &C k   * $/?TAMn6r"SHgpBWU_A eV-Wm K 2  v w 6  Q ( & U k e?X'@kP`' af^icL a7`* !! "#%$%# % &!b'Z!(!(")|")"*#[*S#*#*#%+#l+/$+Z$+$,$O,$,$,%!-(%W- %-&%-%-$.$-]$-$-m#3-",+"7,y!+ *)(2)sb('9&%1$$q5#Ij"! K.t:4.((pr_%e?  y3  :  o$7^*0w X;OU ix 0 n    Q U   d   W c9:I+eP*uz.0DFxl4  gX$}v|4.lGzJy|f(<QA2 qkkg7\!9cmA !)""""W"1"hx! 'aj<x2&/ _ | &  p i * Q qmp&~"w5Y 0}T1d#h}Ues]9['6FlR+U| U-HnR+?@A7( v;%KviN|f"cy5 C U g ` ? 0 Tb%2D!zHaH.6 e      } T + ;dO[0 s & s  (m i 4 n O U5How!7+R(EGc_`f? adJ-u*|<Fi =VUSy?S SdF`ic~u3pOWs+e$bN\)!w<O!"#: $ %!=%I!4%p!$j!I$M!#!" !  5\|&Gz,,6v|H[ 8_"L 3;We !I!"M"""5";~"-<"!]! Y a?#],/9{,L'&.&R#ZQX&)piu&BO?<(&r`_FZ* aF   d{  ]   ejt5F`M +<;@5?s.ELg!w }p k \ =   J  A(UcQvkLvJ#w=$*= rM,g*ai~aA~~`!-tU_\e)d!o~(ARFK?3^jnSnQ7> / 4[   3 # ulIu_<4w Z F |0UfUP: xZbP_\LA1^hvISF_F~A8>(?<:ll|M! ':8tE<Zp|53oW(es:Hl#C8kT m7 S#v)TE8j%"qdw b r  `  r 8#[_sq]g.L>  f 3   J biG   U ODoL%~=r}> i E rf b* #7(Zb6+ [C  N'gf&}X A2.d>fpv1^J.: 9 v tfPSkUZt96S :!Mw\6W/trh47#i&;] z{   X ?  .  &.4cyP HLv+,hPT9,K{8PUZDI3*taE5%!4</L.^=~6*|xx3)  F   u <   * E d    ( 9 H} 9C    0 ` GF Q OT m } 4 G f  k  9  J b  ]   )] 0= 8    [s F  `   v O < 9 y3 ,  6 + $ | L   + U )  r D s[~jrQ0?$m|x(c;k*}v!Vc.s`} l;H\jL4 +| JCB"H{j4 _y1ew"2qF>_X`O F11=3q#oLp'8Y%~{+4kYIUXufJsV# >  u]B"kZ.wzlD>& B'E;hI. 8_" E H <  \ $e!\VO0 W T I z  }    s v   9 C q  < a  r ` y d ' = h J  ~  : = & %!B>Mq782%v4XmARt(|#i{Q=OoLYM#NC9<E s ( N N u T [ D 8 "      / k  <  # 8 r Z S s 3 Y  Z0ZgTjkUS1"5;.T.   Z `( O 7 :e 0 1 +L % *a  ] RPv5,B|  _   'd8DFf*$)&:040hK><?P6tGfiS D wFiO1MZoPVUpvMjCYm`fi Xh/g}0jfU@K %\ N )  \z \6r ?ZZP1u*8t%F Z!"# $!%"&#'$(%)'W*( +2)+R*5,X+,I,#-:--&.-.E./.0.T1G/ 2/2/b3?030404 1T5W15n15151G514K1.41_30x2E0a1/;0$/.}.--r,-2+X,)+(*'>*&)&)(%(p$((#'#7'"&!T&o!% s%` $f$u#B#"!>!   mKNWKbW% Di \ *BG_ZFH*@(s1b W:  ! !"J"!#"l$#%O$& % (%)^&*&*'+-(',(,/),),,*-* -5+!-+*-V,A-,b---<.-../F.0q.0.0y.1M. 1-0X-{0,/+/* .O),'+&a*Z%($'"(&!$ x# +"A QrNH3xQ vOi$ b  ` 2 F  xhL:;iwsdL9!e70{7A\V]B#_\WD t12ߙ}ll߆ۣ eݬܣܶڛڞ۪Gvܗ+bێ۸ݮݒcނ*١݋Z' ءu9'ػL`Xڕ/֍=wؼu+LٟxٞټA2Ԋڨ7(Պەܙ׊ܳA 2 ߚ,+emNJ5$H!-:lh0Sp,S2->t |#Y3t]+*uPpT^@ ARV}umqi`D*Q6B@=.Ra : QM 8U M  \Y:Mh+lmX7cLBGEf63 .Ma{pry+@-aZtgt;=e #&adC67At/[ Z g zZ$IUK.HA%|"[-  D D 0 [!!"G"?""",#~## $($ %3 % &!j'"](#m)$* &+'H-C(._)/c*A1c+g2;,3,4-b5.6s.6.6.6.6.6.5].^5.4-3d-2,1,0?,/+/+_.y+-U+a-E+%-L+-x+-+\-,-,N.?-.-/.v0f/91001021 382k323233~3 3322|2120100 //0./,.+-*7-){,(+'+&Q*%)$)$S(B#'n"&!!& 7% Y$W#EI"c'!zm+O{56[J-nz `ebU< 7x A  8    6 7   v &   V 3  a  >K k~c>M8Lz~vUK)H:|m84dz Z1y5@&P@k_:Sj=%hKG9"u,%C?CFL5ehY 9b'{9O2Yow &F>ln|XG~`S8 bh@CdAQl.f}gd~rw<V/2 OP~zgmNUgAW OK8i|K ]O`&h%.f CtA*s* V~"L, QT*OK  - !!L=Hh~X;MO  Tb-C<E+qN_E/Y@v+^ ?!p"K "!#!$""%#%#%#'&>$G&}$%&$&$%$%$>%$$$$$_$$,$$#$#$#$#$#$#p$#P$#*$#####4##"?#4""!w" !!z R! U ^Yc#4w_ $?!h!"$#'$!%%&'c'! ( b)!)["z*#*#+]$)+$+o%*%o*%)%)%7(%'$%#$"<#g!! FT z^h l*Ml6mb  W!!1Z"x"""""Y<"!^! 9* X]4=0|TLY >T 3k;|SIL(*i, b/Yc\y    /i C $; iV;fw}<.=Z>C ZI3t8xTd6;we)xE=T,?5߱(Fޥ!*ݒ#Rܣ%ۧ߉,Zۣ:'ۥ ڍ܍Xc1qٞ.ڜُڻڿۅڟ7۝ܿEBߔD fS=Z2bul_Dk2K70PHr~h<$%2GLU@#<1HU?'~6IPz*2+WP9.DC]`4mC;(3s  1_qjYD3QpKSl  5 r  O} g ? I  ` + O n  s X ^ g 3 L - ` p ) S }  ~ m UZ w4   ~ q P 2   5 ` . wk  Uf  L 'R{ar_Wk/nzhz[E-o ,#&l[=6+ +Y2  %k!-"{"_#* $%!$!+%"%#%3$%$%3%%q%%%%%%%%%%%% &%&%B&*&[&v&&&&!'&r'&''(&P(&n(&~(&p(;&D(%(r%'$)'y$&#%w#R%"$h"#!"T!+" X!T r]fG&[c%jm/ 4Td"l 8^6FfkPa ' k~;bvV6iE  G    e 8   s  K C_  ) r k / K   <X'}-2US|M\+ڑݧ.g~ؐ\ZQ9i.ۨI |ۇٽ,ڄܟh] iVކI߁sWވ Qߠ݁\݊#ݤ`ٖ,Dڑׇ٪k|هDڮ׭GrI:z&ۭIEܽ_-~DݝYݫeݹutjO.޵;YM.L/\&V#1$]v1!3R OY ,(,X U h  R  ]  g ` ( k ( 6 F f : t = A U } I W &   #  .   & 5 v+ *    o o ) O K  LT  I  n " O s V = &    N  rl + + Ky`+C{o1;|~0ZH\zs~=xwQF7HA>[MBA$Q[BY>iX{8gqp@V?߰ވ ]:oݥ۸:ڪD*غ<"ڐٯ>ڱ --݆hSG z=gbSJyCf12~I1V :xn[[[i N)F1antd{Y/L*R{uFu3}92Ns-uSQ\G 0)f.p/,1|vY}:6@ hs \Q6}7Q$`3cz4 2  E J # v  2 ?97  @t : & _ & ! 6o 5=8*b j-;pm%AqT0wF9 k/!^Z"ie#$% '@( S)!`*!D+",i#,#,B$*-w$)-$,h$,0$,#+p#*")^"))!`(A!' &I J&%6%V$8o$($&#7#D#hm#[#5#)##h"B"""'Z"#"'!!#! S 5kA5l=Z'K$3k1 BG>OXck  v 2X   Y>  (_ u   rB R o  C    m7 f ; +  p g M *C /  {  {   L Wj^3+?nM  !n  "  C yc 1    Tq  D wYZ E h         8 S i u R 6   C e 6~   ^ @j:[<WPV+-78+b2G bnEe(-PcZq{6`OJ+HTf7\z s 6Vf-a3'I ݖvܦutEܚڙUېۮy*tcީ޸i߳ߞ#7DWP>+߷ߎpb qbxaR[0)R?( Q+~yLa\gtUvfjF SBJ n_'uc)|uO@Ytqqv`r/%p86&Ke^d n V  X  ; ,  ~  0 o  zwWi`T5%1  6 \ d - * Z Ba X A>   f   f    l R D L jS  M T  PW^)CfqWm4 [ Iq|x'o{kVn 1 t      K   X'M`@Vq%x9`) !uf]``i1{"Uf1 *[XU.zl4$  f C >KZ+ 0 c  u O O V G  9 / %  ^ r   : P Z W yf E u`Q*Z \2!# YVvs `s &~Z.7#3`kEA47=IYUQ89:\7>KE"+Q7> G?DTMZ@RQ~N3l~}fvtW)  y ! P " U ,  J Gn v.EX"n*Xws&m6E,Suw<  8!!! !~ ! !R!!!!"b!R"!" " " "t "o "h "\ "Y "Q "4 =" !!>!m j m# cdi 3e/P$'DS@cdbd)w#\; 8  1 46 ~  ;  t 2o  \ @\gED [H;549)D=Ao@s%keGs? 4 Ut?Fh8l XqXk{B%:   e   y & %  f ~XxIvF? =w]\AZ oh/vx YlyN>pPZ<5 k !  + /U\tBP(-'JD6Na25>O9qQLtD [IapT&gzsRi %$4Nxn e?n^sQ2eY* -nK^ }vHC%}1[v`0ZhUE 7ywl>kp 3 63V(zrb_eqL> [ (KLtog} g      A : `  0 X # k 1 I   +n\#J#TV12GXc_Y:A>7* !'74V|c}!*>k Ez0uL(lA>tZwj o@\_[9g4bBvLXvzRA%\ i !"""#J#"""CA"!!L!! [v 0  um_ % &!Hi!!F!!!!]!"!=  5 -D7i<"H_QCo 9!C]!_'Z'`;$[ o w U  1  U6-V6gM[sW&Q-'l#pI!Mdz? {Zuj3p_?w~M56%VDet UB |pR \] %< +]ju}a3y^ T,"7}sz  [  X'6tnY -T(bL ]-s,'R4x~W)+lU?D}Jn NH+Lab-y]W E\)s  { K   % 5i=4Rd {;nU$E}lo\Ov E+9FrT l< bJr0 xa)XuZD5O;2mD- [I )NW=OqE;T-#P9<:$U{M@'; ;V[-vdmM_)s-`i3/|tt 5|DDPq*#w~1T+I1vKB/OZ}F.ycm[KU6i>[8i& _ &< r,Z`;0;SQp=*wgc\qRsatx PZwi@XCb?{L9]*3 c B  v U l ) W   d %  =   @ :  cD  R S Q   a 4 *] < b'  = ' | L R}d"(=O~Ndp5/P.Z-sp?b}'NLWC    i ? y 0    ]L w : X , -  K (   0J)" }mm%JXF?z,^|T,a24UT5[`h&&z4M^b[`cYWQF@1f0(+28Mr\Fp6c\$v(8W>"^=-2a>3`g Ik 'xFKWsF&. H56,XFH{ jMJ"T1vaC"$#<Vdus Xm%"er߸!jT۵ݥܱSZ٥& 3ىY'ٱ"ڊس`U9בzאݒWժݍ\Z3cRTЇ`Kjдq ѤMܡ ݛݻ6{۷/ݓek#c 'cBKKw0'ROP@s}s7Dp.^f 0H'jH!cVlaFl!|?W Sf<-b\$JO$Yiv*A`|$h?4C|3xJ8vpQ!Pu ;Fe1'`hl& ?TwK0v&VPt0jU?1AV}{es| 5MpnbE /^    i = z0'qA\bE) mA W O  V    P  _LK RWN?sw%{'d    ,U q 1A,aNq^'8 q C ' P FsMo#Nsb,GltWk R sd ? 3 H''4Z5Y ;vz,i _ 5   ` / >   0 8 k "    e +1  o)_%eUZRNOhUWgB%:K13FJk#Co.-m$8GxYDu yk>I $7q?z!f| ߣޝR5&Wޏ | nmnV% Na]HDEy^iph|>t/Yi'=&5N'BvF0!`##j+:cjo.N9AJ=GPXWy^*kdE?GRm5$gU(+ B+oqPuy+ >;"3[{:pfCQt2'U#z_S!A.Iddn6yH ?=Dk>U`- f |   x G   $G  8 P ~|/z#by]Lt[m>"}2!M=f6CJPE[iiU@ mro GF d    Ob 1=  x a9keKKD<Lnah@ cF;Ln[B;m~=ZIdo TI/f"N(He^i a;V t4 o   !kL!x!!=!w!!!!!Q}!m!U!d>!G!O!J!Nj!"s!!!!!;!]^!6! ! / OD t t+tDD h^%>8IxLa4Q|8  !7P!h!u!Fa!%! W L>l(X((bt LJ}dz   % @ G     n [XTH0(i<1! y`?4^!%%iRlj,"ozip[W).VkޮDݛ٘m1XؓO* ׯ֏XC"04iۗ߳"w.//Sv&JsO_ rz%9C|3= $Rq[?o<h7F\"[XC({,\Ut;~#m8eD]`}Z'#$&y\2[@@$"< ,quymF)FeWc;cwoJ m#f45naN%>3Np9H,t?Z^89%}r.(m OYjs%I{)#AwK"( 8q ?  ^   h ( ` N 9    R   Z D  G U21ZSbrS \  ST ' v  .   SQ d m #B t    G% 7&T*T  c5  did8MEDsJ<G$R>5Q n  5O l z ;l -BAiSFOo_lDILFX$ ^.XlNC] mEOt}V,JE#1 `<~ GL>R]w vFuHuBv'uI&sS+WJ*St!Z !jm<:F,>J9Y]I)y`@/t*)o!5qm7zr+ l[kHQciGsvTAD[;1PTmGP581C;n1/L3:w{D%at. &/c` vvDQ0,# n ] ; G "  P  / |  gFs1awwbOufzV: tW   M   S  R  Z _3 /    6 &  A  p + [ . [ R   q  a "  P o c k]     r   c"  \^  p a 8 y|*<E}(0 v$&\OuAM@ "gBU2cTj CY`>l;tR&$@j/m} \C9id,CI?eV:  J j :G 1  : U WB   %   L  ?<r@ }lgyh|($l ^A$dwR*^,.x1x_>,}T[$pp7D$+u4[cS(F=#WjxvOG $%%A Y.tPےtګޭI<ܰצ>֘ڑL`=AC_َIAvڒך7ە$]_ٚ2ۤ>yl۟#u ݵ$.DEI/ݾݻܼܳܚ4s܀~euމߨܴt  /k]tSpyHu*;bICu>D=/~%s^P-1h)V%'X,wk%}E%VBy7r{ t r c w _ Z _ O V5SN H;v#wrkbgacaaOtJ+  s !?"";#x$$${M%I%)%&&M&}&&&&&k.'c'c ' 'x!Z("("6)0#)#.*#*6$4+Z$+U$,4$Y,#,#,#M,o"+!p+ * )'(1';e&Q%X#_?"v vkpb8~8(x  K gan R A : V&;)Kf8+p[M.$OzcG)k R_ߋf$;D#gU~C NhQ%$H] d)7e1KYw%^e> z3aR"%A}=vZr**VC4) nAܐe_TJٷ aFBx0h(#';.;ـR٪cٯzٸٯٶ1T#u{M(4!N܈ۺ޵k'PflhGMW؋(ש$}ؚܘْEڛڑA٘y4܉i/Ckm֐k֩ճYֵ MՈ`Ԅ'Խ"lQBfS/Պ׮99>ٹM5_ۖK/Cݐۜ.ܥ$ SSܵz{v3E V.:f;YBc.>+mf 'iJZr!kSG933Ak}n-s *3! Ww|7y\PBF=6),~ e@ `N~9 }{F 2:/U1]|C5iN>.Kc9>$K1 1qh_ Lo!MH6PP#Y7IRBgmu^h{> Y(I} "2 4pwu4/??0m#> Z?:FxiW^8CGI*=p|/pS/d"pCGRem G U S K * lGv._# ek   1 0 g : 2  X  YT N|UE{X~1U>l2Lx1RLu%lCn,@?$=c[vcqV `zFQ!Qib]Ou HD]#GGrt%DL0!MtZ(TLp||R:8%\O;|^zE   |  : , G   G  { H '< _ G ;] <" = <~ MMPF) T Y [   O  r' &>s!yt>>:5Hqni0Q#m9W$ |>xlW^VH!|u5 b,+ MK56dJWcU| "PQaz#x7m9R"F<(/d(C\Js`-:JU(0.0CEjE\"te\xDZ0Ae(lr]> 8 x ) x w  \ -G = L/  ZJB5$8 wQi `,6Ocxm/OULZ&Rtgv*RtV$|9h>m6PmE3` %)lp== S  ~ f c j q p L (>   Wf30}dCw | g 2c 8 d t   7  l  .<@24Ae[#-60a(Ri_eTe+|YJ '47Fo,Q9 -&(%~d ZGNmT; xr9 ^l p8%Lk"}`P:.vjf)> !`sNF-$RF3D Ex Y H T : X x 8   S t 4+rC8@'fTYEXc%&1)4#`?l'sR\[Fm=O5OT*/.m a dy  _ D  ;  Q  Q GDQ8@*}`S-bQn],'> xPf,+bJdJ(&2dFD H<.0 V ~   R  N Q   PE ih s o d ^ I. 1V (i   x i 2U M; ^? 8 > m   K6We jziWA)4.g1d  9 y <8}|flK : I t 2  # PX w _   @ v  t z rO :ql?& >  S FA v _t 4   >(   |   O!S7%>rx\(bD]DR|1%[?);dUWTp6w\8;"tk5cci__cp'wRv2(Y<1V)pj/JEM- Ko#63h-F)gT#MwlcE QmR_Uj]>~U2 d QNBbM~]]1m-bZwF߈9߷ݔSyܻ݃>ix ߣ-h44KVjsuރYބݬXݻ4g<ݢ}kt{jkECT6Zn >13MgP]D"Wy&<0d?^{U ' o(r"l# Fs%qe\7#DCQj^L`ow?'@b$yyqek[;%!Ldt(l*pC! a<@UTEMKPI#@PM&=s\rq$iCO(Vj_#-7'D3z0}jRY)%s1fbO;;%1SzX pp a?TXFm.xDGtht/--hwD^oc  k u $ S - ;5aFtG k/'  / P U + 4  y  t  0s4'"uFny   U m a w 2 b  |  | " E )C[*x ;dl8V ":FJKio;dt@a/ sYE:~ B&i!!6kV:{~q}x?U4!MQ 18(TH*!8Vc PT qsi[9RiR)InhbX   $  ` -r Y)\ "HV)~>FrX@%+f+OX]=PG4- '?7eIn[wcap8`%h8@#&&SWG%4oq mT;--gE1oR5Scm0l$q] Aw+Q__Q=`aT^aciL(c&~CN;N{j SfZt?}U LqU-\KahG&kh !rW"l>q?  ! O ?  O < ZI_4d*F`vQ 4*U5%=a{ 3-cl6JK=#u<~9{}xWZYr;CO)Cd)y'Utz|ljLWUY`?*Qhe@^jaTe  >  0  _ lBT[6$t*lrN&UljX&k}Ex`| fc` g   | b  ] ] H < 2 2 $ [  )   p` |   F [lcGY~3q]:%cC*mhBC!4iq!)Oa|%:d%u>H@GBSc=yg6{8@et=;K`$bp1>Z!9shP~8~S~v]M\N K C W;  = g= 3  [ &  = K l ~ d S ]  ^ J  o  4 n M d  vX    x  w  R A  k  OD MCO{@:jsNBTGb 7 0z0>vpQpUKmV1y%a\I!&ZrM<}(VSm`F=iIs2&ZH     2   ?}/9j5=9&k V\22lbL q?oB/01"u/"   ]RRC%GW`%.$x;W H}n+,rCw&<4`&P#rGy]'cs3?2V~OR3d.Ms,SuBo a x}W+%0h ).+-J):K\ P-GiUl%Jd,W 0h2;\W}Wp %N<<1r&>3|T>}eH]:qr~Y8h| 2 B-G:U^&ivxQLeqmWGVzU| 6QI*3q1\mq9,Q9&-W5'f5 N>N2l4 GwyOF Q U n e c4wzmQT )o     { 'rPAoz3;c   k j  q a  rR  ` @  6 T Q W 2    Q u a d m j F  Y2   Y*IF,S;V5L^n J:TApH _--4IGz`Ki P:but^G**=8b/'0"=Ws   - I TM N ?2   d X  t E*k:.uL)dU"i& mn^D=RT fZsi/b$l$/m~ ( O[ x|   5  K f s | L  < >@MM3K]YET)nHFMgJh(?"v0*Jlpqa,M_oL ] p *7 q  N+ K Jg  2`M8&n5&8W[ \/L l@ M / c %Du&6oBV?~lq)b:z  Z \ )    O   S 8   a" F HaZehWt]j0J+2J a_KJ='% Ji)JhA_){kkk#hj#;,H-sX3Qjj$ pJ x  ) E G ' : n 7 '  @  x Z   M   hZ  9 % +   [  y Ek  H   - <V,gzp!d]Z;pnkd3Q)a u#Lfz}h%`M%vO~ y!7):ner R)$Wx;X9q3D !*?yr25JwBCN5"!)0Cg v5.DB'eE"V+OW$H`1PIqSt5`Z2'-MBZ|f F \|E{Zk/vlB!/(BO\lis};?3)e7^>y@iv;r W2*_:u)_`(% X|8^,k9CUW"`G?33,*D/\$:#}KjJ Il A & z  0,[Ojo][4qqJ>\1n: P y n   3  VeF4u  < !   5 yYxgD ~ e  lT  -Ty { h bY.C!"x+D(Y03$1  _K  `8   +  9;S+!( M l ,  & 6  B.^a<. FH @ A 4 K  8~EF,  `      _ L yLADZ()Cw;$< I -   y-Bm" f f o 1 ]  mr%<D$i0VG6wE3-s6eC%03\g(R[(W{):*g( Gl.A +#dw4|`L9߇ލݨQZq&ٷM'zp0P~ճF=ӅKیMXҸ(&џS<^؀M9nӟ٨(-8C<ڨ?۶%88PY]bgރ%:e5!?2=] aU3Em &;V};n>@4!AJ:wvr#^(w/}JM'ux_bvKEBG7oe k^ Rz b  y o:o'a.w_+ow@) F 1 5 ] g  8   ? N / p $ { ,  U s]hMZ^G)X 7 D Jf t    Y H F * * G f 2_dyv9uRq d?m!CP=s5Y\wg- ! ""$$$\%&O&b(')'*+'$,',x' -&,&,1%+($+#*"(!'X &%?$T$##8~#p##4 # # $!$/!3$_!&$y!$!$!#!#7"#"#"Z#B#;##'#$#$"$"%%"]%"v%"`%"%%"$a"j$"#!+#_!v" !@ 5 t3w5!8P7qH9y|7#Dgk$x=4x A/ o|   T!J!}!z!!h!! }!Yj!H!  yl  Y)0ENW1 `?tIAz  a ' O  " > H   g 7 A t  { R b G@{9w1co p )  X  K  &Ari _\c~0b;lO x;Ppgmh[dnVAH/p| L6T_#g~bS{o#EX?bq+}ES#%A^h`k[89ZIo9-S.e#Nu[CDw1e0( v!gGia$ xt)jYI*jJ{} tA'Dh h4w,<0}MmJ X$?{./@3fV:v5BzeCu)5nRP BB\L|Mhjl1uA$%FU"]+YU b[rT2*_.jSSOvL& A=H-V {AS IpUi|~]P!tS%,!W%}pY$_Wbqv?PV'@xMQ_WVIc7FyE3 p F W   jn H p Ds G&f7Ji3Fk 9- p <  ;   S:G   o P 5 )I%{Ol pO  BY~gVX0-R Mh7. ߒq85݃IۭuF #)\@H,TMwbv؇zTr1٪G4elߏ޾v5ۨݍQqܬܬ܍܏ ݍݔ&ݴܖ S1 dۇݙ۹݈݁#ގTۙ0Sp޼߿uCD9`c~B&y5"_ߊ!n VG0"$Z>r~cRbe\ KDߜRM^ߚ@`NIa}z~7:c/T6J`"v)!d"4"yV###df#+,#"ve"!s!<! * W(;hIgx61 IZOg0U3hJ A \ i   ?WkKBa\F(f~%R,QhKB*xqNT5HX2RsMenw@ }=  > k b V $  *Ftl[P@ X 6.   e   H > E U5  t  S   -K fs~tmL*VAA{r}{`hH& j2kDK0uI'Mg4m| YGAr5 $4uP4( ;koK -6@6> @v#B0"22IߵNޣݳ ݲ|zdWM3 cOFs D=oO5*zAzduH#`g>[Mw޵lPLT߃b%ei0k/ h4;]L(۪Uܺۼׯ֤#֦MՔ W$p]uаU|1J΍ /`ZԱk.֏ЏmX`.O MGվ%փ6ݷ?1޺nٛBٚ[tW6P8٧ I ZܛKmک1ޕ>܈DRޭ~ZBW&-[fy."m`6t;@,X8nt%\wJ#7et)Pc&3|G%27~pEla?3qr hSpA>E?v A^^(kl&`3;A"Uo]Ntpk(D1 9MCm9T&z^M=\d3eFU7;gNI an \$a Vh_n>Ki2xt^GxOzf{|nwkQkE$'x@V5,D)O9d!si0uUi:1};-aoQp(rAJjcnOVYAfUz0;ަ%ݴc3 waJ߲r-p4?llR"Y]sAD?IATI^GZ\K ep9u 'p' <&BSKnv"/ImO"n^uCm(5;x߱v/t߷޷/ޱ2OܴߚiܓL5b/*A5R@9}_ݨ$ޜdߨޒ ߸_,>H߽1ߔ0ߢߎޕ޷ܽܺܪ)ݴ_ޢ a\[nuc?^ WX_TW="#K#1[*| (yaDdfr}&4a|A*P x3kkyn0lZBQ/#eGb7P+E*<F:`tnCL6B7rQ=Y߸ߺyߨ^ߗ\߫߰B4 *DYq(DBg ,8 H >TM*L ?4#%S|ZlR6f~M, x.IdS=da6GF r]#i~BSC.X,%^cQ]  @  B  ,   x 4 { U O n  )g? Uc 9  Z " D m0 V     ^ z vC % o  B } + i I % `} Yh?-EMeK   ]S D( . % 0     y  C C   3      R 7 3  4   S @ V@ = 4!Y; B  g m 8 8  Bv W j 0 q ( % x^qDn#<(Ph~U~I! s{)/NZ*v`&ߠj=Rޜ@";ܹ[wwcյg؆pF҃Aם[MѼ9ќ={/N дCՀаԢE~|ΩAЮ[1Qs 546#O}rΤv ˖ 7̦[y|,˕ʋ[S 'ҾыɫѓɎwjѤʑkh҃͜6вәKԘj qOءֈ ޲րޢޢ(߾e֡Ya_vuk\m`pTD cX!o"v#J $ %!n&"?'"'#i(d#(# )$0)J$D)$@)$!)3%(%(%(N&a(&1(&'H''k''p'v'_'I'"'%'&&+&&%&$&#&#&Q"&!&!p& &z d&k F&k "& % %-!%!j$!#""D"!;" #"!!3! ) +3/,f|pR&ddN}6y=Ar \H;0wq<tzl] j48={o4<S l J e  e   a 8     sT>[yV/pmM-UIVB*N4u:"xq &5wv1Lz%nzM" zQ!uae^|_$0OpYT[1ޫݬݪdܜv>i' U;ӧN"ҡw|ӘӺ6CJ(2:D<ҍ+3ѫnўlц{юц9ҷҚdҒғ=ӒӏDe!Ֆh٢ٮ٤ixUY3זhxUUS^iԦ֧դha&َ$׋j'ؽ܆ rqڙڕ۞Uۂݏ{ݫrzܞ 4 , %   r @1~a  Owb\. gH   ,!3[!R!!!"e8"M"^"j" c" V"P"4"s"& ""[#"@"X"Q{""""#"""-"!| h2 &7MfQFG0BK)sT -cFOUD8 Yuv(B,}H7 zIAH'bj F~N A  h R M bi    e[ ?  # F GX 4  M 1 ?  I & ^ 7GsSz JFJ{4PQ wR=x'rG'3l!X<`r~|<۾c&{8)Ӱҽ#IؙH8YVlӑ̉8̩˻|΍Fʬ*,iP¼ĺ55hâEÍ0×J~ W(ıC‘[oaI±Ʊ*ƃͿu%nJĂͻ",I·vkO_kDԽceV8WmŀǯĝFn :ʡǧ˧H̜̾ʜ.^ϵ.p҂L?Ҕfڳ@ֶ۾@0נ܍*bؠܡq:Nܦ.5ڄ܁Lܣ:t7a7}d(4&&z 1D":|Z<lj"D4@NV:{ 3r.GLXQ],5]9w gA+n5{P 8" O z       mI"%Vl#+a~9Tx(|%"*B |z5#3P L!]"u c$Y!%-"&"'4#(#L)#)~#)W#)#j)"(<"a(!'_!& & <%J u$##lm"'!p!!^    F  A!!%"q"o_#T$W$]G%g%kL&&&&&d&^&C%^%6$#B # E" p!.! C!-! 3  $y-p  yES-6\ . !-!%f!!!!P!| !9 x 5  nqK o  e!LA"E #%# $ %|!|&"r'y"@(" )")#q*" +"+"+"?,"y,",#,H#,#i,#,$+H$+h$^*x${)b$j(#$<'#%#P$5""! 1h0=]vA=R!}<)_ m&  #  #f 3yyZb7ge't='Reeo7e"{ݵ(l&ؤtWja xܪrTՌL;M+2ՕsZـ" ؑӅN҆אbԪm̕\̄p͏x?ˣR#˼PˠɹB*̔ʣ2˄_ϒSU1)ҭ^_ Ԓu#կ">OӄzԚ@ջ'&hRה=7oَ+ݝ"cu%~dn4R[?-YqqDܨQ޼1fی2 ^!@ۖ~B* ۀ,LQۙ~KܙhBd߼ݦ*ߧ4-߉/4Y{ gm$YBIKrܷ[*܂ -ܜF`ݚX gxݱ!޼޻ߒCx Oa6(''$ *^,|A_JuPgXQR 9$)ep=^+[&i@8[* [  ; h x 9 f   I    t8 O2   _6  k rJjD/xGK+PW#3W U ,Ik`7ImB6 nUOLprh Pc:E#}=0 P ~Szf@" 5Bkf?xO7[Bo_*;o|Jcwk6 ) .   % j xE JI ] r    ^ y  p D   4 B %   $  6 ._X79emOzFXx=uYMaCC465*]# 7Ut|FxN!3Do7p&RCS!<=25*x/Chz 0~Wr{ߧo I *G8T h߰|AyCl,,ބݳw, AaT݇eܪa^XX=OWFJ՟IԶ`x УAjPШ͵89px,/ͬ? Fǥ/$Ϭȹ=yU@.VomԷ|Хoѥ׶ҴӔQڬFN׃ۣz۴Uۗqڑ־غؒf%$OԼΆәҭs dGE˾gm.jv@֯i ѹTګhկ?Uj<ٰ9ڟ"ۭۢYPܹ P7ܾF܋%ܰynKPj 0)&VqgBE}!j?.;$v$-OLd34WT=kU7fR(<"993*1_ZB/+T1Qy:.Tg`;Ssu &2  y  > ( s  D 9  .Qp> v     p R  ( o b g 8  ?*`*4Jdg$FOUvwkWQub#g])oF}xvT5tI9T=2bW17J?W/pSM:Wd}M Z`+pFq gQ _ q 6w?j]bY&wq*BR=L-Xa7{.>?:-BsJo;~Hc&r1!DHCI${_kT3@&% *I]c%(^:A VN/K 4eUwny9gwXA'@Gdvztf:v_'}*7k V9}n@;n8:6sW) 2wR b/ 2`:cE` 3,# [o[/E`|eF5*}+#Up4li]}']t2}taswH;X=QA66.y9}m`4M:XJ,;*OY  w  -`':9 W! <  , /l pS  6m A H  S u  ahbZyn =B(}#)W(dxLW}}"e4>` ]W BI}1xi  U A Ks Q L N: 6 U  T z  9 P^ X T &] 5   VA   O h 1^   * _ 8A+z xln/ x ?  C    V {      ` "^  vf   ( ()0' .6 e Y  u   eZ I4DsS~+ <1d}!Xsr7qc {6Wa+e=)/_oP9AZw%w5X@#a`QV+AY`+^Mpg>8 ay#Ja3= Q*7NG1$bS~R0=$L)9MoF a3Ztiqu zqE WcZjj<H Yz 84n d[_p@OywaISpmG7zr(Tyb8|7=>Rlm8'QG@VD<>Z|zL4 aX7wK~^?%.TwA_e!|)%a e(      /  <  ^C[l|OT/2?P j   N  Q u & '  M  W " U Q  / t  _S  W   ; *U^    j  @ f" [ -  S D W!  { =    4 b 9T/v !+x 4} '>h&-3d3/\#YM(J?5kRRB;X2_n5@b;?rs7pb,x&]   !!s !  v 7 ;  t3F528t / t  N 1\&~6 <5 W'sR)vhX%q.K}$'Fc ;w_^,jdm?z"Zg (G}|1Fo~ =gV])yZ X.)$9hEYT"c^="tG8u$u' Q9r0 @R6-p0IaRoEq[+7XJER:9R:dFTH\xeOoX nVmSqhkNA f0cK*+U@`@ 5=\c*WEEbcq'|JR?YK%?=1DK^cqL ,!Z!"`##^$;$($#z#" F"%!@ N JvRSz[+IKD,)i?|h [ 5dG-Bsr.wt/h0o!N[(M\]DFr"u>C81 R34t7e N'  Z M 6 WGr>9Cq_QHgb2   g+  ! p  5 k m 8VrQJ;D_gf#VQnBNmDblpR8$NoQvO@5rGDfu=f*KPH:A~_hR=k3JBUi]!?nLzL\\V;@{}xOc'9_{_r6~sa+s_YI dc> 6opKM.e{>guj567|~({OJ`8/gHYQ%ur=W `-j&!yuo&j_Ob[.qwaWvI0;5 " T:`/4S?/CS +/uiZ4 o xTP3RD\~qWZ>c| 8yK|\nHht yl f t c j8 e6 U 3 %>   O :}]!p(ND $OI.u6M['  @ 5 #  C  w  { X 9   O  & 2 F \ e L . k  e 5   K > q[/fk\/B6T/qa$tW,F#Y 9@mJvP +z.H wq 0Ao%^;.J KSO?;+$jZ"1Z qj=Hz+JdA\5`Pn4OV>C%fVN5Y{4w;ZwM\ypymEZK5r?[C19?,30Rnhz_}I *t4:w.Gj29otMCU,lJ)lty_֓I:9߳R߄]ڹچߌG .T}J;}ݱ8ާڗۘߖ;<~ފJQsY7#a2C'iAUlC"qQit iFAr9s>'O"L)l los>aZIGxi++2U_^R{Ve! i8 (l     !X ) (wn:W r5* Q  { R (  k W6R`G<xzK!K|\D0 L.6/F  o ' fd 5    e_NE@& \vQQX`-.-N[zXMj RY Ur_H=RBR:[O :`%g/Ju9%}f7uCk@n/K_&v)=XV?0L MP-jS]8$,IG(j?VKnD]@;ZZ>B~61z#RvQ?jSG! r  C  fB :  @  &+;hJQ+0aed U  F gM@6%H ku$"yS %U{x]x1]PtIWmQ[==tL9XA?\,HmKze# X%x(tFK48:1Ezo2`ah\H#-#Kz"*;@KGZp`jP}ra)FS:'zn>71~+_>}F 4u$P Gv# s s 1 : eL  J R F t 5  -  Q  9 <ObBG/'hW}zIg*r|?lmz^v1vRn&4:">SdEs,tt9Dt[}(Z M Q + t . h    > R  ' $ 3 T 0 >OSv\q6%&aK@l(htTDr$uFR /FTzM>>Q^G !"' #!7$"$# %$4%8%8%w%%l%$%n$$##j##""(" !y! 2 T*%iC@%:"=<SV;cppM^d7}6C S$[ o      f2 s 1'A |= # 2 4 el-v!" CitDl* w^Ef%saC, HxEap4`fU&FgoR)Xe6ed2boP[S^KAY4#)8]:F2RTyc6L<>^:R D#'&r1EslQ f5H &C>8"X1PW}Dicu3sJIQl]߯.ݜ&IdS5e٭Hٙ|&w$]C,٠;goSh4~؟XK^ؕ}|ߢs؀؞?߄=BUV':WH:~s0:yr+q,^,?!JJ(w   Y s9   @xKS=G{% !" b#F!#!d$S"~$"$#n$,#%$b##m#f##"#"m##"K#! #_!",!Z" ! n! + y   + d  h b1 N gl&'K7MHE9 Z/ < ,W  h A  w J6 )@ $+B'j ) 3i }  `  5 J'b^qjU`Y3rSBkh\jW0d3( D DZE6>zHidVWfhS*]" 6Q e z   + \   <  A6 R yJ  ipcq.K|Y(2c* &   g <7i.$O4uvym_yl=."gnfTza 6y0%Liߒߘ)%݇vF.۴ی(ٶVCػ.p٦ױn$ؖ)׹.h ԓ>ӷӗӃ:ԊՙԴ~Վ#%׽^ڵ?Lx٬R޸/_/ۚ0/iS:Jx!>1lpOt6pd^JJ4 M*2z,X]t#{ Oz0|{* =%AXE/8{V-$TF9]n)w3=l?<ttE CjfsKMgr7) H  N Q '  o O &M H & T41nN%<L+u49nu0YfQ8*FXg]33x(I.y4? |(   !y"p"# 0$!$u"b%d#%$$4&$Z&c%l&%C&%%&%%%%r$K%#$#$B"a#!" ! 6j#r?%\,G` k8!":"#@$M $} &% R% l%!p%!<%$!%(!$!+$ # C# "k U". "!!k!r!{!! !] ! ."`!L"!]"~"M" #6"#!#!$!$ ##0#N"~!!J ;v IeLd`'k A 59M;  (ZWXhN]+^38cXjXv>}{ Xp   O8 & q h 6 # 6  YAQH9i{YAda61 a.tNJ:Rnn/.p}~y7o/;Y(\vEM(t~mBޚ)ܔE^ى#ؾ4} &@Zڳe#ګH5sϿK3}MаPQCоKИ5m2(&FoдڳЮڨ=fҷrju&֔Ah#uWwigS@i݆(k]<ߤ./+ :"CG~s^a@lsYpcMAQD*  / = {  T0on}* 4b ",!$9"&2#e(#)l$a+$,$y-$C.$.$./$/$/$/$0$X0<%0% 1&w1h'2s(2).3*3+Q4,4-H5.5`/5/6 06)05/5/U5.4 .o4F-3A,13!+y2*1(1'O0&/%.%%.$-$,#,#,#+~#+#:+# +#*#|*#%*}#)5#b)"("M(Y"'"'!y&!%z!K%g!$z!m$!$!#E"#"#####!$#$3$%h$%$%$<&%&%&'%& %&$&$&$&^$&*$&$&$&.$&h$&$'_%;'&'&''$((r(*(+(+(,(M-r(-(-'-&-E&O,|%M+$*#(#U'Q"%!$>!F# C" z! 1! ! " !"!.#,"#"H$J#$#0%D$%$%$>&$a&$&E$&#&#&$#&"&t"&-"&!&!&!&!d&!5&!&!%!%!2%!$!K$h!# !$# y"!E ~! =iH]8iMLUI]|DV 7HO7*.}|;Wd^H#U,    N y (   /q')]\} ?y(Ql''2hneWWh% .e>UCR[i|+T17b u>5ۜߤZޑ,ݫ?V֦م(C3ր$W/<;"Q w׏ױ֟f"$jֺת yֆJ/A$֝"Jwٸ{Nىnؾ׶&;!xײ Ӕצ\@%2=֌אdQ*կ֟ׯ"Y8ۢ'3E7/XMn8~DܬjۿbrX9Op~۲ۼuXDUbmAeqXE!0g%VmNPw;.K.Z%bswyzhM`.! :Mb-#XrBcr:}B}}>n 7sO J  ZW ~ s  f  P ! - h % D  V>-Wnm8*"3/On(t{ix&%u f|;pFkpeJUo" hc`P|hZ9;z gm'P.G]*> ;?6STzD; v Usz `(-&'(?){Y #w9N"oC+.AaN)f-CD=)2l%c|A`!O=1C/V\^$p)F3D>%<E  E  a L (7 v  j   2  b N r6/jZ]_ sMq%)F9\:sjy6d&J.cZ DedTT/apxI0 \߳-< 51f=ݹWړ`ڥ_n56VfcӬ`҃FI)όָ6~J`DQ]~dž7(ͻm8)-!ŭ>RaɁ ɓɭ*ɡ<ɋFY])M5Y ûIy"(¸Ǣp&Ǔ%̿ǝOljǹp"R˩}1k@x?ϑ2й ɐBAqӢj"Ϩ[V֫ &ԝYՃف_ڞUۨVܨIݒGwBFV_{ޕn߲V"<+~*Dbc| U 9Gfk0:ji1Oglw6|^ +W G `    + * I  L n @   W   6| QS DF 9: X   QE^^qH[Ah$BbcKxKnGZXP*d !|I!O!!" D};l >uW6< Tc%0GayE8B07+y\%80e| R 5  . 'l q P/M s V  P E s r : 0 3 / m  ! J   c b 3 O \ ' W = =   s { K _    Uy %S 5 '  @ u3 B z a  Y V "  $PW~>cZ 6 ` [  ^q;AO ;{VS-MuF1 U 7C Em ]  %H!iG ^$~v\<GK"^y|?NY(w{Hs#]}#u?INrKB&19GF~.y~EulqVO;+ `+ .P *cKhcV1DP7JvF*u0_\JD!DD I8?aozPmC~1 y.4u(l)@NDSQ2a mSS:-*NUM~1`/9[B2{gBP2ISFc[  ] - = Z    W   OK0 Rn$!iU.]  )Z!I!d"Y""""z"bN"""!!~!$ ! !!"H"""1##$$$S%%&'&=(L'i)'*6(+(~,(H-(-(0.(M.(7.B(-'-',?'>,&+&*(&*%|)%(^%|(%)($'$'w$'F$'#'#(]# (#'"'+"'!('B!& 5&O %$>$W#5(#" S"" "C"R%"{a"x"#cQ#=###D$#]#%#"!'!E `vHAJOcw|>4=|b[Y|:N%KJj[UR=UXc]c +mAY/>c y'Zkt9YTV|9.uW>5))-5C,FM L[4yy<[9O;I7   P T   HDQY7?<tPL7s -6@n'h=cI CQbq&lh%E-:QWxmcZ.mD1R:ނ޾\Kߌ@AyQMW;?E7N9*C]r [>t_}AVpPf!v0upldjAp*_m[^3)`U_F[Q3Gf{wc\P*Mh% l) G  n  M d . ] f d * V } NL *   H |. W   " a   FQ>!G9_E1U 9  a    !P~7cnqS$mHy  a$  Xl & l 9   7  ^  bu-#6hy+|F\*bt1zZ|P,zR1D.|.'$w 0Jl"b>R$Sl 6$n13 [ j   ^T C7 :U u  W 9  T +/CJ[;..` o9{- yn   7 K p ~ | ZM~lWx_yG2F2+t$   W$=6Qc* y+]X{"g}91DO]BT9~*f#A|FFb4&SZ I&(a9Y 2MoCZS e^FM'>YntoCZ)q*<Q?F3=_`<I]M A<Fx G!/\ Ux7KBt=Uo8*k] ]8bV]Cl!{-P,>vq]RqIt(CSL$sJJ}gL:n5:09kE)nxbMeT@1I(|,-*   q A  B^zgOU=fopb:SJJ5v@sIcl# d+b"Oj 2_(eX j I T 06  |& H,L!.QgrP$F!K(lW+wy{X W?SH&Sji`Uli.`MBi%otNhZ[?GMMXk$8PRA ^   {  T $ V qf h c D .   K   c ( & _ - ~ U~( [ @  c   b  q & 1 P i 1x FtL!v*sA5 a7q|uxSE%L ;B1z/9R5YTtR-X6ffW*oVv8uW}VRV 9[ 5a 9L 2 8 # a  : %aDnX|3(r13Po64w9R + !0!DH!jF!)! !  N  Je::?Fha !z!"1"#"$#7%^$%%%%&H&%&%'H%O'$f')$L'q#&"&!% :% a$$a#NQ"l0!&cFz3#m@<M$|t   r e $G67@ _   *   TT!) <El   ,  6     R2 w \   &g[NVt^A9sR)Smno*M3KF3IUe,\/"oW i/l>) @Zxjy2l}kngmDkj{@9w#} Q  t72VeXAbZM B k 0  C 1 p g :  }     ! '  t0wK[&a7 3"a O`.}>Hp@Q*!o7MMFISrN$-N;_{G[!t&rKYlWJZ(BtI8nYoqM'1M)v26~3g90n<.V"m   " Xdhq'H.@)} K(sI\>Hd:^}1A! _j M k   - Y XnXx\uL&y|-YJN60 1e9rUYWC?6I}Nasax\0s/1$^kt#vq|F>'"]|^;t& ~ . ; G7 80 1R   ifV {o){/  !.!c"'# #!$##%a$&%''(I())**b++6,,,--`.&.../. 0//r0Z/0e/1I/Z1/1.1e.1-1O-1,i1+1 +0(*/_):/(J.'T-&/,G& +%)1%w($:'l$%,$$$7##"# #~#`##"W"D"L!c! W 6'Vo 7Bnv  G7gj g9$ G) T e R i f  o . v5@^|o00]7]r#W0l l 8 H ! n [  y U   } !   ja MI !     E! w> P 9 l B i \ $ Q A  m w \ ` I M?lLU{SPnbHMX!p"RQj tweB(+~Jk'POZnsSLKAMc`em\g\IBe\wVL;c^ Q{aqlJ@Nqd#.tt6vQE|](c/TwkCr<WD"'M  F} %p>%+%vB, &#+X 4M Z\6/C{\{MdlMJ'   \  ` 3  # Oa h fE :0fRfGmoF\;o<o  5 9c'$rLttzJ" rT f U 9  SO`c8^4k0k7Q%f>#)Bm W`Ws8dP;_rs[D1lX3   N!z!q!w!e!1! 8 Do ) ?f7YBQ&O$@  Hh!! "H!"!X#_"#"#"#"t#{"#""~! " m! d,j#QZ("O/}Kje'  k!k! !I!Z!`!e1!H  Ue,K!esgK-*Dn*6G*Xa n3HDh$z [ T s  , } 6 b  >F  h v  La  | X7  ; . m  f   .BLs(  + gp o 2E @ 3 4 D >C{18f#?#Hb 5};{4O%QWQ: "tFCE0A^V(-Kg-@SV:|G ~]1j$c][yQgrEp\~?Ff1X#fm/ 4CE=,/@mx#Su*j)3lnVt4JbI-h 1aZt48ZfWujaqM?<IPjA, ^y  I 4  9  ,! )  re5>N+Z%P/B_, 'CT^g\L~<^w&Z4x#9TEm39gQZ"Q 9 I G :  ~3]W;6r@e|9V/Rxj v] \ (n [ "  2 fc * V & \ C  / `t 8  ~  F & es  -w!5ZSH g>a@%kV3TYx\@;i 0%G kwoUqTVx6SrB8<a~yzv9A,~n@2Az9km%,  #*5/^).J5kwX_ Ww80*|{iOI&vUFa{pR% 1_@& uNVo&`L#;>_*T/%'%?bMftvrc[0r=IWXC%},meFlm~^? 6)>>e|~9qB$.@nSA#56jPY  [R9e9TJD="lq"G3Ko[w@ZV'd o q + l x A  o qO 3 ) 7 ]`   J 8 VV ^ yrKn@z ^S |+g5 1j;tF p a J (q \ > 7 7 C< p , ! !]!"O""C#E#($#%$%.%&%$'"&'~&'&'&''''''& ';&'%&*%&$&N$&#&#+'#V'#'# ($({$) %)%@*O&*'+',(,n)--*z-*-k+-+-H,-,-,6-,,[,_,++v+]+**"*=*n))( )'(& ( &':%"'q$&#F&#%]"%!v%?!+% $F $Y$J$~#f">"rm! Al>[&[F,j(/4jg`.p_@ Cn    _   R   f   Pq >[<2ft RBbk!}%)>BB U , ( x P , A. g e G%VgH 9PVje2H J!o "". # S$! %v!%!e&"' #'#'$T($(,%(%(&)&2)'N)'y)()(*t)f*D**/++&,h,4-R-W.O.y/}/0011233I44{5f56 67686Q97:7:6;6u;D6;5;-5<4$<3/< 35<=2"<1$<0"!k$w o 7   ; 6 (  "< B<@<+IsuaN [ t^ ; )    L  m T  6 Mz o ~ 6 ; ~ ,FFr*\2LK!!B\e Cs5ugZ"NuRNKW7$LZ:)ޅ"K܁ڥ6ڜ6tliګ]_5Mf4ڌڤ۾َo^uؒ 6\ً֣\֣/@ӄoЕ:ЦJ(ϲ[PηͶΏͬn͓c͛rͨ΂͞Μ͘͠Ο@Θ΀ΘΩTϟSϿ+3rЭБ =U=ҞԶpY6 ԫװSرٸw3Dܪ?eT5߸;ߓ ]8~S"?ޛ{W2!ߪߠ߮? 3O[߂q7<5dmeP\p6Dg>WߤeE)ߥܾ_ܢ۟.۱ٵ>MאيXaCQA\Wّז\څU<۷r%ݑڙ U}ެC2r3߫.ߴܣ޿\ްޯݕܼ݀ܔ݄܌ݓ܎ݳܫ'QyޖV`U'n*J$Qqq#YmnE6`h'r,'c[[aRGhz(YV5~r 7Of]  ?  }a | n y  }~ x, ?GGZA 'n!+""H" #."e""_"""K"*"" #E # !$!%"&#'$(%z)&:*$'*'+'-+'*j'*&)*& )P% (F$&$#%!m$ &#u!6 "|[ Q T:@cWivqN<VvB9  C  9 u 1  5V  Y  G buw$s`\*>[m -E^|v4eK6.*cvos/u sXtg"tnRdFknhMn0M 5'&\!J?w9wK\^T&#X(28HOVHwA:gh\-"LziWVP:m ng=;gr:yvC&h@sI@<;3B8!CrooD#bvr^i * 9 (l  ( 31 6 ( -P7U.  z. ' 7 @ u T    >   ~ W ),  '   `  B  [ kEP.<q h>6#}TXQuDA-x-),4g9MlLH   DI!!n^""&#Ui#|######[###f##e#$K$M $!$!m%g"%#F&w#&#'?$s'$'$'x$'W$'#'#h' #'"&!6&;!% +%$@#\#""<t! 2 g?!NuInZ6, G'- h  A L a 3 ]8g~ L rD>|2vlcj XF!W^E;&2" N|F 0ieXh#G&0<BJ>8XdAp1PC E#8;lmCO"|o'h88`6)^^v%gqU@ 6kiLaE>W=yO#'e5IkPQ9a Ya[~3mizaP&{ExQo$V6%p= iR Y . RR"I{0zGaG>29 V q [ U ` 4 y +   g b fw G "`  *14/Di7qt&CY? s5?9m{Lq8vV  B&HwPS4iFYG 3 '9 1W Z}  V8 s /  <  1 ^    8 K W N) Q + g    ]D-JJ 3r>3 3L+9zC7IN"|;we h*KF%jߒ[uNiq,+&_ Bdc QpO* <71[4)Vu9Y~&U2} g޲ޞ(߻'OV3^ws;U8\=kD~k0-oH#St?T(ߥk:ݽRD)ݨ3twQMj`#}t I276.Vl.qt%RJ|)5\y.Cr=RQ/2?!{|j:$V?mXquZkgc^L6 (Z&n)~R{8.b~]fm)H]}$usBB0rh"k,Sw[ nvBk%piiF~k#2KlT .!JgknA)UgD#`/Jy{.BLy 0 +< J3 ^ s% } w   ' v c . U R 7  -w4@B!6{D*I} / Y  PL   D ; s , ~    D Q8iECbZgS|r $  S  s )|f" &>DGiB#aI1 [  D u o 5 @ RP%Q6U_/}T& :_1@E<%pHv4q:B`3X8o/:~}/0ej KA݁ܭ߸ߕHޙ׍ݣ(_~Hڮفӱwӕ|Ӓٶӥ e0wI 23ێJF;Z׃X)S׽YET{׮ؕזט?ج>ِy ۀۢ5o܃ݞޞx{&޳ Gޒ޼آw30ޓݽՀ݇Z݃2ݹ ܟM+ 3uݭݴ\V\M߻l4 ^Om\v2yJ.UWe.f Bf5#CW*8~+td='\ <Hb4q jz!YXf\h`6/m~#gACzxb0|X3ABC\y'aMwTW9B ?i!,qpip V  " V 'J`bDYWdx)OP  q 4  M     i    ` H  u [ R t  V   "  a"    & + \ y|c(9e%] i I2Ah +d.%0?_r%\m(cb\/NU \& )Yb?  {u^0V C|x"CY'BZt7NOyq Wxul0OJr =!E G UL hs,rh}bO=&8w^E|{sLG c_'Pt=H\5Z`f^mg\ &"%uE s"#|eS1] P86 "q޽f'XމY_INuFާ-ޢ{@\M)%܃l܏Y HRkݚ2ހ[ x9W/ {1Aey\ .k/s BT,-JRCuQFLIb$y~9 k@r-7 X |a6KMkMo. R  { I h  `>Ma2< ^-h2Qm8mb<,wR3Ut}mzEy*j8TLGB##"/y'Nu l7SDK:R  B  y 0RwuHP+Py   N F  j \  ' 9 c 5 G y 2 + j  ~ l  & X4x|5XNtA:V4cx_@ mISG4Jwp5G26AwP]V5q73j\6cU_H[)7A~@DhwA.{ߛ&ߡ 2I~}N_*)I9!MHDH"(~*2s)v#4-_y|*`pe1H7< n<6VdnFvz]? ,47UaP\(.]/7zeA 7i"w,'?w-wE_ XyvSuX$pP4boByNtJtfme1z p]'3[inu\wa`lC+ ?E'}}&g&-2&r#CQ767p?E_y{x}N=/GCIK8.  Y 7 : g O   B   | e A     >  > ' +   h  "  L% } <8n    #z I" {jor~t6t"K/}Np9ninMEn`trz7 62X[;W]o~n_H#Gw9V3WR= mm| n\  NS z ! L( 1 (  C  >  ^ ^2}8iDfax9Y oc^Sgc {@s x[x\P<Yo9;w2R&R^]N#Q<7{! Q@qc  "_C%TgrS@,&s2URSd`t3 iu6X 9+!16+F*,,;<_CY>L$r">BtARB\T|N@K^e8rt4WQy?FeEx#f&`>vuyR~=w] 7pwe4z 4-T6)W&55-bN 8 V X gQ WC Q - gx ;q    (    j C    { \ F@  Wk#w^B(/)C8V 6au= P4Z!=MFH|FL@;^pM2$mweP'-v`]rO6.yeI??8`6ujqX9f*M7 0jt _r;z >SzRI s8 Z l ^(Bpc     g V bV{:~<a  3 E  ><  R +C).wU cq v d S < T   G M &*xw#@auYojoI?TuNl5EU"CzUU==y < B!Ms;DU"sWpa%?<acjp3=@Xk4>#f ]aj>'6R9s]Em7-4I`ES`} J;O;G- R mIDU)<j)M55 1 r 6   "BL  @U  E T 0 2LPIJ7pc /McOx}N   Y m b  k  B  ly * q  Q SDb*k`iXQAK @  @hq4:vm>6>nYc/>^/n@+c,rC+2 `oV<_ .nz  '  `6 =u*KfUA9  [  ~  * : H g >*7qp+xSFV+-=h`L\DwF>O{]WWU,DxVb^-,5agh~-}GcCBdBB~kM;Nf/~[>T rlf7[TrIR5wMRg&)Y@gt(/lK aMvH#.Q@Pp:&QeZ>\@H*QCOV89A`Bj=$-Z"shJD@u@e } %YP<1=^klQ DcgA bY-KVn]y4*q07MIpo'eJ# 4=tJ$h&Qm7"*MPi lA{{;]%UvVi|o,%q#UQoY' ^l^MIa3\o[$ed[I 0v@]z?l%wpJxPkX%>n^@8A c)|TJ1&qJ%VhOA_XK$+K./kwF)9>=+0`]H ;N6M Qs&>lq JRma*BJkrmYF )a@^hm1j]r5)L" 7k u)   - ]       N9   >1 {  P 3S s_   % ]] `Ljb<#G#>[._/Hf!%?%/yI0)>]fDM[9#-zWQsp~ex wg 9 G  -  [   K[A    xj vI&1A4Rl "\\dQ2Ai{(:^] H>FB^nnZ4c zV[ y?`aAvlOv pX``fC^dt ]9n_U7'j'CA=yP]S~qgvZ 8 u u w.h#?i z  Y h6  xc!eoD < L &( % ) Qx r   'i ^f     H Xx R I > w   1AIS.7   u    2  Jr[<Gmpj?  Io  i = j  m_ q|< 4  &v h&  7 { L T S R ~ r ;  :  A  } jv=8Pvd=<2$@ /wp^_>_$/r5   @1  n k V H 7 h `GL|dM y$mcs 8 j   !\  y @   kz V 4   p x REsl[o >$ v ,(J(KTP^L-F,tZ$r= DKV~MG'8&\2B}2/u@x Kh6kO:IMfU`%VQ^ ~wp 3}6xqcw8vt` 9C8`JMb8*5IW" 0\N_0z9r ^rNXK+?ZKCEej=Wo<3\i #:9n\TL(64aM,(#0"p4%;13i30:: 0N#]m(53[)of%wM(qPR%qn: 4` '; 64zYC<AP*gZtn]E \ %s j  c Q?  ~ v Y  ZG  > ; ' fs  $ N L   np ? c  ] / Z z ^ m $Q4(UF qo y X * + k     ?}    N  Z  b  .s  E    aZ    ;0   m t4j,Wn)jIl_#>:;WP5L8k 'zw+xb#n]&uQu'{g x?k tOD&SJ yF#u q(4XcpC:qRF& q*k![pI(A(kr4u%vR:.nnt9 o!vvxWr+Q>s#wC9EhqobSߟޭܥق۵-ڿ֑^T!շ%ӫ=KӍдiБfҰXbK.C@EEC=L(Җ! xѧvtDT 3ѿx.W7n"ؿh/ҕ؝Ҩ(ӿظKԻhLسN/׋tِVڢצ{C?ؑnܲKVمݴٳ3ݮ1b~"0ݛ<ߗgyDu,5hBh7R d+ e_6Xdv+It? oP_Z~j7D(YPL*.<N.gy* y:)7|uBfmqxd%[{{[:z?FkpI4t; i' n6NrKYyLy^m :8w2Q`X  ?Q}    l  [  i 9 : } 1 F W mvz_Q<3sK2kggR U:&a  f@  -   Co hGd^ i 9  ;J  Q P b Vc!K&9Ek5lo-T_Y!Ve:)_@k9UdHJ1T`1p$[b'0m`fhjX<%Xi&J$%g"4 v?x_cgU(h_"zA-TI$C\~PA UvJAQ\|yrSF99 D(i[, tM'^y:d _2&#GXQdfN\E;8&Ea.; 2T;=*GQm}#lv#$++''/@dk267I4-Z u K  n 6  @  bl~@uO 5XNl4ry`[/n,xJ- aa% H] u*< ?lI"91^dWRcJuD>fNx!zRJLUUy(|sDAO7e * *i   U  V` )x (    U  f> \ S 7 R + 2 g  } z _ ;  U  D t^q)q { Q  K P ] _ f w( _ K 5MjPUb?" <{-N*q]-Kp@}<Cd nz(0Ux("ZcCFJ\Nsir IFpKC+u5YziZ+s(to/!"$z+# $+`?|8JOVA+=F< ^D 9 A  M q / 7 PeMZ =gQl+ 7_A<hdOrr2=N U=Py;}ljR K0YSopj2hRKT8)k61~#iH CEF{FCf9g]B޿ d[.ފ܂(ܯ%$~ܬsݤ,GQ[1yJC%*gb,TnC,c51^'.`a,oZv8H _VG&xu(xhnDO -/ ,Su-eb(( / J:  o <7}p&<G?^{X    M8AP< _ C  d f \  )t  @ Y E  TQgFF(FTK#W..~=Z[ D! "# $A!%!&L":'"'"(#()#(#'"d'"&j"e&"%!V%w!$1!$ [$ Y$v n$G $? $* K%% %" & {&$ & ,' N' J'3'&&.&%% c$D # )# "A!%"!!!!E"E!"6!"#!}"!B" ! N! % u (`i\4n3]KHp}ALYtEzcb p n = HA  w Y I p `  U  mH [ 5Q  `  s|8H`sb,xbm2+MB-8(@`/+=Q]p:o~ W{v<{)C%ly 5;k7x  u h T {K3BMv)S#=H u:1hQM[z0ef#{])kw6;jvRF^ Pe f(.lgdpoE o^  L X  v EX + g+Hq;\*n,y=GQ@^zTKoF@dQW=\Gi lwiIw"xlxW#W#b2NB3W`V`:Lq3id'U@\-& Inn22A{Q 8w!q2tCn0bgRy&Utk2!GW ' 4=2u%zpTz < T,zIIi}4fln+z4_30ESlxv*m'xhZn `|'z';FJ!eV~ZB>0,qjDvODC2BLy6q<u4X*~:"GIFO-7W+C2<) B M  " :   c)  3n$W6:de;W`l? H ! }+FTiklFy6QN@d^gP m  t   < T  ,cb|f^[G$  `+js/2  f )   qJ G}j:  W O$ " P  Qd>%OhcX rG_U,W9: yj   ! O W~  [   x K     u\ P"  ;   <@ tU"lK<zx'@o APw ]]$8}eYwp,ktszv6Y7~fL" 89 /* F ^v"|V^/^ B3Z85 E  , M q  $ ~  Z 0 & j  n:-6pXNDUxk"[kmJ##dQ~L*BFjoqW`O.2\@  o g   z O  `x iWp:gAG><mV h 4  @ v   c  M 4 . Y G ` 9  5 ]   (B  RQ  l}MUpOh eM#  5"d#$%& I'O!'!("(5"' "'!&!V&C!% $v $# a#"H"!!!= ! ! "F!]"!"!#5"i#c"#"$"e$"$ #$A#*%#[%#%F$%$%O%&%&n&&&%]'%'9%'$'#'" '!y& %$#"! #*Oo 5 A `uEm8J6?o\h-(HIt d 7o>   9v / k  e / s 9  <  _   )2twRk\?6$,%-';R,?f  9NB\P,L1&!gvxp/jW!|IMG6 =wVOY\RO6FBIE)y#)7@2|vE@ qJ7AX~?Gt;'j| W|;# b ]4QCq>JMrzKj-^}`dq+=NaV*8s * YWa0Rmkr a(mRnzqj-(wuF^.?  G{   Xm   ib  Z : |k}%5.@kaf #*iF1^3I`xQIfIE8x 0 A  4|=6Gnnu|DW/c`<cmh.eW{;(=[9WriO &a88eZ hU ,M !  p  4  OI  T 3} > u   7o   j R a  o  H ?OJEVc #l  q J h  1A   }!UkvFwx~H > FAm^}g!5? *7L~V op #vbux`9(sEx}9c 7   iu % :O<#yWEg`  s\)w|$@~?,(tuT)jVH' e/\|/g^8&~+Z C3OM@}FZOd7VB8 |YMp=aV5)>nmc"Wt9XN:>pHs*O $q?t# "%zfxJHA I XW W ?  # / @ o '   2  F O ) 1  i 6*<w> & E  % s    h --qFcNigU=64w5.27e1k%^-p]Hr + } T F  Z[   5 \ |!  Zv >  Z -  @ w P% @ - 4S"+f) @ ;  i #  }  2qGcN* <6_xJweJ*_2yDO-`_"Z{ a1qC]N,;9g{AHt|Z ['R nn[}Qjygc|d<0r>ve*j] `cR!MzW;TH2H!=3oIB$Xvt1tLuT8WT8]6K2z X?ig2j]j(z8ea`\Z_v5Npw?bZC9%@UBi=hmR>a;u;FWD='4N.;F jZ608F` :Jwk2$6kQsU&jh$A{PdWC].6B|i@g kax|by']]iN9;'~4%VRq0NYdmt'X54,8NpO-y8sQ\}/(w_7 ow]H:9;P|0qEoG\UR=,2T i )E/g!_.R{Wx3=`8?>?/! J~e7a[L|d}F4OVE`U[ :ZYv9N. 2UI}4s*H&Gc(B!O T>WG(;WN[iOj3$,**-AY`1VgCdWNYoVvA:c.f'D|)oR9 *_z-,@0Y,h?_ nEWi  2 7 . V'RFt6y8t"cd 6 ; ;  ^w!h-:J#Gs3F6&ZZV88 }YaB6+%)-0w@= :7$I=It?5HFIr,x Hp)?[b'Ub/CjW' "yd<PXnWb4"j z ]c 6_$3!$,@!! 1]VKD(Uy)fS]UcpTB'vW.?uK7Q.!5>`1)+1YTm3p5=SA-BwnZ_ ]?.;U3aJbH@R-a DisplayCAL-3.1.0.0/DisplayCAL/theme/gradient.png0000644000076500000000000000052112647526531021035 0ustar devwheel00000000000000PNG  IHDR`vÎtEXtSoftwareAdobe ImageReadyqe<PLTEײު͚ڢԶŬϟܣpfIDATx[@K$H"cf"Kq/QE%BшBD'Zq]LD/"2؈HJ|D*()b*b??Qʫa IENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/header.png0000644000076500000000000002675412647526531020510 0ustar devwheel00000000000000PNG  IHDRtjtEXtSoftwareAdobe ImageReadyqe<-IDATxy?ԩ;ۗ䲋b%QTTLɒ%[-[v(K9c'>Ή^8N(/Ē9%Ta%[bKJlR;8Y ~^\H-p&"@Me H I"ALMUo+WDžن!quBtH5n҅.[)&~cbɊ(nL\pp!Z=HVsPϗrfv-?tKWatB) tRL8:%wȔ4{ݙKdWAA,c,Qq'rv=WYBTBdqHMV%*gRHX %P(c\*a4/_ 0p$#!@I)Z .gcQ75"i0l}ᅽ6*gt( aML1,g )e%)RUMF#\ goQ\5IBL+Q)({ʮqə.\ Y:xlʶ8Ȫޔ%Q,K7L*jAi4Lbɡt&EH  әj^;EՐP.rlG#T2$Yԛs.{:Vr2eI15=Ҥ)P^*UlC-B.$G~+݃&ZF%D# 1iLIS)0t8H uU yyx\rWθg2%G1jb'-m!2&L`$NiH. ,]⽊t][ A7Fԡ#˰j~B3"D#'SuH/\Zr`qdL!-sBܶ p ~n;~Kx .EI)rIڎE?L3XꃩR{ұ\14א(:~|DN8˲[ۓM;\>n.7d<6.GSL-DK3%( A3d.b/6ȥI"Î88KRF?Z3ZW8žϗsف,biJYл١Sg+Id8"E Ҟ7 !]y|krs\\0SߜV4tåziMjYpIXꎫRxcwp.ԀRPͨdAXbtTL}RY ߏs.R7'\2Z]"YįFq.H(PeE!]@DKY.md腘{s~<1 0:tgj-YP.3ms26L't|-X!{=H״(5yQ]? T5YYܬbrN&rs4 g Gdܔc:;&k C;4<LȌ"/>ŢpU{{DF`ɮ0uTwpU5xSG$%ϧ1qɶ3caefYꈇ{n?o8{闷V@ ! y|}f!@P.yqf||akf{JdZ)R_WcvXd.*Z,r4n[=w|wC2B2U 2tvv崧W~rGC3EZoi]TK8ߦj?TɵO; I,lVR[s_v'Q~q45tFG4@ho9cpqy$W8=薌i8ՍԆPЁ1&'nǙ5?7MUL6XtQ/j|z>jXAyub(f)~L:UO}3nyZ"TCQJhW_B\գqi4*LZ{w{ېNo~«&"~^Ѭdő%(s$1eac⛣%_4Nu☃? R|䙉 .9Y=2)V4S"桯?|pAwkLa[[V-5kB&qK54k6U MHK㷍5L?r)bwmLWXk|jroL|79_,-)Uɤ_eOdt 2yIWwŲ9LzdWO4#xzJ[sN!e3:NFCB(Mj& <{J۞=g͙w,g'ɐ5o}J~U s;ʎ[iK.?wU`x(J_ wDQ֕U{|38:w-ɿT:lPba6A>RO'Ra="YL)" rWt{ PVuyҜ|ASڰGJۧڡ .3P^8q͇ҝqIJEA Xv~xnqDOC1eɌ8\ǒxRK Yg4W9,KO44Ow#C5c N2Q\3B+5'Z*"?-#Xe+1=5%%zYv6_8+[1L"8Q\9o⦽&οٛ*/qT.ޖkwni(v[?$Ӓ_taс}hJAj)If:ΨeZ76I2j,f9݆N`E"wv4ЖYGr C{G{iN<,ٵ:uOo>vӦtwzb tp<|m|"j4|~ps/ mzE\~n _7vs?x k7`_]VjD˅lςy7%E?~Oܶt3 e4q꯯\tKbZSuF#GZ]7׉ǎ ! 7/_\𦃃\W)?=s}9 F.@(ӓdh;(~\>͹ɿ5єCUq&46P6Nk*z%x$.sM/th uwmo+[ɲ_9cu[Bb)t==GݒE )t2-bve=."Uex5/[V-_f<'V9|>{n׭|rX)'gZ|6#?gxܲ3rܷ|bg~?:i( %bNΝʿ7L-& ?4jzЀhy|U[1Yןi!1Ӻ7<ƻ7)'iGHͳq6)U"H.tM U =4锤2=,$( ; %wtؗD]L+dҠ'.MxT"KKV )D2oom+fgɓ_5'G]5:|zDip¹K׼vz5!vŢ}WHJI`oڊ+w >şp$]7V>Gn/*5R~h,*ޯՌ[.ZyZ&5M 'y~Wb'>ruv~cxPT*׏K .߰?3ϼso^gxs?cxthu]RX문f1ٚ-t!XWV#N ;[>Y鰖hƐ4=g% ]'0V={ N;SNj%x") ЪcW͍-kCLbm BrI_w"IMSY\eW<[!{9 lZGaӤ ĘS'' MZۜr$߯B5$RFMjb~H* -8 {LhQfB8poy4ϛ9#cZX F ~) +1>-hipl\"ؗz1=t<ӆ[2$g\&K}ݥ7÷_}"<ԭ׎,c׈ySxRqrvâ$3=rtU׼톥3FD_}]E3JGOlUlmƷ3-F^LH2m>7\R!}Wb3;i_s3*\Pt)nvIΤ&%cbTIeA=@82a)w`DwN#SMΓ<ʃR?v5Gov—6_$dK"k^$穈 f).J]ŵ]E mqgAچGP^v]o]_ҘܵV\#QZxBmMSp=e Ͼl=1x@ls݆>yΣ`o.nd*lFZ[ZE+?vdis:^:peǭ6$L$P G~qh脆$ou. .28ΏJDLKf4ShhE$g qFӏȰK"R4γ5m<ɫagJ,g0͹~Uz[X;[<kL\KVJH7.H>z[Ņc`jAӛf`c.`\Ydο|8n/.+?|?|UݛeMQ syk}jth B#gNܲ,nBN"\K>Jee*u-f郳revb]q(Ie,^B#OˆMtm:Q0qrI:q@~{˱&ҁ=ނoloz*˅HOٞ5+Fʷ_=Osg?xˉu5+4Jߏ&岫4~\[lmkhy-(cw ୴P[?.ҊزGqG($Eqkc䀡i?p̳#޼rњi^cU Z+L_ Cv40g~Niq^XMkO}OÁqDSk=$%4L1hjTQ :`qf7NF͸ Z>_U\I (\O,5Gy@~薥P붢&P"\Od?o$W?߿Lpq^ fGNʪ^k͋Z[4Zf!(?M4ɵpYi辟z\L+->sӿwAO֎%Bz^<-ÉLM^3_m<2ȆN);;ؐƍ^ޙ:7HeaIqW[ۖjK6g"A] 4$"=.[:8A1y%^ Y@\.ZҥEd+)sB_NЉ;L,J *p N;­sؕ # ە.u۰m_o9+WBSxp|lEuf)Y_i H{0m}m݉qW.:'Aj< * KMx톏?x#O{Ք ?l-ᓴ> <Ǟ^XɡrV/w76u_>5/\aӱ\9tKz#]2֍*?p 6X%Y*]YRobfD\9Wʹ^z aPIof $80K〲$w>rf'БG]]r֐8ϥ42̥ߩ-1Lc 9'@3XW9?<auSW_vξC'_cv^Kĵ{WeN|"1̩|>/?YiE>q5dϙuO5Oyne%[TLq~ҞP;}wdxgoD4gLķϾ~@7k6ڽ_?k@'Y>˫*]KdٛWTo?-s&R$iE!)_O߸șQ7))ԧ$-JfKp=wt=cϬvʉ7-^/狟くO_qSI/3%dۛSw\]mSK{9x?;Dcu4;>MoYuyf.gתyCnDғM>i߼w>h n7{=]TcԞ!8>9 c6(0C:8Ms1?]0v@43@Hrp2hyʼ%k # Η|N>9nMijiE8Xf %8b\3R=d('zr./ְtb8/SǯPo`Aocp0VU\AW\w ŭ92 'ۧׯ @U.u43QظSViTb -@ L-S]M9E;)2Lki0\غGdU#l08粟 78 } )0'πQbiـisoDKP?%;nTUCSgդ͑NtiIhj©b`PԪr夦EVӜ/l +_Kfpo~~xEKq pwyTUL`s4=TgN&LP P`l^DJbeƥ:Q.Hj.v;ۇ.E kѬM?0\rp4#\.v&Y34v%@iZp,VY2E+u0mer9`\?2R g͆w$Տ #_4mse_eʩ޸ c1<8l2NЎ2 ̰i`BT,#l[PtP4bxf~iGvhM䗡V8:N&^u=qILD>â _Ov>U3Ha gK~ [wB(B'Rfi"kcYT%Dy:AMjKfE 5hƭ5hdi0.dlo_2ς&Fȵܺ@"IUg hгj5 v;vC.-MBUCXԭW&j) Ry|ъ[Uo#\>dðk= %B'͑N:.+(sZuY] <΋M%Ԫ$@ܧ`] cj|ƥK+NeI&wsj܉7/^4CCnϫ~kJ3:YSa¦?D,J,BY&Y䉷#͋M9eip6lrP$%0WgnsȝZUp7\.CێBeDPi:Cbk ytTGgmqRyY"+qPR ѤPJ4my!a f. zK@ipS'prtط1o3m34'`&N&5l\zNuTu"]hH(s43EEg{\r(y oQ@$5}LIuh^hn H4CCd2i&sA + ʹe@M[Ll: EtHuh^|h6T[*)hA,THDJ~q_v@2o^P q.(~EԽ˽20cN@-URW:6v[bwKr %lk;44oh,lɡ]Q5]ߛ_UmGe鯰_:%ڣP8ۅ^ÇI yE αq4x$@nyCtlۦduق| \>*\՚)W(R'{Љ 8Vwr 4ؐ*BI[9E(RBܺSC_l4L>D!<}²ѹU-'4te!$1~55MAʭ:\ŏS㬇Wh %th1 hnu2CXETIz\Rq!^IN) jEޑPǥCE~L֝ '0 utEsA([y@\(g4 <5b{Śkֹ߱zulnG+y I&vKJx #0troJ5ѡYL+*(gKbͰ[wC;q9@)sbu0%Ί$roart^jPMNsykAG faǓLBIz ιby= AiEf TT$ڳ3Ԙp̙yhO;1 (֬èmt7zuB㉄]2h*W]M'zUwS]uh6ؓT+FW1(xV%VVԃmWpyϪ=.d^7l@ݣާa N֔w28:ވp0A|i:Q(+Rpy:Db#Ζ .}"a7{f?ز$Q#ĀhqoL;.=G(y`oݪHM?bx,#.m(NޥC46֑ 8fͱa)b.,Ua:0ArΛ 1]:26}^Boq2$+zQF.eh֣Tq`+n $W }jT Tֺ\̀NR_>rN\dO,IkjQ B,igC( C,zpM0"'ԯo,w (tr0'|" Vy4C$$`WN'BT2+h Ęo ${<1e@^ks9HagJr=h2Y1TIՠ[Wػ M8 n@axƪj FCL$Dag80zV>V]d\E'\̚ cn0hGa=N;‰NRD3_ՑȭeQѦ]nof~G pJa @I.,FKSv&4ILL {ѴR;3|Ga4A~%M@@S000aMaMa„ 4 4 h h &&L)L)L@S@S000aMa„ 4 4 h &&&L)L)L@S@S00aMaMa„ 4 h h &&&L)L)L@S000aMaMa„ 4 4 h h &&L)L)L@S@S000aMa„ 4 4 h &&&L)L)L@S@S00aMaMa„ 4 h h &v `OְIENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/header@2x.png0000644000076500000000000007077412653526636021066 0ustar devwheel00000000000000PNG  IHDRh}ٱtEXtSoftwareAdobe ImageReadyqe<qIDATxy.黳}%Q2{-Kd;l-:ob'7q?qI?q/궬jUKU؋ؗeLp= fvg){@uD89 K@w&ÙL>a:!6@$ J'@t eJk@X 2LU XCFD,$)[4_rTI:K/7tl;;?ChxL LL00$$D0LjD"ɍK#2=HL蟙ͱ5vbO?' \%. r(ID9y IS|H0 1vHqSCf5.Qb`!ZpWjVW6!k %%2e(FLx1adO`nV4prlk` $ b$ˈR"R|wӦ sDߞ] K5ѣCQ@M@i`?Vb?b _.RybN*_9%$߀¥eHI#kڣ pY F#d .L3RQa %k;C1CT7Ƿ,Ό!%7a6M9FVkǹ&ejX[3p4]et &q f(o$'{9@` 0_Ps~eqTV8VʄrF>SS5h_n6,6KQT%j<t[4S@4JzblMd3՟H (4Jg-`焛<(SR\ΩC (Hb>z?~KE2͓TQ-5RGJ Uƴ,rw nDvQLhZLb0i$G'cc61D1PLbTi&S$ ]HR#q 7.UŔ'GĔvy\iNo f(Y@YqϜf&AFȴrnTrJb8,2eRQxO00Ĕ 1OT ~p拲&q|x|B%i dCץ XNŔ}1]An7TP'%J(Jk/CJ(oRФq br4\e{UWBL9]j4m-qWvnIh[%"&pG9dfL42lDP2=;@'pOCS1ەV&ucΕqb%$[NlMzhdKL5{R b 3Цy2J $x($vZss&n*"=qۦjت/:XuycXbF07brS&VT#qZ.(PNs LP*,uL.cMd`둉d8K$ٔ:T-Z6bJ(.ϙQi*Λ*abR$% f()%#0)SdXGS5_`%9bs7V㩌Hs(f"\I[pW`Uc2i!&囄d*X$8p'.0*و׎N H0ÈPBy&F}YvE+BT1?KK&(_9tsCڗ+`rS&wPJdH.+&Z*(b㘔RYdpOvM _g4`&R I.yM=M2lюgҬ.qxJ(oz ZLTfHq,S$#鈴# !7u4T0w1CL\ +&skst.Ik8`d`6t\ ttGb"!G1'־x7 )+24H*Ll%`pJ(o2!{glr(, (" 1qJ\ѹNj%K#r.HGu ˠL6+XљrK]PT,ڙ@H!v$&qH#ѦSƹ\,+`'aDQ(Y=3z@C1SAm-jg[1fPY'3)3qSLI=/!쩱NN"DZb#&fS M Cʹr ,r 7Mycx|dcVʉ"BJ(oA92"I/lS7B@4MZٗī>e?S8Z)Ö\bᜉfՈ;叒$b*<~(=2Աd|lPJGbq `Dr4bVL~pBL#K\|PB f-:zqK4aWY#PEܬleolr qn: YUsX;<9ձ[8f*])EO1bVQ3y.Z0(PBYc:U)e_b2t5kqNycdBp%8B_)@J ed_xFL#+oK%mm#[ N,i+&#:#Z{Bʛ]Pc_y^.E .oB)9DM9shLr~(hEۡc9I v`ǴAԵ=L^`ٰ+qXn I(ޚN6mvMzeحNM: 6r%3_NK00(V"9@9P iHwBmJ$@dX6g&c@jYĎqP6;ITkf@i`>*:Z"~G9r>™<&XL}|,r4A% f(ovĴҊ6AGTvZf4}Wr3ܙ-֠:*Ut`OKAhYuw!j #1rlElAx;!+Qd]5|7.$ye&JPd&"nSX0C ͏VJU[8 n( `Gfw)'řQ1G!fRb.LK.Ti`VL-D- - y~ˋts$c WAR$ԔJtIH4߅"nz2@㉱щiquOUs] f(o1)!;OFIB"Lg#Jk{[G9_G^4qS1n[8a< Tʦiq-53P< `%o1 r&9 )R7#I:S]֥X!?|v/It(Z|J鲕[5H!zyYͥwVa7Wq+& V*#2JrX\,fr$d4LGdHq#߳!R_vgL{ƳI:߶d+ġCCݘ^D'z#B> ]r<qg "#S:X%udp"? 5}4Vͫsz势“K 쏎w,It#jjkV<#&87Ë+K!xrthh<׊;I2EbNd"stEsw2qc/Ыoprl4J cClbf;µdR| 6]9x'Q٪ l *") ̭eə; lrM' dC1)pwW2=(#+Q':!&.vIJy+u"9R➾hdZuqᰎwU;[ۻdKv.j~T0#SdbbUc "ZW_ۇHݞT.=oU_+~o_dh(lۮ~ɗ~-NNXYL!Mk~7㮚.9m[?q,e':w:t^kPٯs8- Bf4;H8hZ_m|nMYMݻb";^YZS֠]9p92)!2P[˒ՙb2Y$EVly+2P~t%0+9<%)BuBSikmJ+bj)RKk GJTh挪NGtQ]#zbݨ6KNiOTo()n|W; R/]sx5>'LK [6_iK(*652CWB%i680@hz]F uӥβkuͿւpKDM@RqV ve9[GVNPRk,҃ K1e5#YriDDh\^$wfn"PP0e@f+;3_'Z _ ܻ&w6k\R4N&hSt?tm_O~OOKeMjyN{i imU"ɴ_d>ͭcec?]jw gN.;Iꃇ.Hk*q᪶"rS#VqkÊKDg0û(rr-rN@*gH(-3 }JeDuLu $ skAmda>*2+ N:u &9 %kKUEJ\JD5J&& _AhU-bFLϓSѴ$[H(L980\,e- o"-=~D_ϑDKW!aFRJ̇yi6`s DH}Y_''Mj41BMl䯽GUB8)}wV% +&W\ުl{6|*y!-s8B0zADX@⬕%x$!d+<De:,cRbgr&,P@(4ߙcnҫ$X.bk TO%ږFJ}efɄ OLf}Yݝ 'XZlVBZ,Uo?Ӯ|mY>'M`\Ȍ1[6u-""TТz7M_d ؛+ŧUt]o8{ټOoŊ^1@il=<{nź;~+.(5JEMY%&z쎿M>r3#IKI)tkeWђ4) *f^M:E'Y: hd'0:t@KL+ˎ)ɨ/hQ@s%q|S9T|y|l8W(ut=ynfZ! .rP<;orW𦋟XR Rϳ^ʗvF"405F"7e~(jj4NO|XK![)fLCW(=65whQەn ̙1 =Knz5nt\2m@!݌êV?}Jc$[ҕ]ͭwxh{W?oSuOwz6 ]LͨDaz#Ѧ6Wm\G?i ̭+19DL_q!qϞobH:5װ0M4k)zu@@LI9(L4eIzRgY6AKxRQ$SK*zGބ J pd66XeL؇5S]u(H$xAU (OZ}/J"KO2|_tJ۶XPI߹憏`4dMg_ޯ0r^,<#Gbex#OŮҸY\=HyijA[! *RQ60S(\]X[q\ubǒD1[IT+Ym/oo[4;JoP0P}9sCC=_A5+B(٤詛lN ϝN&Vg" ?I/9^~ԇJkWS4(TO u'n mud+"XHwBC_ş[qg>zف'Ȼ>֬Z֡b8M~|PROAe={?v|L_o[</n28udV<MT?֔r3dž~ׂfURLuѥ{~#ye'w|TkN8egn@瘂҂Eُ2>J P(J5h^>݄()O c Ȳcvl V"nzJK'_O M!R)mg7EX캛9[ %k ENqENɦʎ}'Xꡬh%}up8a|n]twΖXg3Wg)75k.p1γ;Owzg iU4+ϦØ^K]*,(hv},ŧvV]K84aXz/8dxyA]') ='6lb/?E7lbF찯+F6Msc FLT'BU}qI%inCF)Vj مB Q(%2.#b"8AĶcEPbCTcN !s y&.ۇ&NjPM+;9)ӫܴyTj.EwXs2w͊䄯YHpFo~Ͽ;OHT-em6zad)lDrm̆=_VQpҏz]jOJz\4p}J-WtǞuᱟ>Cab[>w"{ݏ)ِ=Gos֜ VsJwO͠Q.^p_m?.[k&1WS{Z,em@DI^qg؎\~vC=OfJܦٜ;1#L*.tlSbZ9o,_YɈG8=ت66G&:=tOX)& ^r`T.G@kTIwCf+E1 E MSʺX/Zcȫrt!98fK؁K1Ǫ*sp >a]$Y9::%IFUb',7L{ݕ6v ˜Qylg|OiGx$LOOk?|?M.>X4}|zqo8w=ȳq閰O7[xGic}y Tn~an(fQB>eۃ͢!5K RGˋTQ$*ФwfwМb}[s0ݯ?>v֭X Bg'lk F 6]&1 X1PÅK[z$$ m7T4&֏""d11^Y1 q ۿHG#%bˊq"/J*{Y7)0^}hx%q3q{p&x'`'A9Ls.zolɸos-^ȋm{jhSR뉲5T 4sO)ZMS L)X?$mNPjV(k_G~k/8ջ>ﺥ:kG&?KOsۑ\,ՖhZnK#fJ<^偊]wYVh= wŽJW*7VzP)/H敕tauzϿV-dݮ&wn-0gm\969`M/qWD}[7x y2%,Rikh5RW%vraH nL䟐ة2b#ZJ|i%|c SޖK7'UJS$:~0;DerwT{ t5E2Dl #Lw+ /ֲ܊vjvm`GJ5DHAUzEzP"kfyMǪF}Fa9&RݛbEn8QXq ]Fd$ca0?g^Gyj䯿+ZɶJ\C?<8@ux\ƽZ<%HKU[^yr~J,!rfW">FjG^/$W% J3s!&F%rG ]*C¨B]OnJ0Q:j'  /dN-: ݒ s,LnvYiWjv"mÔȞ#㞗3>SCʹIӚq9k?I׼Dj<˗wV_sS$j\mQ0`^vemWZs>㢤(>_W]gzE[uLLШ\l~#3 AU^rk y7IlQR&k8p#`.qBF,}MgVs.gEPUQ(iUȕtIn4͆rXSϿgsWR8Au/H1-9/.WÃ.hRR67VTBB-X KoJ7yύ}lA]q J2OT$~lN%:io Kz]X޴u瞭;w'Z{jr|:͟Ƭ[|Fob_z#񼖴h=KG^|&˾Y%=m#kE;sUN$@f4Ҝ39r BW y "$_7iRXorZ C̨\T/ SD&Q "tTV*2QJ&1܂dC 5&2+lI6O2r-dp\ Cu($7玡=gi}=G&1i'ko|[۫)ӧ?Ȃ.~uNEo BYL&z\֮i]w6ֺoi SG,en0i!d{I,U,T&x3ȊOg^gs,Gv TRtpLLckBNevAԸeܬr.L*kםH\nNE(L>m/~ _s*O&Ҷz|M /L'+@vtm%?*m7ly^Y-VjP);6xSrAn4IJJىw_?v ^R}~OB%bTbᢙϻd_7[,Z=ﳁ;Kvi3ZZ+N8TIJFᲐXɲ$gzYLScD]4Q(5rZ`LVY}f_=CGMu.AWu,#QȾ$o8o[&6tdiQ<ı3ZTɦ~0RhFr6Im =5)#K/K`g'v; l8[Z2WfDyV 3Ep/!ӽviBdfQb3E1"^h`a,Gɮ>4.Ȱ-y%6ɝL{ֲc$<&N%d1ʯH΄8sq"DnB-vy(,>ٻ-QCl,@T^]g~߻yQ)M;իɒx1$MR2I`SpL\u0ޮ-j}iʀoro$&||h&?:W[#R'RI+KN9%AVrf4qLj X}S1yK rpՃ\IhYӸMxj _7Z#(VSDÒFj/5V=7v\rJziCO\8LusϱQYҪ9_=KݐrG^>{k[緾&|#/W}Ս?,Q}|f@f$6荝8798Y,F(#]ng[OPoFֳ/{ʳ||E!FADEl1Ry+.X DplS*Yq$u+"R)VBs\՝,rlJ1M10RǍͥVU = &Tk+N j;ܺg75u,P?xԳBO;Й}r~fSLlg#).58TsKC/k?T3@ݸ;V^痧_3YJ$_߼Wg^?ʕp97aEzɏtʓoi@?$npչsƂ$hR4$_W7pz=g|);v%?-jCg,cYw54r1a2L@a>~E]]5(ږ#vp֮YmS]%ۚgt||. mC~]=~Þ.1|ՋWx?I| @+ίs!`:h {_MA'6rɼH$˾HBg *Lq3m<@1 .c b'~+E$Aac\7pLG_tTmOUɉڤcptL![Ba% ;Vq NlzYTjl i^sVI0r(;rDԭez7_k׸I$=^{miV7ܼIVR*Nq2RqsGzٗ_}/Rݨ3Rʹ^OhLJePN׾_Ow\.SkzհkDzU z_!ifs(οM/]j U}['.?73),a3 ?xwRE\ܛ))//=m@wOwWd)Km>eҪ|e(A6S9NmfyKDWFb/' `T>>sEj1t1Za$ ҃"1ɡC0AQ|4,tL+㘮S,0!φk\O 镂){N~ gҜ~+5=8Ph q4(k;F^~J(]~Ƣ[v _JR$Bj4֜dR4s?kt(Mr|wTFQw\ٔ)1;/^uީkyۍ{Ş1Hu^ѳO?>cHNu7hlΌu|?+A>E'ʅ׾+x$;g+k {F:{ŎGwLG^1Ψ0JchwA_q.}^C&c,Bdx|3V&c ~5]<KG,HXWf:Hy(fɁ-"lp+1(l[.fZ䏞~e縇&'SI1,yOSя)T 7=_Ww][,_y@!Ӻ;*sYD Y?ZڶkM,_V1o3hb-I&5&06C)Ϫ,9LA<⫸崦\%IML1o MHUc1Q+l]9f;|\Kq/KȜ(0*4-ߜ|#Ɏksĉׯ[/TarG5H}s]-ÉE2xYզ_[7}⛏n;SF!E=4~q혭w ??x\{U 5}~CMRabsk>u@3kOoOs*y)hf8 EqBkmԺyVAcpdJvzaMeY<'Xip@g'&L! ,2 :2LLӦ."IwҺxR.`4Gxl?~٣cXw-U#pG4t?;ؗvizUO7\,O) Mce$ZXux%(>yC7SD/~p5u]} ^n?gxtbѦD{//-O춫-T?_>ZB:҄$z)ZcpG]y2S/on_?y$_2wݴ"Lne4!qwK"ȣ?0"2cՆ?~OC<"y`F'BhMړVCJg>oT[ 0ǖ%FnW&bnkLy"yMqxu?kyNlbB7 F9uK2>oBY4:=|n8m1K<,@99֝ʻ,StcmT4i+b1-B0EbjM(xU3ԨWJ([ݒDJ$VԻn_sǦ܃TKyiZ )zU]YX_>۬\A{ &x7W ?z깏Q2Tq,|URu5vs_kMZjeV Y@H^g: R*& s@:?fui Ag3eˡlbaQ]J~G1oIot;y 11GҜΣ8STA:'tK[m_C -js̠IOlz2MTϛw5#I?F85L)x;Êhto(ϊ$!CH͢ɺCxRN錾s(پx^Ej:ѻͥ-^\ƪ@ZTsgk>S>6͠)MT3OEEP`*S(wUZ`HsLk媀Gy9fU8d^GaA ,s9&C{Fws-p &va([KlM_$RfG*$Rp7=)&>n.m/9׫!vM'㹼5AIfB* \שpLhGsϣ|Mo_NP@Cr IuP#ܳZd CeNHH6OR3C̟! Rye߶ڿ`#oB9LI-OgJ3&rM4U`*|"*|&ǭ{lnlĆNScb'`f1Hډs/[ײlXcH+Fw]s/_fl4EjDkf2PLuH35nMr2_f"1TX`|ʩ ˒.vv9X6N3Oj2Me~"K V*;qp4omnim>a@ƶ,ۮZZT,0E3NP;n$(8tvɸ%78+:L<]̢^_:V0o|bqJ|#j׌f4--hMaZI&DK9'=O*O!DR彆B$:sWë"qq,wv*"HqIOǐ>btaѲi>i0^1v<\SfP ] Ҭ* Eo7$kf:ʉ`Ӕ&XPĩZ[ تzisٱ`ZXS|#i8. +H,~1¸9Oj)I &!=PBYH3Q-X3ksa;&al}ZI1:)R׶0X9i&ob咛GLG34eyBz(LSMk_+ǎ*H}5(=<2wSuǾ,ۡX58A ` L=yf ՜iiOAY3PN|ގ ' jvorYj n#~iUM?h4sʲS#54PByØfBx#oG}A[^rij9PF`N44Mi AYb!kJ37RL_Bf(L*&Y/~f7oƼ6 @[~Y(+"1"$N̎짙Jr@>nͫ41hNRPB9LvLVѾIL"TE)KMφ40a+PQui] ?}wϟXYSzYY3P+D~XZZDer6^Vοta2 #/$hhP]ݥp 4sa>Qm%PiTINk44OybJ7#vH. =i/*>IZ.XyMЬ_:PB eZYs4!;~U錚"+`xFIvl_~H;Ph&׵YRWj%PHsO I74ՍptZrttc^) f‚UI{P}{נPB e>zA V%!`S' 1- V ^G透f4F$?zAPBy&4.z.di{  8V~#dv>qcBK^i7ȏ5e.L4)(4kI²+r3Ϟ$0:nR#CⱙHM\L0̈́INODh(J(ohJA FF`WrAL%00#o"x&zK jfL6hj5H2PB9LJ$“-}0:ɐ#H#I"4`4B? *b`,A-# x:BJ(o hH3!|PТ08[AQ-i"ψBxG34Y24# f(d_M\(44ZVPiZXDrW *f)i#)|PJ6'#Rޞ*<LlˑgW%o^APD6ĮV$+@stLrE㌥B %4ki Hi:*M$ i u CNl&b3IM)r92u$TC 0* 3svi*) 7#N6Mɦi^0&1\jsKt`4aZw&(YL.v9֮.$JdX`j'/R<2PByc&Ԫf?bb5o.ASqLCk bvn߉Qcz e(0y jza5sJϓiӲn1%Ǡ)9(y0~F ᕡqTa -ihNARAOskaD!vA@YK:v\FdOMJl )(d$BZ *h d Zܘx,e{ ,PfZw6JbcŞpBaQbx~Fs ҔB %Md dt:d-gV2PD Rh&a1ԲqFPU*уI:h)P5($ߴ9s$;rifڮBs3Y7eM{D~"oKj5iL 4 -ŦxHsbk~gVLk5}-G&.VKZM,ڏ2/ta)_9-vɆ?<(}?5MܕL7g^l%s)xrz9e* Uu YDz-_jȴoew4X5 IWWo$F?Ep{ Zu˚L!~LO{_o lj]_Ӕ=yf#M3aV&=ar;Ph,6u.Ggr!:Ê} O !'-GW4IlUWko摼Z 뛡I{l}n"!D{2?+_{{-.n&=ou&si^m?z̸)|rzޛɼ/칒o p5tM>ž֘ͽZo Kk3Ac 'sHd*6miΩJ`Ml?CW6".7ܔZB҆s4ofTy݆ي=uhtl5F88cOij$tgYL#’ƻ-^YGcv|rz.}٩xR%&s?kOϟs7!9=KL.o"=߷cH @3&HMMiBo?pY3g\_Οl~&]|/ziXrw>.TUifŽ' $'gr_ezGo7Bg9ݑWvO]kV/=)r= f;IyQcP~*<|iUp]:-tۯQNg"O#We4$7 iM3fG{W6s7T˫زfG Xf7^Y4Zm"`hyCC:~̗&L9XTM;ެ*BLb˚ai(_rw͜7?d.ut؛;Ч){Fiz~-Kf˘]~v ?FZ奷-i^sSHSrR`)2Xhy"#VHJ7*͎7ۏJYeN!XEij{tӬkbۓ.~yT=cGНZ}1{.Qsߦ+󱬜9JFy7]uw#-2'6MiD oA<]i\l@yv6aj 06pOc4TXul_٬7>+ƿU1HuzG>c2id]G萎T,piśIUԨ՚fg\~I1st[զ=˚i.?93PD[#}cʇt|ge>kTHVTMuEJzK;CO:ǩ)s*<ٔҹ'oܳgX:Hn~C:mϘ2#q%Ey)@Ko.+ffExx /.GۏhW3.{ş=@`EjN0D/M;uH?Rz; 1EBaK~5dwNW~|լcfvn[+¥L bҌy3s7E!}:(CS2sLz"Orٻ'2{-OMAL[5/#=+ۍf.)`OǛJzAHoai%4id.ySiSMK߭9טxe ?yZsDqhL\ fz!ov^n+xu4rD~|.+#Y]tG L#W$ςx|6iϡ1cNL/&KzrejML398o-gͧ?QSJQ/߭ٙ'>ͱtڂϻvQ'Z1nszz_.e3xs޹e_m6YMdJ 8 eX732f<>criJۛi_P:ò2WIO|Gy>R[5W2|yٖdc}r〖(z'cxa pۤ)oPRM:7վ?آЛ*6-fr={.է07/~wO.I p˥9ścDܼOM{(GǛvvGZ17۵|aنދڭ]|k=YioswK pyokbo•:kozfM&$G'7_:O.+i[ent7nȧ{=rtHh9i+wt^:6c~i.Moxysa4mŗIr`cZi̒JEz{x/-d#alĬɄNAWf*_(r`.;9ux@Piڥ(c}0&m7&+@x6fb%nyr&e?&PdfқyRlm -=51S-Ouc]YOe]9b>g!Wiq;aHSScI kҌy33}7Y5(ܺ^ܞ|N ]Ki&VΕ֕.%7{{$C*> cjc"WkI p9ݛiסtqiMMd^2YR+]1"V)mEqcJ$?Yk>zRp14'zs¬DךMpI7 0}Wui4WJMtٻS>u tJG#DwHޔJzݢL~FmG+oZ]7Mu3|O̓ v/{LTKzS:=j?e<_=ەةeYU~K2Ϙ"QiMta@࣑ż)ͤoS+fsW zsqN_Ẑs^GI;+j j!&l\Hs؛$k[`js|y0VMڼ7D{cɋLG4'2y*X̞3`>͕g>:w_P$\43{2{Y9"dT3yW'#"E^#͘(uz#\4!c{XƝȉ? /'`UoC'}`Ͼr:xX4{w;4BFXEig#}Kj$VK}G {@P9ڃ16I9vX&~ޭx&[&ͳ1iʄcv'M+1&>i# t;L8v8Ęp;)}:xK&.nJS2X)sp`y';hĞᤉ4ur9zB.NE4eKn4Ao%Yi vӇkJ;Ҕe^j Zo7;+MlHÒQK?\4@$ M 4&@\ 4&@HK4&@Hir &@Hi M.@Hi M%@Hi M 4Hi M 4&i M 4& M 4&@\ 4&@HK4&@Hir &@Hi M.@Hi M%@Hi M 4Hi M 4&i M 4& M 4&@\ 4&@HK4&@Hir &@Hi M.@Hi M%@Hi M 4Hi M 4&i M 4& M 4&@\ 4&@HK4&ESPg!IENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/headericon.png0000644000076500000000000002156412647526531021353 0ustar devwheel00000000000000PNG  IHDRddpT#;IDATx{d]?ۏVea c!P@HB$U)\E*a\)WN l,y%^]yy_{noή5#Rnwoi?J&ݖՙ_6-FBJ%ZT*Eag !&掿sGŠ ZCRtY^Ry;G:tu.yGhQDhӋ|s9ZZ 'vvߜ|!YF5` @h " rЀHE?kX',AV8XG>YЀBJE!$P@ >7J'j)Z}V}7@~k[?@#H@Ϧјb񶫫V86Uuh?߻,'i{BەoZyQ70Z@ۀ lPn=7ΓUl/}ߵx$z > 8`@cޢ{i98,7U߾.gj"az}:sũU4sTMY0(ltrFm>ۓjyJq㧊QQ_Aut!F2ބF'iH elbFT_ f;Q@D p[ʁp;. m7NT6j3[:>o%4u}˳3U,`M L;cRHzrv}=J*'8!J.}g#HY)ʋMƈ\?.,L<.3e._U߻c5\{?QA %b$WŃƝzigW\w>cgS b xzTb iI)5J[a[[ugoҫ2DXV3g{ﶼǾq֛[9w_M"шBya-7窥?^wԵWv2A!Tsv3igSF3-^Clip~\9"XJ0Z͕j4feџEqPD?5341KCV=0ф9֮?kbfB݀v"g-go_[Z"ۜ%m&cg.lgAE{}M#? z⊣f"C_S׽#rqbܘjả"h/iJ1'뼳~COT?0SD!C8{ZMEC (AlWoչmm;CNr/N6(FSJBy\*N@\({0 2g:LZD9a} :mV/kO]L*?`sG6Vv~}=:\򏈥ΑɟSZ'2L4e PUMd@ eSWbu t.,sE:.W6P=$ެJz]^XX//s3 hI)́[GpٟKwNd0td|E+MC)/W?r3 e+B*DgOӳ@^*z#u/@@$I!M\#ሤ<.lm{;?̹CE2tLm.X ëI͵w?etH$h h[]KǦPֹRuQEE.IʜQMi|HfI}C}DYy=L ;x0?$Ib-`qvɗ!~PvAHe@hVN{7ǧ>IS0u/Vn)Cdl"v t9e#D@qX*P*$9Rn<4}PPhA+ыm=k.Ol3#j'M DdhS7n Ke@:- e*L]g"(;OE/(iN!P.*eZ Q/n5g?hcpsW¹Sjh[矛`tbdb3+#Ǩ}^Fu-\ eݠg ,$v}#1E[ L`H( T$qPmj+y7瞘^nz#P;;^J/H"UlIrq1Oۈ.:H< dC, /@wTF*҉!$cK7QTDJUi`-v[Bx ME@/0)O\_JGBg׊&&AuH*h"6|b ?h:AXPy1A[9W#oA1+ Ɉc4}l_S@)`n%PdF線~}yku 4D^$@D54ѧ~Y$?DP#D8Nt4 m฀*nXA)OA MyP.Y.W(ÐW5ky߻%F#C$3uHT]:۾Z҃oO1ha".H` QR!V P#!ΤJ:E(T5+w]@Im>{yZNxJ%$26ʄQ榜z|x)ҡHHd ''"'DxMAP+%n'ըj%~k0s:_3PG&~a^x(QnߠWHI2mmM;EZȞn 4s.1SDK_?+\#pȆÐ5g/Foh{02*kqTq=?R[l9'{ԇuANMu6$SP|hD!M* T}vЬjڸ2\=(DZfJ*VQu;?<!sOUagY8} e{ox~) M!Ц#{E. wGaPTUCL^^q@"97#TC\$T"N"v/ߏ|DO(]+k*&Bpj7W^sfe׮ adM܁tƝܶn&xt׉ߨ:VDi7_ל\#^{ݡ dEDaժ i ]?Xׯ^ oʟ={vϾ`dpi D9Hd8a5H$bSUxe -AqXX^oT[-&3!G~XrTxYLW%P:Oi% ͑px OFVK.H.pXB ),9&t5+TN<;<X% o@ȀPffY'2mRՙGkjw?3g@J~bF{x)GzJ MX\*\BœYׯaaڞش¦]ٙ\:׾ә |=޾2)(nŜ Qzf2uO  @PZOhb>#4~#!.Y(9O]ekcAqo^]ap7A&駦 [o30^3gޔ9ׁ3M QE#N hjPteD]u؍3+#3w4Xz}|*D(d\58lL̉rLyhv@CQGf陫D j\[|bu4M%ث/B{DaԃQk$0i޾ w-ʷKpj 7[Rȕ0 C'VnznR;Ծgsaa)XPg>($̜NNؤ#4r9+<}!txU*QUudL}9f ?K;zeq̞#)dՑ > Yo\Iw30BtԦu" VV38QG) b-D/&+PDȹ7$+L,hKUIԡYibPe=U]QHT!yӄX0t@-_՘-eŋ/Åk։3 SYV*T23k-3ykyZ8)05JbJ BdzE&_HRϹ 5D7QF aɖH5}kDTf.m_DRI^j_,%>E:4q(QeO 0 g JndTB3iP^@3K",5="$  nq bAgA<$mjq]$LȄYuXF\5.2˪lf!a<6!&hu+l΀Qd2')g%FjLDa5e{R!̐5_GrߛeC?4{$C1YY9$A K])G5l.MTcԱ͕R|jQY,u"\\ H/q;h".!QFAHCD6En6]`$WN熬$Btиs ~k@8fxhBE$.kgizdf*ɔiUթtm;se%rf s̖2|Uo.9@ _ZPDF1ɦh\J89ɶUJ9ӰVݷ(*rm金@&}kҹjt6[DŲ e=DcK^6m5LzB2"UY-Dښ(ʉ68"4PؤDnS3&QprI.WI_Zǀ-0WZWa4is?&+$)YC&YNR^*'uλ Vo$TA?Ч>2@TDiNs+Ž?r#(կ5s& ٷn Ж'Rg1nzOϔd湎{ Jj@b KzKH%5(eGW66+ 80W߉_k6Ϗ>JyK>$ m.2ƽRȀI%ʠں͆r3VGJ+s_57km?%XdJ7 >u Zvo.6=ύWoB(Ć:p@)wLkՃA1]*'݅ɺ[k?5Y+uLsɲUbC ̾>0+2-N m YfA*Gu $ \emZĎ Zo>M]]]ĆқDhq sHD?e;BhMNV͕֚n=xzcbzq -rM2xT!Cv{^=]ٱ/e,~#DߔME4UB#ecsV㯝@IU6Q[5YM/"S l1Mюj"SDO>g4+D%SoN`$*ɋno֕Ku՛;rMqF[i v4`zOH+ҹrNXyٱG,roBJ釢3t_: IvCvz^{#먴iQEv#5+f{&7ܡ%-Eg GycFNW?Z9\J2YNG9 rF'lw.,=v-19G.KS>*'\W[z~+77_x SqC{G˕ECn"Zn^nͯ.՞r*d/ VE7Sx0aH+M.!@6߹pM䐇(/zuiW#lb=8j#quFk䗈[Q*aUWWg.^Q tge,o}@(jV՗?-"6r :(%WVW/N$JD2۝)U:3x/oϸ!vSmc_[ N6) qYLCI>$JĿIXϞI/:!@nE0j^gC=urZ:R wENP?S+D˸DޠgQ[ Ǝ@l(zji'? guAbhCqCy;@NEޑ&p$pc@2Py[Į.?^!r8~hRn9mՀXv;rp"Lȩ辸:?hj0vd'(~s)Z?ճ_#r8AM 5AiрՐi)6GaEyѯQ٧b n H zu^.O@k6`k[hnp+s J%}>Bu_c7oh~#Ǘ+%~4q˵ٳ+gި0|EpB>w?_'U(5hBPr>[]y-$,8IpM0xmu3z9#MhyZ}!8\nl_'?XN0tk@e2شAU Cg2UT>@-*H|UXs'od8,H "18Hđnֵ+1JGH0ǒ۠Fn߄J@9R#߀V+h{( %H#NA)  ~I^{z>hh i86KvUK 9ҟ e~xWo=UF((bP$F5pH2Й2U40&- g8a@T 8Аab $}_3Nw/|B?c_8@'A1h|EKnd!J 2W.;$r߻&7ވT#PK9zz-~{R8%#a0JU gV{{gWګ{Ga†`$™iB[isnT? +XAyA[jmO^x4CNM4)K"` {}E=kzeH᳦@5<F8w Vǣo;? oW;lɩE7H?f&>8RZEAUj wu # e<H0<?G:i BZ*A~qй6 qu)$$ dq/!UX g[x^}a? &!I -@)ST +p3*Xհr?6~6d@qڲh -ۖg-,u4 X|haĿjfvNP58B}7v7.p1aOYu;|b2f2LR~bU?ک(2PvRG~3܋^ i+I %SLYZXz/*Uۂp<ۘ}pp >|s}ra@5\^Յ]8jGұ+R@@ T2 DL{p Pgi\|8BN0$ oV,&kAfDT#3.!/S63HB)FTW5>S85]?u-AT*ϷGmvJ^?WG~*0)UK 3>Gﮱw?ug|Ãҙ~[W6Nm9Tg$j%l͇psΕKOY`Ҳ{A;t~3h^(u<>i6F+8!H֨QX>X_?}"9e &fc3Lΐ;\3|=D}H5`l.ҵ8p2{)@B(LC@1X8xos^A9Pdí-w~TF"!C;Wee8[ȰRº(B0"VuZ[Ljl䗖Ϗp Z 3j$ Y৕p7>#[+wjEn!?2 IΆis / s a\=ÌaZ4L;U1| * [IO¼2,\ݸ|/5\FŞ# Xe{We7h:oP.@J|@[¾dY ^O~=b Uw {F"z"lЫax菂7!>e#,@$kTVD\9/3/$t^v!o;zB/' T ˪:dw3 E3b%#h!dqm.VLJs{Q$ԃ p(Jd+˫@') Hl0|MwV)dzֹ;K^EI,0@J:Q$_nqCn>\YkT,^:bp>CO$TUS*[Qpo; B)8YR$&1KF]XB45cT>xhJw?R L hV[^~$"i PH(ۛA'|p)rmtyVڟ -~H04 $Od*as,ݵg}\R+2)]IYMb3NX;2En@"ZqnBV;|Kjٺ80sƓ vN}YH;R=TwF?kyYX6ɇ9hVQ-PϭM[8://w?8m$ Ȥ[U륗uULO}4&}F,{T k4gpf\|:`-:{e:-&AYaӠD=s/zPc7!r$&? Q0$Kΰ= {K囃r^Q{`|qS3vͮ:FSs&Ί"3 %H-a3 FZTM 5arQhHTPڸVFuvÌR^E{ZKi%JbkSjއa]Ggk]\ w+GTk@ދh5>ie[@&zf|Y=_\W= `(F+' SbJdYMa ٩;_Su25.>yyph,gI+T7 {>>=0Ňa5I·}c黨8D`";e$6Yӿ?Ma\!OZfY? ׯ\QɈ S> D@$6lݱpo9 _| مH$A*!;oTrlI+f.QTqJ{+ݽ)܋˵{n]T3{Sr0ʰW])o<ZMG0.Si87.*ۍ~_;vpq*07תu҅ (3ѩM YbFx ǎ;n{?l95'k|%NjbK\3`-׳H+A&`0X>h+S,dYIzg+^k:^}&X, 0tp!*>@x.w&ܐ3QgW]k}eւd5s"j*~3~ݯo#F10Vzڟo$qjp׵hUEEXݻ=,g{JC2T~Q'I/-/bO9_vUQȐK1{= BX):^ѵAwk}7_MsAޘ' r[uYV( ugz½ ?vVu6~Kc 5{e+$0qH0XpȠlυGfIlƥ,ʁCYl>g??k/ >IgsQjL&=W̉¤< h"dYAi TU,Zic,j‹k^nTpX٘A8y&~s;CAͲ֣so-Y0}0.^I{ o6~c\܌GȌ#2Y^U\J'x(茡"Mf%fƉ"?g^sJnO_I1L*9ҤgV̬Oeze_CQȐً0˰^VLqXiӺ脯V_l]XG~n!ĩ!1, {Ao/τ98*ն_^хu{RR2( 4'|Gconax;xa!@1r%?bJ 7)1Wm`IdNdBmRعy. <*^y|p[w9pLTdh?v|ߪz6 8s3˪5 [ӯ_@tFȇ!ڰSQ:P;cX;焏f㉇n 5K`D0 &='! 7AAFPAI&̻E13d"koKe5!>Ԕ`)NYC/@ +[^_=s5 t9'A[Qc6_[v{YwZ4 ejUr=t H]5q2|vagcx"[_Yk*;WbV ("C(`* 42!bȱ,SAV CV|:LGט(T+dF"7AչGo!wHH)!Kދk.YD-QGTM9#KXoS/JaH$unq5@.L=2d Fa$,ñ~=<1Vx[łx)E3ZYl%qD=PG7 3Q;W;Ґ/.To!j #kIZh(t /o')9xP9ثK-,똂V ^Y_k{p`$*[܈?[a io i і}Z Yx+߻W?`Bփ*2(PCL `#tL!4[ɤj'X)HCNMKxo¡kX|k?%0Gv Kk(?uY^acE{pX/_Vh~ecAeSXJG'v8ga >`dKMt SaZ3ffp z0C+ g':H!g iV˔x~ֳv߼{3WZARk~PYmdlZnEӝFA&k3G3Fjv&߮6/DL\3V6#2|hi=X~`i|,) g>Ț+UM%FGCztwJwHtJ[_t.HV-Z55QB_;kfo]捹Qa3T5a+ zIMg:0S{Aopo]2kM>׀LEb( dP0I3% [_P* RyY@Ɗ$u 4p՜=X>hBܒ%gR^/ͥA1E }jcZ9*@&FkZՒF-M3<h#ن-[wlwG˄3 Hݳ)@%LmHW5-K EYr1>K͊ȴJEJxeCb,Ox K)lE l $SN@: ݊Vo^D]Yu4\#΂N? w_;OG < Tp+R }8^yPقr]Ȫ$-/'K?m{'qb(}c iY;'TCzf3֌;4K.= Ȱ ʳYN8iTId̓PlfSB(,57:,Eђ3~;z`{0@52*ϵ`G 35M⩌Jf=(Ծ`E~qX_xз=DH |$-, y*7`^u"iQ(0Dq\Gr?g{YJ>'n ]Vq&˗F~rqD.zi :kEf|oQ{4BU:Bew ,1Ƭ`.IB( ̥Y|ЖC٨Ke5ZQ@c|9kV&ƹ@"mE߼`8H俙qNG}{uk3 Ȃ~?WTEJstịI T;㇛s`ari XUl޾0Z.#׵skS-Cl JB˪{|ws#@DHH(`F ' 52A-$IDFTPJSZb)JREt>>ЩZXPZpye}(#hR媫MM~60XD|j(W2.mhLg{Quכk+k5lj֌V#T k{7̹mO|KԐ'~ÏaGKdˆcYEbS Zrz,,C/"B(\e**PN#T)X$K@jVMuhsq XG s16ѹ6Qہ|t5  E'*d1&jkEi9:Ѳ᪜iu'>{x#> 7>rNp=5?Q*7Ip$ VX!6Cq =V!@s k[*4B VAcF8+Z FGZԌ2MjF5+]&'X`pq<ѣ'(XOi8@j9R)1h.*K>ThrJ"U`^͇v=꾷m!(-(D f K]hŢVXPFzҫ') bEl2 =ht?MRҜc ;E5 zҜc%JG{J.jpYUl>_n:|M!E4m>0nAUn\,"e(ql E*\yD ߿;Лow[op1%\Ƶad 29XC8@Au[.2R(= 3prp>j +V܀l" )cn ʃ,&"n Pz*/,+sB* ]=Ͱ^ۇՎFDiSи(!䆞HY$L7vhiQ6m"|ƐnnoT?8} F d4Lf60Xz?D-82]Jʭqp0te˞ݙiq EZ(ͰӁ01RiɜqSK(bƁ_ lFN`J`O*%Q<'xS0A+QgpX 2JeG+z&sh :ۡ;ݽw;lݗǧ2/v($dI( G%$X 0㺑P DG`cg5v҂OyPjA&S0h,s)U*;񉟏zvSfݒx".0$9pܶk!3 L[BK J)ndƍC0L`g7Wk}(rZlq AB7yJ>B ]7VP@ %X7Ⱦ:)$j*M!`EF_lBРirK63TDp]! Drr}HNk}Wz2Ri%inwPTVju\DYoC>ÏYɱ pk[}ȷCkŠ I@t_ 3>_.kHMS-j+')X;;G)p(ܜuA02 X 8ZNͺ˜XL$U1ԅzP=+.'Zڜ9W* d=rzQ=zg'<HN@tHI{;HM>e#ZgM7耰%eq z|( Ev%~JIQmF!?} 77GQ*ņQGsA`2(ES_VZۉ?r7 ۋ*b !';] }-2I_l&ry8y΁7 Q(cDPƫ"_3utFD 9=@(K\-*Đhgnԇ "k*6ba|| &hlr  c7(#,1&4}#\MN@?@RNTSL k<FN&6[r;[`|nuL=++"W(%K隠Z+ 5Apb\pZoؐ"q6l4&1%(VRnG^c`yMk 4<5X)ڔ/O#N#.8K pg&GLTyXXPP{،CQOn]Rb c"X8G0(L-@Xj^+GeW/_ٲnvKdt+~$8+ ?5;"AnQN%ΰs b94@f\Uu>gb`ē88J4_??r28S,௏UPԡS!F8N x2!>=&C2gi\ ӎI%p(bp@Wb05y5v>N~f;dE̝dۨ]@WJg/ =+2A>/hw $|_ e;Nlsikfd:$`sөET40!p%,.5%Ė%$rp8lR_%f68%(w*qs7{aߵ`1Pܩ>c"$JqCʹdeh\퐘6V.|2.3j~pCɱ'v̆cXTI,degҥQ)d;+&\S{=#Bg*X_aʚ$@&Xu&-qqAH%lL\pvw4}rkk&>>QQ g GH(i}%ǖbkAN_Xvⵝ8&(LžQ,GM^*[0VU=ѨƜä7t#Wu1b$QGQ D:IWn܁„fM#iA8kLґ0T" TMy uz8aHQKJ:)42m`8PӐnڍ9hQL:h~DT$J9tp0 L`)Yz|A"jsL\-ٷ-'qb 2QY,XVW%@aqieC( ^**)ZUf)+?edVxӣul]4Kd,lv0T0kiHA]0=< T=ū~_Zϒ8粒 !`_a]W~NECGhU/xڶˈ9laGl4>\Rq;$ps㚪PJ(iUtv/Նe=h6ҮiF-YraRۿ}@oF c3"[~ENZM '~1ԝ)@`*:&f1mxeyʆa[0EH/|lpYSɋD` ؗa\K&U Ӭ1(9h38P{ K)'D$CZ |[YAjc̊xz}nb}[diCzi"A~eU98XiR,;Hjs Rnj=@.Ix|4/mfjX}|0  ڃJ]љXum6 2y8?."V&(j{ nN©B"+cAwhdz$c1j*C$3Ej)+U]"~_\wx[&b,rܪ?}pxq_S#{NdP.Dܙ=t!|".^G0G_Mƙc.MΊb=!dR6,j0yp h_8M"&!ahgWD4pEmj$qNA_iÊi~$"Gb߿M \kwaO6EX 6Q-e[SYaP,XŚs4H&!o1ڈ#"Z3$L惉sh(:9\1(HAT2MRMgze(s Njn$* ̄$+j-qN*//‰E!Z& EN've3No<`+#^Z9+LߘT{eZ&s.3&n]p,Zr`;7M9PԜ%1aKnzԉ!$ʥXŘ'~)yPE>%3m˲E.G4u_\NOzfYENR% A_y,#)kiUeFI9%cH nߊmix_ŒYf&Q8֘p V'eD%dQ9H"d,JC:o 4_xO& Gg.w< lFCC pP\}f Q49?[' %(TX%+0맹7/dfiQ>X^29oY@XNb92bU+X% Q'EWpIEE\9$clg"D"C(ҊREiW`eP]Y2Lk "eQܸQ9臓!7p<(^I(QVĩj҂p0G,>AEɓXd/1Lώ>j|"[e(]y⬁|Qh6`Q ' i$ih),eSjX~iX zU[U'eW;Wmq&5?b(7tg_f8+$~ qW {=) tiՒ#}EN34Lf+߰:\A|T杶bYE,I"eZy dy>G^&PCZV=L[vE4"XQsAi?X:"EAj"v&ƘՀB=T=7D[ q%АVPf=^dGlM4< ,`} c^RDF_ĕQcI&PL>yvWM$Zߠf=U&1382d^.#l:R6=(-ە-̲5E ( $6|_s]?ђ¶ o/*oߑ QHm_'dDo+̡lQ ,pTZqIX9VGlZ+̇^0j~"l̓hsS1O /M]Ur9j2ҕmHDz*9%"psBE2lWǥ7ʫAŴBDM(Wf|(? r졖 eD1qW߫,vpӔ66.4nsJ,yՓ]@RC"i?}I[!0p3PB\?AЩ 6D1̹21s(gZ0!Ԙ3xER]ݣe&`*3x}SM'`,L[OY2+J\'?'RR(,8Bxe]UVSP\)H 7HU%Yv]Դ Yǧf*!5ɧ_Ps 3@Mft5AhJ"J-1e>e "mJ6=мFѼ7^IQ,w(L!_!QLܯzPN̔%|]G %wUGe+W/t7:jmys2Ȭh3 \<x'')9yksQM͵=v̑?@cŜ'Ѫ4,A*(sN~%M`nU!䈰Ev}ͮԖZX/#󋿿+yeM>T8#0닃3IǡK2PQ7{>e0R@2=uhs?@<3tP*hukl²9ߵ-SZ*0e!j>6TIn:Ei @]n̜? 9`ЮErQ,lv"ERs2TBlVtePͣ=XN^Y)ڞyb>hܣwI0K ?%18 Onp(J5L3KD) (fY ҕ+P4E>Ac*| > vlY'YcH i uN. Aтܥ>IKz7 H $ki$DbYy}\-rh}LJY^ȐcA,*bu+u.plOz=1R٣}= 4Ct*ePl*$RɥMKىo?2s=`=y7UXηȅRi] VdːE:0qR;tyOR~Rx`3E,B@rC+=h윖0;d5KW5ҌqG e5*auN,rgA|g ~>ʃ=eՍlrU;2 2{mSVa]PԋYֈ5i' q(آ r/X6uO X74;?י*jxՀ,OAג"K;\)́,8)AXe M#^a.T&˧ 2,Rz덈 _ё);Cp 0)s}2!nw9q6ݗ"rf)R1mqOMz)DR@)LƲ(+{@$@_0Gys*t0^)ANM}oB"`(DT$eǬB̲bnJjt!d*Y*; YAHx1IKZAvn$ݗ`HNA!ɦ>BE^uNte74&a"A]bAQ` 2тa6c@H} '_⿊<1@y6g#1SeR+r6\T յ*pr(q6·z>C%fVM-B3Ag 'a(<5F0.dUT` 5 0G>}Et=AXI^J]m kk.XգeUhѩ`d8HD5cB̹OŗXXCS EOdAǐ+s4DDL.+6EEP/lF_36.8,ݺ_%Q񜬁 .nOfO(o\˂)-\60RlJ--EXqג Cf L bEiYhƀ(ȃ|FY,BT&IREP!fQN6·x̶ͬIƁ |رᇰewrT1}y u<]:ghNL7@Nͱ>WDo(  sMe `GԞeC9I+Sg߇]x{Ӻ-h@=ZΤ++q34gt$ RuRf*J#R0iVW(23`3~C7}H "hL1xU*,y>LĒ|.c9e.9D|CBQɝ4@шjr G#%CR*(tq2K4T˔gC1$C&S7U l6dO@ŁF˅W  MIDL#K])V2m:RD`efU/!%(d hTKTb%F x`FK ^X^"),[E ؅d[E, "`߹ECM%CYsɡthQ$P/_v[fhHpj-u SI$pl{EB=*;-`I%/%D!0+&Y~'0.rW"{h,5& V?w)A2ÆEҊk4C1fk5(ɸQ0'Bf0~*dV ˔O'Asx`)1@!QesoUWZ Ń@ :@83CcW3E>gf g"CKwYyJ "jUi8Wc?( ih(Wg T1DK"Xd>ԦNސh֟ȉJL]OTm !7nzQ#dn֐_RA4L9(FϧQ0At`gՃ\j}Al1DIPx d M, 9 QPz*HZGl"L d[B7 dFkG3~՟٫ܢp|1Z >{+NI#ȃ0PWeD)+X)k (XəESM}MG;-:;p+B8Һ#3g {99Ta=2t7@Ȝ\4Nj$J`(5<!DbEĒ*_$E T^<@e.W+,W`i_)"֟`Ȩgd34Z@\\ %,K!ۥ]ObA`xLPo$V'^818 V$t0ƃܒk (54 2EEl@5r%HnLQ1q5pE2zв(?p&%GԌ:2'$2 H| 8ȹxٞݦ+ > BY$|{Qm&KȰ"ֽ51) =LzDU7_ YE^ 0w$ yi,SĜ,D"z1 yAaXFSa%y()<+x1ًi&^Qͼ*h:-CMT51Sq!m)(H.@NQMp '|0 y43LQD R4S8JRC45M.I=F^]y؉a7ax(TB!&a2ӎ4$CP\f&7B( :fؐ<4 6(fb,77i pL nӰ2m!DczZ(Mmn"h=#~faSQ$ Rt5:F-B܅w3PAr?dz丿{rY4M#.\ds0D2Iy1f,o9.Ѕ {` bb ńK,j D i]I?frRDLѩPYrk 1l8`90? }u %X;؛ Ϫ?lN2*/TF?8hyM 7kq0 X_hJj8{m| MI @،:&!Rϑ, {䄃 ?v(FZY,2`OOUsoCP8ad65[f^$Ib1x;wDjFϡF O궺##ϙrZv%"W^?(upANRdIjAR9(_>$>8Exd+J> S[E'iԟ.1> qwvsLl1S L290M"$St܏CL<9A.d> 75˱w5p,vB 2a7EI}"~)2>_~pf^I|ʼn@xT8.ujy cZA ̚J.#IH̰I\%& LdX8?`~ﹴzzQQ_?fUӻjUÎnؓI$]̙pPP4yɶG;\o+]r9CO)UD^G^YgXEe&seOD 5(ӨIVHfس]Ha"UA"V Zx{#T6) ͛v`Xh?9=K|׀c3}p'Я{Q" )K2{Bs?ey\~d 3vٓ ~"[aߌ; sL`3Tdـ=z$@,@3n f.gPk{ZðhnW2ȃ}M RXyB˒WQcO{xw{ķegc vH=! )dv=)SA7"֧¥B1y;JIC˩|`9Ҥ\JÃzi` pL »(V1Ham! )87ů9Ps_1˼KW{o)C :Xس 3~ѽW蠶 93)HJB|5VK[c܋^bTn@ȫE`xs98~9ܷ5pb\z(̃̎jY6Ar?b\s҅l[´H@F^C vhU=`l9UA? vۂLm^ieeO=ɃMdE +;> %<=.>PFFvi0}ڋDDH0:d|d3>h0թnp"$Er~f鯉 sp\؇? "4Ŋ{c3F/W\x=x';SZf( ){VT+Y`YȘIJQ0Z֭/=BbxQ[DKQK/{ΜO8z'Gt){3kaGp/g﷢C@އ\' ޼%#ݔtF!V _[I c%־13;?HL~Dm* H ߉Cܸ\N⬰o px=ˮ'2OU`ѯ{/v5t`3cU0"`&,y5S@º%KLY>݁ \*3s%7?QL9LM7yV (D~u?>C7'*WIeA@2;U]Oc>.V*#5tх)$v8F PyE@ qD. 'p2yctX <EaXǐVubBAbJVnQa,cJ ~Gm~Ty0DRY܊|Fܛ8́r1t=G({3C\ws9QHwn8sߪ?c^ h=adT)C!T&a2%]~a_e~t9~ #yQh.'0'c2IFX fsA;ܿ(l#wmW?^%KN)~H?Y拐PxHن^M^iK$=~;u.XwlemwNf_̬,0cRu@R?8'5W j-VaJQ[`X, y% CV \(RAv[0?n-oÒxCv8#^[ڗם+V7Nӳܹ ~:VZ̟~d 1+욪k!?Fp2?L{6*K`CǤ2prZH8>ֱF2gH(wl3#HK'Fu^NmO*͋VZRs5۶b*SyvvyRʪQ5-SnxѴ2fóβzXB5 @b8ٻ~ VKNc3* 7w7W !Zh7z\Xh$Xh {)#*I9*Uȹ6VRa]k֜JTm˪Zwj#gEP )!iȅ7h9ߧZ7~ompwg ׋|k*FIi9]@ )ڳURAK.<?vD=@ qD Tul"L GM"RT:OlmY%²MmBEEP,bKG}m$e&ȶzd5lj* ($+R&5P E, BbB_|ZLsP&3l}ٹIAE"u "qUUXI~*e%p8D*|B1* ,ΐ̞'3Hg )c^g9)HÀ @R.Ɋ݈g,RT>w_,IVazءy\`4Qu@"Q:le-1@RQ!-to$ײ(H"`xhBÜ2&$-y:H@+gCc;_n|:jQ ᰱ+刢X5 8!YJEKXDAP@3P$:. "XD 0d 'qE_d>J|fU{puާc#TK`4VUpp|*Jľp(Q53KaPeIY$Y]Ej +r"jNccusû[9!*EuQT :hfU`׹rcQ. AYʥN6)PM*ĠDnD= ErT%SقG{[8}tCT'yp Z8TiN$b0Ԣ^UB A?C)2,IRcpdQ*E>*Njd]`}^/ƗT7;a쐨AF(Tգ0pjUJPQǗwdsK&MGQ9Jbr,0J9"€qH_a/u{Vmmwo! XB-[3'p(HjZW*shdhz5)Bi׊hdATK8::̀qY"T;;nv??|??`!PO"ʑP(* H9#0J5}PSd46O|t 4!% 9jZxSc- u66'77wZ X5ieqUB~¼J5ᴁyU>ʈ!Еh(&a^vhU%"0@2ZՁ, PpǗgeD1P_:Nkgw7X;ޭ`HF$6b48hrhxL**L*eN hK8}s4z!(k^ Y( HԼou?W}Ge2P0D(8b8$Uq3XEsh oUXB2Dj6$1 O)kqFAPF-^V@NB"|`?ܭ~@8>5 Z:c~qHQǓ$+h k&ƣzS:5rAd5-x\6:k]>Ypn_F%Ȓ0^@y8c'8GAaV豪7a W@nRP!mbDg<+cG Ayer =w@8ɭ%K.cm0 ;, I)Maڋ4)ʥ/EzôHq)>[l`يƜ2\R6Z8נ ô_ZAɝ.Sx\i Q$Eէ+>`0B5M@ry  3t Ui/ 8N´ț̰\i/= ` ^@ )|Wf 0LvLn`Z>9ƕIENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/0000755000076500000000000000000012653527012017637 5ustar devwheel00000000000000DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/10x10/0000755000076500000000000000000012653527012020410 5ustar devwheel00000000000000DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/10x10/back.png0000644000076500000000000000025212647526530022024 0ustar devwheel00000000000000PNG  IHDR 2ϽtEXtSoftwareAdobe ImageReadyqe<LIDATxb9s&`-,=BH R`bf(f j`¢&€0=b| a&,j`, 3QpAB `dx@!^IENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/10x10/play@2x.png0000644000076500000000000000034112647526530022442 0ustar devwheel00000000000000PNG  IHDR tEXtSoftwareAdobe ImageReadyqe<IDATxڬ 0 ;b.m;)P(!I-Rk=6vxC̃)̎=!qw20Ԭ^}PP hByd)hNA_i(s0IENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/10x10/record.png0000644000076500000000000000033412647526530022403 0ustar devwheel00000000000000PNG  IHDR 2ϽtEXtSoftwareAdobe ImageReadyqe<~IDATxb9s&qCg8LP >~@, ~P BI- HΆ `ƣ$R@01A /,Ha ţ$W < ArG`nb /xT $`pIENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/10x10/record@2x.png0000644000076500000000000000055112647526530022756 0ustar devwheel00000000000000PNG  IHDR tEXtSoftwareAdobe ImageReadyqe< IDATxb9s& ~@@l7x oY2`a3( >qP MCa:0-e`1' p .e BR2 T0Pd@oo&h2(AE ~ |AE , V"VqA@)mʠ.EJ2)V|JV փH!T_|%6@h=Bت,1ʉ(IENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/10x10/record_outline.png0000644000076500000000000000043712647526530024146 0ustar devwheel00000000000000PNG  IHDR 2ϽtEXtSoftwareAdobe ImageReadyqe<IDATxڌP @JN:uQE<+^ޘ`D{V0 I-p7 Ujw^h:>;bXґnBU%!ʧpDS4ӆqX0E* ÙQk=ʂ#,mۢ>Dg1Yf0dӅI`IENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/10x10/record_outline@2x.png0000644000076500000000000000102512647526530024512 0ustar devwheel00000000000000PNG  IHDR tEXtSoftwareAdobe ImageReadyqe<IDATxڤUKA)DL&AA!AvGO AxOBASA<,}ok7z}ߛ̷;f) ψ}S#n&jURT#0xFVX'6"8mPhBL&.D&qi-z ZDwL@`.pXg=dBz=0o0Ca/CYe~#wte\\,\JHHkCW"Hh4ʥwt%L4xJ6x|m<2t3]-J"NoyoŢ( ?v|ޭwCWWGM*b>Oک/;]4`1}TOf"5u>&Ү@5{2| 0{6IENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/10x10/skip.png0000644000076500000000000000030212647526530022066 0ustar devwheel00000000000000PNG  IHDR tEXtSoftwareAdobe ImageReadyqe<dIDATxb9s >€?`b{ > hG`(uL :&*x:&€IRǂGh*8H@Xm 6b T5 v;&(IENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/10x10/skip@2x.png0000644000076500000000000000037512647526530022452 0ustar devwheel00000000000000PNG  IHDR,tEXtSoftwareAdobe ImageReadyqe<IDATxԕK kX&^̋pKY@BA>)Mނt§LZ띈6CBp6-h=[5j"?4V,ⱀǔcAS Ҧ!kviSq_(5]DKM%)&,Z4B-"N"IENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/128x128/0000755000076500000000000000000012653527012020574 5ustar devwheel00000000000000DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/128x128/displaycal-3dlut-maker.png0000644000076500000000000004666512647526524025610 0ustar devwheel00000000000000PNG  IHDR>atEXtSoftwareAdobe ImageReadyqe<MWIDATxڌu?+g0   "rER,T8V"۱Xr8YMMscY.Keu%R,`'H 0Ξ{r-<<̼}sOsD ̯Sw˧77{>TowG{zKysLajj΁(#o{7>?&qwmWqNzt855{15 \I ByONlZZ<yC{>z9 i=/7Cf)e!6c 1ݪ *jbiKكe(N:^@M}1e S5`M%zLBeӎǩA(GeͲ1;ןZYu*ιqI~=(?ong*W;/-ًO,sI/Y=`TYwT?KqoGFc}vDH}Q'w]Mp\>G]#}3?{7b?Qп?>%]nҽgUM8N[Pw} BqU-N/S g.W5ã$pԪ暸DzD-"j>񎱻Y=V-ԯߖo I1O@s$O~5j@ͳk *EVCdW;g/~gjYNJ^1^f/OFq@W<"y(:T<}^>|C>AK4[n:3'H*)3(yrycj6^=`uZryȱJ:G˾yuVb\" C8xBFIDZr5H}(Ge{U^k!JOԩQ67|DMB< P͑byټ8) XGAq?q(OG2`Txwl^UQ2'=|2+'ǭ[+O 56݊,] t61bٝ _4<0'o ٲOZZQs(GzkJ)eJQϫ_31jyiH(+[ <@uybȮ!jI0 yh\-5z?qC^q+%WHL-_$<#gr%QBs"Jl-ufֈ(B J*N~Ǭ}^69PG9y^Yrs~HdZ-ֲx~8uđW${+"{+_@遭gh_&7u'{œdݒi DGSW[%'E% CDᡦR;d֘_mkrF4qaVn` ݸ#o02L^gmUNHR)b^8ټ5\M22}NAEVNWPF(/AT8iGD3! hWr5D2A!vȂshAHQ&pK3OZB5=ʘ~T;6Bo(IZ},p5_'yqd )ZXᗖe;/P}dnr!x o{_%?WBb-7@TE8vs[~+o}p ȇe<;+EoU`dc0;LH9~m}B wuOL[Vo!4W}XYoesX|EF^x^_=(3ٰwevzGpnoQVkS(V夭WIIEz9SڃPɤℬk?+e(kVaFWFww:NbWצ [Z(P5xQI#E71ܴ@ r}׼$wf;_蛎!'J mH|+±?#|iA\^TlM>%,ZsJgYGт C&j'ef~p([b9ZAW=3M/,8_!j`L|O@yQl'k+Lk99E*iejeg+w[[+J.6oڤbI?]y_w]U_iicZgrMu#wKըW~%V.P6"^K{0<ѣ? X];F6&8[֔}„;@iiZ2-:(E\΂~wnpgx?x j(gZhkDIxL2E^wKsN!u->y]J( pY!v G~(Цzul2y;10`fQuEصkFל4˫R!d8JyC AB\FoXM˱1o#` !BmU a lt 9#*yEQ;E@rA&c;\x'S6JcB5.5y}ٷӚ!+.SDU݆ZV L ( mr`rLpP7L}Z-:W %ƼXr[oE2+-1ao8;Bm*Xs{09T'#<%y*/äcJ +S]A8 %0T|A-y y\2r\ cOc'0Х]`wDh@i:n77֓pyDZc8˭H.dN ^iyHkp7١x2__-7sGIt<я = O)lڜU:bH*\VrGV'?1QOfYlPƞˢMƱӐ?}X[7[-'Q}t6?~SK;0+ĚEЬ=. QyiT¬Q E^?#d*ɫiCQ6Zf5RD >0OYX-\cݷr?e=eP!a{53ǝJ)t:9ͻyw (fBxMݻK/} t$rP 0L825N1rKdH. i>Ԋ6Tre2A^aQAW[ނkfJg|.ňX)ܡ|-&e,)Ө'6;_;^GFg[qI1/.*I\et!7NY]ضmvM"<\kJz뮃Ź/zdf)wr%9 K5f8AXA }*3qyTB6!lmT{ˌ9U<a/h :rjOXbR&7]gc&1$B&U(Keױ)yoⅿ,a.ADa7&S܊˘qW)xf(B>$='Rxyp 2<{RI䡦L(,jxոVKrŸj69w;.)JҴBgDAgvSPhUXZ[ F}fQgŭ!g= Q ^A(x] ;sњ.fWQ8cؿm?nEmxt{]~⯱k.c;]M[o†)+ $Fmв 'W:],T'_F\;K^Qf۬vgxSψv0 u}`Y͓vwCd.g+}h$7P<'0 i:A 49ʴոW֔=m\g f=y=_u [ncC4\sn&0/2 /-yMPq5:Sȸ=v-+Zh&A*jR"L:FA\5KI\o $oC`m+;qŦ+0;kU{ y 4܈g>k)bVW /ʘ-Ta"c67>q9 Z(PVZOV?'1aBIL_~9VĮf^@f<=~ L5h#v.ak(ggT6kmtfUA؁B@0@a;@ͱP}5,jIV %kP0^z!Ečy¡wtEXܱ~v0!'&fdw MK3ó"VZO҇ OT5~2Aӳe= atV/RaK7[X<|~b} 7۝#\P)Lkb6*RA0or8r||Bq YӐTIF.o!LМԮ LM[nʠ{bR>j U&kkvU6E1tЖj 9֮o bD-:-3-'ȚE xge0j6kER+3zy:[YU4]?{LujG5ȯTŴR˱47:%ӫ"_P%mJV=L9;b-4'6 TO6bMo (gωi|/zC#)V{9ZChkL_rTG2(kZkQWLBޢR4(hs{*Hfgg}.?gEy1###1JYn;6\M,:sAj:0Ce&  L$,Ts%)1Xk\* n,^uϿ>}wGࠧZG_cCLNSz'Onguy:89SZ!i u<ɢehKBeZ- !O##.]V977;pnsvn.:fU]؉?+xvMpHDe ];2 N`g[*J Ei:͑_hGmۭzR*+xYOzv[8jf櫁ڠڹ즭[+ReTJdyTtF[dEuNP0C J8|LJpa=yK2tDc_by7bm+~",ǁ%Sjb)9ƠR*~Q72+Ց[EZ͢P7qpAqi˨WaLH_!>W9VW lr E&lgcFMxȤr!}،)"k8ѩ*@6[m|sK~O|V,cǎlyVӉ :gnLUSv&D[F@WL)S$ RDA _T%jUQح ^.`Pي9yL~"E<-aE 8Ks?ѷKWsOP}+Nc gA&h/c²tqq@+U"LE`6 mgLr[[8gO@ q-{ȼrժL!3ҵ޹p0VWPռyEH`/v8pѦY7d o:y`pfE]4 h:ǘmbD&I ?tX0g1?~ciy` hDՕU?Yxcs7碑ء'1acCX5^yOM* uf†l{srCЁrKR7344ZA߇N*}:٪*^JWUyJ.,^+1#8Nٶ L~E=">Gz-k;$" 7ixΎ":6Y ,b͙U1"U5$h&7^zr[. ~t_nL8ʹ5 hʋR֩\0QA.F> em|U>κCs eTDOF y2^AlDtů:ko*Ѿ$pPLj=٩Q[ %Ѹ ďBJ>Jt壓35wFeDCaA J3s0At#d~ĉJH5bћynMCtؽ6*QD,m]21g T$2,Rptnan>50{,Fen\'`:-\M |fUd%7ڔt&1RW T#X295Lzsx!09cӓOwQ_ɭ|~Wu„f;drDw'*j *(یώ`Hʹƿ{#&wMx/…q/\x !4Э9i^k RIB^&8un'%RȿP]"su)B;vlw },nkwbJlrqM1n[7bռg=̕ncfҹUN$Zy!ಃ[{QCǑE ?Ǟ V1+sEuO ={kVVmlߎW^<(J^u132lw9p4ĒpQ=.)̭`sXocu~g1}ԇ Woum.]?>_:p˙ـgvFupo\LUKMgR2֘-q]oĪ;{OY!t5.~87y)ںsxq<%⢓A[*tӗ&LljO`:lXq\y0ȖQokf WaB2C!Nՠ0?U*\%RЍRJYbO qJ8e{ nݮҒs!e`bh(n;GE81h˼4DnFukAЋT*Qz};$ `Jb_.b|' )KB[2*cq4V}RgCE ^_]4AfOqC#7un AebV_sgъ(}[̽wpF5ts[%·2~<'anE6a5 'l^ZE 9ݏ)Eb׺vX)y,RVl_F7B .7e ۺVBo=) _6Ffq93Oگ:gG6^)Hap/f!^ot=t-rph],Cuafsb 0޻;Ʊfa* yex %DbY*uv-X= hW5x vOaӎM֖WE\ 5:#̬Mc~TD;j:b}XvLK#)R Ƃ'{DݐrJq D8&oA̐Ke=§c(f#iCD2Ƨ0˽ϳRSt:1.FxreYoNO80FGۘ7ؙ ܫڐNvp{V> p=}XefhG̪~H;#$L~7/=/(Po;Ay`Yr$J6 3.13kDFۈqo/CG?UE1/?%l4"7W&o0vnsnr cl1kDvdv\Pٽ"#r.S):Wg3f *&7}F5A_dpղ6_HXM _dl+Ԗ˾lc"PNa:T:2UҮ^{~}ΜYZYj 7pC\6}L'LH8Dzs7 ݱ)6@Yqu1jC8~`+,׊#*gbG)`Δn .EF A6u4WȢpN\d,%>bUciiCXY@\ivE^/15lp,vbxG1""$le^6q!QA0k7[b5]uJ8rhx^hei@WBAr%UcщQg \'|T{N4'l ;rZu.]a_nہ( O/_\DP.?(0ileYlqN4H4*φEa߯9f BM;v oJLvwhVcjR蹩_ԯm(7.7+r,|#HcX`cfA't3.\D~c2=pGA+fDa^rac?!k`,_>"O]'ʵybnGVݻD`H֡72\lezX]Z`۶1<8Q7\Q 0% vP{Bhg~ܸYr^Qo\~ " 3`!,BU5Ubl QڀuU<5)+0RoK nd aU?4M8SƬw3oZQ[-Ä?e(euUI6 5#h }QX֛;\!E1w˜}JöSJYLTQ>a.C7+| xcx:l.+w>mrDs6(H!6iHP rqY1kBzYe0S{G_FKv{lxqYL1T(F!vE㐼+ G+h 4}ȸCJ(H z wtRW:'KU߽o'JLQ+hU,0I8$V5=jjf9 *UUX8 㾅HwD;V̫*yj8Sn%SMb%Ʊ l #Tdozӵ([[vu ?E ƒX_s3p? F10G! q%>Οߋ[oU}z6&ގٙU,v2msϔdGOxk"ԙʻL DChDܗ|.*O~s>Z?8oJ\,,ڭPQ1:Uu6u*Vݼ_x5"qQ>4Aј.pfYSp W^%;&pU'Ec&b [p!x9p㻁+(}_c(nDE|lj0y9pܦ>-*(S%Z`dTV')g6wBu W"ׁ  òn8*pto4sd~#FD,7p<4@iI8~rwXR5ׄ̔3} qXe~z,Ɔe2ЯJ&җl(݂{ĎW`ON9EXm&^z<Z@yD5Yմ-][ʶ.{Pa`RRhrvgϺLiy!XCBZK? ᒚ$ QKV\0^c ӍWN)8p(e H?yO/*wMTCr`s5u^"}fF ˇ""b7RAW sYBMSTiN8 F Ý<Վv Ug20 K # ;~CwUc|Z!xf%-rܸsA 5j[QepP6.]`q_gI7R̄0VWgM!INTJp^ؼ!! g`"C󌑉B{5өj`70?"N'1JGQ'4TDUr#&(^b xxB&y%f b Ɏ۷Vayg= `֣U\9WLǓ-nQ3Uζ7<14_3_Gزl3G3=ʞk*)VPZhNP1s :ZznCXV-gq\@B?M6o0Xg9=Lx+ƛdJ?^LW8 o3ydp)ne/ LIs>/X4un~=1GYzcb{%B t"Ң|>oMuq^f« FPa1hBB#u3 A!Ʃ%JҫzaQރ6A4S2pdo|lRZ.-xTv_~3Em±"oDT2j`@Jwm䗧Otg9 T(#v79b)jȀhvjE?3?,*UOzBv_u1l v\u\|,) 4p#ݶ$,:tTXQ,nSKq֏sݸ`:ɔ!HmxN#:+}&]RQcjf>d-XfL~Ѡsc"+ᄁ |?FϽn^jYb%4&ŵ؏\B)AX,g%Y*0.irq 3 D7 ,*eJ$NpNukYUp"IFᕃ]߿( Yc3TH[Mf`0>pq#jg2%C zFD8VTJ*C( (?048"p69~JWǏJ08\ZB\W;y$p/_Z f7 EV3.\αʁ/>O~B^*e<,w] twg3NQYPqF/W#y:5)_.A!D79H)H&qm&H5T8{3BA*LkS](nMʁ^?UT/ļ+ea<&v}D!YIQ+B Hpnˣ>ZD?9 `H,.!>ӥuya\֚kl !+vIHV])l1{b"΁tJV@"T'ΨNh5͔HaEs֐"v2D/(B^86dOq]Zа(W_+(- C&E&W*SZpª0Ǯ 9L^Z>yQ)/bZަQcB`OiHS"Ɂ?TAlMC>9Pp+SM *(:Q[r D j LIU{~09npt˿\Xch|L#|>55D3+MQ 3z. YLmZpk:\bھlư8',Jw~!I]v*ޘϡ+}Q\?]H1Wt%KYWW'Wx2RVGyRӑ5eɸB{Ή6.Q\/ertt:,+}_J-d%\#f$j,׬=eÄv* ҅ (<ɔxIMmpKd&#14ͧHV_^PDqh طEHw$UraW02 P/2DIeTK}'Y{rpcב=Kĝ?*/8oCjKHEdK_k(0EmXǐl^|\.4Uh8Lµ9+RQD֘$L4L_UJc~]b0$ 2v ;s(:R^8sYHag4z5+U7/G4P_#]+Nr%XVqDm?NVHg?f?aKI8R72 _6ǿ WM_Ci9#]M]6iԵ|yC|JKJ"WL@DŽ^iRWN8+vK2Xb/KkbciAQܗp?\+l TshrZMògLmr)E4K$$CH0{ѻ7 #/t ͮhHxة(2b\h*_/4+e&Jt//`FmIENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/128x128/displaycal-apply-profiles.png0000644000076500000000000004247412647526524026420 0ustar devwheel00000000000000PNG  IHDR>atEXtSoftwareAdobe ImageReadyqe<DIDATxڌ} mWQf9㛧 /1ȤEQحvvunnTFEdLa@Ȑ7﩮j;{ή5~UOy! "^wQ88}c>R=쏃|; ?ؿ?,-t/P~㹹j?~4'Go6's1<wwp}MlMzw^>,%տC굼ξ{O8y'v7? /-#Sz?i"4O'L\k Q=JW,W0^gRV{IR8/5\Sdn(?~z_1_%̘/m Lt}_coaӹQX% Q<+ 9NT@o FdSv((^"LEkK'u)W6:$G9UU y4.2]0y?ͷf:T?4.g*| t͢ du>,>KM KPk" $:U L#Qz6'}1 B%:Dø8qCl4a@%T^Hf;/}601?~;ߌK+)bsK;FpHBPZiBN=#sM1aYߕ;9,rZ  P9k)^&ָ֫ O߻_~& }ߐ$vW ͯ(qyNxyq=( K#_7Ң.N$s-H|??o5QutwJuI B7c*r\+VqcQ!w2/Ո)~IfgLď= 5I)Ľb|-Hdԑ?qk ?F@{9h't kI.lANhrBm0JIZ 7i"g/-lwfz)0>aqQ$l$ j | Dd/9oKêD_f!뜌 I$H\_fKFpw`YOc&xүbFX$m?BS/J<@aeJŢ8sO/YJH Y"<=`: z>YLw?@iFE/تi֘- >Z+EU{i!{ّ -`3W"rSE5F'HQ 2d dEuRΊaP(,YX\U\*UH~8$tau}^SI]`9#:Ĵ@amaL=G{ٳXDh|X|4 6r1p#X?΍O>%xfMa}}ʌzF)96DIpi?:رcIhc]4ұDh9?Tk<S2ɸ&|?߸L0:tp,i' 0>NM83Ǽ^p{b-t08f"VB)" 3_;`d}J$)zEXQBt'#Tn`N\E㉓PE;[[=W4@Oncϯv@)AŽ$4ֿq>5g!W#a߉|c!`o|оDqqZ)ˊV =c`n%BQ A dQFQJ }Z/>ޟ>$X@d&Bk $a㠲6bP9_Yҁ_| { f: lr>ë 2@EԠ{hW!ŜGXTI$vet AEmA4%hXq&:?=D 0S&@Ox o@z&@ЪYyi=4J&?:6?Č.ckO-hN4 .na]V }-G`+8JRB(IӜQ;^}{ ÖͮXFqgU3Z6Ib5, .ai^F"hd5]N:ӧ+2ATEU3r)IqbS0v(!?(NA&zNj>n+Hnf[Crbc&YW!\ags 5m/"PbDaDLX'Xe%,ۊ#,|q12^Lה!(&R/DC :>UGg2,1ąEaݘD𱒻@thtxSo yMt'ahTL7ՒIl|; /x^t.[#}IFlyI+`+0N QgS>nXK`q'Z DvpPxd:^NW&AJ fxen/%x8_RiS$,Ș.>b arZ6($1+Y~>pT4֝%)׮Q"~NiV < ?b}"g[XU#_Jׂ; ){9-> 8 -/IbTɯo 4w~߻"~`w\}z?DŽEwF˻~߾qf(5JyXh 8rB00N^.؝c7لmF';=j<=!8v(TE6? p-S&R?we[0g?K_kq7Fs_=e|a/}oC\}zqK#3ض G9al'N;E4 ]{k;kPGFV$+C!CZkH$5&=+#OkĚEY]3 ?p2k6rm^a&F#lԀ9}_"yߎޯϒrRኌJnHI7HF@jǽvMآ 2ƧRVE!rJ^¼xw_"lhN)``>wȄ.w U=*W#7sg,ecys;!Dsl{;$݆l#$DTǙcg A1u$=qa3`n }6EM̔U` k=^#៣ `pt}b98r {|̷*VDBcш)Ŝ&N#\V[y6`&M?Իk;l"Bp w@a Pmf 1՞A5/v|*Ĵ!E~g%:H3ԨZi5oq}V6BAsw* 6V.Hz ~WgATrFROD?H(a 9_<{@c]r2!#@q8HƬQKVy?"v?Q)IVdYG;j k$;IXȜ&3.5e .?6yL {>Zֵҕ_a?$<=2lʒji !`+9z &h+E^ &9&ػ Pr_AԽ #+:S8t /|T.ј>H ;LRVa[` 5oKdY(rD{>=g6UK:I, _]2符?}A} ,!R2 wxb5*{fZj0ƀ  ]J W*۹zYm`].Và"}D[[PGTvKE`Sxwӟ("Q;qf{$rv~LV[wKχ =}H({bτ:K/B Ȣ[ͷ a~|ha~f-AE_bwhL쁨ΪKMPk0V(ؚ"<ٻ8W|\0H72ͫd'uc T/ܥ_Pd?[)rNo[BOPvD†[R-p(Y2YSVAV?.xs>s@sF z@0Dns>nKvt9ݡ1|A脴ȑO ED4ÁRz믣jʄ sUQ8d`YD($GYR6` F (ً@V Lj; );X\,qqQU0nBKK2i9.;B}h5"J.UO >=y\*:MU/A϶|sV+'Oh#03M&5{|B pwv8t@APNSdpja#*$Ɨ2)ʜE͍\׃l MɦT48Č4R .Z BK;`' \"\턞gcA{9$~ (%VoaG?{( kh"/ATxU~TAMPZ鵑vUF  ̰+]s/k|DQ%݆V7fαJCDldVQ &3TBዓMn$rmtv3C- (51D i!hvQ1fJ*&1dZe*ߕWl`|&U3D=[L@l. T8 ;]ڎ2&" !Ih4Kðgۂ9C~qM 4b >:LztY~y$I"#ٱJ~n$;*tOl%ގVD- Ӎ-1~]-tyRH! Bf]nK> 85jEbCyp XlNj ĽPcGKbڵgtmJ&yMg ]g?׷ (#M)I|s;5JUWrN\/`]%Aop)QՒ IxMW:m3W@bTAH!Ts 'vcDI $3d4[.ȋreEɷUQ.%1v*!:FNS~sK\GtG| uԊ TL}tTw7Zq$R%֩J;C9_RD'YPdG_R]? G+ У UX94"RdfGSGQ132"Bz߳AP@4ھ?ѡBu -8 0HC¥hPcٽ{+/^fofDtM$ A#av} c|Uy" 15̥„ v}/4f@ր՟Įu9G0s(5|g!6Xm@ൟEE>bx;YpLAl##&hRz LV!4A㍀n磸h h*% (iY'~ 6A"^v9NDF4b ߥ*m HC)b@ XέHGy3s;?ޢ;hB0D0Mmi/%@SN5"FI !8 0לJ=gX ֲ6* P>J$Ӏd+U$LEDf!Tw\h BwZL#GFlߵ15N[J]6YjPw]7x34ܦ9Xg&.{J*gbl)&!ć3$(gx]^JJTk0?dpv/~3=@#HA_\‰}Fz4fCS]5~h|KqQI {T&&T.q g)׈?(.X mgΆ\9λ>>D'<#*V@$_DG(JP5cƌ"2z&|U Oj'@WzH ( 蜧<AHΗ*M|^).|N~}LA뻑I:W_Fd,r(4$㌡Luu0 K=?(+}2,[W]gMwz*B3hcaRЏGu!*YXDjbLX>  `Q|y Bg{k9djhZ *Mz@~V2U@Z: W>j/ "v1(/B' @^c[|re7;%*~`PYNfѭQ>^SWؚ^2ci# f$N bΨL`͜bl6Q'<(ߩWg7W_F&$U(~tyN`l#TfsmnJPR񔩒jM^3R@Y(te=IK69;s $\5Uu";&bŎIuWcկ~pWo!hw{g"I?}*?O61D<9$' ;{ `4 .83-q̨}Hri X`?ex>-\H+{GS:]?p|skËq.B.)ƳHE8M f5Š.gS~gmP#C} 5l~,t2Q*`W41%p&{WӕS>ٵ9BR`'ѭ-%UQإzv @A%e4R#vwnk]1Ic|,nyr$\x=W3_QtPQ"T3r q}l} +,:! q'b]k1I1ۓ _KZB_MZ%stnoQU$Q"jg$T3Q4AJx`p;/<\BWDT{\<k%'pl'6\\+ܘ.X_B\52{Xo[nZ?,a;uAVe8kFChyu/܄p8ۅ͔l|wg~aHFoHz$-[Axi&12+]uxተq_卻ƭpz tv« Lnj{l B |@!`ؤ\/Lh0M`#8i;I/mxʝvnU)Sf"bt zd1":tH5rN(C[oB./E";AxG]sXf->o\;ro ؘ,5 ,2gy'd9A6ԧqe-<qkj N2M'.ghx>ؽ/3(z9 d~ѝQBļxȑ*PVyJ"&EdkLxqt3tg&X?ݫNi hHt!5DC Va2*zJZh⣖$PKi*0JĿnk:_ŏQy C /i9,"VʥACS66kO `y;%) vހP( P `NjN赱 + .P`/[_(gŜ$35f)Kưp^Eڕ4]wBu_\=O̬r0j!c>UPIvhX6[2Yu`d_ 26/r T#:˽Hx/VZÔ+)#Ͽ {|!h_eP領b`HCNN'wW Eb{֧5!6m8)L+cîZmb`r8}KazV)@Za)mAUTBXOPMMyli J)fFP;o~} j kUCSB4X`@TfjRj@!.N~~2`\#:U,~25ajȺp A/)ZWN <8∯Qټb#9NX 3N:%d`[MDhy&'m{G*~1< J/5eAk@~y8`mA 2 f}Bny8ɇ-em;I]Hbt!3fX5yGXIM`Xsj*7c^~OڏXHG  gm^TѴ0ׄ'oՂ(lཹ{2TqMN-\G{}jb>A(̏pe ;G"Q laԗޯs&+mi%rG$֤jƨ͈4 _/w [0e?Ke}]@58XM50ꍚPͫ~V0/p1ݸ}H fT( B%@Wv4=܌hTi=Ns`}`3_]:~8y=} \pgŧLxC jn@-%wcn ??&^ >sCѦ4?cK[Z7a6#́ŁMTdg&dKIel,@JiY-ɏSO [hj}!.+TR*O 72? O ,,BaX7Mܭ腫P1%NSDt]Cl]Y#1=ZNɌV#!kaT>Eۙ3o:c+ G_9/~? O-t*2qo&UH#obamThfz4n0-*ypKpX"xb#YZNO8wg| 548<~<{=+ \ބQbxRr{>L7e-Yrk׮ЁU eQN:3*_^UQHni/§ i제LT ϖcӌkw7s.=:.a!8<4gNh7eg 4 v@MڂUZc}O2{oNx@ vf#zPQþhElC =/WtہfÓtմP:sы bi8۱+++ Ӗ+&IAhsX;&?cXhh<,3On%z6,W0slaf@U=t]9m Y8yl9},w9ȥZ&G7pUʉc'q '1ѥ0Ҵ4uDJ>v,Fޚ3ok9KÉI4`;$ uACu `]vԝtͲM/1"z >s LsWZkvrmL.v.^7K!\(cx%a,)lZ`hxlF֘kNуJ`;aJ3"II]i^l?̷hء1!P!K@@ $*+}*ooi`?=DT0W@-(%ub0 Ayt.YX A|oEQED3 *ʀҠʩ8aE'ȶ! շZRj)qEE`6(.*FTkt{bo@^yjikI@pvaf]%sFذB2cC[fvcI&0=mlOuG7GXwIWWWcU-%P A9֫Y @ x|F2&. EO{Z\ÙqnDXk #9@酊|A*J&; qpbZAEn%&P//TGjns&[zFBj 2CWos tқ8&1 u;?6P~2ʈBĢE2"I )`ňjspk<3koz ,RUT\F. EN*CbT U`Y.fFC!`hXa!UpXer-A-]邪^;efbR#dTxnPMߜꝀT/Q* hÊNAQLpJW0C.+{h&~Ix>:"m,0_ŏ^2 $n Lַ[HUʕl]CXV "F07Tub[ !|d ;z Ĭ qcR!fv"J2e??Xg1vY^o#FP tO)3*V }4G+'yĀEZtia@S:t0[n9Oş_G^k_`<IENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/128x128/displaycal-curve-viewer.png0000644000076500000000000004353212647526524026071 0ustar devwheel00000000000000PNG  IHDR>atEXtSoftwareAdobe ImageReadyqe<FIDATxڄ} WUoB  APAVn\j{9,^m˶".p@H@f !CRM5g{s_^r{=}ӟt@OGO?y s#rvyG*ޟ:y-cGpXZY c  0|_xC|_XXՕE/Yg{1<K$\RwDOOKKχA|߿ە{C 3 ҡ7|Ϋi򫷗K+ _'B,7ޅ 'C^OͯS''*_o<]9?_0<,H q7<}}aY.6FLE@Q^`Y u? p eڞ;zNW^Ώ8?I?xtfQW¿ܤQP@\|P8s >sK$:dQTΕ'\ גuu'ߔ/ϟA0/OF)ΐ`5fj&Nfy1\A;jB`T`s&K\}.la5uP _")NX"jGA%(ԿP='֘j B6B/kʸŸCg:k%z4┓| o !i -]EƆɁ %V͉ɢ"E:_շHݢƸHG djyVkEhL2<"҆^il.}xV^#&N0i zx^M5C5#+ %UL<$"$=՚6F}q萣\ZMGT}k%*2(oPƻ. 2 ),x귃+D _4G۸ @OlӍg?<_R&0±jn`J_H)dkQOfp`Xc$^/? e"0HԘ/y&a~%9 (RCGfVT8:V74/ԌZtL 4@abyh]+2MZ)G3 @VVOqRd1֕?^ea>:QN(rriA++ m2ZTJ)l39*Cð6B)aaX =Z="za )w[TA*j!YS=\84o+ ]L#STC Yr2aYiM%ρ^*'5D2Mmn25v4AyWPD4oyb )'H}tT8a<0ɛp`=:|L]>p%a>GgDLeR^۳g@$(.cs{YǢٔ Q/ ӱ=&̌|f̪@ HiP$!3pмwcTw@n)Xat`k=[Yܹs2hE{#ntsKI |!  0_W>'69J]ԓ2u!N| mTԫPN^J7m)WpLWT2*p2&֣y{HM܏0d?f[a q=>h[P젉{Ek%M}a{abP3Ta +o='ȱF<$!0r=e$S\awᐕ~⡑JKIwCMmS52QdBjL֍Ӿ y$mDeb0 Yd߂@dQ1"KS_ 5%̓bU,쒯E9Wpۈ9)`̂ct&ߵ츐> FHt#fӵ1H&śpoA9tJv bzt28t}M,A0gQרPk:JюdԾa GzESCu 3Tj1;S̃z-^-.pRmV)i^ijd'?Ů#`G Jj?H;`}s/$X=i` 0cd[ g''j, !^B*]f̓OAXIMvU+FCRhT &P'@;QRXퟏvʼD#۟vzZJNR _}\ֵ -4Q_n- y#1`%J, HJ%z!laN ڿƓ]~9.ué,evG{TđkawU2#ljhG2%Qj8#v5M|or6g[}Yq]b$ēj[x!P7j! d Ա2 '0:4.2P%poj'%?L6D 2Od _|N$w_ÇMy~lޗRxYP^T&&NL6N5+ul4!-Ԏb@#Qϲ;˜F2on>&-tMT?L>ϟ}>Q*$d2cyw+uclM B#1 D5ZT3|w0R^plh!C-r2as$MI.u(j 2w pd?%?1qϨ=8*ug9n soBpM}NUV91dbfJ'̨"`UJ6l#T8ef]GuBlAMKZyY79M6{'󁏆 _L}$dQՀ\)EyGhOP+.B tI0t!U;N#%,QR{'i^RgMz3$SWl8{8 8 %GҟM* wcx㗻 ;kŲip d\w>:,ҽgϞc)rb/o?wn peZs0 ]jg5SPBQ)#ҧKqm>"HQrܽ.9ȁf/[&mOCP,Z`VaśG\wq8P2ogWGr,8@I!6B0L*S 5 ,#ӛ50(7 J:F,G.'˚Bx}l׻͏ksבƚrW^"g6<| ZHPdH6a;~$ laBX&XnN/K2 D\~+^9,seϓ?z)kY;}Xf1U^Nן\:N]俧"#Ȅ9$Y¹"ARv #j^U0>m Ct9R6:ы@ZKejK8%{][P|gӿw>M,.𯌫I*/~?2,OuFѹ' :Qb`):Lh$vP$'tUEBiJtu EfCgZI, ݸhF;d#B]- _C@r"jl|?AkioY. Dvc%w1TټpCSƧ_}H[+D25r$b³#W .A)T2+ IiEH6j(  4H>'.@Ri"-hM 㪐<T|1tO8y}E{p3ېˈd{R+TBu[A0ڳ)hhIzӁ 'Lb/j\ީ{0:|ۦ=q[sO4J%_ovTH,fnkOLtGX/K¹T<jBUU'T'l' @U]dR5km^/JAE;50NT' gy>ӷ;n97O{exWpc}d>V??IZ3<]Zdbž={QWK}J^#i^=sp K,CؠYJ$ 3r"+ kjj;7tE=jYtˉcЁWOcv l7Uhhï| a!,<ƺ 2<{۞,@Pmٌ.{fez "I:F &Od $IU&@\<*|xJI^Ž C^]#GkU\fT31k@zSl7izo#`2_peRL[dӛ+:? \UlB2 o5wU/d'Q#[g-QB`k%V޷sI]}PMڲ:MKH0u . 6/ ¬սy"O?5zٗ$&֗faI!츦A@ 9`&yPA4uJmպIq:Ɗ'$}PšއAQRAWWWC>4U6SqB3x?{SR1 E-gֿ4O繫Ҿ$_w5H@mÈi[Dm?(Gq>pȩU) Hguc9ɉ6O{['|a@yZa-PE]_u_0v!fs@0L57?ʾ7w[ SPICUg"lyD1Zwצ= u,u~G >'ӷۜO-_+f!|,ċ/ '%w0EB4>޶Q  и3f>u ݼj ujee5Jn#}kGp`σ+|_AM'ةlAtjM/ڬ"h3{>s [*iN uCJ&ϻsN\iAn_MR.4(3Ò?$l6"7x:yx??"$t>:&sן178aCN^%w_p|R)wS2P-Z۷*h&UdFs BC(i_3F^`ڛh'T'm'f<)]}.Lx5gnt!VO{ȿ>`Ϊ^Kb+;qh34.T .jE%&U2wSC*˴`e}-(Sh>>usi#!a);O*_o8/N[og0DSm^jNn <hp&E?wZUOzd@i]Q"`ϣTlM] ژT/9Bz{,%_7䫸5 ,BRl't)x"`t$SݎMw e2篬t, G柜ڿN1[:q@h?qu9~uM2B#wO4Vێyx%K,f@Вf2&ަh[ UЮUIr5>&vxUi$*^֣t4 E|8\O:vPp7L#L.؊9|}44W^}dv?xrl` 7>$vG@7HtI ߆&չekӔ2݄ 4^Kzɦck䗔no-J*4ϯ=Bm_ sM8uojvG/w?_?>ʻ z~w[I j"3Ss'Xc4 k1۲|/6\HvNRŠںaIN&:mŧ@,XM\RǏ3gAًlpX3^`. .K;|jt=GXZ_{`O]ɏg]査/:>ҳ.Ol?(j]hAC+Zd4B _],#K/<-(6p^ vfvHM&d8_Z/=lS?ro(B:hfPzbZNldpOjټЛciV!IGpw |MnMIڦw+]4&}c*icz ?'lNZE* *D!&?,FR\X  $ EQc.N\h ROߺmBP]Gx1￁)N,Bހ^ ? 43پzտqYK4lu8>/ZWHL"+Lm[]4o8'%vcTE yT+c >%\EỂ[Vk 1e XvƲ2s ѺKkH&(}n t8/7u$j( kdH訖gWWQN? vêMbbTx*cؙЙS dt\Q#qSɐPu;(_ [h!ScРѵp]3lZOx`4]FBӐ܂>Q06*C]6KmʰT(LK{*R C2 Tʹ|tJ>?z.'c$CBw/D8|y(X=quR0 /7ɑz[lLf}@he1Gb}^u E/%cz"@ߑ4h҃Q#ɣVℐ sKuś1Ld?JN$.'?1QaGo` | ݿy9{ fYK@2fɿQ@f%v+9Nɱ$x0DX@9A:j,E:PB'jZzd+U IfZOcgԾh*Si$DS|g7te;]?+yBF!=O1M@[z-]2})젮+|Шhu"(w]^a8Ui dH8APs8li$6;q<_x!'_r ZɆ-֕o}-'^&`'L% X ?]{WyR 4q^ӿ ǥgC^Fuj ;J TG6{@ ,q !ypS4,0.Ο])6R:C|sW62Bb$N+bT.8P> p XuEX头P9 4Rܧ2u88@ӏhDw5M4RBQh+OѨa#6pY6a::aꄒL^ ߡ }'|lCg|qh7&ǽK?8>"$,XՁ]]r<'а6^ðw1OzuJ[6ġ +/ܷasp'\q۟lnlS/ʱA$`|&W1PÐ 0M̀S{bI%ȖaIVP'ؼ*CbbAlʥрKJ_(:'c]T- "GuH緮tۥcIzLޢ75NԭO&Գ֎L1 0n᜽a߱37Q3`.wWVfԽђr-t5^PgoM ,xo;xc38AcjY%1y #c(qc;o&arEM2=lj 6ͱ)-" pIH^f/}e_ ntn=V,>|蜦cA=/-ՠ6YV)`,_YXQE]G+$ѳ82%/K>JDI=H0Tc1i1k~/=+Obap+&qg:d g|ᅀѽ0 ,YLn KG8,G m H WMPl[=2!nfzFMs;fzqCbM.I_Uz绬6>炓>Ew^=TbGri~|@Q5nYqü?ѰLREԀ,{^IHzs 6.sc!Y%L#G@u˜}I!Sö|>`$cw,Ht18 kl6੸?V-z8Sc> 3?u@x:\ϯwγ߾h7>6=肍_hj[.񏚻)S-`H;;d6 j [x7"8=5xVY&d;$7=N[+`>xX_z` CoN4>*c8^Kpacb:]R$/ k}m1 WFٕ4pH:3bOT2PAbz Rϓgfo_5=gy3߆feA`ö,n|$ɫF.\)d\]%ow-6>ЗÓx//8h6Bg]@V2T;یWd >A\2:!!˘3 ,7 g=iPMzî(ߙA,x5gqxGxBh%^<G==vS|3I1J=:x'`MGke-r[>\X5!PN $ ÛGMU@|)==)?Q=?]b>GDoCӱ~Ul8q9HPΓSQ?8ƸmzO+B2#S/x՝f#rU8L)LDrs_xUz7voHJNrQDm @eEQXq8&7hF<ٍfH<a]7X*}嬟XGٚEX>1 &?pLOl3Gx#g*W؀OnۼC85se+=̶OٱʴhiO #(G-P ,mV0y/ d"K-@uk͇g& c==kyҗ!q$|6 r6n5Ɓ9x"KUl]w˟4L@; }ζħCr/^a$gऊ$8IAT#;XC3 1TJ@D]I%N%-V,lGlqv){H5(Tq%}wA1p?5g[B<֐7ɬޤ:$8wB.̈́qB(6 ( 0ڊTr'c52}eTЖe&cSn;*}=LVc]hNe.5>Zp'Hf|xc c*l;_p+vh./3^wѤ\%kf)\{v^26r' a(bٓ@ؐ;چ%y4t͏gNgS;れd.:5{hmO] ph8^d^Vtߺ#z͸ꜪP;XHn++O*mMhH{*z*XiO}ʘ%;OQn43SpكgN&lDwf{ڞw!<;Vzl~L/0ą?^8 x5هnx/.;x=[}.\s<=. |S[xyiB,L.AV}~';"w=,nllߓiyrgY:'6csc3!{L9YMvy.cs8\C7>D`Garū;2]l@ٳⵁW__>ԃNvE p >di y/08nsq +>J5E?=?zp -)ʂ~rH;:3;]bgmNnO AvoqZ 8wk&P[p'?SOe2fN6fylڢ4(,- o/x hr>ɟ?;e#evDVLBZa9۬x]fI:n]IMUa#@氓'$M ElXTRdx{hmF9Mf kr. ` B Ʋ ~{A~Aϝ9a{[K"H gl&'< "l\![pYC+:x=;j_ZY86 -^PmH :l$]ljLj1ejZlP1XlQ.{Scbw4qfL| '.&<,;wEwᱮ甉 նsKܭO"h2@pPne%ëk$HfjȖڀlx EH|3AKiʏ{?/ga!}|t5*:-DZu<#W3u0ygBpU[Wk6 ǾGw⺋gBaaߠ:$9 )ej,JpڭDwi V@#dt_xXȇڻ)a)r6l6 (m2P/)kΐDFEn׬O!O53CU_^i{eKM/$:Er$Դq}  _ [t/` 4 fEhD_9"AYkڞTMMH1\hBzK-~%vf8Ο_8yю~.?×vNed.” oi$_aK?ѠF5*^FtY[!N֕5mEUTV@vDdOKrTT0^V6@U??p "*vF,;;?p=r74Ud,fKۊ}!o._LHPڢQUNj(yv-B-פ:rLWD]dEK'$~W! 0f(IENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/128x128/displaycal-profile-info.png0000644000076500000000000003765612647526524026051 0ustar devwheel00000000000000PNG  IHDR>atEXtSoftwareAdobe ImageReadyqe<?PIDATxڌ}kmUk^qÎ؁'$N1$IH<1:c^{cƘ7a/o_{q'?ï't ֫c~rn޸Q]z<<$\^J7 ?W ]X&Y(Z]}r%O&6du\N<˗͛ y._+Y-ݯ_q=\МA a)1&q:#s 47f94}.tKoDr{("Yܟt?婥NIW^VdNG 'N fm1%յ+ɴ*bD{z]qEXT pI1*✲z 2G*9: ~爌SjI;#&>Px D]޵@T5U-{IY40GWB(PYWثuIټw^p)>[]4GWs<-Ac%|9O)=.m8^dzZ9;):C._jc37%#%f~IԘkp3%ur2TǐTؤr7B:#pm>65 Džt37n'ΣoZӔ?t0FLɸi06-ٛ8 5f3d 2g?YraZ%.:SGg~w_DL' fD2 摝2t6:$QQ첤> b@ix/eDDd Iutٗ+6=F3rmP&H[ {4Ib9NH v HדrahIdԨdF-fiZȴF{c:Mzw_e)@A-fxKA<4aƿE$I BZ"AڃJh(l/Ϯb DNѹ+SnlJ!qsɁ>\ `Fo8̂.-a]~n?$a}BC`g>Fـ)go:rBUb }h+>sȔI:D#/j1Y8P9 2B%dmtp:|~{ź$]g7vYzJE9xVbo'!Q<iR@&f >8|JUH)TQWȀIrZle@|좑i.fIhqȊwAl֢~a՘h_+CoCڿ;>kV]]!NP6>8k07cu' ;ܐEO +5K6g(YZ[(pۈjֹ{T4V=uK'{lzX֢{=<`ָ_3J̴%&D b֫r0edʂ]_fND%Aq.YV2Td9ՙ2m 5'Ǎ0 m7B2#h7 -vb&㫋I#,G^"r)A00+.{&x4Eu Zb~Ҹ~Jƀ^6fo1A+TEW$T_砲h (Q8 &\]P M i9 aHtqjlH*x =-*sH65ekTR =D+2(Y9'Z($*T9o]e!`(ףz{.{ErЎhx>YKa-O- /$h{~YJ^ N@C k[7ڔIp4ɑ=yj"Bi[#[jε/+~'ʼA][1mT .ǔ($lTvR/u@P|hH :d: C^?pz<?~~2O:&ZjRdgwlG Z(,fC6LdE Hk@訆jULG 4+I#& :0'C>" l2b5Bw-{h׎ 3s }-d;<iQ*: B(hX+a͟tS4_#[~wj6Aw? YMK[ K&"&tAw.lQy,=Fozݠ2O~1ZX*0gW6\Ld)L OGCMv1}1u̐lϴo g,M3KĮuyB}o]F`:LtSHZrǴu H}xƉ*!YF#}G$pwm.s}d 2PD/PnBcC E:^{8T wuqLr* cUP91v 18lS3#V@> eeg ǼK1R/ :p69ZM껾oxVS_n 02|qqr3}o%`y{Q;tU7) `O}c Oyip'IeƳN|-*U lZ gna 2@Rn#h(2ZXDw q 'H1w\ߢDyJפw* ")餗RQSl=TjFEPn7ue1QU(rĉlqŰ Ns@%:e-Cs˻yz/=\]/]g Qg㙥֛?.tBgKvjdj> Zߖ`6Z)N~ GC/}HR spG'Xڦwd{,~3b3*XS|2Dƥ 6o22RC@ IC-Fzx$w\.au%JɿNuߧo6]h*9U ~˿AV0V"[z9#d M;$z #2Sj "H2NaFI8F #4U$:nbk>T+hQDs>`SxRkOM$vk˞ ".gv%zz9M܂iR$56rԞ-I`!NS7>ϛӀ "p9P-n4ĈK oN mcs |fO~?5Ck9)~8Y=enʟBhxel,BY |+ӗ.2*$BX71Ve~ƓtI3t[GT:,L-kx_ܪLdZeqLh'/4!?0;rg?[60״EymBM%z`&oFo:=! ?} xՆ`ʢ86g? λJ&nSO`(r5TXD\Q57CPH"' +QȒX:hprH}dJPxlS('(ߩ3lg ?ϛhӾuBhLV܄}О $az6^ZBQFOx ?\B.يAtA?Wj1ys;| SfU41!;((*t;Q~DD[g\ %})YTBN`vI5LHd&X,AN! pI)r.eF^kRϙt#/'z|*7Um7wL_K2"0Y; \g;h7PdueLѿt~F%LMֶ/"M O9n8p Su@$'C.WL7ϲB!Y~t>V<+NH<}" fx!v0vb?jRaupd?mv3[TD&,~ D/ِj3+{(b \UB5.:q](+6߸U"!MK 2^+2~tj2ܭc׿$[xI"'oρGdyqV6o"3M},$ bN>?a*\:EX%"9|2ᘱ,5 f4HǘK:s椖Y,Zyrzv|${wfde쉕`}_Wq6S$* HHʤ6Sdf-M)r9ЗU.fvv΁IBzbf9lQj]n)c*Xp!vGBcrP1#v=oB|M4Ҋ10GCp <";1iV8~sZq渥sL,2R׆gdG3Ɗ['p/hyHz)J?Bf$}.]͎403Vm&Ro w艟~jfh z4ctЁgħ:aɋezyKesr|~G$ 27\ܒ+-!\f(Wt俻_va DN}۞K|㛼~7R˾A数ݍg*v.+(01,!4żyD6PEƞI9ݖ[L[MI)`uMo"Z ~V*^6( (&G^:;?GxI$qtٮR^bO>/DqRA/b:&У YT;2ތxj3ږċNxê[=U`F2jedakQWJѶɻ+χkv^ys'E`2INT#0>rSdD|#!췝 =(t+yNFXO 㴐É~]>ixsD-䊈6eǘJ΍1Z'm)CJ:9ߓb>4WqmEQmjɅa/;55tZ2YV&fYpgqG3S[Ng9£!/ x_i:i-VTmEE f 5.[+#P Ͷd(;쫶آFjʲ@+zX"k?26E'F 'z$8˪+JaLJ86l^iƇ_[>O\A. IG@ؾ0ٝrdn:ґ U-:bʫBMQ]+$*>ܢ4&&6wyUXHd?I"lNi!z&iaz_]?Koo QCĬl%r|iUR>]4&L`hᶸgG*gyiTP>>"`*-^W>:Ku(Us)$͖6GWW\sFNV؅N8ͳ?VtuHn67t>,Ccu:a]Qq)3`ah E+Fh 2(l <5aT5{ 3B{d,\&@_s9vD} r[DS#|y Uy}߾g_>EE;a\y張47 AaVy*A_;R}S%mp{?boɫm;mϭx [ATDeoe1ɿ~ʍБ8!O2 Op'YPK[~SSfQ<vA pqn)zY (ϴ\dq,E{7?uUR_.8s#>ޓ? FYe5HA$FHD;-OBB:x43jLo8`zB'L6B{[:\JQѮYx]GgeAArg8x0뉿ã+Y0d^C`WDiW}yf"Fx=ɄzF0zOw,)C;3}FrzX~Y~Z2=fU. KxUb]dxp 1)XW=IANU$D2ۈކy [| ١攻LP]zvv=CN$'UCʴNyG-3<w@Rp%aO;v #lt ֬ C紺{ }C3V1/ SM^9❗<ߗb}-Xgs6s$"''z'ѩmAR}?VcEض uyr&.=Ls MLzʄfб]gŎPYٖ}" O,"ծկNqvˋ}0*y]( vID㽁OuDΩbI~ϝEя[y Ǿp֤iٲN~V4&wm^/ww^6=Y5;(Xz=+rrEu %XYC NDe.Ծ~qTBmΏTͿL9n 0i؂ѷmMZ9PoM ,=K;)}UT@~e/k3B8jX T'uo[8T-WAh.>4zl;i Dd A p\p 9H$VN2m LP 9,OA2SΦ%'i05⮙V&(&H!{~{~n5/Y3:2[Մ?g^W&5Qr N neip !H!ϫ`?_fཀU )hHPvX3QZmsddY$ S]DSy<]g$+WD=nK›c,1_]΅<1O%8NPD{+&k ѓs]T BF0`F!a' (5WMՔl@M}Mo̴-yXjAQA"u dv ʹu[0mW+3@̾pB8Y;l3QgE 00LC'Aʺ?,f9~B,^ֈF|_+A[tuv*8OԔՇ*ˑ$ |>x/5:l@=}{s$FQ}! ~ 12!$RߞuXۗb<#\M" Jȫj_[ŭbȫ$V6MwW9ݸ :s"։DШ/c?.aw s!<$X^=?]O]J;ilExm;<<$'x3yWxCD/@d3_1@~ \I.6 q(I 1nP\ j؃f]Dzjۮ{}BY< h[ngPx+7WSϱh&WI1a_M@Dשּׂg<5PLl:B[U| ҙ!saH$Qu=P.vhX14 akdpR]:gr췓QK $HΡku! L9xg_ bgCD7$ɛ+ɹfVf 1s-,dFV4[~|@'f~Na]:kcZB'&7dP1xE_tָapd +į'`V :S-ǟLbt \ !>sM$ NV,ZC8m?XwPtD{ބq2Q`-i2Ԧ0أg)E%`pJ(@ :ȭy $BD чibZ7HFt1] Bsb aA:K(¤{xjH"5"GkD_@gU5 6Z$~qO/W-p7_nTuV DqZ`@sV8=H) o3koI!lA'&RWrm~ R-+th_tW&2BU#$Pxdda%kp RٿlS 2q N[ |QlU7;e =)19e" Z δJ():7go?_cqa5&pP!4ɁO@>3 2D,VISpZ?7o^|t1I<#fԿ$o%T;zc7my֧fd`" DszIYkIc\WIjL`$f~?<W-mKlt]qz6ZeԾsR}.hBF:n=^Wi>~y_t z}]Hh41@\f+kEa9( HuB0I`P?E]6_#r?JFgm.fA+zh/ MޠX@DӘ wLGmA^te "8JxP@2MOQnJAN\Y%՚۠uP]]pblqodr352p 3fQAxzB)zOO4Cd%-n_2egF/:e`KuL@UgI_Чo pQT'N6pr>PZJBNᷗat16˔`V\i0}jJb$%{4zA2.DF#WDτIT"m3dM-^%4*~YT_OMx \$iǹVY3H24naܲv!>d,y/($ёo 1mfJW܋Yڕ ~ P!a dr \K hxfMq _׵Nk!4D/eDM]=>g AG ӏd|"K Mg`HT+8~)XC&RdǬt©|VL5N- nEGWH 0h:\˰(4Zpn[$Г>$:IJOg˷O!Hs*@ ~,A2 4U*D3-k_[(ٗOnZz* Nj`Bz~0>C[?v78xY?[,A"CT%0sN0eK1 w:SRHYGL+Zp]\Ӯ8)В2-Cq?_Z([>/E3 г@zǃ7 BgM fziN*k@ Jt@'qW\A$jɸahs rD?R҈LY6טÙOF=1&c])%h$ gjdI*wSK J_`}BBW"Q421BjyfW RkҌvx9WFJ䳶gb\v4ܵdP1Yo ng=eƣ&k*.GHgpҧp#7T(z{˿}ǔ_$T߷b3A/{}Z ^5(`eX2B[>'eSRX)-dV8c}>v8. e>1x)KSx: re mwa(Ew%~ Pp|k*sj+h0{Y7qMg3(>k8R iTLahgE]Ikwra}+GL`L7z0"@/ AK_DO]5} &m M<<ܖUWF(8r '&烋DO?3L"&3@h[1LUI!y|q46gej 32Kex;[yfJ=kčq+'Ԑ3+⬧sAݷ yd \EAWnTE일绅1El 틌"BCp%'vocoUQ_">7]AzUJ%kޓ1eR\4!oP+L:W DYx_+3.]bw @ J2]BKX;PE]$R*} D8CP 9舿@ O,TBc[&Ɩ -dGib&No(\WXp!I٫c# 3~Dya6 FeKNd*p)<|=5df5"dl6q52*@Dwj@>c\忓-Bk biM6}Y|` vƠL:(湏z)١bY#ƹs+d0, ;^-1,,j1 QzT??eb]Xzv]C:í06#,V-~_=<2k!ו^̒1Xv .8s2}{G %ȬFc, 2VDUt*XhI#bڑ]RԊ& $DI~X6n?*)£aɚ ۑU^٘R;5 ۆFssC*z5S/3ЄqQ l 6u_:Jعw*Z1eWP}1VjLU]d1}"d@:DBP潔XdA 9}%bLjs4{1䗑39"^N*B?XzFUu񫴕H8v-S.x8ᙪMF*#}G2B̰`C"(2XF͍Q/+dyZXsmQb1'`b^·y.sd4IQ8Pnf%A'Y@Ȳ~(g,[1.2"33z]^QTLL6jfuSOT^ cOGs^ف,He#og|eHVDZAB>7m2)^lN`Q@ 60˔whHX$]h=6*Hoxe ^@.+M{+ul I_KmlR+|Ns0C~J{7 %b @tPUv bV+[ 7m" dV h*.XGܺp>:c=;X+pڕܵ:&:v&jE<ϖa7婯|ſ} ! TAҨd8=u}T܀oGLcǰalBtu^~=e @gt ;駯/rDb ԁƍiqgq; ?Y;0:x>;4g]Ab"HHgX Ŧspk EU)-h twYj;"yg+ឫeb ݕdd!JFgz,sK Q.&p{9gm?Op_?y?_ b <0is!YB>~dbe0ȕ_|n;F?Ŭ"OҫDftOuT,?o~C@)&kR],ьG^zKYNJ\D0sRp^!FDn 7 O%dlxy8<rοXJ{y F)k1UbBcRqx8gdIF?p2vbZ2cJ{Y/,a`(?( E뒜*6fY'eg;Y P0d(2P,紭t91v" k}fk  8`P'21;^Z.Ͼۤ%ny >S{C<:tH/Z^ˢJ;Ha ޺hH`@w|bc('K&Ba'TY Im)ZK I ȥr :d|pT2fOI4~o !m|$z+[x ?dC!!g2Y=yIffQ/a#L2F5Y8K'>}6.pU4~]|5/Y:<ᇱȐKM*,@Y j>'alME%hn98Y\:(v2{/iϭN057A 2߾% eY`@Y D:J~Ij-llh>kೣ5Y֦eШ II[и& ,$֤ QoXt7l\_a#^E Cm% h_를Qb2Y'`ښU8(%.b[W =dcғy73z_A<3WfI2=I,IENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/128x128/displaycal-scripting-client.png0000644000076500000000000003633512647526524026727 0ustar devwheel00000000000000PNG  IHDR>atEXtSoftwareAdobe ImageReadyqe<<IDATx}[̦YZ_9uυ 0bȄp d4^BI/Gi`f T`2Q34CU鯪˽Yk:__}kóoy[b`c_UN'~&C/B&?r(rۓw~v o.wNy"0K+P/ R͜;?N8A<cg^of>wg^Nq|o4K/\x$~4|0~?w$r;<6zRo"^w!;?_},>_G%6 w|Zcx#I{}\&;[\;XΙ.^_Wm.)z~zc'۱YHQ$*o fz+K[__' oƿX c57W.V~E CrnVq7te9$ -ה- 3I:p%,0|?Sߓz["}lO\mI؍z,㟎/?i#@Q,?/_R=Sdm "^\Mb]SZ6k#Mw~]&DA lS.e vu Pɚc_o~=2jH.8f5DI̚K ܅}}+O 5Nf(aevgqQ^uEo1ShKӂF?N)t)q\(NRŊ@rEwb-l|xtm/⫏e%ʣO ݄L] b~F  l3((p>ʷ+ݩϣP$-VUYQYPh^ j_s[ ~VA7iwğ~!50j|-gBtX6b 3ioܿ%}q+b 4Nl(R}7ؾMmC`z.cQUܶ&(1ڇl E[X@+֪.nUq@'%B #5j6wLgHU(3 4Qc-YZ;b[R|/̽ +ΐMut;Y1tvDr\.PsѨ)`JT PwcM7{#EՂWM䒵EFcZFKFAjO|{?ƕ=,>i &Fw.i*Y1<&-&2x'UEkDm 0dkEZ)v0bk1)]=&&W c&~L $VL4446Ҭ  5F*r7Rq6Oa=# 9;É@pdw݌F5a?6@cܙseQy!e 1ⶂz?tj nN K꿣SO=hل[bNz:^j0Ȥ}ĥ]]tp9Q.f sΐt L-YMT3C*خ+87ivzC¯gv};b싶_3gt jqovE #IjV7f xMeMfqvv 6ە"̓+e2N.c0|ȑ-xO^`o)E{.Xy;WKY 7/ɧ;d8sc`+ֳɦe͕3>e@-Iʹ( lS Ɣvuqa3nLq CPKl[Ϣy9\ZB{2x&Kc2a @=(tUThhX.] d'fڈظ} CQ?!+xgQ IWw/}o6ׯ_ j|Q)0 %Z"#ܠbj!PrEb!nȀ#deqCJ4[φŹ297=TmLDI8}!TL56_">׿{z'l) .xe1)Ն>۴{!+ ielm v0ݟbvrZ>| yd4کg=!gۘd|?dM<_(KR[KH]j&@w3guw/Ѝ#[V8QX"O^En_E5<N(N[ٌWܻ2[L. i[Keボ7 d&{(xߞV>4@}wG!- S#}sH!JdՒ=.%!A t<#" w !v 9t/{0 A\H4-B`[6j+ C_:C_dج.c^VT+85ѝI@HV-}+a[;xi <ъFL gGzB`տ\zߘ>{r)jd↦K 1]2L74bLA'lH`\:U,."춆V8id=f/ETѬ=7c>@rKs)qůRˮp&`P xbNP,C5n3`ɯL<:04B C~'FOȇ=!-R)ju1Ex^|H_tSUt{t뭷NçU J*xN0d)̚P>_Vcp«QPbXN`5XF1f'ɻ". „j='O*jS }_O JVXX];O ?FGG}^җDw7\t\ϫWڵ=~zvkBdpz=(uq9ܝl4(,U,N$ <K9掃&0n|3lJ2D"aUH *OǗۜ;ws<=yRI=dApu\^t5׾>o}׼5t^ H{v?N5z*]ݻJׯ]7z& wUZwS1483Lƍɝq~i3Y^u.`8~)b,VR<ggi]C1ϐ7 kNo<6nTftnܸW5ڋݽkdoMpO:C; WloU"΂/e1TF#NW P^m ! 1s-'dE4WYVO@յQ붠1o9aB!vDeިA {}& [Z:-s.Xp_!.0븲5qAhP]V!006ù;l0L.hPZ.S(Z[Z`oo/m 5gO&!EM,cR^  p)d`C7$ p*{o(;3|w.zFyn `6; ~P~(-D`|%:uaJ<7?Wsuֶ D6 s XI3Hnp[- 7g ~cBB D+6>@k#}ǹh CˈzPzU L+z,yB C<~ 2'z #hjPV T,E`#M,w-Z8vv@Efl 4P$0_<ЃuPۤ}Re yϘ`ڃQ5w1n<$Рy`oBܿ"J, kr65܈ؘFhpe6noG& =;CL6ƼSW26XlREfXrPgiXj@>e!F@.ႨfuKĦ1&@M{;^azUM woa zBYD2jp;L!Z!X^|x4TqaDMqC(`Hc/MNj R)noS/ͬPH2Vp_٧8{{{S C Amʮm{oi!.1T` 1BY)wK;Ø.Xb,1e7~ 1l:(G+D$ 0RYfUAY-ηf =ߤ`!,eC"ci7v5jZIv`Zyhh(a܁9g0C\4ҳ^aJ3ZDٵT⭷fPv 9<?WSJН26g|r}LY(}IEb^t4Or/qd26AV+Ol1[m<\;^4+ItNuyWQxZ!|R %vf  i-vɅ"V98X߿ [!u9?R|\bYPZ8yLK-S>!#<< $t 6bL+ĕ#4b0ه k)Q@O 2p) =@Y› t=F%dws(TDz6t '1b#M! ڲtNDv yRY,xm:XLeÆ)TGCi /e;R=P5s@CHc:5;~6^vb/7}tņpɸݎsMۖV&:F QS>u+t`Wͪ?v8]r(U׀wM'CqCJ!Tu?N^/?Mۍ[WR TPEXб4`v7Xx'nѕ@<6uU'QW @l :D x_hQWWRrvnD;`ϵ--'%(nHAMjFc Q`b"1i oU-a%6p=ЀLVlih JիW]~@7{(w+,(ZȵTƲN0CVy;Lh_ףBY83XJ  S fM5hJX$R'(@=l-_`}{IHT3|;ޑ~sF֭! 0qL`C%L V,M":e+鹍O º)x)p}24tr؏d,,X ԬfݦT)PŠ<ϣOk_ڛM_}py=5INV{ NH_u옲鞀~&]lHOyOImte/c14u9JbXDr<=PWoos9"?``,ݹ=y}}36A{I}T,~izߞ =tt]߻FUBylXXɻ> f<Ǝ#w0{"ziR [VHm6sż eD.KU;`%乓k0fIj:ٛl՚Bh|NwŽo?pϟ?O_7xe*>%cd! 晽>1 1p"T#x=h*u&I(ˬLՇ dgKS,2p@b8:X]$T^EN _"=ɾq#@[1&kLXa%IX xr'"2R]tK!p!j,7URbSl*sЬ)˭Wt}YL8ѓ*_$#43Vҗ!31ݷKanChE!b!@|TRrkJW-W'Rၘ~K@o$ D DRmuG#h ?~}{sZ_WG&)< %:ݣ@(q oPK8Vqd {*e%ON|BjIl^%0-i΂X:=~@V ڲ-y@z](E?ߡ?Hh>\H/G :Gn*z0C׍ɱҨ=k -tdB#/4-Qdd|g3h(9&)@atJsk9tWO:awn>W#q5$}Ex)ZIw PP$KGIvu1c*>>t>gB)p8D,I/ ' 1{zWv[V/~}L_JqU_J7cy hD@vA^E/9+h}1o]^ŢlryJMBȌC=uAzw+ҫ^*z'L*@'@\P4dhgL&pP=zas1 ~<1lYxФ5s>upJU39QzxoKw{ɿ~=~U?l7#WD6mi{R¶9f͡۱7{cpY q-/Hz\SS9c|0KkհCVxci??q'?\_ "XYWxZbgt%v4Zn[IƉ&8?P=iUT.T>to<HDJloʞ8nִɿ>=~#?q^W/_]\'#$#b+BPC^,1Q*^*[1y0]{؀!jg}!WP8 u1n|5@,ҵ%P06\+Gӡ.{f;zMDɿԾ_}! {Ipn"6gU~TW?[7U~ ǽ}HPWeTqkq6wdVOcȫ^X40{h,1TA9tKy q$`Yʅ^jchaĕen*Ė2e LM2pNJFbԲHȽw?O1GSWFQW5s-g*K‚ ѥ7"BC2 <42ֈ "}j4 I?{;^\'"5t*?C~S6rGG~]aj,GB{߮'@ -YIxtr0bdž?ӇsɗNNn+AԈg?K=XRt9zzQ&Ź;@6tn8Wx:?jqŦ:9Ρ 4FD^#|د L68%̲+_Ejb'?s)V <=Oc?.`oj\{9*Xd&t.n *iȱ>]:eiBgf#& X*gaIvMaZe7뻪3Y'ߡ@ooɵV7nQ M*;`OQg%[|Eoս+ʏf~[ʄc(H^)aS}w4]ùtTz\l@ӆT {K8 k̊J$@"u*ۙH<0ot$gJ!n5oy;#Z"wT.aLv#cm؃gch`rޏ3^~fȩ4YK \7F/RU!{B6_@GnUkX2+n9 ]BWG [*ڡaɎjX?A$;@30aTjǷ9 eSfA'no4:L8)sx9S BknYFhV#Vk5 7)h1v ` `cFO˜B 5 &&;)[HT0QݙdZQ2@-tmXGeȐ10Q#"g )#81o;`5! `14 &25-춋rݫA~<~6dhε k'Ά6{ǕNsͣY2mM)[>ne )0ˤFpZԗ@BLk^w6TYX}2"Lo.#c=ƭ֎] iυX{o=/q%җ,+W fZvmFzTrZ#̫X{\L'Xc9xM f2JݭdZh=]²K;ø)p5wXpxGfk\06_aVje<Pc ̚Hq&КA'Q!S;N}?\,N~*O٤(]6;8;cI;sKٳOX "r4닙Ν=;LČB?`*pi/E 9K8@gpKM[&DЕE.؅Ōi[VdJmx_t2'AJ<4E)>-Ml95뭇3 }r-> n: $dLI!GA2Riw7CT`d>J bLx*i !QǮ |U9z4n1y,_|Nl$Y!7S?>T,eob+ ppPwJF^}%ő"+ >ݪ;Jh8U#,S`%:΢l75xl^߻N?p(ǝrnA"*O~ɠY`yFB1|.䁸iҘazNmfT)F0V7H{%^ K-{"(f񪰣vmn_j.?)h$ TgF뉴N/xLfkpƒY#ZBSA8!C9ŭچVN\IUH:&d2~j c9jy`VZ P9YeU]ƵVP{{M`(\mXC -TӰCƐgT<'Iͬ}\ϙ6]aiNZ PhM=`T?qj{YKq.eYmIkj[C ar!v1M&2F:npzV&i<:յ C0xz\ZN`u[4+5T093zUt˳"K1tJ:ޅC^ Y {;ٳ! ҐO'h[,2 'dAC 22$c)%p4}'9^ di`@APAYq6r<O /{F:z@y{uO̢.,ώHTK`ʞ:UmD0Śݘ2Ϝ 3 Ҋ4A 3"v'`c 0lhq-m~M(gwsazޡ'WV3}!ar3m-u?ErƎ]XOh ޚ2R섨{/X- 71Ҧ+CMd2r7&"by\k\D6V/J:ʐnnVM6;X^+&PoVR!JodzƊϋOs7(*9wE+aA:}f鼶q+2Ԋ?(n\gq52N;wn^N⪴\/zcXnz֯Ġm_  k:dxb'F)ӡLzově4TҼJC_$QSg$a[rxQ%zJ}ƸVN^9dl s6˰Wqbm `!eȳ7<KìOd B |aĠ5 "a?R?UC㋟%Ѳ ZI7BbL/2"%S#+P %0HVH- [χĠp1:e.9 ]ì&l>px<ͩRh^ ŏӰbOQBE ># ]Y WOwKsaޙ#/FC6!M6dqi.#<.JښBy7ׂY=9Z8 ,{rݥr(k:FVd~L,KSBh& ܀LLd;{.O.$ɕ5) X@Ț|\P ]`ٌ0"khډԠf`Zo̭)71 e ∲]_-NPSBɸO/o^>ؙx={G6Z+0iB;P^{ӯn܃ xasxy ֶ. ":_6.$$U,vG3[As),Y~5FJ2[drkh2j 1U 7W{/(%dX]CBvhG713~'f7-Al-urst[ydd#0ܹL5 KXV35s1j_.Xˆ M3,>?L5xK)M@|oL jIkD9M-4 bmys i!Qja0/-ը#D}<īr[TW߄IENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/128x128/displaycal-synthprofile.png0000644000076500000000000003674512647526524026204 0ustar devwheel00000000000000PNG  IHDR>atEXtSoftwareAdobe ImageReadyqe<=IDATx} %Y=}LhC}Y {d#l|b|ml`!î  vr-x^mc$[,in3*+3dRͫW>StM?ڧd_W##ۦgf=eB$AC]:' cff&V iUc"S!YKqR:,1A_e~WO^-s9^Wˡ]-OEzV?KXėޭ^P<?7(S @x1Cf$d(K.`<c 4|P|6^"80sbݧɌ%Gd^Wi"=aփ E)GM/!\ӳğ^Z"vR: :$(`±6~Y 4pmQMl7&r"FҪ2VvDF ClF$r$ N !2 W~|Mu&[*1)w+`:-QlodӘ"uC f_)&J?O(9Hl @g5)psKĉťыOxp;%"s8*Хw˝WK9;c5V퓒C"v0t(@,ٌ8s] VORJDGD9D|R0u,pXV-J%g8Kp6!ʀ$6v2i@[!R$wvgP~{LOzjD1zI'dRF1°=)E.\0pC'yS?A3\k^Fݥ 1\<W1]E;/.ޕR+W ?*? H#0Rr1d&w( 2J "c($t98HIDAW095"@ekH0$T/@^$E< 0ThdvޛR!+yI#zKހbێ 'W/Q- *Q ֧|%m$NIDFY2:lf?EZ8g:Ց!{[`&~^Qĕ_ F 1"|{m #E g6~G^Dz(DRrfOj) DyDɛv(bеiq2Ncv GOعDHFe6ωlMX!2Q/Vf< s|qᦏ0vd ekl@* KP_+fB8HQ ˲6-#PN#rYr6$I,l !Q~GpX:h+E Y@0O&1H'3, !܄4#a?v@8'n!Cdh- BLŇ+n9.a_A"P/N)L2o\9gYX`z#w--%r$2?3RD\vX8#GFnjXa! x&qdH(&hFw[2.Vrg:.DJo~n6Ƨ !2E.[~XpÊxj`'%Ň^1SxK(`.1{AJsg?`ܦi%} ؎~i&NTPĭrcue$a"Vj@Ē0N,F C~qvd;Ce~v^џ=g3.92omhug29D͞ax zV7`7ҔT.Ԭ&@ "46 OJBjԽ1nB]%63?8~ĝc%Q(xʤN\ [sdWɭ<Cωn3w"<PJ$̏Sy/$D]`uS8'P߼ѢN)`pn c3?[ѻ4Z?N9S8@0BK"D6*gagP-ēvA =J~e;>KqRA&TbtF]T[MR C~]R1clcdd3ƶ9 p]a gML=CSbq5 ~r;vп8j7JQv"Hlk=K.u(i ˾iT$B lyC=!㨦Y5t,!#k!}ԙSʤ l߆E˓_' P*Q3 !Nڎ*ZaShϝ׾u=1-R7/ȿB (f>2pߍQP@vw$ˁ|#QHrj,.F6LfܲĂ݄?k09ۃZü{Na+aWm5u5l;2SZ~Y=@Kve9D%D>oM߾sCh[D"e3abpϝ3Wb!(nU0uFm Ftvl޺M'G%PJ}Ht\TQ׻+tRa||nZ SXYYͲ'DIHv݇e '޷ʵ.>&'Gq@Ku )HDK8}R?z2l;z cjKO#C81ٛ b"Է852eSV5^؉$^Xشi^ϕհj5|7"-Uy&nvfXµ_ īft⽈."-4z՘܉#$L,ʩ5d==-t);/;j J0e5VkkBΑK'9;GJWq-b%LyjB|/nf\U\@(2em 8k<AيGAg 8D~S8|G&Q*p3RHxX.lXUp u:+̟!4S%*F._ 1Z)OI'q4+miQ.\p=J,45>zZ 6 BA6.1$(Jvx0Nߵ~K~AfĸXvFaSڬ"oay](uMnNcWPlgzp?9q)NFz_JE\s$wxf+-jE*k(qrĜ`0vf Rn%3?YűxB.6xݕdi] B9fkC4," V6JE2lxb&lXOKFg.şr4't\(HLD8J 3KQ; kx淇."q)Kj+?z)m9HXm { &P_:sdT")Ռߠ­Ny݁+կ~5&EB͂)u HnC=X{ }}aQJ b曦r_,T:ygY9ֻ\ڝzx~c1sH8>-Q y 87\{{w-?v.HXiOa OQ އG*։d+s TKtP{}XJoԛ60ImIdgSer׹ηNObq绹z|׺Y hbwy?W27jA {h`]PU,qMʭRM7|Ip32%0ìTh"46Wpw[t`qµT_7Q/X9+_(z 6^lbُ 9RG%&@8HDZQ< tgaU: 5>dHE:mTDpv?bnL ¶]W y$'5velpX?C AVie>pHN\x KNŒWBχu?*r&i77v .?1 1dHr+))w]8VKj?u|zQ|KֿO8@;2_| ر,]QU۷rK |uB%I揆tgop4//N -7}4* LV5|aWY.55 lݺ7|s ؐ`%VC_~ f ?^;XqFZiؕoEGX#V݉vӹo\~VkQX%\@S䍺)WdB3g)'Q)/V$8"%x?-o8\@~RLpU2GC&0f1Ul֩)=a'hz(q_*| g. /sw_,r@}V: Ծ-gT_o~1\(`]51Uَg˗%\l l+R? r@QU`k=pOK*~5uSlǎ[ ^l&bc'^ j [HfX'|cH[jE0p5n]'$_"q$0u QU&>Ho|+߿?S #DA5qo/J[l]7OJ+dZ~fkm HKZ 5s +$51?YE=RVy_+g&?vH}v\q/(xE,b G70-ɯn'SسNk鋢0c _+akꯠv΢S96%ߵ|@ ;vȜH/v$$ _@o=yc}.ώo) Ϡ(5vnB}J[sJ7>?$8zh ,D/x>u21",bWp I w/uE#mETJY=l J'|k\.D$8Bڸ;NNښd Ttgl)eˎZ%+\-bet(emgXAiD$@ԋ*9M)А@mّ-&zm71 d+=1T:CmZn(,P:4ÏK۴sT;rJ߀ Z\짧BO*|wW>-a">D/܊}@NPin?NА[%j^Tf*xn'o2tԄZ:54lK"<[ 3@{>5 8bf}rB&*J~ |:(tX#[\M{k0U?vzXXR~"v$d   v)/,Mr`^EΗl/f)pތ Gqs|_jHJG)Fǹq5}6^lie-x cënQ`>rM䑻jbGnY 1tUq>$<]`#g]̣z"G|\9,H}U0)= j{% UM5jPh2w͇n:ŎJ d/S 4@׃7XF{V%%Y,_Nۖ ǟg?<]x\Y_8P n(ZN)T{Ѥ$ fC"v#* ;W|%^tl{BLU  L<|%W^E^~;%'(y cSv+i4/܁:]peKM''^iw$2S؊$B6Lȳ j"9ӏ9H%~@=r-5(B`_*H">$h/BL,gDb*vk:V,tm _78T-] \@RRD]"߭r~o1x=[+P@1 b !.g0=SD.ɻ&e({Q8hsDj^/ϵ"Rq  tL6%!3|G)/[_} 0_͎S~nH?'VxEa ӇQ{YFw\:U EH0;;ە \Hwin,D:* H6 6{Ɲ]y @b=򝇐4Uv'Ue c톷ryvBFxEu$;x#KӒ?F1Go3i, w Ai`ŋ||@6, y(9VW+ ߇huE =bC s>. %G$kBdhE[eR ,A7G0pgR w`wHepyłtޒ]"t_ɫie"?/GgŌ ?9gf͚鼹򍿈 4\@UW!А@S\[t6nṚ#~UR&*M먃i[]¬/"`uD(EN/tN8o]'$Pfr݅j_!V|H:|[ >P$|~|Z~xg}]ZY;`ᘁ9{GW;ą=便|Ϡ5uݣq  2u-P+~q._7}e3jg:}a4Pg#=;Y Vl+dIi\)lKߖ`nnBE1(dλB޷qSS>~u^%> @j2E - ar'.PCGa[`fawC5(Vy=UJ^k N u^ *s!"$;+ SV) aBN88 %r{nHy汴HL.CXEyA&I*֩Z2g[L\?IczScՔڡ4VxnJoJJxoz$ .Z.̖#`r2<`ꪸ¨؃#_Ć(5pw:?$etK!H8L9q@-Ӧc44|G>mӋvpx!ǵ9A7ϳbuY#Ћ4"@gOº}vbhe]$PU>SN ?%-W:Ro?}Ezw ~5և`I;Ua9}k;L@/4Lduu,ũ.WΡ>I,HQ k(Fg3J]@mjRBj*;ɆP/6GoWp >w*>MxZDYU.o”d&SgHk G8-e`5)tVqx/OInLƒz3RV7j}n stJ5ꕼ ,m6K-Wg-Z`:_t"q]ݓ,tN ً;]zVqlǠ"mNJ-EO#/{VCMjBt.}wfo{z>v6 _yݿGH- -0e p q^9+8}X1_$LMh wF%\ATj ( PUԮ]ٞ Zhxco{}gbU[|f?)8lf`3={5*S3#9y9mlc苮F>$ iTJzuRUSJE51| ,Mqd8/y+`W\_}W}ig" S(D*/^Ӭv x:+9>fһ V yWDŦYN8g 2 A͋=/* Vo9h V|rs [(!y]xک,7=Dou]j8LaLg`4'z[ :AUEJQ 2@yxc#@:Xk)V&K4R?8gs\6M)Ow#X װke~xgEbwc+t$S݋u+VVc [y0xtKB zɛL)$AO~bcHIRN~+jOH|~9!]ܚd+O*.]d.gIЮ?Jʵ)nٓ( 9&!Jk{vc7*0 & V{p*0ZW,lqKꠧws{أ\Eù.XdH;Uha 8<_thK [c[>b?3벉E(gu :s1x+3.0TP]N0&[ {ā^=;no*'Z PWJ[ ޮe3(w$͝evvmؒaZ(v`D˼|xao8"SKHVMŐW -=n ޅ?~nZaVTEAcs1s GTkn[ֺs d:JVAk3x0Jr΂\)J%kCɲ76coܸj\tƥ$1̭zNr _NJ=HSdѤ= m>睄X 'L;wQ `W+@&F8ԋ'wov"C&z6CA>NxDR*V**+}"mON%$sP Pg6vcOZ_1κ0B6U ?C>,@s=w~j\Yӳ3 }"GCGOqS>g K9C}Qjl~f~3(+!h8+ .AQmoϠ]zHe>!iIJYj$AUDG(-Al6aYWH`oXg8FE:fׁ]un~XRW"\kS%慧3'K/@X\TE:^pe ;ڛ\Yp# u.zwcz$+<)6d PjrǠ R4@zPeC4~kq iF9;|$r$Vt*MS>`5`Y^̥̎kVO<ڒeje1iIƯCSCWO*#ohai؋j1\X*+7fr dr4*7^ccgS_r_M2 W75NUNکU=O̝Ks@ъ'1b!+L#Ov &$r\.IX]w7z{\ٟ-y>#ڎ,K`֥tբLi-7!~a9{"H08CӺ8D"8l_  < ɩ3 XpLNN I:׳% R/<1q |cA>H1CJYpj&  2uSg&9DM7՜Kc5NYQ[tdjiug8'P>//`)}v` r3P)c[ҽ:d%*DHg pӰgM<7V:`Zq EVHxT6:TC'<[ * Ip]bHF'bF|X@|`M7QN eW= }e9-29M!W;&@VWf[Mw,(QS֮e.B !j"_J鸒NatEXtSoftwareAdobe ImageReadyqe<3eIDATxڬ}keuZުU=D86c;B?@(O#Y" !ğXD@"Qp$'B$JM8Q鮮ǽ{9ksET}>{z?IxtqBg[oܿ{?>uW)X>U>szzO9tPuBP9w>{.7OyGq u?Ǘ|SLW߻wy  lʪGpGe|JF:Jx݋D?wӐw]w~sҤ!I}OH߃v ?St=  ُgc}B_G7M/:[a_>.LO~7<Pܗ@q~IxPf]jHcx"y{L{Tn"Ք#Q\SDv'Ϣcufcy$@ Iyf# m~هk}%}Xւqϴæ# ~2\FzO`:ʴO\Ix1rb+&.^6a)"{~|Sv}y!gwVQdbIOFiڠhHca5H8 h'9N:-ʰ>s/$2!%#ԎdLd;Jo#))֐ SD)zg$%P5i}}q/J ,讜DY#gqQ ;`VIO 3,ȈŏӬ5̊i%/ Qr\?FjfLU 8ᕏc:1T$;'L2n |=&"?EiPm3_8;<[k]rX/,u?9@/88{|fGd.Ssp6/{NhO:4ƹvm>f7ʂrr牶i"V+zIgPAz "MR ּ'llpX^:  u(=wmC[~-XrS'eQ jMM̵2d&&{](G30~j:M-j_썧̀M܍2\䓹Ѷް]Tl*(D̏N]M'sn0O8{5Gn@]dxk\as%DjиN쿎# Q`>c{32.d:}r& O2*'Lu@j;M.&PP>^ ZC9:t163H$6?Ȩ"ciLW@g^ayXtgwqX I̓g (:D5A"kPQC<ʒDmMzs;k^E'IT:5%6HbDiFy Iw$lZ\gjbDՠ*?$ۮmiXQq]fn N0} M2aZ8B45 'Kx[eT.3-UUt%bH`{'E sĐ`xr, Gd*G"7EY#BS 71aqkMC79*ľ DGi<.QلQz13ːIFղ | [, $&2!bTs,ٖIʁ(?yQѳp*>zYas(dՆ:h502͑quQ\V׈Lqu'F, _~cf.Bܔ'gͧx4aCҰ6+yA/*>ѝ*Ə8  4pFT9Fu>, -q$-nyd6*?d`Q^O7~ty$[1D٨A0&(95xUNvD@2XH G'д0䔂HvyMGY"C5-l>dĶ "fJt3 P&x>X ,THf-dq2Ӽ|6 #N4hCV|haXNOom%2zhҵDĬgXB1A7iookPLk*OȢA%["hu hBlEe\JMvkrI~ghJ0Asj 6O%lt$ USאj'ef6%SƁg ZaYqNkkh[,<Jc''vYh}"9<d)rgB>`=6VU@# Zְ@,wu }XP. ,nK,ͱ\8CgG{xtH0roN)ZwNb8baYpحo`3<#>k^ؗ} {a}1=*'旈d}WW}HX#JiX, f8'CJsΟ< 9x:n_ SގY)"5ͽ{|DpzA4l p-~7$\w> ׻,]x A#Vee9b`HU@ ~9/ڡBmlT)cddB^gB@D=鰑`͛׊gZ=ZS헮qkYDyŒFajyH1""DJ{@v'E-Xyn@SjxCʭ.%~6orD(pTC4D{q"@Ue0T!ji߈;mI*65Ȱ&5'S8hھ8*A`nciQ&nd:cQeAwr<1T+H9M;-012 6'帮p|mHtW 04Ts&#谙3Ճ([Q(/13Hy&@9h+C,|2jn䣠i +f9zo+PiVD4yNGE}|s\M;rb9yK*G:ePи#pЍ㨾WɈ\KK[u` +,xT~Bmv ,s`? U80l-u<cYb zLR>eQ{8%/ZM%''p f Tto \޾܃2w;jv;psf{OUX:LjEI ~;y!;P@qQ{ܺی0֝x|dXV>73VK@/Ow~ĹpH;#=CJS8Q,iu1]?Op}—S҉N||y䢦% =2rO݉ [̋aS.pH뉢{ᘲbz?NLF.iRnG#BAnZ(gV(E[UAڌ61݉>m A UvFתRP*V$܌qb:ɣ* Aa&g˺HJ2oP c)xyMK7p@8ć(/A PѥfE }+ #r/x*˟bØ$=u]\"/ń땗yo|'&"M d>s 6ud;PK1@+VA\^G h(kȘ-#!7 E_}3@%-݉(58NAL0t"W" l: A'>5-/ x.-walpVPTB/3C؄rz_[ߟ*v)ϼs1ӝ(R:ݞౣJzHINa *0/T2MۊmB%L- Yܚ[=NDn`{]P*%hs4t b/3XHVA1-"eIn 7!n/#)uz8"FoS5|F$|k k4!幭" z8*_ U ` nE1DDz, * "R(V?1 7Q/5Hn1 p%+OBXI(L]~q9|"jȤB:ږN1Ǒp΃B)f4JOVGL(QZNA5:&3ҹ-ќ<E@R]ȦY6AWVW]ہHc7H'4?ߨ(ڰAZS4TXOQX;} Ț֍, zh4i@RԞRmm(IP ʲ%sJİK\U9fD |AeQ ӂ{@TYRԍe)( 6Kxy.HF/VnkSi7pWzciRL5n wR^Zce_E'O,@ >Hglf%j̐fHsqw,O]7Uh>E!]jLSQ2= C~ !58X\xUMd/.T˶jdC`dMR(Y\HgBF>yS)B*!+^CT4:Y]<$Hna*;AEVdna Q7M~ٖOcJ+3mSos(B=;DhR:S5Š;D8ޡV4=%/+,24Dž q!uLYC^άu1A X,H2y'u$ri#B; V0OJ%]5Q6Nx#~i>,&NԙR,HUQ_U,C lꎞ-tMZRèW:N m2 u }&|2{lreY[Yth丙 5Ҥ1V'wpq$ŅYJ4jˠNlB٨BT:̓=:0SYZY82;+ [MRJ%LIL`p sv,uX3GrR*@$O {{ 'cwnc8+R}t%bϟv`*<حkOB_#ƣE;p%׹.!s\X9wz-6rZ:ʄiM"B%pqWJ*$=\?\{$Nl}\2!\( Gv}tȀ@-D݀n=AC.p22P(X-x<ݻXZN5jЇ_LPx*3CXe]Xԫ+UAvB[ukT/\)gͬZ v+' N8y:Z- Vj]NpxY]Z(s 9ܱD9HU0bˮ";.%ܥpv Og#VςxVG%wU+2kq%PS+ݜT4_zϘ3 I6#Q̳|iWyYK$Yêhiܩ߆ߗ*vXm5ja(& [ꚶ}q׏pƻ,]tEk|vP[pWa~~l~%s?%NoŽ>ۃg. LYaۧxWyz];lOO^ ;?PwF--ãܬ coIx@!l`LU9G0'Iƈ(ChvRmuR:,5y'x ]b㩩9y34*GT+VIJrg:FOxTxx(Û@h1ePpl,0i*:'h]I%n w&~XX42 <0jkDlmmhoN8ycѐo|Dk*7L6iI?'??;ikEU{9Uy mFTӋ1M_yWם*qk@6hg&Khkx6$1sؼ:oT1ZdzM* {8ȉs2B$ck똾성 zt P:д+&,X=w; `OzXa[w( ‚⪁J绹:9׫P?pC[8}7^JB/Q̂ Uz}+)4QKw߭/`ި]G/?z ]2{B4t -GO'@N`=>x^x<|^|p|٣t 6?5Dw1<;xr><~'m~KҶ@sx|/4C&l9\=> _bUy<PKllU1e<J"HlE̊[BDkq;m6Z\_ʹ%fV itnHu5502#-Ԇ6Jטp@('J[qX M< ܀u'+V=?T5nITT'Oީpk*CLՈn~j[sGͽ pr;DT kč;'&`!'߫!Csͦ _ Kh@FN Y9`iݛwq>W64lҰY(F*9<Z83hOL Ώ&/6zް$33^F$NZޥRD%D6 Jމ%kV3 Ens lBE|#$?^)π+Ɏa5T/'144vU7ӄnKͥ2t'%^Hr\:8T' x*NZ.jVdAJKdc|' mG@"zl9u Hqcx=U >qg s3gP!4 (;`3h71YAx38Vcэ+ dD5-!ju9Hc(ozAr|1qi5PpIB7¾*Hü;N*jhKr]ojqI2"1g?oJx&u8TV:{ ‡kVO  VѝRB3Ep)GIj!TqgVx]BX1քVhs\{,xti.&tbUUdEE An xϺПrҘo}f&Hhaah9k[VT_+ . SiȰ2 1ԡO2ͨVY/Lt?~w !qb 4n*GG(X`wB!YzA5L:'*4/Isڨ¤%p  *[eaIENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/128x128/displaycal-vrml-to-x3d-converter.png0000644000076500000000000004127712647526524027553 0ustar devwheel00000000000000PNG  IHDR>atEXtSoftwareAdobe ImageReadyqe<BaIDATx}ieq^սLtFIQH[ ek6NO~$HA ! rY^Z)%r8,=[Ws^ikFy~˽瞪SWl!c;\m~R|#ӡB&\tQ0' cCucSSgQ>ߎ 0&Tk^S#G|w9";CAq~%*>r{ b%G^yj`ݸvug||OXN{%? 3G[#Ưk,A dR(Ha(޵e;= 3Cn$Qͦ4DaREq29H1GJµܤ_-hz*}~i!ȗz)ű/.ϝ<K?~{ۆ"s_S+?ߗ߇84~?FҦQ}"D:b04b}< Obj^@HIIkPcc ܳ *~׋hrQ.d[||Vb/ϟ2@&nF|ۈ6n4ZUzI "2B#.#IPq\&BPX:3 (LZ(~WHz-y*)e/}?_m6$ȍ]ɧb0hr!Sl}Li‚4!n*>S+]!0 :5R ,}1z2N,UU }UeBƢ铞* '__<wkWW82\9-H,)qn3=0R{.aXՉഢꒆ0*~R)l0R5 FdB*UQj5{1 çG7ҷrC #))̊OKJᗭrbzOM2«^\ថMfaOZZB(s"cDō% ՜TxQOmjۿ$)$3-mL yW^p,֟y>xi1qgJrB'_dx;x3:H%[R IOޥ jGO?5k%އ),kUp;!3806ʺU9WPIPsMX).J`j3 Tz)l^ |$x j՝fᄊˈo(N1h 5t"di0K3 hںDi\U<pTiON^$#cM S`ZahoHxNaFκW2*%R*0B75Qxr&zƐx\fd;f@o{K> qu^)la ;5yj6H$M뉄P fa&WW5 ֫uU"Zjh ՞HI.?2. E%&_-I@ ,vP 2r#F!`6JREU{'p5*EL2У.Ş\1و x2[WA…՚P,i$UBT,eZQn_zDtBI*B,q ߎpZ消FAFkyy6{Aw],L!"̾pȱhc"1 [^^MB"vѣiy_r!HAimA#XLawʕ"T&ۇKIψ|lYLz"n;si{ L ǐބ`Lq|([Q& ᙹ9^FlfvmGE!g$\DXFtowvsLQ59"mR,P H ?z)6t!* 1 GLSG; c$P6Q 3K-& SM`\~zѡEX8DO zJf0H RQd'q1H d@ ySȅ ~C=5r+AO{ҳSp|0(#hnS&6,~#g)iC[,#iAI@f7Uf"^aZbeHRD-KZqJl|5i@gN]yjW.!B͡m][ڭ?$=J!2#J>CBudRGJYElG)2$8@mQ4D t@ʠ^pb hJe9ٽS I(@W`/;P A@ [&e uՕ_ $&.q!;eIJS!%Q V@&A8%j7Mk= <Gi2EC$s07E# hF8R< K3d/rk*#Gʰ܊HwiQjwKE-`L #~7 "X)B|H ~ IAYjL$K#zGX帜Nc n}i_P3hmBSj*,gB ,HO\|\X#JN!|d`&jP&uDl!=>#aAO"c;gVLL4TXmp!j53FXH0B11`屄5`iS .41Htr^1AJPp& 8!$3;ġ64\/cTΊ>E&Q:]jK ؘlgY315nnކo`5c׸WzӚ׆3h<Ōpakg`#Cqb]"H 3I+A0!ˈ/nIXЂHVH A$ U&G ? dDUOJ$II 4#K7EIo(Y.=p/α0g7A晙u~$!|}}n6snV8/A3i<ӣbEQD%kUp 2 \Hd3::IG!Tz@ ˧Gamyv4af0Bc` Ey#3q#o 6?82U'NPLX?yJJ$bƌNvYL3VmjnBIsuyXR1N[[ۇd1y2 XX`0lq6(QBss&K݇Sp/zgiC@Iz,MYf!i _fH!,,@SAQ aF"qCUGx5BrAYʅI6r*<`|tb&2[?XcIu+hw{&d2ğ0| Y)\y.>=S܀.An$eAwچk9t 3g۫H@L)>(;(ӫhA @%Z&c @2"Y›q}<&bD4@+`φX= ajx[Ϛ)L[4S5װ~+p֗Lʲb2د`̞(3R]#f0S@RO!j,;Kc)s^0w& D+zALYK$^~g8g$!1Fj2WcKר# skspf>?pSg; NEkyX=_mBo< G^ g_m"1\?H(MJl8䘄Gu IEw6@&ӱԮ1VYnmfOr 4hm8{"Ar:t3ߩ~Á#5K04 `-%wħL|le<78.Oay /}Ltsp6nufGm{ꖋ<[ TAam2EB?wYz!3˗E.>cpzEC[cf2Ngfn[3{ pfk?5Jwq1,]<\cHtݰ>p6tN:?TKF4bJ.!* {X9 Q^Ɩ Bt"R:Ro>{/6K-SxkC2z!:c C^)t4ÝW&~>Z ,ee%}mx/'B(K)g3)c}MhqHTTL"לXg .h$F5vECR%XQKD @T:v_;fm:7 4Zڂ-8Rݺzd{ Zho FFSA`}8W?[Ĭ38cwaU8cT3;` 8*l'̿ N%jPxE5!}!O`TGG) <nWJtսZUs$ҥ jϙd2Iɓd3r\~5O҂*^'OKIվ -oCY;ĕO1W߮rk)/1|kfܾEEMG5@;j8@wX1X)Vz4v]u6\9vOD`4f~7!9UlY,Ьs -oTF(5Jxca**; R bx5oބY;ҧ1K&>M>c2Xs;& τߣ}9&YA|m q-ڒ, Ъ1ߤ9  k3A`}d\2GW$Qސng$LC'@oBXj^`Zhq!$/o..DȔ@ on(%l?c[g9>ޙgKRf2,"WtLDs5V:_g E%Y{`0ζ0 *tlM0V^۫&*mS  ; "5ÇwQȓH0@ 1AӎWpE&rD?!WƲ72m"(]M?7o"V`oXh`W(yjvhB ǫw`y`$|H:<~})q7H] 5vQ]B2C&b~Ӊ(r-#0z?T!:n'|gWw vKc`ob'vϾV&qDG +zQ[_\Rt 5@C\`2ZB+FGQpvς*ȓT^:fņcg(Lhςa'8T#B Yc^#&J0 '9q>~ YnBAؤՎel|uy0iN[JbQ!-;xI`P)΅M; $jt e%O[1D4_upZP7geE3 1qz`(AaB'Z{FϘf;[ߩ7+ЏƖ h޷` /4+ce;/T`:&tmayqI ܤ:+RdI"#TGJKҺVn`TΉX0afnR^+!Q~OpKI<L`X# A新2(w1uc)dz1ƤLj6Q =+l`xe4_uy}p# A?#+S*B%soP{d4$!M)лhMCnLn2ϮmI76p܈Q3TÖ3fUB` nhKްsCg6pj #ຏ?e21m g0Ǡe{4ػh301UO&JF-"$.IɚPY-&H "dV"1^abvˉ!|uY%09vb8nn 110jbW;I]'$w֞yNoV7ɢ m04a=GX2XA(BƁqfWgl!rJEGJ.'ݱcDŽe}פ++RMxӥɎ'4?ίOO؃~WڦS@㢕!xNO;x#p)}fgfO+S)#{hm g_ u`K ~F& b)6:O`L!<ߋ]Sno?v 3n>2+G)I z,bSmiMl|րsW\<6C16Ġg㎙ oZ6քs p@3r(_f3LK 3 s@_bm )Bb.`n04'`OXv]^AF^5 JX(K\weJYܧKwL~O:?';A__xy"Czz4o `o]M/|MxG=3 ۉ |ol=̦&xk{;q&dWV%}5Ͼ%˗yc"H,cTtL-}++Gz1IѠK~?x6`1nڌ,cUm^߾~1LZw^ijXBf)*;6C-e 6Sk,͜0>+IN/LzP<=и%}r[ޠFdT}Jy1N2~WjwC8ǣ3EM<#k)q4>=ژM ?}s~kz7?^#*2?OMpA{ᵀf7m06TF&Dom< 9_xFef-ʝ{+ Tߩr —daMbԹ+mGec;i]t\!tW|MS+{ C0Z]fȆhNt35Y`>6> z7IC|K8gO˰l (W|(۲GZl[R8S=;?n-[ո-^*"'Y؋.&fmo: g?#^eݹ ` gl\\6(px g)5A¾*h!`xëJ Yh+ckbl7<g`^ϵ$\ `fw9$/ f&=~( &Tn݈YU恠Z lU ;O@F }; u+_Lv|v3+_2\RX)ANJ;kVp~;0#rEG0'4uS:wC^b`Pxo12=0 @&s8O"?VKޔi&74 5+`z~q[z%Sľ.G"W.Ŗsgch_B mه~nVev"icFܸ! бѰ׾ C8nY%r## R0=`ذ]?if]a< 3_AN1@%y+LRWAͷnT*fN=B~wH6DND,qXzLi3ï Ah}$!$tyN^Bl;'g;>xfo 0!'I0,)t:f]0}W$Yy)jJX8!49f3|3LӶJYXz:H|篼1ma\4}#qwuG\~QC!OćqIжeJ,Y`hm%8Dzhٓ{}Xff+͢ƛxNʟ{B%l íKX%d)0mZ)v 8'b l q܇] -1zcv a"a@ʪ!rҌ aotDIQF =oR2W1q@oi'DmvR{SUoVM||o忯 " ĉ!F &yӐni;&'eP%lkJ[4"ۀc<LhvI2ʅo05vSAj 0}Ga:{#lb\nh/>¿DT16L нKIﲫtCe`yy!31ѣIQ 2TE}Y03Md425j2oW{8bdDX?s 2qᤅKşu*{ORTEEL6x&hPïvwAm5סaҘX^t-r,nͧvE}]?2L`ꇡou% ҴfBR9ᘐ%|7o?k>u ]e)<3&ZشInlƒ,kgˮ3hoǍڍ_$}SE BB5ٛ_"zSvPL!!b)F_|,O/BQ+,d{3x-&`ۧOl{ Vnn@3 fuYP f市)l*ƍ^>R@TӪMMhΞa'ʥaoIW@,}<z)sDQm1 XfYwpdYg V a GE#phª))a}4zX /LTy ̾0`8L6遡%+{Vx&A"=.;g?8h0̮y'O)^ԛ9(/YD2M'ֱ%U +;yF ѽ7d x ={{{SjU?.PlsG)YᨇF{0V"ɡe:ި}xel[ 8fh[po-qN_.\>UArB䋈v2"^Д"ͤoӃlJU%% Q a=40ko$vKDAz :M\|1X0R`1nLA~1(d]= UNx忒uQ,5w _X$!ߴX˜g`D s]@{@Ix&Kq Nޞ7 8[KAI"ɰ!]`H'6Xl>M|=/?n7FAŚ-hk.=Ȣ;L&'ȽI TD#JlaTB&},0`p}Odⷜro1-.> tjQ?%E,W3D,'H`#Ú*0 G _rn{1y/O))~ܙE@uX* ‡ VZ{ o:TM"aQ?>O{W?VuNpz pQ/#k :6d&#=@Wfc9f0_=v,$ddPxE\x1૩% 09sRR䨑>Ay$h'`:ԮEB>CHq3w|uX)[%37/huk[, j)=z!6D}spe{BS2|MxO:h!d R翓@])Bm팵䙽ɝ+ۻSX=ݽ--Dgmç\DԙB O0SN.dZٍn}/J2 m]n"6Lش*m% `觏:^jJ2rD߯U&fM+jGWިbOh}}WKh*"Pqn`sLغj-Ψ\irρbOq~s =q5?t}Mk&|8 }@Xs CeMn{$E7sz*lYbeY6TfZf] ռ}ARiI(a1~LoJ Tv  ^ee $IkTffd~w3m#V308%H/6X°>:˯*,R8qbe uwrU&3T(ZB FlHAFtڤ;!5]no ʂw*Z쌑-*cǴ>Ha1ZH'5X $PJ|Q" ^Ф%i *+-ZYU蕜D**F"J;E!Pkz{{E`+gq`ďIL2{TdAR&H `͇$b+S.R,QE-,]+F 1p}&¼:[{4sA^ dm7Qֽbhq&QMM4Bb+ }!xTsوQSWCoy*Rhah0ocQ)y"7!}UCDK'Z]]UJ ,FDTZ 1gbOz<*1A*(e]2=<<~D+` ԶM[ė1 ?v\Mٞzݕ9 XTޚd`scLڽ6z+V @Vs7zf;+|[je  2llOWEݥK.ߧQFL8E`ob 3˗'.W[6 1t@Q 3'+W Vaj\Pv|yb2ӕ+vcml_Ґʽo~6DZγʵP^^*J3QQkFTANC%wr@wE`-l0Z8-z,cgK{%=sLr~Rs*B lZ@ؚwpv+.%r \6Uғ1Yf!%-., -AcWp_ņaRCD]E_a DL1pE.\(̋ +R$g`>GҪ]f\u½AU_u?ъS2˧ ( JÖRͦ@T{ tq4ԢX@0g&Uj 冰6-;hҌ@A甌EVH_UTtX;A=S9.bU[be*"( D`rF9 r1Dt¿_Pp ||&B5!{mX|[jӬR}[Z!x4bzR`!ؚǦEik9kQX@#]IY_mh-犈 0KʚL@S8V1I +VCe87R2e] >5UhNYM->=>L'[lMXNrch7EUEtn ꦔ-Ow_GW2Sv * LEbma zjuN-5?jIENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/128x128/displaycal.png0000644000076500000000000004541612647526524023453 0ustar devwheel00000000000000PNG  IHDR>atEXtSoftwareAdobe ImageReadyqe<JIDATxڬymYv9NMU殮jw82DDD!@`"_Q_E[HA"h۲mwkxo|by}k+ys=ܳ7[||wWΦ+{}>_cT8ߩ;]צ߳''* ?!ߡ!=?Ǫ{OĕJ7TVK$|" "v7E`a[~|; ? ~,xo1#0v?_bwmewx1 O{R.MK0:F`2ޜ?7йiWUZo|sV԰"}cTm~c᫿y';|_N}܏@@McoOq":Mr!krGx.w MO\GE~Ü- `Ḋa6M-Zx?_|RҪqۛMM0g5| K  `=<َ__mĞ+$/x˜. G!s>>gE8Ef0ɽn?_d,]y@K -)j6wbD LA5|6sxyKL;m·8TL!~ݐ 1gŗ.s7￙3ALGDy"(IHS)j4)h?*'eYvUh{^{ DžkK =yH8Ϲsy`K8nƩ<.Hw<T432S`O{;w8nL][Fh Y pz⣸*4F)?c\VsC^CiN[:xCIxRr@K^HJc@/}g KP E\wz.p7K:W7w /^[/7`1wo,gj?~_ߌ7m  ɏF ?XϚbm> T]t1@n"/}AKEk^Dȩ~L?=S'ݎb~msݏ*:Zq^ea&rwL`r3 gW{m'x/[cU;2>]$o " 0Nd`0E2E'd~yZ8\9ۭ-~yDtjw,GGx0~o6,cw^OnO wz5oOADO3YnýO?K Me1gkOX4V;oh;JU.La4 >`xͯix%,9DWB]S@q (\MQU[AYx )MAn.!rLにW`!51έa·E76/m㳎I"(&Mx__vzW_(¤-L¶Ne{ ;  )p"/Ž!2 :߃#W@#Qص<.2U~¿E1܃翆 *݃dodЧ_[A!+ =c! L O w?k@0m\v1@ٓh= kV$FЈBD+("L: "GL>߀uf|;s\LWP&6֮k]B0LDd~az ^ Y|g x/|cIB|L`j _Vmâuj^< ڀO0& gPyT?}CW|>QVIb&”ϧ=e|aUa^NWIg{XU[5w @ <ڸz ֋uT&z94ָxaK}L`ʑ=Yaӿg|XI /2fTB[j#w ~p W ,]"=%T`MJ~r{*rbZH1 Y}9~Wp.+pLl67b_3OkԾr3\?sxJ$վe%/UL5֭ S!SxiCʵȜ\ĞH!TL 8BmCHR(bJ}^  39E{Pdc${ -U/Ő [-v@&[/C$TUBxZOv_:,hWL|&&ڪEJyw _ !i; 0$ (I雹4B ž ;&3aVQCkZ^H%k&c4p:Lg|:<ʞu@VyT8_٫'jg-^mBtrq{s ߇OœF/ו!ZYk&3_'>>f/YboB%d1<7A&GX5L;)v N|nz*=iw/O%wҮo\ khD_$~ +|r_{cP 7H@S[L`U33,`14fK1+wMxS ]LƸ0V- TaRL"M(ρ yկ<Ðliֲ&ֹ gĠQdHPANu %1s8` ~us{xBȒO7>[, `ID0^boK/z¢ZtLkN1MW2G V ;ȁ+tߢWZVVhZ#3,ъ/IrJBIy5z>y76y ^j]'c7`Cהm> 05!#CQ5?Z]65LA. HQuW1pnkK1"n1)s51x+Q?mhpj}7p/_[Lo}hY -u=xտ&&$L>Y0S C|5Z 0kjJChLcyuk]`@̵ DggJ]^p40 $D(!KM!.SmLGbR-V[=\lVhw?E8 C^9>OÂP5ʪ}yܛy/ ߄]b6cSLP!gWH[Cq 4ʠcVe,1>?oO Uh]lHd~(8F艡V'Nz_*k.^`3V3|VPT:?e} 6). #+&U~ L}m5e)?hZ"PDI}%Z8/:**eBK?x?k̄g_uDTzs95tU%v/k@)l(+>o{m׸:? &_?qM h 7S^m}["~LҼsgw/B{:~aOf/M ?Ɠ e-Tk( | [wf6y2K9N6M5 ?mAQ̐/g3Eƪcttwv,pLp>Uk>Q>_5&[Jzwk[aq} ೠOأxqiPЊXP׸Nц3n+ݍ&lcIAAgCr_L aA?s"o[},wY@׭Yj@~ \y2@_bo_ v~XmC\=9 S!60tyy{aO93W{^9ۼuTZ)ʅonsùn .R?kCf(3)#,|)^o9yM`+n|!P;K Ѓw\2Ĩ~l2&&0bHk]ղS']m"{F.غ jh 1f3 on]/{ƼOt!ss3)BuRi#r!I{8aʺ|˚=Wn^YRw.5`UXKM/X |Z~~|g~c lDH&BZ #-;X *x;kZ$К+ޤL;տ\:q" ;Eݟĺ\BأX`/05 V {u }cf7n-`c+(\%6<&MHLQBuFIv_Wgl? 76C.b&G;2{BExq<ɜ/S)CϖR=D(>f m|gd27y1=`C+m9LFb[[;gl蕏(M1}m׋pKL 1h ˝۰jo1&cpެW}qP-ꗗ/yAqTlYPKL1nmvOأc | &苩D{;56 )^F\G|Os(kH=~L|)iq2.S0:`bjSѾ[;޾ŌZ"kZܾXfS9?rĿIلN|)^~G_`yy,8-|z&up{ 7wؑ~9b}$M;;Oa{ m/+] '$,[Fﶵ&xㆭP_(_d4W}6Yө.7HseDAgsl&Rˉ%A41!c#o+[t:d~|I??NJYjl}<>Wd2,VC o>b8hж"2HP`㍬װuysؚ Q)%x|KQ,F]W Iw^̟D I: %~r>?&vt%Knma?a۰y ĮuX_. ?/ν\~4{L|l,AsdO"o4=1ԋ \g-=opWJ(V"^<ѝE3pwwG-wKR,O5|WNqc ;_p2gB6]%y. ,+vu>3ӁSm\y¥gGPG]' lhozaYzwH> 䁤$\;A$A4-4aP]%zNIH??*>ݼak`?jY%Fh4G߄_2n:쉿' am[yTGbx;%V_zomd |kA1f${]$HMGeYJiD.a-#V^V/X2l`RB [~͍3&,`tBGxcvjvEcN&wA v៟m`m#MQV2 1! IοY>8I%F@谋 .gI;a!0.7!K3l-5Cf;8ⷐ4_/?7Yūso7 TИo/}1!+#xv>W7@yj}' AO91Q2yX>d?ڪϟp5YY| _>6߱KTŮ]9kػs TZ[CZv!aur ^ekm@T#c5vF}BO]iVz\{s)%;OBu畐*/Q;|c_bӀ_X6mٴ>y̞ CC%o.?s&B1[4cbye֯Wlo+ 8f\h~z;Vyм|w( Y}-\ ._` x4=K{[7vaM[㇩e?= a[gT7}^S2 {V, -u`swX)sb5O2Q/y;l-sRn:4jռnH&٦ۦƱ TPr*{\DN2 ?,=TL6 &BWkW83CsutJvw o;߿”` 5į'CM7` l9=>tn2A#88[LR9>J==20TR1'~?eƚ:ݼܽ5r8^Zuo2"COOxG %Z$@=8xm}\_}&5î{  sW_i9WEA Gl')+w3}G">a;"Skvai^, RϗҲ zVsѭm#)Yb>O,mꆜȘ'xGYZcQ4@^|PC_ұ|/n7Gl{NvL|uc$?>o#8ދpt4|sp>7_.$r||baEѽZ½'ZO|g:a)(f3B*o5E(V"I9f{SeY|jo7`~^DZk]sKcj]:8!xw Lf0*eUejѕQz ^_sI<]5/hdFeCr5-gt_ܨ_INHT݃F7L|2@U!ۨ798DިLme9_ L@}/ͅǙ-!7b Lnيu 9Kã38=X F5{Ș!7>"FW7.D)7uW%?@"s{KB>~V)QU8R9M߼YknuߪcOtgxc g~T8-X,E{;0S%+bV 89<3;LEJ^56i3{Dv Hw 8ft2v Z4V_eGg_~vcujܾ,E/ " Й˗sSeœ-8~4!3QwaWK}>yrpFic **<ǴwJdw5Qb0/㓦hp_gm^Ihd2Iω0y%5U 8M}w{޵fLZS?ï21߫=ޞ:`bm;UCRq\Μݳ^m6o-j/o^}DY*ƿ#o,"kV|uSV7 3rD5Z86{\iz ߸M;LM1P+6V,<2E¼nܧwgVf4͛j3߸.GS 8=_aXH`+Kl D<$|C"">j$}} rUJߟ "Ax P {3۵5|խaAYvor@tvTxU fp-~+V2WK xtaާ q,kEK~QǴS0=D=L4aO<}|/0 Gd)$TU1f=`BZ_Zi(x}.e`}h+[mqk`zݵMPS sCϱÌqN[$02i&9Qr5? :DHoUenu *{-ҫ*moml j{ .~U#oX7^LǮs?NcFյ5| ϝU12\.%x$VP@D.m(DoB8ҺX`*NBX_[̭5TipaJ-&د{vXlY׏t s3_C9ogjhf T~O T<Յ# f66G0-. N۽a&} 2 m9 D$>% ƓAc2_ !) Uf`U(_U#Vp{`w}bɮ6ZW6 nv `j^|em>iG&ܚW +xtTղ 7G0dp%K*Q@+:EsHP.CRV4qqH.]U퐻?#>VQ{-pk| o6|w\0Wf_ wϷ=6 z&jOM 5 imڷW"ZqОrm۬6pȬ\F(Ը(FSIwQi@\+VԇU(1S%ϥK{&8ƬhkirfcBٝܛMh0e?auئZT\`K!J(}AJtr;D;Ll U*jAؕk4^r@˻H\2b- Z~=6_2%?Zf/~:bf% #-^m\px3emVqD>JhD J,K'/>&xB8 !4&؃kv&Jb,7e&p 3ǝ/z8ҫ(lTf7#A[2Mg3܂l0!|G:LtWN76,=kH׆2fHܲ.yjxe M{3Fs/P;x٤2~p`)~Ņ]:Mi}wiXk@O䪘PL@iR #~JG36Bk?oc&6-[c_M&Ƿ\b1S oU v؝2O[|ޠá`W ?;s; ۯˈeEJrBR U@VH]f'; D$%[qAaJ#9rAҖbWa:]Dz7,`pM8_H.UJma2BاqW8bX/`=W~&Z<,](5%b+8> yAk̴i{rhGn[o! *n+*"ㅂ *jٺ.`&8٥=ݱ{ζ6UZpc2RT\ 7^/0iCk1㗝鹍WR.ԦVdn v>uן/) ,3W:KU\|H[- {թ> 떭  fK26C\)O~t KRX;3v8ػy-R,P-I@><7lkRU%u @V\ . G3;-4o5!=`c2XD/.'N^BwPw۴2=0,fLZĤ)3[Rנ'8/)T=+twag/H"XZ'cBa/ɰQsT896pZyʰ;P/Py=sM:3=ieLp "я?6b`ǭIh_)H+- wj4e2GGl:uWToHg-a^WOVdAM&0 !uT$^?%D_ SV3YݳX3 ~ORkF]tv Wh¯)JWaq-o [ZGZ \;[hJ)`(B id_,W*J|'z'A CݿXA0Zg0AhCr-;!%3)qW(1w7Ս$Tz dXw&Tsv#]xIx֮ | =_0Q '0XN @_r c D]>͂L:I 34dgktpE٠NG_\,-h\T}o8')HBK;LR:͜%fLZ|B?ɰ79lcHh(0G%4\M씵=1y-$_}O]կׇROqCb0"lId8 :bs & 8g#N xxʦf*JZ{ +UPjQB"dIaz2rA;׭3zRIIh*A(tȤU&Q'97kV?pyä,C'ZW|> ^E<'IR9*<[D9Gu:v9o Ȋ?sޔ \nAQ ځKYY!^ϩNS DZ, '~%M$<Pee~)ߤ)nkv{P0dPL0!gԙJAtSdhMœ7I?z9 [u1NP_t刻 LA¾JBPț:sS2I"B[Yu2$ (WԸկ0+va>Fy \e~eYJhW̉WUbh Jy-*d@|cjNPq7d;jڅJXK K x`EMfm^AI"HD lOlU^'gQT[KST»pt`l*娝M\M`8fpY{7( cyc4u*Ec! 1ofðoBgMqBFKX3 !2LSi;(LprSV{NJu##kϪ-*i 7]goGq1=--='vޣTA/U3 &n eq%x.U&B)12:Fð*%b@%C^k}̐辖Iȷ=mBvS2}:Kē=$@SO hIJh#r cٔ vKg\74w2-yU=ߤ!@lUjIb2]?O_bD8 J~_ [Fd g8DŬ? z϶Fv1nOdG /qJ!L r⏖xnVp<>ʒ9BT<Ȃ?*{co\i <@@W7{jY6XQ@Y5n/ GzQMTY&P?P@B򃧒j}#:kn{P(:jU=%}J T "+&b/6 'n֖ fK}jYNlϣAh,웡})VP /"<|:E{:a\I`$(u. D-2 _ #X!Yzh]X3R$}S۠\(¹%zI޳@a8kv5+^Y.1G8KF%A ]>=#Hd5hP=qLl&W3sN&{!/qXAU%tr&$Qi[%|5@T POH Bd8 9d(ݍH\ WS.Vs7:Ϋ 5i>f'U7*Q'(Q|?m4$ٔN(O.&Q$ : RCCk7$VdVρ$wHjJ e߉S:# 0\ڥ9a9Kz`C᧊ /eG\M3)C L (3 * ` IFKzp]t3y- _S<u]X`~CZg 3k;zT}!S7'AKPV躆*pIJL%@ȮuO=~ X"Ad r*~vo)I@:.aBH8ice\GZZ!A( 5DX `@\-`E][O}uz(7@;oIď!uؓ<=z@hT2 HD Zrߦ\g "[k :sǮc961J;ڞ_?)>OO@, q^`dRnr57I%P6iB| PYcr[p;Jwϥ:5.bm6%h uC!M@a&`#Gc~ғ[)4d(!aIȕI="8셲:* xn_X 4h﵁YXLL0U=*UE:]FP-C8P+?P^qM+= j1u?648$KdlF*dpx?F(jN7$UU=RU΁.P:45Zεy aFv۸ɪz*[6[P{Fn^WC~}g#j nv/ =s+3zh[gT_n G_ȏ' nCY*/ >4쭚0}̧}!"LP7 _LaP덫OG[y Zm0kmV`Q /SOgzٞkjXp>6Doݤ6N RL'J @C.BO ^N.-h/̢)WJ);g3ᨫ 4pI3 1@ZhA0ڔzEB0*>+C[yM4]a4~IPf3OʺpM*[e6Tߧ ؠ֯+HOVꐚuz4 )t?*}e)MdxNT1uxk-޾ֺcs8ǝII1G_zXY=*]p[*I۟k?yv ۄ b4&r=ՉiAJJWS[#1 7u.S!9 V\45Yѣ`m)U+ۿKФ'̚TήvIY)nH0v)oniT:YOyDD )a @A{:%rs\)g0PЙL" pvv9}%=3* S+(L=aN06*DT0хL@= %Ao?vi$5+bEtނ,c\ xd^3褞R!nv`? _}#ޞ;+ǏN |AqqZx5~%*3@9LbcTAʬ:ӱfc+/dks7-_ӯec_;u*ܥqljzиs$ "Ң@ 7Mw24\?iDkaM_8g6:_$FQ,:ފ5}3dW)QH*kGSzUA*]9Y嫰`U>ʛD|=<#8{mT ` 񣄿滉1_䳁/gn! f:1AO(1 b(\&Pp1:a*oO.倫JW <3ӠU{M61< X<:Q,<%&ӿ_/k˘5AD\_ 󢒳^\C= ؀. ɅKkiwDi?=oVC ֺGzXхgb, 2/Cgl`֙xx[|'rJ$ԗrpQO89l6);4vXJ_Η<=EI]09~ߵ0Q^[G \:$-$@1eo@z }Cftd bwLԢηv{YZ ɡ 긗&h\+>L7\>9'~X@shS.mQelhulS P GgNԇ7I QA\eJ:IgFޏBjXg+ؽO)*xW*Niw<IENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/16x16/0000755000076500000000000000000012653527012020424 5ustar devwheel00000000000000DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/16x16/3D.png0000644000076500000000000000145412647526523021415 0ustar devwheel00000000000000PNG  IHDRatEXtSoftwareAdobe ImageReadyqe<IDATxڼOQƿ;CK;С!(TƲӘX4ƝR?PuDq15.\[w,T$qCEjyHiK 3x[ʳ9=OƖX:b9T"IJI]ݣimcRzvqrGG F7*W!w*jޭgڣNUEDz`Xwk D )uڍÉh|פ@C2ioAB{ʳqiVwq*p@ ;lI9k$aYsMa0CKI-u<ռ`Ku=ofF9E(mo?'I2! Ej]kfsrXjI M(MS#ps1qBq_~Ajr !@-|h*J KQv\R-X]^l y %ZrMPKG0ڬ1f`ױZxzN3.J$*bP2zB A@k9;b~zֈPL m$fv +xns MXT?Ujf\BGg' L0n%sOStu?30Jr?Y+7ee?.ar(/IENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/16x16/3D@2x.png0000644000076500000000000000521412647526523021765 0ustar devwheel00000000000000PNG  IHDR szztEXtSoftwareAdobe ImageReadyqe< .IDATxڬWkl>wξ]mNl'!IiJBZ OE*@JHZ*5RZJhQ[DHiy$M8$vvX{ܱ[TJ rѬwsu](Jc26$C D$* 8t K)7uVFO3] ol\ND阖.?=<,I"R A>䇷ԯTnXև1Q0-tGj{{s}w3g9 2v]__hkKDR&8خ&D +n~Ko/߆?|wPr4F=CH&@S0R Bb[:ϼ8.5T'A$@h^DRczJ\HcHiH;ė78KṶW:B };c30f02P6A' &+Bu\!?5U,1|5u6]V́>.D]!wo P.5=/cZ: u0-266ߤM#OVtnG`b]f;"PpNgMlV֋% r@XELm _o߶5V-3sy>hǃ*/w%z4S7;3ꥀ`Ztk>1UѨ!8PX_5|U#.VAh ~,KP>} %Pz-6QFʵ 4.OUgq8@%f P`@Cw%H Չ9ȼcld&2zֳyɗa"%G`d\49 u[H-M,Բ ("--`:*sOH U 874==F3=0 DvEX1P^YԀ/K@ScU!9UDZ9 B!_ޏR[ ?Zm+JB0-`HT01ق(ؖ]rr]2X[)EV%*%Aƛț-Q1g x1~_@DJ1l#'R16;l!EߏrowĀljh` J ~':Nu/ex`=n14L$g`JPXeE j14[;Cc$a`TXal:zNPP71-Wՠۺc"Vxܧ E|6'a;3I#-PBk%0-|;tDM3vOj5LrSi/Gi6T. آKȵsr{)@>nR]AC6V2Y,[5^az<ލ߻S 8E@(!*Tv[ti:p7H^w9T_;)d\.hH(FApx">E~F4[!s<(t'&fc?{qϋ'74`Zn疳kIlȸjvpyDt?hJgЎ>ӼX& VcےM+ui?@]GŠ@@j[ "'2 (AX"g,ЊUN_99𑓙w>FR^vo[W֦H%[{o?*V|T S|ARsv1(pqѡ ^J|~D*SϞϝؿB XG .Be:[PcKk0Ғ\# K; ԈvlvԤ.m|zJ}1)=;Q}E#&Kj:$!Ԫ\w%u ,'܅i I` Lyc"w&lw-&S29+^z5 v?A#V혢k٢``RB̍L7gMqqc[:Tp8LO?4.ϳLf_u%y M'mRSSrqs7Ԑyr/fɩ#G,堫 suۦk;{Ԇj2YW ҅GZzPr2.LA֭tBN4y*_,}Dfk (eULuCWAVm`PeCZ3IENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/16x16/applications-system.png0000644000076500000000000000163312647526523025156 0ustar devwheel00000000000000PNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDAT8mSMlTe=O{יN v~Z@!Ub+ݸfD722LBLXL2Lqacĕ@E%jjhmyﵔ7e Nr77''{.#"G;`;/3l/ax,~ 48i|,"_Ƚ jkǶiٍ\/kzگmRbzf3_H)O0ƌZv*ή|!c1v(&J,80d2u{{519qV]wJُJ),-/D 5uQ_B `3L"b7o j hܷ?ی]LFDrcŁ#B+.=o4򎙦~_{}d|ފ!Tl>4FZRvuM7:s֭~~9jYHēeYb9s.+H:Ni:#Cݕ U|G[[n uu5}KAW&A֎]TH|뭭]ӷ~d3۶?0|$1i&JR;yuq.FGG|UinR !bavv|gj|"y]U. !v3 hMLaQR)277f&7EU*n*R8{ey'-<#a}=s\} +]Ȥ?*|V r]jkHIENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/16x16/applications-system@2x.png0000644000076500000000000000521512647526523025530 0ustar devwheel00000000000000PNG  IHDR szztEXtSoftwareAdobe ImageReadyqe< /IDATxڤWWSwI!!EZdZ[E 3-VFc3vΙ_鱳c:qG@\Q@%  $!$ld}Ufc]ᝄw0Bt:WmQ,X?rQ/b5ꌹsS"`/4}s E9 %WȳSSD1 s釶Ĉ:7Vm^/QR\JY&̂O hBQ|DQLZPQaȑGSSS 0uR &y^p86ɤ,AoXkiνٹ+LH&Ԫw̋XL0YL;$g457nѶy~4Z\yit\\\ق:R) n X&& |bM`ZA$3Ly}qal=Ȝ@eJKןYrכraXXƦsx646.'Ar  !X[}L@K(\ћm[9󜔹@d?oj{=`6 ,_ AM?K Шz d Zr1^:Yd\&d3Smv`1Yl1CӠd$evvA<#r%5ƈ49n!#[yFVy M[6K%:c#@,($R邅 d$f^zݯ̻I괉_ƪ5*a'DM*p['WVE=z$ d~|(_,E\w7"))e4D}XSS͍ Xp1cgRRr۬ 232ҿjp::;ac0Xn{*׾޳^xVZ*GF'IMV<\rxH;[#>z &$!11I}E bFkR7 !H 9Y9ן1ܙv $M<=0Cn`^fɛ0{ BEOyzLNZ_n_G bf͜-L&# 39@ p m2Y0@0y02O{wǕ֖)OQ!FW…PĂf:vM{{[wQ:yim$4 t_&er9QY&~vcq}Cɍ5j zzkHǓC4ʈ<~ OU Dh# xfLo a+DIJPtd@ tPkM}9NPyG)h/;&SSU 2gvڷ[~) 8pA< $Bu8kN̐<ՑԨw6ox62Q~dӈY+wqHՔǏή 3+022ni6%V5o&'EFFrg#H*.ZJ nhݥ˖%9eEg&Mrb+꺽>mcejP(@~~2nj+ ¢g!Y} >>nHv2b\RPx4(n]n)j5'aXrzZjE{[-cØlvxN9&h!WpHB!08NHLJd0HLOy RhOC/;8P[ҾZXPV-QAb`yAD|DDBrG"?pP1cqˣ5Hqihg+p%Ɔ l6K$,+_5eH* yBg6::J\$Kry,,/I',株WH%YɯpzmX<ܷoرcX`ܹXb 3']m?*D=S 纇O>VD|:hQu8ͭzEbny"OA.Rݞ4){?uƶ܄H,,,V{5#+pYۀ?ILXSSSߤ UB?̓d뽨 d[%eee0336}lڨ[ۙ\̎k?~gMM(*`E]]DҢNrlߵV/$;3,K9u%u+>>}YXe"u=^ȧ FMo ~e:Nsѿ=QjfWj^Xp &i=)*hGw{%Z6Q® ǹ(k0/G}OJ8u);$ؕ{d=+ʛ0$e+*~||oGD.˒LB­V/+zn}}T%vtt،2e ۷!@deeC|32yۨh 0殕-f0;ö_A:nBpéXr U(~Rg9@̡^ NpkVvZ)]L*m ɉ*E`|}ɻZKN#U^fΜFȑ#Xv6ۧɏ7DqW\Zmͮ|yyy7Fb<[WLJUUsSf@óFIN׽'PQQ^A@A8B|F5b.WUf+7U!''[ڿe˟&a"*sD$v^bo<^tg<2J&8t }C1oKHBo†^B(~%95`CL¯HO6 d?LL%!^~ ؅R6g/$korMqMqI ~j`B~( 3dFfȖGh6]x-;ЀD"5RcTIs@zN"|a>6بKB*AMoϜȣ=Dn&q] #%8_ |‹2:D)eR"b21ςqO>; 6nܾMA3$<\_.÷4u}HGPn EB{i['Ovy_PTⲤ|U8xiS8I0WDlJ^]/^mXtaDo.'<(@_,v6̰u.MJhR׷RQ+DoZ G3+Jb W;mrQQ]#?MbJAH0n?i~hnv[Pv:JGͺL3h@4>%^׫ \-E+6|-;~lpMv'*l8q& ǯğqvUUTUU)ԋIJ;ܨz/E Dq8J|B|@k:+~b8;;[y<\Pu=^G tufEEE7jZ BёTѵgݙ%|)[;4&]kYpʜ)E64v$d&^EAPg9Zf^ :Ѻ2Ǽ,rPXU#;];_[ns*$IENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/16x16/camera-photo.png0000644000076500000000000000160212647526523023521 0ustar devwheel00000000000000PNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDAT8Ou+/vC,iĦ49XI9<61!j|>uwRԋa,Ȳr_ 4M铓g,qx~}}ؗXX,>00[7 eIF8BV[W<;ǣڍY >G6effk?Hd2ss[HCCot>TB055$I8ÁO ކljJү+WByeeΜ9$hHpo6BYEQТ! rKa0B:[[HZZR{$I"i,˸eYh"_yB_ymxGWOr1~zHx.OL YkܾwLllll \@e5dO:McR,'3 G)ݠ?;E$ sJ%671;;,ͥ$t;|2t.߮V׏uD2I2 iş븮G68dznizv) ŅM!`0"  ľ۱,7gi4eYSӣU*mFnIENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/16x16/camera-photo@2x.png0000644000076500000000000000363612647526523024104 0ustar devwheel00000000000000PNG  IHDR szzsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDATXW[lG=+v`'$HB@U( RJ TO߭B~ >A? *B$i(cq{xLS~#v;;ssJT e?.MQQQVZj֐>ʩPguٳz e ۳c-@ʒ5n[ɳ;gϝmP=lݺgՆggB(b%%ˊ<k 7oĄxxm0իWp -\. >֬Y#Vl6HףakY` W"@ZӐt8 ;0C3gΤBu:XEye|$NGiY̙g|𡺺 +WB;xgLF)w?Hӥ(,,|%)-2P_?eA=-N}?n1= -O=!'~sW53"A?zX0v.vկV2"(PLObh%W\sv,'#G R_1}JrȜh| Qi&TONyfΔaLϘ R~ =z ;mD h酯Y(?'V$$y 4W΍ݻwߠÇsݺuyv]WĔr6+'˔tp?NMF{JB=}ROPǏJS+VXI$K]dʪ3Wo۹Ϥ&}HQ@s\xKK˯x'պ:U6MU7v,& LuPV7ߙKvt)kP[|d[Uv=mTVeű<_QkX,5WAXն6 |*kIp3!JM0y/4NʚNmkg3Yizd?`El!5I( )0y4n%"EVBrnbΎ1mX@76n!]ۈ97Kc?!ymİ;g# =G;%^G<59fR<&1[ 5B;>pVCЎm n iIHe5[Ș{ lpp<AǛѡ%}>#Ob53]_A.3&N)c ok;1ᘙEQn̈́h+Ij}_ omIENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/16x16/checkmark@2x.png0000644000076500000000000000063212647526523023446 0ustar devwheel00000000000000PNG  IHDR szztEXtSoftwareAdobe ImageReadyqe<fbXZNS(Q>D"(,{>Fd\.׿x @1&b1lb<JrGD  @*d<'o^1|=ZǧW*T*]MZ,T g+[aIENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/16x16/contrast@2x.png0000644000076500000000000000177512647526523023364 0ustar devwheel00000000000000PNG  IHDR szztEXtSoftwareAdobe ImageReadyqe<IDATx_HQǯ:tdQr)(LV"ZF z{q=lPd110#6צ AGi$)͵sf/~s>=1FwLt/%,..J$v=+ ]"|dt|p#lvhddD >(-- !˅666t|]ggR[TZYYAP>??Gݪ81zXಲ2GG듓v׵rjkkT1<88 pRRT*\TTiooG`uul'aJ:33a .BVX#Z@^) * ۋ[[[մdIpţ g"G vbb!V1t:,?Dxwi8 \QQV_L&P(":j#L&"Jl~ |>%. TV볈qff&:<<1^n "|&@ 1yppRRRÉ  xH$ f-hrƸY]]mꃑ)JsqhmZ5//8C""2::DSSS/bp:M?`bp]]$a6779p> 1<<\.-2srrV1=mHHۀ'~`[ Z-!k0[ZZ555*`Wh4z47֔9@Qbbb\ؘp:c&Kf]M Kfo$xLݘmfo IENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/16x16/dialog-information.png0000644000076500000000000000105412647526523024725 0ustar devwheel00000000000000PNG  IHDRabKGD pHYs  tIME 4' MIDAT8˵KSq?ǝFs?&!RK zWiBB *'Bэy4Wb:ˣo7KƱ$|.<d$]S+Ng5H=8؋,h:`vi &y_.7Z;,Mhi4W:/S`4(YPS*mUڰIl/[OXO\ѠrJhzͨ.o ~ؠZLylHͅQǥY(Ao?X͔!!3b`";%sكI(ս< @ zkf慮k"2L̅bfY9O&rQ?kiܺ7C3%<~D`Ms98]׀ -Y<ߔ1z~IENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/16x16/dialog-warning.png0000644000076500000000000000110012647526523024035 0ustar devwheel00000000000000PNG  IHDRabKGDtIME 7oWIDAT8Ϳkq]ri~5hPD\tATѩڱ .:d']\ DpSmDv$@0)g{>I" "Ng|ՓcxeG>%y<7ظI)8xG%pm{(!,4/s(0, /sjWQ dEM,ҲC<$Р~bx 8GۨB[mH`s܉<0VvTC:.qJ?p3mct 6*)UX8AkC:SB2"3N! 5ϑVmEY͙,d)U .ZXo.P2x)R=iML۴My FƄHKIi#HL|!IWH:¤Mnt Ҷ?N61Al=<ݶ˼S](ser@ s3֠ѐr~}|S*^̻OקX_[U:ߜG:3KWKdZf |F䅝!]{} #Q L]o3l^zȠF/ _c '1% Vػoe8zt'1А/٥)5|7F*/2M]ayJF8* _ v.K[,Hkl ^d4VɬT*AqwTy,#ՔKI=!{oX#k TLҜ=ct(Zw4Jn500E=BާeaE3 9{ڲHB7,.\PDMۡCP.{LXfdk6GW>ŕjs钜-gg;;SeD'n6*,/K]u~'#FMLQIENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/16x16/displaycal-apply-profiles-reset.png0000644000076500000000000000142612653526636027361 0ustar devwheel00000000000000PNG  IHDRatEXtSoftwareAdobe ImageReadyqe<IDATx2̼}JѸ=!1wߓ%ԣ(@)/S Q^,DH+D8=w] &s9g.B1]8 Qqm87$xW# ΀K#e2"\c"dМmL1 OR'5Zp/4ID|E$H psY1ׁm` V;K^bY0 W}x + D.XzB53r'%@/ s!#uLEHU1l'f_0SS| ,w3cL!$[ ?}0AY+:웤 U4Ϧt :[60VݱJivoR\$<`GٳybM_l@#׀ }RW4 .GY +:=[cS355kQQdY&<)цuHq&]Wۂu:{{z[╬YŎWG TE_S@%l5v0pɡ&(j6%11]l2+V`DB'ZA|?/L0ql_IENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/16x16/displaycal-apply-profiles.png0000644000076500000000000000151712647526523026240 0ustar devwheel00000000000000PNG  IHDRatEXtSoftwareAdobe ImageReadyqe<IDATx4͋\EU동L $̄HjDŕ.eA\q# \JEpBHq!e4a!:hbz'Q7XMu]sL7M1IJ\iHq-KFk@HPv-//kڮ4P쑄i8eqr&TgFL Il'鳇oΐ$ZM#%J"׺؋/[ 2B7t04!XU 5a t9!4#@z>wWv<AH T%9L9  iægG@Y';No ~YBU׿?au u36#5lUDcvGQ׮+c|O; $ɿ%>x 2wU쨔J6)ȏR`R"z#ot.lMl=eų^F"$y[&(Ċu/_3Ս7w~%9{<s[}Mh8ݡX$ɽ1}fx,3~Ϭʋn9#WRcY]]'1{coT2F)]xF#݃hGZ5>7D$/Ƶ)q͑dNl&`•?ENeVVVJ)p*Ѱ:Y-Cw0 Hsۨ5&{777=3J9>MʒnoD'90TIENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/16x16/displaycal-curve-viewer.png0000644000076500000000000000133012647526523025706 0ustar devwheel00000000000000PNG  IHDRatEXtSoftwareAdobe ImageReadyqe<zIDATxdS;hQ=n&?Ⱥ, ? lF Rb+`D,QF X+Ml ;F L3;k6ݹ{ν#\.wUQi Lٵ ԟoH_Ckl]z=[%Y/A픮JeG,$SнlNSməvfPL@5D[ ~/;y8NϬ&]>֢0:>0 {9֒.B1IC'|` xC'AL1DW##(R 8IٸN`8EحMl;"w2&`yyDQE l7'm(N!ߏ䮈={ kw[0p"; 'bA&L{3EȷBP̌kи2}!0Crԃk>pIUWqg!HڰL/ ΟL)I"G) g,e/G:QX<l<_Cኈ*Teb8O loP5W[lkušj>@֡ĵ I OZRq` 2R~IENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/16x16/displaycal-profile-info.png0000644000076500000000000000132612647526523025661 0ustar devwheel00000000000000PNG  IHDRatEXtSoftwareAdobe ImageReadyqe<xIDATxdS=oS1=&iR5ZJjPTJ``(`| &  B bEСM^gs_~KW=Z---=־TJU1H:NvsbyE)CWt<p)/}qU^RW4bI>^J !$܍BxTA܅LcW^Cv6q7CZ?Ux Q9,.[p(@;]ڭ IՇ޻M\e\ i'GtC8qT63;4x?LP*ƽn$!2C NGO@{cϷ[F7@[_YOKŀL&dK BF0OPa0  9IAt-<4-l] s7mn'\ VeX[2p3#),:V9J`xc SB~{CƓ>mٙ$5XfGqI, wRe#Q!x`ќ*F%9H$gpLVb @wD@GC<'2+̪C^'5 r?IENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/16x16/displaycal-scripting-client.png0000644000076500000000000000117012647526523026543 0ustar devwheel00000000000000PNG  IHDRatEXtSoftwareAdobe ImageReadyqe<IDATxlSMA}=k *n.޲z f rȏw!G3tzfڅMET~]ZzoNp\<Ilτr) {Jwc?s\|¥ ҧJ2i \ɛNaZ/OEŗ(YqO34ĺqSyN'h->?J&8XxNj=.gn @n؂Sh(2T,Вp8- Ff˥i%Ǹm:m)Jh)yjq|ba{nkvXTP;MvfBy1swwZ!˙5*ŢQ]v;{mA`L$a8_KN0^_7M1>ph\.CEd|v5B3EP24G1\{!$|3k֒* HO}U`(qM!IENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/16x16/displaycal-synthprofile.png0000644000076500000000000000154012647526523026014 0ustar devwheel00000000000000PNG  IHDRatEXtSoftwareAdobe ImageReadyqe<IDATxl=lU}߹ȎcK#AJ(" !*@AP@DGE4H @BJ%1AQ.;}b ivVy3?cuu-q7 jZ&퐉kx-0-)F86mS Ȗχ)'nH%>̬ZO8dX {5RIt@$$9q}C/fi>cIB7˧~J)@,)OOz>b>O-2us+-+'C~rZI2A޹ ިE وqy'ǥȍOn}N{)X1fEJy<ǿ_GWN<aR3y+w_:VHQB<9K; \%0< #?UX[KiBn.rS_I%HY)޾f/MB,hZ,Fb/0*31-yiko|/kTå3v, m)aE609CM5cK[t. VV~p)I"a~gl"S9oIc^qY3IENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/16x16/displaycal-testchart-editor.png0000644000076500000000000000145012647526523026553 0ustar devwheel00000000000000PNG  IHDRatEXtSoftwareAdobe ImageReadyqe<IDATx,SOAw` (h,0?0/0DiT&v&ZhiaELJ]H@Żݝ㒗v{}{t3f51cDh(k.? Q.K vmưE#F+A$ 1/ tqGw KK<܇f|2fTWlj&\L#`u F;gaGA:W)oiB мET O 7&p?cּ(rle vxfO»ݮI`O) Ϙ*r)QaC'o@/\Do~ q,^??fY4@4ؑ.Tk YH-0La"SIzX!7a椃"-ZhLzHIvo@,[( Ŗ5V(8U=kTXP qjǪX1o޿B V|DL*tobad㍅j?MLq=}$VFk8<~I 23g%]0eyH"P\)Tc.e.IE R J%5KG/V-D6p4EA ){>6/$[='͙JaWeHj Rus3e\7,BaEZIENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/16x16/displaycal-vrml-to-x3d-converter.png0000644000076500000000000000144412647526523027372 0ustar devwheel00000000000000PNG  IHDRatEXtSoftwareAdobe ImageReadyqe<IDATxlˏUQU3]u D#2M԰-KwH'HHX,LtfB04̘CkۈX}{wKRjLMb#>ѬeZX/k!r{>l ?*>*G.Y\uOS + qJW'!J+1IuTMZ+ o(~:ۣ.'ϽϙX[ϛ V B!,KUSYR2LDS|3rXA`uZxU6VFWIok} ,NǠ 4Md8N_wp.UlLV e"ڡ"p S%rt)Ο+- MW^FZʏH\*|.Q$OSuEtpuU~ XD㄁GE!ix1Pu}JZWI+~yѓcwU,k̷a+s=e&O#,@(6<&FR22.l?#")6E6PiX Gs!/V/[Y=-š:6Qp?FC "" 庒"胷X=Amqݽcts0]ZRn/"#yϵ9WcGOԸyJKǓN!&vâO+mfq?t!4*F[Y_Ƕv# ċ?ȵ*=$?0H[]+,ad|IJVVZKB)P/44ΰs/o/N:&HYbDvdgyUߓ`-jW-ONJ.U$kBӔVŽ r$wq]+3 0EIENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/16x16/document-open.png0000644000076500000000000000111412647526523023715 0ustar devwheel00000000000000PNG  IHDRabKGD pHYs  tIME  VtEXtCommentCreated with The GIMPd%nIDAT8˥KkQw:%  E]/qQ"o#>]EUn]鴝fr; < 9{ērs( __<uRNT*pn$fe !{M0c 7`vl5]~raD)##a5qƧ.^4{~nݱ%޿[yna&{I[l} $IZkWuZ-3T"YE!Nh{DžqK%Vbg#oWWQJe67XX[eRZEܥX,22L:0Za3j=ed=s|l6|0}j.;V[_dbZk|#'Vx/'GZELA@#IENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/16x16/document-open@2x.png0000644000076500000000000000224512647526523024275 0ustar devwheel00000000000000PNG  IHDR szzsBIT|d pHYs : :dJtEXtSoftwarewww.inkscape.org<tEXtTitleFolder Drag AccepttEXtAuthorJakub Steiner/IDATXWKo[U}`ע*j H6)R BbUSDE ,  E@X@WPEj)B_t׾>3kn4 Fz|fΜk%"M3v@j>d2X4n}J?n@T8# >ё1bQ`ye _j˥8Z lj"ö>+P H&, ̌Z- tdq~Bq`fE 0TP*hJ۶`mJAaa U b0q;P@D` &R @)lLV@bj DhS`M@ M"TmhC/@dƓ&L@M, bhD'X(ekGDI*kjI^!" fN|PjBMj4K7L<[ ,` zFD:bJɇs[A?@\{$F=UM !updl-ǵ1!Үocvv<sڸÅә ۞&x0_:? G <0 d7DŹ?jxj7W3D‹ԤՐ|D52m^8ȲlKAMf"C>;<\;- |~#Xi&꜆_J kFGm) (Jl$ C)tE!ۻĄѤ9ʲ ȩz!df8t4\ \k-ր `h,;dI:pnK| 0𡪦'#$6lL:ڳw/˺Bs䞷ft.ȶD c !x(=Uh,!sTOpC֠0 '?D},#(,dy7Hr^E`"c%*`h|>) puxPR\aEAZdjy*(2v$9BC7Ee7d`Ꮆ zr61NH8j-oY~CZ*oN?^#%tNoLl:Y e*S  Oc*- *,2ܹsl+_[6('XXHcBp# :g ףTO2&fY` J(3iQ#q>!{tw=Y6pjyTw|"43fn_ۻ=ѓ%א'גi#>;r-ӧ1v}`vҙ "Jg;3躥pؖ"Lޛ`0^<4MR&_z<% @>[|%|0̆pBXI< C>XYM@rm oN@`nݝW$Ew+r<JrGXA6ـgv SU6Z3)[QЮ_ 4v좋+ڱ"' 7nݞ|n@Sl>Ni0307q PH d)tܥ9 JO 澞^  ϫ$'V$gAnmlU& PTU3fQ G)r-k=ŋ\:D~qҥK%awߟ9Jї{ ˵1(/:?.U@6=mILfõO\ǵ% ɵێۋ#J >\S!"$r)ms9V*fgC1odډ(Ɩ01K^悈Ţzńw"?E>3#'NIEð2vns3)-bLON _wr)4EHő_T6텳>fRSkȰUIDAT8uKq?۳=s^D+IP [$fJ]]t]E7DW]t'݈]RJEL4|3$]{{(mcu}89Q -@(!s30q7QP+]A#afvAP9Wht? =B߳L}deiȥNθ8 *oQP\\zDb,o`um(Z NqvdppZ`h"Jny@{{xRPd0ȄLTjubfe>$DeERݧ),r(qRb`.$Aju//C Li49t:MZU5XUUx^,^OC#D[yf>Md4IqSy7o yVYJIENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/16x16/edit-delete@2x.png0000644000076500000000000000332312647526523023703 0ustar devwheel00000000000000PNG  IHDR szzsBIT|d pHYs : :dJtEXtSoftwarewww.inkscape.org<tEXtTitleTrashbina."tEXtAuthorLapo Calamandreiߑ*tEXtCreation Time2006-04-19IDATXŗoW?_;c5Ҥ]JL (Mi 1 ICH{`Mh@(Z'41Jiג8m8߇ gڑ%~< c 吟:=w-οw?!c̮/<>m瓱_O8Nr`ttlNdwrȑ}$/.0S…S̎ZK+;^ٳlo pꇧ:<4cG :tȲm[A@u1HƮ`#GF(OO $I%s-oͥәw ʫ?ۋ/~jyss|s,?=V8JS?PT<)׮] ?_ͷc^=kX, €0 YTi&&h4DQԒ{:|[o-ЖeYLΟ;gέڰ e8 4m@V'lN jyDQHcX#!RI) eJž I\.O6#B ||=V8BRg2 `mFFfq=" Jc6Q!AD;!iz-k5ݝaqFZvJ\Lky˓LN},a-cۤRi$5=kLN2Skyd2n޼a却6JҺۿAJehAcpe(Z|w;>|>?x$I##_d==)i$Q1??w.Uqz- f:[ \ap'$I>Jij5Bff(Dms8MP7kjE!RB7n$nm(D)K.CJEXZR)Ai}`!RljDUw۠lV1RJ)aJbljD^#2 tbYa{Ih:Cv}.-s`u N_)EO*{! hrMʮBr3!J)\7 !ذA<!X#+;5wvTc)eNuJlFkm/2Zc0p1fM_^ojpO'$%|܌K*"ͱ\_X*d ={p3i @kMqY%rZ~㍡/ 8RJ-T)8nevBL__! V5d(OMjomqz}wڀ7ʓOǎ=144[*dM$#QL<11T*T~z @`IQqѧЗmAqB>onÐZAa{Յ|w:¡1&Pg'rCu{$zo9 \X%IENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/16x16/edit-delete@4x.png0000644000076500000000000001043312653526636023707 0ustar devwheel00000000000000PNG  IHDR@@iqtEXtSoftwareAdobe ImageReadyqe<IDATx[Ys>Gy emD©"b08)0*kRT c*lI*q(`%ce-d-f_z9=-'|;9w0MVx r{܎/\rgϧٽ6mڄ4r=zaX zPWID`͚5ܼ룡p7 \ F|k^13 ox7VG!LV{}ACleptMl. ^(ͫA_:`ǰr/[|A6cO? y|O?vt1XDȎx7$ButؒO޾oѯ@ ԤسCԍM 3+@`]J nO|; )@ J8*^ wKc3YxvuuMe /$8>{9ME=^`% j?-kZ  sR~Ԁ:fC7) i(2Rϲ }W.ض ,2ԣ`l| =ehm$uص>;vv#[<"Fdz3NjMu"I~&{IL& t[ڷ}hRoJyIá:,ai1 *5elt ߝYP,28@ U0rd%;cdE ˧ +KiA]źWώald qf_) "+4LOaݺ1QTt(KAHGKC7ʣ#i@6Rd P2&"@X@vl| &0"ylQ[X*{z<+o31c 5A`CQLu\|KqH4@a: ])pfjp[ 6o= PĆO͝Hw4U01=sz X2\g=|)9H1IԔLsryL)Ly8(B_+\[> F%v8jqlst5kzĚ~C/WY!atKxNxnX~!I )Q*( "ϟgZ( (=CW{kp8pֵg8V_,YvB& CG0U:088hw9`]_rg\;;:6h^eVtJfHDaΚ hddyNy6?6"|yN G};v[3@t_Yu5\:ΉP4: Wp49W^eq«V:>oX0-t18)I`i+r7|`95q!T i'41gLO'x4JsD ~;RtuT(Eby`DJ{̮Skjjv6Lt2Z{"S0|mE>+/o+4ۣzT4 d (`">?? speTaaf:#4S8A:D@ϡ >Yg{KcjTQ)2C5^TxtG٤6O/ ْB,M, .5)Xbnsʌvυ%b3(gy+f0K735cg͂!ϲ/ʡDPERrw*+@XDjd%qOInFeȍ3@qfLnF0Fglrb)}goM\`;l 507o !ܙ$Ĭ@r2 s#s7?7Z$,3@# کw-pC+ Ҭ pb6S핧BEMϢbNW9cWM]`%5533Ԡb*KQ,` ֜e{@5]vGDW^teF* %ivT2BH*ﭩ85pjBZ:͊2!fA|0z(_\[Jwhz{uUbqjO5i*.>{-c%SZ&k`ys׳V,R~+b@j/l-a~it&5SwO[B]ӂlQ-fμJCcO666 \j춣J!:7+NO!M#1kLySe|uB-uӉ8? EQ\3V˴?u0+ʜ.0cVjx`C 456ACCuK'.n'vȒFdhq üh굼a57Z28gVu23ǹI׮Puvm ROOOl[_өSDd: Fb0"tmYJm-tDcNEˌ l`6LdWwD&&axxu/~a|>v1*@LJz퍷߱G#ݝwtr&& N?JgEd>8yRukuEi?=6Dt>tʕy] ڬТFؒ*]vrkQ=9xx\8"g m+[,hcK,%/^Hn#_,rK?tRmsm1/TP ۲u㷽^sFMb׼rL"@Nrg#$o³YYQc!4f2`tlF XSҹP%$V!m(a]v̅[;wJmmmkVy`LgXKI3,D&T& i3xuИLJv[5{ktdw_5`s쾚6@ 6:: F| i{eZV p8lSsdJ`j%V,;͞|{CCC9F4|ApRPZOYFE *a FIbSqc,:B-2x:;wn6ʬ8W^J%3k1sX5&'H`*e`PXP%3eCg>3`1Ԫ+IENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/16x16/info.png0000644000076500000000000000120312647526523022072 0ustar devwheel00000000000000PNG  IHDRatEXtSoftwareAdobe ImageReadyqe<%IDATxڌAQdu l@Ǡ-(̢"vOkE)ňkZ( .XM%)*@gmCAk}f|{{O"*;~["V( [,`YRlPA9~eNJO|t^2c*&W՞_љ)xe?CYL+nd2S^u[k`~ ffo7 #7ruܓ:-׿ ) lJ Z|tX5H%b<wbYf-FwH5($IcR\nKc u7r]70`fvs kXGLh8l6 dì6}25M['yʴ5x YYsrRɯV;]~LchA gw4.J:eN_YQF)?uGDn=ąIENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/16x16/info@2x.png0000644000076500000000000000300012647526523022441 0ustar devwheel00000000000000PNG  IHDR szztEXtSoftwareAdobe ImageReadyqe<IDATxڬWmLW>" +v C݊ɇ QdfHWeR:M,qa̒eĐ%,[0P5&̖l?L H`|2ȷ T$'{sϽ EH *YQźEla8=WAcPhXլ0VM OJJ1?nZmz k a=@ D䴡4[WW7g"Rb n0qqdd&|M%]'a(2 WѸoR"=.3M 񽌼\VV֎4 N{oHF|w ,`S5p ݷagϟY8l4J`p-ό(d: j_ w$Dw.}7w )])^IENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/16x16/info@4x.png0000644000076500000000000000575012653526636022463 0ustar devwheel00000000000000PNG  IHDR@@iqtEXtSoftwareAdobe ImageReadyqe< IDATx[}PT?,˲AKE4FHJEmc[!3 8Alj؎XTLiMFmDT$R. {}wwم}Üyݷ~{gDUD]('DDۉjl FGԏExi!D 000`݅0 HeD^x19NTa율(UBBBpPP///\.:WiԴTMVK>G3>|?IJJJڵkCBB=<!gD%xeX;p뜬_СC;緾];F68`̱n8T|ضmہ'O6R͘7|4hF 0yg{]ze}7CN wgd t58DvvvZ@@@:W7 bnDPl-\Жe˖GGGl_?i^7o<$i9}rJ^ '`u|{I5Ff;dnMoY,Vf'N2^/4j}Q' 31F!,y f?kGќK{TĈX[q9^8S>Cjc>^XfM`^(n0 Q$X3bfQXj2?}… IlGͪwZĤZba=10M5yL̦Io?8Upռ19 rfMzt!vƍ=_>+j%8?`d  Qs44?>:uj7}r#>:];l7e!FZrx(1x*_Oodo. (bC * *xѣ˜Uv(~Ejk6M#b]*G@.iʕ)i/Z [^8\UiOEF9 G^qy;>$n?*"fvXDnT?muݺu Y](n5O_P [ zwڴiDSͮ^2ζxѴaIbbF*W> 9+dޜ9sƍ'ʖJ}Z]}1#v W&/4)999t6XE$&&iv7*u4X . a7L-z8qGV5E8  v$Z >>>~(Cz/u`OC^_1  BɎt9`8t:LRFѢNjO p-9喭^th4ѻ1JQn.gp᷽Zh2=M1crN c h  f§Ǐ&yH3DtD}Vxid)Zd{憾1j=pD駮gϞ=v7,$k6;-ȍ;jC`Pw(hϨ̎ 7VZ3g, u@̬0Z%1}`j,,8dOQ XhN@81fp[7ŵ73G VVNjň~-y͗I(*R\p Mx bDLFNƸ"`QIII! nA${m !6 r`YFēgܬ& tĸ@2>YnM Y^Ǐc6L,j`ϯlx#2SPP󘘘c ;!!s#[fJ'~7l o7Maٷ㦩eKmiLjȦ)LnIi‹`Z]vY&*,,,b@$/;w\)۫Fz·X~8?IY B_̐~ĂEXnE3g6%ϫae>ez|-_!RtIENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/16x16/install.png0000644000076500000000000000134612647526523022615 0ustar devwheel00000000000000PNG  IHDRatEXtSoftwareAdobe ImageReadyqe<IDATxڜSKHTa{ Ә:cJ#B h\gA’"]% 0$(7AR"XDH59qwsif(kӁRLè54MJ%a(eZ> ObgIE0; E|Vzs$ntEwm^k,͢!W.Lm[`܍P36JdXY ͠e/nF:h:Tbz W"`K**ͣQ2B;gw 4# yHb-ӄjeq,Iž)~[qEIENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/16x16/install@2x.png0000644000076500000000000000407612647526523023172 0ustar devwheel00000000000000PNG  IHDR szztEXtSoftwareAdobe ImageReadyqe<IDATxWklWozwo!!8)) UTXEG*@'? KVGKݦ&6mš8Nv]} ݙ!Q873ss}{WmU<3tP!=]̣ɞiµwcW}` CGMm`eYTUB+6EB"T%Ċ+څW %`L+V$F wcẋX=~:޿sh~x݃ԛ\Û#&_7Z;e<]H7gObsp++ɢYhR+]/tܓyB1ӯ}X]peO[lm{o ͷϝ{}ۣG߲lLN}0~HT* rEM,ĮLfa2j.'%;/+7?30@4Q_m[G"B n2~֨eiO}sgb_78'%zᗈ bѕ*;/p QZ?׏Ø='(3\>5xs0Ts$>\k4#·nco+[~%6??ōgvy(AA<.?Nj=0/ĶH&"aYYSd ~!)&Ltiy \8pM zD8F.ChW8XwBΜd|ZM%-464")7*L7;HhA]|>ڱK,ӥ= ??~C813_|Ms544azvUYH lLzsu˖Nɠ(^Jԣwi<{ 0?bzzha6J02e,e$}qCGG<[geG*7P[[!)Sb槸۱h!hTibġ`P 0jJ(,U"JC#`10G`8,ΤH$6mߏx<1 zD29 R~Xa@}ҹUS݊abul󡭭MIE$$P($ΛLTz]* tgBwm֥}iaIj@,c:q!l8͉v===L:Ce7J@hZ_z=qLD"1|Ƽ*P}yniiIcVx`AP*8L&@ Al9Lʹ;%CxQ6>vMMMԩS8tD6QR H'ǫk|u3P9hmm{{G,]n]L9Wo&N9w7ieܜgp씾vq*[7cΝ8}u`츪qK$.x$^ 455֓g<٩ qHZ؜f|Tl!(PFj W.a4<PRZq|&W2J3Jf2$W\,ۑcm8N[8r`p=hk,.R,'&l>:[Kk<4-c6CZ"-5VBtDakK>*tzidpBem7Py,1"89GLlݵW,S ˅n ;v_?%*bDdĿ}R@Ar)IENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/16x16/install@4x.png0000644000076500000000000001146312653526636023174 0ustar devwheel00000000000000PNG  IHDR@@iqtEXtSoftwareAdobe ImageReadyqe<IDATx[ tyfZ%KezزjcƦaMʣB+m(I9>'PzR)iBRN!SJR󰁔c'`%$z?wWڝߙݝYɀΩ̽Ut]lWo>J'yϗ}x(*6? FƇFgL-W!T!lt^\ƼOqCR1w)4CU\Ɂ)@䦳 \~+0-R]₮kEWR,3+4,wV5C d"NQL ܰAsb8<A`X^`ЈJ4vE?T uE 0.,!4I,ja` K 6ܪn Ot;̀kRunzg ~4xTP{2dj}K4@d)ޓZTe{ K{]GQUHƁd29~Tv' xH `x8=zм5KE1>t,B G 1:G$9O72#֍/6W Wab"S!7K(OI6/bb`B ql1\\T2jz@fiЉ DZpopU^/1>Ԝ ڟɼpix'Jq 7F7\j9 8|EIj4uSת-(Tୣ^eu1EN 1Z.4 ߩ/Z;VNghêU2[,J!S¿h; ?Ry)%1ڢ!%2dXZvnZ0u,*υ{֨LQ[Qj[J3NǿX?oom| 9 V0.v}]$ UXA-}6YTī>‘PWg;GH;EwiN'p:*sፎ9\1N,/(7AG"ꫭr05WdE_BFQa]GQ@ɶ׾ ūQi8'˗z]=ތeڹw 6665pMj6 AIzs' ߿ka+1j. wzƏF'"tLW%H~/|>4^꾑K(FĄH4lkIEsbB"*<-*fǂ TN F8뛙~3gϐM:5Dc nۺj^ '}t=hKP^uÈD"TT0hYHj$uV{C?QgwJҲ\iu٬nݏ8 <1:߷ -cQO^ #b}~,0Dж 79XcT-r !##C♶ `t*4WNq<]ŜJ;7[tinFݰIz m`o oQHS+"CD1J}&RIc@)sc' 3WnâuI-뤚_)eǧoCٱ^@/cqJ񝁁̙3'vl(..`?Fdz}Yр\@ВE @x,a.ˣO(5OP{>^" a݁Vk$*G#nVu/ccc"W-).*J( -3ǘ&Sp  Iּ6R$Sޙ@z(C )b FB$`\zrȄ`.ի.h]WW'$p,~dyy" g ޘW<ӚOejLI=CP  Aܾ9sGP':x=X' [s5ĕ)~'ﳻp_HYg\,I-a;1? w3C[*9{~tō $1K}@W3>ufX r p#^0?ÖukԘKw{*?5!2l\@ZcQXm6SXiIѪ]m b'rpmgϞEII'<k N%sk1dy!@pqTp@{Lv\L1)n&JjA]9В&mb8a],˜;>GnM%.pcXQ愋,)7kPqq5nț20%tܙW^yEK,I=B=+cRV9S3>s̓׎?5k֤@{c5(ͤ5ԱgAvSb5e&Een\N٬FW\r5=ǝgoؗֆ  yG)9 \,4NY!yqb@f}`ݴi:;;pB!ĜHY#u8kJjlg;}rԇ-[&9k7׹ 5,f09R^}4>rOք#/EᅲC<ь޾^:'2v%jvie+3yDc#}@8&"bYjoS*n{Lj]C8RχCbeJIENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/16x16/list-add.png0000644000076500000000000000101012647526523022634 0ustar devwheel00000000000000PNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<tEXtTitleOptical Drive>g fIDAT8SJQ=MDoFS b"b`#ۄ4[X ~(!EH>&&{X"C3s!݄2k9mbv)tm,Q0&Ff o!j7m+9c#"Hf (Zef j BozbP% D8fTBfM%1^[:ɗ=Fk4^B\VH) wL0:mb㟜g IDATXŗo\E?|wql'/425D$zĿ!wHHkJqlB:{C;?-hOw;|wo̸q.Sn»dW\8'{on/bf`tcO[^[ZA`qaG\x!D./ANv"A3"c6$R`(JTt9&B)b"50oIeM 9fn4u4%sEU{b?V~Dd=,=y+X;{sBΥ!ҙ~NCyVǚk R*/d~׳'c4jofM;LMf'@` " V7C y}ѻ>3 GkWiZjol RRy fV!&*K nuc?CD('dp}2ovcw ! %Y^;,,͝t`e0SVg0c}<Kk714Րeݷ: SllIɘ_(:*w,g+R|yxfM  nC) LydYiy"Y뤮i |eXSR/*<$<:U8c*dZdG?`#&LD*Ie#A|a;sxA }3*`3QfSF2Y!%ȪLu m`f&"5MVQ9Dɀ o0͎5^C=oIDjgnLsb[/ٚxt /qb[U6hAh'a"ЇG~/ܰ9Ķ=O,oJm0_u{b%U%= oJmgP+UiPIdyUP;W:nѠҬomv'y~q:.[RIENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/16x16/list-add@4x.png0000644000076500000000000000533512653526636023230 0ustar devwheel00000000000000PNG  IHDR@@iqtEXtSoftwareAdobe ImageReadyqe< IDATx[oG>gv_qMHS$TZABEh@HVDQ^@"/iHHHRKR iǭ{wgkwgggmk޹s9ߜ]#GkX!<'~w}AH~W?o~qgmt%_޸ +w6.^եA~Q~"'$)1 Ni*H/q(]@ I7L[MCwAtTr*rcm ka vr]0HC]B,WQ$!3+_@D8HQjUD r~ :r}tƣ., s* $6^5q\@-b( ׼Ⱥ2\XkndhaW #|)8'x4u 8APW]MNt#s顏d)/[$pAiyQ \ t}ᰧAav[y^ϨPmT ~]~ƭ28  *CŘ,N }mjz>yx lv"-|W㘥5.8Ւ $L@oɢ.+n&;.'_v噤uAz.wΆ*6H]*fMEEp,lF%]A*AmҨ$}aySq̿Պs_{cl *8;Bt6P `u- Ro& <e}KףյMqvG/I ^x!ALZ"mB(}eC]a 89?-޻(ܢƇ F׌#AlGâkǡ#mo.Mzq&N,2RS:FҘuep6 buC?wnk@#H2^{XvGR9Vַ̊_!JVnfՃ9aNTl`7acgQ–?jʝUe@MwKhatgƸEE lip{4W35DNErxUE}heܞ+U1&qEɪ@=Ѵn ot*N9l1.et%W>hT/g^W5rW81?n\Yf]𙂪6) K&'w~+={TW~Ofgf x?kA3-ua{{޸hQgۼJ_ZSIlOb :1[ڌauP%Ƈp~FfIOfv_ruvμ<OqXR)P"-k)*MȮ~`YUaGy(e(ћDdBʹW]X@ZkJ*B`< 'Is(3Ք;@P I@N!MBޏ8("};*s)Ϩ CߏϜcb=#K)QUMa\!Pw.`1&B}fhrM,(vh,b~#qG2d*XG|7g*fP@d[EGdjHI`tbil[P{7U@X A."2b 0Gy%ÔL&Ԃ-eO`y[5n 3fQ~O18d)0.`}.2ub 2qWe+ irLU9Do G%̭|YY  5sӟ X]j =Fb|,Tu<_IVi?ҧVnEq^8xBmnnû7n#c#+2G]]࿉I >6dl# @Aa [SRRrCw [bbNiii|f wss[Ĥ R$_PPp ԝSLydo733tvv+,,< d phnn~00a„w@qO fDPh䱲m _¢ R2%==}iSS<(BCCxyy99 +j~عsg(333Coo+8(6qqq< \\\iԀԋ [#k;wW @?@uuuW @kAq -,,i5`Ƀh N` g!0V 6tt@6?6/ X^055mERÌq"7@/725`rIENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/16x16/luminance@2x.png0000644000076500000000000000352312647526523023473 0ustar devwheel00000000000000PNG  IHDR szztEXtSoftwareAdobe ImageReadyqe<IDATxW LUGW"QY#$E j@Fh`B ER\j0J@pAI( )Ȣ Nx?hS4$ϛ3s'Mu6YGGs޶m[,X0sc䁙vڜׯ UUUիK߿/Yy`hh9x{{3TʴzJgjKÇYZZY:>>&&&ةS؅ oDBOI׿yFឞLv!HLLaƍ+n߾]ʬZjժ?޾}+PjE8蝇jjj,1g!*6 ݻ_xcffV'HϴuttuUFFFQrrҥKYkkk:l`JGFFFȅtc|˖-E ?͡W9sА67o7O!tV'N(tŋ /=04 wtuuqwww έf43WWWp#G-[f(/_ 6V8z9vvv{>xSL1wwwa[Y!{ AQ;v옰iӦD777)<{!^y;"& ܼnLF.Bnl6iqOz@L 3gD4uuu@DqM[)zݾ}FDD D3@5bbEZ6}޽{֯_ ~_ +" Av]) /))I@RbbK)0}}nKĤO\Ol̘0-"*xb8N Ke[Jwq'߼yR{_EEEeee 1fn_+++y@ziq$ܼyn`h $ qV* ]\\_l\\ͳʧ~5ab h{OOOmĶ066V'O-_5C?'֭[PX (~W^%LfJ.ƀ@mmHgg8YAACΠݻw5g,>|ICC]x!S17Gq^^B~;V́E RBCCSQ"4z- 5ҎbCpI:o]}}=74<<,+ibBjddMa|-<&[YT9F|FFFW\bT@dX1a, vܙ롒Z@$A(<+ /W>n= A0RMY' "1];=3/#R@U(P̴fcK:/#X܂%MwFgcK2c;^ЂQ7N\'pL_ kvIENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/16x16/media-floppy.png0000644000076500000000000000072512647526523023535 0ustar devwheel00000000000000PNG  IHDRabKGD pHYs  tIME 3-92bIDAT8˝=KBaPE  MM☈_  *j% %nz)[Һי9xG@X[/&C עTi_@z4 NX?瘌dNM  5' Bf;Y4+PT:at|>_wW.5 `?x7:: wn]Q4{g>06iFvj-"jH_;zZEi;pu'0i4˲(VXHv3_L@EL$)Jض $ "CU`essmk , cnɃSIENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/16x16/media-floppy@2x.png0000644000076500000000000000223212647526523024102 0ustar devwheel00000000000000PNG  IHDR szzsBIT|dQIDATX͋EoUWfd& r z2(!"1'/|I-Pj`#' …+K-w*nc/XۍA @)AnڭA)͠ (@N05uhF"N݁ (A%p*=glr J)=pis|ҔՊ7$I$c|gZ+v\2:!McoL(DhD9(~W)VBcuPJQK'v$O2:6F)1 fNU)h{ ?~W|Yv=& n{G%0pG. yQh fs-e2 e J B$@DglN?ugR+m5b-ElzCDRG:zXmyyBA2R q ܱ+}5hIENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/16x16/package-x-generic.png0000644000076500000000000000117512647526523024421 0ustar devwheel00000000000000PNG  IHDR(-SsBITO pHYs B(xtEXtSoftwarewww.inkscape.org< tEXtTitleBoxZ6tEXtAuthorLapo Calamandreiߑ*PLTEZXXY` cZ\^ZZnȨvZZZZYZ[^b qxL=1cȋ*ʗI͏.җ9ҮwԞKԩcլjּמDخkٺۥN۫_ۯjܰl߷xǠY}ɟѷŒǙԺd忄ϫĊnַӯԱȒѪӬղ͙Ιџ{,tRNS"K]ahvIDATAJ@ЗϴBW QWӻunL1!6{ v p|.TaW&u @Vm$kM}):,㲿 Rco2(mt@G L [=F.ಬ91#{vIENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/16x16/package-x-generic@2x.png0000644000076500000000000000325412647526523024773 0ustar devwheel00000000000000PNG  IHDR szzsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org< tEXtTitleBoxZ6tEXtAuthorLapo Calamandreiߑ*IDATXõ]UWk}ιw.wf Gai @JILKMcZ,L?⋾>Jx2ֈML21BՁ6| ӡ wkpν # :|1=Yնg[u~ڝym/hvf_yf-z@űc璏ơ5<x1YgC}*D_ݰg_GDnWX$ad+GǶy&Ɵ {tgFϰ~ӷ&D~P}ꘝ-F'nZ헑}w}Ucqim3&s7P"sm=y஗~;>csK?"aX]?42#k#$)fQU*#yU/켫}!9Ŝ_㷿esf=_XTC1TZStowfQ$T`ǟ<_{[W7 > ! h;ߛz $4Iv߇j .!RO 3;Oڗڻ?+/Os8Ã꣣wl Tt? 03ukSS}IVgL+& $xKyBv$K a\k.'N2=1N~$.FcxƊrΞ1Nf'9[n/? ]8 |m;+LNc.ŠxD\5yP% TLyZck׭ҿeo ;FN'_DEfQ 5" P áL"*vX͵w8~M~!ɞz [Ufܽ!垱͸$E|!> U\R-+3O!vn&#&7&ڙU:ٹ8SNiYچPVS@L\Qq!J0"aA#j4Gcdh1&6fi,Y,K}s- nmRܜ2tDz/9%6# _M:M Y‖&SD$" >̣?W->݈,ĀK\._X Nf"a8(`b(/gef'"bfn8!#1AaN"D0sꮇ7WP\g>>`3AK>\(b!pV Nt>~HiW) 07+ү>@H'"~RCq8 VD ~gHgġ"f}91C4 2cA^Z:Gsi +a^J&;M#[11,>X,+U,CbU bRH)S:vZ4^ 7A{5?׉[!^oqn?ͬԀ{+\DW\NS@c"",?9"`˦X!D IENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/16x16/package-x-generic@4x.png0000644000076500000000000001025612653526636024777 0ustar devwheel00000000000000PNG  IHDR@@iqtEXtSoftwareAdobe ImageReadyqe<PIDATx[{^u?go,:Y -iHy6)F!Q*ijjIIIDn$ 6>ǝə3sa,޹s~yp; Vx#>pu l-v {݇WZ$"Y/KSw|!腛S@c{o~ P؃U7=r`-?|wJ7cJ+Ϟʉg*CMۮ(^I@ĵ 2 []4#IԺz '_{S} Ga=}Y {#=/ |RT? =~nw>Z7)#2-]w._~[ܤ2:XId uPsUơO|t/~/|L&\;{ĥ[h -d,\b5>n2A=ݣ r5^KJ -G~Y(;L0GR!F<1; Ag`+?Ozr󀹙FUϦ-ۉL>XxshKe婞:m qe2ܩp(R Ȗ7@:vsyJԝzT$" 'v4Iy е܆X]f|n@@^+? n ,p  Hʸx`Qo w݉1OcΤ݆Ed*`LbsCƊ)ۮ 미 =ǟkv,v;7bd|feg}ީڼug.D[DK>X[HhOT& Zd.8axocO߼ :{/`#n. ɻi^;Dqg>i3H"I8Qc@ &UHIBqTJCP/= G+йJqq `r9@Q/Fj̱P6hCEi*iFs>&1hh%1 Fдh詓`0r /yŦɤL7—uQg0P}&@a`JNfț,0SW+g9[ սХ.!h+K0;; ǎaa#]y t=$Sz[5.!ԑ%& /pT%æuPqk TXI]W`޽yvJR1ǩn011NOGATOA!5ՈT@$N mSM 46\g/TKNSM< .-$Nm.>?sP!׎^2og`zvBJIk(CMB^l )!XN O[b`ܖK0CUzUN3⫧ar v] ucr=%HS8ʤ075 =d$.p`d.lbXk i/IBZ$M!-}߂M|RڧIZmQ  u@Tr=t\W8UJ\ 2"M[ D%togZp&/6t'l']7Z*@AN~̹3H'hPЕB* ]+|}*dJ)RJm2|&Ц[܄VLƶi–#gWWsί RG/9]5 Jmav.dZLrF犔$ɄWvNl$7`a]G#ptPfp@u5k;X@я6q3|_SlMȎiJ=~G-ֺuK#a 2&0hZ|n7"r0B]GN--%[iiK jFmIv9Yg6Y^3+@[U+ԵͅЊ%V!LmAm r[NRܽ~F{Y7X ];C}ԕ jI;0_h! 4F[) ;ya"2ox u!Q3٘9Ƙ: 2@F2kn/B6bҼ(*n3iQ Q@4Fhn"sw䃬EZ xi }NN aS l MV~,|C. }>c*,Yk<O<_kH6 B܊1(ߍ Oխ.YPeWI]p1562(`;I `\ɹKhgkgl.n#rU!Yi?OBs]UPc]SSG jvĥk6+]=ԉ&Zㆬ?Dn C TP {o ֙lR z30p2f  ą ^#΀pU0`).R,10F ` b` t?,|rz:`iFJz > B ?t~8b E>IENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/16x16/rgb_gain_green.png0000644000076500000000000000054212647526523024074 0ustar devwheel00000000000000PNG  IHDRatEXtSoftwareAdobe ImageReadyqe<IDATxb?%Bc022˜2 9 @37 {3b RjI '(+2d`dpGևd,C P<P vz~2D6>@1f ` D v1%ʀ j6`T%€ 'QH Oxq&w:}\JV~ >CvHtӌuL,$^ p8C?PzJdDb=CIENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/16x16/rgb_gain_red.png0000644000076500000000000000055612647526523023553 0ustar devwheel00000000000000PNG  IHDRatEXtSoftwareAdobe ImageReadyqe<IDATxb?%Bc022˜ Y. @Swc`{RjI3H F7@+ܑ ]?fdN h?@l0x 2080f e` '&%?5a`20B@y`T=1̠+ o4x2W6Pt׌H ~ 2 /na`8~(w =%2xfoh|IENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/16x16/rgb_offset_blue.png0000644000076500000000000000110512647526523024267 0ustar devwheel00000000000000PNG  IHDR(-S5PLTE!ei&yz#1p{0? ?E|`qGxfVF)~j]M=+O6*eu n# *tRNSʉG$ږ%/NY,٣2hIDATc` 0221s02B8uty|zFA=S3s K+k!D@K " , HG%$&A!◪s&̥oݟIENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/16x16/rgb_offset_red.png0000644000076500000000000000110212647526523024107 0ustar devwheel00000000000000PNG  IHDR(-S2PLTEbj$qx#8jr,C0:{_pFwfU(h\L<)S3'r4EC*tRNS͊6G)َ/CU!֝*T!IDATc` 0221s02B8uty|:zFAc]S3s K+!D@[ " $  HD'$A!`s&̥m?,csIENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/16x16/rgbsquares.png0000644000076500000000000000033212647526523023317 0ustar devwheel00000000000000PNG  IHDRatEXtSoftwareAdobe ImageReadyqe<|IDATxbd``@&?# qNM [9FD,fJcd|2V9]]]hDw6S9iia!$(@s'19IENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/16x16/rgbsquares@2x.png0000644000076500000000000000040312647526523023670 0ustar devwheel00000000000000PNG  IHDR szztEXtSoftwareAdobe ImageReadyqe<IDATxb?@HwW=wSS#[]]]\!)`?}h}ң`uՆ^ڐq{ d0IENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/16x16/sound_off.png0000644000076500000000000000041012647526523023120 0ustar devwheel00000000000000PNG  IHDRatEXtSoftwareAdobe ImageReadyqe<IDATxb9s&>WBYfR rj:uA?7z ltI,4XE @5@5/ƻxV>h yFMSKeKltXה0>BT WU*jz!u:R s}_aT(R\ltJ,6h0P&˲~P;bl\.Z4 J%h4p"# brH4AM@Y[PV3="p F IHf|rvhֶR1Ƹ9*@qǾ@1b3w7'JYG¸ =u Hhw˚hV?gfmOzsssϹ^MuѨ,o}0dRB!kjjRHDy<|`x[[[U8V>׫@GP,,f (~(KFK2A '-tLaG,Cr\(v x?(Q2v ^bVlfB#4 v8?2PYk`hZ¯M3Pyfٮ28Y L+p`0I~kL{X^ 8VBi-lC0^o=.̇qA|B x M9jXt# }#AMA|Ѕb&Jv#C?ϯ;5Υh̚}$21%ewSlHEF妒 l7bNMc͚~]7>qU}:!Ϝv|G-]-j㋜DR>.0te }6S3,kbGoCGb)]P2ub;}l@ŵ $[F_!s_g:޾@;d흨\[F?<$pO pqp!0R>qCADdZ(ë x߁e%X,A3 ضY%trYm4O& t H#= y̒YjllJ\O7$v"ODz +^]m26m!]^fHdrb/i ZMmܗپL7 ΛWhw dp{}N;: Wew5 P[VGLIRnC0_?Ɵa$O^\I5"͆ 4q z>Ki^F-}5^u>_ bJQ]'pNl~ZUť\N|9<:n{E4?=vq2 RT_VVfjyUy_5<;5]0|1+f@"ky{pN2XhՊ $^BgVpfvqڢ dŷ@m>Ŧp,[wiヲx: _yM~p2]ϧ!fa;TKjhSIENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/16x16/stock_lock-open.png0000644000076500000000000000126512647526523024241 0ustar devwheel00000000000000PNG  IHDRabKGD pHYs  tIMEp9tEXtCommentMenu-sized icon ========== (c) 2003 Jakub 'jimmac' Steiner, http://jimmac.musichall.cz created with the GIMP, http://www.gimp.orggGIDATxڭkSQ{ojb%bBAjLKA!.wC@;!"HԡB$%1E=p}x{΁c`y^ٌ{m4L& p uMJ%m꺮<\ VGnwf?jiZYEdMD}9F#)[)^am5xbOJW5Kkʱ5غr417f!yMؽs M:#hL|O_I͋pw7>b#1q% 6B>`Ypf6Q$bɗ>"!<+{Bͼ`HD )lv(Ixe ,[§A`~J:C:=WKcAmc1> @Ϲg DVIENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/16x16/stock_lock-open@2x.png0000644000076500000000000000313412647526523024610 0ustar devwheel00000000000000PNG  IHDR szztEXtSoftwareAdobe ImageReadyqe<IDATxWMlTU>OˏNB[hlb . XWl`…!B\41q6ąFEC4I3X`L;m03{wi&bKk{s|{ZӃ8?{Rпyy\ ?&jEQ$n`ǹH$k xT*Q\nnΝ?`XΝ;E̿_e˖}b\' C],5L&Oy;]zUi\Ç7*7oۭGH){X6ȳ}}}^~]뮮3oH50|ۮ])+to1ٙ;zp{{;ݻ{0Ι7njۄld@ 9 .E6l@ɘ߆GÉq2lԔp !՛#fw1_-VQ Eu/e-qw, Z(Jw&3~1Ԓz"յ}Ït x7b@b$*UC Tcqt$UfI-&Y+;7YmCPH{W>yT*ܥ|~ӔDjU*VH)Eu4}+M<[k|e]kkHbN%s1ЖFEȉE#@v%jC(Op昗G\ v JW#,9zC+ /RJbp|d pA0NPLN%<=׹$6Y׹j;WHT 8@HY9/5:yIƩ_Ӗ9O4a@j$ =k3ow !jKpc mƐX"^u҄D@u8BYse³~/J&eV@XvrT8d"a^8F2=΍p8vʄ*\83鬩 eYűu)Cr)M֑*OUr67Zg(ja+P 5^>'6"CUfh OMiDرC(BugW-B`zrrL2n ׋(~p Y_y=t eތ_%dVRrY Q^ev: IENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/16x16/stock_lock.png0000644000076500000000000000133112647526523023274 0ustar devwheel00000000000000PNG  IHDRabKGD pHYs  tIME 5%_tEXtCommentMenu-sized icon ========== (c) 2003 Jakub 'jimmac' Steiner, http://jimmac.musichall.cz created with the GIMP, http://www.gimp.orggGIDATxڭ=SA"\6jL?! B!6{E fbt%9ALq<̼ꏀ@nG@ ?JWV+ q8vle28ٶ-zWfeez]t:e۶ wh\z A-tBo";9bo- /4<-NdJKESܐ 1@4]_4w9 r:k".)a ֆDk R 3U% åR29M7 K,EWgX`z:Cz`:=sza(ИX|9O_  ΤZdwIENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/16x16/stock_lock@2x.png0000644000076500000000000000315612647526523023655 0ustar devwheel00000000000000PNG  IHDR szztEXtSoftwareAdobe ImageReadyqe<IDATxW]k\U;3NLҚ& JD+RA$H#xHP| _T+ "䡈G[0H B:mҤt>NN3(ds=gDh˗/m4<{Xsggx#68BٳDžF̢e^ZZlV_tIh˲~` 4Y݃{{{)Dprbٵkc:~8lsϢRk tI9,6ÉDc\A|__m{h/FJ0tg9S np睱 fffF|.\@/vLm Q A"$EJyK*wI 3Ї?x,?3`œv+0O*)LG~P&HJ8[HKJIJ$y^-;YHq#5Mֆ, yØ6[4A5 <`Y6f8$;zizPhӸd#%0̦n,*u(cmcDm(剥[&-2&(@E x,SG#fD ,2D"0 =Kˆԥ" 83acF`aQ{%B9(d e*y@iVb5kbqTyUUeC4ZNFDďOJ1+Z,*Y3(_s7vS4*ʢ:3T&`Xua?)lxK+ẹ6V M ! 5`Glh~ 0H,3<';fҶ&ZV(LeHBY H.^$;(u8cr1ZoL"4P4 ̙-IJZ(ATw6̖d 7 PGd$:O7 u %Ӡ?т}vUOCbiw *#U^XMEɰ5&4 a1'7֟Efy'ݻQ;e60NnNw`1ر(Zu7ڴbwOmҦ_}o,,?)V^~կgoot!T(8DxūǵJٌ Y)ǸiV /XIENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/16x16/stock_refresh.png0000644000076500000000000000155312647526523024010 0ustar devwheel00000000000000PNG  IHDRatEXtSoftwareAdobe ImageReadyqe< IDATxڔSKlW=͛Ipb;ű#ҸqRQ0*DU) GQ[,`SlAuU7]GBn@ IqWA*q43W{Ϲ;C()ϨFw3FvM1$HJU6N2oYm㳋29ɧ췏C;¨yt B3o~Oط$jT=;FZB؜c4A Za`LfMu@)pKLgly17ǃqү+XpWU-Xk#jPB@X0iպiPprL }Уt) RI cw,1:BzbZqQto۫ٮ ѶHbng̥dX ,x,GpgȪt]Af(m{I@"(@a'˛-͹hEvy Lu1 WI27;N2= @R8TA l:-/v~[i'sO_<rI.:"^tz:zpL9="W 哱/fg['3h,xPCñ7Q]E,jBVO@o8<74G1[E˲Ԛ-<ygVK?*ݭTUW0f&'0sϳç9r}'JCRAS^/Zq͟'/`nKP`IENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/16x16/stock_refresh@2x.png0000644000076500000000000000517012647526523024361 0ustar devwheel00000000000000PNG  IHDR szztEXtSoftwareAdobe ImageReadyqe< IDATxڔWil~vzksHY@@D%HHH6ZH6-UGԪm*z9A@KI67fsvίͬYo|>C(!'\ܕ\׽LDIJfH>}&jXݹޯ <{M }@ Ao/ywIq`?{l⥲ JddJ#}١サÀ3>ou}<۔/}ٮ1psZ 4m(|F?-\K>YId`6hxye%[8 YG╇邷޻kj_^,w}K Bqehq)|<8_!G6D>V ;76(B/!EJK%뽾|#?x/"ؠ }-k~gq<A?1hwK MՃD9 qV{[|N?Wl$(A6;U\]߯DY5@þ'_?,-RǸ!UUHi:`bb"w,K飠н1Ư{fq\yp*=Ԭ#Z326 kے\;B9#0/![Ёݧ/*!= M0aaUBXm !Pj]|!C0jYt ;N,]eA+I˂&OzIɨq짮V:9-6m{-9O1+'3N'<\)X7Xed/-\˿?.Z9Xn:gĉ\zeEym4-C[K h|nF xE@y1:5}гsM Dܶ#q \ɴZ\k@mXxcs`3"k/̀:0-MJw{W}$RO8&_YFLٲ;(+2Xe&|>AȺ5_MJÕM-և/\:;p!YNXhū$xQ@Ee l TX\HXCh|9D.7сp@72׈X{+$zR߉5` .缔E0DR]dqySN0es<-yz 5&TЗb5h\SzwNb8* ؽ$p8HdU~󝚽vC[[{AU@VdĩacZYX*|>XDglr2|hԦTAaECRUoL&"@q.#7jhQMmv6lӈ$K,huYrmـL~tn50{E&ӎ;'}JKy#Lpӝw?tVO7:5r\xk~ݘ\pIENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/16x16/web.png0000644000076500000000000000163412647526523021724 0ustar devwheel00000000000000PNG  IHDRasBIT|dtEXtSoftwarewww.inkscape.org<.IDAT8mke33on6TM6jV(%dE  $ɂKشz(m܄i^H%Mvfvy"'( p0q0JkO`) P(N ~xX5&,{#g=xrʥ['7?9}'HuN; # o?_ 7LSK=>O̬,,/%lL:Ҭ,~tGyᅧH%$}OWn\X}.?McNΣϨ& D§ eU)? -!ęyqncH(p&DVNBI( 0l2vA ~AJk,rt a9 ؚ"tr;n}4vL ,4ݩ%(-ox7?Vo g8pʥߟ PDq!9@GZ n8{ɨd~#IENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/16x16/web@2x.png0000644000076500000000000000447712647526523022306 0ustar devwheel00000000000000PNG  IHDR szzbKGDtIME("\TIDATX͗Y{{g/ٌM08KQ@@Y^""ey QPx,%2q,8F 6`g<=ӳw{o{dQHGURߪܾ?.\mGUDGmLج dhi3gGFc+,]m/U6%EM"FU,B3-J9[cN]VGaY)O޼ιՎm[L{-V?Q"ymډG-k(9C'cx")|u[ nT>(C=B}}qGǶ&1Ǒ~;hWcjo-1<Ѿ&n_!1r^Ҋp#Yc;X bHRu B31aڗe >λ@?V$GZ1`(Sωr"m[XR4qwYo s L;.kHwҸV$!!Gz)0 1&DHmKXi24$u@:@ut0V\Pd`%a6FhL]G*Ol\rjU& BWwXi1cGQJR(}c7Q>0\؄!MhbUTה RH>W^W"V"Ro;Ʌu$Soͩp]B0 ۮ>-s]kTLbd)BTʲeWӿLEZBXL@FΎm,9E䊭dHȰd2e%,SH5&_&^ +ɹtl `81pi9ec:Qe19.ﰾM2MEZ>^Fԙ#Ř/TQ sEb rJ͛kV^:i6U t@TJ3>ʾ~SU̸P c$lCkM,b33Cwm %q*19HRKټfwe,9R|LˢFg:mE)C}2tVsnq蔨H)M#ȓҬ/włL4A@TFgp{ڽ#{zSci a\]6Wyi`'KXn P 4b3JaI5{v, >d(R*ꠍś~W]qֆ8~LD)0~|lv%NK̵iHF$ >ew+i?}dwêflKE1.Щ-&@@A*h6M5+9rMz% pq-IgH02Ձ֠%EJQC`xr?tgxdRR}_zqFhI8u.ϼwmhw~@*['5ryIN vƦtocFP4uT@egߚoA"Nʹ7mG.GĖDhޡ^~ e1B~hNuD"-rfQ 0ǖqfgTjo꽗楇BW>}.R2[ԭ޺ M 5>p#6m(M0󘚚)^~zWo+/gL%OkpWoiyK$x# BD C?27thne2e(~+RTrų!`ʩd=?#iIENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/16x16/web@4x.png0000644000076500000000000001405512653526636022303 0ustar devwheel00000000000000PNG  IHDR@@iqtEXtSoftwareAdobe ImageReadyqe<IDATx[ py $oQL2%9vl+cْ8JL:IIԵ33d8q4n8r,[/]a](&E$x ^XXN2=b ,]0!ucEkCVQjaPj `Ev1nYa, srk{ܘ>DH@O[[xN'جf;nK8aò׿$&tH} p˗_~tOy;u򰦦Tu tKNtd86JQ$a4=cĔgwAQ\~hĵq^Uh=wMk8q%d Oq`Ա` {= "8lYbzGf}ÐyKQ?:u<^+hmf7[;FchHh%FqJ,C`3&=C$^ Bq aRܓ4}"9$EVe"P4B(?;]fw1%=> DIC^X "8̧ &ցЋ \' `2,`tI.}<iJƹIr $nAR1L^N0S$r!`guJkvm1;nXK ̓P[[_.Z!L/ 3iH(f}k!0 .U3L*0o`,6X W?aK[}oS0/u:sKU'j Z[ZY<sJDv#0oY0 D!v8 Cd2غI,~F|hZz Tenx?=U%o<(4ZnG˟A ]-ϣ[`{+ ܇Vg0t\?5֯R=H5I_?9Xf Z_ri,MvA[ r,9FCP騅Nxv7z<4\ l0۴n' gѺ1t 8VUҍU$Z7A<&l)Y(ȞQl19~A@Uxl~A#tA0[i\R:̗}к뛵UW9OKYXѾG`|.=e><ťXF-_Q@0i0r!&}l}: |_O0 ^ %H9tic^3wqjn`՜~JB*s0':O2-(B4JR,y$i" jșQ8prw,fF<EPX UobrKQ2A'ō^9J&S깸Ԃ:h =ӈJނD*76 ltԃbw8'bw|׾q]%&1<o_WގQxIR(l]PWv`\hq͚_AO=m xyOyaHs-@` ;L*.Rq*ŒWQIUIX^@IPUʋp-Β"Y5-w<^κƮV֠ GWdz}d[= \NǬ,1tmԕņ'b5ioΥq#^ch2@=lf!VE FEz.O|p:^ &ݜf.qeNjRvvEoʎ=ƶլH%Y)ɽufa#.Pv)?ÆFfh W"CQf@Q- aފ:VWHZa`}v k;s>=l ASq8н U,}e IlE2ltUe*Q,7i+LrO3 hV%}pm/EDs!\Cr:7u|/meX[ NGbY z^pXweeV&J'? ѶQ?`,cF!H-2jd7lj9\*gh!!U*-3mX)s"FP^'b׊Ymtj8lSZqI19X7 $2>edZX-p&49[7KB8]4$tb> (dYFZ>jDslbNf5qĚ2N^,oC{32PKhrJu]kkFR*'`B[zojD,(KqsaTĹgjlh\b |+qZGnV/鹘`MOH/&3}X,a\%&A} FXrkVjCIجMq!:f#ŷP dE/PIf7>2sZ_ꊬb$$I%.K'd[?TNPpס,FdzC$lj#{ ӱ-kT` [?:3ȋ6P /~&[n5TE;$xka6?wgc~H$5s]L_7_@Bȁ"hpl5` 1'E5!x^mwuې pV9G4Qbt`wp_f=ql~%"$˿5D2T3RTTm /V"fy)艆ܞLW"bpюU{dW +=WHs@9l%A:r=-"K[caY,|rk^@ai&$z2.wNыVp}z8jȥN ezjYƁfImm,6YIvڊd VB´eWc;,Q;f<%N rvU'V{d*M`|Wxb?=̉O%{S,aIJ$DNg9/%ax0N^X~Ԕft@2h] @ oͰQeӅy Ÿ,0|qdKj3$#Lt1NKVkF5amPS." *RNz?|݋I29k=? WjIENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/16x16/white_point@2x.png0000644000076500000000000000373512647526523024056 0ustar devwheel00000000000000PNG  IHDR szztEXtSoftwareAdobe ImageReadyqe<IDATxڬWm\U~νs|uӖݲenH j n4X#R䇉XII -(jǖh5{g^;n? ss^ gh1ür 7R" R\ x yfLd-"8qnevGLeõ5|9"[2ƉIUdGKg0\=*ئO4Rh賫`=N=QբKsG<ܥŔVzU(0gMgHlDbқĤQsX%:@L͟HGGUڙG rIuhH15gD¯>L𨃣CvmOlSHwGbY:gĶ;['Z(i/V4&[[1y8FȕO0s˛Y!VI&v/ 1td 7 =܊87Ah K ౻OM$s((^(~NO۷z7nDʙZ]]ݜ%eJF/a_&\M՜5NpcM|y~__FqC^R8ix$be>g>w$h u\q].{feVNV%aT fĭL[Wu8_f^E|7^(8]1g{?4)6f/CeMK&< $$?IENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/16x16/x.png0000644000076500000000000000031612647526523021412 0ustar devwheel00000000000000PNG  IHDRaIDAT8c?% (fEG0ySLIqia[JX$ %S "|ʼnWH= `$";h>;j0`!#`Qᑗ[HN=GL:H:p 2")wJIENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/16x16/x@2x.png0000644000076500000000000000303112647526523021761 0ustar devwheel00000000000000PNG  IHDR szztEXtSoftwareAdobe ImageReadyqe<IDATxWkLSW?lWgW! e1$&CͲG7PX7u.tJX@qGaڈ<'}{9FBmkg2$'C䒀78* qt^VVK~>Z!zi8XS['_`܄񁁺#λWM@:AQ_xP3g@f/bnNOMԀl|  3(܈dN/EIm 7.W ! 0!xjeII1v:A֭kcz8_H.m1#xiva',{K8>+wG."Ɇ2?=J6< :5]]& I}8[G1H"hrp'1qB9ڍ.E[ܖL{ﴴҢ!`1*hS*3&xbt6Q,~_B`J7IQN2BcAJOOn/]OOz‘ e/ §'Nsee[~NR@Py]2Uv/'l.8vE&;h,* ǎkQ]pF <(`C sjӻWi8C\L$vM fK*=HF)3ش)wV0/ :U$IXvP(S&'[I!%P3NO/R/,`fχLsbp\>slaSsM|)]Ѓg<㌌DYvB{jj jg \cE49947;[klJ#5w33<Рl@(f$gkKK=A@ƕ+v.؅?uI~+\12Uuy* Ir pxk$܀R _t ]+⸏=xEZɆy! $:=#A\}cFc`R<56ءȢ鯆K-[m@Sb@.N`hLV~a,%~[SS` k IENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/22x22/0000755000076500000000000000000012653527012020416 5ustar devwheel00000000000000DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/22x22/displaycal-3dlut-maker.png0000644000076500000000000000260212647526521025406 0ustar devwheel00000000000000PNG  IHDRĴl;tEXtSoftwareAdobe ImageReadyqe<$IDATx\]lTE3wnw[("R Rj 1&D-}H '_0~@7 FB@@%B R( Tk{s9sg9?z7殶0A+M±X0&WJEsȜƸ.ѷC-b M#qA6 ^)FFC eԤjQ EvU2:@q>X$G Z_IV=&"=`JwjyIX$lj- [g2ؘdlBl6 R|7=uqIaH ˗*Ns{ rt,B {xTjR'ٮqc \0ܦֳb$c`zv#P4:%lތ$:Ǩ@1eءwJMs5k~,3_;}I;L_$faZ}[ݸvvl %TVVӫz\Xd-VC)q;;H%Yq:+^m6;QΣwϔ%&a0[ξɋhyyu\aQPrR 8g/p&X9W&u5;4*>ӿp)d4PU|cV:ͦ7'L v?w%0s`"B K7JPcO_/Z?&)K,WMpI"qG18]}٣ۣTTfCE%dY.by),1x!\.O*9|LȜCD2BQ7E#l!I---zYѡLNʼЀrld!L=i [/^Ռ Ш zHbѺ] =3%$-ʲpP Eܚ1 Sh8,\".Q*D!&[~QSS^(ܷ+ஊlW o[t|IENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/22x22/displaycal-apply-profiles.png0000644000076500000000000000244112647526521026225 0ustar devwheel00000000000000PNG  IHDRĴl;tEXtSoftwareAdobe ImageReadyqe<IDATx\Uk\E=dwI͏&e!1jX TP|)JwEE>C(MKZ+!bMm޽w30s|ss93<011"ZssNc |LD:` L0gu>X3N/nB)-c9|k@XjSᡟ/' 3'[ Zc2 bL~cTp'?˾"(eOo.#&I{ $n5YAo!",Bp.whuu2/}oH,s :!xG8,HRF1LC:eTcӓ\d15o%~%+ogt=Ebɣdz><*VwgR̞" tqPafN$MXxIrb-=3! _vX#+g^")8ʳucpGf%{>: ,\!˲d\61zUeߍ9}㱙`4GHpnXP\Ǖ28w [=%5hk`4{"CT&SsG`&~h+ה<~n^7 neâ)mA%NL읨N%Ӣ(Ehn3wzd+.Q:mlg~I 󿶑.v\ڢHOpZTy_~CtNA#V$I}մ&p G^,mpnmuTz%<[do9M'jAwF;MP݋'(^SiP| Nm `Wr}LK}b)4!tJJ 4OvA>3MnMo~| r gXzQiPC[[PHRc$7s9F 3gfk=G왚BYJ)9`B(FeΦ|J9k?tp;)<k>㝇ldEQ@I!v Cd2Dzc,3-|.DhxeJ.7{d޹.lUFEFO8d@+P MO??(x%yy<#]k5>Y-lmtC  eTHe6f@mIK{3XT~ng=]cr]m@LT޿fpz*v~snyf.' nZCfnf$yS+ShE46}-1Gfu{!WY8d/Sgv*M[ W`iӾ/-['^P"T)+gncQR#gsW9u 6<Q |Wk pn9H<:8p>yِoHqөIz'"O۲* t~NwŹxvWv# }dQ$$p=o>[img_- xsỦ!m!Ia}p uϸTYARo \^9WY4iL(ਫJ3"T6MЇj0gv&>.+U*13Cq4ی&lwBzF-!Yx? NIENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/22x22/displaycal-scripting-client.png0000644000076500000000000000161512647526521026537 0ustar devwheel00000000000000PNG  IHDRĴl;tEXtSoftwareAdobe ImageReadyqe</IDATxlUJ\A=oBF]"Y ѽٻs%Hƀ Abԍ"2T՝;LuUw=N|͖。a.J Z&HܖR9:_sc#w$'Xvy'y6V w3xjP)yw\8 l8pjҶͅ9,tlZg eSNe(Ι/fuuqٷ bhCuj8jFFFf)Ζ166SKR2|p%s4ɤٖ􄳳3)ůZ 86(k >ҡ-:qu݉S@n6uȃt$1.// cGxn}%NNNbmm ?vwwQ#8{c~8zVM\6771;;mt3Wcri+ |?666$X\\O9#L |P"SJia_XG?,g/v<55x|lR*+t:9\R7z{{thNm)>dcp+TU҃Bh4iUݍ!^\\-U}}}#m a;ubxx}}}S͖~ruux-tc&{ޔe-\\\H)!(O|y3E&-/^" 'ɿH7@nyr )P 5ݙڵ ^k[f[FC,d;QIENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/22x22/displaycal-synthprofile.png0000644000076500000000000000250112647526521026002 0ustar devwheel00000000000000PNG  IHDRĴl;tEXtSoftwareAdobe ImageReadyqe<IDATx|U]lTE-wmnmKBv1X@B130> #/jDbbbL$%+  -vxfn6&2ͤ3|wsжJ)Z2a1 zt:Cr&hׂe%gssfI:D}6?]J) Rd8 C! 1+G2Jb4cYvMOADC@ eȑqu)vѰ$>FC&WgafW DF1>BX+T N}ZQ0i`,7_DEQw?~܀2.W===MR$n^/aClV`x.&bnv?vkpFk/W(rq1cN>UZ! [:[CWc k?(:!8QSD4Cژ<'+@8nzA5L#|Y. :H"c0ÉOVd+5ϟǦMv}70'b7rprElꏛCC4j)M^X tj^4So/, ==wx E:B]q hii1s0Z"AYucttũRBi^ee:X?XPBc#]u ֩(oCب{puT[DbQ1eDrJ d܇{wMzBl,~ZV2@opMcWP-͠Z>lzRKDnV%Nu/?ٛ"4_M54a+ y(۾f"[I;wsxj'sA<}^*֬IJUUh}oN3*QJdWrtM^^ #PF-Rl]/,k77xkQ@"ʃ` ky,K¡6X|uA'r/d5䩱ƢatP9=,*;(1*kxx?KuqzHTc mqt}S?NfPڳXL-`- 3 \fVͻ@٥.ƩFԫuE2[P7TY-m vh#]=K^.jz4oT1݂60&&7iQ#HE{QvCIENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/22x22/displaycal-testchart-editor.png0000644000076500000000000000236412647526521026550 0ustar devwheel00000000000000PNG  IHDRĴl;tEXtSoftwareAdobe ImageReadyqe<IDATx|OIŇB@ -HETڈ5J(5iٙ;3 3sw3g>9w:Ť:9du}5=[k#~=b.]a_P(PpQ1"DQMtO-=[0xmɺ06N?Ӱ{8#ؾq}=rE8a[G!@Rwň7O*W`4ZN k#Cb h CFEDCu*8= z2H]_`I)˖W2$:eġ|plNx<$IRUX<3&yUY6C &pV3(Ihhɢ5ޠ%kfE9zW.`߶z[gHr2ՀݕƓq00q-{qZgը$}Ć0EbʘCD8ڡT16] :C*2fk 4Heő@Uߝq2+|_3j~9!hj6?Mv_lhMklNWisDz+ѷs..ߝŵH;qbw#x3p݁b jfBz&N>r\lt,$ag1DD'/4dYzb,ueq0+ 21ސn&ӍKA5\nKVEFB Z4|tz@cY171 '_7ǻMam=5Ա73ޥ[yPlwWiTudؙ nȻ^ Өk'r8yF|XҜX.SI? $Ç 0T=eIENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/22x22/displaycal-vrml-to-x3d-converter.png0000644000076500000000000000231012647526521027353 0ustar devwheel00000000000000PNG  IHDRĴl;tEXtSoftwareAdobe ImageReadyqe<jIDATx|UnE=]U3v8Ida`%+D( Xddae"DHqd'8~cgvtusn8 Vso{Zo_JTS5ep2cZ,YJg /|"I&{\.Ⱦȝ̍)d>')Rt@Ft9ͻkޕLnw٦5[hŔ%P hI"c>M,T¹M{gBFeca Z:F2#7= s~~c4?H0xnhؙk` JQpl_+ܤW$u|/786\A3}3hN^c F3%T29O=n7>R2#$`,< 89]D;l6nr燝.fTȴ:@_4"͸0|TR[P`Z*ױ>,Λ5.d{}h{wڸ=gqͧw<}O_?G9Q{ml,J,9A@'W-&' ZAI@{1ެ^AYy_@ey_p _>d\Am/%8j \>}ScgCf*k"[7P<)բE{_>(-I|,b<XRPF`J1v^DO!AoJ2CnB1]{Y e=o*EbpaA8 D0>(#p 0҆g 'HAZ0ڻQIďrHq  :PG(dTJL I>ExL4\J˟vt[(ЦL2X2U vR yj'5l6pG1X GQ?]Շpq^;}wAHp>6Z|'(0km"1P,XlR.$HA;Gb|nWcՒϑXb.`L&9M%rjl,r2) >Wy(p{0] gcIENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/22x22/displaycal.png0000644000076500000000000000265112647526521023264 0ustar devwheel00000000000000PNG  IHDRĴl;tEXtSoftwareAdobe ImageReadyqe<KIDATxLU[oUE]3rnmO/H[ZJ)R. #*<($!C£g$0LDQ j BOK\m\7VO2{̚oo}߈F8-J*R$ % K<>X#ϿeWLǕCF i_⇚v { t/L5bF\>;L-"`.JæVsmϾC_H{ N]is0]/XqG`v L2(ΨU&6G`dphgGc7-Gf@psc)@ Md8!, %C[0;p9v0yI\v:~c P.c.Az.|#ٮnd[7thcARݱJ[u&z}7NVK>ʳ,{2([=(Br5yaݐb_/ж)Gvw.WdKpS oAҀvjG eHUa%Rg.\00W{\Pݼnx A(_D&3=&E,8e`h> .ި[[aPe8/Q΢8ysP dfu15f0dWq%Nݳ!OcKe{˓(ϱ9QL ^^ebyO~B&"vL Q/Bk&Q6w>0uc Gy Т:A5f7|hmw叁J ?Zoz&X00^F`>(>:GIENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/24x24/0000755000076500000000000000000012653527012020422 5ustar devwheel00000000000000DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/24x24/displaycal-3dlut-maker.png0000644000076500000000000000314712647526522025420 0ustar devwheel00000000000000PNG  IHDRw=tEXtSoftwareAdobe ImageReadyqe< IDATx\VklTEfG--)B˫$R41!I&D !I4<1?jJmB[n}{gfvi y3g9W[.)AZGR"񠔶c\w=f y53gIZCJFiL# ZS&d̃(Rj}С\ n`Ca70kQ&"4j 5XK-4g1yFU/ruӈClBLb1: JY֗ViMEڰf疣o}:g+i ,k~%{?dҿMìE}?K&Ё9ջs 1c, D鿑C>BR-u#r4>@*ˆ+Vh,"IByL<2fCv$/A:??ًa0Aq p 3&Цie6' W ^ @[6=لgiFfTaVO!/,J9|C#L1'Fi; yvxxyO= $;'J~BmOhMM4'%LآˣKTt}vYtw`2k=.*$RH#TSLƿSK u߷X-p,)-\3Q\:*>E7 %"CB+Fz F 2V3E3=nT W+é Yn=F1Шv mJ %.*, lm_Ǧ7iZbbRqDcc&ws(` Q__n7hy-1\1"6rgƆ{O^bcA0W(:3E[͍2ZMC8d  IENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/24x24/displaycal-apply-profiles.png0000644000076500000000000000275412647526522026241 0ustar devwheel00000000000000PNG  IHDRw=tEXtSoftwareAdobe ImageReadyqe<IDATxTVKlUjZ:@B$`BcѸƀ JNcѝ+]jt;M!@#$R(LJә_wJ2szbgA_̑%H˙N%^o2>c NX4yLW2}4]M-OS)C3V/P%2 |yGw>7$QVq@֚<衡;%d@ڿ1a`_,LWnV->k15 aYfܳ!R4cI 0,]Q b0' {yK  fZ?or $Nrv6#ܶE:L^ECRiɶZ`̻=[NxR:=p)A}NJU%؏P! b qP{E>:Hz&' L(@X/Wu:s^q2loHp R's1{GT9(QxMOHq U@ODNek'€͇ID*UF<1HIDRL8vkQЄ-Us'?  N-W Av{$k&=;'jFbH9:^ˁd$(5m78 o$a7,A`uu.$}d)4K0JXpwU܍Bbx"!ǀN, פ|<;~'4lB:YylU*R\kl3 kL,NIENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/24x24/displaycal-curve-viewer.png0000644000076500000000000000253712647526522025715 0ustar devwheel00000000000000PNG  IHDRw=tEXtSoftwareAdobe ImageReadyqe<IDATxlVKlUE9G)0X+ E H Ҙ@֐Fхqa.QC1HD[-}{ϙmLΜf7|seppfԇQl R w- CXk#H0v߾/GtXk_58;'tci !]~2=n0@VeoGU[>[!P $)sQ|3 Qi@*\\@\ }/?‘Oi $Tv Z\4ĸp[ [ S sn/rgE$6|LP_a0ڣl0Ϩe1'ϼݦp&(21lL2ʣ,/8yhp+2|aOכMl܊|PL\LEps'4u#E[Z$IuO5lj!: f8tڞ )6;vѸ΍֘%4iYX|tyð.:8%[* xK=\̢=uU4<=cΣc d+*Ybޟt`j?$hln盘OB]< +iFC/dX$X;jl,YYȈ[rj(u- N !8:d+5Mnz0;y+=7Oi\0}l18‘],0WyWvj1@cKh\B(ʆȮ0ۉg 0 A5xch+m 'Qt`*wr`F/Cp~J׶ h!'y:HVNI=w k6U%cܝ̅boB@WQ/}z~ QTYtŖJQw*jXmWpնYS -:9aUnOg6 aU0Œߚ } 0˫SoIENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/24x24/displaycal-profile-info.png0000644000076500000000000000245112647526522025656 0ustar devwheel00000000000000PNG  IHDRw=tEXtSoftwareAdobe ImageReadyqe<IDATxlV[Egwv~͒`.b"A"y&A_} A|b% * * ^ݝt)SәEOU9՚Yk'i1XdY${.uP>un8Ok:s7I_s$>Ba%2Y: k%t :H {qDTh`lx^"8>>F?yJqpp*r, #?}zjj *9>H-v>p-Z-O/p~~7o^3 5LUhl#$7tVJo,I重/~?5-h@m M*oVm@@nUanP U*4)sFQ# frA"сk%˕Zݸrk^.` GqzR& `clW04.FB"ߕRV<{^@X_1-UxJQqk8 lASUm@b1dgfU|72-nq zfp:E$RWx*Yt k:&ՋEd)} d| x#>/!@ܾ>W&\*;>B!wo}\yBɖiJn L8 L^{eo7;kפwF=}G Jmu";8<؏ݾEPMh5ەE 9ګh)C'6Clzy4~ o?U)RE$7ldt J) r Θ=ֳ!#H&g!inCTtSj+MVB@Vkđ;>b1RI+\6<@y EaNyf.X904H_"`dIENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/24x24/displaycal-testchart-editor.png0000644000076500000000000000254412647526522026555 0ustar devwheel00000000000000PNG  IHDRw=tEXtSoftwareAdobe ImageReadyqe<IDATxLVMlUE=wO[)J"TL ӠƄ+B\pƽ 7&,tĸӨ[ĕ7HLh{;3}f9ߙs8h0JιZTUs|s=d޹&-p|GmS8&fi3"d1Ͱ\41-IBrbޙt?l7=Y5<,4Qպ#, qqU\W3pausƷmQxb.3kK'yxAS# _G9w7 ̘.9 $10qg9֣d 0!~}:–gP?9E6ihEJ,A2jyuN9ۛkIJY/YBd\em#k@wv٧Wk^ӘXV[XXYzjBV9A1 cB*t 9&mĉubpq҉p> ]ME, UZb'V34TdE}lm3c'N6.lm|XE~~C.V jl&5g0k;@2>^Îlq"(_k;CIBݜ` BVk0 PG5!,A;XRH{j3ySA5ӯ[QgTDIOoE!{z+%Y'Bd 5%cRE2U5*^2ʆ#L"+g?EA/E>~lɲQѬ}>^I3kC_;uLY[[Kh"hR"@"Y1c4-VSv'ǡ!>|opxꨗ;z߃Vy;GX0Hw҇0E4 +:/M̶"uSsVv/EI;6FĖW>QeGDl %ߖңjjTZWKdjF=kr]nNd#o¨A"vZ+[" 1d.L>cǎ1|0Zg3> WJA{ 2(y AY ꟽ1n-B[sC:e92'M^ d_$"sQ<}4J^(:ýKi~ w1 m5X}Fw mM㢦̧ؑ%u`@'^@jac:9Z&N!S~@mF~Bpi'J-&n zd?[=]:#20@et( ^\ ўalL#@j<XM|^ƛsW[Կ|A m$Ei=`:yR-y.eFWFѤ0Q!"zח8p$C[Pg+H!P%'JRK6u$~OP-^=Zg4LP?q_tmᣇt4GtJqrTItɖ7\I]^u+h.ǨGV L#&\a.ʹ $Z?R4`KP%`xYdɳ8,d`tt+eyDO1ƴ,SSPѺF4"2/# tr3xhz.%&.?˸+Zu9M Uh*U-}鍏kP333sx'1"Ԯ=U)22@pv¯clG*Џ{݃ EAT86+Qä`cM{RVQ,`}+'P{i1,%8oo3"c$̠t$͊|ov]^_/b僩}>2g 0!ȹm<IENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/24x24/displaycal.png0000644000076500000000000000315212647526522023266 0ustar devwheel00000000000000PNG  IHDRw=tEXtSoftwareAdobe ImageReadyqe< IDATxLVoU̝ݲ[iJX"Oj1_a&`wh@Q** J+mYZcfwtg~g_k#PJ'<8;RsMXǁ&j[ $ɥ^ӈ};wk8ܯ-iu?X#a-(k&3/ ^Axk _Sܮ5J#oI!n^ 0ׇ0} ї׸!%sר(v ul^1^|427Q!-8AAנ+j+E+ݘ{57}5 ˮ'9x>0F1V e8:(Zc;#x?pO:3((h/yJq&Ca Hjо+t6m=6TӘ;<*IT!adQYs1Tmtl%+GV ψbԏ'!AyS&rʱqBj E <lB'h: -U̞߂CO!d%zKbIyx7d ^ L$M9(\sǽK3݌L4IMʸm`0q "a[PI!ƷdyCT۲\C0N#c*\۸ iNsS仜ř;Q:@ ̯ K5}8ޚޘKaݶSWznZlߏTTmonD5 OL+CKS7i1((Xs߉QjmCyMP먩g搑-u Ry ?v . e/XCÈrk=nWt$-ӣ2dX%`nI4΅w<>nT-8u0>H6zygv%oPcbVVP‚3I8S(q|0dJ!u^ [& °]™7Q33mDm躻B{-j;:GrhY?&,T.OA 3p5%`9캀?dYrnjDti #uE.-.ZрKPi$OŲNKݮBo= ˁO^ıaXkͣ-kָ:$ \AX /QUxK3jJn%5E`5CLJ ܥ eF qy(U;?,/Cݷ?}a N.#~ka >({éN>We{dCu.NNJ_=FY 4|±& 4HdK45_e4 44=>ylj9@BɻxX9-EM+2%y)q$[.CS@)oy,;P(ϻQbO>%>ӯ ܜu[kԻ1;-359 zЏy$K+:<x~kw_ooƛTpҢS!P-J-r2-5ZbDN7qAeM&Bu^cIw3`'&kn1R _00\$tؽi fj]UI'JڥC|ųpdN-dNNZW.V--t4xiܫ=ږ]1ߪg߸ύf`tΌkns  73V>gO=1lB@i`T3Z[M&77ttU_x↵ yX)x ,ZȭZTyꪽTVw▧-)#h9_O&QHRdn[ĉ+Lx2nk @4d٠ݓuɆQk(>D "b=aHO^jw|!?l|O[heǰ2n*.a6KxSiUEߝ}X ˽A/rYndՃiaO]3 O$.͐6wu|L"NyEyHn^kcUoQ0~ yIӸYPD9;B dkRFi 9K\@#IKX\ O?0a8U8Ϥ8C gPyBx7q0+x]@%!M9[hǝBdt)k^ xē>X)_]?4Wcoݗbea4&5 wc &3Цl]opY(||h`JYAh}iW@E/[)1p2zBy!g75Ne4p⾆F"g!]ѲF Z+)~1ʢ1tqKzM*vT˲d4Z|@D>A@#;F`n T˿:w6{LND/㥇@֕Ejo$"IeIG qk8>6:Ӯ[3UI٠ͮ`8Klʢ 3OT+Rld&f:T0-kwZmN)P \kDÅX-z VQY̛\";J `NƠBj2Wm|!]󸗣<e5(@FPOK4ƭrLi+ClT gN?3V7lBWug#aA[:>n/|^v5wіKq}t!0;bn+͹b4:WFI -wAz=}\`*5J&Pc.nUJqa*kdc2h Ix4 z2t'`PqQgBvA29$[ Y8S )j< @J 4:sH%PMoGFh}Զyv a(@NԤ̓'} +CFaUqBnB2It1tb@dz!' կpډ'6]ِr%\VanS=J\ .܆Hf!819?S>X7 n]p*-zsD3+Wz=/<4>2 "^l Bqǟ)t>ғv3K0h$0gyzL&FcO'lSt:33kŪ+B9Γ͜*&Y3YHT2ʐMGw&6V-+Lp̍cHJpڿ Skgs(Uhj.@ _mdi8 Kl8L nO\ b%\!T!DCeHswM ͒RM +[7xBFF[T]ÏXi-lak);gnJU E BB}*rWjxX\3}ELΝϊ5*s>9!I )vƤvqVMlPIWHC7-GE 'P#!OBТqSlAi#aUCv5[Q])-IZ(bLT lÚq-}kjZT:ФT"# kA)5}2xU!̐ۉ5r R<42+TmqΊŵIQ5Vmq VyPOBP2x_ fCҐf}JvjZttjj4b3s#9Xi74B=QmIƎ?|;*2d ο5ӊْzF`5"[?r0ت* Y]J )lD 0{@pIhةؐ. >ӱb拵Ƿvw,1{? n] ČA6g}JoМK\&ACt~J+nf\rn X Yy %'Ƒ-r$Wzk T )8.as 08=&Iޡ-m Hטԯ7ſADc%!/?O9&F\3BnpkȮb=UA &h;/U3gi ֞Ӧ mijv < B07.¯غ9s/d{|UPA'xF(U/:G="0ތ:ִ9WSHUH v4g zS\@^jF A0U#kzrA\KX k䠠´&Nͥ ]9 -(Cg"+K &w& j<@Wz`g&!T'ZrJ42J3IT%]}JI u> aZAZJ7A slAm)^67 TTub9*J45m %kB2o͸)Jc0VsQNv\~X\/PnYoOF2q>M8waÉ9d7٠nTKBZl#UˬD mD~l4|K{S 3 MZ3eՐHtN\h~C_a}tbo;.pj=V@& *3TOj׷XH74[FM1ʽŨBl८]-sRE#k{c>7  V"|,+F%&(lgvBQRLNFm*8}Z8`y=T3PsPR+vfw[9ĊdT`K}fڵ45 i9VMD^DތyLk\vKKj3OXSJpMpcv]}87fLл'iRAd$|^n%kHKV7}HhRrY#>bGIJKŹ|WjN y{6){Ь;ߊSQuMwŵDDs&*Z44ExmYEIIAo:97bfV4QR6{n_lg̅n-2 x2sڑ,xw>tl8}7>t-(4f2f6-~Y9A3^O_FЋZ+C߰5 FCŏIH-dܩ͋nzaƂٸwW.aB 8q !"+#28J66/q6%:Ew 4Wi-_̩*QZrHcФl=Ԇь~uuCW{С/?}tFB}qP* AE>M~I +Ԛ,EIo?tzո\W@mS,F$O= t$iZmod$"#ΓԷzeھ'Nly{ AAY@V'$WyPʀؠAS$eH K?0pLJ( +v_3% pOs1].($PwsXI` .z ?LrI`boQ k:U&,YQ*; 2RX-J)?!/[jMM׼f5|LJ1H@*@%x^S%CZ$KJJ .N@KnYjNRh ^zL-ƵwXioG]k)bw m)Py-)fb`~&oCKXLHS =IwUl>ٞB 9!>"ׄ/6D1Y|&Ih4HͨrihY)0c)|yKc"7`Ut*뭬" X 6 hD=mfhdYEmGRJPl%J"0XkJ3҂(%h,b] qe))<` pڧsom%h'd(@ɫw'%-զcr 3bZY)=B*Z c/C Pft)%N~E*W6cI`,^e9".m51t)y0I+bvSPquKw-w߂`!`%05=Og+e;zB[S?-/:= FB%ZLP) F\ M@G `stRKĤ@G|x&.(NsEE +p-?LKJcfj5seމ NM![,+qzÕD'm{q4@lvP#o I-[7Z6Q!K/S6Az).tE:[lSc (`|6y^5 ЮeEJAq99F),Α ,&P~h}[CE3~C(M{fIA\bvYu:4}JH$^XURRbA36Fu" r Y2ZXI9'8+U9C#ʙeǠ+PLCk]٥K00>Wlj3τtH(H7FC)B3A H$XAQ0G9x^~>I3̶OL59UƓUNJMlKόdsO*ԍT{[lۓ6/( 4JlF@@t/UhDgH_yJqmP7f@  {-]\mIpyv*Tj%wBJ|]47PA2B5\ 9zMC]kgJ _ PD;}6OB/R~M6"QRcOVH-*35sۡ"]|\bQEHԲ W*KE\i[Wzf`Lcj2#S'۬ y#-!w Mj_s}.>L+@ɹBdXTɻ[2uղy6)ǭv$BR[vqT}+ O/l -ĝM- ) 0lEKVܞ) ;AZrU 5&\e<[HZ;)R,e 4 vj8=Z%.M(V̑@)%RR:"{%9Ywƃ!2}%Jad#cYyĕ˺n@YP'0:@إbC9"ucFJTަH;~v 5yeW4CgQ}p] ? YȵL1p/0;Kfj&TVg;ЭC2j1hzQ!lEbAHHvSrۀB(r]m±]!7+MHoY=U}X~ !+#SmU=G& 1hPB-a{S/K5zogyUgN8" HzcfлbBǑ nf~)o@Ki;H1U]StҊ繌F{⸭X @%)L ]E#ۖ6`_#ĵ uVAhŬ 䌵݈.VCzi=yAoENҵ2ElNoɩ#JʒѰJ.v7(`fbrmHy:Ƞ"B8BjDOP=8k{ε9(CDW:TBd+'q?ɶ :A2-"jHUZE gӈ/z>O"!;ha¤On 'Zk{ic2,EB .!:&WF=7>C)쾗hNcOШˉ:;Pg0fJ7`ʃdp7LACxϛM$N?;l~4ڙ_X~LrU7ftaJr^򈀯g g`9%%4!3;2MUf qޙNF#Y^t!f.WZOۆ!0 %ʦI5TNČ㸨VoLŦ:02Ct.\Vrw|ٝQxÝ8Ld.}y=Qro lhImB[dy,[VsBۋ8s$ƋC88*m)МeRjPk٠LGyju#P?+zk&]&ASy2يjqUpG+rfܶjѫB @?No 6U/ `]eET}k㇌X>$vs •WuXʍDW|wԈ$ cG0Bb?nL'ᨾDRfݥ ݯ+o1K+v'2Ey0j<:m.U+JԌ!M\戰Pч_z;'y:Pr$2Y_/y-wȷvnlA庌pt;k^O5M#/7t״" &/}uBn!=V8qA5isoQޞs6\A ?|T2ӵԲ0@ľ"5"-{j~&'I|-M:qc,glf4Zĉרc\JUQX!nkjuơ;'+̻'됃tSkFv9*%5X C|-{i.,_Ge2JZBNeqJG?),'?t上<^e3yǰnHhy/PѶܔ8mĦ/㟅i>92{)büRe9zL ꊭmsJR!o\Wivvb>9yߡݻ0M0yiy"cJp.h^/$B4j3슀فv*&aےiID=33&? ~|irJpC*V&P Q]w5TuSTT@zVzӿ;f'|bNL ,D=mׯغoߞZŏ_qEA*Z^M?Fa۟HxLl-[G`BHM*]bcg]tkĮ;?tjL&AF"%rٖ.xHVoz-71N`;98t؎rk^h "{ 76lDgD{ t&j& OS}lF>KxT2kц#`[w//nWt`{H/NsK2GǷ K-ִ ⚶mi0T? G*vvႚGUW`iK).KD*>܀o15ק{+txH'۶Y'%Tss]_n+Ѣ50 WMRƔK\rb\u;ai`sOYXhdF)OYJ]D?PdR 'Ota!{Far6UYc mCQlCAr),Jf<^N/^l3lZ1gq KJjcvaVi%Pr#`B$ o믠=wCO>y۵+;\O*\*NcOWReQduH[9L[/9<+T{+_أPu񙹮e;e<@)l.(|usV[جݩQ9$e MjLm)ʴa{r_ 3]ZWjfBA` QX-XnDL& @ a[,x%hUoKי AaÇ_~e-`bՙOB br Ni݄5`%Lų]ۋ^_>t!Kv]~3h P>}DŽ@A1Q7 t 6bMmͬaDHWӶ< C18޽kl6n:U2i(B@=yUN (e YVH2q%Bv[oJKWffԷ&;ʞ21U^BQM:ibҜ2ƨVew5DР\x!L`A$46'pO"Th<,턒ح";f0KvB-ol G?I%uﱕ:6bK륖zv[.o7tm6#p@Vֆ*F*7nVo҂x2d6Kf@99.wq,//PGxi5ZhUDf̀^Ɂu 27Ր^϶6/VRPW`tQʟʹvﺜ3f5אPZ (?P-vQKvJ٪=jCpc[+),S2; "Ԛ2V`ϋgمiLW>gn;~}O뗭7߾12J.M<;ޞI@V$DuWPtH/i?aźuWЮl 0хYr[,k0ȤdCdf4^Lw+{hw~'-X=YX.v8E4*\b.Yp3 GMI|s.UStr&Y9={uV,jhW-YMLW})q w|!C͘Ns.I)=8hlB|ÛVk\/񈥡fVO ZU4g.`pUs5sB~abOWVuT/Wh5NrR=:)I8M kFsaPqٱG$f͚ieӦFM RR"{R3508b!Ӵ3n+-~goڸbixNp1֘lKFQ3J}Gr(WQw-X, >/pbV2 s;UفvUWli"eVB3tK/X:{ \wjs l L՘ blڶDd?darݚ],|!RU(&&U5ecֈմdFBduoݺ~ vmtKwm3ͮ:.N)=$ۍ>TRL`TM@!p  5LAsIp4 V;sK^z:kӦjO}p79օ=AzHeÐ1@+IbXREuX-`+NHMWmf5N2pY97SRn 6%`5=e6to HκydG5!=kϾƜ^ҳ.€̖"=;,HM7?C i5]BJZEt_RB{{sQz{.!V#+^-瑬Bkaacxe}B\%:Fm W^9qu[-H7G>:YDs8?F3SAM2 ELa!H.R0=;;ӜٹkЍ:6xv;0*̌:*+}x\qOQy<.erKou^{]tKsa.dj 7iT~yR8}}_: 4 "] vA2}]J087e⋮ t_}V}x7uJ hЪMjl%kǢOL*˾ma,#п}mGM̬tj9b]E tYOl8Yn2ցzݟO["<7xuK׏ְs&bH4Mvǹ`;Ƌ|i ZpeTaz0С+(K VZo3slTniYIOD֓W4tsGغ[኏縺{@u^wӝ1F-3δRWYÛ#O 4"|4 9v:t z,M*W% ru,߿b]nsg<܂tq]ۑ`ĕsSΩ)(bM0LrO ݗ>wKk³Lr=Z@̣ X@*_Hf@j!*u+Ȱ 4|U=3קv~Vv?!'Ì3Ә4cEحxK (%8$=/`۸YZP2Pp UaO<情"qPSniC _~瑏 ?pѣ (?(_ Zn8A26^1eeJQBUEiK*a2HX2W;9}8{%Ml6^hXh}gG:I=Ic#|Bd/.]D4ݸFڰ.+_#_J[VlrR}zo$@3姤: ;N_R>]ya8muc3PZz5v9m|ʹnVZfQS]=g?fڗS 1ccЭS6Y +ňaHʰ&bZB7zJeMJt]胈"r;`rdCԀ4V.FPLo{^ZL1484ߣ?pk-Ng?w9]T)(&B$VqD_h{ݓ.beZq6EI蕝z^t#{CVWa~ `9yaӮ01gZEP[ 3T` z+%dG# ;`)@3aÆ9!4+'}NC%oݎRz@ '"#?džR+>e؝扗'瞤'y+oA_>h)-!WlW|-_nxC-2bq}hE[W ?֋Ű{soy-Y0uX CMxdW*B^,dzd;yM^}I\[bziƂ`EN|lڢG/xisPgm$._e$: _-|YwB{}t`>KhZ("aG*s0\F'5?x6fzA$'i$)¢Yzڔ=:5'(KTJ&"Tky*'8VBʙ g H.K)ke/<,_c"Z4yM7!@ wxOk~b:u7d:cwY3ƒ2UWCBGi-`:mFb]}%M5?^/.@JaNL,V՜sS04jzTh:;mјn姃5#keXeb%B[k19: /T)6@)Pե&Q݅, d)5oZ%f_MLi|r{n-v&L$Zh6K l8 yuF)ږxo~E^J6Ͼ`±1݅'PizJzP",=3ԕdF`̈́Ҙ5@* kg%2+]Be"Csl{)hil)x-200` ̹xcǎuR=IcOéc_O|xG% r|ľ?V9.d%^$S,u.v+9/B;?#:yן-@@b1x4|m׆VQj{/=uט={)IE*GBmIYՀp:zx=tB47wb|>QU =SMv؄􍻿_HGv WW=+?d҂%b x%>Ӣ(,bX9EgR\׬ Pj 6ZHF G@#&s`Nôtrڷk?v"ˇv}Ӵi-Azx!YǴ[3 ItFx}M eiDՓ?JQ.Ƴ[]/Ӏݺt7ㅨCΑ PIh.hxi8^ȔCn"ve-aYg SUNvb8oO?@O};\Rx6,V*sh(mRвlE=HsbahN'ھTZOˆ=/}\kxDz5WRP3 ettm4X\\1DԠE$i Si<"Ոi:fӚ F q%ULfi)Mڒ׉|&Cwы|:2w:txVTެB5oyZ{Y''ƾFz%\wKUH%Ʃ"MYC4Ȯc'h=yiŹVѽ{P8r$ 65A=<Ȅ3NԽ>\"q*{֮.m"m8^j 6C@gg z%ɸ[(9. }^xt;C\\:g~H\XI $DX;wL|[2uUJU_5BM^/F Vz&[{U̍ `Y\N{ .N"m"TÅ|euHZC>^ 1L5D,})03KobYۻЏpa,݉*.UȠZ,碭Js3Ȱ /EW5ki@3 \|-(++JYj޺ܽ$[ dne;čFOДPsZquK33"*=%5UJ^(bhaJ5 dhY*r%I0j7HLJ5ϸ|wZ!m,ʵ LveRyԁРSq_rA_~0]lCێ+P@S2:X8\H'Q$ H6[`seOL Ia,Yf`Smu*lZntPɍ7Q<)28F xdz&#Uϵ$l4%J{vgە3aAɊv&4ۛ^@jZ~mIVj*l}H]:zN7x#--O8Aw}7ɟ){=alyn-Lw|9:AԁaQF9{e<װh#0).4]5 R/1ȕO}')0͘*RU”MMv=贂"u2XMWFZ`J+,N5+0Y xڍ, JÏPZ ڈhڨlf2}Ǘ,]B~;;o>>?A:0Tۗk\Ң+b=P/!p tJ@0Zmx!9JCWUSFawmIp!)9L#8OE&4F4*?-o sc є>=w eڨLWZO/n4Sbvh"^ss)Đ?~粳.UKV>Gh1SҊ3%Kg~i}O/tFHAȄ'/ޢ+iMkJy1:v >qfce;uta4Y6I%DW,(vSq͂oM?xy^e+G)JӃWݎTR4-mmF>V6 B_uUdHS1wT5#Wl?oB]W_[_1Lї#Iuk}  ҚW/2zgt՟g~`^oGy$gن -43;* ͝; iZT#@Pddӕh˖-ݷmhdž#\}6ѿ[_Z4xGN1^eϲ@UW]yƋ5nsx)aUbZ~M W̎:8$jrj x PZ'3Y $3:qw >98z黮7{aqJ ]D $yP,/r 9h;6dsIq0 >*HAL8H"Q%jCj0V37vDPYU5ZoL? h[jz $ qe=9W`vCj-d*y'GiѽgRAKs zI1o/wyh wH< Ma?|МF裸+U"XmP+.Z\7X Asڷl#ů W&Iz U$_Hݐ xoJi&(!ɹ2B(>}̹x_ƒ.|j|Kwt/B)tb'(тr:-KRx*|+_+X.qg.raH-R2"bWY+4߷ab_'[!fsP@o2.힤tJw]omz:{9`U{C׫.Ғk70=5'4Mz\é$Ag(d5y%uq\o׉⿦Gg;6ZG.[[c-ץL I^uj6[1J333G8]:wջ{ kڌf{xVanf Ц!/t_K].#zeۺ~B!`z* ?@ 6.ou ]ş` 2 ;i1ا3|5Ujq)1Ze,x0u J |]H S7y[Xշ ͛e-%l{J+e]@ҷvbt#y!)J(KJpgsyZ@ -Z @hHiC=Fz꼡8H94t7KMD g| ^o}fW9wS2W?9qY{hLpњ%c; ˲'$$ T3TMXT Mѫ^JA HHH4 `!qlK'Y,˶Yo\g=Y]W}/ eTAalܷGY{rŃF)0R??zh9_$1Uq?h{cw2b4Z7y5APBaM$oA>cnВa^.+x GKGRa?q${h</:x' ڦ2TN $ɜV,z <߀ovaJ|w|6&ek,Eh W,3Gaֹzf@) 28L*3es&9@Z(8V3q$a.U:7>M\zM9̟ym!F^n2^Qp$pNt…ѥgw.`"* fV ltb TuS]͟®JЋ#ޫ AL'_ A50Ez0lLh )K4rB`rXf ;Y7G;I eE+h"UYrI?÷Ӏ}{rweKrڿ?/+&$ ۿҏ>V~ NlWOYZ+ yaE7fuO]v`#Ů5/ʗܙyڸymظq9LG pի #mY]ٶkWY'y[zn;Qޱ}"V C7=sm29+ww?K8O=Hϟ9PJ$UJnlPדW3vf?KQxs,8yenȞxju4mBkGcV"YXy|%tw&=EV;"7?t=$>O+)[ +a՛l1:FE݅]LP>BG,oB94CYhf#ng\s mذi.m𩓔~X7$ŰRUVsdGnzU6h :yȢRC(6 pzopvY)3v $Mdu.E;AgM>ғ˩M:=֝+,hYeuQkS#`/QG²÷|c(< +9sW]> KX2M nQ~sO?SH~Ъn^0`j MkmX$ Og(b#}znz2UÁ8ƴ0V(,| 614z W{lWW;oiz(` ^E%Uu:ejRJ͵z42]!τ̦Lwx`צerQxm!7@LRHAIVo@w}3m F~ڝ/%sD%qaJ;yD3o_8&3_bD9+ot(kA {]=iL5ee z5 ynG&KsO&j2F\exl*H@ɘHc6d渎[B[VK.ZEO'O7߹e -_kvwMNJ-%B3vkڶ4'G@xQMj]xkXCDǞ;W#ʋ/[Vӹg*5-ʕpPP-p2E`M@00h9jWOҠ^6GBlKɶt8oiIUO4XZ@?2PSmj"vpZ`PE23j[lƧ$d}@Q" w_.Iu76g졯; FRxlV{zƃf ƈLlw i@Peubs@Yۀ n[2*R Gk?V | pi=ɷZzxEv k_Fu啓x){SgN^Ko ٸ#`k7osūVV\W06YFvusI4lU'V:kq=1{r*:mt^Gڼm3{:#щǞeK﹚^OҚ-&?}):ͧigЙçۈtŠ 5 ؚFv`Vu3C]ݝ"u35^"A'SݹdFxEf_4'Db2&dVO5Hk+7[v/;heQn{wuݻ釮{]]6Mf箣|pPf7 ٻU"G98ж}iiX_®ϡ3â\w7v?E[^^^C6"tH[^s%_A~b#';oY t<TMCΘ%>Uxe!)eU]NEew?' 1g!poXhl?a?⒜A9B{<}A[_d+-&[M~F_G?m zheJ }3ti<(^hDY`=WvȖ穨gzG'ヲr`v@Wʠp%t?6]>ӖfB=1+&פb;̪i S}(YZe f,:?#c"+Y= Y!HQ &@2Er׮3 r|OOޮb5^/}ߔZA{+ꫮN¶?^q'>|x2??wıc[cɢخO^ ;C\KzͱHHfJxQr8qv/"'x"bzILWYCW+#XZZl䱗v?zafI4-)hStx~^C]Vp4|DP 8'/m08$ܖf $BM= 3(Ӊ'3Sm嫖in6($ݟymn"2CU~\ӆ.w+\`7P8W`7fEW6ev^faZ½0Ņ6g5iOoCA9{t39e ɤ&b@@G]M ^ rMk_ Z@q"?7LK# ٦GdVKżuV:裴avzx3. &BK6 [c dU{j]lR9N?s.i[ /MДۄj.5748/npA eRֺQ\ m@tpnЪ+h<,4`~/N.Ԍj >6xMs˚5/F}+KW\ 8UZ=r>yf"))FSh٢4u@F| }ep$v+NNm@a0jZf9-[n<%3PYzW7 g\X[ӄS2fAJc$Ys%+CaS{y?d!"/mX\2 O;9b|σ'W,&)0}Ο;G큝z QCLt< p 9|14y4[KE!6f4#Zg"7;UJ()ը ;jGcE8&yv18sB?j\UrsT :%oG~aCǏuPRϐG׻]x*`Of?4宠! X##W)Msx̽cѓ_Rm;wyngi%$+(OS`aT2L5J8Hq^TSqcV;T<x1 1g J DKf1=H;%'q`1(1XI~C ] 0_q{=$RZ;x.ھq#]i3-]`:zW:D0sE MC!UȠS6˦\ Daw`]r%n=Q:t0- Zz{ OOS~K&~}>gȀЌ%U|W69䈱5A=GJ] 3(\Qck E)ەAD)vôXpi،#++ɒaK}O=]Q?Ѓô>=C;-$SlRE${';噵Cz&ˁ7 DqL=fN{>Uέ]ftm`@DeFl͵s*0y4k8QlQ~-2-~49oAsy!!C< /̠=hG_X` ٖ!{[z o ķC2=S3GMCK[nK=# /?߹Hfn0!_GU|VL=O9 ;Ͼ|1?̦ӎO/zvu?tT6F:pݻ^:{lvU1Ҧ\=]= ;}çS E\L+R0R5ۂk?3p B-e Z ^jMvܴv9#2()>Ĩ}~;&yszdg+[oM[vO?{|q@xBq+&5v㍴{bhMViY3g~6Zc[QmhCD* >ԏ.q33q-]~$O 3> _Ov>mZnvjھ1{w LU:0]${ }!!&`' Ȃ$,υ:epc[#0cIh_:8Tw6l#/t_Z;?n3IAM!W^M?V!vWU`@A*Z,%+}ZGEQi1ƍ[/R4HY|)retOuA(bccMW[̕m9u ஃsWвHz'H|rӏv+ ÕcU[J-\Iz}QUpi^/T nȴ۠唜U2U7lԙqg>?Zgofؙwt[Pp ǯwv1ng<;~=Ptwt,ӳᦽ͆?_^ʠVY9Xͮ"˙uT4jGXs# >zeNtF]->FIvVġ _e]@PmsdRY܏'=ǀtRXFX. z< X_Cm_~9 %c"K$N'#tcNq]nt(q2Y Ui3O_zm6[G:lcZ0 mv[F`Ӄ-zjd XP9.P"O&1 Ӆّ>r"+D` V(3@)u1ϝo|i%oMgf \0Xܶj p> ~ \`iܧlؒ~„!0SX|ajk|"H gMmqdG Po)SO:qȽ,<ˋC {>OL +33={XhV =aXo'86\1gJBHNxM]ą ɘL;i7 >lfB\p:_|{ƋR~@2-B:dEHv$,Xρ O6Yoj]M;]lX߻o9,4VHN nڑEa k = 2. ?3Zevx-jZ]*8sˣE;ڭ9GpA=\bЋPN؈9tRW=l:pW)#4b1g_mO`׉P~@+ʡ!OH;ǀ"1Y~YLf W+Luވ܆S,%aV!ʿ2y0i(v(貵 +~J&L/)hk{ [:PU7$"ma"L#c 2 m5 SOOk?U6$Zw ^ IK_^+W IY{"kzYϜ5\I[3ͯ:M`o1tݨw"X:-=tHӽϡmR:屁q*bnjx2Eď $"ԯ'M rtraW >`*KDZ˔wnUxҌmfk}e׭N$iEomBu~>44}6=KN۷_bW[ovz>]t꒛"Lc7f hȓOY+8:5} <:d p Sj}SP%G??kXXj<GF d>ڹqRL3(5G sâ47Qf07xQ'2 eUC^;4 F]7HoQf GOM9}j(}Xq[(AYReXC0dBٱ:A'aBiu3j 8Ց14)b ~46O>}7of^#Ch*aiDV[NPMF| g U*hMWGH dMUyrx\y uXpLDEYA~j/YOm#M& T5M;Ti*Z&=86Y^ .T@n.7N"7c_D1O; 4kUX#w^pww_<( #pZHLٰR5E9SdU5lAW^4j>^-T%YjeZkb+meQ2 }6``S;W{P~=XKw_ @Y*k6odP.hS Cی}#:2]b{;H/ d ̤9xzOw_B/"Ї8ބ22X#^b&W\TT{=dy@)#e׹F_&CclK3ؗOԽW-[ᇉ|F3v#'Vƹ{K;{pcG|9AtI vfVLu9{K"' As:A^92 dÈyVg٦d9M$Gv-(n4=7&똨 RO\jta 1.拺6ML_.!Rm>rlPB{<i}ia~,Y£mDΎFF{_֝.]Mm|Y{FB$e}l%y:>3)b}뒎ԌЅ>&`/-Xr?tJ(Sϻ*:*bz}f_Vܕv pӲaHĊٍH\lA0v"oOs| F! -":L<)c=9|=wj&W_7P!>oLk.[I]\6-ւb).kFpZ_%` 0maeږs[yrir]( ؅`4aiR\wZ%@8)+`G a8٘]F%PLZ,0Hp$Yܒ`vey&-qbnmﻚ.C gAGke].5MV82274Q<1Ѱg&{R[gQ޺[*dme< nej(G MU#1-@ u/XI^8V/l:Gm60-O%hƉ^;XaPнy9`҅|)~gaB.t%2"a:w2%Kf~yW^7~u߂ N76HXqP,HuKC:,WAg<8ꦶ\{%mqOΙ| ɾw%K)Mɽki( H̊KjEڑ1TP#%&+Zѥ@T`'AduVK;bk/s(ʁUY\"v:[VyQ|Ҿ2bN¶GP7j*CGw/iƍu떉sƍ&-{4?^sV6E;t>`թUchKC{r>Z+%>A Qveti Is9r/@LƎM6P_9s5ڗtVchK,4 *oEl  1lnx=dq]t;e(\slZ=,e?erhڙ?{.ez_NsskOЧ>u'={;.F`*^@Y]rUEJ5d~n=$ZX6rbMݷS8h!WFyő*,#7@@^H7iR=f7)#بs_oGm]l3'2=; "a/C>(`,FD5d}}=IZz4T?+:&v}_wHq yp€7K5ޖ/7Mr^`Bu?a>G(:fg3,d"Cm] SZ>=ULJnd~ƒN}?s_r;1j"ĺdN޷EP`,vP `?_>WSjFKkԨmZT>,3ʸA%'k=L_E)3 ҡIlַ^OW3㪫u{ݘ,@|&G|Ot7וmg6N dۭq*FǶ7J"H_VD4ek&Xl^a{w*9\+bi1m nƲ Y(ӎ#Tб!o2 K3,ᬂ F|dj)þ;r:3=? ѷ˥D/8}N%C,gAR( 74D4xO!;BZ@w#]xLJi80INr,;.xOL,h`8;@d2?,3WMDrGk,dr,V!߈Dsq%UZnD429ihV]/$. p;g~'$\)axvyʋ`dOڏ9{Q[K#+SwJMk4׭xU> 'Bmo<p6,z5}XBZ EcS,:x ȄVyH&%("Rdc+D7_=Vڳ7K%cրOmǎj6hɓg gIg1^Dkb՚՗ D^U{,?$Z[2r=iSJQ=n% EW%ԚT6GzG88&RRK{# Kg(i{O 67(e`8v } ' c={oIf˭@P1j_}-ѭm,-wtE@Lӷ6qʰ";<쌍N?Ab)bՅHb'ܮ]=}yAv l”` #0tchjb(.0w<[ :a.j+0I2ZAi=Rq  l(o! msPLjp:>1V O7ӌEyӶ嫉~fv k@KCJ^\y cGEA,,V{Aao2mmO7U}6pM|v % SaW0&Kè'wspGF0Jo'/ߚ.AlԏLU`~H!nslRSSѠo\5q2b0ôbcXskX Kް@I>^ץ#bIQ1ћ_ZH)=B`eQq%v7{lCv[(郎m[r*E{)&iP(G ΘgCkԩ7P`]b Uф'>8|t6&` LǙ9aM] gt'NQq!Zw_F9WR@ ?H0E^Ѧ+))j/Հ%*+4ZU_.YcՄSjڼʩi9jn->Lm'<8ac2yw' Jd zSJRO1zEpTְ(Y"Ί@ZjζxfSP=*'M@ g/4,&gp5R4ȁ֗ ]ܴkA{6k=db*q;EL't R:f)²~&R}<z-J9BO<+Xo2uú83P1!DV/,JjGL8y'xP 0e Aɵi\(1gx%Ύu,$3O z1ѣ0>Çpo~(r=+r!2(RM!@K*W SL|i&0֌l 邟w%(ksHvs--EvO10ԫAW`VfiV,d2*hi,h:dXbgZ +\Ba&ȍsu!"k兾uDs)䚄WG-ht |8jOo4ycL4>i&@㺷&r2^? zJ d#/(ƖA$M;vΝ5vj9Z`d,HIwwM7uo c!7~jW{~05 篹)wЮ]PZi4C;QsC=yGL2wP%X upAФܷD&L]oQHԜFv"  LΞX_`a02$xmF0#~K]~T~;i ʤoH/ B|W(9*4ci%/DB֦6S־KkEz S~9%oFDnQI9jڵPqv] 1!?h7ޱbWT^~/1Z:٤^wFz1,fYNjSZ2R-n;^DiZ_´e ƕD{}i/e:v% yka2b:m297VSb;'3ߜn%uk;&щߙh׉.dbRrhn ƃeowaVxSw틕xR` q&ˮwCfI8pOn䜃AZ =lh'hˆJ+vRC7IFĆ r1!8'H & uۿr:\Akȏtud+M>@ Gifn] #ep$0|~ai)Tx""}dHK:8]K;<i/5<7HDZybx}>WQXl29r f#vpshcFY[d;`-Q&)``,^0ww{pnNF̎ {Ilf14 yY@}dsgl_>6(Zcܮ'&Z> ]KMJPMF,B& )g#|#v=Ik.wV͝_L%@NU' pv4-ŠL ?JOa8uLS*h9c*Qo$FS ),#Pf(תq^)[c6e-kN7Ve9{?[p Vc,trH3tW.2ړ禙QpdBO"mhe5miCFG>Gr:7=3o q+ԂU[J`J>J CaV7(0P#El9D qt2:Ր Jf%HH+a0tG)yZs9 A̽j fFپj)(R{vòJbubRAH]" :3v@“AE eTRyV!ۮֹ>|2rp1F1:Bݑ<ŮXg/yScf_֝\! L!z@:)Ǹ% P(oNf}[t+&A9踳 ɮ&A6 1?Ziޒ9(<;/'x=)#-.72]!b<|r627^0"_uX(SӢPi}C"BE3 I`gJ`jAow <-*5 CuQxȉrlY^y:Qih;x "Dox^0VMr"4giDn>g4+~vM<ԸjbN76d_bQF]fFf%Jv{knTM(aa;n!-(5?hKM'}wR9ƅ?)Pa^Ȃ3Ph#nci+Gm=w Rd;_P۟ۢy\AQȅŎ5-]N(Ӆ3/|3)T؁M"vsbԅ$H5LilUWSzo9HB I)úfpG ]`B CYt A5bUbLQՃolEa_65j u$sf/PdXt p5:;+1D~lޑ$ЉqDlLv)Ul9֔Qfz<{*0s,7S| ڿ"u1^%Z( sn Χ. &a]U""nM_\wRXńYCx`^鿛y.p$F'GA2 K|݌壱 eI2[9le%p8v\obv`yΘg͢K]H]X \o%f{[8SYFZ{%Hv872Izmt 6>5[-TgIA-5[IT*6#H 5*|/ئ:^BNb!`N)P`FuwD~0fȸ.suB&0v&K: v4D|5 x|Pgגu³GĊŕTOʶ #`BZ0xF SE@Q7T݄KA /XY)ʁgǤaG"}ǶN4ûlx% 7D'o"NG 1i41eZ'e,0˨k43[y* ~6mˠِ);24."OFVv\8M1Wێ!%=Bm) =cH,M $@hiDNÆ^+q**EVtnu":iּ@%Ц1)LS`f,e-%JI6X8{t%4tne°˼C&!5O4N\y-")a'{M]`{$j7'G|mgTY7M>)I$}瑀[b댼p̚2:l\Szή^Hes *A#b mpfDi;9t%SAR;s3XY(?XIt&sLA{hhFnsj{hEoHx$Q.,QˮAt'<Dd{~ȃA{͊Ļ&(u` :pڨ*( FAYD]'1dC ̕ $kV'ߢl}=,3,r|R`.V+k*51|VE)3,@؜51+|~v=$Wog(qiȭPߘ )lXyBD(&%f3poT%R:0E4rdĦT@+b"1yeb%A,bR.#B&YѤ8\Y@9aXdEGYKGNMF(b5C29ʴ$ڙLdONPk#hWS zӎNܔ>" LJJcE&CkR߳p]El"oucTRdBhBMbfP0jnQ`A ;OgZ'#~2G]?BVu$`zHuʱǶe= v8\T]l\ d-SudD&}C*Ctl0q*(.`7H;0d-%RQcebl (seL$0|ri7!a0cQ# +:P'r1i٫lڑ($؎1 :a.+gukƕ2d)'5m.G⮡j"nP60nMDZOV/NNU`*7^iאF0)2] BtǖRzNq0NKX%PIBrF7  4̰~8v7[gdQkvV9r%ɸi LH>΄ÒGU@`'b=qFĶ|ۭD?D}-Ӆsd}-Ӈ?Lo4I.hd"2 &b%G$2y5B3#70޾Xf'- FJ|Y͒ m $(8~ 2/G6f7pS$ăתo]gƄ &&ʴkg qEp ZN]KlD*1iҸ2mB`'.`HyJDo~s{iVOgLۉN'W oyՇQȕ4ۊ.ˌ Jz/"ıYY7;tVk=Z e) K13" ! a(("htd!.P֣y*hv5)6JMC_I.ZZ;M|Wc NABbP6D#i7 G28Ef(1^( j(H"hr&e4hYHr{؀=?cߙ ,,gj<}S28&NƚҐ]鬄f=y C X85|g3F[ԶoZR]nּG3ؾ '@oUE#щf.J5^"?&*S!j8A1MyXa b(~L֖bf$~~< h2-dd9AC>ƳJ<4&0(x2FhṉWЊi )QEy,/6Jt)- HHZȣpuYt7˞wӴYl@f$0YzP:Y@#~1J^NE`FQ|@0qӢWy ] X:-cdƴ6fog>ړy@+S)d`9wpܸaō`gJY3 ֥lZv8d,Q)/ pwE9qRFEu+xਤ l 21F\C|R/hJ^ǹ(TgAR1i`Iͯ3BgD'Ϝ׻mHflɽ `2:U:v Y}Ɗo8Yt`luh'.DvpDUoݗKt% O̍Kaʌd68CRH"aBv'IKGexȏ.LÆDo^[n&ZjNw/Ht05OhnAѢyG<+c=S{5J%དྷU};yc/mdbFV\;aƱ4_s56Fkm~!_߼cʬHP(ZܴFc-1*5M7;w02pc߻ԐJg׷kg3f9YF*an9,O{͓ z|{ޑ].I{_9xڻOlFn,)e@ו.55߶m={w5RypwJs6cp҂O0W\oMlrqUZ9yl{mE\84Yqq `ׅ8q eHJլt(W J 3鉃Ğh_Hm@.b-FkQ)1#~5d2GNgd'\#v@L}7}c4#z Y䘽[;PSHWq [EQ[{H1tȍIKv~EK3GkO{êC9}ws b<;pP]*-CR15ص%@;/Tr|Y P06Kp0A_(O*FDvᚍƔm'F,>Y[V9ۀHmrKVP@*ZN"0ס"~G7mVlü :J6bE<f+v8 0[DE?Je 3~edK CcB4eKs~YM*Ф7 ߝinUr 0Ǝ&".m8,LY6}rĞd`b SkuϞSa8- )lx3"*BDV,..UrS&KEs:ʜD!h$ _guf4]3UO^; 4v YB]1_2}_0 sލ%Jб/1ʞ2V{Jƕ, :Q 6 & ν Z HH[SƤw`Pxbgڋ9&3ސ둠b\#w(Nb vB$q-RX.X} fhWlꪶK\$-\'ؕ^N$+l >/m(b2tGhu3叕"navڬy5҂b`'.L1&10[+u"(؈\YmAJd Wk"+iaz+UVT݁Y&rʷaiJ#ͱє9h# CD9N͟@W^}մ54b,{>7c^ϭ"7 |റF6&~(l_ hDQodFD zL+m. V)桽٩Z'4zn4/1Xų׋k@4BⰇdI:|H bZOp%ibFʬX[e޽$W:= {e/l kȐ1J֖X0nڒIs`gSbw3ΑzR}dDml8]j +qYwypIa$<0E]v2 FՌżZe1_^}dž=o~wc:AF?<&ў0mB%sAhH1”(FW  .?42⃕tڅNƖt $*ղx8e$&Df23Qޭ# Dwb@{;Y59Up5M(T`Ss7`}R#Pҍl;v-LT3?>.@XP2+RO+o=w-ƂOl2 &#1N5jE0>ljsgQ::m=aI#bݸi@Rp*fp~Ux p$" [ iS7)${j)P]ȫ5oØ$y/UMj*g:UƱ)8HA@H@`HB@A PhA`wtVg<г3[uΩsؚqY_:7oAzˬXu WE!wbQGe9vuOƋLhVA_rR3ܺĜ<. w,>.@GIxӉo$̦ݿvHn;. : I?gS롍scĂ-(JR{踽5sm5 yZ ,Lh]N_h5<6A1#'.@'S?i yPɮ=Ջgʩ#Tw[syf8m vlDx}1!I(YK*TϪBb=탦x.E `*0:$*è_aUƠ`p?W[n&h?K}OVŝGƗ6gQs齬zaRKM)]>sʙBEay_D3I<{?Rd,V]sIPM.pa5XLEቤ #0j` cr;{qr?T,6ѣU =A L×5-z˪ JMDb`%VSkJH`;!M[{I*mv>1N]QIs f˗ 3ڊ{ cKǷkjFg7F'@xtnNZT@]$)Ҡ$ԩT.7g5ADnu@zIe8\/1?Cn>*D>'hSnzj%~T )* X)VER]Qμkl|RN} {Lŏ\1#M?@GێԜK- i'LP4M݀J."*;=Km1j^ 1!X`b #$74Oq>m^ Dh(g л ODv&ԞD8ȜIG hbsCnPee@i*¥Nrd߻tAˮGvM&zT"Q`Yu =ϢGݘ܅U X+򈇞1H[2d:U*JG8%AZmƝcp$QT#P_<5v:_¾#P1=^,r1^`D~n~yYʈ?ko//͞4ޝO$;U{Ml!~7.m20쫶񶓊Z꽘pޡnP' _W4ko4\oDȞ(w԰"d,"FuσAqu'2=5+oni@m`YXJaeӑ(Q%l륅@LV8p}-{[Pv9dJR9[U3Pwo~ꞁCt~x({ڗG9xdDCZ9yC`/h*1连;LD@#eޡ;a-ڃ18)KxvV-8#D[%FkdHZP Gƞ/(A)uoVdучsEɚKܺ}\yy{=Sv@[>ա nn\r:Ӎ#эlz(>*4#_S'I7o>QN)"Wn-y%i'Qʢ]D:wk!:7lY:$_S61ViV0!EkȠWr£T gxumy{Y_^_7)6IVV.u2K"idy߹$ejRT tSLQI`.xzju` j&&1 ܏um?vlW(1X7|HeqnIENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/256x256/displaycal-apply-profiles.png0000644000076500000000000015751312647526527026430 0ustar devwheel00000000000000PNG  IHDR\rftEXtSoftwareAdobe ImageReadyqe<IDATxڜ{gU~ IDb0 ENQ]]mUť2KNtJVێ3kz=Ur9XEPN! Z@r {p}|>އk_!'gy߾&;7qWal;1?zJo ?+~}97@wuN^:i;hͰp4\`PCg-mV ў W1PThd= {i?/v{kDw͇/l:ǺI@E}AFkkh%e18fW0o͝אB gE<l\ ݢ7ȣXs@٨MPi چNʮM<^EdLWL$ks"+[XWhCv.)eS1[_ Z숔2D\n?x}*!l6_5=9sjU(`L-(c֏o͗ac[k;Ws_ RAi?4/;]moP[Xe*`5-Yl{qbyi2{o;!|FCpZ0>!`%z15cf8uoq(l(a'G[& wi}FHkF]b`p %1_c Y TVGRfvgR^nk'\#*["F٠Ny5nCN2R͎ĚdLTϪ%v Kǣ92Vj 4D=̵dƻWί1xVwmS:cF)1FL*$=C =|wGƑg}}Z}ǸU4Yq{_mt+K4NPTtg oX)iSow0xNH-5i:qzj䉍ڣ1TGҋFPcqst>a#b!@!7JGΝy5Q̐Sr5 b6'abFT#14r{}]*hh/ˎ'֍l T'lp Ͱ X|*S%M@Kp DZƐ:M ɘϴcF2s2]5Bn 7:]@-'pM߬Yoi" Zl ft f{j44NЪ|4'Y7a6 5}=b Q5^{Ȓ^ӊ6-mʈBpީ3F-5 lіc%WnBK̴ΚA'lKİ}64Pgya{li]t)-֏R4 r2xCۍ{]qilOu>n@ҏJYrRB4ag`r!$4#TR-]7=,>8s:GϚWPa&?T51}T̢xMZ@X؆}'=L U hҞV)AekuJP n?}U`>ҍn@[l"q<3|4]q+Qa W-GfZMȧ2 zdD5r앰n*Ć'\K^ ;+,n._v˭jqAS諉|%7%Y :L4FSpuLW6"R(6kyggZpZ}:&Q8Wk̴:!`Q_hl `$N|AI.A 9s4p `>x GEPT>G2uu$xd Tw`XKT5+V$jy侧h^K-FXxʜ l)WZBvH2XFcԣ?( ҃> djK;t'6&V>li!#5Q, N[pr&7.&W 5W@a+nJ"䖱]Chkl!4S*L]:"&(Hs3[ R R^a`jpmqRp&)s4߽V)zX'9${B㚭lPѾ{fܸ%C${_ boܲl4L&Uix"  Prt٠pO-oʀZ K]AP-֌ƋM; V6W9"9 ì`!I*ن}7Q*Ȅq1s4kܾ*l7$kת8eR* vD< ԁA[j鎆m[ efB+.ȱ1Y舥Rg˹qiB-<3q1!uî^0I7zNԁx}ǻmv9/ AA Clj}XQ&, & $sփZ y1I ғj\6ZFl C۔5J_!Au8 m&"4YqNݩ>mVAܝړ*U@FqM|T؛Ʊ(0yUSDcar]fUC cȩK;ZLFA2w_%,-ރ!] Տ AP !%$6,5- ql @y|W?~KO?3}ÕK rY4ϧ^t* X~3џ*ß=!!8<@0gW?ƊnO;ƉdD47Xxạfd>s\!O'Ev7^؟-BTAdc^( +B+-4q|n?t{wBp`#H c[XA'q뛾&$? o7T.Pr)mj(;^kD>Cwp]>?|ᅫ?"/V;& $JO}2\8qg!J<ǽ1ؓ͐_T]w&̶:ST.#n@MTd82@ 8f:xK#X/掓F0xz溂;ܘR4aASY u&]1:Ϝ=%1<=[JqƠu͹ھY Fҿ,}]oUz =xw`p,Q1,'&-UB]̀j9!@We8B F29ر9B P/,D=&>ipvFb$K5eMH4͑*\$hSA$_A([(; a ih15aJ׻lɋv5CIִ{v\s;<c5La25h ,;` Om΃o%76 =! ڪK;AT'cyxԇ#G#"W*ĈN4" <@NARc=8Z~`MCl:`-Z/v>Z/7ؚK%y4ߐs6Mj{,x5l2K{H ;N9Vݰxk/y+ļj0^mS&l6_FDq(=r*~Z4uwbWt^ց ;쑈B2HҀ !,b4ӀF(akK<<ܦV1(]р mIvٜyD_o\(z 'V-@kԍ]5~-$! c@dE?+v`I]WPL '#cη;hhْ^j!}@$3lk3*D݀;lS@ nE}IۺoX2? $R,eײpNv0]./ÂA^>|ୄyc-/7<ŗ^٠cs݄8j)FwvOǂ#-*ͅ\QY74iKoQ>N.=FڐNlEƃ^"gԄVy ^6P(1em?]j[wja9%f_v%னdž>eZp#G k h}hvK/H kqsI 2۠:6jr|%m :\mօ4<8!-SmsajZ)aTHAa9ղ^2UB0NqzXt-GOۆ' s;Z{7u;HF!W[Hm4@a-G;}KwF#z &  |+/O_8Z *_{wW.KW0 %B M1()ՀdGjȓ_u@ ]p:AA-WC~w,,o?Ɔ}[1(}E6}vMdڛ_9$4eR౩ X ςZ1cKE?G汴h Ѕ4  xKFUڐč,r'L1G$ H5KHt$8c ŝmJSiqkzf}u݋p "R s89v輔$4 p B i8ouO"kI#]e{][D@]:&Y^*g. [$a-8qԒgؘn0|@o@=` R+B[so z{L@/tޥ?|*MtuI2ڛ2 ѱU\&O ZCDJJUf6Aq먽uFQq,Utv6EI_,W4oS|$@Z]k]ge$v! 79]/NNU7QoV381+ҕ/UF Pʿ8 &&v;Mv^"_-p4j>P6Zt~:H1i. f!K5gPj9 [̬Q'jZۦ6%9\7y)T EAƂQ+")|w$_:> ƎSR  IR{cD_|k.}`ayUm'H2MHdbf"睌$6ېi95:e`%:ȋ]"V/S]4YQ̍4Aۡ +cW&ݛOmIQIecˑ 6P<-!.v,Xsƹ+3|AACW@ x?:"j{t)A;% eQK/ Xku !ƒ&u ~ǵdW.[!W4:W]IeǐphTQG vO1 7}(sЏ nRATA=6J3o`_g߂C%EtyBUD4H-@ғЦ$8OUg@⌙M& qDد`#6!R *o!G_Ht%Xb.l?>L# )Z[$}y?["% 7u$tAzX۩R]=ăʰ|fgQ]8U^PVH78[. Nm X;SP0w#9J*2Te=$ s ne)eDu+."g''RUsk[Ac` WqlC975~U^=6%pչ=}rQM(\6B9 @eo%5amD?{#)x`oʀObKAm1ߤiW{*@!6]?Cv~!K{ʲ+;Q_$BǝDssQ/!m;۵L` $D>ۦ״67!(7O{?Y.0u*?q3J0-"H(fmA^l/5YBq߽D'_0t5 h$j,TI MMǬXn+49>l}zR}y*hI0 }KH|ZEdAUK*0 2$)+n/{ įzfLo')D`ȢZ/$a`#9?=y0`I#R=% ,[le8 L10<R') 5zn+}v^kq%*Q,m c(IN Lq栄d<. E^gRmozJ5m'Hz}mD᠖%Qe8W9 iTC񇴧Ν~ڣR)E\Jo8 Mc_⍑Qob=>#yÎe/>>c }+ʂܲ>.Qًc4) 9埗׽mJ?z݃^\Ɠ\`T&^Laн^:eӠɮpn`*#@-\'sYkR'cyK nC4Q )lu7mѠɇ@Xv~=_׉f29qÛm+t ~̺!Zh݇)qGCI!<(7FPb3'ZdHB h#'# w ?Aׇsxu0v<#vQƸkpr0yivC2}8Ua\QdB='Db][6 US~-!GRJuѼ-~In{ %pʹ)ݱF{ c1= 6rL[D_kTNCdAuº(;iя%TxjZR'aɁ;hݙԱ\ > {5&j0$TN,}J7JZi!-_ā=ge*Dc$5T>_֫)*O d‰旂D~ f` rb_Y:f`Lñdzlb@I0 D#F,qUIQ~noX X rz`( B t5ӌ H= ǜChgkv9(@k(5,n<=OS˱!% %#:NHw͇}+Wbe8*u" Zviqwnߔ0<&~qPsoEB(Iv"ZNWvLʀ1 ?](5EXi3 َe*+ z0&8ns u0; q,u]._#WP7r`ir]Ab)Fc(BqƦ^[&LvWߟ x-(=uWɻoZS֖Xϕn;nj\O])z\$90DPf|4+#މrTJ#0_r79UJԐss.(5vj^oy)%Sqc64).pd~k!Qi"; opt iR_usz (q¦ISˆ:5I%uwUGǩ%$ML66tGRb/f1"n-6PdMwRF)>90z2}YGۈn} ÊWNDN5/%L D'_sqicaHz^5ARnvj]kEEQ^Zx>J:@ؑiCUTV^l2 wbΏyN ,у"*Vd-(Œܓ?fI3 h6[! /1qUi@.Lԅ$lBId.qU>3/66*EQ$k21䄎H!U #,!K/} Fx.74&rw4Ћsm䲀3M8^I@ 0O?n<nc?7u.bu F0K~ f#y)A58B"u;/BGh4TR)zqlS8gf&q/>{䡼- %e(1t,=L+HM[pW″- C9S̈ܧ@ǞL3&XFFtߞ\}YnXkK4Fa6}$ a}٭D Pִ H-3]/V 5G"x-! s$jꁣo ,Z>#!|2] lօ䆇LՋh{(}*TY=9e!xS#B|ʛϛYF$PI$;!џ_iY{rA B&is;*Uc׎\%Gi30|&4gS@Wgx?}h5[xH֛)!ŐnkUt9p;lj%(u1;kӋu'Hqڥ3p;r09[+lc=0O ֝(B,ގ3O}ΚJJmh^C>^<`~{.4!D^Դ]kf"1YyC0)KvUL*Ty @FZT2{o_;VQ}j(2 TP6!!"8!*?tүݿ'jZw4{s *(?ģ(Ny(%6e ۇ@ͤ =TC5}C+aqҚlӮ#/N0}6•*-@:D%x;^,35xC.?̉<%O;ֱJ0=Z*ȋa<2*Mu~{yG`{Ҧﶲ]k1p InR_mvߣ~9-{sLgۤB^E6\fD0+W`3\:}+%BXT}|?'yO.: $ڈ;pRiց] `W`R$Q@=>|,{͓Z=ܷ.Mz9k'5Zp=U)}}}х.ީH@k֌( F j V_~_E>D4p7{7I}zp5r| eOғhkE蠅m|?q'_XOh@{Z?:3OC%OE #X u54s}Gy@\edojI}l\x Co nGj5hNWcW\XKHOїS"b)mEo@rՑ^w!PDws`crG4ru8>W|ESԻaSv"-23-ȂQn46BcǠ\i-a׽Iv[XLCK)###DS|6?r'rF J)PlYqZq-uoMjn3`{!:afo JijDW+^ ZT yPR ΦMPW"݌,FF$)%"N]P݆fC0\O,21Gs▄kE_\/{,ihsQҴ B>H,%A.NC.:N~C &|Z:uBɥ9 .w^~TV/LUJ(#Zuh ,xG&%h~B{/zsg:c ߨ?mt>17 31z gp|KWҏMOCJk™{ ”"*u0nҳGߐ.)Q }DZ8-SHqsVS^K$%9h)of]m4ˏ4!z`,qlH8TųRA\@Ӱ.MZADqhTVqz(#H6Y`܆J d=6XDW=hbeq ]U3#ZMCQ_MDK09~D$@ TS v`k^"??ehQC'qAaԳHQIy@?cJ(ɽmE~K(lՀDCH]ޮ"_eNiWiW "*oU9{?>bGA5P 47SR#5X`[ @|}zҮ!ˀ]q@*.Y␣г4 "߄Wlk ' Lс**{9WЂa9wKnr_6>Ͽ-$/1m/sS DsP2\"c/w'46DiQIixi@MV3wYl>p ,YX{KqG_]D۾8یLd |1GA2ZPُџ|xރ\\qӍ\*V,zqmFԸ,ԡ(4B7)"x6(yn0Ttl{:,Um ťNu(M@:oƦTԝ f,mV`$Fh=A]qJ䔨ɠd?0&]Q:}cW[ ߸Z䚷&T8b8έA2^:(}4m%ޑoyY4r7XfԯXnvq+ [!nsCםA_س*4j#$ fiMJQeOV-wP5?/B^ U@S `M- XbM\:1oUUi`O:OCg@`r64 zF%vH @Po#Ѓ:[/zh x>RTd%C@yͧ!6"!FKs]Z)!a#3.u,mJ h K$F4C܎0zkTVQ# [[zϟ8ݣ%_7ܲ @Y}K\[~zX0Z\+ÊAq鲍e~'Ɖh )Ƅ5Zz{J[(zqA)}<zt(ޚ`ﮠ?cNi+k{U42 c4HHr햛LW{o~e˺xW0Vz85R",Ӈ6`V%jl.bC"&ν7~i 77F\:(X$p]EQ SRt՘U$N_ ~oVɇ$jziE:OxpN 8㦻n0c-8%:j4(Y@J%b@MQ[}WTP.N-Pg*OF #3 qBs>qFj(qwS\c+yyNNJB@͚ιxHb0. fk!> GJ St}W65[c9k$9.BL~ƷFz+YBRJ[-K,֣;D+,\d`yZ1_P[_X-* ,^~)IjQ)F&jMF4GMF4y#<"oFG٥:S1fLYYhXbZ8 f~( ?UafWf@NC@yG׉KTm&FA|PG X` 5y <4Ba=Ǎ*aL]<TU.yx0h()DqU rtB\)vv+s vvB-ip"  80R k}'g,Z"H@ PFHtlO"?`9OTF%65%u#1#2QϴoKC{O k|l+]!Tbc)#0AA -҇78NBo뿃sT0 NRԃ?LF/Pzdϩ@xُ8S ]80h 7 !2S<7ךv xxנArBXe,+I^᝱VS~T,7 ;q TH J멿M4ÍT%L!' ~'z-wF&ʴ)!IҔ-p5 y,~Z91 J``>̇!TUR^~k$r4 oJX2i Lő^VnY2FƈseӤJZ&q[&"6I&xwM7=捙9z8 `ڑ AXGG4_S|)cdQ$Z5VAa Nt(g_Kz adJu)猞If.=4HZΟ?yG' C/ ?2_* ňn Yk[ul{WϻDFLQR1Pr5 SL.4(M, >ܣ<0G yrr <.m[&aT~Bh谢ѓ&Gjr ׭-6X9LdhL2`yma{z|Bب: ɘG%Ad4O8Q/!ϻtiڢJ |m[ëpT:Ok{">q@S5҅9 Q$ P?4 ly1%ό\[}9U/vfXT>/qIc[a-Ȟq>\0B ~at }<2!TTiw"mw[;AH(= 'ϯ ˗H)j~[ Q% yZ23>!X@ZŸ`p+{ŷuv ^p/QPɡAjТi[^s蝖hveW뷯e–UG6ICH*Ҍ,OG"~^ ZS)R PXo{ (lF׾kS` an&bΎGL,ίҝ$G5O_fϿDg^)Zuށ48BJ@Ph3{#I'R_vtn6F#3KU6rHEF9R Du3D~Nj2Qu+ !k5K1ۊv֬μ=LCo(}5pݡw#q.bzCk̅en5nޭUÅOg`^Fi¹;osyu!IPYxIiZޙuz[eLrͭ#kcIciKͺp? OhT9`*a E(aF}dgj[gՀn [ŦR[Jeef7҆' NIB!ƬD4RܜeZ7thAWBӬ;á@h fKLYJ7f cv(`=~itwf(-~2~f("e(SR"}Mao$XӁt%3Wi@+`8(T~ Ĝ}iAB;f8C2 &ny')}{S:5AY}>|Axr,p-x4*6$5HĩNŔd W dLKOavN ,Joi࢛%' ߋ$FG(%de:"ƉzaL2玹}4P@NhP'), ŻlhtB#Ε 8Wܣ@F ;EB(q,~Ď+=Hq5n/-"D(b;~}{rn}ܘk|m]},3䠗˰Cp!.8{K=wQ%`dS@ P}dp 4i->byI$Q:E8zY*4&l%8q3n^n`d<=T,"D_9ƇWB`K¨V"D@7x&WD0̽kuLAF' 7.Bc"ܾ~OeK5p (q/!$jDU@Y}|n`sxާ& 8t%.M4KIƈ¦'J+;E(da>6,u"e #(V#!L?xqt.#: 9.͞cM\2(` YC`Q‘G=~S`1%Rmeԡ=vB?NPq,{g1++xosFB̆h-*:+@tPjб:Zn5R6 vR+פbZnUki=[6*' s)-gq [ip qXod< byZu"ihjt "hӁzTɀ2 av y1ʬW5X_RD`T!IT:Ll`ۻ> [mwjPŻgU #2,|ܺZ# R'0Wюdiؾ=VBE<?+iXrH*ON\;a_PO8X{hY𞏱QRNC'zH/]%SaU\L4 S$()ɀׁ}܇s$>qf J⥛pP0>kK$[03pEFds{sA^ؐյGYþOh-6tb ,f*?7:~꺴X\G(r= fJXHL;ݨ6x-a =1*' 6 ɀ!ϵݳeY蛜n"2 ̈́;x0ZCqX9Yc6'Pm`)IٞByy|:uv$biBr> ի :4[lF\l䢊;JToBt)ӤjN( Y)/!0x@2)Vێúu;dU@tH VZ.۲"nnP;"A5=\o؁JD}EHlV-+k O<ؒ|Ԃ#g؁[Ds-*m[Ȭ[*]_Sj%T|!; [qu9뻳jxS^2Rbhheaً90so>&CIB[Ց4+֊Rrg?b偮ҟF1S6CZlj!FՉNNYW`’t:H$!bTGӍӞ1@'b˔byffĥbEY* b[&D}z#/Pw~ ,_yfգ7-y3 degU^]R@ہ$X[n@ %t<6~KiX5R4^m9֗EoN ԈYxjSdaCyOv+MDq{wGi^_g_( Ӊ*ԥƨ@e@(8͹3PtT_u݁hw%JaT%J0<[dL ^aь 4Pp$>Eh:ͷ&5hC5eA.R.uPmT |\vY# 9濷&\~ \;SL@Ź[5ZTnC$~5r'ܵVCc̲(P z8N5 Q 4em%;YSI>z4CzҐ#I3Ջrm\BޢW =U8jFA\4Vlq;NZi)Ǿ4"~"4*&~d;u1V 5ϺĶlNy&u u3^EfQblFae<2ضB)g ?4d%j$ju$%b#wBc)-0Ūk'75!ΰ,3RUTT Vey1!+rU*-5& Y-:\R` .@9w[2Y{/# P>10)7\|grKՆ3P)f!{*^XԃL1DB42GmF^G,5Is*[qAkXE',m>ޛ!ݘmA} s<2f*)QHWt&7՚-oG,J_y KCim1QD b!39TaLCY@?eO< X<@yQYtUW8 g9 LUN&PNf= t6.Y i[Ѡj%ڔ\N%^z\%" =r*ŖH3H6%?(ds:KvL(|u{_xR ",p?Y͇~u6>YFi:`TMv 1h(*[+ M<-@#lZ%#nQƄMqeru{jvB$Ա֙9Cm &/ vmo No[k!;j)-*:Gkgꮓ׳hA~d] A>ΖlxI#9 "uZ 9m6 ,jBa Bpφvk mU ̌H$,10]Zuv]XY(I+u󫜕 jbÕfsЄpƴy9[ M0Z(V~6&ήhԭi`MunR$V4t!U.I\fVPy7JL+3?&<":PB|{cVrV'8pEUR(U16 $Jagb76h,'b4E'}uvMKrPf =*2K"TЇ^E4K$ktUw ~>ܾ5xx_\!\io8Pt)Xuk픱 rWHg z~X"2^>sT11t3@iP]Iv+h Pc^ǃx}M؁27`}UN!5'ֲ0oj攙 ť\$LCa7u vm}6 HAq?;y:7r{tUk ô `^|rY跃6,8!RCoVsM(9_I.t7{ Ñw]X`C/n)=rO~n,R8k5ӈq / 5SXv /'+e*d~˼%t@΂SVw[j&ǘX2Sdr([;3ϰxUyJ*ﵼ"]ljU-vo"@6=_NU_b=a c!ԙaMtcsV~+?ѱ'wH@Ard"Z v2u]Gwy_YȂiDZB¨9i^;;l1 ];L..O:X#A_GV3I^q֓p6[d쪭{oɘ ?pH]ޅ>$ " 7ζ:8 6WE}?o' va)X[ APB)̌CYA!]XPl o;j[des7EKe:`(4Cp̎0ijd"iBG8ٍf ; Y#hk4 ^nQ4[nUJ.hAhu6QhJAz>Hh:w= ii-/ي؞ b z9ϙz m# m.B5@Z@_桓!v]>fl?ZRi8-`IѐU4i1ѼɫUCts䴀|Ttؑ1!(OڎC*EIۢL'bkJ4vՔ  bϾ_̼jF`@-%ljc-ҫ8oy%q'vC9c @2;֙3P4u A. zXeEHUEvt: D@/F(1֍HB`7pCm@M OV;5G&dY g[KW LBAE`+/7aO[w=q%KcAAL э?HX<@1yjK:Әނ V3~xFN`uDS 5R<ڸľ&_"6д@x+ :ް=yV$G1a4ʰdjg2x:"xDt*Dn(39GiI 0i3~ 8Lڨ yoLgAA5O[̩rP[б vMP'(K-X#T6he]+=0LtI~?%$l~pNL`e\xZxw R8'N1r!|1K : I"s$K hĝ^P5蓉i sojrC;_ٓgtKu#j'’ڟpm|A th:Qn9~ >jakM,v kb>+8wŞ``0;2p kHtMG&V(Ёfp_#\tE܆~iHJb@ ӭht(Hb&Lh+79kjg` ("g S~qGSp㧎O JlI?+b:bR$qKZJ.復2tm'K/rLBonT<΋;%C=?#qΣG'y C?= @0A&D vʄ<a[ٌ6/<u{J2 >Ϡ>K`!Xz+C_2 s.ߓJ=|ҭ'NY1tڍR@<t;wQ lH`Z ln_3Rx@^ %/ﲲaeTnI;-5xmV+x;6 *\3q%߮k%¿IjjյPbHʈP OkU`et\؈KhŹ.cvĠ3MV+.l~qjw8O6mkX6G+}&0DV^{E{шL3%HAW1/#l^Y >⬗Tu܊zPsEkHvR,<@K(Pw \3 8,NH$x7ʳw}+a( ?._n7zu4<+'hCy+K4?_㧏lj)#;FύOTlsϯ_駶h&N ȟ+| 6 1eDw?H UړU%7`WNhtu>^{\S@ 3p SiBuq," A 6JLU+IXj@tA>QPjuszr3P*KAs3 x(r`:D\ OEzfh9Ck fP44]X)o:~I@!0&͔`GMLdμuo9cAWlMG3(F_%vn‡Ea3#ж-!@AYhfY 'R|IF\͡C PvNI[YXjviᓧϏ5KXٌ ZqA]k&~Y/C(kljLnEW_TZh IPcYb:𚟞n<M 8F|z6ōVHXzPzG;hz1>Л 5-PiC3HWKXt\ׅ拧<}k_D !NJ\ 6Ç-9z7mz`e % 7.#(&g׷KT"dJ,DGœ6 m Z S,+1̤!_ˋ_GWyZxaO\n$XDI%e51Ț5ԃ>4 YW3X%&)؁o뗗ϋeiQ}qT^l ?`% !% ѻ ܧ?M/L7#"}N²rTA͇k~+-b⮴--M `{O|HOLeo? # Y L9>pWٯ)Оؘ o[&/^t U%ka4垭مJչRf +I'GM Oj-9*y0>=SlpٔbM? 4z@j`k *ÇTa7ǒc/;O"n؀CK-vAB ) pJэ,<Y/, L XY7T0Z>W,l;bm^ &0ȎS%lIZ7h,|,";CE|="̲ =S<Л|+}:BsU&@!n|tROq->v\70O!^oz2b9 {'+V@&P;mEB $$gV/@`w NW/&S"qc.(i@)'l`=AutmZZKۄ-1F֓MZ+Ҿ &?4آ*yt~~tcy)[ (H l.T.~qVa@a0mV'ȳo|: ҄=i Ck5 @&/`Pns(w>,H!̉$dx8b~i:(T\Z`Hi A)|טn _Z- W)6,+'3ᰤgJ$2vS][C7 Ȋn~}yK{%i֙LH"M2n@f.SҊ~У3CRI躽cF9aȲM"@OUc_.k8%dPS\gO?2et+IA#jũ 1)ɾ N>< l_HWhy+rPޚ&;ұ\oF$Rj R|K՝O)UJضl֛^S/[}=WM]ۯe +hUV-Aӿ˰ S(arΗ]U²A+YiNQT@V٤YdKN a_$S < e9]3b@d đj 0 h Q8rUosTƉ\yH〨jtr֡rܒsr 2o[KB2zX,= ?0 mCmŠY99p-4窸IʼnV-L&>Vˌ_& rF*Xyf&B;eS[w֖\7څ6g0R}kv[og X.d+7i D1UeVbPGD{ !-'mNϒstp5GL`@Wtq.hwHCySCJq ?.p*Nfۯꄽ*t(6D %0.gX0 ׄyy;5e ſ6?*l˂l`>~u_Nߤ}M,7\Hf㽐ҳ5Q QptP]ؒ^mCj0AWuoʏ :TǓcjy8&`] @:?4aq ?pcr2dP4US03Hm2: Js ] {J8HVAFz[5ZB 3k=?=x62 F n~  ,e hfHz֙ _6Uu)uhB(9A#p}z'[cXlzCzKa.v_?Ɩ ئ6 Kؑہ=5;j:;N?Y:9-T3/R+1c@[7`<τߩkm@.9葠 AEI|v`Fg^F|{tFv4qqvEسѐ/sEmߣuVD2eA;ܗz`]jz@6J-Ut#,8rK1 ]Do;ZІ8M=p4L=6S>~0}l쩺`^a.%XZ 5۹xWۿgb vT$ hÿIyߏOdHCOi޻YZݶ:sޝ \W: f`6?fߟ^mtYtlaqo53DSTØ5Aec׹kz+T!\y"Wc)\RǁWn`X]Kd \f5?Dz#'6Ԫ( Y6#8 ?NfJvf4 D "M9.݅ {b'?Ct}? 6(wY;fjIl#;e 2缆.|O9}<1(f"#l9vGM6t^D6rT WlQXC2j8綢xQשz0ۈ ՛>mMֱ_Ӣ3%#}࣪Wq%vi ڽR2zᎤukAփ9fxoNYF:BJۉR ǫl}`GDyHҴʂb;"g`{]vC{/鑧o6"PVk2,{2v, ] 2_L7ߙ˷oe.+{ybS:gQYg1?>Y;jg|j)n%/q5H 3 657hwbhD.:gs0@ㅒ?_}^SkVv5gZgǺIl%H9i6bj64NL:ۄ2Lf:z$/\Zn4}~0~{wf,@ H}VbюrRWut_G}w}G<ӫGՀv-+m5Kr-=^ЫZ z?kNOME`՞E8&-g?w6Kfۮm)r@1'?}7E[|7 XT ͺѰw1! EM~x؀UlF #bk@4?wItE6O&BHAP`@tVx:8<; toؼC>M}OԏI#ٹ%n|//k&pJ'vOZy=M.1@ %X;qݪj Z&%Ϙ 4z~[H'cQ hU#$+pj6K0B-xڄC!*x☁v,): GpB8LA,P)/{۱P\d[~ [ ,1#(H9u׈tWӗM@:}ĩg!T`9G0=Zfq* ݵ A߉Rb [QNY 87}72܎RHFۿI A|; s>o!z7ȿfM);yWȦm/]W`H|--s}7K7ZkXϋ< Ϗ=ew3g&}ݲ~Ls~hqn1 #x+(v+k!“\zOo{b50Kې149#PBٴ ,|^"i8l/ڬ_2;p^Fz99a);Qy]zp&b' } 7 ]g un0ܰK &?DܭY /cϽ_!|7}cvՃz^;}ݙP/*fn0y=J9>4~ I`b 6YwbH/u%/+u'Gπ"ՑGkQuǚ E* 7o82t(AtE1ɱC A\-Rb 0g\C߂DF↏/JkYiʞVam>1zR[ӂ6NCj*i?:f>h+۴dɜQAٷO7ךc]ЂADχ}\"D|Pul5f8?7n7aβ?$e *@PA%[@ʜiLd0(Ry?^טP9 ,$Ay,jZ}TN2߾J_<}3}RhZ\n"Ļ{5m)"+sPl]=f{$T({=f|[#vE&7 )ĨFߘ_Sۥf,:?xM0@VJ|<|Wӑȉf>I%|FK.U]׈NiڂI7 hJ~YvA^?c=Voش حΓg# -~@B[Dۃ[ٽN&h=d|aB݈~<Ƕ I(U~/tV& (qױ3sc?C|'cblON}0D~@($-0kf T#V)3s|xjˎAv|F,d7 .w%JkAMJ E߶cA} ԮD~;}[rBNj<-m _*ͪPw(QٯPa9K NRI ije@A^y/ +esgS?>tY wwbEnW*NMpοm4F@RM;fl; ;‰갢>z͜b^b }fm$  t_Ó䟿䩻1{Ó,=ȑdg\I H$oy =JR0dgd98;:>8E)-oG!.3j{Wѽ=!Ǡgu1kg% genb9|&_*h?tǺ!`Ux7e&3rcw ̂E2,PVp S ge\.?S= %nz@[ ?͖F<(6fԼ%^0ql*Ӭf$qsPBkr<XW2!=g_O=%Y0kGp,+KLɩR:4>qe7ԃ2`rVa&5^: jE./h5Y~[F\L~~{ $(<Rr`e5Uk$(p qRgP@:o^l撠8Ғ`FaCe;! $JgT[%fK#Y/!=ē+I΂gg1yzuH5`p`P}Dy#5ڟ\ه0&{(w%Y˃I eLS4N' W pLv4LgE"Ƭ&G4cL1|#YRiFvGCF@" IBz\)X Ph67hpf*IiZ$ʁ>-kP`wp&QS~~Y-Z.`j=UiI=7%CZKZQzOn,~}klh0SG1!@OqyB[.`$2?@ ^U/}&?]l?]ċåֻ^#!Bľl̜ x aG)I'G 1Xzn삠x-ª6r8Zֲ#,6ݵzIY! ^tnā,Z12,#~F#b%][ֈn@[FkJ-9oZL;gKLU͢5Xľ?6fv;-3BGSzoO~,x2bMDI$a&4;(dY ,,HBI"(#iJ +\+3&Ҏ/;?<uS2x݊Ya/{+S7pżU8%̒Uj'0CJ@+#2X׊Ow՗ qh.H*xv{qTo#B fgNȷ}Ffs3E"A5ˌ4"X(g-Ik1;>;P!#t G ayi$\jl=+wM)5eirL>ĘЍȂa+6vNAML ,6[hʑ\Pq`!FDH;jIvAI*ܴfwN`61`b;t`AU2~D)lX51 u [-N\4AV A7 p>-t'}{'+ө*AEHvVTc[QjL™F˖yH<]0gHs1`}"ۗX1= ّPVi$lg 2a.d6"~,`:Jɿn&tȽtM~UW1GK~-YR oi 8ayf&aklePa48|H.vQvA X:~,C}]:Vڳ\+ ɧuHq%3@nBP3Elooƾt1G'czwe~]uNzk~He2j}s\M+jxVyP4C`ű̲6Ea$0>BGGxiBA𡖍z^6pUEhtR yd[9[n[|Mv|kWZn#3ji$S!qHhlڂt`q+QM)5Sp~>r;4fu=v#+/{tE2}ukR$$x tWz\HDȤeyֈO+Nu;_o!><=wM~bŎ=oQn²3ЫP6'_7%ޯ <1{i%Ŝ~/mckL9Q<ԝtYn~k}cJ?NE/vY=uI?M<6ze^TsA @A$`08+g|y2*O(ԵYn5/Ikђp}^3àsA|j4lCk8ͧ2ڔDÀsHs!X`4?eT:Rr3 Jzf]Ӻ:By3.}W5s2dHtnk$O9Mp묤²},)vΊA$_;{}]JD \b5ډkqfyGK.Ii|ub65#Eۖ)$b[ 4Hl7_7'o~5J/|"EN`۷){$ ɔI!7?@wona]\oߗb6#4Rcc12gEe+ot7(u\BpZ #&+`2Bv7~e]Y-?Np]ǜj0 ED T1a|ӺW J$~F>g=҂꛲c5ZK"޵OiLA,H%9'8ol6%$Rpr+ @lGnauJ ᵃ~HEPʛvy+KM> }{?إɗ)#bPޓyz,lfV<0Aݱ̑QHA;z)c$}$8C],XJ_,+X# (:MVN#t1 -:6C'owlnot|ybb6" ؂)PROIW>IOҧtA{r]nWҊ#XX}5pwA&}|S#9;%P^F\(9H{.aMEr=~K6eA.L9!zK{c VtAa#j|F͌X&IJ5`w5RDAAl[(@|!mM<ϣ ϣ W9|>=oqf;|ʮ`~z{F|OOS69Lg7_O#dxϥF p4 ֌'tY@S\7 țl)P9[0X~_XjtD.8q{: #Qe'[a۷0Y?RHz1ْטBGQ/c<Ж`Mdno0O$Mʚ{{5 ! قQ.&A?S:.z]KsjZvCl$@ϜHO)`(_^l#l^rxXEGC I;+ӓn3?nn֤aR7` /{ص8z) 0D;b1q2_{t筷۶#^+K@׀=6Ei]wutǝw&~9E)i:HG{lK_{twOY#$ Kb]64KC}Psf9]MAȏ2*S@r`Ȉmqs\&tXh'@cf E #حI"Ys¾B6ej(I`ppyUM΄85ײNPOׁ5k*b g@N2+xoZVg)`u$*v:c˓enqfnfFANđ $,ɼO6Y<qL)9g[4G СHƸռT#~#JI@M*23FC0)]F~`\pG|tV!'5ũDmJU`mflwy!}Q )K)Q-p]'"}p8nCguv5.tS[-X.Q Yp SPgêd"oI r&'htCb Xc 2+Cp{>})>It/RU+rJ vf\HqD+<2XoOp 4Z 4v@i}d id19߈5{=xYt3X*1 !f)ĎP,9owz2P2$&5dDkA9#"J7$vTMmAv0%^zH> }p[qNv#="epxQ"OI%2<P]]PGSybt~e'P0rmjꖤ,j}|y[#u0X`(|Z w dw|1k^w_/zL& Db3.z^168sU9Td y$% [`1lgk͖iJKΜtv8Q.[{OL̛:F٭f2hS'& ==o]>ݽ{ e@49"Te6e e9QR!0@\NX keFw#tz0CLJ<=p ͘fZJ6 )_@z/@A[=|*ع!18rx*fz5b}y~v~)' IeJD{8 iZ:BM>IBđ zC"fHd8!'!L6?FV!I.pRhf!6^V Tc*2_aS`LI.$(I+Q4@n*|i(]DD>%0Vm.|)a؜{jO_=("[GS]_4u NNWst  ;P1L=,u +|:u Pz،6 ',8ئ؜֑ \:)]]K:rC3S#jmk>+T. ,7ބ (d׺sИmϖF-{ݽ{vQ3d62ˠ#=e"5,IO Mosb?X-vԜR4%.9lԹc9) ~0*X93H@`Iu [R,Ժ1b*5=Dd%f#R ove:#ZR"$ΨkBN,?ۯ &AcoC4T%~0"P׉@ȏyb6ĈHu\<(dS v#'+[mJں l90%X},AgSr w֜$L*v:~5kv%RhEƧ^jmT s8` @z ӾZ+MjiPϷw\7h+YY҃/>`<"yh#;1}ZT:D] m=AWFd&Ȏ@OMeGߕ7in@$R^C26h>jXKFfl: ;GGM0|מ9kmDu|NȄa4РJ#L3gͯGKx(tj;ʁ^y Iu![c౥K%2oꗦcsr18SzB1Al fP*㢌!lb$ҹ=z3brZ0!!0;p(yLzA"Q-# QnVӕ2ffыDO^)FB5bT\Ա$`0ѓ*OD #e~PBCek?߮[%̬|CtM| {92 e(؄n1UjOFݦjegՃM&36/I\/uA-}AhY S A&Y*x{3XFh-P(0HZ9# a-pzKMFRmhoh\ 2a:Ӆcxx&L7̥ >4}pl`n\I7-@btMB4s|*ή? ^߯fb٪sHՋAjɨs))NH>OzBP-Y|*?;:I_gx|N&dj ,YϠ$ 5 IHƏR|<V*SpAYi9MJNNJGvez@x""}?Hv0 f]m C]f+dگ'_.{? J{uqQv;RM:fpbq:Uzkp:TdeAT3֜mZVNGޯ"NE֊%@v'FO;2 ^ɮf/tHק/FzuSM}]*%] g}S$Ԏ~8pN壵21f wR<-bGApQ#-цCȘ#8g!G thp)OAlZ.Y'rêZ$;y;5 HҖ㑇B@Z;2#L5I t/ŀTSM[֒GujM4eXo,-Kk9aDttb3ѴACN$O*-I6&.cdbQI4{F< ZpĤx6n+mJlOapDLE E | te ,2k!Vu`<'J ByGtF* -RSvC$h!Yoe{bξx-=*&+30}}y{+)E$}#9$x0Ԥ<0"sdJ ȷf@ ~L{DK$a胁3~0~ꎽJ 3䃭@aA*F&T7T/ƒJzTZkHa=-DUj '<]T\g@|:4a,_/a%aWA-viAkwefϤ>Fǃ;M(Ks;`f 8p 5-MIs:rp~tqFlqa]Sf7\1d>`;шBk Mm]eVq@H-8-g8(^]LOt QnDlc^寙np$twQi iux.~=ޮRKpH"eCT@`7K20Dd|&Y37q\nSJ醘*s|f7 3ڸd8¹hR-ZD#? h> -~YMcy5C{؂(j2g8?•HwRǞ}6 ۧǦzoYFn'xa6Gc1@ {ЂukIENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/256x256/displaycal-curve-viewer.png0000644000076500000000000015703312647526527026102 0ustar devwheel00000000000000PNG  IHDR\rftEXtSoftwareAdobe ImageReadyqe<ݽIDATxڬyЯQ4bmF 3Y $ E`%ETrR帜NJŮǸPd aeĬIh͢Mu}<ݧo'-s~>7+Qa_LO_5|یl-ݼ;?7/ww?2>PFofڿ#pkbl>.?Y{{?_CXra^H1ײ}_}w}7}\볏 Z/j{l^'>1]Cq-aQF~b:k޾{t]w'õrhamvsK?=Mq`u`o~|}ҧ>廧?s}ow#˟->G;aW|6_{_U N7Tl}ĺڕ^ocq_+.z<ۺZm{~Wvf.YYL}~-ԟ8,wmym 1#m^Zxc-byA-{-mg0/7 o^ް\?\eCw+"f \r[xM_n|^8ڦl᭹#-2q'+5@&lfY('8wR_֤.et @Ppr5p_ǃ@[)Y`Y꟒$ 35O%Q䩙J gX-7T /_nKk}|^8}{޶WSAumA2nnSe&.SpؐCUBcf9u_Bfg!:T(uմ]ϳƘlVI,vd nmmU!6=F6)`.52ZnpʵgJWJKDpo{f/+cD<`<أog\uxYi-?=Q&Kܨ`t},}7k=6o(^z]n\wɶu0+.hц%gTD5$I(<+VHzT1IݠԶ޷J!~OV#nc%W$#KkuDB V!bLU;%dx\b1P_K[@0P"Z^UK7n~|dIOU -R^7Qا-.E,9f1fq@.`q.kA`cƽ XqxYn^XÒؼXͩ J[ ۀ!C+*b10ˮ<#PꫴZzgd1-KQ 4u(.OpeI0\pކ[@HоX?|荇mk>`mgk}eUjgdg,=[ ݊f[ C9`Jj6:XGVR\:mL7<m & |H VY\Ȇ6|:5~cX̧R?uceJ1Ծ/3\&uSu2,1GEjP|26> ڃ`/?\jk=KLl~.7ix}9Zǐ}5s:H! -u̱Da PC )YxJ i+|-Ecvns lJ.)#"!Pc%qƴH0 .nN"+[v{s m{[}.N#TWQ8>ٴy؝b`ĕ͔AbIͺ hgdc:>bTJ AE`L]qCp E!VS3Noj4@ śx !b#|-^ YU@V%W"շpS fFCfxz6\OuL0֒J_l), oY)ux[i)ɶHbf:УO }.0MB[ˉ<9F8UPijٸ'6b-$ڷ[J}C4%IFIc B~[lix|kR~$dlǘZ34ACO_1j=דԲ/]'_A-2H|> /p;V#@C̓apz(CFZ:\Vy] H}z&~N(ԧq&M $f >2K+M߃Nap'ו=*>GN1=GAuՓ46HdT k w6:O_S`t-FLk}-esaZ8n5RkPT5WO\.yMnjt@rp-i/"#֧9GKQt89Ȅˬ-\4h 9V*0حSs[OC PܿM|" {bZ$gzx*x%^ Jcϥ NgOגȨK{_B'u ŷ 4x2`Fa5ւ &D[^wsp`ۻp2 c0> #K;i[K8`3R@?o\*kBQ[bUgf#_av7JLe]R#6=u,nء*,p-8@vĚR=ZmSt!,+_}f3]asraF,ێ.6#&39 F_^)8^U~Db[(.t+ |U2J+8,go`{F$ӟV4R7,GpĹCg8 ŐDhJ"iʆum#gNDOJޙ5=ʐa5Xhk Zy4a4@\\ʁNqw_|2I9mT-5xAt-ٛ,8A Ÿ4O#e#_B]*s{P D)"54;i-He]m$ YʼnG4Y=Qd?2jV)=XvŻB G=ar:jT&Ϛ%4F( k3u(L Ubn@y:Rf(z+O FLR3=J >B8n4NC˞޷ܸۇ 6 r@P,T<Ԑ%9GD?}4?4d'i&/A{hH,~`1rcŤddv6RzhVJ~U JR{ĔlmC9ȱlZ8O@!Hk0e|HAnAHb0ܜGbO _xU|Z<ݷ+(!Mr@]ؤZ\2"qi|U@]3'>$$56l~S5BhPHr 95ٰol i B],Ɔ\Pߝ8`BjY,Xvabٖ޵Rj,Uz}𢔖.XǬ(Y%i'_e9<*=^1<67ui'q_W,tȑlOo 7\#픂lZ& MOP&̩ݡ:oĨt3B2qnHB{k0%\|wؓ/ueQΥ*zŊbp.Q6sؗ#JG//{urxXt&0j#śG:"4M>:{en Ùap !IS`QJ[͵2>mΔkDd[5vZ}5;aB4yN;A{K#YWf.݄=M"R8=ʟ ݒ5Xی6J}=f rHJTɱDn[:GknXBT98^>( , z uw ht?t.> RTGD@Mc,'"n͸SQNEnֻdsSݵpnvn&Gʯ[1yz{7:9(sn*ǰx) }s=@5?gv)wHښd瓿̞C"$ xPM CL\=:s\P|"<1ջNͷ̱\?{;6$yn =7[JgLLl^~a {dxۦf1Qc8#駄~r}c>ZV %qxX62"Q/}G7>Zءs Ů9)bqw'[UM9 9[_Tqkn`;׷i-/ly%S~ݏwEݲG/\+vDv OHu L6fTmg/E谲)%u.v[AP6TA[`]'DYF8d}Q+C85'iYq%h7Tkk8I;d` ڝg#G$!Ԡu*;*L|2ndpd&Tn腽+ܗi#lxSK%~#9KKPd ;zcX=Chi3_XFm5@tSX,CsUk U$NqXcGIMsfP Qjѕ*OqyagR(<stJAdy!r:Fȋ靾Dp#b%: v]n~ryǣWM=ʵ y)qd)Fj#:qQp?@Cc /^{8;ϭ/A?1v֌P97!qz8R3FK0Ga2B;nsEE"Eզ9ʑb˽ i$ٖz=7h UO}@!3bOn6q4t]'RQw- u8uEz==yv 0C2=/8by0GiG33x#IACKBydǎwf}JH<޳W;10{tNyge06]&Mh&xe:!0hh@jRXȪk$1a3' `4p1,/ԶG$l~]R+Go@0Y_˷qт 6(0aԄp(9a)RQíyr .[8'kFuaC( 1-UH1/$ڍ*2FbH(D,AË$6/Cèzzxh21ic2`,{`EL?m7~"|.1%Y& 9&yjP:~*y  Ќ$ĹXV)FCi³YppS]=q]4 D[, -X'vhWJ VF$Mڭfy |q+ 8Uƥ.YcDqg9DN@V;@mD`5ZL[o{ǪY-f].L!55H -0Bg٬fxjZ2}GhZuL>7FLY(Ozb{4GI4頏h|9Txds|ۚQY2YqL p} nfڙz1o 寻Z'X#ցMS(9)/҅;w%yfoeOK D@#!5W*NCLa/ռ;zP5ofy@g?u LGSy1eeڀ-#%s7P.UZ6$#NPCH 砢NFp]!VP˥s+I3rsǘჶ9r #+ԷL?jσtp\ rBDD'䅥濲itYӧV駏\EAPqeϾ Eʼn]bp]᪟B3\[+鵥%Oyh:I2nlM;h˘UF遁i סqv\38D9Gq"uA4?kW6[`lTs@΍%yĘ:=yw`lq KY|?hf4'=ׯNt.yz5Ť,'Du \-^o2Л& Xq"V{ +n>["3ɸ8;i.Oq z݇`A/hHB6!T*cA8ӈ/ 7cW@s H\=KMP> M-_¡ GTT_`Wh^(|%V~ֹQ; ZM-R lCU +|( 8~9`Em:zˑ y40iA8Gĉ矤SW.G4 T`t9Je'_Uy@!jzxGd_1p7@fVj=z n)jâ{[wK݁gLTr67ڔ @?I_K'Bx?:wbіBwQg.2Vy2SҺ}.ᕁN­!Hx0<Tke߲痴uaPXt7TϞ' ␫93[ 431݌ܓ-u9h㪯dI65ک./,1& N |xuӤD3\C_t 2T0a5`  5TL@ÊF]s aCaܑhPk@o)YV+DM/,i˗ ֲF߀bp|0Y~77, AC\ґd/^og]̳T$Ҭ 'vXpUgi~h~ЌmŅb31ʹ})Iw7Y*I !;9f9Hera[:7oUݳCeNq9Cag jPf߲i8+'U1OyoֱwZȘp*Q#I+2UezvkfP5~x >ڐmWiXsLsōJD<ZWYF;Ij23#sӔO5ɉm(b384 $n QX#p6̕q,}߫cTc7hc.#K:t<f8MFEǤ8ho{rzN,bzWUJg! (Na[qyvb7f0 Сdf'U9&Hy*]1.*Eyd#yq 9`6p Ȉ%5!>ʚ8y. bd?VN<.67Gl+{S(EJqmF>tXNY^Z-뽡Q Y=L1,r:\QqZ/W=Fpk4{l7%eA~$}U8D <pT{c.9gGU]I~ڦQK5̆ZF`X4 giczcMݨVXW:Q = YWýzc +wy|S 3~/zGp>]_C|{}tX sJ@eUu^ąT v pKid&1ܻ[Nل(+w%D˸&\cCLPt[ 2;Rp$fݠ TAцCd3X.l (NCF,]U&m\<=\g=54La(ϼp8Lx rqə'IBd|la6_$ȯ1F|cL?c} Vڡ={Op8-])j1 _zBl>]cq02|vE2C:_Z P8G[G 'r&}t-4ͅ`PSGo/Wkzˮq= I'/xkfwBbW ,CX%s`0K>R+kB3yV+}̂fwCIdѭ8apO_z?lhgEPlҀypx N Sp= &"n̓ai,B  [a^:rbR>zpA/Х˗R[2S˸Y於򏾆KCdr7&-=C5,/|[ h.<4R|iC[Et[ $68BC*ȧ~ּ:PJ:ݸ(4ڍ 8NYxA|D2KC$ѷWhW/<,h("ݎs,SL*tEG#E{ά ίCG_?yfNHIbOqXbqI\yʹj#HqD>@q-mMEh> h;Uӣhg-#W u{J]]hnU$\hMZ?R`uɥg7Z9{>qA+uMxpVff7+:z)VWK3cw=2CMlG/Yg|p"u_x$q3Pe5]+B : -LKj(Y m%SvpySrZUqY?ujA.<Ct:u:{,]]7?/- <][oI(]BkyO@_GˆylI6~}^yl0bD?Wi1TJ2Jsm$@FMS$Uh}C9m)~o齞™ !*SD㘳[h8* >A 䱍 kTmIW߉?W#w-|[PS]\ٳ|H ĩoq|U8`[_>bFWe#F; <vF߉ 0s2JsVr6bKBowD"> q8Eԗ#ti:V&6#ߠ6!:33 (*XmӝyJ:P#7O_[.Mnf7pV$hm=7$wcI~+!#'(/<ҞI|Fkb>ZD'<_) ɳ,ڊ9;z sץ ⬾v6 6/P4:T9(H9n|P5Z4C*(~_0CLyLeц%= COs4` :D'O~ T]xoqgM;6=m_>Mΰ3 ":Έ]|t]L/2}=0-VXī=yHE'١F~){`2_2((3>DʱX&%(hua8S<=j63{qv/mTsFxu|͛oP y;- ˧W&7˟]“M7]gNt62?Ke|7 AnL~ D,硇rq_/é"b8K?=áB&*8{ Oi,pw=c>/7^EÓӜ'k3UcQqTC}Γ;7'Wxnu\sT!:ms o= hxW4#zﻈ>Ox,=^p]^ov!>)AYs'wQ')]vu<ʜji ZfoԄ@UR^vkRx5"2m&3oꉀt:SXP9DyG֩0Vg_7)e\M)%bYw¨ hOqB=\E>.իWwŨs4':p뛢0T&w/ c$䛞ZKa;nc)M??qz ڲDѾ3/.(vɿ2#7cK'n.]+'2:,zU .zoRЎ08Mݢێ; ꤟ Y=X8V68I QRϦ &qyD{>;2/@o@neM} "@#c@{Z%[ 6H:~n OqP N'h=8ibѭ9=jƐduC̥(7 yñ2&$SmEnhl![4ˏ3`Y1ax] YCs?u@ÐVJīxTLjKx+NxJHf?okXYh޼ҋKoT ك?*<N8"t]cCt[E2AQ!=vF]S;L-NTLV]2v$itcSZאQz.spvn}w %fr i?{.nuy:A87#yq-}{`U/ׇ$`__@YLT{vq%6{k ̛l)<'Sgg<)4:H0ݴU^x)}T uދ<]IˈDmHd 8>IUT 4):Ջc٠'ܹng9[;kv;jW?Y8ٹ I|jc<$xH^À65<[(0-Z!57?ZkG3l^ѿ0RN+% -L)GNojJ.Ǝ Vir=z+yӲhЈ3jQI+eidM犍WwI46Myg<_ݸٕ´[kvt |䫗{|Р9A.i̜$DKoꦤjn.+0e@H6ԋӿ1cR}c`QᆬR>)سkG><+4KdO߱] ;]2@! l{s&5'o7Er,4%gNBޞ5 /|}]>hl,x<\xWe|'?ho6C^Ҡig8,M7!>{)27Qf Hkv}m)lV6LK`OoOև^٨eǮˌlXVk$~BrXrF6pΨtBIIٙ8ͨ;-9lf;K%+<;l [}[,Fuـ>D)!v!ҽ+0CP<hu  &y_o&Q o CGc=0L\c*u3s6+ib3~& ᪵_~T*DGdaƞIB\$kh?Egϝ-?495pk`(I*yyD?``x@p^jWcrnSIn?ԗ>#?Uwoկ#}NF0hQ$P{6ӏ`4~o NO.zlM2(ObTKzǛl\T61&=p6vü:iaqZOuP繳ʥ+\QS QNy2kTkPW#ߒbCE^ ́65Jb /P˽R>aRS4adiZJV7̘7C@* JQirEYl&R8\<.35MX"``8QQ4~Y}li칎IT^)f~L}~Ӯ!{[^Ϭwhn<ﯳO7*Do`-xɿq ir p4!AO:?WgmF_̪=b&.hnH*в;ޒ8pTJpfEN_q۷v-vT`,Lr^3Tg@~֙tc|Qga{MPmz߷i Vc\O`C1IÞ.C&G DspBzyF* t̢?웪0RJ09z'd̯ yW6QG^/8v+~sڽ67=uDTpQ7ApO[)HiEi#^_αl3/4"6?H""K|ٱELj>u$hyy]ϼ&׹D`x~ Y1ƑڻE*ge VY`>AG{.F&>gP& SAR6Kokf02?)u)Ŭ۠+3=Qޢ^uрzz`{J߾}!uʛ$/?&{G#=+%꟧}w6(9˔P"8@ox,Y}* ӈoߜJk5 P󅟡^(3b䵱=&s8(/ȗ6;&N^;9gk;@3* 8 -řrv5?}IJū[p4qUzQ~mܝL ~f߬!i` eu;\/&ÇM5hn JQ` .5>O" 6z ̀%iԦɹ v4eDIo dו?ݡ/:PsjӲ{;mӏk *<%ᮽ_*7J,7НqΜ9lЉH|0GX{5IMGnY߿YןN}"2bkK'lƗ,0xnI7M&XIٷ˝5y~5 7?=ǗZBvFZz=0K*ʂۼך H>7&0|"b<m֥~x JlVnV N2LCSh#e'S'-/u)[Y T{/?|Gk\~t8yCoț|vX8yw°}<Pwg7'LFjSB5SJCtP7L*}L&.?gA(39 abT0_~5xu7 3@xblР5@܄oߕ;unKVƱU%)ʖxk(NJ-[.o|\G&!M2}fF:70xHfhFYfD] $\?3D)/ו/kDB;4"mK28ABj=8]Tu)3޻쫂f6*)2RE_؅,N 87I<$ o1Tߩt91( Xl25d<{o|m2֐˔BGIg|'Mu0k(0>u萖ġr ׷Gx>m4cMNwoVW R#{^0ȒxkˆA(?EgnOnr-uzS3oձc'x .+4dA"}x]8M,KoO=CKm]H+ē6yjO}7L\ X3^A!M=}aDd!mf.")'$GDǥm+k7{A܄2&=v%Efߡ?Do@٦#չd_<<^פ[ǒ`o{+׷Xc6?^JUFN%j|Ƙ?RVj\P=pTtiJhMg|`NRT˭} ,P%,C|c` zbơ]ӟ22ZPVV,ku>vD]wZF4r@Yh"B;-wx.!u<}VsI4#a}'']s}a4gZ%r'}bZ]2O(KdV5<\Ce!iZr1Zύ`ekR;xbka#K"۠NM D6̒<10?W]PxrvZtV{w.8H`DlXsL ,`'X>gIbkN ˏ?fs:>Q"Z>?7?$4RK fNk*h=67z F:̪_K̈́fG]1#X>@Ń 3鐱! 6d -I[UⳫl:-pFIi!F@GpNeux8R7z_Q}MutmؿXG~khQ<_z*1 &ސ`)F&l30<%N<#ʓ. iV}`:|9rsLبy&Q/v Cus`yu(eAUN Y,= j(R]*_T[nDNޱ J[j^Jv27gv[ަt53ޥPŞ]}>L% w 8!5h>q#p򚤬%ފC+V84=X4ͮ_.1"P>6PF)K(0^mxK6v_;e8t .'S2X"MA39z-̊_g@ehXG4YPu_/S wmx'QoP^[4&T 4P$N8Q˭T3\kf1#f_(Ԧ {_oBT6'Ւ AX@ @пҜ$4E U T!"sp'H4C3W(_%J~l4{WM\\d3bx!6{C6h=hёG1Gke_zwF驃3C0t#{;lSQN"mtۤZ]e̽>!xrS}H(:emL3Mc@'#oƮr I<ḛ8qgL-u!" 01\p&ulzS*&-zrH&=MQ$ Yzxm Z`id}T;jD9;5qAJTJ!N*'"[<'u`%ٹ&s?DW' ʉOd,9:x~`wR2=ވQRߍ'[L@cD}O4vو`v϶h :5m[R&I*jf E ۬͘uu1PLC,*N 紳?PN5TAWC3L7aI p'^ /DuKEoYӧOәk%e+XsΓKq!ѦXoBc,!~ѓJcO6n&zV$R%2dRwۂ=No`<% *C(܋|(o_PL⡦5oko EPA m'pRriC%t$v q\z=q#s$s59k9|0r˫詧+W4SBkP1`u+?{ۂIhʷ]c]~f_A!kgCtؼK'֏+#zBo1(z}"6 |Ln4BόQ}jj,e+!eL p,TYp{UQCz- L!劉z-gA;\d=]^ql#G_!g⠒ޚ ۨm3 :Z zmMA﹇2ÿc@YIZ,I>y,]R}7)5!.mgMzq.6ˍs$9\RspuAj& \s3xpOdz;b*ꜟ2#"`*Rg,yJ0gx%ZDeMUK >ݽG[G {Sc ,(<ЗqFp-Ibyo Ⱦкk+mI1ӤCDKv5fRek~+2u gCS`2{SL+X'#H3f"3V0,K ;Df6i/ H;CTSư?O`,:1G[On7+FF`/[DpS m$'?'t+ y^EoMd){p9R>RS ش%zGRpfol0\f]iHeh!hS" 쌆Cflޟcv3݌M4ތe!:qfd@CJw[Y<@QfʕKN.f\[-2i Jf! c./-x" ChFGa>y4:v.ZͺWomtdKۚS;0XX{MIAh~=+PpEЉoUv݁$a{ O.ƏvQ ΁u̼XjCIJ3E)oiJ%hi{wэA\Z:$ dq.xp_@V]j̎%5ҁAywk}uhs Qj0m_fH첼˟q{X:#.0<0XKd:BuFsnG0MqY?<8wU(^?Yy /< &)I|հ>g ᦏQq3CW E du"s|t&:ť'hDk3qꖥV8bGmBM&3``Yy[o>p6$6[=\IjG#ҥš O83QR`-il= Ģ˟Xp {peyǍ,qMV٭d}zZP{ǵwXɨX $M@ۢ3AiF=m6Z0ᙖ]l}ۂ<!A<>gSa M:L>/|NT"KuنL:eI*5_} :\j8PI\ ׵Wg [ &?)3w瀶J'\{ƄPiYLp>^fM8 x<ԥ7h:{w4؋(꒭YXt/xB4p6)WSuCi7 e[2Kd Ey| DRzwWJ]"#)fbtf2D>d5X hJ:M+-+'#hMr Z6g4Qc@8d%ї?:ѧ_KC<0B o-xly-YיJ`-#YƉ^Cn~L.?I%F>r;/' e˟OA7 (1r&?raYqGȘt屜Q#=]g )UIDtN8a f:ނٴڰ!%omRԛn/;ylܑiȴTc0qJ}jt?H"j\JR"oY;+wz iKK0;?؜~8\ϐ(t') H/G߯!Uc>D1NFnc?gX‘QOb8/:6d:w#d++IM7)h ţ!j1BK1.,0Z>ɡ?g z yʓ`,+AJ?x5`6mC!}6χ4A#Ph3\p&t|mS7`vnfMge.z:c$Dz~"4؇p46x~K f!l?Kt[{ӷ.]`gٝ1 ׁ~|:64$~4Gc6)]h|bʓ{6g:ָv30 Ib 6H֘2FrWzl@IAdR@v i*f'Fnb.cTiW\ffWV${ש_j˗MU@cRN_b\}22sƓ3>jNLs_ MDϼ9 )4Ҟ_쏥l y-2r8$PC9IIg^ 8RgGe1nO0?oVr%' ;304Wi=9#j ̺  I 5xqpRs.I;-̢a?,Fu?dyhۙfuf_##{dل!4 '/m._^ܘ/ ?b2hE!<=5!NM{/ lmK gU!(<7h}VS0:M.=}ZuqHּCngbm葤RNL8;UY0Ju@Dw5sWyS B@Bo?Etk3F~5wmLPT&RuQ^x+bk>` nZ %55Z^w̉qª5r OGp2 |D~cf{vtp=# (aZp֐=3tkg49cp9NSa\RF Sh|eÏJ{ݛ{7&zF( *Ïk_S")h!ٶ;V:w^y)}& h!9 B0 CTaYjxYJqL@օ!äK p4ޭyܔݼ]>3b$vI"\3z1(w'*=w%&$ŅVowsy6,v6Aܥ;eA&9A`ڱ99P2m[xKw^Ul'==^8gPKKPw ~ ǹjÏ0t$&&6u`PZoλ`TH.ݳ.mumVp>aQ HU;d|Wn2IѷÊZ Ï!T<+%?:?߽V%K|%oO1+$f#s4֢_> Jxִ;[>6ϩ*ha Al77)JA_SjT9 jٻ.;`su9 L i FccR`SSV2:W}"H/^=-GsLJ?w:oOe'` EрdK@&4O@kcA&|a0"1@WBÏZ)!&{,K4]E`A+[~I˅iwuz/ a-{cͰ;U)/sJm?S ,=Z@O1j$eשR@ l n} yn%p;_UeLy]{gZ֕MSۈk%UR*~U2;ZZ2LveFish9o$:қt YYXgE?0)1،^:5/-~IC?Dӽ?Gw6''SȳcgwщU/}0NFIDqeU7&,;OIVALdPgqQPy[~ zP3 ?hct}ֲ#m,0=d%3{E!Ɏ e|}ucALdvӟRWZhI||]ia% ey*Dֈ2O.zgmJsu(ڨ?jwk i;Ф"< 2|f,o Ew ɯ6v/d@3p^8s[(gⷩ)D3 ƚZ|B& DYB_Cd#}}5ѭZ+ Kn°+ܽA|:a>n K}ԟk2!&Z*[ X(@ ֏_0oN!Ӓ`"Ņ"D@DMQGTSG@UN}fzp$ԜY,ԣ=)8doQ,.eĘ0#S{mbc6y֒G1׿f`\m'F֊I:IN-%6mЎ`9(344keǍ{ =y+2 }LR!-(ا7D׋;Q$NwYLf ?rl*$+Ihn&҇h&?jYU!^Xo!cSuD[oY߫rpdTEdAu(/IWǩs: Ï{)gʏhjo>)oWw /Tڿ @{Φ.!%))H_PQ{GfU(ԇĜQ`7 "f ?R, °l >x5Ǟ35o߮,~tt{@|ɮp K)ksȭ:, ?~(sb;JEJ:B8ʫcu->E@ģc_WiE.tNѩ!Y -j,{݌-*[69"E:cH͈$rP%BfjB6E]DGcǎݹE&]n;G!zu+IaHԾ>O?~_1m(PVxv(/gϿWt QL;y| e\vi@z; hX|i8K˂q|jᆃB0-7J32ͯSoV͡( f7!B'ƶ52(ӁxX@#˭=( ?okfkc'u>< n8rVSUS~t~ _հP>Y (O/M'QUy ]O"R)JyW-枌a@Ñ"N%/;sv-d5:PEn7 huRt@Cs^fluE;ВKtV-JˉuUEht_]{Х."c+%ǽvhc5WA|mMɪ*kT9_n^HAvy"cW Bi@KS#TÃG &7I7I̖;.<27uT=zY "P̔E 7 ph,~d} ? ?W|`AT;7l+5cga`d~08[gV3A?~;dtlڪo(mpX/?zO*sv->iDƞ~3K xa+ JZnjw1pƵn! H`af ڟcg3K ĝ.V]*V!.*+5!sHH z(y8էo!B^ձ^PE' 2+Ù(?廿U:3H0ڃ- %QQJ xVO~RACzz]D)Zb@ֱ%:ۑUh@-I eR ~n tXF|%WMau]@w 5`t KEnj΋f-Eݖ1ys40-ɈD@'QM&@FrɐؼØ pbF_E{cai,1;cʐO5DϼCci*fV$U ٱ|Bж`&W#~L];{tTWL%T"M2܃ȢhԸg3°#ҽzX'c'%mKpJ/Csͯɋ֭ ْI*Xʿ|qdH@ #__J׻Ñ2҄ZP:;瓼#Q{;[>1/;IU(%v+kC;ew,k\0sX<,%pq7i^] ϲR6LF/YI=Z3oEu#rlʎ55Ձ]3`M}4w'58y!^.r"jgH컒m]c:,~]$_8c{KrS8^'8zjuG&ЏP]87ܒUv;g bpD `('^#FF*qz zm^Rv0])hc8Mrwas#"fQV4)C &}C6_^s'W ƮCCyd:ӡ~2=$}hݪ9D:iezȆ2|y#ѽ@qW}ʐ@4>w;}o.K{ߍΪ54vӒ7kA!Y[Gjd`DT"wz,vh=>wVTla1 , 253Oۼ p3=,{+8JIEM{?A?՝)Qh0|R>^ ERtYU"{ ^U^Յf'D?4L+Z{̄}ۮ9 {h:W,c&5*t/ &;5W\`f4"CY*-U  Y]G s9гq*RZRȂde9\tӢUο9~b;f[lԵv9E8zW֓x@cn7=g~sĤs%`A؂~gHIcX?g];hywn%7>9RZ\OM=сTP},ؠx,Zms xj{:孡Iwn{i8Rk^Ȏkf1C>R^P.KCW @uZ zpw/ki6R)lE.~&G#*C@2;3 /g:6aFt457. B}_Év^8ߗ1,x1(-]#k 2ڭ itD,F?_G3fzoֵ W^]C"4L2zhO(Dٜ8?Esm8Mhaک}~׮}Nj Cpͭ |WH U) Uu_-sym YK#N٬D~0#9W Z*ilzCYgY~Hg6S9U EfwR iɴ'ŽfDG1p`a@ÙxsCZ+iAs@PQ Q{!Ba;͠E3mSn'9a6cמ⟼Lh^!:$i|Cj5l &-_C~7JJBʨcNeg:_$dk@$<~F{KB%d#d*MC!*_KI; WR5Ѥo;8o"M sʰ4X$ +s<#(vA-``^,ro{D־ uEƝZ ;Ú5NS+5+0ξߨZn{y %m&(TC"(0 *i B~6J2\4: D Z`[ݻ5qgbz|l1%(DѫwjDХgӈ <}ZUf{_{Ag-L̖I3W=aoQ~Ŝ٤V sTHlMDl H`UB 4Kc%;d "E%}6։\]/5æG:ljGVx]X]#OřoJU8>Ǧ a橾c{@dcԑ1՟{{U/!m=L]ѯ.R?LR?7}(FGcZ}#WC,BJBLv>Kпi(h: ˤwj1U0+YP mR[R.cQ{ M j")̝Ph{m]W/٬ۦ`I3*M:i&"l`B2S,CV"L95&Swc\ G&A.1hEVVÎ(&cIBܱiaU[?^P^C =&k g%? }.T0ck|U;a#A rG^^;ύSqF+Y1NR&^ݍnJ*#WNIZ@W rܔnHdDR*츴P%`d[#Vv9ޙ+~f#(U6`66vӾa:D;V>mzfCFii]Xz;8ȪL$AܳS2+%9zr{Be`&#}7_:yn f^ #Ϛ(o%wz[d)wfRhLrfvx[9 8ǿ( t4*0&.Vpl␂z`ag*Nc\| PaX,JbIWVi ٘οLl17f>k*3'MuK/)_Co)/yu&`ou?\j] wdqX]"2ya?(Nrsz*dD34wB&#sNFYן9 5sQɉ/k)FҎUڊmNw?4P{Q!YOn+z+$ 1䝑D`k}NDي Mh9ٽAskx~ق0v'NM$,4Z!)r/cm'g(ߺV Y15mznbj[wڛyDpe˴NUu *jspb^ho`4Laoſ 3UI,7E8gE|4luW70o S0HTy?{^1-q%.@rzęoڟ ]}SW2i_ WuOFIskHsׄeϬ~ݦc&gx.)±Su M @jG./`$7!%]{w#=νR!ۺq0MW~6>=& ZSu4uXy[~ՂOQ w|\}_Yfn^Eٯ4љqyN5Rl/ |J2N_':ĝ6n#0K;30CD˯Cyٴ0z '  +H1ؘa(IO (L{1G|6;#xFEˊQZzuFwͺbpS:dRy1n' Pdڀ|A4r+cڃqRF Jծӭ}I~߇`ЪAX#<ӍQ%"; JG ?H鶲On9^U';NM̉H:1gqsH6` r)g]9JɌⲉlpFX8,RO\LT" ~M/H@[;ïwK"C=NPdBߗw+w&ff{CXA#3dO>菿= B.1k 6hsӳ(㵔٫lAfod=[b[fn^\q&2& 5WŪ!YAAqnՊC&?G;E}_@ bIatTGAg ln8@maŔ.Tʽ7@OEwgvIa 5L,xD^Bϻ(- 5/PG1K\_M,ke4TVF LjONу,izRb: oR^i9[̆^oak.$hy(f~ @XoH79D + J/mBȖ"vOK`@̎ bMl8 .X"<8|ƝY7T]]h=EeKRO}>V;\+HGmGlU3)8̥|y1z$52Z/'zMM$Z9T-8l}ކSx-"? -h!Y jY2aw6 äd՚9q".nL}% P"57,Z#E.AjsdlI,lv= KC0 ~ HL}uDmӅD#wOIv8LdU #ؘuqvᄁ|Թ]m٢9,+O uIe<SeȂ(#>>^@N%S.&6kxN^Sۃg1©p$ŧ@S04$;jvˑr+cK~gIAPV3v}5jnp2NSٹȅ=c9ƣVAD;j[3Y9G/#yh{ Z](DOsCO}.бc;jd Bc73?|ru΍ǩDZc!>pLk=i[_E{ 1O6 c>KIi&:5D.04ǁ3`)}c/ 9[;Ar&Y<|ƯIx}_,)Z0RT1 Vԧ>U h` +}}8}q 7ܰe^@^-\b5>V߁}ϣO|1ɤyU=>{ey_V2M`W_s}1MQjz_kk fw~ѧ<;s*:\J] g]u%;%]AgeXG4k/C9,y IoZ+x# :VP2*b펛3I7t I Z,`՜<$u]} uZ-kBGnu }~u &p *'䣧̋ 쉋Yk!5wZ gELoyObF)J͑)9}R7NAn8@~Kd\>/G?FtO@$o ?]iI؅ L9}"񘼰%OC5XoYºI1MK ʀW B8hҴm4ӂBfpM*7~`GxڟFTxlӎyEu{ug!/F^UOW̎3*'_I @쇨#|4fO&-Lr{,OZ"P(3[/'򞑸ֺ6hE7=] IOnTm0ϭ9S}<;y e+po @M_#/k h\Zd7gG^xS F-JMH3`0Dt`=$:X5M!zUݼs"m#*/=eO#[ጁ&j-;bjH /K欀jNprJ|u_C]9L)ksqAH4p77s:'w{׃w3ե5ꌒF}xC R<_V@)Cq5-(v<}L< %Y0IU&s= G% eXI[ۛ AG1;AaI}ղIT$%R;5<  M F;]VmWq6`̃Ck|J E93]4=o؁]J/~=S~G3TI!: S/%Zct(p`_ɕvY0ɷ*{Ikq#gvbjYFaय  }<킚tTZ1 &MlFӎaCjuw84a84)>y) BoQfkK\{Зh󪒡u&=Tmqa~_":qWW!՜LRDE) pXA@[u5YtzyeZjΊ:AJQ 4I%7 bM*`G0TmlPGMh!ͱgi^1dQ1z7,l$d+}|~{n:*]rn7+5|q,?.ښ̦uۄ/kLjerVlh Q%.qէ!4X 2? ,eCnf&bUGDK .L+F8/H@qP܋R9D%_F CHi 减Lvܺst> 1U8%˾S*_l =ށٴmyTtSzT9Pm:0EŢ"J-[Қ_!ĘUJy@j*I@&!%9ۭڗ.ݽIs/|hWeK!fEo5np7-W/w`0}+tRurM%깳7  o 9 0BgLeރk DP<\9wJP6-<%U "}cA妔1YϰCYfDx Ztz grR2%AӛP $':gz^<r=Ir~ĔgAGv @P54e.7M @c'j=2f4+?@STc;x3#x1HuI]0\-}#Z$i8@W.|}~=N}> nZ;o\ֶ3~ȺiYVlF<7NU')y }HD.CB:΂b'=K. @W}F]ZK'lB3,AehZ2[LJQ׏--Ke |g=Хh$ȣ^BX3i?e$~B> ;HۙRy=G Axb!޹)M8kqL1D@꒪xKC-Hp'YǸc0*q) =evv83WgZ&5 }iUaW)>|*|ː6'нMc ?_ǔ.?Hpa0 hC| ib`󯿚xEJ$1E7얥zb(Q f`7jo9">S]y ߎd奎!0/BdK|a&e7Em"6;eW!&RI"KMg24>Ok3}%Z#*i#+eLk, p\{~eoo -QA{լ߫` $)・9 j'L|`=躿Wv -PREpD!Ν+Pa`NgEW:_M{I pgUt/oJl3$ !˦ю!) Kˮ3Hc}눖uƧ}siXJvX_9hR#'܅6p Fv^! 2SkޖOhDz?.w$9lA<^Ru)ea2d& z7]^v<>>7:V F-ל 6=ojFSOf- Q2^L7۷6w`v6 )y;BJ}q/R%q`j,>5-jTGI5CAf HaJȠc] ONFr1fέۭ?-z?v!˶0%^Xᬑwm1\?Wm_ռO.HjٺQie'&0aD!y7zҝ+^=(\БPv{Cd<,=`[c zk>jWc.v{Sml6V6#.;&=$ctj* iݚ̈́l?¡(*Хy\uV!)9B/pDəc6=~^(laK:@?cyh&n%5b?ƫy4c+{0ZS} leI!7 <ȍ>^~/%Kʯs@`u@]KG{+"F.G'sܽMBJHB̢3M^IyvFMw,UUp@!X76`-΀-"[*ڊZ1~z}MhS0C]LYj6`xi^tj_7Է։rxЍOG :"5lBjJ>B lhĒ`]ۅt}@ގ4VSud.Yԭ @_/@m>!c!ﭺ!hM=|:"Dv*E9 Z؅ws S (V"WXty/|ʏϝ6 O,I\՜mpj9xoH6XEjq 3 4p )HPSOO?z:-0*ǯ{FL5[ی롒)|53V/?Pu8sib';NhWwCOwlk1ᇑ5U8N3H7zL :dI&ͭ^:u]!!TC4`jzI-Ο0syb "ꍜ$Kx?Q0n:ڊ3tv@@iJ;܈!o5>>F 3ej.du Q.b-*z"MSd hEyNO-RVKJҒ_>30fpz0(l|k5&|do$9qUx]\LVم4pɪ]@U/UKt>4mz zp}Ӊ>B&DKFF$9jw[[Dt3nKV`M|*{ͦuy>e܁ `_GjmP範(x$ڋX' |\E.n+QAR>;bu Cw[ks:wmw;6OiUd@go1-%G˟[6qYOi$p[sjbQFO^jdI۵ʑ?5e\T#r$ZÝA$$PRK1ѿW~V};j$TJAg 䂄.ѕ!*4Z}lgA耥mpx"N7W>)(jӛHX"k1P\,\g4az'f;{{,%DV7y[^EhiA>s ]KXϺC%^iƄ E]'I0wgU$Ө-r"߹,7z=u(of<"D*[IQܳjI4묀<+GelEJmx,bfJR ZMlv:O`) 7bd>Ϛ/@4ckHcpe{Qywk#`Ѐv є/zX-B )aQg#̈́bDkzOpjbx)*5` ,V9@n:J,tp;F̄-XoBÃUYMB<.|ajV$ k &*&RKm1[[Z}zV ݲ|]%Im ,P)HOP$t50$$HS+39c Kb`BTMSk0/J wObZNNbÈ88` izSP'!ÊHtS2r35"CN3Ԡu&ȼX<N?|.C3|"j[|{SH 'j.gOɧ ;3zADlES%dWc9n/Oev;lVZVtCa oG@#s/VmnJ;_u&5{5BrE.̃@ LA)$mM@w#`5ZK ƧJ`Z7>O]U TI@8st;m=LSh"hdb}w~p`4aYկb*ώ:tH..۞Ct5]{v,bJ+rr8ڃt6`y>iJhsf@ g/*ؑȌ!.a L2m@t8| ~6mX\h1pQo>غ=`&1IcZv[$۽1-;g ?g[N=!>_ #{1#69ɍ8W%$>\O<}C$a֖Lwɱ ;K [I{\)p)HIRdv f{&q +!M8Y 5MS*leda@J,7|$*P aX\վ d}L/PQe]}z+0X 3k#52q`|2ϿLv}eQH}^/m18h[-S[a,^˖#s VcSͫz,4hu:ֈn xꝰ'$9!O((. Kn]v#:^DgH4,[6zKS =j>dDF%^gJ&vդw㷧q-9HR>FOСޛNlKh{v)~|I;ZGŀ-iDO{-ϊ:.aD; {r[X/x ((Y9#xhDjUtְ̽#A.y@݈t[mN LAą @Y9peſ!I t |ͺgªǺ rZXw̋C7ΏN~bP`oYac'U*Hb =e*S%mApǀnNKĞG?2 s, 5es3YrҒ"@Aq/Ԙ.@%8aNA@I7 %^6/ZF~54 t٤k6ԃAf/舋|mqL[0x߽k7|X5Nm-SȸnZaLD+79Qn57wF>I- пlfgk^lD)RJ̆ـԗ2cczփn><-i"cPbȊoo:97~s窩ЇC_p`H Ș]`j\SM3)]G^jz/o99@df u/mHJ\ef]wE_L9B;t\S%9yN˂?qO5֛9C pW'>t?Aևp:"ɝ+?#t=k @<İ G}@g ޓgmB|@S8ˁ$h8;jrœ-QBЕTTͦ ;NV>wݠ}O<@yO~d]=X_oX2%gkoa5n2YqwĎv?1#Bw1alPU;r=0G=FrD_Nsb|;;g܂Xchjqhf㷗㺞hVu'@ڨmT|w},1z/l[]|(櫕;}@) B?) $Q@_h~!q}{ G}v XgcDbn^/:_NqE6Zecc7qYQihRhm4~;jr|0I`i-QHS5oş{mZ̤LSFE `Ͽj%䉌pȴOlcn\Qa2TQr5q`qWX+'hKޯ[2kq^JE~t @ ɚN.E؃Y P.G'~#מ_۹]^207 _t>t0<~^ܠU]+h>MgX'*J(ALj]-z vY;Ӣ9c EN}?"IՀfʼn;Kt9ƃ!F9e[KI4F(mrqip#=Gmo0.4K,X2י5Qr|zfLp:޲,z5jš$jUv~-2U̞dž+'0/v:e,u^2՚.|=j ŽaD2!q.,)%[ϻ Ii@#2}cdNCW6!e?="XM1%vrΤ6s1Lx|PlxUy ͳ firjwʝ{!!3ˁ~^OCGM"a?ߧYtGx?!ٳgLo?h?EocnX#xJQȲ2&Ob0T5LUEUeL:1&&`^gޕ򟝽e_ p^ízM?*jYaKU`7&Ì ɀsErlJcV(k&!i1j2wCMVzd1 wLF^l2-e~V0K@A?RlgwRx@x4^6`lJ~n)wTP<˨|k+Lјt[4'e1z}H2-gJP! ܠ+,xY7S $2 GE]4+ Pqe%shHJHt(Zm6;Z/+pU=„6ɻ枸M`U`DCE,Om(hg˿+>ƞ?|;^ 8}L D9!({O*kMJ/N**qχm <]/~&B zo$L~aiJ?]#s%Žc D+x#j:Mm]vr˔Y- \lpWUA$+me@6w#^(;N r_BSkQ;2錮y\7o(QE&ꫀO% ]pHn2l]L'ʏN*ajw|L~c"襪eٴ'F,ŧ*NFu[07)+>v[yOH}!T²ǒdE&mY<5U UjYumu=,":b+#+mwێnť*,F Į_j4v8[mPb-ʯ'ު8LKn|1wQ#oSHSzzp9 4L\\uҏ5 2ZPdMBBmtf#ruVD8g4u`D0u& Z.TSdL@9ʲaSpSggs2zTE#žhWO3I]_DLr.' 7{e-.|7a'N%a϶00d_(&PÏ<[nj `'q\йgL4`€e:i$%{B0'LO?n7uf*ΧWʏ^T~ {V~]r7>4օю;Uv 廓hYnbt@|e#xk-gLJ}XA\[eĜTCɔ6z^%˿Yw%"fοy78@eM_|XGV`0,W"ߺi,-_6ſkYϝkhEg^T>ܨ6vV QtRO釟,[Ju}*)jNZX[" YuW+rCQF,W;\uCI6SA{ U} = 0U> g2W327rA&#%^L `?etm<1?pفg^:Ub592)iR'g=RQޏ1(РLۭS5"JͲ.A6Eռ̨ep):@]Ф>nAE W321g9š;59V%F9gTvV|'GC 0)hl0O c6Yl:l3[,f>[^e).ڃL 98:y=۷٠g.JхkL :9<)Sziws|= R.sa-Í*zGluOYD&5lsc,$ZZhKx]&nlD(ɺt;a[aV}ؑqeWHц=3 J:lC%R"SHز+p1dH疝ՁnWQo^mR3C,?IGGǞG 'Vop] k!_&%u W|)h};EzTZNCsw C."ͭYAjlAw8ڞ,NMz-?4=+!h [S_m]MY%P0$,m '#8'Ь89TLg؇1m*bS{Z `s}AsW-&+U@/sJ^=Yo2=`9@[VMǥr%l={VI@u2)C1)Cf" Nr1ԛz_~`mv h`F|RtK?ETէScEVg>U㇉/KjT-dU{E7)0g *p#ȀmGK䱅(TV/ LH&.َ-< Czo-Zb^Z ɟuΒ* :P!'AHeQ>8#fZbLDz}!ڙy@KAkEu}||V ↓|}E ˳<<1jq ,bUg5^J;͟*i\s`qY 鄀pk&z# ˆSN]%fNH%j!枥@7l Z h9r 0aVws:4 t؛։GE 4ЫA޲ލms&qe?6vJ` ~@wKy 7SY^%Zp?1,1<IENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/256x256/displaycal-profile-info.png0000644000076500000000000015311612647526527026046 0ustar devwheel00000000000000PNG  IHDR\rftEXtSoftwareAdobe ImageReadyqe<IDATxڬk̵q43kΡIĉcH$vıspbǑMHU*򣪄)R?@6UQ @)DTߚYkZz{溮w7%~o׏Lg/1?}-w߰j{׿SOca`xx?ﭜ㈮O)^SgӟpK6iy8vnϲ?ױ\_?'pNT<}nz;kzuMpvK.תhۍ?SO=Eg[a Sz\d9C^irxe't?ݾG}`Ot;N׋l̷3܃c1iZL`3/ۍ^kl,Nݞp<V5:{ÿcGM5nuZy3 1{Ĭx,~;lהo(CZn^c Hy :o=h+R#ݎ+y-qo/<94;luGp(pVɣr[AvG3?~p 75hr{v9&i㓪ܹ`+nŸݾۗ,7%=JZA#7EgY5\Ezu MdRr[L"e_28ozZ*SOG x>5)F6fŁQ܂Ȱ  f>y4_bbx:1 #Dx?^ _.fp~-r2mӱ5љP])E[~u{em؁lf gyK gfP"d^:. l9nsS}B]u I)\y]@ ,y> ̊żs<|dY~n0!|r}׳<2|oZ~b 1St6CR[! ym!7q prv  0xL=[wS6G'֝9c~6[]X@4`<9wq H;%neT 6U-М& 9qjȸEcE%Gϡr^|,?ǁ =Sc ` ,6eʿ22Kl]MΔQq#T+/,?XPAK528F wNZmW_"[˂|]q'y3c12(1M60KCi#{J)vL@;/ 0ܢ3hF`R.(%jSwBFwxe%L|D6gw-n]Oryr3D}jZW"B#|jv~.:b77EW`')+?@f׌2EXXKJ/Al 1 ;+.W#]_Գnۇ_yBZ45:d4V.  8%9.cUC/zՓ ls^}<8?G>Tԃ}Wn`zE6d#0sVzTN<35MJ$M%,0\6>e[z|/?&i8c\2 ~ Pd10K=ʼ58I ^c6*BĆB3˼z]P*5wE#gXE8 ]H~J/fs‡KJ>hK+ Zp]"xHZ_n|=`s"HއgLV{6n9KmѤE+K`% R>ڥ@:W)EآE:kX#w ƀ`pjm[7vR7Q,tC6EE0(ߣOjAavM[R2̛uQ0hLBxvOۓ<~E=h>w?cQ8$xQʰפ3PZ`7-ͅoՔOR[}\)A-$IjȇiȊA6y6%(. mIKƓlkRdkF|-߲_`V:U4l0 } (H BQ[ HH `hZZb$`_ faEŝ{k-G+nZU/reS8-Lw.skmÜRVq^2R*$uSQR4 A4(/rC( OE.6UbhɽEu:6^N=z'C Jy (kh#2b#P2{eYFt[v 5Iy>}k`%-Ha{9o>OpȔŪ@xݓa87^م֚*juq}E4-%:rbcBNNKQzk*9hȡd룥(KNvJj)(,:8K{isj(|I08uqm{aŷ)y*q5,-]jY0e!M$2Ҏߗ*\D_pRSZZty`Xf>5"S<-U@Z&MKqo^($Ҫ)x_/ Ԙr_DU0Av\(ŠHK?8 * (V+#_7-i&롉羙078}-J5nh$h:~cbM^`3J-(]8H‹ )\rpq@tHe&^x;Buc:wkYwZ&2ŨHj,u~.iJ3r5tL\*!Gu{(ǚ]QX3^ӏPQrߠ$JIMtr$ށ?Mj9FUL]݋(#V.h<MIf`s䲫mi!.?) ^V`pl܊|0VP 4@<>zM7QRtalxCBe׊pRYQ)f汰EXZGǩ 5j5ϖ4 DrG=x\kd+y"G߂eG,D@fS3tJgT CO!0Z˝ߜ PU=(كc }eJYJo- Mw04Ž ~ʲl:ҷ ,xڧ 7e ,ଷҌ /AE4`]Lm AiYh? .EK0}4&jhH yarKhː^ Mf8ˁႵсh{7\3oGg؈k gSo^zu]|7oYL"MʻDg,phx3O9:\ l!c"=@V7Z̠*90$i `Gt|1]mߡA% "0,*\OYjb_*T|l.6Qv"Zu=2l̎KTdns₽Ue[y4 IfrA^ۯފTl!=YgK[IJ.1Թk͂^/o%Le {5 izBТ,07 )%hƤP-,5(1Rop Kr4նpEᚳjVqؕȍ6td Xr!{, &ܱ5.m˗iIftRx)'ךtVA_P@ߩ{$p9!5xy5$>vG{SR.oP|6 &*x?5hIrmFMI f1ew1 Ux,خ)V8jhS8.X{ BVM- 7vca"J_ՋEQjM Z+lP-2G CR ĭ"k6'Yũ9 d٣{5rjSU+Nno/.S2^J#nl0# +UnM+llPZpzK |w+ڒf)Z,s1=Bsv&ݻbg<#wKnUdk2]0E3Kn8@DCPxB|7 zJTôC2u^` `4I ED_Aװ$?B2|-zB+- c!pys}5P4vS ɟeRQi#`aEvwy1KbE2[Qgٕs̥n_A%|;>Ժo."lGv/o 'n:s:A;=I^f,t7>OP"Fd3y證&pc,v6cr@ң)Y.f0}˶t^~S<h8U8#Tzakg|3aJD) j$G&("Fd$O?:>3@p e뇓Ha(+FP =r 3t㙝'Z෤5t!y^}Ͳ48G|Q"BY|Vq =.y[;5JBct 'zNQZxP k1t4JX L({5z` Gh՗eijmIa hwӹDs*%˟b lisE5jk4˕`o7ʭ⅙9tb?"ߔov-2-pO޷0.  wOMFlV\DXFِڣx6 ez ,-77NIi(z8谰S*G7!ESkhɯ-3pB'iHK7EFc#ZecF}zMXz"Vq|TL|m'rVnM ĩ6B{G1T }_+īBmQ \,j;M>JǬDЛYsJJvE)6̓^Ds{qDɰU 3 IAqLCճ~h+UEH~pI꧳861ф}"Tڊu2+\pTlnb V4;Dz)Sp}y#0Cf@'AݽHJ97 3 J y&=4LT's9UXkv'O,#L >-0LJia{{vॾ?{o,t*NTvZ\diAjid2r0ہlR)Oй;fB+XM֩Cesj>n+2W/B5 鶬>l͢!E5f:úd7'Bݑ`Æ4(z lD J%+8߰#x VJE>9Se3Z)Bn.@Y8E`Nv WAmv ǭfE< U D=Zha?ۏ< } />Cu_F?bИ#%ԗWW6LF6UTzLW14T, yxŶdNҼAHwY;SSpRd\jTFB ?o_}2Em0B˶ <2/V2+i\YhxS3WeBlc NJ:l6m ~cȄ,Sw~.J %Adq2Lb4FZ$ƈ4" q #pKti.(CRYr:BFu'4ػsvS gh@uq2z\@\l!څ>pŸI@fZ#im>AE A@ա*e& dBn*抦Ȅ0uTmw%2/!_6X!kX/➊ DI›%%PIkeg u Ov*iUThkP NYr#CZU5A0(q;G;܈GnhNΨOQ׀IkQӜB4UA5?ZC=}4}\X*R^(J:|ܬk6C ĩ QNL[%QhB>81zHBZ[:<6֛ ,hUҞϳm L/J?Lg"<~x[d'8v~],|tTv)iǰVrkp4dLl!6YhHstÜ%{oɠrAB_tlAL\M͓pVX̹w=SUN*@,iuA#QAgazĉ:nD8SݦRL{/eۓKp-X{V6<>=[,wUCBZ:,|4T&NgD#Վ7az> s2', AFX~ՖhZ ,#[T}tzK|裮Iu[T0P3{Ll0L"Z[RJ0^ ;jJy*S̀9/ycx%mBJGP)\K)%MԑMk[T Tsӵ'HaB@̲˭THZCqىPUͥ,(ơRf aLΧ0gщ9AgQ= \4DZɅ/(~G1Xr"nJM{`fyҎ$JѸbRk,3>|`_xn*9y2xt "0ف|trZ=)ʼI@f\8OoQo+&dfot^ Ǿc-G1)(Jc Lxta*QXpoV9*oͅfr:A Durchf0-ANjٰߧƉ]s{Ti 4hw#QJ!"U3E<"\ g77HKeh~Uk+%ΰ(ƶΐ Ys /ON08XP7BcL_o.NjBU,a4\+ibp}̈G&M٤1yնeJI^9M!Ж!o&#=Z\r^D 8ƈI1 TD5̼u9\<4᪚&^iMt1-–%SCt. x`@ŀZpzk^MP㦔CFHs-%U꠬}HHfe2ab4R:!)I a~Hd=Xl 3 e= JPGTmnGEHXpÇOcDz'ܸB ؒ =冤5.j?`U E+HDu<M0]9LAbS}[yx席xYq Jx^Pغ%ʍ@Z9 \qA^m)AGtEN*HkH kLD#3g&CRJ)R/DU%L$FmHY~v>;/7c8p/ZFQ9 Ik;'DrDT~(Gj\AoX&N%"SRd:Wli>A8xk;LD' 3x|ݗ96wh3"D -5XeEO K)JNhFOөC+2ܞ#=߹X%9 \2CmWR$G4(:DWk2R$Lh|R|M22“? Jrzy"=۲Tq6?Fj-<= WUܙ\;#vĖY"4J::`bB1!Y9h9RUQw5u) Z꺲8Kc+38E'HJSB7h/ai U-._>6ߜGbٲ1׀ʮ AZ\D)@~&3@C:z*mM}D'#WjG Ңq:͢@늍C[?z Hoi8n!Q&:#zG|i>Cm7FY.~-QU';bkH'Tj8)xGV楟'/a&4ԗ|p0fcƁoHZ9l "-.faVE; kõ$$1>VĔxoA/er)@f.Vo܍~ꉷ -Mr,i,AJGJr(s`00 9sفS"e{ Llf swq ,]ܶO=}3v9[+ ݚ mPwUtB5"Gܗ] F F[]KWs5J '.`3~+?Wi{ 0\ہ'((UX@!y[q$ t>j;k] Oz5C#H9K*}Ll1>uc%P4hL" s(Ҵ[/3fzk8leK~zof&5ѱۧ؋ ̹\Z0 y0/}dY kn9DQV,8kz"M;_g^J;L~:Y)Aja8t_ +s;Ԫ q%!JB M vj %D =ړ|ۊԄ5-Vc~`Jdbֻ?BupȇT|' $M$X(jsn'aFa!V/E\"]1 ˯j3.#8_eāA`8OEl𺏕NrfV-4`0R ñ>znL jhx(RE wXhYVW ćJFo^=ckRN×Q4/Bb&ĝ LJ#bi6E37tvn-yz :EDo-kl@[urNfBut6`)v6 ݤ;_ƔedE2ڣetd`%[_Q 3W`hf H(8Jmr"mFs& vN]>-J'[Ik|7q.@&?׊+t`f=#[bd"ru?HF֎ +#Z4!DWK C@L^vu'H8 \9KS%֕`&_֝+8W~uBo3ԷlK&Z)N_T*;`7m#Ywd ښa>AOewpꋟלM*  M { >h=1uSqT^(Z/CR]Ud뿦*E9QV T D?f*\aCI=ϓv`|Q-JzbM=Ⱶh;M5Ћ hFàuYByA2nFV$}! f橳G7'[2 4ʀx>xQ 1w-l+EA@N_M!O?n=p2Hu80&B!"i/\ƑU,I̱N+(')ΓTc[K7W2N6m{sA}HxF bi$T>J;6AOS*` +\_o~5ٷ}% 7ŧq2˰ @Jߕx둨L]'0 _Wdձam\:]XAꪵ d]&Ji,"ͬJfptʔRo~h,vq"',WT0Q1,gW#Q DD_ڬ_H]|sFٟ"k,Y(P^?6Z:"syYcuxɻ[#8UЖ.&e1a\c˔+U%@f%=ऊN<-CxZscT Ws[v#!z[lvIК:%`pwkx*iۯLE)T̓=EفtO\] &Sⶎ%%Niq1^gi1&oݍ^Xh 1 :ah{ACD8~j Q܆796 {ypZSĩh-Oק1?EGW' `S`ꚫhz@.Hks ' S1߸0$Zblu0F((Fôz*Э'33=pד:jW\Q_-ڸݭ-)WMNTLT梁-ƿ:hbew'av>d?^@?Ng(;k>a˅GȢp$% Cc'Zn4 Oz7Fڬ׫{$ 0է'!iyz(/mɨB{&kY$}us}T ߸572IΩ2kIie ! G6}#0n#o |c6g7~$U';gH&Zi]-I* M߽U+ٻ/ ङ4jr`]?Φ$ܚ.eXUZ q.dn$ʘ-0rx¹|`3i -@ QI;gNYwssۿ0e10r}N)g 8IsKt['Lkm;o^ρ6`]'{  ^m"?scooݾޏYt#"gn3^g6H7AR{H /ȂW^0kɩ$Xd٨xvQ>mc+sZY,@3,]GN4Dx2v&ߪe_2gdZ()*%cr|YauV.K?@hitTgPX»4nar\@ޏγS  xN ;^ջ?)˶:&s3U (C6s*SG@|ˎSITP !@߅0俈9Ҧb[m1Spd46$AP-PO<@Ř$ EXןQ! v;D'5)˿ϝ?\wcAKRypu_KAkw #ܜRվ5D4\a.THTm)(7`n=&͎JL=c2mYAt=7L$,B1YZF^7.pO8U<  Qlǽ% VJvC+u~0TtL)u}'^B0ƫ|Jɼ<\׷1o Ѷ^44l䨽_rO-iΞȁ:)$В(+D [DDGn55 ywɣm G2g3 XK?w`danD>2E-k ;,FH ZQYZ;>Fn}К%:[@Y 1#(T:!V<$d |້^rgF;y켱`w?]s[p' ,@۩7+l*G6[YEjG0y䲭0 [j`ЁpgwߗV|'g@"f1~nG=Ô^ c\x,D5҄,9ѷ3hWDΫyWJ Y`?HXǞ`R}?9.`2>{"^ߍ=#׸LC Y?IdS1bXjnsVo  Tu7v]]0)(3;xZ| ʄdi5 ]RsP˘b3BRAc71 h2p\A%?^P %xixAco7|%% 9T>'w=syu?`I/$tE}=wYg? p3#!#x_Kߣd퉫w`z3LgMhPU#CEU8cNU`k cgUs6k|vόӻP`}ݤeo=HzTh6gM2/d9O>+"`fuŧ})OZ?>fznwc`O?'Z+o'~?ǜ-x0~22?PǷ9^b^Ewwԟ!)*Moӆ *O=442FυFb?gZj!< m/#&rݟa~ԸbZCxJA_LcU9lE?qџsItv]5o!0JQiz7Tdv8 ~OP#؇jYϞE0ϣ099گE̕! %~}:B,z" #ԳDNC'\/b&&1wobi̅{`D~"!mlݏ 0]4"ON-f6Fs(TDJ 9XX&ƎI(t и뽡 >dXLzH;ݶ|~Ⴤ[)nA p&ICqvLBdX<; ^yRq0Y /6:N˃!Z5'C+@zlR=prM7Yg2?CįbA>;8nΰX{xc_n%xd {`Jξ@1 YK=hHL_R˓@ O>!ܯpNӻ(bBGn>,:(``u& pR0H \,WT9H'QRXD JzkOIJD+0Q܁JidK%PqRM("r@9nГO#o/:\;_D\;|O ๑_nCO a>v ]FM?ˀ cB9 ;i?DFXjaa[CwLf@2TNy6҃x{0T)E=Ia1Q'7!3O1Yl]Q޽$ϴIn-,:uܸ翰-ХFƜǒ{ Y0"'C' s[# eJi?&q/*o@@GAL$:>4kH#\F?akP q25 L'w<ljB׎%E58x(jh SWb_.V``FB0ESĝݸ z@sl7왛xpˎ>=E BNJPtsόG(grMz3d~i QЯ8^u:2R3,Ό2$s.(BÞ=iy3ݟ;ϨqKڀ룽{~׉>XLa\bM^S7"ؚ8jze-q(,s+a [)fN6R$Y2,Ff96WJ#/"Ж*c?5V$BۻMnP~?>wܪ+s^~ Oo_e 'A};,;:~*jjA+S52ޙ)5zmbAiRçgDz[wIMTܴhEi#h{̼V`.hn6`D -;HAMq= O 7gIvZ##JOFcW}3t0}<`~ޤ3T G.M@}GW_X{C6%S D߸<,!Q9bߌY.Ԛ~qܖI%Y6LF.׉M1J&@=XxRyc4"fkJjvËGVu:`kv;5w7~/Ƈ("{D<5{8zݯ~$`>ԧ>9:#6hXZO]駟O3 l5煗'HEuQI%;"fu,3Zre{U @.-{/%z}ODKm_|ns^<v_iLyoL:&%wW/#* 5$ rz\!i1應yȓpi!E}% -@u >M` ">R0h9iqfO%lRN@uc96d&qj}lp29+ym0yr}oKpC1Vμڔm*/$|;wx.MãdNq<E./@*V&'$قY '(܀hϦZJ̛yo; l8өj+e#7jHW4se04JJӨz슥&1l)Jk l,S+^k]sL,0M]e0mEc@GgQfa9%NRz1}[]4]#n^s daP͠)n{;dK50T{ `еgnMr.A`gJߋÃgr <,r\3MD ާ^J # 4@6{硟m긎py1N5L;B![+=3F?A9(F$L6ZQF>[m-CET|8huqbpгH-i<>6q{Η9)=y))+ =w AqN,ҟǒX(;@ A>i,-\/ -X:y4wMjc`mNn6u{ !g-BֲuFnj5s=9>m$ZZ'!)+"f2XRJ!kIAwH)`݃V}۶-ϗr#O~/9}_2'HXln;rgiG8yuxϝ8,w ӐHF1~ Fbv %2 HR_w]Cijl]V.CTVjܭG)8B2@00̈zXZLd pnsq%ﲁT{4g1KM)6XeGGUaJ:q?QJN۵yc{?Xs bO`Z0lx9 Ѻ+ޛP{cG sr,|c,, ~~w+|ڟH2W%~ȁ뼗Bŝd97p*dV =תP[(N)uMY jU6p-9Acݺh: `.{=i,] = * r ='zkb:42.Co{8!kW@}Av_0S 80SY@$ݟ> d_3訾)5/ y:sW' *˰Ύ^@:!̃Ƨ}@soϣ\fTpgߗ6X4 a+C)S&"k:",yip݂(Q#1K_N?s۴35)m46K9E,p-N#{dA-}k@u%@WޔJiI]_w'w͹o=?Hoi>]D_13PQ]oF}|6%F cL&2z/4Q؟I[˝~efx3nU%N c(/KJJ"mh'楳>YXv~cd_ 5 _Oixm{IpD,xp  B>뜸"YaFR6e # ~gIp|͸+@~&AH-HT(ψ6( %隚4KX)j96.xE s3R[Vi}Ta1\8!ntMSǐE012NY@Pqvk!69G_sonF\<  _F AFC*B "9P D @|I#74m:kg &? 4\'@^5Ur){|--hf̃f`|#Sgurc}߿-^BoA60w:pb(d~+  }4Z}煯Q)o^~nџb w@z<n֝n 9pmIa0*52@CQƽ7eFPu-yRnVt.J8\\jЇɪӼGٕơ nvu&X_[-{tz\ ̀/=P8b>> "u PR3_'_ǂHgÑ Դ2AZ9=fI}33OZP*|[ҲP %4+37؁uDT`$\֋NƞOpx=.R%xf\1 JjiMR! ȓHw0 [`1,etǠb]?!` @@B< Peό78%@N L|;_ |__C `.CGo#(Lm)6o%?jp%SsC3ɀ v FkRDE#@)D|OdFjR9bpE6ܑa\(=[j5"ifZ'CpGM08 lá 0tU!L+Rq?5W}|IV_*7(¿ #V@P4A?4^Σdα,ʏ|nI͸ /S0Llasb_d=Ļ҈"ʾ4Oc 0\GEaKe.y4T 0\4^(v| {?ro#O~~n|HxY7E{ Hwrc[NBؕ9]`L  LFFU凂XkB;i4 9+=BԆc.Oś=tGeڋU@bcRxi?7/"ys̄!2^_Bf' e D!H3aLaO\7wIFz]? (X@ Aܵ[g^uggf0κKzFЭ2v7TZajkR|46 ґL%31o|R4Z. =, t诼{^R]AjDem>/z^3ׅ΅@]+tK?/y#L;`">w/ܾ ؆Hl2f{0?J/ bJgNt yՁneHo/n5c y?FW+Jw ׏w< F7$; ]`O`/KU{aMK /O2N;3keLw蒟傢`lwb(.]s0d@sͤ PQ"]lgpYʹuN;I]>F*ЗnF&k}^ΈͅRc[` dc?ŬAN fw^`6X^fyc]4f <'>'0kȜag/"-S=U ;B/kߌG}YߜƇen*m íp::"RѴXzMARWĕVJh lm~/uS]GڐI0&u־x5|{߱K;sZytx˙A60Bz[}~7r#8v%GgcA dYax*XӔk,AkxJ4 { >4C9lqPbh?oC aR[!8'ޟKf:v85UAgɷ좟531*Vi%nj 8vZvr# nb| [!K|IoCx (G x)]&cgv J;ei\6(fpÛFJգyݘ }@lֶ ?֚]{ߣ '{:qǼ,R'Ԣ _w&p+;&F0Ɣ{i.4-_ti*,t- ~n{ w v}}f?0C@Ϫ'/XF?J]akkb/צ TTA DbhI 8!%4UmHRZRH*i&jB )}]pK*9;3{{sg9sޙykg=ύՀr[)kkF84ehl4<=XXڲI0m4K{!lSZ(Rg@3JHG54cZdM<#*/7Zh㇯1jTTNC(>qPtJ B ¿O^373G_{a|ԇa,qãCXOg Pe U9K6j,g]MMkUƯ`ɒ9L4 u٥Δ߾ȒJ2Y+5Zw1 G:ZA?'o$_W*x8_©x֌s%D1>M73U_x+?p"\Kg0ˀ`p EEB u4S1usq\LZUOGkpUUiBVp xݿ[AպLl` ),+YCfA7~|ػET"Mg+# f\75 ҋ0 !.js!FfR}'R&A d @"ʨ3Ⱦ!ls/Gy׉pcNwn+a~)W D$&V  \.Yy;Tl rqh@ћ@0K`K#!c*Pv0#0c7Sr}$|0\o"Yq)j c]oexS}()6V{$ՃSzF F;w{/2)X斜=H;RkO$vO\@QzEÏ|ꟻeO?@ǂk#^eg` ?jkesV_7M^' c0c;eػפ0P#oofS|-l"xsMR W+5~V9xQ` <dndJT5 7I+a4TJ,Zj4rPӐJu78> xuȃ򣋟y ~!z} Ooti؜1h. gF0)awe¬U&G]h .$rkN6ە-_"M?\rs-s% {e@uب6n O p`f-H zSr#PB([T ; WF"(CE\hD&Td3>l*c~6Mc1uD?Y236οQokhjLb%zRwɨ9N@E?JW+05M6QDY:\GR?| *^OEH,-68ZL 9Xى<@`IHOnZ\')c?F􅚰5hAHp ]\a10bC~yG շfn$$NPy8Njڟnt߸wmF;}g_Xr' @A|Kp }l%r& @VҾ/¯77|1NzsZ(=}fo5'&λtr }BiA'p/Ka-Dy?1pS?aCui=XHl:PZ, W|v=-{LI_Ce~zSj /e#ǡtOX%MXU2a"ci p xp[З̠?fbY3nc74^% c|q8Ƣ5ЙxЏOqQ^ʅF ೔b 1ҜT 癚>M$.XLN_i>AO_"uH@3 ?攖f ?GvsMv{:nXe}2Rz=5oǼBs$w~6O=RM`38@Y  xc }4%ďK?fV4Xȗc_&~& 0߉fl]LvNg0Ͳ䎛káBKq@Q4(G~سCPl$R\_!qxzoY zȝ“/JzIE~򻺆 V,0Е3@@ =F>[NNyl`c\ ,;c<=ۛ{!T<a),N׫=dۇsKK/z[`OEժKE0U Mu;([2!r쾬'Pt#ZAP]qZ`dSzW?Bi0+?dd \y"q}יoFS@u㼤J ׭w gHd6B'Iw+ 8\~6@{u=02lH$~x? z(^ ?=! !AAa^Kc. sR6 MQ!gZSO@HQ_>k<1lyVU\EvrN! %@NO`c2Pnn:WZvqm%$2:NgI1DNwq/؂OyA)wsEJ!*9uC̝G\dTp"\^s4$ƎI{v5WxW_ѧ1 #l=]<.Pt3n1"@`gm?UT1&N0/0?nKvy5$`:Zxɷ;2ig}.Vdss*zނ#VYp]/'d }j]'*y0Q"Jgew0gZ F3 *E_S_=@ [S:Mrs!^QDZА?@c`Oз9,V=e*lOo(鞜#kUf]ϗy{W~u_Qث5N_P[3x. kd?tV;F8q $-o.Bs=tT_i=[WMoF@3 Chقm=cO k=)Z0[Y:s[ |JknA[zd<N}N5S, Mqo~;Li!c|48fGMA cOFc_n8b :v6b֌;Ns&-ys "*T`k G(\OZ-.85cTRX*(4WbL3~Ð^?e3Bׂ'7SB[<@'Pa9Bx\hBtѹ`Q#)U˗T9cHC/#{5~ЍF;~TA}??ӗ+;'[$Tv^z4 0 =ff RzOj r_ĻF}qR>I?baBq~x'>UgUzF@uHǞU2`:œŒu֣HCs;l;[>P[<_YKBj >`l Hj+mڼ=@7e0b&Ňٺ>&, H8=b c>~ aaYdt"5a3wRKLlj 8V4[0A"j?cWݽ;'⭳!o9G??NI9A&4O]opKT7|Mi.M8MM)`AW0JIcjfcf9 ?!ų咓L+`W}.W17<@IT`It[`,s9N¯W%LU* |%"(UR6C|oб88ҷ 5[xn#Yxܺ ]r`c-~ @B4$-L"NˢoM Wd\0GZ%cԉ:ly2WLؓ,BӉB!˂ŮOB݀NDɞ{ewǀEޛ|O|VMhclixRNuЋ"pbNiK5Џ rKu8/ҋP8oEo= 6笄˺*0Ҵ j9W@D$mX%U lB(lP Qc.K<|bɁpN` ?sD|I7 e|<Tfs0B^qm=g&a yq~^l&޲ך2dUxhkQR;a\1QOY`P-F~I˲$Q T _2Gj(8KE_-0CHCiYv.bU/uKSmuQ18v1*v]*uV1֩CHRy ȁa`!-,=5*֩O οw=ʀ{΢S]9Cc,V/ՉSnxQX|@- c˶˽{",2]X';"w R; J\'ǿeQd/8*lJi?MjCORF UC#BkqiI.sԟyζzF3*$||mUA|7@lF[Q 7IMY2OLU N4"Jex)&ַTSjgv`u"'U)[ʨˑ> hx7 |z7m>}.v-KiD-X8Fk~_ (k]@@@%l?%HLHDzARXu;i7?rGo?^uOwV2Ź+x1QSl͎P3s1p+ uA㋷Nܫ`kr_ #et?X=`iΛ)PLmInּ0cBFR!9 JLb F5LGڨi,D2b兝X"q7SNzϟ4y(?|O{z,۵J*u߉[\,guZ2&9oQ|Um{;K}?>Mz\}-=3mC>Qw]ZC)wn?4`i3Vzf@1?ph`jNIXK2kAӇtI u9X4?S<>p]o!-Ԥ;!+?|=T97T Zɧi"j11{4IXJՓH8M* Cd-B(4a PɑxuW\"?!iy4% Ҭ6$8&W(,4 LshvF0nAmWũ8$DR]ɨ`bk*ۋJi?w9sd0YqRg*tt+0=YNl`?e'n>J <}r}Y7:Ch3ii~F^W`}Y |Ց8:HB,ߔD{D4_w&D uJƴqOtL@X-g*0fyudbGBr`8{2N]SL#\z٨mY$NQP"TP (Ur@"Y@{4N !U4(ߜW@ z<22A oفa&3g|MAY;'ߗ81H=).5򔩛ܣyz"B3(xWv"lu?AR*CfPe$41FGeҽOJjۤt_[G~ڸRᡏ(ۋnUyסq__ S;bq͂(dHB6=0"HYWt({Mt@< Op7&TsЀSID/?w>1G[";M)W37^pW;άy?c2I 5NjO%<忻zp7HS ;]RXOeZ'<V3r47sx޹/qeɟZ:Ne|^/-֍jxz}m-h|.ÈL@:6S5VGޱ"])=k/z1T=Uֿ#^ S'I?!rE;/vRbY|P*V>z u|W QK<INjVwugMc#k^~.;ros~"gymlLFhװCKc ?ĒLf@zgY\_/61thcwZuO$]خ7zܹ؟ D]A58*tı<7 H]@Xy݀\ͱIܴ%DiGbAT88ogN#9I[hy"Dt"fKATjxDAmy#?o2Yz0HAh$.+(T]LVd_ix1keB (x'[+pTCJzДX)˽IOFcS GD[ ɩS_BP ÜK&=;UfO(ʉPU27rTGZAgS&-:Gw9#~(H* yI@u.&=ؐ1n^p@hx ]6:6A#@s\kB!ώ@l$VD;=xTej);M𴠻{"B8N(أ 2ٙDFxQdAHe uH= ,?b`OǏc|z8'rz| R]'J'-T4,~^лOZA!h.Sbv+N2eK%.-h*&8jq A !#5" % 6}o?{?Z\S:v[ۯija;uTlm) U%bdV$PAjQJ?TH\~ 11g}PBR-|L?*>^ޓHO^ Y$NZ0nUdeF+Lkn_OutN($8WҞF˷NS,tM&AO`_:jL!0*F$\&uw|W=Kvr-s~V!ݞo*SwT8O#Xq01)9Br@H鹌ݿ%6K hp  :ڽdEQ.Ƀ{9@7^8B%[ Jd=#uS mq' 4礧_>G73&nx+9L}n1I;-]p<˗ 'PIEh`{E`T}6th/v@ܰs_$8\אЊ" wfMe=p5 >Lj MT>,?//倫oRԆ7ݓ," rD5Vm8t ksWۃF!o=g\޼[,kG&HqඟvH$I:mJޏ`cU;t?rajm0g R;Yھ$ - > 9p-S @hrvC/4m6R[Xw,/ [A"{5}Z2dFJ̜Hyd .?އq5(Кw5n|hq-Ƅ) j?7ɉʐ]h#?jV,Xd6߬PGXظW aqcf;:,[qLJC[ebPW:}<~\9 ^-k]%"ܩCZ]8^ANO.񋲼d5`(KQȁU8B6̠WY9͇l >U`wzAV}F 0LZnA[Fzz Pg9|v?UNetzʾ}q[B]~t" }t 7")avK,q< H"hnx;yhsN=,wxLJ . ٔ$d~ێ 6[ڥͲ+ * xk@A%p =\0LANA y>6R᧽RU7Yu&.3bw2vy}8Jj,v~]CI1'wp_tcEe{u@HW4Rsw#0!)CX?k aBD cACmNc@A5mDfEZd|7T"œrwk&8+A<.5.tHB1HHHfG2F׺J=-RFQ$דL |;y` B"_w߾OFM>->cq6lF]]ʽ9MTR8Y.OSp:^8>}痺רXuya:mFWҍ xAv٘,L?XD4 9LlK7S9y14^c9$<.JEJ0R\R*=A< zuwp2*;q S? C"ܱ+_^{ro-ƏhS57ؙ*0dk.+/|w~9~GcsZ||'^B4\9Ei׎}o_?go1ʯ/%o`nvjrI6t 9cbK84,heʣJ-H =ݞߔ \*P4~|TifB!lgo7Br=a&؎ o09hE`)Bj~h<ϟHIWjB4<UX9lD1Fɫ::N!pޛBk},+ ?wP﯅$~ ZZ u-( u_lF~þk~w\{-4õ`LтϋbpMNRP Č 2[ ^BA$ )>o=#yu6ۉ9!k>D)8uzm>סilhi<C^׮ 0DTyVp%[5ca|MOcZ|vH):5qg 7 G"sشwu?9X34lp-bifjiI\L Q_;eV) 9vk=L* h3 !4: ~Pm\/֎4.*$ڑ,[%!h $~!;@(jE=HAS.ĔG{);[FJMݬosئHABsuEI""KEb&@2sO"Ex8Eاpጴ$ ?~Ez9W\y6`](}dѵ}# a2͜"< :#ԳSO JʫV ᗂXq̷!Nߟw%rg6-DŽO@wjQz6E4J5;i 9 I ӝ;+;E< vw:B,K4J)y@),%|c^o:>L7-5$Ο2%f`$LS "ԥD9[t}3-I2@ B\đbT;mk;jB 4Pڜ$rjX&ū+SuKu{M(Hx&nm1{ٌ6Da ?KP1A6= M;K+ZC(yxN\Q2',iFރntl\` -I=vj ܷk~,}\nPbvZp4}+S,zkU~@_Jl5 j0nmһhrj?l77ue(daFZzOϑ),GCA^29E.qd.͒ޱ_5vzT*sѻ)'-5uTb"=XaԋbriyTxк+?I@~XY(V]sd_$pXP00DԊB5z(]4!5)M /z#%O}1߽Y .) r<c,B "^T2\K)$]Y6)6o!yz0.~VAEEj~ϨuZL.AI0i 8xqCGhNY~ tH|t@X{*EAZp}i :Epo:Nȇ\J b> Tu7Nj&L9((j 3OUuX'D{vyjn=Z?֏!O9@xn@r;WwY@. 8Đ{/G/%pl۱/GT9L`e4Y(ճn+YPǎLvTK@_Ջ7}LyaxwU䅵c]*ۅE^s P PRPCI qr"ڽPqVi,@јYYED%C\PjZXg`O)$nƏE 6 Dyek1GE#_ /|qeڑhQTj(AgԿV2YּJFG %z0 bf/7rSGь@J@ J-B%.A]B(H%o{AX2 $!sPLAw$ hE_w-녆PCtp AjF (m|td2XFNG, N9c˪Gۗ`ڊIf3F=P+/ 覵WXؐ{kuW>BegCE!M_dN$(*B \Y嗞C5>ӌR!9f?*os *2 …t3"ik1)>dV$L90ZG\$aC$r] @ ߎzՁbҹV䙄8\0\#)>y-^eWz.M5f($U$+!VRb-Vu*bO֘fѹ.Ȧ8A@w v3me߻RmH]:Pi Frʣ%KjxyVo;ޏu)4vӄhKpYifE$zg*R?:h3& @ `Taj 3Kڝi=D/@ .c(Xz(Nq2wim u\LG\92{1 ҕc(8 h 4~T^ǎ6^؉yQDmC=Jېل\&U*.ՂfT1Qe;cxv_ t#CBhҳD |1-h@{x49ȊapH7#y,xn 7̀:R-ߦx;=udXUl05<9:)lc^>vSХz`ε`ZnJcPial7[1Tc$zUk7`csW1RT9 oH8yy)*5{zȁH( I}< 5xr"-hmfy6ơ{90Fܵ-rbqYɾD@ı-9@Z4ҋpj®b${0˴arg[qqjkL{XYmK~LbgIzۊSy\͋tׂBXHO 2;Ac l)~c . \ɑ ,|b<1ժfIPn|?W|.\>n_#.Z=NMfbD[gTW񪼮Is/dOSVEY_x+:^ j_׈)]Sʵ"0 cy@Ӌ5+>OsS4g#-S(X7,Am}}S9-`CԺ r,dV U+_*<*tHd\w4 ҢLYAJ*;DF ֌Y4N`i8㛘1( PFQXm0$[4uX{SȽNCO–ȎU{/7_>)G4>@c@QѯvVwל((kX4Blp-z? 9;$o&GZx'ן3=ӹ m>dرjZ{V'-6iq`rjAdl!140O F:V.$Fhr] Ԧ]Ncke/E9.ZRy!xڌREYxzR l:|v0oɰkΤ1_B|3>ø)u>_kqJ$#Q-w5㣿 ojx ZZ^ ˆMO]U%7?H+3?5Kl6z]v2 J)c,_@9c_rE~qGZ}ffn8b I! A=4.:}bbdP|nr5?q9$n ] <"0F`сOY?]jmxj]L q#(AI$%Q#m+"6M" Z )(&4M~mыFNuٵ>x|X76΄ȰRsbDpfu/4XRգI+ta6&Uvg~3pGX;\٫C o.nDU$3$#DPZK6,VXeӼ zZˆy& h* !z _KO msԸXcuZHXP#+җ1-$;8OښgKZwiq .8׵wmk-R[Mu6 z:G6I0ZxCnv'#9 5tRjR0΃E &"\[屓]p*DCJֵzx;s6i[!*^*39-IXEZG7]G/>3ZrJ9-B Mq%Tچ T6wq- {C/x"y.h.'iu!Hf.t-h T%.8EϬF&yb Z6MQ5Ub9TFKX-O:.^7D6: 2,.~ x?osF{/w ꪠH y;QiQbgY0(v,~}}A(CSv X.44Q '@uxΖj[3n\(8sސ2ԹjcU)c0Qk_R,2cNP\ |\M\WR:Zh]]-k*j瓻r¦]0MeBBthKQqmݚڂ T[xM*x0 N~'wNúVI4tMC@Y A|f Wˠ,85MmDԖ+mU2֖jK:}3Bu.gH(O|(ͪҀevFdq)(Jq՚VNxH(#59J ~7&a%\iE\`܍A~R ^dsU|m=,:ضME>"h`/ rh%Ьqf-87P0:+PJHǴ cqU9b(EhQm8AҊ<{=&(ZVZLJpI"uj7FL&&Q~#{XY.Ui$ C( D>.<=blDAr@oe!JXmTn5'@V -c+ 6pu@(j# yH< !ۈb%AlD$t_ڼ V݌4Gu'GpHKu-$4`>tZDL @0/ll?WV+$䋕JٛG?.$QESX,W`u[66'85vIB^tavTv%bpޕ63Жl3-orY ztsX|A|=M(͍P陪ZcGn2xf*oDuarnbQ 6cM\C1]bj xV1ޭ^qy {Zuħ^KhW )3\< Z'r) Q$8i6!"\nr[خcF:w @5|*rT=uUex>vw~o`t DLSqU*ZnXe"=g..++lT7M # sd`iVI(+;tqHkK8~a~_29L>Ď<cӋW-j1[ղ=?y7 (O-zF8X[d5yo_URBye%$ӷ-6:!>+p vnax _[x. 2rf-D3kt;5qUt w?^ˋTyDc[ƂF9"k$s*Ki:%+q9}2>XG[gK N%_t?!l%$6^)W;꽦j֥0_+ȧ>I7ҫ_X JAXT[Y S!zɧ>Ѳ OkeV:g`u8_ڀrC9܆tB )h֘X֕N;U[Cd *QB3?jwu/gu7B}R D/ҺL[mw8"PhX+ V͙7qb|)^@]]ghש|i=" 5.I]8z4p5(]~'Ӯ}=K%@.Ka9jj1/eTC?\2MPӴp~@sozq!il="\bF@{Nh)G @rQ-$L%E.tNͲ+4/Z&AKU2)W}t_X]c ,73}#?mHł~ĉXYD0 b6y|,a^t?}Q#45ۃE&X\?i#W;@β5#Z+ BНUi.8LG1eb+MD76Iw%J gԉwpQD6>ikB5=~9J7r_k;}<BZaW(N@v3^B$A8%/񟏻_6t\0. v栾tHgM}N58w q3٤#8;RLIA5IAI*:J'c |C^e1O6tv&fT0Юt  gii]\qJ8A~f:Cѫў7NzvEH[.s}$?ގأ;k}s<02.['0ѩ<3܌PtO_c+ɔ[6QdKkwkMS@t54ͮk@ CHuh9F9(!X,iR)"k 4^"-Trhc䦅${ϏA 7·V+2ޙd=ߑҢ-0)Ja .Aw%E~L{?<"p'uVb4"#.L1QA :,lVbƍ35׬QYA6̺skA)(Z0Goӷ\Dq,Ҿ ' ي.FD!iJlm!wJUmɷ_/E%΋gZ*J[ 3FazK⸨$IBpeM" b&8rx%mf7fܲx\]c(oeM DQ`i%./п.XtNv$MDK_%C_$JJDm64|\d#PQ*t\ OP@4O4U]ZSIh!4,F-Jn~2U`އqkKAi}s.)ԄG9[?|2QvMͱh$.l kmt/_J3dC P|! aTI:p!#TxVP| >6eڈSc0'n@DSg26{`eGnGz撣Ű.v'zT> /*d́$Y!KC% oIdǚmhA4~t|R%J2SH;rǜꚈ8PjX?vDG]'A K ~^6iS@. QdWXJ"$fABn 9_h? 4( OL9{N^ #g3T 8o>%NI,hDiy74T\A*Uq))D zL?/ 7j VY%ȫ&,@+ɥvb+%%o&dRq; ʲiEXf~VbI ګ7Z#%{gd :|[nlI95˻PHP pЪmšzR2=Je~Pg4M.Kz:[Ť\-51p.{hBC`LOږ7ѧMpfYTR5B2YnWuJzEah6J3VL߀ERFVcW譥Nb!{сP(Ϲz@/.8\FXJP* r \Tu Rw)(AIqbn9.u$-ҐsFv1UF'[d M@XXX˃:s|׏ofUdȳwNd|)Q.Ъ0[ڃOEBQ{m߹Kp8༠I_U:p0R_c~XrQPMͩV%`0Ĩ[ ۑۄgϝH36:YZg'ݼљ%\N!3|PnHUL#`h=m8X)973#?x挳OPFd3:|5V_:JDA@PÑgJxoUfBѠH72.04P<p& !yF;DJJca >d-[ EWʷ8-)6AF;'2D2PTzb^.M=xoa bi*o"cm%⫆=ܳk2Lws%ǏL.4 Dn1j蘐ڴir *#55ȀUE~m6Ʀsk~툦?z35nkDFEe[}< B(%_Qpp^o^x˝"שFq ;Qx''6m\,0}nKx˥-]./~/?[~nom‚c;׫:wz"S^/ bkl;m}cF-`>l|xXt-^'6. ]amI?)8?n.d>XV {|z ǒUF~$'ԏt\V[EUh{ըџ5px/B6&PDZhx鿈O޸.7s{0#qډp"Qe)b[BL 3;7gd◺X9:'E1 sQsL,ޥ@x#q ߐ|H5 [pme\'>zZ %_qPܶ*~|i~$T~iG=!?7fE3#+ߩKْn&%_jG .w޼(=/Mc5ysK22= &4(=>ʀ-#`^y/lJ77Y«M-phuJ = }ool?HOF8a|p!Xef$)0aQSQ1y'Gw#'הZŶZ\9lT9&O A{~* tT+G sJin~K}mgxNzt`U@ZfJj!6mm# %[ N8q57.؊2[jXRN4zwer̊.3$vՑ &{ph6]~i߻۫hX>io m-¿-2^{gIm]nTeH(y&5i0X}T| Lh_^RqqQ6 J0Rl:,&`OֻSt[''Aօn=!I,+SD!-3ME팲{5Z8ٮ$@ t['JN VW"jh67&TWt1^g /iQhmlqV̄BvLNeΚWTZy\IScԦ(\7e/E`H\Igi ƣ'@ @O'1Ę Ɨ -, %At1o| -ЅU9ف 0rbi%fھ$J{1${!r*&|&w#*Os#ll.Ar `MȨʈ 'ϝf1lJH223NJ f WJ$qbihbIB 2(:szKUP{J;f PC 84$dTͶoO7I@7. UJ4o-#D%Q0e*ƇUr\Fbi謮q*WcuZT7_F>[: j(m,obsu@ɜUtZp+D-D !n_FUGe\X3Լt5hUؚ~l9)9}͵ıO↹*#@FA;a?_4 o٩3h{8(y `-:<"r v;"#+MB*Tuan^Mk(6瀁`0)&%Ap!7 ݔ)Ł=`gWk]TɎzz}̓Dm$үVSA ^UTHj^E\5MZjfӁ)`2J2XR=M ?x tZiE ֮3~C =Q,rO +M!=AORMLz4(BĂRgP,RYDd ,r"\!AZԕR@ Y"wQ8x+KAUf/BXr ]O~r mH2aˊ3*i$QZ:U$0MStF |oq4ۘWo@Y̲QLtҁBC|Q\ˆcxIf\Iэt0M4~9mx}-5Pu-yyHb8g3Ȇr*[sk-UmlhIOgS!\*U/*&A pqAQKu4JAƲHNpB:,Ӑ ki>&8)MC:נyBS.{X6d/QZ$f{+B`-7u $i)YC ! %E}bhxpJW'zO-n-$3K \,@[/.]B]n_b GJ%Gܞ0+$͝cl.,Bw ȼZUq,Yb 4W;{o  j",{5/I\ SCf*-ٞ5LulG/Uyt&_Q {z"Ku@ia@C׭s==]l]@ \moeT;Pcr'cA@L^t]~.rIXdeUNE=JMPTbu1+bٕb4g8Ag^up+ \of%'(dT՞t,QMxl`:xO&3}\.Ւ:ciUܬe;T@A3h?57a + @ MĪH,%+,1 e,"v:We]Z Lm| )~* G$4ZF(1}F< atH`wϒs=s@\$Qm%w/ XӀ㒸\SZ0>YgMM&YϜŒTwhEG<5\t@_uۣulR6 ]B`AK|s/PrMI,7UpȶR`vQŜhDWtG j!V$:G/D!w8IF)̰4j;bF=ik]eaN55rw&qdh+}L5Szp7YPkտ؉t2"Gx}bA"3Q-̻׌v@Hr#)&#@XJ\RpZddNU h9vZ[ |ٲۻկ`U 9a!ʆ]%URi}X TԐSI;1= =E`@sI!PY%ƂcaЂ_]3F-n(~6 (j`#V𪶃7d^ubJurB?Q挟FZ* U=.>XѰ.$%(t.G1WHO<|PJ؁ cYzd8dv)Hh*^p9:0UIT()솶"Vffaz-o#-]xIKLb``RV4*ĪqG')ɄBlP܆9i"^!IЗNL:fh^\B'`Krf oA3,knNO XYklap#%>t͵"-9%QN˞7ٲ TVZ%Ji$j0ugr>#)Е%0ƅh 4)NBHXKbu D 2/'xtz+0%*4i^@߭mQ &9;.@_A_Hhj(Bn&''2bNN m^0B0%5q5jqTDէ QT/ %Uqa>ϵ~fٻPH]d9{6`RW`g>GO~EFؑR5:Ǿu5،5Z~ӟn9Ԫ#D_tRyJeV 񽿾ʇCT#PJq]RNPϠ SSO0C6AU(nrcwլ/O:#qYr,|{yqJ`;(-TORNaV4`Z.yKV |ŔF'Zš:-nU\?@"CsJ,sb\BAy !މ [OޏR,., J6 K.pa&Y+みiLNXb\{clUEj`OF'O8An3a0ג` [#h=FG|suz՗u(hMܱ'U$0k \'aYpœ(K/2^}w.58Le >C lPkLƢN5,YH响V\IЋO OA^>܃pPZ۞DKkMbG/,HGnGQ-8RvԤՔ`J d-بn"mXdY$?r}1F ^2L> ܭZ84.NU( &qqEk~v[:㠼yV䶝~<ò)vRӶ9Zsr'Ak"o6#eE$͗Oi3VNjD 9\+j,=&|pDˀ,+DP*L./FPEy&PRTD<r@%6 ?R1 .\[V)M4[ `hںj3sPppU!uDގ`Uw(gtrK4`ڽ Q$,ْ'> <%`*98)7#)Nu jQ~¡>`\ nB_R<%OF`.{rƨc{̋?CQn@NG[Jɕ~_1::[ ג'ksX(ˡpp+VL=zrpB'eZ[ NQcPz}9Z/BDq)fg-cka?̉8 cF6Lc=s$[G\1 xIE; 4w77\ǿC2<6e2뛜WhtD:Se<8. a14J9-bK1r97^rvWˆ:AKcg.4 !.5e2a>i d֑Ugϩ$`1a(>|``JCLҖQV<үVjb`=Bm{@ m%n3ZCNҽ$N4Y譐sȀ?<-O{_1D*;M¡pUg~#<5K]hNEmњH09׆ J6\^)lHg/k8R!-O҃;b  A͉i=`QIn}=ϓ*QI/ p?}<H88`yl/w&'&#ڻ$)oM\BYm+d¦P0.]ROf" .,r$D>6<($Z%$ QZ={(&?sx+1T)ύ닦/ 9wꎘ"^Q\".`1p®iC7^5Q{`|h`2|XqG -4ipLF ?NxɧMi khIg~t]"kU^ eN$Z QteX!P#ڢyLPխRB~2pؠ88 g: 5$cJy vxY@,}x*5 ,ϲWa5 *J[gf(h ^"!( ?SZ3c{vʦnof6p#35Sd>V@t$gs+:"7'E"fRi$t{,lǩm`Q)'B.L' A}*'VgMjq!wަi聀@"j7:_O~ԖR:e<} y ]54,Q&+[-)򭪄Bm_77WJi_giRdx{Y`?RP80F"m x "$@axL*f+O)bƸH?kݼom CQd7qё}ي.ABuo՞| A6 "Xy5`a_&V@MѺ'Xvx~]PZ{v NA)LEK^-EXYjJ'AX:#lPʉ7Ef%gq%p(mkd߄?3 8/.^̈́gg W'eg*}ѳdk}G7GMCg*&b>3͗9ϭ2 ~cG!]J?h PA{lo!3,nf+#W`W4hħ'⡅%4'SI%{O%#)dHTf S//&W\k6|XS=NK< esyхPJxin iA{C#蛾AЎS^lvww7o߿۾ve<ڏ&, jDRv8!ГnZ jO3la߻Bj-itr[@NUDy|æ^ =KNN.}^12؋,]@@Ue\Q7ީD6;:M%Q8Trɹ<Ӭ-\bzQmFMP[4";҂=o=t߯گm?2~o#gC/[}ݎbqbS/3 4Y,bsDP1Fpg)Dz8@[EV'͉/CWJƚJX^F࿣˂Y;!Vײu$oeaxVܨ',dzu-0:t̾nwPIi bo3w xkڙ, 0N{IT?{ \|/ۉ/'oo*2gk۶EvioNWc>A@(+Rh|{;Q3}cd:fksVW?_ Hb?Aݫ`fJ W]`pGA>Ғ/ SR#`xx7 #m"ӃkC6Cd ^ЬtR{K9DB}rM%0h.@Rc'i z`~̛?k|nr_W~W/ ~6ٳ}x$﷋}m/LD`Qp}{3$H-# Y*ޫ6l@.m54y+s܃*/˞SPi@+$f(YBG2<[gA8FϬj P.UH! AvB5@b%-pl8 1546׻qooڶt_FG] GPݏp7݄ArۙؾM xuVbp% "!^Qp 5 }eM83Plh 2.6Cj!M'm $bcp} Oْ~U`,"rB)#;x <$|k#J@s:{ t]Њad5Zу28vN߀I?3.Apm_qor>~ u/zC?-1sdy=jEQb#]˧IZ %tN c$׆{H]" j * Χ q1:ie q;Tvb{$tgBunM^S4w(M;1|{Y3w'/O!*Ԑ*%(aSwi*//;~d O h-rvqcW+ȡ,kd LE`k@jY0W ji&J+!(M+Wzb_;0{6#IQ@K3<`Pcg}[o5j[@|YJ{w|&^`z{7ވ9W5'4<(i3aw' zi)2؈s!~ƜL(ѱ\}Kil!"?7/" bUcĩ$xV"S*!O7$s sJf\X0Ć ے\|axG~hՂ!F误~d-x³(YZ{Ò՛ofN-]<. L\2Eba8)-Ml's;0RPpv4c'ZyGZb3Z{=+,@ƾ[``& -,~[˴*'Mujm_ )I`{}}d q-K;!^:Lh; zg f%" QT#a.PS_=1}_ETw׻!4ФZNA`?9I S z]PDT}]hޖa0t"5t\4 (Yng *9[b2='rcӀ]~G#uxv4_G)aٛ{қT6fgRX:7JLuL į-\nƟUy?;cn4zvqݣGp&U,azL6=zuȍ!Ϻw]Vnþ}akd.XHa5 j+JP 왰#,V >v 6,VIn-8-BG:3$@H4E%TN$& O2zL.U|-x^I㏶Ϳᚢph Xj}.4֢lXoU1u#K l%-UhZK^)5#Br@b?A]P7TLrhY@Of=9̉;!]{) +8ݳM*Xq@u 'WD.'㐭`%k7WYQB߳'gr[mwޟa|hzGm./X܃''&[Jp[ Rv͛8 q3]yrIjCJO~HlG3tKI(՘0sQFtd]* e󓴖Mzf9JMU bWұ2P~ZڹI %`GjZ[Nz@*IĊEеz߾޵Ѣɯ 㭍L`?ذe  i;ono>NxAni (./'9jՓd`mGnص׽fm f&ƘVȽG,: X4 7 ՝UAI,6ЄtIom ݅@ݗ&x%Sqo"SƆ]۝cn2ʃWʁwm=n=~b#Ls <QUuZF!)I_TmsXgDzBuQU>ٷ#̢\C`Z^@PhHysK<m;)㓤8 Y "4Az/2g@A<׮DXxK: ZϚIc.oI`m ۶/Gzm3W<P{ǯ=+#B(j$9 r媾/G)1k/r kQ#qVhiK+ htQ) ql'BCySG_JZxR,g'K-d$Kv[B崖E[0pYUb_Kc yޟ2RNk? _+ ==|tCuߏmg?^O*hX0tNdj-|^JpOF+A`{V{Fp6:.ێOUZ$%jׁM@( + 6v }Ugy, }`tg@[.s2"6UQ5*F|%w]u{|BCi)2Ok W#_S*]^(9 oS]Nkយ@Ô`I[Kb"XSenܚ+"ݾ;2Ou|裛U+sɭ@[-Ȧ 'zrVJqU-X|@;]uMWݡWޭ592tfV/2(NQTGYubx-ַ57tzBoy@75Rv+3^o/SvU:aca5$qu` IaU5ǠGs)ދϞ{1" sXe甴͇"|iZ۴B,ܬ{]ꝢELΫ;1,'BfìlS~ހv@3 `[o' ,dYJc`'L:m/J3ԁn y&E/D1FS7H[4٦lԡxEYN|aq"vc6jH \ݤ(-,yLYO ^Lpj28j؋yDSj/>:Nl~ȋDw}pArzk?|HH{7|,Qto޴OnM j:yP~rlEI},mf+ʰF.N_\Q5?QXJ1GnKWYTLRK[76pG+\ČZ:XusjFE:q0YAz>3l>'!]@B;ZE ȃ]oh07 e VMF!~d {t2Ǜo+ E.%ѷg^P>[鈡v?%Ȯ NjӜ˵B:p8H70E.d(6X8h*+`9R@IJ1;֊WΒ3;2CrAmjLpRx0oqDg!A(|dv@Z<֚9ybyӟ}źh BpO^<7Sm(,-of| b 8Kjn_s$:M3"F|'>3rBe.z_D_ŀq#}')LIs9ˆv)m+WaQdb aJ&3(pQ?޲:C"wsv#gly)^u_->*Bl}B:(KŻvE#Mqd"#d pkW )Fgsn=5@ }|qtN8G_?7ɚŜWFFZ X<2+a*l+)ˮ0.a6Ӂ[;ض(7ʰGBZ .4Iz۵S¤As r ^sc#$hwhbZqæi/&͟4D^:z&aJT8q.*#v{9=zkkxIϗ!Y{ʁ0-bIKLSrP)Bc y,,]M47sԠRVW:=A-4Ffkc0?*D w'Ex ˎ :vOf,!2۾7I-23d8xA52$yc#4JVP9;<_&xX(-IfEosdGehZ.{<"Pq|_`o6g,` 3ZIL:.`]uϜ6F!S2?L٣ϢRp9a<(3Z=8v(рp&-C '(iAѱut4'D>cAoف'W۬n(آ0>xOn wln]<-c$"i28A~! G8|3{a@lqpnНD^h>4ӳKc&)#B"WhY)~Fwo.׳٭)t_ܓ]QꓡxꎃJ6`,5O@@5 'O[}5%a[ `S} /5(^qxB])O@$$ |$ZTMBjmEϏ3 ݍRa@QZ}REaeU<4l?$# K2U rߟ~2]nVW-ΐG&\T@֖)XGۭaAпXhv g[xOF'`YzH6)H{ !D7X4r@^2K<8=5 0};\Fo Nv–M 7]gg`f 'Otڽ_F,4|?`,z V  4}}r:ڼ̘0h1蔞e-*.NW_AugRT^)tk;D>W[`+E\;+lЉ#2Ɔ&YтI{ dےDt V]I)e>P@ۢ` ,J+cܔbWEF}f/;}p3۫/@|S@OjAe(?iDɼL+Ou.q.9Ɣ}ԝS<hY0*EPKfңeNBdRx MD^pZ>))(aoY1ƕ80_$wEE0R) 5 %7\CA`={*ѣE[o} o8Q޻(FTGZ020ܖl,+N\JR%e h Ϡp-/8Ѝmo8)(:x>Jܓz:ϤR1trce9,5,Ҕj `7YC X ܨV9M-mS\OaM~:rɷx7*MEۇU šwx=4,iB?c6CFAX3 Utn%oMH3"۹njIVk0mjHliV]Kt\TD22e2)U@>44fF,a=H 03Y(SOdxV؊{h=: M'oi_NM{22S].%if>#l% |k;Ysr HB5P ZZ3ɬ;NhOh9Lz@ },Ɉ#{UB>Ȥ"zP(TDIy5K+8zw ;iUԅ$ZMtK2]TRNΧ2-IH6Fsir(+ cꐎxԽO6_+U bk?g j ^yl~A/Bfqdąǧ|4 v%c֜o6CYw@Hh饡{gcGK= ,Z9ɎH663ޱ,-e.ˑAׄ1hT Pk ނc.{_} _|\vף9Qh|?k#*4Lh|r)}'菙y]ŽTg_1ZΣ_iqVu<<{0_Z|ҋHM!\#PeM5;*DdǛuFu'2F[.f8 O]S}Q-ҩC-e]2A=v?7vݵHӏvLdJnfh2DeE( /N_9(M-pD)/9Q' m% &;*~b!{߃kӹF~P3ӥ×co7f/|/}K=on qh#]D Cm' ӚH(ûTGbB@[&ĞYǑ7y Mt?%G})HaTC"6%UAiMB_6yT;=q-|Ғ@tkto)/BVD%gj5aYt;t.&nts0I6Fu #z{/Ǵz>u֣mpے*^}H\sdZA9$c4,\By.9Vit%M)g/`v3 ̬ KV3d}98%*ugꚀEq/B"w@AJơRUge.?ZF<Y=+~ri~xݿxf߅C/F?~OT|]4w[?1 9Ҍ/&OoDs"1 ڻB ;'XI!(})`̹=!;Q6~dQ`'`÷cr9t/섔ƹm%A.rJ4xS]jK'v*J? |~DP"jH #%؊J5.oXlh\$&k6 vrW_m?s?72q:B>\!Df8rNxYkA{` {vQ㕧dg~NF`F p$wV[Z =O,aMib}l/X6 R3^X#(Q#BAMzepKbJ.8@NlADGxpW2J67)ǐwVߎ R|i 02=Nj*myBdbYG/-R37p5;z+g޺2NX)kÜ`/qDݰ&á4'/~Dd.-m: ʼ^ YM" *<$#Or%L??ەmJ+D%v3l# L|A.lR\ rPoL_}}}#e=p?}iPrey[? =}N@I]K- 9"7Mu0{!fA'Jqը2LP b|LD [<0o+qdX' )^r&C")dh[ke~ -ϥ: Pw@uy )t?M{x@#Og3JoVce³;rŹ3^VWWeXa.ZȘPЛ$F,ؿ1l -68ylD"4:b_vz_=z4?'OQCm~}{e.>n{P+KYf% SMa>s;B<$z#`pmkt0Ţ. $H?4؏G *B7BhDu7cK}ijGe`x~\܇fŅP]JE/{p;.X{?h}_7_{5{FPW _+ovo=}=߾{9 T -mZPl ig>win*sb RByT-찝 Y vӟn 2%^UQoyՇ&b@? w:&S..BN use{iL%1H&(.BGxDmq_fCE.U-~u{}Ww=oj'(9n|@ͫql4%*Bs(9y%{^YPxwƲ g0 ~* s̉Ҽ X1 %j&N.BNlFbc9amx6s _E[Ԉ\jZ7pVܐ\Vb`lj)q!De(n2-v/`/ 0/Ϳ2{FYRƆ?%ՅA@^MW ֡ڦ.5'W90]#X0w%pdAA`QUNf5#8(EN rP$C{\׎ˠi/S"H89+c\9j!`2g]#[9x\FGB3dž껻L_$6o~_|29pSZ$:Ih7'޲j(NÆo?mtHkbضK%y*˛_FINf$%0"3L]"{ҝvf"d ,9L&Nmx@K{ќ(PW6<{/vww5PP{v6Ppޫ߾o:?Cs}Z!`vBJrTӚ"/44a!8l"+3i$dLrT jvQOfQYƛꛀu< ,DEt-;tT$y!'D5^^ fI-%;T;I)of*[n/t7R]uw7No׹=ydu{'iOfAvEG0@spM dZ.Kbrj2qSgP0AJJa/nKzJ|sF> u}mvgbb6oq jPu^Ar35F YL򪕣t:ahJuV~_I+d_pjApz(*TPg9fXkƵoePwv?~2' ;r; ߹L`p `lzHձq{>S\K43*Wan^3 oCGiJ_W@_Q|{DF)tJ!oҟuyހH00xI&*mv@ė&&^,>Nqlj.i s$ä:&k!?0Ϳ|}|g/ʑ@(< &YPP~rT!@70 8=l|q$[l0ڒN̉ݜՖݐ`XJDˠ6v.zG<.mP"[$ﭿP('x7-L'oL`ҋy8?IloOYG3o=SH@@zo,\hZbHc/ tmRMVZQ8xq!1aC9K~= I;X݄~UՃeyˇ4+2Z&2tT0vi(=BD>Q29l\'fV>s|{g\n:*๻^&=NwۦJ=^ַڳTf tjn{`n,'pUj!s e0ϱG@iXGM֌Lg9eMB tb3$7a4X_yOSBw _Rz'[PrBʖPD[KJTaݢuhWU[Ihp5{ԃzݠ4Xvk_+oֶ?ln E{:Y_clSFQPN ]%;޲r󛢪T41T(J Mf91OzJ4M@wv~? 8dHMkq<)Șܭ-k.A{ΨZD%:Q@p`iuDWD|%# rO`x臙FA{lmuݍ:}3[}m?mO?<ItlfeP`ZsAa'),:$^E +zL lC(_;HR䜍3KYK9D.ldR/ywHý,ȃ|Nac.,Z :qx6H0UJJ@$K:x%O4m?:G#_W?ͿOۆO B?k2 S# ?  uD0F  ` t]u{pN(RK5#\k0ұU/,fvCۉ:Ҋ(#ҦEw`TF! I)urAAiv\SH;6ul#l?O&k6I='a4ukퟘJJa9 ,=Y?[.u4Jr; r3T= ]"xL#q2I+iz/t$zx6X.ޟګ&*rD(5(ASͫ"Hm%"icKkaZ ſ.[Q98ĀNͿ6 =m޿yʿ-2>Lro {]i{Me||2*V97+ 2ɜ7G,bu|yW`(\S :{LnkMrscFj6=CN,kz"RHwa7/an0qTq c.KJ+V zYT -ul1#{X.O Mu9,~}?~t; 7qui^n<NGs@^  H >'iٿ@kp#[)PrJҥA/b2Jvqd;sJ@!Ǖ.qH$RCrfm(Nd) 1!8@k,DeizqA7J.\rݸ!%MsuO{zOD7|QC?GSS˿pBmq^'6צ3(H b?3ECh:8Qre@BtnT dw^"FM,ԡ4q93e X`஀U:H^)ں69ï4jdųHh~Hd_Pjޱz^ʾ{b Il/uPښP@-dvn_\\`Lan-Є:o1; 7%Ѥ:h( MR(ǘRt:ST cݝ:-I9ڈFH ;¼(=ہQP ѝ$VڙgR," 3T. C)9iqU# |z{746&x?7j7rivD' m.NssINs_GUhHtt%*J/ru!R9`-l>Phk;uP휱AY G0,6td\p83NRn!\߻ځɚ(q! 3Ӝ9tlűfZ蹂Ers;GźNmLwIPL@W]nc jܿ@8H;*T8pW]sk^#ʎ7)G)~l > ާz ԢHRzr=v{={y25Z)Bc'su*<ڛRִutp X*;u?c: CA}h@ %νJQBKQTڸʌ3R)41Iq9$buo}K`jퟛ~tix mo']ޫ'燴fσ͇p$^P'TܒjZDr`2-kAޢ^՛O\?{>|BЯ9ݛzK-2PQ^I c1* w6"D'<:Уz\FT}-Ɣ@#F{ z*ARdDȧS*$juD(P9*Bur)NYOIhdAA Ϟym_{ˁ?-C'cM7s=ƞgO_0j]3kq|h/;v+Zovi k * ` ϼ{!Fm9s4Cf ѩdcO GӇ@6Vt5$_iq,&_e:c>9mE븶%2-4Ohr@r0 Mq!`Z:&ܘ@c2 [?Zk1g̱9|q]k1x3'T3vqn9\>{ \>ۿ{Y͟(OGyh6Uw7ݑfAiV;ًuP-1S;+,YM OE|A*S |,J8Ip@P&}v`ā*½ p0i#1Qi H Pfya ,凚!=&+% ;ϛ͡O|N>lyo~/=wN濿d3~,<4 UB"IWRꗃd̅5M~0l NwLY oHi/x̘3ۢ_\2]l6ܗ^cO̶K(ŁGkVx+VށIwf%#Q I`5p靂{ݏCg>/b?ۥ06T|w;jc󏩾k9sqN D(vȠ.% KY穛RATU@c+^ep-Ꮨ&fLGǰ"ٗ8LNQ?809"-Erd~xAc4tXd)2ڀ4ru<#?y`ώI[|/^ƿ;G<6w %=/ Lhް;,طT@GZ,pY4 7h|q,(b ;E-۳9R֢D*[@ˋ ecC# Sdqa3JŌ .TKZh|-?9PKSj>ݷ{c}nw ks}1? <z 851bw Z8t9Z GbYtjAB@ۚqw[ʆ`(#1snHs-|9ǰU=4:<> N->E] [~hZ+-O)emwê{_/'}{Wvwl8;w0$}S|ۦ6;yV@b>XVo29{ wPPrfSp5F8xxot& <{:]V'Ĵ"+a&K&*d$>Dc6g_| 4Pj*lfIO_pb'nN4Hg줟]L?S?޷O_w:t1_ ?p7 G77|_ ߑ?|v{xq8xK/"dMX\PK{[]|P4I0ԧ>%7ReBc Uǩ#?Y#a[ oᷓ jJSGC?o~܈άu$d>__@Gfc2. 2I|Tz_yﭾAs}6-?ӵH RNh:r26ztjO}[{F~Q=} KΊn&@FIg_N$*&SV"|W?} cp( $*=_ՓBgYf1Wz)$f`PyoMzm/߹O7mi(φo=`/2`W0'hB3{Ms{FBѨ]]F r@6xk-Y\ ۫|.WJIKxS~t&Ppn .l\"DVdR*žJ[ `E]T(b;:N) {_;!4ӸE>mɿ)<{}wϷt}x6]g ;{c&;ذ fKl$9˶f^fU;>p6Ror5tCS>O'7*-WO0 ;2Gx(eىUJK,{),9SJ0 <_S-)o.Ag@9L!$gyȒkoկ~ulgߦgc~Zu=6]tLG&`Z,)\µ._d`ᤶ pk>c KBaL(`B!Rq(N0 P+q{NTvT@jdxj˜p͑=7TTyNA4 +ULFHsOm@ 2_yf_JR6}o߳n M [ ȩf\^:u'%v+'<W:o  Ɂ$hCQjG y+m'z/2z%ˮElO0JUC+9yFUfKR˩#}ǁMCTZ8f+ؗk0 (smwD=wW~w~'y7gsgx_$qc1o1էZԔ&$5zL8WH\|p$TeHq"Yhb <F4FPh j^yTȹ GPy%r8 D6Z8R;6aV\yeN\RxR֬>il 6 t^ʼ<S:{v]bh 8>g/%L-"Az'fG=Pu:Zv n5ݧf#,>,ڊ ~dTDk+ X4tNrײh|̅c (A6 TN42#.N0`m?Gi迿?'/#8ퟏ^aq/OE4 5$&>ҋn~ɩKh:?IzYzhJ4 $5˴IHTr*i eW ዩ-d$l c>á|j4t7DV}ߌ2L_-d/LQ?NikY37XSo7Pz"D"r%U@%N:+ fQ[Rd 4ʔtx.%ԒM*dg/Մ܄}XGwKz'/t閂'z*bfaZd;6B.;YY #" a]jdt]]M"]?8/ڐ>:n'L/Lrp釢,b0PAK/aAsQ yABC:JKDve>Xt0TX YFp 8%D)z@Selkoυf2EBRUgFgaM]d^PS6b`iflA`ۘh=[_7ݛD }Lʹ_Yr%s›?uBtZӐcS8EV\;kB֢j-Ĝ5q*~ w^7̂0h3;"x0)::IH{ރB=MݔOt: пF1.!˟J~鎳[Nx1j!R:F띨tG{r1wodA3>^ 0k޳-^l6;7C.M˩­܉@&US3C- ͫ ;r[̇oGS D69u X&J\U}ڏ훥J‡᮸Ey3 . <O g-ֱ=o sW#a;~Ch\[F_@跩u6@m goM?؀m?主kC3m!1^ꛎ=c@oVOl!3˒2}es'aj܂50hت%|%L0{nJq!elIJS]AGj0z%LV^q,]&}%ŧ! 7xwq!GT'qj&soX}>{3i%N'+Ć(b@D/:VgRKlǩ7O5?f0b2T[C@'ΡlGr=4 g[6&,B W LhtSc#O.~X18KFȥTd|ѥQA}2 vgg/_5'Z3Z$ n# Ѽm Ϲq} _cS( a| ȠqLPh 3P9 k+bZx4#0-2;'Q-% +8Q dr'ⓁRTQ#a],ϰiLzg1m^iMd8- J+U.Ǧy xd]0~m;Gp{> C9ʻ~~^ @ʯu*8?O%MŜJ($wĊܵ|NjXGi" ]j)Gߜo| x~t &w2)HP()*$.;CjhhpP.]66JY4}B'{'L7ӗq8=\ɥ9,2(tSEd5fV+gkYfWh-BKCZy*xi%3`4QiEI)H>Rq-ӐM$cۦKAۣN/=CR]:1aTRQ\QS\g:O <HMMv'Db"]ȲF<ѽ-Q78 PHss:#D}-QW}ܚރ=@͓ת?@U'`+6#wbz#.'DTR]D鷊dԬP sOԐ~MCwK-k7幷2&e2 ا-HMm-8O.u Znq"t*/Pc3%[IVt,q83`Y"(# <T}@` l.Wtp 0e'f*x%3z-7ᖂe)4Jjazߢ,DEk{6GYlN' QIY1}߻I6a:\'-yb:4eP[/Bvtw60Oh]d6g}4kn.Ydi*́;Xܒ" o,1۲$ ap(0B/C@duxu"z/ipÇFLOV2!)Ͻ0`&8:xU& ,WE kL_'hq"hK'μڜy R.AZN"a,Nt|ߦL مibiRGW0ApRҵxǛdl= |.;u5LRSoa> bϵ,M@-hHIQ[pm$-I _؀eK iELIhGŞ>%FLWXfi\P=6+lL{4ys^7)r=:(F*iCc,ԙMqD ,HQp$Y&,HCPә B;##y;i#ԙ4&nhul(}<RLH"X:%CPjg[|3fG6\.4ΦT^i8iorozCUaTRWЍ8nN,JnUEt?"/Ҏ.*]ꄽ}h=V O6q;6nJ7e|"~LOw#4rVtoy'5PVtu\nO-qeIq  2T1XE]8PM; )kxI{Kqb#d$ىu*Aʳ"s3!rpp2^cЧ"Thi:W]$mĻbJ:oCD vU#00=˥VUݨcZsM%qr < LKi(uLj] Z졅1 *wd`2а>W (nQK iF~daT=^7o6 bm[+t 4J ":N*USzDz.C2cq%jꝐr\@p.f7yrͣг~w/zGpLzW -eutG&6u. eɍnS1X e]Z>3/: gT4,ɩP-5vL'00Yl-6TDגaBa;nUV`OK{pŁ (_mSI)Cq4a6OƆy깗~ay`}I_x`]Fj `5?F.~ &L#)4hKOƉ)D_ ݰ-}ϝSg7ʭQru_t1RX A]Pe.c\zBAkB? bkurk 7P۽;IZVm47$49r^8+[7EPh[jәh 4q-8 -.6c`YyG^l(p-7Dcِ`m;HGU?qQQ'J.P U SOk^DhӅ=NYD*—r#&I{l”]M]!SN?jnuiNRaOt`s|"fn!{p mXSms#EQ_ot7tx',*9_Cж?a!騞%FW&5q_Mi7޸֓X̉Y|@k"8(Ռ(k/;2 g1ǰ~މ=s@#4RzJIB<[(D+R*D!rPX i;ι[=iAtTp\@ r/R3>!zg _9.b- ("՗sۋka^^ <0S Zi(l ZT ھqS5HB[)Gʿ@Z x ēIE>kAY[5uGR Zۮ7>]=6̵4l'`nzz}giMWaWI"ԮEډ/p}#Lc!4eO"Ρ} ZPiR{PK@cn' KEIO{d `,U;BRx*2{x;[j-a l @񺕧]kdNvZ$Z4 g5czlw)›C)*wam]I]e2 )x;بzPj F{HIxˮ;;3QR_ama3NۤHuXqVMH`G1GYQ'l^{|jh]᡽7xC{f0Nz7@Y(T5#P:~o_/@#iJ`hf^91ݼ@gèv#L{]fw10^=2& CN|xj"%w?C?diϒ3г=gCKآ~}o |%-\Ɔ?6Ӌ&Y~v`i{{f{G92+56ӊБ5wyFK{c֚;A/=k*o!ɬɂSo@WpI!U"3<!i$*rp( ؘ.v9nwL.r7Z]3'赝{0xwp9(:f"%[o%'ReAB'^]'>ݦ9Ξ!?Mdɾp7-Ίۿo^UknCCj˾ iEW) vAZ uoRfv(^´!WRrK T"JB4dqVI0Ҁ&u56C4Th;0-(l\?'[ _Eٟoӛ4D&/uQP!d XMNٓAT5K!\)n=tܾ:J}٧1'|-_r#)VҪԊh ޵!7mS2N`}}2W]c.U˲?9(բwaY(&aq_0ONc]a5em` TacI׃ 2NpXFqJ.PwEP_N1AڑK:7 ˭;5GQF|->N&W~,\fz B0CF> *)e"P%^iTwP$3WGCX Ī># Yu9c꧔upj te0x;6]>ڙeL pLmF\ op N4flϏ%"ni B0;m a@LKYV<Ќ$]q=}nfz !4M+vameEvߋMCo۞l>݂#P-َ9ϫMa y MJ,t zvt zsQ6DZ='!Y cl,I*zgQ2LS?_M4*-2#.ͽݍ*a8pxt4A~iNۀY9-M ENJk=4,*ݝ_Hp޲ h!! eºa)!]Q a (L)LG)11tA^PT |LD*/}}tzGw#Ǚ V6*5bYI`B kdxjlRĨ0%KJ2!8#ӌքJq24F~j: h}3bccR+gJgZE?@bb|{G_BRl~m|~[%O8\i@bG99$8M`M}W~ 0K9B}Rgc ܚAEP=Ƀ[n)Zt^52`L%; XZBDݝ\l esI958H~r`z-|UH\V[LԄE'&ki(;u*⾜ Kk:+ϚiE t Ψ" ;\?ږ沰gl15"-a>']Nh ." ˇX.l/TRQߖd:s_SR,!;yfKwt( qL*(8 &#kح\x;]'@w ӚjhNA,t=+0KR)Lal OY;Ykrv\c{ݐ[Dc8#IZG!)pY 潝T|h:Bϐ N>Q𾶑u M uݾm:65*D-mƾd\8f[ nZk`9w"ƪVDBV_91AK {]rccie9A ?a?\m<a}دԇ.8W7}rSN[ (PC,뗙>T DP9k1pǼ2+i)LFf)YrTMjMS)vИS`n9ׇ\oACd=S ;)Q,&ٯx F4t|gڭPD4L͕|Β-W+=ﷶQDˊc1QML~6,(=FQRů)eMp!|f#ጼ R`k ~̀C( ,24v~hc0$UPQ`k qC.d=q}=ʳ5{0׷, ˂cXfd4mp"\,7ч;'@Tien`?ph|09 o D@+ e,EE;hC$s]]e;`F*^O3LJ&a~}%76 u]T\t^iRZPj\U V_sa%&DOmkv4if6$^=c_76mLxxC.M\bnzN&[X+U>ml\NRZEOOKT )o" [[ݾ_ܲm?\p92{ k1_wцA0Hc@%u&>Gcp-YhaѦZ9{h\3O E .RMFNښdA8a%?z*aIdA= .UiE=;x-[Ǵ&M>߳K M!WO~R,7 h}ߕ?wl|D'=ԁ^n3D"l* /G 2ȑZπ$nDO\F@ 4*< ]d7t Yd2P#}c_rM@R dDU(ixeHF ZԢM#.4яm_;OȋˋCbSV-\v'۟T>Z9(eq 6||^pFA  t*QgA^FRtzo["L7!z/`ۦC1٥3[apg^CwM`:wZ$K1˯`RmiY\L|WAeGN% "+KhpxQ=nWRJo FQh1H`iA> <=q-Kw jKEOwp!9VR*FP[WNx~ PAF~֭ W}Y@@*0=Y}mc Ϻζ71|tǥ-_0qT244S/wǠ0 Cr^‡~EVFZC}(^4J+:eahR W;-+3={ݎoVU}]A˽1Jgަ63|fz~xX:l|gOw_m'✨hu4@C= ;[WKk՜KwČ080A_\1$fFp)yK}?+2ҩ$r& S;3uC./)ZmB<,s:{w!dDkAU< 5]]Xw!᲏u\oid 2S @E\㋯gٕ f086͔n~yE)ijA[} (8 ADP]Xix7kS yk#l-8+](H9yYXTcN5ˠ )g 4)8 '1 iG8h6Eq#/Bu߶䢺@KH[=Ϟ8iR;~w6:Ӌ- H 91< Pנ)m-[xYG?Au t5&м ^v׎7XiX߱.i%?NIT1gJUB蘮[X}ײ`羅"")b &{aj5{KZ)%\M-1o]w}=.I}{NMڎ?/CaHX0z/Nok3ƾ}72[ԦP {G-Cق$l~*{ldavd >knG?wje/KuwIu,6mɸ|4ݹSa!0@AsC ;BmX1GJ vsE A|[[-(TQF3>J8R`%sQIG4^athbߛv{$8m@bV1$v~5uPf\t.CWn5gG4zb;Zqq@::{2G¯Mil]1J.]Pm-\$0I/(/+ jhj伨( Z S&Ȳqj*ml7qTC/X9)lZssڞ+ =EWL˷`K :G/|#T.⹼`yT\y6^E`i!up`GAʌR.ұ;w [0忎l JY!Շ̌x++:At,"F&2: CJ\h%3l7`jī*I0lgc󮋺/j3 jמIBhBԱPIqb"Au,:.uBdh k^K[ fW\܊ `֬z}a_bdEq!WiנĠ/Kh׃wJۏ>#}(N`RG& p: UG'\4dv|F`6Z*}xx;eLm@*k3o]`OW$݌4YhѢĖ"3d301']RNPo5+rV?=q3m[*R7#@"gu=&\MGKUM3y`JbuA~Ot8qvf&_`2K/3H`MLb2fRMơgx"rleG߶8 (hE}o$]][ͧ`!jJm̡GM@upHQt#pH6&k^#xbJtl.<a?qJK-YJ*I'N2Qnvճtw,QLhMf,@ܗ2mr[O&$ʗ:0O23gn%OΜ{=h43tHh;x,+r:hx 5uce=_[R8&B.*G΃2Ȑid[gd75'S>CFk 6[Wˉx唌Oe lEv߻++|-5yzUYC-*$f.9Gܧ;:A> N{? 7>yJ0~b`mKJ٢dǭ2Pp/YRuRǁ: 04 R j2ՇBhⶬ1h 詓,YnW{rKFOk@![,7-:!p Z;P $يC'D(#blZx\O q6є}M"[jaS6&+x0@ IQhrɪP@?|T i$dFjk0&ѷ.XLV=jZ}-w9}n3uV94ttGALA\ ~HKƊxTERWqQ uf!.l=c95jJ{iӐM a6p -,UdAB? *(xz~5@^G`{g' Hg*0ّms&^egi/9 .Z֠u V/O?oo匉\ZdH o-_@b1es0uKƜi`,m׿^va á5<*mX)w>]@HE`;5(wi@Lt;3oF}](ɋANM ߋ& 5>O|~iH`{[MEjn>)0iCjAa=[mdߐq @H7\#Rx#~ǀJr\; S >xa&vTKRv+r& $gԋ*.H`H!nrڙd0LY;6Œf ~=fЎLc~Ziax!`ʻO`=f: {X4iQꊭ< InSlM>pgO^2'P{ix/8zLrV|A[Z'跨u/(.Wϱhr܁0Ϛ5H[2*V4Qz@2րp/2H`ڑH/<{ɖk8[#s"G4:Ou@NNɋc:>J̒L,7쯛 jR RH!Vr De ,WSvFV M;vtcLH O2o;lVL(0 NjDV'Ja꺹{NW11˖)gt"v]#"Ղ=S [_`o݇Y >R7Veor7!dFނl!Rk\ҬU2 2"Lk: C@zަ4&0NYJ7AdA[O& >D֞B+ܳ:׶@'&maB9?Q 1A1W* ݎWn,~Yr.%@eNd1aX52dM+Dh쳧rBtYvkg[^ԖkfBdX<;d232C em3轝r402[vY #@Bڜ%b]bQƤΕz39fDo;+" +< mnqqֳ3? lD `(KS=`9!`p3L򸳬iL*Z6C BC`:ܪ8|ڦ hiY5{cK&1v_F#9м}Wvo_I. [^r֩_O; 5%c>`^hO= "j=ƾi:i8VY<-FĜ͟q tdM=;)a!!U^I=beY? 31՜:}݊==xvP$3pJdUxYۦo,##q@mU<{}` 'Kh)%?ģ 8y֍YC L`8I8wq.,%&ې/ B3F#Q+jpPx8;V̄Eg`'ge:ږu4d&. ?$nY()үtqc|-sUTKc EKl6z[ gsn|%`oh~^~C\c%2 9 :; 6XDάǸ5 L+/PӀKQl,(v;kB x(Z Iy)_5]8K^odCϺ,['&̗fd4}D=) Al!6pE|s ːENz 0SQM_A߿p?%؄%'3ojEL?f&,FEIYI#F׫"\UV9KVӖkњPoZ U kr@xLqƆ3F'ͽK@> L (,lm!1VlvIg#QH$XԊbUq\[:q䑑9Eg59L(*w̸']ȖbAqC#\0l͂ /w-R[|vFf쏥ua4d&r9-2$uBlkt>u3ZAFAМf:R 'R.Z5s%bNT|ZŲ`gc8x 4v& )K4*UH$͉)UBJrR+:S#=B;a΁5 $ηA&K=t., !N[]YN&=G:Lbɽ(T,@2eJ]|=m>5ٮqe}՜?n⯋EVO0ۯ_*0l>}3z按IVaohu-[ (+1F`dziib[5۔ bK"W#Tܖ?JWԥҴA$q" $2HKEu!DO2 ԥɭxƨ8TM5y#ȏ/&0BPT핾ۯO(o-FcŸB۷_~3e|31R9%:(N. VvX4'1#&ZdS:F-bZFBAU-V,l.ˎ͒==EHn2Y ZӉ'fv*Ufz{ut!m!R^@hܞb;Ѿ W٤eqa s ~6۞SM&7G۷_xk,ZD!-M'n\iֶH7SbqUHwuT8hhd ir:YJ>·R+ R7ci''sMO%mgH5jynY Ddf8hjgJvThbDo!lP/Ć]Yxq/vK48C潅)a|K%nCvT[m}OC@T$}a(w]3 6SƸ(f7x6 LU8u˘,lͪ#l=-E&YdJż +͌E.i^b8 z7/Q Ihv"P*d?mEDU+./񦣿C6JuuT۷$ Nհ0.V;[ o{EAH@ 4Iʩso俸?B4^'0X8#NQ'?`Y"%h$>B9,naiȫ0%:mm D4xxK#E5n{V:е2sNt1;pTaZ44]w TڒejhxI֤=m(e'cQ5`_ ($_ vFi+97D=K׭Uܾ_m_M^֕%Ǹ50J9ʓz٩4Hޭ49d㏙agN;4ӹS]+?drHԈҰgcS˖I~Δh6JؙB$ڜ9<ՈcTu1ܮsuGV#t]XY/SBC kě;#/~o?y'傆t ];ghp:ZV粕Ѓ-EQ pLj5*H(JE~"" K>lF9k7:29ZZl 8F⟣sZe^eʂ'WKƹ (r^oM;X/f1`}mm&Mxe.>\g*Q ܗ|IENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/256x256/displaycal-synthprofile.png0000644000076500000000000012304112647526527026175 0ustar devwheel00000000000000PNG  IHDR\rftEXtSoftwareAdobe ImageReadyqe<IDATx q&n48H8(HNH%jcDZ^{혍uxgY3ǞX+ymce괨͛ .$q@7Fwd{_U $.TW_/嗙׿1?7,Tt|@ ~@[_ ϭ(TbEqM;߱⩝Og7 #ޫ.Ջ6DwlY`HkPH \{bI^x0CqiM3wQjY0;|x]%Y> 97+Ey\,'dUO#rJK'V}֎Mv\PM`u+#kǰ@bP b֟$U{&߻s2sF}Vﹸk,SqHlbr=Xu~\Dp^V_on>nq@;"} ,$apL/[#u wöC1,ߵ^b241*xa\1#x/ݛ -7Y"ab#F֝{e240jetYB^cm[DP"h§f0p8*-Jcr" ;]gNj_6hdL_xxѻ}dp>d@? |PvrS> ܑBj}Zf0r,~3`XsBqNzoRZej g\HXGEeHD/'ϹF/TF<5yv)<ꋴzp732/sqg|e;@Щ9JPa`huQ~y㉲j 8uÂŏg/`kmMn&ryoX^_cbFMD&Q*;ldd`nW4![9W;mfcOUmХliwUje,ki㴎g0fJS:T#0P`s8ymW*mn1O&pbLy'ĩw(c3{/F %L/j#V_^.$)<ìkIZ}3-i-2-L820%1A":׋ Re!ʦoR31 jUC!{z'Z2%*>~WrꁟG^uG*eBsv3);hQ7+*${DHrπ*GrvauD b$ ɲQw[Y} xb:pVu\m,*![A4v+ɦPѪʐrR<Pԗ2T5eU~q NAVOLd3(퀸8Pݺ@,`n~ޟql 5Jb3=c^&] (r>{KCB/@E#0hLF:fd7rNF*3UYY$"H S?!Tb'k!ZO kSDxqV`WjYw:A*<>m 0W:0L~C[,%0"hϳl8$"6m1Eh$̫ yg$%Dcee/=-50w5<S+t`ү$0+8nF-X}dnPfNT ϓx^au~6得*UN3~lW ;]Ou]OjRCwU A^c0M%ޘ\~WǗlH%S1l@ڧs:uWo3@n+Of|-kʿkz2B _MC¼h(k"lʕ}/ ߾Ze1F?+ QbJ?mfQ( i3٬l%vs{M۰*jsH*IMITf^[ZRb'*c2ųe ki$&/9K~s' gh 3WmZ<`;^C AoN*_籔~|65zrc1xpA0&EZ.x:H!z9=G4pش\x43N[ejAq<("dܨ@dI/(I6ۼ6įVf$iXd)6,hBGFޠ[ckK&]`άDXZ0RRaؐ5r8KCBH@Z&P[W px'~!1&AOS"riR4"줵0 S; OVCo3d[(VG3r F6|LD}%^s+_ƣ_xY$܋ař9`rݧ_ vb>LXSV8BNGA)S60/}b1!5fSpjel;JV]DQlzP\؜s׼5E;Ϳr͈7SO=VIk=T# 3SN(CmaOñְ 9tʨ7;p/ le#,-q_=ҨM^EpfR88b8 lXu#޽B.I3^!Id-"lڼmMEoB;|@M9zmf'6!$mN>8Y6$^e(H"oި6K nvV^a=rhaVP&\cY?k|̖MqmuL_7N@S@7'V]5#|iX]\:uppp ˦1wi*D!'c9Vsį(/=k5[.K ?8~q@e{Ux# ] bOyt&#apʀFIu}8;.[ݧLH`B;e|d[]t6.L*:&aJz,xeE?z? puҝ`ngFF#iNg2nG -wmwP #pౕWÞo3G8(jsh@页ͷl2mV 4;pj7 KRptCr誮Ta7t#mtr[A=Me !Of#H&> XMB&axukrx0@!P6Sy<ۊf@z9Dh@+2 !hDdH]6s-{j^;&qjDB@I.=br.͒jqiDԁRH.T恇i[qf &S黎é6QQM͇.:lsܶ7{Ǜ_u}Qx;k)] ijfL=,tŇ c$,2 NHQ^ [8΃pGå KlRݦ˸hl^;~n{ pGq?yx7[[_/:qU ¶oLm,|#|a=ʄ9S M M'W5ˢT@C|S R#>x LРE3Di- i/]kR wY-5`Kp{]| tk1G97 Rs'l +V]5 G}} ugό8FZ0A#-H< @ZASOoѓ%beϪv$ = iu((U=ơ9 YҦR}ڞ!F( tPT ta/|t?/17__^O:Z…~f$s=pO߻z&RX)Gj6vE{f[J15O1"U1\IwElʑq>)\HLEPK=$ ceŁ IN,ΊsdV:wɦN?@ zeb =5@ƿ2>*oEx톷o5w< LDȖfL#ưхU̽Y?#ˢd q/5]doFySgr)_".ycC=֚x-Ҏ)/@ct?,ND&~On0ڌ[~  doClÂi#]/?u|EIE95Q0,]Z},kL'GXeFĄdVJg$G(+ X L9a=L )uP"T'@K;MT-CHReXK~8]pvY]P]ɶSb_n cq?Y8~ >S[}?{. kK1fvlJ8x:-و@) ^)r ~jAcxmDPv!esz+F}4 Dx(K.A64M‚+`ͰFX\:" 1=/;%GV\FHx'7p-KgP!j-̏\Djs4&3exdӸXr;(zO i$ 9:y naG6ˁ?D! z/kԆ]37zy/?r - ~ aաM`b00 ^ρn ? cvÂV=S%hzdk-o{ Ј7g#֤b d?ig=tFL?) H<605}Нb>N=2᭕HBg܏g\dI}y3v`` */y#A> ..{R}Quhs@tOۯb|/wPSW J8j# hՍ#ɗ%#͑\WP):Y'ӂ2Eq">\XBAE ƺm QNǤڜ?MSl Fj_ٷCm r |~=`OkE1[oBL#O ;ÿ;,3Z+LɸR(g*k̜ O1C_֊#k\W;ɪn'<+XwT؁(#mYjb Y8 c~t{Wo)|)mؿ:vzb4-\F,ب̑n~ݺOʁzacDZ,C_qWǏ6xRʊSyNy΄t-p֋ؿ?O)_urϽWu/\54\n T #`#oɳa0:6Kdvsep¸ 0Dr.%4j//-spxL@ pMuL[h xҠJMŧTTZK;VQs{V*Xc?_`A^I%[f铑ZT轓bۢu>ry_}x5 CW+*հٓa鲃`پt,,|g_X ~%K1.i˵f~6 Pk̡;00j %9qC\bF[M95FDxD^nI [lfQuބXO0돫)_}G&`Ϟn0z0Hc ].|7=JwT{ӧ`y9/EUXُ}OgU9P/`U&drM$X6S!)#xtr"/'VMK\TYn'8k _|=|? =xwVksݺ]_OBvÑְn@u M*Cp;x ;+1afA`k6 +O-ЖǕV`}UtFX6dѺXªmsy;qjxѷӰjs9՛· Oҥ`u:nD*}pLlC|ƪڷR =*unNȷ."kb O~Pg|"c eO4iyo^1.7pnblx𥳐l?xt\4":LƧyȊ2 <2ɹ׉h`pԩ*Um6$yƌ{"*/Cb@BM,!;TZwix`,g 85 '"jk!<k O[`}5!UKcSgD(oǏo ˗ ұ)exKnS)b1QEI*g˖'ױ{љ#(=ޮnOLOq-K uX;Q /Äe >X;obos;A OnWDqpq~nx0maX-\ K8yWMM犑b o]BHNJw֯]XGn~eՇIF Q@@\O 4{W1XbDԘ E4`翛gnwUV#:p'oWqkrFۏ;ڷ)\ `p8{n\qʭ|ݪEa'ab^1eZ$޵jP&K8}\ V ;AQc t0WCtTaMX{"_6$$ϗߖtp|B͞_o6}UXҘ8 r .KHpس %z|XpՒIXdk(h,GU6D0(H˗ X`PfYDYΤ58κ>(aKo&*0kB\?@OV1y1c,/F 7m 7ļlA)] P%%?tBصjͬ[t{+b?jк;uB7ͧ 8O&-:{ƥ' ʟVRd.L7AƠV:)uƊO,;IDPPM21:VG( dow~zwjWї˘g 9ӣp'[[u7;'Gal)CԦu4ȶoEi11†.*E*OiﯬK+G2;|gݿ kɯ_}cٜm/Ki<>ZvF/~{6mX#r<0)=ftcO]mݘE!r`ހ*X1ƄdDҵF5o©ĵEsvyU {.\7> @]s@Po(|槃ʮ1jeFi,1([wso7n/LcilwǏ~> azMk ےt7چR_*/ wOrϟ ?G BJ%yr6.{޵?6vj{ ? llmwEsY {3x`AEo<&z뭔( &~(/ ;n'|q1AcTڵ%pgn@4ѬAW~ rrjr Ͼ\Mlwǖi37o}ò,% 綆<5bC/Ԅ4榄>FXa1Ayܽruab p l|`@n @AWr8]eABe.ϽAWc/7C?7&,A 8OyrS:]>ڷќؘX"y/)*NO qsv~׆ s3{@ ,H^=ǹ,ف~(ܲ|`N5Ƌ].憻iD)jpU.\- eQ|ulK[3̐<5jHxޑf 6HLmjMnzfԝֿYzMoA:4K/?[d/,8GD?ܐV{&3[38#}F?sH LEԅCqk&PP NgoZBNzOv;66V=~xabG] o~ȩU)fLIk8/Ͷd^C T~*QՂ2O$1HLfSwpaU)@^t_Wx2f0S^{0=7˟ A`n@rzqv=M O7 l: hdvSNTg T&t S퍽F+gd!d@'~"|)1(vǯ}/w0KW…U? Akk')X76bf +Q f$U IF8k }Hqtҽz!0"\lX0b7| -`Gp񥫯/ozNE>v4LmW<=x{ ),p)[@ h̐L/=rgagԀM=dv/B(T}HI2C#4'AOqUq_1]w?9?'=/wE%?.|wp2 c!C1fp-gĽ4b&'nygE+#_G>[cHJOf6OB}x;CoJߛi79Lŋ؆ p?^H!@7BɍZ6FGAsYZ'@,R2NϫQ <"a$wmyGbH$hkdbV 8kQK[as&)r1Cx){|}Pm{ 0 Ms.}a9.㪆޸ALw soƿgBoa O; 2s^q"<ǴVF5Kmk!z(g$_J_qu4^ F9Ը>j,LK1+( 0d4+7ab?aHxgh&FB;@rOFqD{m7  jXH9ٹfdl\̛*2:oi8AȈpǮϸ}ypI\X2~\"z]xCO tkp_?< ֤9|?"ڱ[W?`]!I8ƝH:R ~)BSF1oo;>O |ngN/<y[tiK͚5rٲep`/-c^O{1.6KA"dXڀp7@/njZaqD)cwj$}aAD,IBwUQny. {zg6ss&)-Voy[ o|0y}s!g!''F{Iy:QBXG4 ÃfX|nf9Q(+]8$R;^#5޳9{/R_ޛ errq1 M8|{`oCp+Y-c8=۸ZS-~|@9Y@)ꀆYQFjG$QnT<=>}pGW90zlvxүN:U~C@`.w9X>xF{1;6IrZ[1w2@ UAZ*pZH*It {<7. 9m0|%o7vׯ{ZޫG 9|cGO *N`.[ [a5hb9%m L#14 Gp P$"@j߄B}ث?ܪ84xKOΠ+S}a'Cxy3c׵7*!lJv+ڐc3_ͭMB(T6Cd[s9J5()8sup nz=j@+6/_j A ZxWm*׎J wGOtȷBLklٯ7%n(j2dbKs嫎ȫ{s5oi@|yҗCrz 7 :i-it|n/V9/t+(T{* #e=s[-Y=@P+.#LmXgNO`~>|09[tG;7lj<' [_pw.Y[PfFȳh&Ѡ1!!D"kE~^mF<NNM@fOOf_?~Nj|1!g;W5:=87]{9p'IsX776s`UG Ew>bCO^˯^ӌrL 9p_Fл_>擏7 ]!j@7u{r|mUI18c>T|&++m%KF>^?IJlkcG#~=\4z2}{/(sQ;,¹=-A=: }>y  )vSX~-&` gFnԎtZy(Ė^OƚO;0,̓}{ew@ Av:q`e+i:gޤȖD0 A0h 0L0d\NR wq B8ĭaz>y{ <~(k؃@v_x\M>©uـgNL1zpI)0KC |;AC+52c3˗z-}~`'[ h5[(Ào}Y =lM/ĝXQhY$6^fčZ !?d<:Z69"g_U~i@\ qD49wΨD>u$x M1ll#0c@ ESFpS@i}/[[ K~Fw{&>n{\8p-_?8s$9Z=6mL[BFFiL 5/`rɹ^Ju`<2yMЏ?tk%_? P6g 3C;57(wNmO0Q-kDB*=`܀jcC } tuE hLH&WpM⻹dn P}J 0 0^U;Zʄp8q Ut],L 3f;_Nfj]_?RJ>N SUnۡww0 (Sl+ٳ p܁+D\(?Kz P2 a޽Y8qD^|8|+x`4; Nk]L ,}> 3ry6rwօ붚er( u4Af&(p͟LܶRbNGl-xpO%z~W:'?/^o~.?Sɢsygz;zXw`\Z{\ܷ_(@~RQk8q>~wwzs 0ۥyp|5s@_9unݸͯR[nQշbl1ੋ"6<xȓ>ث/ O*a;SWg/(S.!r@ՠzyk '݋V-[avfgg +qِUG r䝭f&cF)ZS=ٶpq/?uP@߶7_8ꢒ봞eMztna;1ĨF'mE =&IcR18 @aO5.~@{C\ߚ4mϤ0j|QYfDxj#7rewyAffaE6=Y)_ؾ+IG:޺@3 0$'-3KV6 1xGǟ\-5bOd ~D8H k!-1=E@cBl܌! Au3 mm5&`Igۯ-X:b0$|7T!昑#}UΤU/Bw钖?oChنǮ˟0~,]wպ8r}® (Aߠ}oHV=C H$2$ #лUˡo.,yhǃA N G%HC`@RKE5܇ǨJ_PsWcχ; o@3k6x^=nhs\ 5@XXJcх=< ? p/V:F=v9Y\^k3!]~o݀cJr|\,O>GAg]+1kXV#sF?_ dAݗ|^~eKzgrA`NX5_>u ca_PTmQcc%!84⏽ƼR@; !')S e n?B"t4#@x q9!!9`4]?% qb/%C4m@PeUt<~BX:T7I7t@hD2VC 칾s3?!n]^3@0K*=F2y*dBA^ wЀgёz`@w)[0  s3~C<~v?ݭ#v1ǩ-4A(tmys2¸ .ِpgh ` >A`l@`l:C~oJzW; \x?',rNu}!@2k@XLۈ{J).14<ld=xẠ< x0ï[nPMF]{ P2d"77ixF?< 0ϟsC=O؋.3nQ2iLZRl&'փBPV$ȅI.ŎsD p je0`*e |(۵EmgF>b I/_ؘv狱n  gNuFXn_@۫ԂYb>fj0ʵw1;?'0KCZO9yd`%[9e |/ mia ݦJPg_UBFB # B zXCgjz?]zھn;i!|A`6e ?>wьyfc}/Uc B q˜o!v᱉|AMSۥˡ[=! A`nщm~v$ v6n !0K c1F0H=}(]wjbJ\!@`ϜϵWpQjD@ !"j>j!P 9,*@RXp3g WoAn*`C IhnoydyXKYr 7fFӱ{J?$ h])6(/~^=]/ҥK]*:̦ܢg`І7i |k*e 4xwn"dfhaԩvA95i 濘/Ή@d/D ңmprtOۻtt矉#ÅF L$@/./fƦbG|7Pv@(C 5(g/P(KӑD;~( 9{ۻ88D@T D.l`=$#IV@=B\~iH=7ufLLLx A`m9ԧ˟3 4V!# oE1@@Pw2A@4 vN*vaylSi23֧ny휇C@[K~{$c#O= Gk k۩y8K,w1.H#B$ {bc{w' Pܧn~e 0قG$`oaF1>bAsCRJd 5tM2w{=ܞ-mfaDr7oX OKVB4?/m hB3t:'5~?{_;1{'_s}.=~7-y+3lsՍ7)f5K#c_9^BL *$YH 8*f,=oz@~Vad(E?20)0b Mw%]>}oZA\TKw:gHH۹y*5_AJ˜|c.dSߏܟy:YK%}J-€Z-o;wnYCx=SfɌ? t]w.KͿF*oƓnXw 6y<#ɌATBICb@.W1~6P_ͳK?{S_ ~ 6}C fp$lwU]|#j (S>;I`VW3k8qD_b =)j& i,ȓqB?ˊ-$gv#Ұ VׯD2J))؅_i@^vѾt/]37=pRoNs3xWS~v;Nd{ xq{5qyd"01H N+8Pt󧡹H0ڏ>^4χn},9-º {|ʾD@5hB\ dӁ>KbAT w9X7d?v. νg 8vX%>mFuj FZR^7 /D&Dܾy¸WIQCP{ ROH-J= 5X?(hzf8{g e,u^$q/u(~~z'V7 ~/l &uVԞc&z`sG!t^`{_}`򪡌yB8k?ewk"s P , AG <0s鿴Șo#%:ؠȧK!`T돆`Ɠ{LAO$*o[d5pONʯIJ\Z}#\9  r#uoxkH5K5B0YS+ㄾK+Ո)dCvD8@8aY~/D[rP0`e[8_(C^ Pvd~o!SxoYl#11D@0#&63аog8b~`B7i15 +g ~zN@T=^ Px47kߓkfI8߱ܓ[ B,E( ˀyQ5p H-@F"TwYHa҉˿Iz6K`G \o2 v~@`»w?kB(糲GFHf=Ekf!$ W%j@l(^fs`w=o_ank p@뗮}/xWW7gfQ81r60[4\3B{lDL҄7R~̉tGٺ`-G#ß`u bfŷ/0'ro}@:8p 䑇 p@iegД_zbx+r9/~|jax'E徢}!`A8&R&vx vI U>Ԑy͑Ooio9)*oe^F:+ J/+;7ݍEK ?-YN#P&;bxkZ! z}ea{ #C>gk-2Ik Q CP )HX?sa?Yo,(=>rC2@>ō(lpz(q^e6P&VD Pa D!'sNfPbɘ(Hw..Ӱۿ{o!'W? 6Ogˣp K{*BB)@I,߈Lѷ C؅ɵƄCY%lD _E,z+pDlŕo79|q@N ٙ5weq̗t CLBi}yU"2=T`M^n1B 9mIBcsCX0N:+!TœW}_N_hz[GGJN&C WsAA஝{q4_ZxXvwH1-o?u@x!F9>VT15 9Ʀ fA<O!EhA{F|H0si6ih/k0=~ݜ@>sCJ/7r Xsf1B~?1xn`vM_+pbံb6!0 \8aJmۮ6QaI U L`<7?O'"!&.i e×Jo4~ kwHfػ5}Wlb#2j,em>eHo D Zb: D OT-!‚',Jr\W}ݾT ^\v7JR*¹^彩o6 7p 5X4tq:Ӑ,\ `%g2ޗ@[VVg}}^EPLS4֠ј:84Yjl6 +N &.&&ںi%("HHA RQz! q<p(n] e"XS^MO]:f) 8r'ДW,F>}{}͏g}qCN?zڷk3,veMu3G_&>w08V1VqcGδH )haHWe"Qqo%S^tT@4NEFvKs 1z#_IG=?*mte$v8{6:UeYݒ~كv *v:Lۡ Q?ve OeR:Ro恥NvԷg'МdM9д  45~u׮]cyxЋ!}6힜7t3=vrjҹ2K -?qtya^6=1X:v3?8bқ}N3#tv^]4:Z&u]Kqۆ`(8`|#9~Fכ :0rgM8-"3: \xUf~wY[񵈦:=)[` i#%D >rA9v>.lH>{-MwXqYTw֭yV4|)lt>MW#ʁ+x-u/ox ¥ZxHH~Pt#=}0i(8ErbEDޡ_C[`#(]k[YK+g>8b Z~=MOOKS9}omƹ~ر;Ҥ(-" 1nuy/}CfUU~@v'iT# & l̕=ET 9u2/hl >P-ցL;nݛHT]ŽQc`Q?~׊J&e̶<oKQh77eҴTw7T9мcG{]ÜR/Ϲ7]>ĨUgNʜGvmSwqqڙFsA\9YJ܀mG Umɻ 4;o٦ Ρl`D<̑@j~w;陛S43إ*Zuz.q4A&''ibbK'Z#18v)͗Q7)UIsSD; Oќ7<7MY}YzڱsG f@1cfK`3t6Yo˹K-Qœyn J{a"q**Q,'6Ɏ/ pjԿ[U4_FV=?^M鱴v4!w=d7Ѳ6իi͚5}hjo t(N2'ycp18 6/a#{2.C{}z:qGd)_'Hk'顾4us>7^ \4?$@㨚zI$߶h9_/IRcqշ(nZs]yއha.FX[cG WҼï~җ(kf &4CsmB[$b`&A-;]y4ć z孯GD=fH1 ~/O9,jF;C>g"gmXcVqbe/ճʹӴ\MɊFі:PI1@ٗ^ߨZK?P;ck'0t_8D._c&^O+&~.1b= [*qg3Wd'MpVzEod$su7]XJTVl4`?p.pdD=ObєD+.0/wrnKC`(/4qDHivi^Hn+ NF U$Uh CY*#QadojkDPVͫ~@w{[ʷnxZyڞy_`$p<PDaT TKd:mlwgˆ*?LhRqG2BB];zIi{VHC889xwhf9; ϠuD`J+2Ơiފ\:f{[95_ўo kvG \XEWjz-WCkt_eWk].2 ]Wxz>[1EGf*+u;03@GcxC▋ &:鸏fԀs3 yHYveE thQ}U-o; \z ~{~ԙT#w?ӕ缓iK$ۈ:H&# %HP/Ueq8>Hٓ B.s|A&1K ]mWz n۶ |DA3HrD%06z; }{~|hf7vGo#c!,s]ׂyŵ+Or_gO|nKv jO| no%Vu@!+46!dV"Ę5CH>?s޶7Iivҽ+jX CZ`qڽ}t`mz_в#>Fu;ĝO˷6<+51xꗄ(NOs~#'ǨAJw{$yFH[Zq@qF,#6dMWR X f 6@}EHb(?& Q6 NJV ~$A21_Χ=#Zݴl'vC%;=ө'ّا3nɈ gB7vUfut K۷~ ukh7 @Qd{9 ;oHX/(Jab7IVicﹴ{hV.8,:4iz{hjv~H'̟guUaـ}zo-ww#Aq2*$-vUE!@X`d z>}"7I dY=۶Cx/)PyyZyl49?SÊC1AHV.RN-qBD茩}'g0i44-4#[ &otg/Kv>~miRzEė%fàv7迬{#Usp~v7ZP2i^U=0ۏ`89F !RNS T5oGYO\i8!2bb}d0m-Tl9 &p"xa>g?sNdEKE p%fUDv'ϟE z_yhKL,l/N kUtmsG>?w> {0k7d`TĄ"ģТUUn 18p**ņ7$fE8 vP ( $<(Ato G{f/^9,w]&5Tn# Ѳڟ 'p'ELfs F9l+6ttϲt>m*qjuj1% Ui lm&a2S|eL=GcT9)_1/ǝ)S}O z*^~h0(TxeEM|nڸ}+hǾ dƺN?LX8ߣHb{v=>ΞzD}=~ZOޘF~$e >B}iQ @Bc/C.QHC|6J睽LWFtU7Ҡ[|UAbbd>'@OZl@Ee #EVgj] Tx3@ ,ymrρ֯|^Ew[inܑg'wyW&@CuhbRU_LD #8zoB'V t鬹YoX#JQ@`w;|K?/ 'dO h|S0wԙT_IyUg&Mt#m6iYtd·C~ "ew;*!^z 8%Gqtv3hz Z;ss3?y+OIzwl67U;5Ջ+.l}#']5gGx7]mt/{Г24tCw(umv (`(nD.Vv8fymĈH#->pѩ϶ "Qٓhd]ݏ):{.GGm@ UdZ!3Ϗd$!{?{I[}<_Jw&]J|T }CvE$F=r@Ad6JDÐ$IDㇰjiՊkh_ї (iLg0dA#ʒJ"o*YFTT&_J`u'tQkij-hC-P#ߤՈf޴-9岊'JkG@" +]~IIX'#&2;O4Ǻ'$VRYNۢ wP[v[gHhݱW1kv|btTu4tFO#׆ ;ô/Nu'AuGFak<ՁK@ AN3 QJmФD ({[q,&#hSpd1& kSԨRhul\ZtӮ^Nv?vRq2: <_JOc>qiOogKRJQϐH+Lr.=v@P{J۴v$$K!Ofjx em]ܑܳ^;@3 |`6`uUFY;T` ^:ir֣oJG&&vNnx:2cB4x Bh8vQ w`bmϜ7{rsj, \^ҾjW0oji䩉F<Vd[+A$'XNi'SkUT@G)%.Ԑ \P>{5@ !o6- #gO}t :+%@O@n9[`LG֭+ڿ7iߦpԡ=QYˏII0, p>u}W?;ئو>V#vceL2Bv*t`l.oTiCښ#jd8z4e A@ Ŗ6\}I.DcLәJI8A%0 ͯQP@*KC/+7zj!nE^NKR ]*@E=6ʜK >(&%ݟmCrhA)0T|`G`\$#(8=, &pIJ 0G]Eo}I֙@qҫ^e^e '̮h~NYScG"CQ8@m_{ܧ~3ɖ9!|$ N'~ >&7.rJ}J'!g#ʘn T$ؖp hx"J0)_2ۋ1(YTا"`T^azCA)7`Cɑ(4cZ/iņŃO}$^XOcDq8c;4F䷿[kH9.뙳#!Bki"觇 `LV#y麰C5"-Bѥr͈djx QԾMHTdNiȂ :Y-Ts /Ӟ-(8yT2-tSQ.c ; >`J ފ7N|HhSz+U St9ShsR_FADSLC-I8w!1e}&*ݜ娃s@ФAʌ߈ć z''Y#~kBJ^Xӗ8`7R(Uo_T֐Z,, ,B!ypu+60x"qZdȇe(|5Gw~:SjCb-9AIeԸ0U66!ْ7q"=6Nvx+0np.A+rSdg}~6VVb$ H."!yT$OIW&@R|nFcuIg7Xғb esI gnAhKoZdwpuVߘ()a5> u3IW62-t!v#* 2؇$A+m@Vjj-\_#ibt?zkhzy3x MeE_5iiv83u6r iV?uMUO#,Ɉb&Bc8m`Z\ekr ҢJ 1 ^Y|>.lEy]~ֳ@yk8D4 E'nQ1ZDL.DBmٲG[v 1Ivn`'tEw+.L[2lJ' `Bgb#X\njJ J-+p< .gsXyFV:6&cV(=ugxwndW 붉V<^t!|Ybl_+v6(6Sh>E^Drs 6p@%d!;m!1TtNTaӦh曋Md4gyI.h nڴ~}9YE.Lj$p&6 dqmޖGY?bg>-2]]p~n-aOְ\!qF.۫;Bi@23˛@ f~Kdž3-j}ݚZK@p{\12`e|D@ $.3F3zkz˲X}Ғq\nXWWM;;ZY'T1ad3 fU2>931q5x^YCS2-:RBO Pl[h(27iЯ9pO[qB wk"]md"ոn)>d]pab[bH #8ȳ G-H-SiUo{n*/՗8~xϣX@`*KD*&nyVx 쇠% r)2]:eYF^a5qn0p4 DY#9&F6wwY+b/[ĸ& -IA<9椲URD3utGtТl@z1+"_􍋸 쭖 FI76H:ŽR:AꩤX%3Ylίu4|6^3`F}]l NJ0PiKe_N 48i%)e<Ў=!8|m&:ݩ!"fd]˂ CDe1lﴍEb2/K'6ђn^{X#B`.\B[2 /T4TSKDek,T׉ pwbȊDZ0H&zBy@pI]Tqu IH:xENFVZ}K; UJiIxI!Τ4a70)~q8h ,]J_u$xL" dlC*a͌h RϩLհ'(&}[U"uɮ`/͵i=R-E%e:(-HPg(YS%kk"םy b̄diQ1"Bs!1Xh^&kNSgˑBy3d5ŀ\=H&we ,QnQ׉T`߻ +Eis6$ Uyge qR$꿹i:+^ҁ}Ē;7d"uM6h9P"#KWtdV GP6(@^`Τpx;MZTr:Y5ckݡ: f\ L!.㜆,#2fFA,@ IȯY66cG'Kw;w)N~9 Q#{-ޱcm cQCQZ 5g;^Em:ܣԱͭNc!gR٣E<_2<] ?H씛]O88%0c"9_@EQ0qUA23\34V Bl3&.STF-/cHb&0.S.5Z.Wyo #I嵰B]CN1~8 2 q&h-kڈO! a*IҘNRJ{=!$P7,`KoqSʾHe I9kqPfEeZ)C>V3۲o~p6ꞱBX j})1""~ I7M(vuTI(u- m,pJJt hIf |R.42L yq…Lb eP^i˓pgϹh+XP%J CUls-ɑ-b6K8ƯN|}}[`㽠w(]4#f TT|^mbq7,Oש/cpb$tP80'A ae (oy@'QGc ʤa*+ 966d%[^n*7Í @KT<4"$mJ ^d%yqO~[3ѥT&K|}D`21۴T0;*ƈܑg>ϋAeq i> ҽzӸ{Eg781v MIuYq،d%$ZA/.,A-AdrOR+ې;Q[Ӳ#,ax} !8/lLel%N ~TnQk*@D#-SWs)ie&h&}$ vqq97Udٲ9V864RAG"T =a}}av%5qHA@2 Գ&>n"z=p-\R"[zPS^7)!^d'0{^jSQAChKGX~~Ÿ|ocTn!c (S!vEz7:L7JuwE)qϞ 'etj9r"<>*Q i״oIB9{mIaƒ@"ߩ/L-mXY}BX%rp<9e(@ܘPt3U-D!Ą $T_6m(㭍Mߠ? )Mɫ7(KN%jTcXU oZBO&0:;,YCQى U:Pz50D|[Dqȉǧ|l6)+[h$]t&JK 2\+勖+;Zѿ*M6;ˀ0 )PЌ5 AU|kӦ!)1qR$ e$9& $6eCI2!O~΋MsHEg2,|LaB$;D`$%Im4`\"jKz!TYXhUj6dPI $ah-C$@^T@t"N{P x +_. 6 3 A {$5Dg 4*PSq ν`6ĤtTW)R11-Ab̴~LϝhyhEDGJ iq@8S!K;c5sj@6FډmZ 2DK䝧G^ij| ;I(Sg;gESA:_0>@tI䂀㱋ԄaDeTsTGa.a0A ^HLg@,c Ss"= V e(|ј vJ<[ly>jֈ@ξP#<:y,>v TB3y\t? ʁ7 ZRwRa*,ȨٵQNdzjb¾=R Ȃ[0*Q?ME zs2z9Dtj!%SeNXt7wS*{>2K9Ts]uxİ8^DŽDeᰁ$34{1PVUHOó~gt߯GF}-RB(&E,$Va0"=؞X2dDP]uč T#x"ݻ ]IJSDsg7zb!<V0N<\ Q1uFd8%ƭh / ։?8' t>fuoyc6Qͩd0Uk m0P%SKKxt}_0<~_Ӽ5[vnRD4QyrN R 2ו㖊9n'qaCwCfuI!B @ FC uחֿ>+ @ucUIw?Y3%KH9s qiY;SvTh m@')Vk/NkIY \2/QzlO-,{W&rHkn&پo/[ ޹3|w/2zqh:>5;_n8B<9~ݎ~}_H{o׹_p :'KޫZ(v5_i}l~Rx|jcuq}ϴPIۍٟ8"{{}({h[/o|o~{ {8x<}MH}4~,ctQrߟv~ۏmϯפ;Sf~f\⸰ki{_q؎&, Cב}sD!2@7qx8v'a<M밅"6 ؼ1'v:xDk9K}?rCE˱dp!G OEZcaQ0~onʼWv{~&`e w3 ~n Cp~_nnǿt?=ء\Ԗ <jaIv3t%4i}[n?OX" .pqyJ`a!Xv0K? 4Cpv &Dצp<߮ 7x& `W/-O \ŷ;9!Y1|F:,v>΍(*@2 bϪ?ż$e%ST"D}1zf|v=_5e~|^{߶7n?ц| sRw'#߸C~(㶌'lm`Hƃdoww sh<9$8r ;wRz!͆idduAJp)i;t> nn?LFYka0\Z j!=; N~/ğ&PO,MZoSBEMzl x-!E[T6_??p |f~ .4>cax[xcnglsJ}[,Kf{ V0i?iI{c/9ح/uT{Zp8?..8;wV`"i!(K\=6+Ƚ[@\c}Ό(lHW9>G^M;tH!9݇vO`ՉWGTD$n߳3d;,w.'cnd?n/ ~y5 pH?޽}c7icDpuJynq&-GX mH3rC b3gk!0f_ GbrbVdν!jv4*SDPG̾0' fc?o] k 56B# 6RpoQiNs:iR0=g18fp|IDAG]!3f{ů׫KS `7g;BM/;Bu.r[?ab7J,hܭAxufEZaa]K eE/w0cΥ0q rCEӄkDkarW.?NvZ ~vZs;.SP#(=<kY{yxGmi5PѫWY$!BUQnK}]â(Hsz-$ ZK1i;%bZ VWԺpj$YàRXnzTF{ ޹ѲīVcǴ m"- Y bv 1:EŽ71[+!kA@LZL@5 n# 3)ÑoȯwonCGSA"_J߹}<^. `gi$˪y `NH>&/9",Kw%*o{[Wܯ̃{O@HG=lп={#Rda;֣%V wDs̾\G ]0wטD_5)W-J]> hRp&_#ǒE?$hez7_i22)bĈ1=B]%*Eψ Chp6 [DAʪ.̼^g &Ru+v~s)X M )Lܹh~-23Q=7w\ D3)3GR%;1H$Bbd5j'iUxih ԆKR 9~V/[Â=hҊ x_eğzIhn)AQSdz^ThKNwϸ<fsJ=y6IؕL;@C O1iUiPv815l;w\တsBؐ !qKt'NKO:2=Sx`Laԧ<FʐKp9 `"YQ2aOTJFm! ' WFߡmO>_h=CH""9+lO=p!e5̵!DasUX FhVϙT%N*adȩVW%3@Soujw6onn46XN5O丏=KCP$foэ0T bQY@Z{bO_$  q_|9vuV붧T@#? Ԛd9 Wg7-XkD"CsKb:m|JkTN]=aM6`ڵH%Hr+?㫤  U% [!B( B MD ؍44AK$;I]q(5%▅fE3[CIOR -J#rWr$Dw^>'2/i7HB^[r{O.(j n$ߺm %B^yƜjF3{͵bZԁnA Qn~ ԰浗 wVF|zn,}di*UEALJq V z:^` 9z!'GHb`:W8 ڞ23 hcp}E X @~y#;}O~bTBpE(%=MKH~o\òJælҊGi5Nob@$:.bЀkkǑ@X)e|Xe=[ݏ) ;RԎPFZMj FIBN Z#kKRHl)cفf /YR1[!ߓ(3!끏,0e4"GdD$, je9S(L"Eœg-SJP!*6`jlUN |c8ޢ6a~I!Aغ%H$zܫKJ/r5^!ci4*M̑d1ݍ#ygDbu ƿQ 98o*5@K(OX˓-r5 #lkIb$eGІ$ (QTC7°F/LE2s88ؚ lQy]鼁7 G2/$;5ҦV߱<ܚMac@f@L`"W2mk\`NNW*W ADoۺ)", QhP ͥ +y2C@:,p뇇]Ds KDZ*į hۨ c<0EJtL'I\"X{vSI={ [`ͪ 0&蒰xJ Y. B 0>D& Tlt812"[9oRE FK뿺WO7fBBL0HkжʛMp^% 47(9='BD(1+0Wښ'p5z-[*>|Fq\RFRa1Sc{+(M뼧&($fD6cr`2+jL9T "f,"TmY#PUs !>c WT<4J^#>Fe'ko(}2־+ǎe,-"-8l(MTJ%ZLr5=0"' [OQ0@=SqPXՅc|Frk?HOfJN,@(6h2WN*%ʭG{; I-a\s5m,Ăb$Zt`yv xj# کg@~HLT-q9ypkep*thփʫ1W-y6^"77z]Os8ՌÊZSr8h:]TS?P#;4\> ƓL 0fp))=ߚIh'N R.X 2owTp1drM Dx:raO:E4N8a:&R*mtㅀ @jX8?7[  /&T*/zbD3]uEJmS &`81{:ljsսtV@ƮH&;@ . 85ukۭ1ߊuJ 댆%,fUHބ|д:Oa+6K^@W$ Z;JN=R2(#0u/V9YB58(QmsZJi Bڸ/e]O0XEP''RiN%P72;=0BƨU7NѮ{iG*i0 \Z$ eS2|\9NC$e*/RD8vKI VCl;'Yry沨@Lﲅ/NC) %UVO"[ G9pإ]!xJM3*E[=wGPP p2nRE:P>X8G 7/q'Pgtִ A$"5`B0dXHhKPiʼnACeO'6coF(oƬyj= QK9A"i~⊓^ r9jXug:v~.n 5;v&|y&)9Σ4Gu;"HXYIGR}DŦ,' f <$Y(]8njdʊ) .j/ U9j?%H36NobkoRB4Q)ј -5?Xm#*Gf~\.!`$iy2g'ԹybXC*HT^F 3cAnc$g.i~;;'PW/O{O:ш6Q^yff)j,b̆lU i.C/+ɰ<{gˁ0UnRxc?0?{{ǹW(g1j@$Fr6{yM$0 kMPt38H%9{p}C5N03lMCs:uKԛ! X*1шla ~\5sphS1es'M߯YFUـfL(㬀iZz%u9zt&O}|\s `g2f\MbU#]'Ǒ+ OŢyMgx-,BPQw!i1C;yT2ZRH!k D< ™!蘈1aa*rӓU#U4/TwSj1JM2Ur=NE6g-sH (~D:tDplV1" ^cflop7#Sa~؛$qM)ǎ/ Nj]R/ XI3_Qckɬ7q ]^_F\B:h),z$G 8r2-#| |qyxJFh‘x޼E?E 9OӒ*%hJIbB!J%#4YWnVvgCES$\WZbb)֙6N1v^vY\$B:G!dbJ#@mJT9r'P6yl.6rq>3(#I6Bf,D]AѷM+R{;@,`P$1nr/O#*2gp\. @[?hO+5݂^f;4Q^ av&JF'X'eN  Ys=r}Hhd GeyoʒtR-5@ᭉy{LTOWGF,Yۉrqߥ| R ?2=Lwϗ'N_x4F`.p6vN}?TLѐ@w3*=PSQnM|2ZUkR ,ELS.%e!-Ӂ~HLTx<_W%~'hdI&f(6NQǀhN8"EN.A\ 0#0}' Iۂ T_)`%!D8s5g GQp WTp=*Rn fU7SDZqw'ν8%0Pv_R0Q\'F9MЩ?Z  Q0Dslߋh6 \PF;I:/1\'?BS!ښlb\EYƬI4m J;ר@`*N"r>-JCkLEcێ1]˩:\y+" r c]4`Q |8h |~~<$`v{X-"J+n%a+Y$ĀB*E$mvvbƜ}%\=mЊ% mPq#Z+d+Ң, dfAVrtiz~,25 [`A0$pmt^mН u-B9E{PE -p9jеv';+;HJojP3|B=߹0f:Y,y<jX"$P 3gI )<_zTH$:S1 @لDz;-$109- j5aāG| iuZrYl6@+$@.x fO7eCV;ʇMj0y;1'~w< O``U"[j~66W/@`h0}:$B_ WOt2"@l?JeAhu+n]КN,<͍K;8恥dej>V9oNJ#=@FvR]q'u-)OE:sB~J>\ko],Km(T WpTrp41Mi*dj馍ǽΆjԀiKP• f[hrFi4w# J`Jj{аٔw+P0y\O}Z`ӗ_M97^?AdZW"ӹJa;{#OV7 o7[*|p)%!>v<@:8l)0qS3O^BwVI^2?8}<`?BV#'bbt{1/PT8=GK҂n3dygPkWt0SWgX\/ވm- o-ĕYj5 hXj(H٘@/9l S539p:E0ox*k~E8u8j Q^!9i>HxHK(kG 8p V6WhyJg|.z? Q BÒ9>5*؍ӄ*Am={ 4*̿5Ͽ#Pڒ 6cG^ Us][dV#?B9MB8OBz7MH=qoa p?6E6G,-ƌX@yK\A }1V~4-O'E%7]jC D h`[D/dZOvƞ`y Gwp^<ФJ}xc/f_ )(&j6A!Z㐵BXZU0H`O"3jcG ~tDt"^<ɬk&d`!CokypLʑ@NZ^2bI&`T`DXS.q|bW%\14EF^w|tx`dilDnEy΀N 2/ tQrS&`(.sSG]|7zL/I -F1wӸ[s)pYh|Z@G /ƥ` BˑjdwQ:@F ^X[# 웣m썦EE(`G,ӰƨXNywZ{mQ8Vb{dՖ@5Up *8Sl )`L<:EhX c4 Ҁ;Q W#d$ ҼHΓlhqb5H}}VVz9㷅5?wTͲKS ۪ץ[c͵*[K 4:RbP"Bh k,szlX ,{W`Q1z#'U?޹! )Jwu&}Z=F 7[@# u_IKSQ㹦.I.%7C5%ڮ鵙zH*a9HK&`P)@PV蹗@W$*o^}8` \EUFnmNnX=ߐU(g]"A+e5ID,Z 064asYV[(a}#mml/OBV~rPOH>N?r2qG߸PͿ .VE)@8tdEAN;N@Ad`h9dPA0{wRC=C67(87Hʈ> 9C0R3iH/vf L|zKw&g?}15EC|}<"MQ /|&QCѻI+|ǿ|K_ /4 e}Ê[aߥEƋ;}xV{_ 5ҦA/w}Fcw~=~G?jGx2b`J^q*Ȇ䙖ZȻ?v~AWWĕ$%G<˯jAu/6ZĩϴPR?,zk'gAF ? 5InHNxu'PNvcsu9!RDȷ D*k-Xg<3:Y ՁJ|ul \LlKh3ۑ iZP#Na2SrƐ\l~9e˓E_˂HWDUjҏ<~L

?~u񇅨2&-q,!Ni܉ozK/xmY Q U^^YȍgER#݅S@%^}W׊/03  Ay^=^c!w=L* T^c}xj H0^BU0Z}LRw# wtpB9(}kV:ː?n-AJSu δQrVbE!ȝ%IZl0 tPn??%W@'uW:اp,Й{jȅW^ -`@^+T#Kxrc wu؁t`q:x)DUsz 0WewWa4#Ԇ:? \A_ؓ Ϯ ]ZT]6bm%U]tќlCE*(5ݢB`n=Y1L0eџ*koNi+'p+b݀hۅ\*ӔM.)rz3t:}5%s.KSd{+Bm]Ct Nũ7rbER#E6z]g25H'srRSndho*(cg#PagQ@*Xf$b) /O49 a 1yww+H7T]hVLy;30hZ1*@/2(,INi釔bT˒#!i!x8 R+ܟe@q4^8XtO-^uʳ牴@r9lIHL؞J>TT]T`듀6#p&/g]8m5r/޹6X8oɺɵr!'"1KFJ_i:VtOi92T>HB9`H%¤pZ +v0V="4z9P)iWYw%~܏AJn#Gld9&M gӈ¬Dc49&y8ġ di1nsIJ^RdfmS|#As?-tJ^ĩ}k( pFBzږ ڍr6W}R[{n8 TE!}^hY[PDJ,,O^Ձ= BN95XQŠ7A:2h@ TQ/s^y!4+Q@s7ÚCE'u yQ Kf1o%y#dt /R DBO* ]FUp_WTT5sc$5#ؒ¶z$b1bc؀4t=P?3(ED^ ] 9jv2<\9-GT*EQB~eP8%!H\|x2*^:! :59"4p bN%si/x"0҈1̀tZ.wLŗUXlVSVL4{DCLEn< w;p5x~O\cnq(`VI& FhRi.6f "άakqov6 G >h_Cq"Atzz9i㇟Wr1BU6z |Mo\q٩V7sst~ٗCOrFwݦfsoy$Bg ,=gݓAV㤛?i~7lI91O@mStNȵ'#zI6Vc-~a)SIJK\9@96.{- `[TƖQ$&:Ez `٢I Z4=q5|]o;.0F%( e0;l~I)!eO/9CwO[Ɇ݇%l*! EqNe.L1Ax&0 wlhX/K0.ƱI\VZlNqlLLB]qBΪ3yY7"witHr&hab4Z;)kuUMk82"E!pqO{0AysFYޠno_E&ZGxz֨ѹJ0X Ķ!"WaA*`+Bl%N8Ե!-M 5&c4Z='Qjpc~.2Ax>ɼI·]Xcℑy_ M+ 䗩3a 'dKf]xԦTCi1U׺wYrę^S *^/-o=19D帩0T7'ɱ}t"x dNVfs,н+n ~ǹ!ra&`׼ny9Լx/t 4eFj8F2fX*M+ÑR@!RZf_[fY}X㐄_!bI莔8v"췑3Oɺ3\r!R&ΫEs;M:Mۏ$<ՏO?+v=N6 Oƺs]zl!ׁw{ueBazտP>bOo㼅{/|?moƱoaI#% #^:=b;+HW ]]:oB?W"6ˌCm5gEǁmo7n~/0[HP%71EJj n XVG#gkKbrx}հH)d싎-le^8.CWf\sBBȍ-%h0Tj]z W44F<BS=zi5F~\ I J Bŭ@M\~ZE\sIU#9"FE@*'wO<(&T<| I4wٻu.eo DA0- 6+e#Y3R<3:\ǔto_iWR'D9G܆\ފwO|d7`}12Q6pθҐOpwT&'w4I}?Wjr2$]ܲU/e, ,r"=` ̇G#5u6Nav0rBhvT.рbg᷂ʼ8pE(2{cݘo+Rz} f e.Х "ԨNe1rJb`<$Pȓ)ǃHdMA]iAƆ&y~}/[4H򍰖 ɱټ<@%*)D2cb8@wUwJcrlhԔK(r_v9^+{y.n=f &U*W^yRS"T|ӯC+miJ{q(:] W+|HISbJ.HJNX"QEU_O.i6\'*V+vet|;%UIW M9Zb=:K h)*c¥Y^M6@\ t`& ysb ElHr8`Ip-ccx]}R{j@5JJF1^-!#mz2=j<`/jl**`H(g~`dvE!B;Hpn7\@^!s]G9 ;tsB!'PۻvL= Vv8qSSSmF ё.#xKfKq4Dia&>u e9K&\@}\G##VRb U/ }d`0xzdܨ$QL"*Y%cl cN+yWsPs#Fm,Im 6sȸS L1mcC~}>O?9yl%~5mӆ= 8'ϐN*|PSZowi:U CX5=Vwg2$V\LS6>~I>Jlځ(cK?< i̾w;VP6GN[YgX4G<+t *h;p[jɄ[zEVV5I-Bh)1{yDTR?wom8z U/W|;KP|;ߙ Ҍ g eXJw>8+_DZvLa1X?KQg;׾uDQJh+*ɂcXgGh=n7Y^@ 8[ 5%-d % E Kl~-dN`Z.A>"*=jEr`Sre s Zyp)2MD3#ЩLF:2MӤ4OTӒ{C4/'_ VUkZTVJTQN- RdհEjk+%.SS͔o)@c] Q7K*j 6]#.9rgn8xr"u*JXW|_2'7FĒ[^8s82ԯebɫ!k -yM5U/D7UƓT[M.5-IU<8-"&vxۄWdp%ɸ)d<'Lh2t\rA()'F{(@DN~ XyH30cyCZ'UX)/D>}IAxI:@mm,s(iBљ4w kz!C|&ZΑ ֢Ł$crNHQ&JMZHVyMPr#"^dݏZi2lLT@+p\a1Wpt/@? Hr ܑ/gc!B''t1|PŽrX !^\c2> 8("O&s9*++C\r<,eVt}@  3߾0 gJXՒ95W/٥c8L& [A s""9-\MxZ@ URгΣg82\|R⻷5d'<;f&?S, ?*)%@Fyxf 9Ŭk87mCl"=٨Ã\0P&PBZs(Yyw~w48r DXuDw֪tsoo+!̻ĦZH9bN ruh.AY*0hś/48T\[|DQ#0eK''9MQU[Ei S]m SeVk#G~"%Br@Gud 9rhp=4EgPO-L J#PGɦFM:F&l ,"$7 ϲKS"/ xs'-`$N0k:+ʚ*Q\ 0N6qJ~M/?hL"5yex^``p7DxHD -. vޕG)CVh;oKz6q2, |SYc|{lڄ{^QT#k7VjPM ф`ťfk 8+n l, ۈ4￴(%RX:fQ_JB:sO/~x6 o4`Hb EQJ"d'HG Y:zKJHI{1ƥMhߟXE 'Lri j|(PYՙ yhI4`O{.w2g = pGj M]ӟD60Rlp=/s4{F黧ߙǨfDP8mOkˤG6$^"a骟]kQl5dQͽrP T_"HZۍ$8k$JTg?{h$`S|}DN :_WFƇUc73 hS9Tv_4$4(r#ҟ7B08 ءdzLmtwxrz3KU|4kġBԃbJ>&z hCiudH_ a/@eJ䑁VlJ,x(%>kF?}ce1;Z ae&ϡ)齎DG&׹/[EH #|U!Mߵ:b]A C=ΦŔ{?%T#|<5SL5s7FתETgpu@i?*Bt-T11Q갦>F(ʂ}zY+{c%K'UQ~2e18Ss |0?$s/ } `m#=>ElB!t'}թ9K?DB%MZrFBnQ4ʄ8W=󝒳FѤ<=$X Gx.S\G4Qkn"&/ŬG\6NI+Cp}A$5 Vyh2,rjV?Ϡ|ɋF`%hzN[$Dq$ }, i -hyRDM!+V@e %LABq)$v/j[&os=kkzƶny(&x{>KX YP &;HvL޿2έJN=kuzIl 5?DŽY-PݢMBZ,q?Uad1(e|hJܼF+mXDtRlm1ݮ ׮|l"Hs!ߒrS T`G !^6JW8*Rв0sTN@LfaxH:T{<_h/UWpNe6dR0f" %TgAGKZ& m00Nd^WA0 Ӈ]V6/O̧ A?F/ ke`5Xo*[ y6:t|,ITIC izP>,BaU7lfvRC`C@O)dՅ\\LDmQZ$u忼:@!6cVцZvNFKgHz}Y⥥k>$φNy 9f$>lE햀%Ȕ^鲄5 Ӆa9SM>q `64],5>)/gyF# 3&p^&'zTƆn!rּ0IHN zQ-|}"_)G`<8V`AJO  ʢsTAfNd&Tl>$~@( 4zp4Σqa S#,4A)v4QHfF!S@%2"f-IA'.Gªa4'=̔ MAIhPCz~9==@pZ)bIkA) Y^8ҁ,f Hq8&<<c ,i<@H5-v?L6cr,@tP`J9:- t[Y)!>BD pP^*{ʿj^*lmՁǗeu92n=xMun 6+#ڴ@'J^#(A0&w4FauӘZY`LPOc`.'Vr$÷>T\пGX<|KeD3nVޮ*(ofv݉s9<:9!E#E^].sfOHrZxi: €ght#}m֬QWDrE~ .>0 ;[\Hk>_GV"ЅRq28:ۋAj<{>Qrp$Zs`yI[wC+= <["ĮAVr/aM@gc3V5 D\^-},;,%hJlJsѿTc+Xwcyȴdp󈣬zz8qY# rMLEXD }ڠN袃,~kg`gb i .:x^ &aK!`44cSGh#捉,=Z 2g6M9>ũO$i+ΥRjYm7X%nA+N>aR+cVy:tM:e:SÉ"G0H!#@6F30Wb5aʪ̵nPxc-giAx1ihYn%EtH%J(7bs4oq`MmdvIw3zn h,.C1ǒcHr*+FFHz)ӮyQ3&͆N`&bpj"!6 0篹TQ@\$$xy"D=eW˃ &aYE781bN nr®!IgmKkqΈ$bz%V ] ֠4m5d)dOB2a!2 c'jn{q C4UCP$̕)=G6jakh F(9q~]+yXxQ^0(" =|ĭM'`#iց;5>SqYc@(d 혔J H yq)mK/WXW#&CV,A&9fvotX9ϛ򉹤`<"ftmDW0ݢBjNF%aw{q |Z&7&'`9jxJ he X -F`=?ds"g?4e x2*K&dxϯF'&)H!tDiFn,AnˆxGy.q(T-Gz2U\7bAQ"\G'"a7qQ;쥢KeHU9~R! ʷ0oۊǛ__Z'dLTD0˪/?z33+g5u-|ӟ~L/ _BKT턽~ܖ,*T_R`0O0Up{LE>o2.-/(=k<S҃=BpB{l2Kߕ('~֥SӪmں*ܮXE4B@^C.:B E"={m-SܥGeB2kx@4ǟ |珡0704F ^AeTAmԧڷ`kҏ v 0 Jc̀5El a?޻֯~TgC2j$6z[]aMn2  i:6+X1=!Ph >U|kbaew/@V>Fņ.jL[&PD ɍ-E|{*`iYh 0yRϼT)_HV5UJpP7]1j&gz癤Ī2%S&U AYq~^7Ѣ|8[(Ufbr krI> I'xBkQ~6r%pyadpL5G  TPeӪt`1G^#Spʈ̬.3Jh"({yxR'OrAXr  BȜLLiB!N#x^YY?C TΘƓfл@f{݃tB_цaF_9G}:ݒsC )X`nꯦ :IOAT \+vXlPO^ DV<)y h%(Tyy4ۜEY#Npd4*8;S&\QfE6n¸z aHVbi&%@ v_f?#mMѪY(8z Ib([ߐՕԱ# D͆BI<l ^ lP8j6pXk85 rϲըGP3TRc0GxAQފ.=yD'I QT=WjiCq\xrmRu$i@z^GƊ\@R唀RIP`IC`  -BiZ{ YӳHNפHPGJkܡ~y  r1֙PE4j^2PP`0[AGBx  '>ڙP2خj~ᗾQk4&3px+,ɯğ-闾/iL׭cxdHӨ=]|חŪ0q{6|A1u]d:ւaj5òaezJxA<ӏn;̓l~^}!o9g? EIe&q˼A42]{1i ךmGGЉ}.B%JYqg%<@d)2*ŊF;r躴EEX~MP\gǻzPn^Rjz<ഘv*is(kbS΢Wux ;ּB]֫@n'8eh8FBiYn͜F:P,Cxfy>%:Af"ҞtO|MN&IF w(c$? 9 Xf(¯8%7Y $S۵ie`\)4U-$ ara9g)=GEND^+~<z?}q^P*C8_Aal 0p, :A^*YS9t9@ 0`-`<>E>"{TX6J7f@D7)RQm<,' qN"I&07yXD.sUwNDP͗RLV~'ː!lw"E%0՚>#gPѲg/$%`j9/[.yZ1&Z;fh1S"./'jy:a3*OmJIQ5e+ \"/W{rdZ L 5-fug 6HIJ(RwIL!L<22# @ fbCAv P"hG0BYc}yy}>}^{`IFH+QKv^8pShY2|VsZ|:=jkjs[OZ\@xԝ~Rʹwa!A- t }A76W& zd F$Jv^T^_c}rKOUMBRi*tTz2j Y$a2!irI~J&Xt,l79 T+g9K + ޜN%uM z-㸀!#4KM?ukobOiQʥ11 P::Ȗ^$n-6d~N{Bk&M9ql͎ DT\2&2R.cɁ8sa5ÿ?4?ҷÍd^gDHv_!vGDtJ=ӛyH4+?ӯtQE[$y yuWAEd\l*Y=$slO|Q:qb FYygQh9}⹹\+)}@%Y4 묛?ΒtzOU}V,@GDyjkO=eQ!KνvPL yr㦵01)K].o|UnS)G}ii@#HܧYyx14SL*6/uBr^o~ݟ&|z] iˎQX ?X+%[^ftJ `TޮܻgiLa-"whY +Jl({QQyRiE3B%g nӆ&0\qȌcڰ.*VX6 ;W^JT+_#~g0pLˉ6,+ܯrfMSq^$6 jv.fMԹ$Y6o/ҘvW$+}o,2{~MkP׉=o|4z)r[lpM/Ѹ@ Q+S ۗ$amYs`}?ae1oMưwɔG6V]P*4s!z#bX<˜x,.@pxWhg#[usHMiW,5qbgP9RjWRe!b ߯KA=KU\4(uJ:{zApTo1dfȰe8)Vi~V 2g ^plMu]i@HTNkc 0/6tUe\ڐ5f9+3>VFikv Qj=Hg!UekwkߒqۨW= d[:`=ZzϤ*J' |ct1fI=()~Yvvzfc8Az/l~ݓ?l鏲8#xOEJv=рY@EnM 8xyf|d<V@ps ՇdĀ 9~j`TI? z ڜk+ ˛ތr6 +Rw0% ^  p ̢0 G K+;74l}rj-y!Sbq苙_mihר4=Vzh >-HV!ǟ^@4J ڈpC_Tj\')ScG Wfh,P2+g_&*@+3XۃZ)l;z|8ɦd{2F \N'm^11\EE;OphI]ܸj}AWqKσʧțTWAˆ8s!IuX>\D5Ж=72_:{Iv_Bѥ>(E,o k<ٹ mNd\[]lOD{JQ Ҕح|'Ym(J3cv]eށł> Alr]mU`9~J3Ps Ӈrq*I49j^`qVv n~.6c옔$4(sQ4[gVF)7XT/a 6(` z1ܛ~6WrQ=B6l7%z1c}w Nf0C pҙcn1ZH;FRmgF/npC7]|x;0$lM2<Eؓsh Xo ZN ,%ٱ| ?$1 Gw%ՔKqz 3yΓ'D>>أ:X'D8dj7'*yf)9 S >o2s0@Ж]W*J=īșRU&cM-~k /ܶ__ܾ/߃˾*sP>G>~7́ŔVˏE^iu&46z~O~IV)E60Xb -OG|I":ւh6g?zo~m~0}BYI N_mFs5#̓ a+)KA_cO M|_bܤKIױ_=kQpS1m)Mu} i_ZXz[^Vy#TilِyX*%ߘaJ)Z"*E`x@ 83Ex (C*_wZ"*3%Iue!`Ă1 h`+._l57I1rᐦL~-pb.ԜK\ujV|Z&+oF[r2-&> d_5O| :O뉌{Tv_&Zs4L-Ep] ̪SUwPo m2 \2}P˫)3%o}t_M&'MX90@m-7/4PpA`[~[y T_iعύdAwZL@Ga7j N|0O FݧpRc^W]аfSjY[>a#o3JSF_# Xm'(m wTVFFGH %$d#́2nz,G< ]0xv .hf*)E' zr_eNu?|eR{. zCKMћ J*4dx`T*ͨ'_JöSt-ҥ@9j)[.2T61AyC F}ŖG`ئQQ;>gN#.wDY6JkU'l@B>6sȤ%RqʂNُ;"SqT⶘s[goGH؆N 2%VFn3W[ux! Ԕ3kiA@ف2QbVW,6SIg lŲ5X攣?A#nD]h ޝ%ɩ֦$.[e i@fJ|n8 m˿CuSfy4 Ěy]W9 Fݙz_,@_.L2[ƙ]d0D6ܭb>m[\ ,@:=Z>x gvN=AViy 'rd>],dAYՠ?i Ӷwf-L!rJ1س (FM8oEٮM|^S#%pYgP6EW7fhH./DW}b3BX')%?@捹~XTC&7|dg0BVKCsh pNju 9 pA&f+#II# >v3:K\R #^[@6a%wK >Ɏ7)mb Ϲjj@Ke\$F: !WwZYh fv*!J6[%m"wT/qhaت7@ى6xazY޴鏚_8*ԮO!Ր}#^Je|By`?k؍-Tk'^M$U8? BJ^ȯ M5Q0;xLZ'%h2##3P0] 26Z9 wΉ*(K|0XmP| &vM` s4XkNTa@M}Q 8yrtղw}*ѓ+zz%虄y L,DJ[4ik{p. 0p&6zWՅf^*i馎3KCN,s jFJF<;\f䱒 sg'4T)Ue!8P IV˧sVn[4C~bn˗grP^f xّYXlxKHTͫ}"HŽdi;:etFw fZ S$XJyVHl(b0C}?jpl|9z- :,w+ +t'\Z0zL)9CjQ 4_ЕV(溚"26_t!Eb؝/xU$Z !XL-5VQЅEw ڔv|[Pj{D)#ڇp@;V>@O;Mٌy*DH4pQ~5(LQ!T]H -"Of]I[q֯<}TOVE\nGCOfZ)P (څZthmچ"VQa/g4;20q*SSI*G Az1wC~ 2Ew=HLL[FOj'?ymBdzL|n~~lµ,{bmԀw,&r㮏%x'ʙ)%2Q:YDM N4 MYwBzX64Q& 7g m_SP(eQ >9z.PB# I Q.D'D'{. 2ET QN~0x???ԟ&X*Jbag;4k]͑`-ovZĠTVW 6im˰hJ %%׆)1US:'/1A ^oNk6;vxVTJ7)!P U5 Mu(}j('ٵe8 Ⱦ|@^'ii mfR=KH Q>S%r6 )"۽'lն҄ QT)4gNjk]eZ;8 i[5RNhKǯS'R|λ`l٠rp:˳t i[>V=;D!90?jnI6V?bSrK ʼ_OR观r^\QKUNZ,@jH8K0vQ9i5=/ SsLʶJ+m,siŀ L*o \g9\M>p|,D{8hY3Ld%_k#߿}szmfXoqk-f6q.uFk"Y- 79%_Z1 "`IN8IoB`$X&3dcK?]ߡue  H0ڄkߟ/VN@r< ]algGuir/soڵ4=;oțK6ˀFwrY{?Z3=7]XNڡ+SD}E47 ǂ[LZ)Oȳ!{0õOqC6i7{&KH_PkoFXR;ȥ5u9MRa0Ě ޑ,]38c{!3~2z˼3sYJ`t4T;p 3ѷP0`hUNYubdDAޞD98YEQ劶\=mt.\Kb:Դjg-ʂw,`E,:ѿ.hx*'օh8~'7u) tid5]0w߻=ZZ۟?7)@]ܙpm  =LsFeXuiX YTf5P:0@k S8T `dlr{4`^ˆLf(޻qP{* 7,MEO+Q7*' 8bp, 4%- dk[}Noe SNK=b枦?aW3[!dAYDHF y6g87+JD|BEh',i$%L i3#ۤ2cPr% 2u,D1Ğ3 Je[1Z;EHJ\ d$N~֫F߼]{@dLkb߬铃AOǃ@hpRA7WfnmYOsrgqt_>c\fD: FW75=KɎWz]7W0H~zʫa=y!="!M፰"=gLb|@ApR}ffZb\@^ B6jxt. 2Q_e&civ^[ !X֚SjMųPB <'&STg]2 $U´xl_1h-kb-BdTĝ ;aFVBa^/eOaY1Gjjh4 _+5 87K6PDpԤm L#KQfL@wcSx.Z@ϵ$cE}~ѡw[s=nmN3>&Dj\o2r䴈q:aǺ%S Q>2 K]&Źg;)AN% )ğHɊ=oZֽq)8Ԛa%&8S:~vLH/"ѝ$]#܇Jr|dui*`,ʀsf)Y}1eJR1&hR+Hheo =>r u4UUR NG99f6y>FpcDž)&v1,!S:ݥ儽xky2!)ɏ~pYBiPma fļ%GIt]` E*ffI>q߷L0lKnA:>3& ۟AM1 BN(Hǔ.<= 2Hq+3w>!`HZ56-7&75)Q.V@X&% E /I0"A$ uC BM.8wB%0Y69g #ĜH]|2.GY[%akj-͒sR&`0A<3ش eG|mq~t{-\܋6τ#0`' +tf1n9DEBJzoބݾc"IZ* qA}GсjT' g4fJFHL<`xi5wE#kxu| * @tZuM'R SenJߞ2@3Xi`:?O?=n?s{Qpẹ>xO6C#s0;ڻ:# e8 Y+x+_~^k#a~u'/E?ݽzoߗ/h׭{גSw~|mWOkkJЯrsΗ_ظ>FsKk_s7o꭬"^}el߾[o}Oe~]ї6']mѱr˟~}{w3pE_t[Ucg2W,{;i nQvJj~zg۫>ۿi:3S3Kh+̨߯'E~V_ANzT HRt3$M;vYi|s,bde T/P侧ppO9HfZjkuú W[ _|oo?nGoukWﴚQ_{Qu{bOZ'•Bl=ۃ.[߈^l,7-;i 7nwop7.#+l>6zT-^eKⱗ }-/fgT@^퍃}+d{C"ʆo!Y_o ՙ0k3-^a| { #4o6p9%g#Dr.fiKN"}~ f,WGHmT&<\voF&Mr ?m};2:4'$vn[sG}0f]X?ܞ6#.R/< T1{4NneܭpZ:,AEYڏ=ICiEtHXe/c _fL"j]`z;y/p5lqzU"K1Vcv,VˑK& Ȱ ȭhH0V6'ܯ 8^p[eZ2%}cB|\9)/;~).׵3hvϵ4m4vX]c3D'T&С<>*5,\1 LSãX/hj]Z[ I ^3jݝJ̬4y"Rv5p%he_@MxCJ LT`^f~֊{6T[I 3"-A PdtßY5ovU"6+++̼hh*fh5!;NKԏ-Ԅfk^x &7PMF}ps_S@!̹:bbC22%a(׎[[rg۫M74 ml* |%*ZRsjB.:꨺Wx$G?H7+UOhaCܩC R&n<׽(2]x&zN#m]L\#[j"W0a~l Ћ?_n/#i]7Be ?T/'Hc"`Zb]oyhw,9v2HJ b5YIO74`2%,|}?k#:YBCC箉Hcv:#bXŀʭC! qνh86uUA)E17,D0kVFT-AR )Io.=R^ZEu L+cB muEy.a݌VN,-7-6@ y'kunOSMO*i55kv2Yf_z([ܗfZc`3F؝^Sגv8dԾNq۳c{ErX&ʆh 2`5ܡLnXHO$`;}i?X,-` Ms4!H)ypM"RG.V'P f,-_`!]hd8br[SJE(p֯J!5Xg2)8J&Ě`R 8pFh 'féL}Bߜ461kgqZS )S0_ٰ݉oߤr|*L϶]jz Ny@{Py+Z6;i"G7Mn(Ð6zO f;ЇhjA2ErtlŖR!bR\tt5:8~sHn`K#Osj) @XC-Ёc )`DVMq)X/[yGdivXaYDZw\[>Xv2K6os.N~'-o_ g. <&vcjvMx%X"B ?kpX'(leGܢWJх#ΎO#}kzۉN};-XjLmfܝ G^(q0♱ru`+x^FBG4FB9G!734 fk5N†8Pp,sTafi~KF L8 N^IE 2*Sl. 8F ,A;3u%!G$d [[hb (o]trNg9p_q5J3?Z| gmKnoK/@;X tU:-ʰ 0q.?^MS l}Lw 8N}Lu^)tU>^{Kf9"No5*v)_ ,`L> Ҽ  x$4k*"9޿:Au~Zٵؔ9mځ~-0+;&_N\`i}ĊMZ(; jvT˒ȵSȔHҔ#@¨)(2)jXl|i{0 Sg0\:=+ik+ELEo<-bȇ# ~@s N=`kc6,wj^6 OR-b8i߈q)+1qR\؃5xu;F#ZkA{l^*7])UvYi/uȢi 9b{ dҍu0Bz-f0(0k6ZNct®XwӪĦ)d$ \CI҉{44а5"3-)Fu8QN A\ tH8b,Je*. id" {H`i@&UplüMSR|: v1 P#WZB$ G.yVk!1+Yaҳ|:ʾ"&笯O>jxc a.Љ6nS<0&Qdrh~MH%´ tH_GkXic4ʕvmW`GMl[B+CfG6chl]L_!}_oBZCx_MwǙC@,^\8f'6meW]cф+لh#%א wڡ IaE^fyuJۀAf,Xil6|O*ќӍ sk# މz0#}ɮ/c #4P[Yي2Dlv^x&M{S z-VTPl£%D9B6 cJ?c}T#VqG0.*Qeq2]]9=_hڀ䍥xuSatmC 6͑ O!pH#n9(r]Bbh;lO9-'YgEE p#^oOё,x bNCeUdg[T;K"L(bqC3{Dbo=LD:+^M8:8; a6r@~:d΄5m#G|du!BהYd0…fwnђ[{LHd b#fد>:2څvߎCͪjdρۣ#T h[ S%7uPބѰls ;#{Žf) E3d-^ۉIv{Ȟ$Mv1NUN8ܟ96;HDTr awf'J0Ot7yoT{΢{ٖqd4m ,pټJbM\- $rD5&4+Vj)4!o$#&- xo؉c#̅K !F_-&]Ԍ{oL'f@CPyK $ٚ}4հv7Pژ (R83zh IiBE 'ڶFRO_lc-kuJlX ڙ؎O.N/j5& t48X[2GP"Ī~7q۶˔BǬ,|"ؙx4$/D^, :8u]N=mA;Q9&.ZlC &ZtuQ‡LU 7#M 46Od@͋!88bNPE]az#k:Cov=I>DJ@4 A1dFd] wJc`gqȨg[ sp]V&#JoyOYyPT:;s"VQ'vv6;OTr^Қ>p 2N4ܰշso*bGc]5Mm8PG$62:Խ+.փw V]+ +Bl .Eol .V]*hdQ YlAY A\*y^Kt\V `ce%B$$ 'o^70~~@tOU8D=֪ f.4NaL2fVCFpLBrz:F L((VCpOf@}Јח$;2Jg0dz-aȯ[ف`F<9̔x:!hM[Go剏7q*UJ .1]?)7na4HTXZs֪VĨ,EqIhmӢ4.y^(kR  WdU|eMUNҨGLբj >sk zaP-Ɂ1ɇDcSL(NI,b>2uLO|1=nl|ktvV AZݫ&mU#j(IsҶK M@3pWwVJzmiNoNC*ǡCtVi,Sze3OP᱐a8gSP{O|J UqV CQ9N4Cwh1;*D # 4OÌg * Ww+wEDwnw;^&o!;tlu3. ņ M'tSfL̎JC`̑w 3gT" gd*Q"Rqh&FA?İUC윹N5kҲI4̰ ف!Gdw,+ U͟X[0'vcŅld΢I7YJ.ъrۖwp-RԖYJ=8}މnu| ,As^Bm_48a@ycy˶Km vY(!\ŽZ{ ӵ-Nwē5jͰ_A5C/ asq^"M3*}5V$hv:QI:#s8;Gފ2|tiF%?D @ Qބ^!kiɞ8[//p9P'n\h<9'Gub#Π"%z6U tqAY.ϙڼ@XeyW֚)vMMw V0wcuؑw] vRddIn, D= 脠Z,vH٥b֥!,䲰C @3~.E2e fxJXĠ `@@b<SQMt N.ff^>X sǑ fnzH2  XpOv=N$9j~G0`{>:H6+ޮ<\DkO0Wqb#og56Gdقm&W` C{᤮7az ki6T_hYILjÄdlwrHD<|hd .J6͹4!D os5ʺ4Co$ A*vV[Qib):{ÐT鯥G@4儡J*}*b%0h2^%OK7"0^&d[[d5 /PLۮ]%t-(zL-C iב:hoZD: :4j2rMYVSlvʳY@,.v؉:_2[8nc DZqΌ<,߼W _A'V5 ;j I0}1]ل!cHSwAA A!o4{͸Ãg7n5] 'AM3o6@p.9ŷp体|q223Px&cumut ;s-C&h?"xʌ +Ŋ:oe͎=c\$09TJ PNH[^O2y\UGɅΣݺǡf, d3P4s^W9qN6kఈ9uCou5_4Yjw0]Kl: ̹Jh~ց&vwme V8X><ڢ{8S"˯.= E^C0+hoђ;p0\G8'\Ѽ}$剑)sQn/z)oi"ĭ;F@Idg; 7)dR jJa\N:>S(NmL;2(;O-u_7`xdl#Ffs|܁=Bm-^Exz(ߜ@^)wTM3~(}T`6uY o[4½=?}.9»+bK4QlG)0$7A" څe؏r`hώJ˞EEjlHКzqxgN`JqvmhFP?s$3sAMǹ~juPY aՕqig }| _zқN6#_?[J`5|(|'m۲h)P6g@[tpo{E.4o 8'Lo'VO^xFF׀R(N^^LI0MARUztNA> B)B#א#14| Ga@geC) 29@_e!p!x6~DJ}NkB@s3vn w |e'7C1i KuX 8 ¥=GQkB6id\H"/ K yز2~ `CnRS܂#uE1َAXS\o<2 ˕G&UD0sϱw',& U-k$#HG-8{ VӞZ6iWmڙvnKE\ZC:P;H&#v&]o½lXxRCj399~KuXG.坐T[1Jّ47ӓS vV5 >u_<_7x .0)KwzAЌR1O2v s%x[0VkpvlBX0M 4 }}uۄq~-:صA]RDH5&vs<;]n&"YhB`Cls/j'ئP>¹Czm7͗ɆP6g3U= Կ!;Q*& ӀBH+.P[mzὋэ#m/][r~%A%ɴh(- IW{4ހ6Y6'qlw)ro)@GП!:ۏe@0 1yt@5Q^?XgS^zCTM 4p aHA8\ί(|;K߃O=,NΧ>{wbd]+ }Aܯ>l!ϧsBr{PXR M"ڜz8^c{s'W7N"t;w:kԸif8 ӽG.*O+w=m`y!s5.k|G:( dq"R[{yc f,a뵰-DKlP%rc:qyQ?[2iDj`W5 G Qc>𭏽 '`B|&ܯŀ5 F}JuP#QqՖg(euLd(9Jny>%h8 ņIJB.R' %ZDڸ'NfPw~cK2,558l5uJlN܁*BZV5J)/w_$dpI͘)H CõD g6'ryd͊ảB 0F~ ǯpMӤ׍N J;CGĭCAdٔJ@n #,fp7C%`4xCy O٤zv }'7­}Pg̵, #Ɓ)]^_/TDi ץ5!L3zS~{}n<<nSmO/g~NCmS[r׀Igf%z{ ѩ>fYvd4FBCM˸98Y8ȜT@7nM?^'΄ p`EW_ d/4 dЪʀ [D rۯ|o_z;ޙQB٭Z۷aҎv~/;h S|F>RUQ݈)?4pSZ XӋk˲[#敒Ӊ w?n][S_} 5x=S}~ .^pΘ[L_i8oGNDÀ#C=Q ЊڃƆqudu(`E__bNp{"da*BNf>9lVU*㤜9br[sI|ߠNWM߁xw 5o)A ՗m:B/K|_.mׯT$MPq9 hT'2؝1,/Ǽߗ0?JI*xLy:bHmikA]>?Mw?9PnNR]#|~Ge\÷/^x'@Q;7"׊0.}k}7 2b"Q۴ Ajm.{,Q&;趎"@#ml ч2'`I<6°Zv>cL;Ͽv=U󮿴?uç c??x D)uKC*2]:' [Xsl_ T8VlX@*-.繉XcA> |"p~Sg]jcɩQsYǡ6͙^NC<{+k>@Gr5JIצӫVze R!Llps9 Erl{}p E|? J(ЖuffkV #c6l"ɱ_M$Hè'$ax`>p _;GmccDvDR>-ય]^|z*0?:{ٱ7?QM |WKP}8H(?f朾u"P1@ S_rrlUiGBrP,yzڑsTr9J;!/s.i@o%6S B #x+\ ߺwD`#}+Eu;3 <.ۺ44KI >5ә1M8OZ@?+IfRq 8CՂcm#o1NJ * `)`Ld9)I]8\̏]Kp/Xkz,rL:͟'sN)59T's)Iu>9) F%$#;OSCxṛϻNf Mq_"n 4g3{)u+ip CfGR,~ rg; i. `fjhCux"av2k.(wv1 N2QSo<]{~>_ `@%Un!m bٌFD_NtP6֔P]=PH/[Xve 9҂b$msZX?X\L|9L`K18 ӹ;y>qN*k:>ҧ韮?v |$ ^9>5V7hweZ4=]k0;f1}"Ѡ/1 'LEd^p%zkqroQO/ }AFu(~9i~d^ޥg{ "dEٜCMjUɶf'w S b6ڛ `%@q;f)an::%95ₒnP"R +!&Q,;~n^8 ,Sѹ3< _yuFj; F>兓jmQ;+6G؛VVjMO 4oQ|̜xr*aNQYm]6Bg4AX >i 4x,EA1@ :^wBA-<ޔӿ/BՒ G@L3Lڷ^L H(4:2W/e? q'i [/y6VMH! ,B!BmDG8{o.\zC¡I8sEN߫R:>~ǯ=TmYr&&8ȣ MM0ةoGQC̯Jj' {&ju*ڑ5lSIn?yC:7oP"3ď}{ox%o02`T}>&w3΂oϽ$0̓Hvkw5BTBRt ݇0 BLlrC%Y$q> ؞{_ FpKߧZXr(eʪxj\D rC\Rˮp cS~~;ݱgfԱpq01-aSUtEm֘~6%I, eOUbB7*4/^* L(l򪄑]@7dqߌT Fǫb" b y<7S2vOÒ U3fc]x',xgyO.yY*J2s+†{~+Py]I6\A9m;-epQNq]~Y*%WE)yW(ཤ9/r`?A;㩧nԯ%8vW;MOqh[[n *'a F\/2L g Z!SNgT>ll(Ntrlqkw'qFkHro]AV{s>pa}(PXX$VNo-߯U׊OrkzM|D1˩1hXT 6)ڔ:G0nlJv`j}Md)kّf*M(}]&~CYz޶!ƝΕDawJQ$buN[h0~ckw"̔;rךwJߟox2Ɯ(RG_"4 B(9e8 h_P-AHñ$p9ÝGzwGdX pg=6} n~Ƣk% &Zf0>]Qg5?c3ņ8\DxKR], DnLw6:!`@+puX"ޅ3?2ھ?;{WQ_n arMb"ޤ֒3}zGܷ-O!d'p\*4#Ml?)Aq ǜ(9F/|H8چUhd|!/bJ5ywgv\dG/n=`zryEGW7b(e`LڙQ& CpD]H;S#-1kO9mG hu&TH+;5xܓݠJ]5o7^_eGq 5FB6~z8%(jޫzSbO.?;~YK(o *ͼ$}P8yu*)=8΢ ;(9%d?R!+Q>ڀPC؂X PO)Oph? RZ0Y n}@p=qu5%csN6+*!U$ٮ|cp%"Mcb4e$Y@2)b4#QlvĦvwr/>̷-dTW~z9Wd؁3~c%rc 9%Eϫ, RDVZ #li©h"rUH#:Q=?q$07nĖӮ=:0Ve$תˇO];lW2:wqK'mV(ͧI1x;: Ҭ,' ]Ca.gGC@;7 2!0,\T(Cs]gt2q'7I2t F\M3k_406#9d\CI7t>~1-TM#x ;GpT2 ֜&dOmY ;:Uc1J{,Բ(*j(^|_,\_?ycݮXvRZ`K?kpa^ћ2cAiN#2q$ An2MR:#'jfJY(!v;Fo? a0͙ѲD)vc* C Zd W/Qul,A}ulXO+!+3HBE$Б ;;{1o#>`QNx+9?-&\!G5N%வP!tg=`*@c|@ ޼,_ݥD4R4N?]X1.&aGk3( _+6j' $F/;7;f 'M<*u P 2f4 `ԅo|A"O:OqP":Ƀ4VPY(Zsf#Oy})WφY''qWq@`r7oϳ?'#HBJ)^Ԩ$kT4RϵcWՉI֦Ѫ{̷q EB֪sH^8 ;.x&jqbvq]zJ]Bud(*}i!e;s w̳]%Ĩ:5A }R*؍ g'g)!ad̉k< qݬM-!z׮%Xk?ycfPFk rZppXت3fhfkKg 0 %羁m!~ jE>;ߝDBg[ڍx(C~l!rf\4g А6_%oV_uZU%_A/ x(áJ;r)5'&sڐ=Ng0V~A'^Qb-e2R9!:[Kw؅K•|S MA64ͥ >뿗& w[6їf[:h~R{vfh 4Xhc6sMG'6C3ݜJ-OԪ5>ԴO9'zkɣ-8n^M)ż;Sv>Dw%1ޏR/u%,CfХsaM:MWbK>I =餤!v CadE=CsRPT؈:PV/M.ks<]|sp45I9x1IK^ F۸/kjSZ)w`F1>&0&}}_jRwS+VN?MP:(k Tq L7ˊoxCChOi-NK:sI%V ʯ.)#ۯ?KZ&ġ#W Z'Bm'}X ўhff8Bb69}i#:Fn=U \z!u X~̸<БY`usq߀e?r򹒎6 lt)VSC ;fiޡ \2 |Ѕi>yV:`1ƥ)z~~4 -9oW%#A)&ge_g6+@Bk*D sҷpGucJ=On {>WϾlQa_M͔B3踥ŦJsHGѲn&ikf6Y13]Q|tG= !M&ȓ=A;O1' u?F 3cqkVStZV9Yy?uk xXʘB)E&$때3罄Rm_kbK5)Z}+םK0w 6"e#%ak "~鷽([#|6 ؏*&_ ߹3 .eDdXr2XMqsT(j@;CÉ|U[FΝh&)F'r9Gb@ltbr 3t}oE^*R~=aaKtcj`*{йۂ#݊9(ɻtiI|~<٤ϔ7\r,+vmKJᇧ8OID-"uP ПLfQ)9r1c,t'Pq J`}g">$1|W#vV}P{/RDpG~}wCONZ0gDוK`{*o+}ѣ\o7ȃOurQ0 :O"qs*t&;1Y!Ky_X⫪ӳiw/[ЛM![Ku"a(Xr7 ~xܞwzz tR˚Q,&ڢZ2-rB/|t7?Tc6 P" p3~9ދpwݍ\ ޻𧿙.FDw,gpR׮퐵/||{^ |gma7X .7 ]Uh I{mjW( UТG{5  䲎dZ=iKܸC0N9x<},]:2\Cz^:;=7/?߿wc< f[MK{](*fj=*T˜yF@> ܵ6!tĠ~-ZՔ˯ΉI;EI/IrQHiAl}ӇH̨?~7 =v!5kM:=4f|irWR=.IR-8Á2>+l ۅAWq )ҽ312L)c3\ӄ. az(} M@lvL{''کm6 H4X G-o۹3pp}[rX꽋or ɥgͧ6pi#;t=a%PGzlB&=8J;]+SI.UY(<@JW+lK?h/_*1k$ _BPQ&T/U"coJ?kYofX.Qh[ 8Nk Uyַ? O?'jd}`$Pg6lԞNE 5=ڔ| K 30㥈[9TݝK}Еt N`» n~{{৷ȶm紴zq;6{q;=mN+g^}?-[o]W% 1IKWcQ-oa3#9zbp麓DfK˭aF)Be[niy8hyEIRKos"p_W> %29㠏)ctGF|"r߀?Ǚ7ZVf=LKۢ`,7ajn(bFk@7&% *_i5A-p` d7瞞"|zV>}vW U4Lbvvul8wNNq-J@q=xE7n q]Y0-6hWlkLZrefRK%N635;^=i`;MNV*gP,lBK'HTQȌ?ƞߗ%.a; }=XC)hc]%xio3hv.qfp6 6dv!uAe@cc]ݍ!Ojpۚ4RF1'')x3's Bsm Ƕl'c%壘rI w?JKK߽۟ !_|׮%XU.=|7\K7YW6b )!K%c%; 䥪B>+|Zб2 T'Ҁ3ʿ}Snddž=GUyw?rQb+ TKRI@+qe)IcdD d*wTN6.AH[{ gp#ZQ@M H`M;?jZ5 ,_5#uB#08y q5j`ek\|OsoCI|TI8*A/|1&خiLK<jua %ǃT;C\^%AɩJһlv_ؾ'CJrێcؓyE9 I:t>&/uTO?¿zs8~]f0 M(uXvebn#N`hQ x-Cq@J_"8ȥd#kI*![߀ͩ̉i;4>ؽl)' 4pOÃw?[|_o-^cuIqzh),:[kS;^d%S)[5dԶd<ѝF /~[F/Ab A:v7l#Yۖd[I8xy:gksx)o:Ω3o}[c˴)KF)IqkTd>n>Ou^ Ksf ;wWrk5[! ~y%U gMNc\Ct&r8Cʊ"f#臇qӁ~2' 2#86N1y&0C[OC60}0z8tNiZl/28lKp߀MX;yl#Hnzg1aWԲ"HO X0eR$ CNjږFLC ]x`Md?=}2|8ΣR](V#?T'8OWkc-3܏\l>f׆\/u|uTB_Ku QL/_;AD3 icf`v_|*Fm LUDܐe kŗ,lkXqWKǻ}r|sEK᪚sc_1\ $M MT`xC_?E{ᾇ \Oktvg (`oxąZ1qsL^|ÅVmsN.7L4$f8'E$.R‚j2%BdEIl  cueN T| l 8uaq XC6&,Yـ{jZS.Ż)#l7F!Ft L/W+98û@|Re8yFR}/9/„uR:]~~͓^ 7;, ?E1>F)JX%D p"[m 龾Ə/d|CF^@T}{MMAN0+VB:4Lv^DSoߚ[MA1P)[4|e-Yk㒽a #Ezο~xX[S t&4k~4'CD/ -~#|cGp݅$:o13 eճHkNA@=X :g꓿;F6MNb$s(NMC :1>7n|N@hlyK0q4dz*}}Ǒ6g#([ݍ|$);3(fIPB57 !zs"?ߘ^7F4nDJjǘ|@1#ᗡ?sgU%yPM𨰅#8@Z[vswNi2F0`Ju@a< gpj/-)gh/2+Vx<;lN{O58yN CJ]y댽r07VNGu_d^Q`DHhTNz ]0C̀}3͢PhlaT}6&ʀ x ؼa8-X-VȢMUˢ]{|NH9 3Xx!n5^VpYؓE, o s6>td:NM`eiM C^s >]=aj9O񙳰zݬ~ty!+:EI?2zF#ԌRnG `-P4Eb60eZbRz">bBpPD 8yO^6gws3^W'<?1`6iL`VAv<3Xs8ʹaֻ a:⻣L.u0 i{C_ǝU6x 6qc֞y0iՆ1 /)ŝ Yw}_|5RYRln:n9O)K> 8?ZUX hى>' [S a^({eo9k{$XPQT#1H(G]e ge밃Ux΅׻ &}g2+]tumTX>sOg84x`ù:ʍ Fȸ rq8j (qgjhS/:W8]Fw K,쳉HXw 2gwFTDaLJw+o# `L£yx 6`|Oc)D, +_h*i6އn6Z5-s@L&)>ow1%?xKxasyqԛ!`Ӓ86dQ`~,TF9?KSlz f D?D5iFcdžR~98Q3t &Ҧ 6Gcp9nn& &˜=U\Y/QHTq_.:z-|󫫽b}8I;Ra52o3|'1^Y~`If䒦1rwTov%A@Zxk Ex;(J\}lsZt& )  ˁ'`7CjۏeoAvXK-+\-:zl T!*=i-`vIJij2yZ ~8po nU"!gF?ѝBtu,1\+PFdt:]!Qj@-I,F֧'Ž8{w?B0QZ?GF@w ` :%`p_SKB 6/g?H8\98@HS XC7,Ѻe %FjBACPt?yDf0;9F8k8ʅ{Fb*Cs.D:,uSWVz~uL&R~o}mv={A@q*lvYLoM;"CF-Ğ$w=Ql3^ JOBWY83FX iOQ,s>X9h;#u C17QѹϣKvB_7(=)b@p^ DڟDv{㾏­k?v.Kl.81=$<Ԇ]cp5Wnhb\AޝxO )jyg՛;f\t|N/(줼`sN|퇥#u@$wbTeI&ۃ? '=9;=or' (7 9@7=v;s:kkO齿58δ] u,} bǸy+[rJ;Lݑ׾ׂ3 Gy)ӡ_.~?Fp[ :egO(y&PJ"ɸdQX㯗"HéE$4$ _[+lL~`*ܠ#3V8>1sMZtM '+٠|C#}i2p Y@$eMwjatᮻ3}?& ^$j{7 q~nz\Ё×ȩ塮~L}ZL+*}|?xK܏,3nP˖ާ)?[abe;Xآ~Qa&ݡL:wWW<t/=$` wz~/z~X|>/ZȤ6`2i#RoVRn@q-b#p.;.Wr8Y,`w^(c(2@%T]H a7*pOL1T7~.`^(͔!I=No]dQQժt7uĚ ,G{QuxMW9sn|:&я(ޖK@yo+UJ҉H8.yV QBA i {wƛ Oc۪ȿ뾗^3y(=[qn67E_4P +a H˰7:+Ļ&,v_7=|nڪBBl¸!*@zL7vHǪ@xwO.:gN~HY0ee^{NkHϵ'/]P;>ol *A3^g^Svbf!\<_;xrc9~]BbVFw!1n fıއ)xڟe9X/h-ϡ4~1o[TQv$ ę}ՃO=5HB,]6cl=8]H-DXg@3e(@aZzT+X0^ExW᫻ YI*W?? 0`|30u-V6`}.@nfG #jBԠeGC^R3K]-Cw(W f/pDIH)7!|rc6C$=*Fʀ d%@O'1 8q5*Svh(|e< z@xV^aNgZ:bg8[s.y-L#ȵkn?{xJ5f=[ 4X55UGUaG*g1(r)<]Lad)Pg,݁NJ{|`gJuk.lYJ@oC۬]޸PhZJ"Bte@S/VLXl'l8)  qA28͸FQpN85 ; 8|whskewbw K(K~'/l)Xﱕfs:T'K̻!&Fń}L=' dA'%@!IOHNUO4d S8> hv#u̧ B9~csCv2XC9+vHb,؁ CN">}}p}JKKrk)E L? O rQ8rxxOȐA ]yȧ!,E3Ww lM`oJufq2'ts6yDωs<#` Z5.7>ݯ^K~Q\briXIugkiA#,AARdCtL$R:.34sӁũ1Orm++3e^oF9:,ǡƀ1)2 A(4TŢL^ÍOeN *C /y2`K,<Um^ LHT%vG6d7+&cm8RC_SOC?i j.K7ۄ98 .Ω_)Mqure8ƃ<wEANH` څ7.~*`Ɲ9x@E?q,_!i.+:_$#Ѿ<"Y8@yI\=e0=;G @ XX0\MT|Qk a%ꁎ /&@bnM1t߾ ?e Kpt?9t=uPwCܷXe'@vzr} {|M $ٗht$~*~J8}lX~OflH =|$ zgwvyHCAX:_1Ji6(cu(wT:wdJLck702o H; }x01'`{֢=|a@ w>ǰ~Ǚ2)&ROdߌ< g~j7 |pAmF(U)L:}ʢs9&E6<++p.=xKCN8ve1o͎taz2$& [vƟۓIl)_ (̷;ʥ?7LJ- 0L[Dn? {@Va\fLy/d q:ŤB6$[}bBS,( ťXI݇$F?_ Nl)![[{Z,;=-E@4ö4 p쯯uCS('Abh0ݨ Hא.2/ , 2(!I_w Șh0AKp#X)%'8OЃ_y&kBmupJ$:J*@9G 8% x}[2(d6u(*ܳysWg!omDe  7;R6Sogѓƃ>_NOFaizyV0O2c?#R?Q,IA2BhZ@Eu+,x[¸1ߩ:._խVa/La67p{ ]5?x@ jFYC6xZC{d"<_"¹`݆9(1WWl|V')" 9HR#Vur.G'`w))E+@o1o#'Oـ^;tӲ8${ WppҧWR>|w'bwRcyz/0Gy!G\ySI@b-_J݊QV#UǣxJ)x @16@dkXB%;HYsr2K˰y;r[ͭ`anmp,p[ ։*rar= 8u$:b[{cXY^waMN+YOkَB?h.@Azwe{*' tc>7~NG>}6\_*en@~YKC{0 n(4'*y%ܙuD>J; gag"ώB-yVVVe{h=LZ[uz0}#@֬sYt LqM@Y <H-={_ȆDk`cX/=#U`n Agx}%~bUexl/@!/U?@xNUja/C z<z`T88<$H)v8ݽҽMWڛ(# -: z1 e4,Z#l! Xɻfo1&@Bz~`Y[$1,4p=#Tz ~2~M\hpm3+M ,CBj =9`gW l,=^HbTY0o8Nj468MyTsŔ@4Xh8TA^(k{{HҌƴHƜ54~Q/J1K&Պ–[][ZZ/ A'?I4\^db\dp C++;;_ < zOY(lŜK7 q$ qDC&L$ZY v,&RMQPisA9Kd",,Ց6W03_2<8lAt4ٷP-UL@$h3S/ cv亿|"PT <0N? bDYؕ߻p+#v_Xԃ*bfU&C4*4[P<x&ҷ,LL%y}#yMbj15Yafw xmw5# ݠ@',`[`Cוm/Jb;oQŷY*`9nw5t_K HЎ< w:JPwH%,ʃLF% "KE%8",:1W9AԅB"FΜ3݂ݬap)Pv60ˈ{D+KXHȃ6('F4 ȣ c9cy_1~r? DwA$rrtZ8(3 fQ1ԣ")%."!wo)(@pƠPFp60g|n.=^|vXR5(@Lc'E e;UnSS}5CAF Yh9z&VoAv*uWC,{`ld%sR2O>hdLjD}&[vAE9ߌts~ M yݳB3-P4rt5[. 1YϾ3AȲMW9ԥ-= yg?J*}`D/s 28rom*,/?b.\Duk ]tci,#ZYyκ%"!Z8a QubJԇ00I!si%؝9 0-н߀_iFwK4hAJ\m#U"h&=`ԃZ+Z_6>eE 燚 xOy(Lq{6g5TGm}ֿ p}J<`qJD++{O;5a{`JLZ~Tjہ|#OVao&H5+/b@_`*'Β-'qLAW=`|t?:;@ v|gjcIı20  ;[to~W}f+#;d{Iֲ u#h+pϳ2On= A_4P?g'KB(IǠl6 WvV*|ZXUQc+ ~\CǰYe%8:ڭxJ͡iC,34ʃ\G8hFjg(Z? ݀w׃ H`(&{p0H8ͺJ[5x2;V8 fPv0!k8({oLVE.oTbJv`f SLx68(@:n1ӊ4@wx׸=WM8S'ЁvZE{, g}+^yTY~#1 Baev[)-_p7f6j~slѦ5$Ptz8p~P5?x"sZ>~gC0 _<f !"Y/?'a NE1 Yt}[nܕVݢ}{l? O.XyP4j1L䊸-Urn˯}hB㿉Lb)/EU ,] zi*;MxfsC;_?~ K+τsUo^N"Q}o9J,OO|hxuc$dbbx@њNaB߀.vxII6'Nf~H NC|P ˥PC#pbJɱ|3| V8l;{`3gENV@=8ȮMk!^Û lN' Dž" _qy| }W[[lm&KM@hu+f,l"? pГp@Ojh4>"1N.7_k+hqzNqC`؋!NgYP Dͺ"+WԜۂV _χ2gEf=܁-3KPD3 L^/e߼2L~=X=,A8z?{?9)fdѮj*> Kν+ɅC6 _8^ |pÓ=f]5$/ . /hxO|!DiqOT (6Bav$GamJCVt2#.HK 2o[`ɍq0 pbR?}[+ߎ],_ل] _u.=piɳ*1P -q9 %p+:r(Cpԯ7塏++2X͵f"g(*sX[BV Yֿ4D[n~%3Mo}E-0b |$ҙ{E] bP )|#B0~`x7c"|п w=w0\z~6l-.׮^ߺu.Ěcmy7( X@\!=!}K ;;n|"8#Xu^(:+KP{z1H.dm>EHu?j(w!w[׃_r"l_UprrEGy-gia8 0θ|zmJho$Ųz#G\Oc=nMs7χ߃F=пE0|Ǟ_6)~x#8(l'5@ a;ucW`p Ӆ)k^lz&|#Sv`eǀʼn3uuU^8:Hy-k_ " uú߂{O? W9R՗ޑƳrtس @R\<7b T-ԡ1ʅEfsAEB8C:0B$.\o0ۤQ񗷮&|k& g]T r,s7B'P73_AB"%D7FR0< -ɔQ%87 Hc=O}n[WC;3qWL!3x9!݇h1gv'`^w{w ;{ݛ¥kp%rG_P6!뙱x:&A6%[> HHe(!ԭ 58BJO1I'zHd# { ցw2ALe.!\vMᙝmS3وB!IRM| (`> qX)Qw6[tɽ`+!bK,$[pXZĉA,ۣgp|et::lHWǽNSZ wpI߻!on>߼~n]VF(u` 8]N ?Cَ&Rj$d:%WePv󦸯}w^vkUExnsQjtu2-1W??IjcI @`FE)Q)-z $>RJ(Ux Yg7put8?Y7,?}G?zGgR71)Nj;F'>g"q lq JB 61ϝRcF5Uf 0 2KjK CI94*/9\.+e/Ϻ Ȥ=XA[e@Qa2w4o@K?!2HL^ g}ϣs!<},@cGګ}RrLQQ6)>i,gDyTbDxJ$ *j1 sYyq)CC.4RJ#Ԥht Gnk;~oӱ&/̓ It^JJ}Td7PQfϝcA̱x1:wQ(FiTBR&&h"1Yl[DL aidBF?wO3z d7iì"K QhԚX> c-+ᗤg,'rzCLg nɎB]DH%/Xp`A@;۔J#*&B/'9J3`ٕ{]jupc;; -y_2%GNjNYxy+[zOj+f2'x-IV6HYhӨr Ģ({?P( &򝿂?~PۥXNS2;pT[;znU% rZsGʨwhdR[B$V(ow@Vayy (RTV2kXS㜝b4]߀*Ngg,#d {d 9-;6|!(=D ͞h%jp!![D#E"]E^o셛?)oNR,䵾Xg^NSl)SZ,CUʴYX.2Bȱ y,sU^+;G{sT0d/\ॆOW+I'beq,{dX!xӳy!pM&<@<֎u[ݾ eNSYXf.@P%H`e&նr]s^bEHE4MX;&`HVqI5n@sNů_$cr(ܶxO$hbly,ChUx6qHa!}bQB%.N kҳ넌vKIb^TUb ]ڣPy6Yy$Ib*?6ҰT02z$Y@HuGz,݇Wɴi"vVD}YU!G},ť17>lp4B ;,'F]"rm{Q?Zcɀ|m.{̈́UєRKIgme$͵>q.W#Hӓ$m*܁J:r-@9h6ԕV;1C 3Al&"h`[[J,Ji,Ɍ8 Gw vAZTEeK ǡI&wsԚz9k^ RqctqAe GBt+`aHUtTf5(W)|&MxlA-!Gv,E"$4u 샌'-c5[^Hď)0* Sba+2yҩkk0d9"5ȦɀP<;z^%H).5z%Q2}' ?1=?4n9  >dq&nwNQj2l;47T"=vFCt3VY R宗Rλsĺa0,lvgdk`MdSJ 2NUjn Uч#,8L2'\ 9ƬɦHBK=$ԛ(V華[9ɔHeAò0G;%] n@ERK:>~EMmHڣu 6p*/j{rz(W/gvBҀ\V 5!&8EveL ^tnB!NI*//M a@RI]"@Y"ρ*^^QD(!HSjJ[o`c3z@Tg&ěIb[%4J<{Xz""s&#=@A%΋M9" n鉰QTER V`[Hf-(a*[꣸ͧVBJpȅFr plӸK*e8j ycdwo1Jex$xoadZ7g@26'v, b `!KlPF~g 0)Ic`gƪ϶tM~nZV?#?Nif!A_)嶓%+XZ  "%,\f_DYG1RO2)kAԂBȱE&jƆ$OS]VPh&pHBLu@v~V.ErX[Lj[2s&X7aw\ʳmب$YAOXg ߃vf&Ӂ^iM\!]*?It;fD*Rʊ!%QAߜ} @fy6b[3lksÔu#U q,%G*# ,g3 I|D|J׭sx6S&&gA*YR,xL$Pı1K/J 3>n>z[XIk`&kρEtw{3: ʠ-<EB`tz?<1#0cIG"bTgm=8<̳3-/J^Zx챏s>[+ܧlsL( g<T)Ɋuzc={_X&y R}+Ȥ^~~GW.Hu@scm@AXf-w["U"gArxݭN䔠IT} ɮ&3YGֻ)&  ئY[gPVFa12DZP>#/(gD:U[y/y3EE@BIH]$iY2" ,X;.R8+ǠF >~Daڸ{fR+#-e)¼tXj5kM3# D)WkÖh<_PˣQO2*o;HCˢIBb S/9%JI0)$efA$DG#RC\@F;M,5+u8@WQL2aY nO!t {$W3( G,) \𒴨&4:$_KGV=he`E/fg gS(kk`HSjT!` 1*E==RmgEgF\EI,5٠ GB"@J?/$ECډ 8ptĘPnYkgDj h#+Bu&s[ǀL  86Iz($STv0(H>L%:\{0;9v!PrS>><3ql:H9ͪm,vcYg-^T" Zj4rI'PUe(1)l+dAesZ@')S؈SZY-5 u&pf O*q 2#W򥔫Doul]Az"lSL ނ, z`\?Fg`Ol{HY֠mhv਄c[v(Ҡ !!x8dei9p@ifyH@3~a@ͨ#lWb HށЋGv_f"RD4l0PDVoqbk6&#iֱcXaCYʁ.Lz%`V&8i0XBUU^>3s8KOHo%/c㞉(Ӟ+]O,@4>tVvIreZM&ee"/z`aȖ+%&誔]+hC5"[YKOrt~ΎDnTaԙI/j5^_dVδCҒG RyC`«Xgd"WGТ]E_^(yj Y+HqyA-Bd 6IDrbtdLco RFoh1=F @l7`hnʹ}X(P{u`a+n Vgѽ CbaB{S bUd!K놙x3 d>G`s=N(,:Tvx&Nhx貕uw8W &jR[(6mjy;m1+kQr83"`qG,K"߷qFr ˰g=(- 1n -YMev'O& 3WդDJH[lN Scb ?)U݁29YF"tC)M jC=FobhbjsY 5>GpbB.|N2/:P["2Eb]A"VqhDc bF1IS#6,$u/뤴D"i/2RRڨM`,T eJ`tK @[hSBbM~g DFg (}lF{r(%elh>1Z2@ҕ`bT%O*@' WΆ8gCS `㴓)L埅op )#J:Ȁq$ZuT-B|Pj #R~Bl"m EZ`VX$ yY%KAb=uFkf<'KDuV͌[*JվB!J9gM,5vP'Pb*Z/BٲPѺT3 @AUPՒ%ߌ48WW ;O@1Fi+h%-a+be,/`&ԾJPw=)/ODj9x@-ir}e"l[La)_1Ĩ#Ҥ$LWM:$4'Qwj1T$t$旋H+rXJHRptDL D$J.beϪX: E)0~-|f:kNV(b:3('7x U3W#*TK9jP]dĈVEŁYDcD A $y5SBRԅ/!z+ ,< >[jz~:Sr߼Ǭnl]j(P h {$< %]m $s, x1^&kOq8eQZlb6FKdޣ*Ed'\Y&+ -VtML {/Q%Mb=E9E!5[jս|M[V&l-H@o\ã"h5grnF$]H*3Q4H}E!R.o?@Fv%ֻ "uf(!>zy-(Ky$MF*(Fq1Ť#Jzs> ,-=26aF%1$]"}VIw3ZHj]HiΜw\ ⊠}:}w+j!'rs;MFvh4,uujDoO«\rjR(uZ ,w]0|r-$\901=7ÏυMdY20TN Lʎ X7ʑ_.t  GA姤g>m& pFr[\08zD/xau~8KOV9bH:5t$mۅ]T?e;ldĒmdɔ2SF]Vqȏvnދ,'{v) OũK"p$˞⵱&}* K  B#! Ȉ*h$[==RJpT//a%ӌzkľI:Zиϯ33q6{1 ?a8 ;PBG"pt RZs<5[ ٝ8 A1WB+```э X̷"$W#Y'HR RlWiݗnC 6BuXyWf rTK@ $O {_+e|.Ay)3?O7&}ȱj?t)+.>2|2 ?/ʭ||mM̅1%=sN9)PwUZ)0RN{T=M1j##bjU%`jINf2T)MĮFQ_ywbbz-6?2M=Siq2j9җ ](ux@,5; 9;_lp&x-*q7 8I /UiVn,Qͨ-&Gؘb̹CTdZlv qn"jTM_w)j7HJ [*z #! uZCRLJրo|%#͐huyfNN(Ȳst(n$R"GgNyyy{oHOKLj܋dRs$'mL|3 _[? ??oG] ,MlcM 9XEu+QCյi6; G-9r"QOG޿ײhY XoIo!GQh**ԞLO}JVa2Twz0EF ѵʰyߒHTLՂI/2X9 k͗Q4nzW  r y?ߠ z# F#nخ&{p >/'0}G 0SFgN.:D y[`"P1#? goń^5@)[ܟ&E6 '^G0tN9: |*ƛ9ή^KQ >xs1&`n]Ҁ6.ٜ-ү!@of ".;.#OЙJ,p!l Sb- _Q…ה%, 6Cy8u 1_Pi?P092ȗ4}FHFFT*JFE`|z"ǧF#tf ?=c>u@;?/g>{:͹HEPQ0M0Wy2N.bH9 %Cs'«IWoMQ. OmtQ*0G9)̦J!YңiPH;MeuG9qH6, sV06 )Zk(s3`LL@O(҄\:0ZabJ'C5?|bEthXt?+]?(e? A#l?}`^1~DN5B.ц?fEggK&\F {k1(6W_uf>Dd&0ga p3hNl){Xf[MH]ɏc qGʮaw7OHLP Ha  x1Gnjq@c eTkaG˓(-pQ#QPyF摂Cj>or)N䕭ɠ nf͋?V> \a?j!ܼ-!;|4'WZ֯1N;7Lc *Kb:KP^vBrg$06@K<TQ[Q7$/.dBՌܙƒ SN1_4E ш@;NbNAt+pC`72 _'A]bm" T3#&8ӻNTs M±p,Jzܫ/T* :@Q+Ie^ 3ybAvnue8Οe^M&GWo8|wD.MpEWZo E`5HHM76\(sKrXa‘d͙Y҈X6V' QlP3GLF}4`H88cNF//cͱ9dDPX'xdG5rVҩHX&Ӂpx: |zN+[m݆27c1He>5< ?5CWI%/ Loހ9_ܰQ_D'דSg\x46EbdX" AlF#& TyI 6XĀPJ"! RJmZ|"N%2 tLHV1"B,?#7&\E3[+(_a3+ڗRQǠq5|'J!= m䏇. XT$dLod67lw\[$@ 5Gă ;-E\B! 8I6G$U֔eb>{=qQPbXu /GByS<™, Ʈ=Jxx&DB90: BL\->9N(9Uo;;) 1s| &aDĎcXz:T! B^K / ?{n\ +7!??P?^tΥ;.V6yda$''6F-], aHL:"Hce3bD*+>„LW<._ߔB'B»I W>!uD,S &ʻ(>Vq* (c6M $u}Qg bڇa(\L oڗa?x%2 6^z0Rk@ _ݷۜ;o.IZb5c:М ȻӔ$v_ʲUm5+gcE2UV?#:j*wʰLuj>QhxvIE|,?Q/ e<^rE$bedX).RIb6UB""+b#b>Vo^CY\ wz? kWt?J@d}Y؛r~S: Agp=gڪH \TY@~J⏭ƭ;G o2pr(뵔s|Ѡ ߹­h_pToh@ 4Degd,J94>>KSDĚ~'r#bʀ~V㍯O{*=(c0^ Ӿ%M|O,Ws|'"+S 7@ۛXDid[^ }Na|)Xhhpt75ٿ垷.rn l>`jl0qO>Ҁ4 m\#NT7)2^喐aTC 8ug;GI > %AzSze? P7'ݽ%lD.8QbI, 99JB̳;ӟYkVw|{%fwV lGT֬yjۻyC0zde\HTDvG{~|э<3w;]eׅ߯765"s[Epſ"]S@`ᱝp_3Bn׮]:XX)g ; z oŝםhأR<=rR7'Yi4ZHq 6ϕ1)@}d@OLzGPV1i]]@$0:ӴwQ0i*J?{ ,6{⥰G/101 )h  /<:y?*ΰgB>Z68Ka)rLcؠ2x@_3 UTb+4&R bjHzo hjh+BzQH,scwbŞlBPrq GD@ӦKv^t+No{3*3~~6A(D<0ZQĝ$t\;~NQB?}}a=5@| B#}JM?dp1!d eH?>2 xqA>܆*4"!WZ#d}b Eɷ )BΐD*QF-Ac0Ó=B`$z0}&` |؀iD<7+LӜr3k'cx0VD-9|o.z/?[`Џ/=~$MOm{(ZbQr/a<\aVmy7&ؙL02V$`džmjGPJBĐf~hؔBA!q6İ#Hd#a!ћ4{Qe`%P"Lo3 L`EaPJe|c<&hI f8b?&YN 3qW΍f3~>Z˗:jofِZ NDoO=WJ~zd'5r_}/A]c;2St]5G( - %4S DW`\9ڍacR@POI?Ypa<~K4 `/ liso&iKr+i.AD)u?& e%& gYۘeȎ S:ޗFQ;9icP1e\soW/}7}ɯ7@X)8A_a?4Cg0C!eb[gr |3@.`(RZi@$>Jݨny)"`z:FQU7SO $0-?mh5'"@<m 9l>U3}?娀cVO[lF'S{ol&<7SCip9udCOƫP2|7Z>[Z+dPo8 S ?TBx28,b#6ʾ`B9:S]~Z>'btY(WIHH pYD%بB/(XmHLKKN8V|vv>Fy?f32 q=HqR}Qd/,$?ǁ]VǸ}s lb'o_<8c<o+IkC p'0^hdO~V},How )d;GUL@M蕫:j ~<ld)JTiaT6Qh؋,-C-&`^U,C$2P>LJpnCDO`Aj$P,S7y1H%%4^@ 穾Jxp*`o P#Ї| ^o3neD@\{ XŊf0C ؁BHrAR_=ccv I05tna;f`bJ{MmJU|A X' u?9eEJi8u|H+Iy mCЀɸ`m}F#06X~/M69~jaX i/TP-$Gq׾n~5a_ѯ`J!ϫ8T"4.6VҐ#iv#0P*טh#2 kȌߨy 9 DP9"-8\WA 0&"=L>le!'&j:D 쏏%h SHn`yk֢ ١h0W@O5a_D@͙xo€a2_hK&51 %3)#SxQ.}^}4P|nƳ>e ?N>}t"ϻW}&nGf{2bje]1aʁĈF'`s&!ePs8AD7nHFuT9KO> b0鰨 NIBw2h r9*\$TMpS# YTP7!b 1˴_٬Js=xk|>s"sCTbKafgŪ^X|ڊco!ޯn;?o@ tɹ8D|tǻ4es< T8,+^Sғj BT6QFӄ"hhf0w &F5<ˡS8kަNN)#KSrmL3ذM ڤn?T_W79DƎ>%4]gFgg+-SD>uNEJ&/s7:Z%X?R6B@i_g3aq f∨L}&-~ P7acT d-Fyu%/JOX%X@yGoDj/$^W~_0U0= 5,OLչp<7 pSK~lgӏ3g/-sTR Xo߿ h. ڹEiϗLwκ:m3}6{ ͬ BE."|(n8ˑO!ykfa<> 35 cWk`GO2TȨa}^7K" aP} pOb$R1f@$7W2{nOaK3aR_艶mjQeۊ_wc>9MAX^ eM>񂸚[c/%ُԲ ,<_\1 2҄r/q&=/~0E1TnJao=%=O<{Glw8)ڏgH!o/8{ U#9FYXp0}ЍnZ06\k@ʀ/exbC +UƘLDQRVgEN{g HM%^ pV]0lt?N긣GJ4zDžO@"c}g#"& K?Rؐ~ckcSa% %]N M`oC疝K}av_8ΝN]'mG;+0? ܎ Y9? w3/ZZL=1N !3R/"@ v9>)lrm(XA2 t5c턘裱Q]C|6@|Jt5m`;R=X$~Ī\ä kad˔pӑO}D iL?QkӫWg0'B?)yPb|/L݇h0XBث$韹*]کrl#`Ljc4:]щ`dn@ҒK:b*{g{(˖D3ja WɌ`f*1&.f>+; fNO|ks1O166Q}1]Ko\;`@S%"e-~8 |0{_rFB>ol/|]]wSgŁ({ˑٙчG6#{7CFVˀ̸ǧmXe ߪp>X#Ӡ;U]`ָ9[o L}LA2 \GG΍l qaI{ Yt,j̆I~Oye~4p︼ ^~ʁ"4LiC΀Lt$"OChl͝ x`0w誦Zw#+/Fi`PT A!<4Q@R{u}6̧da 9oP(j 2xd ;Jb> !a'ݾ_v_wnZ ,?s fZ1̯iuMee33fes$H>#^TGwWqnM~ YW_175[+d{d&{W;*טb("/{BiUބ|CJ[>Ye*YJjyDP@psY AT w{Ϭp]=2g"TB{ d^ CuJ(NwrnӵP8X## &1el$s!o@wwD>2gӁX0R\MbFbYs ;g8;y{\2rOY#WA(_'`O}L*PκaH?fap,Aȓ> PI~=sb6k<|1Qc&3[sjN*I| z*0=gŨ SPtHu+OyKhB_2vsۨ͸O;Gpf ?#FNr47 &AuĹJ'ECY7Pڹ 0; o /s2ﳿtbtEOMѷ 4{0֟ `cHtxHGWw?hDc6=sg~ E@tn/Ϧ%hB^ s+0>$%/(x+p!ҟU(f Qyj$ W\hq v,[pj{?h6aE#DU_V\o<]e0zTNl;8 k!P4~mX ߵC> m []lV ^w|H !ܹpO$6N8vcМ =ȩd6 X${_Z,1[ wEabq!1ah㥂հ?s?QZE︕~>y8= 'ӞH%/౾&֙%UOY3bw0KYD!?S8`5>)D&Xm{tfzZKXChp{F$$$R-c_9k9S)QԐDӀV$\)D:6`ac8p6k#EDI"0q.=96/eq'0< >לO iJyAGb\o3]Of.'QXJ'T֣o RJ)[dC[[3N0Ja0 kѤ>zOEda9@Q>7M"a?|zOؼk[1M QSxPE "k2%A1Z1}C Q^\;]{8 N`}.FzՊg}h^M81*}D-!WϹ0߄UyO(TGt| ekźNU\g!>qlBF>7L)uĘ'};U3UDSQA azU P!~Ա!4긴%U^{aRN$@l|:$U4,$^QPXLJ/:E`7_^~?x'Ю04(PK?Q@3yCa5N}cONcBHB||{KOKY /Ko "{43!u.o/}HhwyZmDG @`ԃV1f mj|h?sHICFL9*U€ݘ'gfNyD'}Zf#J`]0a_6ȵTv!|O=x{T1~x?|֝~x%4[!Wu弝I%惌 g 3J-(v%~! z2(IiMN, kNw n&^;bL&p&M ##B zIN}ieL |B3pY+}F q/Rz<.VjOYxֿ4ُ^xs9ct߁ϭ V>?v$Z) S~d׆ Ch+AE XH8٠=kvWs9 4qW 2b^Q ^@W^C! ^q{} #wX*Y`9sy fOa`L\^(]C.n=jf-|ˏL9ӿ xVZO) 97oرXC`n 1JOoY6sYXj+@1Hj'  u]isoU ThEh[+ 8RqrN Yn,*ʍZ(3 y>n~5>L#dAd4Ь_ROI!5K<<,v U^VT.\ ߇'AKI-vWrp,Q[jeg}:PY:b@4f% ?BEhۯDL)w{(UZs5TBvHu&#PϤc<>yӨdXX0 O I9*J`/c;^7c=ho3`zm+kɷSe߉aLWe dRy؝;-HK#`_ q2 מr;~*I@YI}yUD^Oҡ Yk=Au:u7i+<ꨳ"XKuu!FրL2pa?䜭 \p/3N| S}O7|Ui/짻O_t?}f#ύ+4cacɅ6GXeDeCk +'00T 4O?}9Gc<XotJPDTm}%8N[)AH;9k(Xt6La*E0u2`h u{=d KQSӳ[G me_G!kKڕY3/|[trd7MuxF“?\T H %]vV.m }$S`+y;s+Zz"v"XmCXG>nǣB juPk?_84V;I& { zHwD=0 @$z͗s_bG6 5^LL4EL5Oj? s vݧ}Nn>6d/}x7`wªj8ZyЧl>nx*8r>s#}-^$?#}}N`ZA"K% *) w!tj+>O11lD{&b۰A=x4+!JI')t xhM%4I؛p!ZX•c5V!vm={u?~$X~%_yQu.@k4 _#"?F94k$WEݯGbe %N@#=xﱀ%n0w0|= a!lþ۩o>G!'A4BZޞ7;b4 j7| dX!7p|a(ԣ9Fs3uB9?yiɝcZWgj;w~AkК>`; 9tQڣ WoX18Ӌ8Ū)ixc͹g˯zSbHtm}TL^6C{?9y{ѝFqcU/B0F+nujNCY{H'p3l@튨NNa t`<+';Yaa| Y+"k6Ga<k ع*쯭ڂ4 J!M9(H^bJ9iCڬK UJGYV[#b@ݒy1 ^po[^%7`w6Hhkc` 02+xŀ^xS|&C]޶_9NxaOk@B]x | '*o 9;~vx'IJ=tM /pd*O/P|e,*^K\#^ B]Opۨb jsZz%Ũ RX#!(Bf{Qu;jcHX9Lj)&0 3<)6B a1 Hfv.Mc l{ix%%_ 6G.sO ;yJ2k텂SJFv͓a4\}]1g~$ξ6wE8(ͣ  o\0< kqrU/z9n=.sjvRRe*P>ۉ'ʗ H9-Gyjy|uV kO_}copZH.1̝f.|RUTt?wv3,Y7TpCZ+k$y]㯳{&XKɥ%>׶~azO[=yf+V~Rl>x+O?eT7_~? 0Ӊ,ζұIe` Pf";b4ae5~@ƎP*j[yK`QlC#kE :kN)kd N&\bZDl/7)]uq9Q9>'B'1xg(H΢1X]_X`--qb˰s^6u1œcBѴzbcm^߂T|.UAnֆK뛮Jm@cj^QlBVࠬ]PWF]e V Ԭ0 <%y|pB=i@R Idh@vvlrMa&!75.G\ M>;XRĞ`276,ˌz/]x{K8gk}N%}PF_i-X fMa⻽w! ٠RҦ&yQ$'=bU"”^8O4: Fž}RR%|[AUSul*Y2P%޻oDcOzhf5솯BJ= N`f,mpWx4u$ԚEw5Br4&L&hD!9Tʍ aL",qj p ( ΢*[ΐuy~^w)wW̙a:7ł{D'?2|LJGwWt8 YOwQҴ3cfr>Hv}-Xh>YV8+ 4۰qC~H6 Pr ٕmTlsMd! אo)b3zN;1Ze_#".@/dZب˗a-,2=N 3XH{mRjØR tRS׎ܒb^اKo`A<*=;֟ <jVy⭻ naڭO^~z-UV^/>S5K=py=> PpvA'lA^Pmey:币q6R NBة6@K6(mT(T+h)D_Zq+En\/нBD1<F4A+IFj&giMj=؟?6%A=H[/gD{A%aQ"(m*N+]zB@>=GTq() QeMa+}ۻ_*vƽ|4@љR "\}<(]ٶf okB.>m!P?]Azf?S ˡI 0Yxtd0YB/fg4V FG-!<*Aw"CP}, և?3Kp4B=}4'pkцaP ao+<z:-wo< Zx0N Ǔ}j>5?OԀz<5\0TB)x SO #iwD'`38}XIda)ɤR WK]T6鉶:BR\;pǒ'놘<5Eb~RAej)IkTdR Co*V ۙψ?0^?d|w;u,<&px+zW>)b"tOr[T_i2}ף7Z '|6O_+jkYvc*':xX |ĪR$``혯6ǜ:,auxiz癓Кw,x5D2R"-y p)HIXX׷J:B>]e1 wQS(b'/\NESOUQ]!rH,8X.xbT?Ä(3W9>{%̏n`镫 %sbƞwɇ[';co(1 o`E0v){{V}ܻ "j~Ec  M+Q3W S= TcQ'ˆz5=jX!IaOn he(r=9/9~nTGt׷ɇѳΎ`鵫S 8oyp\pU\ɈU0R<lfWy%^&VXh0{v]?wR}1g8F,AS[4zy%1os 0tT'cNfҬW<IJIGEEG2P|J:ke7)sgN!u߆ lB1}jCnA@o*nE/u {pͯBO=?a'^5IÇOW4o{spvv >C!6y%'R[ X@\@.b(Yl1rPRE4nu!AZPZ?) }&PK Ruuo}:"yG!@ѥ~=RO4bчhbР_DnUcur_8*YЬ`(k;z4 Уh +cHт cHZ?X92@ ,FIðm3Jc8_x: mu)(޽5KnR24~\o,,?;#A5%{+n=$7|׶K~~"M+|#hS0:R(4u~ϐ(jRb}_,}䜾Y\c'Sc-a,K10LBG ~ۅNrLےuÕ8݆SIB>>Hߟoߺw>s`)+d(p}YY['WEpxr^cqEЁ(B,a+:R$%g5(.4^7=bX CTl [\b\ew@q;xvM9 ȅ0hW8qDP#BT¾s坘G/,#||o&bhC0p]7AvA|xn[+SB9F.[a )q3jydʎ|;~e=Mȫ~l>N, uޯcq#;܅۟p78_M7:M]}=lN9gBW0~RC Nʠ3z6R(yTa\  L/+}8>%K5ABS75n@e[E.7_TJ\h}Ѡ(asLD> ux7^ͅI=qbSg`0$pNJRI)xPpo3 ]x6StKO?fexѓhC I-`ƫaoH|giZ/` dd&s5Œ͌(gٯI>ȪEu_P TDlPr(bO;VPtδ_ $\sO͏`1I55=^9K=>^H>!矛7pE?MH 2 0ܾVCjߍ?AꁼS6075Ա&Eb z1Q @4֝ BI%&Q5J1N^c/<:aࢡ(yP ոP $ bcAA<1CWؾ8۔V{kcy8]h߰n~Sc3鱠řgMs?wJ=;D9X=~֧rAUu/ԯ0` +<2Ž4~Hh$@N]I/Bё Ec:&j'sڈ4̡L4 @YՑJ)V& JH1sP#5a3O#,kJłɘ]okG)n3frECoX^Kpͧa8J|i m'`vnEPxyOXPQ[o޽wB;ot=HS¼yFTkWH>cyꞹO#Anpk81Cj౬ĸSUxkw mK~ùIW sNv}} 62/~hw._;{L3#T{,=Szj*34jwsw[9AGVwr?.9g,J~-1G'??.`/A%ǦdBB G˻t@CE\T^_H=B X5A%R{!|Ɲ-5dzP^n2~}y(ܻz.ȭdi8v.T!0;UݕCݛ7g6(^#+^d/{/0ņ9sia{x*pG]$TROu( :M5{ }$25Hfo4Q+ =(# ZEsGdSGv,P?'߃-6GHTxvflO3͗RSV`ahGRI=5ir1;7NƜgYGVi^GO*dTlgն!=X9?aBdo)r/81 FM1b1o}0l¤^Y@m;qfVF8)MAͫ8޹v&dV Q\믈u 1\֓tD>hf\HTemEͮG ;M#P~2@$mD;(j~+BLB(ENL9Gx 爥'!Xvk2@HQ6l{S{ `nuPH]v6G0=}YGރ0{>?>P^=Fpa;.緀^kOwFۅYwQT}l\0zXm1b=gnSN;?7U ul\3[CFM=m&``*a isn#VcQ9sMC)0:pP ۓz M *hb^WV!'UP:jVV_Q@Me(?w&ёlEU6ĦPe\?ӔE,6l{A1fWrqᯇ__xkjې_=ݖNt^RwSehZ/p[pn2v;ts$"|yޣ9`'cqnH#񴕃R3H7!t"b< ` {{QhN&UP],T+#TKPzx]ڣQ,kTjSq -n. c.*AvdFe߯=X`@Go%COS.s EQ&#o>ؼ~z r<%ڡXק,ruQ09[AF>QI`El*KP_bPR$Zl.0Zyo-*[J*AR;(-%rs8b`0RTIa- $N7@xM$_2|SaՔ!/|@]S/ib\pII<5?؃kn0Pkg4\#suxS* GU. B02s}DOBSi,Jaúta?Xb`+W IeblA)JZ8=  [0D["vFA0>!?랻~y/nU e!? ãOJgQ|~f `O rI=It׊P;vF{lo}+xG %~FP]*0iyEʞOQւJ^ų@1*=D;vT|2t+E>!ܕw{|*}T שgE!Um)*Ǚ9[{K1##r!_6߻ w*D 9oɍ7N9gàox袝x<.um1WCv a=_!YYWxgc&r.>Nq"c+70;P\*TzJ9Z`ϰPsF|DJmrN^/V '8 N4Wi5ϯn{f +/HvNg 'Xء6a`*W&^:tٓ#EAc ?vVg۵2,\$c,p3^r1P/&KGjx%_vMXQ}J@&)ɜvHS#TDzƐ^dIsFy&L։0?&みՑ޽uy?*@:k/#5y3ݟ 37* 3rfcFnQ \}؃7ٕ%IE"232]-W% @ްA* d+3+#cz/|MU="*j72+DTȑ#?}k6,=x%qg=t79TI0u ˬ#OiyW^ `]ū՝hGA>.Uұ4Xvz r]5BVǏ2*90{ɎHW!ְ12 ;}5uOYQoz::ߟ~֫h@ª^ &/<ہte?ۧgU:m6Z?B#ˏt}-'H\ȃ3psBɨRʳ2M%Sg|}\Fg)Z~K#)s_}޼ e?8`B~Z y*°UR  @2 O }_Np>6pxd?e=繎|Mՠ#&HgsjKijUoMNZcl-S1r1F w3H 5]V?^m d3W=3OTÎߞ~:KF'8x 3 ='vdE҄~EJgĸ.6ÐL2*Hp  |&7}'PUŔz33p Ƕު1\cg*+\ z XG Md'ǒs+6B˧sstxI)~M?.c#S<0tOFa?w o6ti8*RȯOy>*u3,*UP Pl l̥?((2rR7 Yٽf6+I wX'ݨ:h;.quW Ⱦ4ȥB6~rP{;Rb'%#2mb~#znG?'f?n_c1NSM|M 7wxOO1z G] w_ /Qy/oj+~MZmYv8&LdTY)RxB8  T!Sg< 1؛!n8OTyAz}桰 z1ggE4nkhbd*q6b ɧq %fi0g?9 d(A͊揨x.r^\bA'tТ9UnojstqAϩ0 JvUsOgRç1qHR9"/Bn=׻Eja {Yگj;h&0p~vryq;uI>vd~ # v<ڧrY l.Oh?Usz󳏤'r9]G_ՁBY+ZzlJ{H cWiLCڸp0o? n"g>Bg9)Z~*y2pq'UD}4HMumvXvU%-m]<')엮,g)vUgmZ α,E*~Bp02a.>H+;DT_ޝTw1.P:wo?n]"Kγ)VtxjQ$F~ _w &U~^sR,"Px9xPW h k wv,pn1 8&"ex T53٨ \tPM 2;QAsihy8ȝ:[}?P;gܗxQ@W2u}aOsoр:$:ۣ|Mc:~Z9;zgo)0^$9[ {Qu>A}[]IXϏ;? ]]6TIF!`j!0F;շg<ss;F$<;zߤ\H[-w cWoNcЊp]Y t4(M{kz:1\e>lM_ގw7O;}U ן=;C>r1fJ,$[_>X5bۥ֑ٳ`gPcj}T1 5F gK}|c@'O]A+k{X~lit '_>goF9GTȌSkɳ+n#gEǏhKln 7 ٮigJ$mxȳO/ZG+k?7y4$W!-(z@A(;,9ɠ1%5XkTX Qf*k'^g5Xgx7öv N>/$] wS ? ;mq[_Za\:#Sy yꣾӷt}TYbO~FNT{RVϏsg8D,1y;z~2U;V1xS;;bI+s 3^ ^ o܍@@&dFb~a%Ol9Qt`5<: '3$ 5p|fÔ/^M.4)h]M\S)(XtFkVNm!#Y^DgVڋ(r8>u=]Z~5WH~E /78w~|C||[՛c'x=3[cDO5X!u{k֡\;@ɥe9F^ [ҡ_r~YT^\S`j;p¡YyҔMRa;4;tfȆ-٦'C}Ai\`sJ=AQBYxN9ۋ'"F4jao>}=Jv}uE߾iV >wHrvFA3\=dBD)TD@˶QAt$Sq =ˤ/@+ DMc\$| |Jn(=6=AsΣL)6Xz7@Ş!xr[)4YɅ}b:$w7`ӛ5ˍ 2 Нh <ΑBGe617ƏY|\u:^gL@ЖjhPcԼ;VBF`D5A1޼=؋iV|<A:FOjp/PSz%Oi.6ļ2{z. 4ӧ_>-HZm=t_,Wԝ+zjnp?o-A|'N?Ot>! :?+$͒drD[Mϣ(wԋF4{|?gם-|ٗ% 7|*ۉ3HfZp;j0Rls8h}y,Jy. GPc"x'ɷOtAc>ܗ{uLJ?>~x֍Wh4lF^8J49Ptbǘsǧy2(5P)NуͶ>CzT^粠H4F.y#uɫ. Y+UPÕs:ZtͭTZt>o4 :g|h_<0+pNx}E!TG! Ooh@؟Md-:Л?=YúaT͓SU! 7X+x nA:f\M( =ݛ=Ԝ@R?>p-hgtBgN!lhcq!*:cEGajS#S hl=i(3Ўo1ΣjXF(T~| _מ`vDJ}*5r5PGGwة|?wEVBAE:y\Gq5=]T9/)o\ۯV1?W<:A{PF:6byU#,H|F=8f|ybn@m,s!&,ڼPE@l܂pM(N5+J’0y!K?|u9i),=F浤ՀTs8!n?ۧt gSm7Sxo=h|RƷ:VpNwVoOO9*ٻmF. }x5F֪ܐa( U'{dP::;+\ŽB̮SSY. ]R<Uܣstړ4v?hg1tD(ư[$Q5N LAA5<ށhpZW/ݖߟ3M Ύpy :iLG>*ޜd-?j w_EA*Q bQ h&М|<G{ RHl_jξi Hv1U՜~QXz&pEy :e`d*0 ScYzhT΂5B by#GWaɰSH??>3AuO,%y?L>|{^ߞ~szG{ S5d+< .oޔ~RO0S#+ j\jtYs(tÌU_?}6\O3 7r1qr>6"vғ ݉WȪ$(py:pz^ZM@)ýbD5 tٔ;:v թA@ Н5fpuSQxyrW lȴ7 |^"jӛ2}7 ;y>^^l |<H ^368!!8KS3%EwC V _IkH OӜU%Z0xh`TD@t*1ڻ=ʿݳ;iNn]u<tvupKocUiPG\oիh+G|0lE:%g gQ㴧AGӨޫ;Gw'0ԚP{ccKSgoQW-]YG0x/n⪷o?T?YQjOJR]tBr/LM?ة ,t+ͥ'#[/0`z#eE>}*AҰ4)L00x/; {Zx1zSD1%иT =Ѡ i4S6Îhk? suLr7) _* :L\˽MNzeA}s'uJ*aIϾݣ=ϋ;:;oid4[fEᐾ4= Yb?0X| JL~9]{B@؈T:ytZV@:Jt_Tt( ^l4@AIXgi7bz>!zߴz4:;a廋3bh KXVR:Ǚ72~"T͆7Uw?xU? *%Cl,o@T~N݀ܦʣ<40ܵ"'aѰtTY[popV/- M_!ZA&' -#$%/GLa``C-h t ?;!q8TOV_؊FG1lq"X7ɡD=v ܑNJ/!ECN1BB1QL)>b,U'8TX-5@Orrw D5P NZHPAxW'ꥨ՚J>f&s-VҸ|j 5ÞC沜 )wtyf2==K-5_ob-?<ύ%3Tac4aN|9 r4h||KdϳhR_ )"Sg> $&jWCDf#)c.O?705܎fV'mhyNwLohc-ioV-9K_c7L(OD>c hib0DB>h tEz6Mr7?{oHv ~r:sv^xrs4G)f6FNA@VOO=˓Q .Z܆~nM_+jnZ?_!~{[i K>mI!<7{ˁQࣀ 1y_ ])@; VA_ա-vt{O'1ܗǷoP/^yʇNeПЀhjd6)O0ئLӑ:_(<8$EN`=yF9m;N`fj/]۶}HК{|C?p1Pg):XpN3=c `,Y>~3oM)S+]vGKbkAÐbXM'I|VSt'i ^,B <uҔ\@JoO0#դwO9(|j hF<3[>t߼-"RC`~&b?t0ԇxRk`/`RIL|wV% 'ؔ uɰj,IfDo^YvYw1pqjڿEeDms t˯^ n&szg}}fo]pne+4|Y!nťcW+&l04o~U&kouMUAM$D}jbD%V>T-u7.vI'X ?h&TD!xXEd pk,a.@G/c_ho>no6gd^BǞiau`dzH,^ B"ΊnKdé9 O~@1T2 Cl4HR=U`-:0;;\Z7ZX( + ? BaQ ;sWդcYyOw]_M+AOJ61۬Oxɍ߼%s`[>HcV^m4B~q;p?%* 6!ERՖ91[-{L@⻜ Օmy\_XV]bc^%flAo%9ᅬ?z8~!Pe=DuhڹA1Jy߼4>S# G&R`HI VJh* ϖ@z% )k8TYO'aXj H(U}H"J#,‹#R91U(yQ.>=a lX¶s{? Ugw5yސ_v=' [׏mWW1?Đ&3{) rYm؎updcItsTF+PJNo /FQH&I#WY$a+h!LF⬢= |PpPލiMے/4r~^xK ; xg6'Gۛ⋩pIY>WOr @}q-wunyg vl5_hxj>laf:)AқW6 Ek -kNVc* $D! |^*SiS#އD ۢڒBmK逷\2  =S| 5{ bo`W"~,|į)UF'ŨD7ie jQg%k?֋"P?2;T]芉 ]ުfɨwIamwiBY[:ş?]̻6*/Myt7G%X"ͺ lx+LO[+AjONt.XX#n<~ (H+HWϓVLAOT>7 ƱӫLNX!lcZ!*9+h|4ڼFxL8\z- iX]?V4!gCm8ba ir|[ [` "I{^ODvW(:@̢XI!;@\\_U@cd=$49y& [H3|$Z6bA 'B1~Xҟ3gړA66 9e6h Zg$fs+U7XtQ馏!-V;>p8Ux{+ V_qmo &:f)c4~<ܩ>"E:<'fxU ]p2*.Pq-aK/??q4:ZGs,WB)ܬڔ<9Sz5EVx$ְm 9EȀgC P0Y`Bn梅ڢ=D $Cfd( HrNg}1vhp.0xK-‡ 8' p" 4}_c:Xyn92k$ ؙ(NFLYTꦛE3R,=DJ0ynA{#p#5x(cpt@~??Ciw0>SxV]= qq&(Ґ+K/2:8S t~hkez\2&W<1yN ă@u>ȹGO2bVT_dI7`tO#(Ǚ%됀m.]^}ҁ~ICa^U)Z Lj`'{;Kv[0__vb!?=>|ex(2]߀]T"0 mَ0|'j``չhzNa9KZ٩KW^j/%"i%TJ1 oG`9vpB#e2>A5Y?H!|lP>vGpGWux_ŕfEES}gQaJQ=@Me _ZDi2ԣiQ/=;BNċ 26H yX0x뫱uɘBm  |xOe#>~;'F%RŷDgz62XvEr~\P+(c4D(cե}SJqOuIBs&SìE _o Qh] `1~N#ӷc}n-`cVuZ%-$\R=Fre ŠmI|H!{=G7M]W@vo閾ˑ@Xu6]KI~hԢ߀> !5weaȭ&3eþZgdZN byS{N*&tff3kc-ȷ'mѻ<B^\*s/j"VB:',"O^y('xW{{qQQ+Vw[Vna¶B6A+gߣBV?_G@Sm:eP`ȔUPxVk;$s}c&BzG؋Y8\d ~W ]PHZ+zd1'- 'oE?-8rOS5DW +o&Ѓ\dR\lWX4{q*+nx'Q~ޫ3LggB8!5LƝGL|J;M)|wMG,$b[fҤi{hpez!"궻tĮ`:ځ,Mw7`u*_>iWDo>ck< Ȑd\ӣimȡPLjam83z=7\E5&'T+$ V8AYA$Dyv(5QprL5 hb 93a[LLd1g|5N1zo-u ɳŇW7@,V=e0_E?,}듁YbJmȨ<_jF%88B+g'ԗm!S9 X3SAdXRCxǠTnK\ȏetKcRC-'[ˁOatT/H-3cwaFoNzK{LIR7ajaCc#QfH`–"8Hvu"mÈzbZ+1DJ氞L'OWمS/qV Ḩ]kw(`1cH5 Iv &F#řP:! h h+tJ/ҏ R`Z)WHdٙ&F%:(dEk㣷~6qբNV<.*vI ^<"pclHys-W~֊?K*GУ|jZ[aՋv}PJ!cOl@qY ~ufן@Z]Az%x2u7(B!3H"\-3K[s%fPӃ%99>/Wώލ'%@.-ϩ!PnCi! ˻FZVcGPu-J r[$$)$׷ʽJ9jٶSo _Q*l~C@`;pE<]2pYfW6l1!'9BftC*\PT 4ON@}(Gv)ԟ~/\ƝN`?)㺱*h !NJfVr}SB s{;Ȱ!1(}܄xR zv32}JJ.`t. A`9lL? qR:z\b~`. SSXuꃤXk.*<[z\}=!y%90dk P.An(E:ЩQ[%d(a p[p?7v{@s0'jn}:a2-u 7!V!S{ EF$!zJ bfEV:eAtBixS A%b2}Q**m>S{ZHćcyӀo}Yo7 ԙ#ĠhZcrZ[{'L*nR uZ$$R"2ʸmfPzS_tL-Ǡf`+v9 Y0L 䭠y<eҀW6ġERXE|s `64F'<# Z6 0@P5VQq48macOuy/d{k1AmY H 'WP=ȃ@cԽ? @0;vbRkCQ7SjPC\< <[{,\35!") Щ}4/NzETƥҋ U vI@B0,{xғߤJW>Y p3XS4CK1A"??+IHxrKd񺅃Nbi#{uò} bPJmD MBv)¬*ʂ3gy{T&O*;^0nU;=#8NC}醸cyvݏ~F&''@c8oG [b#Svz $p=TlAPb$b>ND\Yp5+@.`00H[!g*p] : h.}R']vp;A/F2d[X /נU\1ckV1]nn @i=R~r'K/@',ALu($ l?r> ~m倶<7WQD`h/$l" ֭lՇLJ{f =-{٩[AP[`D| =nCN9N$NT 8]c9ufsW Sg!ԉ/ܞަ2 AqJHg7 vfKܫ&aQ9~2*U؋*|OI Cf1V;AKgH(5ݷ),ñ)&E@#uZ82 tJγc=mH,E0ibIĉ=y,A䫈q6A,ZY-H=h+ PDRsT16]#cQ+8 r"z@ avf2N\drE!Ӡ0։SJH!'/pCVm'xek+' *0Eh]Aw:+^ߊv"ljBf!L6ATFO-^6p hx7a{Ɗ_K;W2V7%TZŌ;_ShyƋSkc\Z.jҞuO R eobkܤJ8n@\e< @0EfGNp>lΏ}+:WF@@N,.δ^c ]X^&m ՗gxTWv\yHl r!PKͺ,,w350'ƪ-]" {#iR%qɠjJv-v,<1-oE<ĉy,{2KdƲv W)k[r~٩!Fk4\r~ DUHiB j0\gPJؿ\8i}V:ڮ0"]@ 9`,K0llD@ZK +,<Rې@}rLZˈ*gVg2'@Qdx GH;%JDO /|<R r {n^؞5Ю{6:X[blJqC~!$|4ޓڢ{x }E>Iߴsp$ qE܃Q:'zrF O>oW+6I䓅niAVbPDA"=VyA ]2 Y61 V}pE;T`۠CtGFFqN h,謱ϡx+/T^/w]AFf:g3ΦJ` lb\9IQj2P;VF*b$xgiTˋCu<WV:͠A:1=+&.2Ju1|~E~=bH\c쐁:Z'VR4:1|Y.uZ\/00 $0`~n 3K`@&vl bghV>ğp^Ff20ND=R~$0`0}A`2(z ^o?GĤ͚*6:z.aKF)}B ۤ5hֈn?>hg (;GtyTh|2@^pHZFkkl\zgCFЃ8 8ZP("~ׯx~/.#E !ؖma>``oDj&c{:~~@a44P: @2`Bs(/?{JȓZ," ˊ 0p.]j9%pI9, AK{UW4V,NЫrݔN\ӇhxF`B霺-mjA>nS`-I+ <ކFfE0cD b!w& T5FUۗJ("f;@W\˘OƛG6{]Xҋfze|OF^qɤ UЯ9Q곺_1pHZ{rPnmЀ Yj=#:;O={-ui͕).$ ^p[tRU"j=*Z^/qH_FC 艞UjP'+:q Sd"`;Lg!esn4hb:by,+dT\5H!@*+,:9nYB ]L>Q TGq2_|UI-l{0 (5 Rm)'V%?n'0<=t&w$貟 ,E$jg'iBJ$fc2pxotū,u]ᔱ2iEPIRI'¶F+Ej,xrEPca@L ܛRrCoc*pScWދ Vvrx 7Wqc na 1*_ۗD3#0rfha*6ͷv-l-i8H.b&< L_?kn&!\sH0|lj?Dd]6jEBR{(ƈLi $\[˘ $-X@ ȨTMX0c5^J)&0 (hfE5!%_bQB~8ۧ dUIVOF;5Hb?vj6et9umwz*?1գ,?sm?@pFz]V)84}:3s!̈})MD˪~P-Ok h ^ګT'x㿦EjW,;~rV8r;( (scHPK21;lWj,7~KcobuqW 5%bst QrK S$Bj*J Q'@*}We@ êh0SV"5X~>$k7D+ 1FX1*px]m_ځtyc[@P/%XS 1gVz:'7 C(M@ ce[LoFA[ 4R/1\vjS ?8JAPr"MOkyb&2Goi.>BܸL3~ba3>\MPJA[-:`͏ 2l=^^V6RD\1ԡ!BC{, :Z Ѧ ::{טi-G~*PnkZ8i O@v ܛf%.%@kKP!*]&YvD@i9.Z}A+*;_s`VK6^aN 14^r@C4MꇼmyMB&P!V%''BN?{o?Zo@Rxj~@UkC5qp0TIܕ|ae=,o˛W$Wg:WjFor$0yoJT!- N3-rl-$Rl6Bp ٬涢sgx W}VHnvwJo{u~_EfE$cD#zl Af# 5֠"1>5Q\2`x'0ԱW!&`<\NZ2㊩,p72.h~ 'ì' &m\12ŬeE,<\(GQ8T+fNBpB] *mN%h>_N P{޶ _c Б-}$M R6cqg cpjdKNpeRa 9;UO&ğX~]7spꖦ|(CJ?ge(QxTP(m?\pE0_čmJ|ui6h5 G^8`[ ?@=Jy |9K$!~_"B) &xa v5Wwt,Y|$レ=lĢ9,:ǒ_%!$*J/M=<0`ncP(BЏ 6-&pU*r Ndr9_Ixt y}8`3Rd% 7pߔ3ϖ#* NKw "; il6DJ@PRAu^P1 Dl& 0NFߵHd@;':+]/g*?7s+?,9 EAI~G=3TT} Y>4=i}.S[S^CzQxoK~oRX/,^#EH.*5[{[>J7GT߭wYn4CQ v(wGnݖC:n?ǟ/5ԆJtdP;Uʌd|K7I>0_PR@K q~Ӂ]zM߯8@.`>y$שN\D'+M1HU#Oɹ&_HC)A\ r(:vytH񋦿i qoX[>w\Jd<Ch8%6'3\8T\(&f鲳|VD5A vhp ';^s 1o 8?ϗ S_j$AI ܓ3Ġ ekɉ* U(:q1wHL@܁ `$,ؠQ !D ru_{oUz 7/ݯ)S{ktxÊ/! 癊~y n:XC3PNVW%]&}6Cф|'w6䲫iB1%Da D&D] ZdBdPa׷<)'7 :Go˚'XZ9&yLNʆoyn_=M˃u# \zFg$cKd. ũ MX寅 TdvZQvŘ8]lU aR2({pNy.7y/"K t?uɵ vBx1B ҆!yRP߃l.[&:#:;0N3S%|)4,+MMןϒuJQzݸA$8UJ86uyN+beP/Fm۰ztSM{,^O6#`ɭ)}KJԑ^Fdzz0.@R'~qz I4g( ^fд_da<IYQ<]T|P_dgq? ECx.'$)Ϟ;gy:P`ҡCh߾_zF[[( " jkj+RY5pȑ#tyQWW8(")R1X` ~*?2g"gFW8vlC vŕZ|3 Ջ }s=؋TꒉK&#31Pqzn"9IUZZ53Xw0]ZX <)o?q쭗$/;nɤ޽!Z?P"EoHLǺ O(@4. À8ݹw*?|Q1->.0`{tl`Zۢd 8  <'a0.̌Bפ)\Y†r_q[x hC3fC>z+AlGLnpq!`" PrkE% [trÅAr X//%zϚ%AP/9137I|v{@6 ~~iXAU[\t*K}WD2hֈr_ ^No Y(7|vcgDp>QG}>=졠_|N~ʄ)_+9rLg߿OnNzq6G y \+;VԇP(LQyV"ae BNL|t{*)~/ &U9_Xk$L^%W#LMejq *X45ig$gP&O@;ݎM^/~N_rwwwwQ44V)FTp)B85mt:vB-?Nr72DFF&ill?~H]; bgPޝ:.9lhy?B/kau3V0!>%mVLiA^Nۿ;:s,.pmG%u<'d[^4doA`u)-αǫW?ޛ}7j N_/XxD5^bul$r @UƆ1[d<8pb ܺǫ'@j\ ]ݻiuuZZ[)$L6CYiO#FpqԟX(P:.SqUnѲ楂K&w($$.j_/N`Fww/ELI^=5WpPOeBPfͮN/b=:X&()Ec 6˙W'1%|aU T_r9=;"(@B@|4Z`NB9rP!h `   <~lj8_@L`#@\wˎ QP)9wrV..]A >5 0L)#^7`# t!wb@ ^S19H${+<%t$(| ^z FPd*E0xonjiiXnQ@ Oc3MX 0Ȁ:y|nG+b3\zXܤ r IӁ|@kkw^{G/ŀ@0Cz y3x机"L Ep CEK%a2 nIG_V+@G{;8q"IfHlNP! :ihƲ! rBmW \h/#x皡!n"844Cf_8?E( hgΨ# 1֚{>w( \^`xx_`ftj'fNUԐkx[xhA,pG6wB"u)Y& n]{eںݵ+xԤ٩(|>{u!fdwڢ{U|Й3g,~ oG=-,j{haҾ} ]CbX|A>7m (X==kS =H76mI~UhSN$a&}}}Z:i"2YXEPzӹ hB.حb|aNu {uк @.%ʋu8t&>z&]%*p;_{'(m0!@"PEu5 ?~ O0 \EsoI(xdyf"NC_j-h>q,Qs$wlHAeOx Z:k5ZxEn]*p6 *Ï4k@ ޖ`~"k`k9(7 dl6*;]K$CP%Eka,8B1/ N3$,'8i y&XN\d,)cXc]xBn+3nz @&zO:T?%݀vL:Ś X#j=kyWlm"WIE) N(iNwEkhp=_V)B\.Gtڕ&AM䇊b}xP]!|(-Á?dUiu2ckj%S),%I4 `,79Ls@pA%WʝΛo <*L˜˟NK?seuo۽{wk '|IL=0x]|'T@p ֽ1V]?܆y Ib EI|ٿ6 ^gyrl+ӽ766F5v$7$!$> ܗLVNiM/O6zo8u z?ϤQA8*m?TD`i0 5x\4몳cU_ޫR7W}]]YB0[@7}_ _['m'r7;Qpp+WEq;sk08K* ȸ}{7ʺO/|):x$އ_ƤDy<߱shМת>bML'kG^^^4|'Cvs^}--Q? ;w_Fo܎ћ>6 :36ll"se[7z{w7}KI@#w&xHqW:͛SO. ߎۯY0z־dl[66}H`0ªσo%k[>S4;Hq}xfm ?k׮R2e+ThmYlG@<2a%,T 5STpfVG?}$]~s@X qzzưoiiFFgͲV[8?ĸl4?_>3{_~y1ʞ8I;q#ϠX+/LyXi5K %i-5^GuYT23i\<9)/ #:gJZ|Å'ҋL~%Jk+I%LheA E^]:L2 Kr(>|z3tL|d,4@05~O{n_6RouuWή;t:ubkWVdWLVNsx7G=z~KW"}P֟qyL'0%211=f2'אx|KrWd/? ˯8: 8m'܌*l҃e\9L&%ͦk *7RIp0yr//ǚAC`LIʱ MדHl" ?#}ell{H$ @f6mP\p!Ϛۍ:_<4ݟÇ|÷9TgA,#W[4Ɵ*Y-d+Ц<*l>sG"`ksn,`xb|bV ?M?{lC>mw¢ `D;FxSX_jՠ~>jv_;'@;ҹ $i熄B@eDxTP=P{l[ #*/(QI2X#P7j ?n@5vԢiT(~N OCz_AP4ޢ /'֮LFPOUip4hG@2KJZ}h"w%n&p @uhCB-+?{V4IENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/32x32/0000755000076500000000000000000012653527012020420 5ustar devwheel00000000000000DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/32x32/dialog-error.png0000644000076500000000000000301612647526522023524 0ustar devwheel00000000000000PNG  IHDR szzsBIT|dtEXtSoftwarewww.inkscape.org<IDATXKdW}TխGjz~dGI!Np!*8ZY\dt'rFQ$ q`:LtwuwUϭsQ3sEUyR@hUC7Yj". pxYm-l`03I2kZUPyE৥Jp~~867geGFtm#,Zl7Q+H5K\+NM}t^DNhvZ[zWUu'&pePލbƼ^U}j"k\)ûw76ȾxQEy/[7_/ިSj"_2kO.,\-0Dz Qߦ[߷_!ȟZX!ydH~zm>P_|X-/Xȹ.p`l.-^*8fMCoMO/Z[oO[iO*&lnr= ~v&_|bD@ c33x&+nqBlj1D++|駋yW'ggK{h܎޿Oj"VM$cD>723Cyb# U49bρ$A} "KdxXD?Yϳv{ cÑá:e! m?w,L7t;!:^d0㝔u>x=0 Mq޿,Tu9".Wn#&7 pk-DfgzA!WHWLLA@@̰{mQ;Ơ@oN $#BfBV[FGQ:`&|ܩ)@Uq.Mˏ$~,R*Qw~Џv##}hV@ELOY$oUU8cz/ ~vҁ@oۍЙ}^=wΟ'r]WAS׶Z;;=9x#T~ HaPXz{ |~r.yrrt4CjgXXNU,lZ? `SU7&kՂ9c`^^HX8عnFKr/6-`UUCR0OB5qmV>qcٖhJ$v$ ;߾`;7(> PF/g+0A9 lܸ^7Ig9Ma2R˦қX꩓$;YKkRIENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/32x32/dialog-error@2x.png0000644000076500000000000000670012647526522024101 0ustar devwheel00000000000000PNG  IHDR@@iqsBIT|d pHYsttfxtEXtSoftwarewww.inkscape.org< tEXtTitleWarning$W8tEXtAuthorJakub Steiner/ IDATx[lyvxMRRKJF' [BRv)EzKMHon]ڗ6a2ZuAP-ʎl˲Pe3;3_vJQ~3s3\̌*x,"ϋفo0nv xJ$G VWj n+L|7EEe m٬Hd:NI0./㭮R^^-Ņ*^ϨNl5-ȇMpL #qwl +CL}]u*A D,4 v"  0;GV¼%l6=tʎaӄ++sssshD1f2ׇׇ,]ȥ7w~CLTa;yT^%#t*uwm2ű"ׇ=8Ns9ʊ)p"^,M ~W-۾mv>z͎YO#{7X7~u'Rؔωf?q.\rJ;p e~AP~agҵϊ<* p.αFx$TUط̩S{WxS:^ "wi9S~ݍ{l;0xw"rOtpRgk~co?}&4F-F0h۴ =1{Oړnoh\MVqMΜL&߿VE6Tvs!IheM:i 'Bz xFd/cf2wRK|WXej T?x{VXt 0ᱞ`C½pv+vy7=v'?a޽oQ8!>9{}'i-7vt"B-ٹo%gDvlQ)?ofs7LMݹ1ЄI7L.WqoR(tݎMsB||*d/ ڪJd5Ԩw :O=urޡ!Cs"upBwt`fl@mia+ToB! ۬@.;<~w`w8nSg$/iҙpH2 (:R7J-yHe0MɤDokEOFc#RݲVݸSEk9ސQ9iu-V$~]zZG'h+aN$D b*1ַH8М{h%/|=©RN$U 0`v?F-g!>v2Žh1@amBkoE[irDru-4 Zߚ[A:ֺu*KY`s]0͎TN1M*郞duǴ^?z|_h.7նqef\t].T 1͍3AJ1 ͼj3aշѓ,pJ -ZiR!]Q\dak\W.DY'@e3E* ii"5i"~ѴY|KDHX*arhP.+j|/}QίlȲۮeUj#Fot-vzaLVz||/}FIƏ@#7Wo-ȚkDCl7N0D]\m< ^צ2SXȈmlFlO[SE+jT@Eè"cկKv8F"\n<}wu36QTNt}V^|ciif-}k0sEuDYGTC^'TPC@Ngm3;9YQx7TjX<~83Wo"Л! 33] xt xPuVB+M@Ez"T4*iWx2T]f1[f)=0@qj,mS>Qqa!,J##`l1*|w-[O^R gxx뀶6.TB3M ֭T}S_zO"kxĭ|#aҥs%~1NՒzjf2-Su33榧YYYKЯt|-06|qqeoVw+bq~b%pHH$j|<1333;vo`)=8};ifgg ^`wDnʳV=@*~&m7Eܺ @7Me e13=z djKPUK i$Td_'Qi0zyI$VVN-nԔ 03*LK߄!Fv%@lhpao&"Ɉa++lmX,*,./2\kx4\j@<܆Ŷh@|;CI51AJMӴjĚ(S )Uh tdt:콗b2̜~N^{Ě|%EH@#μ[Q=j`ߡm=Y*w$J ͖7]T!^ܿCgGK5-Vc[D._,}ْeK G˘-'㉗T9Мw Ia. z2=R'۩)Uמ TVoF΍bcS_ZC)_>T+E n K} T13&>* WyLߝtWX7C,c.~ysgq;2WdӾD$HZB()t!]gF3'[5_ۦ|͕B)IjҲH >Yzm{Zi%Jš6k];`\%J6c#ADDDԞI)_+l9sUxHIλZm犡f$>A R5viIQbѕv{>{?c ښ#&(q53Z("LL c$;[}"Ky--́bc;ۤ06Axi ޼Sg()81.M.]wR eS2Dז[pʼn#)uTj:7V=Qq1&|3]Wu 8;ǒZt \-锗)u6͕Mh,ƾC댯R"0m'j%:AJĸcKy-Yo|U-mG;6) J<)|-ɼصu#+ۙ+ǷY%c0m2M Po?"gX AV v 蟗E9Fo Z <) f+b(vF1[al~nA[&`$w&(6,,qb87iR"j8J1[Ē8K1Pƾ6G7rF^xmԳ)p`Eb, Hha#B==FJ+:bs௧.AI ZcbcQ ְ 876K1#sh?|<-0 Fi1k'.cyd%톇#܃R5 dkjE!vbnFt֮qӕ5$ǭ];I9Lٔ'DLm(UX|O0p$Oϻ`Ev1)O1ǣ' (P(EpA)&FqNߔb703&0Ҟ/TD9 1/FۏxJLC5҉D]cm脣RUK>+ET*w"0(&(&ImLcZ:1mTeҶ~lΉ|u ޱ7iL2/FDI,&P ekL^+ccyXlH$o.$ʋXVZ c,X6:6{@Rbc,H ?q@1ӑTOs:݃j!;(RƮѡoM:HS~qQ%|"jMOhZ&XT }=7y[c0vbCV>)$II2!DdjeFDNLf=W V'_Vw݄V-M"HgmkGɂBR11h k41JRf1zg5u3oq(;Dt2ԲEHE\Q~-;ݥ(HޕbҪ(v?8F Lm$V<T9'uBhVҵUDbday՚r H](Ưb@W 5"Ͱcfr-,e3)rc΁]|Lj̶8{4`z{. u>~ u& e#jzŀF,˵+8kr7 ;H\~>YzYdB'3^6yIpn' 3uɱ`FLـ7+9lõFmq6' e̚:φ ;+IENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/32x32/dialog-question.png0000644000076500000000000000312012647526522024236 0ustar devwheel00000000000000PNG  IHDR szzbKGDtIME6TIDATXmPTUe.Ì/XZ8PB8iZ8C69 LS S)˻("ʂܻw=wwٗkݙ3Νsw9g2ᕲd'N8 +G:0ߧ;]vBKj[hjɮH\H!{z׆!C=#ؕ|ȔW)dqr *X+3 JN*q84=H%$0H *0TD2*qȃH (08۳ 2'AW`(p_vR,칏Wra%t3bB06„0#ѩ큈n P/N(ظۢ+$w.M@YoEљFغZTp )%6},wB7 hK!P,MP `2ع>#\8]pP TKڅbPn'( S%P# '!:]ؼ hLQq\3\ڷjJA=Q5-WI`2p(HwMv&_.,TBf>R=+{Z?6„MYS"h8sj[QOב0!Ng8k +Lh=/O]eA@bxֵPeb@Uz]"rM2@0FCIWշ{dXl\CۏwPY9Ggpyn9jRUxҹ7EBx.Xl^.n-,w WDoّa 7a/ +$X)4! 6 ;$?xAGᛗTdlkwX < -480P#2A^ dlW~T,)D$8Cԅ׬3XX;n—?YTT'S0X|d::"/Ѕ(3Wqƒ1G2aW пFŖeI᪫7l{[/"zI!3)5wt@ǯ'h~Qvf 9 0x|wۨ&j?T}'~Dʻܮ__\{榾"zOr[Xt\eU:-VPTݖadvXx櫆=p2:oWUݤ:{ZBJ,ޅ0pË{5-n6A+ B{ģ¼k%aݶE͖kTFL|Ѐڛj¢㪪]YS'E 9 Ptݬj* @rME@!]@K&N{z S"VNͱ+d>H1aL1/za @@Je'!} *" 6~HLCg$8%BcNq~2U+P$Wza\G T$s h?.Cx)$~Q=ɀr@zu@>xF$acS@JxR QfR A@,ڣ5|Yו9?򵏧'#:M r_yJ 2&xR-c~:SZAx\XЛu]vqP,nph4I&MXq 'h]+Q%zT6 }nH $YQ  !( l×=.7(h uorq#Y^$*m:Cg< Dp0@/ N.?&tm1{OC-`E $ IŸ/f.=ݠe]&"_GOPdy`IOя|&PXיa-r$N7,#i7T3cZaAA`=']MB )V#~lÑ9%` /f*!O9ZEOA+Yq|=2SL@#(=FeiFH1S,݁ѡLAnaj,3wUqz=cEP d4c<,/~t/fڥX3G,칔=`EnnHG?&p&MfBA2L+V@a:Ōlga4w]Ԅjv4VV8%p\>ƌQP).o6PGibj=\  E{MFL7x Q`" _V_œ>zâNȲ-zdT$2M< ˟yq%]*;h1>DhUmXp ^H;AMRF P! 4Q 7廥`€Tr$QX0B7 +^Gēhmj HsO/p\>$h]Y3x_B"37®*L5r'HOYM\/TQm>ڃ-:$2(RuGyͧCL|A]d%b6kRq H #*a}D)]o@N+cOtu}gY Kӂɞ6щ /Bf'Tp b|xo_y@T=AAdϘT G"L%3=Cg\aH"$P|x:چBmH,Z3 ]i#'RWiynPY)#(p]WE(ι0U713FQHAP ”I+D${o0qCYEI@QAw>>gYNJ% .I9ƤJ0+m%x2<zhिs ǹrMbjZXOȃnIDiv+HOy`GjU@ݗQIœQ=T,hks n5g>6Y[S B;s,=U>M{ic-_EXX>ˮN&qQ-#D)yn- H1!x[Tj8D"F$sc|)'b2-lzX$D+ϡtfRCv+<`b,c4Ds)qzh8.L/_e?>;?i`XǛ \fB+hHI1ÞϛџE1mZG`b t*iЅ`2&rLpu񪀬̰ΌɽؔaLrEC1faY]0IEX;2YnF.fӜZLSYԽp~=I~lqç~6!TEqF$O/BD3! 9en~oiv$|ػSNĞdPX za!Қ&^Vg\B’tgǜ=x#j b{ebQT't*`4~l$0ϋ=?,LNOuo|tn[(,8J7LW3`:`D$E$pp₇&d$hV#I|32n |A" [Z} N0IBX ;PQ%N"q$n7E :>k?9xrՃScFه7) ZvK~hVԉ 1Z6u^Gh1OAf{ M*ms)8hz ˦@Q:D3 ItG;V~ٿ,Oo2X "ǻ:2Wk8U0 bb2Q%|\a5J ,JzɂI߭ka a&Mb#ɌkM`CUW >|O Y|>"Ẁye\f&X=GOL Vri&qc D& p X2WU, V$<ﱉa)821bc(=G NETbbW=3As[F5{ނ-݁PjON4>YVT*])R[z`m( ,[}L4C&q^*Y"-S/X({a;,++ẁʠyX 2ƲN9 hG|tj_!Uk K[RcѰ􁔲b/Q g0.R#e/|M}DM'` L,7cա\_ӊ ȷÂP;k!7 I0%*dKd2w=!\=_a&Hx}GcҊs;\c 8^_?<*M`6Qk Ss`A#WDj1i#l1K8A yF]XχGW"0b`b/%Ujg NeZ΢\O63DKs@R)v0U8!b /,ħ-'OnlpJq:{57ڃva̶9|twM$ s ia PhmI&hJ$,&D:Ęų^vk:sSGx={5^ۃڑ9Xs|ww@ŒIomGEf4nL2&|U#aAq.,s||8,|~UuW~,M1(xuv a~H0n߱/_bwۑ@'/Don?vK6,ۼ4{ܜKff17--('{M{YjnQz"@hr 9~+{$P$6"!cM-{!H9/8-=|q-ޖ vWxtƗ@}O:'|ډF]Mło0'3QߠH2NYq3pdzw1gLt3_osomN'oljyc>b~>G+/{tNvg!=Ӟ{78@.S -6sjƄˆŧ"WQ,8Ƞ8IdvwEH[O]b~%0$B}@G$X 6,5 RAe! rӵ[U@.W[{=N1h?#w0Qc^S;|VJB(7e};m l!;xm kAK{P:Eg*%*jh|Ԩ/4XKkDT(v0Rv]'ss?w5͚uj9T7 De4l&ߓ~+}놻w8ʴ>#|os5)n߾Fbʴ^=_wߓmNqUc#죧Na&u=wĂO/9ʊ>{z}H0VP'hau=10h_ ~vLdVDc(L0%elꏣV7ExyQ|Oe/Vwj_NȗP9$ ("ﴔw]c$̌Ki"fiiTa0uXߓ}`bG0$ Ғ@~dk0;}Ons7[j(T`ha\a\R՘9t/} Uә`(\ٲw{J$Q\01H"aX{rO"оv)} \(23V8W@~guL ֨{ro}(m}Œٶ1MQ"au0rn(U#V,k^uX2zjKvnzaC5 ]´:EMߓ!dʇB *^Wjȧඍ1̌$%i ܾ-t Gp3V( ~?N{ww\zĹ&&+[O'>}4 j!DB;<9](, /.LcUi/&k79ԗbw"~;ʼn AP_it;?ITa}O/=u%z| LsQ:(Wx{֫FgWx1;93FXDDDmwML}rQ UjX}!cQXKj@XY7~$HRo!"S;:Q0y<v#]H(7*llTk5W)J޾xp R$Z@ gFVtr-0YMGf'9vzpʚ6]CΎVpᓿܧSn>YYex"j~i1&/?^Hlj:Uöh50^C094\0آfkvo-d]TvӠ >2TDb).ǤІ|_jH- Q 0ֳrXDֳ vDIENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/32x32/dialog-warning@2x.png0000644000076500000000000000640512647526522024417 0ustar devwheel00000000000000PNG  IHDR@@iqsBIT|d pHYsttfxtEXtSoftwarewww.inkscape.org< tEXtTitleWarning$W8tEXtAuthorJakub Steiner/ IIDATxil\u-Cr]\,Q iˑEɎ7)uڤآu.Pmcpcq%%hm-Т WQ%K$)R\f=0Mr Ilx={DU nfo<"OHnr1]bx AQ*}럮7u^鲄@ym;NqQ֓Ϻ {@%Dlq\ շwOg֋^H, ~05d>Ce*+/"^Y7RŻp7Je*KgJp͹u}{eO;r5sSVG~znAHsko{%Xs_8:ue+R};:y 3ΒzAE}d9(AU5vpRuSrNltnjʳ㸱ѩ<q\T]a2J5>ce V*N:-]qxٵ `E}@G΢S$6uڢlwMtц8en/\^/%J,V nWPdm?D eaO!Cr+ݎ[WzBYGhc~?Rwc:it u-CNV+)qEys? 'jy?j D JWJU'zˮbE$_BHǷ>d9t?ߨHg>'%8Rd1çGY1~kx|Zbusm' vqnPEMy8wK/1n)(]4VG޽cr 0/!R^e7:| g#S$]s:`G*bj0ç k)//^Cf|.%\͎pY:ܝ?xddu ~tz[qb;V < .] 2b74X˺XzJ"XU 2z`E2=Oɒ]kIz(5*bA@ C7;{ ;'] 7w?V[8jFb#q=_ ,(@ot'mG  wMc;JV`}f/QY߈AWy=@x9\ɖ6u|^&"n1|z[(h- ;Wsk r^.Sp~yR> 3ݢ-6rfhߗ5xE3;"ZSy8|`^-fõ1MvUrК Q\Y[!E.{Mm}ԕ0y?QһˠcTjmrb|LoF^0نwoCq5PzcTIԧ] J'8FDD,GUd1r3ÉKV/zBi0ܿ.2]/B3ϏKoqY.A,4aԷxȨUEDB@偭lR*cN Bl@6v8#5]Ts:s^-^L룓^f&xo#:5єϷҽ'!>viee $D0|e#o #uUE_ ! Hn ?  n7[k(ٜ.9,>:LY 3?>ᷰw [\W)r= /-]tÄSL50IENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/32x32/displaycal-3dlut-maker.png0000644000076500000000000000476312647526522025423 0ustar devwheel00000000000000PNG  IHDR szztEXtSoftwareAdobe ImageReadyqe< IDATxtW{lGf_ٱk48NJb%j *DKJT@BCPTT@TPA*ITTF IR$c'sĹ]v{}Lj.#xqmY#Nā$VJm q429B/K)Ca zT_&9 xzg ] YWfʻq;I7n|mP_ Bogf^O+pA cduOi U< NЌi0k@3<vDknNOrݠ+ ;âe {P8*J\x:! _FI,;nv-n셧RB VUe+ X%r2*Qb r;C-Fy5a< U*w'7X/A\OtCzR sf4p'%*$`4rir?=8ƻO!bDhGmuj@׈hoLp*"[M}+*J˗N"n-ʖ6˻^㗼2.х/%$>,_BNLcD\]Ly~tu}`$X = #sb(EjNC m6x׶lxMJLZZQ4~qe:s3JSk)斻ai^yͧkê Et^U,Z3b]nxc#*߼4N2%ȴB:݇h4ѱ7ٿmz;xܑ텸v ZP-_XWX](- ٔĎ;v|{!|磊6Әҗ!\*VӼE)l#HYX8~2'03?.bLi9,vo؍h#8w}Q u,f'0;{bw <-?󺞻]V蟿oAlMñ"Obƽ@c;'yѩA`FH闞5rCCO1 44/~Jslx6J$+qcF#ZX׎ 75' Σ?ocȜ'(dmjC|w"۷`׮BM 50\2aODеDj@9:1GwkV(>S`xibua߁X9%Z4a,Jx9ęv? Jr џ?sA/CᦛgȚo3XdߜCߟv5w5x/-j3 qe. \B*zczJ,Ѿg3j6uE1z7o_h\r=4mPv'v Z&/ 2M{8Jtj dpݛ e:xwjjb8sf SW\t20&{g/!4{V%5Mx|uI킏a5t ze9x]X]N:YV( y 'i2GSGEo{ @:: WY }0Z>e,M.C|sR^8'<]ۛi`zBgM[+{ ¿rM_\24Y -"0[U˨9 7| w `UIENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/32x32/displaycal-apply-profiles.png0000644000076500000000000000444112647526522026232 0ustar devwheel00000000000000PNG  IHDR szztEXtSoftwareAdobe ImageReadyqe<IDATxdWk]W>s3wiFLICGQj_(>hAJ(HB _ R$H jMSMT$3Lr;^眵_ko~H)Jro!ߡ)q ܻ褍`qK]~&7G/rc(8c>Zk2%1QpJʠJqРC:`AYG y3Q\xУ\Y3{{R(ڝ=@GsBV ΃2A0 /<M18;}1<:osnwZ{(.7qToYpTFʿQ-ҨA`/m;1q*X+ʬ߸ŮEk~CNsڼs m$RcccGM `{B{YuiȪyqL Zt`yYw_1pKQ(/(\#<<  11 z_Wd֎"C`1d+ X !pfVwZ/7*U$IeAAk\q0NJ,޸QÀQ 5W)*٭'nΫײ&1) g8C쇈)HV H,0XBwIL3•8ѣOd'zkTA%PW]E2"KjJ7kb$ xEmEzV(U* h sy 2B 86>j6 %EeFnW ynOmbf|=sp+1@lM/4#{I8%W*Ld\ 2EY_q3l;$P?GsC\9D%pL72pLӀ,(t.&݉V,r*I$"s$MFL=*`0@$>*V({{ɏ[eE<?KL@pUn $c]ӎ:c}T#k9D-cWx+ltvy0.]GIAL2:(!W{Pײ_s =v=e矂z(IW#fpUP6oP8x_1A^ 7KGIXk0 ͐h'd}xQIܶC֮«{|G"$yL7C PHrzH򚄥ʝAՄyN(q-gx}F),L.aA̽P13 <|:4 U/Úp239_st-xs L8WK `ԕP Pe0RFjaMt?.pbÓ9kQrE k\Nj4&L0tۥ I8Is6E߰8KԀONaBHFvʎdQ)u9gPCx$Nē_Og;l.}^t~x[\v7`}U96 Ep:q2U81;7A7t#LOA] Q^ӫv\ %)Hmf>o%΁MN%$k=6dd,> \:Ăö^6OA=ЖR| wy'lLw"O>ϤVwk< ݋|oczdErQ:uj;f=]xT561_WWf)WЌ*T8Kjb&銝KܝB~y,]=ETtqv'O;Rr2UCk`8({=&o`c mYƴ\`nߚ!ljٚu_ZDt tfI:+]ĥsEj@BYXk_kO?_/:$.IENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/32x32/displaycal-profile-info.png0000644000076500000000000000366112647526522025660 0ustar devwheel00000000000000PNG  IHDR szztEXtSoftwareAdobe ImageReadyqe<SIDATxtWKwf<3~lA @BY@$@l!XlP6I@$yM$ $2cj"M䍈udD=%Z/n"p"cMHSqIʧм@L(\+ۨ~Zdf? !T7m3=슠ٗ`/-;9=->iw ܨi#0'g(> ,~Y?)#0.L &p:baΟDk9VX} 6?1#~T7`lhfDd,Mpn`jp Ž]6ݤ&bI:=KfH1xgۖ)s$e&5Gw (ZM ՏaE 7Cl2$qױvoAʻ/푵\tԛGQ< ;(qj% =n;Y>z-8=';1هH؆ ;˨5?2܎B9r?+`8uZDU-\ftϑ5;MFMfEE`q2tM> \'?,-ǧ Ѵ{h9e±} %K @B1*}ˁ.ey\i3~!\MHui!@֏CXBqhky;yyv"{i/(N`` վAؤ|\_bx1{v82li~e KkF>>۷MR놼_ Ԩ.|;bPB&P*m>I&lة8@AF((UXo4~ L׭Xb!&Ǯ|f z|(y͏(HM0 p8>CC)b!SQ>"f8FYP;=j]7<jO</c|LیD!@-c'`GxQ[nK/?y* E ؍ c%6,=Bm@4ݦc}\v!50amcX ~z6Xt.}|qJ[[pqqN-p_x\%2&'6T=O3 T58>>1v#/8%%̢p 12ّر@s8dd`ttm&䄝;21_ngwj4n*(D4XRvzz 022pxpox:}2B2Iy ==[1QT &}_[[W쐮gV[t,,KIԯ2=bEL+c=7n˫e SC)8EƉI؍u1۞iokW9y6x"rhHȘC QD}-i~ w@J=G+++ xȸRc9ƔƥՐRjI4t_5 dӒ2.ZBV yAevBRI%koe Ei۱<"&y' ppaK9f(4trJAklnO3Cܚ::d!>X9 N'Y.NI8T[9L_Uª? z༷ DIENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/32x32/displaycal-synthprofile.png0000644000076500000000000000424312647526522026012 0ustar devwheel00000000000000PNG  IHDR szztEXtSoftwareAdobe ImageReadyqe<EIDATxڤW[lWfw7^YobmBc%$Dq0-%T[ <@B?I 'L#\Ok}hUyU4W/x^3XT,#oҚaE HՈ'$XYcM h? OrM5 kg0 $ʈPdY3@gCQmDv/',Kb}N u$3D}DGxnX}|S)D 4$f!B<\@hUvck@5ag#UJ!pbRH`3sBtzͣX[7u^$M*'slU:Ȟñ)%A^XBqh [c=]tUh6̎Y8{U<NnG/t'b&*{"dJ*2 &_v`+8 "={L+ZWSIj.}Tn߻1{ ,m'k͑ MS%sbY]@OéWRaZ->IGJog%Mu04nC;8ӱfDasKL&0/TDZ{l1}Dy@i4ytcJ .2=xy\_>U&0Un)EFd_EtD'y= G?2G=!̆V2*Va9jBJQ(|zw9-*H;wLJ@ (Ot/iAPzʏ%rAP899)ư+ CĆ+tR & G׆(Gܥ,Ծ^iZ155%A6cQ2r[[[YpbHT%FEΙ:0<}ѧH^-0<%Ji+\.'a)T- ;jpaF9V Mʀy (0W_Erd'aDZ`  ;#ۺw`*zА師k",nR9X'w`n _Pb zǰd;EcWP{ -Z^DMX߽,P*: UMP5Kf3mnmbQ\<=4wϟ)7[ d8_DY\r*Nտ5c&ysFTd'-ȁ q#Y|s[u j_7.5a&^ c!&PXxˈzB,r>eǜQ|NC/n]X&< ?L4a9RS~8:iY#ZOWpTB'`aXz=Jsk\$;d |; >Տ 0*?mEG#k5`dRݭ.:hr\.Nj|C >5~h<DLJXPQs6k%!d*(R\!RŒcY;COͪgХҵ[{ZG |3D3ձ޷{p_sܶޭ=D-(ƫ,IENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/32x32/displaycal-testchart-editor.png0000644000076500000000000000374112647526522026553 0ustar devwheel00000000000000PNG  IHDR szztEXtSoftwareAdobe ImageReadyqe<IDATxdWK%W]s}N"J M0 T:uDg"d$e t"tLDCzBJM'޻uo}zSO:g^{wI0 0qRJ|bac)yys8J'y#~˰$ud}P({&#EJd9s&WIX0I.a={dfsjRsGoP6]'G'ȃF \޾p M] ={&r\Px< x* _2u+.g%?^qJ\T\U!ͽ-]wYKؚ66[u#z.\YS$)K* xR~/lv:b[<רibCm QS (y0=,/B8eF_ 8="=K6?y&;+L-n X@޵}kyg" RCOܨhV Ѯ&4qvA= qݐpJlȱuGS̻|g ~,m;au,6p%|ڹ! ct 0Ԏ|*-7*\Xa<Ǜ;zF9$fnN(bP?|atG`V;Wwtq j2k/ZҲaTrBh/ΊJGdCa^S?teZ`ħ.bћak6H/+%[;lh ;g܄)@@†8k6y"Qh 4pGdȠvdN`nSZ^]ʏH8X2!,I3u8TxH!]FT<ČF֓RaL9Q{<&&,BIsk9&P*@i>Y9B؊D4R2ȓ"hl]Yre*J 7:liy)Xn'd͘ln`Gлy w((XA C JI>h1Mp]rɭ!]Ǯ]&(֤cY]WTH-MI:˹N,T\5ɉQ:,IF#2PW<}8 \f/>[8>v)9>dJFN۵|U08%L.s w#%L n.P BO2 ]dfƹ*3!2-~|a9QA+2J;S?߂tZEh`4+LR/u-0ԗx 䧦XŨ(#7C:MnDXuXheqowLz#;^VqEac>իU? =o2VFDfsZ? JE.Q+4ؚٗu].%%k(kցq$wOZ1WꎚpQ#B_r}e W]RUn \7rB?4 dK{) .&H?ߦԝ &m?^%O!IENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/32x32/displaycal-vrml-to-x3d-converter.png0000644000076500000000000000414312647526522027364 0ustar devwheel00000000000000PNG  IHDR szztEXtSoftwareAdobe ImageReadyqe<IDATxڔW[oI23{ߒ|M-vYVl ^gi<>TԵʴVְi-JUT9 Y_(~)jTrɜʳk|.Ja[GQ*o-uvsQZ߫LZaBP26ڙ2#KZ,<ׇ^CQk-~4,wIA8WL`7BD <\P1ҩ" h>[; X-^(qSRi Vgew}&zGE0 BkE߮.2lV1ÛۙQ:h._TmgSmcs~k;X FwT^CxP)A(* *;95h_:FFsSiV01h&>x}<̟·"*6=Li8pLNo}z"䂐qE d8xɧ0.b=^F0`r*`wySfPHActj]Y:t(;lhFDL;Nњ"ીߕ= 6âT`ۣFYB;(Np@Idctm} Uq$F}.}*D HЛ<Xx|G!ܝÿW3?uuE㨕!]1D?C{wQz9} 㟇c&acB:HN_UǸ}:fK\3i)?Iʼ5[G$ zAcc6i`40{o-1eF|Ɓ)4 ]CR^8ȔB=-i N σhI\]X8?҅ؓN'> s淬. [koAy_0?VSI Z*c cCzzL7uQ{{\PxAQa5u:tf0TkzG 2=,GAu29a6&XL-S]v4MR3J0hG V0lFbĞk`X† 4#X XEh=n~UũO{ի{-۔R1*c*J މ$M3QԹRsWTG'd3+L}ݭfY$Uڷ}|vSS:-u: EHۨ>%%xp+W ʯs JyƉ,uCp}_{~zWlp{hNUmWU* r Q*CK#6D1)@%\[E%e hv6>T(T_AU ƏQ.t {r;0 u0!!51+ u :Ct^w3!7>>"TU2k0y+!Q=E'­(4*To!ѝ`\4E.@,eqGHPȁ,vKW_(1_a^J ?$cFd[p"\Xƞ!z2G7h`:`?F Q֨*ܭI8Xb*yC"~Uf񬼌Q-nt?.Ԙ/!M 6k^V_094 Ȟ~̓x9_~q9 #55>ݞ)9#v?`Rg(VM.8lDn:K",uۘ=:z@@?qCs\IܧH\ޓ/]CL^4^GPM2zUr:_cūA:N{^>zkxM K(hA@ 1#Շd9˳ `όw"w*g4-Wz(~#ZEţWxyB6fy | P!9dm>'z׌u67:ױ[Iŧ89h@ qFRHh#nD2B<^4(xMY;RA^װQA'xQ C:8% rc]T8ACY(3f- TQ6~2^af${mEbB'r2^d%bi ڶA} 9UhlG@}*O;E>t.Cꥫ{~-]w9s_v@PW,w?쎉˾˥q{48>H/q%\ U㘯c0c>Ob]#a| mXO;@j0F!K^3.a tl@z:9Etk@;l]kK 0<7IENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/32x32/lock.png0000644000076500000000000000350412647526522022070 0ustar devwheel00000000000000PNG  IHDR szzsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<tEXtTitleOptical Drive>g tEXtAuthorLapo CalmandreiS&#tEXtSourcehttp://tango.freedesktop.org}QIDATXí[Wk}g.s}Q!*6Ec*6ZJjHDLLScZHIK*"0@ 3s{/ΙqF; des*mV_]?|V1ƻ*24p 'fR{͛77M2 {#+V>U*eZ @ѨC&gNJl|w 3aÃ@QJiK/"I•6}E/=# 5 r9Ny3xb^?84###~D+cy˓`mۮݖyk߳f#fG9r!_ 8zWy׭zjGWTD%94ԋ۷o2ݻ3z~`a?w %hR}k8F7Oky -[ 5fۥK Avmp(@WRq +!j; `޽<EӦM^K؂:j5(*+DT%ΕAOΪs鬫#M1ԍ|&) qn7FU8sX+W{ծ>I,-g>S È01 ߱{N%yyJ?  b˄2{0 |A1"1AB~FiVT4UNh4@ms'9+10'PO;:MŶ3ϦPU3Ȭ)wNYYA-Ib8^IENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/32x32/lock@2x.png0000644000076500000000000001104212647526522022436 0ustar devwheel00000000000000PNG  IHDR@@iqtEXtSoftwareAdobe ImageReadyqe<IDATx[iu~s\;CrwE:I]$v`'a) " Dq~(`GD?lHqDbْC4)XbC$Lwyzg+qU SJbӇLEjP$/1:U~C펭!޳>[hEA9w8.ۋUasq\`hIPL$7{G?حg:ܽd`>_p6mq˃~ڇ4P9h¸Z-A/x3V?k4}bNX?僗;ȀCHaԂZ}~ͱS…񝐉/t0::>{[bL<#'MS :3@ܔ9NM|,M/|k#gG=|ۭ{`~sB @7&(5vtǀEo-h 8q:H(O`_y<+q\M2G%،0 48~u1=5ScrYHR{a_p PTFhM. Gqj5429P*qk`)0+q{~7o=^kv0#E!4ئ&?3gNcR.:{oF  )xesW\ڶ}+dT*n4\uO_?w5\aE<[0ε]Ql>ON(~YxY4o]\HÇsFPGΞ=ݽgW.!uk+/ |Kѻ3gof2~ӿdYKçN ]x?\~СFuLؽZ`Mg"@`<8sprtLxڊJðuWIE \$uh9r{o;T!o߾܇lji]:=o_qZ{wSQTNiԻF}wio_^Ν$)0r a+uz^xAPR( {J_6zh|#[ggfq)in60П֍A)Me3ic<O[n V9:73]X;mW}5я1L04dufKUurU~ 3v,f?J>[3eG_?-j-m,@Q۩e tE%yK t.wl6(4^+q-}5d(Uڊ.|Q\tD *L`I1}o+ ($`l!C!9NU ~u.p}i?[/kGA1Bc9c3>a~nV@T1`,]@3@c q\G Cwrxp'D%RuX#-Lxp+_,U,qEoñ O9A@FP,xp2KYjcu0tvLplXӚ.m . )yN~ %~a 2,)V-3ul6Fk}ؾ&0>`Pd\B.C&њ<erQm?7"|.a|S4'HæM%ٜ)q?ƃ9jJCCJ).] 3a\j0ߡk0*-׺Q fQT`~8n Ei-J'`t5RlcstDIecg)ٿkc0y & ;88M¶` vƻH%k4*&6Icg\Q4X& LM-}b 8nF 0QM:ꖦ&ı hX{$ƣ18R/`gZ Λ|NU}N@9^޹n-3o! 5zLo#A$H֗ZDE&5z_Ǎ,k& Ȝ)fӆ} EՇ69FmS8E$TsWf}2uYwr NuOC% J!.`$*;RMz\R.@Qx뭺vxW E#~k-?LcD^]"m'jm#+k4ZO[ui^CHga{Pc^ѿaz3~VL{Ϧ@ʟ"֢TE%YAh11AD+Qc5Dm+Ƒ(_b)VVf_y\]ܦX̝;ݹs]pM|wI ml`ցz I͒9Nhoۮ kJf( s~I2 ݮKw@K]d茩Ϳ2]NGCZ IVVTe''3B.f0Mb" E(q&H$ 7@JK`z%a `1>FŜ^=Y'z n UU ZS~'px@Mx.[}}hFJQBa0L$A8PJҹ45EEn內%'O=Hu3xym=諃 ND-Jo\\`%4̜9k egv+ Ϯ"PxB`v,?6g#czZR2|w}&"X5&\ h҄~lJ) A"1 ߐ+X((z:9/{`K':eg DIDATxlTU?ͼ7NiKP bVRRD]fհݸcPp,f])#ktn F--ҖYL[*ߝλǴ@u7={}sRb$7M Eټum];eT5܎ Ύ֔'d$?rfS33k }yj@8,V&e,R-smۍ'̀7=9.Яw]6wN/HuaX@n\7!#4kv1Ʊ|.Ho|MQF D@ sOŃ6gTWsϹ֫.-pؙ4>x C@{ITבvfd'SDaQ>s*bQ,lU%SČd\Gڨk|Hf@/G/$4Ĥ+HIQLj9 o%0kPU+ONV|%6+{>%ozѠ<ھ5f^R1SlWO=q6mޅpj8iِkK/[ wpX "w@l%W}6&AB8֏9r蟛6BU qgdfX,hF !&~"]$°jJjC[n^AbbҩF}}~5IQ3= |@T7#"4:"͖@DP@L_/&q<`] @BD`|HPL p]7t Lf&gt*`"2 a`$R(B0ac3?O0e침fF> &F$> bH()`ųH::ɶ)JS)uÆ &TUH#^ÔY:3 {Ix`%(=x }ڍ&LEUͤwi"[P/%-cd΢/$'R Эww͢aK1<Oi+:zOly :V[py }dˆ3:{44Uޫ  j<?WJE- jfշ>/_ Odtdrϊ(BU{Q0L|w} /W \^Jt2S(,B R|Xf4t𵻓4~y,%3L_e?{IL)xj\TI]s_׷@ v+!ZO7vO-‚"ْw͆ш%k6$)-9S'j7sOsɉoCҼum@h=vֺp rW$/x,Հ5^j#Y,ͭh޺]pm{SXWWsviBTV6ȥ{Ԓbgp>wr76j#\Hb}O zogqÂ@l̽Y'ێbU]Ee.{ x( ? &i\J?DMS7_ c!ԯsCSrSHo;嚓ȭ> V6Ԥ8ºd_v};x:v!8]Fdvp4 DUbQeUGU Ҝ n2& Ouzڢ{p to[,Rlth"99_E" 6i(SO͗\k7;C-tzBTU' w־!^ gJr?@M\\89My'&i pK'mA]̵>#NOu`'[}&LV *z8v Ӎ?u sw@{ۚ2#Ԏ HaȢvbR {m @>hsZIENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/32x32/zoom-best-fit.png0000644000076500000000000000235612647526522023643 0ustar devwheel00000000000000PNG  IHDR DsBITO pHYs B(xtEXtSoftwarewww.inkscape.org< tEXtTitleZoomU+&tEXtAuthorJakub Steiner, Lapo CalamandreiTPLTExxxZbZ`e`RROTTR rupsvpNQM»{}xPRNwzuqso¼üľ[]Zuvr|~zƾ[]YikglnkXZV^a\egbkmiqtoxzuy{v}U\UtRNS "$%')*,-0012Q_jj|fkIDAT8OœnA='! 9JP:Dh!iR [2<QADD HbgPرϮi)v#~ciCfs;GVwY}nzmK5ZF,(nwwz{4d} ϺZr$Ts f?GW[ n!cWdj`9"<( ]P)]M-\! $Mmi㔛Ȝ#$ǂ4uJvBP4 &JE'weU<ƴtNPO9-J}‹px;] r& 춅uPDD4J9' :&3]^9RJDU-03fw}'yIENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/32x32/zoom-best-fit@2x.png0000644000076500000000000000545212647526522024215 0ustar devwheel00000000000000PNG  IHDR@@iqtEXtSoftwareAdobe ImageReadyqe< IDATx[[lTgm66@ 1 )mLHR*E) R )MVI!jд bCI`J1owϙ̜gm8<΃c>&`Ia?[n kB:ǩ]qㄲc/<;o۶`۱)δiԊJ8ZY3 /ziE{Z6y__Ҹ"10^kHݽx ˳jfh4H1&1on(>̶>n? ωֺuMPZRX?~,kMs[f0|bnKbG 1=Ŝ'ce1q}^8rCJ +$L&# +`_/H4]—>CG"Ѭ\~ _t Rk2\|%lzQOh{0 ^O=KٛPH$e31~uUQc9Q q 5|*A@:i:&D"0<&_w\(JӒd%kRLpꎦ>+4@E$& 2OPZN 25`s/Y>GA0>Ʃ|WB #B 7< =<ERfLCad/jPal>4 Ah&A\Rg޾{ Y4) U/4 dei_BNTG'l E(Ң據e+5OEYVGE߲->?Ss 84 \ ;Ѐc{۲)dtn_UU5fPԌ%1;\6$ Bx<.fu0}w:\q6\ ` Œ) =v4;D@lI`,L7 X!&;T˱9+zQ|ܹjtXSg_1$dY!hDAG*]a p :Dexxjkk1MFo 1 J 5G2 `3AaQjyHyx"T3gAKE7:|+j3qu6Рq6i3;( DHX!n6>!4p+KWX ,͵}+T`L}d9RjPc+v A?]!">4C5,c,q7J A3U)H 'y@9zCGVH aEnJj6&Lj"\ʵ (s~j!KLGꯤ$#;?cI$<: w@,eܹCy Rp|';]Uk<9{GA rGu0B2N58۳a/aJ:cF5U87zEYi۸OvSAU~)ƍ`[?v”@ҲuCRGt\@4M8T/Jlx̻N 8C9۷l~˯>u =vLPS׮]|O~rE$Mdz듶v/__Fѥ/KbKԈ b[cZHQDRC"}`[i;3LJ{x`ݳs朙3, CÖ-x t֮:KyG8A&;vĹ<͍6}}LBB1Ɣ\ӧ/ꓼv-){{ݰ@JWf*!nj @H9;zc ˾1nfbo.h bZѲF(Dgon Z3Dcxb\`|߇5jkm!p:=" | s92k&ԁSPbg6u kR5Ƙ4Vk@(@$ {2.JR}&1^s6Бn ҺN/!)% +W_ϼ= \tMEp`l $SAΥ "*iʱlQXD5@;Ԯ<@ C;Hmhͧmƒ<9s5!#ۯk֬mA@HgBpE: EJkJB\c(چc<_s-O;3g~ɩ ?zf@-0 )Ywzzr,~ڡZom?rsߟ%w=DA@=LuuRogwխZrH9ƇpQ Ҫz1$۴QOoy44k_t|SJ[sgv }7sӧΠPh\)o\➻:0bRc""XYXM䡓f#eewF‘AĽ4X%E, 4 C<~/$ wWE?|ycoY:[u=3(x=YɷB'b "e̯GS1 <@< *SgVna,wa+ĕ c(nZp  5rcLV7.`{ +PhA+]@Xd3(Y騐kGt!c[)M$drHs5t*J)-ϗE ?]@C \6tQe N˹_Dwk˗բE5ÔnT [%L.GhU\aX䨩W _:JJM4t_8p\0Ӈ<0{_`!(R"ApOЅ X!h7i$AO&:/L5b bt(AAdHdPP%r 쾤_ ܻW0 p(.*Qi~Dm/Z F!o>*P >XA&Tpuvr#LSK,Dh$mm3e@N. _3A`(EhŮbnܸ~ r+/*gJ{se Z[52 uM[-i\ȄD'Wj Hxo PcfⰧrXQM p!8UQ=UI aEƣ2-Wy9 }tN eZ)f=N3{-@1=g Q<˷\waD6fT_S@|r?ifŋ"2HR- z߃\@BAA:>#vvvRa^ZXJ`==?u6#F5M+WWUuguSx~o =-;H$Ft'u ȶ`S*!^p3k'"[ꍯlv gNF,0q9TWt&Lu};Ci&6*Ôƶ+޵}W_xo߁VVVXD EWŭ&-O6t-ΏM1ep-%$XW$@~oom`0(&(fcذՅx߸v\z]7$J]2ڶ/A}ܹ`(Tuf1bc8jڿO$:h>|JnVH ZWIl`8Y|ɋ3fLCEE+c* ]ŋ'.uWǛ%]1PIu٩73RyN(,V>8:(2cǦ%z{{vw^qٛ7oې]K69|)8 C fȀT61LYIŊ0y%Rٺ5Waٰ> T{hlPhN 7@싈U).a4=Dnp<y0 =I]EIENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/32x32/zoom-original.png0000644000076500000000000000227612647526522023733 0ustar devwheel00000000000000PNG  IHDR szzsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org< tEXtTitleZoomU+&tEXtAuthorJakub Steiner, Lapo CalamandreiTIDATX]hEwwMa{-JORAii@$}kiV7RC Z56FAT>HQM{4ݙvz+=s7sfv4kMG]`{* BJm@ke-hsF#gϞJ2c~Bi)gI)k/^#:p>+˥`dd^׭gאq48ض͛dpGi:=zPJ%~#X!hAEťKt3whnZI$2vxԐX ʌ۶>=A[g;<s|kjMAaϩ <{kJ9fP 쀝_9x1Xjw]LUq/ &Y)0xVQ@Nq FGG!JCall V7ϟ=X]{ƼAe@fo non m_|0,) h:VLtdl! K(wd ?Uo1s}q| Gp jы"W *SE"B Xb1LAG0(360g] |9f) ؂fMQT08sNJה$8cMO pR m NGLm6HdomH6=]8ث膿qYb&N×6ޕS XO 9{by56AtAiRx .gE8Z̊zgH(N!wVHUJ (iUW !P",(ɤJ,O: $7(2 z˔ >(" eHf/LRWK:{ 0}@ːU`afkgidSbeX < GtQ 鰠iiiGJ@!$:q,*A_%a k3$NzJV?G _e,md{V6:x,:nu) Ҡ{ 9w [&X +u)b.Zgg @J=⺲|^ƲfTV1&VsIo͞* #%@&H֚Ua6K4AQH ֆkSS^W[Skk܅r(Ats||7X1NEXhIHgYGE}:s굫[[7,xXR(yG<z<^&Y5̕?o\A1+E8gDwN}p'r!9wUBEu.4mj;>Aw}Ph7|uv~W=܆K&0p=x啗Y:r噾}gdfw<28 ?%q@Oe؃ۨA[u=@ss3[&O$ɤbOLemiٳ벛xc uXkV\[_W]5-;=JML.K]Sp!/]Bhaii˖h1~&h Z>3ƀIms1@i50,HDƘI "P%_wYk' qR Dk#M9ֺ.Hq8B_Zk9|֚ T22"ؑz8` SH`ByQ"@J =h^@5|ΟI Ж@ Z %H޲5upZiR<|j*81:(YH_MNa)%݆k*,wC2 g;)s_ õ .=\6ń[aO:W>ﱞ=W\^.mtS7n^CW^uLA4ˍvwo5g=w0޼yM/_P޽2CPTe,[ 14v1F8?G~>C~27ø,5n Wvoį 1 I+&`lU5 @@V2`+Mzɴ]IENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/32x32/zoom-out@2x.png0000644000076500000000000000366712647526522023315 0ustar devwheel00000000000000PNG  IHDR@@iqtEXtSoftwareAdobe ImageReadyqe<YIDATx[]lUvkDjk!jB[ˏ(F{{{Ce\FKKc %ؒžPmuZx IPQ(|TV,0Pwpxiwڿ?6R}Xy'x;JN=DABkj!÷}i3?C~_ hY&,KKPt<b궶_,v˖ڧRKryqܕSm(x[Yi9x< Pb*W-&`0D`2MӐ/0n 7PPF܉YaOS?,w=$ qXezɘ|sHFO$ )NVS3v067: :&:8cԡ 4NQ 3##x=Hˀg$NTh4j!*RS ДCtPxNw:/f/@U4+) ̈, [C9Pu K+)O*[HSBQ -m ʥcJ zjf(\xL#^]JJ;)D$#M P@ϲr^H"D] @B+5@ELP] XʲT7U@  q|udQB 3N_// Sg$e"**ZHeePlE_~Fplf+@T,Z^( "BE!411]#*F;cZ с @$= hS˖( k5.T >&M<99\ v &e3!F'h)`;fl$q PKmq (T. nfN<4fz}q&h:zv_SnFi&${kL*`\br[VqT:::JxGH]H4bSYݒd'xપU$x`J,{p U{Wn b N`?r51ÃO'lmmQv;/]Bk֮5N= TZ?ݻH o񯏽]YY">$InÕꨦ*?;oI(yLlĖ !x,>@.>;ֿo>m`_Gͷ.~ 0 z(~ ߊq]G.XHrQ E{;cM_0[MMͲ'WW}x^ڲ?AXnwHv8qMb7<%zT\$&i-,*oذpPEE+y4'=X$̮]шݑ'wvM qa a0*L<n<\q+,-), ,+(t + %q()p@Y@L\r1},v!S ql,%Ui|rR0'`J @ج$.8r 3YW3i,Ŧ+l. &)j-` ED)A92A|Y~7G<yX6UIENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/48x48/0000755000076500000000000000000012653527012020436 5ustar devwheel00000000000000DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/48x48/3dlut.png0000644000076500000000000001236012647526525022214 0ustar devwheel00000000000000PNG  IHDR00WtEXtSoftwareAdobe ImageReadyqe<IDATxZ p[չ>箺eY,[5v8vpI x)ii;y2-k˄7P)(MqbNb[dyXruq&Mf:󤹣}322/s<^| ]|HRd4#kCQ&- !>0$^"k W)IPUr7㾫 V B}}} @r(&LhZD(gк|- M\)H)B٠h4 UZ[[A,#w}s& (XKٳܹs(Ȑٔ5iJŶ*YRy7tO(><11`F1I^%J4>>!]rnh4z4*T}"rH(v$ 4_XtZ6y& 1^Q$?_ĦϧX,g~[+dWP\w[zX{7%DQ*++6ߋ$4tttO@Tva<5k %Ko&jE9k?9ؾe CLA8DxZ:Ilc4rPN5x"ʍ,ڐw|NJ|?)9#+B@ T) (@i>֖{Ub?"V-~vNkP(E~W@ +r.$D9VTqIZ`NK~0$gs .LE|=h@I'Fi,>/͒$B!{a42"cz!Per!n{4zɄeh&9{ZM`MMޟ5 u$]=7gӳMji>z! n*E6Ig_yFIeFoEE_(ᑀG/>]z,Hs KN[jG(''x'NC|(D8a-81au4p XA* xl 9z{c m>T5yqʒLP43V%5tJLzB2M*&/rLLt8kY#|IĻY%@;`M`bNLq]LL." QN(=D9++WfO±FCk-ac7'Jc'KU)_!{&ʔeELFT.w8_(|饿PhH55P8@']%H& kҥ'ULLɱ =b+MF}/G=zshOG"5|g}xxH M/oˋirg߾Çn uػ8 aUnjj39x ɨi?gR*5ސ Kha}U}O]}X*O%U[u7o4 3g6Ic@F;K0ZWW C]]_L8]㸒JVR@xV2 8T 3'jo(H5@[ژQٲ~\ G0<1 ;t|*ƃ/ؾa{-~ ,g?{իKo lKW^yu5kr;6ov'acνa1"&_ϭ M"UHғPĊ>6`}AŻ]Fp_ؘaL|m#R7j=0"G˖.};w2ze`7cpP,*&Fg >/,:PwPp0u= @ (5=|f=oo:7om?^UĻ> 4RpT̙3]n=[l%7zqLV6;ƗY灷^՛00mncCE-u0F{Jl⺊z *)#M1*Ȕ_2[T;>rb.dbҧ5Iǎ(b.cD/  uV n^X*ϬA䧦2i3i7ԈT]gA D:7*9`]ԇ/Z_0&>%dc$U悑+AG:8yɪQԖԐ5ttP[G`yN.ma, |țݐg0i AIbKG<æ)T 9a9zQUusr*JS[ Xvw hR#GfB)gygiSd ݘV!>آ =͚=6UrC#pq0``ڦ+!0LIq8nF+7G| `WV]cK5edgѺJœo@oF;6tOv0ݾ6lI1,8'u5SWeY4o<a芳ʰ&CJ[Y co {{<ض}uBЫ̌,z3;{=ڽ#Bæ\+#f=-5~=U)V7ڷYΟ( F"o..v Mfϸ8<޹soبݯ\ @/x猤=}˳%о{xh V!GAi[{‰'|>4ۚm Ÿ6{it[BČH CPA?dg~#G&`bܥYs);(rK1|a2@ 9s.'ܷ~_/_ωGT 0,)nVjg~B˵^3j h$"h:VUu1 'f6Qq~=xKU’fZÌBg$oZfc̡(Sɤ}^=BOϤ]a .JIyTaQQ]YYY=ZX&4_@"$9˸oOH2-QEE@,s`ŊZ'#gS j >`]83_H֨tt/o6&#&$+ءA?g܅2$N:F%D`0@Ų2׬IJ!rs12BNE#G~%unZUD>SȈ$?Hlb^ncHk"ܭjpDfTAH:X49%׈oZ 1ύh஻BR$H@N'8p&\X\]2}$!Igd@kElJIؗOP~:~8$/E^y%M_7DD}! 3b>0ׯ=qcr6'f6 ASGfv3_?3G6}Z()ߓˉl|LI#믿.0"{j6Wpvv;JQ|sߛxciܪ&H@&iq̏C"/XViD"bƀ_4=ũ2ɊtNЈ_Jp:)aJæZU"9э>q$K?O|BE5?a)yl갨#q]&0$2i ***`6'{4=ugЄTJ3Ҍa!!]iV!訝G^(W]X=E%^Ef2̭qNR6oެ3y?.ayzCbU{Ӗ_Rj.,gz)֮(<S 0H˖-=khSeTg-zClڤ,S $ҒxwbSSo>ڮ\QVƂ%O1F{rj#097w!wa?bnqkGoI7v%st>Of ԗ5:Lpj5x~_!O?͈6jV5#y,`T#| AF`HnuWo6FlE_{5iݺup?JzVoP1 "?1ߩm^bC5={昔sC5*AWPD_۸q#:M6 zTest,xeg vKqLd84~I<4j˭c,fm.qnو"AHݸlgᘝxϯ.)YT@6Yt:uu\"O^#>SMp_<%@'%%!9}z%t\2-oK3P>#{R5>*r ïER!-_vM~² ~fmٰ_hhc.C p6DqAx0#j@h.~dI>U ¹qb߯#dgJ8u뾌'i?ɓ*MUZ?MC Ss:+ % $I&\L%fp ݨ:W?gF$?.ej/KuG_TZ Ip1%))/WE$PW-+7@QSvdV$cÿաA~H*4%Մ`"QFnnGFNra04 r䠪Ctm8Aʈj۝ Uiv 1BKS"ˋ1{ BMY$ Dģzgq>EV4v?##qhnqLhڍ'Nwbz&NW`IbAQhDdj 2 ed dUR vBouu}_)PEd~XA;sеKzY)(-/W,#R!CCamلmxwTRG1@Bls':=I>AnCg̡⫯ Rn4ڍ%cp<-m%#ۻ߯ۃ}!4" W%--+484$a#l6K(͵ AT%iʿU͌S%{QЍgvEzkXzW 7 zw=ҋ斦FbS/VPX$EbTdI'fn ``Aw?(`|@ht%/hF<A=.?zpno׮]Nom:TrTp\Dlƍ5Miv&ĉ,/r󸌟䋆b!iCm;w$M+V\:w$*Dɦd}]wsǞȶg, \!-=;; uV Y-++?0`H.,ΩɊBb1Y0cJgӦ{}cG]\td5{\.9 L2/UZ9鲫6+VLH6:hvݷ RV]R$]ԉVWJsW\| 7\ZreUvzzmC$}wɵ _?^gֿҰ#7ז:cM:бg=r#åUᠫ&xv[8I5 \NܦN"e *_%@phasf(WVQ(M/-5gPpHk'͒fqލEgEMzS(]?w&H>]t|~r===uڢjAX'ew}))08zx#////t+"JZ{9gf d[Ukeδ9+$GZ-/|_z!$ \O鸂tq7Ma0~e 6≮ 5eȘo$hs!4E)":r4Lݽ@.-}PSSSӟA&cXV!Ȗ-[XY`DG,h4|7QD0pe<,.ljb264KDgx(Ҙ Y=&('"-XpI) sm0I7a~߷kZ a),ȟR<GG8'O+4UUU%Sڹsg+%55bEj.?4!{U%0[L'4Os㼕ю76S-} P:*Y {ʸIMcV HdtٰݍW݀BI`(YL†bXi3_~KXjչj.Ѱ:(Z6< DYv%*3* uUP=j:Aj5,ut2pK §%&eC>^rfbAF0ViHф!a1 R>3D}='*AШ?|p pLTW޶m]AռD8b'B;*,᭖^Ё$S΀1 .S3@eBDt*:6 "&EYb q}1FJ&9sBf "R"Z*57E{0n'm W̊I98Amxu \EPK>;F籠Ks%G#>-\twa+~7Ԝۺukڵkz}\ &M,VB-IĒץ1ѠT_(An`ԄqNm[ s"6YFLmfr" I3{%z3&ɦLNh HF+I)fb\#mp=?)I*OOu{ Ng?wCDcX e(II2=] -쌲P,ZB:Q'ukrSiӡih-JxT :3avN&0mkEMez)VM_fEX6+YU\)S+/f-ufƒ% fefn9d` ~hGx9th.rPz>mFZ[/3X i>J.*H)N yCb11emYeMaaصC|\D"bC9V.=I3Z:\SSfn]xO*Ʋe=[R qhNW_wj2!==ѣ}.P:kZ)N^~*vds.)qw-f9uޚyG|#Rdؖ]&:5?ֽWZ7?>.8iǘpqI@Aa-o'8#fggşI)tQQU, P(Ţv₸~$q1|xACd漙y (9$ћčt2?8N'_eSᮺ^qP~)R[:N3gN^nNb'CQ\]Y9hR ]Ff995EnrӡDLp}|9w޶wd-ESZV%ɔDXR qf5'S;>qg$2 B|re/VYR-W$blQk.X}0 ͦ-LA?`,6 \6o(:N3=atuTt.%:b!+`_YbflKmEt'9'݀%Rڒ&'//O^n3ϰZ+I%EEEPWkZ 5o. XB:z8@F۰)ɘ6px\#dCC--9]\1$ƶs(g2iqv-zPڬf-:J%Jkc{;_b< "( xoͪp%̟ĩ"3e8q}}}Zd ewӸt<~\*\Rf!ϚdHb܄uw:;_jPO%\1oI\SYemo0pLP|Ԟ}™I7'ӍY19cXٸcaW\|Ws/6c;WnwAS.IeGA0xskOb"`Ų++&@#{g=vͮLO|@.(~닖WVfVXWWg66] #A{kyQ6ohv] ~@oxCDvLlKcmQ<z PvuLVb0ᰴ__y {Tpz*7GUI*2m3rx@fn\d><4:;Bٜ*GtC넎]ݭZl96!`X"Ȇ m&.QćǹF8[1w2&if£vJdnl c6,׽7H 9DF ;dkkap㭯djE03.8"^I  >WQgM9|aihI>%$B;h:C1@Hb$QЄʾPs袸aZayq,qX),0YG?+,NDЉC]:7oneڣwCH.UCOjQZ 1"Hy(7QlON\]Dɖ{7omdck3=y9(!Wvt"R=s} r{W[?88& 7~{+tuy ֭p "<;!~qс@46s)k҅J=0Љ2܏DSkV4qNX`Ed ,6 =5hK@5hhX_^ψ"1nwQ>p!RX9~n?&IKa)#nZx1#@w Q|/Ğ NQt&(K6&#sVLHpv++MlUיcƌ|($~l^kl*L3SI]LXDˢ/OG,ea u(spgf'/$yΜE55ʪS-"p)) ewܒsp>\ TfIV1΋ͯw0!@k!lbSh{RIIT V+&A)U\~y圱U.}SR-74dNVvGo!Lo?6+ 󫐒cV21 qΟᵷoIKh[ݗn$랓(>R`{̙3g>U*T[ڥei/y1jZHMf1RMÏ y7Rl"fЩ^Λ͜bavFш95HM'wR.Mo jЦSVh@"6l|ɒ% ] ?X‰뮻]vYl6kKiaQ)<}.?{R2 N|}lP1e S ~U-L@0 siC7վ=;`8Phʥa ru|K 섵X9fp ѣ!٦vZPY)Il DAi6XD۠ r=$`+6nl0/Q"[o-˕N?fFCc6-%d&Jfb`*10c[.\5552m帽Ot) !L[zzܳ_HЌ>?h;͎P6r}& h~=C? H0hC z C >>NS-uɅyn-=8yD\eFl fEAăHF47nw^:ζ68esRA [n} ox_u| ,-rNO0=aٲe21b8N5d]}Vd$pg#ôA$#ߴ o̵1O7wN5Z?iW+a13?>inF;F9'1 hS= XJPѣ&K_Uf+ki?‚8g$+Tv$?/`=Y~|q13F(3:LFC7}nSƀ [kͲ"$?dYzUW R}}}yLztîŜ-V (d2wcWHT@ $LYY:ɘc`DaQ&?>㞠 3A~+8_]f}xaŤ\pkUVcKL>= ϴ0@ͱ M{e{LkQ4#Oiӏ/r .EsA9a5,hiiQϤ; .+`0Z枾SQo."|ܛ4kggS ƀ*y2'rT˜O[ҀJYPuX2IMǀD^nͯML㥞J;?#%z"8#S= DzD&'Ļ~WO<]j5|}nZ:SJ|Ҧ>Iˤoaq}XCZeDBNOO?)5UfO0.]l3h;- ds|M# hJTX$ 882A y(<0;vL;@gm!4m)6`_G1[JN40g=sXx1޽`2ʡZ0A8h-j bi'\r֞/;:J 31M-ٳgw}7477 犆;yfR@\UT`ѢEtRԩSV2z談9lޘGpz!0R1_bSץ =΍k7>=x{ozO=5k9=g^s5&Mزe L2bv8q¤9wL.-b3yMg|K׈ ^FmY;(_)^]9fӵ7_iVm[C=랕EDo0˗/nIG7MO4>Z-S2@ф&H`A?7砂G;ָ/YlC.>$62jd3 YAcV7BYI6P`5ajFի̙3O9,[ >?Y[.=oG(Y\F!BgNk0~\U˂c!3[ zuvv^ 6< N[ߝO]}XA Ko$B"؈D)B--x D#m~Yϸu{GԊ XOqɈmoܸöbi2y䁴sgC]D'Bˇ(" /8Rqh.{}dhn7Zbsϝ_'xv ɴ 췷.xdWY*Ɖ M( E8ڄvjěrG! xXz-]ޣCj;쳋]vA&aÆaĈUSJ 䕀ˣw5\[惋G\ G]FC]`"_}a->呸HQՁ"920KO"Aҩ\8 ӹ1QSb( ~GYP-?Vltqt3Q#MZSպ'ys1dF'4۳䨉q&lQL#u%AOA'#(cŞ4gvRZu'gN5}jc5|0{QZ>$hXWPZ" u+/vm꜀׏cVO1oD YQudQѢQ&- NޖP3J$@`%1c(s+Mw FUEBFrY ~b"aHq[@be%_NnJ}AG j  K5[-wU߻WUyIlч0q:W!w ^$Y2X ^]P<)!eAAG/4{y\q~N)/y% L ĹLDhߐjcu:r) O8Wa!W^DDI"¢l2y x>0i߳m=V57)y|,ɛ,A& d}4; #]TjEA=| y% bas֣ZC;twd"FEE>$), &+a,% ]g -;jA@,H!t:z@vaЫfatZ5!Hq=VVW)JO&7Yߴ5BV \J߷ Uы#55xq}7ypz; 7_DP6xHarySYتw027j^EA %Flj4;]i\r`.cќ TQHjg[m%QB) /$ARY_dgLltd]Jq`رNp1#AW_Bb(%[UkʂG[z\APDM+ӈBwAbwUM^g_~4;cL&ڮmY[?8|g(8[m);s<34*WNxe} rԒ׎eT<5{l5jT"z׭[)Z''q8Z_}߻adĆ ĚBbͪz(a5[wk5Yygg+ fO>QB9c3`!cƌ?^xwɒ%tuuu]̏wOb`E3oނA:϶N#N*`+Pbw3gB.rp?7 NB7tѷ %dr;q0R"Mi*{QoI[{ Чk|tW? F]#4?&P+jbIENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/48x48/calibration@2x.png0000644000076500000000000002516612647526525024032 0ustar devwheel00000000000000PNG  IHDR``w8tEXtSoftwareAdobe ImageReadyqe<*IDATx} En={f@DHb h (^ *xA Y(' @QC.O $y /dee{d~ET^ E^eǂ/U*v[e5 /\?~ls/u5zbE(p3FAcQZ6z\rCɐo tWG|>tEtv7%ٮ#UA.轐{Y#֎b|e_t/j_9')H-`8HK ׳Vx` Sxq CF%ҍGlξȔA4R3B^$2K.ˊ#@_~9RCTǘp _yi_uZQ7 yDd`2׉)-q8-9&8߀M=}c7Mᒄ  b^{X_Ep\+ը+7~ M@a ~B*c2%K̂F|~$F~f)X&VC?a #A:Mv$ ֭[G>=Ku]CqK km^/^:A6aE"h@/2Oo$z~6 Q?tJhj\]>'#4R VʕX M;5kZ6|tUz'/?k{Rq^u52@B\4M2D槥 ߖ$&b[\`G}}Ԍ faBZ6NgK,:  p~bEP*"|N}ٮxKB!!|hn@B-{"tLKO_Jt,tVzWc)IG}ꫯʕϐ!qqX>Wlܤ,f@d!}N3QWI*d_Yu  uiφ?ȁV-*I$jY=i)R*q dNU.q̝y9sϡgyFd銗GUf@f?_Pؼ # y+q`68q[nVȴ|YH?[LZd'Q 2hD٧y5\lL/0pٲeRFAjaof=XTVTKsN[6፨HKWJa"פv "+GMDܕ}' ?'༥}XqȨ8|-|#l~(IAn]3mLo!qÀlD<~ 7Dȿ?a[a=G*0?7OTc?1}?|5/οIp騁z#7-RcԉT]><2So"?0=*z_tʋx2cO~|ZT8FRNDHHʏH! 0 e$0~{|Z"1LC -4"B-$LL}&?Z zfB!|eȐ#I+mJ83Ty^mc"8b3A6Gط#v s#F)M )!OEVf$(3$@dO?=CE3G-r#&S.Z0c ϑ'"m#GRo|쀝%!+M\9r7ĩLek,ȗx^!5r_: ^" M%a =}h|ޛ.YXɵؑ5P'X顎Dƙt▍NY F i 6=S,JC0+cRˍc{{%YDZ4:PC$P.Y^`Oȕ =00Ì3BJP;@vKpP'Az^PLa49 0:pS(Z8;XEI+\:NЂy~87SKHxZmsxp$ڶ!y%4!@J 1VTOh+ἅ8#CIh;1&v'Q*9LvNr9M=qPn=pٹ2DpmQIc]f4װƨ@QI4^fn%L%zTb a*d3˒KV$!AigR3cdzS2~fiHDAGL%1)|ychD}| ]DEЂ H Qzmw]ώ 92Xμs9$PXBy _i%M&K)XvKi}1r>32sgy7RU I~$)qsnR8k3aͶ.cdT g\ETfF3sy> %WlΫa]`xÂi{* j#иFLK^Su=}J7[0h䱯Y|Hu y]-وEj@oa9! u,ʀZwFTk K& 1 "`g>$ˍ( A~9Bx^zu5kXd, ۶QZ4ڀ)`Pqщ$KN 8U3}@HJ MM$"mXӓoX9J%*u=`ԇDD%1"իUKdAGM<`.=Z 9K[﷟* iY"LP :Me?Em*$%MfY\)hWO7j )X}-BN}7vtQ˂/ E. V(lT9';~ !F@$DBH\X#GITH`MHgiez/ R1vF!TUJU/Ak;cE=pN:N<^8}yi0Yk~ 2NB~wʑzhHhu{u2T2T!ﬧY|ѧ  @,< xRQ>/$F b1,RRLFD"b@u"ϑ" E9Q Y@^d̊0Y("=?xυG|XN͵ݷ q@H ddde.Yaԑ΁`]YQ Ɍ蜉[Pr14/, o'ᦲhW(Y XWx _ ,xpJeG8ED@HrTD, 0#ST`$]bN)G9zkR5ia ?7Dq>qO/><8)x6+Vj̱}3P~7>J3bFJPdIi$6Rh%Q AD>Y(h},Gk:UHM- hz@X~۲^g\pH`l1j'aک]Z4 fz`Pb&2MW<&DB y9HKT2l_B?Tx mF~y r PثM(R<2pt 7=Np ?vh7dA6(w*c}E0- 2!s̩|Tdڲ^O%s P?.ΝZ[[{}++ wOx`,zXR:'>Jt`9I`%PI 6x"`v]f% ̱Q2%azJS޿Ud\:rȻOɋuGJ3Qh=e??%& R,1xL#o kE9wduVVnɫƤHW=;hYpC'P煘m"wSJٌ3cl׶QwV:Щ*"SJ܆ymSū~n\\56#?:`ƀ[!ys-: D$Xi s,c`_dUX~<׽ͯ6`Rs9GK؛ ?FǏ2|L] {[--.#|P r eI걩oK7AhIHx?l+!#吠_z/_OdgzTbz(p2u/Yf 35Ҷnm+`G# 7! !(=Pr 2$ieH 01X^3enҔIPT@kȍRz6W8U>[L4 Hxo[{̛7O,\0jiikv,[؅(6괃hO+\;E lS8ɮ̓9Ü1i!s6 AVxvz{9i'ҕbZt5%tAL(j;Zܷv8cLMǞ/e Dmc3]8ip833M[=MIp^ڶ(6(K"?YHV-߈1Vݏ.YZE~|ԝ7jr-bذao؍7(Iɫ&E7o|?qșyPViTǬgHO=$Sge®dɬY#d;/-VzTr5׈SN9e휫v?yOOj!ƵWv{(^Kdk)yfwI#Ԕ,`b *6ǟ=*J Fzz.:{U<3!C*2tII7sg/GS'Q(xLLbYMT~Wt`gJ#gt',Fj~|E #=}>eC];ڼ[oVJSN·,oNE Rz2Վ`0ޮSV7xD L -L[S-D#?* ̧[ro^UidWlpnI7ôi#<"8 .,vW;+]/zן(0j R.e$ҳq.%C& \d# ʘH"nXzzfsޕ?.r,;竾~ 'x uKE™gdHU^ L"c.eK:h8j4#vfwCM`xq—ήÐA|b0bYM=TxYhgIle;ڔ[%|E?IPl#Y$=3:|IϮI"F',syb8zg'YvLz~FsVުJ i*[~M0- \p_n]X. dR+vwKNb"86~JNu k@+GpF7% -/>eb׫*}Ço]uYݾ"aO>d8tPu?LB^EFàG^K_y3.ɢO$v튆!Lq;Ln6+4i㪬%~u- e<~\;n۶-1c;w.0anG'=͞=[, e^,!I xY™yGDq=4R`5t&U.Ptg]mxUnhy`?m"; SaeW9׭袋=4vnKR?ՏcoVMڶtg˔ QmsOyB&P|(b'~FSn'g,쐥>g`66C|_6WEuzm`v}XPQ_5Fɕ]r%{ =7;Oɒ9sB5de4H ۑ( N-^RwE(GGNT|\5,uW^bgʣ"bP~mTxMjp2o[+k60 3c*X%5jTT*SNcm{1}cĉfx<°_(ފDQmۆ`w=?_FG)ƷIcbl{[*gI8^ħ^]ѵ޸OzJN|0 5xyMAt-[q 7N8a0Q]"@57mڄB LM/:::;C6C2/\yuEI,X9":B6G,lTNhoeK ^ mg0DNz"TJ $!^(tw9`l\8Qgg'|ސ>^x3}v)z"$H6H)B*pCY`J}!Woaaf rUWnVK3T<^[l%J $Hֽ_ڼhDQf5@y8gO%:x=9̵(Д Ϲqx0w [e؍lƛGM`(Q A[a ,7ٮ| CE 03IENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/48x48/dialog-ok.png0000644000076500000000000000373212647526525023032 0ustar devwheel00000000000000PNG  IHDR00WtEXtSoftwareAdobe ImageReadyqe<|IDATxYylٙzmccg1ck6r8Q[hRJTU&-EM"TmK@9PrbklcY/{y9_g,.Y'}z3~}b!xy_`vG?v e?D?3iVKzizaNίnu{3?$I ]i `XhsO|Br(0A4ֿV=kfY9ET@5@)p٥M𒤔 d8Xeym[,mI|PqyFubQx9 s@%8%Pn*-=|7,f`Z_l09dbhѵxPYAIgM$lFBfw A&M5e죖VU?V& 8$c\1EaCHz]EM{Z*#ͣBVajJ װ2նb6oYWHN!(nEJL5?l]W̊bxUvA޷ct)(NK]`/cp7 #d5q&!Ak$"dZ{Xx^lɠ ,tP qn{}agĒ0ǽ9Z EU<=qМS@zkK"zNK[~-,e]{T/ڲ IÀSLO> 3ha@٧a*-d[`+(X&T K eb+s*lmg2,vݸqM1 j>D/&v{uNS+eNo0ۋaL2g~Ai!:^^BaXvߥE͹Q8,gH~mYN?n7t\PjbK Q]~O5@ R/0D(bI2,zl>Zxyk`7ꉏf{B~ncHZgRah,z'NP=bq<P~>}\>m{iq|n] 0>O>iN?>v'v1%s %y^'EL2Җc_40`2A!Y|7.\9)15ISםؓ ߴ$Gov +h"1ymH08LpM!``OLw]wN.ix~K>G)0`@B qCCe0!)\OMJk)x2:f>XMAKIs>v Y@"Nu>S|GQǷ#,_ HB8` @׭ !3TP.Ib] {1Dzp%#4`I~ڕ[.ȿw^=x@ 4uT"]=d(Z$u~Jq|g&|·#? Oo;`\`IN@]F_jRs\J:Pk"ʊd*mwǙ ػ6sf٭»o= ^2$el{ף 7q~PQ F?+TA 4^i'#*¬臢7 :-џ«o逼Y%Jp([~UNRcAȾC@1@h4X\@l͉.O|nN܂WN#ӓȪέ[pzd:*Q6m1i}L2қ0l8w/z?p 0W2!iCka CᕷNl.UX_P+ަdB< lJah#-H>Y(Ym9 kZZNq/7u#@攑|~_Zk5D>ϻ Ȯ6rnh@JW2@u> 4cV+c4X> mtޝ4&^{kw7݆ɡIVji"TSimv,୳gdB*EA{rB !&$Tz](RSE1 V_<59#O(1R~'4jT k8Gt XᎬXD@vY٤utlp)mfPTv0O!q%N$۷st'%( r|Czb,Gr < fQsR ,ȨQ` q%$JP k<(ݥhЀ>.sIJ XqۧP/7hs*JԏE3n:|Y]B'aXX"w:b9"]D""wLEnEG IiVz_a'K\Uz$TP>8$+IP-aR8w!*P })QdPnt fEprU$E侒p j;5^XрcP ɗ5Ԉ~4p&l2¯2bLj<Bć'[6/ZhK ײSqn9үG]6,I;NeT_o3Oa.GGшGc}2vmAǔ?{iAbхK{MT(cAqQ^z"PAGfD6J=VQ;BDL!t-mcPg1Jˆ5˻cE={$䰨{0"&P==P-(z?O:%PAd"%=G}`3>' /']p*G /G(?Wb_ɲa}G] ߄kũ:G.PN O Oԍ`ú &R4Tn97$2D{LGHKpj%C&/#2f< Iy7w|[ F?`goC ] ,U > TϫD)ՀNTgrR&1Xr-U{:G)7ƈ8ēz`Mkp w@~gJ7@ frp-ngeT=mGY@EFfku+;(Y*9wu!-=1N>Ǥ\W QBr=pY-JKfLU]O@±0ygP?*.* /c08:A1CJ_E{˧07+y#_l h㇘RvڬџJG5&Ny:z?R)Pc1p`pB0e'fIJ c(*/[{a2SЉ ^FFz~ST^yMɤZ6 )aS;q~YRٚ;۳%j7{(;={#5ԃ54X-Kx91.ߐ&9i)3H,gLE>es֏T)o(=jQ5ph"JQa4ZW8k<ŃC3l(aUMn9?P3?7$#+0 f=?@XR]W(_Y]8MNbh[h=+ #lL.ufPL[~Xrlug,'܈߱MJJv?wY%I5 Bm]~"(jQgrK!T~xa؄Qo{Wmz rGMY05 َ~<=UKrYboN<O/3Gyi25d(;m3Rًp!N |"F4ۖ @5"]MCkrIA8y>ؼѢذ>x9x30=OŤmY&qQnU" ȮCf]K](/ |~C;7wCG*NZh,Wxw{ŵV͡a ϲkx!YEОs?dk [@.4Dr)"1N>p0< 1>toÏzLI1$X? lgxO! zrTR?~!-8},,#Mq"@/0 ?Lj_ޒwᓮHP !iZZKʸ?  m5ͬOa۶C6 &k,y¢K04:hsZzT tQ9nW{o>>6`QFf(W<0N"(" {:]'ՕXv+_(DW$?!nF'~*!zʡ\ .~%t>((n<:p rXQF^:`12.S8+. >*0gSgabz6gcʋ"J}'[&JG1xvŇT]<]Rm7M 9z?18pAoL~k\ѫ6(Cю:3YH9׻:TH簘R0ց Sx)q+ǎ*\ck޼uLu 53EKtwRL! 0C)-iLU;`_krQ^Ea&i1 0<?[XrS&K] ]3B|L9T!A\̴0z/mHI7 ܍JX__969YS~;n5Вx8KX_}EHίq:a]ںy/)R3 lڑtAlt˱WmrzP+ a$AwQrPP-BT>]{c&p/./EWx\3Jep,E(8hK[p!x01MKSIRJ%~)]VDL5w%TVoY^L/k㔧2<|Z@xKvO$$ X=.V PuE򂯓cpZ?\1L11VѲahMEWXn9T!4T͆lޅL2PG26J-SqstBݠEA5*k]SVͼ 6 tMwmD'eJSe0)h + Rܝ5|nZT]pſ-ůRnRN E/j 06 h&O]$b e4!E̢9Ģ2w*n} ' f}ih^:CQuO 7Qˁa._|]չG1cʁ4<0jG[2yz(X:S] u)ǂ Eߺ=4e.<l3RU]$$ ,dooQ[![TS?EX^uIW6K GNLAf6 4Bs ˭f__C?,Bp5tV= 2P5l_9dfmud *HkuLx$ĝZI%i5K&HZF&M0hLO7+٩z@_T^.PN7gy.'}) VĆ$v(D |3)-:%c%jy[4gmɻ;ԏIQ:9_-\Zd1pb +F23b"iׂoޡ啪Q 1=|z 2b9Y\?%IFMb/g/AaK7l߼_Lկ/,Zk7ʎhQS@A~v9cim;*W6R+z?T3hJ}%(Զ$XԌKmEO\5Jg *9oCU$&g`TRi٠]=n9$4 B/П_RSŔJQ;kpu@{p_F7* arfa|=4ƭ@st q+_9Tś# ^ 2zbry%hLJ~ bTDq{r&T RLPcՖz6*k/RDىc`xT=#cz])0 huC'N=f&;-2&D؈q8A>J6pSн T4T.To+^}Uu9[padt.Q_Cݳ 2f'O*_Y/ 1>t= vʌ\((n])Bf8"a}ׇP*¶&XJ<>":תR%OB.,#Cq,^FHzp=L_,{L:0@YVaL"7 S7i.by׈Y.Ff`$RΡ7TiUq~Sz*Hy+Bh nC.$ұqWT_xo“;6ayL\CEWk޴ISPzm}o)w8WW0tQ U:uxmfX3cuϫ$ibd pA W#%yAq M7)'R5]/3-럘<sgX܂۪K>W@ϯY_#pfXV{A"և*gho7%/?XxH0n ]Zќ(yIO8Cҵ_-knS\'zZU҆@OzoPoT9~č o wYyCļr99KS_})y &pۈRVPl-bԨxG3XJpBshř<ۊ\!xwsy=(]KsWmifrsvlDBQ% 8TCVCV;7Juq @7>ճu׬O.R,Ž]UWG k Nhe}Au7cvtI)"@/^%7fWEs PKl(@4Mj[`UU}]y tkǺ!؊tbiJ}5`2S݁J(xcr| gcog'rQa׵ҡ > ]ٕLjVA񳁇 {sO61X!]k`Q O֓j Ǧ =ԫ[W .{O\(^ZZ^(uA RBёl9s[~%p,6t=}?pUuA\>|WŭM?d DբA=.k"rSPŐFyut( ֿ 􉁷'>9ٹ3BZi"UKdž[vpatfi&^,53l`8QyZ̀X ó&C{+yJqwg'w>ik7aSwcjSx(f 8==7f˴cG60 狚yT`4Hhdc]dVw$:a|V YG5 / /hoYxInrUm11b4m:fvI4%2a!yDsDzXճP <}2YPz@]*GZk+bY x~}rppX(Y]!M U)ĖhEiv}@k⭈zB8FwnCZI5V]S҄z~P#ӎ^?j /w$gIENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/48x48/display-instrument.png0000644000076500000000000000536212647526525025040 0ustar devwheel00000000000000PNG  IHDR00WtEXtSoftwareAdobe ImageReadyqe< IDATxZoUYZzNۃPZ.:Z&A0YIE<@B&!@hb&k&$)SgB)=e9Ŋ1^{׷aB8_>O j4V ai2d{j?t۸.$}oz3ujRT=^~d6:s0i=,>i 0&6 -|6ʠAƸiL}u;^@O,ߙѶ4' X,xv*dXi$Z= @=rG dK`\pH7:rT3<r_{V\ވ<2Bötg8Ý/m8l[C5` OPe,2j (2˸:y!sS>|<T'+*cנvNFPB+qJ+7oZԃa%d\< )*|VEwS93d!pVo[H7gXMjϤBqy,Ԉ[ux+qR_+CG5_q[$\^?2~x,7D.<Gc"A^aob(֨$`Cp.t3{;RXrfqq#A7[Pnjl&5%軈 7t߁ڋ~a|2kiĖ DVdDW~R0g:"z5yڒ~]aC)rLP^P"̓vX)H,3;ej1Us 4 ' _HDb.dfwJ G0'jIY·E".Òj.93FC%X@R"LǍW9;:IIXRA0&`6e|iV!@, )s h(%'}e!v)J&b~5?m67Uj"J%P,{JؖAO`E["j>| ֭[|N{nCDVJmC?/>|;v`'NUӱ&&&`Ν:e_Eyq^,P+S+6oœTĵѫ ݅P5<<̮^*ZXH݃rRb ͛MCQ?WwT?X!JB\xQ+Ν}pB!{-lҁ9̇?4ہ=q]:nѣGS/SmiǏGQntvv)@IENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/48x48/display-instrument@2x.png0000644000076500000000000001543312647526525025412 0ustar devwheel00000000000000PNG  IHDR``w8tEXtSoftwareAdobe ImageReadyqe<IDATx]i]u^k~q&)A4aHHJ#(H[A$jJՀTjUEB U)u*B`3 w:{ﳇ9{}:{ιgXߚ"7$X`*VX` *W(}O4<ȷo'['E;{̗ժf/DN;U*xgٿ}}Vkǒ'|]ۖ)vڵGs=[o?#=½mjNN@σ044A@矪u. =&X%I?>}azzzi[fP>[ $?M|Rn{ N`{P'=-..BT*$#"}`jQۺn\ߍ {j%SHWf ݬ3`*咾G(B8fnh%1IDh]w\-N| ܁X:]9%>=9ޞ|VUW:&Ï=?F{RNe `bC8]rȀkᬉ\+I?B$RV7˟csmBJt BS>?=@*9m=޹FtN$jDJ9atbO:~]hᇷcr\VҰOs,['v5CehFPdUc %e NjY(ñy ϔFGAOZ)k#N Y.fjD sKXI`TVU%C d/S!񳶍B%c\Bc[6o恟0v;LΆbD1EVKR*,zM]k 43pxޓSvI#aizWl!̪ U`ƪ-$ٿ>xrXJBTOck`gMvK%|G%K΀@1 K$r[˴@P( dsy(LQ1J4cLԯ~ [v>l2~?j/jpu(c;:"YV bP`Hxtޑ`/^r ˾Fm3eLu hڇ_h&R q]UxޅS/>7JUwC<Q&VD0 a0X%`Y.&Ũn?ZI#nb_8!|'T1G {Efz_ON=Pm*(zPn*,#Sa8Qʑ!fy8 PՈ&qXpbG )%.|o<2Ky(éIҿkH8!c~UQ(w{{U%\""#)anVZr˟:GSFG_ 6VitQ`b=k /Z'gitwCOdl,gT7uKeE 3D2<*qX[(U,A#t9=,Rb.MA!8ƙTh‚Aka ZjHnyɢR?ujMzet)ľDGn{ ݀<l 4| "h\>sW$8~\Ҋ+"&<;'ݽ¦/L; }$w!KOo!wnՓMIq%A 1oalqU2v+w LOzsiBth5kk'a%߀mRh 3$ !LeSA{:ȾG݀+Ӗ!A #cʆF;R&fv^^{V/|&ν# iu[r<*^s!֦@ d5QZ'@)/#cN R< X7҅5pE}PU\Q6-ֆݬI45^@!/:up"%Nxb_W#c߲;#2HllB/×{WAA.Ce&䂘8`V-'#IUCԶR4FWu'7=w6ޒ -AWQ h<R" V\\P!ʘET1[v*_l-hҦmAܑӴ))#swxA!a D%o$ vKΙ$,*ayOX (XW&3y,%< A;kSe~9F8 V{.zsq̂AJKFErMUF= /Lb ͣe&UKGSpxOi4rA < K6]LhEd"ݟit5bu1R?(9_GqgS0kl< b&&a!"3Hb9F88'Ag ؇1sm_}A"rEQp0"7KѨJ :ш(hR)rrhWh6cb?3?se ,sֳ!ACvx@W~%${@ncÂxm)T?jr: j74j}`m1p5w^ 0ӐSعv>!`fQ鰝!# K԰}lHDU tf$JT mLc#F͝qa8a T4RѺBfK۲Ǫ-/*~A=Yav2§uOL9H:%MMQ׵=9?sVlX ;y$uVk0>>-֛"ᔁқ#+!"2"bݦ9Nr'N5{ ׳IuO.PYg'/] ;<=JO3KD'OApED"yǪB%}l/>^Eķ5&7^→75=-׏|{j۩SwpIl޼GSSSj57$GhR^ֻ짗_~驭r%߇=. кXmE/}VNT jg%~>rpjEJ;K㴿wx222ZУQZhHΜ8=k>֦7`dvf!ϥjt{I51&]Ayi~ܞc ڵ`͚Kؘ6 @i]^K :nv @}^$`ppjdx6lmޞNx`$x O<kYj5f'͍*E^ O> gΜïZK cl&UPB{m xG'cǎY[o=g:l'?TҠtuו%[]o =͏a,F^ܺu-xHr?)@ f/-4viw:pLN.k ^K/Fh_.(&Dk \r~uAraq!Z.jY˜~_/3$#PkZ pbb ?Jz|oٲe۟]{5 cZɛ4Ur?_%|_~{|=bgE3];+?)~$4joADxd_{ǎq?^uW>2JsǏs1b-|ݏgT]*-Q+\s ٳ>6믿"ʓѣ%Cd Wxrr|$9~S)/b c%@E.*?wn*KT*fF5,!^Y[mpeQA-!'Nμҋ,.[~A.";Џ ە]  N p}' @ɀ0&#<0BePӍHvio<ٖ,CЋ2?<ܹ3)2LlxnbvYeېg4:%fffm:x vkED_ʍ-6;qiAm,ESεqF8ݗ!fd6S- L-|K]-Ky֋@W^ysr-CuR?Еpk?,[t8BEO=AY(vޝ0L_/w)wX*ڥZ84 mۆ*)@x/Dyunܪ{-=P UR C_چW_8o]qQʤUH=55JN5r90^/[IENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/48x48/displaycal-3dlut-maker.png0000644000076500000000000001061712647526525025437 0ustar devwheel00000000000000PNG  IHDR00WtEXtSoftwareAdobe ImageReadyqe<1IDATxڄZk]uy3 6_`&ISYP$^Cʼns~fi~.ˡζJUkPSͰ!$TP]?kLaZh ':>kqMܟF}E6h{8Kxy/Ǥc:EЪ5`B N2 DQ[NXP.x,\@W*.%#h6+^+sд$7…YmbUIVN(PH6}We"Kާf#4MTxADwNR&:TZɜU&xST*ٷZidH<<*}zGfv0ѻx)so:q1/7m=.fayѰub1=1M]]qjO֩f\߷:2fNɫV!JЂwYZ3h6h:64;WXҨէy,wEBV皶`NS"+$&F!;;e1rd )$i5z7z ]7^d>ׂ y3km u@~XuxYy8@:&M#1u+HES7P=?BJUU>?fԮ%#'$]ƒ?+`u㧠j + 5Y>u27B5Ttz BZ5tK J`{+w\|#>c>]0ԙw"g ,z Xzp#H!| SR f:cޫp<RL9xa?6h:r=i-&-w<oAxNW0}Jq]8B?eℼQ<ڲ1=A&N6]E6 M H;^H UڪGQ6n܏ |$ghN.E0r;*ąZǪݻzםJ-W탾O#?%2RB'ڬV+PEHA/!hxbW 㯎t:SS9HaNY #,T*X|?DՋW wun!"1;6E﫪Vti qMM,),AY5U}Noœ>HoJMtNn3:;bf׌ـbHq QQN‡֭[u̅,-ᦤGF% tt afr;7bú 鉟⓱Q;Qwa6mYMg+ajj("ǶoʳXy ^:o+ƙ"m9HiKa^v["5. P X}} ^NUEp[6([ۥ0¡BǒBDȘ:E[֤lbf3Ca{|dj+au'8jB7WqFF.U/4 a(Ss3WVԣVV-v`j3(IYь j-匂U[X/F1닗%tZZIO1M^Sxf^ۍ\Vޱcԇb迆($IVC4$&ʻdW 4J<*Qhmcb̍wS}]Xwo؀Ϝȷ.^cfMܱ/1wik_Ҧf\>>fvZE8phɳKb2OLn\q*%-ONL ]^<|]8&]ܧ Cl$GCl&LS{WΣS,ݠBl޼YO@0FFHU+KXc@ ώ^D$i.te\i ҉8vb=7PJ`apbwaW8@x[c_KPLdI4琫p8Qf`Yy}/lw# DDl:RnU~Aj pDvAn-kaw< 0.PC}:"$:5{'I-ZtG}^O GI,'BiW|SFb߾Ûb!kӬ|5;#7VJg(b@<(2SOI-`mbFQw7)M:ײ #m裲TxEw0}X*η[ZwAV! jSV;H aBh"H!E9|104 o6tv gTα5_ KelHb8i$=D;4ްM$ y)<8I+DO 7;)W1c2m9bݫ㞄ct{  8>a*Ke#Sě9n2ǢaD_lq̦Em:xcdN8U:%<5ۘvUs&DBov!+2#._FVN2o'cv(Aö=: 4חc6X ^pN~jP؞In=s˄#4?#/K7IENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/48x48/displaycal-apply-profiles.png0000644000076500000000000001015712647526525026254 0ustar devwheel00000000000000PNG  IHDR00WtEXtSoftwareAdobe ImageReadyqe<IDATxtZk]Uys3?b;ic) Q(i ~Z " T $B(BBR 4piuy}s[kcf}=g}Z{o}k17x#12V8>q$g{gә q@^@QZ5j"~,_{4գ--(YY?a6UǙn,1~CGpN ïەlO^yA;[Y]&uH;^6-\X7z_q'}V+e׫ov*{Bs~1BJ`yHׯ %;[ߟ{h+isN\YWϙJ;&jf}\0Y_sG[>ϧ_{P>]XlH6#-` _?(\wDcu>hc xP>iv~v-:Ys8apB(E'^qsM.s2`U @dqD#㺇?p p{7X!MRzy!NA(&ɤZP.2L-u @1a2)mLxX?g9 _(p"k`t;+JbP~ʲȔo\Xx߯r&!e/w+`n-Lye"ۘ88AJ9_Ë+7Os4.yE֤Ѕ=bA"2ƺ 7ۀ&*x%I8׿qg п:L"xhxP{\0tca7!fL\0x?^EDvϪzbdG1_\s A+?4GSm '|-ݶ>p-p$r^/˭}nA(X>Q%;x\{XXZ^]ڹ-9թ_n!q 2D=9>{; xE Ԧc44Vc_s:xe=b ξ G"UyL)`i{-NMጏ"/QH+  -;V1*cC4Jj)w ۶{ɒ+'3x悍*F$Nt@' RZ߄#079Gl)Ot#9^7Xz;>O!&9wsg߁*qFIR̾=]w]# ;z,HsL"7 婈_՟7"\,733O-5*xn_k*k٤m؝΀;oپ/烽EYH) 0O? GaN;,00ixN!aT#=B*#cpeܢu~;_[= `u0]Ill=(x à G^t~=2P>Y@Wő#p%<;1pa51ܸxh҆2[|^+`=JYHsX9E:AmWS20$,A>˧akkuVS1$ZHdUKx#YktĈoO"ǣĵ\b\Fd>1x ܵ)T_5Y) x7!?$P&*x N^#/1.V#@KR/^,kjZC҃Ч'M`HL!V8n_:4C{G+{*ϒXB > /R9y*1,u=WcJD2 ;娸t9gj*`vZT]Ϗ5vˌ^W# {h)mj/TGej] dA#I?u8TK& Ut@)Sw ;Lxn<"NV2q.!סnR ج2iM4Z5dJZxdt:^jr,Eh4v" .$b4fҭ0PU JHm-PZb 2.U? %ftQ\ԙmvCBo'-,)EB\C:uio5bb5tHC~ }6W+P9yu[_*ŏv2Wm H5aUlm[ALITyF"4Ur5|7@9'!JF}gOkco#tO :{F}-tH=׫7xO<_j˴.W =hF7|hTH{ElM;v[<»0{IW|2uB͸]?|O#z[& .Wnswp!m5D4gJŅQbBLyGnȪ$8˳nX0SDV7C`Df dUy=X= HX24PbT(tUYLO} B̵#["W:tsX4-nv3M+їkvHwuH q! ǃk3f` ,,tG<݇zEշb?X)ˍ:âM[JT4z…&\&V|3ףŢ ?;`Gxya0mOX;qnp_] # (cBEz}D>7OދKO[ ^)aV\-j|܎C !25{2sQoB2Jk?f1) S>(pOǔ Ȁ>~$ocrg3ouGfw~ލwD% H%cW/Z$!8x oPf>d+Be,QjV$wW܂]PNOsĀ&Kbc%J"bVsf>{Ͷ|7vlEAD(ɾOc8Urz>w! sɸC̏~KFpA!Ɣ!A@1|.sIC8];|rx8HqrF[]vZk'0~ןVHD5 r[ mqITŠjy=]#QuM$7n_ۢD9>ĥ=J^|FFݚv6:gp/} 8^7Ϳ XZ皊+Ӥ`rXOAPIЍ"yfn}_Cxf݁@6K\ݿ`Zіn|J1cxq^\XGBIv&HG^> ]x%MIENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/48x48/displaycal-curve-viewer.png0000644000076500000000000000776412647526525025743 0ustar devwheel00000000000000PNG  IHDR00WtEXtSoftwareAdobe ImageReadyqe<IDATx|Z{E~=wm)ڂebx!iDƠ&H1 $A!1 FS  >~  Җ>~;po;3{9;gZnRl~3[>@O/0Ev?(BD2gc=ij^h4r3_Bc8Ǯߝ>A:<~c_Gd_cNb{0q22Trssu}ų͚/?-ϹMw7Eb_͎y+ed;"93O;<٢L8( b g~(n13]Ө>绷&qj _lDȾTx5gy)A1/D@kWv5XZc%+0=aР)vhZD872ҵVr6u@صIVDA0Zk(ޖQRsZwUD+SAW7)AMԾm>-oc M"0.¨`wtڪVƚQ3!C$|& VG Џ!rZymf"BQ \L1hr_<͘,Dھ<,PZDhB̤;k  [J"ѓK2wVEn=˝ QDvLeę* uB_jJ2@㍣&%ЁS{9qQw!Ծ0PhxȂ\#l,aV8YeDBt,(2.Qx;JB̛QnBEQں ZΎp*Y7{wy#+!? Yz3X)BN,\rB[ ZȅOrޗ Xܵ,x'q(n|BZpDŽ.P4y_ZiZ׎ewz?]7tl0[&|Ue<ޜ㽲ړ{5"A:8&.%uǺVRk2t{]ĶTb Mv9D7`SPcv|r8C=:y:m)qBs*tFm1{Vb>QFَa;'] "lmI:C CAFDSZs"w_R0D55)4Dv[s<}O1`uŌʡϮG / UV T]"qP9dpcuz=_asnK=4SĶ|G;e| q(k}:z&tۏv P^ mpǟbe FEvNl nTdj>v9~6c*7\A?sqOfG6v/'"CSE<#[lDxmh&ڔ'r8)i& # ?6Ks\B̄&e޾A.:5iUU(sJʢ/0`DXɮF Of9jt nfzx1i2CfLɳ=Ȁu EM- M!(CtϲJIFGVSGgB",&[Jt<dqo&mTa*@|A0YL| 6f_Z9Ix||v4/x{kc2$%!R"-~[F(<;QYp78-!?gjQh4PK/0VPK{&4W*/v6$ !g+lfwy0t0Tg Ԯ2p+;4D)%JZl;0x '˟aBb2GX_/*ᗛ} 2:|-)a]ASئ8P̄sGI?o0mA 息;ڒB'}D[KE]P eK Ԍ|1] ߤ5#K,>2N;nU H V2$œ̪HLr'긪] R䫃QLd-, 1 ^OdgeI$}&ݴ[S=#f3o|6/Zc70 \9cEU܇ϬK"T*uq} k.4Ghϳ&2*.($H<Ր *EAi;96!ŧf"Y%wF֌c[cɻ4%firRMkB% `Tע4H g46$:M0ˑYB3K3BxhWj{^p oK8FIR#$#ut|,UG ɰLUTEr$~&d#nVi##( ܠ-{쪼B"Kd`MEE)wnd%cժl5;=us2uNSl7ظbbj̈Z~DMo6 ׳ЉOKh+)Oسz_  ,01+)=$(Tii 惴 ݋us8ir8x>*d#ƖE S13 Wvb~[fE.ę$h쐵8.kfr%h>9'MS+טrU0fE{ mڭ ,D\B{syj!d:EQZ6MnәNסx_ M+ќwMJc!agso\gq.J縿 L^2BgD@UU+qbe 197S6QEDא~q=& R do\D.vXRxH()=hY&*݄ mĮBuwp:5E}E~)DcsNbNy|CX1@8<_~YBF}!CSP?|;3$< tI rwނl94ݦ=ⷃE n<=- &8V dD&7 0?m?v!%HDSgL 4tVt p>L`cN'@ڊfl{6ddOɹo 8Z)0j6Ff]=54 2 Y>ng*77ׁ#1Xb>fB&SGqEGE"O@x.a60HY!< g8]E' A hH+Ͻ`V{YUb1ʾ؄V+Xs4 m00aEA8K=Ij2l: ­A}򰸷 +@}<\8hZ4BR{lc~E$o1PVe2°W%ɯAoB f"Ax:;[e* &%zIVX@k,ǹR{Lo42e, ґY i<=Ƙ7w 3h{`d JS&i* l aA\5D YiČmB}N4L^cBY%S&fŨU9^gZ4ƳeA2`.a. ^<`B#Ɨ! ҁ54Ƕ+:QX`ջgDegUؔjzQg`r&56a ekY4u۱ PdL+L FBcfr$/06r+ɹn08|ZuL *Ƕ)3B=K` LvLBcD3Z'NVIպWD6LbnZ }5nۣ }vV1 [Ga^󇘠 :aDŽf[LRZ*Wu)*v/ /Vr tosD\9ޏ&eLrc`K*-8eW)D" BGy8/PM/M!a4Xꆺv,{LXv?;:]m;c3ofFnB(LU,|2 H?psmM5"BUӕ%}|=[('.$0os)#ǂYI]s"*.U!Q"|`ἃxmP3<;$/d Wf'%ļ ~sl 'CCZr\Xȇf~|@ZX ~ Y=BPZ(Damj|EkNDɷ96e)u6 ŪD c~#h0XVik$B_ԯbUc0wN5 V[%>71^=JjthE*Ήt}#yozpڗyYV/l涪5gN~WGWŻ_um#%OGY:гV)0u,FfIp.)wݪ ;}o8|hOro}/`>XoU<oߍh;hwN*+moLCZleO|p sC>)u> ?jyogfOϰygn NeL-sx;'?*/ggeoQsϿ\HN+ǝ&V5aAXg+/§#oVM 7FB'>*^s:My bt*\Ğjt Vω*SUi+2! ./ZW̘8wv$.-+ T^W?.TI3JB%(Nt8HTt`$P.Ot84l&VƒhJ 5m _/!-QW}1Kfe 1#gtջyPF6CVhyUd%P00@fhcXə)k uPx}r`5s2dJ jPA)n ]Q#ǑBJh.<;3 7ºu8`l^o^E# NNr<DK)p>X9rN86o9!OĿJ:&' b%xElR̘$Zmɜ2Č^l ٠?HhH֫PFiH,*pD7BQ@,ş(c[VH@A[W!Dm.^අF v[ JANE!nw2@4(3)[ Ju6mt~2Y1u3ߟg/ڢDZ!T!wtЦ Γ@G?z􈯻vb%l±p`qq`<`I\Ʀ9Vt]&E=yo-s 96 s6@UcRÇlΤ֭[azzX#!:MZL$#+UlPJTuOOHLnvv%}"5%VI ZJiX~UVw0nO`--|ffdYt6-_i| JpL%5H%eveTd$J걱Q@Ɖnw{{ E_Dd5N(EUcd,%I;2Jc0.Y"JL<}nܟL}xUe FL<8PtsJC kX<&^"o߆ݻw'_<},mN)( RFvdyڹuE&&yBԑ1% B5kYxZ/#ܽ{7Ck< 1[ꏧgR~rKd6 v W\#f벯o۶ >̫^t nܸ o޼8fS)z`٦)ަ k1&N-=$l{+G፸M.פ &*\U8m8 bZ`g7KA^;Yog:s71kZ}sp)_K#Zr>oHk'JkUDX޽ٳg9=W(lEVe뿮V.& 5J5T촠b5J%,OU:uiSfaQm19* 'R@ڢV= Su5+(P:2O?OE#fJUgK҇3(!s/В-$S=5a 24.<IILK<^_VabW$ʵk07eUjvꛮ0$ t;!#Sqd`"L|gJ!"tV7كYB^jU^jO-`XFK}3X*LtRu쉙Naep *nPXz5ϑ;(A+31D>}9*Vk F QӚWpǥ  q4Bg'S_Sb%( ofȂ+w8(NhV5U$6E-fN|>}'hޠ3߽O˗pŀbUhVSo ޹s7W:hh&BQh*zfBK-_i1(moݺŅa"g m:[VNLѕN_vwLq*e?EvV|.)@.D۷oT@(0'v݋Mh{ V5*W*]z%W 3twy:k 'tw4>)7I %n.;3!!}k S}CDJT:p&"F3 GGw0JL  d&CE*)&'D,Qfdd^tԅHP)C:6v*ugӺnI@|KO֕j4:xsm/D`RHkaiuݸq8Z>_zxa,׊0Uہ>2:r[UaҙFmm`Q~0@u8>sP1YlgӉl [[IMcz +7Q衹k3y*-rh]N` ">Ytr&AڷzBϜ~ѵ.. #HFsfaؾ*dl{W{$A&kP[ÙaҺX O??/ҒO>׏9}pv{9=76n9q]TZ+2[rACӵ;M5cǎSa V9Ko8pl\yH_1Wj+J"Kvכٓa*x F˸tgӍLBEjSF@ƻ]vzp^~ghZ݄n'_"-O[F@ƫ5d ֞|HI_Q5 2"\.dmK PD;w.N Z#ڸ]݋>(gPք+X(k~;[BL/].JaRB fب^?ZE̔>聇)cgcq3`Wq`S3Z6؆2&Θ0q̙ԝ&cw>ۍfg#=މuf9kF˺?}qۆul$U&0 g;7-el+?(x~ Vv§p1^^OtQ1! L;_spX_Kn݆;fla-jr/`PF';Fhg`$I!z>5|f 2 :)4m.dwѺi$䧉rcV\(*@Kgn_pRZNRG?'s$RrlHA({V$yI2>,d ^ Z('1؄AILfTf'K&BӊfJĽIr,}ZsUJ- d O (l._\J:ܽFmN 0ޚ>g{"(+]ބ0 7¾|=hz(@PD>..`ⲣ2TIx^8):kuT06[FP;۪q(qi}vb_E1wȻŐҷ?%}%-h}}=ۅ[ i+f D"pYmdgpz54lB‹:iͫ!H-4q7&c~=WLz{XIFCW<( ļbڃw0IE UNNI0P ioH|&fQ]aրșAFŅ_b?DGCЅK{jA8" _C -J|:2@)]Mjѷ ۲H*g Q2w"(l'1@/'Jw2ߩ@hJjd1 ů_}T1 KC?oKؚ4T0(jV0.B-UYԍOQ^Gp㰽s09Umٰy}:K%paO?Bիo|kM| ̶J#1Bo\<="^7)nsI~`Oi. d줢jۜ6V{ +K "&MHʋ(K 2a %һP ̅ i :pM Z' 9ogde gQp'}F hAPWJI+XyϠiQ"4RNDh0>pyz4<6 SyO%vy`7}nrChUY%UM+K3X.D^b*^8%pNAYX+8WJ \d6j( dgp~ ÒUʭ+JOզI"is+N.UVAy:!R}+EIENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/48x48/displaycal-testchart-editor.png0000644000076500000000000000655012647526525026575 0ustar devwheel00000000000000PNG  IHDR00WtEXtSoftwareAdobe ImageReadyqe< IDATxtZeU_{}ιwlF4Ǡc NDBh[DD_C UCP/րhd=T/d4ws^}Ͻsg{kYk_uRJ)\?bc*xO*|wqьZ~x^}۹6Rضi&WqOunagXh} C~f3 =|9 U?kYN\rϔnb~y |w'4NTy̸%:D[/8+5!Ws %9Юf91ޜZ'IDኚeG-ג%[)IzέXXff&}qWIݝgACZ 2x~d_#)A0M^"#( ECØ 5c}3a>"0hG0p hTbJ?hqNm1|mVP'܆9@[-fA^;N} =tucTݘƕyvzL_9#JtӒ8R:W,$3&ٚ\+}+@L Zӥ-ݵF_",c0 XZNKq:u+_BZ:5U]|169ˈaRae Q%LeͪP7hs2dNMmCqo)V,8Θ>Σg6x1_܁3WyP= t]LK.<ԒXf i6%>sU-ݙVm'UE$c ΥXY"SZWZ#xxɆUrX'aR{L*ewF2褥D Iui{Z剝0aZmmuҧi=׶-\#A7)EѺ߇^)h/e|t\=7:;#E82*ؼuKȘ6NBAk8ڗla7nr_phe0 Ð4 t@f"8B3f;y2S0^ETIe1f7B=ăDs숨=BM^N"5{8[|ot n}etxCZS 4.:홗HNaBɔTZv6C\B!O_]ta"1m׻Ĵz,򗍡%zbOϜ?!N#:JQHl_ -ӿ.+ư,#:G #:u}qL %]9M*{v`fxw E4bA$8a0fi|ҞS1)ű,ݺ:G4}bEj p`ǹAh@~yR~#OC x*A+2>@L*@ļOg/ܴI=`rWH^Ra"7Y:ߴ~6P)c8!p]C7{nywC‚˸E[ W!Q vo>ЛŽAD َeOV7+$;1`/uq]uosH1ݭ;iӬ qv.nǦaew4HZ]$?B3Z]2Fi|+I@ [sGp`7bko2Иew2$y24 W^:L?Mr|7I}4y^V L>L%eB#+\<xӄ2g|.CI&p,A6@4kBUx$zNWWfp#YF+p\gT\fy .X?:-4VUB CNp8@n\ɮ` FfR7 6 ஌ݕ9Dg/;o6ѕ+zcyψAܨObQe" @&a?%$b|3i|@YW*k`&Pp,A1\25 \E1;|UjL]¡*jɌާ`t 6o\R7)# $x_ˍQz7 ܾI~!{  Dw~6~u]8#};M< HBh2 5}*Ps%'ItTQnAY؉;Y됛KsotY\?=yIiA0Q8W&x[E6R1!\j,*r% Yl\uNFm` hArrvG;ڮ:_ЄZWaJsٞiya@WS'UofV ',$YPw$KyҺ8!Okac|1WXkħÕv}⇸e1SQZ?VpBLl7fL@`v^ڣbDvכ8PySn}a@ Um% xHp1YIMZhڸtSQ}9:pg mÇf*jZ3*(JE)3&8T-ׄAl|~emy1IX={i9CkE5f˼g5.N(ϓc9%kh5= <+Sfܕ?qw`L;41#¸xhRu3^)R0ҨڦUpц*r>x'0.̸;3Rp4=+OtVoM>o²aN\#-8vtݒV͊ 2L.BRU)i 3ӧO_XJ]6sE2grw*_օ r?5(e({R+ߧ8cirvËxzR2IIXA<=D54.,qX@](uCU]0䠳cF]UGQ?`# b$Jz@ &2U\?Toxc~WQy89/# n_`!D{ !Wgj{7Փ QOOݯ^]'#_CJIENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/48x48/displaycal-vrml-to-x3d-converter.png0000644000076500000000000000750512647526525027412 0ustar devwheel00000000000000PNG  IHDR00WtEXtSoftwareAdobe ImageReadyqe<IDATxڬZYu6+CP)SIF@,ˎ,ǫ$6dقa /@ 1y8ˋ/2 A% XM\fߥvw嫭;rfoUg?9E񡧟 /y/*/_DZ?Wyj&Nei.<ҏm~NX@94433R7k ᥨICV†p+9G[P5 @Ms$R3|G<\,p?mMu '%eYK$CRZHW1P{9t;Mu Z4c`Z]W泟C=V_umTIjs̥93Dbiuj8I 28 ٌF5*NbHIxEuJE'wr} \=\PvU(;9}N&-"$`H9> ŎM淍`ZL`Q>9&Ԭ*EeT}mߥwe{"u 9^\߫߇5cʚJ{UaY:/75E͸Zu ġ!TmD ]''jIycZJ³a֨ך`GER!> &\!2 !/|j3vzC}g}Fh&Ü$DdY/wua#|AvbD%~G+)7WWvQRAGׄN飀BZ̜WH."yn?1C׷BF {`X֮.Ym#^:>K}f%<&Vm))V*& PyDW6V%,1# dr/`vI8<@MDοB{pҕsVmmG<brKҋք҇QsV;g{PT/F<7aa0I$+9A>ăQWr4äw'7 |vfVFefUJ.wHٴvfrZbpoAR:21ι]:l7Aba '(d-1廸8O}IL:8v{ViG!TQ_5%@& 1=deD2GES34h J Y3MTр8GLelMy0!'8x;L&FЌ RퟅzԔL`W;xלי\2q2\ȚuǔW4ɋ%jcJ5R4%iEɂ*4<)#_9Dh*17":7VheZ8g?( ^hC UN)?h3=7V \㈍2dDwhV@*!cLRt-O*Goi' il'hy]v8`@%'Ꮜ5%ɏ= Im~H7.v)V(&s1B1'It.Axa =zq`õO#-0a9/eقj<{6.3""9c* $PLHӚɟ0=N3_ք9c/(W>a(3ͨq=&IX鈞~H`Sˀ V8)}6tK44ᗋ1|ԫjӑr1?HDbX3,G miAj16ݮ1Zb8G91ߌB׆ ViJX,9GR]bP$\(qttP";߭( f3,HdlH\j[wd։M`UG;CRNb _ѳUX;BLh`֫{^n|_,8&K]b[P ]⢸CI@yxC3u\׍7~H*!&(ygxm?> ܙQ]$%%g{cH)듈v4s"И2 t;ױ}LdA}Kwݝ%`/ U}d0s5x {}?I@:%a7P}f2y3o#!Yznbo.w@{efz/˨v:s&4LZJ/ybyse^Ƹ6<@JgR ꙹfdW#"7Pz6ڜk st=~QRzg%滎w_FIm$M 􄬻~QEUwht 꾕mUerZ[m?ݶr+n)=2#{giUw}Jۮ{3%f3gǸBب^Vl!:*-)71QѮ4q\W 9f4p\*!$ıD7^ jm"WZp{?_V7VucY6u{04g8+>-woK83+3Yfra)a ' 3@xLvoaiL.VG\,W `-H=MZk8r> z."= <5krf[-*~BxG 5֫x}˵˱?+!Z p{Ԇ?.;wQ rHsVC2ig\ìSFhqAӗrq^͹Rbi Toѹ-\ msl|ZTnbq"tZ R{#+FRvlo##w,YLZ͈?HN:#X+ X-0gMW8/|P^e 8h@by^MIxsa^MSpza|?pqo(C,~sd;Q+ \:R S 2jC9 Z^"Tg7&)':%P)ed/h)0 [7Ej UgB 泒y.+S,4V8HBuk ^_)#+L1}UO8L!d*1y Ppb[ SR3E!zc;q\8 Z~GLC->2W'zѫ@8^h|9E 9TpT3a ?#Zk1$uWdBfD`p=9۔nC'!:\#~I,d#鏯'`Wcl0<"%8qBhu)x %I\9*INըb .jY̔+/“׬Gf Y5Hwpezh)ґœ8K!- XZۦbB'*(/z(Cw{J;TTAIQNJYn$Yw`2>=ǰ;B- GXm:v7]Ȅ>J(6[C(C(qqF} 2^A{M[ظ dB{)>zz8c4RTc)fL"DڡS:a|ɽ"xBL9/:^i^'u[ o_`@#}KA>>ࣩRu3b/Pgl[@(m\ \,`# dúԜWwk/a50\58Z--hn4ɩlȲk(>@Dh(dcxvIge4C ,$=utQaOsMZh=j^˨xl>–ATVܘWks3RC3j6R=i}ƘBXHX2Ղf55\16!nfꅗ!{n5%)P}%7.xYJ]UJ/"{VZ/dNSI)B»WJ*s45z PTIQ]ܟ啬L2:d*en'ʄ@T"FȴZun 6ZP$R 3;?r&pXHI*=0B"X] P[DJ/D;Lxx`}/r~ %0*11޻77UJxe xy4I"],L5w GNǘ0%cʦ ^ /f F%Qĩ:QRDoV\,񼮂y =g ueOJT 6K?R҄y mK1 |=W!YƥS}$8yH6}S7 /4Lo艄'ſP \-7l4*Ә4>XB4CeʙBN%6 ˁcUkI`.uy>7tΊ;W.~_ |5ν sQjJԢ:nNf<9d"'{Rnd+yn'||Jhq[N2 ^<ȺWxV }wOg\= YY\Mz^@yɑcUߘ{y3&'hH o{yHnO寅!uIENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/48x48/profiling.png0000644000076500000000000000314212647526525023150 0ustar devwheel00000000000000PNG  IHDR00WtEXtSoftwareAdobe ImageReadyqe<IDATxZ]lU>]j5UX%R[h AG}2“*G 6@PjJmBVnvf,@и79ݻ;ݹߜszf\n4>ea0 㥜,EQ)i>J'D21ͬOyb83KKKJi"1Khoo͟ ]؟hmO<@ח*,,,OHX Do7 j0NrmvtaUvV/ܪ5g1h|_^ϿXTFq4 FÍƿ#p5`/&~ W:mx5yHiW}(>Zjޞj5Gt>8AR9BZ34t$.Ue1I+bVt JX!ȞF$92ۣ(rsrP(vbtTI8yC̔t kb.I̽n%sfAy+qUUe+W4f]hm)+.[[vf]5ai3F{GBcg+n4N艉cWNG%~ͯ\ [qqßYu6?8E`T(Tr JRI4gt|KE3#?뇤Bkފ_9BX=/zx~^b|A|&9g#4vh d\0 1>ktfiHym ڽr9%uw( b^d-Țݻ$Y È O]]1Q@ fd^'Gt]&&/!!NbNV>w-T"r `]h۶mZɪ|`,,[ x. 1.[VS&#ۆ!&hmB444pgȨ<TU}@aa!ףG(] `w<IENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/48x48/profiling@2x.png0000644000076500000000000000575112647526525023532 0ustar devwheel00000000000000PNG  IHDR``w8tEXtSoftwareAdobe ImageReadyqe< IDATx]]l\G>3uM$&V$"A5H#UP$D @"Q@B@Uh$$Ъ(Iui+8Yg;㽶6w6Uirw9393{Ϸ璑 .hho\a4jiO0 6, 2BXmS  #@c;{,zND"+,qeR/I(ّa*bpz%MNLLhYJWt|E DcBh*찄 ,#1i溮'q8448I3kϛ# 0pRq ;cv}nb,1>Gs<|2I=;10t@*s&,{Lͤ{= ʲE (ŷ=UG}oC,L)̥tjj*Veaȼ.>/Fȑj/y ;Z>pDx)9lB|OWcœ|wxwi:CzwǾ p?ꧠ wkPQRb׹CXnĘA_y ?[2%jdW1wy~9n1rtAEjŸm}!(dJpӋ^+:W"qC֋Ye@KD0u0[s[IS† ھA!Iv}8՞oih4Z4-  @@E}%f X )IԤ`,QED_- ԈPLvd.X#X'`V/{,p*Je`nwu). ={_Tɡ9Nf S6+f g { O p<9\AEݛ9?1G;_ib͸1+_}:h'ڎ'\Cma1 IL7&HY!Nc1|\SU13=/98y  g~E\9#lꉱ,k]-X "-X Sj&#sJAsC y2i*x&[ |6m*lBKsz:+,bǩa֖[!|@|ly~6ԪtSڲXRӊKvݴo/Va>" Jap5J~u?o͆;PNVȩמCPb|vvQs@%!>rV1kXȟɜJ[uKaW225 s!xc:a5.rLRJPALV-UhpބIbd#4jv-EHɌØc| Uv=E00yq*+D#طCfly t#KĮ 0xRG-1hݺb;=fТhhh4Z4-  @}VYQފ ITdD]bJm@ e@ʦ5IP"$>iY92|RF4 c)dRJ LX*9bf]*V @G`y%EHJp΀ yQuӌRL"\ L;囵?{n"hG-2l8?D,8|)WN EYxG>^u ׺$)+.z[ f: Uǃ8q>jqeh_:grXcK=@@XFNpί[]20lᔊx-nU rHDe) x}D%!$v @gS`vVo+ byd?m0*p SE_WqYпc//fL sągKo\9ubʈ췟=s! EGrfV^t?F5 i*+ O\ Q)(=ľ4#Cs[kޭ5 r≯jƅa y PZ3. hF2c1TV ۳j_ha^' ݶ$3.FT/kr=;i13cedɯ9h l+HY7˧+ZkTqe;dE!^Poih4Z4-  @@ErUf\&ݻ&[U61r<1"/$fd~L%3.gH5,11M)V4NIRU"Sr!GsiJR֚qfws ǹZ &E5"bVV//a3q|E8y#_x =KbX$(}?׌ fvkI”[oN]|$Iz0NŁK:<9q)hԌˀb'kEPC'EN24)WWƜpVne;YBJv,/CvXŚ=l6Mӄ;viШr(3cf=q ay}"!J]h0i†6`۷og|l^}㷷m&ʧJc謪NQJƇ KLJDʡ!hÇall,X\\ ߒ_VykQ5;䢔^k.{np]M'|!~coMmJ__ @:&u+@s86o ڣW>}o:["@lZ ? yYsIENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/48x48/stopwatch.png0000644000076500000000000001075112647526525023177 0ustar devwheel00000000000000PNG  IHDR00WtEXtSoftwareAdobe ImageReadyqe<IDATxڬZklT~ϙw3ml r !Mvdw?ҪRjTZEFZii)IDڕnU6m `lS;_ˌ=g񌱓V |g7}iUiiixWKKKezzZW^9qر_|sWG駝f qㆸ\yZd``@wiii+o9sFt]_v3|oeffnX~\8UV߬iڲ{D"w}W344$z~%+VHsdttT._,}x<%]{'}}}rEIOO@P(đ Aܗ*x0̰aq\>ә` :;;۷oˉ'v֭[ɓj;} :uJ. j^ PsnW>Php!bڲeˁ VVr/*G*J$!4#=U==^~O>իoMMMm߾{i׀0R-gԾ_T\|~饗Vvڵ_{!I/# `"穊 SRzwe=.^ke~z7_>E1Gk 蘼 }!XC{ze7ՀZxݒu߈2zoXŸ ȪU+' #N effFdz# v74'--y"!n|rd~~^\Ib¶F((s}~m)EE}S#o*Y JDF$#>*tX)3g)ds-]UG77V.GPLV}{;ww`J2`wW7<jHlNԽR.:@G,-|70A#WeİBfɽ1[T<=UVCxr* I1QbHvqʶ #5``؜uHAt JƳKev. st}חU.YxbbRɫKW΢ u%b=IHPt |`JHC),~N%`$nDJUR l!+UP\\RFaLOKܜ7\rڜ[)a"oh*IȐ<0'NӹkIa` JgfT՘I5ʢF}.KaXp2bްP:P2$i0d@![s3^zF^HKcTQy ANlσw63:4ߑ[nFu]6:"w/FU*R#[ mȘsꔂpar(0\4ϘH)'PLr$ CؽX3><4dgl0yE_P܎ [`^(at@g-ø:1'B6XJkE:4ty!ؘ #_]k|~ҁrڶ ]'Kŀ%!6|M=lQ'FTjuxxKUA ޞ^]q iǂ'$h IZpug)0tq0_ZrX v 蜒eH~_T1H655v' LLhН^{YVFtN,oCK\ fb4kO M箮NTrouwwZeu¸Wv1(e2uym7X/<>rX1 eE Fx#k>1EtSS ltS({sxxTg]mۤ e@6xx2݁U M0جX(x>M췆46Jݶ1a  ЉTgP D0/]DKE+ബR/D@p_=u%%eee+%#+K$1Ա#i ,6|߅e|ɖaYG)ޱcx[ڮ Yp3sl;MM(=r322Ӂ+)ɡ2{0CgA~w 94bYkY[A'jF>%oڴɄ@&Hp]ȍ|,OdЂ31RSqX [Z-' K999f~~-f–{FKKKMPVA{(mE`g+;p1i cX##\ l,kٯ})+z,lh+yfSLI |ܜTTT}?LJYYtQ xfvV HR|^өG׿uL&#ccc233F8uwwKIIIF_b8m,Exw)>sΞ=+#$jC=$K[n 8@w}r]w4`ttTg"ԈzРB˗]vK.D֭[_l q%] A`J؆`uttHKK Y|?48@|zke\yov= fuuhpm{EAϮY斝;w6\~劙$:ISGےo4p2Ňϴ~)?"@j0X4{ @m4;K~W6m$7U"cc‡<fK*=%,Jt׃g&`qñ8O{U"&&+!˗/*Ԓ^& ߐzJ#-[(S)$ШA޳J?#ȣ>JROӍ ˆ iT(M%R%YN'ٙY%͊&IղVS4nhq} F*{!@!W^yE!= d ok_~e9s|+_۷rT c |;ѓJtD2+0 `w xﺞ{KriM3cJg]!@ke 2!ZLaD?Eʠ`Y~_|ߐ&5^$$ <>3 iORZR,5J%|I'[Iʒd! b5dN2i hqp4f8 -3bppڰQO7Us`JG|!pSF0sߝp~ӟj0E 7NN9q,XC0ǒ؄THNO&nkA\TU 0įgm}nшuy_`ΞG?ՈoCطSW_a]ꪫZϙwjD?g4)Gk?Oi@EtephPS zRN@4@+yNQ8 lW#֮]I$a])q'@TKNIZ<WTZN?ghvvFf jZhB `q -:zmY隣qBz~ u7~{7>u]w[}h.dGg9vL c)IRqeejH T{~{^$KS QxR 3 hkJl׃S` ]H{&%RgL)T +ɘ'3i 5Mz?ڰtSd~n' bv`}#V)V'tUҀ($b$4H͊pBǺ.NhtZ ";^p,9$,\1 28Ki?Y===2f$aA/ZakV!:.Q *  &@>Z5)N?|m\q 4٥OhX@jYnBzHГu}Q’y~!O>Rq<ZZ~a+d6^" & ^BFNG4& ʨ a ?0g=w%<~p:6N.IJDv,"3q^}FC`&nVfBbTo C_'ù2_pཨIiWon^!x JgϞ Ͽ0 >زw =}W?p(0$|fe$.0X;5R^yy02U% 1m<Hl_$ y$Xqycht a-g9k8E p7l?|`k ˙NC7ܘ"+^--g4Sir5fTӠjpsKKkQ-^qceoO+Fļw۶mWm߱]JZP44)SbB#\?j j%3fgwñqlp7𺙬^[e9w>d{$:>"'vVM oLa1ŠrKa6s]ʾzUWk^̌!>&##ecbԚ5z m`.@ټyp'+z~Nf_W_ZS $d 7R |Hu۞JkN0׶ #5 t5ctK+ l .q$pwą-M$ёj٭QF2_ y/aJ#`^RR Y.˖7q48KO^(w]_p7v[A, |d 4k'$s<<%?,ѡ˺*@ׁ2-' px@em<'Qޘ~qR\V L+:}EԀv"ڊm;^Ǐ {?u[F;N&Щ'7wh! ԗMd: ˴t X3c{dY`;:C LatA֔KCtRɌ4_T.N‹NGCܗ6)a3Zy.R@6"Wɮ޳؋ibCb9po]WU:.i*/|otK B4I (n72 /O?ٽG{Y%/$S>iӈA^"+v7$ߌIsup m7XE~!<"Tg>pffJU0e*k& uF`~eC:ol3-:Tg04qX*e] ҷfu4/FTxX  jJ.`Roo~#rCY  5M:0S}! pBcjFdF”6\~=L''JP܎F!mM-?k8Y{ l5,*yn{&~|N2˶-dނ'bp&h@0) mʐtcܜm`o缥85:KEJ\LK$Bb沪9,,w0YUxֳQ>tC8r-SۼyKw,l#ۅs$X6H[k0)}Z14"Xt[BmT(#>ʐN>5)2Чe(|!Tf 3Gr|FDyiEtj Ui)c`Iy}pd 09Ds:. ^H+cf(;Yxx2p!I vu܎X=䍄Ygxv4'6ˠ-߾oKHSb2&CpWKr B\$IESccǜ\3WZXVzr"D鎂ȾHڿf Ӕgs&a0+kI/^ЈX6962:&COa U1w_Bn'/,ƃ HB%5Bb OY^BgVx)~H%nrJ,@?sa)`" p$e m Ŷϑ~ CF90~>H;#w ^ $S`aA8vf|t"_Z9s>,KQkbc.1te_INJ mg= Lzqv[CC~n4=͈ ,ftbN|{Xrs s B3Ԍ+^ټ-3ArSOB;2XOkOf QŒYBcnk^r$$6]Ï]]4: p0 wT<37 cySlC  %5@By -JdIa$,J؞ׂdwƳfv]q"蔉Ik2:GQ8g1 8ސ2q->3-SX{q5^XtlXǤ EyZ i 0"!n}1<$'kkQ?sl#hJfhp=s2ɂ?eD2ёcoKjV\j"r4i˹AJѪiG"qC±o1,aF"-Eq4H̙V>yS E‰ދew]]ehʨ,: ]=r,[VuB*S|p] +rN?޶N"_mMǚ^%]YeN8A?r| ~zDŽh!~=׺rd@`--yz#K_Z7p$^pn'1IQ;fq?ɷvDޝ$yR焿رc-ee U#}2 CG[[k$ JRIeA&+o>u v1Wt{`pSnpf<sd6ڊgU37oM9bFoLPd"_"o9}zoee;ww@՜s>Na鼲k&,-uY`F$Yn ,[AArz=:˝%Y$~uy+=v1hws؆E$֡COjlݮSI`y/8XToԥ]4o.>r.[.c1uHVk;뇮jٲYP-o獦n\p.!?= 5\QvLzҥ0;O?:.߀{Y2eF|Br5߯fI$l/?NOM6c\oÐ> .5)XB .],M<.Yin?|[ @/ x~Cփ9hG]a!{ngx{{C *g8:v/8窹im]2i$VqJ鹺UW۷IòMgu!duI 3MA1}ҫzMNjQon^)wSOi0 z;z I?W 3hK<\;T3/Mʼnp[dc3h`“p2ay 3';eB4O?7d7m0 +tThQԃtI̊HGyj4 #t9ڦ׭S>|0N1Vw!k\?I%JX̧OZ^z)z(`nr+U=.I뻽 )8>6m۷*_0== W;CGFߗ^Vil±[6ouJUejK]BB2;ףKj8yuLӼYܓS`4z]1)h)0 ") s̳f 17 <(7zy $ZHYVgҌ>K)(%'fvuu,?CT)c>mf4s-|˔Wj<bO,BF$F )1Ws饗IyWXQQ&X R#n\S_qIگ .PfVm!LRpOНWb!zWz&ka/0 lC{[+#cp*ʩi/ x0ET60 YlŦq8Y y/4ڰaeKu H"ʘ"\ğWwj2v',2R5jd~ItuvEX[H ğ5g}@3ylf`+eb[$!JL#@33N VGGZԬZӶ+2 x0)-*1I TTɆ8 T<М JOwtvt05¿ z籦~ڂ\%<Ņ8 c6V\''xvXbfF R@\+pІm=={ mMz\lLse+x}Cnѐ5LŪڜk WB@}3‹e`c('滦?:\,455yӴ1'cL/vcIFaϠǴҰjٲe*a\aBIڱVN4蚵0XuV!nb|Z+&4(vMB:3M>g9( qc۷oRfI ۵kG/. `[%b>-k4":oWjWfIBS| _yp¼OxއYE=Lyh0ycaQg CdR4"ƃf_hDc[]p|`Lr^1*AdW^(NĘ@ԝXsmxT\ ;}t;!'p.ꈘ5[`0ڼ׃'ٿ!3ƌdcJ}vrY 1`semI a;_L1$8@cv ިp CmC )P,Xp wo}>gw8EPL-XɒH@Cj3Gs5H;$^'ayv #5J3oIlLFi=,wg 0[*{gIENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/48x48/stopwatch@4x.png0000644000076500000000000010172012653526636023550 0ustar devwheel00000000000000PNG  IHDRRltEXtSoftwareAdobe ImageReadyqe<rIDATxw$y',NOO0!!=RbN'i+1t+݆?UVXUܐHVE.ͮhH3Ww^j3=$鬬̗}^iߔRӴ577SooosTVee\[:MpP}Νuu4??OOM4_kB?-//n,4vouv|of/X,R__544\,ln $ %z $whT*!?Ԕ SKK5k3%9 o;Ƅ@YLݝW`H`|5kC`׮]B CrYtmހA8MMM!` ۷wvĵl 9BrjJutt5_;`l6MF>ܶmx\6ko;1[oCo;\ҶHjlyLOOhqqQ4#F;CtWN9?"\,7u- R~vvۦ@yh&*xJ-vmk8:orrR$>o) _H;{(8'> szw8/" 5tl ࡡ'oQfФfEsEԧDwI`B"#`ֵ\1mA"n?ֶ Ǜ s akp̄߻o wqͽyb6@bk{;3uǯ=oT*w0QY]?D>{<&uϹ [ؗ/M]my[{x &c"˯8^ A.xu%9'43L3CwY`36MMީŸ=ϟ=˯gx?,?y'=khyof⼕w?{Sc[7ܑ ~h|&pഭ~D Wd]f b|%|-`s_8Gxڣ6 }>?_{0GCx|ǎaǿ.p{^rHJI H'`bB̙3bc03oo y'x5t >s~/p#O;K^::tH$< AocI2EkmmmeNK &ӧΞ=vرCQ9ƿo_+Y?4@;>0_d@د:qs8|o;wk|&$#.O|v8u=z^yZ]YыKK&}XͰX_{y~fwQ޿ p?0lҠoIďwDK{8ݿk=qN:!nv0ͯ` h'N?/Uo n>|/_*` 5ؚ ҙ=(_d (5>>N/2 Eg`c?Q&{ҝwI7p`{]=^D綠][x$#g|Fpi01< / :~O0@lwkoHߋrsbPk۶mk_5z.D  ꫯ#<"TnHsf?f@ ^wq>`<98Ozm.>wR2) !Y{-sBؒ&%,&8zt䈼VA{'Lmox ur s:~8⋸Qf5ym@x;߇Gdƿf;>[nEҖOIIC$|qBn-܄6DI G= 1 9M<; eHncK/ѳ={7lG|0$,hkw:K߆A]_l{n\Yd(7I{'to<믿\ ;l,{8u)4c˜<W|kC&w.. t>pv}7Εky&VØ@Efaf0mF>hI&6^?alHwȇWUxFx`ca޿}ß馛n:A>AVx{#-=p8oNe$zW%Z pC$ x{WkF,N|#0D+*KE~ux1ưQJe9O!T A " Wã%њsW `'|R91~Rc`ӧO׾5w}Z`> ~w~GDA@>_җg~ab z3l HTG4pJ6Z}yɶ2i <Ek!he~%YνZv*G[ xe'1mS,ƒ3aڐvEG_>J?яdm$@,5ժW|uzsϽje`wAzmoe^s?;Nz/EKKp`N \_Z2>h¢= 8?'=0Zvp !@#A&2P먊ZYJF` /rK| AQ h\ChK _GηqfʼF>U4>|Xk\Xg0ѣGx76^p97IR $ "SO=EG$|z!1ra fY<$pi\jU 0yS[A$pP"]X4s) T\l0DX35uU [:D9İ(p o{3k`ciG>@\^4=#Apۭ;cCjNZ/@_W//ibb~[Xs.7GyK MN‡TG H+.12$7YD7990yqJ,q!B4K lPZ(_16Ra8gq9(f L}! fhm5 1U DEzldVfvAfo@ d-ޮkhV,@g AB H}ZvDWQ 0.g Fjth qRwgJqԴ !juE~eyQ4CCSv2tY)_#'7KעI.WBTL;SScLH5}v)h=~lo3xhT XcjU Hyi Ѝ;/›/Kg?Y<Gx`.<<~T8$OL2ޟ "d1qb| CM\&$9AD0bwe?ቌaC VX=pf4 ` `[Ml~q a%23wk4Zu!l0>`g'-iE[na K?d@³cAEzT9|;{^qlj!m]hXp2!ᏋdQ;a[f[˛M3\{ `JKx܉'," k?{SZg_@:`H.jWr?swm5#.l &SejzJ`hUZ "W--@$Ky0(=3XzgH={ gB[ ]@ÿ]Z; ?xIOP30+Hy6ԽC >DH^"5$oBXaX߿J%sE _c0hTj"L#22m\|-ͥ"557ڀ jjf&oj^?̿gox*&inc[k:yLdYɿ`pw%k 3M' ^P#] K˿d»IXHC yz~ {tl&'h,1,xݱ-Rb9S6'YEB b*& xu΄ZXu)&yrA--be5gα^f%7g 17kUj-is0󶄢1lM.o-M'*;E jm7+3gGdFkn4PS rs,W#`ǎC2ɫ6;d ,-;w d.䤏5 'R aV+4:6LmVmTi\00F6k$aF_.yX؞~Z Xo5#8gCfH~-9a=~D? ux ǃֵM I;v  ;O2tƬ4dT1G}{Irn - ,HP;O;B-t83 3%'/5-"f) ̠; l 7\N 16!|@ENn,E | 6)",ڬ6rm$t3k `@.פ#~HF詍12:&ďlf,"ssϱi)ƙZ䲡hŒ%0.r=~Ҽ@0@T. 4DWfnfFo{c+`5W4FVQin*QȰEޕEfe~?NpF;HfrrFR! $V0/g$VXws=j4 #Qƿ{7+/iu춝Ƌ}EjPTLj UA# -ce#^RCC ooakA XSxxe%JqH%hS&%@9w6Z@ CaƱ e^>Yˎ$ D+KP sGlyM@L;Pپ]=\S3ČԽR!GM\xV| ?[4`2/CQdDl> *r.Nd["?R;0-$v'YΝ;ޜ!ƵX"O)1 L*1K:f7;Ƅ"%.gt- t-R< LGcXa袴LP9)z~h (˖Q:l5l3_\Z0 F O2`Yvuu]8?( fgY⺐ Xou!!.-}â9+ y>66v!a |.ŕFP CRvڒ k!wdaDLd&9(GJQD ǺK=h`lbof_(oi!M)H4KU (5M1s[GCSS*!XYv-Eta`8 `=/KP[[4{kr$c>>7 v DMKo}[nmVT)ԈbF$'0 b'緵K0PmijDҥ.򃄤E;AԒL@KHa{+xTW#OT_ 1(5[{03V1 M2]4fF_Oq4={hldT={w3i nyEurxR9\ 8 \"nf ԝ>}?#aqq7:Dz׻{ "UR7A80 \b;:2Z,j[Auk[iڔU8d/$(*љ[TT8GbۿGR(p̦e4ĹbMb&$Y/BMST- ׉׶ Hdzc]ˋdR4c>j`"G0&KS416N]Ggg=A7MvJ2mͷ"vll7YO1^V=HD19( mm-"G(j0R:DG%dDG%4Xzp\ l&by.=Wk-$* feC,mbB"K) ZkjDT%EVk"mDKxFXe@jUqXm $hx.ݶm0 s Ex~乚in<̶SׯV?+ rtn(z{R?}xzǤ,ΟccK\yܵ_ֳ/>x?e_%(CIEN iBQq C {zJg nY8u^ q̓a#`mPba:;G3A+/ 6*?p; ^& AD|``=Yʭbl~%D}xGs3 ?9[x?Ϳ^2mࣼ?pߛLYɏ \ жTaAJ"7Yqq6v-߁yBOBؒǪeL<88m &JnN"Y 0uu6;E)/23B5B  {[;VFD.p ١;w "dM\3`zv!B!Zkڷu'Ox'>&^ub*. r<~ijY4ªٝ H[0xvnk^$x@(PLPB rNvOJm".(uh*&8@7ՃV:['_7k N Ҙrfho2̻b@hP688LqN:0iCӢ`跱(KbE6?3nH@d4pZZ^ 0E3$ʋ$?5_ ӳ4::&/[[DwTeHXdX%T{ '~}M^(Y]Mk}?5%zEJ;[I6͝ov o\] Bid&h=P+ L;j F H)ozw'h uiqoV #bݝǧ*I(#.ebl:ۥX|x75(Ԏ@Aꤱ`Cz ~ػ/JirmIgBԎxDAݯoؿje{+8u_`"4@Y{ m;kp{B0D<55"괡mm-5jv 766JCC?#зϯl;t[i[ba6)^\1Ď$7lPD]-~@)~`5x#KfڄilO9T'Hu|1M:iF6Rִ8е˃>w }hǐ̮#AlP3:2)puItR\d aE..س{b#Y?yėʇK7\J}mScDmY䚌* Ǹ*+ % ] X`jp6k}K=d1t]Bm"l SlԩƿǷ),c!*|?BYߒwnt!̧D9>pwEJGRM3Um~&/}}M6ARFXZ̡0H$gobb%.b45[uNGdadB#d)b6Sf|O23)OcL5+37 1 &&eoni#,Ti WH:CIzS+&9Fp YN4 W fF3:i9 ۫Ⱦu3Z- r:`JFPhy  t:#9n~nFLmImrVD,׹'tYBynSqQq]'gGgLtR<7!HK XB'(7DŜKnh2'ZAA -.YڄDxL|Y>` n,/?o~i0kcG-\fA -(M-MQPßPr;My*&Ub #%9՞F;&ǽUs+)'ܦLJIU=Ɲ&ϴvnLZ;NƵgvaқTl0q=ZrDBԤ[x4DNiH 9džyT(Pk3B/3?gQ6#\+~]xz#&.QiLRU(FVy8xJ:]T]H$@`w:K&-(6 CSK uoF~FJJha+ʦms5bCcVD!sԇ'm+DD{P^h5P) kSF^U{マk ڛ2'= `*"-!Fܱyg3$;)@9h}H'iOȳ5;fX_vm QNfA:S-u/]u0w3Huf7E6஁¢ q _T#j^O"50(Yܣl(C(?j2rת$̱v $ ϕ{vʧdؗKzsFxf6~s43ot(gʘ&yn40@@e:ƥm:f % ~sW08>.2F|\e!z;$$Qfѯ<׏i#haƅtapHz$g:OXl'':Qe_*1 Iۤ5u܋s)Gdk%e{ߏg2Th".X_-.p89vA|>MeXEZD6h I᭢ݭbüN{z DA[))1dLa,M>|mE,ABM q5E/)Ԩf qfGf&sƷOSv"ICgvd3B $2Ni{]XK'W˚Ih$J{9mSd-3}\:8x c8[Kw0u[0Ulhe=ΠMeV)d O)Z _.7iyzQŌ|5maMwiiߍSxJCbŒȂ+x+vzrԲj ?Ii[ew߾!~'Lh@-( 0~Hl-\5 s6lN2#?Rpw4oķ`s+QHC`GQ-}>D{ߕ  ^dxL'[, ϐ7L1sڄMB q~ȲdU)T"2L1,a{Dg"牉{T(i2~7Yg A荌Bp,a`X$ys1Bmsf(d($YYG//") a9;v9zsS~ *NF/?\JJ٪ԧ 6Uy76U9mU:)Үk)o= et^]Z%YG%祛D-s+Uz! A4ĕ-(M(`3hbA7E_2DэM!cY|f&P+s>EyU'źݦ>i.$q:\dG%YҚ<-a#ľԏ}a;իs"#ɔr:gD0CwIx¼iaڣgcR -*^Y.PunUL [L8, ֖@ j1 #%:\;vŸEOq%4@'?;Bdglqل̔2mȵ8@̦m,]+IC96 04RF1\o煅_չ>x%3>^j~s5Ej>f>6ٹV;A6پN};{E@&[ĈAoBQ1 Z 'f8UQ& ׉o(@+iʉ#*#Yh4ql Ej(.:(aAZ!,"ﻱV`(e <^tVpV1R3$-W$n]D딋a}|P:\\ $ٲǕoD30f\G씂T |Q6Ȫ?6M3 ;'2r-_T'_h=ޥy 34 ((ڿŔAJK@4(mFl e֘0E-^ NfP B'`ZTmQ{["{d)gk6Jۘ6ȁE& |%uK6q< ,\sdFbݝR\Mya t唵LGf2zu]C#g v-Fv-?53M= ,/m6H\m;sA"twf2Bm =$#h&z-jF w.u@&۷j4E23 `G}A ԅeӉ9Iij@"{R&&34;?^YƵ( *s{\X%r{j%'r{HyL0̖\W(;?GռB*yl/:Fj붰@i#Qǯ-gYK~MuCDfTt@Rsbxe)&3=$rT-@9|"33fTp<ԼYh^-@ъR?X;M$F4G_ x>0 gd</]eV?359#h"o@Č6*P*oCP:ہw=7o=AuAD, Q; Ljzhw7qϘL^,樵.g`Tsiq֞{<.Dj8(J'Ρ́uY 4'8oԒ;Y,E]sB[btC` }Wb٠;4R0)&߶:^U],Uc̓kmnm7\I#EUBuM bJA2L 5Eڳޢt_ʮ&)͞[Imʹ PPVHs5l6p=kƚJ: M ĪZOʚ310tZ)n,ŻM32ms]=F$uyrp:ޥx$< 4`( ^m6J5&sq1q34yDi/R*(&t"7&U$+ 9㣯kUUBuX @q FN7W 2EIM^6u((c«>BO+tg P}/O|>>gBY) 1b`Y-x}qB瞑k޽g䱘`<=G‰}h73_׮MpĞq~'1"?VnO=E?ɋtwG?Q u-*o=Yt)q  Pvu\.Oi loL]k@&c.QJ}~ۏGg~>#MG^:B?ᅬ<߷(B1:-򏧦Dՙ"';0pa8 C]ݵM֦41&L2==%mÛ009I-'ѣo1.gh^&IOf82vC>non먕m=_ݨغ`"fDVechtUD mD85vue\~!3S@= "0k9Gժ߷'m4iNhEFdԙSESW-FreJVZ `¡dYė?E>ϧS'Mb3i)]]t%Z]+C*"CZ`؊f)(Ӥ$UTU$%(wQG=rLP^IFoIH[^w iHJbmvH'm4y6LAYFx0ibjRp*1mc23-Wlq$5H):H!iO.˳FJ ͎2[(mzۻml h7**r5(Zg+K ncӸ)ðqlG6huu7}ԩo=J8&3r]ge^D9[~8m2nS7mlzjZۦ^SRTRS|m=ҹMjR I/3S='pZ\mV7mNI/ M3)ǭu-2:Nl-U<MO<8MLNH}vX'uFY:x6UIwfUw:#>uL.;4s Me7E_;ml޻na?a{iOcڇabiZf7D}&}Rm@JjYјQ@lYBL90oK ĤdO-}YPm`5A ޫ'+ ffd. 30'yxx]ήꘚ$‹1ܩ2m|1k6P5_rZڨ yN!:xU!3?uh ;QȵZq6j]Qg^%&&X:)7\dv|7 HF`퀶G^ UV+tu*'Ʃ^e~fY*&ٟg]}{♦`R諾}}4<2Bg,\(^'h .BptvK0`CҞI1fU"YHxtFnQ*/}>~,C TDPkv|DI-rl#/ pfS(1hxoKLMµZGޞkgcMίVKKŤ k.0)?ۺ{%߿OW#f P: A#3̸jimAv=34=Q1&qb䵙;z;oAUIfghW؎kjo/JSuwP}SE3C[@yYXǂ1w`dx;ԹkټlZoQ ת2%HoMy[njFjq<*1FNeՁF| o<ܳHi $-_"mзZXz4%?6O /*@ cml߽k:1FK|IJx0}9d<%qI`&k^'Eژ63] {453IVhrŠM,il=7Z$cLZI!t'Gȑ#7u!=={fF] .$+ɮ^2ZQjIv4ALTvcܷJwK qGS \c԰V^Ȼo- N]6 KMƟ#) tP&Ydh {>Q%Uh(nS\M3 Ct3(J?ԓOJX"y1ngBb CYT? (sV6^ѽ_kon857m:*^u\#X[]IAjܠU3.Dءf0\樸$^ lDEU;A)ʲ mއ{{cRj C}(%7I{;ÅE$[L<[̹BP4J)f'H3#Vc6I\E.xuD$Jfwt5F#h|`5!ļ`hPUL3a"X G9CRkL/_4ȑ„IHgXj( afhy}Tpꮕ?37DdnfV]DJkWRoOծo>poOn,y>UQS5& 4u>|Ck+3A+3ZpfvVv [1 jqcb}_Na+<` F6_C2)Ag M̈af[U?k\ȁDyB"ul @q2I_ߥD 2 L<e~Skzg'L ;u4y9`/[BUt@ٛf!EzVRJ57l : _].@>.v"jjm`&$KܛڌJr5L a>W78ecI& r.8rM4335m +UlT O%;TSUJa9^O*ru3gTgvLFHA!`||s3l#N|ez0bcZG+8m#T/T! )A =r93V PV{iÄۏHɇ5e]mh$78#C#*hDx11GeiF58q: HW`ZLlӛq^ `{q"88m Okf=i 5u`9_W-43BFꢡQzc.p{m6mcP-ϝ0"$!/ƦtYЍ8Q*N$fb s-/-:r)>jfZhbÅ-& cLfݦT=zܦkRTӕqfjuO e126&ޔ xabP#@2Sڴ T 2P@Wǟ 0D, cr j&hnigΙ|ё )7.\6Pkugluv?%CÃ.Ued+!XtWf=@ؾ9?91!}j0ibȖ=z,FЂ¤W-T-{<l/R jx9Uט*Hez cO5P~~/"M bؘdwTVϟqjǰt3케`#~hσfgp&} {xdXrU M; ` n G.9{F##C?׹sAwwPՇ@u!Ze#R QAh6ɯ'@m0}͚FQ }F"gfh^؁A2AS,Ж$(jf 97f= $Rm9鷶p`vHr%Žq㺀utuSixxD8Fq>&FJmFTkA+Oꦘc(d6 0 28UeWo wjWTF EF̋&*S5A3x;U#'N)@ZN;Qaqc?uz. , J1mrr~]g10C6N<->4<+hN]f5rzxr)vV'^ bwqJ&Z VtnS jc-^p.LmK\Ȉ<4_ڂ*^0_\%LSUz_}&׋1/P`H^a?-nrj23wG&&۷_Ty˛p,[2,ku rOxvHCoNi싮5pf?"R #:Fib7d.wqv>O|׷nu<_c0nG/?7dhUUm}h?9=p}lK fwX/@) fܐ49 [k:k:qlSO=-`E)DyIvYveBwڐdt{ ԸYxnλHB/]k^ (cr?b(\6!tA--/Z#6"{>v]'-z,I}]ZXƵL)X_[Vy'NӧH,Ab[xm(1ҰEmJ=Ytgq%$2[x nmo!jiRG3>T*hsӱcʬ0~W+TBQvjQh6+_M] BT y_>w EҲ S-YIJǟ)$lݦ6Pӟ;N/-ZSg`V2Ie*bR??Fe׍7RлIwZ]X%Lx4-w/1!hjjA(DE/vf_4O YZZ}-1# ?4tAr9-0!o E&;lNx'l~x+*:[[T'NK0z?D]*+D.9#Nϋ46>" kT{it\l@߅9>.4ZTDz)۟a#DÕ!1?)&b*(*ZBds?Uf :Cm݊ŒW&us RfN͙SL bH%r?#^;>̜\h#j')]~W`,I!M-)eD#lA_1ھWȥ6 GH)?xp{}nvFZ,̿t-Ob@iiv|#dml$QTW}YB@=°ƚZey2ܦ׆`jv%uALؠ%z+, po%B_שEXA3q 6G"6yuY(~s3;S2.r[+>Ο;OS:?' !J@ Zc& |GŃfZb l-br~]L&\n16c䴁%LԚBM< `#\ = dcxx E&2=uueh'n^- 7d^b4 l߾0pQnjjU;a5\3FCC:;37E]411&DTұAHΗDAf:6 :e;ZڻZg$xCt]I,vc(ٙ)B 2K/B;w>pqf`~E7g^(߃f6Js$NbDY"ka6p۽뒨ʋ3g` 0:I6bFԶ\l1 /f<@!,(Tr'Ef˭  LPWrΝ@WTɌk̘'={|qLZp}OO=Cw68˶W9-Dž"B\c,m36g͖q%L$ɶ09m Cg^9vaJEƊ"-FC]>gafvГ?|J&.i &l$e]&ȃ:NF曅iYطOڊRF!k2"\ΡIm[n!I)l7::,4=ڹs9 "I7H<~6X$k .๟wd&䮿5ؘs pΝQh1O+knu=K:FN[VWh>hJeU2 / }!zwCvf > MEb /~Ӥ^}~ t5`27g-Ozr)-2Qev{n5q?kQY0:fϿ@_vS'C$M]&b߁]'\ |ΟeA033_dRF`m<88!̷6rAM&l+;?p]wTutv ́t&H(7SO v~ao+lw3m&w5x璶.Z?Gf,Ȭ G _*ՐFнoŤ0:D #;nIfj/u-H65=iKe@_\2d 0|}PYlwy/b,ʊs bt_z[8E7lPt5VVJSǤ[_( `\S$3@m,v0 iՁ̻g[siHD'?Uiv "kNΙ"-lcR!>Ax[mvHK ִX2=C {@ÿKhvBnVF n±(` nK8ֶ6a,RX6A6@ !ZiWnOʀz !z|ܖy"Ju G"o]``,OX֮pԾDQxh0:pj(G}B=Tg5GI 3Hotƿ;Q"'~zK~>h1 x^& XV~῰SNb04ir`djUE`v=$YU)+tRyÈkll$.UlC߳e?ɆF eYWF֖Jg34Vﵡ,P1k%Ki(WW}嫌_{R<hR! BIsz|cƘ/<+}EC\έHy ?^vqL`ֳ+`A ^+YBX180Ej q:;څqN>Kgi4i:O=laZIΆUR\5nGٽ1 覞h \\/i]q=x#I75J®*5HDbdw`՘ZI'cزww7gMor(C"%" `+ /vD۫Ϊ_6:F`n SXHCkBIw0@B~?Śg7E]ݹQ،lϟ|]r̋S9TqYx @t!R OcAmƆ;~i1 fM3ӲHl[lCt؎(Z_X4(fgqwB3O#?ȶz3<=Cefᅙ===m,lVYLԗtN ,[b`?/}}p[GWٮNIZdGU "(lg~AkZOZUjǒe^4>UfO0oQH`"Kb@WeMbt#ȃb-0=ѣ;V o?D4\ R?1C9IAw lR`vkoX%c1/` rpրsLk#޿ 556VVTI06_~^#OY3pa>ﯪ:mp/2WV9)̋__>-`n3m`UC[`b :0 .)2|  |'Y}R뛎1Wo?djD$4} NXM>_}6G Gy'nxCR\ W6<3%hmOt3 .Zo? lAzϓxEo^1 -ĘnF36#n ̟dkE7o/oK.M7% ;Af&d' nh}vV aI>|.u!]{;w l|,H:dUi;oHGvsO/w.D^E޷1Z#ifk0+r/LGiF=cxXe'e"FLU7o?!ZlX!ح[b O;*8 >-f0ն1 G0yhJl!:Yǖ󫈠VAOM@v?)NU9@21 _5i5gb4V9>zlz3q'7)TVJx ;_;ɈFZ>O:B{Q08ZOX# EX?/)O "l^#|?bCGn^##N6GL{vvvEU5#Ʒ轿MX˴7E؛QqQk ﹡0&J9oYqؾ-Hk[;"hʍ( :g7\%t"Yp^g@]7vkB3*TyQA[ZqR>;k][td [owOs vLܬ20/eG6h ޲l،$8CO z}_#}*5p_`T&jc@v2Cy{xLVxCM5omWq3:VWϐ.{)ZW%ȳl ëQ}+GYkׯ 1%WEU.Ӑˢ bstu Y7aEۼ Ǥmߟ=ws { sFۥ^Q6s[qY)M3ҹV@UD @B  ́D6[g}nrE癖#u)v-4lJU0B ۥMob>&09ĂmXv(.vDgnEI5œ8*͊쭹oNJ/yX>g^1&A!|iMzs^ph{`p{z!cp g( 'u\|k"=dy>&&m@wYMD Pd<AD{b]xVǎ#h[@-q2`iekX8RT)o~aQKm3Gg:Րxe;mF"IǏL4;*SWWW8Jʾɠ-0@34LgLf'^O8Ȝ(>9~`["!Ʊ724-\0Ϸ gࣷ5 y>ߑU } 4~H *eO@ \y @!ik$_!a ie8p777 Xf(@PfZXg-ɆFEsrXٯku\Z+hŀTI,':Wv ⻬g>1*wvA x4VXĸ-FFs_qaSCFZv3LK9|t`% *m[Y*zDS߸$$svl|ak8os%_$W*dB7mEl‴>ǻ\σ.h'_Hߡ籧kMC)_!%e $(2i\?UU5\|/02<4*x:kSph  CsiVfg'V^Ƚ`1^ۀyi#Z :IG$+0ua y6meR:URWb3)7v?fcj3Osm10#IP ! r;8)^۪;yJ& ~h ~}f┠sX)i2%2%5*;_^r!)Uu dl {M!jt]E8y':C,a&`O5tS[[ v c~{rRn gI+pke™Ghà|ҥb%F?#YO4,n=6QiJئ6Ѡ^ Q#!t  ,="[a6ńA^kb9'95x]VuMvd6 ;<:1Q;$$b~䝋D-u'eOh@F_DX.Ҡ s Hش~4:- y ˫&`E5DM(YHl+r!SssXXàc3 Br5]ht]mOǁ|@}HL?i9tL+(Y*C*8ϜZGya3 2¨$~,/-[S mfc }&&eiE΂(9^4UNc#<\:ѻ"4]:*==e MCg8"1g8lNPt*г "P#4" 虆e !?GF`@džzʛAqx1DΈ c OM"kQB @MX'EK7(2e a k' Uږi;ˀ Tbli|S&aƞ8e-82Rÿ qՠ.ou:_x_zC'wO{HbEX>Gs|aN|GTBU&Օ뫓FFSAt(i ,ZNBo$Y/ xFۇ4;֦1%^6lUi~l-A?$;ܧ LmN;  4 ]DFg JP9 qHRV`2U$pU؇u ?k}CDdvLMC1c:&?C1K4Asqgh:RD7~l 5MBЛ)ɭXxs@ A9Ui*r@/bXI7yv ^^R ɓձ䐊PСm"QCa3v}DvDʔ5̣f? tE]gɄELr Uv(L9  "{eU=1K(273"&кc*s7s:D}C3Q#-heCK9S2rMؼ_&^"d(P8Sxp3XFx|NOr 9Nj^ Cg RNsc>Ĵ*U!m1+")82"?;Q ܈nu*L'ңCG"KDUupe |J"b 5kr#c* ys2 RSȕhEd2ySr ƏsVMy,W!Z>*H-D].ɽ.úЅM^5@Wx xy:#ȪC^"R뚄jgx9 7O"{~-^G%^qnZFb91_Qjr=^B"Pǽ?믄֣'w9L"IENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/72x72/0000755000076500000000000000000012653527012020430 5ustar devwheel00000000000000DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/72x72/black_luminance.png0000644000076500000000000000377012647526523024265 0ustar devwheel00000000000000PNG  IHDRHHUGtEXtSoftwareAdobe ImageReadyqe<IDATx[klUm/hiUB@RiKQ!J}FD&jh0hjЀ(hE&jBՂ]jZ }m[7=Sevws/ݽsw:ͽ٘ ذ %㵱X\ve? 9JG/A񢵵UCPv={IVӧÇ^!,#$ <>}S5jPBxg'..9' bحIcdx|R$Ӓji5 ʹ"_x<SG*v:g2}'4eDrr%i%a倜 6CϘ1C*%$$fg EEE"??_ICX  SEeW'}91*C2g3䠱jj}ȁ-h(4d1$^?I]eg܄HP28חv&1?AD$ pd b^~B9a#>S ՄTv=d7)>~n[o:;;Eff&^~ب6 =(8Ue$MjooO= ׳j+a?ESHE½tÜ e^& )r,%HۀN³ȭ @I7nM <% ޔI[rH!Kv9i[A[us[ɬAmRKWIN a+-z5mp$M$瀜I$(cnn())R m5P (czyKG ʵ*Je2hQ&9D(gbE#enii1-HGM2E+];VWW'97.LމW Vȧ D_G$hmBnسrJ{7^#d,$(Ͻ<9I&Z,Cŵ1A|&)MtK![M0\Yl'LMok)=t*#B.@ڱJqKz i PFWe̐[tSКL\JxUx(V [šCDuu'&O,=BT}+џ"d_Ϲ.gu' @x<^8q„ A~BN"%\$p_\/JIIAo !K ȋ穣MRT Bt:u(//ׇ~2_bv VϨ^Av!BbAAdYQYG#F' FIENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/72x72/black_luminance@2x.png0000644000076500000000000000445212647526523024635 0ustar devwheel00000000000000PNG  IHDRFtEXtSoftwareAdobe ImageReadyqe<IDATxYlVEǧZ5j A@@X1QQyɈBb"1Ÿ5QJJAAVY"Ƅ"A=Moou~m;>g:::\, @@@@ @@ "QebUUU6[Nx9}NvGm-ʪ|@V]_G&F 6PXu>("d["l+J @~ƥ aDJa! -{$V>-GFd$pʳlg(ϊ`.l*5/巣$XP"0[PS8blYӢ@ (ȖM乏 y0ȳGfγd}˄3zs?٧d W2RDTR dGO'$/ MjnYVg5Qm}!%yPsl5quaK K<L",?J4-?k$/Ѝ7U{M,YAuZ%N-K{(qM!~PeEbA8#NvlT%5Zyk 0-3FiIXcS&S${X!L~.y_=b8>Zy{nT]~!;<Fkxz#n,ԭfddkE뜄mkKјe^٨nTM 76鶗6cRHSnA=EkzGC8Ak8{ZTS*I`H:A{A&v_ ھ@#a{ %1J, 5b+|a#{Ǎ^${+ / oCWZB#:YfXꔲ1c4:)q!ީVyTV# }ass纜.@< *FsFD|D d %0 %]%m[5X>g@v*DqܓsCagM4vwSTW{k+qϼ ߣjޒS4%ToF</88,gނ1n< !d- S^@t>($nuzE"_'P|}|R&ؕ; CHf:VxzҎnRݽXP` }|p7/K!1ϵА@"i8o,4F,BO ,ixwFhi$hR(, .It07yޙJ^@@! ^#QdژINDZ$d;NxR~uLdWu<ɳV$8x(L.*!Z?-KZ9#_V޴OBrz{k0m.(ʛRXo>#/a຃8ӡ7Z0w]* @@ @@ @@H`+i|'IENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/72x72/black_point.png0000644000076500000000000000701712647526523023441 0ustar devwheel00000000000000PNG  IHDRHHUGtEXtSoftwareAdobe ImageReadyqe< IDATx\ pT#dS P@4)(j*>:i)5؂8(BE cd@R"$IBWvfI \{.w>jˣ5O&rss)11QShiuEPA]uEPmPb!С7v՘"I|tA;} 0"BRmذv{Jٳ)&&>*֑h4FTMW`(0'=@pHUnذadZI(hn]3n@S |":"xsۺu릪0ѣG;޵ Lׯ3gj_|1aG&|K D';ƍ}gF ~rrrAxxŊy.WS9>>i!sK$f_Y;.[6runSOl?^](%{v6 Evכk;v,l6*.)IsAbӨ#ƥ"ޗ%@:ܻiFk}K/P[S*ƕZ䜜]UubԸhz;t._n8`67 G.B%5l @-:r\: #CV+^ ZN"diASLzW5+WJ έ#AO[37 A0&]%) []7]:U.* 0q&I<9@`0RΔHD1.'_ׂnKG\%6@Iav?Ԍ@ Rdy&96 \-9. :3&S_oW84Aϊ$@`ڷu܀'S5v[ 6FE(|7gŧrkyyss#bǑ$Օ­Y'v1պ(7’V$[#Zwi*]r-Y2E%j$%<[Uj%F+[sȡ=>%4+AcTlҖ :g8?㉾?>2.5vn ͞(MvvZ} uΝ5e"rQL7q;ݍfɀS fҦֹ}MȐ'I B=z]PRax'eeg_Ί'Lz]wը."5r6Yod{X rշ937);k9MT.N˜dCޗH'ClUM$Ի>#*h"@M6eہ#FMA?W,b$┷r`W};Žv 9sP\\\S_ttԌ%gl6Ft+nDfN՝YVZV=x]VbYzukqV +Q׋OIǩ^'B-[֮bGAZ?u r-vN ~5G=Qb= 3A|s]X:.ufī՝dL]8Hzغ&]uEPG 036fIENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/72x72/black_point@2x.png0000644000076500000000000001525512647526523024016 0ustar devwheel00000000000000PNG  IHDRFtEXtSoftwareAdobe ImageReadyqe<OIDATx] u}=;J/ %  9$8$8 1 !:$cB1`A gwjzf73[ݩOoםW]^.#'NF+)w 89qrȉG '@N89qȉ#G 'N89qrĉ#G '@N89qڒy7QXX8) `+uFTjKOk41Ʃ#3+|xMOF93u43>.$R͘XƘ˘%꧛bd?3eN1GO0B6v*w1c-9ƻR 1^codHk@Ũ(l%>-+K]$q|i,uBf)wi2w3B$|D <@&2 {4yM3a0A4nN I0Ad dCF;k6c|o(/I(^~a?j1e$\&8ʾHǵNB~?`,&5;_x{{ *>k"٥ily ;hm\U_ʸ[5LXu/- ()*?fU3m}{5RWu(l03ڑD5=Fh*kqvCKOl"۱sahp|1ā zWeaf PyH^(!IDע+,9g0@A޺yüm`xCT2c"fH,6!T]ў_f_}w(2,3j,V2V1i!n᭟73 gȿ(HF!SdmTD:TOwi:(: i Vڥr-1:9ކx.򶄷5񖢑LRj OYȴԒ!~Hh@ے~l9є! JDRʔx]Y?gYde9F dj-e\pLApHx?!Z{@*앷S@3 3*ݗu@D7g'o䭏< =Qctu~*Lȍ_H!X&P4BoNȌ2 -:q,1'4k94[q~IZbQUӉ@ov k6"1}Q߅S.e8]Kyrg?GbJe6>6.8x{C=OMfҼi Xg$9r coQӅ@(1@mK<#Kˤ=3qaDh "SVrQIԥ l:>ԮO0@ t!xP#5SW1H;w y4qa;My8]!_i4$gt,Zv~qdQ'0ۨ7hOU.]B"\?Oi0醄u(g]-fҀ hP~f5Pk(OB+a̡ޥz|QJ h # ¾%-eq5]lӯ˜db"bߦd_РNQ?!"O03pVy6M +uG MeAPYwȂᆖLŗ]%fm"jn.h5sƼjd6&ǦY.F3555E tVrhĭf0{t0a$EURkX5{u-I@6o ظhknEȼ4#RmH6^&޻g(u-[XS]a{YQu 2e 1ܠ,*D({!M]=Equ)"id$`J񇵴JS.)JS(]Tk#2c:He\~ >+jkS$M%<;}75ߗ$:X<zzX/ Lگ 3uD;wgS?>w&wWQX%ZG( sySiH J8ԑ" Fϧ=Nt=J NaoDR=OF?'zլYB$߹`UD!}k@4ֈ@ CP)v|v ϭԧyVk]naս/5q"cS$D4{ sG}pmxk*qgMUDR`n&j]mNkqt YFN1^$YɄ9;o!!L)"F#Ok"/` ABͬi\PN;Vp* i\OڦS@D:gުwq>Y+31.ć8'ϡyf Zȋ* C4Ua*F0a6oq^ׅB7T3ϙ9'Ox8TbRnv~8Z4RQJ9|8OGr0|OSwʣL~/0 IAp/.dDb5ZH;bISy=u ?ev?61d"HCϏ7uyL(4+4K3 j>($sZ}Z}AH$&,F8QEcOe^ht(SmZL_ܩ2f } xL+5DK&f~ 8'T3M ^)?;/QMKI?X۬}M~0H4CO[P+@YMD_Lua ѽH y*4IĉK}J@Ɩ,ytn7̘IN!']k;j_:b~HISI0G`zzT'PH3&pKo%ſtUm'P\퓳8I$Ʒ8֥"7saeԘ`Ln¢F'h&Mu($Wl4VdGT6_ւ)CNI3ub7K𛊍4[~+W%]Hvz#HlƼRZelATB r@rF˓6"P5fGl&0'C.YFdYj|QN+m3mӉ'!SsdcAS@U[5嵲LBfHW7$}PIj}{-vWw Oѣiq&h^RkgKY2TRmmΊIk̄,dI1DhDg߰NG$ #zwx?$RÌ6#De>/J֊8ע"#dhJ>6 !-쓾Yx#G%ὤVlI$^tg ?B9|YxjIuiJWSXQ Iqfr^4(կ@&Rg2d7e~̹mM%ashw[psvU$D@=z&H5A#zD>CǮRQRި\;MyC_%zT]Bz,GmH[葎b ,W&s PCR+edU K RNB2 f,3d#';hAqnV FR)-HZ3Uza0qx69(f}县Uvky2_ nW<&9J._M2k %4QY}-\'hvMg:0-/^qH`)#TbJF43,N3Ig7RKf .އH߷Xk`uunnU㤊)+TOc(% &^?N~!rDbP"D$g%C;?$4UaTH"Já -ɞINFz0O~G m0R͛pרe:#=_2no0h*B߁+uWe ;"WΥj/*ZЋk$oX+`Fh/[>}hҟqiQM*Џ,m D#w3 4۽E>ARrr#Of-r:{qfqP^;FuI[oqv0neRDP΢ɚV֛]JVKWT(8UVIXxvQ:$|-J<* ht*LeEGw'hGH0lazK?]B9WWH*\!)$@#GZ.Yb*.mJʔ$')w 89qrȉG '@N89qȉ#G 'N89qrĉ#G '@N89q ,mIENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/72x72/check_all.png0000644000076500000000000000320312647526523023052 0ustar devwheel00000000000000PNG  IHDRHHUGtEXtSoftwareAdobe ImageReadyqe<%IDATx[HWOFmZ/{mZ h}Y}؃m>VUcΩպL`Mh3/ѳ I>NL?|sQJ 0@ 1@ 1a b>2qNOOIww71z? &^^^|oWCGM+!菶I$::_J۷o}3OOϠ{(OƮA hE ZX,>MOO/GGG4Nū}7ݕ( =G@T" PWWgxԑqqqK@NSSS8޺uq4HRR>2=q: =G8 ?"O(99yoXV;g2Z4*D=>>>t~~ޮ*--8ib IB f`` miic^\\j5`|XXkKo޼I!Y1B2-Z<׀Di䄴fgGò3)qJURR%ZXX *5Γ%ddZ'44TΝor,<Kizz:$!!>~ۺ_ ^bxo= rr ܴ/_@hGDDޞ+DiYYB/a*(, F#Zf H[[Œ+++Q0'___'-,@CCC8Z` o޼Ag>*Igg y^akL`ȠLɱQ"`611q #HewD=\$33uV@`_`}9'R~ufǁs@⾾QdR qXk\n8>> Z-A#_lQO0R 6ay 9 ) 277w[Nh2ĶFPۊVA6 bbb.*C@&0$mj(~QKk_fWțfKj8MRȠ4vu$4$$]ʕ+J vaX^j< tz:;;k9PVD_xNPwVkjjU<}{:! p|zA~eZQQAυТ"pNAֳ-;c,Zֽ{(HKIjj*8g gnGh5 {coȪ(V@{,d2΢:q1@ 1@ b cB"/ [IENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/72x72/check_all@2x.png0000644000076500000000000000357712647526523023442 0ustar devwheel00000000000000PNG  IHDRFtEXtSoftwareAdobe ImageReadyqe<!IDATxAHW6[,*ւBu=xKTRC.=Xc +%B ZT `n*sV8kvgF}pwgv{{{oF:@@@@@@@@@@@@@@@p͹Q7022}S]1RRƸ%®Y)u))ӱJ-_[RV;)z~1m)Ihy ·kr/;;;Iҏ%eQՄAz\~}9,cccӉ#ufZv ʽ_ہ?ЕV BeITA #1Oΰl333@{dG=IA%@%HwcA~,@L$v$`FGG3UeT7LtD&j[OM4<==KOC jJ љj)a.p)ḀVX`ȯn8o#NV41TrBlʗY^^N]Wݗj9Ž"a'Jh4ʁrd@/\ 4&֨_~LB K9LbEbDm>.-L KzRG^2>DuR:=# ޿fLbF45;09_]E,XXj"fʵe#nDSm@wxfO<3?cCOtd44Aq0Kv?"P9z'Aa/]z3뚥eؕ}cڠDߑ;SO5iݩ PXqGSjH+M3 Ь+[,biiQ4YXX?N7(+Rh4Š? ; :wGVv;zMMM)s@3hKfq%,YuGbpD;>K墢 ೠ@VY/浍*eK*?*4jfB[ry`X@T/eOу'! t6fGS- /:#m:7% B (6 iR ztxOLLzu|̆臟V֧mt0bNzt,i" (=βukkg.1}# ]zh Źg'hT\vysۡTG,V)6p=/%v<'(gr5^ok.جt-{Ze3ֱ WRO4>%rAOrW,-)Ǟso^ހEo{po͕}1o|%PY?47a Ϡqxd"/,2w6ڵ{ #?:`J@~*1shws'#=|o߁4z?M0ojŽ=>mwn((2$S!_a@ @ @ @ @ @ @ @ @ @ @ @ @ D`]@WIENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/72x72/contrast.png0000644000076500000000000000327112647526523023007 0ustar devwheel00000000000000PNG  IHDRHHUGtEXtSoftwareAdobe ImageReadyqe<[IDATxmLWoE[qT"0:h_)a1~ؗaŌ^$ 0p E&:tHyk)("{ >In}_Ͻy*p@q@q8 8 I=IdZ۫ZJ.˭*! L=~XVSSX^^gm6___5kZ222jՅ<|4'Ȇ'ϟ?뽁#G[hQ?dffBAAFa, 88uرs0''Ƕ=ٚAn޼'Of#NZ OgϞ\mdd@рǐ^fll%Ց۷o/^m۶BT ǎ}QP\\ yyyo>}v@nK񏎎{ܸq>I\&pA5'd2[^s.jP(4 .f_bE}xx8_ѣGO&;DذaC ɼͅlиYD399T^x1#^%nЬˌDܬ=Ν;%Z5_ZZeRRcIJJJM۷o'|aSYPJJ 14؂El6/F իW~ss;""ax):@.F!9eL&&]):@}}}̭͛O>>=F.\H5z&Ht T,ۇ}||CMFPZ~je}D34Pl您 |r,22dZX[[ AP&K.m[|Ytfff5IӪJ"iii*..&:Í)QV5,K"CL@ 9 UG{\tI+tGvvO111ٳG@w^z%5jN2{61,,?D :'̌F#ټyrCݽ{wFÑh =6m\ 1{BB:'}( 1(A2e(۷n=dee9 Ç766ƹT]֭[WFv$%%F3ׯV& f޽{OgϦtd2bdkfLz=+[P*Bg%$:\rg<*3x8pTj۲e MMM rrr@FF/fY//tww|!UEj4::GeCs$S}˖-jf eN$vor@q@q8 8 /[OFIENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/72x72/contrast@2x.png0000644000076500000000000000525312647526523023363 0ustar devwheel00000000000000PNG  IHDRFtEXtSoftwareAdobe ImageReadyqe< MIDATx[LINjT2*̀]oy QQG}Pc8bbbh|I`,BaG0& 8EMn9Ч|>4}3_@ @  @@  @@ @ @ LO݇"1YD@u'"ވx+W"~wI1!)Oj"I*"H1%⾈DoU.dQDN3f >}: cF?^ZZZׯǏf%")_"!Y1bcc٢E؜9sXJJ 8q"`cǎK>|YSSeݽ{l6ӥ"~RŲ@I-\_rEӟERR?pPRbk.cΕR֫+ %JHn:^ZZҥK|Fs@&"ɕʸ)((+V0tN=GdB*+11_|١~/))NwrHOc.KT+2@;U޽{`<~>|]K֨o۶M>! *&**ZEEE<33//AR 'Nࡡr t\ѣ/V^aa>["n߾#""@##Z%,Xl6FߴiCC '$$Ws### |֬YqwB Xl٭q@ZGp9[ W zRuݎH2JM!t)͛7᪷*!衩4&rZ+tݎDᚥ" QIXoL۬T9ݿSweܳn8Bъ{NArK-%BIiLff֒И/_9=JlʕիڃV, _hӧO۷o<,//O{Z+^YA.DK4`9͙gM뫝>וڵk8%ٴRz)GwSt~~~ʚFD'J?yzCJٳg^˥kkkrZ$kI9zzNzcQ@z2 ޮ6^z\&wa5|\Xa.^^!>zC|8ƄT,%%EI)Gs良P j#:LJe#6`%IfW3]]y@rD]n֨ h, R544(Y3Ь?~ѣhѴ|%ʧlKnLsc'ԛa? #h9eRѝ-ҤpoU[[~wu,r$ @@ @@ @ @@  @@ @ We7kAFKVIENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/72x72/luminance.png0000644000076500000000000000664612647526523023136 0ustar devwheel00000000000000PNG  IHDRHHUGtEXtSoftwareAdobe ImageReadyqe< HIDATx[ TŮ#dJ*Z9"8$SW"fKz(KDDBD0pZL}45C}{zOyZ,=}}4 [w077ӧO5Lq3d #@F2dlF Q^^.̤R̟ ĉK/$N8Ν;:u믿pѬY3i"I!wvvv˖- IMM1W^yesDD 3b༙|M#DoAƜ9sċ/(S*$$D߿ȵkLMMt!/JJJ򆕕fgM:u~o---5E _G}_Dp0QTT$?wU0=/oߖpB?<Ɖ(+v2MM+'Bb7ڷo/,--+A!СC u 8_|y_LeoO/QV,??Gܷo?ptt>}~˖-nƍ F-u&RUV޽;aذaߵҦ2jxYWvݻ[~5a5>;wGvuuCj@$%%uڌffLτ7TDmر7l P.]Hp X}$׿Uڕ+WeM.H䛰0+VnڴvС!#,7l:t܁H|2 4Im۶%Xr:QtOݼy M Ryqq-jA'/]4`H"Uڵkxcu$'Me;,Y2|;s&L`(`͛g"???_Um50Xi~>Q %/xC-BNٳg9)ɴ$><@˒%S~-y>hq8| 7kӦMPAAyTTT4@#:vX Zse+L_`V[#]eee9rH[DR`РAy,ݜ@^S-[ Cڿj0}IѾ bRB҆| Y `QuV'88x 2f̘>>>.TQpG@;gN AuyyyVZRQj(ՆTꫯ^̃nvر,uAx-Zp@m5k@ 6! pDvvv3&*ewW((f R!/Ξ=+S@ 0 )QD}{ΝngΜI5k\h^ EDyG,A  S /qj $CݡU6/%8`58x`#F7n\ j_cǎިr [o%FqԬ{Fq 4BQk%hZ9p5eʔ`;;~a9yd"(+\P*(H r?rǥ+.y8S7bXs`ZUfZYYؾ}68gBffжiLIqoLO&Mr@ޔ 2xR$.4.8 !)Cx5=| :^~5NcI/|9^GUt֭k;--*NPP}4`ЖblѰan " 1իcV)7nqX%)?jc྽9QsiӦF G>LFyrr<666ka`o۶M.V0h3< rZ3@0HV*ϟ:upvv #,,Ԑf|4e^S6̓زf>QԚjTTT =#8B,Z[ sG~'=Vٳ}%3ׯ_ pS19s渣ꞃ~' r-"Xƥ<ʞ;wЯjjxx5թ`wy۵/h *ORw.5ЩSh6E珅Yh4|*_=io0uhy%C 45j&e RN\zA Wy=+\! G999ASv[juɕMٷMԷez(ަMAh>}!eggK ^UPP?sQ,\.e8DŽ[J!B>qڷr9}'sٲe;H0}dϥZFSDӇl7oVoO\R*'tZt)pus6.olYN[ yanj[Gِw*/// _?!կTi#G}ȊI%8Y+p^߾*[ P3@M|8ܷr*P$RA3KxDD9et: 'S3@WiRFMu{{0X@sεb8 2-t0c供;z5S3e#Է#:ipDhRRRS5az$m|Jw=g&M2pXnqJ*4ѷ)$$$;]{J^0\K8ٴikHT"Qqova0LrAތ~< z8kk<|@6PaZQ{\rU^v:inL=( Ϸd'MyITU)X¼J0tK4SI*V‹튏$F>hrCEŸ r… c!SkP"##DD¬V@`XGB+uC rww?TDN!H-?DNhyO"I~3 O5?mpTAjoF=&bq9ˬ⿉*2dl{}{& E`1@ & `0L b0@ & `1L b0 & `1@ &b0L ,,,Je3TJZ%ݮ%J*iD4ҽ7B@IX +-J*bQ[[j%[ n\ugP$s̑RqZ3CN@HE'''ˇJg466ʤ$DL (j{/=3fh.Σ.ó\\L g4OKK Ϛ@ & `DFӿv%fQ{%Jn()QKI Dy)R^0,*w+d/UEy@^P(V[(Q~%}EQQr劸p^J)jALWWyA7yE)!xI={tuS S2dQAX6mgqJ#~zq!׻!]!L+*<<\ԵkdD!-[ (L3C'32Ir Drrۗrss\vUrDw=444}NDg%]T멥ge@e]ŋuCw66l|K?{L4Hct{t[F ;ʀʂ0cκ B1qFӧOEݖ3@h~.Hmw6E8&J]ȑ#0+C$ާ2`XP6D;v4҇|Mݜ7HDjEV$zZJh@{d-J~I]7x,rՁ肙@TBgdd O`锓'OvM '}b޽ Xe^^^{mA%PH.pJx-Ű-/v ѱ'Ev]I90w~ۧϫDaڹsc;ۼyeo{EX#PR Yл;r۶m鶸 3ѝAIu3^*ׯWPcg(&M׆LaLv>┉ڵkmn+XT>iʔ)b֬YZQVV&v-jjj=7*ѱJSX=z>33S7N$%%={eT__/n޼)JJJę3gĩSDccck)WA qId1bQUU%>A- M <$rBwGDzy޽ 7nHowNF}QvB ?Ǜ]VEIբH@˩[[½!5BڼRh~o Lm 10XvLLN daŐF*]ɣHHTNi`Y@]e ]L k(]W.\( iPә@#d|| 8'&+캵yn^lݻw8/_nzeI۴zY2XiV};igG ^spﯥѣζ-J8;wwO_u}}T aW!KX#9eCCC[ i/K:JEmR>2DYR(0; /Z7P1qoԨQ;S:?1ׂL2!!A_6x('L MfO<O(PDEۍVQ#i WX! | e 5!F>Qkwܹs5š9L"%:_tI ><-˗Ejj|p,5Nq *EFFf|Dw;('N ܪՇaM4^&gkV3$=LYt$C~Ưq4tR7P1n`>B! ~\r(TvdTT}vZč4P+Ԯ9L>x@-i }j˒i -T[P muuu[Ia}7̖uji&/^p!NbwD6 6_T'>ֽ o0 }&[8w Ll]u) ݹFڹsapp-AN v`)E.Xƽ֭[}vߺpi;]l`jرb,LݻWܻwO7*TVVV)Lhr0ZVS;իXti#GӧabS!nʕ#Vw…;KMMCp{µB wHŝl%UҎW^N6uIpd38k}AA^A= {uwPxtyzvH&?43&7ݖ'9$N۷鴲qu4J)+A vt(>T,d0dp= "2{ܓ3Q˅=@>p=*'G-sssCpa؞՞zP/\fy@y_dF K{w|Ţv`]#yt@2d/>'Z{n ku;YF6C ϴ"$ ʋђ|Eq%xޖ*66 ?18 iwKee2C'KP]cfR0.axl"DkH \g;}?l-WI TXwYZZ*srr=mڴmgZՑ yC  X6i1( > C@^&o~K'@+dA Ehsj(NPy@K\PπUEAN8ae!}% "N:Z[gL-V̛]3@ & ԁp綰^=r$}iս{v{"]V1fr *֍*eK #_ ԅ cȜ !_A%dB俐-D-a7x: a}CDwB[ZvMs1㵪aC1|'{}(,jG٥ppei!:(isfwlo!.",:tCzwj`:Lc1z 24UD  bP*X8DddHJ "'BfdA}:_"igo%P:k"K2$`Iq^U1 ݰA y #>Odžun^hC׹[i..aD"ٳtf+Vl *jɇfp$@ibӄ́~fMKXNeӦMݾ Ķ"A3ANR0Z2QH1@%#QʉR(m.L#x4xqQy {LIBex! q% PCW]Tdu_F^x@4Hy/^epOZ_Z1.(G.4uIn@QF`.TrD 9R RnoUWHGQwb*$,۝Yddx1P] 5 'u(S0e& R`)R~[M֗;U5g%$٧b2c%/F*M;VÝuIA̮T [D9{S~X Ĺت3gZ#rD7X2T]s+ (!ĵQI$-/⨽EO}%6ƿmʯƕ1Yh(F53WNu#G|iȦD *GO!{1veh2\v\oqsMQ˲XKrgk_|r]L4nj)x55+/ROTɐC?2K6Al:EOywVE' fl0j4\a7/{( B&x)_)_h^\ GzGbh f īd>8U !<RK. xr.FBAOk֫Tp5H1C h Dt0q^' A\hP0bIĕdL%2 !Vm ͊R 0{/ `ej'=71@0#TzKi0H ʋ R 'Ǖ(\ ۚtކƨqf?@VbCٟ(T׌$|o {b,͑2(lCՐV/Aֻ*VSp'`BB r.1XoC(@& D% lpr\V-qIFm"-ز>@Ԍش:\xHf''wnga(LuԶ1@m:]'z{CP^ԀM(EXOMdqOcD[~ W '6i\wtŊjؓHe3Z(4yLSIP-CHQjB%GXBfbuUìjpUCљ("8Z1=*+}I=a:d`̖A1"Y-e )I?cjl(kv<2, !T+,5`M.M#2}J_!G釠ѤNeD9ђj,h'ϥ޽{,E|l3oП >(`ΦYJmEE(!+j+/XuY`1$7! t7=BUThk|BTOgƆh}qr"W4|.dmoiC&@'Q}UR?R Mtmgb{1\{Ð.۠#p M{&d6Rs=*nE*T|'V<IENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/72x72/white_point@2x.png0000644000076500000000000001646612647526523024067 0ustar devwheel00000000000000PNG  IHDRFtEXtSoftwareAdobe ImageReadyqe<IDATx] \qhCHc &XYBXB '!$8;9>  $laIIhHޫ{￞g?nի~$ xxyȋ/@^Pch.Q? :u&$1@FbԬG7?,S>Zڋ/~@9I2lRSe>Li݉&OQu&Q/E-tU嚎QG-JrꝨ[˞nGP/B-@@#@WnU,gh*)SM& hdBu1J (@>i Pk=)HQ4Z 꿢N2H> y-b6ڏ4T4L:jܴ Od{]Q<ˁP#PAJ \)dXzzV8?FRv@ "OB뇨4! hB 82Yt[m2Y-Hv`_.n5ꅨUD!@ ;; <cY0ʂ=Wo* =@9:MM\"8CGw{"q=њwl7GT[]|U]G<(ۮ0Z-aƓ".zo\+]Wz@sP5'\rB.yn] 83(=ޫ8/"#7MpJP s˳h %4$Y67eHh(}4onAKrӨwU s7yU@pbjm5ɲa٠ 0ℑz @K!QT=HݮN{;_"z^gsH}F'* "V?ۨ_[PO`kTQZA,r} .nX1ei 둹Hݻ~Xǡ7~]E/Ĥ9 ̦8ʖS+u 'c^Ni xlLJ@8c:s&- &@8nA;$yH\RU6j\nHN@""p!֭ϥ& տY.{z6R|#!S Q}ޅ=E֧I(؛d6QVY@ &5'Rd 3π ܳwԨ6%DQ\k\wziJw;Š*$SNd폢dXc'M4s>a4x#\ u fT4ꟅGufsa_[VlK D !q&BHk㲀6g A]bըf->zDnbl|D_~d]zta`LK#d7B8S<ζxd*C"+-rq~ pXMf9NL_P:_4~e#m\?l-LrJ.meb+l+sH%*:b>DM[.dÓD RoAn. ;_4={7@ [(r:Cs \B;9C߇?\gq4993W#Pۊ}vY])S>݆& w ʉ|w9GBdQ$“vRnGᱹ5a+V`\G,+e 5OR Hhab> YB5z~Zec]A*._}=gomDl,: @j" [;rY'Cd26)hpvo$ $rqYӦ!0S@ND6D(eoȯ-u+JRVTGX6HyD3pyMnj@S},}&I?MS$w ޓB'r@6]EydPn \.!zd_Vt>[yYLtSKDyQ63i7 Dj! vى-kG.9/srdYi XK nߏRn2c\{(rG5 ^\iUJ ׉Mv\]!9YSqy:0H6ɤJ~DJˍ K{' ^*]wIK(@+:'s[tFAмdq2$):"ܬ$(.65KS(XPҾBqk܇ <mLEgp$KTfFQHnOIe[e! ElUxY;QL<['n77w c>WjRN4j! ݵD9c=Κ1M!Қ7g9ɺI˅h*HIŔ d[E @+(]hFh+xQ@eEh{ j$։Mr vy,&ic-[Gk"uUL釹+֮EI+]_+?ټ4mxA$:Kh"Ώ$8 } r *1o̺=y^y &}Zσ@}nYnLs;A]`Y4410&r";9<ë>cyDsm}ET H U]7){n$ʗ0 t5k2AYS`dJ׼r3tn̿>$=sB]ʥ\3,'RU em6YwJ5l}\I $~myMPo2o(l(uJOFG dɗ1р1L,Nd2;(Xǐ32oC|\t;G-!KTXC<ٷ0g:uSo/eFe3~x},TnԁgTB+<s"( 1Buَ{9L$ -QC$*u(~ԷǗd1rT4Aov* @:DIt於!ٌ$f8W-œ$|03le.sF*RGöpjVASM]Pűk *ü&Sp:>SnEy|hQN4Wi[%m̡̳HyIav$Gko8J-~W=yMpSS-Fj:u&+[+,hGdky {f9Qx^T-*>59+iN8资q{f|*Ե&LDYH=®t!Ɣ9BU~ª{W=HxhgO\,v"aI`%.9Sq~0j'n,|'S`)"ZڨdhS RBF!xgƈ5] >9[ؔ/qQ\Y#&NX׈@ #\e)cXy)xb c lYz)TEHzy\wi>q L8I2`a` yuQ⭱f pڀ[6 p:S 2'$AծJk;ЅUTLBH D)Xl ٖ,M0;p )xe}kmԲ=K?TVŬvS'8Mp`j2䖒Jɱϵ]___yp_u EbeTɐY|+x}CE_v%8xuJ R86:N 4jerq;P_)iiJ!l7 RyNY3)pZj0b]La:99ӒD պI;X}\;F@X[ Ůpgv4|3}gs87lmLd~Z٪ (7G T4RV,гz%:C < \ױÓ^,wM IM(I .+قrJE-R(]]-\^-3q4 I7N436cV ?+{ ש%W T$<@bVt4Uրevsr;AQZ%W1[4.ܾjBٹS~yZ!]+Uۅ#W2өeqJPD̫ߘ; N\3KeQNtGiBi?E-sն@Mɶ2gv^!HmQfWd.-(Q._Tɭe[>rR-oG*#wnT4SjQ#j4龢62 -WGk.7gEri=[ɐU>X5,le 6?r8T y%h}@(بf5N{JƢqU"زm1_qKQ}G¨`Ҋ?4I?Moْ{&45*[[߷2aeBtgfuL[j(kQ[Dy0eܺ\.^l|=(HAt׊# QJb5gV8Qȼ'L/gw#]| &" B66Ⱥ "ٟt@ǘǍs$"@?'e[VG.n+j[vNTaV2e\;Ž떏L"v(LA0 4ɻ1ӵEt&['+#9y )]Y|B= ]"O9ֳcµjqqZ9TVUGZ@G ZuB(RQdG1nl:l=kNK~*i%{Vw kI @$*1&aGiqJ.nDߺ#Lsɱv>[oQȝ՝m½&6 " %h ekH =6"yLއ|D E19Q@rٟk+{Bg+b OATQ3 $BjLkUSXWC,li N}!0\duzSi4`&pTw@Q (2Q8h;>`aވ'?AʶN*>hh)LN~)Do^W`BA4|H0819SֻuAMik1{hp7ΥQDrR+'FO9SSMqQI딞T:'pO(5UPPFUKBAot) LwG$$Uu %W1mxԅ#P<2vP7.wQO0Sf3 FT#$(G*eV*PC1 rdRbR{(|σґRο@>.4Ḑ412Rp9 \0x׫0 hhic4P' ]$pEy_E2HqlBv`@ŋ /@^ KҤ+,e>8`&t7.Y6`MRHÇI$@҄>_h+ "b-ΈZUI+e}f u(rts ;b>MGk} |sGߔ`@Py؄AV?¨]fxo%v+=) -cƪl i1Z_nV a,IEĔ Ȣ~w)' rhRpoL0nu.0֚  wK-Ws`=1(,p|o3.`wf "&u '4b@cblV W [fT\O5*1.Ole6Ɂ*_O֠IH.}i|xhv8%h.~kfCPQy+O0uF.tacri- L5ݦ"vHk`Q~?|KЊBڐv]vyl`wȫMVaH ឰV1/AGZNa` ƅ "oFK~㢐kMwhJشUlK:{Sy5juuauE'e9ڽ7S­­Gx*8)nVyh[I@9 A!a8׿p+ n"r6_l}h-P*o!aϞMvژ4]vdh kݶG,#NdIO?dDpJ?s".DrEFSިAjO:R   O&6LERŞ;6w'mjtH^+rk,1c̺P#P}jwR-(IMdr¯aT}cR4@]e7ϔOY}Gf,U>/=qўSo%E3Ӈwn:44@-iw\ޢ@A=v(CKk^C{(FFkwmIr.TWn?>2?q_7=hрPPg "ġF6{:2:)z~G-G9W6Ͼ}[T.PZuqD/aZ27OXd*8|dx[k!:mپja[Iax{5G2T5(6y)`; m%A ^4o5&C^~_K'`Br72٬^T5m6Zͳ"·H' C AE -` b[ba^}T}5JFj7<JiXVreNE= U#V̓<4̧Q )3Elcg TII`^UcɐAޛpFױ6#y ڌAx#OH (.PAq>18c\#0Qrl3 m `aAqe3fj ,5pg#^m:`O-Cvzݰy]pMbثfuHN7$[##]W/2ϼn}s;49bh2nϗ#yi e6oLhMV9fv_G^C\:u(RʢK!jihDätG` ҭ8_I~3fS4-<3K9v-.wÔ_PQmӚ%֘m-@:,C:8@(bYc{u'*UBVcIgɡcTI{C&K)ݳ6aTd#lU+-;3h ߡY[jgf@v^p{E"  n}M:ٓd$C[%[CGv' 4DOm1 'LҨ2J`5~95GhyXšVlkܥWOU uۏ[WN{Ixeq+`M "|}0KY 1>cR"_-VD"=^3"ĿQ'3_҂l{L)-&R6Efֺ3z`4Uȝ0CsΆycH"LBsC{ƴUQFsةK(Av1S7KOMh`zXeƏA"Y+?'QH} FyZ9d[ZKJ*hse3)s'fst Ovq;ƪwcP8ErYQ f0Ze"_7 i`N2 kgǻ6`!@rѩ9?= ?InO^0?{yג~rM^73Ahg|d^  6pqeEqTRnSϧZbGcx5 M:o_Hb iK1jxjHhV!Ūr'S )\B)c_ƮV0Üu$rx=oAj+-y2j"0. ?A*"lC~t#7XJs'! X<srXorR[4ym8H7\t JLo1.> 66\އ5]}|yCӃZ5Uא큷Kx.G f}-ۏyW;{PUJ`QBB9sMn/eST袯*5!^eښ6 p"Cuq@9-An ~8gzqyY&y̢hי  ({ A޳e|6* 32aZr?J$ 1^aN+74^$8dh#9 5=LoFgIM>o}k;6f+if:ϯϠYUXtQf2"64-za4)";TaIn8u.DH6Rk? _,۫|'.R@9QnyQXɮ4NXKv&WNg(r5Q:NRP]o*fxW$1] (DN:_)]CArڋOGM.i1#aätGʘ ?~¹X:?+ T`M6A3m8D8 {rYF633a MB. b䵧%<6ɜH9j^:e!$/^BCM6jjI n)}*Z$L1,`!MyF˞-tϬo2"q&#'@;u97EؔahkDH&OxLƩ8N}NYr0hSҵaር WWO6V4#GY 9BޚsvcJe/:9u vł3⻦١E$h7_ g]g2TsA <ƂP`*zB ̺mt i[cknp7UpLb˘{_SDBAFrZ'0xXD^H#OYV$,_7LTR˜ȟ-~E3II/9!äYtFWkk&{II:9)E8B?LB-Yz. G5#(䱼GQ-1%0!$Hےx' :GuCa;;j؃D4=$J@7ќSHj"ڗwT2cS5`"9hyeHj n^ .Y*ѾE?=?)bL]+Fg SY_Zӟ^NV8'G3ʍ"o5aHJ\>Az\s?a՟\!j8&b@+M6z.k%D9ĐSStoh 4@C!bLz( Q,ѕv qK a'}y b"GÛ\/ڷ+$Di̒eQnx ?-ZFSygZAQ*x{V @Dwߪw菌fxy7WI;bnʭ"6#*!j)azPj3:.u}J1hF@-ڃY51w Yoi_ym q5<>gk~i}N3q64U$>X0?ey~6|U^հ2- cEeIh% bKI٭hp Hx_{0Pɣؾy_9"X*熁jm'dVeR VR I D>.1+ds,_6MqăUeĶS䓯*]7%TZT3!!6Є?b5\(rRr g.{/ nbJOZP$|xp iTiQC3OBG?i썑 krfa"th9Qǘһ멪]WCW(tGR猨Nb0WoKJ9+ѻL \i.+BzMk$vKw"%^6Jxޭ dógMf CSc,-4W#xLV{q ℉( %,H\N+x~L 36*U I R{vXs8d=z+ Eq%-d JM]glփ9jaP _2֣w8f wW!KDJ cmr 8sdSYlr ]!}@pr"buܽ~KHRBY.rPVKa9- laUv\G'5{-|PsH).XJe=P-^Rm}xF0k)tUouK`[Qd믈[ cCj(q`N{c9M5su[,A^uo1 VsR*։ V=\c/vxD=u!)U>{ap*%FNoqN~Sc3g6&h(̰'E|Pr0s(GUwiFwI^t-me uww[{^0K>}7ic/< QD 9GzX `7BDKl0h_@VΕ01>,Yʤn~_:A+=<uAő_`Na85 gk= 2Y;?F'$pF̖E4ƶ^*n80KCU]1w?WËkyZ;[BB,ݍ*MS [ge\z2'uՂ"3޲"9=/UVpC L}h$`EN'OEgpC];I!l:mH_%'~ mr~&B 5:Ǩ>Z(%D>Їs .?"^ִߛ@/A3Ӫ_] F- %unúy `G㌍ڦn"@S'6l'[YRMOszIuPfp vJ6,Uo_ =S@EZ׭an+iR)·A"`V 8"II/>޲%&=.)82ĚOrEz3ps߱o~ .9D.se4?91Psv*wsȹ + zʗ!,u `=S5HJARh\x'g;Oĵ~I⒏dͤXN7ɥ3 `1&~TP37EnA.-B$@. N)9{d{;20A\?8ED~uU[ NyW ,}^^PiF ?e{RR K8L{VYGp`芘;Fwˣ3gsX̾!k賦()!mWrDg^?}v`V*ML0#kޯu( "OX<%EkX9OYhD^A8Bt]~>[&&Kn;[$ K'#S*Z֘_m8.%X'GNTՍGv#$ ;1|Us TShh.MU'eA {?^,t+p6obzdJAT;"T$;_6lw$xCL޵N/9\(SzOl}*_aj71aNd5x7nt>I5|kyU#^`Yw4'>יCX7ka!^hoe` "c>1t4+␉Z,+XGǀ,ɝ >w7[kLZnP^'wѢ@2: i˅WG<G1 4.U|8(ǰxy+Z\@8s%zd#FUNY9CfxeͲtpCgVCѯoИ"[ dHA4 &dat |) Eyp5}}bUD8ѕrH54+DŽ;K`즞_VCP8ZPaXҒU} Q*8̨00T6孠d9,i>GK2Af#4tLNv%TFU IْJ]Ed46{{/XS!dN }~G۸x:dR`VzBX!ӡAL nr #6%HOEF>S/l_V?FU򮊠 ɸ%J?/ұKX G̔M-$|<")[9/Mv~Ա{Jѧf䙹4 &:fʜF*#i+`A7RXXbH :&D]ǃodBG `7ʟ-[۬3W^_:ex9!_D^QS5,'~X dV8*pe h gט+4^9Q.|֜ƬRIѥoO1W- umXE13vwI<('\er-cZgSeI9Ŏ5I{Ovy|

\7x}[$NMwB`yh+lՎ)HKy[Y v40ϙcrOTspxw`mrﲎOJ;d="5[¡)I 88mՌ8:D7xP36͠˜nKI= } rc@-?k?ӡyܶLC{ 0WB[&U9r]{"T߅H/wz8ADWK^(ZVC}p70#IUC\Xr ThȄTkRyF.>]mit '6sT:4|/,%n2z8qe=Ч3IbIfWgu֓{*,!юӈXh_Zo4Ѳ qoA"SfiXism씉(aX}YMKxV :i @gbd" B ZcyB "yWSjm[+ o_ף,"6vzbEW ??P=h =E{w1榒WӘ4>x/jkB"+DAg0`a9eR;~&fGVn)*?Qy>ԛMqFZuC!X7NM^.`K0C*?=ѐ|}g)w8ƃ.ѹ !ySd!gitUm< 2qֳ8ļbx/`\9m?uV=aLY7.q|c5G3GWǑ.ffPt[oD F *h?p]ſVJ>ʏy&iTaƫ?t3rzoW. zB"ĸ*9h$-ƍZ~,9MՙD>A4QY&7 .EO\ThR]FdwS؞‚o-6Uhz4zdnDKmo|)@m]e h,]k 5}үz.WP"tB5sH2ǩv-:sYԍ/PF-$x+p/Oc`o;e8')]]v'Աaї<3K~ j޳Z?(#`}G,h4ӁJPKhUJ8W<])XTM'f0U6k@Et-;Aɒ3ˋ&Oev@9]sk%$*3MĴcا}{\И:$f5rsAw>Z߆|&.Ʉ0EM Ą!݇8o7>!6B`؛J/aNRHLXoGPGq@̫wAUPۘ_fƻ4vHkݷ13>o+02@k1]9jBGUkCt 'y@2}hTȶڌ ?7H=mK\L֎znkp%-: <,םFS SXRh (98P{U:~6H /d?%-Ǎu.l(OsL`-r?O}.+ĩ\kk kP72`|?2IxWdQ(٪ $]{ͪt24dr`Rg#leR %?*`<ע#˗(+U $,1@1DҬț̦MWseaGn\w,ڇ<ōo'6:Aea{%cs_=T(#ia m bs./ S̀[!҆RTW||PUCtV8 C:Mɠ~F*/CP8$W0E?DH~as+p|n  97KJ|r庁g]1 @c'd dXـD6cw{(vž0m] {cΠQNI^8=")@T_khH6˝VxJJi܊Ooi 9So1˙<4scҹJSM7@@L<J#Qg]9gX| %(mMO;$U1 4)WIKgF%sVt76vhEp ع7ܼngTωD0w%2HMP,fkh`&Q_֮x8üsnp-%w W~Y#ql\P+jzF189$q;P)i67A˝bM^N7>Z\ ֗ ||LH%"? 9}-+"mpHBꇪ`H}t)Ӣ 0$K8;@a٥yzcXO%#2ՍNq.`.=ٵģضL48 P]N=͜ xB\9 _8̔14Ȫ̒BRU"gMU$2lLi0yX2r87=ݑSx?\ˆ՟,yTw ?|q~CLm6r$)X ge1Px QU'L/u" g%jY%!&R:^]6>|ǎƐ}4fz*6Z]lW𕽷ks6h.@Y2(nb\{B-]&!ȡo0#|WZ-G,H]v8x~kYl& M2k31ы}~!а.}4tiZcZʿC)':?b6yDVZ9#TqboŨw}xlnN^+Cnѽx MI|;"̭4&K?@$Pv7f:+2+:[g{&uR7G 6͖D޹;\=+C%x#gxoX 0γF6P:[u'l9 FG6quObp%JFjey cMWV)@$kh2[dˠ@U37oL}] @ylT{\5J-L!t2Pd~c!2-ґZP@ ם4_3eD#9 6W_?A]b l}˜\hf!#t4PDgC'g?ۯ`^>d}DTqʹ~ /iwkn4Hx&LV_52k@NI0붮L5WCarj$MӰ- sXC:Fv7_3XzJ8ΔȤC)qmLt#h$5t ڑӜS,R==݊n*yxxڳ:_T \SRԗڢT7 _ F!' u$^ni;6vb7zA%h/džH/>Td1ٻX׀ogg zcSh fh*4bHXKlpWW?R]P :؊8vI2BCvaqrkzA8.!!EXk<+&ofa5(֛7*KM]a (7 D`?%lH=DL:v3kM4HkB $A\܃Wū!bsOSj!T+%oC}eGw@%fÜ[AZyn(ZrE9,VThxSH4nAUc$Z=m* buMdz>ai@%.t`$}[Ͳq틋8<3تZ7)wHi)79͡|)n-NzP_i@+ݚ8 8!#29!ePb3+$SuUu0OTID! n2ͯh FXqtK,K^TC(#!e>sQ8_[kL538 Zzw6՚%?c#,#2DK[%}_4 JYI-.˖Ȩ1ڻzڞx蜤D /jz,=tW(']uD';0'1EAudjUUc,ݐׅ|JT 2hڎ>j}@d<"‘n%tEifx>[).܊;۷߈WRs~gkbnV;&/VqcH !CpeNB]t܅J~+Z|hە㼠/\ۍJl:RVS!1QGy̹ hz(Q\OaFZ"ڬlmfU7q D[_⾨G&CԦ L#a!*(gK Rίy7-M'c447(wjd r7e&i73H%%%Jmڑ9#Yr-> E^0?L0q*"~| Ӑ?+,AC/4:6UEi%q>4TEu| ̩k[)+8Jv-ɨjE_tʕ`=* 30Ę|oi~:{c.PJڐ2d k*{.ʓ塅צ#Q]e߱֙Hlh"z/f+ڎIFgckWLf"Tyj%ώ1Ip%yg4S IA߳i1. [C%.MƷlLd=U47`Յ*3\v`t;eV&k؁@E)ߑzܱ FsAfn8H&̠ZMlю8Mdie,q|L܅,)Qt7wd1NP &xI9ntRp/;q-5gDt0"ko+1TIFb,ֿ֩1HAU:a_Q~|ieˋ_7 p̀ ygSSm6j ޲A S##j5T[ :5:пH [B"Zh}wż[$%}TbG灡}XތYZ4g9u 2z }1c:CقHEuSSm ЋE}(cgqYP#x*L8$fźRSHzǗN2Qwk,8lGgTa%OFn;3,E8K"H-X! ZSBZ2q>0p4XѱLd3csoJbR/f?L/ 9khFPXR`[ӘϦ}&M2nyQBs6諵'{K`2f96Ÿ V΋.'Fcxz vpgCTH|>bkc=P&z*A-z5JtW8):|r:)%3UiW؀cjd\I2q1jWʌwݞ6OhRw{<7XXMGz!G uFCek|x{C\1ڞtaB;Lۮ?l{TG:9JgPfB&[7af\ƠE7W,&CMǍoᐪS(%'KN?HGnX&Rݗ1<: R1WL ]fVbBEpqqa)ޣH _* 9lw3-AGVK H:`Hk⿤RA5oqM ۬<ߟr xӢpN 1 KN5)[o.҄"z4|f)3LCeuH/vST+Nxĉ= uPF1eXKSId̪c/-Xl "ԒBeAtQ:3r׵p`fJ.в6`77C5+ ,wdƌ0պ+$jl};c+6һx8MXe\{mA"[{?R 'v!ij֒̇]̂=`l7+/^"ͷNb Gv}*_aǘ7ipxX;1IUԻTX'+"@JG"+ Pqng.VIXe0jW;T}b9)xz&ڌzp8 [R2Y0~g %Y|IF'gKpmHPH7!muz~l{mq}O`C\"AqnB]ĩ ȥMq9bULsQAߗuWէ42R?8޼%+;ۃ;puMAz##VsXapѤ1!ClSI|VzNJ񴃳wUe㎧ x]58:xL׷u sEO;Q]bqg3Yn^;Dힻ*YRx*V@pBDuay40-i>,!U9$ O=sG\De_a`t߄LTvfrG+*Ј|W.VHAǬl+R$ޝHnVZwf"]ۅ)(.,'iڒtMdg,/t{Nlrj!OkH(0t~ ۖfQEϾŢg(!N=): ]Vsܠ}*Z-KhU'`jA%P׈CjnoZ틆qg@[<_.NݴX]oxi:ڧ/J4@]K ㍑Ⱦ{Jd߼~5sTJņ~.>HU4pќԣ;?̈)Bb_'/x=x7|΂wf(F;gGy,ls*V:'H;A}3si[AK VΚ s&_5 aM'ݩ]I]/CNKmsPL ?"&p[F8. &]w^7>E-ŜCm@*w B4ߐ'Vl'%=j+7e9jqsnq~Ɔ#*M{} JC{5_]*K|/( yOP%'ZE-ǢY_fc|Zu]1Rpe Jxª)KjU1x.R.1]MҐ)|c}q\lBfnΆch7x</梨%uлnJW*LmS'NnJ®4@oU+ Edϝ@Ul6(+Ɗow*XYi_v(%c؍RtTSө#Tp@(#*bg܅I4%cn6\=r2gk_cLt?jpx]6sN@*02u|diRZ8ҪJ ZMdF^Aze c>qŧX a9 2v0)(ح 3m<@P4E`jrHW}%}Uoo~U}'70H/(_ hM9ia׽覎r(z ǣX8\Yg#D}:īʹxclv!F$e%`;^u+M;?PVn2E V#J+h.yN.*(VY4 2227kW,XIk)|-egvJd &_0.B[-.!d |mvB;8"hp G[ϑ5ـj_WFd|VD ߤyU.bA~Ns*[ &Jh '&$L@ѵDtl@Jvgi / Ky目!ɭ- 45C#BT@`5'"#mAEK+ǣ2yxɷ~^aHhRUդRao-PQB'4}ڍ6e-tBv0'Z;BLC8{ϫfj)@ 7ū8B['_`gلWpxu[.;2~Iا_!ս󦳪!t,l,[LbΩ.dN+(xe<'&eY W7Q n{liwj7כ4銱/3Hn3;qlt]:⦵J`7ۖPr".j8@,M^?HN{ssFЧ{c3__ԭ8+,LN, /ZAul6a E'-t L%NǫIɤ5F,ZmŷtX1N^xQBN ЂN3bԴ(鋅+,HuZYA1F lskLuѧkД%YJqimi !fqtݛ$`-_g yXN![B%Jl9hf2Gɕñ(\ӗ֊#S.u;E7%цh4,|@e;|i#PCRv &a>R}Ҏ,aI+| )]a};O3BI1V^Y"8l 'h'_q`サY 7˵!q U_q<fSH5ka|ǣ`_vњh5y=TSe|,f99Z^ ٣K|W~Q6{Eb~ȒpBo(txvtM3Z&Ѿ5}x1hZpߜ) K&1W>TEK.KT&ț?{2gd"2uXy 3 Yzs\EѹFOE MJZ IFDx$S3|8w80Z#?m)cG6Qz?.R[#i%Sew4-(HqT3r X>nŬS/ M1:nCB[91o' x-ŗ|J]dYiEmԟys݌Qp_\OO1ٍtW4|DxȌpxź rònpR+莦;Y$m(=!b$] >dLnsaDy77Kxbv6}X_b7htJ)V*M W!w>D^<60s/֠q#{̐ѽ?gjZU\؝T S + <@V3ГlብYI61#ÃЏGΥ~@!V zv~rގ y佘`福0:3Du7™JUe?j*}D3Cڠv+]G֡ˢFVcCD]7=.Ų6 WWF}3Aye]XxKӹUyйLp Y%UT]c.8-|R=>cXMM:3OI`͝R/!Fo$w,MF- CI]Q% a0J7`Hì Š-'ǹ[-M )8v\۬5m72A.WO86Ătɝp8PyzM2f5ާU.2Ƀ,fդ:KgTlлT`;$`xHaUXlŠ"Qn}s3jdLsC e6t-@*eu_Py!OYhCT@[zd TV)܏ <.<\7 l`QꕻI, (ؾ6/\ m˫K4U"tSnT4 ~aD3UDUбAdWN7y%;dU=0*iɘ2 y+ ~> 9i9hn&׆E`K~4;y58AQoe^$I((炴Q YrzNW N7C =A>b` N)6kc5`L1$8Uzgi̛5O:&$>u֝߼CJ]l^ܬH4/rȡGu_HGk.iU"LwI" NEɠVߐ)ɯͪ:%P4$+9ٻ~H]aA27mepc [$L/`ۍ&bbN*1Bao}vNr~|q|?Paa׃Wn5^f_xFw72|(K]J.ZOZvA*OW\Iy^u٪_kD#1ث+ ) 2eŪu0Y{9%%OU ;yd`DG[gPZS~' JNّ+f?묗؊ 3JEJ败)u|M`}xǎm)B.$/WZ1>%o eoUt5m= ="Ś./7Ƴ3Rr~ZWlAK1Œr@ĥ م+T^ܰ؏VcJ~IqMRT~.[Čf;]_eKݏ;_ !3e.muNe[4Y#Y@D*jyYx!AsC0aS^+BEknxT4+x!:/ۊVyvƦ[V4g\t#r>L93OK7l_u/PRW><>JϺ/ˡ{U̔Pk٦Oku—e.]/iƂ s)h;F?Ms G[UsFa\Rb[0b"@7ATz.jtV1t{< ^IFmuu$<Əv96MZ!:&v- [䎉Hr9b7܁^`"bS£#h_#SAZ^8Hf%5amٷZ#:jTW+[ֽ^éB} 2H~\\$qlgjQ >Ny"5hZ1.n'Gu#ys֋5S^9h e ]iJ3p]f1_. I71\^'kD,'ɆԶ0W$Io$=^܆۹j4O.b*2&\CۑzؕYWg*'x;dLJ|^nyyDB\dCcIFrhKX︎Du#Sln^$AT svj[[el/{v̳v* ̵:ZIboh$L'<~:Dx 3@Dj gYQY8z- }rbYP,ЏMcOFmS6l͉MtE&DrD/)/?1q*=cߥrl\&8F*$!dd|Xz(bt!\ VEm?ǘ/|iQ@cb!p֮2a/0T?Tq|Iq)/jZ]'{=yGPg2mdaƉ?Q uέEVhC{C%d$#P8q 'op7ٶ Ep ;&W<'^FRMiUS ZyB^T?O+j<܏`!x$ 4"c }K7: ~Z̀|*I^`Mh;vډ_p8&ɮz׾Ot70AQ1iXw KŪzH^&H%}pija>٦^WT2 Tֲpb^Qn$hW!AeM|Ҕ`p|e$GWyy{YYG=<01AB>'q~򓣡589ĸ+PR$f/W.sNѮQcG\;ΣnwM02dyW?mnZ:8rK~i((H|'r^Mу. cuɑK.fj45h^md>ks4rઌ/;F  {1 l(ǫu0W?Ob[uH6GcbCy,j=vNs]bVϮRP1;^/*ȼm $y?3q; vA]Y%-864~YU$ ΢9iܿ0] ? l̷ Gsb"SB7iEWzrM{첯;i n YPAWGF5,(MSLaɥҎds <_1#9fӑr5ŻkAaܠrKmN.gד { A\qv PDn'ȗ}~3QyJ5`1 .K:ίS_W]O})` u2ݦ,T,ʼ4B@ 6=jK:F)R[1:0Z/ 5c@Akwq[x77{|pR>?/:nD#IFUtI0`9!.QXp5yh6L:R,ܟFv`E=K0AF}#!RIN Yr;d"v;YٟXgJCdEfLmh1^€,h G9['C=UҗK0,e`inB⦥@ pX*,&*`b o?3asOCꌮG(c"XCQ \ݸ#4|&EX/ >x/nreIR+^S]|?ʚXPºdÍ8=b)Cxm "%BV!rJ0w9IH!} 5}km ˬjYSѬLZ|X#Eb%Жc_=ZWtKJNE+* &V(SsKU1jk8#(6muQ$,b/]*jAD>lC*{C-&ٻi~7yr5(5Z"uyXȑf7Wv:G mU)>N V.5#€?^IޢHSyo#l2EyNg{ 721:Woa;Er}WQ}S0aXq]Ӿ0g!{/|˽1c:{ۢRŴ%{EɰJN-CBQ URIm%pdA%v? ]v0܂ZX\Cqz'e(n\\q>BNP3%ŧCh̅'J(>>"equ[â 紦[ihtHV!@"(Ph"n":I3Rk ̗tS骡'T92<_KKdN+;FZ xݥ B [uFmS|0G[nWSpd'Gtv!s.5Bŏ{-ID[I x"UCRńDvuk#)P yfF v[pCfo ᝾jE f^:'$i@%bNE+,TQkϐGm7LOWTc~ڄDQvz;+2kIKVEˢ`+D'ՊPZ}k^ՔSqza7#~ 霽:YjR}.l̡\$&0DJ1-R%r8-**Ң*f bǢc-`]fzo_BOXTt~ 4x(D ZDfL{ d<F-mDpu`8;_jʞ)Yza٠uH`\E  4XAvN}'N}^T±6֕c w:RI+4&>0ʭho$(ʈsۥFVpxl_-P_g&U?-bFtD4 AĩlQ 3p eLCl<Rd;XI j]dZE2# 6KF| Ť"ucME$m9h}5'J$Kgբ\;/S0nA޴{c6!mov|,qH)pmxwEY塳GnQh g0v%K+5~QuLNvۆ&vh¬ni(mOt HjW$nbKb[F1-_O%-d,Epd2B6|Kl0)& l1F:g)e3[ h@\uӍvU'?=J;(*~rlW\d D8Ȃ#ql>H8UMd[lʷ'u\wl{ t=~%Y&l1<-mhDir`.W W%m5OAQP~Y7ҮnFFټj|;(>URa*߾K#WXDx/G Q_j=\m D9<õޅfs:uԯI me['t(OeBeJ&X10x`8 V$*X=U^{5~ޅVXo)o_o?]ܬL2D/$K;B GLZ?=lټ*BP! IV:RZhn KlNmh*y2(0.[E&KbxMAQI HP`[@YDWLE6ڪ7Ĉeya]IJm`Sx0mxeP!6C"Y4A[Y dJJiUP@vIY }LCd~jY:jL+Eq'r|"kTCP}a8IJ 7`%{Iۊ p/3X|o+][+Nxh,sz f A~"jRIcL•;?I) XdbQ3Wq%f.TsDPM .V35}_k0wƧ<l3pS8{#X/x6Ƕ utF!,F,qV0ճrofnYT 8MOM !<,e_vHqCPVĄJlޝOiayς4xyzaM!u GpABy:IE*͒U}3ao7ݏ =)`YfIYi~rkչ^p*[͊%V]'Re]퇱Z r @t_0Lc&DND\9BxsSsΗ+sSL+H|'vMyE9AFZu(qmJI¯ay+MVն+P;s}#Z-b>dcTC UhyjoyJ=һgVwjW|8m@={7thZ"BЈw"fHg="dp1A$LoA!_? +dq+4:ͼT&xXk Xa©>/1$vkER-t48,4fK|[qT}u @["pN4jP-@f~[\s}|WK^ ?3a..N.INݒjAz!/Oa ,S& `k_CX|-/[Ec >N,\w^wb h0eGtMdaVkqk&t6E2}8M nȳ)COb9-!W9>Riڇޚ:rbL}E$Er`$mI^ n^5$6d' 1{ g$ǚW~JMYTaq ƨzb=d0꥕) פa/~Vm~605>2p AO]' @QU ]+턕1x^b_ <ަC hkxΦ82O pO X/w'*w2:fF7o@UmKw[ZPNHƨA)f tBgG>Mn]"*.EDqΟvJgw6Հ'1 J4B'UD1mp'M! h˱bwd k"QU7.;y\fD/W21y,CNUւk/hm^ A찕ҢDbH;}j%5^!j ܬU݁ukz}hʱG㨧)xcZj qXp|ޒ*aW]"e?ֶ_aq1 duҲjaX:7`[] RV[`{w|8u9̼s;@ xa7bQpP(8/[#ecnZҲ3JRfկs{Ty)6`V{i/vg9@f_"]5zt/VF#yM&k`|Ӯ|ףg8{2llES󱐹{y$Ta ƈN*8׭~?"8/G< N.y#3,… ._  aH ƃOau.jDuFat$)5e^ ^=ʈQQ[c0v;qC / .; (?1v 2UYQ5n|g.SIZ`GۆhዷN(?ĉ[4Qs#ί9>C-{zcrP8ã`0}@Ю>`9ԯ'b0U!\YB36ug*6eRK)6Rguv(sVxi AЭΕfb4[J ηXg*I˔)4A a4:bi=2@5*vd 8i56CuacTLHc\c. UI -Lﺄ\َ]7* *DZN~SK"l(CSbFSXr 'MxtB8t/xgBZwL2ȡΟ\3 ~K\* jvXu!Zy͟Q$oVs?6ubIQ:E%FT+&$PsNN}f2Mߧ]n*2ղz 7mCn,m mYgwم塡mpXC fݏkNR!zt/s{.Э(kT6"Kr*# S 5h j3cS4^Z>D8*g\Xci _.sT<F ;tkcb{&(ShlgVf_@k@.Ҥ^.Np%`ʗ]*!ᦾ6X) |.@n <ڽچ!hŻ"|.mn|gz0js9XߵncQ\tfS˧zgOvt۪V ~USI4sڋ Eڬ&YDKn}0!ͯ3/3l(uƖxɸ(2ҍ4Vh 8[j1B>~'H hzxL1w<JYO?1맽SYWS~D;#]G2dQLg]}YSKDZFtn7bhF*?W% k"qH7rX4@Ibk2֫4ܩDpc4hw瓷U@擦e% "<8$v-?'ݩ &7!L%qU6.OuYUq$FKyفՄ-m^TkE+q \FUlոFJ@J-㬒C(Ǣ6lrWąSڭ yWc-ARsǐq4UulTD-vV༟^$@YyP#W~ڨV?bcս}IAZsYz4_D?wH)s!5W7"s^{*i4{Hqo70~yfsǁrچr^7l]*v㋐nc6DO[}G6R׎/tC37@Չ8Wu_"L1|zW}.xP`iw8ERIDc+րk?z}&CZ4l+5UUdƹ;%QKd)<3sd35K8RW?Uh{?v z)~W/}<1}7~N?o?)LZF[>!h最yxW5cB6ɈW OsZL$/nՠcg}KY36蟫֖P`5+9qR&$ŕ*hꖈg\wH(E(>#3dO'wFf˙eƵ˒̢~uOxjD'CyK?6¶5,Lߚ-?@s$ŊguyC1I0AM7d,bf~ \3h0wf|NmѥZyZ.B0R>';|'f@]ZI2P,0Krʮbm8|(!/@\ViS )'^g}ƌ]xYQ,&fELҔAۢTJN -s7O',y;*9է#3fCϜA4}搎޵?9񂮪w^_pcTDžY]!H,ZggawMb\YjϖH=!#4- -!ˍYi&K Iӊ"u%<ˋLp\ЪL7] sV9DiDoDƹtKtqИAc 4!wA :.s9 :d,d*j]+Ͱ)wdS]u݀'̪ LY4^}e4GtRXoѹ'Ctp3uiثkEӊ?em`MPn -8Iɾr.ÜySjŇeȭ^LW$דRv-X.W@Eq׶TK]2DVm)=gA*LiOlk"n1z0[ &d5} lcU@f<; vStDDO5 h3^n6ySv%ӿEY?Ss}L_"T|-~ڰ[c2sOZs~Q->Ǐ 8CFi`'b8bnU[s6љ!U_i$k&@r)=ȥߊa@ bO97F.ޯm3 dk_:V Y2D:! bcޣ k}IVY(4cqi+=i(ic/$*mZj-kPcC*6_ :y{gHh6gH]o-2?gT}lY" ;q>ۮ MqWJP7 Q!EzM<[ qo̍i{G6 3*DQ f"BϝbHJ 1v2?wxؓu rGt:0+*X3Z& ^iYׯ{BkgP#$ISCin:߰e_!c48փy/C>u.>-Ȃz ,6HvcjUН +?4w>iQ`Է}Yh\ G(0 kmΜa{z4tuRe [+/(bCTHxߢ Fzc_;.# s:Z6+JfTHY3@bz䯚t&~2m\HU=_""͂n`0 "PĻbƭ$}dsrul0e۪+8ˆ|6NO$h܋sHzQOXMte/Z+&CO,*011=LwR_uy}XB!!nj8m>_Eu:K4gpb4 cX@P#)r#'*#sX+ s02O 8>*HW'oZVJc>w=__L˪\2 [DC N9C[ +' v~nu1U92'{}]=VȨ0OLLۋg  d2"ű {#W`w2Y*~ ~9$uk3"ԝ;({;K$Gs@6i/r:բO =mB7{=P$ !4*Ss:0?Fl5q{O×rRv(vYLR[v$ɹ|"vkXNJ]M@#Ӆq׸ip!wRӮmS2}١8֋٧ ?_sG&P c1T!%5~CD)>J 8I%d4&g_E Ջ ?P)z^J*ր?4ԄS:IZE}t;Meuz'&Mȣ'Jw{Zʋ &OC8'x,鞸i?qtQʩX"G+xw"bTKEyl4B<rqKJ-y'tD(je-:6eև[[02<cjq~kpKYԱ4U^͟[ezEt~4w0;eY۔ gQLB:{82i<̊uѰj0j@9bw¶uvjV2@(S/JWvbj&Џót$dWG lO~8֩Nꉽ,V *374vY²pUۈ)O^짵Pgog >"P}:Oo-^r@ã`9+؋ܫ0YTSK4[vMpvn 1=5bs:@uRUdQi7@0o{ [20:L ;Tn:!v:ҧXfMo]v Cw۟'h4ߵ, ,)0o"Aks!?@MC = U"p ՎhH5b|pra1?ķ].olg<8xHݪV %3{6բ(ՐBT9W4ő *'W# ZqH"ܵ=qjqޞzk6`hϽ|ݰZw`"c (][v1=>H+ P4N8d\C1QsؑڏzoYe~]{Пp)GÑq$@B\iq5uj/n {e4@ժJZrF;F\gO/u8[<4pbmq:do[Y&*cI稅iUǚCP{sOof0D;J2 fw]zVL3,2bDSJ cyt'JKP@n\Õk>A3j %b> p0wqA2e9U;3Z<='9uYH%-&d);8.er8%\7 sKIUWwƞu>W?/˄w!42aFk8 v1uBǶ 94v?qhw0ʡrX2JuPׄ۰oW8!W&]WgP#al)2B)'O, Ek܀5P$LfDSnBM`,K5[RG5ք#'M$c9i0pZM;w󉈿[?32 r-Q> u各e[$b7u@63 c+")uy u:Cr|6dQW߹.#Z=46,.mX-JygzIXfb,~=ƅS>&=RjsUp0.ЇTq=Ph@]) Z9JL%fP} r5geio ( 'NBKMk쬆(ۀCu`!rS"Rr?(1%A"v~yfq3+Q``qus/( H! ܡ/?fQ%JKKҿ]A3i!RɧD*0sX9t3MPo!VpXKU=՝ë}wv_<O+> شc;43ϋq"v|*\/\I J' g7V8v>I|㕵GO;-Tk!Ψrix5;tN4 D&iVŽ&^Ote,)xX{)q/Įi&>?g:f;;'_\h~h N3};^ ғ"vg 1Pe", 0^<I_ @URRW<SkYӆJmd@*b/޷ /UӠdhidH8bt6B|(xwq0T}g.*=}h+{sQ#n/SO7n+Y!5jU똵n4r&9Wg2p˓Q@mFXYP0z}$LNh"S[#|Υ&BG˳ G䓕^=Gz` 5턒-.lBJ T vWg2 Ǵvh؏hm4PøƔ tJ4pu.}~L"'C ;DЇhmj\\YdZ - W/פ?>{K7$}c=`0pikOd  p.)j9S%7\~Brj;颅pl!NvCn`&X i41~rP7/U,nzFl^TaP.Q^fzސ0WpZ'ҍgFZm{Nѷ--Ü( p~B췡hO|ܞn"Vg?xBQ# J<G5cbKd؋Ѽ@bD\4Z` =zl F7[H Dtq)A2uJ 2*b'qL U ~pE];~! 0W=n5A=0|w: $ 9kFwW dpJQ<#j֠Þ~?R7BPJI'{6]Z3L? l96ok@붍C9Ȧ-0Gh:Z;W@L Z`حԌFg!ԂYa`-i6AeB]<:LeE}rҪۡ>*q> ? Z=n $'LHrcټD# #U>M6 ɂoljԟ eSJ7i]k7gLE P ]!9ih˻S#clxۡS-kؽȏ$2%&]l={O52'&KuSwQ$JyԗWJl 覂4b5~Pt`"/.bZG4Q mXqvPk_̂eLղTe)_vN=v8|  V]1YxWg/}#vgc$ D@5(l;DܴfдɢfEw֭l7lXN4mY|K^ͷ\D𮊋 -FÕdž#u|_^@qV&L}?)stֆ}|fD6I\ 6LzHV<>=pjױzyͪuۋ|ࡹa&_ŒIAV am큓NroؒLCH8s8qҰW1iƾO^H@c-!ɴlEuL{+cg Kz٢!4md:3 @愈 4TߦUWЎxތ {]p)ABSl#+2Ǔo͐h2\)ag VuyT~$;,7PǓjZhu #V)wZg'_M((H[|/s;h \?N 'Ut{&W; flB]a%3矝mY{A?k\쟏d} qk\>9Znwk v '_9|FwU@n5=-V18{cE*Ymd40c<"W~.K9jo׭9ڣEre8Nvgަ& vIhPk5,ӃM#ouμ&1hiM ,Ui1l(k|C@  ܶ<%\=Ԧ9\uVKm_N.DQM<-Cl9l^`]iauӺp= SpbLy7=}讏g򣛱uCz="Ej6K  y ttsU54L22nT)?X?:`tu{F Sf.z1)X*6kv"+ۅWGFZ(2E4ڏ;|>r-#YW|ZՋ#e [Ӌ!%B@39' %6IOlvj|Q[P>s`oa'ɪ4Om@"OG7nzu_5t;0'bO_CZpM*Ȟ 3M2er7_7֚K )ΪD}-ݜXtRMfCyk|daa\ Y7l}U*:S`l(BkTÂ28FjK'+ :%_AbE W,hk)L>o9p G:KmFZWwobNZ۪ȾR?贔-_?6^dg?|wq9ݦ[*e'{t/=`ܨUΒ~UQU d 䢋E,sH_Ltp8S\;Aij^aq]6Q'7^<7T)!w "oԠ J:GS9Mkf :TAkS?1vQ Z~5T oT^.Ԡd*;(ijMlaQI3:T'Vjsw|g0yQ̪lsNAL ug _"f}|8t2bwO 1T(Fp۠%mO9:ƾf,[%Ih *Evq| E6*y"k3` =ʪ[}BOaly<]Lv 6_Aq4c|pҝT4(q]XdC@OOB_{#^2^_[! t 0@d8u}具"-Ɗه[V <ukhO^.b%^Jkڃ7$ömF;ĩZ q胆L` a葉amjΝ-B8޶Iu5^E{|-D&r)Ufr s3<6i%HN8@M]<>š{tͮezL%$2k:r+xƴW`J9LhJkQTuz~:TD?W>U BWXHg8B'=shAR?;AruV\`6|2B4_}\"WM}]SQVK[_ł[XMD!xj-60hX0Yԛ4 sa̫i0 ll*8Ɩ,hjGN[B72)^KG>zu+ۇ% tSxP5,ҹZY\Q– uUƤL$ ;ukLrIO h6t&;[h֑IOW,0&2ɟـqlV{fAm\L9{0d>w1נi>>8򜥛aمNpCJd4DqȠ 2V> xu:ʹ412W5Gɾy'`c]TϷ,BʌBцO+:&0bfMl̪ѮAEJ'~:N m ۏk!o(0:xxp,au{!F)L?1YH^gv] W:R@qy> +LH>%v:ݩwOG5nFe(ٮo0_1NVunR9#RΙʗ\Sf*o!N̋w鍤nxHͩzAttMa4vJyJAGdIeݘZV[Y*'_n 2  Fb \tK:mD'0{%4!h)͛ ۤĭmndF$ zk V[kRGeahi6i]6O'w=LRE=k`g!vZOb{R lr-(hKq1Z yk$km}\.M?i):/x? #[4~4gSdoe"-~ c &\6\3x("0Z?(֬+c3GMgs*1(mTdjl+UG/>=h':qds@?(,ͮk + ᘀ?-X acDׁ>h0M#^|J8%}s ie5}cއ:]\ߣ4vb-xqp>?}٬k72rHZʗ&S/B8-nnoW\NJy1"gl%gjUqi gNww$8I /󘄾@ m< :H d=aP{*>f0?D|ףWQ&)ex| o 8{F-ٝE:xN a(*S=ˆ?}ZQcSl# &DzpM2=A#X^Vz;Ch?gL9ŭկ]l)r7Cq^  ef#FP7k2t)JuHef}fY_ way@{0{ú5NOQU!Wjk0ݳ˗ZTzx^7Q5kp6%l?yK$hR%/Qhsw i])s q+2u(u&QKESeOyȻo9y-10֜x{$Eٞb|t|Ί +.t&i~-)pAdl4 ]~}X=½Ѡs퍼w4tt :@KN,04wG1pq ,g(Չs-vFhX8[&%VźN^^y;]V{9}c.geYkʯ#V|,/2gyjлBɫ|]%.+4c'hVƐ@MSP^Hg&KD7tW +SDSJ==c܍ `Fg1MbjSKM s!Fz&ݲ{ ;-DI:sҹvR=R$6\gY; cZ;}aow}^j |q/`چ ^yݠ TGE7~~|x0B8DZ8E Lp u+\6ϖp&e÷ J5^WM'Wbh) /Gw]I@,e@9 9Cls=`!"vx0A 覼#O 0UQxt~D>J/#x6X4tg,K>p'vuGsGpٰ :t `\y TO\Co{(h&շLƐ+JaaNyZ@dY ҭ(E@jTWOQLuRnץT_+{,+YFp8\ȯ0:d$5gm{ i+):|b9>̓sKqʝOS7$n 9n0CGjؔo QY|3ѾDFYueYJ,9P~"$22R_04{yi}j Ƃ^X(Jd&d2wx)b 0N#Ӭr&e@5%=EK+E9ZΏZp4jka@L}~Tk۴ ަ%#5܎eWӟ+> 66V9w?e P!Q,b#58v!>{Q||T_o SN>.Pk&5"q?Qoi-yP2{ޓY,jɮz\b a- 8ɔ+$tߖC#-1"ʃ%4ÝZ3/u(iIoc9OcU=fҿ^Hߝz/gto;F%bqzP D.|sӢ9 O+|󦻰ٜ$gK{8KPjq;|Ԇ^@cNC񘬖0im sMN3p7#0i;NWvB^ Kp,(.t)}=,7n8.M0O!=]7,Z)i7spA'+8{'^ ;6dD\ΖF@-1^'#560瘤Q^?K`Տ?W(c{4r*~;I$83Cvßa*D1G jG٥P8!9``ŝPzyR ?@2C̵I)x|-lH~hNB#ѥߤEwOnm lȝ ?%FgDh lCLL%DD[C(/ e+Kf*jw lMY^;<.*ʪj"0sC?Dxhʶ)VJ_ɾ>L^fd 9Y:70^ Bla_)Ygo tmQHn{$6q:]&, VPvL|dF+sV)WDEHf[7- V0/x悴(i4`7,QM6rnErI× ݍoI 7ոUrT%\];v!җF'1wosHc`L8S|>yu"ɩAMzaVk7id/<9D w݂ W#VS{sRӔ|M3iV|%RaJ%innTG Ay:n [% Z fVbZH9hkÍ|r բ {ald׆W_5 X.?,\79om0?LYǢ{E]42y&AYPRD|4E)=1߬Zr9]M<:S>"pWÂlƃa^L7t)D-O.`j)l"DN{D7qvv[=.1K!'D5&jC #v <+t\K/ G9N-:D x̄O䧏&J+8њ"P,>i _<+X>Q%4"h] p9yv2'ѳûNEtZfh>؄A`!4R5^JtkkQSI+L ކƋ*O5rٲؑG 娱*rqoKD*8[V 7 v9:v+[ŨH O|w]ǽZ'~h\F/4$麞|F֩%?8٤eƙUnj18HI]ͺ7WfZ-,@,tLvzE$Ȣ+ :{e ؟ОsqKt:zaJt%eӰ˱XvE/^eZ l>@ ݟ7x10I+כֿNP%4AuL /pX7p{ ' ,g&D򪶖[KÎIS:4Iu hP|aSa=vWe{]%p>k_EN&sb M$f뙫 PFn=|P1] E.T$!?7C󂉘e+lv0.HMfbiaܕ_?]ZL΂Qknʴ>nYHߌ0ٹ0Բ,/QÚt:IqUږ}} XT9bN e.@淾;uDŽ.. Ggb%uRȳtJ p|O,;+Py Lt{e<{s12[ɨx GG8oLkp .{Ov&yT`HYvUg"d1!;oJa:].uqK'ƛ*G󍃕1-W{ISp_M;Hȕ~3X,;`)Xo x&Űr:7c*:|LpݭI4Lܠ$cPdX(R՗)`DOsEƚ=4ۡW՞dT1a{\ ϊ&T[SbQ @=Z pVl\Vi<Ĭ~MD *I .ܕzJsʽu&[@7*U^-Ι655V 9tN칌6=BbDŽYrfiBg q*%#s ~оyeIf{c-tOR憾o!l-fFQ:$i6e-W/ 2s6s,y5U#x Y]4{vb7imH7`bGS頦C?+RZl!PL~ h\GƐ΄I"s^Zu&v(TZ#G'i5Ƨ@-aw37A[y goD &p|y;5pI5󽠫e"D0 csuʩTDmNU^jqu+wB m]J>UikT5OX{qױhERG R-B\P!x|'.##3]l )W.`b+HFXy'@eg,MņI;Pexz!DT jNqU.ppR&;VY엥(呂x#7=4KHwhߡOOo7=b $ p[QI2Wv@x uVChK~0ކnY#8ضd~qWS@y؏2䱅 ǵH#TWd E;dX]L-7x ZXGJ;v?NV]!0k_=MBvS*GTeADw" + Y/OΝ"hʟ$:GC-@w0\Р)DE!2q,X]AXc8" m!6zM)a &x\rⷍM@ uWQO/R? 6*״^µm\ 'Yɛ$j4@-CG:Fzp-b)tj-? _H_݌9?ݠ9w3 R b|~ma) A-wSz 8=}+RpFfR2O#% tM~ZZ(a2WXX5fpwؤ%D(5F^G}j@H [i>U/5OqRS |SfעtB ޏX<8DC5'|k i*ub!W^6ڃo Xj/eu;u̿w*6RKvnzh iݽX$qF=! )PsO\mf1j XSK.B+1ʃ9P*dHxQsδm"4q]_|z|mxD hʹ2+On[uuS%QU.}i&bNr{Գ[W>9 h@)'鵟(#Ѳ88b²6X:-8|$$lô=ˑI|ڡ'::heWFC@?NcQȍ HArӏע;l0ހYy1%8B)[[u_V-2'$/16s{Y?^R; ޓ:sbC6}zj֎b_m\9~ېy =Jq7Z;4ƛ3wS zpBWA``1 e[͆޶<&3 ¿Z VA]8IN2.n={>Iµ6"QPb Є7u_Z3,N b3%ėכAG)q@WZ&օ4d:ki@eA/.kej5\~x0^JduH=m߾Vbq ռz5"]O2>YcESKoJI)#z`Gdq5 hOg2K-=؇܄<@3MFŎIxJOqpRn v1cRzJFC|*}y}xNKT& CdRgVb6Ϲhȟ; ARsB"T9vdC)ȸAL[GG\ zקn8\zRT†ŏ@I<}"'i_Y zS~zؚv"gJ#՚1ĝQѥL[_@d) ,w;NJ( uZb(p$ lT K敲\$&f{+tNBI c@TUvL.R[E[[$E4JVO|}"j1Ҧ \rcbQxo/&|[?5A2< ܞؑe>̂m %R >Zڤe\Fx)dZrKY_ 1Зg܋~=u@î;g^*S,0#(?cjjMIIl&:Ჭh #/̆A "z9Q[w\2!K PQ5]&@F)֋V;3Eaĸmhe+f=9~LTK::uT"O*ޢ}.J(0qc}XS]t @i\&Xlƒ;le2VexpH 6ԐJh̡pubcXYD2m%m~["ɺ4%SUQUmcEpغQWj [[Ͷ٤^G6??lt x>y+7ecHr]@1UĦ eNCwR#Ddk *E8qB`Y0OƞIN1}z)JD#z)f+Vh"SU q ֑$Y%45m 'mZV%4htis41L#Ԉ6meg{ñ{b82 ʄۦ˃|8'ܠ;9[]P17 &5C# T=rk6!j&4Oti?MQ9ks5L5p.N$r*OH=;׆[] w˦MWg ׆W EꗒYY pX]/ЅVGuPOiF|j~33HTEٝ>| *I%wi|y!g[u1o]LV'(0åT?VDTL!J͒䎱̕4Pw֕oĽ=p SUbkֆE¦RF64DB|EmE?-בZW3s9!jAx6rM~Aa)u @NPz揁@;բ;I6vy:T| =~_lUY%ad ',NCz)wfT.K- B/l90}.]~<#@kb9tgC}: 1:[n`ڴ<)zÖ́s{dpu)xC)Еyjж;TFĿ1At_E1P Fm矌 Zes;;9Zj_͛]:y}!kϸU bF:BX$G qy\],CUlk'v:7x:dWEhA{Da`8܆h5;~)BVh@咅c`g€4ܧ_&WwdˑscIIZXU]/*1Y5fKd Ql3M'fDUllV.=c>drG铬f楬Pɇ8nj6EG2ʩS%J^x} Z,Qh!okH?V'Z˱?z=lBab ~mժz.$X&RY`oy=ARV'ct Tw{U祠ʌu+NFYZ VC?H){vf˨L)j8|Zi%ɏnKxͤyDnu>>7n6ፇDmΈVMB_]VޥA/x1f(B@dxߪ![$h|̽m#ԉ%䞭h˰Y{f: ^8ʌcyChiFY Y9 -"L#BD˪kvRMLV`m-zws1?Pte vP W?bt'#KeeX kC9f[/dRG>D9joW:cTԁw;#A;zc 7^]'?N=ZQu 1=F"ml6!k>bG,F[G$n~n]iq1\j:nP6!`3tf;ϥiTzD"O{בH]mWW`!B .| 䤠 &QO!OhPrq {?L$D>QF~Cڞ݆=Ji0KEWX&OXG>)D0wj5 2U ~,xj r]' sqqPQG=I)Zlx?ϯ#kOl L{^Q[M@%dve??󩖳Ǎe'._bɀ﷞4 iPj7[+-7oKkQ4 2ȅQg, Ҵ~$Rr>ޝ͗rjwݏ/"_@Kju:@atYRcWr>nMV]wRW5h-h wyn/,4RU]gblobPS(IAΎw!Rr!(fzYpR79du*sL\ƔDx[>_Wircg }+ $6y1i#A Uk\-L0k]ٶ: CVLV"omj0QhLZHU:{/]~,SCC ؐ:MdfOKN(%?rm`G>!%Pb\5^|+q ~}ꍣE(u/(j#3ğO8.PSFM,4ʭhFE]j-u@%#70%aƸ8vzn_k5e($Kru!йʊ1 _P􈉰;ֻG: z*20m( {4]#T4r9?aPrTk҃>SSCNP@֗y }mɚ3'm"0BHμ2n/ C6 &7o#N_x \;{!ۗxt^YFȲ w)ƆJw㬫XՐV"ea D~>|Ȁ*%/їRu2w kH*e]ba)i H:=\.nu4AMd0ZMHO8ūKc WIq&2݉.:<#_ 8*5pi=nߓD =0KS"Mmٚ >kxL<|v-$7ED~Y fzj0vW|g'9I<_ F͖hƤRuVrCW&M⢣0+mkiyw:H/`q,f+:!S6bi45SzxjD‰8_{A(Fh:5`]U<5lv +LC fK ar;o#3%4`9TBB;6 nOgO C4P@TQ{Y'0t׎ݖYH ˇ >+ JT3d<ԉf86{Ys:ͱ)h呿4AM#έHM'Mt5|a1V7 fѩXĠs+kq?kԇ.X3SWPb_ gts`A'oAC8D"u.G<\D kL3O4o22&~&CmqCS=iɣP"dn\', >垕EΙ|fyg>No`}:m0]dY=W$@]ׄ3>ϔ81drWDd+- P|[=|_#C]l:ӗ,' =rhcҍ,x(i 05Vml=J$x߫D2A馁(*zDdDe+S".^/̀.q8$ 帜gLJ~q”랾n,[0Kr5K5Xvڶ+B1c5|bT}R2?Go,z;-kc_9h!% X #IhD(7ZG9Q . $jT-?1}e?h Q)Pt^]iDl:B V5~htݐWlçP;OCZL/K՚~tvN5o⧱v1|O v?j(2nq:6r\W \?Q?5<B+<H=W\a7)`._s^zhW#cq y}q9e=t]1UA Q0bбT~A*.P 쮎1~Ό:O[cE1|7,y X7I0~i G2QnnRoq@8i/ /}bE*Ph4@vkh1ۢ`ʋ ')"bb*:͗n(Ӕ|Bm |,4uAģojLiNA3]DakBuUZ5qR4{ux̄=8GW n8,pl-I2ULLsdmd99 it32<<=Q?>?@ABBCEXEEFGHIIJJK]MLMMNOPQdRSTUVUUVhWWXXYXXYZYZ[\m]\]];<=P>>?@ABCBCDWEFGHIJKJK]LMNOPPQPQcRSTUVVUVhWYYXYZ[[l]\];;<==P>>=>@?@ BABBCCBCCWEFGHIJKK]KLLMNOPNPPQcRSRSTUVhWXYXXYZ[k\]^]]::;< P==>>??@??@AABCDWDDEFHGGHIJK]KKLMNO NPPQPQcQQRQSTUVgWVWYZk[\]9:9;<P==>?@BABCCVEECEFFGHHIJ\JKKLLMNPOPOPQbQQRSTUVUVVgVWWXYXXYZkZ[\[\\]899:;<P=>?@AABCCVDEFGHGHHI[JLMMLMNOOPbQRSRSTUVUgVWVWXYYXYZ kZ[\[\]\]^]]889;:;;<;??@AABBCBVCCDEEFGHII[JKLMLLMNMNOPbPQRSTUgVWXYZZkZZ[\\]]^]]899:;>?@BUBCDEFGFGH[JKLKKMNNOaPQRSRSTSTTUfUVWXWXYXY ZZkZZ[Z[[\\]89::;;>??@AABBUCDDEGHIH[IJKKLMNMNNPOaPQRRSTUgVWVWXXWYYXYjZ\\[\]77899:;O;<=<>??@BBUBBCDE FEFFGGHHI[HIIJKKLMLMNOOaPOPQRRSTUfUVWXYiZ[[\]7899:9:N;;<==>=?@ BATBBCCBCCDEFGHGH[HIJKLMLMN`OOPPQRSTeTUVUVWXYYXZYkZYYZ[Z\\]7677898;::N;;<==>=?@TABCCDDEFFGH[HHIJJKKLMLMNNMN`OOPQPQQRQRRSSTSTTeUVUVVWXWYYjYYZ[\[\]6577899::N:;;<=>?@TBABCDEEFGZHIJJKLLKMN_OPQRRSeTUVWYXXYYjYZ\\Z\]6789M;<=>>??@S@@BCDCEFGZHHIIHIJKKLLMLM`NNOPQPQRSeTTUVVWVWXWXXYjYZ [\\IJKJJKKLKLMWNOPOP QRRQRRS]STUTUVWVVWXYYXbZYZZ[\]\]^__h`a`aababcdmeffgffghiqhjjijkll5667878M99:;<=>??@R@AABCD EEFEFYFGGHIHIJKJKKLMM_MNOPQRRSSdSTUTUVWXiXYZZYZ[[566789M9;<=<==>?S@AABABCDEYGFGHIJKLM_MNOPQRSSdSTUUVWYiXXYZYZ576678M9:;:;<==>R??@BABCDEDEXFFGHIJKLMM_MNNOPQ RRSdSSTSTTUVWVWhXYYXYZ567678L89::;<=>>R?@AB>>=?CDDEXEFGHIJJKKLL^MMNOPOPQPQRRdRTSTUVWVWhYWYYXXYZZYZZ[5667678L89989:;<==>?R??@?@?? >Aui@BCCDWEFGGHIJK^MNOPQbRSSTUVWWhWXYYXYZ44567K7889:;<=Q=>>?;q_>CCEDDXEEFGHHIHIJK]MLLMNOPOPQbRRQRTSSTVUUVhWXXYZZ4456767K8789;<<=Q=>>=F?BCDXDEEFGHHIJJK]LMLMNOP QcRSRRSSTSTVVUVgWXXYZY3456K7789:;:;<Q==>?==@A@ATC @WDFH[IJJKLMLMMNOOaPQPQRRSTUUfUVWX12344545/P.789::;:O;;<=>?=ANOA>AATBCBB>|UCFGGH[IJKKJLMMLMNMNN`OPQRRQSTTeUUVWVWX12233455,b178989::O;<= ]AFGGHZIJJKLMMNMMNN_OPOPPQPQRSSRSTTeTTUUVW1234/Q-7889:N:;;<;< ==k~~k>?TB C>|TCFGZHIJKJKLMNMM_OPQ RSRRSTSTeTUUTVW0124344.j.6789M;<Dx~}~xE>SAABB?WCEEFGGZHIJJIKLM_NOOPOPQQR SSTTeTUTUVVUVWWDDEFEFFGFFGGID_ǀCIJKLMMWMNNO PPORTR]ST URv^UXYcZ[Z[\]^^_^_h_`aabcbbccdmdefgfgh010123 4D5nT-45667314889M:;<9VVOhl_DBEFYFHIJKLM_MNNOPQRSdSTUVW01223I2,+,/56653M[H389L99:;:;<:OffOJOD@DEDEEFFXFHHGHIJJKLLMM_NMMNNOPOPPQRRSSdTUTVW0123H45 }´l48L1/05:;<=:;>?>R?@ ADkzVADDEYFGGHHGHHIJKIGHIM_MNOPOPQRSRRcSTSTUVUVV//012H450a½O0HcM0;<=>>R??@ >_{HBDDEXFGH IIJIERkraK\MNOPPQPPQRcRSTUVV//0122G345/€ h6}3::;;<=>Q??@=p Q@CDDEEXEFGHIFfaKMNPQRcRSTUUVUU/012122F345/rúTi3;:;<=P?@=hMACCDDEXFGH F[JMNOPQRdSTUV/0122F34 54553>ċL09::;<;<=;@T=?>Jyd@CDDWEFEFFGH DYILMNPOPQcSRSRSSTUU/../0112F2233451@wn2]59::;<;GZlK@AABBCCDWDEFGDZHLLMNMNNO POPPQcQRRSRST--./011F12450s+6C;49; U_oY@=>>??@??@ABBCVDDEFDFLGB`IKLLMNOPPOPPQcQSSRSSTST--../011E212123451E΀ 6Qe6:;BTgF<==>??>AD?@@ABCBVD EDUu|vUBpdGKLLMNPOPbPQR STSTT,-.-../0100E1233445450Nx^Ixξ[5;:;P<= >>=F[^S@@ABCCVCDDCDCNOBXt{hLYJKLLMNMNPPbQRSRSST,-./0E12345G,--3nнŠ3::;O<<=@BABUC D@`bEEDH[IKJJKKLMMNOPObPPQRRQST,,-./0D12345I5658iμÊ39::;O<==?@BBUBBCCDCL}~MEGFGHH[IKMLLMMNO`PQRRSSRS,-/.//0/D011212345I556641Ha399768::N;;<=<>?@T@GSOCABHDCEFGGZIHIJKLMMLMNMN`NOPQRQS++,--../D01223455I566756885Hz~{L7N;<;4594:?@RC]dcQACEFGZHIHIJKKMN_NOPOPQRRS+,-.//D01,''(/345I5 6677875Vz[6M; <<9:ӮW6? @RHc`cZACCDEEFEFFGZHIIJKLLMN`NNPOPQQRQ@ABCDCODDE =WQ?GGHGHHSIJKLJVYKWMNOOMOzJQQRSS\Ujtq`TVUVWVWXYZcZ[Z[Z[\]_h``ba`bc+,-..C/0'fS*32E3566776BPC79M9:;:3 A<>??@R?BLH@ABCDEFFYGHIJKJKKLLM_NNOONPQPQ+,-.C./+E 9/33-:Y5/4566767764689M9::91 f5>>?@R@?>@ABCDDEFFXGHIJKLLMM_MNOPQPPQ**+,,-C./% l(2.eR05678M99::1̈́l4=>?>R@AABCDEXFGGFHIIJIIKKLM_MNOP**+,--,B./% (-T­A25223676778L899:1 P8==??Q??@ABBCEDDEXFFGGHIHIIJKKLM_MNP*+,+,--B--./% l(+c.5O]E4567 88L88995K3=>>Q??@ABCDEDEXFGGHIIJKKM_MNP*+,A-.*D7.*~a.442Q|}v@3678L8890n ;:<<==>P>?@ABCDXEEFGGHIJJKL]LMNOPPOP))*+,A-..%eR)1,Kã;1441a|x~K25578K891}ԲI6<=Q>>?@ABCDXEFGHGHIJK]LMLMNNMNNOPOP*)*+,A,-.&A}v:)101,WF.3441Gw~l;45677K8987ZiF7<;<=Q==>?@AABC EWDEEFEFFGHIHIJK]KLLMNOOP)*+,,A,,-..)%%&,01,0M-.2343@L:35667K778988558;<=Q==>?@?@@AABCVCEFGGHIHIJJ\KKLMNNOP)*+,A,,-,-.-./010D1234432145445K7789;<=P;<>?=?@AABCCWDEFGGHIJ[JKKLLMN)*+,+A,-./011F1234 2./2546C=H677899:; <;QC?<==<<>??@AAB CVCCDEEFFEFFGGHI]JJKLLMNO)*+**++A+,-./0E1211*))*0/?hh@/6azsY4789:; >f]WA:@TXG<>;=@ABVCCDDEFHI[JJKLMNN)()*+@+,-//./0E11/,h>JêM@|y}t26789;:;;9Io\_KBp{QCh~z\??BBCVCDEEFHGGHHII[IIJJKKLLMMNMM(()*+@+,,-.//0E10, گ™>u|~l25789::;:En^^Fb}}w?AABUBCDEF GGHGHIH[IIJKLLM()* +@+,++,,-,-./00E0(q ?Fh\M4567789 :;;:;[TK;p} b@ATAABBCCDDEDEFGHH[HHIJKLLM'()*@**+,-.//C-dۃ h.4545I56789:N;:C[]T{<@@SAABBCDEDEFGZHIJKL('()()*)*@**+, -*##%'./?V '=>/33445I565368989N:;<;:996nQ==>>?>?J@?@A;Lj;BIƼHCDDFHIISIX^NJKLMMWNOP|iORSS\STTUVWYcZ[ZZ[[\]^''(''()?*+,+&EԀ&<|ІK).1123430F252My~i:67877L8:; <;<;8JZWB:?S@ABCCDEFXGHIJK'()()?*+*+**à b7G˜-(012217[wL352g|x}F387>Pb?9::;<988;>?R@ABCCDEFXFGGHIJ'&'()?))*++#S8(N>+0 112122/W|x@252W}|s>478S\mS9:;;<=>??R?@ABCDDEXFFGHIJ&&'&'()?)*+!b9.(*0),012.`{{E145546PXB56677:V[kV;8:;<;<=<<=>R??@AABCDDEXFFGFGHI&'(?)*+$L8-..-/012/Ao`5354540DL81676FXiF789:;<;;<=?R??@AB CCDDEEDXEFFGHHI&''&'(>)*)*$Q;--././0 10011/8R32435~Q155677?@ABCCDXEEFFGHGHHII&'&&'(=()*&5m$A-./0 +,0*/20E234 /lýå<3576K8757769:;<==Q>>??@ABCDDXEFGHGHI%&'((>(()* +&(Zzo>#,A,-.-/+P}:.1F22443-U/667 K79XmjN7:;:;;<=Q==>?@@ABCDWEFGH&''&'(>(()* +*"!!',,A,,-.'//+KÔ20F22344-¹O055667K5_}}|O7:;;<;<P=>?@ABABCVEFGHH%&'(=()*+,A,-..-/)Q,F12233.P445 6I@w{zz}k88:;<P=>>=?@AABCVDDEFGHH%&'=()*+@,-,./..(X+F11212-:s+57HCxzyz|n889:9;:;;<P=>?@ ABBABCCVCDEFGGH%&'='()*+A,- ,)^;.E12/7́w+5I7i~z{Z57899::;;<;;P<==>>?@ABCUCCDEFEF%&'='()*++*+A+,-+#(0%%sQ+0E1(@15I3@ixw`639648:;::;P<=>>?@ABUCDEF%&'<''()()*++@++,)+׼_!>J4*00E1(ńb,5I537CA1Lzc979::;O<=<==>>?@ABBUBCDDEF$%&'='()()*@+,*)t!*-/00E0011'Ƅc,5I56531Ty88:;O<==>=??>@AUBCCDEFF$$%&<'()*@+#k?*/0E0010'A145I54;[499::;O;;<<=<=>?@@ABUBCDEFEF$%&<'()**?*+!h%/D0.:Ё*445I51N {389:9:O;<==>>?>?@TBCDEEF$%&&%&&<&&'(''(())()**?*+!q#./D/0 1,>?@S@ABCDDEE$%$%%&<&&'()**@**++!~J'-.//D/01-(>I2)2345I53? e39889:N:;<=>?>??@?@SABBCDEE9:;<==>>?>?J@@?@=Gӂ:ACND EFB?DFGFGHIHISI ErQJLMMWNNOPOPOPQR]TUVWV$%&&%<&'&'()?* +&9)+-/D/0+-1*/234I4543[u?589M:;:;<=?>?S@@ABCDC##$%;&'('()?* +&$BP7"*,,-.C/0/,X~9.2334H45409FA34778L9:;;<=>??R@ABCD#$%;%%&&''&'()?*&$'++,-B//.//*VĒ2012234I4545423577678L9:;<=>?R?@ABCD#$%$%%;%%&'('()?)*+,-C. //)M,112G45665788L89:9;<=>>?R?@@ABABCC#$%%;%&'(>)*+,-B.//)P+11223H33456678L89::;<=>R?@ABCC#$%%$;%&'(=)*+,+,B--.)`œ5/122G334567L89;< ==Q>>?@@?@ABC#$;%&'&'(>)*+,A,--.,mD,012F34566778K89::;;<==Q>>?@?@@BBAB#$:%&&%%&'(>(()*+,,A-.)8@.,001F224345677K89:;:;<=Q=>?@@A""#$:%&%&&'&&'(>()*+ ,,A,,--./..-+/01F22345677K789:;:;<=Q=>??@AA"#$#$:$%&'=()*+*++,,A,-././01F2345J77899:;<P=>?@@AB"#$:$%$$%&'=()*+A,-.+%%)/011F12456J6789:;::;;<;>?@@B!"#""#$:$%&%&'='()*+A,--%4]cL&-0/0010E12456J66778 99::9:;;<?@"#"#$:$%%$%&'=''()*+@, $\0,/0E1234345I678789:;:;<;O<==>?@@""!"#9$%&%&'=''()*+@++,,&H &/0/00E10122345I566789::;O<=>>?!!"#$9##$%$%&''&<'()**+*+@+" G)//00E0012345I556678 99::;:;O;;<<=>>?!"#9#$%%$%%&%&<'()*@+"Ʉb$.//0D001233245I5667789;;N;;<=>?!"#""#"#9##$%&%%&<&'()*?*+!W&-//0D0123343445I5677899:N;<=>?!!"!"!"#9#$##$%&<&'()*?*+*+"m.,//./D01233455I566778989N;<==>!"#8#$%&&<&&'()()@*+*' Q&.././D//0123345I567789N;:;;<=>78D9:9:;?@I?@?@@=;{V9BBCCDCNDDEDEEFEFGHHISIJJKKLMMXN ONPPOOPPQQ!! !"#"8#$##$%&&<&&'&&'() ?)**+*+*""!"',-.C/011234344I456789M::;<;<== ! ! "!""!""8"##"##$%<&'&''('()?)*+,-.C/0123I445678M9:;<=! !""!""8"#$%;&'()>))*+,--C//./0123H44578L99::;<== ! !"8"#$%;%%&'(>)*+,B./01233H345667 88L899:;;9;<<= !"8"#$%;%&'(''()>)*+*+*++,--B--./011012F34567678L89;:;<< !8"#$%$;%&%&&'&&'('(>)*+,-A--./0122G4434456657L89:;<< ! !8"#$;%&'(=)*+,A-./0122F2342456677K89:;;< !7!"#$;$$%&'((>()()*)*+,A,,--./0/0 1122F234434457567K77899: !7!"!"#$$#$$:%%$%&'('(>(()*++,++,A,--/0/01F234456 7K77889899:;: ! !7!"#$$:%$$%&'(=()*+,A,-././011F123456K7899: !7!"#$$:$%&%&'=()()*+@,-././01F112345K789 ! !!7!"!"#"#""#$#$:$%&'<()(()*+@,-../0E122345I76778 ! 7!"#:$%%$%&''<()*++@+,-.././0E122345I678<=>R>?@@ABBCDDEXEEFHIJKL^LKM NNOONOPPQPQcQSTUVWWVhWXXWXYZYYZ[\k\]<==Q>>?@AABCBCCDDWEFGH IIJJKJJ]LMLMNOPQQcQRSRSSTUVUVVWhWWXYZYZ[\k\];<=Q=>?@AABBABBC DVDEFEFFGFHIKKJ]KLMLMNNOPQbQSSRRSTUVVWgVWXYXYZ[\l[\\]^;<=Q==>?@ ABAABCBCCWDEFGHGHIHIJJ]KKLMLMNOPPQ cQRSRRSSTTSTVUUVgWXXYXXYZl[[\\]^99:;<P=>>?@ABABCCVDDEEFGHHI J]KKLLKMMNMNPOOPbQRSTUVVgVWXYZYZl[[\]9:;:;;<P=>>?@ABCVCDEDDEEFGHI ]JJKKLMLMMNOOPaQQRRQSTVUUVgVVWXWXYZYZk[\[\]\]889::;>?@BABBCVCDDEFEFFGGHII\JKLMNOPOPbPQRS TTUUVUfVVWVVWXYZkZZ[[]\\]]^^]7889:;:;;??@?@AABACVCEFGGHII[IJJKLMNPbPPQRSTSSTTUfVWXYXY ZkZZ[Z[[\[\]899;>? @@ABAUBBCCDEFFEFFH[IJKKJKLKMNO`OPPQRRSSTSTfTUUVWXYjZ[Z[\\]78989:9:O<=?@@ABUBCCDE FFGFGGH[HHIIJKKLMNOaOPQRRSTfUVUVWWVWXXYWXYYjYZ[]66789N;;<= >?>??@?@ATABCBCDEFGGH[HHIKJJKLMN`ONOPQPQQSRSTTeUUVUVWXYXXYjYZZ[Z\\]]5667899:;O:;<==<=??>??@?@@UAABCCDDEFGH[HHIJK LKMLMNMN_NOPQPQRRSRSTeSUVWXYjYZ[\]6567899:N:;<=>>?@S@ABCDEFGYGHHIJJKLMN`NNOPQRSeTUVVUVVWVWXjYYZ[Z[\]IIJJKLLKLMWNONOPQRS\SSTTUUVWXcZZ[\]^^_`h`a`a bbcbbcdcddenefghihihrjkkjk566789M:;<=>?S@ AABCBCCDCDEFYGGH IHIIJKJKLMLM_NOPQRRQSdSTUVWVVWXXiYZ[5789M9:;<=>>?R@A@B CCDEDEEFFXFGHGHIJJKLLMM_MNOPQRSdTSTVUUVWXXhYYXYZ[5676778M9:;<= >>?R@?@A@AABCEFXFHIJKMLL_MNMNOOPQQRQdSSTUVUVWhXYZ[[5678L89::;<= ??R??@@A@AABBCEXFFGGHGH IIJIJKKLLM^MNMNOLKKMPQSSdRSSTU VUVVWVVWWhXYZ56678L9989:;< ==>>Q?@??@@ABBCDEXFGGHIKL^MLMMNNJYqvcMOPQRcRSTUUVWWhWWXYZ565667L89::9;<=Q?@@ABCCDEDXEFGHIJKKJK^MLMKoROQRcRSTUVWhWWXXWXYZZ5677K889889:;;<=Q>?@BCCDEWEFGHIJKK]KM JeMPQcRRSTUUVWhVWWXYZZ4567K899:;<<=<=Q=>?@@AABC EWCEFEFFGHGHIJKJ]KLIXNQcRSTUVgWXY3456K789;::;;< P=>?>>?@?@@AABCVDEFFGFHI JI\KKLLK `LOPQPbRQRSTSTUVVgWXYYXY334456J77899:;;<P==>>?@ABAABCVDCDEEFGHGHIJ\K HYMPQbPQRSSRSTVUTVVhVVWXYY3344566K78::;<P<<=>>?@@ABCVCDEFGHHIJ\JKHhKOPOPPbPQRQSTUUTUVgVWXY345K76778 99;::;;<?@AA@AB VCDCDEEFCABBFHI[IJJKKItRMOPbPPQRRSQMPVgVWX WYY22343445I766778 9899::;;>?@ABVBCCDARlqaGEGHII[IJJKLKG\w|gLLNOPObPQRSTOViNfVWXX123345I567789;::;==?@?@@ABVBC @hMEGGH[IIJKIHIILNObPQRRSSNcҀ_UVWXXW21223345I5565789:;;O<=>?@ABBUB C?XDFH[HIJHGIKKLMMNOaOPPQQPQRQSRP˂PVW11223345I56789:;;O;;<==>?@ATBC?}UCFGHH[IHIVXMHKKLMNNMNaNPQLtMUUVWXX112123455I567899:O;<=?@ATBC?]BFGGH[GKq~XHKLMMN`OOPQIMUVVUVW01212345I5667899:N;;<;<= >?>>??@@ATB>}TBFG ZEh|MJKKLMN`NNOPPQPQJtLUUVUVW121123345I5678789:N:;<==>?>>?@SABAB?WCEFFGGZFxWHJKKLMLMN_NNOOPQPO͂NTUVUVVWVWWEFGFGGHIIHSIJKLMWNNOPOPQR]STTUURv^VX YYcWb[]\]__^__h` a`aababc^sրgefegh012234I456789M:;:;<=>?>??S@@A>Ohl^DBEFYDUiGIJJKKLM_MNMJKMPQLThLdSTUVUV00101223324I44567789L9::;<==>??R?@ ABA>JND@EDDE FYFDRmq^HHIIJK MM_MKPhkTLP QQOJJINSdSSTUUVW/01234I4456678L5457:;<=<=>?R?@CkzVADDEFXFGEEDEHIJJKGCDEK_KXȰeJPQRRQSdSTSTUVUVV0123G34565676JMb]C5:;<=?>R?@@=`{HBDEDEEXEFGHIAZtI[I̫OOPQRSdSTSTUV01 2122G33445456676:Z6;<= >?R>??@@=p R@CDDEEXEFHGHHIB dMž`KPQRRcSTUV//012G3345 67673pP6;<=Q>>??@>??@>Jyd@CBCFZDEFFGHH@ af}INNPOPQcSTU/0 110112F22343445 62L7:;;<==Q=>>??@=IciWAABBCAK_qUEFFGGHFH@ӄ w@epKNMNOPQcQRSTU/../001E23434453D}4989:;<=P==>?@>==?BZdscJDEEFFGFEG?iEHFGHM NNOOPOPQPPcQRST.-/011F233452wV28>:7:;<P=>? @ABABBAWdsbHDEBFPG;vHJLKLMNOOPPOPbPQRRQRSST-../01F112343453=h3BfsnO7;<?>?>AD@?ABAFYmNCDEAbfG mEJKLMLKMMNMNOPPbQRSRSTT,-.//01E122345?3KWnhL4:o|}|J79:;;<=>F[^R@@ABABABUBDDEEBW̌koNWKJKLLMNOPPbQRRSRST,-./0E112112345H11235J}z~b6:;;|ݩ\<@AG[IIJKJKLMNPPObPQRQSRS,,-../0E01245445I64J}z~a5:;N< ==zܪ]EH[IKL MMNMMNONOOaPQRSRS,,-./0E012345I569l|}zH699:;:;O;<=ASXK>?@ABBUB CC@RÁcGHHZIJKLMNaPPQPQQRSRSS,-.././/0E0124345I5665?dqmM689878:;N;<<==<=>=?@BTB@?@CD?__ACFGH[IJKLMNaPQRQQS,-,-./ D001011221223455I56 55;75898BKC99N;<=?>?@U@Ld[C?BLCAEFG[HHIIJKLMNN`OPQS,-./D/0122345I56676 787@Y\[C9N;;<;45948?@ SGx`@CCDBDEFGGZGHIIJJKKLLMLMMNMN_OOPQR+,-/./D//0122334I567G\Y\J8M:; <99ԮW5@>? @PQr@CCDEDEFFGHZGHHIGBGLMN_NOOPQPQQR@ABDDCODDEDEFGFGHIHSIJKQglhSLWNOMOzJR \VjSUUVVWXWXZcZ [[UaoU]^]^_h``abcb+,-.D//01234I56567 =D=89M::;:2A?R??=>BABCE BCU`AFGEJՂcFKLM_MNOPQQ**+,-C../012233H445678M9;1̄ l4>?>?R??@AB@BC DAUEF?tBKKLML_MNONP**+*+,--B.-./0100123I34566778L890 P8==>?R??@A@??AC BFuA>AKLL^MNOP*++,-B--/012G34567L88995K3<<=>>Q?@?IcaGACC>]ǡA>u@JKL^MNOOP*+,B--././0/012F234567L890n;:<=>R? @?BrlABB>[Ǟ@DHԂbCJKK^KMNOP*+,B,--././012F23344567L8991|ԲI7<==Q>>??@>G|yDAB mAF@^؀~AIIJJKK]MLLMMNMNPOO)*)*+,+,,A,-../01F2233456767K8977[iF7;;<P=>?g`@BBC@LrBEEF@M[@HIJ]LKKMNO)*)*++*+,A,--./0101F2345667K87898667;<<=>?ARQ@AABBC@>IW?DEFEFC>>?CHHIJ]KLMNPO)*++,+A,,-../01F1233445 46K778789899:;<O:<>?>?==@ABCBBAUCDEFGGHIIJJ]KKLMNO()**+*+A,-.-/01F11234453124545<9I6789;:;<<;<:SJA;><99;?@ABABCVCDEFGHGH IIJ\IIKKLMLMNN)()*++A,--../01F1.-..21:NN;25JWTQ56789::; :B}~qE8BjrP:<7:@BCVCCDEDDEFGGHGHI[JJKLLMNN()*++@++,,-.//01F110.Lova9>p|{pA:XVY^4789;8W|ZGŸcEw=?BUBCCDEEFGGH I[JJIJKKLLMN()*)**+@++,-./0/00D00.ftyww|g9UXYZ466789:;;8PNǼځ=?ABUCDEFEFFGHGH[IIJLM(()*+*@+,-,./.0//0E0,Qwvwyr:>OHK5567789899::;;imZ:8BAUCBCEFGGHHI[HIJJKLKKM()*@+,--.//00E0+vtw{j53I55665789 :;L8967AATBBCDEFGH[IJJKKLM''()*+@+*+,-,--./D0+wzuH15I56567889 :9;O;;8P߄;899;BCCDEFGZHIJJKL<<=>=>?J@?@?@ABCCDODDAZvGEGGFHHGHISHIHW^NJKL MMXMNNOOMLLPeYM[{OTVVWXYcZ[\]]&'()?*+,- .C./0+3JP@-/1224332G352My~i;67866K8;::;;<<:4WrźQIUՀ)*+,+,B-.//019QfJ5445540DL8167675UyS69::;<=>9l8BCCDEXEFGHGHI&'(>()*+,B-../0/0101 05L3234434~Q066776AT689899:;:;<==()*++,-A-././/0/00..0.010F223.lýå<36 5J8627539:;< ==NF~8AABCCDCDWEFGHHII&'('((>(()*)*+,A,,-./ 00-@ahX6/1F223.U/55677K6;xc69::;< =Q9:h~Q7?@AABCDWEFFGHI%&'&'((=()*+,A,--.././-=syx{b21F233.¹O055677K3¿e3:;<P=<656:@AABCDVDDEFGGH%%&'&'('=()*+,A,,-.//,YyuwA.F212.P445 66GI699:;<P==>>=?@@ABCVDEEFGGHH%&'&'(=()()*+*++,A,--./.+]xutuyD-F12122-:s+5 6FO879::;<P=?@@ABCVCCDEEFHH%&'=()*+@+,- .,Gyvuym6/E12/7́w,5H8ż{27899::;<?@@ABVCDEFGH%&%&''&&'<'()*)*+@,--,'+/))Qpti@-1E1(@15I1J4.:4/799::;;??@?@A BBUCCDDEDEEFG$$%&'=''('()*+@+,+,,*,W}vF(7=2-00E1(ńb,5I518OJ+`ю:6:9:;;>?@ABBUBBCDDEFF$%&'='()*++*?+ ,+*kQ(-.0D01(Ƅc,5I5542*p879;:;;O<=>>?@A@AUBCDDEFF$%&<'()*+*@+'L7-/D0'A045I52@ ~/9::;;O<;<==>>?@AUBCCDDEF$%&<'()*@*+'kK)/D0100-9Ё~*45455I5,f/9:;N;<==>?>??@SABBCBCDE$%&<&&'('() **@**++&nO(..//D0 1+;l,34I5,k/9::N;<==<=>?@?@SAABCBCDEE$%&&<&&'( ))*)*@**++&T <*-.//D//01-(>H1)234I50I/889N:;<==>>? @@S@ABBCBBCDDE99::;:;F<=>>==>?>?J?@?@?Cq=BCCDCODDEFB?EFGFHIIRIAVILMWMNOPQRSS]TUVWX##$%$$%&<&'())()?* +(2kX+,-..C//0+-1*/234H4540H189M9::;<=>??@S@BCCDE##$#$%;%&'&'())?))**+*)'6=1'+,,-C/,W~9.212343I4454+>WM02778M99:;:;<=<==>?>?R@AABCCDD##$#$%;&'())>))*+*('),-,--B//.0/+Vđ20233H452.04678L9:;:;;<=>?>R@AABC#$%%;%&'&'()?)*+,++,--B../)M,23H3445678L899:;<==>R?@@?@A@ABCC#$%%;%&'()?)*+,+,-B--./.)P+123G234545767L889:;<=R??@ABBCB""#$#$$%$%;%&'&'(>()*+*+,B--.)`5/12G334567L899:;:;<=Q?@AB""#$;%&'(>(()*+,++,A--.-..,mD,01F243345667K89:;<==Q>>??@BAB"##"#$;%&'('((>()*+,,A-..)8@.,01F2233435456577K7899:;<==Q>?@A@B"#$;%&'(''(>()()*)*+ ,A-,,--../-+.01F2132445677K789::;<;<=?@@ABB"#$#$$:%$%&'=()*+A,-./011E12344545677K789:;;<P==>??>??@AA!"#$#$$:$%&'=()())*+@,-+%%(/0/011E1123343456J78989:;::;;<O<=?>?@@A"#$#:$$%$$%&'=()*+@+, --$4]bL',/01E11234345I789:;;<O=<=??@"#"#9$%&'=''()*+@++,#\0-0E1233445445I6789::;P<=>?>?@!"#$:##$%&'&''='()*+**@+,'H&/0D0012443445I56788989:;O<<=<=>?@!"##"#9$##$%&='()*)**+*@+,"G)/0D0012345I556789;O;<=>>??@!"#9#$%$%&'<'()()*)*@+"ʄb$/E0123445455I5678989:;O;<;<=<=>>??!"#""##9##$%$%&&%&<'('()*@*+!V&/E012345I578989;O;;<= >?? !!"!"!"##"#9##$#$%%$%&<&&'()**@*+#m.,..//D/0123455I567689:N;<=>? !"9#$%&&;&'()*@+**+*'Q&../D//01234I56789N::;<=?78C9:;?I@=<{V9BCCDODEDEEFGFGHISIKLMWMNOPOPQQR!"#9"#$%&<&'()?*++*"',,-..D/01234I45766789M9:;<;<=! !"8##"#$%;&'()>*+**++,-C/0/0011011234H44566789M99:;<= !"8"#$%;&' ('()(())?))*+,--C//.0/01 212233H454456767878L899;<= ! !"!"8"# $$#$$%$%%;&&%&'()()?))*+,--B.//012133H45678L8899::;< !! !"!!8""#"#$##$%%;%&'()?)*+,-B-./0123G33445 67667788L89:;< ! !"8"#"#$##$%%;%&'('(>()*++,+,B--./012G224567787L899:;<< !! !8"#$;%&'(''((>)()*+,A-../01F23345677K889:;; !"!7!"#$:%&&%&'(>(()*+,A-./012F22345677K78989:; !7!!"#$:%%$%&'('(>()*+,A,,-./01E23345776K899:: ! !7!"#"#$##$$:$$%&%&'&'(=()*+,+A,-./01F1233445456I789 !! !7!!"#"#"#$:$$%&'=()*++,@,-,-././0 11F11214424566J677899 !7!""!"#$$:$%&'=('()*+A,-../0F122345J6678788 ! !7!""!"#:$%&'<'()*++@,+,-./0E12345I677<=Q>?@ABCCDDCDXEEFGHIJKKL_MLMNMMNNOPOPQRcRSTUUTUUVhWXYZYZZ[\l];<==>P>?@ABCDXEFGHGHHIJKK^LMMNMNNOPQcRSTUUTTVWhWXYZYYZ[\[k\]\];;<Q==>??@ACDWEFGHIJJK]KKLMNOPOPQQcRSTUUVVUVVhVWXYZl\\[\]:;<Q=>??@?@@AABCVDDEFFGHIJK\KKLKMNOPQbRRQSTUUVhWXYYZYZ\k[[\\]^99:;<P<=>??@@A@AABVDEFFGHGHHIJ\JKLMNMMNNOPbQRSRSTUUVgVWXYZ[k\]9:;<??>?@AABBCBVCCDEEFGHI[JKLMMNOPPbPQRSRSTUUgVWXWXYXYZYYkZZ[]^88989::;;<?@BVCDCEFGHI[JKLLMNNOOPPbPPQRSTUUfVWXYkZZ[\]89:;O<=>>??@?@@ABUBCDDEFGHGGHI[IJKLLMNPbPPQRSRSTUUeUVWXYYZYZjZ[\\]]^7789:;:;;O<=<=>>??@ABBTBCDEFGGH[IJKLLMNOOaPQQRSTeUUVWXYXXYjZ[\[\]7899:;:O;;<=>?@AASBCCDEFGH[IJJKLKLMN`OPQSSRSTeTUVWXYjYZYZ\\[\]5677898899:;N;<==>?@ATBCDCDEFGG[HHIIJKKLMLLMMNMNN`NOPQRSTeTUUVWXYYjYZ[\[[\]\6789;N;<=<==>>?@?@ATABCCDDEDEFG[HIIJIDDGLMN`NOPPOPQRRSTTeTTVUUVWXYYiYZ[\[\\677877889:N:;<=>?@@SAABCCDEFGYGH ICJio[CKMLMN_OPOPPQRRSeTTUVWYXYXiYZ[[]IIJJKLM WMMNNONPPOPRSS]SSUTUVWXYXYbY[Tx\]^^__`h`_`a`abccbcdmedefghijirjklm5657899M99:;<=<==>?S@@AABCDE FFYGGHHD[CLM_NOPOPQR SSdTTSTUUTVWXiYZ\\576778M99;;:;<=>??R@ABCBCDEFYFGHH?]FLM_NOOPPOPPQRdSTUVUUV WWXWiXXYYZYYZ[Z5678M9:;:;;<=>?>R@ABABCDEXFG?τvBKLLM_MNPOOPQRSRdSTUUVUUVWhXYZ566788L89;<=<==>=>R?@?@@AA989=CDEXFG?ńpDKLLM^M NNOOJHGIOPQSdSTVUTVWhXYYZ567 88L8899:;::<<;<=>Q?@>:g\9BCCEDDEXFEFF? MGJKLM^MLNMFdvKMQSdRSTUVWWhWXYZYZZ4456767L89:;:;;<==>Q>?=A=BCDCDDXFEFFEEqBJJK^L MLHTMPQRcRSSTTSTUUVUVWWhWXYZYZZ445676678K89:;<=Q>>??6}:CEXE FFDFѰcAIJK]KLMMF~IPPQcRSSRSSTUUVWhWXYZZ45667K7899:;<==Q>>??CI JKKJ]LMLLFȃ`LQPcQRSRRST UVUUVVWgVWWXYXXYZYZ456567K789::;<=Q==>9^F@BCWDDEEFGHIJJ]KLLJK݃ pIPPQQbQQRRSTUVgWVWXYXY45457K7889899:;<P<==9O =ABBCCVCDDEEFHFGH IIJ\KKLKE̓bJPPQQbQRSTSTUVUVVgVVWXY32456K67899:;<@ABBABUBCCDEAPׁ?GHII[IJK JDmLJNNOPbPPQ RSRRSTOWjNfVW XXYY122433451S189::;O<=6558??@ABVBCCDD;^@GH[IIKFDDELMNOOPaP QQRSSRSNcҀ_VUVWVWXXY23454.i0899::;;O;<=>?>::?AABUBBCC=lAFHGHH[HEEHKLMNNOOaOPQQRSRQP˂OUUVVWXX123455/P.78989:O;<=?>:C]]C=ABTBCBC:c@GH[IFHbhRFKLMNNOaOOPQRKsLUUVWXX123445-b17899:9:O;<= :OâO=AUB:фt=FGFH[GNȲgEKKLLMN`OPQILUVW012344/P-789:N;< ;ǽǖ=?TAB9c?FGZBɰOIKLLMLLMN_NOOPQKtLUVVWWVWW01212334-i.789N;< :JK=SAB;kAEF GYDbEKKLMN`NOOPQQPO͂NTTUUTVWEF GFFHHIID_ǀCHKLMMWNMONOOPNTɱUQ]STUTTOeSXYXXYbUjX]^^_i`ab^sրgefegfggh01234D4mT-45676773248M99::;;<7om9?R@AABBA:]xF?DEFYCcȉEIJKKJLM_NNMJIMP QLUhLdTSTUUV/0100112334I2,+,/5 653M[H389M9::;<9a`:??R@ ABB@;R[E??R@?@@A?EƲh>DDEEFFXFFCBGHIIJKGCDEK_KXȰeKPQPPQQRdSSTUVVUVV/012G4450a½O0GcN0:;<=??R??@:}ųN@EDCEEXFGHGHIJJAZtH[I˫PNPQRRdS TTUUVUVV//012G3345/»h6|2:;<=>>R??@?@:a=CEEXEFGHIIB eMľ`LOOPQRRdSRSTSTTUTVU/012G3345/rúUh2;<==ċL0:;<;<;CW<>>????>=@AAB?lMCEFBFPF?=CH?@ABABAIoZADDEEAbdGmEKKLMNOOPOPPbQRRQRSTT,-./0/0010E122345450Ny^Ix;\5::;;9:O:=$>>;lN=@AABUBCDED>|ݩ]zܪ]EHII[IIJKKMNMNNONOaPQRS,,-../00E00123345 I5664Ckʾ¼W49::;O;<=?>?@@AU?Ld[CCDABLCAFG[HHIKLMN`OPQRSS+,-./D/00101 21123343445I566756886Hz~{K7N;<;46949?@ RGy`@CDCBDEEFGFZHIJJKMMLMMN`NOPPQPQQR++,+,-//D0 1/,,-034424I566785Vz[6N::;;<99ԮW6>?@PPr?CDEEFGZHIHFHLM_NNOOPRRS@ABDCODDEEDEANjrgKCGGHHGHSIJJKJVYKWMNOOMO{JR\VjSUVWXYYZbZ[X^w}eX^_h`_``abcbc+,-,--..D//0+KC.323G457 86APC79M9::;3B;?S?EWO@BCDDEFEDXGGHHEUdGKLM_MNOPOPQ+,--.C/0-: 512217Q5156567 54689L99::1f5?S@>=?ABC DEECDM]CFGFIWHK MM_MMNNOPPOPQQ*+*+,-C./*\ O-20LmjC256778L89:;1̈́k4>>=?R?@ABCBC DDCMqcFGC^ vFKKLKM^NMNOP**+, -,-B..//*j [-/Cxy{q:3543466788M8899/ O8==>>R??@A@@BC BEt]CBiFKJKLK^MNOOPOP**+*+, -B--./*\ O,.Zzvv{K145BI=4657 88L98995L3=?>R?@ESREBCC@PsCC]uEJKKLL_MNOOP)**++*+ ,,-,B--..,940.Xyvv{J1443CXXU;467K891n;:<=>R? @@AYcdWBCC@OrCEGUGJKL^LMNOPP)*+,A-.)HA-1.?ty{l72453JYVY@3557L891}ԳI7<==Q?&D_ab^CACBCoYBECScEIIJJKK^LKLMMNO*))*+,A,-./*7VaS5,001/Cf{a<03443>VYP845567K77889987[iG7<;<Q=>?TbbQ@BBCAHiy[DEEFCIdtlQDIJ]KLMNNOON))*+,,A,-,-.//+*+*.011.1I00234343;@84567K7898658;<=>?>?@ABABCBVDEEFGHIHHI]K LMLMMNMNNO)*))*+A, -,--.//.//011F11234 3124545<:J789::;<<;QC?<==;;=@@?AA@BBCVCDEFH IHIJ]JJKKLMLMN()*+@+,--.//0/0E1121.-..22:NO;25JWTR567789; >f]WA:?SXH=>;=ABBVCCDDEFGHI\JJKLMMN()**)*++@+,%--./..0//001F110.Mova9>o||pA:XVY^3667789;:Io\^KBp{QBhz\>@AABUCDEFGHII[IIJKLLMNN(()*+@++,-/00E00.fsxww}g:UXYZ466789;;::En]^Fb}}~v?@BBVBCDEFFGH[IIJJIKKLM'()*+@+,-#././0//0E0,Qwvwyq:>OHK556767789 ;::;\UK;p}}|b?>J@AB CCODDAZvGEGHHISIJIQTMJKLMWMNO NPOP|hOR\STUVWXYYc[ZZ[\]]'()?*+,-.D/+4KP?-02334H453AWZO97789M9:;<;8JZWB9?@S@ABACBCCDEFFYGHIJIKJJ'()>*++,- .C../0/++-01223I453NXWY?6778M9:;;<989;=?R@?@ABABBCDEYFHIIJK'&'())>)*+,-C--/01233H453FYYT:6778M9:;:;<=<==??>R@ABABCDEXFFGHIIHIJ&'()()?)*+,-B../012H45BG<566778L89:;<= >>=R@?@@ABAABCDEDEEXFFGHHIHIJ&''('(>)*+,-B-././/012G35 43<@6377678 L89989:;:;<=Q?@ABCCEDEXFGHIJ&'('(()(>)*+,+,B--./012G345ZuxlC367L889:;<=R?@ABABCDEEXEFFGHI&'(>)*+, B,--.-.//0/012F223441P|zy|n8567L89:;<=Q>?@BCBCCDDWEFGHIH&%&'('((>()*+,A-.-/01F2441f{x{E2557K8989;<==P==?@A@B CBCCDWEEFEFHGH%&%%&&'&&'(=()*)**+,,A,,-.//01F2 331a|wvyxB2556K7789;;:;<;<=P=>?@??@BABCVEFGH%&'((>()*+A,,-..//01 F212231Bq|~z]4567K7789::;<P==>??>?@ABCCVDEFEFGGHG%&'(=()**+*+@,-.//01E21206xS056K677899:;<P=>>?@ABCVDEFG%&'=()*+*+@,-../01E112215V05J677887898::;<=>??@ABBUCCDEFGG%&'=''()*++@,-../0E0121-^;35I667789::;>?@ABBUCDEDEEFG$$%&'=''())*)*+@++,--./0E01-|K15I57767899:;O<=>?@ABUCBCDEDDEFG$$%&<'()*@+,-./00/0E1-|K045I56789;;:;O<=>?@@AA@AUBCDEF$%$%&<'()*@+,-../0D01,_:24455I5667899;::;O<=>??@AUBBCDEFF$$%%$%&<'()*@*+,+,-/D0 1/5Y/455I567889::N;<==>>?@@ATBCDEFF$%&;&'()*@+*+,--.-/D0 1.6kO0345I567789::O;<=>??@TAABBCDEE$%&<&&'()*@*+,++,-./D//0 /,8=1.22434I56789N;:;;<==>>=?@@TA@BCDDEE9:9:;<=>=?J?@ABCODEDEDCEGHGIISIJKLMWNNONOPOOPQRSS\TUTUUVWWX#$$#$$%&;&'()*?*+,-,--.D/01234I456678M9::;<=>?S?@ABBCDE#$$#$%<&'&&'()?*+,--..D/./01012334I45667878M99:;<;<=>?R?@@ABBCD##$%$%;&'('()?)*+,--.D../01233I445788L9;<=>?>R??@AABCC#$%;%&'()?))*)**+,+,--B.//0123H345676778L8899:;;<==>>?R??@A@ABCC#"#$%;%%&'()>)*+,--B.//01012G345545678L89::;<;;<<=<==>>R?@ABBCC"#$%%;%&'('(>)*+,,++,B--.-/0122G234545667L89:;<=Q>>??@BABBC#$%;%&'(>()*+**+, A,,..-.//0/0122G2233445677L899::;<==R>>?@?@ABB#""#$:%&'&'(>())*+,A,--.//0/01121F2234456677L899:;;<=Q>>?@A""#$;%&&%&'(=()*+,A,,--../01F23456K77899:;;:;<=P==>>?@BBA"#"##$:%$%&'(=()*+A,-./0//01F12334566K77899::9;;<;<P=?@@AB"#$:$%&'='()*+A,--../.010E122343456J789:<;<?@@A"#:$%&%&'=''()()*))*+@,-.//0E123445J56789:;<>?>?@?@@"!"#9$%&'=''(()(()*++@+,-.//0E12122345I6567889899:;<??@"!"#"##"#9#$%&''='()*+*@+,-./00E12345I67899:;;??@?"!"#"#9#$%$%&'='()*++@+,+,-,./00E00112345I557767789899;:;;O<=>=>??@!"#9$%&<'('()*)*@+,--,./0E0123345I56789:;;O;;<<=<>>?!"!"#9#$#$%&='()**@*+,-/0D0122345455I5789:O<<;<==>?>!"!"#""9##$%$%&<&&'()*@*+,-/D012234455I567889::N;<=>?!"9#$%&<&'()*)*?*+,-..//D/0121234I567 889898:N::;<;<=789D89:;:;F<;<==<<=>=>?>>?J@ABCNDDEEDEEFGGHGIISIJKJKKLMWNOPPQQPP! !"8#$%;&'()?*+,-.C//01101234I456788998M9:;<<=<== !"!!"9""#$#$$%$$%<&'(()?*)*+,-.C../01123I4566778L99:;:;<= !"!!"8""#$#$%;%&'()()?))*+,--.C-./012234I445456767878L98::;<= !"!!""8"#$#$%$%;%&'()()?))*++*+,--B./0123H45678L89::;;<;< ! !"8"#""#$%%$%;%&&'(>)*+,+,B--./012G4345678L89:;:;< !""8"#"#$%;%%&%&'('(>()*+,,--B--./0122G2244545677677L899::;<< ! !"!!8"#$#$%%:%&'(>()*++*++,B-/./012F23343445677L789:; ! !7!!"#$:$%&'((>)()*+,+,,A,-../0//01F2334457K788989:: !"8!!"#$:$%&'(>()*+,A,--,--.//0101F12234345665K7789:: !7!"##"#$:$%&'('(=(()*+,A,-./01F1234566J7899 ! !!7!"#""#$:$%&%&'&'=())()*+@,-/../01E1124334456J789 ! 7!"#$$:$%&'='()*+A++,-/0/01F112345J6778 ! 7!"#$:$%&'='('()*++@++,-../00E122345I677ih32;<=E>@@B!IIEFHIIJRMMNNPPVURTTUVV]WXYYZY_`]]$9:;?@AAGGCEFFHIPJLLMNNTTQRSSTU\VWWXYY^][\]]89;C<=>?@?FFCDEFFHOIJLMkSSPQRSST[VVWWXX^]Z[\]7789:B;<=>??EEBCEEFGOIJKLMMRSPQRRST[UVWWXX]]Y[[\=>??@FACCDEEKJHIJKLMSNOPQRRXWUVWXXZ_Z[\]ba_``a55678@9:;<CC@==?DEMFGHIJJQQMOPPQRYSTUV[[XYZZ568@89:<$BB<]Z@ELFGHIIJPPMNOPQQXSTTUVV[[XYYZ457?78:;B?DDBKEFGHIHOOLMNOPQXRSSTUUZZWXYY345568-/99;;A??@BJDDABFHNNKMNNOPWQRSTTUZZVWXY2345/c48::@@:E^D;AIBFv~NEMMJLMMNOVPQQSTSYYVWXX1123.U188?>;:6G[DGVoMHDB^fFHMMKLMMKKUQRSTTUZZWXYZ//0128*02?Vz7::9;D>Bv~LAIIEGHGgxYKMNOPPVVRTTU/0012:343;e/;;@K>AnwIAIIEGC[HMNOPPVVRTTU./001923437-bA99Ja?>?A@BHHDEJ[GMNNOOUURSTT-./008123441Bxg4>H<VlACNIJLLNMSSPQRS,,-.0701'&14::36E5[W@<8CH9@DQTBKGFGOHJKLMMRSPQQR34456=66G699<<:IV[IIJLMSOOPQRSXWUVWX*++,-5%e*~o242556@-0CjB>ABCDEMFHHIJKQQMNPP**+,,5%]Bͺ:7cD48?4Le5BB?@BBCDLFGHIJIPPMNOP)**+,4,)g|41wi/8eB24>82R^5?@ABCKEFGHOOLMNO))**,3,-$$./)+(<4EE6833;:DHCJDEFGHHNNKLMN())*+3+,-.//5/{|m[278998K[]zqd?ICDEFGGMMJKLM''(()2*++,*)0?܎5?456778@?_GFABDDEELKHJKL--../7/01-;D,~aC5<::<>==AKFJFGHIJJOPMNOP++,,-5..*HtƁ3,3?V:5^j9;LE=E?@ABBCIIFGHI&&''(0))'7_((./2H5=18D2>=C;:<<=E>@@BeIIEFHH%&&'(0()*'&*+1,-%ts014D17X]5:;? FFBDEF$%%&&/'(.))/-)I)8-@U.:6@99B;==>??EEBDDF,,--.4.//0,65+64=83372;@?<{l<@GBCCDEEKKHIJK##$$%-%&&',.-(%<*)-5-1>.8834=378@9:;<<=CC?BBC##$$%-%&&'#.-)*&*,,5+5G,77443568?89;;<@@B""##$,$%&-,()*,4,)+/*065134556=788::;AA=??A"#$,$%&&%,+'())*+3'C\'54123455=67899:@@<>?@ !+"+"##$%$+*&'(()*2~43/01234;456788?>;<=>'((0))*#0/,--../6*Jc+9856678:@::;<==CC@ABB%-&'.''(()(/.*++,,-5.*26*167345567?899:;;AA>?@@ !)!""#*)$&&''(0(*((++21-/0012:3466=<8:;< !"*""##$#*)%&&''(0(* ++11-/0012:345,<<89;< !!)!""##"*)$%&&'(0())*+*10,./00192345;;799 !)!"%#")($%%&&'/(())**00,-./018123454::78;<=E>?@BIIEFHIIKRLMNOPPUURT VW]WXYYZY`_]]%9;;=D=??@BAHHEFGHIJQLMMNOOUTRSSTUV]VWXY_^\]^899:? FFCDEEGHOIJKMSSPQRSST[UVWWXX^]Z[\]7889:B<==>??FFBCDFFGOHIJLMMSRPQQSST[UVWWXX]]Z[[]==??@GBCCDEEJJHJJKLMSNOPQRSXWUVWXXZ_Z[\\]]bb_``a55678@9:;<<=CC?ABCDELFGHIJKQQMKKMQRYSTUV[[XYZZ568?89:<$CB?@ABCELEFHHIJPPJckNQXSTTUVV[ZWYYZ457?89:; BA>?@BBDKEFGHONMVOWRSTTUU[ZWXYY345>7889;;A@=?@@ACJDDAAFHNNJQOWQRSTMKSZVWXY23455=67889:A@<=?@@BIBFv~OFMLENiULOWPQRNTVWWX01234<467788?>;<=>?@HBv~LAIGCEHE`fKMHSVSTTU/0012:3451uO5;<=E>AnwIAOLEG>m^LPPUVSSTU.//01923455/qN=:<?A@BbXCDNlCPKNOOUTRSTT--/019123453>cP\~P7iĩYGJMMNNU+TPRST,--/0811234493.]}O5:C<QPF=\t>HbnIGJLHMKZQRXWUVWX*++,-5./01288455667?-0DA=@?BAuA}BQQMNPP**+,-5.//0117745&68?4Le5CB=ImHD\uBPPMNOP**++,4-./066345455>82R^5<@?oHH{EHOOLMNO))**+4,-./0065-//95=A6943;:FP=F58:=CCD?DDEELKHJKL--.//600112289|C;8>::<>==??EhDQUCIJJOPMNOP++,--4.//0,757J715;K95^j9;WJ;6?zĝmr@GHMMKLMN&&''(0()*+\21,+/0-N=:;86Z\??EEBCEE,,--.4.//0\65.bw66=83372;@>=9@FBCCDEEKJHJJL##$$%-%&''('.-)(3++-5-1>.8823E168@9:;<==CC?ABC##$$%-%&&'B.-)*(*,-5,5G,77441568?89;;<?AB""##$,$%%&#-,())**+3-)+/*065134556>788::;A@=??@"-##,$$%%&&,+'())*+3&C\(55123455=67899:@@<=?@ !+"+"#$$%$+*%'(())2~ 43/11234;467788?>;<=>',((0))**+*0/,,-../6+Jc+9856678:@::;<==CC@ABC%,&&.''(()(/.*+,,--4.*26*177345567?899:;;A@>?@@ !)!""#*)$&%'(0(*((++21-//012:344566=<8:;; !!"*""# *)%&&''(1(* ++11-/001293456<<89:< !!)!""#))$%&''(0())*+*10,./00192345;;799 !)!"%#")($%%&&'/'())**00,-./019123454::78-;<=E>@@ABBHIEGHIIKRLMNOPPVURSTUVW]WXYYZZ__\]%9;<@?FFBDEFGHPIJKLMMSSPQRSTU[UVWWXX^]Y[\]7789:B<<=>??FEBDEFFGOIGDFINRRPQQRSTZUVWfX]]Y[\\=>??@GACCDEEKKHJJKLMSLZlNXWUWWXYZ_Z[\\]]bb_``b55678@9:;<<=CC@:8DL@gBPPHxKQYSTTUVV[ZWYYZ457?889:;;B>JFAKEBW_EIOMN\NWRSSTUU[ZWXYZ345568-/8:;;A>A@AJDCCFDINLHSNWQRSTNLSZVWXX23450c489:@@8MxG5@JAI[CML@Q]JOVPQSNTVWWX1123.U188?>;81PwIG7:KQ|^?HMNUOPNW^RVVW67782K899CC@A<}D?s@H}۫KPQRXQPTV\WZ[[45566DmN58MN<54?n^LPPUVSTTU./001923437-bA98W~@?EC:gèNEXED~Pr_FPPMNOP**++,4,,KW21WO16M;45>82R_5@GCEACHHNMKMMN)-*+3+,-.//52V}gsYQL478998K[]zpd?JCDEFGGMMJKMM'(C)2*++,--2:~\5=456788@?_GFABDDEELKHIKL--../600112289|C;8@::<=CAALFJFGHIJJPPMNOP++,,-5.//0,657J7157?87KR;;AA=;AVEAJDEFGHHMNKLMN&&''(0()*+*21,+/012:33?D46<<8::8;>E>@ABBCIIEGHH&&'((0)*++21-/0012:26go=4<<89;;<=D?@@BIIEGHH%&&'(0()**+*10,-/001913r~<3;;789;<?@@AGFCEFG$%%&&/'(()*)0/+,--/08*Zp-:968:;C<=>>@?FFBDEF$%%&&/''(),0/+,,-.07/9{E1:957889:B<<=>??FFBCDF,,--.5.//0\65234456=76687:@?<<>??@GBCCDEEKJHJJK##$$%-%&''('.-)*++,-6.0/01188455678@9:;<<=CC?ABC##$$%-%&&'.-)*+ ,5-/0011774568?89:;<7889:;AA=??@"-##,$$%%&%,+'())*+3+,--//55123455=67889:A@<>?@ !+"+"#$$%$+*&''((*2*++,--43/11234<467788?>;<=>'()/))**+*0/,--../600129956678:A::;<==CC@ABB%&'.''(()(/.*++,,-5.//066345567?899:;;A@>?@A !!*!""#*)$&&''(0()**++21.//002;3466<<8:;< !"*""##$#*)%&&''(0))*+21-/02:345<<8:;; !!)!""#"*)$%&&'(0())*+*10,-//019234554;;789 !)!"%#")($%%&&'/'())**00,-./019123454::78il32 ;?@AGEFGHNKMNOURSTTZWWYY^\]]789?<=??FCDEFLIKLMSPQRSYVWWX]Z[];<=B@ABCIEBCIOMNOQVTUUV[YZ[[`^^_%667>;<==CDsrGJHIJKROOQQWUUVW\ZZ[4564-3<'kiCEBCHPMNOPUSTTU[XYY35/pc4;;WqfFeuGJJLMSPQRSXVVW64>@Q?<5tY]mJMNMOSSUUV[YZ[02-Oz@dF]DBLHHE[QOQQWUUV/012)+{5:XFmtHGEEgIOPUSST-/0622/R@T@JO?FEsUKNOTRSS,-.5.,0'>fRC5cm:GOv~ZPGKLMSPQR0125BZF5AHyPf|HdOMFNMNOQVTTV+,,'~ݹ:F<27D ABEKHIJKROOQ*+DMpLa,7DQ<<;;>IFGHIOMNO)**1'?@AGEFG$%%+(('$$l$)vX:<=>?FCDE)**0,--.)s(>K3f^=@ABCIFGI$%%+''((.*|2/7C49b]7=;;==DABC#*&&''.))1-553/05<99;>@!""($$%%+'())"'1134:6789@<=>&''-))**0,--.,Zo05678>;:<=B@AB!""($$%%+''((/%BH'30012968>:<= !'#*& '-*%$+1./00745#<99; &""##)%%&&,))**0--//62355;88;?@AHEFGHNLMNNURRTTZWWYY^\]^789?<=>?FCDEFMJJMMSPQRSXVVWX]Z[];<=B@ABCIGGIJOMNPQVSPPU\YZ[[`^^_667>:;==DABCDKHIJKQPz~UVTUVW\Z5<99;?@AGFrxMGcpPRNnSWY134:6789?<=>?AftKn{fKRLInQW678>;;<;?>>BCDaj\FLQeViV[1128665:zP9>CCKIeSmǥWrPUV/007350R9;AAntK]F?֗JFPSST-/06232?l;?GHJSPQR01285678<7?C[FgzPUODWj]STTU+,,300129645:27EOIFOOQ**+1./017/.028DQ;6e\ufJMNO)**0--//4YymZO5255eQ>XTCNKLN(()/,,-+EtJ6347Zb<:@FLIKL,-.30010AD@9LQP.1Y:uC|=4g>JHIJ&''-)**+1+"GhI8D\l#/I@IFGH%&&-))**0+MG`t\y7 K-~8@ABCHGGI$%%+''((.*T\007B3;7=;<==DABC#*&&''-)$$*1-552)*5<9:;?@!""($$%%+(())"'1134:6789@<=>&''-))**0,--.,Zo/6678>;;<=B@AB!""($%+''((/%BH'30012967>;<= '#"##*&&''-*$%+1./00745<99; &"#)%%&&-))**1--/062345;88;?@AGEFGHNLJKOURSSTZWXYY^\]]789?<=>?FCDEFMERWHSPQRSXVVWX]Z[\;<=C@ABCIE<>HJhyPRKKU\YZ[[`^^_668>;<<=BHI=DRYUTUVW\ZZ[5564-3;<6:Yg@KSTPLSXXY35/pc4;7w;CMB{KQNnSWX1/A83>:rFI~KQLInQW\64>@Q?;0ithٱBKQeViV[02-Oz@bW|EDRHekǥVrPUV/012)+{1:nLTrH<֗JFPT[-//6220RCiBZcCoMfILOURRT,-.5//1*?fRA3p|8FYyRAHJLSPQR0127<{I@3BIyPf{PVPCR\WTP1.93V]6>7;ZKAABCEJHIJ&&'-)*++1+)/066>:9869B?@ABIFGH%&&,))**0--//1KY5889:A>?@AGEEG$%%+(())/,,-./[j36789?<=>?FCDE)**0,--.300127;szB<;;<=B@ABCIGGH$$%+''((/++,,3/+,096 8>:<==DABC#E*%&''-**++1./0074455<99;?@!""($$%%,(K)/,,-.51134:6789@<=>&''-))**0,,-.4001285678>;:<=C@AB!""($$%%+''((/++,,30012867>;;= '#"##*& '-**++1..00745#<9:; &""##)%%&&,))**0--/062345;88is329>?AFFKMOSSWXY]]9=>ADBILOSSWXZ]]665:QRDHOOTUWZZ)~4=Zr{IKLRTXX+q}XY|EPqUSXX/-q@LLAzWMSS..dkW}QKeUKOSS+%A7=> # '%* !/.345999>?AFFKMOSSWXY]]9>?AFFKLORPVYY]]6:;=BBGFFZbRQVZ379:9=AuxaQIȝO378=bD<~`dQ.21@r9HPH?NS.345DZDWgzyOS+/022/3@MFO@)-.+^V22vIMKM*-.+UmCNTWSHL%))**PUvYHDF&**(@Jm[-@FF$(/A*fo3`?:=BB"&&'*%#*+78:??#' +)'y.278:>># '%* !/.345999>?AFFLEFTRWXY]]9=?BC@DMMUYY]]6657`U\qOQVZ)~1Iot\GȝO+q}gsytP/-"uFdjNBNT.1LLT~QWd`dQS+*qY76?CeKO`),11bW46\pFKKM*.-*Uq<@CBxb?FKK%))++(+s{23;?AFF&**,/./nu69>?AFF$((),+//065:;=BB"&&'*)--/4388:??#' +)-./3378:>># '%)*+..34599t8mk@ Kϭo,p=Y3E,Wso ZJr(292z<F/{ v4\…3h8mk #:<^"?7Y`B[l8mkH]H\\r^ts8mkt}~DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/DisplayCAL-3DLUT-maker.ico0000644000076500000000000047520012647526530024225 0ustar devwheel00000000000000 zv (@@ (B00 %@6  [ l hvPNG  IHDR\rfAIDATxڴ _Uu/;f $ H”AA: XgkkU_mk>gsW[T_Z[뀊Pf! !@z'u[$}r]#Nv|jмƍGEׅ]70D4bphbtH\.LA 89 Qg^$j2W]Z8>1DY+2!tiĔ`ldtJvdެW _kXm-r 'T u-τPe[:;1>>NGu$DLk̀Uɗ!LQzzڲ:::b /󥓊 _츠cJ GFL+ۗcq-u_6?p^8t0uy*DU׬p 6OכgSS%`|="$B"7".p<gaWiM=< T͟yQXR7QR P\UJ.XoŜ 4&ct,@H z $#׉o/0&+b`OPB F],G5W.#tm@3m8nS6x8 Nr\\ϴh`"MNUq[.lpU*Bxb|oK/*J1ܤ)麺:KzjP-ЪroJ8Z\M0`L j!w¨-vf\UQȏSr{1" :VM&\{PA=G6C6nUuT`t}MLE4):d*Q^({\S갾 gN|I PUR{{TX l.E( nlɤz^ El;2V=T}&C > Md/&/ * @ (gpv|Lë@p\㴟f͂`M1cH<3 ]T,rWw00I [{Qw=*ט~hGsGˬ im@HzPO93Y/`m'9-h2R1PcNLđ$L+==5SfO_SzpNv4qf٫zFupfH82d^j2ZE( -I/Q/zBw][ PJ\`-\UXoL h)K[\ӁD9}Ps_¡.+7޸qϔk6lذ6kOm)Lw&E6K{W0A&^f X7f &콤/X}8^@j'We+;*)dU+YhZH+x\B9)jiȨw)OXsmc-+݀*nT$B;SF!ary$0#þ j򶿟51.Uc&Zy1 jf6e,$-q-/T[m9Vn6(٫av2vyz4|NaU4Ptr5.-h#~~<@},L9r:S&@b\\7BqC")brg±pfB\D|u50.fx}{ۤ{pPJ -4*lOCD!R0:$*\3@%U%qeUx]JF}kj]7I&PB" &m" 1GYaFhDJC dRB75I_ 84(AihF#7_aLB qT+Bݽy0jdч0˭˩Tqv̍l[b;.njmáh㫵cKnxm| 2~XN ,]]5;͸2F%~a〆K/avLXtwnA "f3@C"\g4&e&-0</CZA'@7ْQ-0WJvngZ bf͆OR:.M;׮,vQ@ Ag*iZac@ ӐF)0F16 {:<Q90F|>0Hn%FRjDŽ(ĭ(= @(MÑb0\K^I^hNN驶q[^#!C,Ǧ/$XC丫[e=vNh!t&v̹kW(.ՔT(!qmxǡN nJ̧}J#&S!>LN4ۊ7xHQm2En!(H>]aPH62ŏ 6 8B h44c1žjA!s/H^)~124d+ʂzs!,www8t:^k)S qhv ȵԼyv(x4$/KӞ{U*>Ix@~ײZXXnt+ Dhs(nK\ {]J"@EQJN\&eM k!`dLՕ ij߇ j"thUW("f`:˶CbE6 l1nݺ ůitQD !1r%c&iZ9( 8TP' l( 4[ .!@ 0ONBͦfnuE3Մ1h@rvjli˪}KƗ, 8*KGNͤ;"ؒ0sW 5P-o- &5Ը@[Ro^~(5a=ɅT~7`K $YbP8R@y RY)Mvg_ 3/Wp? ;bhN1j8 CO7Ej V_ :@ֈ!\"Qj^X@E84,^ȓ .8)B V1R85aB6#i9UW{ܤGN%l%%uXiUp)J.f!222[][˾vH/X+-౾'2%!VIl/,Ov7*H+tFLo`&-la U;(kIS; L/o^4i BC ~R^#CŚ+g4dppPb5H+дzeJu\W*Ҋ9{*PshU3ƒqsbGkoO_P]rJ$FW`D!GY]XɬekHO,X6cA܀Rg(my'נTu @@~To=Qbz BboH{G > z|r! we]qgNhW Mpaoo6"$ \?#kekzՃtznwW\ϴ hK(omRi3/F+JeeF>JtL2%,=ܣʄOchT݀̚<9_},rq絰B6H@ej32y9HĎ23K 745"Ulʺ Y4@֓'I2(I}dC(W%{<PLmS( .H0CǀM<oJYIA WT x@RB, 4x9$.Y0(łV*s21dRԓ8l[!pґlG{dIQx)$xTZh RMj l/q(Jl2?5@0׾Xtgk{_*bS\J`~ ڼ9ɺiIKC /OlF Vgq?P |ՆESbWi#l\Y[l_㨨ZG(KvMXE.c 4H,hk.`Q8E.=Pry{Uw~)^i!&nW3 V4Rdx| 9%])CZ@4JBF5Qy  @I$q)v)F4k%8)jEI"j%ۙٓH"e-laRC0_6-`A/Jp1bPOt۩9ݮ K$ttX5:\j nnޑ;ŞD ea qh)7O8 LYs t{% @d9+|Iiqq6&HJ@ =IVDF^A"ozk_V.CERՐB@v+:<6:j;Z@U۬ ^wPD~Vmñ#"J~j,Ǜv/\bgFQm&F ^E~༫'čwnZ`h,jy5#@5FGylucE)Lo9 'DT>ȚQR7#2x_t=k{ t+@6 ytH0ֳޭ8=[A=~lP[c)G{r*Wgf@XJHytе=v~t,j\[ @ aveīm0gSg<31U>{r ۽a>pH7;/,/RfG]>"RusL. K)~!rry=UmV涇:U9nqdnf.FI(/3I^*X<2P@dG ^7|ɡ#MmXY!,J:u>WP@!*!`%mJQJdRLK t+&B @}nmK"?eny"^om ǫj $os]TȄ a ׸H-,ҥG5־远 $tׅ+ϫ*8)hԶd@>0$H. ޫ0JpśʴiŇƘ,+pxlqk<=,(@ gNچ}.H8>a}FA-} ^o4p.Ӵ4]N#B,X`(lM>Ū_p}Wb^mEخ6}xaN%JZB$ ƔqͰYhɄ G5Zrc`j3 ⶃH4s2@Я{NM[8Y@v(vf- 2I&z,YDh?iJ_ X)Be;fi`&:QIt~uzS?uȟ mz026"~S =M}_XIN<~pG02P#<^ާr2NN@ DDQ0(` hȈ,#Bq.oK>ȉOiDcHΪ +!6- zSkJf/^_4#14d -'~a+x?"^a*08䎴0mkGaNrq>PYxqA5QrSo4-2׌e*nZ?dM)ҎGԹ$$[)Y-H7h/]sSd} B "銄k^&(jEŬ؝eˆ(**C_OouxiI Fx)TI^'UG_W ; !Tڊh UP`U \OU-fMc %8\4뾦X1'G%:$N2<`C-]<<@P^QWсT,lL}ƞ1G`MK'䀡BHiR݀<+$M\Lrx6XcߔK8]܉I%ڀmOup=\5cK5X) [ER9uv V&z{]]+7? -iA<1Fq@@Hp#- DJ%!qIZ1~K^mNiEhMq!^(@"j,+TF͑f DS-U@%|fc $+^7Bd)2/O"zavoʾp)3VboC½ݽ.c"XQ|P$BԑNNnL05r&aH6D N櫮D79 ېi`ǀ&'k\bć G}n_F&C/zqh Bm%ݺ( ~ӱE2pʴ8+uE7V>'hy.TA SWʽ}A lS܋im8o%܋%>'*&{{s RKKPnu7ogsyww@:  bfv`_ ?nz/G@ӗ~'M"AF&u١DrS4\D#쎔P!ۤN| 8uyXNYQ%lte3qgNF+ 6;z104T?O 5T9qXcj.<1]ISX8Q8re.k1(hK̙p)0}ÇǟơC6.A/AWWJ ƪ>i^,0ar?a`}ȳ'S= x@XHfn}Akr;qp4}Hiչ> b BkKZR#N"ъ']x7^i+3ׯp-Ƴ1"xBFH]}=fg k & Bda^:+=hxh(,T'O? $bmL`[tՍiUɯ ]Rx-DgHy"qU>Tz7W=wGqQնeo} pYOl~37d yQ@* {ųHvYe̚㕟8,V(ummyqXz wIvk *iMEETu Pn,靗4 Y]{l$\{ڒRTe 68m뒾KcdY& >`_תZ !WG=*"Z1je`h>$ 4%%$0b /źLd*k2( z}xK? ]ď~^ aeRK$% AX=F?)hD Bi84jg5` PD}t.P[݋7nrpf$1)}bLۗfAx50sA3 <[&K0d $Ct&\-Fy:ms:~oƧ1) Kزc̦oc9hX]yH j-R.5*Qy]prIKT3.|Ɉ~BXhov\ZGgV d:~Ya^A2XV]G) Y1SrY_YH1A&Rs͘ 匹Y6l>Q*O _){i@EƷnzRZunǬX{u>e6&G͏42 JuJ0"dFh*6mo3BeO/c6ɟhͯ4`4jH֬]S&wz;E8U2=/?i#ś&Hڈ Iz}l1x `[lXꧦ|6{0T.ca7i ûl>#Z=N=u]ަc~7њQ#7U{1:'+e/rq\S;Ome 0\=7 ή(+lśeX]A*ӟFbL.?k>GdQqw)X `mqNdJ;Os'ѰGY3}yN "#6=h %M^)2 gԒ|5Vߖ;N TaLXq7~jI{4w:;{)ϑ_iIR|m K:@TUI203+TN@^MoyKN ֽ ]UL1:_[`PBX1?5t; YnK<[% 'yssXyyK-*m<[<+ZmݿŽ_TciB'u{z4K%(±k)\a ss}UBڤ%/ <:n,kfNn%\M*[(;}/738C:Q]/C?c6vƿKHOم_0Qf N*>P`Ю=J%Ë_zmH(yh([۶=<5ؓ6 }O|Q\hR屨L#/ ܆ |oB3#4"ذ$yDCpWμJ E^Veox |n%ZxwrEM3?3:b_1۪mr/Ӈv$OCehC)4z R6Pn/ t$9 {W̞,Yz'MkGĽ| ۷?3J &hWI7:G1_hdٺ)>LQl^d+MrZ'9 dmmS%{)mM 6:2 "nFbTZ3 BrExT]VM7;wVviCZ5 HVǐ BMĠD 1ju2O-xe``3ّyXn{؁h$ս/]Y/Җ #i5=h5ʌ'b*ؙٙ?;z{04<Qr*JKV.=3fءC{mw`A5;؃-1K@cgy<|_Eң24n =oqJ6ahI5D;(NM ^|gE1o#={Q{?Dq;]>gҸ sBשs^x~_׬9 n@: @ 1FجY-. ބf%L@j,.OG/^ijp0aG1'X:gZoc@%Ɵzf<{.ظe$$[.ZCFB,:R f?xݤ J Og^ȳi.ʇ\"ФX̠VڄZ8~QN&P'kМt|RQrP'xe~xE6H .}7Z ʧxhp  C+M0+U3Kdd)ӎOgm=͒@>IΔ`Y<6d\L a܊i<õ<wE=!d{T/0b=qnp3KeIݎd 8"\ "WAc޼yOG0m9x;c{ 304jn̅vxY%Nl/'….X XEmw# qMmקLdE .3RldHs`͙kʲqrhR%FD?uz{+qH IN}yN/8DHk>+ڦޅ9oIƃwᮻa]7uR`h$RJk+HEw"'Rb|rdW^U[){FZ7:V"taڤ[m᥄I~LDe 1643+5}Е{1e bw< H,-KTxޱX{1g{f0$jg6}c)H`DAktNXOw,tX`w|Gj ʺk RV] pmn8CrU~,4V8e{V~#HէW}gѲGv=#ؾratL/,٭Kx v$k;7PO0Zmx"D)_=ZA$ʱ`J\8a\%s%+ _HUzEIYՈ靕rɃPW cy|%E+.BuQ{m߷owט_[#vp #>8ĕf۱pax؈J0}<]}M,x9%8blX; 57쳟"2KkNT<:1==ӫhٰݻ rieOd 7 U'5qr(ǙLMce.Ox -у}5fBbϽyK~Jn0zy6 Tm3ͣoqzW<6޿QܫY=~rzI@j)Ξ[0XmO| x#`ŋWaժ++j+ҽ =t3Ⴕ$\?YVր6)ܢc`{u`ND@b˯nyY,N?l/} U 4ZmrZe O̵*Ɋ ,4 ?c;\;B V?R2dJh.~J38<^f3nd 7[xVUq+Ǚ'!kKo|!>}jM(ey $گ0 p;;p(Mjݖά0m&t{0: L0]"<Ԩ лb1Go) EwZoR[ȶm;}'UuY"~Qֆ1v61-,Ze4:Ӑ#064{DEY1X 055kI 1?_ՇM*PšhBhy-2scyX`Wd>I+oŠ+ JP&^m{>)/Zp|3VΨѻ[ F:YW-ǢE^? Wv?O݇]0|H<[*/9yUE+bǁ;~J/&[_ku[gE.+݋o4NmkMeKQ}u(ov=AWUaĕUH&eDs@\p)W[8\n:KMa Na IL0 _;5˾FV@C5q<)#!"Rrdfshi1`qsga}8d\,AyE >ŠBc:6#Z#[qyfN-Xm'cF vOhr$=#6<*&@6MVޕxi<"i)"Oba ^[k%WߜaLJM& :)Y7&͛ŔLޟܶ unZ+ +'[9` e7e5C6 dz+'ճx;1N7 m"Fݚ_Uz>8-w14D% LyF'#$O^~`+~:x3Oa>s3 ۅHϭa5:e5 nu%RogQ,:5P@ mH-ڷ o ɶ44e>E/X,ܼf\kd.LHl',F; P{iN"|az>MlR )_o/?_c+O*?tŖ;b 054D: 5o} p@ 7z%;TAPK34l kJn`w sb@ΈlL~ N!lWFb<ލX,yVφۏ4_:cGIo֕F x1yBå k+BRlII63q*6-8QQLWI~ HޗQG6Ee$Aٳr)j?SʹBh%0X8pf̟Lc=g.|b,u8Tx/YRvuecI~#*!CeOf@]oJDDP4lXp*7G@BV %5{nFūq+Sf@@;?or1k,, K,#'Έ(dYbODO4[q܇8"f.@#K@hZQ^*`w=(% {XN%f󖞌Y 3O'@N>.ЇzEߋឳ$Aؼx@z@2Dn:q%yGjw&D( TܘA7HdfȤ#`WLysʋ+?Yf? $W*z9sWUB@^nl )=iЁF0ޥ^ O@l*S^sT%SlD$ mD40:0v l76(d]xѥ8yڨ>thWܫ"[]ő#sCf&N%N,OG=RQ^{}P0wO,4ɃSO?{N,"ElB~2VU `!Tjwҫoˆ(X=xE^O -[,g?Yی>۬˪ }бp,'qӃ7a\?ߩ6-EޕFV@NݢjW7EUJK)mB˙a3棻ÛPIc?mFLi4eGuQs@5? ,d5}O^ SfKb2|rQ-Ys#,ZD3݂{;&'}w.}J0a8;=,؀m3"lc&b@!8/@oo~ HR Rco/sϞ^<91ο;$oh&A M19y&PpL~gB6HUOPo<$gS !l lA,jXQ}U@f%UFƒ$&O4FQJ>q0HO t-sxW:&{ek6Np\J! Gq-`W\M-GhC(2&$\ ^ZqXyɥ1ȿ£3jnْ{vQèU&o D?J%~98f^tvv  yy/2f jcnoD ލEXBs__;f>0#I H)CUJr@_p4Xv٨7Lk=uՆ/18,4=4M!VEZ۸m'/]Y33g?܅'Ϩ|]1pRaZS<ݯ|UT 3P.\H}1*ևvee(~{g@Nu]:@0']k(),i9G݁@H҉]E^iGv|CkA-pG5Vl'I5-pUCC|A/F#N\O;+`֟aKϺկt2#_G5TO.J,p?=%kJYI̵m}8p``+%L#YG/y߼eҙ-?ȶT FX[n}؁bV@&δ Nݮ<2DVyrJvަwQ0ޕP-m؋bj| r1:Mm+~$JI.ɯ@$2$A!Zej,Hي}`( Ī,oCy,5KϾC]RG3;q^NPE-|hU. Ԑ4"ɖ5kΉ8aq/ڲ՚`SxzHGq1GC+%8uhi|<}xItѪ].aIKPjbӇD2HךTEno(ebVGq V]+4G% V~$ jdxrE"ŠG*eAk'"I 0p~h1*.￱J/_5aa?xQo%G "@j9U'a#J6b37.'` #ےXaT%I=$uӧ!۷ߐfRi4#8(ƖaSŞP!h:@(Pىػ%)B㣨m PH<)FS#CR]F -ׁ@"HUKh(}Jp5 %`2EUWᲾ0w\Uw6}OVO\2J}rѠf :@jJm ъXTȻ/GU6}:8v;0_hEŻ2H YlEƟ΂h1+ ibfoARL - /F>/oT<8Ikο&(5L'[WctUaN7"Aac܉6DlSPCMS78\/-VR% x~4?'Qd*HiաQ cT,wZ~iNԨˏC~,1D9PѪ$YQPcG-W [ա뗮i3#ƛ,&q;q:̡ JGZsG)!+l4.#H+V`Q}a#1g.݀lJ1W фUA}bSG*AFtl!@OE*0iiy8[zu)`)</i\YG P`#i%QR 6/Uc(H]Z|1 z/(dn l=ӃCCBb겚h[d٣Ж,پ}(=&6lctm6^Pݢ+,SnkÈbA$aAZ]CLD:e]WUćmrs6$ +vVgJ@lUiZ6dfvw)iHLq veƓ JTg,e۶L"PZ k[- z|\0{!9%/i&N9ZC2퓫L6W_/eW /Z_7#hbHp%KpBw/ڦU~L9C#ؿct%pT:Ҋmr|2᪃i(&m~j\뎩zߍzH !xq&Zܻ4 EJ0'{)8&0e:zX)5o_/(wTVغ7yUD *)(X7jJ:*r#z&_0Mâi}eҤ&OOx-q8}6~3 ꄔU B%opEyE=D:? siW~59v\sKX1VjY. H0J$[nYP{ (%8!gƕwM iˮLQIAQV`@ B;^IT gί2irSJ]XЃӴ+``@Hsd^)ϱoZ#H~]WnK%AĴ,+9 F̩)$v ^ $2q:7Mzpwmٲox>U )`INڀ>QiR\J3)$(,_W̳y _OafIȕ'%$<h1YW*TSw\$v45/algݾ 0 >C(աǙ0=kѻ6l x"s5, c'8M$e)cLn͒fU*߂e=Xfs<TPnђ5k^hB*q!'?)fΜrݻ/{!s/y`Xp)5_&˵/>x3왿;we6IpI8xx湊BlBޏٸ4|`6V޼EP4娊}&Q bdB܉U{6,ǻ~]qu׷6X[__v,H$Tů}-zX[; 'WڷFv5'%fԉp@0\>8߫pSzj@(B,g fMoMWx{M of$^r @ngF(̶e ;}lg\> `1|~c?GE`1b@ABUU/yŋo}̀o߬ Uu'|_ @XYk((u+3jkq:v3mkvq3ťuiVE*N! <='?yzٗG>jD+Y^y*Vwݬ 2ߓȑ|ب{`Ʌ󩽲w 6n"Ze/K>Cɻ$!a سhkq*BbSm-TK貟 oQ cBY}19 -ƪ14tB,i.t~13'z4 ӭ Ɗ9?9t:NA8B[O0Rr`^L4kT<?c?O8!ph}OzŲØ`#E6~1ʺehxR,Z@tXg_o>J +sf K#T_p{XE(<7`)"H^ip ġj#sK-)YJ dN@u]m) kLT((O@lg""-Tˈ8d؉o# Sa$3t "FDۢ'mGNz|8p/%jCt/ۡoV}.r:;wf$N!)uv>.gV Iõgic=N[9 ^Dŧ00"9Tr5D8hxIgߗuKt;"ek ʫj)G255x/O/udD3~^D4qU.~I~FNv$*`126fY<(8?| ke& F{-7m L/؉ɤkqԦuYg~2Xf˹?ޱ(89D!i7n `'ЩLǚk_ ߐ֭rC:+hx熀K`//şʥD~mxX {6޷+wN?;j~q!4idD/W!jӓ4E"$Y1=^G|Je_ѝ'tŽxF%eSt_`ˠPϥk~.ӨvHQs-O։hǐOMwyr3¿'Xq6-]T>!zD/>aCрEە)#z^FULb@wöG>c*-!@ͯH;4H@!ݟI0RXtt ʕTG Vl&''[`Ԁj5#P4eZL6yЯO4tZFnVgqAT! s=ҷ"(Q ,"ɛR W=u픀yid2[~^C|+G\q/Jq/Bf®_$QIW]H 1qq:phǕrB4Ȥ3fp<N#O *oDzDC~KD{B 8dS. aPsLeP2{1Z|@8nL k:YDo`/q𧅿i.рᐩ!]ߛo )PI?K휀r[&VӓsnO0ܡלOfy׳ ]lrN,r?TZh]}sVYgz7{Hanr0vaXP6KC _B psvq]RW.$zeA=ܗ Fgwt&cĺKrAMCԯ8AYgrf,rdfjrm [WTX B-,*B~i:0K;gXnk@!W*%C h;@Df 1fwpSѩA\V)͂bjsxhIʞqV^x"0LJ 0Pt YkYgƿt׽p1D,rzmbәl2~M?熃<J;;UyB,/v[%DHKh|i(@WͫQBT+ ip)^"$|(`aђX?NEېLM+rLxӃ$jA4D`EJGVDDfb*laSeMn!h8zz g)YVf-E厅Kn~{X-kS~}H]y. 6Ò4激b:+im]x @P?PFPܕ L؄p&NB ux У ]gY :ޝ4(7mMop?m>N8{1t{vv#կM5p3{dD Y~ւ0T?jy@BMvIAgGL/Vڪ)3 }{Bӕ/>gu7ΎYo5DI:?90"(D%h=D810ncMa^6:$Xhc-y[2 HrgɶA1 pB\& Q)_` @䅁;JybZ @ PbJy6QFAԴI [1NɄoD(9" g<|ybjN萮!P4..10ҖgJzJ7Bͺ0l `l&kKv&w˗Ǭx 7sK~- UL8a2>dKvv\4~EFv31c2"s^%7S06-Ł𛉉,NAZ(ؗ;C5#9tXQJXhQg½,铪*g@*:|`FjZ{Y^*V.+_v% & :g?٠i+ΠeбO᧎` RR8ŵ9q6 D3eL)bF˅#MHY5E I9UGC Eݥ)`ªC@ 񊞀3b1ΘBO22)Mj)rM* }Ν!Ca10J)b>={h}QM{.]d;E\@f)j7C6R*FZj5_зѧwV/Oth+=68΀\7.#pE`IF QB(utT =T› "zf!h9;؍PD@-tW`(}8 /N!+ Z mejcِQ*Q&.fNhݪu'p8L;.^^{x"ź ᐈAX9%>W zأtʢSѨaK-?~Ŝ$1'3 ꫯfр dw>;k'!J cweuzEdet @w8\Dae^xe;m433[5pGkk:^Q)jZ8zLL@r>iv^ĕ8ձ3^]ݻ=`%H~xF9͎#TpIZp9iSvY'/,z߽Mj.r^MO<}"j.*z-#Oin"l^JqeN X3ī@O6;]ﯢWSj3MosKO4d$d/`jU},xaID)E2m'mF fMg699DjUtxa:0 >I:cK=0P$@Ly%kx{O/BTv IU@⠵p>F'&]l 閦;0OC60D'aD!S$)dhyrypO ^L,޺Antg7mX4'@Dd98Ⲣ%̦&2EJ0 6Ҫ][`bN•篤%QGXjp  xN0Cc}dU8`mKnKݜ7:C0tV;QqG#OJV2vd[hDG)Ep,ELb)k .<"Lׇ>4uٴr90tʥi-;W8-׻dTs1!rv|h1wyt}˧\,}hCϷ3/4ijrF &59u>U"A8KUn2{ z׮zP$t;{@F*|5 Q}0}Wtǁ"W: pLq2vboQ9lEJ⡆^JoBj~qF=_ h&8p$j"6iw!$|o(x*‰@*QO:)DűtÌJTHQz4B>eWe_m,9zf Е`E/D>4Wm],*Mڀ#,74V}L;7q-vo)V%az伋Kyy%yd baZA5'xZ ]"SX㮻"<[磋XD^~7a,SnQ0S8hE ѐf5WT#ȫ 5qi_Z:cr:kG`3b`P"w#9 NB}AevlYw"_q|;d4. brJ NY@x+˜&ܽG?S+_C7O;8qw^D)1f4_rN3*!4E,I'}_B vY. }^ޟ9oV KY0kK/׮`d6os4>gl]?wTR:uq}38Y)<ظ&;b tož "jl{{-/}EIcMk|-'Zt Me^IʜQ^G춉pE@-qM瘁GK^ nqAaSuF5:ƙ(e7}.qԦNFu Hs.W3_~oG*K3mE گQWKY3tbC *Qȑcxú{DHdNIsNvΫܔ'w9t\J+}ô=tGbB(cs?;f; Cujc},l%zVq8ڵCFzOCYu` Ztkp+uSHD6#;gS~5lf[-\J,aI8o o~b=>.O 65 lւqzx0=O? \ ju[nd* TX>.nxM H yC QjOь`&sf2Iwt9ғ?&D Otƍ^W|^JC/IQ8hR(0..O0hBl 7H_|{l? $BܙggT%[5?(fBߗ 4E۶T2ܵ9@nr2=symK^A?4T/ m {$" 8GIpzq?>ߜtbHD,.%;+\ PS~W =ЁIZiѢz8Ptqk)')48tR֬{v3%?<`®07p#U<{pNݬ(dHqW#FBp3p|xm۔ ufLӊcr ` A0 K{5yS5!GE^V˘ԟ>LPBHV+pOQP"H8,[ {i$+2 < lJu`#9kU&3秎#}իM <+f( u)g5tst3k>ك$:déyJ8;6}h /º }iw ^f[)yIȠ4g]~ L0р8 ~2zi/ Q0+a\=WtCu>_Q9dZ9|}=|f,mKQgJfQ$XZz2qdBed9!^xQƳr4={;o LADZ_ \HK?ԳtG> cx5DgS0ѾpΞ|@~G)zݕ [}Y#EPD.j4 w#1 { g”[Rx7uSFj֦U0^k:1)=,,R#7|qbn*̝05Jv wV|ȕ&bǯ^Tӳ*"( r%56cqg+x@ %N h.ЙkVӢ$ =`@"iDY "nIUbYS)ب'3U+0y#ht\@ƭzJ@U&\y%;x 1'`Fj'#Z-LAKF9jSD tb(?M""TgDFv5} qbTK/}(pKXEF68oYDݳcFyFdt'.c-~>@hD ?"иE#&y^۳jl .GI{:'L.#HGCᣬ`3'z3]ixFW;BTFJ1(i3 n@33^ e@b[=|0i υ~LrК(+U`Məј(GDeA{PܳY=UuNثFqyϼ7`=6`N Ly}6;fS0%XA?oJ!b)+gЕRN ؈Rv8#2'r0ynkha)|-6 6Md|uW/ޫ #6KyهFV"r+Q"Z+dC̤45'鎙tp)}THSuʕt}|}ўXKM;i$V h`񊆖jE 9onzgӚzkbXn> W^ggc]g=HO|?ס>V<7 YE-ø9䫝C͇C@4`@pa4=:J,7>D'^1OAx 5cX r['),^4K Bɫ`TشԘ5Po,0xGh~~9^ȊJ #3Sц+#&QNPjWt31D࿇.6Ӽ,j&Y? ՆC}#IV. p7zsHy & 2.ʮU@2i[IjQbQ(6k / ?RF'hr/ :cXU iì`i3%%}Dd磱 (Uv#}9-xw`~!ڄ0 7_@+wWû%g:TV2G4䛳@⸁ ̓X`9n|zG5J[>{67/y&'inJMlHˌ{[~7&O}ʲ?zG_i.Ф#GD4] 4`hy*.ec6ZAEf JQ!= #6PiMϐ/i 8|{Kv_GMc=ƪہ+bÜgQS:D2>)!T[g5kVkw}65_eWN'}](xQY|&ѩK: T}x̚X2KߚnHYR. /oG|33 Xgt)2#0Z![=EEN˫kVZ ~1p_Bs8Ѕ@AbҽI-]l@&r7}>gn;ND+?.yt/-|YO [^ȱ$ Z>?䤥eNyQx]zzvͅx * 4Pi2ÊPSJ+F ¦lؒU$YjunW[&7j~BBBђL}4EHaN@HxP"o p9ॡs PSθ#||+czy|&NIk T!co~6UG1hb"+Hs?ue?ˇk7f$YZH'YP02")ԏٴrYsU޵[,t[uK /^.>`MI0ocT]jeksل9M~ <{- +զ-YF'RZx._6\+՝|ﺪ ;@%ɰPb0 ]WTkރ:UYS^x{Cg^TNLQ@}5NnuK{ޘRv;>>W~ $RZqE/Lʣ=%]RL햂b̪eJO0Q~/3,M &ʍb|rU XˤL"!i*D=ps;+.l釧`w"~V+^e" -'A|o d=/=jǡ$3SDE32e뾻Z/}x.Yڲ?`ݳ+C39gf ]U0/Y4U 9Tve|XabT<RRPtdwEFaXlcɩpfLsf@o}N`%hQ~+:Aufሔ|N_|*e 'П-D.z𚂺S?DtKs卿]];S3nT)N =Y9lN½Ue(N̑)Ǖ%s25"~A:OHB+[V"_Ԛ N`W<+@#Ml;"Jusݍ!Q43 0GTyaU1R^d3*F_%:xTX2b QMJUA?ӊ{%ġC'ǟ~tkνd~c!!=Z8hM^o~{a!{@oDXR~xz%WGQ>gN"C`(UNk υKtq,9:Zm d9D6*&.L5`SВx'(l(oME[cvXD,q)Rؿ7gaIszp њ=1ym'o`"̶5.˗K -^5GMhCC.n ))=$+t3"ɨdcJ@Hz5·[M`UA+qᰕJ>I<aȂzPԷ}†$eGd0vyAV>n+AWM4M"_#eӋF#-[/{&*_|@K.bHpxC `LDg?y𡆎57hru&6T˜B / h^{5]s65#7_@֪y?gŽ(wKkL0gXK8Z/f2٢&0yȫ_԰~Q*E;U "\wwNPW9T3 K:QD0t~t>M|r}$EE6d\Kp~W_J/;߮GHړj@] Xoo~/,_O:%bLm`b t3`QEQ/dk=ellB!i%P@<]Gĺ`&Y pgx`y}N[+XK'%H',sUIAYol8Ć~9-jO*lk@b=Q|PypCB {{pSd'.b@3@}2^TSk.h%.0 il@)kdX-JBg_x= Q wрw Dji*G!`ZR;*)IkE ʽ`SwJi 4 PS؀L%g/lIEʖZ둎u ?LD> #ټ` >󞿊>WwNA5jE; fAbG qhᒁ3/ ߢ͹Nn aޡs2hۘ/L)4&He14YҤ=b=hW dKXIv}>+'X@oet~76 *[{ Gs ad՛y=2ga-ke c~woz_bM 9~DES ngN%hȓ +.@Th`u:!ahYn'z H5\t"b,L")h`wY' Lxb&Ձ[@.iEvU08dY.'GM_a~%INbT&ZAQ#inѝص>? 4(2Ani|ua[܂lE}u/NGE<^Xzed  AJxuѹcYC%4oP"j?r. 1޴X8.\yLUD}L@17AFN$6ީMf}YxClԸF߉1e|dH #^/"qmЃX) gD;pT9+jD^RuAlmK-P9P 1r◛su`{u7jnv0 v ䷗צ)6@­$ |%Wߺ/I5V,5 rz26I捺1.ƂRe= ،F3T>ſB]A c᷈ܫweKÁF8LoϮw; 4e8U bfdE+%S0!^Q5mӂ{ 9TGJ-h,/fg-I#ʮżUUK>pK_'fJU rm03v63oUMX(ܕ>jH}œ!<\u"/j3؞=2{-DA^04805CU䳀Ec Zn ?qSRWHnPL> S c"EΨ۸YYĩNY#RaLta.ەB hBHBNoiq0yr$ځԠ86oe$X.:@\Ptk^asJ_[g|#s IQxSjI^vϵJ.pnvCY1LP(%\a^yuv1֍p(2X |A53B(b3z[m7)1۶O3-Feԧ%[)Šu ZOGR˟ .״Q˨Vm-P] s:-D-5 &lj"< 8p,[ ъit饁wNNtML ˨d)8g':8,GS4uUg_Fn"Q7oƐk_hAvWpB>lTҠMY&Z`Gf(,m5)XO3+h.f=(VYD뭳g9 ZY"XVT:KqW~DP`\t6Ք7ط) G+age|ЛH~ֶ,I("5I1cGw`6xנn๪^7W6KŠϭNXܝCrxAj &* B' 0PWcY^ʲZT׈>MaEPb "`_ (eMyzN/c$>oF*by(([pD<ȂLaPjr  naAEزBV?P$ tb&b0Vs' $c@3eJyUk+ _2% 5%4D~^[^M55ª@ c̀)#Pnk:dN- ^*cFF3:s$*h|~ҴzmAyYʃE[n```;E|Ɵ/*^,**XÁQvy&C2iSY5@~/~7N?6a9,e˒Ϗ!}m%kwuhkOSŔP m8$ߠ~y !jcb͛<#" "@pz5y+T f0>uֻcrʡ 4'ڜ XdS頗( jn `>sR})އ/W]X2[ڂsj,ñR't@Ulغu@Q5cQ54UlrRuUj#tA]. l@I+RdSr}<.vo}3q〫 @^W  'ssv$6 ;7`#t7ŸmbU,Rwb[4r۬ Bުlڼ9 "BTPќN7VCŐUجa`JC,shFc(֚VU!r8qd# lG^( Q,DA)ДB Z4w(@c>% c2MGX^ֆ2,DTL(bT PZ{ŠU}\ut~ӮTՅݲѺH+m,/[DJN@/BRNݸi|wyǝr0q}y-x>fL1YjrUi/)9Y(?&wDg!~D UE6\N3.(dFp %])D{Twlk@Ŕ!j XhH/`יbUht( KjFFKyQuȉ{rjCF[ pf \ӁlDv|u4[i}s aRR8oFrBYHtI]#9x@P;+4C1AVDfg,6F6Ckiev2GQl HYQE K]Zp>`a+OuDpzY:lplt`D";Z8 ыs#zH9qL ܭIY1&yߟ"Ȉo"({APPTH(q&PNĕ"g^ةf'+_Kmk׵ͨįǬb7% n!]r"r=`4ӉBĤ9ZJ铂%_METYhfvcd` Rr,@b|)Qz' Wc"`ȵ$,xSo#'Iоeq@Q)!`&h|R\4kc,K]v1rYXS6,kWlZB eY5Ҁ3{ğph [,5ṭ5ą?LG%vHY{}by&bhTy`-ʗⅲF^h(s.$BP+57iӁ0O!r x7<&a |R$@uf%y@Et{ȬґXGA Gګ+&qThdEF?Z&Cu-MkL{ru Ca߂P߅[\Qhɒ맞7c#ձIFS/ddJXAr6ov&wTЖX ejuq,&1&D b3, RM ~VJ/OP8:`fkqp 2(`bn.tsyȭsrt5Kr>A,X`+Zd7p7gFկ} CСC1e\3 d˴+XPp#f4ߥ@'f0`o[[^MPlLعÔ/{{G(NΜ zIE R- ] >`t <9؉ӝW@2XԘPmu`gزzfdԸ H[D~6N]Dݤ|Ra?ȑl\π359b;L9;$XŋӉyN*\-ҁ:'4=+pQ P.9ajEױh&մ 6ײoӴu6I]s]P/+/TfMm]mPS05CgR)?y}ԡGD@<~K^{X#?rQbX_}4<6"P 7l2TMwf.p *N @P[6=]'KqaҚfe@'~do7HSk Ƌ >*z슙i}kr&? pjd.4b]xH9X9)чHJ=[<55{sADoy夘iǵ)mGGA92QwC&mj6/4iAw$}H@db|&i򺉴Xd u.;`mkY\"YeF ~/D@_5j\5P &4ں7yY3RJ@KTɗ-Ȃ [Ȁ_Ŗ~br7$Q16>A)JnD-WҤ!ϭ1qg@L  ÍTvZx?X,Ǜ8h,g: #ّJs|Dž7e-cbThfFYR^1G\a[5 0 FfL e (OosF [ @8.;*GЃ=uKlSVfC( kt{f{#FF8u Zl}rjp^7tJXDZm3*"2 U>WÊ8D Jjfi0dW$}86i+{\|`K 갖8܉3%p (~{lHpWֲ{c +c%g8d9>fsBis+MyEH ;*5tDQb$]˚!nNo^.94c3P92#5P@>PD 絴9ye/E1^-bPv~Z8,8i64ךrYԼ8б*l}t<u[eWuH"3G%$^zc7&?*SՄ0+5}.4mWF`-!l\ `R0:J63Z&,_%b0h}kUR2;x}D54l=nKu9eaEK*)& W:2Ni:`;VosS=2 ZwdERZݘrk[!*~%TpGT- P&rGSZu.v]ҖwV mEW(޿ZzۢU7~HCPKKܝ Ŝ(Wy>{!@2l99& &QexYヌ  "$UNDįgZž ˊC9N2`u\q*YPeS;e ):rbkCvOz&:u6^NtX-!wef'si&%.Rʲ 䰯яЮ'/F|&V!n8fa<"pQA7,j;EûFEn H^pCϟF+}=YlwHauC12R4 "hfg .uѥ#AJXoy \&8IK1n2C)((s:xp]p Di &Po7RVUNu( `;6XJ^N; lldv@> dLjXؐZN פ2urfќkL45UidTMB8FC9Va&PA(ܐ}©@2n "Ya5QMQCxPR`Z ]٦>BmY։Pji,FDaoԟLAyV%#fڵN@uJK/I |*ݏjS%(Y2&҈ΊiF{Yw(րKW{-1AH;W @odI-JLJl2oM`-^! @I(`1"yU */c1N=Ky/0AN8popAFc% 2dH8'`[ Um3!5J @6r<%U5mcHdt8O0K0 c@dГv{6M$sO{&AHjԘu*P΀"ɰ~*X `MF^[uC24OI|I.{?$tl@v͚ 9J@D|oz3VvWlbmEf $Cģ qr~z[儧,`GG+" in>fiRJ2ޝ%Nr^)I.]i~֮zRSiU 9t껊M(\^ڿfJ B*Kj0=rS͌`[B]yF y4_ ȲexȈMvRxD>2c"ulm;܀) yrAr"pfIY fVťjH3YMNOL@^@S`+?B:~Ҏ9-ʑBЮs1Kn?5k<^V UL Og &8TH;Tdr5^Wcހȁjybity;Y2aIрW72 lyOuY +CP TK( eHY 'u2POQĞB,",z\qo\~.]v͇·?,-ЖutBM0gj,\,xTUIvOA\nF:])%d7NtJYoU9|g7qcQgb;0rPXҍ>SJ%PVQv }L|gR"Ji_Z- ܾ6ԔM[8!p^A|Tz7x2Ćj6TΔ2! cxuf s ҰlڴȊ ,uB##UA)fŨ0zk(ްr @ZX#=>bGp"u;*yk{.>̈́{Yͱ $"! n* ]e"$fAҗXz05J,{8E8hna_>#JYi<~+]&2 [kvB$r{tHRr7C AQaXUdYUҁUUh/Û9qzc@U^3䇮'{%թPiwqA`Bv׷E]S <̀OJci͓bX8L0[Sk;uꡖ2] 5LэYwZv47p;DxEAlI`EGFP *g4Ҍ>Ll=dֈa,< ԩdf̰d5"؜rL}?r.L :]XҫrJ!Rz + ٤6p$lcӋxTF' 81ChE$Ih$D&[n郲J!S˽ 3΋Suy`ڀ,c \*ɞfVF}!Mp ieЕ"CW!=j5=T/ \æ,P.yrR}L夥+zMQSpC3`MhY8\mK{u΂ [K~d${ڀeP:R8|Z8E=\4ۤ1JtٺM rTHݦED&wǡ@ܔL;6](+NT??LAiNBGʇpEQpX#C d6By0ə'Jm4ڐ< 'k0U2H~X5y{-[׻W@WSI̋eA.4m_pfS1 u'f6" gƷ5RIf 0æ(v 1LRx8V$M#M~pBXF, L:(A>htArpJ@hs6!cfȑ:D#a㈽`,!0W/VŦ.P 6u:'m-SxTSwq7;ԚeVVR/ݼ?rvӿ*2[ e*m`XɮڡXEbiZ $Ǫ7F)^ 처 =qrϒԬ/@N3A-I{ȶqW@3XVdc>炛Cxr%f"4b~D^wɊxƴgC[|7:diׯ/jbfӹ] 20Xdp.Z#St)lwPkT3_oFE  "RU9#wOF7+3'd2c6kdU595Is d/]K& Pq;011J@ٯN[ր^e͇y /7qYWEqv0ȌVCL5߅ZZL)Hrl.P/}! zZ4oG۽IL]E d־{@NM !9ݮ-"{B""DDvMtWW;;-tOwn1q@ҏ7[@_E'ypP|n=0{~$8f:4"r>ߐˍswPjt_-u˨Y޿|;h+_FФE!2c&mv8tۭSMO*=d%Pv b _̇.8hGu U\提(  %m/kHz7wGQ9܉&x/ccƁ_Fʋm(&rj2+x_??'4KLf heұ؝| ^hZTwPVN3BH+[^m0UGHK'VW턤j+]At:L.Y[T-qCB!˂_AoQ(,^A^ \ @8dhmMfǫ;w ䷇&2=޶h٦^m_ Q%zFke 8;ҕݼ01H3-yPF*](|}Bgun[OIC b׆Bz }<(mv $t[X>C.k٫ T&S6~ȴ~[GZTC4TW abQ5`DoQ,8ՅC>ߐ!.;+OrĻy"1kʇK<2`IA#1 ֙ՈpkE/K>3Py+G[hS tg2du=E 2Q |?'p7vvFODҭ͇y>?r/!uf*ݣ%b $ z!@`d} GQlP5N25HM4q/ZEFײ ԅ0g5҃nU@&JC ,X _k4ZygjVVIENDB`(  \ ! ! ! ! 777!!!!!!!!!!!!!"!""""!""""""""""""""""##"###############$##:::$$$$$$$$$$$%$%%%%$%%%%%%%%%%%&%%&%&&&&&&&&&&&&&&''&''''''=<<''(('(''(((((((((())))))))))))))))**)**************++++++@@@+,+++,,,,,,,,,,--,-------.--.......///./////0/00/00000000EEE111111111111122222223333443444444444445555555555555555555III6666666667777783 v ! ! ! !!! !!777!!!!!!!!!!!!!"!""""!!"""""#"""""#"#"##"###########$$$#$$$:::$$$$$$$$$$$%%%%%%%%%%%%%%%%%%&%&&&&&&&&&&&&&&'&''''''''''==<'((('((((((((()()())()))))))))*))**************++++++++++AA@+,,+,,,,,,-,,-,----------../../////////0////0000000000100FFE111111211222222333333333444444444444454555555555555555555JJI6677667778878788888884 / ! ! !! !!!!!!!!777!!!!!!!"!"""""""""""""#"""####""#"##############$##$#$$$$:::$$$%$$%%$%%%%%%%%%&%%%%&&&%&&&&&&&&&&&'&'''''&'''''''''''===((((((((()(()()()())))))))))))*))*********+**+*++++++++,+@@@,,,,,,,,,-,-----,---./.../...///.//////00/000000000010111EFF111111222212242443323343444444544554555555555555555565665JJK767777777887888888888898{999 F ! ! ! !!!!!!!!!!!!777!!!"""""""""""""""""""#"#""##""############$#$##$##$$$$$$:::$$%%$$%%$%%%%%%%%%&&%&%%&&&&&&&&&&&&&'&'&'''''''('''''(((===(((((()(()())()))))))))))*))***********+**++++++++++,+,+,AAA,,,,,,,,,,-----.--....////.//////////0/000000000110111111FFF111222222222323333333444444454444555555555555555566666666JIK77778778788888888889889999999: < !!!!!!!!!!!!!!!!"!!877!!!!!"""!"""""""""""""""#""#################$$$$$$#$$$$$$:::$%%%%%%$$%%%%%%&%%&%%&&%&&&&&&&&&&'&''&'''''''''((((''(((>>>(((((((())())))))))))**)**)*********++*++++++++,++++++,,,AAA,,,-,,--,,------./../.././///0///0/0000000100000111111111FEF122222222333433343444444445555555555555555555556676676567KKK78778788888888988898999999:::;:::  ! ! !!!!!!!!!!!!!"!!!!777!!!!"""""""""""""""#"################$#$$$$$$$$$$$$$$$$$$::;$%$%%$%%%%%%%&%%&&&%&&&&&&&&&&&&&''''''''''''''''('((((((>>>)(((()))()))))))))))***)*******+**+*+++++++++,++++,,+,,,,AAA,-,--,--------....././//0/0////00000000000100111111112122FFF222223234344343444444555555555555555555555555557765776777KKK7778878889888989899999::9::::::;:z ! !!! !!!!!!!!!!!!!!"!!!!!!!!888"""""""""""""""#""#"##"##########$#####$$$$$$$$$$$$%$$%$$:;;%%%%%%%%%%%%%%%&&%&&&&&&&&&'&''&''''''''''(('('(('(((((((>>=()))()))))))))))*)*********+**+***+*++++++,++,,,,,,,,,,,,BAA---------/.....//.///////0/00/000000000001011111111112212FFF222333334442344445445555555555555555555555665666666777777LKK78888889889999999999::::;::;:;;;;;;<2 9 !! !!!!!!!!!!!!!!!!!!!!!!"!!""!888""""""""""""##"""#############$$#$##$#$$$$$$$$$$$$$$%%%%$;;;%%%%%%&%%%&&&&%&&&&&&&&''&&''&'''''''('('('''('((((((((((>>>(()))))))))*)*****************+*++++++++,+++,,,,,,,-,,-,-BBA------..././/.///////0/0000000000000000011111111121222222GGG224224443444544445555555555555555555556656765777677787777LLL888888888988998:99:::;;;;;;;;;;;;<<<<<< ! !! !!!!!!!!!!!!!!!!!!!!""!!""!"888"""#"""#""""##"##"###########$#$$$#$$#$$$$$$$%$$%$%$%%%%%;;;%%%%%%%%%%%&&&&&&&'&&'&&'&''''''''''''((('(('(((((((((())>?>)))))))))*)*********+****++++*++++++,+,+,,,,,,,,,,,,,-,--BBB----.-././//////////0000000000011111110111111111212222232GGF433334444444454555555555555555555565676767766777778788888LLL888999999999:99;:;:;:;;;;;;;<;<<;<<<<<<2 ( !! ! !!!! !!!!!!!!!!!!!""!!!!!""""""""888""""""""""#################$###$#$$$$#$$$$%$$$%$%$%%%%%%%;;;%&%&&%&%&&&&&&&&&&&&&'&&''''''''''(''((((((((((())(((())(??>))))))**)*********+**++**+++++++++,++,,,,,,,,,,,,,,--,--,BBB........././//////00/000000010111111111111112222212233333HHH443444444444555555555555555555565566666777777777887888888LLL88898999999:::;::;;;9;;;<;;;<;<<<<<<<<= !r ! !! !!!!!!!!!"!!!!!!!""!"""!""""""888"""""##"##"#############$#####$$$$$$$$$$$$$$%%%%%%%%%%%%%;;;%&&&&&&&&&&&&&&&&&''&'''''''''''''((('((((()(((()()()))))??>))))))***********+**+++++++++++,,+,,,,,,,,,,,,,,-,,---.--CCC-//.///../0/////0/00/000000100111111111122112222222332433IHH444454545445555555555555555555665777667777887778888888888LLL989899:9::;:;;;;;;;;;;;;<;;<<;<<<<<==== ! ! ! !!!!!!!!!!!!"!"!!!!"""""""!""""""988"#""###"###"########$#$$$$$#$$$$$$$$%$$$$%$%%%%%%%%%%%%%%<;<&&&&&&&&&&&&&''''&''''''''('''''''''(((((()(())))))))))))?>?**))*********+*+**+*++++++++,++,+,,,,,,,,,,,,---------.-.CCC.//.//////0///0/00000010010101111211221222222222323333343IHI444544555555555555555555556667667777777877888888888888898LMM999999::9;;::;;;;;;;;;<;<<<<<<<<<<<<===!!! !!!! !!!!!!!!!!!!!!""!""""""""""""#"#"898#"############$###$$#$$$$$$$$$$$$%%$%%$%%%%%%%%%%%%%%&%&&;<<&&&&&&&&''&&''&''''''''''('(('((((((((((((()())))))))))))???**)********+++*++++**+""+"","!,"",'',,,,,-,---------.-...CDC//////0//00/000000110110010111111112222222223334333334444III444555555555555555555655675666667777777778888888988988899MMM99:::::;;:;;;;;;<;;;<<<;<<<=<<<=<======777777777777777777787788888888888888888988DCD89999999999:999999::9:::::::::;:::;:;;;;;;;;;;;;;;;;;;;<>>=>>>>>>>>>>>???>??>????@JII@@?@@@@@?@@@@@@@==@<;@{{@AAAVVA99BBBBBBBBCBCCBCDCDCNONDDDDDDEDEEEDDDEEEEEEFFFEFFFFFFFFFFFGFGGGFGGGHHHHGIIIIIIIISSSIIIIIIIIIIIIIIIIIIIIIJIJKKJJKKKKKKKLLLLLLLLLLLLLLLLLLMMMMWWXNMNNNNNONOOOOONOOPOOPPPOPOOQPPQQPPQQPRQ! !!!!!!!!!!"!!"!!"!"""""""""""""""""""""#998##########$#$$$$$$$$$$$$$$$$%$$%$%%%%%%%%%%%%&%%&%%&&&&&&<;<&&&&'&&''''''''''''('(('((((((((((())(()()))))))*)))))**)?@@*+*******++++**+'',,,,,--QQ-&&-......////.///DDD///0//000000000000111111111211112222322323333344444444445III555555555555555555566666766777777778888888988888999899:99NNN::;:::;;;<;;;;<<<<<<<<<<=<===========?>! !!!!!!"!"!"!"!"!"!"""""""""""#"##"""""##999#####$$$#$##$$$$$$$$$$$$%$$$%$%%%%$%%%%%%%%%%&&%&&&&&&&&&<<<&&&&&''''''''''''''''((((((((((())()))))))))))))*)*******@@?***+++++*++++#",mm,,,,----..-,,/.//.///.///DDD0/0000000000110110111111111111221222323333344444444555555III555555555555655656666677767788788788888888989998999:99::9NNN;;;;;;;;;<<;<<<<<<=<<=<<========>>>>??>!!!"!!!!!!"!!""!""""""""""#"#"#""#"###"###999###$###$$$$$$$$$$$$$$$%$%$%%%%%%%%%%%&&%&%%%%&&&&&&&&&&&&=<<''&''''''''''''(((('(((((((((()(())()))))))*))**)********@@?***++++++++++!!+,,,,---/VW/&&//-//////0/0DED000000000011111111111121221222323323334343444544445545555III55555555555575677677677777788888888888889898999999:99::;:OON<;;<;;;<;<<<<<<<<<<<=<=======>>>>??>>??!!!!!!!!!""""""""""""""""""#""#""#########999$##$$$$$$$$$$$$$$$$$$$%%%$%%%$%%%%%%&%&&&%&&&&&&&&&&&&&'&<<<''''''''''''('(''(((((((((())))())))))))))***))**********@@@+++++++++++++"",,,--,...bb.$$//.//////0/0EED000000001111111111111221222223333332434444444455545555555III5555555555656767767777778888888888888999899999:9::9;:;;;;OON;;;;<;<;<<<<==<<<<<==<==>==>>>?>???????"!!!!!"!""!""""""""""#"""#"##"#"#########$999#$#$##$#$$$$$$$$$%%$$$$%%%%%%%%%%%%%%&&&&&&&&&&&&&'&&''&&==<'''''''''''((((((((((((()(())))))))))))**)*)******+++*+*+@@@+++++++++,,++"",,,-,....GG/))////0/000000EDE000000111111211211211221232333433443444444444455555555555III55555576677667777777788888888888899889999999:;9::;;;;:;;;OOO<;;<<;<<<=<<=========>=>=>>>>???????@@?"!"!""""!""""""#"""""#"####"############$#9:9##$$#$$$$$$$$$$%$%%%%%%%%%%%%%%%&%&&&&&&&%&&&&'&&&&''&'''===''''(''(('((((((((((()())))))))))))))))**********+*+****+@@@++++++++,,,,,'&,HH----....&&////00/0/000000EDE101100111111111222222223343343334444444454555555555555555III655666676777777777778888888898889999999:9::9:::;;;;;;;<;;OOO<<<<<<<=<=<===========>>>?>??????@???@?"""!""""""""""""#"""###"#################$99:$$$$$$$$$$$$$$%$%%$%$%%%%%%%&%%&%%&&&&&&&&&&'&&''''''''''===''''''(((((()(((((((())())))))))))))**********+**++++++++@@@++,,+,,,,,,,-,,-#$-\\--....00/-,/0/000000000000EEE111111111211122222222333434443444454444545555555555555555III666577677777778787888888988899999999:99;::;:;;;:;;;<;<<;;PPO<<<<<<=<<========>?>>>?>?>????@??@?@@@@""!""""""""""""""#"#"##"#############$###$:::$$$$$$$%$%$%%$%%%%%%%%%%&%%%&&&&%&&&&&&&&&&&'''''''''''''==='(''((((()(((())))))))))*)))**)**************++*+++++++++@@A,+,,,,,,,,,,-------$%-44.]].bc.LL/'&/,-0/000/000000001010EEE111111121122222322332344334444444545555555555555555555556JIJ5766767777777788888888888889899999::9::::9;;:;;;;<;<<<<<==>=>?=?>?????@@??@@@@@@@@"!"""""""""""#""##############$$#$#$$$$$$$:::$$$$$%$$$%%$%%%%%%%%%%%&%%&%&&&&&&&&&&&&&&&''''''''''''''==='(((((((((((((())))())))))****************+*+++++++++++++A@A,,,,,,,,,,--,-------..++.%%/%%.()0//0000/0000000000111011EEF111112122222222332434344434444454555555555555555555555666JJJ7767777777778888888888999899999:::;;:::::::;;<;;;<<<<;<<=>??>?>?????????????@@@@@@AAB"""""""""#""##"##""########$#$$$#$#$$$$$$$:::%%$$$%%%%%%%%%%%%%%%%%&%&&&&&&&&&&&&&&&'&&''''''''''''(''===(((((((((()()))))))))))*)****************++**++++++++,++,AAA,,,,,,,,,-----------.-./././//0//////00000000001001011111FEF112222222222323333443444454544555555555555555555565675675KKJ777777878888888888888999999:9:::;9:;;:;;;;<;;;<<<<<<<<<<=??>????>????????@?@@@@@@AAABAB""""""#"##"##"##############$$$$$$$$$$$$$$;;:%%%%%%%%%%%%%%&&%%&%%%&%&&&&&&&&'&&&&'&'''''''('(''(''(((=>>(((()(((())))))))))*)*)***************++++++++++,++,+,,,,AAA,-,,,,-,----.-...//..//./--/++0./000000000000011111111111FFF222212233333333324444444454554555555555555555555666677677KKK777788888888888888999999:99;::;:;:;:;;;;;;;<;<;<<<<<=<=<=PQQ====>>>>>>>>????????@@?@@@@@@@BA@BBAABA#"#"##"###"##############$##$$$$$$$$$$$$$$:;:%%%%%%%%%%%&%%&&%%&&%&&&&&&&&&&&&'&&&'''''''''('('(((((((>>>(((()(())))))))*))*************+**++*+++++++++++,++,,,,,,AAA,--------.--.-..../../))088/@@0..0,,000000001111111211111FFF222222334333344334454444555555555555555555555665656777777LKK878888888888888999999::9:::::;:;:;;;;;;<;;<<<<<<<<<<=<===QQQ>>=>?>????????????@??@@@@A@@AAAAAA@AABA#"##"###################$##$$$$$$$$$$$$%$$;;;%%%%%%%%%%%%&%&&&&&&&&&&&&&'&'''&'''''''''''(''((((((((((>>>(())())))))))))*))*********+*******+++++,++++,+,,,,,,,,,,AAA,-,,--..-.-.-...../,,/mm0/00DD0,,000111111111211212GFF223243333334444444545555555555555555555555666666677777778LKK888888888899899999999::::;:;;;;;;;;<<;<<<<<<<<<<<<<======RQQ>>>>>>???????@?@@@?@?@@@AB@AABAABBAABBB""##"############$##$$$$$#$$$$$$$$%%%$%%%$;;;%%%%%%%%%%%%&&&&&&&&&&'&&&'''''''''''''('('((((((((((((((>>=)()))))))))))))*))******+**++*+**+++,++,++++,+,+,,,,,,,,,BBB------...-../../))/``/00000551//111111111212222GGG233333444444444555455555555555555555565566666676777777777LLL8888888888999999:99;;::;;;;;;;;;;<<<<<<<<<<<<==<==<======QQQ>?>>?>?????@@@@@@?@@@@AABBBABBBBBBBBCBC###"###########$$#$$$$$$$$$$$$$$$%$$%%%%%%;;;%%%%%%&%%&&&&&&&&&&&&&&'&&''''''''''''''(((((((((((((())(>?>))))))))))*)************+**++++++++++,,,+,,,,,,,,,,-,,---BBB.-..-.....//..//))/000101PP1++111121222222233GGH323433444454544555455555555555555655676666677777777777878LLL888989999999999::::;:;;;<;;;;;;;;<<<<<<=<<<<<======>==>=>RRR???????@?@@@@@@@@@AAAAABAABBBBBBBCCCCBC#############$#$$#$$$$$$$$$$$$%$%%$$%%%%%%;;;%%%&&%&&&&&&&&&&&&&&&''&'&'''''''(''('((('(((((()(()(()))???))))))*)))********+**++*+++++++++,,++++,+,,,,,,,,,-------BBC......././/////0))0001111MM1,,221221222222332HHG334444444455555555555555555555555656766675777777887888888LLL8888999999:9:::::9:;;;;;;;;<<<<<<<<<<<<<<=======>>>>>>?>?RRR????@?@@?@?@@@@AAA@@BAAABBBBBBBBBCCCCCC######$$#$##$$$$$$$$$$$$%$$$$$%%%%%%%%%%%%;;;&&%&&%&&&&&&&&''&'''&''''''('''''(''('(((((((((()()))))))?>?))**)**************+*+**+(&+'$+)'+,+,,+,,,,,,,-,-,----.--DBB.//.///../0////0+*0VV00011122200221222222333334IHI4444455445555555555555245.2503545567777776777788788888888LLL9999999999::;;;;:;;;;;;;<<<<<<<<<<<<<<=========>>>>??>>>?RRR?@??@@@@@@@@@AAAABABBBBBBBBBCCBCCCCCCCD###$##$$$##$$$$$$$$$$$$$$$%%%%%%%%%%%%%%%%<;;&%&&&&&&&'&&&'&&&'''''''''(''''((((((((((()(()())()))))))???*)**)********+***++)&+'$+6B+=P,17,'",+*,,,,,,------.--.-.DCC///./////0//0/00//0,,0WX101~~1991..222212222333343434IIH4445455555555555445+05>95WF6MA603724777777888788888888888MML99999:::::;:::;;;;<;<;;<<<<<<<<<<====<======>>>>>?>>>????RRR?@@@@@@@@AA@AAAABBBBBBBBCBBCCCCCCCDCDDD##$$#$$$$#$$$$$$$$%%$%$%%$%%%%%%%%%&%%&&&%;<<&&&&&&&&&&''&'&'''''''''''''(((((((((((()(()))()))))))*))???*************++*(&+29+k+,,,X,+),,+---,------.-../DCD///////0/00/0000000000++1--1111**2//222222222333344344444IHI4445555555555445035[5ߋ667u7H?715788888888888888899MMM99:::;:::;;;;;;;;;;;<<<<<<<<<<<<==<=====>=>>??>>???????@?SSS?@@@@@A@AA@AABABBBBBBCBBCBCCCCCCCDDDEEC999:9:9::::::;::;::;:;:;;;;;;;;;;;;;<;<<;>>>====>=>=>>????>>?????????JJJ??@@@@@??@@@@?=@CG@@@AAAAqB=:BBABCCCCCCDCCCCOONDDDDDDDEDEEDDEDEEDEEEEFFDBBC??EEDGFFGGGGFFGHGHHHGHIIIHIIISRSIIIIIIIIIIIIIAEIrJJJKKKܕLVQLIJLLLLLLMLLMLMMMMWWWNMNNNNONONNOOOOOOPOOOPPPOPOOPPPPQQPQQQQQQQRQRRQRRRRSSRSSR\]]TTTTTUTTUUTUTUUUVUUVUVVVVVVVVVWVVWWWXXV$$$$$$$$$$$$$$$$$%%%$%%%%%%%%&%%&&%&&&&&&&<<<&&&&&&''''''''''''''(((((((((((((((((((((()))))))*)))****@@@*******++++++&!+T~,++,,,-->=HI112.))222233434334444444445III5555555555035I?55677788e8/388998899899999:NNN;:::;;;;;;;;<<<<<<<<<<<<<<=======>>>>>?=?>????????@@@?@@@TSSA@A@AABBABBBBCBCBCCBCCCCCDCDDCDEDEEEEEE$$$$$$$$$$$$$$$%$%%%%%%%%%%%&&&&&&&%&&&&&&;<<&&&'&&''''''''''(('''(('(((((((())))))()))))))))*))******@@?+*****++*++++&!+n+,,,,,--Oq.(#-.././//////DDD00/000000000111.+,6;>>>>>>?>???@????@@@@@@@@@TSSAA@AAABBBBCBCBBCCBCCCCCCDDCDDDDDDEEEEEE$$$$$$%$$%%%$%%%%%%%%%%%%%%&%%&&&&&&&&&&&&<<<''''''''''''''('(('((((((((((()(())))))))))))**)**)******@@?***+++++++++,'!+k,,,,,---Kh/)%////////////DDD000010000100/-.59:Y~/**444454445555555III5555555555,16fN77777889{9/399899999:::9:;:NNO;;;;;;;;;<<<<<<<<<<<<=<====>=>>>>????>>?????@?@@@@@@@@A@@TSTBABBBBBBBBCBCBCCCCCCCDCDDDDDEDEEEFEEFEF$$$%$$$$%%%%%%%%%%%%%%%%%%%%%&&&&&&&&&&&&&<<<''''''''''''''('((((((((((()(())())))))))))**)******+****@@@++++++++++++,'#,Lk,,,---..7?/-*/////////0/0DDE000000001100,''_:AA201444455555555III5555555556246@;77778888~[9/4999;:9::::;:;;;OOO<<;<;;<<<<<<<<==<<=<========>>>>>??>???@??@@?@@@A@@A@AAABUUUBBBBBBCBBCCCCCCCDCDDDEEEEEEEEEEEFFEEFFF$$$$$%%$%%%%%%%%%%%%%&%%&&&&&&&&&&&'&&'&''<==''''''''''''((((((((((()((())))))))))*)**********+**+****@?@+++++++++,,,,+*,*),k----..Qt.(!/-*0.-00//00000EDE100110111111-('|Kcc0,,455555555555III5555565456237*17pT778888y98897899:;;:;:::;:;;;OOO<<<<<<<<<==<==<======>>>>>=>???????>??@@@@@@@A@@AAA@@AAAAUUUBBBCCBCCBCCCCCCCDDDDDEEDEEEEEEFEEFFFFFF$$%$$%%%%%%%%%%%%%%&&&&&&&&&&&&&&&&'&&''''==<''''''(((('((((((((((())()())))))*)))*)**************++++@@@++++,+,+,,,,,,,,*),,+,W-}-.v.F_.(!/7>/=J/240-*000000EEE011111111111-((|Kbb1,,555555555555III5557137876OC7JA8+18`L8z8ً8х8c8:99679:9:9:;::;;;;;;;<;OOO<;<<<<<<<=====<======>>>?>>???????????@?@@@@@A@@BAABBBBBBUUUCBBBBCCCCDDCEDDDEDDEEEEEFEEFEEFEFFFFGFF%%%%%%%%%%&%%%%&&%&&&&&&&&&&'&''&'&''&''''=<=''''((((((((((((((()())))))))))*)*)***********++*++++*+++@@A,,+,,,,,,,,,,-,,---,+-'#-+(-/0.)%.)%/Qs/p/t/i0@Q0-+010EEE011111211111-((^;@@311555555555555III6136J@7i7x8w8`8468.38:98469/497899::9;:::;::;;;;;;<<;PPP<<<<<<==<=========>>>>>>?>???????@@@@?@@@@AA@AAAAABBBBBBBUUUCCCCCCCDCDDDEEDDDDEEEEEEFFEFFEFFFFFFGGF%%%%%%%%%&%%&%%&&&&&&&&&&&&&'&''''''''''''===(('(((((((((((((())()))))))))))))*********+*+**++++++++++@@A,+,,,,,,,,,,,,,,-----------..,.,)/G^/y/v0u0y0m06;1/.EEE1111112112221//577Vww0,+555555555555555JHI6877i7~8z8{78{Z825877988899:99:::;::;;;;;;;;<<<;<<;POP=<<<<<==<======>>>=?>>????????@?@@@@@@@AA@AAAAABABBBBBBBCUVUCCCCDCDDDDDEDEEEEEEEEEFFFFEFFFFFFGGFGHF%%%%%%%%%&%%&&%&&&&&&&&&&'''&''''''''''(('===((((((((((((()()())))))))))))**)****++****+*++*++++++++,+@A@,,,,,,,,,-,,-,---,--.-./-/..../+(/]0x0u0t0u1y1DX1-+EFF2111212122212220--6::xSss0++555555555555555667KFH6OC7x7z8y8z8|8n888978999:::::9:;;;;:;;;;<;<<<<<<<<=>>=>??>?????????@@@@@@@A@AAAAABABBBBABBBBBCCCCVVVDCCDCDDDEEEEEEEEFEFFEFFFFFFFFFGFGGHGGHH%%%%%%%&%&&&&&&&&&&'&&&&''''''''''''(('('(>==(((((((((((((())))))))))))***************+*++++++++++++,,AAA,,,,,,--,-----------...../-////,)0Y0y0u0u0u1w1AQ1.,FFF2211122222233231..BPPq|~z]444544555555555665766KGI7I@7w8{8z8z9}9k96899899:::::;:;;;;;;;;;<<;<<<<<<<<>>>?>=?=?>?????@?@@@@@@@AA@AAAAAAAABBBBBBBBBCCBCCCCVVVDDDEDDEDEEEEFEEEFFFFFFFFFFGGGGGGGHHHGHH%%&&&&%&&%&&&&&&&''''&&&&''''''''''''('(((==>(((((((()(())))))))))*)*))*******+*++**++"++!++!++',+,,,,AAA,,,,,,-,--------..-.../././///0-+0=K0s0y0x0{1b122110FFF2222222233343341.-a|wvyxBOO200555555666676677KKK7357_88}8}8|9eO9379::;::;:::;:;;;<;;;<<<<;<<<<<<=<<=>6=>5>?6?@:??@??@@@@@@@@@AABABABABBBCBBCBBCBCCCCCDCVVVEDEEDEEEEEEEEEFFEFFFFFGFGGGHHGHHGHHHHHH&&%%&&&&&&&&&&&&&&''''''''''''((''''((((((>>>((((((())))))))))))***)*********++*&++(++Z++z,+o,,>,,#,,,AAA-,,-,-----.-...-.-//////////0//0/0-+0@P0a0h1X}16:1/.111FFF2222222344344331.-f{xxx{EUU2//556556767777777KKK8678;98xX8m9j8cN96799:9:;;::;;;;;;;;<<;<<<<<<<<<==<====PQQ=9==:=?h>???~??Q?@7?@?@@@@AAA@ABBBBBBBBBBCBBBCCCCCCCCDDDWWWEEEEEEFEEEEEFFEFFFFGGHGGGGGHGHHGHHHHHIH&&&&&&&&&&&'''&''&'&'''''''(('(('('(((((((>>=)(())))))))))))*))**)***********&++5+++,,,,,,,,,m,-$BAA,--------...-//..///////00///00000000.+0.,1001.*10/112200FFE2222233344344341./Pll|zy|n8<<533665667667667756LJK888867825877957936999:::;;:;;:;;;;;<<;<<<<<<<=<<=<<======QNQ>F>?>????@@@@@~@@8@@AABAABBABBBBBBCBBBCCCCCCDCDCDDDDWWXEEEEFEEFEFFFFFFFFFGGGHGHHGGHHHHHHIIHHII&&&&&&&&&&&''''''&''''''('''('(((((()(((((>>>)()))))))*)**))*********+**++*++$++,+++,,,,,,,,,,QBB;------.-././/..////0////00/00000000001110011011111110/258GLR333322334444444433545Z~~uxlCQQ3016657657767777677A??????@@@@@@AfAB;AA@ABBBBBBBBBCCCCCCCDDDEDEDDEEDXXXEEEEFEEFFFFFFGGGGGHGGHHHHHGHHHHHHHHIIII&&&&&&&&&&'&''''''('''''(''(('((((((()((((>>?)))))))))***************+++++$++L+++,,+,,,,,,,,-,BB8---.../....-/.////0//00000000000011111111111111221/29A2QoGf3J`355343545554555444300==9?QlR?????@?@@@A@A@AAA8BBBBBBBBBBCBCCCCECDDDDEDEEDEEEDXXXFEEFFFFFFFFGFGGGHGHGGHHHHHHHHIHIIIIIJII&&&&&&&&'''&'''''''''(('(('(((((())(()()))???)))))*)*************+++++++++!++b+,+,,+,,,,,,,,--BB9.-..-(/.*//0//)/0,00000000000000111111111111111220.2I`2X{Hg4W{4=E431454555555544566BPPGXX8>><>=6>RR@???@@@@A@B@AAAAB9BBBBBBBCCCCCCCCCDDDEDDDEEEEEEEEXWXFFFFFFGGGGGFGGGHHHHHHIHHHHIIIIIIIIIIJJI'''&'&''''''''''''(''((((((((((((((())()))>??)*)**)*************+*++++++++#+,S,,,,,,,-,,------CD8-.(--N//////0/>00+00010011011111111221121222220/3EW3X|Hh4Vx4;@432555555555322FWWY}}Y~|Tss:<>6447777878778:88nS8\Mm9mS9:998::::;;::;:;;;;;;;<<<<<<<<<<<=9<?A?>6?RsR@?@@@@@@A@BAABBBB:BBCCCBCCCCCCCCDDCEDDDEEEEEEEEEEXXXFFFFGFGGGHGGHGGHHHIHHIIHHIIIIIIIIIKIJKJ'''''''''''''''('(((((((((((()()()()))))))>??*)************+*+*++++++,++,,*,,*,,,,,-,-------..bCD7..G.///0//.++++---(0001111111111112212223223213573G[I`w4@L533555555555555322NggX||WyxY|}?GF6437787788888678E>8gPMvb9E?9799::9::::;;;;;<;<;<<<<<<<9798.89f8;;=>?>?>?>?;?ROR@@?@@@AABAAABBBuBC;BCCCCCCDCDDDDDEDDEDEEEEEEEEEEFFYXXFFFFGGFFGHHHHHHHHHHIIIIIIIIJIIJJJJJJKKJ'&''''''(''''''(((((((((((()(())))))))))))???************+**+++++++++++,+++,,&,,E,,,,--------..&DC>>>>=>>>=>>=>>>?>>?????>>??JJJ@@@@?@@@@@??@@@@@@@@@@@@@AAAAAAAAAA;AALABBBBBBCjCC;CDBOOIDDDDAAZZvvGGHEECGGDGGDGFFGHHGHHHGHHHIIIISSSIHIIIIIIIIIIIIIIIIJIIIHIQWXT^^MNNJJJKKKLLLLLLLLLMLLMMMMMMWXWMMNNNNONNOOOOOONMOPLOOLOPPP||hiOORRRSReS\Y\SMST[TUTUUUUU{UVOUVTVVVVVVVWWWWWWWWWXWWXWWXXYXXYYXYYYYccc[ZZZZ[ZZ[[[[[[Z[[Z[[[[[[\\\\\]\\]]]]]]^''((('('(('((((((()())(()))))))*)))**)))**@@@******+*++*+++++++++++,,,,,,,,,,,,,--,*--#--#.-%..'//.///DD?//V,-@@jk,+'//=//>11/333433444544545III555555555555555555675766635543766778788888889998989999999NNN:;:;;;;;<;<;97:9?99K9686onQQ=BA8BB9BB9BB;CCBBCCCCCDDDDDDDDDEEEEEEEEEFFFFFFFFFFGGGYZZHHGHHHHHHHHHHIIIIIJIJIJJJJKKKKKKKLKKLLM'('('(((((((((((())))(())))))))**))*******@@@+***+**+++++++++,+,+,,,,,,,,,,,,,-----------..../..//////DDC0/-*+dllKKSSVV??h01.444545444555III555555555555555665676767767777878888888898988989999999:;:NON;;;;;;;<;96:CRC[[]]UT|{;<@O@@=@STS@BAABABBBBBBBBCBCCCCCCDDDCEEDDDEEEEEEEEEEEFFFFFFGFFGGFGGGZZZHHHHHHHHHIHIIIIIIIJJIKKJIJKKKKLKKLKKMLL(''('((((((((())))())())))))))**)**)****++@@@*+++*++++++++++,+,,,,,,,-,,,--,,-------..//./..-//./////0DDD00/++!ww{zvuGH]21.554555555III5555555555655566667767777778788788888888989989999:9;9:;;;OOO;;;;;;989GPGvvہ~~ߌٌ=;>?<@AAATUTABAABABBBBBBCBCCCCCCDEDDDDEDEDEEEEEEEFEEFFFFFFFFGGGGGHHHH[[[IHHHIHHIIIIIIIIIIIJJJKKKKKKKLKLLLLLLMMM(('(((((((((((())))))))))**)*)**)*********@@@+++++++++++,,,,,,,,,,,,,,,,-,--------..../...///////0/000EEE000++&vvttvw{{jj555331332332IIH555555565666656776777777787888888888889998999:9::99;:;;;;MLM:89:9:869gĝ}}{{ڈȄ<7>FOOhHH\KKM55455566676666677777788888888888899998999999:;:;::;:;:;;;\i[UmTKZK;:;pp€}}}}|}bb<8UUuXX|YY~ZZl442665667777777777787888888888998999999999;::;;::;;:8:EPEnn]^^^FNFbbǂ}}}}~ڐvw?=?@?ABAABBBVUUBCBCCCCCCCCCDCCDDDDEEEEEEEEEFFFEFFFFGFGGGGGHHHGGHHHHHIHHH[[[IIIIIIJJJJJJIJJKJKKLKLLKMLLMMLMMMMMMMMM(())(()())))*))*)))*****************++*+++@@@+++,+,,,,,,,,-,,--,------.-..//./....//0///0//00000000110FFE11111100/..,MLhoovvaa99>>>Jop|||{ppAAM::@XX|VVyYY}^^t34267667777777787788888888899899999999999;;;:;;;;;;:89IWIoo\|\^_KZKBGBppāŁ{{QcQBEChh~zz\w\>=?@??ABBABBBBCUUVCBCCCCCCCDDDDDDDDDEEEEEEEFFFFFFFFFFFGGHHGGHHGHHHHHHIHIIII[[[IJIIJIJIJKJJKKKKKKLLLLLLMMMMMMMMNNMMNNM()))())))))))))))*)**********++**+**++++++@AA+,+,,,,,,,,,,,--,----.-........////////0///0/000000000010EFE111112211111..*--)..)..*22021/::?NNhONh;;@22/556JJaWWzTTsRQY5546677777878888888888888989999999:99:9;;:;;;;;;;;;;:;>B>f}f]~]WqWAEA:8:?B@SjTXrXHPG=:<><>;7;;7;;7;=:=A@@ABAABBBBBBCBVVVCCCCCCDDDDEDEDEEDEEEEFFFFFFFFFFGFFGFGHHHGHHHHHIHIIHIIHIII\[[JJJJJJKKKKKKKKKLLLLLLLMLMMMMMMNMMNNNNNN)()))))))*))))*))********+***+++++++++,+++AAA,,,,,,,,,-,-,,-----.-.../../-..////////00/000000010111111FFF11111122122222332343344444445433211.22/442555444556<==<=;9<;9<=;>@??@@??@@A@@AA@@BABAABBBCBBCBBCCCVVVCCCDDCEEDEEEEEEEEFFFFFFEFFFFFFHGGHHGHGHHHHHHHIHHHIIIIIJJI]\]JIJJIJKKKKKKLLKMMLLLLMMMMMMMMMNMMNNNNNO))))))))))))*)*************+*++++++++,+,+,AAA,,,,,,,----,-----.---/../..//.0////////000000100010111110EFD111222222222223334434443342351454555555555555555554444665KKK7777778888788888989889999999:9::9;:;;;;;;;<;;<<<<<<<<<<<=POP;:;<<<>>>>???>=?????????>=@?=@@@@AAABAAAABBBBCCBBBBBBCBACVUWDCDDDDDEDEEEEEEFEEFFFFFFFFFGGGGGGGHHHHHIHHHHHHIIIIIIJIIJJ]][KKJKKKKLKLLLMLLLMMMMMMMMNNMMNNNNNNNNOON))))*)*))**********+*++*+*++++++++++,+,,,,AAA,,,-,,,,----.--/..//.+/)*/%+/%*/&./,000010000110111.1,110IFM02-02.222333434334444343;4@@4L85:453555555555655666666777KKK787777788888888889998888665565878;;;;;;;;;<;<<<<<<<==<<<=PPQ====>==>>???????????@@A?IR@HQ@A@AAAAAABBBBBBBBCBB@C@>CFICVWVB?CEDEEEEEFEFEEFFEDCFB>GC>GC?HDCHHHHHHIIIHIIIIIIIIIIIJIJJ]]\KKKKKKLKLLLLMMLMMMMMMMMMNNMNNNNNNNPOPOP*)*)*)))*************++++++++++,+,+,,,,,,,AAA,,,---------..-/..*/&7/AV/}a/S0v50:,0)001010111/1,C1Wf1{Fa2<2F03.333444444341>4GV5wY5~P5l85;454555555665776767777KKK788788888898998999878777[[ZiiiGFF777<;<;;;<<<<<<<<<<<<<<=QPQ===>>=??>???????????@Tg@b@b@Q`A@@ABBBBBBCCBA@CHLCiCyEW[rDDBEEEEEEFFFEC@FIMFdGtHlHQ[HD@HIHIIIHIIIJIIJJIJJJJJK]]]KLKLKLLKLLMMMMMMMMMMMMNNNNNNNNOOOOOONOP)*)**)**********+++++++++++++++,,,,,,,,,,,ABA-,--------.../.).%H/e//000A0R-0)111.1,?1Kt1y2F{2l373;241444554351J5aY5|V5xY5~@5K352555565777777777778LLK888888888989999999111}|}III776<<<<<<<<<<<=======QQQ?>>?>>???????@??>@DG@_|@a@bA^yBCDBAABCBBBBCCBCoCCDXEYmEBAEEFFC@FS^FGHGHHc~HEAIIIIIIIJJJJJKKKKKKK^]]LMLKLMLLLMMMMMNNNNNMMNNNNNNNNOOPPOOOOOP)********+**+***+++++++++++++,,,,,,,-,,,,,BBA------..-./.,.*9/D0/0000141701..1*X1~y1v2Fv2{3J4a14.444444352C5QX5|X5}U5v;5@463666667677777777778KLL888988989989999100nnn;;;:::<<<==<======>>>RRP??>?????????@@@@?@AB@YrAcBdBWlBBABCBBCBC@>CO[CDDDXErEC@FEDFGHFGGHHHHIUbIGCIJJIJJJJJJKKKLKL^^]LKLMMMMMMMMMMMMMNNNNNNNNNOONOPOOPPOOPPP******+*****+*+++++++,,,,,+,,,,,,,,,,,----BBB------././//*/%\///00001O1l,1(.1+Z2z2v2Gv3{4K4c14.445555555555B5OI5]=5E454655566777777777878878LLL988888999999555LKK333=<==<====?>>>>>RQQ????????@@@@@@@@@@@?@EIAScBRaBEGBBABCCCCCC@>CP]DEDEXFsFCAFC>G]uGHHHHHIIuJE@JJJJKKJKKKLKKLLM_^_MMMMMMMMMMMMNNNNNNNNNNNNOOPOOPPPPPPPPPP******++++*++++++++++,,+,,,,,,,,,-,-,----,BBB....-./..///*/%j//010011[1-1(/1-C1Tx2y3I{3q4:4A342555555555555452352453656667766777777788888888MLL88889999999:/01OPP888======>>?>??RRQ??????@@@@@@@@@A@AAAAA@A@?B@?BBACCCCCCCCCCBBCEFEtDDEXF]uFCAGB>GiHHHIHIIJJFAJKKJJKKKKKLLLKLM^^_MMMMMMMMMNNNNNNNNNOONOONPOPOPPPPPPPPPPP***+***+++++++++,++,+,,+,,,,,,,-----------CCC..././//////*/%\/0000111O1l-1(22202.L3em3Hj4C4R250555555555555555555655666677777777877877888888888LMM899999:9:;;:111kll444>>=>?>=>???>RRR??@@?@@@@@A@AB@A@AABABBBCBBBCBCCCCCCCCCDCCDDDCAEMUEqEEXcFFEGGFGC?F^tHHHHIIJIvIFBKKKKKKLLLLKMLMLM^__NMMMNNNNNNNNNNNONNOONONOPPPPPPPPPPPPPPP+*++++++++++++,,+,,,,,,,,,,,,-,--------.-.CDC//.//////00/-0+:0E000011152912/22323313-74:QHY54514/554555555555555555656556667776777777566464676888989LMM99999::9::99111fff555?>>??>?????@SRR@?@>??==>?>@ABABABBBBBCBCCBCCCCCCCCCCEDDEDEEEEEECBEDCFMUF]`XCAGFFGGGGFEHIJHHHHIJJJWcKHFKKKKKLLKLLMLMMMM___MMMMNNNNNNNNOONPOOPOPOOPPPPPPQPPPQQPQQQ+++++++++++,,,,,,,,,,,,,--,,------.-......DDC/////0000000000+0'K0f01112C2S.2*323333343243342GIE453555555555555555555565555766776777877676A=BPDPC=C787999MMM9:9::::;;;::323BAA;<????????@SSR???EEBWVLOOH@@@BAABCBBBBCCBCCCCCDDCDDDDEEDEEEEEEFEEEEFDCFXWYGGGGGHHGHHHHEBHU`HIIIJKdJGDKKKKLLLMLLMLMMMMMMM___MMNNNNNNONOOOONPPPOPPPPPPPQPPPPQQPQQQQQ@@@@@@@@@@@@AAAAAAAAABABBBBBBBBBBBDCDDDCCCOOODDDDDDEEEEDEDEEEEEAE=NFWjFrFgFKGQCF?GGGGHGHHHHHGGIHHHHSSSIIIIIIIIIIIIIIIIIIIIJJIJJJJKKJKKKKKLJKJVQVglhYSYKLKWWWMNMNNNONOOOOMMMOOO{zzJJJRRQRRQRRRRRSRRS\\\VVUjtqjj`SSTUUVVUUVVVVVWWWVWWWWWWWXWWWXXXXYXXYXYZZZbccZZZZZ[ZZZZ[[[[ZXU[^a[w[\}\eo\XU]^]]^^]^]__^__________hhh```_```ab`aaaa`aababbbbbbbbbbbcbcbcccbc++++++,+++,,,,,,,,,,,--,----------/././///DDD0/00/0000000000000111/1,,1',1'-1(02/323433433244444444445III555555555555555565666666777777778877575VGV\zYz\[J[686NMM::;:;;;;;;;<<<<99999:WWW656>@??>??????????@@@PPRPQHc`crrZ?@ACCCCCCCDDCEDCDDDEDEEEEEEFEFFFEFFFFGFGHGZZZHGHHHHHHHIIHIIHIIIHGIFBJFBJFBJHGJLLKMLLMLLMLMMMMMMMMMMMNN__`NNNNNNONPOOOPOPPPPPPPPPPPQPPPQRQQRQRSRQ+,+,,+,,,,,,,,,-,,-,,--------..../////////DDD//0000000100001111111111211111122222333334434344444445555III555555555555565666676767565666878888675H@HzYz~\~{[{KCL797NNN;;;;;;;<;<<<<<<<<<;;;44465599944498:????????????@@@@@@@@@RSRGGCyx]dc``Q@@ACCCDCCCDCBBCDDEEEEEEEFEEFFFFFFFFFGGFFGGZZZHGHHHIHHHIHIIIIIIIJJIJJIKKJKKKKLKMLMMMMLLMMMMMMMNNMNMMNNN`__NONOOOOPPOPOPPPPPPQPPPQQQQQQQQRRRRRRRRS,,,,,+,,,,-,,,---,-----..-/.../////////0//EDD000000010001111111121222212222223333333333444445444455555III555555555566566666352252?;?877252888899688KBK]K]MCM998:9;ONO;;;;;;;;;<<<<<<=<<<=<======<==>?=?>>>?????????@?@@@@@@A@@UUT?@@LLGddS[[OCCCCCCDCCA?ABBBLLHCCDAACFEEFFFFFFFFFGGFGGGGGG[[ZHHIHHHIIIIIIIJIIJJKJJKKJKKKLKLLKMLLMMMLMMMMMNMMMNMNNNNNNN```OONOPOOPPPPPPPPPPPQPQQQQQQQQQQRSRSSQSSS,,,,,,,,,-,,---------..-..///././/////000/EED000010010111111112211222222222223344434444454554555555555III555555656666464151H?HdqmaMa363889999787676788::::;:ONN;;;;;;<;<<<<=<<<=<==<<<=;=<=>><=>@??@@@@@@@@@@A@ABBABBUUUBBBCBBCBCCCCCCD@@CRRL}ȆÄȆ~MdcEGGGGGFHGGHHHIHH[Z[IIIIIIJIIJJIJJKKJKKKKKLKLLMMLLLMLMMMMMMMMNNNNNNNNNNONNONOaa`OPPPPPPQPPQPPQQQPQQQQRQRRRRSSSSRSRSRTSS-,,,,,,-----.--..-....////////0///00000000EED001111111111211222222222323344344444454444545555555555555III665666565768i4iJ}zzz~a3539:99:::::;;;;;;;;;ONO<<<<<<=<<=<<======:<>Azz_ȆȂ܆bD]]GEEHHHHIHIIHI[[[IIIIIJJIIJKJJKJJKKKLKKLKMLLMMLMMMMNMNMNMMNNNNNONONONOOOOPaaaPPPPPPPPQQQQQQQQQQRQRRRRRSRSRRSSSSSTSSS,,,-----------./..//.//////0//0/0000000000EEE111111121111212222222322432343444444444544555555555555555GHG-1,-1-,2-333m5nJ}zzz~b363::::::::;;;;;;;;<;POO<<<<<<=<==<====>>=;<@@@AABA@ABAABBABBBUVUBCCCBCDCCEDCDED>>@||`ȆɃ݇bE]\E<>>>=><>=MFFv[[}^^dRS@@@@@@BAAABBBABBBBAACABCVUV@BCCDDDDDEECDEDABCVWNLJÄɇ́OkkBnoXt{hNNLVWYJKJKJKKKKKKKKKLMKLMLMLLMMMMMMMMMNNMMNNNNNNONNONNOONPPPPPPbbbQQQPQQQQQQQQQRQRRRSSSRRRSSSSSSTSTTSTTTT------.-./.././///////////0000000000101111EFE112111222221222333344334444454455555555555555555555031E=E΍h636QBQfsneOe6769;:;;;;;;<;;:;;H=??>>>????=>>CAAHDD?@?@?@AA@BBAABBBBBAABIFCoYBmVZNDACDDDDDEDEEDEEEAADbbUu|vdfUGGBpԐmmdEEGKJKKKKLLKLMLLLLMKMMMMMMMMNMNMNNNNNNNONNOOPPOOOOPPPPPPPbbbQQPQQQQQQRRQRRRQRRRSRSRRSSSSSTSSSTTTTTT-.----//./////////////00000000100100111111FFF121122222222232334444344544544545555555555555555455020wsVs+2+686C>C;:;474::9;;;;;;;;;;<;<<;m>??>>???????@>??=??@@@AAAABABAABBBBBB?AClWCdCsVbDMHDCDEEEEEEEEEEFEFBBDFFFPPLFGG<;Bvv`˒GHIJJKLLLLKLMLMMMMMMMMMMMNMMNNNNNNONNOOOPPOPPOOOPPPPPPPPQbbcQPQQQQQRQRRSRQSSRRSSSSSSSTTSTSSTTTTTUTT./...-...////////00/0000000110011111111111FEF221222322332442434444444555555555555252/5//5//5/.3.RDQ}040898786999::;:;:<;:;;;;<<;<;=<=??????????@?;>====A==:?>?B@BBABBACBBBBB@BCqZCdDsWcDPJECDEEEEEEEFFFFFFFGFFFFDEFGGG??DiiZEEHHHLGFLGGMHHMMMMMMNNMMNNNNNNNOOOOOOPOPOPPPOPQPPPPQPQcccQQQRRRRRRRRSSSRSSSSSSSSSSTSSTTTTTTTTTTT/////.//./////0000000000010110100111111222FFF222322333443334444444554555555555151@5@w5w5n6n322^L]׈5759:9;::;::;;;;;;<<;;<<<<<<<<:<;Q=Gw=ZQlY=K<><=>????????@?:==YIHcbiiWWAAAAAABBBCBBCCCAACRKCz_EqWeUEDEEEEEFEFFFFFFFGGFFGFGHHGFGHHH@@Dӎvw`@@GeeLLMppMJKMMNNNMNNNNNOOPOOPOPOPOPPPQPPPPPQPQQQQcccRQQRRQSRRSRSSSSSSSSSSSSSSTTTTTTTTTTTUUT./////////0/000/00000010010111111111212222FGF333333243444444444545554555555353>5>55675LAL{040::9:;::::;:;<<<;;;<<<<<<<=<<<=;=;C=@WQT<>=>>?>??????@?<>>RJJyy݄ل܄dd=@@BCCCBCCCCCCCACDHFD^ZWDDEEEFEEEFEFFFFFFGGGGGGGGGHHHHHHH@@DaaYffILMMM~}NIINNNNNNPOPOPOOPPOPPPPPPPPPQQQQQQQQQcccRSSRSRRSSSSRSSSTSSTSTTSTTTTTUTUUTUUUVUU///////0/000000000000010110111112211212222GGF333334444444445445555555555555/5/r5r56767U3TphPi263;;;;;:;;;;;<<;<<;<<<<<<<<<<======<==QQP?>??>???????@@@9<=ghՄՀԁւ€VMM?AACCCCCCDCDEDDCDEVWXEEFEEFEFFFFFFFGFGGGHGHHHHHHIHHHHHCCFmm[EDJMMMNNNVVNLLNOPOPPPOPPPPPPPPPQQPQQQQQQRQQRRccdSSSSRSSSSSSSSTSTTSSSTTTTTTTTTUTTUVUUVVV/0//0/000000000000101111111111121211222222GGG333334444544555545555555555555/5/566777h6h6:6|Z}263:;:;;:;;;;;;;;<<<<<<<<<<==<======>>=>?>RRQ?>????@?@?@@@@@:==ppǃρҁɁĄaRQ=@@CCCCDDCDDEEEEEEXXXEEEFFFFFFFFFGHGHGHHHHHHHHIHHIIIIIIIIBBFfedaMMKMMMMNN``NLKNOPPOPPPPPQPPQPQQQQQQQQQQRRQRRRdccSSRRSSSSSSSSSSTTTTSTTTTTTTUUUUTUVVUUUVU/0/00/000000000000101111111111222222222232GGH434444544545555555555555555555060a5a67777O7O060GJHcMcb]NCM050::;;;;;;;;;;;;<<<<<<<<<<=<==========??>?>>RRR??????@?@@@@@@@:=>}`_ȆŅ{{NHH@BBEDDDEDCDEEEEEEEXXXFEFFFFFGFGGGHGGGHGHHHIHHIHHIIIIIIJIJJIIAAEZZRkrttaHIK[[\IIMNNNNNOPOONOOPPOPPPPPPPPQQPPQQPQQQQQQRRQRSRddcSSRSSSSSSSTSSSTTTTTTTUTUUUUVUUUUUVUVVVV0/0000000000000011111111121122222222332343GIH444444554455555555555555555555565665}7}778l8l484888LLL15104/050675;::;;;;;;;;;<<<<<<<<<=<=7=:6<:7=:9>;>>>?>???>RRR@???@@@@@@@@A@@?@AECDkkƄzzhVV>AADDDDDDEEEEEEFEEFFEXXYFFFFGGCEGBEHBDHBEGGHHHIHIIIIIIJIIJJIJJJKKKGGICCGDDHEEIKKM___KKMXXMMNOOeeOKJPPPOPPPPPPQPPPQQPQQQQQQRRRRSRQRRSRddcSSSSTTTSSTTTTTTTTTTUTUUTVUUVVVUUUVVVVVV/00000110001011111111211222222233333323443III242,4,+5+,5,/5/555555555555566666565373M7M[8[H8H383888999MLL999::9:::;;;;;:;;;<;;<;;<<<<<<<<<9<:a=O=f>f`>O:>>RJJ[NOEDD<@@DEDDDEEDDEEEEEEFEFFFFYYXGFFBDH^RHmGqHt^HGHHHHIIIIIIIJJJJKJJKKKKKLKKMKLMKLLMMLMM___MMNKKMOPMhhNlkNUTOKLPPPOPPPPPPQPQQQQQQQOOQJJQIJRJIRMNSSSSdddSSTSSTTTTTTTTTUUTTUUTTUTVVVVVVVVVVVVVWW000001000111111111211212222222333443443444DID445m5n55T5T-5-454565666766667777777373281484888888899MMM9::9;:::::;;;;;;;;<<<<<<<<<<<<7=9o=V==>?m>V9?>]OOhhllx^_FDD?BBDEEEEEEEEEEFEEFFFFYYYCDFcUHHɈHLjHȈIiIEGIIIIJJJKJJKKJJKKLLLLLLLLLMMMMMMMMM___NMMNNNMMNJJOIKOMMOPPPPPPPPPPQPPQQQQQLLQUTQRRRhhRLLSdddTSSSTTTTTTTTTTTUUUUVUVUUVVVVVVVVVVVVVVWEEDEEDEEEFFFFFEFFFGGFFFGFGFHGFHHGIIGIIIDHD_S_IIIIIICICHIIKJJKKKKKKKKKKLKLLKLLLLLLLLLMLMMMMWWWNNMMNNOONNOOOOOOPOPOOPOPPOPNPOTPRPQQQRRURTQRR]]]SSSTTTUTTTUTTUUORRvvϔe^^SVUXXXYXXXXXXYXYYYbccUWZ[ΕZǑ[Ǒ[ʒ[Ï[jb[X[\]]\]\\]]]]]^^]^^____^_^_______ihh``_``````aa`a`aaaababbbbbabbbbbcc^^bssbccddddggmeedeeeeeeeeefffeegggffgggggggghhghhghhh010111111121112212122232332344443444444-5.I555556i6j.6.7667777877778888888888889899999:9NNM;:;;;;;;;;;;<;;<<<<<<<<<<<<:=x?~>}>~??xK?E=@>SSSAAAABAAABBBB;??kWWACCEEEFFEFFFFGGGGGYZZDFHxHƈHII…IÆJbWJEHIKJKKKKLKKLLLLMLMLLMMMMMMMMMNNM`__NNNONOOOOPOPPPOPPPPPPPPPQPPQQQPPQOORRRRSSTTeNNTTTUTTTUTUUUVTVVVUUVVVVVVWWVWVVWWWWWW001111121111222222222333334334444444/4/P5QI5555667-7-777777787887888888989989999999:::NNN;;:;;;;<;<;<<<;<<<<<<<=<<=<<==;>=?k>>~?~?@k=@>?A?TTTABBBBBBBBBBC9>>}|cTT?BCFFFFGGFGGGGGZZZBEHhHˊH…HHɉI|JOMKIJJKKKLKKLLKMMLLMMLMMMMMMNNMNMNNM_`_NNOONOOOOPPPPPPPQPPPPQQPQQQQQQKJQttRSRRSTSTeLLTUUUUUUUVTUUVUVVVVVVVVWVVWVWVWWWWWWWW111111121212222223323334344444445545-5,b5bI5555677171777888888888889888999999::99:::::OOO;;;;;<;;<<<<<<<<<<<===========:?ъt]]=BAFFFGGGFGGHHH[[ZGGINKIqIĆIȈI~IgXJEHJKKKKLLLLLLLLMLMMLMMMNMMMNNMNNNNNN``_OOOOOPOPOPPPPPPPPQQQPQQQQQQQQQIIRSSRSSSTTeLMTUUTUVUUVUVUVVVVVVVVVVWVVWWWWWWWWWWWW111212222222232332443444444445544555/5/P5PI5555677.7.787888888888989899999:9:::::;;:;:OOO;;;<;;<<<<<<<<<=<========>=??>>??:?=C?A]@N]@OC@A=@>A@ABAATTTBBBCBCBBBCCB:?>}|cUU@CCGFFHGGHHGHHH[[[IIIFHIHIIbVIhXJRMKFHKKKJKKLKLMLLMMLLMMMMNMMNMMMNNNMNNNONNaa`ONOOPPPPPPPPPPPQPQQQQQQQQQQRQRKLRstQSSSSSTTeLMUUUUUUVVVVVVVVVVVVWVWVWWWWWWWWWXXWXXX221212222222233333442444444545554555454.5.I556577i7j08088888888888888899:9::::;:::;;;;;;OOO;<<<<<<<<<<<<<=========>>>>>?>>?????>??:@=:@=?@@AAAAB@BBAUUTBBCBBCCBCCCC=?@lXWADDFFFHHHGHHHHHHHH[[[HHIHIIHJIEHJEGJHIKKKKKKKKLLLLMMLLMMMMMMMNNMNNNNNNNNONOOOOaaaOOPPPPPPPPQQPQPQPQQQQRRQSQQRSRQRRPPSSSTTTUUfOPUUVVUVVVVVVVVWVVWVWWWWWWWWWWWWWXWWXWX111222233433343342444544544545555555555151SIS56666717088888888889899999999::;9:::;:;;;;;<;OOO<<<<<<<<<==<====>===<6=:5?:5?:8?;t>Y?q?nf?S8@<>@?@@AAAABABBABAABBBBUVVBBCCCCCCCDDDEDDADDPAARRllqqaaGF?EDGGHHHGHHHHHHIIIIII[[[IIJJJJKJJKKKKLKJKKDGMm\LwM|MgMLLMJLNNNNNNNONNPOOPPOPOObbaPPPPPQQPQQQQQQQQQQRQRSRRRSRRSSSSSTTSOOTWVTTTTjiUNNVffgVVVVVVVVVVVVWWVWWWWWWWWXWWXXWYXWXYXYYXX233332333343444445455555555555555555555555JKJ575.6..7-.7.181788888888889889999:99:;::::::;;;;<;;<<<<<@?|????@p=A?@A@A@BBABBBBBBCBBBVVVCCCCDDDCCDDDEEDEEEBFENCCyAABBeBCDFEFHGHHHHHHHHHIIHIIIIII[[[IIJJJJKJJJKKKKKGILtLLMMMŊNXRNKMNOONOOOOOPOOPPPPbbaPPPQPQQQQQQRRQRSQRRRRSRRSSSSSSSSSTSTTSTRQTLMTMMUMMUPPVTVUfgfVVVVVVVVWWWWWWWWWWWWWWXWXXWYXYXWXXYYXYY333233443444455555555555555555555555565665KKJ677777878888888888888888989989:::::::;;;;;;;;;<;;<;<<<<<=6>9?u???@@AAc9A=AAABBBBBBBBBBCCVVVCCDDDDEDDDDDEEEEEEEEECFF@FF@FFBGHGGHHGHHHHHHHHIHIIHIIIIJI[\[JJJJKJKKKKKKDHLhMMMNNNNNHKNOONPPPOOPOPPPPPbbaQPPQQQQQQQQQSRRRQRRSSSSRSSSSSSSTTTTSTTTTTTUUTUUUTTUVUVUVVgggVVVWVVWVWWWVWWWWWWWXWXXWXXXXXYXYXXYYYYY433434444544454555555555555555555555556767KJJ777777787888888988889999999::9:::::;:::;;;;;;;<;<<<<<<<<=9>=>?>9><^>N?@?@@AABFBE@BABBCCCBCCCCCCWVVDDDDEEEEEEEEFEEFFFFFFFGGGGGHGGHFHHHHHHHHHIIIIIIIIIIJJJJIK]\]KKKLKLLLLJLLKKMݕMMMMNNNOp`OILPPOPPPPQQPQPQbbcQRQQQRRRSRSRSSRSSSSSSSTTSSTTTTTTTTTTUTUUTUUUUUUUVUVVVVVVVgggWWWVWWWWWWWWWXXWXYXXYYYYXYYYXYYYYYYYYYY444444445555555555555555555555566677676777KKK788887888888888999999::9::;::;::;;;;;;;;;;<<<<<<<===<====QQQ>==>>>??>HG?HHCHHIHIIIIIIIJIIKJJKKJJJK]]]LKLMLMLLLLLMFIMȋMMMNNNOO`XOLNPQQPPQPPQPPQQcccQRRRRSSRRRRRRRSSSSSTTSTSTTTTTTTTTTTTUUTVUVUUVUUUVVVVVVWVVgggVWWWWWWWWXXWXXXXXXYXYXYYXYYYYYZYYYYZZYY454454555555555555555555655766667667777877KKK8878888989899899999:9:::::;:;;;;;;<;;<;<<<<<<<<<=========QQQ>>=>?>??>???6?;?q?@@@BB}B_:B>CBCCCCCCECDDEEDXWXEEEEEEEEFFFFFFFDFGFGGGGGHGHHIcIHAIIIIIJIIKIJKJKKKKKKK]]]KKMLMLMMLMMMFJM~eMNNNOPOPIMPPPPPQPQQPQQPQQQccbRRRSRRSSQRSRSSTSSSTSSTTTTTTTTTTTTUUVUUUVVUVVVVVVVVVVVVWWVhhhWVWWWWWWWWXWXXXXXXXYYXYYYYYYYYYYYZZZZZZ454455555555555555555565656767666777777777LLL888888889888999:::;:::9:;;;;;;<;;<;;<<;<<<<<<<=<======>==QQQ>?>?????????=?>A@A@uAAABBi=B@BBBCCCDCCCDDDEDDDDXXWFEEEEFFEFFFFEFFEFGGGHHHHHHHHIIqIIBIIJJJJKKKKKKJKKKK^^^LMMLLMLMMMMMLMNHKNoNNNOPPTRPMOQPQQQQQQQQQQQRRQccbRRRSSRSSRTSSTSSSTTTTTTTTTTTUUUUUUVUUUVUVVVVVVVVVVWVWWWWWWhhhWWWWWXWXYXXYXWXXXYYYYYYYYYYZYYYYZZZZZZZ555555555555555555556556667766777787887888LLL898899989998::9;::::;:;;<;;<;;;<<<<<<<<<<<<<<=======>>>>?QQR????@???@???@@@>@?:A===?>>?>RRR???@?@?@@@@@@A@A@AAAB9A>8B>9B==C?CCCCCCCCCDCDEEDEEEEEEEEEXXXFFEFFFFGGGGG?HGGGHHHHHHIHIIJIIIpJJDKJKKKLLKLLLMML^^^MMMMNMMMNNNNNNNONNOOOJLOHKOGKPIMOOPPPPQQPPQQQQQQQQQQSRSSRdddSRRSSTSSSSTTTTTTTTTTTTUTVUTUUUTVVVUVVVVVVVVWVWVVWVWWWVWWWhhhXXYXXWXXYXXYYXXYYXZYYZYZZYZZZYZZZZZZZZ[555555555555655667676666777778788888888888MMM999999999:::;;;:;:;;;;;;<<;<<<<<<<<<<=<==<======>>>?>>>?>RRR@@?@??@@@@A@A@@BABAAABBBBBBBBBBCCCCCCCCCCDDEEEEDEEEEEEEFEXXXFFFGFFGFGGHG?HGHHHHIHIIIIIIIIJJvKKBKKKKKLMLLLMMLM___MMMMNMMMMNNNNNNNNOPOOOOOOPPPPPPPPPPPQPQQQQQQQQRQRRRSRRRQSdddSSSSSSSTTTTSTTTTTTUUUUUUVUUUVUUUVVVVVVVVVWWVVWVWWWWWWWWWWhhhXXXYXYYXYYYXYYYYYYYYYZYYZZZZZZZZZZ[ZZ[Z555555555555556576777677777787888888888899MMM999999;99;:;:;;;;;;;;;;<<<<<<<<<<=====<===>>=>>>>????????RRS@@@@@@@@@AAAB@ABBBBBABBBCBCBBCCCCCCCCDDDEDEDDEEEEEEEFEFFEYXYFFGGGFHHGHGH?HHHHHIIIIIIJJJJJKK]KKFKKLLLLLMLMMMMM___NMMNNNNNNNNNONOOOOPPOPPPOPPPQPPQQQQQQQQQQQQRRQSRRSRRSSRSSdddSTSTSTTTTTTTTTTTTTUVUVUUUUVUVVVVVVVVVWVVWWVWWWWWWWWXXWWXYihiXYXXYXYXYYYYZYYYYZYZYZZZZZZZZZZZZ[ZZZ[Z555555555666566777777777888887888888988998MMM9:99:9:::;;;;;;;;;;<<<<<<<<<<<=<<<========>>=??>????????@SSR@@@@@@A@@AAABAABBBBCBCBBCCCCCCCDCDCDDDDDEDEEEEEEEEFFEEFFFYYYGGFGGGHHGHHHDHI[IHHIIIIIJJKKJJKKCLKLMLMLLMMLMMMMMM___NNMNNNNNNOONPOOOOPPPPPPPPPPPPPQQQQQQQQQRRQRRQRQRRSRSSSSSSdddTSSTTTSTTTTTUTTUUUTVTVVUVVVVVVVWVVVVWVVWWWWWWWWWXWXXXXXXXiiiYYXYYYYYYYYYYYZYYZYZYZZZZZZZZZZ[Z\[[\[[IIIIIJJJKJJJKKJKKKKKKKLLLLKLKLLLLMLLMLLMMMWWWMNNMNNNNNNOOONONOOPOPPOOOPPPPPPPPPPPRQQRRRRRRRRQRRRSRRSSS]\]SSSSSTUTUTTTUUUUUUUVUVVUVVVVVWWWVWWVWWWWXXWXXXXXYXYXXYYXXbcbYZZ[ZY[[Z[[Z[[[T[[x[[[[[\\]]\]]\]]]^]^^^^_^__^___``_hhh```_`````aaa```aaabaababbbabbbccbcbbbbccccddcdcddddddddedmnmeeedeeeeeeefeffefgfffggfgggggggggggghhhhhhhhhhihihijiiihirrqjjhjjjjjjjjijjjjjkjkkkkkkjkkkkkkklklmkl666656666777777877778788888888988999999::9NNM::;;;;;;;;;;<<;<<<<<<<<<=<==<====>>=>>>>?>???????@@@@@@@@SSSA@@AA@BBBBBBBBBBBBCCCCCCDCCDDDDECDEEEEEEEEEEFFFFFFFFFFGGGYYZGGHHHHHHIHIIHIHIIICIIJIIiJJoJK[KKCKLKKLMKMLLLMMMMMMMMMNNM_``ONNONNOOOPOPOOPPPPPPPQPQQPPQQQQQQQQQRRRRRRSRRSSSSSSSSSSSSeeeTTTTTTUTUUUUUVUUVUVUVVVVVVWVWVVVWWWWWWWWWWWWXYWWXXXYXXXXYijjYYYYYYYZYYZZZZZZZZZZZZZZZ[ZZZZ[[[[\\]]\6566656677777787788888888888889999999::;;:NON;::;;;;<;<<<<<<<<<==<<===<====>?=>?>?>???????@@@??@@@@A@@TUTAABBAABBBBBBBBBCBBCCCDCDDDDEDDDEDEEEEEEEEFFFFFFFFFFFGFGHG[[ZHHHHHHHIHHIIIIIIIIJIJIJJDKKDKLGKLLLKMKMMMMMLMMMMMNMMMMNNN`__NNOOOOPPOPPPOPPPQPQQPQQQQPQQQQQRQRRRRSRSRSSSSSSSSSSTSSTTSeeeTSTTUTVUTUUUUUUVVUVVVVVVWVVWWWWWWWWWWWWWWWXXYXXXXXXYXYYYYijjYYYYYYYYYYZZZZZZZZZZZZ[Z[[\\[\[[Z\\\\]]56766677777787888888898889889999899;:9:;9:NNN;;;<;;<<<<<<<<<<<<<=<======>=>>>=>???>???????@@@@?@@@@AA@TTTBAABBBBCBCBBCCCCCCDCDCDDDDEEDEEEEEEEEEEEFFFFFFFGFGGGGGGHH[[[HHHHHHIIIIIIJIIJIJJKJKJKKJKLKLMLMLMLLMMMMMMMMNMNMNNNNMNNN```NOOONOPOPPPPPQPPPQQPPQPQQQQQQRRSQSSRSSRSRSSSSSSTTSSTTTTTTeeeTUUUUVUVVVUVVVUVVVVVVVVWVWWWWWWWWWWWWXXXYXXYXXYXXXWYXYYYYjjjYYYYYYYYZZZZZZZZ[Z[[[\[[[Z[[\\\\[]]\\]]777J777777787888888898888898999999:::;99:::OON;<;;<;<<<<<<<<<<=<========>>?=?????????@??@?@@@@@@@AABABASUTBBBBBBBBCCCCCCBDDCDDCDDDEDEEEEEEEFEFFFFFFFFGFGFGGGHGGGHHH[[[IHHIHIIIIJIIJJJKJJKJJKKJKKKLLLKMMLMLMMMMMMMMMNNNNNNNNNNON`a`OOOPPOPPPPPPPPQPQQQQQQQQQQRSRRSRRRSRSSSSSSSTSSTTSTTSTTTTTefeTUTUVUVUVVVUVVVVVVVWVWWWWVWWWWWWWWWXXXXXXXXYYYWYYXXYYZYYYjjkYYZZZYYZYZZZZZZZ[Z\[[\[Z[[\\[\]]]]]]]]]777 777888888888888888888999::9;;:::;;;;;;;OOO<;;<;<<<<=<<<=<=====<==>=>>>>>>???????@@?@@@@@@@AA@BBBBABTUUBBBBBBBCCCCCCDCCDCDDDEDEEEEEFEFFFFEEFFFFFFGHGGHGHHHHHHHHI[[[IIHIIIIIIIJJJKJKKJKJKKKKLLLLKMMMLMMMMMMNNMNNNNNNNNNONOOOOa`aPOPPPOPPPPQPPQPQQQQQQRQQRQRRRRRRSRSSSSSSTSSSSTTTTTTTTTTTUeffUTUUUVVUVVVVVVVWVVWWWWWWWWWWWWWXXXXXYXXXXXXXXYXXYYYYYYYYYjjiZZZZZZZZZZZZZZZZ[[[Z[\[\[\\\\\]]]]]]]]]Z888o888888888988989999:99:;::;:;;;;;;;<?>>?>??????@?@??@@@@@@@AAAA@AAABBBBUUUBCCCBCCCCCDCDCDDDDEEEEEEEEEEEEFEEFFEFFGGGGHHGGHGGHHHHIIHH[[[IIIIJIIKIJJJKKKKKKKLLLLLLMLMMMMMMMMMMNMNMNNNMNNNNONNOPPOObaaPPPPPPQPPQQQQQQQQQRQQSRRRSRSSSSSSSSSSSSTSSTTTTTTTTTUTTUUUeggUUVVVVVVVVVVVVWVVVWWWWWWWWWWWXWXXXXWXYYXXYYXXYYYZYYYZYZYYjjjZZZZZZZZZZ[Z[[\[\\[][[\\\\]\]]]]]]]]^]]87888898889899999999:::;:;;;:;;;;<;;<<?>>???>???@?@??@@@@@@@@@@A@BABBBBBABBCBVVUCCBCCCCCCDECCEDEEEEEEEEEEEFEFFFFFGFGGGFGGGHHHHHHHHHHIHIIH[[[JIJJJJJJJKKJKKKKKLLLKLMKMMMMMMMMMMMMMNMNNNNNNONOOPOPPOPPObbaPPPPPPQQPQQQQQQQQQRRRSSSSSRSSSSSSSTSSSTSSSTTTTTTTUUUUUUUUfffVVUVVVVVVVVVWVWWWWWWWWWWWWXWWWXXXXYYXXXYYYYYYYYYYYYYYZYZZkkkZZZZZZ[[[[ZZ[[[\[[\\\\[\]\]]]]]]]]]]s888W888999999:99::;:::;;;;;;;;<;;;<<>>?>>??>>?????@@@@@@@@@A@AABABABBBBCBCBCBVVVCCCCCCDCDDDDDDDEEEEFEFEFFFFFFFFGFGGFGHGGHHGHHHHHIHHIIIIII[\[JJJKJJKJJKKKLKLLKMLLLLMLMMMMMMNNMNNNNNMNNNONOOOOOPOPOOPPPbbbPPPQQPQQPQQQQQRRRRSRRRRRSSSSSSSSSSSTTSTTTTTTTTUTTUUUVUUUUgfgVVVVVVVWVWVVWVWWWWWWWXWWWWWXXXYXXXXXYXYYYYYYYYYYZYYYYZYZZkkkZZZZZZ[[[[[[[][[\\]\\]]]]]]]^^]^]^]]998999999::::;;::;;;;;;;;<<<<<<<>?>???????????????@@@@@@@@@AAAABBBBBBBBBCBCCCCVVVDCDDDDCEDEDEEDEEEEEEEFFFFFFFFFGGGGHHHHGHHHHHHHHIIIIIIIJII]][IJJJJJKKJKKLLLMLMMMLLMMMNMMMNMMNNNNNNNNONOOOONOPOPPPPPPPPbabPQQQQQQRQQRRRQRRSRSSSSSRSSSSSSSSSSTTTTTTTTTTUTVUUUUTUVUVUgggVVVWVWWWVVWWWWWWWWXXWXXWWXXYWYXXYYYXYYYYYYYZYZZZZZZZYZZZZkkk[[ZZ\[\[\\\[[]\\\]\]\]]]]]^^]]]]],99999:::9;;;;;;;;;;;;<<<<<<<<<<<=>>>>>>>>????????@@?@@@A@@@A@ABBAAABBBBBBBBBBCCBCCVVVDDEDDEDECEEEEFEEFEEFEFFFFFFGGGHGGGGGHHHHHHIIIIIIIIIIIIJJJ\]\JKJKKKLLKLLLLKLLMMMMMNNMMMMMNMNNNNNNONNOPPOOOPOPPPOPPPPPQbbbQQQQQQQQRRRRSRRRRRSSSSSSSSSSSSTTSTTTTTTTUTUUUUUVVUUVVVVVVgggVVVWWVWWVWWWWWWWXXXXYXXXXXXYXYYYYYYYYYYYYYYZYZYZZZZZZZ[ZZklk\[Z\[[\\\\\[]\\]\\]]]]]]]]]]]]E:;:;;:;;;;;;;;;;;<<<<<<<<<<<===>>>>?>??????@?@?@?@@?@@@AAAABABABBABBBBCCCCBCCCCCCDVWWDDDDEDEEEEEEEFEFFFFFFGFFGGHGHGGGGHHHHIIHHIIIIIIIIIIJJJKJK\]]KKKKKKLLLKMLMLLMMMMMMNMMNMMNNNNNOONOONOOONOPPPPPPQQPQPQQQbccRQQRRQQSRSRQSRSSSSSSSSTSSTSTSSTTTTTTUTTUVUVUUVUUVVVVVVVVVhggWWWWWVWWWWWWXXWXXWXYYXXYXXYYYYYYYZYYYYYZZYZZYZZZZZZZZZ\ZZklk[[[[[\\\]\\]]]]]]]]]]]]]^^]3;;;Y;;;<;<<<<<<<<<<<<=<==QQP==>=>>>?=??>??@@??@?@@@@@A@@A@ABBABAAABCBBCBCCCCCCBCCCDDCWVWEDEEEEEFEFEFFFFFFFGGFGFGGHHHHHHHHHHHIIHIIIIIIIIIJKJJKKKJK]]]KKKKLLLMLMLMMMMMMMMMMNMMNNNNNNNONOOOPOPOPNPPPPPPPQQQQQQQQcbcRQRRSRRSRSRSSRRSSSSSSTSSTTSTTTTTTTTTUUUUUUVUUVUUUVVVVVVWVhghVVWWWWWWWWWWXWXXXYXYXYXXYYYYYYYYYYYYZYYZZZZZZZZZZZZZ[ZZ\[llk\[\\\\[\\\]\]]]]]^]]]]^];<;<<==PQP>>>?>>??????@??@@@@@@@@@@AAAABBBBBBBBBCBCBCBCCCCCCCCDCDDDXWWEEEEEEEEEFFFFFFFFFGGGHHGGHGHHHHHHIHHIIIIIIIJIIJJJKKKJJKJK^]]LLLLMMLLMMMMMMMNMMMNNNNNNNNOONOONOOOOPPPPPPPQPPPQPQQQQQQQcccRQRRRRRSRRRRSSSSSSSTSTTSTTTTTTUUTUUUTUVTUVVVUVUVVVVVVVWWVhhhWWWWWWWXWXXWXXYXXYYXXYYYYYYZYYYZYYYZZZZZZZZZZZZZ[ZZ\[[[\[kkl\\]]\\\\]]]]]]]]]]=<<< =<=QRQ>>???>?????@@?@@@@@@@AAAAAAAAABBBBBBBCCCCCCCCDCCDDECDEDEEXXXEEEEEEFFFFFFFFFGFFHHGHHHHHHHHHHIHIIHIIIIIIIJJJJJKJKKKKLLK_^]MLMLKLMMMNMMMMNMMNNNNNNNOOOPOOONOPOPPPPPPPPQQQPQQQQQQQRQQccdRQRRSRRSRSSSTSTTTTTTTTTTTTTUTUUTUTTUUUVUUUVUUVVVVWVVWVVVVhhhWWWXXWXXXXWXXXYXXXYXXYYYYZYYYYYYZZZYYZZZZZZZZ[ZZ\ZZ\[[\\\lkm]\]]]\]]]o]]],?(@ % #$$*++ !"!"""""""""##"######&&&-..###$%%%%%%%%%&&&&&&&&&&&***111&&'(((()())))))*********...454+++,,,------....///////0333:::000222223333444444555555888>>>556777888@ Y $$$+++ """""""""#"##########'&&...$##%%%%%%&%%&&&&&&''''&'***111''')(())))*)**)***+*++*+...555+++-,----././/////000000443:::011222333444444555555555888???676888888899 L !!!!!!$$$+++ """"""###########$$$#'''...$$#%%%&%%&&&&&&''&''''''+++222'''))))))**)***++*++++++../565,,+---...//////000000000444;;;111333444555555555555555999@@@776888998999:::  ! ! !!!!!!!!$$$,++!!!"""""#######$#$$$$$$$'''./.$$$%%%&&&&&&'''''''''''(+++222((()))******+**++++++++,///666,,,...///0//000000011111444;;;222444445555555555665666:::A@@777999999;::;;;<<<= !!!!!!!!!!!!%$%,,+!!!#""#######$#$$$$$$$$$(((///$$$&&&&&&'&'''''''(('(((+++222(((*******+*++++++,,,,,,///666,-,//////000000111111111555<<<333454555555555566776777:::AAA88899::::;;;<<;<<<  $$$+++ !""""""""""#"#########'''...$$$%%%%&%&&&&&&'&&''''''+++222''')*))()*!"*! +((++++++///667,--...//////000000011101554<<<232444444444455566667666:::@AA777::::::;;:;;;<;<**++++++++++,+,,+,...444,,,------.........//////111677///000000011111111222222555:;:3334334114dd5nn5::6336679:9???888999999::::::;;;;;<<<>>>>>??>???@@@AAAAAADCDIIIBBBCDDDDDEEEEEEFFE$$$$$$%$$%%%%%%%%%(((///%%%&&&'''''''''(((((((((++,222(()******++*++++++,,,,,,///666,,,.%%.//00/.0/0444;;;222333443444444555666676:::@@@777888888999:::;::;;;;;;>>>EEE<=<>>>??????@??@A@!!!!!!!"!"""""""""%%%---"""$$#$$$$$$%%$%%%%%%%%%)))0/0&%&''''''(((((()))))))))---444*((+**+,--.LL/((222999///101110111222323344444878>>>444555766777888888988998<<=DDD:::<<<<<<======>??!!"""""""""""#""""&&&---#""$$$$$$%%%%%%%%&&&&&&&)))000&&&(((((()()))))))******---444*)*,$$,--./77/,,3329990/0111222222333444554455888>>>454677777888888999:9::::>>>DDD;;;==<===>>>??????"""""""""##"######&&&--.###%$%$%%%%%%&%&&&&&&&&&***111&&&(((()())))))*********...555+++,))-88-./OO/))/0/333:::000222222333444455555555888>>>565777888888999999:::;;;>>>EED;;;===>=>??????@@@"""""""#"#########'''...###%%%%%%%&&&&&&&&'&''''***111'''()())))))*********+*+...555+++-.--**. / /))001000343:::111222333444554555555555898?@?666888888989999::;;;;;;;???EEE<<<>>>??????@@@@@A""##"#############'''...$$$%%%&%%&&&&&&&&&''''''+*+111''')))*))********+++++++///565,,+--..++/220670,,000000444;::111333444454555555555555999@@@777888999:99:::;;;<;;<;>=??@@@?@AAABBBBB"########$$$$$$$$$(((///$$$&&&&&&&&'''''''((((((+++222(((******+)'+(&+++,,,,,,0//667---.''/aa0011((111555<<<333554555513523665777777:;:AAA888999:::;;;<;;<<<<<====A@AGGG>?>@@@@@AAABBBBCCC""""""########$###'''...$#$%%%&%&&&&&&&'''''''''+++222'''))))&"*/4*4>+'$++*+++///667,--.,+/::/00NN1,,111555<<<3224334-14F=4?96/2676666:::AAA777999:::::;;;;<;;<<<<<<@@AGGG>>>?@?@AABAABBBBBB-----......./..///111677///000000111121211222222555:::33340-4Ka455e6316669:9???87899:9554--4//933;<<<<8;>i>@@nW@:=AAACCDIIIBBBDDCDDDEEEEEEFFFFFGGGGJJJOOOHHIIJJJKJKKKKLKLML''&''''''(((((((((,+,222(((******++*+++,++,,,,,,///656,,+.+(.///0?O0-*444;;;112211455\e=ED411677:::@@@7148QD89:;؊;79;:;>>?EEE===>>>??????@@@@@AABBBBBEDDKJJCCCDEEEEEEFFFGFHGG$$$$$$%%%%%%%%%%%%)))000&&%''''(((((((()))))))))---434*))+($,y,,--9D.+'222999/..,((k577312777>>>4.15G>7788τ836988<<>?????@CBCIIJAAABBBCCCDDDDEDEEF$$%%%%%%%%%&&&&&&&))*000&&&((((((()())))))******---444**+,)%,>O--.U|/36/0031199:/..121DSR1..888><=5546>:8~[8ߏ8ӈ9]K926:::=>>DDD;;;==<===>>>??????@@@@@@DCDKKJBBBCDCDDDEEEEEEFFF%%%%%%&%%&&&&&&&&&***111&&'(((((())))))*********...555+++,,-,*&-,+.--/Kf/u/a356:980/0.))i688432877>>>6`7z8vW888978936::;;;;>>>EEE;;;===>>>??????@@@@A@AAAEEEKKKBBBDDDEEEEFEFFFGGF%%%%&%&&&&&&&'''''***111'''((())))))*****)**#*+%...555+++-,,----,,.-*0i0|0y4>I:861010..9@@I__1--555856?MG6y8Ɂ8t999968:;:;;;;;;???EEE<8<>6>?=?@@?@@@@AABBBBBBEEELLKCCCEEEEFFFFFGGFHHH%%&&&&&&&'&&''''''**+111'''))))))*)***(+*'++Q++G/.(555,++----..////-+0H`0n0Y443;:81110,,Lcb{{]1--556989@=?7|Y8t9oT967;::;;;;<;<<>?@@@AKAB>ABBBCCCCCCGFFMMMDEEFFFGGFHGHHHHIIH&&&&'&''''''(('(((+++222(((******+*$++H++,,,,//662-,)//1//+00000011110010/5Ld<[y36:543311=EEBOO421766798:qUAu[898978:::;;;<<;<9<<<<===@1@GG>>@@AAABB7BCCCCCCDDDHGGNNMEEEGGGHHHHHHIIIIII%&%&&&&&&'''''''''+++222'(())))*)**&**9++++++//678-,**))K** ///10010000/4H[>??A@ApAB:BBBBCCCDDDGGGMMMDEEGGGGGGHHHHHHIJI100111111211222222555:::33343344444555-55l666699K??b55TTyyaa886771::8<<>DDD==<>>>=<>EEE<:<@EAKrKiiWWA_AJDKC:CE?EE<>EEEKKKBBBDDDEEEFEFFFFFGGHHHHHHKKKQQQIIIKKKLLLMMLMMMNNN))))))******+**+*+...555+++-,----+.'+/&./-00000014.6:201/00..-)01+02,12.220556;>>HJH=>=;9;;9<;7=<8=;7<@>?BABB>EHFKCCCEEEEDEB>FDAGHHHHHHHIHLLLRRRJJJLLLMMMMMMMNNNNN)*)*********++++++///565,,,---+.'>/MG0]001/0-/0.G4ZV;q417231342B4OH5\657554555988@@@677998444BBAKJJ655;<<<<1Ly4;Y214,442O5jY5~:5>464666:::@A@777544FFFccc444<<<@??GFF>>>?>@BC@_~@^{BCCB?;CaCFMUfDB?FGHHhIEAIIJJMMMTTSKLLMMMNNNNNNNOOPPP***+**++++++,,,,,,///766--,,/(/001C1U=1I{5<[314.45495>=5D655666777:::AAA777212BBB:::A@AGGG?>>@@@@@@GNAGMBBBC?AA@@?AA@BBCBBBCFHDcGcxMB@EOVFGHHIFBJJJKNNNTTTLLLMMMNNNOONOOOPOO444444555555666666::9???888795@9Gv::W;s8;4;<;>>>>>>>>???>?>UKUgTgHFHHHHBBB<<>>BBBCCDRQNcxw^DDE@@C?@CEEFHHHHHHKLKQRRIJJKLKHEKHELHDMMKNOOOOOORRRXXXPPPRRRRRSSSSSSSTTT,,,,,,,,,---.-....222999///001111211221333343444788>>>444253<9=DDD;;;<<<;<>AXXOЊl^^C=>>EED;;;======lVVy\\EBB?@@AAADEEKKKABB@@AZZOъkqqJvvbaaVLLNJIJKKKLKLLLLMMMNNNNNNONNRRRXXXPPPQQQRRRSRRSSSTTT---...//////000000434:::111222333444545454.5.+1+^J^ۋSCSmSmaMb898:;;<;<==>=???;>><>??@@BBBABBlYEzcLFECDEECCDggWzzaabSܒuvdBBGFFLJJMMMMMNNNNNOOOOOORRRXXXPPPRRRRSRSSSSTTTTT...//////000000000444;:;211333444454454858]5]>?><>>bLLoQQABAABBABBq\FfMIFDEEFFFFAAD55?iHHFrrMXXMKKNNNNOOOPPPPPPSSSYYYQQQSSSSSSSTTTTTTTT//////000000111111444;;;222444455554050561aiQi272;;;<;<<<<;<=:==[MNрz]]?9<@?GGG>>>???>??rZZbbFDDABBDDDGGGLLMLHEo[GUNGEGHIIHIIIBBFCBFEEJPPThhLMooNLLOPPONNPHHPKKPMMTZZZRRRSSSSSSTTTUUUUUV999::::::;::;;;<<<9?9kDk=>R>R:>:@?@<@<8@8;A;DCCIIIBBADDDDDDCDDFEFFuFGuJIJNONIHHFHH[RSp^_HJJNMMOPPSTUwOёQQVTQPQRSSSSTTTTTWWW\[[QQUOOWSSWXXXVVY\\YYZ\]]a[[[\\\\]\]^]^^]^^^343444544555566373B9B@7884949:9:::;;;;;;>>>EEE===>>>>??=?>E@BAzABzIEGIKJBCC?BBdžSMMEGFJKKQQR|JЎKKWRLKLMNNNOOOOOORRRXWWPPPRRRRSRSSSJJSTUUX~~]PPVWWWXXXXXXYYYYYY111111222333444/4/M7M>456878686888889999<==DDD:::<<<<<<<=<9>;`?O?h`@O@CAJJI?@@BBAⓒ_RRACCJJJMNP`THpIo\JFIKKKLLLLMMMMMMPPPVVVNNOPPPPPQQQQGGQRSSV[KLTVUUVVVVVVWWWWWW222223333444445454282>467/8088898999::::>>>DDD;;;===7=:6>:7?;5?:8@<<@>DDDJKJABB;??hi~~BEEFGGKKKQQQEGHCGIAFKEHLFJMGJMNNNNNNRQQWXWOOOQQQQQQRQQLLRxxSTTWee\RRUVVVWWWWWWWWWXWX222333444454555555686=?=`5`Y7Y282888989999:::;;;>>>EED;;;7=:b>P??Z@M<@>AABEEEKKKBBBCDDEBBUUZZUFFCGFHHHKKKQQQIIIGIKaVLMɍMr_MIKNONORRRXXXPPPQQQRQQSRRSSSNMTffT{{T]]XZZ]VUUWWVWWWWWWXXXXXY333444454555555555888>@>.6.181888999999:::;;;;;;?>?EEE9<;C>A?@@A?A@@BAEEEKKLCCCEEEDEE>CC?CCDGGIHHHHHLLLRRRIJJHJLҏMNNNVSNMNOSRSXXXPPPRRRSRRSSSSSTTTTQPTNNUVUX^^^VUVWWWWWWXXWYXXYYY444455555555555565999@@@776888999999::;;;;;;<<<=:?=@q@ABk;B?BCCFGGMMMEDD@FFfFGHHHIIICIIJJJMMMSTTLLKFJMrNNOPKNPPPPSSSZYYRRRSSSSTSTTTTTTUUUVVVVVVYYY^^^VVVXWXXYXYYYYYYZZZ555555555656667777:::AAA878999:::;;;<<<<<<<=<===@AAGGG>>>?@?<@>dASaBQ=C@CCCDDDHGHNNNDEECGGGHHHIIIIYJJFKJNNNTTTLLMMMNHKNk\OqaPLNPOPQQQQTTTZZZRRRTTSTTTTTTTUUVVVVVVVVVYYY___WWWXXYYYYZZYZZZZZZ444444455565666677:::AAA777999::::;;;;;;;;<<<<<<@A@GGG>>>@??@A@:A>>>>>>?@?@@@AA@AAADDCIIIBBBDDDDDDEEEEEEFFFFFFGGGJJJOOOHHHJJJKKJKKKKKKLMLMMMMMNPPPUUUOOOIPPPQQQRRSSOTSTUTWWW[\\UUUWVVWWWXXXXXYYYYZYYZZZ\]\aaaZ[[\\\\]\]]]]]^^^^^^^_^_aaaffe``_``aaaaaaabbacbb888999::::::;;;;;;??>EEE===>>>>?????@@@@A@AAABAAEDDKKKCCCEEEEEEFFFGGFGHGHHHHHHKKKQRRJJJLKKEKLWLL]MNHNNONOOOORRRXXXPPPRRRSRRSSSTSSTTTUUUUUUXXX]]]VVVWWWXXXYXXYXYYYYYYYZZZ]\]bbb[[[\\\\\\\\]]]]^_^666777778888888899<<>=>>???????BCCIJIAAABCBCCCDDDEEEEEEEFFFFFIJJPPPGGGIIIJJJGJKGKLLLMMMMMMMPPPVVVONNPPPPQQQPQRQQSSRSSSSSSVVV[\\TTTVVUVVVVWVWWWWWWXXXXWX[[[`aaYYYZZZZ[Z[[[\\\\]]778e888888989999:::>>>DDD;;;=======>>?????@@@@@@@DDDKKKBABCDCDDDEEEFFEFFFGGFGGGKKKQQQHHHJJJKKKLLLMMMMMMNNNNNNQQQWWWOOOQQQQQQRRQSRSSSSSSSTSTWVW\]\UUUVVVWWWWWWWWWXXXXXYYYY\[[aaaYYYZZ[[\[\\\\]]]]]888888999999::;;;;>>>EDE;<<===>>>??????@@@@A@AAAEEEKKKBBBDDDEEEEEFFFFGFFHHHHHHKKKQQQIIIKKKLKLMMLMMMMNMNNNONORRQXXXPPOQQQRQRRSRSSSSSSTTTTTTWWW]]]UUUWVVWWWWWWXXXXYYYYYYYY\\\aaaYYZ[[[\\\]]]]]]]]]#989(999:::;;;;;>>??????@@@@AABBBBBBEEELKLCCCEEEEFEFFFGGGHHGHHHHHHLLLRSRJJJLLLLLMMMMNNNNNNOOOPOORSRXXXPPPRRRSSRSSSSSSTTTTTUUUUWXX^^^VVVWWWXWWXXXXXYYYYYYYYZY\\\bba[Z[\\\\]]]]]]]]W:::';;;;;<<<>>???@@@@AABBBBBBCCCCCCFGFMMMDDDFFFGFFHHGHHHIIIIIIJJJMMMTSTKKLMMMMNMNNNOONOPPPPQPPQSSSYYYQRRSSSSTTTTTTTTUUUUUVVVVYYX^^^WVVXXXYYXYYYYYYZZYZZZ[ZZ^^]cbc\\\]]]]]](0` B !!!)))!!!"""""""""###""")))((($$$%%%%%%&&&&&&'''///''(((())))))******000000,,,---...///000111998111222333444555444::::::777888[ ` !!!!!!)))!!!""""""########"*)*)))$$$%%%&&&&'&'''(((000((())))))***+++***111000,,,-..////00000111999222333444555555455;;;;;;777899999 7 ! !!!"""***""""""######$#$###***)))%%%&&&&&&''''''(((010)(()*****+**++++++211111---///000000011222:9:333444555555555565<<<<<<888:99;:;;<>>???@@@A@@'''''''''((()((/00))))))******++****000///,,,-,----......///6660+*0JJ122cc2++999988555666666777888:::A@@::::::;;;<<<======CCCCCC@@@AAABBBBCB !!!!!!!!!"""+++"""###$$#$$$%%%$$$+++***&%&''''(((((())*)*222*+~~+,-- 444333///110111222333444<;;444665776777888888???>>>;;;<<<===>>>"""""""""#####$,,,$$$$$%%%%%%%&&&%&%,,,+++'''((())))))***+++333+&',CC--/\\/('555554111222333444555555===666777888899999:::A@@@@@<<<>=>???@@@""""""######$$$,,,$$$%%%%%&&&&'&&&&&---,,,((()))))****+**++,334,-,-)).++///0**/00666555111333444555555566>>=7778888889:::::;;;AAAA@A===??????@@A""########$$$$$---$%%%%%&&&&&&''''''----,,(((*))*****++++,,,444,--.++/@@0GG0..000766666223444555555555777???888888:99:::<;;;;;BBABBA?>>@?@@A@ABB######$$$$$$%%%---%%%&&&&&&'''''''''...---)))***+(&+**+,,,-,555-,+/55001GG1,,777777444544513555666888???888999:;;;;;<<<<<>1..8888884235345E=613767888@@@999:::;;;<<<<=<===CCCCCC???AABBBBCCC,,,,,,------...544...//////0000000006665552.+3b44w566664===788633633877722:;;@@@?>?<=<<{>?l?9<@@@GFGBBBCCCCCCDDDEEEEEEKKKJJKHHHJJIJJJKLK$$$%%%%%%&&&&'&///''''((((())())))))00//.-+*),,-.;I0,)788/--9@@{EUU1..:::9365K@788999:99BBB<;;<<====>>>??????FEEFEEBBBCCDDEDFEF$$%%%%%%%&&&&''///'''(((((()))**))))000///+'#,V--k/490/-888*$$Zp-'':::9676?:8q88b:26;;;CCC<<<==<>=>>??@@????FFFFFFBBBDDDEEEFFF%%%%%%&&&&&&'''///'((((()))))***)**(000000+,+-)&---/Je0v1Nj852.++AQQQnn0,,:47:kS7z8tV888936;::<<<=???@?@@@@A@AGGGFGFCDDEEEFFFGGG%%%&&&&&&'''(((000((()))*)***'+*&***11+001,,,---/*%0Rt0}1Ss950101344r~<>=8NC9=;;::;;<<8<=6=DZE?>@@@\@B;>EE>?@@AAB5BBBBCCCIIIIIIEFFGGGHHHHII++++++,,,,-,---545...//.//*00H000067t5577JJ77311,5537;??KV89:755K^^Rjj;99;;;AWLAJE=;=;6<::::::<<<=>>======C?AA?AAEALhKłFFJDJFQFGUGHCHIIIJJJJJJPOOPPPMMMNNNOOOPPP'''(''(((()()))212***++++++,,,--*--)220::?~~\\555==?444555666767887878@A@???__݄GNGFCFA>AB?BDDDDDDEEEEEELLLKKKHHHIJJKKKLLL)(())))))***+++333+++,,,---...//////55522/VV{}}gfssYY|QQmLL[442777888999999878KVK[w[]}]zzpqŅdd?:>@=CGCJCCDEDEA>>888222RRR_^^555<<CG?Xn@EHA@>BYoCiKFHEGHFiGa{HGEHHHHOOOOOOLLLMMMNNNOOO***+**+++,,,--,455*.%F/]/0c1:1B7y774:657L5c<5D564888@??444LLLeee555CCBCBB>=?EI@XmBEHBDDC~DLP\FrGHI_uJFBIPPPPPPMMMNNNOOOPPP***++++++,,,---555*.%K/e01k1-1*[8~T8o342454352565565676@?@---000CDCBAB==>A@AA?BBBCCAD]uEnMDAFzHHIc}JFBKQQQQQQMMMONNPPPPPP333344444555666===776786_8l9@:G8:6<@9=?9<<<<<<:<:=>>HHIbbVnn[IIIGGIJJJLLLJHMPMSMKOUZO}PsQRQRRRSXXXWWWUUUVVVWWWWXX,,,-,,---...000877000111-2',2&231444::::9:353676F?E575[J[WIW@A@<<<888ABCGIH:99@@@CCD\]QgfTAABQQKFFGDCFHHGOOOIIHHGJE@KGBLMLMMMMSSRSSSPPPQQQQQQSSR,,,---.-.///000888010212222333444444898,3,4.5]}eOe0517:8ACB<<<;<;THH]LL>?????EFGCDE::>ggVÄlNNA<;CMMNJIIJKJLLLMMLMMNMMMSSSSSSPPPQQQRRRSSS---.-.////00110898111222333444454131A>BcxPx\~gPg374?<>LCH<<<;<@iiWĆk^oXYTGGIJJLMMMMMMNNNNNNTUTTTTQPQRRRSSSTTT...///0/0000111999222333444353757-/-qbNbA=A9:98<9W>B??EAA?@@BBB|bHgXHACDEDEMNJll[CCGPPMKKNNNNOOOOOOUUUUTUQRRSSSSTTTTT///000000111222:::333444353;5;51ueOe/5/;;;;<;B=@REK=>>@AAnnwwNII?AAUOIOLIDEEFGG>>Cnm[HM^^NLLOPPPPPPUUVVVVSSRTSTTTTUUU//////0001112228:8*3*040242?5?65VBVlzYz787;;:7;:7<9:=;DED=>>DBBvv~~ULL?AAHIIEGIACECEGHHHEEGgx``YKMffNKKONMPHHPSSVVVVSSRSTTTTTUUU444555555666676D?Cm8mN9N5948:8M;LN;N<@<5;5494???<@>k@VAoXCMFJHDDD?BBu^^ffCFFHHHKLM^VMvKycLIKMNNMFFKFFKRRU]]QffRRRSQQT^^TUeeZWWZWWWXXXYYYYZZ6667767778882:2@::K;L8<89=99=9CCCCCC@@@AAA>>;;;8<:1=6P>Gw?[I@DGHG7<8-7-/8/889:99;;;;;;AAA>@?A=??@@@A@ACBJJJDDDCDDCAAFABDFFIHHNNNLNNHJǨMNݖNSQONOPWWWQQQRRRSSSTTTNMTLKUSSZZZZVVVWWWXXXXYY444555555555777???8878989:::;;;;;;;;BBB>A?J>D?@BFBDADBKKKEEEBFFWGG_HHEHIIHHOOOMNONMLMNO\VPNOQWWXRRRSSSSTSTTTUUUUUU[[ZZZZWWWXXXYYYZYY555555555666888??@888:99;::<<<<<<<<C@DEELLL@EFgFGHHHIIIBJJPPPPPPHJMxcNOkPKNQQQQYXXSSSTTTTTTUUUVVVVVV[[[ZZ[WWXYYYYYYZZZ555555666777888@@@999:::;;;<<<<<<===>??????@@@GGFABACCCCCCDDDEEEEEEKJKKJJHHHJJIJJJKKKLLLMMMSSSLNNZOOPPQQlRRNSRXXXWWWUUUWVVWWWXXXYXXZZZ___ZZZ[[[\\\\\]]]]]]]bbbbba___``````baa777787888999:::BBB<<;<=<===>>>??????FFEEFEBBBDCCEDEFFEFFFGGGOOOIHIGIJDJKFLLIMMNMMRSRRRSPPPQQQQQRRSRSSSTTTZ[[UUUVVVWWWWWWWXXXXX]]]]]]YZY[[[\[[\]\878888888999;;;CCC<<<<===>>>??@?@???FFFFFFBCCDDDEEEFEFGGFHHHPOOIIIJJJKKLLMMMMMMMMSSSSSSPPPQQQRRRSSSTSSUTT[[[UUVVVVWWWWWWXXXXXX^^^]]]YZZ[[[\\\]]]888"999999;:;<<????@@@@AAAAGGGGGGDDCEEEFFFGGFHHHIIIPPPJJJKKLMMLMNMNNNNNNUTTTTTQQQRRRSSSSSSTTTUUU\\\VVVWWWWWWXXXYYYYYY^^^]]][[[\]\]]]]]]?999<;;:<;;<=>>@?@@@@ABBBBBBBBHIIIIIEEEGFFHHHIIIIIIKKJRRRLLMMMMNNNOONPPPPPPVUVUUURRRSTTTTTUTUVVVWWV]]]WWWXXXYYYYYYZZZZYY_`___`\]]]]]:( @ ^ &&&""""""#"####)))%%%%%%&&&&&&,-,))))))******010------///00/666222333445555;;;888888t \ !'''###""#######***&&&&&&&'&'''---****$%+%$+++111....//000000777444555555555<<<999:99;;;r!!!""""""((($$$$$$%$%%%%+++''''''((((((///+%%+BB,HH,''333000000111222899666666666778>>>;;:;<<===&&&''''''---))))))******000,,,,-----...4,,0ZZ012oo8/0565666777888>>>;;;:;:<<<===CBB@@@AAABBB!!!""""""((($$$$$$%%%%%%,++(('(((()))))/"",,-.5''111111333444:::666777888999@@@<<<===>>>""""#####)))%%%%%%&&&&&&,,,))))))******0---:9-//GG611222333555555;;;888888:99;;;AAA>>>??>@@@#########***%&&&&&''''''--.*))*$+$+*)111.--/00557554234)/5*0555<<<9999:9;;;<<==:;;<<;======DDDAAABBBCCC)))******000,,,------...3.)0Rs012`7/(;>>szBKK<-3;f;<=~^B8=@@@AAABBBCCCIHIGGFGGGHII$$$%%%%%%+++(((((()('))$/*$,Kl,-.r/%$[j3')6v789wX?5:<8<=;=>?>???FFFCCCDDDEEE%%%&&&&&&,-,)))))'*****B00.-+(-Mn//1GaK`\Ytx5\F8ͅ8͋9yX:79AS>?C?@=@AAAGGGEEEEEFGGG&&&&'&'''---))(**)+*++11++")"/G`0h6I]688>DE:\J9n8lQ6#/9/9BB??@@AIBB@BIIIFFFGGGHHH'''((((((///++&++?,,,-00>>PP1.*.109Yx3:CVus]6C<>|]7=<;48ZZKKAAAABBCgCE>DJJJHHHIIIJJJ,,,---...43400000-1100BACDU:@A99:CLLGQQ<<EOXEMTGFCHNNNKKKMLMNNN***+*++++.1+=.M/0h1x7R/p?.LJ0a02,887DDDQQQ<;<:6IyFGHXfIMJOMMMMNNOOO+++,,,,,,-3'W0~012y9[664:=5F<:<222877FEDHOADIBdEKHIJoKLFROOOOOOQQQ000111222785<5B{67I8Z@fKfspRFRABC365pcc|mm89:FGGYYOv~yxZRQPA>GHGKJHLLJMSSSPPPQQQRRR---////0066622223202/R?RlC;@i?TB<@ZJJcOOCB?oZFMHEsffUIIKLLNOOOUUTRRRRRSTTS///000101272)3)+5+{0{RɃ195:;:nAXLAFnmttTKHr]GHFE]ECDDCB͌۔RKLHIHeHeSEkm[Ք̉QOVWQQrrWPPUUUUVVV666474>8>>;;@<@Q;Q???;><0>5BtCiDYta]jmh\JٓMNBFMKLOQQSeeSVVUUV[iiYVVZ[[[111/3/A4A:67888392>?>:<;r=W>q?fFAFfetuIKGnJ{J~fLKKMQRSLLPIIQRSXnnVQQVWWW333555/5/p:p8c8c494;;;7A<>a?@wA\;GACFFrrxxMMLBGL{cLMNpNKPTQRRNNRnnTTZSSWWWWXYX5545556564<4-9-393;;<<<<6B>>;:;<;<<=====BDCHADBsCrIDG=KJHHIIJJKKDQRRPOzO~QYUQUVWTTUUUUVVVWWW\\\ZZZZZZ[Z[;;;<<<===CBB@@@AAABBBCCCIIIEGEICHJIJOOhMMNNPOyQQPVVRSTKPUKPUUUV\\[YYYZZZ[[[[[[```^^^^^^___777888999???<<<===>>????FFFCCCDDDEEEFFFMMLEJIRJKWMLHMMSSSPPPQQQRRRSSSXXYVVVVVWWWWXXX]]]ZZZ[[[\]]888H999;;;AAA>>>???@@@AAAGHGEEEFFFGGGHHHNNNLLKJMMKNNONOUUURRRSRSSTTTTTZZZWWWXWWYYYYYY^^^\\\]]]]^]\;;;H<<>>CCCAAACCC((((((---+++,++-,+1.*/02Uy81*rx>5;9|Z9;Ո@:=@>?@@@BBBGGGEFFGHG$%%%%%***(())(#**$/+!,Y-.n2;=9=>9>@A@FFFDDDFFF&&&&&&+++**"**]++//v'!+E[2i29B{7G?9n5gP5!/?s???@{@B;BGGHFFFGGH)))***/./-- ---.88^^IFW1:?6FXLaaQij9YH9ICR]OhhHHBBDDF;FKKKJJJKKL***+++000..+,/7*+pXZ[Z;::899:;<===`_gh?@DSFHEHMMMLLLNNN)())))./.,-+8-?.-!E@P{z``@@H10/313BHBfgU`QC7COUFGFHMLLKKKMMM*******/%U.}/|1s4D/UC/U02-==EqpyyMJD[PFOKHړ[ttLTTQWVURRTUUU454/6.;:x:x^:^]J\@yC_6E@PPTT=EJ~eNMOSSSQRSRRSssUfeZUUWYYY6667779<94;4<<;>>>>CAAhCSFOVJHFFGGgMNYWPOuQQSVUUUUUVQQWXX\ZZZ[[[:::;;;@@@@?@@@@BBBGGG>FB>GBFJIPNNLLNNYSROSTJOSNQUYYYXYXYYYZZZ___]]]^^^888999?>>===>>>@@@FFFDDDEFFIIIKLLDKKFMMOQQRRRQQRSSSXXXWWWWWWYYY]]][[[]]]:99;;;@@@???@@@BBBGHHFFFHHHJJKNNNMMMNNOSSSTTTSSSUUTYYYXXXYYYZZZ^^^]]]^^^AAAAAAAAAAAAAAAAAAAAAAAA(   ~#########'''%%%)*** +!!.//...333444555999999###'''''''''+++)))-''.yy/3..322777888:::>>>>>>"""&&&&&&'''**))%!-#"-/4*+3+/877888:::??????$$$(('((()((,/1+AW/*-/ff0oo6315`J:?<;:;===BBBBBB&&&******,(/@L./Jinu6mP9>[N?-=??>BAACFD@FBDKILLOOMRSMPSUVWYYXYYZ]]]]]]999t>>>???AAAFFFFFFLKKEMMFOOTSSRSSWWWXXXYYY]]]]]]}AAAAAAAAAAAAAAAADisplayCAL-3.1.0.0/DisplayCAL/theme/icons/DisplayCAL-apply-profiles.ico0000644000076500000000000047406312647526530025251 0ustar devwheel00000000000000 -v (@@ (B00 %3  Y Cj hsPNG  IHDR\rfIDATxڴ eGU/>ݙ $!!7w!b@yWFP@x9OuWLsqDQ=$&twNvZV>_}]Z_x=G?Y /3x:m&៦x}χ/|r̖Ra󴾾~RR M^z[TWJs#e]~ >Z8??mmm ?zcE&ж6EJPςuhr9=m[\afv?mnn߆Cԇvh=K=v]嶮 O?_GY͝߶EoO!`dB3ɟvt6ǻmם:A^D:g}Mxy~{^(H_...j0:?RNx7-+ і-P?}mSyV˩uA,,uVjiaa?mQ`W:H(YԠ]ӊwE=v`lvf7f~i(uh\n1pZ(2}ֹ[X6IY⎟fU=ވ6f3ۧ!yޚ)w>Y:yv&;Z7ooRϺB/ :'"rWmj4*qnp}gy F ƪ/,{U#bRMwsiQi?utnn666˖@ 3K0*A)mAںv#MӼ5Ha3 6V-Xi *}L?+%[6-\@(Ew7Yx%`ZqS2T ;%@R"BYH @P =C}p7PX?V U5*6[6?K5z()+6YK1O(WK iY3 !#3P,Hw".e7}73C$@@  3n(m+ДJ?)/ j8ٝn޴NeaTPd93 V쿣ko-ГύiBܣee;RqD`&(m)6kX)Q<CETvt4$md'^Q8>^\8^&? q*7l. `Z˰IٯbX]f%*^\oc&2̏~.Oc*XGP2 u*[=ը(*\lQ;T-5|-. K*bonC tqU+yIRW+S,suQ9mFC \,}Smy6L@E`|` IQAq :9*7g[fZ?-o H5®cթ"@ s#.K(S "D4˓ Ja rHZ|8@W/Oo& Pۀ2N{n@V(ʲ4Z/|ΐx(sMX#tu`XLρ,m>&%pm:\!h}zE7xr y0.`Q5@4:`immua8m ]>*Nj ;@" P vI*[@a 1{uiqN@Y.(XHʡ+RN%?SF)"xL .fN;'+hhiu1$+J4p. T[^] &3ҽ փ+[iI3AAݖ>s@Y8 0oۯ4ژ*rc|9eu0aBK|] `m`VO%fLp [GJⶅ{-=9n :qK k3NB8nM_d 'zO B7Tv h( РaG!  @B(9 (k27YZ7dCӉ:O%L/sV  !ȸӁ ^.}4fh 6Bՠ? b.U`xOvr<6 vcç7=nJ4O %eMH*e>6,uPXT(xjH}ur|m]3ZQƕFP$[~~d(8#C)(]ABo ۨrT3yo%O "_œďjubh|SM:u@塅-3Il L Lg`= GuIdXC4pT,fgY1$2'IBt0#!x0(8!N/&[S&:qU= X&r8Cl<0 ʑog>iBA%ek+4i8 C,fB]>#7XXV$k THiT!h =N)Gp'v0 _,]"X[R?i)F4VL8" }8$`}RDݰMdݱnwr0!1?[[S)M|Ѝ#GKc`Nh%t0fj!e>AtycĢ;>º rtjaqWǑA(9e',(qU }Wk_sٻdaʣ::r(_3@!PQE= j*!D3:h!@U0zH1!i1]$BDXY]Qtyc3Q^N,i20(JtL\S87\ͪ:0$jhX̦۰ @0 HwSa^A/.A$7|2;Ϳ0;PB.ȟ/#nRUvx~((Ԓc̙ȧAwfC7K7\s5׆'Ə.'F&Ӥ<5BWrk. n\VsAF-€^)!0dKKe"uv,FdoP~%Jrg,V;U ӯ[v$EgEAkx,mo*:2B5DLAZf&ڌu6tai`b}h|bxDG7D਌I Dj-$}yQ@^'+Ge8""z>wjJxiq!N](oF`tLf̒OS]'+jLpR7&B@T=.ɨ?b$,J=(bS9xn\ms  . nڤSlj>*0 8).OjqUDIP+eI0Ӳ*GiH˗UD1O%l9IljD X@)09Z\Pou*R%_o|3yFZT+6Y̬$ S|hWm]Yq3/n8@x"!Ԯ8=~T΀V׫8? Y 0"|\=4F*/' B]Oٛn}MK1SM&3Ug0\eY%MJgLp-ayF`dij,l<\PJ|,ڏ2N,Q ^Ш`-*pKkݷb&d B_qvT `0mAHFڶ.bA/ius<;BpU9K9V )F_Kzp3GDpDumO,gF6wn1^CVL.91,^U<_; eۤFDՒ`Ep:wkxh@hB)Z!{tRJP-,5_WB, > ~V&QZl>|NUQŠV30߁QYk%JG;)g!Qfcq2dZ2ׂ .<1׆󗳺yxBu|o6 WG ߭oqEQC,]nk7Ey+Qn+)aAںlSLBSR<.W<4W)Vq&7/oK?:5XGaء!τvU:GX{@P("rp0e[DJBh]u}|l*PprXWбn/s]H|>7013 @W|ih <P-o]K* UPKڰW:J Dk#hAIPl@7 &p^)82Jjh 2IJeSBZUY;Q)1xF xYwrmzt80w6V}ImT|}Z=oŐ' |P&㉽Z3ߓ~,\&f)Wa 3W $ }BT@ \#7U@9f\Rgf {Lp-/ʹ&C%9̩'i"عLtAR^"b檠Fxɩ XpRJV2 vrUQQàQ+d&`emM28hb]}#} zQ~,ҋ`I7P{H 0UXspf'd#88z8chVZ>r'x[@E;aRS&/@^T\SJȏ1-v 4/w!.#_٭HʫlZx⫯eQoT4cPvV, W:БvpbON2`fP87\Օ5a+QP#b}ӅDgP-;Wֿ!ʯ 2-xߞB7Ff@އ#r"P놻OHI'1tm= %`%:~wx=0w as^L ,FRoK%Sʄ (xZSeJM1ތvO=dٯH~xL2tUM֠ty3f_(0Ժuaq. C[;ɂ?ČCMV9@O.a7f =OH~^P&{’1>K>/amE~L"[jF(#kIxXÈo%TH"2BweݫZ&67C pi'BZ;Z{D*?hf$67ء~+G|ߥD!sf˟vdY-@h7$ ȹ, ByڲHnR@9? (F݇o ECIt|p>kf^[K߫ϜlÝ^ӽǨ1l]Sm Q9#}>8aGyI@P9c-m龐b4 @g>\e`{i\@CPt8/յe9 }8̂jrlXmYeriܑ{ ыHm7 hI܂,|]z܀ X\UR YCPko9;'#LGp\6=z[}8yp_@oz5?Dvonv.n񪡶U&C4O'ͧWQ’O:K%Y¬mMU4o/TDFM!_%eU_ ȑ#dV) HXJ=6+AWk{0qȃc_/:O̾|R׫S֜ k,y1:XX*5ṍ7%\s%DEL}&kK%?v3ћ^1.CJT,j$|CM \Dr]-ihv&fntP\"n3ԓ¶PuS9).,WhI\ejΜfUVY <@glƸoA\,o_>9A˳+~R`lRP ڔDU%VI76֏B<@eHb@W P;J1.ɱpB3 y/bIu|4,olϧ˚&%1 P?ؤ "Pžisz& y"y܎φѶUo[i~9Mpg0SF('k«JB"1gG} DKTpҏ⸗3Uyҏ2܊ P P_h'KFަ>{4>zsCo|]?D 6 YRRq\|1B tnTq:8 ^Fr]i:'EUL]rӟ+\  -̑=t@ 5ь$q[^idЂ DXM!CS,~3i{.ҳR+N>;m-ɧ"AQ HXZ}e1@ /Po. m.,UB ֓7!6Dп*w" gOƴdo*K6t  1 uB8vťQXтfPhH'ٰ]w`b;B* hMk爙,>oт0\>﹀Rw-2!9 C@Sq ol@ lj=?aEڿ݈@hn!&:~"[Ɗ޲jqexALԡ% V dUNzʹ(39X+kY4D7u2҉ut- 57OLkv=~t ]Y}k[ܖ>@ZXayuAxxElهOV9ߛ8W*,/+G0{t3!&~ŵ{Hǔ:ptA 0!q B)s|EExz_o7rrhBr8Ǒ-م_)ƅ3ς*ExLe$ -i<@Ld(Hr0{(@I,nh*ֽ6g˯CoʌӁOd D^k=r!1`G$dq6#YZ3\W};"qwӁq~U6;2t+.o[0A ᫁! ۊ`mأ dסJ< 7 9>L]tMN Ate`xH]$Vxв"لeG$ + ziRAn;s?n)b9 hFnΗ@,eهu渓S~. ySҹ8* xTP5/ȸ"! ؞@̦ ڔ3茏JQS÷yׅ_l[8ϓԳ=|5Je#zoVlz %pX1˛o +ϊ`i/ E .P%葀Qݞ*ި6T`.>(NxoFJ2XƱ#TwfcZA\1ZDwUR0<.FT $ uE ܀(%\"nWf?=o0w}gCJ$1`CL&7ZIoy}JLH5~?"C C JCU3jO ^G¥ٱh݀pqC5i0B @R pthɭR5JTК_yeeAA VC54J7|A'nFzvzM~Փh<9x}Tm!I;Q xJTTwrDT5Zv@x @!Zʸp;P%ә ':~v9Wt8f!87xfZͿϼhZ 0Zr㾀ݢG%r$)MNJ`qWquڝL@ *ZpFk$ғ݅P_+.`S+%$žYǹ€7ev56'YR 4@vOT]Ik>(SpS_>e!"d58/ց,'OP k{B>wF1 @-Ӊ=9Y"M_0С e=W_nK4I;E}㙴ɰ6J`sa>:E>vkc+Soq7o+xYH+p+S*Xse_^ %aɿS=oC=,H״Fvc&f6(mX[jL B{?of,58DNŏǠ" عș >R$\d!-L$lWLCIѧlMD!w}W_x7|"=*/[ S~{~ԯH_cXqI5A;חbm Q%@W%x>_8UPehϳ {yz [b" dSed; ^!8X $a(0SsGNЎF`آb%퐫HfJք Ԣ,0}C;c>e0# Sh 3i6yǿs @ 8YWc,T++*$,pcݏV_|+_Bғvx$h }|(βCЛp =QXC50 d\V7.iI9k5^"=9{:ЍCT 5笢VϢ$U10 6]řq4#dlaLB\+9! %`(5k;dv38lT~LJ\K"BE?/%hHn]]jɗ_DƗQɓ}%@`wa.@R>}-bP< i& Yw\O "6Ӊ; kXMѵѲ,P(⢠g j갞Do~eF2I&`c\LVAnd}2 F멙gfKm! :vݟnfip $p7?m@v!{3?4[__xJ^`. .* 8:W'w_//+qwi,?O,_@(~ICd^Чǚa{Yc߲kֲFsM?o>&=j-6 {ԧQ]saL%”f gt}Ҙ2PywAV *+bX"vİ=;XZ">~k~rv)*%zDG'$`NG2|TD QSyg% )/@F=B@e SQ!?ПnkJssI"Q0ٶf_7zxM 6M^G .xe؂{vFø:PoFN-_wr|EN 0KBw=:!(fq }*r(t zbo?(.؉KoY@Xra{=fZw>m̈) _ JE a;BɧwCbSn 1`&ة墠{/VnݵN`dGʖ >ߔ­1u2/mK^lL"5դ kKp]7m#Ge+UI,tz(4{ȑa]FLt9DP"*" }t= n}T2؛WC=<+AF|$spwPk#d.aYd"o-rQ'<;_ ~w81b3s!w>c{Dl .@ BsLr9WFF09<R6 Glۃ5ɚ3jI &G )0xXRh C}NYA)6o]~O>oM p71 h<^ ui%hcxЗǃ9\P֧d,5GG+wַAu_T< s%kDaRHhcp%.qUJ3D6=Oqh 7 &d R>]&[{]"QXG۶Sr`s9넠ݸu6| ^b J9kr> UtH$`_Y ,,lӦmRxe`AE=DN1 {v9< tNO-nQY '[KFOD) $Oqx}xg罠j x g2Vo|7P^YLbmfEv٭|9=M Ǐ>v$770?(IH¯x6Ǻ:{ qWx.5bag @!EԠ %$8uDWJԻXa77r\}OJ2Bt58F> Cy9Hx$z.T~y$_'saaWNuT!/ 0d?{s<2(x߼OT116K G%R1 & { "h; bzC@B 2}_4EA-178LNYa>`1!$(Z"CvA S5աwoLG%( z_*%:V!J 8q! ЗJ`Do=i`aa֬?_i8'mO`FV?)NK$"[q;)Gnm8VHQ0|Jlۺ({~~rK]Q\%R3b2 CAnˇ C\$j?XE˂%t~PgS Aw+[4gh>-)6˸>M dQ} n*}3Ae/)x(;!ǒs=XBxwdW7ɻDCOvd@T3iui#Zi#ŐaSh&D?Ot4?z]fݶ5@=eKЂ2o4"0] %AQ 8`Zf?icBx gOa8oq i=.XgX6ܯCɼR3 $`T췏mKΧb&=+p{2 ĢD!C${yaI74i~i֨zT3g9?t~KkPÚ{yP݂ ּu (.:tqAq{`vX@dGϾ|'ɯgKt.I$X860Jaϵt.!)V0%js"|oВ7N5 ޾z*~7EyA >", Evs ۩{|VM)׬78"6ܘ`d&AZ[d|b#Iަ>P[?$tW6Ay'ѿUw pnVe囤t4\fdȒ >G8[qc{[Q2j<IlZhid +pb泼R0G2M9ͅP$u1(AHA,WV 5>UUY;;sii1T+A'uQ蒽 .} 3hk~:88y2 tcf~ekm -P ($ޔ4+nΆ?qR'ĭi\Mk9úUl?&۴#KZ9Yj.pPְP˴z> f;SχaԓZ/P! 7- DEw}p\;O}8nRZ..D fT269w7 "D@Cw|{dɎ; `c< ?PfR Ym~I(gEጋ}4 \ܾ1#i_܈vd-`16p!?@ H9yuH[^s,0R/K6OySREs]m(lC":`2sd/<b].zy8OdLEm^Cw]\_$$ ːI)}w;X]]ݜM:QK]cVx]VC|O{|rde^Y"&W% {^6t]_r_D~,)ڠ4p :Ql4 0DD9\>v?)ˬ&eIF+i9rS J]d xKt- wZa| w'YV_+MDp!܀\ßA='}1%p^mzX\\ `$;Pg\Ρ.[V4W=@sAAmm :,d-@, y~h:06Gsc]h]L@.6@/L3/+ e`#?vIM;\R`¿? #l'i@0Y5'+Ӧq*"*}JfqY"0v']wA8oI]ꄸ-|:s|>ODU7FQϝ$guB'B˜"=~4ɽ|_T[gps ?C POPI98">t/'q s#d(lkTLuHo`؍n!?\Z9r"TCZBC%Wjt \Ȇ=r'ܷa.{-bB[ `5gRէt*[^vX ~L=qSWtYzɥu1-뱸VK=U'NPZV="Id\<2izO?Gomh9o[&r$-.n$ӷ"v(@ەodblX0D=6ic8Ht1!euV\`;Ӊ&M>rrs]x!t. +' P`<$?+>E3Dj+JhBnB-.,0$q3W-x (="j+ɣp~:cphcctH9 j2.g*-X!7/1a*م0~Ǒ@zG@f~\@K?-$( Ol$R'G {Cf (9xJu]L,pw^OסZA4|GC Aу-_H*>JOvֻŸGKK;ݸÀ+RM2~9WGdž>: jum0փPLxj7p~1߮ g!#"xߔ=fiy,p!Vf|e~$ؕNWqӕ776 o`6FO0<`*P?T& d_כs~Џ(@" txk\#=+]mשAAopPe*K >SïSԢX(+,-`mEE5VP&&xƀ`i ;dy;PTHEc=i&xAsd )MG$00(n%hˋ(Ȭ nVH8y2%.w.vvlMk Q}w k }>@ЎA $~`QȘ4 Uw!뒪uǔ.:]L'|aHTn*R[m5?_=i5sqJ67S${U8 f]s$IG;XoL^Zd!+y_?o!]h1{)8X3$T&8@oX?_3x]7IL8 I`p Br+яZ9rpэ"#ki jwN68v=`c 78ĮF8vtܿ w`u',s8'5{Y-=rz:|~֋f=73H'b+!^H:^ՓDL%Id@VAGC i4/Ȍ9Wfya`5K Ud3`w+EsB9[H{[PbT D4A_Dxk5Jxe1MDbW״]OC+fvPk'#s@] jԪrM2Ǥ-'Đj pv^4޶g^ XL0(M߉m+`R0rMC( Hl}"_=ԩ.džsk)KH)V(FrO.ǭQŕO#zV?=u@ASX{ KY@L"zPy#UJ#E@,cJ B*LyZ)L),S@$(:/64U^DGݓ kʹdaq>mHMe> (H6r^ (P{NtM &"Ҕ\+WѨ`"z#Sqov1X ul?N˂U]}9(#=s`<Ä .$Bs=;~V3u.Dp|ŲJD.pfr[-q*+DlVCJǂձBt  2Qld݁T4lGx ؉ @sk= PTm=҂s˵*k$uֵ0 Fp"hYLPUAXhUl^fTP[V5_3I*g>_Eu]@(u2zҡ3msM,Hξ͝w}< ʰ }idu2s@kn }dZ˚ !WA,j1o!/8}H:+88'lſ 3AloH-!/F2و-@yǓюܓyӶO8ܼJ,k\ġ r84WZ9+ <D~_1di58G fPDJ f‰NYA3>{u\Ti'kPAaU2Ǚ_6 <2eT~u[i >voG gTAPaleo@~ھElQchsZ'Ng 'Sʔpυ FrqGXnJYɶ_ |Bl"P}&B%:6 ġHRP~rQ4-ATp^ b­e߸jq̀iL/i5joT!Է .~( onQueU8Te*]y%*$|y6 @n{R^]HjxSm>x#.\X Q͹Z|$niUR!i?y_ -Kjj;S0Y _Bց'wZGAdqA6QD MyIpK-wDM^khbP+@Tux<|7w `{] KXrm*EEݔ-FO-Olހ]Hcl=))v%Y0/Г1!y/ۚS̼3,/ }uLk"PPr(jnC%r9{2=O"~ &ç"0ۍ&#, 7Z|doUX3 GR;/ָ6H3)Wc*!Ծkyp"4lK*pOlTYh =Gn #=8|fݨECB;w MFKd7 VRlۈ8 c(;Fcd c'!l5p !ѮY^,c 8p e~wEKz8OE t!vP(kDo{'l5 +5cT2/sgec`<ȡ OZ1++} XI-T@Qf!H&]# 8E_4]D (c.OMt puM6"#a`W+@j;78Y8*nqΖ@|si Px&*3|":@.@8+,=H-#:~ڬ[XNﴅd) 'Ս $ƫ2iAPYl)%8N4ێF\?Ӑ'=Ɍlxr=TYQv㍷3״9r]A ^`Oo'iٸf17sQލ p5{XT-HCEpi>vlA (Ű^A v;69#z\ F\'UUEN ӏ hi@a 8D fJ>\6 Kg]_ЍgRT\7&P5 CIc" D?f$OWn\@bH@oT %h΃g>fIV;~2`+ )ړMXp}LKqj,QJ4'8<7}}tUlgFOyQ9^bDy#H N*F~2B8xnTuk-\W\A;P8l]JG-WiB1@TRZr?^ulc4TOftC~tRPGVWpOI\]q.Os0~p_vJ_%y!I4'ߥHQpeUoƮ\SH%!Sf9qnR0$ ޢJM :#0,@\Oy8x^,s O<4[qr[?o=c8٦Z@[e> Ҟmڂlws|ݝYll@]@ҴZ}Y$o -ҧG*5EpEPo SVcN1S/s'>N?εeZ_`g6֬3{2$,&m iC{xaIW eM msѱdY.m g] ql \ IhF> '?*ER+ɾჂ8Hg7˴UҰR KW%v1gh]7LJ3sᖴnA:^H֐9~8K(!ǖk|͹ 1v7F9tg_XZޗ=;؜8^XnæB8L Ez vYS)J gepa<1wM/Dd_<:_c)wH܂ C>/#FMzj;:,w T>D /Jo~:p< x{ IEca^B#d\g 6 2e'Ѕ4Z4t<<>:nT!M5hB1/DJ?hm J NL@^Q)>oL0ӏ1*V2ŠVyM/@ɺtTu0}X%=Jt^?,Wa0/QJV-ͧ5}IwZJ`mKU@- 5M}ᰑJ/$}Y]x|RJF5UIpO: wCKL. y'wV\sxBA "X޹|׀TRr·sjM3l&RЇZXA'Ŏj00Q |uNUF?Z(+_L j\R^QrkD ĢJCq>^g~(8)1AčA&mЗKsQ-7\Glqibb9B;NڢpJʱmDԙ3HnŇ??KAVVtM@3Oe2-;ccCB5KC*Aԥ'? ؠALN{m[;2+m]M%n!TlY'IVtNr)##{8 qФaC|l .Ow_VnWl᫾ކ} 6k>Iivl&2(\/c@ee` [U#V&=-Ia>E(wTqyFYQW7=@ Lw/'U] UEٺk]PJR.e4Lqd 2 ts5gĎ_e$:)^s~K/}+2TPl!7eCD|DB.D׸GÁh  rΗwtљ>.@IT~GJG--94G槧&`Vn[3n]e&uʮhM_4,\__AvՍMm1wb~AXo<9z3E-z@?S2ajƲ&7Q~E:ut ~^˪k2LƵ& i_qW84-༹!V94v(dHJ%i|qdn rPoiϛcW2Z^#tV֩Q *_ΡBAbeN{Cv-AU>Ok8 IvUM`#4S*~ЍJQQZlh A֐ 2RuyZZ{y[{o}kQ ,lg6^_- }焮B; 9Z=t<2m)ShY}MW H B"GJ-4L 4@8ߡ)AbJ5ͧKo *-TJ*ό֗mTC0r^w6Ծ>Q)ӛ@Дe-lJ'!6n*C3pթx9f wBm( 3Lzȫn[u q o}9-|I`0.nΦ Haȋ#Cxt Eԑ) nB#Ш@i|1S_){"}[g#O۝@â`Ge#Pـ}t]^hPNm P9 r#$RR3+BMd}0f$6zOLz]1N}aW^ gtd -TjǹyjیUQyɮBUޣ e85~82-'ר74R3Rk(a$3s,Fp8kqwt~` JJ >JO䅕ZR-*6xm90ƬMJ HlRF]I;2ЦfP@ M5?>a{]@!<:l@3HX[).V#J̉37<߅oɑyn[ֈIE$ī,6 OMS>,8#< A*O΃]M9.ı~kp[Q1.PPJQ9p]>Pa弹P/V\_PɅV6 Efrޚ˭bx/ldWV%9(PTދbM+gfp;ދ27Q?IC)D1S.`$FB{GftҸK4r6wF,~63t)8uGnumTKb[<0YPYEdM 4 :x\y, =9(g}mQVL~ b.Ƥp;٦zY4]I+&8T7TXy`?FdICfB?,կ?..RmV yZ 5nOd\s59D1+v|kRTϥbEu'XUO4˲r`}Oϲ㤎yݼo%[Gi @h3}Lj~?W/#9lJ6GX9K*v"50ubBQyG˧<4ůul];hBa@o؀@`coO}H|'8 ƒdg>)T‰R@ZPrfVv|Нv͸À`FgB4HQ _h0]$0h[MDg9wYÀ˸{D@,[?1 /`PCs27za3 6 X{+&~ku1w|A[faBL5鯼 +Zhq X uÀ M~ +J"Q!b@Sل/F+P.s_8O~Bz< 5jZC@oL/Lܤh.-z~j"/yskzsa)m0  <>H+}[. MA1eNo:#&t}u{vVC51am #FĦFS R7Q7B ^gz3D7)[a@߼-3;6L>x?J~0ЁThRP5O^LԸ1e+2/~K0#iB+Azy1P\AS:`Е򻿠1#OYKgI[+w||J҆SoydQ$H[5d2'2{(N43uׂ\΀[ KƑ-GnڙbJ˗~^hʝ;&_>]@\_iEG6;\Fy-f;yNkK_ށ\Q̦^>{mEBC!G3g]6us\.!fu h?p#AGyK_sf:~5m0bJ,7 hb^|iy?V% HenfBZu7>F+?&`GyC[6Ձʛ` M6;n_kє´:e( ߟ =D{Ir{nzMDTg7$0ce {lÄ^ $O`ֈAD0ݷV2 /mdӳ{Z_^- ~ɸ@]$!mPJYV TJ-9Rtmk+'&ZI6j";X.zO,n!* g£Vf7A_z^wFw.ޙ4[=Pk?CA*qG<_v#G0a`!q؄ 3i(RNBQT }WY2D -,,OhizrU^D=\]zM{%w+&XSHZ>;5yD.X^8`0/  ;f" 7lp.r*jE8jB{M(RSv_t*'d{ٸg@z 7&ĚJ+:po^zh׮m]M f@U+H{/dI ΋~cE, y!NNњ R'`=@BBlD?:X$U@<gb2;V]ա=8\̿'CKI(Vɣнk[ͭB蔩i-h[# 3ɽN'o@yB/ 7$Ef;J)Q}frLc2X)<9'5lc@ ]: 4-D?(l/9m,&@9NDv7y۪? =d2eEP]I" M ~Muu)m:~uWXJp^a1qOE |Ŕ^Gow# {2!BIB %-g{X gB߿exKr kw_o ÁgA2' +ΏĎgǮYgXG%9 )$ \P Y@\'[m!3ZRsqqhZ+@MQ}O;wx4"q eFY1@p$R B8HbLvv~>- 2ArmK$EUw @y^@+ؿ_n1|f(Kㄙw&^o.:ΘNjknFD&=@lt|.:,l-D<2"mrїkhq],L9W;O 6/w'1>gITJX_ЃKU8׀H pCopJ+΍F|o^1B!/iOj,%MˍϨ49cSSs񩖔$e?ض@}0S7#{fs$A[GT<-;/9n襇:zs.@eLfzv`(lbq~~c(Xyc*ELtꙙGdݾb\J~܁~爮=Zcz?Bg &kYZ|pSM2'ujrԤ*D+Ӌ*02r 'aӦ'eaP>`qP7'\}3|x`X]keT㈅qN픆Dž%Z޻UM%e [>4`9; }]= ' .Y%U@*}X.s&k`Tۗ6ZO[ROf 3]K};C9=.NJ>[#8 BF]I?U' L#Ɲw `\BbB2ˊ$fbÆYc4jƊKػL^F[zzr"*m>S"ܛʧ3*^P.R53%@-z`eeT|7f&jLbiJ0a p&)z83>Y0/:u nԿY q=z{@d ܣ@lB`|?fE7p@2OvDUQfƪe(<@ \LM#upyr԰knaWKg``>p ^&zIPQMk2OZ v1@o,D% zcF=>J@(ܫ1##ks'xEaf| CGMu!_qL dfbm@Wwg4tnK=v|5w AOfkVF6n}PJ2xc'elĮ]3aO@K0>/֗1uLgv:wP;J׈~[\)}gl1Wcpez wNK srG_fW;6b fHIX4wyU2Pt clD{nXl>ԥ jIII4H.trzo*|_lߒa5%Kc(|ԓ{#.ď{qTfJ"6Z>{ޞ lV4W/jMPJ7zQU~AۖW٘b|̇_ItǗ !@[;iR,[cx\+bz'i/Cf;K$ <֪49t E%@Vb93I&qoM ~( xNPnX}C@xM{>&y5<`Ŭ V6iR&,NR1~)b'0_g[m+IJ1zSj5rgs6`o07wh4~c &p@'oh@)-8 zBJ줉e~fh&,Q= Dg^8Q{m!`[Vbe(0cّܭ:-v>2{BAaTmӻj]`/YU˰2m01vG~837;' H{ h''3E%p묧<6ro 2IY7 0.TE H%LCn3}Wi'3h;3&&7Q$[]b@]^DcQH0F^^j3⁷Q ,īS2cWJx6,l' kD^{uF |/>p& G3%뷹Q`P>.  𬯣oL[S*"`()fгM7hp=IW{^'];(c Q&+ )3ǡߒXn4lh@v ykg ,b̥?%q>22ߠvh4  R*(\6ow≛d wo@b2ެUiZ+@/|]~L2 nχ;`2^@*>C;>E>|[mFggڀgJJwԙ#p@VFy*xc>WmR ƎOUu u!]gPA+cq:-PCnȮvE# p`ez< Gɟn0.3R}X5LF8_)X~l<[~l@SOz1ӈnE5d 0@<9zX_Gn~(5?u8 cNMtN_^ Z>7ZzԂ=3˼|x/A^jCXk?*e6qd`9%F@?'1V?ak礜(&!m!$C?J 0O=eǷI3a:i6[u_JwuЬfc+aDO{:} Ӄ#5R`ݚbD? L`]EN~G}2b͙ў" = ]3+7Bbf|OuJh)2={Cong FMel]p19#Ȁ@8|UD|NW刯~/7JЪk*vc(FSG>眼ilLK%`LBoBTLt_ z-ߔzu655| [\k$ c2}3<<9+OK9Zz[1AҤ;&`AehVĉ3=Y`1=2]t:>ɤg O Q PaIPC% aPʉBT^&_7M|{>ؔ qGShd|ÁNU. ̰:()FzNNc5R ~u0FJi|>F^sY4gKd{ʫA:B]=Zyޕ<Etooi.#pJ䎡F.2.2H|4_Mtc 3nQPp=𹹅4P+a.A%q Ks@T3s)v.Ґ> JF@˂nmF.b ܘ$C=5 fq1zGl߻f-(htH{3(kN,w0!QEM"iםqhF$t@AQs@ Q3Hu/`wPtɬjczEWne @f4WɟcX\Rkf\4\Z*SW"MZLw񲓖7?C^zdB_)nPŰWH,ka쀼,Ovvt[Wfw2.1i˄ӳTF6 ** x)=[~~;ۭQaݚN md:@kGW?;MEZˊóI`ueuCk")?=g{pO~`~)bN פ:XF `׮Nz|8N\lwiN@tԽNp{y#3#~ȹ}u90;q%]`j?6 U,2V|IG0( 9PVeKeXu(xJdP҃i<"8-<[0-uwz TS.>G?n~ scO# 17 s0GCqZg&`2%BQl$x~L'׻{AHk̪ڔcvLEnGلaz"6h{S~Jzͧ)Lo2Tq |Ojs `3lD(>I$! Ymsj, ~N@,,5皐kc us30Q*a&{eIB|=;$+*P<;IE@ 'm}AkKjnl/x#7U8?Ցk`XOa.@xܵe٩9KB pDĭ4 ˻QF $D<]U@(LuoM`ܞZ\TUd1,p7d>L#}fZkv#.T (y+hrZ0L:(Q3 0HAN-#"ө5MbNM~?0l|NLi:75~@|ǃ\  zC_>z- Y1WmsBkYm#FژH=wġ:2 h3GVV1` f|}< -74߹g2 ؿp~b9?#N>zq#_( rfyym@J%P&7BL3\|*!)-F(¯yutm  =I9@~OI \3qb 2]mkOܻ]肴f$ @=/`aܛkUt\s0`NPn\:`JXο> 2ÞK^@=l |q-\s{Xq0?$IzztԖ4ԉ\Ac ՝LY"<Ȍ4/V9an>?\yJ\{s{2K%;(ݯ6zj-XHH/q``@0{w!l` |t퓇5]HZL@H\:LVG`6"6#w:`vɠ ` o~ڠ]={ |O.~^k q-C%i |&uXĿ{QpjM#w_/ %)7F53!.#/`=MWC^ɢs+FƉ?-.7tS`1ԟA|0nLcL߁{h$w.}}~~f:9ۘHJ8 Z*8o5 Ehd`0c$`2XBíMр P8C m.K+6` D=ri͉}lBFN`_nzeSh*Ўۻ˼:Tp: 8cq(DȻ%o27; /$o2 !=v^"G6ݡBh,WE%H'C,q֜6vWQIF%ueڰ)t"nC=\C̘y,-, pwu?uDxe]\.gz~[ `6iS>F0l݂Fxj? TOgFb˘qR' SjIakXLn d vy9=TY 2hF8GgD5jY$qǼ瑯ɫ٪GS?Xc."}+ %F\'Xgp9|)QL&/ љs_1,c*C`:CTPd7'tי:$qfW28h{>A:(yx&]&ۇޛ ~\j1 ~La.2Ƽ+{Y@D{,8`2UC|1cHk d{K-23sJMQYLU`څt,Y;6F f~{ѥEڳg/W<@w={>gR=^( ][?Of>?zX ZÏ-Mn{hl`#FdV-k8\4u e_g4FJ?@/9E&n~\O[[0O4_€oN ݃ỵnV;/ }'T*i\DqM5h;TdDgm09ҹg>=ڔtj2"wL'hFv`p ߳O|; .(Go>z@3:Nqp 4 UeOY'\(v 5:ĸM"*dIf):yyMiλ̆(jK0)_xڨzПS(JێIB L l?DnyJk#_G35qiT4GY6 gGrl[)0F)4cp3B& $OԾ !Á uz:|ؽtPq{IszId nt)rg; P {P.#i]dل <8bs(#DζґT'ΔV d"PgV`O46F  NtA >Uk#{n.< ec84.Kh{gѳe5({XԠ&h2o(X l -3t<ndq+H2X~L'qF c ";WXW!'F%v PfvH@nyuQ;' tEYONQN h O݁@0E}"~aؙlgZS0nྃI8dd]GW[;cCn@K3upI 3~@;yzj8..l/Y-c*UK~򜋿Wp8id8/c{黟 >n!:]8Ph$2G }=9 \N 4!5 UVX{Ny{8gex .0۟Q4j OcFZ#z8>x l\<(:ymmQ0?)`a܅ E)G`f̅ݖF2;wc{t4X"$uu2}=rcξQb @i_|O9D}FȐVku(u58mXfM_jsJ<$gfV߲'`U*Ls~i> p z;vvwQ=!ߐhu=?\MXFx0\WENP c$ 䳈c6c 7X?#<ӛd^)_ M7S=w"q cP BMVuaV*`  Y_^gH9w=x]?!9*LV͏`+35@)Y7 :dxʦ;:Ăݙ$KX1d'Vk{`m@ 6Ll$挞=){_=E[- K/AT`/aG$UUmhz{w.O`W#wލ@ct- ^xKa> {dCxnpY\ZmGfّ%69@cW?!Ⱦcځg΀(ц 54vQ NtYԃ(gKä{8d .cxu]C=U Z- *'>;dhJ|7X03۹H5(Ћ+QO`xb! sJ`N#6w M; }B5 U\g4^/ LPU?K @ dr!k:&թ>d41!pe E+c!> H6'(c L? (t``Au#q#PBPc&*gdS/aܟ) H^@ca%a:<10>db>L.d n@!d<X~m8D׋(T›roKKKc*p 6[Vd=4 ? K;=td [5  B8$Fu0c%@ɌZ }sF%rƍ;O]t*,@dO?w61z "oKWHߏo>F_"}Jfh@ۺJg)b@)d{.ي R)i> ?0dD79ϲ%_"[/.3jӾ4Y,2' }~4<8n? rH:45e/`)Fe0T&Ô }8dﯬN3V:9Rbgħv~Zu+O?,'C}ؾݯ# =y9ODYmܴS^T$%xdzߋӛiyFS.v$KЛdpf5pMOv) ?Fh- e a/M5;(_xNzG~q n<( wnsP,ıp/CKG˟=z"dIa{US?Ȍ>iѬ%Kgs"Owl vh?N' 2yEWzAJCNsjN/p/7 F`z4Q0|&a#.׻VxV'K& hpD@B@1hy 0^>ڬCc_aU-{h ,KAtNİ`C{/Y|ArLǕ(<.ћ:p@] L$]D'U\ @cE< 0)_@l1K]\aqq(уM3i7i;^<\rpf~??_{A\ F=ӍM Dwd6`[W}5]~5Ês ~>GF7269V=%#}u=bcH%w`.?{nKT[]:g(&ϥڊh8ԭ`6Vd#o@ֳ1#a֘7ڽ{ >;@JS\CkDuM<ܠ'g {{ FlHO*Ҭlm a@SD٧qI_N U̒)5w1Kб„ y^c59׮7=t$C;N{5p.&Yt2f{] Z͵^XMq;>%q`*'2{nLdebOȲyEQvmL.~cؘNaz;OSܓc'-FG6@2L 29fߏǒsen0YPp.= Z՝?ۻ׏~zz'?FOLyצ Д;,۷xk">o o spm}]X tjZkndi XH++jAxLuׇOm @O60(5Aa@եm s,¨ iS0L)>_`Mhxo\? lRY;B #pс]CwSV*aJ0ܬ mos^G9Om~\ ZCeg~u(=kY$SQpDI7LAGiJ,<"I<:,N%p\cO}_$F)m= B/psfڿJoZt;O85.@feA+Jo  $9+QVͅzn_ISS'O4j]1)Y ԟ4V?.] בAϏC_, Ș8 }`R}ig -=#zAA?\dzim_Mװ"AӖP`l8@(Ow.@|{y=Y$S3/0>b{k0c!`au`F, "ȕq a|!p]OYԅߡͧ== Eb{q|MdΘ`|J RBD+ـ68Ba*|  7`L DXH̾e]tkwt8Ҵ2R??Ur D"m"sR|0AG>vM= RKK xj@[♴mT`Ԇ H h /,.xg̋^em֤,ΰbĥO5&eg lIགd78pIӁR N=6hg" "x>O~~Gwؘ0Gecؤ2\# TQ\{M"ۧJL@&)aiT\wÑ 8mm!;.S}p5)9CbPޙƅKB(7Dz+|$g$E14i)-$fp&;`x:0Ic:&:^PUl-_gtfK LT[?v޴|tZ;D2@&,؍mqdc@Ѳ^T#S^_71"1 '  ,! 2gUJ7@?35bɰŰV3Eg?tE? ld P}8 \]] 90L ~`.D,9p/1@]8bڸ`>OLJ^7V)gPkj+O7if>Ry[r7E} "| )Pu uv]p&MB$!g WIM6kQ0*[;i6pi˖* ?{_څ }cۤpa[8zl3(ȹl>gF6%habKok4Kaդ7/+lnċO/ (46͹YȼoÇ.0%@,Gu*>CnG\2s$^ߏ4n"LoKdCicY)tS..6  7qub@F-H x > 헉DP(Nǰ@s˸XYe  J@%wNz\aTҩ~NL-LMv }O fhc !܀$BㆂqD`[ oИx }W'>L = D=uU`|!; ވGo&>w:^=546y羜.gi#l41( 0vkJf^" Kl#{Ԙټx'3F蒋":Y 63ȁCᣆOF(Gێӥo9&q$9 ĀE!dw±$^ضm['-Gֹ%41_ti(hl\5]pg dҐnxR< zz ]x肳_Jhr >͆D^2sTbrz 7nI))?O- :%՗&0R#zU@]FeTry*m\͒9u ,U.,FLZeߧ́⺌ s!8L9}إ)E?8 b҉w<3SAi8¯.)4BW0}&m;3$&]4w@?\hD֐}YLI V,hߛ%:`Kd$ i|MAK8dBH6x%^z(D#F`UJ̉1 H \G::S{}NЌKU'Tl! ]{G|VYgd«(\=n#l=UtY?L–Lbtj~UL?26A(K 7%:zLJ|}>Lh> ~[03zi Q֎WZkD 0\ cZG mw3qi=@'FA'19mRA!Y@=%^ *Qpi ^Ec&/,iKK  *.@ꊢ ?@J|S~vt ̈́fdyF`\cˑlJ܈= ep i\柣vW282;A'T^B22V^6}޶<|}LS5;=dr{`ÿ蚢0ؐ wmD ͨ1̢a?2.ZTL%QZ VH_\XxTZM MT>5{ i?JO;64 upH">ZHܳ#X4$ O'ިSmtiA컊tKj*Aֆ81 @x}K7&JZj{n'$; mV ь5ްHJwo!upt0z3HNH Ǐ9,/.L0^Ot$Ҷ-?D3g?5\2QIE.%>zhs:e GG"(MTT?3sTV黓u@8+$hn@FYyF;}& MpdC=]Zbi?ij1i^ rPV9'p瑃1ӅZ[&-KfµIO㻰diS7=.9iEN?PEp؄ NM ,COW ~HD ZPœa\K% `@md]8)y:2-ְwnMg,wFM@֨7Q9`ľl%0/9Q0aӏ; "\-=oIOWk{i)1?ӧ":}n &:Ks4keT:E?cA#(nL| 9.gC"Pt1'ר>ʃdnp!mBds蒓M3KFC􋻁8m{H^(H eu: ʡA.O$p-͓Xܼj ǎJ{ gff>>Jg=Iܷ1ਿeڃ Pw0-q>@{dGTR"t.nbG90huAPN+)PBtކ%𤯧 6>.x)m;ӆ#/W@h?tҳ<Y|^v47??2n66T8$YHNm܁huN `k'VecQ .*$8WY{q4dBx^FƻvƒQIJuqiѤ+*?i }fR((쮛itttJBO- zj|v+$6`F+o\[c>c#t{whؐ-^XXBf7h_@*m5WR IXY{ AA",0Pdʵs!H@zbdNE/zQ?bjle[ 7!c9 RC*)#NЧ><3\%@,<{2R!dufu 4_@T^ &~Apo@iL)-5m&ڠC b#"-WW[EvX rBw p_|3cFu xXlYNj5CrkRr,s:Gq hV+қŖTqwBw%pxSU\:J@8Z<R ab@;QqzܽB>?oXY]!EKÄW(z9yd@&uQi0| ۶n;(d0'-]'q[ =ZL hIݯA!)+.굥 ܈ғ@ᑞKŔK\ZXB*CX&:>?؀{ @é+('ZlsAjۄXhл+P.Mll*o W&;f AVua6HdAEApz=ci}Ճa۶;s<Ч 2(Aw=6S4Xd#&W>8w5=56(rmҪ"=l`&%5Ǘ@fvL)ꤒawH0 yV!KFK è0#M>XI9*Vbô,XD%l iWZ!Zf">uZAxW˸@]+⧟af i##DB.,؜ *)3::@P0j~k.r[EUqνd|J-$Τ}]I"_`JdzIlhܠ kӰ lݺuß%A^*Y~n0溢 (:5He+ dv جYU/ s:eYt?ޤqfSG?<G @i-P8VdnH2up Ϻ CDD5-G[_!X{manL Om[sH:uTl Y88L@"6Bn*83(o) D0 jᢠlPщ'7qLPxM!PYwnAKfCX]=v϶Ay}w@w.F[T[}P('k=,35V9< p2eq&=HOn}wݏ4^yږ WjW.]:ʩR׈+)8W:=ӡK0iQd (ÝBI rOV#@L`/=}A/UȘîzX_X'`>?d#a`|KWG ECK5*N םW0)uV-/`o} %\qя|Yh<݈=$d@U:B8LX@}߅ʳ+zn|=1&9UR>(~{8(jS][xrIH2п ۘ/gFTqq;A<˱yW˰"|C/gc懈.2)Ԩ;ʌkuSE{wRiꃎ>U^k _ zrGN0Tk%̠K"S suCLX}g&۰\_&(&A 7kJ["|2N+66zpbk.XA:N]jё"S͆=Q]t7`& MiF꽔"$^}u2 Ig+֏Ed(¤enFQA w ;TSVl2b2@@W>2T""qv)&s61kj^"l?ߘ y?|>fTEϗK)!>iV/]6p ^0")UsN0.j"{zEWxt(v8ޕ}1U5s)3b/6"rBX \҈68&&%"op]6/Q/AgV*K΅XZz 6דh,Ԣ//3H*iKnr1j"0}JDɪiE \"wu<`25vePkHf6Dsb\:QYѱ"ZǛ(eicDk# >Nnf*`HLwSpnGiBfqo ׋l X0MtMjrW" ?RX.:ǐ fZ0ς+ S3 Tx2}rxORCˈ5t,^SųbHv !s_ $aF|Ώ6L |$/]E85=00;YlZħBѧ/(ŶCi^N@X! ־x}ehBg 8 stV C/eYHB&0EJɀ78w>M ӎٱy6b+i}-kֿL|dxGZ]O=/zm+k w.LTRp=mH(vm1 T#VDȣ;F`ig-X^٫z̑+-.h@ FF`*{-ط mWiu:b%uM6. 670_SL8/W|5^߉?!lC0W8'ŎEVa5U GTY߻4^X:^sNflʀ&1 k!:I%$Tۂ*Ϡ<(&7/v J!pR%ckB_iE0 `b?ڵ'p#W6_6 ë[|NW?B.yŪlm签Y2YQ\fFj=ȸq-,h&_yl9&'.HyL♊\ImPp}P,7핇0[2P'1s ǹySTIM 7^|s[ןXaRzYpH]P͎; X״z|O%vSvfܙ)s_'Ÿ:>4eךQ`RpYyEЀXpsu}Ƨ14UoֳcqLՕEWIVumq)4i%{/>sn v+??7l93lw0!{ AXX^34i8Ĥg(ì E*tjDDQZ߃ lXO0F[.YG{+Q QLAaVA4[wq4 ?I{əo~xiiI..ِ{޹[Tqu«W}Nkz]gbO8.qBƴKIENDB`(  ! \ ! ! ! 777!!!!!!!!!"!!"!!!"!"!""""""""""""""#"##"###############$$#::9#$$$$$$$$$$$$%$$%%%%%%%%%%%%%%&&%&&%&&&&&&&&&&&''&&''''''==='(''''((((((((((()()()))))))))))))**)***********++++*++++@@@++++,+,,,,,,,-,,,,--,------..-...././//////0/000000000001EEE111111112122222222222433433334444544545555555555555555555III5557677677777773 v ! ! !!!!!!!777!!!!"!!"!""!"!!""!""""""""""""""""####"#######$##$####$$#:::$$$$$$$%$$%$$%%%%%%%%%%%&%%&%%&%&&&&&&&&&&&&'''''''''''('=<='('((((((((((()(()))())))))))))))*********+**++++++++++++@@A+,,,,,,,,,,,,,,----------..-..//.//.///0//000000000000001EEE111111112222222222322332334444444554555555555555555555555JIJ7677777777778788888884 / !!!!!!!!777!!!"!!!!!!!!""!"""""""""""#""#"#"###########$###$$##$$$$#:::$$$$$$%$%$%$%%%%%%%%%%%%%&&&&&&%&&&&&&'&&&''&''''''''''''=<=(((((()((((())()))))))))*))*)))**********++**+++++++++,++@AA,,,,,,,,,,,,-,----.--.--..././////0//0/0/0000000001111111FEF121111211222222233433343444444544555555555555555555555656JKJ777777777778888888998999{999 F !!!! !!!!!!!!!777!!!"!"!!"!""!"""""""""#"##"#"###"##########$#$##$$$$$$$$$:::$$$$$$%%$%%$%%%%%%%%%%&%%%&&&&&&&&&&&&&&''''&''''''''('((=>=(((((((((()))))))))*)))))))*))****+**+***+++++++,+++,++,+AAA,,,,,,-,,--------..-...-//...///0////0/000000001101111111FFF211111222222232334444444544544554555555555555555555565656KKK777777787788888888888988999999 < !!!!! !!!!!!!!!!!!"!787!"!"!"""""""""""""""""""##""########$###$##$$$#$$$$$$$$$$:;:$%$$%%%%%%%%%%%%%&%&%&&%&&&&&&&&&''&&'&&'''''''''('''('((>>>)((()())())))))))))))*)**********+******++++++++++++,,,,,AAA,,,,,,-,--------../..//////0///0//00000000000101111111111FFF212222223333343434444444445545555555555555555555755766766LKK777877888888888899999999999:;9;9:  ! !! !!!!!!!!!!!!!!!"""777"!"""""!"""""""""""#""#""#"############$$#$$$$#$$$$$%$$$$;::%$%%%%%%%%%%%&%%&&&&&&&&&&&&'&'&&&&'''''''''''(''('((((((>=>())())))())))*)))*)****************++++++++++++,,+,+,,,,,AAA-,,,-,--,-----/..../-//////00/000000000000101111111111111FGF222322432443344444444554545555555555555555656666766777777KKK78887788888889999999999:::::;9:;:z ! ! ! !!!!!!!!!!!!!!!!!"!"877""!""""""""""""##"#""#############$#$##$$#$$$$$$$$$$$%%$%;;;%%%%%%%%%&%%%%%&&&&&&&&&&&&'&&&''&''''''(''''(('('((((()(>=>))))))))))))))))*************++++++++++++++++++,,,,,,,,,,BAA-,--------.....//.//.///0//0/0000000000000111111111111222GGG233433343443444544454555555555555555555555666666667777877KKL888888898898899999::9:;::;:;:;:;;;;;2 9 !! !!!!!!!!!!!!!!!!!!!"!"""877"""""""""#"""#"#""#""###########$##$$$#$$$$$$$$$%%$$$$%%$;;;%%%&%%%%&%&%&%&&%&&&&'&&&'&'&''''''''''''''''((((((((((((>>>())))))))))))))******+******+*++++++++++++,,++,,,,,,,-,--BBA---.----..//././/.////00/00000000001001011111111121222122GGG334333343443544444555555555555555555566566666666777777888LLL888888988998999::9::9:::;;;;;;<;;;<<<<< !!! ! !!!!!!!!!!!!!!!!!"!!!"""""888"""#""###"#"""##"################$$$$$#$$$$$$%$%$%$%%$%%%;;;&%%%&&%&&%&%&&&&&&&&&&&&&'''''''''''''''''((((((((())((((>>>))))*))))***)**********+***+**+++++++++,++,,,,,,-,,,,,-,-BBB-.-..-......././//0/0/00000000000110111111111121122222322GGF433444444444544545555555555555555565666667765777777877878LLL988988999999999;;9;;:;;:;;;;;<<;;<<<<<<2 ( ! !!!!!!!!!!!!!!!"!"!!""""""!""888""#"""#""#"##"#########$#$#$##$$#$$#$$$$$%$$$$$%%%%%%%%%%;;;%%%&&&&%&&&&&&&&&&&&'&&'''''''''''''('(((((((((((((()()))??>))))*)*)***)*********+*+**+++++++,+,+++,,,,,,,,,,-,------CBB....../.....////0////000000010100111111111111221222322333FGG444444544544555555555555555555555756775677777777778888888LLL888989999:99:::;::;;;;;;;;;;;<<<<<<<<<< r ! ! !!!!!!!!!!!!!!!!!!"""""""""""888#"""#"""###################$$$$$$$$$$$$$$$$$$$%%%%%%%%%%%;;;%&&&&&&&&&&&&'&&&&''&''''''''''('''(('((((((()())))))()))???))*)**)))*********+++++++++++++++,,++,,,,,,-,,,,,-------.BBC...//.///////0/000000000000001110111111111222222232323334HHH444444445545555555555555555555666667776777777788888888888MLL99999999:::::;;;:;;;;;;;<<<<<<<<<=<<==< ! ! ! !!!!!!!!!"!!!!"!!""""""""""""""898"""##################$$$$$$$$$$$$%$$%$$$%$%%%%%%%%%%%%%&&;;;&&%&&&&&&&&'&'&&''''''''''''''''((((((((((((((())))))))))??>))*)****)********++++++++++++,,,,,,,,,,,,,,----,--------.CDC/.-///0//////0/000000000101111111111111122222222233333334IHI444454555555555555555555565566667776777777777888888888889MML9999:9::::::;:;;;;;;;<;<<<<<<<<<<<=<===!!!!!!!!!!!!!!!"!"!!""!!!""!"!"""""""""""#899#""##########$####$##$$$#$$$$$$$$%$$$%$%%$%$%%%%%&%%%%%%%;;<%&&&&&&&&'&&&'''''''''''''('''('(((((((((()()())))))))*))???*********'*($*'#*&#*%"+$!+$!+$"*$$,%$,&&,((-)+-+----.....DCC//////00//00000000000101111111111121221222322333333333444IHI454455555555555555555565575666767776777877887888888889999MMM99:9:::;:;;:;;;;<;;<<<<<<<<<<<=<<=<====677777777777777787777878778888888888989998CCD899999999999:9:9:::::::::::::::::;;::;;;;;;;;;;;;;;;;;;;;FFG;;<;<<=<<<<<==<=======<=>=====>>>>>=>>=?>>>>?>?????=?=8>;AIE6>:5>9:?>>!!!!!!!"!!!!"!!"!!""""""""""""""#"""#"####999#########$$#$$$$$$$$$$$$$$%$%%%%%%%%%%%%%%&&%&&&&&&&&&&&&<<<&''&&''&&''''''''''('((((((((((()#(&'$!(%A-5n4K=;:98865455433F210[1[515&1&)1)010222221222232333333344444444545555III555555555555555666777777777788778788888888989999999999:::NNN;::;;;;;<;<<<<<<<<<<<<<<=<====>>=>>>???!!!!!!!!!"!!!!!!!"""""""""""""#""####"####999######$#$$$#$$$$$$$$$$$$%%$$%$%%%%%%%%&%%%&&%&&&&&&&&&&&&<=<&''&''''''''('('(((((((('(( '%&$<,0x7KBlILKHGXDBA?>=<;98865554432F221111^2_110'2'.2.232433434433444454445555555III555555555655665777767777778888888888888988998999:9::9::::NON;;;;;;<;<<<<<<<<<<=<===<====>=?>=>>>???"!"!!!!"!!!"""""""""""""""#"""#"###"######99:$###$##$$$$$$$$$$$%$$%$%%$%%%%%%%%%%%%%&%&&&&&&&&&&&&&'&&<<;''&'''''''''(((('(&((&%#'&W29BYMwROMKJHGXDBA@?=<;99876554432G222011122@3A'3'.3-443444444544555555555III555555555676766567777777787888888888889989999:99:99:9:::;NOO;;;;<;<<<<<<<=<<=<<<===<>>>>>>?>>>?????!!!!!""""!!"""""""""""""###""##""#########999$##$$$$$$$$$$$%$$$%%$%$$%%$%%%%%%%&%%%&&&&&&&&&&&&&&'&'''<==''''''('''(''((%%&''g6=>=>>>?>?????????!!!""!""""""""""""""""""#""###############::9$$$#$$$$$$$$$$%$$$$%%%%%%%%%%&%%%%%&&%&&&&&&&&&&&&'''&'''===''''''(((&&"&'c78NWZlYrVsTwS|PPNLKIGXECBA?>=<99975665432F3221122223344C4F*5)353555555555III55666666677677677777888888888889999999999::::;:;;;;;;<;;=>?>=>>>??>?@????@@@"!"""""""""""""""""""""##"##############$$:::$$$$$$%$$%$$$$$$%%%%%%%%%%%%%&%&&&&%&&&&&&&&''&&'&&''&'''==<('($''%%L10MK^a]h[iXmVqUvTzRPOLKJHYECBA@>=<:9977665432G32222223334446|5657.5,555555JII66657667677787777788888898898899999999:9::9;:;:;;;;;;<<<;OOO<<<=<=<===<===>=>>>>>?>?>>??????????@@@"!""""""""""""#"""##""#"###############$$$:::$$$$$$$$$%$$%%$%%%%%%%%%%%%%%&&&%&&%&&&'&&'&&''&&''''''''==<%&+)(E<_Ub^^_\b[gYkWpUtUxS}PPMLKIZFEBA@>=<;:887665442G2221223343445667W6`-5*353IKK7766778777878778888888888989899989::9:9:;::;;;;;;;;<;;<<===>??>??????????@@?@@?@@@""""""""""""#""#"###########$#$#$$##$$$$$$:::$$$$$$%$%%%%%%%%%%%%%&%&%%&&&&&&&&&&&&&'&&''''''''''('%'(29;S4/YFgTcV`Y_]]a[eZjXmVrUwS|RPOMKJZFECBA>=<<;:87665433G222222443445667777658DJD77677777777787788888989989999999:::::;9:;:;;;;;;<<<<<<<<=>>=>??>>???@??@@@?@@@A@@AAA"""""""##""""#"###########$######$$#$$$$$$:::$$%$$$$%$%%%%%%%%%&%%%%%&&&&&&&&&&&&'&'''&''''''('("&'"&'WIfHiNePdTaW`[__\c[gZkXqVvUzRQOMKJ[FECBA?=>;;:98665433G3222343444556677898^Kf/7,7778788888888889899999999:9;9::::;;;;;;;;<<;<<<<<<<===>=>?>>>>???????@??@?@@A@@AB@AAB""#""""#"""#"#############$$#$#$#$$$$$$$$$::;$$$%%%%%%%%%%%%%%&%&%&&%&&&&&&&&&&''&''''&''''''$&2*)S8|XjHgJfNdQbUaY`]^a\fZjZnWsUxT}QPOLJ[GFDBA?>><;:98665543H222333445556677789;Oc9u07.686888888989989999:99:;:;::;;:;<;;<;;<<<<<<<<=<<<==PQQ=====>>>?=?>>>>@????@@??@@@@@@AA@AAAABB#""#""#""#############$$#$$$$$$$$$$$$$$$$$:::$%$%%%%%%&%%&&%%&%&&&&&&&&&&&&&&&'''&'''''''($&@0)`9q@zUjEiIgLePdScWa[_`]d[iZmXqVwU|RQPMK\GFECBA>><;;98666433H3223445455567788:;=>=>?>>??>>???@??@@@@@@A@@A@AAAABABBBB"#"#""##"#########$##$$#$$$$$$$$$$$$$$$$$$;;:%%%%%%%%%%%%&%&&%&&&&&&&&'&&&'&'&''''''(''#&L4*h6t=<:97775443H323445545566788:;<>>?>??????????@@@?@@@@@AA@AAABABBBABBB#""#"############$$##$$$$$$$$$%$$%$$$%%%%%;;;%%%%%%%%%%%%&%&&%&&&&&&&&&&'&'''&''''''#'Y9)n3v6q9p<}RmAkEjHiKfOdScWa\``^d[iZnXsVxT}RQOM]IGFDCB@>><;97776544G444445555567789:<<=R?@B>897795:::;;:;:;;;;;;;;<<<<<<<<<<<<<<<======>=QQQ?????>?????@@?@@@@@@@AA@AABAAABBBBBBBBB"#"######$#######$$$$$$$$$$$$$$%$%%%%%%%%%;;;%%%%%%%&&&%&&&&&&&'&&&&''&''&'''''''"'a=)t/x2t4r6q:~Pn?lCjFiIhMfQdUcY`]_c]g[lYqWvU|SQON^JGGDCB@?><;98765444G33445555566788:;<<>SAABDA9::8:6;;;;;;<;;<;;<<<<<<<<<<<========>=>?>RRQ?????@?@?@?@@@@@A@AAABAAABBABBCBBBBBBCC"###########$###$$$$$$$$%$$%$$%$$%%%%%%%%%;;;%%%&%%&&&&&&&&&&&&'&&'&&'&'''''''#'[;(v-{/v0v3u5r8No>n@lDjGiKgOeSdXa\``^e\jZoXuUzTRPN^KIHFDB@?>=<:8765544I44445555567889;<<=?SBBCEFA:;99;7;;<<;<<<;<<<<<=<===<<==>>>>>>>??>RRQ??@??@@?@@@@@@@AA@ABABABBBBBBBBBBBBCCCC##########$$$$$$$$$$$$$$%$%%$$$%%%%%%%%%%%;;;%%%&%&&&&&&&&'&&&'&&&''&'''(''#'L6(u*~+z-x/v1u4u6Mp=<:8876554H4454555566899;<<=?@TBCDFGHvD7;3:;9<<<<<<=<<=========>>=???>>?>??RRR???@?@@?@@@@@AAABAABABBBBBBBBBCCCCCCCDD######$$$$$$$$$$$$$$$$$$$$$%$%%%%%%%%%%%%%<;;&%%&&&&&&''&'&&''''''''''('!$';/'r((|*{,z.y0w2u4Kr:q=o@nCkGjKiOfSeWc\``^e\kZpXvV{URP`LKIGDCA@?=<:9876555I445555556789:;<=>?AUCDFGHIKgB8;2<<;<=<<=<=<====>>>>???>??>????SRS@?@@@@A@@AA@ABAAABBBABBBCBCCCCCCCCDCCDC$##$#$$$$$$$$$$$$$$%$$%$$$%%%%%%%%%%%%&&%&<;;&&&&&&&&&'&&'&''''''''''$&'&'(i(((~)|+{,z.y0w2It8s;q>oAnDkIiLhPfUdYb^_c^h\nYsWyUSP`MKIHFCCA?><;9776455I45555556799:;==?@@BVDEGHIJKMUAt8<1=====<===>==?>>>?>?>?????@?SSS@@@@@@AA@AAABAABBBBBBCBCCCCCCCCCCDCDDCE:9:::::::::::::::::;::;:;;;;;;;;;;;<<;<;;;GFF<<<;<;;<<<<<=<===<=<=<==28=h>>>>>>@BDFRJMOR}U|Xz\x`vcuhslqpoumzkigecka_][XTQPONMKKLKJJIJSIIIIIIIKLMNOPQQSTUU`XXZ[\]]`_XRcMPJQQPPQPQRRRRRRRRRRRRRSSSS]]]SSSSTSUTSTUTUUUUUUUUUVVUVVVVVWWWWWWWWWV$$$$$$$$$$$$$$$%$$%%%%%%%%%%%%&&%&%&&&&&%&<<<&&&&''&''''&''''''(''"'eB'((())))~+{-z0Gw4u7t9r=p@nDlHkLiPfUdYb^`c^i\oYuX{UUeMF?nq8WX5JF3?514313*1,'2)121424?2=P4Me4`5665I5555566899:<==?AABDXFFIKKLNNPuK<=;==;?=>>?>?????????@@@@@@SSS@@@AAABABBBBBCBBCCBCCCCCCCDDDDDEEEDDDEE$$$$$$$$$$$$$%$%%%%%%%%%%%%%%&&%%&&%&&&&&&;<<&&'&&'''''''''''''!%(<2'()())))))~,|.Ey2w5v8s:r>pAnElIjMhSfWc\ba_g]l[s[}VKqQfJ4<-/.%/*&/*(/,,0-.1//10112222121021030-3.*3+*4**4+=4>e5eI555555789:;==?@ABDFYGIJKMNOOPS`H;<5?>>?>>??????@??@@@A@@TSSAAAABBBBBBBBBCCBCCCCCCDCCECEDDDDEEEEEEE$$$$$$$$$$%$%%%%%%%%%%%%%&%%%&&%&&&&&&&&&&<<<&'&'&''''''((''''' $(j(((())))***~,Cz1y3w6u9s@ABCEGZIKKMNNPQRSTLDg<>6?>@???@@@@@@@@@@A@UUUBBABBBBBBCCCBCCCCCCDCDDDDDEEEDEEEEFEEFF$$$$$%$$%$%%%%%%%%%%%&%%&&&&%%&%&&&&&&&&'&<<<''&''''''''(((("(lJ((((())*)***+B|/z1x4w6v9s=rAoDmIkMiRgWg^cbNRO69&-+'.-.0/EED000000111111111111112122222222332343333434444445555555555III151*5*969x66899:<=>?ABCFFG[JKLNNOQRSTWnQ@@@>?=?@?@@@A@@A@AAABTUTBBBBBBBBCBCCCCCCCCDDCDEEDDEEEDEEEFFEFEF%$$$%$%%%%%%%%%%%%%%%&%&&&&&&&&&&'&&&&&&''<<<''''''''(((($&(0,(ށ((()))*****++@~-|0{2y4w8u:s>qBoFmKkOlV\Rc<;%,,(--00/00/000DEE101010111111111112111222233222434444444444445455555555555III555656453+6*>7@79:<=>?ABCEGHI\KLNNPQRRT}UzV{XVI=>4@@@@@@AAAABABABUUUBBBCBCCBCCCCDDCDDDEDDEEEEEEEEFEEEFEFFFF%%$%%$%%$%%%%%%&&&%&&&&%&&&&&&&&&&''''&'''<==''''('(('((("(](()))))*)*+*++@+~-|0{3y5w8u@BBDFFIK]MNNPRRST{VyVwWvYmWDBP??<@B@BBABABBBBVUUCBCBCCCCCCCCDCCDDDEEEEEEEEEEEEFFEFFFGFG%$%%%%%%%%&%%%&%&%&&&&&&&&&&&&&&'&''''''''==='''(''((("%(=3()()))))****+++A+,.|0{3y6v:u=uAoD|F8&+-+-.//////0//000000001DED111111111121112222222423443444444444445555555555555555555IJI666666776777778777/8-F8J;>@BBDEGIJK_NOPQSS}U{VyWvXtYqYr\WN??5ABAABABABBBCUUUCCCCCCCDCCDDDDDDDEEEEEEEFEFFFFFFFGFFGHG%%%%$%%%%%%%%%%&&&&&&&&&&&'&'&'&&'''''''''===('(('(((("(e(()))))***+*++,@,,,~.|1z4y7y:p=e@2!+,.//0/////000000000000101FFE111111121222222232333443444444444444555555555555555555565JJI67776677777788888888838198:=ABDGGIJKM`OPQRT|TyVwWtXrYpYnZm]h[FDV@A0!*././/////0000000000100100111111FFF222212222222323334434444455445555555555555555555565666667JKK7777777778888888888989999997966:5BHIJLMNObRS}UzUxVuXrYpZnZk[i\g]f^e`_]DDPBB>BCCCCCVVVDDDEDEEEEEEEEEEEEFFFFFFFFGFGGGHGHGGGHHG%&%%%%&&&&&&&&&&&&&''&&'''''''''''''((((((>>>)((%&(1.()))))*****++++,,A,----.lF/")././///000000000000000100111111111FEF212222223242433344444444555554555555555555555556666767667KKK7778778888888889899989999:9:::7:5<;>>((("(mR))))))****++++,,,A-----W.#)....///0//000000000100000110111211122FFG222222243433443444444545555555555555555555555566565777777KKK788878888988899999999::9:::;:9;::8;4D=MJNNPRRe|UxVuWrXoYmZj[h\g]e^c^a```_a^cV\CCCCDACDDXWWEDEEEEEFEEFEEFFFFFFFFGGGGGHGGHHHHHHHIIH&&%&&&&&&&&&&&'&''&'&'''('''('(('(((((()((>=>(()!%))))*****+++++,,,,A---.n.+-.,../////////000000000000111111111111111FFG232333332333443454444555555555555555555665566676667777777LLL888888889898999999999:::;;:;;:;;;;<;7;1RAqNPQR}TfvVsWqYnZk[i[f\e]c_a```^a]b[bZcYcHJlCB>>#%)C9)))******++++,,,,,B--..I:/',.///00//0/000000001000011111211111221222FGF323434443444455545555555555555555555555666667676777777777LLL888988888899999999:9::::;;;;;;<;;<<<<<<8;1fHRS|TxUhqXoYmZj\h\e\c^a^__]`]a[bYcXcWcWfMVDB9EEDXXWEEEFEEFFEFFFFGFGGGHFHGGHHHHIHHIHIHHIIII&&&&&&&&''''''''''''''''''(('((((((((((()(??>#){\))******++++,,,,,-B-..Z.")/////0//00000000000110111111121121222222232GHG343334434444455445555555555555555566666666677777777778888LLL898899999999:99:::;::;;;;;;;;<;;;<<<<<<;<8A?IvP|UvVsX~inYk[h\f]c]a^__]_\a[bYcXcWcUdTeUgPaEEJEECXXXFEEFFFFFFFFGFGHGGHHHHGHHHHHIIHIIIIIIIII&&''&'''''''''''''''((((((((((()(()()())))???#))******+++++,,,---B-.ك/20/,./////0/000000010010011111111111222222222433HIH344444444545455555555555555555655666667766777777787788888LLL989999999:99:::9;:;;;;;;<;;;<<;<;<<<<<<=<=9<2RFxWqWnY{ki[f\c]a^__]_\`[bYcWcVcUdTdReRfRfQhHLmED>XXXFFFFFFFGGGFHGGHGHHHHHIHHHHIIIIIIIJIIKJI&&&''&''''''''''''''(((((((((())()())))))):=AgSnZi[vld\b]__^_\_ZaYcWcUcUdSeReQfQgPgOhOkJUED_M)*****++++,+,,,,---C/݌/52/,./000000000000000111111111121122222222434343433HII444554554555555555555555565666677767777777877788888888998MML9999:9::;;9:;;:;;;;;;;<<<<<<<<<<<=<==========<<4OIj\e\rm`_]_[_ZaXbVcUcTdSdQePfOfOgNgMhMiMkJ_FD?XYXGFFGFGGGGHHGHHHIHHHHIIIIIIIIIIJJJKJJJJK''''''''''(''('(((((((((((((())))))))))*))58?m****++++++,,,,----.C.c/#)00/0000000010101111111111111212222222332324344444III445555555555555555555565666776767777777788888888888888999MMM9:9;:::::;::;;;<;<<<;<<<<<<<<<<=<===<==>>>>?>>?;A@J_Za^mo[_Y`WaVbUcSdReQePfNfMfLgLhLhLiKiJjJeFITXXUGHGFGGGHHHHHHHHHHIIIIIIIJIIJJJKKJKKJJKK=<=<<=<======>=>>>>>>=>=>=>>>>????????????ADJĜ@@@@@@@AAAAAABBBCDCOD^TE?ADEEEEEDEDEFEEEEEFFFEFFEFFGFGGFGGFGHGGHHGGHHHHHHIISSSIIIIIIIIIIIIIIIIIIIIIJJJJKJKKKKKKLLKLLLLLLLLLLLLLLLMMMMMMWWWNNNNNONNNOOONNOOONPPOPPOPOOPPPPQPQQQQQPQQPRRQRRRQPIbclqqxhqfrercsctau`v`u_v^v^w\x\x\x[x[xZyZzZ_}ca\YZZZZZ[ZZ[Z[[[[[[[[[[[[[\[\]]\]\\]]]]]^'''(('('((((((((((((()))(()))))))*))***'(*FC@ۧ**+*++++,,,----/.//D‡/),00/0000001101110111111121222222222333333333444445444III5555555555555556656566776677777777878888888889899899999:9NNN;::;::;;<;;;;<<<<<<<<=<<<=======>==>>>>>>???????>>8EGnVaeqRbRcPcOeNeMfLfJgJgIhIiHiHiHiGjGkGkGmGUZYRGGHHHHHIHHIIIHIIIIIJIJJIJJJKKJKKJKKLLLL'('(('(('((((((((())))(())))))))))))**)$%*]U@+*+++,+,,,-,---.//0Db0%)0000110100110111111212222222322333333433444444545555III5555555555556556666766667777878888888888888989999999:::;:NNN:;;;;:;<<<;<<<<<<<<<<==<=======>>=>>>??????@??????=AAFP]btNdNdMfKfJfIfHgHhHhFhFiGjFjFjFkFkFkGmH\ZYRHHHHIHHIHIIIIIIIIIJIJKJJJKJKJKKLLLLLMML('((((((((((((())))))))))))))))********!#*qd@+++++,,,,,-----.//0EVH0)+0100010111111121112222222332433333434444444545555555III555555555555766556766777887777888888988888899999:99::;;;;OON;;;;;;<;<<<<<<<<<=<====<====>>>>>>>>???@???????@@@@?>6JX_vLfJeIfHgGhGhFhFiEiEjEjEjEjFkFkFkFkHmHbZYRHIHHHHIIIIIIIIIJIIJJJJKKKKKKKLLLLMLLMML((((((((()())())))))))))))))*))*)****** #*s@+++++,,-,--.....///ߪD950-.0001111111111111122222222233334334444445444455555555III555555555665677777777778777888888888889988999999::;::;;;:NOO;;;<;;<<<<<<<=<<=<=======>=>>>>>>>?????????@@@@@A@@A>8DO\wHfHgFhFhDhDiDiDjEjEjEjEjFjFjFjGkGlHmHe[[]HHGHIIIIIIIJIJJJJIKKJKJKKKKKLLMMKMLMMMM((((((((()()))))))))))))*))************!#*@+++,,,,,----/////00ƜE'*0001111111111211121222223323333344444444454554555555555III5555667666767667777778877888888888899999999:9;;::;;:;;;;;NNO;<;<<;<<<<<<<<===<===>==>>=>?>????????@?@@@@@@@AA@AA?8BJmYwEgDhDiCiCiDiDjCjEiEiFiFjFjFjGjGjHkHlHg[^jIHEIIIIIJJJJJJJJKJKKKKLLLLLLMMMMLMMMMMN((((((()()))))))))))*)*)*)*******+*+*++!#+@++,,,,,--.--///0000D'*0111111111111222222322323333443444455444554554555555555III5565567677777777777878888888888899999999:99;9;:;;:;;;;;;;OOO<<<<<<<<<<===<====>=>?>>??>???????@?@@@@@@@@@B@@B@A@@=BG[VuBiCiCiCiDhDiEiEiEiEiFjFjFjGkGiHkHkHlIh[_rIHDIJIIJIJIJKJKKKKKKKKLLKMLLMLMMMMNMMNM(()))()))))))))))))*********+*****+++++!#+A,+,,,----./////0000E'*0111111111212222222333422423444445445555555555555555555III656666677777777877888888888989999999999:::;;:;;:;;;;;;;;;PPP<<<<<<=<<=======>>?>>?>>??>????@??@@@@@@@@@A@AAABABBA?BDMUrBiChDhChDhEhEiEiEiFiFiFjGjGjGjHkHjHkIi[azIHCJJIIJJKKJKKKKKKLLLLMMLLMMMMMMMMMMNNN)()))())))))))))***********++*++*++++++!#+@,,,,----/../0//0001vE'*1111111222222222343333343444444445555555555555555555655JJK7657776777778778888888888999899999:99:::;:;;:;;;;;;<<;<<=>>??>??>???@??@@?@@@@@@AABABBABBBBBBB@BBCVoCiDhDhDhDhEhEhEhFhFiFiHiGjHjHjHjHjHjIj\bKHBJJKJJJKKKLLKLMMLKMKLMMMMMMMNNNMMNNNN))())()))))*)**************+*+++*++++++"$+Ǯ@,,,----....//000101~qF(*1112112222223233344444444444445555555555555555555555666JKK7667677777788888888888888999999:9:;::;;;::;;;;;;<;;;<<<<=>>=>>?>??>??????@@?@@@@@@AAAABABABBBBBBBBBBCB=UnCiDgEgEhEhEhFhFhFhGhHhHiHiHiHiIiIiIiIk\cJICKKJKJKLKKLLLMLMLLLMMMMNMMNNNNMNNNNNN))())))*)**********+****++*+++++++++,,+"#,ʲA,,----./..///000011znF(*1222222222333334344444445444555555555555555555555566666KKK777878877888888988988989999999:::;;:::;;;;;;;<<<<<<<<<<<=>>??>?>??????@???@@@@@@@AB@BBBAABBABBBBBCBCBBCA;VmDhCfEgEgEgEgFgFgFhFhHhHhHiHiHiIiIiIiJk\dKICKKKLKLMKLKMMLMLMMMMMMMNMNNNNNMNNNNNO))))))**)**)*********+++++++++++++,++,,"#,ɲA,-----/..//00001111|qF(*1222322332343433444444544555555555555555555555676777776KKK777878888888888989998999::9;::;:;;;;;;;;<;<<<<<<<<<<=<=<=PPQ=>=>==>>=>>>??????@??@@@@@@A@@AAA@BAAABBBBCBBBBBCBCCCBCB=WmDhDfEfEfEfFfFgFgFgGgHhHhHhHhHhIhIiIiKj\dKJDLKKLKKMLMLLLMMMMMMNNMNNNNNNNNNONOONO))))*)**)*************+++++++++,++,+,,,"$,ıA----....//000001111xF(*2223433333334443445445555555555555555555555666666667777LKK7778788888888888899999::9::;:;;:;;;:<<;<<;<<<<<<<<<<<====QQQ>>>>>>?>??>????@@?@?@@@?@@@A@ABBAABBBABBBBBBBBCCCCCCCBCCAWmEgEeEeFfEfFeFfGfGgGgHgHgIgIgIgIhIiJiKh]cKJDLLLLLLMLMMMMMMMMNNNNMNNNNNNNNNNOOOOP))***)******+**+*++++++++++,++,+,,,,,,,"$,B----...///000011112F(*2323334244444544454554555555555555555565566667767777877LLL8788888898889999999:9:;::::;:;;;;;;;<<;<<<<<<=<<======<=>?>=>??????????@@@@@@@@A@AAABAAABBBBBBCBBBCCCCCDCDDCADDIWnEeEdEdFdFeFeGeGfHfHgHgIgIgIgIgJhKhKhKi^c{LKFLMMMMLMMLMMNNNNNNNNNNNNNNNONNOOOPPPP**************++++++++++,++,,+,,,,,,,,,#$,B---././/00000111112G)*3434433444444554555555555555555555655666666667777777878LLL888889889999999999;:::::;;;;;;;;;;<<<;<<<<<<<============QQQ>>>???????@??@@@@@@@@@AABAAABAABBBBBBCBBCCCCCCDDDCDDD@DHTXoFdEcFdFcFdGdHeHeHfHfHfIfIfIfJgIhJhKgKg_cuLKGLMMMMMMNMMNNNNNNNNNNNNNONNOPPPPPPPPP********+***+++++++++,++,+,+,,,,,,,,,,,#$,B..-///0000001111222G)*3444444445454555555555555555555566666677767777777887878LLL888888989999999::9:;;;:;;;;;;<;;<<<<<<<<<<<<<<<=>==>==>>>QRR??>??????@@@@@@AA@AAAABBBAABABBBCBBBCCBCCCCDDDDDDDDED?EJ_XqEcFcFbFdGdHdGdHeHeHeIeIeJeJfKgJgJgKhKf_bnMLIMMMMMMMNNNMNNNNNNNNOOONOPOOPOPOPPQPP*******+*++++++++,+++,++,,,,,,,,,,,--,,#$-B...//0/000111122233G223334444544554555555555555555566666676776777777888888888MLL989999999::9:9:;::;;;;;;;;;;<<<<<<<<<<<=<=======>=>>>??>>QRQ??????@@@@@@A@@A@AAAAABBBBBBCBBBBCCCCCCCCCDDDEDDEEEED?ENoXrFaFbFbFcGdGdHdHdIdIdIdIdIeJeKfKfKgLhLd_`eMLKMNMMMMNNMNNNNNNNOOOPOOPOPOPPPPPPPPPQ****++++++++++++++,+,,,,,,,-,--,-------#$.}wC.///000001111122244HJH30/4445545555555555555555555666666677777878777888888888LMM9999999:9;::;:::;;;;;;<;<<<<<<<<<<<<=========>>>>>?>????>RRR????@@@@@@@@AAAAAABBABBBBBBCCCBCBCCCCCCCECDEDEDDEEEED?FTYqF`F`FaGbHbHbHcIcIcIcIcJdJeKeKeKfLfMhMb_^\MMMMMMMNNNNNNNNOOOOPPOPOOPPPPPPPPQPQPQQ+*+*++++++++++++++,,,,,,,,,,,,--,------&&.kfC///0000011111222244Imi4+,5545555555555555555555655776777777778777888888889988MML9999:::::;:;;;;;;;;;;<<<<<<<<<<<<==<======>>=>>>?=?????@?RSS?@@?@@@@@BA@BAABBBBBBBBBCBBCBCCCCCCCDDDCEDEEDEEEEFEEEBFYYpF_G`GaHaHaHbHbIbIbIbJcKdKdKeKeLeMeMgM^_^YMMNNMMNNNNNNOONOOOOOPPPPOPPPPPPPPPQPQQQ++*++++++,++,,+,,,,,,,,,---,------.--..*).USC///0000011122223334I5**5555555555555555556666757777777777778787888888889999MMM9:::::;:::;;;;;;;;<<<<<<<<<<<<<<<======>==>=?>??>?>??@??@RSR?@@@@@@A@BBBBABBBBBBBBBBCCCCCCCDCDDDDDDEEDEEEEEEEEBFITF\ZoG^G_H`H`H`HaIaIaIaJbJcJbKdKdLeLeMeMgMY_^YNNNNNNNNNNOOONOPOOPPPPPPPPPPPQPPQPQQQQQ@@@@@@@AAA@AAAAAAAAAAAAABABBABBBBCCCCCDCBDJKNDDDEEEEFFFFFGGGHIHIRIPPIGGIIIIIIIIIIIIJJJJKJJJJKKKKKKKLKKLLLLLLLLLMMLMMMMMMWWWNNNNNMNNNOOONOOPOOPPPPPPPOPPOPQPPPPQRQQQQRQQRQRRRRRSRRSRS\\]SSSSSSUTTUUUUUUUUUUUUUUVVVVVVVWVWWWWXXWXXXXWXWYXYWSY`XmbvYnZnZo[o[o[o[o\p\q[q]q]r^s^t^s_t_u_v_fhgd_``_``_`_``aa`ab``abbbbbbbbbbbbbcccccbc+,++,++,+,,,,,,,,,,,,-,------..--/..././//::D/000111112122333444I5nm5,,5555555556666756777777777788888888888888999999:9:NNN:;:;;;;;;;;;<<<<<<<<<<<<<<=======>=>>>?>>???????@@@@@@@@@SSSA@@BAABBBBBBBCCBBCBCBCCCCCCDDDDDDEEDEEEEEEFEEFFEFECFUG]YmH]H]I]H^I^I_J_I`JaK`KaLbLbKcMcMdMeNcMQ___[NNNONNONOOPOPPOPPOQPPPPPPQPQQQQQQRQRRQR,++,,,,,,,,,,,,,,,----,----..-/..///./////:;Dxt0000011212123334445I55,,55556556656776677777777787888888898889999999999:9NNN;:;;;;<;;<;<<<<<<<<<<=<<======>>>>>>?=>????@????@@?@@@@@@TSSBAAAAABBBBBBBBCCCCCCCCCCCCEECEEEEEEEEEEEEEFFFFECFJXHYHZ[lH\H\H\I]I]I^I_J_K`K`K`KaLaLbMcMcMdN_NNP__^ONNPNOPOPPOPPPPQPQPPQPQQQQQQQQRQQSQRQSR,++,,,,,,,,,,,,-,--------/./../..//.////0/=>EPO0000111122233344555I55SS5..5666766776777877778888888898999999999:9:9:;;;:OOO;;;;;;;<<<<<<<<<<<=<==<====>>>?>=>??????@??????@@@@@A@@AATTSBABBBBBCBBBBCBCCCCCDCCECDEEEDEEEEEEEEEEEFFFFFGFBHQzHYGY[kHZH[I[I\J\K\J^K^K_L`K`LaMbLbMbMcNdN[NMI```NONPPPPOPPOOPPPPPQPQQQQQRQQRQRRRRSRRRRR,,,,,,,,,--,----,----....../../////////0/0CCE./0010111222333444555I555+*5766777776777778888888888988999999:99:9;::;;;;OOO;;;;;;;<;<<<<<<<<<=<====>>>?>>>?>??????????@@@@@@@@@@BAABUUTBABBBBBBCBCCCCCCCCDDCEDDDEEEEEEEEFFFEFFFFFFFCFIRGUHXHX[jHYIZIZI[I[K\K\K^L_M_M`LaMaMaMaNbNcNTnOMI```OPOPPOOPPQPPQPPPPPQQQQQQRQRRQRQRRSSRRSS,,,,,,,,,-----------.....///////0///0//000EEE%&0011222223434445555I557XZ7/.57777877888888888888989989999999::;;;;:;;;;OOO;<<<<<<<<<<<=<=======>>>>>>>=>??????????@?@@@A@@AAAAABBBBUUUBBBBCCBCCCCCCCCDDDEDDEEDEEEFEEFEFFFFFFFFFFFFEGOrHVHWHW[hIXIYJYIZJ[K\K\L]M^L^L_M`N`N`N`NaN`OQYPOLa``PPPPPPPPPPQPPQQQPQQQQQRQQQRRQRRRSSSSSSS,,,,-,-------.-.../.-...././0////000000000EEE((0aa111222223334555555I5667227657888888888988888999999999::;::;;;;;;;;;;OOO<;<<<<<<<============>>?>=>????????@@?@@@@@@@A@@AAABBABBBUUUCBBCCCCCCDCCCCCDDDEEEEEEEEEEEFFFFFFFFFFGECGJWHTHUHUIV[hIWIXJXKYI[J[L[L\M]M^M_M_M_M_M`NaO[ONLOOOaaaPPPPPPQQPPQQPQQQQQQQQRRRSSRRRRSSSSSSSSS,,---------.-/..-//.//.//////////000000010EFE..155111222234445555555I6666|7-+888888888898899899999:9:;:::;;;;;;<;;<<??????????@??@@@@@@A@@AAABBBBBBCBBUVUCBCCCCCCCDDCDEECEEEEEEFEFEEFEFFFFGFFGGEFHHGPpHSHTHTIU[fIVIVJXKYKZLZMZL]M]M]M^M^M_M_N_P`OVoONLPPPabbPPPPPPPQQQQQQQQQQQRRRSRRSRRSSSSSSSSSTSS--,------....///-//////////00/000000000000FEF111%%111222334445555555I67777U[81/8898899999999:999:;:;;;;;;;;;;;;<<<<>?>????????@?@@@@?@@A@@A@@ABAABBBBBBBBCBCVUVCCCCCCDCCEDDEEEEEEEEEFFEEEFFFFGGGHGGGHFHM`HQwHRwHSzIS}IT[eJVJVJXKXLYLZL[L[M\M\N]N]N^N^N`P^OPWPNMPPPbbbQPPPQPQQPQQRQQRSRQRSRSSRSSSSSSSSSSSSTTT------..-...////.///0//000/000001000000101FFF111++2QQ22333344455555556J777788=?8448999999:::::9;;;:;:;;;;;;<;;;<<<<==>>?>?>?????@??@=>>=>???????????@@@?MB@9>@?AABBABBBBABBBBBBCCCCCCVVVDDCEEEEDEEEEEEEEEEEFEFFFGFFFGGFGFGHNHMbHOgIOiIPmIPpIQsIRv\eKU{KUKVLVMWLYMYMZNZN[N[N\O]O^O^OS`POMPPPPPQbbbQQQQQQQQQRQRRRRRSQSRRSSSSTSTTSSSTTTTTTT-...-///.././////00//000000000010111111111FGF222222))2eh2444455555555577K7888888953976;:;;;::;;;;;;<<;<<<<<<<<<<==PPP====>=>?=??>??????????@@@:?@^AYA>AA:>BBBCBBBCBBCCCCCDCCWWWDEDEDEEEEEFEEFEFEFFFFFFFFGGGHFGHKHKZHM_HMbHNeIOhIPkIPoKRr]dKTwKTzKV|MWMWMXMYMZNYNZN[O\O\N]PYPPOPPPPPPPPQbbbQQQQQQRRRRRSSRSRRSSSSSSSSTTTTSTTTTTTTUT.....//.////00/000000000000111111111111111FFF222232122103445555555556767K78889999:9:;85;;;;<;;;;;<<<<<<<<<<=<==>>>?>>>??>@?????@@?@@@A7>AbA{BqB_NB7=BABBCCCCCCCDCDDVWWEEEEEEEEEFFFFFFFFFFFGGGGHHHHHGHHJHKTHL[IL]IM`JOdJOgKQkKQm]d~KTsLTvLVxLV{MW}MWNXNYNYNYOZO[O[O\PTbQOMPPPQPQQQQccbQRQQRRRSRSRRSSRSSSSTSSSSTTTTTTTTTTUUUUV..///////////00000000100101111111211121221FFG222333343*)4kn444555555566777L7889999:;;?C;73;<<<;<<<<<<<<<========QQQ>?>>>>>>?????@?@@@@?@@@@B7?A`AwBBBgB@AC==QQQ>>????@?????@@@@@@@@@AAAA8>BaBwBBBCʇD`TD9=EBBEEEXWXEEEEFEFFFFFFGFFFGGGGGHHHHHHHHIIHHIIHIIIIKTIMYJN\KO_KObKPf^cwLSkLSnMTpMUsNUuNVxNVyNW|NX~OXOYOZP[PS`PPNQQQQQPQQQQRQbccRRSSSRSRRSSSSSTSSSTTSTTTTTTUTTUTUVUUVVU0///////0000000110010111111111111222222322HHG333434444544-,5]b55555556667778L8889::9;;;<=>RRR???????@?@@@@@@@A@AA@AAAA9?BbBvCCCCDDrECCE>@XXXFFEFFFFFFFGFGGFGGHGHHHGHHHHHHIIIIIIIIIIKJKJMTJMYJN\LO_LPb^btMRhMSjMSlMUoMUrNUtNVvOWxOWzPX}OYO[PWrPPNQPQQQQQQQQRRQRRcccSRSSSSSSSSSSTSTTSTTTTTTTTUTTUTUUUVVUVVV//00/0000000000010111111111111212222222333HHG333444545544555,+55555567777888L889::::;;<<<=j>>>>>?RRR?????@@@?@@@A@@AAAAABBBAB9@CbCvCCCDDDEʚEaXXMQFDDFFFFFFGGGGGGHGGHHHHHHHIHIIIIIIIIIJIJKJIKKLJLTKNYMO\LQ^^cqMQdMSgMSiNTkNTnNUpOVrOWuOWwOXyPY|PY|PRXPPOQQQQQQSQQRQQRRRdddSRSSSSTSSTSSTSTTTTTTTUTTTUVTVVVVUVVTVVV//00/0000000100011111211212122222332322333HHI444445454455555005DG5555667787888L99::;;;;;<<<=|6?ROR?@?@@@@@@@@@A@@ABBAABBBBB:@BbCvC~DDDEEEFXFDDF@AGHFGGHGGGHHHIHHHHHIIIIIIIIIJIIKJKJKJKKJKKLLMULOYLP\_boMQaMRcNRfNShNTjOTnOUoPVqPWsPXvPX{PTdPPNQQQQQQRRRRQQRQQSSScddSSSSSSSSSTTTTTTTTTTTTUVVVVVVVVVVVVVUVVV000000000110111111111112122222232332434344HII444544555555555555+)5p|565667887888L99::;;<<<<<<{=t=o=k>a>R?Fv?SYR?4@@7@@;@A?@BABAABBBBBBCB:@CbCvC}DEDEEEEYFʧFc\H<>HEFHHHHHHHIHIIHIIIIIIIJJJJJKJJJKKKKKKLKKMNLNVMPZ_bmNP^NRaNRcOSeOThOTkOUlPVoPVqPXtQWnQQQQQPQQQQRQRSSRRRSRRSSSdddSSSSTTTTTTTTTTTUTUUUTUVVVVUVVVVVVVVVVVV000000010111111111112222222222323324344344III455554555555555555445/.577777888899M:9::;;<<<<=|=v=p=j>d?_>Z?T?]SE@Az@AX@A?AB8AA9BB9AB9BC1?CbCvD}DDEEEEFYGGHHFFIACIHHIIHIIIJJIJKJJJKJJKKKKKLLLLMLLKMMLMNNMOV`ajNP\NQ^NR`NRcOReOTgOTjPVlPVoPWoQRXQQOQQQQRRRSRRRQSRRSSSSSSddeSSTTTTTTTTTTUTUVUUTUUUVVVUVVVVVVVVVVWVWEEEEEDFEEFEFEEFFFEGFEFGGGGHGGHHGHHHGHIIIHHSSSIIIIIIIIIIIIIIIIIIJJIFEJSUKKKLKLLLMMMWNNNONOPPPPPQQ{RvRqRkRgRcSg\ZSVSTUTXUZU\V]V^V^VtVWWXXXYYZbZ[[[η[vq[PS[YY[[[][[\\]\]]\]]^^^^^^^__^_^________`hio_bj`bl_bm`coadsbeubfwbfxbg{bdmcbabbbcccccccccdccddddddddemmmeeeeeeeeeeeefgefgfffgggggfgggggghghhhhh100111111121122222222223333344433444445545III5555555555555555655667660-7Wb7788889999N:;;;<<<<==z=t=o=i?d>_?Y?T@O@\SFABBBCBHBMBRCXC_CfDmDtD|EEEFFGGZHHHHHIIGGKCDJKJJJJKKJKKKMLLLMLLMLMLMMMMMNMMNM_``NPVPQYPR[PR]PS`PTcPTdQUhPT`PQPQQQQQQSRRSRRSRRSRSSSSTSSSSTdedTTTTTTTTTUTUUUUVVUUUVVVVVVVWWWWWWVWWWWW111111111122222222232342333334444544554555III555555555555656766667757777/,7o88898899:M:;;;<<<=={=v>p=k>f>a?[?W@Q@M@[TEABAADBIBMCRCXD^CfDmEtE|EEFFFGGZHHHHIIJ̷KfaK@AKJJKLKMKKMLLMLLMMMMMMMNMMNMNNN_`_OOOOPVPRZPQ[PS^PS`PTbPT`QQRQQQRRQRRRRSRSQSSSSSSTSSSSSTTTTeeeTTTTTTTUUUUVUUUVVUVVVWVVWWVWVWWWWWWWWWW111111122122222232333334343444454455555555III5555555555655567777777777776682/8~889999:;N;;;<<<<=}=w=r>m>h>c?^@Y@T@P@KA[UEBBBBFBJCNCSCZD`CgEmEtE{EFFFGGG[HHHIIJKKKLJILEFMLLMLMMMMMMMMMNNNMNNNNNN_``PONPPQORWPRZPR\PS^PT^PQRQQPQRQRRRRRRRSRSRSSSSSSSTTSSTTTTTeeeUUTUUTUUUUUVVVVVUVVVVVVWWVVWVWWWWWWWWXW111112222122222232444434443454454445555555III555555575666666776777877878888658438899:;::O;<<<<==}=y=t>o?j?e?`@[@W@R@OAKAZTDBCCBGCKCPCUC[D`DgEmEtE{FFFGGGH[IIIIJJKKLL̾LgeLBCMKLMMNNMNNNNNNNNNNNON```POOPOOPPQQRWQR[PS\QQSQQPRQQRRQQRRSSSSSRSSSTSSTTSTTTTTTTTTefeUUUUUUUUVVVVVVVVVVVVVVVWWVWWVWWWWXXWXXX112211222232333333444444445444545555555555III5555556567777667777888778888888986587789:::;;O<<<<=<=z>v>q>l?h?c?^@Y@U@QBLAJAYUCBBDCHCLCQDUD[DaEgFnFtFzFGHHGHH[IIIJJKKKLLLMMKKMFGNNNNNNNNNONNOOPaa`PPOPPPPPPQQRQRWPQSQQQQRQRRRRRRRSSSSSSSSSSSTSTTSTTSTTTTUTTfffUTVVUVUVVVVVVVVVVVVVVWWVWWWWWWWWWWWXXXW212222222322333444444444444554555555555555III5666656676676777777888888888888999996499:9:;:;;P<<<<=>|>w>s>n?i?e?a?\@W@TBOBKAHBWUBBBECHDMDREUE\EbEgFmFtF{FGHFHII[IIIKKJKKLMLMMNigNCDNLLNOOPNOPOPaabPPPPPQQPQQPQQQQQQQRQQRRQRRRRSSRSSSSSSTSSSTSTTTTTTTTTUTTUUgffUUVVVVVVVVVVWVWWVWWVWWWWWWWXWWWXYXWXXYX222232332433334344454445555555555555555555IJI576667777777777877888888888898999999::976977:v;;;;O<<===}>x>t>p>l?g?b?^@Z@U@RANBKAGBXVCCCFDJDNDTDXE]EbEhFnFtGzHHGHHHI[IIJKLLKLMMMMNNNNLLNHIOOPPPPbabPPQPQQQPQQQQQQQQQQRRQRRSRRSSSSSSSSSTTSTTTSSTTTTTTUTTUUTUUgffVVVVVVVVWVVVWWVWWWWVWWWWXWWWWWYYYXYYYYY222233444434444444454555555555555555555555JJJ7776777778778788888889888899999999:9;;:;::97;73;j;<q?m?i?d@`@\@XATAQAMBJBGCWVCDCHDLEPDTEYE]EcFhFnFtFzGHHHHII[IJKKKLLMMMMMNNOOOjiPFFPNNbbaPPQPPPQQQQQQQRQRRQRRRSRRSSSSSTTSSTTTTTTTTSTTTTTUUTVUUUUUUgfgVVVVVWWVVVWWVWWWWWWWWXWWWWXWXWXXXXYXXYY333333444444444445545555555555555555555655JJK7777777778878878888888889899999999:9:;::;;;;;:9;82;]<w>r?n?j?f@b@^@ZAUAQAOBLBIBEBVVCECHEKEQETEYE^FcFiGnGtH{GHHHIII]JKKKLLLMMNNNNOOOPPPPQb``QPQPPQQQQRQRSRRSSRRRRSRRSSSSSSTSTTTSTTTTTTTTUUUUVUUVVUUVVfggWVVVWVWVVWWVWWWVWWXXXWWXXWXYYYYXXYYYYYY334344444444445555555555555555555555776677JKK777777778888888888899899999999::9::9;;;;;;;;;;<<<;<71|>x>t?p?l@h@d@`@\AYAUBQBNBKCHCECVVCGDJENEQEVFZF_FdFiFnGtH{HHIIIIJ\JKKLMMMMMNNNOOPPPQPbhgQNOQQQQRRRRRSSRSRSSSSSSSSSSSTTTTTTTTTTTUTUVTTUVUVVVUUUVVVgggVVVVVWWVWWWVWWWXWWXXXWXYXYXYYYYYXYYYYYY343444444544545555555555555555556656666766KKK8778777888888888888989999999:;:;:;;;;;;;<<<<<<<<<<<<=<94=SWPh=>?z?v?q?n?j?f@b@^@[AWBTBPBMCJCGCDCVWEHEKEOEREVFZF_FdGjGoGuHzHHIIIJJ]KLLLMMNMMMNNOOOPPPPbbbQPPRQRRRRRRRRQSSSSSSSSTSSSTTTTTTTTTTUTTTUVVUUUUUTVVVVVVVVhhgVVWWVWWWWWWWXWWXXXYWXXXYWXXXYXYYYYYYYYY444554554555555555555555555655666676766777KKK878888888988899999999999;9::;::;;;;;;;;;;<<<<<<<<<<=<====OLP;6>S>s>y?t@o?k?g@c@`A\AY@UBRBOBLBICFDEDVXCIEKEPFTFWF\G_HdHjHoHuHzHIIIJKK]KLMLMMMNNNOOOPPQPPZYQHHbbbSRRSRQQRQSSSSRSSSSSSSSSSSTTTTTTTTTTUVTUUVVUUVUUUVVVVVVVVVhggWVVWWWWWWWXWXXXXXXXYXYYYYXXYYYZYYYYZYYZ445444555555555555555555655656566676777877LKK878888888988999999::9:;9;:;;;;;;;;;;;;<<<<<<<<<<===<=====QQP==>:3?CK?\?p?n@i@f@bA^AZAWATCQCNBKBHCFDECWYEJEMFPFTFXG\HaHfHjHoHtIzIIJJJKK^LLMMMMNNNOOOOPPP{QHIQMNQQQcccQRRRRRRSRSRSSSSSSSSSSTTTTTTTTTTUTTUUVUVVVUVUUVVVVVVVVVWWWhggWWWWWWXWWXXXXXXXXYXXYYYXYYYYZYYYYZYZYYZ544454555555555555555566666766767777777787LLL8888988899889999:9;;9;::;:;;;;;<;<;<<;<<<<<=<<<<========>RQR??>???>;?<5?Ig?_@h@fAaA]AYBVBSBPCMCJCGDECDEWZEKFNFQFUFXG]GbHgHkHoItIzHIIJJJL^LMMMMNNNNNOOPPPYXPHIQQQQQQQQQcbcRSRRRRRSRSSSSSSSSSSTSTTTTTTTTTUUVUUUVVVVVVVVVVVVWWVWVVWWWhhhWWWWWWXXXYXXXYYXXYYXYYYYYZYYZYZYYZYYZZZ554555555555555555555556766777777777788888LLL898889998999999::::;;;;;;;;;;<<<;<<;<<<<=<<<<======>==>>>RRQ?>>???????@@>8@?=@KwAZB_B\BXBTCRCOCLCJCGEEDEFX[EKENERFUGZG]HbHgHkIpItHzIJJJKLL^MMNMMNNNOPPPPwPHIQMMQQQQQQQQQRRQddcRSRRSSSSSSTSTSSTTTTTTTTTTTTUUUUUUUUUUUVVVVVVVVWWVWVWVVWWWhhhXWWXWYXXXXXXYYXXYYYYYYYZYYZYYYZZZZZZZZZ555555555555555655565667776777777877888888LLL88989998999;9:::;:;;;;;;;<;;;<<<<<<<<<<<=<<========>>>?>>RRR???????@@@@?A@@@@@?8A@?BIsBRBVCTBQCNCKDJEGCEEEGX\ELFOGSGWH[G_HcHgIkIpIuJzJJKKKKK^MMMMNNNOPPPPZWPGIPPPQQQQQQRQQRRRRRSddcRRRSSSSSSSTSSTTTTTTTTUUUUUUVUUVVUUVVVUVVVVVVVVWVVWWWWWWWWhhhXWWXXYXXYYYYYXYYYYYYYYYYZYYZZZZZZZZZZZZ555555555555555666677666777877777888888888LML9999999:9:::::;:;;;;;;<;;<<<<<<<<<<<=<<======>>=>>>>>>?>?RRR???@@???@@@@@AABBAAAAA@BA:CA?>??>????RRR@?@@?@@@@AAAABBB@BBBBBBBBCCCBCB=CB:CDCDEmEGDHEGEEFFIX^FOGQGTHXH\H`HdIhIlIpIvJ{J~KLLLMM_NNNNONPOPYVPGJPPPPQPQQQQQQRQRRQRRSQRSSSSSdddTSSTTSTTSTTTTTTTTTUTTUUUVVVVUVVVVVVVVVVWVWVWWWWWWWWWWWYXXiiiXXXXXXYYYYYYYYZZZYZYYZZZZZZZZZZZZ[[Z\\[555555555656666777777777888888888899898899MMM9:9:9::::;;;;;;;;;<;;<<<<<<<<<<<<=======>>>=>>>>?>??@??@?SSS@@@@@@AAAAAAABABABBBBCCBCBCCCCCCCDDDDCDC=ED;EEEEEcFFFFHY]GNGRHVHZH^HaHfIiInJqKvJzKLLMLMM_NNNOOOPnPGKPLNPQPPQQQQQQQQRQQRRRRRRSSRSSSSSSdeeSTTTTTTTTTTTTTUUUVUUUVVUUUVVVVVVVVVVWVWWVWWWWWWWWWWWXXXXXiiiXXYXXYYYYYZYYYZZZYZZZZZZZZZZZZ[ZZ\[[[\[IIIJIIJJJKJKKKKKKKKKKKKKLLLLLLLLLLMMMMMMMMXXWNNMNNNONNONNOOOOOOOPOPOPPPPPOPPPPPQQQQQQQQQQRRRRRRRSSRSRR\\]STSTSTTUTUUTUUUUUUUUUVVUVVVVVVVVVWWVWXWWXXXXXWWXXQYYPXYPXb_cZiZZ|\[_[aZe[g[j[o]s\~]]^_^^__`h__```akgbX\baabbbbbbbcbccbccbccdcccddcdddddddddmmmeeeeeeeeefeffffgfffgfggfgggggghggghhhgghhhhhhhhhhiihihhiiqqrjijjjijjjijjjjjjjjjkjkkkkjjkjjkkklkllml5656656677777777778788888888889889999999::NNN;::;;;;;;;<;<<;<<<<<<=<<<=<======>==>?>>>?>?????@??@@?@?@SSS@@ABABAA@BBBBBBCCBBCCCCCCCCDDDDEDDDDEEEEEEEEEFFFFFFFFFGGFZYYHDGHAHH?GI@HI@HI@HI@HJ@HK8GIiKxKzKLMMNMN_NOOPjPHKPLNPQPPPQQPQQQQQQQRQQQRRRRRRRSSSSSSSSSSTTSedeTTTTUTTUTVTUUUUUUTVVUVVVVVVVVWWWVWWWWWWXWWXWWXXXXXXXXXYYXjjjYYYYYYYZZZYZZYZYZZZZZZZZZZZ[ZZZ[[[\]]\]665665667767787787888888998998989999::9;;:NNN;;;;;;;;;;;<<<<<<<<<======<===>==>=>>>?>?????@??@??@@@@@@TTSAABBAABBABBBCBBCBBCCCCCDDCDEDCEEEEEEEEFFEEFEEFFFFFFFGGHHG[ZZHGHHHHHIHIHIIIIIIIIJIJKKKAIJiKxL{LLMMMNN`ONOYTPFKPPOPPPPQPQPPQQQQQQQRRRRSQRRRSQRSSSSSSSSTSTTSTdeeTTTUTTUVUVUUUUUUVVVVVWVVVVWVVWWWWWWWWWWWXXXXWXXWYXXXYYYYYjjjZYYZYYYZYZZYZZZZZZZ[ZZ[Z[Z\\[[[[\\]]]\]666666777787878888888898888899999::9;:::;9OON;;;;;;;;<<<<<<<<<<<<=======>=>>>>>>>??????????@@@@@@@A@@AUTTAABBBBBBBBCBCBCCCCCCCDDDDDEEDDEEEEEEFFEFFFFFFFGFGGGGGGGHH[[ZHIIHHIIIHIIIJJIJJIJJJJKKJCIKiLyL{MMMMMMN`OfOFJPKMPPPQPPPPPPQQQQQQQQQRRRRRSRRSRSSSSSSSTSSTSTTTTTTTefeUUTTTUUUUUVUVVVVVVVVVVVWWVVWVWWWWWWWWXWWWXXXXXYYXYXYYXYYYjjjZYYYYYYZZZZZZZZZZZZ[ZZ[[\Z\\[[\\]]\]]\]677J7777778778888888889898999999:::::;:;9;;OON;;;<;<<<<<<<=<<=<==<====>>>>?>?>>??>????@????@@@A@@BABB@ATTTBBBBBBCBCCBCCCCCCCDCCEDDEEDEEEEEEEEEFFFFFFGFFGHGGGHHHHHHH[[[HHIHHIIHIIIIKJJJJJKJKKKKKCJMiMxMzMMMNNNNy`idPFLOOOPPPPPPPPQQPPQQQQQQQQRRRRRSRSRQSRSSSSSSSTTSTTTSTTTTTffeUUUUUUVUUVVVVVVVVVVVVVVWWWWWWWWWWWWWWWXXXWYYXXXYXYYYYYYYYjjjYZZZZZZZZZZZZZ[[[Z[ZZZ\[\\\\\\]]\]\\]]]777 777778888888988999899999:9::;;:9;::;;;;OOO<;<<;<<<<==<<=<=======>>>>>>?=?>???????@@?@@@@@@AA@AABBABUUUBBBBBCCCCCCCCCDDDDEDEEDDEEEEEEEEEFEFFFFGFFHGGGHGHHHHHHHHH[[[IIIIIIIIIJJIJIKJJKKKKKLKLDJLiLyMzMMMNNObOGKa^`PPPPPPPPPPPQPQQQQQQQQQRQQRRRRQRRRSSSSSSSTSTSSSTSTTTTTTTTUfffUUUUUUVUUVVVVVVWWVWWVWWWWWWWWWXXXWXXWWWXYXYYYXXYYYYYYYYYYjjjZZZZYZZZZ[ZZ[Z[Z[ZZZ[[[\\][\]\]]]]]]]]]Z887o8878888899888999999999::;:;;;;;;<;;;OOO<;<<<<<<<===<=====>==>>>>>???????????@@@@@@@@AAAAAAABBBABUUUBCBBBCCCCCDCCDEDDDDDDEEDFEEEEFFFFFFFGGFGGGHGHHHGHHHHIHIHH[[[IIIIIIJJJJKJKJJKKKKKKLLLLEKMiMyMzMNNNpNWRODKPONbaaPPPQPPPPPQPQQQQQQQQSQQRRRSRSRSSSRSSSSTSSTTSTTTTTTTTUTUTUTfffUUUVVUVVVVWVVVVWWWWWVWWWWWWWXWWXWXXYXXXXXYYYYYYYYYYYYYZZZjjjZZZZZZZZZ[ZZ[ZZ[[[[[\\\\\\\]]]]]]^]]^]]888888888889999999:99:;::;9:;;;;;;<<;<;OPO<<<<<<<<=========>>>>>??>>??????@@@?@@@@@@A@@AAAAAABBBBCCUUUBBBCCCCCDDEDDECEEEEEEEEFEEEFEFFFFFFFGGGGGHHHHHHHHHHIHIIII[[[IIIJJJKJKJKKKKKKLKKLLLLLMEJMjMyM{MN{N^OFKOJNOOPPPPbbbPPPPPQQPQPQQQQQQRQRSQRRRRSSSRSSSSTSSSSTSTTTTTTTTTTTUUUVUUfffVVVVVVVVWVWVWWWWWWWWWWWWWXXWXXXXXYWXYYYYYYYYYYYYYYYZYZZYZjjjZZZZZ[[[Z[\[[\[\\\[[[\]\]\]]\]]^]]]]s888W988999999:99;:::::;;:;;;<<;;<;;<;PPP<<<=<<<<====>>=?>?>?>>???????@@?@@@@A@@AA@ABABAABBBBBBBBCVVVCCCCCCCDDDEEDDDEEEEEEEEFFFFFFFGFFGGGGGFGFGHHHHHHHHHIIIIII\[[JIJKJKKJJKKKLKKLKLLMLMMMMEKMkN{N|NjNXQNFLPNNOOOPPPPPPbbaQPQQPQQQQQQQRQQRRQRRRSRRSRSSSSSSSTSTTTTTTTTTTTTTTUVUVUUUUggfVVVVVVVVVWVWWWWWWWWWWWXWWXXXXXYXXYYXYYYYYYZYYYYYYYZZYZZYZkkkZZZZZ[Z[Z[[[[\[[\\\]]\]]]]]]]]]]]]]]99899999:9:;:;:;;:;;:<;;;<<;<<<<>=>?>>>>?>????@??@@@@@@@@@@A@BBAABABBABBBCBBCCBVVVCDCDDCDDDCDDEEEEFEFEEEFFFFFFGFFGGGGHHGGHGHHHHHHHIIIIIIIII[[]JJKJKJKKKLKKLLLLLLMMMMMMMEKMlMsNZOFLOKMOOOONPPOPPPOQPPbbcPQQQQQQQQSRRSRRSRRRSRSRSSTSSSTTSSSTTSTTTTTTTTUUUUUVUVUVVUgggVVVWVVVWWWWVWWWWWWXXWXXXXWXXXXXXXYYYYYYZYYYYYZZZZZZZZZZZZkjk[ZZZ[\[\\[[\\[\\\]]]]]]]]]]]]]]]],999::9;:::::;;:;;;;;;;;;<<<<<<<<=PPP=========>?>>???>???????@?@@@@@@@@AABAABBBABBBBBBCBBBCCCCVWVDECEDDEDDEEDEFEFEFEFEFFFFGFHGGHHGHHHHGHIHHHHIIIHIIIIIIJJK\\]JIJKJKLKLLLLKLLLMMMMMMMMNKMN\N^QNDLONNOONOOOOPPPPPPQPPPPbabQQQQQQQRQRRRRRSSQRSSSSSSSSSTTSSSTSTTTTTUTTTUTUUVVTVVVVVVVgggVVVWVVWWWWWWWWWXWXYXXXXXYXWXYXXYYYYYYZZYZYYYYZZZZZZZZZZZZkkk[Z[[[[\[[\\\\\]]]]]]]]]]]]]]]^E:;9:;;:;:;;;;;<;;<<<<<<<<<<==>>>?>>??????@??@?@@@@@@A@AABBBBBBBBBCBBBCCBCCCCCCDWWWDDDEDDEEEEEFEFEFFFFFFGGFGGGGHGHHHHHHHHHIIHHIIIIIIIIJJIKKJ\]]JKKKKLLKLLKMMLLMLMNMMMMNMNNNHMNJMNOOOOOOOPPOOPPPPPPQPPQQQbcbQQQQQQRRRSRRRSSSSSSSSSSSTSTSTTSTTTTTTTUUUUUVUUVUVUVVVVVVVgggVVWWWWWWWWWWWWXXXXXXYXXYYYXYYXYYYYYZZYYZZZZZZZZZZZZZZZ[Z[kklZ\\Z]\[\\]\\]]]]]]]]]]]]^^^3;;;Y;;;<;;<<<<<<<<<==<====?>>>>??????@??@@?@@@@@@@ABBAABABBBBBBBBBCBCCCBCCCDDDDVWVEDEEEEEFEEEEEFEFFFFFFGHFHGGHHHHHHHHHHHIIIIIIIIIJIJJJKJKKJ]]]KLLLLLMLMMLLMMMMMNNMNMNNNNNNNNNNOOOOOOPPPPPPPPPPQPPQQPQQQccbQQQRRQRRRSRRRSSSSSTSSSSSSTTSTTTTTTUUVUTUUUVUUVVVVVVVVVVWWghhWWWWWVWWWWWXWWXXXXXXXYXXYYYYYYYYYYZYZYZZYZZZZZZZ[ZZ[[[Z[[kjl[\\[\\\\]]\]]]]]]]]]]]^^;;;<<>>>>?>????@?@@???@@@@@A@AAABABABBBBBBBBBBCCCCCCDCDDDDDEXWWEEEEEEEEFFEFFFFFFFFFGHFGHGHHHHHHHHHHIIIIIIIIIJJJJJJJJJKJK]]]LKLLMLLMLMMMMMMMMMNNNNNNNNNNOOOPOOOPOPPPPPPQPQPPQPQQQQQQQcbcQRRRRSSRSSSSSSSSSSTTSTSTTTTTTTTTTTTUVUUVUVVVUVVVVVVWVVVWWhhhWWWWWWWWXXWXWWXXXYYYYYXYYYYYYYYYYYYYZZYZYZZZZZZZ[ZZ\Z\[Z[lll\\[\\\]]]]]]]]]]]]=<<< ===K=========QQQ>>??????????@@??@@@@@AA@AAABBBBBBCBBBCBCCCCCCCCCCDCDECEEEXXXFEEFEEFFFFFFFFFGGFHHGHGGHHHHHHHIIIIIIHIIJIJJJJIIKKKKKKLLK^^^LMMKMLMMMMMMMMMMMNNMNNNNONNOOOOOPPOOPPOPPPPQQQPQQQQQQQRRRdbcRRRQRSSRSSSSTSTSTTSTTTTTTTTTTTUTUVTUUUUUVVVVVVVVVVVWVWWWWhhhWWWWWWWWXXWWXXYXXXXYYYYYYYYYYYZYZYZZZZZZZZZZZZZZZ[[\[[\[Zlll\[\\\]\\]o]]],?(@ % ###+++ ""!"""""""""##"######&&&-.-###$%$%%%%%%%%%&&&&&&&&&***111&'&((()()))))))*********...545+++,,,------.../////0///333:::000222222333444545555555888?>>656777888@ Y $$$+++ !""""""""""##########'''...###%%%%%%%%%&&&&&&''&''&***111''')(())))))*******+++*+...555+++--,---..-//////000000433:::100222333444544555555555888??@666888888999 L ! !!! $$$+++! !"""""""#"#######$####'''...$#$%%%%%%&&&&&&''&''''''**+222'('))))))********+++++++.//556+,+---...//////000000101444;;;111333444544555555555555:99@@@767888999999:::  ! !!!!!!!$$$,++!!!"""#""########$$$$$$$'''.//$$$%%%&&&&&&''''''''''''+++222((()))******++++++++++,+///666,,,...//.///000000111111444<;;222444545555555555565666:::AA@777999:99:;:;;;;<<= ! !!!!!!!!!!!!$%%,+,!!!""#######$##$$$$$$$$$(((///$$$&&&&&&&''''''''((((((+++223((()********++++++,,,,,,///676---/////0000000111111211555<<<333445555555555666776777:::AAA878999;;:;;;<<<<<<  $$$+++ """""""""############'''...$$$%%%%&%&&&&&&'&'''''''+++222%'&%(&$)%#)%$*%%*&&+')+)./.666--,././/////0/0000101111445<<<222444444444445666666676:::AAA7779:9:::;:;;;;;;;+++++*++++++++++,,...444,,,------.........//////111767///000010111111221/10)1.(3.2:5433C5>N6GU7MV6PQ7LH7F;6:3933?4-7-494999:::::::;:;;;<<>>>>>>?>???@@@AA@AAADCCIIIBBBDDCDDDDDEEEEEEE$$$$$$$$$%%%%%%%%%(((///%%%''''''''''''(((((((((++,222(((*******+*")()&5-0`4G=gF??><;8657>>EEE===>>>??????@@@@A@!!!!!!!!!"""""""""&%%---"""$$#$$$$$$$%%%%%%%%%%%)))000%&&&&&$%"&&V19@]HJKMA?<:86545;011o1p424(3'231444777>>>444555766777788888888999<<?>!!!"""""""""#"##""&&&---"##$$$$$$%%%%%%%%&&&&&&&*))100$% %&a68L[VwTOKKMA@=:86645;11223{4656,5*888>>>444777778888888999999:::>>>DDD;;;<<<===>>>>?????"!""""""""#"######&&&.-.###%$$%%%%%%%%%&&&&&&&&&))*$-/D/,OJ^d\mVsS|PLLNB@>;97646<1123456`5j/8-<>;6667778888889999999::::;>>>EED;;;===>=>??????@@@"""""""""#########'''...###%%%%%%&%%&&&&'&''&"%& ')J=bLfY_^\fXoUyQNMOCA><:8646<12344577:A?B16/888888899999:::;;;;;;???EEE<<<=>>?????@@@@AA@#""""########$#$$#'''...$$$%%%%&%&&&&&&''' %'(''U8tNhKdRaZ^bZkWuSONPDB?=;8646<13445678>DE8M28.99999::::;;;;<<<<?????@@@AA@ABA#""######$##$$$$$$'''...$$$%%&&&&&&&''&$'/*(^1w?tIiFfNcV`_\hXqU|PPRECA=;8746<2455678:?G?L:Y39.;::;;;;<<<<<<<=>??@?@@@@@BAABBB#########$$$$$$$$$(('///$$$&&&&&&'&'!$'/*'f-z3u:vFkBiJeRbZ^dZmWxRQSGDA><9756=355568:<@IBDM<^6:1<;<<<<<<<===@A@GGG>>?@@@AA@BBBBBBBCC""""""######$#####'''...$#$%%%&&&"$&&&&e'+w.w6xAn=kEgMdU`^\hXsS~RSGEA?;8646<244468:>>@@?@A@AAABBBBCB.-.......././/////111766///000001%+1a1135@D=>>@BDFGLRNQTREEEDEBFFFGGGJIJOOOHHHJJIJJJKKKLKLLLL'''''''''(((((((((,++222(((***$*qJ*++,,3=w9s@pGlOhXdaao^}VNst:VP6E=5:545554<5;L6Jk7i:@789;=?ACIQJNPSiK=?6AAAABBDEDKKJCCCEEEEEEFFFGGGGHG$$$$$$%%%%%%%%%%%%)))000&&&!$'8/'(()))-7x2u9q?mGiPh][`BL?47-73$-)*0--1./10020030.3/*4++7+@>@q4t579<>ACIQJMOQUOEq<>5@??CCCJJJAAABBCCCCDDDEEDEEE$%$%%%%%%&%&&&&&&&)))000&&&"(h()))**-5|.y5u;rCpLRG;22!,+.2199900/111222222333444545555888<><*5)4748;>@CFKSMPRT|XlT@@A@@>DDDJKKABBCCCDDDEEEEEEFFF%%%%%%%%%&&&&&&&&&***111"&M<(())***.5+|0{7v>I7$+-*..00/333:::000122222433444544555555888>?>666585-8*Z9f?CFHNVOR}UxWsYq\RK>@6EEEKKKBBBDDDEEEFFEFFFGGG%%%&&%&&&&&&'&'&'&***111!'r)))**++.5+-~2vH2 *..//000000443;::001222333444455555555555888@??66688888808,M;ZEIKPYR{UvXpZl[i^`ZBBDEECKKKCCCEEEFEEFFFGFGHGG%&%&&&&&&'''''''''+++,.1?6')))**++/5,-S. ).///000000000444;::111333444545555555555555999@@@777888999:9:39-R>hLNS[xUsXnZi\e]b``bKL}DDMMMEEEFFFGGGHHHHHHIII&&&'''''''''((((((*++-/2Ɏ(***++,,/6-J>>>>>>?>@@?@@@AAAAAACCCIIIBBBDDDDDDEEEEEEFEFFFDGHIcbhm]h[jXlVlUmSoSoQrQcUSKOOOQPPQPQQQQSRRSSS***++++++++,,,,,,,"&/6,...//015Δ;-/1223444444445555665667:::@@@777888888999:::;;:;;;;;;>>>EEE=<=>>???????@@@A@@AAA@?6OU\mPfOhLiKiJkIkIlHnLfRQLJJIKKKKLLLLLMMMNNO'('(((((()))))))))!$,4*+,,,--.2w9#'/010111111222333443444877>>>444555666777787888888999===DDD;::<<<<=<====>=>??????=6FLsRnGfFhEhDiEjEjEjFlJiPQTGGFIIIJJIKKKKLLMLM(((((())))))***))*&(-ͩ4*,,--.//3ub9&)0111222222333444444554888>>>5457777778888889899:9:::=>>DDD;;;<<<===>>=??????@@@@??666777887888999999:::;:;>>>EEE;;;===>>>??????@@@@A@AA?EFKKjBhDhEhEiFiGjHjHjKkQVgIHDKKKKLLLMMMMMNNN))))))******+*+))+--.޿5+--.//003[S:*,1222334444444555555555888???666888888989999:;:;;;;;;>??EEE<<<>>>??????@@@AA@ABBBB@EEELhCgEgEgFgGhHiHiHiKkRWkJIELLLLLMMMMNNNNNN)))*********+++**+--/5,-../0004\V;*,1333444445555555555555999@@@777888999999;:;;;;;<<<<=>???@@@@@AAAABBBBCCCBAGHNMgDdFdGeHfHfIfIfIhMiSWeKKHMMMNNNNNNONOPPP****+*+++,++,,,++,((/ʹ7-/0001115~v<()3454555555555666777777;::AAA888:99:::;;;<;<<<<=<<===A@@GGG>>>@@@AA@AABBBBCCCCCDDC@GK[MhEaFcGdHeIeIeJfKgNhTW^LLJNNNNNNOOOPOPPPP**)******+++++++++#$/6-.//00115<'(2444444444554665666666:::A@A777999:::;;;;;;;;;<<<===@@AGGG>>>@@?AA@AAABBABBBCCCDC=GOoMgD_FaGbHbHbIcJdKeNdTTULKKMMMNNNNOOOOOPPP444455555555666666-/:?899::;;>>>>>?@??@@@@@AAAADCDIIIBBBCDDDDDEEEEEEFFFFFGFGGIJJOOOHHHJJJJJJKKKKKKLLLMMMMLGP]UlOePgQgQhRhSjTkTmWg[[WUUUVVVWWWXXXXXYYYY...////////0000000+,4mj;13344556:@ih7..8888999::::;:;;;;;;>>?EEE===>>>??????@@@@@@AABABBDEDKJKCCCDDEEEEEFFGFGHGGHGFHINK]QfJ^K`L`LbMcNdOeOgR]XVQQPPRRRRRSSSSSSSTTT++,,,,-,,---........2FF9/01123447>4+*5666777778888988989<<=DDD:::<<<<<<===>>>?>>??????CCCJIIAAABBCCCCCDDEEEEEEFE@FMiJ[PaHZI[J\K^L_LaMbMbPUjVVQONNPPPPPPQQQQQQRRR,,,------...//////222009012234458>5cf6-,7888888999999:::>>>DDD;;;<<====>>>?>????@@@@@@DDDKKKBBBCCCDDDEEEEFFFFDFGKGSKYQ_HWJZK\L]L_M_NaN^QRUWWUOOOPQQQQQRQRRRSSSS------...////////0333./:ww022344558>67<<843899999:::;;;;>>>EEE;;;===>>>?>??>?@@@A@AAAAEEEKKKBBBDDDEEEEEEFFFGGDGMdHSKVQ]IVKYLZM\M]M^N`OXRQMXXXPPPQQQRRRSSSSSSTTS---.../////000000033477:::123445558?6882/976::::;;;;;;???EEE<<<>>>????A@@A@@8>BBABBBEEEKKKCCCEEEEEEFFFGFFHJSHPlIPqKTyR\JULWMYMZN[N]O^OR`SROXXXPPPRRQSSRSSSSTSTTT...////0/000000000444;;;%%134455559@788952;96;<<;;<?>?@E@AaAtSB7=B?@EFFLLMDDDEFFFFFFGGHHHHLZINbIOgLSpS[zKTxMW~MXNYNZO\OYPONSSSXYYQPQSRRSSSTTTTTTTTU/////0000000111111444;;;.-2CE4455556:@799:};>@;82<<<<@@?GFG=>>???@>@AA@BlBCsCGFG<@MMMDEEFFFFFFHHHHHHIJLILYIN_MShSZrKSpMUvNWzNXOYO[PS`PPMSSSYYZRQQSSSSSSTTTTTTVUU///000010111111111555<<<333)(4555677:A89:;<}?>@@@A?@BCABiCCDܛHtdMCFEBBFGFHGGHHHIIIIIHJKMKMXNRaTYkLRiNTnNUsOWxPYPWqPPOQQQTTTZZZRRRSSTTTTTTTUUUVVU//////000000111111555<<<22222444444666:@7:::;4>?5?@7@A<@BhBCDGMEKIG=@GGGHHHHHHIIIJJIJKMNPZTXeLPaMRgNTlOVqOWsPQUPPOQQQTTSYZZQRRSSSSSSTUUUUUUUU999::::::;;;;;<<<>>65>\c?@@AADIBDDEE}FrFiG_JVNHHJLKsNKmPKqLMMPUOݻPxpQFHQNNRSRSSSTTTTTTWXY[^fUXdVZjX\nX]tX[dYXWYYYZZY\\\aaa[[[\\[]]\]]]^^^^^^443444455555666766:::@@@7778889980,:r::;;>E=>>?|@q@gA\BUERKCDEMEXFdGrGHHKQJKLMQPMDENNNOOOOOPRRQXXZQRZRU`RVeRV`SSRTTTUTUUUUXXX]]]UUVWWWXXXXXXYYYYYY111112222233343444777>>>4445657666670-8~889_?U?OCMIACBLCWDcEqE~EFIPGIJKLvqLABMIJMNMPPPWVVOOQPRZPSZQQQQRPRRRSSSSSSVVV[\[STTVUVVVVVVVWWWWWW222222333444444545888>>>555777777888668419}9:>D;==v>m?d?[@RAMDLJAECODXEdFqF~GGKQHJKKLMNRQNEEQQQWXWPOOQQSQQRRRQRSSSSSTTTTSTVWW\\]UUUVVVWVWWWWWWWXXX222333444454555555888>?>56677788888899987962:o;>E;=y>q?h?_@V@OAKELKBHDQE[EeFqG~HHKQIKKMMMNNxvRHIXWWPPPQQQQRQRSSSSSTTSTTTTTTWWW]]]UUUVWWWWWWWWXXXXYY333444445555555555888???666888888999999::::9;61;^?E<|>s?k@c@[@SBLBIEKMCJESF\FgFqH~HHKRJLMMNNOORXWWPOORRRSRSSSSTTTTTTTTTUUUXXX^^^VVVWWWWWWXXXYYXYYY444554555555555555999@@@777888999:99:;:;;;;<<;;;92?RgEo=y?o?g@_AXAQBKBHFLODLEUF]GgGrH}HIMSKMMNNNOPSYWWQPPRRSSSSSSSTTTTTTUUUUUUXXX^^^VVVWWWXXXXYYYYYYYY455555555555656667:::AA@777999::9;::;;;<;<<<<<<<@?@C>F==>U?g@eA\AUBOCICGFMPDNFVG_HhHrI}IJMTLMNNOPPP[ZSIJZYYRRQSSSSSSTTTTTTUUUVVVVVVYYY^^^VVVXXXXYYYYYYYYZYZ555555555656777777:::AAA788999:::;;;<;;<<<<=<<=<>=4@DP@QBVBSCMCHCGHMREPFXH`HiIrI|JKNTLNNOPPzPHIQLMTTTZZZRRRTTSTTTTTTUUUUVVVVVVVVYYY_^_WWWYYXYYYYYYZZZZZZ444444445666666666:::A@A777:9:::::;;;;;<;;<<<<<=@@@GGG>>>?@?@>>?>>??@@@@AAAAAACCDIIICBBDCCDDDEEEEEEFFFFFFGGGJJIONOHHHJJJJKJKKKKHKLCLLEMMYNP|PUXOWP^PdQlRySTTW[UVWyXOQXTUYYYYYYZZZ\\\aaa[[[\\\]]\]]]^]]^^^_^^^^_aaaeef__``a`aaaaaabaaccb988999::::::;;;;;;??>EEE===>>>????@??@@@@@ABABBBEDDKKKCCCEEEEEEFFFGGFGGGHHHHEHKDKRGQJ?IKDKKFKLLLMpNOORXPR[WRHLSRSSTTTTTTTUUUUXXX]]]VVVWWWXXXXXXYXYYYYZZYZZZ]]]bbbZ[[\\\\\\]\]]]]^__666777777888888999==>?????@?CBCIIIAAABBCCCCDDDEEDEEEFFEFFFJJJPPPHGGIIIJGIJJJLnL~MMPVnNFJPKNPPQQQQQRQRRRSSSSSSVVV[\\TTTUVUVVVVVVWVWWWWWXWXXX[[[```YYYZZZZZZ[[[\\\\]\777e788888999999:::>=>DDD;;;<=<===>>>>?????@@@A@@DDDJJJABBCCCDDDEEEEEFFFFGGGGHGKKKQQQHHHJJJKIKKMLMoMNNuQ\UXMSOOOQQQQQQQRQRRRSSSSTSTTTVVW\]\UUUVVVWWWWWWWXWXXXXYYYYY\[[aaaYYY[ZZ[Z[\\\]]]]]]888888999999:::;;;>>>EED;;;===>>>>?????@@@A@@AAAEEEKKKBBBDEDEEEEEFFFFFFGGGHHHHKKKQQQIIIKKKLJKMNLMrMyN_OEKRMPXXXPPPQQQQRQRSRSSSTSTTTTTTTWWW]]]UUUWWVWWWWWWXXXYYYYYYYYY\\\aaaYZZ[\[\\\]\\]]]]]]#989(999:::;;;;;;??>EEE<<<>>>??????@@@@A@BBABBBEEEKLKCCBEEEFFEFFFGGGHHHHHHHHHKLLQRSJJJLKLLKLMRONaN^RODKOOOSSSXXXPPPRRRSRRSSSSSTTTTTTTTUUXXX^^^VVVWWWWWXXXXXXXYYYYYYYYY\\\bbbZZ[\\\]\]]]]]]]W:::';;;;;<<<>>???@@@A@@ABBBBBBBCCCCGFFMMMDEEFFFFGFHGGHHHIIIIIIJJJMMMTTTKLKMMMNMMNNNOOOPPPPPPPPPSSSYYZQQRSSSTTTTTTTTTUTUVVVVVVYYY^^^VVVXWXXXYYYYYYYZZZZZZ[ZZ^]^ccc\\\]]]]]](0` B !!!)))!!!"""""""""###""")))((($$$%%%&%%&&&&&&'''///(((((())))))******000000+,,---.-.///000111888111222333444555444::::::777888[ ` ! !!!)))!!!""""""#########***)))$$$%%%&&&&&&'''(((000((())))))***++****111000,,,...////0/000111999222333444555555444;;;;;;777889:99 7 ! !!!!"""***""""""######$$####***)))%%%&&&&&&''''''(((000))()))***+++++++++212111---///000000111222:::333444555555555655<<<<<<888:99;;:;;>>???@@@@@@'''''''''(''(((/00)))))))*****+*+***000///,,,,,,$+*#,)=16j8OCr>><:86;y9wJ5J.6.,7+575888:::@@A::::::;<;<<<======CCCCCC@@@AAABBBBCB !!!!!!!!!"""+*+"""###$#$$$$$$$$$$+++***#$"%&\3:B`IIMA>:85375/0p1s323*3(443<<<444565666777888888>>?>>?;;;<<<===>>>"""""""""####$$,,,$$$$$$%%%%%%&&&&%%)+,()W42NUXrUOKMB?;864861234l5u/5.8=7666777888999999:::@@@@@@<<<>=>????@?""""""######$$$,,,$$$%%%%%%&&&''&$%.--N@cV`cZlUxQLNC?<:7486134577I>M07-888899999:;:;;;AAA@@@===????@@@@@#""######$$$%$$-,-%%%&%%&&&''&#':-(b>qMePa[\fWsSNPEA=;748624567;CQ9_18,:9:;:;;;;;;;ABAAAA>>>@@@@@@ABB######$#$$$$%%%---%%%&&&'&&#'C1(j1y@pFhJdV_aZnU|PRFC?;849745579=FAVHDGO>c7;2=<====CDDCCC???AAABBBCCC,,,,,,------...545...-./,./q002=|BuGqPl[fhbw^]NGB@>7??>FFFFEEBBBCCCEEEEEF$%$%%%%%%&&&'''///#'J9(()))02x4t=rI\LU89$-,.63-0.0112223333431422:2-9,I6J8<@CGRMQT}XQG}=>5GGGFFFCBBDDDEEEFFF%%%%%%&&&&&&'''///"(t())**00~.}7Y9../%--011988111222343444555444::::::17008/z;CGKUQ~TwWs[eWAAAGGEFGGCCDEEEFFFGGG%%%&&&&&&'''((((,0L<())*+*10,a/&+.+./000111999221333444555555444;<<;;;77879719+n@LOX|TtXmZh]eaLLFF>HGHEEEFFFGFGHHH&&&&&&''''''(((#(0m(**+++11y-20.*-/000111222::9333444555555555565<<<<<<888999:;97;2rIT}\pYi[d^_`\dRZHHAIIHEEEGGGHHHHHI&&&&&&'&''''&'(210ܚ()**++22dH-#)/00/000101212:::333444444545666666<=<<<<888:::;;;9;5C?QqVr`d\^_ZaVcSePdJM]IHDEFFGGGHHHIII++++,+,,,,,,&)-WL5../0006̈7,/3334554555666778???898999999:::;;;;;;AAAAAA>>>???@@@A@A>@4XSjh]cYfUhRiQjOmOYMLDKKKLLLMMMNNN----.-......$'/j70011229c8).5666777777888:::@@@::::::;;<<<<======CCCCCC@@@AAAABBBBBCC?>;;;<<<===>>>>?=@AENfFgDhDiDiEjEkLeKJDHHHJIIKKKLLL((())))*)***!+3+,--//5;95./1222333444555555=<=666777888889999:::@@@@@@<<<>>>????@@@@@BA;IdCjDiEiFiGjGkMhMLIJIIKLLLMMMNM)))*******+* "+3,-./0/6555001333444555555656>>>7778888899:9:;:;:;AAA@@@=<=???@?@@@@AABCA:JaDiEhFhGhHiHjNhNNMKKJLMMMMMNNN)))*****++++ ",4,./0006666112444555555555677???888889999;:;<<;;;;BBBBAA?>>@@?A@@BBABBBCB;K`EgFfGfHhIhHhOgOONLLKMNMNNNOOO****+++++,,, "-5-/00107?=7114555555555667888???888999;;;;;<<<<<<>>??????@@@GGGBABCCCCCCDDDEEEEEEKKKJJJHHHIIIJJJKKKLKGMShSiNeOfPfQhRiSkXcWVPUUUWVVWWWXXX,,,--,---...**0RQ8012234:9335556888888999:::BBB;;;<<<===>>>??????EEFFEEBBBCDCDDEFEEFEAHSObI\J]K_LaMbMcSYqSQMPPPQQQRQRRRR,,,---.../////0458112344:9y|6+*7898988999;;;CCC<<<===>=>?>??@?@??GFGFFFBBBDDDEEEFECFISHVO^IYJ[L]M_MaM_STZSSQPPPQQQRRRSSS---...///00/010,,8123454::7GI8308:::;;;<<>?>?@8>A?@AAAGGGGGGDCCEEEFFEGGGHOkITP[JWKYM[N]N_NYUSPTTTPQPRRRSSSTTT...///0/0000111449GG134554;;78<=:62;<<;<<=DDD===?>>?FA@qMB=?B??@=?@FABqBwBQKI=BIHHEEEGFGHHGIJNIM[KPdRXqLTsNVzNXOZPX{PPNVUUUUURRRSTSTTTUUU/.///0000101221:::..3DF44466<<8:;?@AsA[COJDbDEKEFLFGpHHMNKXULACMLLNNNOONPQTWYcQUdRWjSYsTXgTTRUUUZZZZZZWWWXXXYYYYYZ666677777889:::@@@::::9:42;<==CC@ABvBhD\ETKFHGRH_IuJJPPMNOFHPKKQRQRRQXY[SU^TXfTXeVVUWVVWVW\[\[[[YXYZZZ[ZZ[[[101111232333444<<;44466543799788?>;\?P@MGAEBQCaEsEELKHJKLZYMBCNMMUUTOPRPRYPQRQQPRRRRRRXXXWXWUTUUUUVVVWWV222333454555555<==666777888529=@9:@@<{>o?c?W@MBLIBHDTEcFsGGMLJKMMNOGHWTTPPPQQQRRRSSSTTTSSSYYYYYYVVVWWWWWWXXX334444555555556>>>777888888::975:;<;tA@=s?h@]@RBJBJKDLEWFdGsHHNNKLNNOPW__QNORRRSSSTTTTTTTTTZZZZZZVVVWWXXXXYYY444555555555777???888999:99:;;;<;98;=8BZAr>o@c@YAPBHCKMEOFYGfHtIHOOLMNNPQX\\RPPSSSSTTTTTUUUUUU[[[ZZZWWWXXXYYYYYZ555555555666888?@?888999;;:;<;<<<<<;??7AEVBJCJDFELRFTG^IjItJJQQMOPPOOQIJRRRYYYSSSTTTUTTUVUVVVVVV[[[[[[XXXYYYZZZZZZ===>=>??????@A@GGGBAACBCCCCDDDEEEEEEKKKJJJHHHIJIJEJJ@KLILMdMSUOUO\PdQxRSXWU֟WujWLOXUVXXXZZY___ZZZ[[[\\\]\]]]]]]]bbbabb___``````bba777878888999:::BBB<;<=<<===>>>??????FEFEEEBBBDCCEDDEEEFEFGBHOFOI=HJ=HKEJLqMMRRyPNOQILQRRRRRSSSTTTZ[ZUUUVVVWWWWWWXXXXXX]]]]]]YZYZ[[\[\]]]777888898999;;;CBC<<<=====>???@??@@?FFGFFFBBCDDDEEEFEFGGGHHHPOPIIIJHJKOLMrMM}Sr`SHNPNOQQQRRRSSSSTSTTT[[[UVUWVVWWWWXWXXXXXX^^^]]]ZZY[[[\\\]]]888"899999;;:<<>>???@?@@@@AA@GGGGGGCDDEEEFFFGFGHHHIIIPPPJJJKIKMSNMqNgNLMULQTTTQPPRRRSSSTSTTTTUUU\\\VVVWWWWWWXXXYYYYYY^^^]]][[[\\\]]]]]]?:99<;:;;;<<=>>???@@@AABBBBBBBIHIIIIEEEFFFHHHIIHIIIJKJRRRLMLMMMNMNOINPPPPPPUUUUUUSRSTTSTTTUTTVVVWWW]]]WWWXXXYYYYYYZZZZZZ`____`]\]]]]:( @ ^ &&&""""""######)))%%%%%%&&&&&&,,,))))))******000------///0/0666222333554555;;:888888t \ !! '''#"#"""####$#***&&&&&&&'&'''---**)*****++++111...///000000776444455555555<<<999999;;;r!!!""""""((($$$$$$$$$%%%+++'''''''((#(&$-)*#*"+! ,!(3)+0*010211222989666666666787>>>;;;<<<===&&&''''''-,-))))))******000,,,"*)$+*C18q>>;;;;;:<<<===BBB@@@AAABBB!!!""""""((($$$$$$%%%&%%%** %&`59EaJLB<74721o3s1404:2667777888999???<=<===>>>""""""###)))%%%%%%&&&"%A2/QG^fXzOMC=9582356R;Z07,888999;;;AAA>>>???@@@#""###$##***&&&&&&"&U7*kBkPa\YnROE>:584468A_;t29-;;;<<mFfU^gV|TIB<69668=>DDDAAABBBCCC)))******000'*,<3,}-/:vAnOhb`yUD|=v;:>:;?DMNQME_@BCMNSmP>?;FFECCCDDDEEE%%%&&&&&&$(,VB))**0.l6C51!,,3552223335545559;9-8+>8@@IRSwWp\NK~EF=EDEFEEGGG&&&&'&'''"&-x)**+1.F8.%,/100777444455555555<<<999592?;CLYrYg\bbUZHHCFFEGGGHHH'''(((%&(95/++,,3[0!)0221222999666666666788>>>;;;<<<8;0MEvq_b_ZbUePfLObHGCIIIJJJ--,---%(.aS400128@;6246767888>>>;;;:;:<<<===CCB@@@AAAAB@CCB[bWiPjNlLoP[MKDNNNOPO((())) )zg/,,-.5'*1111333444:::666777888999???<<<===>?>?=4IZFkDiEjFmL^IG?KKKLLL)))*** *v0--/06&)2333555555;;;8888889:9;;;AAA>>>???@@@A?6GWDkEhGiHkN`LIALMMNNN******!+z1./006')4555555555<<<999999;;;<<>>;;:;<<======DDDAAABBBCCCDC=KZHdIdJeKhQ^OMFOOOQQQ010111*+2`]85678>KJ;66;<<<===BBC@@@AAABBBCCCIIIGFFGGGIHGJJLOaMcNdOfQiV]xTRNTTUUUU,,,---++.;;51124:6)(7888999???<<<=<=>=>???FFFCCCDDDEDAFK`L]J[K]L`M`SU]PPNQQQRRR---////00)*62345:8U]81,9;;;AAA>=>>@?@=?A:>GHGEEEFEEGGJHPoNXKXM[N^OYUTQRRRSRRTTT///000100007SU4555<99N_;7-;<=T=ESDA6@B>@CyDJHDEHACJJIKLPQUcOTjOWuQVnQQPWWWUTUUUUVVV666777888>>>77;?@;<=B@A}BiCUHFIGUIyJOMвNjfOCEQONVWYTWbTXhUVXWVU[[[YYYZZZ[[[111333444:::6661/7IR89?<~=k>X?LECID^ExFLJKLMJJSMMQRTQRSRRQSSSXYXVVVVVVWWW333545555:;;888898309HT;A>s?a@QAJGDNFaGwHNKLNOTlkRMMSRRTTSTTTZZZWWWWWWXYX555555555<<<9999:9;;;84>::;<;<====>=B@D>6AGaBNCJDJMHWIgJxKQOOQ|QIIWSSTUUUUUVVVWWW\\\YYYZZZ[[Z;;;<<<===CCB@@@AAABBBCCCIIIFGGFAGH>HIOIOrPMRNZOyQVTUa\UKNVVV[[\YYYZZZ[[[[[[```^^^^^^___777888999?@?<<<===?>>???FFFCCCDDDEEEFDFLFLJ=HKGJMwMSkQHLQLNRSRSSSXXXVVVVVVWWWXXX]]]ZZZ[[[]]]888H9:9;;;AAA>>>???@@@AAAGHGEEEEFEGGGHHHNNNLIKMWONeO_SUJPRQQRSSTTTTTTZZZWWWWXXYYXYYY^^^\\\]]]]^]\;;;H<<86546<<9>693<;<@@@>>?@@@$$$%%%**)%&(&''`-zBiO_eWOC:876:CD?>><=9??Bg[`cVfQhLPdJIEKKK**+"%+aS0//16&+3544888:::888:::>>>@@@????>4LWMkIkInMYLJBNNN())!)pc.--/w4%(2434666999777999===???>>>@>6ERDkEiGlMZKIAMMM*** "*pg/./16')4555777;;;999;;;???@@@@@@B@9GR|FgGfIiO[MKENOO./.'(/a^5446;,-8999<<<@@@>>>@@@DDDFEEEEEGE@LYKeLeOhS[yRPLSSS---++.A@4335:LK7229<<=>?C?@LCE;@FEEFEDHK[MVLXM\OZTSQRRRTST0/0000/.6VY556<9};BQ>A3A@B@BvFmH?CGBCIKQOSeNUrOXPS^UUSSSSUUU555666;;;0.::UAGGC[F|JKKMRSSRQSRRRTTTXXXWVWXXX444555:::99976986;fAu>a@MCGLE^G{LMMNSSLLTSSUUUZZZWWWYYY666777<<<;;;<=<=<>?8CHcAQCJEIQHcJ|NPPQ~vVSTUUUVUVWWW[[[YZZ[[[:::;;;@@@@?@@@@BBBGGGD?FF=GJUJNrOLUO}STSYWUKMYYYYYXYYY[[Z___]]]^^^888999>??===>>>@@@FFFDDDFEFIEHLBKKOLMoQbRHMRNPSSSWXXWWWWWWYYY]]][[[]]]99:;;;@@@?@?A@@BBCHHHFFFHHHJJJNNNMQNNSOSIPTTTSSSUUTYYYXXXYYYZZZ^^_]]]^^^AAAAAAAAAAAAAAAAAAAAAAAA(  ~#########'''$%%#(&)" *"(/(-.-333444555999999###''''&'('("()#((H1>>>>>"""&&&&&&#&W72K\LA753_8h18.:::??????$$$(((#'rD*pEcfUE976?h?8=3BBBBBB''&"&*S>*,7kOI^g9Vh7b9>>8<.URZhOjLPeKJF ")ZP-./ra4(+3888888:::???>=6CMqEkGlLUzMKD"#+[U/02vn6*,6:::;;;===BBBB@;GOmHgKiOWuPNI)*.ED3469-*9==>?>?A;?FEEFEAKU{LaOcSVaSRP.-.**2459e|98.=?>@AgOF=@FCFKSpMYOYSSQSSS333117TY8:>>TBCIGKKPPPJPRWjTU[XWVXXX3338881.8]t:?r>QCDVHLLQ|xRMNTTSXXXXXX666:::;;;83=KaBVAJGH]KOO޽TyvUPQWWWZZZZZZ999>>>???AAAD?FD>FKXJL{ROS{SRRWPQXYYZZZ]]]]]]999t>>>???ABAFFFFFFKEKMNNOnWSINSPQWWWXXXYZY]]]]]]}AAAAAAAAAAAAAAAADisplayCAL-3.1.0.0/DisplayCAL/theme/icons/DisplayCAL-curve-viewer.icns0000644000076500000000000040153512647526530025102 0ustar devwheel00000000000000icns]ic08! jP ftypjp2 jp2 Ojp2hihdrcolr"cdefjp2cOQ2R \@@HHPHHPHHPHHPHHP GS ]@@HHPHHPHHPHHPHHPS ]@@HHPHHPHHPHHPHHPS ]@@HHPHHPHHPHHPHHPy+36VF(%M;;`&떾/+7EyhoZ[ ϰr#SU\WX-v7Gpkӣgɔxn |G\ki _ny&åօ|4F%Vٲ%:_Ksap&[~Vvũi@bd23yP%Eyk%b:;ƃE`A-5Nz!Tϼ}1.Ė؍xJ' :TCfK9_]8rŔz|pS ɿO1ZlyK1$I8H!& v04-.pWQ܌_Rd}–Ԋ^dC+` ] Z2أhϼ>2`3(; uo:a&HZ2mt%#%!aMvD9}jPU(FŌz"pu?3za, W~Z+vtn11JPƍM:DZϼ}78 lm> #JQ_Q ae 7a\LgS 1( M6Imk7jt @#%.f| &liTZ]W'?OʚeHj'5sGߔ`@Py؄AV?DGEGIVԗayϭ D˦s1d?,]bŖf+ɚ*b7ONN ᥮:]7#y'!!fӁ՛tR03##5"Eb Z֖u`ubBz ]$fG@ Ngx+6t;3 3zuI<{30ѭ8V4~+:bR4zpEA{ʏNnw'Oad/-;q6ߕ0-<"-%?  v`vlMfuJU/ R`Ew1D:gmd(>J?=E#U` [9 捸::{lQ>d<>}2oerj/"ǩQ^Xh1j`N .!u*w9O$E"Y؀y$mW֎#Qñz &_=Haʋ|- ;fW]s)l"N[H+Wx<2D&ww_RZ4Y"^81ui|q>nfntv,d vPTPǟg]MoԷ3Y5*LMy]0?\Sg%F[Q#/!Χ=3[EwGBT&k<1?YY h)YdO!ޢm W IEM•2J4<Tqb- 7- YLV2Px;*&H ߛo(^Q$*Ɏ_7KH:bktJ>lSkFx l*Vpm2P)ہ5ϾŸ^J<*Z"Bhy:g [J&u#af,[渳h}V"STkmkLN$B-goj jTsD[GiFB挰~< v2)0`ΐ"ep'|ZҼxNS&BP-FH6G۫͹Eݺ g5}J$A*s<{Hq;P!M8UABA?7=Qrwzv3OFg Uw4W{m+2%BO.CQL7]gjGaqYsJ֏tMoQ3ð? K8P/?"SشuVea`3^lFԴų=KF+Q}DzDh”6s FnU?ϼn}s;49bh2nϗ#yi e6oLhMV9fv_G^C\:u(RʢK!jihD~#ޘ7.׬jRJxufHu1sLB#9'iMM)K/ Z B=i Zra؁M3x~+V +ɯ܊ǚWYԺ+$?T\'Ċf/wóۏq }y틍h y y`C'l('73d1[5v٠57` pa2Wij\B0Oi)b}9mu-wy1\vxv~B9lkWYbsطjzR 5MN2pފwT;aA?˖"A6bݏn+/U,6 gScҼ0zQ .E(E;xf_W/DcKoXn`~C~&>no pq 7s`_] l^n`KD5$(imBmhqoܬ&: wˁ&-5!5O&O!D@G@fS5i {Ea9޳vy8E؂Ap|^94H0{nN 9t2=ԦUKb_e nLJg8h 3z5lD͎e:@7^jeyN_8EK9CZݫR/,nB>E3';Gٽ$5qWgǥE8ǷF;xB{/inw,ߵhuvfutqil<$fFgS,V|Xa iTR1P{ֆHs+ۤNq@5JDW>WhNYȬQ1Ё#IT7cH~`9*VbSog 7"sôHߍ@5xع0kD6*Ke%er$Pz"j4Wcm`ߚڄdJ[28+5K{'?ET(dI,h>cr !,C XlXVr@a'a]Fߺyx{;P/L+Gd]+mCh&|9՜ }U_LI-T̊@%X<gca+;8fRE}yN^E;]K :tz# 0P /hgl۹ﲓC{޶7ړj= 0r̴R+W -eL~ OMbfm{>lyx@ V1&^T{qƸw#x)(c>!BzN !:8rNښqǓxXw:E/GڂÜ&) P]%S9TĈ e Vs!%]Ȧܵgo<0EFJ?*-A~@녕D[Qf <6k!ڔds9bv 39U!-(+9(}D :D@%^t~ǁ(C7N[BpA3 R+bޣ;?Y cJrv=dҡ!hR!l횜TGDoc ^݀ONR 10`~'T"fy&D@J$mѥÝ&ה.P; pV4#0\kNѩ4a]vW~;ld#'goi#*+8Ф_l UhPT!:g2XBI(z3fXî|J=s%7p;x`V0ͪ=zDl?twL>zs!'X`  B5jBzZ]؊q$^R- =Ys (:1䑠B)}«cfj¨9`ȮYa'l[iRTOt%jmLcDZE, Jk֣81C>\*_ʱ8Vu(\q"Yuk%9 º|k0Bš[d(p$7~B2'Y~@)S3K߮E +EG:`L/$,Z.sk>3! 9A&ݜOzN 3^9Lq\AxG뽝*TR@eHDtu1vjD9d;3[+0/y'Bv_`Nf͔ r k5HpO)A#Ͱٮ|c_җ*j3̞*҅˕"*NC8I$ -vTƐZ *R ɺByvj W)Ǝ[ϼ}6 PA.!2?Cm]׳ʴs42r 4ьw⮀v)u^6xH5ATBVS ?Xy]PKh L wAwn:E\?@wirF׀wVw49#R^d V& ?Bo~eOqn-TCck=IÉ]ݴzg3QBw*"8<.[.ew ޣfԿkttnw Y ׮iF0{Mo #xpj^+jK gk-i5_pS1z˒&_ ?4PIpD2=_1 ָQ\DDR^,^wtVF&Bs8=w edrulY[Ⱥa̙#*Ϛr0!`gDzEx.-? "cnsZR0~!+9_{Zzpn[ʠs1Eae9& O@0+35K0MK^\j;0=V&dD=-ۙq=!0aO OΔJ@ LVnifQ5~k+崘sPow.bVmJD:+ٽC$Zbn/&P@Z$=0zSyx4⻔.A:Y~ƵςǾC.ol>+_]E론h"ίHD1_OZR g."TAˑkʣAT++۷h~uy3Y|qfK5*ھ άgFKV*̊em"Ʀ̉~U54%e:77.MIT_ԚɪA-:J6r]b8pfC]9_h7/zAEr!b{"ycpfd9;腛[10Pl:r^]YkLsR@0StSm_V DyU0ߛCBdƉ Gh3h27 ҞF`CRH(v[tpU.`Z~3&|p]y!ɽRRЇjwNL7-$Ҹ{a WgfWQ+M{x -sp[?.ҭM}FY!<\"nsm9)@_R8 fUѪՐ/qP@r&w+,Z9UzVi0NUbAhJnj: ie H=\C(=-J#\yW h4g )/y`X;KNٜ^;WG\ib)N9#M+Џ,$^6:c6%ćHYLԓ1nꡑ3x,ͥ|彚"Qk3)w&䗑 ǟճK/{CjUHvoWCe_F`@p0I)O^7PWdy҅ISH݃\yHL+mF̫jbD%r^ήɰS;XoE$eCpnƧl$+E?.߽6F W\Yyx*f=zuFlVEL0+&d/3଄ͰmЬqRBH4"Ir(B2 LG]a 5()["c^IMA2}LM ;Kql:8 ,|H2$7@ֻcΞ~ q8zHF8 n]Uzdd.?F=+L]E~*~Nь`5Gy i:g%bL)1MK~602L|} 0I#ՕRm33MaDHȱ UO^h%Od̫=Pbu+oE09;cp V dAY7F[^ .w;tN!ZbB M&=V*vxìXx6#D-+:վ0S4k2Ţay(gIX獨$pSK&7s V|rY:<07({F6^U,m#GW[v솲`$eS/MEɸ<0o;ÊR"g7J ga[SCwU0vL,!ϑPne&@O&HvK'M՗j) WΏ9,}˛lKx3>izZ{z7TYSI3 1]Īy"3"~s#8YSVҼkư}@̋>"ts Lw<]Ӛl>p$ǒ1{:[ 7'=9VW^H]/DiK U4$oq`N9 |L\j2j7:w BAjdȄ.VV R!%.kn/IVp 7iML>sÛjMJM72=+D=.I)@@`4X6hEX. 8*Tnݶa \ s֛ Kf9bn]3YٯN9ڽM֕IzFSaF2J(Cw,{[r+8J4 &T}}p[ʵPE;;73l0C?$濶rput֠aTZ5ȚQ3mHQ+mWe.RXE~H$"$ @;L0G00b0*.(i۱hU_ Ł-W63b]-n  lK\a[NuGQJ VLf$+ *Uy[vizЉ&R1f|WKp $R$V@6+=xu(ʫK3DAz_b$=f֒Pi@.f;GWlr19;2OkZ )PiZ<̯|MfW7k_\?Q,gԉdu^Y]WCDnx単L'I>ɩg*6<x`1FڲЯ\5R ֍ߧ0^<92 /܊ iͦ_;8 9__uӟU\>M*''=ߡU Uj ?5>L܊xzvvBÿX:d 0i[c+@۠ڎA ͝zj\-f@y$xSOޭz8p0?ꫡIonO'0]$eqxℱM6SPi{Oߌ3^hhD `ُ;,%.Y?~q{h'I@tY/{H{1Na$gEpH Ĭ[^ufgc0F4g&~CT"vAot,U`j-?W;EIܝJ,QhޕhX;kqvH|-jW!?$< \A@yf÷i#E3P%Cp9sޏ۱>Y+..-#E:o hΎR=upXX$MmmXs`S=@aJc 3ԣՒ1vđdN$+"P6jB~JKq:Vq2?H|[Cޭ9?8R. ;hֵ vh}/'Q<5<֥*wޝ-,\!%]z4 J0^LDɧTFYBV l!u ʊP KYw.Bi 2uQ{,1zL"m 7'];@˴L 0Q@{uRϰSҽ+eY'F3jp0e 9nоƒdXwO+yNX|F_Im0Qm5?Bh[=ud&V7#r#p}= Vh|u+|^HeJwIT|hhr,Tn3}aa.Ƭ[C3ČV]su3M4Tk ,fiTPppEJCK.bizrp %+LW;MBڛy΁QgoWݧݣQ**Sf;mꃃհu}˭0AO`64ҳx_Z,@"mzFQј^`Skܭmgà쿌L˞O(XX s1U|tz/`_viG*5*ZTFǟ?Ӓ< ( ̘@ċC Y9Ka=SobXۚ% ,$> ww]VJd6|IcFVw@!Gav0QG !H6 "^OY{*5c0TbbM*OSvԉ=7by/O˾'h{q0'&W0 <և2YDP˰OT72(&hV.G (GyJ6T^N(aQx*v=0{ }9X*EZcfK^M 絡#~U#kXw IT=b[pKsr4G [4n9Ӂo.HY껶SN@4$WH7gdT]֎ӐX*#sV-sty̞ţ 8\e"}jh-) wy[˶\fZuqe/.%m#`ë.u}R#,Z+ ~ji![Q=vҪ(#}CY|^jc}zJ=o?w`v/m5wW縫RYR5+Q/u@r1%Vit0톟f" v" kk.H PwV Fy IWtaD6-$)5Λw7҅gK!=+A*H5x!K`wQN0|(%]CU4G  8ګ"zӌv8 ]]屈ɗX-ӠճU' j ˆw*!<@Or}@zGcLKf7ERgt'[2 \hUSM w(F S8Fpm_|+"' UnOP䭬'YZ}[/c"d#oAZ(nTj|lQH'd DfHgZZ KnQe>*8#N$eWDCĠ- 0mI&p7M-7+c+b 1.LL} ƵosBfJL0j} S ,IS/+hUB>r}P{m*r 8OfmmSQ-T5E`m23}m{wJ<8%E&w|W&^XOm%΄tU+$y޾ WߝnINX7/ C6u[H/ ^ hw5a 0XĽ/װ;R:9RCdSMES(@3Y"Rxv ;4e;Z$N\[84<O_]{!6fϤ8ŀgC/x=L^Y][ѝL|.(zZJᆉ[b6w%nGX¹Z'֥ #I& 7Yޮor@xQɥ1CgVnޣ@0` 棪 tDr)?Apָx!D503zu<{2gBQ`&0&HTXD"R(RMwtX;>`NB]84KCď JF)ׂb9Z<b9ܽ! u&1wjm4N{FiѲ J(=ଐWjqVP=pSlg09 $V'P16%pP",.5;r05yhX$>9PZC%t)UPEHVQ%gotR>x_\q =\ƕ,Rw ⠢f#k6 A{"S/RT "54俋LHx&1`#7`żBkʸ9,C)7M3/S%iH 36ois $( 2v:m{ ۰b$]0ЪF&=M֊]O.6%3ŔPKid k*۬*-hR]nW6 cVrbm!Ș&ߟT}qzh!ֻI%[İ~Ppඣ&l9t_<+op/68쁢.vT;ɄuI*]k 3 e¦ؚpbHYG+Gbg#>7.Eq N4e61YD1+WoSpoAu;? qN7f c- 3c櫉&5EZhWBD-a1f}M/ 1>b@% N@N/dN#OHXʙ5Ԍ h|;v~$KE7<)Q@À|8gTON}V#LzULᚅ~Xۿ.P!Xa'Ƌ9[* 0*i -ݩmL/Iy(=N6#5/( C)!&w1$/oaJ j!Nvi]7#b|Q/Zn-[~4?#UCA"h =}2$s-*,m"W|K^ ~-CmId_7CӔݕMAl\;[3:\P[2!5\y [Ȗ[paD\dDs$*zTApg>& F$M `QW!zFŠ 4t1F6RߐS˵9I&<7ѳ ,H߼pPbφ9TZ/fYUeóNgOEp*b TGxG+viO?;tQ>V+uderيL`rӎ79jCXܛÈoKYkmx 쪻$iY#%(L]z u:d >jlFNvxz{bs}4xǡ jRsTy[h9OQT36Ԃb .- #%'F:1{fϏeO Z (h~枘s`6~NO6ܕOk|tWA!ƾyC mCA4"܌eF4c vLA}D1ӓxޢ(ȯ!E{y*"=j0mtH/T|3Gmb\էZ'!P<⪯۫G6JfUǾυgGbP{0qIJN?=ba bv%.OS¦=1v%<n9"碔ȿwqSM8iG׭[}U 6a]V[2>ga2㞝%+L"H_ ſh^ߙix{B=cwsq+Wh&Ie Ǧzq~ F.e0hzLn p,vf6!5HZa9 ݟӧ;c`0w1˧"ߜtgM֟8%7%9?¿2| 9*9yuݺӳmtD l(xC^/#84,VFF .q.,G?*ϛukM _|\)2<=}'0$&c୅;37lrƜY}bC 0s^/-sAE.JcwoySFaϕR7 L%Ik [6ǩ#TŁ e8fo )HU{Ho]T'fd;H,]CCB0`&D!EygLn 7%x陪!tFtlyS4'{ )}-QO& A-Zu#{s( ;3v}np =FXXR<>ýɴNnH/sBmi9RU@I&[O5-к6p#Ä aj Xְ{zj=dqC+E~jG<@q-2;u0~U.ٵ dxMNn"4p+nE3]KqUK-0 DS[#­%Psh?(N4~r*U9GX EcOsy},JG>oZ(ӭ6rQs %΁i4*JٷT1xTJl3!;kl_TBGu3kjUM]"n&. e$1:<'+sCdmcq`11f> b4vdSY>+3ĶO >Qh/[An9ClOޅ>Wm@U4}@:g[a|ԓ1u)xcp6[o pO2K37O }]~g>ݺEmMAެ|K4vͧf!5^e*#gQc E|1♄-@Ζt*$)2)1prW [PvƳZߌd<2K$Bg$Ɵ x5qtٵ-o<0aD3Z_D:dxI.DބI0c73o;y u㭬{w!GD ֖:GRoH9j!O\jf州!AS=> (KG2֋{)  RDjr:3>!^ElOM21CLMiBjYG={նiU=D!0E|;,LV̌D)Sy``[.2Tݼ|c0P"7&VOY3Ii3%9ìk)= ]w C[ tg$K@g/ ]A(|3Q,}ٚ pn}_PI/7&p0)J'&]E󟙠t%ՎU ҕ1[V-O$QZT u>D :1,:l&K˺O*GZ0q2D*0OP%΍m{{Z3]i|tToO۴Ρ&GJU3DlWZ@je/nTPL#Dd ="¯.wh9\< +ƴuS[G%ih2e'Nss[}1cyAF< ;:Vm8Y{ZD5dtv8iއ6k7XdïI@Vn$hsglֆra[Y{$ :4v6i$'GDkDzy z95C"pG˓)>?窅iyShxRg7WBFF1qAƊπER;S:us2V'"D ړ Ƹv;楶ωxyZǛ\؞&>nwQU z[i^ܴ(5vAw8PB~ֈik_%R%q* Ӯ\O GI&3ff/=R LWGՠ;#abUl1 5t8VuŴ*-f)-hz|oIjt8N{=r_$;8& ) i/":e7.ɪcCfA,j8#"B7gijqI[7kgEZE%3 \mNa& hk6phTXaĨr;|qO]&d3M'Jg'K$(؍0~v~MisP/‰dI0OSCM^+qқNj{\}uSө#Tp@(#*bg܅I4%cn6\=r2gk_cLt?jpx]6sN@*02u|diRZ8ҪJ ZMdF^Aze c>qŧX a9 2v0)(ح 3m<@P4E`jrnw}7-a}^oȡbXx$1pnT+pKE!UDב8NäCpT"]z@ ewMo9bX~݇ H>tq<<.o$X~un qHz4W=0zH.|I{v g2iZ{Y֖^IS_leIEn oH>K3`ZQPuX>ysTk}6j~.oV5nŀUBYqU;nc7QX(1DTOUH Hڸ?>T(8jwAV pCu5.&ow`7T`:_O>P2UKIH=S{z8NljX"rx)8=]%vи,<~CJ6SK,\A9 )*p.d hH TH;>ix63XYȏO иm@KEŽPݚ*K"]c tn3{ҽ>xC+iZ87JL^$m̀7^ˬUgEt!?b]7ֿ rEWļr Oy @X2uM*+Ŧw ÕmΝ?Ӈڧ^s~@@X/N:"OM5Wd}^,w#)H>exr܈c?/u|C$%)>}PD$kT<"uQM ~Ѻ +;7ގG\ܫ\HO gTΈcڞi0uRmPu0عW?5+xR ͍mo1Ī== 4٢E2٢0@siLk3uL+SeD&Xs%.S!KD[Nd;hq|V [|hB.B1}d;cRuJ `0Ўhg g?}h0xPst)y[ϸIB̿9Ki ~\|f%+MFd/Y1'}cɒr3cp /G*(yz }.=p8b:d:B2_;pBϴ%tùiʟF ioYpvl?abdnF"۞6PO #"#'I^[ `Cی+ L3CԹ鉑'tF>'FL_N{E2&v_^AjB*i)h҅d&C8iѴtUOd$ v~E6Qs9Bd V}Lt&vҹ!VPV u9 BD. -Kݩ[P%ǚW;?o]Ml@0^u!ɈyHKamz2A,,cH'_k.0 R#Xk/W &ZդG= rzC+4#G]n Ł@%#:&-wb䀢9(0PEV?%#F ڶ0/RW` z7]ZUMr^%ifX0ކ_.>\ %GxP*SdB Eɇlt.Ibп(I}A>5]<l=?+yFRO8|u͎9c LSuK$;X8ct 4;}w Yuy[!eu\ݠTEYvdYi6k"QcV^5c9Px4WY87C!8 IxPw$1D[88EܥC oid Ծ5z+źcѶz&>Ԓاo ]}Ssu9S hI*, x0v֎R\JV|~Hg{<6Y`Kۊ{όe[3gʔ;"8.pӏײA\&_fdg noCC$yF3;ն~qp 1 X"$){$?Zh+( 0A^IrT8FHwTmZyJ1Br]|E} h:Ćl0~+@dPuz(}v0-H5.ᯛS0_\=E7Ld:fd K*ǃ+ ȶn$MBq Jm_h P̑Ueц8y<ݺr︵' QGb>ihE-7Ϙyl >2m sN6_C/޻g]lq^5r_x]?dUCn0.+BGU2!d8G&f$wD@'#hjUxO־ UIg9QhaTÀ'ME^fߞbe;V&? O=%gHEۈ*/0d!G3P\UA.}rKE$}@Lyoa-3F7U ķpg٤ Ӓ !s̈]@30y'r)+W2*.L㊮Ǝ#`kg#mYWr}L^. @,"Ց6~AѾ-md}'<߫hanGzA~c",Z4c|(qWF M'J;&)Oa,)OOXx%ƌfrRyA`aLT̽(QBIj7wRb(hF_yx(0ZVR_F{U VPq ^ _[Gu?^֙x;MmIr|ؚS9E`jh>߲Z?D9^Mۥ憤y JCpas^?iUV#5hMVoqur|@6 FA}0.7j,|q2$+9JܺyY_89RL:ϡWЗpzB|Q,!սdQ"9g *c Ə]ivm4~\SRz섘'zo^EXv/ 񱩚3ʞm")KMt|#O++%OUQw=ҥ@s# fD(V.9+lS`~V~֏L" B29a +V4Q:I}bdi&p 뽸&D I@M#1Gׇʰf$,UXw3}Nf23(ܙ'6e\Yg^)=11]-V9Kp"qBCn[6~zրm*Q͆X ]O,?r*֜i%dmAcua3+Kj\c$UBD0<Os)ۢ4(]>` ).khZCI*g{f73&X58vJy[Jg曤QJ9(:CS r.#iwL8GLU%KS92eBvÈ?.(5^]IGS6FL/%X|3zO_[:IGm"mgpi.Pp;`x]GvHz3 z$̬F̚"4'ͬ3%-:)-h;>9s_* _nKwuH}_-nlK3r;2ag$/+R|>|5^^hM\_,"uza[$F^LK[6?:ei=ۛR.mHn95`pb[ptu Ej]QMXH_}TvmXmϺ&4fX vz8ࠦAM &~f[9=ޟ B?q賀j._`27U-Oe'9v KcHvki,M':(R _Jdlb>**ۀӶr \CX ׻~̛h8HYfOpheKmZ>FG]6szz_1?n`/&#ňKPVDG+mYnq5yEGg]Vhkb7^Zd8}壄Ҏ)A%7YvDYG9FFiĒSjRoIQ0}TDW2HA|S/FtgGj#1ֽjVvZMZ;5ivXEiXjU53Bʿ8H1,POE(Fej{WŚ3,֋)A9J`;P7,Rӈ\3#/.p(cޕFxry-,`߃7n%5 uR^v ̛ ;%[WZ)HŸ5W_iZpt"Wt&pr,r{`|Mx4+d[O!,C~izu\!=fYP0 ࠪ/4n#>AbD.j@؂UpX1$J`';hIQX$?Q7(LagrHG3wӤE/! \XnQ|DY>m!`A01̖Z|/>D][ PxyDNcR,X%mUre~ ϫ9\^E3~nK9FiuhusEۜ\`}w*s)N_`V 0= y-&q7+$"`W6W=-t*ClN$.Vq mē!:n'4wGc4G&~RbKl qVcL+m3r Q| Oɑ#A :J$)$&2Ψ o){&<^5 .?5-W!AΞg4[O3$h`a#tL&L) ~dg O`TckzZT& ̏\uZ*"Y[@Cj(aP!GЧs^Gg>¥>Cɂ#S[Uuo}qd戔Y"kz}Ex9n_Ă O])`P%pv-(,;.EuW|:=ǹļO)9 (ǯ{XD#i>$j?ayd(!PU[^v&&F]U %"ߐvH>2 w?Z";vєJS@MnL='.0;iYF~@Py/mNSpF>j_8L=QgԧK i8\}[$Iŕ}yf|?7oK贀s Ahuld|?!`8jF$G:--aAwN#4d#gߧcX?УָlHN""q|ao83PB| pBTQFg!Mg;,XgRT=̩*ͽfrzHI(Ȕ<|!)è>|Sr97" )>*2Soo/Ag,!l)KY&mBQE: kM>&r4~#$dMb35Ø+׾]@7S{YP /oM\̪qݷ3lC;ñ CKѺ܈ʷ'mQv.IӞ.?U!/*3e5ȣ@{іn 0 KB11Yfp |lIWN<x'[rY`^\h0i/9<9B..͘apɾt1e V(@4 Vb 3GI|áUG?uG|:cє ck`J71&EuexČ8Bd5]6@9gƳٌ7 XkU>+ c50طSAKS&= xEM$G7GW=Bu\2ݗTھD% %5Z^7kOζoyeAkSp< w)Xt"ҩP|5FhFZI0S.ǘ9Z.>{ԭJJt:Qx)Ȭ+_XZ,L6lN^.!u>AQo ԑhBCٺG=$QC  -Ѣ9 =IT&:$*m9hQI%$WkmmB1\v1odRikE=*AT8FFQK,Z縀 ADFa?6˜TcM'U,p˜ѥd?! tT2dFB uZ94L"m3:@qy\GSDzsʊjo%%wgWjϗ;vɪzhv!JB<7w'o˝][=rUfĦ"_F&>AgXrhtx.IimZWAo –pnQ}Pj`p6ۘWVr}<窏Wlc|(8]a9Jzq=%ls/¾a̟뮯u)!y})hB֞q^\s#1_Jg;Qvu]kLHZ9lDD'uCΩ9%`qMp0t3^.T3(-> *dDs^hOFhO_& xv#ك!}W|7\|C~8XB){ xD6YE]J$9n]]*y*ourGi#t% K#iH@̕Rb%ӹ(K48LQpZ_sk].5_1Y<.M u;_ -0ћH!']s/S%^mmYfv YO}yaڽ)%{w_&K q;tL5GcR }rC>j)fͯG vps[nh|ޞQ~| K#׽Y4OniPZ=xs5%_{WPxWWPZE۝OsF]#ȣd."Tyұs+uhfv<9Ay {6ˎSp‘ٍ1(V|MV{yS__|v0̢Yڱ#C/̎? )oʉ_+3T46~⇡I#3S}4}]dӟ;PЯȡbXx$1pnT+pKE!UDב8NäCpT"V"e9I GyX<.ptJT;D=62фV7v$B]ց`T4M}52r_m 4^V$?7M{ndWy2`v 1:N߹É0"6`f OZOvIJm2e,ee_SՈHL>gsXU'@z.cehG ِ-$Mw==_dײ߰{4LĠ ATQ";V VbDEIzQ{>pMny]֑Abt.I0Yuwd^$gZEQ;cUJWF~^RE-<'0$H'KkٿuX (J\w}[+[˯-'Cqe[kݒ;PSl$>2{&h;2{f&T9/k-\GˡiݻEHxe@ /w-ܿ-' iM/0(@]rI}:f(hFnM[FaR'S0~Fq" eTۭq,'3(>Q]~u%r,BW9е15 %dP)H*0ŎbF<N<)΅W~n$)xpDzzqs@-[ze#wpL1.8Q"mpj$,hqM4|?1> <ڈUúD]F(7;A7Yh%E*:kI[{a.~B"E2Nܖ3@Wiwh7,`FPvilul˘C0zJF3<ߏIW&Q~[}FNiW} 99(?V$חd>JzMSo~ ^mlv\]dNtE޺b,)Lv-=9f?Ȧ`'6nj)UcvAc%.U]C\> / 1S@uk >#8Gw#._T9@׍%(k:pO8XzIW^kJO} .WWֲK￁qq`by] R!Ўe)↵B)4G!⽤hIwUOf%0hv7i+ɗLtMӴ<# gu6#z\"v"vD3jX'ty@ ^$e ^ > S}Gf!=kd"\,}rl8렀+118m=WIdRRCOG8DKЖd@ ,fäjYTCHXWWܮs6֥@5p8eÊ4I(5ʧ*!J!TEb&2c?ogʟV l/u mG_ZHxF eb_0ӋPṯfIsUrȟH#obs〮Q^ : -$˜2@3 7BOjS[T窙bx^˟s1amپĶj-cVA0m*i6#J?$qQCP}ݓ9>(uܫ-ߊuGb3xJ\BRgI9OU(Jve61X'%Ke`$AQeʆҙ=8?h`4&^PseWaL r딋>Iu E yKqi/\AA:;`ӽz&ZCyT1<Ϳ'Eka3ؾ aL;5[oc)Q' J]yjx%Kxȟtf E|A##Sj \zV0*)>hMm]&G,vۂ`[g%rV9`+1RIז?#13{L* r93לXZ[!ۗq6x˅]gWO&!4t!%ZK<_a^H tWG>0dGxGĥgAW%8m,Kw^T=Biw1mQ3BnjyT,vټ̘eU/ȋx*{?yn C􄗠ҟd㋴88 (͵8WHgŅ+@Qmqj砈 \;Eh7a~>H@AOC=*M5]*V2xEԆfTnҭt7 ˊU<߷HK}!P̀%gP2'Hu56d{AJh^Y.\ܐ!|0  :iO 1HuH2(0qgs,CG0tn.H_\0Q=Rf"v i_{ٶYJ'KJ%Oʼn3(5b@1Ae{D7qWx)TMd,fv D_B+>KW46"C:x8erIILW8_e[*.sl&]@dv\f2gi[eM]P7¦XjY`~B77cu==Q~3%|B'N:ٶ[h]@/MHf2MrJ˾^I{r4]6d;h@Wl zQ'b' DW7WRAdos< |"V츱0qgy ´;66ND:kuPuٔ #sؿi,AlwuCQl0$ tJ"aOkoǕoIizM +ߨWړ ƉQc&g\9:-;qj;FOr67yBJOЇI#W@ț@w5C_B#{)03菚-ntk,g7'O٘~{S,AP^Yg˶8ou[Y9%}1`Ԩ)LJ,erq/"/nほ ^o <MTtzMqRp6׀߰tu A\אٺcL!ġg^E5v3]}c{{TU'7̠O0fSG4@tnA}.Y',ܛ( bߣUXAV8Ȱ2SH{7ȷwoO }B2:^npBơ+J5Ǭ¸9㶤\<_3)d%i ;Gn^1֍4GrZt>۰03WeWC"k0"O yELڅ-^Ȣ 06t]c-T!Hv}7GC NȈIim:$t~9B]Ö^<ӹcmB=q^ 8zir2LQc#!2 E2B.)?sv~P.? P X- Zr45)A2yy63TQ욢;):C-UZ>}V]WxxoWȳdHy&m:Ōq OQGSΜ~"D R1fh t^鞐~oC P*䃺r|;ޙ3j$wJ"TΔ9xH8< ׷=H^<-6Ÿz c5a2liB~0N툮WD1k.AroD.$RA< ]5`/޻g]lq^5r_x]?dUCn0.+BGU2!d8G&f$wD@=Jvch uSlZydCÒz4P z$|_ЏpηL2}~hԷ:{ܝ( 35ST&Ry'*ƊX3( RmA[ d2Uc+}z'fe9cQQ֊;:IŽ`DTa@N]طYrծɺ@O F\r`NwM/wjS%ddZ٢'欦>Yz }l`;p$N"yb%4GGo0xӫJU'K~aHA6:_9^;˝hmQ]7k)lկg{z~M?<"զ>=WcKOϦޚ2uḭb P3|=,f{\bJZ[:ʋ{eıg|ϱXT c2+VkZS]p$ss- &s:fg0:nQ٥ yc~c$&ދΜɾj**هG suFeib_+z,"XPua&eȵTvd *Zf}}Qr;X_%-Vd5b; up>=%`, FՆG*z\L9\:+:$zehM)I:7[3* Rk{fzn_?Czd>' ~3~_T};?tN,'`D!_.,nOF/VFKckH^1!mRKFG>!ui*]Kk= /*D}f'Me.p pNTq;惴%fW[bS땩z{ !H%&AXD̮ t93"#}Кd%It5AKpg҅ &5> Tv;|~s4 +)+B#2[ DRXVib.?%!:*WcV'9g10UsR"|Ƒܨ-2>GȮO G7daˎ_oɓ%:b ``T4a(Y,ݖQH#HhZɃJ^\ܚ,!t͝M]y*;.#t5d(܈}m) GsV8y-릺9@ҎΚQMp4Ȕpwޕ\a,]ÏtS: F*jc;UG.Mq W]z)9\~M#?3/R;<K+:D1e`e'\Ip=)dE#m#VRɖu72o7(4!ϔ|/[nELnYl }gr_kq0׸6ROב]U9cniTR{V|*n@1Y2?tiwPn L--TXcE73?iiQtZ;/vO7<[W^ luHDBݖCvpKa_VF fTa9FP\\Fx_ayk8IGsaCtH&d);QLmep(}| EuZYv5{D)׆}{o@ t;Gpki|t3dF*ͥNWkO=L炲؜TtKՃ#0C wLBq%kr nX\ aH7>8~&ӏX .$朙YH +Td68AOqyxDwr7k%Ӳ[O`sfN&VEfY p1UpΌzFM]I`\m'9z=@YidY( uqyόgJ7hNמ Z%F\C~jwՏ.2NŰ_p>y5(ŬJ,lgy,? vm@-o} Po UsQ0LILf% Mq_t#X)[`Zȁ'9"Qi7e{疛n]XAHA LSgx ,/\·E܎/V|:HBC+_SC|A=BT DG +Fȉb'?f_QFģ&ȇXgsnlxBE ?sӑJąXWxO;ÿY00]k\_t;4*d}TPYr.6%'}+G|,  .YʙOZG&3_1!t/{ǞHTvQ2q Q[Фno3[# ʽt>,zӺ/)AeNF6UYEsV<61y :v}=O㓚sѽ٬VZ{@@!;[A^F|Wz:/SVjF'`lU@@bGH&oP 9i]ɶ(  Aܲ;KEgۋ!&S^q7 Is,#޻faf9T=:" cR)~Ѳʀ:&y&(N9ɕ*k4nQLH]8-~l7u+-l j! dغfg߂+.9Lf 3;V%uYcz?idP;8 ipٍquWR Gga LѠxXS|pUUpM1cZW8z>(X&w,%ƗW#kv-r]!aŹ6yƹU5p?xhaom1Dc3gn "-0褃!i⫵RӮ4?ʬ\r@997žp=$WLO~ h,rnSP b^.~׿aZ{"g}AW@<S.-:j"DB [Oᣔ|d..5R\52%"`dDNYIMʂI#Swb*H1TlF gȓ \ vvxn21t-PAThsRpG]2#%3`C }e]^|S1h  ;~Y%ox=Rʣbh6qSKDmy^edjWUiﲔaTfAqܝ*cv_o"=v~Ntr3TO\$Zn<6N7="rh^π`!:lgdg{x|pڐ'k@7t|bBA 8qJ5B}vP^X~v [k,n7EяEyE,C6ՇcFP=֤!>, -x)# YoC06Up7&jԋ"KGC~4m bgjV͝XDk;pӸ$U:xuH&Vĉ_|ٞ9,Nc(K&qy@D=0iB9֭xI6XH>TF /~ފ:`M{z%z]U$o5xGpHh%A|J~H5Uc}ַgqQ)$d?cȭ"*i&Fj_4K1ቅ\;7w % ݆6n':x It\;+KƏ.zD3 r)b7Kx;æP?ayO!2(el2 W0Qfi#Q 8HJdp%G)Y>kT"洞\Z1]>u#LUm)]4Sр{xX7= ab! m@/G7].rw!-\=.Y@ز4SIwR;0`1П+R5@kW_gCD8qABHf2@{cNYH,d@9d@J|O5p/(M#  2j}o( 3t4/kU3dz%!X[>SduFK< żfMK#e, i͂3N͠R[͛d*:g2_fך qjTZ2iZWh!~mgD_@S h4Nu6>NN(W!u IwrW)Ĝ;8mWb>Y꿍n8!|d:^(0Bߗe+H!JEEb{+ёxM:NnG<9!FwJ%qr@*FF 6vR2((V}H,Mp,Fb/ηT26 <2TcΨ uPUWێy1[@b2HޟчdnMti#yqĔNh6|(+h;*] :&seq O4*妶-'J-ȩTqjl'vÜӈpᮕb Q3Fp) Sߖ&qyQJˉ-*GHďԜwY%Cy-5sy$Cz /=/-X? W_V2⢭oclx!e տ~P'26X5tV`znj>cKmeє)/ <7%࢏@,nc[J?@^c~EX,8uPX=K4Z{/w"8 d96Y|B)wS֕4_d#9g >E=5R퉣/"9[>,߮55BMOj.,|5s2i N=scxƃt,g ;"Uߚ sƪ5& 9vjufS X0 wևVd9|wiU/]*Ȭ{0 7 %EHj3`qq@#@k͔Wg1b`23H@0*B mRGOD\;9 4Bb</LƠS=1`Lh A (yZEu! > I0[oܛg}In"[«%3)BE?7BL5P .SZ`Uv`5w$)rQ=ϺA~x{tGFf]y XdͰ.]C7h9Få 6UVVo[&ړ!@Gٻ\$XjKFR,dj^6BZZ;L(@Ic)#8}FNk3T:_޲EsZ؞+-EՠR?|bC"##&sv(ӲܴjM!)OEjo tlwW՘HZV$@$m:Aka1f#d]q" ױRV$*AVc`5RsHv@eTE6:=&W1#`T4@z[ŀ^rNt-r%Rv:+*aL+|0Tdlx%vw`eT*75ͅ[T>E֌?#"F}B8wv%%vl_)d zj$~ˡݦWrޜY U)ܷE<4W=d`=0;~VEVE;? ![T;W ĩ[TQ|[R¾i3FX9d+-K0w9N;XtMk7&Wu/|>Ք8hXޚKi)5x_&Yf5ޤAN=`kҨԁVW* Faz;>ғ,V_9F}o`k3IYo _V7ϿhJBtM7>9zj 4-bq!}!jRoN|T2MSC{^4]H8t]wGD\ceE,j"i\lS" .^c[K$5)xGEf$ƋaoVL3< DK# 'Љ{3rW!&^ەQVs#køs#v;o=f}j&U鶵"y j߄+M,^Oh{j 4`UbWMűkh":ѵǢD)@O抉7sp@ٖ(Xb isD71a.,3]YȽn2[ۊH/L+O;wu8{pDvsdΤ s DŅA=TOKBʇE{o>Zjj3PlͲ|sjCp e닲㏆MW/޻e$t+kX6?bX_.YcH*Oc& ,tU:_(W|: -ܽX/}YGҝ9;MEqf4¼§X"bˇ ^PB`=%rH_e;tZ 0c .qSI"Jhd=MY /xDN\5NאNfP6(E#Q@U z-~vEf^"ᰯBqr3F X[+rT0=~aH1'$&X1Cvk"/kN̲BWe>lrG~#lװnxHwK; u-u3!KUe>\Yu8="!q5S ;@1m(mZKߛP.ƥ`Dn]$ 6 ףCVjzCB2W} \a@E`uT8]C'@?]܀9B8E`*xeM] zY\vp tZKc%f%|P͓ ED%8^>]yԇ6l d^9l3cm)jv9 @9TY*o O7\1EpqG7>oG\dy1Uާ*"4)tO٠Pm0R C,65 J6}B1Ehm5 ԡ7׸R aNJ j+'v7k\ 6:XD>!+dVykRY6[FīES.g!J󾜘3Cs% qwX.pX7is#+! BDQdY5j#;ބW@k-aRMzJbY9DRJt$[W 8|'쑂̿vx^UkwRꍖ6PHf9OJDQ9A`ދҺ.#Уf!{gi 4m_fXKJO1Jr5Ni>B1S1xEMRWe ae9mhyV䡕G{f, ՔăԦ|f_$>^F;/鱔)ǖIFGLԪf*,up]<-PZ+b=>3dۻ6Wk2O"|9 Vq2$׆нD5j[R ~dـ2"迮0[b8~h]-$"aY 0O]Lc(G+$n1k-gL)_ۑFvԓ|8gf2>q ?hrOܢefz8 BzoǹF__/bulfd|m}ԻJB!~^*˝(5ﻍm%f#XzuQ0,r+kY=\aU]2 2 -_ViW">4ABFmgJ9Olɻgz'CaT"3P9ՐA/ß^!]nj*aFUN""Y^dK8\- x1Cppۮg]a"*ɛW)^+`PKR񱫬#jLP;Lvp"=zGT}Ni/i*^t[b*@x'D],7cH.ѡO&wj3I`.}\ ȷ.̻m~ut!*,|qfo ƧNԷH@,_cW$\$Dj3Y?&}OڬPN AEQָfc麏G7ʾ'UDO߱I42Goe~S0Ԁ7l,4}W5ΚfF=kjP;W>qi"1/r{EM>Ռaٶ[?n"7=4&wqUf2!8u'QFvp~ynwB_N(QU激AmLQxC?;*: Lǟ, 6_4(i){/Y*r~;+Ys{X$yRdILe5 M[W%ycW!y0]Ǡu;L hc ]Jkk/i3/ɿ5VL(.6EoR4 *}cCFWYHA|>?I-T#jBUQ„`@[%;/p58Pc'5ݴT{p\76G$9C2,=XfͿ~sb@)-8~2;wѢ0PBH bN@{vea陛slG_Nt͔?^7B28y ]`"F诽.9aGy܁F?(g1c%4}>T;:̬ׅY,R4ĿpIz KW7!]w^ 862o KL(1 eQ[(pHH0^ ܏hu0b#ǩ_5- p?򥬌^xgb6dO$%aYhaR(Sha)N 9/14HupPO!)`t˾2A:=Trw'19|[{aC!Bt$?2df4<{wlE5cZfR3wHU@Bjb OKϻlJ9/OާAT/n-DȌ|uts֭ -q0ǁO9aWp+>B,w%:T_ [B7Dչ%*|d/*l3UVEu+]b#KH3.dJu-B3݃S}mQ1q(*]"%Βq[P& 06Mſ갊Q`OA3wU m_MHam 2_W Z)'fO:pT[Ƀ =s:zYQp6!اG^XCft1ۜs'GEp](1T.lczgH5aNܗmj58T[s2LO v;V!4':qKm֞/'ECP<5hC軮fi3R7D<&X\\@ pvǭ},D<]}Hj,g9 ysY"GӘ%88fP> ىbSQ$P WG5oxxեEe5B1v-j"|Xvv)9H j;j3N=`!> PzViwPS}*KCQ [[,huh}ƋzM89^Ӑ~[B;!O2},3v(acy]F[,jqvd˱V; &t]g1OaQ3Ct$ZTz_#Y7@8u_b:jWܶH ZzyKDC^ӥ'.3 ؖ獁RKFbWk@}GyN'miqnB<]UzϺ Qk[ ۵l[9Y?nGrKIjFdTA|2vC8Zj|QT{0hcqe`PsmΏgF$+T;WqىLٕP -4>5Gp."o=]P§pHȿK6F 2e 6a찎^d z0٤IK <^2VNu9{"She_.Y@H lj0HYl0EQ:/ {0 ^ &V{ ve?}s?삤R+!E,+mvXS/"5.9+^ŸǾAj5aͰQ<4AŭbDp𱬥D;>k:QwҤ wl_{ci )~[Dre:%8x}k=]~7Rə#xĊ #P8r8( h_՚jRMD:G32h\R@c}%opus͔zjA i"A \sweFŀse^",Gcg6X86xuJKVTɞ+7 m~?=d(/ Mʁ@=Y-N|k2թԊQsg~ o7{aa6%rlI^ t)6;MkVN,tVJٿ!-dDA u"Qpy:miUߐJu'^ 3/ }8;@=b]87Zө(XUJ 6&Z"TYEK'TMpKü,׻*n?&)X#uTmE 4W$Q;2HUelVP9q^ɭB"HdLLf+H~i+k*l: \ THgbu@,j zݷk'[{>?7}yք@:jXG6X `XLѭ9*k{k50TT{̂q9{II+=!< qO2~5MeF6B ֗r%/wkrN *XY;lV\YBw;ioK﷽e7Kˢ899 it32<=>R=>?@BCDDCEXEFFGHIKJJKK]MNMMNOPQcRSTUVUVUVWWhWWXYXXYZYYZX[ރ}W];<=Q>?@ABCDDWEFFGHIJJIK]LLMNOPQQcRSTUVUVhWXXYW]yW];;<=P=>>?@ABCCDDWEFFHGGHHIJ]KLMNNOPQQbRRQSTUVWhVWXXYWbvX]^::;<Q=?>?@BABCCDVDEEFHIHIJ]KLKLMNOPQbQQRSRSTTUVgWXXYVhpX]\89:9:; <<=P==>>?>??@AABCWDDEEFGHIIJ\KLLMNOPQbPQRSRSRSTUTUVgVVWXYUn iX\\]]\am9:;<O<==>?>?@ABABVCCEFGHII\KJKLLKMNOPbPQRRQRSTUUVUgWVWXSt aZ\\]\`na\89:;:;<O<=>=>?@ABCVCCDEFEF GHGHHIHI[JJKLLMNPbQPQQRSTUfVWVVWXXYWR|YZ\\[`la\]]8899899::;O<<=<=>>?@ABBUCDDEFGHHGH[JKKLMNNOPPObPQRRSQSTUUfUVWXQSZ[[`m_\]8989:;;O<==>??@AABBUCDEFHGGH[IIJKLMNOOaPPQPQSRSTUUfUVWYP RZY_k_Z\]]^]7889::;;O<==>>?@ ABBUBBCCDCDEFGH[HIIJJKLLMNOOaOPQPQRSRSTUfVVUVVWXOQX^k^Z\]7899:;;O<=>?@A@ATBCDDEFGGHH[IHIIJKKLMLMN aPOPPQPQQRRQSTSTTeUVUVWOP]j^YZ]56778989:;N;<=>?@TBCEFGHH[HHIJKJKLMMN`ONPQRSSRSTSeTTUVWOτUj^YZ[Z\[\566789:N;:;<=>?@@TAABCDDEFFGHZHIJLLKLMNN`ONOOPQRRQSTeTTUVVWVVUX߃|c]XZ\[Z\]5567899N:;<=<<==>>?@@SABABCDCCDEEFYHIK LLMLMMNN_NNOPQPQRSTSTeTUTUVSgzYXZ[\]IIJKLMLMXNONOPOPQRSR\STUVWXYXbZ[ \]\]]__^_``i`bbabbcdmdefgbogjkl5676789M::9;<=>?>??@S@@ABABBCBCDEFFYGGHIIJKKLM_NOOPQRSRSdTUVUVNQXYZYZ[5677678898L9;<=>>??R@AA@BBCDDCDEFYFGHHI JJKJJKMLMM_MNOPQQPRSdSTTUVNQYZ[56678L9:;<= >?>R?@@A@ABCDDE FXFFGHFGIHIJKLMM_NMNOPQRSRdSSTSTUVUMPYXXYZ5676788L89::;<==>>?R?@@ABCDEXFFGFGH IHIIKJJKLLM_MMNOPOPQSSdSTUST܃QYXXYZZYZZ5676678L899:;<=>R?@AABBCBCDEEXEFHI JJKJKL^LMMNOPOOPQRRdRSTQfxTXYXYZZYZ456678L89:;<=Q>>??@ABCDEEDXEEFFGHGHHIHIKLK^LMNOPQRRcRRSTM{eVXYZ445667K889:;;<==Q?>?@BCEEXEFGHIJKJK]LMNMMNOPOPQPQcQRRSTTL_WXYZYY4567K789:;<<=P>?@@AABCDWEEFEFFG HHIHHIIJKJ]KLLMNOPPQQPbQRSKƄ_WXYXY335 6767K877889:;<=P==>?@@AABCWDFGGFHIJJ\KLMNMNOPQbQRSSTO_uaVWXWYWXY334456J778789::;<P<==>?@ABCCWDDEFGHIHHI\KLMNNMNNOPOPbQRSRSRP\eWVWXXWYYXYY3456K67789::;<P<<=>?>??@AABCVCDDEFGHI[JKMNMNOPPbQRQW[MgVW XYXXYY3343445I6678989:;;:;=?@ABCVCDEFGH II[IKJKKLMLMMNPPOPbQRQVdR҄NgVWXY2334345I66789;::;;>?@ABUCDDEEFGGHI[JKMLMMNPOPbPQPVdQgtPfVWVWXWXXY243445I5678789::;O<=>?>?@@AABBUBCDEDEFFGGHGH[IIJJKLMNOOPbPOTcUHXSfUVWYXW123445I556789:;O<=>?@@ABAUCBCDDEFFGGFH [IIJIJKKLKMLMMN PaOPOTbUPIńKUfUUVWXXY1122345I566789:;;9O;<==>?@AUBCDEFGH[HHIIJKLM NOO`ONTbTPM_LTfVTVWX12233455I5678989::O;;<==>?>>?@TBCBCDEEFGH[HHIJJKKLMMNMNN`NSaTOPH aPTeUTVUUVWX1 2233434455I566789:N;<=>?@?@TAABCDEFFGHZHIKLLMN^R`SOPPIńLSTdTUVW012334I5677899:N:;<<=<= >??@?@@TABBABBCDEDEFGZGHHIJKJKKL MMNLc`RNPPKbKTSdTVUUVWWEFGGHIISIKLMWNOOPOOPQ RRSR\STSTUUVWXYXXbZZ[]]\]]^^__^cwc_``aYt`ddmefghh010123344H4567899M9::;<=?R@@ABAABCCE FFYGGHHIHIIJKLKLQ_cMNKԄJRSSdTSTUV0123I45678M99:;;<=>>?R@ABCDEFFYFFGHIIJKKJLJQ^Q^MMNNHpIRSSdSTUVWV0122334H445676778L89:;<==>?R?@ABCDEXFFGHIKJKJO^PL^MMNND]MQRRdSTUV/012233H456678L89::;<=>?R?@@BAABBCDEDEWFGIJIO]OJL_MJYGQRdSTUUV/012G456678L889:;:;<=>R>?@@ABAABCDEWFGHHI HM\NJLL^LMMCzIQdRSTUVU/012G33434567L89::;<=>Q>>?@ABCEDXFEGGFHIHM[MJK]MLKNڄQOQcRRSTTUV/012F24345677K89:;;<;<==Q>=?@ABCCEDDXEFFGHHGL[MHJK^LMDGPPQcQSSRSTV.//01F2234567L7899::;;:;<=Q=?>>?@AABAACDCXE FFGFGFLZMHIJK]KKF̈́_LPQQcQRSTU./01F12434456J78989:;:;< P==>?>?@?@@AABCCWDCEFEKZLGHIJK\KDsFOPQbQQRST--/01F11233456J7789;<P==>>?@ABBCBCCWD EEFFEJYKFHHIJ\JD lHOPOPPQcQRRSTST-./0/0011F11233456J6789899:;:;<P=?@@?@ABCCVDDCDEEDJYJFGHI\CmGMOPPbQRRST-./0/0E112344345J6789:;:;<<;O<=>?@@BBAB VCCDEEDIXJEFFGHII[CyFNNOOPbPPQRSTT,,-../0E12343445J7 8789989:;::;O<<=>?@AABABUCCDDCIXIDEFFGGHITlJLNOaQPQRRSRS,,-/0D1012345I678789:;O;<=>?@ABBUBCHXHDFEFGHTDNMNMNOaOPQPQQRS,-../00E00122345I5678989::;O;<=>>?@ AABUCCBGVGDDEEFGHH@ LKMMNMNNOO`OPQRSS,-../0D00123455I5676787899:;O<;<=>?@ATBAGUGBEFFGFGGC΅CLMN`POPPQPQS+,-.//0E0123455I567677899::;O;<=>? @@AATAFUGACCDEFH>JJKMLMMNMNN`ONPPQPQR+,-.//D/001101122133455I56789:M;<=?>>??@RETFABCDEFFCNBKKMNN`NPOPPQRQ+,-.//D/010121233434I567789N::;<=>?>WSEABCCDDEDEF:FIKKLMN`NOOPOPQR@@ABCCNDEFEFGHHSIJKJKLMWNONNOPQRQVmWRUVWVWXXSh}T]]\]]^_`h_`abc+*+,-,-//C//00/01234I445667889M9::;<<=>=CRW>@AABCD> ?IIKKJJKLLM_NOPOPQQ+*++,-.-C/012234I45767789M9::;:;;<==>R@?@BAB<KEHIKKJKL^MNOPOPQQ*+,-B-./012G34566788L989::; <<;@PA<=>R?@AB8rw=HIJJKL_LMNOOP*+,,-,A,--./012G33456778L889 :;:;;:@P@;=Q>?@ABAB>?@BA< TAFFGGHGHHIJKKJ]LLMNPOO)*+,A,-./01F22343445677K7899::9?O@:<=Q=>>?@A5:FGGFHHIJ]KLMLMNMNO)*+,,A,,-../01F2345456K787898>O?:<;<=P==>?@@7^>DEEFGHGHIIJJ\KKMNON))*+,A,--../01F2434566K7897=M>9;<P= >?>??:QP?EF GGHHIHHIIJ\KLLMN)*)*)*+,@,-,-./../011F12345456K67887=L=8;9;<P<==>>??=99DDEFGHI\KJKKLMNN)*+@+,,-,-,-.//0E12233433456J676=5LCCDEEDEFFHHGHHI[IJLMMN(()*+*++@+,--./0E12345I6762vDSCDEDEEFHGH I[IJKJKKLLMNN(()()*+@+,-/../00E123345I65@@TBCDEDEFHHZH IIJKJKKLMM''()*)*@+*+,-,-../D012234 55H9I945766789:N;87K:@TBCDEFGZHIJJKL''()*?**+,--.//.D/0101223454MI9456789N85Z6@??@SABBCBCDEFZHIJK<=>==>?>J?@ABCODDEDEF EFGFHGHGMdMHIJJKJKLMMUH{GRS]STTUTUVWXYYcZZ[[Z[ \\]]&''(('()*?*+,+,-..D//0128HM3567786H}2>>?S@ABABCDEFFYGGHIJKK&'()?*+,-.C./012217G8G445678543<=>??R@ABC DEDDEEFYFFGGHIIJ'&'())?)*)**+,-C./0106G73I4456778545:=??R@?@@AABCDDEXFGFGHIIJ&'()>)*+,--C././0105F604H45655772679<<=>R?@ABCDEXF GHGHHIHIIJ&'())?)*+**+,--B-/.-/0 1/5F6023G3456571D98<=R?@@ABCDEEWEFHIHI&'(>)*+**+,-B,-../0/5F50122G34456.J:7;<==>Q?@ABABCBBCDDEDXEEFHI&'(>)*++,B,--../ 00/5E5/1122F345545,N:5:;<==Q>?@?@ABCDEXEEFEFFGHI%%&'(>(()*+,,B,-../.4D4/12F223343454/a75::;<==P>>?@ABBCDVDEFEFGHHI&%&'&'(>()*++*+A,,--. -3D4.101011F23445510vߖ55989::;<P==>>??@?@ABCWEDEFGH%&'(>()*+A,-.-2C3.01F212445.B ܎3589:;<;<?>>??@?@ABCWCEDEEFGGHH%&'=()*+A,--+2C3.//011E1233+HԀ2589:;;<P<==>?@@ABCCVCDEFG%&'&'=()()*++,@,+1B1+./01E112/.`m.577899:;>??@?@AA@BBCBVCDDEDEEFGG%$%&'<'()*++@++,,+1B1+..-/0E1+;}Ͽo-67677879:;::;;?@ABVCCDDEDEFFGH%$%&'=''()*@,*0A1+-/0/00E01.,OίLA56567789:;;=>?@@ABABUBCEDEEFG$%&<'()*)*+@++*0A1+-./00E0*7qʗ>.I56767789::;;O<=>?@AABUBBCDEEF%$%&''<'()* @+)0@0),-,-././00A,Pz215I56789:O<==> ??@?@?@@ASBCCDEF$%&<'('(())()*@)/@/*,-,,-.//-(Nr_-355I566789::;N;<==>?@@BTABCCDDE#$%&%&<'&'()()*>.?/*++,-..*3]G+45I5667789:N:;;<==>?@?ATABCCDDEDEE$%&<&&'()()*(D?.)+,,-)*Kv4.33455I5789N;:;<=?=??@?@SABBCDDEE99:;:;F<==<==> =>>??=C]D?@A>?Vʴg?DGGHISIJKKLMLMWNOPOOPQQPRSS]STUVVW$##$%;&'(->C(*+*+,))>g9*1234I445656789M9:;:;;< ==>>?>??S?@BABCCD#$%;&'('->-=*+((>??R@AABCD#$%;%&''('(('-=-(>)*))**'(;^{t8)00121224I45678L9:;<==>?R?@ABCCD#$%;%%&'(&,=,')?)(&*=]w~}M*,012112G45678M8:;<==>R??@AABCC#$%;%&'&' &,=,'()>('&.Datxyy|`1*/0012G345676788L899:;<=?R>?@ABABBC"#$%;%&$%,=,&((';(6Mcqsrtxy|j9(-..//0122G344566787K889:;:;<=Q>?@@AB"#$#$%$;%&%'&%,=,&&%&.UVfklmprtwy|tW(*-././012G233456677L89::;;<=P?@AB""#$##$:%&%,=+#%,9KZzffgjmprtwy{sH*=,-../0101F233245677K789;<P>??@ABB#"#$:%$%%&%$*:*+6FS[^_vcegimoqswy{qG*'+A,-./01F23456767K8789::;;<=P==>>?@AAB"#$:%$%%$ ",CUNLPQSUWY[]vcegjloqv{xc@)&*++,,@,,-/.0//01F121223456I6789::;<P<==>??@?@A"*##"#""#$&>*/59>AJYLHLNPRTWY[^vcegimrumV8'%)*+@+,-./..//0E12345 6K6778788989:;<?0@@"!""#$$%'(+.02M9;=>?FWIFIKMPRTWY[]vbehll^E/%&))*+@+,--..-./0E1121245I68789:;;<;;O<=?>?+@""$%&)*+-.0245M8:<?(@"#%&'()+,-/134L8::BREBEGIKMPRTVY]_pM;,$%()*@++,+,-../0D0121223445I56789:;O;<<=>?%"#$&'()+,.0134L88@PC@DEGIKMPSVXSH8A$$&()())*@+,--.--/D01234345I5566789::;O;<=>#?"#$%'()+,-/034L6=O@=ACDGJLONI?3*$#:'()*)*@*+,-../D001012345455I56656789:N;;<=>$?"#$%'()*,-/124K"#$%&()*,-/022PL>;=<:6/)%#%&<&&'()*@*+,-../D0123434I566789N:;<==>89:;<=?ABDEGFLdKCA><:889:;F<=<=>??>?J@ABCNEDDEFEEFEGHHIHSIJKJKL MMWNNONNPOPQ""#%%&'('$*:= "##$$#$%;&'()?*+,-.C/0121223344I57878898M9:;;<==!"&7'6""#$#$%;%&'()>*+,++,--.D/0012343I44567898M99;<= ! ! '8'!8"#"#$##$%;%%&'(('()?))*+,-B/012332I45678L9::;< ! ! &7'!"8"#$%;%&'&'('()?)**)*+,-C.././01232H4566788L8989:;<;< ! &7& "!8"#$#$%;%&'('(>)*+,-B-//./01223G34567678L8989:;;<;;< ! %7& !!"8"#$%;%%&%&'(>)*+,B-./0122G3456788L89:; < !!%7& !"8!"#$#$:%&'(''((>()*)*+,B-./01F2345667K8989:9::;; %7%!"7!"#"#"#$:%&'&'(>()()*)*+*+,,A,,-.-/01F234545677K89::;%6%!7!"##"#$:$%&'((>(()*+,,A,,-./-//011F2334567K7898899;:6% !7"!"#$:$$%&'&&'(>()*+,,A,--./011F23445667K789 ! ! !7!!"#"#$$:$%&%&'>()()*+*++,A,-../01F11234566J67899 !7!"#$#9$%&'&''='()*+@,-/0 1E1121223345I5788 !7!"#"#$#9$%&'='()*+@+,-..-/0E121245I67<=Q?>@??@@A@ABBCBCCDWFFEFGGHIIHIJK]LMNOPOPQcSRSTVUVVUVWhXXWWYZ[[\l]<=Q>>?@ABCDXEFGGHHGHHIKJK^LLMNOPNPQbRSTUVUVhWXXYXYZ\j_;;<P=??>?@ABCDWEFFGHIJJ]KLLMN OPPOPPQQbQSRRSTUVgWXYYXYZ[ic:;<P=?>?@AAB CCVDEEFEFFGGHIJ]KKLLMNMNNOPQcQRSTUUVgVWXXYZYZhi899:;;<;<P==>??@?@@BBABCCVCDEFGHIJI]KLMNNOPQPbQRSTUVgWXXYZZYZZfp89;?@ABBCCVCDDEFGGHI\JJKKMMLMNOPOPPbQRSTUUVVgVWXYZYZZet쒌889:;?@ABUCDDEFHGHHII[IJKKLMNOPPbPPQRSRSSTSTUVgVWXYZZd|勎8 9:;;:;;??@ABABBVCDEFGHI[IJKKLLMN PPbPQPPQQRQRSTUgVWXYXYZZYb87899: ;;??@BB@AUCDDEFGH[IJKLMN OOaPPQPQQRQRSTUfVUVWXYWYZbӇ788989::;;N;<==>?@@AUBCDEEFGGHHIZIJJKLLMLMNOaOPQRSTUfVUUVWXXYXYbĆ67789:;O;;<=??>?@AATBCDEFGHGH[IJKLMN`OPQRRSTeUVWVWWXYXYYb789;N;<=>=? @@ATABBCBBDCDDEFG[HHIIJKLLMNMNN`NOPQRSTeTUVWXYYb̄678789::M;<=>?>?@@TABCCDDEFGH[HHIJKKLLM N`NOPPOPPQPQSTTSeUTTUUVWXg܃656789M:;<=>?@@SABBC DDEEFFEFFG[GHIIJKKLMN`NNOPQRQSeTVUUVWXUw 󗉌IIJJKLMMWNONOPQQPQRS]STUUVUVWXWXYYbZZ[Z[\]]^]^^__h`aa`abcdmdeeffefghihh웚56677898M9;<=<==>@?S@@AABC DDEEFEFFYGGHIJKLM_NOOPQRSRRSSdSSTUVUUVWV[`566778778M9::;<;;<<=>?S?@@AABCDEFFXFGHIHIIJJKMMLM_NOOPQRSdTSTUVWWUZhSʄ5788M9:;<;<=>?R?@ABABCDEXFFHGHIJKMM_MNO PPQPPQQRQRRdSSTUVUZg[N565678L899:;<<=<=>?R??@ABCCDEDEXFFGGHIJJKMM_MMNPOPQRRdRSST UUTVUVUZg[VQՄ5678L8989;<==>?R?@A@BCDEEDEXEFEFHHGGHHIIJJKLL^LMNPOPQRScST UVUUZgZVTa44566567L89;:;<;<==>Q>?@ABCCDEWFGHHGHIJJK]LMNOPQcRSRST UUTYfYUVPt爉44567K89::;<<=Q>>?@@AA@BCCDWEFFGHIJK]LMLMMNMNPPOPQbRSRS TTSXfYUVVOՃ445667K789::;<==P>?@?@BABCDWEFEFGGHIJ]LMNNONNOPQQbRSRRSTSXfYSVN43456K77899;::;<=P=>>?@ABBCWEDEFGHGHHIJ]JKLLMMNOOPQPbQRRSRS RWeXSUUVURք33456J7899:;<P=>?>??@ABCCVCEFGHIJ\JKKLMNMNOPPQPbQRRSSRWeXRTUUVQh񐅇33454566J789; <;<=>?@@ABABCVCDEDEEFGHIHHII[JKLLMNOPbQRRQVdWRTUVM ށ223456K78789:;?>?@BVCCDEFGGHII[KLKMLLMMNOPbPQRPUdVRSTL2345J6678989:9;??@ABUCDECEEFGH I[IJKJKKLMMLMMNOPbPQPUcVQSTTSQք244345I66767789;:;O<<=>>?@BUBBCDEFEFFGHI[IIJKLMMNMN POaPPQOTcUQRRSTOi122345I556767899::;:;O<=>>?>?@AABUBCDDEFGGH[IJLLKMNO`PPOTcTPRSRTSTL ߀112123445I567678 9899:;:O;;<=>?@AUBCBCDDEEFGH[HIJKLKMNO`PNTbTOQQRSRQSSTKx123455I56789::O;<= >??@@?AATABCCDDEFHH[HHIJKKLMN_NRaTOQRSSP\ l1233455I566767789:N;<=>??@SBCCDCEFFGH[HIJKLM NMN^RaSOPPQRRSJ툃a12343445I5667787899:N::;<=>?@SAABCEDEFFGGZHIHIIJKJJKLLMMNMLc_RMOPQRSI|YEF EFFGGHGHIISIJKLMXNNONNOOPQRS]SSUUTUVWVWXWXYYdZ[\ ]^^]^_^cwc_`abcc`je001223344I5678 9M99:;;<;;<<=>??@S@BABBC DDCEEFEFYFGHIJJKLQ_cLNO PPQPPQQJ iT0123I5789M9:;:;;<;;<<=<=>?>>?R@@ABCDDEFYGHIIJJKLKP_Q^NPOPPQH }]U011012332H45766778L99:;<=>R?@ABCCDDEYFFGGHIJKKJO]PK_MNNOPM\ |{UV/01223G345456778L989;<=<=>R?@@ABCDDEFXFFGGHIJHO]OKL_MNOPQG kSV//012H456678L9989:;;<=<=>Q?@AABCDEXEFFGHGH IIHM\NJKL^LMNNOOPPOKτ|]SV//012G34576778L889899:;9;;<=>R?@ABBABBCDEEXEEFFGHIGM[NHK_MNOPIl {zTTV/0 11211G23434567L89:;:;<==Q>>?@BABCDDWEEFGHGL[MHJ]LLMNNOEjRTU.//00/01F223343456767K7889:;:;<==P>?@AABCDWEFHGLZLHIJK\KLMNKW x[RUU./01E23345767K789:;<=?@ BABBCBCCWDDEFLZLGIJK[KLMMNMNNE{wST-./01E2345667K7899::;<Q==>??@AABCCVCEDEFDJYLGHI K\KKLMLLMMNLLׄzgQT--.//0/010 E11223234456J7899::;<P<=>>?@ABBCCVCDEEDJXKFGHII\KJKLLMLMME}x WRSTT,--//./0E122345J6678989:;;<;;P=>?>?@@AABVCCDJXIDFGHII[JKLMLGȄ}pQSTTS,,-/..//0E123345I678789:;O<<=>?@?@@BAABUCCDDCIXIDEFGGFH II[IKKJKKLKEr]QST,--../0D0123345I656789:;O<==>?@A@BUCBCCHWICEFEFGGHGHHI[IJKD~wQRSRSS,-,,--/..//0E0012232345I5789::;;O<==>>? @@ABBTBBAGVHCDEFGGH[IHIJKDpv~ eORSRRS+,-/./0E0123455I56789;O;<=?@ ABTBAGVFBCEDEEF GGHH[IIHIIJJDÄ v}}~{TPQR+,-./0/E0123455I56656789::;O;<=<=>=>??@?@AAU@EUGBCCDEFGH[HIJJBs v{}}~iNQRR,--./D012345I5678989;N:;<=>?@ RETFABBCCDDCEEFGHHZHIIHDƄu{} }WOPQQSSQ,++,-./..D/010123445I56677887899M:;<>==?@?WSE@BCDEFGXGHIAv uzz||}mOPQQRR@ABCNDDE FEFEFFGHGHIHRIKJJKLMWNNONNOPQQPQQRRQVmWRUUTUVWWXWXXYXYbZ[Z[Y\لk`bbabcbc+,+,--,-./C//012344I4566789M99::;;<=>=CRV>@ABCEFFZGHGH= ryzz||~oMOPQPQ+,,-..D..//012344I4456767898M99;<==>>BRCQ?@ABCDEDEFXFFHDR sxzz{||YMOOPQ+,-B../01234H3445678L99:;< =<R@?@@ABCDEXFGH= qxxyz{}mLNOPQ*+,--B-/010123H456 7788L8899::;<;APB>?R??@ABCDDEXFG?e svxxy{{WLNPQ*+,-,B-../010012G3456788L89::; <<;@PA<=>R?@@ABCBCDEXFDBȅ mvwxxy}kKMNOP)*+,-,A--./0121G245667788L8 9::;:;;:@PA;= Q>>@??@@AABBCBCDDXF: wsvvwxyyUKMNOP*+*+,B-../01G23457K89 ;;:@O@;<=<=P>>?@ABCDCW?Y luuvwxxgKMNPPO))*+,,A,-./01F2234567677L89::9?O?:<==P>=>??@A BABBCCDCV> ortuuvxyOKMNMOOP)*+,A,-././01E2334567K87898>O?:<;<=P==>?@ABCCDLnsttuvwzqHKMLLMNNPP)**+*+,A,-./01 F112234345456K7898=M>9;<P<==?>>??@AABC=i isstuuvwp]IKLMMNNMNN())**)**+,A,-././011F11234456K6778787=M=8;;:;<;<>?@AB@<ŅopsrttuvwVYKJKLMMNMN()*++,@+,-,--.//010E1223345I7 86?@AA@B8 jqsrsttxgG[J KKLMMLMMNM(()*)*++@,-./0E12232345I676;L<789:;:;<?>?@A;Qޅpmopqqrtu\EI[IJKIJKKLMLM(()*@+,-././0E00122344545I5;J;689899::;O<=>?>9hooppqruiGHH[HIIJJKM())*)*)*@+,-/..//0E0123434 55I53:J;578789:;O;<=>>=?>7dmo pprqNDHH[HHIIJKLMM'()*@*+,-../D012455I49I94767787889;:N;<=?3z ijlonnpps[DGZHHIJJKLL''()**@*+,-.//D/012122345G9I94566789:N;<=>6XygllnnopsfEFGFFZHIJJIJKKLL'()*?**+,-.//D//01223343MI9456778789M::;;<=8NalmnnpmLDFYHIKKJJLM=>?>?J@?@AB CCNDEEDEDDFGFFHGMdMGIJIJKKLKLMMWNO POPMRv|~jUXXYYXbZZ[[Z[\\]'()>*++,++,-..C//01223317IM3567789M:;:;<:5 fgikklmlqaDEEFFXGHIJJK&&''())?))*+,+,--.C/01216H8G4567789M9:&;:;;:4rdiijkklngGBDDEEFFXFGGHIK&&'())>))*+,+,-B//./0106G82I4456778788L9:;!:3~_hiijjknmM@CEEDEFFXFGHIJ&&'('()>))*)*+*+,++,--B-../0/0 101106G613G345678L89::93^fghhijjnWABCCDEEXEFFGGHIJ&&'(>)*+,--B-././0/5F6122G456678L892pefghhiim^@BCDEEXFHGGHI&''('()(>)*+,-A-./00/5F50122F4434457678L89988/~\wefgghikdE@BCDDEWEFGHGHII&'(=)*)**+,A--.././/00.4E5/1122F334567L871{``weegjfG?ABCCDDEXEFGHGHHII&'((>()*))*+,B,- ./../.4E5/012F1345657K7870~k^cweegjO=@ABCCDDWEFFEFFHI%%&%&'((>()*+,,A,-.3D4.01E122345667K750m[ccvddegiT>@ABCBCDWDEFGGH%%&%&'((=()*+,A,-.,3C3.01E1245675K50nZabbvddegV>>?@AABCCVDDEFGGH%&&'&'=()*+A,--,1C3.//010E112334354566G0oXaabbvccg[>=?@ABCVCDEFEFFGHG%&%%&'<()*+@,-+1B2-./01E1233451KoW_``bbvce^B<>?@ABBVCDEFFGG%&''=(''()()* +@,+,,+1A1,../0E122345.BnV^^``aave_B;==?@ABBVCDEF$%&'<''()*@+ *0A1+--.//.//0E1223345,IlU\^_``aaw_C:=>?@A BBUCBCCEEDEF$$%&'&<''()*@++*0A0+,-./00E0012!323443.bjU\\]^__`csC9<=>?@@AUBBCCDEFF$$%&<'()*)*@+*0@0*,-./0E0012300yfT[[\]]__a`W9;<==>=>??@?@AUBCBCDEEFF$$%&<&&'()*)*@)/@0*,-./D0123,@bTZ[[\]]^_`EL;;<=?@?@BTBCDE$%&<&&'(()()*>/@/*+,++,-.0D/0120+LܜUSYYZ[[\]_^F7N;<=>?@@AS@BCDDE$%$% &&;''&''('()*(C?.)+,,-,-.D/01-0n۔PTWYYZ[[\^\C79M:;<=>?@SABCDEDE:;=>?=C\D>@ABBCDCNDEDE >UcikkmlnnoqnUJMMWMNOPQQPQR\STUVW#$%&<&&'&&'('()(.>C(*+,-..C/01-,[ּjNTVVWXXZZ\Y?68M9:;<=?>??@S@@ABCCDD##$%;&'&&'(()'->-=)*+,-,-.C./(=_NUUVWXY\W>58M9:;::;;<=>?R?@AABCD#$%;%%&'&'(',=-(?))*+,-C./.+,]˟NPSUUVWW[T<578M9::;<==>>??R?@ABCD#$%$%%;%%&' &,=-')?)*)*+,+,--B.+(Bȸv`PSSTUVWYO94788L89::;;<=>>R??@AABC#$%;& '&'(&,=,'()?)*+,-A'4gŤ\HeRSSTTV YJ546767788L89::;;<;<=R?@ABC#$#$%;%&'%,=,&(>)*+,$(AVNKOdQRSTTUWXG44556678L89::;<<=<=P?@AABBC"#$#$%%:%& %+=,&('((>()*+,,((EaFLNOdQSVSA445667L899:;<=Q>>?@ABAC""#$%;%&%+<+%'(=()*++*('?oNGMNNOdPRUP:25677K89:;< Q=>??@??@@ABAB"#$;$%&%%&%*<+%' ((>(()()*)*$''=h`EILLMNOdPQSTH734456K89::;;<;<P=>?@A"#$#$:$$%&#*;+$&&'>(()()&(=eyIEJKM NdPRQB234344576J7787889::;<P<==>>?@AB"#$$:$%%#*;*$&'('=()&(%*ChWBGIJKKLMMNdQL902245J7899:;<>??@?@AA"#$$:$%$*;*$&'&&'=()&$-HjgDCHIIJJKLMMOdD30123345K767789::;<?@@"#$9$#);*$%&3''='(&$'6Qm{~}oG?EFGIHIJKKLNKP00121233245I56789:;O<<=<==?>?@!"#9$#);)#%& '&;$$,A\pwwxz}xN>BDEFGIJKKNF4C12123345I5678989::9;N<=?!"#"#9#$"(:)#%&-%##@9Obnqrsuxz}zR>@CDDEEGGHJJLJ=//E001223342445I5567899:;;O<==>??!!""!"#"#9$!(:)"$%1$##)6Jpgjklnqsuwz}xi==ABCDDEEFGGIKD4-/0E010123545I5678789:;N<=?!"!"#9"(:("$/%$##%,8HU`cydgiknqsuxz|~qP?!"A#8'9("##""#(/;ISZ\^^`wdgiknpsuwy|hK;;>U@@ABBCDEEGG>1+-..//D0010123345I5656789;N:;;<=>>?!"6!=8' #&*/8AHPSUVWY[^`xdghkmpstw|v]C89==>U@@ABBDCEF@3,+-.//D//012345I567899:N:;<=>767876>ZCCJPUZ_`bcefikmoqsuy{}~hSLORRSST_UVVWWXYVKA@AABCBCODEFEFGHIISIJJKLMMWNNOP?! !""#$%'),.6IS;>@BCDFIJLNPRTWY[]_wcfhlprkXB758:;<<==>T?@@ACB8-*,-..C/01232344I4567899M9:;<=-$%&')+,/022:KS?@AA9/**+,-C./01 2122343H55456578L9::;<==%&'()+,.//7I:6O;=>@BDFHJLNPRTVY[_ay_UF92357788:9:;<==>T@@9/))*+,,-,-C./01243H445545678M9::;<:%%&()+,..5G857O;S8.()*+,-C./00124H4545678L9:;<9%'(**,,3E7367O:<>ABCFHILOQSQLB92-E1334556678899:;;=;5B(()*+,--A-./0123H3456788L889::;-<<%&()+*2D41357O:<>@BDGIJHE?72.-.01G2234456678:;;92*'=)*+,A-..-.//0122G233445 6766778L89889:;;<<&())0B3/2357O;=?@?>=83/+-//0G2233556 789950(&'(>(()*+,A-//00/0121G2345667677L899::;<;0&('/A2.13455L631.,*)**+,--.//010G223344667861+'&'(>()*+,A,-././01F2456767K899:;:&->.)++*))(>'&'((**++,,--.//0 G223345652,(%&'((=()*+,,A,,--./011F1224345657K89:9("#$%='(')()**,-/.0 G123440,(&%&'((>()*+,,A,-./01F11234566K7899"#$ %%&&=''()()**+-../00H21/+'%$$%&'&&'=()*+*++,A,-./001E1123443456K789##$$%%&&=''()()**+ ,--./00.A(&$%&'=''()*+*+@++, --././/0/0011F123434456K6788$%%&='(()**+ ,-,,*(&$9#$%&'=''()*++@++,--./0/01E12345I677<==P?@ABCEDXEEFGHIJKK]LLMNOPQPRRcRSTVUVWVWWhWWXYZYYZ[[m]<==P??>?@?@ABCDDCWEFGHGHIJKK^LMMNOPQcQRSTUVWgWXXYXXYZ[\l\] ;<<;<=<=P>??>?@@AABCWEFGHHIJK]KLLMNOPQ cQQSSRSTSSTUUVWgWXXYXXYYZ\k[]\][::;<=Q==>?@@ABCWDEFEFGHIIJK\KKLLMNOPQQbQQRSQSTUUVgWXXYWYZ[l\][j9::;<Q=>?@AABCVDEEFHHGHHIJJ\JKLMNMMNOPNPbQQRSSRSTUVgVWXXYXYZ k[[\]]\]Xr9;<?@ABBCBBVCDEFHGGHII\IJKKLLMMNNMNNOPOPbQRSTUVUVgVWXYXYZ kZ[[\]]\\8899::;<?@ AABBCVCCDDEEFEFGHGHII[JKLMLLMNOPaPQSSRSTSTUUVUUgVWXXYZjZ[[Z\Z`g8 99:;:;;?@ACUCDE FFGFGHHIHI[IJKLLMNOOPPaPQRSTUUVgVWXXYYXY ZjZZ[[Z^lX8789899:;;O<=?@ABUBCDEFEFGH[IIJKJKLMNMNOaPPQRRSTSTTUfUUVVWXYYZYYjZY^k`S789:;;O;;<=>?@ABAUBBCEFHHI[IJKKMMLMNOaPQQRSTSTTUfUUVWXY ZjZZY^k^ZS7687899:;:O;;<=>?@AATBCDDEFGGHH[HHIIJKLKMLMN`OOPQPQRSQSSTST eUUVUVVWVVWWXWXY jZX]j^Z[S66789;:N;<=<=>?@SABBCDEFHG[HHIJIKLMN_OOPQPPQR SSTSSTTeUTUVUVWXY jX]j]XZZSǁ67787899::M:;<=>>?@TAABBCDCEFGGZHIJKKMLLMMN_OPOPPQRSTSSeTUUVW YXYYh]i]XYZYVف6656789M;:;<=?>>??@@SABCDEFGYHIKMLMN`NNOPQRRSSRSSeTUVW XXYWli]XYYZWaIJKLMMWMNOOPPOPQRQR\STTUVWXYYc[Z[\]^_i``ababccdcddelefeefghihmmijf~5567 88989M::9:;<==>?S@A@ABCDEFYHGGHHIJJKJKMN_NNOPOPOPQRSeTUVVWVWV[ilWYZYR}56778L9:9;:;<==>>?R@ABABCDDEFFYGHI JKJKLLMLM_MNONOOPPQRSdSTUVWVZh[gXYZR56678L99:;<=? R??@@AABBCBCDEXFFGHHGIHIJKLLM_MNOPOPQRdSSTVUUVUZh[ViXYYR5 66778788L89::;<=>?R?@BCCDFXFGGHI JKKJKLM^MMNOPOPQRRcRSTUUVUZgZVWhWXYYQʂ56788L89:9:;<=>>R?@BC DEEDEXEEFFGHGHI JJKKLL_LLMMNPOPQRcSTUYgZUWWhWXYV[5656788L89::9:;;<=>Q>?@AA@BCDDXEEFHIJKJKK]LLMNNOPPQRdRRSTST YgZUVWWhWWXTo45667L89:;<;<<=Q>>?@ABCDXEEFGHIJJIKK]KMNOPQcRQRS TTSYfXTVVWWhWXP4545667K7899::;<=Q=>?@ABCDXEFGH IIJJKJ\KLLMNONOPQPPbQRQRRSXeYTUVhWXXO34577K789::;<==P=>??>?@ABCVDDEFFGHHIJJK\KKLMMNOPPQPbQR QRSSRWeXSUUVWgVWXPȃ334566J789:;:;<P=>>?@ABBCVDDEFFGHGHIJ\KLMNNOPOPcQRSSRWeXSTUVUVgWU\44334456I6789:;<P<<=>?@BCVCDEFGHI\JKLMNOPPbQRSQWdWRTU VVgVVWWQs23456J667789:;??@ABABUCDEFGHI[JKKLLMLMNPOPPaQRQVdWRSTVVfVVWVN223445J66789;? @@BAABBUBCCDEFFGHI[IIJKKLMNOOPPbPPQQPUcVQSSTUfVWN23345I667889;O<<==<=>>?@?@@ABUBCDDEFFGHI[IJKKLMKMN OPaOPPOUcUPRSTUgVUVUX߃123345I5566789:9:;O;<=>?@AATBBCEDDEFGGH[IJJKKMKLMN OObPPOTbUPQRRSTeVPs12123343455I5567667899::;;O;<=>??@AATBCDDEFGH [HHIIJJIJKLMN `ONTbTOQQRSRSRSTTeUNǁ12323345I566789:;N;;<=?>?@ATABBCDDEDEEFGHH[HIJJKLLMN`MSaTOPQR SSTSTTeTUUNƄ121245I566787789::N:;;<=>?@TAABCDEFGGZHIJJKMNMNN^SaRNPQQRSTeTUQaz12343445I567899:N;<=>>?@SABCBCDEFFGGYGHHIJIKMNMc`SOPPQRSSQRSeTTM _EEFEFEFFGGHSIKJJKLMMWNOPPOQR\STUUVWXYcZ[ZZ[\] __^_^cwc_aa`aabcdbdelee]`012344H5667899M99;<=>?S@ABBCDDEFYGGHIJ KKMLLQ_cLNNOPQRSSdSQYO0121223I445678M99:;<==>>=??R@A@BCBCCDEDEEFFYFFGGHIJKLKP_P^MNOPOPQRSSdSM|mQ0123H454456578L9::;<=>??R?@ABCDDEXFFGGHIJJKJO^QL_MNOPQRRSdSJRV012G45656778M889::;<==?>>R??@ABBCDEXFGH IIJJIO]OKM_MNOOPQRRQcPXMV//0122F3345 67667878L889::;<=<>R?@@ABBCEDEEXFGHHIO]OJKL^MNNONOPOPQRcKrPU/010122G323456678L8989::;<=>R>?@@ABBCBCDEXFEEFFGHGHIHGM[NIKKL]LMNNOONPQPQQRcJSTV./011211G23345667677L89:;<=P>??@?@BABCDDWEEF GHHGL[MHJJKL]LMNPQPQ_`KUU../012F22334456677L789:;<=P> ?@??@@ABAABCDWEEFEFGHGLZLHIJK]KLMNOPQZoNTT-../01F12345677K7899:;<=P=>>=?@@AABCWDEFKYKGIJJ]KKLMLMNPO_҄OT-./011F234567J789::;<P<=>?@ABBCCVDEDEFEJYLGHHI\KLMNNOPIKT--.//011F1232445456K789:;<P<==>?@ABCVCDEFDJXJEGHI\JKLMMLMNOOPG aOSTT,--.-/01E112345J77877899::;:;<P<=>=?@ABBCVCCDEEDIXIEFGHI[JKLMLMMNONPL^JS,-././0 E112112234345I667899:;?@AB VBCDDCHXIDFHGGH I[IIJJKKLLMNOPE|LST,-../0E012345I56789;?@ ABABUBBCBGWHDEFGFGHHI[IIJJIJKKLMNLSPQRS,,-/./00E00121223345I567899:;O<=>>=?@AABUBGVHCEEFGH[HIJK MLLMNMNNEHQRS,,-/../0E100123344545I5678789899;;:O<=?@ ABUBAFUGBDEFGHH[HIKJKLLMNLLՄ\MQRRSS,-.-.//0D/0123445455I56778789::N;;<=>>?@AU@FUGBCDEFHH[HHIJJKKLMMNE~FQR++,-..//D/0123455I56789:O;<==>?>??@REUFABCDEEFEFG[HHIIHJJIJJLLMLLIτjKQRQR+,--./D//01123445I56767789N;:;<;<=? @?>WSF@BCBCDDEFGYGHHIJIJKLME}JOQR@@ABBCBCDODEDEDFEFFGHGHHISIJJKLMMWMNOONOPQQPPQRQWmWRTTUUVWXYYcZ[\\]\Ԅ[abc*+,-,,-..C//01234I45667789M::;< =<==??>CSW?@@ABCDEFFYGGHIJKCHNPQPQ*+,,-,-.C-//0122344H45678898M9:;< ==>=BRCQ@@ABCDEEFFYFFHIHIIJIIJքuGOOPQ*+,-C./0123I454565678L89:;:;<=R@ABABCDDEFYF GHHIIHIIJ@HMNPNPQ**+,-B-./01123H34545667 88L899::;:;<;AQB=?R??@BCDDEEYFFGHIIFPuFNPOP**++*+,--B--./01123G34566788L889::;<;;<;APA;=?Q>??@BABCBCCDEXFGHII>GLNOPP*+,B--./../012G343456767L889::; :@PA;=<>R>?@ABCDDEXEEFHGGHHC[pFNNMNOOPP*)**+,A-./012G2334567667L78 99;;:9@O@:<=P>>?@AABBCDDXEFFHGGH@EMNOPPO))*+,A,--./012G223345677K7899::9?O@:<<=<=P=>>?@@AABCWEFFGGH?s[GLLMNMNOOP)*+,,A,-./01012F2334567K878998>N?:<;<<==Q==>?@@BABCWDEEFEFDHم@LKMNP)*))*+A,,-/./011F23443456K78897=M>9;<P=>?@ABCCVDDEEF;eGJKMNMMNNO()*+ A,,-,--.--..//011F123456J7887=L=7:;;<P<=>?@AAB CVDEDEEFF?bRJJKLMN()*+@,-,--.//01E123345 I767786=>?@AAB CVCCDDEEDB˅BZJJKLMMN()*))**+@+,-.//0/0E122345 I66776;L<79;;:;P<<=>?@@ABBUCD:cC[IJJKLLM()*+*+@+,-,,./0E0122344545I5665;L<6889899:;;N<=>?@ ABBVBCCDE=` ?@AUBCABυ DGH[HIIJJKKLM()*@+,-.-/00E012345I53:J:477899:;N;<=>?@AATBBCB8g?HH[HIJKMLM('()**@*+,-././E0123434455I49I:46778789;;N;<=>>??@ASABB8p;GZHIJIKKLMM(''()**@*+,-../D0/01223 4455H9I945678789:N;<<=<==>?@SAB=OCCFGGZHIJJIKML'()*@*++,-../D/0123343MI945667687789N;:;<=>>?@SA?=…b?FFGGZGHIJJK=>?K@@?@ABCDODDEFEFGGHGMdMHIJKLMMWNNOPQR]SK MXWXYYbZYZ[\]\]]&'()>*+*+,-.D//012318HM356789M9::;<=>>?S5z>DEEFYGFHIJK&'())?))**+*+,+,-.C/01012217H7G456789M99:;<=>>?@J\V>EFXFGGHIIKKJ&'())?))*+,-B./0106G61I445678L8:;<=?9Yׅq8CDEFXFFGGHIJJ&'())?)*+*+,--B-.//0 106F603H3445678L899:; <<==<=>:<ņ:BCCDEFXFGHIIJI&'('()>)*+,-B-./00/0 /5F6023G33454567L889::;<=<5;@BCDCDEWEFGHI&'(>)*+,+,-B-/.//0/00/4E50112G45 66787K89899::;<3S(()*+,A,,--././0.4E4/121F12334567K789899:<<1j3@@BBABCDCWEFGGH%&&'&'(>(()*+*+,,A,,-../.3D4.011F12234577K778 99::;;1c9?@ABCCVEDEFGHH%&'(>()*+,,A,,-,--.,3D4.011F1234566J789 :;1\8=?@ABCCVCDEFFGH%&%&'='()*))*+ A,,-,--,2C3.//01F1233456K789:1V=:??@BCVCEEDDEEFGHH%&%&'='()*+@+,+1B1,/0/01F1123456J767890PQ7>?>?@ABABBCUCCDEFG%&'='()*++@++,,+0B1,-..//0E1243245J6778/TZ4=>? @@AB@ABBUBCDEEFGG$%&'='()* +@++,*0A1,-./00D12345I566788.X`2>=>?>?@AABAUCDDEF$%&'<'()*+@++*0A0+-../00E00112123345I5567677.]c1<=<=?@AUBBCDDEFF$$%$%&<'('()*@+*0@0*,- ././/0/D0012345I5676-ay0<=>?@?@@ABUBBCBCDDEDE$%&%&;'()())*)*?)/@/*,-./D012345I54-mqD;;<=>??@?@ATBCDCDDEFF#$%$%&<'('() *))*>/?/)++,--./-.//D010012345I52.}w.N;<;;<=>>?@SABCBCEF#$%&<&'()*(C?/)+,-./D/012455I5513n.9N;<=>>??@?@S@BCDEDE99:;F<=>? =C\D?@@?@@ABBCDODDEFEFGFFGH#ISIBNuBMMWNONONOOPPOQQPQRS\STTUVWW##$%&;&'()(->D(*+,+,,-.D/0112212344I,K]-989M9:;<=>?S@@ABBCD#$%&;&'( )'->-=))*+*+,-C/01242AbX-8M99;<=>?>?R?@ AABBCBCCD"#$%;%%&&'&&' (('->-(>*))*+,--.C/0/012113/0P.878L9:;<=>=>?R?@ABBC##$#$%;%%&'((',=,')>)*+,--C../0101221*>R?@ABC#$$#$%%;%&%&'&,=,'()>)*+,B-./01011/*W507 88L8899::9;<=>R>??@AAB#"#$$#$%;%&'&,=,&(>)*+,A--././/0*2z/156678L89::;;<;<=R?@AA@B""#$;%&''%,=,&'(>()*+,A-./0/(Gr/356 7K889899::;< ==P??>??@@ABAC"#$:%&%&&$+=,%'((>)()**+,A-.//0+-gO)456657K7899:;<=Q=?@AB"#$:%&%+<+%'(>(()*))**+*+,,A,,-./-'CםC,545667K7789::;<Q==?>?@?@@AB"#$:$$%$+<*%&&'=()()*+,,A,-.(0i~,.456K78788989::;<P==>?@AA"#$:$%$*;*%&'=()*+A,-)(LӶX*13345K7899:;<P=>?@A"#$#:$%%#);)$&'=()*+*+,@,*%>?@@!"#$:$#);*$%%&''<'()**+*++@,+&0eɸ}+-122323445J66778789:9;O<==>?>?@@!"#"#$9$#):*#%&'=''()**+**+?&+SŜE;0121332345I5677678989::;O<=>>?@@""!"#"#9#$#(:)#%&'='()*%?Ms.+E010121345I5566789:;O<=>>?"!!"#9#"(:(#$%&'<'()%(HH'./E010122345I566768789;;O;;<<=>?!"!"#9"(:)"$$%$%%&&%&<&&'()($)Eui+)/D0011012345I567789::N:<==>=>?!"#7(9("$%&<&'('#,Ku@$,..//D01121223345I56778788989;N;<=>>!"#!=9("#$%&%%&;&'('$#0QwO((-./.D//012345I566789:N;<==>>6788787))()*+*+,A-/01G23443545678L8989:;;< %7% &!#;'-3:@EJNPPQSUWZ\^_azfhjloqtw|~tZ9&"&(>()*+,A,-.//.012F22344567L7899::;- &9(#')-148Q?BCFGHIKMOQSUXY\]_ayfhjlptxscE,!#&'(>(()*+,,A,,-.//0101F2345677K787889899;;)A3.24579:;T?@BDFGIKMOQSUWY[]_ayeilpm^G1#"$&'(=()*+,,A,--.//01 F11223434454577J67789&-0134679;S>ABDFGIKNOPRTWY[]_c|hcYD0$!#%&'=()*+A,-,--./01F12456J6778"0135579;S>@BDFGIKMNPSTW[^`_Xa9-"!"$%&%&'=''()*)**+*+@,-././0F123345J767887834679:S>@BCEGIKMNPRUTOH?@ABBIIEGHIIJRMMNOPPUURSTUVW]WXYOS]v9:<??AAGGCEFGHIPJLLMNNUTPRSTTU\VWWNQba\8899;C<=>??@GFBDEFFHOIJLMSSPQRSST[VVWOW_[]7889:B<<=>??EEBCEEFGOHJKLMMSRPQRRSTZUVVTWZ[]=>??@GBCCDEEJJHJJKLMSOOPQRSXWUVWXYZ_Z[Zct[`aa55678@9;;<<$=CC@ABCDEMFGHIJKQQMNPPQRYSTOm^VYZZ568?8:;<$BC?@ABCELEGHIIJPPMNOPPRXSTKTXYZZ457?899;ZBA>?@BBCKEFGHIHOOLMNOPQWRSIPWXYY34556>7889;;A@=??@ACJDEFGHHNNKMMNOPWQQURVWXY23455=68^::@@<>??@BICDEFGGMMJKLNNOVPRkfVVWWX11334<457788??;<=>?@HABCDEELKHJKLMMTUJQWUVVW6679:@::;=)CC@ABBDELFGHIJJPPMNOPQR^WMQ[XZ[[45568?9^:;;A@>?@@ACJDEFGHHNNKLMNNV[JlhVZWWYY/0012:344566<<8:;;<=E?@ABCCIIEGHIPORAHUVSSTU/0012:345<<8:;;<=E??@ACCIIEGGOMJOTGVUSSTU./0019234554;;789:;@?FEIIDFG??ELFCEFBR@MMSSPQQR34456=7889::@?<=>?@@GBCCDEDQNHIJK@UOSSXWUVWX*+,,-5./01288455678@9:;<E@GIIJPPMNOP)*++,4,./076345-7?899A@:BA>?5^?GHIIOOLMNO))**+3,-./0/651345=77?>:;A@=3~8FFGHHNNKMMN())*+3+,-.//55123455<5>=79:A@3_AADEFGGMMJLLN'(()*2*++,--43/01244<;:6788?7NGCBBDDEELKHJKL--..,/600112298567789G>9;<==D799:<4Lk6CJDEFGHHNMKLMN&'(1(*L++21-//087:3445.Gt1<=E?@ABBCIIEGHI&&''(1))**++11-//751:344,Pt/;<=E?@AB>IIEGHI%&&'(0())*+*10,-64/1921-ck.9;<?@@AGGDEFG$%%&'/'(()0.21,-/.1HūP0689;C<==?@?FFBDEF$%%&'/'(()T/6/+-,(5q94:56889:B<<=>??FFBDDF,,--.4.//00/<:12/6Zk47@?<<>??@GBBCDDEKJHIJK#$+%-%&&''.3*%-Kt?(0188455678@9:;<==CC?ABC#$%-%&-)+6Jj}S++0117745&68?89:;<@@B"#$-'-7899:;A@=?@A"$'*/=:HLLSYfeT>*$(+3+,-.//55123455=68899:@@<>?@"%)-2>AEFKLF@1##&()*2*++,--43/11234B;456788?>;<=>(+/37HA<:4.(-.+--../60011229856778:@::;<==CC@ABB&'))15&((/.*+,%-5..//0067345567?899:;;AA>?@@ '&(!""#+*)$&&''(0()**++11./0012:344566<<8:;; (&!*""#*)%&&''(0()**++21-/0012:345=<89;;'% !)!""#"))$%&&'(0()**+*10,./0019234554<;789- !)!!""#")($%%&&'/(())**00,-..008123454::78-;<=E>?@ABBHIEGHHIKRLMNOPPUURTTUVV]WXYYZYVg9:<@@AGGDEFGHIPJLLMNNTTPRSTTU\VWWXYYT788:;B<==?FFBDEFGHOIKKLMMSSPQRSTT[VVWX+U7889:B;<=>??EEBDDEFGOIJKLMMSRPQRRST[UVW[Y<>??@GBCCDEEJJHIJKLMSNPPQRRXWUVWXXZ_Z[\]][l55678@9:;<=@@ABCKEFGHHIOOLMNOPQXRSSZYKƂ34556>7889;:A@=>?AACJDEFGHHNNKMMNNPWQQYWSN23455=67889:@@<=?@@BICDEFGGMMJLMMNOVPWVRQ]01234<457788?>;<=>?@HABCEJLKHJKLMMTUTPQJょ6778:@::;<==CC@ABBCEKFGHIJJPPMNOPQR^WSUVLĂz44567?9^:;;AA>?@AACJDEFGGHMMKLLNNV[PRSRYk//012:344566<<8:;;<=E?@ABCCJIFGHHPORMMNGꂃZ//012:345<<89;;<=E>?AABBIIEGGONJRLMNFzuR.//019234554;;799;<>?@AGGCKJFHIPJLA|}US,-./08012344:9689;C<<=?}FEIHDFGHPIE\{kOS,,-.08012244:957889;B<<=>??ELGBDFFHOI=}~XPS33456=7899::@?<<>??@FBCCDDEPNGIJKLMSHg~tTWX*++,-5./01 88455678@8:<$CHB?ABCDEL=s~VMPP**+,-5./00117735&68?89:;C@BC?@BBCEAzpnJNOP)**+,4-./0662457?8(A@;AA>@@AC?Rlv{VKMNO))*+,4,-./0/651345>>77?>:;A@=?@AA7zpxeKKMMN()**+3,,-.//55123455=6>=89:A@<=?@4 htmOLJKMM'(4)2*++,--43/01244;;:6788?>;<=5^eorQILHJKL--../60012,98566799G>:;<==CC@AC899:;;AA>;@grjIGMMKLMM%&''(0()**++21-//08793466=<48\jjI@CIIEGHH&&''(0))*+ 11.//751:345=86afjO?BBIIEGHI%&&'(0())* 10,-64/192345D6;[igT=@AAHHDFGH%%&&'/'())**0/+43.01812345-BX_mV<>@@AGGCEFG%&'/'((),0/21,-/080123+KU\c]<<>?@@FFCDEF$%%&&.'(()#/6/+--.0801/+bڔSZ`VC;==>??EFBCEF, -.5.//00/<:134C6=71=ևU_dYAFBCCDEEJJIIJK##$$%-%&&''.3,)*++,-1(PǹlLVYM77@9:;< CC@ABC##$$%-%&/,--)*++)&BvYPTXG458@89:< BC?@AB"##$$-%F.,&--(*'%3aoFQWR@3557?899:;;AA>@@B""##$,$$-+%&-+$%5ZPDLUN7145 >7899:;A@=?@@"-##,#,*$%#)-;[wX@EKLF5/23455<67889:@@<>?? !-"))' "'2Lamvzz`>>EHD523/11234;457788?>;<=>&&'N811;GVamqr{|oTBGFJI?319856678:@::;<==CC@ABC'),/2.0077345568?9-:;;A@>?@A%(,7:A>DINQNMA3259;<>-()*++21.//012:3466<<8:;<%(454@:<:62-3436871+/()*+ 11-/0012:356<<89;<,+')1(()*-.6620+'&'0())*10,.//019134554;;78:-"#%.')*,-,1-%$$&&'/'())**0/+-./019123454::78<<=E>?@ABBHIEFHIIKRLMNOPPUURT VW]WXYYZY``]T%9;;?@@AGFCEFFHIPJLMMNNTTQRSTTU\VWWY^]ZX7899;C;==? FFCDEFGIOIJLM SSPQRSTT[UVWX+^\_W7889:B<<=>??FEBCDFFGOIJJLMMRRPQRRSTZUVW-X]b]V=>?@@GACCDEEJKHJJKLMTOOPQRSXWUVWXXY_Z[\]5ge\d55678@9:;<<=CC?ABCDEMFGHIJKQQMOPPQRYSTUVV[_ZTk5-68?89:;<7899:;A@;<=>?@HABCDEELKHJKLMMTUTPQRRXQu6678:@::<<==CC@AACDEKFGHIJJOPMNOPQR^WSUVWW\Q45567?899:;;AA>?@@BCJDEFFHHMNKLMNOW[PRSTTUYU//011:3466=<8:;;<=F?@ABCCJIEGHHPPRMMNOP ne/0012:345 6=<89;;<=E??@BIIEFGOMJSLMNOPPJM./0019234554<;79:;;?@@AGGCKJFHIPJLLMNF[Q,-./08012344:957899;C<=>??@FEIHEFFHOIJLMMGGS,--.08012234:957889:B<<=>??ELGBDFFGOIJKLEskLR34456=78899:@?<==??@GBCCDEEQOGJJKLMSNOPQJCNWW*++,-5./001188455678@9:;<?@BBCKEF;fFNNO))*++4,--/0/651345q>77?>:;A@=?@@BCJD@TBKMMN())*+3+,-.//54123455<5>=89:@@<=??@BJB;SIJKLM''())2*++,-.43/01334;;:6788??;<=>?@H5?wBLHJKL--../600112299566789G>9;<==CC@ABBDECa?OPMNOP++,--5.//066345+>C899:;;AA>?@AA=OKDNMKLLN%&''(1()**++11./4869344556<<8:;<97d:CIIEGHI&&''(1))**++11-./751:345<<89;:2+5BBIIEGHH%&&'(0())*+*10,-65/19234554;;898/:5@ABHHEFGH%%&&'/(())**00+42.019123454::76.7?@?FFBDEF$%%&'/'(()j/60+--.07012234;50D6==>??FFBDDF,,--.5.//010=:134456=7889::9CBABCCDEEJJHIJK##$$%-%&&''.3,)*++,-5//0 'O63@9:;< CC?ABC##$$%-%&/,--)*++,-5./0,*e/38?89:<,BB?@BB"##$$-$%%.,&--()*++,4-,&:o,356?889;%BA>@@B""##$,$$-+%&-,()**+,3&*\ӳM)35 >7889;;A@=?@@",#$,#,*$&%,,'())*&.F7*23455=67899:@@<>?@!"**(#$%$+*&''#%?{S,01234;4567??;<=>'(7-(*#0/)(.Grs6*8856678:@::;<==CC@AAB%.3&'(<&+,4Pqz@'.076345668?899:;;AA=?@@ (&(! !$.F[kx|u=#&+:11-//012:344566<<8:;;'% +%,5AO\knnx}v[7+$)**++11-/0012:34556<<89:;-.,3A@HNSX]imgYA*!%0())*+*10,./0019134554;;789-05:FAFKPUSO>*!!%&'/'())**00,-./008123454::78il32 ;?@AHEEGHNKMNOURSTTZWTie^`789@<=>?FCDEFLJKLMSPQRSXVQs_[\;<=B@ABCIFGIJOMNPQVSTUW[YRZ]_677=:<==DABCDKHIJKROOQQWUKOZ[5<99;?@AGEEGHNLMNOUPZvRWY134:6789?<=>?FCDEFLJKLMSNzYUVW678>;;<=C@ABCIGGIJOMNOPZJQYZ[112967>:;==DABCEKHIJPQUvPTUV/00745<99;?@AGEJIENDURRT,-.51134:6789@<=??FHFE;OKSQQR11285678>;;<=B@ABCMIGEQEQVTTU+,,30012967>;;A@5ui?HIOMNO)**0--/062355:8=<:A6Q8FGHNKMN(()/,,-.511349;979:AAADEFLIKL--.4001285668C=:<8CLCGGIJOMNO'((/++,-30017;560>@AGEFG$%%+(<)/1.+(9pÖA/789?<=??FCDE)**0,,-.91+1Tt4:;;<=C@ABCIGGI$$%+' ,--FpG)0967>;<==DABC"##)$$-4LczzV,)00745<99;JWklcH,+,-/062355;889;A>?@#(.)-1?940*,*,-.3011286678>;:<=B@AB!"(*""#$+''((/++,,3001296 7>:;= %#&#"##*&3'-)**+1./0073455<99;#&""##)%%&&-))**1--//62355;88;?@AGEFGHNKMNOTRRTTZWWYVn789?<=>@FCDEFLJKLMSPQRSXVVWSx;<=C@ABCHFGIJOMNOPVSTUV[YZ[T668>;<==DABCDJHIJKROOQRWTUVQ̈́556<99;?@AGEEGHNLMNNTRWTT134:6789?<=>?FCDEFMJKLMSUSLn#678>;;<=B@ABCIGGIJOMNOPZVTK҅~112967>;<==DABCDKHIJPSNOMk/00745<9:;?@AGDJIGNLB{tQ,-.51134:6789@<=>?FHFDFMCe}_P01286678>;:<=C@ABCMIGHJOC}zTU+,-30112968>;;A?@B@HntMMO)**0--/062355;8=<:A>?@4tsZIMN(()/,,-.511349;979?<=2xkaJIKL,-.40112856778C=:<=CA7]inLNMNO'((/++,,30017;5667>2NcjMBJHIJ&&'-*+1..53644563JkfR?BIFGH%&&,))**0-21/6234+RgeU<@AGEFG$%%+'())/1.,.51/*^b[X;<>?FCDE)**0,--.930128/5{^]UB@ABCIGGI$$%+''(X.1*+,)-IŽQVK7=;<==DABC"##*&%,)-)'%8rfNSC35<99;?@!T'($$-E\wvN?F?6/134:6789?<=>'()88>M^qurbKEFD8085678>;;<=C@AB&,7BCKQSTE96:@3++,30112968=;<=&/18652/4242--()++1./00745#<99;&$+'(+-2+'%%,))**0--/062355;88;?@AGEFGHNKMNOURRTTZWWYY^Xq789?<=??FCDEFLIKLMSPQRSXVVWX]Yx;<=B@ABCIGGIJOMNOQVTTUV[YZ[[dX667>;<==DABCEJHIJKQOPQQWUUV[^O5<99;?FCDEFMIKLMSUSRSTi678>;;<=C@ABCIFGIJOMNOQZVTVVR112968>;<=>DABDEKHHJPTNOQQO/00745<99;?@AGEJIHNKLNCL,-.51134:6789@<=??FHFEFLIKJPI01285678>;:<=C@ABCMIGIJOMNDUT+,,30112967>;;A?@ACIF:KLO)**0--/062355:8=<:A>>@AH=a}BMN())/,,-.511349;979@<=>?C@BIKL,-.3001285668C=:<=B@ABC=SKMNO'((/++,,30017!;5667>:<=0p:KHIJ&''-**++1./53645<9:/h5BIFGH%&&,))**0-21/62355;8-]5?AGEEG$%%+(())/1.,.511349+_7:??FCDE)**0-,-.82012856764p@?@!""(*&$%+'&#*W<)134:6789?<=>&''2+)*),)5US+56678>;;<=C@AB !')!!$+AWtT*%,3011296D7>:<= '&-0:HYnsrbC-#(*+1./0074455<99;14BEMTWVB/"!+))**0--//62355:88is329>?AFFKMOSSWNU9=?AFFKLOSSWNũT6:;=BBGHKOOSPۊR378:??DEHLLNggT378:>>CEGKLHPW.24599>?AFGIJS.346:9>?AI;MQS+/0266:;@=O|BPO)-./438;8:ɴ:HLM*-./33:55ABGKK%))*.0,;<9?AFF&**+.-X85>?AFF$''0GlQ*46:;=BB%0>MVC,(/4388:??&0/+(%-./3378:>>"#!"'%)*+/.345999>?BFFKMOSSWXO9>?AFFKLOSSWXP6:;=BBGIKOOTUTز388:?>DEHLLQRb378:>>CDGKLSIz.24599>?AFHKDѻb.34699>?AHGBuV+/0266:;@B@A۹`M)-./438;;>1lNK*../33:992zNIL%))*.032*nK?FF&**,2/.0{΀J>AFF$'(+)&Fg?9;=BB!%(+@erF9278:??(5@P_VD502378:>>)0220)*(*/.345999>?BFFKMOSSWXYV9=?AFFKLOSSWXZX6:;=BBGIKOOTUYX378:??DEHLLQURc378:>>CDGKLSRK.24599>?AFHLMDȯ.346:9>?AHGJGfh+/0265:;@BBG<øD)-./438;;??8yYH*../33:9:?7S@L%))*.03352?ܪ6FF&**,2/34-Fɱ8?FF$'(,-+,(Yē39>BB"&)''#:}f)68:??#('*?bt8+288:>>(1=Q_Q5"(/.34599t8mk@ Kϭo,p=Y3E,Wso ZJr(292z<F/{ v4\…3h8mk #:<^"?7Y`B[l8mkH]H\\r^ts8mkt}~DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/DisplayCAL-curve-viewer.ico0000644000076500000000000047704112647526530024725 0ustar devwheel00000000000000 v (@@ (B00 %9  _ 1p hyPNG  IHDR\rfIDATxڴ fGU&|w I:0N~HH$H?#.[@v`AYdBID}QAEa\ ! I: tyTݪ:9NI^SS:z#/®[{¿𸰴x*M~n?¿.t݉Ũk,φ^1>~ ЮK._[.7 CCMs?LBB.]}(;77Gsve74~ԠHrձP~[[zl+c0ckhd_SuN!=33t0e)= ;`C7O㛛?hT? ux~_kt%;WwWo /{CaOOhx1_XՠF.F-,cBĂ,VtDܙ'ф82i$e`1&$x,Eqp%ܿ/Z9VVr;uW7bTzL%.gvv677Q$1pe(Q '=x\fMV v"(rw>Ι ohgض36^ ޠ h2,yoR>S(5I,bP0XEMjk'@īe]_HԐt@5P^`#ԯG\IRJ}V@@XZ@[H $r)+BGBXN7^*0P4г鋆 .OY>)eBPV at [R> *]\ɲLؿRx"nom{6G4fԯT}eAE }؞j9 ePFI@0t.-^_ZZI[E /FzWmR$*VlJB']b T *(& z2T'Vd=jWT("((` Q T̞`l7<^G }{j^[ I(_T r\{;8r;ͿX>o)>J~?Gpx#0i:4 Fi%(Io@@a|z{tk͙˨fB|P*#M0Ί* t|54/LT-,WmcPu`4@' 3ݩF h;J7^ؓH!?hEDLetxHS= ؓ@x |zL1=oPxuT x0\غI]UZ.>1q5,yMcO@U ~Y) Ăi_`wEapL:PvJ3-R0&\ʫ/ mF8D1sb;\IkVL 2c =meFS5׽FtCA`X!c{/|&3nD|b޽fw=\^#\GTO -HWjq rG0Тz)th#@꽐Cee-u4ZPB)E0PXQn[r&$b(Ç YFF.̑L`KBjO.+`Pk+Oڅ6AN@v߃ &w'A8-z/\Wa+cM Vz]-4UZ7p TrK4\⧳ZzIIVAecXWnAMSX2+k!(d5̀,>ݚ тV _}hSܗ8AnedY̩ F0݄đX zU-Viگ'>q)t'纇vaP?}׭/E(T?EA|oA7K D0" )S^cU#06Z#{jrx9JmACzY)^ԯY/H$ʒIxnYh╱?PADk~Aӈ?-L[w_|UxA^mu<$gخm͖Dt^b5{ ^mw~i*uD|B55#mAVp7M[Dʄxs$Sd%q%}?aԁ#.nq=*`+V^ZeDIjh拶-bH/)#OYL! NO+ZR@tk<7+J?z竈<=aWRO*|, eC4%c P|{ Pe3H+9ժ ᪄ʫ8h)WF;Q; i3ik='xY9d;z@k Kt;3S*[ՠK&صQ;]*;5S2L |125WF{L^p=a,ӿ04:)L;o uTtυLJs^_A<3F'Wi1Zw(HHTfBɱ9V[qR I``B(0[zAFDFLNMTE͌`!"&+5`<$?({6`\{6߇A$?%Lݙ޿7+iIs5IWۃlu1"E&ʍWE%rwkS܀Iє2asY?w07j]Qc;Uja;ABx9<n!a:V6@iwua,L1R=`rU'I۔xxɶWPhQߟ.H=3xw}'d/ܝߢ<Hv]c`N-r-e`!;0CM;'fAwG4uL_kS@%vg\BTaF=ŎP!dmWs=OfMڃ L٘|c~cP,,{)dmbD2R, Q:2rBPJK?r:G 3U|ȒGujW aҳX`@hcW `L7+HuP(jI&rU&2]M5Zj!wBJCC,`r4TVX.&0o2:;nuiQ~QV5)[4*?#'b.#ʭ};w~'1_{]佚Q=_д45"گl2l-tmVl2(Ãk>؅E*i(4J1n1#8mz24-: `+:NHYr\/N0:w2c  & :ǨfJ kI3^}H+ÿq)D'~x?zWSd흿Bז՗96hCp[;DL(YXh࡬ʷ޳V5H…Dž"` =1`s@TmTadWPis}U,HH „tj16yH?5#ƻʛq2ewlŰ8pJ 6Hط{Ӂ-w va@xP^y|nqnz+,\23c/"}^-+Wd 5P@hue%@ 0-&jЃ^O^݀6N@&5mЇҜMglFZc혈&h:L-)<U)"g((mcgҹcKTN"̄BԶ)˸d)[K Ā&6'.'72?Y&wg%/Th]xh 蕪{GfL`sC;Z^^AXHhJ'MԠp"@D+yvE4DPknjVg"YJ1}&jBDpk1 N\JXI|(&zj{99q[QJYGD6 gdfnߓqqf3l U1d-3Ϧ(o|$?>Sσq$>C>xAX)7Z:I:T7#P5t(\FR3rFI3jmW0) nEQHSMJ?xj:T.ݎ@omMZX>4 R %r^q?)eU q=/3r-lڥ0Hv$p/E] G/tʉ'8(rqN8isL,-݊މ|WPInwwހ922 H>؁`-KBqw醳P[|mKLȺ5Jie}AL&Ϳά7$]hM/"R9+<~hjC@"@QG\a\:^żm`P ~qp.}Ai^ m꺖>^@aU-#]R6)_w~ӯTbǗH(o"XzDV4e_LmcHV$}Shw P5KOZ[+{ Ȋ cN5En>S+ʹi^4%IaxN-5F:{ox NO!z1#!' ~).܋8X_0,L_ÿsJoW^K'}Dj ?h)+h s#`{(/bՓP9Ԧ<&OCT,SV7MI( p4s&lZ5l`x ~N<-NRI[2Jx"l57YVe&̙\8hGW2UIR;l`C22)8A 2~N##r{ja BmKH,7U7Yћ;!#PSqF^ji> {#6\ sdg^U (Ӓ9kbjji*gec?a'@pfv $I׾:5"@ X& f4W.wiL b!QkpUs }w14_کaw RFP"##b?.[$mEf5Μ9"AwF!kx8eb1_A U-9Bbށ2ٿ[<~'6{5-e wq &#)2|rDܣ&P"xCҽ a n&P PVUH9λ In$PLnF(y(ڪ2$F\$ *5QIGe/_FxISM@sEy5`-&a Q}rt_&KMNX`;v2n졻i-]PՏ$6Y:w7t5"M@#(< P@~Zٞʊ$ہ<^< Z۪ %)DkFjevh b(}Xnѱ?@𒩨[݆3BPkZ;;B m``| \7p<zvyeSLH q-7&) gӸLvdӯ>h ;#K˂s#|F'kq, @}XNiS5*YR*pAea3:DY,|K 0ߥ&ɻS~²o{m`b cԠȨ@k?O$9*$sHL'$ǝ8APK"362l'R˸$ ~!\cSnŭP>yoThىW?| })zk'"hP⊔ahR:ܦ8By``̀SUzZm\?l^B9EAs {Jb۝{܂,V^~=( gŢT]c uzנ`@8:QBPP3徠2I'W!.(aǣ1[Q"i/Eb3?~oavmOF`3seǡ)8^O#ujqjjcpPb/%hzi/(B\q< wP|KYA&q r z||9#6ZtG8 v1[ )U0u?A|ܫ8bޗ},sk"#Gtc7x fPʫr#"?Lơ@23;@U-YY3v9'JTA>ة J'[3q߈ D^ 0e_GлvtA.%ُ[(1pTԦ8-'(!qq]R^ YԹPV2Z( iv?ħxGe!'1) "XX `DOMXߨ풮)chVϪ-/NSN=.6:äHAb=Hz>5gПM|U'ע?Bl v 0<(rz%^/C7a`7l3-4&RJKi%YV34'kZ>$26pwܥVf`e@HU;l;P;*{˭O)W©jB:S%r?xueMs=/#_iBN58DE0" W3* WJ9@۪.!&ܥ>%gv+" pY8?Ғ+CxNBM 403+~꫻BXR*,^3V%9sn6/ PCBJ+)VzTO+g,}X&%48/&`.:s,s8-H J'\!lTC;C4X1:R60I4_f^%j5T[Kz?!͈6BVL;9Jv^TW[ĜJP!{q؆-ȁ6nJ>p_! 1a>=EIsj/,' m 6.N @w}'tKcM~9|A C5ޤ$1 RQ e^ڪ^>(1dBYix\AO`-B .BAiˀYXL Q1qM?=\P&,qVY92(HJa/ .L=V<0Lt55;ш|2; e-?Y\\݀D1*7=QYxZ=+Juavh0KVL}ZEW nb ڣ%N-Eɢn7X%`G[D~B@Ǘ{X45fyrH8:]>=mB5z1c*@ u:_'Þe9.Ls 05խ)hC^LZp}ћX{f8 +_Ӥ:g*׽'3 t;%lLumZ @t 2*SW z$&qh0%.2 Q^%ŔK꛾`cW Qq) ZFp7D95<8#lȾȜW5W>,7+FV.ÏRr*1 J @UP*'kϫ pNgK/zmMQKqXm9w&7>GEPu⭬ELbS Ъf ldqRR#l2ҘuW 2:{6#P+SB2#?aZ'A %)gϞᗂƕ?O_eXꏇ?Gkz@jWI W}mF p}R)-߼/<((C6420;u5]dkƣT(*fZ+;s~kfuڒ7b$چR[Z:ozޥg9kqv(TԂU#+8\+n@"<~q%hNYJo_ l~Lӕ~:TJe芠=V x;V}7PƈRUv |vdPU]8H51xMX_6Ai0)(̫X4N/]QDaa Yxʪ' +B MSp**eY4Lӝ˲o(|@Q< hAn ܈8O>4 ~-dwSIl h} e'֑ V43=~Dv?ao @+i@ R?,“I| @wk۱Gy bn8*hY`58(5oN@2&Ldh%WBb$x!_vHYU`Mvj;#:M ctias\ e q_|/}|1D3F՘O'}mdEF&IqXy!/EdrV")0xO<|hrzRbaw餻QX.i"f瀎BtlhOEX 92 $)G] SϑvAlH3_q6{&05cRG]}\,GNΓFQlJ?o /P\4eN\=9:#$MhJL;%6I#'>XkZH/ƱΠow❚ S{ibOwP&!VՐdp`CkCdx j MzF8b!;Q'VJ<S63(^uhZرߓ[m-~V(2o?)'T x U9,Р?XrZƑpNsӉn|3^(dtV], &=yV2WI>qy_FmZXz4m5uvY`I.@/H={Ae{x ^\n<'b̺> i7pCN*Tw_|@slsBR)NC<?W>k -5cQw+h8&T[/kߪ<7anbR”:pyy_6`"%M00d|WAg .@rgSC~3) % 'd^3ӌo F s U @S>j waY} a?2Wi4, &Xy:s;zcdV`|jO"wuR?IU&*c0`y5 oy1(U=%'x{(HYF?E%46ƴI `M%¨b8PVmʄ5ʶ E*)a9˛<EH|V SXzrO?VP9<޳¿5Ni 64= @WcocMs٩C96T~C 9U~|ɱΞ{k:8c> M>x `0D t8!=,i†Q<xxlyP)*EX!1 t+Jэ]iTbT<*wVK4e/@0DFBݗ08ӭ i;c RnJQ MTZv[귾戞@ؖ"B.b5ٔ覌$"Z ha vV`{eB,u %GsJc` ㈞|ud!~]N=aOwn v;}‚r `Y ;8$Ы愮Pq&mMj< )pZˤ]Yi0cA#lXd B2 j%h5qAR6vcݍM- qj#ԡ:9)$?37 0C[k[2hUD^KÊ6h@nܛ(c=`aτJ|4B@4iryD~Jj| bۺJXA|Ɗĸ@ȲޮHE3`vYX$;9l!HXbU+ XY$4N2d"-%#7ZZTRƅ%@2 IA>\ =9 z [L"8wbThȰ勤4 9/ i@\F4QlPH~;ϑp**_W.SWYʤ{3P$]wE٦Aɰp5mW^qqM]leufP:I :\ɚRO e$b*P@;/HȹKav"Tp1uqU_ln46JFZ9zBV{QQv)8LlI;OH1_D([VZ>Fg#/Brݣ\H@] @qG 5 69S ]Z\G*2%{^G3,\__ 0eR7ӈs8 ̹H*EKQ2Ih}M )>y8o>t3}za>'Txp0 o{x=e˒xk2:?Gu1 7$ }ǩ_3.tƔ/M=E p9v=7K_]ZNTYP >="$#@S9`tK?&+|YL'?G<Φ sRUԐFqqMx\׮v-7# AI1`݀~WD5_NBO:$egmI!h.|]u}v@}S٦CІ5冧f.`FbXMQ"X1_S'gf:{`_F9$@4fJ ܭ'[.K6~S.Ġڵ 1]"+@$rq.$ZE81o}.W8í=;"~w‹jL*.Qs"[zF:9"_ZjNJ父^+Æ.=z*;Zp|u"hbz7k7!L|&LQ]"~ J4žӌiau9'wR<"F1{NH*$B#'-IH[M)cDϏA>j 5H{[Y%!}#.3s\,.^Gf]w8W2W4KX]wՈI2ۚ%`ŷ!Da -c΁@H9mjjc li]bPFo3ZfMPSzЧ+NhF1g'Әh]**c0w#[z =j^[ [f!:1 U@lru277$0^0h=pEUM5wH>B C֮!~ݔodc^)j]^ғ6EL9=kfr43qa1jNZPkHAwW_FhΙ=1 `k6Q.0Qs_/Gzӿ,EmAOk6`O^ifJ 7a4i6L` Gnꠈ0E%IpMho@A0i_lԒz4;7ʋb2s@A~s[e'g-f0YෟJ Ўݻt'kirhf&*Fu>JʴA '*sSpD{u 0!͗?/]| //NTw2kVwP=`3X7Щ4R= 6QMq9:A\'J4\,$`%Ee P2g͛CveT$A%O:4 j*V$TЬ9TnxIDqxDPP_x m3}ڦMjC]l!P&|Lz04 *^ s;r([Q$yHY]}nw<h~j M0pWwx_Ay-Whk2V9ē]|D6e,~+d!Uu.!\"ɿ+L Yv69Hx$SL ؐPWUd|~$z='RB]^J[=zuPeߛuÿ35$[eF&o%ءC=\W*dyo`V nQ6,<vmZЋ3 OReܢ͐G7x7x"J>RތUܩ/Pz}D(p|9Xנ|ڲ<ݜz["03sQK,'oڲ[ :߬XV5@+SP G]P+~XlZۿЖ&MJ0fJȺ" W7ҋӑ}D}ĜHj DI (ص;w~]05[@ATRsx~:1㈞0veCT *?AzbP5rn6eޖ?2"=e<+(qE=U@""lԑAPW^@$!* _DW-n6 _>驘}kҁX5b h\0:LWkњRxnAYHM Pay*|dj×DpN)W6hHO>fp֥&}gOsD[:ިy*Uh[_#6[kIد#(v+&Uj{)pf7v)&DD_ghAN‚kw+bSKfVA 5]/%2q!kRsaJTIr:A"44OoyL3jSxR}X x乞-GE~+1`-BW_Ft `sӖEGM@}>D{lh(O0l{9V s:3@ڗ8O ՗W~ؤ0np<,tRN1 ĤgJ@VxraҜDNDc:dѵࢬn@# H`(uS'{"-{e7bKa/EXUOtLx?.~o1|6˽ ွ絡8XnH.!nYJ&aYR *,ˣW±qm'ֹTF {*-o&ue Bׯ<&Wf23A"́Jt'm5|UZLw;KpNr^TsyBL_ (bϧ9!_+RSL%bWgg7!Z:&f{Ei{Tcpy#!kB}vIɯCsLFIΒ=c7"wW_?mQO\D_,JRe b/ 7|sYEppg|CD-I w֠'PNwXVc5Z $Ȼe$"h ;Bdѱ#Ha.LWQ,JgƇ xu~ll7ǃK6 K~v#u9TP f>~igW [ZT8ܣ4ݠvb{DW;<9) J:Ot 7gfjF} l3:hZwX~~M,F \OLLQ 0l!毟Ak0TX3ļI7Ű-Z= Ǫ1IFδE Tu͚w!;+LqMS݌ EEr ?b|=%{|P41dd>2?D?|:QOZVrSߛ/@Kѽ4iA:0MA@ M]+ Z7@H,h%fky^:?HWV;(T#n b \Jw?"@%)oՉȫ<6ƚ}J(]aAY{XT&C'%82֥ 6X8!1]wk">CmUs¿4bfLaGcDT2ؼ?K'}Q5ߎx#ˠO! 7]6uUܩXK85Jɾ, G8hZ}EE[>JڬnJv>-sq,/Ĝu2ɝX] hz9(qۃyW:tA}J |SØvd/, J#} <|^Jtu"D@|+oǗAC(\nYm2t)sܡ=^:` v& LP&Z+ 2h6Kv:Pm6GTg4s'`xOB1~k֠VԍHU*~Iey8t^: WRoݧVY}X]ڵc\+6I=٨6}^ > 9ռ>D_O2y^lEk(:}g׿u)Ndv<)>` N.ONH)^.O¿\zîHIDI/ -JE_V'q?ÀJP^,OM׿|M"?&L*MaGca砛xڅ 'eߺ"' }i/zALLx "Z'ɍ.oe%/8 E4i91j5ܐqWs'ߟnvrbh r9tz*yoDžgU THr~x/Ug-~W?L[sgwhMJU:彳Ew!.FGPd]Wc9?geaVP -DKJD 4ŊN 8Rq"\47o*[aie,mĦaJ@c'`;>bz,Rmflܪ$apS^By fq7ri~+X@O.V `c!qm jCFE4T4TO{ =f <'#A#7#e~аtynV6;|) `ؽ :TKo/xX)OՃwQ"E.40W~?DtsDѮS15ّˋ͕HePVgؖ#mSV1G@ȩ/:v/(R r}a~8٤w5h˽:Z/^ _idيAiȚnfű,~]>pR.))gt0.\(5igk|]dL%Pհ5%@?E.:inHwD0#Ga%_$"`‹M!]ar68:Bs</y►`J C2,кʚ\|WvC`=S=@QGL>}/$@1V,lC ipaݠ.5K$gx}Sx2|RQ&^A& Z妜X$i^!0Vee.iҁ:>ZBRLBۍ(eÄMi,33;!R)I2k{J$ V4P$.ZwAM܇S3?,.բzi3{,ͫ LDLR-R4V>Ro#>Y&xD\~ŜlHqC`v@K|08ɱU~V˨70]o1-\޶|8st!їEm!O[﹄r+ ppԱwͧ)vY(_ȁ@eZZ&hDii˾ŀVMbC/@h/ޒ eU {SmP8Tv36ƕny' #kV3%܊".FWgA^ށ?*y 覟O߿yD~ 徠O/v'lsC@prGWY+]!vV @i|tXEWCS-oH@p1sԜ6nl9<4_ܷL)H'' 8䊪݊F"8=Y-G XoWFFh,=gY$e{JsČ@A>}DoԸ+xKx9Z6!M5xI놷/$bHоI xY`'T}~^*8 ZjbbPa1U:׿5=K⧤s/V|+P#Օi";kv|cF; ۹s^)ޔf',9/O|t,5g5%!c}5w}m"^)Y"2;?DV[S׊Dpn6-Al\R߷f9#,[c];Tem~C_z -/(kw5@@R̰D?X NK$췯^ǎ&Ӱ7@ȲEK`[#.IW-??!]0az')_*9(m[8V <$i! H@^"O^d{~N7t۠\Pkb^˩_"׈Z˯mji'0q eD j/6.N^?,E냁RoTRJ$aw8(ͷIhҸPVTTGM/,.F,fhXelrTLEJr }? yxfS/}j|GQzRXi)ll#_V݉[V1'%o3Gh4hb&̰q0l dWs*Uº8>B:|öD2͢P`s* 1_zڛˋX]="WVX[`tŽ+n56OD@&Q:ᠫ\] 1,CP .˿/u {pw3Ft㜗JgϘZ#D/;CÂ^f>^/j Bim;.t'9SA|nNJZ0*R!G @]] t_JN *e(z!PYxMTWh%32*)U)QFo𣸔kqŴ-ֲ"PiΓ_<.hq!(k)RQ!p5~1ef6Fڷ "N!a &':}c Un gz'|XdT<I(h𚙹ν*ڮq< OPzm\uJ0]T~2i*AvlwF|(e F bc_TE&7).0qh)Gލ!Q8e1_"~2/ 70ᠺ3((=]~Pm}6H@d `uV$z{W"i{НUFVx"‰B}'I.(fez;݀['F@A/aQKX,aD V 7LOȶrnA>)f-05PH7 ѥ&X) 7"cy$^]pc+3KKRVŲJ*Q⸷C2Bgÿߎ+]a'2w7N泱nF ÅVW^F;(<Pcjr絴0\Nk[k YdO+&Be Рֈk9#,9 @ֱ`\x]ce]`,5}D6͝1Gyɺ _ {e J#Q3~9GMj2KfڬVe'OM~#YrED .XJ-*3E&st~_e4w@eA417m BAy`adAx `^fy8붓^9|dz>p]U,A~c+JbV4$9(6;p)2K[Bg@J@7!f[x<mmW_ _!#edc96-)(@D5EriFPK9 ҇U V]yRٷo]s~XA|ݝ~/%K{3 H}nԎ~2Qz;$A4M&Vƞ"#W  i/1d)SSKK]5Z*#}]+`>v!_Czru\PѓWX"RMUL=(s@X|GCU G^ `5אL%] ̣>ósR >kLPqWz LGN$XXXUcD1O"';mH9 QְїӋe槯(R9Vy$~/ˡDZNlԓ 61pMc:RyZԃPGћnw9p d ukD1)mse` * k|uKO UPј i\Wo`M0 /d!dfB,I75/CaO2MZ+ْLM|%HW*<)o:箌j A# kUZ\ Y$ݔɬyhxOYzd#)pC_vFG}O<{*T~wU?I9v}PRalâE!c@1*.+ r& PH˽[ Dӷm8pq@}k)]s8'@j diԱE^헍=d ݮlI>0 PN=-]g8-<<<ߞ}@?e1h8{>tse[C8&v<ȉlK߬!LBBH4/W R:-B[ <^[R(RR8$$ Ƕ'Q$=瓔k_}w8w=kk51ggiKW([g7^fWBiS5(>?XVCtw TPK&v0XzLUC#A~, q*n@__'Ɂ&@W$ۿ_gd$Vֺu#Sje'q 8U9D3_CIݽ} e ԁ@2gFt#+h'⛗};=fT5`&00Hd?a]Ym1љ=}%1^{5A1 =Cܺ㐪03ȧ]1 bD"P-@u\'m[]ڷ H6RQu1?$V7\ׯZadl~DyR9Q&E`&%<;B[u `r$1s45~3;ځN,С4`{н?W ]-Rt˜R!5nEf A`oݧxCz Cn9 #VuӃ-4rAYbmFC!d>Pc02tR[#Tި)LHfŲa[i]Xr|Z=?xnumtzF&xQ\,fT+?ik3yϋO( UxƋJ`:/+DgW uuq׹2~  B.ZX_+FrAOEӀ2{Ծ'`ouk>'/ ^ edoѩ[\^\9Q[{ ?t5oC;ٗ~;tHlӴ'\5ĥ@ 5԰@ҿ+܌֞ڙ`_-T7)V!5VV㮴c} H$_|Vߙ3HazC4^XNb&@|۷/'?Cgϟ|^lSY'z .ٖb&Edkuo~= b#P=6Pl|sYFR)!CnF~5}|Er[8DSJrflP~[a$D*hmc\]h:* \r]9 t J)&aB?WVZpPlȽöiL&ꣷ>i4l#h0g&Q T$`y68LaѯB|`"Qq|], DD jx$b((`Xl藒n1]%6 EZADyYḥC/1ۀ--.ݐMm4])IhA^@ p;_Bɮ*YWݩGy2+(>5(zBFҶV/1#~9Ü~@hO,<2A@\Y`^*3jx8*#z?~ ax /N# Ɲ&mԾrxn/9'njfK{j%}(\cLy!]7h/S{6SSjI:xI>~,u΍̕ ",!NlJfבj[ZT?)ec&Q\z| Y2ߛd XVG܀?g6r=ݮt2MiG621. e(]< `ԱkL!mO$ʚ4N)" {RH_}:!̚T HEqIzh*VoWL@Wsj+!?u55QYOpI0f~ N+">;՗[hۄ }@?!.aQ1zȄ4W?Kæ}/j̉l?~\6Ӥ[Tzxb*>'qKMHl=gn7˜j`$`aK¹j +P&ozKN[]Z"%*w'YՄOIqIYMv=LD;Cogh>CV]Soqc±MKa]Z;d?fDE{?9&z6rƹh\I=a,WK[hOwjDwYm0;ؘPlmD6 LZ|o'ޛ&i9u)M䂝< SA%A5ӊa/P;+A梙xcEJy5C=DϟKz4ҿZ18 c%-! Q-| Do[+,B3ShXe.7խЌq# ,OJp羽Pʲ{PTHpX [z:T8# ,J` :eX )!rĤ]Y`sݷSa]+&/iQUI: 7@W^y%}h{ ;C!2sg3^oeE+zl 8 |F o2@?AG?W(. ͍,/$7FfL84DU/9S~x.e021tؙB ۔݀;"F+;y#P`(qwbnO XK*@gGf= +HȂ;keX#S M):pV\ Yal&:2.'q~|G|9?h֜. `O0?~L\8Ci(e@CCo_Kɫ|vjKt%}D|gRے p.gةtyaaA#$| )CDuN8s5ZIabl '+˘T/^LfM=J2}"_G*Tpbtp\dd*lVw%fgP/ :i|0-,+k+tȺa 踿ZRyy=Q纝` GA>->".%v\~vo{+Ա\[\(i# ~쭼H\,3{8l0 羄ۈx'=f;?#36)= jVSҮf!_]ֱ'3ac03MDр ;X 6IpdA_$Zrrj![A̗:Pp͔;!(H5]޳ww$t6`*61inH:vhyh'_}W&zF]qb[΁oEp.1 tnl)L&%W5,U@`etvIU\ ._d#rv<#z!5Ż-"KHBnb5d4nr!ȺX59蓖2I*[y}[CҮutϞtcr>Igu`&|wn5!T\b}u^9{!~wDK !5s9PS \0J~aˉ~t ) Xg'7vwbTzz=‹6*]QH0T!"{#X.6)=hzpZC`@uȡ.,[>Nm1'4h)~+ݫZ7f?sgk?"mЅA 7j&oR*;O?Q.;ݗˉ~{#C ?CI$fO>= .v^yK*wy Lb(ùvRq}HVc88Q&`46l TW`IUaZ/D%˙B2eY7e+r>I3T.Fptad?W)dpjF`$vco0hB_Lpj /.jv0(cȶoU5 , ΀m;Tvܤ>=4&El31Mvz\ҎR~՗,T~ k0ۜZʃTAT.t :T}+î"m 1 R/d)}S 5`J>w,*sh4xo ۈbHxx (!Ґ=#Rh,C?> :d1Ü 0Db@F:.ؿ{Hmb:aèM$3ɝ!rEGG)#` DWĊZ|J .Ge#U9@4np/C7x[S}5++D]6>5K͐هg̓"rz/RJ 5XMwj "8؞VA$! *'^A?__=Y\݅ ;0:G/yh/,Ծ9?sܕ;qF`bJ5g犞e -!: r7um066yHu`їuE"Ua %>_CޭFK4eb`q>:'##*ܤZg5F4&RloMEt8,~}^Y^F@@fl1?//vUK@Y*X!z%O=ĠA)E_^Jvo_:{9SlC^VED4&a28~,$3&?GtAa1&U]1vVr\ ꩱ~o).{[54yG ޱD풂B{V)*_M,c|}]\ht zXI"7T@!t'dɿ{/aꔜEJ͠d^ndHP=^ЎbHo"lmm{85[_FsFLo,pC u1Ҏ#m"K5]oOOT&CDyu(66  šͯeK9 |z*Prnk M蓖UwgZwrYԢ E p4/p5nhiC*ԹF:%:{CUfF>o1Jf&UL,`fJCM^A˃5˕@Q;Y]_Ao t|S{q&{}J`=~3K\A?Ntdň %fX`#UaDܯpϻlkt"% 2yXTWe*]^FN"h6yW)䅞hA#;K! TUH‹m1lh ]frsrqq'WYz0WG[U Q#GW^_Ck|A 2_~5D@Ϫ$$g)~n_O̝MޝD:Iuy\ t93r=&y#nW͘fPֲ6/.#P3-$Y[߆%2~*kb VJ(0%qs( ={A>5W{0fq)ڷ05B󄻽'Z"]`\R;_I<%D/$#:T:y=D]kO #n]&Q"YkM +tݴx%T50fTlUB;U:tzRjR;gȽ+@u/G I !9<Dx{Ӝz41jgFFFZ\X {RfҶp'Fs9u(ǦdI!T =m@}$h`]Ͳ5c J!ۭot}'Odġa3LI$`<-*&Wmܡ ؏׏ntv1X^Y׿\Pf&Q\27V_0M2;{[gs[4i-Lz5:&MCj'رgg7HL@ &ԙ.lP82DcE:ngt`>8@Ud2-#ӚHL31]VsN@b՛,;,;|5Kh\RC>כxQ0I?/h:H$_J_o_k Ɵۏ Op<DOopΨ *py; *lv! D|鲢 bT6xU58^22sc10#XlZ_¼Q-<} GEaSCP]NL1`mw %&}$k?deu/k;Lf9NšV)ql$;⋤V,1E|;N奂'_ w6Ϳ',vn@ 9"IGO e#e>@tUS|n餠`B]I5yu)zt~ A*dLw&]]VuSLO+/|L[1Eq4ft}jALp0D5-16AVd#[?2W zBtxJ(pQQL #B'SaxWs慛(a'J3u]o:oCa" `$n>n:31W< *(7|DMD.E4Ȧl%0xHQcv0B#:U7Z/qUIWQg @ ^#^O?>9d2ɲ;ob"QĪsUw#Mcj@-0{w&ݓ]X]#/ؿNXFQ;A|/9JH@:ſI^q=DmsP,3ţ/'o%:I<.5]TnS9r }n] `hQ,j$.FFNб?Ljc1WO- _oĮ?]Z@LsaN"6"=hfc iw5#@ZгrvCnߘ~َÞ߈%9THw͒ԉ94b7p^`,@zzŞkAtp~`-Im2RĞ>/{j+|Xfz )`68"aGEk\"qH@u`dz^ZA vŘSOT4-!Å yu#UWL͂xYqXa-"HgTlGo X0) ot`nZBI[JT?} Vlݠ3{nXt2H%W(b__7pC0p / =g?fWqPG<HY!|Mxߢa*H  <dF̃4VZ3%Їs q'g7'&7$z1ZL9 P",'k*QQ0U9m2f5UIέo[bQ:rD|;v.I+`&FGHGr7I[mdDi*@޽O?u06 Uv$+a8B΁~Qb}#c 5%Grx I&^g=`Ͼh+v ZsދbwǗix}jw=ˁA`'$Cϔx.wuqqTVb^kmg0nӔN`'tpATaG(躲a|ȉJJJ۔_4[ۇ TiZJi=b0&xr:0ҭЌ%cb5/*%ٳ4e4҃ArE <3Y|f !|[?sNuEg9OƌCdZ&PwO<.;IRqЋg;(sXJ p?v &4ѽo%z&Yvul5&]m/Ov k"u3cwC}^/H9:jM*cv&F&d =P"B ģ>*$&Mʽt 'j@7S%u §)Q]4=BEP|.ŗ/.{$|Xe}+f*>P.k_`ryADd%d|Ά;;6PLI%)#Ġݤx ~x$PEh3OWUmUnd<"WOz6{aC L yһrGSwSI$#Lm@SUȣ[z|5ԧ>Ua6 I (R53I@~Y0=qվ,Le%>-*gVl|?yV1aж>J(4FIIQB =.D šS YoUQ' slL $gx3)my#*;VKrVS'1/QH*B ]cHFB̍]5c (.q4+^hn w0B5yE˛ #:/WO /Fz O&U0LW3D0ЙTb)몊0-x0B7U*YYEJ${_);&|Q{d`%IHFQ|"LQ?~4X!lH%8 uGDK(# k @Dfޞ&@7ŵvXXфy[WdXm΅@Zlm0 bd;B t3A '! hM/3 ˭2SG[&]$TMѳ gz^[ IaN IQ~1 _?c//!vD)6tXiIu?E:!wTM1*lHz+sLZg;er2!l-{bu' 3j/;MM41S}DXVvC6IhX!wy `[tUp+b(kIbܳ Zޥxg+H6PxӛA&Y'ܳgw9՗ookVs\>km*@/TpIc&C[^&q9GZDwjO_[ 7>rRmk=>Mfuryd[?WZ܆$!T7  uڊR:]@*_f^WKkci8'2-ɭ%}yt@ %? Ѷ脺:\obUPOˎogC~i|;ǻHTf-VC]5Ou%>@>t$(z_|Q>=UAz z\GMe62.JgE@zqpC0by{x1 @B~1<_콲x}tdX@z OԐ&4!ʨOh+Y>B6Oz"Tڎ@Uj G|0j<]Gc iRHg[W/*61SxHa/_/3JRu!V)r:l,c@{}dk(v !gh *p NF c4#<\,ϒ Я7nje9T׳vIDTl %#W*P l\ 8{t_nF.tX}__TB5kEEC.KׄDar M]w]dHwtv$Nǁxi^LJG"46 m5GX8U^K’FN5,vϻns]mOKF}J4Ϸ fF Oέܪ47I "woW3Z[;*LzpE;Ĥ$f$w8 ;0Fai=WO*I7/46Tۗw3elX[@ *{7ˣ'@^ £7`mro#r./Gu?`QgE]aaW>6.q"ǮAMs8Qۉ$/b1%yl1izx%]mw3L/MZ3t82*F^% 6\؋|oN}c#ui%,tm e㽯瀸*)>peW{vAB4đH 9^?S2QlW@LӷR_F yKl~ `cX1ֱގ\$G mDMC?χ^v"R]#촍$6y3tlm~_vz(ӀDm5r;AW $ ѠpV/!b^Q4Ql3:GtIU]au޽g{۟<1HΑ҉C9Y0goɇ23xեBH#0 \)J;#Xlw@@M/.ɤµOLAwPO<^G`D"ka jh@u=Yz/mSdP[G[N f  T{@p 5>>%4FI.XOGvs$ϱ$ ijh|(k!Cv\s'7jqfӡ$Ԑ@U'"xpShͨMDTG5FIigp29:K^hQod9%v3C܇T#U Vm<#,yȠ<3sҿ*F'צdz~8*/_- U83&%gT H!!vsպIxlx3+Dp8ty**.3&!L + '_3㶞_?ݎ1}N($i [ 1Уe&pBt0ENZ::^Upc]f;dZe?76-BuirTejEP6? }\1&`@U: P@`r<]tcUB=8^I:>x#DpWLHM:/ Z,<3 Y{BS1 I523IBuSi;pRO.1ܬ}%RSt=gW1_X'@S݂TDFP3d'G!l*sz(_At ȝ#[oK6{(|Կ z.DfJ,htZ1s =L!*792'FMm1 ^ )$:@^L| P:(EE vR8JW~; (VS T 0ϗ,i4HVߗ"Rl *0iYJ'R ~?sVY',ح P=`MرskVQQ`PrKڋ=x`<7EupRX%aGyE q$C'c_cw!x^T1ΣUz8d?;49H`}ܝL}bnc_U)l7wkRBl!I2hSt]#/T+O֙ 6$=Z| CF)zvC&BO0::zF Dg ]D9!=Qpqbf]]v]J^.q"Q8Py2&ɧq~aPՆγ}Wm&-)A+M mC]C:mIavߪv\nbHY?/FEhK !* X* Q->Q *:|߷'g TkMWi@|,@`lүTJOd7FCz̖Fz.]uˬ0.frF:?<gs54_YtDF1qS27^Ẇ"OQ}Owv̠QoCoFB.>R(f_ h:лNcP^wn"cA}BTHN8ZA #X(ӵտqn~Pw#NH*9+^w9*e~%9N//FۜdLE&=~e$őNy`V]^fRX%{VMB}sG"\|3UuPt>܃nB@d[pߵ18A5Rr;,<'pFxpWh/gz}9/%,bzeO_zyZ]xյǑrѺpQe9!Ҹo0wppa ,?#on;k#6S/zcgnJfi4r(sq3((E67ho)<.FX_#$s{ WlHH-,$ICP؞K"t@I(2oF OH,ɭ wbԠ+-7YBwE]˓Z$#vד6= A ~ư6/ Kg؞]{O"ɥB(m"qԹ^E9Qj4P|+ ( !=)M}$m|w1D}wx!ﺻci)!u%9:$ԁe0` p g6Mj%':Y1 ـN;Sͷ<1/u%ĄщKek,@/cNƫ):f?4e^bkŜP#?|S柊Ud72Uf艼^$#yaetA䀎ϟa$GPWU;oFX fLߙ] i>6&Jbg;.kG\?0#Vfl ; OoQt]LUF]-\Xb(){k3#0~{^!S@#rL9 / gyP X5 V 2|XQ@}"sq ll&+@dt[. .P{9C@7]aXKqi%HScQ>1ߋ4A@ S{ѐh\tU@((Sc] Rfdz ?j# G_^ q!+# =JϿ [N At][* _Uҹ2rM6n "YZdBQ%l]&ߑV|1{/ѱUJSp(@k 3.ʙ |oR?zqll)* 3ȉ7شp! "X<6]n}xW}ZqqK ZF tDcxZGnFj;d߳ۿ>{ 'lU8B#gw6y.G '<%Y+ '\,%lU$(?vTnmX~~~Mӯu?gĒx f!'CI5XD),2~O}A#X9 7b`%[̭ |}s.!"_m{kRl)r'xIi;2!qe$nި3gμ1Lf /6/4z |]h/y4lAl_P 2*\]}g<ȣJK%L)}H{~m r@KfF7yW[Bdbgy8+xi%W.(P^ {Àʁb \#AS> ! oqCZ8@_+ț~"ԧ)OLE;1m:~LhT$$N0@ >x-FXS_&p`PC `.qTqe?Jp?` *B(=_ D4k%}W(U`šBOÿG& nx$(\_B bC ?\=aY<%M+Ȓ?"?((x|׍ot(өA[&Xs `5G _s נ{u-@#iȕNxr!~u9j>Ɍv鑛dGeENbJ|D3,`”)v8j:{/W {YF5n(<\L=v JQʫ<Ѐvib3ˋ q؜Q=t02zFk, ǜH^Nu:3ڢ\۳K{GS\HQo_u=䐮6 ڀz:AZ=+uv ̋Nƿd@W.d@ܩY@9gi<?քC+Q=Vr aTٯMԸq_ʻCrNO L=03xf <034:f0-t ,/.|.0(o 3`780 !`Ve(cKT _ůbz }N9&a:Dy(E\1 pb&i p&un(2람Igh| F83åzq^$ `(WO#_֣,@;q`Jly TPbd uprJ'J+L˟ M4HUY )^Yp'0[CoT{b% d1x8e%"3nqoؽZCٳGznW:Ks4%;v]%?b@ @MR`5Avs=|#SuXka w_qIWE,RSI(tl H(}U!=%LשT q|Crڎ@|Eur שS#gpԂ@DR[&WƕzUMwA5i#'ItbU'p~? b VtZ8b.Cl!)HO\HֱmÑe8iC pJ kPcL#g3uZv QRp*C/!zd' v Λi+ ibȑCvW9Pjl~OG8G`PbM*}`D rKpe wSud[OׁI#tnbwX`Y˺q16]6*"B#SkYDi]ZEUqŃn>tg/|tvt>fh#0#񟌒?Keqc)Q PidNzn"uP`Mhlۑ`?w-ѣ7Q8bweBD;ZߣecV 12Ѐ}~<}"+"G|rȮ{.1U#UJ*Bc!;$X>$36 Ynڗr5߯,eդ%nrypg9!غoԍf0ˆb޽G 0W $Q" t ׎=*zZуmTG z^3}ƶK #D\ %Q V#zqf ̃ʄS+[0^vP%`fO/`8',9IQ] aAINkꉗbҪ/jT=+@VȳezeMPb.څ9gH#[fA{kB+Q nIO>KZ ШDlt̰F֏F3A{`@07FUEtz0|s(&J"QEsfq=pU\EE뎣x ulFfʾ{^Ow' Ch_ ovLVV'˼fQmda6XXl$mu5"[sc';ԛ`4p\<~WBԾtqV|"FG'fF4nZ{D⿉N|or@2n$rݞ}Zh$3Y$ǯGI?ClٺaWf wLkہa.hBD}d;Sǰ~Z_; [[oA3mjr%pO] mn0wmEt䣿Eܺ\!P&4N@G3w d!I^g VM?jl5O$ | fe[qc(# 6&EWo-kn6#8?<޷n7/Jsg STGi**(oYt$z~{uԗ_?|ЊJ3V]%vy%Va2Bkˉ98zh*j溺)/1A^= p6 = e1x3ۤ;~<p{1"4y]ذ0Q'V3Q.ʨ oPqjCx~6|wipLzOjyTA$sZku %\b~2~ζx( xz[$A4s\zZ@$%Ѯjv{`AX {_ _Q/F4I@a Ѓ6틨`a>y7[n㎳h,D@s(E*w˓7E9w%Jdep"X?ʛ)`_yҾG#nuՆ@ elQRh Ҙ}k*  $1gtn ="A$@\_gOH+2:%{H3Jg"Y?dί8z:֒o~V\'mSt rgȑ{OVd~r(p TaSeQ\c9jEJpā5:;b1 ܫ9%F+Ԟ$ t Y®, 23o'~.p:@t9XnT {:8M5Cz5m|w\tL?m_I1vGS=wVoPCsY®eRIgdO?sEK uvӝ;)xNvPLxnve`N>,FFQ |p͟\s<טj?m(o~Aŧ)2`[C$Yjx?Ol@;6׍Oz_{{eR(2a@B݄7 !PDz#YQuSd,b_~w|ԷyX<7oWۛ7W_V vi]˒,RH)1sk1,& >w3!ʊus5a52le$B-@B}-g"wȽNoG霴JW)6p/Žz޲ ^G47<{=p,Re afou>cf$u .c-sMZurJ Qp'쐊1j`cq]ɉǁAؗbH<~~OއгhmtV$FF! k͢ 7[aKVi(ĺ tmήP?]Y={g?AgYQ#uzw0:EGnUӄh珷 BR(2rh$ _ Gx{hIkdwf7_-m;.ZB(CQb[]5,8MQAj̛mUKz `7+)eW 9߳وp'GX+fKFHF-!{܊T ˁ݋\]I]6Ƃn, gM QurCk&]uQ\*aGb@.֋3Vl+·q5'O_b-ӛ6L` @|dt@M62,Y>\j@n@_ s,ѕIҟÑo@od;!^^@Gh"ʎ7̰2I$w7{݀Go'[bZvD?jsb.\AYٮ:Žx_BdT^O,* <_~N?Z8p˞ztΪpDHY!U=k mGjBK/0itqw.Px7Qpߙi@@ܯg*t>QJZݧ\m۰IV%-o\.GI6q>wv0 ^W3%Rq7&>R[\i;Nl:'#ȷ Dk=eD@#!t!8Te`{C@fb $'YX@hEi@nRi'BL@>$N*M6c=< /.ޗY(1^36!, ̐aD]Bm01!)WC5 HA`(yHEfDޤ@G7Q"Gx#sĸYP:J Վ:@z̓kGN>dxzj[``gVy{34˟ ^ ؼy[־`$?LR  =7⺺ux|CG/垟wotx_&k}FGc r0di~n Z DWSpyCπ,HG?HQϷ 5J6XSwffzCON@xD% Q?P( \W0)|d_WqHu` p^#Ԩ^)&Ͻ>8ꫴ^lk90o=^Gw-䏅糳v?֞$Mg>ס7SJL  k °s!2^M`a Bz5=(ɦ3:" )#@/(ib,uX p6Ɩ{U]eNݔ;B8MG_E-xou0'!@'!B'!C(!E(!G)!I*"K*"M+"N+"P+#R,"U-#T,#O,#H*#<(#/&$%$#799!#$!$$$$$$$$$$$$%%%%%%%%%%%%%%%&&&&&&&&&&&'&&'&''''''''''===''''''(('((((((((((())))))))))))))))*)************+++++++@@@+++++,,,,,,,,,,,,,-,--,----.-....//-//////0//0000/0000010EEE111111111112221222322322434444444544444455555555555555555III66656776777777730# 1# v3$ 5$ 5% 7%!9&!;&!S=7>'!@'!B(!D)!F(!G)!I*"K*"M+"N+"P+"S,#T-#W-#[.#^/#`0#_0$X.#aA99($-&$"$$!$$"$%$%%%%%%%%%%%&&%%&&&&&&&&&&&&&&'''''&''''''==='''''(((((((((()(()())))*)))))))))*)******++****+++++++++@@@,+,,+,,,,,,,,,,-,-------..-///..////////0/0/0000000010011FFE111111112221222222333343434444444554554555555555555555565JKI7656777778778777888884-"/0# 1$ 3$ 4$!6% 7%!9& ;&!S=7>'!A'!B("D)"F("G)"I*"K*"N+"O+#P+"R-#T-#W-#Y.#[.#]/#_0$c0$|H:h2$c1$Y/$D+$0'%$%%!$%#$&%%%&&&&&&&&&''&'&&'&&''''''''''''==>(((((((((((()())(()))))))))*)*************++++**+++++++,,AAA,,,,,,,,,-,,,--------.......././/////////0000000011011111FEF111111122222222233444444434444454555555555555555555556666JKJ676777777877878888888889{899A96F3(%."2# 4$!5$!7$!9%!:%!;%!T=7?'"@(!B'"D)"F("G)"I*"K*"M,"O,"Q,#S-#U-#W-#Y/#[.$]0$_0$a0$yG:e1$i2$l3%p4%m4%^0%G,%1(&#&&"%&$&&&'&&''&'&''&'''''''('(((=>>((((((((())()))))))))))))**************+*++++++++++,,,,,,AAA,,,,,,,,,--,---.--.........//////0//000000000000110111111FFF112112222223323433344444445545455555555555555555556766767JKK677787787888888888889989999999 &<&-%9>6(.%#)'+!)+!-*!1)!4)!8(!Q>7?'!B&"C'"F("G("H*"I*"K+#M+#O,"Q,#S-#U-#X.#Y/#\/$]0$_0$a0$yG:f2$h2%j3%l3%p4%t5%x6%s5%c2&E,&,(&!%&#&&&''''''''''''(((((>=>(((()()))))))))))))*)***************+++++++++++++++,,,,,,AAA,,,,,,-------.-....././-//////0/00/0000000100000100111111FFF212222222243333444444444444554555555555555555555665756777KKK7878877878888899888889999:9;:;;:: &  ( '%/%7A7%2%. 1! 3! 4!!5!#5";L7'6!-3"31":."@,"E*#J)"N*#P*"P+#Q,#S-#U-#W.#Z/$\/$^0$_1$a0$zG:f2%h2%j3%l3%o4%q4&t6&w6&|7&~8&t6&Z1'9+&&''"&'&''(((((((((>>>((()))))()))))*)))*)************+*+*+++++++++++++,++,,,,,AAA,,,--,-----...-////././/0//0/0000000000000111111111111211FFF222222322343344444444545544555555555555555556666676667777LKK788888888888888889999999::::;:;:;z & (!!)!)%0%7B7%3&/ !2!!3!!5!!7"7O8!;!!="!?" @"$?"'>"-="58#@3#H/#P+#V+#X+$Y-#[/$\/$^0$`0$a0$zG:f2%h2%j3%l3%o5%r5&t6&v6&x6&z7&8'9'9'n5'N0(-('"&'%'((((>>>)(()()())))))))))**))*********+++*+++++++++,++,,,,,,,,,,,AAB-----------./-.//.////0//0/0/0000000000001111111111121111GGF222333443443344544454554555555555555555565666776767777877LLK88888888898988899999:9:9:::;;:;<;<;;2 % 9 & ( )! + *&2%7D7&4& 1 !3!!5!!7"8O8":""<"">""@""B""D"!G#!I#!J#%H#,E#5?#B7#N2$Y.$_-$a.%a0%b1%zG;f2%h2%j3&l4%o4&r5&t6&v6&x7&z8'}8'8':';';'~9(Y2(3*(#'(:=>()))))))))))))**************+*++++++++++++,++,,,,,,,,,,,,BAB----.--.-.-././///////0/000000000000001111111111111222222GGG323434434444444455455555555555555555665676666666777778788LLL8888988888899999:9::9;::::;;;;;;;;<;<<< % ' ( *!!*!!,! , %3&7E7&7& 3 !6""7!8O8":""<"">"#A""B##C##F##H##I##L#"O$!Q#!S$%Q$.L$%()%()))))*)*********+***++*+++++++++++++,,,,,,,,,,--,---BAB---.././/././////////000000000010011111111111121122222233GHG333444444444445545555555555555555555566677776777777787888LLL888889998999:9::::;::;;;;;;<;<<;;<<;<<<2 % ( % & (!!) !+!!,!!.! . &5&7G7&8' 5!"7"8O8";""<"#?"#@"#B##D##F##H##I#$L#$N$$P$$R$#U$"X$![$"[%*V%6M%_X;\7%j1%n1%o3&p5&r5&t6'w7&y7'{8'}8'9(9':(;(<(=(=(>)S?r8)A.*%(*%))*********++*+++++++++++++,,,,,,,,,-,,-,,-,---BCC-.......///./////0//0000000010010111111111211121222323242GHH444444444454545555555555555555565666666677777777787888888LLL898999998:99::::;:;;:;;;;;<;<;;<<<<<<<< % r &!!' ( !) !+!!,!!.!"/!/ &7'8I8':'!6!8O8";"#=##>"#@##B##D##F#$H#$J$$L#$N#$P$$R$$T$%V%$Y%%[%$_%"a%8y;(_%7U%NF&c9&r2&w3'w5'w7'y7'{8'}8(:(9':(;(<(=)=)>)T?@)@)s9*A/*&)*%)+**+++++++++++++,++,,,,,,,-,--,,---,----CCB.././///////////00000000000001111111111121221222323343332HHI444444554554545555555555555555656767677777777778888888888LML999999999:999:9:::;;:<<;<<<<<<<<<<<<=<< $! %!!&!!'!!)!!+!!,!"/!"0!!2" 2':&8K7'<'7N6";"#="#?##@##B##D##F##H$$I#$L$$N$$P$%R$$T%%W%$Y%%[%%]%%_%;w;%e%#h&"k&)e&:Y&UH&n9'{4'|5'|8'~8(:(:(:(;(<(=)=)>)S>?*@*A*A*u9*A/+&*+(*+++,+++,++,,,,,,,,,-,,,-,,-------.CCD..//////////00/000000001001011111112222212222222333444433IHI454454545555555555555555565555676777777777878888888889988MLM9999:9;:;:;;:;;;;;;;;;<;<<<<<<==<==<=== !"! "!!#!"%!"%!#&!$'!%(!'(")(",'!.$'6*8I:=S=!; #>"#@"#B"#C#$D#$F$$I$#J#$L$$N$$P$%R$%T%%W%%Y%%[%%]%&_%;w;&c&&f&&h&%l&#p'#r'.k'GX'gB'|7(5(8(:(;(<(<)=)=)>)T??*@*@*A*C*B+o8+5-+$*+*,,,,,,,,,,,,,----------/.-...DCC/////////00/000000000011111111111112211222232423433344444III445555555555555555555665767667777777777788887888888899998MMM999::::;:;;:;;;;;;;<<<<<<<<<<<<=<======67876977:77;77<87=88?77A87B87D87E87G77F<>LWZd=CK7CC9JA9P>9U<:Z::_8:`8:b9:c::e::f::i::k;;m;;o;;q;;s;S>L>O>R>R?S?S>T?_JU@V@V@W@W@X@Y@V@wK@AAA:@AAAABABABBBBBBBBCCCDBCDCCNONDDEDDDDDDEEEEEEEEEFEEFFFFEEFFEFFFFFEGFGGGGGHGHHHHHHHIIIIHSSSIIIIIIIIIIIIIIIIIIIIIJJJKJKJKJKKKKKKLLKLLKLLLMLLMLLMMMMMMWWWNNNNNNNOOOONOONOOPPOOPPPOPPPPPQPQQPQPPQ!!"!!#!!$!!%!!&"!("")""*"",""-""/""0#"2!!2==P98L('>" ;##=#&<#*:$/6$8/$A)$H%%P#%S#%U#%V%%W%&Y%%[%%^%&`&;x<&d&&g&&h''k''m''p''s'(t''w($|(#(0v(Q](wC)8)9)=)=)>*U@@*@*A*B+B+D+C,E,F,@,O3,(,,(+----------...//..//DDD//0//0000000000101101111111212222222223334443444444444554III555555555555555555655666776777777777888888888989999999::9NNN;::;;;;;;;;;<<<<<<<<<<<<<=<==<===>==>>>!!"!!#!!$!!%""'""("")""*"",""-""/#"1#"2##478K('<99N((@"";$#?$#B$"E$"F$#E$(C%/=%;5%I-%S%%Z#&\$&^%&^&&`&*U?@*@+A+B+B+C+D,E,E,G,G,>-@1,$+-,-.......//////DDD000000010000011011111111211122222223333334444444444444555III55555555555556555666777777787777888888898888899999999:;;:NNN;:;;;;;;;<<<<<<<<<<<<=<==<=====>>>>>>?>!!"!!#!!$""%!!'""("")""+"",""-#"/##0##3##499L""6((=::O)(@""=$$A$$C%$D$%G$$J$#L%#O%%N&,I&8?%H3&U*&`$&c#>>>=?>>?>???"!"!!#!"$""&"!'""("")""+"","#.""0##1##3##499L#$8"!8((@::P()C#"@$$D%%E%%G%%I%%K%%M%%P%$S&#V&#X&)S&6H'J8?>??>??>???"!""!#!!%""&""'""("")""+"#,#"-"#/##1##3##499L##8$$:#":((B::R))E##B%%E%%G%%I%%K%%M&%P&&R&&T&&V&%Y&#]'#_=@p'9M(O;(b,(n$(q%(r((s((u((x()z))})))))))********%*?@Mz+R+>,@+C,D,D,E,E-G-G-H.J.J/L/J/s=0./0+/0EED000100010111112111222122333333343324444545555555555555555III5555566666767777777778778888888888889999999:9:::::;:;;;;;OOO<<;<<<<<<<<==<=======>>>>>>?>>?>???????!!""""""$""%""&#")""*"#+"#-##.##0##2##4$#599M$$8$$:$$<##<))C:;T*)H##D%%G%%J%%K&%M&&P&&R&&T&&V&&X&'['&]=;w'$e'$g(,`(AN(\6(p')w$)w')x))z))})))))****+****+++?@&+++Sx,N,>,B,D-E-F-G-I.I/I/J/K/K/N0F0E40;CE010111111121111222122322333234342444444454455555555555555III5556657767776777778778888888888999898999:9::::9:;;;;;;;;;ONO<<<<<<<<<<<<<=====>==>=>?????????@??@?@!""""!""""""""#""$""$#"%#"'##(##+##.##0$$2:9M$$9$$;$$=$$>##?))F;;W**I$$F%%I%%K&%M&&P&&R&&T&&W&&Y''['']<=v''b((e(&h($l('l(6^)QE)m/){%)~&)}))))*****++*+++++@@,++,&,0,eo,G,?-E-F.G.I-H.I/J/K/K0L0N0K0}PE+01-01112121112222232332222344444444554554555555555555555JII656666776778877778888888888888999999999:::9:;;:;;;<;;;;;;OOO<<<<<<<=<=<====>==???>>>?????????@??@@@"""""""""""""""""##"##""#####"##"###$$$#$&::>$$*$$/$$5%$9%%>#$A)*J;;Y)*L$$H&&L&&N&&P&'R&&T'&W''Y''[''^==v((c((e((g((i)(m)&r)$u)-m)HV*j8*'*%*)****+**+++,+@@,+,,,,*,%,<-yg-D-C.H/I.I.J/J/K0L0M0M0O0dED1=31)01111222232332243344444444444455555555555555555556KKK676767777778887788888889988999999999::9;:::;;;;;;;;<<<<<?=>?>?>?????????????@@@@@@""!"""""""""##"##"##############$$#$$$$$$$::9$$#$$$$$$%$%%%(%%+$#1**>;;U**N%$L&&P&&Q&&S'&U'&W''Y'(['']==v((c((e((g((j()l))o))q)(v)%{**x*Cc*h@*)*&**+++++,+,A@,,,,,-,---)-(-L/W.B.G.I0J/K/K0L0M0M0N1dFQ1L2X91*02122323343443444444444555555555555555555555556KJI776777777887887888888888989999:99::::;:;;;;;;;;;<;<<<<<<>>>?>>??>???@@?@?@@@?@A@AAA"""""""""#""##"#############$####$$$$$$$$$:::$$%$$$%%%%%%%%$%%$%&$$#"+*,<;C*+<%$C&&M&&T''W''X''Y''['']=>v((c((e()h)(i()m))o))q))s))v*)z*&*(*=l*eF+++&+*,+,+A@,,,,,,------..(.0/iy/I/E/J/K0M0M0M0M1N1dFP1R2Q2~B3,24.32443434444544555555555555555555655677667KJJ777878788878888988899999999999:::::;;;:;;;;;;;<<<<<<<<<<==>>?>>??????????@@@@@@@@@AAAABB""#""""""##"###########$##$$$$$$$$$$$$$$$$:;:%$%%%$%%%%%%%&&&%%&%%&&%%%$+**<<:++*%%+''6''F''S('[((^((_>>v((c((e))g)(i))m)*o*)q)*s)*w**y**{+**'+'+=q+hG+*,',+AA,,,,-,------..//-/'/C0`0E0I0L0L0M1N1O1dFP2Q2S2T3H4C74,34544444555555555555555555556667666767KKK788787888888888888999999999::::::;;;;;;;<<;;<<<<<<<<<<<<=QPP====>=?>>>>>?????????@@@?@@@@@@AAAAABAB"""""""#############$###$##$$$$$$$$$$$$$%$:;:%%%%%%%%%%%%%%%&%&%&&&&&&&&$%%++,=<=,++%%#''%'(,'(9((K((Z>=z)(f()f))g))j))m)*p)*r)*t**w**y+*{+++++*+(+',?s,oH,*A=-,------...../////0/+0-0g0N0G1M0N1N1O1dFP2R3R3R2U4P4O:4)25455555555555555555555655666577777KKK787888888888889899999999::9;;;;;;;;;;;;<<<<<<<<<<<<<<<=<?>>??>??>?@????@?@@@@@@@AA@ABAAABBBB""""############$#####$$$$#$$$$$$$$$$%%$%$;:;%%%%%%%%%%%%%%%&%&&&&&&&'&''&&%%%,+,===,,,&&&'(&('%((&((.>>U((V))f))k))l)*m)*p**r**t**w**y*+|+++++++,+,,(,(,EtAW-(-*---..//.////0/0/00/0(0G1a1F1L1N1O2dGQ2S3S3S4S4V4S5rA5/45345555555555655665666676677777KLL888888988888989999:99:::;;:;;;;;;<;<<;<<<<<<<<<<<========PQP?>??>?>????????@?@@@@A@@A@@AAABBBAABCCB##""###########$##$$####$$$$$$$$$$$$$$$%%%;;;%%%%%%%%%&&&&&&&&&&&&&&&''&''&''&&%%,,,===,,,&&&(((((((('>>;))())6))M))c*)q*)s**r**t**x*+y++|+++++++,,,,,,,,(AA-Vj-9.(/-.././/0/0000000001*121z1N1K2O2dGQ3R3S3T4T4U5W5X5G5/45145555655665766776777778887LLK888888889999999999:::::;;;:;;;<;;;;;<<<<<<<=<=<==========RPQ??>???????@?@@?@@@@@@A@AAAA@AABBBBBBBCB###############$$#$$$#$$$$$$$$$$$$$%%$%%%%;;;%&%&&%%&%&&&&&&&&&&&&&&'&'&'&'''''('&&&,,,===,,,'''((()))>?>))())'))&**.**D**a**t**x**y++y++|+++,+,,,,,,,,,,-BA-'.4.g`.1/*////0/000011011111/1*2W2\2H2eGR3S4S4T4T5V5V5V5Y5J5555046767776767777777888888LLL888898998999:99:::9:;;;;;;;;<;;;;<<<<<<<<<=<<=========>=?RRR>?>?????@@@@@@@@@@A@@A@ABABBBABBBBBBBCC######$#####$$$$$$$$$$$$$$$%$$%%$%$%%%%%%%;;;%%%%%%&&&&&&&&&&&&&&''&''''''''''(''('('&&,,,===,-,''')))>??))))*))))**(**&*****=*+]*+w++~++}+,+++,,,,,,,----CB...+/(/B/M/*/,000000110111222111*2<2v2`GP4S4S4T5U5V5V5V5W5Y5O5G96.47777777777778888888LLM88899899899::9:;::::;;;;;;;<<;<<<<<<<<<==<========>>>>>>>RRR???@??@@@@@@@@@AAAAAAABBBBBBBBBBBBBCCCC"#########$#$$$$$$$$$$$$$$$%$$%$$%%%%%%%%%;;;%%%%%&&&&&&&'&&&'&&&''''''''''''('('(((((('''-,->==---(((>?>*))))*)*)**)******+*'++(++;++^,+{,,,,,,,,,,----.-CC/.///./+0,/]t080)000011111121121132/204IN4P4S4U5U5V5V5V5W5W5[5T6P<7.57877787888888888LML999999999:::::;:;;;;;;;<;<<<<<<<<<<<=<<======>>>=>?>?????RRR???@@@@@@@@@AAAAAAAAABABBBBCCBCCCCCCCDD#######$#$$$$$$$$$$$$$$$$$$%%$%%%%%%%%%&%%;;;&&&&&&&&&&'&&&&&&''''''''''''''''('((((((())('''--->>>---===))*)*****+*****+++++++++++(+,(+,<,,b,,,,,,---,---.CC/.//////0/0(0=0X1,1-111121212222234323AIb4_4N5U5U5V5V5V5W5X6Y6\7W7X>7-58888888889889MMM9999::;;;;:9;:;;;;;;;<<;<<<<<<<<=<<<=========>>>??>>?????RRR??@@@@@@@@@AAAAAABBBBBBBCBBBCCCCCCCCDDD##$#$#$$#$$$$$$$$$$$$%$%%%%%%%%%%%%%%%%&&%;<;&&&&&&&'&&&&&&'''''''''''(''''((((((((((((((())((((-.->>>DCC(((*********+*++**+++++++++,,,+,),,),,>-,g-------...DC////////00010-0,1[192*2112222223344444II,4K4j5N5T5V5V5W6X5X6Z7Z7\7Y7]?8-68988888989MMM999:::;;;;;:;;;;<;<<<<<<<<<=<<==<======>=>>?>>>???>????@?SSS@@?@@@AABABAABBBBBBBBCBBCBCCCCCCDCDDDDD9:99:9:::::::::::;:::;:;;;;;;;;;;;;;;;;;<;FFF<;<<<<<;<<<<<==<====<====>=>=>>>>>>>>>=>>>?>>?>????===CCC\\]DDD?>?@@@@@@?@@@@@@@@AAAAAAAAAAAAAAAAA>BA?BBVCBCCCDDCONDDDDEDEEEDEEEEEEF>EUFgG?FDFGGGHHHIHIIISSIIBINIIcIiIkIkJmJlJnKnKoLqLnLuULBJMMMLMMMWWWNMNONNNNNONONOOOOOOOOPPPPPOOPOQQPQQQPPQQQPRRRRRRRRRRRSSRS\\]SSSTTTTUTUUTUUUUUUUUUVVUVVVVVVVWWWWWWWW#$$$$$$$$$$$$$$$%%%$%%%%%%%%%%%%%&%&&&&&&&<;<&'&''&'&''''''''('''''(((((((((((()(())))()))))))))***(((CCD???/..)))+++++++++++++++,,,,,,,---,---------)..*/.K/./.DD//00000000111111111-202nv242.4343445555II555515355P5T5W7Y7Y7Z7[8[8\8^8\9nC9.79999NMN;:;;;:;;;;;;;<;<<<<<<<<<<<<=========>=?>>=??????@?@???@@@SSS@AABBABBABBBBBBBCCCCCCCCCCCDDDEEDDDEEEE#$#$$$$$$$$$%%%$%%%%%%%%%%%&%&&&%&&&&&&&&&<<<'&''&&''''''''''''('('(((((()((()((()()))))))*)))**)*****>>>//.?@?///)**++++,+,+,,+,,,,,,,,,,------.--/..-....*/.3/0]DD0/000010010111111122202+3L4G4+44545455II55555525.5}5U6S6Y7Y7Z8[8[8\8]8_9^9wF9.7:NNN;;:<;;;;;;<<<<<<<<<<<=<<========>>>>>?>?????????@@@@@?@AASSTA@ABBBBBBBBBCCBBCCCCCCCDCDDEDEEEDEEEFEE$$$$$$$%$$%%%%%%%%%%%%%%%%%&%&%&&&&&&&&&&&;<<'&''&''''''''''((((('(((((((())))()())))))**))))*********?@@)))///@@@/0/***,,,,,,,,,,,--,,--,------..-.....//////-//(DDN00r00000111111121222232333,4@4_4-535555II5555555546-6m7b7T7Z8[8[8\8]8]8^9_:`:qE;DLN;;;;;<<<<<<<<<<<<<==<========>>?>??>???@?????@@?@?@@@@ABBTTTBBABBBBBBBBBBCBCCCDCCCDDDEDDEEEEEFEEFEE$$%$$$%%$$%$%%%%%%%%%%%%%&%&&&&&&&&&&&'&&'<<<'''''''''('('(((((((((((((())))))))))*)))))*))***********@@@+++**)000@@@000**),,,,,-,,,---------.--/...////.///0/0/00DEA00,00P111111111122222233333340404yz525155II555555667767-7a7f7T8[8[8\9]9]9_9_:a:`:yWO09<<;<<<<<<<<<<=<======>>>>?=>?>??????@@@???@@@?@@@A@@BAAUUSBBBBBBCBBBCCCBCDCDDDDEDDDDEEEEEEEEFEEFF$$$$$$$%$%%%%%%%%%%%%%&%%&&&&&&&&&&&&'&'&&<<<'''''''(''(((((((((((((()())))))))))))))****)*********+*+@@@++++++***000AAA001+++-,----------.-....//./////////000000EEE00000*11711q21112222223332434444535.5b5>5.II55566776677778.8]8j8U8\9\9]9^9_:_:`;c;sOcC<19<<<<==<<===========?>>?>??>???????@?@@@@@@@@AA@AAAABUUUBBBBBBCCCCCCCDCDDDDDDEEDEEEEEEEEFFFFFFF$$%%%$%%%%%%%%%&&%&&&&&&&&&&&&&&&'''''''''=<='''''''(((((((((((((()(())))))))))))))*)**************+**@@@++,++,,+,***000AAA111,++-------.-./-////.//////0/0/000000DEE11011111.11,11O11223233334444444555555,5I5LIA5566657677778888.8X8l8U9\9^9_9`:`;a;a=<========>>>=??>>?????@@?@@?@@@@A@AAAAABBBAABBUUUCCBCBCCCCCCCDECDEEEDDEEEEEEEEFFFFFFFFFG%%%%%$%%%%%%%&%%&&&&&&&&&&&&&&&&&'&'''''''==<'('('(('(((((((((())()(()))))))))))))**************+*++++@@@+,++++,,,,,,+++011BAB111,,+-....../-//////0//0/0000000000EEE11111111121121+22;22}433424444445555555555.5BJo6-6667767787888789/9T9n9V:^;^:`:`;a;a=>>??>??????????@@?@@@@AA@BA@@AAAABBBBBBBUVVBCCCCCDCDDCDDDEDEDEEEEEEFEEFFFFFFGFGGFH%%%%%%%%%&&%%%%&%&&&&&&&&&&&&'&&&'''''''''=<='(((((((((((((((()))()))))))))*)*************++*++++++++,@@@+,,,,,,,,,,,,-,+++111BBB121,-+/..//////0///0/000000000111FEE11111121222222222/32.43`4344444445555555555561JK7m6.757777888888889909P:o:W:_;`;`;b;b>>??>>?????@?@@@?@@@@@AAAABA@AABBABBBCCBBUVVCCCCCDDCDDDEDEDEEEFEEFEFFEFFFFGFFGGGGGG%%%&%%%%%&%%&%&&&&&&&&'&&&&&''''''''''''''==='((((((((((()())))))))))*))))))************+*++*+++++++++AAA,,,,,,-,,,,,------,,+212CCC333...//////000000000000011101FEE11111212222232233343344+43H45445555555555555666KG7077275888888999999:91:V:o:X;a;a=>>:=>??>???@??@??@@?@@@@@@BAABBBBBBCBBCBCCCCVVVCCCEDDEEEDEEDEEEEFEFFFEFFFFFFFGGGHHGHGG%%%&%%&&%&%&&&&&&&&&&&&&'&'''''''''''('(((>=>(((((((((((()))))))))))))**)**********++*++++++++++,++,,+AAA,,,,,,-,,,--------...,,-332DCC433...000000000010011111111FEF11222122222232242444444544.45B555555555555566765JK7570773858889999999:9;:1;\;n;Zg?V>8>>=>????@@@@@?@@@@AAAAABBABBBBBBBBBCCBCCCVVWCDCDDEEEDEEEEEEEEFEEFFFFFGFGGGGHGGHHHHH%%&%%%%&&&%&&&&'&&&&'''&'''''''''''('(((((>>>(((((()(())()))))))))*))*********+*+**+++*+++++++++,,+,,+AAA,,,,-,--------......./....-333DDD444...001000001010111111FEF11222222233244344444444555555155055v55555555567677KK77758088585899899::::;;;;1;cg>i?T?9>@?@?@@@A@@A@@AAAABBABBBBBBCBBBCCCCCDCVWWEDEDEDEEEEEFEFFFFFFFFFFFGGGGGHGHHHHHHHH%&%%&%&&&&&&&&&&&'&&''''''''''''(('(((((((>>>(((()())))))))))*)*)**)*******+**+**++*++++++++++,++,,,,,ABB,,,,--------...//...//./0//...444EED454///101111111211122FFF11223233333344444344454455455555455/55a555665777777KK778887809~87959::::;:;:;<;<;1e>g?g?g?j?O@3=@@@@@AABAABAAABABBBBBBBCCCCCDDCCDDWWVEEDEEEEEFFFEFFFFEFFFFGFGGHGHHGHHHHHHHII&&&&&&&&&&&&'&&'&''&'''''''''''(((((((((((==>)))))))))))))))****)*******++*++*++*++++++,+,,,,+,,,,,,,,BAB--,----.--.../..././/////00000/./445EEE5550//111111122222GFF23333344344334454554554455555555555555,56N6676777777KL88889897919{9::5:::;;;<;;;<;<<1e?g?g?g?j@f?`G@7?AAAAABABBBBBBCBBCCCCCCDDCDDDDEEWXXEEEEEEFEFEFEFFFFFFGGGGHGHGGHHHHHHHIHIII&&&&&&&&&'&&'&&''&''''('''''(('(((((()((((>>>))))))))))))))*********+**++*+++*++*+++,+,++,,,,,,,,,,---BAB--,-.--../...////////0////0000000///455EFF555000111122222GFG44344343344444445555555555555555555555657.66J67778778KL8899899898:/:~;:;7;;;;<;<<<<<<<<3==\>wQe?f?g?g?h@i@k@dASEB<@ABBBBBCBBBCCBCCCCCDDDDDDEEEDWWXFEEFEEFEFFFFFGFGHFHGHGHHHHHHHHHHIHIIIII&&&&&&&'&&'&'''''''''('''''((((((((((())()>>?)))))))))**************+*+*++*++++++,++,+,,,,,,,,,,,-----BBB---..///./.-//////0//000/00000000001///555FFF666010222323GGG34334444454444455555555555555555555656566777177D777778LL8889999999:9:2;;9;8<<<<<<<<<===<=5==pRe?f?g?h?h@i@iAmA^A;@B@BBBCBCCCCCCCCCDCCCDDDEEEEEWXWEFEFFFFFFFFFFHFGGHHGHHHHHHIHHHIIIIIIIII&&&&&'&''&'''''''''('('((((((((((((()(()))?>>)))))))*)*)*******+***+++*+++++,+,++,++,,,,,,,,,,,,------BBC--...//..///00/0//00/000000010001011111000665FGF666010334HGH3344444445445455555555555555555566656656677778728768788LL889999:9::::;9;3;;7<9<<=<==<===>>:><>ŪR^?f?g?h?h@iAjAjAnBWB:ABBBBCCCCCCDDCDDDDDEEEEFEEXXXFEFFFFFFFFGGGGHHHGHHHHHHHHIIIHIIIJIIIJJ&&''&&''''''''''''(''((((((((((((((())))))?>?)))))***)******+*++*++++++++++,,,,+,,,,,,,,,,,,,---------BBC././///./////0//00000000000011111111111111000666GGG687123III44444455555555555555555555555566676676677777778887588488LL89:9:9::;;;;;;;:<3<<5<:==========??9?YR~@_?h@i@iAjAjBkBnBmCqMC8@CCCCDEDEEDEDEEEEEFEFFEXXXFFFFGGGGFGGGHGHHHHHHHIHHIHIIIIIIJJIJJJJ&&&'&''''''''(''('((((((((((((((((()))))))???))*))*******+****+++++++++++++,,,++,,,,,,,,,,-,-------...CCC//.///////0/000000000000100011111111121222222111767HHG788GGG444554555555555555555555565665766767777877888888888885994MM999:::;:;;;:;;<;<:<4<=3=<===>>>>>??@?JR\@r@d@i@iAjBkBkBlCnCgCVGC>BDEDEEDDEEDEEEEFEFFFXXYFFFGGFGGGHHGHHHHHHHHHHIHIIIIIIKIJKIJJKJ&'&''''''''('(('('((((((((())()))))))))))*>>?*********+*****+++++++,+++,,++,,,,,,,,,-,,------.--......DCD//////000000000000000111111111111111222222232332112878HIHMMM333555555555555555555555666766766777877888888888888888996MMH9::;::;;;;;;<<<<<<<:=5=}=2=>>>>???????SS5@zAfAgAiBkAkBlCmClCqCaD>DDDDDEDEEEEFEEFFFFFFYXYGGGFGGHGHHHHHHHIHHIIIIIIIIIJIIJJJJJKKKK==<==========>>>>=>>=>>>>?>??>???????>???>KJJ@@?@?@?@@@@@@@@@@@@@@@A@AAAAAAAAAAABBABBABBBBBBBBBCCCCDCCONODDDDEDEEEEDEEEEEDDEDEFFFEFFFFFFFEFGFFFGFFFGHHGHGHHHGGGMMMdddMMMHGHIIIIIIIIIIIIJJJJIJJJKKKJKKKKLLKKLLLLLLLLLLLLLMMMMMMWWUNNHNNONOOOOOOOOPPPOPPQMQRQ{QGRRRRRRRRRS]]SSKTTvU|T~UVVVVWWjWMUWXXXWXXXYXYYYYXYbbcZZZYZZZ[[[[[[ZZ[[[[[[[[[\\[]\\\]\]]]]]]''''''''((((((((((()(()))))))))))*))*))***@??*******++*++++++++,++,,+,,,,,,,,,-,,-,,--------..././///.DDD///0/0000000000001110111111211211222222333333443444445334MMMIII999444555555555665666767677877788778888888889999999999NMN;:8::5;;;;;<<<<<<<======>8>N?Z?6?@????@@SSAA?A=A–BaBlClBlCmDnDnDpEmEbLE?DEFFEFFFGFFGFFZYZGHHHHHHHHHHIHIIIIIIIIIKJJKJJJJKJKKLKKMK(''''''((((((((((())())))))))))))))***)***@@@**+++*++++++++++++,+,,,,,,,,,,,-,-----,---.....././//////DDD0/0/00000001001111111111121112222223333343344444444545555HGH999III999444555667666676777877777878888888889999999999:::NNN;;;;;8;;7;<<<<<==<=====>=>>>6?X?K?:@@@@@@STABBB=BOByBgClClCnDnDoDpEsFfFCEFCFFFGFGFFGFGZZZHHHHHHHHHHHIIIIJJIJJJIIJKJKKKKKKKMLKLLL('('((((((((((()(()(())))))))))*))********@@@**+++*++++++++,,,+,,,,,,,,--,----------..././././////////EDD000000000101111111111112211222222223343444344444444555555III444999III:9944467776777787778787888888899899999999:;;:;:9NNN;;<<;;<;8<<:<<=<=<======>?>????3@z@<@>@@A@STABBBBB8CpCiCjClDoEnDnEpEpEsF[F;DFGGFGGHGGHZZZHHHHHHHIHIIIJIIJJJJJKIKJKKKKKKLKLMLMMLM((((((((((((((()))))))*)))***)*)**********@@@++++++++++,+,,,,,,,,,,,,,,,--------..-.-/././/.////0/0000EEE000000000111111111111122222322433444433444444445545555555III555333:::JJJ:;:456777787878888888888899998998:99:9:::;;;:NON;;<<<<<<<<<6<=>>=>?>???@>@7@@6AAAATUBBBBCCBC8CCdDmEoEoEoEpFpFrFqFgNF?DGHHHHHH[[ZHHHIHIIIIIIIJJJJKKJKJKKKKLKKLKMLLLMLMMM((((((()())))))))))))))*))*************+**@@@++++++++,,,,,,,,,,,,,,-,---,----.....///.////0/00/00//000DED000101111111111111212222222233332434444445455545555555555III555555454;;;JJK;;;6667878888888988888999999:9;:::;;;;;;;;OOO<<;<<<<<<<<<==5==U===>>>?>?>????@?@>@9@|@6ABUUBBCBCCCCACBDψDhDoEoEpEpEqFrFuFiGDGHGHHHHH[[[HHIIIIIIIJJIJJJKKKKKKLKLLMLLMMMMMMMLMMM((((((())))())))))))))))*********+*****+++@@@+++++++++,,,,,,,,,---,--,--.--../...//./////////00/000000EEE001111111111111221222322332343433444544444555555555555555III566666676555;;>???>????@?@@@A@;AQB^B;VVBBCBCCDDEE=D`DpEmEoFpFqFqFrGtHuF\H=>>=2>?v???????@@@@@AAABA8BfBDUSCCCCCCDDDEDD:EEhFpFpFqHqGsHtHuHrHcOHCHI[[[IIIJKJJJKKJJKKKKKKKLLLLLLMMMMMMMMMMNMNN(()))))))))))))************+**+**+++++++,+@@@,++,,,,,,,,---,,,---,---........./..///0//000000000010100EEE111111111112222323333434443443444445555555555555555555556IIJ776677777777887666<<===?>>>=??5????@@@@@@AAAAB@BBB8CVLCCCCDDDEEEEDDEBEˋEjFqFsHrHsGtHtHxIgIBGIZ[[JJIJJJKJJKKJKKLLLLLMLLMLMLMMMMNMNNNNNMN(())))))))**)*)*)***)****+*++*++++++++++,,AA@,,,,,,-,,,,---,---.-.-./-/.....////////000000000000111111FFF111212222222222333333333444445454555555555555555555555666JKK766777777787878888777===LML===788:;;:;9::;;;;;<;<;<<<<<<=>>>>??????=??9@@@@@@@AAAAABABBB@C>>999;;;;;;;;;<;;<<<<<<<<?>?>??>>???@??@@:@@Q@@@AAABBBBBBBBCCC=ViDPD?EEEEFEFEFFFF;FGiGsHsHtIuHuHvIwIpJe]\GIKJKKKLKMLLMLLMLMMMMNMMMNMMNNNMNNNNONN)))))))))*)*************++++++++++,+,,,,,,AAA,,,--,-----------....////.////00/000000000000110011111211FEF222222222333334444444445554555555555555555555555556666776KKK887778887888888898998999888>>>NOO???:::<<<;;;<<<<<<=<<===QPP======>>>?????????????@@@@@@@7BA^AABABBBBBBCCCCCDWLDE>EDFEEEFFFFFFDGHHهGnHsHtHtHuIvIwJzJq\@HKLKKKMMMLMMLMMMMMMMNMNNMNNNNNNNNPOPPN))))))**)************+*++++++++++,+,,,,,,,AAA,,,------.--.-....././//////0/000000000000010111111111211GFF222222333334433444454555555555555555555555665675666777777KLK787888888898898999999::::::999???OOO@?@:::<<<<<<=<<<=<===PPQ=>=>=>>>>???????@??@@@@@@A@AAAAA5BBBABBCBCCCCCDCCWVE>EE:EFFFFFGFGGHG?FsHoHrItIuIuJvJxJyJ][OKGKLLMMLMLMMMNMMMMMNMNNNMNMNOOOOOOPPO**))*)******++*+*++++++++++++,,,,,,,,,,,,,ABB---------.--......//////////00000000000111111111111111212GGF222334333433444444544555555555555555555555655776676677777LKK788888888888899999999;9:;;::;;9::@@?OOO@@@:;;<<<<=<<<====PPP>>?>>>??>??????@@?@@@@@@@A@ABBABABB==RQQ>>>?>??@??????@@@@@@@@AAAABBBABBBBC>QRR>????????@??@@@@@ABAABAABABABBBCBCBBBC8CCrCCDDEDEDEEXXFFFDFBFwF=GHHHHHHHIIII>IImJvJwKxKxKyL_}LkMGKMLMMNNMNNNNNNOONOOOOOOOPPPPPPPP******+**+++++++++++,++,,,,,,,,,,-,,------BBC--..////////////0/00/000000001010001111111212222222222332HHH344444544445555555555555555555555666667766767777778888888LLL888988999:9:::9;:;:;;;;;<;;<;;<<<<<<<<=;;>??>RRR??@??@@@@@@?@@@BABBAABABBBBBBBCBBCBBCCBCD>=RRR@@@@?@@@@@@@AAABBBABBBBBBBBBCBCCBCCCCDDDD?DDMEDEEEEFEYXFFFGFHG=HH>==>>?>>?>>>==CCCSRRWVW?>>@@@@AAAAABABBBBBBBBBBCBBCCCCCDCCDDEDEEDEEDEE>EEFFFFYZGGGHHGHHH=HI?IIIIJKJKJJKJCKLrLyMzMzM_|N|N~NoNHMONOPPPOPPPPPPPPPQQPPPQQQQ@@@@@@A@AA@AAAAAAAAAAABABBBBBBCBBBCBCCCDCCONNDDDDDDDEDEEDDEDEEEDEFFFEEEEEFEEEFFFFFFFGGGHHGGGGHHGHIHIHHSRSIIIIIIIIIIIIIIIIIIIIIIKJJJKJJJKKKKKLKKLLLLLLLLLLLLMMLMMMMWWWMNNNNNOONONONNNOONPPOPPPPPPQPPQQQPQQPPQQQRRQRRRRRRRQQQWVVmmmWWWRRRTUUTUUUTUUUUVUUVUVVUVWVVWWWWWVWXWXWXXXXXXSXYhYXYYcbZZZ[ZZ[[[Y[\[}[T[]\]\\]]]]]^\_ԟ___`h_```ka[`aababbababbbbbcbbbbccc+,+++++++,,,,,,,,,,-,,-,------..-./...//./DDD////00000000011000011111111222221222233333334333444444554III555555555555555555666766676777787888878888888888989999999NMN;:::;:;;;<;;;<;<<<<<<<<<<<==<==>====?=>??>??>???@???@?>?>WWWSSSFEE@@ABBBCBBBBBCCCCCCCCDDDDDEEEEDEEEEEFFEFFFFFF:FFGGYXGGHHHHIHIIIAJvIFJIKKKKKLLMMMEM}MuMzMzN`|N|O}OPmOJOPOPPQPPQPQQQQQQQQRQRRR+,++,,,,,,,,,,,-,,-,--------.../.././/////DDD/0/000000011111110111111212222221223333334334344454555555III555555555555566666766777777777888888888898889999999999:;:ONM;:;;;;;;;<;<<<<<<<<<<<=<<======>=>>??>>>?>??????@@@@@@@@@RRREEEUTTFFFAAABBBCBCCCCCCCCDDDDDECDEEEFEEEFEFFFFFFFGCFHNGH[ZHHHHIHIIHIJHJDIJBJKLKLMMMLMLMIMϔMuN{N`}N}P}OO}OjWPKOPQPQQQQQQQRSQQSRRQQ,++,,,,,,,,,,,,--,-----....-/.././///0/0/0DEE/00000000011111111111212222222222233343443444544444555555III5555555555655666577667778877888888888889989999999::::::;;NOO;;;;;;<;;<<<<<<<<<<==<<====>>=>=>?>????????@?@?@@@@@AAAAAUUT@@AFEFUUUGGGBBACCCCCCCDDDEEEEEEEEEEEEFFFFFFFFFGFFHHHH>HH[[HHHIIIIIIJJJJBKsKJLJLKLMMLMMNMEN~MvN{N`}O}N~PPQiPFNQQQQQQQQQRRQRRRRRRR,+,,,,-,,-,,--,------/--./..../////////000EED100000001111111111121222222222323333443444544444544555555III55555555566677777677787877788888888898889999999:;;;;;;:;;OOO<;<<<;<<<<<<<<<<<==========??>?????????@?@@@@@@@@@@AA@BBAUTTBBBAAAFGGUVUGFGBBBDCEEEEEDEEEEEEEFFEFFFFFFFFGFGFGGGHHGHHC[[HIIIIHIIKIJJKJKDKÆLCLLMMMMMMNNLNLNՑNvN`}P}O~PPQ{P\TQMPQQQQRRQRRSSRSSRS,,,,---,--,-------//...././///////0/000000EEE000000111111111211121222232323333443444444544555555555555III55555655667677677777777778888888888989899999::::;:;;;;;;;OOO<<;<<<<<<<<<<<====>==>>==>>??>?????????@?@@@@@@@AAAABABBBUTUBBCBBCBABGGGVVVHHGCCDEDDEEEFEEFEFFEFFEFGFGGGGGGGHHHHHHHH@[[HIIHJIJJJJKJKKKDMpLLLKMMNMMNNMNNENOvO`~O~P~PPQQeQHORQRRRSRSRRSRSSSS,,,,,,,,-,-----..-../////////////000000000EDD001110111111111122222322333334344444444454555555555555555III56665676677677777888788888888898998999999:;9:;::;;;;;;<;;POO<<;<<<<<<=<<<<=======>>>????????????@?@@@@@A@AA@BAAA@BBBBUUUBCBBBCCCCBCCGHHWWXHIHDCDEEFFFEFEFFFFFGFGGGFHGGGGHHHHHHIIH[[TIIIJJJJJIKJKKKKKLDMMDMNMMNNNMNNLNSNOa~O~P~QPQQwRPQRQRRRSRSRSSSSSSS,,,-,,-----..-.///..//.///////000000000000EEE111111211121121222222332433344443444454555555555555555555IIJ667667767777787878887888889889998999:9:;:;;::;::;;;;;;<;;POO<<<<<<==========>>>>??>???????????@@@?@A@@A@AABABABBAABBBVUUBCCCCCDDDDDDCCCHIIXXXIIIDDDFEEFFFFGFHGGGFGGHHHHHHHHHIHIII[[TIIlIKJKJJKKKKLLLKMEMrMJNLNNNNNNOOPOEOOaQPQQQRR|]SLQRSSSSSSSSSTTS,,-------./--/././////////0///000000000100EEE111111212212222322333344444443444445555555555555555555555JJJ766767877777778888888888899989999::9:::;:;:;:;;;<<<<;<<;;PPO<=<=========>===>>????>???????@??@@@@@@AABAABABABBBBBBCBBVVVCCCCCCDDDEDEEDEDDDIJIXXXIIJEDEFFFGGFHGGHGHHHHHHHIHHIIIIII[[[JJCKJKJKKKLLLMLLMMLMGNyNFNNNNOONOPPLP^Pb}PPQQQRRpRJQSSSSSTSSTTSST-----..........//////00/0/000/010000101101FEF111211222222232323233444444554455555555555555555555555666KJJ77677777778788788888998898999999:::;;::;;;;;;;;;<<<<<<<<==?>??>??????@??@?@?@@@@@@@A@AAABABBBBBBBBCCCCCVVVCCDDDDEDCEDDEEEFEEDDDJJJXXYJKJEFFGGGHHHHHHHHHIHHIHIIIIIII\\\JKCKJmKKKLLLMMMLLMMMNEN}NGNMOOOOPOPOPPGPbxQQQQQRRSaWSORSSSTTTTTTT---..-.//.///////////000000000000011111111FEF221221222223223334444444444455555555555555555555566666776JKJ7777777788888888888889999999:9::9:;;;;;;;;;;;<;<<<<<<<<<>>>>>>>????????@?@@?@@@@@@AA@AAAABBABBBBCBBBCCCCCCVVWDCDEEDDDDEEEEEEEEFFFFEDEJJJYYYLLKGGFHHHHHHIHIIIIIIIIIIIKJ\\\KKJKKDKLLMMLMLMMMMMNMLNLNlOHOOOPPOPPPPIQczQQQRRSSSgTKQSTTTTTTTTT-......../////////000000000000101111111111FEF121222322332334443444444545545555555555555555556676766776KKJ777888888888889898999999:99;::;;;;;:;;;;;;;<;<<<<<<<=<=<>=>>>=>??>>????@@@@?@@@A@@A@ABBABABBBBBBBCCBCBBCCCCCCWWWDDDDDCDEEEEFFEFFFFFFFFFFFFEKLKYZZKLLGGGIIHIIIIIIIIIJJJJKK][\KKKKKDLKsMLLMMMMNMMNNNNNENNFPOPPPPPPPPOQ_bҗQ{QRSSSSSwSOSTTTTTTTTTT...././/./0//0/0/0000000000010111111111211FFF222222333334444434544555555555555555555555556666676766777LKL777888888898898899999:::;;:;:;;;;;;:<;;<;;<<;<<<<<=<=====PPQ>>=>>?>>>?>>@???@@?@@@@@@@AAAABABABAABABBCCCCCCCCCCCCDDDCWWXEEEEEEFEEEFEFFFFFFFFGGFFHHGGGFLLLZZZLLMHHHIIIIIIIIIJJJKKK]\]KKKKLKKLFLLMMMMMMNNNNNNOKOWO_OLPPPPPPPQQQZcQxRRRSSSSSo[TNRTTUTTUU.///////////0/0000000000000111111221111112GGF222334343434444444444555555555555555555655656766676777777LLK8888888889889899999:99;:::;;;;;;<;;;<;<<<<<<<<<<<<<<=====PQQ>>>>>=>????????@?@?@@@@@B@AABABAABBBBBBCBBCCCCCCCCEDDDDDDWWXEEEEEEFFEFFFFFFFFGFGGGGGHGHHHHGGGLLL[[[MMMHHHJJJJJJKJJLJK]]^LLLMLMMMDMMMMMMNMNMNNNNNOPEPPGQPPPQQQQQQ_c`QSSRSSSTTjTKRTUTTUUV///////0/000000000000100011111111121221222GGG333233334443444445455555555555555555556656676766777777887LLL888988898989999999::::;:;9;;;;;;;;<;<<<<<<<=<=========>>>RRQ>?>??>?????@??@@@@@A@ABAABAAAABBABBBCCCBCCCCCDCCDDCDEEEEDXXXFEFEEEEFEFFEFGGGGGHGFGHHHHHIHHHIIGGHMMM[[[NNMIHJKKKKKKLKK]_]LMMMMLMMKMMNMMMNNNNNONOONPPIPlPQQOPQQQQQRQccJRR{SSSSSTTzUSTUTTUVVV/////0000000000000001101111111111122222222FHG344344444444444555555555555555555655765666676777878778888LLL8988989899999:9:::::;;::;;;;;;;<;<<<<<<<=<=<=<==>==>==>>>RQR??>??????@@?@@@A@@AAAAABABABBABBBCBCCCCCCCCCDEDDDEDEEDEEEXXWFEFFFFFFFFGGGHGGGGGHGHHHHHHIHIIIIIIIIHHOMM]\\ONNJJJKKLLLL^^^MLLMMMMMMMMCNMNNONNOOOPPOPPOPKPzPIQQQQQQRQcdKRS|SSSTTTTTr]UPSVUVU0//000000000100100111111111111112222223233GGH434444454544555555555555555555565666566677777787888888888MLL898889999:99:9:;;:;;;;;;;;;;<;<<<<<<<<<<===<====?>=>>>>>?RRR??????@??@@@@@@AABAAAAAABBBBBBCBCCBCCCCDCDECEEDDEDEEEEEFEXXWFFFFFFFGFFGGGHGHHGHHGHHIHIIIIIIIIJIIJJJIHIOOO]]]OOOKKJMLL___MMMMMMMMMNNJNNYNNNNOOOPPPPPPQPGQQGQQRQRQQRcdPSXSSSSTTTUUkVMSVVVV000000000000010111101111221222222233233324HHH444544445455555555555555555555676567766777777788888888888LLL9989999:9::9:::;:;;;;;;;<;;<<<<<<<<<<<<========>>>>?>>?>?RRR???@@@@@@@@@@AAAABBABBBBBBBBBCCBCCCCCCCDDDDDEEEEEEEEEEEEEXYXFFFFFFGGGGGHHHHHHHHHHHIHIIIIIIIIIJJKJKJKKKJJJOOO^]^QPPLKL__^MMMMMMMMNNNNNNDNONOOOPPPPPPPPQMQ\Q]QMRQRRSRddSSJSS|TTTTUVV{VRUVVVV000000000001111111111211122222222333333333III454455555555555555555555556676776777777777878888888888898MMM9999:9:;:;::;;:;;;;<;;;<<;<<<<<<<<===<====>>>>?>=>??>????RRR@@@@@@@A@AAA@AABBABBBBBBCBBBCBCCCCCCDCCEDDDDEEEEEEEFEFFFFYYYFGFFGFGGGGGHHHHHHHHHHIIHIIIIJIJJJJKKJKKKKJLLLKKJPPQ__^PQQ^^^MNMNNMNNNNNNNNHOPpPOOPPPPQPQQQQQQHRRIRRSSSSddSSMT|T}TTTTUVVVm]WQUV000001010111111111211212222222233333444444HIH554555555555555555555555656667777777777778888888888989999MMM99999:;::;;;;;;;<;;;;<;<<<<<<<==<======>>=>>=>>????????@?SSR@@@@@@@@AABBAAAABABBBBCBCCBCCCCCCDDEDDEECEEEEEEEFFEFEFFFFYYYGFGGGGHHHHHHHHIIHHIIIIIIIIJJIJJJJJJKKKKKLKMLLLLKLLLQQQ___cccLLMNNNNONOONOONOOKOPPPPQPPQPQQQQQJRRJRRSSSSddSTQSYTTTTUUUVViVOTVEEEEFEFFEEFEFEEEFEFFFFGGGGGGHHHGHHHHHIIHIISSSIIIIIIIIIIIIIIIIIIIJIKJIJJKJKKKKKKKKKLLLLLLLLLLLLMMMMMMMMWXWNNNNNNNONNNOONOOOPOOOPPOPPPOPPQPPQPPQQQQQQRQQRRRRRRRRSRSR\]\SSSTSTTUSTUTTTUUUUUUVVUVVVVVWVWVVWWVWXWXWXXXXXXXXXYXYXYYXcdbZZZ[[ZZ[[Z[[[[[[[[[[[[[[\\]]\]]\\]]]]^]_^^_]^^^____^^^cccwwwccc___a``aa``aaaaYaabbbbbbbbbcccd`bjdtd`ddedlmeeee]eeefgggggʈh`eh110111111111122222222222333443334444444554III555555555555555556666766777777788878888888888888999999:::NNN;::;:;;;;;;;<;;<<<<<<<<=<=<=========>>>>>??>???@?????@@@@SSTAAAAABABBBBACBBBBBCCCCCCCCCDEDDDEDEDEEEEEEEEEFFFFFFGGFGGGYZZGHGHHHHHHIIIIHIIIIJIIIJJKKKKJJKJKKKKKLLMLLMMLMMMMNMNMNMLLccc`_`SRROMNOOPOPPPPKPPbQQQQQQQQRQSRSSQIRSKSTSSedTTTTMTT|VUUVVVVW_YW111111111221122222223233434443444544555555III555555555555555666666777867777778888888888999999999:99:::NNN:;;;;;;;;<<;<<<<<<<<<<==========>>=>?>>?????@@@?@@@@@@@@@TSTABAABABBBBBBBBBCBCCCCCCCDDCDCDDEEEEEFEEFEEFEEFFFFFFGGGGHHZ[ZHHHHHIHHIIIIIIIIIIJIIJJKKKKKKKKKKKLLMMLMMMMMMNMMMNNNMNNNN^^^SRRaa`RSSNOOPPPPPPPQIQQQQRQRQRRSRSSSJSSLSSTTedTTUUQUaUUVVVWWWWzaW111111111121222322233343344444544544555555III555555555655655766777777777788888888889888999999999:::;::NOO;;;;;;<;<<<<<<<<<<==<========>?=?>>>??>????@?@@?@?@@A@AA@TTTAABBBBBBBCBCCBBCCCCCDDDDDDDEEDDEEEEEEEFFFFFFFFFFGFFHHGHHH[[[HHHIHHIIIIIIIIIJJIJJJKJJKKKKKKLLLLLLMLLMMMMMMMMNNNMNNNNNN`_`MNNSRSaaaTTTOOOPQPQQHQQQQQQRQRRRSSSSPT\SaTPTTeeTUUTUVNUơUVVVWWWWlX111211122212323333433334444444454455555555III555555655766676667777787787888888888899989999:9:::;;;;;:9OOO;;;<;<<<<<<<<<<==<=======>>>>>>>>>????????@@?@@@@@@A@@AAATUUBBBBCBBBBCCCCCCCCCDDCDDDEEEEEEEFEEFFFFFFFFFFFGGGHHHHHHHHH[[[HHHHIHIIIIIIJJJJKKIKKJKKKLLLLLMLLMKMMMMMMMNMMNNMNNNNNONOO```OPONNNTTTbbbTTTOOPQQMQQ_RRSSRRSQRSSSSTSKSTLTTefUVUTUVNVVVVVVWWWxX111222222232333333443444444445555555555555III5555556666777677777877888888888889889999999:9:::9;;::;;;;OOO;<<<<<<<<<<<<<<==========>>>>>??>?>?????@?@@@@@@@AAAABABATUUBBCBCBCCCCCCCCCEDDDDDDEEEEEEEEEEEFFFFFFFFGGGGGGFHHHHHHHHH[[[IIIIIIIIJJJIJJJKJKKLKMLLKKKLMMMMLMMMMMMMMNNNNNNNNNNONNOOPb`aPPOPPPOOOTTTbcbUTUPPPQRIRRRRSSSRSTSSTTTLTTKTUefVUVUVVPVsVWWWWWXXY222222222342344433444444445555555555555555III665666777767777778787888888998998999999999;;:;::;;;;;;;;;OOO<<<<<<==<===<=====>>=>>>?????>???@@??@?@@@@@@A@AABAABBBBBUUUBBBCBCCCCCDCDDDDDEEEDEEEEEEEFEFEFFFFGFGGGGGHHHHGHHHHHHIIH[[[IIIIIIIJJJKJKKKKKKLKKMLKKLLMLMMMMMMMMNNMMNNNNNNNNNOOPOPOPaabOPPPPPPQPOOOUTTcccUUUPQHRRSRSSSSSSTSTTTOTiTXUSgfVUUVVVUVXVߐWWWWWYXW222223323334343444444544555555555555555555JJI6666667777777778788888888889989899999:999;9;:;;:;;;;;;<<=>>>?>>???????@??@@@@@@@@B@AAABABBBBBBBBUUUBCCCCCCCCDDCEEDECDEEEEEEEFFEFFFFFFGFGGGGGGGGHHHHIHHIHHIII[[[IIJIJJJKJKJKKKKLKKLLKLMMLMLMLMMMMMMNNNNNNNNNNOONOOPPOOPPPbbbPPPPPPQPPQQQPPPUUVccdVVQQQgSSSSTSTSTTTTTSUQUtUPffVVVVVVWWNVWWWXWXXY223323334343444544545545555555555555555665JKI67667677778787788888888888999899999:::;;:;;::;;;;;;;;;<<=>=>???>????@?@@?@@@@@@@A@@B@AABBBBBBBBBBCUVVCCCCCCCDCDDDEDEEEEEEEEEFEFFFFFFFGFGGGGGHHHHHHHHHIHHIIIIII[[[JKIJKKJKJKKKKLKLKLLMMMLLLLMMMMNMNNNNNNNNNNNONPOPOOPPOOPPPabbQPQQQQQQQQQQRRRQPQVUVdddWVRRRSSTTTTTTTTTTTLVVNfgVVVVWVVWNWWWWXXXXY433434344344445455545555555555555555565666IJK67677777777888888888888899999999999::;:;;;;;;;<;<;<<<<<<=>?>=>?>??????@@?@@@@@@@@AABBABABBBBBBBBBBCCCVVVCCCDDDEEDEDEEEEEEEEFEFFFFFFFFFGGGGHHGHHHHHHIHHHHIHIIIIIII\[[JJJKKKKKKKKKKLMLLMMMMMMMMMMNMNNMMNNNONNONNONOOOOOPOPPPPPPbbbQQQQQQQQQQQRRRRSRRQQQWVWdd[WWRRTTTTTTUUUVUMVVMggVVVVWVWVQWsWWXYXXYY333333444444445545555555555555555556656666JJJ7777777788878888889889999999:9:::;:::;;;;;;;;;<;<<<<<<<<>>>???>???????@@@@@@@@@AA@AAAAABBBBBBBCBBCCCCCCVVWDCDDEDEEEEEEEEEEFEFFFFFFGGFHGGGGGHGGHHHHHIHHHIIHIIIIIIJJI\\\KJKKKKKKKLLKLLLLLMMMMMNMMMNNNNNNMONNOONOOOPOPOPOPPPPQPPPPcbbQQQQQQQQQQRRRRSSSRSSSRRRWWPeeXXSRTTTUTUUVVQUhV\geWWWVWWWWUW\XXWYYXYY343433445455555555555555555555556567766767KKK778877887888988989989999:9::;:;::;:;;;;;;;<;<<<<<<<=<<===PPP===>>=?>>???>?????@??@@?@@@A@@AAAAAAAABBBBBBBBCBCCCCCCCCCVWWDEDDDDEEDEEFEEFEFFFFFFFGGGGGHFGGHHHHHHHIIIIIIIIIJIIJIJKJJ\]\KJKKKLLLLLLLLMLMMMMNNNNMNNNNNNNNNONNOOOOOPOPPPPPPPPQQPPPQbbbQQQRRQRRQRSQQRRRSSSSSSSTRROWW_eeXXSSUUUUVVVUVRWugaVVWWWWWWXXPWȣYWXYYYY444544454555555555555555555565566677677777KKK777888888888899999999:9::::;::;;:;;;;;;;<;<<<<<<<<=<=====QPP=>>>>??>???????@??@@?@?@@@@@BAAAABABBABBBBCCCCCCCCCCCCDDDXWWEEEEEEEEFEEEFFFFEFFFGFGGGGGHHHHHHHHIHHHIIHIIIJIIJJJKJKJJJ\]]KLKLLLLLLMLMMMMMMMNMNNMNNNNNNNOOONNOONOPOOPPPPPPQPQPQQPQPbbbQRQRSRQRRRRRRSRSSSSSSSSSSTSSSKXXefYYTSUVVVVVVNVh_WWWWWWXWXXOXXYXYYYY444544555555555555555555665666766777777777LKK888888889989999999999:::;::;;:;;;;;;<;<;<<<<<<=<==<======QQQ>>?>>>?????????@?@@@@@@@@A@AABB@BBBBBBBBBBCCCCCCCDCCDEDDEXWXEEEEEEFEEFFFFFFGGFGGFGGGHGHHHHHHHHHHHIIIIIJIIJJJIJKKJJKKK]]]KLLMMMMLMMMMMMNNNMNMMNNNONNONNOPOOPPOOOPPPPPPPPPQQQQQPQQQcbcRRQQSRRRRSSSSSSSSSSSSSSTTTTTTLSSYXffXYTUVVVVWOWh_WWWWWWWWXXPXXYYYZYY544545555555555555555566666557667777877878LLL888988988999999:99:;:9:;:;;;<;;;;<<<<<<<<<<<<=<<======>>=QQQ>>>??>???????@@@@@A@@AA@@AABABBBBBBBBBBCCBCCCCDDCDEDDEDEDXWXEFEEFEFFFFFFFGGHHHHHGHGHHHHHHIIHHIIIIIIIIIJJIKJIJKKKKLKKK]]^LLLLMMMMMMMMMMMMNNNNNNNNONOOOOOOOOOPPPPPPPQPPQPPQQQQQRRQRdccRRRRSRSRSSSSSSSTSSSTTTTTTTTTUMTU{TTYYgfZYUUVVWPWtheWVWXXXXXXXTXoYYYYZZZ555555555555555555566567666776777777877888LLL888998988999:9999::;;;;;;;;;;<<;<<<<<<<=<<=<<======>>=>?>RRR?????????@@?@@@@@@@A@@@ABBABBBBBBCBCCBBCCCDDCEECEEDDDEEEEXXXEEEEFFFEFFFFGHFHHHGGHHGHHHHHHIIIIIIIIJIJJJJKJKKKKKJLLKLLL_^^LLLLMMMMMMMNNMNNNNNNNNNOPPPOPOOPOOOPPPQQQQQQQQQQQQQQRRRSRccdSSRSSSSSSSSSSTSTTSTTTTTTTTTUUQUVfUUUUYZggZZUVWTWahxWTXXYYYXYYVY[YYYZZYZ555555555555555565656667776777877787888888LLL8889999999:9::::::;;;;;;;;;<;<<<<<<<<=<=<<========>>>>???RRR???@??@@?@@@@@@@AABBBBBBBBBBBCBBCCCCCCCDDCDDCDDDDEEDDEFEEXXXFFFFFFFGGGGFGHGHHHHHHHIHHIIIIHIIIIIIJJKKJJKKJJKKKKLLMLMMM^__MMMMMMNNNNNNNNNONNONOOPPPOOOPPPPPPPPPPPQQPQQQQQQQQQRRSRRScddRRSSSSSSSSTSSTTTTTTTTTUTUUUUTSVVTVUVVUUZZggZ[VVWQhՌWQXYXXXXYYYYQYʥYZZYZZ555555555555556676677777777777878878888888LML999999:99::::;;;;;;;;;<;<;<<<<<<<<<<<=========>=?>>?>???>RRR????@@@@@@@AAA@ABABABBBBCBBBBBBBCBCCCDCDDDDDDDDEEEEEEEEEFXXXFFFFFFGHGHGHHHFGHGIHIHHHIIIIIIIIIJJJKJJKJJKKJKKKLKLLMMMMM___MMNNNMNNNNNNNNNOONPOOOOOPPOPPPPQPPPPQPPQQQQQQQRQRQRRRSRRRdddSSSSSSTTTTTSTTTTTTTTTVUUUUVUUUVUMVVVVVVUUZZhg[[VNiXPXYXXXXYYYYRYYZZZZZ555555555656667667676777787877878888889888LML999::99:9;;;:;;;;;;<;;;<<;<<<<<<<<========>==>>>?>>?>????RSR@?@@@@@@@AAABAAAB@BBBBBBBBCCCCCCCCCDDDDDECEEDEEEEEEFFEFFFYXYGFFGGGGHGHHGHHHHIHHHIIIIIIIIJJJJJKKKJKJKKJLKKLMMMMLLLMMMM___MNMNNNNNNNNNONONOOOOOOPPPPPPPPQPPQQQQQQQQPQQRRRRSSRSSRSSSdddSTSTSSTTSTTTTTTTUUUUUUUUUUUVUVVVNVVWVVWVWVUZZhh[SgXQYYYYYYYYZYRYZZZZZ[555555655656667766777777787888888988898989MMM:9::;:9;9:;;;;;<;;<<<<<<<<<<<=<===<====>=>?>??>>?>??@???@SSS@@@A@@@AAAABBBABBBBBBBCCCCBCCCCCDDDDEDDEEEEEEEFEFEEFFFFFFYYYHGGGGGGHHHHHHHHIHHIIIIIIIIJJJJJJJKJJJKKKLKMLLMLMMMMMMMNMM___NNNNNNONNPNOOOOPOPOPPPPPPPPPPPQQQQQQQQQQRRQSSRRRSRSSSSSSSeddTSTTSTTTTTTTUTUUUUUVUUUVVUUVVVWVNVVWVWWWWWWVV[[i`lWQYXYYYYZYYZRY}ZZZ[[[IIIJIIJJJJJJKKJKKKKKKLLKLLLLLLLLLLLMMMLMMMWWXMNNNNONNNNOOONOOOOPPOPPPOPOPPPQQQQQQQPQRQQQRRRRRRRRRRSRSR\]\SSSTTTTTUUTUUUUUUUVVVVUVVVVVVWVVWWWWXXXXWXXXXXXXXXXYYYYYXcbb[ZZ[Z[[[[ZZ[[[[[[[[[[[[[[\\\\]]\\]]]]]]^^__]__^^_^___`__`ihi``````a``aa`aa`a`baabbbaabbbbbbccbccccccccdcccdcddddddeddlmmeddeeeeeeffeeffeeffffgggggggggggbghhhhhhhhhiihhmhmoigjjjjjjjjfj~jkkkkl665655566677777777787888888888888998999999MMN;:::;;;;;;;;;<<<<<<<<<<=<=<==<======?>>>?>>????????@@@@@@SSSAAAAABAAABABBBBBBBCCBCCCCCDCDCDDCEEDEEEEFEFFFFEFFFFFFFGGFY[YHGHHHHHHHHHHHHIIIIIIIIJIIJKKJKKKKKKLKLLMLMLLLMMMMMMMMNNNN``_NNNNNNOOOOOOOOOPOPPPPPQPPQPQQQQQPQRQRRRRRRSQRSSSRSTSSSSSTeeeTTTTTUTTUUTUVVTVUUVUVVVVVVVVVVVVSWWgWWWWWXXXXXYXWUlwiz]YXXYZYZZZWZaZ[[[\]665666666777787877788888888889989999::9:::MMN:;;;;:;;;;<<<<<<<<<<<<=<=========>>>>???>???????@??@@@@@@TTTAAAAAABABBBBCBBCBCCCCCCCDDCCDDEEDEEEEEEEEEFFEFFFFFFGGGGHHZ[ZHHHHHHHIHIIIIIIIIIJJJJJJJJJKKJKKLMLLLLKLMLMMMMMMNMMNMNNNN_``ONOOONOPOPPOOOPPPPPPPQQQQPQQQQQQRRQRSSQSSSSSSSSSTTSSTSSSTeeeTUTTTTTTUUUUUUUVVVVVVVVWVVVWWVWWUWWXWWWWWXYXXXYXYXhg]|ic]]XXYZZZYZVZ٣\[Z\]675676777777778888888889898999999999;9::;;NNN;;;<;;<;;<<<<<<<<<=<<<=====>==?>>?=???????@??@??@@@@@@@A@STTAABBBBBBBCCBCBCCBCCDCCCCDDEEDEEEEEEEEEEFFFFFFFFFFGGHGHGGH[[[HHHHHHIIIIIIIJIJJJIJKKKJKKKKKLLLLMLLMMLMMLMMMMNMNMNNNNNNN_``ONOOONPPPPPPPPPQPPPQQPQQQQQRQQRQRRQSSRSSSRTSSSSSSTSTTTTTSeeeUTTTUTUUUVUVUUVVVVVVVVVVWVWWWWWWWWWOWWWWWXXXYXYYYYjbX̉]Ujj]^XYZZZZSZǭ[Z\[\767J6778777878888888888988989999:9:::;:;:;;OOO;;<;;<<<<<<<<<<<<==========>?>????>?????@?@@?@@@@@AAA@AAATTTBBBCBBCBBCCCCCCCCCDDDDDDEDEEEEEEEEEFFFFFFFFFFGGGGHGHGHHHH[[[HIIHIHIIIIJIJJJJJJJKJKKKLKKKLLMLMLLLMMMMMMMMMNNMNNNNNNNNN``aOOPOPOPPPQPPPQQQQPQQQQQQQQRRRRSRQQSSSSSSSSTSSSSTTTSTTTTTTeeeUUUUVVVVUUVVVVVVVVWVVVWVVVWWWWWWWXXOWXXXXXXYYXYYYYjbZXP]]jj^^ZY[ZSZZ]]]]777 777777887888898989999999:99::::::;;;;;;ONO;;<;<<<<<<<<<<<=<======>>>>?????????@??@?@@@@@@@AAABABAABUUUBBBBCBCCCCCCCCDEDCEDDEDEEEEEEEFFFFFFFFFFFFFGFFGGHHHHHHIIH[Z[IIHIIIIIIJJJJJJJKKKKKKKKMLLMLLLMMMLMMMMMNNMNNNNNNNNNNOOOOaaaPOOPPPPPQPPPPQQQQQQQQRQQRRRRRSSRRSSSSSSSSSTTTSTTTTTTTTUUUfffUVVUUVVUUVVVVVVWVWWWWWWWWWWWWWXXXXXOXYXXXYYYYYYYZYjbZZQYX^^kk^^ZZS\\\]]]Z888o778888989888999999::9:::::::;:;;;;<;OOO<<<<<<<=<<<<=<=====>>=>>?>>?>??????@@@@@@@@@@ABAABAA@BBABUUUBCCCCCCCCCCCDDDEDDEEDEEEFEEEEEFFFFFFFFFFGHGHGHHGHHHHHHHHH[[[IIIIIIJIJKJJJKJKKKLKLLLLLLLMLMMMMMMMNMMMNMNNNNNNNNNNOOOOOaaaPPPPPPQQQQPPQQQQQQQRQRQSRRRSRRSRRSSSTTSTTSTTTSTTTTTTTUUUUfffUVUUUVVVVVVVWVVWWVWWWWWWWWWXXWXYYXWPXYXYYYYYZYYYYZjbZZRZZYY^_kk`_SZ\]]^]8888888898898889999:9:;:;;:::;;;;;;;<<;OOO<<<<<<=====<====>>>>>?>??>????@??@@@@@@@@@AAAABAAAAABBCBBUVUCCCCCCCCCCDDDDDEDEEEEEEEEEEFFFFFFGFFFFGGGHHHHHHGIHHHHHIIH[[[IIJJJJJJJJJJKJKLKKLKLMLLMLLMMMMMMMMMNNMNNNNNNONOONPPPPPPOabbPPPQQPQPPQPQQQQRQQRRRRQRRRSSSQSSSSSSSSSTTSTTTTTTUTTUTUVUUggfVVUVVVVVVVVVVVWWWWWWWWWWWXWXXWXXXYYQYXXYYYYYYZYZZYjbZZS[Z[[Z[^`lmX_\]]]s888W889999999:99:::;;;;;:;;;;;<<;<<<>==?>>?????????@@?@@@@@A@AAABAABBBBBBBBCBCVUVCCCCDCDDDDEDEEDEEEFEFEFEFFFFFFFFFGHGHGHGGGHGHHHHHHIIIHIII[[[JIJJJJJKKKKKLLKMLLLLLLLMMMMMMMMMMNNNNNNNNNNONOOPPOPPPPPPPabbPPQQPPQQQQQQQQRSRRSSRRRRSSSSSSSTSTSTSTTTTTUTTUUTVUUUUUUVUggfVVVVVWVVVVVVVWWWWWWWWWWXXWXXWYYXWYYRYY|YYYYYYYYYZZZjdZ|[Y[ZZ\\\Z[``gla\]]989999999;99;;:;;;;;;;;;;;<<;<<<>>>>?>>>?>?????@?@@@@@@@@@@AAAABBAABBBCBBBCBBCBVVVCCCDDCDDEDEEEEEFEEFEEFFFFFFFFFHGFGGGGHHHHHHHHHHHHIHIIIIII\\\IJKJJJKKKKKLLMLLMKMLMMMMNMMNMNMNNNNNNNNONNPOOOPPPOPPPPPPPbbbQQPQQQQQRRQRRRQRRRRRSSSSSSSSSSTTTTTTTTTTTTTTTUUUVUUUVVVVUgggVVWWVVWVWWWWWWWWWWXWWYWXXXXXYXXYXYYSYYtYYYYYZZYZZZZkeZt[a[Z\\]\]]\\\`na\,98899999:::9:;:;;;<<;<;;<<<<<<<<=QPP===>==>>>>>>>>???>????@?@?@@@@@@@AB@ABABAABBBBBBCBBCCBCCCVVWDCDDDDDEEEEEEEFFFFFFFFFFFFGHFGHGGGHGHHHHHHIIHIIHIIIJJIJIJ\]\JKKKKKLKKLKLLLLLMMMMMNMMMMMMMNNMNNNNNNNOOOPPPNPPPPPPQPPPQbbbQQPQQQRQRSRSSRRRRSSSRSSSSSSTTSTTTTTTTTTTTUTTTUUUUUVUUVVVVgggVWVWWVWWWWWWWWWXWWXWWYXXXXYYYYYYYYYUYYnYYYZZZZYZZZZkf[p[i\X]\]\\]]]X\ramE::::;:;;;;;;;;;;<<<<<<<<<<<=<>=?>??>>????@@?@@@@@@@@AA@BABBBABBBCBBCBBCBCCCCCCDWVVDDDEEEEEEEFFFEFEFFFFFFGFFGHGHHHHHHHHHHIHHHHIIIIIIIIJIIKJJ\]]KKKKKLLLKLLLMMMMMMMMMNNMNMNNNNNNNNONNOOOOOPPOPPPPPPQPPQQQbcbQQQQRQRRRSRRQSRSSSSSRSSSSSSSTSTTTTTTTTUTUUUUUUVVVVVVVVVVVgggWVWWWWWWWWWWWWWXXWXXXYYXWYYYYYYYYYYVYZhYYZZZZZZZZ[Zlh\i\p\X]]]]]]]][]j\3;;;Y<;;<<<;<<<<<=<<<<<=<=PPP>==??>??>>>?????@??@@@@@@@@A@AA@ABAABBBBBBBBBCCCCCCCCDCDDWWWEEEEEEEEEFEEFFEFFFFGFGGHGGGGHGHHHHHHIHIIIIIIIIIIIIJJJJKJJ]]]KKKLLLLLMMMMMMMMMMMMMNMMNNNNNNNNONOPOPPPPPPOPPPPQPPQQQQQQcbbQQRQSRSRQSRSRSSSSSTSSSSSSSSTTTTTTTTTUUTUUUVUVVVVVVVVVVWVWgghWWVWWWWWWWWWXXXXYXYYYXXYXYYYYYYYYZYWZZbZZZZZZZZZZ\[ki[c]v\X]]]]]]]][^<<;<<>?>?>?????@?????@@@@A@@A@AAABABBABBBBBBBBBCCCCDCCDCDCDDWXWEEEEEEEEEFEEFFFFGFGGGHHHGHHHGHHHHHHIIIIIIIIIIIIJJKJKJIKKK^^]LLLLLLLMMMMMMMMNNMNNMNNNNNNOONOPOONPOPPPPPPPPPPPQQPQQQQQQcbcQRRRRRSRRSRSSSSSSSTSSTTTTTTTTTUUUUUUUUUVVVVUUVVVWVVWVVWVVghhWWWWWWWWWXXXXXXYYYXXYXYYYYYYYYYYYYYWZY]ZZZZZZZZ[Z\\lj\_]y]W]]]]]]=<<< <==K<=======>PQR??=?>>?@????@??@@@@@@@A@A@@BABBBBBBBBCBCBBCCCCCDCDDEDCDDEXWXEFEEFEFEEFFFFGFFGGGHHHHHHHHHIHIIIIHIIIIJJIJJKJJJJJJKJKKKK]]]LLMLMMMMMMMNMMMNNMNNNNNNONNOOOOPPOOPPPPPPPPPPQQPPQQRQQRQQcccRSRSRSSSSSSSSSTTSTTSTTTTTTTTTUVVVUUUUVVUVUVUVWVVVVVWVWWWWhhhWXWWXWXWXXWYXYXXYXYYYYYZYZYYZYZZZYZXYZ[ZZZZZZZ[[[[\ml]]]}]Wo]],?(@ 0# %4$ 6% =)$G0+@& D(!H)"L*"O+"T,#U-#O,#F-&>1-&$#!$%!$%$%%%%%&&&&&&&&&***111&'&(((((())))))*********...444+*+,,,,,----...//.///00/333:::000222222333444554555555888>>>566777888@5+(Y/"4$ 7$ >($I/+B% F("I*"L*"P,"T-#Y.#^/#f3'o;.`/#S.%<*%)&&!%&#%&&'&'''***111''')()))))))******+****+...555+++------...///0//000000333:::001222333444454555555555989?@?666888888999 &L*1)+3)$,'-!/2$;9+7,!@,"G*"N*"S*#V,#Y-#\/$c3'n;.j2$q5%v6%o4&X0&9+&&''!&')*+222'('))))))*******++++++++.//555+++---...////00000000001444;;;111333444444555555555555999@@@777888888999:;; %  ' ))4)(8)2#:$*D, =!#@"'@"/>#::#G5#U0$_-$g1'q:/h1$n4%s5&y7&8'9'p6'K/'.,++12&'()))*******+*+++++++,,///666,,,...////0/000000111111444;;;222444455555555555665666:::A@@777999999:::;;;;<;= % ' !*! , )7)*:)#8#,C,!0-G/-N--T+.Y,.],/`./d/1j16t7,r/+x02x0Ij0lU1D1@2D2I5P:I3L4I4a=4255/45666666999???778999999::::::;;;;;;<<;???DDD===>>>>>>?>?@@@@@@AAAAAACCCIIIBBBDDCDDDEEEEEEFFF$$%$$'$$*%%-%$0%$3'%876K-,D%'>',?'3;'>6(L.(X((`%+g)2p1(i(*o*)u*&|+'+9v+a\,C,>/I6B,E.G.I/C/L5/'.0-/0554;;;112333434444545555666777:99@@@777888888999:::;:;;;;;;;?>?EEE===>>>??????@@@@@@!!"!!%!!'""*""-""/%%6,,?**A,+E#"B$"G$"K%$M%,J%:A)Q70j1%j"'o%'r'(v(({(%)#)1)`h-N4:*@+D,E,H,H-y=-2/.*02999///010111111222323443444877>>>444555666777878888888898=<>=>?>"!"""%""'""*#"-""1&&7--B"":-,F--J#$E%%J&%O&$U&#Z)'`07c&@J(]6(s'){$)~())**(*'->4fh*E,?,E,G-I.L/G/U93089-00111222222343444455555888>>>554777777888888998999:::>>>DDD;;;<<====>>>??????""""""""##"$##%##'&&.--9##5##;--J--O$$K&&P&&S&&W**_1/m'#i('l)7`)VG)w.*$*(**..25$+=,|c-B-D.J/K/M0Q3I:/00+01222332444454555555888?>>665777888888999999:::;;;>>>DEE;;;===>>>??????@@@""""""##"########"''&..-###%%&$$*..:..F%%J'&U''Z**a11k''e((k)&s)$y*2r*TV*|3+%.,55++(-'-Q.V/C/J0M0Q3Z:H0E62)13444545555555555889???666888888999999:::;;;;;;???EEE<<<>>>??>???@@@@AA""""##########$$#$'''...#$$%%%&%$%%#./-//1&&2''D++Y22n''h))l))q)*u*(|+%+/+W\/65/+*---.(/20wy0I0H0Q4Y;R1Q3c=4)24455555555555999@@@777888999999:::;;;;<<<;>>???@@@@@@AABBBB#########$$$$$$$$$(((///$$$&&&&&&&&''''&&&000000**)22/((%**3**N*+o++++,,,,/-70-=/O/)0,0111)191z5T>>@@@@@@AABBBBCBC""""#"############'''...$#$%%%%%%&&&&&&''&&&&///322101'''))'))%**.**O++w++++//77-(.*/Yy/9/(0011,0.5>>??@@@AAAABBABBB---..-......//.///111676///000000111111121222111==?:De=i>X>`>b?f@[@GBA>CE=<=>>>??????@@@@@@AAABBBDDEJKKCCCEEEEEEFFFGGGGHG$$$$$$%%%%%%%%%%%%)))000&%&'''(''((((((()()))))),--232111333***,,,-,,---.....+22+99M//011111213)3O4F7/>>44-5A6|7Q8[8]8`9[?>???????CCCJJIAAABBCCCCDDDEEEEEE$%$%%$%%%%%%&&&&&&*))000&&&(((((()(())))))******---444)))334444+++---...//////23399400/11e222233444-5=8`>4547717=88S9^9_:f>aD@<;7<<===>>>??????@@@@A@DDDKKJBBBCCCDDDEEEEEEFFF%%%%%%%%%&&&&&&&&&***111'''((()(())))))*********...454+*++++554555---///0//000333:::00/21*22H334444555086?{5,758828:99U:`;d>nEW;<==:=>??????@@@AA@AAAEEEKKKBBBDDDEEEFEEFFFGFG%%%%%&&&&&&&'&&&''***111''')(()))))))******+**++...555+++---,,,666776...000000443:::11022243-4474455555585?7670869949;:;W;d?kEf5=>>??@@@@@@BBABBBEEEKKKCCCEEEFEFFFFGGGHHG%&%&&&&&&'&&''''''*+*111'''))))))******+*+++++++./.555++,-......-.777887///000444;:;11133344445255/55q55559:@>7-88296::5;A<̇<\?mEd=i?R?3=@@@@ABABBBBBBEFFLLLDDDEEEFFFGGGHHHHHH&&&&&&'&&'''''''''+++222((()))******++++++++++++///666,,,./..////////888999000444;<;22244444555555455+56a66::@A769/9:4;9<<5h?i@xLA6?BBBBCBCCCCGGGMMMEDEFFFGGGHHHHHHIII&&&&'&'''''''(((((+++222()(********+++++++,,,,,,/00666---///00/000000/00999999444<<<33354455555555566567.77W::AA8898:0;;4<:==4=Z@xGa>h@jAhAYGB;ABCCCDDDGHGMMNEEEFGFHGHHHHIIIIII%%&&&&&&&'&&''''''+++222'(')))*)*******+++++++++///667---...//////000000//0988===;;<23244444444454566566766-::RAA77:9:8;1;<2<;=<4@yGe>e?iAmAbBBBBABCDDCGGGMMMEEDGFGGGGGHHIHHIHI000111121121222222555;::333444444455555555666666:99???888999999::::::;;;;;;;;;GFFLKL<<<>>>>>>>>????@@@AAAAAACD;II_BBDDDDECE;FF;GGIJBOHiJsJtKyKcLBJMMMMPPPUUUOOOPPPQQQQQQRRQSSS***+++++++,+,,,,,,0//666,,,......//////0//000100444;:;222333344444444555666666999GGG>>>766888999::::::;;;;;;>>?EE<=>????@<@>BtB7DEIK:CEeEpFrGsGuRH>FHLKKRRRIJJKKKKLLLLLMMMNNN''((((((()))))))))---434**)+++,,,,,,,,,---......222999///110111111222333334444877===;;;===555777787888988999=<=DCD;:0<<`<<===>>8?K?WB;IJ>>443>>>???777888999999:::>>>DDD;;;<<2==r>>>???@6@fDGKGBB9CqDkEoFqFvG`G@HKQQQHHHJJJKKKLLLMMMMMM()()))*))*********...454+++,,,,-----...///////0/333:::000122222333444545555555888>>>565666???@@@878999:::;;;>>>EDE<;;===>>1????@@AAA5EK@BBDE9EEgFrGtHuHsUKHOQIIIKKKLLLMLLMMMMNN))))))******++****...555+++--,---....//000000000334:::101222433444555555555555888???666888777@@@AAA9:9;;;;;;??>EEE<<<>>>?>=@?7@@@ABABAE>>???@@@@AAAB9BBgCCCCFGMADF=GFGG?HHmIvJ|M|STNLJLMMNNNNNOOOPPP******++++++,,,,,,0/0666---///0//000000011111111555<<<333444555555555566776777:::AAA888999:::;;;<;<;;;DDDDDD@??GGG>>>@@@A@AAABBBBCC6CCCDGGNLE>G|G>HHBIbIxJuK{NTbLBKMNNNNOOPPPPPP))*******+++++++++///666---...//////000000111111555<<<322444444444545656666666:::AAA877999:::;;;;;;;<;;;;DDDGHHFFF>>>@?@AA@AAABBBBB@CCADDGGMME>GcHJHEHH=IJnJ{NTuLXPMJMNNOOOOOOPP444545555565666666:::???788999999::::::;;;;;;<<;???DDD===>>>>>>>>>??@@@@AAAAAADCCIIIBBBDCDDDDEDEEEEFFFGFFFFFQPQVUUGHGJIJKKJKKKLLLLLMMMEMMqPPUUOOPEQQFRSNSbTUW[UmVMTWXXXXXXXYY...///////0/000010444;;;121333333444554555566666:::@@@777888888999:::;::;;;;;;>>>EEE==<>>>??????@?@@@@AAABABCCCRRRJJJDDDEEEEFFFGGGGGHHHHH=KLRQJJKGLVL[MINODOOwRXP{RZTRPRSSTTTTS,,+,,,,,,---......222999///111111111222333343444777>>>444556766777778888898899<==DDD;::<<<<<<===>==?>???????CCCIIIHHHIIIBBBDDDEEEEEEFFEFFBJJXPPGGIIJ>KK@LLIM\MPV}NPbQFNQRQQRRR,,,,,----...//////32299900/111221222333444445545888>>>455776787788888999999:::>>>DDD;;;<<====>>>??????@@@@@@DDDKJJAAAJJKKKKDDDFEEFFFFFFGGHKK>QQHHJJKGLUM^MINMCNQ}W}OPvQOQRRRRSSS,,----...///////00333:::000212222333444444555555888?>?656777888888999999;::;;;>>>EEE;<<===>>>??????@@@@@AAAAEDEKKKBBBCCCLLLLLMEEEGGFHHHHHHKKHQQZIJKKLLMAMNBNNINiRX}PQRz]RLQSSSS---...//////000000334:::110223333444555555555555898???666888888989999:;:;;;;;;???EEE<<<>>>??????@@@@@@ABABBBEEEKKLCCCEEEDDEMMMNNNFGFHHHIHHKLLRRGJJLLMMMIN\NWOLOOIȘXxPQRpSJQTTTT...////0/000000001444;:;111333444544555555555556:99@@@777888899999;::;;;<<;<<>>??@@@@AA@BAABBBCCCCCCGGGMMMDDDFFFGGGGHHGGGPOPPPPIIIMMMTTTLL@MMNNNNOHPpPNPOQS^YRSSTdTLRU00/000000111111111555<<<333545555555555656777777::;AAA888:99:::;;;<<<<<<=<====A@@GGG>>>@@@AAAABABBBCBCDCDDDDGHGNMNEEEFGGGHGHHIIIIHHHRQQQQQMMMUUTLLGNNfNNNOPOPLQwQITSOZR{STUtUMSV//////000000110111455<<<233444444444554566666676:::A@A777999:::;:;;;;;;;<<<<==@@@GGG>>>?@@A@AAAABABBBBCCCDDDGGGMMMEDDFFGGGGGHHHHHIIIIIIQQQUUUTTTLLKMMDNNNOOPPEPQFTTSZvQ~SSTU_XU999::::::;:;;;;<<>>>>>>>>??@@@@A@AAAADCDIIIBBBDCDDDDEEEEEEFFFFFFGGGJJJOOOHHHIJJKJJKKKKLKMLLMMMMMMPPPUUUOOOPPPQQQQQQRRRSSSTSSTSS]]]babUUTWVMWWXXXXYUYkZ_\Z_a\[\\]^k^4434445445556666679:9@@@777888888:9::::;;:;;;;;;?>>EEE=<=>>>?>????@?@A@@AABBBBEDDKKKCCCEEDEEEFFEGGFGGGHHHHHHKLKQRRJJJKKKLKKLLMMMMNNNOOOOOOQQQ^^^WWWQQORRXSSSSTTUMU̓XO]]LVWXXYsY111111222333443444787>>>444555666777778888888999=<=DCC:::<<<<<<=====>?>>??????CCCIJJAAABBBCCCCDDEEDEEEFFFFFFJJJPPPHHHIIIJJJKJKLLKLLLMMMMMMPPPUUUUUUVVWOPEQQQRRRSISVL[\LTVVVV}W222222333444444555888>>>555767777888888999999:::>>>DDD;;;<=<====>=??????@@@@@@DDDKKKBBBCCCDDDEEEEEEFFFGGFGGGKKKQQQHHHJJJKKKLLKMLMMMMNNNNNNQQQXWWNNNWWWXXPQQ~SSSSTNTkVX][RUbVWWXX223333444544555555888??>66677788888899899::::;;;>>>EDE;;;====>>??????@@@A@@AAAEEEKKKBBBDDDEEEEEFFFFFGGGHGHHHKKKQRQIIIKKKLLKLMMMMMNNNNNNONORRRXXXPPPPPPYXVYYbRRTSTSTSXt]XUUQWҟWWXX333444445555555555888???666888888999999::;;;;;;;???EEE<<<=>>?????@@@@AA@BABBBBEEEKKLCCCEEEEFEFFFGFGGHHHHHHHHLKKRRRJJJKKKMMMMMMNMNNNNONOOOORSRXXXPPPQRRRRQZYQZZSSTTUKX^TVULWWXYY4444455555555555669:9@@@776888999999:::;;;<<<<<>>???@@@@A@AABBBBCCCCCCFFGMMMEDEFFFGGGHGHHHHIIIIIIJJJMMNSTTLLLMMMNMMNNNOOOPOPPPPPPPSSSYZYQRRSSSSSSTTNSSt[\\\UPYp^_VUSXmXYZZ555555555656777777::;AAA877999:::;;;<;<<<<==<===@A@GGG?>>@@@@AAABABBBCCCDCCDDDGGHNNNEEEFGFHHHHHHIIIIIIJJJKKKNONTUTLLLNNMNNNOOOOPPPPPQQQQQQTTTZZZRRRSSTTTTTTRUU^UU\\\ZX\_pWSWY\YYZZ444444445566766767:::@A@777999::::::;;;;;<<<<<<<@@AGGG>>>@?@AAAAAABABBCBCCCDDDGGGMMMEEEGGFGGGHHHHHHIIIJJIJJKNNNTTTLLLMMMNNNONOOOOPPPPPPQQPTTTZZZRRRSSSSTTTUSUUQUUUU\[_X]ՄWPXXRXΦYYY>>>>>>@??@@@AA@AAACCDIIIBBBCDDEDDEDEEEEFEEFFFGGGJJJOOOHHHJIJKKKKKKKKLMLMMMMMMMPPPUUUOOOPPPQQPQQQRRRSSSTTTUTUWWW[[\UUUWWVWWXXXXXXXYYYYYYYZZ\\\aaa[[[\\\\\]]]]]]T^^^^^^g^kǠ^Wa`Waabb988999::::::;;;;;;>>>EEE=<=>>>??>???@?@@@@ABAABBDEDKKKCCCEEEEEEEEFFFGHGGHHHHHHKLKQRRJJJKKKLLLLLLMMMNNNOOOOOORRRXXXPPPQRRRRRSSSSSSTTTUUUUUUXXX]]]VUVWWWXXXXXXYYOYYYYZY\ShaX[[R\]]^666777788888888998=<=CCC:::<<<<<<===>==?>???????CCBIIIAAABCBCCCCCDEDEEEEFFFFFFJJJPPPGHGIIIJJJKKJKKKLLLMMMMMMPPPVVVNONPPPQPPQQQQQRRRRSSSSSSVVV[\\STTUUVVVVVVVWWNWWWXXX[R`_X``QYZ\\778e878888999999:::>>>DDD;;;<<====>>>??????@@@@@@DDDKKKBBBCCCDDDEEEEEEFFFFGGGGGKKKQQQHHHJJJKKKLKLMMMMMMNNNNNNQQQWWWOPOQQQQQQQQRRRRSSSTTSSTSWWV\]]TUUVVVWVWWWWWXQXXXYYY[UaXVa`[a}[]]888888989999:;:;;;>>>EEE<;<===>>>?>????@@@@AAAAAEEEKKKBBBDDDEEEEEEFFFFGGGGHHHHKKKQQQIIIKKKLLLMLLMMMNNNNNNONORRRXXXPPPQQQRQRRRRSSSSSTTTTTTTWWW^]]UUUVWVWWWWWWXXSYYrYYYY\WayZ]ZY]czc\]#999(999:::;;;;;;?>?EEE<<<>>>??????@@@AA@AAABBBEEEKKKCCCEEEFFEFFFGGGHHHHHHHHHLKKRRRJJJLLLMMLMMMNNNNNNOOOOOPRRRXXXPPPRRRRRSSSSTTSTTTTTTTUUXXX^^^VVVWWWWWWXXXYYUYYjYYYY\XbrZe]YX\rccW:::';;;;<<<<>>???@@@@A@AAABBBCCBCCCGFFMMMEDDFFFFGGHHHHHHIIIIIJJJJMMMTSTLLLMMMNNNNNNOONOOPPPPPQPSSSYYYRQQSSSTSTTTTTTUUUUVVVVVVYXY^^^VVVXXXXYYYYYYYWZZ`ZZZZ][di\q]Y[](0` 0"B5# :%!F.)A'!F)!K*"P,"U-#S,"O1)>-(*%$!$%!$%%&&&&&'''///''(((())))))******0000/0,+,---...//.000010898111222333444555444::::::777888[-,'`.+%,' 3)!A1)@(!H("N)"S*#X-#].#i6)m6)g2$Y0%A+&*'&!&'%'(000((()))))****+*+***111000,,,...///0/0000111999112333444555555444;;<;;;7778889:9% 7( '4(%5& 4!+@*%:",<"5:#A6#O2#\-#k3*n4)n3%x6&}8&v7'[1'7+(+/0$(()))****+*++++++112111---///000000111222:::333454555555555665<<=<<<888999:;;;<;Y% ( ,(7'&:&(A(!>! D" I"!N#$Q#.N#FM*[A)k3$x2&|5&9';'<(u>0=-(#()&)*+**++++++121111-../////0000111222:::333444444545666666<<<<<<888:::;;;;<;%'&%)'%,)%/).<13G5&A&'I&(O&(T&(Y(&^(+k/,m.4e*PX+qE,;,<,A-L5D.z>.@2/'./.00000776677333444555655666887???898999999:::;;;;;;AAAA@A=>>???@@@@A@'&('&+''/''3('778H-1A(1<*;:*G4*V.*a(0m-/q.)r+({-.|-Go.rT.B/G6F0J0I1s?1632*12899888555666667777888:::@@@::::::;;;<<<======CCCCCC@@@AAAABBBCB! "!!%!!)!!-""2*)>*)A('E# F$"K%'L$2F+L@*a1&m#'v#'z&#(%)?z*{`2>*>+E+H,D-S5-,240330//011111222333444;;;444555676777788788????>>;;;<<<===>>>"""""$""'##*$#/,,=##:,,H**L$$L&%S%#Y,)f,-e';T([>)w*)$*(&+.3F+X,@-E.K/L/F5755*/1222333444555555=<=666778888989999:::@@@@@@<<<>>>???@?@""""""##"###$$$,,-$$'$$---<++H%%O&&Y--f,+j($m)%t*5l*ZO+/,%32&,*-\.P/D0L/U6N5M71)13344555555556>>>777888899999;::;;;AAA@@@===???@@@@@A"""######$$$$$$---$%$%%$%%#..-,,1&&9--U--g((n)*t*'{+%+3|,aW47-&,-&/:0o0F0Q6W6R2o@4,35355555677???888899999;::;;;;;;BABAAA>>>@@@@@@BBB######$$#$$$%%%---%%%&&&&&&&&&//-,,)--+--6))J**j++}++,)-&5B.vS/+0+,0*1e1Y7P7T4X5G5/45356888?@?888999:::<<;<<<<<d?Y?BA@AFGBBBCCBCCCDDDEEDEEEJJKJJJHIHIIIJJJKKK$$$%%%%%%&&&'&'/./'''(((((()))))))))///6660//+++-----,..(00578q00112/2+3b49;45:056S8Z8`9V:DCB6;<==<===>>>??????FEFFFFBBBDCDDEDFFF%%$%%%%%%&&&'''///'''(((((()))))))))000//.222111,,,.--///00.88110H1122334+4K:P9036.88U8\9c;]C;<<9<=>>=???@@@?@?FFFFFFBCBDDDEEEFFF%%%%%%&&&&&&'''///('(((()))))*******0000//+++444232...00/11198911+22333w44554-:B:a7-68.9:X:_<>??@@@@@AAAGGGGGGCCDEEEFFFGGG%%%&&&&&&'''(((000((())))))***+*+***111000,,,---666544///11199922233144-55c5545;6;;8k9.89/;<[>>CCD887999999:::;;<;;4AALAA>>?;@@AkA6=COJބDgErFjGKIHDGHNMNMMMKKKLLLLMMNMN------......///666000000111121222222999988555666667777898999GGG>>>9:9;;;<<<======CC7;;N<<==>5?^@GHC5BBeDoDrEwQEBILLLKHHHJJJKKKLLL((())))*)***+++333+,+,,,---...//////555455111222333444555555<=<565>>>===887999:::@AA@@@<<3==_???@@4BJABA;DEhFtGmGSOMILMJJJKKLLMLMMN))))))***++*+,+443,,,----..///000///666555111333444555555555>>=777777???>>>:::;;;AAA@@@===??3@@~@ABAC7JD8@FTFzGpHxHeNBKNKKKMMMMMMNNN)))*****++++,,,444--,...///000000000767666323444555555555777???888889989AAA@@@;;:BABAAA>>>?@?@@5BABCC?KRE^F?;GHlIvI{OfVOFKLNMMNNNOOO******+++,,,---555-.-///000000111110777777434555555555666888???888999:::;;;CCC@@@BBBBCB???@@@AB>CBECCDELAEzG@FGDIԑIpJPnPDJMMNNOOOPPP***+++++,,,,---555...///000011111111888888444555555666777888@@@989:::;<;<<<<<>?????@@@@GFGBBBCCCCCCDDDEDEEEDQPQONNGGHJIIJJJKKKLL@MMSSNHOgPUQOJSɣS~XWtUNTVWWWWXX,,,-,,---...00/888000111222222343444:::999555777888888999:;:BBB<<;<<====>>>??????EEELLLGGFBBCDDEFFFFFBGHROOIIJ=KL@EMsM}SS~PkXQLPQRSR,,,---...///000888000111222333444444:::999565788888988999;;;CCB<<<=<=>==??>??@@??FFFEEEIIIHHIEDDFFFFGGHH>=?>?@??@@@AAAGGGGGGCCCKKLJJJFFFHHHIIFPPTJJLLLAMNCFNT|TP}R[USQST...///0/0000111999222333444555555444<;;;;;777998:99;;:;<;<<????@A@BAABBCBBCIIIIIIEEEFGGGGGOOOMNMJJJSROLLTMMNNOFPŇPGJVUzSSuTMRU/////0000111122:::333444444455666666=<<<<<888:::;;;;;;<<<===FEE???@@@AAABBBCCCCCCJJIIIIEFEGGGHHHHHIPPPPOORRRMMAMMNNOGPPHPUnVSSTeZU444545555666778???899999999:::;;;;;;AAAAA@>>>???@@@@A@BAACCCJJJDDDEEEFFFFGGHGHHHHMMNNMNKKKLLLMLMNNNONNWVV[[[PPJRRlSSTRTYUhYVUZןWWYkY666676777889:::@@@::::::<;;<<=======CCCCCC@@@AAAABBCBBDCDEEEKKLFFFGGGHHHIIIJJJJJJOPPPPPMMMNNNOOOPPPQQQRRR^^^WWWSSMUUVVWLW\QQ[XZ[z[101111223333444;<<444655677777888888???>>?;;;<<<===>>>???@@@HHHAAABBBCCCDEDEEEEEELLLKKKHHHJJJKKKLLLMMMMMMTTTUUUTTJPPQQRJRXQQWuUVVW222333444555555===66677888898899::::@@@@@@<<<==>???@@?@@@BBBIIICCCDDDEEEFFFGGGGGGMMMMMMJJJLLKMMLMMNNNNOOOVVVPPPWWRVVkRRTQS]YfWVYVWWX333444555555666>>>777888988999:;;;:;AAA@@@<==?>?@??@A@BAACCCJJJDDDEEEFFFGGGHHHHHHNNNNNNKKKMMMMMMNNNONOPPPWWWQQQQQQYYUXWSSTNZ͈YRNVīWXY444555555555677???888889999;;;;;;;;;BBBBAA?>>@@?@@@AABBBBCCCKKKEEEFFFFGGHHHIHIIIHOOOOOOLLLNMMNNNOOOPPPQQQXXWRRRRSSSSIZZYYTK[ZPMWXYY555555555666888???88899::;;;<<<<<<<>>???@??@@@GGGABBCCCCCCDDDEEEEEEJJJKJJHHHJIJJJJKKKLLLMMMTSSONOOPOPPPQQQRRRSRSXXXWWWUUUVVVWWWXXXXXYYZZ___ZZZ[[[\\Z]]c]]][glet\[d`aa777888888999:::BBB<;<<<<===>>>??????FEEEEEBBBCDCDDEFEEFFFGGGOOOIIHJJJJKKLLLMMMMMMRSSRRRPPPQQQRRRRRRSSSTTTZ[ZUUUVVVWWVWWTWWXW]Yb܄]WVZצ[]7788889899:9;;;CBC;<<=====>????????@FFGFFFCBBDDDEEEFFFGGFIHHOOOIIIJKJLKLMLMMMMMMMSSSSSSPPPQQQRRRSSSTTSTTT[[[UVVVVVWWWXXOXXXX^U\ʐ_WW_Ʊ[]888"889:99;;;<<=>?>?@@?@@AAAAGGGFGGCDCEEEFFFFGGHHHIIIPPPJJJLLLMLLMMMNNNNNNTTUTTTQPPRRRSSSTTTTTTUUU\\\VVVWWWWWWYXNYYYY^T]ZQXba\?999<;::;<<<<>>???@@@AAABBBBBBHHIIIIEEEFGGHHHIHIIIIKKJRRRLLMMMMNNNOOOPPPPPPUUUUUURRRTTSTTTTUUVVVWVW]]]WWWXXXYYYYYOZZYY`V`]ST]:( @ 1&#^4$B+&E'"M("T+#W-#V2)B+%/'%"%&!%&+,-))))))******001------////0/666222333555555:;;888888t & \'/%&1#-8&06#:5"H2#Y/#n4*s2&r4&b2&C-'---#()()**+*+++111...///000000777443454555555<<<999999;;;r &!!,"'7()B*!C"!K"$Q#+S$AT+WE't9'6(:(@/T3+*++%+,,,,333000110111222999666666666787>=>:;:<<;===&')'(-')128?+89)>4*M0)^*,q,)u*5r,Ub-K.E3F0D1S81+02588656666777888>>>;;;;;:<<<===CCB@@@AAABBB!!#"!("!.('<*(E&$I$$L%-M+EJ'\5&w&#$*(Wv/N,?,F-?.<65)/1111333444:::666777888999???<<<===>>>"""#####%)).%%0++>((J&$W-)k)'l)9c*^H),*+0,hw-K/H0O6W:2(13345555;;;888888:99;;;AAA>>>???@@@#""######**)&&$&%$,,-))4--L*)c*'z+%+8z2rV,,&)D0f0N7S4|C5-35355<<<999999;;;<<;;;<<<======DDDAAABBBCCC)))******000-,,,-,---...89923100+11122T885/657{t644:p;^;]????FFFCCCDDDEEE%%%&&&&&&,,-))))))******000---222111///66422+33T545+;R8K-0]:g;eAU>5<>?@@AAAGGGEEEEFFGGG&&&'&''''---******+**+++111..././55533366644454-55C56<39J:R/2h>:22?xCA@AҎDkEaFBJLIIIKKKLLL)))******000------///000666222333555555:;:888===<<<:::AAA>>6>?Q@@A4H=8aFtGsH}ZNBIKMMMNNN*)****+++111...///000000777434555555565<<<999999@@@>>>AAA??@@@5ABuC@IHFi:?HnItOKMMLMNOOO+++,,,,-,333000110111222999666666666787>>>;;;;;;<<>>;;;::;<<<===CCB@@@AAABBBCCCMMMIIIGGGIHEJJQOOMCNDEQ}VzTUTTTUU,,,---...555111111333444:::666777888999@@@<<<===?>????FFFHHHFFFEDEFF;LMICKeJOPKS}Q_QIPR---///000666222333555555;;:888888:9:;;;AAA>>>???@@@AAAGGGEDEJJJIIIHGENNNKLLBNCDU{RtRLQT///000000777444555555555<<<9999:9;;;<<>>;;:<<;===>==DDDAAABBBDCCEDEKKKHHHHIIJJJPPPTSQNNUOOQMQvOPɨTUkV666777888>>>;;;;;;<<<===CBC@@@AAABBBCCCIIIFGGGGGIIIJJJOOOMMMNNNOOOQPPZZZVVJTTVKVRQYZ~[111333444:::666777888999???<<<===>>>???FFFCCCDDDEEEFFFMMLIJJKKKLLLMMMSSSUUNSSzRLSnTYiUVW333555555;;;888888999;;;AAA=>>???@@@AAAGGGEEEEEEGGGHHHNNNKLLMMMNNNONOTTUQRPWWZVTTTYvTRݜWY555555565<<<999999;;;<<>=;;:<<<======DDDAAABBBCCCEDDJJKHHHIIIJJJKKKQRROOOPOOQQQQRQWWWUTUUUKVV[Q^OOZ[;;;<<<===BCB@@@AAABBBCCCIHIGFFGGGIIIJJJOOOMMMNNNOOPQPQVVVTSSTTTUUUVVW[[[YYYZZR[[[TdXZ]_777888999??@<<<===?>>?@?FFFCCCDDDEEEFFFLLLIJJKKKLLLMMMSSSPPPQQQRRRSSSXXXVVVVVQWWsXS]xY_x[\888H:99;;;AAA>>>???@@@AAAGGHEEEFFEGGGHHHNNNKKKMMMNNNOOOUTURRRRRSTTTTTTZZZWWWWWTYYiYV^nXeq^`\;;;H<<>>CCCAAACCC((((((---++++++---55400,//.32S61415wy/7X6k:V;gH@4=?@@@BBBGGGEFFGGG%%$%%%***((((()**)///000//.00*44810{3*7`/?J1q9[>_E=5<>AA@FFFDDDFFF%&&&&&+++*)))**+++000--.33333355244,45h8.:X0EO4y@]?OD@3>^4Fh>pD`DBEFIKKJJJKKK*+*+++000././//000666333444888>>>::::::>>3@@l?3At9CClG\HAJMLLLNNM))()))...------///444222444666999;;;:::===?>3>>@3D;9áFjHhTLEJKMMM******0/0/..///011666444555777;;;999???@@@@@?@@5B?GC@pY?IkOEKMNON..////544444444666;;;888999<<<@@@>>>@@@HHGGGGEE@GGOLCLr@JMzSx\RKQS--.///444333333655:::787999<<<@@?>>>???DDDIIIFFGFG;LLKAIXDSnQJQS...///444333444555:::888999<==@@@>>>@@@EDDFFFIIIIIGLLJLEMnDMRwRiZT/0/000666555555666<<<:99;;;>>>BBB@@@BBBGFFHHHGGHMMMPPENMOHJsMTjU455666;;;::::::<<>>@@@CCCGGGFFFGGGLKKMMMMMMOOOTSSSSJWVVRQ~QY666777<<<;;;<<<>>>CCCAAACCCFFFJJJHHHJJJNONPPPPOPQQQVVVUUPVUl[PXoP[:::;;;@@@?@?@@@BBBGGGFFFGGGJJJNNMLLLNNNSSRTTTSSSUUUYYYYYVYY_[Q`eT^888999>?>===>>>@@@FFFDDDFFFIIILLLKKKMMMQQQRRRQRRSSSXXXWWVWWUYP\^Wۧ^999;;;@@@?@@@@@BBBHHHFFFHHHJJJNNNMMMNOOSSSTTTSSSUUUYYYXXXYYSZS^ZYѱaAAAAAAAAAAAAAAAAAAAAAAAA(  ()"~10#=2!Q2"_0'Q)%5*)"(*(*+///...333444555999999#(&(50'@/*P+?_(bV%D-t5.80/+23233877888:::>>>>>>"!%&%0)(>'+M'@V#eC:,}r(F/f94)23678888:::??????$$$'''((',+0-)G+&l,F(QY*g4?639:9;;>==BBBBBB&&&******,,+22.//-3.X40-{F8ɀ5J>8>??AAFFFFFF%%%))))))***...00033,32;5*2n?<܍9K?6?AFFFFFF***..-...///333333:::995:95?27zSABNG@IKLLK)))---...///444333888;;;;;8?>:?18y:lHYNLHKM+++///000222666566:::;;;@@@BB=B@OGA<|ùB`PDMO...333444666:9:999>>>???AAAHHIGG;JBGufMQhVS...222444555999999>>>???AAAFFFHHGLKIMDDьȻJbS333777888:::>>>>>>CCCDDEGGGKKKLLLSSHRIKPzW333787888:::????>?DDDEEEHHHLLLLLLQQNURgRbcgT666:::;;;===BBBBBBGGGIIHKKKOOOOOOTTSUUPYTX؊ѲR999=>=???AAAFFFFFFKKKLLLOOOSSSSSSWWWXXNZPXĩT999t>>>???BBAFFFFFFKKKMMMOOOSSSSSSWWWXXNYOVU}AAAAAAAAAAAAAAAADisplayCAL-3.1.0.0/DisplayCAL/theme/icons/DisplayCAL-profile-info.icns0000644000076500000000000035164512647526530025056 0ustar devwheel00000000000000icnsӥic08Р jP ftypjp2 jp2 Ojp2hihdrcolr"cdef)jp2cOQ2R \@@HHPHHPHHPHHPHHP S ]@@HHPHHPHHPHHPHHPS ]@@HHPHHPHHPHHPHHPS ]@@HHPHHPHHPHHPHHPy#e߀q*}6Jӊs`&RanpWKbQΓ>yL26p_&(%»L14j Vu Ly+`Njry<094X7NvA("тOgB*c}q+xa@JmTВ{]Salϼ>}> S\rxt_; ӭYÍO1޷Z?lEISgBb{~(cvҰx҂~ C+DR`mO㎜ ~a"ͤ`%q^TG D}TOXg#W]jϼF}Q6EoւqL 7*~ />sGߔ`@Py؄AV?e {_*i\_slt]zvoAԚ*ؔ4iQ%y CxNLjI$$Dr?kt91C*qKоa_ `umE)IXZxk`l.Sxb{?@]fx{ 2 ,ֿ]%+xY֌_(ڧ@WS.BcO6|kmtNS5Μ5hC ͔4[Oo ЪL࡫euZ\dE&Zәi5VTzbA˞) G4 \0C3[rp9%Häj=NDrK00+Qrj]C"D5M%۲F€/V~j΋dUXFw#$JBzs{G_ٽ-I#)UՎ : fnP5+'lm'Sv6:KQF->3QPkm: e< ЉMUN}e5{ ·-+wK6[^py;RVpeѸ=]lƄ[TiIS8 y;c×*mk߳ K׻yPi??ibD?7]Izg&Y RHRgc19&bTR؜l<2+jM`dϟ~Ul -o8*3 ŢMVA\}I'P768IuEȉևXpu€j3q/R/%&H2 ?y N[]'y6@6iH/YKvVLHEζƩ(SARfUk$>pB5KP0eL'&BnSs gAw d eYދ)=AjΧX,ҿ`?3\ݵ“0"=x&+rK /JpVp_J5P@4`TI{ӏ0,9@H[DF&ȰwK%,A'|S;>3KCUpt7 zS0{%MU˵NV?n>CZIX0565S߻>d=am|aXϼn}s;49bh2nϗ#yi e6oLhMV9fv_G^C\:u(RʢK!jihDhc}2fN5X8%{{2pv)'& loh6h働;дlO5 iiku;$9oQX) ThYa[(ͱTWCi0} O5Leズ싧5y^- (OF8I&/j J̘>YC:Gp ш|o2Gt U凷9#$llH~NJoUNJo=v "9&;$k-w,$@g v`^,z&`[|5.r1S{8R'5+=yz rKh$Ew-mD/ᰴ]!uq芲׽x]@}F%\d乻'Ǣl0x=#*֡2 H 3x4"m̗8js޻v㳘JFqt0`=Y5M:S)̦eDrȵ3xJiV\5['x*,.#'2BǗlJd,P=zu9]˰{)-m30%8ȥ ܔE }[>oY7^03Ժ0M'`=%",YfX*Xe vサ'x7BnA@D2"G'< e1B.v 9^]^״,XTV<>1D>=95"c&Ə)L20+| Uʹ9ZM/u$KlL9FBh>7aw*ȗ;Q.syշcq4ѿ:Mr@|pI'm~o3$=X'9##\ fNƩx&T6ߒh(ȑ7kpӿ!hжGB+\:6ߏ^dm' y{Q„)RMSj !RHr9'=_7F0f̐<.J}YqGkml~0C EJ"2PWX*dTܳ׹naZ*n9k0!Nh-["Δ/Q_uZܩ΅3F:JBTWtώb ?RdѸNQ[iMrݛH=N6p[}kujdzq(t Ei MpY#:ArK4 hŝ1㽤cuog-0.N9\q^, z}ŠʞN4ϝk`z-8+1ۚbLj'ᴰv0`Su٧Jr5.+@\c R %`Q:Yw?L~?0ucK.SS;yNہxL4d_PeHH&YFohXVk=08UYC q*ݎ˸]#y~ Z2dqD֢jJ-ظ*|CˣP콍N /J)Zz^Bbm^Ɩ856MIaѩUX-▄FCلRUn#[^ܵŰ,!HƘWiȂ[*h)aoҧ%K1wE"Oaf8"aBSOjP>CJ/TpABNN8):ֈ]P$<9p+0' 2j2zZ*؄ڲ"}C7-Pvnm1GcwK/7,plW)Î⁀- O uɒ 2tH/727q29J [.Bl^< U&ȶCd⥆;繋 j -۴w]>;r3:`M X#8Mniаv#tܥ dL5}C 1 t{1L&hu|9q޿3ĘlWCW2%>Nk*d^56k_^,v>H3]8T5]G푅$bm`E&3vvBweN6݄wWڲ[}t^hWO[#maO yv!$Z4H I No;3]=>6qW OvU* ץ%(rVZ.O QlwA Ds!\"3xR`]wMMMh}?΁d*elFh=CNfRF^`˂]@z {!NJl n,vu“BǜI,UtՆLh X:Rk ;ۺpt>#ݲ47!/!3;A|2*J$pULe>;_YLw5l[zZG_g K`CfC6/X 4$ w^ >W[U=] e7g^n˒݇@^dWޗ PiE-] MO:*Z<1.r5O1a[&VaVhUpJ!\_k 8QN/"$lho{dR,bBԠCŲFU&ij ׭6=4xuAuQnlR735܀6@I= iڢ\8CU_N)Z8%@KAULR%Y;\] A+-q M>` g6)T*42Fݙ(dިԮ|"zDхK&f U#@S⒆>v4ײ۽c>(]FjfDR_ԍ8h4nwSb B"EChj|G)Ѫ7O?4A`NŲiEU?LmC+`.3}&u)>518Vu]Y:E{o9(Ď]RRiITY넛|bG1xwlWs(]5po:8,f75=F% qAC:Dk ]檜s.)D`8zSU[7}H(UDZv{޳xu\}̈́7ڙK9[;?Qol…Id z/{k|cG[V=jh0_5B/P;g6Clej Te1K\0˻ƆyXICj-zwXYiAۚYZjZh%ً[Bn5$ 뾊˅C>6CQ>(}j~*4"l}52uj=G`.Luv4?,y_>/Fj} _W#fq <J֓kz.M{0HXè xhW'M\(3&ǽr&t1⺠tw%Hfsv阂._Ԡtw}zY^_zTF; Ff*{cN/XLyTj&#bYnJ=ܚ&K[CtLiCއi+U)Ȓo!:ѧcGN2@+g/.ozB'!U_/_=L&9lBO_Pbk н9 Dp/'`8LKY" }Vvgy\,> ,4DXq Wnj1M=l>DIBS- H9L\jg+@FlAPCLhQ)kuQaJ7HLA!Na8fo"y)\pҢ8CN+f޺v.CFaݯ\_L6i4m9jj*FOJ3%~3647ar{U_} ^[⟼EnȳOd9`O'u"g֩»3p(+QvvRo3#D"q}j׈WVfTHDmN4Fۂl]Yf^Pu$ 2k=k > w! (TZ\N쇺#2Cz9}w?IBg/ nX%{U:НOe*uub#IMOm鱌!W_^c!nd (~?r<HyD 9ܜD(yds;-8Evb}ߘ3Љ-oy4{g4)޻k;H)2ne4>WcEj-Ҝw)㉛BBzgkf! mIh<QBuԏ9!hUTk[!?Q7R$%BE>&Kmˠ~bq*, /#rڻP B!bY$o RjKO!HK?Qk?o|¡Ӣod~HycT/6f'B'%dzDVI=ݍ4ٲcB+t׭8r3ϪBD`e*g(M[0>EP|ɛS6q?`bm8|"@p^x"P|`ND}OC9h W/C൨kN UBf]Ź&1I,Կg|&NKb >z/)zZT. +sG@zR\zQLB}\=|2k'fMkBDrsHD<}U.)p]5֚5hQr3UC穢|R!󮟶?#6r&Vvo~H[1ʑN-ٶ=UR"@bRi< ž"/yǁ?&JDs4zDTEYdҁ.nܥ$+/[{eMnPvRǺ O/A5ݙ Ԝqi X`][#+MtE;b~i"֍{ݱfNC+rV\T[Ye-><06p3 nPvC3kPDz}3)" &RA "ֽyaW&~ߜG|Q,tթ# PH6Yj)׷f}G )˜{+[.Eq{W4 tC*ԎT+[v}>4b:DSV ^%GP#Ky70j*dЃBF)9@@+gJjjJ)g͌.OR"f*U% vM4S n$PGᾲV @>?!SVFxa/P N@ LpiSzWjbwFѴ*]+ lR U_!*rz پ'̿T mN?CJ4&]7LnqB9g a꺗@ 4;zf Q5赗 ֵ=kV+hc#tI\^槌-&F%F!雞ϽE#{Gav+殙b>U S|!`& >hL@jUܟwJ/]{FP4É8:Ow=G\C7k 덥nfp ?ңB!?ě9;pҝH]b";VqlQeL.1ĭLڨhi"45͓wgCA]X[zl]T r0Qۡp M~:ӻiVp7Pj- *ڤLS<^D,핦(]%ll Q[ǴuOR|CO:_ʧ=;̻amj 3>*Fzq4(q3CE呈6gFg;vz4p-JV"WcvCK}P`w#/y WNF#qt$n -C&MLfWCͬo>˺nw!Q1'IK *c(2˲#MEYIw]aLF_cˍԧ^8¹+eJi$Dž Tna՘^v>:Yg5%*+H>Y@Y4.yWwwbߦp +cHV(j_#& :Ji_ Eu]ou>Gzj1.8_ b~h{eOZ=Z!8V u{Ut`~ ?bt%Yp-ʀϪАGg`ʃ$|N`↾N|1!8vp{{ =M;! DŽ׃ |IIgqeIk6õ9:<;MnЃKj bf]7^3^y÷K5L<Б-¥ ǍΥ_N)% SB'LOW/xJ|SVhx,W}q_SD Bcڮf05h_sg T:!?4.Gk Od5pur8&( ,:ŸjۙD:8yA|Uׂ\)2ݞ5Iea3 LO7i[J?1Ө=RBr>@ : L%$9K\[O栯n~9׫ڡXpo=p4?%JF"Sr1m=(1X_H48W%d:1л&˦Y@},Im:I?{$^h(Si{@i4:SюQQߙJSCijJTƄ'^H}^U?AF& _ㆍDPwAu&04$`X)o'tK)Wn6v8(< Gpmuyx> hP2U0 OMfu! ^j WKQc١ڤ$bf]ҚH-T}h;3(5C\0I_QUI5:hCϊ2%Ϸ_m%}T@ǝHݤ8p~ {yz-_?1K󄍝Ti4P-WC̼&$7P6I7ԵOːnF)^=S͆g le'mH{_e"B+dlO-h (Nf-&Ӷf-**IvLP~@+P۰z|TD[D}u ]P-yޕbSKTKT+aHjT }lUA!uuۚACyt ^,X"`8C=4*wo_Dt](I?t|ȁCjȋdo>̥Õo0|hL}~Lw :Ԟw߯7Y@\n5^.^J@RIyWGjse$Th-FۯM"3,;}M}4@ ^&J0ᖙ!`V!#WHKs-v8"E@ްӶHBパ?'ب1U~_fCɦs+"vhE13n$-xØ?LcIsX< jכM[1r{wZlj0E]")ORRb̈́]ȱD|#[Q|S@XZ"DE=Q%2ۋ i䂇oUL+S{r)!P=N4mOxTSР>/5 xT|HPn3c4mz`[+ D1Ж O~]2XR=H fզAFb1nS~qNA0)gP ߥyF{`#k}*tٸL".-hcζSxޣvOcG~G8W"$95X7wȯo7S7Uֱ_]|}N] -ۉaSt7]K gaOYZI)o *ٞ:.g3x,Qa4+ =TsB)6+/3_#~``h= S ]ѽ7M~lX,C2;wN2j^%f("QFa#Ԯ#l/1 SzהWw])LehOM.`Oj)[wrvXL$r^:ükݢd('bH:n,XMK p@-L6qVs&-M}J.pȯj4Z1Qd|qed|L\}6Z?Z@G :]eN+ *h5":6a6"RJ xJKywS'ϹL@ qnTMp mquT}(/+5"ՍPYl;FqZ^@Q˯NA9 Y^#J#j0 j߳5n.˰%}7*eۮ2ޮK U° Np|A=,ď72 9Ss mh:XBSgA@fZ2_0$RKo3^K FЪ񳩁PLVwgXL7t ) S9ȱO3ia{1-DQԅ;+8h;ϕ[/kxL.*-nI(wE$!D1 MУŢ[dw {Unx/zt&MDS#{  wfY) ?k UmGcGȍ35G#ren}xX[Y˞ V&qz特~hę!P\㕙5S;, AcLey氂ْ@5*jH |>ě6&*|z#%+=FkK}AYK1\wG' \ s1XXmiIT&GD2f!RX( p0*AWbc%"ݣ%vt~֮,䥯+hj2 |Ep Yg/71 17s+c5 `ZϣU41&-51WgWM!>la>Oe0u@^rזI28p+rg xӓ~ *~m|$"`ܩk0p%Wqȡa~ym@mV&Mo*"7qckyf< \4UŠΠ&5sd^bwq5j[!X]I)3=ƐLz(%/^o`B8Ѧh-ԷkvBd2gO=#"oɣ?1rmPu,:zTm9_NPSө#Tp@(#*bg܅I4%cn6\=r2gk_cLt?jpx]6sN@*02u|diRZ8ҪJ ZMdF^Aze c>qŧX a9 2v0)(ح 3m<@P4E`jrzb/}'@ȡbXx$1pnT+pKE!UDב8NäCY46H{9bMt*],4힥QE[ܦA罗mkSBނ;UMϒCyz\JT;={dHF@t%c76H6eUx?з#r}ު܏UKب. rnIwF.H- %jf58ߢ@0JG[0 CD5d=6WyU{ ^`Hp}4oRRmf <6 (?c_-+H 扰Tel\xPihtӿ7: S&ӍT1΂߄IUj+-Wr[,l{] .g'+ÿ͐ i)[ [x,($Knn$vިy<%ӡ3X5DƝ;P{,['M=oIe 8a zSZ>$S167޶&cFUsFQ-1 :!Wq[oșu㢛q|n~G(]:@O|?덄F`<I4򡿮1`<=F>X]e/P+1 Vݏt~[kIIC< 텝_jO .5f3X6,?S磅iϵstjVL9!aQ129(_d;oR*ZhPUb 9E;k3 }mr0>쑿Ǔ-sn$-wG*avHa>|tZ CHt=$𣆨 dxBC'C]F ^yG'4š)c(1> [jӞ2WdC/˕nNEwg,^zے0 z֬/%ҴyTF 7rHZmL-w͖lI|U?Uf3~%EB0mxt+3ނO6CK#fGg!瓞z9K5qZ{{%kkB*=$LSzћLsT'}]8cL"N]4FB5Jq"R6סejXat,?-Q-ȷ\lx?.W6L>9/PhK $[e0{!*uv{Htx ٿEqbvu&c s b 1`W-#)l129S-Aj\<1uNv;9`S5Zt-ierIT;/6LIh>hю,dbq%md5|`Z fG'N3=31DQVY T\K&(s[Ȅ9V)kH[2$|Ҙ@+{h1$.'R6rOuҒ%)M"午PCy)CM$-"V¯++ɦ #" |/ MT`oP=?s8t+pmi563U"EQkeUD<*l.ے 3Ek :n 2,BO䫀sn-=Ǚ)YL\9 "6_PSqY?e^nNOR>Դ:!/R_v仂3lpk=Y יQ]#Օ"RLA!bxv&RLfWuvz,PљlI(j| l^i+d׻t9i%IJ 5A !%Z)BWtu{vD%rC9Q [|j>*lv~],{:ma;APa^L$k~ʦCڷ7k*W _/$V Oy.~'H:67 CM!FyԎ{(|7'x'+=(z;/0) ^+'j}'U{=ӓpO91O][u T,2 nܦʔjƣF㺽;~kZU x*ZwSnȤ &U3+Nb@QW9: `\x`5D櫦_RYkM1i\OA\U,X=Qߧc֦!K1B㧇Xle>|Z .b% xL1eX>AVZP8ʂfx$DUg1UkrEnTL*R}z:tTU븇<ϵcW&}\O\"Tװ2F B?GF=-m<_5pW}Ќ fܕ f.b˳!r*BKb9kf.nK1젦6" B1g[# 7BFcU%;駣 bc|ޑ-xrpՐW pm$&S$ 24Rp633o|lWHLY11xh-f}L-&y-MĚiOV}r1 Ġ1%EmwⰬzDZC-j2Y%yG*j8 jj&FFv+ZзF-v Z]e Ú!K) ݽRP{6I фx@+IQ vz]|dTo3ګяsL QMua *½H]d/U6"G"Hupy{Q4n~-K3F]*wwv!BcPDK-@T$X:&mzW3ggأu):֐8)&](e[a 3<Nas`s"U@]Ǎx;AD:,]G@Krc[^C4``@Ҫm5ЗK@ndJJNe?~:2M%JstϱWεAP4KDy À~mqh0/!xmWʪZcI"hK߯otL'̕iƦ }B_\ߘO+П+HsY/]uyh?7 U> ނ,>CE흣yWgɗ8C[ 9IѤ!x !a{M"SvqTKBmX2h.}CVIaH"e;$|88qe:lD_Dncx i|#'qք9Ȣkx+,$Pxx7:$3`Eݝ+b[O«XV+o#>M6{Ry>&OH=Q*9^(<)* o= <ޟ1w"ڪ‚zՑ㧶e>4o edh(ruY nthϦw4{+-1 šYpC]ɸ k$sV"cD+"eK㾛  yi?(%Pɸw9.@ zFEkQqVpM8)-1{Sq~SoĘۖ݃INJ Ȏv#Ldc/"u >A=p)$T(4zsXpǟƜ;kP=3F_Xl*2!ц `oK#g K!F9b(7c ҏ<:w|=+^SJɠ_rg$K︬TO8O#H/+ÓOe gSJnȄJ؋^@qjbO.Ki&FWq*5I4,}|)?&ws yhȦR]%҅6,ڸjʍ!"g'GPt\Az 6Su 65* jO |BY kItž J*3)9CP+gi Ov-%c(( (S{!Bw?H 0`\]2槦_ٝj-UY*Y4l}紐 1@/RT(ŠbEezlfdqyN{ LON2AijYE0-1UnFm9EÛѐdj\$w*/7|sg.ÇZv>}_l6k\6iΓyɖ,WL%Zf2WG?ți6qidT$7ZdH{P-IG+!BR44Z]/v_$?.DO%1rI1pDƯ_Dqj)ҧROl )HOY՛Zesd )wѡ)')^bOGOG6}|(=-tc̯U Nu{eP LKj 18j֍=K@aH7| -Pu=OH43S9ns>]*'ߖ1F Cmd%7dQ[=8d|i:)@%_cOe[+^~\:Dgros|[aM(æ8&ھ"fm,ΛR@H1B6KpSr?b~]>hƻ99M"7-s$;@ak@]x6 l3p=G(̎v})zaCݿzݹJt#Q=bN$YEVD;P~4*Lۢl8ōk<66^X9yyUsm(QkTtc˜ Xڷ)PB Y n1Fqw']dsb@|RҾ+|Ru.pEy|@Z"T׺wqdO6'Kv--c'Fst 6Y̡$IMII"g\˲,j ;o(V cI&34N"eXwi%3uG8le)l,GfkE.x@jeDl)z)B5yCTen \Hhdb>Af8w8a84< &g7p -8tc^7/06RA-  nm딐3͹hs_EfyI MoJw*)qC O2gA@c"{H3P;a}( {X8B#ƯdIMζsuJ6 8<&ʎ"e]y9)[##P" Ds9 NJF-ǟPcpeʠUu^f!P{C:6{ Sw6RCk`We9L/yZޢ*H^ܴ$4(@drf8TcO.it7G#{ˍC;w ^0/T/VS͝s)yIP=7$E} .#k{6 rNvm/Duu*W"SA-K鯸/YѬf"罠}`m$XlҒSh9TdȖs'UJp&;d@2-P\t!DX  ;;[" -yqw5eP"8X@%>_7LY'0%UP QL=ݨ';F.ص}w;!i Ű}F2Hu ,mQ\jZWxiqRNM tM@^؛cF+u佯3 dn%Qn-3x:Y ަNwdnat敿!?w>߈n.qt5ąU1lb%`⯲5˳Y/Q,Ҧ&&őrWŶ'e_[Sc7NTO<]wsx"*\3׽mxozUH |(11n]l~.!E_6TYy#Nd,.sEP]Y$aM.J|6p/pyfKфNŲFKSъӐ*_ `|YO'z7!6ѷ=2\-dK/tU ) jQD;Ɵ"iԷt)1 7m 煹6`fʇXMxaƽ7\NFF1i5Kj)^C%4ձ)Ó"X[^ y*ܬQТ}E)Wu[bd"H}mWx8qCd=>K:>][NgEDX5gpy ˓^5(0ӓ5l٦И]JsSI6m-da/RG0a艮 k‰|Ipzv g\"=heNr5hzXW*s1nj j 7WxoMe!67~ /b5'~j;jXxXO":#E!@uy_m,JKcg9[qWҁBړ-X᥼m{D-[.*4.x%&!of$ker w=8w'kL^?;@W(/'2'm 5 צ;"{8mI6 p|ӂw*~ "³Y7yؖu`OʲM;,4^Y| CkN÷?HںM)~ѝRiasl0 Om~^Zng">H J LX2"kg r0aZe2aZ6?@${ WIT*9Yi \kaE3ᚫc&N޲^^ {c:`'[UVHx)i֤SmljߨFk }Ʌo'8SM„X&tc-e9 "jkl}"ѝ!Ρ0Um{&Wt)`?=n?W^H'V*Y;F7?N?~(rIJy,;(`4m& _zY*L=D$+_via.N؇!% lԹ7 xm[ކ} @UU@aa mTz9.E&Rx䟪XoB:h5y]@u:_`=VYY꯵ِo޻}p?Ƌ24x""3dЀN y_ҩNئgC²\`a z>聢QPDaNS+c du1jϥks#f7# 3Nrl DרYt \r8k#G}͌5`fpGS?__!0D !k۠scLjH'_Nj_w9 )͵ % aIe Αu_KI=$ou:)^>022wDڽWD`h 2(օ|Z<ymSu&=辖jHR6FI (s# htM*|~Rl]vYD,0g *UbG>2҄\$̗8ATt]4k:6sZ *qaE׻.J\r!e S ~*l$q.|f {WuZ7Q>.@ҕ-jĮ8:@h'4HuX7d¤; T!aRh7f^{ToWi?f/A݌5W.0Ң5N/`uO @MI'dEVxY"q%boyOU=WjKaY N摐=ZSfyf1V@W֘-NCԤKpiT"zh~7]#Ǚ"~u T#X%vRvc \jT˄[Klb?\k[" ;xL+hpK'bxLVV Traq?%?t箆wbc.[蹫qs^}? z&?}S;1*Hu1kTu35F jE8!kR2 JYǕ|4=xfGx LzNL>Nzٯ.?S􄖸0]iq$SJ}+؏f62i\kE339:l/!m+T2Z|e0Mh ܖħWyZϡAf+cddL [힮HzPR&J~?6.,Q\ӎ+E'1,3OXS?Ќ.JHr'45UY8^h, y!  Tú$?\$`3!rro./F6r z']"u!B_S\5]fߎ? b6KJF_ Xi]Y؜!.5޹lo[B9sri82^erw/rN'@tUZW,ۚn2杮,.)"ut'15-F󉻳v 3``jc4ׄ2RJg@`/7/UCvlkP0>P!*z|Y[U{V¯[ # 5EL%fΌb&䪑c/|ڢi}@Уa>]BO| MH&A`),p>1 '+ >rY X.p*P.k 'F օB,GN =MFICI|(7^&:J7ꈲtܸ,8ݣȫ#>̷'b}ʽb";4bhfg9Qpοζd{%`Rh 4Xp˘,'v|Y:w,btK,``=Gگ)XɺAZ;t_H=" rԡTUgpZiM ı07M'n+H Wݩ LM ©9R${DeA姡 /)x%_ Tgb4wH{A>䗓c7%dLZ9=L7a5,P@FԂ7 4ƙ% )B WMqiC { zyhEiLPs kML1aYE/x?v&fVWԂ6bl`k6)9K͉R,*QO]*[ phisXDLN<d_AY^! pu=e^Qz9tOPWvT.NfB)7(?' EO\ZFhNlvxJ?;7[Ō휻Y}RSvz DP.GNh )ˤ~2S8pqȫDz_3^t!] 8~ҧ #Lh)4<teYs^C|#&w6u RMUC7s{.3(NmpfX3#˻r@ZsbؤcDYeT(1/M Mxdj,eRY4-˙"bDE+ 1c$a]n+156OtRVC^U- ΃ٹFZdRs.M [.$7:OFyם6-=U\%a~l9B9|fG~IX/ {;W1%%5.W^O0Vs%Oևi$'*ꌐڍ H2s/v53MR ќcF\y[ т;rEGt bՇ#߹_<.dK_]٪hi`Ym7̏cE94trNov}6M/ڃL^Gd9m_d=1-:AP ZcƯWמ[S80G|ISJu T* Udz}] ^f <{@41DE[c\Q5>^ܒ,/>P)g+/-=$CRkei.|+8]Ӑy ֖Zҡб?WYxj+ ,*43椽ϖ g"ޚԻ΀` grF4X%/4aosK?k(e*Ube>{Mg ̏|Ar"yW;O/18htϹ%0-\ZQb d6eeu#pq.s-TI2I;>rĭ'} '^tWRŎJΗ79kk-VZL-K?=Pr7"FFC Qк7~В kA;NW41lR 7_7$*r xFv,qoC.~Ws.FW5T qwﵬ|O e[ܽ#qw^oت\7Jw.)2n@M+n&_FVhtwϿ2KytWw8|-TҤ̀`qrFh ^ވ@pӰ PgI]kN7 ^ܛwqOW*)hheԭ#W :}qOP~WvQĐsIӕ'Q?(ڙ^@+ƞ6ۍ%揇6r{}Xg75LMoQ,C^k~ cǎ7$wҹ2K 3RXfy~>~^mc+ c=1H\ZŎQߑB+aU(^"!4jj+4%vdA頑![ĕTa}(㋍<{%D &~1/?2|gOxĞ 䖎1DՓDntRZ62(R O'^ uyElfLS<`\NafF30&7_$.wViW^;UCW1D֧2ekvg"?8>;y'mKۢ.^Sc}1d{_Ȱ[nAUL%nቌ,͕vlu ?XO`%34womfg3 OP^6nw=ӌr%g>!ps=iQJgb+3MF6+,}Zys8;S?}LI;:|M2K>c pܿOTxk4H_wy .EJa^; dT4F]t3,dĘFLϼ"pOLʟAr~{ roHTU`7'xZnJ1E}L+NѿQ\ '+alUA~'h} "rXӹ uu1z3 U;':jD +&5,Pg 4QGH%Itw`\歴~bC}?Px$$O2e! 1xu.%Ph*'F^#-:ʹ3egZN^V CUkDޜ,_%$0ڊ>⟅3 郕/>f 213+^AU+%/rt5ZX@Dw(JZC ?*#L,ZWb:W3S}|&i}y&4oe΀#w(6%q6uЮU;7>f⍭癰1=`WR:'ٴg("DvvOIQ2d*AeuNcԗf%C،UO⍭k~ =xH.poEJq ȷ_S1QtJxF.U/8-®? ;Sm =+εw( N{dh:Z&n4h  ^{?t(x (щQlAd~~jNsHau>!Gͬe/'otW0%j C~W}OW-#5JPyU stq'ïB *\jY/ѹ6J'.rjf "Mz$UN(Zh~ cƮC@8g"'NcׅŒ4|#T p]ߘGXn9saÖ#(~?N//za}?oq֐t;]Zf+a:{gDaMBѩ[/@BӴAH>ub/22otϫl%'ܺL_*}E! ļEyf R%ګ+50أfSDO8 oԔ`4 t 5-O "A,ȤWMTp*@|xͺQzD#]qECuPTY#\/x&Żm!?4PE*>ˡG#.i*ez*2\¯zA^QZUcYCd hV|P̜Ì]-V5k1M]~c#<-aMH쌚G%{s7[~cs~ul0O=8eON dD% !HVԥkVwR"\'[m/z5&aȌk5 c}(b%YhCh{ _`[6!P.͢8 /f: Gq&C rNMqkI%C0P4F+WQ8kP_/  "٥S5TJ,B85pD=; X'N-SMr)`!{ x5p-?<[ lHǍ2:z'; a[ 05i4LAd1fTcˈQv%MPl.PƇ҂\eWcwuR<_PwwX\n]hE" t|HEDznxf_:z`&F}xsv9pb8O9C=\{徥d < bW&$1QnЂST FH6/"៏\2eyu)VkKa I'9Dֽ<MF5?%p\ɿ~ePDj6%8IJ9xȆ ~?6FW1];DHJd&@ba}YqTVS"Q5̹iA5Jh"mͻit2(Y䈯3\7ٍX dc]mw>0퐅H|pvw{66'EtOVO xuEv]uG 'y{ˉbI1 /_ؘXJ>d7Hu:YZ I2uajktG*t*CDMm *ѡO|`₏xBT˜Ȳ8s6OO,_6f:˅ڕULlće."."ΤbLT48 Wm?yC_/`'VU; UP|L [ye|n~E";/x;GAilZtq%w =D | f QFQzR6oH5%cI9)ĩ"<<СxhMsVݖm:.} [5e~%jb%a[>䤍\[Ư$]AYqRdMއa v]O{ȀpUeJ<.H8x @o93"-\Ô?b4P5C.|;xۦeŁ̍(Ly\=|H(IYd)/D2#hȄpzM;';GnʡL9@<ģ% `}"vN˚3$1R{:TS={k08u-uHU!Im&EJZ{D\t2n7J`TT[K즈*&skWa˖taTGجk+ `Ƶ ueEgJ2.g5v([?(;a_ L=2#?tL|0G̫xm$^ߣ?a s9St ȕMV$C2b߯kS{?)!Z]FUH 4SOwc iFSt<5\Sm!*5rPOE> K:p&D$ ]b66W\B](imjk\]Pe[} xZBac+Di+10Ԟ1;=#j9wg-AbgQMi9R* жfJ~GkeG8"dWVo7EgF<67fZgS P*>{okY5c)~b?-aR=l?*{˯4,t4S~6eTOE8tO27[R Qyͤvܜ[8;N+Na9,v,O"E\GWPPJ깽g8YEGe~+oy%X6_>RM6N@s :DdbrOQ@HTE`v 9ђ6<0a3Ktu(~$Yc JD`NJ)!M}˪`mT)+IAK?*]#B1oˆ^#yT1&;|9w.LjQmieKz_"#e]"ꕼ܇ c\f} V''"gP3B9D0wףE>uK ׿/޻e$t+kX6?bX_.YcHƔ\h`5mٲp wȊ=bIuܥ9DIbuj *徎=o>WfK CU-ݷs b;Uip2| /c\G7m6pMZl[m1ks>]jp~}%Taַd5*k_ej{O Gݯc2#HKE\57ƧbO{Y1iB sFcA|2L ebJc"tS64nC`__c;:E}6Q⮨Qњ:9?ANZAza&y×p-y~ы %p$ZywN>$vVA'f4A9ϻ2nd[W\iTUOHwF^ͷ,!ӒJSS8ّ}[K@[  n{selOW{\BdX\h߮.KGGC(Fxv)L(T׶3A[ 31} E^lcއ+4zt "!)ǩI0&iRc7[Eqt жyfVt4JykHJ`+A}pfu`ήJ 8a}}̋Eo{ >A4Nmv $xOh:H aOvW@ϟ=0A?tvb[4z eﰔUjZxgX0D }olm_|Wo[V~qU& \FNpq ) @WfI/YDs\ϠɊOg &l}8o !%E |4ףM/tGKLcqdnc@97ZJ =vO@QsRVo/U6"G"Hupy{Q4 coW$2: |8nx?QZ /!PKPyLN8'`Xvaؤ(IDw ݅0$unֹW ۍ_-dNLm !.]#fʟ8ITQ'ovcoHo?j:Vp\B,NCQcz+[<wA:yX@ @j+|E m<TOGB6$cbhd_6 MZI@@䘐*%=e*MIV3yh""ه rY?9H#!PO0G糏$NrPi"VPH 2FN@\6-Ty3C6>(DG OuN̹$ʖ>>2dD~ozWƻGQ"NJ^4$b{6z-gJ@>A:s.۾8~ HH6\v. rD+oEAu(e gB*UM/Kğ'Co}<#J) NƷ&_! irng8lZT2SrĽ[.Aa4 $aKjd,0P/ql[yJc8`2M_J,|ŹtUrҘJj( $mM;qݨH`?vR 'ɈiXmݰBtn"0&99I::t  gL(5ˣQk;wC hg(1+ [y,.y7T1ș&7 Ь,9\c}ܚ Zw.8݇$rM!a‡mF&Qyw[AԌ[zxXn/+j˫UO#WaO7AVk}:F D˄&&w)>4SwOj?X$_i (}b7Ě-;Btz"M G\|VØ%Z5G.%_m" e\4,7_suF;덽RC!@/WSYwU֠O^L$B]iVQE3yl3o@xh1+ uה!<׹CTlBE Na:!|XHL@{*RJ"pTv r4Q |J,)9 4Xz|YwHU2O'7 neX=;Z- &rbBѐfmPPg:&̋OQeʾNPRQTE=qs[z$'=п3qoRJYj4Fk6!%9+`x) eyc4\+$Q'67; XsX=aϏ,,ڜ0K$OQuDS??v=@Sj#5t!(J~qa6{j; m^R+>WK*XOAI9 ٍ^OP-A(^V>&1Wshf8/Zo/(FY<("Nعq5a=!hP&pŽ9 Rx/m;4R18gN8vSq<%65cD5y69@Rӌ 4 5,4 v G 4Fk1v&8D&E?TTѓ^@R| c9.)Dl$p\mkH;=B;_ek:Ě ň.#c+.ctv*`@^{pe$\$hl1^Kf5+n]gΚ:[Q]~xʥ<؁NP0/A$14'0:-gY7$pH["(KEGi- Ϙ*rVȵQ+wDܼ+bĨꢚ?aŜlqrgѻX-. WJI@I^ a蘛tG|~- A:>Z3F"F(&րyI]u*`tԿ3ANEI]],a#Z(TY"pڭB(kywb޲nv JʦGy ]=CjqAF}-7~f%(cAo zZ\-E7Gn\7(r$"7 O߈Qз7 u䈭M0 ?*ɷR@⼮gS.C80sS gQ#dk5Y/X#q2@m[N^fo; ͦIY)w bȔ Cu |ha*~q`1`+f2nϲɥoy 'y2jX5Sc)2>̉5dL9zg{xX@F>hoR8 @f{+L@p0':5 On/ڋcK7C{bԜMQy\p5@=ɑKq LR)MC~&,? v@GE! 4Ë1r\;\n{5o1x]ЭX(D-!q2Wi8 ݘxA) a}( QTi _DXIH KvmQY 5g4Eqm'G\sZf"u.cq3+7,/\CށCd).q P,Wb'ovփeCJjW= im0b?l昧E8ɖ8 gj[MgJx+n ,x]:I 1;gʶ&[Z gIQ6aU,jSX3v:2FFS촱[{+$Y y$V+gk,c{ ُQ‰$Y2`-+ˉ>P+ȟ 6{=O{l[+U-[Ib64\[po*Yx*]/b'B4Mف+FQWM2D]H^;k*Z6Y]9$5 #%쩛Grҋ5$e*^vٺݥN-&ޘ;h"jeBs7tB\2ؘրќ1Qp-}nxG*%@W 6wBZPqwil׀MK#vP]!;֪3;7 0T-3!T76;a4ތ#LAl3t);L:6(RV`.^vfm/ߣ޼iYj:(@*y^SoZX߆] qضW&Z=3X,|g;SMA通3RY3MͷPz3wl v54*.H1+&G Ws/帨C\XMStwJPbuhChu!d쳿SKqZ:72Tɬ*Gs3*p"w7v+ /rZY)p n"t@)fq\mmX@<{lDGE2zƭ-!@Q{ ٗXT#6}V&yZU6-}|Չ /Z*c@ >}@Lsil ^iM 4SI.!f;*8?8OM:n8+w(&9YQj(}I~%Opл#i tZԸF*$wpo՝լK٦ B@k}O3A,ELJ#Bs M U,wܴrB]Śa6FлԜw#HD笆|\thIb,^UWl^Kicӡ) 7ǚG2q@K}PL ˄g*7 IӐַy}{zh|bNJVEF_U]3swYkIXUٲ9ι'PGu 5@isp==Nށ'5a+f䶛N7 AJ1n]<,c+pK1o h(ohҠo'(;Tr ]i֠vB;+Nt4W 4vٴgum5 DSJ ռm>(̞{X&0Z3w. v=$ɹ/q̟pӫB׈|̨:1 g- ҧD"ڛmMp9Pf)n"1qA-Z ؜AÒV? DlSE`.;ٸ89: }a&u jks(D İwE{y|vͶ)g*%XEyfG2/G^3õ~ ȅICp2V=x|`,+B>E0,%ըR SAv p:*X_:FS1}e?h Q)Pt^]iDl:B V5~htݐWlçP;OCZL/K՚~tvN5o⧱v1|O v?j(2nq:6r\W \?Q?5<B+<H=W\a7)`._s^zhW#cq y}q9e=t]1UA Q0bбT~A*.P 쮎1~Ό:O[cE1|7,y X7I0~i G2QnnRoq@8i/ /}bE*Ph4@vkh1ۢ`ʋ ')"bb*:͗n(Ӕ|Bm |,4uAģojLiNA3]DakBuUZ5qR4{ux̄=8GW n8,pl-I2ULLsdmd99 it32<=Q=?@ABABBCDDEWFHIJJK^MNMNNONOPQdSRRSTUVVWWhWWXYZ[\]k\]]^;<==Q>>??@ABCDDXEFGHIJKK]LM NNMNNOOPPQPQcRSTTUVhWWXWXYZZ[ZZl\];<==Q=>?@?@ABCWEFEFGHIJKK\LLMNOP QQcRSRRSSTTSTUVgWXWXYZ[k[\]^];::;<Q=>??@BCVDEEFEFGGHHIJJ]KMNONOPPQcQQRSTUUVVUVgWVWXYWYZYZ[kZ\^]^99::;< P==>>=>?@?@BAABBCCWDEFGHI J\IKKLLMLMNONNOPPQcQSQRSTUVgWXYZk[\]^9::;<P<=?@ABABCVCDEDEFGGHII\KKJKLMNOP bPQRQRSSRSTTSTUUVgVWWXXYXXYZk[\[[\]89:;>?@AAB UCCDDEEFEEFGHII[JKMMLMNOPbQRSSTUVgVWVWXYZZkZ[\]^]89:;O<<=>>?@@ABVBCCDDE FGFGGHHIH[IIJKMLLMNMNNObPPQRRSTSTUgVWXYXYZYjZ\\]8: ;?>?@BUCDEFGHIH[IIJKKLLMNObPQPQRQRSTUUeUVWXYjZ[Z\]78 9899::;;O<;<=>>?@ABTBCDDEFGGH[IJJKLMLMNOO`OPQRRSRSTfUUVWXWXWYjZ[\]6789:;;O;<=>??@?@AAUBCDDE FFGHGH[HIIJKKLMN`PQRSTeUUVUUWVVWXYjZ \[[\]\]6677899:;:N;<==>?@@AATABBCDCEDEFGGH[HHIIJIJKKLMLLMMNMNN`POPQRQSTTeTUTUVWXYYiYZ[ZZ\55789N;;<;<=>?@@SABCEDEFHGZHIJK LMMNMMN_ONPQPQRSTeTTUUVUVWXXYYjYYZYZ\[[\556789N:;;<<;<=>>?@S@ABCEFFGGYGHIJJKKLLMLM_NOPQR SSTeTTUUTVUVWXXYYjYZYZ[\\IJKLMMWMNPPOPQRS]SSUVWXYbY[\]^_h`_`abbacbcdnefghiiqijkllkk56767898M99::;<= >==?@?S@@ABABBCDDEFFYGHHI JKJKKMMLLM_NOPQQRSSdTUVUVWXXhYXYZ\5678L9:9:;;<==> ??R??@@AABBCDEEFFYGH IIJIJJKLLMLM`MNOPPOPQRRSdSSTUUVWXiYXXYZ[578L9:;<==>=?S?@ABABC DEEFEXFFHHGHIJKKL_MMNOPQRSSdSSTUVWVWhWYZYZYZ578788L989:;<==>R?@ABCDDEEXEFGGHGHHIIJKLL^MNOPOPPQRScSSTSTVUVWWhXYZZYZ5788L889:9;<==>?Q??@BBAABBCDEXEFGGHIJJIJKKL^LLNMNOONOPPQPQRdRSTTUUVVTUVWWVWhWWXYYZYYZ457767L889::;<=P?@AABCDEXEEFGHKKIJK^MLMNONOPQRRbRRSTUUVUVWWhWWXXYXYZZY45667L89:;;<==Q>?@AABCDWEFGFGGHJMJIJKJJK]MNNONOPPQPQcRQRSTUVhWWXYXYZ44567K89:;<==Q=??>?@ABABCVEFGGHJMNIJKJ]KLMNOOPQcRQRRSTUVUVhWYYWY456K77899:;<=Q==?>??@?@@ABABBCWEDEEFGHJLPLHIJ\KLLMMNOPQPPcQQRQSTUVgVWXXYXY33456K7789::;;:;;<P==>??>??@AABCVDEFGIMPQI[KKLLKMNOPbQQRRQSTVUTVVgVWXY2244544566K789;<=>>?@BCCVCDEFEF IMOTNHIIJ\JKKLMNOPPbQRRSTUVgVW XXYXXY224345J67899:9;<>?@@BCVCCEEDE FHKOTVJHII\IJKLMNObPQRSRSSTSSTUgVWYXXYY223345I66788989;;:;;>?@ABUBCCDEFHKOSX[LGH[IIJKJKLLMNNOaPQPQQRSRSTUUfVUVVWXXWX2345I5567789:;O<=>?@AUBBCDDEHKOSX]XGH[IIJIKJKKLLKMNOO`OPPQPQRRSTeVUUVWVVWXX2345I5567789:;O<=>?@@AUBCD EHKOSW]bOG[IJKJKLMNNMNN`OPQRRSTSSTTeVVUVWVWWX112343455I567899:;O;<==>=?@TABBCBCCDDEHKPSW\c`HZHIJJIKKLMN`OPQRSTTeUVW012455I57 8899::N:;<;;<=>>?@TABCCDDEHKOTX]bjVXHHIJLMLMNN`NOOPQRRQRSTTeTTUVUVW01233445I5789:M;<=<<=?@?@SAABCDGKOTY^cjj]GHHIHIIJKKLM`NOOPQRSTeTUVWVVWEFGHHIISIJIJKLMWNNOPRQQRS]STTUUVUVY]aejosyvWY[Z[Z[[]^_^_h__`_`abcdleffggfgh01234I4567899M:9;<=>>?>?@S@BCCBCFKOTY_elrNEGHIHIKLM_MNOOPQPRQQRSdSSTUVUVW011212334I5667 889L99;::;;<=>=>??R?@AABCFKQU[aglsiDHGHHIHIJKLKLML_NOPQRSdSTUTUV010121233H445676678L99:;<==>?>R@BCCGJPU[ahnuUDGHI JJLKLML_MMNOPQRdSSTSTUVUUVV01223G334456788L9:;<==>?R??@AABFKPU\bipwxEFGGHHIJJKKL^MNOPPQPQRRdRSSTUV/012H244545667788L889:;<=>R?@ABFKPV]djrz_BGHHI JJKJKM_KMMNOPQRcRST UVVU//00/0122G3456778L89:;;<=Q>?@A@BFKQW^emt{HEFGHIIJKJKK^MNPQcRSTUVU/0 1121F2343445667L889899:;<=Q>>??@?@BFLRX_gov~n@GGHIIJ]LLMNMOPPQPPQbRSTUV/./0101F2456677L89;:;<=Q=>?@AFKRY`hpyOCGHIJ]LMNNMNPQQcQRSTU-./011F23456K7789:;<P=>>?>??@EJSZbjs{@FFGHIJ]KKLLMNMMNOPQbQQRSRST-./..0//001001F1233445667J7899:;%<;<=O<=>?@ACDEDJOV^fmvZAFGHFGGHIIJ]KLKLMNOPOPbQSRQST--./011E12434565I7889:;"<;<EEFGG[HIJKKLMNN`OPQRSRR+ ,-,,--.//./D012233445I56+8789=CIOV]sjqv|DLT]eoxGAEFXGHIJKMMLMM_NOPOPQ+,-,--C.//0123H4459@GOXakt~8DEXFFGHGHIIJIJKKL_NMMNNOPPQPQ**+*+,--B-./0124H34456FNXcmxXPCDDEFGHI[IJKLMNN()*+@++,-../0E001236=EMW`juLCDDEDEFGH II[IJJKJJKLM()()*+@+,-,-./00E0011211225;BJT]gr| z:BCBDEDDEFGGH[IJKKLKMLMM()**+@+,+,-/0E012138@GPZdmw>ABCEFFGGHH[IHIJJKJKKLM()*@+,-//./D01121226=DLU_hr| |8CBCCDCDEDEEF GH[HIHIIKJJKKL''()**@**+,,-./D0149AHPYcmzD?BCEFGHZHIIJL'()*@**+,-.//D/0126=DKU`mz6BCDDEDEEFYHIKJJLL= >>=>>??>@J??@A@ABCBDODEEDEFIMS[dp|`QUUVW XXYXYcYZ[[Z[\]]^''('(()()?*+,-.D/016?IS_m{6BCDEFFXGGHIJJKKJ'()?*+,-D./0138@JVao}]:B CBCCDDEEFEEXGGHIHIJK&&'(()()?))*+,-C/01158))*)*+*+,A--..//037:=BHMU_jw??@BCEDEDXEFGGHGHHI&'(''(>)*+,B-./047:?CHNU\dnz5@AABCDEXEEFGHHIHI&'(>()*)*+*+,B--./147;>CHNT\cktH(()*+,,A,-/248;@DINTZbiq{5@@ABABBCDWEEFGHGHHI&%&'(''>()*+,A./258;?DIMTZagpxU:@@ABCWEDEEFGGFH%&'=(()*)*+,C0359<@CHNSY_fmv~6@@AABCBCVDEFGH%&''&&'=()*+-.E369<@DHLRX_els{d8@@AB VCCDEEFEEFFGGH%&'='()*!+-/1H69=@DHLRW]djqy:>@@A@ABVCEDEFGH%&'='()%*)*,./24K9=ADHLQW\biow~x6@?@A@AABUBCCDDEFG%&''='()$*,.0258M=@DHLQVZagmu|A=@ABBUBCDEDEEF$$%&''<'(&)+,.0358:PADHLPU[`elry 4@?@@BBAUBCDEFF$%&<'*(()*+-/1368;>TDHLPUZ_djpw~L;?@ATBBCDEFF$%&<'+('(*,-01368:=AWGKPUY]ciot{5??@AUBCDEDE$%&<'+((+,-00368;>ADZKPTX]bhmsyZ8??@SAABCCDE#$%&%%&<&&'+(*,.02468;>ADH^OSW\aflqw}6?@@S@ABABBCDDE9:;1G<;<=ADGKNcV[_dinsy <<>??R@AA@ABCD#$%;%&,,/03569<>ADGJNRgZ^chmrw| 4>>?R??@AABBCD#$%1;%%&)/03579<>ADGJNRUj^bgkpu{D:>?R??@@AB@BCBC#$6%%$%%;%%&.13579;>ADGIMQUYnaejoty~2>>R??@ABCBC#$##$%1;%$+2357:<>ADFILQUX\pdimrw}Q8>R??@ABAABBC"#$4%%$:%&0357:<>@DFIMPTX[_shlqu{4>Q>??@@?@ABAABB#""##$##$1;$.4589;>ACFJLPSW[_cvkpty~a5P?@@ABB"#$1:'358:;>ADFILPSVZ]afyosx|7O=?@BAB""#$#$1:/78:<>ACFILPRVY]adi|qv{tF==>>??@AA@"#$/#@79;=@BEGJMQTW[_cgkoy}X9==>>=@??@@AA"#"#6$$##=))*++,-./0112446789N<=>@@BDEFHIKLNOQRTVhYZ[]^_``bbcddcdedtefghwhiijklklmoZ:==>?@A"#$#$:#$$#$$#$:$#$#$#$$#9#$%%&'=''())*+,B-./00123O<=>?@!"#""#$#:$%&''&'=(('()*+*++@+,-./0/00E1233445I676789:;P<=>?>?@!""!"#9#$%$%&'=''()*+@+,+,-././00D122345I56789:;O<==>?!"!"#"#9#$%& '<''('(()()*+*@+,++,-,--.//0D100123345I5576789:;O< =<=>=>??@!"!"!"#9##$%&'<'()*@+,-.//0E012345I57899:;:;O;;<=??>?!"#9##$%&%&<&'()()**@*+,-././/0E010123455I56766778989;O;<<;<==>?>>!"#9##$##$%&<'&'()**?+,-./D01243454I567789::N:;<;<==>?>!"#9#$%&%&<&'()**?*+,-../D/012334I5678789N::;;<=<==>>789D89:;:;=>=?J@ABCCODDEDEEFGHGHSIJKKLKLMMWNOPQ !"!"8""#$%$$%&<&'(('()?*++*+,-,-.D//01232344H456789M:;<= !"!"9#$$#$%&;&'()?)*+*+,+,-.C./01233I45667678L99;<== !"8""#$%$$%&;&'(''())?)*+,-B./01233H3456778L99:;< !"!"8""#"#$$#$%;%&&'&&'())>)**+**+,--B../01223F345456788L9:;;< !""!""8"#$%$;%%&'(>)*)*+,-B-../01122122H345456788L89::;<< !"8"#"#$#$%$%;%&'(>()*+,-B-//0122F3345667L89:;;<< !"7!"#$:%&'(>()*+,B,--./0122G234344567L899;:9; !8"#$:%&' ('((>(())*))*+,A,-.././/01F2234567K789: !! !8!"#$:$$%&'((>()*+,A,-./01 F12233245545667K7789:: ! !7!"#$:$%&'((=()*+,,A,,-./01F124567K7899: !7"!!"!"#"#$$:$%$%&'=()*+,A,-..//0/01F1123454566I789 ! 7!"!"#$:$%&%&&'&''=())()*+A+,-/0//001F1233456J67678 ! !!7!"#"#$:$%&'='()*++@+,-..//0/0E1223345I65678<=>Q>?@BABCDEXEFGH IIJKJJKK^LLMNNPOPQcQSTUVUUVWhWXYZ[Zl[\]]<=Q>?@AABBCBCDXEEFHGHIIJIJKK]LMMNOOPOPQcQQSTTUVgWXXYZYZ\[k\]];;<;<=Q=>>?@BBABCDDWEFGHIHIJ]KLMMNMNPOOPQbRSSRSTUVUUVgWXYZ[[k\]\\]9:;;<<;<P=>?=>?@AABC WDDEEFEFFGGHIK]KKLMLMMNOPQQPbQRSTUVUVhVWXYZk[\]9:;< O<=>>?>??@?@AABC WDDEEFEEFFGHGHI]KKLLKMNOPbPQRSTSTUUVgVWWXXWYXY ZYYZ[kZ[\]\]99:;<P<= >?>?@@?@@AABCVCDDEFFGHFGGHHI[JJKMNOPbPQQRSTTSTTUVgVVWXYYXYZYYZkZZ\[[]^989:;<;>?@@ABVCDEFHGHI[JJKLMMNOPOPPbQRSTUfVWXYXYZYZkZZ[Z\]7899:;O<=>??@ABUCCDCDEFHI[IJJKLMNObPQRSTUfVWYWYXYZZjZ\[\]789:;O<=>?@AABBUC DDEDEFEFFGGH[IJJKKMNMNNPObPQQRRQRSTTUTUfVWWVWXYZkZ[[\]778788989::;O<=>?@AUBBCDEFFG HH[HIIJKJKLMLMNMNOaPQRSTUfUUVWVWXYiZ\]\]789;;O<;<==>?>?@BAUBCCDEFEGGFHH[HIJKKMLLMMN aPOPPQPQQRRQRSTTeTUVWYXYjYZ[Z[\\]]667889:;:N;<==>>?@TBCCDEFGH[HIHIIJKLLMLMN`OOPQPQQRRQS TSSTeUUVUUVWXYXYYjYZ [[\\]\\667787899::O;<=>?@@SABCDDEFFGH[HHIHIIKKJKKLKMNN`OOPQR SSTTeTUTUUVWXXWXYjYZ [\[\\]56767789M:;<=<=>?@S@BBABBCDDEF GZHHIHHIIJIKMNN`NOPQSRQSdSTUVVWVWXXYjYYZYZ[\\IIJIJKLMMWNONOPOQRRSS]STTUVVWWVWXYbZZ[[Z[\]^_^^_ h_``a`babcabbcdmdefghghi qjjiijijkkjk566767899M9:;:;;<==>??@S@@AABCEFFYFGHIHEJKMLM_MNNOOPOPQRRSdSSTUVUVWXXhYZYZ[[\567878M9;<==>>?R?@@ABCDEFEFYGHEXyDJJKLM_MNOOPQPQSRRSdSTUVTVWjXYZYYZYZZ[[56677878L9:;<=>>?R??@@ABCDEEFXFFG HI=UEJKKLM_MNOOPQRSdSSTUVUVWVWWXiXYZYZ[5678778L89:;:;;<=>>R?@@ABBCDEEXFHCZ?KJJKKLL_MNOPOOPQRRdRSTUVWVWhXXYXYZ45 66567788L89;:;<=>>R??@BABBCDEEXFEF>aCJJKL^LMNMNOOPQRRcSTUUVW hWXWXYXXYYZ445678L899::;:;<==>Q>?@ABCCDDEXEEF?hAIJKK^LMNOOPQcSTUVVUVWhWWXWYZ445 77677K889899:;<;<==P>?>??@AB CCDEWDEFEE@ŁrAJK]LMKMNNONOOPQcRSTSUUTUVWWhWXYZZ45545677L899::;<=Q=>??@?@ ABABBCBCDDVEF=z FGIJJK]KLLMNOONPQbQRRSTSTUUVUVhWXXYXY34566J7899::;<P==?@ABBABCDVDEECF؄ ?IJJI]KKLLMNOOPbQRSTUVUUVVgVWXY34566K77899:;:;<P==>?@BAABCCVDEE: NEIIJ]JKLLMNOPPQaQRS TTSTTUUTUUVgVVWXXY23445456J7899::;:;;<P=>?@ABVCD@P>I\KLMN ONOPPbPQRQRRSRSTUTUUVgVWXYXXYY2245J667789;:;>?@ABUCC9YDII[IJKMNOOPPbPQRSTVfVVWVWXYX2234345J56789::;O<<=>?@ABUB=\ ?HI[IJJKKLMNOOPPaPQSTSTTUfVWXXY1223345I56787889:;O<=>?@BUA:hAIZIJKLMMNOOaPQRSSTUgVWXYXX12345I566789:;O<==>??@ABU9lBG[HIJKKLMNOaOPQRSTeTUVWXX123345I566778789:;O;<==>>?@AAS?̋z>[HIJKJJLMN`PQRSTeUVUUVWXX12345I566789;:O;<==>??@AIHXHHIIJKLMN`OOPQRRQRSTTeTUTVWVW12234I578989:N:;<=>?@@=YߎPHIJKKLMNN`NOPOPQQSQRSTeTTUVUUVW0123454I567789:O::;;<=>>?@5eDHIIJKLMNN_OPQRRSTeTTUVUVWEFHIISIJKKJKKLLMLMMWMNNOOPQPQRNbQ[Z[\]^_h`_``aabccbccdmeffghh001234I45667899M9:;<=>5_BGGIJJKLKKM_NOPQRSRSSdTUVUVW012344H45776778M99;:;<=>7`>GHI JKJKKLMLL_MNOPQRQSSdTUV/01234I45456789L899;::;<=8n?HFHIJKLML_MNOPQPQQRdSTUUVTUVV/0123G34545678L89::;<=4rCEGGHHIJKLM^MMNOPNPQQRdSTUTVUV0//01223G345678L889::;<;=ԖFHGHHI\JKKLMLMMN OPOOPPQbQQRSRSTTSTT-../01F123456J57899:1d>EFFGGHHI]KLMNOPbQRRSRST,--../01E1212245J6678975ɝw=FGHHIHI\IJKLLMNPbQRRS TT,,--.././0E123345I656789.xECFGHGHI[JKLLKMNOOPbPPQSRSSTSS,,--.././00E12343445I56767785=۠:EFGH[IJKKLLMNNObOPQRQQS,,-..//0/00E123345I5678,OAEFGHGHIZIJKKLMNMN OaPPQPPQQRRQS+,-./E001223445455I5676772I:E FFHGGH[HHIIJKLMN`OPQRS,-.././/E001232345I567-\?EFGGH[HIJJKLLMNN`PPOPQRS,-.//D01234455I566/X ;DEXFFGHIJKLM_NMNOOPOOPQQ*+,--B.././012G45+O@DEXEFFGFGHHIJKJJKKL_MNOP**+,B--../01012G40GېDEEXEEFFGGHIKKIKL]MNOPP*)*+,A-.././/01F33,QƔ>CDDWEFGHIJJKK^LMNOONOP))*++*+,,A-./012F210`>CDWDEFFGGHGHHIJIJ]KLLMNO)*+,,A,-./01G2+XÿBBCWDEFFGGHGHIJJ\JKLLMNO)*+A,-..//0/01F04( e=CVCDDEEFGGHI\JKLLMN(()*))**+A,--../..//01E+]5FAVDDCEFGHGHI\JKLMMN)*+A,-../01B97h>UCCDDEFGGHI[JKLMMNN(() *)**+*++@+,-../A001@`¼JSCCDEFGGH II[JJKJKKLMLMN(()*++@++,-../C00-Q~~|{ywvvy|¹{xvttvxz{}hRBBCCEFGH[IJKLM(()()*++@+,--./@0-o|wvtsromkjmprv{ü~ytomkijlnqstvyy`@BCDDEEFEEFFG HI[HIIJJKJLMM()()*+?+,-../A,Aqomljhfda_acfjotz»xrmhda__`cfijmnpttABBCDDEFFGGHH[IJKJKKLLMM()**+@+,+,-./?]|igfcb_][XUUX[_chnt|vnhc^ZWUUX[^`begik}N@BCCDDEFFGFHH[HI JKJKLLMM(''()*@*++,-!..*Bhrb`^\YWURPMJMPTY^dluyqh`YTPMKMPTVX\^`bdwaBABCD EEFEFFGGHYHIJJKKLL(''()*?*+,-B1X`m[XVURPMJHEBCFJNU]enrjbZSMHEDGILORUWY[]odO?BCDEFGZHHIHIJJK<=>>=>?J?@AGB@Vlipeca`][YVTQNNPSX`howzsmf`[URQTVX[^`bdghrmkWTUUVWXXWYXYcZ[\]]'()?*+,+,D2QTQaNLIHEB@=;8636;AHPX`wnu|~xrzc\VPJD?<<=?ACFHLNPRdVZN?BCBCDEFXGHGHIJKK'(''()?*+,!+BQMK[GFDB?<;8642137=CJQXoelrw|~ytohr\VPJE@<;< >?ACGHKM`QTTCABCDDCEFXGGFHIJKK'()?)*)*+7,+2JIGEVA@><;8631011238=CJQh]chmrux{|}|{zwsoje`kUOIDA=;;<>@BDFI]MOQL@AABBCDEFXFFGHHGHIIJK&&'('())?)*)*+*+,+?GEB@R=;9864201"49=CH_UY_cgkmppqqpnliea]XdNID@<::;;< ==>@BEYIKLND?ABCCDDEXFFGGFHI&'(>)*+*3DA?=;N874320//01 48=AYKPUY]`cefecb^\XTP]GC>;:9:;< =?AVEGHKI@ABCDDEEXEFEFGHIHI&'(>()*+*,<@=;:8I4210/.//0/00137;SDHMPSVYZ[\[ZYWUROLIXA>;9:;< ==>RADEGID?AABCEEXFEEFFGHHI&'&'(>(()* )2=:9764F0/.0//001 25M=ADGJMOPR QONLKGDAR<989:;:;<==Q??ADEE@BBABBCEDXEEF GHGGHIHH&%&'(>(() **+*,8976421D.-.//01H69=@BEFHIHGFDB?=;M89::;<=Q>>?ABDB@@ABAABBCDWEFEGHIH%&'('(>() **)175320/.A,-./01F2469;>>@A @??=<987K77899:;<=Q=>?>@AB@AABCCVEFGHGHH%&'&&'=() *+4320/-,,@,-/01F23557: 9876567K778 98899:;;<;;<P==>?@@?@ ABABBCCVCDDEFEFH%&'=().20/-,+@,-./0011F123456K6778989:;<P<=>?@ AABCBCVDDCEDEFG%%&%%&'=()+0.-,+*+A+,--../01F11232345I67899:;<?@ABVCCEDDEFGG$%&'='('(()())--,+**+@+,-.//0E1234545I5789:;O<<=>>?@?@@ABABBVBCDEDEF%&''<''()),+*))*+@,+,-././0E012245I56678 9899:9;;>??@ABABUBCDEFFEFF$%&'&'<'(+)*+?+,-. /0/00E001123445I5566789;:;;O;<=>??@ A@BUCBBCCDDEF$%&'='(())()*?+,+,-,-./0E01212345I567889989:;N;<=<=?@BUBCBDEFF$%$%&<'()*)**@*+,-/E0121233445I565789:9O;;<=>?@@ATABBCBCDEEFE$%$%&%%&<&&'('()*)*@**+,+,-/../D001012345I56789N:;<=<<=>?@@TAABCDDEDE$%&&%&&;&'()*@*+*+,-././D/012334I56789:N::;<=?@SABCDEDE9:;==>>?J@?@ABCCDND EDEEFFEFFGGHISIJJKLMMWMNOPQRRQR]STUUVW$%&<&'()?*+,-./D//0/012334H545678789M9::;<=>?>>?@S@@ABCDD$#$%$$%;&'('('(()()?*+,-D/0123I545678M9::;<=>=>??S@ABBCD#$%;%&'()(()?))*+,-B././01233I445678788M899:;<=>R??@ABCD#$%;%&''&'()(>))*+,-,--B../01223H3456 78788L8899:;<=>?=R??@ABCC#$$#$%$%%;%%&%&'(>)*+,-B.//012G33456678L889:;< ==>>Q?@??@@ABC#"#$%%;%&'('()>)*+,A-./012F43345656778L89::;<=Q?@?@@AAB"#$:%&'('((>)*+*+,A,-./0101G345 667677L88989:;<=P>?>?@@AAB""#$:$%&'((>()*+,A,-/01F2344567K789:;:;<=Q=>?@ABB"#$:%&'('((=()*+,+,A-././01F1223445677K789::;<P==>?@AAB"#$#$$:$%$%&%&'(>()()*+,A,-./011F12334577K7889:;<P=>>??@AB"#"#:$%&'='())*+ A+,-,,--././01F1224434566J67789:;;<;<P<=>??@A"#$:$%&%&''(<'()*+A,-../0E123343445J667789899:;<P<=>>?@!"!"#"#:$%&'='(''()*++@,-//..//0E112123345I6788989:;?@@""!"#9$%&'=''('()*++@+,+,-../0E12345I6676689::;O<==>=?@!!"#"#9$%$%&<'())()*++@+,-../0E001232345I5567889:O<=<==>??!"##9$%%$%&='()()*+@+,-././0E0123345I56789:;;O;;<=>=>>?!"##9#$%&%&<&&'()*)**@*+,-././/0D0012345I576789889:;O;;<=>?!"#8#$#$%$%&%&<&&'('()**@**+,-../D012122345I57767899::N;<=>!"9#$%&%&&<&'()**@*+,-/D01212343445I566789N:;<=>78C9:99:;::;F<<;<<=<=>?>J@ABABBDNDEF EEFGGHHIISIJJKLMXNMNOPOPPQQ!"#8#$%&<&'()?*+,-..C.//01223434H4566789M:;<<=!"!"8##"##$##$%;%&'()?)*+*+,-.C./0121234I4456789M9:;<== !"!!"8"#$%&;%&'())?)*+,-C../012233H45678L9;< !"8""##"#$ %%$%%;%&%&&'&'(()(>)**++*+,--C../0123G456788L89:;;< !"8"#$%$$%;%&&%&'()>)*+ ,,-,B--..//0/012G434567 8L8899:;:;;< !"8"#$%%;%&&%&'&'()>)*)*+,B--../012F43456787L89:;;<< ! !7"#"#$#$;%&%&'(>)*++*++,B,--.//01F243344545667K89:;;< !7!"#$#$#$;%&'(>(()*+,A,-../012G2234454567K89: !7!!"!"#$:$$%&'&'>()*++,+,,A,-/00/01011F2234545677K7889: ! !7!!"!"#$#$:$$%&'=()*+,+A,-../01011F112234344576K789: !7!"!"#$#$$:$%&'&'='()(()*++,@,-/00/0F212334566J789 !!7!!"!!"#$#:$%&'=''()()*+@,-../0E1233445K7667788 !!7!"#:$%&''=''()*++@++,-/00/00E121223445I57< ==P??@@?@@ABCDXEEFGGHIJK^MNPOPQcRSTUVWWhWXYXYZYYZ[\m]\]]<;<<=Q>>?@ABCDEWEFFG HHIHIIJJKJK^MNOOPOPQbRSSTTSTVUUVWhWXYZ\[l\\];<;<=P=>?@@A@ABBCDWDEFGHIJJK\LMN ONOPPQQPbRRQQSTUVWgVWXXYWYZ[[j[\\]:;<P=>>?>??@ABABBCDWEDEEFGHIKJ\JKKLMNOOPQQbQRSTVUUVVgVWXYZ[lZ\]^]99:;<=P==>??@ABCBCCWDCEFEFGHIIJ]JKLMNOPbPQRSTUVVgVWYXYZkZ[]\]9::;<P=>>?@AABVCCEFGGFHIIJ\IKLMMNOONOPbPQRRSTUVgVWWXYYXYXYZkZZ\]\\]889:;:;>? @@AABBCBVCCDDEFGHI[JKKJKLLMNOOPPbQRRSTUfVVWVWXXYWXYZkZZ[\] 889899::9;??>>?@AABABVCDEDDEFFGGH I[JIIKKLKLMNOPObPPQRSQSTUUfUVWXXYXY ZZjZZ[[\\[[]789:;>=?@ABBUBCDEFGGH[HIJKLMNOPaPQRSTUfUUVWXXYZZkZ[\\[[]\]789:;O<=>>?@@AUBBCDDEFHI[HIIJKLMLMNPOaPQRSRSTUeUVUVWVWXYXXYYZjYZ[\]789:;;O;<=<=>?>?@@ABTABCCDEFHGHH[IHIJKKLLMNaOPQRSRSTSTTeUVUUVWXXWXYjYZ[[\\[\]78789989::N;;<=>?@ATBCEEDDEEFGHH[HHIHJJKJKKLLMN`NOPQRRSTTeUVWXYYjYYZ[Z[\667899::M;;<==>?@TBDEFFGHZHIJKJKKLMMLMNMN`NNPQRSTeTTUVUVWXWYXYjYYZ[[\\67889:N::;<;<==>>?@@SABCDEDEEFYGHIHHIIKLMN`NNOOPQRSeTUTTVWXYjYZ[[\IJKLLMWNOONOPQRRSS]SSTUVWX YZcYZZ[[Z[[\]^_h_``abcddmefghiqiijijk578M9:9;<=>>?S@@ABBCDEFFYHGGHIJKLM_NPQRSSdTUVWXXiYXYZ[[567678M9;<=>?@R@AABCBCCDEFEXGHGHIJJKLMM_NMNOPQRQRSSdTSTUVWXiYZ[[5678L899:;:;;<=?>R?@AABCDEDEXFFGHIHIJL_MMNOOPQPQQRdSTUVWXhXYZZYZ5678L89:;<=?>R?@ABBC DCDEFXFFGGHIJHIJK_MMNMNOOPQRRdSTUVUVVWVWhWXXYZ56678L89::;;<;<==>>Q??@ABCDEXEFFGJJHIJKJKKL^MN OOPOPPQPQQRSdRSTVVUUVWhWXXWYZ457 8L889899::;<=>R?>?@AABCCDXEFEFHLJIHIIJIJKKL^LMNMNOPQQRcRRSTUVUVVWVWhWXYXYZ4567L7899:;<=>Q>?>?@?@AABCCDDWEEFKLJGHIJKJK^LMNNOPOOPQQcRSTUVWgWXYZZ4567K7899::;:;<;<==P=>?@@A@ABABCCDWDEHMKJGH IIJJKK]MLLMNOPOPPQcQRSTTUUTVgWXYXYXYZ445445667K77899::;<P=?@@ABAABBCWDDENNKJHIJK]KLMNNMNONNOPQbQRSTUVgVWXYXY3457K7889:;::;<Q=>?@ABBABC VDEDEJQNKIGGHIK\JKLKLMNOPOPQbQSSRSTUVhVVWYXXY3456J778789:;<>?@@ABBCCVCDDFQPMKHFFHIJ\JKLMN OOPOPPbPPQRSTUVgVVWYXXY23345J767889 :;:;;<>?@@ABBVCMUPMJHFGHII[JJKLMLMNONOOPaQRTSTUUgVWXYXY223345J76678789:;:;=>?@@AABUAI\XTQMKHFEEFFGHH[HIIJJKLLMNOOaOPPQRSRSTSTUfVUUVWXXW1123345I5667889::;;O;<=>>?@ AATAX^XUQNJGEFHZHIJJKLMNMNNO`NPQPQRSTTeTUUVWXX1233455I56789::N;<=>>?@ RMd]XUPMIFEFFGGHH[HHIJJK LMLMMNMNN`NOPQRRSTeTUVVWVW0123345I5667899:;N;<<==<==>>? Uad^ZUQMJGDEFGH[HIJJK LMLMMNN`NOPQRRSTTeTUUTVW0123445I56789:N:;;<=<=>? @=ekd_ZURMIFDEFGGZHIJKLMN_ONNPQRSTTeTTUVWVWEFEFFGHHISIJKLLMLMMXNPPOOPOQRQWztokgc_\XVVWWXYcYY[]\]]^_^_h_``ababcdmdeeffgeghhg0012334H445667789M::;;<<;<<==<=>>?>=^kga\WRMIFCCDEFYFGHIJKLLKLMM_NOPOPQPQRRSdSSTVUVVWW0012344I445678M9;<= >;koic]XRNIEBCDDEDEFXFGHIJKLLKL_MNPPOPQQRdSSTUV/012H45678L89:;<==9Rrke^XTNIFBBCDEEXFHHGHHIJK LKL_MNMMNOOPOPQPQRSdSTUUV//012G3456678L889;< =|tmf`YSNHDBCDEXEFFGFGHIJJKKLM^MNPQRQcSTUTU//0112F4434457L889;< 7_vohaZTNJDABCBCCDECEXEEFFGGFHIJJKL^MNNMNNOPQRcRRSTSTUVV.//0122G3345678K7899:;:Ayrkc\UOJEA@BCCDXEFFGHIJJK^LMNPQQcSSRSTTSTUVV-./012G2234545667L89:;6q|tld]VPJD@@BABCCDWDEFGGHHIJJKJ]KLMNOPOPQPQcRQRSRSTU-../01F234345667K77899::;:8Kvnf^WPJD@ABABCVEFGHGHIHIIJ\KLMNMNPOPPQPbQQRST--./01F121234567J7789;5zqja[UNIEEDEECCBCCVDEDEFGGHIIJJ\JKKLMNOPbQRRSTT-./0F11223456K7893XwohaZUOKKJKJHHFDCVCEFGHI[KLMLLMNNOPbQRSRSST,-./011F123345I67$8898986˾wpic]WRSRQPONLJFWCCDEFGGHII[JKLKLMLMNONOPPbQ SSRSSTT,,--../0E12345I67678$0küxqje_Z[ZYWVTROL\FDCDEDEFGFGGHHII[IJKKLMMLMNMNNOOPOaPQRS,- .-.//0/00D0121223345I67(8786<ûzsmhddca`^[XUQ`KHDCDEDEFFGHHI[IKMNOObPPQPQQRS,,-./00E0123345I5567&88.ľ}wrmmlkifc_\YePLIECDEFGH[IJKJKLLKLMNO`PQRS,-,--./0/E001233455I57&2Hſ|xvvtrplhd`kVRMIECDEFFGHGHH[HIJKJKLKLMN_PQRS,-./E012345I5,767.Ȼ|yuqlgq\WRLIDCEDDEFGHG[HHIIJKKLMNaOOPQRSS,-./E012345I56*0Wž~ytnxb]WRLHDCCDEFH[HIJKKLMNNMN`NOPPQRS+,+, --..-./D//012424I5,4/¼|v~ic]VPKFCCDDEFYHIHIIJKLLKLM`NOOPQQPQR@ABCCDNDDEFGHIISI7@yxqkf`\XVVWVWWXYXYYbZZ[\\]_ h__`aababbc+,-/D/0/012344I44534с#ſvnf`YRLGCEDDEFFYGGHIJKLMMN_MNNOOPQ*+,-C/0122123I445*$Ŀ|tkd[UOICBCD EEFFYGFGHGHHI JJKKLLMLM_MMNOPOPQQ+,+,-B../0101 2343H44551?,¿yph_XRLFBBCCDDEEFEXFGHIHHIJKKJK LL_MMNNONOOPQQ*+, --B/-.//0/012123H45) ý~ulc[TMHCBCEDDEEXFGGHIKL^MNOPQP*+,B.././0122F344.LĽypf^VNICBCDEEXFGHHIHIJKL^MNOPPOPP*+,+,B--../01F3+ú|rh_XPKDBCDDEXEFGHIKKLL^LLMNNOPP))**+,B,,.././/0122F33*^ɿtkbYQKEABCCDCWEFGHGHIIJKK^LMNOPOO))*+,+,A,-./01F21-œøvlcZRJEBCCDDWEFGH IIJKK]MLMMLMMNOPP))*+,A,,-/-/0101F2'qĺwmd[RKEAABBCWDEFGHIJK\KLMNOO)*+,+A,,-.//01F/5٘źwmcZRKE@A BCBCCVCCDDEEFGHI J]JKKLMMLMMNO()*+@,-,--./-/001F%ĹvlcZRJD@AABCUCDEEFEFGHI[IKJKLMMNMNN)*+*+@+,-./01@A·ukbYQJD@ABCUCDEEFEEFFGHII[IIJKLMNN(()*)*+@+,-..-/0/01:Ⱦ}si_WOIC@?@ABBUCDEFGHI[IIJKLMNM()*++@++,--./0)dŹzpf]VNGA?@@A@BBUCBCDDEEFHGGH[IJJKKMLM()*+@+,-,-.//0.(ĸwmdZSKF@??@?@@ABATBBCDDEFGGH[IJIJKLM()*@+,-.//&dķ|ri`WPIC?>>?@A TACBBCCEDDEFGHGGH[IHIIJKJKKLLMM()*@*+, -,,-/./-.Λķxmd\TMFA>?@ATABBCDDEFGHG[HIHIJKKLLKM''()**@*+*+,-.#yķwkbXPIC?==>?@S@ABCCDDEFGH[HIHIJKKJKLM'()(()**@*+,-*7ķwlaVMFA<<=>?S@@BCCDEFGYGHIJLM= >>=?>>??J@?@AB7{pg_XROOPQRRS]STUV WWXXYXYYbYZZ[Z[\]'()?*+,'DŸxmcWOGA>=>?S@AABCDEFYGGHIK'('()?*+,"ƹzocZQIEB@>=>??R?@ABBCDEFEFYFGHIHIKJ&&'()?))*+,#VǺ|qe[SMJFCA?>=>?R?@ABABCDDEEFFXFFHIJJ&'()>)*++,+*'ȼsi_XSOKHECA?>==>>R?@ABCBCDDEEFXFFGHI&'())>()*+,!k"Ƚvmd]YTPLIGDB@?==>R??@?@ABCDEEXEFEFGHI%&'&'&'(>)*+(.֠"ɾzqjd^YTQNJHECA@?>Q>>??@BCDDEXFEFGGHHI&'&'(>(()*+$ʿvpic_YVROLIFDCA?S>=>?@?@ BAABBCCDDEXEFGHI&'(>(()*%:}voic^ZVSPMJHFCBT?@ABABCDWDEFGGH%&'(>()** ø|uoic_[WTPMKHFEVBA?@AABCCVDEEFEEFGH%%&'((=()*"I#Żztnid^[XTQNLIGYDCAA@?@@ABCBCVDDEFGFGGH%&'('<()(!(ȿysmhd_[XUSOMK[FEDCBA@@??@BCCVCDEFG%&'='())](º}xrmhd_\YUSPM]IGFECCAA@?@ ABABCVCCDDEFGG%&%%&' ='('()((&'ʤ)Ž|wqlhd_]ZVSQaLJIGEDCCB@?@AABUCDDEFFG%$%&'<'()t*{vqlhca\ZWTcOMKIHFEECB@?@ABUCDCEDEEF$%&''<'(($0ޥ)´zuqlgc_]ZWfQPNLJHGFED@?@ABUBCCDDEF$%&<'()ŷ~ytpkgc`][hUSPNMKIHFED?@AUBCEF$%&<'">-Ǻ}xtokhc`]kXUSQONLJHGGB>??@UBCDDE$%&%&&<&&'.ɼ|wsojgc`n[YVTQONLKIIE>>@?@TBABBCDDEE#$%$%&&<&'P,˿{vrnjgdp][YWURQNMKJID>?S@AABBCDE9:;;:;F<;7Ĩ6½|yvzpnljgfdb`_^]\SPRSRS\STUTUVW#$#$%;&&'e5ľ}yuqnjvd`^\ZWUSQONMLG>?>?@S@@ABCD##$#$%;&&#)ө2}xtqmygca]\ZXVTRPNMLB>>??S@BBAABBCD##$#$%;&&}2¼{xsp{igc`^]ZYVTRQONJ==??R@AABCD#$##$%$%;&!44ľ~{ws~mifda_\ZYWTSQOOE<>?R??@AABCC#$%;%4}zvolieca^\[YWUSRQM??@ABABC#$#$%%;D?½|yrolifda_][YXUTRRH<>R>??@?@@ABABBC#$:7Ŀ|urnlifda_]ZYWVTRQA??@AAB#$##$#$1X5~xtqnkhfcb`]\YXVTTK>?@B""#$##$#8ȭ6þzwtqnkifda`^\ZYWUTCO==>>?@@B"#$$/}yvsqnkheda_^\ZXWPQ=?@AA"#"#![\[\]m^_`qabcbba`_^]\\kZXXWUSSRQPONMLKJI[IHGGFFEDEDCBQ<<==>>?@A!"#"#$54 !8"#$#%$&' (()>)**++,--./001 2G324455667 899::;;P<<=>?@!"#""#:#$%&%&'='('()*+*+@++,-,-/./0E12345J67789:;;<?@@!"#"#9$%&'='()*+@+,,-,-/0E1234345I5567899:;=?!"#9#$%&=''()()**))*+@+,-,--./00E01245I578899:;O;;<=>>?!"#9##$%&%&<'())*))*@+,-./0E01233445I5789::;;O;<=<<=?!"#9#$%&'<&'('()()*@*+,-../D/001011212233445455I5656789::O;;<=>?!""!"#9#$%&<&&'()*@*+,-./D/012324455I56789:9N;;<==>?!"!!"#9#$%$%&<&&'(())()**?**+, --./..D/0/0112334455I567889899N;<=<==>789C9:;:;=>>?>?>>J@?@ABCODEDEFGFGHHGIISIJKJJKLMMWNNOPQP !"!"8#$%$%;&'()*?*+,+,-.D/01223233I4567899M9:;<=! !"8#$%;&'()*?)*+,-.C/012324H54566778M99:;<=! !"9"#"#$%;&%&'())?))*+*++,-C/.//00/01234I44567789M99:;;<= ! ! !"8"#"#$%;%%&'()?)*++,+,-,-B./0 1121223H34456678M899:;< !""8""#""#$$##$%$%%;%&%&'(=)*+,-B-./01012F4566778L89;:;<< !""8"#$;%&'(>)*)*+,A-./0122F34567L89:;<< !7"#$#$%%;%&'(>(()*+,B,--./..0//0010012G233445667677K899:; !8"#"#$%;$%&'((>(()*+,,A-./012F24345 65577K77889:;; !7"!!"#$##$:$%&'((>(()*+,,A-,-./0112F23445667K877889:: !7"!"##"#$#$:$%&'((=()*+A,,-./011F23345456K789889: !7!!"!!"# $#$:$%%$$%%&%%&'=()*+*+@,-../01F123433445J778778 ! !7!"!!"#$$:$%$%&%%&'=()*++@,-,-.-/01F11245J78788 !7!"!"#$$:$%&'&''='()*++@++,-/0E1223245I667ih32n-;<=E>@@ABBIIEGHIIKRMMNNPPUVRSTUUW]WXYYZY_`]]%9:;??@AGFCEFGHIPJKMMNNTTQRSTTU\VWXXYY^^Z\]]89;C;=>? GFBDEFGHOIJLM SSPQRSST[UVWXn^]Z\\]7889:B;==>??FFBDEEFHOIJKLMMRSPQRRST[UVWWXX]]Y[[]=>??@FACCDEEJJHIJKLMSOOPQRSXWUVWXXZ_Z[\\]]bb_``a55678@8:;<#CC@ABCDELFHHIJKQQMOPPQRYSTTUVV[[XYYZ568?89:;<?ABBCKEFFJLHOOLMNOPQWRSTTUU[ZWXYY345!>7889;;A@=?@@ACJDEEIQINNKMMNOPWQRSTZZVWXY23455=67899:@@<=??@BICEEHSRLMJKLMNOVPQRSTSYYVWWX11234<457787??;<=>?@HABCFQ\RJHJJLMNUOPPQRRXXUUVW6678:@::<<==CC@AABDEKFGGKVldhNMNOPQRXSTUVVW\[YZ[[45567?899:;;AA>?@@ACIDEFIUdy[HLMNOPWQRSTUUZZVXYY//012:344556<<8:;<<=F?@@ERc}|EFHIJKSMNNP VVSTTU//012935<<89;<<=E>??ETghAHIJKRLNNOPPUUSSTU..0019234554;;789;<DLFHHIJKQQMNPP*++,-5./001177456F^{:LFGHIIJPPMNOP)**+,4,./0 76247Jc&EIEFGHHIOOLMNO))**+4,-./0/65127Jd%>DEFGHHNNKMMN())*+3+,--//55115F`}X>DEFGGMMJLMM'()2*++,--43/01?Vq6CCELKHIKL--../6/012 99566EKYhy 3@FFCDEF$%%&'/''*.4:GOWetT9FFBCEF,-.4.07@@A""##$0/259=ALQSZahow<=??@"##+#"('!""!) !"")($%&'((0)++,-.8@<>?? !+"*"#$$%$+*&'(()*2*++,--43/11234<466788?>;<=>',((/))**+*0/,--../60011229946678:@::<<==CC@ABB%&.&'(()(/.*++,,-5../066345668?9 :;;AA>?@A !*!""#;*)$&&''(0))**++21.//012:344566=<8:;< !!"*""##$#*)$&&''(0))*+ 11-/0012:345<<89:; !)!""#"))$%&&'(0())*+*10,-//019234554;;789 !)!" #")($%%&&'/(()*00,--//08123454::78-;<=E?@@ABBIIEGHHIKRLMNOPPUURSTUVW]WXYYZY__\]%9;;@@AGGDEFGHIPJKMNTTPRSTTU\VWWXYY^]Z\]]7899;C<==?zFFCDEFGHOIJLLMMSSPQRSST[VVWWXY]]Z[]]7889:B;<=>??EFBCEFFGOIIKLMMSSPQQRSTZUVWWXX]]Y[\]=>??@GBCCDEEKJHIJKLMSNPLLSSXWUVWWXZ_Z[\]5bb_``b55678@9:;<<=CC@ABCDEMFAmBKQQMOPPQRYSTUUVV[[XYZZ568?8:;;<LGPPMNOPQQXSSTUVV[ZWYZZ45567?889;<;BA>?@BBCK;x=OOLMNOPQWRSTTUU[ZWXYY34556>7889;;A@=?@@ACHBWINKMMNOP"WQRSSTTZZVWXY23455<67889:@@<>?@@B= AMJKMMNOWPQRSYYVWWX11234<556787??;<=>??@@;Z |BMMNOPWQRSTZZWXYZ/0012:344566=<8:;;1DFHIJKSMMNOPPVUSTTU/0012:3456<<8:;3f%;HIIKRLMNOPPUUSTTU./0019244554;;7984͇$NCHIJQKLMNOOUTRSTT-./018123454::78-y:GHIPJKMNUTPRST,-./08012344:955:߉[@GHOIJLMSSPQRS,--.07012244:95*!51//2?T\gnokb[M=9;;<@MKC@BBCI+IFGHI&&''(0()**6::4-./003BEMRSPJH?89;<<=EBE@B*IIEGHI%&&'(0())-4/20,-//01948<=<7;;79::<?@@FFBDEF$%%&'/''(())//+,--.07012 234:956889:B;<=>??EFBCDE,,--.4.//0;65233456=7889::@?<=>??@GBCCDEEJKHIJK##$$%-%&''('.-)*++,-5//0188455678@8:;<<=CC?ABC##$$%-%&&'.-)*++,-5-/0010774568?89;<BC?@BB"##$%-%%&&'&-,()**+,4,./0663457?889:;;BA>?@B""##$,$%%&-,()*,3,-./0/65134556>7899:;A@=?@A"\##,$$%%&%,+'())*+3+,-.//55123455=67899:@@<>?@ !!""*"#$$%$+*&'(()*2*++,--43/01234<466788??;<=>'((/())*+*0/,--../601129956678:@::;<==CC@ABB%&&.&'(()(/.*++,,-5.//076345568?9 :;;AA>?@A !*!""#*)$&&''(1()**++21-/0 2:344566<<8:;; !"*""# *)%&&''(1))*+ 21-/0012:3456<<89:< !!)!""# *($%&&'(0())*10,-/0019234554;;799 !)!"%#")($%%&&'/(())**00,-./008123454::78;<=D>?@B!IIEGHHIKRLMNOPPUURTTUVW]WXYYZY__\]%9;<^^\]]899:?@@AGGCEFGHIPJKMMNNTTPRSTTU\VWWXXY^][\]]8899;C<==? FFBDEFGHOIJLMkSSPQRSTT[VVWWXX^]Z[\]7889:B<==>??FFBDEEFGOIJKLMMRRPQQRST[UVWWXX]]YZ[\=>??@GBCCDEEKKHJJKLMTNOPQRSXWUVWXXZ_Z[\]bb_``a55678@8:;<#CC?ABCDELFGHIJJQQMNPPQRYSTTUVV[[XYZZ578@89;;<@@ABCKDHKHHIOOLMNOPQXQSSTUU[ZWXYY34556>7899;;A@=??@ACJDOKGHHNNKLNNOPWQRSTZYVWXY23455=6789::@@<>??@BHKSJFGGMMJKLNNOWPQRSTSYYVWWX01234;466788?>;<=>??JYSIDEELKHJKLMNTOPPQRRXWTVVW6678:@::;<==CC@AABDB_fXMIJ?@@?JwfWLFHHMMKLMNOPWQRST?@HABCDEFLLHJKL--../601.:#äbLABDEKFGHIJJOPMNOP++,--5.//0"#ĦcLB@ACJDEFGHHNNKLMN%&''(0()*$B"ŨgTIB>=E?@ABBCJIFGHI&&''(0()*ȭtcWMFAF>?@BIIEFHI%&&'(0() U!̴rcXPIK@??@BBHHEFGH%%&&'/''!Ƌ ӾpdZRRGCA?@AGGDEFG$%%&'/'k ű|od[ZMIFA??FFBDEF$%%&&/$)ی̹yndbUPKG@?EFBCDE,,--.5 ±|snb\WSLDJJHIJK##$$%(5Ƶuqc]WRN?CC@ABC##$$%ʻ}ykd^XTJBB?@AC#$Yʼvnga\WJ@>@@B""##b'~vqlga]_UROMKII@?@ !!"*"#$#+*&''()*2*+,,--43/11234;466788?>;<=>',((/))**+*0/,--../60011229856778:@::<<==CC@AAB%&&.''(()(/.*++,,-5.//067345567?899:;;AA>?@@ !*!""# *)$%&&'(0(*++21-/0012:344566<<8:;< !!"*"#$#*)%&&''(0()*+ 21-.0012:3456<<89;; !)!""#"*)$%&&'(0())*+*10,-/0019134554;;789 !)!"%#")($%%&&'/(())**00,-./019123454::78il32 ;?@AGEEGHNKLNOTRRSTZWWYY^\]]789?<=>?FCDEFLIKLMSQQRSXVVWX]Z[\;<=C@ABCIFGIJOMNOQVTTUV[YZ[[`^^_667>;<=>DABCDJHIJKROOQQWTUVW\ZZ[556<99;?@AGEELNMLMNOURSTTZWWY134:6789@<=??FCCJWOIJLMSPQRSXVVW#678>;;<=C@ABCIGGMbdJNOQVTTUV[YZ[112867>:<==DAAH`}SFJKQOPQQWUUV/00745<99;>GbBHIOMNOPUSTT-/062355;889:BEKVrg@HNKMNOURSS,-.51134:677;:=Pr>PMNPQVTTU+,,30112(965>_KGHIJKROOQ**+1./00744Ci&&'-))**0,,-.3001286678>;;<=B@AB!""($%+''((/++,,3011296677>;<= '#"##*&3'-**++1./0074455<99; &""##)%%&&-))**0--//62355;88;?@AGEFGHNKMNOURRTTZWWYY^\]]789@<=>?FCDEFLJKLMSPQRSXVVWX]Z[];<=C@ABCIGGIJONJKQVTTVV[YZ[[`^^`668>;<==CABCDK@tBROPQQWUUVW\YZZ5j<99;?@A=BLMNNTRSTTZWWX134:6789?<=>=HZEKLMSQQRSXVVW678>;:<=B@AB7BNOQVSTVV[YZ[112868>:<8LdBJKQOPQQWUUV/00745<9:/>HIOMNOPUSSU-/062355;81Xu=HNKLNOURRT,-.51134:5.BDLIKLMSPQR01286678>1l?OMMOQVTTU+,,3001273pJHHIJKQOOQ**+1./00/e|AFGHIOMNO)**1--/.:ŬQBFGHMLLN(()/+,-*Uwhgvӻzgese@DEFMJJL--.407`XLCRu^HKVdMFIJOMNO'((/+/=I;308Sguwl]E;?FCDE)**0,,-.3011285678>:;<=C@ABCIFHI$$%+''((/++,,30112968>;;<=DABC"##*&&''-*+1./00745l<99;;;<=C@AB!""($%+''((/++,,30112867>:<= '#"##*&&''-)*++1./00745#<89; &""##)%%&&-))**1--.062355:88;?@AGEFGHNLLNOTRSTTZWWXY^\]]789@==>?FCDEFMJKLMSPQRSXVVWX]Z[\;<=B@ABCIGGIJOMNOQVSUVW[YZ[[`^^_667>;<==DABCDKHIJKROPQRWUUVW\YZ[5<99;?@AFJMFHMKMNOURSTTZWWX134:6789?<=>?FVLEFLJKLMSQQRSXVVW678>;:<=B@AB@[dOHJOMNOQVTTUV[YZ[012967>:<;CycKBDKHIJKQOOQQWUUV/0064556<9:4rgK@AHFGHIOMMOPUSST-/062355;83PwZMJIDEGHNKLNOURRS,-.51134:6/ܹ~qh]ICEFLIKLMSPQR0128667B8>0lƭ}_JHJOMNOQVSUU+,,3001272ɶoOCDJHIJKROOQ**+1./01*ѩ{UBBIFFHIOMNO)**1--/,=Ӫ{U@AGEFGHNKMN(()/,,-!˜oL>?FCDEFLIKL,-.300+H͛iH@CIFHIJOMNO'((/++ ΞmNB>CABCEJHIJ&''-* Tѧ~cRFE?@BBIFGH%&&-(!ņ׶xdUOD@@AGDEG$%%,i¤tc[NGA?FCDE)**--ڇͲuk]UMCHFGI$%%ӻtd[TGBABC"#@ʵrf^UF?@A"#Bmjkkomsnrppokjb\WRRLHFEE=?@!""%!%!!"$,)*-/63467?<=>&'',))**0,--.4011286678>;:<=B@AB!""($$%%+''()/++,,3011295677>;<= '#"##*&'-*+1./00645<99; &"#)%%&&-))**0--/062355;88is329>?BFFKMOSSWXY]]9>?AFFKLOSSWXZ]]6:;=BBGIKOPTUWZZ378:??DEOLLQRTXX378:>>BBW^GQRTXW.24598=@]PHMOSS.34698T|@LOSS+/025:|bBKOP)-.027{܀ ;GLM*-./22k؁r=KK%)3K =EF&*+5Ov :F$'6Ll#K?"&+09?KRUYY\]bH=#'&&(%('(,,113=># '%)*+/.34599e9>?BFFKMOSSWXY]]9>?AFFKHKSSWXZ]]6:;=BB>{FPTUWZZ378:?=@LJQRTXX378:>2@QRTXX.2456?SGMOSS.346.v@LOSS+/0.FZDKOP)--+dݣmCHLM*.-6N9Q]?QJFKL%))0/,2<>97=@AFF&*++/.32499>?AFF$((),+/0266:;=BB"&&'*)--/4388:??#' +)../3378:>># '%)*+..345999>?BFFKMOSSWXY]]9>?AFFKLOSSWXZ]]6:;=BBGIKOOTUWZZ388:?>CNHLMQRTXX378:>:UYDKKPRTXX.2357?bDEFKMOSS.346-㣁`EJLOSS+/1,KҌJEIKOP)--# FBFHLM*.%W CADGKL%(!ā aJ@AFF'k gRDEF!,ڂ ̡fSCB .QNQPTQJGCA@>#% #"&&(./569>># '%)*+..34599t8mk@ Kϭo,p=Y3E,Wso ZJr(292z<F/{ v4\…3h8mk #:<^"?7Y`B[l8mkH]H\\r^ts8mkt}~DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/DisplayCAL-profile-info.ico0000644000076500000000000047056612647526530024700 0ustar devwheel00000000000000 pv (@@ (B00 %6-  R c hmPNG  IHDR\rf7IDATxڴ YQ&ͤPXY5/.{lq34:: _GW>mšmTUYj0,uuqk2>޲(!P`Q_Ďd:=sw|Exg|f~;Ilo?ʕ/SJ_1ӱ}j*O/D'/v󫭭-:<<4}:namϯRJk]hMkŇҚ). NaoQzj?z}*:C=8ES :99)S=ay&v^?6Cж1Om?Pn/k'ڋ-0E/h{G#Z҇['OJo޷{DˏoDy3^wӯ/MߥF9f6\>CWP%EnNwqc=B@|uj# G^~`zZwWX((  \X>DxQPnIXv ѹGf3nLF۬Aތh[g_;w@MXGy! oQ}WO (؏{[ߣ^zgҍ"w6NP>vvvhD5j:u8u!Q$p-k[;[/|Ƞ eul+ hc韡]^g8>:2Zt`WAUŨ2V }'d] c5EE؈`%뿣4lNHLΪ]O-Y|ډ@kM*D,ԓ@Npr?-3w'[A~t7{Ͻ'_7v3CT $R@6PcVx1*a1->Ơԗk O3Olg56T#^H|cYVF]ZPU:N`~ܠfFpjFVF(nk=t-2;}n7(W Ѝcx O/kYyɅihI x'U˿%[Wߟ~?Y?Cw7/>oLd\`*`]hͨ `$e+Ni͙inhd3YG$H*UwM"=u:+6h9C4|g_ ƮA^ WM: Y4n?iH M* u% $symu] BFuZ6Sڮa`fLϾjk{O<_ i,Έ-[Lq>]:C/C#$}3i&FJW;.G h&YL0~=Nc]d'⨰Zjzd+gx =b9V Me8F@y52HS$d(WIMN `]0+!&IVHF5k x^u=nqS?]mt2:@䰟E)w,@Tq XB] yqz'm+8V[(O_Q5r^`fr뒂uZ˧(mj֊b,ֽۉ#OubB׬9ǜW[n8z 4}%ȃSd s9r5 ?G f;WSӕ510a"5B@0yl$xC=yhNW,\H.r!G6ݢfH,>skQχ 8YdB5ycO%ebcwh5k08V C%6lb{qgW֎% $Y"K;;hH^\x>7>ݐ%c }w{(Z!{92wZؘamN<*aW@;5ĞUɔ& T5)~w3ELV"l.ҏGI(`z.rԀER,Ssml矷ɱQ5LPJ k9lւme'ŢS`{2 2Y(`Uq=>;ŷ?nħ|bVָ :0/3ҕ+WC{A]%uE#I qޤ~ Wu;1`AED, Ã(CuQ H|t5`%(-CQHL& 1 m&{"Gf2S05x>"sΖpIp'$NjF7`:)DܵTG݅0G響wqp4_$AU,$08K6L8kuL(# //9 Crm3sgAE*CL yTClbx!7σ"ʁL\aw V@jW/u~3kPCD 0Ms%L@ Q>_W/Dxɋ_?%@,(3R a :T* U4Jɘ8 -}o^_ˆRZ;b9U m8&Yb>{6wdk0a,jD *W5MF $LduA\}zP* /D46L(h6 ygB{boSզ8aţ[5 0C>C4D>Zv sΕѨD{% .qtfGhc*>sT&P1ˍ\Qم1* -4Ox B#$: LbT`Ƚf.>]>` d0:TfBD=u/|b$swk kvk9sL*(sgD[db{0c,.zx( 7h MQE% 7_&#b܃d% od&.!1W>1}3HL|κ 2n|2Psgg@g:g `֗AZ3 +J5LVW VF-$46jlea<2d#A {Q!nXeBqnie4ZĜ4oU XH~mt:v=wLt\㓕*>&!ؿ>i F^2l !氘]#  Ў#M++AK]lG \d0bVmG`4)./a"Y,ç-9܋%eșP-ϊ}T `HDK)>4/FHofףpL-Qor&a 5Mh9ynnCjH4db\ My0}6ȁXF` 3bIA8m.@3v{{)ngqY[t"{\yǩR`Q𠡩˴oVpd3\=,BWAD BnlUs}'t3 e!£[2ZI$zά]}9 \,;j\`kޜg2[aK~uY>φHvD5(H6a^Y*pxthΤB'\1ݯejV~39ëځ@sK@`D]fMgsWw+r0~Huw>BJw4G sbFB]X'0 K3 uWÀf $~whIΆ8 T>mkEnd {%i?U ~=s) T~cS>;;te7a3ȔJ\, ,D#f& obYOJTr/s N0[{g?nT@eK8X&2÷H&-=sTފ rD=KƪI&[]"ԹW$ ҆u|Zh'u\{|~) ܨ & VIC5@{f3[oM945?b;=m25_ߐG\\\I#< , .Z*gA2ȓ&`W:Mc\9WÀ[y8{:ASYׁ[;=r@. k8{vvh#+ Rt8] ܼB]*1a6>H0r Km}C Q6eqW `PML%6u[rtt"=> 3{eNAa$p$!pfg(l-9q'i~vLx0a gaywoף@0W**;8JA95]ƊpzԠD4ӟr4X8b*GӠ~<'`aR}$d-<A3BF3=,#0ͫ4,tx&82ouZWǜ 8 ̭.Ztn >blr" {VtKurW- A0T"j1#~ݝl+X2tN/=]!yL`w,2wJ_-W[ ?t$ۖ˚Uc(Kq?RGh,9bOB6A{[{Y9Pflע(Zԭ[{;iy3 {cDG7\h`w&$I ^rCHt32٩ہsh A_tӇW<Ƶ:(iQPp;fN%Fs˛7;,"bGVCY`LȪ/j7ޜאPB-@6ǡ996 -2r07$vRPyg)jYq{r< W!OR3vh))*[х̸L_}]45UM%%8$[iB!eIA3#V{ʇi#8DBMo|X|}zv%$j@hO/Vօv-tɇ<+(Y4Nƨ@(m,ގ܎*o ?+,9=yrysQ[:M^^~pGHOh7o,iN[wաα@1`OgQ,9ۼm4KE^0PP߫%P耷`\U<~0 Q㳑x~nPe3ޒ,$hOm';XFz@ڄzyn&0c$u<=t4%(>Zb"v.4I ?椴@O˧+( 22j}zekfybRTN2#cWF=۽/xB"DLuaT\onVxEa}6(:T8*5 iw GX;HY1o ۍ4@hu@]2-NQHSF:%e&d!Yk>ҠTRЙ%+E#]"~3Z5 8"# 4,`rZs&?+*qﻎCO"{.Iֶ-)/xሴa>' W 0@uArW_jZQϨepYnwwwT`X֌vE8W^>df C+p @6 EIN@EP929*1!`µhY+O2r& l"-C /+`ͻ[iޣX7.%'A:.F1teWÔj ߥ7J\$dD6~h+DHM8XH![1rqB"7Npy'`Fwc.kL ~?@?zZ*tɥf %Zyxۋr1ͫ߮r|<I"jV +?REaضeXd ˛6@Aת T$aa.LLM PE8g^_g^HH+A*Z+{ı.rQ߷ʓ-QWҷ @RoЍץbQKԘ20yhzWH ]&l [dd/ Z-hkwRd\T5oW;/@ AY7A7o*O'۱]7i,`el`8Ix&_F0lW_{Tj[ʳ^L&&|rfl3IAfl73D_ 'uo,߿lG u߆0`), mE0# DH 'WOܵxxy${@wpy(Gg欜.ʜ6;S .`:XAy.r! ΏL$`Y ځX&H qn!sV$Teε9bvꪗB27F]Lv-K`(f(z۔)rk JD\&C=y*8\fXmgDN͛!k [maWKs/He%k%AGx o Q-/wmow"/+58 VLbc\gXa`Ccz̼9Z-eh_݌ͰLoLzRҏQZN.)!8=uV+.Qe u9 XdlH47ᬑ5(9 Y8A/*K=LpycDvk=|.ݩ&C)m/"5w&!-k\r_82S?`O.2@s^ Pj߹$cԘ;mC|Ģ"?2GQ6++adWbΌ fIm>lGC3ߖdiQȮG  ׁdeYM>?eA C^@Ե_61[.fnW<8aMNTk:uy- Ilq30y {TYMU\Np`.O4K$В/y6;ܡZΠdp |]͛R|>#AE:073ނ1f`td7Kd\}O{(0#.rD )޽@W"lÍHu~Q,zeqvvJIVؔz&Y *S yڬ]V_$otuPG_8KWB-DfXXPT P6v\ ktz@[)?R bqњ;;[_K-DS6"@yދ!? \z3^b,.g}i wn*܎`'a@K2~&"M5=ٗV3Jc~y]/7[Z` /.揘d6 A3ZeXnqyL@r:8;׋Le~#z@̵4BY€`2 - ͞%""]m\ҧ$[))Κ)QaMd(-MaMVAG%kPMPNOH8YW-LR*UJ6:OhJhB%9OwvsVqrP/A>w4pp͈~#s0`?0$!HoA?p6)Pmd8ؘw$@CeF3H?kng*[s1ݏ%[E`Px@#eH; '?V.HVq0zsm\7$t @?eM֑sH]Tp]w8҅rUeb3YWE5,YZDzOE`NZ ̎g\cesԪA~](v׃ |gE<`QZL >`ЉEޅ(X-684[uy5WKe@D^TN֙lV. O2 G6jRDqis.@s KV0#0!h g H3Wsfk) e9J7fu7䝈<.ttCXX?L;ȚD5oe_?Z]>K8<+iA!X&2Veifqvvs_8Lqbz Mѱ ynG䜬P1U2 m|:tBԜIć=;kI =RWiks`<" msr"nÇP<^y[خ5G{G>S#xV Jjf>CDx䢥G[2k2"ӠdȜ) Q lCu|♆+ߜ~{%!:qA4.q>WoEp!aU6@} 5kM .zCttWO6ѡƿ׊qCT{W-?S{^yY0g].  2;^`VWa06tVXJz8-F.:-O]O٪8E'Wg˦w0um edZV̼@! 2lU!QM{.+ M ]"|!K#e0` 4IՒ2f6#kjМ󮅞\Tn%zOo߳XDl32^k@9;{Kd#5ݼJ9 n: )ns~.U܃A@h>P_hñ5_߀CtC8 CRYksu%B1*r@p(!z͵7.Ԉ'o;T N#3LRsHЃZ%H3|@~RdPQfǐ1lE95HSy% l~=,9f-֊JrW07Νj76b! NoZ RcFaúyggAShA?T"0CS=ٳBr:lnQ7=B?fGab 柞4'`Q-E% 8ZvJWt[[Z̜0S mY>TyPV2x0%/+vdq!hF4e!ב-RgԥmM7KnlF;7e]dP &svxpl!K,I-otfKsm@LS]n!6?&:p/I7eu+XES_a> $G@3{Nsz1ﻂlz(6ΡU:_ _r+ϪAIH*]Ⱥ 񴨍^\/ld *F"#^OFOܭF)n: 5kK roY?Va֬?X;׈A|@.@ &G/(ߎ_ u u$leėu6^s4Xo+L.G8Q/;3&́J" L&1AKi׾p{`,"or.8AǍ EᜉdK>6C8FQlXVnɧ_LñOqKcTB _v0LM7/Y#A\]SA NXd|MP 6( G:*bu=~<2v>/ ΧkI1URR"_Y"foL|7&tu4 Eʕ;\J>hQK0<cDQiwtOT $CSG? ɿ"!8s 8lkګ tګ4(j:\Y݀gx@=X= vfpM, Ȫ) T^y\KĜw52{M#]^QB@._<V=UEd̙'ԑRlǮD+Qp}4"Hl~ *6S+a(@|:ߎ!Ob)JAB|iM[ufOS烂]*Gꣵ,,y¶a%3S?|!;5& 4 =p0ک`C7;E %DP{bkQ~s &@.:;x&*jLH 0XmgH۷<H-e (קdwrD@v LuBw@#k|[}[`-uR:0|HX sIWF%\Sl{${"yx2=$6N㜬H . pTrZY yk;s,ܧ NGx77|̔nQڒՕ+Kbo:l/QnKV#"$ӈ{ y"m '_-IkA@! w 15%p'6m:BUXR nGh ]i2p7W P+ZAZ`C%w2VfY^ Ų|/kL<w=.td˙][$ nAщLfgn+0 gSQYT3\.:FI?8eɕ6Ct U[ |@߯k/딝M ~Z dK!C D]C1ڰ7c` H\pƀk>Wdy .0[XF%- t"|iC>d[qfjEO&;_6n ]ZƟ+ay7>?[ <~va}KZ-ģ7F}Y~kܷ2el- JDn@)sX#H,9K!+s{s<(b_(蘢0IuֽSM fJ:fSD% \p? ?R=/!zf"#?1~Dˀ$R`5GspR#pT9$&&ݴ?sS2;޼@Zj7vXǐ_ZKDI Z1#K {A{P\pm<8g <9RVٱ WG٘7Lvm#`nͧꎫ Ҩ2jyɧ_!0{A㼍kcÀ v-@P͹/4o!lV@MS>:0#i0L)}U_~} d/H?z=ѻO?ux"恾|**›E.A'8Al-Hy^s~LpOZK6ɃZD7:{G ExmV?z%ЊմW._K)+AK)vPPϢqimzZ|ү@Y%N!B@ !?L;k.7>H_z%@`n(6_HQhͤa%e58&C{ O۔.9:’efy2q9#9>UQ sWA<'0αk'k6?x*ºu%J\dz*">Y%<]b݊2S_t2:Ϻ55&ҧЕ >N@ B' *,kW@H"]¢ \/V4c%3 cǃ  2]3=6R-~7jgs~1i9}n8%RP`dW@7<3d݄g&x%7 OpȵEvUxZWY.Nf(u hIq<i!ШiZƒDC4LJ 0uʹ:=A7<C&`Wjэp9T2I.~yK|6~M"%4. )DlPwܻ^-wi0HZI M?kZz52ya5yWDZ$/9 90 3<4(M CO.4zeP}Ɛ"V.6pm+T\rLwP"uҳ {sLgA1ʙ0ڛ{H4Q`CW._pɌMA_f>}M=Y8Vr"f_X JBW߿X7A̙ MX^7!S(tѐ ]JۛhQݳ.mHݦ X0TQ*VC6F9"Ɔ1&sQ{`˚qwy\ aOeg hivaĿx;UL463Gs>Z-<.%iE ֛7jvd. Gޟy^~?24t+`z2_i]; Wշvu;MoA AOBOەVE f2X|]H1 22')"X g C}jQ$+(<>7kv)PXY~^Z()g &(BϠ~?#L.@ZJ${_M̍ FJT:+x{mqݱjATKwlD7ۄFrl#20ǫszN@./IwN,;ٻP\c5ɍעjnkLQ=6}EjM~Pp( U{!%[TSknast Y >Dy(j+? X((Ɔ%'|}ε/X tdl^_1 hByJmo˸2DDGit` z+&WNd`΄W^#a@egKu@I͝$I6,șcFWP}aEPMzr?b ԕba?5 ?:+a/B  Ã6SPr ҥ4gU8{"|oU*-vj-ኵIG$dPqL.ў6>!AB|Bfe±@|`| KTAP8(8*ARo#$ Mԗ=S-vCĞEz>Np}@7 qE N8HrЙNmuY-8s7.D |a>WHq.g `J}lc`S#RnLWgcLL:QO9N J I#' +L| ToԸ(mrf7zv3Gq)dC4b鋷^eęzhz<@[~6 ,1R*\F@ 54txԢ;vt>33JG$PѺ-3Q>pBpyG|sS-Ib|bmscJ;"7 0[>yl10j6'PgKM@`(tnQu7dX-?\46nod3?L>,$^םDke;)U&`W*&5h.(Ay<@L~8P=*{^UGK?0Ӑan`MD@N>8:&oQ/c>fmLj^\5.@xeރ(26d:czљMYd\嚀~YGDˌ'(BuDX#2wsin_L_HV[OCz~f?hm?gv5X =6R-(90B?MosRfWepEZq? ]Sa$H8U-VXsc<saY>]"@\S^ƃ.[*ϊ;`$(A#^3aۭtّ:f38# v8H>V=KFon籏&%zxCT^Np`\TaQ_ ,6h6 i Ak'Z*9)HH&d0x \X6bPB׼6fB*ČmcAf>d*@۵̉@Zڄ%I_;̸Gevwq3q wnvvޅD fQw4G}9{o:J Ӫ6VMZQū?MZu'Z=!Ug 8?R&Pd)9nIK} AM\+ՂB9[9oM/2[yē pҸsѭWsWɾמ _(:ACs; BVd`fJ D+\, h8#*<`Z9sU>g gz[~00our]`P/N.E/n@9>l(1gagafֿhFi(;qt?D/LtPqVSSM@R͉-mI 3op xAi|HU|n!Kz 9Z~ݑ-`2ZFvv)>֏jQ6wAI!j-7t"Aq8A7t7'_@#T~+ЃУp&8װ_Lμ,J Ղ'@ `.`0ԄS 柧=8YF09 ~:/ʼnمI g[[txx$) (H>pGlmz B[`ǘvG pE¾]C ۽Y7N f Ca\4bր̄! #2a2@In0539D:&o#,K~x_:Z84+À]Ux;00h~YCN'^t>A?%cxSǭۤXf\*Wid p(62kN-CV3-GqbYDzH֗&5#Tdžy`[IJ˾")~kc{ בbh\(G[ѣ!%V2un-\ }Cq] #z &!㤩1pF_+hX~>͚w^4hZ潙Gs6'Lm-|$xTbZc6K 9kv.pQړS(_RI/(qa*0 rnT@tRfY`-^Z{QɼRV> _SK@-,IN;.PLXFgrZ{ON&ύ 3Gہ 8MQJTtŁr0Q@xeC9=L~A( 2LI1Fɗu_{v] :BV361gp` `d3`a$ @.` i%=>!; #q~1&in@}QC6 &EՃX \䟕GmۢqoIRqHDɧW%9.D[wmQPӘŌ,Q &IjCxAO<  qNU_8>C,kIVy=k f ~oB""b 7E',oF-CG@wMzY*xՇJUZ~M0;#DփAnpߊK"6!8rګTes3M ,c3⯏Y}[%`fH \8YCX?$GXTK@dk ՟6Qt?}d 8B&?KCIFz|>AS%D7~]D(R̍|hgb)90iJ'0" rcf5@Z%ZC];.^Mq [H8 @Rcԝ ѕǓ@Yzմeo57moM]b VY֪@o-([/u) Mbwb==A{_jk<>YӉ5]/ǯNH)7m|z] 9^U-K~4(dGCFbZ\=; dCݨtH L8E,jZ˰ L]f$&{( iUωJ7 d&%zW{~h?c5U*(7,> T` 7@)f{'_uCip[p߿' )D=M@|0qwf@A̕Zo"\͎>ڀnnY bƭqݍ`P(iFU.61R ҥKfw:rO³.)c_\|X:UCNHlW>p/-Q.$4gc(J*0[;5ӏc!֌0ZcP@M5B~B]9[<&?ôaεTa9vujˮ:+tP"av'RdXA2?X~F4˲mkC:J?hml$ڌ 7)]#cCpPT(zi}zu?hnk&"Y}_cIWVk D$,t:.G?:_3_t̺]AC_^ i ܶ_9sقz k7:+!x";n;W`l he D9uk12KGY".?` E"vQgM|V/dJEu Xlb)oԲ,lt_Lq"_S{v>tMFU3) Ou>}}٩H֮M垩p>fKUM\ Cc BU[- c#HiVEZv nM"bh-8UJ7^ 㴋y ^N׾_!dETִ5# W=}zHSka &̅B$U!@F=뙇"$wwZۗ;ӯ +5W珃'筿Bo&|.]VnZ"ꒌ*P:+^C_ N~HȐhd!".w&d Z6<-N/ Dcm>1YZ&Q![N&? 2j&: CDߘWKOzS\f` `xXoʱ> heMp*׉)t5 %̸J7G~,&>k%!F-0&,x%JPUSY%disc&hi+`֡aɷdV-p7y[5ݞH@;2P Ml4kk+(JbFȪr.YSjFKqR #X!k=A]=uނ[ຘ6|4FG g;JF>%}NOI_S_zz9ji"`}6ץm&0gQwJ~tـGWtC- )~:XOzXbOnE8>t}$wܥtXBT :{Iȟ` u`(ID]PX^݂'jzKP`5z~T-a,'^_: @h<<'@W>l$R` KFI 1f{yU_#'CU8 b3Bc0 ^iQ0puD3[p/. g&[h|iLsZ`Pug@@ ~@``Ϻ1μE1田.eYO%UЯWOU߇]*3A\o 888K\W\Y<כ3xxeƛ 9mn 9.\:R翛g5:oC4 &&'W_j́1V $$+N} HTCTɄO2ӟ/֝_RQ- j%p^0khJQĩhA>b&AG?-v\@ P~D_aUa4qf #?Ě,ES?ilDMj'Xo xSkЅ8" +ܪ`rTCkp]zq-0bΦ"eg/@Ud +5?]g>w/5|hF)@k9ll 8ո*Y蟘~׃KFYVa` >^U006譿YU ϣBO:$>,p VL_`#z.*5_Fg#u.>F 7j U+*^P@'p+DZښp̗@/'wVM*ҳGJoGki9l u`.`mQAPȟϯW:&IA \!0l?~V*|E/USg->1jE)$墠1 n%Abr:0sLng(gccknKȖsPO5- ۭKg$at  r^Hjhe_EB( O}!LddN t/4~X.AA,gV<+|k1N `fq]ޜ4و-7_ ޛ=UVZ},.@~w$WpWowvWo$ILJ 0m;u@d&bk/%p 6R:.r,a-H+p@0ª3 i5GK/8([sٻH|f b+M_,R]?#@_XA ??[La g5X~6CXs.@h: lR ,^Sm+`yM)mr Ww!B_ Qd$t":y 9|xI#a*^ FO~ ^CD+:.l#6Vj2QbǡbLC.\c֟lsd]_o^'o|ɗPL<*nwy^nh/\n4Iݝ/m/ @׫ 3h_5p6~Z?00w~=g?T-?,߫/Xk.²ӂQ;HN€`ZnhlK\H`1 {u*pĹC,wa`b 'C\WtE.r׃f@A4=Q ۯaA;_O{Y?زZl A %3Bh,5pp7 Z^;_5u NWAຂW7 ڧ:B6Ls=?د+VUJI0=f#_*fWdÊ'~]xv!͆6Z1lI3-x& hDY^ o`*G=J=KbJoe`8?`|v:_'Ԅ 'Xr7~VAa,6`$ k gfŸ?#9Ά \Kq.$l_ϻ]4'@h?Yf$W&VWlfmNEAu!( ^K `BYMA % (rd^|֬!`(nkDJ=گ%\K 9ǔ\hC1Ъ3qMh9U\$, ?ӿ/2~Ȟvu:ݓ@kUBluάY vQߗ]9 hD,3 [n%U?\s`0501" 0B`zA+O?pem{gaPk 1+ (\DeIP?Ƈ/tqh=[mmk x]62szaD֎DqwM }ٓ z4ѷ >ل@@f>7&o;`#O@# <@_4nם.L6P }Yw`8q `؁ >No"zX| &k&UKH"? ; D S⾬qGne `72kwgQĉ@ˏ hDydZڻ;_7OMDg# ￰o{T% yb`|#NQO?[ K 4VX_Ane͟tPl)D龫OVd +E$)޲}v - 7cUq'пHŅ.P.t\BLdLxv wТX+АsֶufZ路娞UP`H`c^ c2bGl揜0%1TFi!ҌR1dv۱ hEC Ja'X(ՓzxsOHA:'Y볐.p[u3 kIx `4XBw_3\#\@uyƽZn_v~ZR6!,k|.Mmgs+.jHL pR9F7} [yKGo% =:0g4d-.?kC$?g7^[z~Y^oxpՐ~p~`=Œwtw~[~L۪ I@YqJäIkBul2?aƹҵ5Z| 24_D:oDxv &9 l44#჉i}rh{]o޵1 rX齭ϡpcLQZ?g``|XH (n.xo˚ t.5ޣR?@k8Si2Y Y/?t `Qz'j3R+ UFխL,mߤ |@ߕXm vw΁"M>6ʐtc.8Pw.S=?#:r@g{/=S4 =cTrxgߚ3ׁ;=q~sX[O_a>YNO DEV@~~׀B␀oq .T\NcD_rb]*>+ v~5)B{JsMJfSV6Wr0VwO!סMہߕÀE 8ln@~W=gybHF^c@$LUPϰ_'$+hYp Aºĕ?zwꭀs=o@PxAB|HI2ovUv+A:znϻ3#ܓȄ~] @&`Gr>4d| E `b#ʚd!N7DquHFYGkL*Iٝ}'o#_kYv}F#F%1H3=}r,ǩ@RPBe!;&N;!!P"傀?IAYcp8۷oh$͌@yjd}Z[kw:>׷k/n1R7Ba2:wBB?~g߱'@hZe+p`WfѕtO.$mK82ik;îCPTRG"7T` {&cb-3*`uIcC'Z~'̍?@d%/3ĩW]SO1MAK]?7g d/Yz /Y ~3  l 2c*?pbY&/N dł?xre܋?3T[Xm>0MS:Mr6~n s@¡ړyY>nA!Bbb,4hWZ6MbYJ@.vpD䒂 ?| ? M7D~jy</߯urC I9g]N@? /g// عGfLr C?c*|ƚ ay5XB0tԄCD?p=-:*% 4-Bbҡ1)y楙JףP-Yvm %7,A@}JXO[ۺϩH1/,.CSe9p4n =: {#3uI&n_ ŕo6!R8Lg6CYsgПiCgH|SU;2|7Y5pPM:m7`e?ͭǴ fB2@f9Ǧ *;V3yP@@#`Dw4QBeaۢLΎ)F'gP4&uD ֌axG8*GLqDױnÏ~}84Gd;@cSRϿ$% ZsoZMY,>d&M@p;?AӠۉ>f&@| +J0cu)j4[NA6yo_s˰ICmH%6þ+W.E>{kt p( 2bdsUgCoa3ԁ` n7?J;ЍhxrVDfP @g +} ΂o{WXĘ8ބ5 uc x}[~|b#L|fyCjZcɱY t~cG8D6(q;E0[a]6$V明snom͢ad|p1ɼR/=ԥ5[@h4|cmmUFCNP_KP/䤟g͌iB\,>7!އ(0?ό`AN7 / b8xY5@*eX ZFb_sM?6opMx'jlSBQ 1VZ k!iak/f/@5'p#w(p>t,)"md4Hћ;HD)}/эOp0oESv|L3"fM=˾M}`Ph=z2s_Mg2,&Q̲_1o&s.`y>A-w)EK0dG5n 8#W#ty6pUe 6YxYwH%JKۅ{M` P =^CbL*q;W6T`ib^I8^oZk.~ءp:JE75pT}++-(9& cOGrw1s Qi aN30ğSpq'b @D}.p^}0珗Y^!JI^B@{1K-p - @ef Pzn#O `lX%fsۍwZk7DHJC6^\w}c}HO_H59;&pj%c-\q7zd6R%<&#l}-MR6Hnn7M.?Z=8$ y+X w8J5 'L 81N{~'Y)0<sB?8a?UH:mOəL Ov&ϭ蟼B& Y$~0$'ItDT[4?VykH+M`)ۇI}oW_cZZ|98Ë,&f-tV[ڽ)d C}4/kjC~M_l>1B p رPi`c;SC'*I0 0-?.Yͬ tQ9>mh ʕl݂Pجj4Ra"jPxU>P'#VFqyb YB.'NC8H;ߡ 6q`с LXA`_jvLC AӃk76 >?iȂM. AOo?Mm.m@Iye.SA*?ޗ~QَU"DA: # @Tx/`pl{ZV8# EӟgldlxO)>o >- !EDVi&X{dž {+ 'z)`!.. rH %_\|OA~dio␻7] hf|0*->ı}ܒpx!qXHv8@pws?'zj20e~5>2!#́Ihlgޣ_zQ}z|= p.Aq;l?;XXπ%2pmH c]4y μ `lN+T 3it@Lc/e߿@K-{CnQTԆ|lE TQ1a_)gZEVf*^su3ClJTGnw"FtSwRs3f)T}lզv6b@(<؎KF۟濷z~N\yL@ 9~_>`v>lc eQ.'4~6 dKT_gцP sOzbB&$JXm Uc^Z{7 قX a7t z#v0s-{ TBo%>mkqm^k&"hbZKg2iv{L3֯&x1g?ƨ1p 4aϹ38#0xofO} b ?j?'H f!m-RܿQHD>Qì B\ +0UN`iTJOtIs׫WgoV !uG'![ 2yF=I9R 3 t3(1,`G$]v @D paC1؜%kIZ8=:4af@t#&P 1/o@/6XW#)_;͇v\w›*}؅Xm?q.Qr۪E[.OыDOEiQ\/s!9kY_CW2@b 9XDјzsx1$Nx =4d$ ,@phZR= !0AÐ݇63KN)/BYM[) \1MYASV@OZ-g4}\/O6?G$ :3@o|yƥ7bpIu{ $B,( /N|@mRlq>oۗR.߯ 4Z9jA},'4@fb*c"6}4Sqm>p]!RBl]QQrˍRzb!}n{ru)5FkeT-v§ƟzHCbp? > @n?~WP* $zYWM@s\4nӲoLkohSb)0eʑ NPXҽtQ'W \10q+"*@Flho;'S;1)⾷A P ڒʤ9?/>O5?`žSv:i,@Ҋg7a'TBz}> 00ag@`13?LJ2xy@a3م/c0Ÿ{bG@@Yf^3{ -ĄjȪr'?~DMRd'{܂IlWZE۷yuW7;<[q1R3ET_]*{r}g_93ZGR(1GSVp '#6i| P 5ZN,8 `O KjI"0 0Pk@f')Bop ɱŕ L0A^ɂVAzc7&j . `.{z#ϼKs `^?CvWP`D02*5ȡtv҉$NR ~UD;3kD*,c eY$~39+SMt} / =6 0Y2}L4lKι?S 2z mVtlFyvFݴ|5`) ATewfSm~>}NeG'*ݠfBu')3`/bg9PpGRq6Ben:C""|McY"1! gRdgd.~P};D?D* 5@P8ҁ9 XNTi 7?ӀuS.W=Qzd r^XAS|X'mD?,de%R?`y1z\ՀYv4AӸ+hGY:#7࿛^Px|~[RZQW뀧cfK  hA5^y`GB yP7 /nǛ?A!X)"ڿ\s^'I Ϫτ_A"epW[8Tgŵ؎҉i38oM @Hsïtgp-tYb}Y &G#p385d/ @4㵻 uqs^ui7X(0XRb~<2:clв8'F*cmsMAo/V?" zYȟ5,c2)SY|?+_0c.?Y0 o 8v+@jߩGlBoZ&NP'6 й5(&ڢX^%iʔ9:(I T .IMfssR`1x *b: #91\ơ~m4YG:j\p_s38??m,-Q =8β$\6'Mߕl6`v~M:UfÙSc N o(j~Oh5is@`9<]E2tŻTĒp\ `$ u-fh#{Џە@P"7T0Xa,$ҋ}=g65d3d(Rr^ʧ_ [K&;@!hC&:'K_4+W?RF. H,S@L; aגa=ǹt?yB0},ATy}e X) ߘ2-'בk5 ` Ϻ~@60 0 ȵ "`!M3`a&!0GH0/ a:M]yOK4l73kߋPN𱵵jv}فL|܁~IfƠöE!6k]+(Qd$YȐ`G Ep{o/ OЎ8 x):'0s,7]}&-W'9@w @τ4Zς-?sKVRIl30&ko|t1< 36?26@%aW/݁É1UϠ R|~ِNA>;>5f*7 f@LC%+BB+`.8 ½V`{䜇,_߿2h>S<%~.~d@p}& X?$ <|sRo?S ~Z@`eT`0X@qv߅ώϬX;`a6 0*Zd?/`@ ի39s,|~n&]~<epK 4 t'0 )Gjh㙔1P YċA?ˁ+,oo/Oe0C(N=M\ 4DL@@h?X.I^~"L- Zp4CrdR`k~s'a=+|Bw3u"(؇cU֏3&h@}]=@7=/7Y1Zj;  ¿yj=7 8 !9Na ‰@#7tDn)s=ٻ|'8v.8Ջg6 auu4DCHd@4:iMh,ɹQk:3=:hDl!†mIߜg_S&7Mpa_Y6I|J@ 9dɧ}_@5VI7!#tzS%Oxзzfeu1m`rrѦ?NH \a'`}x% kEƃuRߴq5-|~ 08gF,ݯL0Ï0S0?3̬Lt>P Wn}fXhKBJ_ Lm W&=& 4$q~S p 3ـ3'ݾDttl& &Z&I|U.F *`vB p0 | &QAa~N/_?ߩJUW:P`ooY ̞k+FgAI3{ 'i?ygh*#lMk&z:_kwa Qr6 Ӂ;]~l"`D iI``:ׁ leuCF= D?YVyPS3ֵ+:P|Zܺudd]N:LtASD|yf吁 5&6\5 Aј<5o5| 0o )h& 1M"/#”m8_„Q ;שa(`sTVc]g نj_gu򋶩&>jˬVBQ F˫6v! A ]w#6*ԭ '락Q0MطP=_ h 0q8nu wP/:B04dT'$kPN#)kX@e_bV&8f|.pmӰN # ~ _MoSej[.y\XtnO(J$ 4vbDJAo xFXo@G=[ B@s)ЪIS}'g(4pSd!6NKCţ u==%s^| 0;!=O+Yfل, ?&'>b' '0<q00CW-CCrիۗ31fط=J,yw+%  [Ik}lЋ8}1x] 0߳GFuH?_DB u`t߆,,' d^a{g0Y? ދ }Ͼ&LƋ0" c݄vj1TA9 1B01;9&I޾j-b*b9 HI!4mq|rO (XHeW4.S֝ 0 &8 78~6a RY;4h4;~Ii(4Ae_?:FL<[1= SB MXm5%Lg?noӝG* *w5ҷeZ EΪ@Ֆ7!QO;;:`I><FEl)dckA"GG)D |2`g' f : .GðP&:ΦW[7羰|9bEfv.(~q=1 k]ck,kvGAgABlu}yE›ufS}lp B 8{_$1~ɱR7P{o` `=~6v2\PNv0 IҎ`>Njb)lTDziIѭhA1Qć-ؠ ^}W;ޟ'Ʌ1^Ë6| >㏂@&$Y-i-mS}X7,td$7-aS;\rPxƂ9m#r 0@;~˚߁ATER H}KO:|`^+cpgIU2#Z܇0kFcG9z?Q U,Xhe؁HwؠW[@gu,Dͪ  d5?x/O5dx9x8V/7&8ΎuI&So${6WD}M"A0vR-ҢR;es6 Z@5YÏC~H=Q,/qo CNŤX ooվU=7~jz>:'qnLygPp`2D,j0O 8?SgZxAK;sp 7^$8!e~.Tߛl _k>. /#H0x ȣCFsg^I4yWr0ռڛ>BP}[dvAW[[jiid7ͦ,K>0$I?w^9q~ :K&$\qx6 lKogSpD1S\]Fp:y` ڵz$w ~=17G}/?+҅˱2YEpb6JY,sx˳:$@pFk4I{u~(O( cj@6<~}? լavk0u<"D/DHY[W/ g&3.NL] @b'tW}5(S# /iG fg%2P,O6="toR1P|mC!JG$}pa_5镊Q}u=ڭ]IHN3\ (|ҍ?R^+5޶ksmc}X{s. KF-Zcx'CXy$|ha<\. rf7, *j2WݺV[Ŗ.k;Y04aӽ\rx; P'kP5tdJ\gk. * 75:-L e ?yql Ra @qcE6Z>$.jL`(Tp&;A%Kࣆ6$lE[\` oQڌrMppۊ pЖw@VGًpzaq_c! +´W/I1N"A# >\="]=xJn!(g)?m͆r䟥/mǟC|)3+&fX)6bw4Bf$,H] 6W[9?8i~G!/a_}"TI@ hRQ(A pj$ XG1KtdMIh~~峏喗6U=w'Zԓ0Y`rF+ѾG(% ?2 \Z&qNNs H@t"$ 2Lm }LaR#@ )`7 "sCǿie00t"SH:@wB|"iseilEe7b" fsGS:̿iTF=U?$>>cOh?hyL zR3XxŜ*D ܩBX.[4@[pg/ Hn;J-3@*Ap"J 3YN<ޚw|ܭ&#C鴘De zJMckv>8/0 j UZ>u y ݁& a-d".һu |.Yr e]F_tAJ6Rmoz t5>OgPV~Ku@}=wa4#D&&f5mWAL# )@ܫ_E p+:-q # 넿}&~g` @Nѯ@ԃD: [[tmYPw.i`ʨ ({M5>TH _X~wZ'3[2Gz^޷6g>2`~pGf@W3{AFW m΁8CaaWzS`b  K 6F9ds&f/w`΁@dGZ#혝RtSP06vz & w~h~~=&$~k--Ė|Y/S ![{HHҐ-9,MѨA{(k@gY yBbU|^e (<{H)C^7S]=t́u3vP2@(xx Lfy/:U$\pk0 >|pl GF17& hj@-s }{d[VAxÒ"@{5wv*%PMOs '0ng7@kZΧ?MܵG.*h3ؔ@=Bo2J߱tmzG6 8=W" Dc0gxGv_Ƶ#@Fi{zMcs, `  '2&l?^_iwFNx%{ I[LSu!=عwba^,OGI 8_~>Y =jtΏgvP-/02,@ ͱf.‰>f$6Vdrb>' P8 Q,@h !w=X0$90fGL QJ̀Scz!^fY 2}}&OH͈HȳspwV!0'=:]~̙tǛŠhE x, T>/&3A;9 9TAOX}Q8s_mA@A K  }6B '@0&9G kEژɵ7/җG˴]M+gdgbtX@ O*aG[9\ho>}% ,fpY@iO_3ۗ2^ x?-M(⥋s_Ҙ:cW_&h XxY8~`!a )~f >SP}8Px,|~&EIDv?A2'1OL]WDY8!(L֮Sp~|v p s% T inI^zOH}G(EBV펫W6_"&ř, +&[u t+M*p`h) =q&ٸ+םÍJ5>.H fS?XpkճzQloN%ht'73K E2(yi0тvAs U@zu?~ۭ{+&k畑H^U5H?H'M_}{ eXtXD4έߥup?|lofpHx6jmKlmw#է]F3q[I+}uױ\4#=GhF䓆3 q谞A?:J)l|AF͈G} h)W4&47Yxi!Zn0v3Cqx31&~4rT')PVXwEnf)Z,[eXLVsi&0cS@@͝~o 阷P?dP<$INNx-je&ivTmfd%8VpC5ٺ,)$n&vzGn[Ņ܀g6=eeyZ5RJ7(N1nҺYfm Po ܬ>=" ,Ns/]ir3 Fcˊh%6 3{] Lm,w-OiCKY@K~]Bg@͋iT'l=Z xjopKjQ@c0$& wR y&lGfs.ef:IGGA_Y.U0|xLCd&!}YoL/3LYKF2e!OՒF>dUP@)oGf>46[N:܈5v t!/ !{1,4)f8w8IubʶB^* V%F0MkaǟUk֚ v 0*;ԱW/ȉF_q߭LqV*4dL1#uk"lI,03P_~ـzk{ 4LAs E0:;`jd`mRޅu25B@a+aB뚓}  6\'˄ 13̜lLCtRcgGVUZ=s:OzqFءBWVlp(@txz& Dupk@̖ 8r/wVf\_oˁ QSqNmA:!Frx/DՈ{5v=hd$)KNRL)ęUjqs8@X{9YE Xe;6OZ^A[v s LxIR0x Xjzvj6ngyj ^;X~j& YhL=ߦ\c vN?lh pG>A$EIġh_`-&qŊn { ?$ 꽌.LTT2:Dhp0߀;\GX1 )KGwl$Q{&.^~r 3XwD0e"7j(%5#u.W@kn>﹧ŽGDfnI߇42'BxH |AfiwgcݍkBMA$ ٵ֮sEP[eW npnjgc;:|fBUQ薶?sMDjϩPKPEEA>H33:)d:D ҽE5MAcM7-w,&ӳgxA0a%RӚ^0qýaPS5ldF=AЧJf=C#tb>͵zQ]MK/\#SW|$)Z2 >׵<9Q tXOD@AI7w=t)Sӌ'[\pw} +mFGkjΗo9K\$&}6hv`2YgȆvgLg.~g5 +lBؓ, KCڎ}K4}C8A{`PI*1c0L93,aJ*^{봃z"`0(^ `1Q,)qyBT3#W1W`d<q[Ҕ% 'G D9&Iu8y,58 ع|>wdY$72DM偫9 Ȼxp~kn6V2LET5(h6(*dcBZN;F[3Lډ :f nka#nj ÙƬc"J.2h(JQlI2yaAkɃ=p;2AfvRHoeUڄ+TP`~^s;FZ1F@ЃjR>LΙ"*w:Y9Oahv@ J]`Sѐ\cRj-)s[-X>-'SQ4 KjUqH1 4҂ypZ0z0-Kmvb<9XV߀٭Ԧz א dZ*pu'57LPcIi6hɤl睒@i~ ZoU٢F1HX/8bPI~Q*Y|;_L u4P*3n] eLo)R[.fL`g gK!^Lxc!"\4H| (-jؕfBLzj`~D:4qst%NW*& +!"vHM+@&d?,:7(_{.^kQv3[qLJPΣLaDdq@5g QD}Gcs΋kCVӚP%{^SCق;)zx W݈6}|-aÛݒWߠj3?Ϻ 9q)1-BT-nmHl. -#O:b+GKį^ ԏPGHB10c)T3Ez"y{m5 ]qˆxBWkv_ pp]n)m!Jql(_%2e"#gdhNA<-=( @+t2daUSO>V2*sׇ]@4Z-DFB%v'D/sJ1?.^N{UB6{r{=E3 ئRTΓgP@L꽜RܷMui 2Z[=K"n1Pxl!R 88Ե, 393JMM< p &-[RW08iNNWT)2Q uc: Ϳ*{ . F$Զf[BK'_ @nv٥}%좑$!("#+-۳#TW['8 ܳ~[ VNeoYd .#&bCq9hEnF>r;={A5  bTH]:{p~Pi6)9&-6"3BO־G?GG/\ܥ?!m3Ft<X&jc ^;v6sQiAHSrVcF^eD%$&$ L(3V\WtS_"Y5FSX:]}jDE4m} w{@IHXOǝVP(p.8ُAV \7?~:w5p󷿩5/4ahc8%4&Dl9P vG‚˕W t0V7E sv҆2J=pxݖ,S Orwf@5` f ثR|p<[ @MwJC9A!~s#M|Xiao[ n 10mnTJCǾn H|CgQf{."3h?~)ȍZ0&7 2͠M2kpܷ0! ǖx2%qLɜi,,Sa?( ĀYf2ȱ V bx(0C sIGOgdF'O?Vܲ" 6!nvt'Q!R~׮V*w{<Zp >\Z=^ i> %7^b"N](zvȖ{!-:y ;Tf*Zqh")$z+GO-p6?}*up!k {Yp2{,xhqmى}ʪc(k_*,gy 4 5x0Pf6 K| Qk:̛^{ M0R3J-g9>Jhޓn N2pun "!sI`" J t@.99IwK^XpniDw/,Yp*9ё6RRu}tԚڹeұF&ĭ'QE](!a u`Pnہ9C~aH.]SbOσKQoHwZuck& .~eق^1h iY,xoǠ>>آpnfaXti̭Yf,_4gPkNfTpfck"SmOiqnu56Jб#D1yG}y62Ux"+ІŘQ,O5Z"m' 0@qu 1ݢ%IhA܆̍zXb uZgu1T%P֠F# ~; {W k Oߖ_?`Lf*I?4иxjWٸÒJ}V@K Mjk [{ۙLd:$ 5'rM_ߔ[@c>.3JmqDr_}Snݼp WZ/ Fq0 F TβޅM [QI` Xȓg@۔BEliiϢIli#LΎ4#('02YS|Ցt6 MWWw}Ɖ-mA€۹&c7'd 욲dk=Q_|:'.g&p~|79s)\C) Q}.N?16^kBoz1dMv1\8ډֻ\G]3@҉T֙EWçbXY{wCW4tg36u+w]ZPB ~52{y+&a ]vr l<>'>/REQ@3U }AHh9nI7&"{Y1QtŴq7.vM͂S9:b\c(]rvs<($0n]6}' LdѕnF:u|dM#Ş5FV5Iź5wl!@9CSVf&_y'{<Ǫ O?Б6a=wse94jC=OA&qm/(׍:iPG ܗvݴNBɩlC14RL;U57d4yXR9_:Uvv݋ՌWŻZ_g{&Ž; 8 MtFE,O;hiE{wc1 H_l&86{Nf |@ H3a[foµDkkP$0k ?J<5[X3;mkJD0VdI~@TM(8d=e*Ivoy\\rTt~c履wG)Gύ}{7waئu1Pcf7ܭؐ>sDQu8d+&#;_Y]@gek~&uhWek NCkۼѮ+_A1חJPw/ 0N{,20Y;@PdWoݵ{xp,s"՝Vk@7j [ ~՛pjhֳ 3r)plI1W&ͱ֋۟u-: S::/kf"E'*4WX!K/FFYۻKMsUhp;*DUZ&2wbͣ1Wss|1_;>ٝ{hM=?jo& < IENDB`(  \ !! !!!!!!777!!!!!!!!!"!"!!""!""""""""""""#""""""##"############$##$#$:::$$$$$$$$$$$$%%$%%%%%%%%%%%%%&%%&%&&&&&&&&&&&&'&'&&'''''''==='''('((((((((((((())))))))))))))))))*))************++++++@@@+++++,,,,,,,,,,,,--,----------/-.//.//////00000/0/0000000EEE111111111121111222222333233434444444455455555555555555555III6566757767777783 v ! !!!! 777!!!!!!!"!"!"!!!!""""""""""""""#""##"##"############$$#$#$:::$$$%$$$$$%$%%%%%%%%%%%%%&%%%&&%&%&&&&&&&&'&&'&&'''&''''''===('(('((((()((())())(())))))))))***************+**++++++++@@A,,+,,,,,,,-,,-,---,-----..--.-/////////0/000/00/000000101FEF111111211212222222223433434444444455555555555555555555556JKJ7767677668777788888884 / !! !!!!!!!!!!777!!"!!!"!!!""!!!""""""""""""""#""""############$#$###$$$$$:::$$$%$%%$$$%%$%%%%%%%%&%%%%&%&&&&&&&&&&&&'&&&'''''''''''''===('((((()()(()()))))))))))))**************++*+**++++++++,,@@A,,,,,,,,,,,,---------.-.././//////00/0///0000000000000101FFF121111122222322433333343444445544555555555555555555566566JJI777777877778788888888888{899 F !! !!!!!! !!!!!!!!!777"!!!!"""""!"""""""""""""#"##"#"############$###$$$$#$$$$$:::$$$%$%%%%%%%%%%%%%%%%%&&%&&&&&&&&&&&&&&&'''''''''''('(('(===((((((((((())))))))))))))*))************+*++++++++++,,++,AAA,,,,,,-,--,----------.../..//./////////0/0000010001111111FFF211212222222332344434444444555455555555555555555555576667KKK777777777788888988898899999::: < !!!!!! !! !!!!!!!!!778"!!!!"!"""!"""""""""""#"############$#######$$#$$$$$$$$$$:::$$$%$$%%%%%%%%%%%&%&&&&&&&&&&&&&&&&&&'&'&''''''''''('(('(>>>(((()())()))))))))))))*****************+++++++,++++,,+,,,AAA-,,,-----------.-../.././///0//0/0//000000000010101111211FFF221222232233333432444555545554555555555555555555666676777KKK8777777788888889989999999:9::::::  ! !!!!!!!!!!!!!!!!!!!878"!""""""""""""""""#""""###########$####$$#$#$$$$$$$$$$%$$;;:$%%%%%%%%%%%%%%%%&&&&&&&&&&&&&&&&'&''''''''''''('('((((((>>>(((((())))))))*))))*))**************++*+++++++,++,,,,,,,,AAA-,,---------.......////.//////000000000001111111111111221FGF222222233434334444444455545555555555555555655565575776777KKK78778888888898999999999::::;::;::z ! ! !! ! !!!!!!!!!!!!!!!!!!!!!"777""!"""""""""""""#"""#"###########$$###$$$$$$$$$$$$$%$$%$$;;:%%%%%%%%%%%%%&%%%&&&&&&&&&&&'&''&''''''''''('(('(((((((((>>>()(()))))))))))))*)***********+++++++*++++++,,,,,,,,,,,,,BBB,,,------.../....../.0///00/00000000100000011111111112212GFG222343334433444544555545555555555555555655665766677777777KKL888888888898999999:9;;9:;:9;;;;;;;<;2 9 ! ! !! !!!!!!!!!!!!!!!!"!!"""888"""""""""""#"""###############$#$$##$#$$$$$$$$$$$$%$%$$%%;;;%%%%&%%&%%%&&&&&&&&&&&'&'&&'''''''''''''''''((((((((((()(>>>))())))))**))))*************+*+++++++++++,,+,,,,,,,,,,,,-ABB---.--..-..-./-./////0/0000000000000001011111111111212222FFF343433444444444455555555555555555555555666676677777787777LLL8888888889899999:9:::;::;::;;;;;;<<<<<< ! !! !!!!!!!!!!!!!!"!""!"!""""""888""""""#"""""""##########$##$###$##$$$$$$$$$$$%%$$$$%$%%%$;;;%%%&&%%&&&%&&&&&&&&&&'&&'&&''&'''''(''('((((((((((((((()(=>>)))))*)))*))**)**********++++++++++++++,+,,+,,,,,,,,-,-,-BBB---.-./.././///////000/0000000000100011111112122221222222FGH443434444444445444555555555555555556666676777777877878888LLL8889899999999:99;:;:::;;;;;;<;;<;<<<<<<2 (! !! !!!!!!!!!!!!!!!!!!!!!""!"!"""888"""#"""####"#"##########$$$$$$$$#$$$$$$$$$$%$$%$%$%%%%%%%;;;%%%%&%&%%&&&&&&&''&&&'&&'&'''''''''''''((((((()(((((())()?>>)))))))))*******++*+*****++++++++,+++,,,,,,,,,,,-,,,-----BCB.../..///////////0/00000000000001011111111211121222222333HGF343444445554555555555555555555555656667777777777877888888MLL889999999:9:::::::;:;;;;;;<<<<<<<<<<<<===>>>=>>>>>>>=?>?>?????>??>>?JJJ@@@?@@@@@@@@@@@@@@@@@@@@AAAAAAAAAAAAABABABBBBBBBCDBCDCCDCONODDDDEDDEEEEEDEEEEDEEEEFEFFFFFFFEFGEFFFFGGGHGHHHGGHHIIHIIHSSSIIIIIIIIIIIIIIIIIIJIIKJJJJJJKJKKKKKKKLLLLKLLLLMLLMLMMMMMMWXWNNNNMNONNOOOOOOOOOOOOOPPPOPPPPPPPQQPPQQ!!!!!!!!!!!!!!!"!!!!!!"""""""""""""""""#"#999#################$$$$$$$$$$%$$$$$%$%%%%%%%%%%%&%%%&%&%&&&<<<&&&&'''''''''''''''''''''(((((((()(()((()()))))))))******?@?****+++++++++++++++++,+,,,,,,,,,,,-,,-,------.--//../..//DDD/0/000/00000000010111111221211222222222333343434444544554III555555555555555555666767777777778777788888888988899999999NNN;::;;:;;;;;;;;<<<<<<<<<==<<<=======>>>>!!!!!!!!!!!!"!!""!!"""""""""""#""##"##"###989########$#$#$##$$$$$$$$$$$$$%$$$$%%%%%%%%%%&%&%%&&&&&&&&&<<<&&'&&&''''''''''(''''(((((((((((()(()(()))))))))*))******@@?**++*+++++++++++,+,,,,,,,,,,,,,-,----------...././/./////DDD/00000000000000011111111121112222322334333234444444545554III555555555555655675676767777778878888888889989999999:::9::NNN;;:;;;<;<<<;<<<<<<<<<<<<<=======>>=??>>!!!!!!!!!!!!!"!""""""""""""""""""#"#######999########$$$$$$$$$$$$$$$$$$$%%$%%%%%%%&%%%%%&&&&%&&&&&&'&&<<<&&&'&'''''''('''''('((((((()()()()))))))))))))*)*))******@@@***++++++++++++,,+,,,,,,,,,,-,---------....///..///////00DDE/00000010111010111111221121222223333343444444544454555555III555555555656577666776777777788888888889998989989999::9:;;OOO;;;;;<<<<<<;<<<<<<=<<=<====>>>>>?>>>??>!!!!!"!!!!!"!"!""""""""""""#""#"##"#######999#$##$#$$$$$$$$$$$$$%$%%$%$$%%%%%%&%%%%%&%&&&&&&&&&&&&&&&'<=<'''''''''''''('(((((((((()((()))))))*))))*)************+*@@@+++++++++,+,,,,,,,,,,-,,--,--,-----...../...//////0//0000EEE000000000111111111112222222222223333333444454554555555555III555555555755767777777777887888888888888899999:9:::;;;:;;;OOO;;;<;;<<<<<<=<<<=<<======>===??>??>>???!!!!!"!"!!""""""""""""#"""###"############999#$#$$$$$$$$$$$$$%$%$%%%%%%%%%%%%%%%%%%&&&&&&&&&&&&&&&&&&'=<<''''''('((('(((((((()()()))(())))*))*))))))*********++++*@@@+++++,+++,,+,,,,,,,,,-,-,-,------.../..//.////////00/0000EED001000010111111111112222232222433443444444554555555555555III555555567776777777777777778788888899999999::9:::::;::;;:;OOO;<<;<<<<<<=<<<===<====>>>>=>>>?>??????@!"!!""!!"""!"""""""""#"#"#################999$$#$$$$$$$$$$$%%$$%%%%%%%%%%%%%%&%%&&&&&&&&&&&&&''&''&'''==='''''''((('(((((((((())()))))))))))))))**)******+**++*+++@@@++++,,+++,,,,,,-,,,,----------/-././/..////0//0/00/000000EED111111111111211221222222333444344444444454555555555555555III565566677767767787787888888888888899999999:::;:;;;;;;;<;;POO<<<<<<<<<<<<<======>>>=>=?>??????????@?!!!""""!""""###""""""#"###############$###:::#$$$$$$$$$$$%$%%%%%%%%%%%%%&%%%%&&%&&&&&&&&&&&&''''''&'''===''(((('''('(((((((((())))))))))))))*)**********++***+++++@@@+,++,,,,,,,,,,,--,,---------/.///..//.///////00000/000000EEE111111121212222222222333433444444445545555555555555555555JII66666766677777787788788889898899899999:99::::;;:;;;<;;<<;POP<<<<<=<<==<=====>=>>>?>???>??????@@?@@@!""""""""""""""#"""""##"###########$###$$$5::$#$#$#$#$#%$%$%#&$%$&#&$&$&$&$&$'$'$($4<:'$($($($($(#)$)$)$)# )$ *$ *$ *# *$!*$!+#!+#!+#8A9",#",#",#"-##-##-##-$$.$#.$%/$$/$&/%'/%'/&'/&'0&(0'(0')0'>E=)1'*1'*1(+1(+2(,3)-3)-4*.3+/4+/4+/5+05,05,15,15,15,15,25,GJB36-26-47-47.58.58.68/69/78/7907907:18:19:19:1:;2:<3;<3;<3PPO<<<<==========>>>>?>>?????????@@@@@@@@@""""""""""#"""#"#"###"##########$##$###!##[:=\$)[$)\$*\%+\%+\%,\%-\%.\%/\&0\&1\&1\&2\&4\'4]'6]'7]'8]'9m=N^'<^(=^(>^(@_(@_(B_)D_)E_*F_*H_*I_*K_*L_*N`*O`+Q`+R`+T`+VqAha+Ya,Za-[a,]b,^b-_b-`b.`b/bc.bb/cb/ca/c`/d_0d^0c]0d\0e\1dkFtZ1eX1eX1eW2eU2fU4fU4fS3gS4gR4gQ4gP5gO5hN5hM5hL5hK5hJ6hI6h[JwI6hH7iG7iG8jF8jF8jE9jD9kE9kD9kD9kD:kC;lC;kC>>>>>>?>???????@@@@@@@@@AAA""""""""""#"#################$#$$$#$$$$$#:@$7%9$;%=%@%B%E&G%J&M&Q&T'W'['_'c'g'k(o>(y(}()())))******+++,A,,,,---.///00000011F1222334444555555577K7}7y7v8s8q9n9k9h9e9d9a:_;^;\;Z>?>>??=??@?@?@@?@@@@@@AAAABA""""""#"##"###############$$####$#$$$$$#$$8::%/%7%8%:%<%>%A&C&F&I&L&P'R'V'Y(]'a(d(i=|(q(v({)))))*****+++,+,A-----././///0000111F1223334455555555677Kz7w8t8q8n8k8i9f9d9a:`:^;\;Z;Y;W>>>?>????????@?@@@@@@@@BAABAABB@#""#""##"#########$######$#$$##$$$$$$$$$$$1::X$'%3%5%8%:%;&>&A&D&F&I&L'P'S'V'Z'](a(f>y(o(s(x)|)))****+++++,,,A,----/////000001111F233344555555555666~7Kx7t8q8n8k8h9f9c9b:`;]:\;Y;X;V>?>???????????@@@@@@@@@@@@BABBBABBB#"##""#""########$####$#$$$$$$$$$$$$$$$$$$::;%$%.%4%5&8&9&;&>&A&C'F'J'L'P'S(W'[(_(c>v)k)p)t)y)~)***+*+++++,,,A,---.////0000101111G333344455555566767|7Lu8r8n9l8i9f9d9a:_;];Z;Y;W????>>???????@??@@@@@@AAAAAABBABBBBBB##"#"#######$#####$$$$$$$$$$$$$$$$$%%%%%%$;;:%%D%&%0%3&5&7&:&<&>&@'D'F'I(M'P(T(X([)_>s)h)l)q)u){****+++++,,,,,A---.////00011111222F43344445555556567|7y8Lr8o8l8i9f9d9a:_:];[;Y;X;U=>RQQ>?>??????@@@??@@@?@@@AAABABABABBABBBCBB##########$##$$###$$#$$$$$$$$$$%$$$%$%%%%%;;;%%%%$&+%2&3&5&7&:'<'>'A'D(F(I(L(Q(U(X(\>p)d)i)m)r)w*}**+++++,,,,,-B....//0000011111222G3344455555566777}7z7v8Lo8l8i9e9c9a:^;\;[;Y8?>>RQR>???@?@?@@?@@@@@@@AAABABAAABBABBBBBBCCC#########$######$$$$$$$$$$$%$%$$%%%$%%%%%%;;;&%%!&%4&&&.&1&3'5'7&9';'>'A(D(G(I(M(Q)U(Y>n)a)e*j*o*t*y*~+++++,,,-,--B..////0000111111223H344455555556667~8{7w8s8~Lm8i8f9d9a:_:\:Z:Y;W2>?>?=>RRR??????@@@@@@@@@AA@AAABABBBBBBBBBCCCBCCC######$####$$$$$$$$$$$$$$$$$$%%$%%%%%%%%%%;;;&%%&&%&&}&)&/&0'3'5'7'9'<'>(A(D(G)J(N(R)U?j)^)b*g*k*p*u*{+++,,,,,----B././000000111122233I445555555556777{8x7s8p8{Mi8g9c9`:^;];Z;YD=>:?>>?>?RRR@??@??@@@@@@@@AAABAB@BBBCBCCBBCBCCCCDDC#$####$$##$$$$$$$$$$$$%$%$$%$%%%%%%%%%%%%%;;;&&%&&&#&&)&&','/'0'3(5'6(9'<(>(A)D(G)J)N)R?g*Z*^*c*h*m+r+w+|+,,,,,,,---D///0000111111222333I54555555666777}7x8t8q8m8yMg9c:a:];\;Z;X;V;T>=4>>>??>???SSR@@?@@?@@@B@ABAAAABAABBBCBBCCCCCCCCCCDDD#$$$$$$$$$$$#$$$$$%$%%%$%%%%%%%%%%%&%%&%&%;<;&&&&&&'&&&&e&('-'.'0'2(4(6(9(<(>)A)D)G)K)N?c*V*[*_*d+i+n+s+y+,,,,----./D//0/000111111222334H5455555566678}7y8u8q8n8j9vMd9`:^:\;Z;W;U>?<>>>???@@?SSR@@@@@AAAABA@BAABBBBBBBBBBCBCCCCCDCDDDDD999:::::::::::::::;::;;::;;;;;;;;;;;;;;;<;FFG<;<<<;<<<;<=7<<=?=AG=I=J>M>O?Q?T?W?Z?]Ji@e@h@l?p@t@y@~@AAAABBBBCCDNDDDDEDEEFFEFFGGHIIISIIIIIIIJJKKKKLLL|LyMvMzWpMnNlOjOgOfOdPbP`P_P^Q]Q\QSRzPRJRQRSRRRRRSRS\]\SSSTTTUTUTTSUTUUUUUUVVVUVVVVVVVWWVWWWWW#$#$$$$$$$$$%%%$%%%%%%%%%%%%&%%&&%%%&&%&&&<;<&&&&'&&'''''''P'('*(,(.(0(2(4)6)8);)>)A)D*H@^*O+S*W+\+a+f+l,q,w,},,---././D/000011111222334444I555555677777{8v8r8n8j8g9d:pN]:[:Y;W;U;R?6???????????@?@@SSS@A@AAAAABBAABBBCBBCBCCBCCCCDDCDEDDDDEEE$$$$$$$$$$%$$$$%%%%%%%%%&&%&%%&%&%&&&&&&&&<<<&&'&&''''''''''(('((+(,(-(0)0)3)6)8);*>)A*D@Z*K*P+T+X+],b+h,m,s,y-----/../D0010111111222344445I55555567778|8w8s8o8j8g9c9`9nN[:Y;V>Z>?8@?????@?@@@@@@@TTSBAAAAABBBBCBCCBCCBCCCCCCCDDDDEDEEEDEEEE$$$$$$$$$$%$%$%%%%%%%%%%%&%%&&&&&&&&&&&&&&<<<'''''''''''''''"'(>''(((*(,(-(0)1)3)6*8):*=*A@W*G+K+P+U,Y,],c,i,o,t,{---/////E0001112122223344555I5555657777}8x8t8o8k9h9c9`:]9kOX;U;SG>B>>?5??????@?@@@@@@@@AAUTUBABBBBBBBBCCCBCCCCCCCDCDDDEEEDEEEEFEEEE$$$$$$$$$$%%%%%%%%%%%%%%&%%&&&&&&&&&&&&&'&<=<'''''''''''''''(('(()())(*)+)-)/)1)3*6*8*;*>?T+D+H+L,P+U,Z,_,d-j,p-w-~-.////0E0001111212333345555I555677777~8y8t9p9k8g9c:`:]:[;hNU;SD?@??@4?@@?@?@@@@@@@ABA@BBBAUUUBCBBBCBBCCCCCCDDDDDDDEEEEEEEEEFEEFEFFFF%%%$%%%%%%%%%%%%%%%&&&&&&&&&&&&&&&&&&'''''<<='''('((((((((((((()(()(t)),)+)*))*),*.*0*2*5+8@M,=+@+D+H,L,Q,V-Z-a-g.m/u.|///000E0111112244444555555I56677788{8v8q9l8h9c9a:\9Z;W;TC>B?@?A?@=@@@@@@@@@AA@ABAAABBBBUUUCBBCCCCCCDCCCDDEDEDDDEEEEFEFFFFEFFFFFFF%$%%%%%%%&%%%%%%&%&&&&&&&&&&&&&'&'''''''''==='''(((''(((()((()((()&))'))-)-),*+)***,+.+/+2+4@K+9,=,A,D,H,L,Q-W-\-b-i.o/w/~00000E1111222344445455555I5777778|8w8q9l9h9d:_:]:Z;V;S;Q;aOLC>C?B?@?x?@6@?@@@?@@@AAAAB@BAABBABBBUVUCBBCCCCDCDEDDDDEEEEEEEEEEEFEEFFFFFFFGFG%%%%%%%&%%%%&%&&&&&&&&&&&&&''&''''''''''''==='('((((((((((((((())))))))]+)0).*-*,*+**++-+/+1AH+6,9,=,@,D-H-L.R.W/]/d/j/q/y/0001F1122232344444555555I677778}8x8r8m9h9d:_;\;Y;U;S;PC>A>A>@??@:@@>@@@@@@@AAAB@BBAABBBBBCBBVVVCCCCCCDECDDEEDDEEEEEEEEEFFFFFFFFFGGGGGH%%%%%%%%%%%%&&&&&&&&&&&'&&''&&''&'''('''''<==((((((((((((((()))))))))())!)*.*2*0*/*-+,++++-+.@E,3,6,9,<-@-D-H.L.R.X/_/e/l/s/{0011F1222223444555555556K677888y9s8m9h9d9_:[;X;U;S;OA>@>@??@d?@8@@@@@@@@ABAABAABBBBCBCBBCCBVVVCDCDDCECDEEEEDEEEFEFEFFEFFFFGFGGGGGGGGH%%%%%%&%%&&&&&&&&&&&&&'&&&''&'''''''(''(''===(((((((()))))))))))))))**))"**I+*4*3*2+0+/+-+,+,,@C,0,3,5,9,<-@-C-H/N/S/Y/_/f0m0v0~111F2223557:::::9876567K77888z9t8n8i9d9^:[;X;TA>@>???@?@??6@@@@@@A@ABAABBBBABBBBCBCBCBCCCVVVDCDDDDEDDEEEEFEEEEEFFFFFGFFFHGGHHGHHHHH%%&&&%&&&&&&&&&'&&'&&''&''''''''''(('''(('>>>((((()(()))))))))))))))*******)*1*7*5+3+2+0+/+.,AA,.-/-2-5-8-;-?.D/I/M/T0Z0a0g0p1x111F2469;>>@AAA@??=<987K7788|8u8o9i9c:_:[:W:T;P;M;K???>?@?A?B@@U@@:@@@AA@AAABBBBBBBBBBBBBBCCCCCCCVVWDEEEEDEEEFEEEFFEFFFFFFFGFGGGHFHGHHHHHHH&&&&%&&&&&&&&&'&&&&&''&''''''''''(('((((((>>>(((((())))))))))))*))*******+*%**:,*8+9+7+6+4+2,1,DA.,---/-2.4.8.;/@/D0I0N0T0Z0b0i1q1{11H69=@BEFHIIIHGFDB?=;M888}8v9o9i9c9^:Z:V;S;P;M?>???A?B@D@B@@5@@@AA@BBAAABBAABBBBBBCCCCCCCCCDDDWWWDEEEEEEEFEEFFFFFEFFGFGGGGGHHGGHHHHIHHHI&&&&&&&&&'&&&'''&''''''''''''''('(((((((((>>>((((()))))))))**))***********++**)+2+=+:+9+7,6,4,FB0-/-.../.1.4.70;/>/C0H0N1T1\1c1k1t25M=ADGJMOPRRRQONLKGDAR<98v9p9i9c:_;Y:V;R;O;L;I?=?>A?D@E?E@@H@@<@@ABBAABAAABBBBBBBCCCCCCDCCDECEDDXXWEEEEEEEFFEFFFFFFGFFHGGGGHGHHHGHIHHHHIHI%&&&&&'&&&&&'&'&'''''''('''(''((((((((((((>>>)()))))))))))))**)***********++++(*+.,+<+@,=,;,:,8,IB4-2.1.0.//.0/4/70:/?0C0H1N1U1\1d3n7z;SDHMPSVYZ[\[ZYWUROLIXA>z;q9j9d9^:Y;T;Q;N;J>QR>A>D?E?G@I@D@?5@A@BAABBABBBBBBBCBCCCCCCCCCDCCDEDEEEXXXFFEEEEFEFFFFFFFFGGGGGGGGHHHHHHIIIIIHIII&&&&&&&&&&&'''''''''''''''(((((((((()(()()>>>()))))*)**))*********+**+++++*+++,++!*+k3,D,A,?,=,;,NA8-7-4.3.2/0//0/3070:0=1B1H1M1U4_8j=wAYKPUY]`cefffecb^\XTP]GCv>m;d:]9Y:T;P;L;I;GARV?E?G@H?K@I@@?@A?AA@BABBBBBBBBBBCCCCCCCCCCDEDDDEEEEEDXXXEEEFFFEEFFFFGGGGGGGGHGHGHIHIHHIIIIIIIII&&&&&&&'&&'''''''''((''''(((((((((((()())(>??))))*)))***********+***+++++++,+++++*,,'+,?,G,E,B-@-RB=.;/9.8/6/4/20000305091=1B1H4O9[=gCtH_UY_cgkmppqqpnliea]XdNIsDi@_==>=@>B>ERY?I@K@L@N@DoA?8AABAAABABCBBBBBCBCCCCCCCDDDDDDEEEEEEFEEXXXFFFFFFGGFGGGGFHGHHHHHHHHHHHIHHIIIIIJIII&'&&'&''''''''''''(''(((((((()((()))))))))???))))*)*)**********+*++++++++++++++++,,,#+,V2,J,I-G-E-VCA/@/>/<=>=@=B=D>F?IR]?M@O@Q@LA@9BA@AABBBBBBBBCBCCBCCCCCCDCDDDDEEDEEEFEEFFEXXXFFFFFFHGGHHHHHGHGHHHHIHIIHIIIIIIJJJKJKJ''''''''''('('''''(((((((((((())))))))))))???*****************++*+++++++,++,++,,,,,,,,,"+-B-Q-M-K-[DG.F/D/B/?0<0;08061412113387@=JCVJaQoX}oelrw|݂~ytohr\zVoPcJZEQ@I<=>=?=A>C>G>H?K?MR`?Q@T@T@C]@A:ABBBBBBBBCBCCCBCCCCCCDDDDDDDCEEEEFEFEEEFFEYXXFGGGGGHFHHHHHHHHHHIHIHIHIIIIIIIJIKKJJKK''''''''(''''('(('(((((((()))())))))))))))???************+**+++++++++++,+,,,+,,,,,,,,,,',-D2-Q-T-Q.aDN/L/I/H/E0B0@0=1;181613166;?AIHSP_Xm`{wnu|ݍщń~xrzcx\mVcPWJODG?A<><===?=A=C>F>H>L?N?P?RSd@VAZANB?6BBBBBBBBBBCBCBBCCCCCCDCCEDDEEEEEEFEEFEEFEFFFFYXXGGGGHGHGHHHHHHHHHIIIIIIIIIJIIJKJKKKKKKJ=<==============>>>>>>===>>??>>??>????>??@JJJ@???@?@@@@@@@@@@@@A@@A@AAA@AAAAAAAAABABBABBBB7@BVClBiDpOeDcDaD`E]E[DYEVFTFQFNFNIPMSSX[`dhpo|w՞ʚzs{mpfg`_[XURROQOTPVQXQ[Q^Q`QbRdRgSh]rSmTkTW`TTQUUUUUUUVVUVVVVVVVVVWWWWWWWWXXWXXXYWXXYYYXXYYYbccYZYZZZZZ[[Z[Z[Z[[[[[[[[[[\[\\\]\]]]]]]^'('''''''((((((((()(((()()))))))))))*))***@?@********+++++++++++++,,+,,,,,,,,,,-,---------*--71.X/`/mD[/X0V0U0R0P0M1J1H1E1B2C6F=JDNKUU]`emnzܣўĘrwjlbaZVSMMFHAER?U?W?Y?[?]So@d@OB?6BBBBBBBBBBBCCCCCDCDDDDDDDEEEEDFEEFEEFFFFFFFFFGGFYZYGHHHHHHIHHHIIIIIIIIIIIIIJJKJJJJKJLKLMKL'(''''('((((((((((()))))))))))))))))*)****@@@***+****++++++++,+,,+,,,,,,,,-,,-,-----.--..-...#*/yB/h/rDb0`0^0\0Y0W1U1R1P1M1J4M9PATHYP^YdclmuzܮШġywqkhb`XYPTIPCM?K=M=P>T?V?X?\@^@`@b@dSw@aABDBA?BBBBBCCBCCCCDDCDDCEDEEEEEEEEFEEEFFFFFFFFGFGGGHHH[YZHHHIIHHIHIIHIIIIIIJIJKJJKJJJKJKKLLLLMLL(((((((((((()(()()))))))))))))*))*******+*@@@*+++++++++,+,++,,,,,,,,,,,,-,,,--,-----/-/..///.-//.//]/|Di0g0f0c0b1_1]2[1X2U2U6X=[D_LcUh_nhtr||ܸвīxvmndh\cT^MZFWAU>U>X>[?^?`?b@e@g@iAkT}AN|B@8BBCCBBCBCCCCCCDDDCDDDEEEEEDEEEEEEFFFFFFFGFGFFHHGGHH[[[HHHIIIHIHIIIJIIJJKJKJKJJKKKLLKLLLKMLMML(((((((((((())()()))))))))))))**)*******++@?@+++++++++++,+,+,,,,,,,,,,,,,-----.--..-.././///////&,/dA0Eq0o0m0l1j1h1f1d2a1_3a8c@fGjPoZtdzmwлĴ|rxir`mWhPdIaC_?_>`>c?f?i?j@mAnApAtTtAA>CBABBBBCCCCCCCCEDCDDEDEEEEEEEEEEEEEEFFFGFFHGGGGGGHHHHH[[[IIIHIHIIIIIJJJJKKKJJJKKKKKKLLLLLLMMLMMM((((()()))()))())))))**)**)**)*******+*+++@@@+++++++++++,,,,,,,,,-,,,---,---.-..-....////////0//.00(-0oE|0w0v1t1s2r1o1m2k2j5m;pBrJvT{]gr|ļwm~dyZtSoKmFk@i?j?l@n?q@s@tAvByAyT`zB@:BBBCCCCCBCCDDDEDDDEEDEEEEFFEEFFEFFFFFFFGGGGGGHGHHHHHIH[[[IHIIIIIIIJJIIJJJKKKJKLLLLLKLLMMLLMMMMMM((((((()(())))))))))*))*************++*+++@@@++++++,,,,,,,,,,,,,,-------.--.......////////////00000)-0dQE~001~1|1{2y2w2v3v6y=|EMW`juzpf]V{NxGvAt?t?v?x@z@{A}@BBhURLCBCBBCCCCCCCCEDDEDDEEEEDEEEFEFFEFFFFFGFHGGGGHGHHHHHHHIHHI[[[IIIIJJIJJJJKJJJKKJKLKMLLLLLMLLMMMMMMMMM(((((())))))))))))**)))********+*+**++++++@@@+++,,+,,,,,,,,-,-,--,------.--..--..///0////0////00000111:@E`0111122338>FNXcmxĽ}si_WOIC@?@AAAABBJXUSPCCCCCCCDCCDDDDDEEEEEEEEEEEFFFFFFFFFGFGHGGHHHHHHHHHHHIHIII[[[IJIIJJJKKKJKKKKKKKKLLLMMMLMMMMMMMNMNMNN))()))))))))))))))**)******+*+***+++++++++@A@+,,,,,,,,,,,,,----------......././//////00/00000000001111@BEA91122233349@HQZep{èêɵukbYQJD@@@@ABBBhC>7UUVCCCDCCDDDDDDEEDEEEFEEEEFEFFFFFFFFGGGHGGHHHHHHHHHHIHIIIIII[[[IJIIKJJKKKKKKKLKLLLLLMLMMLMMMMMMNNNNNNN(())()))))**)))*)********+++++++*+++++++++@AA,,,,,,,,,-,-,------.-...//.-.//.//////0/0/000000100100111FEF%+1]11223434:AIR[fp|ÔΩϫոvlcZRJD@@@AABBBFKCA?UVVCDCDDDDCEDEDEEEEEEFFFEFFFFFGFFHGGHHFHGHHHHHHHHHIIIIIIIIII[\[IJKKJJJJKKKKLLLLLMLLMMMMMMMNNMMNNNNNNNN)))))))))***************+*++++++++++,+++++AAA,,,,,,-,,---------....././..///0////000000000000101100111FFF/02542َ2223444:AIR\fq|ʈЕ٫ڭwmcZRKE@AAABCBeC=8CCCVVWCCDCDDDDEDEEEEEEFEFFFFFFFFFFGGGGGHHHHHHHHHHHHIIIIIIIIJJIJ]\[JJKKKKKLKLLKMMLMMMLMMMMMMMMNNNNNMNNNONO))*)))*)****************+++++++++++++,+,,,AAA,,,,,,-,---------//..-/.////////0000000000100010111111111FGF222'+2qX2234444:AIR[fp|ֈەwmd[RKEAABBCCCBACBACCCWWWDDDEEDEEEEEEFEEFFFFFFGGFGGFGHHHGHHHHHHHIHIIIIIIIIIIJJJKJK\\]KJJLKLMLLMLLMMLMMMMMMNMNNMMNNNNNNONOOOO))))))**********+**+*+**+++++++++,+++,,,,,AAA,-,----------.-././/./////////00/000000000010111111112121FFF222112-02Ő344445:@HQZep|vlcZRJEBBBBBC`sC>:DCCDDCWWVEDDEEEEEEFEEFFEFFFGGFGGGGHGHGHHHHHHHHIIHIHIIIIIJJJJKIJKJK]]]MKLLLLMLLMMMLMMMMMMMMNNNNNNNNNOOOPOOPON)**)))******+**+*+++++++++++++,,+,,,,,,,,,BAB,-,,--.--.../.../././///0//000000000000100111111111211211FFG332333*,3^Q4445559?GOYdnztkbYQKEABBBBC>555559@GOXakt~yph_XRLFBBCCD;8DDDEEEEEEFEEEEEXXXFFFGFFGGGGHHGHGHHHIHHHIHHIIIIIJIJKJIKJJJJKKKKKLLKLLLLLLML___MNNMMMNNMNNNONNNOOOOOOPOPOPPOPPPQQQPQQQ***++++++++++,+++,,,,,,,,,,,,--,---------.CCD/.//./////00///000000000000111111112221222122222333343344III444445555555555*+5y55558>DLT]eox|tkd[UOICBCDDGGDBADEEEEEEEEFEEFFFYXXGGGFGGGGGHHHGHHHHHHIHIIIIIIIIIJIJJKJKKJKKKLKMLLMMMLLMMMMM___MMNMNNNNNNNNNOOOOPPOOOPPPPPPPPPPPQQPQQQ+++++++++++++,,+,,,,,,,,,,-----------..//.DDD///0////0000000000010101111111111111212222232243333444444IIH4444555555555553354455657EEEEFEFFFFFFFFFGGFHGGGHG[[[HHHHIIIIIIIIJIIJJJJJJJKJKKKKKKLLLMLLMMLMMMMMMNMMNMMNNNNNNa``OPOOPPPOPPPPPPPQPPQQQQQQQQQQQRRQSSRRSSR,+,,,,,,,,,,---,------.-.///////////0/0//0EED000000110111111111211211222222233332334444444454444555555III555555555566776767777777227HI88889;@EJPf[`eimpsu|vxxv|vtrplhd`kVRMIECDEEE:;EEEEEEFEEFFFGFFHHGGGHHGGHHH[[[HHHIHIIIIIIIJJIKJJJJKKKKLLKKLLLLLMMLMMMMMMMNMMNMNNNNNNNNN_``POPPPPPPPPPPPPPPPQQQQQQQQQRRRRSRSSRSSSR,,,,,,--,-----,----....-///////0///0000000EEE010111111111111122222222222332334444444444544555555555555III555565666767767777778877888.,88889:<@EJ`SX\`cg}iwkrkmmmrlxkifc_\YePLIECDEEEONEABFEFFEFFEFFFFFGGGHHHGHHHHHIH[Z[IIIIIIIIIJJIKJJJJJKKKLKKLLLKMMLMLMMMMNMMMNNNNNNNNNNNNNOOO`a`PPPPPPPQPPPPQPPQQQQQQQRQQRRRQRSSRSSSSSS,,,-,,-------.-...-/...///////0/////000000DEE010111111111211121222223334343433444444555555555555555555III655665676767777778887787888658<=8889::=@DZLPTWZz]s_mahbdddicnau`|^[XUQ`KHDCDEDEE:AFEEFFFGFFGGGGGGHHGHHHHIIHIIIIIIIIIIJ[]\KKJKKKKKKLKLMLLLMLLMLMMMMMMMNMMNNNNNNNNOOOOPOOPPPPPPPPPPPbbbQQQQQQQQQQRRRRRSSRRRRSSSSSSTSSTTSTTTTTT-----..///..//.//0///0//000000011100100111FFF121212122232333433444444445445455555555555555555556666767JKJ7777778878888888888989999999::9:;;:;52;;;<;<=Oj?a@[AUCNDIEEDEJDOEVE^CfCmBvCCVDEDEEEdZF>AFFFFFGGFHGHFHGGHHGHHHHIHIIHIIIJIIJIJ\\]JJKKKKKKKLLLMMKMLLMMMMMMMNMNNMNNNNNNOONOPOOOPPOOPPPPPPPQPbbbQQQQQQQRQRSSRRRSSQSSSSSSSTSSTSSSTTTTTTT-.-......//./0///0//0000000000110100111121FFF222222232343444344444444454455555555555555555555656666776KKK777787888888888888999999::9:;:;;;::;85;KT;<<<<n>f?^>W?P?J@D@@@AEBJASBZBbBjCsC{CVEEEEFF<@FFFFGFGGGHGGGHGHHHIHHHHHIIIIIIJIIJJIJKJ\\]KJKLKKLLLLLLMLMMMMMMMNNNMNMNNMNNNNNONOOPOOOOOPPPPQPQQPPQQbbbQQQQRQRQRRRSRRRSSSSSSSSSSTSSTSTTTTTTTUT-./...///////0/000000000000111110111111211GFF222222322444444444544444554555555555555555655666766777777LKL878888888888889899999::9::9:9;;;:;;;;;;60;q<<<<=Q|=t>l?d?]?V?P@J@D@@A@FBKARBYB`BhCpCyDWDEEEEVOFBCFFGFGGGHGGHHHHHHHHIHIIIIIIIJIIJJJKJJJKJ]]]KLLLLLLLLLMMLMMMNMNMNNMNNNMNNNOONPONOONPPPPPPPQPQQPPQQQQQcccRQQQRRRRSSSSRSSSSSSSSSTTSTTTTTTTTTTTUVU.//////0/00/00/000000000000110111111212211GFF332343434443444444555555555555555555555555676766777777877KKL788888889888989999:9:::::::;:;;;;;;;;<<:8r>k?c?\@U?O@J@E@AB@FBLBRBXC_CgDoDvD~XEEEFnF;@GGGGGGGHHHHHHHHHHHHHHIHIIIIIIJIJJJJJJKJKKJ^^]LMLLLLLLMMMMMMMMMNNMNNNNNNMNNOPOOPOOPPOPPPPQPPPQPPPQQPQQQccbSQRSRSRSSSSSSSSSSSTTSTTTSTTTTTUUTVUUVUV//////0/000000/010001001011111111211212222FGG433434344444444545555555555555555555565566766766777777778LKL8888899999899999::9;:;;:;:;;<;;<<<<<<<<<<<71<_====Qv>o?h?a?Z@T@N@JAD@ABBFCKBQCWC^DeEmCtE{XEEFߋFJHGDEGHFFHGHHHHGHHHHHHHIIHIIIIIIIJJJIKJJJKKKLLK^^^MLMMLMMMMMMMNNNNNNMNNNNNNONOOPPOPPPPPPPPPPPPPQQQQQQQQQRQQcbcRRRRSSSSSSSSSSSTSSSTTTTTUTTUUTUUUVUVVVU/0///00/0000000000111111111111111222222232GGH332444444445454555555555555555555655665766766777777778888LLL888888999999999;::;:;;;;;;;<;;<<<<<<<<<<<<<;<===|==>Rt?m?f?`?Y@S@N@H@DABBBFBKCPCVC]DdEjErEzXEFF_G?Rr?k?e@^@X@TANAIBFBBBBFCKCPCUD\DbDiEpEwXFFxFCEHEFHGGGGGHHHHHHIIIIIIIIIIIIJIJKJJKKKKKKLKLKLLLML_^^MMMNMMMNMMNMNNMONNOONPPNONOPPPPPPPPQQPPPPQQQQQQQQRQRRRSRRdddSSRSSSSSSTSTTTTTTTTTTTTTUUTUTUVVVVUVVVV//0000000000001100111212211222222222333343HIH444454445555555555555555555556567776776777877887888888998MLL98999999::;;;:;;:;;;;;<;;<<<<<<<<<<<==<==<===>==;8>k?>Ro@i@c@]@X@RBNBIBECBCCGCJCPDUD[EaDhEnFuXFFnUF?DGHGHFHHHHHHHIHHIIIIIIIIIJJIJKJJKJKKLLKKLLLKMMLLL___MMMMNMMNNNNNNNNNOOPOOPOOOPOPPPPPPPPPPQQQPQQQQRQQRRRRRRRRRdddSSSSSSTSTTTSTTTTTTUUTUUUUVVVTUVUUVVVVVV000000100110111111112121222222222333443444IHI445455555555555555555555556676677667777777787887888888889MML9999999;;;::;;:;;;<;;<<<<<<<<<<<<<<=========>>>=<7>I`?y?Rn?h@b@]@WARANBIBFBCCCFCKDQDUD[EaEgFlEsXFiF>DGGHGHGHHHHHHHIIIIHIIIIIJIJJJKJKJJKKKLKLLLKMMLMLMMLL___MMNMNNNNNNNNOOONOOPOOOPOPPPPPPPPPQQPQQQQQQQQQRRRRQRRSRRSSdddSTSSTTTTTTTTTTTTUUUUTVUUUUUVVUVVVVVVWVV000000110111111111111121222223233343343444HII444455555555555555555566666676777777877888888888988999999MMM:9:::9;;;;;;<;;<;<;<<<<<<<<=<<=<<<=<===>=>>>>?>?>>>=5?^@Sk@g@a@\BWBRBMCICFBCCCFDKDODTEYE_EeElFrYF_NGBEHGGHGHHIIHIHIIIIIIIIIJJKJJKJKKKLKLKKLKLKMMLMMMMMMMM___NNMNNNNNNOONPOOOOOPPPPPPPPPQQPPQQQQPQQRQQQRRQRSRSRSSSSSSSdddSTSSTSTTTTTTTUTVUTVUUVVVUUUVVVVVVWVVWWWEEEFEEFEEFEFFFFEFFFFFFFFGFFGHGGHHHHHHIIIIISSSIIIIIIIIIIIIIIIIIIIIJIJIJKJKKKKJKKKKKKKLLLLLLMMLLLMMMMMMMXWWNMNNNNNNONOOPOOPPOOPPOPPPPPOPPQPPQQPQPRRQQRRQRRRRRRQNRWbS]zStToTkUgUcV_U\VXVVVVYW]WaXeXjXoXsXyYcvYQWY[Y[Z[[[Z[[[[[Z[[[[\[[\]]\]\]]]]]]]^^^___^^___________hhh_`_`__```a`_ba`aaabbbbbbbbbbbbbccccccbccccccccdcdddddddddmmldeeeeeeeefeefefgffefggggggfggghgghhgghh000111111111221222222332332333333444454545III555555555555555555667767767777777788888888888998998999:::NOM::;;:;;;;<;;<<<<<<<<<=<=<=<==<======>>=?>?????????@@@?=5@eSkAdA_BZBUBRCMCICFCDDEGEKEOETFYF^FcGjGjZe]HDGHHHHHHHHIHIHIIIIJIIJJJJJKKJKKKKKKLLLLMLLMLMMMMMMMNMNNM__`OONNONNONPOOPOOPOPPPPPQPPQQQQQQQQQQQQQRRRRSRRSSSSSSTSSTTTeeeTTTTTTUUTVVUVUUVVUVVVVVVWVVVVWWWVWWVWWW010111111111111222222232334334444444445545III555555555555555655677777777777787887887898888999999:9:;::NNN;::;;;;;<;;;<<;<<<=<<=<<<<=====>=>>>>>>??????????@@?@@?=@UYTaAdB^BZBUBQCMCJDGDDEEHEKEOETFXF]FbGjHV[PXHHHHIHHIIIIIIIIIIIIJJJJJJJJKKJKKLKLMLMLMMMLMMMMMMMMNNNNNN```NNNOOOPPOPOPPPPPPPPPPPPQQQQQQQQSRRQRRRQSSRSSSSSSSSSTSTTTTeeeTTTUTTUUUTVVVUUVUVVVVVVVVVWWWWWWWWWWWWW111111112222222222323334443444444444545555III555555555555655766767777777777888888888888998999999:;:::;NOO;;;;;<;;<<<<<<<<<<<<<==<====>=>>>>>=?>????????@?@@@@@@@A@RITMAdB]BXCUBPCMCIDFDEEEHEKEPFSFWG\GcH`HHH[XZHHHHHHIIHIIIIJJJJJJJIKJKKKKKLLLMMMMMLMMMMMMMMNMMMNNNNNNNN```NOOOOPPPPPPPPPPPQPQQQQQQQQQQQQQRRRRRRQRSRSSSSSSSTSSTTTTTTeeeTTUUUVUTVUVVUVVVVVVVVWVVVWVWWVWWWWVWWWW112112212222222223334334444444445555555555III555555556666666776777787778788888888999999999:99:99;::;;;OOO;;<<<<<<<<<<<<<=<<======>>=>>>?????????@@?@@@@@@@@AAAAAAATSUA?BXB^BXCUCQCNDJDGDEEEHEKEOFSFWF]HbHzOH>GZ[[HHIIIIIIIIIIJJJJKKKJJKJKKLKLMKMMLMMMMMMMMMNNNMNNNNMNNNONN```NPOPPPPPPPPPQPQPQQQQQQQQQQQRRRRSRRSSRSSSSSSSTSSSSTSTTTTTTeeeTUVUVVUUUVUVVVVVVVVVWWWWWWWWWVWWWXXWXXX112222222223433333434444444544555555555555III555565666676776777777778888888888989999999999:::;:;;:;;;;OOO;<<<<<<<<<<<<<<=<====>===>>>>??>????????@@@@@@@@A@AAAABBAUUUA9BIlB\CXCTCQDMDKEHEFEEHEKFOFSGXG]GXHBGHGH[[[HHIIIIIIJJIIJJKKKJKKKKLKLLLLLLMMKMMMMMMNNMNNNNNNNNNONOOOOaa`OOOPPPPPPQPQQPPQQQQQQQQQQRRRSRSSSRSSSSSTSTSSTTSTTTTTTTUTTfeeVTVUUUUVUVVVVVWVVVWWVWWWWWWWWWXWWXXXWXX212222322233434343444444445555555555555555III555666677777777877787878888888998999999:99;:::;9;;;;;;;;;OOO<<<<<<<<<<=<<=<====>=?>>?>>???????????@@@@A@@A@AABAABABBBVUUBABA:CRCYDSEPEMEJEGEFFFHFKFOGSHXH[GhLHAGHIH[Z[IIIIIIJIJJJKJKJKKKKKKLLKLLLMLLMMMMMMMNMNNMNNNNNNONOOOOOOOaaaPPPPPPPPPQPQQQPQQQQQQQRRRRSRRRRRSSSSTSSSTSSTTTTTTTTTTUVUUggfVVVUVUVVVVVVVVWWVWWWWWWWWWWWXXXYXWXWXXX222222333343434444444445455555555555555555JJI756666677777877777888888889988999999:99;:;::;;;:;;;;;;<;=????????????@@@@@@A@@BAAABAABABBABBBUUUCBCB=BF\DVDSEPEMEJEGEFFFIFLHOHSHXHRH?GIHHIIH[[[IIIIJJJJJJKKKKKKLKLLLMLMLMMMMMMMNNNMMNNNNNNNNOOOOOOOPOPPOaabQPPQQPQQQQQQQQQQQRSQRRQRRSSSSSSSSSTSTSTTTTTTTTUUTUUUUUUUVfffVVVVVVWVVWVVVWWWWWWWWWWWXWWXWXXXXXXXYYY222322344443444444444555555555555555555555JJJ76666777777778878888888898899999999::99;;;::;;;;;;;<;<<<==>>>?>>?????????@@?@@@A@@A@BAABABBABBBBBBBCVUVCCCCCCC9EMEUDPEMEJEHEFFGHGKGOHTHVHYJHDHIIIIII[[\JIIJJJKKKKKKKKKLMLMMMLMMMMMMMMMNNNNNNNNNNNONONOOOOOOPOPPOabbQPPQQQQQQQQQQRRQRSRRRRRSRSSTSTSSSTSSTSTTTTTTTTTTTVUUVUUVUgfgVVVVVVVWVVVWWWWWWWWWWWXWWXYXXXYXXXYYYXY322432444444455444554555555555555555556666JJK7777778777878888888888889999999:9::;;;;;:;;;;;;;;<;<<<<<===>>>>>>?>?????????@@@@@@@A@@AABABBBBBBBBCBCCBCVVVCCCDDDD@EFPEQEPFMEKFHFFFFIHMHOHTHNI>HIIIIIIJIJ\\\JKJKKKKKKKKLKLLLMLMMMMMMMMMMNMNNNNNNNNNONOOOOPNOOOOPPPPPPbbbPPQPQQQRQRQQRRQRRRSSRSRSSSSSSSSSSTTTTTTTTTTUTUTUVUUVUUVVVgggVVVVVVWVVWWVWWWWWWWWWYXXXYXXXYYXXYYXYYY333443444444454555555555555555555555565766KKK777777788788888888988998999:::;;:::;:;;;;:;;;;;;<<<<<<<<>>>??>???>??????@@@@@@@@@ABABAABABABBBBBCBCCCCCCCVVVDDDEEEDEEE:EJEQFNFKFIFGGGIHMHPHQHNIIEIIIIIIIKJI\][JJKKKKLLLKLLLMKMMMMMMMMMNMMNNNNNNNNNOONPONOOOPOPPPPPPPQQPbabQQQQQQQQRSRRSSQRSSSSSSSSSTSTTSTSTTTTTTTTUTUUVVTUVUTVUVVVVhggVVVVVWWWWWWWWWWWWWWWWYXXXXXXYXYYYYYYYYY434444544445455555555555555555556656666766KJK777777878888888888989999:9::::;::;;;;;;;;;;<<<<<<<<<<<<<=PPQ=======????>????????@?@?@@@@@@AAABBBABAAABBBBBBCCBCCCCCDCWVWDDEDEDEEEECEEFFNFNFKFJGHHHJHLHPILI?HIIIIJIJJIKIJ]]\KKKKKKKLKLLLMMLMMMMMMNMNNNNMNNNNNONNNOONOOOPOPPPPPQPPPQPPbbcQQQQRQQRRRRQSSSSSSSSSSSSSTSTTTTTTTTTTTUUUUUVUUUVVUVVVVVVVgggVVVWWWWWWWWWXWWYXWXXXXXXXXYXYXYYYYYYYYY444454455545555555555555555665666667677777KLK788888888888889989999:99:::;:::;:;;;<;<;<<<<<<<<<<<=<====PQQ===>>??????>?@???@@@@@@@A@@@AAABBBAAABBBBBBCBBBCCCCCDCDDCWVVDEEEEEEEEEFEE=FHzFMFKGJGGHHJHMHNIFIIGIJIIJJJKJKKKJ]]]MKKLLLLLMMMMMMMMMMMMMNNNNNNNNNNOOOOOPNPOPPPPPPPPQPQQPQQQQcbcQQRRRQRRRRSRSSSSSSSSSSTSTSTTTTUTTUTTTUUVUVVVUVUVVVVVVVVVVghhWWWWWWWWWXXWYXWXYYYXYXYWYYYYYYYYYYYYZYY444445455555555555555555655676676767777777LKL7888888988898999999:::;:;;:;;;;;;;<<;;<<<<<<<<<<<<<===>==QPQ>>>???>>????@???@@@@@@@@@@AAAAABBBBBBBBBBBBBCCCCCCCDDCDEDWWWEDEEEEFFEFEEFEFF@GKFLGJGGHHJIMIrJIAIIJJJJKKJJJJJKKK^]]LLMMMMMKMMMMMMMMMMMNMNNNNONONOPONOOOOPPPPPPPQPQPPQQQQQQQQcccRRRSRQSRRSSSSSSSSSSSSTTTTSTTUTTUTUTUUUUUVUVVVVVVVVVVWVWWVghhWWWWWWWWXXXYXXXXXYXYYYYYYYYYYYYYYZZYZZZ444545555555555555555555757767776777777887LLL8888889898999999:9::::;:;:;;;;;;;<;<<<<<<<<<<=<=======>>=RQP?>?>?????@?@@?@@@@@A@AA@AAABAABBBBBCBBCBBCCCCCCDDDDDDDDEEXXXEEEFEEEFFFFFFFFF?GHhHLHJHIHHKIKIAIJIJIJJJJJKJKKKKLKK^^^LLMMMLMMMMMMMMMNNNMNNNNNONOOONOOOPPPPPPPPPPPPPPPQQQQQRRQRccbRSRRSRSSSTSSTSSTSSTTTTTTTTTUUTVVUUVUUUVUVUVVVVVVWWVVWWWWWhhhWWWWWWWXXXXXYXYXWXYYYYYYYYYYYYZZZZZZZZY545555555555555555665665757767777777788888LLL888998999999999:;:::9;;;;;;<;;;;<<<<<<<<<<<=<======>>>>>?QRQ??????@@@@@@@@@A@@ABBAABBAABAABBBCBBCCCCCCCCCDCDEDEEEEEEEXXXEFEFEFFFFGFFGFGGFGG>HJHJHHIIJIaJICIJJJKJJJKJKKKKKKLLL^^^MLLMMLMNNMMMNNNNNNNNNONOOOOPONOPOPPPPPPQPQPQPQQQQQQRRQSRRdcdRSRSSSSSSSSSTTSTTSTTTTTTTTUVUUVUVUVVUVTVVUVVVVVWWWWWWVWWWhhhWWWXXWXWXWXXYYXYXYYXYYYZYYYYZYZZZZZZZZZ555555555555555555665767767777788777778888LLL88999899999:9:::;:;::;;;;;;<<;<<<<<<<<<=<<========>?>>>>>RRR???@?@@?@@@@@@@@AAAABBABBBBCBBCCBCCBCCCCCCDDCCDDDDDEEEFEEXXXFFEFFFGFGGFGHFHHHGHCHIZHJIHIIJI?JIKJIJJJJKKKKKKKKLLKLL__^MMMMMMNMMMNNNNNNNNNOOOPOOOOPOPPPOPPPPPPQQQQQQQQQQQQRRRRRSddcSRSSSSSSTSSSSTTTTTTTTTTTTUTUUVVUUUVUVVUVVVWWVVVVWWVWWWWWWhhhWXXXXXXYXYXYYYYYYYYYYYYZZYZZZYZZZZZZZZZ555555555555555665767777777787778888888888LLL899999999:::;;::;:;;;;;;<;;<<<<<<<<<<=<<=<=======>>?>=>??RRS???@?@@@@@@@AAAABBBBABBBBBBCCBCCCCCCCCCDDCEDDDDEEEEEEFEFEXXXFFFFFFGGHGGHGGGHHHIIHH=HIIIIIUIJEIJJJJKKJKKLLLLLLLLLLML___MMMMMMNMNNNNNNNNNOOOOOOOPPOPPPPPPPPPQPQPQQQQQQQQRQRRRSRSSdddSSSSSSSTTTTTTTTTTTTTTUUUUVUUUUVVVVVVVVVVVWWWVWVWWWWWWWXXWhihXXWXYYXYYYYYYYYYZYZYZZYYYYZZZYZZZZZZZ[Z555555555555666777677777777787878888888888MML99999:999;;:;;;;;;;;<<<<<<<<<<<<<<<<===>==>>>>>>>?>???@??RRR@??@@?@@@AA@ABABBABBBBBBCBCBCCCCCCCCDDDEEDEEDEEEEFEFEFEFFXYYGGGHGGGGGHGHHHHHHHHHHHEIIXIIyJIDIJJJJJJKKKLLLLLLLLMMLLMMM__`NMMMNNNNNNNNNNONOPOOPPPOPPPPPPPQPQPQQQQQQQRQRQSRRRSSRSSSSdddTSSSTSTTTTTTTTTTUTUVUUTUUVVUVVVVVVVVVVVVVWWWWWWWWWWWWWXWXijiYXYYYXYYXYYYYZYZYYZYYZZZZYZZZZZZZ[[Z[[[555555555566767776767777787888888888899898MMM999::99;:;::;;;;;<;<<<<<<<<<<==<=======>>>>>=?>=?????@?@?SSS@@@@@@AAAAABABABBBBBBCCCCCCCCCCCCDCCEEDEEDEEEEEEEEEFFFFFFYYYHFGGGGGHGHHHHHHHIIIIIIIIIHIJEJJJKJKJKKKKKKKMMLLMMMLMMLMMM___NMNNNNNNNNONNOONPPPOPPPPPPPQPPQQPQQQQQQRRRRRRRSRRSRSSSSSSdddTSTTSTTTTTTTTTTUUTUVUUUVVVUVVVVVVVVVWVWWWWWWWWWWWWWXXXXXXihhYYYXYXYYYYYYYYYZZYZYZZZZZZZZZZZ[Z[[Z[\\IIIIIIIJIJIJKJKKKKKKKKKKKKLLLLLLLMLLMMMMMMWWWNNMNNNNNNOONONNNOPOPPPOOPOPPOPPQPPQPQQQQQQQQQRRRRRRSSRSSS]]]SSSSTSTTUUUUUUUUUUVUUVVVVVVVWVVWWWVWXWWXXXXXXXXXXXYYXYZYYcbbYZYZZ[Z[[[[[[Z[Z[[[[[[[[\\\\\]\\]]]]]^]]_]^^^_^__________hhh__```_```aa`a``abababbbbbcabacbbbbbccccccccccccdcddddddddmmnedeeeeeeefeffefffffgfggggggggghgghhghghhhhhhhihhiihiiiiiiqqqijiijjjijiijjjjjikjjkkkkkkkkjlkklkkkkkk655665676767777777787788888888989999999:99NMN::::;;;;;<;<;<<<<;<<<<<<<=<=<====>>=>>>?>>????@??@?@@?@@@SSSA@@ABAABBBABBBBBBBBCCCCCCCCCDCDDEEEEDEEEEEEEEFFFFFFFFGFGGYZYGHGHHHIIHHHHHHIIIIIIIKJJKIJKKKKKKKKLKKLLMMMMLMMMMMMMNMNNM``_NNNNOOOPOOPOPPOPPPPPPPPPQQQQQQQQQRQQRSRRRRRQRSSRSSSSSSSSTedeTSTTTTTUUUUUTUTTUVVUUVVVVVVVWVWVVWWVWWWWWWWWWXWXXXXXXYYYYjjjYYYYYYYZYYYZZZYZZZZZZZZZZZZZZZ[[[[\\\\\665665777777787878888888888889999999::9::9MON;;;;;;<;<<;;<<<<<<<<<<=<==<===>>>>>>>>>?????????@??@@@@@@TSSBAABBBBBBBBBBBBBCCBCCDCCDCEDDDEDEEEEEEEEEFEEFFFFFFFGGHHHGZ[ZHHHHHHHIHIHHIIIIIIJKIKKJJJKKKKKKKLLKMKLMMMLMMMMNNMMMNMNNN``_NOONONPPPPPPPPPPPPQQQQQPQQQQQQRRQRRQRRRRRSSRSSSSSSTSTTTTTeeeTTTTUTUTUVUUUUVVVUVVVVVVVVVVVVWWVWWWWWWWWWXXWWXXYWXXXYYYYjjjYYYYZYZZZZZYZZZZZZZZZZ[ZZ\Z[[\[\[\\[\]\7667667778777788788888889989998999:::;;:::NNN;;;;;;<;;<<<<<<<<<=<<=======>>>>?????????????@@@@@@@@AA@ATTTBBABBBBBBBBCCBCCCCCCDEDCEEEDEDDEEEEEEFEFFFFFFFGFGGGHGGHHH[[[HHHHIHIHIHIIJIJJJIKKJJKKKKKKLLLLMLMLMLLMMMMMMMMNMNMMNNNNN```NOPOOOPPPPPPPPPPQPQPQQQQQQQQRQRRRRQQSSSSSSSSSSTSSSSTSTTTTeeeUUTUUUUVTUUUVUVVVVVVVWVVWVVWWWWWWWWWXXWXXWXXXXYXXXXYYYYYYjjiYYYYZZZZZZZZZZZZZZ[[[Z[Z[\Z\\\\]\\\\\\\776J777777877888888888889999999999:9:;;;;;;OOO;<;<;<<<<<<<=<<<<<=======>=>?>?>?>????@????@@@@@@@@ABABAATUUABBBBBBBBBBCCCCCCCDDDEEDEEEEEEEFEEFEFFEFEFFGFHGGGFHHHGHHH[[[IHHHIIIIIJIJJJJJJJKJKKKKLKLLMLMLLMLMMMMMMMNNMNNNNNNNNNNNNaa`OPPPOPPPPPPPPQPPPQQQQQQQQRQRRRSQSRRSSSSSSSSSSTSSSSTTTTTTTeeeUTUVUUUVVUVUVVUVVWVVVWVVWWWWWWWWWWWWXWXXYXWXXXYXYYYYYYYYYjjjYYZYZZYZZZZZZZZZZZ[[\[Z[\[[\\\[\]\]\]]]777 777787878888888899988999999:9:;::;:;;;;OOO<<<<<;<<<<<<=<<======>==>>>??>???????@??@@@@@@@@AA@AAAAABUUTBBBBBCCCCCCCCCCDDDDDDEDEEEEEEEFEEFFFFFFFGFFGGHGGHGHHHHIHH[[[HHIIIIIIIJJJJKJJJKJKKKLKLLLMLMLMLMLMMMMMNMNMNNNNNNNPNOOOOaa`PPOPPPPPPQQPQQQQQQQQQQRRRRRSRSRRRSSSSSSSSSSSSTTSTTTTTTUUTeffUUUVUUUVVVVVWVVVVVWVVWWVWVWWWXWXWWXXXXXYXXXYWXYYYYYYYYZYYjijYZZZZZZZZZZZZZZZZ[[\\\]\]\\]]]]]]]]]]]]Z778o88888888889899899899::9:;::;;:;;;<;=>>=?=>>??????????@?@@@@@@@A@AABBBBBBBUUUBCCCCCCCCCCCDDDDDEDEEEDEEEEEFEFEFFFFFFFGGGGGGHHGHHHHHIHHH[[[HIIIIIJIJJJJJJJKKKLKKLMLLMLMMMMMMMNMNNMNNNNMNNNNNNOOPOPOOabbPPPPPQPPPPQQQQQQRQQRRQQQRRRSSSSSSSSSSSSSSSTTTTTTTUTTTUUUUffeUVUUVVVVVVVVVVVWWVWWWWVWWWWWWXXWXXWXYXXYYYYYYYYYYYYZYYZZYkkjZZZZZZZZZ[ZZ\[[\[Z[\\[\]]\]\]]]]]]]]]]]878888988889999999::::::9::;:;;;;;;;<;;POO<<<<=<<========>>=?>>?>>>>?>?????@@?@@@@@@AAAABBBBBABBBBBVUVCCBCCCCDCDCDEDDDEEDEEEEEEEEEFEFFFFFGGHFGHGHHGHHHHHHHHIIIH[[[JIIIJIIJJKKKKKKLKKKLMLLLMLLMMMMMMMMMNNNNNMNNNNONOOOPOOOOObbbPPPPQPQQQQQQQQQQQQRRRSSRQSSSSSSSSSSTTSSTTTTTTTTTTTTUTTUUUffgUVVVVVVVVVVVVVWWWWWWWWWWXWWXYXYWYYYYYXYXYXYYYYYYYYYZZZZZYjjjZZZZZZ[ZZ[ZZ\\\\[\[\][]]]]]]]]]]]]]]s898W889999999999:::;:::::;;;;<;;;;<<>>>>>??????????@@@@@@A@AAAAAABBBBBBCBBBBBVVUCCCCDCDDDDDDEEEEEEEEFFFEFFEFFFFFFFHFGGGHHHHHHHHHIIHIIIIII[[[JJJKJJKKJJKKKKKLLKLLMMLMMMLMMMMNMMNMNNNNNNNONOPOOOOPPOPPPbbbQQQQQQQQQQQQQQQRQRRRRSSRSSSSSSSSTSSTTTTTTTTTTUTTUUTUUUUUVffgVVVVVVWVVVWVWWWWWVWWWWWXXXXXYXYXXWYXXYYYYYYZYYZYYZYYYZZZZkkkZZZZZZ[[Z[Z[[\\[\\\\\\]]\]]]]]]]^]]]9999999:9::::::;;;;;;;;;<<<<<<<<>?>???>?????@@@@@@?@@@@@@AAABAAABBBBBBBBBBCCVVVCCCCDDEDEEEDEEEEEEEEEFFFFFFFGFGHGGFGFGHHGHHHHHHHIIHIIIJII\[\IJKKJKLKJLKKLKLLMLLMLMMMMMMNMMNNNNNNONNOONNPNOPOPPPPPPPPPbbbPPPQQQQQRQRQRRRRRSSRSSSRSSSSSTTTTTTSTSTTTTTTTUUTUVUUVUVVVgggVVVVVVVWVVWVWWVWWWXWWYWXYXXXYYYYXXXXYYYYZYYYYZYZZZZZZZZZZkkkZZ[ZZ\\\\][\\[[\][]]\]]]]]]]]]]^],9999:9:::;::;;;;;;<;;<;<<<<<<<=<>>>>>>?=?>>???@?@@@?@?@@@@AA@AABABABBACBBBCBCCCCCCWWWDDDCDEEEEEEEEFEFEEEEEFFFFFFFGFGHGHGHHHHHHHHHHHIIIIIIIIJIJ]]\JKIKKKLLKLLLLKLLMMMMLMMMMMNNNNNNNNNNOOOOONOONPOOPPPPPPPPQbbcPPQQQQRQQRQSRRQSSRSSSSSSSTSSSSTTTTTTTTTTTTUUUUUUUVUVVUVVVgggVVWWVWWVWWWWWWWWXWWXXYWXXYXYXYYYYYYYYYYYYYYZZZYZZYZZZZZ[ZkkkZZ[[[\]\\]]\]\\\]\]]]]]^]]^]]^E:9;;::;;:;;;;<<;<<<;<<<<<<<<<>>>?>?=>>>>????@?@@@@@@@@@AA@BABABBBBBBBBCBBCCCCCCDCCWWVEDDDDEEEEEEFFFEFEFFFFFFFFGFGGGHHGHHHHHHHHIIIIIIIIIIKIJJKJ\]]JKKKKKKLKLMMMLMMMMMMMMNMMNNNNNNNNNOOOONOOOPOPPPPPQQQQQQPQbbcQQQRRQRRRRRSRSSSSSSSSSSSSSSTTTTTTTTTTTTTUUVVUUUVUVVVVUVVVghgVVWWWVWWWWWWWWWXXXXXYXXWXXYYYYYYYYYYYYYYZZZZYZZZZZZZZZ[Z[lkkZ[Z\\\]\\]\\]]\]]\]]^^]]]]^3;;;Y<;;;<;<;<<<<<<<<<====PQQ===>>>?>?????????@@@?@@@A@@@B@ABABABBBBCBBCBBCBCCCCCDCDDCWWWDEEEEEEEEEEEEFFFFEGFFGGGGHGHHGHHGHIHHHIIIIIIIIIIJJJJJKKJK\]\LKLLLLLLMLLMMMMMMMMNNNMNNNNNNNNNNOPNNOOOOPPPPPPPQPPQPQPQQbbcRRRRSSQSRQRRSSSSSSSSTTSTTTSTTTTTTUTTUUTUVUVUVVUVVVVVVVWVVgggVWWWWWWWWWXWXXWXXXYXWWYXYYYYYYYYYYYYZZYZZZZZZZZZZZZ[[Z[[[jkk[\[\]\\\]]\]]]]]]]]]^]]]<<;;<>>>?>????????@@@@@@@@@@A@ABAABAABBBBBBCCBCBCCCCCDCDDDEDDWXXEEEEEFEFFFFFFFFGFGGHGGGGHHGHHHIHHHHHIIIIIIJJIJIIKJJJKKKKK^]]MLLMLMMLMMMMMMMMNNNNNNNMNNNOONOOOPPOOOPPPPPPQPPPQQQQQQQQQbccRQRRQSRSSSSSSSSTSSTSSSSSTTTTTTTUUVUUUUUUVUVVVVVVVVVVVVWVVhghWWWWWWWWXXWWXXXXXXYYXYYYYYYYYYYZYZYYZZYZZYZZZZZZZZ[\\Z[[Zlkl\\\\\]]\]]\]]]]]]]=<<< <==K<======>=PQQ?>=???@??@????@@@@@@@A@AABBAAABBBBBBBBCCCCCCCCCCDCDDDDDEEXXWEEFEFFFFFFFFFFFGGHGGHHGHHHHHHHHHIIIIIIIIJIIKJJJJKJKKKKKKK^^^MLMMLMMMMMMMNMMNMNNNMNNNNPNPOOOPNPPOPPPPPPQPPQQPQQQQQQQQQccdRQSSSRSSRSSSSSSTTSTTTTTTTTTTUTUVUVUUVUUVVUVVUVVVVVVWVWWWWhhhWWWXXWXXXXXXXXXYXYXYYYYYYYYYYYZZZYZZYZZZZZZZZZZZZZ[[[\\Z]mlk][\\\]]]]o]]^,?(@ % $$$++* !!!""""""""""#"######&&&---###$$$%%%%%%%%%&&&&&&&&&*)*111'''((()()))))))*********.-.445+*+,,,-,----...//////0/0333:::000222222333444444555555888>?>556777888@ Y $$$+++ ""!""""""############'''...###%%%%%%&%%&&&&&&'&&&&'***111''')(())))))******+***++...555+++-,----.-.//////000000333:::100222333444544555555555888@@?666888888999 L !! !!$$$+++ !!""""""""#########$###'''...$$$%%%%%&&&&&'&'''''''''+++222'''))))))******++*++++++/..555,,+---...//////000000001444;;;111333444454555555555565999@@@777888999999;::  ! !!!!!!!!!$$%+,+!!!"""##########$$$$$$$$'''/..$$$%%%&&&&&&''''''''''('+++222((()))********+++++++++,///666,,,...////0/000000110111544;;;222444454555555555666666:::@@@777999999:;:;;;<;<= ! !!!!!!!!!!!!$%%,,,!!!"""#######$#$$$$$$$$$(((///$$$&&&&&&&'&''''''((((((+++222(((********++++++,,,,,,,///676---///0//000000111111111555<<<333445555555555666766777:::AAA8889:9:::;;;<<<<<< ! $$$+++ """"""""#"###########'''...$##%%%%%&&&&&&&'''''''''+++222''')))*)*******+++++++++///666---...//////000000011011555<<<322444444444454565666667:::AAA77799::::;;;;;;<;;+**+++++++++++,,,+...444+,,------.-.......././..111776///000001111111221222222555:::333444444454555555666666:9:???887999999::::::;;;;;;<<;???DDD===>>>>>>>?>???@@@AAAAAACCDIIIBBBDDDDDEEEEEEEFFF$$$$$$$$$%%%%%%%%%(((///%%%&&&''''''''((((((((((++,222(((******++++++,,+,,,,,,//0665,,,......///////0/000100444;;;222333443444545555566667::9@@@777888888:99::::;:;;;;;;>>?EEE==<>>>???????@@A@@!!!!!!"!!"""""""""%&&---"""$$#$$$$$$%%%%%%%%%%%%)))000%&%''''''(((((()))))))))-,-344*))+++,,+,,,,-,----.-...222999///001111111222333444444777>>>444555666777878888888998<=>>?>?"!!""""""""""""#""&&&---##"$$$%%$%%%%%%%%%&&&&&&)))001&&&((((((()())))))******---444***,,,,,,,-----/..//////323999000111222232333444444554888>>>454776777888888999999:::=>>DDD;;;==<===>>=??????"""""""""##"######'&&&--#"$#%#%#&#&#&#&#*&%1-'"(#)#)")"*"*"*!".$)4++ ,! -!!-!"."#/#$/#%/$)3'1:.'0$*2%*2&,3'-4(.5)05)05)48,:>325*47,58,58-69-79.9:/9;/=>5EEE;;;===>>>??????@@@"""""""""#########!'&.5$1%4%7%;&?&C'G'K*S1^'[(b)i)o*v*}++.5+--.//003:1234|4v5q5l5i8j@_6]8Y8V9S9Q:O;M;L?FEK<<:>>>??????@@@@@@"""##"########$###'&s.3$6%<%@&F&K'R'Y'a*k1y'{))**+++/5,-.//0004:134455559@w7r8l8g9b:^;Z'C'I'P'W+a2n(o)z**++++/6,./000114;24455556~:|An7i9c9_;[;W;T>???@@@@AABBABBB#########$$$$$$$$$((('//G$&&1&5'9'>'D(J(P+Z2g(i*s*~*++,,/7-//001115<3555567~7x;vAh8d9_:[;W?>@@@@@@BABBBBCCB"""""#############'''...##&)%0&3&8'='C'I+S2`'a)k*v**+++/6-.//00014<2444466w7r:pAb7^:Y:U;Q;O;H<<=:@A>GGG>>>@?@@@@AAAABBBBB---.--.....././///111766)/.@0005091=2A2G2L5U;`3b4k4u555669?899:::;>>?@@wAsCpIdBaC\DYEVESEJFxFG=JJJOOOHHHJJJKKKKKKKLKLLL'''''''''(((((((((+++221)((***+*/+2,6,;,@/I6U-U._.i/t//004;23444566:@7889:};t;l;g>fEZ=V>R?O?L@GAAA8ABAEDEJKKCCCEDEEEEEFFGGFGHG$$$$$$%$$%%%%%%%%%)))000&%%$''*'((((+)/)3)8-@4L)K+U,^,i-u--.29/11123447>4567}7t8k8c9_<_DR:N5778u8l8c9\:Y=YDM;JTEGA???N@@;@@@ABAEEEKKKBCBDDDEEEFFFFFFGGG%%%%%%&&&&&&'&'&''***111'''((())) ))W,*2*0*,+./5:+4-<-C.M/Y0f0u03:035777658@68z8m9c9[;U;O;L?OEBABBBBBBBBEFFLLMDDDEEEFFFGFFHHHHHH&&&&&&&&''''''''''+++222((()))******$**D-+=+:,9/<6/,.//4/;0C0N1\1l9GENSVWURLIH9p9c9Z:Q;K@DGM>I@IAA;AB@BBBCCCCCCDDDGHHNNMEEEFGGHHGHHHIIHIII%%%&&&&&&'&'''''''+++222''')))))*******'*+5-+H+L/M6@-=.8/3/01/66EB[Rwdht|zqibtN^DMP?Dh@@8AAABBBBBBCDCDDDGGGMNMEEEFGGHGGHHHIHHIJI010111111122222222555:::233444444454555665)46F6`9_?T8Q9L9G:A:@=HLVah{zٕ‹vxccWQKFEDHELFRGVJ]OgHXJI@KKJKKKKKKLLMMMMMMMPPPUUUOOOPPPQQQQQQRRRSSS***+*+++++++,,,,,,///566,,,......//////0//./0/10\4j;\1Y3T3O4J4K=SL^^qvקsj][MPBJ?M@SAYB]DdKkCGYED?EEEFFFGFGHGGHHHHHHKKKRRRJJJKKKLLKMLMMMMNNN'(((((((())())))))---444***+++++,,,,,,,---...$+/gB2v9j/f1b1]1Z4^AfRpe{ֺtubjR`D[>Z>`?e?iCsI`A>6BCBCBCDDCEDEFEEFFEFFFJJJPPPGGGIIIJJJKKJLLLLLL(((())))))))******---444*+*,,,,,,,-----...///.//(/2m9~0x1u1q2q8wHZn}jXxIq?n?r@v@{DyJMSAA>CCCDDDEEEFFEFFFGGGGGGKKJPQQHHHJJJKKKLLLLMMMMM(())))))**********...445+++,,,--,---.../////0/00+03\I:0223;GFFMMMDDDFFFGGFHHHHHHIIIIIIJJJMMMSTTLKKMMMNNNNNNOOOPPP***+*+++++++,,,,,,///666---//////000000111111111555=<<013875߿559GYl{iXKBCC\cD>99>>?FRarnaULKL[\MHIMMMPPPUUUOOOPPPQQQQQQRRRRSRTSTTTTWWW[[[UUUVWWWXXXXXXXXYYY...//////0/0000000544:;;2223334444444455556667769:9@@@777888//9cd9:;DQasyxq^SIEFG<>>444556666-,787:DRceow{|zungcQHCCEIHEBCFEFFFFJIJPPPGHGIIIJJJKJJKKLLLLMMMMMMPPPWVVNNOPPPPQPQQQQQQRRR,,,--,---...//////333999000111222222333444444555888>>>455667777218NQ899?666777888888/,99::?JGwMiR]UVYVeSsOMNBDEЬE@BFEEGGFHHHHHHKKKQQQIIIKKKLLKMMMMMMNNNNNNOONRRRXXXPPPQQQRQRSRRSSSSST.--...//////000000333:::100222333444544555555555988@??666888888998759AD:;;>Ew=hA[ENGGIGUFdDtEKCEEoaF=@GGGHGGHHHHHHKLLRRRJJJLLLMLLMMMNNMNNNNOOPOORRSXYXPPPRQRSSSSSSTTSTTT...//.0//000000000444;;;111343444444555555555555999@@@7678889999:9:;:3/;g<S?G?@BANB]BmELDFF<@GFGHGHHHHIIIIIILLMSSSJJKMMLMMMNNNNNNOOOPPOPPPSSSYYYQQQSRSSSSTSSTTTTTT./////000010111111444;;;222444554555555555556666:::@@@77799999::;:;;;;9<<;<<@Fl=^?Q@G@BCBNC[CiGzMEF^RFADHHHHHHIIIIIIJJJMMMSTSLLLMMMNNNNNNOOOPOOPPPPPPSSSYYZRRRSSSSSSTTTUTUUUV///000000111111111555<<<333555555555555665777777:::AAA878999::;;;;<;<<<<82\@Q@GABDCMCYDfGvMEjG;BHHHHHHHHIIIIJJJKJJNNNTTTLLLNNNNNNOOOPPOPPPQPQQQQTTTZZZRRRSTSTTTTTTUUUVVV//////000000011101545<<<222444444444444566666676:::AAA77799:::::;;;;;;;;<;<;5Y?O@FABDBLCWDcGtM}EOIGCEGGGHHHHHHIIIJJJKKJNNNTTTLLLMMMNMNOONOOOPOPPPPQQPTTTZZZRRRSSSSSSTTTUUUUVU9::::::::;;;;;;<<>>>>>>>>??@@@@@@AAAACDDIIIBBBCDDDDDEEEEEEFFFFGFE?GSiJyOjH`IWKOKLLMUM^MhPyUfODLPQPQQQQQQRQRSSSSTTUTTWWW\\[UUUWVVXWWXXXXXYYYYYYYZZY\\\aaa[[[\\\]]]]]]^]^^^^444444455555665766:9:@@@777888899999:::;;:;;;;;;>>?EEE===>>>??????@@@AA@ABAAABB8EaKeCZEQEJFFHHPHYHcKgRPQJHIKKKLLKMMMMMMNNNOOOOOORRRXXXPPPRRRRSRSSSSSSTTTTUUUUUXXX]]]VUVWWWXXXXXXXYYYYY111111222323434444778>>>444555667777787888888999<<=CDC:::<<<<=<======>>>??????B>CM[I\AVCNCHCDFFMFUF`I~SPFOGGGIIIJJIKKKKKKLLLMMMMMMPPPVVVNNOPPPPPPQQQQQQSRRSSSSSSVVV\[[TTTVUVVVVVWVWWWWWW222222333444444555888>>>445677777888888899999:9:>>>DDD;;;<<====>>>??>@??@@@@@ADDDI>KMBWCODIEEGFMGWHVKCJPPPHHHJJJKKKLKLMMLMMMNNNNNNQQQWWWOOOQPQQQQQQRRRRSSSTTTTSSVVV\\\UUUVVVVVVWWWWWWXXX222333444555555555888>>>556777888888999999:::;:;>>>EEE;<;===>>>??????@@@A@AAAAEEEKHKCFBRDPEIEFGGNHUHhKKCJQQQIJIKKKKLKMLMMMMNNNNNNNNNRQRXXXPOPQQQRRRSSSSSSTSTTTTTTTWWW]]]UUUWWVWWWWXXXXXYYY333444544555555555888@@?766888888999999;::;;;;;;??>EEE<<<>>=??????@@@A@ABBABBBEEEKLKB8CJEPEIFFHHOHOH=HLKKRRRIJJLLLLMLMMMNMNNNNOOOOOORSRXYXPPPQQQRRRSSSSSSTTTTTTTUUXXX^^]VUUWWWWWWXXXXYYYYY444444555555555555999@@@777888989999:::;;;<<<<<=>???@@@@A@ABBBBBCCCCCCGGFMMMEDEF=FHqGKGHIHKI=IIJJMMMSTTLLLMMMNNNNNNNOOOPPPPPPQPSSSZYZQQRSSSTTSTTTTTTUUUVVUVVVYYY^^^VVVXXXYYXYYYYZYZZZ555555555656767777:::AAA788999:::;;;<;<<<<<<<===@AAGGG>>>@@@@@AABABBBCCCCCCCDDGHGNNNEEEGGFH>HIHIIINIJGJKKKNNOUUULLLNMNNNNOOOPPOPPPQQPQQQTTTZZZRRRTSSTTTTTTUUUVUVVVVVVVYYY___WWWYYYYYYYYYZZZZZZ444444554565666676:::@A@777999:::::;;;;;;<<<<=<<@@AGGG>>>@??A@@AAABBBBBBCCCDDDGGGMMMEDEFFFGAGHgHHHJAIJJJJJKNNNTTTLKLMMMNMNOOOOOPPPOPPPPPPTSTZZZRRQSSSSSTTTUUTUUUUVVVVVVXYY__^WWWXXXXYXYYYYYYYZY>>>>?>@??@@@AA@AAACDDIIIBBBDDDDDDEEEEEEFFFFGFGGGJJJOOOHHHJJIJJJKKKLKKMLLMMMMMMPPPUUUOOOPPPQQQQNQRMRSSSSTTTTTWWW[[\UUUVVVWWWXXXXXXYYYYYYZZZ\\\aaa[[[\\\\\\]]]^^^^^^_^^_^_aaafee``_aaaaaaaaaabbbbb888999::::;:;;;;;;>>>EEE=<=>>>>?>????@@AAAAAAABBDEDKKKCCCEEDEEEFFEGFGGGGHHHHHHKKKRQRIIJKKKLLLLLMMMMNNNOOOOOORRRXXXPPPRRRRRRSSSSSSTTTUUUUUUXXW]]]VVUXWWXXXXXXYXYYYYYYYZZZ]]]bbb[[[\\\\\\]]]^]]^^^666777878888888999=<=CDD;::<<<<<<===>>>?????????CCCIJJAAABBCCCCDDDEEEEEEFEEFFFIJJPPQGGGIIIJJJKKJKKLLLLMMMMMMPPPVVVNOOPPPPPPQQQQQQRRRSSSSSSVVV\\[TTTUVUVVVWVVWWWWWWXXXXXX[Z[aa`YXYZZZZZZ[[[\\\\\\777e888888999999:::>>>DDD;;;<<=====>>??????@@@@@@DDDJKKABBCCCDDEEEEEFFFFFGGGGGGKKKQQQHHHJJJKKKLKLMMMMMMNNNNNNQQQWXWOPOQQPQQQQRRRSRSSSSSSTSSVWV]\\UUUVVVWVWWWWXXWXXXXYYYYY[\\aaaYYY[ZZ[[[\\\]]]]]]88888899999::;:;;;>>>EEE;<;===>>>??????@@@A@@AAAEEEKKKBBBDDDEEEFFEFFFFFGHHGHHHKKKQQQIIIKKKKLLLLMMMMNMNNNNONNRRRXXXPPPQQQQRQSSSSSSTSTTTTTTTWWW]]]UUUVVVWWWWWWXXWXYXYYYYYY\\\aaaZYY[[[\\\]]]]]]]^]#899(:9::::;;;;;;???EEE<<<>>>??????@@@@@@BAABBBEEEKKKCCCEEEEEEFFFGFGHHGHHHHHIKLLRRRJJJLKLLMMMMMNNNNNNOOOPOOSSSXXXPPPRQRRRSSSSTSSTTTUTTUUTXXX^^^VVUWWWWWWXWXYXYYYYYYYYYY\\\baaZZZ\\\]]]]]]]]]W:;:';;;<;<<<=>?@?@?@A@@BAABBBCCCCCCGGFMMMDEDFFFGGGHHGHHHIHHIJIJJIMNMTTTLLLMMMNNNNNNOOOPPOPPPPPPSSSYYZRQRSSSSSSTTTUUTUUUUVVVVVYYY^^^VWVXXXYYYYYYYYYZZZZZZZZZ]]^ccc\\[]]]]]](0` B !!!)))!!!"""""""""###""")))((($$$%%%%%%&&&&&&'''///(((((()))))*******000000,,,---..-///00/100988111222333444555444::::::777888[ ` ! !!!)))!!!""""""#########**))()$$$%%%&&&&&&'''(((000((())))))***+*+***111000,,,---///00/000111999122333444555555444;;;;;;777898999 7 ! !!!!"""***"""""""#####$#$###***)))%%$&&&&&&''''''(((010()))))***+++++++++221111---.//000000111222:::333444555555555665<<<<<<888999;::;<;Y  !!!***!!!""""""#########***)))$$$%&&&&&&'''''(((010(()*))******++++++222111--.///00/000101222:::333444444555666666<<=<<<888:::;;;<;<%%%%%%%%%&&%&&&...'&&'''(((((()))(((///...***++++++,,,,,,---555...//.///000000000676766333444555556666788???899999999:::;;;;;;AAAAAA>>>???@@@@AA'''''''''((((((///)())))*)****+++***000///,,,------......///666000010111121222222999899554666766777888:::@@@::::::<;<<<<======CCCCCC@@@AAAABBBBB !!!!!!"!"""***"""###$$$$$$$%%$$$+++***&&&''''((((()))***222***+++,++,,,------444333///101111222333444;<<444666666777888888???>?>;;;<<<===>>>!""""""""###$##&,+$#$#%#%#&#%",(+''!(")")!*!+!&3)+, - !.!#/"#/"+5)+5((1$*2%,3&.4'/5(05(8=026)47+58+69,79-8:.@@8@@@<<<>>>???@@?""""""######$$b,0$/%2%5&9&=&A-L,Q(S)Z*a*h*o,w3,-./0/6~5v1q3l4g5a5]6_>U7R8O9M9K:I;IA@@<<==???@@?@A@#""######$$$%$Y-0%6%=&D&L'U&^-n,y()**+,4,./00066345557?v8n8g9a:\;W;JB@A8>>>@?@@@@BBA######$$$$$$%%%-,%+&6&;'B'I'R.a-k)t*++,-5-/00107745556}8y?k8d9^;X?|?s@nGbB\CWCSDLEDE;JJJJKJHHHIIIJJJKKK$$$%%%%%%&&&&''///$'')''(*(.)4):/G/O+W,e-t-.07012234:9568y8n9d:bBU;P@?T??9EEFFFFBBBCCCDDEEEF$$$%%%%%%&&&'''///'''((k)(*))-)20>/E+K,Y-h.y/08112344:967|8o8d9[;ZCMA??@3?@@FFFFFFBBCDDDEEEFFF%%%%%%&&&&&&'''///'(('((!)).)-**+060<,A-M.[/l/08112443::78p8d:Z;RB?E@@=BB@BBCBBBIIIIIIEEEFGGHHHIII%&%&&&''&'''(((000(())))***$**B.+B+E2>15-1//4/=2O?mT\gnokb[Mg=T9I;B;><=@EM?K@CqA@7BBBBBCCCCJIIIIIFFFGGGHHHIII++++++,,,--,---555..././///000".0B0X6P7G3A4:467@JTjlxtbcOLAB?@CAICPJ]DREDa?h@qHbA?6BBCCCCDDEEEEFEELLLLKKHHHJJIKKKLLL((())))))***+++333+++,,,---..-///-./245v51~1|5F`}pWE{?{@BJOXCA>DEDEEEFFFGGGGGGMMMLMMIJJKLLMMMMMM))))))******+++344,,,---...///000///+16kQ5127JdΦu\G?ACiJE>CDDEEEFFFGGGHHHHHHNNNMNNKKKLLMMMMNNN)))***+**+++,,,444,-,...///000000000667,06247Jc܂t\GABCEEKJIEEEFFFGGGHHHHHHIHIOOOOOOLLLMMMNNNOOO****+++++,,,-,-455--.///000100111001777/27TL456F^{oXFBCnE=:LLLEFFFGGHHHIHIIIIJJJPPPPPPMMMNNNOOOPPP***++++++,,,---555...///000111111111888888')455@VoeQDBD?>EDDMLLFFFGHHHHHIIIJJJJJKQQQQQQMMMNONPOPQPP333333444545666===777888889999::::::@@@?@@77W?G?@EBTBgIIEhG;AHHHIIIIIJKKKRRRLLLMMNNNNOOOPPPPPPVUUUUURSSTTSTTTUUU////0/000111222:::333444444555665666==<<<<888:::;;;;;<81>>???@@@@@@?;AJZCwIfDWELFFIHUHdMyM|[KBHLMLMMMNNNOOOPPPWWWQQQRRRSSSTTTTTUTTUZZZZZZWWVXXXYYYZZY666666777888:::@@@::::::;;<<<<======CCCCCC@@@AAAABABBBDDDB8E_KfFXGMGIKJVJdPhPGNMLMNNNOOOPPPQQQRRRXXXSSSTTTUUUUVVVVVWWW\[\[[[YYYZZZ[[[[[[011111222333444;<<454655667777888877???>??;;;<<<===>>>????<@JQHYASBICDFEQE\LkRKDJHHHJIJKKJLLLMMMNMNTUUOOOPPPPPPQRQRRRRRRXXXWWXTTUVVUVVVWWW222333444555555=<=666777888989:99:::@@@@@@<<<>>=????@?@@@BBBH=IKCSEJEFHGSGRMALMMMJJJKKKLMLNMMNNNOOOWWVPPPQQQRRRSSSTSTSSSYYYYYYVVVWWWWWWXXX333444555555665>>>777888988999;;;;;;AAA@@@===????@@@@@AAACCCJHJDBDOEKEGIHQHWININNNNKKKLMMNMMNNNOOOPPPWWWQQQRRRSSSTSTTTTTTTZZZYZZVVVWWWXXXYYY444555555565777???888889:9:;;;;<<;;;BBBAAA>>>@??@@AABBBBBCCCKKKD;EHxFKFHJHLI=HOOOOOOLLLMMMNNNOOOPPPQQQXWWQRRSSSSTTTTTUUUUUU[[[ZZZWWWXXXYYYYYY555555555766888@??8889:9;;:;;;<<<<<GJHIJILJIGJPPPPPPMMMNNNOOOPPPQQPQQQYXXSSSTSSTTTUUUVVUVVV[[[ZZZXWXYYYZZYZZZ555555666777888@@@898:::;;;<<<<<<<=>>??????@@@GGFBBACCCCCCDDDEEEEEEKKJKJJHHHJIIJJJKKKLLLMMMTSSNNOOPOPLPQLQRSRSSSXXXWWWUUUVVVWWWXWXXXXZZZ___ZZZ[[[\\\]]\]]]]]]bbbbbb___``````aba777888888999:::BBB<;;=<====>>>??????FEFFFFBBBDCDEEEEFEFFFGGHOOOIIIJIJKKKLLLMMMMMMRSRRSSPPPQQQQQRRRRSSSTTT[Z[UUUVVVWWWWWWXXXXXX]]]]]]YYYZ[[[\[\]]878888998999;;;CCC<<;=====>?????????FFGFFFBCBDDDEEEFFFGGGHHHOOOIIIJJJLLLMLMMMMMMMSSSSSSPPPQQQRRRSSSTSSTTT[[[VVUVVVWWWWWXXXXXYX^]^]]]ZZZ[[\\]\]]]888"999999:;:<<=>?>?@@?@@@AAAGGGGGFCDCEEEFFFGGGHHHIIIPPPJJJKKKMMMMNMNNNNNNTTTTTTPPQRRRSSSTTTTTTUUU\\\VVVWWWWWXXXXXYYYYY^^^]]^[ZZ\\\]]]]]]?999<;;:<;;<<?>?@@@@@BAABBBBBBIIIIIIEEEGGGHHHHHIIIIKKKRRRLLMMMMNNNOONPPPPPPUUUUUVRRRTSSTTTUUUVVUWWW]]]WWWXXXYYYYYYZZZYYY_____`\\]]]]:( @ ^ &&&"""""""#####)))%%%%%%&&&&&&---))))))******010------/./00/666222333555555;:;888888t \ '''###"""######***&&&&&&&'&'''---*)*****+++++111...///000000677444554555555<<<989999;;;r!!!""""""((($$$$$$%$$%%%+++''''''((()((///++++++,,,,,,333000111111222989566666767777>>>;:;<<<===&&&''&''',--))))))******000,,,-,,---...443000100111222888656666777888>>>;;;:;;<<<===BCB@@@AAABBB!!!""""""%(($#$#%#%"!,('#(")")!%/'!,"!,!"-"$.#,4*)1&*1'-3(/4)6:036,47,68-79/?@;<<====>?>"""#""##B)+m%-j%/k&4k&8o-Cm)Em)Km*Sn*Zr1ep-ip-no/qk0qj6vb2s\3sW5uR5uR;yL8wH8wF9xE;{EA_==:???@@@""######@*+&6&@'K'Y-n*}**+1./0074555d;[;T:;??3FFFCCCDDDEEE%%%&&&&&&---())!)).),*05,=-M/d051354:8x8d9U;OAD=@?@@AAA?GGGDEEEEFGGG&&&''''''---**) )*T.*8+61.0.:0M0i:BKLFB~8c9R;F;EB?B@BzBA7BBCIIIFFFGGGHHH'''((((((///++++++ +,=,I3;/30088SSguwl]mEN;B<>?CMALBB;CCBEDEJJKHHHIIIJJJ,-,---...344000000+01H72`8X5L5C8RSu͙i^HH@KCVIdFMkHF?IIIJJJOOOMMMNNNOOO((((())))///,+,,,,---!*.U5w1h0ge?sFeC@8DDDEEEFFFLMLIJJKJJLLL)))******110------///,.0=:622Dkœ{U@AGQ\EB?FFFGGGHHHNMNKLKMLMNNN******+++111...///000100*/7e44Ci{UBB|IA_oOCDJKJHGHHHIIIJJJKKKRQROOOOOOQQQ000111222888665666777888>>>01;ll:=Pr}_JHJ?>OOPMMMNMNOOPQQQVVVSTTUTTUUU,,,---...555111111333444:::656/.77K>@GAbHFÂG>BHHHIIIOOOMMMMNNOOOPPPUUUSSSSSTTUT011111222988666666666787>>>:::<<<;8=CL=yDcAKABHD`K}HdSIBFJJJKKKQQQOOOOPPQQQQQQWWWUUUUUUVVV666777888>>>;;;::;<<<===BBC@@@AAABBB@7C[IdGOGHMJbOdMBJNNNOOOQQQVVVTSTTTTUVUVVV[[[YYYZZZ[[[111333444:::666777888999??@<<<===>>??=?FHFVCLCEJFWLZOJEIKKJLLLMMMSSSQQPQQQRRRSSSXXXVVVVVVWWW333455555::;888888999;;;AAA>>>???@@@AAAF=GJEMEFLHNMBMKLLMMMNNNONOUTURRRSSSTTTTTTZZZWWWWWWXXY555555556<<<999999;;;<<>>;;;<<<=====>DCDAAABBBCCCDDDKKJH@HItIJJKBKRRROOOPPOQQQRQQWWWUUTUUUVVVWWW\\\YYZZZZ[Z[;;;<<<===BCC@@@AAABBBCCCIIIGGFGGGIIIJJJOOOMNMNJNOKOQQQVVVSTTUTTVVUWVV[[[YYYZZZ[[[[[[```^^^^^^_`_777888999@@?=<<===>>>???FFFCCCDDDEEEFFFMLLJJIKKKLLLMMMSSSPPQQQQRRRSSSXXXVVVVVVWWWXXX]]]ZZZ[[[\]\888H99:;;;AAA>>>???@@@AAAGGGEEEFFEGGGHHHNNNLKKLMLNNNOOOTUTRRRSRRTTSTTTZZZWWWWWWXYYYYY^^^\\\]]]]]]\;;;H<<'K,^)m*,/-/344{5o9a9W9P;D@b>?9AAA$$$$%%"*)(0(>)M.f+},.2015767{CCAAA@CCC((((((&--E+++1-=1Q/e03645:;9z;i@Y@N@CBfFG?EFFGGG%%%%%%***((*(+-.;,L-j030268}7c9U>H=A>@@5FFFDDDFFF&&%&&&+++%)*4+*5*30,6.M1t;DFA:c8M:E??A@@TBBqưN>EaEA9EFFGHGLMLKKKMMM******///...///000-06–2>pO@GEDFFEGGGIIIOOOMMMOOO...///44444444466534;[Y8<^nKFruLDCKLLLLLOOOSSSRRRSSS---.//444333333665:::,,88DasviQDõG>?LKLKKKMLMNONSSSRRRSSS...///444333444555:::428FJ9yAM=?JFuHpG@EFCfGREGPKiMXPMHKNOOTTSSSSTTTUUUZZZXXXYZZ222444999777888:::???===???@6BNFOCENJSL@JKLKMMMRRRQQQRRRTTTXXXVVWXXW444555:9:999999;;<@@@?>>@@@CBCGBGJEHKKLLMKMMMMNOOTSTSSSSSSUUUZZYWWWYYY666777<<<;;;<<<>>>CCCAAACCCFFFJBJIwHJJNENPPPOPOQQQVVVUUUVVVWWW[[[ZYY[[[:::;;;@@@@?@@@@BBBGGGFFEGGGJJJNNNLHLNJNRSRTTTTSSUUUYYYYYYYYY[ZZ_^_]]]^^^888999?>>===>>>@@AFFFDDDFFFIIILLLKKKMMMQQQRRRRQRSSSXXXWWWWWWYYY]]][[[]]]999;;;@@@?@?@A@BBBHHHFFFHHHJKKNONMMMONOSSSTTTSSSTTUYYYXXXYYYZZZ^^^]]]^^^AAAAAAAAAAAAAAAAAAAAAAAA(  ~#########'''%%%)))***+++../...333444555999999###%'''& '&#+(")%&.(&.'(/(.3,/3,5716819:3>>=>>> "".&&Q&+N'0Q*9P)?T-KT-RT/UQ4YJ3YG8\C8]A:b@?H>?=!$$,('(6)L,l+/0266:f;S=CBKBB?'&&**k+++5/O.v32499g>R?DAEF:FFF%%%())!))0)/3,K2<>9a7J=@@AA=FFEFFF***..-%-.W6/N292Qk]C?AQDJrGF=KKKLLK)))-----.#+0d27{FBmFC;HHGLLLMMM+++///100,.2KF5:|JEZbIDBKKKOOOPPP...333444666-.98T|`EJ@@LLLOOOSSSSSS...222344555769??8=b@D]EFSPKGHMMMOOOSSSSSS333777888:::>>>:2>UBYBDWK^K@GPQQRRRTTTXXXXXW333877888:::???>=?C@DNEHOLLLMJLQQQRRRTTTXXXXXX666:::;;;===BBBBBBG>GI{IKKOFOOPPTTTUUUWWWZZZZZZ999>>>???AAAFFFFFFKKKLHLOKOSSSSSSWWWXXXZZZ]]]]]]999t>>>???BBBFFFFFFKKKMMMOOOSSSSSSWWWXXXYYY]]]]]]}AAAAAAAAAAAAAAAADisplayCAL-3.1.0.0/DisplayCAL/theme/icons/DisplayCAL-scripting-client.icns0000644000076500000000000036224012647526530025734 0ustar devwheel00000000000000icnsic08) jP ftypjp2 jp2 Ojp2hihdrcolr"cdefݲjp2cOQ2R \@@HHPHHPHHPHHPHHP OS ]@@HHPHHPHHPHHPHHPS ]@@HHPHHPHHPHHPHHPS ]@@HHPHHPHHPHHPHHPy+35͏U Ƣ\nJ8Lͮޒ"pEz#\ dy+35͏U Ƣ\nJ8ULV05x\kl?Gzfù{yyP%Eyk%b:;ƃE`A-5Nz!Tc>h7AГ uY;syG.d'B*<^s֒nu 4 "~F)IKC͉5!y#eeNi9 m2tk=]qK n)FQXe !--)]?me>7AГ u2ԮQxa%Mmh  vFbF)IKC͉5!y#eeN 3ԍc؁ 2OͰňl,wJn)F;u$1;.iۑxPH(,p6qe>x7AГ u2ԮQxa"I sR"~6Ё[eFAmF)IKC͉5!y#e~niϳipnrn܃8@n)F;u$1;.|`;vHhVVl@/ϼF}Q6EoւqL 7*~ />sGߔ`@Py؄AV?m _MA$"tVU<D'V e|⯈Efh$B}1:Ka˼"CUbP Թy^+Wdu0aI`E!Ӥb|<'X5jXy}8!6T|r$:>0wkW#{X?ʂԘ&xa| 8#u9jA@N@Sx荙DA~r cYq?0@kn?tU*PFM>J\%>yy# j vՕp;?Y. +jjI= 0b5aQ~=+5u0(qB49r!RFm_MA$"tVU<D'V e|& 1 z_ЖۡVtMe? =sy?Du7;F++B`;BJk#`6B1Wd 'j~J\%>yy# j,]1֭M[Xk+P- @ǥ2t$ I˴Ax *D%8$S%)@-3jw8dM Vogϼn}s;49bh2nϗ#yi e6oLhMV9fv_G^C\:u(RʢK!jihD۷ql>ݮrc ȿL#Qd %$uaXdU3N_Q0a2ŻC󐋙q),q~V?*2,+}jdJX@_1fn8Q~ZqӾs Vwm7s2`Ҥ5fo 2"aoDZ{1ul}F}靚ԁ$n,=^QK6 Bڝ`|{>&1?oC%T?<\ѥ|!m{isrI#tDNͮ F#BԖ7DeӮ_Y_i1&M_yq&9w)xJC}23D~C[ rם:{hAPڪ^J޸6Z :juGCDDVKJv+Ab7M[S.kL c)VNU.>֬iϿ14NxDP[Gԛ۩->4ں{ߔ8ϱ5DVE!L¯ugƵT*:{hM\GRcݶrc ȿ~\z+3fJ]6) ce@j?_7:8T3}8ô+vE,#bFn NSi[ח)OVkk6T[!Z'&47oNkIS^ZB۷1>ݪrc ȿUoZ\êY2"7v{}@yHL \OAU\:okڗ d\4q ={duQb4Ru/'m ikk7,J } 8uT"Ifh] CĶd& bM2!qzȫcDvɦ50 oj=9c;OV!1]Gj$r^<ɎB)#0q\ HFrX4?AjiJtpU>c/DVkbژ7ڪEDw6e`_NDF~-,(n=1SeLW@hqܴWg,'6n:T5WeZA[燓wuhݼp hO/zUrg?.{Mk7ǎIP9:|T%OD4y k喼oaxGf2UXi&a_f^{'z>c{s$=ha=@/.{.dUti/@AĤ4ABx,'T8e6~#W"ssU]`3wLd1/oɉl85kZX)qDu!~Ǐİ<ϙYM>R -ݦJ>ab`]=Az5 P7j[AfZ4EC;~|+D6vڏYHl~ ~&53Qs0ÙowF'H,'繇tac\0%"Y(TТ7 n`]Z Ȁ$.O65h!a07p9I}Vԉ%VKJv+Ab7M[S.kL c)VNU-ͳl9"m.`s{;{IGi!&\@kO} '.Im-$,Շ^R~Z=YçL -i TKn ߼Lz5P/lJcѳpOQ1YhiGX 7GO4B[|ܥ}.)a,$=PӘGo13e sV(힪ufsZuʘ3i/ 6Fxڱb ]}knz]%x3͜>OE4JПϼ}6 PA.!2?Cm]׳ʴs42r 4ьw⮀v)u^6xH5ATBVS ?Xy]PKh L wAwn:E\?@wirF׀wVw49#R^d V& ?Bmo|>PekRz"b2gP NY$N:v٘x"lLJR'BֱޘBMh.-O'vߓZ&|냣"?(n<>擹"._Iݚ'G|1nruiW1fjnĚm?r83PdW #$vܜ#m`K/_>|rJI9ݮv,iln\2cJOPS#XNDo#NZϖrzW>P5> =#,t^Fp{Wy/@jWp2PeUI|4k3idhFXkpO~uӷW>KUu/*p=Q ʒ-i#  @:ްpZgL0 O1<:9^[<%aEB)5(jꥮx//YJ$AE~47\>r-^)heRp[6hN!Y,< L}mחoH$/@}z/I>Ks- Wq]x&h!1!O`ĥVe~\jPSF 9ORx IDUc%NCӓ3/Q?RZ6lFqy"k IAR@|ꔥ'.9^Ʒ.?O87;Sc:sg:+:nnm6} 0/3%qGG0! \.#4\iVu^ؓ擑p6F40_z%,yxmC:.( %B?B*k'!nci!&hsf^|vy1g\y 3UH bo͜5r {z'.D>ȝ|(-ܢ0Ge`<.@67 m>ɜ& Bc šswC?{:ϸpaďrTr6 K[KцcydS_?]O'\KD¦y4`-9uwwf[ef.h]TvpݬwԞYw&B-:.a&0]eǝ\{ :_׬'E:)UtrXr ;<:cT8iˑÁov~v7#gUVu&ߟOU6>Z5ԑִGiLVjNE lG(RDEl^x _$X]d14`O8G]9>]BquS0? *]U Me,k74®J3Bdh‰,~ Cf]rA .1Ն(G@݇Rɓ~uM%eXqEtVjs➞mJtnFh}GKJ!}|}ſn߉ۖLT Ż⅗0מԂ 瞪n['Xzݤ% `%O[e-Np2c!L4L3ϐYM^R eV} gb$wV6C ğA<ȳ}(Zpz1G&z':uW6gnOL`wfEz:eXq)B܏5|'.`+\FskC0fYxO(!brA1ov p"%K诰%iIݱ: p( ;WR)ʹu*2"@[iQ-bۃoBS9Ֆ0e|<[q!"U$t aBjVHm[ol=0CNA l2 CFݞ36HaܩN=$s6VU?tuX divc F%83\A^c‘QBAIhYIwP2Nj-i GΝ h:jZhRSZDv,+#;:7FG{#>۩R $o|\$ADT)ie2A2K6|Zc~MAK/&k6H:)$/ ܀!Kr^Z'u͹x~WCEi5۫w9^sc "-326uCZ>g #8v HT/KSRlG_#A}r%:QYSХ.|vIqqR )`jEIgH7ԷVSNP[u%itmSD6$Gʚ)3)p<4z$ .D(ԗ"ovC \ísC2Dh| Khd> (Tjzt SvFX%11|˹vj~$y۸AYiPerc^dߕ`Q dZLnIy7镓zt`~lv[gk#Efi,%''nJ,0Ⱥ1D,Gds5h|]G2 r$C:UІa>0ZNtt7 PN':1TވF~FۗE$ 5X8,iI Z Gmͤ\qJ:m@lٺnDxXc2(!Uɒk "ܮܥל{?2THjɿذQ5 3S¶evZJR%&PekRz"b2gP NYw\a嬘g- P<1k-cz,j.C\+#;- &N- ʭEX#;06wKٳ-mR`Zj8Q| @xmYu@A/ k9<ك4(J'ztm# Uaa)?( ;g2ԧQ =yo2HMF'8:*buTy#LftQ/fpӖ`$Yz s躧p)Ї~(AQa%t{5= zZy?w';6QH^RinZcJuZ%]2TFO;YbSyWGg'HFp*!^FEχ3gGʘr~:xF~-:Ԗ;}_גF+SWկG8El(u#dLR\_ܯ\IջB/ɱeWM&s=dKڇ̔'.LI6Cm7\;z[3Nm[f{(= H> +H\+1V,M#C>.p@_/D)^m#Y]P ;/=Co`㗫ʨiO`?"}Lߵ5%)@q3n(5,&HkxӏAĠPo+;;yt@ƹP.|X]02bŜۡ&O{(dd8ϼۓקwt?5  |uzy>`gy?ӸfdO"t % :-I{m hm9y" 0uIEsA#~:c(|L؍_'=t 6 uvn]J t _&{bs&)VS6(˻]P!o-tN6hm?"+!?kgHW p ,\s+1ֵb[J 7>Ϧ]}ńXb|KG}-slQ2>"':eSG]JHj#>dB:J>*L=?3к^iC>z7QЖִkj (Hy(^nRkv|9֢~_~7v25г]"2qURѳ-" gjP@nϻsʢ'w r&0:Yu1QQ$#K׻֮W[u6pޝz\`H 7#E谨=BPtQ{[t/!:duL pTqVn wr+o8n`"hOb%c*2kSY|O+@\),*g%"&zZ'ĦP^8LMZZ11,H1£#S_ V"/BeKU&yW9[ohٿyF&PFE: 6N .pR6Cn4g*EhK:N$#oi4 >ـN(x)D_s^[& ՙ}\x!#A*u GN% ;IH~MgU!Ћ!݇UDB갔D@t-ur%$F 1HJt2ybpN7!O1~ҍI)ʳw+s HKvGSZ C+\1i-Ʈ>EY}ABTUS֫D 6bp?vLb1-:rHYO?;tE pH&#w6?1@r_O?[@BC}Y?DC5cXމO+@7y~t0ųJ\RQOj]鸧"O IӞC)̄eZ'W. ^E1CJLJx4 *4/珊G1BĔľD;`|<፳⁜b-m1 BsˠKz`a*טt{y`L;z1_4c%hf[P0!/JLJ?)\^sWd%*I9HY! *ۇF`Ik?]Fڵ̌̋7_kn㻹e!)N팘10A[:[{!箶byJXJ 0 _~#"̡&0 \2_M-HtOm\↫ƅ~T{u;>dkޣ%?Q Xga7|aVYԅNNRi ⃘tCpJmsMuQ$Cw\V^f,DbTo2u@]ϝV;y-kiɢ.͊Rx&}K5Ϛ4='ʋOnyUb-_8ɘB;$1Xoϔ[1!<2/pd%n\,LVgGOBͮREzKO~ hOpIsA3+0ψ&Yr sF%Z%NIP4V}5%Ur<䖱N :qlcu)T O9y*RcB1G&o;)Qdzk4dFHj$wp" ؙ|Y[-` ~0 s~u)af3i[i^pzTZ厄]0r8ئQ59#5$e€=:7* vGbSZ\ :bYɂ k~tTƀݶˈ *ш '>h(_-?lu+,v}/ƶC&,0;-JDZ?. X䥐=v6?2d!l2t/Δcf/i0wf\A:C\|aYx'DX.fDC;[8p# P+!e`&ѷEKTؙI~jm7@N C ÂnWG=? &G z"6 Z.<=;RC6 |v߉" mp0ob/>yo>QekRz"b2gP NY$N:v٘x"l$qz:@Y[@|Q>lA')}CxU'mg{њ'S->W؇~;IZd,/v2qwϖU8fLp|2~lQ\+gV hσaaE q /fWYB3=I7htlT KWNT 6f!͝Cݷ-|&Q= HTc d_>&XnKٹ=DX+'=}ϟ & T~їk"@e'%fd5Q 7ABx/ΨNtоZ]3GVk]E-ٟsx)OK`QuLně 9#G0POp*s-@eIERQE? :;DNF6{ф PLH.@SIإ,hΙ8QϰW!W+1!jLebN#+e3s_q6Y m 4yK9kM5f3+!5]֞҄ >\k7]Ĭ&#wE:Z]ǝ'F48&Mנ]_HvW#Ë36BGzc7 8_NNq!_ &J^~\ZX'.BKY@?IGwH)=^~}b QmNqꍂ*A^zi7 6I+,1m Z Ma|%J V`Qz{9&jq;+)q>nykG@]D*7hf%&^B.^aFl2Um$YeJܦ6J, /0M j@a`(>!fsZ6:3 !f4N,7n :J!;(܁`5٬G1uҾJ`† 9`Q/;x}z:&]8AxfK"*Odc|~/@]17 W9RZܳzk1sԛ/!5!`VHTdO_g0K6b߰08E0!,T:Uv,(P|Hf8-r$_9SUL% B0 &0r5Yt8/ {孈Kp)^I13YRZ-dW}uʮtXgx\-4YC OX@=MQhEݔJ.<2Q4]A?&͎DZuV>8&D(| ]0f} d^1s-lm͹O$;R~)טH1F0k IYk&)=e?s%}Յ'=[  %Y&Ɇ?H%\{0X-,`dRZ#E|biOBsAUų6-IM`:LH'D r CR%˓Bc8(Y+VNsI,澛8p^\h*q+Xv֓7op$@F2֥큑ZUdj?pZpe> DN8 lm߭yRcv' Ѵcj ug=eQE08m <7x]r#>>F3L>s.)==j@`MgcT 05+\$哪*טt{y`L;z1_4c%f#FbF(1h=2Wk#Kz?:BUHx4z3}0}S?*U4I]D*,R'k|= r0-/x^i}o6-]fhbi- P'gFKgޏpp+z2]z=铄Y zp'm YZ6id2&۳MZamv"`PmL\TIXqR'f1x'y^]RpZo/mg$A!@ǢcH[Ȃ>O`8_ȟ웷b(V: F_ VE}\ɒJr~4PJx|9ӧD /I%'[0Ӥ1o=]gpǹtW ? @΂'UHD8HF31ϯ ڞSa=H) ֧ sx>%^Z^80֪(`_Lr=~:Jr'Vrz=K5D1w.yfvjARk[j[`W<:&]YGt{3o9h MoG+?zxܴKwMQ0 y Fò+\J'Tj!M1-K`d Q+ҧ!Sg: }h$nm&iR@ks23:qUSg7E$ ^S2hg%atG#[N=?6fv ȹ⒇k3Vrqk1{>sUL MمMbK)R뛄&`ՀR xvfAAz#C!o4mRX6(,էk{Xjfs7ʼ%9Ys(򥌠y=e۠DLz&^i;+әdx QX.?ˊ6t;]of -ۡϮd&u*'1bJK'r_Cu>˜[(yɔ *齃AЁ[G N;4RVk=*DsTbKY=PZ>u cGԎcZ~kB+p 7ݠAkBT ` &8߯Y EutUb3w.cObPQ,+ ̺8y?ț) *R=.7 |ߓ=4Gh"v%e[Y d[4AJ`yjt!)ajziR~~J[alζga[ȗ/z 7B,,0킥Z>Sө#Tp@(#*bg܅I4%cn6\=r2gk_cLt?jpx]6sN@*02u|diRZ8ҪJ ZMdF^Aze c>qŧX a9 2v0)(ح 3m<@P4E`jr4@W}?or[F}﫾;d )3a@Whs~ӽlP{-Ow,ЁG#l3@L}0,M@Rt4|CrHWT̳8)s끴Y:7&vZ}F|"8Y )`g8J,HS?$TJW kl5A4gOkuD!/k̩jx4PK&j7. ¥GEx]n"MX.sU&)}p~oϊ-D SMTvcV+rb qXu'la8ݡ̮RZΪye*!+djNP6*Esl6xM@hf%U G6ezw=aS:%mK+JN:kfwv*z=PRx%[-'̉ v@ 8` )t5 z>Dxh#bY$^r5Of[]9CǞxpEv$»u=Фޔ\#8DՁ)XTo9)3z Ҩ0cwC%@;lTuLdd,xVCpkBJ7& Þ1ntQ%CU?n+  1Y,Czpzva4}3%&v9XAOzk @\Yxp@tX-).!g@ p.9u `,9*ykx~#1> ӭuJܱAda]櫟n0Gvk @P5wi2 R#J& / Z.>[T;+'wWsƝ~'QD#! sY*CTC\K\7^aui&6[S&{6Pf]+]r%r*Or>!>Q1Bޥ T:E+Z`w,Y~JQ㊪9C=\{徥d < bW9s#Sv1'y-ֿC.'Q]MW^Gݕ3+qHx7?ֶ>MҽI4F_Xq$'X}8P6\2(fM#T<&6+8WQ5VǤdKǦ=(KW!c;Lѵ$s- ,0<])Q NT( mdrUftp2]MTQPHmynTuWpt& KeziٹqXS{?`_)&<˴5.$v轰ЮXV߶kIh[W?,j߱@>! xpo1n58SCI8M_}+я6_Ȼu>nZ*G #H1>H{MmˡfC<֐Ð $.衚"`jS58{30|P@4v'\/}UTW+õD۝ lSw5X/y[hh-&YoTXd^ħ5,ͯZ&ņf/}pN 9W 82H4mccF:EΧLqRJ3QU5Lekst(N9sV1}1ӐmiUzTjoA#{} erFZH$v#|HoHKYurd236A FB(p~& rZ32 &gArV5@t벂@Lb +}m2TŎ+Od.!v1޷q^E'.UCq;8dm #[~{Sz{:mf=ľyG%1N݋◂įH_头{ō PBHp-3 ywWq]h̪r5uDӀjOOB0@ s$4O qy.)?BT`mQ{ TdˈɁ.xB#^F1U_֓yT|c0 ӱr x JP3 L&.)U!u6Wb0D`n֔X,<P٦c(3blF#l< Q-^G&̀> bzOuF޶oZwE>fNLX6ҲQJ`!XuA¯KRhC-GLC;B6 S8O|٤%]_mZMduMWKšD6}?U`WR-bh}eOEN]x@,C- FVB+|^`b;\[U>q(^ۡ8BYQ>'cpH5Q$Խ@CB摪 D5n5D6i3j9?Ȗ_wXMNJ4#DžLYyA㣣I|q`0?\DȎuIi%I.FmVv5-ْ_D9oԤn<9x R?4ly F|cT=RrN8ð'p/ +ɭf >(PC3Gu_ cy%d7ҹ|Ӵb)lѝ[FJ4 .=t_B^QsRUӣ#tD'X^%+n1K!)4[GQn_I%uL].djCoYS0 &1eNrZG)afV\fD |FF zBeqDncKfkpluw WU }a\bZ8 Ӥ&G\JLu/H8B-|J*3+;|[r%P6T2CKuQIT.#]J8ubOw X wV!]Ctb1sMUY9vNxm|4{J#$닶lͷhe}TDbKr,oK0z@ŹMe'Nw-LClI!N R_FgjR5]`k{3RBɌ Jבhtr'q 6?ԝn޿Lv"㧵# 5{QBӦ]Q*AtU|E։%S,UIsFv l˞91BM;Գ qt%?RDWV N~[w!s2?n#u=9KWms XEn>? >d߃Ze U,_YeTV ۶;Z6E_>,/M'bv~ϡהe– VR|yAN/v|H TLC=j=C3HoC {F:#4z"LGB ܜwemL `$GS-OW"YOon{ *M .?RFbV/IS1:x+K}Qa g1Ś5]`@7Ꭼl@yƍ+U65|#=w3?Mpvp `T|qGY@ĒLi;ͬ&k1GD<ZPDSaJt@H{r58b5~gbJkB}+.XOf̴[) R~C4D`17R1?z/֣#l4xOs* K0:Tך[;Y*3O  P Qe*A]~S9*<7g=f¼装YnHz<|LdC?ۘ.ur݃ZqAQ[.@9Y$AdW:n5v6_ S<͌(X Z2iwDw|t!v^&<9O23%WYº >V3 }~BsoZR:2o,t弯 lDwOPKApzYj0HLd]SL2ۈ1W1Zuq;!3jُ@LEa`Ȑv.أؤXONK=q߄>q5إݘ (@"3ّh*\x.Gh 6*!;WŘWVnxʜBLοŦ1fk3pDCw#>q[ Ԙ;8Џ~tX-GlS?3`/iC(* 7+DGV720Jܝkf:"RMsPfJG/\Pe@ir2k2'[t*bhCwi&A]I#PCi B2#BCgҳbȹ!#C2RȩX`c~H=λ9vjLI%4ȟ8QN|Fg_=ȱ<*s7'9⽺F&RMPHHbTw|gO=LFbaq/}g5xV%H0 Gwr'B+2K#:_8 ąf!>Lwx'{LsmoΜ3j!(r 9tW DboP}ਸ਼罕e̺RWoc\V.e+ GHf7<Iѭz?(N (F5Xj#me#\ Fakrlr(pt |"*)hIdY=v&׶qoFIF_m6D? =GoFY՝+{;>Dx-f{LpC»ݨy>J/ߍrfuˈTz+k1.Ƚ$vtHZ3$"8_-a~Ԉʁ20tsJ8”+ 7v,N4ڈ˳WL/ceuAN(mih5Lx4yMbeݮК!l2Џ}lr1JugW+"j#f̋٥x>|+DOoM߂*$ĥ;}@37m E2q BW<ߗ7;*" 7_֫rTx2tx'fՒM;aQ hF/N XS$qGxsLXtx >NUP>uڂ/;30q_g IIPѼE..@1t"~7%p`L@̄[fop(#*jV 37fm#|ڞJI/#JmhYDb:Z5IRY^ ]?"C9yY ͤ*ѽ+Jï1,ݭЮ 0nFNHk˗B)n)^u'7g8O TiTmAmP;+?cW͓OGkt;'r_Ai '_كiPUE &ّ?=Ej=bϙ9V.eX bCV~@jckl$%#y(UhHVy!5@bC |8*2;g?yVhKZT/|ѐ>LnvŎLdOa: !ڍ2˲GP3Y9ں RUbtz_LY4HD˼J c &sH `p715I4"?3&nd阚%9fdEG1CJ34ݡ|VWS @sT ժ1ŧ}⪄ƻ>xS*L &fnNEާ0wft#c%Ol.ˑWHp#֍w6ql,_qfAPgq3Qz-cUP.kz>ԭmr <3a e'=]z@ܿN%yR g_߲PќaJ3dA=E{QIIKs[O)HB#{OEYf:4hU .i)ΖB(BTvv%^|4O2 ʡu@;/Jed@mj2(:^}D$^ej=`-7]MQVm6elvX,bWa6ZL%Lp =[~8 #NE7d@7JA"PYtx~_}܃ah͝2<i#Λ&C,2MS+fꃦ$T k{b@9qŔW  LUM4eDOFQs 9)}.hsyarZ+5$?xH;j_6Ib?H #'4pWW3oCKJ\xt7Y _!Ht*ҳea㦋7aܳϿeGʹӿq+ýs&KʫMVW@X^^yaϫ}F?($34P=+Yop (3X/ a Ht3G>YYK?9 e^-Kxbם8hHBGfA  5umW r8Պ[+?"47lyAOws=hxwҬܕxoã*<֔2 Z40d<aEivbavN9L%OъҤY ڔBHiqۭ> AY\Y:aꅪvE0dq6.^4J}K\W^9VTnI6b5C{sJZon9p?UO [5Z&wk{F5cᝃBtۚ(JS#|AU&iAGXR !u\̮h#mMXhWS.SLKBx< >\^hf*Pg-tݒ,1l ֽ2J0Fe{j^X0YpmD 5;Jy} VNnZfΡ0>Hgz ZXе'ҩ%[\ha3oyZgJHyӠ^U!P`hrIG,]mN]_]g0 :]y4Oi;r]FVQj <%υ 4 jCԒhe},E gyY:2KD?|51olelbWY ~qnAZt?w8b.j.M|2 {ӓ"ɑ$ bMF]Բ~mNJj&2aai4Xǵ"}*D|ۮw-pe$[p㶿3xv#yr~H_]MqHpV{btff ҉^]~t٪iE2ܽm|Y5|aHl 1HBiFy8ܽ!444vQGWѤ}UYH@d)l/ z}4ͮuqp^ܪf=O_a(b\B-VS)zEpf3 AB + 41ăno{^2ږL!SY>uG*C4Oԉ>8؈&DD{AsF1F82oRz㱭a6[|gFR䷤':!u"MϷ)B.F 68ۏeqa|~5Q.f S-T7', A`H)2Ib bwsnR{⾡\2wʩݱ<'JV@]__9Xa޹Iͽ)5Cngy̸k'Ycs[h}̳BgwN,P +f$h@iB ݐ%.c=קQ$? tm͋ (w ^ k (3r_'$OG`C~~IǭaGmFG% 7 4ATgQ5|8޳jHQiAb1EzuhҧF1dx ąNghRIV*1Sj>S%_\s1yx Q aTBjuɢsCN/[6Yl;2^͵™֤%=CHvcԃ]MC4s3\̱PGnش/bAK򡀔춓vҷE|0NU&S4F=~`3se)KQ&-iJ" لh)7'AD  5y=;^ӦhH"jNFYp!bjmөRa |~u rjzZi|\%/g%?sU*3K},!*)zTl]/W@UK~14'Y<Ч MܤY5HTs?$eX،ZIz _w4W 8묍~?VۉLv1vx96%qXpsay 1qVJgQV(9h3&]90D '-l*EQ2mtӾ^* *-*myh30r 7w0`3aX"8;LK蟴b_gi(12:KoUXN|މʙoOʜ_Vxh?ۣ .'2{ӊYW?ӓa e#cs<ѱ=e2Ecm+fs3U(>ɪKC /ޞi|ꖗt\*g]Wum0# "ɭ;Z7{ W}K%ԹHBG)ߩݔ/qޠG:~8 À%1uZ"Ͼ;V\ϜK6n4wQ%߉b*!oyDL1JnL 9uQ|!v)&JMʪ$0 Ѩ(5RBs6MknWf&( @` A*ZX?-ҷsN5NtAkH"T$H\pKoO+ mC:WdJq_-f Ǭ K3,v10H4OׂH2ȧjDZҊ#av rݠZ g!:#QͬJ gkR9n[4rv?&itS ٖ[6ăցrv~߁jT'&2vhHpnRY;~Z ^VMx !ХQOl $pO) 9x".^*mӋHG=mﺨиі Jc1;XVǗe(xST^ϣQ@$ 9"i'HSZaŵ`5F|Rx90sI p1k j* F `fH+Lʳn7#Ǟݩ.goFo2Exa"DF&ty pB/DqN΍#ُ yΐR /dx}OD͕jxmqqShM$g~$8]ҙe1JZ Õ;/ipj)ЉŃ{ _ #>S[d첞$ы:DCOj9VO@1& ($TMQߗ#5~@}?ou/OAW}Wߐd )KDeLA~?P@ݳBN/cU%01} '[Tba5t 3c1c QJ8i8_ =}3xbWU4|bE fDS3i+ mϘuEƳLeY<7/bԐ' -鞝4T!H? <Ҙ/8ËTf &-lMfO{V߃d4ϵ3#Eh 웱tT(G!ϖ!sJySe$BV:SL?}t t~uRDthI($Z㼻`1>Cmû1 8 WBXA/4JyXvIkdZngG^DRL[}&>HVڸcB0XT:G++2"Ln s36C;?8ZIY11gPЅ~N{*+Rudf4N_jx!p*Xm|s[KǫkQJA1?>S_"^R >llufɦ!L f@v uCɖ-e ғCـb %+a-kF@0b|5f`AG@TFO&~Ҁ0f}&V?3'/w%vPGAPz;gVB#,Vt&p®ym{NK0Z H49)Ԙxo94m E Oed'1UMr5HٯBJ u^ y ma V9øѦTCWmk؛ nUovavESsj`y=x~ A);ǿ\^r,Љn#sMDA%!7 ڊ-mjF[7ݎȇ?2E|W_9C=\{徥d < bW Q bT prC^N8L&LƂTKC!UTU}Nbs1px>rbjV,.0 R6:-\'dAWZ#x bAhX*Ek\1:o6lyRz3؄л'% zH*"*S`8|abs<%]7"ﻈbؓįlnTWcת {gX"}ՋZYL`0rCcq_ 4F2^Q=ǚFz .[AFTW>9l~$)+eRvAkH=,&AcOI$IH|K@pfylo?X6.*Kqr'0C~Z:5eח-vC>1`PG[C޷ ή `h r Bi$;hua޻CX˫-^\5vo8Uߜ9hEx[W{Rc+'S#}js K/kK.k\yW`s9)^WQ8zG/VT]1>,i}~xY`umEi^9OZ{l$(cڒfbw3~1s*UҎHR,5AHD+Շqf2zp(c'eĚx1g$Ux"\Өu]D3F 3 (px`)WOeC*Z>pDN.'dx~ͲMVּd{aoFzP QY9E`uN78ѝ"Rweu19|U!db<_^#5%673˨c8فBS:e_vOaذ$#iSێ/TɏhˀR_mUH`*.úi[e0khV؅’3m 7;n-MM(l2ĕj y\\$*ae(ܴLb܃d.'Q-tiVnSydė0>&yFlS)R,J'{' ;%Us>;G bVH ˱6U^(i /) /P7$uz07ӊ P+dqϒ TC}n_a*]0_h4w1d͝1rRo<د\;HGܞq@Aj|dja5&/njvyI&[]`Ѥ{Ķ A>Ξ#Y;ǩfNZH!eQ]Se+D?&ķk/0Vx6AXvC3` =59]J3pKڀ%I.FmVv5-Si#_Hi?]X^)1 3(a)*ZfQ>/ J%*d#d"&X-p̍XXuSmCpGfƀ (h PHx?5+V3ہ DybXRƧ^-@ii}\^{Cw](*W$AEb.&ĆO )2a)W[3DmO&% bJ S Q 3 (IQE4K9ԃ9ҩi,QD)B%,\udϡJTuc8X fXbσ; *Z,)lϷ ?t&K#T`xx<31:`mu_ռL̮d[Gow%Vu? [f(f}dKI14f"}woط\xT%dk:{HmmJV*=\韔HDx:Ê_[ʹnDn+Jʕ{EY>H73vyҴ=TEs#4[ ıZ!h y@[,KQNޞCw^w>'ې)46IA[ǀjXahC_M_kU|4仵m{K^oUO(p._n ~ߜPKFcu]qD&Dq aV6%ddS!rݦh[)NG:%)]9pMa>/qq{cJL\v>, gA\DD7qⅹdbH9-iZ{ޫnRfj-̯G o,n|:h`eX/]':u #GXg ΋cx xf_w O'eЉH2F'2PyD܂R _zߒ %.i[8D&?Y}(rK=A귬եrP >:*ra6Us7xe@v|(䭁?4 7=L2\:.u8KjPQ9'YB[9&q:brZ( ӷw%6O=^z^x>B^#1x 䡚ie v^P}^5Goq7%Q!t + klp x@Ј==i{D R,i5^=rr~8x(6>M)v|>#+&m@7P(ёќlMwOXjh`r}W 6!|0bzC:ڛ`.29ƭth1:돁l@xq/W Q!aJ^Rs<AL-)ħ) x VM6 LsxK{<7"ц sȱ͏ j& 溿e"1#u {0~7>6a P;-Bsu M>:%q~v0r,[׷һWtU!2sP.//,9-eJqG@^躆!ٍC XUƲ-{T ^OhZ2x C'VeoVq`Q77懵P;`9߅ CEG)`=V'9biS{HW0롐}[-JǿdM\QV{miLyccח`|\+WF[;fh|֋AJ#Kj;{ 77t ʾ{2Ivc/U6"G"Hupy{Q4  cak"¥!>JTn$ҷI=xWooc(^d lñI78ZllB,i Z)$_p)i"ԓ2z7Kr~[JNzY}'ܴi!;63zA2q\48Q7.T!ϋ+9lpK?^*$24vF[YLݦ&X&SR9,5 p 4nli2VeWvxv#܇I!!TyV|zl=RJPoRFk}3RANAV@ζ)Ϋi`cp[gl ޒxqCDɰg8+fᰣ:_b!U_vJ86b:bf|ÄNL-sX7fF_dדƋ*(f?1% %mvK>v$oJP1FmR16%^&HX@$sZq/bl<<%#TNzW^U6x]:,_)0ou=I>vBNjsȯtb R% +_ǽ1Q:jG\{ïlMBxP7جjRҩ`Ɋgz535RؗhStN b+I}є فZN&h rIy̝b+;mEK"H%ŰՂƼm($6E)\_r­T}MA<[2<]I"S()}Fs+Is\r!`$Tgm!;Z vj p!,85uvk "1BVPi$䜟" L4 tb%ނ7;Jkk܇De^.4_E?҈Տװz! .VOqR޸`F0bwY"BUFvNvKc9*[x}_8m$!Ai~k!tEдb(̮Yw 5]99M2WM A ;& $\Y|lY++ʯ")/?dYg[E[8\-M/bƩ e Z׳AI}"L`}[Dr3uE'iFb>k~ wƖ <5J hnyHahß k Hl VV\2|U5޽=ˇNT/) AZ'ph+(GVOmz[:  x{ RʕLFO859m%?B2nm豔Yc7ou`|KҨ) KM[OG>f 6ۀvbLԮ |NDL1"ց>62jO?n5t0f0HKZ5Amh 'E υVBqBmO< z#Gb@M7FBϋZQmVxԠYKi$cW8,4Mnz%wrxO;`UJ+#^MH* w6R HP>z+*)"mIxme%rlL9ǻ/+WlĔqc>/vTB}\y/䕶?{>U)4È D͊[c{ \ʔxaj9 M B#!p42p;>_gbYNU[]PۢKbV۳H1%{i›B_ awĽr^S&8TʅxEt0G"#XB~E0۫ J6)sHI߯V/>p'& 4,zECH2~e}}`0{o@Pp>1N)Zf${7e峞}eh- *@УKRbgG1 K!RgwߣRq{h7+S^ =jt=IdCJXru\$?xH;j_6I)$͡*%YqU?@jų4Fkl4V]T^r FˣcOH2[ Oc`P4Ѣ.G6RM\ϫHbP-Fҵtu$PPg2XIڿhyB2 oLWіrwn?$hQ>N<KnL/!xQǑ%%n#g:lDT_ 3~y[7QLgz$}Duv#$U`LkZx$-f頁~F5PխD9&۹O1REEdz$-SxKj} 뮫;%J_O&7h%* ~̼0H<{l B^#9HӸXYLJqxH2-66GЗ1ҧew9FMH- H7L?K>ȕ66ȱTGW0S~FH^O-:!:G5áYӱbܴH1lu5Nv.oq!vc괔 *;׳ CA:=}6P3)3b\d f $pU!2?U@9q2tW'g,56&\Iv #|wL]<{w+udn6YCTVL iF.ٳf>a}( Q"Ƀ-H3Bdnġ1אָiwlv/:xw% B=WR2"i0,)@vs%oҒM 5++ZW\Cދ&**O ɩf-۰Gyo<(bceUsi:>cDl"O0)9]7̝콏+ ojzArҨ"X i4Nωgθ!]_)%a0dlje?q.*GϠx6t[ȯ4M {<^LP3 ,5 &*6'kgPy;\3N'&roMg}u䏍G',zUX̖zAk-Ear1opEMgB?YU}ZGQs|y*}qaJ}{R}\t zrcuû[jrGXoE}"=oOv4Pyc,8P,?ځ@KHf@Egx@U W<_l!a^] j($|nݹD3Xq;T['ϵhlj[hO8بMl[& >2lz48oIXKi$0cƍ@$`q`Is}ٰt.cj*$G$+3NN̾ʲ 㣞U㚣2szKpAY̡hD}yr ;v\)/AA]p>"]λ?qE 6j1˴[ߍs) N/>z"i&5J&qx3~z@y/PˌeOϺZhx93m-2<"+n'="y_jJ c;^.d?cSZ/Ң+:`>jEn,KƗU@:*tKaᕌR2L}`;H:0aOȢHNA<}-S#oY3ǔ,w赛T5gfmNn}Y/gt(濊O@pHCXcqusdbxXV~2'_^'8D?8OHay.3jKwyg 'nfL۽ڒmWDqMqUi"FuTr闎'kCTl0'/ mv85HkBTR Ki53'ҹ[4M)Xi|1EdA뻏OWG3/FdW?9"z& ɒL&Dxw[.LxM?) nXZ')?v8JMGpG,'ۿcqVaxn PC[eJEůNq<D~I6l?|kC4 gB=&B]5ZHANoi5_8.!b/@.g[*9=%w4+p48h[frDs/qg1>4إRqt,8\|'}OXrB%71m\?L}޸+uZРtO'5p.X`Rv{z}hl,LP9O2O1}õGo" 4.5NfӨ knM@^o:_%I#֍`՗y'oIv}+}q#:VXr;ppw|H,~T)TqNm c9$I9M-ibev[4tkFD-EE,/S0W`F:-djkZ2kX`G1͖YVӋvu\EMup'A^ 9B~D0j.C zz(<@XxF׳fJBm)X<v卍tȬgm3G+J~UҠD^@8g`џMnou!i4M$bʐZG-B 7RB;~@s{pHO}]_W`d )KDeLA~?P@ݳBN/cU%01}'i J>8g ꦥb4DIB6\uۍ/sZ0tE>D3C-+kEG3*0 ShqXEͰ93/1Cqf?Vk뻀G,s;D7 zTc\n/YXə"5i mq s35BvDw UÇzF TWdדu}FAFTk\a_|CI"kg;d|̼))0emAkPFB~TEzh5i*{1&`6;$ Q@K'¿z޶J|JC*G1dQޥ Sxw2`i:D?)L qg]C=r+H=VLγP/-U(Lk㽔_~,cQŘC9`Z|&y 5W.d %sLq'Oa_Ϫmu)8 ]GFzufUttc r81J9C=\{徥d < bWXI<Ҏ6de!I![W%SClldO!5sVݾ~ZtЫ] zC^I210r$GGS^Qgk%빥=0gzˤ{wkoQ.N2hu6sct 'g9)l}/0ܼCVL]~'*W]aZH9үCoKf%|w,ŸüX!aFjX@yv|::dP aF}.9LCa3!/!}atKu\;ؾ;߸C_2tO-naH0,Hq t5iMĻ<kmNڻ:rTS:! 4['Wv&S }u;z;H[@̡b\a` va1߄߉6^^teϛiutI?՝PAf?"3TUO}:⎢"PrlT&لFlPH vY@ 62xm$k:OFhڑ}r i6v:/}4{3􏴟 }k r,cZp8}%NmnGjՇV~jexQ?*bfyUD,zL65#m_WyBi\>̴\v!oW VN[\Z`*?0oige(NFo!+(`D' t %K1{: R_.OзS m821Hc?ZLtģEaKu0 rsC"RrACT +C;~d5NӦZA1D.U[{׺;c諉Zk2  kl:L>3 =w%'#)"[{K x$#>̴(mdWڤ}؁m^wnlVp,`ÌՏ96%]!U ᛚ1qz [B)^l-jll]iʼnY5u:7X%XOV0 viӆMZ /I> 34fάJ hUxQ>T-]4"} xtg/f )&0˜D~f\* s7ġeܓ#X&}4:C.rhrVIGmMc8__]"s>5"h3z:q=, KXdӪ%ŒoK$~ʹF:H߹poCw=a*shH]i '[p׿wA㨪Vx$,4iWL5-NG8Ɂkh1Ȥ$SKc2Rσc9l6.Ҙ݀ǕYe_$?iB cs_~"o&sWq\? O`{l2`d p, CV #a\dwtfp5En VC`^@* 1xzKvlTӎn&Q u UW{AA;RK?Z)G)\IC%pqMCa\qX(pk1"Y ѐB{.dd6oFRRXȇkg^/4k̉IV 7B zrƋ3}񦼾Y0Ss^^`Im ,^W㯡 ؀\^Z96Oc2JvK2kF@m3uNSNt*TjHsAkMb ?i>fU.yDh.RT ̙uV_ܐ%T`6_xz =YlĢxm!wZh@lD97R2pưW/!ipgUݹ>嫑JT=z'bv~ϡU ŭSeXzy%‡2ō⥀@@~Ԕmg$[`I\}+w($hh#9sha\IOEdY?AONɢS_̈ľ.6;(BΆbuLwXD-vg,pԣ "b|5d1'ldy fc4K϶ v|D"R_[NZ:XU[1%i6 _!Ih,Ipbl[Xbғ0b}?1i;R J%%:0HOIlq{zhUj0Wy #tHc ]C-n<̢/)z`7_StIMR0uD`1|H.g>!tjL&%E?7bDt mWml1 AHc\nrI[\#b`6 7f 4&2ǩBF2ǘJݵX|/{a\ rT73~(sD:DƖG'ј~I%Y읧k,bčq`.AD|Bg֝1}(lůjUNWg!&9U67-J6Z,>pz^yj<L,]y3HTtg-R9X]+?Tb<л'93.6¬ fXRU]%yߪH["R~kY){[-B<6_h Ku*}1@ O])d}gts.S*eH(gz'LŨƃ/5!8:e6dT+ %oP@Fڶf]m[]*,Hv@H]|2[:mtZ`_HϩLUKt-坖k?{!9=|*m#' vkmB.N\mv㬝$oY Na;=Jg7GtSX"6C$r\r|q g<[5wCگbX6O*_' _bMLUP`& $Xq(&]M$q=uBZERl8_'Ov�ƌWpk1VTs4hȁ 6nyXg_#ֆ$zq&k/ڏF&j8LWj=}A[b:ͣJS@vA܆@jrt8gKQ͵Ư@]z޸k`of1ZCp SÂI`DGB4X( ƍ84PpBst?zT_ܔ;w&=&`~JUf!oRgiU t􃔁~ k 4ޡ?ua6- kZB?+#?b[C&6$(4yMbeݮͱk!m:=*#[zdS <%ʽbuw<"bC$ѰFh݅p"lܩ_$CMinqg)qcPm& z&P[a(ŐmW0YƄ x3MZvamXW⏸vG kƲlGS VBs2;As!o(<:pSWAoBQp@T@<+$ '˘X6նq๭N>ώ\:S'(j,VIR4c 5W7nZ٢\p ڵ11"CQ a&dW]G@gL#^P;P$,(/:3 TՌxsd$Қ$Ӥ0']<!l^8Ẑ պ_Bְ=A <`ջQ{f^r\SsC4&gՀ=vbwv$ieG7bHX>K!@Yf: 4E#2((ur9G^/1g-p%nJ82(C6}DUe{`-(GC:8PXát{H-_)Kn(m'yDUHӋ$ VV9bg0`=oFLIYRkRNt!E!(쇉͝W=»EGŃ hm1 ؊..r#[*C)$[Y(K bz#ί$vӪvG->:~K )^fкj6FswHD/Aq *Y_-|iSm{ъ$u'!L8]P: ؑe!@T'6LfaĖيy޺sXs_x,WuQ{-?#H* [+}-n:θRgY.Uy _: K:eՐtc&uAㄶL]=tSͅifjT> FJ)PjT\7WS]Pt`~mV^+c1ܺqܭ96ӧD w ajAPfv,Hծ9zpY^8a@\<=-[a%jNۙ _֟Km5|)ڑJ!%q2ekѻ3cB|Ɔ@+G-N`==#T:x J=}8j3T9U7΀>R*~sK hwySt۪.F?M&ŮH~&;6In֬~W|" Ԥhdk=\u6?KqYJ/]@.,15_YCײ' ý0w^ݫL:|>\ܨ OJ:8iViK]Z< 1YURQ^:)դw(25@dfꥦ\f7TQ*"hNLYl--#v0]+ ]t5c *QH6x̠!-_;w`4\ p| s[a}( Q"Ƀ(&p·8[ScH[vm߯}0+^`Z ohL@cV,[I Uh!uPIY@e,&}f[6Ib:{瓤3[apFJE<}X }9d62Ǟ'@؉UYQ IgA?m9EJr85mı 3S[R8B zu?Ta&ӡ tGr|~WV~7&&jhzJB:ɾaAw{EMÓW"Vt<`q14\ߋف 0r(gVn| v]$+Ӭsp=ECye )ӈr=8fFTm]T`->BsQ2 q"f8P:;6bdHzNӯ ( 0=*Cʏi/c=z$D5\ D(s +w6H N` ]dUVgz*@sTl*\ /Ӎ$EZ!O8WΠ7mk7Q 4i JH<ю5Z3W+> ^k&acn߈$W!3*QZzMhYY\] ݀2\@7,x bvuǀ"S)4%P:D4쌧ųt6_tb-Q^9g "dVY]fpK~ $ JN;d2 ҞUɗ8~ Adbsש x;VDBtt9L`avv$[7Ht ݘ6VJ?p^߃yy^+nMҖ<mE܍!H?O TBin]K ,nI86x6mQř<̨9._6ҧooV]Fv`Q-޸OH;HMrOЪڨr{AZ03p%I<28L0ÜNcU;2;)>xue'q  1@䫎1&iʭYz )od Gfj춓vҷE|0NU&S4F=~`3Ӱ.$l8t=nL,oGKB ܜ;i\G $oDVpcIw>4PK_3L +}`B}}n8٧oi΢< &KA_ξGF:K al7hf'TbQ̝sZAd'sV޴rj(=aR8iztuY ۷E] :+jm@rmt`74[T&%w^Cc֏,2R֑GjQ"D+4|;aд:<"fݬ>'l)?a@GcXIwNC}t:pOZK.(:9{_{GcJ{|X+1F%!XHWB@)tX{VYD햁su 30{6 <{GŊK}k UQ$ [KּK DN=_T?uYn~))A(_ksf\f-C.q7)T!J`>2՞̓uOţ^ZR(}N4K coRU'>BVK;KpE{"L 1~+3_v"sG`\QW~H YW?j %Y!.@ꐯgV<_p &Av]ʟ,x^tQܯCd.a}}t߀ƫǽ I:pO>߹Pwّw痥e2a~qӬ*A0!>Аm@%+C!2Q-/D_nڱP r(mP^Ǽ7jq }аnf:OKh9 *Y@/ c<u@vxn0 )x/|XkT1Aʖx$B%ߒbƄ.!&j7r) )S"/j'.(g  i_Jofq՘1gK[`;(ɎQf5P#)(풑2Pǰy g~K#.ry|Ǹ;S]A$&i1H_"^;SgzE(f uh  %AozF=Q@A5¨hp47W=мP= qX/Vy;fߞ^ҢLhlzZϠZˣNFuEa FjVsLul`tl!Ct4t ;5F&~=򩗁!+пքqFE=@wc:)^}6޾ .(=Al}A-g Ԛ238'OQBjFǞw5fhoy;8lQ'@E~6Ĥ94 Ez:`sXe oɧP((1}e?h Q)Pt^]iDl:B V5~htݐWlçP;OCZL/K՚~tvN5o⧱v1|O v?j(2nq:6r\W \?Q?5<B+<H=W\a7)`._s^zhW#cq y}q9e=t]1UA Q0bбT~A*.P 쮎1~Ό:O[cE1|7,y X7I0~i G2QnnRoq@8i/ /}bE*Ph4@vkh1ۢ`ʋ ')"bb*:͗n(Ӕ|Bm |,4uAģojLiNA3]DakBuUZ5qR4{ux̄=8GW n8,pl-I2ULLsdmd99 it32<=Q==?@ABABCEWEFGHIIJK^MLMNNMONOOPQQbRSRSTUTUVgVWYZ\k\]<;<=Q=>?@@ABCDDWEFGFGHIJJ]LLMNOOPbQRSTVgWXWXYXYZj[\];<P=>=?@AABCVEFHGH IIJIJ]KKLLM NNOOPOPPQPbQRSTSTUVUVVgVWXYZj\[\[]^99;<O=>=>?@ABCCVDDEFEFGGHIJ]JKKLLMNOPbPQRQRSTTUVUVgVVWWXWXYZj[[\]\]9:;<>?@A@ABCCVDEFGHI\JKLMNOOPbQRQRSTSSTUVgVWXWXYZZYj[Z\]9889::;>?@@ABCBUCDDEFGHI\JJKKLLMNONOPPaPPQSRRSSTSTTUgVWXWYWXYZj[ZZ[\]^899:;O<=>?@ABBCUBCCDEFGH I[JIJJKKLLM NNONOPPaPPQPQRSTUTTUfVWVWXYjZ\]7899::;O<=>>?@BABUBBCEFGH[IIJJKKLLMNNONOaPPQRRSTfVUVWVVWXXWYZjYZ[\[\\]77899:;N;<==>?@AUBCEFFGHZIIJKKLLMNONaOPQRSRSTSTeUVWXWYjYYZZ[Z\]789;:;N;;<==>?>??@AATBCCDEDEFFGHHZHIKKLKLMNO`PQRSRSTTfUUVWXYYjYYZ[]78789::N;<=>>?@@ATABCDEFFG[HIJLKMLMN`OOPQRSTSTeTUTVWXXYjYZ\]\66789:9N;<==>>?@U@BCCDEFHZHIIJIKMN_OPQRRSeTTUVWVWWXYiYZ[ZZ\[]6789M;<==>?@S@BCEFEFGFGZHIJKKLM_NNOOPQRSTdTUVUVWVWXiYZYZ[\57899M::;<==>?SABCCDEFEEFFZGHIJKJLKM_NOPQRRSdTUUVWXWXiYZYZ[Z[IIJJKLMWMNOPQQR\STSTUVVWXcZYZ[Z[[\\]]^_h__`aa`abccdmddeffefghiqiijkjkjk566767789M99::;<=>?R?@A@BCDEYFFGHIKMM_MMNOOPQPQRSSdSTUUVWXhYZ[5767889L9:;<<==>=?R?@@AABABCDEEFXFFGH IIJJKKLKLL_MMNOPOPQRRSdSTTUTVWWXWiYXXYZ56678L89;:;<=?R??@AABCBCDEEXFGFHIJJKKL_MNOPQRSdSSTSSTUVWXhXWYXYZYZ578L899:<<=>>R?@ABBC DCDDEXEEFFGGHIKJKKL^MNOOPQRRcSTUUVWhWXXYZYZ5657L8::;<<==>=R>?@BCCEDEWEFGHIJJKL_LMNOOPQbRSTTUVWhWXWWXXYZY44567K788::;<>?@@A@?>==Q>>?@A@BCDCDWEFFGHHIJJK]LLMNOPNPQQcRRSTUTUUVgWXXYZZ456677K789:;=?@BDDECBA@?>=P>?@ABCDWEFFGFFHIJ]LMNOOPQQbRSTVUVgWXY45676K779:=>ADFIJIHGECA?>Q==>?@ABCCVDEFGGH IIJIK]KLLKMNPOPQbQRSRSTTUUVgVWXXY34566K779;>AEHLPQQOMJGDA?Q=>>?@@AABCCWDEFGHIIJ[JKLMNOPbPQRS TTUTUUVVgVVWXWYYXY33456I779<@EINSZZYUQMIDAR>=>>?@A@BCVDEFGHIIJ[JKLKMNNOPbPPQQRQSTUTTVVgVWXY33456J67:=BGNT\fc`[UOHDT?>=>?@AABVCDDEFGGHI[JJKKLMNOPbPPQRSTVUgVWXWWXYY2345J569=CKR\dqlf_WOIWA?>==?>>?@ABUCDDEFFGHGH[JKKLKMNONOOPaPQRRSTTUTUfVWYY2345 I66:>ENWam ztkbWO[DA?>=>>? @@AABBUCBCCDEFGGHZIJJKLLKMNOOPaPQQRSTUUfV WXWYX12232345 I578>FP[gt ‚xmbWaIDA?>==>?@ BABUBCCDCCEFGGHZHHJKKLKMLMNO`PQQSRRSTfUV WXWXY121232345 I559?GQ]jy Ƈ{nbhPIDA?>>=>?@BUBBCDEFHHZHHIKLLMNNO_OPQRSTfTVWVVW1234 55I558>FQ^m} Ȋ{nrWOIDA?>=>>?@TBCDDEFFGGFHZHHIJKLLMNaPOOPQQRSRRSTeTUVWX1223234 54I558=EP]m~ɋ{|bWOIDA?>==>=?@@SBCDEFEFGZHIIJJKLMN`ONOPQRRSeTTUVW12334 5I557>==>>?@@T@AABCDEFGGYHIIJKLKLM_NOOPQRRQRSeTUTUV0123 44I457;BKWgxɖ{nbXOIDA?>=>=>>?@S@AABCCDEFFYGHIIJIK LMLMMN_NNONOPQRSdTUUVWVVDEFH SHIJNSZdpÆҗ|rha[WTRQQPQPQRRS\SSTSUVWXXWXYaYZ[\\]^_h__`abcdldefgfg0122334H4569>ENZj{Ć ɋ|nbWOHDA?>=>?R?@AABCDEFYGFGHIIJIJKKLKM_MMNNOOPQRSSdSTUV012334H4468==>=>?R??@A@AB CCECDEEFXFGFGHIJJK LL_MMNMNOOPQQRSRSdSTTUV//012 G4457:>EMXeuȆ Ɋ|nbXOIDA?>=>R?@@AABCDCEWFFGH IIJJKKLLM^MNMNOOPQQRQRcSTVUVV/001012G34467<@FP[hxɆɋ{mbWOHDA?>==>=Q?@@AABCDDEEXFHIJJKLL^LMNOOPQQRQRcRSTUVV/0122G234569=BHQ]ixɆɋ|nbXOIDA?>==>Q?@@AABC DEWEEFFGGFHJKKL^LLMNONPQbSTTUUTU./0122F224466:=BIR]jyɆʊ{nbWOIDA?>==Q=>?@ABABCCDEWEFFHIJIJKK]KMNNONOPQbRSTSTU./01F2334557:=BJR]jxɆʋ{nbWOHDA?>=Q==>?@@ABCVEEFGGHIJ^KKLMNOOPQbRQQSTU./01F122334679=BJR]jxɆ ʊ{nbWOIDA?>Q>?@@AABCDVEFGGHHIJJI]KKLMNNOPbQQRQSTU-../0101E1122344679=BJR]jxɆʊ|nbXOHDA?Q==>>?@@ABCWCDEFGFFGHI\KKLMNOOPbQRSRST-./01E11213 4679=BJR]jx҆ ʋ|nbWOIDAR>=>?@AABVDEFGHI[KLLMLMNPOP bPQQRRQRSSTS,--./01E1223234579=BJR]jxɆ ɋ|nbWOHDT?>=>>?@@ABUCDDEFGHII[JJKKLMNOPaPQRRS,-,./0E123 467:=BJR]jɆ ɋ{mbWOIWA?>?@BUBCDEFFGGHI[IIJKLMNNONOPPaPQRS,,-./0E0012344579=BJR]yxʆ ɋ{nbWOZDA?=>>?@ ABBUBBCCDDEFFGGFGH[IIJKLLKLMNOaPQSSRS,,-,-../0D0012334679=BJRmjyɆ ʊ{m`V_GC@>=>?@@AABUBCDEFHGH[HIJKKLMNO`PQSRRSS,-,-./0D00122334679=BJd]kzˆ Ɉyj]dKDA>><=>?@AUBCE FFHGHHZHHIIJKLMNaPQRQRS+,--././D01223 457:=B\S^l}̆ȄreiNGB?=<=<>=?>?@@AUBCDEDEFGHZHHIJJKLMNN`OOP QPPQRQQS++,--../D//012334467:>UJUbq͆{kmRIC@=<==>?@@SABCDDEFFGGZHIIJJKLMN`NOOPQR+,-.//D/01243467:RENZiz͆oqUKD@=<=>>?@S@ABCDEFYHIHIJKLMN_NOPQR+,-./D/01212233569PBKVdv͆sWKD@><==>>?@SAABCCDCDEFFYGHIJJKLMN_NNOPQR?@ABCMDEF GIJMZU]gtԆzf\WSPOPQQR\SSTTUVWVWXbYYZ[\]^__h_`_`a`ab+,--.C/01 23569QDNZiz̆ ooSJD?=;;<==>?R@@A@AB CCDEDEFEEXGHIJIKLLMM_MMNOOPQPP*+,-C./01 2457<;<=>>??R@A@BABCCDEXFGFGHIJKKLLM_MNNOPQP*+,-C-./0112357;BZR]l|ˆ ȂrbgLE@<;:;<;<=>>R?@@ABCDEXEFFGFGHIIJKL_MNOPOOP*+,B-/0 1347:@Gc\jxʆ ɇvh[aHB>=;9:;<=>Q?@AABCEXEFGGHIJKKLL_MNOOP*+,A--../0 1246:?GPlixɆ Ɉyj]S\C?<::9:;<=Q>?@AB CCDCDEWEEFFGFHIJJIK^MLMNMNNPOOP)*+,A--./ 01359?FOZwvȆɈyk_TKV@=;:99::;<==Q>?@@AABCCDDWEFGGHIIJJK]LMNNOPOP)*+,A,,--./ 01359>EOZgȆɇxj^SKDS<;:98899::;<=P==>?@AABCBDDWEFFGFGHIJIK]LMNOO)*)*+*+,,A,,-,--./01248>ENZgvȆ ɇxj]RJD?O:989::;;<;<P=>?@ABCVEFGGHIIJJ]LKMLMNMNNO))*)*+,A,--./0248=ENZfvІɇxj]RJB>;M9877899::;<P=>=>?@A@BCVDEFFGHIIJ\KLKKLMN()*+A,- .0238=DNYfudž ɇxj]RJB=:9L789:;<?@A@@ABCVCDDEFGGHI\KKLMKMNN(())*)*++@+, -.048=DMYfudžɇxj]RJB=:87J76788989:9;<?@AABUCCDDEFGHI[JJKLLMN()*++@+ ,-./27;CMYfudžɆvi]RIB=:866J67899::;?@AA@BUCDCDEFGHI[IJJKLMLM()*@+ ,./25;BLXetdžȆvh]QIB=98655I5667889::;O<=>?@??@ABUBCDDEFEFFGGH[IIJJKM()*+*?+ -.149AJWdsdž Ȇvh[QHB=9765I567899::;N;<=>??@@AUBCDEGFGHH[IIJIKM'()*@+ -/38?HTbrƆ ȅvgZPH@<9765I556767899::;N;;<==>?@A@ATBCDE FFGGHHZHHIIJKLM''()* ?**,-15?@A@TBCBCCDDEFGGHZHIIJKLM''() *?*+,.28@LYj{Æ ȅugZOF?:7544345I56789:N;<=>>?@TABCCDEFFGFGHZHIIJIJKKL'() ?**,/4?@S@AABDEFFGZHIJKKLM'() ?**,06?KYj ʄufYNE>9643234I456556789N:;<==?>>?@S@ABBCDEFGFXGHIIJKK<=> ??J?@BFLU`nʖui_WQLIHGFEFGFFHHIRHIJKLMWMNOPQR\SUTUUVWXYaYZ[[\]\]]&'( )())?)*-29DRbu ǃfYMD>8532123233H44565578M99:;<=<>>?R?@@AABCDEXGHIHIIKJK&'( )>)*-2:FTdv ǃstYMD=84320012233H45678L9;<=?>?R?@ABCCDDEXFGHIJIJ&'('( )>))-3;GTcu ƂsegLC=84211012G456788L989::;<;<==>>?R?@@ABABCCDDEXFGHI&&'&'( )>))-3;FRaq rdW]B;84210/01223G4566787L8899:;<=?>R?@@ABCBCCDDEEWEFFGFGHI&'( =(),3:CP\k yocVKT;6310/0122G2434567K89:;<=>Q?@@A@BCCDDEWEFGGHGHII&'( =)),18AKVb qi`UKBN621/01F2334567K789;<>Q>?@@A@ABCDCDEWEFFGFH%&'((>()+06=FPYfaZSJA:I2/.-../01F2345667K899::;<=P==?@ABCCDWEFFGH%&%&'&&'(=()+/4:AHOZWSNGA:5E/.-../0101E12234567K789:;<P==>>?@AA@BCBCDVEFFHGH%&'=()+-26;@FMMKGC>940C.-,,--/../011E11234567K7789 ;:;;<<;<?@AABCCWCDEFGHH%&'=((*,036:>BCC@>:740.B,-/0E12345J7899:;<;<?@@AABVCDDEFFGG%&''=''(*+,/02443210.-,+@++,-../0E1232345I56789:;;>?@@AABVCDEF$%&<''()*+,-.//..--,,++@+,--./00/00D1211223345I567889889::;O<=>=>>?@AABUBCDEF$%&<'())+,,+*+@+,--../0D001223233445I566789::;;>?>? @@ABBVBBCCDCDEFF$%&<'(())*?*+,-./D12 334556677878L8898:;<<=>>R?@@??@??@@A@TBBCBCDCDE$%&;&&'()()*?**+,-../0E1245689:;;<==>??R?@?@AABCDEWEDDCDAB@A@@?@@AUBCDE$%&&;&&'()*?+*+,-,--.//1F2579<>ABCDEFFGHZHJKLM_NMMLKIGFDCAA@?@@ASABCCDCDE##$%&&;&&'&'('()*?*+,,-,--.//1G57;>BFIMOPQSTUUfUVWXYYjYZZYWVSQNJGFCBA@??@SABCDDEE##$%&&;&'&'()*?*+*+,-..1H7;@EKQVZ]_abbcddetefghxh geb_[VQLHEB@@?S@BCDD99:9:;F;<=>?>J?@ABBCFSNSY`gnty}{vpic^ZVTSR\SSTUVWW#$%;&'())>)*+*+,-/2L=DMWblu}}ulaXQJEB?>??R?@AABCCD#$%;%%&'()>))*+,-/3L@IUb l`VMGB??>?R?@ABCD#$%%;%%&'()>))*+,-/4NDN[jsfZPIC@>R?@@AABCC#$##$%;%&'(>)*+ ,+,,/4OEQ`p yi]RIC?>=>R?@ABABC"#$#$%;%&'(=())*))*+,,/4OFRas {k^SJC?==>Q>?@@AB""#"#$;%&%&'(>(()*+,/4OERar{k^SJC?=P>>?@@AB"#$:$$%&'((=(()*+,.3NDP^p wi\QHB?==

>?@B"#$:$$%&'=()*+.3MBMZi rdYOHB><=?@@AAB"#$:$%&'(=()*+.1K>HS`j^TLEA=<O==>>?@AB"#$##:$%&'=()**)*+-0I;BKU`kt{zsi_VOIC?=<P<==>>?@@A!"#$9$%&%&'=''()*+,/F7=CKS[bhloqstuuuuvwxxvsojd]VOIDA><;;?>?@@!"#"#:$%&''='()*)* ,-E37=BHMSWZ]^`aqaabcdeddeufeedb_\XRMHDA><<;;=>>?@@!"#"#9#$%&<'()* +-C137:>CFHKMOPQbQRSRSSTUfV USROMIFC@>>=;O<=<==>?@!"#9#$%$$%&<'()**++A.0257:<=??@ABBCCDCDVDDEFGHZHIIHHGFDC@>=<;:9;O<==>>?!"#9#$%&<&'()* +A,-//134566789:M:;<=<=>?R?@@?>>=<;:O;<;<=>?!"##9#$%$%&&%&&;&'()* @+,,--..//011233G334545656788L89:9::N;<=>?>?!"#9#$#$%&;&'()()*?*+,-/..//0D01234545I566789:9M;<==>>?!"9#$%$%&;&'()?*+,--./D//010123445I565789N;<=> !"#9"#$%&;&''(('()?*+,-./D/012234H567899M::;<=>>678C89::9:;F;;<==<==>?J?@ABCBCNDEFHGGHHRIHIJIJJKLMWMNOPPQ !""9"#"#$%;%&'&'())>)*+,-,,-C./01234H4456678L9:;< !"!""8"#$#$#$%;%%&'('())>))*+,-.B./0122334H4566788L89:;< !""8"#$%;%%&'()()>)*+,-C-./01223H456678L989::;<! !8"#$;%%&%&'(>)*)*+,-,B--./012F4345656788L899::;<< !7"#$:%&%%&'(>()*+,B-/010122G34567L89:; !7!"#"#$:%&'(>()*+,A-../01G345667K89::; !7!!"#$:%$%&'('(=()*+,A,,--./01F22334565677K7789:;< !7!!"#$:$%&%&'&'(=()*+,,A,,--./01F23445677K7789:;  !7!"!"#$$:$%&'=()*+,A,-../01F12334454456K7789 ! 7!"#$:$%&'='()*)*+@,--.-/011E12343456K7878899 7!"#"#$:$%$%&'=''()*+@,-,,--./0E1233445I788 7!"!!"#:#$%&''='()*)*++@+,-,,-/0E123345I5678! 7!"!"#""#9#$%&''<'()*++@+,--./00D012345J5577<==Q?>?@A@BCCDDWEEFGGFHIJK^KLLMNNOOPQQcRRSTUUVgVWWXWXXYZ[\k\];<;<=Q>?@@ABABBCBCWEFFGGH IHIJIJJ]KLMNONPQPbQQRSTUVhVVWXYZZ[Zl]\];<P==?>?@ABCCDVDEFHIIJ\KLMNOPQPbQRSTUTUVgVVWWXWXYZ[kZ\\[]99;<<=P=>>=?A@BCCVCDEFFGHIIK\KMNOPbQSTUVgVWWXWXYZZYZlZ\]899::;<??@AABVDCDEFGGHGHII[JKKLLM NMNNOPOOPQbPQRRSTUVgVWVWXWYYXYZk\\ZZ]89:;=>?@?@@ABVCCDEFGHI[JKMLLMNNOOPaPPQRRQRSTUTTUUgVWXYZkZ[Z]\]89:;O<=>?@@ABUBCDEFFGHI[IJJKLLMNOOPaPPQRSTTUTTgVWXYZjZ[Z\[]^87899::;O<=?>?@@ABUBCDDEFFGGH[JJIKLKLMNOPaPQRSTUUgVWXYXYjYZZ[\[\\]7789899;O;<==>>?@ABUBCCEFHZHIJIKLLMNOaPQRRSTUeUVWXYjYZ\Z[\\]789:;;O;;<=>?@ABUBCDEFGGHHZHHIJJKLMN`PQRRSTTeUUVWVWWXYiYYZ[]\\]]6789:;N;;<=>?@@ATABCDDEFFGHZHIJIJKMN`OPQSRRSTeTTUVWVWXXYiYZ[\]567899:N;<=>=>>?@@TABCCDDEFFGHGZHIJJKL MLMNMMN_NOOPQRRQRRSeTUVWXWYYiYZ[Z[\5667787899:N;<==>>?@SABCDDEFZHIIJJKLLM`NNOOPQRSdTUVWXWYXXiYZYZ[Z\[]57899M9:;<=>=?@S@AABCCDDEFFYGHIJKLM_NNOOPQQRSRSdSTUVWWXXYXiYZ[IIJKLWMNOPR\SSTUVWX YbZYZZ[ZZ[\\]^^_h__``abcdlddefghgghqiijijkl5678L99:;<==>=>??R?@ABCEFEYGHIIJJKLM_MMNNOPQQRSdSTTUUTVWVVWXhXXYZ567678L89:;<==>>?R??@ABCDEXFFGGHIJIKL M_MMNNONOOPQQRdSTUVWWXhWXYZ5 66778788L899:;<==>?>Q??@A@ACBCCEXFGGHIIJKJKL_MNPQRSdSTTUVWWhXYXYZ[566767877L889:9:<=<==>>R?@BCCDEEXEEFFGHIIJKKL^LMNOPQbSTUTUVWWhWWXXYXYZZ45667L8::;<<=>=>=>=Q>?@ABCCDEDWEEFGHGHIJJK^LMNNPNOPQQPQQbSTUVWhWWXY44576677L889:;;=>?@?>==Q>>?@@AAB CDCEWEFEFFGH IIJIJKK]LLMNNONOPQPQcRSRSTTUTUVUVWhWXXYZ45 767K789:;=>ABD CAA@?>=P=>?@AABCWEFGHGHIJKK]LMNOOPQbRSTUTUVgVWXY345677K879;=?BCGHIJHGECA@>Q=>=>?@@AABCWEFEEFGHIIJJ]LMNONOOPQPbQRSRSTTUVgWYXY34577K779;>AEIMPQPOMJGDA?R==>?@@AABCCVCEDEFGFHIIJJ]KLMNONNOPbQRRSTUUVVgVVWXY34566J779;@EJNSZZYUQMIDAR>=>=>?@?@@AABVDEFHII\KLLMNOPPaQPQQRSTTUUTVVgVWXXY2345K679=BGNU[gc_[UOIDT?>=>?@@ABBCVDCDEFFGFGHI[IJKMMLMNONOPaPQRSTUVUgVWWXYY22345J679=CJR[dplf_WOIWA?>==>>?@?@A@BUBCDEFGH[IJJILLKKMNONPPaPQRSTUUfVVWVWXYXXY22345 I67:>EMWal{tkbWO[DA?>==>?>?@@ABUCBCEFGGHZIIJJKMNOOaPQRSTfUVWXXWX112345 I568>FP[ft ‚ymbWaHDA?>==>?@@AABUBBCDEDEEFGGH[HIJKLMLMNO`PQSRSTUTeUVWX11223345 I558=GQ]kz Ƈ{nbhOIDA?>=>>?@AAUBBCBCEDEFGGHH[IJJKLMNOaOOPRQSTeTUUVWXW1121234 55I558=GQ^l} Ɋ{nqWOIDA?>==>?@ATBCCDDEEFEFGHZHHIIJKLLMNN`OPQRRSTSSeTUVWVVWWX122334 I558=DP^m~ ɋ||bXOIDA?>=>>?@TABCCDDEFGHZHIJIJKKLMN`NOPQPQRSTeTTUTVWVVWW1334 5I557=>>?@TABABCCDDEFZHIJKJKKMKMN_NOPQRSeTUUTUVWVW01234 H557;BLWgxʖ|nbWOIDA@>==>>?@S@@BABCDDEFYH IIJJKJLKLLM_NOPOPQRQRSdSTVUVDEFGH SHIJNSZdpÆҗ|qha[WTRQQPQQR\STTUVWXbZYZ[\]]^^_h_`abcbccddldedeegffg/0012344H4469>ENZj{Ć ɋ{nbWOHDA?>==>??R@AABCDEYFFGHIIJJKLMLM_NMNPQRSSdSTTUUTUV013233H4468==>?R?@ABCDDEXFGHGGHIJKLM_MNNOOPQRSRdSTTUUV/01223H4456:>EMXfvȆʋ|nbXOIDA?>==>??R?@@ABCCDEEXFGGHIJJKLL_MNONOPQRRcSTUUV//0122G4 68<@FP[hwɆɋ|nbWPIDA?>=>==R?@@BABCCDEWEEFFGHIJKLK^LMNNOPOPQPPQRQcSTSTUUV/0121G4 569=BHQ]ixɆʊ|nbWOIDA?>>=>Q>?@A@BCBCDWEEFGGHIJKKLK^MNOPOPQRbQSTSTTU/01F2344569=BIR]jxɆɊ{nbWOIDA?>==Q>>?@BCCDDWEFFGHGHIJKK^KLMNOPQQbRRSTSTTU./01F2 34679=BJR]jxɆɋ{nbWOIDA?>=P=>?@@A@BCDCCWEFFGFGHIJKK]LKLLMNOPOPQQcRQQSTTUT../011F123 4679=BJR]jxɆʋ|nbWOHDA?>Q=>=?@@ABCCVDEFGHJKK]KLKMNOOPbQQRRSTSTU--../011E12334579=BJR]jxɆɊ{mbWOHDA?Q==>>?@ABCCVCDEFGFGHHIHJJ\KKLMNOPbQRST-.-/0E112335579=BJR]jy҆ ʋ{nbXOIDAR>=>>?@@A@ABCBVCDDEFGFGGHII[JKKLMNOPbPQQRQRSTST-../0E123244579=BJR]jyɆ ɋ|nbWOIDT?>==>??@??@ABABUCDCDDEFGHI\JKKLLMNOPPaPQRSRS T-,-..-//0//0E122334579=BJR]jɆ ʋ|nbXOIWA?>=>>?@?A@BUBCDEFFGHI[IJJKLMNONPaPQRS,-../00E01212 44679=BJR]yxɆ ʊ|nbWOZCA>>=>>? @@ABABUBBCDCDEFGHGHZIJJKKLMNOOaPQQRRQRS,--./D001223 5579=BJRmjyʆ Ɋzm`V^GB@>=>=>??@?@@BBAUBBCDDEFGHZIJJKLLMNaPQRSRSS+,--./D012 34679=BJd]lzˆ Ɉxj]dKEA>=>?@ AUBBCBCDCDEFFGHHZHHIIJJKLMLMN`OPQR+,-.-/D012234467:=B\S^l}̆ȃsehNGB?=<=<=>?>?@@ASABCDCDEFGGHZHIJKLMNOaPQQPQS++,-,.//0D/01212233467:=UJUbq͆{kmRID?=<==>?@@SABCCDEFHGZHIIJKLLMNN_OOPQR+,--.-../D/0123 467:RENZiz͆ppTKE?=<=?>>?@SAABCDEF ZHHIHHIJIJKLLMNN_NNOOPQR+,-../D//012234568PBKVdv͆rULE@=<= >>?@?@S@AABCCDDEFZGHIJJKLLKM_NNOPOPQ@ABCNDEFEEFFGHIJLYU]gtԆyf]WSPOPQR\STUVWXYbYZ[Z[[\]^^_h__``abc**+,-C/01 23569QDNZiz̆ ooSJC?=;<;;<<= >=>??R?@A@ABDEFXFGH IJJIJKKMLMM_MNOPQ*+,,-.C./01 22357=UJTbq̆zilPGA=<;<==>?R?@A@BCCDDEXFGFGGHIJJKKM_MNOOPQ*+,-B../01 2347:A[R^l|ˆ ȂrbgLE@=;:;<=>R??@@ABCDCEXEFFGHIJJKL_MNPOP*+,-B-../0 11246:@Gb]jyʆɇwh[aHB><<::;;<;<=>>R?@@ABCEWEFFGGHIJJKLL_MNNOOP*+,+,B--./0/01246:?FPliwɆ Ɉyj^R\C?<:;<=Q>?@@A@BABCDEWEEFGHIJJKLK^LMNNONOPP))*+,,A-,-../ 00235:?FPZwvȆ ɉyk_TKW@=;:9::;<=Q=>?@@AABCDWEFFGGHIK^LMNNOOPO))* ++,+,,A,,--/./ 01359?FO[hȆ ɇxj^SKDS=::989:;<=Q=>>?@ABCCDDWEFHIJK]KLLMNNPOO))*+*+,,A,-.-.//1248>EOZgvȆ ɇxj]SJD?O:989::;<=P==>?@?@@BCVDEFGHIJ\KLKLMNO)*)**+*+,A,,-,,-./0248>ENYfuІɇxj]RJC?>?@@AABCCVCEFGGHIJ]KKLMNNO()*+A+, -..048=DNYgudž ɇxj]RJB=:9L7899::;<?@@AABCVCDEFGGHII]JJKLMNN()*+@++, -.036=DMYfudž ɇxj]RJB=:88J6789::;==>?@AABCVCDDEFGGHI[JJKLKLLMN(()*+*++@+, -./27;CMYfudžɇwi]RIB=:866J667899:;O<=?>?@A@@BBCUCEDEFGGHHIHH[IIJKKLLMLM()()*@++,,..25;BLWftdžȆwh]QIB=:8655I5567899:;O<<==<==>? @@AABBUBCCDCCEFGH[HJKJKLLM(())()*+@+ -.14:AKVdtdž ȅvh[PIB=9765I5767 889899::;;N;<=>?@@AUBBCDEFGFGH[HIJKKLM'()**)**@*+,-/38?ITbrƆȅvg[PG@;9765455I55678:;;O;;<=? @@AAUBBCBCCDDEF GFHH[IHJIJJKKLMM'()()* ?*+,-15>?@ATBCDDEFFGGHZHHIJKKL''()**?**,.28@LZj{Æ ȅufZOF?:7654I566789:;N;<==>>?@@T@ABCDCDEFGHZHHIHIJJLLKL''() *)?**,/4?@?S@BCDCEFGZGHIJKKLL'()() ?**,06?KZj ʄufYNE>96432334I5678989M;<=<=?S@ABCBCDEFYGHIJK <<=<==>=>=> J?@BELU`o ʖui_WQLIHGFGHSIJJKJKKLWMMNOPR\SSTTUVVWXXcZ[Z[\[\\]&'( )())?**-2:ERbu ǃeYMD=853212344H5445678M9;::;<==>>?S?@@ABABCDEYGHIIJIK&'(()())?)*-3;ETdv ǃstWMD=853210123H456678L9:;<=>?R??@AABCEFXFFGHIJJ&&'&'( )>)*-3;GTcu ƃregKC=84211012G456678L9::;<=>>R?@ABCCDEXFFHGHIJI&'('(()=)*-3;FRaq rdW]B;7420122G33456556678L89::;<=>R??@?@@A BBCBCCDDEEWEFGHII%&'('( >()-29CP\kyocVKT;73200/0/012G4334454567L899::;<=Q?@A@ABCCDEWEEFFGHIHI%&'( >()-18BLVb pj`VKBN621//./012F22345656677K899:9;<=Q>>?@ABCCDCEWEFGGHI%%&'(>()+06>GOYfa[SJA:I1/.-/00101F223345677K77899:;<=P>=>?@AAB CCDVEEFEFFGGH%&'&'(=((+/4:AHOZWSNGA95E/.-./011F223457K77899;:;<P==>>?@@AABCCVEFGFGGH%&'=((*-26;@FNMKGC>951C.-,,-/./0 1E112343345655K778989:;<P<=>?A@ABCWDDEFFHGHH%&'=((*,026:>ACC@=:730.B,-../ 0/0011E11223456J7899::;<O<==>=>?@ABCVCDDEFGFGGH%&'&''<'')+-/2479::86420.,A+,-/./0E12323456I7899:;<?@@AAB VDCCDDEEFEFH%&%&''<''(*+-/02343210/-,+@,--/0E122345I67899:;O<<=<=?>?@ABUCEFEFG$$%& '<''()*+,-./.--,,+*@+,-../00D012122345I667899::;:;;O<=>?@BUBBCDEFG$$%$%&'<')**+,+**?+,--../0D011245I566789:;O<<=>?>?@ABUBBCDDEEFEFF$%&<'(())*@+,--../0D12 34455676778L89:;<==>>R?@?@?@?@?@?@AAUBCCDDE$%&;&'()**@*+,-..//0E2245689::<<==>?R?A?@ABCDEWE DCCA@@A@@?@@ATBCDEEF$%&<&&'('()*?**+,-./0E3569<>@BCDEFGHZHIJKLM_N MMLKIGEDBAA@ATAABCDDE#$%&&;&'('()?*+,-/1G57;>BFJMNPQRSSTUUfUVWXXYYjZYWVSPNJGECBA@??@S@@ABCDEE##$%;&'()*?*+,- 01H7;?EKPVZ]_abcddeeteffghhxiihgeb_[VQLHEBA@?S@ABCBCEE99:9:;F;<=>=>I?@?@ABDGTNSY_gnty}{vpic^ZVTSR\STTUVVWW#$%;%&'()())?))*+,-/3L=DMWbmu}}ulaXQJFA?>??R?@AABCCD#$%;&%&'()?)*+,-/3M@JUbl`VMGB@?R??@BCCD"#$ %%;%&&%&&'&'()>)*+ ,,-/4NCN[jsfZPHC@>R??@ABCC"#$%;%&'&'(()((>)*+*+ ,,-/4OEQ_p yi]RIC?>==R?@BC""#$%$%;%&'(>)()*+ ,+,/4PERar {k^SJC@==>Q>?@AB"#$:%&'&'((>)**+*+,/4OERar{k^RJC?=Q>>?@@AB"#$%:$$%&'(=())*)*+,.3NDP_o xi\RHB>=<=P>>?@@AABB"#$$:$%&'(=(()()* ++,.2MBMZi rdYOGB><<=P==>?@@AAB"#$$:$%&'=()*)*+,-1K>GS`i^TLEA><P=>=>>?@A"#$$:$%&%&'=()*++-0I:BKUajt{{si_VNHC?=<O<==>=>?@@AA"!"#"##$##9$%&'=''()*+,.F7=;;>?@A!!"#:$%$$%&''&'<''()*+,-D37?@!"#9#$%&'&'<'()*+-C137:?CFIJLNOPQQbQRSSTUfUUVUTROMJFB@>=<;?!"#9#$%&''<'()*,A.0247:<=??AABBCDVDDEFGHZHIHGFEC@?=;O<=>>??@!"#9##$%&<'()* A,-/013455679:N:;=<=> ??R??@?@?>>=<;:9::;;N;;<==>?>??!"9#$%&;&'()*?+,,--.//01123G33456678L89899;:N;;<=>>?!"#8#$%$$%&;&&'()*?*++,-../E00101223445I566789;N;<=>> !"!"#8#$%&<&&'()?*+,--./D01234454I56789N;<=> !"!"8"#$%&;&'&'()?*+,+,--.D/01234H5667899M::;<==>78C9:9:;F;<==>=>?J?@??@ABNDEFGGHSHIJIKLMLWNMNOP !"8"#$%;&'&'()?)*+,-.C/012324H456778L9:9;< !"8"#$%$$%%;&%%&'()>))*+,-C/01233H45678L899::;;<== ! !"8"#$#$%%;%%&'('()>)*+,-,-B-../0123G45 656778788L89:;:;< !""8"#$%;%&%&'(>)*+,-B--/./012H45667L899:;< !7"#"#$#$;%&%&'(>()**+,A--./010122G233456567L8 9:9:;;<; !7"#$;%&%&' ('((=(())*))*+,,A,--../012F2345667K7899:; !7"#"#$:$$%%&&%& ''(''((=(()*+,,B-.-/0//012F234565677K789::; !7!!"#$#$$:$%&'=(()()*+*+,A,--../01E2334567K7789; ! ! !7!"#$#$:$$%&'&'=()*+A,-./0/011F112345656K7789899 !7!"#$:$%&'='()*+@,-/./01E1223345J678 !7!"#"#:$%$%&'<'()*+@,+,.-../0E12345J67889 7!"#9$%&'='()*++@++,-./0E123345J678 6!"#"#9$#$%&''<''()*+@+,-../0E012334345I5677<<=P>?@AABCDCEWEFGHIJK]LLMNONPQcQRSTSTUVgWXWXYZYZ[\Zk];<=Q=>>?@BCDCVEFFGHGHIIJKK]KLLMNMNNOOPbQQRRSTTUUVgVVWWXWXXYZ[l[[\];<P==>?@ABCCDWCEFFGGHIIKJ]KKLLMNOOPQbQRSTTUVgVWXXYZ[kZ\[]^9::;<?@@A@BCBCWCEFFGHGHIIJI[JKKMLLMMNNMNNOPbQRRSTUVgVVWXXYYXYZjZ\\[\]9 :;;<;<>?@AABABVCCDDEFGHI[JKLMNOPOPQbPPQRSRRSTSTUTUVgVWXWXXYZZkZZ[[]\]9889::;?@A@ABUCCDEDE FFGFHHIHHI\JKLLMN POPPbPPQQRQRSTTSTUTUUgVWWVXWXWYZZjZ[[Z\\]89:;O<==>?@AA@BUBDCCEFFGGHII[IJKLKKMNNONOPaPQRSTUfVWVWXYjZ\[\]789:;O<=>>?@@ABUBBCDEFGGH[IIJKLMNOPaPQRRSTfVWWVWXYjZ[Z]7789:9:;;O<=>?@@ABBUBBCDDEFFGHZHIIJKKLMLMNNONaPQRRSTfTUVWXWXYjYZ\Z]789::;;O;;<==>?@@ABUBCEDEFGHHZHHIJKIKLMNNO`PQRSTTfUVWXY jYYZYZZ[[]Z]6778789:;N;<=>>?@TABCDEFGGHZHHIKLMN`NOPQPQQRSTTeTUUVWXYYiYZ]Z]]\]]6789::N;<=>?@SBCDEFGZHIJKKLM`ONPQPQRRSeTUVWXYiY Z[ZZ\Z]]56789M;< =?>=??@@AT@BCDCEFFGZGHIJIJJKLLMN_NNOOPQSdTTUVUUVWVWXYiY ZYYZ[[Z\]556767899N::;<=>?>>?S@AABCCDCEFEFGZHGHIIJJKMLM_MNNOPQQRSdTSTTUVUVWiYZYZZ[Z\ZIJJKLWMNOPQR\STSTUVWXYbZ[[\]]^__h_a`aabaabcdmdeffgghgghghiqijkkm56678M99;< =>>=>??R@@A@ABCDEXFGHIIJKJKLMM_MMNNOPQRSdSSTUUVUVWWXhYZYZZ\5678L89::;<=>?R??@BCBDEXFGHIKJJKLM_MMNOPQQRQRSdSTUTVUVWXhYXXYZZ[56788L8899::;<=>>?R?@AABCDDEXEFFGGHIHIIJKKLL^MNONPQRRQSdSTTUTVUVWXhWXYZZ57 8L8899:;;<=<=>>R?@BCDEXEEFGHIIJIKL_MNOPQPQQRdSTVUVWhWWXYZ445667L8:=>>=>==>Q?@@ABCCDCDEWEEFGGHIJJKK]LMNOOPQcRSTUUVWVgWYXXYZ445767 L889:;;=>?@A@?> =P>>??@?@@ABABCDWEEFEFFHIIJJKK]LMNOPQPQRcRSSTSSTVgWWYXY445667K879:;=>@CCDDCBA@?>=Q>=?@AABCCDWDEFGGHIHIJK]LMNNOPbRSTUTUVgWXXWXY45667K779:=>BDFIJJHGECA?>Q=>>?@ABCDVEFGHIIJ]LLMNOOPQbQQRQSTTUUVgVWVWXWXY34577J778;>AEHLPQQOMJGDA?Q==>?@?@BCVCEFFGFHIIJ\KLMNONOOPbQQRRSTTU VUVgVVWVWXXWXY23456J779<@DINSZZXURMIDAR>==>?@ABVCCEFFGHIIJ]JKLLMNNO NOPPbPPQRRSRSTTUTUUVVgV WWXWXYXYY23345I77:=BGNT[fd`[UNIDT?>==>>?@ABUCDDEFGH II\IJKKLLKMNNOOPPaPPQRRSTUTUgVW XWWXXY232345I579=CKR[dqlf`WOIWA?>=>=>>?@@BABUCCDEFGHI[JKLMNPPbPPQRSTUUTgVWXWX2345 I56:>FNWalztkbWO[DA?>==>>?@BBUBBCCDEFGHI[IKJKLM NNOPOaPPQPQRRSTUfUVW123345 I569>FP[gt‚xnbX`IDA?>>==>?@@ABBUBBCDEFEFGGH[IJJKLLKLMNaPQRSTSTeVWVWX112345 I568>FQ]kzƇ{mbhOIDA?>=>==>?@ABUBCEFGHHZHIJJKKLMN`PQQSRSTSTTeUTVWX1234 55I558>ER^l}Ȋ{nqWOHDA?>==>?>??@ATBCCDCEFGHZHIIJJKMN`PQRSRSTSeTUVWX122334 55I558=EP]m~ɋ{|bWOIDA?>==>>?@TBCDEFGGZHIIJIKLLMN`NOPQQRRSTeTUVWVW12234 I557=>=>>?@SABCDEFZGHIKJKKMLLM_NOPQRSdTUV00122324 I557;BLXgxʖ{nbXOIDA?>=>=>>?SABCCDDEFFGZGHIJKJKKLKLM_NOOPQQRSdTUVWEFGGH SIIJNSZdpÆҗ}rha[WTSQQPQQR\STUVWXWXYcYZ\ ]^]]^__h__`a`ababcdmdefgfg/01121223234H4469>ENZjzĆʋ|nbXOIDA?>==>?R@AABCDEYFFGHIJKLLMM_MMNOPQ RRSSdSSTSTUV01223 H4458= >>?R??@@AABCDEXFGHIKLLKM_MMNOPQRRSRdSTVVUVV//01233G4457:>EMXeuȆɋ|nbXOHDA?>==>>?R?@A@BCDEEXFFGFGHIKLL^MNONOPQQRQRcSTTUTTV/0122H34567;@FP[hwɆ ɋ{nbXOHDA?>=?R?@AABCCEXFEFFGGHIJKKLL^LMNNOPQcRSTUUTTVV/012G334569=BHQ]ixɆɋ{nbWOIDA?>==>Q>?@BCCDEWEFGHIJJKKL]LLMNOOPQRQbRRSTUUTVV./01F2334579=BIR]jyɆɊ{nbWOIDA?>=>P>?@@ABCEWEFFGHGHIJJK^KLMNMNNOPQQcRSTUU./01F22344679=BJR]jxɆʊ{nbWPHDA?>=P>=?@A@BABCDEWEFHIIJKK]KLLMNNOPbQRRSTU./01F122344679=BJR]jyɆ ʋ{nbWOIDA?>Q=>?@ABCDVDEFGHIIJJ]LKKLMNNONOPbQQRRSTSTT-./011F1122334679=BJR]jyɆʋ{nbWOHDA?Q=>=?>?@AABCCVEFGFGGHHI]KLLMNOPbQRRST--./00100F112344579=BJR]jx҆ʋ{mbXOIDAR>=>>?@ABVCCEFGFHI \JKKLKMLMMNMNNOPbPPQSTT,--../0E12 34579=BJR]jxɆʊ|nbXOHDT?>=>=>>?@AABVCDEFGHII\IJKLMNNOOPbPPQRST,,-.-./0E012 3467:=BJR]jɆ ɋ{nbWOIWA?>=>?@ABUCCDEFGGHI[IJJKLMNNOPaPPQPQRS,,--./00E123 4579=BJR]yxʆ ɋ{mbWOZDA?>=>>?@ABBUBCDEFHGGH[IIJKJKKLMNOOPaPQQRS,-../00D100122335589=BJRmjyɆ ʊ{m`V_GB@>=>>?@ABUBCCDDEFEFGFGH[IJJKKLMNMNNOOaPQQRQRRSS,-../0D01121123324679=BJd]kyˆ Ɉxj]dJEA>><=>>?@@AAUBCDDE FFGGHH[HHIIJJKLKMN`OPRRQRRS++,-/D0122345679=B\S^l}̆ ȄteiNHB?=<<=>?@?@UBCDEFGHHZIHIJJKKLKLMNaPQR,-./D/012334679>UJUbr͆{kmRID?=<=>=>?@TAABCDEDEEFGHZHIJKLKLMLMN_OPOPQR+,-./D//001012233467:RENZiz͆ppTKD@=<==?>>??@SABCDEFFGYGHIIJKLM_OPQRQR+,-//D//0122323569PBKVdv͆sWKE@=<=<==>?@S@AABCDDE FFGZGHHIHHIJKKLLM_NONOOPQPPQQ@ABCBCNDEFGHHJLZU]gtԆyf]WSPOPQQR\RTSUTUVWXbYYZ[[\]]^^_h_``aababb*+,-/C./01 23469QDMZiz̆ooTID?=;<=>?R?@@ABCCDDEFYFFGHI JJKLKLLMM_MNOOPQQ**+,--C./01 2368<;<= >=??R?@@AA@BCDCDEXFGHIJIJKLLM_MNMNOP*+,-B-./01 356:A[R^l|ˆȂrbgLE@=;<=>R?@AABCDDEXEFHIIJKKLL^MNOOP*+,+,B./00/0 1346:@Hb]jyʆ ɇvg[aHB>;:;< =>==R>@??@A@ABCEXEFGHIJKKL_MNMMNOP)*+,+,B--../0 1246:?GPlixɆʉyj^S\C?<::9::;<=R>?@ABCDWEEFGGHIJJK^LLMMNMNONOOPP)*+,A,--././ 002459?FP[wvȆ Ɉxk_TKW@=::9:;<==Q>>?@@AABCDWEFGGHIJJKK]LMNOP))*+,A,-/ 01359?FOZgȆɇxj^SKDS<;:98899;<=P=?@@ABABCDEWEFGH IIJIJK]LKLMNOO)*+,A,-.-../1249>ENZgvȆ ɇxj]SJD?O;9899::;<P>==>?@A@ABCCWDEEFEFGGHJJK]LKLMNOO)*+,A,- ..0248>ENZgvІ ɇxj]RJC>?@ABCVDEDEFFGGHIJ]JKKMN()*+A+,--./048=DNYgvdž ɇxj]RJB>:9L789;::;<>?@AABCVCEDEFFGGHIIJ\JKLMLMN()*+*+@++,,--.026=DMYfudž ɇxj]RJB=:86J789;<=?@ABUCDEEDEFGGHIHI[JKLMNMN()*++@+, -.027?@@AABUBCCDDEFGGHI[JIJKKLMN()*+*@+ ,..15;CKXftdžȆwh]QIB=98655I567899:;O<=?>?@@AABBUBCDDEFH[IIJKKLLM()*@+ -.049AKVdsdž Ȇvh[PGB<9765I56789::;:;;N;<=>?@@ABAUBBCDCEFGGHZHIIJJKLLM('()*@*+,-/38?HTbrƆ ȅvhZPGA<9765I566789:9;O;<=?>?@AAUBBCEFGGHHZHIJJKLM()* @**,.05==>?@ABTBCCDDE FFGGHZHHIIJIIKLMM''()**@**,.38ALZj{Æ ȅvgZOF?:754I5767899:N;<<=<<=>>?@@SABDCDDEFFGZHIJJKKLL'() *?**+/4?S@BCEDEDEFHYHIJK'() ?**,06?KYj ʄtfYNE?964322344H567899M:;<=<==>?S@AABCDEDEFFGZGGHIIJJK<=> ??I?@AFLU`o ʖui_WQLIHGFGHRHIJKLWMNOPQR\SSTTUVWXaZYZ[\\]&'() ?)*,2:DRbu ǃfYMD=8532122334H4456678L9:;<=>>??R?@@BCBCDEDEFXFGHIIJ&'(()() >)*-2:FTdv ǃstXLD=85321012233H445678L99::;<=>??R? @BAABBCBCCDEDEXFFGHIJJ&'( )(>)*-3;FTdt ƂsdhLB=842101223H4576788L889:9;<=>>R??@BABCDEXFFGFGHIIKI&'( )>)),2;FRaprcW]C;64210//012123H3456678L889::;<<=<=>=>Q?@AABCEDDEEXEFGHI&'( >)),2:DP\k yocVKT;73100/01212F345657L89:;<=>=Q>?@AABCEEWEFGHGHII&'( >(),18ALVb qj`UKAN6200/./01F233457K899:;<=Q>>?@AABCCDCWEFFGHI%&%&'((=()+06>GPYfa[SJA:I1/..--/01F1233456677K87899::;<=P>??@?@ABCDWEFFGH%&'(=()+/4:AGOZWSNGA95E/.-,-.-/0/011F234345677K77899:;;<P=>?@@BABCCVEFGFFGH%&'=((*-16;AFMMKGC>940C.-,,-.-/011F12324566K7899::;;<;<P==>>?@@ABCVDDEFGH%&'='(*,/26:>BCC@=:730.B,-./01E112334566K789;<?@@ABCVCDDEFHH%&%&'<'()+-/2479:986420.,A,--./0E112123345J6789:;=>>??@?@@ABCUCDCCEFGG%&''='()*+-/02343210/-,,@+,-./0E12245I567899:;?@@AB@BUBCDEFG$$%%&%&'&<''()*+,-.//..--,,++@+,--./0 E10112123245I66789;O<==>?@ABUBBCCDEGF$%&<'())*+,+**@+,--./00D10012344545I566789::;P<=>>?>?@@ABUBCBCDEF$$%$%&<'(())*?+,--../0E12334456678L89:;<=<=>>Q?@?@?@AUBCCDDEF$%&;&'()()**?+*+,+,-./0E2245689::;=<=>??R?@?@ABCCDDEWE DDCCAB@A@??@UBCE$%&%&&;&&'()**?**+,+,-.//0F3579<>@BCDEFGHHZHIIJKLLM_N MMKJIGEDCBAA?@SAABCCDCE$%$%&&;&'()()?*+,-../1G57;?CFJMOPQRRTUUfUVUVWWXWXXYXjZYWVSQNJGECBA@??@SAABCDE#$%&;&'()?**+*+,- /1H7;@EKPVY]`abdcdtefgfghxhgeb_[VQLHECA@??@S@@BABCDCDEE9:;F;;<=>?J?@ABDETNSY`gnty} {vpjc^ZVTR\SSTTUVWV#$%;%&&'&'&'()?))*+,--/2K=DMWclu}}ulbXQJFA@?R?@@A@BCCEC#$%$%;%&'())>))*+,-/3MAJUbl`VNGB@?R?@AABCCD"#$%;%&'()>)*+ ,,-/4NCN[jsfZQID@>=>R??@@AABC#$%;%&'(>)*)*+,/4OEQ_p yi]RIC?==>Q?@ABAB"#$;%&'&'(>)*+,,/5PERar {k^SJC?==>Q?@AB"#$#$:%&'&'(>()*+,,/4OERas {k^SJC?=<=Q>>?@AAB"#$:$%&'(('>()*+,,.3NDP^o xi\QHB?<<=Q==?@@ABB"#$:$%&'('=(()()*)*+,.3MBMZirdYOGB>=<?@@BAA"#$:$%$%&%&'=()*++.1K>HT` j^TLEA><<=P<=>?A"#$:$%&%&'&'&'=()*+-0I:BKUajt{{si_WNHC?=;<?@A@"#"#:$%&'=''()*+,/G7=CKS[bhlprstutuuuvvuvwxxxwvsojd]VOIDA>=<O<=?@A!!"#"#$#$:$%&''<'()*,-D37>?@!"!"#9#$%&''<'()*+,C037:?CEIKLOOPQQbQRSTUTUfUVVUSROMJFB@><<;>?@@!!"!"#9#$%$%&'<'()*,A.0247:<=??AACBCDDWDDEFFGHZI HHGFDB@>=<;O;<=?>?!"!"##9#$%&<'()* +A--.013456679:9M:;<=<=>?R??@>=<;:9::;N;;<==>?>??!"##9##$%&<&'()*@+,,-./011233G345565667878L89:9:989:9;N;<==>?!"#9#$%&&;&&'()*?**+,-..//0D01233455I5678789N;;<;<=<==>? !""!"9"#$#$%$%$%&%;&'()*?*+,+,-/D/01234I5678789:M;<==>=!"8""#$%$$%;&'()()?*+,-./D/0/01224I5789M9:;<=<==678C889::9:;F;<;<=>I?@ABCNDEFGHSHIKLWMMNOP !"8"#$%;%&'()?)*+,-C/01234H4456578M99:;<= ! !""8"#$%%;&%&'()?))*+,--C-/012233H456678L9::;;<;< !"!8"#$%%;%&'()>))*)*+,-C.-/012233F457878L889:;< !8"#$;%&%%&'(>)*+,B-.-./0123H3456788L8899:;< ! !8"#$;%&'(>()*++,,+,B--./012G3445656678L899::;<; !8"#$:%&'&'(>)()*+,A-,--./012F2434567K899::; !7!!"#$:$%&'&'(=(()*+,B,,-./01F2234345677K7889889:;; !7"!!"#"#$:$%&'=()*+,A,-./01011F22345677K87789:; !7!"#$:$%&%&'=()*+@,-.-/01F1122334566J789 !7!""!"#$:$%&'='()*+A,--../0011E11233456J7899 !7!"#9$%&'=''()()*+@+,-../0E132334454456J678788 ! 6!"!"#9$%&''<''()*++@++,-/../0E123443445I57 7!"#9##$%&'<'('()*@++,+,--/./0E001323345I5577ih32&;;?@ABBKEEFGHIJRLMMNOPWQRSTTUV]WWXY`[\]8:;?@ABJDEEFGHIQKLMMNOWQQRSSTU\VWXXYY`[\]]789:;C<=>?@AIBDEEFGHPJKLMMNVPQRRSST[VVWXXY_ZZ\]]7789:B;<=>?@HBBCDEFGOIJKLMNUOPQQSSTZUVVWWX_YZZ\\67789A;;<=>?GABCCEEFNHIIKLMTNOPPRRSZTUVVWX^YYZ[[<=>??FABCDDELGHIJKLLSNOOQRSYTUVVWXY_Z[\\]]c__``a45677@9:;<<=E?@ABNCDDLFGHIJKSMMNOPPRYSSTUVV]XXYYZ44567?8;=??>D>?@ABCCLEFGHIIRLMMNOPPXRSSTUV]WWXYY4-56>8>EKICF=>?@ABBKEEFGHIPKLMMNOPWRRSSTU\VWWXY345=9DUaSL?=>?@ABJDEEFGHOJKLMMOOWPQRSST\VVWWX13445<9Jfp\E>=>?@AICDEEFGOIJKLMMNVPQRRSS[UVVWX12344<8LoxUE>=>?@HBCCEEFNHIJKLMMUOPQQRSZTUVVW899:;B?Npx\KFDEFMHIJKLLSNOPPRSTYUVVWXY^ZZ[\\00123;6@ZtUE>=>F@ABCDDLFGHIJKLTMNOPPRYSSTUV/0012:49HesUE>=E?@ABBCLEFGHIJKSMMNOPQXRSSTU./001935;JfsUE>D>?@ABBKEEFGHIJQLMMNOPWQRSST-./009135;JftUEF=>?@ABIDEEFGHIPKLMMNPVPRRSS,-./081235;JlsUK>=>?@AIBDEEFGHOJKLMMNVPPQRS,,-./701135;QgpWA==>?@HBBCEEFGOIJKLMMUOPPQR+,,-.7001235CMqdE=<=>?GABCDEEFNHIJKLMTNOPQQ23445=77899;FOosLDCCDFLGHIJJLLSNOOPRSYTUVWW*++,,5./0015GW\A;;<<=E?@ABBCDLFGHIJKSMMNOP)*++,4-./04>Z{_M<9:;;??ABBDKEFGHIJQLMMNO))**+4,-/2?@ABCKEEFGHIQKLMMN())*+3,-17789:;C<=>?@ABJDEEFGHOJKLMM(())*2+/9Px\E95<67789:B;<=>?@AIBDEEFGOIJKLM'(())2,4Hr[C754<567789A;;<=>?@HBBDEEFNHIJKL//00184BaaH=::;B<<=>??FABCCDEFLHIJKKLSNOPQR&''((1-@fY@51+2;445677@9:;;<=>F@ABCCELFGHIJ&&''(0-@b^>3011:4-567?89:;;<=E?@ABBDLEFGHI%&&''0+:RwSE1../001934-56>789:;<?@ABCKEEFGH%%&&'/*2>^D:8-,-./008134-5=7789:;?@ABJDEEFG$%%&&/(,031.3+,,-./081224<67789:;C<=>?@AIBCEEF$$%%&.'()*2*+,,-./8235678@89:;<<>F??@@?@HBCDEE#$$%%.&''(()1*++,,-/:8AHKMNUOOPQQRSZTRMFA@GABCCD+,,--4..//0081223446DMbs||n[MGLGHIJK#$$-%&&''(0))**+,.CX gL@E?@ABC"#$-%%&&''0())**+.E_ nN?D>?@AB""#,$%%&&'/(())*+-BW'eK>C=>?@A!""##,$$%%&&/'(())*+;CZkuxx~yyz{{teQC?@!!""#+$&%%&.''(())*54?!""+#$%%.&''(()*2,./012;3445678@89A;<<=>).**1++,,--4..//0018223445<77899:;B<<=>?@FABCCD !*"##$#-%&&''((1)**+,,5.//0123;445677@9:;;< !!*""##$$-%%&&''(0))*++,4-./0011:4 567?89:;< !)!""##$,$%%&&''0())*++4,-./001934 56>789:; )!!""##,$$%%&&'/(())*+3,,-.//092245=7789 )!""#+#$$%%&&/'(())*3+,,-./081124<677-;;?@ABCJEEFGHIJQLMMNOPWQRSTTUV\WWXYYZa\\]9:;?@ABJDEEFGHIQKLMMNOWPQRSTTU\VWXXYY`Z[]]789:;C<=>?@AIBDDEFGHPJKLMMNVPQQRSTT\VVWWXY_Z[\]]7789:B<<=>?@HBBDDEFGOIJKLMMUOPPQRSSZUVVWXX_YZZ\\67789B;<<=>?GABBDEEFNHIJKLMTNOPQQRSZTUVVWX_YYZ[[<=>??FABCCDELGHIJKLLSNOPQRSYTUVVWXY^Z[[\]]c^__`a45677?9:;<<=E?@ABBDELFGHIJKSMMNOPQQYSTTUVV]XXYYZ44567?8;=??>E>?@ABBDKEFGHIJRLMMNOPPXRSSTUV]WXXYY34456>9>EKICF=>?@ABCKEEFGHIQKLMMNOPWQRSSTU\VWXXY33445=9DT`SL>=>?@ABJCEEFGHOJKLMMNOVPQRSTT\VVWXX23445<9Jfq\E>=>?@AICDEEFGOIJKLMMNVPQRRSTZUVVWW11344<8LoxUE>=>?@HBBCEEFNHIJKLMMUOPQRRSZTUVVW889:;B?Npx\KFDEFMHIJJKLSNOOQRSTYUVWWXY^Z[\\]00113;6@ZsUE>=>F@ABBCELFGHIJKLTMNOPQQYSSTUV/0011:49HesUE>=E?@ABCCKEFGHIJKSMNNOPPXRSSTU./001935;JfsVE>D>?@ABCJEEFGHHJRLMMNOPWQRSST-./008235;JfsUEF=>?@ABJCEEFGHIQKLMMNOVPQRST,-./081225;JlsUK>=>?@AIBCDEFGHPJKLMMNVPQRRS,,-./701225;QgpWA==>?@HBBDDEFGOIJKLMMUOPPQR+,,-.7001135CMqdE=<=>?GABCDETEFNHIJKLMTNOPQQ23345<77889;FOosLDCCDELGHIJKLLSNOPQRSYTUVWW**+,,5./0015GW\A;<=E?@ABBCELFGHIIKSMMNOP)**+,4-./04>Z{_N<9:;<?@ABCDKEFGHIJRLMMNO))**+4,-/3?@ABBJEEFGHIPKLMMN())*+3,-1';Ry^E:>7789:;C<=>?@ABJDEEFGHPJKLMN()*2+/9Px]E95<67789:B;<=>?@AICCEEFGOIJKLM'(())2,4Hr[C844<567789B;;<=>?@HBBDDEFNHIJKL//00184BaaH=::;B<<=>?@FABCCDEFLJHIJJLLSNOOPR&''((1-@fY@41122;445677?9:;;<=>F@ABCCELFGHIJ&&''(0-@b^?40311:344567?89:;;<=E?@ABBDKEFGHI%&&''0+:RwTE1../001924-56>789:;<?@ABBJDEFGH%%&&'/*2>^D:8-,-./009234-5=7789:;?@ABJDDEFG$%%&&/(,031.3+,,-./081224<67789:;C<=>?@AICDEEF$$%%&.'()*o2++,,-./8135678@9::;<<>F??@?@@HBBCEE#$$%%.&''(()2*++,,-.:8AGKMNUOOPPQRSZTRMFB@GABBCE+,,--4..//0071223446DMbs||n[MFLGHIIK#$$-%&&''(0))**+,.CXgL@E?@ABC"##$$-%%&&''0())*++.E^ nN?D>?@AB""#,$%%&&'/(())**-BW'eK>D=>?@A!""##,$$%%&&/'(())*+;CYkuxx~yyz{{teQC?@!!""#+$&%%&.''(())*54?!""+#$%%.&''(())2,./012:3445678@89A;<<=>)5**1++,,--4..//0018233445<77889:;B<<=>?@FABCDD !!"*"##$#-%&&''((1**++,,5./00112;445677?9:;<< !!*""#$-%%&&''(0))*++,4-./0012:4567?89:;; !)"#,$%%&&''0())*++4,-.//01924 56>789:; )!"$##,$$%%&&'/(())*+3,,-./009223445=7788 )!""#+$%%&&/'(())*2+,,-./081134<678-;;?@ABBKEEFGHIJRLMMNOPWQRSTTUV\WWXYYZa[\]9:;;C=>?@ABJCDEFGHIPKLMMNOWQRRSTTU\VWXXYY`[[\]789:;C<=>?@AIBCEEFGHPJKLMMNVPQQRSST[VVWWXY_Z[\]]7789:B;<=>?@HBBDEEFGOIJKLMMUOPPQRSS[UVVWWX_YZZ\\67789A;<<=>?GABCDDEFNHIJKLMTNOPQQRSZTUVVWW^YYZ[\<=>??FBBCCDELGHIJKKLSNOOQQSYTUVVWXY^ZZ\\]]c^__`a45677?9:;<<=E?@ABNBDELFGHIJKSMMNOPQQYSSTUVV]WXYYZ44567?8;>??>E>?@ABCCKEFHHIJRLMMNOPQXRSSTUV]WXXYY456>8>EKICF=>?@ABCJEEFGHIPKLMMNOPWQRSTTU\VWWXY23445=9DTaSL>=>?@ABJDEEFGHPJKLMMNOWQQRSTT[VVWXX13445<9Jfq\E>=>?@AIBDDEFGOIJKLMMNiVPQQRSTZUVVWW11244<8KoxUE?=>?@HBBCEEFNHIJKLMMUOPQRRSZTUVVW889:;B?Npx\KFEEFMHIJKLLSNOOQRRSYUVVWXY^ZZ\00123;6@ZsUE?=>F?ABCDELFGHIJKLSMNOPPRYSSTUV/0011:49HesUE>=E?@ABBDLEFGHIJKSMMNOPPXRSTTU./001935;JfsVE>E>?@ABBKEEFG>?@ABJDEEFGHHQKLMNOOWPQS,-./081225;JlrUK>=>?@AICDEEFGHOJKLMMNVPQQRS,,-./701125;QgpWA==>?@HBBDEEFGOIJKLMMUOPQQR+,,-.7001125CMqdE=<=>?GABBCUEEFNHIJKLMTOOPQQ23345=77889;FOosLDCCDELGHIJJKLSNOOQRSYTUVWW*++,,5./0015GW\A;<=E?@ABBCELFGHIJKSMMNOP**++,4-./04>Z{_N<9:;<?@ABBDLEFGHIJRLMMNO))*++4,-/3=S~^GC889:;?@ABBKEEFGHIQKLMNN())**3,-0;Ry^E:>7789:;C<=>?@ABIDEEFGHOJKLMM(())*2+/9Px\E95<67789:B;<=>?@AICCDEFGOIJKLM'(())2,3Hr[C844<567789A;;<=>?@HBCDEEFFNHIIKL//00184BaaH=::;B<<=>??FABCCDFFLHIJKLLSNOOQQ&''((1-@fY@5113;445677@9:;<<=>F@ABCDDLFGHIJ&&''(0,@b^>30/012:4-567?89:;;<=E?@ABCDLEFGHI%&&''0+:RwTD1../001924-56>789:;;?@ABBJEEFGH%%&&'/*2>^D:8-,-./009124-5=7789:;;C=>?@ABJDEEFG$%%&&/(,031.3+,,-./081234<67789:;C<=>?@AIBCEEF$$%%&.'()*2++,,-./8135678@89:;<=>F??@HBCDEE$\%%.&''(()2**+,,-/:8AHKMNUOOPPQRRZTRMFB@GABCDE+,,--4..//0071223346DMbs||n[MGLGHIJK#$%-%&&''(0)**++,.CXgL@E?@ABB"##$$-%%&&''0())**+.E_nN?D>?@AB""##$,$%%&&'/(())*+-BW'eK>D=>?@A!""##,$$%%&&/'(())*,;CYkuxx}yyz{<{teQC?@!!""#+#$$%%&.''(())*54=CGIJQKLLMNOOVOMHA<;B;<=>?! ""+##$$%%.&''(())2,./012:3455678@9A;<<=>).**1++,,--4..//0018223345=77899;;B<<=>?@FABCDD !*"##$#-%&&''((1)*++,,5./00113;445677@9:;;< !!*""#$-%%&&''(0))*++,4-./0011:4567?89:;; !)!""#,$%%&&''0())*++4,-./00193456>789:; )!!""##,$$%%&&'/(())*+3,,-./0092245=7789 )!""#+#$$%%&&/'(())*2+,,-./081234<677il32 :;A>?ABHEFGIOLMNPURSTUZWXYY^\]89:@=>?AGDEFHMJLMNTQRSTYVWXY^[\]789?<=>?EBDEFLIJLMSPQRSXUVWX]YZ\:<=B?@ACHFGHJOLMOQUSTUV[XYZ[`]^_557=9;<=C?ABDJFHIJPMNPQVSTUV[XYZ455<:AGCB>?ABHEFHIOLMNPURSTUZWXY344:>?AGDEFHMJLMNTQRSTYVWX1349>?FBDEFLIJLMSPQRSXUVW568=?ahJCCHEGHIOLMOQUSTUV[XYZ/0186GdF>C?ABCJFHIKPMNPQVSTU./0638LdFC>?ABHEFHIOLMNPURST-./5138LdJ>>?AGDEFHMJLMNTQRS,-.40138P`A=>?FBCEFLIJLMSPQR01284568EeGAACHFGHJOLMOPUSTU*+,2./05O^>:;=C?ABCJFHIJPMNP)*+1-.3H`F99:?ABHEFHIOLMN()*0,1F_?;789:@=>?AGDEFHMJLM(()/-?~]=595789?;=>?FBDEFLIJL,-.35Y_@77=9:<=B?@ACHFGHJOLMO&'(.1Z]900184457=9:;=C?ABDJFHI%&'-.GQ<../063445<89;?ABHEFH%%&,*2721,-./51244:789:@<>?AGDEF$%%+'))*/+,-.548;?@AGCBA@FBDE))*/+,-.3/012=LdprvsstuyuhREHFGH##$*%&'(.)*+,=aBC?AB"##)%%&'-()*+<`AA>?A!"#)$%%&,(()*5D]jlpmnoosnaJ=@=>?!!"(#$%%+'(()0.357=9:;&&',())*/+,-.3/01284568=9:<=B?@A !'"##$*%&'(.)*+,2./0184457=9:< <&!"##)%%&'-()*+1-./063445<89: &!!"#)$%%&,(()*0,-./51244:78:;B>?ABHEFHIOLMNPURSTUZWXYZ_\]89:@=>?AGDEFHMJLMNTQRSTYVWXY^[\]789?<=>?FBDEFLIJLMSPPRSXUVWX]Z[\:<=B?@BCHFGHJOLMOPUSTUV[XYZ[`]^_457=9;<=C?ABDJFHIJPMNOQVSTUV[XYY455<:AGCC>?ABHEFHIOLMNPURSTUZWXY345:>?AGCEFHMJLMNTPRSTYVWX1349>?FBDEFLIJLMSPQRSXUVW568=?ahJCCHEGHIOLMOPUSTUV[XYZ/0186GdF>C?ABDIFHIJPMNPQVSTU./0638LdFB>?ABHEFHIOLMNPURST-./5138LdJ>>?AGCEFHMJLMNTQRS,-.40138P`A=>?EBDEFLIJLMSPPR01285568EeGAACHFGHJOLMOQUSTU*+,2./05N^>;;=C?ABDJFHIJQMNP)*+1-.3H`F99:;A>?ABHEFHIOLMN()*0,1F_?;789:@=>?AGDEFHMJLM(()/-?~]=595789?;=>?FBDEFLIJL,-.35Y_@78>::<=B?@ACHFGHJOLMO&'(.1Z]910184557=9:;=C?ABDIFHI%&'-.HQ<../063445<89;?ABHEFH%%&,*2721,-./51244:789:@=>?AGDEF$%%+'()*/+,-.548;?@AGCB@@FBDE))*/+,-.3/012=LdoqvsstuyuhREHEGH##$*%&'(.)*+,=aBC?AB"##*$%&'-()*+<aAA>?A!"#)$%%&,'()*5D]jlpmnoosnaJ=@=>?!!"(#$%%+'(()0.357=9:;&&',())*/+,-.3/01285568=9:<=B?@A !'"##$*%&'(.)*+,2./0184457=9:< <&""##)%%&'-()*+1-./062445<89: &!!"#)$%%&,(()*0,-./51245:78:;A>?ABHEFHIOLMNPURSTUZWXYY_\]89:@<>?AGCEFHMJLMNTQRSTYVWXY^[\]789?<=>?FBDEFLIJLMSPQRSXUVWX]Y[\:<=B?@BCHFGHIOLMOPUSTUV[XYZ[`]^_457=9;<=C?ABDIFHIJPMNPQVSTUV[XYY455<:BGCC>?ABHEFHIOLMNPURSTUZWXY244:>?AGDEFHMJLMNTQRSTYVWX124:>?FBCEFLIKLMSPPRSXUVW568=?ahJCCHEGHIOLMOPUSTUV[XYZ/0186GdF>C?ABDJFHIJPMNPQVSTU./0638LdFC>?ABHEFHIOLMNPURST-./5138LdJ>>?AGDEFHMJLMNTPRS,-.40138P`A=>?FBDEFLIJLMSPQR01285568EeGABCHFGHJOLMOQUSTU*+,2./05O^>:;=C?ABDJFHIJPMNP)*+1-.4H`F99;?ABHEFHIOLMN()*0,1F_?;789:@=>?AGDEFHMJLM(()/-?~]=595789?;=>?FBDEFLIJL,-.35Y_@78=9:<=B?@ACHFGHJOLMO&'(.1[]900184557=9:<=C?ABDJFHI%&'-.HQ<../063445<89:?ABHEFH%%&,*2721,-./51345:789:@=>?AGCEF$%%+'()*/+,-.548;?@AGCBA@FBDE))*/+,-.3/012=LdorvsstuyuhREHFGH##$*%&'(.)*+,=aBC?AB"##)%%&'-()*+<aAA>?A!"#)$%%&,(()*5D]jlpmnootnaJ=@=>?!!"(#$%%+'(()0.357=9:;&&',())*/+,-.3/01284568=9:<=B?@A !'"##$*%&'(.)*+,2./0184557=9:; <&!"##)%%&'-()*+1-./063445<89: &!!"#)$%%&,(()*0,-./51344:78is32"9>>AFFKLNSSWWY]\9>>@EFKKNSSWWY]]59CDFKLQQSWW37GػNCCFKKPQSWW.34UںN>AFFKLNSS.336`A@EFKKNSS*..8q;;@AFFINN(-2n:79>>CDFKL).Fn6779>>CCFKK%)4Y2.!33599>>AFF'+*+/.5GVZZ^YFEF#'%'+*4‚2Q@A!%$%)(.APUTXR?>>#'%'+).-.33779>> #!#'%)(*..33599"9>>AFFKLNSSWWY]\9>>AEFKKNSSWWY]]59CDFKLPQSWW37GػNCCFKKPPSWW.34UںN>AFFKLNSS.336`A@EFKKNSS*..8q;<@AFFINN(-2n:79>>CDFKL).Fn6779>>CCFKK%)4Y2.!32599>>AFF'+*+/.5GVZZ^YFEF#'%'+*4‚2Q@A!%$%)(.@PUTXR?>>#'%'+).-.33779>> #!#'%*(*..32599"9>>AFFKLNSSWWY]\9>>AEFKKNSSWWY]]59CDFKLPQSWW37GػNCCFKKPQSWW.34UںN>AFFKLNSS.336`A@EFKKNSS*..8q;<@AFFINN(-2n:79>>CDFKL*.Fn6779>>CCFKK%)4Y2.!33599>>AFF'+*+/.5GVZZ^YFEF#'%'+*4‚2Q@A!%$%)(.APUTXR?>>#'%'+).-.33879>> #!#'%)(*..33599t8mk@6Թ6TW22::UV4477VV::::WX6ᾂ6h8mk 44aa4444cc55l8mkTTUUUUVVs8mkjjjjDisplayCAL-3.1.0.0/DisplayCAL/theme/icons/DisplayCAL-scripting-client.ico0000644000076500000000000046604212647526530025557 0ustar devwheel00000000000000 v (@@ (B00 %'  M 2^ hgPNG  IHDR\rfIDATx̽{fuv힞X|zӯ]rRmWȀ _l_bف;8 pA`dS^$]R$lng(ɖdY"~ܛ{;fݞ֭:y@mro-7}44.oLaeaoas\Y`*;(0 c>.3HCwvv8rȓa*~":1~e49=~ʯww$n:֋1s pw{ ?Q]`,b"tO$s0D}Y>|s{.CNy8"TY"ʼpǜIְ͂[a2ﭛ[tizaj^E$!?gy W?.o7\"_,_" LO} ^}mcٿ? mea;% i²Tc^c4,Ǿ§9(oOdV4A@OCъP'w he3@冦_ØAȘb '\lJb{!7upeEnmm3vptx =ε=|z@^'ͫKԼ/=gowOوAZ,$CxjL'-W[}eU3YQcזQ<"'l;E SSy[ (:ĀBӷ6U$Y יpW "\4IyA-zopG?S,Cfp-h$^+4B*@t{wggPN0a 08zxS2-Է.NJT3̿}Dwd L2bՄQ\ۻJŪ& Zy7A+a>hƂu6,{x$mr׌N,Z0><[6Ǿzg?Y^MB3hb =Bϐ)$P!DwSeQ{LEsoXw5kh0*Hle D sʠOSahcZem@s P' `CG35ؕU`l܇.I{p']w@[E\#G 1jgOE@MD) I Avw {t7_EL`˘Ao X3u+d ͷ8#Pď_2KG[bgfx[rz#Zl{ d 艼еPFڢ;wO s֯(pҷHs-(%LA^`RQ~ŵم~dq Zq ۛ I9f(>kXcHɅg0- N([D7Lf \|AP*w_oΪj^}ח~iyj +r`@þbps.vM_ ? m{*#h&Q%èTSÚ5Aj  m/.)cuKMr*)>0DGxtk.}X!UNC]b;F`<٤%R$&9h!n 1W7;NgBȖ t |^/>O-/JC9" ~(<Ѵ̭h߰iڀ2lww@ V kd;&(M[v-Y-а SZ.Y+K#6XFY;eH.@[Fi;>gL -Yqf0' v/n߷"lf?+E}-//w4 Ż[0 ^Gt6фJ \}  <}1}k3~K|fa@ /Of-^K4Q< H~X `: LLi,=(f$f ԏ?Hx6ͻ^#Z{כ l|"5Be]smzW>|aˀJ:֏~NryE$ ,F 5%Е ;N -(Q`< .MXBb4 ϼF{L@%c$PY. uPf{'㶎+a5.*B;H5%' AhݯF)O][.1q`y-f-^^On/V\|Ჩͥ8,@&',H VR-5ɁԃmgaP9ģp(k6wثci Tj&Ԥ鷓n$}jjVq j?DVFQ Q%E>^QYy+šNlZD#=xƱPw%ZB`q5AAYzMw=O^`⃫8I7ƥ˯7~س2%l ID GZn*T$\X۰}V~kz&Hh ! ]:<>Ry%BH6`0QAWɸ|)ՀTBlTO-2/!U- j>~o!*4(鑶 pB=@Q]柺֙jøZq LJuR_twt#]XtaҏXUpiw1^^mWfDɈMncS> iF喀Iݐnaæ9乺TR\(E,!r~#aHՅbMA:7&eb dL/5ɵk?:ݪ2G9O-9EPn8Y%!٠cr2&% K8d1>/|pW^~/.nQМ.*30n귀kDGQvkf!̳+&5W/pO$<+AD$q+X2Yk^9 VW H}1*>Aq?r?45GPr O"QgxO̳*]1q¸W,$],{to%n ׺B/I 㹔:iչLVr9 !P€c7j  ƪw$ h5ޱΡfQ&ӏTxsL XG[L&=ce1ڴ" d fO+k^j@JxXD_Q{ ĆE0m:l4*Z"Cmmn"0{%fUpý@Z/Ǝ/[ZtIj~6`"i5*r {PLlBa8u D DU!|W 3%'MVS.#V" (PzjãDžc&A;}nX X03;" 9"y}ZRuhA5y/#f @wK\r2].TRX҄;@{ o-{{["- G ym|=,ͮbEݧo7eMTK 58 >lhOt"viOmH@K`3,hQ_m& ฏiZ 5WqU?[0f ?_[[ eWCBW^@s #k+Ff9Bx! u!,7D|g{pqtF"6qiJ?ǗF) M#]i5TX,[k$&oav>(|] ą:S1Bt@z:y6 @+[1YuX0_<emNu yvp̩AHʀjW4.Ok1x5¬zrO \@fn[^_;n}nMw{Tjj5 PapF;_ hjKp=/oXLv_dwZ-!YI3F؀DH*r`/{@X}󸝄q @ c|~Z,v@Eoр>)uB }ؼi5I(y>;ܲX\& cAP#8䕻uXTÀ"SSETRLP9*Ib2j \STpz{f.ʫ&>C`iprur jd @򄴒0_ He /V3']v ĭ[tacfc}}:Ц ͊YFN@7.ฅm]@(ߠ #c¦e@*$(>U|.}?}U+(6D[kP-ǡb*L˕@ 2;M{v&|Z6 6yޜtnLp8m! ^zˤ412ZoPoF+p:e  Pݽ9UH^MkUNU"bI[㓶 #9SWRc-"R=mAŐ@Nr$}unY4rJ )Dp] Afj@-Won<ƠwC# K!{l/s?E kQ4ҀRcJC٤,rʚf@ LZĘM%: Vs9J{lV잌Yfg^I iX$S:1y,5NR ߒ hv+ &QY#+Z*zln]8.J3 V<{4 ̒rD¨ C5vD~kN-xX/.S{,|Wi%Ar"A\-z=R hq֋^wlkho"2*Drdύ rdvph%Gf*ɼ_23QD3% NՀiu6mwTͭtޥv0γ3e KY}3VRCGaScb N2ڽjj|`_Ko,o-,!Fnn> 5VgA$)Ray#q=>D` 5  .??:ɕ׫$?Q0!ZM$ - {zt2DY!RWd7h86cvp)u~Ւj~57&B,GZ U!{wͅ~ +V턲 ~W] R>+,hbQӒlYpkip5\I  07l20b!7E<hqj6w,ޞc\`DX?IS W@@)d AJp=~};[ղX}Te4@C)c?Cw.<`) [GRbPUZc{txnI3QTRxT!Ƕ qnj <ی?ٓuy)Ѩ/U4M3L`":0@Cg V,'*Г9+K {D@gh2,v> "aU3wu17=>>E?.ieH <66ȴDh|وDV?zL~zDNVsAϘlU'uՀ4Dv6{=Bh~ƵitΩZ&ڷ2"E/@/MYTClԡ| bs2Эi_"̲ɏA4qA2 h d8cGzW xtOF%>܈`Xٰ.G'O o6=o+ŀνhpǝt6XBsWORAuy!\JYz/o% 0Q[z!+bM(-Dvo@Ac~֑1W5P!Z[jQˈy=R[8_tXX]|? \C@]q ?2O2+->`NSP9Ht z`P f-X@;an C*IpD@Sjr AaڊրC}0(Pl Ma}@%[@H&Zd"~ R끷)x]-(Sࡦ,)'ȩN9BsCMi".yAdZF&^^ o4m92%6-iTHKǗe/]{-2 1Y%%5,4ޢ@ >;7mMZCkʥ$MBZ@-6}w>[y):D2 .8ʓg PԚdq!HHMfiK0Q斟aoo r_WU Q4&~nbKbisI AUa*ͼ1x0#h.7G=$( (pd_ USSZBk+(nX*0X&ߩYXm(628"~˚ N( I C 03zp"G߄vӳ- 5 5O |:jE^aO?3 +WYaMAz[{ºzM0eSdwY(Ѳ&1Z$T&nvuwȰ.Tʩ.Lbԙ?(Re8ڦ[4֑Kh_F{TE@PkV s 3$ؔsI wyѠ*O-NTJ= |9,ٯC2aU` yupc ld Gsg!#. (>\ރ|\K-uilv^Cxؘ\ mH`92:V #JwBl?y*EQNQYdUDݺWCh=E`~{'`,fҘŒ 0ӎIeMڷHjזET: )$w4Pp$J9 WVfm=K3|LhYڳ`>ʫ8KA`qefP؀Ebү]O|~ ] / ;=*6)>3OLόzf5h\ϟ[}&'}ˤ1S'΂yӜ.dlp+\ ԁ(fTAhױ`6d\dEMڵWng2+Z 2.8᝔i<.)LMs&MiY6Vc%d3nG3  R1;%7RO%'@,9 Ȟ]L;q-@ڽ,똙"JL ti}LҌj*L^K\>0܂$x"`G1+lJ2Gf@f݅*SB{i5 (CH0d T`bsrH̒2 a, 8N0G0WFMk~UIP]Р߮T|W[P=Tx_ۧs>+?vQaPK }OZkc#֒@+݀y^/Sy͈4ח @ -VsFU4jzC@z8|xahY ncO M`Ŝ^Ň= ~|,m7]6f}Ofk1eEuha [[yZC"+2ͭ\ jW>Zd*).@{@X.[|2Odq{BAr.&trJ?HAb$]şEYb KC t≿y^acP]i d-%.BI,y-eؠѠj7D  MdCDxo#&Za}\C{Dk=]A\K@C\,RG ׊ `fgKk{kIH%F)wa?de:Y =dg'^ ^e+TOXzHMO5MK SPq+EfBJU#aO`*_6 1"E `X>fL=kaءx4or;>C^YH4 ^*`-- 0 MįkQG]nb9}Wd~?/Z1LI/L;NS?&]UK~bby=]bOҸ k)ט:{MF7$9 rzRI5*o16L KGY) X oiW=G?3k _I̿~%?rwH?s?zˤ//_," .Y\&bJU.iSI"ʛlJƣ'ԬWOa6;ʐӧ8Jږ@vZUoN$+/SpVk^oY-*%Ⓥ8з(G{Z*1kiΒCŊ+%Ӯ_кySl̈́GeV=@Sn@=p\ gԟ7 39 WHBW''{|̿,s:K/{,(D0HF̄8BUJ*,[8 _SM#p;tc-Eh+@Ŏ&nÝe7:d2qO2gTA=wE+&q]釳qcn}'4( < tbŘK}E߬`@*Q& Jzocc#X_%_EHV34Y <,G (NERTD-|\33,Y-&mTtx|$DD߳$[鄖P}Zvrn= .+yԓx!Ҳ hF&MGڧ_£ ,=*WجEYn z=vDqE@ ` <bkXCd9kNϟ5"/Jw_2}K_Jh@[`sctpx$ L;JӚ67dzJvm.jnw9֝O@| F9 SKjBH?br.lXǻSg>pciY<:wBq'uRSE0O"§>e}F?Ag1#Pfds֮ό+7,_W7ի^y7|S1+@/oB§c< Y 9< ZDZJb`WR2Е+gf̿hkZoEW~g.  p>QmHt0i& b% HGu|-vj >ۖ @7$RӦZ7Sx K BC= [vӊA-@M]mêfk5G}~Izj0։Dk )h.-jb\ߗ 6{*Drx "Ϩ [k\U,-oAs;[_M3zxG?ToqyCR\$憳pPsF(ux Q"1$shd> y$Ɲl'cP0L~sg3kc M̲ i**E-bfX]NTr@R'lCCWٷ- @ ?6_]3W׿NoVg-"Γ|fP5݁Yq9 N4nrq+-%|r3lm[:5J®@d8D0)֖Gm2pa-ZN@@w a?78m+qSUN{dnbK"`SO 6w0;y5\E _][ 濾0U~:8=o|~$X?$ [J P* UD}T* c*ۖ{_0Y$j"D(b 9aZoesWYiA5?6\"\boMP NңtOx|MU,su|[~vK:*Ɋ@b"3thT+ a2u\H!^kaqb `m0 _k7o%>䯳d|; {VI\w %͆ P;0|5$'X)n ),;ছj[Y^v\7&@[05HjR޹i )^=1(J%n q3Vg0a .`(Ш´}/Ha$+xz]S : `3q0-(C1bpIS6NJdE :QX3 \Y:f~XI?xx$~?4s!g֘@ީ.,g'(D\ hCXn4Kc%cS@XP T&gk[^Zsc۝e4Ps͏d J16 C :ӳ6fhd a+s,@ݯfT┇;O:@I8@~.n3W5|[K."!:B༤_^V@% $gt $|S<&K}/.mRRBvn艆Yv6Ĉq* T8y-Zߦţpp"`eafI[LiS|tK6;ۂGrkݜ` hkƶC֘h?C,'lo, qKo-B୷gK?LB@|,OOCC"@j TN*˟m X`c]_܀k}ݸF??AOJBw{)2.A %P0.#\,i@ 8ąZJ0o8QJD^l"ၩqpDqbbLcMXwk)5Y=A ʺEgj 0jf0smPҸ(pJf/Ubͮ7[1z. FN ̝|.AuO 4+ '17n0X,EͿӺo-qBN?xp!,. ,D "(v~c$u(>b n$Max`UUN߉U6D҈g6|7VULòy:TZ1+,uks,5#ecWSZX0E/ϕbj!#ZQ?|QZI Z@82>G{v{Ϳ7|x\,3KyL,\d#"K F M7.tVO Aq {Pc܈դH+Go=vq\? jo3ƫ iXlWE m\\lrmM"jIFu98Ҙ1(ـ ?EkbwIdp$aHU%Y(y Q.RBq2860ܶ\oDϜW7`hC 3($( |k'$Ӈ 3#re*$ݰ.OTdlvƌMkAtͭw@CoqR? uD|n a2F"o- f VҲ'T[v5ܠ?'$}ue`E!qÒ,xyqϘ ƌAdHXwd# ySˆML!}-+!*uO]xͣlnY0t9:)^-pʚԧm^,mȣnUI+- ƑO|"& jz"DZ-Qo , di7n^~Gc_"OVI HQJ)y./D\jҐKh pe8>:^vӜf*DE&V4t9X)1#-sYExPX ٹ1$[\cbcl7?=J`M>2G="M1ani 6U wK,rcy0P@R=Gn\OB7ߠ?1g>COҌANN8o Z"̖ZIBKi:#1GЍA IZ$hҗQ`YoFqf̳ IYnx.#RO`X70d W\!GHDӇ-k3,~NGSRd>3PJ@/-W@ .z?C^ua EU箳P%r 19S}[v$vͺ&Hr`[C)C1etĩʠ ZB+-@muWɞrܲ=M& +Áِ3%kюK:^/x2(Gs"pQwg<M0* :6̜i~ЛGOơbT|jblp5^|EzZd7;Qsn2BdAP!UxH®-@#r+(k] BH# *͑2+f/TۍAxz`]6ʏ0z52# uFŽMl@e*O'/T^t'> V-w{'.{֩ɽƂC HIkvF`+;%Ah1k `_B % ewA@8˖w^%Tx/3.Fdt*>M%P"VEayfAsМouTƐG548X^K093)mV36@mxnoo-󳮻>a"X&or4D|D Jf&6:=DRc<F P I|R[ &$6` tZgԴ=QG1{=.L\ p#^O.uβ~~P"R&B4#}l .,%@J& pA">68=bBL:>^렾;4/xOw)"r& {Xfo]U"㙤 R++<.-#iT' ^ę3d{TO';YŗA9*̄@_\K=>PJY>P%O2~c0i|(!Faw9 =PA-P}wތf_J )O!\tbq=B,tpI;)\+F=_R}k.{|#)޺I'wTjQCru֭aɟvErza i}gW38҅,Ĕ-o7}Uu%R)2|ן%`@(Rd 0`Jߣ8L&s7*_>v0O4 #aD?jJۊ6yٸĊY^s * Wc||u6jZ`=vJGxJ'JV}7r/A뫦[ݺE((u\|n`/?@ Ճ75 $~RW]06 B2U^^4)4PZex",&΢a9mCTP[.R9yHO@$ؘ- v P5|z!KEKdOJQ {~xhr|xnO8nnm~^Sw#tv.NwY55:/OQF BS4<A70X%Q(N$ր_30~`C( :B ,E! jTG\n;>Gٶf X`6p \X3jtI bǤ%Mim8Ba$[Op!Td+Nu\BӕOV:X *MfƒZ+O||vd!숤EȽF. #X pa|kZBTҳ&8x|TD玝{KAâ{pslNؤ_W2OSMSnySM4A̯LG!'𡡏#6"\;;O)$m:|݀K(с,ѳ ŋ /'И#󗟛I>Vr[&Fj|FNMsUȬEV#U U$yD\vBVo߼N/vo:8=9Qm-֠U.@o[1INO1hQ7X.1-o[^f H0[ɢwM=x i<;`_aQO*dC |H6,)Ô[ `Gud܁LD{R1]2#R=RoEn @2`ӈOH%8E` kii$?c7G@gJ[R˜@E*aaf Ԧ[4>:P[cO,+imv㯿/ x H%u8?/y'?.8Hk x kLXgyj(b 5bLӵ6,4ZdFR4%{*p.bBR R|G"opZ@SlZ27Vl3~ӶT6&1#4pXCABF!ayðGFo8<(F&tS8ka=w@^Z`4[si.^.N%! &UZ209 @b-8x3s Pa""DXMq9rU"Mf.P@J>-:m 0m} RvY3iJK'`CR -"vhT 9kW5kF8i]hwJ-x~N!Ut 0bZݨk`8FBq9 [(Ҵ eJ7%P4L_t\|}m() BIL +dq=[̛ Uzh*|-,o8tMsN:OȟF %ߙzt+F@F1B(zb`pcXe?mw-ȃ5(9 `!pKӹT,BvؓP@^hF` ?6YIX jvg %P 1hLL |\ ݎxPxʅ]e annC&4[-M/ @CVݡS4-(0rJMB[ØsXgS"*‡՘?xCI\G0Y!i'C֩쀆KkadZ;O\bf*٥c7ݤ{d5X$HuF pJ-ADi}BNmm)LyEL poSǙ*3umaR\mpy^t]&m/U4` d 70DqÃr \fM0#%YkД"A SvkFV|W+0ՈC@^9jS NVRؕ("t ?W@7%UYX.\[r N.rmDz\,`QC157ZG3`TmF,eun@\E?=I3X> J3"|P@T0 \Hx~\R;r$5( B<0$0.`` &WyQSB:oT5^Ip6kboJZȴx@v\oR雱7x?53V X* 7Nz . aY1w}hۿ[ pqG[R@>8+mrt`sssaC=HS%!}B[-"WѫXma.ĽĹ8FǞ}v1ar C1Xf8v"Yb`z%c0wR&1ppٗZ?=ȓbuS8le:(|teƣQfaәcnSVUǟСVj8'İP4 7$T>4LZ.ҍH]+iëXoV^pk,^O41o;o"nyv$i-V>%BیMxJ栬`H ( :,`V iXe?RN]AI$R<Gm/{ڂ9|M V5]:2)1+h"2uh+Tzvu(iIX516nH0P6@f 8CN70Dʗ9z; Td0(oo~%ڏ+&@( Ed`Z3Ϥ<"܁I.Γ6 Թg>]ͥy2z:sljg^$OGia*jlb(X_ 7哕&_V'/c>_,R$tDdlLUDrVЁC0Ikkd/=`ۊ5 __nJB‚W_^xŖ[o}-߿Ϯ@i1v݁g@.d!yKvO%vԁHd׻ +ogf #*VLҟN NdV CwfpguH7w6يn?33xr{EJsX{>'v#s۬$%] P̤p3a0 h@ PIزX|;q7n$ (>Kߤ}k p?uglG/x(EH L@q4O M/y% eoXt`v7,yZlv l5Jro?PM<#h v68 x>qh\{ 8WȠ1a̶l/Tg`D!Ok;F:se!)zZׯʯWt[#Ȋ;|$EXE .s GRJD@0j]"D@y%sY M68(!! q)UQL9:c1Y- ײuj5<#MF)^! ua7| ˟y>7ͯ|% 復"?a::>N=NBl @A0<"GzYD`KGPO^~&QBo?9 Om¶o1ڳ(x(| 8+ނ~\zvY>ڼ1nMTC^D8ʽۘaSpMjp?wvJf$» {O#XC@K;}_rOS;/}{{ ȇ>RDdLHCbI>M5V k%+/ueڵ*BJc Jrp*u hgAc-X݆8jExV.,`^ى[ta@!lnw#x*Z7#/%楌JT|YC$ܘo) G8oKΏf2gbέZrc,xZIBzX9v- 5Y_r;𵷾F ?&ʁ#\5 UɰJX(@@p#k3D˳`2Г %WT##4]e]f3^[ ˔ۦ|QwYqi &(On-q;,Zs32]L5k /&/A}y ^&ɚAtKdQڬȥx( )GHX@?pڍtuj_|B++?~5I@rjbJ ®hV_tg#k;dOAD…T:UW^aɗvvje:b0pauiHd{͛7CK0.VGl\܂V3{$0H&wĮ*\Fqw% \a>>(H~UȂ k`:9X0 `A ~ŧ/2,}{l`¡>Lm@dA 8A_@浔WVE1 8O.KGFqX6$؂iOvvn;ƘOJu1u:z;pi4{!NVHQjI4DjpEKheQlD}'{d 4thS>@#vB`|i)9Qd\Y/n,`-|/>UKYȦg^ 5ȏ$- 4= #2 5V\M 9UB ɼf @*vX [MoZ>mt/-Ci&z.ǎ[A͊%AFKQC@h T"tcf? ̂*&PII4ZqV,Sm4Az1nI\ނNXG+r,t f bT/z)3?/SR|b__&MDW7.wrR+@@ԶkvFzF0{* 9kt1êQS#lDtFkܯ+X%`%YM ~nEViW2F o?~WzՉ̒s j Ybsy|T#1} ΩX,`\a~l\IC__O|LY_γL7cK#%41w(/(gulRRg3G|ҘJ@&S.ً28*%oA[ jEMp`sGnKAQdavshʅlhh &e?@-[o=[jc34\,Ũ^J"Е5ڸh6fz+|'qB?T pp$R=@&AE!*SP}pp*m7j/^?P T Jϡ]!vP((/`$lT"2Y4OQԟVR{VrepQK% Xjp<۳H[;'F K j$ݹtﺦH@(dТ1|rR)0o5֮T`\f WR9 5 f _~R=IÀ9Qeʩ)&^Rj~V_q@X-I"/)U+ż;([T`j"&}HAᨲl)B̸=".j!čyD#{5~<'8VzDUբC=:9O<D"oӽw dj)Z/Se~d__K5 tQZӅ/\&,bV_3y+2?\/Zr-K'n>sJ ߸n(rR1v;>9nS)>uKu-{O3i[~ r$-^i[^ArXl _Hn>?u颰ϧLwK uUX;M~wCZ$'+bfg0p[;w+ W^5Wz/˙YC% 7G?JGP\L =;^/(ԇu\ C\UòVPP\~qq>R!2<@>']X@qQeN%/iƻ[8u\k)E*q^T[6\IUw94TwueWpi3hE)Zwr4]S5fvN=Z& P ,>=#ľ-z7/,.-sB HZOz䢧NRǮ6ۛ4(>}:f \| p ˅."^Cg w6B( nZߠa4wc" 0v3ѵnprn{%>xe &d-ya`y~ (}R/[Ak~-Q`_J_}s/Ӻկ*ߗCDyt.Eχ^ `i>堄@d 6 &3BE27@#]6TS>0Or?LVP10Csc'xKv@җ`PGgsH<<}~0%G{4$\U@wG!uCwnZkUw"$o? _|zPnv^XD|P/=x.NWKR2hU AfYGFth+_ýbtP)ԯ4=*f 2T_8E0j aQ)utW~)jG%)($5r'\\v}\D AI%+o?}{nʒ̿jGCp 5Tߵ|H .f=oS?!hf|>A~֕kC  4=O?g e]^Jea|i n #CXXتZ'4 1 4ʉu.挌=b IC||CpӁf,@ĮYXCBgNpz-.U-5>y{n?G~m,60\Sdfjte*r/~szDXԙ4\<5)ۯgM.U.K;zɻ\ΘH-aʙv.Z™uzUc 5,[BvU76Ð[&u\u1?^,xnݞXsBN5fq%K+$-ė-gcA,u+~6@~R~o\Kk=}?{2?h$.`)ܗ~t*dyL5QZAm{;pL zva| l׉;>[r`E}jj0Юa,?nom(KuF015[7:WJ|GZhF,`# G`yf4gT u_?ч[#lm߫Ͼk>01|ì/HB@ _{OL?eWMt.`B!P'Ě̺cwcwup/yUxY2w2oo{DʄD,Fqf5y1c Xۋ prw7ȇ܉VF+u 5Phd۩#$w!ծ az %w}~c?i_MڟE*`~9a.y"}ZVOgb- ãƆzwDWOI `Ίk/+l Uyn .x%_0EQrBay(o$*/>jzII2"CBe=loeuۇ7ڨrpԊgM?B8,x33ڕ R/ onmwљgʩP }˶cV3 VVA Y{{de:FWHMlkq鴟+ RfdK8`f3l*T[ʾhQ\O1NӱDG;[B7^z b\݃OfIaaJ aD\$fu0 "@F0sxR%P5eA?R^f~ޫEo{ k)Ρ5exX܂\ܓɽsFrE򕤝u'ikн=::ӦU/X=Z/ -ܲ j@`)^S [@]Y&CPB)`8v8- b]K)Q!0 iau~>g?27sO`s3:;ϙ~/Z4Gr&0x.A9&gG`Fbޯ"\{ZAO5:h\k<~aSǗ[L70Ht%É@,aXtOQ̍(5/.M|0X |K9|֡R76-?  o>"|o}gQ 󟥦95'7m{Vt5wOFE^$:ZtVR aCC`th>DfD8$8/r*"2%a(3c5W=6DZ\ ͏]€ #G\*s#?*//͵ォD3e"Ff1 nXzݿjU}Wʛ){K=4 afCd.wXѭ#G]E!.Kƻ9Y332Ptj4K3RhѠ%M<8 _Kx\?]>17I_Y|{gtS{*sf|>/߹a zZW]B=G„LT]֡`M^[ַPŝ>ڔ*cmpPzbb %aig^[V]+0h!K (ainN`{&+L tSOC@A1òmO&FE#'\)Rߵk~ͺH3|wb~^mK~3;7<{L}=Ǐ}~+}_}8G%| T aQ D #K7hiH0سI8:E_jU+ Jβ HD )#@ce<f@1 @[?ciq#3$\?wX^_vc|>_I=eԹLcg|dYZLt\M)@$%|l0t~NEKWMM^|u!e0Y^wAv88W *@.]2^lC&4xA~K`#P>˕CZ'4`8D ۰DǰA޿2 AAQ` STo}93z)絯kU럧2ea~ 8{07~ܶ'蜵>3?Z2T+ PJ=MLAp۽ *搼^#.E"kF(^8ufAX$y?i5?\nAz,' ~ tvQ$&7 p(iFK A-¢N kk'g66鿑P!z>q3w{./Dy&% NESo C0F^F$Q#3[Ck1-.V]zPѸvN0*c*sVt5+8L0Y7Dksڎpw,>՗bAPӷ6`AوHEb)ȋl$]AeGBPhLHӱ* i͐]U!)"%$Oo}Yk}kiLuUk}^5f_TF6B>1`?rR؟{Vy}|og߂|دI=Sy4=yY/β09aj hfF) 8Vk1@ӒX\/GwNUeFJR3Z`< #MdC 1Dju:Ux1?>( gܘ X(iIb% EZVĔu,&}nj>=oŇ9`cWknқHZjj HbW3m %gd%:E,FꃊԮl*pH^a&Mz 5 }S]iYa@[ \l 5s/ 64ko miSڮu5ȏ:~黿魺ֱ{n=X/Cz I5/KU+/sXi<QV@f:y+ 5M>so l?9 :} NgmQغƲ~!Ć"L<0uA4=} [*X{eM\ޖG Áڴ@ oC L1u 4~Ŀ;i_ASwj>5d>6{oMo%{eC_ڭFJ>ǥi\A`!:5l$Tga,4p d_~uP+kk BH]q>(!mTwW_0X-q*@j IAhP%14Z}SqUw{28bfU݀3V~4J ^ĄN-1,2۽ř4Է56JB/+!o/Ya3e&Pk?Y}kbOOjҶ+Ԛwrl6 N)I9 Z׸sJ[;tΝPoeme:dlvd(c 83Nd@C50޹j [$= 0/1m~VZQPSI_fmޱ}(Rϣu_ҩ'l{ D魺/?U+kWg>n+'*Ϝ!>n0#-1).T50;GGG !2#i*sMxz5.S/z;_PN@X+3*65e^0B.\{0̅|?7Y93ZQ|R^}u&A(ݓD_Z?>??P[u}s吗6W)ݗcI~ ڴcedP*cwNi rRGOz9) _8^ԝTT5~~ު+??i!w>?Z%_^ٰj5xZzf.u?~ckt:R Amqd!SЮHz6ތj s M\PU1b&m=㈘/*xtԓVi|f2LL< ͤ_T[fX_k)Mn?Tu}=WDSɧTaW_F.W ~ KE6ݸtzcxFGmmOCEկ(*/ozЊ\GzgZKU`l ƀg[ĸ6 / k[ pUcW  = 2'e7V# 6u^ Uf'wI]~xs?sfr^;߻_cg*_s$>| E"0-{tI;9Q@P >ɀb{ߴAܔ?u&AI8ӀX&Oq7jQUD6#mccf. hM.nئ!Ƞtn=H@ j֍6a"a䅇=_PPS[spYb/@~i(~x|y=e!pUN҈@!lRZ^V8~ALXGn|qu9i7)>qRCa`AX6h`1A|j0o݆WтWfWCZ|_4'~WIx\%coIo|𳝣vp FRبo*q1񤌛FH{9wCAcƨ8Ҍ-:x{&@^L:n4Θ}9+cuY5ܽG#δ\ӑsw@x~s3 T2Imsd& gFϝ-|CwZ^?yxG- xDXG^, F-vaw,U).!7kbpg,fX`E<^-q^kث%3W逖^.m\h :!ȣ(KL(0܂qMP3ʹYgZ,To\77w]`p_*ۃ@ ?X~=Q./}/4r}Ts_3[G1WiW-DQ=d\Q}VQlFl5T*zpzːoO)fAG(g*}(VҎ2r=@Yd 95o+9BhҢp=~2w8d-MDpѰ𽀔 UT3znnW`{Ery ȇ^E:K/<5oQ; <Ğ@l{\|t熝+2?1gU[un-daK͇B;;/×T}KihfZgE3wΩ)xHӦ=7JoADu:!dH`YI-Rma%&$PI:0AU F d4~՚%}c\G/C]Zg}!?s)豒D[M ~0.mdHbmVq+В8brOLjl]~9ܦc'> Zwe7 ǭRX\\Bu)r?[@8ud[V"0!jB(q F}'>U)9P+`TVNHT5x%,2Up湭njgW# 6qKq.s]ԠEV92(F"[dI6"gY/ǠN]bL^W~ʟ(`k]P$Fͦ pV/{.'?4o{Yg5#jvZiYyW~c1SPF,XY@ 0P pSNkB5b QoPLE YEĉztm0Gl ԝ5G uZĨrx->imP'*d'+|'f$t͜Gt7% pcQjs&-4C?Oߩ:&<}Lׯ]ÅK5,v3KdV4Ӫ|aш4˔lPFh{u =BDf Ah~/~]==!õk@w<)CM@N`LpmH^y|$̇R( 1YJJi8sl\B{B/\ց ]\lC``__s-q 掼Oo]z3*A>+ !^_#ŒdD'^#h'U\>,*i'݀98F:GTU+eAo]@#3|d=Xp=J܌X?Ц܍VԌdX4 9W XPOBBnJFa) mB% A !9#=`f8'2#g>cQ*נ'ŗ{=❵gMVܼtuj{fG&#Jq˟n/ ,9<@lѓ]m򴞾xJ; OP& GCɊ%zѪiS˖1lUqFjaU6 &\L2l@CLyt9-q88j8pwӈםp 㚀D/@hߊJY %S9)o?o?Kl)rP =U-6.ᕿH,n\*>Lg` [ k-gd+0RֵJ-8ιw22^~  4nM-th.)s4`8 Y ϯ97PƷ& U)#s!Ãֲ)r_ Ԃ`0 V;r[ܝBUUs1؄DTxz0ɡPmsƑn[}&bȹ"b <>I ԍB#) VEBF@R>1wL [PQf_9B'aPws2iИ`@^`yr½{wL([>EpfY{F"G`v6QEUlDTDE @, 3l/aWW-OzDXz+R^evs G*> ozcU#mГW%@^f/AS| uya+gжww5FG &DE9E yCT:bAL]fV6qJKBj>@ dQ gxNwd!E,'ܺýLod8J2Q2ej`: ҄KjgZlI*Tl4M$M!\pÌb.Eh3S-A`'||8 {е`AKw y4WTbE&޺QDO4*<@%rRpKkhT-nQKܟG "ed1 CaW B6!\i Ў 8FįLa2zlLc w<$ȇ˵[ۗݜ45 A?Q#[+@_v ,uJxR!<8#[[7֖-3 t6謚 s]JqХ@ @l[mG @ ϭD1Pv¼}x`isO3VR<٨*rTR;N:HH0tK|bP1+ C'#;w!2Os jt >昩[* J.@hׁ'o47sן ͢?Ry4KJۦ+; hX&rUNy?J䎓ߴpfP]in W [mm(\ۍ(*ЩMN{.(YEݫD]KnmoU%vWV‰ш/ZԋbE(w۲FxTK $D#j29GUA8(>]I׻ R) 1Smj cB] <R=YҾ>k0 8<У .%_-Tv#ue&%c s/΂Pa8>r%9̱$=> @ pQHWeQbLإW%S\$*рKF xzcz4P`2GR8Vv_3;I!;ή꤆x{Q{pPPլSP'5WOLJYzKvڢ>s}VA&I7BR\]kIM. K9ߝ Sh暅t6jAd? ^+IKPP#d)*ġ)9o-^QfSLz0EʕML0d?K$ma{]/=ۭ5tEwȃa{uYq#RXq3r\W48$4 1Q6-HiچlYwI0} 7hD_tU#v9,6ܽ& H$|>-Sz 賍.^'xQՕw !׮QESqB\ Sh(c._.%0(tjުM9ߐt2@Gd@2Y Uk;"k3{J>C?`pHr:Hpud 5*zd.y& ʾh`I_5d 6W"ͥ1eG_v)x_jtd -qYi<ʦ |P;2ge߼_A:^I6`k+ұAi뮩sE  Ѩ8AV")Vq`Wt"cSM(€:1:jH,-wy)p##rlsaq-%]I$Lc(vOeKʥ` ƞK K1'(*JTx{< 6M3*XQ/E=`It]m)NHb70R/-dŢ[ eSsLeEϓa=b-ih;\+DOzyMXDק- @}5 R>Ш0exdP5ϘCo;(@ ȜBޭc)c;.i@p|2ba1 6nFb p,PCM}Ȩa}zB|2~=<&d (6Lz("J4 C42 2/D0Dz4[Fg41 ݵp8>@"_L~j*$y 9 dC{z0o,[*J62`! !0nMtPimWvIAg1?<n,0gSKqw\ѭOB2%#v"T"s@>,kj]\Oi8<uN54Nbb#KNV i^J_~˃X=B^͉`4 `c[m 6E5PPLSC|Ȣck@gYHoͥs*ga]`5{SfazQX+fkwxtYK07!(ES)MD0AlS`e3]Y$kFs'9B!`!4שnAիW+_jWaPƒ,67}}jKrY~>^i|ܘOԩfRzK 3VPF-2U_&4IllcVы'HT-S+9 2@V ||aҽHV,TV.Ъc04JRf쳗_*p;$,,og/?0C:=O$|N4;եJc-=m q-c[oq_ }Z1Yz) ϰQD_N4ٮ=$+7J MOq"o9>)K p!Z)ǯ|KAY=ƤړM+3b(* sQGN³ZĵkfwVV SjӌZ1pf`r㎋Ş?p%A@@gW~s O]pR2Zp.f;ZEnV:(]Ο,~\m=RV -^de#k3};sfۧ-չ}Za9g2}I0HXک!~7}ߤ7{(o ;eO?MַRj HWrU?.%lm2[N>O*"`*P ͮpܒ@zL2 :K 0j6򍤯HWkX'@. :5NBRVy$H.)mp_7_'2K%oZ ٬,헁ܼIUx}vs#B=0\۩Qу[5]??7saG@4]fc\bkMdTtz>,gr`!a<>.+>OV=?cW͜%Z |cuK?ywM_ך~%v+OO7ϭ'+wǏ#KtNAH̜ `nQ\S1>-_ `I! /e6뭽~GzPd/J:ňS #fk(\ky7ԮS$NZ.>x+|bO!s:͇s~ (`A=dr_H8Ht NPt s w{{ /a#Lx..>3 .Ѕ蓿ɳSי Lqi6_C_NgRKJW!FKZ'؛L!w*zla* 4uˤ PY<hBL±6GZफ़Hej<\pGR6c Ws$`zߗݫ3h2_.^X>Oq~:?CA, y3 U@}Mqg1)8 ^ ;5׹_XK.p%3OSzrxT1@ARf 8֢ T-7r.f ?退A'H=2&t7BzRGj:-gj'Wsѵ#߹0Π- v.ZݛuN5iz!=|FPYxRmOd:/3)31JlT6b95Ff`SPil5v% p[qڃ2 aNDPGXGc f (nsWlz5aMF!y|9.,6O-So9}ׇ _l`.^$flJ{@ ( v8$TJހw*6vI"p$Ձ!pcHvlh-la]NdLΝ-m0KQcC =a6q^*>yS@>FK%K j)6!U]ȮJ׈Yuڳo{ꅊ֐:œ',l0|߰yE"5 `HaL1u7T&ݠ$fNVm-=вܽi&Q7"v h99  `}UHOe__xu#zQȒ"'d{j`ew^  qKS~@f0kݨ2lšI H[)ۍX KQ!H#k$$ FL&P7F-wn19w*р7w~P\ZԀKԂ>6+>E_(=@UM&т `.=?6iUeJ:J/W a} i=lA7Hu5$ =ֽ%uQ^E?^Bܓ7%+*yϱ RPps=+`O`0*US tocUGVxnat}5fLE(`aKtfb~:o?1xquS_UZ-j Ö_DXqm3j@K8 XatF=H|\+nc_towwQ(w>8՞߲.dA%Tٞ܄L9F~3FBb'<f llLe߯6w~v毧FO3z y&$k^Q }}r@NW e;@-֡/ۿIoBh@ ud]k>x y(mmw!]?ߵL3o(e9ٍrY䤟M`&˿~c/j|\3 91n~Qcuyn!7A@5,סoލuyĄ VM2g !zJl^5<,@8[I0#Pc׷"is ^w$?ʁ@+Bo_''ɃGA/.o|U97/ŋ˴|}C[o Ԝ, -ҟ^o/C|ha;#$zg(8grһ}j1@@E/mc%򅒬jO4Fd50 P.?M_`Q&CjIVZAѤԓFV='>Ejh# )PF@AlbCW_7{hD[Hoq]cVv @"D-`*jEW_}V A%)z6 ؤ.ҧ?כ~G~-aϪ1[6`+%+ `qc@X⛃{^j{m8w%j0g7}h1hfAz^&}:p쉈mqu{( o%J/E;wRtZs.o $vݽ$? xj=Z|_q _5I5g_?:GG2?^qρcp;I6slܗ$&6`钂j("n+U$g\*F*Y Q4;Bd. <_bnJ3Zt`dd"`rtN>_J%w 2Cݾ~[{O716nj;UxY?z\_j>Y`98#.+DHte#`V@R&Nz^p8+9о=W̘1D5 # ;0`D;koX%l-[)mѢh8IőS+TuCۃ]vu6ZqM>M(B5T>W| mȶVD ʠ Q4w%ª=o|Nu)og@D0򂏼绞?~|H;kU_*U+zLs}R<^R"(- FQf Ȇ5u@|oUlQ Hޙn.*J}arMM}b %J$&%$Q09}GE:#Jؗ ~R tf @k0ѹ 7jӐLIElNH(^M TBarFPzpO.?ӯZ\Ms ca.TK(X$ίJy;ٲ"}0@"[+"Z?Np0ҼNk 2qukiJ{)g]\)k@520hGJR"$5z璘ALNz@m}]~Z5Q%z1#[<S jc˗AԮ+rc;TD A(=~W\ǒI,ɁpǼ11Չ۵WUF5ـ21ceiD]YԸ*ʹwK}6eU w)_;%hRӉXaP{; Y e.UfbzY) M=Y%ijATF gB_WP@ hk z̠.z \.56#DJc  &ؤ`)6+zn{ LڑȜDPgotԊcõ4Id;vBt@܈LuNul hx#I?@",A6Ͼ/J4$lf]IVm\7}?m'  pCt&aT~MQ v CfPdq`>=\ӊ(JS \Xu| vf(DA h@:„LA=Xz tc^7]8,@xad 3sELl|dJ|[Wێ rعPEoTQUc""g2&X=W_SmiRhjakZ`eu/O-Eܝ6] )FO$- @Vmuy$sF{cnw.]]2Rc/'=v08.Ҥ| so5PF迟]YL`}V[m@aK0@-BNa;!0W8Ӊ$ٴHzͭhAV)UgաXS#TPCf@)`X* 6Bqm :ݬJ0Րa[D!JLr_V߃m::20f%+h- fY۲X%hR*Cή ,R hSBb걩2zOھx4&W`;g8FEn[ϺlU uN=cl(뱓6ehEp.ը N )0NW4 #.mw1??q *j4%|ҕWLm/,MbBWXkU` dV}sD%aFvjN"md-uBp(3ɳt1=&p+O?;DndFu4rSIbo1!bQr8$} ڡ\[>׍HxdTSA@D Ai.F+F/Zm%~jn0(TKONgP Q)h\1Lq3ExZOɯ0ܻ]P"|y댐XWo͛E$ƹomI6 Az̘c';VXN"ZWdB"@A:ELV)8T5 h"`")8pmmY-PXԝ6Mk{1ψcggwdQܰx}5RQzJ57 ſV+- {`G8!HJXP&hCoۃohAJ٤[73tʫF% &-H.brHE]2C 8+v^ LK; ٔt?uaQ>n%4wD[7~#g]~"xaIt ZH(@|] -#+yڠ*Xo'-qT-0D^*Uje} 8jCʒ] S"-s Op^D#:P0Xڂ3{w)Lh@26| 7BY=8"ȹ)~)9fC$!^<>l WW^p,f (4ڶ1* !^]htDck9BsP0. D[*E";۬d מSQIcM!r0M2U/Ku%zU`GT>MyfhNv XOlyPI #@4m5vX+dȸHʸ(<+HDUƸغ]T2;=ܭQܶsA;72u{@Tp`y% M:7s/])m]i3 =vvXŶsZ6j>)UUˮFa%ܡ"]| sRGsZ{ѝ2Db0)PI lY^WĔUܽ8\:+6'3Ġ:jɲ:\BϨ!.sX, 8B niA")&U0$l3 i/5rl _X Cᕒ`ퟨ 8F6!sp/3-PN;4ۻW~b}psoy,OPu&Mvcg3֕ q$`&Y0{򊹙 L:">p1  ǟteH82s@L:~_k&%[`˓̯mm"c-0z=`7QU†=ל@D Hi/UOXz#xإE:Q&< > ؑ'TG|z w.YϽa[08$=Q| Mh/d|*EF9\CRQa8`(dr}KD*kXumx΢6IϗvA2(! U\ g|jߓ#*@lutjd)@Vq&y=/>/MnH 3PPv Ä&6Τ."qG̥2ձx(d?w`&^}2!GSH p d, ltC@ \6D ]5 aNLv NI<#`{/a٣@ۧ? 2+?lZ_ kXr9S&y>X$"o0L4D1-( Bp.hqKnTT(Pȡ,<^5ޖLHkmdg+)=t FxXe:1ۇX "Ro5vO}Rۉa8 Wcm f@r|?XU0F+0Ux7`ft{+ v>d$䐉 ߻9k?#kȫfpe`dLCӭS?|>;W߼Js~0vAMM,m7n8AB{Ng%qgHٞ3RQf%$ 2H e)Go `F$PV;Mcayn;5v%vp cH "35kpK#9i.a58[P3ֵ Liw*`B Z-\DnoWί&su2B %bVfF+堇a0F)7[d m4(*nW`mptŖ B5'IVfP6ϔ(]#eS]])X 9j<#̤JY;d xPɡS+Ϫ\?,‹/w?Z}0$ .\n@tEĖCQ I>cSXra{%R0B6.vP$E?]]Ht@-^-Qbﻹs%(*{Rȼ09FiWQŞ:@T'\jjĨzvn xĐ^1t-@ːxGz[ZO.~ ]Lj2NK2YC`?QX+_yEڥ1 D 3pU鳷EAUwdl8)Xz c &kn{ س%1,u~шCؚ*9>H;L#1O=Q) "#* xUcSLde:h9=j }RkI]uV:X$Œ #;BF֨mE`0 !&`}JQ2kp*DfiH*Z+[7/Ł7V% )n|@nyʇΆI ћm x"Y}OHS~祗^/\ |?nnI, s}4qƜMtVdIKLB&+(w,}}Ձ+Г׺,;8(*śEpP)5&"̋5}ep@}7"u 5wttk̴V->:h@T"J cltMbyΩ7F,_\ŗ^z=/L:}~yΖ_M,= |Mf{Y^` + k~>xh-٘K1‰c~va˛~2\\j3P0B`|L=$ CLǪ8&PTR!=N6N@5Xt1R@ߦ|hTw"=uVA^V?TԏƦăl2 Jkޫ_\nMPl _Kk!o?2"g2~/䈤5wހ. EE)>9s]X P,@#joXTDàdN} Jw,UnBOC?,/ҿ?CjaYNqC J.& c$3f0Ïl2پLb~_W&3t:.})$!h/;Eǟ?_ٞdV]UTbHћk4Wɷ#9kXVc hUWTB_58:8l*#[7,& "P ?㤾GLÊJkn6~`{?MuQ1Uߌv@gw(R嶢N GTdk9TC9DnN&A&>_&W?KP A;嶯-߿<;mN}iހIENDB`( !6 767!!!!!!!!!!!!!!!!!!!!!!!""!!""""""""""##"""##"############999#$###$$$$$$$$$$$$$$$$%%%%%%%%%%%%%%%&&%&&&&&&&&&&&&&'''''<<<'''''''('((''((((((((((())())))))))))))*))***********+*++@@@++++++,+++++,,,,,,,,,,,,------/-..../../////////00/000000EED000011111111111111322233333343434444444444555555555555555IIJ5555657777776 W ! 677!!!!!!!!!!!!!!"!!!"!!!!""""""""""""""""#""###############99:$$#$$$$$$$$$$$$$$$%$$%%%%%%%%%%%%%%%&&&&&&&&&&&&&&&'&''''<=='''''(('((((((((((((((()))))))))*)))*))**)*********++++++@@@+++++,,,,,,,,,-,,,-,,----.-/.-.././//////////00/000000000EEE111111111111122222322433433344444444544554555555555555555IJI565776777777777788X  !! 777!!!!!!!!!"!!""!""!"""""""""""""""""###"#"###############$9::$$$$$$$$$$$$$%%%$$%%%%%%%%%%%%%%%&&&&&&&&&&&&&&&'''''''''=<=''''('((((((((()((())))))))))))))**)************+++++++++@@@+,,,+,,,,,,-,,,,,,-,--.---.......///////////0000000000000EEE111111111121322222322333443444544445455555555555555555655JJI667777777777877787888898 :  ! !! !!!! 777!!!!!!!!!"!""!"!"""""""""""""""""#""#############$##$#$$$:::$$$$$$$$$$%$%%$%%%%%%%%%%%%&%&&&&&&&&&&&&&&&''&''''''''''==='''(((((((((((()))))))))))*)))))*************+**+++++++++A@@,,,,,,,,,,,,--,---.--.-.//-/.//////////////00000000101111EEE111112212222222333334443444444544554555555555555555555656JJK767777777778887888888989989: :  ! !! ! !!!777!!!!!!!!!!""!"!""""""""""""""""#""#"############$$#$#$$$$:::$$$$$$$%$%%%%%%%%%%%%&%%%%&&&&&&&&&&&&&&'&'&'''''''''''''===(((((((((((()()))))))))))))**)**********+*++++++++++++++,@AA,,,,,,,,,---------.-.-..////////////00/0/0000000101111111FFF111112222222323333444444445444454555555555555555566656666JKK777777788888888888898989999999:  !! !!!!!!!!!!777"!!!!!!"""""""""""""""""#""""##"##############$$$#$$$$$$$:::$$$%%%%%%%%%%%%%%%%%&&%%&%&&&&&&&&&&&''''&''''''''''''''(===((((((()()())))))))))*))*************+*+*++++++++++++,,,,AAA,,,,,,,,------.-.....///////////00/0000000000100011111111FEF222222322333333443444444445545555555555555555565666767777KKK877777788888888888989999999:9:;;;  ! ! ! !!!!!!!!!!!!!777!"!!"!""""""""""""""""#"#"##################$$$$$$$$$$$$$:::$$%%$$%%%%%%%&%%&%%%%&&&&&&&&&'&&&&&'''''''(''''''('('(((===(((((())())))))))))*)**************++*+++++++++,++,+,,,,,BBA,-,,-,----.---.-//.//////0//////0000000000000011111111121FFF222222323433344444444444545555555555555555666655666777777KKK7778878889888888889999::9:::;:;;;;;< V !!!!!!!!!!!!!!!!!!!877""!""""""""""""""#""""##"##############$$#$$$$$$$$$$$$$$$:;:%%%%%%%%%%%%%&%%%%&&&&&&&&&&&&'&&&&''''''''''(('('(((((((>=>)(((())))))))*))))*)**************+*++++++++++++,+,,,,,,,AAA-,-,------.-...//./////////0//000000000000111111111111221FFG223433333434444444444454555555555555555655666666777777777KKK8788888888888999999:9::::::;;;;;;;;;V !! !!!!!!!!!!!!!!!!!!!!877""""""""""""""""""####"##############$#$#$$$$$$$$$$$$$$$$;;:%%%%%%%%%%&&&%%&&%&&&&&&&&&'&&'''''''''''''''('((((((((((>>>((()))))))))))**)**)********++*++++++++,++,,++,+,,,,,,,,,BAB------..-.//./////////////0000000000011000111111111122222GGG323334334444444544545555555555555655565656667777777777877LLL888888888988999::::9:;::;;;;;;<<;;;; !7 ! !!!!!!!!!!!!!!!!"!!"!888"""""""""""""""##"##################$$$$$$$$$$$$$$$$$$$%$;;;%%%&&%%%&%%%&%&&&&&&&&&&&&''''''''''''''''(''((((((((((((>>>)))))))))))**))************+*++++++++++,++,,,,,,,,,,,-,-,BBB---.---/...///////////00000000000100110111111111122222322HHF344443444444544544555555555555555556665766777777777878878LLL888888988999:99::::;:;;;;;;;;;<;;<;<<<<7 ! !!!!!!!!!!!!!!!"!!!"!!""!""888"""""""""""""""############$##$$$$#$$$$$$$$$$$$$$$%%%%%%%;;;%%%%%%%&&&&&&&&&&&&&&&&&&&'''''''''''('('((((((((()((()))>>>))))))*)))*)*********+**+*++++++++++++++,,,,,,,,,-,,,,---CBC.---.././//////////0/000000000000010111111111221222322333FGH444444444444555555555555555555565756766777777787877787888LLL8898989:9:::;::;;;;:;;;;;<;;<;<<<<<<<<< ! ! !!!!!!!!!!!!"!!!!!!!!!"!""""888""""""""""#""##########$#####$$$#$$$$$$$$$$%$$$$$$%%%%%%%;;;&&%%%%&%&&&&&&&&&&&&&&&'''''''''('''((((((((((((((((())))?>>))))))************+**++++++++++++,+,,,,,,,,,,,,,,,,-,---.CCB-/.///////////////000000000000110111111111122222223333334HHH444444444555555555555555555555656666777777777777887888888LLL98899999:::::::;;;;;;<<;;<;<<;<<<<=<<=< ! ! !!!!!!!!!!!!!!!!!!!!"!""!""""""889"""#"##""################$$$$$$$$$$$$$$$$$$$$$$$%%%%%%%%%;;;%&%&&&&&&&&&&&&&'''&&''''''''''''((((((((((((((())())))))??>))))**)***********+**+++++++++++,,,,,,,,,-,,,,-,-------.-CCC//.///////////0000000000000001111111111121222323333323444HHH444444545555555555555555655566766767777777787888888888888MLL9999:::9:;;:;;;;;;;;;;<;<<;<<<<<<<<<=<<676776776777777777777777777887887888888888CCC898898998999999999:9::::999::::::::::::;::;::;;;;;;;;;;;;FFF;;;;;;;;<<;<;<<<<<<<<<<==<==<<=======>>>=>>>>>>>>>>>>>>??IJJ??????????@???@@?@@@@@@@@@@@@@AA@AAAAAAABAABABBBBBCBBBCBCNNNDDDDDDDDDDDDDDDDDDEEEEEEEEEEEEFEFFFFFFFFFFGGHHGGHHGHHHHHHSSRHHIIIHIIIIIIIIIIIIIIJIJIIIJKKJKKKKKKKKKLKKLLLLLLLLLLMLLLMWWWMNMMMNNNNNNNNNNONNOOOOOOOOOPOOPPPPPPPPQ! ! !!!!!!!!!!!!!"!!!!!!!!!""""""""""""#889""""#################$$$$$$$$$$$$%$$$$%$$%%%%%%%%%%%%%%&&;;;&&&&&&&&&&'&'&&''''''''(('((('((((((((()((()())))))))))))???*************+*++++++++++,+,+,,,,,,,,,,,,--------.-..././DDD///0/////000000000000010111111111121222222433444444444444IHH555555555555555555555566767777777777877888888888988999999MMM9:::::;;;;;;;;;<;;<<<<<<<<<=<<<====>=>> !!!!!!!!!!!!!!!!"!""""!!""""""""""""""#"989"###########$#####$#$$$$$$$%$$$$$%$%$$$%%%%%%%%%%%%&%%%&&;<;&&&&&&&'&'''''''''''''''(''(((((((((((())())))))))))))*))???*********++++++++++++,+++,+,,,,,,,,,,,------.-..//.//.///DDD/0/00/000000000001110111111111211222223323433443444454445III555555555555555566665767777777877777888888888898899999:99MNN;;;;;;;;;;;;;<<<<<<<<<<<<<=======>===>>!!!!!!!!!!!!!!!!!!!!"""""""""""""""""""###989#############$$#$#$$$$$$$$$$%$$$$$$$%%%%%%%%%%%%%&&&&&&&&;;;&&&&&&''&''''''''''''(''((((((((((()((()))))))))))))))***???*****++*++++++,+,,,,,,,,,,,,-,----------./...././/////0/0DED000000010001111111111211222222232333334444444454455554555III55555555566566667667777787777787788888888888889899999:9;9NNM;;;;;;<;;;<<<<<<<<<<<=<<<=======>>>>?>?!!!!!!!!!!!!!!!"!!""!"""""""""""""""#"##"#999######$##$$$$$$$$$$$$$$%$$$$$$$%$%%%%%%%%%%%&&&&&&%&&&&&&<;;&&&''''''''''''''''(((((((((((((())))))))))))))))**)*****@?@+++,,,,,,---.--...././//00/000000000111111222222222323333GGG333333344444444444455554555666565676677777877787887888888LLL888888888999:9999999:999:99999999999999999889999:999;:;::NNN;;;;;;;<;<<<<<<<<<<<<==<===>=>?>??>>???!!!!!!!!!!!""!"!""""""""""""""""""#"##"###999#######$##$#$$$$$$$$$$$$%$$%%%%%%%%%%%%%%%&%&&&&&&&&&&&&&<<<''&'''''''''''('((((((((((((((((()))))))))*))*)*******+*+AAA-,,---.//00/111333444555656666777777777998999999999:999::MNM:::::::::;;;;;;;;;;;;;;;<=<=<=<=<=>=>>>>>>>>>>>>?>???????RRR??????@@?@?@@@@>??>>>>>>===<<<;;;::::::::::9:9::::::;:;;:NNO;;;;;<<<;<<<<<<<<<======>>=??>>>???????!!!!!!"!!!!!""!""""""""""""""""#"#########999####$$#$$$$$$$$$$$$$%%$$$%$%%%%%%%%%%%%%&%&&&&&&&&&&'&''&<<<'''''''''''(''(((((((((((((())))))))))))*))*)********+,,+AAA...000222445777:::<<<===??????AA@AAACBBBBBCCCCCCCCDDCCDDDWVVDDDDDDEEEEEEEEEEEFEEFFFFFFFGFFGGGGGGGGGHHGHHGHHHHHHHHHHHHZZZIHHIIIIHIHHHHHHGGGFFFDEDBCC@@@>?>===<;<;;;;;:;;9;;;;;;;;;OOO;<<<<<<<<<<<=<<==<======?>>>>>???????@?!!!"!!!!!"""""""""""""""""#"""############999###$$$$$$$$$$$$$$$$$$%%%%%%%%%%%%%%%%%&&&&&&&&&&&'&'&&''&<<<''''''''''''(((((((((((()(())))))))))))*)**********+++,--CCC011333777:::??>CCCEFFIIHKJKLLMONOOOOPPOPPPPPPPPPPPQQQQQQQbbbQQQQQQQQQRRRRRRRRRSSSSSRSTSTTSTTTTTTTTTUUTTUUUUUUUUUUUUUUfffUUVVUVVVVUUUSTSRRROOOMMMJJIFFFBBC@@@>>><=><<=;;;;;;;;;<<;OOO<<<<<<<<<<<=<=<===>==>>>?????????@??@?@!!!!!""""""""""""""""""##"""#####$#####$##:::$$$$$$$$$$%$$$$$$$%%%%%%%%%%%%%%%%&%&&&&&&&&&&'&&'&'&''''<<='''(''(('(((((((((((()()))))))))*))))************+*,,,---DDE333777<<=BBBHHHNMMSSSVVWYZZ]\]^^^__```````aaaaaaaaaaaaaaaqqqaaaaaababbbbbbbbbbcdcdddddddddddeeddeddedeeeeeeeeeeeeeeeeutufeffeeeeedddbbb___[\\WXXRSRMMMIIHDDD@AA??><<<<<<;;;;;;;<=>=>>>>>>???????????@@@@""!"!"""""""""""#"#"""""#"########$######$:99$$$$$$$$$$$$%$$%%$%%%%%%%%%%%&&&%&&&&&&&&&&&&&'''''''''''===''''''((((((((((((()()))))))))))))**************+++,,,/./GFF777=<=CCCKKKSSS[[[babhghlllpoorrqsssttttttttttttuuttuuuuuuuuuuuvuvvuvuvvvvvvvvvvvwwwwwwwwwwwwxxxxxxxxxxxxxxxxxxxxxxyxxxxwwxvuvsssooojjjddd]]]VVVOOOIIIDDDAAA>>>==<<;;<;;<<>=>???>????????????@@@AA@""""""""""""""""""#""##############$#$#$$#:::$$$$$$$$$%$$%%$%%%%%%&%%%&%&%&&&&&&&'&&&&&'&&&'''''''''''===((((((((((((((((()))))))))*))***)*************+*+++---000III::;BBBKKKUUUaa`jjkttt{{{{{zsssiii___WVVNNOHHICCC???===;<<<<<<<==>>>>=>>>???????????@?@@@AA@@AA"""""""""""""""##"###############$##$$#$$$:::$$$%$$$$$%$%%%%%%%%%%&%%%&&&&&&&&&&&&&&&'&''''''''''''''(===((((((((((((((())))))))))*)))***************+++++,+.-.111KKK>>>HGHTSS```jij^^^TTTLLLEEEAAA>>=<<<<<<=<=>=>>>>>>???????????@@?@@A@@A@AAAB"""""""""""""""#""############$#$$#$$$$$$$:::$$$%$$%$%%%%%%%%%%%%%%%&&&&&&&&&&&&&&&&&&''''''''''('''('===(((((())(((()))))))))*)))))************+*+++++++,,+...323MMMBBBMMMZZZiiirrrdddYYYOOOGGHBBB>>>=<<<<=<=?>>>?>????????????@@@@@@BAAAAAABB"""""""""###################$$$$$$$$$$$$%$:::$$$%$$%%%%%%%%%%%%%&&&&&&&&&&&&&&&&'&'''''''''''(''('('((>==(((((((()())))))*))))**)************+++++++++,++,,,...333NNNDDDPPP^_^oopxxwiii\\\QRQHHHBBB?>?<==<<===>=>>????????????@?@@@@A@@AA@AABBBBBBB""""""""##""######$#####$##$$$$$$$$$$$$$$$::;%%%%%%%%%%%%%%&&%%&&&&&&&&&''&&&&'''''''''''''''('(((((((>>>()())()))))))))))))))*******+*****+++++++++++,++,,,///444OOOEEERRRaaasrr{{{kkk^^^SRSJJJCCC???===<=====QQP>>>>>>?????????@??@@@@@@AAAABBBBBBBBBBB"""#"###############$####$$$$$$$$$%$$$$$%%;;;%%%%%%%%%%%%%%%&&&&&&&&&&&&'&&&'&'''''''''''''(((((((((((>>=))()())))))*)))**)**********+*+++++++++++++,+,+,,,,///544PPOEEFRRRaaarrs{{{kkk^^^SSSJJJCCC?@?======>>>QQQ?>>???????????@@@@@@A@@AAAABBBBBBBBBBBB#"###############$####$#$$$$$$$$$$$$$$$%%%;;;%%%%%%%%%%%%&&&&&&&&&&&&''''&''''''''''(''(('(((()(((((((>>>)))))))))*)))*)*******+****++++++++++++++,,,+,,,,-,///444OOOEEEQQQ__`pppyyyiii]]]RRRIIICCC???=>>===>=>QRR?????????@??@@@@@AA@BB@AABBBBBBBBBBBBCC""################$$$$$$$$$$$$$$$%$$%%%%%%;;;%%%%&%%&&&%&&&&&&&&'&'&&''&'''''''''''''('(((((((((((()))>>>))))))))**)*************++*++++++++++++++,,,,,,,---///444NNNCCDNNN[[[jjjsssfffZZZQPPIHIDCC@@@>>>=>>>>>RRR??????@@?@@@A@@A@ABAABBBBBBBBBBBBBCCCCC##############$$#$$$$$$$$$$%$$$$$%%%%%%%%%;;;%&%&%%&&&&&&&&&&&&&&'&'''''''''''''''(((((((((((()())()))>?>))))))*)************+++++++++++++++++,,,,,,,,,,,---///333MMLA@@JJIUUUbbblll```VVVNMMGGGBBB@@??????>???RRR???@?@@@@@@@@@@ABAABBBBBBBBBBCCCCCCCDDD#########$##$$$$$$$$$$$$$$$%%$%%%%%%%%%%%%;;;%%&&&&&&&'&&&&&''&&'&''''''''''''((((((((((((()()(())))))??>)))))*********+***+*++++++++++,++,,,,,,,,,,,,-,,---///232KLL===DDDMMMWWWcbblmluuu}}}}}}uuulllbaaXXXQQQJJJFFEAAB@???>>??????RRR???@@@@@@A@@@AABAABBBBBBBBBCBBCCCECCCDD9999999:::99:::::::::::::::;;;;;;;;;;;;;;;FFF;;;;;;<;;<<<<<<<<<<<<<<<<<<==========>=>==>>>>>>>>>>>??>>JIJ??????????@@@?@@@@@@@@@@@@@AA@AAAAAAAAABAABBABBBBBBDDCEGFTTSNNNSSSYYY`_`gggnnntttyyy}}}{{{vvvpppjiiccc^^^ZZZVVVTTTRSSRRRRRRRRR\\\SSSSSSTSTTTTUTTUUUUUUUUUVUVVVVVVVWWWVWW###$##$$$$$$$$$$$$$$$$$$$%%%%%%%%%%%%%&&%&;;;&&&&&&&&&&&'''&''''''''''''''(((((((((()(()()))))))))))**???******+****+++*++++++++++++,++,,,,,,,,,-,---------./0.111HHH777;;;@?@EEEKKKPPQVVVYZZ]]]`__aaabbbbbbbbcdcccdcddddeddeettteeeeeeeeeeeeeeeeeeeeefeffeffffgfffgfggggggggghgghghhhhhhhxxxhihhihhhhgggeeebbb___[[[VVVQQQLLLHHHEEECBBAA@@@@??????@??SSS@@@@ABBBBABBBBBBCBBBBCCCDCCCCCDCCEEDEED$##$$#$$$$$$%$$$$$%$$%%%%%%%%%%%%%%%&&&&&&;;;&&&&&&&&'''&''''''''''(((''((((((((()((((())))))))))))))*???***********+++++++++++,++,+,,,,,,,,---,------.-..-////111GGG555777;;;?>>CBBFFFJJIMMMONOPPPQQQRRSRSSTSSTTTTTTTTTUUUUUUfffUUUUUUUUUUUUUUUVUUUVVVVVVVVVVVVWWWWWWWWXWWWWXXXXXXXYYYXYYjjjZZYZZZZZZYYYWWWVVVSSSQPQNNNJJJGGGEEFCCCBBBAAA@@@??????@@@SSSA@AA@BBABBBBBBBBBBCCCCCCCCCDCDEDDEEEEEE$$$$$$$$$$$$$$$%$$%$%%%%%%%%%%&&%%&%&&&&&&;<;&&&&&&'''''''''''''((('(((((((((((())))))))))))))*)**)***???**+***++++++++++++,,,+,,,,,,,,,,,-,---,-.--.-..././///001FEF332555767999<<<>>>@@ABBBCCCDDDEEEFFFGGFGGGGGGGGGGHHHHHHHHZZZHHHHHHHHHHHHHHHIIJIJJJJJJJJJJJJJJKKKKKKKKKKKKKLLLLLLLLMMM___NNNNNNNNNMMMMMMKLLJKKIIIGGGEEFDDDCBCBAAAAAA@@?@?@@@@@@@AASTSAAAAABBBBBBBBBBCCCCCCDCDCDCEDDEEEEEEEEE$$$$$$$$$$$$$$$%%%%%%%%%%%%%%%%%&&&&&&&&&&;;;&&&''&''''''''''''('(((((((((()()((()))))))))))*))*******?@?+***+*+++++++++,+++,,,,,,,,,,,,-,--,.--.-...././//////000EEE221222444555666888999:::::;;<;=<<<=====>>>>>>>>>>>>?>????RRR?????????@A@???@@@AAAAAAAABAABBABBBBBBBBBBCCCCCCDCCDDDEEEWWWEEEEEEEEEEEEEEEDEDDDDCCCCCDAAAB@B@@@AAA@@@?@@???@@@@@@@AAUTUBBBBBBBBBBCBBCBCCCCCDCDDEDDEDEEEEEEEEFE$$$$$$%$$$$$%$$%%%%%%%%%%%%&%%&&&&&&&&&&&&<<<''''''''''''(((((())))))*********************************?@?++*+++++++++++,,,,,,,,,,,,,,,,------..-...////////////00/EDD111222222222333343444455555666676767777778787888888888888LLL888898899998:::::::::::;;;;;;;;;;;<;;<<<<<=<=<=====>>>>>>QRR?????????????@?@?@?@@@???@?@?@@@@@@@@@@@??@@?@?@@@@@AAAA@UUTBBBBBBBBCBBBCCCCCDDDCDDDEEEEEEEEEEEEFEE$$$$$$$%$$$$%%%%%%%%%&%%&%%&&&&&&&&&&&&&'&<<<'''''''''()())))))**++*+++++,+,,,,,,,,+,,++++++++++*****+@?@++++++++++,,,,,,,,,,,,,,,,,------.../..////////////0//000DDD100000001111211222222323322343443444554455555555555555555III555666666777777777878888888888998999999999::::;:;;;;;;;;>>>?>?>?>?>?????????????@@@A@@AAAABBBBUUVBBBCBBBCCCCCDCDDDCDDDEEEEEEEFEFEEFFFFFF$$$$$$%%$%%%&%%%%%%%%%%%&&&&&&&&&&&&'&&&'&<<<''''''((()))***+++,,,---...//////./....------,,,,,,++++*+@@@+++++++++,+,,,,,,,,,,-,,---.--.-..../../////0//00//000000EDD101011111112221111222322233443444444444544555555555555555III6656667777777777777777888888898888989999::9::;;;;:;;;;;;;OOO<<<<<<<<<<<<=====>>==>>>>?>?????????@??@@@@@@A@@BBABBABBBUUUBBBBBCCCCCDCDDDEDDEEDEEEEEEEEEEEFGFFFGF%%%%%%%%%%%%%%%%&%&%&&&&&&&&&&&&&&&&''''''=<='''('')((***+++--,///000222334444333222111000//.---,,,,++@@@+,+,,+,,,,,,,,,,,,,,,-------/-././/./////////00/000000000EEE111111111111111212223422433444444444444445555555555555555III5656767777777777778788888888888999999:9:::;::;;:;;;;;;<;>=>????>???????@??@@@A@@B@A@AABBBBBBBBBUUVBCCCCCDCCDCCDEDEEEEEEEFEEEEFEFFEFFFFGGF%%%%%%%%%%%%&%%%%%&%&&&&&&&&&&''&'&'''''''<<='''('()))+++---///222445777999:::9:9888666444222000...,,-AAA,++,,,,,,,,,,,,-,----.--.-../././/////////0/00/0000000000EEE111111211111222333323433444444444544545555555555555555565JIJ677777777777887888888888888988999999::;;;:;;;;;;;;<;<<<<=====>?>>>???????@?????@@@@@@AAABAABBBBBBBBBCBBUVVCDCDCDCCDCDEEDEEEEEEEEFEFEEFFFFFFGFGGHG%%%%%%%%%%%%%%%&&&&&&&&&&&&'''''''''''''''==='(((((***,,,/00223666:::>>>BABCCCCCC@@@==>:::777334000...BBB,,,,,,,,,,,,---------..//.//////////////0/0/0000000010110EEE111111221222232332333444444444444455555555555555555655665KJJ7777777778778878888888889889999999::;:;;;;;;;;;<;<;<<<<<=>==?>?????????????@@@@@@A@ABAABBBBBBBBBBBBCCCVVVCCCDDDDDDEEEEEEEEEEEEEFFFGFFFGFGFHGGHHH%%%%%%%%%&%%&&&&&&&&&&&&&'&''&''''''''''''===((((()**+---122666;;;A@@FFFMNMMMMKKKGGGCCC>>>999454010CCC...---,,,,,,---.----///./..//////////00000000000000101111FEE111211222233343233434444454454555555555555555555565656657KKK7777777888888888888988899999:9::;:::;;;;;;<;<;<<<<;<<<<<>=>>=>?>????????????@@?@@A@A@AAAAABBBBBBBBBCBBCCCCCVWWDDCDDDEEEEEEEEEFEFFEFFFFGFFGHFGGGGHHHHH%%%%%&%%%&&&&&&&&&&&'&'&'&&''''''''''''(((===((()()+++///444:::AAAGHHOOOZZZWWWSSSNNNGGGAAA99:555EEE///...---,-----...-/.////////////000/00000001000001111111FFE221222232333434344444444444445555555555555555556676776777KKK77777888888888888988999999::;;::;:;;;;;;;;<;<<<<<<<<<<<<==>>>>>>????????????@@@@@ABAAAA@BBBBBBBBBBBCBBBCCCCCDVVVEEEEEEEEEEEEEEEFFEGGFFFFFGHGGGHHHHHHHHH%%%&%%%&%&&&&&&&&&''&'''''''''''''''('((((=>>((()))+++000666>>=GGFPOPYYYfffaaa[[ZSSSJJJAAA:::III112///....----.--.///////////////000000010001111111111111FFF122223333333444444444444555555555555555555566666667777777KKK878778888888888999999::::;:;;;;;;;;;;;;;;<<<<<<<<<<<<<===PPP>>=>==>>???????@???@@@@@A@@AAAAAABBABBBBBBBBBCBBCCCCCCDDDWVWEEEEEEEFEEEEEFEFFFFGFGGGGHHGHHHHHHHHHHH&%&&&&&&&&&&&&&&&&&''''''''''''''(((((((((>>=(()))),-,111888ABALLKVVVbbbqpqjji```UVUKKKABBNNN6662220110/////../////////00/0000000000010111111111111121FFF222323333444444444454455555555555555555566556766767777777KKK887888888888999999::9;9;;;;;;;;;;;;;<<<<<<<<<<<<<=<<=<==>QQQ>>>>>??????????@@@@@@@@AA@@AAABBBBBBBBBBBBBCCCCDCDCDCDCEEWWWEEEEEEEEEFFFFFFGFGGGFGGHHHHHHHHHHHHHIIH&%&&&&&&&&&&&'&''&''''''''''('('((((((((((>>=)(())),-,223:9:DCCPPP\\\kkkyyyooocccVVVKKKTTT;;;77633312100000/////0///0000000000000100111111211112222FGG342434433444444554544555555555555565565666566776777777777LLK888888888889999:99::9:::;;;;;;;;;;<;<<;<<<<<<<=<==<>====>QQQ>???????????@??@@@@A@A@AAA@BBBBBBBBBBBBCCBCCCCDCCDDEDDEEEWWWEEEFEFFFFFFFFGGGGGHGHGHGHHHHHHHIHIHIIII&&&&&&&&'&'&&'''''''''''''''((('((((((()))>=>))))*),--233;;;FFFRRRaaapqqrrrcddWWW]]]CBB;;;678444222101000/0//00000000000111111111211112222323HGG334434444444445545555555555555565555656666767777777778887LLL8888889899999::::;:;;;;;;;;;;;;;;<<<<<<=<<<=<==<>====?>>>QRR???????@?@?@@@@@@AAAAAAABABBBBBBBBCCBBBCCCECCDDDDDDEEEEEEXWWEEEFFFFFFFFGGGFHHGHHHHHHIHHIHIIHIIIIIII&&&&&&&'&'&'''''''''''(((('((((((((()((())>>>)))**)---333;;;FGGTTTdcctuusrsdeehggLKLBCC===888444222111011000000000111111111111112222222322HGG444444444544545555555555555555556566766677777777777878888LLL899898999:9:99:;:;;:;;;;;;<;;;<<<<<<<<<<<<========>>>>>>?RRR??????@??@@@@@@@@ABABABABBBBBBBBBCBBCCCCCCDDDEEDEEEEEEEEEXXXFFFFFFGHFFGGGHHHHHHHHHHHHHHIHIIIIKJIIII&&&'&''&'''''''''''''('(((()((()()(())()))>?>)))***---232:;:FEFTTTdddvvvssstttXWYLMMDDD===888554333222110000111111111111111222222323333HHH444444544555555555555555555656666666777777777778888888888LLL999999:99::9;;;;;;;;;;;;<<;<<<<<<=<<=<<=========>=??>>???RRR???????@?@@@B@AAABAABBBBBBBCBBBCBCCCCCCDCDEEDDEEEEEEEEEFEXXXFFFFFFGGFHGGHGHHHHHHHIHHIIHIIIIIJJJIJJJ&&&'''''''''''''''('((((((((((()))(())))))???)*)***,--222::9DEDRRRbbbuuufefYYYMMMDDD==>888555333222111111111111121222223332343443HHH454444545555555555555555566665665777777777777788888888888LMM999:;9:::::;;;;;;;;;;;;<<;<<<<<<<<<===<==>=>>>>?>????????RSR???@@@@@@BAABBABABBBBBBBBBBCBBBCCCCDDCDEDDDEEEEEEEEEEEFEEXYXFGGGGGHGGHGHHHHHHHHHIHHHIIIIIIJJKJIJJKK<<<<<<<=<=<========>=====>>>=>>>>>>>?>??>?IJJ???@@@ABBFEFLLLUUU```oonuuuiii___WWWQQQLLLIIIHHHGGGFFFFFEFFFFGGGGFHGFHHHHHHHHIRSRHIHIIIIIIIIIIIIIIIIIIIJJIJJJKJKJKKKKKKKKLKLLKLLLLLLLLLLLMWWWMMMNMNNNNNNNNNOONOOOOOOOOOOPPPPPPPPPPPQPPQQRQRRRRRRRRRRRR\\\SSSSSSTTSTTUUUTUUUUUUVUVVUVVVVVVVVWWWWWWWWWWWXWXXWXXXXXXYacaZZYYZZZZZZZZZZZ[[Z[Z[[[[[\\[[]\\\\\]]]]'''''''''''''('(((((((((()(((())))))))))))???******,,,000666???KKKYZYjjjtuufffYYYNNNEEE?>>999666444333222222322332333344444444HII554555555555555556555665776777777777778888888888898988999MMN:;:;;;;;;;;;;;;<;;<<<<<<<<<==<<<======?>=>??>???????????@SSS@@@AAAABABBABBBBCBBBCBCCCCCDCDECDDDDEEEEEEEEEEEEFFFFFGGFFZYXGGGGHHHHHHHHHHHIHIIIIJIJJIJKJJKKJKKKKKK'''''''('((((((((((((((()(())))))))))*)*))???******+,,///444<<>>?????????????@???@SSS@@@BBABBABBBBBBBBBBCBCCDECDDDDECDDEEEEEEEEEFEFFEFFFFFFHGGYZZHGHHHHHHHHHHIHHIIIIIJIIJJJJKKKKKKKLLKLM''''''((((((((((((((()()))))))))))))**)***@??*****+,,,...322888A@@LLLZZYjjj{{{vuugfgZZZOOOFFF???:::777565454444443444444444445III5555555555555557666677777777777778788888888888899999:9:;:NNN;;;;;;;;;;;;<<<<<<=<<<<=<=====>>>>>>??????????????@@@@@@@STTA@ABABBBBBBBBBBBCBDDCCCCDDDDDEEDEEEEEEEEEFFFFFFGGFFGGGGHHZZZHHHHHHHIHIHIIIIIIJIIIJJJJJKKLKKLLLKLLLL(''(('(((((((((((())))())))))))))*********@??****+*,,,.--011555<<===>==>>>????????????@?@@@A@ABA@TTTBBBBBBBBBBBCCBBCCCDDCDDDEEDEEEEEEEEEEEEEEFFFFFFFGGGGGGHHHZZZHHHHHHIIHIIIJIIIJJIJJKJJKKKKKLLLLMLLMLM('''((((((((((()))))))))))))*))*)*)*******@@@**++++,,+---///333888???HIHTTTbbbrrrvvvhggZ[ZPPPGGHA@@<;<999777666555545555555III5555555666676667777777777778878888888889889:99:9:::9;:;;;OON;;;<;;<<<<<<<<<=<<========>?=>>?>?????????@??@@@@@AAA@AAAUUTBBBBBBCCBCBBCCCCCDCDDEDDEEEEEEEEEEEEFFEFFFFFFGGGGFGHHHHHHZ[ZHIHIHHIJIIIIJJJJJKKKKKKKKLKLLLMLMMMMMMM((((((()(()()(())))))))))))***********+*+*@@?+++++++++---...0114449:9AAAKKJVVWdddstsvvvhhh[[[PPQGIHBBB<==999777666555555555III555656656676767777777778878888888898989:99:9:;::::;;;;;;;NNN;;;<<<<<<<<<<<<====>==>=>>>??>??>????????@@@@@@AAAABAAAAAUUUBBBBBBCCBCCCCCDDCDCDDEEEEEEEEEEEEFEEFFGFGGGFGGGFHHGHHHHHHZ[[HHIIIIIIJJIIJIKKJKKKKKKKLLKLMMMMMMMMMMM(((()(((())))))))))))))))*)*********+*****@@@+++++++,+,,,...../122555;;;CBBKLLXWXffetttwwvhhh]]]QQQIIIBBB===9:9888666555555III5556567667777777777878878888888898999999:::::;:;;;;;;;;;;OOO<<<<<<<=<<=<=<=======?>>>??????????@???@@?@@@AAAAAABBABBBUUUBBBCCCCCCCDCDCDDCDEEEEEEEEEEEFFFEFFFFFFFGGHHGHHHHHHHHHHHH[[[IHIIJIJKJJJJJKKKKKKKKLLKLLMMMMMMMMMMMMM((((((()())))))))))))**********+****++++++@@@+++,,+,,+,,,---...0//222777<;;DCCLMMYYYffftuuxwviii]]]QRRIIIBBB===:::888666666IJJ6666677777777777778788888889889999999:::::::;;;;;;;;;;;;>>????????????@@@@AAA@AA@@BBBBBBBCBUUUBCCCCDCCCDEDDDEEEEEEEEEEEFEFFFFFFFFFGGGGGHHHHHHHHIHHHHIHI[[[JIIIIJJJJKKKKKKLLKLLLLMMMLLMMMMMMMMMNMM((())())))))))*)))*)*******+***+*++*++++++@@@+++++,,,,,,,-,,---...000234668===DDDMMMYYYfffuuuxxxjjj]]]RRRJJJBBB===:::888687JJJ7677767777778778778888888899889999::9:9;;;;;;;;;;;;<;<<<=>=>==>?>>?????????@@@@@@@@@@AAAAABBBBBBBBBBCBUVUCCCDCCECDEDDDDEEEEEEEEEEFFEFFFFFGGGGGGGHHHHHHHHHIIHHIHIII[[[JJJJJJJKKKLKLKKLLLLLLMMMMMMMMMNMMMMMNNN((())))))))))))**)*********+**++++++++++++AAA++,,,,,,,,,--,----.../.0002443888===DDDNNNYYYggfvuuxxxjjj]]]RRRJJJBBB>==:::999LLL777777777777887888888888899999;:9::9:;:;;;;;;;;;;;;<<<<<>?>>>>>>>>?????????@??@?@@@AA@@AA@BAABBBBBBBBBCCCVVVCCCEDDDEDEEEEEEEEEEFEFFFFFFGGFGGGHHGHHHHHHHHHHHHIHIIIIJII\]\JJKKJKKKLKLMLLKMLMLMMMMMMMMMMMNMMNNNNNN))))))))*)))****)********+***++++++++++,,,AAA,,,,,,,-,-,,-,----....//000222444888>>=EEENNNZYZgffvuvxxxjjj]]]RRRJJJCCB>?><<;MMM899888877777888888888998999::9::::::;;;;;;;;;<<;<<<<<<<<=>=>>>???????????????@@@@@A@A@AABBBBBBBBBBBBBBCBCCCVVVDCDEEEDEEEEEEEEEFEEFFFFFFFGGGGGGGHHHHHHHHHHHHIIHIIIIIIJJJ]]\JKKKKLKLKMLKMLLMLMMMMMMMMMMNMMNNNNNNNON)))))*)*))**********+*+***+++++++++++,,,,,AAA,,,,,,,,---,..----....////0111222444988>>>EEENONZZZgggvvvxxxjjj]]]SSRJJJDDD???OOO;::999888888888898999999::9:::;;:;;;;;;;;<<;;<<<<<<<<<<=====>=>>>?>???????@????@@@A@A@BAABABBBBBBBBBBBBBBCCBCCCCWVVDDEEEEEEEFEEEEEFFFFFFFFFGGGGHGHHHHHHHHHHHHHIHHIIJIIJIJKJJ]\]LKLKLKLKMMLLMMMMMMMMMMMMNMNNNMNNNONNOOO))))))**)************+*++++++++,+++,+,,,,,AAA,,,,,,,-----//././/////////000111333555999??>FFEOOOZ[Zghgxxxjjj^^^SSSKKKDDDSSS<=<;:;:::999888898999999;9:;::;;;;;;;;;;;<<<<<<<<<<<<<===PQP===?>=?>>??????????@@@@@@@@A@ABAAABBBBBBBBBBBBCCCCBDDDEDDWWWEEEEEEEEEEEEEEFFFFGFGGFFGHGHHHHHHHHHHHHIHIIIIJIIIIJJJIKKK]]]LKLKLLLLLMMLMMMMMMMMMNMNNNNNNNNPNOOOOOO)))*)*********+**+**++++++++++,+,,+,,,,,,,AAA,---,---..../...///////////00/0002214335559:9???FFFPPO[ZZwwwvvvxyykkk___TTTKKKWWV@@@===:;;:::99999999::::;:;;;;;;;;;;<<;<<<<<<<<<<<<=<====QQQ>=>>>?????????????@@@@@@AAAAAABBBBBBBBBBBBBBBCCCDDCDDDDDDWWWEEEEEEEEEFEFFFFFFFGGGGGGHHHHHHHHHIHHIHIIIIIIJJIJJKKKKKKKK]^]LLLMMMMMMMMMMMMMMMMMMNNNNNNNOONOPOPOPOP)***************+++++++++++,,+++,,,,,,,,,,BBA------...././////////0//0000/0000111222444666:::???GFGPPPllliiixwxyyyjjj^^]SRS\\\CCC???<<<::::::9:9::::;;;;;;;;;;;;;;<<;<<<<<<<<<=========RQQ>>>??????????@?@@@@A@@@@ABABABBBBBBBBBBBBCCCCDDDDDCDDDDEEWWWEEEEEEFFFFFFFFGGGFGGHHGHHHHHHHHHHIIHIIIIIJJJJJJIKKKKLKKKK^^^LLMLMLMMMMMMNMMMMNNNMONNNONONPOOOPPOPPP*************+++++++++++,+++,,,,,,,,,,,,-,BBB.--..-..-/////////0//0///00000000010111323444667:::@@@HGGbbc]]\jjjyyxvwvghh[[[aaaHHHBBB>>>;<=:<;::9:::;;;;;;;<;;;;;<<<<<<<<<<<=<=>===>==>>RRQ>??@??????@@@@@AA@@AAAAABABBBBBBBBBCBCCCCCCCCCCCEEEEEEEEEXWXEEEFFFFFFFGFGGGHHGHHHHHHHHHHHIIIIIIIIIJJIJJJJJJKKKKKLLLLL___MMMNMMMMMMMMNMMNNMNNNNOOOOOPPPPPPPPPPPP*********++++++++++++,,+,,+,,,,,,-,,-,,---BBC-.-...//////////0/000000000000010111111122333545677::;AAB[[ZRRR^^]lll|||rrrbbbgggLLLEEE@@@==<;;;;::;;;;;;;;;<;<<<;<<<<<<==<======>>=>>>>>>RRR???????@?@@@AA@AAABABBBBBBBBBBBBBCBBCCCCDDDCDDEDEEEEEEEEEXXXEEEFFFFFFFGGHHFHHGHHHHHHHHHHIHIIIIIIJIJJJKJJKKKKKLKLLKLLL^__MMMMMMMMMNMNNNNNNNNNOOPPOOOPPOPPPPPPPPP*****++*++++++++++++,++,,,,,,,,--,------.-CCC...//////////////0000000000100111111111121222334655877<==><<<;;;;;;;;;;<;<<<<<<<<<=<<==<===>>>=>>?>????RRR??@@@@@@@A@AAA@@@BBBABBBBBBBBBBBBCCCDCCCDDDDDEEDEEEEEEEEEXXXFFFFGGFFFGGGHGHHHHHHHHHHHHIIIIJIIIIJJJJKJJKKKKKKLMLLMLMMM___MMMNMMMMMNMNNNNNOONOOOPOPPPPPPPPPPPQPQP**++*+++++++++++++,,+,,,,,,-,,--,------/-.CCC.///////////000000000000000111111111111111222333455666999QQQDDDMNNZZZiiizzzooooooTSSIJJDCD???===;;;;<;;;<<;<<<<<<<==<=======>>>=??>???????RRR??@@@@@AAA@@BAABBBBBBBBBBBBBBBCDCCDCDDDDEEEEDEEEEEFEEEFFEYXXFFGFGGGHGHHHHHHHHHHHHIHHIIIIJJJJIJIKKJKLKKKKKLMLLLLMMMMMM___MMMNNMNNNNNNOONOPOPPOPPPPPPPPPPPQQPPQQP@@?@@@@@@@@@@A@AAAAAAAAAAAAABABBBCBCBBCCCCNNMDDDDDDDDDDDDDDDDEEEEEEEEEEEEFEEEFFEFFFFFFFGGFHHGHIIJJJLLMZYZUUU]]]gggtttyyzfff]]\WWWSSSPPPOOOOOOOOOOOOOPOPPPPPPPPPPPQQQQQRRRRRRRRRRR\\\RSSTTSSTTUTTTTUUUUUUUUUUVVVVVVVVVVVWWWVWWWWWWWXWXXXXXXXYXbbbYYYYZYZZZZZZZ[ZZZZZ[[[[[[\[\]\\]\\]\]]]]^^^^^^_^__^______hhh_____`_`_````aaaa`aaabaabaabbbabbbbbbcb++++++++++,++,+,,,,,,,,,,-,-----.-../..///DDD//////00/000000010010111111111112211222322233343555666989PPPBBBKKKVVVdddvvvsrsWUWKLKEED@@@==><<<<<<<<<=<<<<<==<===>==>>>>>>????@????@@@SSS@@AAAAAABBBBBBBBBBBBBCBCCCCCCDDDCDDDEEEEEEEEEEFEFFEFFFGFFZZYGGGHHHHHHIHHHHHHIIIIIJIIJIJJJJKJKKKKLLKLLLMKMMMMMMMMMMMMN___NNNONNNOOOPPOOPPPPPPPPPPQPPPQPPQPQQQQQR+++++++++,,,,,,,,,,,,-------.-.--/.././///DDD////00000000100000111111111111112222232334333444666777:::RRREEENNNZZZiiizzzppoppqTTUKKKDED@?@===<<<<<<<<<<<<=<<===??>>>>>>???????@??@??@@@SSSAA@BAABBBBBBBBBBBBCCBCCCCCCCDCDEDEEEEEEEEEEEEEEFFFFFFFGFFYZYGHHHHHHIHHHIHHHIIIIJJJIJJJJJKKKKKLKKLLLLLMMMMMMMMMMMNMMNN___ONNONNOONPOOPPPPPPPPPPPPPQPQQQRQQQQQRRR,++,++,,,,,,,,,,,,--,-,--.--.....///////0/DDD///00/0000000001101111111212112222233333344446667779::>=>UUUJJJUUUbbbrqq{{{kkkmmmRRRIIIDDC??@===<<<<<<<<<<<====>=>=>>>?>?????????@??@@@@@@TSSAAAABBBBBBBBBBBCCBCCCCDDDDDEDEDDEEEEEEEFEEFFEFFFFFFGHGHGGZZZHHHHHHHHHHIHIIIIJIIJJJJJKKKLKKKKKLLLMLLLMLMMMMMMMMMMNMNNN__`OONPOOOPOPPPPPPPPPPPPQPPQQQQQQRQQRQQRRR++++,,,,,,,,,,,-,,-,-----../-///./////////DDD0000000000101111111111111122222233334435446657779::===BBB\\\SSS^^^lll}}}tsreeeihiNNNHGGBBB???===<<<<===<<>=>>>=>???>>??????@?????@@@@@@@AAUSUBABBBBBBBBBBBBCCCCCDCCCDDDEEEDEEEEEEEEEFFEFFFFFGGGGHGGHHHZZZIHHHHHIHIIIIIIIJIJJJJKKKKLKLLKKLLLLLMMLMMMMMMMMMNMMNNNNONaa`PPOPPOPPPPPPPPPPQQPQPQPPQQQQQRRQQRQQRSS,+,,,,,,,,,--,,------..-././///////////0/0DDD000000001111111211111121222322323233444666777999===BBBJJJddd]]]klkyzzxxyjjj]]]dddJKKEEDAAA>>>>=><=<=========>>>>??????????????@@@@@AA@AAAAUUUBBBBBBBCBBBCCCCDDCDCCEDCEEEEEEEEEEEEEFEFFFFGFGGHGGGHHHHHH[ZZHHHHHHIIIIIIJJJJJKKKKKKKKKKLLKKMLMLMMMMMMMMMMMNNNNNNNNNNN``aOOPPPPPPPPPPPPPPPPPQQRQQRQQQRRRRQRRRSRS,,,,,,,,---,----.--.-...././////////0//0/0DDD100000011111111111122222232333333554556877999===BBBJJJRRRmmmjjjyyy{z{mmm```VVV_^_GGGBBC@@@>>>=========>>=>=>?>????????@????@@@A@@ABAABABABUUUBBBBBBBCBCCCCCCDDCDDDEEEEEEEEEFEEEFFFFFGFFFFHGGGHHHHHHHHH[Z[IIHIIIIIJJJJJJJKKKKKKLKLLLLLLLMMMMMMMMMNMMMNNNNNNNNONNONOaa`PPPPPPPPPPPPPQQQQQQQQRQQQRSRSRRRRSSSSSS,,,,-,------.--..-...//////////////0000000EEE100110111111121112222322323344444565777999===BBBJJJRRR]]]yyyxxx{|{mnnbbbWWWOOOZZZDCDAAA?>?>>=========>>>>>>????????????@@@@A@@AA@ABABABBBBUUUBBBCBBCCCCDCDCDEDDEEEEEEEEEFEFFFFFFGHFGGGFGHGHGHHHHHHHHHH[Z[IIIIJIJJJKKKJKKKLKKLLLLLMLKMMLMMMMMMMMMMMNMNNNNNONOOOOPOOaaaPPPPPPPPPPPPQQQQQQRRQRRSRQSSRRSSSSSSSSS,-,,,---,...-...-.//.////0//////0000000000EEE011111111112212222223233333444656777:9:===BBBJJJRRR]]]jjj{|{nnmbbbWXWOOOIIIWWWAAA???>>>==>==>==>=>>>>>?????????@@?@?@@A@@@@ABBBBBBBBBBBUUUCBBCCCDDDDDDDDDEEEEEEEEEEEEFFEFFFFGFGGGGGGHHHHHHHHHHHHIII[[[IIIJJIJJJKKKKKKKKKLLKMMLMMMMMMMMMMMMMMNNNNNOOONNOPOOPPPPPaaaPPPPPPQPPPQQQQQQQQQRRRSRSSRSSSSSSSSSSSS,-,------.....//////////////0/000000000001EEE111111111212222233222343444555777999===BBBJJJRRR]]]jjjxyx|||nnnbbbXWWOOOHIHDDDTTT???>>>===>===>=>>>>>>???????@???@??@@@AAAAABABABBBBBBBBBBVUUCCCDDDDCDDDEEDEEEEEEEFEEFFEFFFFFGGFGHGGHHHHHHHHHHHHIHIIII\\[IJJJJJKJKKKKKKLLLLMLLMMMMMMMMMMMMMNMNNNNNNOONOOOPOPPPPPPPbaaPPPPQQQQQQQQQQQRRQRSRRRRSSSSSSSSSSSSTTS----...-../..//////////////0/0000100000001FEE111111222221223333433454556777999===BBBJJJRRR]]]jjjxyx{{|mnnbbbXXWOOOIIIDDDAAARRR>>>===>==>==?>>?>?????????@?@@@@@AA@A@AAAABBBBBBBBBBCBBBBVVVCCDCDDEDDEEEEEEEEEFEFFEFFFFGGFFFFHGGHGHHHHHHHHHHIHIIIIIII\[[JJKKKKKKKLLLKLLMLMLMLMMMMMMNMMMMNNNNNNNONNOOPOPOPPPPPPPPPbbbPPPPQQQQQQRRQQRSRQSSRSSSSSSSSTSTSTSSTTS---.-./.././//////////00000000000001110111FEE111121222222333334444656777999===BBBJJJRRR]]]jjjyxx{{|nmnbbbWWXOOOHHHDDDAAA???QQQ===>===>>?>>>????????????@?@@?@@@@A@AAAAABBBBBBBBBBCCBCCCVVWECCEDDEEEEEEEEEEEEEEFFFGGGFFFFGGGGHHHHHHIHIHHIHHIHIIJIIJI]\\KKKKKKKLLLLMLLMMMMMMMMMMNMMNMMNNNONOONOOOPOPPPPPPPPPPPPPPbbbQQQQQQQQQRQRRRSSSRSSSSSSSSSSSSSTTSTTTTT.../..//.////////////000000000000101111111FFF111222232333433444666777999===BBBJJJRRR]]]jjjyxx{|{nnnbbbWWWOOOIHIDDDAAA???>>>QQQ==>>>>>=>>?>????????????@@@@@@@AAAAABABBBBBBBCBBCBBCCCDCDVVVDDEEEEEEEEEEEEEFFFFFFFFFGFFHGGHHGHHHHHHHHIHHIIHIIJJJKJJKI]]]LKKKLKKKLLMLMMLMMMMMMMMMMMMNNNNNNONONOOOOOPPPPPPPPPPPPPPPbbbQQQQQQRRRRRQSSSSSSSSSSSSSSSTTTSSTTTTTUU...//////////////0000000000101111111111111FFF22222332343444566577799:===BBBJJJRRR]]]jjjxxx{{{nnnbbbWWWPOOHIHDDDAAA???>>>===PPQ>===>=??>????????????@@@A@@@AAB@AABABBBBBBBBBBCCCDCDCCECCWWVEEEEEEEEFEEFEFFFFFFGFFFGHGGHHHHHHHHHHHIHIIIIIIIJJJJKKJKKJ]]^KLKLKKLLLMLMMMMMMMMMMMNNNNNNNNOONOPOOOOPPPPPPPPPPPPPQPPQQbcbQRRRQQRQQSSSSSSSSSSSSSSSSSSTTTTTTTUTUTU././///////////000000000001011111111112112FFF22233234444455676699:===BBBIIIRRR]]]jjjyxy{{{nnnbbbWWWOOOIIIDDDAAA???>>>===>==PQQ>>=?>>?????????@?@@@@A@@A@AABBABABBBBBBBBBCBBCCCCCCCDDEDEWWWEEEEEEEEEFEEFFFGFFHGHGHHHGHHHHHHHHHHIIHIIIIIJIIIJJJJKKKKK^^]KKKLLMMMMMMMMMMNNMMNMNNNNNNONOONNOOOPPPPPPPPPPPPPPQQQQQQQcbbRRRRRRRSRSSSSSSSSSSTTTSSTTTTTTTUTUUTUUU/////////000000000000100101111111111122212GGG342343444555666999===BBBHHHQQQ]]]iiixxx{||nnnbbbWWXOOOIIIDDDAAA???>>>=>====>>>QQQ>>??????????@??@@@@A@@@A@BABBBBBBBBBBBBCCBCBCDCCDDCDDDEDEWWWEEEEEEEFFFFFGFGGGGGGFHHHHHHHHHHHHIIHIIHIIJJJJJKJKKKKLKLKL]^^LMLLMLMMMMMMMMMMNNNNNNNNNOOOPNOOPPPPPPPPPPPPPPQPQQQRQQQRQbbbRQSRSSSSSSSSSSSSSSSTSTSTUTTUTUTUUVUTVUU///////0/000000001010111111111111112222222HGG343444544666787;<<@@@FFFPPP[[[hhhwwx{|{nnmbbbXWWOPOHIHDDDAAA???>>>====>===>?==RRQ?????????@??@@@@@@ABAAAABBBBBBBBBBBBBBCBCCCCCCDDEDDEDEEEEXWXFEFEEFFFFFFFGGFGHHHHHHHHHHHHIHHIHIIIJIJJJJJKKKKKKKKLLLLKL^^^LLLMMMMMMMMMMMMNNNNNNOONOPOOOOPPPPPPPPPPQPQPQQPQQQRQRQQQRcccRSRSSSSSSSSSSSSSTSTSTUTTUTTTTTTUUVUVVVV////0/000000000000111111111111112222322332GHG444444555767:::>>>EEEMMMXXXefeuvu|||nnnbbbXXXOOOHIIDDDAAA???>>>=====>>>>>?>??>RRR?????????@@@A@@@AABBABBBBBBBBBBBCCCCCCCCDCDDDDDCDDEEEEEEEXXWFFFFFFGFGFGGGGGHHGHHHHHHHIHHIHIIIIIIIJJKJJKKKKKKKKLLLLLLM^_^MMMMMNMMMNNNNNNNNNOOONNOOOPPPPPPPPPPPQPPQPQQQQQQRQRQRQRRRcccSSSSSSSSSSSSSSTTTTTTTUTTTTTTTVVUUVUVVVV000000000000000111111111112212232323333334HHH444444566888<<>>=======>>>?=>?>???RRR????@?@@@@@AAA@AAABABBBBBBBBBBBBBCCCDCCECEEDCEDDEEEEEEEEFXXXFFFFGGFHFFGGGGHHHHHHHHHHIIIIIIIIIIJJKKJKKKKKKLLKLLKKLLMML___MMMMMMNMNNNMNNNNOOOOOPPPPPPPPPPPPPPPPPPPQQQQQRQRRRSSSRRRSdddSSSSSSSSSSSSTSTTTTTTUTUUVUUVVUUVVVVVVVV//0000000010110111211111221222322233343444HHH444445666999>>>EEENNNZZZjjjz{{|{|nnnbbbXWWOOOIHHDDDAAA???>>>======>>=?>>?>???????RRR@@?@@@@@@@A@AAAABABBBBBBBBBBBCCCCCDCCDCDDCEEDEEEEEEEEEEEFYYYFFGFFFGGGHHHHHHHHHHHHIHIIIIIIJIJIJJJKKKKKKKKLLLKLMMMLMMMM___MNMMMMNNNNNNNNOONOPPPPPPPPPPPPPPPPQQQQQQQQQQQRQQRRRSSSSSSdddSSSSSSTSSSTTTTTUUTUUUUTUVUUVVVVVVVVVVVVEDDEEEEEEEEEEEEFEFFEFFFFFFFGFFGGHHHHHHHHHHSSSIHHIIIJJJNNNSSSZZZdddppp}||rqrhhhaaa[[[WWWTTTSRRQQQQQQPPPQQQQQPRRQRRRRRRRRS\\\SSSSSSSSTTTSUTUUUUUUUUUUUVVVVVWVVWVWWWWWWWWWXXXXWXWXXXYXYcbaYZYZYZZZZZZZZZZZ[ZZ[[Z[[\\[\\\\\\\\]]]]^]]]^^]^_^________hhh______`_`a```a`aaaaaaababbbabbbbbbbbbbcccccbccccdcdddddddmlldddeeeedeeeefeeggfffggffggggggggggggggg000011111111111111222222322223433443444444IHI554555777;;;BBBLLKXWWgggxxx{|{nnnbbbXWXOOOIIIDDDAAA?@?>>>===>=>=>=>>>>?>??????????@@SSSA@@A@AABABABBBBBBBBBBCBBCCCDCCDCDEDEEDEEEEEEEEEEFFEFFFGFFZYYGHGHHHHHHHHHHHHHIIIIIJJJKJIJKKKJKKLKLKKKLLLLMMMLMMMMMMMMN___NNNNNNNNOOONOPOPOPPPPPPPPPPPPPQPQQQQRRQRQRRRRSSRSSSSSSSSSdddTSTTTTTTTTTTUVUUUUUVVVVVVVVVVVVVWVVVWVV111111111111111112212232333343344444444455III555555777<<>>==>>=====>>>>>>???????????@@@@STTAA@ABAAAABBBBBBBBBBBCCCCDCCDDDDDEEEEEEEEEEEEEFEEFFFFFGFFGZZYGHHHHHHHHHHHHIIIIIIIJIJJKKJJJJKKKKKLMMKLKLLMMMMMMMMMMMMNM___NNNOOOPOOPOPPPPPPPPPPPPPQQPQQQQQRRQRRQQRRRSSSSSSSSSSSSSSSdeeTTTTUUTUTTTUUUUVVUVVVVVVVVVVVVVWVVVVVWV111111111111112222223332333444444444545544III555555888===EDEPPP]^]mmm~~~{|{|||bbbWXWOOOIIIDDDAAA???>>>======>=>>>=?>???????@??@@?@@@@@@TTSBABBBBBBBBBBBBBBBCCCCCCCCDCDDDEEEEEEEEEEEFFFEFFFFFGGGGGHGZZZHHHHHHHHHIHHIIIJJIIIJKJJKKKKKKKLKLLLLLLMMLMMMMMMMMMMMMNNN```NNOOONPPOPPPPPPPPPPPPPQQQPQQQQRQQRQRSRRSSSSSSSSSSSSSSSTTSeeeTTTTTTTUUUTUVVUVVVVVVVVVVWVVVVWVWVWWWWW111111121211222223223333444444444444555555III555555888>=>EGFRQQ^^^llm}}}{{{nnnqqrWWWOOOHIIDDDAAA???>>>======>>=?>>>>>??????@??@@?@@@@@@AA@TTTBBBBBBBBBBBBBBCCCCCCCDDDCDDEEEEEEEFEEEEEFFFFFGFGGFGGGFHHHZZZHHHHHHHIIIIIIJIJJIJJJKKKKKKKKKKLLMLLMMMMMMMMMMMMNMNNNNNNN``aPOPPPOPPOPPPPPPPPPPPPQQQQQQQQRRRSSRRRSRSSSSSSSSSSTSTSSSSTeeeTTTUUUUUVUUVVVVVVVVVVVWVVVVWVVWWVWWWXXX111112221222233332343344444444444555555555III555655889>=?FGGQQQ]]]kkjzzy{{{mnnbbbhhhOOPIIIDDDAAA???>>>==>>====>=>>>>>?????????@@@@@@@@@AA@BABUUUBBBBBBBCCCBCCCCCCCCCDEEEEDEEEEEEEEEEFFEFFFFFFFGFGGFHHHHHHZ[ZHIHIIHIIIIIIJIIJJKKJKKKKLLKLLLLLLMMMMMMMMMMMMNNMNNNNNNNOO`a_POOPOPPPPPPPPPPPPPPPQQRQQQQSSRRSRSSRSSSSSSSSSTSSSTSTTSTTTeefUTTTUVVUVVVVVVVVVVVVWVVVVWVWWWWWWWXWXWW111212222233332333444444444444555555555555III555667988>>>FFFPPP[[[gfgtttxyxnmmbbbXWW`aaIHIDDDAAA???>>>>======>>>>>?>>???????????@@@@@@@AABBAABBBUUUBBBBBCCCCCCDCCCDDCDEEDDEEEEFEEEFEFFFFFFFFFGGGGGGHHHHHHHHH[[ZIHHIIHIJJJJJJJJKJKLKKLLLKMKLLMMMLMMMMMMMMMNNMNNNNNNNNNNOOa``PPPPPPPPPPPPPPPQQQQQQQQSRSRRRRRSSSSSSSSSSSTSSSSSTTTTUTTTTeefVUUVVVVVVVVVVVVVVVVVVWWVVWWWWXWWWWWXXXY222222232333433443444444444555555555555555III566676:::>>>FEENMNWWWaaallmz{ztttkkkbbbWWWOOO[[[DDDAAA???>>>======>>=>?>?>>????????????@@@@@@@AA@AABABBBBUUUBCCBBBCCCCCCDCDEEEEEEEEEEEEEEEEFFFFFGFFGGGGGGHHHHHHHHHIHH[ZZIIIIIIIJIKJJJKJKKKKKLKKLLMKMMMMMMMMMMMMMMNNNNNNNONOPOOOOPaaaPPPPPPQPPPQPQQQQQQQRRRRRRRRSSRSSSSSSSSSSSSTTTTTTTTTTTUUTUfffUUVVVVVVVVVVVVVVVVWWVWWVWWWWXXWXWWWYWXX222322232343444444444444555555555555555555IJJ565776999===CCCKJKRRR[[\dddqpqlllfff`__WWWOOOIIIWWWAAA???>>>===>===>?>>>>?>??????????@?@?@@@@BA@A@ABBBBBBBBBUUUCBCCCCDCCDCDDDDEEEEEEEEEEFEFFFGFFGFGGGHGHGHHHHHHHHHHHHIHH[[[JIJJJJJJJKIKKLKKLLKKKLKMMMMMMMMMMMMMMMMNMNNNONONNNOPPOPPPbaaPPPPPPQPPQQQQQQRQQRRQRRRSRRSSSSSSSSSSTSSTSSTTTTTUTUUUTTUUgffVVVVVVVWVVVVWWVWWVWWWWWWXXWWYWXXWXXYXYY223333334434444444444554555555555555555556IKJ766777:9:===BBBGGGNNNTUT[[\fgfdcc`_`[[[UUUNOOIIHDDDTTT???>>>====>=>>=>>>?????????????@@?@@@A@AAABAABABBBBBBBBCBUVVCDCDCDDDDEEEEEEEEEEEEEEEFFFFFFFGFGFGHGGHHHHHHHHHHHHIHHIII\[[IIJJJJKKKKKKLKLLMLKMLMLMMMMMMMMMMMMMMNNNOONNOOOOOPPPPPPPPaabPPPPQPQQQQQQQQQQRQRRRRRSSSSSSSSSSSSSSSTTTTTTTTTTUUTTVVUUUgggVVVVVVVVVVVVWVWWWWWWWXXXWXWWXWXXXXYYYYY233343444444444444545555555555555555565666JJI777777999<;<@@@DEEIJINNNSSSZZZZZZXYYUUURQQMMMIIIDDDAAARRR>>>====>=>==>>>>?>??????????@?@?@A@AA@@AABBABBBBBBBBBBBBCVVVCDDCDEEDEEDEEEEEEEEEEFEFFFFGFFGFGGHHGHHHHHHHHHHHIHIIIIJIJ]\[JKJKKKKKKKLKLLLLMKMMMMMMMMMMMMNMMNNNONNONOOOONOOOOPPPPPPPbabPQPPPPQQQRQQRRRSSQRSSSSSSSSSSSSSSTSTTTTUTTTUUUUTUTTVVVVVVgggVVVVVVVVVVWWWWWWWWXWWWWXXXXYXXXYYYYYYYY333444444444555555555555555555555555776776JKK777777899;;;>>>AAAEEEHIHLMLPPPQQQQPQOOOMMMJJJGGGDDDAAA???QRQ======>>=?>>?>>?????????@@??@@@A@BAABBABBBBBBBBBBBBBCCCCCVVWCCDEEEEDEEEEEEEEEFFEFFFFGGGFFGHHGHHHHHHHHHHHHHIHIIIIJIJJJ\][KKJKKKKKLLKLMLLMMMMMMMMMMMMMMNNNNOONNNOONPOOPPPPPPPPPPPPPbbbQQPQQQRQRRRRSRRSSRSSSSSSSSSSSSSTSTTTTTTUTUUTTUUUVUUUVVVVVgggVVVVVVWWWVWWWWWXWXXXWWXYXXYYXXYYYYYYYYY434444444444554555555555555555555666677776KKK787777999:;:===>?>BBADCDFGFIHIJIJJJIHHHGGGEEECCCAAA?@?>>>QQQ====>===>>>?>?????????@?@@@@A@@A@ABABBBBBBBBBBCBBCBCCCDCCVWVEEDEEEEEEEFEEEFFEFFFFFGGGGGGGHGHHHHHHHHHHHIHIIIIJIJJJIJJK]]]LLKLLLMLLMLKMLMMMMMMMMMMMMMNNNNONNNNOOPOOOPPPPPPPPPPQPQPQbbbQQQQRRRRSQRRSSSSRSSSSSSSSSSSSSTTSTTTUUTUUUVUUVUVVVVVVVVVVgggVWVWWWVWWWWWXWWWWWXYWXXXXYXYYYYYYYYYYYY444444544544555555555555555655656776767777KKK877788999:::;;;===>>?@A@CBBCDDDDDDDECCCBABAAA@@@???>>>===QPP>=>=>>??>?????????@??@@@@@@A@@AAABABBBBBBBBBBBBCCCCCCCDCDWWWDEEEEEEEEEEEFFFFFFFFGGGFGHFHGHHHHHHHIHHHIHIIIIIJIJJJKJKKJ]]]LLLLLLLLLMMMMMMMMMMMNMMNNNNNNNONOOOOOOPPPPPPPPPPPPPPPQPQQbbbRRRRRRRRRSSRSSSSSSSSSSSSSTSTTTUTTTUTUTTUUTUVVVVUVVVVVVVVVgggWVWWWWWWWXWWXXXWXXXXXYXXYYYYYYYYYYYYYYY444444555555555555555555555776667767777777LLK887888998:::;;:;;;==<>>>???@@@A@@@@A?@@????>>>>>>>>>=====PQQ>>>>>>??????@????@@@@@@@AAABA@ABBBBBBBBBBCCBCCCCCDDCCCDEDWWWEEEEFEFEEEFEFFFFGFHGGHGGHGGHHHHHHHHIHIIIIIIJIJIIJJJKKJKKK]]]LLLLLLLMMMMMMMMMMMNMNNNNNNNOOOPNPPONPPPPPPPPPQPPPQPQPQRQQcccRRRRSRRRSSSSSSSTSSSSSSSTTTTTTTTUUTTTVUUVVUVUVVVVVVVVVVVWVghgWWWWWWYWWXWWXXXXXXXYYYYYYYYYYYYYYYYZYZZ445455555555555555555555566665677777777777LLL888888888:::::::;;=<<=<<======>=>>>>=>>>>>>=>>>>====>=>==QQR?>>?????????@?@@@@AA@AA@AABBBBBBBBBBBBBCBBCCCDCCCDEDEDEDEWWWEEEEEFFFFFFFFFFGGGGHHHGHHHHHHHHHHIIHIIIIIIIJIJJJJKJKKKKKL]^_LLLMMMMMMMMMNMMNMMNNNNNNNPNONOOOOPPPPPPPPPPQQQQQQPQQQQQQQcbbRSRSSSSSSSSSSSSSSSSSSTTTTTTTTUUTUUTUVUVVVVVVVWVVVVVVVVVWWghhWWWWWXWXWYXWXXXXYXYYYYYYYYYYYYYYYYYZZYY555555555555555555565565777767777787777878LLL8888889989:9:99;::;<<<<<=<=============<===<=======>>>>>>RRR???????????@@@@@@@@@ABBABBABBBBBBBBCCCCCCCCDDDDCEDDEEDEEEXXXEEEEEEFFFGFFGGGGGGHGHHHHHHHHHHHHHIIIIIIJJIIJKKJJKKKKKKLLL_^^MLMMMMMMMMMMMMNNNNNNNNNNOOOPOOPOPPPPPPPPPPQPQPQQQQQQQRRQRdbcSSSSSSSSSSSSSTSSTSSTTTTTTTTTUUTTUVUVUVVVVVVVVVVVVVVVWVWWWhhhWWWWWWXXWXXXXYXYXYYYYYYYYYYYYYZYZZZYZZZ555555555555555555566666777777787777887888LLL8888999999:9::;:::;;;;;;;;;<<;<<<<<<<<<<<<<=====>>=>?=?>?RQR???????@@@@@@@@@AAA@AAABBCBBBBBBCBBBCCCDCDDEDEEDEEDEEEEEEXXXEFFFFFFFFGGGGGFHHHHHHHHHIHHHHIIIIIIIJJJJKJJJKKKKKLLLLLLLL^__MMMMMMMMMNMMNNNNNOONONPOPPPPPPPPPPPPPPPPQPQQQRQRRQRQRRSSSdddSSSSSSSSTSSSSSSTTTTTTUUTTUTVUUUVVVVVVVVVVVVVVVVVVVVWWWXWXhhhWXXXYWXXYXYXYYYYYYYYYYYYYYZYZYYZZZZZZ[Z555555555555665677666777777777777888888889LLL889999:99:9:;:;;;;;;;;;;;<;<<;<<<<<<<<=<<===>>==>>?>>????RRR?????@@@@@@A@@ABABBBABBBBBBBBBCBBBCCDDDDDDDDDEEDEEEEEEEEFXXXFFFGFFGGGGGGHHGHHHHHHHHHIHHIIIIJIKIJJKJJKKKKKKLLKLKLLLMML___MMMMMMNNNNNNNONNNNOOOPOPPPOPPPPPPPPPPPQQQQQQQRRQQRRRRRSRSdddSSSSSSSSSSTSSTTTTTUUUTUUVUUUVTVVVVVVVVVVVVVVVVVWVWWWWXXXWhhiYWYXXXXYXYYYYYYYYYYYYYYYYZYYZYZZZZZZ[ZZ555555555566666667776777777778888888888889MLM999999;::;;:;;;;;;<;;<;;<<;<<<<<<<<<==<>==>>>==>>>>??>???RRR@??@@@A@A@@@AABBBBBBBBBBBBBCBCCCCCCCDCDDEEDEEEEEEEEEFEEEEXYYFGFGGFHGGHHHHHHHHHHHHHIIIIIIJIJJIKKKJKKKKKLLKLLKLLKMLMMMM___MMMMMMNNNNNNOONOOOOOOPOPPPPPPPPPPPPQQPPQQQQQQRRQRRRRRSSSSdddSSSSSSTSSTTTTTTTUTUUUUTUVVVUVVVVVVVVVWVVVVVVVVWWWWWWWWXXXhhhYXYYXYYYYYYYYYYYYYYYYYYZZZZYZZZZZZZZ\Z[IIIIIIIJJJJJJJKKJKKKKKKKKKLLLLLLLLLLLLLLLMWWWMMMNNNNNNNNNONOOOOOOOOOOOOOPPPPPPPPPPPPPPPQRQRRQRRRRRRRRR\\\SSSTSTSTSTUTUUUUUUUUUUUUVVUVVVVVVWVWWWWWWWWWWXXWXXXXXXYYXbbcZZZZYYZZZZZZZ[ZZZ[ZZZ[[[[\[\\\\]\\]]]]]]]^^^_^^_^________hhh_______``a`a`aaaa`aaabaaaaaabbbbbbbbbcbccbccccccdddddddddmlmdddeddeeeeefeefeeefefffggggggghgggggghghgggghhhhhhhhhhihiqqqiiiiiiijjjijjijjijjjjjjjjjkjjjkjkkkjmlk555555655777677777777777887888888888999999NMM:9::::;;;;;;;;;;;<<<<<<<<<<<<<===>>=?=>>??>????????????@?SSS@@AAAAAAABBABBBBBBBBBCCBCCCDDCCDDEEEEEEEEEEEFFEEEEEFFFGFFZYZHGGGHHHHHHHHHHHHHIIIIIJIJJJJJKKKJKKLKKKMLMLMMMMMMMMMMMMMM___MNNNNNNONOOOPPPPPPPPPPPPPPPPPPQQQQQQRRQRSRRRRSSSSSSSSSSSSdddTSTSTTTTTTTUUUUVUVUUVVVVVVVVVVVVVVVVWVWWWWWWWWXWWXXWYWWXXiiiYYYYYYYYYYYYYYYZYZYZYZZZZZZ[ZZZZ[\ZZZ[[5566667667767777877778878888888889999999:9MNM;;;;;;;;;;;;<<;<<<<<<<<<<<<<=====?>>>>>=?>??????@??@??A@@TSS@A@BBBBBBBBBBBBCBBCBCCCCCDCDDCCEEEEEEEEEEFEEEEFFFFGFFFGFGZZZGHHHHHHHHHHHIHHJIIIIIJJIJJJKKKKKKKKLLLLLLLMMLMMMMMMMMMNMM_`_NNNNNNOOOOOOPPPPPPPPPPPPPPQQQQQQQQQRQQRSRRSSSSSSSSSSSSSSTdddTTTTTTUTTVUTUUUUUVVVUVVVVVVVVVVVWWWVVWWWWWWXWWWWWYXXXXYXXiiiYYYYYYYYYYZYZYZYZYYZZZZZ[[Z[Z[Z\[\[[]]\656766777777777777888888888988988999:9:::9NNN;;;;;;;;;;;;<<<<<<<<<=<<====>=>=>?>>?>???????@??@?@@@@@@@STUBA@BBBBBBBBBCBBCBCCCCDCDDDDDDDEEDEEEEEEFEEFFFFFFFGFFHFGGHZZZHHHHHHHHHIIHIIIIIIIJJJJIKKKKLKLLKLLKLMMLLMMMMMNMMMMMMMMNN`__ONONOOPOOPPPPPPPPPQPPPPPQQQQRQQRQQQRRRRRRSSSSSSSSSSSSSSSSeeeTTTUUTUUUUUUUUUUVVVVVVVVVVVWVWWVVWWWWWWWWXXWXXXXXWXXYXYYYiiiYYYYYYYYYYYYYZZZZZ[ZZZ[[ZZZ\[ZZ[\][[]\]667777777877778887888888888999999999:::;;:NNN;;;;;;;<;<<<<<<<<<<=<<=====>>=>>>?>>????????????@@@@@@@AATTTAAABBBBBBBBBBCCCCCDCCDDCDDDEEEEEEEEEFEEFFEFFFFGFGGGGGGHHGZZ[HHHHHHIHHIIIIJJIIJIJJKKJKKLKKKKKMLMLMMMMMMMMMMMNMNNMNNNNN```NOOOPOPPPPPPPPPPPPQPPPQQQQQQQQRSRSRSSRSSSSSSSSSSSTTTTSTTTeeeTTTUTUUUTVVVVVVVVVVVVVVVVWVWVVWWWWWWWWWWWXXXXXXYXYYYYYYYYiijYYYYYYYYYYZZYZZZZZ]ZZZZZ][\]\\\\\]\]]]\7774777777777888888888888899999:99::;;;:;;;OON;;;;;;<<<<<<<<<<=<======>=>>>?>?>????????@?@@@@@@@@AAABBAUUTBBBBBBBBBBBBCCCCCCCCDECEDDDEEEEEEEEEFFFGFFGFGGGGGGGHHHHHHZZZHHHHHIIIIJIIKIIIJIKJKKKKKLLLLKMLLMLMMMMMMMMMNMMNNNNNNNONO```PPPPPPPPPPPPPPPPPPPQQQQQQQQQRRRRSSSRSSSSSSSSSSSSSSSTTTTTTfefUUUUUUUVVVVVVVVVVVVVVVVVVWWWVWWWWWWWWXWXXXYXXYXXYYXYYYYYYjijYYYYYYZZZYZZZZZZZZ[ZZ[[Z]][Z\]]\]]]]]]]4777777888888888898888999:999;::;;;;;;;;OON<;;<<<<<<<<<<<<=======>>>>????????????@?@@@@@@@@A@ABAABBAUUUBBBBBBCBBCCCCCCDECDEEEEEEEEEEEEEEFEFFFFGFGGFGGFGHHHHHHHHHZZZHHIIIIIJJJIJJKJJKJKKKKKKLLLMLLLMMMMMMMMMMMMMNNNNNNNONONONaaaPPOPPPPPPPPPPPQQQQQQQQQRRRSRRRSSSSSSSSSSSSSSTSTSTTTTTTTUTfeeTUUUVUVVUVVVVVVVVVWVVWVWWWWWWWWWWXXXWXWXXYYYYYYYYYYYYYYYYjjjYYYZZYZZZZZZ\\[ZZ[Z[[Z\Z]\\]]]]]]]]]787U8788888888888889999999:::::;;;;;;;;;OOO<<<<<<<<<<<<<=<===>=>>?>?>????????????@@@@@@@AA@AABAAABBBUUUBBBBCBCCCCCCCDCDDEEEEEEEEEEEEEEEFFFFGFFGGFHGGHHHHHHHHHHHH[[[IJIIJIJIJKKJKKKKKKKLLLKLLLMLMMMMMMMMMMMNNMNNNNNNNNOOONPPOaaaPPPPPPPPQQPQQQQQQQQQQRRQRRRSRRSSSSSSSSSSTSSTTTTTTTTTUTTUTfgfVVVVVUVVVVVWVVVWVVWWWVWWWWWWWWWWXWXXXYWYXYYYYYYYYYYYYYYYZjjjZYYZZZZZZ[[Z[\[[[\Z\[]\\]]\]]]]]]]]]V888888888898899999:::::::::;;;;;;;;;;;;OOO<<<<<<<<<======>==>>>>??????????????@@@A@AAAA@BABBBBBBBBCUUUBBBDCCCDCCDDEDEEDEEEEEEEEEEEEFFFFFFFGGFGHGHHHHHHHHHIHHIII[[[IIJJJIJJJJKJKKKLKKKLLKLLMMMMMMMMMMMMMMNNNNNNOONNNOOOOPPPPaaaPPPPPPPQQQQPQQQQRRQRRQRRRSRSSSSSSSSSSSSSSSTTTUTUUUTUTTUTUfgfVVVVVVVVVVVWWVVVWVWWVWWWWWXWWXWXXXXXYXYYYYYYYYYYYZYYZYYZYjjjZZZZZZZZZZ[Z\ZZ[\\\[]]]]]]]]]]]]]]^]989898898999::::;:;;;;;;;;;;;;;;;<<=>=>>>>>?????????@????@@@A@@@AAABABBABBBBBCBBBUVUCCCCCDDDDEDEDDEEEEEEEEEFEFFFFFFFGGFGFGGHHGHHHIHHHHHHHHIII\[\JJJKKJKKKKKKKKLLMLLLMMLMMMMMMMMMMNMNNNNNNNNOOPONOPOPPPPPPbaaPPPPPPQQQQRQRRQQQSRRRSSRSSSSSSSSTTSSTSSSTSTUTUTTTTUUUUUUUgggVVVVVVVVVWVVWVWVWWXWWWWXXXWWXYYXWYXXYYYYYYYYYYYYYYYZYYZZZjkjZZ[[ZZ[ZZZ[[\Z\\]]]\]]]]]]]]]]]]^989:9999999::::;;;;;;;<;;;;;<<<<<>>>>>?>????????@??@?@@@A@AA@@BAAAABBBBBBBBBCBBCVVVCDDCCDDDDDEEEEEEEEEEEFEFFFFFGFFGGGHHHGHHHHHHHHHHIHIIIIIII[[\JJJKKKKKKKLKKLLLMMMMMMMMMMMMNMMMMNNNONNPONOPOPOOPOPPPPQQPbbbPPQPQQQQQRQRSRQRRRRSSSSSSSSSSTTTSSTSTTTTTTTTTUUTTVTUVUVVVgggVVVVVVVVVWWVWVWWWWWXWXWXWYWXYXXXYYYYYYYYYYYYYYYYYYZZYZZZYkkjZ\[Z\Z[Z\[Z\]]\\]]]]]]]]]]]]]]:9992:99:;;;;;;;;;;;;;<;<<<<<<=>>>=>=>>???????????@??@?@AA@@@@BBABBBBBBBBBCBBBCCCCCWVVCCDEDDEEEEEEEEEEEFFFEFFFGGFHHFGHGHHGHHHHHHHHHIHIIIIJIIIKJ[\]JKJKKKKKKMMLLMLLMMMMMMMMNMNNMNMNNNNNNNOOOOOOOOOPPPPPPPPPPbbbQQPQQQQQRRQQRSRSSSSSSSSSSSSSSSTSSTTTTTTTTUTUVUUUVUVVUVVVVgggVVVVVVWVWWWWWWXXXWXWXYXXYXXXXXYYYYYYYYYYYYYYYZZYZZZZYZZZZjljZZ[\Z[\Z\[\]\]\]]]]]]]]]]]]2;;;;;;;;;;;;;<;<<;<<<<<<<<>?=?>??????????@?@@@@@@@@@AAAABBBBBBBBBBBBCCCCCCDDCWVVCDEEEEEEEEEEEEEEEFFFFFFFGFHGHGHHHHHHHHHHHHHIIIIIIJJKJIJJJ]\]KKKKLKLLLLLLMMMMMMMMMMMMMMMNNNNNNNNOOOOOPPPPOPPPPPPPQQQPPbbbQQQRQQRQQRRRRSSSSSSSSSSSSSTSSSSTTTTTTTTUUTUTUUUVVVUVVVVVVgggVVVWVWWWWWWWWXWXWXXXXYXXYXXYYYYYYYYYYYYYYYYZYZZZZZZZZZ[[ZkkjZZ\\\[[\\][[]]]]]]]]]^]^;;=>?>>??????????????@@@@@@@AABBABAABBBBBBBCBBBBCCCDCDCCDVWWEEEEEEEEEEEEEFEFFFFGGGGFHHGGHHHHHHHHHIHHHIIIIIJIJIIKJJKJJ]]]KKLLLLLMMMMMMMMMMMMMMNNMMNNNNNNONONOOPOPPPPPPPPPPPPPQPPPPbbbQQQQQRRRRRSRSSSSSSSSSSSSSTSTTTTTTUTTUUTVUTVUTVVVVVVVVVVVVghgVVWVVWWWWWXXXXWWXXXXYXXXYYYYYYYYYYYYYYYYYYZYYZZZZZZZ[Z[ZZllj[][[\\\]]]]]]]]]]]W<<<6<<<=<<==<===PQQ>?=?>=?????????@?@@@@@A@A@AABBBBABBBBBBBBBBBCCCCDCCCDCEDEWWWEEEEEEEFEFFEFFFFGFFGFGFGHHHHHHHHHHHHIIHIIIIIIJJJJJKJJKKKK]^^LKMLLLMLMMMMMMMMMNNMNNMMNNOONNNOOPOOPPPPPPPPPPPPQPPQQQQQQccbQRRRRSSSRSSSSSSSSSTSSSTSTTTTTUTTTUTUUUUUUUVVVVVVVVVVVVVVVgggWVVWWWWWWXXWWWWXXYYXYYYYYYYYYYYYYYYYYYYZYZYZZZ[Z[[Z\[ZZ\\kkk]\\]]]]]]]]]6(@  ++,!!!!!!!!!!!""""""""""######...$$$$$$$$$%%%%%%%%%&&&&&&'''222''''('(((((())))))**)*****+555+++,,,,,,--,.--...///0//000;:;111111221333333444444555555???666777788 Q ,,,!!!"!!""!"""""""""#########///$$$$$$%%%%%%%%%&&&&&&&&&'''222(((((((()))))))*********+++666,,,,,,-,,-.-...//////000000;;;111222323333444444555555555@@@777777888888Q Q !!!,,,!!!!"!"""""""""#########$$$///$$$%%%%%%%%%&&&&&&&&&''''''222(((((())))))*******+*++++++666,,,-----....//////000000111<;;222223333444444555555555666AAA77788888899999:Q  ! !!!!!!,,,!"!"""""""""#########$$$$$$///%$%%%%%%%&&&&&&&&&'''''''((332((())))))*********++++++,,,777,---..././/////000000011111<<<323333444444555555555666777AAA8888889999:::;;;;; ! !!!!!!!!!-,,"""""""""#########$#$$$$$$$000%%%%%%&&&&&&'''''''''('((((333))))))********++++,++,,,,,,777---..///////000000111111222===333444544555555555666777777BBB888999:::;;:;;;;;< !!!!!!!!!!!""---""""""#########$$$$$$$$$%%%000%%%&&&&&&&&&''''''(((((((((334)))******+**++++++,,,,,,-,-888...//////000000111111222333=>>444444555555555666777777888BBB899:::;:;;;;<<<<<<+++,++,,,,,,,,,,-,---555---.........//////////00000888110111111112222222333333343<<<444555555555666666777777888AAA9999::::::::;;;;;;<<<===>=>FFF>>>?????????@@@AAAAAABBBBBBJJJCCDDDDEEEEEEFFFFFF !!!!!!!!!!!"""""""---#########$$$$$$$$$%%%%%%%%%010&&&&'&''''''(('(((((())))))444****+*++++++,,,,,,----.-...9:9///000000111111222323443444?>>555555555666777777888888999CDD:::;;;<;<<<<======!!!!!!!!!!!!"""""""""...######$$$$$$$$$%%%%%%%%%&&&111'&&''''''(((((((()))))))*)*555+++,,,---....../////0000111<<<222222333333444455655666666@@@7777778888888888888889999::DDD;;;<<<<<<=<<==>>>>!!!!!!!!""""""""""###...####$$$$$$$$%%%%%%%%%&&&&&&111''''''((((((((())))))***+*+777///333777:9:;;;<<<===>>>>>>HHH???@@@@@@AAABAABBBCCCCCCCCCMMMDDDDDDBBB@@@===;;;:::::::;:EEE<;<<<<<<<===>>>???!!!!!!"""""""""######...$$$$$$$$$%%%%%%%%%&&&&&&''&122'''(('((()(())))))******,,,;;;777AAAJJJQQQUUVWXXXXXYYYYYYaaaYYYZZZZZZ[\[\\\\\\]]]]]]]]]fee]]][[[WWWPPPGGH@A@===;;;;;;EEE<<<<<====>>>???@??"!""""""""""#########///$$$$$$%%%%%%%%%&&&&&&&'''''222((((((((())))))*********...@@@CCCUUUgggttt||{~~~uuugggVVVIII@@@<<<<;>>>??????@@@"""""""""#########$$$///$$$%%%%%%%%%&&&&&&&&'''''''222(((((())))))*********+++000FFFPPPgggRRRDDD===<<>>>??????@@@AAA""""""#########$$$$$$///%%%%%%%%%&&&&&&&&''''''''((333((())))))*********+++,++111JJJXXXqrqWWWFFF>>><==GGG>>>??????@@@AAABBB"""#########$$$$$$$$$000%%%%%%&&&&&&&&&''''''((((((333))))))*******+*++++++,,,111JJJYYYrrrXXXFFF>>>===HHH??????@@AAAABBBBBB#########$$$$$$$$$%%%000%%%&&&&&&&&&''''''(((((((((443)))*)*******++++++,,,,,,111HGHRRRiiiSSSEEE???>>>HHH???@@@AAABBBBBBCCC....../////////000000888000111111111222222333333434<<<444555555555666666777777:;:JJJOOO```qqq}}}rrrbaaTUULLLIHHHIHPPPIIJJJJKKKLLLLLLMMM###$$$$$$$$$%%%%%%%%&000&&&&&&'''''''(((((((())))))444*****+++++++,,,,,,-----.000???;;;DDDMMNTTTXXXZZZ[[[\\\\]]eee]]]]]]]]]^^^^^^______``````iiiaaa___ZZ[TTTKKKEEEAAA??????JIJAABBBBBBBCCCDCCEED$$$$$$$$$%%%%%%%%%&&&111&&&''''''('(((((()))))))**)555***++++++,,,,,,--,-.-...///<<<444888<<<>>>@@@AAABBBCCCCCCMMMCCCDDDEEEEEEFFFFFFGGGGGGHHHRRRIIIIIIGHGEEFCCCAAA@@@???@@@JJKBBBBBBCCCDDDEDDEEE$$$$$$%%%%%%%%%&&&&&&111'''((()))***++++++++*******555++++++,,,,,,---..-/.///////;::111222333434554555666666777@@@777888999999::::;:;;;;<<<<=GGG>>>>>>>>>????????????@@@AAAKKKBBBCCCDDDDDDEEEEEF$$$%%%%%%%%%&&&&&&&'&222('(***-,,///111000///---+++565+++,,,,,,-,-..-...//////000;;:111111222322444444444555555???666777777888888999:::;:;;;;EEE<<<=<<==>>>>??????@@@AAABBBLLLCCCCDCEEDEEEEEEFFF%%%%%%%%%&&&&&&''&'''222(((---222999>>>===888333...767,,,,,,-,-.-....//////000000;;;111122323433444444555555555@@@777777888888999:::;;:;;;<<>>??????@@@AAABBBBBBLMLDDDDDEEEEEFEFFFGGG%%%%%%&&&&&&&'&''''''222))*000;;;GGGRRRKKK@@?555999---,,--../..//////000000111<;;222333333444444555555555666AAA777888888999::::::;;;;<<<<=>>>>??????@@@AAAABBBBBBCCMMMDDEEEEFFEFFFGGGHHH%%%&&&&&&''&''''''(((333***444DDDXXXeeeUUUBBB??@000......//////000000111111<<<223433444444555555555666777AAA888888999:::;;;;;;;<<<<<<<=GGG>>>??????@@@AAABBABBBCCCCDDNNNEEEEEEFFFGGGHHHHHH&&&&&&&'&''''''('((((333+++666KKKfffqqqWWWKLK777222000///000000111111222===433444544555555555666777777BBB888999:::::;;;;;<;<<<==<==>HHH??????@@@AAABBBBBBCCCCDDEDDNNNFFFFFFGGGHHGHHHIII&&&&&&''''''(((((())(443+++777MMMlllsss`_`DDD888223111000111111222322>>>444544555555556666777777888BBB998:::;:;;;;;<<<<<======>>>IHH???@@@AAABBBBBBCBBDCDDEEEEEOOOFFFGGGHHHHHHIIIJJI111212222222333333444<<<666???SSSqqqaaaNNNCBB>==<<<;;;<<<===>>>FFF>>>????????@@@@AAAAAABBBBBBJJJDDDDDDEEEEEEFFFFFFGGGHHHHHHPPPIIIKKKLKKLLLLLLMMMNNNNNOOOOVWVPPPQQQQQQRRRRRSSSS'''''''('(((((())))))444+++222CCC^^^uuuZZZFFF:::444223332333444>?>555555555665777777888888999DDD;;;;;;<<<<<<<<<===?>>?????@IIIAAABBBBBBCCCDCDDEDEEEFEEFFFPPPHHHHHHIIIJIJKJJKKK'''((((((((())))))**)555+++0//:::OOOmmmvvuZZZGGG;;;665444444444???555555666777777888888999:::DDD;;;;;<<<<=<==>=>>>??????@@@JJKBBBBBBCCBDDDDDEEEEEEFFFFGGGQQQHHHIIIIIJJJJKKLLLL''((((((()))))))*****555+++...444@A@VVVsssvvv[[[HHH===777555555???555666777777888888999::::;;EEE<<<<<<==<===>>>??????@@@AAAKKKBBBCCCCCDEDDEEEFEFFFFGGGHHHQQQIIIIIIJJKKKKLLLMMM(((((())))))*********555+++--,///666CCCYYYuuuwww]]]III===888555???666777777888888999:::;:;;;;EEE<<<<<====>>>??????@@@AAABBBKLLCCCDDDDDDEEEEEEFFFGGGHHHHHHRRRIJJJJJKKKLLLMMMMMM((())))))*******+*+++666,,,,,,---001888DDDYYYuuuxxx]]]JJJ>>>898AAA7777778888889999:9;;;;;;<;>=>>>???@??@@@AAABBBBBBLLLDDDEDDEEEEEEFFFGGGHHHHHHIIIRSSJJKKLKLLLMMMMMMMNM))))))*********++++++666,,,--,---///222998EEEZZZvvvxxx]]^JJJ???DDD888888888999:::::;;;;<<<<<>>>??????@@@AAABBBBBBCBCMMMDEEEEEFFEFFFGGGHHHHHHIIIJIJTTTKKKMLLMMMMMMNMMNNN)))*********++++++,,,777,,-..-..////000333:99FFF[[[~~~xyy___KKKIJI;;;999999:9:;:;;;;<;<<<<=<=GGG>>>??????@@@AAAABBBBBCCCDDDNNNEEEEEEFFFGGGHHHHHHIIIIIJJKJTTTLLLMMLMMMNNNNONOOO*********++++++,,,,,,877..-././/////000111444:::GGGeeexxxxxx]]]RRR???:;;::9:;;;;;;<;<<<=<<===HHH??????@@@AAABBBBBBCCCDDDDEDNNNEEFFFFGGGHHHHHHIIIJIJJJJKKKUUUMMMMMMMMMNNNOOOPPP******++++++,,,,,,--,888...//////000000111222555<<=>>>HHI???@@@AAABBBBBBCCCDCDDEDEEEOOOFFFGGGHHHHHHIIIIIIJJJKKKLLLVVVMMMNNNNNNOOOPPPPPP555555666666777777888AAA999:::::::;:;;;;;<<<<>>>AAAQQQ[[[vvvihiPPPHHHEEEEEEFFFFFFGGGHHHHHHPPPIJJKJJKKKLLLLLLMMMNNNNNNOONVVVPQPQQQQQQRRRRSRSSTTTTUUUVVV]]]VVVWWWXXXYXXYYYYYY+++++++,,,,,,-----/..999///000000111111221233444888JJJRRRoooccdHHH>>?<<<<<<=<<>>=>>>????@?IIJAAABBBBBBCCCCDDEEDEEEFEFFFFPPPHHHHHHIIIJIIJJJLKKLLLMMMMMMWVVNONOOOPPPPPPQQQQQR+++,,,,,,-,,-.....///:::000000111111222333444778>>>SSS```opo]]]FFE>>><<<=<=>=>>>>??????@@@KJJABBBBBCCCCCDEDDEEEFEEFFFGGGQQQHHHIIIJIJJKJKKKLLLLMMMMMNNNWXWOOOPPPPPPQPPQQQRRR,,,,,,----.-././/////:::000111111222322444777===JJJfffyzyzzz___UUUBBB>>>======>>>??????@@@AAAKKKBBBBBCDDCEDDEEEEEEFFFGGGHHHQQQIIIJJJKKKKKKLLLMMMMMMNNNNNNXXXPPPPPPPPPRQQRRRRRR,,,---.--...//////000::;111111212323444777===JJJ]]]|||bbbOOOMMM???=====>>>>??????@@@AAABBBLKLCCCDCDEDDEEEFEFFFFGGGHHHHHHRRRIJIJKKKKKLLLMMMMMMMNNNNNOOOYXYPPPPPPQQQRRRSSSSSS,--.-...///////000000;;;111222333444777===JJJ]^]yyx|||bbbOPODDDIII>==>==>>>??????@@@AAABBBBBBLLLDDDDDEEEEFEEFFFGGGHHHHHHIHISSSJJJKKKLLLMMMMMMNNNNNNOOOPPPYYYQQQQQQRRRRSRSSSSSS.-./..//////000000111;;;222332444777===JJJ]^]yyy|||bbbOOPDDD???GGG>=>>>>??????@@@AAABBBBBBCCCMMMEDDEEEFEFFFFGGGGHHHHHIIIIJITTSKKKLLLMMMMMMNMMONOOOOPPPPPPYYYQQQRRRSSRSSSSSSTTT...//////000000111111<<<233444777===JJJ]]^yxy|||bbbPPODDD???===GGG>>>??????@@@AAAABBBBBCCCDCDNNNEEEEEEFFFGGGHHHHHHIIIIJIKKJTTTLLLMMMMMMMNNNNNOOOPPPPPPPQPZZZRRQSSSSSSSSSTTTUTT//////000000111111212===444666<<====HHH??????@@@AAABBBBBBCCCDDCDDDNNNEEEFFFGGGHHHHHHIIIJJJJKKKKLUUUMMMMMMNNNNONOOOPPPPPPPPQQQQZZZRSSSSSSSSTTTTTUVUU///000000111111222323>>>555999CCCVVVsss|||bbbOPPDDD???===>>>>?>HHH???@@@AAABBBBBBCCCDDDDDDEEEOOOFFFGGGHHHHHHIIIIJIKJKKKKLLLVVVMMMNNMNNOOOOPPPPPPPQQRQRRRR[[[SSSSSSTTTUTTUUUVVV::::;:;;;<;;<<<===>>>FFF???FFFTTTmmmjjjXXXNNNIIIGGGGGGHHHHHHPPPIIJJJJKKKKLLLLLMMMNNMNNNOOOWVVPPPQQQQQQRRRRSRSSTTTTUUUVVV]]]VVVWWWXXXXYXYYYYYYZZZ[ZZ[[[bbb\\\\\\]]]^]]^^^_^^000111111222233343444?>>666???SSSqrrbbbPOODDD???>=====>>>??????JJIAAABBBBBBCCCDCDEDEEEEEEEFFFPQPHHHHHHIIIJJIJJKKKKLLLMMMMMMVVVONNOOOPPPPPPPQQQQQRRRSSSSSS\\\TTTTUTUUUVVVVVVVVV111111122323333444544???666AAAWWWuuu|||jijOOODDD???===>==>>>???@??@@@KKKBBBBBBCCCCDCDDEEEEEEFFFFGGGQQQHHHIIHJJIKJKKKKLLLMMLMMMMNNWWXOOOPPPPPPQPQQQQRRRSSSSSSSSS\\\TTUUUUVVVVVVVVVWWW111222333343444444555???777BBBVVVppozzzbbbXXXDDD???=====>>>>??????@@@AAAKKKBBBCCCCDDDDEEEEFEEFFFGGGHHHQQQIIIJIIKJKKLKLLLMMMMMMNNMNNNXXWPPPPPPPPPQRQRRRSSRSSSSSSTTT]]]UUVVVVVVVVVVWWWWWX222232443444444555555???888AAAPPPcccpppaaaPOOMMM???====>=>>>??????@@@AAABBBLLLCBCDCCEEEEEEFEEFFFGGGHHHHHHRRRIJIKJJKKKLLLMMMMMMNMNNNNOOOYXYPPPQQQQQQRRRSSSSSSSSSTTTTTT^^^VVVVVVVVVWWWWXWXXX233334444444555555555@@@888???IIITTT___XXXNNNDDDIII=>=>==>>>??????@@@AAABBBBBBLMLDDDEEEEEEFFFFFFGGGHHHHHHIIISSRKJJKKKLMLMLMMMMNNNONOOOOPPPYYYPPPQQQRRRSRSSSSSSSTTTUUTUUU^^^VVVVVVWWWWXWXXXXYY334444554555555555676AAA888<<>>??????@@@AAABBBBBBCCCMMMEDEEEEEEFFFFGGGHHHHHHIIIIJJTTSKKKLLLMMMMMMNNNNNOOOOPPPPPPYYYQQRRRRSRSSSSSSSTTTUUUUUUUVV_^_VVVWWWXXWWXXYXYYYY444544555555555666777AAA888;::===@@@BBBABB@@@???>==GGG>>>??????@@@AA@BBBBBBCCCCCCNNNEEEEEEFFFGGFHHHHHHIIHJIJKKJTUULLLMMMMMMMMNONOOOOPPPPPPQPQZZZRRRSSSSSSSSSTTTTTTUUUVVVVVV___WWWXWWXXXYXYYYYYYY445555555555666777777BBB888999;;;<<<============>>=HHH??????@@@AAABBBBBBCCCDCDDDDNNNEEEFFFGGGHHHHHHIIHIJIJJJKKKUUUMMMMMMNNMNNNOOOPPPPPPPPQQQQ[Z[SSSSSSSSSTTTTTUUUUVVVVVVVVV___WXWXXXXXXYYYYYYYYY555555555666777777888BBB999:::;::;;;<<;<<<<<====>>>HHH??@@@@AAABBBBBBCCCDDDEEDEEEOOOFFFGGGHHHHHHIIIJIJJJJKKKLLLVVVMMMNNMNNOOOOPPPPPPPQPRQRRRR[[[SSSSSSTTTUUTUUUVVVVVVVVVWWW```XXXXYXYYYYYYZZZZZZ??????@@@AAAAAABBBBBBJJJDCDDDDEEEEEEFFFFFFGGGHHHHIHPPPJJJJKJKKKLLLLLLMMMMNNNNNOOOVWWQPPQQQQQQRRRSSRSTTTTTUUUVUV]\]VVVWWWXXXXXXYYYYYYZZZ[[Z[[[bbb\\\\\]]]]^^^^^^__^______```fffaaaaaaaaabbbbbbccc555666777777888888999DDD;::;;;<<<<<<==<>>=>?>???@??JJJAAABBBBBBCCCCDDEEEEEEFEFFFFPPQHHHHHHIHIJJIKKJKKKLLLMMMMMMVVVNNNOOOPPPPPPPPQQQQRRRSSSSSS\\\TTTUUUUUUVVVVVVVVVWWWWXWWXXaaaYYYYYYYYYZZZZ[[\[[666777777888888999:::DDD;;;<;<<<<<<<>>=?>>??????@@@JJJBBBBBBCCCDDDDDDEEEFEEFFFGGGQQQHHHIIIIIJJKJKKKLLLMLMMMMMNNWWWOOOPPPPPPQPPQRQRRRRRSSSSSSS\\\UUTUUUVVVVVVWVVWWWWWXXXXYYXaaaYYYYYY[ZZZ[[\[[]\\777777888888999:::;;:EEE<<<<<<=====>>>>?????@@@@AAAKKKBBBCBCCDCEDDEEEFFEGFFGGGHHHQQQIIIJIIJJJKKKLLLMMMMMMNNNNNNXXXPPPPPPPPQQQQRRRSSSSSSSSSTTT]]]UUUVVVVVVVVVWWWWWWXXXYXXYYYaaaYYYZZZZZZ[\[\\]]]]787888888999:9::::;;;EEE<<<<<<===>>>??????@@@AAAABBLKLCCCCCDEDEEEEEEFFFFGGGHHHHHHRRRJJIJKJKKKLLLMMMMMMNNNNNNOOOXXXPPPQPPQQQRRRSRSSSSSSSTTTTTT^^^VVVVVVVVVWWWWWXXXXYYYYYYYYYbbbZZZ[[Z[[\]\\]]]]]]888P998:::;;;;;;;<;FFF<<===>>>>??????@@@AAABBBBBBLMLCDDDDEEEEEEFFFFGGGHHHHHHIIHSRSKKJKKKLLLMLMMMMNNNNONOOOPPPYYYQPQRRQRRRSSRSSSSSSTTTTUTUUU^^^VVVWVVWWWWXWXXXYXYYYYYYYZYYbcc[ZZ[[\\\]]]]]]]P:99K:;;;;;;<<<<=>>>??????@@@AAABBBBBBCCCMMMEDEEEEEEFFFFGHGHHHHHHIIIJJISSSKKKLLLMMMMMMNMNNNNOOOPPPPPPYYYQQQRRRSSSSSSSSSTTTTTUUUUVVV^^^VVVWWWXWXYXXYXXYYYYYYZZYZZZbcc\[[\\\]]]]]]K;;<<<;<<<<=>>??????@@@AAABBBBBBCCCDDDNNNEEEEEEFFFGGGGHHHHHIHIIJIJJJTTULLLMMMMMMNNNNNNOOOPPPPPPQPPZZZRRRSSSSSSSSSTTTUTTUUUVVVVVV___WVWWWWXXXYXXYYYYYYYYYZZZ[[[ddc\\\]]]]]](0`  5 )))!!!!!!!!!""""""###+++#$#$$$$$$%%%%%%&&&&&&///'''(((((())))))***223+++,,,,,,---...///000888111211332444444444<<<6667777875 c )))!!!!"!""""""######,,,$$$$$$%%%%%%&&&&&&'''///(((((())))))***+++333,,,,,,---...///00/000999222222434444444555===777777888989c 4 !!!)))!"!""""""########$,,,$$$%%%%%%&&&&&&''''''000((())))))***++++++444,,,---...///0/0000111999323444444444555666>>>777888999:::;;;4 !!!!!!***""""""########$$$$---%%%%%%&&&&&&''''''(((000))))))***++++++,,,444---...///000000111121:::444444444555666777???888999:::;;;;;< !!!!!!!"!***"""######$$$$$$$$$---%%%&&&&&&''''''((((((111)*)***++*+++,,,,,,555...///00/000111112323;;;444444555666777777@?@999:::;;;;<;<<<)))))))))******111++++++,,,,,,------444......//////000000111888222232333344444555=<<777777888989999;::;;;BBB<<<<<<===>>>???@@@FFFAAABBBCCCDDCDDD!!!!!!!!!""""""+++####$$$$$$$$%%%%%%...&&&''''''(((((()))))*222,,,...///000111222::;333444544555666777888@@@988999999999999999AAA;;;<<<<<<===>>>!!!!!!""""""###+++#$$$$$$$$%%%%%%&&&...''''''(((((())))))***555444=<>>???!!!""""""######,,,$$$$$$%%%%%%&&&&&&///'''(((((())))))***,++;;;CCCYYZkkkuuuxxxxxx}~~yyyyyyzzz{{{{{{{{{{{{{{{ttteeeQQQCCC<<>>???@@@""""""######$##,,,$$$%%%%%%&&&&&&'''///(((((())))))***+*+---BBBWWWeeeKKK>>>DDC===>>>???@@@AAA"""######$$#$$$---%%%%%%&&&&&&''''''000((())))))****+*+++...EEE_^_nnnNNN???DDD>>>???@@@AAABBB#########$$$%$$---%%%&&&&&&''''''(((000)))*))***+**+++,,,...CCCXXXgggLLL@@@EEE???@@@AAABBBBCC+++,,,,,,------444......//////000000778111222222333344444666DDDMMMbbbsss||||||nnn[[[MMMGFGLLLGGGHHHIIIJIJKKK$##$$$$$$%%%%%%...&&&''''''(((((()))221****+++++,,,,,,---/./:::888AAAHGHKKKMMMNNNUUUOOOOOOPPPPPQQQQRRRRSSZZZTTTRRRMMMFFFBBA@@@GGGAAABBBCBCDCCEED$$$$$$%%%%%%&&&...'''((()))*********222++*+++,,,,,,---...///888112333555666777888@@@8989:9:::;;;<<<=<<>>>FFF??????@@@@?@@@?@@@HHHBBBCBCDCDEEEEEE$$$%%%%%%&&&&&&///(((,,,000333111...333+++,,,,,,---...///000888111222322444444444<<<666777777888999:::;;;CCC<<<===>>>???@@@AAAIIIBCBCDCEEEEEEFFF%%%%%%&&&&&&'''///***222>>>^^^DDD:::888---,,,---...///000000998121233444444444555===777777888999:::;;;;<>>???@@@AAABBBJJJDDDEDEEEEFFFGGG%%%&&&&&&''''''000+++:::RRRwwwTTSDEE111......///000000111999223444444444555666>>>777888999:::;;;;<<<<>>???@@@AAABBBBBCJJKEDEEEEFFFGGGHHH&&&&&&''''''(((000,--@@@bbb^^^>?>343000/00000111211:::434444444555666777???888999:::;;;;;;<<<===EEE???@@@AAABBBCBBDDDLKLEEEFFFGGGHHHIII&&&''''''((((((111---@@@fffYYY@@@545111111121322;;;444444555666777777@?@999:::;;;<;;<<<===>>>FFF@@@AAABBBCCCDCCDEELLLFFFGGGHHHIIIJJJ//////000000111888444BBBaaaaaaHHH===::::::;;;BBB<<<<<<===>>>????@?FFFAAABBBCCCCCCDDDFEEFFFLLLHHHIIIJJJKJKLLKLLLSSSNNNOOOOOPQPQQRR'''(((((())))))222,,,344HHHrrr[[[CCC887445444<<<555666777777888999ABA;;;;;;<<<===>>>???@@@HHHBBBCBBDDDEDEEEEFFFNNNHHHIIIIJJKKKLLL(((()())))))***222+++///999PPPxxx\]\EEE999555<<<666777777888999:::BBB;;;<<<===>>>???@@@AAAIIICCBCCDDEEEEEFFFGGGOOOIIIJJJKKKLLLMMM((())))))****++333,,,---011;;>>777777888999:::;;;CCC<<<===>>>???@@@AAABBBIJJDDDEEEEEEFFFGGGHHHOPOJJJKKKLLLMMMMNM))))))***+**+++444,,,---///332=<>>???@@@AAABBBBBCKJKEEEEEEFFFGGGHHHIIIQPQKKKLLLMMMNMMNNN*))***+*++++,,,444---...///000444>>>ZZZ{{{___NNM<<<999:::;;;<<;<<>>???@@?AAABBBBCBDDDLKKEEEFFFGGGHHHIIIJJJRRQLLLMMMMMMNNNOOO***+*++++,,,,,,555...///000000111555GGGWWW\\\AAA;;;;;;;;<<<<===EEE???@@@AAABBBBBBCCCEEDLLLFFFGGGHHHIIIJIJKKKSSSMMMMMMNNNOOOPPP222333334444555=<=777777888889999;;;FFFOOOooosssLLLDDDCCCCCCDDDEEFLLLGGGHHHIIIJJJJKJKLLLLLSSSNNNOOOOPOQQPRRRSSSYYYTTTUUUVVVWWWWWW+++,,,,,,---...777000000111112233555CCCMMMqqqdddEEE===<<<===>>>???GGGAAABBBBCCCDDEEEEEEFFFNNNHHHIIIJJJKKKLLLMMMTTTONNOOOPPPQQQQQQ,,,,,,---...///777000111121223555;;;QQQgggpppWWWAAA======>>>???@@@HHHBBBBBBDDCEDEEEEFFFGGGOOOIIIJJJKKKLLLMMMMMMUUUOOOPPPQPPQQQRRR,,,---...///000888111222223555;;;JJJlllrssUUUKKK>>>===>>>???@@@AAAIIICBBDCDEDEEEEFFFGGGHHHOPOJJJKKKLLLMMMMMMNNNVVVPPPQQPQRQRRRSSS---...///000000989221333555;;;JJJfffsstUUUEEEFFF>==>>>???@@@AAABBBJJIDCDEEEEEEFFFGGGHHHHIIQQPKKKLLLMMMNMMONNOOPWVVPPPQQRSRRSSSSTS...///000000111999333555;;;JJJfffsssVVUEEE>>>EDD>>>???@@@AAABBBBCBKJKEEEEEEFFFGGGHHHIHIJJJRRQLLLMMMMMMNNNOOOPPPWWWQQQRRRSSSSSSTTT///000000111112:::444999HHHeeesssUUUEEE>>>===EEE???@@@AAABBBBCBDCCLKLEEEFFFGGGHHHIIIJJJKKKSSSMMMMNMNNNOOOPPPPPQXXXRRRSSSTSSTTTUUU000000111212333;;;666@@@ZZZsstUUUEEE?>>===>>>FFF?@@AAABBBCBCDCDEEDLLLFFFGGGHHHIIIJJJKKKLLLSTTMMMNNNOOOPPPPQPRQRYYYSSSSSSTTTUUUVVV888889999:::;;;BBB???NNNpppxxx\\\KKKFFFEDDEEEFFFMMMHHHIIIJJJKJKLKLLLLSSSNNNOOOOOPQQPRRRRSSSTTYYYUUUVVVVWVWWWXXXYYY^^^ZZZZ[Z\\[\\\\]\111112233444444<<<888KLLoooxxxUUUEEE?>>===>>>???@@@HHHBBBBBCCCCEEEEEEFFFNNNHHHIIIJJJKKKLLLMMMMMMUUUOOOPPPQQQRRQRRRSSSZZZTTTUUUVVVVVVWWW121333444444555<<<999JJJfffqqp\\\EEE>>>===>>>???@@@AAAIIIBCCDDDDEEEEEFFFGGGOOOIIIJJJKKKLLLMMMMMMNNNVVVPPPQQQQRRRRRSSSTTSZZ[UUUVVVVVVWWWWWX233334444444555===999DDDTTUa`aSSSLLL>>?===>>>???@@@AAABBBJJJDCDEEEEEEFFFGGGHHHPOOJJJKKKLLLMMMMMMNNOOOOWVWQPPQQQRRRSSSTTSTTT[\\VVVVVVWWWXXWXXX434444444555666>>>898>>>EEEKKKIIICCCFFF===>>>???@@@AAABBBCCBJKKEEEEEEFFFGGGHHHIIIPQPKKKLLLMMMMMMNNNOOOPPPWWWQQRRRRSSSTSSTTTUUU\\\VVVWWWWXWXXXYYY444444555666777???888;;;>==??????>>>EED>>>???@@@AAABBBCBCCDCKKLEEEFFFHGGHHHIIIJJIRRRLLLMMMMMMNNNOOOPPPQPPXXXRRRSSSSSSTTTUUUVVV]]]WWWXXWXXXYYYYYY444555666777777??@999:::;;;<<<<<<===EEE???@@@AAABBBBBCDDDEEDLLLFFFGGGHHHIIIJJJKKKSSSMMMMMMNNNOOOPPPQQPQQRYYYSSSSTSTTTUUUVVVVVV]]]WXXXXXYYYYYYZZZ<<<===>>>??????FFFBAABBBCCCCCDDDDEEELLLGGGHHHIIIJJJKKKKLLLLLSSSNNNOOOOPOQQQQRRSSSYYYTTTUUUVVVVVVWWWXXXYYY^^_ZZZZ[[\[\\\\]]]]]]ccc^^______````aaa666777777888999ABA;;;<<;<<<===>>>???GGGAAABBBCBCDDCDEEEEEFFFNNNHHHIIIJJIKKKLLLMMMTTTNNNOOOPPPQQPQQRRRRSSSZZZTTTUUUVVVVVVWWWWXX^_^YYYYYYZZZ[[[\[[777777888999:::BBB;<;<<<===>>>???@@@HHHBBBBBBDDCEDDEEEFFFGGGOOOIIIJJJKKKLLLMMMMMNUUUOOOPPPPPQQQQRRSSSSSST[ZZUUUVVVVVVWWWWXWXXX___YYYZZZZZZ\\\\\\7774888999:::;;;CCC<<<===>>>???@@@AAAIIIBBBCDDEDEEEEFFFGGGHHHPPPJJJKKKLLLMMMMMMNNNVVVPPPQQQQQRRRRSSSSTSTTT[\[VVVVVVWWWWWXXXXYYY___ZZZ[[Z\\\]]]]]]4998a:::;;;;<>>???@@@AAABBBJJJCDDDEEEEEFFFGGGHHHIIIPQQKKKLLLMMMMMMNNNOOOWWWQPQRQQRRRSSSTTSTTTUUU\\\VVVWWWXXXXXXYYYYYY```[Z[[[\\]]]]]a;;;4;;;<<>>???@@@AAABBBBCBKJKEEEEEEFFFGGGHHHIIIJJJRQRLLLMMMMMMNNNOOOPPPWWWQQQRRRSSSTTTTTTUUUVVV\\]WWWWWWXXXYYYYYYZZYaa`[\[\\\]]]4( @ V &&&!!!!!!"""###)))$$$%%%%%%&&&,,,(((((()))***000,,,---...///555111322444454:::777888V U &&&!"!"""######)))%%%%%%&&&'''---((()))***+++111---...///000666323444444555<<<888999:::U !!!'''"""######$$$***%%%&&&'''(((...)))***+++,,,222...///000111888444544555777===999:::;<<&&&&&&''',,,((())))))***///+++,,,---...333///000111222888454555666888===999:::<<<===BBB???@@@AAA!!!!!!"""(((###$$$%%%%%%+++'''(((((()))000...333555777===999:::;;;<<>>!!!"""###)))$$$%%%%%%&&&,,,('(((()))***555DDD]]]jjjlllpppmmmnnnooooootssnnnaaaJJJ===@@@===>>>???"""######)*)%$%%%%&&&'''---((()))***+++<<>>???AAA######$$$***%%%&&&'''(((...)))***+++,,,===aaaBBBCCC???AAABBB))))))***///+++,,,---...333///000111222===LLLdddooprqrvvvsssssstttuuuyyyuuuhhhRRREEEHHHFEFGGGHHH$$$%%%%%%+++'''(())))***///+++,,,---...555444888;;;<<>>???@@@AAAGGGCCCBBBA@A@@@FFFBBBDDDEEE%%%%%%&&&,,,***222777222111,,,---...///555111322444544:::777888999:::@@@==<>>>???AAAGGGCDDEEEFFF%%%&&&'''---...HHGQQQ<<<......///000666333444444555<<<888999:;;<<>>???AAABBBHHHEEEFFFHHH&&&'''(((...111[ZZ]]]999010000111888444554555777===999:::<;;===CCC???AAABBBDDDJIJFFFHHHIII,,,---...333555YYY___@@@777887=>=9:9:::<<<===BBB???@@@AAACCCHHHFFFGGGHHHJJJOOOLLLMMMOOO(((((()))///---???~~~]]]===555999555777888999???;;;===>>>???FFFBBBDDDEEEFFFLLLIIIJJJLLL((()))***000,,,111FFF___???;;;777888999:::@@@===>>>???AAAGGGDDDEEEFFFHHHMMMJJJLLLMMM)))***+++111---...433HHH```FFF999999;::<;>>???AAABBBHHHEEEFFFHHHIIIOOOLLLMMMNNN***+++,,,222...///000555ONO^^^>>>:;:;;;===CCC???AAABBBDDCJJJFFFHHHIIIJJJPQPMMMNNNPPP000111222888554555666888EEEeeeGGGAAABAACCCHHHFFFGGGHHHJJJOOOLLLMMMOOOQQPUUUSSSTTTUUU,,,---...444000111333888PPP```AAA===>>>???FEFBBBDDCEEEFFFLLLIIIJJJLLLMMMSSSPPPQPQRRR---...///555111333888LLLdddJJJ>>>>>>???AAAGGGDCDEEEFFFHHHMMMJJJLLLMMMNNNTTTPQQRRRSSS...///000666333888LLLdddFFFCBC>>>???AAABBBHHHEEEFFFHHHIIIOOOLLLMMMNNNPPPUUURRRSSSTTT///000111888666GGGdddFFF>>>CCC???AAABBBDDCJIJFFFHHHIIIJJKPPPMMMNNNPPPQQQVVVSSSTTTUUU555666888===???aaahhhJJJCCCCCCHHHEEEGGGHHHIIIOOOLLLMMMOOOPPQUUUSSSTTTUUUVVV[[[XXXYYYZZZ111233444:99<<>>>>>???FFFBBBCDDEEEFFFLLLIIIKJJLLLMMMSSSPPPPQQRRRSSSXXXUUUVVVWWW233444454:::<<>>>>>???AAAGGGDCDEEEFFFHHHMMMJJJLLLMMMNNNTTTQPQRRRSSSTTTYYYVVVWWWXXX444555555<<<:::BAAGGGCCCCCB>>>???AAABBBHHHEEEFFFHHHIIIOOOLLLMMMNNNPPPUUURRRSSSTTTUUUZZZWWWXXXYYY445555777===999;;;<<<===CCC???AAABBBDDDIJJFFFHHHIIIJJJPPPMMMNNNPOPQQQVVVSSSTTTUUUVVV[[[XXXYYYYYZ:::<<<===BBB???@@@BBACCCHHHFFFGGGHHHIJJOOOLLLMMMOOOPPQUUUSSSTTTUUUVVV[[[XXXYYYZZZ[[[```]]]^^^___777888999???<<<===>>>???FFEBBBDDDEEEFFFLLLIIIJJJLLLMMMSSSPPPQPQRRRSSSXXXUUUVVVWWWXXX]]]YZY[[Z\\\888U999:::@@@<==>>>???AAAGGGCDDEEEFFFHHHMMMJJJLLLMMMNNNTTTQQQRRRSSSTTTYYYVVVWWWXXXYYY^^^[[[\\\]]]U:::T;;;ABA>>>???AAABBBHHHEEEFFFHHGIIIOOOLLLMMMNNNPPPUUURRRSSSTTTUUUZZZWWWXXXYYYYZY__^\\\]]]T(0  $$$!!!"""###((($$$%%%&&&+++((()))../,,,---///444222433444999777989 %%%"""###$##)((%%%&&&''',,,)))+++000---///000555434544666;;;999;;;%$$%%%***'''((((()---***+++,,,111./.000555333444555;;;888:99;;;@@@>>>@@@!!!"""'''###$$$%%%***'''(((***222777<<?><<<>>>"""###((($$$%%%&&&+++((()))+++FFFBBB@@@>>>@@@###$##))(%%%&&&''',,,)))*+*---PPPFFFBBB@@@BBB(((()(---***+++,,,111///000111AAAWWXeeejjjhhhiiijjjnnniiiWWWEEEGGGEEEGGG$$$%%%***)))...---///,,,---///544333555:::888999;;;@@@>>>???@@@EEEDDDEEE%%%&&&+++000vvvRRR777---///000555343445:99777999;;;@@@>>>@@@BBBGGGEEEGGG&&&''',,,666aaa666010222777445666;;;999;;;<<>>@@@BBBGGGEEEGGGIIINNNLLLNNN((())).//---===ccc;;;:::777999>>><<<>>>@@@EEEDDDEEEGGGLLLKKKMMM))*+++000---000@@@eeeAAA999;;;@@@>>>@@@BBBGGGEEEGGGIIINNNMMMNNN...000555333444777MLMWWW???@@@EEECCCEEEGGGLLLJKJLLLNNNSSSRRRSSS,,,---333000122666RRRPPP===>>>CCCBBBDDCEEEKKKIIIKKKMMMRRRPPPQQQ---///444222666MNNXXXCCC>>>@@@EEEDCDEEEGGGLLLKKKMMMNNNSSSQQQSSS///000555555LLLYYY@@@BBB@@@BBBGGGEEEGGGIIINNNMMMNNNPPPUUUSSSTTT444555;;;AAA\\\CCCBBBGGGEEEGGGLLLKKKLLLNNNSSSRQRSSSUUUYYYWWWYYY222333888BAB[\\@@@>>>@@@EEECCDEEEKKKIIIKKKMMMRQRPPPQQRSSSWWXVVVWWW3344449:9===eeePPPCCC>>>@@@BBBGGGEEEGGGLLLKKKMMMNNNSSSQQQSSSTTTYYYWWWXXX454666;;;999======BBB@@@BBBDDDIIIGGGIIINNNMMMNNNPPPUUUSSSTTTVVVZZZXXXYYY:9:;;;@@@?>>@@@BBBGGGEEEGGGIIINNNLLLNNNSSSRRRSSSUUUYYYWWWYYYZZZ^^^\\\^^^777999>>><<<>>>@@@EEECCDEEEGGGLLLKKKMMMRRRPPPQQQSSSWWWVVVWWWXXX\\\[[[\\\999;;;@@@>>>@@@BBBGGGEEEGGGIIINNNMMMNNNSSSQQQSSSTTTYYYWWWXXXYYY^^^\\\]]]AAAAAAAAAAAAAAAAAAAAAAAA(  j###!!!###'''%%%)*)(((***......333323555999999j###'''%%%'''+++)))...---...333333877777999>>>>>>!!!%%%$$$%%%)))(((...A@APPPUUUTTTXXXRRR???>>>>>>###'''%%%'''+++***444QQQ@@@AAA'''+++***+++///...555GGGVVVZZZZZZ^^^YYYFFFEEEFFF%%%)))444YYY222...333323555999999>>>>>>AAAFFFFFF*))...FFFnnn666777777999>>>>>>CCCCCCFFFKKKKKK(((---222nnn:::777999>>>>>>CCCDDDFFFKKKLLL***......888qqq;;;<<;@@@AAAFFFFFFIIINNNNNN...333333666```AAA@@@EEEFFFKKKKKKNNNSSSSSS...333444UUUNNN>>>AAAFFFFFFKKKLLLNNNSSSSSS333777GGGNNNCCCCCCFFFKKKKKKPPPQPQSSSWWWWWW233777LLLMMM>>>CCCDDDFFFKKKLLLPPQQQQSSSWWWWWW555999<<>>>>>AA@EEEFFFKKKKKKNNNSSSSSSWWWWWWYYY]]]]]]999j>>>>>>AAAFFFFFFKKKLLLNNNSSSSSSWWWWWWYYY]]]\\\jAAAAAAAAAAAAAAAADisplayCAL-3.1.0.0/DisplayCAL/theme/icons/DisplayCAL-synthprofile.icns0000644000076500000000000037317712647526530025217 0ustar devwheel00000000000000icnsic08 jP ftypjp2 jp2 Ojp2hihdrcolr"cdef%jp2cOQ2R \@@HHPHHPHHPHHPHHP S ]@@HHPHHPHHPHHPHHPS ]@@HHPHHPHHPHHPHHPS ]@@HHPHHPHHPHHPHHPz( /Ɲ}rLqE.=kZ 0hX]vMy`Y}ӱ]Sxl#Pz  b F> 4YWb=-Jl4Ev^b25ED X?z( aё Wd}NNf y6WNHf5lgZ`cjUUyP%Eyk%b:;ƃE`A-5Nz!Tϼ}3A3|okx(@嶶P WJywcUˆ)w nw謸 ZZ yVsţ>%Zv;P-hQ^:)T0t~r[G 9PEَ%0V850uW=eT`/K@#C1aɢGZaq \ՙgu)7¿SOQ$?ϼ}SB;U -(g1Ba5,gγzu~g'IjA/Ģ*&-kFo`R~R`:HTFE7Fs,,P̅KƊ_5\ɇ{'A]`g<|ͬ.&]76YLx El",zm\z7t;Yϼg;I+c>7^Іvp<nzҫP~"hMRdMn"Ћ_R?xUpMasA#`Hi0X0&2X!a#OB z@,? 2^3>Zj2;$*ijt޹$hoO:Kq[=ϼF}Q6EoւqL 7*~ />sGߔ`@Py؄AV?Ͼ}IT U?.N=84Pkkkd`N 뤩Y^4G'0WxEBGc]} %7osH|ܹ0j7͊Y/6,WB@57e LoyO`lf.^RCXtIThl)#љIG:)gl|.é g bDQV ᠷ:+{x3f87R ̴齔2W5*!CR{ȓ;xKY=?*q'#JPi7v:SԾd3Q04tօr;Sn*V)$S}GKK ]m_Q&dͮcݡ;E§}W\lQ.sOΎTWY`A|ɴǮk4ĉ m#sl 8F_'Pc'[$+?JƸSq*\_4(ƨb3,L;7Assf(M*(e$&zG`~I^HO KmO[~R+2",ȍTl[6"z*p4=ȢYhCiRw-%ɴzҎY}}N%2O `XϩfwP7+C jR 볃>QR!"e5 -x1m M-kiI&؆$w5lpzɮgٯ)b:zS)1 # %XTۯޟIu꫟u*l+bnʌ(  }ϲՊMI]=Q 7~W/hFzsﳉ6^6fdƩ{f6Fj'}¨}]}`!>P"UA̓)2'u$"_'6ກ=n%+ ĥؕ"vAɐRpF̀73rֿau)0ĜqQl5zc-* GG/Dŕ #/:W?:dS8TkOXLc|Pw/Hgg6[>;h,Iӹ:>Gx)Q; r093t}Ok3pqa°&iI,JjMT1=L6Ҿ޵EoPeBuzWD$+"Э7W龔%/m};v4W8uP_K+(9QL/ʓ*kpcWD]f9 |6Z)%$B%Feu'Q/!wCNrjRNb죳BFw&@<ߔiNQ- l <ȝV+fbE9W 9~_ϼn}s;49bh2nϗ#yi e6oLhMV9fv_G^C\:u(RʢK!jihDàz á^~h7Rߕ (9yrvcLDFpwï>(WMS1i Jm' ԫ)ζ,-b vuhc ٥;{I|޽g&ܩ?ynJJKJqkP=E^FzOKn8kq#mK;||;] ҶRY$\ynrϏ6.b ᮏĮX*Zӱy 1Ss*& $o[M}y&D~lW{(j4C Mzj7lgP a@c=B3'1f=(QN/4{"Q}lh.}bla)"Ƿ 6hٵάg,Vet#PSq': k,o2Po9ǥm0/Z|Fqk7Dl HPr+sew$x+4G!M]xtf,;2=BoÆԫ>mӜXʴi5mLe]Vݝ-Km=chq^Mv_*])o+Z3^UAx`p[se%ms 岽k&WHCoUqvY26VAX{S4][K޽(>qOVMm; LHPs3Zx& Y\y0Mw9daT(/J$=P5]; ?b]"aӖfu J}Q_#_a ʆZ2y[viL:b%m7˦|ote2-E)#9^U<ְ"|vR1f|lTgG(>/9|oQl1}NQAr 8Hu+XM9a83,_?[L-u: u^izBoWPtrN;nX-Pm/oÉP-J2&zH,޾W[ ۹p,X0kVX]Si❶_o$RCv3NEb)vYx7&FaQ%ZI\5X15ÉE2X8O `_Rg` v0}eYؖIO?AzpQMܱ%T7[9V}lzVw7s l;9u j+ t>pwmAio1<"zf M] ,Fe7網E٫iVgG{}9 ԣl LXli~&bz4n~*I1wUR":ݳKh3trX2 CZ=0[P qsB*QL.^H-*]u73]Sh19U!БT)OMuIkB/Na` #/VJCQ!Tng}Aeo*@JACPO;GFlBzW%^l`!,Hԕ;~VKU~E .> h邉vmⴙq )+ܵDTR[H?H@rD4Tf8TxgieǢf߿!s+-di ݞD{)0jXJ!-O%X٩'ܥfρ~ Hy.q+uDZ~dVҬN8+YE ât_Ek'ۘ8 6kK[-R-f})}xޅ|# BxĖ ꕘC~Ơ9Dр3# EXts =S;% udI孶 o(FweD3hU&¼V*"< w"hn05<*ͳ[(Srrm/LZF(Lm!M \ii.?@:Z0t. :@%lNYx 1[-0ZnqPn  5ǔT,v\Ѭ`scC5BeX#jtO[9s(,r,One֬qC'j_djy6vծ%<˪s•2jPdq)]/BHhC1(ZF)ظm,DLubQcAۣGܠ#^R&T(4lbA[2a1~o&l02?:Fڻ6Fbc W̳cfW%!G͎D"]{d]/M ZL đ4"p'ش\˱ΰ4L=42e.-.e\/%m%A|-e-3 *`6QM٣Bڎ2њz%')+tIop+1B9~u4'< BDA`="0/]7z7j ay2W*v^+\n}"Fw׸rmy@֣(ck~HhElnt | E)IF!\vBT$jsg?L5syhC]ɽe_{8L퐒 w8:tpp tD#39ɤSQ<)BN6)KM>?g /s,:8hDU놳@xPjGyٹUEwShXdb+@1Qg qK=֖SlufqC?ͦJ^d %ϊ՞aI6?\C76!30f(՚iuYcVk^DuT)-юp Y.(*K[^IJo^[Zu{4.œV[M/+b >N}F@'oua=8A8K;˭7~oOTgl(AͰ8gXf]JmG_C1miK(;)ߜ 1GC,H B5C,2#Hɑ .dqH䫗:L-.‹Z>У,ҝⷠJ)ű-/F*x夡2RflvlTgyw-;G1ۣW|BU| HOTW9K??Nϼ}6 PA.!2?Cm]׳ʴs42r 4ьw⮀v)u^6xH5ATBVS ?Xy]PKh L wAwn:E\?@wirF׀wVw49#R^d V& ?BMo~`fyzsmG;@:W@p)y==ϐ%/xjDh ;,wF;6?t\P,r;$(nBY(yGFKK4Hy6qz_O9G"UsD&9BH!oղsɦQ_l~1ki[\&{59' R%xt1йoV%!6Iz!*hMV0̻ Qg8I,[I5&8 N/CRD=GtsYY=vE=?26N*QRigpDW3+Q@z M1jL+UPuEj6EzT>B`W@XHP`.y7j@!"{X= **|>ϸV?ɜ~ ƫ|3{R1̿Fo.Isħg̐ 8!8J_]+;'_tu6?"֣ېٸ{S+c(%xh +ZJR%{ft9:HT82W2=I?ACW gc~Z;鷍i)n_&!C/.gݾ6#}Llz 1g0QEQPJ!6$ 2JIJv.r᠐JkȵT <%*[&J ;=! 򀯎54!Ss+,(b(УQqǥb;rxp?8 fC/)$xenmڅ=G8e:4p"<=:nLhp@z%8oMXcI!,'xP*s\4ԯX @K͛.3HJԒccCQg}2Sw i[]쀻=TaX\8M)F{?u_> RL>m;J]Jgvcgӓ2/F|r+;tFs1WyܹPH;I}08ZmvM16S-¾5[<V SOiF|AՎ cnm}߲"mgw[ H_ BIWnxz @v/ao-1t/k43nzFqu[cNfpZe*XF#~Qj>d#8ή}a׫\,oko: 4O dq:ʰ,Qs)8nd2-gYd t-n(6%>YMM)$V-cwm8֓)]Aռ:`U J0J}{mK3sUv &>uO eM4<r"+ {ka}<ŸzMł6cTw.N/^bֽu]ddg-z:'}ٍv }ySm~[[ƟpFH1'T}FK@EH%-jN@w f*nP\dL~ PWAsc}]s7hlMXi쵝D..I˧js~-Es2WNu]X%4kZr'ycf6'YT6T2t)&և:YZmzHt($c2Bkn;ZeQŘU_/\`ՒEλڅFEbe>x◎g59G]vLNX18=Su-?tioA`ʰhN Io(ȉ_9bTR $ 9EfU5@PZx ks撐^U5$M scБ&\Wjx C޽[QG˽LǥyAXs$_Ы3'Yb¸*\o)p&GS|I|u4Ǿb%]1O!XY$o{Pę{}_ A@)ߝ9M\:DRd +JpuMzzPP4H,`^ Gzǜj2=VlB) :Op=A]?XgLޱUq,ɬey2VJ.դ+ɑ D7%[JdpgԳQ }ϧgﯽ{<8Ԧ`J`*7sSw<8~%"L2 .+8voChJ}MDYч)u=q;|2OaȞCqzN)\6ywaY&G k['Vc/⮵8*gY.(Y>Wq.xFM=]à]JKg8tW[:yو PRݠ!А{h;ZGGfIpG+e,p^,Tz1OA{mq|qGZz}@ĿhFB}nO6>`~(i^v'(Kϱ2aQ %3K#0ڔk D󶅄y~FWzBC{EN^OGY3! ϙ sLL8ۄ^`M揬U f+U*[U>5)D:hTaU|[R:$dbv@7H=~ nј=eR09BI"~)y  NVCd0'̅7&KF1+S %O>#Jft&ڧ[mI1 @FP~Mcɵfeۥ-T&s6ds(= av8񗞢8[uI6]q%XGwVIO)ٍyƴL(VCr""5bC75DBjBRz {JZ0% Nn쨬d8Am2@W[qLs>|phX{d lNy~"@E<aE[Md1ć;B^A1?J o'I:q,P`FMX b)q>L&ҧ.( FA+/&7S@q c~>7Tάn*䡖ќ@#gJ7#k$Y|J})l0J_BTrk=cиF:HF衞>&< Y4)pH|UWH3RQe{TqY%2{9q~8v+C9h^`=n?z>}5gԡN) 0zρ$xe;p9_5iy)t-_1,UݢY`Ck^bqw'.0C! ;;/OMLjp wj &il ۛJd9:jzAmS7΢[]z8 M6W^-InuBDh 5]s) 89d pJ?N7Vb>sUB 6 ,Ѭ-hR]4^7bz/ \s19!!cW$NqGNSYɉ(TMAKV0m?vlSMKVxJ6<*ay>q,yx88rrfIdI'lk9rI .0[5@Yt=A/69sNʃXzzlk\CSr{yjĔ[yĩwKzpyBZ6+7Hn\_֦.zmO LƠVܨ?w7.SF=~&yyNPΜKtcFp:jy_D0AdhI,;9l%|(3H=%yFg.5P>:y߉% 6LB({,A H)Ly9uBeBĎ)I̡4yf$ہI7^m*JZCIYIWMuld/۞3֛naHO,{ n:|Z(MW*\١9|z\%<;rmTN*(b>2ґxK 9UF: ѦKWh$'՜4xH烋ve!J8C8|LM+g*{4-cѽfp> uXV/-^,T< |Kt52A食d =dIJ 4=a.c1! m#kDV& _j 䮢Dm3mۂ!`hh KohcvgH 0wc8D^]KJ--m?)r׆HY%% {pGzyl!®])DXñ b-jG#Ŏ|ҏNmf]e^Ӷ*Xe&sz4U 4j,la"~#Żn~V![1q/R;F_RyWS&,.g(Q=ʱ[!>b[&cIп8{nF.)ks 6!כcNFwg勶m3?N'CQLniȴ_1i{5V;>R K],:nn2h X7iSG‚ vz%.k|a1J6uo^Y DkóQl'B\ <3a]c~ȬL\ (XT+>ymE''|TO<0{ |^d5:S/6-%n5/Dl+ 7i=BЁ@ʃI-=!AqE6If%$Fo< I)@FP^&,un:8Up-"By8Mhh =KYֵjwu{餈tyL8 .J#f]HNƱz[UĘƃ6\ŧS_.~erWJT3!gᖢ֨ʋ8 E_Yռ =Pc4x~z=67j9 vkB.3Ew&.dw688셻 G;$+¿#5샢`#5qܫ&~:϶:Jz:D V *U7jT"H j'xX07r|N&P@v K?n>_[~%E4>|k|ÿqeD,.P{t=J!?B?Gv~СACәi_"VB ⼟#K>oޗz=?+^ BiL{WO79Mq:mNͲYme aIc.5"qBԕHx%"Z..Ev/7ͻ h!frKg~=H-D&t/պשM5.kL66 q04#lzd>M8?%sCT/,X~γ,$fY@} r ]LB7T7բZ,;%gfQ.l~Dr.dö,|v^0޵` &E5 ~wreWI`WUX !w٠rMmI|@  :sDIW[A(ӫV2Lb1<&{OLxzmv>(ɱ]: [$(3xIA˃¯z'Kb"'J/))@&|G˷$XT{0h& >" 8mhaQ(t5h/YqpO2zka(X@С1^܃ڋC5S!uaݶQB̋Ѿt{z;H%%9vbաK@buY:ʃ~EI m[Ϫ/4r8 J?Uori ζj@mýN.c~XQ/symʨM[=MmR^eM?`[ $7)> xjω2]/K~z@}NU,rN>΁F<(Tȁx8<7[`1!ퟖk}lk^pXLkXW \H6A.CB"}5Y%*@@ylo3^ ^^F ht5AD3'J_4HU}3Tc?sGom8kszAE nzBK~1zw>U !η>ǫP$ LO#^f kVZ'm'㣩>Ӕ;tW0[Dwӝ_UH#TQĪ:8ӋPǤGh@f΢6J\5\Cjx N b|aT;Π;kY$xixK0 tNj\` hUO(nK}X6'}ujL4[$_e [toZ 3B; EcH7'z *BՀX}$ 'CtWTߤ~jvX!U; 'y$HF#ײ1 5ga%iSXPQw1֭} FԀEm2OU*^cy$`;K/"+%pd[11cfL jQ@da(RڞEr_%@;UYKSHB]@AuxvN/x"|nY9˚QPNQ^&?<$:!U20ҝ0jq 񽂮QDS @tB7ntJO˵wQ%ЕgXY'giTeG0(-o%"@ũzt2AcƍX~ y E籆~1o1.Xe$ʘn(;ѳ@xq\:^NF4:pD|Ƿqo}}D B+lShH&[2A-ɔLa뉜vue-l{q 3,.f(; }Wʹʩ ݿY`fH'@&^գ8Vpt(afuAHn}-OõO4RILuۆpL ؂QK<3.R#I׍8`,ۘ-MBTu[(/ʆTA6=*xV eu3<<54 JJ)_:zʎC +8?2[1$#0ʠ^-iz_/ u$@hVd}^H/[ 2ߔ'N J'Q_7FAh;lifE26gkn A#'ͻ̊[#8! ƉǑ*`3V,܂;m`OjwFo?ANxݰ 8JqGs]j7`PM?T-LF Qjx^sTdi fBgyJ9ٻD/x6\rxw>n>+GHtx4JEd~$6Yup5"H9RcSwFu߆%Md3G߁"#H ឋb2YG٭au\CْL}#< d&Zڂy :CLx!10/z#ANwcsd}['ȯΟQ=FFLd[a^M;,n败kl0yXVMݮ)y /T%\dOc3mnj29֦wBb<6Yo ?#]整0<Ih)z\أ21v)t,٬ݜ SK虓L81WMw;J1%ޭ/a>s/T<7y2Z);œUk\\{{B7j:6YE['ʢR 6xG֊"kT1S$hF ٚA9a; ȞR˸Mkٔ[Lz9 cAAdPVD[$~|Xk%~c"ZYӏKjhO.XIX,!7^%5aD1H(UIl+bJS@p$Tulrq5lG]G;5L*Lj&GDžԲayr '%Q0b^luQuef'4ѹ~ K{KW̎Pp(JW%jׇSYh|u x=ڜC(DZ=4TdQ)gkJjI]W@Hܶ'3[_]<'-bo!u hȈm|PNMH[>9 %R[2y:6TkVs83-ޗHѲ̈́dU G~OBxsPwGjy6~A-x]y05Tn>%GW-='gz^s*>8>264!WOHo3:Y?C~*N;ҩ[Pob6 :ʢMf8BԛGV\i9sRi`sjmck כۚk1`Y`nTܑ-SV3RdɃ :suaaw8؝ 9 ~i\]OPc,@rCH/5-k/p#y;=yA`*Nr~l;)1"U>GrBDjp%{M[ a5*کDbPu\nD6b1"m-@6|^(I-:27crP^; \m-DV$6"+ Y`7ΚPt:-lOZ!r omP|Z W216yu7YEG'OǬ*՛MNbe˞Fn ]d,;Z[Kԥ,5 AnmfsץJQvx˯WOq]Ofkw ~gȟD+  nc ;Lf]kx|yq/qƱX--#P7Å U2>1/~޵1W+IW)%^/z P7QVrh#=$f+TdM-0^"TEff׮ڐ| `=N^BSQJo@L8iAmmH Nk t49`|*tU\1 43X!^]`ըyi-=|^Ehcj|KEwʀ-HcϏ*ݯHLS :O*q?6$ %#r-ϓxk9 {fԙ7%s7 /(r[I-6`R#߭PChbOAU4v,&nhl 3Lɥլ@btaj7#C%j-NQtB:ɲ|-'zZ^GsbwLxYS=7 ⹇D/c\s8)^nCt,"p|S!1x`y`l hIL*3*qR Gt>I ;c&i51sK0r^?, ܢz#F=ѐgMQR^-GwB&7+I;zBHdO!UpTjiu鷂7:ɠ5vE\EQ",ۜ:ZURTٟ엳*$1cN*S Xr#Q3璝&\ 8}?=^i&~9N  +R3Ttt㖝|>;)͐M$\-\Nƒ#!m|IZ1rq;*dO'QVT:/ݤKSG;R9/9?ߓ=4Gh"v%e[Y d[4AJ`yjt!)ajziR~~J[alζga[ȗ/z 7B,,0킥Z>Sө#Tp@(#*bg܅I4%cn6\=r2gk_cLt?jpx]6sN@*02u|diRZ8ҪJ ZMdF^Aze c>qŧX a9 2v0)(ح 3m<@P4E`jr_W^__WwoF3{?H̪F۟ꬔ Wc} _T} Ҭ \*Q#x]^((SF<IbL#}M\qF0.zxԭ^Wٹ@)xDſT pkZ:e9(1'r;}aj3Bt[H]!v?^+2*c/3[E9[I[?OH{]›qH>Y&0b~ťK" { Kn'5xiRqXtE zC"CDU'nO_I&ݟ.~)7Tќd5%ù[w}^(AUYT=q Հ*rY/fU!*C{L0wQYsP${5[-[fGAR::]  CiO y4.#~F0 8Vo=vd&tTIPj3K oml!UY0+ԣ-"?5XKm`(hi@GyA1YWǀԸ:8{ݦY;\ңm]ᯤl)wxήosVʗ%T`\-߃FD)d* vxA+Ã\rY&1kY)cm;gO6dG'Y !p:hTâ8 jpǚwN%s2!d \lNVE7"ps,?~% pv^yݱL,X`)#E ;|feBFMay{)Q1{ g.!DX] =}^1%xOP֯0YK&v>uo%2-*,:)(yciB6ZnB>lz11X,xF44{ .œ?9KHo*qMنrdZb,a#aLa=LSzT*uAb.b0O_+rA*N£Q+k#a~V=O ID0oDULM?D,x h+bhuͅ efPY7-IW-2ԑ~V.D#LDž~kkO'vc͑ut U5]D5cK˵v4|!yqpi[m?;Zz'$8!F9k}2p/)}}K3IIzܘ3Wh R @%8~*Zw+՛||"mE1L B O:dYn ~ť `z^+0]*( 8}Mk  [nJhD 3̯IUl<BJ5e-R5Y5b>pʨS;a" &/, aLyyu=ۭ+XPK!4SB%ps7=܃75vxfHaq )ؓn\@Ȯ֤sj 1bﬕo'JW _b0ppi{W!^9pѳNk$'qwUY{bdCI'.C:Hcĵ晭v̦3[ʓ9:uӰ5l c3O)A|(Uipm^McoFmVĥF&d1ޟ?jjEz0gGngUElQx2A 7xP~IB'5ih>.+K@ma$o$t7/+hDj<" M皥_֞^;B$[x?irKyx| F+rk#*y )xs }{tUg{GܟH xmL)HǼ%jFaǖNJ~1,]dn"z]C7lA/IJKՉ}{klwz"$ H 抮B%p^%A}*LI6 ¨~"wF= K,XV)pÝOlCI8c+ k<*{CD1˕E.?2|VDMؠoCZ!;g2N ύ)I=:9q IHs͖~GM #4wR! Otկ$!{8!cXT"[ *)#>| fųE/55Rn\Y-k#$F*& S&9G\9 5C^d a!\at,i/6K/Ï,tm,ёxs|W@Tw淅ZKs@WUjl+nLXpKISAk65W #u *ƞ+r2uܯIKeriA0Zx0 ē緟M# {1;ϊO-NӦ&[ytK퉭*g>s?&eȞzZ%Qn#oޓLJhJ'-\R9C+d91K6G\%daa+,:hyDv++Tԑ\7-H`ܦœ[ ~J.#U;왼y&ҸmU:=c#~uYְ ws&.ǻkݬy0g~&,c%@q# XNҤQ(֖=;"}<-Y `:2b)G`@ ve%wNbV|$\/9~8bKg1K_buB? ]x( OOۆmb9GT "Ӱeq)\Y)+Ն"ӭO /zɢHsflo(z~A_}`v FWFÖC23"vZr`6ح7ciG`6%qQrR ]Jk.r9iRztm_x[,@U*OK8ޮ㗉tq* >[ A:@6F?wDUOl!1I P%",m'G>R*`W@g}1aErr22W!tͧ5o4ךS8:}p衮>w偀sr]$-{!t ٓ#!PV|S ~xlQkBBl d/繸8( %ɏle27Cݻw79/֦{28>[c&,XLBzd{D?Vc1F2, Nm#xunXjouVvW=&B 2BDccΨYp!nzQ8мz_m[4yf[}Z92/G\8\jֺieX?WP{]\h21% $K{s6T,j;( E@WGXN\VݫhF/te :v07:g`{6ɝ'p"/ / GxO0ȝ.8Ee0m s~3I(eZvr;bR5!jy<}e@j$4P ש @U"0?&EB(4ΜN#\%ꮘfuorg,n{of-_^筲<WyxgI\$gS[GY&C"B,Le >.Q3ͺPSLnV(>^Yy Nwi,x.íPgVbغ[mعmz,c Fۇ7XT9Vm6I1 4.bN}z)BL5x#6k(">8KI;$/## a;q^Z* Ԃv: 3/lD9%>J;=`Ѕ jbJfO@%}a&|;B].BL]|`vxPY6"B7odlcO9'0KyI2ǰ&^fCde\>YHx lƖuO<fԆζHv"@f1s`l4p]N< nUeV\YV3RR^.qc*0zUNx\+_cKN.虇p`:.(Ura88?xzW`h*~A1OfLf:A E3)vrޣ'x%:糬f跏)ǘam^e&1R½4P@; #Q})s(涘pm v\6w9MZrs PyYgq&_mUh9g[-Ǽ(BcR8ݗ?nip%7W/mYyeP}z6# naT@< |WXC/Mh#UFVüN&9hݴ?@]oOFBewdAW7#Br+so@6,jaOTyz+g BQMɼB>|bwBY<8FD>m>'S fQATY"aOu0"C_ut#9;d:-%[,OA\Pm` 7VGmfQ\I;<,9 1Mٻ\$2׾ :E7\4N[I.6ik8Մ9 dl-t *KG'+ BbVooI.ƻ21*0@aw)0k{8 ȋFzxKh5;uFK+B/R]}8|oG%-C*F}vJS>yJ.P^aa28gI%s3sr&DX, qF$L^06^Y}ZFn;5OM&Y2eڵCo񜠬{% h_(5%\'vmDp}" B10K BFeq?pT6?_kx9yP*c4\{o}kszA%!=OJ'#ML?G X`."qߝ˅`(=f Y3=ݸltÑTZ؋o]Jw/Ǝj:͎f>At)j&KHr}W> % AI{_τB<Q.k6|ϕHۊ8j 1[-IQ|(vFvr,{/KYVw/֪127Bo^x];Ft/"7C^eȪZt<+r{^@!KA͐a6rf$1p 14d^&VW 4ydsQp hVȨ4}H>3 -2%lC%DaGdMg1?|8؆VC(sc{ 88#{e[f6;#6KV#LZvίUR&(wlН Q$ \/ GRDTGH)ō$S?)=!'W;.M'9^!2AZ0/+" ݲ10/BQEc7ΆJ(xF\gUNglȄ aV X(pA6UR< ]-T~붦3J? JQ{Re?OQ{X*ar˔]S*CJ8iT=}7KZY[cwDgUŪvidaMS(*C z˰fhN Ujo sXFґOQM\8˰_ޫJU:4rJ5j9HKC88 Vn*EжBa |%FbwsQ̸@ACW!Kjr)۩MFYEsz1Yuq RP0F5wkq"/GB,-W$?۹ʆiX5LYpyLç).<:-,,H];EtUDƮ2Qȯ=>|DvLƒ#6k.RObA3|XtsF" OMȸF?#&|{;񂑦ag`*WZC?82Ψ(WGM6$}cO@tar ܝku'XH9Z&@sjOQ+Nfx.SHiXxst)J<2+noJкyl ōqbxI~A9H/}##W)98v2vX6#$C r_3o}fic0B`!8J3}Fg_].bP!\ 7.84qi,R$<-Y◢ʴ%ꭱ>[7sSĢ2H~rK.3LynJBurYӈEnpkq߳_'G/vrKZF?TpCvp:١"qeňdTnZuԜ4 i=EJ]NbAOƳ4hQ 2F!gDR#!Y+P!K^[_?:V5))@x |7g٣G|=tΪ>:+fS ѷ09_-bJV_mzN95rw 52Ci:a|m3T-OݾȜñDcmmuZًvRɈ;X\Z: $ aK5VhtSߠ?%dc(hט׊ /^ɖz'?Uut.6@B m\4,#!F'ElZ9(@gAL {6 ,K@M ؏0w:a7,?hڤaH3V{X6Su>CjMAZ&!ljlI_ac?*bWg I 4{UZ8qDC,Tć&#p/4^b>$좢௮NIU{L ~!U \mƌ>[7yu]Y 4W+53 H ꔟ;~kaQN*lN^pA:&NƤ=~c\j-ayV+6;omcZgXiu n| Lf`DV fw04,P)XB r{JTb&~9pIc)cZ3] (: эj xuY~JL 2S⮚Gp | guCiP(Ѣx@=v.cBY2OgdI:4_z}ƾ~ U;OM0,}bAy=q+ ŞrޅuB&0H%N O$z!qxdVFkJϷr͈>e=S\ڐ~˽'{] q3/Wu -HV!2}ȑy/-^)Ou~ кajk11S}`AUYk,)flT}Iز('wRA{?]B'*s~kלEXjYǭtr4uqCߍEєbT`uBy ttEd;$Lҏ0 uP=! ?2rQdyO R%t[K Ƞ.N)`x6#91wD١<8`"\[['Tg[UM|9%]DHwB P>+\xaD r) 4j to<6ii-1}1Buj6^ {u͉o GjzZ0jI{ѷ-*? ggshG2(XsllX K` :)pZ2]9r#Aa J6i[y>l'OWonR(z.K5O=fۮV$ IAUդ.W'$ޞog[z=J<6k,k{8 d@s(Pҡg`X:|!k6μ^n|ϾdJR6~vR?Dԛ0v0wo+2 Σ1f+SFjNTlUĥ^!',:g"r_P׵uI.h/@8vC7/k9Iln,g1T-9 ^_HG›?y @N;U{<{g@Rq [/.I!W3g.a_H|1#g ~Pro?0IRSH4018f>P"/_p;[S?(3ѱ{\ҞKKDP+|]љ;4#s@gE!g4f')*#Õ 0Wë2D 0& y2} bp+g" tN K@u`,!8ۈ0׀0JL'H -btO՗j7YbL3y;t~?Ea,3M' 2edlY>Ј~) cX o[Ci}o^{ᵮJ["XTd1 kLhJ }%>{\GY8HykYvrҍ̌y W,$짓{@2+-5&;]hã>6 I_hUQQ@"iL!JhܟR A;^_(NHZud,9j=7 ?1 xϞR2ܛAJ@M1(6lUE ,j.eSU܌ӭ l&J?& 'C mȼ#$彐<5# +CU_/~g*w K-Ugh}xXy;( 9p_7߉[DjN0qK-iJ l Qضt©(vwѨtAj911a#2`lM[\*$̓y,-g0*!xJ,*2dm A9jN{13 /teN6?T\1&vMKf/VX:(jF{16 #KM@q'Sd4ai[$\G2`nW\O,nǟYHgF4\@̤ :jHtKz&N_(-8tjfAYۚꢱ\BS[{m('/N!P@ w)Bc@fp^\m=]V ;v0% sh?Z >bj9Z;r,m)]ŝ>:(G7ZŅBTe(qi5j|`"4EFu% ek`iyhWxԹ6 ?n7~G8v-l\&cU9B]YݻU> twOgR/0DWvy]ϳYzR"Zq"ykM"V-  O=Ui~ls+_0?ð 鰉C- C/#by;xGK0*r#S#DRKȜg[< ԑ!s`b@Ԝs u&Zn>pͻ|?_P\)+|}~y *<X~$3T_e5A{im_WtbAT<{y٦ })."Ids. 89m̤&j4sڊjzpE}ces ȘT~IJ<_Ri(HLQz hȉ_|M7E]ky^Wg=XlO*wܰ wvmH7 ??6k"g# nJ-,vRP`]3Zò0au V"d/ׯ HajQW ~N /{)FeV'NSor"evbˋ 3B?v?y(`Kw-EHf"521EI-:I@5 bS]~LM_Ě^?&"$?})p{/fC;>Ŀ FO}5̿J`s}_ +n"E:SĝsX?U携٘.+t^ :]7ĀtO)ͥzguxYW4,y EENnf`s ? MUTP6geumVeiuqj_1gp^0kKi(Zњ9,ucH*x yŜ_i+mTֻ@T᫶8՚]:)]śr']h:ƂLJ|pomr(Lx)f6%XHDU>mdMRF Y8%Q 9k#s\'lHMs{qK'lNvabˀ3Zב^dϮ,[ACe \r%|ʑj1OPRQLhw39.\RxG"k?u}eFtH?`|@_s51*QX>K M-&>T5jU?@~#ߨ SE8-w|Q`% PoJNfVKsq@GV,'kQnVt\ 7K*&;QVcOāGe?yh؃U-+jh>e˧5k+Bp"@kwٲ+B=Ѷ6Yp8ŻOGZ23 ^ jmPbx ǜWzx ^1xHLS܆8Cvň\ v 3j+5w_t"xy,/ FoG:-Q(DJ*K3]~vZ-$G8qeCA=MH y76g2[; DPxkW2 'mpݝgKU0zM%`I$r:N%er^RO0{9LOypegvB a `|\%c&"o)-eYETJ^u #BBVD}l~ءZݶyB/7olZsh )#-kB =]PFJ+Hb'[eA%l9R0hVok|Ub~/$ gsz9u Gdp} ZQ3#Xvҧ0 C83/-Ut?÷XTM0e3(\8FF|2M3R.ǟd;]~*1\mXũ6Ar$`?\+'} ܳ8cJ߹?~u'&YJݐ|bLqq.Qz^Ix=RѾB`Ŵ2bdd 𒬈qL$7إ5dʂ^AS9UDmtE/# :I-rJ^oʹ{YChXpNArkTlr  cpûk<>*غ?ob#VKRɨ']ƫ?a&m2&SVc+ /d_[Y9 CwL^hNLJ6  t?LխDAOum夿BȬT W 9Dj}ʰ W rf~"P{LX(QԞ?P^k=0Zt+B/!DtOMV|ɼ#ñx4 ']Sn;qލBSjڈᄞt|@Eofw p:e䋽E0doHDvb%} h xp$A}F+<Z{C/1>pvv\A C!eQ #GÄ*$)0Zo!}5>;u" Y 4S0HT!Zm΍}uw 1iGp7tAA?hPؖ<ܥU1pn$4l<"ju:"?(9!lwFV‘`O$VK%ו_yfL+!.r*5n{k3)Gu ݝ4Y)LG rhPp͛AʸһhRx#A wG&^gr[3V:qmX DαɮdsxhU=FRPMbT ;j;1tV2sϽWk:@>>_щQ@^RC2%ArW0<02^Slk׏#8GI'rcIvSA "JC*fk4N׆=/3?ނbGz&Sޚ6I W@bT 3i` .vue.jKSALiPcԽ&ñHME_7Njl|#[~I,ިQ3 zST_JCvS>#88OɃֲ̱$04&(:dՉ3Y0LxT{wY_ߐ$+U /_WɦZ$:Up]iN' \ 꺍A!ɉFɏ_H*)z/&5E*> UwPh@*R]bL"O>lx!ԟ)BzԤI"Nǁw7p#d9^RE;N9xp~ƞ_8򍡱؛, +Bc\Tk7x(eMq"Jxb@uE#5[ þ6U*?a:q̋'&28:וė7,'ZY d_9 B@BtN>#hm!~{}2TazJ"Ntcm4Y|# znX珃.RbY]; l*j%r w/|kH3VCtND4)۹gwoKU{1XP؋_,vɈE LV =c㹽U H $&l&ۏ܉ܟ yp45,.eyތk2o.szSɟD5NL*H2H_p$!)^8 rc;G>6e8P״*@WNI]nرOZjtW[XiJZ T5Y*u٫x-6O>"ʳ,|-R3"4j/2{}(_ѻW/5K.$ޑ TkmT'GQxFaN%p͘\2%_v-i’7ފ&=jf/5OXx7U 5.Qo Ih\Du%_pުF׉f s.2X>ԫ>R\A e{yS?Q̈́$ P~ ,UPaqBt<$ kB$Ywh ǒ=@+HA&&Ia5h3] vűlK^NYK@؝>-bhRhH/L:W;hcehwIftVnFÄ$Wk"2:zy ZN(ف+&gP2,w\7{2\p8'1{*X#Qw lJw̢E7z@vz)D-hjZ3 }FK!d3'ҩ:\D9\8ze#ar{Cz*2pg3Y>1hپY)%]XfXD" PUM51JpGȂ>]}?yelD|%/.U9YvӑI Ⱉi-fý* RSBӒ  ٯS2&֒?_̒ʚȸ? ߡ0yb= (Q\6*ۣ0&@̄y!WFpF {D ĢiZ ?1M 2Pyx, (y#z|ma}(2&t%1=ȝ4<219>#bxjV5 Y-#Z'8>d*όs{$bNXu.@s·(s{ +#=X"S5ND;K@H@u#{ݤP k,l/" *T:gOP^H ဗ-o2>dBf{_>eޝSy<{EP 'gHr?jqh7)YMȽ,}Io]+oŲSPW]Qk-$}0n'd(q&z9ţ=υT~{ *!fWݦ%*o#PoDk# 3niG3uxJ=G{E%>%hqY? ,Fc;P̾O4_ь d'؅zwAMjAؔ^2!`2t|+^;咗^ f3D^:ֈU\uU,Aoi&7vvwGO6r fQwtKvԔ,5x\րMEچE۶/R F\1٢Pub PC㷽H1ƽJ||{|Ղ|L( IAt2M 'qvTP}x]؜9{%|҈1.̠ړN0 ~](:X 1r4R>sMrqL4n0k\Gby*ۄ)13E|^nc%]խn8p-ViJ}? h{pKeՓrZ)ǢN›ÏE+[㘝S}~Pnɟ#mƾ B`$2q_@lO~v 'ie;Y;Bi>XqW @~yrqXP%Ӄ.Z2{)(N}Svpsc!6mEH,9/ `B<6wKWI$X KRk_6RE|7~mXf7POcRlpٖ*@vTɀd{ ,ϣJ+1l9S߃m* TU?J\hgEr /l*ٯRe8n3sP@?!ܗn7WGs-,7~ dҕQ(d>AnRRBjEdfeq.pnEge2'Ӣ ==dh܈񫁏;k]*L՗gsoIX3ѓ@/:5CMQWgwMX$Cl"<V 1D'|[OV,=et`+6{& lm§{+룸}EhMB`@4'JdmmK,HPsFoTR:;HF%8ѦD΋k瘩tipf5vww8XW$7AuorL-\AZ15JIᖇn!rI6Fe񄳀 sݨFu#G_kмCwCilAopP-"Q [0l/&kJA*23|? W?=&ڀF&#EA2axq׽7{OR*)_HX.&Aߋh㊽bPɯ Fҿ4T"_P4W5 amaWlu- x6oȹ~U LJ=8<$u!p{@B24o٢gQ/3 EtcG&CAдW ƷlȵlC#Ax̃Yuܾ@8Ĝ(mFHp8Kr(!<EdNz7d iNc2{H+6"C(ɺOk##!S0"wlmø#BaiLM͈:Mj-ş>Qԉ\)0eC*^{:X98"@k6}Nb'QW!:Ą>{ |8|1Z_ЍuE֏3;M;Q&>LD!&I?_Qxn&<\%vA\JB-nYGu#_ |{XS , ' 1V\ K.˚ Fi0G+S{"ȅc#PsE'f>biއ'0|4ϦԦ}t˂įbiIzuK!u!GC81 ē}ao|6D]|<k"6EKdi'g]5UxXaVBOaѳ SęeUny/rŸ$3P*bzAJ''<^ XOYy74ѸK.tqq2.)L+/3u-+3`DШә륹 0` gՋU4U< # KQܮV\ZrQm5H?(u V3 D̰yk U5Nss-Mmk丞 ׵sFlXZI}{D-702&{5=uB3j]ZM2-3] Q͜'gŠ(|=ɦTOp oq?|~Bg; }^g%I^kj"pNӐQ9t,EK!Q96dxr1ApK';+Bk k+6+JSjx@[VHفI ^hFwJ#D$"_:mi}jL:%p_3H EyT~C2;=кn^'$[ToCpy$$Wr6W)G.ʺZ*u>g8zvYիG&ZIŇ=L)뽣!qiJ+oLofnq=6@jtmAѸ~l~9iS0XѵvPh=jxiwiY՚Ӕ|g?Ght.e/m+JMU[m7 qN%hN[Ol 'C2bNbq?i ~pmȤɣWVr? .aOI4'yAdi.H].(koa3^DE#WNdclk7k@nlO$2)%hP ?>V ě0@f)X]adu,6)6^\@Փ/R([fIĵ_:.k `KRE|m: Ņ2/XLⱗ,$ԓƬMi JN`zv| ylw1 LnH]A6'psd9}Z 5,6FCxs*9˕O-źOc'KT0"t4%*JOk(ʴ8+ZL놩c,$RXླ fvF#J8wI>DBy!Ss5׎Yr&IMSuZc"ܙc_mQCy (p-жϋ)qN)֓L]򦚹 `F8})ϵwX &#z'["xUƻ0')@z-J$*44"* | 00>-+q1PXF"܊('Y2bqeaM4y'tdL#@r^3[F‘@tǪiQ[rҲ}愁蟙as ߹yƁQ`\:8 .xiE@D"yW>zUשׁcN/eh⁥ݎLEw ~ގo[k;f)Px0g9^ԪzF(}#N 6z2BtOc~ _O1YH.JvW`T[y(?B.5juߚ+-L`˧%~Uc*3KMeb{O'hw,L5`%xH33"b[V)xR0Qe(#VM/)K^!OWWI8B L(/JCIsoAoim2{8)!O1)=ɗ$@ģp/򥺎1Pp$M6vm312ۜ~ClTO2-P,kK| [3ywck"ѺG4=7X.Y8qݧzb+Nh \T0Y)_ u&pa,(kMNn9ngMZǮSQbZn}!^C8ʓ4[^uv`LX0TA~,6:.sx\X C 5Jm20_[_(ojB$K Gm02쟊\3괃@>$R"90]=%7O|b; N۬vf8ENN9Τ .BI]<(b (Nn\s5VN*ҫf8T.RE3lL='{dߠKh1ЪֱY|Y?!r +iy;dlIݭ\鏹ԇđdvGұUZdCz0(io m֯*]0_d5?:LvYC¦N5[|5 `VdC)Y{^k(ԷuiMC"n\/֞{ZZ3d57JВ9c߲oRE4wz]ձa޷$zoWORd4)'bpbBOEƛ`Fb@ 1_/!0s+!CFTJdU0ޘ">{/"*T}Uz:IQ{,i|#6Nc p ^>$+>4qo!CMjUG?Ak"mΪ4R?-I}`cad֟ Aʝ3{DJ8ŠHGk%t8B1rݳ^3ay_2"o[[ɥ@+[ZD 2X5B,Wx7ʰM5rh64q5%Ы@[<5K4K $u~tqxÂrMБQUW煈F2vQ[mPΣ1nmK:ml}D7Qie,ru@m>X[U${1sܥK~V 61 u;ӯs.f}wљ=ڶ0o|S8,oIB0q!}]i`a7ݶPF8OT&XÞ*<-]it)j̾wws/< M?Qw|݌t'¦#8DmRəpdKCCNq<5=Ϧ%!(-C09'J^um\LxGzOj5GS ag);i] S@6 y%s@q{?Wa6b~+0c dqc'yB*7:}yN=_ЁbZbs1!_I @L%>`!ǹ͊/l*:128%Y9d5<Ũ? nO}dPiTE6oԶ+ 6$8xRp["o)t/K:Jb /=?{%Q"YJЈ\KѦW0ZRBJ;qUƒoy 4im_Y$MpvVg Y5oW8L+)fGʼB\Z>Z8@_cQDQ$#gc=7lc)"8qrkg ҹ)wFݠ] Z{lbyA)BݯSLB d}0lL5wb yE ":Z "¡(j572"z΀H )Sf8^9yT hn#򲒎ؙNzþ7Wxb@9ǜ\T/ <s[Lc[tTx1e/ɷp.1.bLh8j@hB"f-̹P%ȭ Kf[ t@FkR ) kf;<W~i~դ/yE2lm-Fh=L:}[R*0ʠ67=ɀ.ƨj{L#ucmk(Mr=+=yǹ(/j7n*UQ cWVRΩJ`MxKB8 u_ͱkP7|zN)+=ߧgeU4]ikV96?86hk;%±*3\ T+Ԗ:ZHVsvbEbFP"|s°{AWlDUA:|7k[zcH^UJ`4G)f TKZmVkʬ?+S Иj)p $fߪ#\V4+J~Oz.mY~CJvHj@~kx:XP s0FJyߠ- K֔mS|B}|L;Hq*Ɠ4\y9J$gcg?|{BTz(5pR.TrbףArQTI Ey~zBQTRr~;5-<0 &>%Li#{bQ>z;nT) 01SӨB`cFZ~n8OcRy ߨ"Bgω[HW+7dϭbQ bDvԄ4TC+sHkKɄ9![V-!Q(Gm u?݀&EйF;d<ӽr?[e2wAT" uoF^˟&O2KҦ)BK^ZaYwYS9.$"ܯʯ5-ϗoَy+" 5kmZs߹dטjaQMfEc;ܶ]s!>l=ެyUsgssQx; U[#˔̅TBbO Su5S%B:+4hUwBNDL B{|sA0 4M *X/ wRazP(M~U_|"<;o2tV}'ƌ8Yyyqs?\Rq>HIIтG8v8 (mܹN;>RN^ s41 YwH0PE/luA2&*1o":ɩԽY| D+h7־ D;_gր",<<01b2\0J>C5eiNfW0n7OCeJUMVx (iX/J5(yVm3m7)luEa.M-\SN W5B4m|*fs>}\FvADq1 -m34yQ45c:?@R&ZZ]a|3yHR2t f/1 OȒe3\[ѪX$\ [&ˈiaj5(YER {Vs7㭲44sBQ~fgG^S஄5Ui.õ+Ƒ+G+MLBoWQ׹SKٳvY1 zD_驕֬} / 䯦{ Ig71SWslFYMq7K Ii/]چc*^N]xJ%=Xicve r~I߫e+ݝUqotTXR\P!hL&VwY Yr!~h,b0h BR;mЄ';#;7_B> hPc%:2Ip}5h1Mw\"eXׂ71#?^_-+g\~ LM!ivd)'䀹FC\fHoOֱ ,fJ5A"|RAtXac,g̕𨯉*$|bg3o {A>p]9U!JY@-}Ư֧WnS :yF%ib['~(  D1kѫť,XF,kOq#LW7Ȳ}i(bu6LUL\0Ds?Pt0ꥐYl8ӲBγHy CqW2ڹFh$XK\[Z8yzF{%cΒzI$ov>b6'~p?1 'Uɚn7AEI:~6^a7yu!ϮT"{JUQS$V"L_z7I9<Ɂ5V{am1 chYb{)^Q*!LdF_= cܠ(f2P xf.BĥRQ\h[j1"q#sn^rj+W8\jߟg#^}-+|_ |wF# mǴT`Ϗ dSPTji8z3!)83LFw4g,Hh M :w2=eN0 @W{!syu}o)B'{D:?X7H*,^/敱8 Ҵ':א+[QXy;Ȑr_PP{azT֠h ZI `d=הX۸ c+6KL1La!x9n*tƐ  .XvjMGE~[,@!͚ud֪[($Ա jD-+dP8Z :rcD#^)!ÃnCM ԷA/b7 ?F%a|?u1#5^U1TM ;IʃwK#$&͖[_=xn1i7l3D$wעJ\=һhtM GqȤ:_뉭9 !"0eρ$C[vћg1}e?h Q)Pt^]iDl:B V5~htݐWlçP;OCZL/K՚~tvN5o⧱v1|O v?j(2nq:6r\W \?Q?5<B+<H=W\a7)`._s^zhW#cq y}q9e=t]1UA Q0bбT~A*.P 쮎1~Ό:O[cE1|7,y X7I0~i G2QnnRoq@8i/ /}bE*Ph4@vkh1ۢ`ʋ ')"bb*:͗n(Ӕ|Bm |,4uAģojLiNA3]DakBuUZ5qR4{ux̄=8GW n8,pl-I2ULLsdmd99 it32<<=Q=>?@ABBCDDEXEEFEFGHIHJJKJKK]LLMMNMMNNOPQRcQRSTUVWhWXXYXYZ[[m\\]]<=P>?@ABCDDWEFFGGHHIIHIIJJKK^LLMNOPOPQcSRSTSTUVhWYYXXYZYYZ[k[];;<=P=>?@ABCCDXDEFGHIJJ]LMNOOPOPQQcRSRSSTUVgWVWXWYXYZk\\]::;<P==>>?@ABCCDWEDEFGHIK]KLLMLMNOPOOPQbQRRQRSTUVgWYXYZYZ[k\[\]^]^9;<;<P==>?@A@ABCBCWDEFGHHIJ[JKLMLMNOOPOPPQaQRSTUUVVgWXYZk\[\\]^99:;=>?@ABCVCDEFGHGHHI \KKJKLLMMNNMNOPcQPQRQRSTUUVgVVWVWXYXYXYZk[Z\Z[\]89;?@BVCDEDDEFGFHI\JJKMLLMNMNNPOPPbPQRSTUUVfVWVWX YXZZYYZZjZ[\\]89::;??@ABUCCDDEFGHGHHII[IKKJKLMLLMNNMMNNObPQQRSTSTVfUVWXWYXYZZjZ[\\]7789:;O;<=>??@ ABBUBBCCDDEFFGHFGH[IIJKLLM NMMNONObPQPQRSSRSSTUfUVWXYZYZYjZ[Z[]789:9;O<=>? @?@@AABUBBCDEFFGGFH[HIIJKJKL MLMNMMNNO_OPPQRRSRTSSTfVWXYZjZ[\[[\]677899:;O;;<=>>?@ABTBBCDEDEEFEEFFHHGH[HIJKLLMNO_OPQRRSRSSTeUVWXXYXYZiYZ[\[Z\]]678789;:N;;<;<=?@?@AUBCD EEFEFGFFH[HHIIJKKLLMMNMMNN_OPOPQRS TTeTUVVUUVWXYjYZ\[\67789::N:;<==>??@TBCDEDEEF GHZHHIHIIKJKMMLMN`ONPQPQRRQSTTeTVWXYXjYZYZ\]6789N:;;<;<=>?>??@@SABCCDCDDEFGYGHHGHIHIKL`NNOPQRSTeTVTUVWXiYYZ [[\\IIKJJKKLMMWNONOPOPQRS]SSTUVXXWXYbYZ[YY[^bfkpsvxxvrkbeZ[^abcdcddmefghhghiiqjjijijkjkkllk56789M:9:;<<=?S@@A(BBCCBCDEFGFB?=CBGMSY_elrx~~iWIHLPQRSQSSdTUVWXiYZ[56789M99:;<=>?R?@AB)EFD=3..16;AFLRW]djpv||YIINQQPQRSdSSTUUVWVWhYZ[[5678M99::;<;<<=<=>?R?@.ABBED8R@??@@ADA4!%*/4:?EJPV]ciov}ʖ_GLQPQRcRSSTSTTU VUVVWVVWWhXYZ5 6767788L889::;<=>R?3@BA/ $).38>CJPV\biov}ޢ`HNQcSTVUV WVWWhWXXYXXYZZ5667L89::;;R>>@B3 "',27=BFLRX_gmt|THPQQcSRSTUVUVWhWXXYZZ45677K89;:;<=?Q>A; !&*-17AQ\jwILQcQRRSTUUTVWWhWXYZY45667K89: ;;<;<=<=R?) +>TmbGcQSRSSTUUVhWXXYXY45 6767K7788989:;<?M #Bb{ZORQRSRSTUVUVgWXWXY334566K7899:;<%/e _ISTUUVVgVVWXXY345I789;=&biHSRSTSTUUVgVWXYX23345445I566789;;Qz}z|}sGRQSRSTVTgVVWWVWYXX1233445I566789:92lyvwxz|}}HSRRSRSTfVWXXYY12345I567899 Jssqsuwxz|}؆}GRQSSRSTTUfTUUVW XX2122343445I56778879:%[qlnpqsuwxz|}tHQRRQRSTTSTTeUVWX1244345I56676778:(/fjhjlnpqsuwxz|~hJRSTeTUVVWVVW1234I56677;#3e'fhjlnpqsuwz~XMRSQRSTSeTUTUTVW011212334454I569-/5b`acefhjlnpqvz}}~IPQRSRRSdTTUTVWWE FFGFGGHHGHISIKG13^\]_acefhjkpwyz{|}~Ycdmefeeghh012334I4573-ZWY[]_acefhpvxxyz{|}~qJRSSRSdT UVUVVWWV001234I4458#5&VUUWY[]_abgptuvwxyz{|}~ TNQQRSRSdSTUUV01212334I445608NRRTUWY[]^epsstuvwxyz{|}~GQSdSTTSTUUVW01101 2233G344547:AONPRTUWYZbopqrstuvwxyz{|}~΄lJQRSdSTUV//0010012G47);0LJLNPRTUVamljlqrstuvwxyz{|}~KOQRdRSTUUVV//012G23355=HFHJLNPRS\kj{morstuvwxyz{|}~HQRcSTU./0122G2346%? >EEFHJLNOXhhyƥqorstuvwxyz{|}~Ą NOPQQcRQSSTTSTUUV..//012F2234 @,CACEFHJKQehd˭rnrstuvwxyz{|}~GPPQbRSST.//01F224&>>?ACEFHJ_gfd|.ʭrnrstuvwxyz{|}~ LPPQbQRRSRRST.-./0101F114C/<<>?ACEEWeeffeʭrnrstuvwxyz{|}~փwIPPbPQRSST-.//0//00101F13*D98:<>?ABLbccefeiʭrnrstuvwxyz{|}~ GPPbPQQRSRSTT,-../01E14E)778:<>?AZaabcefdjʭrnrstuvwxyz{|}~݃^LPbPQRSSRSSTT,-././0E20 33578:<X^^``abcefdjʬqprstuvwxyz{|}~IPbPQRS,,-./0E3H)0023577H]\]^``abcefdj˞lqrstuvwxyz{|}~̃bJaOPQQRS,-,-../0D1 I.-/02358S[[\]^``abcefdjƾxnqrstuvwxyz{|}~F`OPQQRRSRS+,--./0F(I,,-/022?YYZ[\]^``abcefdj{lpqrstuvwxyz{|}~E`OOPQQRRQS++,-./.0G K!**,-/00JXXYZ[\]^``abcefdilnopqrstuvwxyz{|}~ڃO^OPQR+,--.././GK%()*,-.4RWWXYZ[\]^``abcefecpwjklnopqrstuvwxyz{|}~gZNNOPPQPQR@ABCDCPK &&')*,,:VUVWXYZ[\]^``abceffefikllnopqrstuvwxyz{|}~a_`abacbcc+,-,--.//?L%%&')**BUTUVWXYZ[\]^``abceffgijkllnopqrstuvwxyz{|}~WMNOPQPQQ*+,-./;L$$%&')*ITSTUVWXYZ[\]^``abceffgijkllnopqrstuvwxyz{|}~ރWMMNNONPQPQ**+,--/4M""$%&&-MRRSTUVWXYZ[\]^``abceffgijkllnopqrstuvwxyz{|}~Ƀ[MNOPQQ*+,--/)M !"$%$0PPQRSTUVWXYZ[\]^``abceffgijkllnopqrstuvwxyz{|}~gJMMNOP**+*+,/O  !"$#4POPQRSTUVWXYZ[\]^``abceffgijkllnopqrstuvwxyz{|}~rGLMNOONP*+,-.P  !""8ONOPQRSTUVWXYZ[\]^``abceffgijkllnopqrstuvwxyz{|}~{FLMNPPOP*++,/V ! :NMNOPQRSTUVWXYZ[\]^``abceffgijkllnopqrstuvwxyz{|}~DLLMMNO*++,++,.V FEFGHIJJKLMNOPQRSTUVWXYZ[\]^``abceffgijkllnopqrstuvwxyz{|}~ЃRHHI JIJKLLKM('()()+:M6FEEFGHIJJKLMNOPQRSTUVWXYZ[\]^``abceffgijkllnopqrstuvwxyz{|}~QHHIHIIJJKKLLM'()*> M,EDEEFGHIJJKLMNOPQRSTUVWXYZ[\]^``abceffgijkllnopqrstuvwxyz{|}~QHIJK=>=>?ML"BCDEEFGHIJJKLMNOPQRSTUVWXYZ[\]^``abceffgijkllnopqrstuvwxyz{|}~}\Z[\\]\]]'()()AJ9DCDEEFGHIJJKLMNOPQRSTUVWXYZ[\]^``abceffgijkllnopqrstuvwxyz{|}~ƃTUGHGHIIJJIJK'()@ @+CBCDEEFGHIJJKLMNOPQRSTUVWXYZ[\]^``abceffgijkllnopqrstuvwxyz{|}~?XGHGHIJK&'()?' K>BBCDEEFGHIJJKLMNOPQRSTUVWXYZ[\]^``abceffgijkllnopqrstuvwxyz{|}~~} + I2BABCDEEFGHIJJKLMNOPQRSTUVWXYZ[\]^``abceffgijkllnopqrstuvwxyz{|}{|}m>XFFGHI&&'()>+I!?AABCDEEFGHIJJKLMNOPQRSTUVWXYZ[\]^``abceffgijkllnopqrstuvwxyz{{xz|}ڃJCXFGHI&&'&&'(=*% H3A@ABCDEEFGHIJJKLMNOPQRSTUVWXYZ[\]^``abceffgijkllnopqrstuvwxyzvwxz|}}:EXEFGHHI%&'(>)* G!>@@ABCDEEFGHIJJKLMNOPQRSTUVWXYZ[\]^``abceffgijkllnopqrstuvwyvsuwxz|}wl=DWEEFGHI&'&'(>(+F.B@@ABCDEEFGHIJJKLMNOPQRSTUVWXYZ[\]^``abceffgijkllnopqrstuvvqqsuwxzzCBCVEDEEFGGH%%&'(>()&9@?ABCDEEFGHIJJKLMNOPQRSTUVWXYZ[\]^``abceffgijkllnopqrstupnpqsuwyr8CCVDEFGH&%&'(>((+D#??@@ABCDEEFGHIJJKLMNOPQRSTUVWXYZ[\]^``abceffgijkllnopqrspjlnpqsut~O>CCVCDEFGH%&'&'(=(()%B*@?@@ABCDEEFGHIJJKLMNOPQRSTUVWXYZ[\]^``abceffgijkllnoprqghjlnpqsl7BBCVCDEFG%&'=(* A2A?@@ABCDEEFGHIJJKLMNOPQRSTUVWXYZ[\]^``abceffgijkllnopfdfhjlnpl U>?@S@ABBCBCCDEDEE:;F;<=@'9A,BCDEEFGHIJJKLMNOPQRSTUVWXYZ\^]SFDFHJLNPRTTNcJQQPQRRSR]STTUVW##$%<&'(( 0):BCBCDEEFGHIJJKLMNOPQRSTUVWY[ZPD>@CEFHJLNPPLt1=>?S@@A@BCD#$%$%;&')$(7AD$EEFGHIJJKLMNOPQRSUWWTJ>9;>?ACEFHJLIH2;<=?>>??R@ABCDD##$##$%<&') *!.9AFGGHHIJJKLMNPQRSSOH>6368:<>?ACEFHAX49<=>>??R?@A@BCBCD##$##$%;%&')   '07=BDGIHD@:4/-.13578:<>?ACC>R@AABABBCC"#$%%;%&'* "%'()()'$%')+-/023578:<>?;>:6;<=>R? @@A@AABBCC"#$%$;%&') !#%&')*,-/023578:92X85;:;<=>Q>??@AABC#$;%&&'&&')! !"$%&')*,-/02354.B359:;;<=Q>=?@AABB"#$;%&%&&')#   !"$%&')*,-/0.)=/589::;<==Q=>>??@AAB""#$:$$%&'&&''(%% !"$%&')*(%(B~u.68989::;<<==P=>??@AAB"#"#$#$$;%$%&'()"   !"#! $;`f+789;<P==>?@@AA!"#$:$$%$%&'(A   !  2Jn8C77899;;:;<P<=??@?@A"#$:$%$%&'=)'7 "',121-)$ !$-;Ng^+3J66789:;>?@@A"#""#9$%&E''&'='(*!  #(-28>EKNORUX^cmuۂ6,55I5767789;?@@"!"#""#9$%%$%%&%%&''<'4*)   %).38>CIOV]cjqw}ٓD*35I567789:;O<=<=>??@!!"#$9$$#$%&'='4((*) "&*/4:?DJOU\agntzʍG*0545I56789:;O<=>?!"#:#$$#$$%$$%%&%%&='(,*)"#'+15:@EKPV\bgntzήu?*/45I567667789:9;O;;<==>?!"!" #""##9#$##$%&<'()**'# !$(-16;@FKQW\bhnsyT0).2345455I567899:O;<==>?!"#9#$#$%&<'(%)**((*-27=CHMRX]bhnsynM4(+012345I567899::O:;;<=>? !"9#$##$%&<&'()**+>3:AGOU\dkqwy~~zlZZ9+)*.101223455I56789N;<=<>6788778C9:9:;<;F<=>>==>?K?>?ADGJNOQSQPNJC?>>JADDE FFEFFGHGGHISIJKLMMWNMOPPOPQ !""!"8"#$%%$$%&%;&'(()(()?*)*)()*+,--.D/012234I45676778 99M::;;<;;<==!"8"#$%&;&'()?*+,-C/012334I4567789M9:;:;<= !"!!"8"#$##$%;%&'()?))*+*+,-C../01233G44545678M9;< !"!""8"#$%$%;%%&'()?))*+,+,-B../01223G434456678L9:;< ! !8"#"#$%;%&%&'(?)*+,+,B-../012G3344567788L889;;:;;< !""8"#$%;%&'(?)*+,,-B-./0122G33454567K89899:;:;<< !"7"#""#$;%&%&'&''(>(()*)*+,B-./.00/01212F224567K89:;:;< ! !"!7"#$:$%&'(>)()*+,+,,A-./-/0/01F2233434567K899:; !7!"#$:$$%&'(''>(()()*+ ,A,,--.././/0101F2345456K789: ! !! !7!!"#$:$%&'&&'=()*+A,--./0/01F124566K7789: !7!"#$$:%%$%&&%&'>()*++,@,-./011F1123456J76789 !7!""!"#$#$$:$%&'&&'='()*+@+,,--,-./011E1223456K6678 ! 7!"!"#$#:$%$%&&%&''<'()()*++@++,-.//0E12232345I567<=>Q>?@BABCDEXEFGH IIJKJJKK^LLMNNPOPQcQSTUVUUVWhWXYZ[Zl[\]]<=Q>?@AABBCBCDXEEFHGHIIJIJKK]LMMNOOPOPQcQQSTTUVgWXXYZYZ\[k\]];;<;<=Q=>>?@BBABCDDWEFGHIHIJ]KLMMNMNPOOPQbRSSRSTUVUUVgWXYZ[[k\]\\]9:;;<<;<P=>?=>?@AABC WDDEEFEFFGGHIK]KKLMLMMNOPQQPbQRSTUVUVhVWXYZk[\]9:;< O<=>>?>??@?@AABC WDDEEFEEFFGHGHI]KKLLKMNOPbPQRSTSTUUVgVWWXXWYXY ZYYZ[kZ[\]\]99:;<P<= >?>?@@?@@AABCVCDDEFFGHFGGHHI[JJKMNOPbPQQRSTTSTTUVgVVWXYYXYZYYZkZZ\[[]^989:;<;>?@@ABVCDEFHGHI[JJKLMMNOPOPPbQRSTUfVWXYXYZYZkZZ[Z\]7899:;O<=>??@ABUCCDCDEFHI[IJJKLMNObPQRSTUfVWYWYXYZZjZ\[\]789:;O<=>?@AABBUC DDEDEFEFFGGH[IJJKKMNMNNPObPQQRRQRSTTUTUfVWWVWXYZkZ[[\]778788989::;O<=>?@AUBBCDEFFG HH[HIIJKJKLMLMNMNOaPQRSTUfUUVWVWXYiZ\]\]789;;O<;<==>?>?@BAUBCCDEFEGGFHH[HIJKKMLLMMN aPOPPQPQQRRQRSTTeTUVWYXYjYZ[Z[\\]]667889:;:N;<==>>?@TBCCDEFGH[HIHIIJKLLMLMN`OOPQPQQRRQS TSSTeUUVUUVWXYXYYjYZ [[\\]\\667787899::O;<=>?@@SABCDDEFFGH[HHIHIIKKJKKLKMNN`OOPQR SSTTeTUTUUVWXXWXYjYZ [\[\\]56767789M:;<=<=>?@S@BBABBCDDEFGZDA@?@@ACDEIL`NOPQSRQSdSTUVVWVWXXYjYYZYZ[\\IIJIJKLMMWNONOPOQRRSS]STTUVVWWVWXXWRPO_i}̀xdaWX]aababcabbcdmdefghghi qjjiijijkkjk566767899M9:;:;;<==>??@S@@AABC DC=;Da Οy[FFLOPQRRSdSSTUVUVWXXhYZYZ[[\567878M9;<==>>?R?@@ABCB=9Ck Ŏ^FHNPQPQSRRSdSTUVTVWjXYZYYZYZZ[[56677878L9:;<=>>?R??@@ABBA9<]케UFLPPQRSdSSTUVUVWVWWXiXYZYZ[5678778L89:;:;;<=>>R?@8?r`GLQRRdRSTUVWVWhXXYXYZ45 66567788L89;:;<= >>R??@@8Q>?;5eȫTGPQQcSTUVVUVWhWWXWYZ445 77677K889899:;<;<==Q>4J¼܀JLQcRSTSUUTUVWWhWXYZZ45545677L899::;<=L6 ؽaGbQRRSTSTUUVUVhWXXYXY34566J7899::;<4Vض ~ZORSTUVUUVVgVWXY34566K77899:;:;1`ۉޯOLRRS TTSTTUUTUUVgVVWXXY23445456J78 99::;:;93Ӝ}{]KRSRSTUTUUVgVWXYXXYY2245J667789;73Քwx dIRSTVfVVWVWXYX2234345J5678965ssz|}lIRQQSTSTTUfVWXXY1223345I5678788994:yktwxz|}tJQRSSTUgVWXYXX12345I566788957 hlrsuwxz|}pJQRSTeTUVWXX123345I5 667787862%{alnpqsuwxz|}iKQRSTeUVUUVWXX12345I566776.(eahjlnpqsuwxz|~ͷ_LQRRQRSTTeTUTVWVW12234I57,+Y`efhjlnpqsuwz~ƧUOSQRSTeTTUVUUVW0123454I566-[/T]acefhjlnpqvz}}~ÿMPQQRRSTeTTUVUVWEFHIISIFQۅ1OZ]_acefhjkpwyz{|}~ÿ~^bbccdmeffghh001234I454.3MVY[]_acefhpvxxyz{|}~ľ`MQQRSRSSdTUVUVW012344H45)|5JRUWY[]_abgptuvwxyz{|}~RPQQRQSSdTUV/012 34I454550F8MMRTUWY[]^epsstuvwxyz{|}~rMPQQRdSTUUVTUVV/0123G34545+:`FNPRTUWYZbopqrstuvwxyz{|}~ ZNQQRdSTUTVUV0//01 223G3445,b<?ACEEWeeffeʭrnrstuvwxyz{|}~uspnjheTOPQbQQRSRSTTSTT-../01F1+QD.8:<>?ABLbccefeiʭrnrstuvwxyz{|}~ rljgdb`XOPPbQRRSRST,--../01E1&E^-78:<>?AZaabcefdjʭrnrstuvwxyz{|}~ydda^\YWPbQRRS TT,,--.././0E.5ۃ +2578:<X^^``abcefdjʬqprstuvwxyz{|}~ eUTRPNKKOObOPQRQQS,,- ..//0/00E%H?*023577H]\]^``abcefdj˞lqrstuvwxyz{|}~vMNLJHFEMOaPPQPPQQRRQS+,-./C/ӃI"-/02358S[[\]^``abcefdjƾxnqrstuvwxyz{|}~ KGFDB@>IO`OPQRS,-.././/>PIz ,-/022?YYZ[\]^``abcefdj{lpqrstuvwxyz{|}~Q>@><:8@O`PPOPQRS,-.//;vKL!*,-/00JXXYZ[\]^``abcefdilnopqrstuvwxyz{|}~ _7:87537M`NNOPQRQ+,--.././:K-$)*,-.4RWWXYZ[\]^``abcefecpwjklnopqrstuvwxyz{|}~ s0421/./I`NOOPQRR@ABCDCKՃK&')*,,:VUVWXYZ[\]^``abceffefikllnopqrstuvwxyz{|}~ 0-,+*)%Ok_``abcc+,-.*TL%&')**BUTUVWXYZ[\]^``abceffgijkllnopqrstuvwxyz{|}~ 9%'&%$!9aNOOPQ*+,+,--%iMP$%&')*ITSTUVWXYZ[\]^``abceffgijkllnopqrstuvwxyz{|}~ I"! .aMNOPQQ*+,--#}M2"$%&&-MRRSTUVWXYZ[\]^``abceffgijkllnopqrstuvwxyz{|}~ `%`MMNOOPOOPQQ*+,-"M!"$%$0PPQRSTUVWXYZ[\]^``abceffgijkllnopqrstuvwxyz{|}~ t\MNOP**+,#O !"$#4POPQRSTUVWXYZ[\]^``abceffgijkllnopqrstuvwxyz{|}~WNMMNOOPOPP*+,#P !""8ONOPQRSTUVWXYZ[\]^``abceffgijkllnopqrstuvwxyz{|}~   SOMNOPP*)*+,"W| ! :NMNOPQRSTUVWXYZ[\]^``abceffgijkllnopqrstuvwxyz{|}~  OOMNOONOP))*++*+,"ăWm FEFGHIJJKLMNOPQRSTUVWXYZ[\]^``abceffgijkllnopqrstuvwxyz{|}~?^HHIJKKMLLM())* $[YM6FEEFGHIJJKLMNOPQRSTUVWXYZ[\]^``abceffgijkllnopqrstuvwxyz{|}~  ]HIJKLM''() **'EM,EDEEFGHIJJKLMNOPQRSTUVWXYZ[\]^``abceffgijkllnopqrstuvwxyz{|}~ ,]HIJKKL<=>??>>?BL"BCDEEFGHIJJKLMNOPQRSTUVWXYZ[\]^``abceffgijkllnopqrstuvwxyz{|}~gEfYZ[[Z[\]'() 6-J9DCDEEFGHIJJKLMNOPQRSTUVWXYZ[\]^``abceffgijkllnopqrstuvwxyz{|}~F@ZGHHGHHIJK'()())7VK@+CBCDEEFGHIJJKLMNOPQRSTUVWXYZ[\]^``abceffgijkllnopqrstuvwxyz{|}~$IXGHIJIK&'( ));5wK>BBCDEEFGHIJJKLMNOPQRSTUVWXYZ[\]^``abceffgijkllnopqrstuvwxyz{|}~~}{ &IXFGHHIJ&&'( ))>"ХI2BABCDEEFGHIJJKLMNOPQRSTUVWXYZ[\]^``abceffgijkllnopqrstuvwxyz{|}{|}Y6HXFFGHIIJ&''('( >!h@I!?AABCDEEFGHIJJKLMNOPQRSTUVWXYZ[\]^``abceffgijkllnopqrstuvwxyz{{xz|}( CFXEFFGHI&'( >$<¿sH3A@ABCDEEFGHIJJKLMNOPQRSTUVWXYZ[\]^``abceffgijkllnopqrstuvwxyzvwxz|}rHEXEFGHIHI&'( >(#Ⱦ#G!>@@ABCDEEFGHIJJKLMNOPQRSTUVWXYZ[\]^``abceffgijkllnopqrstuvwyvsuwxz|}E4GEXEFGGHIIH%&'( >("XYF.B@@ABCDEEFGHIJJKLMNOPQRSTUVWXYZ[\]^``abceffgijkllnopqrstuvvqqsuwxz~wC WDDFFEFGHGH&'&'(>(&/9@?ABCDEEFGHIJJKLMNOPQRSTUVWXYZ[\]^``abceffgijkllnopqrstupnpqsuwxH'FCCWEDEFFGHH%&''&'(=((!hPD#??@@ABCDEEFGHIJJKLMNOPQRSTUVWXYZ[\]^``abceffgijkllnopqrspjlnpqsuyt=DCCVDDEFGHH%%&%&'=((%4#B*@?@@ABCDEEFGHIJJKLMNOPQRSTUVWXYZ[\]^``abceffgijkllnoprqghjlnpqs}= EBCCVCCDEEFEFGG%&'='((!hYA2A?@@ABCDEEFGHIJJKLMNOPQRSTUVWXYZ[\]^``abceffgijkllnopfdfhjlnpuc9CBVCCDEFH%&'='((%34@4A?@@ABCDEEFGHIJJKLMNOPQRSTUVWXYZ[\]^``abceffgijklmnd`cefhjlot CABUBCCDEDEFH$%&&%&'=' ("\k!>6A?@@ABCDEEFGHIJJKLMNOPQRSTUVWXYZ[\]^``abceffgijkma\_acefhjr=:A@@ABUBCDDEF%$$%&'<' &,|~zvwO=6A?@@ABCDEEFGHIJJKLMNOPQRSTUVWXYZ[\]^``abceffgij^X[]_acefmV%C@BBUBCDEDEFF$$%&&%&<' ('"F|ytpmk:;3A?@@ABCDEEFGHIJJKLMNOPQRSTUVWXYZ[\]^``abcefgg[TWY[]_ach` ?@?@@ABUBCDDEF$%$$%&<' %`wsokge\&.@2ABCDEEFGHIJJKLMNOPQRSTUVWXYZ[\]^``abcfbUQTUWY[]_bh&2A??@TBCDE$%&<&&' (%0mtmjfa][L 7&?@SAABCCDEE$%$%&&<&'&' ($?@@S@ABCCDE99:;F<= :Re_[WSNJH9'9A+BCDEEFGHIJJKLMNOPQRSTUVWXYZ\^]SFDFHJLNPRTV\6 GRQQPRS]STUTUVVW##$%%$%;&' &'N]VRNJEA?2/):BCBCDEEFGHIJJKLMNOPQRSTUVWY[ZPD>@CEFHJLNPSX0+?<=>?S@BCDE$#$%$%;&' %,NSMIEA=84,(7AD$EEFGHIJJKLMNOPQRSUWWTJ>9;>?ACEFHJLPT* ?<==>??R@BCD#$%$%;&' %.JJEA=83/,%*!.9AFGGHHIJJKLMNPQRSSOH>6368:<>?ACEFHMG><=<==?R@?@@ABC#$%%;&%&' %/DB=83/+'#  '07=BDGIHD@:4/-.13578:<>?ACFJ: ;<;<;<<=<=>=>R@?@BC#$#$%%;%%&'%.<840,(# "%'()()'$%')+-/023578:<>?CE&:;<=>Q>@@?@@ABC"#$%$%;%&'&,30,($  !#%&')*,-/023578:=B79;9:;<=Q>?@@AB"#$%;%&'),)%!   !"$%&')*,-/02358;8::9:;<<=Q>??@?@ABB""#$%:$%&'&'(&!   !"$%&')*,-/0362 :989:;<=P>?@@ABB"#$:$%&''(''"  !"$%&')*-/1+&:89:;:;<P=>?@??@@ABA"#$$:$%&' ((-   !"$&()*&@:778989::;<P=?>?@AB@!"#$:$$%&%%&'?$    "##  5L677899:;<O=>?@"#$:$$%%$%&'&'=(' *86J667789:;<;>?@"#"#$:$%&%%&'='(*#5755I56789;>?>?@!!"#"#$9$%$%&'&'=')) 085I566789;::;;O<==>?!"#9$%&''='(*) .75445I5567678 9:9::;O;<<=<=>??!!""!"#:#$%$%&%&<'('((*) .543455I556789:O<=>??!"!"#9#$%&<&'(**% &243223455I566789;:N;;<=<=>>?>!"#"#9#$%&<'(*$ &/332123345I5789N;<==>>!"#"9#$%&&<&'())*+,)#-  5+21012343445I5676778 99899N;:;;<=?7878C9:9:;<?>?@MA>;986 99;>AEFFQEDEFHHISHI KKJLKLLMLMMWNPQPQ!""!"8"#$%&%<&'()?*++,--. --..D/0//0012124334I45677899M9:;<<= !"!"8"#$%;&'()()?**)*+,- .C.//0/00110124I45678M99:;:;;<= ! !"8#"#$%;%&'()?)*+,-C./0/012233H456678M9::9;<= !"!""8"#$%;%%&'&'())((>)*+,+,--C.-/012H344567 8L889::9:;;< !""8"#$%$%;%&'(''()>)*+, --B-.//.//001212H4344566577878L8899::;:;< ! !"8"#"#$%;%%&'(>)*+*+,B--.-./012G3345657L889::;;<;< !8"#$%$;%&%&'(>)*+,B,--.//01F233456767L89:; !"!8"#$:%&'((>()*+,,A,,-./012F22334567K789:9;; !8"##""#$;$%&'((=(()* +*++,+,,A-,-/001F122343456K77889::; !7!!"#""#$:$%&%&'(=()*+A,-./-/011F12454567J7789899 !! !7!"#$$:$$%$%&'=()*+A+,-,--./01F234566J789 ! !! !7!"#$#:$%&'=('() **+**++@++,-./010E11221345I788 ! !!7!"#:$%%$%&'=()()*+@,+,-./0E1223345I667<==Q>?@BCCDCCEXEEFGHGHHIJKJKK^LMMNONOOPQPPQcRRSSTSSTTUVUTUVWWhWWYXYZ[Z\[l]<;<==P>>?@@ABCDDXEFFGHHIJK^LLMNOOPQdRQRSTUVhWXYWYZ[[l];<Q>=>>??@ABCDXEFGFHHIHIJIK]KLLMNOOPQQcQRSRSTUVhVWWXXWXYZ[[k[\\]9:;<P==>>?@ABBCWEFEFGGHIJJ\KKLMNOOPQcQRRQRSTUVUVVgVWXYZk[\]^^99:;<P=>>?@@ABBCCVDE FFGGHHIHIIJJ[KLLMNOPQbQRRSTSTUUVVgVWXWWXYZYZkZZ\]9;::;;< P<==>?>>??@A@B CVCEECDEEFFGHI[JKKLKKLMNOPbPQQRSRRSTTUVgVVWVWXYZkZZ\]\]899:;:;??@ABCVCDEFEFFGHIHII[JKLMLMNOOP bQPQRQSRSRSTUTTVgVWVWXYZZkZZ\]89:;; ??@?@@ABABBVCDEDEEFGHI[IJKLMLMLMMNOPPbPPQRSRSSTUUfVWXY ZZjZZ[Z[[\]^89;:;;?@ABBUBBCDEFHHGHHI[HIJKLLKLMNOObPQRS TTSTUUfUVVWVWVXXYXYjZYZ[]7889899:;;O<=>>=?@ABBUBBCDEEFEFFGH[IIJJIKLLMN OP`OPPQPQQRSTeUUVWVWXYXYjZZYZ[[Z\\[[]]67789:;O;<=>?@AATBBCDDEFGHZIJJKJKLKLMNON`POPQRQSTeUVWYXYZjYZ [[\]\\]7677899:N;<=>>?>?@?@UABCDEFGZHIJKJKLMNN`PQQPQSRSTeTUUVUVVWXYjYZ\Z\]]567789:N;;<;<=>?@@SABBC DDEEFEFFGFGZHIJKLMN`OOPQRSTeTUVWVWXXWYYiYZ[[Z[\5567899;N;:;;<==>>?@@SABBCBCDEFGYIJKKLNONOPQPPO_NNOPQRRQSTdTTUTUVWVVWXWYjYYZYZ[[]IJKLMMWNONNOPOOQRQR]TUUV)WWXXWX[\]eTME7+# (2AMT]lcca`aabbabcbcdmdefggfghiqjkjkll5677898M9::;<=>?@S@BC DEHIF;/ *;IRPQRSdSTTUTUTUVWWVWXWWhYZ567678789L99::;<<==<==>>??R?@@AABEGD6" 3HRSQPQRSSRdSTUTUVVWVVWXiXXYZ[567789M9;<=>=>?R?@ABBEE9&9MTRQ RSRdSSTSTTUVWXiXYYXYZYZ[576788L89:;<;<=>>R?@@ADC1 +IUSQRcSTVVUVVWhXYXYYZYZ566778L8899:;< ==?>R>??@CA.'IURQRbRSTUVUVVWhXYZ567K899::;<=Q>?@B4+OUQcRRSTUVWhWWXYZ44566768K899::;<=Q>A< 1HT[ddbVR>(;TSQcRSTUVUVWhWYXXYZZ4456677K89:;::;<=Q?, 2VskH&IUbRSTUVWWgWXYZ3454577K77899::9;<>N" -Vt rI ;hRSTUVWgVWXXY3344554576J88789:; <<>6  #UzzG2QSRQRSTUVVgVVWXXY234566J789;:;#=1 +bWITQRSSRSTUUVVgVVWXY234345I789:%;0 &bW FUQRSRRTSSTUTUgVWXXY12345I6789)::91&#  Rz~z|}B AUQRSRSSTSTUgVWX122345I566789'4,)&# 7lyvwxz|}q?ACEFHJ_gfd|.ʭrnrstuvwxyz{|}~w RQPPcQRSRST.--/0P11F12.wE7<>?ACEEWeeffeʭrnrstuvwxyz{|}~=>SPPbQQRST-/0Q11F1-Ck38:<>?ABLbccefeiʭrnrstuvwxyz{|}~SPPbQRST--./R001E1+lH178:<>?AZaabcefdjʭrnrstuvwxyz{|}~3HRPbPPQQRSTT,-.//0/0E03/3578:<X^^``abcefdjʬqprstuvwxyz{|}~RPbPQRQRS,,-/./S00E)x8,023577H]\]^``abcefdj˞lqrstuvwxyz{|}~MEQbOPPQSQRRS,-Y././/0/D/&-/02358S[[\]^``abcefdjƾxnqrstuvwxyz{|}~z5R`PQRS+,-.T/0?G_$,-/022?YYZ[\]^``abcefdj{lpqrstuvwxyz{|}~R_PQPQRRS,,+,-./S=dA$*,-/00JXXYZ[\]^``abcefdilnopqrstuvwxyz{|}~8M`OPQRS+,-.U//<ɩ+%)*,-.4RWWXYZ[\]^``abcefecpwjklnopqrstuvwxyz{|}~^ BbNNOPOPPQR@ABUCCLѐ&')*,,:VUVWXYZ[\]^``abceffefikllnopqrstuvwxyz{|}~{ Cm_`aa`aababc+,-V.+Qj%&')**BUTUVWXYZ[\]^``abceffgijkllnopqrstuvwxyz{|}~)cNOPQ+,-U'bG$%&')*ITSTUVWXYZ[\]^``abceffgijkllnopqrstuvwxyz{|}~1cNOOPQ*+,W--%s/"$%&&-MRRSTUVWXYZ[\]^``abceffgijkllnopqrstuvwxyz{|}~RaNMNMNNOP*+,W--% !"$%$0PPQRSTUVWXYZ[\]^``abceffgijkllnopqrstuvwxyz{|}~m [NMNOOP*+,X-$ !"$#4POPQRSTUVWXYZ[\]^``abceffgijkllnopqrstuvwxyz{|}~}VOMNOOP*+,$Q !""8ONOPQRSTUVWXYZ[\]^``abceffgijkllnopqrstuvwxyz{|}~RNMNOPP)*+,+,,#Wt ! :NMNOPQRSTUVWXYZ[\]^``abceffgijkllnopqrstuvwxyz{|}~NOMNOPO))* +*++,+,,#Wg FEFGHIJJKLMNOPQRSTUVWXYZ[\]^``abceffgijkllnopqrstuvwxyz{|}~Q(]HHIJKLMM'()*$]_V6FEEFGHIJJKLMNOPQRSTUVWXYZ[\]^``abceffgijkllnopqrstuvwxyz{|}~?!$#""1\HIJKLLK''()'Fۃl,EDEEFGHIJJKLMNOPQRSTUVWXYZ[\]^``abceffgijkllnopqrstuvwxyz{|}~5)+)('$:[FHIHIIJIJKKLL=<<=>=>>=>?>AăY"BCDEEFGHIJJKLMNOPQRSTUVWXYZ[\]^``abceffgijkllnopqrstuvwxyz{|}~u/20/.,*OdZ[[Z[]\]^'()())42V9DCDEEFGHIJJKLMNOPQRSTUVWXYZ[\]^``abceffgijkllnopqrstuvwxyz{|}~c6865323DYHGGHIJKJK'()6_U@+CBCDEEFGHIJJKLMNOPQRSTUVWXYZ[\]^``abceffgijkllnopqrstuvwxyz{|}~U=?=;97;GYFFHGHHIHIJJIK'('()):8 U>BBCDEEFGHIJJKLMNOPQRSTUVWXYZ[\]^``abceffgijkllnopqrstuvwxyz{|}~~}OFECA@=AFXFGHIJJ&&'()(>U2BABCDEEFGHIJJKLMNOPQRSTUVWXYZ[\]^``abceffgijkllnopqrstuvwxyz{|}{|}uNNLJHFDDEXFEGHIIJJ&'(>{NS!?AABCDEEFGHIJJKLMNOPQRSTUVWXYZ[\]^``abceffgijkllnopqrstuvwxyz{{xz|}gUUSPNLIEEXFGHI&'(>#C S3A@ABCDEEFGHIJJKLMNOPQRSTUVWXYZ[\]^``abceffgijkllnopqrstuvwxyzvwxz|}~c^\YWTSKCEXEFGHHGHII&'(>)!(T!>@@ABCDEEFGHIJJKLMNOPQRSTUVWXYZ[\]^``abceffgijkllnopqrstuvwyvsuwxz|}vgeb`][XGCEWEEFGHHII&%&'&'((>(m M.B@@ABCDEEFGHIJJKLMNOPQRSTUVWXYZ[\]^``abceffgijkllnopqrstuvvqqsuwxz|}solifdbYCWEFGGHGHH%%&'(=(%1#9@NABCDEEFGHIJJKLMNOPQRSTUVWXYZ[\]^``abceffgijkllnopqrstupnpqsuwxz|yvspmjiQACCVDDEF GGFGHH%%&%&'=(({ S#??@@ABCDEEFGHIJJKLMNOPQRSTUVWXYZ[\]^``abceffgijkllnopqrspjlnpqsuwy}zwsqiEBBCWCDDEFEGFGHH%&'(='(#<,P*@?@@ABCDEEFGHIJJKLMNOPQRSTUVWXYZ[\]^``abceffgijkllnoprqghjlnpqss}zz\?BBCVCDEFFGH%&'='((Q2A?@@ABCDEEFGHIJJKLMNOPQRSTUVWXYZ[\]^``abceffgijkllnopfdfhjlnppxyH@ACCVCCDEFG%&'=''("=U J4A?@@ABCDEEFGHIJJKLMNOPQRSTUVWXYZ[\]^``abceffgijklmnd`cefhjlnndABUBCEDEEF%%$%&=''(($0݄R6A?@@ABCDEEFGHIJJKLMNOPQRSTUVWXYZ[\]^``abceffgij^X[]_acefdxb;@@AABUBBCCDDEF$%&<'(l~ K3A?@@ABCDEEFGHIJJKLMNOPQRSTUVWXYZ[\]^``abcefgg[TWY[]_accl@?@@AABTBCEEDEEFF$%&<' E.@>ABCDEEFGHIJJKLMNOPQRSTUVWXYZ[\]^``abcfbUQTUWY[]_`^ǼS:??@AUBCCEDDE#$%$$%&&<'!<5B&?@TAABCDEE#$%%&%&&;&'e-B4@A@ABCDEEFGHIJJKLMNOPQRSTUVWXYZ[\]_a_RGILNPRTUWXTÿ<;??>?@SABCDCEE9:;@CEFHJLNPPMb5<=>?S@@ABCDE#$%&<&'!;܅8 (7AD/EEFGHIJJKLMNOPQRSUWWTJ>9;>?ACEFHJLIH}5<=>>?R@@A@@BCBCDD#$%;&'L`6!.9AFGGHHIJJKLMNPQRSSOH>6368:<>?ACEFHAWޒ5:<=>?R?@AB CBCBD##$##$%%;%&%&'[  '07=BDGI"HD@:4/-.13578:<>?ACC?>R??@BABC#$#$%;%%&'a; * "%'()()'$%')+-/023578:<>?:>:7;<==>>R>??@ABCCB#$%%;%&'Yz !#%&')*,-/023578:82Zƀ75:;:;;<=<=Q>?@@?@AB"#$:%&'L߇N !"$%&')*,-/02353,B3599:;:;;<==Q>?@AAB"#$#$:%&'@чJ !"$%&')*,-/0,'? 06899:;<Q==?@??@@AAB"#$#$:$%&'2T !"$%&')*&#%Fs.689;<P=>>=>?@?@@ABA""#""#$:$%&'(""ӉH !"#!@qe,789:;<P==>=>??@AA"#$:$%$%&'&''&2Sъ֩pE$<_7D7899:;;<P=>>?@A"#"#$:$%&'&'=,۶cG3*#).?Ww `*3J6767789::; ?>>??@"#$:$#$%&'='$L7,55I6 7787898899::;O<=>?@@!"#"#:$#$%&'=''( !cȩE)35I56678 989:;;:;;P<=?!"#9$%$%&'<'('&gJ)05I566567789::;;O;<=>?!"#""#9##$%&%&'&<'('(&#WхA'.45I566778989;O<=>??!"#"##9#$%$%&<'(' =>?!"!!"#9#$%&<&'(''()$!AnƏ[6&)02345I5678989:N:;;<=>? !"!!"9#$#$%$%&%&&<&&'('())(#,Ix Ƥ}m?'&(.012345I5789M:;<==>=>6789C9:;<;F< ==<==>>=>>? =9A55:JXbirvmg_TD9F@D EEFFGGFGGHISIJKLKLMWNNONNOPQ! !"#8##"#$#$%&%%;&'()@)**'%$#"!""$$&(+-./C/01221224I5789M99;<=<==! !"!"8##"#$%;%&&'&&'()?*+,-.C./0122334H5678M9::;<=! ! !"8#$%$%;%&'())?))*+,-B../01233I45678L9;:;< !"!!""8""#$%%$%;%&'()>))*+,-C.-.//012H457678L899;::;<;<< !"8""#$%;%%&'(>))*+,--B-.././0122G334567878L89:9;< !""!"8"#$%%;%&'(>)*+,--B,-./0122F3345678L89:;< !! !"!8"#$%;%&%&''('('((>)*+,A-././010012G2343457K89:; !7!"#"#$:$%&'(>(()*)*+,A-.././01F234567K89;; ! ! !"7!"#$#$$:%&'(>(()*+,A,-..-/0/01F223433445667K89:; !7!""!"#$:$$%&'(=()*+,A,-./0//011E1233454567K7789: !7!"#$$:$%&'&'='(()*+A,--.//01F11223456J6778989 !!7!"#$##:$%$%&'=()*+@,-/./011E123456J6788 !!7!"##"#:$%$%&'=('())()*+@++,-../0E12244345I677ih32-;<=D>@@ABBHIEFHIIKRLMNOPPVVSTTUVW]WXYYZY__]]%9:<??@AGGCEFFHIPJLMNUTQRSTTU\VWWXYY^][\]]7899;C<==? FFBDEFGHOIKKM SSPQRSTT[VVWX^]Z[\]7889:B;<=>??FFBDEEGHPHHINHNOOQRRSTZUVWWXX]]Y[[]==??@GBCCDEEKJHJKNMJNPV`jtywhUNRWXZ_Z[\\]]bb_``a55678@9:;<#CCAE=/).;JZl}gIKRYSTUUVV[[XYYZ568?89:<$CF: %3EZm~jGVSSTUVV[[WYYZ45-6?899;;=D+!Dd~ULSSTUU[ZWXYY445>7899<;9N{^JSSTTZZVWXY23455<678:88s`gJTSSYYVWWX01234;4587 Outv{bKSRXXTVVW6678:@::>Tjhmt{?UTW\[XZZ[45568?8<% K^]cowz|KUZZWXYZ/02:508TTZhnswz|wHVVSTTU//012:6JJOarrwy|KTURTTU./001:,:BDXdӫqrwy|{MURSTT-./01;;:HacgЫqswz|KTQRSS,-./09 +47S`aafѨotwy|`PPQRS,,-.12 ,-:Y\^aagoqtwy|JPQRR349,))AXX[^abdjknqtwz|MUVWX*++,0%&GUVX[^acfilnqtwy|HMNPP**+,/!%IRSVX[^acfilnqtwy| LLNOP*+.$HOQSVX[^adfilnqtwz|NKMNO))**-!FLNPSVX[^acgilnqtwy|MIMMN()**-BJKNQSVX[^acfilnqtwy|IILMN''(),;IIKNQSVX[^adfilnqtwz|CGJKL--..2'1GGIKNPSVX[^acgilnqtwy|EMNOP++,,/- $DEGIKNQoSVX[^acfilnqtwy|DKLMM&&''(09DEGIKNQSVX[^adfilnqtwz||]DFHHI&&''(3&BBEGIKNPSVX[^acgilnqtwvBHEGHI%&&'(1!3CBEGIKNQSVX[^acfilnrrnro>GEFGH%%&&'/):BBEGIKNQSVX[^adfilnfhfAEGDEFG$%%&'/)!:CBEGIKNPSVX[^achh^^`m}5FFBDEF$%%&&/'*5CDEGIKNQSVX[_c_TTVX7>EEBDDE,,--.5.00 )@@A""##$,$%%&&(+ !,EmM-889;;A@=?@@"##,$$%&S-. '4AJTauq.768899:A@<=?@ !!""*"##$%$+*(( )6EVgxh3)3<467788?>;<=>'(/))*0/,-//.0:BP^ktws`D0.58:@::;=CC@ABC%&&.''($/.*++,,-4-./0/,00/45568?899:;;AA>?@@ !)!""# *)$&&''(1()* +21.//012:3456<<8:;; !!"*""# *)%&&''(1()*+21-/02:345<<8:;< !)!""# *)$%&&'(0())*10,./0019234554;;79: !)!" #")($%%&&'/(()*00,-./018123454::78-;<=E?@@ABBIIEGHHIKRLMNOPPUURSTUVW]WXYYZY__\]%9;;@@AGGDEFGHIPJKMNTTPRSTTU\VWWXYY^]Z\]]7899;C<==?zFFCDEFGHOIJLLMMSSPQRSST[VVWWXY]]Z[]]7889:B;<=>??EFBCEFEBF=?ABCBIMNQQRSTZUVWWXX]]Y[\]=>??@GBCCDEEKJHIE@IdsVLQWYZ_Z[\]bb_``b55678@9:;<<=CC;6VߧkHKSYSTUUVV[[XYZZ5 68?8:;;<788:5<촎&\LSSTTZZVWXY23455<6782?{s} aLSSYYVWWX11234<5539dpw{߾\NRRXWTVVW6678:@:91pZhmt{ɡUUW[[YZ[[45568?9-gQ^cowz|PTZZWXYZ/0012:.FwDTZhnswz|]MVUSTTU/0012:'8JOawrrwy|qOUUSTTU./0014G@=DXdӫqrwy|smUTTRSTT-./01,*;HacgЫqswz|b\TPRST,-.//5@.7S`aafѨotwy|_IGRSPQRS,--.*R"-:Y\^aagoqtwy|i66KTPQQR3344,|)AXX[^abdjknqtwz|y(%BZUWWX*++, [&GUVX[^acfilnqtwy|#0SMOOP*++, <%IRSVX[^acfilnqtwy|$"QMNOP)**+ -$HOQSVX[^adfilnqtwz|$OMMNO)**+ +!FLNPSVX[^acgilnqtwy| NKMMN())*5BJKNQSVX[^acfilnqtwy|NJLMM'(L;IIKNQSVX[^adfilnqtwz| NHJKL--..%ys1GGIKNPSVX[^acgilnqtwy|j(TMNOP++,,(Q$DEGIKNQSVX[^acfilnqtwy| H6QKLMN&&'1׷#9DEGIKNQSVX[^adfilnqtwz|| CKFHHI&&''('zɿO&BBEGIKNPSVX[^acgilnqtwvviLIEGHI%&&'(+?3CBEGIKNQSVX[^acfilnrrnr~.,KHEFGH%%&&'/"wE:BBEGIKNQSVX[^adfilnfhsX @HGDEFG$%%&'/#9q%:CBEGIKNPSVX[^achh^]ff+CFFBDEF$%&&'/'"QvjN5CDEGIKNQSVX[_c_TS[c$A@FFBCDE,,--.4../U[P6);<?AB""##$,$%%&+   9:889;;A@=?@@" #$,$$%%&&--  $7>68899:@@<>?? !"+"#$+*'(!265<456778??;<=>'((0))*#0/,-/0+$ '08988:@::;<==CC@AAC%5&&.&'(()(/.*++,-/80//012:9445567?899:;;AA=?@A !!*!""# *)$&&''(0()*+ 11.//012:3466<<8:;; !!"*""##$#*)%&&''(1(**+ 11-/001293456<<89;< !!)!""# *)$%&&'(0())*10,./0019134554;;79: !)!"%#")($%%&&'/'())**0/,-./018123454::78-;<=E>?@ABBIIEGGIIKRLMNOPPUURSTUVW]WXYYZY__]]%9;;>@AAGGCEFGHIPJLMNTTQRSTTU\VWXXYY^^[]7889;C<==>?@FFBDEFGHOIJKM1SSPQRSTT[VVWWYX^]Y[\]7889:B;<=>??FFBCEEGISMNNPQRWUQHRST[UVWWXX]]Y[[]<>??@GBCCDEEKJHJLOMD;,!!,7889;;)Jyf"KVSTZZVWXY23455=67889/ ;s ] GVS2YYVWWX01234<4568<4''Tttv{" ITRRXXUV6678:@:GI=9Xhhmt{+UXW\[YZ[[45568?86J_TJR[^cowz|$'YTZZWXYY//012:1:lk`NOTZhnswz|>SVVSTTU/0012:.bzYCJOarrwy|fRVUSTTU..0016={>?DXdӫqrwy|-;YTRSTT-./001g]1;HacgЫqswz|uYTPRST,-.//6907S`aafѨotwy|NUPQRS,,-.+KǑ%-:Y\^aagoqtwy|H=VPQQR3445.mt)AXX[^abdjknqtwz|l.]UVWW*++,"Q&GUVX[^acfilnqtwy|TMOPP*++,"8%IRSVX[^acfilnqtwy|RMNOP)**+!,$HOQSVXN[^adfilnqtwz|PMMNO))** +!FLNPSVX[^acgilnqtwy|"NKLNN)*5BJKNQSVX[^acfilnqtwy|#NJKMM''((O;IIKNQSVX[^adfilnqtwz|"+MHJKL--..$~ 1GGIKNPSVX[^acgilnqtwy|mv'$@@A""##$,$%%&'. Ғ]5 !6[ M-889;;AA=?@@" #$,$$%%&&)WĂu.767899:@@<=?? !"*"#$+*"\s4(3<467787??;<=>'+(0))**+*0/,+$#=j¥yK.,59:@::;<==CC@ABB% &'.''(()(/.*+,,)#(#*./,'*,.35567?9:;;AA>?@@ !!*!""#*)$%&''(1(())**11-//012:34-66<<8:;; !!"*""##$#*)%&&'((1))**++11-/0012:345<<89:; !!)!""# ))$%&&'(0())*10,.//019234554;;79: !)!"%#")($%%&&'/'())**00,-./018123454::78il32 ;?@AGEFGHNLMNOURSTTZWXYY^\]]789?<=>?FCDEGMIIJIOOQRSXVVWX]Z[\;<=B@ABCIGIKILOVbjjYLOV[YZ[[`^^_667>;<==EE8(&3JerIRUUVW\YZ[5<99;>@'PqbJTTU[XYY355;88<4 SuITTZWWY134:691+m~wISXVVW678><9 .gjs|dQ\YZ[11299VZiqx|KVUUV/008+ AJ^nx|~MSTT-/09#>Mbȑpx|MQRS,-/3,7Wa^Łqx|eLQR014. )9Y[_`ysotx|KTV+,/"#=VW[_`glptx|DOQ**.>RSW[_dhlptx|BNO)*-:NOSW[_dhlptx|@MN((+2KKOSW[_dhlptx|>KL,-/* 'GHKOSW[_dhlptx|DNO'(),>FHKOSW[_dhlptx|}bCIJ&''/+DEHKOSW[_dhlpuuqCEGH%&&|. 5DEHKOSW[_dhmmhi~=EFF$%%+* 5DFHKOSW[`fd[T;DCDE)**0-*-?GJMQUY[SJD_;IGGI$$%+')*6>BC?93:w1>DABC#*&&)*Vt-;?@!""($$%%-) 3Kc}k026789@<=>&''-))**0-..-5?M[`]F1-6>:;<=C@AB!""($$%%+''().)((&-,012967>;<= '#*& '-))++1./00745#<99; &""##)%%&&,))**0--/062355:88;?@AHEFGHNKMNOTRRTTZWWYY^\]]789?<=??FCDEDF@@BCLNQRSXVVWX]Z[\;<=C@ABCIGA>Orz\KNV[YZ[[`^^_ 667>:<=>@6auIRUUVW\ZZ[556<99;4GǼbKTUU[XYZ355;890T쫊oKTTZWWX134:7.Rtn|kMSXVVW678>7?Wds|-ί]T[YZ[0128*GWiqx|OWUUV/0UHE_nx|ZSRSW[_dhlptx|w)QNO)*h :NOSW[_dhlptx|u$PLN()x} 2KKOSW[_dhlptx|c*NKL--&\ 'GHKOSW[_dhlptx|B7QNP'(&7ȼ>FHKOSW[_dhlptx|BJIJ&''%H+DEHKOSW[_dhlpuu|dKFGH%&&'C{5DEHKOSW[_dhmmju$,KEFG$%%,#dC5DFHKOSW[`fd[h?@FCDE)**0*2^W)-?GJMQUY[SLW@8FIGGI$$%+($0A0*6>BC?:=E.)@=DAB C"##*&&%)" =#)/+(=;?@!""($$%%,) C "5<6789?<=>&&'-))**0-//*%(/7:8>;;<=B@AB!""($$%%+''()1..//62112967>;;= <'#"#$*&&''-)*++1./0064455<99; &""##)%%&&,))**0--/062355:88;?@AHEFGHNLMNOURRSTZWWYY^\]]789?<=>?FCDEGONOQQVRQRSXVVWX]Z[\;<=C@ABCIGJMHA4*+5EPYYW[YZ[[`^^_ 667=;<==ED8  @UYTUVW\Z5<9:;=@! -MbdT5OWSTU[XYY355;88:8!P~k AWSTZWWX134:6694"7l~L@VSXVVW668>:;MCGejs|_NY[YZ[01292ViRRZiqx|OTWUUV/004BqDI^nx|%;YSSU-/0/rW5Mbȑpx|uXRRT,-,944Wa^Łqx|KRQR01,VՕ9Y[_`ysotx|C=XUU+,#oy=VW[_`glptx|d.SOQ*+ e>RSW[_dhlptx|v%RNO))g :NOSW[_dhlptx|v'PMN((z 2KKOSW[_dhlptx|k 4MKL--%a 'GHKOSW[_dhlptx|[$DONO'(%9 >FHKOSW[_dhlptx|~XAJHIJ&''"a +DEHKOSW[_dhlpuuwziWHFGH%&&|$V5DEHKOSW[_dhmminSDEEG$%%+5DFHKOSW[`fd[Y=ECDE)**0'BC?91:i4>DABC#B*&&UR (]n/;?@!""($$% `Cs027789?==>&&'-))**0,"%CqyO/,7>;;<=B@AB!""($$%%+''($$ (+022968>;<= '#)&3'-*)++1./0074455<99; &""##)%%&&,))**1--/062345;88is329>?AFFLPRWXY]]9=?AHHFL[^MQXZ]]6:;A49lxKWZZ37<% KJXX39.Mx|{PX.5%]zNR/-1Ytr}mN-#1VYalt}G+!*NS[dlWt|C+(DLS[dlt|iF%* 0HLS[dngBE&,"1DNV[Ngu=F$(* (,3o2BB"&&) #=_n-:??#' ,*.># '%)(&+-345999>?BFFGEGORWXY]]9>?A?>^vygMPXZ]]6:;2dxMWZZ38-z쬉NXX30]veycUX.*ňIzhQS)K:Utr}NLT"f&UYalt}A7SP dNS[dlt|50P%E$ALS[dlt~]/ENV\]T.HF$(%1 ,35, ABB"& $  (<;??#' ,*'!!+4:8:>># '%+,-0.345999>?AFFMPSUSWXY]]9=?AGHA56GUZXZ]]6:;?6.0@ZWZZ3876"Ki/YXX35AQUv|>[W./tXUzlUS+D9Vtr}CU#_'UYalt}62Sp eNS[dlt|>4P$I$ALS[dlt}KEL$"hHLS[dnm{iDF'"[4 CNVZNf\BF$(|` &3u߃6BB"&&^Ͱo/:??#''("%PqsW0.8:>># '$# (-34599t8mk@ Kϭo,p=Y3E,Wso ZJr(292z<F/{ v4\…3h8mk #:<^"?7Y`B[l8mkH]H\\r^ts8mkt}~DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/DisplayCAL-synthprofile.ico0000644000076500000000000043354412647526530025030 0ustar devwheel00000000000000 ^v (Ԩ@@ (B00 %$   t) h2PNG  IHDR\rf%IDATx}Eo'7H!\L!!!AbATD)D<=ԇOTy P_@Q) @z췳;?mϞ{C gw: c=& > 06*calKkSa*} 3 M!Lɪ)ꁨ#7@yk(*Z(n]`F6(-++@'y'VG}į;_.ա?S6K,\ogz|,"I۽Z]SΎNu& aaVFڟX6aO'$_e#K,.AH1s\\~k\d!"I'D}}=Z[)Ga 8G3(P"72C%HFL?vAh%1y0aT aAA>YШ`h]FG}Q]Օ{:9Q(`@ldc"Ọ:T'+18gHF%kRŌʸ֬1 ysb0x 9f񠸊s㗼(1G>%'pL?IаA!>l|۠$% $@G%ho3VH*(1Lw  #)`:!U⟼"^hZxMвͿ%M1ǥ"QɜK\N1ɿ"^&*jK\WyuKFK`c΋j$rD(V (cqj{,%'\@6|_֮!r%И\\#&j5g*&Xy@h]Ȭ㣮1;V zWƑ!U RFZԫT U@k7 DmR %tKRQu 0Հj^ ]qx>z,}(%ŋ?T@K`VIɎbh^(}u") =D &Vbp2 J(%Zz|]Z$R"]'.HkUN "D %( !X/ꮬNU!&OxXnc=0Q Je80>kD S%/Dci PJEJDH/  I!ŸArpR|mYDvZ%%;"CRvTpMJPŬUF i#OvgAOguU ::'$J4XPĤH~.yQAqخNlZi{Hα_-5 aPtr 0U/^ݸS>o BJAd[*aOd+С -չas2?yQ !H Y+[D6KJ;.!U0YDEKMMUܾ.g V!.S^A 2ѹJ~)+X) @G,aa~Ү\;[6ꪸ}L¥);38n7 9TݝkJj^q=+<xV%]i\ b M@HpYNchnb/%jj8xY$57OIR5ѥDlZi$hJ͋HdzQR7` sjnR&8qC JELX@x\𖸩:1ӗV:D ]ֶ1M EȄK.ZWb2$593֢]B&: @= tlzaqm0WYU,kI)Ѷӟwv':vgۀ+$TlIl ~em@ H$ 6 :D ɘN}%K Utkq iIJ,H%hv5~dub (nwUÂ3w$qF:D#W /HquLېbD ӊpOx]f82"q& N =zDP'~? rY٣N f2"n "*zK$a.TAy\*@\<x4tk, )pc߫(;@*ʨ!F y_RJɴ * J8!pM8"D`Q%o7:Qy!Rqu4R>z_hT1:6$!;' rʷ_P1X/dU<HhKGGDQ S1KHz s|'4Kl-D\0M.7ڄ `3==DBm§=k X뻴k (I@-Tzu D3Ҥ> O! @‰(4G*`D $O+lXw+IuFMVɇH*ohD%٨7Kw !ɑX3@UYsDaAB zidY`'3W0#!p8gpqhMIYP֖6dT$4M@겐Ƌ?4jD !P #DP[PI*F[=L6_~aK]ȒH@E"qFGo@aQMωق8fjڕLȤt;4;1 cRDm?DE&Ҭb"fO-YrOUxx0p%ze,!BD4mAD~(͢ &Vqmlզ]S㞶EX(>sPdM5TuwL@!kOzk(wL|̖Mq$#|c=) pT))׫}c%$Xs@*͋bL&i_2.jsJ-릑,n@m)ޥWBhqX اռ`a+qQ0khf mctCa[ڜ*:x&C]^f@@x!ZCbS^}E`(B6 c7KXi 'Sa'H~lp4\cOl+>Hjk|IG\Dow?3_.Il]N @ Ֆf| zpۛ`a:$@nl˅*Wj>m#je ,8:~_@9",Q Z4ؙ:pV5٥=f˟9$Cu {5n@(.ŚZ)=pqBwU"-aIj,t oAaUJip#`eekcdv$Ż?EMC<VF@j̐Ot9lHaM*n(Nxc G1)OSX LYPuZ$wp M56w Oҭ$ґH x$} kup0T 6v`2]Ic 3IXW|>ݾ&ÃzQhNc]3֥X_ߨD3󄊈?D0DM嗇fP e{Ȩ<hY7,vGT+>E0FJQb^+Mj "HT28'2 b')¥h> HhM~1p\ mPpT4ǴHŬ@^F 6O5༸W\K4|؄ zj h Ux$*&iH[kHǶ6t&MLd5R[(7j2( aFz-i) g&xyo]oVDA0-6!U'((E3f789ˊ D1dA4eDtbl_j%0 d"ஂ>XXm>7 L+./R}3%+"v7"zo)1>&Vidn7<)˰Y#TU/d(fpK\NL=dR@;+ *]W7:zuD:NNv 4qYϋH\/B<)RQM-&"OIl-mN]O})W ;V3(C%<X8F!_5#*t+=)0'c_ꀬpZ0 jb8HTl5AZK՘L!DwzATA @uD:ZgVE ?KX%2xՕz>>Nnz&3Cf-M 굠^MO_D7S\=س`ۄ/"E."ODL@)0=v8t.=۞zX!MHl\seQE48Ej4\ol`Jrn$,f\D:T !YW#%rƒ8Jڽr$ $}RD5Lhd@+tniH˪Ap?㴤zcHi Ciw+"6lÎǞQ8lW:0p"FK m놣=&d_|q>|  m aS^x \H7aq%l-9"ꀪ[eJvJM$ao0!UkwbI)Y[]ن,1sj@c 1,3@x=b)k虺+9+}83|߷`SǶCbе@MAʺ>h@2io@NMRE^ "[2*s) h,*9`ThTRF&Z44b]&" ۈn! ZuN$#!PVa=v&l=ivl=%<\T=u-q.XMSoQپHQ}"I&cERxJefTJ8:ĭIEsMQ=c:reb|WuSSy#!KP}*tb QL"˼J H0.4 -t p/NmWFZYFr \0#,qϼ`P7ԑGzzܻ`ɺ&PnՓ%mܾA@>%,c(K@u>1K~ܽk nYlNEcrG>%c:"KOT%RƤDͭ$HQC[{C-׍yc,^]Ru1E=kџCFf^+ z^Oe⛷@ڱn|@))ĜGBTP tkGEgh>D~6n<ѽk*w 2 TVV9 7TUU&[K>(#gb)%~a$nWA8V#W8C#rs;eDZJ(P3=XkQ]?6,b#_<#N1bi;;CsTl1f\8yTY=,;@?3 ;ZpmR]͖+whjoի!I8Df5bZB;%%%LTrb* lSҜ8Z@ Zwy5K|4 !F`Ze8!^++o`<&ɛx|eX6e2m9biϣ낧~(cp},&˜㐘#_ 0%0GnĀ k0hrxd{@o5 ,Ly)u1i%8@ pKpU&.Ul_.0SIlA,?·*@(@j FZbY]pз:>˟|%;j7:.zf"o1O| WbQQgs؇mI]rhƀ0tӹUR7\U?իGia)6gBA]-Pڬf&]t"ÄNT.l_,PӵZdbUD wb6,Uw'h/T.K;Tjt(4虳7OE w:C`(T`ʳ\eB쯢g`&  F$sBonlM77Hk>9 U(Z/ᨹ P: ːU~w(9ۇόݝ]Dz!@I:Mױ6$ư;7҃GiJ) [ RDH7`/se=IdpL%h%7}Hv.WgevD;U{a"ftcZLn: `ӖcU3mjDv_|7eٲGm$L"-t[66/Ae/ ӑX4V8%]d"cC~T\9RE7w^dm'0`X+Aŗ: ya-vz)ue[B5}xž z1/RMPzV'-I 2tzLy \P`g4y+= S ڡ_3&#YH"]$V:^R ]2l]9as͍,1*QP+J,2x 2,$_.\0߮>BZAi?zR' Xs&.g A(Qh~r.&6e䄧1/*H|$d kL%E/&@ٻZIJdԩjPS 8v1,Ѐ<ّ")S|Z !9 M445a%O FW`ĪoFѭ5-g<3_`y1 " \kCc1DzQf4?waذ-$PL[DGb!ИtÝf|F5I7d9n@9OLDY&ApA&AS]C,1oEHB7 !y#rhdc,=AN/âEY^+ꖢq9jCQCe c(l|Z5AM4"㡚K_YIgQ̥vqK#DI8-""oe9DBѓM@1|z {R ~j@ u<.}ED{yUS Hc 87qE|nA -Ӫ̹ks™g_jzl6t>H Fp^DRԭ!api.Z҅xPFN}XiYe$TVVᅪP;uTDg9&+Dj_{.t}v+D`!xmoAƒ L`1cȐ~_Lko:FۅK%h;HOh$B+(c+p\ۊKr'X[Ct spmg-d`j"݀\0-݊# ĺ*$OOs؉℞lXx}Ǧ-5 }+ݎs6"{뽵fI*@PNm6MJ ?]5&MUw'^aЭvytH QفJFX!GR@BN2$36^ ڰN <⯍X|}aL&aAoe䨍xP_m+&NǕ7΍Q yK5 ,'CR⬚Q}?K4. ݮ̝3'v i+H> ȋZN$"u/Ҽڃ?;D0hoNhG}nb/@KMc80h|~ Ċtv>J*?W]›*wM͌XX68(7aJ;H>,V>%Eu/MF@EQ3A9~$}6ʼn4PX-N1py^RQуc߀GObyfT ,$!V6Vwu RHY 0r/ ۚ[GbGc4%HP*Yǹ=2Zg؃(mPW ҕGq7ij'|C>CWmȑruʞ"cb$)(hlf@a)&%6yʰ"i$ j>ꕨI:Jʝ uTPnY3)GӵLzGXqE ttLiouG&W~3'PWK=jYp=7\w{(`AO ̀dLrEb,GG3^Ѻg$t@:AsE2;Gl_*q-4'\pR )ijozWaHU? 9h ~'")A@;܈y\<@`«̟}4Qpz_/YLsjIՠ°]iwE$_1GtBd$bcH nԢ1%~aD yڡ1> P(c@#8#Ptz&q  0L21G^ c*<=߼qz{)_]tcIi-T+?P1]lLJ|ImZRAKOkjwG-;{ I$\`{]RRƈ!Mt06YܝקL8,T Jt0rF;L_.!Ft4Pf)}V8j sՌ"DAisABޫ 2lؓ>J@'"pԱb'cft1qU@tJ\+Q5s- ~w:&OPߦCU}R 겨Dj WĬ$G+X1v$_&& Т1BA3(ҿy77=dwF0.f5%,~~,d|IQ>vD<+ie_WWUkH.ed_06I>]fG@&=–mr9o;p{6w Vp|?@`u>u_0`@`^4!xC6g)pmsUj;fYҕMe­gŊG fϞ)"7(ךQ[XDˊƒ@=!xds|NGұ_QQD}׹RɏㄙdN{C߾ w dapk͓+?ӂk8MN9iǥ Ӆc0|+-.hk*}I* زpcJATq1S)(?{SNw-F!r Wī; yU`2eYмI&кb`E#gϞ(S#~ƘBIo JzQxQpw^J'}c &t -K6h^.i`) o,;$C)]`ښ‚:'e$ٳ>zϓfNpmU9 MPas~G]~^6SYT4heA KQ~ oqq`f3ѱm?HBNbfPi[ro3@+@\|i1m8Eu='xժUK4ܼžX~}e/b$_ w ضw+9L{b lbg8C wɯ#LA (mAa0!*U b*@>3凇c`/.7awhڞ~  bY y|KӸpa7N߲?/b$\R;IP9j%mn"Dȵ5HHGG^RA:{(]*$ YEHڏLs˿U[I/7tܺy /L qBϒSfەmڽҏn YQ pc,-QNw~@IGV1s~aa,Hc'gR *]wNa`W0>K]`n$uexua;9}VPq6&SRA>^p@/;  '[OeL4b0+rb40J$Ơ21Z2Y0) =e,z%`1Jcʸ>I[`ʠ݁{(\kл҆W[%h(0aAda% zM ٳfa V3NH%.|W6.3gJ ̪ U֟s4D_p=>L f3ʰiH(Gl$*h(UZv'/{ f08@_}{0Oܺ|?bĈƜexu@ݰ*@𱓰ndԀV**Mߔ`:N[yT+w .|߈Ma6ŽikIO J`G ` (Rزx,DS߫Kd1o?oRA ߆9COl[r;)m?w"+Ew%%OAF~fW$'8KoLT[`0,lY<>#\?40v^u>bL?CȒ2z@㰰5ѻşߎ͓u&Ɋ4AfIk$110dG(Htf%F@Zaѯ9\( ) D=eg6cx X`#~z5i pp31趀eynp\aUePNes1H$nRlxEvIm^w#C!iQ#.9H~f#ZW܂4`9xz'~?4&Lg,5j5) Gq\uk-h Wjtwvõo"@V' `),N?] W~o 4P4 ޳=a-'g{kk y?zhKgl޼{ծAP=O)3qʓT 4ڧWi_d}6{b|KHm֬#"Ur_^P}mx<4I7a*} >Zj. =c?yO*ztm+aÆaѢE0a5DJtwJ\%_*D $A(eSҌk!+[Fb_LO/z Sdcb?wa?9={A _*pQၐۄ H!ϾvJϺv&Np?\8"T16pi%"(I)V&k= bf3.n 3~ډilnϺ \Oixex@@J܍;nxr|޼oi ㌒S%jD#}~f4ݸE`V憦_#d@r 4O-7 FT`gg =[q둒# {Y=kcQ3[>bؿRw֟=!*FV@GU,$*nv2Kf 9+5J@D}TX쯑r0KO`#sx=3(60| p`חsqʌ=MWsWo}]X$`ls0g!+:bVTD"VDk\ MZGl-i@ ZK/}_,luob1xߌCQ3S޴Zn&sC0|ꅓcN" U U[ԃ4NQ> HmIlf6BWba3^  jJ`T>t3 b"(zr)*5 W~m_cg.cwXMe@ 2xη_8wBN w< s"f$ g`ۢFћqwvKsz5'ONy3I'(]i],ly,}پƞE\;VX PVFey?3<1W>c%4h:H$@Rh@ 2+o;iThy׿|y܄DK!ؾ o~KSӖe `x>b`]z,< f1{Nꚛ>I wD#IFGcCZZV EXw5'o5[0]-ۛ"C=4D-@%ڳ!sJi74gPO%b)8S XPO-`/vDssde)Q (=—RFB*ĐV$FV~A,{+3;c-- X8/ )6A w?Aq+%$_$cM%R.!}" ȇpaS04 `@1ZͪД\@+BN?G@&flc4_{=}OX,$exmڋK/H翆x0H@)KQiTLXdG~@*14wH`j"uDCH{:-Č+W)7E\[̹POHk{r =} 5}e(@VYu#?ʸ~7*f)!$@U||S)Ԗ)+ =@!ʋ"B0`eH+TT`Ž=c.? @,r<31_&K?vﶔAxR&l|;k; pScZ }4%sΠ%M>=Pv$p,݃V+ $(G3%$B'|]PΫ::?u\0 ݖ2ޥTif+~cy8.m _ _dEXRiC1=M0t sB$aÀnS$hI%grF,7lȐ&^ &ϙ:G3?qĢ5k`ҥ-esNb3Aoc%N^ZE$6+4+#P5ltCnjW֢@ր6jko_}0{SQwL"w-6^){"e8 _)`x_/o@0 8Iݝ} ׯO@ qVⴇ~WxզM·F/urR9U6@ɧ'hWB/Zm>t$ 1&n S|a"k@V64}. 6Lb 2YR@MF>O m)_}+ Dqa B,=g=0Qr@@lπ;Сˤ}a"4V5x 1kG@d5CrvOE_1z9cпc9?:=s/7vyɾpfa{ 0W [Zme(;o+ Y߈Ai9=)hZdn@M/<OK^'4U8JVTBuTԔH/u<}r؟~xlO 0/DRd*HdnI_L bhA\+m|,UcǑ ݩH@Lϛʟי6 fPZ "=z@ fXa)&`W%tߵq%iMWN2X`?iϮw_Oc'EJ*1.g'~?!QJuT&VOcxq@'ʖbh%Xuo8'~uzw&g^8;Ϥ*G /> CߜVM5O 4Ƃ?;_O+BJ 53"sz/)h#Fzѽ#ᖟ}_>xjL{WK1 ,iRA"7}6=Srɉ`ǠzCɶaRK@ ͎ t"z"CH4*#Ο9G<8jݘ_Z_-k5`ÿeצ'G%tt(pi\V7íهJ0 XI#7yd\cC ̙.Kf{n⅗;$cƶb ?`5o8Ϋu{1)^;y&nW4'`'+e-dG"g6͌"t)>##@k:7> /z'b1`6_RvlR4f~8u693H *g c.VJh@eq(t E.,2!H$/9*W*S֬ô+:} [.Ф0})ySq~ƥc(| m%RQ7tU(a)!"P!$oaBLp܌~Ew/#O˭ LI? Pt;Z~p 7-`B"tΠyb)ChAځ B蚣_Hd}*S+0랬rԝbwyܸwHHT@/I_ U]k!4*G4@ɟ:F%j$[oH/Urn׿;x&/X/dIy@ϊZ1{@j VYAs*M466FTDw+? Lo& io&{S\ 5Lg Jex}p>tŧqa~<tIH{N]3( D͍%(R=By(Հ^TEE9]܊]{SƝ}><,Hd;| bJ-+pϮ};<.jOR3C穄3ƃ,HҷR $@ʣJu>vgT?L9Dd-rzgnWnZ&_~/bg :_,7'tnD>|H@NNE8cx)b?l2;oM<Ҟ{Ҙ*;=e8x@Jk=߹1UT|ZDaL, չRн JOA4oxX(Ox Xd5e(O(v ?tu%ϬPװ+UO4enT@ydMGꓒ!<21gB`¢Eg A 6VFlތ|bdܧ?J&>)ӎaJ~f L$C^A|@vݵHAU߰bЗ2iq1<``.@|*@_ږES.gL֯e ;p)Ӡ&ɓ8*&tZސ`RlB/"'m/r ˷nYX/P7`_@ Q.-쮨>It17`w2 Zp0X;A8* heMI89J^Z ) y-0B[2J}Vƭ[Qja^/$0$t_8=NxU#' DD\zBT2W]vﭏafv; Leee (x ?SW@2{5θ?Pju*H_g",ٝDR`u[n uuUH \?s ɓY}^_ 뻼GېUVs&@.Pۡ#ct r 2 P@Jl/v )A_"P X'H+\HDaϷߞ?ƿ(a f̘QҤʺ ]vWcrc&+ç!+ Љ\KI>3@)s>F{aQZ4/b\e3&ٌ60lPsMq뾃h2G.nIAfnN>>4$Xy'7lDJkv)!qG 1Zڃz?|./dG "R0( e0 UŸ}oأbhzG T5];xz"\!īv?p}crSߊ{N}L ~/ka9FS2ש/ 0} θo pXB=rڙ@ F|/!͈Aj2"ϧy fLnj-{'s@>'$ ҃тZRІz߫U17#" HyAljod v3Fka@, os^pJ}_kuMh7PԔ^l;j/KH? 6zO,4bZ=Ո3g ih٧1Ekaˁ],2 P*77è٪@ Pm@*l4S tIj6 $hn?+,BDapwlt\T<}-KMTr<|n|kNY@;e$a0!0yh&k> o w v4"/ + n ?9`ş{nG_KVzp׹2@@ju_ 7dW73F>]-Ii-vV4O H5gf ^%K}%H}ÈoEn@pQZF3aJ 81szqc v/mK\E:"y<Z>ډ"M+rqkk3uhݟ>?}-w”z^ pg68R ׀i 6%a<W06IOM'i^ wi9&@ 6ڢ} `y{{$ zIvlTVVg”z^ 0|FĎe`|ŜS;DVb Wwr gYT`*`f6cxkǶNI} /lY T !h߈w_0R' gN $)kU]yVM8 X|[l K}__)hy&V,_o?WC\C }-L `|Y W{[O^?ϟOI7>δ_ Ҧ!CEʠnMwT ~`9 +Vڙ<\nL6-Y!X,y{%AR@ଫbZP`> G P`we {VÅO9#`o3x劰nBCyXrE\ܴ!òAw22q p衇fN ppNCEA E_D9u(rrY1}SK!}[ Gs@4)C6Xp ZyhWɗu /0g-xUlsM*֡MmcIFz;]Pn 4ٟx)y-ga#~/GO0WA `@)ĕu 0oJwuc,Hụ5 Pkkkb0xn =@-ؼWx؏ 9aj%`,~=rutsss"3P__ x/<)lf 3^+GOLtg2xSmc@] # 4O/TONT"kgL2|[zSTcx&aH/w?wi?w<-(oa ${ [2s6Eh7c ,4Z#՗Iyur/XܩHXAȌ\޷c`I+pk?5yD<(2AG;8XzdsO-*ocd*K &mg&y PKD%r!b@ ɟ8R8OWOJ <ɟkk2^gsKLeܟ |b .:Ɡ 3Z _ʣ/h5:*Z ~IF.0B@$0ČW.q@OAQ^V?!4a%5Ѳ&_iޓ2 a Tw Opqм>abhhS{o$E7' H>!󟋅9tPGح"HEbX\Xo`N3rc/pРAe!R_؋鷿9ۆ|įAn#? &!UlU?!`OCmwyȃikAq䎬D!ʦV.'*;<>߃q(s &Lse8@KгO1b 19+N\/7u$_Ѓ:C>Ny8$Ԁ7'- XbhJڰ߹Za뿄5[1&QN`n; =8[Mnp8\" y55 A<1b uL(e4@dYp5@KraݗМVEMNm(&+^XIG [" ʚ^++ ]sFneR%|ԣHQDK b jkIV`~Y lcfؒD@ .Z}c{nSWF_y {F DE0פ,v ^`?ke8=?|x<74UYͽ?bhk'MHIz ׶ȊK[}}Sho$b8wx`gݢlßlˎE dA?}l *d| }o>|x}t rRWlz>?CTmJ ?0(BDO7nUNG @hˢb_E>Q i-l:;М\:WWoϞ==}| Oji!& 銒Z S83M 10@ eF@Rc&n'\B&͉P^AQ|HMťr1ֵtE= N+e8x@`׮]N_@+Ga1']s~xvW$qD`v>K@7"q[*~@ (Y#S_Ob7aR7 Qxe 69l:FU #05y f?>>8~c @Eg1 sOw7Ih6 JXhSe nמbwUD' mTA`?o^|_g&_wD ˆIeyouLz#;vd*^Մ{!~}rfZ7t] ҚUOթF UAM W<0pAAwSXI~)Q0!QiA ZoG.*,q H/+ܹJ8O8z8'|AlT^ޟaAk$W)Fl0v&Ha.(:O9| Lj栧‘ ?Hf  InN2| }\ğL gOƫ+W;ᢾE?I֦Nr Pe]."Xd.@LI2hO>L+Xo~;>ryr}#p,B;PW_/ &n/| L4R_{nv;~R7v\{8֙។U' pQOyV&b > M98< -rnG0p K(ʒՁW8ݧ pB3c2&S ?c rTz" ؋\ed$j#BIǧ7Jx@fd! HT )Wcf;  |e ڿm۶ޗ@uTgZl/1v$Kx ÖC`  I2f2I&1!8C``B L21ADR-[lZy^{[nI彪zUuRa/I'tWuLo~ߊݬuEru/@Xw-.=p迥!z1&7J-_ 34WYrFѭ/|iY 97Vt:xw><0z&pqz=%ZX] D$);V?("YKU5EYTcq7ق(?7,ʣ{Q}`D%S{x{7) ц<~}қmjI3OllN"5<3T50VFRZkd0Q 1& 2m?"t`j; HMidsPс);{"O^a>We:to ذacag ^o ϣ;/I~Y WM@ŶɴGv8`P.>!pP@{M7UX]j6н ?Lʹ9Z"@;E]z##~^Ck:o ] }F_x*O=n?Z1f?<؃>DqhrwBK~t2{"rǏR#93VD~zE2% ݀PSr(x$ÛXqHv 9tA2 fHZm**FN@trKCm0ZuLcx,pL/ZoO <4/r̡eOc:aq!QL x;L 2hsRt 2T . N ޅEf@bD6Naj殀^I+-c)\bDxV~{tua9F~3R w;a= %/y) Pig.K/m"Clfsg]Es+_$o^Jˏt 2xW ;{?}Ke[^F7y.#S$'좿xN`BJ@Ujp)$4~-yW"IQ ܉EVߞ%NI-Bx.C֜l)6^]wx*ɋ&BـY>a:rӻ}:WҊGgׯo¿d& GN?'=Mgu4K?n^-zGC݉ "X<ݫAͭ@iJ|AsP/g1duxpO<5QÌ),O^YZ?u$Pν 虳 `aFCq!wL>ObW$zWX^-8AzKx(!ٴӬh@מ94 1CfpC9NJPM u02 g`@qpbGPg Jꃋ O/vdzuxro,6f?L?LyzWQg'W>B77]NZs,6p9h&]z޸eO'x+w$zN{>MyW& Л :ԭ158Ea&B%c=`CR4_U!o#K>)G;\F7L{/x\ū&5*~o( _}o/<;L^%K2-%g.2v6-:uVڻPY^t]A"Qһ,*lhuvp\q06%q*Qru5К2o+9q5T(xDG>Z>5y/~暋^HosL ]L:GSi'vfkmӼ;qxXߺ "$y# iHXHO6vb&l%;pS/{KKL7V}x?GwЪ3HL > p #|{^.9_`ϹƝ?O+snh?6} ͛&0?@bp"pMN} [b`4$t^ϱ\лav_/Q]r.ߚ?ޓTUtcˮ(Y_^ZK7ȩ <3=BD{"w j+oR":1mv73Ct]2qM]~ݼo mF+YP9@30>ݸiSU&gk¿]O9D.1W08ty㣓7-0 sWӨ&= &x!x&'.Ai _uv%_Bo{3=+(%.ХWM&+[*Ij2AP2qy8ɐfn,B(9:w4:X8ub]Jj\AH:d*wWͬyt5S]HEkz?=Z;~7| Vt¿bZ(caHX~y7A͈V8d$ Z ;pK.@g3 ET\YdU~IX^IgYf-~p!Kr]:{ӪUGC~eWl?q~B+dӢ[(K2}#`?;gmh['jg? SF(ۨXDg QL|e)_- ۚP]aD{QXT4B:%!Oױt4w>M-Ck^C+ KWZ;1!aOߥᯋrV{{ukLkEUp2{١ fM" bW۷` p2bTA*yH;w:NSeI oс+Q p MGW]'P j rh?HG;x}/إBrUG_NQ$EMXF'd=ZA$q41f(.">Fx$:s J#H=GܹޕIcng``1P|u9>:vrz8? (,ё;h>ATy42;y5]p&ʭa]}[~Zqҕ%jV)7MMθp=bk_h{0o SsBe$UQ[댋.Rv`s) %҉ gbKSn^AT _NlIpKjϝ?Fzn3U L`$=UB%0CGI"x|RL݀\6 >BzS}"0i:]*JHt5)␠*vڥK˕ZTYNj o V9 ,e4 [W5DW`HO}lbG_ (h(gi3Ӟ={,ARؔdE|dQ:É vbo[qn||#l4OFa0,/1-0OM$Pe'w=@w={t3>:mVWl3]L`ȏϠm ]zr!M7+n)3'C;NUVcYhi%t Tضn}l O@/35qA5 R9D^ c.).AV1H=k/^Gf˕ ҿ$Jᅨ~V7ԯi!*wNw9L`ƣOMǞBז#Oz?RbԀ}kio Tc 5 K@p^}g QYGuK+˭Jq$=>0؝= p@:N<atrBP`;vB][7?e (I1eD'kF0F:B:eL`m=iƚǎ]a%0 `X`u-EggP0l2ovt .Q&Vr#khzj.r PD ݇(9OBYSa?S?mtb w2 :#NU,4;p4B| {T-EJ @q$z9@oo#ӉM+=lΛLܓK?O '/.{N {}>u'h͛ebK4%(eTǧR̭\xfP *m? /9ɯJI"S2V}ꃹp?h[8r{v8}B x: Lsxnc{>reW!?_'щ[i~:6Miȝ54S\?.P{m=}ׯ 'عcXy'&Zجcfcs2c$ xBMl0 [$k`{ )$N+$Ҧdy+,Y ff];As:CK V@!«Q .xv!2~.s/Ӊ.ZďDD9[Gh0Z*wЇtѠ(T~+ *" KDNz <\1?҅u-kZT Wԣ&>iYDFNSt W eܗV8pHFhyet{E]? G@]`qv} NRbn?E? #{tM=.1FG~lٻT!]{]`o@p yP#Wg.ٞ߸@K3iRZ7taS?heaa0.0*@N2 {1 zvIQ CZ†П\:S/$݃ɒ椝c?KͿf[͈ "bV`b5+4*>4x+XID_|ـ"DǛ@+d/MTEdpDTfh<#XOСW?ZX T0R{/zXX o,<|WA-t p"0j(ǜx_쥪Zhrr̀1lkmjoH|B,.TD"+DفCthH20ha3d%#28=K[" Tf쟔,ϥ>2jte1Ą:}1?:r&?]I:B^Db3%T'1=*&tIJq:ӎ4Tፀ{# [3nb3tV'hw(F`8Vt@&{Ge?;;o30Brqx')9~WU?^diD$:TÇ~*_2 "/Ԁ^a,${pwt]-,5{!DV "Ev"/v.rapF>7䈁L/m)#е*kLc;U~#m`gd Gm`4bM1rcOvzVQfw7Y(w^Ϧ#j0V%Ũ5.U}V\j67Z_v!HGDl| Pk[8Qa&i8hd57*nJg/nr$n$c%PęQbڑ2H^7QNTNL}CB:zġ Vv@C5~ޟӗߓS&~kb@@D pgncOR&-@B(#j`%$VsÒt[;m[\n ,ӅXy&Wy: ?đ48pϥVFnC( J <\ G{~ E=́^.ض93C՜=*FqebavLLXW$iX DnvȜ *ahRRrNLu]̔ 4++uƪ &e$lBHh0-Z >%Cs0TR}wl wׯ5ѧrU7[TeM9R@oK>d,u2*@X֦=w XT$O)Gx+@is#۶e6Yԅ6;1H)KB; +R]6+j=|%ԌWT27ƞ._kno]G =Gr^]a/CsL-K+Mfd|H#qgIo6pDbWIcP҈b3_;nQgnbq{0`40aL0NBT}yMEm#ry2}<y`X`V7ѷL>t9J'["b4u@z4qu++u[=|brlrnu׮>'=v 07%IAOv`4gy ʹ2T: 2PI<@3d2m' 6ϙe`U({ت:7칆ϑn` OxgGh?iZ~lB+_Nղ_ cu:r?ݿj?ݷw^:X"U(p'Ud H)Zcb10d@sZ",XmsZ| =A@Wrh92OB-nl|L@CW ِsLDQ7ܽTkA1Xa7"[ uR)DfAgLCpig p0։힝M`FN\JO\B gcͺYV'5G:Y|tٝ4?@#ߦص4Uovn W6W\ϧC@TW?w; C10Ϣ PNX"1mveV7#șf_^ ]ؐae!$)t "-Pf&WZ+)G't"cH/KENED8An2#0ō~|^EMq0U=2z;:|rQ!RoH" *];-\#f$B3vLMѮ]Yqy\bwܦˍ_ = `oT˖W`[2vVՌ=F۬s^rÐث^ 1'3ZiЃ+Bؙf#5lksՎᓔ J_tl7r *eY`ŚOπp{JjĈ0fͿĨ4333S4[3v.4ݖ9sJiт`ON@d۩QUsQwk]ʶx@(R09rh AFa6q3H[yHHsbj\ڐ ZEϛV<]L, RchAo=Z3 3R TsknKCS{(x Y%K/wX;׵L?gi{.= M8|03Wt| * 9 Cnx{y8^۷o~Yص@Ȫ VjroDmGb3zKl&zHFGX#ʠr`b ur<]Ðё H B^dVfpxdž(Mn@c/,Yܻv}WiHa? D3wo'RjA졐o8JRk$|^A a' \u? op= -m#*#p(Atg[P*Ɣ9l/'#dHb38TQ:0fP2Hfh ;>S`$ Jk_#(F*Qy\Q)[4nw+Z+YC0ϪSތttkkD l6"ѫ;W\Lqv*4`LlT00AJ9 ]RP2ُLb⸡ %w25=e܀&PJ/ Yj3J* ԓ~iT9K Ôb$\xNB+. 6PԢ5.[o~Fo e#PYKQ*RtA1:(p2{v!E}ITь @vg"Cf*mV",͋SX,~LZTX´ l$4Y ZSD0($4%A\V Alo< K7α.7n~p =X^9P.ĵS&~trԠ?(zkM# Y.\$E^ZQX+t#Is^9ٸl6R8ma&"55ècs!&Yan֩ft Ot=r ,EfM0gl|ta(C VJ|~mG)evJ)K JU.50HŶ%;'7  \K00D6])y՝LffsOqGApap"|yK) .rC44Q3QI) xf.+HhEȜLp0ѶZ_t4a~W?ԯ'QfnI/j*8}L- #f8[)KGϐso}];c l h/QThc5`VGTI]59(<9',:!Ο( Zb%%0' LG:zVMNP92meTD: 4q!P UlwOB25\j&Wmʬ/=62 -m3IDP6Bb5tbZ1/ ˳K.֓1HvHdXLVx$^&*h|8KBhC!1*b\WfϴDx>Y!cukB@.'2_I?'ו_MQ4f\tÍnA$sF eT`.Mp˶DL\һӠbw"^̎4]V. *<*cn`f9ɩ2RL-?"˜~pԘd=f-M h>hye/E'M؞8Y. ,2 l",_w3#_j&KQhV(Olk8cX~{۶D8L[.e j7a6 Mԗ7jM哋#e <9Ħ*б@`9CUG9@.\SIUIA&= _Yhf5虍'$kAZKecc> )Jr0=WMo:T!A_i9ARH}- *$;i.b]s"XJ }qEǧC\F]ZXJΝKfKGZ{\~nNy4010>=2"!.k)@d]e"҉/(æ+n 8@tiU$kj_v|uo%p ̱(ubR3{Gz .*42f\QQ`hHuPA9tAqTz*A}V̺~ uՅ)gpC"Fo iT=.uPT)te#DIGAں&}[2I\~nǎ7 jaM YBo5lG j+R;NtvV#B$GjBlHL)ʺ²ٓ_(>T oSQ$`Z%`9_U;  }!^]Sخ1ϩ\ .Xg w5N,o#kBƉiI0*|n7vܰöتoRW :kBn;}"4+E&C!{RCMVV䞎ye 9eF_>ϔK7YNh""' X!-޲n ;J{e+i1D:FN1;X27Ft,XE f M[Fn7ܰc߱NOkOc ?TED t6Ih RT7g"^3ag.eӅ8P=!f֒(q$+]3xZ௯ckw bf!FWIs`]2 mK~];zŜ^nW'(((((((()(())())())))))))))**)************+*++*++++++++,AA@,+,,,,,-,,,,,------.-......./..//////0/000000000010011111FFF121121222222332332333334444444444555555555555555555565666JJJ677776777888888888988888{999 F ! ! !!! !!!!!!!!!777!!!"!!"""!""""""""""""#"#""#""##"#############$##$$#$$$$$:::$$$$%$%%$%%%%%%%%%%&%&%&&&&&&&&&&&&&&''''&''&'''''''''(('===((((((((())())()))))))))))*)**************++++++++++++,++AAA,,,,,,,,,--,------...//./-.///0/0////00000000000001111111EFF111222222222224344344444554445555555555555555555555666776KJK777777888888888888999989999:9: < ! ! !!!!!!!!!!!"!!787!"!"""""""""""""#""#"""##"##############$##$$$$$#$$$$$$$$:;:%$$%%$%%%%%%%%%%%%%%&&&&&&&&&&&&&'''''''''''''''''('('(('>=>(((((()))))())))))))))))**********+*+**+++++++,+,++,,+,,,AAA,-,-,,--------..-..-/-/.///0////00/0000000011110111111111FFF212222322433343333444445544555555555555555555555666666766KKK8778788888888989999999999:::::;;:  ! !! ! !!!!!!!!!!""!!!787!"""""""""""""""""#""""#################$$$$$$$$$$$$$$$$$:::$%$%%%%%%%%%&%%&%%&%&&&&&&&&&&&&&'&&'''''''''(''(''(('(((>>>(()((()()))))))*)))))************+*++++++++++++,,++,,,,,,AAA-,--,-------.-...///-.////00//000000000000011111111111121FFF222322333333444443444545555555555555555555555666677677777KKK8788888888888889899999::99;;;;;;;z ! !!!!!! !!!!!!!!!!""!"!!"887""""""""""""""#"""#""#"##############$#$$$$$$$$$$$$$%$%$$;;;%%%%%%%%%%&&&%%%&&&&&&&&&&&&&&&''''&'''(''''(('('((((((((>>>))())())))))*))*****)**********+++++++++++,,+,,+,,,,,,,,,ABB-,-------..-/....///.//0/0000/000000100000010111112111212GFF222332434344444444444555555555555555555566776766777777777KLK8888888888899899999:99::::;;;:;;;;;<2 9 ! ! !!!!!!!!!!!!"!!"!!!!""""888"""""""""""""#"#""###############$##$##$$$$$$$$$$$$%$$%%%;;;%%%%%%%&%%&&&&&&&&&&&&&&&&&'''''''''''''''('(('((((((((((>>?)))))))))))))*)***********+++++*++++++++++,,+,,+,,,-,,-,-BBB,-----..-.-...//////////0/0000000000111111111111111212222FGG333333444444444555554555555555555555566656776777777777877LLK88888989899999999::::;::;;;;;:<<;<;<<<< !!! !!!!!!!!!!!!!!!!!!"!!"!!""!""!888""""""#""#"##""#"##########$##$$#$$$$$$$$$$$$$$$$%%$$%%%%;;;%%%%&&&&%&&&&&&&&&&&&&&&'''''''''''''('('(('((((((((((()(>>?))))))*))*)**)*******+*+++++++++++++++,+++,,,,,,,,,--,--,BBB---...././//..////////00000010010010111111121111122222222GHG343333444444455555555555555555555565666756776777887778888LLL888988999999::99:;;;;;::;;;<<;<<<<<<<<<2 ( ! !!!!!!!!!!!!!!"!!!""!!!""""""888""""""#""################$##$#$$$$$$$$$$$$$%%%%$%%%$%%%%%;;;%%%&%%&&&&&&&&&&'&&&&'''''''''''''('(((((((((()(()(((()()>>?))))))*)*************++++++++++++++,+,+,+,,,,,,,,,,,-,---CCB...--..////////0//000000000000111111111111111221222222223HHG434443444554555555555555555555565566766667777777778778888LLL889989999;::::::9:;:;;;;;;;<<<;<<<<<<<==>>>=>>>>=>>=?>>????>?=??9@?AMK5A?5A>:A?J>AX;Db9Gi8Jr6Nv6Ov6Qv6Sm9Qg9P_;NT>JDAC9E?9F>9F>FQJ@EADDDDDDDDEDEEDEEEEEEFEFFFFFFGFEGFFFFFGFGGHHHHGIIGIIHIIISSSIHIIIIIIIIIIIIIIIIJIIJIJJKKKKKKJKKLKLKLKLLLLLLMLLLLLMMMMMWWWNNNNNMONONNONNOOPOPPPPPPPPOQPPQQPQPPQQQ ! !!!!!!!!!!!!!!!"!"!!"!""""""""""""#""""999#########$####$$$#$$#$$$$$$$$$%$$$%$%%%%%%%%%&%&%%&&&&&&&<<<&&&&'&''&'''''''''(''''(('((((((()(()))())#*)+),*,)*I#+x->3: AGOU\dkqwy~ ~ zl}Zm5Z?+9'2+&2)(2*.1.001110111111111221222222333443433444445555III555555555555555555565776767777777787888888898998989999999MNN:;;;:;;;;;;;;<<<<<<<<<<<=====<>=>==>>?>!!!!!!!!!!!!!!!"""!""!""""""""""""##""####999#########$$$$$#$$$$$$$$$%$%%$%%$%%%%%%%%%%%%%%%%&&&&&&&&&<<<&'''''''''''(''''''('(('(((((()(($*)**!**A$(n(*-27=CHMRX]bhnsy n[&M6/4&3()3+020211222222222333434444444444444555III55555555555555555667777777777787888888898889899999999::9:NNO:;:;;;;;;<<<<<<<<<<<<<<<=<=======>>>?>?!!!!!!!!!!""!!!!"""""""""""""##"""""#"####999#####$###$$#$$$$$$$$$$$$%%$$%%%%%%%%%%%%%%%%%&&%&&&&&&&&&<<<'&'''''''''''''('((((((('(( ****<%'x# !$(-16;@FKQW\bhnsy_&T020'4).3.222323433443444445544555555III55555555555566666777777777777888888888888899999999::;:;::NNO;;;;;;;<;<<<<<<<<<<=<=<====>>>=>?>???>?!!!!!!!"!""""!""""""""""#""""""""#########9::####$$$$$$$#$$$$$$$%%%$$%%$%%%%%%&%&%&%&%%&&&&&&&&&'&&&&&<<='''''''''(('''((((&((**#))W"#'+15:@EKPV\bgntz uA.?'5*.4/434444444444545555555III5555555656666677667768778778788889888889899999:99::9:9;:;OOO<<;<<;<<<<<<<<<=<<=<<===>>=>>>>>???????!!!!"!!""""""""""""""""""""##############$999$$$$$$$$#$$$$$$%$$$$$%%%%%%%%%%%%%%%&%&&&&&&&&&&&&'&'''''<=='''''''''('('((**&))g  "&*/4:?DJOU\agntzJ.G)7*050545544555555555III5556566665766677777778788788888889889899999:9:9::::;::;;;OOO;;<<<<<<<<=<<======<====>>=?>>?>???????!!"!!!!"""""""""""#"#"#"#""#############$#:99$$$#$$$$$$$$$$$$%%%$%%%$%%%%%%%%&%%%&&%&&&&&&&&&&'&&&''''==<''''''('' )*!))c   %).38>CIOV]cjqw}E0D)8*353555555555III555666666776777777878888888888988899999:99;;9;::::;;;;;;;POO<<<<<<<<<<<===<====>>??>??>??>????????@"""""""""""""""##"#"###"##"############$$#::9$$$#$$$$$$$$$$$$%%%%%%%%%&%&%%&%%&&&&&&&&&&&&'&''''''&'''==='''$((**L#!  #(-28>EKNORUX^cmu756,7,555555III655667676777777878788888988888899999999:99:;;;;;;;;;;;;<==>=>?>?>???????@?@@@@"""""""""""""""#"""#"##########$##$##$#$$$:::$$$$$$$%$$%%$$$%%%%%%%%%%%%%%&&%&&&&&&&&&&''&&&''''''''''===(),'' "',121-c)G$3 *#)!.$?-W;wNg `*^*8+363JJJ666766677778788888888888989999999:99:::;:;;:;;;;;<;;;;<<>=?>>>?>>????????@@@@@@@@A"!!""""""""""""#"################$##$##$$$:::$$$%$$$%%%%$%%%%%%%%%%&%%%%%%&&&&&&&&&&&&&''&&''''''''&'(2?AS$   !p E$ "## < 2_Jn 758DLC767777778788888888888888998999::9:;;:;;;;:;;;<;<<<<<<<<<>=>???????@???@@@@@@@@@A@A""""""#""""""####"############$#$$##$$$$$$::;$$%%%$%%%%%%%%%%%%%&%&&&&&&&&&&&&&&&&&&'&&''''''(''"(("()-"   H !!!"""#$#&!( ) !*$@&;q`e@f,:+777878888888888898989999999:9;;:;;:;;;;;<;<<<<<<<<<<<=>=?>>>>??>???@??@??@@@@A@ABAA@A""""""""#############$##########$$$$$$$$$$:::$$$%%$%%%%%%%%%%%&&%&&&&&&&&&&&&&&&'&&&''&''''(''(2'%" T !!!"""$$$%%%&&&''')))***&-(#/%%1(F+B~s&u.:.6868888898989999999:99;:;::;;;;;;<;;<<;<<<<<<<<=<<=PPP===>>>>>>=>>>?>?@?@????@@@@@@@AAABBAAAB"""""#"#################$###$#$$$$$$$$$$%$::;%$%%%%%%%%%%%%&&%&&%&&&%&&&&&&&'''&''''''''''')@(#& !  J !!!"""$$$%%%&&&''')))***,,,---///000,3.'6)?2= 0:/695888999999:99:9:::::;;;;;<;;<<;<<<<<<<<<<<=<==QPQ=>==>>?>>??????@?@?@@?@@@A@@A@AAAABABBB""##################$##$$$$$$$$$$$$$$$$$%$:;;%%%%%%%%%%%%&%%&%%&&&&&&&&''&&''&'''''''''')L)!,)%!  N !!!"""$$$%%%&&&''')))***,,,---///000222333555384,;.B8B3:35:59999:::::;::::;;;;;;<<;<<<<<<<<==<========QQQ>>>??=????@?@??@@?@@@@@@AA@AAABAABBBBBB#""################$##$$$$$$$$$$$$%$%$%%%$;;;%%%%%%%%%&%%&&%&&&&&&&&&&'&''&'''''''''&)Y,30,($ z !!!###%%%&&&''')))***,,,---///000222333555777888:::8=92B2Z7X7985;5:9;;:::;;;;;;;;<;<<<<<<<=<<<<=========>QQQ>>>???@??@?@?@@@@@@A@@AAAAABBBBBBBBBBBC##"##########$####$$##$$$$$$$$$$$%$$%%%%%%;;;%%%%%%&&%&&&&&&&&&&&&&&&&'&'''''''''%*a.<840,(#;  """%%%'''((()))((()))'''$$$%%%''')))+++---///000222333555777888:::<<<>>>???:C;>E>&:::7;6;;;;;;;;;;;;<;<<<<<<<<<<======>==>>>RQR>>??@??@?@?@@@@@@AAA@ABAABABBBCBBCBCBCC######$#$####$#$$$$$$$$$$$$$$$$$$$$%%%%%%%;;;%&%&%&%&&&&&&&&&&&&'&&'&'''''''''%)[/DB=83/+'#  '''000777===BBBDDDGGGIIIIIIIIIIIIIIIHHHDDD@@@:::444///---...111333555777888:::<<<>>>???AAACCCCFC>=?=>>>>RRR?@@??@@@@@@@@@@@@AB@AABBBBACBBCCBCCCCCC########$#$#$$#$$$$$$$$$$%$$$$%%%%%%%%%%%%;;<&&&&&&&&&&&&&&&'&'''''''''''''%)L. JJEA=83/,%`!!!...999AAAFFFGGGGGGHHHHHHIIIJJJJJJKKKLLLMMMNNNPPPQQQRRRSSSSSSOOOHHH>>>666333666888:::<<<>>>???AAACCCEEEFFFHHHAMAWGX5>4:<9<<<<<<<<<<=<=<<=====>=?>>?????RRR?@?@?@@@@@@@AAABA@BABBBBCBBBBCCCBBCCDCD#$#######$##$$$$$$$$$$%%%$$%%%%%%%%%%%%&%%<;;&&&&&&&&&&&&&&'&'''''''''''!%);,$NSMIEA=84,8 (((777AAADDDDDDDDDEEEEEEFFFGGGHHHIIIJJJJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSUUUWWWWWWTTTJJJ>>>999;;;>>>???AAACCCEEEFFFHHHJJJLLLIPIHTH*} 5?2<<;<<<<<<<=<===>>?>>>?>>??????RRR@@@@@@A@@@@A@BBBBBBBBBBBCCCBCCCCCDCDDDD######$$$$$$$$$$$$%%$%%%%$%%%%%%%%%%%%%&%%;;<&&&&&&&&&&&&''''''''''''%&(&'(N ]VRNJEA?21))):::BBBCCCBBBCCCDDDEEEEEEFFFGGGHHHIIIJJJJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWYYY[[[ZZZPPPDDD>>>@@@CCCEEEFFFHHHJJJLLLNNNPPPPSPMXL0b+t5?1<<==========>>>????????????SSS@@@@@@A@AAB@ABBBBBBBBBBBCCBCCCCCCDDCEED99::9:::::::::::;::;::;;;;;;;;;;;;;;;;;<;;FFF;<;<<<<<<<<<<=<======<==2:@Re_[WSNJH9('''999AAAAAAAAABBBCCCDDDEEEEEEFFFGGGHHHIIIJJJJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ\\\^^^]]]SSSFFFDDDFFFHHHJJJLLLNNNPPPRRRTTTTVTO\N6 [GcMRJQQQQQQQPPRRQRRRSRRRRSSSR]]]SSSTTTTUTUTUUUUUUUVUVVUVVVVVVVVWWWWWXWW#$$$$#$$$$$$$%$$$$$%%$%%%%%%%%&%%%%&&&&&&&;<;&&&''&'&'''''''''''('$)e<lid`\XTRC-444@@@AAA@@@AAABBBCCCDDDEEEEEEFFFGGGHHHIIIJJJJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]___aaa___RRRGGGIIILLLNNNPPPRRRTTTUUUWWWXYXT`R5<=;;>;?>>?>>>?????????@?@@@SSSA@@BAABBBBBBBBCBBBCCCCCCCDDDDECDDEDEEEE#$$$$$$$$$$$%$%$$%$%%%%%%%&%%%%&&%&%&&&&&&<<<'&&'&'''''''''''((!%)<0$mtmjfa][L5 &&&<<>=?????????@@?@@@@@@TSSAABAABBBBBBBBBCCBCCCCCCCDDDDDCDDDEEEEEE$$$$%$$$$$$%%%%%%%%%%%%%%%&%&&%&&&&&&&&&&&<<<'''''''''''''''''( %*`wsokge\E&...@@@@@@@@@@@@AAABBBCCCDDDEEEEEEFFFGGGHHHIIIJJJJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^``````aaabbbcccfffbbbUUUQQQTTTUUUWWWYYY[[[]]]___`b_^h\&S2g:A6?????@@@?@@@@@@A@@UTTBBABBBBBBBBBBCCCCCCCCECEDDEDEDEEEEEEEEE$$$$$$$%%$%%%%%%%%%%%%&%%&%&%&&&&&&&&&&&&&<<<''''''''''('(''"*lF|ytpmk~: 333AAA???@@@@@@AAABBBCCCDDDEEEEEEFFFGGGHHHIIIJJJJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^``````aaabbbccceeefffgggggg[[[TTTWWWYYY[[[]]]___aaacccchal`q @?A?@=@?@@@@A@@AA@BBATUUBBBBBCBBCCBCCCCCCDECEEDDDDEEEEEEFFEFFFF%%$%$$$$%%%%%%%%%%%%&%&&&&&&&&&&&&&&&&&&''=<=''''''(''('($&(0,&|~zvwO 666AAA???@@@@@@AAABBBCCCDDDEEEEEEFFFGGGHHHIIIJJJJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^``````aaabbbccceeeffffffgggiiijjj^^^XXX[[[]]]___aaaccceeeffgdmaxVb%;C4@@@@@@A@@ABBBBAUUUBBBBCBCCCCCCDCCDDCEEDEDEEEEEEEEEEEFFFFF$$$$%%%%%%%%%%%%&%%&&&%&&&&&&&&&&&'&''''''==='''''''''((("*\k*!666AAA???@@@@@@AAABBBCCCDDDEEEEEEFFFGGGHHHIIIJJJJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^``````aaabbbccceeeffffffgggiiijjjkkkmmmaaa\\\___aaaccceeefffhhhjjjhrd=E:P>A((((((!+h{P ###??????@@@@@@AAABBBCCCDDDEEEEEEFFFGGGHHHIIIJJJJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^``````aaabbbccceeeffffffgggiiijjjkkkllllllnnnooopppqqqrrrssspppjjjlllnnnpppqqqsssuuuwytyt~}zwsqiE=OBD>BCCCCCWVVCDCDDDDEEEEEEEEEFEFFFEFFGGFFGGGGHHHHHHH%&%%&%&&&&&&&&&&'&''&''''&'''''''(''(''(((=>>(((%&)1/&ߐ#999@@@@@@@@@AAABBBCCCDDDEEEEEEFFFGGGHHHIIIJJJJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^``````aaabbbccceeeffffffgggiiijjjkkkllllllnnnooopppqqqrrrssstttuuupppnnnpppqqqsssuuuwwwxxyzr|HyvspmjiQ'AF8CCCCCCVWVDEDDDEEEEFEEFEFFFFFFFGGGGGGFGGGGHHHHHHH&%&%&&&&&&&&&&&'&'&'&'''''''''''''((((((((>>>((("+mXY ...BBB@@@@@@AAABBBCCCDDDEEEEEEFFFGGGHHHIIIJJJJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^``````aaabbbccceeeffffffgggiiijjjkkkllllllnnnooopppqqqrrrssstttuuuvvvvvvqqqqqqsssuuuwwwxxxzzz|~z}wsolifdbYCCCCCBCCCWWVEDEEDDEFEFFEFEFFFFFGFGHGGGGHHHGHHHHHHHH&&%&&&&&&'&&'&&''&''''''''''''(('(((((((((>>>)()!#* (#!!!>>>@@@@@@AAABBBCCCDDDEEEEEEFFFGGGHHHIIIJJJJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^``````aaabbbccceeeffffffgggiiijjjkkkllllllnnnooopppqqqrrrssstttuuuvvvwwwyyyvvvsssuuuwwwxxxzzz|||}}}wvEgeb`][XG4lCG=EEDWXWEEEEEEFEFFFFFFFFFFGFFGGGGGHHHHHIHIIHIHI&&&&&&&&'&&&'&&''''''''''('(('((((((((((((>>=#$*C<%s 333AAA@@@AAABBBCCCDDDEEEEEEFFFGGGHHHIIIJJJJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^``````aaabbbccceeeffffffgggiiijjjkkkllllllnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzzvvvwwwxxxzzz|||}}}}~rc^\YWTSKCH:EEEXXXEEEFEFFEFFFFGFGHFGHGGGHGHHHHHHHIIIHIIII&&&&&&&&'&&''''''''(''''((((((((((((((((()>>>!+{hN@!!!???AAAAAABBBCCCDDDEEEEEEFFFGGGHHHIIIJJJJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^``````aaabbbccceeeffffffgggiiijjjkkkllllllnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{{{{xxxzzz|||}}}g(UUSPNLI ECJEFCXXXFEFFFFFFFFGFGGGHGHHHHHHHHHHHHHIIIIIIIII&&&&&&'''''''''''('''((((((((()(((((()(())>>>"+ ҥ222BBBAAABBBCCCDDDEEEEEEFFFGGGHHHIIIJJJJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^``````aaabbbccceeeffffffgggiiijjjkkkllllllnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}{{{|||}}}uYNNLJHFDD6mEH>XXXFFFEFFGGGGGGGGGGHGHHHHHHHHHIHHIIIJIIJJI'&&'&''&'''''''(''''(((((((((((()(())))))):;?85'w >>>BBBBBBCCCDDDEEEEEEFFFGGGHHHIIIJJJJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^``````aaabbbccceeeffffffgggiiijjjkkkllllllnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~~~~}}}{O FECA@=A&FI>>=>>>>>>>==>>>??????>??>?>??ABMĴȰ"""BBBCCCDDDEEEEEEFFFGGGHHHIIIJJJJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^``````aaabbbccceeeffffffgggiiijjjkkkllllllnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~ug/20/.,*OE}df\ZYZ[ZZ[[ZZ[[[Z[[[[[[[[[\[[\]\]\]\]]]^]]''''''(('(('(((((((((()(()()))))))*))*)''*FE> ,,,EEEDDDEEEEEEFFFGGGHHHIIIJJJJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^``````aaabbbccceeeffffffgggiiijjjkkkllllllnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~5 )+)('$:,[]QFHHHHHIHHHHHIIIIIIJIIIJJJJJKJJKKKLKKLLK'(((('((((((((((()((()())))))))*))*)**)$$+][:_Y666FFFEEEEEEFFFGGGHHHIIIJJJJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^``````aaabbbccceeeffffffgggiiijjjkkkllllllnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~? !$#""1 \]QHHHIHHIHIIIHIIIJIIJIJJJJJKKKKKLKLLLLKMM'('((((((((((((((()()))))))))*)*)******!!,qo5:8>>>FFFEEEFFFGGGHHHIIIJJJJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^``````aaabbbccceeeffffffgggiiijjjkkkllllllnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~Q?(]^RHHHHHHIIIIIIIIIIIJJJIKKJKKKKMLLLLMLKMMM(('((((((()(((())))))))))))))))******** ,- !!!CCCFFFFFFGGGHHHIIIJJJJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^``````aaabbbccceeeffffffgggiiijjjkkkllllllnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~f] ZZ]IIGIIHIIIIIJJJJJKJJKKKKKLKKLLMMLMLLMMMM(((()((((())())))))))*))))))*********** !,"'''GGGFFFGGGHHHIIIJJJJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^``````aaabbbccceeeffffffgggiiijjjkkkllllllnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~xs VTjJJEIIIJIJJJJJIIJKKKKKLLLLLLLLKMMMLMMMMM((()(())())))))))))))*)**)*************!!- ...HHHGGGHHHIIIJJJJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^``````aaabbbccceeeffffffgggiiijjjkkkllllllnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~ SQsKKDIIIIJIKJJIKKKJKLKKKLMKLLMMLMMMMMMMMM)()((()())))))))*)))))*************++++!!-333IIIHHHIIIJJJJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^``````aaabbbccceeeffffffgggiiijjjkkkllllllnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~ ON|KLBIJIKIJKKJKKKKKKLLLLMMMLMMMMMMMMMNMNN)(()))))))))))))*))******+**+*++*++++++!!.rs777JJJIIIJJJJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^``````aaabbbccceeeffffffgggiiijjjkkkllllllnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~MKMMAKKIKKKKKKLKKLLLLLMMLLMMLMMNNMMNMNNNN)(()))))))))**)************++*+++++++++"!- gh:::KKKJJJJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^``````aaabbbccceeeffffffgggiiijjjkkkllllllnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~!KJNMBJKKKJKKKKLLLLLLMLMMMMNMMNMMNMNNNNNNN)))))))))))*)*************+*+*++++++,++""- `c<<FGP(_z$ ,,,,---///000222222???YYYYYYZZZ[[[\\\]]]^^^``````aaabbbccceeefffdddjjj{{{lllpppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~Q>@><:8@ROE_``PPOPPOPOPPPPPPPQPPPQPQQQQQQQQRRQRRRQSSS,+,,,,,,,,,---,------..-//.././/////0////0DCD//1 &".---///000222333555888SSS[[[[[[\\\]]]^^^``````aaabbbccceeefffdddjjjxxxnnnqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~zKGFDB@>5IROF```POOPPPPPPPPPPPPQPPQQQQQQQQRRRRRRSRRRSSS,,,,,,------------/.-..-//.////0////00/000EEE)%3x8?),*0000222333555777777HHH]]]\\\]]]^^^``````aaabbbccceeefffdddjjjlllqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~MvMNLJHFEEMbQOJbaaOPOPPPPQPQPPQPPQQQQQQQRRSRRQQRRSSRSSSSS,,,,,,,----,-.--..././..//.0/////0/0000000EEE+(2Oa%Wx*%2222333555777888999>>>XXX^^^^^^``````aaabbbccceeefffdddjjjqqqppprrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~eUTRPNKKROIPOPbbbPOPPPPPPPQPPQQQQRQQQQRQQQSRRSSSSSSSSSSS,,,-,--------..-././././///0////0000000000EEE0.2350  /+3323555777888:::<<<<<>>???AAAZZZaaaaaabbbccceeefffdddjjjrrrnnnrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~3ydda^\YWHP^RPLPPPbbbPQPPQQQQQQQQRQQRQRRRSRRSSSRSSSSSSTTTTTT---------/.././/////0///00/000000001100111FFF111-+3CQ*k3.9888:::<<<>>>???AAABBBLLLbbbcccccceeefffeeeiiirrrnnnrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~rljgdb`XSOGPPPPPPbbbQQPQQQQQQRRRRRSRSRSRRSSRSSSSSSTTSTTTTTT.-.----/././//////0//0/0000000010001100111FFF121211.*4wEY/73<<<<>>>???AAACCCEEEEEEWWWeeeeeeffffffeeerrrnnnrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~=uspnjhe>TwSOIPPPPQPbbbQQPQQQRRRRSRRRRRSRSSSSSSSTTTTTTSTTTTTTT.../../..//./0////0/0000000000110001111121FFF222222.)4Kg&i95>>=>???AAACCCEEEFFFHHHJJJ___gggfffddd|||rrrnnnrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~w}zvspodRPLQPPPQPPQQcbbQQQRRRSQRRRSSRRSSRSSSSSSTTSTTTTTTTTTTUT-.....///0///00/00000000000111111111111112FFF222222313114v }{Nu,<4CAAACCCEEEFFFHHHJJJKKKQQQeeehhhdddrrrnnnrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~%}yvt9ZTOGQQPQQPQQQbcbRQRRRRRRRSSRSSRSSSSSSSTTTTTTTTTTTUTTUVT./..///0//0/00/000000100000111111111212212FFG3323434340*6Ln%}{wvi CJ>B?EEEEFFFHHHJJJLLLNNNOOOXXXhhhhhhyyyqqqooorrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~X~oQONQPOPPPQQQQQQcccRQRRRQRSSSSSSSTSSTTTSTTTTTTTTTUUUUUUVUV////////0/00000010100000111111111112112222GGG332433443425305l{xuronXC1% +/be}{WżI]_TKIQRSRRSSRSSSSRRSSSSSSSSSSTTTTTTTTTTUTUTUUUUVUVVVVgggVVVVVVWVWWWWWWWWWWWWWXXXXYXXXYYXYYYYYYY333343444444554555455555555555555555766666JKK8778787888888888889889999999:::;;;:;;;;;;;;;;<;<<;<>1?6`2   #.U\z|zGп2QOOSLKRRQQRRRSSSSRSSSSSSSTSSTSSSTTTTTTTTUUUUUUTVUUUVUUVVVgggVVVVVWWWWWWWWWWWWWWWWXXXXXXYYXYYYYYYYYY334444544445555555555555555555556557766767KJK777777878888889888989999:99:::9:;;;;;;;;;;;<;<<<<<<<<<>4?NVM"  #-BVbt{rIϵ ;~hZZROORRRRRQRRRSSSSSRSSSSSSSTSTTTTTTTTTTTUTUUUVUVUUVUVVVUWVVgggVVWWWWWWWWWWWWXXXXXXXYXWYXXYYYYYYYYYYYY444454554545555555555555555565665666776777KLK888888888888988989999:99;::::::;:;;;<;;<<<<<;<<<<<=<<<===QLR?6?,) +>2TVmskHϧ&IabUGGbbcRQQRRSRRSSSSSSSSSRSSSSTSTSTTTTTTTUTTUUUUUUUVVUUVVVVWVVWVVghhWWWWWWWWWXXWXXXXYXXXYYYXYYYYYYYYYYYYZYY444445555555555555555555556676676766677877KKK888888898888999999::9:;9;;;;;:;;;;<<<;<<<<<<<<<<=<=======QQQ>>>A4A֕(;TJISLLQQQcccRRQSRRSRRSSSSSSSSSSSTTTTTSTTUTUUUVTUUUTVVVVVVVVVWVVWWWWWWhhhWWWWWWWWWYXWXXXXXYYYYYYYYYYYYZYYYZZYZZY545545555555555555555555656766777777777787KLL8888888888999999:9::::;:;:;;;;;;<<;<<<<<<<<<<=<<=======>>QQR>>>??>@;@B5B4e3 "',27=BFLRX_gmt|+OTTUGHQPPQQQQQQcccRSSRSRSSSSSSSSSSSSSTSTTTTTTTUTUVUUVVUUUVVVVVVVVVVWVVWVWWWhhhWWWWWWXXWYXWYXXYWXYYYYYYYYYYYYZZYZZZZZZ545555555555555555565666657766777877888888LLL888898999999:99:;::::;;;;;;;;;<;<<<<<<<<<=<========?>=>>>RRR>??????@?@@@C8BACJPV\biov}'Ia`UGHRNNQQQQQQQRQRRQbccRSSSSSSSSSSSTTSTTSTTTTTTTTTTUTUUVVVUUVVVVVVVVWVWWWVWWWWWWhhhXWWXXXXWXXXYYYXYXXYXYYYYYYYYZYZZYZZZZZZ555555555555555556766667767777788778878888LLL88899999999::::;;:;:;;;;<;;;<;<<<<<<<<==<<========>>>>>>>RRR??@??????@@@@@@A@AD8DC?A1r4!%*/4:?EJPV]ciov} +I`_UGGSLLQQQQQPQQQQQRQRRRRRcdcSRRSSSSSSSSTTTSTTTTTTTTUTUUTUUVUVVVUUVVVVVVWWWVVWWVWWWWWWhhhXXXYXXXYXXXXXYYYYYYYYZYYYYYZZYZZZZZZZZZ555555555555655666666676777788878888888988MLM99999999:9::;;;;;;;;;<;;<;<<<;<<<<<<<==<=<===>=>=>>>>>???RRR???@?@@@@@@@@A@ABABBBBABE9EE=>>>>????????RRR???@@@@@AAAAABABBABBBBBBBCBBBBE=EG9FDCD6k="3..16;AFLRW]djpv| Š3|H^YRFISHIQNNPPQPQQPPPQQQQQQQQQRSRSRSSRSRSSdddSSSTTSTTTTTTTTTTUTUVUTTUUVVVVVVVVWVVVVWVVVWWWWWWWWWWWWXWWijhXXYXYYYYYYYYYZYYYYYYZYZZZYZZZZZZZZ[[[[[555555555665666677767777888888888888998899MMM99:::9:;:;:;;;;;;;<<;<<<<<<=<==<====>==>>=>>=?>???????@@?SSS@@@@@@@AABAABBABBBBBBCCCCCCCCBCCCDDDECEH=FI;GFDF;aB/?=C BGMSY_elrx~Θ*~;yiI[WRFIRFHRLLPOPPPPPPPPPQQQQQQQQQQQRQRRRSSSSSQSSSSSSdddSSTTSTTTTUTTTTTUUUTVUUUUVVVVVVVVVVVWWVWWWWVWWWWWXWWWXWWXXhhiYYYYYYYYYYYYYYYYZZZYZZZZZZZZZZZ[ZZ[ZZ\[IIIIIIIJKJIJKJJKKKKKKKKLLKLLLLLLLLLLMMMMMMWWWNNNONONNNNOOONOOOOOPOPOPOOOOOPQQQQQQQQQQQRRQRQRRRRRRSRRSS]]]TSSTTSTTTTUTUUTUUUVUVVVVVVVVWVWWVWVVXWXXXXWXWXWX[RY\PY]OYe_bTiYM}ZE[7Y+Y#[^bfkps v(x2xAvMrTxk]dblaecWZcX[a]^`aaaaaabababbbbacbbabcbcbbccccccccccdcdddcddddddmmmddeeeeeeeeeffefgffgggfgggggggggghhhhhgghhhhhhhhhhihhiiiiiqqqjjjjjjjiijijkjijijkjkkkjkkkkjkkkllkllkk556566676767777777887888888888889999999;99NMN;:::;;;;;;;<<<;<<<<<<<<<<=<<<=====>=>>>>>???>?@??@?@@@@@@SSSA@AABAABABABBBBCBBBCCCCCDCDDDCDDDEEDEEEEEEEEEFFFFFFFFFGGGYZYIDGJAHK@HK?GL@HL@HLAHLAINAHOCHNCHOCIPCIPDIPDIQDIPEIPIKOLL_``NNNNONOPOPPOPPOPPPPPPPPPPQQQQQQQQQQQRSQRRRQQSSSSSSSSSSTSTddeTSTTTTUUTTUTUUVVUTVUUVVVWVVVWVVVVWWWWWWWWWWWWWWXXXXWXXYYXjjiYYYYYYZZZYYZZZZZZZZZZZZZZZZZZ[[[[[\\]\\5666667767778878788888888889889989999:::::NON;;:;;;<;;;;;<<;<<<<<<==<=======>>>>>?>>????????@??@@@@@@@SSTAABBBBBBBCBBCBCCCCCCCCCCDCDDDEEDDEEEFEEEEFFEFFFFGFFFGGGHHZ[ZHHHHHHHIIHHHIIIIIIIKKIKJJJKKKKLKKMLMMKMMMLMMMMMMNMMNNMNNN```OOOOONPPPPPPPPPPPPPQQPQPQQQQQQQRQRRRSRRSRQSRSSSSSSSSTTTTTeeeTTTUUTUTTUUVUUVVVVVVVVVVVVVWVVVWWWWWWWWWWWXXXXXXWWXYXYYYXijjYYYYZZYZZYZZZZYZZZZZZZ[Z[\Z[[\Z\\[\\\]]766667777777878877888888898999999::9:;;:::NNN;;;;;;;;<<<;<<<<<<=<<======>>=>>????>????@@???@@@@@@@@@@AUTUABBBBBBBBBBBCBBCCCCCDDDDEEDEEDEEEEEEEFFFFEFFFFGGGGFGGFGHHZ[[HHHIIHIHIIIIIIJJJJKKJJKJKKKKLKKLLLMLMLMMMMMMNMMMMNMNNNNNN``_POOPOPPPOPPPQPPQQPPPQQQQQQQQRRQRRSQRRSRSSSSSSSTSTSSTSTTTTeeeTUTUUUUVVVUVUUUVVUVVVWVWWVWWWWWWWWWWXXWXXWXXXYYYYXYYYYYYYjjjYYYYZZYZZZZZZZZZZZ\[\Z[[\\[\\[\]\]\\]\\676J777777878888888888988999999:9::9::;:;;;OOO;<;;;;;<<<<<<<<<<<<=====>>=>?>>>>?????????@@@@@@@@@ABAAABTUTBBBBBBCBCCBCCCCCCDDDEDEDEEEEEEEFFFFEFFEFEFGGFGGHGFHGHGHHHZ[[IHHIIIIIIJIIJJJKJJJJJKKKLKLKMLLLMMLMMMMMMMNNNNNNNNNONNNNO`a_PPOOOPPPPPPPPQPQPPQQQQQQRRQRRRRQRQRSSSRSSSSSSSSTTSTTTTTTTeeeUTUUUVUVVVVVVVVVVVVVVVVVVWVWWWWWWWWWYWWXYXXXXXYYXYXYYYZYZjjiYYYZZZZZZZZZZZZZZZ[[[[Z\\[[]\Z\\\\]]]]]777 777787878888988899989999:9::99::;;:;;;;OOO<<<<<<<<<<<<=<<======>==>>>=?????????@@@@?@@@@@@AAABAABABUUUBBBBBBCCCCCCCCCDDDDDEDDEEEEEEEFEEEFFFFFFGGGGGHGFHGHHHHHHH[[[IHHIIIJIIJJJIKKKJJKKKKLLLLLLLLMMMMLLMMMMNNNMMNNMNNNONNPOO`a_OPOPPPPPPQQQPQQQQQQQQRRQRRRRRRRRSSSRSSTSSSTSSTTTTTTTTTTUTeffUUVUUVVVVVVVVVVWVVVVVWWWWVWWWWWXWXXXXXXXXXYYYXYYYYYYYYYYZjijZZZZZZYZZZZZ[ZZ[Z[Z\\\][\\[[]\[]]]]]]]]Z877o887888888998999999999;9:::;;;;;;;<;;OOO;<;<<<<<<<<<=====>==>?=>>>>????????@@@@@@@@@@@A@AAABBBBBBUUUBCBBCBCCCCCCCDDDDDEEEEDEEEEEFEFEFFFFFFGHGHHGFGHGHHHHHHIHH[[[HIIIIIJIJJJKJJKKKKLKLLMLKMMLMMMMMMNMMNNNNMNMMNNNNNOOPNOOObbbPPPQPQQPPQQQQQQQRQQRQQQRRRSSSSSSRSSSSSSTSTTTTSTTTUTUTTUUUfffUVUVVVVVVWVVVVVWWVWWWWVWVWWXWWXWXYWYXXYYYYYYYYYZYYYYYZYZYjkjZZZYZZZZZZZ[Z[[Z[[[\[]\Z]\[]]]]]]]]]]]]8788888888889999999:9::::::::;;;;;;;<;>>>>>>>>?>>???@???@@@@@@@@AAABBBABBBBBBBBVUUCCCCCCCDDDCDEDEDEEEEEEEEFEEFFFFFFGFFGHGGHHHHGHHHHHHHHIIII[[[IIIJJKKJKKKJKKKLKLMLMLLLMLLLMMMMNMMNNNMNNMNNNNONOOOPOOPOObbbPPPPQPQQPQQQQQQRQRRRSRSSSSSRSSSSSSSTTSSTTTTTTTTTTTTUTTUUVfffVVUVVVVVVVVVVVVWWVWWWWWXXWWXYYXWXYYYYXYYYYYYYYYYYYYZZZZZZjjjZZZZZZ[ZZZZZ[\[[[[\\[]]\]]\]]]]]]^]]s898W889899999999::9;:;::;;;;;<;;;;<<=>>>>>>>>????????@@?@@@@A@AA@BABBBBBBBBBBCBBVVVCCCDDDDDEDDDDEDEEEFEEEFEFFFFFFGFFGHGGGFGHHHHHIHHHIIIIIIII[[\JJJKJJKKKKKKLKKMLMLLLMLLMMMMMNNNMNNMNNMNNNOONOPPPOOPPPPPPbbbQQPPQQQQQRQQQQQSQQRRRSSRRSRSSSSSSSSSTTTTTTTTTUTTTUUTUUVUVgffVVVVVVVVVWWWVWVWWWWWWWWWXXXXYXXXXXYYXYXYYZYZZYZYYZYZYZZZZkkjZZZZZ[\[[\Z[\\\\\\\\]]]]]]]]]]]]]]]]9999999::;::::::;;;;;;;;<<;<<;<<=>?>=>?>>>?????@?@@@@?@@@@A@@@AABABBBBBBBBBBCCCVVVCCCEDDEDDCEDDEEEEEEEEFFFFFFGGFGHGGFHHGGHGHHHHHHIIIIIIIIII[[\JJKKJKKKJLKKKKLKMLLMMMMMMMNMMNNNMNNNNNNNONOPOPPPPPPPPPPPPbbcPPQQQPQQQRRRSRQRRRRRSSSSSSSSSSSTTSTTTSTTTTUTUUUUUVVUVVVVVgggVVVVVVWWWWWWWWWVWVWWWXWXXXYXYXYYYYXXYYYYZYYYYYYZZZZZZZZZZkkkZZ[ZZZ\\\][Z\[[]]\]]]]]]]]]]]]]^],9999:9::9;:;;;;;;;;;<<;;<<<<<<<<>>>?>???>??????@?@@@?@@@AAA@AAAABBABBBBBBCCCCBCCCVWWDDDDDEDEEEEEEFEEEFEEFFFFFFFGGGGHGHGGHHHIHHHHIIIIIIIJIIJIJ[][KKJKKKKLLLLMLKLMMMMMMMMMMMNMNNNNNNNNNOOOOOPOPPOOPPPPPPQPQbbaQPQQQQQQQRQRRRRSSRSSSSSSSTSTSTSTTTTTTTTTTTTUTUUUUVUVVVVVVgggVVWWVWWVWWWWWWWXXWWXXWWXXYXYXXYYYYYYYYYYYYZZYYYZZYZZZZZ[ZkkkZZ\Z[[\\\\]\\\]]]]]]]]]]]]]]]^E99::::;;;;;;;<;;<<<;<<<<<<<<<=>?>>=>?>?????@?@@@@@@@@@AA@AAAABBBBBBBBCBBCCCCCCCCDWWWEDEEDDEEEFEEEFEFEFFFFFFFFGGGGGGHGHHHHHHHHHIIIIIIIIIJIIJKK\]]KKKKKLLLLMMMMLLMMMMMNMNNNNNNNNNNNNOOOOPOOOPOOPPPPQPPQPQPQcbbQQQRRRRRRQRQRSRSSSSSSSSSSSSTTTTTTTTTUTTUUUUVUVUUUVVVVVVVVghgVVWWWWWWWWWWWWWXXYXXXXXYXXYYYYYYYYYYYYYYZZYZYZZZZZZZZZZZ[kkk[[\\\[\\\\\]]]]]]]]]^^]]^]^3;;;Y;;;;<<<;<<<<<<<<<<<==QQP>===>>>>>>?>??????@@?@@@@@@@B@ABABABBBBBBBCBBCBBCCCCDCDDDXWXEEDEEEEEEFEEFFFFFFFFFGGGFHGHHGHHHIIHHHHIIIIIIIIIJJIIJJKJJ]]]KKLLLLLLLMLMMMMMMMNNMNMNNNNNNNNNOOPOOOPPOOPPPPPPPPPQPQQQQcbcQRRRSRSSRRRSSSRSSSSSSTSTTTTTTTTTTTTUTUUUVUVUUVUVVVVVVVVVVhggVWWWWVWWWXXXXXWWXYXXXYYYYYYYYYYYYYYYYZYZZZZZZZZZZZZ[[Z[[Zkkk[\\\]\\\]]\]]]]]]]]]]]]]<<<;<>>>????????????@@@@@@@@A@AAAAAAABBBBBBBCBCBCCCCCDCDDDDDDXXWEEEEEEEFEEFEFFFFFFGHGGGGGHHHHHHHIIHIIIHIIIIJIJIJJJJJKKKKK^]^LLLLLLMLMMMMMMMNNMNNNNNNNNNNOOOOPOPOPOPPPPPPPPPPQQQQQQQQQdccRQSQQRRSSSSSSSSSSTSSSTSTTTTTTTUUTUUUUUUVVUVVVVVVVVVVVVVVVhghWWWWWWWWWXWYYXYWXXYYXYYYYYYYYYYZZYYYYZYYZZZZZZZZZZZ[\Z[[[lkk]\[]\]]\]]\]]]]]]]=<<< <==QQQ>>=??>?????@@?@@@@@@@@@ABBABAABBABBBBBBCCCCCCDCCCCDCDDEEEXXXEEEEFEFFFFFEFFFFGFGGFHGGGHHHHIHHHIIHIIHIJJJKJKJKJJJKKKKKK^^]LLLLLLLMMMMMMMNNMMNNMNNNOPNNOOOPPOPPPPPQPPPPPPQQQQQQQQQQRcccRQQRSRSSSSSSTSSSTSSTTTTTTTTUUUVVUUUUTUUUVUVVVVVVVVVWVVWWWhhhWWWWXXYXXXXYXXXXXYYYYYYYYYYYYYYZYZZYZZYZZZZZZ[ZZZZZ\[[[Z[llm][\]\\]]]o]]],?(@ % $$#+++ !!"""""""""""########&&&--.###$$%%%%%%%%%%&&&&&&&&&***111'''(((((())))))*********.-.544+*+,,,,-----...////0///0333:::000122222333444445555555888>?>566777888@ Y $$$+++ """""""""#""#########'&'...###%%%%%%%%&&&&&&&&&&'''***111'''))())))))*********+**...555+++------...////0/000000344:::111222333444445555555555888???676888888999 L !!! !$$$+++!!!""""""""#######$$$#$#'''...$$$%%%&%&&&&&&&'&'''''''++*111'''))))))******++*++++++///556,+,---.-.//////000000100444;:;111433444454555555555555999@@@77788899999:::;  ! !!!!!!!!!$$$+++!!!"""#""######$##$$$$$$(''/..$$$%%%&&&&&&&'&''''''''(+++222((()))*******++++++,++++///666,,,...//////000000111111444;;;222444454555555555665776:::AA@77799999::::;;;<<<= !!!!!!!!!!!!%%$,,,!!!#"########$$$$$$$$$$$'((///$$$&&&&&&'''''''''((((((+++222(((******+*+++++++,,,,,,00/766---//////000000111111111555<<<333454555555555666766777::;AAA878:9:::;;;;<<<<<< $$$+++ ""!""""""############'''...$#$%%%%%%&&&&&&'''''''''+++122&((%*($+)#+($,(%,)',)),*./.677--,...//////00/000101111454<<<322444444444554666666766:::AAA777:9:::::;;;;;;;;+***+++++++++,+,,+...444+,,------.........././//111777///000000101211221/32)42(852=:423B06N/:U.=V.@Q0@H2>;583;63C8-:15:69999:::::;;:;;;<<>>>>>>>?@??@@@AAAAAACCCIIIBBBDDDDDDEEEEEEFFF$$$$$$$$$$$%%%%%%%(((/./%%%'&&''&''''''(((((((((+,+222()(******)++",,.,4*+`"+1; BO[gs| wq$[D/?+6,)6+252555666766:::@@@777888888:99:::;::;;;;;;>>>DEE==<>>>??????@@@@@A!!!!!!!!!!""""""""&%&---"""$$#$$$$$$$%%%%%%%%%%%)))000&&%&''**"))V#%/9CNYeq~p"d414'5(141444877>>>444555667777777888888899<<=CCD:;:<<<<<<===>=>>>?!!!"""""""""#"""##&&&---"##$$$$%$%%%%%%&%%&&&&&&))*000'( ))a  #,6CO\hv z645*7*888>>>545677778888888999999:::=>>DDD;;;<=<===>>=??>???"""""""""##"######&'&.--###$$$%%%%%%%%&&&&&&&&&&)**$24D#!   *27 8 8}:{?J ] x j'h-;-;?;655778888888999999:::;;;>>>EEE;;<===>>=??????@@@""""""#""#########'''...###%%%%%%&%%&&&&&&'''"'(!*+(  U-   !"/"*SCk B>B/8/889888998999;::;;;;;;???EEE<<<=>=??????@@@@@@"""##########$####'''...$$#%%%&%&&&&&&&'&& '((('$  R !!!#$#"'$ *#."'0)R+L K1M/;.999999:::;;;<<;<<>>?@?@@@@A@BABBBB#########$$$$$$$$$(((///$$$&&&&&&''&!&(/)&; 9/'  $$$+++222666999999666333///...000555989<<<8B81<;<<<<<<<===@@@GGG>>?@@@@@@ABBCBBCCC""""""##"########$'''...$$$%%%%%&"%'&''F KA9/i %%%444???FFFIIIKKKLLLNNNPPPRRRSSSQQQLLLBBB::::::???CCCEGE>O>m@o L5Q6=4;;<<<<<<=AAAGGG>>>@@@@AAAAABBBBBB---..-....../../..111776///000001%-3K^RK@V! &&&888CCCEEEFFFFFFHHHJJJKKKMMMOOOQQQSSSVVVXXX[[[XXXMMMCCCEEEJJJNNNIWHeMgEDEDGBFFFGGGJJJOOOHHHJJJJJKKKKKKLLLL&'''''''''((((((((++,222)((***&-pCpe^SY' 333AAACCCCCCEEEFFFHHHJJJKKKMMMOOOQQQSSSUUUWWWYYY[[[^^^aaa\\\OOOMMMRRRVUVR]QiTn:D5AAABBAEEDKJKCCCEEEEEEFFFFFFGGG$$$$$$%%%%%%%%%%%%)))000&&%!$(8/$wzpkv6 !!!;;;BBBAAACCCEEEFFFHHHJJJKKKMMMOOOQQQSSSUUUWWWYYY[[[]]]```aaaeeeeeeZZZTTTYYY]]][gXvRW.q:B5??@CCCIIIAAABCBCCCDCDEEDEEE$$$%%%%%%%&&&&&&&&)))000&&&"*eS ###===AAAAAACCCEEEFFFHHHJJJKKKMMMOOOQQQSSSUUUWWWYYY[[[]]]```aaacccfffhhhjjjaaa\\\aaaeeeco_@ @?A?A>DDDJKJBBBCCCDDDEEEEEEFFF%%%%%%%&&&&&&&&&&&***111"(MMMMEDEFFFGFGGGGHHHIII&&&&''''''''((((((*++-.3ɥ ,'444CCCCCCEEEFFFHHHJJJKKKMMMOOOQQQSSSUUUWWWYYY[[[]]]```aaacccfffgggjjjlllnnnppprrrtttvvvxxxzzz|||zzz}}}a"NLHGAWMOJEEEGGGHHHHHHIIIIII&&&&&&&&&'''''''''%&,IE. AAACCCEEEFFFHHHJJJKKKMMMOOOQQQSSSUUUWWWYYY[[[]]]```aaacccfffgggjjjlllnnnppprrrtttvvvxxxzzz|||~~~kM??;D2NQDEEEGGFGGGHHHHHHIII010001111121222222+,8wo+q ---FFFEEEFFFHHHJJJKKKMMMOOOQQQSSSUUUWWWYYY[[[]]]```aaacccfffgggjjjlllnnnppprrrtttvvvxxxzzz|||~~~zo52->%WZKOOOPPPQQQQQRRRRSSR***++*++++++,,,,,,"#2 NI:::FFFFFFHHHJJJKKKMMMOOOQQQSSSUUUWWWYYY[[[]]]```aaacccfffgggjjjlllnnnppprrrtttvvvxxxzzz|||~~~4$#0RTLJJIKKKLKLLLLMMMNNN''((((((()(())))))!".)(BBBGGGHHHJJJKKKMMMOOOQQQSSSUUUWWWYYY[[[]]]```aaacccfffgggjjjlllnnnppprrrtttvvvxxxzzz|||~~~>)" OOTHHEIIIIIIKKJKKLLML(((((())))))***))*''-$$$GGGIIIJJJKKKMMMOOOQQQSSSUUUWWWYYY[[[]]]```aaacccfffgggjjjlllnnnppprrrtttvvvxxxzzz|||~~~K@ LJ`JJDJJJKKKLLLLMLMMM)(())))*))*****))+++, )))JJJJJJKKKMMMOOOQQQSSSUUUWWWYYY[[[]]]```aaacccfffgggjjjlllnnnppprrrtttvvvxxxzzz|||~~~UR IHiKKCKKKLLLMMMMMMNMN))))))*******+*))+--+ ---LLLKKKMMMOOOQQQSSSUUUWWWYYY[[[]]]```aaacccfffgggjjjlllnnnppprrrtttvvvxxxzzz|||~~~[ZGFmLLDKLKMLLMMMNNNNNN))**********+++*),--, ///MMMMMMOOOQQQSSSUUUWWWYYY[[[]]]```aaacccfffgggjjjlllnnnppprrrtttvvvxxxzzz|||~~~Y[HHnMMEMMMMMMNMNNNNNOO******++*++++++**,++- ///OOOOOOQQQSSSUUUWWWYYY[[[]]]```aaacccfffgggjjjlllnnnppprrrtttvvvxxxzzz|||~~~OU JLjNNFMMMMMNNNNOOOPPO******++++++,,,++,)(0  """"---OOORRRSSSUUUWWWYYY[[[]]]```aaacccfffgggjjjlllnnnppprrrtttvvvxxxzzz|||~~~=J  OPaNMINNNNNNNOOPPPPPP)))******+++++++++%#238$%%%+++NNNTTTUUUWWWYYY[[[]]]```aaacccfffgggjjjlllnnnppprrrtttvvvxxxzzz|||~~~#<&TTULLJMMMNNNONOOOOOPP4445445555556666660.='Ra()))***IIIWWWWWWYYY[[[]]]```aaadddcccbbbhhhlllnnnppprrrtttvvvxxxzzz|||~~~ 3'$7_^TUUUVWVWXWXXXXXXYYY...//////0//000000-+6`m.t+,,,---@@@YYYYYY[[[]]]```aaadddaaavvv|||lllppprrrtttvvvxxxzzz|||~~~q44/+B\YMPPPRRRSSRSSSSSSTTT+++,,,,,,----...../.3BF6 (%-../111999WWW\\\]]]```aaaddd```{{{jjjrrrtttvvvxxxzzz|||~~~Ko?@<=K{ZWOOOOPPPPPPQQQQQQRRR,,,------...//////22340;>J).,3555777NNN______aaaddd```zzz~~~oootttvvvxxxzzz|||~~~bMLHNPXYWUOOOQQPQQQRQQRRSSSS-,----...///////0/3333.=Yxc.(9998;;;CCC^^^bbbdddaaazzznnntttvvvxxxzzz|||~~~ta\X RVRHXXXPPPQQQRRQSRRSSSTSS---...//////00000043387;6:.<@6;8=???BBBRRReeecccwwwmmmtttvvvxxxzzz|||~~~1mid>SvVRKXXXPPPRRRRRRSSSTTTTTT...//////000000000444;;;+$4b\;2DCCCFFFJJJ^^^dddmmmtttvvvxxxzzz|||~~~r{wgROKSSRYYYQQQRRSSSSSSSTTTTTT////0/000000111111444;;;0-3;D0|~woJc8E>IJJJMMMSSScccmmmtttvvvxxxzzz|||~~~;\TNGSSSYYYRQQSSSTSSTTTTUTUUU///000000111111111555<<<3330(8SvlgZJKJNJORRRUUU[[[gggllloootttvvvxxxzzz|||~~~AzTNJQPPTTTZZZRRRTTSTTTTTTUUUVUV//////000000101111555<<<322315444\ e\UN!SHWVTVYYY\\\bbbnnntttvvvxxxzzz|||~~~cEYhSNJPPQTTTZZZRQRSSSSTTTTTTUUUUU999::::::;;:;;;<<>><5@Ea5ZSKCJ-[N_^\^aaaeeehhhqqqxxxzzz|||~~~p8x^TNYYZZZZ\\\aaaZ[[\\\\]\]]^]^]^^^434444444555665666:99@@@7778888987,=A#KC<2F1eXgfbghhhllloootttzzz~~~oWNJTSSUUUUUUXXX]]]UVVWWWXXXXXXYYYYYY111111222323443444777>>>4445556667677-;=;4,"<,hihpeqpppssswwwzzz~~~]PRRSPNRRRSSSSSSVVV\\\TTTVVUVVVVVVWWWWWW221222333444444555888>>>55477777788886991;6,&$_]{j{ztyzzz}}}9MWXTNLRSSSSSSTTTSSVVW]\\UUUVVVVVVWWWWWXWXX222333444444555555888>>>65577788888899996::1=1 =I>=>&$ (6 I])n1z3݄, #K\\XJIYYYRQQSSSSSSTTTTTTUUUVVVVVVYYY^^^VVVYXWYXYYYYYYYZZZ555555555665767777:::AAA788999::;;;;<<<<<<<=====A@@GGG?>>?@?B>>>>>???@@@AAAAAADDDIIIBBBCDDDDDEEEEEEFEFFFFGGGJJJOOOHHHJJJKJKKKKMILPBOPEOIYL>|K3O$QV^ g r{Ճ#Ƈ1BwMhaYRS\MOZSUYXXYYYYYYZZY\\\aaa[[[\\\\]\]]]^^]^^^^^__^_aaaeff__`a``a`aaaabbbbcb889999::::;;;;;;;;>??EEE===>>>??????@@@A@@AAAABBEDEKKKCCCEDDEEEFFEGFGGGGHGHJEINDLVGRM?ILDJJHJIKJJLKMKLPJLSFKWHM\OSRLMRRQRRRSSSSTSTTTUUTUUUXXX]]]VVUWWXXXXXXXYYYYYYZYYYZZ]\]bbbZ[[\\\\\\\]]]]^^^_666777878888989989<<=>?>??????CCCJJJAAACBBCCCDDDEEDEEEEFFFFFJJJPPPHGHJHIKIJKIKLJKMKLMLMMMMPPPVVVONNPPPQPPQQQQQQRRRSSSSSSVVV\\[TTTVUVVVVVVVWWWWWWXXXXXX[[[```XYYZZZZZZ[[[[\[\\]777e888888999:99:::>>>DDD;;;=<<===>=>>?????@@@@@@DDDJJKABACCCDDDEEEFEFFFFGGGGGGKKKQQQHHHJJJKKKLLLMMMMMMMNNNNNQQQWXWOOOQQQQQQQRRRSRSSSTSSTTSVVV\]]UUUVVVWWVWWWWWWXWXYXYYYY[[\aaaYYYZZZ[[[\\[\]]]]]888888999999:::;;;>>>EDE;<;===>>>?>>@??@@@A@@ABAEEEKKKBBCDDDEEEFFEFFFGGGGHGHHHKKKQQQIIIKKKLLLMMMMMMNNNNNNOOORRRXXXOPOQQQRRRRSSSSSTSSTTTTTTWWW]]]UUUVWWWWWWWWXXXYYYYYYYYY\\\aaaZYY[[[\\\]]]]]]]]]#999(9:9:::;;;;;;??>EEE<<<>>>??????@@@@@@ABABBBEEELLKCCCEEEEEEFFFGGFHGGHHHHHHKKKRRRJJJLKKLMMMMMNNNNNNOOOPOPSRSXXXPPPRRQSRRSSSTSTTTTTTTUUUXXX^^^VVVWWWWWWXXXYYYYYYYYYYYY\\\aabZZZ\\\]]]]]]]]]W:::';;;;<<<;????@@@@A@ABBBBBBBBFFFMMMDDDFEEFFFGGGHHGHHHIIIIIILLLSSSKKKMLLMMMNNNNNNNOOPOPPPPSSSYYYQQQRRRSSSSSTTTTTTTUUUVUUXXY^^^VVVWWWXXXXYYYYYYYYZZZZZZ]\\bcb[[[]]]]]]]]^J<<<<<>>???@@@AAAAAABBBCCCCCCFGGMMMDEDFFFGGFHHGHHHIHIIIJJJJMMMTTSKKLMMMMNNNNNOOOPPPQPPPPPSSSZYZQQRSSSSSTTTTUTTUUUUVVVVVYYY^^^VVVXWXXXYYYYYYYZZYZZZZZZ]]]dbb\\[]]]^]^(0` B !!!)))!!!"""""""""###""")))((($$$%%%%%%&&&&&&'''///''(((()))))*******0000/0,,,---...///000111888111222333444555444::::::777888[ ` !! !!!)))!!!""""""#########)**)))$$$%%%&&&&&&'''(((000((())))))*********111000,,,...////00000111999212333444555555444;;;;;;777999::: 7 !!!!!!"""***""""""######$$####***)))%%%&&&&&&'''(''(((111)(()*)****++++++++112111---///000000110222:9:333444555555555565<<<<<<88899::;;;<=>???@@@@A@''''''''''('(((00/))))))******+*****000///,,,+--$//#0/=+.j$0:BP ^ ktwsy'`K0D.80,9.585988:::@@@::::::;;;<<=======CCCCCC@@@AAABABBCC !!!!!!!!""""*+*"""###$$#$$$$$%$$$+++***'("((\ )6EVgxs!h423(6)353<<<444656767777878788?????>;;;<<<===>>>"""""""""###$$#,,,$$$$$$%%%%%&&&&&&&)---.W '4AJTau u$q.7.7>7666788888999999:::@@A@@@<<<=>=?????@""""""######$$$,,,$$$%%%%%%&&&'&&&(.++  ]!5 !6,[Em M9M-:-888888999;;;;;;AAAA@@===???@@@@@@"""#######$#$$%,--%%%%%%&&&''&&):($# R  $ (!-!(0*W*P\-_.<,:99::;<<;;;;ABBABA>>>@?@@A@ABA#######$$$$$%%%---%%%&&&''&&)C*"4+ f!!!&&&)))***)))***---122/910?1k2i c+k1>/<;<<<<<<FFEFFEBBBCCDDDDFEE$$$%%%%%%&&&'''///#)J9!q:%:::CCCBBBEEEGGGIIIKKKNNNPPPSSSVVVXXX[[[^^^aaaccchhhhhh^^^^]^af`jfmZ+};C5GFFFFFBBBDDDEEEFFF%%%%%%&&&&&&'''///")wuE :::BBBBBBEEEGGGIIIKKKNNNQQQSSSVVVXXX[[[^^^aaadddfffiiilllnnnfffhhhksf{Xu A@AGHEGGGCDDEEEFFFGGG%%%&&&&&&'''((((+1L?!Ѕ333CCCBBBEEEGGGIIIKKKNNNQQQSSSVVVXXX[[[^^^aaacccfffiiilllnnnrrrrrrnnnrrrv~o}.wqN,FK>GHGEEEFFFGGGHHH&&&'&&''''''(((#'3ziO &&&BBBBBBEEEGGGIIIKKKNNNPPPSSSVVVXXX[[[^^^aaacccgggiiilllnnnqqqtttwwwvvvvvv|v{ie^QHLBIIHEEEGGGHHHIII&&&&&&''''''&'(210ܵ&#999DDDEEEGGGIIIKKKNNNQQQSSSVVVXXX[[[^^^aaadddfffiiilllnnnqqqtttwwwzzz||||||^ IFIC]IKDFFFGHHHHHIII++++++,,,,,,&(/WQ- $$$DDDEEEGGGIIIKKKNNNQQQSSSVVVXXX[[[^^^aaacccfffiiilllnnnqqqtttwwwyyy|||fH64F6OQDKKKLLLMMMNNM------......$%2y'~s 111GGGGGGIIIKKKNNNPPPSSSVVVXXX[[[^^^aaacccgggiiilllnnnqqqtttwwwyyy|||vj'$<(RTEMMMNNNOOOPPP''''('(((((),OL;;;IIIIIIKKKNNNQQQSSSVVVXXX[[[^^^aaadddfffiiilllnnnqqqtttwwwzzz|||" +MNCHHGJJJKKKLLL)(()))))****-55BBBJJJKKKNNNQQQSSSVVVXXX[[[^^^aaacccfffiiilllnnnqqqtttwwwyyy|||#NNIJJIKLLMMMMMN))))*)****+* -++!!!FFFLLLNNNPPPSSSVVVXXX[[[^^^aaacccgggiiilllnnnqqqtttwwwyyy|||" NNMKKILMMNMMNNN))*******+++! .,-$$$HHHOOOQQQSSSVVVXXX[[[^^^aaadddfffiiilllnnnqqqtttwwwzzz|||$PONMMKMMMNNNOOO***++*+++,,," /8<!%%%IIIRRRSSSVVVXXX[[[^^^aaacccfffiiilllnnnqqqtttwwwyyy|||$"RQLMMLNNNOOOPPP***++++++,,," 0Q[%&&&GGGUUUVVVXXX[[[^^^aaacccfffiiilllnnnqqqtttwwwyyy|||#0TSHMMMOONPOPPPP333434444544.,9m|,t))))AAAXXXXXX[[[^^^aaabbbdddjjjkkknnnqqqtttwwwzzz|||ly(%.B]ZMUUUVWVWWWWXX,,,,-,---...+*1KR2 %",---:::YYY\\\^^^aaaaaagggoooqqqtttwwwyyy|||Hi66=KVTJPPPQQQQQRRRR,,,---.../////0659 9@+0.4777SSS```aaaaaafffoootttwwwyyy|||_IGNR`USPPPPQQQRRRSSS---...///0000111,;g]1*;;;:HHHaaacccgggqqqssswwwzzz|||ub\TYTKTTTPPQRRRSSSTTS....//00000011164:=G,{>@:?=BDDDXXXdddqqqrrrwwwyyy|||-sm;U{YTMTTURRRSSSTTTTTT///00/000111222:::.'6bzYC8JJJJOOOaaarrrrrrwwwyyy|||fqROKVUTUUUSSRTTTTTTUUU////00000110222:::1.5:F0lk`Nw8ODTTTTZZZhhhnnnssswwwzzz|||>]wSMHVVVVUVSSSTTTTTTUUU444555555666888???8986-GI=9XpThZjhhhmmmttt{{{+UUUXUTWWW\[\[[[YYXZZZ[[Z[[[010111222333444<<;454555638897<4'' TOtdutptvwv{{{" I\bTNKRRSRRRXXXXWXUTTVVVVVVVWW222333444555555=<<66677788882:9?8/ ;8s{ss}] GagVLJSSTSSSSSSYYYYYYVVVWWWWWWXXX334444555555565>>>7778888899:9;5<;<;)JNy{f"K\^VLJSSSTSSTTTTTTZZZZZZVVVWWWXXXYYY444555555565776???888989:99:;;<<;<7=C8D0+  !)DKdl~uWŤ4ܵ*YVUUMLSSSSTSTTTUUUUUU[[[ZZZWWWXXXYYYYYY555555555766888???8889:9;;:<;<<<<<<>=??????@@@GGGBBBCCCCCCDDDEEEEEEKKKJJJHHHJIJLEKO@NMIMDdJ;N,P!V`j!t,y>>??????FEFFFFBBBCCDEEEEFEGEGIBHSFPM=HN?HNAIPBIQCIRBHWINUMOQNOQQQQQRRRRSSSTTT[ZZUUUVVVWWWWWWXXXXXX]]]]]]YYY[[[[\[]]]777888899999;;;CCC<<<======>?????@??FFFFFFBCBDDDEEEFFFGGGHHHOOOIIIJJKKLKMLMMMMMMMSSSSSSPPPQQQRRRSSSTSTTTT[[[VVVVVVWWWWWXYXXXYX^]^]]]YZZ[[[\]\]]]888"899999:;;<<=>>>?@@?A@@AAAGGGGGGCDCEEEFFFGGFHHHIIIPPPJJJLKLMMMNNNNNNNNNTTUTTTQPQRRRSSSTTTTTTUUU\\\VVVWWWXWWXXXYYYYYY^^^^]][Z[]\\]]]]]]?999<;;:;;<<<?>?@@@@@AAABBBBBBIIHIIIEEEGGFGHHIHIIIIKKKRRRLLLMMMNNNOOOPPPPPPUUVUUVRRSSSTTTTUUUVVVWWW]]]WWWXXXYYYYYYZZZYYY______]\]]]]:( @ ^ &&&""""""######)))%%%%%%&&&&&&,,,))))))******100------///000666222333455555;::888888t \ '''####"#####$#)**&&&&&&&'&'''---*)))*)++++++111...///000000767444445555555<<<999999;;;r!!!""""""((($$$$$$%%%%%%+++''''''((($))$1..).(/( /&(6-+2,010211222999666666666877>>>;;;<;<===&&&&&''''---))))))******000,--"/.%/.C*-q%5?M[`y(]O/F/71,:-786>>>;;:;;;<<<===BBC@@@AAABBB!!!""""""((($$$$$$%%%%%%%,- ))`  3Kc} s"k0502<2766777888999??@=<<===>>>"""##"###)))%%%%%%&&&&(A*(  &j)P*P1iEl Z2Z-;,888:::;;;AAA>>>???@@@#"#######***&&&&&&%)U)" R  #)(/*]+Vn(t/=-;;;<<>>BBBCCC???9:91=3:E:.i)w4@1>=>DDDAAABBBCCC)))******000'*-<2*^Wr)---???GGGJJJMMMQQQUUUYYY[[[SSSJLJEWD@S8_?F;IIIGGGHGGIII$$$%%%%%%+,+#*dC 555DDDFFFHHHKKKOOOSSSWWW[[[```fffddd[[[YhT?=@;EFDCCCDDDEEE%%%&&&&&&$'.VC {555DDDEEEHHHKKKOOOSSSWWW[[[___dddhhhmmmmmmijhnui$S,~DK=EEEEFFGGF&&&''''''"%/aH +++DDDEEEHHHKKKOOOSSSWWW[[[___dddhhhlllpppuuuuuuw|qzdiWHKCFFEGGGHHH'''(((%&)97, >>>FFFHHHKKKOOOSSSWWW[[[___dddhhhlllppptttxxx|||~}XAJBbHJCIIIJJJ--,---%&/a\* '''GGGHHHKKKOOOSSSWWW[[[___dddhhhlllppptttxxx|||[B$D7OQDNNNOPO(((()(+zx} 222KKKKKKOOOSSSWWW[[[___dddhhhlllppptttxxx|||kc 4*MN>KKKLLL))))**-gh :::NNNOOOSSSWWW[[[___dddhhhlllppptttxxx|||vu'$PP@MLMNNN***+** .ek>>>RRRSSSWWW[[[___dddhhhlllppptttxxx|||vw%)RQBNNNOOO+++,,,#!/oy"y#===VVVWWW[[[___```ggglllppptttxxx|||dm.8SRDOOOQQQ000111,+4V`. )999YYY[[[___```yyysssoootttxxx|||C^%=JXVKUUTUVV,,,---,,/9;348,437WWWaaa^^^qqqxxx|||ZBKQeRQLQQQRRR---///000/*9rW~#5->MNMbbbpppxxx|||ufXXTMRQQRRRTTS///000000408BU+q DHAIEJ^_^nnnxxx|||%;Z~YSMSSSSSTUUT0011112229892*9ViRRGVZWZiiiqqqxxx|||OTOKWWVUUUUUUVVV666677888>>>:7<;?9M CG.eWgjdjsss|||_N]dYTQ[[\YYYZZZ[[[111333444:::6766.99R14"7+ltm~n~|L@kwVMISSSXXXVVVVVVWWW333555555;;;888898:0<8T4! PS~k AouWKISTTTTTZZZWWWWWWXXY555555565<<<999:99;;;=4>@G@! '-PMqbdTȚ5ݬObbWKJSTTTUTUUU[[[XXXYYYYZY666666777=>>;:;<<<====>=E@ED6E8a8(&3Je @urUIIYRRTUUUUUVVVWWW\\\ZZYZZZZ[[;;;<<<===CCB@@@AAABBBCCCIIIGGGJAIM>KHOIArL4O*V+b5jEzjP\YYKLYNOWVV[[[YYYZZZ[[[[[[```^^^^^^___777888999???<<<===>?>???FFFCCCDDDEEEGDGOFMN@IO@IQBJQCIVLORNOQQQRRRSSSXXXVVVVVVWWWXXX]]]ZZZ[[[\\\888H999;;;AAA>>>???@@@AAAHHGEEEFFFGGGHHHNNNLKLMMMNNNOOOUTURRRRRSSTTTTTZZZWWWWWXYYYYYY^^^\\\]]]]]]\;;;H<<7>4;3<;<@A@>?>@@@$$$$%%**)$'(&'(: *k %,*2648;95<8,;/0>1}1{ @:A:?9CCCAAACCC((((((--- (.R\M" -..AAAIIINNNSSSXXX[[[UVUEUDnKs>E:GGFFFFGGG$%%%%%!%,XB s?444EEEHHHLLLQQQVVV[[[aaahhhhgh^kY~LV,zBI<+zg@@@HHHLLLQQQVVV[[[aaaggglllrrrwww|||yr\?IAeJLEKKK+**"#-c_%B? !)IIILLLQQQVVV[[[aaaffflllqqqwww|||$>4NOBNNN))(,st**--2NNNQQQVVV[[[aaaffflllqqqwww|||-*OP@MMM***! -nt-.227SSSVVV[[[```ggglllrrrwww}}},0QQBOOO/..)'1Zc*FO0.8XXX\\\^^^hhhmmmqqqwww|||%:DVTISSS.--,+/=A1i-'8YYY]]]}}}sssvvv|||d}>JPhTRMSSS...////)7y:7;NLOzzyttt}}}&{\WSMRRQTTS0000003.8BY,vT&L?Sssssss}}}c<]}YSMSTTUUU455666;;;7.=IJN?gUiqnq|}|w ZQMZZYXXXZZZ22244499875872:5B=wuxx`RRRURQXXXVVVXXX444555:9:999:6:<6=* LZr}[Ư $SRQUPOUUUZYZWWWYYY666777<<<;;;<<<><>F8G6c5#AgƳ?wuZMMVSSUVVWWW[[[ZYY[[[:::;;;@@@???@@@BBBGGGH?HK=JFUI=uL0Q1^?{fN`\WKLXMNYYYYYYYYYZZ[__^]]]^^^888999>>>===>>>@@@FFFDDDFEFJEIOELOBJQDJTJMTOPRQRSSSXXXWWWWWWYYY]]][[[]]]999;;;@@@???@@@BBBHHHFFFGHHKJJNNNMMMNOORSSTTTSSSUUUYYYXXXYYYZZZ^^^]]]^^^AAAAAAAAAAAAAAAAAAAAAAAA(  ~#########'''$%%#+),( -&(0+-.-333444555999999###''''''(''",,%**P'.q!>>>>>"""&&&&&&&)^$ #=_ o(n/<-:;:??????$$$(((%*|1 `  ,(&3,353u,o 6A2BBBBBB''&"',[>"]4 /1CEDNNNVVVZ\[N]NfTg\.uBH=FFF$%%"%*ȉ hF'0HHHLLLSSS[[[dddnmnmwg{ViDGBFGE$%+IE(շ$$AADLLLSSS[[[dddlllttt}~|KE540PPC#"-_f#'&1UUVYYYaaalllttt}}}6A27SSG+)/DK-9:1VUYtttrrr}}}NCLmUTN.../*5tX%UI]zzzlhUQNSSR333509A].QUvMvex|y|>c{[UPWXX3338877-<6z%" KKi¾/YNJXXXXXX666:::;;;?2A6d49.l0˾@xxZMKWWWZZZZZZ999=>=???AAAG?HH>HA^F5vL6y[Gg^UMMZPQXXXZZZ]]]]]]999t>>>???ABAFFFFFFMGLPELSGLUOPSRRWWWXXXYYY]]]]]]}AAAAAAAAAAAAAAAADisplayCAL-3.1.0.0/DisplayCAL/theme/icons/DisplayCAL-testchart-editor.icns0000644000076500000000000034556512647526530025756 0ustar devwheel00000000000000icnsuic08 jP ftypjp2 jp2 Ojp2hihdrcolr"cdefϣjp2cOQ2R \@@HHPHHPHHPHHPHHP @S ]@@HHPHHPHHPHHPHHPS ]@@HHPHHPHHPHHPHHPS ]@@HHPHHPHHPHHPHHPz(3A`[lw%p;R\V)zi?V. H0'(2hJ|٘k?0D \ʿz02B{.<޳h$J ЯG;pI)>(/HGcz"U(o2e ouz(`#52ZBx$=@ %Q(okA͙feB 6-Oz;q?yP%Eyk%b:;ƃE`A-5Nz!Tϼ}7s590^̙̾ {zh#L(~$QYbs4J^E1#'P#JMVsXK B\0$_Gx* V@*ŬEHʽ3WH6AyOfzΝ%zG?~H|4ÿa;kzˤŴŇd+ϧ(I}mT?@ fmDqjPm^Uޔ;HήsGߔ`@Py؄AV?LJnYd-Z*3//iRSm3獇crty6"x{|2șHDXb87ƋKOT&HgK/~v'^Y>O j-׈6J- ][@+CZyDK<G=GfM+/1}/+3W Bʇ9MbDTpZƞƜ^%|oQC޳ԝVɨI BP>x^B,Xx&Q ]#a(vEGOEO'=b[X9d-K1s:sgfӑdc00uSp䠑mHb/_ӏ!Vt+AٛĮt/ӰԏEKxÜߪ@JGKBpR7 -8_+_zy[wG1ƄnѤY_iVq C#Aƭe-yt]ЅB;oX[ b:KO+zd<#9($RJ!F *Q1v'ۼm!b+Εw/N^=6 Ї@=e(*4,$'~rEFÅ vn ӳϾ}5ǕF +[ /*O/R(d5XxZ,N oݒ 28r¬¨h7G6*'VP?I19&t^4}mۡR yS zY;*BlYY}9L5s J{֘Y$yBt p@9IPOɏ#*7vxć P50|>]Ngۮ(DVK6k4lګJ 1Ef@X !/NDbrMn\= Zj*\xf*чm"2%fx )k5@Ԥ=14<ԩP H PBnULW0˖ _腗faۍVm[=Z=7&ͧ`.FY"]FZ0>鿿@M1_?1!TO;_zU  )Byu~ YL?^@[* I):0"ÕRÌ_—BPjia OTy8QvtB0gX&L,nR[Ҫ8.zz憩AL9Q.8ߕІ,0$sZYQfc(v$58RD).g(#Fo{G<2Mm'љe֚k眜k1٩Pnb46 _kC`t*KKE8!0PU_*'R+mv*-y1e5%:iZc4%(cSkj 9*TtU~2go0xCrQzdN1}SjӍ>aB܌K+ÈF0Sx,ڳp%-__,c'Aif-H H=\v>~0e!S؟OeЀڎyGm! 5(e d"Gq#fF+ѴG~H릡Za{0G{g~A<(rb4aP}_kאy.2&$ڈa!q z=L/a Z /tHFƽؔ2ׅ4Ō&jx|2C@/`mԡyxnlapX[.7"'p1\vb'?j1]))r%%o]O{h"r g#ZTB Mn<ƣXK1Y+yBx*QB=!Iqc1L$ɐ<' HKNg_ſk5+i1zxsܸ>؄񩿆O*S&{T+;yX06qU:Q>)\0LKxX9ZVoIPN82%LIsG2+uދ-Eס3n'ḌV}O%¶)їȚ4]rA9;m j;[/S34D6]:_[`0nw!>ݤu}tيTFW_Gy0j`#za>36ʜﱈǝ Գbݵ q9MCd_bM8VD|ز7TCxqq/<%bߍ݉zdW=Q!CDGlӗɔ @gAS;s<"m?ԦUgM, ??ElI5jFL=Ň7SH\q:q*%sSt$9s;} /b9lUJy+,?8ۏŲnͣ].hv DykکNu&~~ R SvCa!'oXP HzYZ:C^kr{$J} zEoppwCD.,!谗ןIB}7(e6+ϼ.L`c;bM|zQ~NBS/WIO/F/znYE9k84mUab>.` 0ϼ}6 PA.!2?Cm]׳ʴs42r 4ьw⮀v)u^6xH5ATBVS ?Xy]PKh L wAwn:E\?@wirF׀wVw49#R^d V& ?BQo>Jpk8AKd'Ed~x>:8$ szV Oƅ+~-cSF|QOmGZwT@;hwv7'H,+i`A&'7Y9}~q)>? uE2OٶU_oBV $DvYuNq8g|aa>:Y,ApM+3Yj d]X'lt785t `!Z iovnjyw71CeBHBoKuzȚ",),}QU(MKuo&Stt&axѷAdC,0FF@>qJ=ۘ2M37ք&Bβtpk\)W_7Kw4|#V-^ȂSk>ȹ72~q!FߕCh4NaK̂D:tϢEB+`1Ş2d-B%l `b fQA1ouI W $!k:_, c[Y,IF]1gb^z$g0Y#H̀2?ʕثɩ}̈́kF5MKL1]F䵔<4ƪ#exϪ#+MJx֫9tឤTH-|{Ё#(|F wdR/9hyYQWswRoxH/|" θ :-Pm%p! HZݵz@n@:Mf!Mysf^g8jwx k_E^OLu@q`8w9/ 0PgrucGZH1`B%mM%^J>1`pܤA\ {KSY(]ŭ cӳu@+d@9eX ! J3'=qȏO'q,oDDd&YXLwuWgCgD$/趀BM#6<፠,C6@RA3Y <57^xu,JiMD$Wvb."3IVuM9WV%5:/ aǮ */8HswE e*tsw|r¤K`C<X?\]A*/) h`[{"30(QqCZ&T=ai3,BB]|䲳R:SzDlShzl'Ƞъc\WC{;7X eM|щda?'gmXwxɱn#. +Il4g_ vj!Un,Zdooc[]YSw32ۤr{g+݊#aX>71'=Kё$QcF㚂 sZ H4 ٻ,A_]vV%d9I +Ag2Qiʅ=%>B#ڄΏ9`/ZhθO̻@kp|fg{=uR^b}Ț,s2*,l2jQ p`W%7  6+=܎NO5~Y7_r`m7U=41-B!e'<˩~.ېAawY;iMeR@=T[ʈ2 @<^+7Zq=Asߔ# 88,Pc ܣrnvX8^{aw^B*O~5gIhT%ݥAZ3m)H@_!A@ rێR<,zhz#R( ]MAn]VĈ 4gEOwYdL4z CW$M@d""vp > 7yNb3;Ix<#!Vֆ(~va*Ѿcӭ]B)9>ݺ@!`Aj\Nu8$ң{Wx՚OZq 30Zc܁!K7*|QB),:Nx@蓾 Rj5YV p{ <>qA7d֢KDY*4m2ü[u3M{;d=ChZ+<:O)Rn2uUe找?D?m/O"2Գ6 NXD0/$4^-XY67|QnUQrmح$kk(td\s@QmbxFTxo]#M0aVi+HY%y,{9yЁZ4f~`  ;ۉQzw筎kIٹ3L_e'i?$0;J2U #{$ش_M,Yg#C-O,?>Ě]T[n>,d;}B Fˢ'$x,p5M(/ҟh0Mc ԹH-ا%'F:%8'o8|t\vۛ]{\.q\lgPP$;PMv.Hff#`~mn[𴬀뵪:Hպ!Mw! i95i!*1 < 1 HaVQ1H[{%(so7"439=?CX<4{(y[ҏ~ƃ`/{}pTMς$Ya:Tq~x_:R-wBSkgSAxu0#g|"#g~9$BHyN\fO*6YŅ^ae揖HY*dޤ9\ 7(wtg…ՕmZP­0WtnUSjzC(4}aH1p˳C62x*{↰KM+4[vFFaoC5%5'do,_ruZun%繯Ɵ9GH\T!j z6zS=] dU #l_"kO͔)BQ]̪<̕ -c^!AFH~BF,IbGcBCLBBsokk~CJĮFUK47IYd@f =ZM=X6MU5=ĀXuΕD4iI~T-MG0j(XDˡE9b}0c_nx;? u哵9jlunX(rg\u|#lۮw5`a%`ߡ[IP(Wg,JQ6brXTp 7/}{*xf14s\iBK ( ln,AL(CwƿgJfG3{R5"NO*. IbR{ h#]c!Z@M.a d9m=\+";43R$YDN>>2EG;)}s q">:Ã&;G5,E8v}dOXHS=/8H>7A7X`SQY`{R@b{BarW+\@b@6֜'ˮ B&Gbk'@jnSTFAħZ3S4~3@Ojw'2g( R׀gV1z"зL/@?Hȍ0>~{^ L/>Klh╝~#|w~exRn4y&*BGz`=m"_8n!$u+:_L+@9I鼉{oNNaI%2*dYv 򝩿2̙#uQLo*r2 Q`Rw]Zl+uvbJr˟fK)˔q(K1ae܏ֆU/2CIkjSFrEmA&@$h:2\ ^8_[5K߷A.blQǠو_ǿ7(D!Da$Qe7r̛99D6q j+&CE=($xt. T-*롕AMruUn;7c-Axgo2ا2c>kǯ0φ2q_!I*ZуxvA0tǜ,apť#%v'O8JTl:P+d TDZYD?N_u"gETQoхD$./m[𮕥/w<jW'B w|-I+ޫ}7kr@J@"Ry51.VuT^G8]h qw0KaC(&GvX=Z^". ~m<ANkVEg_fNxJI=Õ$ЯK}4l RU܉p,v.V@s2ş":aXts|cjG)nGO4+Ou]ĂL*79O~dz&\ƥղ~$lQ y,EGU3^_&mؿՆ3kЗ|7ͥq͋Sˮ`-R>0ۤ.=h)]Y,tG0 *jӒ~p} ڳ^sj$*f?ʊ[q)É* n8>kcq[oT~LL^hhpXh||M\Ѽ8K̾HLXfG!2횗W6y#wYAM<[qhC4Bmq$,~+X <^)%V˗ Y ?Jru)Ib d#U ˵'?gaqZf^ҩ"9cz҂j"0aW`މrFY!WVM΢HN,: Xq0GiELXhceĥ8+UҘ c.F{k]k;-]‘@1CM /P.MFl!E5^qjLzjaP 2`'?% J]ƾ~ {kU~o1*QRZ4MI7c8<<"雅>vV.e82&'ޏbj/7@Pȉ՘HA42eBcrdh6,5aL$נ$lhWxxŧ/;S1$$YGБ>DnJ,ABm2+Z ~NU.ͮ .=KeUot=_ύjfj,  P kc*R(ciDuUO;T>)> ֫C8sv-^ r퍎09f#qMuL s^Hl[FD2DhK_nͲzm8&,1f>>qوb ^d:C{. ,? ۗ׳P`ZKAjAnC9.ėGt d=wkUĐw ipfr`@dz@>]~ qL`Eh3RueMr)H9"^sahNv;>]k?=Y2Y"T~mUig;>dЙEjm|U1cƣBmÛ0  Hwώd?鯖u]p}m,&PBZNli>>^3]g-ݦ:+ۣ 7~ 4$?HʦX°hUM,ICr,J52}SnFs~cĦ#5V$ZXJXflN "Qy ˇ,L_XwDOoi(fp tk#U*t]l%tel(]>ԫqX6XV̷v> )P?e8fۓ k^/y%Si Ik-kRTnj4Y1' ٞ 5u}Nm7'B~#z8\>,YMjF=|>$Xv˲zN' oaAmLnѵix&}:L'o&gIFV5'Y>1 /u JR,h~$wp7C(l'a*ﺴ\جMQ#@€-5 rI~3x0W9$>Nj,2DSlm_7҂O r儤[)šVuCG3"@U"@#zq{&WO=@w|&t?V_7uEXvE{`ſFf4T˸)d{R\DubʤG҈fՇpw8T#g[9}xfZ"'MQG{) /e_c) |Ma ~ypH+e= U_Wmֳ!$hS!,P >|-[V2@_xaJ&7S8`B@x96 21"õ-dh-*.^3Tҋk4 MOۆ@ht2o8wV'uǒwyTI!*k̀>e\wȿcvڙZ 5'R0ه.FzAO#HneovɽQv.\D3/+pq}nҴ  \ͽq5\+xcb-"7 MzHz|)'ěgRc:k,,c=o̒ڑ wAv̈:ܘRy>[n mPm,=fA~3>a͛JJ1!F<ߓ=4Gh"v%e[Y d[4AJ`yjt!)ajziR~~J[alζga[ȗ/z 7B,,0킥Z>Sө#Tp@(#*bg܅I4%cn6\=r2gk_cLt?jpx]6sN@*02u|diRZ8ҪJ ZMdF^Aze c>qŧX a9 2v0)(ح 3m<@P4E`jr}Wj?<~oq ϟewR^[fV<[0/m8fklڕ T䥘+g!dt""ȋ>E7UߏJ@hk=WшEDhmM!arʿ]Ȍ]E(b}(C<0,Da0=$ b GHۢE?pvW}U5 Ԇq<֑9h#%rzE$hO"¬%Qx׀D$#ގvN(X/}YGq"Ws)6/1k|O$O]U-&GAiȏzU:~n3LӞ/c o",w"T0U`~Y.P*Cƨ%ĵ3*r¯r*GhBGeU+;h]$YE"Z=}dG1= ЮC-?e_wrEXS'K9ѯ&dvsr%S,tTp+k,-a}6y1ccPU9EEr:oc/9ĝu {[|g{=(~\RBOW4*J,Szb/xn/a~6ܔ҂:Ga"*4ӴbO􆹬\v@ZX]4')_ ʅ0BG H:hD:*C^zbcx5}p[t Ύi@?FYOT6b7.Q072#qk')Zۙ\%Pyg5|q_~Q Tp83g>|T8|Șn6mW4v[bS#7p,}SG82r^W%A+_^!̪Nc49wQ'a}JkiUԢ}^PϋZ)K8dPoS;XݎVmգDpQc`a 7b\AbNsB/^GXS?#n.c\`/&\JFM$(kN4:!߈UvdHRѵ6` a6NTg D ڮ^kd ȗ$鲒"_-,akm.<$v1QcM k׌qվ(^Hv01e O{I`xQEɞ}jF@|`QqLÝԩ[}k+Ly=sTwj75n0 qj$r %\d78[CHQx+(押)ȶ",ܜ?2dJn, S*G_fR "d#~wm&6S^k/kޝ-s[ ٩z=Dp+iQVJK]wn$`28 s%4ڰ} Oz0_PcLn{#I*0\|A_\Ҋ [0WoZyfK=6J3DRY*#-Vr=$}-&gXyg, '>`uxאm, Jd:(YAx?_ݧ@cRʥŊ/x& hX<YФ.6* fR! fLyby R@Ab[ShN h䒄܈`yJ"LeC ڤd1e,a_TƮ/(h7E Xÿk!Lq1f3~ƝZ{jbHbPeo8pS B*xyaڛҗn5/Kv961g,.+\EKl ?6<)g$O Mn!eDc,C-Pmgx`º$(r"\Ӗq:5v=[v)hc 9bxKR,h:TV$ڳfm=( >I6ZE W9Bl:1'Yά'2:ӌ1S s]̜%vj+fY8IF E[}7%H:Z1K3+LU0}CKdNam%Nnsʙ6ZآeUdY`cfxxOTV ~ /4|o@Ft~k΄p Z%J=TQڵ5A;zy3Y '|8>,*v斨8L7ߟpZ=fW<򂾋Šorq8hd}KAx2E>rY7BLvB׃Ux0jn{X7wUC'1*a-3.\P]h҃ Psd!۪T='k;(R̮(YDxMD0ubBx8SLՒ5UkZN3*ɸQD2wWզE槬,SάNʳ7d:xY^߃9$xGcv У.* 4sVkDPr=&#̮EVwCv?Y !bqRyoۂ\HV6`]p7 `˷yW]DaE6MXVFpy^@WXF:Gj@}+Q Cxãh\w0T."R&TE;ZF#t)pFP׈OGNR.4[w! q"`qSxXA8n}3Oc?8jCU.NsU?`΋CM!8΅m=p#WHcIԛ `3XQ÷Q1c3TsL"Ր4p6CPq)//)T8VDQ+%˰tR X8LӋM㑻LI%\&,{gCG!NA~'uxT$M0$&UTNGd>z]P&77:E-@#(*gKy r2qTk :t>us Xa0&)/1hHj¿̯$rc^#`Zyl06Wœr\i4cDFܖ07z׾Fc|4պ;@خ,*z`{ZoA;Ԑ\ aʽNB/]wTEй8uǻJpByB7V*ikO61zt#nLX/s#eS^.)c_*A^`\3?v(a!Y 3m|Iߋ}6ԹPtR0 pbE/IWg*$iƬ NF9x nЕJ(C6n%LRU\ ]|u%XGA-W wmW)b! ψL9s/<;-Yw(!o69nv/,].{i3n%[uXo+ki瓭5.]l_1F^~iF&T'm$9G`Cz3_UgJ,1BC!d2浳3Pd*q߽Dv:laTLȶ|^ֻ P\\26E|*f5F |{Cކ<#)235 F®a"Q=R8|C<6w39ozv̫nAi8N7Υ¨tl܉:v50l/t_mkϔi(f 8^vLMwyԨYX;I6v#*&mҕ=mBhi!mJȓX^KGTǰnI5sB ~Z,eL܌S2h]ʅ޹63pxW186*^$whbBb+>`qg}O^ԅEdƏ 5t;YƱ&!:^:jpTQI>MhJkmf ( 㻹T} VxEKދ"8( ?~Xn.o#z\j|Tk!T{a!c.2>$\މ֍Mק Ҩ-mY ;u3x~ׄvg![A)m#{ΪGeY#lЋN3Gy)P|Zd;eIDb>^kH|jݦʶr Xߓ)^-V9p=ZaI#8 _\ b\(eT@1 {+W@*Ed)&=_wŤ[1y"4zT[_R򛈝G40# {> BgFFڢeb Isٗ de'@PAPdSlPIClzCQ%e/_(Brˉ.+V6-m;ވ!#cq4\@eƺ9aW+BY!ӝO qg.mY6? fm@6IX^f~VI(tsh` [ktOn 9Бt&A'nMaGW5_>LZ3Ie }* G(e=W"sP 1dqwe<{j z42e_d1ϱ-MyC*T;eCOIhfNKCL\v ќ퇐/Ū@n6LHmyLRDYv>"HFM <hm;,ME#· ZǢ(uĎjiχZ>~2y> o*|4JT^N䩏kCliKpKv&8$}eMlvRͭRk9{ESdm&czExA]>aJxx VK$?rxER{W6j:frhޠC 6zeme|B%o/褘~ ^N;ph6T]0H=xsbCaa{Θg/FZy!o ̖]#1ƼFŦHn @(R?`[8I& 4An'4l0wR A.b 氰A_J2TJ[#{M. :?̀ez@#{iYy5dzzB6!<Dfr$~Uq90l'A*&?)ל=ni\.-܁Lڠ2Zu@GS A8^jf P4Qoz؇dLȈ=EHtNmaȥ@9lǍWV)/.f{u K.7>t8IF%I:Cq2@d[,?NRM`HɖpIQsrH4 ý JאW_la}( eWe5q4a yY6s~U~(  9 wC@Aw̏ϣc1M ǽB6 },UR&1C1\|n@C͈$k|#i倗K.Ju^Rr 9RSaxARǐ5<v$O1?O1~ʋh V :@U2xV6 \K% uBz[::J; 1s3} 濲od=D*S,wnDe>tHȜ<{F=IZJ×]AK@5% Dq_XOoe9u˓qX^i0I߱Y=<%hꪚ.uG*=t@=TtmWqfUD6n !Pgkϝڊ6=9ݜѱAȪ\gR.T,kEOcg0s$}IψG5+9fyS1UjBmcQoѳxj ]Q:hclDFr%'˝ vM_:]U?fMz> ~R d@F]¸0j*#(@NVOs1/ U⸔$4\q*x޻ >q/nOL/nSZP۫V$.CJm2?c8YA<6WցzlRHeۅEÊ086#J„SUcMttARյ\\ӹexEOӄ$s?6AC)V&=+AhsL!܅]3|'u]4GPy!KUWiRNNq&w0ܼ׊iq؆ 8eU?X,̰V :9iu_)Q9k}ƴ 8B9>#6|3)`޸EZQo鋣iU^v ی 8'=ThťzSZc܅nyH@5Y&՞`)6_aY) zPJfNܫu>BϼuԴ$`P9 *90D\ǜ0zoӷPA}2Iq-~;:q4%I>=B)Iw=L*/a6x<ѳ4ҽ 84IĔ93T..|ct ` POp)G[$*4Ԣ;@y-&5'U}+&:1(8.]uғ0I< d *_ɴìPmHΡ3MT`,[U(GwqX^xQWlxB~X! $oDѷh<JrQE^I3avh=hD/u0!d&w96"{UY9?:C e<,hz}80٠M|H^hZi!GbMukVe)/0; SGDj2Ƌu;WdfOyb ]QڢuHn:I5g+c5V!^e(aa2߄Z蕝R!ޏmzl6xw-="&/ytF8I?9IeS,ܴ07ǴU!ےrg*q܂1!O u_ޠ;i#؃缂'}5iGfeVkNݴ>j%Ci2'c#7*")V_frSpjQkx2+9ФsT %RJx#5+j9܌B5z(.j,#=n*3\]E8!`"&d'V(H]TQcƏp: r3%v/¡@YDl,_}!'mߟU3}!޸F Swꑦq!~8gוhmV8ȬeQm"qz4iK.^2^4'z;ږ[Й}O B%jlZŒ"Z7;*NJ|=I>>.`>szPR 0$أP]MShF.n*o#XֵDk5fz2?%;lb|'z鳐,[(Vgڪ'+OZ>IK?a9ω2qiNiX=$`0~$~BM Sδ,BAl`aOzttLS&!ԾӉ;[jM`1mRjKF>~@0LEûyhWRjl&ln$/*#`Bt}j/{h2%G~mj0DSfʣv^7?Xpksfh4nc0vƇa0EvN?s8]TJk+܌Ɣe(=9Qw%mt7!I5̷wcIyvlJNP[$fǼ <'킭ɋ5Y 4|[yjY?82C\x~Z Ci 9Lc&!YZ}y!X|Bgx!'sNF2|;el#hUJAaout&lw~ Z]ٕ$"ܰwt^&GN(uv0JoօN~KVU5ݝuw_$+qBi>c5H2*# - e&gYe sÊ`6 1J$D0~E(,<~a&sɑC 9ExN&|XN?Ǿbs2 =&v\#&>3B&ͅ4Lrh}floc}DuP9q U0?ɉxy5!SO+96r!>;_V=XLVbqv+t//gs/^^;̀f"qȖm2~5]䃚~|G󇟝ɪQf!Q> cc"1!sr r%iٱI9ܪ ?'{R lB2'+`_q7,T,D0ͣ7l 9mo` 2^)46c# h ;ͯdai`WRڰSZG_PaJZG'C.4Ye C2c2xO@ꚸŻ>.6Gդ\m8!Ři*5vȚx[[pAaY%z $en{8\M ?7 ,6rϰ:*wኍ*kC+_ʷS*J@!IqχOXBhki؊D'I>z:`trAh'k_J6fjOĚVSzai'a{n '͑|'<ZOH^ńE󚰰m&`FP/aM9SgBԂD\v)kA_M=\91pU޴QDž1V_M&b8Nmdšɝa\lo󨺹>JRT?v('Kxo ^E+UN{CWc?ģE2h~MaJm$3 Xl4V{MӋĻtfAX )ЍYPcqGzN+T;wiu&8: k!wQ׽CYU!E)p8PkH 7{mJ5~[W?7n\ͼ0`"!>.J 4MBJr"΅K59T%ыVP{15!yj/.ڷ$_g+@"B`kTtX*gukA;4bF]Z<{|rfӁg$2cR "Ì^%CYN{ Sc crchlFGedzbO4E9ჯ88& qx[ʦfh (X*q@+5I$W(}@<㡧$y/Y`܃۵bv\j\GrM= #mXInG h`7݅dj{T-#Z ڧ4ۛC(C21Ѫ16 E?xkv_c_P|-o6'3,]6〉6.O$%o2qDk1u^N5T|BzעaZgKe$ X"_E#0ɮ'h^+h3e944}@)7!q鶄3L+jzPPO$W:9j8rݯȿfCW3TVisD*5`J# WȻ{Z8@*R}3 f.1t? ?!F YCd':}b=ZR;Q '6P!}VuPr5XY|-EGP rk9hc;lLFPCʷ\W'UjuHi7q2 P"݂q4㇫c@rQ["L,.|uBA_l7я,hJAܛ 8I;]TwuQΜfB0mj9 Ҡ ,c3z$TUB# Ֆ茆/pfiuwic!Y" oc C w}Eh,<,{ɲߞP"#JHgptDSmdFDZ6Mw뼌yZH` q9Xw&&|I؛Lq/^Wh! bƨ/Mhܡ3&13>YsGBwƲRKADA3*6 !v2 m[nUJQ1iU||Fo wh/"}aC@u "Z">f}k ~^N?4( ;P# ?Vېaak+$?e6BğRCv먺'nNv  gLU2Ank/UXh-+4T!T!1-{RӊjHh[Zt_ J娎ޅYKݾd|{O3dDB&]gI4[`>~ V5/)w~mPF͙qLA} 3 :%A^i9,Q^j9uVyLfp5 ϶/-<"T:xNdlǠ.e@@{ئr kĠ: P6T8u lyPUhj4Kxis ]#ߔ2R;ְ\- , mk22)Hĉ*4^:E{Iԡ_Khj'kF, ㉮=fmi=CӎUJ@5N"*2[ET n0_{}hI`hI$q^Zc+7ZV V72Qh+[*\Xy^0~VxnQho?PR3pcGr2Ӟ򯅝:/$(BofGS?P/- GU۹ 4 M`A)imRF{xuy>ܲ'bQDjhh`‡_e[L5}4*vpmUBҼg謚-g%|T&kBI%$5ETC $%hl]w)꧸s|O@ Q?|1j3\Ar6EAF*=7>X3{NՓ ^=H^L9(܃JTr#gnhmkҟ1ހ+Gܰn!milcѪϽ@QYZJ5dMT,rrM:˭AcEjtSWy:Ɨ@JzRf6p|S듺Fpq+#ӆ\&nB ŕ%E$뜼8 ώGN 7z#:ʾ n`OB5p?ŴP,h0r$y8c Dz?SQA1;X I/S+;\T=5j:_[,ͶBmK$Ig5vrt7cYo`w X 'N;' ~Vl0L[i\b^ǘ;T+7qZWK=7c9)hdd:ժ E*vfn2]{MԤo^i&' N.*i~ g&Zlt'^;4:1D7?Gn2UB E ihX(uJEvʀe=!H 1(f 7 ㌓3#4zUHLN`i/jC&iAP6'+El78-ާ}g"mP![\Վ $(4^JMk@R% COr9=@v HI/Y{ٱS4ŋrY.٬}b(>K]&οy9~ڢ|z@+rkB(ΛM)9! W*)BQbX{ox栬n!ݖ8ԩrѵf3J:2f@#Gz:U] i5? ,j]GT u Z+T;q~<\ )^UT^ <@R?DzՑZ`s 1mgIoWi ]@\܂U+`~|s^O_eHQ|Bk>U'/۝&hr7pbPOOp.J[Õ/>L^z]r (>Bg0]v SH=A4X±}VyۇO,mv>mp#p3)4XBxQ0-7揯?Ga\ZOITIQʐrb !ix\[JN<yAݼi 0AbVtTem.H̐ S7.VE°hl 2A&)MNl+uaaޘܴm/yjuE\e|hl{yxv0%F7x{z g@ S'ʸMhUF !48Ğ@eUiˤQœjb2csAW.8t_ڟ!7Y]¡KyCIkZ0"o)QU5Ulj gx=ݪvޓu'҄ԠtY <IMp|phڽ4 PNxI 9!yHֳcqd&tu9H7Fm*B{ғ|jzK=fv5zkRQ% M &U9WIF͠zF^0u  ?E=S;N4xel!_(sPtĽOrݕDmfZcsuڹF`ט1Y SZ9$CKpڟ4qQcw]j5J{)Pg֣qswKio~ޯ7L_W_G WTxȡRɡ˰Dy%]bL}tIxˢOXoȼK?]DS~ Q/M=BvJVG Pi؂1e %QBEJ˕mNkrCӸҸϼ0gSTdGAn6O-=-xH[ΧaDePk!͔ɴ{@3}HY|6c5Bղm08&Zyw\3zHB|ɞ܈K'i*ՙ\Q0nAbH.U5,ڗQ  rdrQy _G^#@u#EL)U~QlPi8 e8'}Щ?5D!BihO4IcVhT^%v8Ǝ0!՚,w]ΒsTV Ly/޲4I9r^Lqfáovivz%_.~}\FV/f 0x0(-RH+1v=V L%as2l ɕ!3_*O̳{=Y)bAHC;ݯ7UO~*\^\d{\y0\ܫ=?wC\olpPTxh6v߭iX'(RʎO)m6Voq['ۚ\O;[~ (HJAekPхS h!mkmoLTDKP*`uJy~nv.L?=a­&7JQ7б@)K0׎T/ZzCm@98 e2S鼊zyh^V.tca83vda)X̯az &,=@[ret[F OQ09[!$ќ簁0 л N+f(=t Gy ³yyZ$A 7p2%Qݛk٥8B̼pQ4!,Mv jvJp&cs暵$z\nL`'O#@]oS;li4Z@gMj<\9Ri:F_oB3ޚ6?3%tK# pn+ҙ36GT+PgqN!1UXEv͑>k8 !S?OƎ9Xu _E[\W%]j9 t4ެ-t5g_fBk2/#M=\_Nv%@rYmYK-#kE$FɉܯkxmX}k}s,Ab~X. :69c蛟DE,?9|QK!$@ZG;?ќ)3JZ+ǩ?}&knԘ~Z:kL!$_3]LghQFgB`b'F2'{K 7Mjһ~}}2.&%wg+tbPA^zZ]\cA3xcURWwհyiZ48D)KWUJ3cGب>LzPM $Q7P^ԙAБI[Ͷp2{D5}K:.b&ۥ G1\_e~KT#dS @@.X; 8t.O*]'v|(WxЄvEjiwfl,~{ }dþW4)/S*^, b~VS*~bIIR)=i^vFr\+>UɴMJe)_ǭ@|UZZ 7?fJ#H&z"7&-L| u`WуQ-wcs~K48`ol/Z?g;!~~gݻ .AD,_1ȓO 6*KiRZH $XolC>Wi>ʧ_O-JOhv(3b <`^\Tm:&:z5 {.6w/F ft4/M76#Z,N68^O{Gfz[`<@A\a;,>~%yGE`ʫAe#Jt~ mv$}b_P+-~;+8b,H*!g3&,'-DMXr{OU/ gԣr-8/F-p**)Ox9 ̤7KL O%YB 02"3NJFt}l|.&[pR- 8p ZkScMО"pƵ$bFd| ^+4.4փf`8EQlTF^΃asžo$Ǵw֨k^ ,,-`bdA,w1pF{E~g+{w N)hW+IR~3K\R:(3GZ>vm3dObe-y~;N. [`0/$q X:&U -;!W(m=DR6v<"T/GQZx s$2a8 Z ty[NXD---TYU\L[%qHJ|0Ta4ǬErn5} 6* ovԚ"?u΅OJ?.jwJl$i_(󞟸ys98+x|;Yj"C;F 7j@+k!{QQ@h};# {>ˇr筺gyl9wn(alQy ¥0@:HgKy s/)WNn:N~^',Hx~K )NAsx :GCId847NI9[ Uh,_jEIǡt2D4 рϦmξL*pV"q&TpxU,G'y>R Z*Ւ7=|H RtȤ}OB#кæ&Dr[czF?,LJp4iaц <7hf!IF7>oyD+zy%bb(Ϭ3=̉G0F~mgu ]^'35#+?ѽn@:/+|u/>āG$HD9s,HPF\ fw۩%R] EPw}oƨZ{A(,w;}OP%g 1WºFnK!{#읶~5G#Ҡ vEP*lt/r?oQu^{~# [Os&Tn.'ML89&QSYY:eA 6W.Q gXZ8$lLZve=s^ո%Jϔ؜lr A*NϥP/HS8thH 3K`UyO4J\ې _c,^?|4T K:tmtiN%><\9ʟ(R@r;pv]J{BQ'B4<cPmtr%/o)Uܨ ٠}(#YTGS,v nZ}e4TGj ji94#$z0WhtwJ*)9sDsUzFY@0~AR~pwP-6RT IjXR(,G>e궯YRs"KEi0"̘횜|fq\ֺg-s' +Kfᱴ=`=p+Kg$:>jsr0;|A?ܡw}^\3{/]7 ݖ)$]E^aLc[kq_?QAt^wKTDʎS.]]%"pҋ61P?Wo#q3ϮԼ}im;20r!3h Co<m6TH1 '["8+HVBL5,);A)5[o[cj$) t, XGj5VX=Uu;~\1 P@C&hD7(c>'Fz ?r#SɈ3_OTW? u`aMq&dlkv uqFb}`+2ڒ61SK5l jUT,@McRDcJ7ӧkqoX6WN[6F2e*gÉocP n*p wC6IGꩀ7᳸|AIބ `\2VH6 /t}kZT]tMۄL2A?y^|箫qo5cLC2Ⱦ wVxQI(%GFOAzP;EBHO|t28,L?}Ubc|_tYSN}tnx4e\> L_D#G=+E&_g6l*?bL6]= %phHB' -[u&yHO(-b_#?$?.DOpcn]قC Ѹ Uhkp@,.ǘHO߻J!RU; jF2/, ~7+Γ Oe->_y? i`xF(f`82@+rHj3ͦx1=6'd[폹ni8궄}ab 4aAkR̢}n$2!d?cfu՝wϝsbHG wm$sT]\1wǽZ, #Yؼ:pQQ5q<5rڬQ cc4D D9DcߔZ[vAͮͷMN#]Wi0zۦ+hH9*(hBhG>E?PEv!L‹aLnFK` d:8"d26-ݔ1U εJ&\)y>N/v<k5ڨ*wi j\찱tXs_$uXfB}EPG>9>c~ݸ=hUI=,q.ږ%4LV}Ie^S۔_8xPuc4 v*Rsnm,]R.q2 q/]W2i3V} nB^%IZP\Bl:r#mz`pa#*ezt%8ʔ"r&֖G]faj| =3S⿲mcǯ+k*Hq}xCNȴϗLlwupXs> '* #|M:Az?Oe6ly v2Gsl]3D6(MJ2kv7P"61QuFj"S\Є`؇o++řTHClrSnx/V}cYaQn&ऱƂ-WV}[LWXGR9*sNWO ?a}( E^y`dwjfO`L{i硏rfÀoН Mb̒7yJfs#xnXMyC\N~0ùiW BTW7-;>2_zNC.5G"8 uGZ` $:Q?%Vwp{Vyظ«4&kXjNV+ž+phOEvD]# ?zvbL/*~s\ 7o{}8*s;Agd5O1 /֠ :n<ƖGuje<"SQɺ|u w`SvI^/I.,}*A5B -{.6NS;F<M߉ਸ਼)oU&KUNVȳ$~(=Ҫ$j+! y`9FzV?Y¢AީسB6Hzs%L'6c慈E>Gc( ΒUkSeO3}Z 5 ّ+(r%}'B.% qG@/'g_ΚU+%C/=p})[E:M,H^c \'HuK4Q{kwo-\%<0VJ2ΠS-BFVUf.`J?j24C#[|=$^sƼd|zf<ǂM&:' o`d4-4n(Ekj&hmKF7DMjLq%å #OŁˁU{N3ZG>PRF$;@*4_'2V?w.sAĊ1 b zA ҏ8^)Z(*RsZQQ*y /jᩫ+^1I}fHpO7Bxy+4l0B}b%K gҳ9<QIg!hܧ}<-˟'+-@{:ĸ>IgF¶GRLͦكB:^ t !/i2eu.M cu,gqgM Uo >Jtb"zqO8o gtU^؈gOLpՁY=;T-Nܠ#i[-4qTjҿFBcho19#SD%Z}N805- T}~l`0+ #!vdEo4ltйƵmDV]mRxڃ_) m #t|k vmtheMJdMO3Ԏx<9Yě`D$cc)/?1}e?h Q)Pt^]iDl:B V5~htݐWlçP;OCZL/K՚~tvN5o⧱v1|O v?j(2nq:6r\W \?Q?5<B+<H=W\a7)`._s^zhW#cq y}q9e=t]1UA Q0bбT~A*.P 쮎1~Ό:O[cE1|7,y X7I0~i G2QnnRoq@8i/ /}bE*Ph4@vkh1ۢ`ʋ ')"bb*:͗n(Ӕ|Bm |,4uAģojLiNA3]DakBuUZ5qR4{ux̄=8GW n8,pl-I2ULLsdmd99 it32==<=>R>??@AABCBDXFGGHIKKJJK^LLMNOOPQcSRSTUUTUUVWWhXXWWXYZZ[[\[l\]<==Q>? @?@@BABABBCDEXEFFGHIIJK]LMMNOPQcRSSRSTUUVUVVWVhWXYZ[Zl[\];<=Q==?@@ABCWEFGGH IIJKJ]LLMLMMN POPPQQPQbQRSTUUVgWXYZYZj\]::;<=P==>>?@ A@ABBCBCCWDEFFHGGH IIJJI]JKLLMNMNNOPQbQRSRSTVUVgWYXYZZYZk\]9::;<=P=>?>?@@ABBCVDEFGHIIHJJ\JJKLMNOOPbQQRQRRSTUVVgWXXYWXYZk[[]\\]99:;<P<==>?>>?@ABCCVCDEFEFEGFGHI\KJKLMMNOPPbQRRSTUVVgVWWVWXYXYZYYZkZ\[\\]^]]89:;>?@AABVCCEEDEFGHII[KJKMNPOPbPPQRSRSTUVUfVWXWXYXYZkZZ\]\]7889:;??@A@BBVCDEFGHI[IJKKLMLMMNMNNOPOPbPPQSQSTSTUUfVWWVWXYZYYZkZZ[\]^7899:;O<==>?@AABUBCCDEEFGHGHHI[IJJKKMMLMNObPQQRSTUgVUVVWVWXYYZYYkZ\]789:;:;N<=>? @@AABUBCBCDCDEFGGH[HIIJJKLLMNO`PQPQQRRSTSTSTfUUVWVWXYjZ[\]789:;;N;<=>?@AUBCDEFGGHH[HIJJKJKKMNMMN`POPQPQRSSRSTTeTUVWXXYiYZ[[\]]66787899:O;<;<=>?>?@TBCDDEFFGHH[HIJKIKMNMMNN`OOPQRSTTeTUUVWXYYjYYZ\[\]6567789N;<=?@SABBCBCDEEDFEF GHZHHIHIIJIKKLMN_OPQRSTSTeTTUVWXYYjZYZ[[\]\6789H2323345678K89:9:;:;;BDDEE@=>>?Q@@A@ABBCCDEFXGNPPQQKIJIK^LLMNMNOPPQPQhYZ[\IIKJKKLMGʅ˂́Ӂ́tQWXRπԃ΅π }\ba]فԉՀdiijkkjl56767890 r:DE< zGOPGٚQYZ\[[5767890p:CC=xHPPHӚQXYZ[[56788/ o:CC< xGOOHӚPYZ5 7767788/o:CC< xFOPGӚPYXYZ456678/o:CB;wFNPGӚOXYYXYZZY5667/n:BB;xFMNFӚOWXXYZY44567767/ n9BB:wFNNFӚOWXYXYZ4567.n8BB;wEMNFӚOWXYZ4566-m7AB:vENNEӚOWXYXYZYY3456. n8@A9 vEMMEӚOWVWXY2345.m7@A9 vELMEӚOW XYXYY224335-l7@@9uELLEӚNVWWVWXXYXY223445,m7@@8 uDLLDӚNVWWXY2345,l7@@7tCKLDӚMVWXY12345, l7??8 tBKLCӚMVW X21223423445, j6??8 tBKKCҚMVVUUVW121223 4455,k5?>7uAIKCҚLUUVW1223345, j5?>6sBJKCҚLUVVWVVWWX0123434,j5==5sAJJAҚKTUVWEDFGHGGIA{HQQJT[[Tך]efghgh001244+j4<=5sAII@ҚKTUTUUV/01233+ j4==5sAHH@ҚKSTUVVUVVW0123* i3<<5r@HH?ҚKSTUV/012* j3<<5q@HH@ҚKSTUUVUV//012)i3<<4q?GH@ҚJRSTUV//012) i3<<4q?GH?њISRSTSTUU../001001)i3;;3q?GG?њISRSTU../01(h1;;3q>GG?њJRRSRSTUU-../ 0011011(i2:<3 s>FH>ؚ HQRSRSSTSST--/01/fcabbcdvef gfiE9::9\ihziijkllmlm nnopoqPDFFEjvwwxwxyz{|mOQQRRST--..-/001011?()*+,+,-C./007:;42344H5667889:O<=CEEFF@>?@@AABTBBCDEFFGH_QPQQRRSTSST-./0E1223343456J5789::;;<?>??@ ABABBCUCCDEFGHIHIH[JKLMLMMNMNNOPbPPQRSTTSS-./01E1233245I66789:;:;;??@?@@BABACUCBCDEEFGHGGH I[IJKJKLLMLMNOPbPQ RRQRSSTT,,-.//./0F12334456K678989899:< =Q=>=>?>>@@ABBCWDDEEDDEFGH[IIJKLKLMMNOOPPbPQRRS,-././011  !"#0##$ 4988:("$$%0%&''( 4(()'>?AA@ABCCDWDEFGGHIIJI[J KKMLMMNMMN(()*,'%.5446!$ '5?>>?@@ABCCDDWDDEFEEFGGH IIH[IJJKKLMLMNM()*+*+'&-5346 # &5?=?>?@ABCDCWDEFFGHI[IJKLKLM()*+'%-46 #&5>=>?@ABWDEFGGHI\HIKJKLKKM()*+'%,3435 #&5>=@AABCVDEEFGH[HI JIKKLMMKM'( ))())*)**+&$,34#&4>=??@ATCDFEFGGH[HHIIKJLM'()**+'$,3235#%4=<==?>?@AAUCCDEEFGH[HIJKKLL'()*+'$ ,3235 $&5=<>??>?@ATBBCDEFGH[GHIJJKKLL=>?>>A/ "#$$#*$$%%$% $>GFGI+!""#(#$&%$*&%EQPR SSTST^TTUVWXYZcYY[]'(('(()*&$+23" %3<<;<>?>?@TABCDEFFGHHYGHIIJK'()())*&$+2113#%3=<==>??>??@@T@AABBCDEGHYFGHIJ&&'())*&#+2113"%3=;;<=>?@TABCD EEDEFGGYFFGIHIJJ&&'('(*%# *2112 #2<;=>=>??>?S@ABDEGGYFGHGHIJ&&'()9$$%$%&'(:(()*/1-+,=-./0 1B11217;::;<==>=R?@@ABBCDDEXEEFFHGHJ&'(?*+*+,-C.//01/001123H56789N99::9:;:;;<<;<<=Q>?@ABABCDEWEEFHII%&'()>()*+,A,--../012G23456677L89:;<=Q>?@AABBCDEXEFGGHI%&'((>(()*+,A-,--./01F22345457767K89:;;<==P>?>>??@ABCDWE FFGGFHGHH&%&'(>()*+,,A,,-./0 -,--.B../00/0123G3479:32334H56767899::;UDEFFGH%&'=)**+**+,A-./0-^qnoo|oppqrsstvG5893̓ w>DEFFGH%%&'&'>)*+,-A-../,qL4880 ;CDEFGHH$%&'>()*+*,A,- ../..//+n K4880;CDEFFEFG$$%&''=()*++,A,-./+n L4880;CCDEEFG$$%&''=()*+,A,-.-../+n K4880:BCCEDEF$%&'=()*++,A,-..--..+n K378/:BCDEFF$$%&''=() *)**+*+,,A,--,-,,-.*mJ277/:CBCCDECDEEFF$%&='()**+,,A,-,-*mI277/9BCDEEF$%&=''()()*)*++A,-,-)mI277/8BCCDDE#$%&&='()**))*A,--,-)lI167/8BABCD:;?@@JABBA>z [EIJAKTTUVWVW#$%$$%&='()*@++,(l I155-~8@ABCE#$%%$%='()*)**@*++,(lI155- ~8?@A@ABCD##$#$%$%$%='()**@+*+,+,(kI155-~7@ABC#$%='()?**)*,+,(kI155-~7?@@ABBAABBCC#$%='()?*+,+ (lI155-}7??@ABBCC#$%$<'()>)**+)+,+'k I155-}7??@AAB#$%$;'())?)* )+,+,+*++'kH055-}5>?@AA@BB"#""#$:&&'())?)*+ *+*'k H044,}5>>? @@A@BB"#""#$;&'(>)*++*+&lG044,}5=>>?@@AB"#$;&&%&'(('()>)*)*&k F044,|4==?@AB"#$#$;%'(>)**+*&jF/43,|4==>>=?@"#$$;%&&%&&'(=()**))**&kG.34,|4<=>?@!"#"#:%&&'(>(()* )*&jF.23+|4<<==>?@@"!"#:$$%&'((=()&jE-23*{3<<= >??>?@@!""!"#""#$:$$%&&'(=()*&iF-12){4<=>>?!!"##:%$%'(='()&jF-11*{3;;<=>>??!" #:$$%$$%%&&'&&'='()())%jF-11){3;;<==>=>?!"#:$%%&&%&'='()(())%j E-11({3;<=>!"##":$%&&'='()()%mF-11(|1;<=?78D9:;;:;<F<<=<=>=NUTTU]TUVWYYaYZJDEEDhustuuvv}vwxwxyz|cLMNONOPOPOPQQ!"9#$%$$%&;&'('(%$%<%&'('()*+@++,+/0 1+()*)*+,++A,,-.-./0K:;<=<= !"8#$##$%;&'()?*+,-.C/0/01123433I545767899L99:;<==< !"8"#$#$%;%%&'()())?))*+,-C./01233H45457678L899;<<=< !"!""8"#$%;%%&'())?))*+,-C-./0123G3456788L899:9:;< ! ! !"8"#$%;%&&%&'('()=)*)**+,B--./012G3456678L89:;< !! !"8"#"#$%;%&'&'(>(())*+,B--.-./0122G334567L89::;< ! !"!7"#$%;%&'(>)*++*++,A-/../012G233457K89899:;; ! !7!"#$:%&'((>()*+,A,,--../0121F22345677L89::; !8!"##"#$#$;$$%&%&'((=(()*+,+,A,,-../00101F234567K89:; !8!"!!"#"#$##$$:$$%&%%&&''&'('=()*+A,-,-./011F123344567J88789899 ! !! !7!"#"#$:$$%&'(=()*+A,-../0 1E1212233245K7789 !7!"!!"#:$%$$%&'='(()(()*+@+,-/0/0F123445J788 7!"!!"#:$%%$%%&%&&'=()*++@+,-./0E012112234545I56677<<==>R>?@@AABCBCCEXEFGHIK^LLMNPOOPQbSRSTVVUVWhWXWYZ[l] ;<<=<==Q>>?@ABCDDXEEFGGHIJJKK]KMLMNMMNNOPQcSRRSTUUVWgWWXXWXXYZ[k\\];;<=P>?@AABCBCDWEFGGHIKJJ]KLLMLMMNNOONOPQcQRRSTV UVVgVWXWXXWYZ [k[[\\]]^^;<;;<==P=>?@ABCWEDEEFGHIJ]KKLMLMNMNOOPQcQQRSRSTVVUUVVgVWXWXXYZk[\\]99:;9;<P==>>?@?@@ABABBCVEECDEFGGHI\KJKLMLMNOOPbQQRSTUVVgWXY ZZYZZk[\[\]^9:;;<;<>?@ABCVCDEEFGHGHHI\JKLLMNOPOPPbQRSRSTUVVUgVVWXYZkZ\\[\]^889:;<P=>?@@AABCVCCDEEFGHHII[IJJKLMNMNPbPPQSRSTSSTUfVWWXYXYZZYZkZZ[[\]899:;?@ BABCVBCCDDEFGHHI[IJJKKLLMLMNMNOPbQPQRSTUgUVWVWXXY ZZYjZZ[\Z\\]899:;;O<=>>?@@ABBUBCDEFFGGH[IIJKLMNOOPbOPPQRSTUUgUVWYjZZ[]]\]789;:;;N;<==>>?@AABUBBCDEDEFGGHHI[HIKJJKLMNO`PQRRSQRSTTUTeUVWXWYjZ[[\]778789::;:O;;<=>>?@BUBCDEEFEFGHH[IJKLLMNNMNN`OOPQQRSSTeUUVWYYXYjYZ\]678 99:;;O;;<;<<=>?@TABCDDEFGGH[IHIJJKKLMMNMN_OPQRSTeTUVWXXWXYjYZYZ[[\[[]67899:N:;<<=>?>>@SBAABCCDEFGH[HHIK MLMNNMN_OPOPQ RRSSTSSTeTUVWYjZZYZ\678789:M89:;<<=>R??@AB DEDDECBCCDVDEFGHIJK]KKLLOPQLKLM^NNONNOPPQRRgYYZYYZ[\IIJKJKLLMLMLea`abcedmeeffg h[VWXVy l_bb^ÃÇejk5567897a\Z[\]l]^_ aJBDCAz`KOPJQYZ5677897_YXYZ[k[\\]]^ _JACDAw ^KOOJ܀RYZ[56787_YYXXYZZYZ[k\]^]^`IACDAx ^LPNJRXYZ[5 67667787_YXYXYZ[j[[\]_IACB@x^LNNHQXXYZ5 6767786_YWXYXXZ[[j[\]]_IABC@x^JNOGQWXYXYZYZ456776_YWWXYZZYZ[[j[\[\]\^HABB?x^JNNH܍QWXYXYZZ44567676^YWXYXYZ[j[\ ^I@AB?x]JNNG܎PWWXWYZ4565566^YWXWXXYXXYZj[\]G@AB?w]KNNG܎PVWXXWYZYY344566^YVWWXYZZYZZYi[]G?BA?w]JMNG݂܍PVWWXYZ4554565]YWXXWXXYZXYZYiZ[\]G?AB>w \JMMG݁܊PWXY433453]YWWVWXWXXYZYZZiZZ[]F>@A>w\IMMF݀܉PVVWXYY233454[XWXYZZXiZ[\F>@@>w\HLMF݀܉PVVWXXY1343454[VVWXYiZ[ \F>@@=u\HLLF܁߅܇PVWXYY22332454[UUVWXWXYhZYZ[ \F>?@=v [GLLF܃܇OUVWXXY123454[UTTVUWXYhZYZYZZ[[\F>????:u ZFJJC܀݇܂NTUUVW0123453[UTVUVVWXYXhYXYZ [D<=>:v ZFIJC݈܂NTTUUVWEFGHHGdecdefgghhggphiikVNQQO iX[\V߂_eefgh01233[VUTUVUVVWVWXWhXYXY[D;==:tYEIIB߂݇܀MSSTTUVVWV01232[WUTUTUVWXWgWXY[C;<=9uYEHIB܁݇܀MSTUV0121[VUTUUVWfWXY ZC:<=:u YEHIB܄߀܀݉MSTVUUV/0 11221221[WVUTVWfXYZC;<=9tXEHHB܄݇MSTTUVU/00101220[VTUTUVWgWWX YYZC;<<9s XCGHA܁܀݅KSTUVVU/0120ZTUTVWWgWXXWX YZC:<<8t WCHGAۀ܀߀܂݅KSTSTUV../0/0120ZVTTUTVUVWWfWX ZC:;;8t WCGG@ہ߁ۂ݃LRSTSTTU..//010ZUSTTUTUWWgVWWXXWXYZA9;;8sWBFG@߃܀݂KSRSTTUT-../0/001/ZWUTUVVWVVUWXgXY [B9;;8u WBFG@JRST--../011K;:;<=?Q>??@?@ A;::;:INNOO_OPQRSTUUfU WIEEFEbnmlmnmn}nopqrsukPQQRRST--../00101E/011223234I567679:9:;899M9:;;<==>? S@@BBDEEFFA@ABBVCDDEFGHHIIJI`QRSTT,--././01F12345J767789::;?@@ABVCDEEDEEFGH II[JJKJLMLLMMNPOPbQPQRSRSSTT-../0F1121243345J66789::;<?@@AABVBCDDEEDEFGHII[JKKJKKLMNOONObPQRST-,-../00?()())*++,+,- A-.././/0/69434G4565789:M;ADEEF@>??@AABUBCDCDFGHHII`PQRSRS+,- ..//00)ɂZ2983ýɀ b>DE@|JPQRRS,-././0& g0880o;DE=HPOPPQRSS+,-.//'d/880 m;DD=ڊہHPOPQRRSS++,,-../' d/880 m;CC=ހڋGOOPQPQRS++,-//.' d/780 l;BC<ށڋGNOPQ@@ABABBC<uCKKD }NUVP݃ވZ`_aa`bc+,-%c/77/ m:BB;كށڈGNNOPQ*+,-,-%b.67/k9AC;لބڈGNPQ**+ ,-,--$b-76/k9AB;قޅڇGMNPQQ**+,$b-66/k9AA;ـކچFMNOP*+,$ b-56.j9A@:ـއڅFMNMMNNOPP)*+,$b-55-j8@A:ވڄFMNOP*+,# b-55-j8@@:ފڂELMNOP))*+,,#a-55- j8?@9ދځDLMLMNMNO)*+# a,55-j7?@9ىڂDLKMLMNO)*)**+*+# b,55-i7@@9݌ڀDKKLLMNO)*+**+# a,55- i6>?8݀يCJKKMMLLMNMNN)()*+"a,55- h5>?8݀ي BJKKLKLMN)() **+**+" `+44- h5>?8ً݁CJKJKLKMNN(()*++*"`+45, h5=?8݃ىBIJJKLMLM()*" _+44,h4==7݁ىBIJKLMM()(()*"_)44,g5==6݄وBHIKLKLMM''()**! _)34,g4<=6݅هAHIJJKKL''()*))!_)23* h4<<6؃݆نAHHIJK('()! ^)22* g4<<5߀؂݈ل~AH IIJJKJKLL<==>=>??7 q>FF?xGPPI܁߉݃SY[\[\]'('()!^)11) f3<<5߁؁݉ك~@FGHHIJKK'()(  ^(11) f3;<5߂؀݊ق~?GGHHIHIJJK&&'()) ^)11)f3;;4߂؀݊ـ}?FFGHIJ&&'()) `(11)g2;;4>FGGHHI&'()&^ZWXYZm[Z[\\]\]`<.11/R`_q__`abcbcdudgD8;:9YecdeeuefghghijlaDFFGHI&&'&'()8 !"#$$:$$&%'.01+())*?*+,--,-.-/D07:54566K789:;<<=VFGHII%%&&'(''(>(())*+**+, B--.././0/012G23345677L789:;<=P?@ABCCDDWEFGHI&'(>(()*)*+,A-./00101F223434456576K89::;<==P>?@ABCDWEEFEFGHI%&'('(<&&'()*?*++-,,-./0/./D0123454I56 7989:989::;==>>?@A@ABABVDEFGHH%&'&'&SJIJIJKLK^LLM NOOP7.//.HQPaQTUTUUTgVVWX@7898GNMNMMNO]OOPQRRSZDEFFGH%&'%[XVWXiY ZZ\^:-//-Q^\l\]^__`aa`qbdB6898MUTUUbVWXY[BDDEFFEGGFG%& '&&''%ZVTSTUVgWWVWX[9,./-P\ZkZ[\\_^_^ o_``bB6887LSRSTTaTTUVWX[BCDEDEFEEFFHH%& ''%ZUSSTTUTSUVgVW XXZ9,./-P]ZkZZ[^]_^n_ bB5887LSRRST`TTUVWX[ACDEFG$%$%&%YUSTUTUVgVWWXWWZ8+/.-P][ZZkZ[\]]_^ n^``bA5887LSRSSTSS`TUVWWX[ACDEF$%&'$YUSTUTUVgVW Y8+..+P][[ZjZ[\^^_^n^`A5776LSRSSTS`TUVWZAC EDDEFEEF$$%&'$YUSTUVgVW Y7+-/,O\[[ZkZ[\^]^_^^n^`@5776KSRS_TUVUVXZABBCCDEF$%&%&&$YUSTUVgV WVWVVY7+--,O\[kZ[\]_^_^n^`@4676KSRSS`SSTUVUUVXY@BCBCDDE$%$%&&$YTSTUVVgV Y8*--,N[Y[[kZ[\^_^^_^^n^`A4566KSRS`TSTSTUVWY?BCDEE#$%%$%#XURRSRSTUgV Y7*,-+MZY[[k[Z[^]^_n^`?3575JR`STUVWY?BC DEE:99::;:;9bfdededefefogiK?AA@_kjskkjklmmnown pRGIJIX^]]^_e_`_`aa`abbabcaSTUVWWV##$%$YTRRSRSTUfV X7*,,+MZXXYjZ[Z[ ]]^_o__^`?35JRQR_RSTU VUVVWX?@AABCDE#$%#YTRSTUTUUfUVUVX6),,*MYXjYZ[Z[\]_o_`?3554IQR_RRSTUVVWX>@BABCDD#$%$%%#YTRSRSTSTUfUVX6),,*LYXjYZ[Z[\]]n_`?3554IQR_RSTSSTUTUVVWX>?@A@BCBBCD#$%$%#XTRSTTSSTTUfUV X6)+,*LXWXXiXY[Z[\^n^__a@3554IQPQRR^RSTUVX>?@AABC"#$%$%#XTRSRSTfUV X5),,*LXVWXjXYZ[ZZ[Z[ \n]__a?3554IQPQRR^RSTUVX=?@?@BC"#$%%"XTRSRSSTRTeTUUVUVUVX5)++*LXVWWiXWYZZ[[Z[Z [[m\_^a?2554IQPQ^RSTUUVV=?@ABC"#$"XTRSTeTTU VUX5(++)KXVhVXY[Z[[l[]_`?2454IQPPQPPQ]QRSTUUVV=?@@ABB#"#$"XTRSTSSTTeT UUVUX5(++)KXV hWXWXXYYZ[[Z [l[\]`>2443IQPQ]QRSTVW<>??@AABB"# $#$$"WTRRQRSeTUW5(**)KXVhVWXY[Zl[^>1443IQPQQ]QQRSTVW<=>?@@?@AAB"#$"WSRQRSeTUTUW5(**(KXV hVWXWWXYZZ[Z k[\[]=1343IQPQ\QRSTUV;=>?@B"#"WSQQRSTeTUW4(**(KXVhVWXYZZ[Z[Zj[]<1433IRP]QRSTUV;=>??@"!"# $#!WSRRQRQRSdSTUW4'**(KXVgVWXWYXZZ[Z kZZ[]<0232IRPQ\QRSTSTV;<==>?@?@A!"#""#$"VRQRSeST UUTTW4')*(KXVgVWXY[ZkZ]<02IQPPQP\PQRSSTSSUU;<=>=?@@!!"#""#!VRQPRSeSSTV4')*'KXVgVWXWXXYZZ[ZZkZ\<02HQP[PQRQRSTSUU;<=>>?!!"#"#!WRPPQReSSTV3'))(KXVgVWXYXZ[[ZkZ\;0221HPQP[PQRSTU:<==>>?!"!"#!WROQPQRdSTV3&))'KXVgV WWVXWYXZZ[[ZkZ\;/121GPOP[PQPQQRSTU:;<=>?!!"#!VRPQPPQRQRdS TTV3&))'JXVgVXXYZYZ[[kZ\;/110GOOP[PQRSTU:;<==>!"## VRPQRRQRdRS V3&))'JWUVVgVYWXYYZ[[k[ZZ\;/110GONOPQP[PQRSU9;<=>!"#"!WTRSSRSSRSTeTTU X4&)(&LYWWXiXYYZ[[\]m]]\^;/110HPOPQQRR\QRSTT9;;<=>>78KDEFEFGPGHGH@=>>=FJTKLMNOXO PGDEFEKMMNNOPXPQRQSRSYMNNOPQQ !"!"7!"#9$%$$%&(&'=()**)*+,B-/00110 1011232H33456767M9::;;<=!"8"#$##$%<&%&'('()>)*+,,+,,-.B./0 101122122344I456678M9:;;<== ! !"!"8""#$%;&%&'&'('()?)*++,+,-C/./01232H4567889M9::;;< !"8"#$$#$%;%&'()>)*))*+,-B./0123G34567 878M899::;:;;< ! !"8"#"#$%;%%&%&'&'()((>)*+**+,++,B..-/012G3345678L89:9:;<< ! !!"!8"#$%%:%&'(>()*+,B-../012G3434456766778L89::;;< !"7!"##"#$:%&'('(>)*+*+,A--../01F2345678L89:; !7"#""#$:%&'(>)*+,,A-./0101F233456 7K77889899:;: !7"!"#$%:$%&'&'(>()*+*+,,A,,-./../01001F23445667K789; !! !7!!"#$$:$$%&'>()()*+,,A,-..-/01F12334567J678789 !7!"#$##$$:$%&'=()(()*+,@,-.-/01F1234566I6787789 !7!"!"#$#9$%&'='()()*)*+@,-.0/01F12122345J78 !!7!!"!!"#$#9$%&%&'<''()()**)*++@+,-./01D12433445I67677<=Q>>??@AABCEXEFEFGHIJK]LLMMNMMNOPQbSRRSTSTTUVWVgWWXYXYZ[\j[\]];<=Q=>?@A@ABCDDWEFHGHIK]LMLMNOOPQcRQSRSTUVUVgWWXXWYZ[[l\]]\]];;<Q>??@ABCDWDEEFHGHIIJK]KMLLMNOOPQcRSTUVgWXXYZ[j\]\\]::;<;;<=P==>?@BCCDWCDEFGHGHHIJJ\KKLMKMMNMNNOPPOPbQRSRRSTUTVVUVWgVWXYXXYZj[]\\]99:;<<=P==>>?@ABBCBVDEFEFFGGFHI]JKLKMNNONNPbQRRSTUVgVVWXXYZ[l[\[[]^899;<O=>? @?@@AABCBCVDDEFGGHHIHI\KLMMNOPbQRRSRSSTUVgVVWXXYXYZYZZkZ[\]^889:;<?@??ABUCCDEFGHI[KKIJKLKLMNOPPbQRRSTUVVgVVWX YYZYYZZkZZ\]89::;<;;P<=>>?@BBABUCDDEFGHII[IKKLMLMNNOPbPQRSSRSTSSTUUgVWXWWYZZkZZ\[[\]7899::;:;?@BBTBBCCDEFH[IJLMNPaOPPQRSTfUVWXYjZ[[Z[]\\]]7 889889:9:;N;<=>??@ASBBCDEDEFFGGHHZIJKLKKMN`OPQRSRSTTeUVUVWVWXWXXYiZYZ[[\]]6789::O;<;<=<=>>?@BTAABBCDCEFG[HHIJJKKLLMMLMNMNN`OOPQRSTSSTeTTUVWXXYjYYZ[\[\]67789::N:;<=>??@SBABCBCDDEFZHIJKLMNN`OPQRSTeTTUVWYYXYjYZZYZ[\6567789899N;;<<=>?@ATABCD CEEFGHHI\IJJKLKMLMNOPbPQPQRSdTTUVWXjYZ[\IIJK LKLLMLMMI<=>??>? @@A@@AJBBACD RWWXYA8:;;E;>>=>=>?@@?BCKCCDCZcbcddeefnfgfggfghrijkkjk5678::#$$%&'(:(()*)*(=DF+!#"#2#$%$%&7&&(%EQOPRUTUUfUVVUVWXXYjXYZZYZ[Z[[56789;#%&%'&'()());)*++*=DCDF,#$$%3%%&%&&%&''&''(:)'EPOOPSTfUVWWYjXXYZZYZ567889;#$$%&'();) **++*=DCDE,#$2%&'(9)(('EPOOPQSTTfUVVUWVWWhXYZYYZ56767789;#$%&'(;)*++*=DCCE+"%$$1%&'(9(()'EPOOPQQdTUVWWhXYZ5678;#$%&'(:))*(*)*+)>?@)!"/"#$%4&$@KIIJLNNOOPPaPQTTUeTVVUVVWEDEFEFGGFHIIA23456@78998KQS5+,..4/.-/00/00122124<3453R][[\^_a`ajbaabdfnefgh00123457!"##$6$%&'&7=<=?'"-"#$%%3%$@JILMMOaPRTUTUUeSTUV/0012347 "#$6$$%%'& %7==<>' ""-"#$%$3%$@JHIIKLNOOaOPQTUeSTUV012337 "#$6$& %7==<>'!!","#$##$2%$?JHKLNNOaOOPQTSUeSTUV0122336 !"#$#$6$& %6=<<>' !,"#$1%#?JHJLMN`OOPQSUeSTUVUV/012246 !!"##$6$%&&%6=<<=' !*"#"#$$1$?HJLMM`NNOPOPSTeRSTUVV/012235 !"##$5$ %&%6<;<=' +!"!"#$##$1$#>IHGHJKL_NNOPcRSTUV..//0135 !"#$5$%$6<;;=' - !"#"#1$">HGHGIKL]MMNOOPcRRSTTUVTU../01235!!"!"#$$6$5;=' - !"#"#$1$">HFGGIKJKL^LMNNOOPOPbQQRRSTU././01124 !"#4#"4;=&* ! !"".!##!=GFIJKKL ^LMNMNOPPOPbQQSRRST--./001A--.././0112E223438;;:<645G6676899::9:;:;;M<<=@ABCBCCD XEFFGEFEFFGHI[JJKLMNONPPbQRRSTSTT-./001F123345I767789 ::;;<;?@AABCUCDEFGGHII[IJJKL MMNMNNOPNOPbPPQSRQST,-,-/./0E121232345I678 99:;:;<;O<<=?>?@ABUCDEFHI[IJKKLMNOPbPPQRST,-./00E23456K6778989878L9:;;< ==>>?R??@@CE?=>?@@S@AABBCDDEFG`PQRSRSS,- ././/0/10 ! !"#0##$$#$#$$39897brp}qrstsuuuxPADD>Ѕу҃IPQRS,-/1)& 29896rT@EE<ؚFPPQRQRSS++,,-../1*(19885o T@CD;њFOPQPQSRS++,-..//0)(185p T?CC;КFOPQQRRS,+,- .//0*'19885p S@CC;њFNOPQPQQR@@A@ABCE2#$%$%&&''-'( '&BMKKI{ cSUVN՚W`abaac+,-/)' 08774p S>BB:К FNNONOOPQPQ+,+,-/*'08674nR>BB9КEN ONOPPQPQQ*+,.(' /7674n Q>AB9КEMNOPQ**+,++,-.(& /6653n Q>AB9КEMMNOP*+,-.(% /6563nQ=AB9КEMNMNOPP*+,-(% /6553nP=@@9КDMMNMMNOPOP*+,++,,-(&/6551n Q<@@8ϚCLMNOOPP)*+,,-(%/6552m P>6Ϛ@JKLMMNM() **+**,'%-41mO:=>6Ϛ@IKJIKLM()*+'$-41lN9==5Ϛ@IIJKKLKM()(())*)*,'$,3340lN9==5Ϛ@IJKJKMLM() **+'%,30l N9==4Ϛ@HIIJJKKJLLKL''()*+'$,323/l N9<=4Ϛ?HHIIJKKL'(('()*'$,2/l~N9<=3Κ>HHIJKLL=<=>??>@/ "!"#$%*$%$%&%#>GFGCy^LPOHӚR[\]]'()*&$,212.k~M8<<3Κ>GGHIIJKKJ'()*&$+221.k~~~M8<<3Κ=GGHIJKJ&' ('(('(()(*&$ +211.k~L8;;3Κ=FHHGHHIJJ&'(*%" *211.mL7;;2՚=FGHIJ&'()8$%&'&''((:()*)+*/10?EFXFEFGH GHIIHIIJJ\JK>9:;8`lmn}oppqprqrstcDFGGHI&'('(?*+,-C../0100101.-.C0/01233443I58::;:423445I567789::;;<)*)*+,A-../012G2334345667L89::;<=Q>>?@A BBCBCCDEWEFFEFGHI%& '&'(''((>()*+,A,-.//./0/01F2334567K7889:;:;;<=Q>>?>??@ABCEWDEFEFGH%&&''&'(6 ! ""8##"#$%$$%-0)&''(=()+**+,-C./69:41234H4679:;UEFEFFGHH&%%&'( ɍʁ V(//)Ї̆ҁ^1893ſ́„Àāw>DEFFGGHH%&'Кe%//%Қl/890 ;CDDEEFHHG%%&%%&''ɚc%./%˚i/880;CDEFGGF%&%&'ɚb$/.&˚i.880;CEFGG$%&ɚa#..%˚i.880 :BCCEDEFFG$$%&ɚa#-.$˚i.77/:BBCDEFF$$%&ɚa#-.$˚h-77/:BBCDEEDEFF$%&ɚa#,.$˚h-77/:BCDEDEEF$%&%&ɚa#--#˚h,67/8ABCDE$%&ɚa",-#˚h,66.8ABCDEE:9:;2Κq8AA8КwAJJBKUTTUVW##$%&Ț`",,"ʚh,56.8@@BCCBCCDD##$%ɚ`",,"˚h,55-~8@@AABBCBCCDD#$%ɚ`",,"˚h,55-~8@ABABCC##$##$%%ɚ`!++"ʚg+55-~7?@?@AABCC#$%$ɚ`!++"ʚg+55-~7?@@ABBABBC#$#$ɚ`!++"ʚg+55- }6??@?@@AB#$$#$Ț`!++!ʚ g+44-}5?@AAB"#$Ț_ *+!ʚf+44-}5>>?@BAB""#"#$Ț_ **!ʚf*44,}5>??@AAB"#$#$$Ț_ **!ʚf)44,|5==>>?@@AAB!"#$Ț^ ** ʚe(24,|4=?>??@B!"#$$Ț^ ** ʚe(33+ |4<<=>>?@@?@!"#"#$Ț^)) ʚ e(23+ |4<<=>>??@?@"#""#Ț_))ʚe(23*{3<=>?>??@!!"#Ț^)) ʚe(12){3<=>?!!"#Ț^))ʚe'12){3<=<=>?!"##Ț^))ʚd'11*{3;<==>?!"Ț^()ʚd'11)z2;<=>>!"Ϛ`()њf'11(|2;<=<==>787786gpqpqrqrqqwrs K;>>;fttuuzuvwvwwxx}xRCEEDhutuv~vwwxwxyzy{cKNPOOPPOP! !"#22&)(!6 !""!"#"#$%;%%&%.1001*())*++A,,-./0J:;<==! !"!!"!"8""#$#$%$%&;&'()?)*+,-,--.C./010112434H45678M9:;:;<= !"8""#$$#$%$%;%%&'()?))*+,-B-/012233H45678L9;< !"!"8"#$#$%%$%;%&'&'()?)*+,-B././/0/0123H4566788L8899:;< !""8""##""#$%%$%;%&'&&'()>)*++*+,++,-B-/012G456677878L899:;<< ! !"!8""#"#$#$%$$;%&%&&'&''(=()*+,-B,--../0121G43345676778L889:;< !"!7"#$$#$$%$$;%%&%&%&'(=(()*+,,A-/01101F234567L89::; !7!!"#$:%&'((>(()*+,A,,--./0//01G2233456677K789: ! !7!""!"#$:$%&'((=()*)*+,+,A,,-./01F23224545667K789:: !7"##"#$:$$%&'(>()*+,A,-./01F2323345676K7899: ! !7!"#""#$:$%&%%&'=()*+A,--./00101F11234345456J7899 !! !7!"#$$:$%&'<()*)*+A++,,-../0/0E1223245J66788 !7!""!"#"#$:$%$%&''=''()*+@+,-/./0E123343445I567ih32|-;<=E??@ABBIIEGHHIJRLNNOPPUURSTUVW]WWYYZY__]]%9:;=D=?@@ABHHEFGHIJQKMMNNOUUQSSTUV]WXXY^_\]]899;?@@AGGDEFFHIPJKLNTTQRSTTU\VWWXYY^][\]]7889;C<==>@?FFCDEFFHOIJKLMMSSPQRSST[VVWWXX]]Z\\]7889:<133455<<89?GA>F?@ABDDJIIRNIJKQLMMNNOV]Y[\]=>??:=àLĂa_``b5567-,<[WYZZ56.-<ZWYYZ45-,<%YVXYY3455,*; YUWXY2345+*: XUWWX1123*(8 WSUVW66780 -<ZWZZ[4556-+: YVXYY//00( &5UQTTU.0' $4TQTTU.//0+z-s;sETQSST--/013'()*+*11-.3:63;456788?>>FB<=>F@ABCCDLTPRSS,-./0.$%&',,+))0:1*1,,--./315EFGHHPIKLMNMTSPQRS,--.1$'<( (EEGHIOIJLNMNSRPQRR34457) #"! -C." !$#.KKLMOTOPQRTSXWUVWX*++,.$ '9( )CCDEGNHHIILLRQMNPP**+,.# '9' (BCDDFMGHHIJKQPMNOP**++-# &8& 'AACDDLFHIIOOLMNO))**,#&8&  &@@BCDKEFH NNKMMN())*,"-%7&&??ABCKDEFHHGMLJLLM'(()*! $5%&==?@AJCCDEGFLKHJKL--..0$':) )BBDEFLHIIJKKQPMNOP++,-.#%9&&A@BCDKEGHHIJOMKLMN%&'')% !!&2'$ !%""&$);;<=>F@ABCCDJIEGHI&&''(1)*+,,+22.0/.6/01-2985:6012:456787@IEGHI%&&'(0()**++11,./-BUYSTUV8[\N3WGDFGH%%&&'0()**,+11,..)_s)FCEFG$%%&'0())*10,--(\o)EADEF$%'/(())**10,--([ n)EACDF,,--.6/00167344/_ s/JGIJK##$$%/''( /.*,,&Yn'~B>ABC##$$%.'( /.*+,&Yn'~B>@AB"##$$-&' ('.-)++%Yl&~@=?@A""##$-%' .-))*%X l%~@<>@@"##,%&'%&-,())$Wk$}?;>?@ !"+#$%&&%,+&((#Xl"}>9<<>'((0)**+,+10,--)Tzzvwvw|f*sպB?ABB%&&.''(()(/.*++,,-5..//00663457>89::AA>?@A !*!""#*)$&&'0()*10-/092345<<8:;; !!"*""#*)%&&''(0))**++11-/0012:3456<<89;< !!)!""# *)$%&&'(0())*10,.//019234554;<789 !)!!""#")($%%&&'/(()*10+-./018123454::78;<=E>@@ABBIIEFHIIKRLMNOPPUURT VW]WXYYZZ__]^%:;;?@@AGGCEFGHIPJLMMNNTTPRSTTU\VWWXYY^][]7899;C<=>?@@GFBDEFFHOIJKM;SSPQRSTT[VVWWXX]]Y[]]7789:A9;<==>DDABCFDDLEFGHIJOOMQNJLMSNOOPW]ZZ\]=>? RUTUVWV[[Y\TGby|xyyz{{rOz(a_``a55676S\Z[[\\``]aSހWTVVW66788SYXZ[ __]_S789:;;CIEFHI%&&'';::;;<;BA=@9-9CIBDEFEEKLC7=EEFLGHHIJJOHEFGH%%&&%LYWWXYX]\Y]I)G`b]^`ba`dgV5DVUUZVWXYGCEFG$%%&$JUTTUZYVZF(F^`Z[\^_^bcS4BTSTXTUUVXFBDEF$%%&$JUSTUZYVYF(E^aZZ[\_^ccR3BTRSXTTUVWEBDDF,,--+O[YZZ[[__\_L/Kbf`GabchiY:GWVW[XXYZZ[[JHIJK##$$#ITRSSTSYXUYE&C[_Z[ZZ[[adR2@RQRWRSSTTUWC?ABC#$#ITRRS XXTXD&BZ^Y[[Z`cR1@RQRVRRSSTUVC?@AB"##$"HTRSSXWTXD%BY]WY[[ZY_aQ1@RPQVRSSTUA>@@A""##!HTRXWTWC$BY]VXY[[Z^`O0?RPPUQRRS U@=?@@!""#!GSQR$WWSWC$AY\VWXY[Z^_N.>RPPTPQRRSST@<>?? ! GSRRSSRXWTWB"AZ]WXYZ``N-=QPPTPQQRRST?:<=>'&FONOSSPSC)AVYT UV\]N3@POPTPPQRTC@ABB%&&.'()(/.*++,,-5../066345567?899:;;AA=?@@ !)!""#*)$%&''(0()**+*11-//001:34f56<<8:;; !!"*""##$#*)$&&''(0))**++21-/00119345565<<8:;< !!)!""##"))$%&&'(0())*+*10,../019234554;;799- !)!!"##")($%%&&'/(())**00+-./018123454::78-;<=E>?@ABBIIEFHHIKRLMNOPPVURTTUVW]WXYYZY__]]%9;<=D=?@@ABHHDFGHIJQKMMNOOUTRSTTUV]VXXYM^_[]^889;??@AGGDEFGHIPJKLMNNTTPRSSTU\VWWXYY^^[\]]7889;C<=>?@?FFCDEEGIOIJLM TTPQRSST[VVWX^]Z[]]7889:C=>>?@@GGCEGIQJKMNOOUTQQRRST[UVW X]]ZZ[]=>??A=3567;;99AN?4;7789::?=CXWWX[`[\]]bb_``a556791"$%%&&++''4F2 '#$%%*(1PS[U\[XYYZ5691#%&&'&-,((4F2")$%&&'',)3OOPYU[[XYYZ4581#$$& ,+((2E1!)$%%&+)2OOPWSU TZZWXYY345560#$&%++('2D1!(#$$%&%*(1NNPWPSU TZZVWXY23456/"$-%%+*&'2C0 '##$$%%*(1MNOPPWPPSUUTYYVWWX01235. "# *)%%0A/ &""##$$)'0KKNOOVOOPRTTYXTV6778;3%&( --+*5F3#)%&&',,*4OPQSUZUTTUXY][YZZ[455691$%%&'',+)(3D1"($%%&*)2MNOPRYSTV\ZWXYZ/03- !!"##(&$$/?-%" ##'%.HILKMUNPOOWVSSTU/0013, !'&"".>,# %#,HILSNPOUUSSTU.//021'())*)0/,,2<3*1,. //437GGIJKRLNOUTQSST-./01:446787==9;:9$A9;<=>>EDBFA;<=E?@ABCCKTPRST,-./1.$%&',+()07Ndgbccddeik\=mSOQRS,--.1$ '5bv5 ROQQS33457)""!-@BB"#!~A=@@B""## }@>@ ! }>:<=>'ޖ߃߮&sрպB?ABB% &&-&&''('.-)*+,4-../663457>89::@A>?@@ !) !"!('#$%' /'(()*)00-/192355;<8:;< !!"*""#*)$&&'((0()**++21-/0011:345<<89;; !)!""# ))$%&&'(0())*10,.//019234554;;789 !)!"%#")($%%&&'/'())**10,--//08123454::78il32 w;?@AGEEGHNKMNOURSSTZWWYY^\]]78:;1234;89D?B?@BCIIQIINLLMNX[[\;<8cNyV Z^_66, PTOZ[55+NRMYZ34*LQMWY13)KOLVW67-NROZ[11'IMJUV/0&GK0ITT-/.?JIKKQNM;IWSTUV]UFY]b`abc`QST,-/*# "6(# $%(,DBCHEGHIQR014+ :' (HJKPNOQRVTUU+,.'5$\'CEELIIJMROOQ**,&4#%@CDJHHIJPMNO)*+%3"$?ACIFGHHNKMN()*$1":$=?@GEEGHMJKL,-/'5$%ACDJHIJKPMNO'()& 0$"&<B@ABCJHIJ&&'-**++2./03:7899@<9ACIFGHJLFGH%&&-**+,1..+b{{}}n=;FG$%%,))**1--)iu=8DE)**0--./521.jv@(@!"")%%'',))$gt71=>&''-*)*+0--+Oea`aahY9{:AB!""($%+''(%)&&''.,0'&.+,7;<= !'#*&'-*+1./00745#<99; &""##)%%&&,))**0--//62355;88;?@AGEFGHNLMNOURRTTZWWYY^\]]789?:;<>DABECHFFHIOMQKJPNNOPY[[];<p}OMVW676JZY[[_]\BsRQZ[010FXUVW\ZY=p}NLUV/0/CUSMYWU;lxKޡKST-/04-.006339;A>?@AGEFORWUVWYZQRT,-'i@FKQR11'IFKKUU+,!BFFOQ** ACۀDNO)*AB݁sBMN((~?AAKL--"CEDNO'( mż;˦>AIJ&''-))**1-.00634{;89::A>?@AHFGH%&$WUVV[XV0Kb\\__dW7OSWUUVWRADE)*(BZWXY][Y4Nd_^_agZ;RUXWWXZTEGI$$">VSTTYWU/I_[2dW6MRUSTTVQ@BC"#!@A"# &'%7DBCDHFD/>MIHIJQH6EHLIIKLJ?AB!""'!!""($%(',(()*0.0 74456=;<= !'#7*&&''-**++1./0063455<99; &""##)%%&&-))**0--/062355:88;?@AGEFGHNKMNOURRTTZWWXY^\\^788@>>@AGDEEHOLMNOURQRSXVVWX]Z[\;<=>6789><>H?>==?@EGUUW\ZZ[[`^^_6694#%&',(*B-$%&)/PPQXWV\ZZ[5573#$&&,)*@-%&'*0NPPUZXXY3562#$%&+(*?,$%&)/MPPTQTUUZWWY1351"$D*'(=,$##$%(.KNOTPPTUYVVW6795%'((-*,A.&%&''*1NQSXUTUX]YZ[1130!"#$(%'<*"##&-ILMSQXTUV/02.!"##)%&:*#$',GJKPNPYUSST-/051244:77:6:789:@?E?@ECDFFPRRT,-/-!"#$(&&4\rnnopvgHǗIQR114+ 5q{NITU+,.'0juIDOQ**,&/itGBNO)*,&.hsE@LN()*$-hrD?KL--/'0lvHGBNO'(*%,ZsnmnoucA֜?IJ&'&12234:6715=:;<9?@FDDFGKFGH%&|;<;FG$%;;8DE)*??&' `6}8{:AB!"' " &&0('.+(,7;<= !'""##*&&''-))++1./0074455<99; &"#)%%&&,))**0--//62355;88is32 *9<79>BEEGMOOPR[]7Ghjo[gsupf|}g[-dר Q+aӥ O*cڪN)ImvmN0+(!$@ABEPS,)("#BIJLPP*'& ">FGILM+(( "99;=HL%))+..QZ\Ta]B&+,-0/zwz<$())-,sq"t9"&'(+)uqs5#''(+*AGHDLnloM; # '%&%&+*)*,7:9=>@EEIJLQPQRS[]9?EGLIV\^]bwvxe[4A[\`Q~S2>XY]N|}Q2>YY^N}~P-6EFJA\ghalhO(Tх̲~qN"ZѐzH WΎwE"PՄҴoE$/CDH;DMNLANNPJE$4XX]ES_a[FVVXKE"1UUZBO]]XCTTVHA 0VUZAO\^WBUSVF=#)44807:<=7?@A@>" !$$('(--12499z9>@BGGLOQUSWXY]]9<:<@CDDFKRWXZ]]75%'*5,$&/OUVWZZ43$%(3+#%-MSSVXX43#%'2)!"+KRRSXW.0*+.32/07FLNOSS/.!"#.o|}m|K,)(ys F*'&vq#C+&!cmn^uD!?b}e_B\ z=W ڏt9X*s5 4eehJ[jkcMmloL; ! &))*,7:t8mk@ Kϭo,p=Y3E,Wso ZJr(292z<F/{ v4\…3h8mk #:<^"?7Y`B[l8mkH]H\\r^ts8mkt}~DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/DisplayCAL-testchart-editor.ico0000644000076500000000000044716312647526530025571 0ustar devwheel00000000000000 mv (@@ (B 00 %3   / @ h JPNG  IHDR\rf4IDATx̽{fYuιc5}aʁnj/Mu{S.M_ZoKJmmlЩgyx E'/~,eqo}GιUE51u%M/%jwZǡ$G׏3gyNCY MӜl;xtU_?צ>3>7~tn`?C78uןENozӛ~pߎh9CY)moo铧1 x1>C9f0ey+?_vIO+ܦSj0eBU}x"R B_}<ƴE;;J\p5ys :_H>=5$қ=t̙&<8 un2׾O2s;Z?zΞ;GNy^2y(/D֮vZG36g5YKuM/w9cN}m;iםPvȾ_D!? N͂,P2XHaʖ2RV Op+u}3I;gI$^\?nNb)FQ{;k"R`PUw͔bA1\u}=X=:JE4(\`Ā[d>*|6.kώYsΔ>^.%/|#1qSaY8uCiHy>޺w?Ý@RNu~5;au:H۴k]Tc ;@ZԨb) uB9E}rJܠfY EF݀ ~mw<7G&ikw<S )p^!6@?#cΝ?>F5tW#|v k㟏kwK8tlN<)O]M&FKRy"?`FȄnw.AN/ϢQ bAu!;)=tDO~-DBJyuF$a!JخotT@H/Kt C pEE!sX 9r$Kpfs/_nŒ/B=gR?EgZF]C שgՏ<']].O"C3Y tl eA(XQ)4Pp/7F *s\tUWqgVc#7[2)u2.K.jm֊p3ѡڥ$̴')٠Y$p/%os׏Kе-= 95b^#OHgGLRʆ-c??Ҋi%7?K2)$HN`2fRF IH }%;놈u%ˏ 2i7F)IpСBLU6O% q0Hgn1gw !q'w*1cXT؆ JɤIXڣz2!Ƌfn@B`Oi;+b,zj4ns `uC% w\8s.U>IWPXhIZ }w_6䜜(뢎moщq]ߘk@C=܌y{&`~BwqЅyDoEZdvnf5.~` T D#"|6jTƯ|?o$tr\jm:ud]w#YKS\&Ld1 zW 8p2` LPٮe.tFL uGG_ů'-V1Q8$P{Qx]f}cΎ*_H T}jL%ou urOpZ%3j@ " )Tg:%a Euj-#Gй l\> ANy+HM_)a˜u@74qN-ٹJI/Ai'6y氠Nfv쾨( s#v:m ?m;r\*|]ie 8\iz qu{KH% ZEHC !yM[ f@VW ݿ% h;~˨9翩G Il pJ]Q]#d֩ESOٍj3Yd+R֤U@Rʓ.NT b-V;2!Vݥxj0%v)>Y(r]Ա j\&& VxqZ?-C 5JW M0}ViFdeF 8*?% f¶F0No|b꟩M֍[H\g@mh¼.u`ER Zoo{N H" X܍*" 1 *f@Q+;iYgHAS􆀈J),H`;G2,HJ0q}o sF_q2Ot8r9HR!Kӻ%X?N5I;y =aPA5LZJL:ENޕLqA&8;h%E *$(xq2Vvݙ83;gMT3=ˢVm=2 #wQ$*@BڻШN7v9|Ν?_/"5"*1u?$uJz"J`BۋM&pf@ˈ}\L{T;0cmYGZkk{sJ{4` rWHATNpeA) $wwR&P |dpmF@MQ:Bf,j$QP0 Q@YR_yjWFrW *#\|gu=?Nj8#C *1iY+ ak: xʡP:K Znmd2MG q6' 8 1cn : Rs!؋ m}3Th[$G7Y} !o [w"$U%s9x 5 bCap"_4I=b|T$oL,f@w &cLgw7zs w{aЅȋm_KbDPv67G8cVgkkrsЎ7[_TO@w2b$e3;4H0.Q@ʽ`ip#bd)fQ`mUGy5YJB׊`mQ1Gs" WHkud)@+R NCm-PpP9<]POZR x2vάGgX%p~ 1Wo3|tY}6)ET2ż^LjF { `vtWYBre^PQP'*ѵ9޶  lsK@:, dtO!S^ ۭfQ.w&N9# :fհghr:+}̧R'I=Pm2w¹K־Z&N` #H7ɱB)zfG(dE5 .uX%!Q3fʮKl&bZ|𨚨D[DFӓDb=80C+oq,,sjE_[ nM5 c­VV \%?Q$>ca@k~xΩ.֊5 P \D)eww'#2z<zvx^sz^oJXpZ>y9{2v`L1`I EJ.0@~-|9M`5_ށgJPP$jq<S)D]?M}XP͙REPN{^<ѓty i@LZ^{AvZg7ah*v}o}zx۳ =gD,4סG_.A2"apbg3KC3sǧ)qxiu'a o 5sXf**`7Йgv.,1|xy#( ;ʎGE*2:kH 8^}}4-nZ67^U #f.4Ʒ?2~f|!"f>^!b* "+EkWMׄEKA8V(,[05&+zɴ iwss;I%  ApY}GaԼ֨FD! }|@j_9eyw; 2p#T)!K(  sھquUֳ- :1Ę.\p>7mRCVT%u7c(Fs&7M3|2*t\`:F;INPV{($ƭ@) ^̶wX蕌AU2JN||Kت>B!<Bmn1EI9G.dz/Q5.ush ,=">r )i_+5>7 Bڽ o8=Vk)o"8qu*[Ǐщ'N;P}VYGf8C|~d4N!VlQGbbn{ h:oJ1dd3 M-nD1bvH رcSL@[_Pe:K;iB$6\#~QL9ʞMfY@]^㠺~Y |QyuQg e:,!߰@.ᄼ͛qЬ}:tf4Xs.`_zwB$G@Y5/OI 1bR;u US>[ʫC@u0ZԿC} _똻t~>7E& D,J~T?r  {usq %!M~J^mԭ?~lK7Afj/$[74E6mPP~b^L欉iAI|F a;2˞P4n?>n|&xiW$@b볤=u E|0Nl'&zwS \5?M@uyپ華\]yu*:s %E"Nv] $nBʳcDτgŻ. YPZ'$&6å>A͋|u\b|B$Y[loj.n\/Vy;Hx.EܶeK`l:0 <4-D:~xl#H-^X-G 7ӟЙ%?PT/z(' /IZ$s' @H@p|8 1[1qꢜ o=W<j@)N>)T}U>RC+9z%F( ЁgY50_Di.9;&`@zӏΗӊrRTpz'd+ZFڨ"`.E&TUn}y5c"0 tV0 j =S=\Z[ Us斃/_jݞ 8F*Tϯo>>I0g79 *F4F?sb+Ah:`eKV%#a(V%O5S,EXS:"=hFm)n*. ޢzWȇ8oP{*3*Az#\jAz*Lyãpyt%:Jh5RS[%`HpÞ:D1ɯń@ԌYGiQh;~Y$t*+ٸ->(e5xw|Nrk^fL74L;hSR~)f\-t1\?|t_r3#tpr$އ|$x_ WϺ襜Z: |cTV={gX@0He2{tÕ ǿi-~L/kS7kL@ɿy^ s \yGߴJs:,a?qRQP͚2L_ UhWM$H~q@lPLǟ$?4l}^R_ژ$˶j#(~-Hv1Kz4 Yg'"B;3JG/;@ ĉ~nlN  [@ D,D}CbPĻJz@}Qt΍g*}!Ѫ42g*d(*6< $Dt&gOU؝5`RIJMoz}Y; 9?gi`1 AA3ɁN`^/9A8Z~ i 0:t",|7Y08 ;DTV %o\zm(K$"sks?󿑝   6a~\>7)yҹ.B\H*>;`и]we"Gp6 | nSFm5 Nu>/k%[&O=FKh H8ia iRp8߀9+2߁WEkn%D~iCn;@_OQ &8_0ǏLQ[IR ?KнaOv pBs+@y~Y١7'=wpY@ =gez4iy*Ѹ] h_~t=j%GmN<篠lKr]n>p}B+NN"`p,@tn;*IHݒ_p3pCH@o$ؚ.D3I,k5 U%$^[N!:;c㮆Zp$Qnү>sM"OtqLn= z:dwx?çt#GfqBu_bDq`0OWjbuv/9YhA'_߉?]*q7ڇedr.;֋\3*p|EٛsA:94yY"ֻطp<#y$ʙo}>Ի l:9E:䁉Џ ȘPQ._4ci|n@yX)_ ]  |ǒX Z͔`CU~0^1pu4BjB/ XU,'y:̮ p' $ `z@@L= '+\t H6D`݁g+IWTOb͇euƨx7@G/Wm Dǁ!䉑,D&pq([onVNK|`z  l5pX\R uUVӳ#'=*!" Jx_U"\~e )8_6b 3c,g~z&^ew8ΜS3G)By= gbDH.wg'VU'cn3^iw 3&)^}: a_1 zX `W`7i9 "0Q&c_27.=մo >Ɯ=Yb ~$)BwX%$`H\| =WQd=҉R7]($ ]7&'=֝swm7ɹR̀t:zzJ K͍>DL7|bpg82lmɨ}h̿ւ`4& FO;U1Mu%w&XEQT\$~?c!- X^uᦡx}1T BR 4?/$fNB^|QTXkgOB9ВzL 6h |*xx739 Ӯez>  SsڛTo,DyoĮRzL<ɻ 6Uv|込^zeD/Kw<t(Ae~俼HCV`~F3W!ICi 1I&eH\R@P$ԽU'+g޺/T %ޢw2w+'쉅4 G0|{\d7͈Q1{`i,Ԑn,4[\!O% uxTnpbhס$*Ìi+0e{cCkT<~ٟ EFv+( N ,z X݀@wBC`n׿n x {3ib`oe7@ `tI n?֖'g E@ cpi|^{@b8qw* x*xUA` /iwm!M]չ'E"uSv` î r/%s5ysPi>LpL/cP' u*,EAZH|I|1;7 &cGF <53)5!'11k"pQ6瀗*59`6.$(X;EQFwm7.!U O@ܕO$ +dA%=婶I/06xH#g!ߟU<'eTniݣ Ql_iZu *Ԡ/ p|YG@ !Pz:ɚ&׽C5 Ueip(p%f iwB>`&81&\/}ՆH! X} 6ٙC<= xQTAR9$.ڐ8?zAK_zhm^雂1vR^NٝpPpjO&޽/w`Mϸ{7!w]T^7 @ ftgĨf)i$LmرnR_*9b .sJ-OҰU YL7]8h9Ch$b:6KPdŋ<2p\мo=GH*X?ʤk0#A fDr& SѣYZ_je OI+ CCh3^_xeR"{bx :g u:C"s'ܐsDFOS'V7` 2*a]=6#%(hؐB$zJΪdZ ׾}WJPgɀIޙTF VzvJ'ɓ`p'uޮ=B1heU  ' *PNo=*Q? # &aM~b#ІS 6",]3JIr\`s̹s=S ǩCa[:Y<2!~ vtQ,'P6f`]wҵ1Ez;2P8Μe9}<)8dM_\pIT5R5M<÷8wja3}:zg~ԼH]+c3H?1=B]C΍I 0i 9_l")A"XV } N/;d\wcpW Kb *[-D-̧'3`gw'$&vHQ$`Qi]g{#@Y!LţՔXJY d &TaE!P{m@ʭJxT=v( ~}{|U\ݴs9FvjO 8漄"ͣ|drT΁CBU0} 9couTZ "zn,AF< .2f`#:3k&:̼ޑ_~&H 3_]hfvة'Z$8%I# `W"λu 36?!9Ǡt }um"bk&3 |]4 XteL鱿~DN-&B'=&v(S!kOQΧx*3hTn?pwaR[Zi%SrQbt0zGM|6›>tIK`iYHmй+2驊+aDB ׿N`](R]Ug)qQٻ4 + HM tX ĝ!'~sbG $b l+V 9cĮvʝ<KOA3?\Xh%̮WOfEQ$ Ieq[>J#P7$Pq\nA A'Jw^8bgL }g/*䨾5P%ǼX⒋BHI$& &Z) /Z_zUUT~b٠g `i`M*@[Tg.7سm`pF::~qz'ǒ7+es Qv ] *E:F'NZb+MK tZ}*{[ǎ'$kǯL"/A*^ov7 `}_X.gaG2UԤ8V_ ؠr p T|$¦C1 N]mQ8sM<Ļo!so'yi`7.9ۈEDּ'D"y"̙-qXRfV V"mm d(/GN=Ahɨ/;@m&xnp_c ` P=8e wkP;>u[DJGN%wYiɊriǢ1]_%37< Dk x) t&4aG@Oe{!{Qwz:v1: hϮʹ ТסwUОmIYu>Mz'5L>\3l HTj|lhnNہ%H8qt[G7(df`&?jX v:,i}cvΈޜ -ҮZbH%hDc NrlO>ZtcmFU_\@JJ:9UtcT&W[JA( pw<GG8sFQLA1W/bXY7 9q{@ԛqŇPpeb)>ƃl#5V=Jvxb׌6hgs-<̀l,ْ >0$POB8ڦ=# }2L7".pJƔq[hE{aӟD"; N( Ts4(H\Q-84r+̴ ⸶dS|l$b$,+CM*&z+5R )8IJx!ߧb$o_Jڒ^ ZՂDX( l!aIRi9Rv\^G6s<uS2(!Zdkn /9U?v# ޘf6tRmP]$a &͌ USL[;Pc];q hWxa CtpA::i"ê9G6G8=O/ޢ{i671:Y8-mZ'S+AGn޼HD_c߳/JOGAu8`a 8cg~_$R3eBDjr 0m 4EL1'dg;J 9}@kgBXPvؓϾl5J5lT)L̀eҪ:ַBTSM[Wԏ*@$-3N[54$qkA9GG8M~ <0ڊkI͹$A fT"]o"Vr><` [$"2MOC3o׏_`-)]F tBC8C) /[/7 ->71^OWy\N?:maYozoio+ COگצNW>g{?b}AElIݜWR֋v93# Fn|ԳngQIQ}Y3ک( 3u]u m1QR;g@J[1My[RQ4i 0؅ۅN>ů1qwO*@:}@Tm0ܨܨ H" 4@38u {.Tgc-ſJ]h;uۋrrYyt檬o{Y"w2i r /"x|֥ݫ$7W>^{X#?R= qouب*{kיWš!' Ea/PX|6%ƓQd;^NLőIP Ag[,>4ԏ[bz}~} ^&C;UKTnm\)ꁭ")vK :6FGRk*/˙$3瀸+kX'B- ̛ٕQw0Kwx'"2/S^`&P߭SrXQ,槅ْSp_ ( wȃ{]xmURPJgdLY|(T-c"T$u{ 3S }Q~GV9t#Tg:gR*iU& a<Q>HjOׁTiavR2 6]F,SU*`,oBJz^|AڃuNsϕ6فGr6;"]I.(w0*0>{X܀O?n,~hJ">{ _5"]8Z)y ?}\ -*Ms{P4U16+ñ3ȓ5>,F_&r 'z^ ` C*շ|Q$ R~"N&D(0&|;p&E K㲙j|&!pR .7ߣwەQh1?-:g tE_ɟ87ՖP"pT sm{2F>cV&G@~~0^~b>yv'b۰d6AFJ^2|i̙ajT[1.^& Mfĝ45a b^j ? ݒB=K> tU䭔$C+lpI u60\_@^?}8hRz2ibYZ0VPla}:ݪ|Lݓ8[MoHv`Jw `+a~7ne`"η'/_n0[^C:x<.> eLeq'0?>T> $lp^A}]E(!.L89@XG'bv`ur2(.@T8Q[i =``:'`>e^h-)wt+XI! Xa@ e,0@2Yo=wӊ7AaOV,5ۢ,{XBlOLiGMt3N7ڡI0T/j@mI]j.; z*$TQރIx}TUn/)z]B w~l%qwO0]oKAoIC]ooc&qB7$zkj"۷ ]z)e5J:"H>lhNRN@gBCDE%og0Ւ@RNdl8;.@;=#ML쵹)ddējw'2“@ ؝ޮf'7U/ Puv$U:f@> gJ%2.-E $|XYj%#p74J@A: 5.~p<IGRW/^h GL*2U*}]=IDUu*~a3ؐx>V%R@R} 1#>^0@lCf&{TX: -"?I?bf+'!ω񿽨AuYBuiO UP֕@{9~G;)Ē^E 3b5oaQ7ge P.t$c}~0V?;_AA߿_U:ȧ߷"8}|hz F-f9oDhٷ+*@+2 ?CG Y J'0MDxF%TeG%'DwVQl` @d2eKxF UB`J':8$qq:.QmxHO?HQPx;0Y-T ]LR]_A\-,܀X-wڎrX(Ǖ.zÙP .҅uuQ$'}'T%Βt$ALI&U+%4%(' D#AN lϓޜŖ=i]V8/VF=3jP;I8 Bz]?5ex(VINw&Xa&]y])@21]4*} P,S 9uӊ Yڰ$<:rz79 ,ZVM,tptZ0N \=X ~[q-?EBA('A%6S=%aeI9(B ˯ pU @] Way)&[JmTZb SG@-N/0ʡ@1.|vk8]E /63<{sR1:sV6cոW(bTï+;>\: sj_ dɉ \# k!2`2<5xiA.- 8" {W•ڴ%; F!ӳlH9`ع_#U`|-U 2pMg<,p*5ܷkcV1cǎDEY \rE?Z )o)Ih^c.]뚲NB WΌAGqJf%$&($hN ǺuZw~ЌPIE/ [ ) ֛]YlA>3C?&O@_~D71F XyOpӰ}a 1;yO7)\Q i7|n *`-i'4WUEFi6}ؚQt;̬:KycFނXlH0ubd+a xq X[c J>R+:YL - Я U<u8oЪi@B+F~"1m|";|פ̻cǏs8'wP_yf\@Y;$9/=jghsfJ))%9Q~V%PNYuaăAؤJU,)HDQ^e#ЩSrOMZp]Xf7$o/ 5ؔ?  Ȟv <,RmDA}|;"dg%n8 h@ /y~H+̌ Y1>~|V} .@)Y3/\S <'EL9;זŠ Ix9o}A_{u^c/UE4h|- ~k((bCp5zIwVyU`?^/~5X[,)1@mK1 GV*/V*{=Ahtn M3-@ 0s2*-}رcy~UuhD(\]*_{S :noU(D onp"˨(r*|e1thE@mFE}Ԋ-o&CIOIùs i*@.Yr؍:A@{g~Ls|fP g9WzJysVch =*C6vA*0"|o5t_GAAF鰍^j' f@_ٍ̀zumY׺`0E@J,i^f79$Xt/]Ƈκof皹bjI$\pQ6\/(p}7'8m[&zup;/꓄(Z @lո`{Q? U2$O(9 "vJpiVP,f!```U:}% =e*j)^J >ubO>׃3,`mv_ GA؛ dՠ^=P8)(Pċ? pu@ F]lx?@|Ӌ@DBuD`t3]dSU׃{%X|N T8 髟}:0%hu I A'@Ke2ŻxP'sV0gHX iy^GI8}ڪÆĖ hA\Z %/-C% tC12@p7`+ljk7RNgZ嘐b[82oguxw߅>vOK >U lK/T*($[&]mfnC!kׂwh8V{ᵡ]1ERƽ|͊@-sGGO& XM( ]|^%' 0Eu@`ְ^+aZ`dX1љ\ R@ 5@[YK!k}S!:$}C[:YF.].RAl6{{Uߎ)`՗e-7,%iI||i0=Xs'.9:p"{ \y{ pG ))s{7n|ɳ{M N)ҰaDDSU{Wpu:s?&P_?r8iZ7oi0-S ,A@>r> <6;ͼpM~F))Wu@JN 3kP#_K`' HA>wtmθO'JpY[vnR @v[SQW?U+ӮR-1@"k놊æ#o@b&"^Yu]:N1с"U퍉s|1?7¼@VJE=Cy^On8~D>58d@ 03MzRpaZRVǶ CKNRtb\" `‹ΗW*@$'H$W&qr*Q8(}8NXxQ@3 JsSJYQ_j%N{T7<=;>*^" 1¾@ze i%}HnXk&"һmHI=tfxT5E.C@La _z"{XP$ .x!xxRPRAS6:χmVI>7P;$Y8_|YԫtVuTljj #9=:857m*`*ҮuLX(L :<\]8abae&>+EhEfJO“#&V%T&aSwO@,f9jc9}-~~ỲO37U? l̏g@)9j+P{g_.6 ;^2+p뷊y*@"ȷ, $ aH v6J$ >)&4HO}T[0rH0zbZ!#` C"_Վ91k&0   NRl`iazvΗ7 /0} yP-:Uӣb6ŏeA2g'\ikY7^kq5\s 83$Ʀ2s+2B p+}Aܮց9uq{5ș/S >*'y@s}cbU8%c|ߡS5X"a: PO\^ZvnN̋β@/gk$wwZ7.Y%AKD$Ǧ1~{~+y!t7M$Fh:YZΓד`?a!{W rg 8H-n~45`EтL2j_!8 Hg.6v*fmGW?vmˎJ,^ۇ}lKOyR!@hk1|N $U4:©8ݴq]`*b(~AzaP{-G!NDsm!;LZYoH׃!]u6`~7wLg"bpsBN{|%Nmtz([5ڂ6 ԁnkvxjb|DVt!/Ӄ|@^5$iv{6@Y8Z ;t]sHF %h@m.H YEpR{C)lhS)(\< Ժh ېA~@iwfq@\.I!@@:JRk`7Z@@ko%' ƅA ta XU/|ޢ>M%3T81H@<6gMh}@ _τ`rۏv.9 I +K>L:|~顒KߩsEDpeĕd~uwu 뽉mҩSOq@O?me]gJaNa: VgHAlh$ "1X0!15,FRlg qP XvrtVkORP#',awϽ?. n]7 M/Dp_ {=>;_ ya_0EXmӍ6{8=qrodT%eV i& ;vN8A zIlًVWCLx"ۛqt#M &&heeeJ.:u8nvo=5Jwo{T)rZ~ V:3t_3*hd${w\`ZX^_DqFBi*;H s';i|H;0%wƠN5p 'x 0N"ب.} ܞtI)hboM/BULJw=ъ|l{( nCw2d!RۨP yissy.[''AP/nswH5A 76&gIGT;9HC@+rPX&@?㠭Y(KUX'@Uq<:[pUēÑU~L@\4f Do8ùr\F]om;'A4F^>6;p JΟk-@5FL}ՁD@⮉^hcE᭧n>6{$gDq ;a z'݋KGQ)`g: >&fOg2)}&2ޒp#TWdC$P</qv/*_R*3f35.u)x oEVM}>E͙"@.[l72D:+SAœ$E0 ԰n?qsDSQLU^G[CK7߄4jklݡ|焚%SJ 1 ҤOG^*J@!<ڰDhĺF%l0\*1Uu~c2ИP/?V˭nҽ{NDĦmTQ#uNf(x)4^Tٞrpwm'!QdPZ`o19ҲnI~rv n_ScU%rEd]򝞝rY2V^;7?7l6V6l Fx0[vJEݠ]5Cz! 9o% ,DdC% J\>O=T# (?0,(:xk7A1LSm,_1?7L΢{`FPSĚ`cZM[sr~NNj|:zCR3VB9z<(hiYa.QӽvmKQ[@rqFe Hԛ/()\oYP5Fe;w0~=TҖ語%"Xp"@Wg]`qۼ*\a(^7׵lk0 * 0޸zjEbGU JW}x6X0CVm c"E[ytqy98$}>0;w\1@,D͙Up]N}&)[( N.((d&II'uJh{W&XhK"uPQ h[n{JijN:e"PJf,ed4TIFTϞ=f伶$ڡmoӸ6]x4ȏr O>7ChA>vo@9Ꙗۤoj *y'o~f(_D7{/2?:ajveGx JF5AwXx#_˻,_*|`d",dkyO\FIwۿs(2aVЬ@/]G.g,/0?JVnɶNiȖH7f(*UC;(9vmݷpؕ&/u:LbX8Iw>3]2#?Oz9;T(Bo ܱȂL I{IE,l\byu^B8I#@В6 '#Q "x=zin'M|ᑭ0. 00@7);dݑ}tIy#Vь@Ijx^0B9 H E[@6YoC,N6*n|w9BCX]w$@lOF;:t?\wm)`sߑMZxL I ح6;߈/ `37)~&fV+Jջ<$%Huѫ30((AA'Pz[KQQVOg{L{ҁfkZ HTP~6ch`򴘆dVy\p>^BwOYiKȯb@<ͻJӉ޹c_m &6b2Ίz?+6bo=/=R}X (sN`|&o0Jk6xF6"Oz3"qi;NE0Vv^$"*eerڅV $Hg8@H"A`ۈ#mD/%+D2fEI dPW3wihIò_x%]ٹ4Η@,oI"SЃۦ>2(fmse|؛&*dǟ)2XBS|-#)t :^q*Rtf'fOk^0J{Kpb@aXlZmjO{=)]S||`}eZ.k~eVA M) @E>8F0Q%8rRwMV+!}EO* =|6(e>5 qfq-VA(_-IN!8(W_%VAk)3mRNj|a77A$:hGc? *7I}Bin"v/>D(=&&5޷j,16 2U]}iJKxb T(Szaj9 :R'7c Lwwpm^O ڍjwj %Q^uVRu,yhE)y3HahYhlb Tsrޒe`>webJC/h\3` 0xiP V.t4Rݨ]ʎ@/yFfet:ymÄDbkd(r٢l}er?r𛡷D!`D]&2I(0~ ʺqa募lqk'_۲&eg mKtG (鯁HV$r:捛}cpjEW/(14+sMU+,`0͉̀zf!0HA7vC6yVmpa)r/IOꝟJ7ͼbpBI{R}ȷY`9Q+ŊXL ;dl0Zh}Gӆ„ (ދ)<Öے@X[tx[ ΠA7Is* =k'DÛ=<\EN ڴHbǦl .`<%EDV̈́`͇GH~'D]FJZzh F2WV|fjߑ1~jD6 E*Sj -'$t l` 6*)w6`"MH W=Gh32kc4*/9(h0+7+X07"j;Y,ZˍT -iro ˥8 0#>þ2:t%$] Q ؼa}0>D.(U i1mnM@}ae(HM$h adDo?A7ͪ~؊nAeA9wB  U:.m{D|[ہX6 =GEG V+\,n=,v1 7ivԱ2T /6}.WP m S4H=O=u![g?l/\%MsoBHN=`.ª] rͼR$R֏* GJ4n7B~oob}X7giD%)cI׋.F5QIE__tu83t7.j5S@b#``.@[ _䛊X>kn 2 X1) ^ tQvzSULk^he@dVi(JvwXO"2vC^_ sU`y]Z|+Uv-bK# {2%BX!Z۔ g} \ Ql3с =8j<3D~PacϺ=-EJ#@bfQT)ҤO:o[hMsLkOް`ʴ+ך:L@fk?IrXCT f44M{$kcNnMs2驪wsdkj. |:[0<2W 1>顶*Cz`ckc72o{hte0hy rbpd׈M1{o)VyE`wūW8E- &1XV4;yoa dE> do ȴ> `' +&)]c3E{@Ed t-@*XM! i'Cf=̗+m@󫫝p2(QBOaez,"Q٘BEmq@ PJ)Dyag1u6"YpXbbp<yobP`%=O1WB\y8n@ xEnԧHP?9*@uvkFZK17c>w႖k+PA9fk(/2} LND.2Kzt嗳p,@%U MsE`҉[U$h |L_o,kwVc RAmA@w@razp|{ МNurI3gWN?!Ғ Kv~{G(gCeN!p>8S[T:`M"O~o5"W,fJAP-1S"@ yItX>9̍̀X?l ,s0qz:ÚVdFzM5ɧKyA`uN>6_-g\_ӳ/Ǵe`Ǐ%A8#H*_< l@fݍ)ws{\ ?Ow*᳗tv/!ǜPFfʵ Mz^Z . ygK)wRr}IWTN#DB4=O~~_gR`yl^l6"?/b$K"I JXy~ނ_@9KȭnGUt{,1g8ۻtH' . g!1ƜybAR'>wP3^ɀʹ aOˋ`TX_* @c_U?QJlSyoͧ+Eo `"[qslrC-Web߾"As;F0~܇Է|Χ3Bʟ Dm/|E{id#^]G7VH:+5[}CSq8x~8o^;=h:ךxr1:F(Ö e"LCo`b)#ǴmRyhp eY'GeeS!"C'>l̉xH/J}LpV'_`^PQ*3iƌ[AV޲O` X972&nU=];D?*Nw DN <0LA8m (]6eg&Dž\7 ZYofxU '࢈GE,jb"3CFzde T"Jz*L9ؗP@ ?V/ D@rSĸE."N|,dL_t7MǨ桱<MC_`-[Y ;On кgy& EKLY _E':DRz vp7̺47  p4ϖVPPtne',k 9^깃j@guY@JJA S̄y-}ujG4~æy4h_s@m; a0.3RiuTUck6L%]\WD ޤV+>*,)0 J"4hJ^C:Z]šfAf):zl +A#9 Ȅmahbh vx,uGD}/4 RuA,$й J@"=Ѷϯ:δ D"8^"A\ S pq~̫Xi, ժSĂ<ǃ=0 Ve@Z).GGx޳[ ` C2"&%۷'(l"Lb@! ǿX҂`cVA 0;6c8>w;[:v]`5ҜڗFU ӗU6lV<y.Gͮ#>{*`=``Ph*& XM}Uv-/O&EN@?%!-vjwaJ~sZUJ"^26@ fCAKU1aa0AeDV"ůݢEA M%Ȏ,-̸F$)āMòea}pSU>1U@bs @2 px|"@Erjs.H XyzޢIk(Pv!Ofy%e}@g7ƀl>)F1i 5(+AжH` ^lpGBإM1޽y%~6@kAYDX(lO`۔̄01ygaZO@&3@TDUL q@Mj+"@c65I<2>>s/Ȟ7ٌ" O# 9*bK2dc;P  OTS4t& 0w-ج P\_>TE̫5{Cc7&U+1>LfbAlxQ[)(Q?bƘtseL?>{o yU |8]U*+>,8TCiv&73x#<5SWKY/\Eц~֧@B:Y"OP\Z둢nT\gYwʧhc$J=p?sD@򇨽[{=[ u M&!U^ۆ?2*8W̪/_As'0-E8%X͙f;K6ւR<:U>h,"27Ā-tݵzмsv<*v[)4"WM:5(N×2,"XDٖ wzŧR&>ri)|)iHƭ?ְX4\$M’ _VSO.}1sk]<Ù]@Kc} C\A0q,8;;ף"*|AO1 IN 8͉PslhjJH'\OU3ofP#z@+Gq妕#0~@ѽ6Rf)/Q4:%lʊGǎL%s@rHn@Nbۜd O>vM T~{f uTw<t:`#@+X]w]x~f4 6*UȲOM=LiSAԇ5 pIxJWO~O̽vn1-UL>.+R.ttRrM`#6v#JP 6rV A?1F/PuH}4,'dXo +b] !sɐm*A* |?Nsٴޢ4[DWG@ أG]71c0 El+~=n 94?i3@ f2as` /4B_3)҄oN_;̿5P*z*߉ygLm2Qc0:Ca*;;*DFr|<WP‚eWz  -$TA1d^sn"4^>+< |+0kxэ@]+q(8;1StUj7^s;Y}ENz\z.g oEEfbODuU ~?b+QzXEB`e (Z܀)T& *2Atbot8 %0i@v0gkmΉ]n]s7 UQH7@G3Y5ezՙ'ݐ/n'DeGJA+8V;01j*AFl˄i%__} oP==P|"8m/ӥ@J'+?]&/L b'Xt0 ;˖n2 14PpF{`;}XtCaO8:c HqSJBןF񹁂0 #w")2J@®``6D0ܭSUG El}Ww&$e/LU7yuݠngg{ÏtՌ-(C d Gtr|'7I9dW4߯ĮX4LTC:>9i>Ja1ʃ0u I,d["}i,.X,eu!Pj2DIq2I!pO|Tw@[ǟr`HqIwe ݊:. @{4C[Qk;;wf"k=*HWoVdi!`Upc|YvF:Ey G bKUI q9dUO3 8/!0hfڀUX 4'G$9H? *01.7`o󳳜ǔHH}'~kTj1|ݽ=;_o27g Ö{ ×/*DZ^ªn*:ΰ’`l9o d+ѵU&(?B=ߍRZaSNmVnl>Z{G%K0-YCnnk 1(`C)`lhQ]Tӂ=Bz _ `vf|- caqNEncTU)ʚQͮ0d$Nrf1 )M5 u'Np+@Gcd=;,`5G5yX JzG O2`( oI;@w* >vvܔ(T"Hv(:[Ћ`De2P+NL2<`ယ48לYƗ$=L[D5('' F(ήddeLWUVLՀ~l+OxB@1 pr[mZ/!(9x}'#vCƏrx[9UsB2 #3z`uA+>PbpїL,DK;d)$0<89%;y LR"cm5L!D (%qh{2(UJ{{0Jkˈވ ({e*]g+Dؐz5Tt?Ҙ_o|"5[aJ4@csa cc_ j P&E{짍c"t$e Yͩ}XAKH"rPxN\}J&0G=2 "{sPb5ڊP/QKT8n< /.%xi-cB&4Tlx -v dVu)^lh;p~7יpkyȪ&R)+I@2fdR+I{U>O!LyB=d(rT\rD'l3| C` X"A~AQp +F[kjRP>2 |֣K-P~ƬWIV4*BklP ::W_ (uEJ/_\#eJni`" pwx8,݋uF>ɣH\"d[cR~*o Py$U[[7&]|p_D(K^Y)ئ0$BLPg?Q I6rP K : OOS|&~ y#s4/JbEhm#KQNy7xoI hm_Ŷ\?w-Ŋ@8/$TU R1I%]Qͪ5WEkFSO1L۰v. $@,p2( 64yҕH)70}^t`k%z6m&d.3{j~ykʽ$'J;:*jU5.#['YQ7xwcdžo?V "D*bs +A'+wktz .b<ɻzx)̕S)5SkzY0hf;it˯b"lds2\vPrIӏ"p ʶnO?;i؂&ux?/u!1L rZVi?\.+dC.OWv硌GQ)B D f:9DR*q&l=P rX(x]˗t uc&j9Meu\3X,.)qqȊA %'6rt{..|"PfSM oWjd vO ]PP Gy3՞; :>uU&a~D ;*:~"A ZuJۊiӓ"LmDoOyfs~ggzo vѴ& ghEƖYXY`O$S@)\^5ka6utB9>_7|Gu m?u ]cT j0*^6:^'Gx9jz)E~Vh{FO@6Ͷ= &Gs[k*Nyd+ʼnd"t,*":m**=ŝ$Ey-g傭+@H!,|.=nPw<5zMo ςa5|ͥ1,E9`4ka{* D/CIPQqʧ}<]3!j:WowB2 ,0B! H+ڕ z-yruUs602*-nګpV7%"&mDV#'r !yΧD/[!j0 04F YرĀVc6 k{9$"ַt Qw+U3j03:PB+4 }~[#()8>ind01x/_f4$% OqoJwt!b 1lo̿$hmTL6d/ϛ8qYBZ_^T;]y35(fmf&s:g HQ4ʺ6ZpQWB=)L{$aCAmE2RNr[:!mMEJckes8oĶ1f, R; qxշgeV`Ch>=((((((((()(())))()))))))*))**)***********+++++++++++,+,,+AAA,,,,,-,,,----------......-..///////////00/000000110111111FFF211222222322233333344444445445555555555555555555655766677KJJ768778787878888888889998999:99 < !!!! !!!!!!!!!!!!!!778!"!"!""""!"""""""""""""######"###########$####$$$$$$$$$%$::;$$$%%$%%%%%%%%%%%%%%&&&%&&&&&&&&&&'&&''''''&'''''('((((((=>=(((((((())()))))))*)))*)**)*******+*+*++++++++++,+,+,+,,,AAA,,,,,,----------.-././.././/////////000010001100111111111FFF222222222332233234444544454555555555555555555556666666777KKK778888888888888888999999999:9::;;  !!!! !!!!!!!!!!!!!!!!!!777!"!!"""""""""#""""#"###################$$#$$#$$$$$$$$$$$$:::%%%%%%%%%%%%%%%&%%&&&&&&&&&&&&&&&''&''''''''''(''('((((((>>>()(()))))))))))))*)**)***********+*+++++++++++++++,+,,,,,AAA,-,,-,------...//.//////0//////00000000000011101111112111GFF222222323334434444444444555555555555555555556666666767777KKL778878888888998989999:99::::;:::;z !!! !!!!!!!!!!!!"!"!"!777"!"""""""""""#""##""#############$##$$##$#$$$$$$%$$$$$$$%;:;%%%%%%&%%%%&&%&%&&&&&&&&&&&&'&''&''''''''''(''''(((((((((=>>())())))))))))))))***********+*+++**++++++++,++,+,,,,,,,,AAA-------.--.///.//.///////0//0/000000010111111011111111112FFG222333333334444444444555555555555555555565567667767777787LLK888888888889998999999::::;:;;:;;;;;;2 9! ! !! !! ! !!!!!!!!"!!!!"!!!!"888""""""#"""""""#"""#########$#####$#$$#$$$$$$$$$$%$$$%$$%%;:;%%%%%%%%%%%%&%%%&%&&&&&''&&&''''''''(''(('(((((((((((((((=>>((())()))))))****************+*++++++++++++++,,,,,,,,,-,,BBB,-------...-.../////////000000000000110111111111121222122GGG433343334444444454555555555555555555565676766666777777887LLL8888889889999999999:::::;;;;;;;<;;<;<<< ! !!!! !!!!!!!!!!!!!!!!!!"!!"""888""""""#""#"""##""###############$$$$$$$$$$$$$%$$%%%$%%%%%;;;%%%%%&%&&&%%&&&&&&&&&''&&&&&''''''''''((''('((((()(((()()>>=)))))))))*)***)*******+++*++*+*+++,+,++++,+,,,,,,,,,,,-,,BBB-.-/.-/-.////////////000000000000011111111111111222222222GGG433434444544544554555555555555555556666677777777877777888LLL888899899999999::::9;::;;;;;;<;;<<<<<<<2 ( ! !!!!!!!!!!!!!!!!"!!!!"""!""""""888""""#""#"##################$$##$$$#$$$$$$$$$$%$$%%%$%%%%%;;;%%%%%%%%&&&&&&&&&&'&&&&''''''''''''(('((((((((((((((())))?>?))))*)))**)************+++++++++++++,,+,,,,,,,,,,,,,,,---BBC..-//..////////0/0//0000000000101111111111112222222222333HGG433444444444554555555555555555565666667777777777787878888LML8888999999::::9;;:;:;;;;;;;<<;<<<<<<<<< r!!!! !!!!!!!!!!!!!!!!!!!!"""!""""""""""888"""""################$#$$###$$$$$$$$$$$%$$$$$%%%%%%%%%%%%;;;%&%%%%&&&&&&&&&&&&&'''&'''''''''''('('((((((((())(()())))???))))*)**************++*++++++++,+,++,,,,,,,,,,,,---------BCC-/././/////////000000000100100101111111112112212222333323HHH444445444545555555555555555555667766767777777877888888898LML9989999999:;;:;;;;;;;;<;;<;<<<<<<<<=<<?))**************+*+++++++++,,,,,,,+,,,,,,,---,--------...CBC../////////000/000000010100010111121222212222223434343443HII445444445555555555555555655667666777777777878878888889889MML999::9;::::;;:;;;;;;;<<<<<<<<<=<======>>>>>>;==fFNtJUtJTuJTuJUzT]uKTuKUuKUuKUuKVuKVuKVuKVuKVvKVvKVvLVvMVwMWvMWwMWwMWxNYxOY}XaxOYxOYxOYxPZRGJCDDEEEEFEDEDhKhuMutMstNttNttOtuOuvOuvOvvPv~X}vPvvPvvPvvPvvPvvPvwPvwPwxQxwRwxRxxRxxQxySyyRyySyzSyySz{S|cYcKMLNNMNNNNOOPONOOOOOPPPOPPPOPOPPPPQQPQQ!!!!!!!!!!!!"!!"!"""""""""""""""""##""#!"W:T$R$R$R$R$S%S%R%S%S%R%S&T&T'T'T'T'T'T'e=T'T'U'U(U(U(U(U(X)`4(&(()()()&%LmYWWXiXXXXXXXXXXYYZZZ[[\]m]]\^f;F'/-111111(0(HPOPPPQQRR\QQQQQQRRRRRRRSSSSST|T|291;;;;;;;<;;<<<<<<<<<<<===<======>=>>?!!!!!!!!!!!!"!!"""""""""""""""""""##"## #V:R$P$P$P$P$Q$Q%Q%Q&R&R%Q&R'R'R'R'R'R'R'd=R'S'S'S(S(S(S(S(V)^3(&(()))))'%JjWUVVgVVVVVVVVVVVYWXYYZ[[k[ZZ\d;E'/-111111)0(GONOPPPPQP[PPPPPPQQQRRRRRRRRRSzU{293;;;<;;<;;<<<<<<<<<<<==========>==>>>!!!!!!!"!""!"""""""""""""""""""""#""##"!#V:R$P$Q%P$P$Q%Q%Q&Q&R'Q&R&R'R'R'R'R'R'R'd=S'S(S(S(S(S(T)T)V)^3)&())))))'%JjXVVVgVVVVVVVVVVVXXYZYZ[[kZZZ\d;F'/-111111*0)GOOPPPPPPP[PPPPPQQQQQRRRRRRRST{U{3:3;;;<<;<<<<<<<<<<<<======>>>>>=>>>?>?!!!!"!"!"""""""""""""""""""#""##"##"###!#W:R%O$Q$P$Q%Q%Q%Q%Q%R'R'R'R'R'R'R'R'R'R(d=S'S(S(S(S(T)T)T)V)^3)&)))))))'&KjXVVVgVVVVVVVWWVXWYXZZ[[ZkZZZ\e;F'/-111221)1*GPOPPPPPPP[PPPQPQQRRRRRRRRSSST{U{3:3<;;<<;<<<=<<<=<=======>=>>>>>>>>????!!!!!""""""!"""""""""""""#"""###"##"###!$W:R$P$P%Q%Q%Q%Q&Q&R'R'R'R'R'R'R'R'R'R'R(e=S(S(T(T(T(T)T)T)V)^3)'))))))* (&KiXVVVgVVVVVVVWWWXYXZ[[ZZZkZZZ\e;F(0-121222)1)HPPPPPQPPP[PPPQQQQQRRRRRRRSSST{U{3:4<<<<<<<<<<<<=======>==>>>?>?????????"!""!""""""!""""""#"""##""##"##########!#V:R$Q$Q%Q%Q%P%R&R'R'R'R'R'R'R'R'R'R'R(S(e=S(S(T(T)T)T)T)T)V)_4)')))))*)'&KjXVVVgVVVVVWXWXXYZZ[[[[ZZkZZZ\e>>??>?>?>?????@@?@!!!"""""""""""""###""""#############$$#"#V:R%Q%Q%Q%Q&R&R'R'R'R'R'R'R'R'R'S'S(S(S(e>S(T(T)T)U)U)T)T)W*^4*'*))))** (&KjXVVVgVVVVWXXXXXY[[[ZZZZZkZZZ]e>>=?>????????@???@@@@@!"""!"""""""""""#"##"############$$#$#$!$W;S%R&R&Q%R&Q&R'R'R'R'R'R'R'R'R(S(S(S(S(d=S(T)T)T)T)T)T)U*W*^4) ')****** (&KkXVVVgVVVWWWXWYXZZ[[[ZZZZkZZ[]e>=>?>?????????@@?@?@?@@@A@!"""""""""""""################$##$#$$##"$W;S%Q%Q%R%R'R'R'R'R'R'R'R'R'S'S'S(S(S(T(e>T)T)T)T)T)U)U*U*W+^4* (******* (&KjXVVVhVVVWWWXYZZ[[[Z[ZZZZj[[[]e?=>>>=??????@@?@@@@@@@@@B@@"""""""""""##"#############$###$#$$$$$$"$W;S&R&Q%R&R'R'R'R'R'R'R'R(R(S'S(S(S(S(S)e>T)T)T)U)T)U*U*U*W)_5* (*******!(&KkXVVVhVWXWWXYZZ[[[ZZZZZZZk[\[]f=F)10434444,3,IQPPPPPPPQ\QQQRRRRRRRSSSSSTTTU|V|5;4====>=>>?>>??????????@?@@@@A@@A@ABBB"""""##"""#"###############$$$$#$$$$$$$"$W;T&R&R&Q'R'R'R'R'R'R'R'R'S(S(S(S(S(S(S(e>T)U)U)U)U*U*U*U+W+_5* (******+!)&KlXVVVhVWWWXYYY[[[ZZZZZZZZl[[[^f>G*10444444,3,IQPPPPPPQQ]QQRRRRRRRSSSTTTTTTV}W}5<5>==>>>>?>>??????@?@@@@?@@@AAAAAAABBB"#"""#"""#""##########$#$$#$$$$$$$$$$$$"$X:T&R&R'R'R'R'R'R'R'R'R'S(S(S(T(S(S(T)T)e?T)T)T)T*U*U*V+U+X+_5+ (**++++*!)'KkXVVVhWXWXXYYZ[[ZZZZZZZZ[l[\]`f>H+20444444-3,IQPPPPPQQQ]QRRRRRRRRSSSSTTTTTV}W}5<5>>>>?>????@??@?@@?@@@@@@@AABA@ABBBBB#"###################$$#$$$#$$$$$$$$$$%"$X;T'R'R'R'R'R'R'R'R'R'S(S(S(S(T(T(T(T)T)e?T)T*U*U*U)U+V,U+X,`5+!(*++++++!)'KkXVVVhVXXXY[[[[ZZZZZZZZ[[l[]_`g?H+20445455-4-IQPPQPPQQQ]QRRRRRRSSSSSTTTTUUV}V}5=5??>?????????@?@@@@@@@AAAAAABA@BBBBBB#"#############$#$##$#$$#$$$$$$$$$%$$%%"$XT)U*U*V+U)V+U+V+X,`5+!)+++++++"*'LkXVWWiXWYZZ[[Z[ZZZZZZZZ[[m\_^ag?I+21555555-4-IQPPPQQQQQ^RRRRRSSSSSSSTTTTUUV}V}6=7??????@?@?@@@@@@@@AAAABAABBBBBBBBBCB#"##########$#$$#$$$$$$$$$$$$$$%$%$%$%%#%X=T'R'R'R'R'R'R'S(R(S(S(S(S(S(S(T(T)T)T)f?U*U*U*U*U*V+V,V,X,`5+!)++,++,+"*(LlXVWXjXYZZZ[ZZ[ZZZZZ[[[[\n]__ag?I+31555555-4-IQPPPQQQRR^RRRRRSSSSSTTTTUUUUV~X}7=7????@???@@@@@@@A@ABBABBAABBBBBBBCCCC######$#######$$#$$$$$$$$$$$$$$%%%$%%%%#%X=T'R'R'R'R'R'R(S(S(S(T(T(S(S(T)T)U)U)U)f?U*U*U)U*V,V,V,V,X,`6+!)+++++,,"*(LkXWXXiXY[[[[ZZZZZZZZ[[[\^n^__ag@I+31555555-4-IQPQQQQQRR^RRRRSSSSSSTTTUUUUUV~X~7>7???@@@?@@@@AA@BAABBAABBABBBBBBCBCCCC########$#$##$$$$$$$$$%%$$$%$%%$$%%%%%%#%Y=T'R'R'R'R'S'S(S(S(S(R(S(T)S)T)T)T)T*U*f@U+U*U+V,V,V,V,V,X,`6,"),,,+,,,"*(LkYXXXjYZ[[[[[ZZZZZ[[[[\]]n___`h?I,31555555-4-IQQQQQQRRR_RRRSTSSTTTTUTUUUVVW~X~8>7@?@@@@@@@A@@BAAA@BBBBBCBBBBBBCCCCCDC######$##$$$$$$$$$$$$$$%$$%%$$%%%%%%%%%#%Y=T'R'R'R'R'R(S(S(S(S(S)T)T)T)T)U*T)U*U*f@U*V+U+V,V,V,V,V,X,`6,"),,,,,,,"*(MlYXXXjYZ[[[ZZZZZZ[[[[[\]_o___`h?I,31555555-4-IQQQQQRRRR_RRSSSSSSTTTTUUUUVVW~X~8>8@@?@@@A@AAB@BAABBBCBBBBBCBCCCCDDCDDD#####$$$$$$$$$$$$%$$$%$$%%%%%%%%%%%&&%&$&Y=T'R'R'S'R(S(S(S(S(T(T(T)T)T)T)T*U*U*U*f@V+V+V,V,V,V,V,V,X,`7,"*,,,,,,,"+(MlZXXYjZ[[[ZZZZZZ[[[[[]]^_o__^`h?I,31555655.5-JRQQQRRRRR_RSSSSSTTTUUUUUVUVVWX~8?8@@@@AABABBBBBBBCBBCBBBCCCCCCCCDDCDEE:::99::9::::::::;:::;;;;;;;;;;;;;;;;;;;29e>e>d>e>d>e>e?e?f?e?f?f?f@f@oJgAgAgAgAgAgAgAgBiBqKA8?AAAAAAA8@>_zkjjjskkjjjkkkkklllmmnooownnnpwR[AGEJIIJJJBIAX^]]^^^___e_`_`aa`aaabbabbbcccaKSKUTTTUTTUUUUUUUUUUVVVVVVVVVVWWWWWVWVW$##$$$$$$%$$%%$%%$%$%%%%%%%%%%%%%%%%&%&#&X=U'R'R'S(S(S(R(S(T)T)T)T)T)U)U*U*U)U)U*gAV,V,V,V,V,V,V,V-Y-a7,"*,,,,---#+)MlZY[[k[[[ZZZZZZ[[[[^]^___n^^^`h?I,31656677.5/JRRRRRRRRR`SSSSTTTTUUUUUUVVVVWY8?8ABBBBABBBBBBBBBBBCCCCCCCCCDDDDEEDEED$$$$$$$$$$%$$$$%%$%%%%%%%%%%%%&%%%&&&&&$&Y=T'S'S(S(S(S)S(T)T)T)T)T)T*T)U*U*U*V+V+gAV,V,V,V,V,V,V,V,Y-a8-#*---,---#,)Nm[Y[[kZZZZZZZZ[[[\^_^^_^^n^^^`hAI,42657767/6/KSRRRRRRRS`TSTSTTTTUUUUVVVVVVWY8?8ABBBBBBBBBCBCCBCCCCCCCDDDDDEDEEEEEEE$$$$$$$$$$$%$%%%%%%%%%%%%%%&&&&%&&&&&&&$&Y=U'S(S(S(S(S(T)T)T)T)T)T)U*U*U+V+V+V,V,gAV,V,V,W,V,W-V-V-Y-a7-#+-,-,.--$,*Om\[[[kZZZZZZZ[[[\]____^_^n^^^`h@I-42767777/6/KSRRRRRRSS`SSTTTUUUUUVUUVVVVVXY:@9BBBBCCBBCCCCCCCCCDDDDEDDDEDEEEEEEFEF$$$$$$%%%%%%%%%%%%%%%%&%&&%&&&&&&&&&&''$'Y=U(S(S(S(S(S)T)T)T)U)U*U)U*U*U+U*V+V,V,gAV,V,V,V-W-W,W-W-Y-a7,#+,---./.$,*Om\[[ZkZZZZ[[[[[\^]^____^^n^^^`h@J-52777777/6/KSRRRRRSSS_TTTTTUUUVUVVVVVVVVXZ:A:BBCBBBCCCCCCCDDDDEEDCEDDDEEEEEFEFFFF$$$$%%%%%%%%%%%%%%%%%%%%&&&&&&&&&&&'&''$'Y=U(S(S(S(T)T)T)T)T)U*U*U*U*T*U+V+V,V,V,gAV,V,V,V,W-W-W-W.Y.a8-#+--.....$++Pn][[ZjZZZZZZ[[[\^^___^^^^n^^^`iAK.53777778/6/LSRRRRSSTS`TTTTTUUUVVVVVVVVVVWZ:A:BCBBCCCCCCCCCEDDDDEDDEEEEFEEEEFEFFFF$$$%%$%$%%%%%%%%%&&%&&%&&&&&&&&&&&&&&&'%'Y=U(S(S(S(T)T)T)U)T)U*U*U*U+U+V+V,V,V,V,gAV,V,V,W,W-X-W-W-Z.a8-#+../.../%-+Pn][ZZkZZZZ[[[\]]____^^^^^n^``biAK.54888888070LSRRRSSTSS`TTTUUUUUVVVVVVVVWWX[:A:BCBCCCCCCEDEDDDEDDEDDEEEEFFFFFFFFGFF%%$%%$%%%%%%&%%%&%&&&&&&&&&&&&&&&&'&'''%'Z=U(S(S(T)T)U)T)S)U*U*U*U+V+V,V,V,V,V,V,gAV,W,W,W-W-W-X-X.Z.b9.$,./...//&-+Pn]ZZZkZZ[[[[[^]___^^^^^^^n___biBL.54888888070LSRRSSSSST`TTUUUUUUVVVVVVVWWWX[;A;CCCCCCCCDEDDEEDEEEEEEEEFEFFFFFGFFGGG%%$%%%&%%%%%%%%&&%&&&&&&&'&&&&&&&''''''%'Z>V(T)S)T)T)T)T)T*U*U*U+U*V,V,V,V,V,V,V,gAW,W-V-W-W-W-W.X.[/c9.%,...////%-+Pn\ZZZkZ[[[[\\_^___^^^^^^^o_``biBK/64888888070LSRSSSSSTTaTTUUUUUVVVVVVVVWWWX[;B;CCCDDDEEEEDEEEEEFFFEFFEEFFFGFFGHFFHG%%%%%%%%&&%&&&&&&&&&&&&&&&'''&'''''''''%'[>X)V)V)V)W)W*W*W*W*W+W+X+X,X,X,X,X,X,X-iAY-Y-Y-Y-Y-Z.Z.\/^/e:/%-///////%-,Qq^\\\l\]]]^__`aa`````````qbbbdlBL/64888998080MUTTTTTTUUbVVVVVWWWWWWWWWWXXXY[;B;CDCDDDDEEEEEEEEFFFFFFFEFFGFHGGHFHGGH&%%%%%%%%&&&&&&&&&&&&&'&'&&'''''''''('' &'S=J)I)I)I)J)J)J*J*I+J*K*K+K,K,K,K,K,L,K,^AL-L-M-M-M.N/O/O/P/V7/(.//////0).-H^QqPnPoPoa|QoQoQoQoQpTpTqTqTqUqTrTrTrTrTrTrUrUrTrgVsVsWtXv^@G175888999383GNMMMNMMNO]OOPPPPPPQQQQQQRRSSSwZw>D>DDDEDEEEEEEEEEEEFEFFFFGFGGGGGHHGHHHH%%&%%%%%&&&&&&&'&&'&&&&'''''''''''(''''(((6<>&(&('(')')')')'* (* (* (* (*!)*!)+!)+!)+!*+"*,"*,8?A#*,#*,"*-#+-$+-%-.$,.$,.%-/-./0//000000000)/-&.,'/-'/-(/.=DB(0.(0.(0/)10+10*1/*20+21+21+31,31,31,31,31,31,32-42-52-43CIG.53.64.64/64677999989999:::4931822933:33:43;43;44;44;44<4HPH4<56<66>66=67=77>67>77?87?89?89@89A9:@9:A::B::A;;B;;B;;B;UVUEDDEEEEEEEEEFFEEFFFFFFFGGGGGGGGGHHHHHHH%&%%&&%&&&&&&&&&&&'''&'''''(''''''('((((((>>>((()(())))))))))*)))))************++++++++++++++,,,,,,,,,AAA,----,------.../../.../////0////0000000010101111111111111FFF222222233343333444445454555555555555555555555667757776767KKK78888888898898999999999::::;:::;:;;;;;;<<<<<<<<<<<<<=====QPP>>>>>??>>>?>??????@@@@@@@@@AAABAABAABBBBBBCBBCCCCCCCCCEDDWWWDEEEEEFFEFEEFFFEFFFFGGGGHHFHHHHHGHHHHIH&%%&%&&&&&&&&'&&'&'''''''(''''('((((((((()>>>)(()()))))))**))*)**)****+******+++++++++++++,+,,,,,,,,,,ABA--,----.-..../././////0/////0/000000000001111111111111222GGG222333333443344444544544555555555555555565665666766777777LLL87888888898999999999:::::;:;;;;;;;<;;<;<<;<<<<<<==<==<===QPQ>?>>?????????@?@@@@@@@@@A@AAAAABBBBBBBCCBCBBCCCCCCCDDDEDEWWXEEEFEEFEEEEFFFFGFFGFFGGGHHGHHHHHIHHIIII&&&&&&&'&&&&''&'''''''''(''''((((((((((()(?8?* ** ** ** *+!*+!++!*+!++!++"++",,",,",,#,-#--#--#--$--$-C:C.$..$//&//%0/'00'00'00'01'10./000100001111.+2-(3.)3.)3.*3C?H0*5/+50,51,51,61-61-62,62-62-62-62-62-72.73-73/84/84/83/9IDN50950950:50:879:::::;;::::;45;24<34<34;35<35<35=45=46=56=IKQ57>68?68?68?78@79@89@89A8:B9:A9:B9;B9;B:;C:D798;:;:;::89;`Ynd=ne=ne=}uRoe?of?of?of@pf@pfAqfAqgAqhBpgBrhCqiCriCriCriDsiDsiEsjEtlEcaXDDEFFEFFFFGFGGHGGGHHHHHHHHHHIHIIHIIHIIJ&&&&&&&'''''''''''('((('(((((((((()(()(**%%"#*`*2(2111111.)2m #Lg272<;;;;;;24;շ===>=>??>?S@AAAABBBDDDDDDEEEGGY=>FFFFGFFGFGGGHHGGHHHHHHHIHIIIIIIIIIJIJ&&&'&&''''''('''''(''((('(((((((()))())* *&&$#+^+2)2111111.)3k~~~"%Lf383=;;;;;;34<α===>?????@TAAAAABCDDDDDEEDEFGG}Y=?FFFFHFGHGGGHGHHGHHIIHHIIIIIIIIIJIJJJJ'''''''''''''''(''((((((((((()(((()))()* *&&$$+^+2(2211111.)3k~~#~%Mf383=<;<<<<35<α==>??>??@@T@AABBCDDDDDDEEEGGGH~Y=?FGGGGGGHHGHHHHIHHHHIIIIIIIIIJJJKJJJKJ'''''''''''(((((''(((((()())())))))))))*!*&&$$,^+2)2112212.)3k~~~"%Mf383<<<<<<;35<α>?>>>>?@@@TAAABCDDDDDDEEEFFGHH~Y>@GGFGGGGHHHHHHHIHHIIIIIIIJJIJKJJKKJJKK=<=<======>==>=>>=>>>>=>>>>>>>?>???>>?>@7A// ""!""""""""""""################$$$%#**$$$$$%%%$$%%&%%%#$>q>G>GFFFGFGC?Iy+!""#(#######$$$$$$&%%%%$*&&&%^xELGQPPPOPPHIPӹRRRRRSSTST^TTUVWWWWWWXYYYYYZZZcRSY[YY[[[[[[[[[[[[[[[[\[\[]\\]\]]]]]]]]'('(''((''(((((((((((()())))))))))))))**!+''$$,^,2)3222223/*5l ~$&Ng594=<<<=<<35<α>??>?@@@@ATBBCDDDDDEEEEFGGGHHH~[>AGHHHHHIIHIIIIIIIIJIJJJKKJKJKKKKLLLLLL''''''(('((((((((()(())))))))))*)))**)*+!+''$$,_,3)3222333/*5l#%Nh494=<<<=<=46=ϱ?>???@@@AAUCCDDDDDEEFFFFGHHHHH[?AHHHHHHHIIIIIIJIIJIJJJJKKJKKKLKKLKLLKL(''('((((((((()(()))())))))))*)))******+!+'&%$,_,3)33333430,4l#&Ng494>=<====46=ϱ??@@@@@AAATCDDDDDDDFEFGGHHHHHH[@AHHHHIIIIIIJIKJJJKJJKKJJKJLLLLLLKLLLLM((((((((())((()(()))))))*))))**********,"+''$%,_,3)33444430,5l #&Ng595>======56=ϲ=@@@@@AABCVDDDDDDDEEFGGGHHHHHH[@BHIHIIIIIIIJIJKKIJKKKKKKLLKKMMLMLMKMMM(((((((((())))))))))))))***************+"+''$%-_-4+44444441,6l #&Nh594>=====>57>ϲ>?@AAAABBBWDDDDDEFFFFGGHHHHHHI\@BHIIIIIIJIIJJKJKJKKKKKLLLKKLKMLMMMMMMM((((((()()))))))))))))********++**++***,"+''%&-`-4+54434541,6m #&Oh5:5?===>??68>ϳ?@AAAABCDCWDDDEEEFFGGGHHHHHHHI[@BIIIIKJIJJJIKKKKKLKKLLLLMKMLLMMMMMMMMM()(((())))))))))))))********+*+**+**++*,",''%%-`.5+54444441-6m!$'Oh5:5?>>>>?>68?ϳ@@AAABCCDDWDDEFEEFGGHHHHHHHIIH[@CIJJJKKJKJKKKKLLLLKMLMLLMMMMMMMMNNNMNM()))(()))))))))*)****************+*++++,",''%%.a.5,64554541-6m $'Oh6;5@?>>??>78?ϳAA@ABCCDDDWDEEEFFFGGHHHHHHIIJI[ABJKJJKKJKKKKLKLKMMLLMMMLMMMMNNNMNNMNNN))())))))))))*)*******+*******+++++++++,#-((%%.a.6,65555552-6m $'Oi6;6@?>????68@ϳAAABBDDDDDWDEEEFFFHHHHHHHIHIIJ\ACKKJJKKKKKKKMLKMLMLLMLMMMMMNNNMMNNNNNN)))))))))**)))********+***+*++++++++,+,-#,((%%/b.6,65555552-6m $'Pi6<7@?@??@?69?ϲAABCDDDDDDWEFEFFFHHHHHHHIJJIIJ\BDKJKKKKKMLLLLLLMLMMMMMMNMMNMNNMNNNNNOO)))))**)*************+*+++++++++++++,+,-#-(($&/a/6,65555552-6l $'Pj7<7A????@@79@ϳABCCDDDDDDWEFFFGGHHHHHIJIIIJJK\BDKKLLMKLMMLMLKMMMMMNMMMNMNMNNNNNNNONOP))**)***********+**++++++++++++++,,+,,,-#-((%&/a/6-65555552-6m $&Pj7<8A???@@@89@ϳABCCDDDDEDXFFFGHHHHHHHIIHIILKL^CDKMLLMMLMLMMMMMMMMMMMNNMMMNNNONNONOOOP**)************+*+++++++,+++++++,,+,,,,-#-((&&/b/6-65555551-6n!%'Qj7<8A@@@@@@8:@ϳCCDDDDDEDEYFFGGHHHHHHHIJIIJJKL^CEKLLMMMMMMMMMMNMMNNNNNNNNNOOOOOOPOOPPP*))**********+*++++++++++++,++,,,,,,,,,-$-((%&/b/6-65555553-6n!%'Pj7=8A@@@@AA9:AгDDDDDDDEEEZGGGHHHHHHHIJIJJKJKM]DFLMMMMMMNMMMMMMNNNNNNNNNOOOOOPOOOOOPPP*********++*++++++++++++,+,,,,,,,,,,-,,.$.()%'/b/6-65556673.8n!%'Qj7=9AAAAB@B9:BгDDDDDDEFFFYGHHHHHHHIJJIIJKMMMM_EFMMMMNNMMMNNMMNNNNNNNONOOOOOOOOPPPPPPP*****++++++*+++,++++++++,,,,,,,,-,,,-,-.$.((&'/b/6-66665663/8n!%'Qk8>9BAAABAB9;BгDDDDDEFFFFZHHHHHHHHIJIIIKLMMMM_EFMMMMMNMNNMNNNNNNNOOOOOPOOPOPPPPPPPPPP***+**++++++++++++,+,,+,,,,,-,,,-,--,--.$.(*'&/b/7-66767674/8n"%( Qk8>9CAAABBB9;BгDDDDDEFFGGZHHHHHHHJJJJJKMMMMMM_EGMMMMNNNNNNNNNONNPPOPPPPPOPPPPPPPQPQQP+**+++++++++,++++,,+,,,,,-,,,----------/%.*)''0b08.86677774/9n"%( Rk8>9CBABBCB9;CгDDDFFEFGGGZHHHHHIIJIIKKMMMMMMM_EGNNNNNNNNNNONNNNNOPOPPPPPPQPQPQQQQPQQP+++++++++++++,+,,,,,,,,,,,--,---,--.--./%/)*''0c08/87777774/9p"$( Sm:>:DBBBBBC:;CдDDDEFFFGGH[HHHHIIKJIIJKLMMMMNN_FGNNNNNNNOONNOOOOOOPPPPPQPPPQPQQQQQQQQQ@@@@@@AA@@A@AAAAAAABAAABABBBBACCCCCCCCCEEDDEDED>@EGкGѵGѵHѵGѵHѵHѶHѶHѵHֽ\ҷIѶIҷIҷJҷKҷLҷMҷMӷMҷMӷMҷMҷMӸNӸNӸNӹNӹOӾP|aIJPPPPPPPPPPPPPQQQQQQQQQRRSRRSRSSRSSSSS,-,,,,,-----.--.....//////./////0//0000000E?F2(12)22(22)22)23*23*33*34+45+45,55+55,56,66,66-66-66-66-6KAK6-67.77.78/78.88/98/99099/996889999899999984:73<83<83<84=LGQ94=94>94=95>95?:5>:5>:6@;5@;7A<7A<7A<8A<8A=8B=9B>9C>9C?:CRMW?;D?;D@;E@;ECADEDDEEEEEEEFE?@E=>F=?F=?F>@G?@G?@G?AH@AH@BHSU[@BIACIADJBDJBDJCCJCDKCFLDFKDFLEFMEGMEGNEGNEGNFHOFHOFIPGIP``bPPPPPPPPPPPQQQQQQQQQQQRRRSRSRSRSSSSSSSS,-----,-----/..../////////////000000000001EFE111111121212122222322243333432444444444554555555555555555IJI6666666777777777778888888888888899999:9:::;;;:;:;;;<<;;<=>>?>>>>>????@?@@??@@@@@@@ABAAABBBBBABBCUVUCBCCCBCDCCDDDEDEEDEDEEEEEFFFFFFFFFFGFGHHHGHHGHHHHHHHIHIII[[[IJIJKJJKKJJJKKKKKLLLLLLMLLLMMMMMMMMMNNNNNNNNNOOOOOOONOPOPbbbPPPPQQQQQQQQQRQRRRRRRRRQSRRSSSSSSSSTTTT-,-------..-//././//////////00/00000000110FFE111111111221222222323333444443444455555555555555555555556IJJ775667777777888888888888988998999999::9:::;;:;;;<;;;;<<<>>?????>??????@@@@@@@A@AAAAABBBABBBBBBCBCUVUCCCDDCDEDDEEEDEEEEEEEEFEFFFFFFFGFGGGGGGHGGHHHHHIHHHIIIIIH[[[IJJJJKJKKKJKLLKLMLLLMLLLMMMMMMNNNMNMNNNNNNONOPNONPOOOOPPPbbbPQPPPPQQQQQQQQQSQRRRRQSRSRSSSTSSTSTSTTS------.../.../-/////////0/0000001010101111FE?2/(20)30)30)31*41*42*42*53+52,53+64,64,64,64,64,64,74,74-KIC75.86.86.86/87/96/97/970:70:97:::;9:;::;;;=84=82=83=94=94RMH>95>95>95>:5@;6@;6@<7@<7A<7A<7A=7B=8C>8B>9C>:C?:D?:D?:D?:XSOE@G@?G@?HA?HA@HA@IAAIBAIBB[VTJCBJDBKDCLECLECLECMFDMFEMFENGENGENGFNGFOHGOHGOIGNIHPJHPIHb`_QQQQQPQQQQQQRRRRRRSRSSSSSSSTSTSSSTTSTTT------..//.////////////000000010010011111/AKf-;c-:a.:a.:a/;a.e2?e3?e3@f3?f4@f3@g3@f3Ai8;E;:9;:::;:<:96I\4Ni5Nh5Oh5OhG_z6Oi6Pi7Pj6Pj8Qj8Qk8Qk8Qk8Rk9Rk9Rl:Rl:Sm9Tl:Tm;Tm:Tm;Un;UnMfFFFFGHF@>IJJJKKLLLL^LMNMNOPPOPPPPPPPPPPbQJHQRQSRRRRSRSRSSSSSSSSTTSSTSSTTTTTTTTT......///////0//0/00000000011011111121130(5ZU!S!T"T!U!U!U"U"T"T"T"T"T"T"U"U#U$W$W6g$V$W$W$X$X$W$X$Y$Z5Ah;91;;;;;;=83's - !""""""#"""""###$1$$$">WqHB>FFGGGGG@?IKKKJKLLLL^LMNNOOPOPPPPPPPPPPPbQKJQSRRRRRRSSRRSSSSSTSSTSSTTTTTTTTUUUTU......////0/0//00000000111011011111112130)5ZV T T!U!U!U"U"T"T"T"T"T"T"T"V#U$V$W$W5f$W$W$W$W$X$X$X%X$Z6Ci<:3;;;;;;=83't - !"""""""#"""######1$$$">WqHC?GGGHGGG@?IKKKLLLLLL]MMNOOPPPPPPPPPPPPPPcRLIRRSSSRSSSSSSSSSSTSTSTTTTUTTVUUTUUUUU////////000000000000011011111111121122230)5Z T!U!U!U"U"U"U"T"T"T"T"T"T#T#V$V$V$W$W5g$W$X$X$W$X$X%X&Y%Z6Ci<:3;<<<<<=84't +!""""""!"""####$##$1$$$#>WqIC?HHGGGHHA?JKKKLLLLLL_NNOPPPPPPPPPPPPPPPPcRKISSSSSRSSSSTTSSSTTTTTTTTTUTTUTTUUUVVU///0//0/000000011010011111111111222222240)6[ V!T!U"U"U"U"T"T"T"T"T"T"T#U#V$W$W$W$W6g$W$W$X$X$X%X&Y&Y%Z6Ci=;3<<<<<<=94's !*""""""""""#"#####$$1$$$$?XqHC?HGGHHHHA@JLLLLLLLMM`NNOPOPPPPPPPPPPPPSTeRKJSSRSSSSSTSTTTTTTTTTTTUTTUUUUVUVVUVUV0//0/00/000000100101111112112121222232231*6[ W!V"U"U"U"T"T"T"T"T"T"T#V$W#W$W$W$W$W6f$X$X$X$X&Y&Y&Y&Y%Z6Cj=;3<<<<=<>95't !,"""""""""""#####$$$1%%%#?XqJE@HHHHHHHB@JLLLLLLLMN`OOPPPPPPPPPPPPPPQSUeSMKSSSSSSTSSTSSTSTTTTTTTTUUUUUVUVUVUVUV00000000010011011111111111221222222232331*7[ V"U"U"U"T"T"T"T"T"T#U#U#V$W$W$W$W$W$W6f$W$X$Y&Y&Y&Y&Y&Y%Z7Ci=:3=<<<=<>:5'u!!","""""""""""#$##$$$$2%%%$?YrJE@HHHHIHHB?KLLLLLLNNOaOOPPPPPPPPPPPPPQTSUeSMKSSSSTTTTTTTTTTTTTUTVUUUUVUUVVVVVVVVV/0/00000010011111111112112222222222333342+7[ W"U"U"U"T"T"T"T"U"T#U$V$W$W$W$W$W$X$W6g$W$X%Y%Y'Y&Y&Y&Y%[7Cj=;4=<=<==>95'u ""-""""""""#####$$$$%$3%%%$@YsJEAHHHIIHIB@KLLLLLLNOOaOPPPPPPPPPPPPPQTTTUeSMKTSSTTTTTTTTTTTTUUUUUVUUVVUUVVVVVVVVW00000010111111111121122222222222232443453+7[!V"U"T"T"T"T"T"U#V#U$V$V$W$V$W$W$W$X$W6h$X%Y&X&Y&Y&Y&Y'Y&[7Dj=;4<=<===?:5't"""-""""""#######$$$$%%3%%%$@YsJEAIIIIIIIB@LLLLLMMOOOaPPPPPPPPPPPPPRTUTUUeSMKTSTTSTTTTTTUUUTUUUUUUVUVVVVVVVVWVVVVEEEDEDEEFFFFEFFFFFGFFGGFFGGHGHHGGHHGIHIIGAAd2e3c3c3c3c3c3d4d4d4e5f5f5f6g6g6h6h6g6g@p7h8h8h8h8h8h9i9i8kKV{QNHQQQQQQSOJ5+,..4/.-/00/001111122124<3453Ri]XT[[[[\[\VT^^^^_a`aaajbbbbbbbbbbaabdddfffne_]eeeeeeefefffffffgfgggggggggghhghghhh00011111111121122222222233233333444345463,8[!U"T"T"T"T"T#V#U#V$V$W$W$W$W$X$Y$X$X$X7h&Y&Y&Y&X&Y'Z'Z'Z%[7Dj><5>==?>=@:5)v!"""/""""""#####$$$$$%%%4&&&$@ZsKFAIIJIJJJCALLLLNNOOPPaPPPPPPPPPPPQTTUUUUUeTNKTTTTTUTUUVUUVVUUVVVVVVVVWVVWWWWWWWWW01111111121121112222232343343444444444563,8[!U"T"T"T"U#U#V$W$W$W$W#W$W$X$W$X$X%X&X7h&Y&Y&Y&Y&Y'Z'Z(Z'\8Dj?<5=???>>@:6)u!"""/""""###$##$$$$%%%%%4&&&$@ZsKFBJJJJJKJCCLLLNOOOPPPbPPPPPPPPPPQRSUUUUUUeTNLTTUTUUUUUUVUVVVVVVVVWVVVVVVWWWWWWWWX11111212122222222333334334344444454554564,8[!U"T"T#T#V$U#W$V$W$W$W$W$W$W$W$X$Y&Z&Y8h&Y&Y&X'Z'Z'Z'Z'Y'\8Ek?=5=>???>@<7)v!"""/"""###$$$$$$%%%%%%%5&&&%A[uKFAKJIKKKKDCLLMOOOOOPPbPPPPPPPPPQRTSTUUUUUeTNLUTUVUUUVVUVVVVVVVVWVVVVVVWWVWWXWWXWW11211122222232333434244344444445555555564,8[!U"T"T"V"T$V$W$W$W$W$W$X$X$W$W$X%Y&Y&Y8h&Y&Y&Z'Z'Z'Z(Z(['\8Ej?<6?>????A<8)u!"##.""""###$$$$$$%%%%&&5&&'%A[tLHBJKKKKKKECMNNOOOOOPPbPPPPPPPPQSSTUUUUUUUeUNMVUVUVVUUUVVUVVVVVVWWVWWWWWWWWWWXWWXW11112212222233334344344444455455555555564,8[!U"T"T#V#U$W$W$W$W$W$X$X$X$X$X%Y%Y&Y&Y8h&Z'Y'Z'Y'Z'Z([(['\9Fl@>7??????A<8*v!""#/"""##$$$$$$$%%%%&&&4&''%AZtLHBKKKKKLKECOOOOPPPPPPbPPPPPPPPSTTUUUUUUUUfUNMUVVUVVVVVWVVVVVWWVWWWWWWWWWWWWXWWXXX22222223223332344344344455555555555555564,8["U#U#V$W$W$W#W$W$W$W$X$X$X$W%X%Y%Y&Y&Y8h'Z'Z&Z'Y'Z([([(['\:Fl@>7@?@@@@A=7*v!"""0"#####$$$$$%%%%&&&&4'''%B[tMGCLLKMLLLFDOOOOPPPPPPbPPPPPQQQUTUUUUUUUUUfUOMTUVUVVVVVVVVVVWWWWWWWWWWWWWWXWXXXYYY21223234343334334454454555555555555555564,9[!V#V#W$W$W$W$W$W$W$W$W$X$X&X&Y&Y&Y&Y&Y9i'Z'Z'Z([([([)[)['\:Fm@>7@@@@@@A=8*u!!""1"##$##$$$$%%%%&&&&&5''(&B\uNHDLLLMLLLFDOPPOPPPPPPbPPPPPPRTUUUUUUUUUUUfUPNVVVVVVVVVVVVWVVWWWWXWWXXXXXWXXXYXXYY22233243444344344545555555555555555555564-8["X#W$W$W$W$W$W$W$W$X$X$X%Y%Y&Y&Y'Z&Z&X9i'Z'Z'Z([)[([([([(\:Fl@>7@@@@@@B>9*w!"""/###$$$$$$%%%%&&&&&'5'''&B\uMHELLLLMLMFENPPPPPPPPPbPPPPQRTUUUUUUUUUUUUfVPNVVVWVWVWWWWVWWWWWWWWWXXXXXXWYYYYXYYY24223343444444444545555555555555555555573.9]#Y$W$W$V$W$W$W$X$W$X%X&Y%Z&Y&Y&Y&Y'Z'Z9i'Z'Z([([([)[([)[(]:FmA>7@@@AAAC>9)w!"#"0#$$$$$$$%%&%&&&&&&'5''(&B\vMIEMMLMMMMFEOPPPPPPPPPbPPPPQTSUUUUUUUUUUUUgWPOWVWWVWWWWVWWWWWWWWXWWXXXXXYYXXYYYYYY34334444455445454455555555555555555566675.9]#Y$W$W$W$W$W$X$X$W$X%X%Y&Y&Y&Z&X'Y'Z'Y9i'Z([([([)[)[)[)\(]:GnA?8@A@ABAC>9)w!""#1##$$$$$%%%%%&&&&'''6('(&C\vNJEMMMMMMMGEOPPPPPPPPPbPPRSRTUUUUUUUUUUUUUgWPOVWWWWVWWWWWWWWWXXWXXWXXXYYYXYYYYYYYY43444444455555555555555555555555555676686-:^#Y$V$W$W$X$X$X$X$X%Y&Y&Y&Y&Z&Z&Y'Z'Z'Y9i([([(['[)[)[)[)[(]:GmB?7ABAAABD?:*w!###1$$$$$$%%%%%&&&''(''7(((&C]vOJEMMNMNNNGEOPPPPPPPPPbPRTUTUUUUUUUUUUUUUVgVPOWVWWWWWWWWXXWXYXXXYXYYXYYYYYYZYYYYZY44444454455555555555555555556665675676786.:^#Y$W$W$W$X$W$X$X%Y&X'X&Y&Y&Y'Y'Z'Z(Z&Z9j([)[([([)[*[)[)\(]:GnC@8BABBBBD?;*w!##$2$$$$$%%%%&&&&&'''''7(((&D]wOKEMNMNNNNGFPPPPPPPPPPbQSSTTUUUUUUUUUUUUUWgVPOWVWWWWXXWWXXWWXXYXYYYYYYYYYYZYYYYZYZ44454455555555555555555565666767776687786/:^#Y$W$X$X$X$X$X%X&Y&X&Y&Y&Y&Y'Z'Z'Z'Z([:j([([([)[)\*\)\)\(^;InB@9BABBBBC?:+x"###1$$$%%%%%&&&&&'''''(6(((&D]wOJFNNNNNNNGFPPPPPPPPPPbQTTTUUUUUUUUUUUUVVVgWPOWWWWWWXXWXXWXXXXWYYYXYYYYYYZYYYYYZZZ44555555555555555555555566666666777777786/;_#Y$W$W$X$X$X&Y&Y&Y&Y&Y&Y'Y'Z'Z'Y'Z([([:j)[)[)[)\)[)\)]*\)^`>a>b?b?b>b?b?b?c@c@cAc@c@eAdJmBeBeAfCfDgDgDgDgDhR[tWVQWWWXXXYVRAy8:;;E;>>===>=>???@@?BBBCKCCDCZl}c_\bbbbbab^]bbbbcddeefnffffgfggfgggghhhhhhriedjjijjijjjjjjkkjkkjjkkkkkkkjkklkklkkl6665666667677778878788888888889988999999:9NMH;82;92<:2<:3=:2=:3=;3=;4>;4>;4><5><5?=5@=5@=6@=7@>7@>7A>8TRKA?8B?9C@:CA9CA:CA;DB:DB;DB;DDBDEDCDDEDEEEEFC@GB=HC>HC>ID?\VQID@JE@JEAKE@KEAKEAKFALGBKGBMGCLGCMHDMIDMIDNIDOJEOJEOJEPKFb]XPKGPKGPLGQLGPONPPPPPPPPQQQQQLKQKIQKIQKIRKJSLISMKSMKSMKSMKd^^TNLTNLUOMUNNUNMUONVONVONVPNWPNWQOWQOWQOWQOWQPWQPXQQXRPXRQjghYYYYYYYZYYYYZYZZZZZZZZZZZZZ[[[[\\[\\\\\666665666777777878888888888889889999:99::9NNN::;;;;;;;;;;<<<<<<<=<<==<=====>>=>??>>??>??@?@@?@@@@@@@@@SSSBBAAABBABBBCBBBCBCBCCCCCDDDDEEEEEEEDEEFEFEFFFFFFFFFFGGFHHZ[ZHHHHHHHIIIIHIIIIIIJIJKKIKKKKKKKKLLKLLMLLLMMMMMNMMNMNMMNNN`__OOOOPOOOOPPOPPPPPPQPPQPQQQQQQQQQQRRQSRRSSSSSSSTSTSTTSSTTTeeeTTTTUTUUUUUUUUUVVUVVVVVVWWVWWWWWWWWWWWWWWWWWXYWXYYXXYYYYYjjjYZZZZZZYZYZYZZZZZZZZZZZZZZ[[\[[\\[\]\\\6667767777787778888888888889999999:::;::;:OOO;;;<;<;<;<;<<<<<<<===<=====>==>>>?????>????@?@@?@@@@@@B@@TTTAABABBBCBBCBCCCCCCCCCDDDCDDEEEEEEEEEEFEFFEFFFFFFGGGGGHGHH[[[HIHHHIIIIIIIIIIJJJJJKKKIKKKLLKLLKMLMMMMLMMMNNNMMMNMNNNNNN`_`OOOOPOPPPPPPPPPPPPQPQQQQQQQRQRRRRRRRRRSRSSSSSTSSSSSSSTTTTeeeTTTTUUUUUVUVVUVVVVVVVVVVWVWWWWWWWWWWWXWWXXXWXXXXYYXYYYYYYjjjYYYYZYZYZZZZZZZZZZZZZZ[\[[[\\[[[[\[\]]]777J777787777888888988888889999::99:::;;;:;NON;;;;;<;<<<<<<<=<==<=====>=>>>>>>>??????@??@?@@@@@@@@@@ABASUUBBBBBBCBBCCBCCCCCCDDCEDDDDEEEEEEEEFEEEFFFFFGFGGGGGGHHHHHHZ[[IIHIIIIIIIIIJJJJKJJKKKKJLKKKLKKLMMMMMMMMMNNNMNNMNMNNNNNNN```OOPPOOPPPPPQPPPPPQQQQQQQQRRRRSSRSRRRSRSSSSSSSSTSSTSTTTTTTeeeUUTVUUUVVVVVVVVVVVWVVVVWWWWWWWWWWWWWXWWWYXXYXXXYYYYYYYYYYijiZYYYZZZZZZZZZZZZZZ[Z[[\[\\\\\\\]\]]]]]]777 777877888888888888999999:99;;:::;;;:;;;ONN;;<<<<<<<<<<<<<=======>==>=>?>?????????@@?@@@@@@@AABAABBBTUUBBBBBCCCBCCCDCDDDCDEDEDEEEEEEEEEEEFFFFFFFFFGGHGGHHHHHHHIH[[[IHHIIIIIIJIJJKJJJKLJKLKKLLLMLLMLMMMMMMMNMMNNNNNNNNNNNNPOOa``OPPPPPPPPQQQQQPQQQQRQQRRRSRSQSSRSSSSSSTSSSSSTSTSTTTTUTTTTfefUUUVVUVVVVVVVVVVVWWVVWWWWWWWWWXWWXXXXWXXYXYYYYYYYYYYYYYYYjjjZZZZZZZZZZZZ[ZZ[Z[Z[\[[\]\\\]\\]]]]]]]]Z787o888888888888988999:99:::;:;::;;;;<;;OOO<<<<<<<<<=<<========>=>>?>>?????????@@?@@@@A@AA@AAABBABBBVUUBBBCCCCCCCCDDDDDDDEDDEEEEEEEEFFEFFFFGFFHGGGGHGHGHHHHHHIHI[[[IIIIIIJJIKKJKKJKKKKKKLKMMLMLMLMMMMMMMMMMNNMNNNNNNOOOOOPPObbbPOPQPPPPPQQPQQQQQQQQRRRRSRRRRRSSSTSSTSSTSTSTTSTTTTTTUTTUUfggUUVVVUVVVVVVVVWWWVWWWWWWWWWXWWXWWXYXYYXYYXYYYYYYYYZZYYZYYkjkZZZZZZZ[Z[[Z[[\Z[\[]\\]\]\\]]]]]]]]]]]]8878888889899999999:9::9:::;;;<;;;;;;<=>>>>>>??>????????@@@@@@@@@@BBABA@ABBBCBUVVCBCCCCCCCDDDDDEEEEEEEEEEEFEFFFFFFFGFGGGHGHHGHHGHHHHIHHIII[[[IIIIJJIJJKKJKKKLLKLLLLMMMLLLMMMNMMMNMNMNNNNNNOOOOOPOOOPPPbbbPQPQPPQQQQQQQQQQQQRRSSRQSRSRSSSSSTSTSSSSTTTTTTTTTTTUTUUUUggfVUVVVVVWVVVWVWWWWVWWWWWWXWWWXWWXXYYYYYYYYYYYYYYZYZYZZYZYZkjkZZZZZZ\[[[\[[Z[\\[\\\\]]\]]]]]]]]]]^s888W889999999999:::;;;;;;;;;;<;<<;<<>>>?????????@????@?@@A@@AAAAAAABBBBBBBBBCBUVVCCCCCCDDEEDEEDDEEEEEEEFEFFFFFFFFFGGFHGGHGHHGHHHHIHHIIIIII[[[KIKKJJIJKJKKKLKLLKKLKLMMMMMMMMMMNNNNNMNNNNONPONOOPOPPOPPPbbbQPPQPPQQQQQRQQRRQRRSSSRRSSSSTSSSSTSTTTTTTTTTTTUTUUUVUVVUUgffVVVVVVWVVWVVWVWWWWWWWWXXXYWXXXXXYXXXYYYYYYZYYYZYYZYZYYZZZkkkZZZZZZ\[\\[\\\\\\]\\\\\]]]]]]]]]]]]]89999999:;9:;::;;;;;;;<;<;<<<<<<=>>>?>>>??>?????@@@@?@@@@@@AAABBABBBBBCBBBBCCCCVVVDCCDDDEDDEDDEEEEEFFFEFFFFFEFFGGGFGHGHGHHHHIHHHIIIIIIIIIII\\\KJKKKJKKKKKLLLLLLLLMLMMMMMMNNNNNNNNNNNNONNOOOOPOPOOPPPPPPbbbQQQQQQQQQRRQRSRSRRRSSSSSSSSTSSTSSTTTTTTTTTUTUUUUUVUUVVVUVgggVVVVVWWWWWWVWWWWWWWWWWXXXXYXXXYXXXYXYYYYYZYZYZZYYZZZZZZZZkkkZZZ[\\\\[\[\\\\\]]\]]]]]]]^]]]^^],99999::::;;;;9;;;;;;;;;<<<<<<<=<=PPP======>>=>>>?????>???@@?@??@@@@@@AAAABAAAAABBBBBBCCCCCBCCVVVDEDDEEDCEEDEFEEEFFFFFFFFGFFGGFFGGHHHHHHHHHHHIIIIIIHIIJIIJ]\\JKJKJJLKKKLLMMLMLLMMMMMMMMMMNMNNNNNNOONNONNPOPPOPPPPPPPPPbbbQQQQQQQRRRRQRRRSSRSSSSSSSSSTSSTTTTTTTTTUTTUUUUUUUUUUVVVVVgggVWWVWWWWWWWWWWXWWXWXYXXWXXXYYYYYYYYYYYYYYYYZZZZZZYZZZZ[ZZlkk[[[[\[[[]\\\[]\[]]]]]]]]]]]^^]E:;::;:;;;<;;;<;;;;<;<<<<<=<===PPP====>=>>>?>>?>????@@?@@@@@@@@@@@ABA@BAABABBBBBCCCCBCCCDCCWWWCEDDDEEEEEEEEFEFFFFFFFFHGGGHGGGGHHHHHHHIHHIIIIIIIIJJIJJJI\]]KKJKKKLLLMMLKLMMMMMNMNMNMMMNMNNNNONOPNOPOOOOPPPPPPPPPPPQQbcbQQQRQRSRSRSRRRRSSRSSSSSTSSTTTTTTTTTTUTTTVTVVVVUUUUVVVVWVVgggVVWWWWWWWWWWWXWXWYYXXXXXXYXYYYYYYYZYYZYZZZZZZZZYZZZZZZZZZjkk[[\]\\\\\\]]]]]]]]]]]]]]]]]3;;;Y;;;<<;<<<<<<<=<<=<<==QPQ>>=>>=>>???????@??@@?@@@@@@@@AAAABAABBBBCBBBBCCBCCCCCCDDCWWWDEEEEEEEEFEFFEFFFFFGGHGGGHHHHHHHHHHHHIHIIHIIIJIIKKJKJKKJJ]]]KKLMLLLLMLMLMLMMMMMMNMNNNNNNONNONONPOOOPPPPPPPPQQPQQPPQQQccbRQQRRRRRRSSRSSSSSSTSSTSTTSTTTTTTTTTTUTTUVUUVUVVVVUVVVVVVVgggWVWWWWWXWWWWXXWXXXYWYYYYYYYYYYYYYYYZZYYZZZZZZZZZZZZZZZ[[Zjkj\[\][\\\\\\]]]]]]]]^]]^];;<<<>>>?????????@?@??@@@@@AAB@AAAABBAABBBBCBCCCCCCCCCDDDDDEWXXEEEEEEEFEFFFFFFFFGHGGGGGHHHHHHHHHHHHIIIIIIIIJKJJKJJKKJKKK]]]LKLMMLLLLMMMMNMMMNNMNNNNNNNNOOOPOOPOPPPPPPPPPPPPQQQQQQQQQcccRSRQRSSRSRSRSSSSSSSSSTTTTTTTTTUTTUTUUUUVUVUVUVVVVVVVVWVWVgghWWWWWWXXWXXWWWWYXXYXYYYYYYYYYYYYYZYYZYYZZZZZZZZZZ[Z[[[[[Zlkl\\[]\\]]]\]]]]]]]]=<<= =<=K==<====>>QRR>>>>???????@@?@@@@@@@AAAAAABBBBBBBBBCCBCBCCCBCCDEEDEEDEEDXXXEEFFFFEFFFFFFFFFFGGGGHHHHHHHHHIIHIIIIIIIIIIIKJKKKKJKKJKKK]^^LLLLLLMMMMMMNMMMNNMNNNNNNNNNNOOPOPOPPOPPPPPPQQPQQQQQQQQQQbbcSSSRRRRSSSSSTSSTSSTTSSTTTTUTTUUTTUVUUVUVUVVVVVVVVVVWVWVWWghhWWXWWXXWWXXWXWXYYXXYXYYYYYYYZYYZYZZYZZYZZZZZZ[Z[[[[[[\\[[jll[]\\]]]]]o]]],?(@ % $$#*++ !!!"""""""""##"######&&&--.###%$$%%%%%%%%%&&&&&&&&&***111'''(((((())))))*********...455+++,,,-,,---...////////0333:::000121222333444545555555888>?>565777888@ Y ! $$$+++ """"""""""""#########'''...###%%%%%%%%%&&&&&&'&&'&'***111'''((()))))))*********++...555+++------.-.//////000000333:::011222333444545555555555898@??666878888999 L !! !!$$$+++ !!"""""""#"#######$####'''...$$$%%%%%%&&&&&&'''''''''+++221'('))))))*******++++++++.//555+,+---...//////000000000444;;;111333444545555555555556999@@@777888999999::;  ! !!!!!!!$$$+++!!!"""""##########$$$$$$'''/..$$$%%%&&&&&&''&'''('''''+++222'(()))*******+*+++++++++///666,,,...//////000000111111444;;;222444444555555555566666:::@@A777999999:::;;;<<<= !!!!!!!!!!!!$%%,,,!!!##"########$$$$$$$$$$(((///$$$&&&&&&''&''''''((((((+++222(((******+*++++,++,,,,,,///676---//////000000111111111555<<<333454555555555655777777:::AAA788999:::;;;<<<<<< $$$%*+  " "!"!#!#"#!# &''-."#$%$&$&%&&'''$&& %$$)(,1/!&%"(&"('#)'$)($*($*($*)(-,054&+**--//////+/++/**/++0+/4/6;7,2-.3..3..3./3/050050151494@A?77799:::::;:;;;;;;*++++++++++++,+++,...O94N3,O4-O4-O5-P5.P5.Q6/Q6/S81W=7Q5/R70R70R71721/11>47S9@VRX?XW@WX@X[C[`H`YAYZBZZBZZBZ[C[\D\\E]]E]_G_MIMABADDDDDDEEEEEEEFF$$$$$$%$$%%%%%%#%%'((S0S&S'S(S(T(T)U*U*V-\3T)V+V+U+L2+(&{>>??????@@?@@@!!!!!!""""""""" ""$&%Q.Q#Q$Q%Q%R&R'R'R'T*Z1R&S(T(T)J/($$z:IXX^UVVVWXYZ]b\Kd#.*323JPPPQUOPQQQRRRU_G_594<<<<<<====>=>>>!!""""""""""""#!""%&&Q.Q#Q%Q%R'R'R'R'R'U*[1S'T)T)T)J0)%$z:JXX^UVWWXY[[\a\Kd$/+324KQPPQUPQQRRRRSV`H`5:5<======>>>????@"!"""""""#"####!"#%&&Q.Q$Q%R&R'R'R'R'R'U+[2S'T)U)T*K0)&%z;JXX^UVXXY[[Z\a\Ke%/,435LQPPRUPQRRRRSSV`H`6;6===>>>??????@@@""""""""#######"##%&'R/R$R&R'R'R'R'S'S'U+[2S(T)U*U*K0*&%z;KXX^VWXZ[[ZZ\b\Le%0-545LQPPRVQRRRRSSSVaIa6;6>>>??>@??@@@AA@"""#""######$$#"#$&''R/R%R'R'R'R'S(S(S(V+[2S(U*U+U+K1*'%{;KXX^VXY[[ZZZ\b^Mf&1.656LQPPSWQRRRSSTTWaIa7<7??????@@@A@@BBB###########$$$$"$$&''S0S&R'R'R'S(S(S(S(V,\3T)U*V+V,L1+'&{;KXY_WY[[ZZZZ]c`Og'2.656LQPQSWQRRSSSTTWbJa8=8??@@@@@@ABBABBB########$$$$$$$#$$&((S0S&R'R'S(S(S(S(T)V,\3T)U*V,V,L2+(&{9@@@@@ABAABBBBBC"""#""#########"##&''R/R%Q&R'R'R'S'S(S(V,\3T)U+U+U+K1+'&z;KYZ`YZYYYZZZ_e_Ng'1.545KQQQSWQRRSSTTTWbJb8=8@??A@@AAABABBCB---.-........//-./011Y8[0Z1[1[1[2\3\3\2^5c;]4^5]5]6T<5#11ETbbgaaaabbcdgkgWo1;8@?@RWWWY\XYYZZZ[[]iRiCHCJJJJJKKKKKKLMML'''''''''((((((&((*+,U3U)U+U+V+V,V,W-W,Z0_7W.X/X/Y0O5/,+~@O]_d\\\]]^``cgbQj+52:9;OTTTVZUUVVWWXXZfNf=C>DEEEEEFFFFGGGHG$$$$$$%%%%%%%%%$%%'))S1S'S(S(T)T)T)T*U*X.]5U+V,W,V-M3,)(|>M\]aYZZ[\^_^`e_Oh)30878NSRRUYSTTUUVVVYeMe;@C>EEEFFEFFFGGGHGH%%%&&&&&&'&'''''''*++221)('*))+*)+**+**,++,++,++0//765-,+/.-0..0/////000100211544<;;312434545655656656656766;9:A@@877989999999;:;<;<=<==<=@?@GFG>=?@?@@?AA@AB@BCBBCBCCBCGFGMLMDDDEEEFFFGGGHGHHHH&%&&&&&'''''''''''+++1)3')(*)+)+)+* ,+ -+ -/$06+7,!--$0.$0/%10.0110.-1+&2.*551=,'3.)5.*6/*6/*6/*60+60,740;;6B1,852:::::::03:.2:/3:/3;36>:>E15<36>37>47?59@69@6:A7:A;=EKLMEEEFFFGFGHGHHHHIII&&&&'''''(''(((('(*+*&&  "!'& !!!!"".B..'2C[+d d$h)b"c$c$c$c$d$d%e%g'l,h$U}.73<<<;<=>>AH?@ABCCDDH`\NABEGGGHHHHIHIIIIII%%%&&&&&&'''''''&')+),N,,2Ox&i&4.<<<;<=>>AH?@BCCCDEIlfN>?DGFFGGGHHHHHHIII010011111111212212454##"!6V67+=V|0! #m.?9FFFDGGGHKPIKLLMNNNRqkUIJOPPPQQQQQRRRRSSS*****+++++++,,,,*,./. 0P11%7Qw+!j+93A@@?AABCELEGFGHHIJMnhRDEJKKKLLLMMLMMMNNN(''(((((())())))'*+,+.N./#5Ov)~!h)61>>>=>@@@DKCDDEEFHHJmgPACGIIIJJJKKKKKLLLL(((())))))))****(*,-,0O/0$6Qw*!i)71???>?AAAELCDEFGHHHKmgQCCHJJJJKKLLKLLLMMM((())))))******+)*,.,0P01%7Qw*"i)82@@@?@ABCGLCEFGHHHILmhQCEIKKKLLLMMLMMMNNN))))))********++)+-.- 1Q11%7Qw+"j*93AAA?ABCDFLDFGHHHIILniRDEJLLKLMMMMMNNMNNN))********++++++*+-.- 1Q11%7Qw+!j+94AAA@BCDDGNEGHHHIIINoiSEFKMLMMMMMNNNNNOOO*)*******++++++,*,-/-  1Q11%7Rx+"j+:4BBA@CDDDGNEHHHHIJJNpjTFGLMMMNMNNNNOOOPPP***++*++++++,,,,*,./.  1Q12&8Ry,"k,;5BCCBDDDEIOGHHHIIKMOpkUGHLNNNNNNOOOPOPPPP*))******++++++,*,-/- ! 1P02%8Rx,"k+;5CBBACDDEHOFGHHHJLLNqkTFGLMMMNNNOOOOOOPPO4444545555556667578:8%& ""%%!!"""""";[;=0CZ4 # !!!!!""$'!r2E@MMLKMMNOQVOQRQSUUUWvq[PPUVVVWWXXXXXYXYYY..././////0/0001/1343###"5U57+=V|/! "$n.@:GGGFGHJJMRJKLNOOOPRsmXKKPRRRSSSSSSSTSTTT+++,,,,-,---..-/-.021  3U34';U~-!o+=7EEEDFGHHKQHIKMMMMNQsnWHJNPPPQQPQQQRRQRSR,,,,-----...//////2320q0'v')u))v)*v)+w*+w+,x+,x,.{.33,x,-y--{..z.6C683:CR5W.X~2]7V|0W}1X}1X~2Y3Y3Z4Z4]7b<]4Sk;B@EEEEtFG~G~HKQHJLLMMNNRb`XMMOPPQQQQRQRRRSSSS------.../////////333<162$+4&-4&.5'.6(/6)07*07*1:-4A3:8*19,3:,3;-49789:99697.7;2:B9A8/7:19;2:;2;=3<=4<=4=>5>B9AH?H?6>B=BEFEEFE=;A;9@=:B=;B@>EGEL>EA?FB@GC@HCAHDAIDAIGELWVWPPPQQQRQRRRRSSSTTS---...//////0000003338>R.6N07O08P19Q19Q2:R2:R2:R5=U;989?E7GX;IZ@P`8GW9IY;JZ;JZ;K[N`BLVFDCFFFGZ_H_dI_dI_eLbhRhmJ`fLbhMchMciNdiNdjOdjOekRhmX[]PPOQRRSSSSSSTSSTTT...//////00000000/434*TS!T!U"T"T"T"T"T&Y,]#V$W$X%X7?V=6+1W}"% """""""%*"1pH@;GHHIKKLNTLNOPPPPPRXntQLKRSSSSSSSTTTTTTT/////000001011011/444*UU!U!U"T"T"T"U#V&Y+^#W$X$X&Y8@X>6,1X~!%!"""""##%*!1qIA;GHIJKLLNUMOPPPPPPRYouRMLSSSSSTTTTUTTUUU///000001111111210545+V U"U"T"T"T"U#V#W&Y,^#W%X&Y&Y8@X>7,2X~"&"""""###&*"2rJC6+1X~"&!!!"""##%*!1rIB?2\([)[*[*\+],],^,^-`3d-_._.`/`BIaHA6:`$(+'((())**,0):ySLEQRRTTUVY]WXXXXXZ\^auz[VU\\\\]]]]]^^^^^^34444455455566676599:.X#V$V%W&X&Y&Y&Z&Z)\0a'Z)[)\*\KLLMNOORXOPPPRTUUW\qvTONVUUVVVVVVVWWWWW121222333444555553777,V!U#V$W$W$W$X$X%X([.`&Y'Z([([;C[B:/4[ $("#$$$%%%(-$4tMF@LMMOOPPRXOPPSTUUUW]qwTPOVVVWVVWWWWWWXXW222333444545555553777-W"W$W$W$W$W$X&Y&Y([/a&Y([([)[F]E=27]!%*#%%&&&''*.%6vPIBNOOPPPPRZTUUUUUUUX^syVRQXXXXXYYYYYYYZZZ555555555666767766:::/Y"X$X&Y&Y&Y'Z'Z([*]1b([)\)]+]>F^E=37]"&*$%&&&'''*/%7vPICOOPPPPPS[TUUUUUUVY_syWRRYYYYYYYYYZZZZZZ4444444455666667659:9.Y!Y$Y$Y%Y%Z&Z&[&[)]/b&[(](^)^>F_E=27^ $)#$$$%%&%(.#5wPIBOPPOOOQV[STTTTTUUY_tyWSQXXXYXXYYYYYYZZZ>>>>?>???@@@AAAAA?CDD9\/[1[2\2\2\3]3]4]6_;d5^7`7a7aHObOH?Bb-16122234457;3CwYSNXYYXXY\^b\]]]]^^^afvz_\[a`aaaaaaabbbbbb898999:::;:;;;;;;;>?>DEE<<<>>>>>>??????@@@AA@ABADDDJKKCBCDDDEEDEFEFGFGGGGHHGGGJKKQQQIIIKKKKKKLLLMMMMNNNNNOOORRRWXWPPORRQSRSSSSSSRTSRUSTUTTXWW]\\VUTXWVXWWXXWYXXYXXYXXZYY\\\bbb[[[\\\\\\\\]]^]^^^666777778888888999<==DCB::9<;:<<;==<===@?>@?>CBAIIHA@?CBACCADCBEEEEEEFFEFEEJIHPOOHGFIHGJIHKJILKJMLKMLLMLLPOOVUUONMPOOPPQQQQRPPRQQSRRSRQVUT[ZZTSRVUTVUUVUUWVVWVVWVVWWW[ZZa``YYYZZZZZZ[[[[\\\\\777e878888998999:::>>>DDD;;;=<<===>>>>?????@@@@@@DDDKKJBABCCCDDDEEEEEFFFFGGFHGGKKKQQQHHHJJJKKKLKLMMMMMMNNNNNNRQQXWWOOOQQQQQQRRRSRSSSSSTSSTTVVV\\\UUUVVVWWWWWWWXWXXXYYXYYY\[\aaaYYY[ZZ[[[\\\]]]]]]888888999999:;:;;;>>>EEE<;<===>>>??????@@@A@AAAADEEKKKBBBDDDEEEEFEFFFGGGHGHHHHKKKQQQIIIKKKLLKLMMMMMNNNNNNONORRRXXXPPPQQQQRRSRRSSSTSSTTTTTTXWW^]]UUUWVWWWWWXWWXWYYYYYYYYY\\\aaaZZZ[\[\\\\]]]]]]]]#999(99:;::;;;;;;???EEE<<<>>>??????@@@@AABBBBBBEEELLLCCCEEEFFFFFFFGFHHHHHHIHHKKKRRRJJJLKLLMMMMMNNNNNNNOOPOORRSXXXPPPRRQSRRSSSTTTTTTUTTUUUXXX^]^VVVWWWWWWXXXYYYYYYYYZYZY\\\bab[[[\\\\]]]]]^^]W:;:';;;<<<<<=>???@@@AAAAAABBBCCCCCCGGGMMMEEDFFFGFGHHHHHHIIIIIIJJJMMMSSSLKKMMMMNNNNNNOOPOPPPPPPPSSSYYYQQRSSSTSSTTTTTTUUUVVVVVVYYY^^^VVVXXWXXXYYYYYYZYYZZZZZZ]]]ccc\\\]]]^]](0` B !!!)))!!!"!!""""#"###""")))((($$$%%%%%%&&&&&&'''///'((((()))))*******101000,++----..////00011888111222333444555444::::::777888[ ` !!!!!)))!!!""""""#######"#))*)))$$$%%%&&&&&&'''(((000((())))))****+****111000,,,..././///000111999222333444555555444;;;;;<777898999 7 !!!!!!"""***""""""#######$####***)))$$%&&&&&&'''(''(((000()))))******++++++221111---///000000111112:9:333444555555565556<<<<<<8889:9;;;;<?>8888988989:9:;::;:@AAAAA>=>???@@@@@A'''''''''''(&(F0O)N*O*O+O,O+S1S0P,S-C-))ATVzYzTvTwTvTwUwVw\|]Nf&3*s@sPOPTPPQRRRTBCB?@?AAABBBBBB !!!!!!!!! "G+S#R$R%S&S&R%X,W+T&W(B( "#AXZ]WWWXYZ``Nl-"}=}QPPTPQQRRST>?>::9<<<==<>>>"!"""""""###!#G,S%Q&R'R'R'R&W-W,S(W)C)$$AWY\VWXY[Z^_Nk.$|>}RPPTPQRRSST?@?;<;>>>>??@?@""""""######!$H-T%R'R'R'R'R'X.W-T)W)C*$%BXY]VXY[[Z^`Ol 0%}?~RPPUQRRSSSU@@@<=@@@A@@"""#######$$"$H-T&R'R'R'S(S'X.W-T)X+D+%%BYY]WY[[ZY_aQl!1&~@~RPQVRRRSSTUAA@=>=@@?@@@BAA######$#$$$$#%I.T'R'R'S(S(S(X/X.T*X+D,&&BYZ^Y[[ZZZ`cRn"1'~@~RQRVRRSSTUVBCB>?>@@@BAABBB######$$$$$$#%I/T'R'S(S(T(S(Y/X.U*Y,E,&&CY[_Z[ZZ[[adRn"2'~@~RQRWRSSTTUWBCB??>AAABBBCCC,,,,,,,-----#+.O6[/Y0Z0Z1[1[1_6_7\3_4L4//K_bf```abchiYs*:/GWVW[XXYZZ[[JJJGHGIIIJJJKKK$$$%%%%%%&&%$'J/U(S(T)U)U*U*Z1Y0V,Y-F-((E[^aZZ[\_^ccRn$3)BTRSXTTUVVVWEEEABACDCDDDFFF$$$%%%%%%&&&$'J0U(T)T)U*U*U*Z1Y0V,Z-F-((F\^`Z[\^_^bcSo$4)BTSTXTUUVVVXEFEABADDDEEEFFF%%%%%%&&&&&&%'L0Y(W)W*X*Y,X+]1\1Y,].I.))G_`b]^`ba`dgVs$5)DVUUZVWWWWXYFGFCCCEEEFFFGGG%%%&&&&&&'''#'(f;0:(:);*;*<+;+B1A1=,@.a9/%--]9BCUIYBSDTEUFVEVEVK[L\qCN173V=WEEFLGHHIJJOHHGDEDFFFGGGHHH&&&&&&''''''))()*1)* + ,!,!+&(2%'2!#.#$0(*0210)+/"'.+06#)/%+0&+1&+1&+1&+2-39-28-15;::376(30)41*523>:,74-85.96/:70;80;7:C@IIIEEEGFGHHHIII&%%&&&'''''')!)%%!!!!&}&.!2Nu'lm$i j!i!j!j"k"o&q$])0.;th;Dz<ǫ=Ȭ>ʰFȭ@ȭAɭBɮCɮCɲDJHHIEEEGGGHHHIII++++++,,,-,-.#.##&%29_&r&0.A@BCDKEGHHIJOLMMJJKLLLMMMNNN-,----......0&0%$''4!:_) q)31BBDEFLHIIJKKQOOPLLMNNNOOOPPP'''(((((()))**"!$$/5[%n&-+=|=?@AJCCDEGFLKKKGGHJJJKKKLLL((())))))***,!,""%%17\&o&/-?}?ABCKDEFHHGMLLLIIJKKLMMLMNM))))))******-!,##&&28\& p&0/@~@BCDKEFHHHHNMMNJJKLMMMMMNNN*)****++++++-"-##&&28]& p'1/A~ACDDLFHHHIIONNOKKLMMMNNNOOO***++*+++,+,-#.##''29^' p(20BCDDFMGHHIJKQPPPLLMNNNOOOPPP***++++++,,,.#.$$''3 9^( q)31CCDEGNHHIILLRPPQLLMNONPPPPPP3333444445457,7))"#""!! --<*Cd." !!!!!$#v.<:KKLMOTOPQRTSXVWWTTUVVVWWWXXX,,,-,----...1&1$$''5!18>28E8?D8>B9>FGFA?B;3<<6==7>E?F?8@@:AA;BB5$,e# %#,yH:4ILLLSNPPPPOUUUTSQQSSTTTTUUU///0//00001030(-N V!T!S"T#U#V([&Z$W$Z/M?5&-c%""""##'%.wH;5ILKMUNPPPOOWVUUSRQSTTTTTUUU44454555566695-1R$Y%W%W&Y'Z'Y,^+^)[(^3QD:+1g"($%%&&&*)2zMA:NOPRYSSSSTV\ZYYWVVXXXYYYZZY666766777888;803S%Y&X(Z([([([-_-_+]*_5SF<-3i#)%&&''',*4{OC8KNOOVOOPRTTYXWWTTSVVUVVVVWW22233344455564+/O"X$W$W$W%X%X+]*]&Z']2PC9*0f '##$$%%*(1zM@:NOPPWPPSUUTYYYXVUUWWWWWWXXX33344455555564,0Q#Y$W$X$X&Y%Y+^+]([']2PD:*1h!(#$$%&%*(1{NB;NPPPWPSUUUTZZYYVUUWWWXXXYYY44455555555585-1R#X$X$X&Y&Y&Y,^+^([(]2QE;,1h!)$%%&&&+)2{OB>>??????A?:=R3U5T5U5V6W7V;[;[9Y9\ATNG=?b4y;|7x7y8y9z:{:{?=CrXOLWzWX[`[\\\]]bbaa___``````aab777878888999:::CA<=91>;3><3?=4@=5@>5GDQLFJE?KF@MGANHBOIDOJDUOJTOIQMIQQRRNNRJISLJTMK[SQUNLVOMWOMWPNWPNXPO]WV]]]ZZYZZ[[\\]]]777888898999;;;CCC<<<===>>=??>@@@?@?FGFFFFCBCDDDEEEEFFGFFIHHOOOIIIJJJLKKMMLMMMMMMTSSTSSPPPQQQRRRSSSSTSTTT[[[VVVVVVWWWXWWXXXXXX^]]]]]ZYZ[[\]]\]]]888"899999;;;<<>>????@@@@@AAAGGGGGGDCDEEEFFFGGFHHHIIIPPPJJJKLKLMLMMNNNNNNNTTTTTTPPQRRRSSSSTTTTTUUU\\\VVVWWWWWWXXXYYYYYY^^^^]][[[\]\]]]]]]?9:9<;;:<;;=<=DDD===???@@@@@@AAABBBHHHHHHDEEFFFGGGHHHIIIJIJQQQKKKMMMMMMNNNOONOOOUUUTTURQQSSSTSSTTTUUUVVV]]]VWWXXXXXXYYYYYYYYY^^^___[\\]]]^]]^;;;#<<<===EEE>>??@?@@@AAABBBBBBIIIIIIEEEFFGHHHHIHIIIKKJRRRLLLMMNNNNOOOPPPPPPVUUUUURRRTTSTTTUTUVVVWWW]]]WWWXXWYYYYYYZZZYZY______]]]]^]:( @ ^ &&&"""""""#####)))%%%%%%&&&&&&,-,))))))******000------////0/666222333555555;:;888888t \ !!!'''"##"########***&&&&&&''&'''---)**)**++*+++111...///000000767434445555555<<<999999;;;r!!!"""""""'(!$!$"$"%(+$'%''(( '%",)(&(&)' *'&0.&.,000(0''0&.7.+4++4++5+,6,7=7;;;<<<===&&&''' %'`7-D*B)C*D+H0F-D-6/+}>OMeIaH`IaJaQhHY869EHLIIKL{J{:?:AAABBB!!!""""<)V%T%T'T'Y,W)T)8,$Hg_YYZ\bTt627MSTRSSUN1;1===>>>"""### #<*U&R'R'R'W.U)S)8-&Ge\WX[Z`Rp749MQSRRRTN3<3??>@@@#"####!#<*U(R'S(S(X.V*T+9.'Ge]YZ[ZaUr95;MQTRRSUO4>4@@@AAA$$$%$%"%>,V)S(T)T)Y/W,U,:/(If_[[[[dWs:6,W)U)V*V*[1X-V-;0)Kib\\__dWu;7=OSWUUVWR8A8DDDEEE%%%&&&$&|<-Q*N*P+P,U1R.Q.;1+GbZV{X{Y}X}_Sn<9=LPTRRSTQ;C;FEFGGG&&&''&&''1--2)*2)*3*+4*+:126-.7./100503=6::37;48<49<49C;@>8<999?:A@:CFAID>FD?GF@HGAJKHLFFFGGGHHH'''(((* )%m& ,;0Z$snmnou"c&A><é<Ի<ֻBչ@չAֺBCJ?AHIIIJJJ--,---/"/''0C5l$v%HEACDJHIJKPBDMNNNOOO((()()**$~$-?1h"r$DA=?@GEEGHM?AJKKKLLL)))***,+&%.A3h"s$EB?ACIFGHHN@BKLMMNNN******, ,&&/A4i#t%GC@CDJHHIJPBDMNNNOOO+++,,,.!.''0B5j$u'IFCEELIIJMRDFOOOOQQQ1101114'4++ 5I:q' {(NKHJKPNOQRVIKTTUUUUU,,,---/'/-i*!"#$(#& &"4@6\(r#n#n#o$p%v(g,HFDBŪCǪHƪEƪGǪHDZIQIKQQQQRRR---///00.54?1-J2.I40K40K:6Q73N73M:9;6;I:AW7>S8?T9@U:AV@G]?EUEFF?OY@R]EWbCU`DVaFWbFYcPZ`RQQRRSTTT///0002/&.C!U"S#S#S)Y%W&U:;G*l####$',xGKKJKPNPPPUSKISSTTTT10111130'0F!X"U#V$W(\%Z'Y<=I*p"""##&-}INMLMSQQQQXTLJUUUVVV66677796-5J%Z'Y([([-_*],\ABN.s&%&''*1NRRQSXUTUX]YQOZZZ[[[11133352)1F"W$W$W$X*]'Z(Y=>K,p$##$%(.}KOONOTPPTUYVMLVVVWWW33355463*2G#Y$W%X&Y+^(\*Z?@L,q$$$%&)/MQQPPTQTUUZWOMWWWYYY55555574+3I#Z$X&Y&Y,^)\*[@AN-r%%%&'*0NSRPPUUUUUZXOMXYYYYZ66666696,4K#]%[&\'],a(_*^BCP-v$$$%&)/PTTPQXWVVV\ZQOZZZ[Z[;;;<<<=<8>Gc6M7M8N9O>TRHIN?]y>l=i=i?k@lEqGhUVVUW\ZZ[[`^ZZ^^^___77788889:@?;>:1>;2@<3A>4GD;DA8EB9EEDHC?OHBLF?MF@NHBOICUOIRMIQQQRKISJIXPNVNLVNLWOMXPN]YXZ[[[[[\]\888H:99;;;AAA>>>???@@@AAAGGGEEEFFEGGGHHHNNNKLKMMMNNNOOOUUURRRRRSTTSTTTZZZWWWWWWXYYYYY^^^\\\\]]^]]\;;;H<<+E1+m;IDVASBTGX{DOF7EBFEEG`E`;>;@@@""" "p6'W&U'U'Y,X(h6'Lo^Y[aVs]9]RTSTVJ2;2???""" #m6(U'R'S(W-V)e6(Jl[YZ^Up]:\PSRRUK4=4AA@$$$"$n8*V)T)U*Y.X,f8*Lm^[[`Yr^<^QUTTWM7@7CCC(((&(q;-Y,W,X.\3[0j;-Qqb]_e[ub?aTWVWYP;D;GGG%%%#%p8+V)T)U+X0X,i9+Np^[]aXt`=`QUTUWN:C9FFF&&&$&&:/+Y5*Y4*Z5+^:0\9.<2/R9?b?Ha>Eb?GeBK]BGB:BcAchFggEfhFglHkXJXCEDHGH)))+"+%_()\._"pklqa%_Z<׿9=ؿ=ؿ>@~IACJKKL++*,!,'m'+h.r"s#kc?BGGHJNACLNNN)))* *&j&+f-o"q$ia>BGFGHM@CKMMM***+!,'k'+f.p"r%jb@CHHHJOBDMONO//.1&1+r+/m2u%w&phEHMLMPTGIRSTS-.-0(0.`*!"$'$2]1f%wtuz j(d]CҰ?ӲDӱCӱEԸF}PJLRSSS..-//,36G.8o/9m09n5>r2OEIWAZpAd@aBcFhIc}S]`UZYYZ_pu]ZZ^^^888999?><><4?=5B?7GD=EB:FECJFCNHCMHBOIDSMHTPKRPPSLJWQOWPNWQOYRP]ZY[[\]]]:::;;;@@@???@@@BBBHHHFFFHHHKKJNNNMMMOOOSSSTTTSSSUUUYYYXXXYYYZZZ^^^]]]^^^AAAAAAAAAAAAAAAAAAAAAAAA(   ~ "# #!#$'$%!(&'% (&&-+)-*)1)*2*,4,797:9: ##4)'e4'e4(h8+J0*[7Aj:Gk; "X0&V'U(Z+A)Ou\^WqBUSVsFs5=5"$W1(U)U)Z-B,Os]]XqCTTVtHt9A9$&\4+X,X-]0E/Sz_a[wFVVXzKz=EFGIwLCEM,",)Z)((y"s#BIJLzPFHP/(0.T+!"#.(o!|}m$~@޽A޹B߾E|qPKNS.-)06I*E+F.J3Am2\/g0h7aFlvLNOShmSON42*3>c#Y%Y'^2N)}!"+~KRRSXWPN42+3>a$X%Y(]3N+|#%-}MSSVXXQO74-5Ad%['\*`5Q,~$&/OUVWZZSQ997=<@>7B@9GE>GEBLIEOJEQLGUQMSPOWQOXRPYSR][[]]]}AAAAAAAAAAAAAAAADisplayCAL-3.1.0.0/DisplayCAL/theme/icons/DisplayCAL-uninstall.ico0000644000076500000000000050640712647526530024312 0ustar devwheel00000000000000 Ii (i`` q@@ (B00 %H  on  hPNG  IHDR\rfiIDATx vYU&}$jUQȤŌ`Ӻl1+IΰJ9H;+S'Ҧ;mb( MP\EU!8 y|}}s=L9{3쁮o.j{w~~Uh;;;<<=s/m}/y6}+_9xss G~Ӟ?qc~൯}o.׊h\Ûsp|>}/c`<'< G<< xӟ~?̣e}s_x5k'06b-WgܗR7>4^-iTU2Fw37 6oF#w#sC\?_~7qݍ--dasO n)6Q 6H;VQU(}2x'ݳ?ގhI#A\p_a_9}vVgsm-O\oc:m@hh Y#pqR}˥q(܃u$I3Ps|qh.~zZ"ga,@ЙaӲ'67ߜ1V+pg[$#@,Wd2* R?V/)oWTyexg 뮻K^20P(?n.X\6..~|X\K;c5g`e6Fڣo9@:ܪ+Fߪ2(i/oom;@K.kk;$c//KG67l@3 ?esy'V#R9aԌ:*@׍ӾA:}׵|Z[~ޔ V6?}=^)}k ν]@"hEu &a7Z\@kc/}>`f#{_GQQNw0⮬5_׹__U_;5 S 0M@/o@௟QaWm.W$C}3Ʌali+Z%$mU:e cwߙY) sw=|_>V3 O|OݑV3fnGpuXÆ1w&1͖ʃkp/;wtQne=T'MbpF-?0 Zo>OySQ'ͧ*̬z׻p| p4<2frVS7F2CUTjrfQ[Fm$ׅߥomau~ݡ 6<siUC#-_#D=G3p,d+7tk2j0f>mLG f`5J[@oG}@ad? '=i9W no.S 6 msX7 ru )TK<îpT|x"U*#ַ~Z*Ef}^ `\5e}cGYVmo;4n\^Eӷ~F}b}| =?,d7fi~;y?|d^M6'q*vXUѹ؀9o']rkP>H0pȢ?1sϵA|6o#џyE?0VʯvbĻM޸V~2>qq ctejDkXÀ4!r_ԑ:*Aū1L__BYzVKp1_k-OyS;x<2"u8gĪF\#pX+h3Ct-Hz(k)SbG#>=8= =3*g̏Չx;m]YPG?c?vW}Uk #63>uU ޑ6j,*UÆٲ,s2re8_Nde#a%gG[ccmmA D ^EǦ-Wep0Xܠv58 ՘;Eyde8!Q)cusvʗ%~\(~W@qHp;Das8.}5*h;{ow\/UC?Cy[msR:AVxTQ)c,=fy7;`Y[ρK(͔(AMhHo晭Уbi |`2LvW΋68xްM3?xM'D(>gCexƘ?hĻWWoWI]#o> V9x_@l"]+^3jkT8ۤ8- 'nO-ױXE= ^k9#֛NE 77߰f#'RrÀUkE']vjzMV f ooNuVXº+X/ԙ`ҏȏlg|W?'Br(3i&aNzLaY)Dn&,m'مx*?`F?=0vTvĥ^z,Y1섟KIpx 7<5j_wȰcξ9cr 1|UFʮa0kg"c_'JUyFY4h9~ǟq-^|iĺ~4]_~| fq3U*cyvVv]62F̞]G*qZ˜h+wfYՍcS仂F sH(uVt 02eE]t?[F'++@c蚔 *ki:FD'o!;5ԉOO3φPwFL~^S_~V|̀7n30DmϴW h_va8 TY%@V훸@\ (Sg\'>#aD$}-x^vgܹUyfhvMU!*Wh5J_6F= f(+Q*\b V5PYÆ2WǏ뮻>ΈiѯV}w}w|w|a#BU#t֬׭z F8}'=+3$){kY/ܜ ի7Kb o ?ķ4r-Gtx/՞dW 81fawn\au Vz7QjqYG Qޫz CY^ӕ30pY@^հ@^v= Gv LYf@z# ^HpoLYl=<nTa]guzyk(oVklK0͟SE*,mYG|GO?v c5\IW:|=/eBm)Y ]|]v=66%BmpifuRaTb`0?͌ UW]ep>W@ TS3:l_@QjŇ !npR\~g*O೽?~q, /WL~U* ?W1]4JgtEp 3wg=G L:髌xkQfa@^\oxƙ~z0Q*F' WgYWݚ;8Vr骟Jp?6pgBuʰ4+gF@טpO1؊Ps3OWF@WeeitW Ƴ:7L~ω.6\g@E/zv9+N9pH\І:2ƹunрY`ս{Heeg [Y;3ZVynK3gS56U4}u0'&scytL۾͖kc#;ѷ~^z饟^ԏFXݩ#P`p#c#kȿr[2Wwި8Ï? {7F15A>ƓX;.:Jb?nh-Qjg 09 |h{H= =K6gJr]HɘC|D9tiG6Tn 22 ÁB%yeLnZCvs;eбh&*EBcioP=00h*7z}4oV]_3c+ ` Xkz^G̲.1@~2뻂ʟrd !\kݥlj%\rGR*CtvFU)Uni>(@4#cKL8`3P }4Í+u%cp~#QG3"S{8UUyx}8nо0fғ2%3 p"+3s4Lp\ws5SN/WL = Yϒ{.Uɘ6z]H##֣AփE~~UY>(.:3,0 m=62z&dž6p2Ũ 2@eJ>Dqs8Ћ(L{˸w*@]AGܯ7?T68.U3P~|d{cjL`.0i^$H3 t Qz׻>3c$ DT녪=¦f gYXNGC&Nzu^j|V.3S/ gv3SBlv4KǶC~u& bv_(={H'f fp {֟4 Q qz!;aG F.5|`F2{K K]A?$"'F뮻a}$CB6Bpǿy`*> r1H`8 4q]\T 螀uO*Zc?3 tsJB go'3 cyal7| @|(^e 0gx&gnsf0*M#qicw0 ׳\l,sLvutnܹWfw0,W{ ~l鸢~ym 0 fFTWAPz 62:tǰV8}(@_-j2T6~*tl#9j0`5:m<99x+_yy9=_!{2ġFupe0?*b;ugJ}pqF:(MY 7vQ `d||lG=ďكxKu@ezfeCXmvl&s4gB7PpwNj_b B =?kDe[|}&0hd\0vifzhg,eTz_AQ+D3ßvdتTQm2uA൯}IC21,2g!۱z&^Ä.YDgm2q{Ŵ P1O65ъ uyVΫӴrӴ"P#I?‘;.#5+0?jQXigKn2>-QyH<ƽ2_;ȘQ0[dNZ~pÕϢ:R Gp3+. D)>o&-h`~7[eWD|%o}饗ެUtvea31;2eFʰ1i@7H%(Hz*3ruʨ:˵18oKA ҝd|p;ũQf(5y#N D}=ykj6 2X/Ph#`ŌkQ}~w4=7s;R// LKA2L1ˏWftBǎ!h:ZW>C+9oNqTws1}\>]`tjph6ކ+c.җMvoDFW'cz[8.Re]A`eL2?\ds)}#{Ag=7og: 'RoW6;cmٷGeZ{,qc\n2*>r*6pCƘY3: v/Gv7SQ9ݢ,k<2RvD]-W 0?Yܣ> q^ X:r&@Y>^ 4a@ѦJy#ZbS7DxVXuꪃ{A~ &^I,.VSF8_WR[%Y}=KH9?s ~ҧ@ƈQ@eʼa> Uz>>OZ4!-C#y+]ti u]wmgx' c,2Qfp=p\C8Aû~0I-FO >.q g?{X]^k4 *5va݅{JӄDlL|WBelG}P/\/݆;3U4E{>;3.36Hu}.v--F5x&`rQ{7=|@̕nY*qAΊ9|˹eT'eR V5&j0LV5gX:?,?7‘> LgjRiEϛ \-?oj̀7w{+d45L{`'Ksq| '98{'eY1Ӂ{vg?ܑ C|Z -/I}{ߟe.*X1E=l%2=Ø^.K.Z:ƌx) U۵wA@{;so==ve;s07ѻw[PsctyHw(sQNw]ұ .!.g޲lшQf ;^=4Ngp$7rڟ3J0/ۢ]uxem~."cbF 9]Wbȸ]I.N7@aWrӳr+ ;m2l^]u>Ӟ%Й4m/ˏnU:YghM@u?pdAu zu (Eg$b HY1JmYPzDv C-z\~vbxH!΀=t`ljFߎ#f%s](N0/k#3u?ʊn[k#\ SF֠Y`MQϚieFN휀tq6fA fU=| }3{+^җЧP0w.X}fvY3<c~~q R˼25o-4WiS"~0l]e;Be2wJ{ڏ?Nu͐*a0ykK'1GyOh&hc a3oT0_`1Q8o}Uz&#|::Tq 8B6g@^8;08ꪫމBkZ{h9#nC5ok:^V~3yU@! Gb9)f%H~j#]c/(TPݪ;̠6 =@}@_ڻՅ?k:f_ LnmdXT8Q뤓 =uJ?W0fWXcZnGJ@8Õ|VZ/㸲v/ j7Y9 ng4ԙP4.1U@7ԟm`\&qŏ~ϰޯ`^@R4|*̀@',9 #w嬽7d0A6mN~(Sf8G:zU~Nz3,*Dv /N 19(=H/V?G:cŬ~&pyT&Ss)nqu\7]Zh,]dp}lj#5pOMh7ct' AtUEE>qk`*kO$gi-E0s?gKq WF *{ȅl50m)s:=pר6lP'д1vVw4<L\l z{^} !s~cL0dhiиu&.izwţF%z<زC9*pDGs~9:&e'v`)uK+.cKfu녖f͋R59gx;50w|;GǻV+;I`yGg7iY}|Ύ(1+7\nƷs:Öu s=ئD3CYޞg@ u fq#DÝLz?zs#t3=zo][Q=5 |p!W3p(?34mg%2sep@*}B_JC AF̣it҃%^ e1AU>v4 FW ~Wcz0g/0Ƭ>#¢l)M}T@eʭ:̥9Zb3,2蝙40H}#UHLYb@]4Xaxճ .v[ \x'|w0KeWX>_г]7T Zs ˼N/;- ҝG!jFx[w?kdq&+]a`Jg(h3t-n?jz,GLue@?^aB܏v=ē!!$4xv6yswGYh ߍHgpp`0 3 e י=pE>ܻP~Nu5tFnVKGE]HZXRv?[9]F3;䤏qixmPܫ3ZĢkTa }0beUq K{v;`Qu?1Tu߅H72e~nX+i1M%ƷL@g}f|Ϊ4~BQ&T9ڲ+ƙ\ݎԐ7ׯn1l88BpkVj:f)TYA 3UXU/w .oI jȮn?3@ ~VHw2/e^~ ӗmL'=Pp#5${'}wfP&lwxG@3~8kLvR.e>=zuFW9Yt71mLՂ!= C|Xɷ7q#H  l!bSt+K{"șޞC]dߑ@ LWv64W;s㘭?>~fl\"̘$|C𷵌+_|W  3iN6uvp\9sWax"Шw#QY@0 ;;Nu<^Bg9C=Wԍ~l!n5TY@cߥ";+jˁHξc?%'V8zuxqY';x=+:CQS^~sl(0 `fb>zHF7nΎ~g"91n?&wV?2tֱW3r1t-3"~fqF;`p㤴!hZ D? 9-23 c _ԅ@† 7>׎8C!dU=3ݡ7(&eUn3"3Uz6~:l1;q^U&g6ytlzRΈq+C`OEWӞItLRJj3+Px@t̿bTwVwuS"ы"MI?5>X8K[X"=?f=VLY)0Dz;ؾ5lGpyƳ̂-kd~3l+z5o;L=W7c~0+k쑟MFPQ 1:1!e`⎊q9KoGaHA:Tdgo\vԊwNi;;t > tL ^ȉ.3$jS+1?1,xݱ]y$`$@41D(lF߹ѳ v〠 pI;Ntg- t"9~?h8/w+?5gZg ho8f874z0;+#>[+>c+-&4g3V|<?0f`xxbS+q:|Uw:u@WV@IvNcHodm+DӅ:zc`dw`~%>FXG#B_7s~mA00nu(Lbĉq_sRs]trTfI3h!0*:VxW5VPYEŲpCaztÌL58z1r*ua`(7nNtD[;pq I4pfS2eq #_~$3`އ%*ϥrv}&m>+r7SR@WّK3$+@%sf l |Ugl5xe#w~?*L3w/ʴ瑱Mm#g~u~}EgjF(SE=wn]CjQ: YgvdN_,%X^{k3{L&36⡌0aB׫-ŖyqNxutWHDn@+fz#NUS4\`IvT~tՀ2JK8*xCrS13ouGzFf>lr] Rw]׵Ѹg^ލc8. _=wtb 6; pn^󠇃f@+km7ʫW{wt …h g1/QN4A#&tM`mmX[#.XQb?8΂X4FYTPT({ΓJW.a^>v\>L7* b}*$\@A2߽Pd#h'nG|-R6zs*$DJ\p \ fp,w$og?⊡j} 6W/کu:?ShpCB"޿#wU]XB**TL7ܲAU w啅rv*j`L4&UUc :~xEr PYkSb#d"D5f{پ|KT5z]HqbƠt43=UyfUmy󪫮C_f^=SE/3ko5)7{׹ot`ܩ?z/zd70zw &f#r]:o*)DmW3_l*߅=R7oFU_pV}~qzH"cG 09($HC+##>HCx=S^q8}FP;.p#1xW`6,9=<g_ saݻϘT渳r 9fĿ+CJ^>_xF8\X,@! @0@^Ѐ3_F?P|W=zL{H3z%s݆gt(.j)^_18*_bNf+e((?txf 0A Бܰ|0 D8rmm8B*>F 1\c @9\j$ue8_~Ei! af ]1{ HH'ij>K{3?B "|{8#B2&daA/nB P9 k̃t |nPK_b_wF\F\NF@u12_O$~ųZ {h 1rW&P@u}M?La}Bز{F_0Xg 2{h;N9x9pșUeupxe*s2*  #vF@a4FP}28o{k4q,dÀ:@!NuUI 2<ݎ@W|}_z>f „_&`уYu ccc(`V^~\Fn Uk 5 QC*i]i8f HCT߀ 1[d)2Vn.3 X}p8~~"23uktٻEpܨva1ʥ@+D~g |)`IL#e T" AW&aʐPa𧽽S 0 0@%`]@-ֆa?ၘ5lp !gz76|yktT$3Vf@|˩2eWX /aywAT FfFf$Z /]Svcv_wbR}إW#L/~R 2] r@UX.J в"2 @m ]`܂O+ c0EsRHkH(a;@b `oߴ@0I1׉@Y|Ap-oĹ+[@|Ϫ>H'\=$@>/Z.gϠw褘i)={\30`fIR*T ֐]AUaDK ,;jI sg\@`y5`e$jW_g#0?IΌAfpgIO_{f?f0Ǎj=^%#?2j9$W\KqK%̖ÀRu }Y"bA_AjM<3u{}M_g&`F>ш@eA&u^PO38O7̘kd0t 0;`ܬBg\T/cnD擉U?hg#}fIbpځ@n_Սs?kYf~\a60 W=} PtnqW YiA3ȏi@]tw uV  aAjՃײvPq Ƅv#z]ǀ1 PMd%6e~UV}: v6A` \et[e,N2#0K8IgU"chD0 ؿV?KWhMA֤u>C8f]Ka}ײWl ]D fVq8]5`4nkd 63?R23p= k~81 MOxga1.T03Pu60+bsн{4fgRX@UcW@' x?W43f|%t{%T}m}k^v75g@{3=?+;==4l&IZ6'+iսQ5(_H? ˖yG  +#M7C5Knqݠ SI CN@=$}^ T ˝wyd[Y$14o ڑFnupx7(wY&f0; qw!rk"e~3w_s% $(6vw&lQ(@&Y; wq8[n "hHkݝ4Gaf \pAARn[Ю=?33*(Y72ֺʳ]:À瞙?w gT 1'z0$;̯ϕ _+y#tWv)czG@B4?&)_t'iX|QΘ?18۾(~1ŗ ,cX aGuTBr `*i'?1̕ᾫ42Ψpf?疥o)3`dt<2e{ [tZ *qx5]& "Ly6ϓ"=z!W DX:0!HF8 eMVG t=@?7rx"wT `tfCFg.:"ԕ}@^&?NJ 2w>}{L%):' ܗKYz֪ $ ZGk#)`f~>F;D8rGyd|奌~ F-ӱ CVםp |M(8̣~Jk>?hBqxX eW>wF2D&~+ k /po md]s^~ =P0f+pew^:l2ԧ@(ihȿzy^ hwuW]ZtmmoL~Y1O}XZόdAiF*h @>hqP*6 3@p \Djˀ2";2Ղ:D̯B"4QHk@u{sh_ }ӟO8L6r U8ba؅O=}%@9sv{^ .}о YP0SoV;,Sj*Љ 0S B~]ݞF*/ t};wI5ا`\ }V10U2ĺ9 e=ƙGzcVy,yHjӑ?Qf RfFϻ,:2 HUۏ$pǏF|`8κECAPe0Ac>TTf Xd8рuxI ;hg+tvY8[yw$~e( \Li`RN<`jMkRle8ӫ3/ m#_;iUP>3豈1=?zqwRÄ nEf w h!4IH#%*Ivb¡!V XR#fUcx7FMqϪS(ޟvcRf5>uZu?5 |X9?w{T e q0*5~wiDyf+/Cy8 6a(,4󫛎^*bN5$ @Sbyq; CǷbi&V֐ڽ?]`df:QѦ#wLz]:F s;<;^,N rj@0rs 5i_a'dk@ne2엹e`'Gq53!N Bǜ(5{ dlH(UЙw1f[i;;L,w 2;1V?iW@tw UDۡ[UJPv|9Tuj \Gjˌ~Y݅*WPp`ʤ~'{_ env\`I$fBo " , 8+ݩ]%ԧ>uPL nSh=@n&`+]atPu@08W5Oݸ)?CK$T.hpg*@g5 .Sm#q(]GKgRV),ڝс#U EHi'Y v~m 9$]!Cӭ;c`N#@VOof#@o6Q(3:L0>'0ݚ-pHh32\F?Ї:wȯϳ3wࡇ:-h24Fftel HR=:n=3Bk/:C.}2 (; |M `4kî::> 6QpF@~v -wS+{rY:w*%($u i( ;@j U3À'i `Cg :o2xf,c~6q?R 2Fwn;O㾀n3qH;GU;E  S|vRxi_]bt@D-踣3kK3ƹ6`Z;v+{@\u6G'Bu /e %Vͨp`mfmq-fנ: mzu~-x&83w;1V a`<틂@1]U꾫im" LMfӁh/Z/pw?PLz ^|&o_=l0-su #&`_L1TcN8ՋoK75ճ??C&97g, B 88tYXk 6 ] $선2Si vcʆ0_=g!Bf4xV:$W$(=+Dy:oTo |)Հ]u0QӾ.` `W,dOZ >l09nڻerkNYAץ xgPL,m vMߝȮ(, 8ݾ3*y;Lqp}iny]#80YJ"tz`/R-&k,W ๣ ς@N0>ԀӼ8h #y3&5_WПo&}tf~vs[bgc0daaH1yc٭*?L@ [)Y=tf`[<#Xj8У]C?? Yޕ\]}3}N :m7h64wݨ^>Agt|=g~]cߕ kNVaX 0-XuU,]$ٵQ]B0n ?>DիX ȮKw¸x@F ^΍qi[ vc5$m܎(иwmzȟb&cvN߱=mͣ-\BsCWF5TOF}tѰb ,=wX!T qS&kΝ߉>Y8,Lngr#LUp @@elhW pz^GpܡnxݵaE_5p(BNoh98F:7pQ;~#C GV{!4I+ hd4 1U4i0oj`~w?iJ Ne=|eD ph IC\<-x1.zՋF@4; }Lݘ5 /~O:D`T f G0%`Fs.*v4 $ 3 `T,;g6P3J)noW~gHG[̀@fH RApaa <ץT>VבےY}i}zf=S|Ww'LH? +`A_]~}*\=@n3tft+G_ϜS pDnkKG pᔙ`I_\6*Wbe#c@` jfF܄ [.D &W>N2@O U0{Gv40P ut@dMg`K,u ~cέ2uܹ"@*r P7 ưଞh8̹Dj\b[N@]%4qgVF/Ov:a0w?c1;癀X-x. k+] =0?T}*f%tꓥ5eZ +c ~{]&{ǨM K Z*t,t 8}#_W pa2+㮄V?S?0`ؒ {6WnkAl13tx6DEH\?#K?sȽ3+{>aB3UO&<ַhO>J)c  J QY Ϙ& I@`&cZΌZ؏E>= 32rPNc4n~_ N݀Ƌ*IA; gݻC}'9iIk0?/Fj {ufLs~\k8#i5-SwP;)͌'w;$}.MFѯ# (c5X 0яuJZN e s\*P`0t#ЀgU7LߕΖy~bP3*Ӱh#0 ;'g3/ \xP ԃNϯm.*?F"kw4+aLl&@#G{Ucj- RvTTXJ} }P8a3`0b`˝Q8r|BKտ {>`~1Z_fAg ÀV\]t4cKy4c~АSv2 r(?GftkWp# A#mj|Z"/e%p6%u_π2ΒrV DmD @߯@# z@SFQnw׮__: 6pCstU.gsOZZOːAx7B= IBe~.hOsXŗbg=Gk3?|1%Iq_1 2?t&`V/=S=# n~TQf)djA ;*dV%#{>{>[ƾp̯@6Wn_|dp}fRUH2FZDck;Иxiu{ 7 x7Sf}:ط8~ҷ1QGI{L ±_>a5p0~gZnT{X11g.<&PAC] @P T x?qNЎ[r!TL~Upn*(@ [=x>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllpppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppprrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ƀƀƀŀƀƀŀƀǀǀǀƀǀǀ̀ȀȀȀɀʀˀˀˀ̀̀΀πЀррӀԀՀրۀـڀۀ݀ހ߀ԀЀ̀ˀɀǀˀÀƄƄƄƄƄƄƄƄƄDŽDŽDŽDŽȄ̈́ȄȄɄɄʄʄ˄˄̄̈́΄΄τЄф҄ӄԄքۄׄلڄ܄݄ބ߄ۄՄ҄Є΄̄ʄDŽ˄ĄƆdžƆƆƆdžƆdžƆdždžȆdžȆ͆ȆɆɆɆʆʆˆˆ̆͆ΆΆφІццӆԆԆچ׆؆نچ܆݆ކ߆ن׆ֆӆцφ͆ˆɆˆĆ†LjLjLjLjLjLjLjLjLjȈȈȈȈȈ͈ȈɈɈʈʈˈˈˈ͈̈̈ΈψψЈш҈ӈԈوֈ׈؈ڈڈ܈݈ވ߈܈؈׈ՈӈЈΈ̈Ɉ͈ňÈȊȊNJNJNJNJNJNJNJȊȊȊȊȊΊɊȊʊɊʊʊˊˊˊ̊͊ΊΊΊЊъъҊӊ؊Պ֊׊؊يڊۊ݊݊ߊ؊֊ԊҊЊΊˊΊƊĊŠȎȎȎȎȎȎȎȎȎȎȎȎȎȎΎɎʎɎʎʎˎˎˎˎ͎̎ΎΎΎώЎююӎ؎ԎՎ֎׎؎ڎڎێ܎ݎގߎގՎӎюώ͎ώȎƎĎȐȐȐȐȐȐȐȐȐȐȐȐɐȐΐɐʐʐʐʐːːː̐̐͐͐ΐΐϐАѐѐҐאԐԐՐ֐אِؐڐېܐݐސߐݐݐސߐؐӐѐϐҐʐȐƐÐȒȒȒȒȒȒȒȒȒȒȒȒɒɒΒɒɒʒʒ˒˒˒˒̒̒̒͒ΒΒϒϒВђђגӒԒԒՒגגْؒڒڒܒܒݒޒߒݒܒܒܒݒԒђԒ̒˒ȒƒÒȔȔɔɔɔɔȔȔȔɔɔɔʔɔϔʔʔʔʔ˔˔˔˔͔̔̔̔ΔΔΔϔДєє֔ҔӔԔԔՔ֔ההٔٔڔ۔ܔݔݔߔܔڔڔ۔۔ܔՔϔ͔˔ȔƔÔΘΘΘΘΘΘΘΘΘΘΘΘϘϘјϘϘϘИИИИИјјҘҘҘҘӘԘԘԘ՘ט֘טטؘ٘٘ژۘܘܘݘݘߘߘޘߘߘޘޘޘݘژܘݘݘݘטԘҘИΘ̘ʘȘƘʘɚɚɚʚʚɚɚɚɚɚɚɚɚʚϚʚʚʚ˚˚˚˚˚˚͚͚̚̚ΚΚΚϚϚК՚њҚӚԚԚԚ՚֚ךךؚٚښښۚܚݚޚޚښۚۚۚۚښښښؚךךؚؚښКΚ̚ʚǚښʜʜʜʜʜʜʜʜ˜ʜʜʜʜʜМ˜˜˜˜˜˜˜̜̜̜͜͜͜ΜΜΜϜММ՜ќќҜӜԜԜԜ՜֜ללל؜ٜڜڜۜܜݜޜޜߜݜٜ؜؜؜ללל֜֜ל֜֜֜ללڜϜ̜ʜȜƜÜʞ˞ʞʞʞʞʞ˞˞˞ʞ˞ʞʞϞ˞˞˞˞˞˞˞̞̞̞̞͞͞ΞΞΞΞϞО՞ўўўҞӞӞԞԞ՞֞֞ממ؞ٞٞڞڞܞݞݞޞߞߞޞڞ؞מԞԞԞӞӞҞҞҞӞԞ՞՞֞֞ݞӞΞ˞ɞǞОˡˡˡˡˡˡˡˡˡˡˡˡˡˡСˡˡˡˡˡˡ̡̡̡͡͡͡ΡΡΡΡΡϡϡԡСѡѡѡҡӡӡԡԡաաססססء١ڡڡߡۡܡܡݡݡޡߡߡءסաաСѡССϡϡΡΡϡҡӡԡաաءϡ͡ʡȡơáˤˤˤˤˤˤˤˤˤˤˤˤˤˤФˤˤ̤̤̤ˤˤ̤̤̤ͤͤͤΤΤΤΤΤϤդФѤѤѤѤҤӤӤԤԤԤդ֤פפפؤؤ٤ݤڤڤۤܤݤݤݤޤݤߤޤݤդԤӤҤѤ̤̤ͤˤʤʤɤˤҤҤӤԤդ֤ؤΤ̤ɤǤŤ¤˦˦˦˦˦˦˦˦˦˦˦˦˦˦Ц˦˦̦̦̦̦̦̦ͦͦͦͦΦΦΦΦΦΦϦԦЦЦѦѦѦѦҦҦӦԦԦԦզզ֦֦צצئݦڦ٦ڦڦۦۦܦݦݦݦߦߦަݦܦ٦ӦҦЦԦ˦ɦȦǦǦƦƦŦǦЦѦҦҦӦԦݦҦͦ˦ɦƦĦ¦¦˨̨̨˨̨̨˨̨̨˨˨˨̨˨Ѩ˨˨̨̨̨̨̨ͨͨͨͨͨͨΨΨΨΨΨϨԨϨШѨѨѨѨҨҨӨӨԨԨԨԨը֨֨ררۨبب٨٨ڨڨڨܨܨۨݨݨݨܨۨڨըѨШӨͨȨŨĨĨ訨̨ШѨҨӨԨبߨШͨ˨ȨƨèŨ̪̪̪̪̪̪̪̪̪̪̪̪̪̪Ѫ̪̪̪̪ͪͪͪͪͪͪͪΪΪΪΪΪΪΪϪԪϪЪЪѪѪѪѪѪҪӪӪӪԪԪԪԪժ֪֪ڪתتתت٪٪٪ڪڪ۪ڪܪܪڪڪ٪٪ҪΪҪ̪˪ĪȪϪЪѪҪӪժتϪͪʪǪŪɪ̭̭̭̭̭̭̭̭̭̭ͭͭͭͭҭ̭̭̭̭ͭͭέͭͭͭέέέέέέέϭέԭϭϭЭЭѭѭѭѭҭѭҭӭԭԭԭԭԭխխ٭խ׭׭׭׭ح٭٭ڭڭ٭ڭڭڭ٭ح׭֭έѭ˭ʭɭƭέϭЭѭҭӭҭέ̭ɭͭĭ­ͰͰͰͰͰͰͰͰͰͰͰͰͰͰҰͰͰͰͰͰͰΰΰΰΰΰΰΰΰΰΰΰϰϰӰϰϰаааѰѰѰѰѰҰҰҰӰ԰԰԰԰԰ٰհհְװװװװذٰٰٰװٰذװװְհӰаʰɰȰ۰ͰΰϰаҰװذްϰͰаȰưðβͲͲͲͲͲͲͲͲͲͲͲͲͲҲβͲββͲͲͲββββββββββββԲвϲϲвввѲѲѲѲҲҲҲҲӲӲԲԲԲزԲղղֲֲֲײײزززӲԲײײֲղԲԲϲɲɲȲDzò̲ͲβϲղҲԲزԲ̲˲ȲŲò˴δδδδδδδδδδδδδҴδδδʹδδδδδδδδδδδδϴϴϴԴдддϴддѴѴѴѴѴѴҴҴҴӴӴӴԴشԴԴԴմմִִ״״״ִʹδִմԴԴӴҴѴ˴ȴǴƴŴ˴ʹδӴдѴԴҴδ̴ʴȴŴôöζζζζζζζζζζζζζҶζζζζζζζζζζζζζζζζζζ϶Զ϶϶϶жжжжѶѶѶѶѶѶҶҶҶҶҶҶ׶ӶӶԶԶԶննֶֶֶж˶˶϶ԶԶӶҶѶѶжɶƶƶŶĶʶ̶ҶζжѶӶڶ޶Ѷζ̶ɶǶͶʸθθθθθθθθθθθθӸθθθθθθθθθθθθθϸϸϸϸϸϸԸиииииѸѸѸѸѸѸѸѸѸҸѸҸҸҸ׸ӸӸӸӸԸԸԸոոӸʸɸʸʸҸӸҸѸѸиϸ͸ǸŸĸøĸŸѸ͸θϸѸӸոظи͸˸ɸƸøºκκκκκκκκκκκκӺκκκκκϺκκκκκκϺкϺϺϺϺϺԺϺкккѺкккѺѺѺѺѺѺѺѺҺҺҺ׺ӺӺӺӺӺԺԺԺԺʺȺȺȺȺ˺ҺѺѺкϺκκʺźĺúúúú˺̺κϺкҺԺӺϺͺʺǺĺºƾξϾϾϾϾξϾϾξϾξԾξξϾξϾξξξϾϾϾϾϾϾϾϾоооվϾооооооѾѾѾѾѾѾѾѾѾѾҾҾ־ҾҾӾҾӾԾԾԾ;ƾƾƾƾǾǾ;ѾоϾξξ;̾Ǿľþþ¾þ˾̾;ϾоѾԾܾݾоξ˾ɾž¾½¾¨ Ÿžœ›š™—–²»ļľĿģĝĜěěęęĘėĕĔĩƟƛƛƙƘƗƖƖƔƒƑơƺȻȼȽȿȿȿȾȿȿȿȺțȘȗȗȖȕȔȓȑȐȏțȺʻʼʼʾʿʿʾʾʾʽʼʽʽʾʿʷʗʖʕʔʓʓʒʐʏʎʍʕʹ̸̺̻̼̼̼̼̼̲̼̽̾̿̿̾̽̽̽̽̾̿̔̒̒̑̐̐̎̍̋̋̏̕κκλμνοξξνμλλλλκλλμνοΫΒΑΐΏΏΎ΍΋ΊΉΈΊηθйклмноппонмлкйййййклмнпппУАЎЎЍЌЋЋЉЈЇІЅбзҹҹҺһҼҽҾҿҿҾҽҼһҺҺҹҸҸҸҸҹҺһҼҾҿҿҾҝҎҍҌҊҊ҉҈҇҆҄҄҂ҨҶԸԸԹԻԼԼԽԾԿԿԾԽԽԻԺԺԹԹԸԸԸԸԸԹԺԻԼԿԿԾԽԼԚԋԋԊԈԈԈԆԄԃԂԁԀԝԷַָֹֺֻּּֽ־ַַַָָָֺֹֹֹֺֺֻֻֻּֽֿֿֿ־ֿֿ־ֻּּֽ֑։։ևևֆօքւցր~~~ַ֔طظظعغػػؽؽؾؿؿؾؽؽؼػغعظطططظظظععغغػؾؿؿؿؾؽؼؼػغؼؼ،؇؆؄؄؃؃؁؀~~~~~~}}}|||؍ظڸڸڸڸڹںڻڼڽڽھڿڿڽڽڼڻںڹڸڸڸڸڷڸڸڹڹڹںڻڻڼڿڿڿھڽڼڼڻںڹڹڽڸڈڄڃڂڂځځ~~~}}}}}}|||{{{zzzچڸܸܸܸܸܹܻܼܾܾܾܾܼܻܹܹܸܸܸܸܸܸܸܹܹܻܻܼܾܾܼܼܻܹܹܸܷܺܺܽܽܿܽܺܺܺܽܿܽܺܳ܃܃܁܀܀~~~|||{{{{{{zzzyyywww~~~ܸܺ޹޹޸޹޸޹޹޺޺޼޼޽޾޿޿޿޾޾޽޻޻޺޺޹޸޸޸޸޸޸޸޸޹޹޹޺޺޻޼޽޾޽޼޼޻޺޹޹޸޷޶޶ެހހ~~~}}}}}}{{{zzzyyyyyywwwvvvuuuxxx޳޹๹๹๹ุ๹๹๹๹຺໻໻༼ཽ྾࿿࿿࿿࿿࿿྾ཽཽ༼໻຺๹๹๹๹๹๹๹๹๹๹๹๹຺຺຺໻໻༼ཽཽ࿿྾༼໻຺๹๹ุ෷බබ൵෷त}}}}}}|||{{{{{{yyyxxxwwwvvvuuutttssstttம๹⹹⹹⹹⹹⹹⹹⺺⹹⹹⺺⺺⻻⻻⽽⽽⾾⾾⿿⿿⿿⾾⾾⾾⽽⼼⼼⻻⺺⹹⹹⹹⹹⹹⹹⹹⹹⹹⹹⹹⹹⹹⺺⺺⺺⻻⻻⼼⼼⽽⽽⺺⺺⹹⹹⸸ⷷⶶⶶ⵵ⴴⳳ⺺♙|||{{{zzzzzzyyyyyywwwvvvuuutttsssrrrqqqppp⡡⹹人人人人乹人乹乹人乹人人任似佽佽侾侾俿俿俿俿俿俿侾侾佽佽佽似任任任乹人人乹人人乹人乹人人人人乹乹人人任任似似佽佽俿侾乹乹丸䷷䶶䶶䵵䴴䳳䳳䲲俿䐐zzzyyyxxxxxxwwwvvvuuutttsssrrrqqqpppooonnn䔔人溺溺溺溺溺溺溺溺溺溺溺溺溺滻漼漼潽潽潽澾澾濿濿濿濿濿濿濿濿澾澾潽潽潽漼漼滻溺溺溺溺溺溺溺溺溺溺溺溺溺溺溺溺溺溺溺溺滻滻漼潽潽澾澾溺游混涶涶浵洴泳泳沲汱汱拋xxxwwwwwwvvvuuutttsssqqqqqqpppooonnnmmmlll扉溺躺躺躺躺躺躺軻躺躺躺躺躺躺軻軻軻輼輼輼载载载达达达迿迿迿迿迿迿迿迿迿迿达达达达载载輼輼輼軻軻躺躺軻躺躺躺躺躺躺躺躺躺躺躺軻躺躺躺躺躺躺軻軻輼輼载达达迿跷趶趶赵贴賳賳貲豱谰谰賳胃vvvuuuuuussssssrrrpppoooooonnnmmmlllkkkjjj耀軻麺黻黻麺麺黻黻麺麺麺麺黻黻黻黻黻黻黻鼼鼼鼼鼼齽齽齽龾龾龾齽龾龾龾龾龾龾龾齽齽齽鼼鼼鼼鼼黻黻黻麺黻黻黻麺黻麺麺黻黻黻麺麺麺黻麺麺黻麺黻麺黻黻黻鼼齽齽齽龾龾麺鶶鵵鴴鳳鳳鲲鱱鰰鰰鯯鮮鶶鼼{{{sssssssssrrrqqqpppooonnnmmmlllkkkjjjiiihhhxxx鿿黻껻껻껻껻껻껻껻껻껻껻껻껻껻껻껻껻껻껻껻껻껻꼼꼼꼼꼼꼼꽽꽽꽽꽽꽽꽽꽽꽽꽽꽽꼼꼼꼼꼼껻껻껻껻껻껻껻껻껻껻껻껻껻껻껻껻껻껻껻껻껻껻껻껻껻껻껻껻껻껻꼼꼼꽽꾾꾾꿿꿿굵괴곳곳겲걱갰갰꯯ꮮ꭭ꬬ꼼길vvvqqqrrrppppppooonnnmmmlllkkkjjjiiihhhgggfffooo궶쳳쳳첲챱찰찰쯯쮮쭭쭭쬬쫫쵵qqqoooooonnnnnnmmmllljjjjjjiiihhhgggfffeeedddhhh찰켼輼nnnnnnnnnlllllljjjiiihhhhhhgggfffeeedddcccbbbccc漼ּ𼼼𼼼𼼼𼼼𼼼𼼼𼼼𼼼𻻻𼼼𼼼𼼼𼼼𼼼𼼼𼼼𼼼𼼼𼼼𼼼𼼼𼼼𻻻𼼼𻻻𼼼𼼼𼼼𼼼𼼼𼼼𻻻𼼼𼼼𼼼𼼼𼼼𼼼𼼼𼼼𼼼𼼼𼼼𼼼𼼼𼼼𼼼𼼼𻻻𼼼𼼼𼼼𼼼𼼼𼼼𼼼𼼼𼼼𼼼𼼼𼼼𼼼𼼼𼼼𼼼𼼼𼼼𼼼𼼼𼼼𽽽𽽽𽽽𾾾𾾾𿿿𱱱𰰰𰰰𯯯𮮮𭭭𭭭𬬬𫫫𪪪𪪪𩩩𲲲𞞞llllllllljjjjjjiiihhhgggfffeeedddcccbbbaaa``````𙙙ּ񼼼񼼼񼼼񼼼񼼼񼼼񼼼񼼼񼼼񼼼񼼼񼼼񼼼񼼼񼼼񼼼񼼼񼼼񼼼񼼼񼼼񼼼񼼼񼼼񼼼񼼼񼼼񼼼񼼼񼼼񼼼񼼼񼼼񼼼񼼼񼼼񼼼񼼼񼼼񼼼񼼼񼼼񼼼񼼼񼼼񼼼񼼼񼼼񼼼񼼼񼼼񼼼񼼼񼼼񼼼񼼼񼼼񼼼񼼼񼼼񼼼񼼼񼼼񼼼񼼼񼼼񼼼񼼼񼼼񽽽񽽽񽽽񾾾񾾾񿿿񿿿񸸸񰰰񯯯񮮮񭭭񭭭񬬬񫫫񪪪񪪪񩩩񨨨񨨨񸸸񑑑jjjjjjiiiiiihhhgggfffeeedddcccbbbaaa``````___^^^񊊊ȳ{򼼼򼼼򼼼򼼼򼼼򽽽򼼼򽽽򼼼򼼼򼼼򼼼򼼼򼼼򼼼򼼼򼼼򼼼򽽽򽽽򽽽򼼼򼼼򼼼򼼼򼼼򼼼򼼼򼼼򽽽򼼼򼼼򼼼򽽽򽽽򼼼򼼼򽽽򼼼򼼼򼼼򼼼򼼼򼼼򼼼򼼼򼼼򼼼򼼼򽽽򼼼򼼼򼼼򼼼򼼼򽽽򼼼򽽽򼼼򽽽򼼼򽽽򽽽򼼼򽽽򽽽򼼼򼼼򼼼򽽽򽽽򽽽򽽽򾾾򿿿򿿿򰰰򮮮򭭭򭭭򬬬򫫫򪪪򪪪򩩩򨨨򨨨򧧧򧧧򿿿򆆆iiiiiiggggggfffeeedddcccbbbaaa``````___^^^]]]\\\~~~{2ggggggfffeeedddcccbbbaaa``````___^^^]]]\\\[[[[[[___2Ƚvvvfffeeedddcccbbbaaa``````___^^^]]]\\\[[[[[[ZZZRmmmdddccccccaaa``````___^^^]]]\\\[[[[[[ZZZYYYShhhbbbbbb```______^^^]]]\\\[[[[[[ZZZYYYYYY徾ccc```______^^^]]]\\\[[[[[[ZZZYYYYYY9񾾾```___^^^]]]\\\[[[[[[ZZZYYYYYY91߾^^^]]]\\\[[[[[[ZZZYYYYYY1\\\[[[[[[ZZZYYYYYYSξZZZZZZYYYV6ԿɹƁ^^^6?(`      """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((('************************************************************************************************------------------------------------------------------------------------------------------------00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000/222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888887;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDCGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]````````````````````````````````````````````````````````````````````````````````````````````````dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddcgggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggfjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqpttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ƁƁŁŁŁŁƁǁƁǁ́ǁȁɁʁʁˁ́́΁ρсҁӁՁځ؁ځ܁݁߁ҁρ́ɁʁÁƄƄƄƄƄƄƄDŽDŽDŽ̄ȄȄɄɄʄ˄˄̈́΄τЄфӄԄلׄ؄ڄ܄݄߄ۅՅ҅Ѕͅʅ˅ąLjLjLjLjLjLjLjLjLjLj̈ȈɈɈʈʈˈˈ͈̈ΈЈЈ҈ӈ׈ֈ׈وڈ܈݈߈و׈ԈшΈˈ̈ňˆNjNjNjNjNjNjNjNjȋȋ̋ȋɋɋʋʋˋˋ̋͋͋ϋЋЋҋ׋Ջ֋׋ًڋ܋݋ދߋ֋ӋЋ͋΋NjċǎǎǎǎǎǎǎȎȎȎ̎ȎɎʎʎʎˎˎ͎͎̎ΎώЎю֎ԎՎ֎׎َڎێݎގߎߏ؏ҏϏЏʏƏÏȒȒȒȒȒȒȒȒȒɒ͒ɒʒʒʒʒ˒˒̒͒͒ΒϒВђՒӒԒՒ֒גْڒےܒݒޒޒܒܒߒҒӒ̒ɒƒÒȕȕȕɕɕȕȕȕȕɕ͕ɕʕʕʕ˕˕˕͕͕̕ΕΕϕЕԕҕӕԕՕ֕וٕؕڕەܕݕߕܕڕڕەݕЕ͕ʕǕÕ͘͘͘͘͘͘͘͘͘͘ИΘΘΘΘΘϘϘИИјјҘӘӘ֘Ԙ՘טטؘ٘ژۘܘݘݘޘߘߙܙݙܙܙۙۙۙۙܙיљϙ˙əƙÙʛʛʛʛʛʛʛʛʛʛΛʛʛʛʛ˛˛˛̛͛͛͛ΛΛЛӛЛћқӛԛ՛֛ככ؛ٛڛۛܛޛߛۜ؜؜؜לל֜֜֜֜לݜϜ˜ɜƜœʟʟʟʟʟʟʟʟʟʟΟʟ˟ʟʟ˟˟˟̟̟͟͟ΟΟϟӟППџҟӟԟԟ՟֟ן؟ٟٟڟޟܟݟޟߟߟޟ؟ןԟӟӟҟҟџҟӟ՟֟؟؟͟ʟǟğʢʢʢʢʢʢʢʢʢʢ΢ʢˢˢˢˢ̢̢̢͢͢͢΢΢ϢӢТТѢҢӢӢԢԢբ֢עעآ٢ݢڢۢܢݢݢޢߢޢآբӢѢ΢΢̢̢͢͢ҢӢԢբҢ̢ɢƢ¢˥˥˥˥˥˥˥˥˥˥ϥʥ˥˥̥̥̥̥̥ͥͥͥͥΥΥҥϥХХѥѥҥӥӥԥե֥֥ץץۥ٥٥ڥۥܥܥݥޥߥޥݥۥӥҥӥ̥ɥȥǥǥƥȥХҥӥԥܥޥΥ˥ǥĥ˩˩˩˩˩̩˩˩˩˩ϩ˩˩̩̩̩̩ͩͩͩͩͩΩΩΩөϩЩЩЩѩѩҩөөԩԩթ֩֩کةة٩٩ک۩۩۩ݩܩ۩کשЩөͩǩĩé©©̩Щҩө֩ةͩʩǩéũ̬̬̬̬̬̬̬̬̬̬Ь̬̬̬̬ͬͬͬͬͬͬͬάάάҬϬЬЬЬѬѬҬҬӬӬӬԬԬլج֬׬׬ج٬٬ڬڬڬ۬ڬ٬جӬѬ̬ʬ¬ɬϬЬҬԬӬ̬ɬʬì̯̯̯̯̯̯ͯͯͯͯЯ̯̯ͯͯͯͯͯͯͯͯίίίίүϯϯЯЯЯѯѯѯүӯӯӯԯԯׯկ֯֯֯ׯׯٯٯدددׯ֯կѯ˯ɯǯƯίϯѯ֯ܯޯίϯȯů¯ͲͲͲͲͲͲͲͲͲͲѲͲͲͲͲͲͲͲͲͲͲββββҲϲϲϲвввѲѲѲҲҲӲӲӲײԲԲղֲֲײײײղѲײֲղԲҲʲȲDzIJͲβӲѲֲڲβ˲DzIJɵ͵͵͵͵͵͵͵͵͵ѵ͵͵͵͵͵͵͵εεεεεεεҵϵϵеееееѵѵѵҵҵҵӵֵӵӵԵԵյֵֵֵϵ̵ӵԵӵӵѵϵȵƵŵ̵ѵϵѵԵҵ͵ʵǵõ͸͸͸͸θ͸͸͸͸Ѹ͸͸͸θ͸θ͸θθθθθϸθӸϸϸϸиииииѸѸѸѸҸҸոӸӸӸԸԸԸոѸʸʸ̸ӸӸѸиϸ˸Ƹĸøθ͸θиӸ޸ݸи̸ɸŸ¸ǻλλλλλλλλһλλλλλλλλλϻϻϻϻϻӻϻлллллллѻѻѻѻѻһջһһӻӻӻӻӻȻȻȻȻλѻлϻλͻȻĻûûȻ̻λлһػ׻λ˻ǻĻ˾ϾϾϾξϾϾξҾϾϾϾϾξξϾϾϾϾϾϾϾϾӾооооооооооѾѾѾѾվҾҾҾҾӾӾ˾ƿſſƿȿϿϿοͿ̿˿ſÿ¿¿ǿ̿ͿϿѿտҿͿɿžĽľĭĝěěęĘėĔęĽĿȧȚȘȗȖȕȓȑȔȽǺʻʼʾʾʾʾʽʽʾʿʢʖʕʔʓʒʐʎʐʳʹͺͼͽͿͿ;ͼͼͻͻͼͽ;Ϳ͓͒͑͐͝͏͌͋͋ͨ͸клмопϿϽϼϺϺккклмопмЖАЏЎЍЋЉЈЇУϸҹҺһҽҾҿҿҽҼһҺҹҹҸҸҺһҼҿҿҿҷґҍҌҊҊ҈҆҅҄ҜҷոչջռսվտտվռջպչոշոոչչջտտտվռվշՎՊՉՈՇՅՃՂՁՐշطظغػؼؽؾؿ׾׾׼׻׺׹׸׷طظظععغؾؿؿؾؼؼغح؉؇؆؄؄؂؀}}}؊ؿ׷ڷڸڹںڻڼڽھڿڿھڼڻںڹڸڷڷڸڸڹڹڹںڼڿڿڿھڼڼںڹڹڥڅڄڃڂځ~~~}}}|||{{{ڄںڸݸݸݸݹݺݻݼݽݾݿݿݾݼݻݺݹݸݸݸݸݸݸݹݹݹݺݼݽݿݾݼݼݺݹݹݸݹݟ݂݁݀~~~}}}{{{zzzyyywww{{{ݲݸ๹ุุ๹๹๹໻༼ཽ྾࿿߿߿߾߽߻ߺ߹߹߸߸߸߸ุุ๹๹຺຺༼ཽ྾༼༼຺๹๹ุබ൵໻~~~}}}|||zzzyyywwwvvvuuuwww୭߹⹹⹹⹹⹹⹹⹹⺺⺺⻻⽽⽽⾾⿿⿿⿿⾾⾾⼼⼼⺺⹹⹹⹹⹹⹹⹹⹹⹹⹹⹹⺺⺺⻻⼼⼼⽽⿿⿿⺺⹹⹹⸸ⶶ⵵ⴴⳳ⾾⍍|||{{{zzzyyywwwvvvuuusssrrrsss⡡⹹人人人乹乹乹乹乹人任似佽侾侾俿俿俿俿俿侾佽佽似任任俿乹乹乹乹乹乹乹人人人乹人人任似似佽侾任乹丸䶶䵵䴴䳳䲲䳳俿䈈yyyxxxwwwvvvtttsssrrrpppooonnn䕕人纺纺纺纺纺纺纺纺纺翿绻绻缼缼罽罽羾羾翿翿翿翿濿濿濿濿濿澾澾澾潽潽漼滻滻溺溺濿溺溺溺溺溺溺溺溺纺纺纺纺纺绻缼缼罽羾翿縸綶絵紴糳粲籱簰絵缼炂vvvvvvtttsssqqqpppooonnnllllll狋溺麺麺麺麺麺麺麺麺黻鿿黻黻黻黻鼼鼼鼼齽齽龾龾龾龾龾龾龾龾齽齽齽鼼鼼鼼黻黻麺麺麺鿿麺麺麺麺麺麺麺麺麺麺麺麺麺黻鼼齽齽龾鿿黻鵵鴴鳳鲲鱱鰰鯯鯯鷷鶶xxxtttsssrrrpppooonnnlllkkkjjjhhh遁麺뻻뻻뺺뻻뻻뻻뺺뺺뻻뻻뻻뻻뻻뻻뻻뻻뼼뼼뼼뼼뽽뽽뽽뽽뽽뼼뼼뼼뼼뻻뻻뻻뻻뻻뻻뻻뻻뻻뺺뻻뻻뻻뻻뻻뻻뻻뻻뻻뻻뻻뻻뼼뼼뽽뾾뿿붶볳벲뱱배믯믯뭭묬뻻배uuuqqqpppooonnnlllkkkjjjhhhgggfffvvv뺺qqqnnnmmmlllkkkiiihhhgggfffeeedddppp뻻߻ﻻﻻﻻﻻﻻﻻﻻﻻﻻﻻﻻ\\\\ﻻﻻﻻ\\ﻻﻻﻻﻻﻻﻻﻻﻻﻻﻻﻻﻻﻻﻻﻻﻻﻻﻻﻻﻻﻻﻻﻻ\\\\ﻻ\\\ススᄒᄒ￿ﷷﰰﯯﯯﭭﭭשּׁ着響ﮮllllllkkkjjjhhhgggfffeeedddbbbaaahhhﮮ߼񼼼񼼼񼼼񼼼񼼼񼼼񼼼񼼼񼼼񼼼񼼼񼼼񼼼񼼼񼼼񼼼񼼼񼼼񼼼񼼼񼼼񼼼񼼼񼼼񼼼񼼼񼼼񼼼񼼼񼼼񼼼񼼼񼼼񼼼񼼼񼼼񼼼񼼼񼼼񼼼񼼼񼼼񼼼񼼼񼼼񼼼񼼼񼼼񼼼񼼼񼼼񽽽񽽽񾾾񿿿񿿿񰰰񯯯񭭭񭭭񬬬񪪪񩩩񩩩񨨨񱱱񒒒jjjiiihhhgggfffddddddbbbaaa```___bbb񟟟ǻ󼼼󼼼󼼼󼼼󼼼󼼼󼼼󼼼󼼼󼼼󼼼󼼼󼼼󼼼󽽽󼼼󼼼󼼼󼼼󼼼󼼼󼼼󼼼󼼼󼼼󼼼󼼼󼼼󼼼󼼼󼼼󼼼󼼼󼼼󼼼󼼼󼼼󼼼󼼼󼼼󼼼󼼼󼼼󼼼󼼼󽽽󼼼󽽽󼼼󼼼󽽽󽽽󽽽󾾾󾾾󿿿󹹹󭭭󭭭󬬬󪪪󩩩󩩩󨨨󧧧󦦦󷷷󊊊hhhgggfffdddcccbbbaaa```___^^^]]]___󈈈2fffdddcccbbbaaa```___^^^]]][[[ZZZZZZ2uuucccbbbaaa```___^^^]]][[[ZZZYYYXXX%ཽoooaaa```___^^^]]][[[ZZZYYYYYY%Ghhh___]]]]]][[[ZZZYYYYYYG@߾bbb\\\[[[ZZZYYYYYY@%^^^ZZZYYYYYY%4þÈYYY5YYY(@   """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&****************************************************************................................................................22222222222222222222222222222222222222222222222222222222222222226666666666666666666666666666666666666666666666666666666666666666::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ________________________________________________________________ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiinnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}ƂƂƂƂǂǂǂʂȂɂʂ˂͂ςтӂՂقڂ݂߂߂т͂ȂǂLJLJLJLJLJLJLJˇɇʇˇˇ͇·Їчԇ؇؇ڇ݇߇ׇӇ·ʇȇȌnjnjnjnjȌȌˌɌʌʌˌ͌ΌόЌҌ֌֌،ڌ܌ތ׌ь͌ˌČȑȑȑȑȑȑɑˑʑʑˑˑ̑͑ΑБёՑԑ֑ؑڑܑݑߑߑݑёϑȑÑ˖˖˖˖˖˖̖Ζ̖͖͖ΖϖЖЖіӖՖՖ֖ؖږۖݖޖۖܖޖٖϖ˖Ɩ–ʛʛʛʛʛʛʛ͛ʛ˛˛˛̛͛ΛΛЛӛқӛԛ֛כ؛ڛۛݛߛڛٛ؛؛ככ؛ћʛśʠʠʠʠˠʠʠ͠ˠˠˠ̠̠͠ΠΠϠҠѠҠӠԠՠנؠ٠ڠޠݠޠߠܠנӠҠѠРѠԠՠߠݠ̠Ǡàˤˤˤˤˤˤˤͤˤ̤̤̤̤ͤΤΤΤҤФѤҤӤԤդ֤פؤۤڤۤܤݤߤߤݤդҤϤʤɤȤʤѤӤ٤դʤŤ˪̪̪̪̪˪̪Ϊ̪̪ͪͪͪͪΪΪΪѪЪѪѪҪӪԪԪժ֪٪ت٪ڪ۪۪ܪ۪تЪϪǪªΪѪԪϪɪĪê̮̮̮ͮͮͮͮϮ̮̮ͮͮͮήήήήѮϮЮѮѮҮӮӮԮԮ׮֮׮خٮٮٮٮ׮ӮͮɮˮϮҮܮ̮ʮîͳͳͳͳͳͳͳгͳͳͳγγγγγγҳϳггѳѳҳҳӳӳֳԳճֳ׳׳гֳճӳͳȳųƳγӳٳֳ˳Ƴ³ƸθθθθθθиθθθθθθθθϸѸϸииѸѸѸҸҸҸոӸԸԸոиʸиӸѸиɸŸ¸ϸϸԸиʸŸ̼μμμμμѼμμμμμμϼϼϼҼммммѼѼѼѼҼԼҼӼԼҼȼǼȼммμ̼żü̼ϼҼܼͼȼ¼ŻŝŚŘŗŔũźʼʿʾʾʾʾʴʗʕʔʒʏʡʹλνοξμλλμνέΒΑΏ΍ΊΗθҺҼҾҾҼҺҹҹҹһҽҿҥҎҌҊ҈҆ҏҷֹֻּ־־ַַָֺֹֹֻּֽֽֿ֟֊ևֆփցֆַּڸڹڻڽھڿڼڻڹڸڷڸڹڹںڿڿڽڼںڽڔڄڃځ~~~}}}ڶڸ޸޸޹޻޼޾޿޾޻޹޸޸޸޸޹޹޺޿޽޽޼޺޹޷޿ތހ~~~}}}zzzxxxxxxެ޹⹹⹹⹹⹹⺺⼼⾾⿿⿿⾾⽽⼼⾾⹹⹹⹹⹹⹹⹹⹹⺺⻻⿿⽽⿿⽽⺺⹹ⷷ⵵⵵⽽℄|||zzzxxxvvvtttrrr⢢⹹人人乹乹乹人侾似佽侾俿俿俿俿侾佽似任人佽人乹乹乹人人乹人任俿佽侾乹䷷䵵䴴䲲䴴丸}}}xxxvvvtttrrrpppnnn䕕人躺躺躺躺躺躺达軻軻輼载载达达达达达达载载輼軻軻躺躺达躺躺躺躺躺躺躺躺軻迿载达迿载赵贴貲豱误跷貲vvvtttrrrooonnnllljjj艉达쾾쾾쾾쾾쾾쾾쾾쾾쾾쿿쿿쿿쿿쿿쿿쾾쾾쾾쾾쾾쾾쾾쾾쾾쾾쾾쾾쾾쿿췷첲챱쯯쮮쬬켼쬬qqqooonnnkkkjjjhhhfff|||켼绻mmmkkkiiihhhfffdddbbbrrr漼ļ򼼼򼼼򼼼򼼼򼼼򿿿򼼼򼼼򼼼򼼼򼼼򼼼򼼼򼼼򼼼򿿿򼼼򼼼򼼼򼼼򼼼򼼼򼼼򼼼򼼼򿿿򼼼򼼼򼼼򼼼򼼼򼼼򼼼򼼼򼼼򽽽򾾾򿿿򶶶򮮮򭭭򫫫򩩩򨨨򫫫򒒒iiihhhfffdddbbb```___hhh򳳳Ľ|􈈈fffdddbbb```___]]][[[[[[|罽|||bbb```___]]][[[ZZZYYYOsss___]]][[[ZZZYYYOJ쾾hhh[[[ZZZYYYJͿﴴ[[[YYY(0`  !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&++++++++++++++++++++++++++++++++++++++++++++++++111111111111111111111111111111111111111111111111666666666666666666666666666666666666666666666666<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>NNNNNNNNNNNNNNNNccccccccccccccccuuuuuuuuuuuuuuuu~~~}}}~~~wwwwwwʝzzzqqqlllõôôîìëñôÙlllkkkhhhuuuëö÷ոշշհժըթշպՌhhheeeaaaggg՗պ㻻㺺㺺㴴㨨㦦㤤㲲㻻㳳}}}aaa```\\\___㽽⾾󽽽򽽽򻻻򩩩򤤤򢢢򤤤򹹹򾾾򹹹nnn\\\ZZZXXX徾r达bbbXXXUUU|AAAAAAAAAAAAAAAADisplayCAL-3.1.0.0/DisplayCAL/theme/icons/DisplayCAL-VRML-to-X3D-converter.icns0000644000076500000000000035121212647526530026254 0ustar devwheel00000000000000icnsҊic08 jP ftypjp2 jp2 Ojp2hihdrcolr"cdefԎjp2cOQ2R \@@HHPHHPHHPHHPHHP +S ]@@HHPHHPHHPHHPHHPS ]@@HHPHHPHHPHHPHHPS ]@@HHPHHPHHPHHPHHPzK =}l2}`fO_)(CYx\ KAQtQC[2KCmy1(%ua ]683,"YnY粘rQp#wŧxm[ez$ĽŎx[p]r qrcRaɲo]I@<ucci-}"yP%Eyk%b:;ƃE`A-5Nzu<ϼ} O|(:fc-:|Q! XJ7H{A[KǙz*ɼIC_ՊN#f&;^rbE["|2mNQ"QsGROԥ̔iȲD偸+ Wt۶ZH4kϼ>>@/ "' Qm=Uf~(̀Oܧ6)~Yfp roܘ"`E"&O<*\+t-($qH_ %%m.!sCJ˫N/ \{;1-2v#hg|bDd(q88sGߔ`@xzl 4\?Ͼ}) =!+u^Td'h%lнJb/kД^bm+?" >~UfXq&ƲڼO0PLg-6XKdUzkXH=0EkXw]SYl'gfWQV;Bd3'WhņHV`_pW)Vd=}cb@ogLKNpM4^ChI*ZM1|W[I2[O%唦k.PtU7o`5hK.} 笫YY5:ȿ7+Z `zH#r&DNikd `xyN`c :QB6 2Gq5+U'4nIc[Q~3 sP(q?'YcEge1eHD_*78=? ȷۙԖ: )4e~GRhE$Kr<&QP""u?N>F^yv*lT=B"2xyn~_w E>U(E1}.PݹgϷAyF,b>꣝UD\|ց;8ʤ)̚{nrG˴b^.K]SszVNfU|FWm}rxr*YJM;[H^n? Hϼn}qsw=N#j)* e6oL|%}>C_G^C\:✷C>d``yẐv{:8$MA7]ȑbIq*YUDx/9kCEdW% '՗vZLtϵ:$GۡrCB>kT&'cN& d,<̚ .@ gd< hPQ+Qï qkyf69B :*-uny.aÄS 6CFVnA03FShP|`6p&:0|z4ކnOf},$kp>:czIi:70vB>&}Rqq $b"jʟAڠ}}mK_HQ#vB;čJ'(LڀպûH;t;끩.F6߅M$YiKMp(>*ϫ'qAIad0R"=@4 GAƭ_2Wv~+?tl>dgҦ6pյɠW-q?yhWs{^ʜIۀֶm_4;m Exj1p`+Bhkc k0A _)خu%(+aSw[o״PS`JVǛĬ,V(qwPŮMě쫛}b?,S/W4=s1i/QqM9Vm*BW:zH$)6ܫ`s &\+'9eWKRg!­ YF[Q*-͵CJ!|aw)ylȷi 1&d #o埇 ]Bzt5mMNbGj[ԧ4K$NTK ye|H;6Hy&V!k2h3 QaB56q)^ȏ:պ"m"Pom.ћӂ;L a(v")<6~&2h2N;*}U}~;[.a{YG;oǸ1˙+do#ˆAk1_1s$9AP-lP |f i?iqTJ0OiC/[.}H}E׊61ڱ\)47+(O2v` (+gA1RqNQP(჈c%Y3a LFRYGdb !" nT)Wrf5^E?;Jۻ>ݫoK}3|%d[_#ע <(֦ gD߱<8AS$UZjmRhaJcpDSq>e8Bx3ǐ_?:߃2ԓ'֕scBY Ar.)&:h2S[OQ9d!(ΌcJAE_4N,x&+ GR|9sM`T&ǹIho|h2fo<YF7p[:j゚ !QvBhojUAѫΓj* ȭ݂pK mmaB`J{0Ca?ҖC u =#焆m, @?ܦ;٢i}UuFգ']ر^$.KѠktwt 2KhH~-eRؘ>Ғ)M_eAˢ=C@Ugf$D8^,"qqB`e?&^XIKQ+ cB BiuiscoQ5z .1ȹtTg(Y၂S7^"b>Bv*-KJApO &q;տgtϽa 9J#7 K&n"( !_Oޑv><&`2*d*rrg;&y^jpުK5Yom?dCi%]AOŢes5G tqeU#O^bܢ/RDlfm 1RAwW x5P]FK֯ףhbc'_. fI*m6+EMʬߌFx+b8{%121)L#Ç Ucsm2<7IT(2 m&UGM*?m\d!]ѩ =R_Q1ƙQFR5{YgWd2 {Ev OM*p{TQr}5!ZE3/n 1Kg6RD pnx6G~mu_ϼ}3 PA=ڀLpS 5[R!I\CE]o|3l$/®vQ0)u^6/<$KJ;2jt(_gm ? wʖ;ٜW&E\?@wirFWaWUQb[0"Ek2fGC?R}g_c/uyIK!vU_ c U b0O (8c\"܌*|;H ѡkokE2B7v2*mum,~33U˸rcU),+UM-liJ|MdǗYdOD]Ygl|nϖ;,.UȺn:zy7tsov__#1]% {&Mw+Qӆ_VwAPbжDܦR,?`hB,LBβ*W^$6y5JʈcPyF(H-UN|QZ.}[Ѽ=Ʌ2cEaSK'&(fS`iBiμlc O3;U:tpy%ѤEJ@F<ӺYp.; < 0la%6 0cI yjZ^۞vHz?q`uF /w>iTQ8㑑ӵYI]__o.S:_A"rp1bNk~Dߒmi@B=E* w G7ҥ]!̅ ՅڨT>uH' DDM ciûwT³: l %7" eʎҖ~f jBrs$qx'_Q5D'@..aa[$)&^7j H5q-BX&t71#15=JRqr|9wۺ%ޏQUR3_~U:dGևl ]sd*T~/l gjw` *)i0˪U"Qg0Hչ 8jhW|oq${Ɇa.G>2PCcla[)|"aߏ4~6AU*~Ya Rq܊,YvZKqODdC 6tzyBjse5brOQ ]33, _C?D1Uw.D\rK߯_0m*w[]3=B GBfFJO`N05`šO.doq}ckmDNF܏'VQWB?>\Kև%ݾ^&Gv1Os/Q,h;nܺ;};rIU<ҶLkл$`܈FFpqI%l-@dA(?9B}?T<Q{_'ޘGt-BXpv;^W5onjHC*z)mZgdim6˦H7V{ԔFe_GZF8".TmxL\-o!_t\ht}8±C ߻x\SQǁ0-㬚?Nmi|h߶)-O}[YUϐC'"1'ڽz@0,ݠ_+^Гe/-Ⱦ$ 66`Y~\AOPsȐL$^hMKW#E? ST-%# ]}lZZ>j;qv:Sv[$ǢbBUl_6 tcNaX61_pWYrۢ +栣 A \W8G{b٫r҆RZ{4[B_-nC{XB]f-:W|۱aOX\ cʤTzSZ{t844%Yz$;ElW:>3flð}MVD+Zz[|:|7f4 ۨ҆^`୅">`Xϔ'KKso/UN$|;6pz.:.; iXKߎC3&]% zոv7 N7S"pQ>WIo,>Nf-e%J0lO(]JAczE fF:-&O ߺۄ#++X'Rz3N~Xd1ʯ!8\"-P^9FR_WT#X$ v>Xs.g"scBfWI1n蟘SdV3ViXo2Ţsci e05k.WW2M ]:B*Y!}dZ4R.{*+p;6V"YwQ˳ pZa[q0Z>ӗUi]뉅M|vb :tse xw2O3֔j6zX2#f57cDW2$N^t*z/+I"%i30u,=v5qz^$NF7PoL\^R VIO}z+ ^:y]wݮ_I5:qC7Õ&q>KAtPD,$s-6Wwibps|,mNf<[W:ǣѺht8aZ;n ETv|>SCbqIQ=P,rƱS iͱ$=0 AGg*5a  bכUCy=V13hk5?3*%e $ cIe CsZ0ҐB`tzJ](Y=\NF$HCoYMZ]O }D4D|s4gRg鱅(Z7 S:G^OκF t0cKCUFvwQ/IؤA(X28 assoCTO{+9r@ɦNu5xǞQj/!gmJ}Υ!6Zu_*Ea&BF?2>a QԤUX,|H7uK ˺9MA#Qۡk!k4mnڞFaR*l@ bp7< G)_"[emO؝qܔ}xjw߆rpO,)Wj" U9>JsY[\ N~]'8^,§Efc~b`F cGw͛EMIJ!]S9GZj6'{j1pfP&F"N*W=R%L0h΀priWJN_@ . 8-!6sJ2>W!C IMfsNQGV?B*3*uIP7~ #nILi "+Pnv:T&TN\caٓis+3ƫJܚ[PU[DOXS@xCxޑCY'117Wtch YE@ӟ?UKl|P1T3Q5RתG(Qr.e=)9w󇶗@kfމۺYzT(i05 wCݏ}:ԚS~7҆PzqQ $|Dvɘr f}%}`(-|jĹ9oπVȨRϥs/,_%^D $f"ٷ(C?9ڰbkK4r"·hfy$Wnر,4Ե':)<7zh!cPQM?xiFL.M^z"5A9MgׁtJ`@Rdc (Pl=IL$X驤оSO73 p:>Yn-͢f!SDt ь%㿴-Q$ܱӜAvMqfz,>o?\F%0nu@CdofFeG= 8 V>@T@.,{ֆKo$Εvl3t%o"Mr6y_*V͑-Ս aqs?00%C!%5Ŋ^|`F o5 9Η.eU7x~)K]G;؉)b, Yy9u>6%D-P_7U;g?Sp~L-y2㨓:SR({ lȤ`o|@`!@4!g5)^^j 'k\Fl ]Crf?%[Y#r,_"98 MؗJ9>_:#F"єNo } xT+<_ʼEgLbuqoWN;F:N b ]7q0zFt]d$ȮH6 ,JFQ?c֤zdqrݽ7YpGCZxpJ=CphF>P(}{<~-ģ<XIDDg٩Ћu ;c]òZ G cW9]S:цqwLVrcqY qKFĜD6żsMLaiͬiC2kA}q-z,o:vpy3~zyY/qbTPp sh~'&ݤ" h6]44 , /CS/+XL NwnrGz1#wkoz(Bn*W-י'Hx)!{nϯޘ#X2a5|K'ѷe҈6N|δ+J(|Sv2#YЈ~"5|repMWVzrF>e/ٵ|${U'#oǷ1(ԣ@NHx'~$L JxF6ɏXs|JZ3慝PVI3H.ͽ|anP6Z!J ^U4:1&QGC~硙,m.AHT?3-i ñeFEq(E=OBTn 䏤ӭv:/Vʕ/)A<=kz:DۅE\l|pbuaދ;^ex+ѣP*nr"m㴝! n!$-v.d Rn㾚8o_`3--evT8ӔK NMlJ+30bڥv-wEo 2e ; jsN%fa .s7$6F-0;jy/i3]$Vީ_E<%Jw@~6x> صN<H2λPy;DWc תfضۖE=}z>RDr"p,RԤ&(2B\3p]HNį߯1KOo=Ygn*.+u/ Ýr_6Wvuɕ9e]2޳s߬<M"]X!J RjYjt3=sh y2B|%xВW},^ cSPbT&狋QGdn7XdԴ7MqyHIŒMG.#`\"y̨Γhc_/Iw9تHvvRh(0ЅD՟QU|J DH81_nFeXٱ=MStLegף4M7o1GAޝ?B9!mM?f,gƨGgf;jWr  KzB5 .r|ӓ 5^e" V>Sd:20RfVF%Qi5@ ݯ7w﹀/6UK%r ^ Bej?\:]zY<Z߯&~q>?,p~m]i}5isu/ApWx:|ʹH ql[EeGzz 0wc?:0SiH0j[Pf R_Le;VZη}W $fǙT0$A0K~BȨ}IY2_dE;fu~X`|-`ٯv[K? >or(MN YXͦRHZa"̿p(KJ Z_7zDV Bl;"8$NY =B(>\w: Q-c)[WWU%aC mY͍g R5DToyf{, ]> < &RwEX(Ӗ BM@"ݳ"_Y1K0ݥ)K(J'@jғ[P(~j3;]5JBAd/hR`i/"|"\J);Ý# j$[_H0?ȫmGZ_T_  0K.VT>i 7S/Ť%9_#砓 Y#~=?n}vT>`0H1O50{Πv@+[, 9(g*S)|5l1`(0T^S!U8'H)7g 1(=C(~E}IF$ QE_ Ԍ "LSiU"S|̕Tڠ@2M{oXiP"Kɷ{mt:d #ڳ,@\P6'!Ye7ȟfPl''<_τF+*tULxg 0P\n\,Ā јp.YZDk hN~S0b,7ҨNb|yM+,z<'J3څ }BBMg6V#bm Gp#3D=T Tp@(n8ygT$ũ)dҕ,,NBU ِBh%,Z"H65`"~2 XP`#J Z慎ANJ>/cC&dZoS8MkM6r؇ T'*`'VĭӟqIBARVZ)p;]<7x}pD}]D_W"ڳ:&q(|\HEw萖G&u("&_hq0>GKB@¿a. in{c0c>K5w˭#j.gm~B}(MJ-%Բݱ("؄.UW0v#Sq3?f{QL-rDe }qjk v`>"ZMyZMk!*&xpIrlM;Bp͚ZDJwgBcs<ny jה=#rBh]xͩeyY[u'mb@q΃Oktv|n9VDV^k ;Т@臇IPnrA4z+:E F' }=H6[| c)Yخ\jɌh(Heonp$g -4DףrZ€.bdگ+~O,3e萗P#/* ϫd덕m=HßW0T_LFk?e:=-ܞpX@gxX!MܝҎ|ald >^Iz^(Kz}3L?\&)m3)HT?TtfҔ5^M2vo/ƥa5Bh ,:!yK6R=_1S*\vpZmjOR,~ _Wr)]KxÌ_E9% `(ׁ"@l$4a8ⷒ^ݬ1) nU'_BL!ia}=X=T'9=c$,TTcX͘GPU ⿕嗏mź+PDʂ,2&%f/)dv1L/F]-=HNHS7Ps.(%@J ͈{ ѤGN"ءib9E՝"̈nƣd(O$G񅂪zЯn\M^&tfTG(+&Q)3"#kT'։2Ő08A6ejk?[s`FQ>s d&$o!"36ڗ1Y6ĥFIXf\12 r!TCBs0+OxYEM+ddxj vfÓd2;@cD $zD,,B8_Ah`=BJAqQ? Ɩ詷 -{2F\8rV҉wiU Mb 3ICU#wK z1="Q)vZ˕'[>s'툨W[{E)pt^:t pֿLs wp{H s]OG鹾C Y?ׄ Cqk 7dI6 ^GY̯Xp'w٤xA3"#%XcƱA__^ݖhF|w;QK"e؄>Ǐ({M͐^(Kho|=2[-t9Q"Y{2Pys#K=3us@9<!O#N ݍky/ckUňg{c$ձ:͡k5eĮ[ף 6*dyI_AlVsNX!G2wԊ:?Ń.#o| 'h y^J^[kYaZo%#:X:hN; 3lbݹMx;cK[,UVKu$u<'~]aJ4g`jG5Da U2c}6ZAaWi ';7#SOi=#hkƀԭ1Ԁ3^v'r0Rr67)\2G9N|.|ZIA t,wBDe@#Ջr!'rRJ3/_u~.DŽPB|aAA$c1v ;OV2IOȨC̹g `[bs99C '0+?l,&He6|0+_#$\BӋ)v}gú!* MY 8O?j[2iK,⑇\=s7w9}pH˨'{;FkHGҜy\O[)ĵ5Zxa'๳2 (2k`i3|j+L맸o46@/eBF1|4I'OxϦú4-F~U~+^;cΥWͼqE*XO1m7K/MD^'pe~/HGPB4/d %c;.@We )n]-GR z#KT#YI7j^?O͠H<1 :e[yJ};TmKg~9X8d ׀7t{߽oi*z( kE -ń.FAId]NQ*m~؝' JIo4r8{vs ?>Sf} uD[oIKX\xlfm&P 6qgE(^RjW|m~\0CwG<yȋOT"\he"} E3̫vajV}%oNgn(:n 021oEG.,aoLwKXpuh+`f̱&G.!YAkkcD#G&KuDް8XiӦmॶػ7j[>)~% V?+D+߀-lg9e1P"YzἩp>9Qj{t¤.:e"|0|_ 6QZⓁ(#;Xprejچf[4Łhl\o]} v]q ("3(D}(=EoîPp |JZ!^P@G RyH9&j Mr '~1/mzBE sxQQ\IWZ~fz ?r0㡱7?Rk@/5>6pb>xء4/N uBރYI MzIz)] R /hȷpmsXďGEEG4ްhkUvkn۬/ѧ?|ICRR0V]b̋~qz">NHGqZi2;a$ZTL & 7Rryn"pl\nt% RZw)KrRhʓpS~Kp RdGRM)ƝXud27_pd_ydF 4,C,R`Z0]Xՙ%7\JHcQt'_}Y=hG,8jA mr%Tf.% kc+}YH7mFL<0Ӈ2f-zj "͇zqu.bLZGI-|;~"J"/3&BkQkmRMkH7"V{\ _wRPF5]g6B^K#C2p 5Ne2DVO+S*J>i.,&P(v%FdN!%On( 3;$ @bR'SQ"V46 b!aa&!:Ù@,.rOwT~./$#d=ifN[[]Oŭ5e'b٪PZ!?:~yb糙HKz\+;)t`)Ķ*,꼕E/qĦ0m~1dV`'=boEsbw T~+b Bs9^&~xw(欇|s2v Wo&q"k(ma[_(jqJK'5Z+={(?+QcW]:@ξ= T#2OwybfdVr4k'd `3N;K!nĠGCMf _ύ#3=3`ADƏWRp΄'Sh c\O[yV.qLMHbV AA}ZhK i7Es$r#23e=@T!o79.1$ nj:G mSP :aQw Q0;޴QB܄G! /LIk*?0=X:YV툁*ig?R_V7:vw]7X}dMF؈h6TD>2=t ~7(0rȓI٤7zH=tXLSۚf+폥B&3_Ί5x2 p3Jp)%1E!RafzBxw}'#PZ [  W.w,ye}gRܽhwLJiӗ|PՑ#kTmvC͚bҨs \ &a9XpHsuB)pz >r(rv Ɏ7\`yy!^T 1!EGĎIkQ66VvRA!Shș"m>ׯ0#U%M|x5!2}O8΍.HO [IN7;Z߾deodp|?84W7Є E6qܯtDɘBn ZeA {ih2f?ҍڧ֗Sq/YW(z )ҔFs6 ]+z9Cٞutqޅnl3M;Rjt?dȆƽ|&N.J;^^g )?ldVSZmǍ}SnU͞fXfNQw,YkXd'z/=%/}) ÆoO5!޵CA>< *ZK; Վ[ A&ynapW 1:c(gdUb?xҴb Rb+S3?uvD3q4Y|2 .|Ss4{D[ٓ)TLcx  £FnR'BDra tcf#^m]jF_%17pav?mkh o'RE/BOS_8(|2ǰNu41C`hhzљzN80O¬Y^ɋstZgtR^E->D D殧и(tB0fb #X@6~p_rotT}4ƑώR!=N~\Hj>]7z ߙi ceɥA؍ć&SjJR%֝1R#>[[u8w~n;; kVa$<vCh7ς_ru!Q,'`, ~dY@ (PJXUpU[MDN[V4WNA TCzR3Ӡ3MHy^p~JdxKND8;8+S)m(]Ue08Dk>o@qOiC,:t@N!`װՑOkH8g,mzkSU?3}iQ|]¸=OJ  QvYt;nm44L~5&f%(ŏSd"w܀?G[ , ox8@˃اywqDn-bD VØ]ael}( cm2ʠ[xA4q$ه*2;OgIƔ 9}إj#5O}ۼ3;TsA|̈Ծa@ayy*[kHȹlsh;B@th?27QJ?@syLjZ}񓎓<`32C;VJܛœe7bh/{-S2!)C^JK5J$pSլ)v',e׋rsa M#Ԍ$TҘK Ҽ*K>§T Pz`nD[)UTK FDVZpQ5ˊh?"’DW?kN7pL@9+{MޤKP:ryAq%? X 'L@BI#Q!2O"7rE`)>_>N8*%¤8Da8 ՓEn9VO|p`9sF'ʷ,y%qٶB?P|s{V6HABWIOLw\֟>3/܅h- | ?ȎN#8n^ ^7xZVR $97[N31A0[&/)_flD&(QkO@$iAd^_E Om] W1GBQ[kŞX榁ZO~2Q*cX} =V|#M "y = JU9?H{;S,=6Lsi]sW;M>2rGֆ޳ tCty|XI?wb5mGB7*;(w$܋3+bc͍skFYXCVŀU UnvYRTՓ7i)޹7`:S(D!Y_?۷Ux56iLlvL2Po8xD1XRn9z-boty}]a}^z|@̟02ШC2T!y2Soݿb\-- kIV=a7B}%" -@F5vs ҌlG-Ԧ+͖였U[;Dt vZ': n k٘^NM `1=B(#Jdg:ZYKY(*}HI5&+rx蠨xqcFAWt4*[š4 ltdh+Ez?Up/N^||:urKnK۵#]`}c征 G.B4]zbt+Va+yC5".Le&lX>z5cjc}BSΛş:ҥjM av˝o2u"`s4HT}I'S ¡;^8EulՆ.-QmǟQ|~ (Ua $Ousl K{vtl}Sm%G  S絳:qߠM0\eO%(TѼna$NC:zYo$Z<`cF h >6s1C =yvq|b_&3:Cv7$rLY4,fU)J(`ӊS'SZP5_P6uNGe UZ91"&,7ű0؞:v"7xQ~< 7VNQ**j,AS@9ވucKy{5\JeS=aF2KrHtу;c+5ѧӿa,8d`.OE׺ A_TGpCʆbx6^=Y.m~\I Zzj04P'1[f-B,P :z'ΘL5}fȝ$ 'GlsD^ N,Z5`!2H0fӲ3{igi*EoT h/ʹ/I!4zОOW`2!; /Ɩ!VR ky) U8/oB)_KRmd#+8QQYjEba?\n!C)m?ǣxBM sv$o9*DeLS<$ֻ %E7-oX pQ*B!.UG H?\-|[$m[llK֘7.ˆބo '%]\Wu)S*;U3)IV7?wl'u0A$C|!K3h~M1W3ˀйUeд<6G62ygPP0^AHγ}:줰ܙT KlX*7TuX,%huu7 [sr#B',Qz5;tk7*h9K#7i|)Ct+*=/KtپkJZ.e8zn]h P$&Bދnvת<ưGOJY))dƺ'j:MN'8YFqywb+M{jkbW,≷~Q ?V<5Яp'!Cmh.uaĠ~Ԡ̭+6{ڸu(B4}Ē3, Ay0d\j9ẟj#"e7~F*`b1q;1޾vGI}_@Uu)WTXF;grPVt=ufuMZg~"3:wBmyMϻlQC걙ݸ*Tq 74emJ朥Sf]b~Dms6vu<:r_,B滖MOp)CzcK?/Jћ422IXt 4wl-|Qo41/W6eδDx؊(7(s#w%ZX·f\؂PXBhJSlGo]mf.m]{ZGw.SBA!BmSP߆:ه7餢X?=RcHL%1[0?g1vVcL-~P_hUk] jYW%5>D܉|t,!MT~^q@ _#k/bN _JDˀ<NQ1E1^WK0oiFgZ$?| v} hqd8㇞y-Id!uR^2(&=P%g xtVhUcc0<$S<7b vJwmKQ.3ABoBa!y sٜ/Jƈ--$v+Q*5|ܨsnԦg$J9%BԼi?phߓ7Hymji̸Y^xqY NP3ʏLM~jƉOM4bNy ,9) G쮦ZΗMNK)ͥyrudXy[YoŻmz`VCZM(8,Go( zV 7p;\́UqTuVbvV=aFew V\O~mH ^Xn'ut"#'îή3EvK7Cmzo4JkCxC{-4!^Wt۰$`=\p+RJwk 鲑xeD ?Ol|QC'u`$LD *&0Sڔ^KHɫ=s I;qՆKr5^.XtၚԖo'f|r+Ov wܹkJ z qs}1v/_)yg眚 F3CK&ሼʠm ;CPq,:Òa!SRD^gjG9"%O< r _v+7ʔGݍإU8S|yaco=t^w M !55nA4K%LGTw ]I8ܤ Px4;zH~YM'.O F z79>ORM]]iߙVi>j$F;LWrODW7!\.YNA@9)K'6*JIkpy \wgv!Ċ@m4āixu+do_\ɢo>Ծ-ܤWTgV=3nPPɃh>vw Pd<T"¦1u4(AK]S(G!Pv&@/q:<&K:S<g~6 =gۢ"@,  <ĮHVzVI~~RMċ fSaEvJIU? ځܓr60(QfF$[/7q>T|"TacPV5i#%ᗶT w !p2t|rv TA}~bUmr *{x_9*X.c>.l!L1[!Ds@8<%`nFwNGg(?y'ni P0jm82=y&A6weD k/מմ},۪ү9`V ZNQKu5QW+@I$s#L!%\S@Oh?W0,'DĹWd2Y fE=%{ Ae^[3sކP%Z~>eTE :-7KVB'g<~ٹ"ICնYR9DvF.)5616mNI 2 LUf \G'rLUonz){/3!z5ȚZ2}7 A|$m$69ym}=6D:)KYEll%MkJ*&gy,,f.+U;>8u݁'"JAٰ$B_B !\GM"f7g0 qѽsf~+s3SAYLz~xҒMte-sjg"8q;gӽ>T0zP'*X{S9._Wc#Q.Cל6+PA-S;W61&"un; f]o`v6 Be#(*,ʳ(HmaOQhE;}|>sn)doiu{ y|$L4`z02.@F`Wӹ@N sFJGZ'*0i5]o-vv2Jf옞i~^7xw{oa1QuQ5} -GgneJd{ufb̀R m[glk9si_ zƖ$ eTؐ0ɋQP [Oa6P.CG#Z0髅$P?f$$M,~ǻʗR$-*2$P< ~PkEQ!ɸ)"&E-VW&E]Bq4XLwSJztr}C CAS[T\/I7~I)O64")=9gd1B2> }g]QҦIu=ɀUO+i~4AΠրJ1сd?[(of 6pB/H2aydMNn,׳Oz&RR^@{=IRZwqTqm̲ %uuD:W]5롘:FA$8= K ,M'=cKwHk翂q+WKʍI8bHpd׾nq]E%7 *fdHΔ GmIvj9_w:O=3'_LmK ӇhkX|dyܐ6 {TM_IF\t؞Vrłwx~WrE-Gr P:מ̪O۲ȌMǑ"K{4Z9/ڗv*WCj]li/Y^3s mWɁZ6엁\!GtIjpg @qZ *}osRz98" otG6^ƲF*3G}yUQ&.;$ OL +cwK0E{SC-p$2TꕬM[G33vlu<Ζ Tz23[ ˿ԢCvsZ"o BZ ١de `eso% d?vih P6jإF ZDTKa&0^*%vԔϧt%{Lj"_D3E;c@b_==+U/O1rMfUIv#u |^2ԕD\iK,BIkzICwip`\n9K-_@!7xCD!׾,!yN;ulq7}_`$nj] ല29"4 YPsn܆ǹ^4.>ƥFGU[Z_,r0g0?j 78bcnq{GN\*Ñ՛o2SD4Dt}m¤z1G]^Rµ6)fzuMdCltQ\0=@?1ϊ0coF2P hdM ԑW=JJ1M|bБ,w\6 _ܐ<؁50LJBnpF}\;Xm4LôxLa= W܄F]f^>_JSpȀm9  ֤CUyT')4.[ =2w3B,t]BC+w 'J<4Xb՝;֤f'0@瀠nL⛑xL n?X)ǯN:^ ?3+;\YNAּǡ, lI<(=1ed߾C/w-Vx%M -mql6>RȬjYARp}K*ZG+u9<Fg$nClvMZġ9 ցk"TY9;?,ɫac"vj!Lº`5i. Tvf\ UddQD6^@k>?iqǘ0 RN/89m-YiRo׳ŏXG•;I>CfHl sbt!Dr~KG ^Ydc==wB,`ku;]&1?Vz4]Eb0qn扑РYysKW0ic*ұ٠fglD']wSRnjsbh[ SNH)})X!݅jƕOPmN+sV E{I5TQJYQ3AaD[d+a F- 9_fg}`;l~yE$ӓ9`;I?%ˏ3"F0AsJzhB n]i;Ruٿ6 ]ed1֮\H"Ws~[XV/.q? 7*[)9W lD?Jlu9ZNSgEh.G6sŏ: ˪; ۩R=.Az- %q̝ 8DhX@7dWrU9أ@W38"ߓ,"̳* c{dMHXx׹|]c@p_F t dńarMlVQO$¹hwdpAo{7c(MiERb8=uރO: =(#WX'WR" qKhr~0"zȒo'17Um_ SkWv0cov%{R̻Gn o ^ƏϯÙ a?)=27^wC`^˅EG'&gL][K$KKV( NUAQV-=벉{P0ph1)K,yPPI Tw~~o8.v=DUg 7~1mCj4F= T A[;Oxޠ9ز=%r7q- lTu[*Bױ99~\nk27E_RcX:dF82t` [ol9udxZ Ch5)SOA+wxi@/unΔL4e]ׂ-!T&f-d}~B_L-A.X3G# z,P-cƒfQ;Vi >8m9WYSwߡViFpG7}o3(5lbkખ5*D5=$]vїgmO9I\T.G"6Dd;b e~\!'3#;KEV'*ܻ?BDrT{\k%IMrKr"CC~v["|Ph:Q2ӲC0pݕFwflkEj%OrئsݨXWЕ0L0rĢh0٭9 .-^X6}NzO&b$ )=X(OH|i7r݁)'DUu,;5sE&7 %ZY#x {9yD#S(oKc,GmT=&=5}дs۰&RsK9 1 I2ֵZzmx)I{v* YR~Ãqeʼ%zSu1?V-@J%Ts}g==3\$hBN#KBE:8j>,iR_HrU!𘀻J)|!'ռk8>aLWδH>VJT}ơHw C&4"7Ưrekk-x{{cJi~P/qXfgc~PIr'V8ؽ4eP.Sz2:`į:_M^oJzG[D#y@% k`ԴVp~jsk#/+}=8 W*fmb}rLo̗_rLeջ\∾EDjc (ؗl% Hv-O{-ğYtKAޏ9]O^l.W;ΫĪ LIJñݩl,) زGy8j`.H1TX?NTlAiэ F %tvhQP!`{EJI#;(I\U"lQ~Mè|piSvc/`a rMZ-jlW(79rg.GŊget ݾډ"@Dt83<6K:;[q nqi[8x\7ra{E70*WewMDjH`8B\6x ]>\hr̗g}"a Hu;'8pr[\B)\p]ɕUB)Yh䝳d`e7Ń=Mխ*!gЦi?P}\k8k\XD|}KV7HV&q&]SJVoso*HP+,`u&y?*{Sn,wDn<J)G~5pcD3 ZIJ-J'ea*L ZkVKxd*՟(݊pjPpDt4쌱/YC 3i,foM*uZ09ⓝ"ځIA;4='nb1{vv 68 K;)@8hdz tU9IO qd#&dC$Egq%XEC5k r/ N>h^`Bȟc Ѳwߝd}N QdOT :#7V@إ]8gX%ف>WC9N:A_p#T߀rzKlrcME{bF$~*g&!#tL?q|JT^ƋI]#oz()#u_iR Pi~榎6~y᝙{r͎At*P1hCB`UD r~q]YxyrÏ 6-J[i.ULA{tZ3Y͚ZZa"d# . 1*%1,o_6λ#R)w*K6棻bzL[ԜV—o :wзMʩ[ʠQ(Դr+31[!쓂+cG@&ID(HMq],T ^Db`46Ţψ#ηfj܉Ƀ9L q8AN_B5Ynջ7{нv8ඉgA,<;~LB0 7 *D,t xe{[.Ԛr4NJQ*tHI{6 ?n5rV٧Iֵi~)GQ.M}}(w/ej$yR@Bf 7Cjcַgϝ`^lZM5ڤ{ͮ+s~Upb$B)]^]u|:JVq* WԂ+輸 LnE/C`w1(>u"s#wҷo}^ }]ZCƄ* &-ݛt=ҝ_eE]6vcA~qN:%O(J Rx]!BFdA8p;<[wDV_- <ꞧ*T4",HAej5knhS Ҍ#. )&haH7w츎hnqn* H T&- o)}7gm]Qc߅3w W,1"d^ǰ>p``dYH TC]eV5T])+@Eg؎^:Sx0 /!OxRFK/> 2'jvwdnc݆_u};d GL ~m;\&F98qz!NWK;ܮK什ԢzcK?/Jћ422IXt 4wl-|QB*Ԕ}&~I5{`.;K^ӒƔ7-QTOjX u%%Ctbh4U.ʂ@N(aWY3`Ѯ`5:b.ro<يsoލ層XuW_ pOm=i`u1&(&XƱS.y^.lm/=kL@ك`?L@KƱHbBųS #r<(%]wO;- W#3*zMi*.Dx~QMM| ᣦG,\#v2őX:I+͝rqc).p6!<}EP8_ "jDF윹  OQjAEY(9wW.qұ$hdtZݩXzS4ͿIR2ɘfY>Xr!ČL"4OJuڔMM|/4+ĞƟu*Cic=0DžGp_G"YjDuARXqv aK_}g-zOR4f̷UQ ʬ8(_=ʺ8GlSvw:b Oٌ8&1^Aq"DID0ˤ8~j`;o UU)T4-p\%)6m*Ky` )z~L15Z:Nگ,e%0 2V:'yrFM05.wW>0u~bp %ѽ%CgVj=yUYJ7QlsDOԽ ڪNʐM-s@㈩L]K_hol䦥U|8v8 9}Ϝ(nդ0f j #D~?I|TMB h,۞d*Hī}#brd%Si?0Tt)=)J0Vm&#ڗVJot2wמv=ތNJPOZ?F'i3n(XŸ9YƵ( xĕ:`*=ؾDoْC%న9UxrR%M`b璡rtpccIqXm;6C_C8%a%L Bc~ևr--ydCsŷ?f8лdql p*֫&-͍ nzh}ŲS4g2N>ݤuK_16gQ"߷I;[/(49 VHq".D5(8ߙh5;9UeZrt9B{ے̧{}5Yc۬6 :L[9,vAz%Dbf>܁vԿč`5iK+W,0 $oK4*݌aޣlęcҀBKۥ.Zd 1&5REM#pG7=.;%4 kFzяmvv24FA|TU9uܼw̉)*PA]4TU0KC(8_ -P.Bj`go;&7)^ҾC rڎ1<ꍳ10mLWB>=" 'Io 91.pQ0{S*bp@yً Gw'h(ǷycqߛʷeQ9ZT~2:&Ok_2%vgfz]Ah4 ns$[D[78n}m}s+ *T.3ZwnREwLc4Ŗ ];i\T>T6Z;\xm&ȵR!%EǎF5OZV8sGDC{ͬ8!ǦDLS qSÄZR<FNdgIc\:U@;~K0HZ$ZP̲?whzEO2:J¶A,`@zqjzPZDg8>Ȧ%%X}3q8x'8M)ݫLHv;1r<ժRM$dK˾VaFyXY&c ^ir^1mL=2'+4_\k>⛙:qߐh)GZ*([$L,eάGvč s}.-*ށ{ ̊SYHsCyU3v_A#i%6S|/-+Xx<hc$=v #12y5Ò-`Z2Jnx5/ ]vNCN$QD85SClfy-"£7D'X~{'&hdH1)"AgnWՠ;E7ˮlI$t&;Dp ]E0G>8B3{C N%Mud& )ԙO,GA+z*6"ӃA)(8~u{UhBiNöge{ V?I] K?+d^\XӞP7[ٓC׆ ;X yFs7TJֵV;ߧ~NWJ6+3osgV6k|\Mb~95¶3(]Ĺ.]F@D=z#94xI?YhYwο,{=]FlD8nUTc?. JR/FMfbn+RTFEOœ6hM=*iA#tѴ<00R!*9q0;W>+7ko M\@f_>RhGixyم4E#qXY]#Egz*mAݍW( 5]ûyBz%K@[  lO`NfB LRƮϿ:+ F/w/iA ,lM ` xl#^0ߛe o3׼H\*cEȲ۾" 5&H?AT7\|?CSEfjN_;Uzw!ܫ0J;-$?()# s{Yއ1/soeRp+UٴHmp5ِ&C6}Iwre7+Z==V? 6 a?l$١);l~p]ӟ3*#4]5Y`cts b0FpjR^Z;"Z"o BZ ١d77溙~$V?oRt* w/$soa%NJVpHd,׈:$x^ltc; ]B& Bh9U\MؘN^΃0&JMF,tXgKCMj!FOb%f`dO&٧1Rժ}](q%BdPE~TV'Hv+uJ}KF<Ja]1evȦqz(Wk>RjTi3Ɠ4yo=%ELq弮cNlcKhJBqE+3vVl85+lH<í-?.A#ߞQlVq).^GQ Pn$gVzmN E5*JbeemÑz&idzH j?S=fm/ >_}kkۅA5b&I=ecWPdtpLo!-B#j,&9,lkr!@GNnu$ʐ4K7s20*si:0Py nU`D 8Hͯhq i .؈9:w+:=T"cC< g$G6 5D§+2 HtʇFU6Eg`դz_Y?uZtVΥRrL,QXsʭ@ЦTx;B,_*%=NP[lg럻l +{-anH2LҠf5 M_2{Pw*^R,Y\%`ƟUO6DVe-4Tyo@k ? ~"¥ Rˎ}_q>q{EbY>h1o&)Z55u IyI4vF{%`-ӮV**rya a=$:ėaNa#;5?ĭTqw4̷_"vqꋠbgXJ#oKg, H< .Qv;h5s2)bd~O$ӓ9ӖpQo|4nLVuSJ};7H inH<#.-]KùW}NqcX;8:y_RmI,1 4ӧqjP"&#~ߘT[2DLr@>sH+`*=޵0H?0(,i~n%V|_ܨ0B.&e : |vGƋ8{X;}q}Q&S8O `;w $;8KҶ\PM4^g ֫m̩.uY(L 5[V dl%NpNR4F[sFȼdo+wR2+Ȭq~>(ezSvS`.Ӓ!{XtFf)HNm/q^u]DиEMs`Xr\(΃AM6G e\w&U:EGX7=qzH Ȍ;aMMj@iLZWC*=cVјQlt̩3hE)$oj]R0t@.Ԏf~yA}f0&\G/zgLQxX7&WɠQtpݎ MG=cW1'EPrnT tq^ΰɧurruv*ڦɬ:Rxwvj__`YAMĭ"6M;¢\#BZ-5qekիzPJ)#kGG?ϸph1󤓨E7t+۟wԺ}_ƪFU9=׾=rSOGajewBWQ,O4ֿ+n?BD&>\d1춻*D$kJis|ޭbYTfnGUrz#^_Jh AgB OؑҘ9VcU9'U;wڞU Oc &=ɫ&dو5B=pVV"Pj^N3G}q3 ų\l@=V+EW7!$ Gon%"9/*[6^0VH&#5움$0OPy2.(nAz/O0uPIܰ e̵SZ=o~u6*Î Ȳ!Ӝqmgua"&kk9pPFY:7L($UYĞ|udS< <o*҈>碘l :P颂/XCM#H+[vkAdhyXrFG U4[!3j1?|5ZuU tfFa~&5Pyi7|=ӈr#4&deЏˆ(.#~, yb1Q˱p`Ώ<'[tޓ耥#v`ˬN}nN=7{1f-oPcLKQ_\ߌh6iݫ3a1IfEޏrë R,=.}ȑ!\2O_8 t|^U<֋EZ'F~y3w 7:͉ͮoL:TY5&m(h:͛I>^^Y FCV洙C lKNX5~vY¬9ZQ@ =ыHxsxA͵EhSU)U&uB):g*: Vh"^֝6]Ӥ䯞f݈|~KS~f+X1'yPA64Bo\/578#!.q9MU&rq PCB38H{l"a wh]ӄ=| _s܈t*-1dPҮgFxi\\ h=ޡE=2hb!5*,LHJ^&캕ؑ4hㅦ:-|c]2#9z׼6tI}Rw[#f)ڒ3t؅OPL""qRhM z~C@^Z1oz8<2u / 27e8cJ M)D$4>7N$IQ+Kayo&!>[|rڙziOO77uޛ:+}eriVMO@z)6~FJk/3DL0եw2\ü : HDiE+MX\ҋOg0*Q"Ji.}|!˱>66%Yگ]6OxN?1Vzɲm4*md<|i#Kj9].&7r M+ӕcڨ#c `I`:_3w٣Ɉw&w__80XZCy l?89S7ZVɒ~f)uX>p-AƢ ´=+vQ%9՛e&TM%Bkn~ :ؙdȗzZRw'"sдۃ/ ӫMϋ8V(f=H%抛(l|E'TwS-%&yT: ] G)#9-z$Xծbژhb9_t.8ta}񾞗R^:4+NxpV%#d68~kW uzJnE2y}e?~Of Q)Ptd><=I cE[#8KQ0Y&nU7Ys "[BT5I|޲|[cE/H[&o{Xz| ɸ$m<\d 6'I{QYwycooq@8thz @Ӥli_LK4 _د]Q)"bj{Ɔi (o .W<V+?[(~w%X*cfD xC4NKӖ_Aynl˶>JV9yg5c n8,pl^$[+RW&5L ӣTw:*_?J(v3˞7!ؔmC8–(HȒa@bit32<=>Q>>?@ABCDWEFGGHIIJK]LMNOPQbQRRSTSTUTVUVhWXYZk];<=P=>=?@BCEWDEFGGHIJ]LMNOOPQPPcQQRSTTUTUVgWVWWXYZ\l\]:;;<;<=P=>?@@ABCDWEFHGHIJJ\KLMNOOPbQRRSTUTUTVgVVWWXWYXYZYZj]Z\[]9::;<P<>?@ABCCVDDEFGGH IIJJ\JKKLLMNNOPbQQRQRRSTSUTUVgVVWXXYZYZZj[[\]899;<>?@?@@ABVDDEDEFGHI\JJKKLKMNNOOPbPQRSTTUVgVWXYZZjZ\Z\\]^989;:;?@ABUCCDEFFGFGHI[JKLKMNNOPOPPaPQPQRQSRSTTUTUTfVWVVWWXYZjZ[]89:9:;O<=>?@@ABUBCDEFFGH[IIKLLMLMNPOOaPQPPQRSTTUTUfVWWXYjZZ\[]\[]77899::;O<==>=>?@ABBUCDEFFGH[IJIJJKLMNOOaPQRQQRSTUfUVWXYXYjZ[]Z\]77899:9:;;O;<=>=>?@@AABUBCDEFEFHZHIJIJKLMMNMNO`PQRQRRSTSUUfUVWXYjYYZ\\]78989:9:;N;<=>?@?@A@UBCCDEFFGGH ZHIHJKIKLKLLMNNO`PQQRRSTTeUUVWXYYiYZ[[]67899::N;<<=>=?@?AATABCCDDEFFGGHHZHIHIJIKJKKLMLMNNO_OOPQRSTeTUUTUVWWX YYiYZYZZ[\[Z]566789:N;<=>?@@SBCCDEFGGHZHIJJKLLMNN`NOOPQQRSTdTVUV WVVWXWYXXYiYZ[Z[[\566789N:;<==>?@SABCCDDEFEGZHIIJKJKLM_NONPQQRSdTUUVWXYXXiY ZYZZ\[[]\55667899N:;<==?>>?SA@ABCDEFHYFHJIIJKKLM_NNOPOPQRRSdTUVWiYZ[Z\ZIJKLMMWMNOPQPR\STTUVWVWWXWXbZ[ZZ[\]^_h__`ab cbcdcddmddefeghqijijkll5678L9:9:;<>=>?S@AABCCDEXFGHIJKLLMM_MMNOOPQRQSSdSTUVWVWXiXYZZ[\5678L99:;< ==>>??R??@ABCCDEDEXFFGHIKJKKLLM_MMNMNOOPQRSRdSTTUVWXiXYZ566788L889:9;<=>R?@@A@BCDEXEFGGHIJKLM_MNOPQPQRRcSTTUVWVVWhXXYXXYZZ565678L889:9:;<=>>R?@ABBCDDEXFGFHIJJKM^MNPOPQRcSTSTUUTVhXYZZ45667L89:;<;<=Q?@AB CCDEDEWEFFGGFHIJIKKL^LMNNOOPQQcSTUTTUUVWhWXYZ44567L89:;<==Q>>?@@A@AABCDEDWEFHGHIHJIK]LKMNMN POPPQPPQbRSRSTUVhWWXWXYXYZYY4456677K899::;:;<=P>=>?@AABCDCDWEFFGFGHIJKJ]LMNOPQbRRSTTUTUVgVWXXYXY456567K7789:;:;< P>>=>??@?@@ABABCCDVDEFGHIJJ]KKLKLMNPbQQRRSTTUV gVWVWWXXYXY456J7899:9; <;<>?@@AABCCWDEFHIHJJ\KLLMNNOPbQRRSTUVVgVVWXY3456K789::;<?>?@ABVDEFGHIJ[KJKKLKMNNOPbPQSTUVVgVWXXY23345I6677899:;=>?@AABVCDDEFHII[JKKLLMNOOPPaPPQRSTUUVgVWXWXY223345I6789:;;<;O<=>?@ABUCB<3)"!%+6>FHI[JIJKKLMNNOONPaPPQRQRSTUfVWXWY245I566789::;O<=>?@@AA@ABL)"/=WIJKLLMMNMNOaPPQPQRRSTUfV WXYXX11223345I567899:;;O<==>?@A5 ! (7GIJKKLLMNNOOaOPQQRSTTUfUUVWXWX123345I5789::;;O;<==>?@?8 "$%'( '&%#!%:IIKLLMNaPQSRSTeUVW1223455I5789:;N;;<&=>>??>' !$'+-./10/.,)'$!+DIJKLLMN`OPOPQQRSTfUVUUVW1223345I5676789::N;<=>=>9 "'+.2589: 852/+'# "nXNNOOPQQRSdSSTTUVUVWVDEFGFHRHIJJIKLWMNMNNO4I  $+29@FMSW[]^][WRMGA;5.(#A\]\]]^^_]@nsS`abcbccddmeffg01234H45678L99::;7 $ "(07?GMU[afijjgd_YRKD=6/(#7JKMLL?Hl}JNNOPPOPPQRSRSeSTTUTUUV/011233H4565678L899::; & $+2:BKS\cjpsuutpje]VME>6.'"?IK ;Mk}`FMONOPQRdSTTUVUVV//01233H34566788L89:;;% 2 !'.4M`q||n_DMNPOPbQRSTT,-././01E12233456I78 7  #)/4ENW`js~|pfZMA6-$!,5AQcswgSEMNOPaPQRRST,,-./0E01245CI677)  !&+/7=DNX`js|{qeZNA7.%&-8BReuzk]BMNPPaPQRQRS,,-./0D01212244345J566  !&+07=FNW_iqw}|vmbXL@6-%)/8DUgw~oaMGMNOPaPQRS,-../00D101223345I556 : !%*.6>EMV]elsvyyvoh^UI>4,$$)0:EVgxsdY@LLMNOOaPQQS+,--../D012345I5 : !#(-6=EKRZahlopkh`YPF<2*"',2;GVhzvh[GHKMN`PQPQRQRSR+,-./D0123455I5 9 !%-4:BHOW]bddc_ZRKB8/' $',3HYk}}oaVCJKMN`OOP QPQQRQR++,+, --.././D//012122434I;YvԠm. !&-38=CGKOPOLHC=6.'!"%*.5>KYk}rdXO?KKMN_OOPOPQQR+,..--.D/012ASt䮅B$3#'+059>BDEFCA=70*$$',/6@KZl}ug[Q?JKLM_NOPQQR@ABBCCDND EEFPr<Řb1#&*/35::>=;940+% %(,18AL[n~yk_THS\]_^__h_``abab+,+,--.-D//4>\רuJKLM_MNPNOPQP**+,0>pҀ5泍O- #%(*+-,+*&#  $&*.3:CN^oqdZPEDJJKKL_MNNONOP*+,H/ǘi%!#$%&&%# $$',/5;EO^puh]SMIIJK^KM ONOOPP))**+*+B 1;"$&*-17?GRaq~qd[SL>GIJJKK]LMOPP)*+*+> G"!#$(+.28@HSbquh]UNG>IJK]KLMNP)*))*+D?(!$&(,/59AITbqxk_XPI=HIIJJ]KMNO))*)*++B2" "$'),05:AJUbr{nbYQLE=HI\JKLLMNNO()*= & * !#%'*-16EMWfuznd[SNI?BHH[IJKLMN()*6% "#$'*-15:@FNYfu|pf\UPKF;HH[IJKLLM'()*7& #$&(+.26:@FOYfvsi_XQMG;FH[HIJKLLKMM'()(()4 5 !#$&),.36<@GOYfvwlaYSNID;HZHHIJIJJKKLKLM''()1( "$$(*-/48CIQ\hwsi`XSNIF;YGHIIJIJJLL<=>  ) "$$'),/26:>CIR\ixwla[TPKFBUYZ[]\\]&'(. (!!#$&'*-/36;?CIS\ixzoe\WPLID;GHIJIKJK&'&'(- , !!$$&(+-047<@DJS\ix}rg^XSNJF>@FHIJ&&'&'(+2 &2+ "$$'),.158<@EKT^ixsjaZTOKGB9FHIJ&'('(+3-06776" !#$&'*,/258=AFLT^iyvlc[VPMIE:BFGHI&'(()367677/! !#$&(+-0469>AFMU_kzyoe]XROJGC9FGHII&')5/67$ #$$')+-046:>AFMU`kz{qh`YTPLHC;CFGGHI&'(5/60! #$%'*,-147;?CGMV`lz~sja[UQMIEB:FGH%&'&''(5/& "$$%'+,/258AEIPXam{}sia[WRNJHD==EEFGFG$%&w645)! !#$%&(+-/257:>AEIPXbn{vme]XTPLIEA9EFFG$%&v743! "#$$'(+-/258;?BEJPYbo{xog^ZUQNJFC;?EF$$%&x84*! "$$&'),-0368;?CFJPYbo{{qha[VQOLHDB;DEF$%&&u83" !#$$&(*,.0469<@CGKQZcp}}tjc]XSPMIFB:@EF$%$%&r9*" !#$$')+-/147:<@CGLRZcp}wme^YUQNJGDB7DDE$%&n:" !#$$&'*+-0257:=@CGMS[dq}xoga[VRPKHF@8BDE#$%$%kAs !"$$&(*,-0357;>ADHMT[eq}zrha[XSPMJGC>9CDDEE#$#$%i9b "#$%'(+-/1468;>AEHMT\eq}}skd^YUROKHE@>CE::99:;Ud 4"$$&')+-/1468#!!#$$''*+-/2469=AABC#$##$%%;%&)Jj:/0611/'$')+-/1357:>@CGJOT\fr}|tja\ZTE:?@AABC"#$%:%&'=o Ń;.-./010/),)/11357;=?CGIOT\fr~}uqdRB<>??@AB""#"#$:%&%&3^ ƅC,A,-.-./01,212F/**-289:=@CFINT[eqw^G:J>?AB"#$:$%&+MؐJ.,A,,-./01001+F13321+.328@EINS[brqdM?=;<=P=>>?@AB"#$#$$:$$%&''>rߜT,+,+A,,-../01F223343.05?@A"#$:$%&' BPf2)*))*+A,--..-./0E1123457J67899:;<P<<=>?@A"#:$%$%&'=')K<(()*+@+,--.-/001E122334345J787899::;?@@!"#""#:#$%&'<''()*+@+,-,--.-./0E12234545I676789:;?@!"##"#9#$%&%&&'&'<'()*+@+,--./00E01223345I66789:;O<=<=?@!"#9##$%&<'()*@++,+,-/-/00D0122345I56789:;;O<==>>?!"!"##9##$%$%&<'()*@*+,--../0/D012345I566789;:;N;;<==>>?>?!"#9#$%&;&'(()(()*@*+,-./D01012233455I566789::N;;<=>??!"#9#$%&<&&'()**?*+,-../D/0122345I56678789:9:N;<==?>> !"#"#8#$%&&<&'()?**+*+,.--/D//01234I567787899M;<=>=? !"!"8"#$%&;&'()(()?*+,--.-/D//012334I5667899N:;<=>=7678778C9:;F;<=>?J?@?@ABCNDEFHGGHRHIJJKLMWMNOPQ !! !"8""#$#$%;%&'('())>)*)*+,--.-D/01234H45667878L9:;<<== ! !"8""#$#$%;%%&'&'())>))*+*+,--.C../012334H45678L89:;< ! !"8"#"#$%%;%%&'(''()>)*+,-C-/01121133H456678L9::;< !8"#$%%;%&'()((>)*+,B-../0122G245657L899::;<< !7!"#"#$%;%&'(>)*+*+, B,--..//0/012F24567L89::;< !7"!"#$%$:%&'((>())*+,B,-./01F2334454566778K899::; !! !7!"#$;$$%&'(=()*+,A,,--../01F332345667K7899:;< ! !7!"#$:$$%&'=(()*+A,-,--../01E123234567K8789;; !7!"#"#$:$%&'=()*+,@,--./01E232456K7789 !7!"#"#:$%&%&'=()*+@,--././01E1223345J789 ! ! 7!"#:$%&''=''()*)*++@++,-.././01E123345I678 !7!"!!"#9$%&'='()()*+@,+,-.././0E122345I66788 6 !"#9#$%&'<'()*+@++,+,-.--./00D012345I6567=<<==Q>?@@BABCDDEWEFFGGHIJJK]LLMNOPQPQQcRSTTUVWVVhWXWYXYZ\m\\]];<=P=>>?@@ABABCEWEFGGHIIJKK]LKLMNONPQbQQRSTUVhWVWXWXYZ[k[[]^:;<P==?>?@@A@ABCCVDEFGGFGHIIJ]KKLLMNMNOPbQQRSRSTUUVgVVWWXWXYZlZ[\\]:;:;<O<==?@@AABCVCDEFGHIJJ\KKLLMNNOOPbQRQQRRSTUVVgVWXYZZl[]9;<P<<==?>?@AABCCVCDEFGHHIHIIJ\KLMN PPOPPbQPQQRSTSTUTUUgVWXYZkZ[Z[\]899:;=? @@AABBCBUCCDEFHGHIHI[IJKLLMNOOPPbPQSTTUVUgVWXWXXYZjZ\\]89;:;O<<=?@ABBABBVCDDEFGH[IIJKLLMNOPOaPQRSTUUgVWVWXYXYjYZ\[]789::;O<=>>? A@AABBUBCCDCDEFGHZHJJKMNOaPQRQRRSTUfTUVWWXWXYjYZ\[]789::;;O;<=>?@ABUBBCEFEFFH[IJKLMNOaPQRRSUTeUVWYXXYiYYZ\[[]789:;N;<;<<=>>?@AUBCBCCDDEFGHZHIJJKKLMNaOOPPQPQQRSTTfUUVWXWXXYiYYZ\ZZ[\\]]6789::N;<=?>?@@ATBCECDEFFGHZHHIJKJKKLLMN`ONOPQRRSTeUVWXYXYYiY ZZ[[\\[]]678989::N;<= >>??@??@TABCDDEFGGZHJIJJKLMNN_ONNPQQRQRSTSeTUUVWXYYiYZ[]\567899:N:;<==>?@S@ABCDEFFGGZHIIJJKKLKLM_NNOPQQRSdTUTUUVWWXYWXXiYZZ[ZZ]]56789M::;<=>?@S@ABCDEFYHIJKLLM_NNOPQSTeSTUUVUVWXYXiYZ\\[IJKLMMWMMNOPQRQR\SSTTUVWXYbYZ[Z[]__^__h__`ab cbcdcddmddeefgghghihqijk5678M9:;<=>?R@ABCBBCDCDEFXGFGHIIJKLM_MMNNOPQSSdSTVWXiYXYZZ[ZZ566788L99::;<==>=>>?R?@ABCDEXFGHIKKLLMM_MNNOPQRRSdSSTSTUVUVWWXhWXXYZ56788M899:;<==>>?R??@AABCDDEXEFFGGHIJ KKLKM_MMNNMNOOPQRQSdSTTUVUVWhXYZZ57678L8899::;<=>R?@AABCDEEWEFFGHIJKKL^MNONOOPQRQQcRSTTUVWhXXWYZZ456578L889899:;<=>Q>?@ABCCDCEEWEFGHIJJKK^MLMNNOPQcRRSTUVUVWWhWWXWXXYZ4456567K899:;<=P?@BCDDWEFFGFGHIJIJKK]LMNOPQQbRRSTUTVWgVWXWWYXY456677L77899;:;<==P=>?@A@AB CBCDDVEEFEFFGHIIJJK]KLLMNMNOPPQPQQbRSTTUVgWVXWXXYXY45677K789::;<P> ??@?@AABABBCWDEFFGHIHIK]KLMNNOOPQbQSQSTTUTUVgVVWXXYXY24566K7899:;<P<==>>?@@BABCCVDDEFFGHIIJJ\JKKLMNOPbPQQRRSTUTV gVWVWWXWWXY3434565K7899:;<>?@@ABVDEFGHI[JJKKLLMNNOOPOPbPPQRSTUUVUgVWXY3243456I67899::;?@ABUCCDDEFGGHI[JJKKLMNOPOPbPPQRSTUUgVWXYXY223345I6787899:;:;?@A@ABUCDPd{ubLIH[IJJKLLMNOPaPQRQSRSTUfUVWYX2345I566789:;O<=>?@ BB`li_IJKMLMNMNOaPQRRSTSTUTfVWY123345I556789::;;O<=>>?#@AAS{þxOIJKJKKLLMNaPQPQQRRQRSTfUUVWXWX122433445I56767789::;;O;;<=>?@KùsLJKJLKLMNNON`PQRQRSTeTVUVW12345I57899;;N;;<;<=?>?@_Հ ľXJKKLMNO`OPQRSTeTTUVWW123345I57889;N;+<;<=<==?>DoïnIKLKLLMNfOPQPQRSdTTUUVW123224I566789M9;<<=*FrŹ{KJJLKLLMN[OPQQRSdTTUVWW012344H5667899M::;<%FrźKMLMW~NNOOPQRSSTdSSTUUVWDDEFEFGHRHIJKLMWMNOVr{ ż\]]^_oc_`abcdmdefg011212344H44566789M9::;@hv~ĶsJK LKLS|pNNOPQSRSdSTUUVW/0123H4567678M89::;8<]qx_JJKKLLdPNOPQQRQRdSTUVUV/012233G34566788L889:;Mlt{ľPJIKLNslMNNOPQPQQRdSTUV/0122G344565678L89::@enu|}JIJK\wOMNOPQRRcRS TTUTTUV//0/0122G434567L889899Uipw~ļXIJKgxaMMNOPQcRRSSTSSTUTV/01F23456567677K89@ckqxǾIITlzNMMNOOPQcRRSTSTU../0/01F223345677K78Rdjry^m|[MNONOOPQbRST../01F12345&676K7788<^ekry¹xLbn}xMNMNNOPbQRQSRSTST-.-/01F11233456K7>8G_flszºVco~RMNOPbPQRQRRST-/0E1123457J7S`fmszºZdqmMNMONOPbPPQRSTST,-./0E12345D6J677:Y`elszºbZerNM NONOOPPbPPQQRS,-..//0/0E012345#I767@Z`flryR[grdLMNOaPQS,--../00E00123345I6BGZ_fkryǿdS\ht~MLLMNOOaPQQS,,-,--../0D012345#I556KZ_ekqw~(żMS]iu^LLMMNMMNNOO`PQQRSRS+,-../0D012345#I566MY^djpw}lLU^jvxLLMNO`OPQRRS++,-./D0123455I5DNY]ciou|ſHLU_kvYKKLMNNaOOPQSRS+,,-,-/D/012324$55I554KLJTcmtz!»rFMWalwrKMKMN`NOOPQQR+,-.//D/012'34432@0,*,*)*/:Obv!ĽGFOWalySKLLM_NOPQR+,,-,-..D/012110/.++*)*)-:Slށ#ſz@HQXbmyiJKKMKM_NOPQQ@ABDCCNDEEBC@80,)*)),9PsقIAHQYcny~`]_h__`aababc+,--.C//.-,+**))*)*+4MnՀ%|:AIQZdn{dJJKLKM_MNOOPQ**+,(9+()* ))/FgЀ"þL;BJR[ep{{LJKLM_MMNONPQP*+,)(,*))* ))->[ˀ(8;CLS\eq|^IJJKKLM_MONOP*+ ,,)$&,..+)*)*++.9EP]À"J6JT_^_^%-,29@GOX`ku}QI\JKKLMNMOO()*++)%'*+5M[^'S'-39AHPYbkvgHI\KJKLMLMN)()*)%?`^2_{{.(.3:AHQZclvzMHHI\IJKLMN(()*(%>`^0z~S%).4a^3u}|zs0#).5a^/p||{{zywusY"%).5a^5`lvuutsrpol4!&*06=DLU\enx~oHHZHIIJJKLLM''()$%?a^/hpoonmmkiW!!&*06>DMT^eoy|SH[HIIJKKL('()($%>a^[di+hhfdc: #'+27?ENV^fpy¾}iHZHIIJL'())(%=a^0[`ddcbb`_U# #',19?FOV_hozzNZHIJJLKK'())'%=a^0Y\__^]]\Z9!"#'-29@GOW`hqz}fZHIJK<=<<=>><&%=a^1WXZZYXXWP& "$(-3:AHPX`hq{~{aYZ[\]\]&&'(%=a^3UTUUTTSR8!!#%)-4;AIPX`hq||cFGGHIKJ&&'(%=a^1SPQPPONF&!$%).5;AJQYahr|¿~wIGHIJ&'(%=a^5RLLIF?:, "$%*/6ELT\dkt~¾}{QEFGH&%&'%=a^F516& "$$%(.38?FMU\dlu~{iEEFGGH%&'&&''%;a^F501 ""$$&).38@GMU]dlu}zLEFGHH%&'%:a^F50' !#$%'*/39AGNV]dmv~zcEFHH%&#%:a^G552 ."#$&'*/39AGOV^emw|vIEFH$%&'$%:a^5G45)! !#$%&(+05;BHOW^emw¾}z]EFGFG$%$%&$%:a^7_E43! "#$$'(,06;BIOX^emw¿~{sGEF$%%&%%&%;a^8`F4*! "$$&'),16aA3# !#$$&(*-16=CJPX`gnw}{qFDDEEFF$%&%9a^9A*" !#$$')+-27=DKQY`gox~|{TCDE$%$%9a^8_># !#$$&'*+-38>DKRY_goy}zkDE##$%$%9a^Aa6 !"$$&(*,.29>DLRY`hoy¾~|xNDCCEE$##$%#%8a^;c. "#$%'(+-/4:?ELRYahoy¿}yWCCD:9:9:;.$%8a^d4 5"$$&')+-/4:?ELSYaipy}{^UVW#$%5%$%6a^=_^WH1#!!#$$''*+-/5:?FMSZaipy~tEBCD#$%%;%$$%5a^_`[G:001/#$%&(*-.06;@GMT[aiqzŀyIBC#$%%;%&%5a^`\L:10510(#%%'(+--16;@GMT[biqylFBCC""#$#$%%;%&%5a^_]N;1/014.&$')+-/16;@GNT[ciqytP@@AAB""#$##$;%&%5a^`^RK./01//),)/116;@GMS[ciqyjOA@?@AB"#$#$:%&%$%5a^ __RA0,A--.-/01)F.)*-5=BFNT[bipyiNR>?@AB"#$#$:%$%&'&%3`^ _^VD2,++,A-/01,F23321-3;@KWahpx~gOE<==Q==>>?@B"#$$:$% &&'&&''&%%$%3`^_`YG4+,A,,-../0/01F12234566?@@ABB"#$$:$%&''&%($%3a^`\K4+*+ ,A,,-,--.-/01F1233456K7899::;<P<=?@@AA!"#$$:$%&' =&%3_J8+))*+@+,-./01E1123456K789:;<?@A@"#9$%&''<''*,(()*++@++,-.//0E1234345J6789:9:;=>>?@A!"!"#:$%&'<''()*+@+,-././0E0123345I5788989:;O< ==>>??@?@@!!"!"#"#:#$%&'<'()*+@++,-./0E10123345I566789:9;O<==>>?!!"!"#9#$%&<'()*@+,-./00E0012345I56789::;:;N;<==>>?!"##:##$#$%&<'()*+@+,--../0D01123455I56789;:9;O; <<=<=>>?>?!"#"#9#$%&<&&'()*?*+,-/D012123455I56789::N;<=>??!"9#$%$$%&&;&'('()*?*+,-./D/01234I5678789::N;<=?!"!"8#$%&%&&;&'('()*?*+,-/D/012345I5657899:M;<==> !"!"!"#8"#$%&%;&'()?*+*+,-./D/01234I45667899M9:;<=<=678C89:;:;F;<=>?I?@ABDNDEFGGHSHIJKLMWMNOPPQ !"8""#$%;&'()?))*+,-C/0122344H445678L:9::;;<= !"8"#$#$%;%&'())(>))*+*+,-.C../0124H4544565678L8::9:;< !"8"#$%%;%&'('()>)*+,-B/./0/0101233G4566566778L899:;< !7"#$%%;%&'(>)*+*+,B./012H2456678L899:;< ! !8"#$;%&'(>)*+,-A-/01212F345667L89::;;<; !8!"#$;%&'(>(()*+,A,-.-../0101F24567L89:; !7!"#$:$%&%&'('(=())*)*)* ++,++,,A,,-./01F232456677L89:;< !7!!"#$#$:$%&'=()*+A,,-./0112F12234567K7789; !7!"!"#"#"#$$:$%&&'&&'=()*+A,-.//01F234576K7789: !7!"#""#$:$%$%&'=(()(()*+@,-./0F12234566J7787898 ! 7!"#$:$%&'=''()*++@+,--../0E1123345I678 !7!"#9$%&'&&'=''()*+@++,-../0E0122345J678 7!"#9$%&'<''()*++@+,-../00E01223245I5667<==Q>>?@A@ABCCDEWEFGHIJJK^LLMNOOPQQcQRRSTUVWWgWXYZ\l[\]];<;<=P>>?@@ABCDDWEFGH IHHIIJKK]KKMNPQcRQRSTUVgWYXYYXYZ[[k[\]^ :;;<;;<<=P==>?@AABCBCDWDEFFGFHIIJ]KKMNMNOPOPbRRSRRSTUVhVWXXYZZ[ZkZ\\]^9::;<O=>?@ABCWCDEFHIJ\KKLKLMNNONOPbQQRQRRSTVUVVgVWXYZkZ[\]\]9:;<?ABVEDEFFGGHII\IKLLMNOPbPQQRRSRSTSTTU VgVVWWVWXWXYZkZ\Z]]\]9889:;9:;?@AABVCDEFFGGHIHII[JKKLMNNONOPbPQQRQRRSTUgVWWXYjZ\[[]89;O<==>=?@A@BUBCDCDDEFFGGHIHH[IIKLLMNNOPOPaPQQRRQSTUgVWWXYjZ\\[]89::;O<=<==>>?@AABBUBBCDEEFGGH[IIJKKLLMNOOaPQRSTUTfUVWXXYXYjZ[\[\\]789::;;O<=>?@ABBUBBCDDEFGGFH[IKLMNaPQRRSTfTUVWVWYXXYiYYZ\\[\\]]789 :;O;;<<==<=>?@AUBCEFHZIJIJJKLMNO`OPQPQRQQRSTeTUVWXWXYjZYZ[[\]78789:;N;;<=>?>?@?@UBCCDCDEFGFHGZHIJIKLMNN`OOPQQRRQSTTeUTUUVWWXXWXYiYZ\][\]65789::N:;;<=?>?@@TABCBCEDDE GFFGZHHIHIIKLMNN_NOPQSRRSSTeTUVUVWWXWYXYYiYYZYYZZ[Z[[\]5657 889899:M;:;<==>=?@SABCDEFGGZHIIJKJKKLM_NNOPQRQQSdTTUVWXXYiYZ]]567889889M::;<=<==>?S@AABCDEFYFHIJKKLM_NOPOPQPQRQSdTUUVWWXWXWiYZ[IJKLWMNOPPOPPQQR\SUVVWXWXXbZ[\]]^_h__`_a`abcddmdeefghqijijkk567 889M99::;;<==>>?R?@@AABBCBCDDCDEXGHIIJKKLM_MNONPQRSdSTUUVWXhXYZ[ZZ56678L9;:;<=>=>?R?@B@ABCDCDEXFFGGHIJK LMM_MMNNPOOPQ RRSSdSSTSSTTUUVWhXYZ56678L899:;<=>=?R??@AABCDDEXEFFGHIJKLL_MNPOPQQRQRdSTUTVUVWVVWhXYXYZYZZ5767L89:9:;<=>Q?A@BC DDEEXEEFFGGHIKLL^MNOPQQRcSTUTUVWVVWhXWXYZZ545667L8898::;:;<=>Q?@ABC DDEWEFEGFFHIJKKL]MNOPQRRcQRSTUVVWVhWXWXY5445667K89:;<=R>?@A@ABCDDWEFGFHGHIIJK^MNOPQPQdRSTUTTUUVgVWWXXWXYZ457K789:;<=P>>?@AABCEWDEFHIJK]LLMNOOPQbRQRSTUVhVWXYXY344545667K778989:9;<=P==>?@@ABCVDEFGHIJJ]KMLMNNOPbRQRSTUVgVVWXY3454566K7899:;<P==>=?@ABABCCVDDEFGGHIIJJ\KKLMNNOPbQSRRSTTUTUVVgVVWXWXY23456K789::;<O<=>?@ABVCDCEFFGGHII\JKKLKLMNNOPbPQRRSTTUVTVgVWXYXXYY234545J67899:9; <>?@AABVCEFHGHII\IIKKLMNNOOPaPPQRSTVgVWWXYY223456J767899:;:;O<=>?@@ABBVCB>8/+)('(,.15?@AAB M."!"$'(*+, +,19AXIIJKJKLMNOaPQRSTUfUVWX112345I556788989::;;O<;<==>?@@A8$"$(*,/023 20.-5>HJIIJKLMNNOOPaPQQRSTfUVWVWX11223245I566788989:;N;<=>=>>?9" "&)-0358:; :8630.3?HIKLLMN`OPQPQRQRRSTTfUTUVWVWWX12233455I576789::N;<==>!=?>* #'*.36:=?BCDEDB@>:740.7GJKKLMNN`OOPQRSTeUVW123434I57899::N;<+==>:#'+/49=BEILMNONLJGD?;73/0@JJKKLKLMNNUOOPQRSeTUVUVWVW012443445I576789N;:;;<'==6"%*/49?DIORVXZZYWTQMHD>950.EKQW[`cffec`\XRMFA<61-9IJKLMMPOPQQRQRSdTUUVWDDEFHRHHIJJKLMMLWMNO)I"'+16=CKRY`ejnpqrpmhc]VPIB<60-G\\]^_d_`abcbcdmdeefg/0123344I4456678M99:;+8 $).3:AIQZ`hoty}}~}zuphaZRKC<60+>JJKLLNOPQQRSdSTTUTUUV01233H456788L89::;*"%)/670*6HJJK]MNNONPQPRcSTTUV/01212G34567K8<9::  $(,2:@JQ[fo{wlbWLC;3+)BIIdMOPQQRcRRSTUU/01G34567K8B90  #(-2:BHQ[eozth\QH>6.)2IJUMMNNOOPQQcRRSTTUTU/01F22334567K878;  #(,27?GPYcowznbWLA91*'@\MNNOPOPQQcRSTTUU--/01F21233456757K7872 #',17>DMU`iu~rgZOE<3,&2PMNNOPOPQbQRSRSTTU--/011E11234567K788# "&+05;BIR\dnzwj^RG=5-'2qMNOPbQQRQRRSTTU--../0E11223456J788 "%).28@FMV_ir{yl`SI?6.(jMNOOPaQRQRST,-.-./0E12345D6J7671 !$(,16BHMRW\_addb^ZUMG@8D }KKLLMNM_NOPQRR+,-./D//01221//++*)*)(! !#$'*-159=ADINQVZY URNHA:4JKLM_NOPQR@ABCBDNDEEDBC@80,)*&))*&#  !#%(*-/36:>BEKKOOQOLIDA;48 |\]]^__h_``abab*+,-D./.-,+*+*)*)**(%# !"$')+/148;=@DEGFEDA=940z JKLMLM_MMNOOPQPQ*+,+,+':,()*) %'%&(*-/268:<> =<9630.^IKLLM_MNNOP*+,*-0+))*))*))*)-/2256766430,*_JKL_MNONOPQ*+ ,+,,+,.544-)*++.><-,EljU  {ZYZ[Z[\]^&'('(),-,EmjR xFGGHJIJ&'(,-,EmjQ  !؃_GGFHIIJJ&&'&'(+-,DljM &2~FGGHIJK&'+-,DljO,/578;̓ RFGGHIHHII&'(')-,DmjN56677kEFGHI%&')-,DmjP56767„LEGFGHI%%&'+-,EmjO57]EFGH%%&'+-,EmjL5565GFEFGFGH%&'*-,CmjL5M qEFEGFFGHH%&')-,BljL5EFFGH$%&'&&(-,BmjM55G eEEFEFFGG$%&(-,BmjL45DEFFGF$$%&)-,BmjkK4?څZEF$%&*-,CmjlK4DEFG$%&%%&&*-,AmjlD7ЅOEF$%&)-,AmjEsDDE$%)-,AmjkCÅIEDE$%&(-,AmjlbyCEEDE#$%$$%&-,AljnCCDEE9:;;0*-,@ljokVWW#$%%$%7*,-,>ljkj`N5OBBCDD#$ %$%%;%&)+,-,;lj kkdM=101=fBC#$%$%%;%&(+-,?@AAB"#$:%&'(*-,:lj kj_H3,+,,A,,-/012F233;NrնsX@<==?@AB"#$#$:$%&' ()/,,9mjleQ6+*+@,-.-../01E1234567K7787899::;<P=>?@A"#$:$%&'&'<(*;iQ:+)*+@+,-..//0//011E1123456J7899:9;<?@@A!"#$:$$%$%&%& ''='(,-()()*++@+,--./0E1223345J67899:;<>?@@!!"#9$%&''<''()*+@++,-./0E011212345I667899::;O<=>>??@?@!"#9#$%&'&<'()*@++,-/0/0E012122345I5657899::;N<=>>?@!"#9##$%&<'('(()()*?+,-,.-./0E001245I5657899:;O;<=>>?!"!"#9##$%&%&<&'('())*))*?+,-.././D012345I56767899:;N;<=>?!"#9#$%&<'()*@*+,--.-./D01245I566789:N;;<=>>?!"#9#$%&&;&'()*?*+,+,-../D01221324I5789;N;<=>>!"!"9#$#$%&;&&'()()*?*++*+, -,.-/./D0/0123445I5767889899M;<;<=> !"8"#$%;&'()?*+,-//D/0122334I56678989N;<;<=67678C9:;F;<=<=>?I?@A@ABCNDEFFGFGHRHHIJKLMWMMNOPQ !"8""#$%;&'&'())>))*+,-.C/0123244H4545677878L9:;<= !"!""8"#$%$%%;%&'())>)*+,--C./01234H456578L99::;< !"8"#$%%;%%&'(>)*+,--B--/0112112G345678L889:;;<;;<< ! !"8"#$%;%&'&'(>)*+,B-/01223G434566788L899:;<< ! !7"##"#$#$$%$%:%&'(>()*)*+,B-.--./01212G334567L899:; !7!!"#$:%&'(>()*)*+,,A--.-./0/012F23456567K89::; ! !7!!"#"#$:%&'((=()*)*+,,A,,--./01F23456677K789:; !7!"#$:$$%&'((=()*+,A,-./011E234567K7789; !!7!"#$$:$%&'=()*+@,--../01E122345657K7787899; !7!"#$:$%&'='()**+*+@+,--../01E12334566J6789 7!"#:$%&'<''()*+@,--.-/0E12456I678 7!"!"#"#9$%&'<('()*++@+,-/../0E122345J678 ! 6!"#"#9#$%$$%&%&&'<'()*)*+@+,-./0E122344545I5577ih32A-;;?@ABCKEEFGHIJQLMMNOPWQRSSTUV]WXXYYZ`\\]9:;?@ABJDDEFGHIQKLMMNPVPQRSSTU\VWXXYY`[\]]789:;C<=>?@AICDEEFGHOJKLMMNVPPQRSST[VVWXXY`Z[\]]7789:B;<=>?@HBBDEEFGOIJKLMNUOPQQRiSS[UVVWXX_YZ[\]57789A;<<=>?GABCDEEFNHIJKLMTNOPQRRSZTUVVWX^YYZ[\<=>?@FABCDDELGHIJKLLSNOOPRSYTUVVWXY_Z[[\\]c_a`a44677?9:;;<=E?@ABCDELFGHIJKSMMNOPQRYSSUUVV]XXYYZ44557?89:;;?@ABCDKEFGHIJRLMMNOPPXRSSTUV]WWXYY4-55>789:;;C=>?@ABCKDEFGHIQKLMMNPPWQRSTTU\VWXXY345=7789:;C<=>?@ABJC?<?@9(#2@JKLMMNVPPQRST[UVVWX12344<567789B;;<==% )02/)"/HKLMMSOPPQRSZTUVVW899:;B<<=>??FABCA  />JOLA4&'LQSRYTVWWXY_Z[\\]00122;455677?9:; )78 +>Ws~aB*'0?[vYEHPKLMMN())*h2 #)3B]~`MCOJKLMM(())f-$+5D_fRCOIJKLM'(()e& !&-7F`nVHJHIJKL//00e #(/:Hbu\MHNOPQR&''(_  $*1;Ic}bQECGHIJ&&''\31("%,4=KdhUJ@FGHI%&&'Y=3!#'-5?LfnZMBDFGH%%&&V8)!$)/7@Ogu^QG?EFG$%%&S7!"%+19BOh{cTK?DEF$$%%R- #',3:CPiiXNE?EE#$$%O#!$(.4;DRjo\QH>DD+,,->""%*/6=ESkt`TKBJK#$$-=oV0.%&+17>FTlycVH@BB"#-$-%%1`e1./0012-06?GSlpTA?@AB""#,$%%&*Pi2+3,-./0082/37>J]acXK>?@A!""##,$$%%&&/@m2))*+3,,-./081134-5=7789:;C<=>?@!!""#+#$$%%&.''(())*2+,,-./701234 <67789:B;<=>?!,""+##$$%%.&''(())2++,,-.70011244<567789A;<<=>).**1++,,--4..//0018223345<77899;;B<<=>?@FABCDE !*"#%$$-%&&''((1)**+,,5./00122;445677?9:;<< !!*""##$$-%%&&''(0))*++,4-./0012:4 567?89:;< !)!""##$,$%%&&''0())**+4,-./001934 55>789:; ))!!""##,$$%%&&'/(()**+3,,-./009133445=7789 )!!"#+$%%&&/'(())*3+,,../081134<678&:<?@ABCKEEFGHIJRLMMNOPWQRSSTUV]WXXYa[\]9:;?@ABJCEEFGHIQKLMMNOVQQRSSTU\VWWXYY`[[]]789:;C<=>?@AICCEEFGHOJKLMMNVPPQRSST[VVWXXY_ZZ\]]7789:B;<=>??HBBDEEFHOIJKLMMUOPPQRiSS[UVVWWX_YZ[\\67789A;;<=>?GABCCDEFNHIJKLMTNOPQQRSZTUVVWX^YYZ[\<=>?@FABCDDELGHIJJLLSNOOQRSYTUVVWXY_Z[[\]]c_`a45677@9:;<<=E?@ABCCELFGHIJKSMMNOPQQYSSTUVV]WXYYZ44567?89:;;?@ABCCLEFGHIIQLMMNOPPXRSSTUV]WWXYY34456>789:;?@ABCKEEFHHIQKLMMNOPWRRSSTU\VWXXY33445=7789:;C<=>?@ABJEP[]WKOJKLMNNOVPQRSST[VVWWX23445<67789:B<<=>?@Lx÷`JKLMMNVPQQRST[UVVWX12244<567789B;<<=?cŐOKLMMVOPQQRSZTUVVW899:;B<<=>??FABCDgͧXQST|UVVWXY_ZZ[\]00112;445677@9:;\̟MKXaNOPQQXSSTUV/0012:4567?89Hr{JiMOOPQXRSSTU./0019234556>78]u̮StZMNOPWQRSST-./008124455=7?ev͸kxwMMNOVPQRSS,-./081234<6Hdv̧[zRMMNVPQQSS,,-./7012344<5Lcsv]}kLMMUOPPQR+,,-.7001223809AWuͰM_MLMTN;OPQR23445=6653-**)**)*5QtwJbeQRYTUVVW*++,*-))*%)1RżDLd{KJSMMNOP)*++'%'()*)*!-7CNX^q:Nf[JRLMMNO))*+'$ &')*)*0RjUOJKLMM(())'$Z]^v~|w5.?TllOIJKLM'(()'$Z]^jnkX$0AVm~UHIJKL//00*$Z]^]_\3$1CXolNOOQR&''(&$Z]QRF"&3EZp·{KGHIJ&&''&$Y]\;9)"'5G[rº_FGHI%&&'&$Y][43!#)6H\rývGFGH%%&$Y][3)!$*8J^tĿ~YEFG$%%&%$X][2!"%,:L_uqEEF$$%$X]Z* #'.ObxļrJK#$$-%$W]^^XI80.%&+2?PcxľuKBB"#$-%%&%$ V]]^ZJ>../02-1?QcxþtS@@AB""#,$%%&B%$V\L:,+4,-./0091237AM[knodTC?@A!""##,$$%%&&/&7+))*+3,,-./081134-5=7789:;C<=>?@!!""#+#$$%%&.''(())*2+,,-./701224 <67789:B;<=>?!""+#$%%%.&''(())2++,,-.70011344<567789A;;<=>).**1++,,--4..//0018223345=77889:;B<<=>??FABCCD !*"##$#-%&&''((1)*++,,5./00112;445677@9:;;< !!*""#$-%%&&''(0))*++,4-./0012:4567?89:;< !)!""##$,$%%&&''0())*++4,-./001924 56>789:; )!!""##,$$%%&&'/(())*+3,,-./0092245=7789 )!!"#+$%%&&/'(())*2+,,-.//8112344<677-;;?@ABBKEEFGHIJRLMMNOPWQRSTTUV]WXXYYZa[\]9:;;C=>?@ABJDEEFGHIPKLMNNOWQQRSSTU\VWXXYY`[\\]889:;C<=>?@AICDDEFGHOJKLMMNVPPRRSST[VVWWXY_Z[\\]7789:B;<=>?@HBBCDEFGOIJKLMMUOPQQRiSSZUVVWXX_YZ[\\67789A;;<=>?GABCCEEFNHIJKLMTNOPQQRSZTUVVWX_YYZZ\<=>?@FABCCDELGHIJKKLSNOOPRSYTUVVWXY^Z[\\]]c_`a45677@9:;;<=E?@ABCCELFGHIJKSMNNOPQQYSTTUVV]XXYYZ44567?89:;<?@ABBDKEFGHIJRLMMNOPQXRSSTUV\WXXYY34456>789:;?@ABCJEEFGHIQKLMMOOPWQRSSTU\VWXXY245>7789:;C<=>?@ABJC@>@CGOJKLMMOOVPQRSST[VVWXX13445<67789:B<<=>?@;/#$*.02?@FABCA$1AQ]caWH:4MRSWXVWWXY^Z[[\]00123;445677?9:;*:OdwvcM:3IKNOPQQYSSTUV/0012:445567?89+!-?Vp~dI39KNNOPQXRSTTU./0019244556>78!-?TowW=,pvMNOPWRRSST-./008124455=7-  +9Lc~`C-MMNOVQQRST,-./08113445<6 '2?RhaDJdMMNVPPQRS,,-./7011334<5 "*4ARexrY@LMMUOPQRR+,,-.700123380!$*4@N\gh]KICWLMTNOPPQ23345=7653-**)**))&#!!#*2;EMMG:RSYTUVWW*++,,/*)*)2037735PKRMMNOP)*+-/-,+)* -:HVcj.%''$wJRLMMNO))*+, ..-,)*2@O]gij'KPKLMNN())*+,--`jjij \zOJKLMM(())+,+fijOIJKLM'(()+,ei  > kHIJKL//00.,eih NOOQR&''(*,eig 3ZGHIJ&&''),dig)1FGHI%&&'),di f5F PFGH%%&&),di f3 EFG$%%&(,cif= HEF$$%%(,cieDE$%',cieDE+,,-+-,bijj^JK#$$-&*,ai jibO:0R aBB"#$-%%&)+,aiijdQA../003hVwC@AB""##$,$%%&&(+,`gS=,+3,-./00814B\s~iO?C=>?@A!""##,$$%%&&/(:+))**3,,-./0811245=7789:;C<=>?@!"+#+#$$%%&.''(())*2+,,-./70112344<67789:B<<=>?!""+#$%%%.&''(())2++,,-.70011344<567789A;;<=>).**1++,,--4..//0018223445=77889:;B<<=>?@FBBCCD !*"##$#-%&&''((1)*++,,5.//0123;445577?9:;<< !!*""##$$-%%&&''(0))**+,4-./0012:4567?89:;; !)!""#,$%%&&''0())**+4,-./001934 56>789:; )!!""##,$$%%&&'/(())**3,,-./0082345=7789 )!""#+$%%&&/'(())*2+,,-./081234<677il32 :;A>?ABHEFHIOLMNPURSTUZWXYY_\]89:@=>?AGDEFHMJLMNTPRSTYVWXY^[\]789?;=>?FBDEFLIJLMSPQRSXUVWX]Y[\:<=B?@BCHFGHJOLMOPUSTUV[XYZ[`]^_457=9:;=C?ABDJFHIJQMNPQVSTUV[XYY445<89:;A>?ABHEFHIOLMNPURSTUZWXY244:789:@=>?AE502:KJLMNTPRSTYVWX134:5789?;=>)#++&4ILMRPQRSXUVW567=9:<=B?@ &?SUE.,NQXRTUV[XYZ/0184457=9% 1SuqN,0G^VNPQVSTU./063445<6 -Mul> 7djMNPURST-./51344:)"7W{tG"2k{MMNTQRSF,-.401349$ !5Qg_>$8pVLMSPQR01288Y}躇V'0>=*&=tdKQUSTU*+15Ѝ"!)AxpJJPMNP)*0-Ey}RFOLMN()- %1I{\EMJLM((,ԃ'4L}fJKIJL,-.ԃ "*7N~pQHLMO&'(ԃ#"$-:P{XEEHI%&'ԃ2!&0=S`LBFH%%&ԃ(")2?UhQBEF$%%ԃ!$+5AVpVHAE))*zӃ!&-7CXy\MCH##$*=pҀU0*(09DY^HAB"##)%%1`]2-./0614;IfwudMA>?A!"#)$%%&/O-)*0,-./51344:789:@=>?!!"(#$%%+'(()/+,-.5013495789?<=>&&',())*/+,-.23/01284568=::<=B?@B !'"##$*%&'(.)*+,2./0184457=9:< <&!"##)%%&'-()*+1-./063455<89: &!!"#)$%%&,(()*0,-./51344:78:?ABHEFGIOLMNPURSTUZWXYY_\]89;@=>?AGCEFHMJLMNTQRSTYVWXY]Z\]789?;=>?FBDEFLIJLMSOQRSXUVWX]Y[\:<=B?@ACHFGHJOLMOPUSTUV[XYZ[`]^_557=9:<=C?ABCJFHIJQMNPQVSTUV[XYY445<89:?ABHEFHIOLMNPURSTUZWXY244:789;@=>?AJaw}nTJLMNTPRSTYVWX124:5789?<=?aąMLMSPQRSXUVW568=9:<=B?AeӠRQuUTUV[XYZ/0184557=9OЅMlNPQVSTU./062455<9eٸaMNPURST-./51344:Aiڶe_MNTQRSC,-.40134:CdЅe}LMSPQR0128442--*+;YӼQhYPUSTU*++)*4,Jź~GlpJQMNP)**$%&')**0Z{¯rEF$%%$%G^K!$,@\|ôSE))*&$%G^B!&.B]~ĹcH##$*%F^YH80*(0D^ĻjEB"##*%%&%%EZI71-./0619I`|tYE>?A!"#)$%%&,.))*0,-./51344:789:@<>@!!"(#$%%,'(()/+,-.4013495789?;=>&&',())*/+,-.23/01284567=::<=B?@A !'"##$*%&'(.)*+,2./0184457=9:< <&!"##)%%&'-()*+1-./063455<89: &!""#)$%%&,(()*0,-./51344:78:;A>?ABHEFHIOLMNPURSTUZWXYZ_\]89:@=>?AGDEFHMJLMNTQRSTYVWXY][\]789?<=>?FBCEFLIJLMSPQRSXUVWX]Y[\:<=B?@ACHEGHJOLMOQUSTUV[XYZ[`]]_557=9:<?ABHEFHIOLMOPURSTUZWXY344:789;@<>?AE869?LJLMNTPRSTYVWX13495789?;=>,'5>?8=JLMVPPRSXUVW568=9:<=B?@"#8RfjZB8NP\TUV[XYZ/0184457=9')Cgd@9`NPQVSTU./062445<6*BfS0POPURST-./51345:) %7QtZ@MNTPRSD,-.401249" *;Rm}qPLMSPQR0128442--*)$ "*8HTO@wPUSTU*++.,*,8?.30uJPMNP)*+,-,+*1@N\hjXdOLMO()*-PjUTMJLM((),-RjR YIJL,-.,-QjM 7LMO&'',-QjP#LHI%&',-QjUMFH%%&,-QjUFF$%%,-QjayE))*+,-PjH##$*&*,--OjcN:1OB"##)%%&),OeP:1-./08WtM>?A!"#)$%%&,0*)*0,-./51244:789:@=>?!!"(#$%%+'(()/+,-.4013495789?<<>&&',())*/+,-.23/01284568=9:<=B?@A !'"##$*%&'(.)*+,2./0184457=9;; <&!"##)%%&'-()*+1-./063445<89: &!!"#)$%%&,(()*0,-./51344:78is32 J9>>AFFKLNSSWWY]\9>>@EFKKNSSWWY]]599<@AFFINNSSUYY3779>>0(0#:hM6SFWW.3345 5w2N`NSS.3=`n?5P-VtMSS*fb%^KNN(ce,cTKL)a f2geHK%] r%7jvHF'VGa)pS/0;ctIA!%$%4)-,.33779>>#'%'+).-.33879>> #!#'%)(*..334999>>AFFKLNSSWWY]\9>>@EFKKNSSWWY]]599<@AFFINNSSUYY3779>>azLQQSWW3779>]hYSWW.325>#'%'+*.-.33779>> #!#'%)(*..335999>>AFFKLNSSWWY]\9>>@EFKKNSSWWY]]599;@AFFINNSSUYY3779>>42=CLQQSWW3879>&M|b@fSWW.3355!LG߬NSS.321,,PdXSS*,,+*1?M9(NN(+--?j 2KNL)+--?j 2K%)--?j eG'*,->jGl#''*>bN9EӾD!%$%,)-,.33779>>#'%'+*.-.33779>> #!#'%)(*..33499t8mk@88XX;;>> VV6666VV >>;; XX88h8mk 55dd5455dd55l8mkVVVVVVVVs8mkjjkkDisplayCAL-3.1.0.0/DisplayCAL/theme/icons/DisplayCAL-VRML-to-X3D-converter.ico0000644000076500000000000046740712647526530026110 0ustar devwheel00000000000000 v (w@@ (B00 %*  oP a hjPNG  IHDR\rfIDATx{fuvcf%=5&A2d9!I +E d)0dK# ["6X!؉#lDL("ܙMW9u~3K9@w{׭[9;N|| >|,@s;;}\rr|@tu=13k|mۉOؒ5?'PiE]M t)NWoN{|qK:|G.CjmxgNnnεt19,xxLCuilr殛؀ݝ^,ȭ 㒻Mg=0^>_['q2ſ_߸xboMlߌw (3֕IX` 2Y`FM>xE-9=Q : fΞ `jq퍶@VI )`+s= \4y)ަwC٥XsFO+`(&*k;fLJT9k|?r+\̢"4cP禹m) T4<8 pbOϣÂ4B '0\,Zh/ſ_KlWxR ȟMmh,i$X˩Ν; /_g;{3 `N|@,MS=AoL/(%UB]Dg"xRoh x\ކ<&].I!0+DaNi=| EڒjY߈O]|X}|s/DbIh&M<Ξ= Wȃ7\Eo6H]Jd:5β Pl%B bdrF}e_ꌭQvEjב5@nbVH,5,Wv3ڞȸ%,m܌ Gہ]kQȞPb6n*֟c'Y?( ^+?O=5yoSoǟmzUtpXS@/ xS],p'`sV5ܧ]>Q a[ J46EӜ[1`#ow{8>/@ᨦ1Lݢ^4߮p3_ndd ,߷ .XEXUZ]W(/ ؓdΗxqaK']fпm=<OD4ex]+~sWiqV,GTH${k|Aj]RgΰV4b'r/r`pLbkwrǝ(db,cv/<Ny!GUh; }97=ͿQ\xȠZFa8_Ik;ף/H+@@E H+?ŋOYxW ೟x?+C$(sQP\'rjF pQƍYoZ5\sغ i*[ډ҂VOQC-q=.ngl O{} 2ɷulC)hs;:'vD`,j_Q !QZuL@Qkrd(ݻe(72O!AAgTjI\> ,+5#G|yT!Px@:/B"Fk@##= ICtŋ’c"^ۯk;7r0 1{5M)g-лKH( -W$P8)!2\菓'OµgbH%_S_Տ|ƇeL0#KِzA}}UdC!]<%YF˃cM[Bv38x1! і,l- a"2 `t :Z\}Ik"53c<Q}brJ7Sv-7_9P xXPO'ŧޮ-Gc"8k˧bp%㽱 0 I,q"<E!ꌛu1ɴ`ta\F)e!-cilP.3t:(< %ߪ aIZa]|.v'RZcy`[-BE9!;2qzOkV"A(x7}If0 +'\*g8eboC;^i4RAzh";`\3AJw?<]Bx@ݹZQU#c*d n3n F'VUyKWñ/`bQl$  /a$uCNZ~s/>u/W|3_t N1\n-a?"z+$K F3 "JE&];PǬ 'Uo,E:gei[~#_մ0C0hV" Ms>\D ǸbvUق@P=RjIZbYh5ʼn?HLy&E{VOQ<:P9<@FyW  c` hI nbPMgҕwZ D5_ )3,w8XvjT@}X,X۶..^|g흡ӟz ;WeŪC:L_u$ i8QJcms"ʌq*(Ћpwozt,IbbAH$ѱTŋ*#{6);C1ac rXWU7O|+0buiNsg(U9z)$FD KT,+eRBђjVvէ־WQ2bQĩ X% R([DP!2FHFQ]H5)GO侦V"NKFUd t13њ' hsP Qű]UR} 6_;8g+ h|u_q npR^CoZs(٩lGPCAgu-҇<'KP2*sXl˯yY9Y~1bj<7OrM\@L^M:A?L씊-0MDJrn[bHI~(yN8\]H &TD4 HD/j =ˁ(6VT9 =\/?zjA'E#!T>oHژT`w+VFMM#i9(d*ydF 4Py F;kC>GmЦgϼ]]LB`U6gO)Hf+S-*rNIBb R%܈ @jlxCZOp!ZCHoO}S_=4/oע[9m(Ezz>̜{#ݕeTt}gk<,fq:R2ha/he f@#+s|&*謉1$Z>u0v,|+nlVثe@A@TZ~TSh38\jܩ^ llC بm2Jq:kl *} V!!0ݵ%t;̎θ9"qr4'˘in řL b=AyˇY) ߟseӡA=*I-Ⱥd+Pt U˷H.4VI|Uv[pi FӔm]wCpݢR#Iy&c}rg`J ~c NiL5U_~2Gk+9M:lS@P(0dPSXJjGa}*W Bo]AxHKN P1``,dX UE)RڢUpU ;^B51Kf 1ʾh}9)b*s/(N! FWg6Q ܸDy˙%#͎& [6=5L A*q#xnnv,"LWZ沲X]70FT0d,Ͱj.5DQ˓7lij5P# 1X~ZǠu,/2e2gSNۜH'>7fyeNCrtRܛ\4C]6(4%օ{ylK ֲThVp7GIVzQi vʮ+0g(t',sA@j)mSGU&㗃}_W^AyPtKLg`eLIHA}+&#&en#Y䊈B{@KTh;RSw%<Z|¶4PXLǎI !qPH07-bNuڲnCy;6zڑl֐K 4 ДU';r s@PXk}z{\J1j$,fkMxχC;|?({"7L- _]frGY} E`eXnUz!2#/WTN e@e""{g Лf=@"$Ϟǒf`0n4thQOv?{._˜ɽdeF]v1q7rEӚ׆C@e@L08!$cܛh5Y0S0и=@K,Y,g[wj֘jq6I†[wfJN_T:ג9cu\U?DZdNhĘҿ;`w0mkJ\}@,nP(»R1d4 EèPJM%\qI[x9Ynlvg1\"8b{mEvK?ڗϯZׂp6K=&صiV16 +04ɅJ Y GsSB8E۩A%ydwy-/v5=p9vF,>  Oʕנ,xہќ * 4J!g2K?n p+NK7ɮ^k6,Zj~d>"U e\&ՋL'AY1ROUI$ w-,,+Θ}ãoIwڕ*YZГM2s5 Os[{n*!E .6>v8-md)KPƸzqcxy(Hq:k|2"KanV-?_dd d<_nJ-R apYg[F>"tT/2o)@$8<{5,]]:~hTt,,^]1E] _f0 ҍ_hbWNTĶK5-LLׁ .b@*9 <?+E#|~g6h0X@uA[}Cuρ$f))s;we+1+0vL )JltlALh5rFuOVTvlsUFHg LںO0((2o)i~oRnR:!g[N%9h쯇<"'79Ory0sFf4Oe c[:Iqj5PZ||u.e)7:Ǯ}3!Ş+1h194>&_K\dia4(B_qcpXol DL8YQSMWj&(o^Sk˖{/8 }ews:5'77X&OU:z)&7ƹT'9 hn#]!PfX}Sd "eqp~"Tcsw,׊M#]A&clݽs~(ߔEY͙MJ$lۃhޓ[GM2"}?Ms.s!vXP Uw2S7zbQϫ,Sn;Ug=%J2/JKXtmT1 %܃diLx#m/ lEP {SD zhB!͒|Yk&*-aȂϰ̯Tzl 4,ǑP-r^{ZX-u%hplmtZu#Jr݈ Vled0nN, DhK5)P.&}9;v7 Xz sfg>awS,g: f9;uc]q6YJݲ ջf}4f~24#d51&JHtC\| cX˯b4n!ĦA kF+Km|, lZ>[K B Y]m/psPTFLVÝG%"aP-7W]YQ7΃[HGNڨXiߵ >l$Eܫ4`YiOgL@7 *H7s:TmU ےJAm3yp ]@0Iɀ Ma]/1H%k ƪϻCCS`955k`:,ռf[qv4Y|ڋD+[W`xkiwvtܽώ_ZԔ8/rQ2?2̐P/$ 8aX4 KUD$8z=%B1H7oA$f o IiC4s` #>`T+٘!|g.䪻% d+[ Z Qv>=I _ԍz]/B -K10-Y6"k_03lVScc$6ʼsu97bVހXdYr1,'P2ْ.Z݈ !y.l'Xs!au9T`ι LWJbZ2V+ʟ.?w+{޾ʕQ-ra{ C:t+mo'f, +_WN]<:4d$uP Țb1+rHtW,ΟVc32Rs {5{q5J?߸&  ơDۙvުy= q>\~(lz.a=4o-Y(֕-FC,{._Kv!QF] eNތ@yqҔ]Z f91)g~["i-3`İd]3MRP;+ 4&Ք2ܠWF. gڄEmZ; A!AWipW w{vZLt4xmٮN. v/? 2J iƕ6$Ry #Ii@[ӧ U407MYƟP&VQ,O-gU4m~u3H3 r]t L:`W- PQD0*w̨h4F-9W? ̀"C˔&Ll0yޟЛsx3`nTMy.< dz(aM;8MH3ZVu 1ɛ*l]ݲ'r2{fLmZ[\/2';խč%nd}7ysCHt=¨$7טvG&"qb6h^A"Tk%6/l K#ufjaۦy:?`@Qi]E@U" 8Pww\{7A8f@o(Z2ӮLW^L ^~Q+)&0yvui$iԣ<*X~G>wG?{l}|6C VocuU`LNXy{DEX X! F l\FkP;<˨AaPAt@֬ϚR& Q% c^x,a8;@<OJdi$r*#GW?KjKfb `,$դChDL@-Xϟwn;i7A)3E ˺E3LR^E=7GnѪ&mn^G7 }E &M`F=kop=mHsL9[nTGrCP%*T6.roet1lV.(|-ة$snEvU(J6Q|ќ5C%*7rSzSğ&y&NDJ8Ĭ!GVԜ,V%aER,~a"-Jܲ"hBC4Xd]2j4*[F_{5*k+pj;/ IAe%;$HBA!|!OrτzLXvyY~6NmDPϣ +lPX®I*7uoԪyN|ɒm )s_Wp,b`zVf x3PVv64wxnBpk}L@wYF[? yc(_ioO&$kPBPc ; 2B׼ɭiˇྦྷAդqZ_ITzNL-roFv.@ 6°dͅ`Xj^ NI)X!lV6M(ePY4L:X,1hw3 d7; g9LdUNŬbuThG6Xoxnݿ0"оe=$h[Q@#P[~%tH{ȲB>5h K, -?azWeJ *ӇgWRF+ 2j|Tݧ[y¶dM}%(T('"ܲV-Nc[NӖ$0 ( ok}Ȅh&@ה}`PU/FǗс$X h 6}VMɗ൏ =Ehp=~vFM&HA,yK& ~HJ d$-M4F^Xuu$u-EG%,y/jt E2S]u`;yTC(.kWLΡڔԚUw}JfHC 9ٚu*Pn7+Tk|(ax3xwVek0/g1㆞AdSK'&fT>|n>v#GK?i3{.n@x6~& g@+*)%H$~ز`r nNgÂͼ˫>;#H|o0 k܄1zFgU &W dygɍ*3vMai-YNkusy35ME͖ })7r3%}SEVKh^Wj2K0:V4L5拏5x˔ԣ>'L>=  uG΂͟I-q&̈́}}`wGWÂxd-?iGJU軨5 onקpwѫ5S~Gո(z#tO߁)ܵjh@>Tq zGBRb؊ ,fq'z SX<7:yaHdo>mn5 `{yx7G'ϖ4~deĞZ@|~P_I;_%էd2e5'Fw@3Ev|iKʀ-Yz'DnA|~` ~!uVGCuLcՖͮpk!#6.>wzݗ:K)b+ qJJA*Ub0獓'XJ9[?|4Y}* cK]i_~R#.B<*BwoMJEG kʍ\K[$GI&Du6_]'"?W}x/?*6ӆ|~'JN=xO h(@|'>yVĔzOӄ'7==1{a¿ ?'E1'_dϑ43_ͻ_:MR# 0>7?COny/e͒X%}4xYB24&!BɓT\$ &qIZ}u>SbˋWFsY>\]\G$P^#у<Öe_'_Z2\[VcCה_Q'*$|0gtQAeT} @`O zNO_<o!De>|a L DW{f8q,G7Zʨ+ >?ã+[iWeIګ5}_1DBUHd8W ne<| b[./."K7`?b9G"sF"*A(j˓c0ԙr?N^$U0lԎLREd騙y~K!'IVNQ.ɧ{.V )x^À˓xV1x%coƳ$=%KH!д Xp)z-'УGҮwY'x?VJ<4b`+KHb]E 9Z}8 }v@ @ :-X{J`7W_9=e!|a8Ʊ=v#5p8*7nfoo{0dL azM+f:pIC/ciy+v<d\ UXvAB_g@vs,c#U ީ>=_l^&WfnrS.b! "( ID{h0)c[($ +QQB@t!:2MV$_PY}GaU|{!*9 ?Q,sL.Csx뫐2+`,hNd:@|{=܌JoAjצHW|*V 4UĞ07U[ڱ y}8iv;B]ݤS <@UL(olI^s"y/_d8@t QȬ`#;p;c7N(~n >z=eL9NO3?N9O 8F:Y!* }F 'S@<_Лϋ}=E@~=|~Rs݌E49u >*V}nv;C;ӱ_VG F0.ocZ~i\,v(xlTW.vvcvYF;o|t.ޅ'\ǟ/>"Wܢ{CR DϟyC?HC{a~d4Ьg+h@kO Zv k*]bHw?K$Az"5? 40#Pp rw _GuоWo3qv-ߝxlsdJ=^6 `] E-#0[js8 \ K$?y0S^ɛ Vk! Ѵ^fXtAeJsyU@堖pxiԛgp@ҟ3bxn߄Z~v U)L5EOֿYѼ# p`sZIB7`"j 8rVHЧ݆.,b<\grJ2'T !gW`N$zУ@g%`>crCw@B@n/37ͣa>ˇwf.5.xv?cGcG9޽Y׿ᾛ>7l*i*h=82v㚀, $VsQWid+f~6n(bK4U9! ,SF&Ex5BB)g¤_ Ap_`k'kGbp?|ŽJ_S 9 uT, 2G!Eu^ *??!Eͻ=^Gt=kAٻᣇ8!N+9 ] -6DtYhL&Io݁l$o[4` ɵIw=)̙U;x,pg&!$('OH`jRX?ZO(jXePC|R+`p ~ BX9襣od\V?O[L}(=+BϺ(k0>b0">*> -$&ݱ7(YQ G(|D4{MˣsKe+`N#ڤ9$qsUi p}Y3 `7}BBLR2B0RcPLtd˟H|0(.+D\~W[[}y߷ @,YCeDЙ6,< s((SI"GEY{ K`->HQP%=#Ц$ Ԑ@dP$"-LbA|`/̙ %X IxAEW` ڨ {} a W8>+Sg >W\+IQSci~񡈢Yy:yb4A݊7X V=u&9PH2Ȗ)?Y|њ h!;O8.2Bf2PT0nk0G1* |`__POPA#d ڭT Z : 2'1~$PXW1p`B) `BJItCۓ`!Hd~Adgf p…3ÿ"^~CkQWA&8:e쀕x᭯4;GNxG8'zL-~Kfr]Ze+}SEnL< `M巯(%aΟ a@+0(^teZ, Bg+$gh`) `$[p_LjpZcŒ?/ 徔$ &(?@`oe"$0e.[Q iLX~hT(ss|F r08PႉcnEpcq8!>xȏ‘?D_~v,@"9ܞE_^JX>e*m -2yRQ\v-_R[ua)rk=yt`ҏƲ &?/쁂5#*䮕CئpAHʯ-˳oaYXϛR?HeqqH E?PY@ A-' JL78"~/ ul(X8-:'`.Ѻ 0##RD TE¯ k=r.3ɿ?F% ; ClWV .@OWނ[_I8#51tު]ߝ%-djG69.-e,}O>Ѿ̬HW[.M&)tCQT"~ư=K V&KAǽ/Q&y`ȵzv?x 0O~^}<@ ӂKI9E8He J?i,@Z 2Cgw hm!RyP& 5  П")Dfg?C_s @{woG^9D8{_>-`4@T?o\gH 4[F)ln.vjkșE0SXQ[V _ tKuvew~ k.ʒÇqI힧z弄3!x opK4O Z:4A[ZOὶM\5n0%!L Bb00B@0It +B,^ J2tᏬ$?z|t/>E%H @E!Ђ踷4W[Fy:8nWY Bi `7;/OjqJY@Vj*F毴a%& q4h@F*%#xO6̞q ī;`h .(D{*&7ODbsHvNu%[`:l}& E>|FzşR_T hߕlђ;ˀI>T, ߲BdD( huFV1 EV%$B\V$*vXAv)2@Ytv"Iv s"Q +pQ_GXyYIXYaαCH`tֿ9>Q2Ϳ FJApFnsWj7U|4@ Dm|Oj ڀ r1R~Xs/ƠN}ǝ!\ʂ@k0LZ=I77>B75{ZŸ)3P8W@ <_R*Lg1V} Cy_y 1:'a*pGHP$@8JN QXpȿQd=HBB Y70<++X;|~VX X[ R @g.m=7n#[f_+$}nNҲi&$AfkQt"eVةBZ2! *s؃F@%U0'밣9k]w| j?FMZ \ Dv2 x-O%d]\@ҁ/b>`BpP7k8#(SY9B~P(AH@ Lsg7=&{h;۟KH_ P QTBW ñ8]4V@@T#T\Jb$]wno{ -)F <5ϛw t܈.QVhMVI_0zbWeHt/Gd܂\0*\ǻxaNkDMMf᫰tO @ > Sz(@y]D~ HiǷ c.`Q @tPd@l$@i C%NAH*hZfAhd4;\hAG"|]X} Z`I@Q6>N@\/Ão\S]03 Q=})ڴyloIh]HmShs e0^ OpĈV+^eg fw̙3e$:\!" 'Ҧ4@KdTd_M@>S?R=F.)+iyW5{Nbt0p߄>H m\_0m-i_`$L~/= >+}Z+G(48N@t>A[ 񣀅$@BH@2_7@F%@< ]v >%3!lXtO n2im" m##ቨʐ\C!,&RR8*1ip:7TG&0ܝ";wz6nC<\;q-wv +Y|708aM4-s B]_SOˋ|(~>% G+zˊpH8V>pB  (D!A8 p0gr0p~_99Ic =F+VBJZ[L+.L`+xuŤ1=LF|K8 `l缽\^#FҴ]'<ēJniqD65$@q@SDECXrѥw6 ȱk \~rV5M>;̚}g_@hߔ0" ŗl *ɚ- l n( r B~kT }SѶcn߉RP%yPBVrH, A{!8K !Jp3I ̿ HZ  `AR1_G"`h`6_xi~K9ϋD|TNf5( `g{7sneMyVlrVra;a /"Λ@- dU Hu@Cy DC6<:8DM@ PNps Г;0:1v* *U@?gˏ{`̀_{[p`DXJ8`w{ljaG <+|qf`lrhC?C VڮY}0\3+Au65 c}^,z+%I9`H@` f%Dbhb(~,d`&VdǠFHkL$Qh*ʠRG04l>&t\'EB* ,81 '!\2)XP@ÿcGGeK5  JCLĕ!@oÁO2]D!<`chX|M8L/no CA{׏_ۇ 9'߆$(B4r`F4M2T&'ֿ "}:G-=%_ߴQ5m"BD Z:,ÉOA`0S  ؋\"'5 EH.!N+|˟X Um<_pX c+HYа *m? <ωd<.77OD rPUl YAheDēO׎\{R7t1JgHaB1I -ݢrg ?7nE,, $0_[L]_] PMпe lʯ@6p \1X>tzLsM;6MD%Qp q(& ͓Re ";K̤~$|p0 pqpN @d @kf 7wo:m06v%lhEv9HJ7~rq|`{%wa0 /SjIT"qX}^  0!5PR'pokhH]@%2""M(- d5GP36_LAU--":y4HCWB 2ϡ6.20; C$4YhZ`RhY3H1`ud<Zg`4gdf ꔦA Pu` hm `6ԋvd!\&Њm ಉTsfe[df;(0*&kcdv @r&H*0HPp@ kߤ h4!t@ށMh$j⢁}hsa.$cSa #6R+3!D1G5bP**|I\R,t %Z/?s$@a1ki.J((h+o fOgøljo<ZDsIعznW(0M1կ5U?vrV\T uLv(\Gف 5X03f-G.T:1-}^UO5F (@ S ;VA V,(5q$? ᔸH ^h!H_h߶$`|ـ@ϛ2 hx;T$DP f n1?5;`@Q8 _qXy#4F Q h5@Ѐ-0%#I tYJqq ܸ+p⍟-;]xz:yF`T+ECMKº'형> F[liGZp)Ϝʞ}M"]n({_׎'a@ D`. DH@P#+@y#HD 4 ED.-@ A^@4+;YP$91?F>H^OΦWRKc6 gX5O+\x&fp7~ )4R0`]LL ]篾q#41 hŒLN(Q\)m\`FÎN24еΰ!ȃ4j-^F^U@^<)X(1AXR}*>ɍnH_oKU 0 !(ӣEd ѓ †-wU 5y!agaVMh&U nR@_r V0s CǍD:r~lq߁l/VR? W"BVh8\n]Uo83VSnaLr/"vv{v&\vՔXF㙔A{bs= qO78-ڬud >tlNfmq_ Bƿ g2Z)<8l@Z8EAcvy]QQoKֻ\ m(~,) ،h9x6_g% He,tSdpA)ZR/-S/LdWrPںvwIo@ נI)b@Ȗd=@܀ 0!9g}#ZTCLBv]8Hm,s^#"M F =PHxtpZ-Hq?-p# ơwU89&+8'+dG@%LYF Xx.<./{s8KZ&m{FR[>L@ffPܯ,rI*( #)[PӤp- %`SK-*BCkVxRB)87BZl>_CK{ޑ8qVXnv5Z0(@ H9P@(e A2$]xChSx (*k] t i*9* 酡厉8mE=isQ8G^;` ?+Hv"}9T( p]mO(qط~&ݻ!^F67Ytf2"mLq ~".kfY R^F2QEK*8W u})7#M Q( Z!Nq"~ ^㱁>lv8*{ucC/ ~u4 ~DH.B0A h Lh7uuŢ %@De kT}dF\5Xp Q]GvZۊ-dkTK~0#|SHῚJF J.W,u0,Jxk?j2E#J@7؅tƅDޯnH΋SFrJRS"˨XpA) 6J:&dcZ͚_Z$5\MP-n`*O<0n܀ƙ xO9KfueވV7KW܎"xHd pԓIAoLĤTO  ?M"R X }tsB /xpTȋYgQ&׮k.z**] @KSρOJnx=8WL~h׭fpPO<EF^w UdPI0f356mX2t0 @K QR\/JF*Zx NG='c=,ZyI]Ya\Tދ hHQ>}xak.bֲDA-?e 'ŸPӽRb0pذ1PAȕ~4@e@y$;~0Э*@BP:I )CƟEzT~]t /0KL3'p f5`Hf`A@ {Y'PSIH/Q 1U/閰H7r=$.ARB;5pبb>0*IV"ñ{ }͢1q2њ8t9@zÞoa/ӳG\>4C f= `? ('de߀ %=p LHTIƿ#x]RsM0 +P!G n>_̕@ ?X=$rVZ N @݀|~w޹ y8־:0{KNdPsjcƐkA+Aޫ{jq]DޚBȻ{Ӟ!>x>p, n&DB|)#T+ Q *#Rx|n?^fuŅK0I 1HA'A(DPA)G0S?B'^,M+I#Հ}Ma@U0 @u3 ͇< i4 '9И݂Av#]ӘS mb5ӄ2 ( 6dκؽM֠'.sŁ<,ŽU_"wsBCݓ8q_8h "Rn%IH~cB99@_s?vt;FDZ@Մt%/%e0'EХRKa_Ӱw®֟2+>`WV4 0h#-urt/z7d5& $OT];P ={`Q,/T=DzXZ `H8 9AxlIHÚEcGdډ||^s".A J@рtG   b$ZGA6;<HI;v=x#Kz)"]SvE~@ _É@@5dPAHMJu,KӯMax0`j~ܚ  5`2Y j sO7bgEo㇟\x2I:`[?=(F0C~= ^:4Ѻ א]m̤T'~Jݠep QQbzrc/)Aݯp7 qKdPC,x:*LAZG @ _G oFIcV    /q 0~YT% RwȌ?_o]@b#{L?޾i,ɻem-$8@%#JBf7&B!$CIf%̄ $ve˶Rkm{ϫ:U_nY^Ew9,UkA1=[6]7'6̭7ΛOP;hyz􆌎lص55cח(Vx nIJ܁AAy,rM |˫NM(~./\?ǟGoQwPeR ;G"`@PvXNg43VyBܛgaLÈT8np `Y6jnKͿ漀?Unrc@h2i5:MX[mz|[` gt6e>u p^k,vCy WЪ/H*lg_ @A@n0p!8V^2ε$ v#ijqF~tLA/W#GRUȷlFzܩ|?3EYz9RWkoNG,Ԛog6 FV'/m jyp ZW[ۻ[ Xo9v#DN$$[hz/t{8{ ǻG`. ³D@fv[ɃM맾$'M9Q2nAU+\”BNp w,n95*=֥7p}f4{ BvSs~jA7S~AIQgWlzYV?пcH䍃\5lop?^Rj9/<3VZmw X{_E`!{ x8)Ay/ ڀv!l(TH AM*m>ۦ`5n]$3# ^yv>ؾ ?G> w/kK@\_O(3oWgwnLV.T`ɍPl q*_E ]s3%d*V|bٹ_NYQ`N.G nRՏ-FOuJ;F . h;08*Á-Gpv[Ӛ{uvH1캑 cꌮsYP 'n~~DM=dzrc7ep 6hMk C2 YEFϫ %շkn~j\}9G JWYa ۹[V|; O|4I_ @=;p+._+ YV`Ҧ `C]&aǎ]t}fC(=JbnC^ `2`  TPoxo6 `^lX0YcW@Ϻ ӁkL[ך)A`p9[^[ۢ! jXQFn 0>O #` gDįZy*rWFգ4Qt*sV@S[Fťx Lkp ML]?4BnOkAl$>N!lPJvȟ@z'`D10f&j Z z ɀFY{!QV/u]ep=dk4Te>} ~g[&}0\S3# @k0oU5 4 +7@ ;p)~4bP*A̷ܳ>6t?" W8/whmco԰wIAoHl;+"}@x(fI3_CW=O |Y(p <]8Wi5Yg&x!P;RoH^*tSwo#o*Z܂YPs x=;F1t}ݴ.Rm#s@( H`o+0sxFϝ;K݇M=!E0c@ZaA>Y8ϟ3l0PDOBDu3 ZzU3 9ZizZO b{3t~-W+VG6]s~a9">bt?!c\QP lJR+G?@RIA\|.e-桮QhZ}V";b$ #R6 M p ?6F}asS ܧW+1S9$ kYR8`ßDPF3gі~ZcYknͿf{p3.5) |ܬ5#fVw5WwQ(PgQ"KTgRfe{?MDOXwg@~?ϕE9@j@R$},  qc(0J,pT}=5Ӣɱ?ST%]1'3Dn% ]2?!&P0K!HE : Xokjiǘ PiWX7y]D$"}c2{n#sڸsݽѐ&fO?4;]$X|)̏B'g˩_ymЫ|/*k~?EWH@sP .0\g[@ܼ M-`ۉ_MGsvҏ.>("*˿RM%fPjYc507n~\a26OVcxstY:/Zeh~umD~oZᎫYYt >۟=l{>N_ya;zB]wƱd` PVQg~֌$p }BBghoҚT%v;rҒ ?J0In,ǝl100ʇ'U &㶛^x-{6Wטoz m<,Z*k9 |&/K:x21y @y4_eCoL,+ `CllXj;>GW]ri؎];v' D؝'e4( Vp 8~'._hgW`xh;\%\0<}zZ5QN8jcZ0cza_*Zcf\l/E; v}F^"˙D? e̜wZndP@mtul/<`A<]|S<00|M8 t300 g |&e)G!ߓxz3*J|[ ۼP3 |Ƅ]w6bUc^@B1 = BvP"Ԁ8;^tY;3J\#>Գ01X (p@=nI~jBtg4 Ar^_az&=I6WҺb㊕ ;n& a*6h?TYdz9Sys `QO@ ޯ. aE#m\Ht |v`5_ͯ)nN}(p!UJ$hH޽2w2WOZu׷b{@W~k?K9W<#sB63]Xk]\oh5@ {造9grRc/`X )@Ş'lww %]m`'he@᷽+Hژos:x5U+Wo2Xkg w5/  >7N@ t) h4 Pj= , VD0m)N/ /`s>4Ǧ)9Vސ*ɍB;\RC5v |~G~QZ n@|=nf( 06]`e€yp  ~IGC & ͵Of|/;wz S{"?26I{@`:C ט:,v9 f3z|kf|A*1Ew=q)*b,@*d V }H Z Rv bvU}p3ЀsRU`הJKX?.6Cb}?$U^mP4ghw,2V"p=4OCҩsE!e .rL@Nc/ w :7*  @E@Vs`q*;@,`ΛV{z#j vtF"PiJr`UqQM@0BDqgݐ+˷;hY}&6h;'>'?k5˿CϼLV ?&U0Hj=3{;usf; <[@ywxA.S=С"|\Q8 34 ZvZ^zycwgu^~k[Mkz[|kGPKo*#k -hyDe;ܼV>{c+,HYj'E-}X !" *% ?KrTz&sw͛ɖ!@ӌwV.o5έ/_|ɇ_#G'Unv^ T@ x8,.g20>{䗩}U,PvaM"UI [l/V:|D깛_x{`hh{ +j]4k(7/p;gzH*_5DǞ!R ͦ t`[dQza?d*x 01Հv;iߤh2X J ұ(.  yʼn w@9CiVmy|efӹL,T)%D@k^c5 J]aR|1,`ۥۇJ`5~z"g] Waߢ Xe]=)cfOXqu䴬`tV݌Է`齝7Ϙ@ķ1OqcZ߫Xـ إ(= k?Ec2ATu}[RdHigSlbwsSSG5ѩ[-/i~+t_E›滩hh|%@<%_%8͂SsQUT<U` цcWHBɇj{" %Wx+ l\|wA򌖳hXbs 0K~~ͽ4#JCrxaWWG>#t J T@wlL Xʿ:"UT<@p8(qsԾw\vebs^=,Aj 򎫻P{kN.|@|VzaY( y~M# 2b0<t>bl5w~wK- r5``GJ<`kn W?|3&}nq` [W8f8~U*`;5L3kE[9 ܀qKQ+ͮm2L%نbm39u߻UGJ x `geG [3ݨWT-v9m{Ѯi^ W`B?aj飚ZRl @';UUAA1 8w$.j~Hѱ±$1q @D,ؕH, ?5/Үӕym.r'y/+ZLHsf 6S#I5J@, j@WSKR-ېB/|AW6QrKbА"Lng ـ*Bb *Bbyz72 hw/4fzlۏF9?$++b|E]&]Esu>47VA+@MR{IHp 2c; OS ,cgR:s b+@UY!_\ X "Wc%[505zsC[mXj>G{n\èq #]yW!=;W|sf~~3?kf^Η~JuS*1 `Cp1PKLTD f334{ô~ p'!W tKFVX 舾rO):i#כ r(ҁMw2_<}yLz1ѺjoW}5YHOgϼL5SBoq|dSP =!vmE>UGRYEH17cؿmyb@@p(mYe?9_"e[18]w}|*(GB8yr҉W{1l?{caT' P J FB)C 0XDL z AG-bGp)$rAG4=&jVQjg*k@f#\Hc68q49VT ` @G!ӂj~r~'OBS7zV|7O)Q sMCPSE:۵3*7&sEI u6 |O#zdyNwf~|S9{CR А<dK>J f;9 dV14ض82 >%$A|¥.x]v. Ho 4SыAS_g}c;?Gwe]FEӅg/%MLYqr 9T% @!0 bw`ԀT0w_ѺS-dJCpO m'  RYD +7F$eS1RHPW_%^n`r@TP]*PvnJN02*;@`e1Zл>1>cN ?I2M߷3ړ7h9` w{;ٕ3ؙffz:h/6US@w0. .,dO%uVXoNM-('N:)%-9Xr y4n=݉#$2B qn`0￘[B*\6P|*m Sf qp pb76f=6BeSyKqt6{6MHS^Z3&{QBxsuW6]_[y ^k@X.RWy53M⼕-RRUW( L`'NVH>΃Al쟗++C{.KWmܼ;?KWw I6*Hyj Ib/lv]<2v*"@OmXB[,3%ü.A*3e^VXmżcÿ+ WnܴbC 0-_<^cVY/ePb@qPG*I?\k '1 F0hw`UPPlMOMQm?{(ȟ`XKAi@y;~e2u2HFrխիǜ?ZI3߶J`&BC AXAU8,KI nj9v+; R~G 3AhEdKҐF}aͨYJYr۬\}=}Vrֶa'L(o9%E+ ‚ PܣZbCg خ2Jf ՀsgSB=sS!WF! v#w~#Ў%h-YHZr[f(j ~.¥ 7ulh=4@!w R b΋ZpzӖs23(dG_= }^Q õG&y$`o3uV:pYk\2=: $@.ۅ?I-U ĮA||`>KO Asf @yhq;Ru+@Y`"n0O}ux7+ssf"/#/QwzEfy&Im?{0V} KKh)`BU@P N%Ve e^\8?hǹljCTy>a( ! TE JF &gT d{Ж[V$f͂EE:ݣS~L.Jm[T4Ŗ@U@a_K!v H# s}?~?m|h:YrQL!2 `g(WFzPy ܀T5-,l+xG'W?ع-9u R+< O.`YFhˆ+V.tj~[i΅3L,z-ʫ?Pׯ' 0g@TKo L769rm5a 6Ef`G.j>#FB@\5T(/vGfXlqn:9bs lX/EJ? Y(' ~ ?X!Wٹrxfr`?r4_5_A>Ly`D\~N;dAXN {E^w-{W\0KSo1&ο݀?iWW3Z ¹cR $d6.l+|9)(e,W Cb!=/eרSU?{"0%3(} k&ZځjU+T{z~t˖ZGih{2Nxے,A(0G ]o-(W7@ՙGVukRcBp!-hFV(˙cah+u\Ery'OOFz&&ZwT mUƿ7C@f x =ʄS,*&aCgjY vX% w/\sy*4ic\o>;5+=|D}Yˬ;J`[Uoj rU /,8'D H LCz[G8FQBȧ*1h/B*|]X"s'^KӓhXd^SRj:/jd6t r<@wN*{IW]KFT^9eO?`\q?JG [+]k:%WQ @ VЋO#;jRpUGC))DH۱}G^kcrxȯyVm4Oc_g}}?CVl8gIQUcw?*j_bP` dL ؖR\g`bhOrI˶ow @ w B}% ph]E?Y[*t0Rӻ&skl&q @JOU @bp8"XGV, ǜ;qmxd1mV|B\/:8@S稜Z.~zH ʟ ~3:AHqk0Е,t^jMbӞyu`[U0 )b&?o8d@ "@e`g0`ִ[ά(\Eu-[VdIz#B3(Q?nxXg@ЪXl[ @5OPx˩wn21W/aZ,cΝwwXWX{ |~ >R!C4 h? jKP-N(xZ RA] i56XWi_z> y= ؙv : G#Ar`%/سgc=Xml7mf{rg4g.v,;ښ9}>c4Me&87;@s@% ^U&=PDWyf`* (P\+I@S9yN>ToOb5 9$ ! Ae @Kps⟋Ҏfo4O/k@0gf<=s@;h5?+@E1ΚYٓ_&N=;y~TX} 4ymP뵔'B?>K (Bh,0l}/ T vv J .?p/ƟЦ#CY d,އDOLP Æd n.XAgyE2R(t{Ķiͱ4<=I w[>b5&V#\/2Cssy4 @Uh? c&ШSe[8zc8miя _##fNJ+ OQO z@{jr=wC'݄:/4\J>]1E23kmn{VD֋ήj+o/yy:GD&S>ʼøpOӯ7PO.•@PxHUP3 D\ 3*HU:; STjp| 9|!?;wTkGH4`fbwo1OmNU%x0 f"iȑcm5_{4NokOQ#췞=iVG,MJ`痻 lnM^^d3Fsg~̽9~>ya:bk9;Y"T~ HoN^Ѩ{ +x| c?kK z0b0#tblAH ֊ jwovy'x̼>#hÆML?FswS6sByy(Y e vc8;{Qg>$:$ ̬1w?hz9fR FaS%yf/9E_8C'nFGG|͕/ܺ#n^煻$Hguњ5oOXmykBeb\p"Tyʏ^T& F fV v .wP,0k`r:=a@4ꞺF ՟ EJ葖HskkUE<l~c@8ɇ()twdXPh0b 88atdd"QC5 ӻ6杍2d_On&ńrO H0YN؟ IzsL9SFN>s :i9jTϪ@ش! 0D^ЇQnpY L,ёQv“Fjvoii-ͶE B]ojj}T7jFQ pj#`'Hak2t6D bJ}-  ,4d`lP{ZB(Eav[W0:*s<-2o.u܈VORݻwѡѱ*..kxTU +Ba+:i߹ A47+y:ۚW.<1l`h+O ןCF(lz"úkuCȓ'e3XрtrI%cRð\.C PZDCuSU,VIe.* zc_Z- 6a\8]Ik`:b,̠>NWnz0cE3e"S׬`oN6{]Q sb.0|p&Ro{"w ޥnU<~:t$:R$^ )zF|(D"I4eEn0Q] ֓׆cEGLdH@Y=[fYɈ@b"}=88@1Y)W!@5aQ3- W;ʆZ9ȉ9/2rOb$-y(E-)uAjg8z|`XgaꔥPBn_x `gPD}%sƓ(x*UW_: qV @CD/|۳ t8L[Əo{?`U#`:1yl4N>YL:b 062*5p;Spt$<^'y{@"qnjGR Dɶm7i9B\#  t\(*OZHh!w=2/lZ 02,@i, &2d0bS =О! `Z%ZQф)8) >qRi>kSx$%hp>ۀ- PO}FUI\xR @U_$pQ9Vض-0O⛗H5_N2tN.[Asd8 YP$.lbPQNx\E' &,l1[>G aF;)/#mleOXQBOE)kE47$քU@zB1 hSt|V kDyؖ(.f۞!$J_KV8;kuqxq#+ ME?if^J6l J]'YA'+zt\6[ ?0:vHZR{e: XВTQ)٠I> QY@,f0exB×$qOUgFbV ,#{$'222|fVۑޯXjd@?%($3^G3կ cL:U;nI#ja.ʾAS+ %(ҁ<+5D&$.OS<+6-|jwr]Bdy{ <8lKSJyUH@4ȁ~(MEIX Nl h:# )z(a "JQma::E8x0gR%l3_Nb'N։07m9=2/@x(@0݃4f@ ɓ\@&iHclr*߻~^%˲2u H J+YIdCe*zzr#6{!85x~1V8e Y%2ua]J EAjZ 󆍀PLMf##zK>Rf!+6ei%n!®"W3M*?ű Vg h);h|T5ÊQJ+ ^Wr錨Ǘ(gfd5utF6Tyt^Y6J*hR$KuBW0TP~J= L*TY/ʉn`pmҡ"Pūʞ<phT-By0k!x0r% &Eߨ6~CWũAk<4]&c$IҵT5yt ~)7(!YIl@葙(NxR[HQr>7pC0{ ݔy8L'[&s (%t U={Sbi$l11+*UC:@#O$@-8Ȅ ݆*E3.5tt,@%)qX0 0Ιx"_<*Uvö(otnB 7ǔdp Gu O@DҊ|Ws ܊lGnLw쀅5EeҦ Hő+ےDf5`ښ}@'iaA [z|Lc/~ TorD\yc,Ef!#jbJ˜%OV#($gsKF#J)n隐ҟ3DmpEp%ZMӚV%3 ;8N%&hD$΋ί݄]؈'XH!P%:DI[${Qg- ST,W`(ϿOh( Kt).1 $ᚙ^#6 yDaDhsWR@+#?ndBсAtt7/A @Fl0؋rh% Ejp`&¬prUG@"aNHR,xߗS- B@DhqKL 2 _:ŝ s}w+}$5'MYߊqbݸx?Sي2 \.R6bQRv`H> Z*'FX4u5wdQSqt,O˟eƍ o| p==Pj[i~#w̍NE.Jry x!,܀6VTOݥD@g# qM'/{/0 Tྨ.o.kMzs8уiִ@Cڽ&UZ0PGFa#h׀osIVeOxZLb84( T7,)`pbʎn?u@{rbQ;@8P̚Ŷ$cnǢh M*סI/[^nPI?> a,\{O*T]QBϒTlSU\<=k cyQdj { Q>e^ܟmaۧV3!B}"wϽ~o@#bY0,2fI]'f 2:s]oAݳ XHݢBFQ1$>(!oԺO3r_b!4r`$岒S=K?zC9`ZO`w6\*: ]HюW (%'_g7pÇg ha#R*x"p?P[.9r˕4߈|EHWA!"o:in'uN UEY]ŭ8 C ֐ Rq4![CPBV-ցgCp*H-kV4F} S]Dz%-ﳥ>ϵVD` ճ:Xxi`>ƪCxD$?m%#IXS @?~)P(ԏN\9ūr_ pԁzˌȁ4(qtiE҄rԚ*Cmw8IY%BIla5 0@pkeCX]H8?aṡ(VR(5!кRm"l:p#w06H#YW 0tcu*٦~>aRϰo` ,|BklB}%Bjh;0:mgπG u1Z!Y .IɁ3[H=8.\w 2vlbf\ vlƄ' S'L>aFr:0,D0+ڞEWΗ~ )>2 ܛl ^8/) ƫOq. $:s8F[ ~%]+#% r!34\Zгh+G (v8 #ƥNPϮ͑F 9sr|/*rU +>bP4VN렬b"}7KkJH~DIְ4@BSTZV}dq{nE$Ψp%rw"wzpJw!_@N0jYdP+<bg ViѹD \k'kɰa=G[Bh f|_1͟/̋M-գFdb-OF6@yJS*h&mT@=VB(H%8]zyZ0Hy[2~gT#lYRʝSV6¢X&\V[UͯfWYca|hYhwj1UUлUʏ\"36d~R n/2ؿͿj q LKC1Ůt,tL~bYV P{<@&pd|x?FJkG``U'PQRb诹g(Z3rYea؈ğcB"/DM⭏s^C>9dYt8 =a˵ṭteɔP`/@Xswx UUjWSsgl*bjn7y+D1'!Jp`q(͏Lި<Q"ZRe;)(T샇R9b#o `ө_T]En˼|?LVp9kU3~L=E$:8DЭN._ X2i ?H3IJ{ eTi$XBkEh}8$e*E+[U,B 5[[19v|t*/Zڹ@rgt&cBVGpˇ vI Fhe&ʏ$) 0Ѧ4,U,Z4ٸPVexC "!}ږ<9nu<,B7j ~ +} % \q|DQi2"iۺL;3RQL`*8Ovmkl;/?[UD_]˴ ru%xũ:x_d"}V` ߻* A @?%idsH8!uTi` a]Bw}) &%ԏBl%rrPU꾔m_>@rydbF"FޔlPOR6] UяqF2B|_|뭷T3 ps;I5(թuHQ-T= +e"eћQXEij Q@钿q[IEzr O< nܻp. H_3c#",Z6#ًEA}$P]NUQh NBVQA s~lQZ=A'$7O⒠KǑ b/o\DRU%"@[*ނͮMwo`⦒|\/Ra6ۄbpn_.[tp8Zֽ);ohL[\c9߂A3˒RviU 8P-CP4y[ M7nΦ_ [?o-+T8y2&Q.x?WƯ;V "J J @>TO"LArt qQ*YB BRad>6 LAEG :ܔR*hWuZ0(fph1> aUP(]# /a`ٚ+\3S渷~Ҁ@\]{̿F(Lx^4Dm\1#_]@)\#S8Ч A)};?gL"8# ua R TLD}C}Y/H6uOgi,'YTd0sե=]ƒU^ƺ>`^ٹ_C7U UzsPpy)_¥wFрk9b8w!`Vu?*DT2 *<2Xp2drr !:6HGZ\ϣ ZO&0/(siTsZ MJ<]lsT-qEE`JDz#6T1`H+F;V;ΔʳqNL25 գ0ndы:R״ @R_"F@(M|Գ9nϼw1E7?jgmV^zd!`'b|Br-Z>_0vh b])>:{RtY\I#6J)ZY`x ](.*&;H}^N^Qu^e #eMv'jC4:2VK%i0!s?;ړn=~vo2^^ ]Vi/.y7S },Y$ @~,j{.fII_&RV}i~RCeԉ9jkO&. rm`LRphpn6E`@nz䋔4v=" ߘ}ԜE%l x;d~6ؚk9n󊫎K. 98'irߛ./YGI! 7^X\'\ |Ls?3;U$"\WcQ25fu,pհ=8ށBL_[8E6RI{MC8 M,̩=S\?fVػ B=kjwS2\KyOZ#IENDB`( 8 ! 676!! !!!!!!!!!!!!!!!!!"!""""""""""""""""""""#"""###########999#$#$$$$$$$$$%$$$$$$$%%%%%%%%%%%%%%%%&%%%&&&&&&&&'&&'&&'''<<<'''''''(''(('(((((((((((((())))))))))))*)*)*********+*+++@@@++++++++,,,+,,,,,,,-,--,-----.-.-..-//./////////0//000000EED100111111111111222222332323344444444544444554555555555555III5565657667778  X !!777!!!!!!!!!!!!!!""!!!"!"""""""""""""""#"""#"###############999$$$$$$$$$$$$$$$$%$%%%%%%%%%%%%%%&%&&&&&&&&&&&''&'&''&''''<==('''''(('(((((((((())()())))))))))))*))***********++*++++@@@++,,++,,,,,,,,,-,,-,,-,---./..../././//////0//0/000000000EEE101111111111221222332333333433444444444455555555555555555JJI666776777777777778X888  ! !! 777!!!!!!!!!!!!!!!!!"!""""""""""""""""""#"################$#:::$$$$$$$$$$$$$$%%$%%%%%%%%%%%%%&%%&&&&&&&&&&&&'&&''&''''''<==''''''(((((((((((())()))))))))))**))************+**++++++@@@,++,,+,,,,,,,,,,,,-----....-.///./////////0/0000000000001EEE111111121221222223233434444444444444554555555555555555655III666777777777877888888888  ; !!!777!!!!!!!!!!!!"!!""!"""""""#""""""#"#"##################$$#:::$$$$%$$$$$%$%%%%%%%%%%%%%%&&&%&&&&&&&&&&&&&&&&'&'''''''''==='(((((()((((((())())))))))))))))*******+*****++++++++++++@@@+,,,,,,,,,,,,,,------.-...///./////////0/00/0000000000101EFE111111111222322333443444444444444455555555555555555665665JJJ677777787777888888888898989; > !!!!!!!!777!!!!!!!!!!"!"!"""""""""#"#""""##"#"###############$$$$$$$:::$$$$$$$$$%$$%%%%%%%%%%%%&%%&&&&&&&'&&&&&&&&''''''''''''''===((((((((((()(()))))))))))))))**************+++++++++++++,@A@,,,,,,,,,,,,----.-....../..///////0//0/000000000001001111EFE122222222323322334444444444444555555555555555555655575766KKK777777888788888888888989999;:9> ! ! ! !!!!!!!!!777!!!!!!!"!"""""""""""""""""""#"#############$###$$$$$$$$$$:::$$$$%$%%%%%%%%%%%%%%%%%%&&&&&&&&&&&&&&&'&''''''''''(''(''===(((((((()()))))))))))))))*)************++*++++++++++++,++AAA,,,,,-,-,--------..-././/////////0/0000000000000011111121EFE211222223332443444444444444555555555555555555565565666777KKK77877788888888888889999999999;;;;  ! ! !!! !!!!!!!!!!!!777!!!!!!"!!""""""""""""#"""""###################$$$$$$$$$$$::;%$$%%$%%%%%%%%%%&%&%%&&&&&&&&&&&&'&&'''''''''''''('(''(((===((()(()(()))))))*)*)))*)*)**********++*++++,+++++++,,+,,,AAA,,,,,,----.-.../..////////////00/000000010010111111111111FFF223333322343444444444454554555555555555555555665666776777KLK7878888888889989999999:::::;::;;;;<< V ! !!!!!!!!!!!!!!!787!!"!"!"""""""""""""""##"#################$##$$$$$$$$$%$$$:;:%%%%%%%%%%%%%%%%%&&&&&&&&&&&&&&&&'''''''''''''''(('((((((>>>((()(())())))))*)*))**********+**++++++++++++++++,,,,,,,,AAB-,,---..----..././//////0///00000000000010101111111111211FFF222323423444444445444555555555555555555655556666777777778KLK8888888889889899999:::::::;;;;;;;;;;V ! ! ! !!!!!!!!!!!!!!!!!!!787""!"""""""""""##""###"##############$###$#$$$$$$%$$$$$%$%:;;%%%%%%%%%%%%%%%&&%&&&&&&&&&''&''&''''''''''''((((((((((((>>>())))))))))))))**))**********+*+*++++++++++,+,,,,,,,,,,-,BAB--,.------/.././///////0/0/000000000000111111111222112222GFF332344444444444444454555555555555555556666766777777777777LLL888888888999999:99;::;::;;;;;;;<;;;< 6 ! ! !!!!!!!!!!!!!!!!!!"!!878""""""""""""""""#"###############$$$$$$$$$$$$$$$$$$$%%%%%;;;%%%%%%%%%%&%&&&&&&&&&&'&'''&''''''''''''''(''((((()((((((>>>)))))))))))))*)**********+***++++++++++,++,,,,,,,,,,,,,,,BBB-.--..-.././////////0//0000000000001111111111121221222322GHG422344444444454555555555555555555556665667777777777877887LLL888888888999999:::;;:;;;;;;;;;;<;<<<<<<6 ! ! !! !!!!!!!!!!!!"!!"!!"""888""""""""""""#"##""#############$##$$$$$$$$$$$$$$$$$%%%%%%;;;%%%%%%&%&&&&&&&&&&&&&&&''''''''''''('(''''((((((((((((())>>>))))))))))**************++++++++++++++++,,,,,,,,,,,-,,---BBC-/--.///////////0///0000000000010100111211112111221233233GGH344444444444455555555555555565566556667767777777887887888LLL8898999999:99:::::;;;;;;<;;;<<;<<<<<<<< !! !!!!!!!!!"!!!!!!!!!""""""""888""""#""#################$##$$$$##$$$$$$$$$$$$%%$$%%%%%%%%;;;%%%&%%&%&&&&&&&&&&&&'''&'''''''''(''('((((((((((()())))()>>>)))*))**********++***+++++++++++++++,,,,,,,,,,,,,,-----..CCC.../..////////////000000000010110111111211211222223323444HHH444454444545555555555555555565655566777777777787888888888LLL9889:9::::9:;::;;;;;;;;;;;;<<<<<<<<<<<< ! !!!! !!!!!!!!!!!!!!!!!!""!"""""""""888""""""#################$$##$$$$$$$$$$$$$$%%$%%%%%%%%%%%%%;;;&&%&&&&&&&&&&&&'&'&'''''''''''''('('((((((((((((()())))))>?>)))))***)*********++++++++++++,+,,,,,,,,,,,,,-,------..--CCD/////////////0/000000000000111111111112112222322232443444HHH444545455555555555555555565566666777777877778887888888888LLL9:9:9:;::;::;;;;;;;<;;<;<<;<<<<<<<<====667777677776777777777777778777887888888888CCC98999999999999999999999::::::::::::::;:;::;;;;;;;;;;;;;;;FFF;;;;;;;;;<<<<<<<<<=<<<<<==<=========>==>>=>>=>>>>>>>>>???IIJ??????????????@???@@@@@@@@@AA@@AAAAAAAAAAABAABBBBBCBBCCDCNNNDDDDDDDDDDDDDDDDDEEEEEEEEEEEEEEFFFFFFFFGFHFGGGGGHHHHHHHHHRSRHHHHIIIIIIIIIIIIIIIIIIIIJIJKJJKKKKKKKKKKKKLKLLLLLLLLLLMMMWWWMMMMNNNNNNNNNNNOOOOOOOOOOOOPOPPPPPPPQQQ !!!!!!!!!!!!!!!"!!!!!""!!!""""""""""#"888"""###############$##$$$$$$$$$$$$$$$%%$%%%%%%%%%%%%%&%%%&;;;&&&&&&&&&&&&&''''''''''''''((((((((((()((())())))))))))))???****+*******+*+++++++++++,+,,+,,,,,,,-,,-,--------./.-///DDD////////0000000000100111111111111112222222323333444444444III545555555555555555555666666777777777877878888888988899999NMN;9:;:;;;;;;;;;;<;;;;;<<<<=<<<<=====>===!! !!!!!!!!!!!!!"!"!!!"""""""""""""#"""""#988#############$#$$##$$$$$$$$$$$$$$%$$%%%%%%%%%%&%%%%%&&&&&;;<&&&&&&'&&'''''''''''''''(('('((((((()(((()))))))))))))**)???***+**+*+*+*+++++++++,,+,,,,,,,,,,,,-,,,-..-----///./////DDD0///0/000000000010111111111111111122223323333344444444554III5555555555555555667566767777777787877888888889888989999:9MMM;;;;;;;;;;;;<<;;<<<<<<<<<<<=<===>===>>?!!!!!!!!!!!!!!!!!!!""!"""""""""""""""""#"#999#############$#$$#$$$$$$$%$$$$%$$%%$%%%%%%%%%%%&%%&&&&&&&;;<&&&''&'''''''''''''(''''((((((((()(()(())))))))))))))****???***++*++*+++++++++,++++,,,,,,,,,,-,-------.-..../////////DDD0//000000000001111111111211211122332233434444444444444445III55555555555555556677677777777778887788888888898999:9:9;::NNN;;;;;;;;;;;<<<<<<<<<<<<<========?>=>>?>!!!!!!!!!!!!!!!!!!""!"""""""#""""""""""###999###########$$$$$$$$$$$$$$$$$$$%$%%%%%%%%%%%%%%&%&&&&&&&&&<<;'&&'&'''''''''''''(''(((((((()(((()())))))))))))*********@?@***+++++++++++++++,,,,,,,,,,,,--,---.-.--.././/./////////DDD000000000111110111111221211222232433433444444444544555555III555555555565666666777777777777878888888889899999:99::::::NNN;;;;;;<;<<<<<<<<<<<<==========>>>>?????!!!!!!!!!!!""!!!"""""""""""""""""#""######9:9######$$$$#$$$$$$$$$$$$$%$%%%$%%%%%%&%%%%%%&&%&&&&&&&&&&&<<<&'''''''''''('''('((((((((((()(()))))))*))))))*)*******+*?@@++*++++++++++,+,,,,,,,,,,,,,,,---.--.../...//////////0/0/DDD000000000000111111121222222222233344444444444544545555555III555555555666776677777777778888888888889989999:;9::;:9:;;;NON;;;<;;<;<<<<<<<<=<=<=====>>>>>????>>???!!!!!!!"!"!!"""""""""""""""""""#"#########999######$#$$$$$$$$$$$$$$$$%%$%%%%%%%%%%%%&%%&%&&&&&&&&&&&&&<<<'''''''''('''(((((((()((((())())))))))))))***************?@@++++++++,+++,+,,,,,,,,,,-,-,--..--./..-/////////////00000EED000001111111111111121222222223434444444444445455555555555III5556655657667777777777778888888888888889999:9::9;;:;:;;;;ONO;;<<<<<<<<<<<<<=======>>>>>>???????????!!!!!!!"!"!"""""""""""#"""#"####"#########9:9###$$$$$$$$$$$$%%$%%$%%$%%%%%%%%%%%%&%&&&%&&&&&&&&''&&&''<<<'''''''''''((((((((((((()(())))))))))))*))*************++@@@++++++,,+,,,,,,,,,,-,--,--,-.--.-/..////////////00//00000EEE010101111111211121222222333333344444444444555555555555555III5566665677777777777778888888888888899999:9:99:;:;;;;;;;;;NOO<<<<<<<<<<<===<====>=>>=>???????????@?@!!!!"""!""""""""""""#"#"##"###############9::$$#$$$$$$$$$$$$$$%$%%%%%%%%%%%%%%%%&&&&&&&&&&&&'&&''&''''<<<''''''((((((((((((((())()))))))))))))*)*********+++++++++@@@++++,+,,+,,,,,-,,,,-------.-.-./././/////////0/0000000000EEE001111111211112222333334344444444445454555555555555555555III6566777767777777778788888888988899999:9:::::;;;;;;;;;;;;=>>>>??????@?@???@?@@@!"""""""""""""""""""""#"###############$##:9:$$$$$$%$$$$%%%$%%%%%%%%%&%%%%%&%&&&&&&&&&&&&&&&'&&'''''''=<='''('),*K-,<((()((())))))))))))*))****************+++++++@@@+++,+,,,,,,,,,,,-------...-../..////////0//0/00/000000001EEE111111111122222223333344433444444444544555555555555555555JJJ667777777778777788888888888989999::::9:::;;;;;;;;;;<;;<<===>>>>>>>????????????@@@@A@"!""""""""""""""""""#############$##$$#$$$:::$$$$$$$$$$$$%%%%%%%%%%%%%%%&&%&&&&&&&&&&&&''&&'''''''''''<=B(&P*%;3i_QJ:8f++2)))))*)*)**)*************+++++++++++@@A++,,,,,,,,,,--------...../-//.///0//////0/000000000100110EEE111111222222222233333433444444544554555555555555555555667JKJ776777777777888888888888989999:::9::;::;;;;;;;;;;;<<<<<<=>>=>>>>???????????@@@@@A@A@A"""""""""""""""##"###############$#$#$#$$$:::$$$$$$$$%$%$%%%%%%%%%%%%%%%&&&&&&&&&&&&&&&'&'''''''(&4)%_/(,$,%93maj^l`e\QK64Y++0**********+**++++++++++++,+@A@,,,,,,,---,,.----.....-./////////////0/000000001000001111EFE111222222222232333444444445444555555555555555555565667766KKK777777877788888888888989999:99:::;::;;;;;;;;;;;;<<<<<<<<=>??????????????@@@@@@@@A@AAA"""""""""""""#"#################$$##$$$$$$:::$$$$%$%%%%%%%%%%%%%%%%%&&&&&&&&'&&&&&&&&''''''&>)%r,%,$-%-%,%:3l`j^j^j^k_l`cYMG64T++,*+++++++++++++,,,+AAA,,,,,,,-----.---.-...//.///////0////000000000100111111111FFF112222223333344444444444844?54D63\6.r<0~D5M===>==>??>?????????????@@@@@A@AAABABBA"""""""""#"###########$##$#$$#$#$$$$$$$$$$:::%%$%$%%%%%%%%%%%%%%%&&&&&&&&&&&&&&'&'&+(%M*%-%-%-%-%-%-%,%:3l`j^j^j^j^j^j^k_j^_VHD32J,,.++,,+,,,,AAA,-,,-,---------//.////////////0/0000000001100110111111211FFF221333333;22N11r-+3.;3@2K8W@aEhIpNxS[br¨īêé꧇Ցq~dgMsO?XE=@<;<=<<==PQP===?=>?>>?>?????????@@@@@@@A@AABABBABBB""""""""#"#"#######$##########$$$$$$$$$$$$:::$%%%%%%%%%%%%%&&%%&&&&&&'&&&&&'&3(%^*$-%-%-%-%-%-%-%-%,%;5laj^j^j^j^j^j^j^j^j^k_k_YRFA10C,,,AAA--,----..---././////////////0/000000000001101111112111112GFFN./z)***--52=8B9F:N=T@[CbFiIpNyT[eqéīéê¨w؅^iGzN:_RJ>>>????????????@@?@@?@@AA@AAAABBBBBBBBB"""""#############$$######$$$$$$$$$$$$$$$%;;:%%%%%%%%%%%%%&&&&&&&&&&''%=*%o+%,%-%-%-%-%-%-%-%-%-%,%<5laj^j^j^j^j^j^j^j^j^j^j^j^l`j^ZROK/.;...-.-..././////////////000000000000111111111111F//)),,))//111163;5@7G;M=S?[CcGiIqOyT\fr~êīƭêé}uqdRjByO?@?@??@@@@@A@@AAAABBBBBBBBBCBB""#""############$#$####$$$$$$$$$$$$$%%%%%;;;%%%%%%%%%&&%&&&&&)'%J*%-%-%-%-%-%-%-%-%-%-%-%-%-%,%<5maj^j^j^j^j^j^j^j^j^j^j^j^j^j^j^k_g]VN=;j11://///////00/000000000010010111111H./&'$$''))++--//1163;5@7G:N>T@[CcGiJqOyT\fr}ĪŬƭŬé|tja\ZTtEP:D@?@@@@AAAAAABBBBBBBBBBBCBC#############$##$#$$#$$$$$$$$$%$$$$%%%%%%%;;;%%%%%%%%&&&0(%[+%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%,%<5laj^j^j^j^j^j^j^j^j^j^j^j^j^j^j^j^j^j^l`g\RL=:b117000000100000001111600((##%%%%''((++----1063;5@7G:M=T@[CbFiJqOyT\fr}ĪƭƭŬê|rjb[XTQNl>[F=ABABBABBBBBBBBBBCBCCC###############$#$$$$$$$$$$$$$%$$$$%%%%%%%;;;%%%&%;)%l+$,$-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%,%;5laj^j^j^j^j^j^j^j^j^j^j^j^j^j^j^j^j^j^j^j^k_k`d[MG=:]103001111=/0######$$%%&&((**--..0063;5@7G:M6laj^j^j^j^j^j^j^j^j^j^j^j^j^j^j^j^j^j^j^j^j^j^j^k_j^`WNH51>##!!!!##$$$$''''**++--//52:4?6F9MYAaEhHoMyT\eq}¨Ŭƭƭī¨}skd^YUROKH}Ey@W>CCCCCCDDCEDCEDE$##$#$$$$$$$$$$$$$$$%%$$%%%%%%%%%&%%($k-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%,%A9maj^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^lab6s !!""$$$$&&((**,,.-2093>5D7L;R>YA`DhHoMyT[eq}¨Ŭƭƭê¨zrha[XSPMJ~G|Cx>yN9CDCECDECDDEEEEE$$$$$$$$$$$$$$$$%%%%%%%%%%%%%%%%%%%&)$n-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%,%A9maj^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^k_C>#" !!##$$$$&&''**++--3082>5D7K:R=Y@_CgGoMyS[dq}¨Ŭƭƭêxoga[VRPKH}Fz@k8IDBEDDDDEEEEEEEEEE$$$$$$$$$$$$$$%%$$%%%%%%%%%%%%%%%&&&)%r-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%,%A9maj^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^EAs**"" !!##$$$$''))++--2/71=4D7K:Q^AeEmIwPXbn{¨īŬê§vme]XTPLI}EzA]9DEEEEEEEEEEFFFFFGGGFGFGG$%%%%%%%%%%%%%%&%%&&&&&&&&&'&&&&&&&'(#y-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%,%B:maj^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^MG555555G22 ""##$$&&''**/,3-90A4G6O:V>^AeEmIwPXam{¨īīê}sia[WRNJH|Dv=eI=EEEEEEFEFEFFFFFFFGGFFGHG%%%%%%%%%%%&%&%&&&&&&&&&&&&&&&&&'''')%}-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%,%B:laj^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^LF555555555'' !!##$$%%''**/,3-90A4G6N9V=]@dDmIvPXamzéŬŬé{rh`ZUQMJ~FzAc7EEEEEEEEEFFFFFFGFFGFFGHHHHH%%%%%%%%%&%%&&&&&&&&&''&'&&'&&''''''*%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%,%C;maj^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^LF555555555M11 """"$$$$&&)(.+3-8/@3G6M8U<]@dClIuOW`mzéīīéyof_YTPLI}Ez@qL;EEEFEEEEEGFFFFGFFGGGGHHHHHH%&%%%%&&%&&&&&&&&&&&&'&'''&''''''''(+%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%,%E=maj^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^LF555555655565&& ""$$$$%%('.+3,8/?2F5M8U<\?dClHuNW`mzéīê¨vmd\WROJ~G{Ci:GEEFEFEFFFFFGFFFGFGGHHHHHHHHHH%%&%%&&&&&&&&&&&&&'&&''&'''''''''''(+%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%,%E1E4L7T;\?dCkGtM~V`lzéīê¨~sja[UQMI}E{BQ:EEFFFFFFFFFGGGGHHGHHHHHHHHHHHH%%&&&&&&&&&&&&&&&&'&&''''''''''''''))$-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%,%DbAjFsM~U`kzéêé{qh`YTPLH|Cn;LFCEFFGFFFFFGGGHGGHGHHHHHHHHHHIII&%&&&&&&&&&&&&&''''''''''''''(('(''))#-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%,%DbAjFsM}U_kzéêéyoe]XROJ~G{CW9EFFFFFFFFFGGGGGHHGHHHHHHHIHHHIIII&&&&&&&&&''&'&&'''''('''''('(('((''++%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%,%D_I@GGFGGFFGFHHHHHHHHHHHHHIHIIIIIIJIIJJJ&&&'&''''''''''('''('(((((((((((()(.,%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%,%E=maj^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^RU T U U T T S R x8!!!!##%$)&-'4*;-A/I3P6X;`?hCqI|S\ix¨ézoe\WPLI|Dc;FFGGGGGGGHHHHHHHHHHHHHHIJIJIIIJIKJKJJJK<<<<=<<<<=<<===========>==>>>>>>><<>-&-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%,%E=laj^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^UW X Z Z Y X X W P & ""$$($-'3):,A/H2P6X:`>hCqI{R\ix¨éwla[TPK~F{B{aUZYYYZZZZZZZZZZZ[ZZZZ[[Z[\[[\\]\]\]\\^]]'''''''''('''((((((((((((()))()))''+-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%,%E=laj^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^[Y \ _ _ ^ ] ] \ Z 9!!""##'$-'2(9,@.G1O5W9`>hCqIzQ\hw¨¨si`XSNI}Ff;YZYGHGHHHHHHHHHHHHHIIIIIIIJJJIKKJKKJLKLKKL''''''''('''('(((((((((()())))))))(.,%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%,%E=laj^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^_[ ` d d c b b ` _(U # ##'$,&1'9+?-F0O5V8_=hCoHzP[hw¨¨|qg]WQNIzAtN=ZZZHHHHHHHHHHHHIIIIIIJIIJIJKJJKJJKLKLKKKKM'('('''((((((((((((((())))))))))))(1+$-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%,%G>laj^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^c[ d i i i h h f d c: #"'$+$2(7*?-E/N4V8^,D.M3T6^laj^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^i`lvuutsrpol4! &#*$0&6(=+D.L2U6\:e@nFxOYfv§si_XQM~Go;MHFHHH[Z[HHHIIIIIIIJIJJJJKKJKKKKKKLLLLLLMKLMMMMM((((((((()(()(()())))))))))*))****)6-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%,%G>maj^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^i^p||{{zywusLY " %")#.$5'<*C-K1S5\:e@nFxNYfu§|pf\UPK~FY;HHHHHH[Z[IIIIIIJIIJKJJKJKKJKKKLKLLLLMLMMMMMMMMMM(((((((((((()))))))*))*)))*******((1-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%,%G>maj^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^u }|zs 0# )#.$5'<*B,J0S5[9d>mEwMWfuznd[SNIw?]KBHHHIHH[Z[IIIIJJIIJJJJKKKKKKKKKKLLLMMMMMMMMNMMMMN((((((())))())))))))))))*********)(5-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%,%F>l`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^z)         ~ oS%")#.$4&<*B,I.R4[8c=lDwMWetwkaXQLHb;HHHHHHIIH[[[IIJIJJIJJKJKKKKKKKKLMMMMLMMMMMMMMMMMMNM()((()))))))))**)))*)**)******+**))9-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%,%H?l`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^k_{          { .(".$3%:(A+H-Q2Z7c=lCvLVdtsh_WPIzChM?IHIHHHIII[\[IIIKJKKKJKKKKKKLKLLLMMMMMMMMMMMMMMMNNNN((()))))))))))*)************+**+**)=-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%,%/'2*1+95UMe[i^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^&          S'!-#3%9'A*H-P1Y6bPJ]Tk_j^k_j^j^j^j^j^j^j^j^j^j^j^j^j^j^j^j^j^j^j^j^2   / -,"2$9'@)G,O0X5`:kAuJUbr{nbYQL}EyQ=IIHIIIIIIJII\\\JJJKKKLKLMLLMLMMLMMMMMMMMMMNNMNMNNONNOO)))))*))))))***********+++++++++++*D-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%/'0)3-.++*))))******************++..:8KFWOg]j^j^j^j^j^j^j^j^j^j^j^j^j^j^j^j^j^j^"?O+!2$8&?(G,N/X5_9jAtITbqxk_XPIl=JIHIIIJIIIIJKJJ]]]KLKKKKKKKMLMMMMMMMMMMMMMNMMNNNONNOONNNO)))**)**)***********++**+++++++++*)>,$-%-%-%-%-%-%-%-%-%-%+$2*0(2-,+))))))********************************++++42D@QJ_Vj^j^i^j^j^j^j^j^j^j^j^j^j^j^%G !!   B/!1#6$?(F+N.U2_8i@tHSbquh]UN~GV>IIIJJJJJJIJJJJK]]]LLKKLLLLMLMMMMMMMMMMMMNNNNNONNOONOPNPPP*))*))********+***+++++++++++++++))B,%-%-%-%-%-%-%-%.'1)0+.+,*))))****************************************************.-=9LFXOi^i^k_j^j^j^j^j^j^la$;!"#$$%%$$#" O0"6$=&E*M-U1^7h?sG~Raq~qd[SLq>OIGIIIIJJJKJKKKKKK]]]KLLLMMMMMMMMMMMMMMMMMNNMNNOOOOPOOPPPPPP)))************++*+++++++++,,+,,,+)E,%-%-%-%-%2*2+1,.,))))))****************************************************************++++43EAQK`Wi^j^j^j^k_*I%'(()*+**('%#L2"6$<%E)L,T0]6g=rF~R`q{naXPJY>IIIIIIKJJKJKKKKKLK^^^LMKLLMMMMMMMMNMMMMNMMNNONONOOONOOPPPPPP*********+**+*+++++++,+++++,,,,,,+)J,$.&5,4.4.-+)))*))******************************************************************************++++..<9JEXPh]3Z)+-.//0 0!/ .,*('J6#<%D(L,S/\5g=qE}P_pxk_VNwBVJEJJJJJKKKKKKKLKKKLM^_^MMMMMMMMMMMNMNNNNNNNNNNNOONOOPPPPPPPPPP**********+++++++++++,++,,,,,,,,,*)H-(0,+*))))****************************************************************************************))))*-)>)[*i)%-/22!5#6$7%6&6&4%3#0 ,*_8$;$C'L,S/\5e;qE|O^puh]SM^:9p,+(())))))))************************************************************************)))))/%F'g%O&-(*-/26 8#:%<(>*>+>-=,<+9*6&3#0 .L ;$B&J*R.[3e:pC{N^oqdZP{E^LDIJJKKJKKKKKKLKLLLLMML___MMMMMMMNMNNNNNNOOOPNNPPOPPPPPPPPPPQPPPP*+++++++++++++,+,++,,,,,,,,,,,-,------.-.-DCD./////..4-->,,\++*+++*****)))**************************************************))***+(4%M#nu JJJKJKKKLKLLLKLMMLLMLMMM___MMMMNNNNNNNNNNPOONOOOPPPPPPPPPQPPPPQQQP@@@@@@@@@@@@@A@AAAAAAAAAAAAAABBBBCDCBCCDCDNNNDDDDDDDDDDDDDDDEDEEEEDEFBBPCCr@@8800,,))))))********************************))))*,&9#P sb1 !#%(*-/36:#>&B*E/K3K5O:O:Q>O=L;I9D4A0;+4%8 I A%H(Q,Y1c8nAyL[n~yk_T~H|`S\]\]]]]]]^]]^]_^_^______hhh_______`_``````aaaaaaabababababbbbbbbcb+++++++++++,,+,,,,,,,,-,-,,--.--.---..-/..DDD//////0//00000000000011011111112121121210A//S/.t++++**))))))****************))(-!: SlB$!#$'*-159=#A'D+I0N5Q9V>ZBYDYEYFUCRAN=H7A0:*4$z@$H'Q,X/b6m@yKZl}ug[Qi?JJJKKKLKKLMKLKLMMMMMMMMMMMM___NNNNNNNNNOOOPPOPPOPPPPPPPPPPPPPPQQQQRQR++++++++,,,+,,,,,,,,,,-------..-...///.///DDD///00/00000000000111111111111222122232242443344444443422;@@Y00v,,**(,**))**'/:Omb.v   !#%'*.159>!B&H-M3R8W=\C_GaKdOdPbO^LZHUCM=G6@.8'D!G"F%O*W.a5l>yKYk}rdXO}S?KKKKLKLLMLMMMMMMMMMMMNMMMMN___NNOOOOOPPOPOPPPPPPPPPPPPPPPPQPQQQRQQRRR,++++,,+,,,,,,,,-,,,,---.-.--/.-.././/////DDD//0000000000001110111111111221222322333323443444444454455III555555445KL0JVT+ c mtz    #%(*.16:? D&I,O3T9[@`EeLjQmVpZnZlYiVbQ]LUDMwHYk}}oaVrCNKJKMKKKMMMMMMMMMMMMMMMNMMNNNN_``NNOOOOOOPPPPPPPPPPPPQQPPQQQQQQQRRRRQRRR+++,+,,,,,,,,,--,----------....///////////DDD000000000100111111111111221221222323334444444444544555555III555555555N Y ] c i ou|    "%'*-17:@!F%K-P4V:^BeHkOqWu]yb{dxdvcq_lZcR\KRBJ8@/8'L H$L'U,_3kaEiMrVy]elsvyyvozhp^gU[IQ>G4=,4$UM$S)]0i:uEVgxsdY^@LLLLLLMMMMMMMNMMMMMMNNNNNNNOOOOOOa`aPPPPPPPPPPPPQPPQQPQQQSRQRRSRRSRSSSRSSSS,,,,,,,,--------.-....///////////0/0000000EED100001111111212121222222334434443444444544544555555555555IIJ565566666G Z _ f kry    !%(+/58!?&E+L0S7Z=bFjNsW|_iqw}|vmvbjX^LS@I6?-5%/dS)\/h8tDUgw~oa~M\MGLLMMLMMMMMMMMMMNNMNNNNNNNNNNOOPOPaaaPPPPPPPPPPPPPPQQQQQQQRSQSSRRSSSSSSSSSSS,,,--,-------.-....//////0/0///0/000000000EEE100111111111222222322332434434444444444554555555555555555III576767777)@) Z ` f lry    #&*.37!=&C+I/R7Y=aDkNtX}`js|{qxelZ`NTAJ7@.7%/_R&[-g8rBReuzk]dBLLMLMMMMMMMMMMMMNMNNNNNNOONPONOOPPOPaaaPPPPPPPPPQQQQQRRQQRQRQSRSSRSSSSSSSSSSSS,,----..--...../..//////0//00/000000000000EEE111111111212222222222333444444444454554555555555555555665JJI7666777771:2 Y ` e lsz   !$(,16!<%A)H/Q6Y>bEkNuW}`js~|pzfmZ`MUAI6@-6$/+b!Z,e5rAQcswgScNEMMMMMMMMMMMMMMMNNNNONNNNOOOPOOPPOPPPbbaPPPQPQPQQQQQQRQQRQRRRRRRSRSSSSSSSSSSSST--,---.-..-///.///////////0000000000000001EEE111111221222322333343444444444544544555555555555555555676JJI777777777878S ` f msz    "%).2 8#@)F/M4V<_CiMrU{_iu~}qyelX`KS@I5?,6$.(jZ,d4qAPbqqemHMMLMMMMMMMMMNNNNMNNONNNNOOOOPPPPPPPPPPPabbQPPQPPQQRRQQQQRRRSSSSSSSSSSSSSSTSSSSTTT----../-.//////////////0000000000000101111EFE111112222222222334434444444444455555555555555555556656767KKK777777777888#G# _ f lsz    "&+05";'B+I2R:\BdInTz_hs|{nwcjU^IR=G3=*5#-'2V+c2o>~M`q||n_qRDMMMMMMMMMMMMNNNONNONNOOPOPOPPPPPPPPPPPPbbbQPQQQQRRQQQRRRSRRSSSSSSSSSSSSSTTSTTTUTT-.--.////////////////000000000010110111111FFF211122223323333444444444444555555555555555555656767577767KKK7778778888882<2 ^ e kry     #',1 7$>*D/M6U=`GiOu[~doyvjr^gQZFO;E1<)3!,&2x+L5b1n=}M^ozxixNPMLMMMMMMMNMNMNNNNONOPOOOPOPPOPPPPPPPPPQPPbbbQQQRRQRQRRSRSRSRSSSSSSSSSTSSSTTTTTTTUTT/.././//////////000/0000000000110111111111FFF222223333333444444444444444555555555555555565666766777777KKK877788888888888R d j ry      #(,2 7%?+G2P:YAcKoVw^js{pzdnXbMWAL7A.9'1*'@[?\IC^/m;|L^mx~sh[CMMMMMMMMMNMMNNOOOOPNOOOOPOPPPPPPPPPPQPPQQPcbbRRQRRQRRSRSSSSSSSSSSSSSSSSSTSSTTTUTTUTU////////////00/00/000000000111111111111111GFF322333333434444444444555555555555555565555665775767777778KKK8888888888889980@/ c k qx     #(-2!:'B-H4Q;[EeOoXzcnx}rit^hR\GQ

+6#.)2*IIIJIJT4l9zIZly{nTUNKMMMMMNNNNNNOONNOOOPOOPPPPPPPPPPPPPPQQPQQQQcccRRRRRRSSRSSSSSSSSSSSTSTTTSTTTTUUTTUTUUU///////0/0//000000000000111111111211121222GGF343433444444444444545555555555555556566666666677777777777KLK888888898988:99:9:U i p w ~     $(,2!:'@-J6Q=[FfPoZ{fny}ukw`lVbKWAL7C.;'3!+)BXAIIJIJJdKBg6xFWkywiaFMMMMMMMNNOONOONOOOOOPPPPPPPPPPPPPPQPQQQQQRRQQccbRRRRRSSSRSSSSTSSSSSSSTTTTTTTTUTUUUTTUVV/////////000000000000111111111111212222222HGG334444444454454455555555555555555566756666776777777778887LLL8888889899999:9::94@3e n u |     #'-2"8(A/I5P<[GeQp\xcmu}{skyaoWdMZDP;F2>)7#0*6}/HJIJIIJJJKKK\6wCVj|qZ]OHMMMNNNNONOONNONPOOPPPPPPPPQPPPQQPPQQRQQRRQRRRccbSRRSSSSSSSSSSSSSSTTTSTTTUUTUTTUTUUUUVVV////0/000000000010110111111111121222333333HGH433444444444445555555555555555655666666777777777877888888LLL888989999::9:::;:;;;;'M% l t {     "'+1!8'@.G4OJ6C.:'4".+B_?JJIJJKJKKKKKKLKLLKd;Mk}`dPFNNMNOOOONOOOOOPPOPPPPPPPPPPQPQQPQQQQQQQRRRRQRRRRdddSSSSSSSSSSSSTTTTTTTTUUUUVVUUUVVVUVVVVVV/00000000000111111121111121222322332443444IHH444444554555555555555555565666677777777777787887888888898MML9999:9:::;;:;;;;;;;;;;;;8@7hv ~     $).3":(A0I7Q?ZG`MhUo[tayf}i}j~j}gzdu_pYhRaKZDR=K6C/<(6#0+>s7JJJJKJKKJKKKKLMLKLLLLS?|Hl}pJNNNNNNNOOOOPPOPPPOPPPPPPPPQPPQQQQQQQRQQRQRRSSRRRSSSddeSSSSTSSTSTTTTTTUTUTTTUUUUUUVVVVVVVVVVWVDDDDDEEEEEEEEEEEFEFEFFFFFFFFFGHGFHHHHHHHHHRRRHHHHIIIIIIIIIIIIIIIIIIIJJJJJJIKJKKKKKKKKKKKLLLLLMLLMLLLMLWWWMMMNNNNNMNNNNNNONOOOOOOOOOOIVIr{     "'+1 6$=+C2K9R@YF`MeSjWn[p]q^r]p[mWhRcM]GVAP;I5B.<(6#0-GA\\\\\]]\\]]]]]]]^^^_^___d_]o@nscS__````aa`aaaaaaaaababbabbbbbbbbbbcccbcbcccddcddddddmmmddedeedeeeeeeeffffffgffgggggggggggggggg001010111111111121121222222332432434444444IHI455555555555555555655566766777777777777888888888888999999NMM:::::;;;;;;;;;;;;;;<<<<<<<<<<<4F3r     $).3":'>,E3K9Q?WD[I`McPfRfReQcN`K\GXBR=M8F2A-<'6#1-92IKIJKIKKKKKKKKKLMKLLMLMMMMMMMMW>n~XPNNONNOOOOOOPPPPPPPPPPPPQPPQQPRQQQQQRRRRRSRRSSSSSSSSTSdddTSSTSSTTTTTTUTUUUVVUUVVVVVVVVVVVVVVWWWV010110111111111211222232423423344444444544III55555555555555556576667777777777787788888888888899999999:NMN;9;:;;;;;;;;<;;<;<<<<<<<<=<======6F6r    "%*/4#9'?,D1I6O;R?VBXDZFZEYEWBT@Q*9&5"0.<{6IKIJJKKJKKLKKKKLLLLLLMMMMMMMMMMMMXNIe[FNONOOOPOOOPPPPPPPPPPPQPPQQQQQQQRQRRRSRRRRSSSSSSSSSSSSSdddTTTTTTTUUUUUUUTUVVVVVVVVVVVVVVWVVWWVWWV111111111121122222323433334444444444444455III555555555555555756777776777777777878888888898998999:9::;:NNN;;;;;;;;;;<;<;;<<<<=<<<<<====>=?=>>>:D9o   #'+/4"9'=+B.E2I5L8M9N:O:N:L8J5G2D/?+;'7#3 /0"@n==>=>>?>=>????>@>*_'   #'*.3!6$:'=+?-B.C/D1E0D/B.@,>):'7$4!0.7+GXDJJIJJJJJKKKKKKKLLLMMLMMMMMMMMMMMMMMNNNNNON```OOOOPPPPOPPPPPPPPPPQPQQQQQQQQRRRRSRRSRRSSSSSSSSSSSSSSSTTTeefUTUUTVUUUVVUVVVVVVVVVVVVVVVWVWWVWWWWWWW111112212222323243434434444444454555555555III555555555667677767777777787787888888998898999:::::::;;;;;NOO;;;<;<<<<<<<<<<<<<==<>>==>=>>>>??????????@?@?9K8"u  "&)-03"5$8%:';(;(;(;':&8%6#3!0.3%?s:HLIIJIKKKKJKKLKKKKLLLLLLMLMMMMMMMMMMNNMNNNNONNNN``aOPPPPPPPPPPPPPPQQPPQQQQQRRQQQSRRRRSSSSSSSSSSSSSSSTTTTTTTTfeeUTUTVUUUUVVVVVVVVVVVVVWVWWVVWWWWWWWWXWW111121222322333333444444444444554555555555III55555666677677777777778888888898888899999999:::::::;;;;;;OOO<<<;<<<<<<<<<=<<=======>>>>?>>???????????@@@@@A@AAA8S5${"$(*,/02 3!3!3!3!2 0.-5(>x7HOGJIIIJJIKJJJJKKKLKKLLLLLLLMMMMMMMMMMMNMMNNNONNONOPNOaaaPPOPPPPPPPQPPPPPQQQQQQRRRRRSQRSRSSSSSSSSSSSSSSSSTTTTTTTTUfffUUUVUUVVVVVVVVVVWVVWVWWWVWWWWWWXXWWWXXX122222222422434444444444444555555555555555III555566666777777777777888888888888889999::99:::::;;;;;;;;;OOO<<<<<<<<<<<=<<====>>=?>>?>????????????@@@@A@AA@AB@@BBABBBM`L.l)"!"$'(*+,,,+,1"9/Ai=X_WIIIIJIJJIKJJJKKKKKLKKLMLLLLMMMMMMMMNMMMNNNNMNNNNOOOOOOOOOaaaPPPPPPPPQQQPQQQQQQRQQRRRRRRRSSSSSSSSSSSSSSSTTTSTTTTTUTUTUfffUVVVVVVVVVVVVVVVVVVVVWWVWWWWWXXWYXWXXYX222222333333344444444445555555555555555655JII766676776777787777888888888888998999:::;;::::;;;;;;;;<;<;OOO<<<<=<<=<<=====>==?>>????????????@?@@@@AA@A@@AAAABBBBBBBBVUUCCCBDB>P<8d3/{)+")('(,.!1%5+GLFHIHIHI[[[IIJIJIJJJKKKKKKKKLLLLMLLMMLMMMNMMNNMMNMNNNNNNONOONOPONPPPaaaPPPPPPPPQQPQQQQQRQRQRRSQSRRSSSSSSSSSTSSSSTTSTTTTTTUTTUUUUgffVUVVVVVVVVVVVVVVVVWWWWWXXWWWWWYWWXYWXXY232323443434444444545455555555555555555565JII666776777777878888888888888999999:::9::;;:;;;;;;;;;<;;<<>>=>?>???????????@@@@AA@AAABAABBBBBBBBBBBBVUVCCCCCDCDDEDEEEEEEEEEEEEEFEFFFFFGFHGFGHHHHHHHHHHHHHHIHIIII\[[IJJIJJKKJKKKLLKLLLLLLMMMMMMMMMMMMMNMNNNNNNONNOOOPPOPOPPPPabaPPPPPPQQQQQQQQQRQRSRRSSRSSSSSSSSSTSSTSSTTTTTTTTTTTUTUUVUVgggVVVVVVVVVVVVVVWVWWWWWWWXXWWXXXXYXYXXYYY233344434444444444555555555555555555565656KKK7777777777788888888888899999999:9:;::;:;;;;;;;;;<;;<<<<<>>??>>???????????@@@@@@@@AAAABBABBBBBBBBBBBBBVVVCDDDEDCEDEEEEEEEEEEEEFEEFFFGGFGGFHGGHHHHHHHHHHHHHIHIIIIIJ\[[JJKKJJKKKLKKKLLLLKMMMMMMMMMMMMMNMNNNNONOOOPPOPOOPPPPPPPPPbbbPPPQPQQQQQQQQQQRRSRSSSSSSSSSSSSSSSSTSTTTTTTTTUUTVUUTVVVUVgggVVVVVVVVVWVWWWWWWWWWWXXWYXXXXXXYYYYYYYY324444444444544454555555555555555555665666KKJ777777777888888888888999999:::::9::;;;;;;;;;;;;<<<;<<<<<===>>?>>?????????@??@@@@@@ABABAAABBBBBBBBBBBCCCCCCVVWDDDDDDEEDEEEEEEFEEFEFFFFGFFGGFHHHHHHHHHHHHHHHIIIIIHJJJJJJ\\\KJKKKKLKKLLLLMLMMMMMMMMMMMMNMMNNNONNONOOOPOOPOOPPPPPPPPPPbbbQPQQQQQQQSRRRRRRSSSSSSSSSSSSSTTTTTTTUTTTTTUUUUTUUVUVVVVVVgggVVVVWVWVWWWWWWWXXWWWWXWXXXXXYXYYYYYYYYY344444444545455555555555555555556665676777KKK777787888888888988898999:9:9:;;::;;;;;;;;;;<;<<<<<<<<<=<>=>>>>=?>>???????@@???@@@@A@AAABBBBAABBBBBBBCBCCCCCCCCDVWVDDDEEEEEEEEEFEEFFFFFFFGFFGGGGGHHGHHHHHHHIHIHIIIIIIIJIJJKJ]]]KKKKKKKKLMLKLMLMMMMMMMMMMMMNNNNNNOONOOPOPPPPPPPPPPPPPPPQPbbbRQQQSQRQRRSRRSSSSSSSSSSSSSSSSTTSTTTUTTUTUUUTVVUVVVVVVVVVVgggVVVVVWWWVWWWWWWXWXXXXXXYYYXYXYYYYYYYYYY444444445555555555555555555555566766777777KLK778878888888988989999:9::;:::;;;:;;;;;;;;;<<<<<<<<<<=<===PPP>=>>>=??>?????????@?@@@@@A@A@AAAABBBBBBBBBBCBCBCCCDCDCEDDWVWDEEEEEEFEEEEFFFFFFFGGHGFHGGHHHHHHHHHHHHIHIIIIIIIIJJJJKKKJ]]]LKLLLLMLLMMMMMMMMMNMMNNNNMNNNNOONOOOPOPPPPPPPPQPPPPPQPQQQbbbRRRQRRRRSSSSSSSSSSSSSSSSSSTSSTTTUTTTTUUUUUVUUVVVVVVVVVVVVhggVWVWVWWXWWWWXXXXXXXYYYXXXYYYYYYYYYYYYYY544444455555555555555555565655666777777777KKL888888888988998999:::::::::;;;;;;;;;;;;<<<<<<<<<=<<=<====RPQ>?>??>???????????@@@@A@A@@@ABABBABBBBBBBBBCCBCCCCCDDDEDDDWWWEEEEEEEEEFFFGFFFGFHFHGGGHHHHHHHHHHHHIHIIIHJJJJIIJJKJKKKKK^]]MLLMMKMMMMMMMMMMMNNMMNNNNONNONOONPOPPPOPPPPPPPPQQPPPQPQQQdbbRRRRRSRSRSSSSSSSSSTSSTSTTTTUTTTTUTUUUTUUVVVVVVVVVVVVVVVWVgghVVWWWWWXXXWWXWXWYYXXXYYYYYYYYYYYZYYYZYY544455555555555555555565656676777777777787LLL888888998888:99:9:;:::;:;;;;;<;;;<<<<<<<<<<<<<=<<=====>>=QQQ?>??????????@??@@@@AA@AAAAABBBBBBBBBBBBCCCCCCCDDDCEDEDEEEWWWEEEFEFEEFGFGFGGFGFHGHHHHHHHHHHHHIHIIIIIIIIIIJJJIKJKKKKLKL]^^MMLMLMMMMMMMMMMMMMNNNNNNNOOOOOPOPPPPPPPPPPPPPPPPQQPRQQRQQcccQRSRRSSSSSSSSSSSTSTTSTTSTTTTTUUUTUVTUUUVVUVVVWVVVVVVWVVWWhhhWWWXWXWXXXWXYXXYXXYYYYYYYYYYYYYYYYYYYZZ555555555555555555556775666777777777777788LLL88898899999:::99:::;;;;;;;;;;;;;;<<<<<<<<<<==========>>>>QRR??????????@??@@A@A@AABAABBABBBBBBBBCCCCCCCCCDDCDDDEEEEEEEXWXEEFEFFFFFFGGGGFGGHHHHHHHHHHHHIHIIIIIIIIIJJKJJKJKKKKLKKLLM^^^MMMMMMMMMMMMNMNNNNNONONNOOPOOOPPPPPPPPPPPPPPPPQQQRQQQQRQRcccSRSSSSSSSSSSTSSTSTTSSTTTUTUTUUUUTVUVVVVVVVVVVWVVVWVVWVWWVhhhXXXWXXXWXYYXYYXYYYYYYYYYYYYYYYYYYZZZZZZ555555555555555555666676777777777877888888LML888998999:::::9::;;;;;;;;;;;;;<<<<<<<<<<<=<=====>>>=>>??>RRR??????@@?@@@@@@@AAAA@ABBBBBBBBBBBCCBCCCCCDDDDDDDEEEEEEEEEXXXEEEFFFFFFGGFHGGHHGHHHHHHHHHHHHIIIJJJJJJJJJKKKKKKKLKLKLLMM___MMMMMMMNMMNMNMNNNONOOPOOOPOPPPPPPPPPPPQPQPQQQQQQRRQQQRRSRddcSSSSSSSSSTSSTSSTTTTTTTUUUUUTUUVVVUUVVVVVVWVVVWVVVVWVVWWWWhhhXXXYXXXXYYXXYYXYYYYYYYYYYYYZYYYYYZZZZZZ555555555555555566667677777777777878888888LLL9999999::;:::;:;;;;;;;;;;<;<<;<<<<<<<=<<===>=>=>=>>>>????RRR???@@?@@@@@ABAA@AAAABBBBBBBBBBCCBCCCCCCDCDCDEDEDEEEEEEEEEXXXFFFFGFGGGGGHHHHHHHHHHHHHIIHIIIIIIIIIJIKKKJKKKKLKLLLMMLMMM___MMMMMMNMNNNMPNNOOOOOOPOPPPPPPPPPPPPPQPPQQQQQRRQRRRRSRSSSRdddSSSSSSTTSSSSSTTTTTTTUUTUUUUVVUVUVVVVVVVVVVVVVWVWWWWWWWWXXhhiXWXXXXXXXYYYYYYYYYYYYYYYZYZZYZZZZZZZZZZ555555555565665666677777777778788888888988MML99999::99:::;;;;;;<;;<;;<<<<<<<<<<<<==<==>>==>>>?????????RRS?@@@@@@@@AAAABABBBBBBCCBBBBCBCDCCDDDCCDDDDEEEEEEEEEEEEEFEXXXGGFHFGHGHHHHHHHHHHHHHIHIIIIJIIJJIJKJJKKKKKKKKLLLLLLLLMMMM___MMMMMMMNNNNNOONNOOPOOPPPPPPPPPPPPPPQQQQQQQQQQRQRRQQRSSSSSdddSSSTSSTSSTTTTTTTTTUTUUTUVVUVVVVVVVVVVVVVVWVVVWWWWWWWWWXXXhiiXYXYXYYYYYYYYYYYYYYYYYYYYZYZZZ[[ZZZ[ZZ\IIIIJIIJIJJJKJKKKKKKKKKKKKLLLLLLLLLLLMMLMMWWWMMMNMNNNNNNNNNOOOOOOOOOOPOPPPPOPPPPPPPPQQQQRPRQRRRRRRRRRR\\\SSSSSSSTSSTTUUTUUUUUUUUUUVUVVVVVWWVVWWWWWWWWXXXWWXXXXXXYXbbbZYZZZZZZZZZZZZ[ZZZZ[Z[Z[[[[[][\]\]]]]]]^]]^_]^_^_^_______hhh______```_aaaaa`aaaaaaaaaababbbbbbbbbccbbbccccddcccddddddmmmdddddddeeeeeefefffffeffgggggggghggggggghgghhhhhhhhhhihhhhqqqiiiiiiiiijiiiijjjijjjjjjjjjjkjjkkkklkkl555655656666777777777777887888988888889999MMN:::::;;;;;;;;;;;;<<<<<<<<<<==<<=======?>>>??>??????????@?SSS@@AAA@AAABABBBBBBBBBBCBCCCCCCCCCDDDDEEDEEEEEEFEEFFEFFFFFHYYYFHFHHHHHHHHHHHHIIHIIJIIIIJIJKJKKKKKKLKLLLLLLLMMMMMMMMMMMM___NNNNNNNOOOOPPOOOPPPPPPPPPPPQPPPQPQQQRQQQSQSSRSSRSSSSSSSTSdedTSTTTTTTTUTUUUUVUUVVVVUVVVVVVVVVVVVVVVVWWVWWWXWWWXWXYWWXWiiiYYYYYYYYYYYYYYYYYYYYZZZZZZZZZ[[\Z[\\[[Z555666576777777777778888888988888999999::9MNN;:::;;;;;;;;;;;<<<<<<<<<<<<=<====>=>=>>??>????????????@@@SSSA@AAAAABABBBBBBBBBCBBCCCCCCCCDDDDEEEEEEEEEEEFEFEFFGGGGGGGZZZHHHHHHHHHHHHHHHIIIIIIJJJKJKJKJKKKKLKLKKLLLLMMMMMMMMMMMMMM___NNNNNOOONPPPPPPPPPPPPPPPQPPQQQQQQRRRQRRQRRSSSSSSSSSSSSSSSdddTTTTUTUTTUUTUUUUVUVVVVVVVVVVVVVVVVVVVWWWWWWXWWYXXWYXXXYXXiiiYYYYYYYYYYYYYYZYYYZZZZZZZ[\ZZ[ZZ[]]]]]\665576776777777777888888888898889999::9:::NNN:;;;;;;;;<;;<<<<<<<<<<=<==<=====>?>>>>>???????@????@?@@@@TTSAABBBBBBBBBBCBBBCCCCCECDDDDDDDEEEEEEEEEEEEEFEGFFFFGFGGGGHZZZHHHHHHIHHHHHIJIIIIKJIKJJKKJKKKLKLLLLLLMMLMMMMMMMMMMNNNNNN__`NONONOPNOPPPPPPPPPPPPPQPQQQQRQQQRSQRRQRRRRSSSSSSTSSTTSTSTeedTTTTTTTTTUUVVUUUVVVVVVVVVVVVVWVWVWWVWWWXWXWXWYXYXXXYYXYYYiiiYYYYYYZYYYYZYYZZZZZZZ[ZZZZ[[ZZ[[[\][]\\766777777777877788888888888998999999:::;::NNN;;;;;;<;;<<<<<<<<=<<====>==?=>>?=?>???????@????@@@?@@A@AAUTTBBABBBBBBBBBCBBCCCDECCCDDDDEEEEEEEEEEEEEFFFFFGGGFHGHHHGHHZZZHHHHHIHIHHIIIIJJJIIKKKJJKKKKKKLLLLLMLMLMMMMMMMMMMMNNMNNNO``_OOOONOPOPPPPPPPPPPPPPQPQQQQRQQRQQQRRSRSSSSSSSSSSSSSTSSTTTeeeUUTTUUUUUUVTVVUVVVVVVVVVVVVWWVWWWXWWXWXWWXXXXYYXYXXYYYYYYiiiYYYYYZYYYZYZZZZZZ[Z[\Z[[\\Z]\][[]\]]]]]77767777778778888888888898889999::9:9:::;;;ONN;;;;<<<;<<<<=<<===<=====>>>>>>>?>??????????@@@@?A@@A@AAA@UUUBBBBCBBBBBCBCCCCDCCDDCEEEEEEEEEEEEEEFFFFFFFFGHGGHHHHHHHHHZZZIHHIIIIIHJIJIJKJJIJKKKKLKLKKLLLLLMMMMMMMMMMMMNMMNNNNNNONO`a`OOPPOPPPPPPPQQPPPPQQQRQQQRRQRRRRSSRSSRSSSSSSSSSSSSSSTTTTTefeTUUUUUVVVVVVVVVVVVVVVVVVVVWWWWWWWWWWXXWWWXXXXYXXYYXYYYYYYjiiZYYYYZYZZYZZZZZZ\ZZZ[[Z[[[]\\]]\]]]]]]]677788788888888888899999999:::9:::;;;;;;OOO<;;<<<<<<<<<<<<==<=====>>>=??>?????????@??@@@@@@A@ABAABBBUUUBBBBBBCCBCCCCCDCEDDEDDEEEEEEEEEFFEEEFFFGFFGHFFHHHHHHHHHHH[[ZIIHIIIIIJKIIKJJKKKKKKLKKLLLLLLMLLMMMMMMMMNNNMNNNNNONNONOOaa`PPPPPPPPPQQPQQQQQQQQQQQRRQQRRRSRRSSSSSSSSSSSSSSTTSSTUUTTUfefTUUUVUVVUVVVVVVVVVWVVVWVWWWWWWWWWWYXYXXXXXXYXYYXYYYYYYYYYiijYYYYYYZZZZZZZZZ\\Z\[Z[[\\]\\]]]]]]]]877V887888888888888999::9:::;;:;;;;;;;;;OOO<<<<<<<<<=<<<=======>>>=>>>???????????@?A@@@@AA@AAABBBBBBUUUBBCBCCCCCDDCDCCDDDDEEEEEEEEFFEFFFFFFFFGFGGGHGGHHHHHHHHHHH[Z[IHIIJJJJIJKJJKJKKKKKKLMKLMLMMMMMMMMMMMMMNMNNNNNNNONOOOOOOaaaPPPPPPPPPPPPQPQQQRQRQRQQRRRRRSSSSSSSSSSSSSSSTSTTTTTUTTTUUfffUTUVUVVVVVVVVVVVVVWVVWWWWWWWXWWWXXXYXXXYXXXXXYYYYYYYYYYYYjjjZYZZZZZZZZZZ[Z[\\][[Z\]\\]]]]]]]]]]]V88888888888889999:9999;:;:;;;;;;;;;;;;;OOO<<<<<<<=<==<===>=>=?>??>????????????@@@AA@@BABBBBABBBBBBBUVUBCBCCCDCDCDDDDDDEEEEEEEEEFEFFFFFFGFGGFGHGGHHHHHHIHHHHHHHH[[[IIIIIIKJKKKKKKKKKLLLLLLMMMLMMMMMMMMMMMNNNNNONOONPOPOPOPOOaaaPPPPPQPPPQQPQQQRQQRRQQRRSRSSSSSSSSSSSSSSSSTTTTTTTTUTUTUUUggfVVVVVVVVVVWVVVVVWVVWWWWWWXXXXXXXXXYXXXYYYYYYYYYYYYYYYYYYYjjjZYZZZZZZ\ZZ[\\]\[\[][]]]]]]]]]]]]]]]989 888889999:99;:;9;::;;;;;;;;;;;<<=>=>???????????????@@@@@@@A@AAAABBBBBBCBBBBVUUCCCDCCDDDDDEEDEEEEEEEEEEFFFFFFGFGGHFHGGHHHHHHIHHHIIIHIIII[[[JIJJJKJKKKKKKKLLLKMLMMMMMMMMMMMMMNNMNNNONNNNOOOPOOOOPPPPPbbaPPPQQQQQPRQQQQRRQQRQSSSRSSSSSSSSSSSSTSSTSTTTTTTUUUTUVUUUTggfVVVVVVVVVVVWVWVWWVWWWXXWXWXXXYXXYYYYYYYYYYYYYYYYYYYYYYYZZjjjZZZZZZZZZ\Z[[\[[\[]]]]]]]]]]]]]]]998>999999:;;;;;;;;;;;;<;;<;<<<<<>>>??????????@@?@?A@@AA@AAABBBBBBBBBBCBBCBVVVECDDDDEEEEEDEEEEEEEEEEFFFFFFFFGFGGGHHHHHHHHIHHHHHIIIIIIJI\\\IKJKKJKKKKKKLLLLMKMMMMMMMMMNMMNMMNNNNNNONOOPOOPPPOPPPPPPPbbbPQPQPQQQQRQQRRRSRRRRRSSSSSSSSSSTSTSSSTSTTTTTTUUUUTUUUUVUVgggVVVVVVWVVWWVVWWWWWXXWWXXXXXXXXXYXYYYYYYYYYYYYZYYZYYZYZZZZkkjZZZ\[\ZZZ][\]\\\]]]]]]]]]]]]]^>9:9;:;::::;;;;;;;;;<;;<<<<<<<<==>>?>??>???????????@@@@@@@@AAAAABBABBBBBBBBBBBCCCCWVVCCDDDDEEEEEEEEEEEEFEFFFFFFFFFGHGGHHHHHHHHHHHHIHIIIIIJJJJJ\\\KKJKKKLLKKLLLMLMMMMMMMMMMMMNMMNNNONNNOOOOOOPOOPPPPPPPPPPPbbbQQQQRQRQRQQQRRRRRRSSSSSSSSSSSSSSTTTSTTUTTTTUUVUVUUVVVVVVVgggVVVVVVVVWWWWWWWWWWWXWXXXXXXXYYXYYYYYYYYYYYYYYZYZZYYZZZZZZkljZ[[[[[\[\][]\]]]]]]]]]]]]]];:::;;;;;;<;<;;;;<<<<<<<<=<=PPP======>?=?>>??????@??@@?@@@@A@A@AAABBBBBBBBBBCBBBBBCCCDCDWVWDDEEEEEEEEEEEFEFFFFFFGGFFGFHFHHGGHHHHHHHHHIIIIIIJJIJJJJJJ]]\KKKKKKMLKMLLMMMMMMMMMMMMNNMMMNNNNOONPOOOOOPOPPPPPPPPPPPPPbbbRQQRQQSRQRSRRRRSSSSSSSSSTSSTTSTTTTTUTTTUUUVUTVVVVVVVVVVVVhggVVVWVVWWWWWWWXXXXWXXYYWXYXYYYYYYYYYYYYYYYZYYYZYZZZZ[ZZZZZkljZZ]\[Z\\\]\[]]]]]]]]]^]];;;<;;X;;;<<<<<<<<<<<<===PPP>==>>>?>=?????????@?@@@@A@@AA@ABBBABBBBBBBBBBBCCCCCDCCDEEWWWEEDEEEEEEFEEFFFFFFGFFHGGHGGHHHHHHIHHHHHHHIIIIIIIJJJKKJKKJ]]]KLLKKLMLLMMMMMMMMMMMNMMNNNNNNNNNNPOOPNOPPPPPPPPPPPQPPPQQPcbcRQQQQQRRRSSSSSSSSSSSSSSSSSSTTTTTTTTUUTTUUUUVVVVVVVVVVVVVVghgWWWWVVWWWWXWYWXXXXYYXYYYXYYYYYYYYYYYYYYZYYZYYZZZZZZ[ZZ[[\kkl[[\\[]]]]]]]]]]]]]X^^]<=<8<<<<<<=====>QQQ>>>>?>????????????@@?A@@@BAAABBBBBBBBBBBBBBBBCCCCDDDDDEEDWWWEEEEEEEEEEEFFFFFFFFGGGGGHHHHHHHHHHHHIIHIIIIIIIIJJJKJJKKKK^]]LLLLLLMMLMMMMMMMMMMNNNNNNNNNNOONOOOOPPPPPPPPPPQPPPQQQQQQQccbQRQRRRRRRSSSSSSSSSSSSSSTTSSUTTUTUUUTUVVUVUVVVVVVVWVWVVWVVghhWWWWWWWWWWXWWWXXYYYXYYYYYYYYYYYYYYYYYZZZZZZZZZZZZZZZZZ\\Zlmk[\]\\]]]]]]]8??(@  +,+!!!!!!!!!!"""""""""""######...$$$$$$$$$%%%%%%%%%%&&&&&'&&212'''((((((((()))))))*******+555+++,,,,,,---.-....//////000;::111111222323334444444555555???666777778 R ,,,!!!!!!!"!"""""""""#########///$$$$$$%$%%%%%%%&&&&&&'&&'''222'(((((((())))))*********+++666,,,,,,---.-.././/////000000;;;111222233434444444555555555@@@777777888888R S !!!,,,!!!!!!"""""""""#########$$$///$$$%$%%%%%%%&&&&&&&&'''''''222((((()))))))*********++++++666,,,-,---....//////000000111;<;222332334444444555555555666AAA777888888999:::R  !!!!!!,,,!!!""""""#""#########$$$$$$///%%$%%%%%%&&&&&&'&&''''''(''333)(())))))*********++++++,,,777--,---/..//////000000111111<<<323343444454555555555666777ABA888888999:::;:;;;; !!!!!!!!!,,,"""""""""#########$$$$$$$$$000%%%%%%&&&&&&&'&''''''((((((333)))))))********++++++,,,,,,777---...//////000000111111222==<344444444555555555666777777BBB888999::9;;;;;;<;< !!!!!!!!!"!!---""""""##########$$$$$$$$%%%000%%%&&&&&&'&&''''''(((((((((343))))********++++++,,,,,,---888...//////000000111111222333=>>444444555555555666777777888BBB999:::;::;;;;<<<<<++++,+,,,,,,,,,--,---555---........./////////000000888000111111121222222333333443<<<444445555555666666777777888AAA999::::::::;;;;;<<<<====>>>FFF>>??????????@@@AAAAAABBBBBBJJJDDDDDDEEEEEEFFFFFF !!!!!!!!!!!!""""""---#########$$$$$$$$$%%%%%%%%%000&&&&&&''''''((((((((())))))444******++++++,,,,,,------/..999///000000111111122323333444?>?555555555666777777888888999DCD;;;;;;<;;<<<<<====!!!!!!!!!!"!"""""""""...######$$$$$$$$$%%%%%%%%%&&&111'&&''''''(((((()(())))))***555++*++++++,,,,,,-----....///:::000000111111221332434444444???555555666777777888888999:::DED;;;;;<<<<<<<===>>>!!!!!!!!!"""""""""###...###$#$$$$$$$%%%%%%%%%&&&&&&111'''''''(((((((())))))******555++++++,,,,,,-----....//////:::000011111222223344444444555???555666777777888888999:::;::EEE<;<<<<=<==>=>>>?>?!!!!!!"""""""""######...$$$$$$$$$%%%%%%%%%&&&&&&&&&122'''((((((((())))))*******+*555+++,,,,,,----.-/..///0//000::;111111222233334444444555555???666777777888888899:9:;;;;;;EEE<<<<<<=>=>>>??????!!""""""""""#########/./$$$$$$%%%%%%%%%&&&&&&&&''''21=.*jD?--:))))))*********+++666,,,,,,,--..-...////0/000000;;;111222233333444444555555555@@@777777888888999:::::;;;;<;>>>??????@@@"""""""""#########$$$///$$$%%%%%%%%%&&&&&&&&'(&?*%q-%2,k_i^WOA=u-,5*+*++++++666,,,-,,-.-/..//////000000111;;;222233333544;54N72[>7_E>??????@@@AAA""""""#########$$$$$$///%%%%%%%%%&&&&&)(%O+%-%-%-%3,k_j^j^j^g\TM>;i--2777------/////////000000111111C;;e..1082D7T?eGtQ_x§ê¨ߠjiSiL>JGE?>>??????@@@AAABBB"""#########$$$$$$$$$000%%%%&%&%/)%_+%,%-%-%-%-%4-k_j^j^j^j^j^j^f[TM;9_//1//////000000111R..))**//42=6J@@@AAABBBBBB#########$$$$$$$$$%%%000&%<)%o,%-%-%-%-%-%-%-%3-k_j^j^j^j^j^j^j^j^j^cYOI:8W001400'(##%%))--31=6J;WAeGuQawéƭīveYR}JzR?BBBBBBCCC....../////////000)'K.),$-%-%-%-%-%-%-%-%-%5.k_j^j^j^j^j^j^j^j^j^j^j^j^bX*9 ##%%((,,20<5I:V@eGtPawêƭêrcXQKzD_NGLLLMMM###$$#$$$$$$%%%%%%*$-%-%-%-%-%-%-%-%-%-%-%6.k_j^j^j^j^j^j^j^j^j^j^j^j^k`(E ""$$''++1/<4H9U?dFtP`wêƭén_VOIzAcK?DCCDDD$$$$$$$$$%%%%%%%%%+$-%-%-%-%-%-%-%-%-%-%-%6/k_j^j^j^j^j^j^j^j^j^j^j^j^j^o3Y !!##&&**0.;3G8U>cEtO_wêŬ§|j]SM~Fm;a## ##%%((.-91F7T=cDrM^vêŬweYQJ|CV>EDEEEEFFE$$$%%%%%%&%%&&&&&&+$-%-%-%-%-%-%-%-%-%-%-%7/k_j^j^j^j^j^j^j^j^j^j^j^j^j^@=kw,, ""$$''.,80E6SJECEEEFFFFFF%%%%%%%%%&&&&&&&&&+$-%-%-%-%-%-%-%-%-%-%-%7/k_j^j^j^j^j^j^j^j^j^j^j^j^j^@=m944!!!!##&&,+6.D5R;aBqM\têêm]TL}EZ=EEEFEFFFFGGG%%%%%%&&&&&&'&&'''+%-%-%-%-%-%-%-%-%-%-%-%80k_j^j^j^j^j^j^j^j^j^j^j^j^j^@=q555++ ##%%+)5-C4Q:`ApK[sêé}iZQIwAPGBEEEFFFGGGHHH%%&&&&&&&'&&'''''(+$-%-%-%-%-%-%-%-%-%-%-%80k_j^j^j^j^j^j^j^j^j^j^j^j^j^B?y655@45!!!!$$*(4,A2O8_@oJ[sé¨weWN~F`?FFFFFFGGGHHHHHH&&&&&&&&&'''''''')+$-%-%-%-%-%-%-%-%-%-%-%80k_j^j^j^j^j^j^j^j^j^j^j^j^j^@At475777** ##(&3+@1N7^?nIYrér`TLzB\JBGFFGGGHHHHHHIII&&&''&''''''(((((*,%-%-%-%-%-%-%-%-%-%-%-%81k_j^j^j^j^j^j^j^j^j^j^j^j^j^,Pl M I7>! ##'%2*?/N6]>mHXq¨m\QHe>FFFGGGHHHHHHIIIJII111212222222333224,%-%-%-%-%-%-%-%-%-%-%-%81k_j^j^j^j^j^j^j^j^j^j^j^j^j^.Vm W V U 4!!&$0(=.L4\OI]TLx(+,-+(/:!@'P.b9xKhfSgDIIJKJJKKKUUUMLMMMMMMNNNNOOOPPP****+*++++++,,,,+3,*}..))))))**********************************)))+(@'d)d,115"9&:)9(4%.m>%O,`7vIgz`MeOEKJJKKKLLLVVVMMMNMNONOOOOPPPPPP555655666666777788888AAA99:88I88o7755//**))****************))).%E"f!P!!%*/5<&C-I4K8I7C3:*E A#M*^5tGet[rJSSSTTTUUUVVV]]\VWVWWWXXXYXXYYYYYY++++++,,,,,,-----....9:9///00000011111122121?00^//11**)*)*&/ AXkx6!%*19B'K1T<\E^J[ISBG69)k!K(\2sEclUvTEKKKLLLMMMMMMVVWNONOOOPPOPPPPPPRQQ+++,,,,,,-----....///:::000000111111222323333444454???545OW$ j x  %*2:E&O3]AhNqYt_o\cRTCC1U#J&[0qBafwKLKKLLLMMMMMMMNNWWWOOOPPPPPPQPQQQQRRR,+,,,,----.-...//////:::000111111222333344444445555???555S a mz  #*1:!E)R5aEpT~cotnr`^MJ88'h"Y.o@_{`[GLLLLMMMMMNNNNNNXXXOPPPPPQPQRQQRRRRRS,,,,,--.-..///////000;::111111222333444444544555555???666O b o|   '/8"D+R7bEsWiz||ieSN;;)^W+m=\|tSPLKMMMMMMNNMONNOOOXXXPPPPQQQQQRSRRSSSSS-----....//////000000;;;111222332434444444555555555@@@777"G" c o~  #*4 A)O5aEsVj}kfSO;;(,g$k;YxmcKMMMMMMMNMNNNOOOPPPYYYPQQQQQRRRRRSSSSSSS---/..//////000000111;;;122222334444444555555556666AAA7771=1 b o~  $.9%G0X@lRf{}{fbMK78&)wj*h7Vu}aWNJMMMNMMONNOOOPPPPPPYYYQQQRRRRRSSSSSSSTTT/..//////000000111111<<<333333444444555555555666777AAA888888V n|  %/=)L7_Ht\qrq[ZDE03"+LMEb5SrvpRMMMMMNNNOOOOPPPPPPQPPZZZRRRSSSSSSSSSTTTUTT//////000000111111221===433444444555555556666777777BBB8889990B0 k y   %/=+M9`Kt`rtxacLN9<(.:r5IIIV>MrkeSJNNNNONOOOPPPPPPQQQRRQ[ZZSRRSSSSSSTTTTTTUUU///000000111111222323>>>444444555555555666777777888BBB999:::;:;"U v   $-:)I7\HmZ}jvzxmv_eNR=B-3!2'IKIJJJULHwFtxWNNNNNNOOOPPPPPPQQQQQQRRR[[[SSSSSSTTTUUUUUUVVV::::::;;;<;;<<<===>>>FFF>>>?????????@@@AAAAAABBBBBBJJJDDDDDDEEEDFD j  !*5$C1R?`MlYuaxcu_lV_IQ>?555555555666777777888888999DCD:;;;;;;;;<<<:?:j  %.9'E2P=YF_K_K\FT?K6@,6"2$EYDKKJKKKLLLLMM`PH΀\ONNOOOPPPPPPQPPQQQRRRRSSSSS\\\TTTUTTUUUVVVVVVVVV111111222323344444444???555555666777777888888999:::DDD;;;;<;<<<==<>>==@=&e"  '/8&?,E2H5I5F2A,9&2 7,GRFJJKKKKLLLMMMMMMNNMdYTOOOPPPPPPPQPQQQRRRSSSSSSSSS\\]UUUUUUUVVVVVVVVWWW111222333434444454555???555666777777888888999:::;;;EEE<;<<<<<<<=>=>>>??????7P5"~ %+1 5#7$7$5"14&Am==?>>?????@@@@AAABBAEYC0p*) &'*-2&91Ca?QSQIJIKJJKKKLLLMMMMMMNNNNNOOOOXXYPPPQPPQQQRRRRSSSSSSSSTTTTTT^^^VVVVVVVVVWWWXWXXXX233433444445555555555@@@776777888888999:::;;:;;;<;;FFF<=<==>>>>??????@@@AAABBBBBBLLLCDDEDEEEEFEEGFFGGGHHHHHHIIISRSJJJKKKLLLMMMMMMNNNOONOOOPPPYYYPPPQQQRRRSSRSSSSSSTTTUUTUUU^^^VVVVVWWWWXWWXXXYXX334444444555555555666AAA777888888999:::::;;;;<<<<<>>??????@@@AAABBBBBBCCCMMMDEDEEEFEEFFFGGGHHHHHHIIHJJJSSTKKKLLLMMMMMMNMNONNOOPPPPPPPZYYQQQRRRRSSSSSSSTTTTTTUUUUVVV__^VVVWWWWWWXXXYXXYYY444445555555555666777AAA888888999:::;:;;;;<;;<<<<<=GGG>>>??????@@@AAABBBBBBCBCDDDNNNEEEFEEFFFGGGHHHHHHIIIIIJJJKUTTLLLMMMMMMNNNNONOOOPPPPPPPQQZZZRRRSSSSSSSSSTTTTTUUUUVVVVVV___WWWWWWXXXXYXYYYYYY444555555565666777777BBB888999::::;:;;;<<<<<<<=<===HHH??????@@@AAABBBBBBCCCDCDDEDNNNFEFFFFGGGHHHHHHIIIIJJKJJKKKUUUMMMMMMMNMNNNOOOPPPPPPQQPQQQZZ[RRSSSSSSSTTTTUTUUUVVVVVVVWV__`WWXXXXYXYYYYYYYYZY555555555666777777888BBB999::::;;;;;<<;<<<<====>>>>IHH???@@@AAABBBBBBCCCCCDDDDEEEOOOFFFGGGHHHHHHIIIJIJJJJKKKLLLVVVMMMNNNNOOOOOPPPPPPQQQRQQRRR[[[SSSSSSTTTUUUUUUVUVVVVVVVWWW`_`XXXYXXYYYYYYYYYZZZ????@?@@@AAAAAABBBBBBJJJDCDDDDEEEEEEFFFFFFGGGHHHHHHPPPIJIJKJKKKLLLLLLMMMNNNNNNOOOVVVQPPQQQQQQRRRSSRSTTTTTUUUUVV]]]VVVWWWXXXXXXYYYYYYZZZ[ZZ[[[bbb\\\\\\]]]^^^^^^__^_______``gggaaaaaaaaaabbbcbbbd555666777777888888999DDD:;;;;;<<<<<<=<===>>>>??????JIJAAABABBBBCBCCCDDDDEEEFEFFFGPPPHHHHHHIIIJIIJKJKKKLLLMMMMMMVVVNNNOOOPPPPPPQPPQQQRRRSSSSSS\\\TTTUUUUUUVVVVVVVVVWWVWXWXXXaaaYYYYYYYYYZZZZ[[\\\666777777888888999:::DDD;;;<<<<<<==<===>>>??????@@@KKJBBBBBBCCCDCDDDDEEEEEEFFFGGGQQQHHHHIIIJIKJJKKKLLLMMMMMMNNNWWWONOPPPPPPQQPQQQRRRRRSSSSTSS\\\TTTUUUUVVVVVVVVWWWWWXXXXYYYaaaYYYYYZZZZ[[Z[[\\\\7777778888889999::;::EEE;;<<<<======>>>??????@@@AAAKKKBBBCCCCDDDEEEEEEEEFFFGGGHHHQQQIIIJIJJJJKKKLLLMMMMMMNMNNNOXXXPPPPPPQPQQQQRRRSRSSSSSSSTTT]]]UUUVVVVVVVVVWWWXXXXXXYXXYYYaaaYYYZZZ[[Z[[\\\]]]]877888888999:::;;;;;;EEE<<<==<==>>>>??????@A@AAABBBLLLCCCDCCDDEEEEFFEFFGGGGHHHHHHRRRIJIJKJKKKLLLMMMMMMNNNONNOOOXXYPPPPPPQQQRRRSSSSSSSSSTTTTUT^^^VVVVVVVVVWWWWXWXXXXXXYYYYYYbbbZZZ[Z[[\[\]\]]]]]]888S999::::;;;;;;;>>??????@@@AAABBBBBBMLLDDDDDDEEEEEFFFFGGGHHHHHHIIIRRSJKKKKKLLLMMMMMMNNMONOOOOPPPYYYQQQQQQRRRSSRSSSSSSTTTTTTUUU^^^VVVVVVWWWXWXXXXYYYYYYYYYYYYbbbZZZ\[[\\\]]]]]]R::9Q::;;;;;<;<<>>??????@@@AAABBBBBBCCCMMMDDEEEEEEEFFFGGGHHHHHHIIIJJJTSSKKKLLLMMMMMMMMNOONOOOPPPPPPZYYRQQRRRRRRSSSSSSTTTUUUUUVVVV_^^VVVWWWWWWXXXXYYYYYYYYZYYZZZccc\[[\\\]]]]]]Q;;;;<;<<<===GGG>>>??????@@@AAABBBBBBCCCDDDNNNEEEEEEFFFGGGHHHHHHIIIJIJKJJTTTLLLMMMMMMNNNNNNOOOPPPPPPPQQZZZRRRSSSSSSSSSTTTUTUUUUVVVVVV___WWWWWWXXXXYYYYYYYYZYYZZZ[[[ccd\\]]]]]]](0`  5 )))!!!!!!!""""""""###+++$$$$$$$$$%%%%%%&&&&&&///'''(((((())))))***223+++,,,,,,--....///0/0888111211323434444444<<<6667777785d )))!!!!!!""""""######,,,$$$$$$%%%%%%&&&&&&'''///(((((()))))*****++333,,,,,,---...///000000899221323443444444555===777777888999d 5 !!!)))!!!""""""#######$$,,,$$$%%%%%%&&&&&&''''''000((())))))****+*+++444,,,---...///000000111999323444444444555665>>>777888999:::;;;5 !!!!!!***""""""######$#$$$$---%%%%%%&&&&&&''''''(((000))))))****+++++,,,444---...///000000111222:::444444444555666777???888999:::;;;;<< !!!!!!!!!***"""######$$#$$$$$$---%%%&&&&&&''''''((((((111)))***++*+++,,,,,,555...////00000111212322;;;444444555566777777?@?999:::;;;<;<<<<)))))))))******111++++++,,,,,,------444......//////000000111888222222333433444555==<777777888889999::;;;;BBB<<<<<<===>>>???@?@FFFBAABBBCCCCCDDDE!!!!!!!!!""""""+++###$$#$$$$$$%%%%%%...&&&''''''(((((())))))222++++++,,,,,,---...777000000111111332444444<<<555666777777888999AAA;;;;;<<<<===>>>!!!"!!""""""###+++###$$$$$$%%%%%%&&&...''''''(((((())))))***222+++,,,,,,---...///777000111122223344444444<<<666777777888999:::BBB<;;<<<===>>>???!!!""""""######,,,$$$$$$%%%%%%&&&&&&///(&@:7m++2))))))****++333,,,,,,---...///000888111111233444444444555===777777888999:::;;;CCC<<<===>>>???@@@""""""######$##,,,$$$%%%%%%&&&&&*(&P+%,$`Vg\SL=:i,,2+++343,,,---...///000000898112422B32\73sA7M>[Jk]naoc~dXiTKOC>?<>>???@@@AAA"""#########$$$---%%%%%%&&1)%`+$,$,$,$aVi]i]j^dZQJA>e..1...///000000301h22--10?6Q?cGxSlêêptTwSAC@?@@@AAABBB#########$$$$$$---&%=*%o,%,$,$,$,$,$aWi]i]i]i]j^i^bXOI:8V000R..%%&&++21?7P>cFxTlīīycVuHaK@BBBBBB+++,,,,,,---+*>-',$,$,$,$,$,$,$,$bWi]i]i]i]i]i]i]j^j^^Q!"""%%**0/>6O=bExSkŬĪt`TKrBJJJKKK$##$$$$$$%%%'$O,$,$,$,$,$,$,$,$,$cXi]i]i]i]i]i]i]i]i]eW!#!!$$((/.=4N;aDwRjŬéo\QHk>DDDEDD$$$$$$%%%%%%(%R,$,$,$,$,$,$,$,$,$cXi]i]i]i]i]i]i]i]i]eZ*- ##''.,<3M:`CvPiŬ¨iXN}ET?DDEEEE$$$%%%%%%&&&(%S,$,$,$,$,$,$,$,$,$cXi]i]i]i]i]i]i]i]i]f[=27!!""%%,+:1L9_BuOhī{cTKq?HEDEEEFFF%%%%%%&&&&&&)&V,$,$,$,$,$,$,$,$,$dYi]i]i]i]i]i]i]i]i]f[338))!!$$*)8/J7^@tOgĪu^Q~GY?EEEFFFGGG%%%&&&&&&''')&Y,$,$,$,$,$,$,$,$,$dYi]i]i]i]i]i]i]i]i]f[54=F33!!##)'6-H5\?rLfénZMvBPGDFFFGGGHHH&&&&&&'''''')&\,$,$,$,$,$,$,$,$,$dYi]i]i]i]i]i]i]i]i]g\);3191)(""'%5,G4[=rKd¨hUJ_@FFFGGGHHHIII&&&''''''(((*&_,$,$,$,$,$,$,$,$,$eZi]i]i]i]i]i]i]i]i]g]Q R 3F" &$3*E1Z;pIc§}bQ{EZKCGGGHHHIIIJJJ//////000000.*e,$,$,$,$,$,$,$,$,$eZi]i]i]i]i]i]i]i]i]h^] _ \3$#1(C/X:oHbu\MlHNNNOOOOOPQQQRRR'''(((((()))+'e,$,$,$,$,$,$,$,$,$eZi]i]i]i]i]i]i]i]i]i^j& n k>X $!0&A-V7mF`nV~HkUJHHHIIIJJJKKKLLL(((((())))))+'f,$,$,$,$,$,$,$,$+$fZi]i]i]i]i]i]i]i]i]j^v-~|w5.$?+T5lD_fRlCOOOIIIJJJKKKLLLMMM((())))))***+'h,$,$,$,$,$,$,$-%-&`Vj^j^i]i]i]i]i]i]i]j^ 2   \d,#>)R3jB]~`MzUCOOOJJJKKKLLLMMMMMM))))))***+++,'k,$,$,$,$.&.'-),*))**20@9<'P0h?[vYsEKIHPPPKKKLLLMMMNMMNON)))***+++++++'l-%/'-(,)+*))****************--:7HCVNcXj^.D%''$wq:%N-f=YmS[DJJIRRRLLLMMMMMMNNNOOO***++++++,,,,*[/-*)))**************************)))1)R20-3 7%7'3#5D"L+d:Wf{KPKHKJKRSSMMMMMMNNNOOOPPP223333343444555===76966P55v33--****))****)))*&5#Q!tm!:#*2;$E.M7M;G6:*w!J)b7T^eKRQRSRSYYYTTTUUUVVVWVVWWW+++,,,,,,---...77700000011122132233588O00j!9AWSu" $*4@#N3\BgPhT]LK:I&M&_4Q~wTWMILLLMMMTTTNNOOOOPPPPQPQRQ,,,,,,---...///777000111121333344444<<<555L cs "*4A%R5eIx\mor`YH@.v"]1}OznkLLLLMMMMMMUUUOOOPPPQPPRQRRRR,,,---...///000888111122333444444544<<<666 H dv  '2?'R7hKczmaOD2J[-zKvcdRJMMMMMMNNNVVVPPPPQQQQQRSRSSS---...///000000888112223444444555555===777-?- ev  +9$L3cH~b}m`LC0-k'xGr|wVMMMMMMNNNOOOVVWQPPQQRRRRSSSTSS...///000000111999223434444555555666>>>777888]u  !-?+T>oWs~waWB=*,pS>>???@??FFFAAABBBCCCADAg $1 A/Q>]JcOaLWAH4:&4'MXLRQQSSSWTR|YXUTVVVWVWWWWXXXYYY^__ZZZ[Z[[[\\\\]]]111122323444444<<<555666777777888999ABB;;;;<;<<<====?=)c%'1 ;)C0F2C/=)4"9/IOHKKKLLLMMMMMM\VSOOOPPPPQPQQQRRRSSSZZZTTTUUUVVVVVVWWW121332444444555<<<666777777888999:::BBB<<<<<<===>>>???@@@;L9/x(#$*.02#<2D`@IJJKKKLLLMMMMMMONNVVVPPPPQPQQQRRRSSSSTTZ[[UUUVVVVVVWWWXXX233434444444555>==777777888999:::;;;CCC<<<===>>>???@@@AAABBBJJJCEC@P?>[<@]>>777888999:::;;;<<;CCC===>>>???@@@AAABBBCCCJKKEEDEEEFFFGHGHHHIIIQQQKKKLLLMMMMMMONNOOPPPPWWWQRQRRRSSSSSTTTTUUU\\\VVVWWWXXXXXXYYY444444555665777???888999:::;;;<;;<<>>???@@@AAABBBBCCDCDKLKEEEFFFGGGHHHIIIJIJRQRLLLMMMMMMNNNOOOPPPQPPXXXRRRSSSSSSTTTUUUVVV\]]WWWXWWXXXYYYYYY444554666777777@@?999:::;;;;<;<<<===EEE???@@@AAABBBCCCCCDEEELLLFFFGGGHHHIIIJJJKKKSSSMMMNMMNNNOOOPPPQQQQQRYYYSSSTSSTTUUUUVVVVVV]]]XWXXXXYYYYYYZZZ<<<===>>>???@@@FFFAAABBBCCCCDDDDDEEELLLGGGHHHIIIJJJKJKKLLLLLSSSNNNOOOOOOPQPRRRSSSYYYTTTUUUVVVVVVWWWXXXYYY^__ZZZ[[[\[[\\\]]\]]]ccc_________```aaa665777777888999AAA;;;;;<<<<===>>>???GGGAAABBBCCCCCDEDEEEEFFFNNNHHHIIIJJJKKKLLLMMMTTTNNNOOOPPPQQQQQRRRRSSSZZZTTTUUUVVVVVVWWWXXX_^^YYYYYYZZZZ[[\\\777777888999:::BBB;;;<<<===>>>???@?@HHHBBBBBBCDDDEEEEEFFFGHGOOOIIIJJJKKKLLLMMMMMNUUUOOOPPPQPQQQQRRRSSSSSSZ[[UUUVVVVVVWWWXWXXXX___YYYZZZ[[[\\\\\]8775888999:::;;;CCC<<<===>>>???@@@AAAIIICCCDCDDEEEEEFFFGGGHHHOOOJJJKKKLLLMMMMMMNNNVVVPPPPPPRQQRRRSSSSSSTTT[[[VVVVVVWWWWXXXXXYYY__`ZZZ[Z[\\\\]]]]]4999d:::;;;;<>>???@@@AAABBBJJJDCDEEDEEEFFFGGGHHHIIIPQQKKKLLLMMMNMMNNNOOPWVVQQPQQQRRRSSSSSSTTTUUU\\\VVVWWWXWXXXXYYYYYY```[[[\[\\]]]]]d;:;5;<;<<>>???@@@AAABBBBCCKKKEEEEEEFFFGGGHHHIIIJJJRRQLLLMMMMMMNNNOOOPPPWWWQQQRRRSSSTSSTTTUUUVVV]]]WWWXXXXXXYYYYYYZYZaa`[[\\\\]]]5( @ V &&&!!!!"!"""###)))$$$%%%%%%&&&,,,(((((()))***000,,,---...///555111333444444:::777888V V &&&!!!"""######)))%%%%%%&&&'''---((()))***+++111---...///000666333444455555<<<888999:::V !!!'''"""######$$$***%%%&&&'''(((...)))***+++,,,222...///000111888444444555777===999;::;<<&&&&&&''',,,((())))))***///+++,,,---...333///000111222888444555666878===9:::::<<<===BBB???@@@AAB!!!!!!"""(((###$$$%%%%%%+,+'''(((((()))///+++,,,---...445000111333444999555777888999???<;<<==>>>!!!"""###)))$$$%%%%%%&&&,,/0.O*)-)))***000,,,---...///555111233444444:::777888999:::@@@=<=>>>?@?"""######)*)%%%%%%&&1)%`,%OEeZPI:7]112---...///000866W1194I;`I|fwutdtYMMEA>>>???AAA######$$$***&%=*%p,%-%-%OFj^j^j^cYNH:8U100**((00D9^DYī^jHOEABBB))))))***+&z,$-%-%-%-%PGj^j^j^j^j^j^B!!&&.-B7]C~Xīy\McCHHH$$$%%%%%%,$-%-%-%-%-%QGj^j^j^j^j^j^aK!!$$,+@5\A|VépVHySAEEE%%%%%%&&&,$-%-%-%-%-%QGj^j^j^j^j^j^UM((""*)>2Z?{U§hQrBFEEFFF%%%&&&''',%-%-%-%-%-%QHj^j^j^j^j^j^UNM22!!'&;0X=zS`LYBFFFHHH&&&'''''(,%-%-%-%-%-%QHj^j^j^j^j^j^PS#A#*"%$9-V:xP{XxELGEHHHIII,,,---.-.,%-%-%-%-%-%QHj^j^j^j^j^j^M[ \7N $"6*S7vN~pQdHLLLMMMOOO(((((()),,$-%-%-%-%-%RHj^j^j^j^j^j^Rar n63'P4tL}f~JYOKIIIJJJLLL((()))**--%-%-%-%-%-%PGj^j^j^j^j^j^Ue  Tf1%M1rI{\gEMMMJJJLLLMMM)))***+*0,$-%-&-',)+***10@O=@*Q&h=tdwYKPPQUUUSSSTTTUUU,,,---...4440001112334449:9"C$ d *;!R5mQ}gq_P>$e8p}VLLLMMMSSSPPPQQQRRR---...///555111333444544:::)A) i%7"Q7tW{tZG@"e2k{_MMMMNNNTTTPQQRRRSSS...///000666223444454555<<<696e  *B-fMulS>0 a7djPMMONNPPPUUURRRSSSTTT///000111888444454555777===999'O%  )C1gSuqdN@,90`MG^lVNNNPPPQQQVVVSSSTTTUUU555666887===999:::<<<===BBB???@A@"e #8&R?fSjUZEB.8,NRNPQQuX\URTTTUUUVVV[[[XXXYYYZZZ1113234449::555777888999???;<;===>?>,a)'5#>+?+8&=4JMILLLMMMVSRPPPPQQRRRSSSXXXUUUVVVWWW322444444:::777888999;;:@@@<==>>>???AAAEJE8a56w09}2?n:LTKJJJLLLMMMNNNTTTPPPRRRSSSTTTYYYVVVWWWXXX444544555<<<888999:::;<;AAA>>>???AAABBBHHHEEEFFFHHHIIIOOOLLLMMMONNPPPUUURRRSSSTTTUUUZZZWWWXXXYYY554555777===999:::<<;<==CCC???AAABBBCCDJJJFFFHHHIIIJJJPQQMMMNNNPPPQQQVVVSSSTTTUUUVVV[[[XXXYYYYYY:::<<<===BBB???@@@AABCCCHHHEFFGGGHHHJJJOOOLLLMMMOOOQPPUUUSSSTTTUUUVVV[[[XXXYYYZZZ[[[```]]]]^^___777888999???<;;===>>>???FFFBBBCDDEEEFFFLLLIIIJJJLLLMMMSSSPOPQQQRRRSSSXXXUUUVVVWWWXXX]]]YYY[[[\\\888V999:;:@@@===>>>???AAAGGGDCDEEEFFFHHHMMMJJJLLLMMMNNNTTTQQPRRRSSSTTTYYYVVVWWWXXXYYY]]^[Z[\\\]]]V:::V;<;AAA>>>???AAABBBHHHEEEFFFHGHIIIOOOLLLMMMNNNPPPUUURRRSSSTTTUUUZZZWWWXXXYYYZYY___\\\]]]V(0  %%$!!!"""###((($$$%%%&&&+++((()))../,,,---///444222434444999777999 %%%"""###$#$)()%%%&&&''',,,)))+++000---///000555344444666;;;999;;;$%%%%%***'''((())(---***+++,,,111...000555333444556;;;888999;;;@@@>>>@@@!!!"""'''$##$$$%%%***'''((()))/..,,,---333000222444888666777999>>><<<>>>"""###((($$$%%%'&2+(bKE96[++,000---///444222A43X>7aNF`SLVJE@=<@@@>>>@@@######(((&%>*%p,$,$eZj^bXOH:8T8/0++/.H:mM{xTnPBBBB((()()+&j,$-%-%,%f[j^j^j^j^;|##,,F9lL{~XwEGGG$$$%%%*%v-%-%-%,%f[j^j^j]j^cD""))D6jIyrQbBEEE%%%&&&+%x-%-%-$,$g[j^j^j^j^MG(('&@2hGwgJ[KDGGG&&&'''+%{-%-%-%,$g[j^j^j^j^AQE>$#=/fCv\iDGGGIII+++,,,,&-%-%-%,$g\j^j^j]j^?` e59+c@tRnVJLLLNNN((())),&-%-%-$,%f[j^j^j^j^Dm Pf6'_?>$b  .Q>o[lVL8;0NONoWaVRSSSUUUYYYWWXYYY222434888666777999>??<<<>>>/`+%/:';+?7KLJMMMSRQPPPQQQSSSWWXVVVWWW334455:99777999;;;@@@>>>@@@BBBGHGCNAEQCLMLKKKMMMNNNSSSQQQSSSTTTYYYWWWXXX544666;;;999;;;<<>>@@@BBBGGGEEEGGGIIINNNLLLNNNSSSRRRSSSUUUYYYWWWYYYZZZ^^^\\\^^^777999>>><<<>>>@@@EEECDDEEEGGGLLLKKKMMMRRRPPPQQQSSSWWWVVVWWWXXX\\\[[[\\\999;;;@@@>>>@@@BBBGGGEEEGGGIIINNNMMMNNNSSSQQQSSSTTTYYYWWWXXXYYY^^^\\\]]]AAAAAAAAAAAAAAAAAAAAAAAA(  k###!!!###'''%%%)))(((***......333333454999999k###'''%%%'''+++**)...---...333333778777999>>>>>>!!!%%%$$$%%%,+4)))---,,,...333333777777999>>>>>>###''''%>*%p>5bWNH97SE./00I;рcӥt_IDBA'''*&V,$-%>6j^j^j^4a))O>>&]#M:|hbM@6hSfYSSSSWWWWWW333777777999>>>>>>4a02(=0Cz>>>>>@@@EEEFFFKKKKKKNNNSSSSSSWWWWWWYYY]]]]]]999j>>>>>>AAAFFFFFFKKKLLLNNNSSSSSSWWWWWWYYY]]]\\\jAAAAAAAAAAAAAAAADisplayCAL-3.1.0.0/DisplayCAL/theme/icons/DisplayCAL.icns0000644000076500000000000033456312647526530022467 0ustar devwheel00000000000000icnssic082 jP ftypjp2 jp2 Ojp2hihdrcolr"cdef̻jp2cOQ2R \@@HHPHHPHHPHHPHHP XS ]@@HHPHHPHHPHHPHHPS ]@@HHPHHPHHPHHPHHPS ]@@HHPHHPHHPHHPHHPz(X !Z>ܱo08ͤ12,ʋ@QNHS!='ѓ̒Iו^Z +2zXHs2GWH.YHJ>Qfu])rfe_gI_m;AP,UGڿ՝z-*dtڄP_0CǸ-BY<3 /Xv6bZam$z0?yP%Eyk%b:;ƃE`A-5Nz!Te>@+h;|Ϫ0ڵѴ!wܥѐ4ww=&ᕫ>%^3e] icpl^N(ٙ+{"W yR((SY1?ᛥ1Ό]5,<~8./ssJ^ca}$qV4 1g˱wcLVAqiG l33UhVnep0~wrNE-aIX!SwPo-~Ȫ>UxN)jI/阺y[9¨jF qGߑ}6=h ݠ4~ȇVŖJ䗮Ǘ_gګ+UJM݊y4zo+@_,3Ϋkc(J8''- *[ov+?gFv %;q!-zsZ@<>-H#YEϼF}Q6EoւqL 7*~ />sGߔ`@Py؄AV?ICҐ) TD*\؇#?D=XPNosp,{AS/>EI)Zo ձ][#,T bјzK ; &+2'oo|+dȞVaE'[iap`s\$;֝_G_~2lKqO~+ H-Hs/R + ʜԫ+%jmqJ|zG V §,YLň^I|[j'/H0*,VPUТR:šEAs Hpad/hؐ[PZZ sECGJQwqX`jnOJgmXHቛ~;φ)H7o@tvڨ!vQ<',J*5{.pvL<ڥ+Q=yvB Lj*3.R$[% "-* C 랏(Km$`W&N5s|*筁=za|c& qqB<$:*4j %=^)[m7f܅G9<gs(Qgٮu2f$gd\Ǵ`0< C}/Xpl_ϼn}s;49bh2nϗ#yi e6oLhMV9fv_G^C\:u(RʢK!jihDۺq> O zI8;"LXT"WJSJ=X4#NNJBY!7dXTRl(@ gB$ZbK1tacѥ{7YԊ0jdEЧrÏ)=t0&Á< G%ǿVj=bYS-Y`(GnpY4Mۡ@j\LLrm|k:lV4,$4ra/g0n,u\u>\af6샂בPe5=7_Ei,:]$)ܑ8&M:g. 0\ , qr$;g{CFP} V%Ai_rJsXq\^4P;9f_JAl;򲌎F-tum8bqǕə#deQ+X֒͝# eĂ*ej)',$V&ׂIU7]f' ,m&0i:~?t;QV}U*R4KibԩmfD9:<18-4.[:#@9_Xga^<݉ׯ#g/p.nD݀&^)e6=~n}^4QI7zNJV*mcE Z,>MBx DlfX@h]R@qQ.tL~:"nPfH*`<ძ[D_CsQucbأoT!!2Hi@(_} pz71Bc|Y>jΩ:޴@lHsJ=·˪=俐s?r'n؊<䚔)M~_gXƬ 5wejsy1s>VVMw6IWX+E*Q5&v| o`.wsh2ivD#]@ꉥ_ I:kb'1ZA @86ХY‚ :q(ArG=6|KH>v܂#z'yK=zzfYTH۳tE49J oۂ,[?~wϋB?Lwia Vɘ]iSDR L}5?*}l{]k:q-Y4o3XT?h9 8O cQifP%[ym?d?G7+U|H(9Ev0aFaʿՏ=0NE}-}~5]+G4c댰\x@D8Dq!?  |D;ԢLg/\ח/iA#ɽ"IȜ52(G,8aCrf̬ϗ4N"8~}s]g(̟@rng["5nxӋvT!xmGbZ+ eHf(m%@9P}#POe"%"Q]cF45]_{OY]= /hcXg >kb" /ݛEѡ2v.-aoǯE4SW H8zDqƈ4K]iyZ$:i</ѪPYמ\NqAmnp,Y5TKR΀d|JGః/?p@d:x=ˌNl,P2T?I{-]Yh }eSx */(v2h(M(R3z5ON|U^xwgþ;JD!5Ar( 2 M1*$ճ\p.o쨬G?;(@LceT߀cJI㮟_*}cb䇃=4DwFA((2]q3\oFc5z(9֚OP[dcWL< ԈOѬ<gÂB[0#tYl0l" i{;-VZ^\w2F@&iuUI#ա g80I*^R^^7R^!p[M8;@^,|`m:_rbY :\1$#^áEfM m.8ueEFEf-G} 5gdȷ*'gfDnK߉k85mr;| VmҚ#]ֽV͚3"4Q`2{~j՟q h H (F쑂]hʓ}UŢts]7]do|Rk8y`7PhkFD:^cۉaLϺ`r+-axn/]b,4}HU- /`@q~dG掰="XXU U81Du1XŻt $f}$E›`asJKӍ~U{=چkC,]k㊣"qB.gX/Cl z딭YD5zZ+fiW#wfC>cp )/h7GNw6q/zi Sk!>&XMzAvA! y)P|rYE^ؠhZGM ^9xy=]f=R%C/6vaG_*rEvG)MBChVPdC#|,w#ۧJ=1R;2FjeXG.:nց'LR+V9J02EWm[ڽwm&OM=`p**8Z; lL֘*_LIxVcFT/PϥXm{?}9rtJ=A*yq= (rϼ}6 PA.!2?Cm]׳ʴs42r 4ьw⮀v)u^6xH5ATBVS ?Xy]PKh L wAwn:E\?@wirF׀wVw49#R^d V& ?BW>T`h!l35=LίZJ輿 QcUNCDsy Z=|kb巴ź~)cN#`,f:Zux(c:\PnSயa;sߺ`سEVCsW ƒxxONs9!"*ku3"m =~-lYJ~gFU1tUه#ԟ9`JՆ AJo) 7}Iϔ;w圌g:b,+~_MS&92aRu#s* ȴ~ȅa^-(-j[_경rP׾]ZdgYZͣA )wr~fXqX$ӱB gb˚hq EM5̀Q[72!WtpgѼ#iNh7<(+;l] 7Jh=1|LAA@NLr,QB`0(yw[C/uX)f-a k ,|19\2c[ h뮩AI$ȨN,Ceëa+d0nH9 'N4)]2x^ ه#Xµ "tMg5"Vײ)5x囜3q"r Jx`t'm5݈.DdG eX30?&SM NYqk$ nҀ^aYԈePN, yEv4`. KTSj'e߬%f&f2n `{^ƒggא/(v<%C\bTzPӼL?df@K%UA(mӽ|^(oo[FCih5 '[չq)Lw~Ez1qut wM|ZǽL[H+81*;7'-i)(DEzzj p$|I!eJq ֡dVkТM`.2^P`@Z=w=`B ٍH˃tOe #>E cOc=G;ѭ.S22>1X0 pp0)0u@TW#ڴ`fP8?@ М\ܾ2l&#ɍ6?fK$!r^\Qدf@tm WɕUIlpE}f|0x88d m׼uMq Dy7?,"2#v|UgMKy IxU`dBnCD|xrŭUꮺjtY}b"?99H(f.*d,QZH-cE+/'XSrw\qFpr{,O{O1#W;dCH9Vӱl,{lVa8#k" \*Y|=C.⿢ ̠_DplFר1ILrrGQho<{/5̲pgBf4^\YD5%E7Ĺ A![15~OEqCPiU!]A !9.q`OG' `ܸ^R[8)~i-DFq:8~ÚAawVLHI&ہ Ħ5z>cl'D͟/Unx(zꈎ>- &@s宧қ0I\j(N I@4x9Ar I⻉lG`9sZUzou|[\ 9`] }S Ý sSԛ̺uͱb\=9:(QTR-c@6ZQH&/ IzaUi\;Jmc&b sO@F9Ҷquh|cV/ھY^q}zyaHŧNLen'Wckī>uIu_&ihYNi{%G6x)txջm抜؇݈$iwԾUԆݵpmM$~0[]"i,܍^YpHAA# W]+sf\"%Km98TeTe\_xmjO#մͣ4 dEFudlMePF㳰U*=Dds|J+MϤSw=(Ƞ9zQƋ)>A|֛_"r߼gO՗1&SXlqtHM6= J0B) vNM Μ20S5zNltF׭ '*J\б*yLN$b)yyPO$0#&Ѓ@=+~(} <ז`veVh/O@v-M=N2ʑf~9—_ut̫JI5v˹22و7!hrrE&)26<"DȬ>}buf|ȎkNTL>9c6W(ǙζݭhnEeHZub#TV1x%Δ7g[Jp'#Aw& -€Ý61$ y΀>,.nJqR0ZhCg:g4{wAٶ)D*5;-z}[7):CTZ)u#EEi%^𢛽"fZ; IrW<ݝȘ'NH?#- ysKJpgv$@RڢRpdg3 ZcC 1HG?7ێ:-Eu#S?eMe@kU Z </3И<&W^uxNz|go {>"}U; /Xo(|Y5]ؔN`㍕zIf>|/bW'7y;t9+8x*"UFP'zA#0_%o=kw (΀difeWRI몜x( ^_Me#g]usfDH0CӍgwu3?<16 YbB 2zXmEߔxLZ 5|8 /0gSf̎t5JR+j1H։’AC;PN 8`\G qrzJAGz.1^Iq@9SgV Э}p65ō.%VRt{x)1t_3ោׄ0 -޵1u. Vt~D %xq"w7(/lRv&NҎox A姂nrn6|Ew%*wěs%Ə ȸ=$wZQA CW s/Rd˛ xR+cIr.{lP$kb6)F&[,-8 LnFT6ڝ 6}+tx- tfq,ĔWWweo.cg wq 8@8>Y˧{VzDmmn,|F?,8u2-4 jZFG2:ާޜwDV_@:&[+%i;.@)zUSYYY\9ق 2EuAQm>a.A (0⁠3kP=݁|;fb_ W|Bi&-3GÃ޲߶\)սֳЇ.E`VBlzGastpJ\U=?}ƪ,M.S[_T ar9.ߎSn]"8P3ﯙ3fY5 i+:$* _)"}sbI͗p5;q``yiϓDg#;_ds2M$XoÇ'qS-tJ:T|\-vba߭7'wWFkJ?C}umt ߾dCcvH`]-jۡO >mtm~ S U3BEBC=;HьF:,Uϗc!2} 񙠼If0~/kz3c]@VV!d&+!ag){HY'f|$R]{Byr(Jp+ƥyO&Pث;Tfu%WBİsFFVY~4Npb1{݁e K|l|!Q*kO[,?~msȉj@ġ{^bgaOK|וT?IQ0|5jZxrk~^k]deZsodDipEY6BAHW;}ZN&F)&:Hptt88"}de&p oAFG{UOzq ?-\qc5ٕjeS)Lf&@QB[ &uk8(1,)<H-ܖ&j(Ŗ m̐Ȭ.& p`rߔլHF GmQn4kF,7 ]qt/0LG9M4`oCo|b~L6`O_gJ2=7A$Ysz_ ;wˑ ٬6 QZt Y jks+2` fDӁhi όX"&H,O \EYJvFܹOtg@Ie';$ ͩb8(EX7`dV2/4ui8 h"{458Kiݰ;|"[nKW8] p-Q'SJSh+.AĴ c K",{'ѻмW"uC,©oM!! 1lAtUG҇2uoq i$ܜ/// y[<# -ҢCliD|~:!mIvV@+wTVбa F_‚M+ <?|ӳ!9^jYexR~ o0[NݧklDJa 's{It'W8tL},\v3Gм4 ;.&>PR{>dfoѥ:',aP29S:U8B.ADGMi6i8Z"].#mfb4)}Iź= V\Z=FtO"|,^)\751v7P@:n&! >qnnzYRMY#8L+"UGɤ@D<2lH3:H=ɫp aK$~)D;8IHBB1VW9+4 R#<:5̓ӽ쯮)T?WgAʈCn$C ZT7bVd7`DLc7cXͶ)h=qV vHNX121EV[m^Nc@Ѷs,ø<^!$Z봨ՊN[$ҧj7zcDacŞL܌*^8ǂ${V?!hJIIѧszB{4H)b.ɒQF] ?V&m{AfdBzy tsG] 4 #j^9VAU!cގk8CjPF=]D5[ ܈g4v`^%"] Cyݖ@o"ѝy})Eec9< 7Y<pk&%z: { gͭvW9>3ƶaYK_ 5Q_x][Ǟ}b9w\ֽXVCUok"rJ^rCo+j؊WZ}kh79,XҘ Yh*5v0CT .Js k.u,|Tʖc4F`}Su\<wZ,Gg;õs2.3iYR(3cNRA*k{ljGy*>gI^vUR~zC"G%Ґ]/830_݈/d\'U]3H gFȑ7^YA tR!( K<}lƘP`Xpf'aQ7Q&m%ݹ J3ũp6g'EImw#5/[p"M^_L hKZFb;yA"x=.y.8,4!3=o %%N2ZLbvc'Yk1wE:dx1;'ʐ\|qmҳ{#$s>=xY{OPsIt}/OC/VOtMhVrXCF+3=h ̳>3Ea}p7(Ljvt_5|ݐEʚ ȂqbIȌqH~qz+ޮAAEP' m/ϲ4 LŒE=d# w6 2ClwfZidbČXX~`@}ܱRl^[EfkʟZDf 2rH>!{5/nբgZn$,hkz)Ai.NHik,7\j#,fF ͥy5$W+|(L"C'?|z^y"A?+LcBX~%lםROȶQ.Gs:>L"Oqr|5&8PZn*rs<_&BTyUdƑ C 욚k߯*B&O*qFP2Jp[_@LNj;rX\,m/޾v.b!Զe SERRv7e 3ek 3Sm*3$ "[ E+>]*= A6E3M]gZj/3k9X|ݤy2Nvu2Ĵ3 "[h~q>PVDI`Kja=ib1 A^euwf}'1&U^ŧ@XjSy7 HveP9#+yQUvdžU?%J"xx Jm*W{()*o53jg81~AIv{y& K'ⓡy4A{5p b4ib`H1 AnՖ;Ѝ-.́}ZUd SBŴx 2+Z7eI|]6$=a\fS݅œU j>MY;l>'}my,W Egƀ#5Afw&W1yWgs5]tC%ݑ L.灅$SK QtGhqWY^2XN X%uBD} ^xн&]h Ua&]g۾If9C/9' Y&ȇ2JW!ju/@~=vY9pGJvɝ$+uXGkw^KW;Aiשo`LFM! ]t`WB\륝ɥ-aV-g  _v8U ak+Bm^l69$ZW5[o?pucLG%h %y`Lp.9iC}Tˍ=/+GM4דN5iv=ޗL1x&Bl0gB; w%0 jk4o$-2U3fUݳBcm(E`奝~-18PL1hHAz@c'B$6c)dqY=2Խ]/~j@y,Rs< 6劊o9 zO 90*x1zZ}%Ͻ@ⵇPaI9*g.xgZW$^XQ n`t %RB94N)ȵRkxi=d:x2ʡ8T C] >2~Y? )hvFrP{]<<8u}sUѽG[oU$\6Fc S'ϫ:Wł IǶA̼uDϨ-Us Z#{ts]%7 L80qiGXF@XFs-Bmuc)N7 > Ѳ'&|],lΨ⻉T-Z)Fz5kc3M Tr[b>[`.:җϪ"KyGiTtgxpn@JRC.3{6?q\ARkZRAE3ưNj8 д'4 "mK֟(?\YNm2C!Y4;Re#CU1p~HjXT\ "s ?sلf!}^+C#C~-TQI U&/g8H{,|H=h7Bq9azZ6G2Sө#Tp@(#*bg܅I4%cn6\=r2gk_cLt?jpx]6sN@*02u|diRZ8ҪJ ZMdF^Aze c>qŧX a9 2v0)(ح 3m<@P4E`jr=3؅_辮7l?oK_H̪" \cR\ 'Ps[s| 8HTbVO SW7_*K$ 'h +H PAk@O>aEA%f0{ei(A=*v4#/(훳q9u,@ H̓n1~k>T5eCk)ZK3{@W_H`f3o|#uTIX ] ]BMz Ezx _9QyOl}mUw6&v+ps?idl;SDž6*`i?JbuNQZ]''?}^DIBbJ r PD},=/3C>>іWq])*˾s3W;|KӒ"z鉊GL;Rz>2=O|w+|Y HOCQth^H OTUyM[./}ȸ,+HtQ~Am9L G6m{>6rء{ŵ俏__sxT5KR5 bʪ2αz7¿9ݓo#jL7 `ܭ+4qK | {<6^VEi9vA`81ӗK 9jQYՊeeւ] r#Plp6Lտv>ÈR~߾K:d-ƂSDMoQJHYqR"oXns~l X~\,34[G5pi1ppn)[PrR\P.xׇ… ɇ;,3bTx#g0P6S~U'x8&w!Op$`dTXUL;ry6`ɉ Yvܩ]:3۬9yz.݀{+N2I| zobF#]cߟXSǿWy0zKJDfue ]2LQ4m$fۉ$WQ)oLW<7(~ bV(^:oY06T`l򤿻{o%5\NJ_8.=.&U<~M*1L鱑}s 8&B\Q̊qÑcR+/UrwjjJi>_b)H:cx-@ Cv*O \/'xqs|>&sU /m!6׌:w?%D8Ͷx4A]+B"-c83cT)ݫWw #'>q185|Ɨ/{p$'Xi߶wi#63LG6XlvkEn >t<&8{(J|ީ]bf _N:f˨YWK/=]t-oɕ"UՃƂe h>gMퟧF6+%M.PZ9\_IkJ@ɹ߄xP0 ιl߻R!Gr ^AFbqno)%~F^eqh' d !xOcꭥ.S =,eH$PJv푚)28U =Ah8]SX3Bv ġW"P4csHD=)hdX^S.Q=sudr=e~rӀ7ƚVpzpÍuE4a>Vܚi뷄xQ~*!뙽Kv=:f~H:EXn :vfHONćب(F?n۟>u^[DQ%6,ͪMQ;PjmTfLok9WJ'=pH9sA8RbH*`Cʊw…#2&"FgՌd!M`Śj !OllHn&/O%b1UQ+ -|F cnvu \rq@sGoz0v7Hٳ\.Kx]fC^M[w}=zS{X.ŊN@,wWU%H1RHBeآ7(dimsǪK$D﵅0JYkHPr<_+Wneϙ-2¡/{$B@vnŸ1bV_}M D Tʭuo! k>8sõod*cǰ:NC"X佒x(f| }R9Py&@ޜh< Q}헼P6)챘Z*g.X Êק=c,!#ئqs~GJWzϨM I[׾@忏fiA Z*nUAY:_.Uc_4Nf@K>ֆ8^jN]H) ~)3WΙC/py-8)A2.0~x8^-G}⤓ =9 s \ϒ(=sT׾]*{a|y( >'uCr^R/Kxfvc%}g&yZ|Ael"p0:!yif>7jKAWۉB_XHF{ 0]N~;G$87Scwژ3u%YH|F-ePi"e(0P+&,YSӗG9KfxA>wjcp2%7ro"YSgA`4G'c bB5n9X.DxI[;G_1e-sx*\*#лU.kGKh(+@Bϛѐ yu"$йgkP`@ծ qG|:l{$W`1s=1|s_tzҸr\H,"X5O;8;.h4k^vΒ\;ԂrF?'()fcD&$ri !\^ffyn~Յu+Qyz ԑ#!z!)4*z&GHl [/Vx "5rc;Tב!>4@H2v1Nj0>jp A)Uٌ! g6S(Qr^#d&`"Å+EId>{RG@q|!- :?'}KN3ڠc׫ ֱkafCyȬB^pNuDcf tC^24C]٪}]&<ȞL0>.}*䯧R#[-ӯ&q1n<ƬR8DbGy^_j*Z59'j+՟EwHCI̵E$}*TǐCdvȠ ֈϪr4B1@1__!T-64 Yi=loȽ_:!dj Dz| RTٜ*` _nwq,jpjaA/][7H:CE@_1# \}]{3\jsG }jRZk=7gJHb R(~͢*Q(b )b$7┻# ע [S̎Qjl8k PI-b٢I,|oDQ?LoR.#t. 3'ܣMd ?MQ KM(XpRt)y)|Xm ԽI_<]oNIg,'‰mc1uGv8׷ڝ3<+8Gޝe Ȏ"k/0 ~g!BeyIǮ3mޜ1z_nJ?XV,́$]XUe[}5>3H;ss)Sn@ƚNT.)Vѣ*M"!TzL#m=7oBRscI)!dr:> U'h7xz8$JŖhENb {Һ$ !g>=tay|޶3ߪ2ՅO>< *0+6$[7͆`dLJCj@&1Jr[.C=nkG4R! r~Ά@yLH<mB`<•ÚH}ބ \ynxxTh9^UQ> Qn/s1u)GUlOf<)l/oO-ecTgke&0m_`S[R@%IàE 5|8G«-a"-/at0olW]jʹdmA 4dM/⵩3c_KܦeBq#=W!qdq*¬\%I7Qshο ܼ kT &rKCuռ'TM$?2df4or2ARv]=#, y)n}u 9dYa4M*k8>"ԳM(={hB2sE'(Yf n+cD25kJ,j`/i;s\n,:&h?KgEQ c)kcdCU!0IʋmÁ]p2 g;b0`7k`ϵoW'8gc[-jG;W.@#شdŴ55oHZ-/T.U@0mjl%VG )0 1/$y I=JAVHR-eZM2Z)ChDۖeRu_q}7w4N>'E1/]goeٺtw`0ThzvGs)-1 ,1EƒKXq0pޛ46a9(M`ʗMQ9v !pOsK#س8(fZHCr4uttF^8 >Fp s?ʟd*8wu oJ(wP:4;mi:g»葉`^[Xx9W8)x*p7jkw.)(bSIphnW ӽ/zсYwc6^k EF/C5~+,ew)h^ / 쯛v5$?>n S+'bOnKqRmj٫C[j KI+xC.?OsYϤiJ#wE8^ClSY~Z%X{HWj\1*')撫3FsvR} f{5|P dԶ& Lfu aL24: 1u5M#Zs{l |#(OgOmOD yK d5Knt-r=[ai8ijx^:M/G+EĴM+Rֆё] hlÚ BxPҶ\( xR59hbQ`pPX~GnN(Xi/ EvchG7o3^XØza;gd Gڦqw8'H+N!F*:#Qn:Bиp\_KcB'6"% #ڷ @ m4ONAle,Hs^ݚ_/ZŝI[ssV4YZqaU*ňBHt#>^Fyǝl/*ۀ2B3-54L'K姮q//di>:wK3%VuM}!H-݌:1X өM3;&}4_6$dƌqSpw\@`E15k J%~o?aĴ~̦`h4<9#ib+́_"kaYyM F2m/mi0Z:%wQɻ>a\:r_Yf&,}?OY1%1tb&;au] 0GwGA| HHlA9v6n<ͼS.)Mz\AXaUܮH1mIpZiy}]\UuEQoOrܽ! v[7ܚ'RH5Ur۸ B> k^0i@9Rnqy,4% fk?!P1#@ O?^t ,-F(g̛PWSU2T=,sykZJ=ɄXΝ2ݍzuz &Mx:4bEg}Բz( yT P2 ?)ͥD,l'tqfC rE蔽o/rܹ@[̜!n:L{Tyt]L>%_#*tpo/"j5-:oC#BS-Xyz)L:w!.\B'`OJ>O|I\pBQp(e4 }YNT[Q Dw|w‰˜Rbd~}~@}XhR xa7kҥ`x!/_S?}\1wp;ŲB4,L3qfHg$,)wVI|=%HI x#pmF%>=ɺ%At}Ivˁ&A|g W x#gMNx%6{kUe՚ ~5xPmJ "3í4qnihjFBޝ/vI"Z2G潠İ&)n.M䒀8%aO*,>&IѳmfΝѓߦpj阣RP0_#sIQH -$C#t&'\^࡬жfb׭^tGzАˍ^7x$_=`Pmwȱ}z*#|x\iBd ѳ-F WJ\v'>A'JOE U"zUwU#`?},p>/cNO5C.h j1 DOKn,sqU-ʩ g~;s q4 D|̂2YBD`/?NJ(w$ U]پ2L5U2<&nv$myqgSM\~<ޅU0 wG`zP]2IP4z[:}KU@50Wǯk *X]ƬM^c|[\NYN'ݔO)kw\9Mmn#F>6zo'ZL$2 kɆ%BZ]o*FJjUP.3qYع dJ EL{V0N ~>| [T/P9ԝѪ=djg?QԭⒺջxܚ;9zJ}glܨdp݈F<5us5ָTe$}e#~qě%B PeޛA>PyQSwRuH j(w32 蛫/T J+_H׃TTbG)-؍G3lW$h f40CM,qߕC^iqŌaD(HYL+:D_$ ud˞rEfU1upY6|D 髅MP\|μc5Vw Yg!^0;W@WQ6CS-$KڴYp値` $<rm6 ܁wB9sxc?M}oRAJ34L _N IhLzxY(w:p7Ɉ};Yzzjb9cqZi KD; <:0\HH[qB߁Dy&cA~yu)c}~D=aCk)h?,8f+G(tӍM(ZJHHE "*:F`pv k72c^)BN 7BgFO` I@ 2ǙL>/r-r(f> B& j&+-Ģ/uEʲj@#7j[OeseFG;t Ly~:uD-l`!^ϵ],9Ͻ$2u]"#]5x]@%'wEbƳbp% +c%r5?uCU;k&| KЛ~7Wne,h}#%f͛Z#֎)0f[7 ;I~laI!%!ӟ;H,DosdgS;M\$Aۡ࠱^\M_w#R(WE5Gi(vV=賿vAF$[\v@oޱ CWAcH8 T,i gPa; s|HN [ȝu-д[( I%yq\)O%D2Jp"AG17aՕ Sc2vu^)3-ߧƲ |7 .6n+7$K,oXp Pg٠v6駶JPN:)nO`{G =~q\V,A)!~ .#Zg1:H)Lgo[^RE.=6;K%vÓہ 9?4G`:oSFU<퀍:ZЊ+ܵ}(, = M˶7}QD)- ,_]=e!\e][tɭrq#k"yЫq.G]։rx|A_3zEB ,Xɢ7]'0ELZl9>km7f̬$x MeZyI^dl VMC B#d, XA53UϺDC.+2MS *~A^ŝOaNm,/enn6VÁƳ=i9 *nӗ0wrE4Yp!<]箛I,T K"'`]Dx*1⦫bK;^YNI"*b$9ެ&=R>ed EVǪe-K0CtFBIET5Z&=m Ȓ\ĥWͽ2cQ[2;Y 6ZBMit%vA0:qпo Ⴣ>Cw `WX xN0yNG1 n: KUЩ'v=y"_Tx+ FDkWOH[]\V/;``z"Ǹ- ZUXp;Ld3 n i" ٳB2?F^?f>n*GMڠGpmV7.-G [`˞O:[kθ, MI'ɯ6,]64Ֆ{~pb\PtMfA @ v["\K^Rřdd;RbV0nUh&llOaa9C譖1K&RD^Gœ B2_ުxJUJaƛ>e^=$vA_F 1d*i;>'ݘN(8".# )1_쟿Fq?;|BEk||]2 s j]'V}-ٗ % 9Mh֍()KrT__eWED9Ę$IvPv!H4R)CגZ3o5JoXYD=Hޏ<[ G-Jv {Xy摬/}6n<^aY ɍh~ ~@>_7}^[}R3nQ@ѣ9!&$?Ϳ̙MVtye:EE_;vX Zo3@ KQш_Ѿ  ƴsbb-(V< ^^54~\`7 "ĭsr$]BuuIovTҳ +e YN_2& 8л>m@yۣkFTQW_nPlSJ\B/b )}l$y"S'ȼǷP/]U݄DLEXɡLkYtr?\{Ŗ#-}|sFv~pEcݟ7|>Gcf/LgւoX[T¼::d賦1M#fʈ(0b\ X>5+-H|h_h6d^9_NSe %CD: {J–[ \LCD4Rb մھwoTcZآ՗n9J+N7MEc0u!%I"xE~YiTV@|/m8cw/eؐr} ^mȥM+{ Jg("W`MбE|cfP'F*n€ߩ$xծ);fZs%-䢪L sSM%5C8!҅a+%g᭰Hb1}Yy`Z0(GCy>;kq{=DdC Atl:ڽrc $kAF&$W#` hU8 D=9Uscfg GoHQˍ=QК|.YD --H *OR2,mqLm #1Qop2 ]v40~:W/57@TE~+WV`*Du_WȤ&!|HPT\k2b("d33(4lBMmKBŝF60"4E osEԝ;'xG.rm8LɁEđAne~zczФ>dPM*T7AM kׯA߇x*G1)P@-9{5HBB¸-ƓhA) .'D? @-bb0ݰ :#;mhQUz{M{fH e+v£$EX5^yqwrvul`ΖM(S˼£o+Sg"r>%Ǒ沵NYyJH{P=WMg:'wi?Y#seUVkJ Qe cRȏ@ YGAfz:{? i<@zآ)eDz&dēQl.Xj7!QFZV: RfY4oxD!tT&j,y/8fѭ>$&^EmʋkbVhVu/.jVuef0S2,VG@s8 WKC?_iɔSpxUzHN@=dW\?vCDxK9i R(I^=^\WV.~Lq=HS{'=>lcokwu/LLIٗAL%ºiVK見n8n}77`NZєU̻1Njn n&?@K8I辆wj?Cp2bg_ @l$0.3 E-$|28A)"#XG:]7ϐbl{7ֲf˥2${ig:(P hٰGmia$1)_J!dGOS}LB|vvߟ=3{(ZavɩkQ+܇nŐpwIKօzeĒkѤd;AȄ[[ؖy4\2/y j g,Sm$XdC'ltdeTKLVeT;+quxZ]g}X5 N(j͖ UB}$A,/Ąrfˑ7BUKoV 3o86eFu$xA}kH_ $"S[CK1\Z|`3  PO [:/bSqkZ, 0)W%5ש1%t(_T艂9H ΒMU1gBѼDѸu6oJ*_!A{ b%H<^ö[*K[?tشSQg̡Y8×7(ӄ z9DRв 0ԣ48q 񻌃QW(+C6 瀚Yn|h}5{ԔL4գ".ۘ۽AzuIusy5id#V kG"b|sZ2QB 1ETt8+[k@Ti0f .iC@H ­]sUv>?d !UP*k.d])<ԿGe\9_4Ue0P>br!X3=(aE 6#D%A5M*vI/rjdz K/-luH3PY4NImۈQa+I"8HEnnBfhKv (vTcUQC>ACaeZz/LQ_>E{7}СC|mnP[\rWޗ6n1kGx1_䗪 ]m_8ă\Bo"F) W"j6eSE{Hrl=nϒ!KYʘ/#5 C$MuL~ЭgR=" b~кtH>vȱkjmW]+5 g{_Y9{K %ܑ9 LlxUq=x] Q]d,g^NkLgI7m$No8y>jQU3ZbcFIrG=JOTpx o(=ňt4F@0 - ;).h\\:^{u~6@y8nUo<˂X`j G%QRTwc*B@ώp?_T>8~B>'<'\r/*n"}nQXw2BX95KqZ:72GyY!G~g6GfYRwH>(CN;Nѭ/Gq&)nKr+ 1wwlI!i'% 'Eߖgռ7`܃Ԍ$R,nZc-lY۠T7Bnj4S GZkGE($9踑wO,I0RXbZ%!tE؈ؼkӔ]hVy! k+^CUxDXLu<xɡ=ة1G$!SRrFZܛҖ@̯(!;3մ`Wp͔n-Bfr4y!r. Z s70\Aƀ[SU*"ޏyt"Tdy(=smlsD04ԞO }#U =@yiv!`?4 Y[d҇8&ZDUr>WB޷.Ɠ$OP2u]"!'^G ֽ4Z Umz?!QJc!zqo^ålOu:3wz_oa`̪" \cR\ X31FR\By3wWElEO"ŠIX%ڻcjeK!26O;(OE'yNT?{]҈PJ ǚpToZ[5!"Qޚ~ibwXILģUUz.`:rVq a6 摭 c!S 9۴\Z.@ʓߣ`,y::t_cƯ7"( CmUaG?0΋2 M% :jƝ7.ZQS%7AkKP/E>j)al6%xߝʼs0\W`x7OZahD&^AX),&c!M)r[`lD/5נrbm0L6S# K*".!D/B+2tsh<W|,b0}x.1c9լpU ;Dn7[s}8-q_?\m&lvIWmcC٩6b%M]t=fuv1F^ >O[AkHr(rL SVdJ>'hg(Q^q!SOcn&gE_ 8n#]a 3{ ȣʠHv)' qeY5 (Uñ'S,ox5ڰCQf1ipنr 5S|Hw3ҟSg<'ݓ ٍd6xJWRF٩c-/?mpzt̼~!}i\}Vr|f@G~k&M'٣Wk*]V j2^΋O&u[g_mK\2)gb;h&#(;sD&I%Vtkyrx/x UΊQo?"B;ݲh.Sh4A*d?u-a;9C#>rj8Jďy|[hy૤4ϡQG|UXjI594$P~\CF%2^;5*DS3Kγi#R+9עa_oz"ZH^SHu9ȽA_Yh:i,%tGGfbIfDU]wVLΌ9h;/Pm]%v S2ÿ`<0VXЉ<ĂZNǼruvUs@xoQNs(֏ gl&Stc_p5C0wuQDW$yV(`Ne;gi.b}X]mbNeo #Gc|D݊ .z e|0v1+,OrZ25zu)\Yd|+$+nSJ($ Vcjba<$/h^# RbԮ-!\uΝgIA |x*.T2EوJkK[KiD&ħ瓦ZJ%\B\chv*p@W&B.ު~$|cϗ횂ӛߏcK%cf{iNdTW[% *#3P>m}y_ nKtq8Z<76k*U(185lw* _ɠ0".`+/tTD #NWf34t`Fsȑ+˷;σAyiOH]|)=YFKHNAM~̝u1\}˟(gד@iYNӹBAa7 ~y3Z]Y0?m%a&Ok)T"f\ oN ޥFqх&גp.y[,4Ƕ=c=[dѩ/!L iw̔M"Qͼ8(\~C# fLR[oOK但J92vwj_7b2^}tͪj /v:j =lR_Q( _Mʞ7J2Ot0˷ $eTV|\X0 `o} 9g!mݘ~Fؑ| 8 1JWhddp!dI _H"jt+hiiOQwa.JHf;϶|*^Q& 'gH`i[q)|o"~g-g+W痦͗}f&HKc:QC /W$Vl_dְ0ҩ3uu1ߨxc5:`iGP#!ǮLw`Al[^➏Q4(iC/`wU|ɲ!UxAA~F1xK/H1xmD HE*i ija l.5<.&)㠸djQ Bx9K/5X|Lr1$ܤbrⲉ[1#ltom%S湿s{ɌR Hŋc~cqO:(˘*-V3ƿg9DiP}!DQsXg6[+V?X q qXWj3 Qz)eaIJKXxg/ BɄ^|+!p?5MT`CU-4(#BgfyI]e%x¨`vEް P|!7#3ż44λ8gtU3:mڦi7T<8 ٦do'0m q ӐZRd'ȣIԘU22m'T0`';ց#vhG. ; ݋@}{B"/1jNFV;SԾL{pnNb?DOYn~.lWۊY5)5#|{(f!7@yH$Mܫ<%PCK:+jԬ&b\|iH

 \8r$"y97-[CuzDϵ@hk%ji$! +xWЀ.S%zQwƗO8gz]r:1 N=OcId˙_|V%Ve68GuQxp#}o¡wG#EMR;@U(Z m#r蚗jWIABd)ٲq^*RA\py)/L92}@4ڡOMOI;G$87Scwژ3ɰF;9P{bo$3N҆h0* |ޏ<]x'v3 Z/_ăVcLMDGD9D74QW\!΍w,/عH>Um3uy[j/< #+UOPVW^cגGx(6(C\! v3V ɕxxztpо3 )󟎾2yWY aCR9, zr_ 2J t %|C^&tI8BjIfWT!h|m3{|AIOYJ8Zva:#I[q-$!R.7`74 Aio]| 7 h&drbx5JpHud 68RyAǐj/ʉqWB*{Me#aPQ]w@?\1 Py^S9Kv2Pe)\G1њm,p(EG\7vuⴍq21[ 8c 8%qf[TG&V)p! q ֌8z9 z>IZnI,?YZi`%G/-vQjQ+wk8o%c :^;̛O5݇}6`۲ SU`Gs{~|[(I h 5*]0&F/sg] ~ A3_ S1ߢۘrPGl WM`\4暝b[vSm~fڝ7{z k P Ae`TP8kT39"hn{m;[>}ufhY:c:ifXA98Y0P5x5GaOEɦ|8{ҷ`N1_ImtV, XUO)y@ 44aI CyڕU~]ʘ3k[xӞƇN:҈{luG |5$+ ~cj?Nh".EA`5'B_ޮkmdHZ>8`b_3o.&Mo(/Cʞ2`s|Wo\64$bmd Mz$*E7+xs&$ $| @-%tP=bqzYvw+S]*o>$>d wÆ>)֧ 4o2F'#AdnӰEj/fG*I&ģ3nc*JOya٫W,6XԪCCRi(| o)S+qWOVNiUTM^ rֻ\c ; Crb:Ȑf_9 4@\gMtr O"]5YQ/k{Xv F|m3e5F D_Ën3~n[x,ZouM J+`_18e&QuwWU4Q-ᦄ@gu"5R6 ScŽz#hm)~Kb1(je;}Ut@aɱL2ý~\3w- 'x5?f[ ۽C'$RH8A=r<_/Ze" c\q2% bJU1J%7QDOi(\Ȓ՜r܅k1s'Tha}e-ؚm] ֤}iQT8 ГDÁb FoYM] Ezq[%71{ 83UxhWC; DgVXRl]|م.PCPgt0N,ic$&?QϾݶ;$|&1EĢh \(|ߛ4䣵:l7*~J?F+Kun\~Gn36OϿ]"~f΅d3FY7>7,~g 8woB$u5Umf- +q-LeU:תTݒ|-͒yuw4w֪zҟ6j?J@.$\UYE]%kV #=ybAeO4,[QzP$Z5RKhS _ywGKxՂ fZ0d21Lq$bUiW:;: 4J] B-.Z*}60@u ϝ#܄s V=uBuHa'wLWg$Й˨ `W %Su>6(JF?<jѣ zkҍV4/aK;#Ơ9yCsvv#qfM2d+BbN#(#%I>U6~$c7#wǎNi!<ܲʈzzsvJqife ^ ,S4L VRďLy5\Unt+)x_ǂ qGmбDSY;r pځ'Erݭԓl7rrCĈb!>tX|h-TdK$t.q2`^4i_mmQ*܎m;9791|fZ7s#yrT-\Ů3f&z*:/:"tVl=uf#E6IJ[jQ$g_pF:S1ܿu]~!Pkjr4 5FyE?zX8}]$?2df4pt7w>ٞ0R8{ kB!s" ^J?5%ҁ ,:C"Z2UN[n'y=4=i59ʡw݀x>Y\eĿ{IN1޵]܄ y#hV|'xH`x⾮JRʾKQg0O8$ [5T2ӪoW4ޥ 8rK>+E! Y}KU7pDwJ+;fn*cޑ_1),#Nzq B^%ko?C`.v;춓V1'챠^πz @fj-5:Se $\1fof"[WSVRF 5oS{do-;5rz=[X%Goyз>!uY*8NS}epamgp-(Gֶ"/1,j*Գ<2BN91t~=ׄJ (Ze7c9#+Pk!LaOQ *I6QL']-6#>(<II\cuU1|v^6蘫f<7Is />*xVXϸ%sLR69jhf1'qyI F$3R"/p@STK熅\[f6EZMoXa'96DAfePۡ%yg^VB~CP5+@g\b~H͍lrbՉ!%,'bѪw[hpcnĺlrː{&yy;A!Z0is$I0" ғ$%I}% O.V-}y0p&i[C?yo4.z!̽~6GVeԬDấsWHU}45lƏvjYqY1A, )RiJ[~a>QZch80՝zpEDV є?јkϔ@ 0}hX+5d)VCJՈ$7SNd&X[M=h͢ۍDoy߈`|oXX&%߹jx@_dc>Oi9) yxq:v4(8&SѼ(Wm\]95na]ë'3r[%`~M1%Vnzb M&ʳ,Br\R\å".U(<:zpHE bd'boP?Y^,uMɻ.2<0_.ߢż:d`ݖ׵'kƈ'@Q3 [##ݸTw,7zG32?(@vɘq#8DQwD9M1K*d8N_]gfO/b"R_MYo4u>anS (4|6 Y 9'9Z"ubͩ=0t =AyMluܑ3?32㇏CT* 7mx|6.1Xy%m߇eS l2QX! sA곉q$eب+-Is2" 2"{:=A;+d-۔P` -;U,쭯RMfg2ns tTs> gXvk(\#Q{UkHY`s$"TĔ,F&"D%CRR! oRf˸~=nW/_"AؾbC:DUU' :ˆHi!oQWHɠ8t)Ir/M9Y"vA)ԗR6^oJUl8$0[Izq(|Yn.q&h,pʮxEOLr[Eu%l;b&C7Ǎ?P VKrn]҆51k(Aa]T뜿I2] [`%r8bQFg(KiCPOijt^- Tzf{^-&AvHK!e}ʧ#9Ʀkf]'o^ڤu[>Ceidu>ic2/@H&vhW$77/a2/#X5EWDl<ϭ/6~;Y, ̮ 7}ޫл5YyeN˝*;Ic8Iu2–)3<*ժUZR'䖏 vpUQ޸2Pfchfr 6p8IYQ9<: Cfy"A{+b 9B%#5YZSf6,%8{8ej Gnr" $Y1ZS1:'zC9$"S(G5Cvca1099 it32|jijyjjklm|mlkjyiihghgfggffufgghiknquy~ 挈tiijkzlmno}ononmnmlmllkjyjihghhgfggffuffg hjmptx}͊sqqijkkl{lmnopopoppqqp pqppoppopoonnmkkzkjihgfuf giknrv{tsrqijklmm|nnoppqqrsrsrrssrq ppoonnmml{kjihgfufg hjmpuy͙vutsrqqpijklmnn}opqrsstuutsrrqqppoonn|mllkjihgfufgghilorw}堚yvvtssrqqpjkklmmnoopqrrsstuuvvwxxwv/uutssrrqqoo}nmmllkjjiihihggffgfugghikmquz|yxvutssrqkjkllmnnoopqrstuuvxyxyz yzz{zzzyzzyxwvvuutsrqq~oonnlkjjihihhgffgvgghklpsx~Ӊ {yxwvutssrqkklmmnoopqrssuvvxxyyz{|}}|{zzyxxwvutssqqpnnmlkjiihgffvhgiknrv|4ϩ~|zxxvvutssrqqklmnoppqrstuvwxyz{{|}}~~~}}|{{zyxwvuusrqponnmlkkjjihggwgijmpty㭧+~|{yxwvvutssrqllmnopqrssuvwxz{{}}~5~}|{{zyxwutsrpponmmlkjjihghhvhjlorw}É3򳪦}{zyxwvvutssrsmnnppqsstvwxyz|~~~~|{zyvvttrqponmmlkkihhxjjnquy9}|{yyxwvvutsnooprstuwxyz||"~}{yxwvusrqponmlkjiiylmosy~ԉ8̯}|{zyyxwvvuopqrtuvxyz{}~~{zyxvutrqponmlkkj zmpsv{aް~}|{zyyxwwprrtuwxz{}~~|{zxwutrqponlkll|oquz;}||{zyyx~~}|{ |Ȉ=~}||{z{suvxz{}#}{zxvusrppon otw|>Ǯ~}||~|uvyz|~"~{zxwusrqp qrwzԈ>د~}{wwy{|~1~}zywutsqrrsuz~>鱬{vry{}0}{ywvutstuw~6~yurn{}/}{zxwvvwxz‡A}ytpmi}/~|zyyxy{~tү|wtpmb6ž~}|{{}Շ㰫<|wsolX1*-~~@򴭩zwrojM0,( &zurngC2.+(#¾Ć;̯~ytqm_=41-*(ȿ9ݰ}xtomW<630-+)ɾ׆8wsoiN=9630-,*Ľ7zrneI@<8630/,*Ż6ǯzun_GB>;8532/-+üȆ5ر~ytpzYIEA>;86420.- ɽ5鲮}xsoh[KHDA>;975310.ѽ߅5|wsnfTNJFCA><:864210Ծ5ò{vqmbUQMIFCA?=;975421׾4ӳzuql`XTOLIFCA@><:87542 ¿Ӆ4弹~yd[VROLIFDCA?=<:8759 Ͽ4򺳰}wsoic]YVROMIGFDB@?=<:9HY߄4¶|wrnjd`\XUROMKIGECB@?=EUYY -и{vrnlgc_[XURPNLJHFECBCQYݹŁ-ặyupnojfb_[XVSQPMKJHFENXXYXׄ+コ~ytprrmiea^\YVUSPOMKJLVX0Ƽ¿}xsputplhda_\ZXVTRPONTXXWWXWXԽ)о|wrszwrnjhdb_][ZWUTRSW(|vrx~yvrnjheb`_]ZYWXVW(wr~}xtqnkhfdb`^\ZWgV)|w{xtqnligeca_ZVVgV*|vzwtqomkifd_WUVVgUVUV$|x}zwurpnljeZUfU&}{}{xusrpm`UUTUTeTTUTUT#}~{ywushWTeT"|zxr]STSdSTSTS"~zgUSdS#¸rYSRSRdRSRSR Ĺ~bSRcR!ŸoVSRQ RQQRQQRRQRcRQRQRR%ǻifdccbccbcbccbkcbcbccbb%ȺihUTQRQPQQPQQPQbQPQPQPPQ"ɼz\WgSRQQPaP"öf\YWeSRQPOPOaOOPOPOOPOPP$Ƹv_]ZXVeRRPPO`O$Ⱦgb^\ZWUdRQPPONON`ONONONONOON%ÿuida^[XWUdRQOON`N&rkgc`]ZXVTdQPOONMNMNMMNNM_NMNMNNMMNM)~yqgb_[YWUScPPNM_M)}wqme^[YVUScPOMLMLMMLM_LMLLML&Ľ{vqkfa\XVTRbOOML^LLML=Ƶzuojfa\XVSRbONLMLLKLLKLLKKLKLLK^LKLKLKL-®~xsmid`[WUSQaNNLLK]K-̼}wqlhb^[VTRPaNMLKJKJKKJ\K JKJJKJKKJJ.ɺ{upkfa]YUSRO`NMKKJKJ\J1Ǿysnjea\XTSQO`MLKJIIJ IIJIJIIJ\JIIJIIJIJ2»}xsnid`[WSRON_LKJJIJI[IJI-ƿ{uqlgc^YUSQON^KJHHIHIIHIZIHI.üzupjfa\XTRQOM^KIH[HHIH}xsnid_\WSQONL]KIHGHGGHZHGHGGHGH{wtpljfdb`_^f\[YZZYZYZYcYZZYZYYZYYZZY !zuojea]YURPMLK\IGHGFGFGFGFGGYGFFGGFGFľ|wrmhd`[WSQOMLK[HGFXF zupkgb^ZVRONLKJ[GGFEFEEFEFXFEF !ý}xsoiea]XTQNLKJIZGFFEWEߨ"{vqlhd_[WSOMLJIHYFEFEDEDEWEEDEDEDD$~ytpkfa]YURNMKIIHYFEEDEDEEDWDED"ľ|vrmhd`\XTPMKJIHGXEEDCD CCDDCDDVDCDCD!~ytpkfb^ZVRNLJIHGFWDCCDCCDCDCCVCDC$|wrmie`\XTQMKJHGFEWDDCBCCBCVC"þ~ytpkfb^ZVSOLIIGFFEVCBCCBUB%ľ{vrmhd`\XUQMKIHFEEDVCCBUB&Ŀxtokgb_ZVSOMHHGFEDCVBBA BABAABABAUBABABA 'vqmhd`\YUQNJHGEEDDBUBATA .|sojfb^ZVSPMIGEEDCBATAA@AA@A@A@ATA@A@ A)~y}plhd`\XURNKGFEDCBAATA@S@ 0{wznifa^ZVSPMHFEDCCBAAS@??@??@?@?@S@?@@?@?+|xswkgc_\XTQNKGEDCBBAA@S?R?)Ϳ~yuquhda]YVSOLIFDDBBA@S?>?>?>>?R>?>?/ܺ{vrnsfc^[WTQMJHECBAA@@??R>?>Q>'キ|wttljgeb`]\YXVVTTSSR[Q[Q2ŭ}xuqmima]ZWSQMJHDCB@@??>Q==>>=>>=>Q=>=>=>=(|٩~yurmjfk_\XUQNLIFCB@??>>=P=Q=>=&w|馡~zvsnkgdi]YVSPMJHDC@@?>=P<=<==<=<===>=<==<;;N;O;;<<;<;1bfjoty}!|yurnkgda^[bUROLIGDB?>==<;N;N;W\aejnsw|葊|yvrolieb_\X_SPMKHECA?==<<;N:;:;;::;:N::;;:[;;::;;W[`dhmrvz虆}zvsolifc`]ZW^QNLIFDB?=<<;:N:;:;:M:TRV[_chlpty}栃}zvspmjfd`][WU\OMJHECA><<;:M:9M::9:TNQVY^cfjosw{妀}zwspmjgdb^\YVS[NKIFDB@=<;:9:9M9:9::9M9:9:9V:99JMQUY]aeimrvz~}zwtqnkheb`\ZWTQZMJGECA><;:9M9M9RGIKPTX\`dhlptxywtqnkhec`][XURPXJIFDB?=<:99898989M989899898989988L989Z88998998DEGKOSWZ_bfjnrzz~ߥwtqolifc`^[XVSQNXJGEC@?=:98L98989898988L8QBCDGJMRUY]aeimttx{ܟtrolifda_\YWTQOMVHFCA@>;98L8L8VABCDEIMQTX\_cgporvz}ږromjgda_\ZWUSPNLUGDB@?<:9878787887L77878788778778877K878V7887@@ABBDHLPSV[^bkilptw{~؊omjgeb`^[XUSQOLJTECA?=<:87K7K87Q=>?@@ADGJNRVY\gdgknruy||mjhfc`^[YWUROMKISDB@><;97K7K7Q<<=>>?@BFIMPTXc^beimpsvz}okhfca_\ZXURPNLJGRCA?=<:7676767 K6767766767767676J6766767NOLPQQRTUWY[^dacegknrux{urpnkigdb`][YWUTRXQPONLKJKJTJTJKJ9:;;@CGJN\UW[_beilosvy|̨igeb`^[XVURPNKIGEQB?>;976J6J6989::;M<=?CFIYOSVZ]`cgjnqtwz}ɏgeca^\ZXVTQOLJHFDPA?<:976565656I6656556566J65665678L99::;;<>AEVKNRUX[_beilorux{~tfca_][YVTROMKJHEDP?=<:86565I5656565I5655789F:;=@SGIMPSWZ]`cgjmqtvz|õfdb`^\ZWURPNMKHGEBN><;98656I55656I578C:<:865I5I556767L8N>BDGKNPTWZ^acgjmpsv}|tcb_][YWUSQOMKIFDB@N=;98654454545454I455455445454I445545454455565656D767L:=@CFJMORVY\_cfimoryx{~db`^\ZXVTRPMKIGFDB@M<;975454H454H545455C66J7:<@CEILORUX\_bdhknutvz}ca_][YWUSQNLJHGECA?M<:8654I4H445BI579L;976434H4H4334334D5I5569;>ADGJMPSVY]`cfmmosuy|ma_][YVUSQOMKIGECB@>L:8754343443443H43434334343H33434343@H33468:>ADGJMPSVY]`cjimosuy|~el`^\ZXVTRPNLJHFECA?=L:8653H3433434343G34333H3;57:=@CFILORUX\_fehknrtw{~yck_][YWUSROMLIHFDB@>=K97643G3G33H3958:=@CFILORUX\cbehknrtx{~dbk^\ZYVTRPOMKIGECA?>ˁ͊͐͐̏ĠˀɼT?>;9864210.-+*L̀̓Ƃ̄ƅ̍̄ƃ5˫`CA?=;9754210.-\΂DŽǂ̇Dž̅LJ̍ƀ̀,ʽkFCA@><:8754210lЁ΋ː̐ˍƀȀ1ɧzJGDCA@=<:87542Ňˀƀń ņˀƁŀŀ0ʶNJMJHFDC@?=<:877ԀƉ˅Ɓŀƀƍˌŀ6ħȕPNKIGFCB@?=<:?ːːˋŁ2ʰǣTQNLKIGECB@?=HŃŀāŁŃŃŃŁ Ā3ɾǮ[URPNLKHFECB@RʊłːʊĀ2ǯ̴bXVSQPNLJHFEC]ÇʐÁÃÂĀĀ0ɹj\YVUSQOMKJHFkĀĈčɆįǀv_]ZXVURPOMKJyɐɐɈÁ/ȶ}ca^[ZXVTRPOMÊÆÀ‚Ĉfca_][ZWUTRQÆȐȅÇȆÂ,̶Ĕigeb`_]ZYWUWȉȂÀÀ¶ƀĞnkhfdb`^\ZY_ƒǂŠljÀȂ-ĸŨqnligeda_^\hǐLJȅ€ā(Ǽűwromkigeca_rƀDžƀʂƈǀ˂1ǻʼ}usqnlkifdc|ƐƀȄŀ ƾżyvtrpnljhf Ɓȃ-¾|zxusrpmkjԋƎǃɂƀ$Ó~{ywusromѾłƿŀ&ś}zxwurs΋Ŋƿ€ɀĂŀǀ!ƣ~|zxvy ˽ĽɁĀƀ$Ǭ~|y Ⱦăſƒǀ#ȳ ƀÀſƀ&ɻ ÂüŀÀĀʀŀƒſ€˂Ţ‚ ſ ɀ̀ɩŀĀ΀̀Ͱ»ƀˀ̀΀Ϸ%π־(ҀǴ'Ԁʹ ;нƾ:Ľ6û€=6#&߁2<5 8">'' *$)!! # º# $º#º ú  »!û$ Aû ?ļ >ļ=ż=żż;Žƽƽƾ9ƽƾǽƾ7Ǿƾƾƽƽƽ6żżĻ7Ļĺ¿ú8¹¿¿<¿@ ¿!! ¿"#!#!¿ !¿!!%"%$"%"ih32hiijplmmntnmlkkoihggfflfgjq}wq!ijlmtoqrsstytsrqponrkjihgfkfhmy*ƕtqpjkmoqxuvxyzzzzyxvtrvnlkihglgksρ+࡚yvsqqlnqsv}{}}zxzspnljhmio{+񮡠zwusvoruy|xtqnljomv+|yw}x|{wtrwy+̪~{x}|wsqy|+ݩv~}ywЀFt^ʼ~rS- ǶŨ{nK2* €׫~iH92,ɳ诩vfK@94/θybPGA<73ʺů~qdXPID?@P״{rj`XRMHNWX軺yvrh`ZURVWſĽ~zpic]\Vyrk]U[Uƾ{jWSSZS|_RYRŮu[XW]W ˴a[QPOVOPO̿y_XYPNUNĻ|h\VXNMSM˻wi]TWMLKRLLKмsfZSULJQJ}ocWQSJIPIػ|pe[UWPNOOTNONñtg[RLPGFMF ׹|ocWOJNFELE 꿰vi^SLHMDKDƶ}pdYOIFKCCBIBʹvj^TKGDIAHAȺ}ocYPHDBH@G@Ϻ~vh]TKEB@G?F? ܰyqe\UNIGFKEKE |뤘ynh[SKD@>=D<==<<;:B:B:#R]hs~|skc[XMF@;:99A9@9#GOZdo{߰tle]VTIC=9988@8@8ADLW`lt~إmf_XRPE@:87?7?7DFIPXbhpyҖkd^XRPHD?>D>D>9;A<A<fxꢀre[MB=;?;::;?;Qbrtg\TG>:9>9>97CM\mzٖi_TNB:88=8788=788ADM[fsσdZQLB<;;@;@;89;HQ^kwg[RJE:5:5:56<@LXes~^VNFB7494943385=IVco{pZRKC@5383833   ހ뿀 彰࿸ǀǀƀͿʲȶӻUιũӲ۹̩׹~~ů~||ѫ~}~~~}޹xx|xѨvvzv߸vtxt˹xsvsϽ|twtӾwosoܿqmqnllpl߿yjjnkپommpm ̸phlh óugkg ֻmjfjff́́́ ʍBˁ́ˁ ͩYˁˁˁ Òq%Aˁʁʁ ̥̇1*$Xƀȁȁȁ ɻʙ>5/p΀ǁǁǀǨɨMB<ŁŁŀȹô]OKāāŲn][ÁǽjmžđyԀȢǀε¾DZžÿMþ¾ſ½¸ø ø ĹɿŻȽ˿¸ ¹is32 egfe_ˀ]fiqpnegfcoqagturpacbZYauzvur^`_UY]q{{td\^[czSoua[VXOIdrXXYTVK\YpTVV>OPTHcOQH3$KEvDxYGKA4.,I@heyNHJC=950AESmBWFOKGC>989n\^CSZWRKFBCB0iUNff[OC@==?=Af[fjYG<;8;::<9\|[YL;878;8:99;8EE91336546365464 | Ѐ 鞈׎ńz~~~yp|{yރvuxrDzs}yȲqn|㡕ǭxl2koojŬɫsiglmmnlqoggjmkmlkmktlbdeihgigihgigˀНy֧ ǎ5˶OǤl#(͈(+?̽Ȝ81'ZĹK74uֵ`=DsDW Nh Zw 秣hDǰuܼ׺t8mk@6Թ6TW22::UV4477VV::::WX6ᾂ6h8mk 44aa4444cc55l8mkTTUUUUVVs8mkt}~DisplayCAL-3.1.0.0/DisplayCAL/theme/icons/DisplayCAL.ico0000644000076500000000000047762112647526530022310 0ustar devwheel00000000000000 v (@@ (B)00 %Q;  ` q h){PNG  IHDR\rfRIDATxڼ &usfg/,v/S>$,/1Ba iKLZAӢ|4  ,6)@4 pX33;GOxˬgfTUVUVVVR[g~^g;i{vbmVuG\sioiw:}7֣snb.-^jV)l s s~([`=r ЦҾf_џ}'Lٲ9~aesݦOV=ndjuם*>2ʹTKhfᴼى!xC+5Ҫ:S?6tRxִOQt*7M^(_sδREďш oͳJEd7̕{KϘk˸o1ԣp}^C-M{txA-_CA܆FQw0+Q׮^|5;wK`8}GϘ;de 4H+q vˠtV*f @9 bOg{T_(-%ֈOӢZo>:MuDW*b1Nmu^nk qz$t:vo7AJ >p)L;-/ξB>* ^b}[%r ,ln9P%fJkpޘbJЯͯ'ru'>܏y3hQ1``8ؤxMZ" XE$=[1'U*<~jӾ+V ƄWTюk:WwBAӁ.}8:Gs7((Au,{8CR5x'@|lUbO!F`1\MU(p<)B n8Q0g $"&%v=.CXຩ T P8PX2r6-W$+i`$&# sB'MA[=H #Ƽ 'Px)3Z,?cw;g`@j@}0QV`^pyÿQ:@ ϯ5ҁ~Osæ5W~XUQ⧪H&r0:U OQ&ؖ j' Dbz<',#JSxZr*&84IedC :LB( $e(zV HtWķ#Q]g%(Bp7utÃ+k^ |[7^ x30k [~`/Y/QΰrY#j&Gauw<)Ri>oM &M??mO!A eZ2qRGLh ^F{t.1n W5QOr9%0@0."`kH"`*?dlH}ۺMb`@M ZIG`[2`m3om^-V: ?^,O ອcP*o.b<x;)[xvcVzLx/ _3k@ *g6_<IRWt[i5 5܅Ep9s@ ;`d2DM5HLhG|}hN$fU$Vp:*/';.'b }&_MPb[[3A =Mbֵ @'+;M@ *&b[6#W"1D5@_~B-PO~|d,*eBHI;gJ/HۃQ2R%᳒)e{ DpiӾx')il_ a89!#ĨD{M!ڈROUQ?HGY+ n=;5(l{tn>/s`))  sNF]ˏp'۳qspƾD{v/p:ww,pޟݱ=R_?k@*ymg t0nAnSCAAXm&,]х"~tvxW gB QMMD`rA=ERKO8%'\<D'd)lm@^*tMn`/$+Bhb/[ߜ`YyN-|t@P8b/?*Zpοۓ!Ou}i.1 ZoC Gh)'<[vn ?`s-haS!?{WZt0|y@QL1So 1Zb$-"=43X ɢ|%wyƴVP+I)*r5c@ @J}ȝ[G6bEA2 mݧG~6YyE|?@O Nn_rt 3Qh+^qREܘe8-$2@`` 1E)Qv8)Fq3CzQ "DEn""0(+i$)0lk}pHA;6)G <@›@K`~N;b-RaE_ +RJ8pl"TA7@0hq&.I= ߳q4 @PM,~F 9W?=}4,E? ܟ>>|ԧ`㎯T N_ 8 6sJtG*б;P:DԐ`vA]'Mym a/u(=jchxiMF.He&ij.hdU(2@8JO*f)%Y#س0P鐳qCA  G}r}UuK@#[ n?C?m vߚh{WO` “hYݟ}0ߩ}迵}$Y5!̙sS9$t1PC ̉ A4(gd1AF?IŀS:8}>՟' .tX{r>hNȺf/"G3TV`lϽ#L"70 n0_L7#|hhE{sF8?:(D*r76 m1?rx)`3>W| ZzP h~\n{zrH@ޥWzB1ITdykuRf˝3 u{O&?fk߀zK O;v{]Lx13h0O::.KA맆IJ {%w? rokӇ;%(5b@J2GځȲM!NeʹcgC7Vb pRK?`0+cb#1+D)-5>ѿ*jZ.@)ڊgG_EY~x.0G0(UxjonX|zqX~۞jx߉lS{Ojxߖ{."tL1Hb[oǀ3Wc=ynA__s\# >)Pv6[@+ RyRE%Sk%Ԡ+e)cIkP[%>J4"@dBjEfL8 W}}'+غ{!+OE)՗Wn^Z;i*D|;A}}lg/>߻+4_a/C0A0S}s~H|~~S\߃;)&8oҝӷ$\>o\9Н.g?i@̡,2p65QJJ#}^A:HlO|}Ӧ} ۢS%ǕH"EAB *K-/tqj2Qu6Hn{\y BAq oJQ׃@Ss԰xK6~ns:lș~ _G~  `e`ܳL\s ?Na_Gcp7UGvYQGZ^w 5e$7l[u}VpWcIb:fN.c ّ|dK"_'0^~e[DO6a߸mNQhQ~[#\X|j8Ԅ0 u&vZmk3|vExD-m<{{mxOa޿M (>\TS/X joyjI b߁`i߫%?woo3DOO/7( Ptz_l=ވ3m~Ts?ն.Y90oO/^u짇a!)v#F0m8ELE AG&㩿c?zh52)pj6#Ch:( 61qהnSb<mpJ1;#pp{ch_=~frs=wB 3t opRo,=s^XK~rO(D){#`Xyۧ hA`ˌ0?Gbw|硷s .~ `vԯ5s9Yx9N1 HDîCR*fK^ЧDdz\~ƐMRp,JKC"0Sar Y@;PcSQ9_%pr'/ m='d>B "B'/ w+qTGzR~=8֬o^'7_;^9~nzgZ ϣCO}u.1?"a@okDO:&a96^w}m3`l觞ՒÒr$F odӄebz . hY:7'L}trc}% - ^JPeOL-WA'N\FϔϖQ-Ayug}&_}^(WјKg> щ 0禞 3`t_}zD >tcVVOMz ڪޟwoIQ?+ xWY ܿ˵Eu6f#/tCĵtqw´o2(\I5:.=/,m8PjWuDϊ-mCuhVdzM}r ?@O5Wh4Vn-ú|;یp/-QO0jƯe9~,+]MqxLQC},ϋ|h@`ϫ>*D|I7?Q|@֫hAS.xBA`~KT 1E6!QN8@מ.Pm'"䙀hHmU}JJ &-Gwy)r%+wCJ `#>C/篸 /w>(Mޟ<|A`a>~4}~;X p"z8~pRbA^qOZ~ifJ@lCS"lawӓ_ bQ^`|o__~K3ڥO=)`'  Js-JF,sK  zoo>TqFQ)3ky C̓w'恔ϫn6MZCSzJY5޷.5*w頯?}%S^ w~U /0C^9":fo[錁^:cUMX\;`^* "2v>Lg(ۦA:qG=x Mk e @-/\a#n BŁ(3x.oIDRF!pL 9!M`o ({fGJgtjK}+E5C0\tn??xZ|H溺>aY/fZK}XF?I%   '_BޓﹾbIKP 7*_{ qmt"0a" lD & \z^eD"j09tW9 #C\hb7CRP *%z"]>* AGB2 @ZG>pY4Ro[`?~> ,m:o=kpo#36{qjf~8SyiLA`eF>A7A@w6g~9z`P8> NG@#0Pgͯc ?}hwR,@8j# 0H$stf_tRQJ>D57`Z4As٥BA/gqe#׸ށ6/Dab<\㜿`j>܃W16ms} ;6W0z8ʁ@ck&_iht}C Iz_~@eB jA5ZٺI@jN%xHL5ާ~auL AXM2._@ ~NT$=0 S B6V= ǮMI+"IG0:3˜AwR 48ϗb'8MkUX»ʽj~}@2IqRVwQ6 ђvqS|hK޾<",^걇a0,n^~p<29 wFA'%?X?.y z{ A5b \zەyT/4D-y\@g O}ZIW V30gPIC4X^õ .EBA#' >5GV ђ/fQ-p {@ <NBF6yxh[~L b'hpUj~ gE6`,mq2O]6>.~<[^FrF?XGW!q)nڌq;mPȍ@N0뼜K 3eS @e8AB3K@a} ˗#3˅>ϡ =q~@ L$-}߂R`"I,v) %a+ܽmF ?J`%uxw`b?"l,pD?vlַ >iURPhacW?b?#K?^gn%D/~@DB\:=K@̽f yoh> t1 #P$$hyLҠ_kR {lnKuv`KH3?H\s:*aQ~ "Ͽv3؏ H \ B xms| мگc5]؟y%U|rI=sF@`ߏ=B"#w eu*fޅ7N>/HRW D]s Yׇ+ #g^n}U>1ۘ.?TΗkRN:|=G |um{>U~NNj !04/tш\lyNUƎ:#VϿz}7/6Ig_)ϻ5NлpF D0ӂWG`]\? ǧ}Pd}}1s؊m :6FSCFBQH0zO@*ϥ? XN)ヴoX)j"];aݽl$~>e4]$&0"j"[?V` ԔAۧ?OsOUx`6ௌ{E[1oܪ~. x)ω9P~8Gas ;$QD;2PuFXom+'n?[{$+8CH.sDZp uUpCq80 ab(  }C:b0; 0 7IJ:@C L":ЁXk"t z(@Vzl1:KDjq,P<AQdsDƎSP>|_ |> ݍ~b 57N+1Jq8>87 -hO=RkT 4Ģܞk^oұj} a!Ot/(J_BD`M3B 2ZV" eE~;G hg 4e S-(eL^WE'FAO!Z7>= K76Ϣ }$uD@znBaa!@vTY0,,nt_4~GڅgzuU[Kj=|7Ǎim%лds~si\O~%ztg1!svg8&_\ 7Y#LYѥL4K":@ֆ y#쀴_B/3uXX7&"'џ:>%~'X߸i߲sށ%b ىEUq NW UGtٿ_v8-?֌{8KV6GS{wG/(D_5+ 1 =HCpm}z##p$J 93Ʊ]1!OEKc# B*y h"B"P :KҖ "v&l H|r?a7 Y lu6AmZٖ!XRb>r(Eܝy i%ގ?6+݉ 2f?R6M77 =P@/!r]z? 6[N?9l$O.VC W,b`@?ji~Hg〾_ݫ =Iܐ%Pim~#Sظa>sF lз}i)\l`A)J"ܿj @ABѫspy_eg{J˙`&M޳S`+1}lqN= oL}c P@TTC)`zdE_8 uuz`&y/hn@ W4 }AeGJCW n׭*:G^C7;\hẄ́͟ABF7*E@=Y_` /.%!?@B(bU[qOX[sߙ&|zi{jWӰ'`< ~)Ojs<-\})A\ښ!kg@03#Vs@B#}I\PX { HDG߻'n8 H4 6SC0b$?%^7FM"(1"e)4xIݐ|OuIsi6C J5s0 $0]~U1lFvF?"|FB$.ܡGڋ}6N}ʧ?͉iAQ~,^ D"0^of5*«v6̍܅ؽG@,0Ӣ+Y C8n - X}W@PW^?b( ڑy *U-s)_#6C._0ȋ['&7X՟ %F,bmE_࢟O |pp >º~5#3~q'hx S{Sr>nv4h7Z ]{?]Wsey?2{L#O}Nʗٞ+ 7{`} Oa/HOӺD8/HK/V~\Ꙉ]Y`1!Y=G~v"* RKJaݺ^DѾDjm(ꌖM5e _7-S649b$Hw~O؛AH/2$"a24lҪhP7ۥռ 6['A,7T4Ï&.w*4C}gM3|boշCq\8 -.O~ · ~G>,Nns4ү#ί-S$%5 &5w>kd߀ 1vCe5u.?<ƫHhU #BOS` B )"|]*Ky;]Xecѯlyϱ%y53j I>j֋~o#inWߎh.ޑߟrySYZ|?Oե!I `%779۹ꅑs{*z~bfK9?4@/ Be EjA|ޢ] }ѯk-&|9uEv\9dFkGږ8ܥbG6!r^<8_4PC~NQ~+eKWXX[No; ?moJc ) @lC#0BQ~or$j@/e1S /)uWu/+`{P6 w$ۿ2#)gU3v-| @@kF@!((}S26G*-; btqQ))B<7"B]/k ozM^6I)_^UZs o#`(7Asݨx h.%q pYS({q}>[%}rϞĜH/_Ow^[wd+G~*GqVx}c`Dd$><%z:Oo>L Py QSxw6 ;?f0eu Ko%%$9mQQ< D9 ik @}Lۯ^%\QRBw C!>M}iOp~Km` &?CLϨ.~W@|#"T\owZ/;3c{>nKzfR_ Bp.P/ȅ&| ~^hPۭ['tP!:=ĩdEڊ¹s] rE0*kDlomju3 ~>lo;"؉ќ\~llRV`RdV:`V,WW{<LӰe3Ϲx yvoCX-szgECpp_[ m- ~=\{#E+TQY/sL'b# qfJP`[Ll7kP˹@>P6ҙ:^h HsKL]rzOwNX/^ˆhk#gSz5O =$\BYrҀ|ܿK b 6M%>H VX9 ]$%wfOKqP( a 4(ۏ%kNo @\֘i{'$#ox0bۅ}Y+dۯ}9OSC'y97';Mߥ}-]9]?oVrSwȿT$Ϳ[nޢ6ֶ/~kVAUy%BB 10Ó30a?n1pٌ29_q =eP#d})~"v @/ZkwznD}|@7Wj3vK}/e9wB| p0/9ϖ {@t\Dj>09;6ݓ{n&BXNB"zEӣ(-x<0(E\;>%N~]YS9>} Ӹbp2ᓡStfk.%}a,Ȱ/x熻 b.!C_&_C%I6/yIyP5DG#tcI$:YW/w;/ڡӺVɳžĖ˥S9P1 Jf4)Bv\(!W @ k?096aGMӠghАe}0 = hLH}!:Ͽ]5%~ڻЭGI; L{>7?*%Rv72 &zI:ڈlñWAsglwi@R69kLU藈0,tv@u2եG*0 `>I *ȿf#P'ZG}&!!й>^LXݞW>m9-e"r~k %r s[;p ` ᫻#=Ϗ^Fz\> p 8|ڭaOTUpi]tPgbH=_$3׮ƪmCHRǗ4z&v[-iסKS{%υWtVN_ߖ>(?Sktsh ?f̺* n$@'/`ć^)X@L+5?q]jĒjÁubp6VlӘ'ڝQkPs>`^xz&y"0L@xm81(}tW0yIg雺};c/S>l[w>2/#`t_Uk?x$ `0*mz&~U/QSv^_L1lueRq?݌{2ৎ(U"!qt.yH 'e~]qO4v&5uE}\G O` @f~a PL><|}xXk|mwL' 0O7ƗaoU9 ya;|NI:K'@;s't|p('EyN?, l^5CF7D-_)hM1Bo.M.NeArN@t\T\K*?ΟqziPRdϧ>ItbڨI]rT& \1d&*MZmm5#RX#/?Pᵾ"n4Jx⮽wD|]#krO+w^ mۿnHK*>uo; !X~&S>|ȯ5מb<}i0z;>C7 Ў.' -dm.v'weٺ4eGpu- W)4.̐sνsM Z]S/*Sy`*Dԡم,8;[{i4 އ;&WE}}|>I<܁w?)`aw,9D^ |\ =c^%'i8@PieZRz-`$2'ZZ :7}#R}ljKf524ҽV{.4`=m%:5οw8cO4f! %'@W"R\k?\bU?ۿ0e}79>'֬s8,uVLH;zUOlqTRQDY|;e}krcXnl8dzMf|xܰ\d`c 6;wP~mLn3O|0["?TaRx]8sKWΘ6UBzB{i R% PmUEq/ ~Z>G@}|;I+ +ӖĐ&5`u#㵒x S jQ,Iկ0 ̤l QB=\Jj$]&#FRvX'Vxl <60-PZ`H*T0>ކN k6]pE8ه%z 0 3wBk/\&.`i 6m6_G4ܵV_7z^&t! ? @ @T5f%Jt%N$g#u'/gIC&5ɶP@D:Q6G0 svM\7?44@@K_W9|JԩD@WeEk zWCO[yBω:HKr?q A0'fuT,?IBwu@7nKH9LW]M{!}zI]TA_h`~}ÃCrq*]&_30xk{j폗7zھ~,;1<7v0'h>:X{\|Ә&|-C{+jd@Ӂڛл ÞY/0H}&lcm}`/}{<7O 磋T"ıW< S!j)zT$*:!%珰 Uk D %gOQ/.S]/ Ln<߁{ZAq1؇ >57V`WLye~Uo< ks@\f A?}vahT}$똀+9!2Rpu[гS .\­G@M6+WOf7%<*oh0U s*E#ہ $&CZ}9@Dp;AS%5U9m9] #}10vF}=-a|svTW)1ۯ9 #oM'-= ]8l,ano {rxnߗ PwQ}RwbK67߂bXw'S< ۭFAw% (`8/M觢R}w$(X69%:2%hV`)fà>I9c!/vNWh:p) 6dlXÝGC+ XjT~h T0Fޏ*ׇV ;asm-k#LjD@F6[40|b: Q/#w>⚃D(lr ^r2s5Pbr)PH t2?'X%vh'K-4ˍdݐ9!%nWM2 q@Lƿ 68h9~ 'gI puKa&2va@ѿݸe^|l^+{|T78>c*~:o?]7]:Ą^3;˫⫈?GamQ9V}±ҿ:׊Xk/''XǹQ 0b苰";ibZEDDvҢ42՘3C[ @" YџW\cfStݮ<˄š|mO +@M>F| ѭ$?c7鷿;/< ;CHr?7-h`W=q¼xD)KF{]:"6.#n]\cbv"?[ `Pc Fu@:,Vz?ѕ|3&h^~y,l[uL)* FA,e6/jKjPL~\$IDB2 J'Ry~BRR(ķqĩ܌JN $o07yl2';@  97^xZ^4/{A[ >>ZO >Og ?m7:22'%x*7U؃X;NO8O1b_CSKC@ˉr`*#CduqO*rG >@*R]r  *K)SdVK[B Jc @RB48= ~\0?瑆OxoGt`H|6`k..'E</ KU9}IS֨K  ,E]^Ntrqjo\\B% ˄L?D굤-[U f{JMJ0:jfMY@]Sks4Ml 7FA_&/@PD v/R WJ EbK! `0DJEqEJ]}A K ڍۗ 6o ~6(CNlWLyE漅?# Ac4k8 gv MGtI.t^ 򜭿נSb38V!_ @`_1^,a77@HL 9ps&yJV]D)f)6E@AŅHQc[7kIr.]K@>,|[ޮ7d"q,pu'*HTmPHOgx h΀?3ژ'~CLLϚ4*9}+'<ϯ@ي ԯ8iuJ}O@+rRKmggXrVm&)%8L f"?:^BĐ<PgTO]MrQŔܡOO}{=Ib }gŇ>cQ#?skħRho¿{[~DO?]qJ>֤k! Jc=¬D)U$ÀMypK !7M**$%kJ빸G/ːy|BA 2[RuR%p6AIWTW8#NrKLD8̶ek>ވ?X6=شm%s(Gd6 / ';BCw'O(!g#+?5#o,^Ut~N:.n]yj$V5aF ++Cc1VFvzsտR \BwkQd\p{+@+=-T֕"Szށ@%Wcu@Τ!)O:@vgAsvbOy`T~m V.bb'o!{w㓧@܃GA߁Ź96sjDz FSK{NקՑ Ҧ |AGrUxF0"tBCdK4@6`G}B|$ B)1<7bK @"z Qv0H(olvz{&G7omCB"W}4<^.~V9/A} [W`XڗxҠ'x-J@|h#S$-pJ4&t $F+ ߓ A:'H/Ѧgc֪Q)KՄ WRo ,tzV'KHhkgdPJ|j;x_:u e9u7Йf-U7qil"0'؁K w|)K쯼: 7F0]hO\ߕitmѯ`4{G U@|X˰ߊ-Bx-HE#FZ42!02(&ws!T~ @GH.*NeO%'SK*!.$])kfB,=GYw!R<("\*wN]dd_88x[k %@P[C O q_NrF)^\ߥвm=ie_z׹ X|,l/F:=qkIv"r9+1Yq};9@umH&C2SAȱȚGA/gQʩ0T%Hhn`^FD{U^yO8hFU<\YZ0ozH'ZP1Ps;o+``Y:ހM? CNHO%:{3 ^Z nj$4vl2"\j[1px#|{rZQ^(#^aA@"I^Ip@ڈN"/Fru&D.ul\ϧp&dR!xX!P郟A50&g8\XpH:,xw#Ba~? :lgTD:)`{ MX1GKZ6]SBt^=%T=ð1,YzЊy8}͟%kĭ˴#oJN#q2-^FXRU/;to+Kxk $d;=ve/V4Հ֔H׫|Bhuo~BZysŪnIaP?_ѮR୩NˌR{Y@_ 󶬧9:H@"E !{N/7:^4RB+l1]!H>NX=:w`yWmnhr#l>vbdrpK=}a"EqrdwFm'#2^yI'>m;@'IM>Tx˾RW)=CR4(y)(}Kym64psy&pef i~GCnIh`?w l߂L3x{yKh>g(Nh=o$,_<ޢo4_j;]B+vzv_BDz]/Hv.6S?.9;]DJU<8Hv3~7<%+i[=b3mմRu,VMm[7[@OV/\v 'ްzvm, pVZ=ků@,:v@L$ǷOzڀŀv6ϛDjGA"v4ME)7AY?آ+},>*瞵:QB>? n;~nRnvmmB֫qmW*٘ P܎ϕ+`E.p=Y3~7_WGZzO8~sߛn+-zEݤPxzZT`'8! pو|E>2~Zoi9[t~<뮗_; t pGۖgy<٢Oi4namă@ɿOq}KFL ( N> pq޾Nn[9G~g ԰Âl W0 @\Gj*}HyۡhPc"ιd^b2k OMe[Hj. gX4_*ݼR.J_;t2 *}kD|~4!:*˜8'y~^ yQq֣ WH^D!VGslHmtpid?Wu|vG"#Fs]u%i\o`>m>F4OKjorm%7qIl2__Dփ'6)/O;1d:?7c I|Ro"*?B Se:򾷛Q<-8:@戮g;TAWaB/ff QyCpvue&'#H5O?ϸ&@;sihwzb7< Yہ3XǬX{Ui_H><Voy3A4 M4<+,get|]6|5o8?m; Ss#<C2b<YiI8MK  9FuxdL& A^_$#]+u=w5-=!@uLeKKqHn0{-^cidN/ןӻ{"m+MYTQR j'/< 3Ÿ_+߸DùfEݿ)}`>Q h(6lO_l`O^j$'q s޶qJ6v7EJrIlۢ.P/$w=6E6 KxpQ b׮d "UFHs+婀I"i=m~l`s@$+=nW+./I^GrgZ?=r>rLy/UziD'Q]1@P!+?~ZC_o c#sv_4lo͛&@W) =K/pp)+YA 1 !R-"}/87w/I|g H/ ύwy)@rby>P`̐ڸx6P;@k*t@[<="&Vǁ? O$>J ǹWѥ0mZp28? ba:9s/V?_7Z؃ʓNԽmv0jz m7-;֩P|$[r+,4tZX*2%V{~G[ӣؠלVt}@7sD~uS'Gk[r8icOR~;Ύ=[5p+iM5_Y7^n{ضeT>"}KT-K&9V Zc[wuQ8]|l.koKD\=b)r=B`]Fa  XfGH8``Ml<s(lH)). \G<-4Od|V%}=':-)sT洜 CqsnB1+S %|I'uMy &g9@4߶;/9 bNWe9_7dxv/|v9߅ I2b?]YO}%.^cYtn{txB(ՇWimw-0>+Z0$N=#ml~s:?8h[{/NAn}Qu[F<I#d2=e6Lቕp-&PQ`|A@^S0w^~,>^ԭթ:S ;_ʧԷ}EI:giO ׯO~%Ej@܃[G[Mo̅<ށ"ouZ7JWhhIni@Lj)R ub4!R?=2(/ ЀS+Byo `tΎ<$~)3:u|#SNS> LZe8 *d:-`%PWԬc*Ҿ:5b-9M8~/v?}[ r:L&<~C}y5ͫ[s>={kpuZRoA0[3Z+ Wv4^[vt|L7?[p&8}acO֋qnم$U&?G9$>3ÊC`>}_%5qK/K}2@H$KZg 0nҁIC2>)],gWIWtpǶ6l@WZ˯ :z&KArI+%(swJ λr3GY8Y)?;vqLۯp5^̑]m,ƒdYiOޱ㵍.hExVt-؁X$d$jb11E >}|ZW"lK?H~Juq3Z@* d %NX ;^ﵖ䋗:otɟA8pow{}_;ꂲƳJ # c,!ćO굔ӧu^+ˠ`w~錶v+/fnk=- Wi0ND@y|NWWqVQt+z]T (I`lЌ4٥4ͦkJo;K>wK$f/}T$=>:y:=s(׻@_?*,D (SS0_nx+72m[Fw^I&@3m&;sI}+`k0HX _ۆz{M$y\b C'"IiS{|:n}-3Y=]aLaa4wq>yv͟Ź-~oF_v6Gt, MS>9Ӱ[ewѨmyğ(Q:'=_! ~LXIW;]߻\* 煗#Z&;Tfe>qH:?.OWNh{yY~4>9ݭ$n 4z9 ȕٹZyMJ @i4 cB d| ̀ |0ࣽjy`b£ p 0T52i_U_ugu[ww&+DG) m8jr? eV?[)Ϧ$H$f(D`<#ߺ}gbp+r?ɏ`0 #R[9z_66f6gZC>e( DpN# xd夤lx~65&Q~6&9Pnyӳϕ}2NhaJK5%.;x{ӶzB'ٿtJ۫,=5' l.r1  nl|f f\i'l:Xr;喟\!&E#PMi)fIWI'*Oۏtpӻ,׏XFַ+$ T)@ ]e'SuV,<+`C0.h?m@_r~K X+ &L w16<`zCuKc[vNKl5~ژ)>x! $KG"l4ToȜ&?&Q^=6YqNbY ӳɕB /@gǛ~68Ż\OBb7x\Të^7pt`8&.2 Pُ`"jvfd v4ЛokA쟐#?X$͒3JbŞ%i7OiΨ x׫(H8\g00ѣ-I@^/ls>?9/tC m*ꠁ2^GvPS~E2(@ZyM/6"?G w^]$yw~v^0KY_>vtjh4/ӕ6E[(r;ٳS: t *'dV~ R >6!W6g S}<}նKvIvn:(eKW3~9!,:$ 1=Y> 8hwNia O=p.NڰAC|Kl4ŶdQI$K 6*9ϯ,)vG1}?:${VHKbKdOHKZ'Jิ*e6r_ԙz\xa2C"H|f:_)>E-z!1p FoLcZ f I䁺 L\xL)0C-}?օbםvqݛ0܋czBig@kOoa<1\NlQxq5eXxD<8H4'6E `;=^?hIj;?RlrIC IFK1 YL8h`HrWnTx3翏 ?UO/ JxCNJB\x29엝74uiy|}&!Hg@XI v @|N 0֤VFE:n 22u47^h)]ZށQrLa'mZ"}Bث[G9էR^T ?{Al2G[>Sr'>6L=Ъgv URY1`?gaZ <:2Tv|@L#,jk2@z? ᅼ|=;-$WOX 3Of<IP'(M]:2_ -Rks_=!](%/~S<-Ϋg}rNK ~Es茮i,O0/M{ iJ*f6s#|e(B qVj_Ok˟p[,՘f;/m;7|غ="+A=Q:Iu^nW!lP޸'}!q4 Ynqh噧ŝ2JFGz*ѧQ?{zSgQvU< UWTOQĮ@;K<}g"D*$_A&yյ@Y#, Cܪ{ph|A_QJnt=fSGEo!|/eiynjRxZix$|_Q3t>u4|ͰՆ.r"VbVwi}yjLP<}'*+ko;`XnEkM}?` NQBɻ'_ @RU}s `.yZ+@ȁlaYI7}t@*tY"7'8,|ϏW? 笛D}t$$@ń%V$pR<#&٧MyiN_RÀsF?8s*o?5(H$')Q}XԿՁ`:Z`{pB\ ǟLH7|K*0[]>8(o/Ή<.V.Y/6 (u!AG֒ qQW hD2Pz?Pl~e?O8hR¿9L3jd0dNhv!elRma{d- EI=<uy~Y#*c1`g^i_$H %48?>.c[u&@ZWtO3ST&Ã>j>V//BDՂ-LIapj:FOXϊ!\!#M5GuFN/笡XYa>6w?4ŋAϏo}} :ߓԃ@k"̳>^:y[?ILJɪXh VTqtAnI+ ر[r`rxOߛL R#~E ޔ׽a$><70{k0HK`">:B}`2FO]񼿟 r⚼^@e,_㌶%FyA<k No!bn c:_$ FSz2$,N=,EK8З~8P~x1EKihT i7&ş5_$qk߀-_qU˰r   %>ߗ#?]@_ o1+@`¬>1%lq:XoZ_s[?Y܉],i%~VsAϟf>Ig^/e!oluLɴo9{O*?Im??̀:Տ]~+]..?yH:d/WH?r 6+Pd_\Ab>;́,/^9Zc8AŸl$]k2\yO;]wi7BKxQiG~ ʨvJ~=5 RBNAs۷l?5ݖl?{633S_ $uIճ7`$IB e΀O8g_,z]`$} O2&!&%,m\oA(i3YÇ ù_^ፍ&?ۃ74Z-φ'n>%::͠?ˏ**n8:}&@K$8D@^NVH sX%/<}ӷv} t UV(@ݶF= '|<g"~+V#I4)YhCele7 t vT߸ /B)u{>D0D}ǭ{#V8P\_Ie_%GJKdҾg!TKQ?;ߛ6 ?A:(,v5!μ"5t$גEQeB"fkpK0zʦHG폿-#J| L֧Wq6;4?i޷G闤:`@MI~[ϕ<8ԝD :%e 2VQY+3oBKϪoc@dB C1|^p@ $B˯$Cc k/r)&'m $[U\ןGXyf/bDO,ONA@p3k' yA{(&[53:GCKiu _ `K 6%ߏw|bQtPly"~ K >C+*b0i8$"]+,ێI ǿ||jM!SK*<qKzv"`|$Gm3v(% u͞MI9b>I Q稔tJ4cOm}O$(HfWI@íVIҀ =` sKZFEޱ/{t%.}YH+Q7H?4גBxo#;oO#W9cyI;zvi[gpSxFFgݖS>*HM+ۤ̈́٧7 y6%/Mxd\3 _kWؓdc޾K,}~L%:~a&$ tK,6?*@u`,?:I@ $@u:@ϵD`=:z\Ġs'uʙ|WNM3(*n@!O$ 9AKt'#үv.`ȳI`oxjG-~vX'v>h V-eU?u[/|1[?!.=w(&j+'FPDŽTU ?Sdí Ӌ$/88yhi<@!- @L׃ i*ˆYZYynY=uG` 7t[t 7 |@dLm88to,>;%)X-%@vd`7kH2(9 D8P2}G̃2> :b]-FgFj0^˹fCnczVыA?NKL^'`*{ Gc :gp)`d Uܒ#9Oy^wq'Ci1]L*>{=xU'n''h@*{/ : _z˟y]/I@|1k=OSTWD>m{VE88MzKiO',a;v>Πl4nS)Р;/ )&G@v)VFT >@HeIB߯HCXO:.0 8z-(6B@Tb$h~x z(h r+ tۺ+_@_o-I]|H \wrI9MIJw   r*N?V֎3 yc{3A9Tل! {m>D f,WB~T ckLy{{~~ @S>D nY}-i}D;Uo|%ުS*$A%n1[ `l׫ctr|=!iGGEąPK OFr#ɂ@ 3^Pv?Zz 6~0>SqP0dPc^ɤ 8AiA.;#љ>J ,aH.' cBKZEb Mi6wGl zۙ*=_ZC9.]O݁%rǑ&eB">Z 3X4ZU1y)v`w8Q({٫_eTF\I#1BOgP'puT@:~ث( OuA2nl̂6Fk&ǡdA.'OL&u |K&guV0^vL4a9 miG'G!M( رgR!qk-W̷>}K_;q,q= 0uE@g i% qS~>%D@2-$"_ fOq[㯉v!**D޽@.x;@3_L,Ў>Qbް:@'d%`SJ: W߭|6~Ӑˢ%w,*3+NX=j+5`L\uX{In/eMqX#jp&t: XDD7pΰBx{ij9w<+ Bi?k}>$ }GŠB*/>L U>|$p* ބp. A t)rg1^DO~<Ω  n0P1F@Bm]L=؎&|.+?O:+8~ar`:8bp g=`ţKÀ88dj ĉFNw6s䑂ڪʼn(b>}#$ %3` G;t3Mn_4}~r+rA6&|a`jt @evU„`S#(P*JdL\ef>ByTQdtF51Lp<k(ykH7JCsV` _bZx(|&~/GT OM3jH?A@_p]&;z+="5"GB ֛rT '|AO B2p*3F7`3eRW-[s0z42 ;A2HW|"]&7rP:|_6*t^@)K $#h?e)?OTob_=5lu |b\}/ >&K"Ik7Te' ;$ s88nw'tH!K!vדp>/I?#e޿LǸb;\KW08@vz9w e,@60' 9U>d R` >?-Y~%H6t0M\Y#*|^⯈^T__E lo !:@EsJˏNBFБ ƒb v Ǹ+Gu{_SHm~9(onlCR ;8.`%;q4`R@"DHIi8 #е cH$>']@'1yr :E @\\ FR;fQ9k}?C[bՁ> 8<%tSKwksgYcX[A-6uWz\XdGpWt5oԎv30^1L1stG ;eШ55C*j!a@h*p/ brw}Y#0蹵-c A}r?m0H:+=QxO LQjtq|#xQskw=AQ;*uNf,otG.(_ ZL&Zi`uv/u~4˂6"}R>*48_=` aqU-'7@7gPA 14PKd}$SLy̪"t s!T/@|}T_#.1;e>ۋ_ +pЗDJko?h!@W[@QA_.ǭB˭`572|>1]1RV[;W-)р&hX~g_Ǿ7o%[~FnTU€O?ڗ<П$p*":}x{cJ؏eB"*乀lJfWgMgbח ж>6@Lhkksi"Gs῅@sA+D!\^Ygі{1:6XwN]Ӛ# `hHz?BVt>yɒ${Z ՗쳪 j rK0 4DjJ2*e5Ht*Ãd0gggNJJ砸 `-}1};v lT 4d}L@w"^H A'$nؚo(V(-Mnj@f]&)xߘ>!ti_[f[|K/YWnh[@ }d`Ŗa9+N_ȧxLǠ$ * 2.>p? PR_&! &_;/Yv9*}j&#7hn״3ߪ t~N+^d,vC *SGB Z~ ʵ`lwMUC2 ;+ҠHI@OQS iC/@M? 'uӔsW;֝_O!YZX> @ =[[6tX &jR QLZz}qHV"{&@|e~sJc ~_Sldr%QV:v?Sx^Ϭ(-$kAf3m`&`F8Wك9oS=i` T3b Hl,}dTF-& 23P#g2%؜@;exmh`1PZkk _# t')i$0F}CD /s=GԫlƠj1B*d0 H{X6Y' !i!&|3b@\I0F²y>N{ٜ/d溜KhÅ䷻р]X? /&St8hŋ`dA ր_x}F ,{.?uDQ#^P}_7t -#hYz- h́pz sRnaBϪ <_moP[϶\-C@ }Ä%3<ġ=P֙J<F}w  Pb^ lҚߝ Q,(pYZ삭Mnkߤxu,%4yI*k1^Npo|io!L!Ѓ0R-/1 sevr݊ )A҄RՁ>zUG~5UW,exjhqz0&}'`-385]M M%r-P_pJ&mH`VPK<}Ftvѵ 03~)ἦ@[[E`aSH+]&#}6jл!t 5 @1R"P(Z} \!`@݆Ք`yGxݭ kc<(PG,܀݀aPT ۑ^#&>RT?c7Q;@RM!QDe0ߴYu-[:8= ",~W[Xg* RӇkp ш}n%2Wc}:3;9=(u(4c0Cm&JJ0E(J;=X :g( @eL)~1^D Roi`@\>1~c0: 5~c ג ;I$~~h]9m/_Qˠ w {0|gR6N <>i]wak="\"Lw XX5ZE0\ $h.` lD>U@muXP;F ,1F{V g8] o:( wQ7;!0hMo5 0='5X5`rP ʮ(ώ~Hͦ@ 9 f)?JJa¿@ q(䠻}KYvibV HPZ $i>Kͺ z8_`s[>PqHG|?Kk4M| i#5,1T]]&9l8 h!@O*b @T>g!Syp)6š PWF tr/f v&{*Ã\11 C0xST,/zF.'(^O1 alųzDB -K@/y,?GoKk@ Hrs7r"_"92$*ݿ5YwfްS:mN@_T#pxR{t%re '7G~X = ㋔ߚ*:&(БOg6ԑҺ}d'GFqqzXW:QCnU!g"z@ zIƁDKo @sY\UȈ@Gs٠chkjAg_?Z]@7T3,uxKN^fXy@wF8۝P5 G,_CI~ 0h榈Ï86w'yΐ\C.xSr;/^+v0axӇ_Iq2P y{{^"|S%Ǹ++aQ|X'a 4 Y 1Ӣ"Z^t OC 0 _D"'@$uKhv1&̣E7Exyy@DM!ZbYggFB° y6HEtR~-lL{m?Ϭh 0`_hAn 0~Yx$/a ^V/!0ম>@> W3"&@j0!h3x(/8˯_X 7Zz,ut@G }  3k]=d 7\xJHyH4g]> '0S?"%ϣ2;_BE!\(uZ2kˬ~ThQ ,6}] Sфrܿӏ E { .y6Ȥ/*.:6!] 0mLa8korY%`[}00=EWB\F&E d c%ߪշ(f[}`C=Tw rOE$m!7n/瞌x]ɕ(ً=ZK:|N cE $<2ȃ 8m>wt?mlaJ$>i,d`=l_iϿ >G)`ف"1 ,k @JfrY'4`^1ĎD>/ێ@6(=cfC"L^RӘ2b$7"Grf+w!y[HL]SB%ޏr ] Ln!q):#b|k|_G%XӠ$zơʗ@D|R9 H? 6Oe @n"9/C~eN3Թ@>KJ0"P#pA%/MAO& U֝%G53xM`0b[ҳJrU=eaȯ/GZʱIQ P|j_-QX;k!B`>`L<>i\#"}Έ~s|lmp Tai`:X &C]AmR; 'US}嵝l)p7 !癀Ҳp/ GLSu&Q gd6>au!8Z< I]jY ,wRk@#ZYIj"N o}^,U!G@}f Z~B`Ժ3yPiԕśO%/x0.5 ퟯ Q[M'ԟ_`mY6: d9[ m QPl:"]vKAU)Y}5Ӡv<*m*{1 Dr ('\yqoDܫY-غ}e=$UC8̇|84x |*~'MzCrIӞ=2)>ga /b* @ KRwjsf|]7'Sø,7ߏlgR.D #d 7ˤHZ.}ٙ>=V$,x`SofAij04V: \ |;700tb"uYd%Z],@3h{5/@\ߞ1(q((\@W)>>B nI`>V[R}$ A\#CܻD߅ o dJPWT< Ӏw0} `Ik?9c_9zGo1u|nd _{}>i98I9cw-">۟@ Q1Tۨ~|t$,epz ]:.+yUAhH)` I `U9>m"TN5+qG1׾z;b @ Bq Y}K?yʩjN_䮿 R/'!:_@̹ukOϖ e͑?`Kv,80 Z XwAm&[5gN?M%Lmoc'qPAzl&ߘm"` z } viQ Py1]m(9}3;s}vٸNs,JuMd ?_ҋh_@MJC}+r,ڢ%oಸ@@ۈFp\#`^ASGIF?N u  ݁\. i$s`!{ pdZ}?F H|?ݹL&:gm>ȆT ^= y@O=dq 9 )<Uq _h(D $c`v^gg]P?LW >I|& 1NZTBǠ޳_ä!>x}Nb!8`5p293=xjtkU P`7_ijZn y&8XZ4Om$<߬f@4j>06 Ș˽Y7$о P#*t>ʂeaD6ʫm>.ltc .g`pPL}J@IE.iH VFݜxQ5 D!xWa3jqo)JXn0zB>@9G FI >7;*H+73pouwL(Jufa; .i4_`8pT7}g{P'!C&@.(| ՍkXԍhp 8sݥ1Tat+R cB aR\K }ND]|)<9&{*N Xf|P#06FpY }#E{@%(8] WG|sN9>.1(w!ഓ~9ddCj ?_isN a~_:PEhqt[j <xFOl3Q="0(l DD2 PBiO189[@N@O~qz, M–c[ CΛ߭QlR#B e|T ~ꨘh8R*\XZn;ӏsn,2% q2*(a{W裯e"D$oDAm> ؐ.ߜ"|)`[TZ};!Ҏ?m_`=f &DnOgz =l@ *&6^%EoAЄ}0`)'2 xg;N@>x\ P8Q38A(ޮǮ*3xƵ` WJ58|)6'ucO$ ['$ѧ>9(&@MHz %9-u>&ej@50ҟUnr.2spN= VZIC+ |ܦaFv D kuSIocl\7 TQQ_Hڙo[bx=C' l e`|}GڅJ3|>QY9/'hʫ0,V1T>[Hek}5hẝ/ASY}pw>`A k/:<oxA9G]7PlUB@{.q#)a@bzQ(9I̊9 o=éw}dX󘝃 4sVp2cXqv je!Ge_ԄX],~4wW0Fc)((Ɵ0sTr 9NI9* "vj3quK0{;X=p >!j6>! Įu.LāH\lIC LU:&B_9svn" w}#{W"\mQ Ί/۶Ynk rS>mu"Pۊ|;u}|4wuWd<(ޫD_@h$ 1dP7/H·1 "•b@+8x_-<_7-*Q޷4rlqen2.F ٟ~Ao'*ATsc/)NZ|u uh'r!0NEy{ sШ``[/#5Iӈ02lloަo'ׁݪ5p  2ּ9o/%E*O\篁>F98moJ8Nspb-nvPˈ2ʳD\ #|aGcvM=:ܝKw _w 6;G"uqI`7=# |Dʁ KD rt GaW-=!Tdr] 8οAkX6-RޤpO|c7O}B?kǣ\ pDJXo!$}#$0Bё2]K?|.Oއ>Fq2 `X0=/z Ӆ% *@| Rй41$!}Ld+.+)pLv",>! pl=_zI9mj Jժ%jpTDI/.>u j[o~HB| ey11nJ8@Y\A*"P; 58J\ ;j8r|x'|x^jF Md(NinWt @\ut['_H`1*܁!=R?A+S@K4]nh0s8 LޫMCs1hٮ 蠄W*I:|]M*.> Ĥ >PgkbUd@Ԛ}r  `mU;T"!rNhB=9/@}O]=~ޞMߊ;~ {f@"&$%p""> `ڎU ^ b2n)&T&:>p@Rc=ߥko"z7HJ|V+z ICJA HWVvS͸a HO+kۦ !H u/Q<8J~ՠp_M*ЇF<9ř$o;q-G]+x#~W;*.6lw@.Fl8pƬzaAV` ^g K/[OzO{DgƴW#+o{a?07!!6N0?Z V`uAd1Rl0I/_K@l 2jGjKqN7Rt+ %VK0$wέYJ87j'ڕ}PC R::*.k3JyR|u0?TC~$t,4'`=xj$^5 :knT$ p yR4 х-:F?>LJ~OEWj 2LJ[S۟@HIg'y'(#t&}܉cΧ+RG:b9.pK]i? > >y7z@[=@T"WK4zSAI=ąaVq% @*&c|;l+u&kSGJI+c&@<7;Vc$=EIH# Iߊ{R@P[cqXByIxy[L-= K*eF/ܱhݏpNCqJ&xl>:fVQfA|,(`AOg_K\7hPNhRo^GV!<渀m?_֋@yVm9f9O|r7 ~~ Wq_͟y%]KԜeK.em{+?ދX8{< C $ {7om1@F](~)HsT֟l7#X> >o^t3/g $x?*@&|6=zbWmO}`ÆTLP@@,$G,Y9ytw -_39/=E`L{go$ My$)=+vM8{A.}X}dpIENDB`( 363333H3333358:=@CFILORUX\cbehknrtx{~dbk^\ZYVTRPOMKIGECA?>=K976433333333v3g3f3f3f3f3f3uGf3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3uGf3f3f3f3f3ӝf3X343333333H33468:>ADGJMPSVY]`cjimosuy|~el`^\ZXVTRPNLJHFECA?=L:8653333333333m3f3g3f3f3vHf3f3f3g4f3f3f4f3f3f3f3f3f4g3f4f3f3f3f3uGf3f3f3f3g3f4f3g33:343344445I5569;>ADGJMPSVY]`cfmmosuy|ma_][YVUSQOMKIGECB@>L:87543433333344u3g4f4f3uHg4g3g3g3f3g3g3f3f4f3f4f3g3g4g3f3g3g4g3uHf3f3f4g3g3f3f3g3g4:4:4445555555I579L;976434444444444{4h4g4vHg4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4vHg4g4g4g4g4g4g4g4g4g4:555555555566J7:<@CEILORUX\_bdhknutvz}ca_][YWUSQNLJHGECA?M<:865444444444444~4j4vIg4g4g4g4g4g4g4g4h4g4g4g4g4g4g4g4g4g4g4vHg4g4g4g4g4g4g4g4g4g4h45655565666767L:=@CFJMORVY\_cfimoryx{~db`^\ZXVTRPMKIGFDB@M<;97544444444444454xHg4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g5g4g4g4vHg5g4g4g4g4g5g4g4g4g4g4h55V666667677778N>BDGKNPTWZ^acgjmpsv}|tcb_][YWUSQOMKIFDB@N=;98654454545454444Ij4h4g4g4g5g5h4g5h5g4h4g5h4h4h4h5g4g4h4vIg4g4g5g5h4g5g4h5g4g4g5h5V7Л7777778888:<:8655555555555555I5i5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5wIh5h5h5h5h5h5h5h5h5h5h5h577778888999:;=@SGIMPSWZ]`cgjmqtvz|fdb`^\ZWURPNMKHGEBN><;9865555555555556I5|5h6h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h6wIh5h5h5h5h5h5h5h5h5h5h5h5h57788899::;;<>AEVKNRUX[_beilorux{~tfca_][YVTROMKJHEDP?=<:865555556555555I56w5h5h5h5h5h5h5h5i5h6h5h5h5h5h5h6h5wIh5h5h5h5h5i5h5h5i5h5h6h5i5989::;;;<=?CFIYOSVZ]`cgjnqtwz}geca^\ZXVTQOLJHFDPA?<:976565655566666I665p6i6i6i6i6i6i6i6h5i5i6i6i6i5i6i6xJi6i5i6i6i5i6i6h6i6i6i6i6i69:;;<<<=>@CGJN\UW[_beilosvy|igeb`^[XVURPNKIGEQB?>;976666666666666J6666j6i6i6i6i6i6i6i6i6i6i6i6i6i6i6xJi6i6i6i6i6i6i6i6i6i6i6i6i6NOOOPQQRTUWY[^dacegknrux{urpnkigdb`][YWUTRXQPONLKJJJKJJJJJJJJJTJJJJJxJxJxJxJxJxJxJyJxJxJxJxJxJxJTxJxJxJxJyJxJxJxJxJxJxJxKyJ<<=>>?@BFIMPTXc^beimpsvz}okhfca_\ZXURPNLJGRCA?=<:7666777676777K67677o6i6j7i6i7i7j6j7i7i7j7i6j7i6yJj6i7i7i7j6i6i7j6j6i6i7i7j7=>?@@ADGJNRVY\gdgknruy||mjhfc`^[YWUROMKISDB@><;9777777777777K777777j7j7j7j7j7j7j7j7j7j7j7j7j7yKj7j7j7j7j7j7j7j7j7j7j7j7j7@@ABBDHLPSV[^bkilptw{~ߊomjgeb`^[XUSQOLJTECA?=<:877777777777K777777r7k7j7j7j7j7j7j7j7j7j7j7j7zKj8j7j7j7j7j7j7j7j7j7j7j7j7ABCDEIMQTX\_cgporvz}romjgda_\ZWUSPNLUGDB@?<:987878887887L7787778k7k8j8k7j7j8j7j7j8j8k7j7yKj8k7j7j7j7j8k8j8k8j7j8k8j7BCDGJMRUY]aeimttx{trolifda_\YWTQOMVHFCA@>;999888888888L8888888q8k8k8k8k8k8k8k8k8k8k8k8zLk8k8k8k8k8k8k8k8k8k8k8k8k8DEGKOSWZ_bfjnrzz~wtqolifc`^[XVSQNXJGEC@?=:99988888888L9888888|9k8k9k8k8k8k8k9k8k9k8k8zLk8k8k8k8k8k8l8k8k8k8k8k8k8GIKPTX\`dhlptxywtqnkhec`][XURPXJIFDB?=<:::99898989M98989989l9k9k8k9l9k9l8l9k9l8l8zLk9l8l9l9l9k8k8l9l9l8l9l9l8JMQUY]aeimrvz~}zwtqnkheb`\ZWTQZMJGECA><;:::9999999M99999999u9l9l9l9l9l9l9l9l9l9l9zMl9l9l9l9l9l9l9l9l9l9l9l9l9NQVY^cfjosw{Ҁ}zwspmjgdb^\YVS[NKIFDB@=<;::::9:999M999999:99l9l9l9l9l9m:l:l9l9m9{Ml9l9l9l:l9l:l9l9m9l9l:l9l9RV[_chlpty}҃̀}zvspmjfd`][WU\OMJHECA><<;;;;:::::M:::::::::m:m:m:m:m:m:m:m:m:m9{Mm:m:m9m:m:m:m:m:m:m:m:m:m:W[`dhmrvzޙ҆̃Ȁ}zvsolifc`]ZW^QNLIFDB?=<<;;;;::::N::::;::::r:m:m:m:m:m;m:m:m:m:{Mm:m:m:m:m:m:m:m:m:m:m:m:m:\aejnsw|ؑъ̇ǃ€|yvrolieb_\X_SPMKHECA?==<<;;;;;;N:;;;;::::x:m;n;m:m:m;m:n:m:m:|Nn:n:m;n;n:n:n:n;n;n:m:n;m;bfjoty}֑э̊LJƒ|yurnkgda^[bUROLIGDB?>==<<<<;;;N;;;;;;;;;;n;n;n;n;n;n;n;n;n;|Nn;n;n;n;n;n;n;n;n;n;n;n;n;gkpuy~֕ёˎNJ‡|xuqnjgda\cWSQMKHFCA?>==<<<<;;N;;;;;;;;;;n;n;n;n;n;n;o;n;n;}On;n;n>====<>>======P<=<<<<<<<=r=o>=P==========t=p=p=p=p=p=p=p=p=~Qp=p=p=p=p=p=p>p=p=p=p=p=p=֭ҪͥɢĞ}xuqmima]ZWSQMJHDCB@@??>>>Q==>>===>>=u=p=p=p=q=p=p=p=p>~Qp=p=p=q=p>q=q>q=q>p=q=p=p=޽طӳϰˬǨä|wttljgeb`]\YXVVTTSSRRR[QQQQQQQQQQQQQQQQQQQɆ[QQQQQQQ~QQQQQQٺԷг˯ǫ¦{vrnsfc^[WTQMJHECBAA@@??R>>>>>>>>>>u>q>q>q>q?q>q>q>q>Qq>q>q>q>q>q>q>q>q>q>q>q>q>ؿӻϷʳƯ«~yuquhda]YVSOLIFDDBBA@@@S???>?>????t?r?r?r?r>q>r?r?r?ƀRr>r?r?r?r?r>r?r?r?r?q?r?r?μʸų|xswkgc_\XTQNKGEDCBBAA@S??????????r?r?r?r?r?r?r?r?r?ƀRr?r?r?r?r?r?r?r?r?r?r?r?r?ɼĸ{wznifa^ZVSPMHFEDCCBAAS@??@??@@@?r@s?s@s@r@s@r@s@r@ƀSr@r?r@r@s?s?s?r?s@s?r?r?s?ļ~y}plhd`\XURNKGFEDCBAATA@@@@@@@@@s@s@s@s@s@s@s@s@s@ǁSs@s@s@s@s@s@s@s@s@s@s@s@s@|sojfb^ZVSPMIGEEDCBATAA@AA@A@@@s@sAsAtAs@s@t@s@sAƁTsAs@sAs@t@s@s@s@t@s@s@s@sAvqmhd`\YUQNJHGEEDDBUBAAAAAAAAAtAtAtAtAtAtAtAtAtAǂTtAtAtAtAtAtAtAtAtAtAtAtAtAxtokgb_ZVSOMHHGFEDCVBBAAAAAAAzAuBuAtBtAtAtBtAtBtAƂUtBtAtAtAtAtBtAtBtAtAtAuAtA{vrmhd`\XUQMKIHFEEDVCCBBBBBBBuBuBuBuBuBuBuBuBuBuBƃUuBuBuBuBuBuBuBuBuBuBuBuBuB~ytpkfb^ZVSOLIIGFFEVCCCBCCBBBvBuBuBvBuBuBuBuBuBuBƃUuBuBuBuBuBuBuBuBuBuBuBuBuB|wrmie`\XTQMKJHGFEWDDCCCCCBCvCvBvCvCvCvCvCvCvCvCƃVvCvCvCvCvCvCvCvCvCvCvCvCvC~ytpkfb^ZVRNLJIHGFWDDDCCDCCxDvCvCvCvCvCvCvCwDvCvCƄVvCvCwCvCvCvCvCvCvDvCvCvCvC|vrmhd`\XTPMKJIHGXEEDDDDDDwCwDvDwDwCwCwDwDwCwDwDńVwDvCwDwDvDwCvDwDwDwDwDwDwD~ytpkfa]YURNMKIIHYFEEDEDD~DwDwDwEwEwDwDwDwDwDwDxDńWwDwDwDwDwDwDxDwDwDwEwDwDwD{vqlhd_[WSOMLJIHYFEFEEEExDxExExExDxEwExExExExExEŅWwExExDxEwDxExExExExExExDwD}xsoiea]XTQNLKJIZGFFEEEEyExExExExExExEyExExExExEņWxExExExEyExExExEyExExExExEzupkgb^ZVRONLKJ[GGFFFEyFxFyFxFyFyEyEyFyEyFyFxFxFĆXyFyFyFyFyFyFxFxFyEyFyFyFyF|wrmhd`[WSQOMLK[HGGGFFyFyFyFyFyFyFyFyFyFyFyFyFyFćXyFyFyFyFzFyFyFyFyFyFyFyFyFzuojea]YURPMLK\IGHGFzGyGyGzFzGzGzGzGzGzFzGyFzGyGÇYzGzGzGzFzFzGyGzFzFyFzFzGyF{wtpljfdb`_^f\[[[YZއZۈYهZևYԇY҇YχZ͇ŻZʈZȇZLJZćYƎc‡YZZYZYYZYYZZY}xsnid_\WSQONL]KIHH{H{H{G{GzGzH{H{H{H{H{G{GzH{HzHÇZzH{GzHzG{G{H{G{H{HzHzH{H{Hzupjfa\XTRQOM^KII{I{H{H{H{H|H{H{H{H{H{H{H{H{H{H{Hˆ[{H{H{I{H{H{H{H{H{H{H{H{H{H߽ܿ{uqlgc^YUSQON^KJ}J{J|H|H|I{I|I|I{I|I|I{I{H|I|I|H|IÉZ|I|I|I{H|H|H|I{I|I|I|I|I|Iֿؼۻݸ}xsnid`[WSRON_LK|J|J|I|J|I|I|I|I|I|I|I|I|I|I|I|I|I‰[|I|I|I|I|I|J|I|I|I|I|I|I|IͿнԺ׸ٶ۵޳ysnjea\XTSQO`M|L|K|J}I|I}J|J|J}J}J}I|I}J|I}J}I}I|J‰\}J}I}I|J}J|J|I|I}J|J}J}I}JǿȽʼͻϹտӶյײڱܯޮ{upkfa]YUSRO`}N}M}K}K}J}J}J}J}J}J}J}J}J}J}J}K}J}J}JŠ\}J}J}J}J}J}J}J}J}J}J}J}J}J¼Ļźȹɸ̶͵ԻҲԱ֯ح۫ܪߪü}wqlhb^[VTRPaN~M~L~K}K}K~K~K}J~K}K~K}K~K~K~J}K~K~J\~K}K~K}J~K~J~J}K}J~K~K}J}J¸ķĶƵȴʳ̱ӸЮҭԫ֪بۦܦާ~xsmid`[WUSQaۀNNLL~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óIJűȰɯ˭ѵϫѪӨէץؤۢݣޣ̵zuojfa\XVSރRߏbځO؁NՀLӀMрLL~KLL~K~LLK~KL~K~L~LK^~L~LL~KL~KKK~LL~LKL¯îŭƬȫʪѱͧϦѥӤբסٟڟܠޡڽæ{vqkfa\XV߇T݆Rޑb؃OւOԁMҁMЁM΀L̀LʀLLLLLLLLLLLL^LLMLLLLLLLLLL«ĪũǨȧϯ̤ͣϢҡӟ՞ם؜ۛܝݟӰ}wqme^[YVފU܉Sݓc׆PՅOӃMуMςḾḾMɁMǀMŀLĀMÀLMMLLLLM_LLLLLLLLMLLML§æĥƥǤϬʢ̠ΟНѝӜ՚יؘڙܚݜߜ޷̡~yqgb_[YWލU܌Sݕc׈PՇP҅NЅN΄N̂MʂMɂMǁMŁMÀM€MMMMMMMM_MMMMMMMMMMMMM¤ĢŢơͩɟ˞̝ΛКљҘԗ֖ٖؕۗܙޚߵڭrkgc`]ZߔXޒVېTݙd׌QՊP҉OЇOΆN̄NʃNȃNƂMłNÂMNNNMMNNM_NNNNMNMNNMMNM  ğŞ̧Ȝɛ˚͙ΙИіӕԔ֓דٔڔܖޘߚ߯ϛuida^[ߘXޗW۔Uݜd׏RԍQҋOЊOΈṄNʆNȄNƄNăNÃN‚NNNNNNNN`NNNNNNNNNNNNNÜě˥ǚșɘ˗͖ΖДѓҒԒՐבؑړ۔ݖޘǾؽ߬ݨňgb^\ZޛWܙUݠdהRՒQӏPЍPΌO̊OʉOȇOƆOąNÄOOOOOONNN`ONONOOONONOONšęˣƘǗȖʕ˔͔ΓϒёҐӏՏ֏׏ّےܔݖޘǬߦ؛v_]ZߠXܝVޥeؘR֖RԔPђPϐO͍OˋOȊOƈOćOÆO…OOOOOOOO`OOOOOOOOOOOOO˜×ʡŕƕǔɔɓ˒̑ΐϏЏҎӍԍՍ֍؏ڐےܔޙߛ黶麯麨߳ߠЋf\ߥYݣWߪeٝSכRԘQҖPГPΑPˏOɍONjOʼnOĈO‡OOOOOOPOaOOPPPOPOOPOPP•ɟĔœƒǒɒʐː̏͏ώЍэҌӌԋ֋،َِޜ۔ܗޚߞ̼缲缬绤缝תݘz\ߧWgۢS؟R֝QԚQјPϕP͓PʑPɏPǍPŋPÊPˆPPPPPPPaPPPPPPPPPPPPPȞÒĒőƑǐȏʏˎ͍̍ΌϋЋъҊӊՊ֋׌ܙِۓەܙݟҺ佮伧张廙̠ߖ،ihܨUڥTآQ֟RӝQњPϗQ̕QʓPȐPǏPčQËQPPPPPQbQPQPQQQQQQPPQ¤ ŸßÞğĞŞƝƝǝˢȜɛ˛˚͙̚ΙϘИЗїҖԖԕՖ֖זٖؖܝۘܚܜޞޡߴ߻ۻijĭçáˡߐрi߲fݰdۮcګcרb֦cӤcҢbϟbΝb˛bʚcȘbǖbƖbŔcÓc“bŘkcbbbccccbccbbǛÏďŎōƍǍȌɌʋˊ̊͊ΉωЉщ҉ӊؖՋ֌׎ٖؐؓ۳ܴܴ߾ྡཚὓ⿏۠ވoܮVڪSاR֥QӢQџQϜQ͚RʗQȕQƒRŐQÏQRRQRÓcRQQQQQRRRRQRRǙŽÍÍČŌƋNjȋɊʊʊˉ̈ΈΉωЉщוӋԌՍՎ֐גםٱٰڰݿ޾߾ཊѕ߉߇~bۭSتR֧RԤRҡRϟR͛R˙RɖRǔRŒRÐRŽRRRĕcRRRRRRRRRRRRRƙÌČŋŋƋNJȊɊɉʉˈ̈̈ΉΈЉ֕ъҊӋԍԎՐ֒صս׬دزãۿܿ޾޽ȋ߈ޅރށrݴY٬SשRզSӤRСRΞR̛RəRǖRƔRĒRRRƘdRSRRRRRRRRRSRƘŒ‹ËċĊŊƊNJȉȉɉʈʈˈ͉̉ΈԔωЊыҍҎӏԑՕԳֲ֬֯Ƣۿܿݾܖ߇ބނ݀~zgڰUجSթSԦSѣSϡS͝SʛSəSƖSœSÑSǛdSSSSSSSSSSSSSƗ‹ËÊĊŊʼnƉƉLjȈɈɉʈˈˈ̈ҕΉΊϊЌэюҐӒӧҮԭ԰ԳʡڿܾݾӍ߇ބނ|zxr]ٮS׬SԩSҥSУSΠS˝TɚSǗSƖSɞd’STTTSTSSSSSSSƗŠŠÊÉĉʼnʼnƉljLjȈɈɈʈʉє͉͉Ί΋όώЏёѓӿҫҮҲֽϢڿܿ}ʃ߇ބ݁~{ywushܵWخT֫TԨTѥTϢT͟T˝TȚT̢eŕTēT‘TTTTTTTTTTT—Ɩ‰‰ÉĉĉʼnʼnƈLjLjȈȈɇɈϔˉ̉̊̋Ό΍ΎАВМͼѫѯպϷԢ•ٿڿ}{܎ޅ݁}{xusrpm`ٱU׭UժTӨUХU΢U̟TϦeșTƗTŔUÒT‘TTTTTUTTT—ŖŠŠ‰ÉĉĉʼnʼnňƈƈLjLjɈΕʉʊʊˋ͎̌̍ΏΑΓϳ̴ϬӸϴͺ٤Ôٿ|xԅ߅ށ}zwurpnljeZذU׭UԪUҧUФUӪf̟UʛUșUƖUĕU’U‘UUUUUUU–Ŗ‰‰‰ÉÉĈĈňňƈLjƈLj͕ȉɉʊʊʌˍ͖̰̎̏͐͒ҶͱʹɾӍؿ|ڿvщ߉߆ނzwtqomkifd_۶WذU֬VԩV֯gУU͠U˞UɛUǙUŖVĔU’UUUUUV–Ŗ‰‰‰ÉÉÉĉĉʼnʼnƉƉ̕NJNJȊɋɌʌʎˏ̥̐̑̓д̯Ͳ̶ýĒ|Ńwۄ߄{xtqnligeca_ZٳVׯVٴgөVЦVΣV̠VʝVɛVǘVŗVĔVÒV‘VVVÖŕ‰‰‰ÊÉĉĉĉŊʼnʼn˕ƊNJȊNjȋȌʍʏˏˑ˒̔ʻŻˬ˯˳ʷȼƓŒ‡Ɖؿwr~ށ}xtqnkhfdb`^\ZWܹgׯVլVҨVХVΣV̠VʝVȚVƘVŖVĔV’VVÕ੩ŠÉÊÊÊĊĊŊ˕ŊƋƋNjnjnjȍɎɏʐʒ˓ʜŵʭʰɴɸλȔ͇ǎ|׿vrx~yvrnjheb`_]ZYWX۶VرW֮WԫWҨWХW΢W̟WʜWșWƗWŕWÓWĖŖŠŠŠÊÊÊÊÊÊɕŊŊċƋƌǍǍȎȏȐɑʓʔȯưɭɱȵȹջ˕čɓ|׿wٿrszwrnjhdb_][ZWUTRSٴWذW֭WӪWѧWϤW͡W˞WɛWǘWƖWĖƖ‹‹‹‹Ë‹ÊËċɖċċċČƌƌƍǎǏǐȑȒɔɗſǭȮȲǶǺܻ~|yϗʘÈ}xٿsputplhda_\ZXVTRPONTڳXׯXլWөWѦX΢W̟XʜXșXŗƖŒ‹‹‹ËËËɗċċċōŌŌōŎǎǏǐȑȓȔƤȬǰȳǷƻ~|zxvy֞ĎÉ~ytprrmiea^\YVUSPOMKJLܶVٲX֮XԫXҧXϥXΡX˞XŗƗŒŒŒŒË̋ɗÌËċÌčČōŎƏƏƐǑǒȔȕµȭǰǴƸż}zxwursؚŏʄy׿upnojfb_[XVSQPMKJHFENڴXذXլYөYХYΡXƗǘŒŒŒŒŒŒɗÌÌÌÌÍčōĎĎŏƐǑǒǓȕǜǮƱƵŹÿ~{ywusromޜŐĊ…{vrnlgc_[XURPNLJHFECBC߸QرY֭YөYѥYƘƘŒŒŒŒȘÍÌÍÌÍÍĎÎĎďŐőƒƓǔȖ«ìǮƲƵź|zxusrpmkjƑċ†|ֿwrnjd`\XUROMKIGECB@?=EٲU֮YԪYƘƘȘŽÎďĐŐőƒƓƔǖƘƬƯƳŷŻƭyvtrpnljhfǓčÈ}ֿwsoic]YVROMIGFDB@?=<:9HխYƙǙǙƙƙǙƙǙǘǙƙƘǘƙɟƘƙǘƙƙƙƙƙƙƙƙǙƙƙǙƙǙǙǙʞƙƙƙƙƙǘǙǙǙǙǙǙǙǙǙǙșșȘ˞șșșșșəȚɚɚʛɛʜʜ˝˟̡̠ǫ̵̸˼˿´Ѷ}usqnlkifdc|Ν˙ɔȐƋƆł~yd[VROLIFDCA?=<:8759ǙǙŽŽŽŽŽŽŽŽŽșŽŽŽŽŽŽŽďďĐőŒŒœƔǕǗǭƱƵŹŽϭwromkigeca_r̕ŏÊտzؿuڿql`XTOLIFCA@><:87542ŽǙŽǙŽŽŽÎŽŽŽșŽŽŽŽŽÎސÏÏÐÑđĒŔŔƕǖĜǮƲƵŹžԭqnligeda_^\hϖŐËտ{׿vڿqmbUQMIFCA?=;975421ŽŽŽǚŽŽŽŽŽȚŽŽŽŽŽŽȚÏÐĐđđŒœƔƕǖǘ°īƮŲŶŻľۭnkhfdb`^\ZY_ӖƒÌ†տ|׿wٿsܿnfTNJFCA><:864210ÏȚȚÏȚÐĐđđĒēŔŔƕƗ̣ƬǯƳƷŻĿigeb`_]ZYWUWחƓχԿ}׿xٿsۿoh[KHDA>;975310.ÏÏÏϏȚÐϐÏțÐÏÏÏÏȚÐÐÐÏАϐÑÐÒÒēēŕƖƗ͢ǭǰǴƸżfca_][ZWUTRQܗǔď‰ӿ~־yٿtۿpzYIEA>;86420.-ÐÐÐÐÐÐÐÐÐÐÐÐÐÐɛÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐɛÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐɛÐÐÐÐÐÐÐÐÐÐÑđđĒēœŕƕƗ̢șȮDZǴƸƽ¨}ca^[ZXVTRPOMǕďŠӿվzؿun_GB>;8532/-+ÐÐÐÐÐÐÐÐÐÑÐÐÐÐɛÐĐĐÐÐÐĐÐÐÐÑÐÐÐÐÑÐÐĐɛÐÐĐÑÐÐÑÐÐÐÐÐÐÐÐÐÐÐÐɛÐÐÐÐÐÐÐÐÐĐÑđđŒĒœŕǕƗ͢șĜéȮDzƵƺƾħv_]ZXVURPOMKJyȖՋӿվzńھrݿneI@<8630/,*đđđÑĐđĐđĐĐđđđđʜđđđĐđđđđđđđđđđĐđđđđʜÑđđđđÑÑđĐđđđđÑđđđĐđʜÑÑđÑđÑđđÑÑÑĒĒŒœŔƔƕǖ͢ȘɚǫȯȲǵǺƿͰj\YVUSQOMKJHFkɖŒŒӿĉ׾wھsܿoݿiN=9630-,*đđđđđđđđđđđđđđʜđđđđđđđđđđđđđőđđđđđ˜đđđđđđđđđđđđđđđđđđđʜđđđđđđđđđđđĒĒŒœœƔƕǖ̡ɘșǚɬɯȳǷǻƯ˧bXVSQPNLJHFEC]˗ƓÍŎԾ}־xپt۽oݾmW<630-+)őőĒđőđđđđđđőđőʜŒđđđőŒőőđĒĒđŒđĒĒđĒđʜőĒđđđĒđőđđĒĒđđŒđĒđĒ˜ĒđőĒőŒđđŒőđŒĒœŒŔƔƕǖ͡Șșɚʭɰȳȸ®Ϧ[URPNLKHFECB@RΗƔÎǔҿԾ~ֽyؽtڼqۼmݼ_=41-*(ŒŒŒŒŒŒŒŒŒŒŒŒŒŒ˝ŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒ˝ŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒ˝ŒŒŒŒŒŒŒŒŒŒŒŒŒœƓƔƔƕǕ͡ȗșɚʛʭɱȴͿǽԥTQNLKIGECB@?=HҖƕɚѿӽսz׻uغrٺnظgC2.+(ŒƓŒŒŒŒŒŒŒŒŒŒŒŒ˝ŒŒŒŒŒŒŒŒƓŒŒŒŒƒƒƒŒŒŒ˝œŒƒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒ˝œŒŒŒŒŒŒŒŒŒŒŒŒœœ~Ɠ~ƔƕǕ͠ȗȘəʚĜǪʮɱμȹǽ¥ڤPNKIGFCB@?=<:?֔͠ĐѿҽԻzֺwָr׷o׶jM0,(ŒƓƓƒƓƒƓƓƓƓƓœƓƓ˝ƒƒƒœŒœƓŒƓƒƒƓƓƒƓœƓƓŒ˞œƒœŒƓƓŒœƒƒƒƓƓƒƒƒƒœƓ˞ƒƒƓœœƒƒŒœœŒƒ~Ɠ}Ɠ|œ{Ɣ{Ɣ}ƕǖ̡ǗɘəʚʜˬʯκɵȺȾåߣMJHFDC@?=<:877ۖǗđŒоҼӺ|ԸwնsյoճlشX1*Ɠ}ƓƓƓƓƓƓƓƓƓƓƓƓƓ˞ƓƓƓƓƓƓƓƓƓƓƓƓƓƓƓƓƓƓƓ̞ƓƓƓƓƓƓƓƓƓƓƓƓƓƓƓƓƓƓƓ˞ƓƓƓƓƓƓƓƓƓƓƓ~Ɠ|ƓzƓyƓyƔxǔyǕ{Ǖ~͠ȗɘəɚʛɜˬϷɲɶȺȿæzJGDCA@=<:87542ߏȘŒϾѻѹ|ҷwӴtӲp԰mѮb6Ǔ{Ɠ}ƓƓƔƓƓƔǓƓƓƓƓƓ̞ƓƓƓƓƓƓƓƓƓƔǓƓƓƔƓƓƓƓƓ̞ƓƓƓƓƓƓƓƓǓƔƓƓƓƓƓƓƓƓƓ̞ƓƓƓƓƔƓƓƓƓƓ}Ɠ{ƓzƓxƓwƓvƔvǔwǔxǕz͡ȗȗȘɚʚʜдʯʳɷȻȿŦkFCA@><:8754210lșœϾϻи}ѵyѲtѰpѭmΪiǔyǔ{ǔ}ǔǔǔƔǔǔǔǔǔƔǓ̞ǔǔǔǓǔǓǔƔƔǔǔǓǔǔǔǔǔƔǓ̞ǔǔǔǔǓǓǔǓǔǔǓǔǔǔǔǓƓǔǔ̞ǔǔǔǓǔǔǔƔǔ}ǔ{ǔyǓwǔvǔuƓtǔsƕtǔuȕw͠ȗ~ɗɘʙʚ˛˜ʯ˭˰ʴɷɼƥ`CA?=;9754210.-\əŔνι϶~ϳyϰuϭrϪnǔwǔyǔ{ǔ|ǔ~ǔǔǔǔǔǔǔǔȔ͞ǔǔǔǔǔǔǔǔǔǔǔǔǔǔǔǔǔǔǔ͞ǔǔǔǔǔǔǔǔǔǔǔǔǔǔǔǔǔǔǔ̞ǔǔǔǔǔǔǔ~ǔ}ǔzǔyǔwǔuǔtǔsǔqǔrǔrǕsȕu͠Ȗzɗ~ɘʙʚ˛˜ĝ˫ˮʱʴʸɼȥT?>;9864210.-+*Lʘĕͼ͸͵β{ͯvͫrǕuǔvǔyǕzǔ|ǔ~ǔǔǔǔǔǔǔǕ͟ǔǔǔǔǔǔǕǔǔȔǔǔȔǕǔǔǔȔǔ͟ǔǕǔǔȔǔǔǔǔǔǔǔǔǔǔǔǔȔǔ͟ǔǔȔǔǔǔ~ǔ{ǔzȔxǔwǔuǔsǔrǔqǔpǔpǔpǕqȕrΠȖwɗzɘʘʙʛ˜̝̬ˮ˱ʵʸɽ̤I<:865310.-+*(~'}>͗ŗ̸̴̼ͱ{ͭwǕsȕuȕvȕxȕzȔ{Ǖ}ȕȔȕȕȔȕȕ͟ȕȔȕȕȕȕȕȕȕȕȕȕǕǔȔȕȕȕȕ͟ȔǕȕȔȕǔȕȕǔǕȕȕȕȕȕȕȕȕǕ͟ȕȕȕȕȕ}ȕ{ȕzȕxǕvȕuȕsǕrȕpȕpȕoȕnȕnȕnȖoΠȖtɗwɘ|ʙʙ˚˜̝ʝ̬̯˲˵ʹɾäϢB975320.-+*(~'}&|$|3~ϖŗ˼˷˴˰|Ο͟͟͟͠͠Ο͟͟͟͟Ο͟͠Х͟ΠΟΟΠΠΠ͟͟͟͟͟͟͟Ο͟͠͠͠ХΠ͟͟͟Ο͟Ο͠Ο͟͟͟͟͠Ο͟͟͠͠ФΠ͟͟ΟΠ͟͟͠Ο͟͟͠~͟~͟}͠|Ο{Ο{͟{͠|ЦΡϡϡϢУФХѦѧǬѴѷѺнŬɮب:6421/-+*(~'}&|$|#{"z({՘ˢƝØокȕpȕrȕrȕtȕuɕwȕxȕzȕ{ȕ}ȕ~ȕȖȕ͠ȕȕȕɕȖȕȕȕȕȕȕȕȕȕȕȖȖȕȕΠȕȖȕȕȕȕȕɕȕȖɕȕȕȕȕȕȕȕȕΠȕ~ȕ|ȕ{ȕzȕxȕwȕuȕtȕrɕqȕpȖoȕnɕlȕlȖlɖkȕlɖl͠|ɖoɗqɗuɘz˙˙˛̜̝͟ʪ̭̯˳˶ʻɿĥ؝532/.+*('}&|$|#{"z yy!xאřʻʷɖoȖpɖqɖrɖtɕuɕvȕxɖyɕzɖ{ɖ}ɖ~ɖΠɕɖɕɕɖɖɖɖɕɕɕɖɕɕȖɖɖɕɖΠɕȕɖȖɕȖɖȖɖȖȖȕɕȖɕɖɖȕȖ~Πɖ{ɖzɖyɖxɕvɖuɖtɖrɖqȖpȖoȖnȕmȕlȖkɕkɕjɖjɕjΠzɗmɖpʗsʘvʘ{ʚ˚̜͝͞ŝ̰ͫͭ˳˷˻ťݚ20.,+)'~&}$|#{"z yyxwwvۋřʻɖnɖoɖoɖpɖrɖsɖtɖuɖwɖxɖyɖzɖ|ɖ|ΠɖɖɖɖɖɖɖɖɖɖɖɖɖɖɖɖɖɖɖϠɖɖɖɖɖɖɖɖɖɖɖɖɖɖɖɖɖ~ɖ}ɖ{ΠɖyɖxɖwɖvɖuɖsɖrɖqɖpɖoɖnɖmɖlɖkɖjɖjɖjɖiɖiΠyɗlɗmʗoʘsʙy˙~˚̛̜͞Ο̴̱ͬͮ˸˼ťn/-+)(&}$|#{"z yyxwvvuaŚɖmɖnɖnɖpʖpɖqɖsɖsɖtɖvɖwɖxʖyɖzϠɖ|ɖ~ɖ~ɖɖɖɖɖɗɖɖɗɖɖʖɖɖɖɖϡʖʖɖɖɖɗɖɖɖɖɖɖɖɗ~ɖ~ɖ|ɖ{ɖzʖyϡɖvɖvɖtʖtɖrɖqɖpɖoɖnɖmɖmɖlɖkɖkɖiɖiɖiɖhɖhϡxɖjɗjʗnʘqʘu˙y˚̛̜͟͝˞ͫͮͱ̴˸˽ǥ\,*('%}#|"{ yyxwvvutsOĘʗl4ɖlɖmɗnʖoɖpɖqʖrɖsɗsɗuɗvʖwʖxϡɗzʖ{ʖ{ɗ}ɗ}ɖ~ʖʖɗɗɖɖʖʖʖɗʖɖʖϡɖʖɗʖʗɖʖʖɗɗɗ~ɖ}ɖ|ʗ{ɖ{ɖzɗyɖxʖwϡɖuʖtɗsʖrɖpɖpɖoɖnʗmɖmɖlɗkɖjʖjɗiɗhʖgʗhɗhϡvɖhɗjʘlʘoʙr˙w̚}̛̛͜͞ΟȧΫ̴̱̹ͮ˽¢ǣO)'%$}"{ zyxwvvutssrs4ʗkɗlɗmʗnʗoʗpʗpʗqʗrʗsʗtʗuʗvϡɗwʗxʗyʗzʗ{ʗ{ʗ|ʗ}ʗ}ʗ~ʗ~ʗʗʗʗʗɗʗʗϡʗʗʗʗʗʗʗ~ʗ}ʗ}ʗ|ʗ{ʖ{ʗzʗyʗxʗwʗvʗuʗuϡʗsʗrʗqʗpʗoʗnʗnʗmʗlʗkʗkʗjʗjʗiʗhʗhʗhʗgʖgϡwʗgʗiʘjʘm˘p˙t˚y̛̛͝͝ΞϠͪά̵̱̹ͮ˾¡ɢA&$~#|!{yxwvvutssrqʗkUʗkʗlʗmʗmʗnʗoʗoʗpʗqʗrʗsʗsϡʗuʗvʗvʗxʗxʗyʗyʗzʗ{ʗ{ʗ{ʗ|ʗ}ʗ}ʗ}ʗ}ʗ}ʗ}ʗ}Ϣʗ}˗}ʗ}ʗ}ʗ|ʗ{ʗ{ʗ{ʗzʗzʘyʗxʗxʗwʗvʗuʗtʗsʗsϢʗqʗqʗpʗnʗnʗmʗlʗkʗkʗkʗjʗiʗiʗhʗhʗhʗgʗfʗfϡvʗhʗgʘiʘk˘n˙r˙v˚|̛͜͝ΞΟŜΪ̶̲̹ͬͯ˿àˠ4#~!| zxxvvutssrqqVʘkʗjʗkʗlʗlʗmʗn˗nʗoʘoʗpʗqʗrТʗsʗtʗuʘuʗvʗvʗv˗xʗyʗxʗyʗzʗzʗzʗyʗzʗzʗ{˗zϢ˘zʗzʗyʗzʗzʗy˘xʘxʗxʗwʗv˗vʗuʗuʗtʗsʗrʗq˗qϢ~ʗoʗoʗn˗nʘlʗl˗lʗk˗jʘjʗi˗h˗iʗhʗhʗgʗfʗfʗgϡvʗg˗gʗhʘk˘l˙p˙s˚x̛~̛͝͞ΟΠΩ̵̲̺ͬͯ˾ßϜ+ {yxwvutssrqqqʘj˘jʗj˘kʘkʗlʗm˗mʘn˗o˗oʘpТ˗qʗrʗrʘs˘s˘t˗uʘuʘv˗vʗwʗwʘwʘwʗwʗxʗx˗xʘxТ˘xʗwʘwʘwʘw˘vʗvʘv˗uʘuʘtʗsʘsʘrʗr˗q˘q˗oʗoТ}ʗn˗m˗mʗlʘl˘k˘j˘j˗iʘi˘h˗iʗhʘgʘgʗfʗfʗg˗fϢuʗgʗgʘhʘi˘k˘m˙q̙u̚z͛͜͝ΞΟ˟ģΪ̶̲ͬͯ˺˿ğҙ#|yxvutssrqqq˘i:˘j˘j˘j˘k˘l˘m˘m˘m˘n˘nТ}˘o˘p˘q˘q˘q˘r˘r˘r˘s˘s˘t˘t˘t˘u˘u˘u˘u˘u˘uТ˘u˘u˘u˘t˘t˘t˘s˘s˘s˘r˘r˘q˘q˘p˘p˘o˘o˘n˘nТ|˘m˘l˘l˘k˘j˘j˘j˘i˘i˘i˘h˘g˘g˘g˘g˘g˘f˘f˘fТu˘f˘g˘g˘h˘i˙l̙o̚r̚w̛}͜͝ΞΟϠ̦Ϊ̷̲̻ͬͯŞۜyvvtssrqqp:˘i2˘i˘i˘j˘k̘k˘k˘l˘m˘mТ|˘n˘n˘o˘o˘o˘p̘p˘q˘q˘r˘r˘r˘s˘r˘r˘r˘r˘s˘rТ˘r˘s˘s˘r˘r˘r˘q˙q˘q˘q˘p˘p˘o˘o˘n˘n˘m˘m˘lУ{˘k˘k˘k˘j˘i˘i˘i˘i˘i˘h˘g˘g˘g˘g˘g˘g˘f˘f˘fУu˘f˘g˘g˘g˙h˙j̙m̙p̚u̚y͛͜͝ΞϠϠ~~Χ̶̲̻ͩͬͯ˧yێvutsrqqp2̙i˘i˘i˘j˘j˘j˘k˘k˘lУ{˘l˘m˘n̘n˘n̘o˘o˘o˘p˘o˘p˘o˘p˘p˘q˘q˘p˘p˘pТ˘p˘q˘p˘p˘o˘p˙p˘o˘p˘o˘o˘n˘n˘m˘m˘m˘m̙k˘kТz˘k˘j̘i˘i˙i˘i˘h˘h˘h˙g˘g˘g˙g˘g˘f˘f˘f˙f˙fУu˘f˘f˘f˘f˘g˙i˙k̚n̚r̚v̛{͜͝ΞΞϠĜ~~}}||Χ̷̮̳ͩͫ˻ǣƝetsrqqq˙iT̘i˘j̘j˙j˘j˘kУz˙l̘l˘l˙l̘m˘m˙m˘m̘n˘n̙n˘n˙n̘o̘o˙o̘o̘o˘oѣ}˘o˘o̘o˙n̘o˙n˘n˘n˘m˘n˘m˙l̘m˘l˙l˘k˘k˘k˘jУy̘j˙i˘i˘i˘i˘h̘g̙h˘h˘g̘g˙g˙f˘f̘f̘g̙g˙f˘fѢu˘f̘f˘g˘g̙g̘h˙j̙m̚p̚t͛x͛}͜ΝϞϟϠ~~}}||||}|̷̯̳ͦͩͬžƝOsqqW̘j6̙i̙j̙j̙jѣy̙j̙j̙k̘k̙k˙l̙l̙l̘l̙m̙m̘m̙m̙m̙m̙m˙m̙m˙mѣ|̙m̙m˘m̙m̙m˙m˙m̘l̙l̙l̙l̙k̘k˙k̙j̙j̘j̘j˙jѣy˙i̙i̙h˙h˙h̙h̙g̙h̙g˙g̙g̙g̙g̙g̙f̙g̙g˘f˙fУu̙f˙f̙f̘g̙g̙h̙i̙k̚n̚q̛u͛y͜~͜ΝϞΟ˞~~}}||||{{zzɢ̩̳ͦͬͯѿ̼Śt6(@ 333Л3=347=CIOU[dhnt{he\XTPLHDA=B63333r3f3f3f3n=f3f3f3f3f3f3f3f3f3m=f3Оf3f33Q3334>48>DJPV]ckou|f]YUQMIFB>C743333~3j3f3n=f3f3f3f3f3f3f3f3f3n=f3f3f3g3Q4Q45555@9?EKQW^dksv|o`\WSOKGC@D85444444m4n>g4g4g4g4g4g4g4g4g4n>g4g4g4g4g4Q5556677DAGMSZ`fms{b]YUQMIEAE:64444444v>g4g4g4g4g4g4g4g4g4o>g4g4g4g4g4h5777889=KIPV\cipv{d`\WSOKGCF;85555555?m5h5h5h5h5h5h5h5h5o?h5h5h5h5h5h58Л9:;@CJQXcfmt{kfa\WRNIK@=9777777A67p6j7j7j7i7j7j7q@j7j6i6j7i7j7@BELT[bmqxojd_ZUQLMB?;877777A777j7j7j7j7j7j7rAj7j7j7j7j7j7DGNV^emw}toid^YTOPEA=998888B888q8k8k8k8k8k8rBk8k8k8k8k8k8IPX`hqyztnhb]WRRHC?;:9999C999|9k9l9l8l9l8sCl9l9k9l9l8l9RZckt|πzsmga[UUKFA=;::99C9999l9l9m9l:l9tCl9l9l9m9l9l9\enwφŀyrle_YXNHC?<<;::D::::q:m:m:m:m:tDm:m:m:m:m:m:fpy΍ćxqjd]\QLFA>=<<;E;;;;x;n;n;n;n;uEn;n;n;n;n;n;q{ު͕Ďwpib_UOID@>===F=<===p=o=p>>>>q>q>q>q>xHq>q?q>q>q>q>Ǹwrf^WPJECB@I?????r?r?r?r?yIr?r?r?r?r?r?}xkc[TMGECAK@@@@}@s@s@s@s@zJs@s@s@s@s@s@}pg_XPJGECLAAAAxAtAtAtAtA{KtAtAtAtAtAtAulc[TMIFEMCBBBuBuBuBuBuB|LuBuBuBuBuBuBzqg_WOKHFMDCCCvCvCvCvCvC}LvCvCvCvCvCvCulcZSMJHOEDD}DwDwDwDwDwD~MwDwDwDwDwDwDzpf^UOKIPFEExExExExExExE~NxExExExExExE~tjaYQMKQGFFyFyFyEyFyFyFOyFyFyFyFyFyF|sjc\XUZQPހPـPԀP΀PʀPƀP€PWPPPPPP{qg^VQMTI}H{H{HzH{H{H{H{HQ{H{H{H{H{H{HھtjaXROUJ|I|I|I|I|I|I|I|IR|I{I|I|I|I|Iʿμռ׵۲wmc[TPV}K}J}J|J}J}I}J}J}JS}J}J}J}J}J}JĹȶ̴ҵԮتܨzof]VQ߆W~L~K~K~K~K~K~K~K~KT~K~K~K~K~K~KðƯɬϮѧդءܡϵ~sh^W߅S܉XցMҀLLLLLLLLULLKLLLħǦͨΡў՜ؚܜߞݺǝug]X݋TڍYԅNσM̂MȁMĀMMMMMUMMMMMM¡Šˣ˜Κјԕהږޙ֧{f_YܓUڔ[ӋPψN˅NǃNĂNNNNNVNNNNNNÛɞȗ˖ΔђӐ֐ْܕߙеߪɌe[ݜVڜ[ԒQϏOˋOLjOÅOOOOOWOOOOOO–ǚƔȒˑ͏ЎҍՌ؍ڑޚޛӿ軭ŦۙuߧYݦ]֛RҗP͒PɎOŊPˆPPPPXPPPPPP™Ęțǖɕ˔͓ϒёӐՐؑۘۘݞںàߪԆi۪\إZӠYϛY˗YǓYĐYYY`YYZYZYĔÎčƌȋʊ̊Ήω҉֐Սא٣۲޿ྒԚߊrܮW֦RѠQ͛QȕRőQRRZRRRRRRÓËċƊȉɉˈ̈ΉҏыӍԐغպׯݾʍ߉ރ|c׫SӥSΟSʚSƕS‘SÓ[SSSRRSъÊĉʼnljȈɈˈϏΉЌЏҗҲӱĘڿăݒރ}xn߷YժSФS̞TșSǚ\TTTSSTЉÉĉʼnƈLjȈ̎ˊ͎̋ϑЬϯѷǗ}Շރ|vrmaٱVөUϣT͢]ǘUÔTTTUT‰ÉĈňƈƈʏɊɋˍ͓̏ɿϲ̷̗|΃ބ}vpkgbY֮VԬ^͢UʜUƗUÓVUU‰‰ÉĊʼnȏƊNjȌɏʑˠƷʰǺИ‡Âv}woid`\Xߺ[խVѧV͡VɛVƖVÒVŠÊÊÊǐċŋƍǎȐɓdzűȲ¿ՙō}tuqic^YURRڳWԫWХW˟WǙW‘‹‹ËƑċČōƎƐǒȘ¿ůǴij|xuܜÉ~tplc]WSOKIPׯXҨXΡX’ÒŒŒŒÌÌčĎŏƑǔħƮƵʱyuqmċvnf]VQLHEADݴSөYÓÓÓÓÓÓÓŗÓÓÓÓÓÓÓÓÓƗÓÓēēēēēœœǗœœŔƔǕȖəɛɴȻԴxrnjfȓĉvgXPKFB>;8DĔēŽŽŽœŽŽŽÏÐđœƕÞƱŹ׮pkgc_}ǐտ{ٿqbRKD@<852ŔŔŔÐđĒƔƖƳŻޭid`\Xoʒ‡Կ|ٿsdOE?:62/ÐАŕААŕЏÏÏŕÐÐАÐđĒŔƖȟŭƴżb]YURa͓‰ӿؿupM@941-ÐÐÐÐÐÐÐƖĐÐÐÐÑÐÐÐÐƖÐÐÐÐÐÐÐÐÐƖÐÐÐÐÑđĒŔƖʝȮǵſ[VSNKTєÌӿ}ܿmP:4/+đđđđđđđǗđđđđđđđđđǗđđđđđđđđđǗđđđđđĒŒƔƕʜȚɰǷŪqTOLHEHՓֽ͈xڽpX6/*ŒŒŒŒŒŒŒȗŒŒŒŒŒŒŒŒŒȗŒŒŒŒŒŒŒŒŒȗŒŒŒŒŒŒœƔƕʜəɱʼťcMIEA>>ڒǕѿռz׹rݺ`7*ƓƒƓƓƓœƓȘƒœƓƓƓƓƒƓƓȘœƓƓƓƒƓƒƒƓȘƓƓƒœƓƓ|ƓzƔzǕ~ʜɘʛĪ̶ȺɥVFB?;86Ēоҹ|Եsղh=Ɠ{ƓƓƓƓƓƓəƓƓƓƓƓƓƓƔƓəƓƓƓƓƓƓƓƓƓəƓƓƓƓƓ{ƓxƓuƔuǕw˛ɘʚṵ̈̀ʳȻΣK@<852/oœνз~бuϫmǔwǔzǔ~ǔǔǔǔʙǔǔǔǔǔǔǔǔǔʙǔǔǔǔǔǔǔǔǔʙǔǔǔ~ǔzǔwǔsǔqǔqǕr˛~ɗʙ˛ˮʴɽҡ@:62/,*\Ŕ̼͵ͮvʚzʚ}ʚʚʚʚʚ͞˚˚˚ʚʚʚʚʚʚ͞ʚʚʚʚʚʚʚʚʚ͞ʚ˚ʚʚ}ʚzʚxʚv˚tʚu͟~̜͞͠΢γ͹ۢ840,*'}$|Iɘοͷȕpȕrȕuȕxȕ{ȕ}ȕ˚ȕȕȕȕȕȕȕȖȕ˚ȕȕȕȕȕȕȕȕȕ˚ȕzȕxȕuȕrȕpȕnȕlȕkȕk˛tɗrʘ{˚̜¦̰˷ʿޚ1.*'~$|"zx9}ɔʻɖnɖoɖqɖtɖvɖyɖ{̛ɖɖɖɖɖɖɖɖɖ̛ɖɖɖɖɖɖɖɖ}ɖ{̛ɖvɖtɖqɖoɖnɖlɖjɖiɖi̛qʗmʘu˚̜͞ʪ̱˸p,($}"zxwv*x͑ɖlɖmʖoɖpɖrɗtʖv̜ʖzɗ{ɖ}ɗ~ɖɖʖɖʖ̜ɖʖɖɗ~ɗ}ɖ{ʖzɗxɖv̜{ʗrʖpɖoɖmɖlɖjʖiʖhɖh̜oɗjʘo˙x̛͝ɞ̱ͬ˹¡^&"|ywvtsrʗkʗkʗlʗnʗoʗqʗr͜{ʗuʗvʗxʗyʗzʗ{ʗ{ʗ{ʗ|͜ʗ{ʗ{ʗzʗyʗxʗwʗuʗtʗr͜xʗoʗmʗlʗkʗjʗiʗhʗgʗf͜nʗhʘl˙s̚}͜Ξ̲̺ͬğK {xvtsqqʘjPʘjʘk˗mʘnʗo͝wʗqʘr˗sʘtʗuʗvʗvʗwʘv͝}ʗvʘvʗuʗtʘsʗrʗq˗pʗo͝u˗lʗk˘j˘iʘhʗhʘgʗfʗf͝nʘgʘj˙n̚v͛͞Ο̲ͬ˻ǜ;vtsqpP˘iK˘i˘j˘k˘l͝t˘n˘n˘o˘p˘p˘q˘q˘q˘q͝y˘r˘q˘p˘p˘o˘o˘n˘m˘l͝s˘j˘j˘i˘h˘g˘g˘g˘f˘f͝m˘f˘g˙k̚q̛z͜Ξƣ̲̻ͬ͝+zsqpK˙i˘i˘j˘jΞr˘k˘l˘l˘m˘m˘n̘n˘n˘nΝu˘n˘n˘m˘m˘m˘l˘k˘k˘jΝq˘i˘h˘g˘g˘g˙g˘f̘g˘fΝm˘f˘g˙i̙m̚t͜~Νϟ}}||̦̬̳ο͓rq(0` 3533;36=EMU_fnwd[VQKFAC8433y3i3f3l:f3f3f3f3f3f3l:f3f3f354c444<7?FNW_ipxq^XSMHCD:53333n3l;f3f3f3f4g3f3l;f3f3f3g3c545666@@IQYbjtz`[VPJEF;744444v>>>D>>o>o>o>o>tDo>o>o>o>o>ADLW`lt~mf_XRPE@:8777?77o7j7j7j7p?j7j7j7j7j7GOZdo{tle]VTIC=9988@88{8k8k8k8q@k8k8k8k8k8R]hs~|skc[XMF@;:99A999l9l9l9r@l9l9l9l9l9_kwʄ{ria\QJC><;:B:::q:m:m:sBm:m:m:m:m:mzީɎzqgbVNG@><=D<<<{=o=o:9>99l9l9p>l9l9l9fxܢre[MB=;?;:q:m;q?n;n;n;|Ӡ~ocTH@>A<5/p̽ΰvɘvɘ|ɘ˚ɘɘɗɘʚɘɘɘɘʚɘɗyɘtɘp˛t˚}̸̞ޛ1*${Xƿɖnɖqɖu˙}ɖ}ɖɖɖ˙ɖɖɖɖ{˙{ɖsɖoɖlɖiʙlʗo˚Ü˹q%~yuA|ʗjUʗlʗn˚uʗtʗvʗxʗy̚|ʗxʗwʗuʗr˚sʗmʗkʗiʗg˚jʘi˙u͝ȪʻYvrqU˘iT˘j̛o˘m˘n˘o˘p̛s˘o˘o˘n˘l̛n˘i˘h˘g˘f̛j˘f̙m͛}ʝ̬ȾB}qT(0 k9 s;h7b0c1g3j8g4g4h5i7f3g3i6h6g3g3i7h5g3g4j8g4Țg4*iEuƦYʑSzAf4e5e3g5i6k8h5h5j7j7h5h5k8i6h5h5k9h5h5ˠj6{pajk͜X~El:g8km;l:m;o>m:m:j-r|aSךVtscϞSEl9f6i9l:l8l8nn;m:n:p>m:m:p=o4~Jl~fl:ÌJaeb`\TצJBvAl>l=o=sAp=p=tBs8tuVcwszEq@ԦS]\XUSPKݬGDzCsFpCrBtAsERUROLIFC?>đ>|@wDvCx?w;tyY_[k>qBŕJNKHEB?<964{H{H{@{`HgUTguEtHKקJFB?<9630}K}KIau?XYQLotOxJxKIC<8630-~K~KN~Ft=dNME]~TwH{K~OʘG910-*NNQDPyHrDI@K]yJQ}PM٦?-('TSVOmHUm}>C;;gTTTVÒP5"TTWTPkPVX9=70nrTSUYUΚCVVYWKQ„S]E572'TuXĄTYVXXX[YSvODžVe510-!98|I{@yheNhyNvHҢJC=950~K~EvyDsxDWYpGKA4.,OPTH`=DczO~QȕH3$TVK\YK74upTVV֡>VXOȃId81'ZrXąXY\^Ï[cz͈So(+?uä[đ^Œ`Œ_ǑUǑYΌ]lq#{{(tdǔaȖcȕb˕ZϕYɒaOuzvurʗe˙g˘f̘cǘoŗqѕag5turp˘et̙g̙f̙eЛ_y|Ϛ]֔fiq p n}AAAAAAAAAAAAAAAADisplayCAL-3.1.0.0/DisplayCAL/theme/intro_new.wav0000644000076500000000000201153412647526531021265 0ustar devwheel00000000000000RIFFTWAVEfmt "VXdata0 C B5  1F3WC_HXA?."* ),)"06^EL?"o&xbI*$5]K@S)F(~P62 $& /(<DF[NkJo<cCi_T>S6gIz"UGP{AL"  t5 C.j0|V8f&M@80(#  =^$x yU;x ]rTzJck4A\.[ =>1rvP"kX{vS4'eMSp*)nLfqndyYUO<E*6x*`4DA$yV5]1Yp\g,RC\skq kknDTe 3?3 ,#SwM`!3 rv+^ i\uc)MTF+\ 7?[p$J\ /%\:k 'C \<tkudP8i1<Aaoc7z!j Y41`rkG7BR=P\wn>`  !11D<XCeCm?q8n2j(\D xqcULC5@H\z"Gw:Thy9eW{r~E[3 gpFQN h44bq{IGqs$!r~nqBo'&R6[`DCc[wb/;7 YY#>TSrO.5 mI0[ 7B<=OH9/8Uy6k@{pfYC)  *a"S}1&m+9u&9X_Aaq=8LJR/J-x:iQnDQfVWlTmQyKyGw7m`TXsotl\oN"23'("uYD9S60N%^>f6b V@g#`)e6 >+L Xc%3#}XJ -vZj@l!xhii_tPV;@&0 &&4Vs_?}jE"pX; Ay-8;8h,L7 &qYz@29T{+55-& 2LTUKLXno, m%}1C*B%`k SQ^>[P}U}od~\m[]bRT^ kZjN^[pye_~S`UTflUg"F)st6mkn0F!} X+a4&1F]r:ZpwkM{&N$ar9E7G@V9P A66>LZgp4qZmq[v=c=q?V :CH   #3>@(K}C}:!W2!~DQ0P*i; EH!n9O?,2<[rM;fmbyLj6P&1 m:2L}xr@M'on.O W Xf5O\Lfw>\j.RyVC'fR~v~~yWC 0:{&zPINohDyO |NP[{tnQUd e?>R)Gl[FrVb\4-DtE'R{Zc>K'>+IV@M}Yqug") uu[^ |?qU \ w6Y[zx# xMB Jt9As L[4W}KzzfUh.w~h6sm{w"=]F@&l rYEVi(w<e1wrpO~Fb6>2C zTJ]B0H X[ PEH4Uv)|"JKFAd)n?|AB'=@979D8X|s6Xa KL1#m 1VlT [ ra]=TBK {CU'\H,QF3;j\9``;=#Dn_2*Fa}{[{GsXn_4aGFxz$?_ QcXnS4  KB 0>2@Fu#\Rflze.crxJZ)*@La:FQd;H~DH!$Qc jI&k)!2)LA;0!EP':5B !0PX[#?m={f;P5o9GF^|C W% [>B#{+AWWn5pX^KB+~ql!37{k03uV,KNZiS~l\ [,!"oa6 g)2uXb4|g_\wCf;Q !VB| O sf)UUr`{Pd(\ >r %/ $GT<V. }dAq<ZK?/&n*@ ^nGO3+ FXSpIQ&?uBs{gJXn}95QZ `ds@mb/\d?LgHSb!yn_ fG./!o06!R#  7P ~L1ftp=\'X+ H8u5'T x~] XRLH#zY .11s1[B!D][P(D;6#ufzI4< (#ltXni F+fNZu"u:NdC2X+Qr#~=eXOHQhx7;&3fbEt;Qcqua0_Q7_T%<6%T/eCD1'R5& VB].,=XkoLMn3K -36iQh >@7'S{!: Z"5/Q Z><Ai,e\WKMnh76\Z@  vruzA)t`Ou iJ#XCW?OkRzN svLJan5(1<*9qq{"W#cRK`*abrR0f)@RwQhAGqk.(+W> %b9I<RQF3$:)J8]}Kq2}6L}f1 }UA;?J^xTG%-+ (=<{Vw&n|^ di8>&r+Z 0Wfm*#^MZQ)H8q[sBYRqma;y ^P!f[<( (wvpXz7QsR8] 8~@-xB<EW&duE=iG>x*g:PgR+y}~=\N0rdz{+ODa)jH:HF9v6(8+k(gnK/q:zOWj"0_z3vqbLE!V\ss<I0kA;31i?I|02I3WAYn\w6z$OrC$B*8gtd6>;v>{#R1`]YE)q1g)^_d/dG[#D'g7 %I=5OHlUoRZZp70wE {x7XQ_a JyW!t\&WCYa' 7s =E(deM?}o)Dk3=,bwm 3`XU5c}}rhh(oIR= [y9 ~?T(>J8X GYOYySHw,E.c&C8Hsl/!IsyezkUtm O}|d <FGF<&#LmPEL?exi?]jk[d+,1XFw54Rfeh+veq-780/HykFn_ YRyBw,0bDO5cn-v'y3^HiuO:OTxO$N8rMnS,?\N'aFWJXQ =%?Is~sLEL?cmY|Uwne58r"\%hC%_Q4^:1mgUc.G"str]{d5$u;TYV:;<QZ(E^~E8)@c)[sQu:E M0[5{Q0_x3M<>Hk,U^Z`;Ry7L`j`CufD#C)SQ%#@6Q|NeDZ7[%Ljpeq$4Gr P`EQ6<|g5W!FPy PK<lzgb~#~'r)WeTpiRgtQ}'p\(QM<CPqtyh>K5Wl>u]YBY(!{Z `~(RHz&<Zli- Ilz[O$R-OyFF4,fgI]|)e3zBt-TW2"GFm t}?Zt E%Q]T-&0GVRPw4l 17,kC ^.ha.xpUt[Cv,"Bz'>T)%;Qa(jPZ{%Z|a"o.Xn>oV]["Qum\ 9pfCpg?:ZAfF~eVvpq*oy -s]hMC[OmsW?;>[C4agkbSvMP\VvZWn=E,Z<N87rU[9AT*;1\\eBt5"9`+G]5C@:.~@S nIbX> gJQ*%ti!6.w" #op`J ! #~ab[yP!i zJ7G4<}:*=;OS4B;PPNl8 R^=>i_c_sZ|gd;m\P<3D] W^9E0Mh?D\ ;&{tM,/B$vmRx)&IicvR3dW1]F/m8uZi<gx;j ZHmv .j7`tQJ2&}4,sG(Tk4<*D/5qO{#LD\+ u{<@otQUoJG'yW/x~4* *s3H`"t" F=ekxX$TVn:8>xr\#vcavN2[A/>RQ(:m"jTS77yNEd|/4Lw?#X=T` o>[+7+}"_OWs[ {br$BU+4&k _eU.j3V_<673BYWvq^9lyaU("!v$@!_Hmc>e&8TAG-Jv0;d2DD}^DCAXg<3S Y{!LU 2zdJpK)ctGu9> M# El]T7#4_"|,Jc ;FZ;l|Qs,O3N|u;|Wsyl @ 1R J7 C$opJ />6H ;\$/~lg6H41Oswg74=FxU{V #$E aUwZ$CR@v \t)s3r3/ Jf;V ww(Me'c[^Hu6E s.v\m Tt(Z$Wy1k++0PS0rKRok9H/9tM?m0Ql/R>gBo-am%r UuwW&n4)H*Ph:DE0|Fz>7d.ku<u;m*oE3@Vf r_KZDDDCGTg`\w,E0mScl{l !|R\eI{F"]v"\I  pxoh ^1{-1%yDDOR~yt8S Y\\ T()8K., Wla &:#;Dv]g06C< {%SP,V3-(kz ^N\FNv:iDCsx;miSb8!n$#X,hS<(>UC0o0' s6.`Z`T,H$N/{]2ays GXYy:EjUA !)v2 L=ro %(JRSIL=K>k6{QU/A( Ci&CtBQN9kw> r=8f>]~r_Kc&cpDqole^ei!G[d #JMEeielgRo:9PUaK2 WM}I~d$[?od[(hH>[1W7C;XFw#c@Jx64=Sa 5}raS`:AE1f0[zKs@p:wrO|?#)xVU9H$biY 1{YefJ6_V *cxL":CEb.!}Pvae#\RI6xp"+f ]X'Ae g[7we]?.$V`J$*"g3+KC39~(;$=]~aM6,F|]Bs$-j  *R/ijVcwO7zFI,mCE],woPf>; ;S^]GYT}%7 !2he~ w|i+ !.;g pz3c#g=p[~<JoO.`(bda4EGL&nI6l`v-'y <6NP_ + s8vmY)^5d9>.i <{fy{4:3h0Ul 'D@mu9sLpq ZKvR!| B3K4 2&;o<8nzYI6Wa{NcD|~p /gfsP$Iq;G.sp\"P}e0t.QU Q'|O)d4kJjW@S$)a:JFy&4(-H?M(,WpYR\hT:;x us'ttZdx5sSqRqjY[ XU\&33/1b`yCBN`($\x[ULJ)@ N8]#,zmJL9`oQP\yu5/Uox&2N6^2VSp :vaqlwWa/^""W;^Sa/;?+6[c2e_-j Kyn2r[JM1LXcTUU" c&{dt3` " W SekoW2xhLn@K:Q(-$")X<.S;/Z+P< @c`[d1nY9yvKGF(8\! @EF No2yxkZkLqC;'t]b+tGBOvK]kE 11julR0]L={.>'V2yc_4t~.i~TK#`NGYzRtwWq| 4@kiS&hh6/e(9FcN]rc?/& f(RCk5;dcS _$o4S5aWGdQ3'7 /y S>!ACXY 2Y9bW+a=V&.L8T>^F5>#[eBc e n jFg;~ ,\Mm :R?YA&Z5Dgo49]+##G,RV` &kX.Ekj'TvZzS1YC3 Bi>8p~--C ~U qoNW#5R k[:jCD(9Lor /|b!%7:/NdJNHWG.!QXlp4.F83uALeN&39G\pUvD{/ u,B$SxS}mgq2!d~Z=Ui@yc ZP&^"wsSc=:*{#dusH2m)\-+MUeE_PfXNF`BI b/ PXtSgG=^hD!pj1Z!;aKy.%YF^\5T0)Y!Kpyg/<"IHi1H/LXd/Q/4)1uw6@?/|1&y2 -AKIdK=_50Z6XV N;bNA8l1;Q8>iW/I&tSiRWhCZY^#Oc=j RXM{!Bcs CGXrBQ_$,yVzfK*A#gWt+kUc\2!nEf_e 6D0]\F-bC:87 :@C<MA{Y8pP5z:,nX4sv#@$P WX.A}_GnEj&;"c4q<#,j7fP 01O+NY`*(chHswugCQ/k}nM!~:}*^X3]NG S#6uy&%PT4[$ --;CjQw}hR ?z_v[y/ZNm=sMuqTYr4\%t[!Vz/2T9wL0y/IQd;_xAto`+  gT 9A.u8 MysZ|J1qEzB'dw [Fj [Yy,?$uY7'*mw [!nGUZ?6@fx`gU/m_s3aOr*/ 6dDL7>8="6c } {!O M*  .@U06x9nRCR$&h2-Uy#(: eR/'j  { NMZlf T |-hAH]V*N&s]']@t$t#}%HIOP !&%h:O;EiCI7pX]~G+RrEu|wNcg 3 ^844ysMPFJ%Y0 B= =I0q*iRa _ aw,stR4x`fBAlAX$/nR rK^g'X/` 2(^"zwYmDZ;y{`v9?0M&s;F e^G|<&K-NQ4Ushs`cH{OI/Ewp+.N$ xjc >z@`@%1a.V.\}5~4 r .O . + /fSa8%^nB^iL1%([f5g0jo[+'_L1jv Tac5B~/?#`k l&=:O~ Tkm.7u]&(:n/XY7 ; '@ ]k.OW*CFC?#Q# TNFGJ\P9t#!';)0h5]w5%|/cudbA$E3*]b)jn&ucKOy~M-Nce~b%S=3. 9=IW|,Bo/"O-Q0 s913JgH7$ ]#|$2?,H!qCd ^x :1b5(`iv;.#FicMu F`4{l!"gnI Z ;P  -Wp=0.O u/3s`>=;SE_iz}uw!'A YQ}O<HP=&OX q<OcZyp! m#VjDP-rO_~&UQ i  $ / IZSO\A11zzz\o3&[P>d'Ce (o_MCVP1dvs`K}N?1!2^NKM7.#c ,VJ|=3=Q!{O(k{q}Baj/T.(yK%V?tGcOp]d]go_,}Ln-P A85!mCK eH4uSg^}5>;edaNwO]b`D9@r7*]Brw | M:y*}i-G -c^\)X.DE :^`~~}U,M4IW;nq, U\zj5v<9#T C_D,3 s{tVYj+DPY8H+{=,d\ )Y5;p*)B~!Yh&An zI c Z?D"T0/\q@<ASHHS|!cP%7bA\^EUj0gsh9{{E,4oRbSQT?[NKpO!SnR_;p+:\mc&(,z=r~E!Vcyci|3 V + , 'eE` V*uBYs]K5')'Tw,Za9RHu2XR?h@ `8Y  yr1c?gn( ab@fqfoxkV}>8-:2HI9}yO y [|  n 1 -0-b-:SpaubXl6`L_*SGaXU?W*K4fyQ Fa[}(w~Lf;+prKE1)!\0;X.-%1E!dj 69,Z:Y]6'erDZ  PY lsv#&-pUZzsJ&/W0fT!j6SYT4\k-|vfyC6/UMU/M{xOsC]d_H1^qq*2}09K dD~w| XgAYiY0i  Dzla$0sn-43Zz@ Sj1PT^2 U   M5p36UYi zX  68$'TQ&6itZd10o9|xrjcyb/c5{y\   F6W#vKE >QRN 6"\%7lrNwBOq']gf&EM*LPL(O!7YN.[:76"kbMkOI%t_vwmz W0(^'IeX>\V)Jga3Y5(UPBbZV_z7$"{ 5Ud-#RB^$)Wb'u#<` U ?O mc Ta$$*Se!WgJqR o"pK[b:N0egJ1QQQPx%V{am4HN8mu~Ii?VVH:R%bKimBmM^+CJM0).f1Xmi}E<S>Fy}ACb'i,|L ,'6 1\ , ? @v 2c9pka@@bBLyy F+<qf kIk!;: ATa9T" 3"~VO~W%}QcED~v/-;G0<e]g+&hC@lH[q9Bh_YM ;%TH]9Wx\1TG ' G ~  gAie qn?Nln]|LLLwRg=fT-y?{zq;#!sqgXQkdqhNHyF |?:q?wFXoNG+]#hs9ht_x3BgV 0 e8 V $q|h05QY8*nJ,#]/,vKb=e(PRi Usc[AiqYUK|UI!jd$Es:~AeKNl[qL[p V#I*pWdYZD4^ki": _$s7g!8 j7&@D2$4|4s iTJu]K4]kn:=.>\ 4K ws.16l<mYA`  7 K# "H.g`L}Hyi^2`.KRd5nFy\o6g ge   0IP$ZQ{w`6dr4E TrcHv# lsG2yJ_[hZhVc-+?6(?*TKmjEG'G^kqTw)4 `_'So(d;`+w4n*=3oG 450"96A=* SE Q+rkAU  08:aQ4N"3{&P6qzWZ<$>Gpnm.Nm>_pHcKz9@Sr!($;dy3U0qY}^v6`{_''# 2/KGS12Pi{gm<"J$M~a\{G3$69x Z <M  Evfd|$ 2.Pd9.u_ji~}%j 8{d[bmwOPu'b#@F{A.h5|j?^H>PAu; Y.2_)   fO.kVv*YCHoUm5L f9  q  5 Xq,.eZR,TVRkY:xTyC !643hL$Q9p/5^\s<Bn02:rkm&P=@ Mi0uO" T CuG1GDt x8x[g]5n [ ; ? X lKF}Eve]ab^jV[C8S`Ucc1-*~m/: H}>$9hPapUSsr# Rt( * = =  uz@Kp0z?K8.*]#>Y5#bg^Ose=B$<A..T!klS_k>s_YFq( kXT l CZBx~<1~[%x@R1  `  9 uKG}/qFp  Ben~Jbt\+KXs|c~GYZRae@{td< t U2h ioqp)M@TpkgW 5 7  $ |Cs{4(XKxg C)S%]fCYV_#_R Fgnua%79v7AKTZDu:`^ @C-GvKq 0(P Z u99^q$F\U#W;FEe Pt c YkJ|RH V4-Cd%\242 _  } $dKS5Nf@Q}.M  8< LZa} ZTZ7wX0ee'dNEfG  2#(' Ysgx.jX% N.r  BQI@?=m4isosYko+]:S)`neb--nh&yY2TSEDh*!k6V6ME75~ NX>BXB1%Rr-{3C? ;^]xix_I< 42 " *p G6)z,&imA3O&UK8->nBuK0'?m{E~:Vh}Am03vr/y-oqc4_\I5?RF Hd/u|wG Th`C7CCFLyexl1D 5sb!>--g;oXX.hYLh]t{e7MvT)'# r;HQSc! 5 NZ0Cu[ W4V)n~yp}H} *=+\ X R 2d %;ngI43ju"z#x&pc:p_?={VMc-<f O`&6ID\wZ%VZ1q <  KZ's&Z e8DYW?akY4yC5^Nfk]  j xXe.*IROL/70d]S zd lS"[3l] ]Az!u]k7FI~~mQL"`Mei/{ ]# I Q . > 0*XgT[5Q}0:v? ^!Q@wsmt1 ! J +"R/b1s]D P } O<%2B->g$ `<{" y~,.5F G  h 4B Z#C"~X+S:!(S([UiL5o@$?H+"}]2rB)UJYTG3  ` X{7K?'ppa6P_JldrL:.GIT"r_ }]/]p2B^kzDB{di W w0raGzAF5# ?$&z;x P<R ]=?%JL35#'$0Cb-)!/]c5L>*=>uU,F4<5 V Myp h  S 7y |}a|0->( @^@KAdjp-LHt* 0Z H  > GjY%RW%)Yi+}Xs 2FE p#c&ff-SV;e?BP'  " i  V  u ]U xwpx#ECKb.b[$ *qG/eWSF W<:ZaZ E)esX8/@A>0sQOM2~ 9>=Zgb 5rrF@M+_ !r:I's7 P [ 5 o  rj49ErB|^_In>!TL; v}M3,ks)vx dm7 8  1C@Od!.HO $A|8Y/ fR>I~d U*nn   qn/ E Fab1F=JC.1:/T &Z3fR Sr]RGw>T+F$*Ux\ga=;wa (BQW(PPUG7Z;#{%Uto!B)p8RFX5w?\=fT\pgPG4**0C+3P jJEYO)!Nr6 Hp A | E ]* XzB/$B9jClPEjV#fN;>RNSop0!xINDS%&& ~0)yW0IT  B30=>CeKQR@*4$YCf1\,mf.}> T <>7b 2  r ea 1m1 _&ZLe;sXOr2-0< Mm:TW+v$&d (  ?1V|nz> e qoLr9tI[] (F}>7 ws_2Qc  N  ! f~  v=S]6> xBI~WO}$u @S**njtB  + h: X S7B0cI^cV'<UTppk%_~h[O$i e,2{>0j`#Y  u  @ G)|1*  SKL 2EcB` @;Vm wkte[ vxp+H !\ O jBLxe  > }.gX],a,`Oc,arC#_[b'n;B"[F0b=HO D   q  dc 7^Hq6kt%uYG 9OAp;:0z:[n}$S=3"0 ng Hy % !  _UZSkt8x &Ny=Pym-ei(e/? y5EmP ^ - oK  Xu ,gQnT.9epx:=S u  hZkpW,`.220pBL?.? &pNoE# DBMOi8" z9;/%+ JiILPswP{-_`osE10 [ (  ^St|o ]-n,.zaPNRz XuCFaeO8l<->T;= Qx  $ @:-) ` >`  T8/G+T:ߋ#{ ; b q q?1eD3R; }   b  k V=F "  ~_[kCM9 4 &9p'ltm2#ZDq N\~V@M / R   J A *(YQu#,+p3;7kOABfoG}N$ `b8)9RMoN)D w; $ ? }3 h`65O$N3qbGdH` G>bLkyVM%mZhH,/@!W=5tvDQUFx p  X3 D H  Qf gz}je&3?)Ldqa ' =3reW :] mn `Uq< 7 d{[oC>.Vh\7q>y 6_xWCF\a6y8(` B Z DkC8l+m~ Pz  R TrW(f?@*`Q:pND\^M}<0~ T - + r)<4 0  $ as idOg-I ]   \7wQXeK8lA+v LV~u3 3B ;g ` lVM tg  -P:]TLP& fN 6~iM EsCaY@Wk1HNlw(_uA`cc aP #m`Kzh )  rZ MZ7'gb~>u|SzXL3{fKZG[UFWV.wX,;(O,VZ63JC^I}c{c u Iv@"=^Ik OVrP13nEH  X"} jhq  W ^Q BwCW$zgxNe $g\4*!xYbnNe;vXteFo- &eZ,.J4  (  FZdeEV;u'=|YGne8\(w`hpۯ2ޅ23#Cp` > [j% To k@bZ^< Z A  @:I3&LxZ0ym20 ;BvG-(>+7Rf2wl;d[ >I@V~b]7d'a(-)SDi10P{ x!v$ !KT P ; 0 c m  K e  +  5Ex`wS&L 4SU >  DG ,   -"i#<iz&Vx~ m ) /d@"\]$$) ",Z$-%+9%(S#z$,!/ l\zye4 Em~.ؓߠPm InC=T>st^3K s hTJ,agHM}{ ' y" vg4:A[j,(Ry0l]+)^v?twRR  E$ j !/ d  B ss  Fq K 1  }t * r XkJCH}i[q1[j8{KPQ%[3^6AicS=9 B ,-]ax Y,W B{ - ] Z1jEyfpOd6z4v\vqqrx_';,=GZii /    Ys  A&[j`  yUy'J1/}2l z1Gk+lC| A P(  H q d %W dJxx@7sY ~(<fZ. 93T; L5M9n d~:fm^+X(Z ^ \k  p P} e]\LuiJFW^|Y!xoBF'yo$Fk&> f   H ;d   ' s5 x 5 7 j   K T  d!ZBaVy *P1ep;wP}&7N{_[Be+*3$Jr@M| # O^ Eg 8 K fS Tw 4KlK\<PY Xwhkx  2U  J)VC1ZK J'b\}O"[޻JJմ8nԁZߙݰ`.Nn Sy!  ?6AG !y$%'K))/+)*X''""Gx f W7 7  > " .   y/Ml'tn.c8i@; 0R|)hRn%hlc wOo%"zQO4W ?g  .A zay-Fdxs##%C A D O I (F ;+Zsx3`U4SROLHW%:y&t * L[Ryu%7mm-CK#7  x@f8aX#Ea  0?h 8 2hgj~P\  +zea-\  P ' d z  A`WV_V  ] u    M k{N"4iPLNNJ5?%=G SG4V,+uI5^!PK ,   Xi   U }gqS9l h v  C > % ' 4  %C ' -  qe=K 0_.ir3 K  H[*Q>d c d~ e% F'4TbW8 WGy| !!|"`""">##J#P$"$"I$ "aOm8 r MP$nG#AdM(Ir.W4gw'Yeߝ|5\݆4u:yD0N*RC*]n7H"QHaFQ,  %~  ; % M g  D # < GjY S "3 -   L t 7_mfeQ?)a1Z Q1g!O}*##Sg'zE\%ciA@A/8F)%+J|n!8P@db  YS0  R  \f  r G*F]/Q7{ &LP6 3 D C@=ic4~m#=SH9M?M%2T5?0f.Y~] jzY EJvC\U%3$ZqA_?0.82D1"J5EMbHtuc@V\D~{`?k)V9dU K]cf.7 ;kLl]^Z 8`4I\p g  Ip    J K   f  Z  D E A D  cyde*EY0Ow,0 2s97wzEQdnh-H|"34`| 5|  15^?2b5@ b 8    g mR Qkh f mT57M$@cZU.&Z9IBIsSZ9s7f#DG7O  WTvoI 2 a Vh&g @  / 2 #   , Xi- (o\/n/QB(>)-2C 93I9M*&7Bq s0[@T/2e  K 1o N;HzM ^6RI\k$V ( +] *'"fUJ   f* C7p58v iKN1k x x Oc k N  -y&;Hql&p !6   l\m) Enr0n+RI3 6.Dq1@ I*cTK> j!+`F ^MFq5>Yqp9. 3  K(DX  e; q  hW[lXH  :tFd N < 7 0 E J 05   "!f6- y=QX@dڶ8vJ۩9ޅW3G?q >SIy|RW"2+Sq:\)Fu0 UJ=0CXJyߑ! qk G}WFMX~z+l   h D  # i   kx  i  1  A  6 aU K \ M  "8+V_}b  '<|]! B k {7- jI L  S Doqs= *(OHl-$6zy/,g#Wrrf^2x`6d|A&83u>\Z}=F%[h>5?~5BN?$m<8r]?] Vh>.{f641W_MZc E qHa + :58cZe |0I  O K l (FnX{h01{~[j a e c  @ u K m l   (d  t 3 , " [ ]  %  N Y9 F>T^D^j"qv   a8;uAwm};/b\2>1;[qF?j>)vbs9-:b,W$E/y/WyR!l , m$b2\UI5~VA'>L?:$)$&oCGP=%=rkMI}b9  P&  x9   D M   |~O H$ ~EmQgnkK1 Yz8)>CUp '796461606=/5 .|3+0)-,`&($&$$%#'"(L!(^&:"U4t] P hM*|J*gL{l214,"8U^ 62/t;b?fݓoؤ,׽6ֳ#z|حxڍc#MRײ֩^j 3ba!dK5K)ݘ- 9&E-| N.*Bg7\EpzNSL/5P5xAQ|[ `J$L ' ~ Hc>* G# B o [ >#!j&*)+ *&|!A[L{Y7zz Hx)r"@ U&d%0 q  sS   JX9pw - lr 0i N x#(9v !$:r!P:(<"v{ޭoI!DlVOURD6k-{9ICM,9ZY)bK^#"w3A-{3`Ac[.hfsB+o e2}de&IT0-B-<? ;S!>M74: V  c .  n  #  CT h / v  It NS rk+i##%&2&G%#P Vt|  ZH(w q6mC W e 1  GxjJ?U   ;NuTS.)$laZ7$:b@KmIXKLiVea /?ٶؤש܂խۭ>t!(ޠV|)o]IvU8G u=Z}e il&-<OO3C`M6$;BOB$#i    - 8Ia  kpL  x } 9 ] ?hn>.!_>lf-4\RmT)v.@4CZ; K>{UMC ,>w9\0,wB2pc$v,Impj.wA#x!] "+ @Am  s < 4  Na '  ,8` 1f   z UY0Zf7C 3!R!&.S       J%7O]In=z;;6{z`$@2mVsH@LBN'\Vai.O2| k ytCjZ=H"My>qM;b7gz G    I "?X#AZ" 'AK!$Mp& (#('(w*[($-(.*/x,50\/11y2y34362819192B94;87f7^877R7582 9 /:-g</y>2@f7BB=:=9>m8D@K7Aw6sB6vA5?6<76 9}676 6756E5#53[21y..*+%Y'T"#B{sfSM\~Z  0  \ cH  A#) o ?O!$?^Q&Bu߷޳QgH,ߘk\K!hۧԸ`ҩ:$C+ٕSNrۉ6[ۼۡlޞߙS q,gLW]" e u|ZmmJGBXEnlor9 z>Fyqg y=I _{%  l  uW |p<LFOL`6ObbRw/tEKXd9 *N1ra-qkP>pQ .M(e=aH4Zq$P()z@ 0`wcݚ&h;eвڎܟsqޏCِsHfCpԐ#R׉E*Kv~qpRsUN9-K^bl+[46o>2C!&X %= Zbc {@W%p48@k` pm     ` A |c \ 622y(|hU[zQ ~ R  X%<x  S ,Cy0Nc Q$87yO;lL? '[cs : pE g a Y # b q } &  <Pyq eCu,e-%R ?HbjgG-` 9k)jh(}v{ukV?߹2h۳Үߠ4B IP`ܡM j FX vCCS {jJgT`{.sP4hZ|3)bz fAtJRa(/k4>7w4r a=CA  _` lTH:   s34(kh!zA/= - T .l  zR 8c O<X<(? "i0TOm %u}!NG## 4!! /apjW _ (s wd"# $K%$%6(6%)$d) $("'!'(J)\)C'j"cV\0!0##y. OLujH   JHFS&X"U lI s{; ) ~k! | 2~ C H  p  i rN  R+ {H# Af| + DKxw",^;.PHeI-Dsv(@KSj}]RrIG*vesqF{?xER~}6o|Tm(AbYD4 "  J Z Y  r t  L  KGY &V ^  ' WDz  B-4Ow+ W ~ J kqQj  ]+B E)"V"H" A!5 V!$'N *:!:+ "+",_#,m#d+")!&W#-n  !"qs#"2 !osYcUGf&DYg/  KK,V~`  ]8   ^   UDBeu0m*9U\P@TtRqtnv g#&Q@2xn#m >VL77 3r.,T۲4 Tqvݼӿ&݉ߥE[pNݨ$0zc&o:U{"WFAl;3Xchu0E6TX"\` Jf(+DLAmVMdo qi z qoxn`1D %yXt7j]3:A>NF p$~!J($*'+**+(C,r&+$*#(#<'%z&(''*))l-,1044A87:s:<3<\=u={=n>l=:?=?>?`>>t>v=>;>=9<8:66947363`646677c:9=;W@>A?CB@ABA@"AK?@X>@=?`=?h=>=x>H>>>Y=> <6>9<6:3T80"6\.l4-T3<.2%0232c6394<5K>N7>t8=9D;9!8845613ώyν̡ʿgLj^û+˾`xǺuӺĦ&ҽɷ\8'|]s!{Qȯ\jʭ䬀X#m_Vå2VC ߬촰HݮHAK*g˰M aίí6íkȭ6)b<>mȵvIx*ܽùòƳCŊI8hZsVϛ=V*ܯۼb JޣI3#iY$UPJakZ P > 9 &   ug)OJ O~Ex i=%%+ -43-+'x$2!A:[,|Ue o Q1"N!4yiu~&"o$< &#'%&&&$%"4$^ b##4$tU&'!($)q(*,+/,,!1h,1',+1+/I+^-+-+8-=)/'w0O&G0?%.o$0*#%#_! $~$L*%%&!?'#'8%'8''(')Y& (%Q&}%n$%a#&#'%(h(B)U+(-%'.$.N"+,- (T$r\E8 @!h!l"O?##)$]$m#a" h u    % ' +YzF~inp~*Y T RgvtUh*.O2m/s-adgfo$3^b_#C>.N25_3wo\lt45j ޲ݰBCի0sץܯߔo2sFUM l+H>[9?@>@߯`FG!1"7 ߥx߉@k #myJj>Brfr-ZXaqQ}tIIKk_ pf   fc H>6~rKD&V    hl5I 6b o  %   I     >5:sFVX{k(:9&t5  @vU  0k^, !#G#(~ )}$&?]  _] D S_ + YSJK=5Vw 7 v Ygg 3u \ Sg  o3YT;j @\pGg8{-b(&DqnUv[ zQ-'*]g.Yڟ17Qء#-*LN8MY:%@nߔ^:7'|6ߤs:6&;WK 9[XeZN|9&,[\(BbNvN|[CV-w1Jv-DGZR87\! W mc,3)[ %d8:5XN}1~)P>={0+n%P! $`'U(G-+2N/W526464441G4s."3+1i*0J*0n+0y-001225486:7u;8'<9|<,;<[<==>>q@?zB@DBFBHNCIBGADw@@>;=$8=5=5=7=9M=^<<=:I>*9=7K6d@7A7yB;9A:O@h=<$?u;?[:?E9[?87>6<5:5846b45F46)464C8V4894895 86 6738^2^715273a2/'2+0';.$d* v%&wqtyp,:wJ2v<  5>@WS'uq b-W Mc~sC$J5L>.* Pۧ)t۝XEߔۘz"ٰ@ڥCmoMѭ۱6ًکڢ՟%pyTv֝,ؿ֒SڢJ܉pؽ/҆ *_&Ӧф˳Q!_ɩǯV'~ lj6*6̞ʖz>Ӑ.԰өUф4}ְxCֆxѓBkX?Pdkbmdձ)}%`?T~QL2M֞pPۛپ#SKޡݚߋݰ}^ܐׯݞ ~r܆ UAJHbm(v3Gqu+h]5B;S>c}nh^t;KR88P]tNb?K &|;p%"ReqcT!/VU:Mek43 Is ]X3=K   " Oroo< ^ ):W{X#/}\L   / < h  D z  'z [ G  Y r =BpG}8ck #!fYc {;~,m=;3(^O n$%%8!xo~6u$h_+79H$v " } E  B>8 s Lo w   , # g"CXTR<i44%lLW)-}-z5#X0Be&nTftQ w;N~G>nۀ(h܍X"aO߷@މoܸuYIۃ۱E&VکنZyKE7Щ ̀ǃʜďɔNɨ_6EΛϙњnHn;"f9c 5cО҅20,S(_D|fK`Mؤ]hkFJ؀ ׁ՟jaѼ;W ѻLyһMbu^ڴكl۪݋ݶhbc# zݽ7@'&D8zQ8(w[fo@|}8 8Cf{'<`wN^6V@ t# p oZu WHqH%NC> "#"$&%*%,$-#d-a"+W!(!%!":# $!0&k&M& &% %_",&#!'x%(G' +x).,1/e5x285=;\9>T@?_A>AABrBFDB:EyCE*DEDEEHEFDQH%DPJCwLqCNCNfEMGLJ;J|MhIQPUJRMTPVTrVVUV,T*TQnP}OLwMYIKLrGLFgLGLHLJHLBLKMKgNJ N"KLzKNJKH+LF^L#GLH6MKJNVOORQ$VpS|X}TYTgYSWQTOLQM[N@MLMLkONRQPR;RSRS~RRUQiQPO OMNKN&JNH?OGOGPFO?FMEJDDC>B8@4>Q1 <09o1j7365565q8j6k969168;56444313i0f4p0J5163V6\464O543210m/a.F,A,(q*%>)m#(["){"+r#-$/^&`1'1")0*.**&*[%(&b$" l ~ax*BAi~ 2   ) 5  CUXB@s'yya{tKT5#fPkR[ow(?R+![h6iCMݳ(ܵېLX>cݿ)rN@vMm޿=O';KߨۆJU6t?ܯאHr9 ׼Wא1ѡ 2md؜%׊EՓ+fҷA9eјA9S\g̙;WMɖOԿǾNV@VRį?Ȭ˶OSxd_C@ڳ۱ܻؓ׳- :{HNjOܬe ݴgF.U1gg}߯ Zչ3!F[\ZD /4Q=Y'{r-}8T}.%yQKPx.Tu<w;`5 &@R`syL,Hksq_VA  C8O " M- s  \   { M&! Nc :& ,\% C,/EGpV o1J2#0$v76 B x+JiNNijWND}1?v^7]NLH(%_S]|ߦ[{ް]4K5"(6D&_/=#P]l jٰ-؃^ۜ6)` ,/c_tүρVΖCϱՐѷ؟*גrߩ0W׷ ּב]*ٝr ՕB$ޅ*ܸULHۍߥ݀&ޏ۾ TF6޶X܌ݸX܎.'ґ؊Nחz֚>)քo׿:ؠۢ$؅Y[bwִG^B֊ςV6׷JNӥٽ*vl. S߱ܢ܆x Q=޴hgKE Fy1$\Ow)39[ k}Joh59J[[Q3TW? @:i%u+Kg~3T;  # 1' X } ?j  Ij   O O~A@a 6 }: u * }  $ i W 8 v f<B!,e.# J -r;!%Wp(5)'#3!t@:4&/<frp%Ilg1r\     M E ;Q qr  <)T.}@{_74a.vD3G}.eXTQ}qy 7 P j Vbx ,  9 J ! 1 &;o   f  ] -   o {H*x rf7 :   r /7 M ?   src9 _   ^ Q} Y R=bh %  JG );  "EdQ!6"##$b#0$!!L-@TlY|%#!y%$#&%h%3%#$`"3#"!w!X Lm2 9 "&!$b"%#Y&$%%%M&#:&"%"$!#"O#$I#b'#Q*$,'&U.'.).+z-.-0.i305)37 58u687{8H77d7Q7778!98;D9<9=Y:<::;78:54:48a3473j533A4_204Z1303M0A30m2/1/F@ZD@A4@m?%?==<<;;<5:;9j;f9:8o978&664i5X2413%336393g<3Z=3;38V34"2.!0 *-%0+"~)!(s#)'+y-,3n-R6-5+.1)Q*'#>''(!*%y+),,3..K///h0/0F/0 ./,.?+T-m*5,$*+'*|+ *m+x)+](F*&(%-'I#$!4"8 2,Q{7V[),  YG  Hr  cO)"u4x a _ zyh|!$760 TS$BDC*r!dd,1m/$5ߞ/Qq޻;\6ߣ(ޕ֢!h(<-=ks3҉ѴGRՒ5ُ֩4ق1S|`ۛxL՝ܿ IڮKuώщ˲SRƳǽ>lO<Һ1 ~ѼBۿ+E‘CſGƒ4ϻa.f+RǺBdƿqA qH }ԽT%Lٹöճ80{1PŶ9yAIU'[_h ̶[<,}˷ B2u=8‰±—9ŁĽǮ>ǡDɚ̨Mq͸SF ҩ|רڻ@.ޑ%qTzdn&tŎw;)BƜԎ24؏3ۥ%ݺIVޝqYߔ|C,U De t'2[D ezsC$sZ`thLH'&:go.[n}f"%N'} z  0Gp 6 \mG 4 " R M 2 TQ  ;]fTZW ' 6 -  D ; x F shH!= \ # / t *_yf  & +:N < bBh ASR3d3trEO}y F\^## 44Y"&]y|]W 'ߴqQG VSh L`QXݬ۷c*,h-hp">mnnZ SSN= v{?۔߁֨ܬuܲ֘xpTW|~WD.[;'FKUt/ U`lnT$`k94_; )]jeMfm$UO 4 e M ndfe W  v t I["k$%y%W%|#""$&"%!#Y"J"8#)!a$&!%S"&<$&'G&' (&D)%*P%W*$*$Q)?$'#?&#Z$#}"# ($ $q %7"&M%'R)(-)1+C5-E7/726 4^4516j/7-U8i-8B.9'0928 5}827G88X8:8:9;:]=A!@CAEfCOGDHETI7FIEG.DDB+A?=c=&;;5:<;:q;<;?>;k>B;<+:996848z4:5;8=b<3?L@@5D_AGAIAVI AAF?@=9;3:0:1:96"<{<>BAGE/JIKKKMJNJgNWJ~MI9LHHKF8JDIC}ICIDI"2;*189116 23U314g015/4/2 /0F.-O-G,,f,9,-e,/,1l-f2-1-0H-.,,+*V+w)*q()'[(F(p'F)'*='+'",t(v+()(''U%x'#'"6(!R)H!* )5'$a ? B"     = [   ! =D N | ]- 2tsh_])  -: [   p  k KV X   XP(WFZ,rQ%G5v!".>x){O4:w&?dKAcGI 9>:)X q9E #uq&c~(.ah+vbr3lHPD1@pz &P-nBgLE>ASSh.?<1KN_1[\| g+T!TQ~4Kw DDob)ybm BhQI7"+z0)Jycj%:Rv~R!3yafiQ6c({?, /Z;U|sked)gOdYu. y*,R  !Z(l  ~ / : . % $ 0 fd   : D\ hK2\^2%7 %  (x[xC:Ok :yA]d;g6&I*"y@]y?C"ZckK Y TU[Z*(9[+k4")~O7}a== t q;?Y!4">!^ Oz1[a"rCS/l^a NH q zN  MJ(4Ot) Y^    ~n~pahNf9v +6$&,L'K&7a$ ;CC04 v  R ; B{   n >| j @ g? 8 y<x6-J5\c(i<n t  _+m0A)j11  v = i^t&c $   " B OJRE8   S \ > aHR > 1 '  _ ax[$1 .( ? T  r   Z~}a-[Izg`   U^ T9 t  N w G 5     A r X  m l f     ot<Oayk4%g:d m  ;lt;K 1j6 CU, @I   ]f  O|mN trEU 7U T% FdUWMp"b. m w  l  s LXc ,w m 4 o \plp& = > 9 / < v+*4-~&.t~"p"kYQK?Op( VuK_KGo7}HDIjX7NC]&RZ (bDO@^\hlV^7 ,}n}7gOs\;5ht3C!l~>)lOoz 02&d~H_T.pw(Iz7 ^tH-,^7HpsQ L)crWJ>kVT ~\PE:-~DR8uKnUJ!i"3l,8$V}mVvq?x|#uku,f yI{)`>KD/[h =2p^X8K1l#?BR;`;T{[s@OuCݎBW o/ ۫?Dߋݽ`@z?oaM_tl,u M2xRPJk>KBf|߼GAߢ'ݍJLֻװPֵ/'ӦԊQ=TBؐE 4Mv?2MҠ\*2ըD. ٨ ؒن]Iֵ\$ՀչQXqDp#mێP/|g>ӺՈОuj͝ӡϫ$ћEːveԍɛɇ˯ 6bh tJ̟5Œ ͛ךI>P( )e+= ̇Ԇgv~f%׮*ѤӓגPY{rNrRϏ9I΀CqͳJDp͟DϠJW̙шˌҏdn?KɹˤtBKJ7KӞJ/ѰyTЛӈ0(ΐΛ@g}ѬB/):N՛[Θ؍ $aۅT޿ދߝnDX^.)RH0 Es.nykJ1Wc oC׺;ՂD ҉ Ҍ?$X:aM[Ѱ;՞ڽk$ +\2;ٟ=pGICdM( P*PCF0L@Hh''_u Qb;K%@2 S~r$SjXb>8 q'YWrfj"Ox}) HO/QR^Z3{&}K S f`  .   568 *| w A2c|8~ * Y z   >  tLa?  Uh : 0 7<Fgtc = Jv !4 _w i sS< ;  ^ / ;  tuCC{9I]OLg  _ q d? ) ] e NG] q 3 IJ y q 7B 1(#9| 4p964 %359Fvr^k?CGHnm:T =  t q  SL G '  a '  \ 5 c <{` d A  kn% 8i` ^ }   k 73 ]o  z t% F2R_a4>281<B[g*'u*2o>O*?6j whuyg^b~npY8dOO%zLfVTWZv e(z .kQ.tgs(oIP$Y@L=ie(2~:61'}&FQz.Xa^Oc_l(QPIShNx!!8hRfK1UV)a3 n% ra[$%gh sLRP"2 u_RE2dNe_S     ^ D   b- LfZp7  5 0   ( ) q * F   0   i s ; Bc1!Wd>5{mbBVj x$ (O"+&#- #$,",) $OC3ra|"%c$')'D,U&X,A$<*"&"""#($,e%C %+$9#{" "+$ "&"($ *&+ *p-./11536/5;7565i5433u22R1109111,437W7;;*?@@Df@"G>G:E,7YBg4=281541k120O31:537698:Y9: 89E5 81w6.W5+4*o5~*6+8.Z;X3>r8^@[=AAAB@CN?A>@ ?@z@@;B1BC4DC=F!CGASI@kJA@BK@KAKBKVD.K$FJ4H,J/JImKI@KH[IBGFDkB{B?b@>N??v?IB@{EB2HBCICJ#CJAJ@I;?GG#>D`=KB=?%=@>==>>@>qA?B?{C? D?wD?D?E@(F@QF?AE!BD#C|AD>DD2=D0=6D>MB*?m?@<1@8?5>3=i2<1;1#;2z:394926p9@7{979x8989`99999897f9H684@837281819293:4\;5,D۾&ܾއg |Տ=f͚wi[#Y0Xfl,/*/j@݉ݒRݦ-ݬTܛ ݲ-C/.dVS?T@aV'_F Z5h4TM]v+V8VaM9y )[Ho=4Zf1r'8^{{%4HGFXotIGs2]@cLMf"!Bvdz] X@~ 0%M(,y+?QS8Xޗ=\׮mٴ݂߫n`iۑnRoߜNބPߴyjvRߏ6ݝ݆ڭס؅Hݳߡuc N x$tlX8=j6^Qxe+wRr;=N2PcZ+o~hD_*VcwYJ+vw#d^y{xFlJ[ \z_Fz)S  l `g | Q& ; #  V  5.X?O^j).fu5x-#dQ ? > whE   ,%}[nSDlx7![d#4_J .  tH'Ai{p7+VKp2!$"'%8*(?+*|*3+(*$)!'R%jF$q 6$Q"M%$'&*f)1.+14.D4X052683v6745]546382R:1#;/:k.39-6U-4-v1{.*/n/z-Z0,1,1-1S/a1~1 1930302000h/1I/3F16#5_99?AABHBBA@>>;:97/94[9^291c:"3v:6Z:3::>;B'>ESAsHDLJGKJFLL LON K:OINIFQLHCGm@B>/=&?= >@=B=C=B=NA=v?I==<<@=+B>C=DSA?A?*@>>&$9֯:>GN%a7Ȩ1#MϠӦ ئd*ݝ޺tކ^ݥۄBZۧrڼ !gwԲڳ֌fڃ<ٷlإ78֟҃ԌvԊёK֍ًܷؓrwk^ ݽ)S F:q 'zZg}hgW6c}g(6 omNWT8=!fqi8X\g  R n(~ ( ^ | D ? A  R : k ^H  ? O Zb$sY*>Xvrt+fcuy D"$$ N$^!#}"r"k#]!$ ]$ r$!r$H#[$$$%#%"V%! $ 2"bc+s 0 fa ) ! " #!m#"A#$b#'$*<%-"'/)0,G1(0020_4.4}-3+1/*/(.m(n,(J+)**a+\,G--r0.04^0{7&2H9*496$7^7 4706-05),"3+1*#/J*-U*L,*8++&*{,"),E(+')'"(q(&w)&*'G,)-,../ 1031c4244r4/53 61g6n060:523M4?260#8H/j8D.y7-5N.j4/3x13h3A44454:5434Z423#12/ 1./-,-*-A).(/)40)/*-l**/)?''#H$y!!6 ?B  5!!!!r"##%$ '&'&'A''''(')@(+(-(Z.(-&\+%'##k!+H @~|Q % +)!I+""+#)Q$&#.##!! dJqTA5(}%:TQ>>%[yT1MqE 3! ! F8a,sZ  c756h Q*@  ( $ Eb8   ( Xc80a@%F W{  tbv=HT#37o5`^d N p ; tGX&i q  'P<*`Pe w &< = v vQ<dl  j A ,C SP |}H QV29.8 x]qo[U =|o3:| c 6 @R} y  R !!nK V   L.1r.R\%b Bnn< h}v= y9A_Po e " 6 W l%7eqe7,Ww$-N9-_ [SaB0 "<\8>/&#l8fua@VE]\KZ&SllPT ?O%N5Cx^hF>VNQZB7JD;PV/=o>&j--=3(Qy+X@UZ$@oP-28-Zpl7d1B{"^\-y7'\o-Z.,Q={`Rb'3I`LD f8{sLmV^+5ZQFSDR/wx}>eP+Es 82Vu`~7D"-3N%'a8 sOhBY 6d u'DHB*ߡgߺ(ރ]٦]D ]t^tWk#~RH xEߊݺ޸,߄Xx}`R3X~VB4Gm߳FPf> D^?Jkr6ܠf ڨݣ=ݙ xV _-_L,sw,hJ83d$-E;)d,#W׍كLLjM@hP ZP\;~"m5_~nV.1"87=:MUC5[,lr\)E(N/  Yw6 dX:vv[)!Scc." .   E  (r9 A 3 v ^ = R : n r  xC Q t M   m * A0qy2vX} < =[   Q2 + j M + C r @    ou   I c [ R A0$y5L&S}b%\?pU:\Xm{~@!D~|3   B 4K.Q&10 " .wAmxG "!"]"K"!{ KJHOV1>1   { wvq50 M  9`2N07b)TwhD GYJ?{$ ~ l  $/ "  E< :+ _ /;NT1' [ H!YL@q):]px\ # M! Y|b"X\N{"pyP"U /mGFAU9a5+6In2U^AU#U)U9 TtfJMCk4 3!]dJ ppe $   ` M  ?sC{7XCr~Z7V'9hb1S`a1JzZ_nEa, jxtVIG-  H 4!g-&R^%Cw5jOB#S* p{YuMu,a65>k {jnMvT^AQ,;.IGe7MvFH7Qh@/yE0}5&gp*]]h;|F3lz93 iM!ECI p  Y8  G b C z>  J -" 1T pYpi H(   A  V * (m1cC -(  E  +  F n  b w  ` <. &+ y|F J    t y H  l 4 d q ' & b W 5 M8   OCSj  p }'DUxz 1  5#;$qu4F&N<{ARAT,)EQe> `! n=neU?,%P5:U5Hs?8XRt~jB7M PSH2b*w.NP Oz yY O zn. %1!Bh\rnpsou@?}39/PQFvf3#+v~$:RSgnP``PZI.-*Z:!UtMj[AKFq=@U26;iLPi2<'UR2 . l  V  }?t  /m   w7 J 8  X   ? x l ]WlH 7b 6td7|ZDu`9MuQ5'[f4KZ$ 4H/-:REe^JkB6  Z "r_0-PN= c/Y_#:G!HL|Iw&+l=YgU1"m!x P@MImZAI5(1 /|OsuVb3O?UQ"A #{*/B@]*K7/xP`i zUߪf߶&&ۃ:u W13fw.DK{Kj W]yo3/MZX:\M=1:Tzߪ7 %~RNx,Ucid/k(tK4w7Q5G9',>Bu" NUo}-]1BV/Q&2fH i.BXH xB ~G1(YTWD  '1  9~ & q*l3 & ? 8C)wWQ7%u4  r  O ) o5 o  ^+jGM%[L|'F /= Asg  c  M p |+  )  8 n   2 6F ^w  v  ou   9S:k08R z V  K>` CK  z )L RZ@r_JoY j  xRFF/9wm;*GJ erG}@E~X ' @nwKq/P@$ | b - Q K  k Y=#[ 3l % C@U[Y`Jy /K % j L  j  g!Qxl_ a @ O J Cg/|& - OnxA  P j v E a ^fe1z,$dp? gVTx(}q4MN Xq#g,#f&3i+5PmQ6%2Qv0}rO^r$44mv& Qij!_g'=wl5%4|W@b3ۂ0ڛUgیES)= sެ2J`0crW5O_>]u 3ݍL mVi8ߡߠyݐ0Ԧ܀]bRեD [9nٖ}аחozM`;$jma %2"H2N\24*?CyOPXL3=uܠs,Qsh3~߷Gn'S40$u`tnc 7=LCTy` WwF'yL x 5bP } r3`byHL'',%qs:#[o_2_d\ZjVE & _nj1qj@  `f  vqRyjk/c+T)b1iWN=!y oB W O > s D\  X ZP  } G > -, @ n i0 '  -  c  Q  @ jl HL  A 1B ; q U $ _   vCSg M q ~0< ?  tYc V"]tl7q#9Hg-9;$hw AY\XY_ZC @ Z- \  (P  :  y y/mU@8  P~EuKN<^^Yq O 7.5 |   y-t+m8kD R   O 7 !2<~P8oC>AGY.0:%F7dK: PR+ h Hh b , 2 5xb_ 9 % ' ':_"C Y j!y UY "_h&<5~@vb)   > Ed2y6>h1 s: %  Z q +b SG P ^  tf | f >  \_9k4=  -  )   }{   4   `    4| \9DQ)tI!5Cl 8 e ; U+tdQ-n = q r5 k  ~G/g\tK6=)69OxhJG$/UkVNQ#lJn(>$7 ,K^zLi!j@O@ݟ;ܫaߕ :^{-av];V RlND 8!h, :?xOyvI wM1݌u(Qa_S,%?Cn8צ =VݍD12QvA>B@ ~ 8)z ^v)N5c# {;e\.'b߰ߺݿrSޚ޹bs|Wc6Yݫ޴Tj|6Cz!PmCU-|C  :}5FTa\LjP4xW}0\=SX)X y~?YppjD4<0HwvPCt W(!<P1MUc f;t%Z!|- -S+P< _ dI22sc!0!x@yfN8_VX`4#NrqTItszo;m PfVFl%I4Nfr:P)I,*#9{:+\q*` # >    E ^ = .d ==E1 , h o 0 3 \ 7[xd<5*Z\   6R]+$X*I|n,vS[!WzOwh t~ 9 D "H "#/" J a 3 pd ]F_*/LZx.}@]|,ir!h#Pj"Eds0~5($!!#3%)$'# )"(!I' -$< [\ cR!"&"@! A!F !P KeFpPe:J4(   + t!$c&!!:(#@)%U) 'm((&)#)v (n&Z#F )z [#r$m%7\%7%H% %d!%"%S$%_%%%$"&#%"+% $""!=3Ym[W$b] -f!R!v M^<R Q!\!! c! a!D #m $.!%-"7&"(&#n%x"4$?!"i! X !#!#"$W$/#%!5&Ok%"b %GS2V!8%"D\! 0j-[  \ / 'V\c@ # n?mEw7!RY-  F^V ZQ;  _ +   i v% -O;H9~Oeya'  u P }  O  >!V'C"J0^zI;C86]FLVm O$y\!J p5cW}(XG DEsa\@H5jcny9IfRvidHz$6k;7sMTs N%nN?{R9$h>f`Ai{HN? O[7z.,k?xF sQ2l yL'<) D   LS  (h`   c -q  r ,ZbL?7Vituwg/kSj t , a\R  5& q    +z-};(-~ 48GZ  (   - x  ze)  E  Y q  F[1<7"pipW   _ I  B  T '.- 9#<#e JXXv 1 m $$   s  W[  T m  Y k .T v =| K i - n mCf3 p - Z ",  M iS  RNTH t  + yU/gHT`:^DgS T^vn #P 3= gIo d ) [ o :?   l Ic3Yz W;I<%j(?~h7xmvyiX g v 5 a 'l  Q \  x m  P  {U D c4fj/S 5 @x4CydRHh~   Ym mL6 Se P 1= H  0L 2CR5}@OOza|5  x atB ;]Z  \ ! 0X   +M     ? `#\d p:`4ZRB0%H^J'q#| o e# /V j16s y s <dCaR%>B] [  F$   DA?4g]  hM E;vUD  SH Mj i K{8PO,h]N5ZuG)S;10yRkQIZS#9/=sBaK "v8&D%Qs|o. -hw?.hf~ kD!E7""a0g&r )<]T]$>SXU980JW%gd{mF#;QOX"hn,0os6b}M.}l+EtQDG bi"+[J$#j!mx!&W;,1Sxeq#'Q~*um,Z@qB 6}X_XiHx~ i@"d0}HNp/0tr U62^j SWfo't L ? B7U ML t @ c   3 )I2bRfC* ezGXl C   h ^s |!SM Xn' }<? : *f  `   E *, F~{gpdF<!JR  # )  t v>=  A]t> , # d  n  ` R  o  -  w-5V0X l * N   <2H9 \r < Qy+0l 8\  6XEX y .   p" <  X n f { 4 d  1c{> " g"N1l k 1 e   e / > P  vD&_#=, o 8  Q  X '6J mf&    P X td 6s r" g#   N  >P4I,jp4fh)0Wk* F\ H Q%(K  e {  ( ' | q/fU_0tU_2GuT~`_lFndBcHG,P?]D3  z   *     U \[Qc>Jc Y  } U )NBP8V <  > 3   @r 4m " 9   ;  K I -|xh jt'2,jbQ 87E#1  9 #  '  RHm]   \ e {  , W[\ J  lGq #Q$,sb1]9O x  V sCE [dzo  i 7 d n > m F  *1 W  W {Yd^~"{;(] 0 Z=Kn%e&z*L|+0a@E<-X{< Ly 7p3GVN>L!Szd~t\pC-. E QMlDcF?sC7R E/~yGr|gUf*#%S;ml yC ! T9 $ix_4 EK v+UO ڵB%7U?MPf0ޮߨB%yxcr9mb}x4c \j3uB/+,dVB4 \xx2*&tyzt 3~*lNh!'xAGQwz:r({R&Y2Gl& o<  {MK7 PsWpTr+V]m>"BIZ=So9R]Z\u,7=|&Qv__$A}h<z <O2I`>t88`U `}dma92 MC(. B^XHKhOmj>mn^1Gm3G D ' p @Z}u|D`T|1m^#E$@} t&herGc  ^yc C f97$Nny9Vya9  ! %g_ N+;. = & f  R  0 / \  wa!eW1V3+|WDfcU% q A#82  QdnpO+s?,y  H q   7 { kT+c 9Q /s D/! S i?HI-] L     \ Pxd4b5aP /   DW zf  v uVh A { Bk j$5  p   ra +0Rd-QnxY8>   t @ , 4 n '-F+}b{7K  7$  J  a    4/& I [S (s`( \ ` L F8H&  k & d 7 ; } #KT)3\ir8 L_*sXJ'B@ o e T < " NKk   |=  W3dhPYh Y$o~Tn5glHeTs ; BD 5 ' E\  < T 4 _  c Q =jpCOR Lv  ! Y [^~8)6 .> U#~lp!  b C  PBI0|^Pd e4VHNXvMc6jr&:=1 &=>QY?B|aCa\5T` "3sC].0m jF.\_F9uWtn:uqo O 4qm|T/QF=swZI$\;ۊ,k܎PZlrE `f ~[jZc-Nrl]~& KF3vRi*[*)*Q%)N+On>[k4hY~{!IK~tje&cl[axxioK)u1dhDH&S: 5=%.YM @]'/TKwN pF1=c"@sb+\db+)^f[j q:FcwXmJHJk($ A]fkrUSK 'Aq] 92)u4z_,- som + V m`.8]WWj{*60}'+hKpE#>[Q/nPG*]JyC mZ}' 1J_jREUMz$9t )75Sr}}emC;V? qNRaL 5 |   U Av   -D>7b_j&PY6N!r-T:5LB}   8 \E`KV*; %r [ R    % d Ow4g ,c x]g   x i X m  0I E* ~ G` R )  FI2 ~Bvv i"$ 0% a#$ 1,`ZA|vL<P7k ! m@Q7=.02gZ?i^/eu z9o]=e|X7R\WS V 0 } `?:  2  9q[Qt%l  :  P  w\ i[ gss/Q=U 7 r G   g  OGe]<I O N '  [ &F+$IHb+ \>UVJ V ( { z `v h   Y e#uVhmZ{xy RC% + 7e f ^4\ s |   XA K  ls _r+@9N:bO2h[[9#5nDNWqMM] oQB5;fZ |vK8&W"7Dn{~j P08KhI}7 Q7L"2AjFm7rRx9$/1F!A.FQGhgcMyU5QsmCHsK p%lmiX>{n%^XpU-rLeHC+wlAF tz{T\XFfg K%Hl/!!rrKT.}uabi%-k7%*M sFC`W2m>h9>r+kZd HOFmT=yxV5Hl޴iPRN=R G6&|YW^rDuNr4IOa kBYZv=h%;x v1E@x_yk$74Q{YDX~ H_h 'XM!l m. 8 Z I!Ya2H 6 Ee8F|Yz\  8 c D Y g v ( F, [ p aF    6   siK 52Z ] G iX3@lk=]D&  A K z q  h @9 r_ K   ! ^ 7m   c XF  0 5  <F d p j^  O o 7 =f |m"mYqB[dn )G W7MpEQMIYVA`v5hp~  ^ = FW,uZ>uC e B T9 $?oOixF 0s&6}Xa5o_u\=Q Iu]5 &22[[(^rJxj_7MMpi}{Aޮߢߔ.@&m;QiݿM] Dޞ>F .Y? Zj.E9}6>K18~.\Bڋ 30qݓ:NIޣo )Kא.S1m޷LLߥi?2P37Yk '4PernFTAaCua6#b_1AZ+V*rxnKc)~|.t/}0b6?5fZR"L;Yta k\{\s7n]q+HO_iJm=]zf"VK]f$;}\H|InvL vOX~X6ru3,d4H >#uecmI 'd1qFy72gr&Meu ZL\w"v{%YUa>~#+vBd|g-X8 k)WNh4?YxPlE%mj%yww2,m]Am["G):pY1\/9O.Z" U - z  & - R '  (7  !8%&K%1v!T}__{=I bB"A341K;;  l fmy 6  E  NT!iT  3 `ko]bVFm , M Q * n t >+ |: @<gaZ  ZA3 I Dx w]_y9sVFF@dx. | Tzk   6 < s   Grm' Z   oICr )XkE^.n#h"$& &%#{!nt qC7 5* QwL F P Qu Jl2jnA?)'Dokmv45"=6FW#N3f"g$I%$"4pZr Z     a \ TZb>* 3z<h5>sn  k h e V~`.@ | o*g 2_ lo : n-7.-Z  %n{h~qJz;O Dx  mw t kq I 1 ? .y -5  W}&co T + n S :YUI#xNy[!f&#J>Y!~T B d f !`0]+ cg'{2USnwk0gLs'M#4MX]p,%]]Uh |47:dJq8knd[gXKigyR_5& 1{kCnQD+d+Ib;%+xM I' 0K !kZcjmo {>`u ڊemJ amvjZA+ a(l =#5f 'oY7;tz& ݞ[\yl2/~^xAWx?;kEK0X<@#"(e8r)~ [A19X\4i;*yhPXQ*Y( $Gq == |oCs|!>Wv3 b.J"S)f)WyvRverHu6t~QXTK$nec  ' eHsv>W#?S'e\?QSZ^Z2@*#I8xQxj<P-Xr,5mSJ #Q=aTE9/&@P7 lk [tH(DBqCsh{78Bl&ihAn   | Rnz LKw+M]1\Dg{ [4I1iQHTwO0o0%qLkFx.Zpi }Uu0hgJfgm! HVeL !eI/L  A oq - % VAQbN3+ (*Z}bT[ ^ 69;>m=@TG"4}hd[(S` ]A %p{G:{n^)>W9&3'N`,PJy49]lsjm)~o&4 K @BeV4/o< rRUm%6'tOgzFXB",l7Ii(hmHiw$ Dk +(89D"+(pzO}I { Z H E 2 ;  K "kr$Y58j nsz M.L**x 9 Y%=-0 66/ ) 0 so/ i' wP ';.A,U,EK>.^a[Ru D  $  jFaR,= P 1rv_c J <y-s9 . Q r      ( =mA6H  $ |~TbiUi  K A Q L$+rDS{y{<oKDXy , v {d4h   c  a ! : w  O?[[?~T/rzw5P(t<]tW 2!uNm/!S1 $~ [!L 2J &'oo*e%>fpy)eS;p< m$zjxOopi{K><j:,^lAJ0 ?   ( jOG"MpyAvS"q]j3C C 1 $s:f;:<w ] ;  Q I l&R xP  ~5XBAyl3lFyFPhsL"]fG  5 Yr~O o q B > [<so (33]-j^4@TP5   5 WXfM^Gx5@ 1DKGFD;*  I ( v i q R <xV  R  Z +wcttzILL@'d3*y.g+(i8"obYf}#x 'Ya  d  | fl?j ? x'4JuUMFlkZM "9yBR C \u~H23B_Ui4_c 7@X#`KW"P 4yv!eZyyb{L1}If# el+X6qQ \x6A+l.64<%u#2,qltloJ54KlZ5Y&(X$ V}L A?a[-$Yp,CH(x?s) u;GY;`&ZF/WA}JCn$UI/ 4bD < ;* Q}z.Da\kbx=$hfZAp*T-uS$W8@xD@E%eFUnZ$bO_ ?  ?N |`&;ae"8EA8sG8    ncA:iGB .Fr,\qt)+!  Wc i  VLf7 C VnC _iaVtb EQ j q7^V`P)9cvNETeOGRN+ FW:A Y\Fo{& H6>ovPNEbHfz=rg b V1 i,o11>c{3// H2  qx G=  9 6  6  Y2S!T] {   W  N  wr T u]5*_   UDa [ \1   1 + e \  | &   '   OVO   0' X S  7u{K#  Aza8[[ - Z 0 b *lu2TwS j 9 O {    q4}=!8 n m  Q XNUy^'5koM 6? K'9({ {  F t s@ j R X H[Ee}2!Pe7 y  YT Dy^ xzbY [ E 9C : q% sq@g1   ! ) 2n B(Vd~I&eH C09`\ $Q  { a2Cv!bBNV6Q"\pwr |=a0*U12 2jgdQG?%IP,mCGo vPrBc7. /h!mB'a|RvJB~0l`[S .fOvMnc;Zq" ,@b&7 K5 aNAz:&w- 4gmYt]ul9O>Z;PE-Cv3QB<kogx>7yR92u([xe*FA^1b9BL4 Z]D6pVd"3e%)#OsV WKiH_aJlzjW),OYU} tHigv-M&F|' "`R7@g. aR0Seq#SIE H57BeD & zb.>=o`B6l o zWt F{d:/ v p ! ~l 1 j0p1 r  h ]  PQ[,\C" [  ]M B/  L  I Z % A !  R}4C ' . M   pl 5  ,XK C*OQnf^6Eg - L (u]< 0 PFD ;i{mG w^ ` uI 4  K  >  n > D {e `' 'H cb2T`?YiUp; `w Q~ s _  @ :    $Q  oE s 5o 1 6vQ    CxK`l     51 V39%n = 6o w Hx {  6 # t 9 }< (U 3  Q |;Z: F\F"\n^f\%4      _ld: Yi`Q 1t AcJtj1W?$0._c%7o}M89+*~w u ^ 8p {>pf! .Ui:t54gT8IC N%-|UNo ,,  * 5  cX ZeL9A;WA5q-/'HZJm( g. V%|d:+> a Q +6,iH +  +d ty(J((5 b!= MY&W, /:Jqa~.x"Ojl#'sG/(*da eV K| 60+ =z=,$n=q74m(\bPC[CJkO``uzSs"U 8PotVGGN8Bi6RNy1gXdWHw7  > vG f vDvuGH}YC{6'/rA{9E.gC)lc FX\=Rv%GV ?x1I$3J(]xK9VoW4F[dWdP@F`esaon0aLEG*tq4Mw,bK} `  j FDmjYd)`86W,:g"-N ;N> oYi.}*S+ 4M.hDe[4781> |K>SS%.:1unEh dOsQ&JncR3)`v_XkyZjK2pNLYvaEov`_xN^74f<E40@H{/""*n\L . E Zas ~46SGvoN v`&]{vA]9 9   C  ujACfW0RRQ]/DB0.,[+]V:M\$d qk1u{};8E5MS o>fcz&Wt*+82I"ShI@irbc$M8MF DtO[1l1tA< B t /a F u  % F  . &\  X- #%\]qy7 {  7 q =[?FY=A R M xN1K  g1. : hR 7>  Ep cX 2 :Sqn   -  0f ^ ,o] [ @  d+  u p a t'[v%<LS 8 qF w h KB fH XNZB  < IGR) 4YCK {_F E  j t SR;i@^z %$K 6  a M$ a ^  z, ; }\Xgss[\ Yb AP_" U i  0 C zG a?#otopmzra\T{T,o* V mj \ 7 } R F 7&{ {kO!JtzaR}7x,Eg 6pc q^ A G xfl##L.ZU `iRJ=W{ Wc}deJ&q~Izxn1%81nRHc 4EYH6e-a` $ Nqt  -!|IqH/MaHI[0on (MX&C<>wpH 6   X"  b - + = ]  QEiL|E|Tp}963*0.965#=M*`5FrKC op>/6tw  ' c q sWn- ]m ]v'0_/ap?>{=!JwK; UoI    L S I5,hYdyE p  |,GC2+ ^u9}b^R6Geuh-)yhXynJGtgPN!'# i i OR tTN/j_"E6O_,Qh:9B 3p,Q^!}B>}2]4 0b:B b"I* FW *i2Z%J.?%[&6hnb%]"xC?4H+-E?Sl`]x V,FVHoC$N>xy N+a{ >q xQh{Ch5|< @ |K!kU<0.Co_: LwT1 =2iF^SfZw Jd8z u*a{">lmK_@mb}yi;L t  O& v bd 9 q  J80qbnri W b `7aYu^x , |7] ! 0   b  _ [ 'ijvZ$oJuu W M k  |.p}\)e c0k i*0 ${OyiNyW|0$lc< *  ? j :=brOHEBso e z ` `O,w\L;an # _ o$ a|6O.. w'W  M r;  $$j U * 8w = H,  rf@8 %   0 D |b  k c c w KJk7Q M [ L]bpf  Z2(  ZnHHL-(@ Nv% a c- _d  %  x !]+Sm!MylFHfLy.xy$! @ RS_Fe g mt5? pi . m\ij0A&<bA!J)zhW:G @ 2ldyw#0u4 6  [  Jf  $C-A":{\Q)a##c- ?{Y>2DAM[Ntqb-G5^7~0#+ymFQh ntoS 'LKKp3|)}*hH0^{2g $DV38tyK?\nd6GcuMmR#>&v2ytc6#Bf+ArOJaD *-L roi( $Z-'%v[UX\l)~>i@T$66AR2A%(zuQ{8+wWCh27Z0_9 .!& Oj*O}R82rS~;2hbHHU)< %=2pE#2y9 dM q9 A[dho7UI.<h  5   8U>]A^/|U V on T B y >   V/@  9v 5 x $ D5ev&[122s D G(@4 R y z9G}/ ; H | W [  e% s YTrC ah (P Pdo, q+*C $ Og *x4N  t7 |F \ @   P   v` 1  Z u 0tkjkF.W^Ecbg R#.8C>t?& ,p - _  A 5^<u9N=Ia n  5  ? zBw.3GoA d "O2p|]0koWpda"$\/'\ h ^ #`.u;Vq}p $ n(jQa    ^u[qTxP}uCE~lP?)$NL JT  =v u$|:\ k U rT 57dq[o.QMnYt/q^  pp ]J!=;uoc / ?K'F  {] `4 N hW_/- ':p|QUC3`xs*v5fa _P{GN@{__fM6^U9 -T~b P qSgv$'~pm}Bt3"f!VfuWrFnwCb6puV=/N. 5 r+Zl xjdC}R ~Nq}?%I+h%A,NcF\l%d/1k@a4g#51]@W|; [!ds2%Boe1Nj9'830UtAArrfsi704 P4bm/0SXix=$+F4$%jyYZi M&e/r8XqcU?mZ8pP6n `jIK|U."L6l+ZgLdse;.6zXO$EkH& k@OxD}fJ uq-HH;Fl $v  j I <  Va W1 8K8 xC;W< k^U@y`]'  ! l ^- _D "  e  \   k b  h    5$K Q@ ]6 td4u-j{bT_   , : s ) ~F fS ?% *sM&>28pu PI -I1=O1 z     / m ~ : F ) Ui U   T  7FG1+ )F5}H/IF/S(| G Y H0oQm  4S?* x @ 3 bUy` ? ; {gA#o p[ 5 Z)[  B ' i ] G4b# I   :&&f%v <   O k(G=# 5Vb_  j $ [ +' =@jKSW|#U7-LP%o\}2A#1   D> [D |X/ a3Y .  W T  *  g ^  n L A b>PD?ZnY/~Y 8{$FvP*ZJ&tsak2JI{Yil~0  d[h JS 0ztES+Qv J2MVEI)"bDYaVl]'^ W , fx HS;iv g6BFd 9J&>M,^XTwo=uIC?u=7lu]L)cty Rd-ayx?=BX}kqSePI1I&>hI,|qyhY&1$V;$nZs:(H jeQ.C|uN&D[= *"05ti 6-"Q6j7|C X { 2 n'0&tH3%|#jl'.8[D@eLV$,A5$*B:$f'&B ]"Q$K`  5  6  ' @ ` I 'y' ,2}PF 8j 3ei| ?Dvh`UJX [  G p  2  E # 1 i  U X,*{aV A:  TeU 0  <~ [O GC7EG . S  _8 L -@  y 6 d   b  ]wX gpGDi>t cW  ~bK`8 A w C  #   n"m#ZCpN1  !7 >q ] m h~%k/*O5 | - . j4fTRy nbOHw;  m  i  )  A ] =   ~rX IV @  `Pi  ^  _ ' "  H <x P  U1G 5x 1r \D9J1\ x3 <87bGt2<  FF =Qw V~we }  ]D ^  6Y &UkC >c?"cg@qf;cJG^/`U  W CD77}Pnk^`IE_FAn@){<@.:!/~hR <{T"H ;EBXRN\zLxZ(G? #Pw:=bOcl@C N} U?9@$00I *)T\eS mruBdyu;i[Lu Z"st@tUc@5!O+>MK~wLbqilV]x]tx@/ 7> U ZEsB=r[CaM$*Eik#k5=I651O|VbB_>m"%FCa51eyEt"8[cc-q344gW&hErH  , + k8U{A |ri%:k/- {a! .$4K9f^:f2bP\#w MA > 7LlV f2 F"  e V X Fu;eL3IAdK0n,4!dYcf 8  \ SYX < 6 k E K%R@aIbE  . A JfyP Xt  a T.N 1f&0O  bb^@R{ZV Bpq0P; ^rjI;@ 8 bKXNu Pe ubp =  k Yp } [$ h:  S  6#  >E)TW]K- 6Wg WI?<yc  7 / &Wfw<  AA=#  x $t>2  us\5A E > F V S ' Z FE\  ! }?\D62] `Ma[.P!%9 co8VR9OJ$V i 95  [ \ ^  i  ].9CDTIM8Q x|(PQ^9>2Ne6FH1e Nm    YCx]X{0<=4L9H+ecCqf[{ Oh"RLgnfqMx4M_V[TsH2UM]Tfqs1KnrvUA HpuhR&m lt.RpCo;ku})5X7lJ8_P~QU :N42FyQ BAbKs;tuG3]H7 :Io&nk,"Dt,)t@:=YM8eI1Obv0]P6% Y&4 x k < ,yQ>\ 7 KNFbxIPy V k&g H&>O#aO0  D{X cE  & , cFCZb@#\B`woV r[ F| 1 m r8 X!< n W  a t )Xm I P  \ Y   @N?LCs'  p ?  o 0~8u( /" *1 ` Y7 y  J^!& k9 M6Jj d 8 WkWdxwl ( l   W x t h [ G O{CkB? #-2i U]`  Td5F Te lR? 2v?H' qg a tw~b ? , p; ] | Zh\?Q5  uI + s X Q w  /y8K (  wBj 2a+ ( )R c1-.F E0 < { .)):'\tr, }   t$ =y/aEJjf 's 8 J ~s `  k EN2@DM0U-pp(HpZV6N Kt,d{F5'#lFASR9>J ( ( bx _pO4~&i_ \ (kG"3?@i, SW50Yw`0Qq~$2l:u ;/F^.H\WPD,Zhr+2]:(E];Z&86}!, m|f {X vrR@PU7R< D(OoQ+?70y -zW%@F5gal| ca8KS q38`pTJA-hZ!,dHT=Vo>ajn` _hd3>K[V{1">YsB UDK.j6 H#wH)1Ffv  G%&$kdO9)cbN&"SI,2YQ44>FpS?\O]4Jm@Ew}`H}1DgQyu  'N @  = 9L <,XO ~ G~kiHNJ, 7P '?  y,mte Ig | :   t5 w  r ( P hR"_[ Nzy8$HCSJ~j 4*KKZZc= *RR o  U   y>qD"( #SED'D^ T eW SIUxjcO*,vW  JcY$F  EX qSggl.\RO'*&W]WQo n} DG{R[!N%.=(&aM4iy P ?m | {2!X1 }2Gd 8_'RWh1|`~A KREd  + ,l3< * L jt @vk$7QYIC 0}Q0 _gb-+vOj*pZ}  3  Z : D f <  Pr+ZC;ntCYo:  9, +KJrj pB53|qX,(=EeqNO[$Hj9 $xS(< \Zb {* +$R^O&(r97/)s T!wo ~^d Z_L3g^UzC/jZ%mL]LFn)TZLhro/eId| 6u  f[XJ FBX~f)nnFOo|SAm[Hp[AFQFYm9M? 2&]Qa3_: !V5)nI hoKF}J4e g^3)~N|F6t#~KH`P1 QEuJU % j X[0C;fC)(X 3Y@  l  $ a f {;)?# SC;?  2  tL4`  0 Z N ~ p6 ` UYq?= 5t3 ( Ka  [fc:  ^87K.mQ\^   ] O  $ m  "VdN 9:j\[{83-Op }n u( _K  ;  C#]+Q n # lz  U6 z  6 ;  y{/Cc3I  R "  3i q{< ,, ] * 3y ] < T 3 =1~8 ar6  =%jk ! %u4J WM6 A 3' 8= UC#q <' o tD U  (lM8 _ y (E 1 @ 'K O { ;4nq~f)l. Y / :be~UJ K#E/cR`tt f : _Xl.9  2(   S GM\:  A  yPfQiwZU=%4?  w s?R8 [ 1-: Z c %0. ;z* MC u N}l 9HOr:k;*N{"@/o`s1O Q B;LNz   & NV_ = c K_]  < &E s2 Jq  _^9=lu2w8]XSl' m ?v{ ZY n ! d NXCjWFg b}P*~b6 ' }  Y k2 S L  3EopG^)y Y5qKok0Tn; I S) ly Q : f  N z2\ mM<8QFd&{>*Rj&7<83Vo   gPA@3 Z{+ *)%\ aH@f T  @ P1 5*z_rM*Ppj_FKbDPd<, {.E _M  zTj xtN D. 5){Q* # # '06* RTG4wwj.\p? Od&`q!_Y ' uc -"H*R}UB B`M 0L   ^ ?u).o C5S?4Ga:N|1  Ir bsc g 3  ~G- v   D C  C r  O  \ P<@x]a#GJ OHTn 3 |"s . =  22 jk > f s   !  Fp, Vf Jy=BoKpt@~+-v,fw %:R #p  } ' Z    H ; * z [ . o  1J  A+D*ZEv'`{~F o 7 _6 ?B@Qq05k - <U  7.1 9   d | ! [6I !44mZ@"3M4|X?Z[ p G LD  Gi @ `1 p u I8h8F<=#Kku-uv? F 2 [ /Ly{1B((n7  zE  urzyL g ZD  lA{i,2KZ>'&Cylbh/af! iO 3-t,|O  gi 1 4 c T |_ \6s wI|%HoxA2R`0p  CG| ?'Su*oOd~mE)VBuZ-;%1h$uz4 qs/ igG,w7|&u;j4D"LUp52{ToWL :@D5`+r< /4Nv 2S.#&, t h: oQA)(v6*vrv<,/X(D)UC1*`IL=yQ,j\&2(!z -tx6S x ~  9u[1Bn10r7LNB6^c/0pE=bZzz@   t 2 f7vI> +@R K 8 G ng]jL*;,#(AA x' !hvH^CT @ m1D x K 14~#d  w k g b ' : Utc,VX?I 9ZM2Z*@4*C_E44")~Ns-( Y D   cV8f5K"O@,m!^3C7!+E&p.of j   N ( v Q zRQ:G|'D8} KB t 0 L K- 3S ;_ #o N9?PRzZUzA!=H,0 Q F ~ dEml\ # 1  / b  Q  h    s|42  6 = _% i9lU1uS  ;^ f tI  +DD9SZ W P1$ r q 3 d 9 ' _ **b}  ! a }]m !"'ZA:`\]2B>V^yO_2!}1 t  VoZS>9B2P|O c*T<,2D0;J@wy|=Ee`   ow fFG$AJ?HYN9htvwR$g9zRdU@S7:wNj@U* f KD'>; 3/ }a(G%,R[`NI<4"XY4Z{5 lsM  9 0 &bx_I. ^ N  a0C:Kalf=3qV _CPJt%<om-qbcBnS(|Bz-n:d   5a s=XDR\I"7VLjLf`3*at\=h/$I iE_C\id'm+w%3}pE6^\! *-7;pTcGK/|HwL0N5-sqR  6fL.[ px7-SJ5#/_sS'l_/Z ey;Yu?T\  A S4  b [ FB j  c g9q jx>W?>,hfng.:uN J , D 3 %Rqnu!f0>A K ]y /   gud8 ,y  K  sk@m7]6(x;Kh  ]5 { _ H Mzr+* # 9    ' X 4 rg t :- u9aiSrOH_^`|"mE'xWo# 8  X ;- { i lu U  ( ; A  C }  xHlP"6v  P RT` -nxKh| Ab J  u +T mi  T L a l k M_|`  n K  i5AA 1LT>wqOXO3EM  E -] n_Fr4 $   O X 2  _E t V +  _o  z,}+ 6M  / ICN  f{ Y,H b | i? t   8p mdlK_}+Nk92tv)d54V<W'veU~5$z  u8 _ gQ % d-g;A|W1^;#]I16^/?b7cE'?R,To."cGXq|Tm7d^[9|)O-S=4p$K78U d _ 5[x3v?#^|}CZ l?IV;4Yxgtqy lHW]s!D|x_*F /tSX9ZQZiJr=< 4 #]|-"o8-"9_#2h{2II M uECEG=H;C J  @:aT^w}w)u{2+LYwe[:rM9&o:Iya/4DQc < +   o}B3n#8d5!~]Ir SuTNx*    ~ ;%'k%H~pt6;MOh4m p8A  Z*b<vvC q 2 W [    e $h %  + AoA(TN3[uMt<g=1<a` h p 7  f  J D68>zA, N n D 5g ZFTef09 7 Q { z  zKt~lQ<5/a ?~O  5y ' A. U|5t9eg?`u&EQmZ$ ( M d O f 7 *  Ic3@G 6k s  m ZQ@,  $ (+=p,Qa=m,PJ' [ h e S { N V n kTl h b #d)r ) W [+d y{ 33`1e.Dpy:#pk ~ ; S+  ' > Ej  O dp K(6i ? H  J*l  2T"l | R@ M1kqchFGym,  z  i  YyRP&z n;|9dVR?>RR klA'q"+F 3 Z:,J A)9 _N1on`o{hD0| -YJJabcRU!J?UcQ-ncXyc2Gb' K _r@ 'kp~.Q8RNNDSS\/ T$wjZqrL2,6[)Yh[jNiW U  g yJg 2 W ` V  i x  UM:i#zFou!gw H9K '1 4 zx o K bs z x e 50 u  ,tR^ X m S , B' }u qd x,-nS-dr}G{&N*Jg F    w @ 6 A 4hMm  , y 4O l " D n  X  u W #  +7 |NXG.F # :O S^gh6@cd o )r HEZ   \c' q=u:e  njlv    ]: v,i  z;lV L %Tvp   K g W uO LL  b IX i ;K i  5 8n*yu    ~ _+[O-$DA   a qvjio+l b | :g{3k][('  l;  #  ^ b u  ~  I<| h 1  V  p  d U y}m^^B1  /`p6E9]= /" / ` | L  c KsoB| \ ' = h5n a%y/mWj$ K`oPon2 xY_ " n d}ou z<k\R  < jsL* Jk*kOw 8.j:gDcdE+F9szdEt"#9? NnJ metj{|P'#^,u38-[~6yr jj}z3D @*nwFO1RE j.)Yik]k6{IUUa,to9{=H jK4:oBm' ^@Ty@AHHP{ Ovn?RL? K+lRo].uQc2y9x/S5 h?K*&5'a6J]Hu;,~N@*Y//_VGoZ8]bi_f]Ha$`0rM . 9H() 2-"x~vUf<`W0*%X I%yE Zw{3GozL2/?nxEj|M c) IHc_40bDw/x  `  s DY1[: & m z    , [ _ `  7 D ik>XI~e7LL/ @ OB b/?2- = K e &  m    t?    's  g.{ U  MzIr  w oD%P mb`x9U    | 4MUc`  )    2 >:Y/($rQ8R~~3  ^g -l>x ,5 Kt3  H ! Z    TQn    r<ER  w ~ ) @/ Ew{$  TEQ Z F J 2j ]~pK?J  Y <   (usdTVK] )qZu  IQ (  V F pl h N i8   ;~F[ q& f5 ;  YZ       e %NYlg Q1f<I / l9m c ?0L q? *X `" X   { "     K\  ~5I 4 ~"}h:@]\HD<=(RGT RkS x ' R ((  iI~Dn1Lh, s?*f';VR1n-6Bu}]%s.%Q^L "!< k Nhi;7Z:}_b;7<H;OXF\ntKL.*Frt)2/Z#EIM@9VqPG/cjWX; r4ZmN<]>Ig 7USYk JLR)9FW(o:wy.GW< ^iWwUK߿Ju\ sbmJ+w*7 )ByF!7`FO+W7C~&6gF\5X<qy2e)IAY~Le[E_%BAX W>,NEkiL^5Ul3mwUpKmr#K_ufz{uN&#  6 s6 =k-f\2-;q/ b8LZ\vK`JqWn1iW|S4 W T .W%Y[ir6h } fIl+G   C { U ( *r}b%yW#oCl@M]V m P   8 5B &$   ) 8 52 A   B 5 g`    Vj 5 k Ej A\O0Pyc% x ,  y+ > I  i 7 Wi } 0* " ;8 %hH   = yT4bg E 53  ? CQPY+  ~ 6  ") d]c8 |@$  lPS5 k {qk 4 @8_a3 -K'(zyl e  :^ m8 Jjnv[esq $s %   i 3 T  l : S \@ d ; f<e$J N.#Rd!Re?nDZe sNEG I   z " % F U > N L 2 N   $    P #TzwRR1t   7a 0  4" Md   U 6g / S | p 0 f ] . h_#o '?EtpT-4>' <%q%XjxMh5cYu@C |    e 8Y4,:NgZ Y(3~>o( lX+GIGuAzOly>~y.:P" }   T}{],,R0^HD:sv7k"BFSGoC 06(hgOMj\&dbNxE V}b t)97:Fa-B\8S^^JhUwR&DS:x'<_`gx.Nc % 1Q `qdCm*t@FM; uqDB[|6->V?sbw=Z 7 _-0=va36QD 7!}M F @ K ^# R\p,doz`  KN}me^Zb/~-6YS +K | hZ BJ \ n )\y_ (S  k3#?j  q<}XRU Z) ~  s$l H8 !u |eb$9<FQHrd@  W Mpzk) B I t !  6N :y >"8E:'`   8 =%~lnk>Z. ` <  | 0 0 L&  )(Xn  kaz-DkQ$@@cK ` m a  S R  L ! +   kj    0 e ` Wq V $ r [  n 4 ? u 4 M  CR 0  5a2eyT{  (D IRCI ) , W e * U  4<  ]: %S N :>K ] .[^$F7~ sL<05K D0f0" 6 L:~ ^ , a     #p D $* t g "  sf0[S@M@Y\s , 4 I H  j ! E #  _ G N ^tmq # I S   /  !tIn9Zg bYy J}3gu ;  H$&$ j W= 1doJ F j   G C C B*UonwtN$.H=o:,}loZYP_ ' ,  y M @/j1'"Dg 'GVNp|Qr1 Z0@r)1g?efUbiL'  NT&9HY ~tG) u syt|3b8`<nfh?~*%np \mI^?;zF05{qh;{"j)qv5rYrK+ fa;]lVy4}&)O]3{MX =GwrE9.o"=>`wsHEi8~ j@oKiQ^=hayR,k]U }bcOl+&G8:\{(:w+ +_ a -M (fW6sre?7X ,? ^FEZWo%v at+,sC2sHe~7n4Rt<7ok*tYsK0vldWAO_Yci\"4 (^ e r  g x+;1hTZ]{zd CzBik%&vU nm4<&~Z[LOnx|3DP1btVX{ '`#$C@e>${abx#%.fC;4:\QW,$(d B #  /  3bf]#  <=][ZrZ36u0G{9 Jpz  ^) Y "1T0Q -:duMlf   V/  S 8 N B l  R ^)Qi4$TXr\Yc:O2qRot _1  {  XSP , YLy N  X  =d  "Mm { i ~ UX G&v~XJJk,jF4;"  c  _<P f [[ 5b 0q   15z   !   e 4 %K-Qc&R=%. z! 3J& P 1  .  8 y3..  OZ  &  r   *iIGX`vA[2YkEa ^ UT S H Q  Z  Z fvq  _  2G f   z HS@ W':v6S:g{:*Us%MSk 5s^l p 6  SUm;R jAM ; AP% H [ IXT!`FTru:i}EulAun=\Y-82<)M9}7O < U ( 3 + r*/tH^6;a1W8w~+5mKY0 u8<Lo   />x3La5m]SmWp5n?c33$PY=#o\w)IKD!o3 / #>]o]i > _ _ ( t   5  %KGz\V:[O~+L[c+jMQ" O Z B [ F5 iMf.02 ^M VQ 9 />cFa (f  #[3[ Q>\-$yIB,0K `^R !   `       ' C +  k / il5<MW&iZ'W7%Vpp r-*_! W zP   1 q Z  X   z ` | C?)l+\  K QFd W92 \G&\|`u  A*v"  ;f7Y  ~ y#s G?l ) a- D!} RD ykym]&A!F/PSjjP:91Ot o3 C  7v K _   8v * ; ,^ (  F!( I<9@m>3WyzN"m:(U S+. + & U Rlg  $lbprK_{#d(puTz?+B;5]Z$? *$Y0knEa w { eawU * %# <g>zH|2{ V> H( J ' U*#jF {8r+">Bba2HLS'C x8/^!i` xWU@CSv+Xtwg5Y  C  6 EnuXR|KfKFP0GF =6Ah vvT8 Z W  6   8L s $C!-|+dj3hDoPvXV2hcba9~v%M\SiSK_K0AiuWSYr 0I=!;} pP   hIp J7L [qp  K HWk5\DCm<)*1 ,vqXJYr{ M je:~*Y:/o  nlI\.H)hB7H%vMjc#n:og1\< *6jL|SS9;`|gKBs mw 2 % *Tt{ xN E  9LOyl|D]/Grjq 2b C|q~ kGspUg * _ n  ! # YQ  > ! D 4 N  nu~UTbg 73,6Kgv3 k 1 o z V { 0j U ! @^ 3? TLCS_m1*XK) M ub%n^prC H >BE[ 5 v a@|%-AXZjLt_m@{}r/b a6bC}4i zv 7I$ L@)u u) G h)J:rg  z b90 ]I?~J=/ rRKau!775z}z[)* z .K X +T6G2b({koa_F5t~J{h7 P E j T  5 vw<JJP"vnj\q?X)8KU (b3t"Q '74~k  oCL^"0X N J FHs4\[oTSC(8$x7ih5MTT,ZZ5{$ E %TB5 j    7  ~ ty3klDrXV2?M 1Q j|cCo { D rN+ I'Z]02 k t qP HdrYBvn*x|S U P [" B R %GZrrn Xi< YY  P  F 7[ " Q & :;llQSf$0&B  y  P | T  yj;} D AO8 9   x   %  V:InnPsEMP( W _ Z  EUH_7 _8X> TwvR?jM6  M @" j  l> U q h   I d HWp;4r@5?C@S.gUuR#RK@w " . /Oy j-} U | B \&0  [~^\)mBM>;S> ~tn_pAMi@d o*Ys 8mj2e9=o:IDV(O-GfmYW6]2|vUbw3dMHwopo|7x^C2s(K m,M{HZQoG D`t`bCZ5kI}a3KNJ[ *~o;;o%3kP1kkX;OhiS8}c![FC=H6B^J]>`H  _ FdIY3)& Lzq/w/!QH+H5R<'KsG%_Q=lp7[P6{]W@k< 0un:   KMIf7b.Y&vTCV(Q]a8&!9`f T:'Y735&o^x4H5D/N7y3wT~3 3R FXIB|!Qr\gdko  H}    L 1N(l1C3TL7`yWI[q$~?j|mu+8L F<$@Je;j}&s H '] 6 6Go DLz]si9TYFIqx p_U&#'DH{ibKu2#kcC -R!q#5u[6s#Yhsx%2uzn_Q^]ss_ ` #2eaVFQyvtYl)!iJ'I,\J1 VB#h$+)e] }> $zJ<:_02;~BwO]; TtCOpfN&/ |X)3jS 2UH)xHP55!sJ6DZyNd`Z'av8d'GpH 93:WU!mPKP"z L].\%]85F[R9BQUImDX M|  - 6MB.Gfw  p6 = 3 t .S - 6 (]d2aH2f_&&( J \IRq Wzqd$HF  3Re R *% {  ~  B \ D ; r   fa$Q v! gL* <\;85RWj -   + \\.#Q!Mf' e4  I R M g $ >pLi  a116 pQB R L m!=8T1 *1+* X s)RL | Y` w#  os 4 j j L P%$fww  W ~eZ  `' y 2 # xzreOt )g`yc}  @ V Hiz$PT'D\9oYRibdp/UICA)l BP & )$;vF j>l 6QFe;7]1qE0my[NM<3o? 6_f#r;m*:M#-[Itx[)]ZOTw; & VUgQ/d ' \s Z g 2Pq?n>3P@F!d}>kU%BT~@l[b6=qe/+}J2Z(s[`kw^~[h_3D wH A odSKv{ g `>NM}p`H%r;#0CBitqWMYQs-kje|#uYY{kKSV ^}!Fk=c/!+&OLkZ,^ixigh\4W@~ @ }  v5 $ ]  OUo@&T(uBKC` ` &   zq|`8Ss  y V m  C/~B0$7 ( a u 0 Z+* a ~~F# 1 yG\/F-GaNWDam:hh 6 c  ER  3 i.  #[  ]5p?S r=t Y 0qMJ Dkf^mK&ZkG?*y{.xb9\|hfq%#H  L +Wjo:iP">9i8NU<^@v w O ;   \ <utKTCXA)83Z"QevVv\j("TT`Fx6] Pjtj8cx`OE3#gmLgXMYf^\8IC wlKp5Wj 3jjX5l;= `6QQ6a w O \ 7 L +1 |&m#@Wg>h.:y{_Pn+^ VJ2 U   Wmu>-W?N8k w bh2kmw  r )  Wd Y g  F6M[u#sA TLf~/4z} 1^0 0 }~f     fnG h S f {  CRG/ ' ea}Vc$}o*=x[)h; , ]T u    hEQh  $  D B :; k b C z }   /8 $GP(pv 5 9kj   *b$r~=e!  ,M , F. dU>&!kO%_ m \ M qI `t3|gDo7AB   EP aPrP0 v 7 # L  ` j ZU'N';5#J/=~ojX #zG/]q Y  [  L  -qd9 {]2  ,1  h$<Y6Qzt8%("Fvs3 'D {   !w \  O  , I  D T  Q ,  LvdhLu4S  %\ L =   -  _n--:\u -z  5`F  u@  x "~V[13I<6?l|0w :7&cul? ] e   ah ]VH_08;GQ3xhfod)A^5EG(#Y{( ,L >=ZyCBZO1z i  u Qh ;&Q#XWvl1Ow"y3tpQtzDc Q\=|  R 2K+(U] oeV "[s)Z7~W`j8X8]:*}jLh)eBfe_?vK,!r'kUSq\cz(4G2F]"U h<*(,jY^HAmm  i k gCn#'%& B{d@vGps6Xl~@GE7 T gB`rY&C+   ACGE L,^T8pekh.I\]8<~s 3G HUXRJJljoA.uL[$,{0  PcV NgikL.ueF D&' VBbud8 ;~|z}GEb%[ 2 ES; *ack -g+b,{'^qI E<>dt(I  g ' #   cU0s Z?m"rER#[l :tGd6m@p Q   N J'}<   . 1{G,Kq ?W&%yiJgQxQ _9+ Kg{ IJ ^F; ^ +% {   5 E f  > >f)?19`~|?;RN ; W z 0nuD]`Q6 R M ?  - j e2@ V Tw8 WXA63 M a6* iYD   Q U 7nFR   . &  a" ]TSUobQ8?+QGvT`(K O e  $. Wk /BALh> L wQp~CA g&<ug \>,M|1@hK>0;b DVF O 1~ " X! ">_ mfv{M, 3o-&rJ6^$7 8X5J+0V+w7ghT [\(D |) |g 5!$ $#}$%T,7TC2pe),gG '@`+,s/}hH m Z    wZV1npqoybr:!S3%QGZ h   ?  I HD'FDPS>   B B 7# .Y`7btw-dP\%=ZZyNCt;B 6V&  _ _ c  3 a @*e"DXy)V\P=$ z UG`&R@ $T i \D  r BTcZ BP;|h.XUm a +j xd:>/EB<Xb4Rx@)$7KWb5N_)>x_>%ke>{!.v %yB & ~4 t` y  c2^,- v ldH*kr^JA68#2aN8|R1&vB*fw]zNTL2t* s Dt# <  _ $ -XdF"w6ukS091` \#)R.8} 1_3u2   vTF  RP CZbJ[u ] E  g8P4E]1y VF5fx Q a } d M Q9 F /{f[\D=as'IrFR6r8ZV,o<p? ! -  {  ~05  8 Y J  ]  { ?"T/<"7rJJxsj,N)Z@[ O tdeE+Hm  i| kSPlE n >: b?B A^(Oi RK 8wp# A p X W  8  D  !a ?}  - Qx   oxnPmz}#j -ol6{ j ?I RigD%{a1ZI2* Y N. y * K C V p\-)vr%R5Ohg1;H%[R>hj/(?}` 6  $  1 $T-$@N  _  9  y  q(mL1Rkntc6o&=Ye9+VEt*#  p  % ; ' 7- 5sAevW],d|)t1 9H6TIh xX}{HEdo3 N- f9s$Q`:|MiVGUx^]uO,C&z : _ya/ ZcI %~&r/ k,ASlo :-p6? |Z, mYk X#;z)teQM8? 7 (/Qr2x- 8SEO^I]WF#f!8k_t} E M';$UJ"    . nI'Z@^As^jd =, FlW:4.kbvDl;BO Nia4-v  aar]3xxkGzupq=9sn&9u_&l{1Do&#H<HL/I#Bz? !-s0?H^#5SKA)x,U^ w u[I^$S '  > 'bRV r(SnS~ sz~d>|+,4NvW7LjJ,!xYv)AP6Aq'aI5jH1U u 7"E } v  y 1K|%6;'3VS|5hA/z|V1   n!  j  !  ! 7@?0s p V * \i 5Y-2!1aF?v+DIz.EB 8   g2q/i\x1j% HkBH  _ M  u   A  3 y  >&i>{.Vj,R2K.VTL` 1<~  A^ HgV]slinmz8pB 3Y6 q_G/ o , D\Kh"m*'  O _ m ]  |ReS-BspW)Q?mzX.O268Y. 5O tH Y hMcy{=>8dQdbyu_+c F j4`=D@mL I[oOL,Ry !mm0bD*tx`#G tIE`:QVj!hDYs?)ovU84.CU/DBN'bF`w1bc`ywqzS\Hrx ZpAU?P]30A2L6Jzo*S{]z93$?Mq&}p _Y"(_EyAL0BG fX{NbrRc:C ;hI0U@A._g+lZ+>VrU>u9J~O4n< cdhjbdyf)] OHTF V3hW|wAx&~ ~~@Ft?zg )Q . n! Rzew=v!Cra{3x$!F;.>+Dwx2=g;H   4^ n\:\#dylffyN;@b@~o-rc;j e0 c nh a  F F 3%I%2{/e}6BqJ lH:j 43qHLCtPQ <:#Djeh 4E, H A md| 3DU0{(U N 3v Y Xm]R2"dEt9I  a  t R n  | z A&=x~q|*[hZm_ yu&a 2?t R)Ki' 5 k 76 g ;t5GnZbWJhK6is,3\o0O'$X(5=7^vhE5 ;c h  T  #  w} 2)%(Sz=`m^us #0K1 ZBFu#?J?lyP{\\Oh}yZM1MJL(YA/#cdb"J07bp1m= F ~ >  E  i  goo:|[/w5x>@0}-o3 hCH 5\$<  F.LY%n '-$>h(5q{GjU:~ 3YE!}i7*ble5_Vbhd { ekX[Qq 3 [t 0;3N08'BKKKPBQfjR&@*p#JDWI )fa6\` { e|>W[lq*uOiI8w#huiWBWV,2}14  qk b .kbeuy>@8G;y#0y,eVG%d_dw5~HcNI6    .t3usCg+#ZyZT%u^HyZ9BK3 S   2 < q.%pubC t8A)1=\G|&I6vYj pVMk>9)~U]P.cQ`SN& %  j   q_/+u`,# n   YOX)3^=m1c'j}28aD-@r".+    M7} 9 V }+<,4=uOPGlbo>*wt,=Q[We|U}62 \ E ^ x?f  i]$'/4$r z Db<n_f cJ y=J| ,#PS   i m 7 )) - x5 7 S * H  /teV&|s&+iwJ[Q C x _  _**`0]'"D //jtFM S (0}  W\QO}A ;d :ip=  mH)_1Kc1B-nsrDbh!7sY $ <f [ C : F I .mSF;9mtmlLw}A95sLex?N)9X =)p /vHf^H\   )uoP0/% [iy0 #HX0pd FU   4 } W w p   >|Vyrc_)z5w~yy4tL{xF`Od-*>C|/8L@>l10z#+Up5\4=.Wy *5Q?INg,dfD[j_MV   ee0I j%; ,:558E'&~MX 'el(YJ44"{MFkJ=f 3bLi_sq;@3  >C x  {}'y*,>y3}i@nb5 o-v9'z*bA9$~ kK i* Nd  a  j/m(IKYvD/}%P4gs:K[HcM+:^g] l2t2AOqC0h=Y4.RVqR\w(%Rf}^kFet}>U(1hxN&R   9 j  LCg5Fo slKs}iN^;p3YLuMrdArV`x k x[  6 :| i[s4a,_rP IS.?" d L c   ;  xi~l: d KK0d]( DjWi] C' ,GFpos*X r< P T M{l~:q,T  ; h )c7MXZcLME*[} :] 1iP ((-Ty } 1 \ &  M VV U-~r 2U ko @QD~Lb]?> v9(Qt z107O:)MG:ku@a s) P  Kly  g{a <,qpi/,xe[oO\zE}_>J7RLq J U  ) 3 D _ W P4&Jdl1;1  , S@jzP=3r;ba.^SU%   8 3! 9\k7f |]f w W & : *   l of r % @Z\ @N#X ?m@7lbdv0O%om+iLF7|"'HcNpl d emsKD  ; 6:p& }R3zm )?pqhHChy\JSfziojvyn"\)(/c\xUi_>o q  >  R  #9s?[-g*T8 v.-7Q;`S(n  k  @ xA1  1V= J XVJI&8*C 08v""3Apbok\FrCw  sqo0 Q ]k l # tkb&o8 '\`# QhXm2E9jMD  Mf O m] yB J 0wT|p#)!6b"Xa r~c22]o4ed5:2_Sr<.m.6k}6zT9] WO$?u_cDyI8c.fad' -+8(K5LJ hvqC~o BG ] z   v $    B sL |?&rN to6j?IWhCc%[S+)pXlrS}4iTd8*   Gk { -:>g>dqjWDm8`=35310;u 4yd,09@A!CR ^ H  @  gi?i|G uFl* @Px3wloKw_ 9)t8@V1uNc.HQ-  @ l&    %#Wxl"M2mHi0WG*rD9!om ^ C 9  O 8 m6@`E[)!( C p (e#(r}3 eG T E rf ld|3iz&S2n | x m ) T + D   OR 6 ; o < @p 1  H@*Dy|= X}i&vu8/S R lw %p5 I 2 ?o1 ?I2JRV${,zvVX4]  v -+d]1`M9 l M 3J !E9M ] 62U8 D /}_ZO| U g c1 6 v n  v q - [ {6x8j_`f#gSk*GuS O~? .  4BJ$yXs4?hQ$    3  4  9X}N {0CEb;(By"lwQfkGSp{jop  }:   G   TE1 iw\ CHz&*NjA uF!{3]KhkbBwI)578 MQ  ]&l_L   ,GV?Zb@18jo1 9%DI@HlYD$iLRbh_UrByI+|tJ,:f V]) B|q_Io}`HFFm84eca&sfZR'U@O x6%8%uZG   [haGEJ b edrY(In;w0 ~k( >P! F    ^  6s[B;DQ+sW1t,|\CaQ@W8s~dsMW';M/D;  . IKf='g{rf7hgbv;@p xB%;kX -A #H/58]X;e"Z$h9UL| Iw0 Or g0oi&TJVS%X h y  LwT>%L1?$~dtb-8 {F_X p7$ &K7.=jD.T- . NA XW W e2I=]\tQ W(97Nk\z&wps=,p`m9Qw? [   t d  #  w $e~$!kv5NL iE! %P7^75xEz90 !  f7 ~3 z   a > ! U HD|-5/#{fSBzZ :2v'! mCLIj $jH"S =U     5 ` h    [3WMI10er1"cf_zUs&7KZ9fu;qf|ScV  "o~  a<` t ALTKLta7yNFxG Y%qTri'S7a   T  q  } | [r ;N (c7WbS^   ? { a g T   )R Zty7a97G+k,qA\R/BD1C  E T : j x 4Jo  $ J=wh6@T:_3  5hqP08 yUI x~ : hozK4oZ"i]^ o w 2 3=g)fEpb2S-J(;FwMa-s_jaWkq U01 2  &W  4y d6p h^"y4S}Z_JBPB^+N*-Zp 7V/:=FRN*Gujl[g   O 3*%@|Jel_$g e4U*m(^l&NP)v65IKo}YaG  ]{ mr{E 5 ] W B9NCNc1r}]@%x#=r 2 H kLd zCpMr_ZWGrdR%<Ug,rh j !t   iXgOrja5n)#!>Khf^nkBYI,: = o f  !~$Y@Alz8W:W+Z{(d.LSn}  CEc # UETl9PAo=U4$Y  G^m~ .",x5mj?T9Hp9?K/[:V>!4$`2|n'fNUo\ y k  Q  H0 -  5'    w O n  P 4 HW4Ey(LCK_IOUO` 84 RD f kva0"91|.r<hxRsFUhl j f I WC U6Q[>fEl5 ^v*C%i5B# 7   6 j ?  / p:x  j6ea|pGa'1xdXci ?  "P = . A ikk:Zt@_l)i _ fJ C  F2t&+5w >Ap;Eo|d;Je>&= + K > = D  Xc8_iZ:  IyXrNdU_sO19%:YL7IbE # l b * _rjj'TXp;,tJ4   9 O}>57N<B "@Fy(i4=WQ]~tV&burI   IV Ex: OS1`H7+Py9w" m2DbN-6q8cCRv;W 5<XXH5_ qI9_m>K |5fG+G!jA]=u^aWv5h5$49]h}@,]8O]-wPFTm&d`%3L2Y lP wE 8 d.Oo ~po@'?Y]u EK!6}!f0?B*H$[k2c?a#< NDD1I?G#>JY '-} @ 0 L Pn|5+YTOs@_b>$K!clwo>;rZg5\.|$Y$D 4!  d zaES9~HdAs,*O!7s]s&lJm\P6o:{Ve^W8. _8 Dss2ZJ}?*_EY}a(x0SQM e xoI_C2tG)LsZo|A|"])[HG-,D p GD_VvqR/Ze'Bt(P.y --x@<V4] %  F S *<U A | :  \74aq8`G;X .]+  s  2  /{#aE%f;A >T En o s $ E } Q> , A * nJ ^"i=tn5N, x o`Tw)pm =     H ( O m A rv GDe y zrW)):l:dV#a @     c )'/+*=<_oal   g  _ k x [ b 9y ~ \ .Qv]JR9RIRc/4UGi1i=iMj% 1  6 _`&tXCu h@PACAF7z ;Fgu>MU -Q^Z~jtD7AmR QE [ M ` _d ZA|O=:-vPp 9#zwv A,tg^L-" XeY *95YmD=3nG6y0iKO5gi&t5CP)f>_J1^* penz)!pH`uf}-VvHxRpr-r~> S fqstsZ;E0#Ii/f@c   & Pn#+u[k=sx9!,G}f27_"HOnm1J 2Q O {:"(n3Rzf|] J/MuU Y?Q[..!X2Qq7TsL60zP3sT,d_ D3}z >  D 9d"ww* em1;ttt_YoRQt 2]jZ M|~W,;`#(vT#@1  1 n m-  L`m[F7I}W x< I{ M#:HqZc69|[ -t w ]0 *a37\]eb|'EY*}my2#rADpS52 hM ] l * x  ` 8 ?TR`*yk_yBiQ|aeIA7c-bgq^U ?.y 0s B a  t  *  O lAZ(mRER[7){W{>Vp_B  r ?7nvmIm _ 0|0PH6IYx+-z3A1aZa"``Yl)Q:VyF*^ 4'7xjD}  1 z !<"(%KkDr:vNVABjv{jSQxo!Ky}x*-;; } z M;"wUjK7)K@i>Z;(R2'?}B)wI4O-3 #O !Mx Rs[kuV5{92C5HY >kK$5= N~=!y;;&oRCWJ n  < P    # 61b|pJ`XcmX",yjH97/qJrnX  5DXi/Pf F } v = ` - *} : c  % \c46X)mrQ.jTTik\MB!)iiy8@J  A  R E eh |?= " mAC 4   oZrM)V=L$.wyrvM|c.= G i%  M C ZpIYvkCU* K  Iu     >  + \eB ^{Z8.Gq]hc P     G C . a 9 >tK\s3  i   } tl/3j ]j,]|I++q  6t#QC(([Y 3/*l  ' # z o I k bB , `1iGF H\p0VgVeMu" #M w   N >v L1YDLG X 3R  b {>yeUFv$B \=2 T5T ]V$=Q7V~52JAS<hj:u5eKX(r88NCl.=3LS#(b<[m4a  K}YKf.jtaG!A`p:FeN+t8VD !hs?d[DP!RF  _ dRrKQB -&cx_SY~\|1=vW*}nZ B qW A0siS   i , dkdGR"Iol7 xF6a0G.&w9V^+ ALK+ <   1H \3O.'_W`!! V)K)q)HO .UpJ![  b, /|H%B  W  S-,cd=lXWOk2';ygY m_ Z%beKhS23{*:  qz K l-s) z<D^%UP~ |tEaYw*H>7Z*q! d j ] `/ a 6yf^ n ?_ m # 1 w8::lq'pWb'W.<k |ywYJNB D, ( H I & = o a  0/ 7n#s Q_zSr/p;C-y=:8=7'iM[ B  l  \    v!G V SB o_ ay(@xJ,4TMkeLYyf qS  Z q;#zf4Ztu% _Zm v r h  g 0 9V 8{K0FqEDBQEW;#~[oB &|l   (l T Lq. K 5C7}:#?r:3\Z.,fheu8(TFgYA3WD8B|t ~:9`|[B] n)4T`$9,{Gr*Ox:`L[JD -h" 1l <5 { >  k U h v #'k1&Pe/r iW[6V*-dEatIJkip}.hi)**A r *h aUq<$O3IkJl5C1p:G9Kl^NZhYA|Y I '#)6aox =Xes6u"+,sd|yr:6`[|grA0>+; RHIj\k.4| Ub-d : ^ )r^9dNFN%JB-;]Ad>/}2 ]s< !.M&]'s5B  'dDR "BT#1dk;?-,_iQ%6)e>bId9n _dk\5 ynSykpoC P t,fhMmU#4$=]Vi2'IPh50#05R:fI } W _^q  t{1i&=vq~Fyej*c_RFer.]o\\  dWU@wDz)v\A@ZYr|D4.d6#E{YS4IOtqo$uoypxI~h R_ /( {e  dQ |B  chMlJ{|9D:`2IJ < j@Yg k?9eSdq 5JL_Z@YyJ Ry LXq6pi=pa68 :|[BV&D*f%@;:>{.4g1tZ  / 4* j{ FXz.>  { y }   s [ ; ng:UT;g6476:'b83Hp]wyW2N)1t.Sv` ?r H r : 9RM,s_END(R&yMmX4emsl&Rx#W<i=)`[k^uH/@ H  i ]OnMBN$\Z%`?eO 'iCUq<l  H B 8uwF&PK&dU@,JU|l9l`qJR|K  I: f *'EZOl{#x6e+xzJ"\%.1zg/;X>UN V2d$B5$?]     v73' .cM0hGWHg1w ]&t6cXyKvZt > }z AzC\dYw l (x `NaQ ;6QcSo9i.&{xuKGeA\KpQ+e!"O} vLN  0 T jSf-cb hiQ5h@WRohc0xf{~S fMz>O M~C}X%AZ[>]sKD?fcG[:'%) sfoS]fb62$9cxM S''A!7.Ry#r(RaQe"$L$@-- ]Md C [  A 8g3TF&7{c,2xv:ZiSRAeCZ  h {  < + `hGTRbla%nPZ2J #]EI+^q &  tF G 8  9N}0TYKhNQjem  n+xTy/b2=?lIUkQtB` U n  S H-#S r]  #z}*=?2hfd+R^rK }kLq@i]s:) ((  c=n.j.;>N.Ml*oW6E]xjii1+0AUtui~g `r  Ff     WL>XUK j38 j(U30fpmiN$B jz7UB92:V , Q(H/Dx1 U2 92Q$hF; 9  D >l YhvPV%%i4j^ ? { ] s f s l  kQb-}UJQ"D)%@6c(k/.|T(S^ L 0 8 &>!lrM Ozcl}5 'jkqD:m6wk]PaS&AMKOh ~ t = u Z94Tp@)Tz;o,=" h(. t9lC0&{GiJyU'Sr#YdxF2e#r  d [ :  p oI_t.HJ7k8wK)=qf8gfms&sC^*|,e8| H A L D} ? /3e5.X+!v\T {-Y ?G  -+fd02gS%h/t)+~wrlfhx3*Ey+lJuolwo(b9(} r ^`  j 5&9P)I{J YfK 2[ g8PCO.KDT1-rzeyFlWFG[O$[ +_hYu/al X GEnA) 6 **Q DzI/;;9O/hp    /   <VEZ] $ n A6B2z\`eS_Wo+6{AnHCSAE u/ !  T zS OHd~Y/ap3$l.ZN4*NL"t7Xw49 sDY*xI<  ~7 zz @  ,t)dusg'vVfz Br;c>FC=pP[=ERPw` 0d   / ; +R*OVd=-|in KH' uJErqT[?#RR@6kN H*Px lA  =n "g,ryZQ/WZ)^!Eu0Swy7.p;i,Ij|a+g $2:}>7~ q C>%=s|FP0?b 8gjOtnv&AeV!`M=w*"]|K~dF& O   o%c  . + "(k ($  I WcHw&pR8SNz ] 6WA 4?TYS<Zi!Z~+g3AZF{CWWqt3EC ~+ n? Qaw+6,<T{V4C\ wEll}p2k)@aX@H{KU&Qqn  'J' *YAv .h\w[[~d| Pu"YMS*OM/ia>iC[5tG3=  n H;  E   Fq8j_]d<%AKf XmdQ(rbv"(8F; z`d xtbe 4T3eZ*.8+^ = J 5. u!ewA:/OL$g>taE$sNm4"B^a.^!Ti%,u(v{=ctkMi;HBgX"gz-L51:JO v M,  2Ex6OHo)d0vq ?hg$6BDQ\S')QVvPZHQ~.\20-( 17}Jx  5W l C o5o6xZc {_&Jw,zozu3- x N& R 2z   `K9ozLnH9 u C$FyYX^ 3YJ.UqZUvW GP%u{ W{~J"Bsq}9~X  V X KKQQ=W/ .A}zTrUf ap y}f  ~ 4+  9)   W  K\nwGnauK*i%kW(1 Q^NwpV\DKDA<[S\p*e @ ,  9 ~ s >9OKE'Aa%Y-Df!]:dh[9t Ah W~3Dk%  tJ 7 Y 8cC  E B v1sdw;Q#,>ZIg;y1Nc~k?PA( WY A 'Zt6*h  [ N s  v6-g(E|Ab!d. E [ yp #6=cVa  c ]  1`? e;wBRS *0>8%9E_5c?}kF<, Qo"bB %   T{ h1n0HR|/E|`:^T }x0D d} ? Z $2 S q1 7 [r]_ a WcV ^y!_R[Ciqb+zgE7@/CuCyQ>hEOT~p<",<H @."'aF1`/pZH1b@SrV^hnZ<(r%. L $ >       2V"1 )/#iHDTve&?l9FU7WnL5nLdtwM$nE 6 i < (t7!5M>_'v6!~aG(g <5%Gf@e)Z;|r }u8 K  <B%w- \  d|lfOq+uF?7KnvqW?n mjfV\&;ffT m L,k)'~3Oe8'dq 5  P f =   Mald92E{)o)VoTIaM( 96}~g%   Yk v{@(VpV83^Qb F2bf+ >A -!r\SXNryXQo? [yF{^v3 OX, M})QUR6HO8pWxynW f Q%% } H g RH  %( IxU!84*/V}pAlS(+ ZV=u @i;`V^R }U' H8D$= N Hw3 ,8 <qEhbv Ocj#Pp4dFH)V!6 Pt,   = n C*y?" T66 .(*'Ce>^<<[T ,lMVDS1iQw\,( ANQut\I$I?W%8(8RInkd9G";S$u~\=cDA:- K F6 . ,|uAX)C(z8Q%8-5  `  J _duBf_k(0a8o]}`ax s%Y1=!SxD\/'m_\U4t/qi(W35k QSAz,t` ><  ?  u??J9Zy1J*n '%5D4<&mfBiz:lb-u|is,X;Xt5 O    ! pqAa8)4) x# 3[uq]JR_UH4RHIUlh>Etzl}n#E Aj e-Jo_ TB bT5i[G"DW^:[ Ym| Sa  P@&B[, .CHbGU'AJrDy_=o);SJ-cqDJl= iEEU,on|='< #wA!4olj85Pl$xH NG~*m&E5zq')z5d= 9`y|< ,5Bp->Om n TX KH9(c5K8Yt(VUbGg4_q<TVeV:-aq{~|H uWJUCmt aW> pG\XeBvDCoTaOFV* HiW_!~eVul|VP~3 6t E/a8AK{PV"dWOs_M>1elTQ]\d/;m\^h8l`>dJ,   =  bTV Tyi6X k/4qDR8  L<> nNg7--\DaBl}o,1|v9+fv'e D#qD|e*{6n2D9~[ s? \ Z ~ R p y ~`v' : r>E4QYY90$YU{P .E<@}.   ee I n l X i5]^b)aYQ)xh{-(jNpA;/gR1o5Rcd2/ _Ar 0C O  } ! - Uv'l}46m TVLw.CjQ96)C(Rw{I,]Z%g2&u^|42 ;S )NFRA(D\_4U) O$KcT-qFc}35WPqw;9>`2 "f:S\:$MxCwY6b<0rnmy\U !ZLx #M1svQ}i\[7'*Qt $-;K I i  l DOZxo5o]'jPYO=2&n/tZ]S)%+^0L TZz%{[t'6Pr01;UX/%;o$)?Q Z8P&A'sljW2|V\;fdrRf9's<>D!xbJ7Aq%_fmzXU<S'9t RZM5]P;~aMs>zZN/G!M9'?3e/Y sD7D.2)"zSa@J}lR`OS~)rl$w xog; l, gw|#DWb-RB"1gGVfLjU0 GG\+DfRb<-.s#ydqJwxU)V>G 3~N9"MUX}d {X4h=Q%PLO{t/Vk4)c%a'x5gCs{eVH)= ZIX4UBM-M7rL[@}MHON#I9]'\'  f  5 {1@k%mv?'L `qi3=er NN$k4D"hRYi~xL#H66TCqd TerwfQ5TkCY4*53}~,~T8]!}>&xr>GG8w Lk(7V`: =r!B  .AX7 f62u'E.[y\YYPg)?P(:U6:ChnM{9Q,M-8 tj T:O.62{{hq:8&/7L= ~i{7z g6oc":D\Pq F t [ c Q Db9b{LRgz9_5#Lrw 3sBS#`^RXJ*T AK({>P:<z~Ha ;0(u2TLpfrTR\ _,Q<NMw9_L3@o)E% `? /R!6?6Rfn6 s : >QrOC~T;IP)R] $~`PW7N&|/Uud  #6  ~ xF .g"M.TeZCy0-;}0hjwh 8 Z9y1v"&9bVzMFpHceQ )3\XHj7;"Dsa{QYs1I-jb^  L a}75  fh4AMYXJ4w\%Py_ W%F$N-&r*zb$ oyeps.Lch|tI0jHixXsLkZ Xfa  *|e }7bLzdzAUQT:H)ZXVLZAQD.VXJi_C?0]71 y pL y93]Ja$Ob7AWvr#sY7TC":+VCgrso:C-z;~rhI      Iw/@j Z U4uJY+|EY+ P r Q[CMW3aw?9xv0o06bWt6XtJ$f#2#7 ey # |AnG ~YVXxY/f!LD1!FXi,:InoZeq5u\%9(R&|h V$M6OyJqGb\XpY y  k I si_%|tm zDp.9uRMy#.,bzB`  O.?,^M>%yid4Hr /3 A g Z ijipA\sP/j\ N $5e]+'Ii|QU=h5l! P??SD!.f@(xgP^ 5  r\ *sc0iLxi =)D*1_`5Dw q ^S./#NVb;> _ 9 b DNmD4O}x~bys>Ctd9P=SCP:@PdO #0,@O}WAF=X!GT6 c(Q<I_uf{nCnJsyy=LI` E6  %    Y7(kXQXN{NVrOf}+F,-GAr05+s@4 ("#1([`j9o "0K@l%vX zF_Cye_/@W   5EeRkfLuKDq`A11W\f> 1F T  2Y RAQ;|q"Kr Fdcp2;BDKDuU/@b;K t B :=B 6o 0Z|BTd*es_A-WK.:`U'  1"N{7"Iqd`"R-eRM7$XzZ0 4di$Fc|<W 83V XUHDooRq%S{00VGI_n42nbN5b  Gl }[aK U.Z.@G%VJW3Q, JW lu nM}UjN#l}[{%O a+7jUb0^xQxC!1EP6UwrBIjF6iKSqBpB8/(ld[:f{~-d/cOA H B! hp Y{TE#7R +YQr'@k0 %/ZVIAH*y[ mj0 L$  m/(0|-)O~p :h03 R!zk,  +T ) jX R0G[HW?S +=Z* ]u.t!#}F?i8 R E>II%|+chi35{eFHIkbXVA  c cs>Zv:9H`3;; IL  ( @ MD,fu}Xe 0z!:BB}9m ? s 1V8j{">~ A.Q7!H s`eA`rwaR5--+z\\9xL  f !L3+,i  =bRjC"d_AGKB1kEd=\R}Ff?>F7UOH#L!1+"'6h 7=VM[:A%> @Bh32h. U   6LKp%hZ 0ovA:X8Jp,7U#E8GxJ]m"%laSA5FnIrg1)ns%^Z 8@E"UzRz l)5o]{tR ?~vy4vA-:p,Jd1Up z  5{c{sW,\   Wf  b5eN\_'hh: i3A^rV :Ma*aX719I)qd6 pX_m]%Si"OoMWxvO3k'h!'L2wH>F<|$CE"}ceP4`z[[gXUx<xd4CF -JL~4 ?Ld<6F. fPZ#hrENvs\JeXtx%$M1 n>b*zVdz *v 3:n9u)GTP#TC?Kh7Sx%m4&_<:$XDWI t> 2>p8?GR6Ff^;7qs>fP_dN2a*R6akS87UOf;qGuErOwV% h5X>$.fB'dVx[g58:WK~|x/)w@?b.  4^gd!"MvuBcf #|4an '#qiV(>2 o8meY5{fr[N`>Wd"| UD lYcdlxnTN8+MtC<t%BqQ?i=WjZ=LLfAmb v.3axCp1 jo7[)]i` Qi1TXY|tJ4:N(l| _?>1 %K(}~2wg+RFe4b n4: ck- AVSrVhBR6}]\%\G}gjr!^&2SkP:,C= 0r27zNz>:sk^m@Ga B  f45PHL\1Y'Ie-X Iy , % Q nC3 7-{x.vG@G:=PUUkA?LZqDhQsWr#^Tji1a~ Cd0J+IQ6eK3#IEi2oiK C ~KY]<L)?rlBXqm/lD15;}v Ca0. r!.&+[n6f$#7q}V? }hp(_;uu d4^M>Rg=jb.3T}e'R~O_b5jg4(vBd"WOpMqW}/`IKl;e =uk9Nt[ECxHunlQMVLSoq;_)jSzQz8 Y v 1&(l$`NsP[:w}e|LlaHu]16[]MW>8mW YW/s_#@hd(5 ^RguZjEu/o1DkNK#o:o1*Xo3&H[\l6vI#YR>d$s,![9 ~^ca~kUrRyDA|ej=9# 1uzN>!O5ty4b}+M2r E&1Iv)DYzB5F'>[a8)./|cf v Y #z&II4|f-J)cg>'8F4 ~]mF#X m1I|-SaH(`    #DJG{S0Z='I %f=|'x}Se+Mz@ z cB !9K2GX+c `g*E+!Fvb&.#H{pJl5 u  )vY&6Za'0&@+1d u`Z u 'RxoG_9p11 u-% 1%p'Sb [%.k_j.K=?`fk8'1.Rv|]-i;B-Pl_X?hko+9M)10B+4(!{(i*wrU4,}qCLV@G =N q a{ Lb)k2Q}8/c C76]wAp.{ MU~:>xk v(c~N0n>zH/n;zk*Myp@0*8+h-iklq`+K. 5"Dxo%J@ `  E t N M 65eYX|}JNnNM158oa.Pq`%Mzo01w  f`)H=6C_I +r'(*vNM-9Xu9##CcGc j;,KqQ#7*70{e 5;Id@jD$3;khAz$Hcm}XL|qmFhxbr(=6%c$rG4 JS9FO:!h 2BP'RzHAVKoZ _ { m E wsc.*XI7_;iQ3?W_E__<5h|o`MshgnEZ[kijn-O 8rU F -V dU{ch#w c H   ' 4r,{/E7$0 28Nm/*eX/Z,w2pj1FX?B]hXjODuV7~e yRZj.l*;D'1>'T)a 3J0*z)<DN Im ,R7@] %C2 C_U o   Q FOt% +INj_wz25YdxtV nI[ tj5c[ k05slg0t_  .u1, M"?N(|MHY   # \&@~SbeO~ ,TaF;)i jc-q\C;]M5&,v 8' ;`W/oxEypKrfn` (S V[VfG:cQP"pi9]hRU[V~pR  +s (. *"_Uw@+e`;os ~0iEQ*Tn 4 ) 1 UwS\ar]g]5xY3IlOXT0 j]fm5*-%oCZ"s &uv;|B=,W'S srUxO"}CE`pYGNI8/=JS\xD3:7|E% {~kU^7 <v&u qE V t   ""3;>)hv ] C[ J?b%$qeGf 3\    (YZgc|\ M)cUB$z=Zv  % O 0IWlT!P?;P@Z'XdmF1YWWy]`8y[a: q#a9G] H30_^hX8E%J_ *w7V,y mk#M:X\i5D|>?\Q`O(*P)R 6z UF:K06   d " m ;-|+X\RyAulq,H[Ml>eZojB5T ) 0 !-&py) { V+]\.x1 @xc!P$v*KO1fl\NwhG:\"gt\!#qp>}Eo Z%v`x~[[h U8U& 5ibx"=R4I+u&$F% +yy>8j=z{Qdi@ugTPTjHXJ!6*1 7}97g2A.A"( (q+si+ #zm5 Rxi>=s@vMV ;> j t-3'j;3Eu. Fa fm= ~e7UnVJq` y+ 7% C fAT_^?'V`Z`6_a jOl`XJ/fVa(fBo\%}^ GYw;yUK @EUB{]T1 F?ZUHRs@TL4E!.W== ~ 6Po (Y)F?EESl`c2_Xjoi r  H?lL&vx8<NQE<:mi]%1mj1GI!vr)uo5J`l->\#O7VSQuN`wIGhn=i>?7Rl-- dgU|HX IUK9~g*6/x|Vy x'/yK*,u,M'5d6?F8ktVs=]uJU5h?:2!>3h/E2-35P[ >0)/>& ei0(08'lF?`j._nhLWH6S,<0GB; d&^KC1$n[V~E19"eSUs,OhiI}pVv@r~C,khnTHwhS+H ZVdUVho2{ n 6 I RP ; 0 mpyO(6a1>PlgR~{ .mp q*/;(oVe+Y<-${ eHG4\?$JmI)I'QM-gIz$JF^Q8 #bR3K M4`Uu)Kq$C0rn9X(bcBo( |xw]JUU O2 ;]"fg/jXU$3X dQDsybBGF08iGPI4?/s+QJ 0A~cYoB"}D6M/31&?9(axlHuwi5Qfm`r>)QQobxR !2G{%iiOEZKAb2wzX%? ] #qF-G67t j.B=0$3 U|WrJ&,0eRPAb~D4zI G -|pS&k .yt~*g6 F:9PD)ch 42af?L9Aj/~:IE1~|9f#qf!pgS8G>S?fa-9D WP .zqWK0\@9 \_ Reqy!; /Qlv]%AWP[$3? ) ,E*iRx8WZuVG3c!j1pt6yM@$o) =XHFhayB ?IbaU|zV[ w ~b DO8]%~i",=&<OYyy_B!` 0L !~g_ R{Pe%NEI<>^fQn#+Zxe[D  XJef_6jV(Bc_46}m'C{h~;$*_~ecnmuLL^.z[80Vf(`\z8k?WB8L_ p}8B@g )]!{me/|p$ZN!UWy(c)E{/;&+A,86D~>6"gPcJ7@M]ME{!}J7$]{%l1PE/6Lx[PR;uAkF>"h?O.;>to^,qXH&m7WUXn]4#h{>TRpTIVR<E,$wW:*6!U7:V& p0 ]  &I?e FwZ"6[;vR}TadeTQ0 X.uY(KZ9o(EjR'/u[} 6W0.V: 2kc]~8iu._x+HCM69Qz {(,c47=Z,&5{{eC'#t-u[ zoN?Z!$K;:>akA.t,-1g#w{'"q*7& f]'M.Z98lAW.Hn2_>YCozpk0Ng& )=~D@n9]h_N|gmnI=E:hU  &*DF4c7G_B"MrLimleN$VTZ\XH0Zs'O[Rjyz|*]j_tz,C6FC(h `2~)-Zvkso0_R7$97 MM` J-J|$d<rWx=,rr |z?g^n 67/&PWV~/B b?3$Fi,R9n {o wvOW/_%6FL?8b5.i~qp- Q|VMx+AHqH/o@+TR OF^?qr=B^nv@ ;*U-By~MDl1pK_[@JMBv*33+Jjp^-x{i()s>RuuT1'u*ym>7f)R:@; =bP(W.  h +|/TzGW,|6@/ 7elu"cIzLDMU:!mKr# 5ilf uXj@:)Hw}~z)4+W u@\BPI6+/kESG[V3iF+nP)!iM#}} {YXHJQ/WJ7.5mG$QX@YE@@;0D~}cG C))v?`oORn  Vwu5?m^wEVGVbm_WbyZcH\[uk,{V|Ba4ij1>lY`.I+w[=%y0 _If;Re86yeSrE/.E|2 O-Xn_h( Md7|+eIM3GS}Ch}`j[K22KE`O?Hz1a[37>XLLfl?crA TcXk  Z  5 A,ku: L6Yua ZMU9(0_U-Q-.( 4g s Fmt3jU"8 d~1Yo|c|BKV.]Y_@aQx ~0_4 TDqSST*)Q47!T 2g?fhZ[*=dgF+c~Qa . 5qEiz!!d0&V"58 8XGZEpJhr[vJ R,M1 2gv(X+_No5x>pG)c8o^9**;u]`A0kp+-Lrh8*>;;hvzIh{U?{XAhce|f ?{wuFiJ9~\[ p$ \p f dT/#4J 4Ah?] CZFzajL i IlDM,e2)VV`s9d+*pa*;~Yx7 C&H{0>]tV,-d-tjH'|f(x }8:#Ac<_/Vitj{mn=zm)v)xtz.c;)Hjsb6PI0xh|_UgdsjIO/\uA(z[<QW~Do\(@q!snvqF&MXXCpppM 7H0U0 4a7z&y^Jo*? Aya$8Z/FdRQ=Bgh@=c'z{EK@!;RSq6VT^aPf CWh9H $7/Z#r*xKG=Ul}f[RWp6R]NCMFgO@ oIN(Kz, 7cR (i$?3PBozkX zS'XwbQw:D=%b6C;[RnUShuuZCkr_@} )c]gyX i=v7Lx9MZ;#-b(fN l9uuH4AEh0T[X E9OB}pr3X*"Vcm;${"+#<!;p{* _|HV;Yo7)Fnzl\Z8^z?}uDFfHA.z|kWXaSZ ]3` 6W=ETsu:<Xbi@^,GL]z /U`?Z$6o ObcLT!y!:X4UN=0BJ]iBb?!--@2.}@:L5e0Hsw?nq"B ^dTD'\?&2'Ej")Nf3s#-|X=nw^<]?59o/$5kWmhK:#1d?hLB|wsI~>#OgW|lb-szUQVp$-mV_Kkw8sE-|V_WKD}4cWd$St$\z-n 2#@2~CO Tq'o:k42 &6ys`QyPi9w^7whV>yQxh 6jazRazxrlU868 z,(`fNuQ7 fJn@>H@X  4!2zG@~~j P| E'Lh GH ^V{)!S Bcjr||Lg""y,P5 m6vGZlOy:,L;=U?T   : VIe - `SpE0V[T T0u${B,ZrNiMa  0JtZM_ihCQ~bwWGl#^{0RT/%u\S.}|2<v1NF0Ptigf:!P8&sf4[@\i%F,o~U *eIQ9K uT (NAN1$^\`<K]"Z]+fOT^\0 =3'a=F2. rP@Gvd28LO_QpkQol5# )JXn0K[#9O\B0:niFF9kFx^ }GaWJ!' l#l($Ty 6EdpAo4-tLnNOo"%jm  z.$u3,^x,3(eZ pja\Zw6% r<#( gCQfHvT"!`*tTf73L(Y _0;{ 99ZV ,nXVE^Xs;mp%,7&7[("5ye l-3!gYR:vi))%"Q V 3.ncu~WgKF $ vEUj$\N;POb{r&}(Jz+iSz5_H_m{;zTTsO^zP>/?tfqo>V@SY6atOK08qF  e}XFrN+>s6D5v [OD;CR6>} [CmB/|<Pr{:IQJ)u&Ed=Kq VN\v>W;kvz+XCkC%Q{$$,`Jv|8SR,ecbHC5Bg|f" a |K:aKSK7KsRsW^,@@S~qi;`cwmVC> $R;  "CktV3Oi\`PZ}V.LMn>9+ Bi$*@ e._& )VN3#TnMVAL|:%.D%#(JjlYNE^06ya2[W5ckl-xhc~qu)]oYydLx| zR-^ <'gXU|Nz=Djmdnt4w-x^0DwM*o oi Z 8<4^H)\F#'qp (!>kfL"{|@?rQ[E={At=2?SGvG *"  Is~x w_] {f)M?Ad#*6v>EO^xZl"MMR4VT+H[,as7jB"g^%s#M^b5c|0cG?`_ 8F3bu}/Z8O9ms$%zB Cf=SGTZm6?]h;]?N"XjQ9|5+GHi! .FxG|x'1CG}S^,5e:EGd*C0HygoF!wPa]f5BSI"C}_Kcl-g8co}L38{#s%Gha+xzf3| byH !veVwM3&>v)(&t4rrs{86hv0 9oqe; *>7(Nw:&jVD7fx*u5Z&cfZR9G.77+\   U8LQ^s}'N=S-R;nkFCVTs+,3#lAn`[*n2r>VMFB"[L+uy=Vx{\@j:G1 >b)y>7'[f vi);%\l>2hVo N#9lMYH+h@{sdO"4t~>#VjQ)H~#9T5B-z6E"(:mE +M<9;X \jW~8*"D)A ``EUG6l5)EhV1t4{G8vixi^ |t w~K!/*Z\6P=G^^4nE 50XINd .qaV 33aUS*>;jwrI}3>te(cOQGK#TQY#{Pwl=A)13NX{N3br(Q}%_e[!T95k7:9N1+ ZJ  URim %#-w6F{q U9FWb6I=jv-Wo9LB#B 8 $Wn]c^=tg}zgh{h>oIAt&a5 Y) UQ"q7C5z+qtB93S}|mE! ,zrZBanFhQ)|'1ith5 "b(_)Ek[$(%:1xRzCKU\r^|0+OM)Z{~5L^f%$~8ruxE_V<~ {vcaT%q+B gT&{dK.S2YgteDa<J!XD_TeUnk#ukEH?:=   1TF`WZ8DD3APPl   ^Gd~sw2DgMY!/0% ?gx(k4%KDR\URqIoVb3- ^$jL-?8}Y| ) %C*RW4lO )/0>>l/~9$SB !oQ+4>ZH s}eHox54*E1dOd=J:YC#$Rv}(i8Z;:2f"rI:F"b"Pb^^}{<Ve<7NY8cr{ \,o7O.G1V`[~> :c)p0zLf8Sv[4*7&r=ERtgvh _>[ `Ow17LhD=1-rclX&#[m?id';;d Jlq-^8Ts`?]c2S= )J[ TNL{s&=L/V^!PR4m1*5BJ[K-MKy}Z-)nW_M|kN~!qp85]|r.[FM6*&9  -J6#54?grN VBXqg{kx8 .sU%MNS@{dH=[ ,X(9.`_)N?\a[fTR,05TaXo1N HfO_*[a=(J B ~Ql!Vv$;\eh}g(Pasdn[v/Ae|_ 1ANEdq[E[0E/#EY/::8*"xN' 'u(PB="ztCgf8+s7 --YB3adQ@[!M~#5^FBLdt&e$||\N2`(/F`b_]unGJOk) Vf&AiOvu>p*#:PrV.wv+ j5J<1;Y<Zj!M0qP.iK@ M7/N}}hgbzz1/vtRuR  *^q_d6Y?{N-NuBj0, w9<g;K|CL:&XjQG"~;(omt0.lW*\*B)e:.[Hliz.3W' 7(\OX x*`F?|jVx\,P>VO`jGvN;$JQI2v.j}fP4{cSdZPY]6m|32yY8ijO;xi!=0y[dPIdc{}g]tMewKnZ 1qdY#9LTLC]>*'./    ? z:d02ui%TWygq[*8+5ETP3X ( m S-\th#"VIA V:kD`-,?L5t4Jr_g{PM>/N5g%'oRn 8t_S.Z<X=a'r 0 Tv N~(>_I \P}D_NV|^*-o#Dxnu=D<p> " px*,wYWOvPMG"(b}u~Q(>rA\ qc` &o-C.|['LbKz2 wMcILx2U>)%lQ Os*6~ S6x\oMcKs=gdrB"#@%Kdni$ b+'Ms-(MI WMTZS6r17vAheJW - } yE0_D'4nz?=e1Gw0]Uz.'D"_S3Rm17\(i}3KwvDZF!cWIz " poT Uvm(Y`?9Dbidb8C>"rL`^U#a@OjRnczDlw2VVfmN: q3@!]f-Mj rlp3<_j?D`tWVo%Q|i _at d K(OvU) Koh~ 3 `Lvr3Wq"vElC5n/S 0 N>lHF=MH!#{-"qA | g: Mc;__ ^:`$G:bW xaD2zO"\*Y}S%j2o]Jc,fPRj:-MXa\s0r VGcUc8%7UE&\ ma3nR~Cb PL}mJJU +qQQdE k&nNolG[(5:$GKbQ(K\D!-yC]vfj$ie}Q&LT 7$ N!!;ZrFU Op@B\~yVP1D!lwC\z4XC^~&vD#0Boc `d6CRB'YG&1o+V<dU69s QSPr&B@~b)qVy>J[5b"YRY"oU*eFF@ @DGh^dl]62wBMET>khJ>s*+{uvki uF ?LFJ;Un.r+9 f;\]{_ c"wqoxDB6-=t<=R7x<nIry%~*>J{<g4 seQp?o'c *E"0j\b_S//nV^UpMBLQs o%dO8 V{]KLB*ya\m.XeVHi0*_^$qaq7luHN`G=o#s7`;wDNP"pNtBE-358a{ :~35Ob "GEk{o^*`1 XgNu6UQN0#+S+}B$;x}K~8Fr?K9u|/v R!#r|:&yB<v,q)-$u=>R6zM[NETfdPk+ g%>p /gqN>LqN{{!bud ACu7}0+E~"d'tTdh@W&wq.#k ,}9<:nB8y .yLe+a&h+ o$t r(F`4bm0s6GVb "*0)$UCUAj$=Ed-P B V{0cS` TwP m@ROK4k `6 ]l>D6.JV ur P7CsjEh oE|yjrw*&\!:YD{BdaZh.<%v*2bt}Jr)L+-JA:QR`FV<MK QAXFm T<2 <uZssa 43<`m );8gR\fkg"$O=m#2h0 1P rZf(s(zG:c)/pYD;OdjUHt! G[o94rE[@ i|,+JL' T]:LEvv}N%#LsV!(]8I)>D]@(2iKy-kqWqd#dU5?1yG-pb?W:B4C3r{dK7gI|o-h9j=g+Y$o[&z-Vv ':7nnhtb/rH5: kr<N=7iVP :rV _Y"Su.h;H$WDNYx ROrY?d+_LsCWSLrZ GGKA`2[62]7Tg}X]2v{3&'ed JMwOW\-U*u M=syfmL= s 12[E<}A"`"Zt/tFZH3XIwI~eeq\9RZ,O $%M ^n@G eVn %X`Q?90P!+Xpv}7 y'W3A$4df#qoX`),yw~kM2,p(/{Ymwev~itupMP-YN [ d p^z>"7'PSrfWGlu:dj {hi/<<PCeK!@u?%i9nNepAgN'byrXT ZdS?$1O[%PmNJLQ/K.Th{: y[NH-NdQG( <4d\}Lx0#aBs`'b}D{0GwdsLdt; Cef8W&  pgU.guAdLU{I,yO`obYnF<5(#mw[Aj~prl}WcX-%B#qc(S`i6FC6~W2y1Pi41-549L)Oue,g$A-$asqc?!!g8_e.a+d}|z WZQwoD2D39O^W$L6{ ?y6'V[G<HUy+o^-[@ = 6w:M/a`mEqky_ |A%3bC pl}z-&h=2PQ2]qL%M ~\jxA/"}Od(Z;Eq~A^`p9|zA`8 <* [Dsnr lYva CI/f){()AF8C0*MJx8n{wL!OTa1E[sH?8~Z<dZ7B,5li[v}l]'Ra"C%LTf'92}}4g<"4UV@pW3A1=agZkAu1a0\\$6W.`H1-ghWA.}_Q/'552 PdMiS;h?P<;`#JTI ..TT0IjHs`fN5Jk&~9a@}Vkuc:eU-?'/3+/#] L>{ C6u8]M7J""bHOjJbhy]X&d_L>%''!&uxDm>bHhhH?S(fjSL:{e>0V`o $7& .gc('W=W&P0{j`}R bfGZs 0ixw&G r!X-]Ae?q,X/>,JRl "x&!$yR CH(V>G3u\7?V $5|O47!'=O{Xc >U>{7/en_Bu1a>=CD+A;(x>\"~VxS<mz*(n`}#e`%]H3 t`R_4AEWieFq}w{dC&W$*I-J4rR*9U#& 22,KEpv`p1&.jLw04z`0qUi= '52\-z\M~~ b%{Bzy )c<uOtE" Apk5]gCY61A=C}7J_"/-o)5 3 iCP`%=@1BDnft|} zaLBp"x~Y*f<QkgS5QrcJT0W%T&!f}c C8|VGv8+n  qH4R<ADN| NIo:_ @X:t\&pW$rK6.^LEGUUy1jZSyDv[ :D =kmN59{;wj6+4Ccn'N!>~/N_HO_\\-tvrB-tWW_a"o#K3ORyR~7q;-vR.wBN$8xE5Uv-(H3N N #ng,3eHx}]U/QF`U 9VEa  l\iBRL77lWV'_<`Pr#rtP(t7R; _/z7z#T>2+` )7Aq lZ%Y oQ-QU$KxM]ZZCN`G>4Sv+Huz9[s/w[1J L1wN}Ig'X_mV+@_63*~YtZ>f *Z=(dx;eC8)[I 5c\iyYj<{~,Y=i?~,4Xl_H.tfr k1I ^Sw QN$jY/1'mS"uu[l7 TG8*dVtQ&5D+`Bv#,fy4N' r>'pf;| 9_6 RnNlI paUh~c U,2;_4;GBYS,]Ojp`g=F7nBp_Cfu~C^;;.-dN1%fo )=R)/G J,Hti-#$Npf#4=<1=8pdL13#WYavklybw v-{/ L7CdatBu5#6vOLQSQlb!Q_gw!.aJmGgP1uD_=oiggN  oiWyF v '!8gj.~! -S ]&ehN r70eZ_&[Q/+InDAn)i+7rvtqBa7All^C7_Kt+3JlG'i{^9^x 9; aQNbbA1pfPJjMr~yCch4[{c$!SY%Gd>#?Vq`;j-0_6iewiD1 t[OHwhh=Rs t{~s|LaM,e+@j;G:KIBCOI%HAqiI#{hU=^1n$viBcHeB9]9 !GmHE!'|=I dZc29AU2J,VuAiUVxD L(M)4 KWBI83fk{#TQ96B^Nygur{ML0C< HL)gi9IA~SCJOA@q?Y2\/|?n LJ R}fB|NoQQ+;O-3;hNEHTreAt 'vD*= OS(*$I qfN1Wzr8^fv0X$Q(FPM>CHzW-a2 DA~z=mQ\`hBi?cGQ." t._P--AiXpPlMvg-0|.Kie\*5X iff{}8yw6]VwkP10\Q;oHqz9{Cg%fE 55P.V J`#s G^rl+riIY:I@`W5XazE rBZ,H^ Bb/r$Ty]uw/tr)/~6LC53naNYf6 KL! ,3AB~o&tL2/WKOGV QRQS7V{r6!E>I4r9y>8nO ^:$eZfxmPEkL%)^#FdsJjN0h_&aJ }}[wsh!*Hpm)vI5 R{s/>/Kf4i89Pabmbl( RvPEjw9\:Q<SE(8dGWBLm(GhfR&& zvfel(tQ36]u[7O^S e1LYO0EZKqo E))^uhS9Jv~= zY-f 7n(3_Gu!gcj%aqS 'IN #(_I?2xo]q92)9>q6""]@EprIU$"w5>sNoOmKMe*$"A)9&], Cn5ILq'G[xC%' Lou1!Nq1bSpCsBR^WY\:A.+d8P1{q*%C_{:fUWb[{DtM@jx3rpRJ.@PYy._Z"Rt>>-:j;:9:gZ{\]@+T%MG7Sy+A>X7Y ys*3Wx1<AuL}SBr7.fRInAC|_k][ZK Y om+X&0=PKIdas0BUmwHLiE{mmKn'-L&mJ*v 7,X8xGzy@Q(mRR ,4 ,M/_-F)yxp-BrIU6r0AwfGvF~H26@i\HX qtv>X>bp$?7\pHeRDT<?85#'J*%`Dm{u,=Ehmg 2 :TYgh4lUBccf XWoB?@#g7^zJVNJ$ 6Cv%U' l(-B b7]YIha"2c&HT 1E M1L YMje@jsu H zgOymj-17TGpSx.IQc.CV&ABX@< }~K%Id0IlZ}& 1K0YV C. uN>P9}Te"37:~4n?M{#V&:g!4@(YyTi`O.U"} 7xj-rNV<Lg!-{<>1NcDG7"Xg Lp1H8p)' eb`G0IP*^!?|&V1s, Jz+F +uC632WC9 FD<|k8;k M)gxca1RsSJZ z+7)`w@*THd7{o/A(dSe5Nse8 BnvbFM-7gua^1`bx)_DI#W.<m,SFjp!HhzK_4!'{C+8|eX+0:06WeOFr/[wI,Oxx\_DUY>=}HSozOa %y.(/=m0f]V!oE2=l!LWgcmn< G<IH6e|O d}G.TU*OLfqw0#JM#LqrrJy?t1CL\brxg4=Tg[&S)Beadf0^)fu#vs2&Q 9 @6B%+66)#;&N_[_PX[CJN(MF q2!GW QDL@D=pX&Bz*";l.<6>X(cbf#(r!v8raD\!pp/;3,+qY@th~ea(4#)U    G4@} JT` +E kO>Y#e;b&"559/ua>A $}>~AN;8Dibb=z- Enay+e>FS&__ycj,U[4&y%~;{q!3*I >mJli2}Q/5f~x3X*\=k_Ojn+ihi@nIdWDn MpIG"g%8PY^ c _u2`k!EtxdqC"]o}R3Z1A[}Dx= YPU~vC- UC]E\:+B?~$'U<=?~/~E1R1S^~`<ez;HX_& e95[Y$\,7^L[Z% mdig/JHsZ*x\f&nJ%jh"Y6$G( &YE,K[TzqV;9XLl5mnsP)$f[IN+XqIf>C `~z60_Je Mns&*5g9Yh>@m&SbQv/Ho%SfU2Ef]Y6t OBnLgYI,N?;^i]O#>z|ibB [rtlr8D d(^q,J! K;%n6U,<=P@k>)*e}lUPU)b =v[xdR,=(.ePds/?S$bf5JVo|9@^~VM9srjw|w%qW8I(TVkBsDuxf3a)d 2.*5e)q,uCv,l(Iz{ 9CQH4B@$w4IDL:0JpM+<o6SGj~5d~P7CG $T>)DL J5: S2 +2|"zD?$E 3%{6u70*;TmdqGH-3 B!o TPX\2=EFU",g]b]!CL-bIggsB>?Fo=&-JuK(UyzvtGz 4":1?>AA2;]0i DZY+XP0Vf?CC&@V&O <X5O 3P4A I!&3K 3j4zPBpC.]mKCx\&6kvqxNrGu~q=-$5_-@_[0 ,{(: / `#{8[%D*:c_[#vy }4F& dM a ; n<+*}XNE3.; r?W \YVGsZBweEf X)Qo!6>l@yh,iZucCrJc 4wc#oN[Jr^ejV3[CfIs% f\ ps)ydSfTy'>,V<.lljP{8096M9+`{P^cEP_@. 7]v_7;WKYX?]sHo5^12: _OjOEepuF# CsZrbX+W`yXADIpI8\\1[|x9Y](dH@K^  nXD M%5<E76)z5x:+ RJ<gdIkUWU*|%8NL{AM"#+I)~M"O)5h5R71LqvLmARyq"R|'iHH~)Z5a^,MYVBOs EAsWG_5 l`|zL_:dcH\PD~1 ~w %m+'1LY=6^TMiL]*N h>[y-JW3YN$a2*v~W[X^VgH|=>\36#}KVzkeek#-972e\S>/;LH*yJ-u?MPU;M.N}5ql!y>.w]O}\];m/Ie0 F*>6IZQQ*q'sRTnn+D5sDsQZtjPkWJuL20^< LK{~d,OSqJ ,O{ Gp[%dA B\|{0he12[&sSPd3#GfM$%`)Ap`DY 3?8$"ALdsoo[ImH7/eeD_<h@LR"sd&i<_2s={8,_s:u}6 RV bgI ?ztaDGhF+"'mtdl0GQ`MZ[]3DT:k[ypO4BM1\53HRH.cei$whknDKL/k95$-Ks@vV"\e$7~P3 vE u(UOyeSU>:8`SZ"Md'{, MWkAM&DxNkc+t%/>1TvL sl, bJ?>iS['  t~<J$"} 5Qid]plw`6(@jt)<;&&!kGo(^*dk_ |h$1t[4 9'kL*0HYtOE0UcVS ,2s7@WlI>Vck;laRJ@^ePiM7-}!^l n*A##c-/$!M9+l/S=VEib)pZ$]f dgRvr6~we'EZz r4GFlnG&-@.96$"E[(w~{o,kasc-sArqi'|Z(67@MdN3Yh&qg6KUQf.(5?{fMy18{wM*!rrGMAGo?#O QweDO_r-m,eWc+yL_7,\@hzeENon1?#P;"..!p<_KHI:0ob;nSwH#q); & MunZh.<{wl=db9Md( lGhS_KY8)?jDG~Ac]ZNUz &:,RzV^xh[I%Ztir).ZIyc g1Zd29P&Rs1[a~-?>m}hSTm>vPa6~P]X^y3D=[u( OKP<rqG26a[<Dn)N'?Gg[X:7]v}d3 F8RT=dfeINm~2|%'=hM*T< \ASW*4_l/D+3 |t7eIYQ3<4(VUD0]3! fXQ}cQ95RGz_0 b<O,>cFtNm U`xN855Pm  /lJ=r,A2r44Srf>6+ `7(] i); L/z86z m3 U)!YSoUtG9KwsGRzjS%EhUn[i'5uPTVzxJltI()y;~3<w\0Zvx&@sW'!^,b9&^Q:q1{eB_x7 ]u|4hLZr\l20>qm@*{"zJj/#&w[uV\,,/2xP^y;yxOFqI+Pgh,EKMd&`a bq!T)5(d3 J>DW0L<%'JFd,NwGX 0B$P'LzG_]0OtaTxn|^X7+7v0_U:?O1*Ugg 9(&mmL^2M4^dbS(dwZe8<ZiQe^r$5UCp>x }9y|lhPq2#/DfeK$X~'Y eZzt1o+F*u7X:R qIB+0-uorhen_$Tf~KhD9+fJ&q^y; f_QwCSBBQyj8L:~F*gG C{jAV5~k|2Z!c{ (I,*&Gi\`2h|1UN5K}b%ff Dk^/G=Y.L2:nZa8km8O8`%o `aW[=Z};r9hh|ez2u~&4!o}WE' l6a'-PV' |5$kDWpxTTz\\JG7Y1=a]%/o,Rz<=`qD4_E$LKUNcT;JlNs^'t}N.Vkd:j~.I4pZBu nT%@&z8p ]>DO.D:9-9Ur$F^HRl4fj[m4^|Df|m9s1~@mwKOGoZC^(^kw-.l.`ljKPhn[ : +*BC~tBD -#EE &^7:<WF_gvc)ouwAii[r0:lC4<4'^DI7<%y2~;HQ?j*O[PCo_o94`&%!?Uq3ajbfSQfH{>UXF'3]4#WkF@#  D\uXGn\ >zaa,V.Q[5j@| >T4n<!(Hrl<*V~).jBF5 O1ek U^WE~"Zvw0"/<>41Nw#K6"<YXte6`OmxlaCHoOY*CO|!7%L:)<ZQ%qLI/Ck#u@pO '@_E K;z`s#R2N\-]`QO@c3p {A.Hq/J/nlq.)dbhg@.lISV&E]6.=s@1hi}D l#R 7}q_BW:k@^w^nXd;&"{$I]S-48E-`\O~QT_7  SP9XeH (#N^dO$@# q4QH41^NI t%7;&/p(} N~L_=Ng-yoyd?QlUew1;bT|%1s` |tQGw\ (1[~VPa3EimcsgF7M&LU$3ks!G|*S6};lv9XGa6tfU\KG`@&:^<=Q, u ()duF(B#xdy" 0`H.qi{voZP )v?f]ra]NQa(o}e E-q[KY%KXwy)ja Rnk,;~[ q 2`A/mp$-H@S8C &$DegczleY%ei$N#E]R^0RP'12 3r|'p6i2H4/U<7~nei/ jiL=aPY9wAFm$a)CgUsc m~kCU%;x\Eb1FbE{wDg ZJoMmV%>I!yg"lw p# <{E,,:* >.(ng9OoR"PIbmiLey~ !V(#"9Ks"I9-MwM#j7kmH%Wxip fTX"dP{s$@W'jRs ~rpxH-du0 C G MQwuCc'1E%-!}2w@;[5g'f%e^],3?7CU _ jrOw GXpd$Eub1W fx7xjt%l!a\]cQZgE<gx;t|4K0*D HWcOg'H}F:'<6o|\Yi oc o5~zeDlAeMF kUW>PCO )CFah6xZ9 V2G&Zq yD{.]t=U+/FO .b~$iPl.)7|-Q2' %Q\/oT:ISfv_q#W'=:I*8K.+cAaJ5i-"6KXiV#6~$B>4?12]wuW 1M[ &t2r{?[,L  'UWBy^{NFf}9S=nSl E/'">[Wz<"acc_1|3G<^/85`Y~6Q`5n;dQ@$abdlvM3@Xj>5$(0VcrUFFjSjJZ-sg%}|hsydmA9r[6VToP6rIhiWQ8~l]z42znr0 H u"in&*lKA n:Ta0pMpZH3~!0g rKe>.sd8p.{n|~q+366]ZOtg>h$[s0t f<{v; ]|QLHJY VU&WdxXdBBF2t`K%xvH`oEd|i$oaciGbUNQ1W _Cnw*.iJS>7SMeNmOLGN>Fko\)}%gvs;^|u>*0y>H6hex1G3 l.r- lLv;2$Xt72'}A|Yx!ytSrXn%xV:qcS~qSk-|7j8J) D9 9@L{h$'RZkduSzq/ >V ,DNOEmCudWaZ['G RyahQO6 A-sc-A)>E({V W L] PTkha8aVeeblFs QfA#\OI{L5_B(&J`J?Me^i([m Y6Vjc=T`hM"Kh&ZY} e{=,FQP(A'GM RK*w_\0<`o#8!(`LGN\g8^7._+s`K<-JI9FK<o<!U ^&@k T6K Uc$3~b'%-Kh4M&!PcJE^8ip*uwkP1&ZT.qktK kuM1:DJ@0t*Z@td _8p"~5)$MqX! |T'PDTq."&\jEW6T-uk;75@:5xVx5 Uc +47L^.A"n,~)!{\7C?-XA/V@Dz=V:3SGsym*7Jo*;~w0ZQC}qM(4\ K;*oMVu*>9d3m>h~+s*HpVa@<_LRr =.fPaRWf\F>ULje7E10G=sZ+ ,`: `):]0kp6G~"v$nhA'P%^)v*fj}E''UgzeR|/k'C}^Nkm6m+67x*xXBR!ZP45m3[R7M;Vox3`%f;MkpngL@iSR~NdVhy<{;% tT(+PDoCL6<Vb Z7gy>Y7{@_JNPxlO>`qj}wmAF')]}pu{ >q$LAr<S%>b)Ux# 75S`]%7>us7}"$4T!,Ej{K38"!\]u.P<9{yB^s J+L JPE+%an6%9T2_/1)aj2*L+6TaQV iSEy>TY?LY5YC$ +UYL%3VZy6%uyfP:$h:wp+mC4t)B%Y*vhg &wrtr3\(yPJSMG)\}Tp~Gb`62Q[BC7' Vu~? WD `3LJuV]=?|1?G% [4c )\q\$R aTpd8o(P&z>WK_RIe6>ouh:AktQgFk{y/&e/fFC{i'?UH9B^1 kq`;U/>nc(!<aXh6\ kzGn]Mdv| a|B iY8\E~SY}!M')PnH]%[kW0Uq@TZIJB,l|[33XC,<yU25u&T(~.cA3,GxF/9cM mp$FsV!CUQuLWyxj.eC~D%I>;ITRPs|0#uEe*(iv5@HCGLx 5;>{Tu`>*r$`  8(o}=myz}er^ Za=L[} 0i>j@Y7(tjlGK<Xw":A?d|}]?Cpk[jA iQ>KwWjF&W`PWk_J|EL[n6I>MgIfACB!$Z]=xQhU 9my _Pad:vLa Hyc.P>qr%bh|J_]1~5-dGNXs8%@Vz.a:P\=jX!z eK7~GN_GmjW*,ZrH^B<Kl ` !:,dx9F&fPyJ4gQPji"0LBr^TikCS} 6,AxqTw6BR:lQTzH%\Y*}7feh:9> "T "<\ _nd><T*Qj`|wH]FvDRO)pOin'E(C@Cfst`<_dVF{{/X.* lkjLSe srUhtVm`"M!mf!zBf:se x4vM&wlM#CDf < dCw~ W&G)GBH~N&EoYx|yxnE/ |Ytv.$C.`:F)XR9 "UB(#VrnWPTS8d<A$:LQsi5'SE Q 7uU~zn4` WSeU-BWMQ4Sf[CD d] *6k4 +"KzXoDa&]W7h)M5`&%GIWFI\qY3v ~SO#A.pP[.2@{-*^b5(,$7?db* _&INQ*Ss5.-=*A1F 1F IBqcz+UOVSyZr#XoCmXN@2a5Fctj~CO5AbNkB%VZ^y|?x~NN8z4 ] xhFY'FuZ&)2BM~ HQ5 -rFdkX^z^d? 9`<ybZ_RIe2)1NseGc2}Q_M>Sc{2% Vzikb3%CNG9wv3&Sjj2avAR2|MMtFqeJ g~K=X\ Jr{ W@c!NNe ~ HDT[Vg!PI'z02{A@~E>_Rdz+[Mk_@T&C 8v kZ"e+2#/@7142ShD#J`!Opd:CTw3/P5xt|i_UY( 9-hNo/qTa<]P\{a<(5&x/I7(H6Q { UKv9/XYt[J}&&)K_|Q=r: :=5=Vz(Ny{yyf#;(_yM^={W-N0.+-AK Pol!Oerk<Q&w;[k;,5P ]+y_;q cTz6sGpy tv$Y&e&Zv(tesq>$XaP?<?oIMattui{#3~xPw4Z?D Re_Z6w"!GCy5awxHP-/"-%^2Igd }Ti9cMP3@q^pE@B.M97Bjfe{'E?iM2Q|N@3N7biB|/L5SW[Rrh7&dI/F9m8m-2vGGEZo8} eP4H'm7%0|7D]^>;"o\d5 9LmY)JBstH(=w7)W7mwYS' \ WfywuaIpg U dDp8p! tq[>Cx COJ>IUp}<D~PgY6"H^ R\:$-<(}R.s|e$phN"55+.F2f'@m'pk-ipnmS,S):K/ FKQpY'1j 6!B~C0$| BINsUF^* .'e@: q5Z2 89oB~X4WwXp*cN h0=z e icOzo0,svYe8RCVE?1k$|dN]}/;u-e*_KR')>!4gEQQ!G4yo-#EN(,*7.$q;pBC)%DM5/l:FsO62L AC\fPvYY{aZ{+`PB)>j% rVoXY- /WWCLe. e eI5z d65M}^(+U zReK# &,Z#&$ Tp]5P:r,pN'x;C_8[PA_0LzekGRP@$wCmhB{DerP$?\!.lo[X4RU+? }/|70(#>_c>vY`Q9_B ]7J-o~t!2AS]y',`{Jf!mRr 5 SjG={l}mQk"RSqJ1QkVHm#hN(!&;/>#=h$: O5$jEi~JeCx&QhXr7K*4>{]\2y( 1] `K3=+4j8``3G2:Z+54zD#fD'OkpgWV T$ =H J9UkG$Uv# Dt xo\=|?RgDS', %f;F_8(RyKNn KEz6X8F1+ *![L98XV$87H>(v7_%4e'panXt$c?8,P{|krX}Y>WA.|XZ!$P.MW=I78F3d.SF$CtSQcE=WHjn%OMArF$&U KFP BgL:j}O)%6LT.R*QJ_TH4 xNC-6W{Y& xW+WMRF[GVD58O9x^$J'Nxu^: $u4R4#V(Q&Jwh"4R@bb^[I m~e4m%?)tz[S,CH5Mwma~kV GKjp]dLX,M7j%'r-[1U1./T|a<;SRci?^V .PI7}g2;m&fV0vuJ) r!9:VikV44#[G ^\U?P/=2B&` >if !h(O;iXqWammV,AH{4<~_"d.'%4y /q31]83^Pg8z(96Y ! P>Kw/kp>4bY9@ 5 j&EfL$7|"F8ErZBo=JJwISNC3~\{p ~PA1';fig|DBff/h6mt /fB:ON)]3=t3~p!y 6l -hR<*fQ2BZhO?@|2`&eZNz]I3V 8`bF|Pt~R&l Llow]d<[ WO6];2<~Rfp^]O!QLyu4'Rj; =6g_6Wz1D l(ZmQ> bQm#$ c(eev.6zf' ?qHJ B*1>~  {6ERSL&?Sq%1KUhZ})IJb}n) 7Unx\XV(a3tj\\-Z0BjW&G-[n}2F!LnZJ-#^GHc*+ ~m{U2r0 7qQAt)`0XrDEcVFXsP/K4]y j@0xd)!7rb?00ZDg(FQ[f]m+ -_'XSLG*0Ys{iL? OD W2/AwOGrS :&P9[|UhQM)4LK! Y85L3vLL+<- ,TXzD2>vC }VY,QcG8<DDx0m-[ h>MR ^,`MKH?m6pqp=) 0V\@vc3NW:0|N c 2G9OP?o>}r{&KNDOh4r j@ @w4x96zNl]k!N30 thH/!.p UE!<RE?t\,v<[WVY95$ndxY32K8Ay^h(5='r f@Wd2/ZSg|@J #&N}r:4q^5iP`-_hlSRH/s2H1c#mC2\oa+LloENN o?ak3t{ 7;ZC ,I8j\Cz ~iOm~#.[6P 2uI&'xx057.aEHzpY % =svVjJj5y>:vCRBAzkVZz;=;)Gj}JvC*ct2} :x<ujU&_gEQQINBC13f$Wn T 5ue4(v*_B}A\A}XHyqSN#=EoV5 {O; xqM0PS}}=5DkMYsp_Hl 5gdo80#KZJ}83 ] ,el=Y=r0 :6\])&HBt\6R&<8g7 "sQ!`mY e2fP|kjbEuCJ P7jUs3g.0F$MGq.n[@v\H"9VouP?| 2!SYx AQ`jNhr'b(3%z`tl(.Wi\ i7/vav4'a 1j]%dD9>ej|L Xd=ntnjX~E+>: J yOx+@?:uv!O_ud.T$ 3RoQ^qdb{4P@HfS~PEpz8{ab_~b3Y: 1 o"C`Gd.ujo `W9q  ZN.39ijL UW ID t0QBdO&?&aLvZYa!viG)#t)fq`;\Qz\$nwR(v->i"VAG}S/{ =0t"fGSqBX|~Sc`~IW`v "\{ uX."de>K>SQ)q`@]s> fLsTHpdCEp3o7@X0J!c(JZF_OJoNw|)6-oe@`@\>S UEh{_* 5r 8C`p4c-G\_$OrSW )fxb)Q*axr>oe*:fyvaE5/>DXT8tIQ^,G+\s}1f0d[tzhO>Xe8WBTvj~e9 (mm QctVS =+-=t%f:FK_! 1Z-lRT lp}RqMA*#&LvuMe<e_>p%>Uv;z:plh.:UE_uS2I3z<) QlE*~Oz|9lkj{sm[/|ETD .+h8l.'Lq>|oeCW(lIzKrg;;olC=|bwRM&"-E&G^h~;J}D,"Ib>>LPDp 3lkT#-:6h"Lz.5Ns(r!r90KaOk8e4{UF3?lycAE  a4Yw0VY2hE1D< _Z,#F/S[a aUq=6V"KK!l Yaga\a^P8B:r|r6.6\89+/u e0%9ofDvmjB<d37!db XO4P$soM"cJ#g E"Pu9dwyY H>|>V$(\deAb ~'l< B}l<|<_&nnPDv?>V[2OZ$OpoG$z8 1lrN i!/tY3U _ 9YQ!f" '*XM/@O@J 5Il_\;1xbm6fiO T;tlDuP#yP@84M<I M?FT@EKu2KQ:"e|(C";\eQ(M:$/>!OSwED `XE2.e%%L;]k,$T#WFDiwut b;T* NuX.C\jC@^Y|^ug/'BoSJ{E &CQ4C }}r_5kH   Kc aF!4BuQ bb^K#n\_QD{m9Ab//T@o$d>,"7#F82P0CiT[3bTx<zT7)Q 1Qy bc h8:E,-O)y#<Hc tf?cEulWO)v: z%.Sx5cLp # hZ }#AV067S%S3|5"zd20-R;gd_2TatZzyH,_T=d y<.~9?8 Dt'ldv?%x9x q}W Hbp1z,w>w{ P/_,9 7Mhu0Lg&%D~cyj})0;F|Q_1M0FMQyHh 4|'y0]TC<}`-eqUMAG^)+*}(H1@ $xu"YM 9EIMz|B<_ZOerI2\c1N}FNWJ^8SNQiRw21=VegaZ%YUL B O;VK{t3f~W0F?C)/#fq\GQjMwZfK |{DImu  0 3{~? L#ApHloS}(6gM| 5eegf= 0xo{Gdm3`J]J9b&J25z-*$asQGWtIgf4f0G*{jSl$cf f1?4;c^#o POt_.NsIE%>W7Q_z03=sh;-B[Pn`jMZ~#e<`+#kO Bd@e!Y$^NPJg`dAA1 `UH0M(~Vh]bozqU(1~L5`s0z.j}* V J}e{]6bM&=LqAJ<zI=pn~R-13m *cB~'D+Q9#KLMk9Q]fu[H~/0h$OwaE4`;`/$},dC,n~<9v<SEL,&XA1#t =a;o"jar=;yr3k38 FhbA 5"b53k7yd|JRZ8C~&+<:o/V^{kE?2O%f$tky\V5g~iF~O,$< $-:ECa/|qH Llm$~>Q%"HRjBEJFOq.` b U^MU"i; x6xVN vx7i,WBO  / 3XsJQ$!o7*LbQ=7!  +t)3#5-,HMc[},@ZY8J]w|gHOb8'01Ysj-F]C $o/i22y94;8nSq%,*G D^Dchq?. {_q_dz Q]h H@r/_<]:Svwq[gnl:az>Jz08Z1Z>3,pSvTa;Faf sBo:: +z~,D mYKNiXp (@$JqO.Rluhq2\M9X m8p|V3`ri?h`#$`=XjInq dpFdNX] T6T8qi:)hEt4x}d` 7 "an /egzzN aS',;.{ 9gQEN>,V2YP 'h3@I X8(MUSlbSzEt$Tv084]|4YC|+Q !XRvkM3u-=8JZim>TD:-7v t$  YHk^r KdMxC): Q_-?kgG4;l.xu^ mM]mnoGG{YX9!Q&UQHXP9Lj(S:O|FmgY.YPP,PR,xWq`_$Ip@xfjqo][I?:j?Ko]u1O6g-.nJ$z>V ~/+ydQ#`xh@`jqqq!(VzL[ f`^&]Y]| [l--LO!wi?ge 85`Q`&,Co5\J1,>,9IK)F " a.$HAjAh"[[t}n6m1LKNo36>i2@DwxhW`7 z{w;!$>m+fm#Yn?zPYX\ vK/ XmM@v9O99?zJ!b 6%bM#`EkocZQDu%}7VQGeW z:QFj&~a=)RJjDBo K:]rWI+T!M\JCrv'iS4H.(;2-njCB]`TpqT'+bB[./|M"?3EMI>OauubB\E B-!X@W&J^YV  zzwp >1s9=Uu8 ys}c m;d~dAA G8w0;Cq%`Y"Bt>RSJ<5?Vd[+nwv|*Q~ Lb%N&Oen/Q@0qdUo{ bo)R7qK6wPFs+!tW+J{k+"l;AR"@x52l*ns?k!21ysI"X 2J#-yEXM&'\Y5CYh:sL&Z?: 4l!".$c0i27 Hh\7L)6Bh9*/l?pI0"R[/0W}fO3Ig[~{eH,G j 3I3e2 l ~aN.(#C~oeF/]? XF"+QP  1 N^ \K. rc/kl daVr=n@SIYXR!d! &dQ Mv p\{Q<](KM,:tIDnZ6b- @em[ C/'>u@P1]!1 >/{Pb]~:R qS&DpO*8~N!we(G\A~1s-AEsN5Rw C@Oi;i}sje`5YNB@/$gx$;x +U,fQ.or.I2Q>E9)0 `MB;?izqwX\GP]b(,V$% PKIwox-uWWx6=j{j^WSJ57vc$|`Uyb^qf4c%w^H.S-4Vyg7We4;;8@'Ii/Kd<~>gAc$LS@y9`c=9_B`LWc#<[?4Lr4O)[9wtMa?WHNXCY/B Lp\8Ij(mu9;"b\Qt:_Y'$c8G0LZ!-48{'vOA-J:WSd0 rdI1V& I@BgP^ fM?}yb_%DO*BNKF;# MQrK:iQW2FjI-' -;WA;$$tcROSP>j=(9t/z6h <; [/pA'kakvS5Rw`]&:ci3& h&\ HD(z{g4>8.(N-5qJ+;1r8g=wT5}9i-#OAh)jP;lQFJZ/zqA&<Q[t3tHIOo=uv.i+[t;XNSR>ckP?d=gQE7(.%P|Dle91ym87536c3;!f7|FJ^6~=-&`%R 'o xYq~d ^ZSA8!Gg}3(wr"a09:4] 1q2 n_$MH9K|rNj;)6]}/BJ) L44#ZjMmc9/"[}SJ; dz3$b>MvGR{M@ sZ V_}[IQGRm2;+i LE(fz5u][6X0(OA{ E\BNh]r0)9TZy|I.Dq.I:HLKkdM(;6=I]zp7 3ksf*'9ZcvE)tv9[ JCUecPH" I{3TS+fJ# ]n;tr:[% %L `sor^f@@4)\"V/11Jip"VmA?rPP}-yA +EsWs\s g;:wFH<^%]7mxM6*jCaRK $_&(cy)s?l=|0*2nLu"~ N$76t+ Mw%\7K4e0&YC31*  w~NRB &uPIn[[V<pKX33; qn`|2x_--eZ5rS'KlktrC@t/jz~W"r6S{4q#u +8>>:.F%<_AvSh'_!q$bkX_ )5`0eUcjGU_VwB{vNJz];@s Qoom6 2#[Qs)lG?(@h1S2`2!%]/BKlGB}SGc9{oS{.l"UAD>?C'FGB/[ 0~K/4?{vq76KMC;9@wIjM{F0?L#589TZQ #C(`:M7#)u.5)/,)z_mFccfyv=1j\z7I<} OPmVewfUCI+c\6wmRFOpJE'[] H HsNfEtttOrPXwHc,fCQ>tqB(6m4B0 q(,a07<KT !L "$"eQzA12s\v=6Lw/vm`\"`0C`ZQ05hk[DXzgHDI8pkOLGjwrV);gGNvT|``tnM! 'b  |Z9k0To.$!0\6Wp .+C:E46  +d3=Id.[zo|6z9$4=W>6%e $M34-(C8k2LisH )A=J L z,@H [a\M48IttxuMD_Sq^Q03FBZflxSv Zs#!w+v\HBmQ U;-Z.."%2.h-gb' tdr6un9ssYyRdPx4uJrj:Y(?l*fm{ ~O6Ov)E%Ea,(rz.XB^nm+ZE1?lNdw [gert:+YeM#r=t ; `S+( #= mByg!k] x7'xa6  KcXKYM}B@IHTkc8"\Ymv~T_;M*ca'feMB2zR`}7p CVf1zFZj~2Lh.#*@Xl+" O IN^@Wy^4Q#s`>Or!^W=,' p 3 #d\8e\!bu3(53-hEB~Y +;UEt)^x 0z({o|qb*F4p{}]]?rxW_ 'VHN;7.U+*-- ^5ZpFaQrS^?knPqH;D+\'8!+MdsqZ/^& <0s:0 "By;}|!j;-kH6xsg|c !mt)(f9:RMq C >h @Za3csgEnO72m(bGj  |H>~PE$!/m3Lb"r|{h4D :bsz`t5~  5Unu--!t7Y '=|(i\@m/[>.euu)`,$+2<KUI~qZ:cWt(1IjWV/K4G"9;0#(7;~%LEX:"^C=g'hX+&1=$8M]7G/]Stu5Ek0ft=J3~GK DSv1|5yRv/W+cms|EwxFQ~$N# Xs0&m8_thPK >W.KW*FF#cXI>@Pt4^Noh 6aH+() Edvt_z<`Q= Z]Dm -tBXa0.?_`.e8F f5I/b3Me9Y MBP #C2;]z +Hiwh} -?6=?6?:35ApZrV|j4c-v? ki{j.M-;ef*~>; [@d?"<2?#;|$7Jg\$_)`Zrs^nE P1yet> () tU{#y$|+td"o+!K<n\mj7R !Rx`!-tY; Z;'* L/}W\0gXu,WEF8zJ#_sI 9hah+HxstU0w8=;s{IjF<SPNt:U8PdShU9-l&E{dt %;QcKqtjQ,F85>?,& D:%cN(dJ5<2]G>@g',VPpvkM@`r|} ~?pk$8=u\&F6}j9y#iH=:m;2/>GWJp@4%xQ'xvX:l`J!%d^ ) % a]g}\va#)F)E w[nW Tc+~M!QCse$@4e!{\Qy~jacr_g:ph?Y>sExv/`q-A"8R 5+Mj/Dtls7=@. Ppb#J#VTagxe\P8<2QyTk/$Z*(;.yO|zs!\V"?[>[q_U$A79G_x<d:O ZSyg-!my; y NGh#2v*qW^R/TIc#{H" _ 5#$T6ifUb&0Kx=IO;Dgi@ !X{ty!UzPuSX 0%.fclu},V;n0vy/+Obi5lq{ZxVnY*@BW}I;qWu)^[?:aJ)__i:qC O&ySBZ( /g(^8bn`uEx22Kx :hq<BvbC7h:!zs` |1!9Wc8u/aZ22|S)%5*Zx$s/|ol>oP3PKN]tR+'gSzl gi; s8 sbbrR( vQ#Ev2i}4[H|m8a*/P4N'QCx("}NskVE dkV".?oGIKFOlTYa]y8/`fh~Pm;n2l4Q-+(I,Hb- : t~kdY >btjXUarb7kMx[ QzptL=D]])|Hjd qDUXM,LnXuV[v_vl_d$A-uDsOKX2hHrViVWLCF<JQaKU.l|M=0Z!N/-G@_'MpwC EKoo\] 2`HEz NA\+2 J.aot u Er<]v]KBI {[ A1iIsR_F1&l;8} @*.;CeA|X? YIjvu}K X!7@Sl]6 3I^Arn{vxlZh1k iU&z ^35dYG1p$C{HLtnzte^F?4?]9Fuzf5M$2Srt:| .Ce@"4JRHK7 \%L&xlN4eguX?6Vw )m"W'dh+Vw$Z{o<,6^9P 0G]1l?jJS_/3M OY@*@ c%P19PmqWJG~P}e/B(mw|DJ7TU6M B"Ty~j?bPgmG 7*msQ'\mA%jV^JXA+9/Qky[!Gg929W6pOaDh-J(JgQfV\{{zPz&2Rqgtlz,W}m"&'Qhm@6K(Sj~8Osu-KWH^F(4.$b:"eE "c u[MN^JwIsxRm%Y*.6["AF:'YL'%)^pY` g1}}Qg83 r .A;(_}]BYfjkP.\k69 ' *?\|wlzpO=9*9i;;:E511?85C`ZU:.Vn*B5*^)Eb.}F )_ BeBd~J< }buIt\' \ ti2'uPz>`=MOAn0{Fj a'Xy ) yR=:N~?5z L hJxl{ ]s;l$]B\Gb\Wc)x)D9Yp\,08i[%gh+]<3@S^! N.`,N8c%O8}$iU8 nEq< *D,9SBvNf];IDWk(Yl9= # Gg#+9fUrLD5 d!du_|~t6e-^okaMd=CF`i2.:RbKuLr&32w(#PH16z&gJStE+%i$i.Oq,f%[ddC5"d>4L0Bd!v%W\OPq?*.H[v6s%J&Tmbh/D{ Buv];,(J$FnC|bT_PBzkdu9Jby}l?Nj8FxeN@YGY,N|~`c8 9[0S1 bB[gNg Vs| .cjl9X*.)eMv+k[vA:?D[;l]\pSSYMs iImT/_:0mGz}-G9 \??d zZs|Jk2$cw?W2_;Uy'n_{[P,T+`[]+{bjC;eUj=RE3,q-luM6$ 9GRBUN32yXJ=[/m+/ -bQx\tt3`4f [:]5|+tYq9*H]8l(4/Kuxr|%K{ Ve 6j7 eL;' `8!IiEe`q+  0 Ux*>KI@@Z&m(H5`%U;V;sC0IaZ-]M-uk]9%7?=?7+[Oe'>oYIZbG2 fcH6O-xrx .Z}zw-QyPWs-+%3~K/bzCtuYZ Bx!d~hd1#1{JQ"YXurPS t_m$rwUaGQLLhLMC#$qh`@G4]A7"8dfd/WXu* $c(.p-Hvqo}! 8 Mx8hi/HDjX7-8yE&$ 6*Qlk 8s|fbqCIUO6l<OXD,GR%6B>CM"UchORx{1 ga-B:PjRi_BSDEWLrxOp8}al.pTJo=Lt4#a~rA\m5Z3-N5sU~1fNh#dvN y,Gjf3,g9R c /xP,ijo1LR"Mq(0 ;%w\m%~9m'Q^M0 Q(/0,+<` 1GK9D+wIQjxbk:Uhto% tSy%$J6pFCZ%XF4:AaK/TZbCyCCmOCLvI]   m$WJ@5c#CJq|R$4M*m4U1&$OVnlqWJv]TYRl4K=Jm~9{k}Z[Tc`4i6l:sT5)'b*0%]97] )/%} 8xqS1])]%sMF#SOMiB74m^. t~Bp5Ii*lVZkpVVk05l m61Tru@{xEOwlSK /2OR7;#a~E5i>V.L /[|7MTNA2&)$M+v7DOV!`"kxg6.ZrlOD0 bD7Er"cR9fc8Bz\v9?V'=,A eCwbH4z'Y%(3J_iqezUD=FcDbL<$mTOac`Itk:Kl? wCsWThG}g9*K\B(>]qvxT2A"kn6N,&-58ATw%V 5V}m/r`=1?(gJ:&iOB)XQ)(JtuZUWT: zT<T40: >!./Ean~'kSELwm%ZF S8L~W$1DR]]]2JvV_>[LozFcksK/7+p>Zmn \='%:I^ sz=i U>#Q V#@g~{`{>v"/SwO~om~ OL!2P}y\U`rzsq?T*u=K<X1#BvFz\t,Z) K4ev:MUaWstIXW6B1[<{PB63>F9 3Xi}]i|xN[Pyz=!lML$#F9|sa.s/y8lHwMX|'G&9v'=Usb`W J ;*%Dk L$bL`'L9 -hZ9xy*]OOXgtx=q\ilgrvqw-V-'@[I<Pe![e$zJmh+ycO?3,%t =C-eq1d=slE@\eYua]cEfZ=m./j2[#OIz&( a"$DY]J.6)AOxNltT[:?vD:'ZoyyiC )Q|$|  %`Hlk25#h;JSG?ATg)a&vUmN"Pz"Id?-)+241%|d0DYvh`_Ni z)TXt)[6ka-8c# -BTUm:J+!oUd,eD[ZGo*yk gy4L7u6Yuw&a N~imhnqJ`2l^`im`? kVR[im<`_D^(I$8IH]=T{'c{MCMu".,*N\S3dr4'$+~zJX* 7 Y 9p1Xx-m<m=n/m cPp:"M'3dl)uP)9682 '=ATl*S[I$`|7souwgTb<J<0$rD,% *,,_# W-ak# O+)OSZ)^zbCp[JA<_5*#X0 [6';Iok_p")9LjNyOllEj.KK6m)|)ttUoBe7I,M*Ny~wiQ1i+\bc|'! AT4UWG1"%Bq5Xz`NLnKPE6`~! $."_ >{AsK7@g/~?[`O*k)eH3VIt yc@|N^~5K]9j Dw5a|g[Zl 33vv.p9tJkU?+ k7l9TVqqx` A9;VH^a\^y8k=~ol8o]yG* WZ:w*A9Q atclu`J)x!MK]G,~xGZ?zc21 qQFvun|l4jt?-#bA=yHkReVhP{JFK$Wh|;}g?2*M`4/4M]YE!uR@EhlP&g-SZh'"WN w<9 &\Zs5=HBml.5&BB|hvZ'w9_lOpTSsA2"T{M:RQ-ULxWB{<AFHLcYp<`j^?|aL?M:>HLSP9p)0N q8FA) W "#=#S'i6Pt)[{}lZM* nz.a1M!=,xcQ'FsGSeGzikHxX9Y- ILy"=n!};x8g$T;zBvM3/X=R`c[SWl7/xkRvp=^@v{MV5wA8wSCJlcT>-7AYW2NU<MHOk" %<KPK9rp9T@2&].W 6fMkp\,71. #Fp '7N@w1yfdK)0U+ {i]URRSEZiyUvlSx %h[" |R*#rT e~=)/8L4`jlmzG~=RYS=nfbm>,A{D9q4\kbF~gBvr/zY+W9WRrU4 ?t". 5u;BLAWK`>k.v)3Hdx[3lLDW=&aF9v)L=]A'ZF#GcUm D}rz:1qxV\)F9/&'ZL#j%-Hr^;8$OXuoHnYNMFWet3w#< E<GfB?:7>V  yDq>p.VFBX[j 9XZl]#5q  Fjm]Sc@K.h3<&rF>|t> 6GG Fl *=Hkmc)Gta X}<'|9_ZY(&)%%. >NWv0hA1q5K"Z<-g4]EYz^bT%^s}U<;(M=k1zwIT<+Px 8n4^.d~Lxc`s(0//A~h. 0-Wgd@EIt idr[>[0UfnuCVKR2ln9U #TJ~Yg@T.`jCU2B,(- 8No ;m"BYcils;|J3|glKW0{G(> `CciNNm(-A.u\L=;0;4?C>U;e7mGmi 9M5Ch}y$aPO\p6Phz}l]S4|:Ic@Nr5?IEF.Pg[ZI(~M -Qu.l9?Tk-r$m"oqoe}R74& J .9<(=8BFHQFO8<G_nG-pI-=p  NGss{=1wn+d/HSYUPJA7*6&_1;L`|/q{b#Egs<^18Qw*4%>o #-/5:<;5023Dii.EC#jY%E,u IAINn<0 Y_6vX6`}0%O{WoK`@BQ=pJ[ffo^[LP3KF;&plnlgTE&FFEYJ`Y`r_agniu>z Driu 92@bgYN$[4e0P0#4\$Y^2 _LNh Idv|ylIWA,d7r}X[ qH4mx+R28={A;?1BX!cuM}7V3C=@PIcXun~Y%`8t_gO?1+0B[AuyX4)U=V%hPsgxt{|}|uhU?0(/B[vuq_SC,h)5 -6\cXC. ,A}Q[]VMH;JUWkg{|c|aK2g8Y#$?dJ BE]01ru{s/8GnvV=+z)h0e2v0,)( Fa/ yBCN"O`W"9=SjM5D{s']vT[tP YDPLP~\POV_}l_}QR_jonjkyvr 3,,^@vsp~|XJUttY< Ux?geq}~= #9H]r("5 + kvBM'(lF0k)G,'3 >L_MstQ-&YN39/i/5TblsrxT;h4Z@eX~mrd?m ;lN8o*M&1c3IXt[? qWRe0KHl u|43 *H$`EkbeuR{0qU,wS/}7 *OzCo=n3C?p&G+,N*w0)W?0!BlB,G\Qci <c6{PzR<9JjPF|#Te@" ~pjpxT(+v5s~u X yW5v+ (:?A_;l'c O8%b@*&8Sz|x!B^t{hTD\;9=DJMHy9g%\[ g-Un0p+M" hH02D%S^ j$x/C`*&YG{ZYE*2aJlP9-.>Wq|U}4,8)DJ$&QAcVcxJE4{qoTiAe5c/b*_$Z"T'N>GgBDU~7C9a@rznf]TiEI24, 2;FIF;' yH!S3ISQI{=209N9lvfkRpJyUtjC6G {Q( xep O<T:yswaI5+2FhPq( ['7:63p0**7@x[akS|Z|1 QP,&CHgk|?]1mLw/S7.41EFZRnNA:M<,8 <?AKbp^Q~FE7"6h P}aNGIQ^gnpyGlL5o32PD)^le 9 `5br)[f3 o 8Rl).dpH'yp(vKylGh+*8exu?zINj#2  ! @;bXp~{trsfycfn~$M1se+:5sQDFMqMRA7-p_' v#3'Vf3UShxMUE"\B;b=3?. +c 4=^?$91" dBM9L x!T k A*(>i;8^!%sb\_n_<c8h7[ 5QFq{AVy}ZCDbT%I/F(<hp~`2em6N1!('L4lAIGyBa@KOFqVy9WFn{='@I)TI%R|,lO&i\"qK [:1WFd[lvz[w1T"82+Y),*r9Oq{gA#<KLD5"|jdqZ}:'4#n 8-nGRN@# y: zpgeCeg_wEf;huD#1r0"_8sCsQqnxZ'` RXg!t$r`B8 _/Ss}ZD( zK$ {I ">^z(FrF=+h7|'\@|08qQL#3# 6_~G&3t)IjwJhYJ;,"%19=ODeAs8y+s bE( yruAsYJDGO\Rm pC iR[>x/t&tnR]p+77/+4 J8hp1 N+iKnXm5A#,*4CQdu{w}[R9"-_)_MY^r41!#6V v8d_.}dM?H=CRkQCO}*Fhj:ASc8  1m67E{GA#7X)dJ 4B?%2FXhu{yg3LC%EC<:>FPTduo<}hM/1M{NX.FVu6xyfPQm;qP@~:Z5>)$ xwF>!  (Ad#M*9>?BE1Fh=&zeigrJ/(q1kJriqh@@ }p(K40@\u/y[ag+N 6(YHym*-|6d}-2 A5YP a,G0iV-I RFEW ? e &9eK&^vzS1-J^i(qPz~PoXH;'<I2bmW-LPFd?c;S8;7&=FOU*XW^k``,H']lqo=s:VH::QuU\3#Iz.n Mh8oRcNK;1"%15OAgBj2X7 .On<[{onodg[^YgW[al.u:|yj.G Lc#=-L9K4>$(*:v%<n?Lo[ ~E~D4vKb%0'}=*[mieR4&##;WsoR<5.R/j?\}{U2z4l|;Q6 3C#`7}GLB1iJ1#!*D\gvO4QK]ZK3zG X9j,L.054%qi04I(X/]tta>5FRVYZ[XSPUas5GSW~Yl[VeCy4,*.8GYiuzr<Y'[%5!U8@6b3 k0y]s/NRC& ;\xva SgUgD_iW)w4%R4$rX"?,-6!? ?#7,#;Nar9G&a5?7!e,j9W^57u 'I*pTmo`C$ #5EQ]fif`Z\q ZY0$%-;A5o |c_R7C5 * #%6B HJMOT^qGOF}-JD "-U`lUxIP=~Uj1K?H]mlR %=u?;TuF! 9KSN ?4%Uff[PyHC>< CNXA6VTTQ9/ [^%hI^46+')-7AL2TL\TdGo,}@}wss!)]uyu\*<I$UN6?k<_;LXu|L5(4b8\qthM"acK&u:3[DoF7nCx"Mo|pG|/TY:\-x 3a:Vmsd9^]ez<g{vX+N t)[co, &p;`W}vzv} O*W/983+||Z$E>DkTfkyg:=>+m|gbi[ihhecchn%z,! %4BMU] jLtxV<5 3X5f{Dv]7zTW~RM-7]f}rf]brO d^oyS;# Qr{mKhIe,?0;YCw(GM<$Oz(:`H@R)ax(Bh #0-}`Em*,ae(:C{,.Sr}t^MJ^+s+Ddp1~zxzEmyHkBxmtei]nVPMNQSTRSXm_ST x\QXm D}f`;k?:\9F3N9hf|mdgx{6yinJ2" 2O[R/ozIP*?E[w4SujRTs+K@V|L2$a6BI2^7rNnzU. Ubl@eSk3RM\`X&Q:UDoGDE&JaYovhz^hSFI8" {p~2[AfxxyhNJ%x^TuXwfx }/r=h8el2z||{B%]-GTJ1}eMB@J^y4ke9.> +^)Y:$e#~s X(95EZx-ZW |)]D:W`aZJ+p[I9Q*./KljeLJl6m`sD2awhchwx~Rd-D k>8 =&.V[| Y $ xi`\`hq2|?6'sbK+Idx0q7=9e-N!=>M#kDsU.]l45f` &(" -'JZkoVLLV]C\UF7&OlH/&-mAbyfe!'KVL<4?\5jk5^csM/v4wL{ %E\6kYpssru|pGrY:  i2P .&|Gj2ekKLA,Z*`gqA]UWfxLskCpDe{:> )8`d":Qc l,l;cNS^Af-bN1!1F:g4* wX0!5FPL;!xgboCU:mXo+@:q]`{1P\OWKHRk1>FE61^CjO?/."Kj(?Yy7DB$4,!, ,0 ;$LP[dbVF2#)8EKD2h0x\F 95@VsiHY&mF|`pvqaJz3U%|g^ h!'fp*9BEDGILR@Ybo },6.x4G`7'u+E@'[u 1Y ,72R2b3i4_8I9%5- 1]vzgOBId&6DMQjW=bp]CFelK ~ Du hEyrB*/eS]k:s)A7EhwYEA1;.g>JZx%\x0Z^6pP1  & Mw!8Uoj<zeP?3)#v#ZPYl~l1.5.5990'%+5@FJQ[j?QH,P st9o4(E^haN,@VUMbGfHbLWLJG>::&=DKOKFEIUgyC~bn|N~s~\0]:$mY%S>`_ tefzX F x =V|}{Uh:V.M5QGec2CNROE22PeldM+Ci_|rLeF9-d|iI }nilmxjMZG86Ip,[18;?GPV0Y_]bq&0)JW}bwKj;M.&  Q 8`0+V=lQyd|z{tja\Z-VY^hq*|DK<s2_UIe*`RC>|AVJ@:>IWZK{%wnd[_WRVQWOZL\A]3c)n+;X}!@bM~rjlTk=n#r rkT'QpT?0*-:#SJvu">Q<_Zivrzw^l9G$'*Q?z;yM&+:Oivua@eRLRcwdRB79Ox#D=_LoJtCt=n>iIeYan]YUT\pIl)xO,l[W`s?e6Q`bXF/0L [ XE3.T x+<F=nH'  O4xBJF3h8v`Q@+riiqur +<)KPTsVNx:V*#%AUM~?gK8/Vg psqiS6iH.!&Amui`VKACVw-FU=_cfnv{oHvD_^:'+Fl&d6CG,FkDNbm9cB.&+3>H#R=YP]]XbMb5`alyy^~5la`gotz[}Dy*ri g p:a6L8dbtxo]G9p>^W^~oy:"DE`[{4dU-H'`3tAN\~jswc}Oy>j4P50= IU]ab\TD- ,?N[_ZK. hZYm{bB! /eC[1gVlwnje\OB>^FC`<O~ A< dz5<+ZyIp2Q4eRsr{hUGd%oBdZIq' :ohgjlk[e'YRTg D*GZfo:qhk^K6+/EjhL) ^( MT "5/M6b=uDIMPQPNMHrA76&pr 0FU[WJ 2#.B[ryjG~DmaVO0MhSg+,@fTeorme_]h}|mK`Iv~/!~ +3NZt4,MSX}XRNT cwfgwCm%v#Fq'RmukgY0PS]_O+oQ7('4qIec_}agoz +,lKfy rf?7M?'QZ $5CE[Tkbppj}^RIEDFyDO>0  /AOVSF1(@[mhIm`\ey~pt.!S2|BJMHB=|BaRZoiOd&j*Y$=DRs_r <!q3EUihUP\py6f: ~ T3ThmnqpLy%}SkP<219FpV\kG|8kdak'v>$PKQmKINZj~}hgF> {GJ# +-MMrl. ['yCWt_^ZKME?R4k/*%^) OsuT2 , W{.5s%Drjo}tYHG~as~ Uh#^<?JPSX\)bEjc{ $~WJ/j>h)A%$+/235;!CRQd{3ITR'J"DI^ 5Qnl(ybI3""6P#g:wFHF|IuVij[~H,v[8fRF?73.{-p1_9FE+Ti Aw4DB6*+/AJhhecNF3-\8L =a[ !$B*T)U!L=7 ?Xz*8>3[ Euk7(BLD,plqs}ozucZjC\b8N_)x-U{{Tw.@ |v{aoDV$0 E&[%$!#"*37@GI_NzRX\b`iY$J6%  2P p=Q[][]tdamNq:f#O / sI$ 6Tox %5Ke.F_rtiO@,npA^TZq$] *,& %/9AIM'J'9,b  k)M30<C L W[!V'G'0 nj{sdaysefzGZQ2Fewzo f*iQyxbV'1{|Pj"N*R C}!-"/,HC[[cob~]WVlYM\$[RA+ $/AM^kwxeP|;h(P2h?!y}2L_c\pSiYqw &)" ;;RYgzxr~Rd3M7eQN?=Lkg*:GMMH < *!Af&Klgy9fR > ,T;?Xzj<,h:BG0x Clx~CF wdWD7) )k&Z6?>2")? Q_#fEhie`_|bXc,aUA$%8TTzm}w|coKc3ZK 4jsJZ1X(m0HkgH{=zQ3LQNPY2iI{\l{}\]>#ppCN,!'Deq!9 ?4(#/ 46;DLU VN%8Cz/I`g|`DN;. ("';!HH ;"df[Ah5EkdHLp 4H!CH)` knnjd_`5jZ[o6hHy'O #RT 4KT$K,:+"*,6F;YWhglcaHH%&(9Kerf8wgHnPW98./-B:fTozbA.7a! < ;* #&;F`g| $[m<%{OF 2Nf3AB;2/5DR:YNLM06 '#W/>QcnjsYN?9%<N bg U1qbVOTFkQkkap3TZD/<CKUam{%Ee{MGgK^) B.xm@M@$!3TOcfWl;@ ":MW$U8JM>`7m6q=kKYXAf'rxueE |odlOmRuk}vV03z&[l^D14+JRnsV0U% ]N)" <~Cs!02)  .P+lGsNc8>}:W:lnxzp[?"Y 3" '</P4S(A w`W`z~hev @PN$B2,:@BHJRZ*h_vzpGF[^>)%4Rx@-YaJ &UD^eXx?[%F;9/<ECVO]][hSnKh@V4:( "2Qr~XxjfmXw\rzgM.,\B o~%w)d+U.N3Q;]LobT^, kk,*ZS5#7;/B = 1# 4P&eCjKX67 +/@,^&t}v^>!-7FDWDS3=%32!! +03325>*OUf}}i`Q(9"OlB-3T2y ! '@6Vhfi]Du$^ OKK IB&7+*("    3Rm}y&d-B$fE=OrhI,#;k/\y6uH]RC\1i/yCkSo)O 4 ,,n8Q ))X[ "$%0.,% 3ZwwX52UnyqY :%#(-$0-"}{ C]3gB]G?@3""B5kIW^\TIm>T0;" X-r$zBi0FU^2[@OJ6MOV`lqlY= '%1C3c.)#"#yU ,zpw{y-4 0%#462/9R{+XqdQJ69"/+'%':%Q!ccGr<T?-ETb|  #;Sh{t>^^G|/ w\@*  *0OMn[U@y$bE*+PtlP:%.3-A2N:S?RDID:;("Y2cPI.OLaq}%2Jf~<YqqL|m[N>.3Ld)q+p!];#:IQG0/C P^it{z0n?Z<B-/"#-9DM'O7DB'>- Y>=Oq%;;%%*! $=XqyaADanpgXG(7?'C3|sy= q0MYYoI\3TV\\Q<" :[(t>Tb{ncqEd#EKo]TZOp  )Da5rSundG(x[;  ,+5/:3#    0@?.)B\qwn [F(8349;<C=K<L;K=DA7DA5nXZp(# $7GVi{zbC ,Ol|s[%>Od^E  ~~)BE&2  6YlhS<).X8RuvM\%*S1y#b;Y]bw (&T0}9AEF@6(|cM6 (7B M$S.R*E,".-",CV[M'+-7F`x U58C)H(G3@?5F*D 7# \@;Kk295,%'>SfuxkZK9#/64+ "#/-01#,$+4*'U&n0n)W3~y+<Rmubf=4mUIK]x  8Vn{|oZC. &:K U#Z5^=Y2O<"*33-& tlq +C[ny 0M]b]SMuI\NCT$XWM='{rszus #A\t%%v_G/4ei:    1?B7"{ ~CVO4)@UgpCqhk`UNI@[35  weXR|Rh_mv++$  (+-F-`+w"xcD! "7DJ(E-<!- -/$  uhi(xPn!Mn~|slhlgPc)]SG6`MQdn]h' %1?NZ_^XMA1;ZoufH &,%! 9LMA/ %&)-049?JWgv#Ip{hS>!cE.x7o\ # 5AG-MDQWSaR^PMJ0IHNRWUK=**2ETZZTK>- ),( }tqw&2A Q7bXoiymd~VzLpI_MFY)ft~`,eEFd ##$) %8BA8+AflFJfmX8 !&y /+xu  6_5Vry^a3G-jI*k8 6a0\;"SE_\ad[cKZ9N'A5'(B`x~n G /BLM= ",11-# )7<1 -St-Mq[^OJ2:.)*/ ,2Z{zaZ]jU;?^4,K?WQZ_RbH\<J630(  <S[M0  "#;"G J@' 3><4&)-$.*-?/]8}GXgnmxeGT C/o`fvr}XmB\7W:oLp,]o-fBHJ$E=73.+ %":KSK7'12)*@S^]*O>7NROG8$ 27/"/]6RzZqOn5mjaTA4)OcibNe.WZgttvPn9b2Z?d_ M.lDpNYQ7RSX];`V^cVVI8:-$ '$ !''#   "4AH K0L9N:P4R'PJB8!2'1'4;CIE7!2BG@,}tnnorvtlq/_|!s'Y%="%%0?KR+O<BM3X%XM6 ,I\^Q;  +DXdcY#JB=Z5b4V:@C'O\ed$T16; :4$zv|} %1;=?<29O3d*h^F,"(%9HME4 . N<kS~_\K7'{l _&T)M(K$L OJ:znlrARQA-,'C7VI]\YmJw;{2u1g7R?4=2);A=0 $%0=9N?QEJP9\glkd Z/KL;X&P2  ,68.5>GKK;D:0-1:@B;b(i W5*@R Z V I 8#  5dIfshuS_=N/I,M0V6]6a+\R C1 #*%~ *% " F#`DfhZE.$'|2U<(>3 7GH?0#YBFb(9M `2qX}ppW/}rfYI6+4) (+*!~)%11):@FGGG)C>;C/7  ! #$"! )6?=30Z(xAH~Aq4`(T$Q)O.K1@)+-5 2#6N]&]BSbA}-t$T.2793& '.62N,Q"@"zigv1+KE^^cuZF-!8|Re_HZ'?  $  4:%6/)8 =C,H@KPNWPPO=K"A3%  !*-* ,e'1/&y^G6) $  !"! +$=4>E.WfmldT+<>"EB5#37RHjNtGn:\-B%)'(!`:h,X6TRXtg{$;GTagjv`~E!~ti]"NDB\3d$\K 8),(<9FDIBD4:-$!$&%## /774.&(.-%   |fbo*C=JQSPG>8t8e;U<C4.$"'4ACLjSWXW^V6Y`hmj [B"%" $  5.R<iBy;~)|tke^V5IS5ecR6 $""?[)lBsQlSYH>2$ -= DC:)-49 ;93)z+6<OA|A<3)yfZQ*I9@D4F';$  !!BY$b8ZSFi/{sZ;&.-%#08D:K,C2  $)q^[dw3Q5jBv@x0rg^XXYW NA=Y)eg_QB/   *CW&d4h>dBW>H57&* &7@ C>"3.&7;8-,6U<CLPPIt;_*I8+ & *19;(8/-7:7-! |#?4_Hu^{sp^I8/.06g:=>??8,7 W8oI{Q~Mv=i)\QH@92$04.B*H"F6 $#3-L:`EiLkJgC\3O>) + <EF<+ #&!$Mjxxpe WJ;0 %#!$"$'!) *!)$$* 12/)  yv} !"&,.5=9O9a3n-x&z"y"s&f0U=?K'R SH5  $ #  xsy6M&\.d1b+^R H?;:<=</:B6Q2X.V*K(;%)# *02-vrwuv,$<(G'M$N LIDA;720.+& !     )/( 6M^lu zyrgT@- ):DID;- foK`<\=dOxm$E U4WAQKJKCGA>D2J'Q#\#g(q4sAmN\WEZ+UC(  "0BU af(c5Y?KD<C.>!6-%##)28<:0q[tSbY]mg~ %B.O5O8E679*?!HNSROHC>#6$-!  3 G P K8 !.;BGD%>.3.&% ,< GH"=*)12/& {cSTn7@!1&% 0J`p |(4E|Tk_Td7YD$  )8DHD 9.+9!>?$<28C2O/U2Q9HD<P.W Y RB) ~j_]pbjrr+/B1G,A!1" "%+5=DHGC=0#  -42!D\c[I8%-3-;2<768+86554 0)-"?E<#gH3-};~]0MV5RECM5P+L&G(?08>4M0_0p2z:Jz^mlWm5X/ 5 ?6  ,7B+FACM7J*=( #)$///5*71'xlt3L\c*`0Q0;.-,))'$&(+,& %071! #285. 3D'F27. " %06:D<L6O-N JD:0)&:CC 5vry(8BB :+ (Ij 1Ldmcd4G (,,("& '0=YPxZZUnLSG>I0O+V/V8R>G>6;0"o]Xapxu ,?*K1L3E06+$&#!$)2;CEB:-  *496+#((!2.*<*G;F@=@,== C NW$^4[@Q<?+)lZRUzg{.,H2X-a!a\ R G<:3Z,x((*,u+]%B% -3." -;: +  !:"Q ^dd\&N4<C'LPOJA4  8L!U<VIRJG@93$*$%(-/,% /9: 3&(8IXbaR6+23+!0.  (6#D'S+`-h1f2^3O/>)+ usz,< FG>0 1Xy iE" #  '?L LE9-" '-?@VLjMzHBCJpVXb=f&_R='zvqui{p/@KKD7!()3?JPOG9*   &6AA9) !  1BI)K6E9<31*"%% -;GNK<'}v}.G!\$l!t v"q(e3T<@G,OTUOC.  %.0. '  (/4A5S2a-h2f?[PHb3k ni^M5}wuy%/ 3.,#8> =4 (  ",354.% )'    &)(# *<>1""!-7>$B)@)<%51 .-+*'#nbdp$1="A&C(?*<*6-00*4"7;= =7/"    )3750 ()694#""  +'D;SNX^YfWbRQJ8@736?FG =/!whciu!'&D(S%M: />IPSQ*IA>O5T)OD4&"&&!7B=+,EUYSG90.C(P$X#WM=( %)'vjjt "8O*`6h8g2])L 8(%4B L PLC7,$     '3:4%" ))$%/3;D>O;Q6F12+*.:JYa\ P ; ( " # *F_pxxoc2VFIQ?Q6K1?1/3"54+.95%*9BF%B;:M.U SH 7 ) ! $ /B PZ\XK6t_TT`u  #&('(*&055F9X>h>u;{0x!p_I4 !0A+KCET1YTF6&.B&P.R1M->!((?LR MC4!   6L\ef^O*?308!:60$  ! +341*"%5>=3($1 AP]dgbR: ~pjnz %)+)8'F(P,Y1a8h<n9t/u!peUA.   %.5:93*%%#9+G8OCRIQFM9E&<2,('()*-, &   ( @ Y o  ,q6V;67- $&!  %.#.0'63*  ").133558@I U]\Q< qejx   7M^'o1z52(~r ^G0   !&"0 FX(gBmVkac^SOB80!%  #%(*(! -<%J*V'b!hprp#i.W5?9!81&   (3#5,.,!'  "&*-3;B JNNH< ' vy #+/0-(2%D&O*W/Z0\*^!_\TG9(   !-.& ,7BJR*W>[J\NZJT>I-</#&. .&||$1#A&U%gv zl.V:<A C =/  !Eaj*]0D*#    $/9<;6-$ )39<8-~st,5:91+)CVageb]UI!= .   0 >@#8)%-17=DIL%J/E2;1/(!  &9B B6"  .>K PQLGDFMP+QELWBb5a(XC(    -RgfT7 %,#/'1)0+/+),%.,% ##  ,3311M,b)o(t)s+l-e/]1R0D.4&# "/):9?C;D0@ :40-+)"*2+@,I)N"I9 !%9A:'"'00;3>3>-;&62/, +.059"=&;)8(/%    9LMA0!&0695, & . 3 0 #  $#4GUbhjdXJ9 *!  !)-#*"% &/'4>7M5R0J'9% $*'#-;??#<'9'5#5 469<#?*C2B:@D8J.IF8( 2<:0#   &/'3-20+0$..//. ,-#;E C6zty)8 @ A4;D6P1U,V*X)X)V*R+J'>!0     /?!B#9'),17?D*F7C;99,/}#2#:'<'6%+"!#"1&E+U1a6a8Y7H26)! $&#  )+&# (-25*563?0D(<) '4:<<Z:l;s;q<h<`:V6K.?$-       18!5$+()-37#;1;<7D.D!=,)-164:17011,9(E&Q(V*S+G,5+"'!   !+/)  )--*'(4'B*O0\6dAeJ`RRS@I'/ xkgp!$2MBmMOKB|8q4d2T3@0)'     &("  %0):5?=@@<<0/ #)/5;>D?G;C3=,1%%!  $( $   ,>A4  !!#$*)7/E7P?WJZVW`QbEY5@~xz /7<UDoFB;5u0Y,9& (5;7*')"  !$')/-12464<3@5F4F,>,!5*F<VJaRfUcTXLF=.*   (6;9*  -%<-G6MGQ[PjKn?d,H!%68ICTGYAT5K)? 0  %39 7 1$    !)-.+)%*20>8I;M6E&/  , H_1k?lDgE[?O8F.>"2! '(! &''! ,32% -<(F<PMWZ``h^iT_EI0('0*5/6-7+8(;+?/B4?02&$-1+!     ,<J U_"e/c:\AI<-.  +5&9379/;*8)1+$/1 + %(%    #;IF4   +/5>>IELIIH>D27$& !#&!("+ .29@!A":)           0>FL&M1K<A=39,"' '$    !,10)  !!    ,:#G.O7T>T>P=H6>+0    #&+134 .&      */.&")1 33!+*+(" ,9?<!2!&  "*("  %#     '19!@&F(I(L'K%I%B#6!&   '+('('!   %!!    &* '  !*/0-( !#7EKI@0(. 1-(     ##$+%0/,"   !#$ $08:851.-!+!(   #"!%(($  # -33%1)*"#   (05662)19.F*L&MH< +!  '- 20(    $) (!*00.%     $&)5.D1P4U5O2<, ~w     !-5 8 3 '            %31;>>F7@)1       "',- -'     !"# %(-4'<+A0E2>320-$$ 2?#G1J=KBH?D3:, !* /-'       (2&<.B7A;9:.2!  $*-., %!      ##   "+!4'<,B-A,>(5$(  &067"1$)&$!!""     "(%-*2-5,3&.# "+/!0&,&$#!*-&(++' # /52$  & +#-')' $    %0772( "$#   " $#%)%1(8-<1;626#2+ #$!  * 2/#!,-(    %*#  "!* /0,!%$), *'!   #)+)&#         $"               !#!%*+*)%!$,#3 54-$   #("-$-#(      * 1 /&  &($      " 0 5 /       )24/    !          (*&  !-'5.7-2$(  !! ""         & 1 6 7 3 &    " ' "     )01%-,#.(       +12,"     "-54 *    #"       #/6 9'7(."#       $*02 1(          *4?B=-    "%"    %-.$ %***(%$&#          '/450$!)(  &/52 ' %'"   $&&"      # '+"-(,**'#   ! !&&# $)+( ! 06 2'$*)&!  "1 >DC7&    "   $'*,.-*  !        !).+      #  %/8<8* +< B%9'($    !!#,22- !  !",)3,6(1)   &*+("  ' * (   &**%   ',*!  "'&! %,-*$ / EMG!7 #  ",0 . &  "!"   #&"     !        !#    %( '     '-0.&  % 780 "!    !')%    !!               ",/- (    &,+#(*$ "$   ""     !+253/'                           ## ' +(          & (( "           # 03 .!   $(%  "" ) .)      #+ -#'   #$#    #!      '12, (-,& !%(!%             "'*'" !             #'#,'       !!"     $("         !  !!  !('%'!                      !          "$!   (*'                                  "'*+*$       $**&           "#%#                 $#      !#!     "$%#                              !!"""% (()($              ! !        #&&$                            #&&                        !         DisplayCAL-3.1.0.0/DisplayCAL/theme/jet_anim/0000755000076500000000000000000012653527012020312 5ustar devwheel00000000000000DisplayCAL-3.1.0.0/DisplayCAL/theme/jet_anim/jet_anim_01.png0000644000076500000000000002351112647526512023117 0ustar devwheel00000000000000PNG  IHDR^PLTE $$$+++333;;;CCCKKKSSS[[[ccckkkttt{{{ݪסۤԛ̌ӓ͓ܜ|stj|e{kuT|ԕLtɅZ[Cr;cK;4s+s߱cڍ\\dĊ6{|l*lڃkĶzTTIIl\"\{3{Ҍd$dDg[;;K44]lj&jۓۑ<\\TLLS'SDLg4gmKmhFh##cDcc;c""tLtv7vUVU[*[[3[--S;SR4RD1DB,BD#DJ2J\<\xRxc)ccʝSCCBB;$;3#3,,-!-J,JDƃ;);%%M?33w,w^xCx++dӂәDT7(7;;SYAYiQiu33~L~mӤLOK9K/J%Js``Rs$IDATx]_׷g2I&a}Ad2HqBqAŽD¢b-bjP[U'iw~;I*JBPp%1 sxyM5^kzM5^kyߜq_}x/F~8/A8A !A |"k2MSF/Z./|%3c #,/xR'B&RF rݬRT*%@yA/_o"hLLF'2J jzpp>>~3䇯F)VPS~ @fhP~x}aG@@`3Dd Qd*{`CABwG\.O.88((/IYe~P*{ 7# (((><"222***:::*:* DAE@Ţ s8\H*W?ˏ/YbgM@ 52WN]C0 4r E`phK:xz[ 1!AASH J7@TD"uz]<#'` 1ёa!@ MTx; , 5x:9:aKy>q4-QaAiSTN'w aF,1_:aDqKLuG$HL|ȈPD/hW(^SFJ퍺 MB#0 8!@Xx)bQ'@":LQQbBm9+F mhDdL\<"z_DxCAZ.e +$a^X(tb+Z(SLxVD<EdJK!CVg ,L2嘤lɘe3JRF% H#S QS8P6PTUXdT,R qi`,4kE JJK .+.3חoB0&AD$,6:2,0/#2efP$0I Hd$a$dJ5Uj,zѐIDO$ tt(+~DNy0s~/UpXDt=p{jCm|Yj㦊eTۜjKz `XT+ 5(aQGGSo wI.fE+Q?@fGBiqc1iy۳Zjk[.o)\QQiSURp#(^L.0G&Fܮ :/£f":⼸@4d57,Y[+%#cO̝{viVyu5THY@ȃ%6 ԗ?zP^=qsAsnQ02Ju?q$O=Y׉SϜHelV]Y_vZ޵]t}Z}]]-aX<^Z`o0' ;CXAb+9E(T>~޾;v;_ sC6g[Yۺ#p10TVώ #ҥֲPޓ/С+~>RDiC;2>8^Z) b2AV{vK}=mU+r/ЄLt0O?3*<8xØCW3AWcD%A0$ZQ}vVYhxe)˗rM 'Ȱ *{(ODspQԠD}?l8Pʦ'{v<ݳ8鍋XiZqB~uŀ(KAJ|QЫp1Ţ~q_T=;oC米Ax|pwppixQ:]A3Y%0Ewcڐ+]G _S.6Xnk`H[+'ou6WȬDE~. ! :£Qx ⦭>h+QoWS97QM (]6bOB($Rּ>3 k" UK;vs*_ ^1>E=0` IJnxGJ8y`EcrJȯ-+.mm#cyE7Hbvתe_(6֡pfL/fJO&50DK;&s߉CP*vR!雨՘A wDe7t_ʥV˵SmwŰ(A4# Fd DF2$b6,1sOCMMy=9{3ocwGF~`ޓ)ACRNv@0e?Ox(UE"_2`Nh.|=\ZRTR0R! QZ/zmvn2$8>o]?@p!`VT0R[ X vv?~!`\ GfMQcƒ1&d`Ɖ4!ne27Z9we&f]juxQYhy4& r#zJ*)`GہC='G\eKόQ¶g{4wWJ*`I&`ܵ4Xt%(T*D{F`XTn@4wt~v)ǼW_g+[6}.}EQD9DeI8tcFŎG+}fU1E *8۝ҌM志fEMPVFf5jtYSŚ=',Vqx3PqYq (0s!Ľw^t(] Z_z)i V>j}'1vY/r~MQZ RB)aY(Y*@H$1 Xv?iZ~o !3a|,gx؜m1⏥*ͻm֕:@!^۶|O󃄿WaÒ ✄@?"[jҝʱCJ^!A`gʮ;6$ 3mʭMe{q21Oj"VNKFՀdCB#c1.ܰ.;dz/K3oun*oڐ  `DJJHPLMmzsUWO~IMÈ)qxnuш&;7:22dƽ{$C?gKcMUzpiIq- ?{Iy?9qc8ݩq ŋ]Ս?x4Bq#tCD? #C+qoo8?WU=)1:])3 d3BrJ QDI׻,# f:,w;QӐ(_b %kvdMֆO] % W'':$[.<" DH֚v>0> qCi1.'ߖuǂG$u"`փBd+3mhby;a&9V ڹ"0 2C!H`Xtnŋ.<{̌E䰵ٹK LFa}Ò W5zB#y˳̏朽v-tNqsbAhGErʑ&H񒡠H׈ $Gnm>d@CBL/(ΰX?*v!ʸ鿿;@mW#_<,}r07;e<yUZG#$?ggz, F( +k֎,N9g~kt"NѢZʗEa!wjy(Z#j +r\{S-ʐc~O[ olꗂݑr#Cv.@knh|%Ldv¥)$m3n&DV.h`9%UHq^M>vyܢ; j-Y~r!O:־!C2`4ե8ƓzٹuEr:HvdĖ3ӈh!h댝s)x1 /Y$E u'ӈ :HN(ay/aޔ~gRc1eZ[X1 I\r2?8|6r1y҆Lb[øIlsꮆի/b@0ʽ jm!I]PxtnVHvKˈ_p[$@dn!,~@=~jkIb8{ߩYm}yǙvo=h}#bk[~h]yO&& Œ[oMY$rVKV,;ѭ\c4o:2bsKX`sesRX HT%M-M<5>$ +._ ZQ==CF.ãR0pj}/ϸJ%rmRw7b9ӐcK86 Sr+ܛ5Ah4mzmv%-`Q{҇",Cڶ^~Ƙĭ:\œ zPgRZHF<9[jz^Εz߉l#lļfgc,"gݮעQ"vz'O))yEKe?]1[|>r~M(;-E`p%trĻ3usw$X^f;J% Ǎ)vKR@i,2#x[p'<)ƣ>X=-ܪghqf4Yx .B5+qF0QL4lg/?e>mx*,mrY)#&]/ {I) \;:J ??5dF3n!cmc{_!%)u/)G8y %(DJ}۷J\R>iq?U/WL%9nȿIKE8 $6Է~i4Z+qM, %׌9v 䟎cb ir"]X.R삎[D 1' Xf^НQELrq[ٙ Hq[+vCJ$0bTwosB&1ѽnȹ= Շ2`͎6D>t13rX } T]Dz9:7*,ttX͌Y fMܲ4I@o>+AvR۩.qJfBS/*m_}˺ X`,Λ$J+%r|lxmo86muyXm:ke_(k!gF8JyCHW~o]ΎxqDU"I!awZ3Z8p:欜N${E 'xb 5VbY/-r4UWl~>RK⦜%e\`N/j3uT`㛫vܨ+/%ϯ7$N)7Chn^Iu0"a\X' Æ'7;Wzb 4zq6!4۸)`DIFqD&,飇 KKDu R?-w  U84z>ՉVi׷e|@! TIkތªkh0/ xEҰ]TD ke'Ȱa~(733K/jZZJ?~[9ugN<ӶҺ9\. ;~zqjׇjgd HQ"JuPHxx2E&` 6XrtlW sݿ4kt6+=XMpq5`)\dplE bMEc@B^-%Zn66e7ߞղpyKajiiގ7mjo,-*((:y]B%'TS}ŲSΔʼn,]>3CIIp6,r4?jY쪌o& ' BA"ZY$'aM-`vğ+׉4 6dM7lڸ %ÉLjѰȋ&h jUt@Ɣ1jKI߱O:6.؏N )ؔRhʱ)!tpdLS֥L=c ;x ?k5F'_Q}Q61J6"/Iiuh2IٹSɰ, |fhtؼc8Cn7]f S[܇0%4. cban(-54lh\n׬v,=q Jx+4Ԛh TP9#,>4<*".-Foė/-xs0]Jz!psXyjb*/_he`H(6谛Kͽyi;"OsT|hso CrsBԳ5EȜ r%2*4*a9<NHO\ONOڭFGxLw_E 08t̔fɕps3I|t ;8Nŋ3l+8 $,<"vct?M wǑ&Mn٘I08p7||@BpP3;7fH18"4 V%y=Z+א7-%脪Eα8#툊©@CXt0ϏLrrL{/TMd\렣mpL@``R yyJRJq lE 3:qhC 6~8& `p֒cb\ķz^Ub$>ɴ_K >ؽY&LSSlc&lH’̩"bFf|i 3Ur1^(VEQRv|4J=J 9=/yX#:`pmqC")PKt0Š%yoW+krU2#Tt(l?{cт#Xy#u:Q19Ø蜝I=.'{/lRp3* f`w_]q2,"{0^̼d|z`P#II^I?%ˠdcq>1^98Jp)§YwN$T2݃Jb$(da^A$[i}"+RG$]D&`7-"=HRE5jbE2(eOG i#‡@{ ^ ($J&@18~t:$@D*#2hZޠ.V C^JIL4&-ܷn]K >;Q*&"/U/2Ր, PZgiSg6 FAo4w`r-LvV %Gbj4ZpϠy3~z-)"C@ C zdRQhQ#| V(0Z& }§FDd40XtF;@BF":&`6a4FtZ jE)_JX:E S*҆Fn 4bcb̍G\x1QQ??I-~gB r҆H5D} nܹsGȗIXQ@2d̊[BASB!&IJNIII?RU"0F^tଵQ$_R!HBVgiѠ = OJJwFb11qyɩi ̖p+x,B.<<¯%( jAQefGy0%s]щH0(-8*FlBB<#uaVjX Baj_cV TK|Bl -/l^O*r\DDx #dX,9+xڵ=f_]ۊl|j;< ̔05c Ѓ/Je}'A[aOA(0 fY&L^ Bޱa/^]R^\,+~C`_cYK& ѡ N[e(7: buf^w-akY^a۶e{ebKqi۱UpxGo7e/Q@)XCT)znw(-8!I 3M ˓;+s**k.†ƭU6779뚄M{A-`)X& ǽf bށv<]*mHwWf'|-WWqV>PV-mRYd 틐bWd-ȥZ)cUACU>w^ ZUvbu8ل-Ϊum{^uE5Gun;m{[m~±A8BnŒJOT8:/lėٕ|dF[Uyʒ#;ӱ`~DGWsUOmj* hY`J&)`]j]Y҉泫h-dOlġJ48xY7:{tYsG{v|q>>??:>?[QTξڊ*mГ( +K^Ys"*sJvveNfetk*mZ~~r}eJW}˗\?U.*h&&[5625 VR3I$!QWjXdpXv|Ғ׶jn}-ut'F?{OZ|nwo>|jCM V@:/!ifg @ݕ*Vc@rt j;T*5^}tϭ_\1w0"bDH}Otl yard(Dώ"@L8oBKx+_q`/:N>zeȣCrWBY"PR^x0 ퟵǺJ.וM>XQE)UySa++ֺf؇ζ/3ޔ{4љgO\ ɖe$Z:9rȴ0Bq[G[>!ŻmFsql5|D}?k+w]Č2֨ %FLQ  -zź"&G6~A?Jn BG`GttZp)q-&rcRμ)!:=$qyӲ,hX77t{B|/VfDd>JK  `@9%9:Om+hԇ %?,׻wV~q+ge|Mи":,*/2hXM_|U?^/_u}^ܵQ JCgB&Yj Yzc21 1ɃnIar}ܾ,v$2S3U3-=r>(|1pbBHZ!!lmwlģy,oB\g^e`ԝ=KyÜ<WKT׃me!B TkH2[`X:NIc+q+=~מu\lJ,jp=K -7r[0¢3|'(7OVS| %%N " ,+1]b;)]n/) Q'A.4n|o 4{RP$fC"UNABolꆮ?Ɛ&ɬ&|?znq71'# AqF%!HtS3"B,;3:}WD7 \F;3pmws&P8#68"⊎Vk}'`Umwo%Bz%. M=;W}T6w3`#DSjrȥ,bbfۚ?,B bnJ5y֥p_xg$;#9ؖTPNtQIdYfKvު? ([Ktw<^sݶM;zJ"fR@XF*yVGchf¼9ȕTS݊VB@ 3G 4Hԗ٪7+D99 $\hQDm?u`bSڼx %Zw.9-^g4'Eu}uƫ ~,\ƅx>t9xXMzNJJ\FS 1䪜hL  ʝ9Õ1W܊S")Wz~/NU, e@Z"glZ E|bpv^T}"'➹ ddZ~:4 FOqkuzdsX/l*6,)ιF?NasCܥVSZJ|,vil+05:NDK5޴oW\ EX)`*ȋ^[QUeBȀt[0B3@jhF 'ebcҗ =dh%*^a;_ֵ "߮ڼupSUz}*}B Q8)b."Ed'75ezJ֓! FlM:>p0M`ӁLhG*O]FCDˆ$`T]]s!ÅpCré5({pv;o535RM_uCt\0FeɊ;kvom;oEoa>2G;w_=xs+X1*/0A"{-\hH&iĶc%*'lܤ "L4o zd` IE"| P_dDPTo(.8q>0mbyٶ3 JIX.`A aZ\塑MKljqѶ=6HV*2y6*jNr<4Y!5]=Owipen/[O?m Bd)R%F#j]wi"غJՀI.FXҚn2Yȶ;:t+c"\_:#/5y~w6堼=@edǵjIJNAr6/+,?uڙ~ YZL)DJѲ]Ņ߰Rh7EM[oʌZ9Kwxqv;A y$-m Ӄ|10$b6b̴~>11BPI I|MΓi$4VjXCΈC;_KdZܤ|6"r͇#boo*Kk&/-\qa'VE1 IdZ^8vS䔶;p{Oo޷M)$FZa_9 j0AIݯs6 JEE*nrMW`< wQ#>+pN;8#˫?;jwE*<+Sw( EvCCn+b2E1F %)9qޟktEY iDn7"iG-..Y>?ֶ=1"Nvf"4~[+XPox[o[!.0~!ϱX]E $̫s4;[B4>ڠcoXDR)R]GӐ2MC'WTn+wwp{69]=dYlwLv k*]ȊO<~Š3S-ߔ-o"##e}pa#~IQ %AAo]vO{sAg`Ӻ)_mx_Z##5ˇK#48"F3.[džMr QMY&q4aaȯQ.LJ߀&Gm\檖{p%,Xq(X&,{tL!ӥvav=3c@ ,bXik=sy&N냹BTP鬤"U0̘Q%lѲ B eP͞R.{yu;4ć@EYhG"OQ+c)g&#\mrB XJ+ӫ#x̶#jp쓇lk|~Tx@KokJe 5d>FQ$A7m-4svJ6+kt{_n}#7֍ >޹Bd?0T#ƚE(#EiV[U:/VT/ÙhWQHH|^5g>J!N-N1e8Kud=6kÆ̪ESa Am7XJ_ɲUJOM&z_ῴVVI(-(_ZB{ZRYEx=pS.qSyfD^iAXWq)T=ra=m<7mg$Ѷ|j6'1d榠SUuPS6JY>p3iؒD jƳMݽ$S6kI>3`q]wVE7)&J9p+߼R(ggaBghH[gGR;vvk\scѭRɧ폠 c79x\jΤtd ݲRۯo-d+{. K\M))hZ[dfLEaq j-Fx2l`j=RnnPIK^qÿ~Rj`&ߋ5Fתf:ÆvWI;i3R[ҍmkʻ[mh^rNỿ֔BPPޘ(u!J.XpnEgaº_d Illō %|^M7mj,ym"dp x7?mmv{yonQM&n| \80˶4vhC`f R!^yʲV`0_df[!pDn %lkRm{CWϦ_\n8M!ȮBǃ[>:[B[kѰ,RnOaoO(Ѱ^SD w\Y^ydt[71b*u(np NVY7MB %Ft\qI`*jhyO+ʑ!ӳU+J`[| (|q|A͙Sc4F9"w\TR}衳ܽ7Fb~!Ji뉨x/}U챕8Ķgn=7iF̸qa|_\xGq[8^DZN_C0xAU>+g|ɸssM;8}^z\J.ʆc`>~}{*lO8!.B_:.rτi,c\L 114] x> / -{zF]ݚұc6[,YlWQﳈۖC)qc I\eݞu[[jv+8ަGF\~\pjwpcL8'CyHdoD%5o  JbZm_t|<* %K\9'pTOsoŦ J3r|Sh2kX}DфvW\1g+LtIw5'4fAA(]"!!+g`}03ȺXMw:疫[0Nd.{}tw'V?'Vz%o62!ES!9C᫧ Lp-يcpՓ8e=o}-'Y7+ ̹@^*6պ 3A.D|.AU &Q4K* &YX[' 9m-rwo4&P5Jo8z_m<~w ǬyƤqp3RD)p2gGO|Ru,)q.F=U#ba=F.`FmTZN1aD|RTJ`xUZghAv{~@cr87wᕰ!n/YφєpR.$ l/1fÓ4x0ƹ8gy=Y@[;; 2_nwŚc5Y SS(Kjb~Mf /EdZHaʹ9c 4ؾnQ6޶Z[;mW8 $+?D bV'ߥ(*m07>e,0e(z5<]!mԣP" |7p )DpǠTfaf;$iċDQ,iӺ%^2:p!&{: LcNAX<{$q:2Դ4Jc;,X2@HLsbpn (٬Zq/D#IkôBFxs&'A*))`l)=i^jXkC{|ؤCz!OYTMWb"'_ƂK*8[C|]bGܱ,3BZQCkpJ3P J8(VK*eY%' ?ˑBVf0 O2&&c4RqWTQ| &I[#<p!I4$xEYh:NhRIr 2eaM(UbjQK=Ȉ {!G6^uܸ}RFJ6& ߩ 5dM|` E0/l#g&Ji0RKU雾s7W~1#i:U 4%0!"%"G< .>!dpd"NA;xo>)K\l$SXEj#:0`'KC aИ*d?GM93 ,>(Ɵ pϢ|k)\йaْjglVDWsO 龤 ߠod.@IzUk'-MÏlΗE:Gc\Ą3Gsڑ k+("C2_AAtAEܸWY GOzqEfz}^_k>akIENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/jet_anim/jet_anim_03.png0000644000076500000000000002434212647526512023124 0ustar devwheel00000000000000PNG  IHDR^+PLTE $$$,,,444;;;DDDLKLTTTXWX[[[cXcccckkksss|||ԢݱܫۣқҔŋ͙ˍÃsۓ۬lƐƻ|{c[tԌԚUԄԣ\LZ̄tÓSKs>sۛ|ctAte:e\3\sc5cS܌˓j4j{C{cK+K\C%Ct{j\uMutTtlLl++dKddDd22lSlkDkk;kmuXu6(6ZDZT;T$$K:KK4KD3D<#9aL~?vA xgeY{[{koR,dL. Z JA& >?ɖF>TH_!DadC6aX7Kku!!}KE֭Y%DFR]}*T !K-}2TL IɈ, qi`sPG |@u@%jѸtOIbL""JvD5 *=?(Z,N(WFКP}uzd2F^׵LE{"0)B `0u(N߀`xYG"z^TAj0PhVLL  (i3KY&&C'LBqqxYcЮ@1jcT _iP)ڍ΀| Ʋ|5AGY@oy1JLX #h$qL( =>ѨPt Z KHHHL +HƟU*M 42@E\ޥVb{ &2󧦦JOO?ৌD ψx$(}ʻЉT (1j"1)%%#?+;;;'7'쬬t'AԠZQ+=y˔jUTz0v)/ $yG^ޡssA4PMM xLqЈlWj5 7Q)3Qfs~JdKKMINJCP+z ^0@ԪFHHLd@ @l9b1᫹@Cs5)I q.#idz+z!dgEOgKH\P x\>X,G931|XP LԌD LoG}`Vjr`r 4@9 ٜj 93_x3_[+W[U UX[ށ,ĄXd ^-őDʵ:S@ @'cJp\ 1g[AssHa&(Itt fyKW:e=UG-JYsIb~, E8)p全 ]D!3łWARK1[D hrn,zT < b=.'A*pTUۄSO qYor߃GBk*6 3 Zm v{sK3mmgZO״uTڛ6k>ܜw ' / .'C]^p.UbXqֳ-nǾgϞrkt7nxCܧT)sSR RWHYҕ!KQ*qB6gju:_=PU=xPuMFjN5l6Zabb)}R@)JPitd ;JWtӲrP}Pe\֞Ѻ.u]4pѳ͍-n0*+oD=(%g_jrͿ:.F+ؕ̔l\ CjPWlBKhC׾~s[ǿ6xPU@ m튓'j,W*8zKX`;W`WFltܧ6^hl+GzW /p;3o?WF;KNΝ_¿alp)F>Q%ɮ@UG!U?-uxt䃇ޅԢD?ũCσcڟ\p<])jp/r'A)3'Ժ ]`\Dl)drtP.^8*o}VR7͝}gDQ^(^Eqfn.|~Ruۆ:s1t)9i)̺NEȝne]p `8='nyg%UyQT*2g9H<XrXX$R9wѮYPnUG}yC)ҨD׻0y SE xzI:u11:Nɛ&K"pb ʑsXS`N?⦋?~3'oѫ2 E=^/vWWV1BGSa)AAX0!>sa}bwǿ=ZT럝׋]Ntk;#-@*`%?b.@}h+!0CaqWB|sWߟ/mVuG#<ϭjW*yd.L&&N)"d\zז%q^jK;W.m¡OONSF\ZQ=.!%-Hu_MkİjcN`x_x^\H:=:ňĽ z1^޹=Nkߙ΁'_=Xn$tĩ ?h+N3A])D(3NYSccKM#D *wiavf;sܬXzvJUElX2DԉP# =e5 yCHJVQT/_MW{eJ -5L#aBB8+ 1ʅ4?suƌwl5nH!Û]]xw&H4; iC9@~Ѣ2 Un`QAH9gij|cOMj-:z $%FފL%;kO\d%1uUymQ*`5@vjf\ h[gD"xZr@]/n#pJ>sbW)XH" }Ǝa0/ާcf=bdbHE6[rr^ DLy)H"6$OO;%W:&-|ܖ -'K,מ(N-$wb0! .G͙Eq.6W9nopWbVjR_ՇO[DNѡe-FrW>qc ;YJ YZm"H$Cx |zT6[yS ll5/߯iK0"y3i [Q_Aa6;++U%eM%AP><&;i`+\MOg'ZВ pdͿ!z=C^ O c#DZ-.wJeg*V|jcr…ת x%b W#DҤ \$-}KjkG_<02e|WN5,)+$3_(nH &ʾA#gW/Oč ;d["aJ,,>}Z_QkAl,gBhQ(ܪ|( ),@Aj݃ޭ[~HQO,߸tb_t$# WI>F̈1: ?vF#ӷ/U5V@,B2WiQՎ;O=>q3ZWP nF%E\VF[aB# L b|{ SV϶ 8z5$­C`-*7̧BU7=m vae~{b@ 4e`7"~5-H&#eF:W{uVunT7'KwWΞ:3QvnV7n;f#ycsV![vD>LI]UgKLIN6|MvXʃB]{ĉ ÷$c+[4AӺL0Mz5Fo%_ cR~3XKvTH o\g!H\QIwTM:nFhdU~&:nSSmUƆGV!Q/|rYb2c:;mn (|a"aT! ^˦! Zp1RӠH,D{+_h6x$ "ۧ3 As y g +a39h0y WTmnU~Z %Dk4a\fV1}ĊD$ Z/N=~z|b+HɌ1h>(R+mcou6an0vb`"ܽen4Ljv:@{Q,eIϼQ͑kot֯ŇWs-5Hx}_=}sq%#¹# 4f jZ*&I[RW&}b᥏]ga^*Ѽ*#:Z{p_Yfeiǒ0-./Q*3Bd)J%ӮF+BUpjؔF 햣E"=0*4?t3B.b^|VFmI.%G^2EKc(y0ZzzV oFf4U:HJGhYHv!MTl4w56%[{v1[e<ւ*hFr9ziSPKsmO%wB[_} nՕЪ-ϙ#=@g $GYq3t^n>6fE YmP"a-+5Dvuinq7}V":uw/]p浇jvnPweHs&EQG ֶ02A/sZ[{lr^qz Cdǜ~]:Bw-,1*('+j%WxxOq?>`2܍+X҉r=xfΣP0 nӜ^3)xl_M*SJAGlk JP7+`XiFn+q8jA4그1MioC> Mףekk:CBC6z\<ԄVWڍ Ocݽzx[Ot&뷨-s% 3F[wux\N<=_Z拧]@03=L#?/( #숐)Zm-yej< N^\o[4ze &M HJLC6![aJ\C+=?-^S $z PbO7[[yyw^OyVԞI:`X=l@($:)*33Bx) $k^q .„[ RcZEp4\ `+YKQ{t5ZV.$4&a[~k?Wc&]i]pm'E{%nx燆m'k/nx]zv(ԴtY.}f{^;(k7yl3}Il|f Dׁ???Ԅ6A7:YT9rU6GO.g$bhypŢXz("DRp]wOVG/!& ӓ\Y}O_qB%VKq52e!UyZ̸п+?ti}6$.7(+DE[sa>dWuoi =Ks`\qwg` |7UOG뛏>^𣻭.]̧F)QD>bG vz+UZ[gr U׾LO)*D"^V Ǜ{]V%6}Hu,Z|ËܩUcw`«੸~k^wn>Xb{şn-/)oinxvAOɘWc9zdGNi<^OȲ Vۚ~voַӦ/~73ҕzWYH;Dl d ްC vDgЛLӲ |Dg ^5]<}Bb+?u/wNԮ;B/Ah@7l'B΄fL?Z)0١gW[t~XjnЖ;%NP_^DCwG2cnl\g4 i\ @$Tlk/?,..<>ڏ +zŅe&Hue4hZ; 6'Jw(w?ᎲFaƗe_{87=-./3O.w VWFa}#UVމ8J\ޓЕNJCH1̺!Ž}E><<>|iUw5ӫͣ:]#kUkf3}ӄ.oà[oi9~)tݿ:ZU=X]=ZMMOGa+6ڏ(YəC=zu7T7DҰ3 fr6t;dn_spi#6[(g]#0 +CP&Ҁ8y8c!TN)h;oIh:&%9%%e/8&3ġfꈊz73l]DP:6K̄$$“'f&7 8'|`FNFX}QьtG :5ʀp\+kCKU"-=Z hYP) APV w=]T,Z q=uCSC7Y ;f@C\pD.4>n:)QQsw<]PD!J#BC%W D!d$Aif4t,Fz~f}M81ב(ɻi4dJ-LfSbHTaf𩼟f[li`ٔX0QXW&Z<(3iןD yI"W5sȇ3D'qLB|PӴr8QY kބmf }It2:I]UY/w|#C`P` MJ 3̐͠)do[{/.Ao7IENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/jet_anim/jet_anim_04.png0000644000076500000000000002707712647526512023135 0ustar devwheel00000000000000PNG  IHDR^UPLTE ###+++333<<{{k[2[K+KK}tk;kkS-S;$;[C%CeӋőŬybL%L|T|rLr33jKjjDj++3#3|L|[tc4c^seDe$$T1>tdKd}\}tYtkTkDD00?hj[jO@OfRfq/r,+IDATx}_Sײ?;ف/JYK{zr[ IQ @Mъ,I {10 DHp֠G]c|o+6g3ġ/Wn]vQ>%ZUF4NO4"ĢvHܑp41( ՊRU^J$gE0W$ރFRbމE-l v$&%%%'LI䔤D(aؘ8"@<&(%R4}JP&^gBeR!QixJWڮT())qjϨ7cLVDWLqD+ҋeJT,">HJޙnݙYY,KFVVnKffFƻi Lb"e[,g=7ZXSPjT"m㪢n 8?mHK ,Yl'Ŝc6[ϳ5zI@+: WjVr-=)bR XRFffs97qf=l9 HǒfB% j8zF·_4 GRahL1z *"3 BZV3ǥf3)W2sf"KRҎmqqF~PѠiޥx*1sBGBblO b.,3hgA}/B1|Sʁ`i1D楎ڢKDtWru5HN;b4d[ǻ/ 8~WWy$J-ǜn  @#ɼ^RDKX(Gtķmgf|R/s _Y%*BUoyyTĘƠ B$&RF1\g%jGbr*Bpmrg5lZY❵ہ79kN쀸k$KEB!^R'BNIւCO1A Sfb:ew6:M͹U-VWCDmBz J2(%>tCJ^/K#lV).QNTg޷qBs:#ڛ:Jtv[k:KٛlQ-Xۊ򬖬4+c (OÉ(GT]u&d񠎝લ9Tu=Κwoe]]QG_@ࡢ{j}ha6ɂyuwfzZ2X cS4Qp増F%]@ n8[onh+k7R{D}x}DUoe ~G9oE JIOʆDu$)0/Xw#\ʀAnU%1GK'cvdp1ϱO?ZQtQ( ]1BK%!I@`Wz3?xuoyt^ qF]&]&*2R DHjӢ"nxͶ1V{hHS^և:XQ<]Y嬲 7<_gkd뢾 < 8(Rx`Th)&#==3*ّ(|> IJwL?545/12 IX׋9^AQCDڕiVuйo__d"ߵ0>?W.O< gmV+ל0x~#h|*K XӢ@0fγSx76uK+n.Z,XŻ왻ȁۅRrpFN֐  尀sǝGF/yV?|^l}%w@lN˜s- h\b"| JZC>Hi;# s^mvuuo?g팑pw뾉#lN OvLLޤCGHs"K,+J#V3)ۇ?,|?OSWK8U:L %}g6~H@*RuX豸N!җ}/~1zYd + ,'&*exkFZRB<:a-5FoUF0bcа h9V}pYˊw~E=D) Mz 2p]I !TsE& 9d@K_tk7ƔuYG$77iߣ5_6q#ޙ)Πՙ`|A&ј"!QU>R.f`_7f=F75lLqbШX׈5퐠β';쓧:g!ЃQ?hmw9%"m` ]:bi*E"{;}Խe3o:Z̺߇:y<@Qwm +q{d%JqDRv4(hCa)VIuU壯}=џl5+ ʪwgfnyͻsu&EX[[+iVĚÁa9*>.(ޕ`˄f]ueUqq{ґCPl4KBrKI:1I0nwݓf$*¼B@]z[X>j& s,%hOBKQ]\4;&鄛tt?|ܳw|LZO6O3W:?n9V V#4:[]Gu&,1 Tӑ/x!nĘ֋奉M6uwZJBc.:Zx/.0rBbA0,[`]? ΠQ .\zXHS3W{{-Ɉ"VM JFH *tVw>ư>R4vkl6GU$ED zɮ[*.Bb0Ҳɻ3VP}M^6W>U܂'CU6 wl: K;%.!`% D!BV(4\;oorgC;lیK:#dE@04u@,;'+ IEŸ`'5lY5ECn[yV0;qLdd>?؄,+./ȃD-DFFa*BRIi-3h Kw1lu&0ػK ׵UUge@V>k"#-PF,g"![?=]nM{ vuyvvzGN{(H4ok)p'3y(+,=VB%6RXMPiAr200$lpStE*jko?Ų @7O&z'k+J\R.3Q`–C),|o -ݪozfo:h\]@C"Y, o1pQg4+56gBD-??E|] wJNI隬$P Rzk7 =17{v暮ӥEg@EHRpLK^pin %Aveb+;04r* l +wߜgbz|Lb;.1i "R6:KVE4h[XE I=6VUf4=!_"Vy%W"rxAp8k" zH6 O=:Qɳ,Ľ0ÝY4qZJꢲ|`bLG[u1mׄq9jz<{~?a`MZpL`0H<@C1 #@sꦑm1G7Gņ\nj;:QSVme]AwP q[ye]ţ3=,چW\;w v,bsݩxh ,>( RCj|6ܲӟ㕊Ll z<=mfdfֱtPm]cQ#ț9< ׃Bz DMjuo}`0ܶ\$ =A 5l|}eK]-i KofJjJQ(ʼnbKlS`[kXJT!ݝiЂΨ7]AgDHN0$F2徵xf*\1l< ڷ 9>o*0ݓ.hy?hЉW`-nRH!%x/{~q o@kRPsjg "`X@.n-)PH+bOFualRuX{gaij0`W ڝVF!v++rjd7'K%qlX]od=b,L*KgARVD:=,9罃]է/]?7 >˵d*\Dİ6NӭzDibkWg~PLhx}wn}ꓦ~[dDa]އù%̗U\ g| ?ַdwq dʾan4ec eb(Iíg9.Ahj/ !n)=n$7-9Oaߢpw& xŚ *MGU`'톳0 ! d?MTmi˜H7rr܍/jW7;pmѻX3,`/,%?GomkA;nixtJ?h_#.hMx`+, !w>63gj. \|TD4-Qg[u&$%r3<5t 8Tb/N\r>P]V{ Jb-\obI em%+rea$Q>w]m2Q"u|(4׮L\f. 5O^̆썫&:}<1۴f4|4 `]N#vFr*tƄdtl퍽ן鱟}& waǻg#eC-`X% 73XHvG*}LuA<8EzRX~o-,ޠF/,Ȯ_ח&~{PPvMhupgraaҍ $RnzDQ>֎͵@Zb]__2g;Z\'Ni쵟fm(Ue/< N4}Xyeye7+V$/ )ж aB=#-YyT)mcy#- v'rV8bU!!93,lʚ an0 W^Pmrq&&JٕI|/bg;j_sZpWC9)y:QG\ AG4'zVTaYb?l5a#KXI¿)"P?\@UUrV )3i! <tE. J0}(iV@VVHa(_W!MY6wlu~CNxb8FKS d:/ F;MBn{{sШ x.7!M1R,CPE{ѳ/庸 #qjy2[z!V\!WaʢAx&VhVdLL01y¶d^Xb/48 Pq0XRhNHf?;K$Z/\?]$#j"X2 $1?}Y@ !h$0В8"R|ec!C,Ii75%aE+ EW&De fBFDEau!_ Lpo `::W(>^۱3955 #MHߵ DHvlq*65TiAaq&"ZLd6:dG3Tpʎ8"6ㆉbCCN1v[>E9h`ĩ@h GlC!gL!@zx5Ji !:B'IfH#ɬx2l?X^ـVMVȠaCcFOPHb.ѣ Bqd6AIP.!*J&Idn]qoH.ihP" `pReDi5NbGUjDDdf:%au eE! ׸q{=<+gC.!e*H]VD J8<CDPd2j 0rA`8ӕ&""؊LyZ"Q??DBkg&%Dmg?BVz{^oKbMIENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/jet_anim/jet_anim_05.png0000644000076500000000000002676712647526512023143 0ustar devwheel00000000000000PNG  IHDR^dPLTE ###+++333<<qZb]|:|tԋY]+]K#K[;[ZCZS4SL3LK,KD,DT>ސ` x=GGQQLC*@tqzј`4d7 FsROHI-3eŘA!ɀ<07F1ACmø 9@x#x z&0m[L&jVfu8,H3#11]D#s䞇R1ΠGio‡aEj,&j2*.p1GEƘ-zNαjȉb gLDnvMHj[D}WGxc$%IdP/`ϒn0ˇ"Ѝ׃M#7YxH4g"fA#=@2\a:,<{b '0;PssIv{|g=)BYc8bY| a^YQ %k!"lLlIv{rrbRrJRRJJ2}NJo&%ΝkA(g1#]q74H**q "SSSRRS#%5-%9%%)11 AcG̠Z+8o^FƼ2szFFzb6 Pc& #e8H7$` 4e[8 w>o>\ ZHt"Ic[ bh+xVL[F\ %D*)195M&ѢEk.IK%l(Tc 9GO #DGAΰaB 2 2++sq A.\R@W9E5x=U\TXn!tyFgs3ӵ}v.2bP2R.1Y{xwyũ%N7L >:wn"\$R xYxΥ˜rSX!dJ֫NdPOlX/LKQkz8B?=:fa^i S RW&ܽSX%FtEahzY zCl6tƌh\Da)ҡ*,Hwb= D| k.kZtJ$1r$;[E sP2- @?"Tl!7xšMQk U|Ρ #4BW]sir\-eM@Q_VN2'I}*hc4*Е#4q"- Pfйp8!7@Z Of. y#eK-Hx v], Ht2-@cԔb?(BWH0x#1 [ 1xK|o+V,UwTں J&4fe?d//PW&3(D@gOb)+6H®n qOm}ۗ7/޺}_]Eqn;gP#OH0M  sO €<5Dyb s9{%5zE2߁ 69Ҝ]R|p}CunNXQPpef2&'x,DQJX'2EaKB 8*3+jg[/UT?|j*lݶm%jOX%C zV%~ʃϜkj |q'vug?ݟ_"h2 gI& (IF 8%~":P,2T\?;; E_Q.9Һx_\J˫׺_u|Ν|9-l Rԃx$t9 +ZsC̋BDRp y_N| C!>Nj 1Urjx W- B]ŭy %Fn 0?~5AnrZx  omi2Bcp^zJ2:fg&cw5|<*k;.|~_h)Ny4\F>oh->sے ~b[Q&O8^+ B ޠh%CW .ڗz?׻3ODBLpHou*wOg9޻KdplXF%' SQ0躻ZĞc]W9r`7qÍcΤpc{@Vu!L%h\g`>c] "&D3%?n h.|GO/JRYc?s! .%)$SJ5/XBRX+A*_urWu0?ݍOƕ/PZ/ ~ʥN<`b4RMKMfu ұl0m;,ӵb[ fUqM๙7-E(:氀CJZADN8D#ĊmJ:z(XJַ_hßN΢x z|\.`Zt%fRjl60Nj  ni^3A^ZJ{/E.akJ!OAzV퐘MC9YB"%ln/ ]47yak$Eϳ\81dy^]Qxb,V 92b\h07,Ȫ"oݽ#? XDiRC7>9~*(40`+0c$6Ks` )騲P+ o?.ӹ+A` DZm8XZf|"nlf&6E;qF3Fq! d( T4dQp0#e~Ҭ 2R%X2鴱[w٬#ҩ@[({'Y5{[^yQIpa4dQTa֠M``wЉh{gnOyGqlOvk|\G$[VT32S BFd۽rCCxqN[qdK{}Y$%2AA̅^.#qZ,vlD#Rƒo{!c3( Ѧ=?l̖0S=Q50RTfN8]Ts۱i+n4l}`[n x1F&"HTτR~1ltA(b~@ mbq|53Q t4:x 8A;fF͖ Z^憽uգo]!1T?!'C<ͫ+frЗNNlUBfŖ(U6W>%!3մ:|Ӆ*KK"IJ4HbqUeQnĊ,^DwTU210 ig)E\N H: ºN3kr0]gqëX.f51y̚|㖖d1%vهcP:mTKGW19dI@~tipK>#`H6#hbLTb!|=gjuSTfFw&oekxR0<`\R*;E:'9T.P[}0{42|yUb:[*ʮSS/f0\b`CgN~ev<ι73@TN8S}`Y08LZagpl1I$2:(DR{ 9knJjm 7ޯO6u2Bn]RB$Z`0ENjKur3 /L bE`O0#=/vgC߻:|S%\,`L0_~%!kD=d)uBk0YlTm_6%p\KKoKr6}#K;xc_nfs(' #XB hۿ!7;Zb>~88:6- lvnY5@4; MABFҩ(Ħ X )mz(NVi1EE#XtygidTC =pw:it2n!B19ZŒ`S'& \xSIPCCW~?u&'6l^4v\r J 1]lƧXI+W+ypC} ]?V`#Ս%ըD*Q_SB]x10uC(:368h9Uc- d|),98czdV.Ҷw5Yy 9 Ѭb=;2'R"hS I+tWtNxb2-J'[r痃utjԌZ|vxXlD> G(A/cL"MTS JЍ)h_Rab4΢@2kāsYARŶ}X"P3pmk93 .j;biĮ$v?q1K7agÛkX . 858A0gj";++>Wj btt4T].?'d-h$[]ltcXa`6cE.N"z|9Я N XnTWB0Xx>ks8WMj̖@mR¢.ǧW3#76cmY-t*t$Bg-$2,YvCcPYGV T]*Ydu % U2sϢa+RYH)dw)Ԭ;l>FK)aڀ$6.xAU#v=FJF@#cWn;KM5uM'j?ӧzKM*CW?lqLS ε>|nlV($`2cA=,Hta~`&Z7]UZDUvBl=b,F"HxԞ4xV~tw:VIa|Ao{[TJnj}9Fc (u.pfr.;7ٹcZe.O/vɧDcmR\4gL3 . |&)'eǚ*w͙id 1~0u²UKsal سMUߩ]x|\5k2#@y4b)k19~Y.|>f ? 3MvAG6)5x`dx9v1QAcs05nw4~'I9NSbuh,c^S#@=vxVkfrR(^Aܶ(-M4|O ?>=ur=G RDtjrD؋GlK]̻{|U?nI!mUAP{a^1sj1h,L%i`a1iϱG]}dKCyΎ@%#R ~c Gw=pl ?|й+.U@SȆRc[4גP+ hߝ.v\*: ޛq](.AȄ _:w)`?W0H}r f4}b l/G:vɇympf?x_ h"3HO從N/^bIM렱 TM1JS!m>՗;C?w7c6|\}f&%dj<;}~G2bB H柾"丩C)N [sN|QBrjtu6_ht0*Yo>U'Ui/Zmﱏd0ZOUҞw<.ZAYRNL QcMF*eJ/V:' '$C+8-+QdP 4<-*L 1Fvp x:k6l^k }Pn|Vt^#><|yFru'q<$;,vf,%ဗ8-퇏χqK4rz0а;@ x9Ѧx8h&qKĉ; Wz^96$ڙٱvNL]>8rGv6\ZswO~wy@.@/l;w)f ف#w.8H䠖tU8ۚ %hO)My߮k=FC4a4El& .Wy]G;r1 1젱6) #l5DW{2K}+UT%ǏK iq;|??w] |哝X{+8ʕ%l$V&DhDWBs,hЋӉ$v  Aa߄ 60ww]7Wչ6t?-t 9KXEC@_A,`49prbZqOŚ;hJq k Glt[鮼ʃ'5־㹯>QnJ.M/8BN('JOPg@lN4IOFK3 r\Ćpo'IZA\wvwq7bHSlGۥ\2N#Wf4t[DBb&tԅ\ha;-M4" þ7NYn]VzŠ 1iJ0 =pAdY[=5|x B7Irf6[@Ułf|6=ACQ0y]5ZEaѓ>9q R0F#" D1eߔ=oq=]l |ĐѪ.BrB2iAR*Uˤ/Jqߔ&أG"_aw^l,.<펑m2[6<˫*Ͳ0 xӕ6Fr}Ak¹mٕTh[+ z˫BeRٮ7F ,jFի{uڰUq/xgcJNީ{-J3yTb樻#~4Yr΍a ~o4M̽h*B9봣kk4j!{nϩ @C˼ZFJT+l3HΉleNҘˑ1FDmؖIt/6E1GD uvZ oA8&&7F_Rɾ2zy^^/]x?IENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/jet_anim/jet_anim_06.png0000644000076500000000000002632712647526512023134 0ustar devwheel00000000000000PNG  IHDR^mPLTE ###+++333;;;CCCLLLTTTccckkk\\\hgh`_`ssspopxwx{{{ݫޱۣӛғˌăļ{t̅͒|ìdԋӅb܋kkTSף׌KF}ԂRAHj2Cu7J'JC>P hHHB$gdfff#;hhC/4b/W>g`RO&0@`m)ipp9pµx1h rKF5@1r> ْ/ :5eㅵ O)ϭ/aQR}Kr"KdI"Y=.-աgeFW@mDg$p\NaQ=;:[`gQ+9\@) 8z4/ LSW ؕ\TGFfNVD}2 rp۪55MUM.x(o{Ru X ,+A)Љaz=+ 8^,fJpSR3riՕ uuuMެִiO훻65׻6;e{PJz2Rx_F e^<1E2XwA(+;7 oG j8[Ztm*nnM9}ײ.TJ^.(% b=`b1%{gJu5\g0-I(,]E8$MUۏVhUǪ:*66}}ˁ]';8r;\v{!DPJƢ[9b@ȫiNDQٕ[<8 TC ݮƆvy;gΞ=w[󅵭7h~k}wcPW!pη+YPYR1 Èb|h8a$T"Vԇ8]~Qp5[_N{{}v\xtyז ȯa\/YiAR rXDt wsB@KYϛuk|o nghw'}姏 Եtu \M)(eW!(ei|{Rqnr{VR P @ K-[S„ s5LcEbbkKyڽTiHG7&QOWT">{<⽱χA5FoO=h]Tq? JaWA_ 1U]imik+REC s$ %5Gŭ#9?rox\x>}*,UKQ }yWEGzj0b] &EVI\OA h0[.9`XüqYH~~'&}~ߥOwᵠn9$+f3bBFN5xM t"G}eֻ.m%MϨG-+b%-jo*}?A) 57kQZ2XC^ faIHx~avs|'>ɍAĨJ-Jl*H%{s0v{o@<`OI@ZoSV=MَQ;b$|7n~ ǩzaϖ<QBLS J y֞UOvdQrR->:rF.ahD7"@edSX,\}N?EhXK y(UΙ;[cbO3!ي7L e )ŊLd0Lల!~gCN^j{ gb4$RI%=缿~?^;;9G$IYfA@BVk Ҁ%Ic9憖ꎾ9:MɪfV8~jF'=lvuov,jEA &kE'Qzyqj)ѰR [&^>я=b$u6d 8'^ 쬃">hX4.o#PR KZN>yи=.Ō¾'_V\,&@S`B ;A B;$\`XwgPU^o|g埏z]kg~* 0Ag)5YXuTEk+QH&Ζ ܲ'O߇ň0T4&ۀyߤ:ȭ23lkҷ~Ġiwo++b4"Jb8(C[Eo<e豾V'Q}m3J~x_6ԵNq-[e'+l5ѼW35-)"IJ#(xI[opΌj^}ߗ_㺶 𞜀J(CdX RYLj\og{G.c?-tGBG}wY 6`7K1qB8,g_kkύ c8g1inwFb,~[gfoS}N%r; &%:]9Qdَwjo>8QQNLD¨3mq+9 ?~uey J$4ǥ uSeٹk%GƆ'A?L$f AooFW>`ԈB*,e;1Y%$ ۿ('KT0Rp ^OJW[ qIPb4 b e狕窯nxsHq{/iX'lXH-8h dėj X9IL^PǠfӱhcL6"8vƈgsۚvǛnp,@D<Ѧ^tf `*}*\Z D糄+py!Y}|? U͎H~jasΩ_ڛ<:HI(YLN ZrX@fL;ZW=jU1iI{\Uw-;^_lˌt<1 @$˯)hcf^ ;e{?8:ov9P|BSfCNHuR ")hYwK_9#x*&9=KVzh4"x?U_SWx|ED>*. B Mj[h;7C"3Y'LTX0'?~S[U/p,ִ'MFz>Y5:QO2xpvsm:="f/0qtl,SLVEGQbb$ ,=FT"V GMofrdm^V*TnQehܯu`TOXک6A2C1Y ХW?+II͌z53dDC:bY;* cH:sě5D̄7*^ȈXFՖydҮ%ow~}klh.62ś>Ek_GIPĂ&6 7,A1H.®zmu-M[Z7}c|R=Kql0aczk`oÖu_[e!% `=I)cvhIFuګ#t -0+m;xG~=uL B^ ,ϥeT$1*P9(LQsכ?j00y)鮲88K!L+hQmSoNaјUDw'N ͽ݈v_H{pbF2*ZBGA ̬vu{響iڸIoZvHUx94R״׻Fwel&B =tFfaDZVsP!ͧ-%}t:EO>#bK=95{ $O濤$eXlH"bɶ5j{OȥψYlŭ97+\\_D5Ж!.__rc2[ruAZm~QIM`DK Q5, F8L`Zb(13s $$;Ӓɪ7 Wѓx}\0UH>bEȅv7_"5GڥeP)c'`ьƊpcjLW*r׬;D qS}נ]%D]Pdl)*FZ˓o}æ}lBc;.c>5Ĕ@LKtڞdZrvZv|G\AXdA!}0EbCJ=eXHU 3 HݙN,("it[303GD QK'2շ iEue;<ɬdv]vw߻&POi๓AjHϺbPU@VG8GA7D#s/(0s#纤zXˡ޵HNJ(LGe&B̒U#t= aD/+DQCw*.-m6̈́LdmhƳ :m^'&&zdKAۗ '~w+ h6bBO[O_q]2 MV#AA¯) KocdXd>`vl߷HU H byp-v8)/+)v8:81)fzt2>g+Pcds;$qqfR:z(VCg6v𝳸<سc]FZ`b3q=[E{-ڮoԎ^ _e"oxnz=vpgCJ :wn:/M#ђ戏L6; Ue`XX>4:.t&(pJ*ܵbȱ}$W3zۙG/lbփI`O|<c<NY!$$9T 8 !(T:YH&yG=+"џFhҩOG8[ZJ cTU-dntA .*v.<,vC$k smUE<,v`s=b<ٞGVEx5z&Hpא^d3h߅jnyF#3w&N̯x{ȷ*B{ӒLCʹ"%F 1.T -]'ic"R"DX${}r}_Mjaّ-.YC Hlč G|!3*rrL(;HN!^|jdXK` ا WR ؅GCǧzg:51W|_c:n~ k¬EtqjcO >T y^ޔK<8]Gz sծC^Atr 7c,=N ;;bAV`~UƵ?vcX?㙠!q#޽t_NA 4zI'r`keG{!;YQLIuV .MoO9zy3>Tх-' X: 'k~9$dT>Eg.(Zxޝ %q|*\&Q{wyo R|JMb7uF `#@c\ܡᜏõ߯%/U3O {w˅MON4,o5Qhzp<YW"l% ^/qKdӭIBn% ^Pi rlU "mbo(5 ^Ն-Zq5G[=~?-wO  j#=TG/l:2![XYL̳ːA*U[D߆;;yuۥsqas}_-7Qxu[~.9vu[k 1Oہ.C\ aJ>u) ݮ%^uSvys;ilWN Xxfz i_ճlZ.yGc~#>[h^7YgwU UUuml\^m`}ΪP 2NaZ2Ԯ<~L [Lq&+HI:`S$_3Un߻ N m8Z\遦{W¿'p ʕ$6Dqt܉ 4D"ہ4h4lIɩT)eXvpTZ'mkhlZv[S[Ӷ7Wm?ov:6qBrŠBdذ+wt-$?f"vͨ\zzMY-UN4ewmsםsm)kԔ\vk_MY!m zƪTl:RyΈI圥x>ZI̯&mrue) l܏¦MɗHgHwFɠ1ϺIZE 0/uI:b LslI 1դqABC!-6^Zr+DxUϪk^J5(isoŕ Md~1u4 ;e Wa*+{'AF+ϕgo\ mCj-1)mQFV6imgA1T;_p{csoltqLNb֙6nyp 0AQ9v^NῒvJh,n>B|QNF (# K (D'$VHKH|;irP.{-A)2o qF2$Ĭdd_aP+L@B;i'2HŹ8 -0%)-=9!>!)1!$AI7Y  a4Qp ]5/l M~ʄ]mc@i4qdgp!\$P8GX½ruPbxZ- c ,T*Hq^¢IU@=̅rh L/  P z: S-ԪY#/xxFnOjI#D 1G0393rt "t#ZD"HB#(# QL"od&2-u"yE&TCCv2yT%In]Kt#/cc|9Fʳk;XiJZC姐!#eQs/;ul`EAU+%&#fS ^^!3K݁tXVl  4=e2%& 54 -bPޤۗ)$E?c%>Prʨ&z&/5zx"B!W hh'ŏ 6@e{P*#"*"Ұ>iϿF0~h'@!TJFRk' W}ja?yJToIwDрL(U`m DJ^q"& V&Z>1&ɓj:h0IuQJD0`c`yR< CF+|R3 uAࡅ'՛t5U8pbX^311 +GX+Z0"\Zzf^o4ÄZ%uZYUԨD}g&)Т:|xz1@|vEkEFJǧ9U9~ Vo6 H)*ig"V֧ӡb@g^/9×/"Q|L:GT@ X(: _) =3E>//73iQ0K,Ʉ~4H'ŁtQ dס,jEzD4964J &e4| @bRbbRrRrrJ2\Ip%&&&$Łv2!Pz:~4IdY!6z& >%p.] Էu \II<ʀB@Pz)8a{+4K"9EEŀ9%$$R._bŲb,\|i*IVLF#k*r@e 4+*Q`p?f@\BrRʒ-UVujKYO;r L2YB\tTtI z0y" D[ 6P`R@ PŒn@4ކΖfKWATK2).2h0H*}w>J GoQGGƂMK@頂6-k9~eB KK^RxQTV u栎+-@ikyαS[7U\Z[۷mݱgkƶ*+ut7N-ltD={P f`ߔ'rbBX| Rb F <1-qًkgwMm on?STtxmJ:*| e5}G#:*xg^Ta ]A 5]b&uJr\|k~K^yG㞶޶}=Gmgm]yV HMIF!" Z?aA47!i 5hWu4~{8>usϜ>Pv\C9*ąYeN`@1iR WW_vTz+#yĎt(s2x9_W:?yEv{yxęG>ٞngcAښ?@)965}9zQL>bi~V[RVv䰦]:n]_R[y0љ׽GفqvlD61"فa}ρ#kY>yVخJF_֥I}uѮ4Z^gu)Qp8u=|`nX?a'pHOOr{X/"H6\lt~ΆplA)ն*mEjrb.Au/_HѮ(@Fg4C v0AguBpԟ]U'yD6ƛTv;ox@SޖAPJYV$`]1軴&R*&Hǫ:OTtBRJ+j]{< +O7`ec/O7n2 K/:aXS$khLH`EFZl*׎=e_u\eIT( #4/OrƧ_v -8lH#WI" Ie !*p:=) 8joS͞o{'ƽ2_zEc2ϭ~ul}m-A~$6*&2Ơ)ԇ (%\hX#~~͵ z&;}L_̬:r{>_t+gW.wt?mI6c0a)bC LH%`,*eŒvpdwwU={̷|oM=6v85x04H@ h᎕=td 2E .qXW <5^SQָq&Jio0Ծ.z?{ߖvA焬T 胍@UZ(ud|-,K1}Q@W"v =o8 o {Ds{ +ΆZ"`\H !*)q?J|!c Ll9ҧڜξGg=_5}u3Eae|wv89~ڲ "X*)GX,i,3`FJ}phX7 ^ú ffa=z?9u{ 20$Ń I`Wg2yXH$kJzqfbd;>fD|wvS]#[ .B" *F )Dʦ>p_@,WyH@e[j&s94E9+Ǝ)g`zޏ۝ڊ݇ }4uZ:BDB#V\VSc=1 $L;;pإq+ bU'eW>۲a '3q蹒 M%ܙ1j $ B0֒3ʺ3`5]'c;ï[ֆcgęd렓G9\Φ D-ƒŶIIJ0!oC[hZ`d`l)aiwϭ+4_"5"%jc9.z8F $:!c`XGN7fɰ=zxc{u E$#BP#ƒpR^R$uZ)HMΒc?ҏ9B?S''>ۧ_΂ѸJ huj: 1Q4 ˊT9cCYo|c=FTtވR*,VCpԪ<u@N6pσ_vײ5SpE͸/SB$ Ѡ7c1^]FYχ9F&xbB; iV "Vxb92 L(Dyrݿ{FKCXPPR) RT*%,Cdtxw]b/hU(Hh}T,bZ:-\M.]cֳ`w! ٝ-nO,DFFD+vAk6EE' 4l¸ Ld: |y|ւ+2c!UTI/P_HsWf~,2V;i[X}@V^}d`Y2(Κu-h!3Y:n>&.5 **-#URrmT\UY4x$yr?s_ޑ_v{`Y .pZˁr\~% Ih' $rP^O_}s7g<3wtoȫkX8%X @N#"mnw6VvNxܲsP)jY z_YH7i#R,w}g]f.`_b F X':و}[  piG1>`4#37iϿܽ䝛%9dBQ<׀26T.[.Z$D7(U$DFV&<|4##ooi2,=V3e|Q.~G5ECmg\[;-1GAuߺ~Ν5j|+-Q^d7 v41v)HSi8Pޒs ,jX5xsᛍ%rObL\išL}KdZ3w⁗MyW_\&L.?$u'id}ro%5'--!wmu<ؾuKYVEcZ+-@%t +ELH,6$pO^*P|b祐o58JcA=.6"$B!<-X#H,n'}ʆýa4POWTx۳2HFNY29$ |h.P~ˣG;>#ޘP=~cg+'=8l FoA "{"45A>R\*!UP:VQ?g 9pEχ}Uboi ]/Q)BwwK8 J 8cӱ,0ң[582|F73ahÆfG ?Z#a#mDҌTJi VI ¸4Fg\qnV)@l tWÞ Mk0*Nc VpW>nჸX?G2~ 1=t{ο1;wVDtZRm{%O"SjAWݕv_Pyc`*1r[OzמH ٗ bN[Pϵ=pXmtƕphuwpis3Zոw3՛ ΋@K̐7Qv9`}cb$6t]h׺99vnVΆd1vǶ]ݭv#R,_A;XEy@ĿT"+$+ZcxGYͱup=0]A޺=sVj;Ѱ8ł /0E d^O6QSIVA'' +۳:~2ݯ{V.Ir/;1~yQQۥev!o`KGN^dfP):-R&sxYVs̖F{8dds5 BNMLёv֔T:IpXo5DI֋Mb]] xJ ㉐"l)#Ou2s\ &qғ_9Tv-.%[5m4L![/8*_љ"q 4'ǚfWu| -$.r-Nr?<>wW1XeLMI ܌24[AF\(c&`LqBTEqo;įljōg6Xs?\r}kW hח _葲kw6;M#vp2WNȋ70p ]Z]iLoɯuiPWSYϑ='~_eOF=_=)n]r;y!Ցf#b#!^鐻+ɀ0MSBFGmYֺer'RZc2Xo4u13ö`xp^8:,!) $_%؄uvns +pݵ8DFJ t/FC"J%Og&ܰp|%`0EiD+ZG+w.\ZIpW؈6p+VKȮJr,*+HåD(#cbpo՜CyPA'zPpo oW!m}^/#S1,$GC TzVVGVsVw(O!8 ÉJCz!<֥NZR~ދՙ"#!N@,8j<Ўk p~ T"jCCgOOgx8T5ZmS.SH"̋HbEjj Y:j2].p UZ4 Ca<I +/OX|:pv"hgV]0/G!%'Rɖ/) L1CNr&L(rT\3 {id7Ѽ(cQӒZFFxL"'[ x* \x`,jIgP`F3q Az(DŴ[e_d4q'j(7<8OkfD4CKP!"Y#"e/){k9ԒjD 5܂T+INoUsޘW% v\ARIKD C#W{L%3J> gcC{ o)|JVFL&c^Yx+*ITJD~Nl"yPev_LAD18.xt0xu_BfENC$RP ⹺ɼ>icqefb̊'+qIrƯ0_̄M;Ul lb{J"=~6+ebďx{kzx1)'"܆ C<"x^{$~~V Q(ȴ]'"#ko][]*X4<('}%L$^xNYTpJ /5}oT2I<0nm0Uj4xiC֠X, !9eO'I*F.|ҨQ_`OL m&[Z`4dҡV@¸yk`.냢Zܩɤ7&\ZfZBg÷(FMeAH﯁ FdRI$fMZT>z ՄB4L/j 0n%C* `4Z`0E(AOm,4BzELx֩-2`PFIhZ00m? iP `J&ɿdK^:(؋Dd ?A!@SCJMҙp zx zhXhXxxxXx~, & XޒT Fo4FB"P蘘XWDgZJ[dq xU 5 BDqp%$$$&$&xbElLttDxh(jƟIôB=KB!9\&Ikj2$"bbWā+W^W\ ^^re"OåeXAK*TVb6nQ ?}$'%#Z*1!..6,A*b4sQ*X!Q&">qjsZX7+ f5h, ==u"oT'̛|| hR+P sT3ޒl`1[[,- jeB^fp}`ZYFo@{ŔLÇ ԡthEm$$nbF!M)_{б]T!f2ʪp_AV^zb@Ǭ FN6N(W5d6?Б}duשSݧNus܆4 c TP'i}i cvL?(4":v@+kۺxCG:Otg==SsuR dp_1H 4RvD78,"&~e#{AY2}w#G.]Cb(}7\>z%?7߶ۭE@){$DcrШŝ0|߅0h4"Qټ>i+/iIo=qd[]go;>qlLt+btX哻dg}kIӝrefI@ N~P"z毂C#V@H2aߵqBe?tmG7t*JT8DTű!'iٕȳ5,XKjr \€q %Y}XZn;hɞãbJp*./EQT.qxqӝWvn*/HIF2LjV`yݒѰ:A pץ(*<ؒCK'HtR1q3܏=N߫h8sm{-7^:0ߩr(%/Q3cN׵S_h m|Շ6<¬ }ޤ\W.&@ @ D|S9N?sܩQd{DL//~tء;%R3x;t䕾GEmR쎉LqlWKgCSoI?wV̀, q(|PYMVHXt\". [pmWZn~àuR~XqΝ8_o;QĜ":,_ɴ)WHG |wE4q^RǮcx[sb`Yo*;ڀ[Il2n0qFUr@Sߩ}~So/_>*zDO, (绎^ܟqB32HI1@ҥz-Ec[NӨXhâsˏ6qeШU}~@-\hCKaTe8W@bV"rµ~8/J홻E!bXt}:iSCO~/;\:\S)],Pp "!lDòWOlhgïhcV5ئŧgj~TfdB~&aExi@%T^;ʫ5 SYYtS%.3R-8XЩ5EI"FT`%ݸ'*ąlp miڞg?XƵ6-}phPޠ{{qW hXHM̖}ZUX[1ǤdvkCY,f$]R*d!7 ^!y#u{{tL8ݺQ :{닿TpHVEDH(Q,*&9OTx :ʺF=|v'5\:'t5flWa ~ey#r Ԩ^t%[ KB(7e <_q8^F<;]bΆ񼐹o-`R,Ǹ|w1C exw <݈= A.Cd&.$LCTt+׎R6`fb(u\FCt&1( ֆ GFU|dLN:Gm=V9sҚ}ѡ،c:{ A67r^Y?xE>Y~,+RtgW`\WŃ w-"2EhuA=%8Kt5UQB1yV'j}S*X8KKYpu&p;‘g%,XG`۴f;S|CG#(0S :A¥|Qc0`H ' ͇% /r~b{͓z5MJ!DEHH8B}5]}|whLNx1'b9WS[eA^h)saeaOU V͏ƜʅGG~9`Z %Q?r1158 ςW "~S5Nr۲jLmuwgoV -+w 6hgE鉅ڋkO?*p\5q~ʛ$MI% `P#E DrsyE-.W8wPdFq:Ǻ_+븵IL 1B`Z̓;Wٳ6e쵠b /kq@1Ǎ!'節Y}7p\]K^x@u6D1>& @—<:_ "IfD]w0YLDļdlѯuHR,d`[3/< L4P債4// dM.v?*=gYaޔUj Xך4&[ʏg]ll,;2/Ń9Ƈ̿wpbqr (^ah_ߒzRx`[+/=E\5Z:жF>-(R$܇ m|ijNd2ES qen꘸|Y HxޒfU=@K _J)P )6RTSᙯFUJŢ0}W6S%43 ZF%r!IUtdBNC٣pZW+6"ysz߳+-/n8 )ki-ńn-.@'ޝrZ QE.VlQ>/9tt\PW*p,=8i#MwX~@DFC8m%ϿzL()ȫ(>]gGsd Ft^5F5MF)eLٛ-t.S\" ]=-M6 Vt]DӘLRR1ǫ'8R!xpQٽ{M+fuJҗD]OkIԶm'.ݕ9O^OhĠa`_8ot4^aŃi_I=r)e`Dؙqr)b]r5NvWn'ktٽc5K^KƈOn,8KnhZ{7m/kqo02I/JψQ":_2۸/5-#GH %Vh遺Һ_gs1v'>@L(cw5B( ~q/5-..ch$'Iq'Vd^d]ς&/+[ ZZ[hk1i <4).4EI/)9廌LJVbX͞ ` :O͐Xe!F/?><&V"&2`z+(~2G@h߷Ƃ7v_DyU&2+ɴj>)Rd,lI d&Иdo-.+,n|~k6B檅,6й(kƊF*ϋoRӃ X>ULSf VkiNw_2E; bRlVa޵(H(Rחu]f\ZVi a: ]9\xCWA˺?Wh< t~~>,=4:n#HdK-:#dfNEf/ Wꉉ&dZºFvy˽0Y)KXcj!R3;3Zo+`|4c_P\bY^Vh@EZRw^sɑM;"',EAv>ճ*V#% 27%V~վk:NTqg#E]RHT>>]2G('ߦ]i\5Q}=p $$Li ?,]ŹaprHhb-Q01$Ƞ\Jز!%bZܾM-}&٤xg|yVmĚRUTIIuV~584Bg6:5܍v;U7bNB{lYLۜ(Y_rBls*nsWO BnV`϶~W$79s+9li&!m<+ݞ]t# 5n~~-Dvqº ;>Z "Դx39d vudl ,S#gW*[f5>ߥRΚ)? {_?y3S!i# C{L5@p[Fӝκi?s]MtbLq- ==]{-^;p{_|Yy𿬁y>.btS,w{ƞ-iⲢuw˥YUnW՗SZʹu4z@.MPbJ޷G+*&1yF@;&Gn ˒ԣh$3gtwְ=J .=C&jpC)ć7ёᶋ>ÙwFTZ}/ͭ)Jqy&ݩQtӥ\hr5+LoBmk`u!&.j4gpFbɖ +/؛&p8kaUF&C@x`Sх*0,fPd]P,zk{BhFi^}oPt7cg~8VUN%PV+-jG%n TaWh4Jeɫo*L54PkwJkCeLxdEjQ{Gfس:JTwd?}~KkWE̷̗F->ǻ[?>GFηwxja1N{R{[8{pMk* K*3v4v>Ṟrsǟ?Z!֎k뤲b-ӹE"ǩu;=.' 8=FYL;ז]%kqM/mp x9!8Kht ?t'PU#wO/tD55>xqG`cPF6ȝo;wo=\28Ez:<ƙ_{UBi'#GQtmV,X*O g(ȄNVCʆ BCs^N/uѧ.9)*N@>Y^̱'mA;"iR`k1,$* 3.]>&'`\[9&לHӏWFұT}Oqؘomǭs#=;[6oak]Yq[?rQF% E6Wո0慁  ;\YBm1rVϷš" rܾ3G{oaž4Zy[4 +p:<%&U"?:*˺<ʕm994hzro~pG?hEvPv`=bY̖d 2+{,6y/fYz]a1l!'m;uZ9XY񼺻zuO{;{г{漒*+gˢMAh-] tّ:#c04R}5e~TTICVSӉG_<8Ԕu'8Ж_ rPG GX$+*r内)x`EӕL)tऍKҋn>\'̸к~][2[gÁqx tQw, P2e㕚GSJlC0]Cwzbu`Cf׬N. 8~-,S2e+.n  Ŵޕjƙt<jkP6 С "dt꠴@S[M3^'p}P(UJaNpLqbA&m9[!jQq3p+HiJ۱Ə74C^QͶ ^pX 8/:4DP1"h:l@[-mi6MEml\  ZZobt a%Q,i( a7L FUsf:3#1aZL|Ѭ9yv%7Ҳ)ta>A  1YؤtC|\:oy8G/#6thV*WO&nl,j%&]-l:ْƭZOA OϽRiԞ#<мu2GYxcqj6=†ߣR\i>La`J FFXcglyA,D0KJ0l|~q+b3 p K߬£tJ`ѱxHD"HjtF='BƠQ! =NߘBT!EEOsұz`(Ll\;#!~a8^ֆfB܇2GӊM} xt Ơ 0JӼ\+"L$y/64T8G<&82$ Ap<&,* (ؘA]Z9kǜd VVp0waăC"Ohd@(bs'}kGOPOLvQa㟂!A2,Z J{KBx4RϦo 'Q=}CCF"Uzٻ%qJFS`S*O~cPJMJuDyRxf:B  Vѣ:'CZ=h-o50SϥR1aj%O+$)g"5z{#٤O=x|jY4jOB3N;ژ1)D Syꕸ7Hfϙj.tt;sP0V pu J;s(-i8D]!ޤLI::s1y8fԴWx mf#* !=xx&<${?NjUӒC?oL˔=>H3#+{O~z/|-_|-_|H  nIENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/marker_btm.png0000644000076500000000000000033212647526531021363 0ustar devwheel00000000000000PNG  IHDR x!tEXtSoftwareAdobe ImageReadyqe<|IDATx 0Q4!XHA47ma:T{bW]Gh?К(|(Ű֣XA뱡"M=T x/P*BCE ``aIENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/marker_top.png0000644000076500000000000000033412647526531021405 0ustar devwheel00000000000000PNG  IHDR x!tEXtSoftwareAdobe ImageReadyqe<~IDATx @ դ&R̢,:1lmfnϜӟ.9PZ 2>t 䓤==51?3a-=8 ,=8QAqid`)GU]qIENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/patch_anim/0000755000076500000000000000000012653527012020627 5ustar devwheel00000000000000DisplayCAL-3.1.0.0/DisplayCAL/theme/patch_anim/patch_anim_01.png0000644000076500000000000000155212647526512023752 0ustar devwheel00000000000000PNG  IHDRXtEXtSoftwareAdobe ImageReadyqe< IDATxݱm@ᐰݨJb$؀Xg Mt."0.;~_F$~wMJ0u @ @@ @@ @@ @@ @@@ pQ?nł}  DXJ DD=n]8H WT{=A@ .j'~4CϲbZ=?6!|JYv:W,@@ @@ @@ vY2zZvYҤW,ӔIJCKhldטƎ/:&d٬3&hY, @@ @@@ @@@  S֣%ty.GqIq؃@>?Klldϗί;6d|ޙe4˼gOȌ@@ @@ @@ @@ @@ s[)Qf l)Q\FR\ aOdIJ̲HH<8Ab.l҇IJK b@ @@ @@ @@ -uݳJ]IENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/patch_anim/patch_anim_04.png0000644000076500000000000000154612647526512023760 0ustar devwheel00000000000000PNG  IHDRXtEXtSoftwareAdobe ImageReadyqe<IDATx1J#QqGKP4X5')39L56&v"͛߯3y/{E۶'@B @@ @ @@ @@ |j.XUUIw-M<5 @D%888MVC$G deye X $?\סY~_fv*gY5@RG[k,κ<=;%؃@@@ @@@ @@ -NYwz\NYBB^umJ&ſ8K,_ x64d3;!dwwۛYuN @@ @ @@ @ @`l9ݽ(}͒)Q\FR\X߫^~Sog)e,ͲIO!l^c;lm,3f eX r'@@  @@  @@ 06ٜwzS֣rzWW=AC-,,"#@D"{ؤ!X"@@ @@ @@ @@ @@@ @g`ww mIENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/patch_anim/patch_anim_05.png0000644000076500000000000000154112647526512023754 0ustar devwheel00000000000000PNG  IHDRXtEXtSoftwareAdobe ImageReadyqe<IDATx!R@aDt JN!S  LMU$$G얙ݢm_!@@  @@ @@ @@ \.;+yk@K,q q0I%qHdH"A@ 2,@ ~rU~ft7CUϲljj߿3YwY.ϻXb=@@ @@  @`в9ݽ(}G(($)(KUߦToRmhYfjưI/>ckӐY>>;w1l;@@ @@@ @@@ tS֣\29e=+H+իؿ:bۮM2|fؤ76So1WM;f2l6̲^Cf` @@ @@ @@ M>W(l$l`{ƺ@fK,,+H>dt`>$]X@X @@ @@  @@  /_xIENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/patch_anim/patch_anim_06.png0000644000076500000000000000153612647526512023761 0ustar devwheel00000000000000PNG  IHDRXtEXtSoftwareAdobe ImageReadyqe<IDATxݡN@ ()DLi(XH-I [Hm'@B @@ @ @@ @@ j.XUUIw-xj@K,q q0I%qHdH"A@ 2,@ r]f-~eIkmy[|S,7WYcfY\wg{ @@  @@ @ es{)QNY)QQHRQXM>ܤTעfeO&xjnϘYN:\OBfy r'@@  @@  @@ 06ٜwz,=G(`#)`KUc?u[M2|fؤ'6So1מ-:v2l6̲lBf` @@ @@ @@ M>W(l$l`{ƺ@fK,,+H>d/ 6"&}H,,",@  @@  @@ @ @@ @ _ 4u򚡃IENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/patch_anim/patch_anim_07.png0000644000076500000000000000153312647526512023757 0ustar devwheel00000000000000PNG  IHDRXtEXtSoftwareAdobe ImageReadyqe<IDATxݱN@qj0&:0ġ >L8;!&,|7 ;Lm'@B @@ @ @@ @@ z.XUUIw-M=5 @D%888MVC$G deye X 4?ԡY_f~*gY7@RQ|p?3mwYﻳXb=@@ @@  @`в9ݽ(}G(($)(KoSO7)>hYfjưI/^ckﺛbe>rev 6ȝ@@ @@ @@ @@ @@ ds{)a6K&GqIqXbWԩWǧ~7?RnYUc ps5 LN:n2b̲nCfY.` @@ @@ @@ M6(l$l`{ƺ@fK,,+H>d/ 6"&}H,,",@  @@  @@ @ @@ @  v ZIENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/patch_anim/patch_anim_08.png0000644000076500000000000000155012647526512023757 0ustar devwheel00000000000000PNG  IHDRXtEXtSoftwareAdobe ImageReadyqe< IDATx!N#Q`IDu$knGL[p^[^GRAnbf~o~G罒Wm;@@ @@ x@ @@ @@ ˥wqJzoS2DXbH[,qCd%8D"qx$LXWY `Ms#U:hf2~eS $o.Or;YnXb=@@ @@  @`в9ݽ(}G(($)(KoSw7)&hfYfjưI/\5^t7S,Ybfy 6ȝ@@ @@ @@ @@ @@ ds{)a6K&GqIqXbWԩۧf7RYEc pt8 LO:1tgY!sWA@@ @@ @@ &NYwz\NY 6 6=}cx@ %e@DBq$Ha2t`>$]X@X @@ @@  @@  *w.?FyIENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/patch_anim/patch_anim_09.png0000644000076500000000000000153412647526512023762 0ustar devwheel00000000000000PNG  IHDRXtEXtSoftwareAdobe ImageReadyqe<IDATx!R@j*5H,C3HznFPx,S*Ao>얙ݢm Я@@ @@ ī@@ @@ \.VUUywSO Q`%"#o1)l @A?2YbY^Yfy%6(Wuo_עfYM-T<!6\ϟ=rs֝!f,X`@@ @@ @@ lNw;e=J)Qr9e=; I; ۔MJu-~*Y1lҋ&x;k,` @@ @@ @@ M66K)adrzWW%aիOz{W~, Y46 2ҏ&!Ig||3v۝e6̲l\@@ @@ @@ lNw;e=J)Qr9e=+H+ !u ̖XYW Ǒ| "=_@lEMXvYb D,Xb@@ @ @@ @ @@ @@ @@ @/zIENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/pulsing_loop.wav0000644000076500000000000222405412647526531021776 0ustar devwheel00000000000000RIFF$( WAVEfmt "VXdata( rdzSoCd5U%F80!{m_Gy;j"U?,wfvL^5A* rsYS;2y[H9cZ(/Xi!; y4d3;`%{1vDb,\c3+gT*#zupyqpsply[wxw}./DAq`z@8xy7;ll(-b^E*x#}M/I?Uji,o  d H  Y  V  ~ 1 _ % d  7 y  ?i0U{",gX<'zU|LS7|z((Vy1jx-u24e!Q}Bo8gwmvfo]lWkl~rz+,sB){=}%~2[<6+m4FDBl9PAX1u+&z K0  r s  1 c N  ;u  y5!=?(nY5VH"!LV}6YiqwmvaF+U mH3UM9'\g\^?7 s.  n D  X 7aI .S^tq$G)pG_En4[9i+bR+x?xI) grKgQ|V"pn&\XI aE/m%daKeP)c.Zq0c?$PUF8NL b^84ocQQ*C7l'I 6 z`i9` B~1NvY3+;MJ[B]eM7U5{6i#XC\Lx 5>4_Muii  >ewBLh *7P!b9[X{F_?f+Z)`(([m)^Q%p2 i  7  a  \  Y ?  % X l  @ G #WR"oEsO<qHi9T}?Wd~t_:3s[Kx2]-m%`U mk* s # b  p  < U a -  j v   3 . a1%U*h%Oh!g \VSRUFTG9_ |lC3c%J)e"~kXT0;1 iD' :>{JVt^z|!.1COPXc[^WdOKH+=mJ}YD/n7w^N E|=cvn@+-Z[j% mi*mo)x/a:Fk|"5o+U{= iO>d!: |z?%5M:s;KS6(jOOkjo4r% >9e] 4=w3#gILs*:i&N[ *9^G7 D C " < M 5 j # dvX74Eg"H\;6i]  w[)iGvGkq1iL [>8" c L  m $  J  w    < %m 7=DY+v75Lg UH|@yU+ `E#~|yyy <c>9Lhw Qz6c.n  H&mMrz5Jh /CF^_`omlk{fiWLU3: .%m6rtd9H R{Om&5|>X4\0xQS5a+o>S^|E.&uD \Lx=SO):{H[^^Z-a]prmB|-Q(DW[MwS, `a99d57m`2 S_4fG%u9vnWvp S&-;[q%)DSw_ %l? ^CS9D)Dj75m3{= hW    A h  @ Q g w  ) ; ? > D 6 1 .        ] <     h 4  t[g>W ?4rM$t\;u#hU=7- {dEB,#,. ABXjy4<9ROhl./UKsk /]   6 $( IA _2 T J O a F  R ( V ; P K > V > v 2 r  o  n o k b X I =  S >-~a0yS/^*uwI:!}?lA<qBp]7Fot?D 0~N'iJ$h;mP`?E\sK%SmS6^aJcA%{kRLBr?'DNWJV#l-yS{LU-9 $=gu %NXo\IH89 IWK?`&rj W Zo.w"R)X Cd ,9LW\WWH 5#%p>ej\@-rAdr=)d!kSq"3aCm]D7' uke lhmwx+3QZ?|oJ*M~Q V=#CsOXqRA[xX30pr:R4k+wJ^~L* s 8 -  n ) =  u Y  & L g z  4 e ~0 D B T ^ K V K *A 08 %"  $    Q '  z : 1D  c G & \ a  +  s D  s >  m = s3cn`Qx7#~%1c\QGA<NKY-k/jSD[zM2zMzjiS@%m`[zKq@r1a6e6V0Z2a7d;gNn_n?(`Q0a"a'M J:W%{@#y21,-z*8(0{~ od PBJ7wD*aUunJd*G r}8Ds8JV_ kh!xVNs0$n'c/[ R c}B@@JV4n+{spblaNOWZOYGdKsMgqw,H;d&c?x7xR$p C)t???xP5t]'W_ /GgyCUk{59ZQypy0RVsy     .,2>BCLNrYWlWhY^[OHKLEN9B4=)+$'{vqVn4b#WC1dQ7$mKC<( 'B]k  *5KW0f<qUsmhLu]=i%l?YB/w'R6#xN_h*P$CbIKCy#ei hp"RSyp\;) ~} %?+VFi 8/oj LQ zb#\!Y'vW (:Py% QQsBm#Kc 1Fm%Car ()?G>N ; D*F+I>>JBBD`*b/ptvy+BVdz()BUbxN,b( h * e  b & i =  z L  Z J W _  Ty  J I %EhS/Ot=<T \b%kJ(;D]ia=V]WLz!u)Z,{L 9 t 0 t $ )D ORNaZxZJ~RFvPwHn3I2K17+1! '%*6Dr{)D2cxX>{#/{8<;j/,la|Kr  b7}[C w9u3u2f5D\2cEv[zQmKLr<c0RF &[1~R7r+NhQ"(>oX*w^&zQCjt>\q&puAC hRh@C/,( +4DWr@d2WH?x sN&5i2:]{E(x@Q^YqU+# ]  ' | # D !  X } P^  (H>(n9PT0*^Vl|x7w$T;r7^GeLY!EZ !m  M 9  ` v 3  F V  _ !  dt . RJClQ Hz6u-M(]-ffJ&uCSYG- }Dp?~pcSyCU*#~F~uCN6J^7w B~NsAt3PFo?Y"fp)Lr/gGA#g0~W6ZtgJ: "g?uH `'\.T `%q@{R _"c-cP X'T8rV/mH3ziSRHB>LTcs%Rz DpBxDL(w?XP3, | |F3se NPDNPZtx#*T[9Ogz(@J  N ^  L L $H?hRwEf3OesYd<ZSztrF!tDr%P&R^x;~AlL  y H [ r & ;  miC6$ j%aTk#(z1JT1_h][p)IxW(g/WIxS|8t5*O9K  _ W  " < ] ]  0}Rx"+~q[2%t<$nG"mMfm1>wj)y`>K1SpW e 3 j # c  " K iF~b%/Ve{ *&99JU[zw/k@.9 )U0[1RPbq0{)M \| _ 6( )?Ot."BZg\(WB[K'ai@@< s.>y_{5'wY-/{;/M2XC>3,w3C+e>Hy D@gS}0Hf7Rr ufO82 &2[~!1]s\!8i!3qsji+)af5J.M*Q4h+7JOpg~P  & % N _  a ' p _   I\zbXl>]TegCWVh=n*&Pas,G[os{th~\[5/h~.>THg`ap >_k'^1U i>zR  h*  rF  w $ @ N ] 4   9?   p b\q2-i)g`f<aianw!=m%D^Gf;6]Vh 'DXKXf[YQNp;K* gu#PTW bo.V]y#r0b2YpD;KU:C2_q.+up."^3 tVP:!|B s&,~$lsc?Uߘl ߓݔ8ޡ6܍E݄ۼ{T6& ۟ۇgUPFRcv3ܗfܱ٣+ZiݻڽYl޾Kߔܪ/ݧ,޸=Mg*$SW"Q zP2Y&{TSC)j~S`@l+wY,.r ^K`r]|#xveK* kE c  S & d ;     ; D | R w  4 o  2 9 M M P } R | N T Q D I $ 9  . "   p H , { T F D  )    vn LC +  \*~ YF |[>(~ 12ST{~ 8@ ~}   -7 |g   i H  f 0 x 3  e M  V  Q@ bD b`7`p J!No2l9Wh}6>OVapxx|r^L8wuq`[Qc9N2$*W%}X4s?VYWUyfi ;9w c & m ) t  T  3 a .`y *tn NEY =_8d(0AY[x@s 0RsE>\rD7X: m` g!U9HPAs_XA2,G{ReD.ZZ JtA5pPSi:F# {iZAD$%_fv> wP>O-0]\8Z"07KOcVIUB?$&w^0dT:]6u`ZLA@0 ",j=vMnix{<\+_HF!f/dI4 azA6'`#C'-HpN$r >/FS|] 'YXC z   ! J E k c q`  uq  ga1P=Az+A CRkY!Iftk=ocH,{E~}D4G\WwTl#Ef  8 J z , 5 l <  b ` # c h 0 w !   k q< ` I1; *}9|Iw^|  S >   c [   k t + ]  P } ^|htBw h8SFE)<=)bjxI'~oWS7+9?*/ jB'G%gJb_1>8J|+m@_x/H d q  xlgVH;8 "3Acp#- A;K^|-~ Zi'dfpI%M`}|zvD.#f#`=o#Y#c(h$n<= ߮߃Z2ߣzdF#D[LV+~ 0,|Qt? \H~0^|]^K"?X+:(}"e)F?0Cfs; \3^>DHW!MT>*0Z c03JQkG&O0SZro3| +%Smn_!qNs Q?0R se   2 x . E 4 b j % B  + N i  O q  ? *a @ y   - Q ,{ F }  4 b   D c.bU'N{W ?TY)m 1i7  UEM@zQs.c `HiAu Nm$w5HFWSXKC1hdR*-i,U~&p']t?!J!C p9=!~j L   r w  6 |  K lTi]o)LU1' %+DXau&4 "N6vOC zWSy'- c a  $ * P P b yxyy}`S: d(i Lv@+L1oOsx~~dcXO,?x|E?p$ b'_ 0>;35  y C }  R } 3 G q`;?!VA~)5=PW| :^&^DDs8wJq#?c{Z`HM85:8'"')%!84@IWm{v #* %&+#@"U,^*t&-)&(%&%zlc@1#xmWJ@/z.b@ '}kG#w e^D6#f+[8tYJ,/&EBTYsl !4WMz2wJVQ 7K MJV#Y"l=E#o_G27k|9jO7*v?qV:sif&fYH G|Q|?x-?Vw|*q ( R  | \  6  s  H U  e 1 b   > O  m   % $ %   "  t Q <  ~ Z ?  t ; V J    | 5 b$9i44}&9tEh _6g~DBp;I$kD2mV I:,:6N`oDX<tOF,xLB/~c82;yTW=_   m A  ! q o 4 Q "  i \ ( e . K d t 3 + O U Py XU KB ?/ %   p 2 U  e < U t  * >  @J  6? :)JjFD 4mz# LJ Tn% `F8)YzI0}0;-7Tr~]dKQYo:G qKJ/kkxPn=hC_BWSe[eow~4x,YB4+dU4 s| A&6x\] W>SrXWDuuN5|YMty!&?DYgku   n w * L   X 4 6   a 1 Z  Y o   $ # * h I  l %  M . 2 z 2 < e U   b = WI|.W&6Cs| [4H:SZDW;vO))C!:Ky@  !u   =  e    '  7f'J ]},Cx,Dy&Qb3O_}~resHO8K|>Pd0^Hl(Z@7S D 2 M  } o B  mhR'6+;\>7{Tdq [&]U!tJlKM Xn@2o"n w"BeBb>x);Nsr+qS k+w*M=) u}AqiX`S??&Q sH9n<g[(TEZ(v:DPSSAy/eG 2zAZ*t3N+FZs{ ' ;TM{Ni@^3:1, /5W w(O_ 8l)NYJz2S,*#)1O6t9eaBjWG/O5bd@Zd(f+ a/ xejrP]1mQRMF;4i)A | 1 b 6 Z  7-V T-0*AV5&`atNj1;`;%Rjg>lVfxO  $ }  v  X : . + Gp*:Aw+m8aap-qo<T6#uikxx,CrIu=kD'hW,Jj:WUF^= u  4  b E M f  N o ( u 4 u  `  :6]zI"Nv  8EeesnucvFy'`g \ D *} O 0   j <t 8   F n / k   k<  V M   {5 < H  dZ T;SAA;?/ 8ygf KD&wl8SZ=1bE^cKw#,F)_"1.F]N]BS\hliDSrC|dRMI~DSJLeMT @rq#?PR.hRTR) }@3oP|26]@ G k+,0'.d-,+; c*HtzYD#":Tnf0! yVB*wcL\:7 q<  Q O 3 T  ScW'9Wlly"zoGim!y a:a7DP3SCYRKbD]YR?1o&7RP3NETCN*%GcRrO4jxR D D  Q 8  W  5 M  I?@g_Oo>jd5} q9X2RjmgcE4V: o]@.nh8FSVR(|l#n A a E}    ! A _ } j K .  k N J6 n[b+?yaD h )#%&&./-98H>YVrR g(]*2E}ju0g/5S r-XL;H_*F]c 6~1d`8&yQ{x[;q^N3,'=5IZq%>P]wvU 8\r0N|n%vs!i,2FQt&$[THo$ `:q[L$z%n1uJ = Gl(5OT.^NabOzC/'S|kZX;)k`u7G}Obx=G z }w?AoJ4uM 6 _1V} X anD9K@cq;Z|d)GfsB{5n* N  sy 6  $ bE  X d ]  IW  S3S1QDU D4m{N~a7 G K"K~ed6u~U"h *>  Z ^  "  Ak   km   C [ $ l '  f @w ;    H     P )  ^E 09fyndS;02%Em #+ ;@ CZ Lj a m       * H k & 1 = <  L - W B X h m q s m   - G g s  k P @ m  Q  3  X - Y  m-\:u$#fC-WJdcEc!X><%G{X'^s%(n("Y&vjp6v_bOsH6C eq/~'h`]S`o P?~2nE*J(e5 )I]{ݞQyݸ2vC޲p:ބ!c"yDoSt~0hJRIfIUIjI/$ZtrO2I^93V/?EEip?9rpJP,An~7Oy1<<%v[Zt - ; < x  AE  @?0c^o{xukCK il$mPR=w >c*-30E;80&|^4 iD; bK p3{Ga(a)Onl>(?F`j8~0bS!rp H B[$b | CL   n P1   i -$ ^ X   w # ^  3  ^ '9   c8 -+{8*?3 8XPTl4B\P x(o.T7me 6>m{D2_2bt Qv*YX1oR$,<# RU8bwX7b"l  F!oUrCv=kHGyPX\d hb'K P v h q  v 8  q ' 1 kO t8X&sA`KpOtZq(< p! 7"K! #"#"$#;%S$%$&%M'h&'&(')8()("*V)*)+L*o+*+#+,+l,+,.,,r,-,,-,P-,S--N-(-@-2-"-7--)-,-,,_,,,,+M,Y+,*+*R+)*w)v*()e(s)'('D(V&'%&$I&$%`#$" $!:# a"! 'F]bZzl |sxrip_ [d aP W P  Z  f " ]4 a9 lXe&<Gv$,h\tP{&QA)P`g]: IQN`RM~Bo>X?M:JGBK6Y:q@SWi'1an/Nc !GZ~;]o!04MSNS&Y1X8O0P::;181%'kArG*rP(rD|L-uIrS#R%vG*_#~|[d3#d kL2%Z/l=u_aN}FU75:5%-'210r0h6X:TJMYFpHtEGLRJ\fn6YwB z7TzCu73ib$;ew02zqH>9dCLb,h2Ob5*q wG\:c ?foDG/i`=2}lQ/2v)>unI7*XjAR  5 \  6   x j E c R  T h P9VuU6NIdD m&!vP^*2K /WjD&TvF.O1o9Q_fevnghd]>]AD'3 TtZ/u0ek()<|Ga j)N s%iA'y-a6~3[A"HCYt}50  W h /  J  V  U  u M  N % y 7 m N i % :    s zO U 6   n > #  ~ j Kw 1P # ouJ[4 xFY)GxBoq{#!pnl@ew< SWC})Nd8D|QGnXG85,) 3:;\u@Whb'pr@C/ xm,j5nXvzEd ?Q3Z9b4a5 FU(U0o/h6h*icP@,vJ%W$q-J\^ `D\Yu 8e)2"_+>.z%6߻dJ ݶk[ܼ4o'u'ۯrކD8ݿ݆٢bق>oSUJSM]q}ٲ%Z$b ڤSޣ=ۋ^5Bܜ=݀exߔL(qR*Q qdOCCH(QVZk'kS93SFi`n )   ` UWh4Q>/g*sY u /"!a#"$#%$&%' ')'*(+),*-+-v,.:-/-0.F1m/2020]391314Q25252363b646O4 74W74757O57w5858585858575757r5f7V537*5646446t4514w535343 423G231v2[110V1`00/0L/s/... .-h-,,E,++B+**;*)))(E((y'l'&&%%)%5%j$z$##""":"P!~!  6AnSb)!db `:o^U"vEQ.?  W  %  n 0 W Z >  C) _rl'R<Sk\#nO-yq;9 `(U%{@ zM6TsRP2<_|Ho#fh zq0yB}VM(t?[3jR|i w#$z0~- ;{9C QSO0[Opr.)O2}UjLޠ߉!3޿Nއ0݇xܥ4OۚۇP/ ix=ڻj٘ٽfقB(بg׹!ך|ؾq؏lbT<^]`fwՔزզػشؿUմE/gڤ"vRۖ5ט1 ݐoJjޮf߈spۏyݷM xA'߿ghJK6:y7gE:Nlj&j9 Lw!MrCBi $Vf~%;O d(?:dpZd0a$  r^UU a & u > - U ` [ B  46X3EW\<~z5]B<[$SnQ = !t!5""""v#*# $#$B$7%$%Y%a&%&X&x'&(d'(')]()( *K)*)*%*r+*+*C,O+,+- ,u-r,-, .-w.s-.-/-D/C./|././. 0$/20X/Y0/p0/}0/0/0/0/~0/r0/_0/;0/"0//////t/G/j+}|)/:RNbx!1io,J]J}6w = _E]#lI$$Kuns_\Z?dqeks,{sD-B~d|Zt sV*21,V>uo;A h+tObFv8H)u@waV#5z7q9KIOK84rK*tFo- aLaOy2Ef~/Li)SBSt+a$CTB@~l`jA-]utoQ K a f o ,   ncB'de?9o9p? V|EDwD  r !!"!"/"-#"#"#$#}$$$h$4%$%%%^% &%O&%w&%&%&&&&&&&%&%&%z&%n&d%5&%%%$%$x%N$!%#$z#j$%#$"#?"#!"&!" ! !| KUQt +cp`lTYJVig t\@'  G m  a x Z T i Q U6YcsA6.mn6h|i haRD9/5q/Gkz l; cWB@1hp fKrH"=3,a|)_2{*Uj%_o};^1{pp6H4R]%p/fr8"xMk( ~o]p,' o/3KLUeES-cfDpKj~9YrdH)nXQ)x ?vuWAec#,gi'2dr1C (vG)|\A!*?p9p%L|/JHvY.W}:b%M"ul&Z%5Q<: F'I`pG!WqrdRV]\`iYsh7~7 P  V  i  ` ? c ^ T  A =  [LzpV q>`z/!UTm,l /.3. W+ t(ZNBCuN'C-~/R    H  ^  # - 1 d >Z9z'$pm$k~,<Xw2nL_7yaWUC=%0&       ~xjm^[FA2% ktIR$&|{HG"i~6Io9b3z4aV(Hj6s)gV)x?j3w"P$l2yMT_gI+dExx|lcrfV)Vd.vRrv'xb9lW+9V^x#0CG_QeC hO W4_XFh0<Wckv;{Fsg~j~|h[L8,yrkMPd.G%k<b ;zL^2vAvJw6}Ic 1^(]&e.Gcl6EuZ'&TH Ym@S!zL_9znQ/zl _VVPW`k) D  f C n  =  O 1 U 9 k G { b d n o f V ^ S K /  p  [ R @  z D  ~ c F D #  >  d '^  ymLq FRh-fG VM%QTN3An2O(<=2G'xl1PU|=e&S!qAtJ(lc0 qmcW_TcZ{Tl`cpQdQwPtD:3 lW:$ h7w$YK*mS,`2bBmMuyC\ H4* jTxdr` _+L:_fhn\cqt~ 8M{()MDxb2p.b/h 5d3U=]+`H"Ns&l8jY-4mhA9~*&#n/7~H` mZ>z<uhihNcCa9p0rD} N  T  L  S B z+a~<?hTk< V =d>p/ @&?/O9H=J;;84%toC<|~FA FJ  >Fav!C[  ^ #< = q + x ' i * d ) D  d , k 2  \ ' uP+vI$hU3p^ZE7!%w+oeXN M$M'B?EGFUFiJvQOln%Cj'@* `Q o    & 1C Ev f     @ , t Y q   ? 2 ` G u b i ~  o u U r ; O  6  _ . s 0 p +  B < o&3xw%k4DDW]F^m]S?2.@@ MlXnJW[?R@Q<_=VOZPN]bd~ 5*^_(!TOCL-TFf%p3nA a$bF>vbXH@77*15DOR#r)Un ZC}{JMc"Gh*cPM40lt`U3Q',yJj*Bg~ CT|EW?Bw1`X6k] K}LUNx&^7k :0yfkUzGn  j   7 c S   5 TtJCf?1y*I.g4 V4{xY\BM50*85E?5V8qVh#P+}Q{$T0_ Jj5XQ7p:%PPt`*S>`%h#@LBUu;3d;=,)(p/O k| yj.H,.xxeU@cU f!T==(i!UFhSD߁Ag1޹݌nLj,I!C (&%8AY1qKa݂ݱ< Lp߾ #\ZVA e5=Ff w:D*J^m3pA^>wWu% %!kQ+|TTi@^V>R\7S\QP3ElWP2rJ=S {R"3 c    o ` $ i  h # x 8 > $ Y  ; q  JR!Ze2M;z5Z32:7`=9V^}kR}:9 7 o w! !6 D"z " # u#!#K!-$R!$!$!%!N%!%!%!%!&!6&!R&!]&!m&!z&!r&!k&I!S&3!?& & % %R % `%'%}$ $F$#!~##\"="! Q! ? &gn#BD f=%z/w}2>~ 0 ~ T " o  V  p  O h  mC~?0zF/to.;}p;Bp kf9f$~~CpXWaXURFhK`%@uM&s8>:fs(: ~Jy#Y0{adTGGD>HVYv2Sk3]A r6sZA|%_#f/ LeL6r?*[;2]pXEy@0a >2a>o@)nSq? P"p+EOQfbftvfrhhlU`RPMLK9:4?B"8AFHGSpy!Bc8a#X(4_5*o'}IDGf%{jq)Wk@&6_1T At L & l < v m0ISQ+\D~q$Xd  % Qf  . !~c!!&!z9"i"") "f " # # 1# ># D#!@#!:#!-#!#!# " " " n"p D"F " !!V!g! p  1fUX 0)P5S7W<]6Q->93 {$o {yx  |  x  + }  E  m  ,  D[ ,/yo%"ty,.CZCzT a)xshf?KM4>5w,b/5953BEKKZff\mSiC(v| vlnW@d-J 4U-f2Gq7h{e@8`Wj\[]@7"~bPU&J`SGZb7bewiwm)nprC  #}Do5Sd @a Y$mA߰mC޺޻ޱޞޜީ+߱Tx0(bt ^> {DQN>&;#CS:F`'"f]L7q/[Hr#F5WSrmToUd0I%F>N8)h Cr?v0 D'N=cS`bpV`W>;jW9eG8!.$M8rXr6h8%ex _1g f)]X3s6z}xr4 g  Oj  & w j  H  >  ,  - j2I8@VBiPqz6jwy-cdO&,:b\Q&U  L R ` c ] |Z v? T. = W[6 ?o54k{8 l tw*Se*ILp~%8(K7 2U %  x  G  g  rM P47 ,L$0AG~cE;11z=@&=q8\l:MQG ]k;<m6SV;g7O ygh6@#B w~I_ A!5i.xL6Tm*^4KssNHr4H,o .   @w]AF?+$mbF@^P"g5!dY)kDgHP|"*7IES_|[k\YY@P"P49&zF l&rL&]!_S?dGjd(|7v%3d0Vr> V  5 = n {  K c ( 9 ^  s . Td.,_S :m7WCvt  *ENco w-*9?IKj[gf./@Wfo*Nh/HlYgo%z.LAIF\RVblnp $5HFad >2&.4JK`z&O#l>s>w.o 763@_\16)0H%d_?7w't] uX'  _ + Z 6 H2,yfQ Ma/[OOK+C&Ph?0z<p*]'>OVZZT)O2G=1. +Yg*c{*Irw/(r1,L {s*[PJj>-3J4d4PXc%L]%Yp/{Fp A  Y 0  s I 3  q E +  n U 8  | m N  m Z / { H  d *  ]  Z  J  H ^RK.%XB|EyF}1\{DKbhura't9 h! V[dq j=xKQ!|n!pYiwV*6tt$=St9Hߩi߀*c?/rXSNSZi ">RVvߙ_Daq(agG)i?7WBL,2G5 ]4#('FtkS:dF2KP %ri)u @!}q`.91VuhrU&Lrvx`ZUQ1?78c+l0":>>EU\qo"&JDg)n,Iz=.<y7p 4q{FTr 8 ? I  O F ET8."fsuS$t/`W(e1u`iKPKM`dz LQ%>|(cAf:}=yyQa;X#WIYNT:IH.=?r4e*H1J 6 1gc8sX2'|WAf1 X%o*}@q;x7D PZTWR)i)j,V?pc.VSxi8sp8Rt(oJv |$G=E~D ]?wTB1 +0Xe ,?_GUG&uB {8YLuAV+E =+=6.A)A+B"\]`k[?Vt6+\o8{'w+`O B-raz3Wj eVF-wZXD3n%G8tND1"/?bCGiKy,a~>z^/qVG![wEd 1J ~  + G u # I ~  U l  < i  _ g Z<};y5iW 8cKz 8/f9QUbqpub*p2a0V/I+%4sEuQ$o.Zm3$qG$  e E  h f  s |   v ^   @ 1  + 8 `  M6e x\'9O 4;u wt/){DI `d4X"q:` 0{hUJ/ nMs.UJ32 yv~YrSl?W$OI?(tO/ulH9 f ?/oGl9T.{[s3\?!xT@k YL%"|aG5 iUG%i\?#kZ=%m^>7e8&nJunE=l?b1{gEN3pS*}|zt{*#\&tEi~EJOz/R.\OCVG3QtJb\~PYFA/&b{I]#:l nB8sO(K6"*[s :? x   - m * J H  e & k ? r ] ~ t v w q ] W E 9  | y e [ N 2 . !    S &r S "  i0Y2p? Y&b?(yH)(;e3):t6}*aa e  U t  / _  F N   : @   ] " c c  >[#:`#&WV@h (e;hF-p6HfJgn y H z v  m  P  ,qSt(\kHEB lXBCD*K9j`&'s`s*j"c+Ig]A:%m`a _]*gNroU.Mz5O>1< gFe[:*qaj*y9uCo3ybt}G$:>z:bQ)Tt;$3Q14iS nT2Kjn:^2fFh8Z)   S:   j  L 4 k    ' 9  A C ; 1 s  @  w ^ 4 # 6 Z  eC\a)g'H&eR. h` `Wqd8 Vy_A/%nE/+5 NoEq%@8_{*zHjw&qPon eT0v*W,^>y  >Sb/pQrgnyiYM6  .8A^G+BZEGQSLPWPN ?L=D'47D k= s>6-;QlelpU>: {lM#.)5>F@HjOCJ#TJLJ>wN]KB:+3 <$(#|kNC' nejV=; Z0!|tbn5cRA+G JvR-n:Va'3~Cl@!bB|V*m~emjFj4`q ~3Z/#WZuQhI*)Ni"8 pIV0]v`X(\gh. ^J#tEs- v h   <e    K + C U Bg ]q r q n c & [ ) > P . X  d u l | g b 2 [  H ;   4 ]X%h s`8/PncEalYOF/q@q9"WD^Z(0gT6r]`\\ry9V/cd,o8EFSRX%j'XmsrfE^#g`covwl`PPQgq?y`u'/\K6 z8^J)qJwX?7HdZj~"h 7ho]4LQ4Snlm|lgqMDV(3g4h>\^"NlL]wiU'arI/2yxIWLR(A_7EGr? t,u=]&^k3+aV*.X"I4d4|r}gbs/^O 7T0=Q5(V o`kK`DNEQSa_hqv 19KSiflq |)w  d  v ? a  r : 5 b =!y$!qv,FTq6h2A\y&@Njzse{Pe6N@&gSv+Q+hQn)>yqQ\6-    } G} -w S @ A ) ! o  f  G  =       $  / 4 7 F u > ~ W w R v [ x p w c q d g r n h d l f b i Y R n W K N @ M 8 J @ 7  / "  g U  r J : j  @ Z V  * L Y 7 m#nI#r-EShMkl &Z?8Nil +j7K(oQ|-Q;dO>m6K75A~(eqX%*r9>ivHTwU> #wD eH* J{\`I4-w]Ax*oVOC(!wuLP/ 6LTs 15N4`lxy,R,=^ At4bC~7oI!O5au C9shVW0lP.b_ j6|,\F Wh M`*dL;2' r~fqSY|\[r~  (,  .  #     u s \f%J*VKw%ep$ lWP'q)c/SD_ Bb .?Go<oJau{zkhfwNkN_A]<V3@<8 iQFr5^>2!nRr4R(zOk-H'|az4<al*1 s|;Q l{*}.Y}(S b  O * C V  }   L    *2<i*,9]qiwj\#W4I7Z@[IRXlVj3l U7eQ[``:u/7g,KuR-$vAv^=(}Y%hf@/{){ ,AIA[Hff{w 88OQgw ,1XLc]y03@]+L!i&Z.o4f/l0y(c$p#__WLF51( {oXO?:3eb`JP87B+D7?OVgt-Pb0X%V#TV5W9;x0SZG#<G\vtT u*RW;Py-W]*=Pu| B)  f"    ' x + Y '  })l!BjW4|cCIX!Mc)m` ,Rhqrs_eUQB6-"xA0y\D8d1Mu.Z>%`6n[Y-/[X!9 a*U-e9W -  S ( ^ ,  Q )  h M  s T 6  e 6 , w Z | ? [  *   x Y q # _ 7 ' ~]~j^3:gpFJao/b {3RNCe/Yb@K~|IHpN*F _Pz*9gNLxC:iUKk RWWlNEY4dU61m T@.&):B^l"C S&qH|u0"M:zPo7\ATe&Gg %;M <(N#X*N2\a   M \  H N B = t 6  U ! z ' c f1jaW]7;#oBUu4EqJ,X+@Z#P2K!'AE)HAH\CnL|A>;),k[1w#_9c8`,D Rs<xcRz5In"Zmi  qS  l  f ` _ H B 8 - gwhT%/!+"mN@ !{_Ia;U =)m%Y B ' bZ'UURz THg)xX#~7E9n_{Ax>^?vk\EP@COKr| N5yAy^(b5z%X~.*a-96\ycNUR6V y[]S:RVXjQJK .P.f< yLP)u>H.z dn   @ e  \ ^ 9 7 ~  S C q  T& zR ~  ( M w,NX|',?NY^b]`]OE7yZDo C   N v& B  S I , f > 6 ` x  ; R  3 r ; {A h8P#DqEsP&{Z/~d; sR2nbNL79*% }     ####'' 447 /'-kYnHP)? d\@/ xbM(gm)$]o/pI $r u;V?5wG$SG0Xz]KeC/>_c F< hW%#Yt-K'x[:',2g} %9`JQ1{N*wKi(l:#pu :bz QEZ   l y e @ ( +  d Q ! C5r.w;O6xiF^myui~Li<]#=)~|Yi1L ; m 5     jy @Y T K 3 2 ) n E 7   | i i ] M J C 0 8 % "       r q q g c Q I 6 8 ' (   i e G 6 &  ~ V W " % w E e  @nDg}74HYiXd"MuNrfR [IN0KQ8z^3 x[$tC}h=\YEpu9n"l|]Da#Nw5ct5hLRJ2^]Cv4Sj.`4S%xdTI;:K*PSHa:(/qV9c^5LVp'e^aLU$O<s hdA(7Mw1Aj&loO7?DR~ZO[Q!KG5iE')#8a(?PFg[FO^ Y/1dwlgT6o9.Bd72= 8i.E'!nLm  wG  F  v T @  e H S H  ' (a l  ',XX#MDpa!:!I1^;hL|Lh`dgj^`hME;5'|f^OK3(}fG2% dV='weD4lVPE*ed P ? -              + = P.Z7xB[hj$IXv,:.59@SNaIjI{G8}6)~x nFH#~g:  Z !d   Fw )  Wf " + G O \ O f F e ( S8`!dnyf(}@x"}O'fGV X@}Z M nD7:}dvB@/Fj}w0blc?)%$ *:\u0 `1vMX6V^e7z `o.U7Vp4U &;S WS\HIC}H|1 C.VOkehegea>&s[])I:{Ep5T s?:8h /]k;kGhE#yz}tw+L@5}Ii4AamPS;L?G`B>D2M(~V,p? gQ gg 7d[\tP0.uG?n~r5o<+Qq/ p ; V T ' ` # @ ! W I w v  ) G |    & ( * ' 3 s n L 7 , U @ p d L 3 t * V  )     Z A         ' r E r Z j f k k t z  * Q r    ? 6 b W n }  ;  Z / L ` k   5 R X o ~ x q } ^ f O L 7 &   x ? @   < 1 Y @   P' T$lP}"5CdFTSAiiq$zKitsS:,n CIp*M HEyZh7S?$+ 9VCoPy>1W7osS&\6 "=qq d#XJ c>XtM~F_m#*).s\7"oY,e-{[&Z1g2PZc+*iOm-d\@<4EAvS]`\vghv3XTk|W:` j@,}|>gZ_GD? .["<p9iPYtr= h.v8m = | * U   @ c 'y D o     | p ` D +     g & {^9%OLd8!~GZo.%ha +_PJ ]f0q <|hHa?/  ~xzjb\bnb i!s3sOt]u.U w)0V[$|KyB p+>YyF}$ G0Gg-H}- V6{W09XNn!0H i }       W7 VgsZQ 0hyu*>z0~E25E \z;{.Ssw>%>i>VyH{RN}/)&{O`:{VJ?' !7-8EMHV|[sZjcZ^LoDi2g!prgmmgS^]DM~K;lAYE_9G.F!6/+&&#,$%,;1BPUru-3EOh#E]{ABfxz:<}`+N3}L']Y'rmI6thER6P+z/g&j*NVr&?9f_W  *; 9a B E ^ b ^ j j r; B iR yP nS y` uM oY hJ e2 o* ]( e T ^ R Z L Hg KJ I( J EPD@y>]J!F NAGDsDNG-ACHF?U^GB3'= @7:3/*q"_I=8 tk`H?{4upe_QZG87*w Y"N4 %cL, \P(sxoSOuXV8/5"/ z_5-kVJ/pY5)|gO$nL%}H$h>n,9bp @"eu75 B}9 VcE*8f1 v4km 'kb)MW=nFcvNmfOHGxHWA1Sag)zMsxxy#[}S"s8XEtE l,U5d:m~4_0 O?uk$[!BZ~?}U?Xn>oW%LhJ Q)s2bEsJMk@4bE6 vGcAz @3y7,uV1e>u)oI}Z@zj&6j]7 A ` Z   =   * Q ' w g  S % Z D s 4 l  0 W Qw   3 n 0 T <x l   $P,OoMk(F_7CuziQ6"-5'(i&;"V|kKb3? u A Y   z =c  } L Y  i " I 6 x 7 A  ` G J6c/)k KF1#`Y(Aa~,kJaP_Xo ,cPsyB+V\!zKIdO+' lb>?j-mE&]4{RBX'6 N*f_NWC1;  hB%WB* wokY[a`Wd ]brh  . Ebz;%X)w3//88.ZFWWdt ~:c $PKvbCr;eO,Z 8IaP/l6? {%$so9.cK %y_.4v_ P{>2xG!f L_HUI;g2 I o   C Y ~  L  9 B V ` m  < g    B G * a E r p  & < S c   ' D ] h& ~   ( & ! # / 25 ?5 S5 z4 / 8 ? 6 6 0 ; 0 ) / 0  . ( # # "         u X I T' 8     ou 5M .  d  n @  K j w $ ,  w w( 2 o  RRf%xR4sy& qMSlCt+ ;I^} :+_['xcU*/\t:dakv0"Z>LM y=[0^=!}whdet!f2vPkF\&x=Ne5Oi$KNp#1JVk|(6]_p%=JU6ePnj~# 9sJ`y)R|>s ;s=sZ@V'1kjU?~8B9+I`RZdSN7 i.v)!nNab!Gx.9v1pX t 6  S  V # Y $ r  V 8 s 2  [ b  : 9w o   'Zo-B\|*:UYm|rturgUG9$qKb%G   M   [ /Y  w J E t  Y * = i $ Z  { s= 1  l Q5 xD< ~MA'og6F)~S1jiSz[^U@C*\Xa]m|@X  88BLiw=d 5Tbl'B]n}u^@cS'H| 1^@9cU\PM)%cV6\Su94Vct*\L3y Eo}1p{&D7y{P?n@` @E;7:EKcx HBcur#N-Yu _'M(wBDq "JLE iW,U*|Nb hO(qpVm3H(pM)rZC2,nN H5*#*0(H6VCjir#K2x]-i5w,{H\%zS'tH*5Itl-8W/PJ3nb `Gw RE;oCU DC}KRyD/ t  C . h g  0 & ] n + F r "  >   w ZL2Fs:)G]C0QKhq{ $qbM,{P C4'|CL mGl Uu , N > A   K \ \ E  )q  l&1u+XA*f3+^=$ yLpu]xzU;" Io*Q"Q{&>.]@DYcs y;r=^pv}x{{g[tMhFR6+) sPiST Z/]{FMa#?3fW+zl.1b4E?`'HiY3! LpK/nGxzklGe3^`[ `me{/?M]y+/?X`}$HSj"&E]t*-6>PQ3UK]`eicb^^WaUJJ<7;+'.4MO^Znv#,2O`6A` (D"@3WSY`}%EOg  &+ 0.B1MDGWVQT^Vf^veU[`W\N_U#K9TqTHCGGMAGaGPVb4ppoBP=X]o,j83[m(lLe7p)E ^ Ttz!6Ks|#y1_,M;$9BMWWK\eAtp{]:{ `L(9I1[%h/68^={S\}$P(Q;kn 8Ins A Bl i   1 0[ l}    5 `> Y r  ( L      = X r ^ I $   ) 3 Q - % D 3 $ } + H     G   } <e 0  j'pZ6Pe2]#Mw<k,xqN,# QiN!J$c8oVaBs=S?7" 4]H0 k\hX\-B*fBzs`Dy&V-w8}nS@Y(A wHs/F9srTh*K L:0.jR""  M& f=nB2yyfeFM9;0&rj[E< ;2+7L W x  6\${?@Jm6c^z;-_Pr (4=nSw.h 6~.!-O?u@>: EA>_8:46%$ =K\hptsmljV=g/S!I'"s>gg;YP4,Y2 {I jI @ )DPb|5W,N!r\+2tfc9 _<"bXA1)#4mFdVboTQ/G`3(2  F  p  e  F   r . 5+R{_L;!mT1UmAOQ9m-h+LhH}go 9?E\ad{}qmvPi-gaJ=xBQw7djv<;j1C%i   %n  =Q C 0 7 o  8  o`;JmyDL($v`n>k(xz?-3~V?@k1HirD3( v4wj^"c+eEkgqCh %E\,9ERBZdS`cVKG7+ v`2[?"e3n: Z!jEZ_X0B_->~L|(9 Y4fuY}aZS4N$`Smx3Z u6m~/VW=v'c(y]Ls1*} iwO-o }AnZc^XFX#De15$uLxpA]!-`i)9E( Ur   II   8 & N  p < 1 M  z    !  0 X q { \ L -  h D  | s s [ @ F  9 !   p T *  _ H 1  i O 2 $ p P /       g > u*  w[KE!;O!Kl~ 4 e     B u    !! <D ag k    -  G ! d L { b   '  N ( . ? K  F % [ G S s i T b o  ^  O 7 V U C _ 9 { '   | q D # y Y A o ' 3  z W ) % @ J   UM "H7_Iv@o;jrS9&7l2(^a;C`h~SQXxvW<-,?PZnLW&OT~w,VIt$4>RTs9[4ES*nBl$Wk #3B%RaYcp~4m , T q      '' 2> He C S m e     % B U m s  % / I T n {  ( B C { W X m V u ? ! y s @ & n P     G  y _ R E3    h F m L  f=jDh.emDp3uMcy<T]V`k}7 p]cmq=fQth.;Ji36~eNEJ*~wgYFFC?SEQh0pOx06^a6LNq;+|b>rV}J} :Vd%h0M2qu+d8TrI&c2<af?u K*e:Wcz  #%6 L [go}M;mZ- scQG`08 [x<`8 k5[-m_H-)zEfT1N Wo[<`4ve\3TM.4/W$9# -#*37zGvPi^amjuex"Iy5Y|,Kz!Hk'V?n z= uthIY94*"uh$R"T(D3BQQ`JlPVcdv0@r0 7-NYaq/3M`oou}wdo^VT67-~Uf8ca/%?KgVg| H6t\k#EV%cFf]rkv|=nM*C>U5(Rb dU "x(nA#E}bPA-&*"0>]y {p iP< mL@4nnb`_^WS_QX\^hh 5>]} M)~:jx%S3Kd|J>tH =|SY=f?@j.WIiGF}:L[u4|j;P!  5 M  ^ [ q }                        # $ / 9 7 H mG rN eV eY `\ Uc Yo Lj C 8~ 4 7 # ( " "        ! " , ( 9 F L Z e ~      ( *  A / G E H h V | ^ d p { n  : G ` z  j  i  ] F , 0 ,  &  $ , #  p I  p K f A   ] ` S^ 'p.Z%-xY`i,j{ #4h0#M03K77c ~2G=5F5j?)T\z>_/r4k3Ge=W&*meIE/<sa\QN:<0.1#5 +-<)_3s4;EC S.^_js!W(h ]*/MTKkB9x4SI]l|@_9 L$ZG{;[a[U ['WKHl='& 1Rxq[; E`}mO6 2[bnZGB6%.B-O.o.3EQku1Q?i}y!lG)?LItY#&Qio2 ;sSB.j^R:WDt!V&R) v  R W  a  \ u  8 8 n d  3   N o w I "  5 f[  61]Ll-PKqls0Zj OS'jJUC)O&Dw9Y{ 8Q`je{|pud[L@n[#jS~Sk,eQ&G3 hL^ g9 b C G . '  { f V   qp   l "|Li2pO/*}3 qY/RnH'qaF"gfJn4 r4CQzUR* Xx!BId(xeq0? 2# .<4bZq 2"aDrH @rN#^g(kMMGG);%rFn^ V#AH9|rCYz2M{;~KDq'H~9D,vCc 5@~Je"cL^5W"@8Sv\[-vIP"-.A_;Xfi?|Y ;SQpTJwZ!]+CH\q:  % 14 dD d r D ! c , Z  "  0 K G w X i  @ o  ? T + H g {  G o    . b    2%f#'+)M+sD=?<C2AfGmPNRXVhc]mblpiW^FBv2Q"; X.vL~ <  k z 8 ? y ` Q  J ? p 1 - k _ 4  UO#l:uN.R<y\FxYX 9Cn/<lPJ )k3J +qi38` y%{[9F6@8s;@Xu&vU} a (}XA\ k>|N&ixWlWfKe@T5f:r@zDAPKQm]4]?i(3G_Kdz+RC u#6BPk@~mDfHUd,V(K:wb89r\sQ; ~\)p&|aDka4BR-]{`k`\jSmKx><7.% t [~qFB.  @  N H  8 / p K x ! V   $  , 6 @ B @ ] Z l F R K  > L 0 @ . ~ 1 m - a ! h & F  E  1       # . ; 9 ^ f q  ( V | 4 K >g \   ]`* nKG6{5q/!v~*/x Jje$_F4LLTw@LjG (E*j514@%' F$mlG!A_+&Tw Hs  1jQ#=  v  {Y  o+  E o(  A y * 8   yfMJ@s*Ec p|txkkUeP0C=c,,  Zpe=_66*E_9 !P>wzzN0ߡMe$߻ހE bްF||Y{?4j7|spluv^XC?ME\^:yi;'YEA1!}5(KO{R\CZ+-!w4s~F} v q . g Y I O ` N  < m ' jOcE;lU.{l=,aF 2I\>P2dFZ&`| ):Tg5hPjglzler`aM;2wNy\Mm Bp[&*q-\Si=Cs%V hc"!wL3vI&Tav"AC| ! a  F  / l  P  = g  O  n / h  3u$@~,K%by $qyit%_:UR In$.:{)VolY?6RjL6QC_.1xsPH0N[{E3~ Yhx\&F^ecn8"T{GlHxXZN?&Q<v3wH{#A nuSNC4" ߼߼߽߯ ,Fn+'@^Pv)].SAu| e1eXT !Xny=3nO ks"6t0^"GKer3XPKs!,S?#:eA-Vd),T @~BB uq&_H NYw)},}:&J`P)fR8{SgT[IY>   };  S 4 { } * _y  ? * ) %   %   JS)k?-PcS{u#@:UWuo,;Ma`\} ; }!!ns""6 s# # h$c!$!I%"%l"+&"&#&v#P'#'$(i$u($(%)F%p)%)%*&<*=&*u&*&*& + 'L+ '+N'+q'+'+'+'+',',',','+'+'+'+'+|'+S'L+:')+'*&*&k*y&#*?&)%})%')k%(%R($'s$p'$&#&I#%"g%e"$!6$q!# "m >"!Y  9XF#KEr(u!!)MLOe~ :j    - 6 Ad n21PVt4p&QCDGl^:b ( 0pI\uc{O59f(T`&JsCi6\9lA gI$z=(Z5[ *XR+r;Q$y5h{D.ir38g-r8v>z:HK`2*ߩ{_V);ߕiޱRޖދoWߙHy3R15'$ߤ߇߄o1f0OCXNDeKVܢOܴguߏNmܟ 5_4eݤ_0sެ?NߖQGWy-zdz}Z V=Xi qB(;`PUd?e`Xb(w;[.x>h/ Xk)7Y\''  V 4 "  p < /  ND=Hvv +4F;W<E+,fjz6}f9"SWBiEgq,Bgvk`I7 zlPA,^>mbK)5{Ws4T8 f=zhb1W@0MX&}eTf:9b/aDd+a'W#Mp6>`!bcv"$zd)! x I  c h $ 8 s i4  9 ` x  & j L  Gr m D1jGI8e_nz>pgsmrEnf_S9Nj>2"#Tz yBwik>nirdAyw&p[ Y0VK*GXGNi&UJ~1EjB`2^3i5 uY3 oh`#j9dM`vkt~-S|Dk9e LU~-iU.~K]JdEMOFpT({LAvnJT&~Ek S-]0dmK> {oDEw}>F_qx<&{]~v#1s>e<LIZ50y4GacL+/ rz    K Q % * u { ^ ]  M G @ 2  .+v}z*$ux&en [<xracb8WJ@@vm91MS~e ('8CNDFE1-#gZ8uM#i'a!~Fd*C>G5\i _(HHc(ipn{N u ( g   6  z "  9 l  bC3Qy >u#RsxDp&dEATwb,aEBb+ " a p/]0c7|\8 a@)qKl+= Gb4M4mkD~L{a]*;Y^l "vo-I>B'J; FkE/' s%B yA]6X܌ܞqcbމRFo*>&EJu~,ic*7iWP1a;*nL+ g|?j cB6x*L Er[ B  b  F Q % u z` k|gTMu vsi;:6_YK}%Z%Mp 9a ;Py2PYp{iP7$ygJD:&zn^N. iH#|YZ.Q n)y<uAuez44$Qm?p"tZ!s+) z   k Y  J   5  =n  -B q l  7H  p  4Ehp@J s|G;)[}&rVdu+d4;g#>v(2l!:5Sr#M e+b(c$\* Z@ ^)sTV*K.(iI&q9%}gD4|uud|Vy]jMnJY>T2]%S``cbu}~e`WB,,9(bj )UZ|~uyt+vAnVlr|z""Ko Fy.}Up^&b^PYQV>UuK_h0tk|%t.@pj QE({h#v}oCn#K"|@To/IlI-3dvSS@&le2)@UF  I V ) ? ]   Z X  'A ej    ! C, ]N td            h Z Q 4 #         y r \ R R @ G A E EL^cc0v*@Lbh GY~&;,VIoRhx~w]{/VB$|Go>J  ^  ' ~ B 7  V G R I J A 3O}jtJngn1I}zjKZMD?wAbH>D Tem8g%Z|7Gi&zQj)@ZsrH!T!}8cG=w_&/LT QdU<^1&Lft(~G+15>tLh]Yu#JCl!qg%@=tx:Hy^u*P@1&#&4ShxHt.kSA =\y3H0>(56XX(@Xlk}n]xE a(  = d  ~ 0 ;  ^ ] %  ~^I8#o]4eSz =DM;y2S 0|p^UKY&cKlg* b.Q&z(_U$@c2w]-t Z-Z C&g7^dH{U2@W`x9nU}z {N^|%8MCSRLS7h!/yE2o0U^99FqUru"h"]p2SQw3Cz_C- :"eFl >Gm~w_; f8e {S_Rxh}2 w ;fdWh>a{4!XHiz3"L4Mh bgpweu7n_cxG& g  5t  J N  v [  n B (' m^   & :V Y u  Lc #0H`]z{y^MzlhqTMX,I7 )  p 7 .      t nR ^H J. 7 #   p \ @ 0  $   & 9 \ ` |  c P I ? * `  }    1 U }    | h r 4i IO bV l@ / 7 (           s X S} 6w f c M B 1 r) T .   M & r I " w T '  d U > *       ! ! % % + 0 * ! ' r 3 Q  C  "     a 6 ` E  \ s7>XA`' [?nn}"t#X5isTA-$J~[iJQD#tB:>DuXQ9)a:SMwq8]a{>4_9  e4d~)%KGZ@QEW[^hV{XO??0 nUr:v2olXUXGQLRPWfl+Z;o8nVi5,S|%x &\9 rM ^f.uD^,yFCO\'3 q- D ( [  X o1+s} 4Gbeqt j;?v}y(^F>c35|_r"K`zzvwwvh]R<G'sT$%bwAth,]T7^o;>[Bs E'ZJsw(EGykp2  e { % 1 ~ - v F q  E  d p F i " T  Q  Q > U U R V |  , B l : [ ' T   C W @  [ GIXt9p= NKuG:@xcn(Gsa5r?m$B(s *-' &  N q B A  + v2 Mh)r^srxd*N?@H1fuy]9|S> /GU~,_ݙOx$߻wH'ݜ؈bT9Eڽ9C^oثӵW\ Ҽ֘uf>K(Ҷҗфb^HVGV\j~vչҎҥj֮)hBԐ֊?[ףձnO֥LؾS$س٩sڒ9ۈګ܄|ܓSݚAިޜ'ߖߥwDaP?I6VMiUV`EY UIRuC~7q@l0}&$)9$a)-&Qae]{S?o` I@8u$:~L'~}B4?R 2f  3 e  | ' \ `  1(b]} $'%%8{2^8{ZV&l%Zu'{k@S8'~CB , ~ ~ !!P![!!!!!"9"D""""" ##J#8##### $#R$!$$^$$$%$@%$%1%%d%%%&%c&%&&&)&&W&'i&<'&P'&'&'&'&'&'&(&(&/(&N(&E(&N(&N(&X(z&S(c&F(;&-(&(% (%'p%'9%'$r'$J'k$' $&#&t#I&## &"%\"d%!$!$"!@$ #R ^#"Tu"![v! SX L,,a,ur=e~_JU!IX*CiD F Z   y a = >  'hH71z!1#;8PReh{$!Pmڋ&nozb1݆1>"߰ uL $/|Mvo7 g.KSx8BL~]#mUr!p@4p3wO%y5|UL=l9iA V  o > c  $  ]J o=rI PFS,N16 `h+O&m9v)e!!<AW?r*2`KbIZ< l@UD[, W3}rsig`p-w$thTH34Us 2c*L{1Y/K]s|oRq'\D'|J_/OiS F>Q;?MC 9O#a_:<n ? U 9 * c  d C)>Cu7#f'^8&eb1QY+"[Kz% \@u KJnw.>mn:)]#h)ogR1OwߩQyMN[Q= ڠ\<~م+1w؏5=؞Z׈:b+ֲֻֿք֞s֎nvk]{TօJ֑T֚KֳYlh,הSפ׽ֻ@5rb״ؕ?؎>ڽuCۜoٿ9"܌q*-݌ێ55ސܢ Qe߭ݻ aބ+0ߙCbbr/y3AG[?f)5%<,A79<4I;QBj` %LV0i@l;i:zHU9wdFI| Iw^~<gR)=V -W  V - c  ( t`33 o=xI c Vz r9 M6t4C  :!\ ! &"!"z!"!P#"#f"#"[$"$'#$a#%#X%#%#%#% $ &$1&$I&"$]&$j& $}&$&$&#&#&#&#t&l#_&5#O&#5&"&"%q"%$"%!{%!P%Y!%!$ $s w$. <$#t#$n#(#l""7"b!!C!B  C .|q%peNM>a56L_Y._o, JUop -:dL%on)$>m%Y t ^ - ( ^ A  q  4 1 H _  U 9b8@S1y#Lq&rl.%D)fq;zOX'EXROm7!"R\d2$tK3{ ]Fz}/RBf2{v!Z5A]u;{,Ks{ k:n vc+ }I!{F:zAM~x[R4.ߣ߫ߓߥ߂ߛj߉TߋRߎMߓRߙVߤU߿etrߙ(C`߄ߴ$QR[C%oi^QkP4Y | kV&J=Y8->WLB|s ])A5 K[goheqWX{cneXbD' *eBHb{}8Xt9?o Y 1  s   * Q ; )P  e  (.V[wp'<!g(! {8FDUYUFJ ( Xo$ &`7EO `6 Wr Y ] V = 2 (      mu KP 9$ uz#I&ac/ $V1t<#731v|^Aa!}Bi(Ul8;O '  H1  ; D W L o   u .+  k !V $ h  m u1 !   T^ % \s A hj8i#wO\r`#a Cq<|=E_sqdxeYkZ">8,FLFj0X=2tUI )+)I&d'UDr AOv1\kt4VQ>3'$9<9N{h&!EDye'4Wez BKoB4b>"AFsIyG>Xs|!M/(Ladu(iA)Sp\ZFhis%'UGci6_(k )")RLBD cS^mam/uy{,}_}/U "Jh} ')?F@ZQYTW[Y \*V2_;QUac`UVUSd[#gClkfy*H ; ;Tq(P]MkcI|\ ' 5i   *  c H  R 1 a   G / k g  ! 4 0 m N ] y   ! * | M z F x J f ] K G , P  @ 5 ' l ? S b ,   T b  0 w  r / { + _ g ~S&05a,>.znJc=A1x('eAZjT#dp 2z8hE!JuW|#VSE?2*An4tF^LYUSbNgKFRXdvv/En!Eam3^Jg?lQZ9ZA`A |mZS@KH:EAEOW~dx|xkjgmsz2d_Q}H|E |IV3AmVp"U;2^~l;g~RSS-V>k9X(6)n  R v > U  } , H  d  0 W  . p*h$$a U)G c:}/L_n|~~ndVOH*5 \#MVHYI= c  F|  U _  P # C  6  pmaFR h1El2r#MI>n/KBZF.x15j}Cf+% >9kUIGy1zG= (pm]x=+1y0 4zK^E8n!p0%([ Jz5Xf$3NW_XyNlHXG@&(js+6au%?*L4N50{o/F)t#5ll7c a9<W'xPq L?n z&Pl6mfJ)7lK4x |l9LR4Nj*(di9HLiq %LY_jnilJdpC2[MuE [_VG1|+G.~a1D_`2Qf1Kn2>s#/|+r*91bGo7Al\[-7id<+!  ,D8`eyJO44xna \e ^E{4_f/+}Lht<-RTg~ 0gBP39s[#`Eq1Dr%EZe>gK*wB|R}<_ $e`)FOq+q8^_nC$_)uc`jt[kbZmDfC{CTKVl*[x7gO(^WaD?|x8cV4a:gv JFxLFm. \  ) R o & M t          { k p T h G : 1 8 '         ~ l| `q Ee :c 7T +[ &\ !Y J _ b o | u    ! B L J w x" ; S d     > ] q $ 6 G \ h  x ) 1 J Q j q y ~ ~ t } n n Q q A ` ' V  2   i 9 f ( G {6aPQJI^IZUWr8z|n`c2U^@()Y2kM,'46SQ*hvErSET)Vvs\Ii._hh| WY:NnJGCp#gU;N(q]H;aU&a:O {WPoe0j.^-xnS.@e1}a$]t D_c-c+IUV{~)Q2rX) W:\ ,(TR$JSw+^L{<t&=vH7Zfv!c$NZE` ,$L>Pcf7JYnk|ry]{b|WrBjGj9^-d,]&eP_ ^ ah[iajqx  (67LT!W1yHz^`1L"_Jb % P  n 8 @ l  B p  2 + D _ ` { q  D t  & : ) G @ f t w # ? Z }8 \ v       ( 3 .0 F9 PL EV Vc [ R{ L E 6 = > 4      q T tL d: 6$  U v  I  V & x B 9 m $ / ,  zMnHw &*</813'yrskLQ1t;blONP>`'y!iP"*ki37n}2%qs.w.^'l 2XIm 9k : JM^{Nv =s2<VcsHw#Uu #<O n= g     + >P Wq o    *  < @ b _ y |   3 I _ W v   5  \ @ T  ? T . P {   1 K /t R    ?7_\{./ZGi 9i Qk6XBW5km&K+wG[=a'E J#aHk`a}Z[Qj0\5m8fL=w3!kg3 W tp } 7 j S Q  Qw @3w>J*s*tCKAx9!uY@C m@ vx$] s`ezgUd>&0`Z|h"k%J ^)a:-}qXF8=97GP c&eK[2:Th&lIG>?GH bx wU5NHG\AQ49$lP N1&bs+b5Pt@k,T.s)A@WT,ZKgml}rv /?cg9\6pCWv 9e+NG\xs#I R5[{Z(wJZ .;k3Q mI^^FF,h8L<*m?7Oob5{,y+ =s   V [  s  / 8 } J  N Y  n  : 'o |   p)B sgF1MmbP #=CBbHbwu +),% |a?#vd`wOLM+3 tRh3twREW*qAeo.^ F > m 3  | P $ z x i P E D  0 %   | K  s U Y 0 5      c /b )    V\ 1   = e/7S  RMecb#]]-"$hv@4m<8,5-Jv>%}<2A>T48)( 'D8\i} l+?p97`)gC$Uz"Z'~t[9Subg D rld)RQ6[nz&b*_|#Lm :Sd*!( GV ky~[TF4*Gi);u!D.Mw?.QJVu]n![p_ ^)s<P?ke} :i 5`cA  X '  [  & _ o  x ! 6 HX h {   A U n| n vV A , ~ c Y A M    qZ 2 t S 8  ~T 9  T c * J  b )( ~f!mkxQo5$3=~B3]B@\e +K|#E z$7Yx$Gm4V - A>[lyEu   @* k+ 5 ; , 0 4 B9 S6 k+ ,      &  pneX961h^4&~pnQ1*  jH~CK@y 0@D\.zK}S%|I`Kmz x1Y|xGs| nOp?50dLKFZUZ+E0"{ odh(tB\tSKLZUZYfOoQOW]isr1CBOUrH({WP7pBs?s'j"\+e]Sc'K~R0BcVx S i           ,  .  ,  9  0  /         kl NE 4 $m5yX0S ]sO+L  ?v Eg(naI P"o0i:_&\)v :cyABrtg]> DmBI PV/!yyJ:ti?=- w[H++  !80I]cv;|<{-e!`9f WJ(t6dP=VGU5Jy[EiT $.@9[Vri|fx~ylqf}X_AOE- k<}^1}G kCZ#%hl+<qHU,IxVk@cv/JiA{E K}_Ha% |P0fiRf<@7(% |eY;' "(BDUh{ !-6PQwl/2Ta%?]pCBM&`'v'Y ZYJ DM,-c/~"Kzo0^z;ppx U"|#.a, |  b* q   Y   % p d  G 3 u , zV   =' |w   ,X a  .&DqqC !R"+4:K>748js^2 m+yZ%w 0X{ C % 4 p  Y R  v ' H 7 a } >    H ; RAmv+JSv7O:=0Y?tQ]5 Lk BOh,qDeo:J "gw8M(e=zT4 XIgn^@72 wP(}z[d:J7! i<ljM5:c=a D%o=u; jw<4yYXR e6VhvO<j!^4OXI! ]8c4#uW3"| ZE.)Ty R1OJx.D+j> BS7t}?ko?5cg.c,Da'~VU!9VtF}N S9>f[: (sTs%z# G#sHb  k U  p r ( 1 ;\i7U`07\"W%U1H~zL*j !> ~! ";!|"!""h#"#"4$R#$#$$9%d$%$%$&B%=&w%z&%&%&&&)&&\&'u&'&)'& '&'&'&&&&&&&&y&a&j&7&O&%"&%&%%:%%$Z%$%M$$#$#+$3##"q#d"#!"!/"!! =!) 0 %z=iC8 _Ns8scUK0lx  ?  ^  u E    S0b&o LP};>%}b4 mC,dj1QNtYIi-x%"]:-SHn e-Ig25>lJgn ::[;Or 5\xJn,VvIz7FVr$^@ZF1@s]$k R>}3_J}> x=u,kK9wzXLx;*Dd&z($rLzr;n]\"KMv51a W+6Wu57yU/iK%M(Pls O$M&pw * = y b % h ' W ~  V 8 g 2 p   J < u a  : FU v    " <R4~Uf/Ib~ 9IGQ\/d5m[[gv*EYy$:PStz%YzNq(0Pi'pLzLl(,/64=C=G7P9c7^+V)Y"N5#ljO5 !@_7Mp!:@^P\Y H  4# i ]   u  4  Ca*AkD&QD_E)BO'?k0|H+;885LCPun? 0fzP |] 3n^7 Ok6 j|OS!&_Qj3ff#YZXh/o.~7NoDcO3.iqHW43: nN`{V^0bpp%}U3O7A+CHtVL7>x%BmdVy/uqUVPPM~:X{T2X )<Xo}gFqQZnVEq&#w3zT|%Ump>V u[,nQ&{slYTyB|OoYn]petv=b6P]"BQM0|z {Z;JH]S.eu!bR]3(* c  >   v W]  }D#>GVQ\8;/yy1T!u@m1a"CJ4mO^hpu{giS-$wV?rL5Y*<GTDw`  tw}Kt b - G R ;  7 > ( O  c &x#9=!U*UZNiv#(mRm!,tR m$O'LtHQ+]C}u^wP79*n\D=)ogR/kK,i@k68wRM Ss-x3yETBe+_D%`s B 3jHC >@9D@T\k}+b ?gO*^1z!2bFGSktNML28 9?A8}7H1+}cu?H}w%~4[)}d.g)<Y4YEgUqSgVl^]UWT=?/0Zz"L+I_ Sw(Po/0[l-Ob)S@rSiGV;$ +Jh0S3_O nT6K+`v4K>+e0o_c+eW F T  z I > L 3 Y  {  v@3g")r 1bv$Bi#GGv1Vh"=DBSDK;0 |el=@j\'NA p> ]#L3cT  }    {  }  f  N  6rRq8R!-]2eP3R)7 j)]:IUByANZs7 <9z%k#v1^m44eK2{)pr|$:He9b/N CS-'~X fY\X_!RXLX3qGtN4/cj Or.F`_ipns-j-f4c;MG4K)CC2/' kJ+vaGC/wBf_HV:-xD%1KH^0y)\rm`*_Xd\b hH^k'T2 h#Ok'Yw5d,Jg | hS b ~     L   0 7  H ! ` F e d   0 5 3 < 3 x ; v & K F  *  [ * ^  / z.\:_% Sqj`;}o iV8<82s+la`m]Qg+!6 vxNn \A<dSHRqY5x>uP4!96BYky;.gd@M1&vX/vxU|v!J0@P=z&%-H{ 4E u fL0%F] {5  ; L  7  Y " p B z 3 w 0 S  > g  , = Z R d# c* e, Q; M/ =5 "  s X O 9 n ( T P C V N 2 lH!45dN5W`dtq5b#W7.YqxnF6,Qe%p1T1Z) l]=+e/lgV_g'^&m*EPTm;Xx&Hr>o 5AaCGh F+\\7%X YN.~ TK{-|,f7dBiN 1 Z=|w@i6Sco2zJa{rVDa+@m\/@l}GCh03ql,7hf#E7Ww(W8eO 7c0)2tIu,7 u\B;=9yBQUy @:wgQ%IK f?INw(lU9O,2ntOJvR!x 2Sb , ^-B]nvAcZ1X&vwFE+VtH&_ 5`_6U7 qyx~*1F`kCR)r*ih(| cDOf81#q;j* m Q  * Jt    R / Y | ` "  c   %   "  +  C  S h Y n f v a l T F B  ) l : o E  O D  u B xeOX%_@QI7;3xAig0pR ?+[Qo hH2 `NS1CcNxYbDw=e|`L@LTl&OIY#]4FB9 b2Em@6[{$\d>TqP.Ulxnn hAGg)rw6Z* f~  & v D c 0 h        " "  *       s [ 3y N #   w J 0R "    of 6E ) \7aV47!o I1 '2NXv<Z|FNu$!:+*sg? qM^*v1Bgs6qNji Jloj9]t}!vK4_d=a5LyoPA 'xSG/" !,5Sc0]z&cX a$gA V5h70XVx$6YP.w['8!<l<Z*Vd 8 Uc     5 g/ 9 N P b f  O % R  J 4 8 E ( J  M H L 6 8 n - 7    c$~d8W nfXM ;gph%XNr M"o? \>Q&dQ#*eb}a ^v*Ng4q"[]5dJ3/I0iDk} ;!YP{{ 4OXu*_BxU 5Y L B J L OM5+& $ +(*d0    a " f 7 G  W s =  T v > ( T : p  S"5-:E9F,944;(/9sJ`]bz^`Qv)(5i]k1`k-F.!zox -Mg]&n]8H-v_7!Ti*H0}Hd@Ep0#y7!rj ;6zk>>NG[VjVria`TSQF4+ qP2i<$'%hrH5w7>5g:$(a,12rB\r!yCT `T%d%o`GH~6j4[5U>SKbU\kjx1XAr?kb4"lQ\GL7S*_~ (dc ]OR#e<%U#s!*\^6y/U_} *Sm#+.>?DGJTTgZentzk{ngijm]Zttqv9Nhz,Z0{Gj6c -P-l 5bgQ;kTV# q  = 6   - cN     \ ] } 0 , r t 0 `I x  ! \ < k  * Y , I w  . O cz5O]  (/0.f#G&!j-Zv87  [z = `  J b h = g j    X @/\iy)D$h*E a6wIkuJj0? R^=K~%mn 6|}'.e:gc q!J@E OP!O-K&ftJG1~\TQM=@ICST#e@%2n{>HV8c*^ Kcm5Tmp]Pk6dC!i7k >HuDxNDw:Iwc<PpNB'Lr UED{q_SgNK>L6B2G-P:A-YDY_\bh| 6g 1NSq!|0 cku#R&P>zy,Sk,kW'*xi9;r H 8   N^   i R 5   B :   )7 g   ] J z  ?  ' Z u $ S q   + K R o         m R *    v J v r P OK #5   B   Gf K  X 3 T  m  p > 6 l n * 0A>kF 6 xD YQtJ9pQ' KDs4^THQKxYRO5{,G/q6Duz:QQ{G*b =)nZG8||u;@c!@R{22#E)J9'E>MDJQVVMa`u`{cq:Ry:_u5n?p4l G*N X^SbW v)D/b>n _WZsI|GxSK Pb#s' b / l 1 \ ' a ! F 7  bo16WGZPO#a 4 l8p 9(6I7K.R2WU XT.Nj_$2EL1ub23@Y %  r # N 4 b % l V   '  Lp  _s^pND"n? [7#}!Mk 7d"P8sa0A]0 V 2  _ ?  W D  O H F W 38 q   6N u   'WHwxzZ+eB M @  Y > # s ? %  ct >:E6w=8y>V y>k#8HXx{RB`+nO>3`QG0q'R$W=t6TX.v@ ߋq^\{UyW~h}ߑ߻);^l>m{ .`6Fv]dKXGT?JCTAWI[GO:P7<0" rUI)i?2C72 KO?jJ)|2c!^ ER@#bg; Q/wRaj[VTPV K -  C j . L  ' } } B j  j O 8  -Eq&Al-XmL4~Pz3_"Xu5_ua<oA*/;]M+DEJv@AHA/-H% U Iw(U S , v F *   t _ '  { a ` H f0 7- #    p ? %    { I     ` (    j 3 t m o V = 8  (  i / X 2 N   ^ D +  r ^0 pK"lM%}r20(}c(iJxK5!CLLjQ%C0AP^s`>asiXw/v `I*YMUqZ7k7gR-5uy]ZPESMQHVHb]z^r5n%XZ2l4oJV)m'w_3o.l+*Ksz?Wn~pGt(mN*Lsl/c> 5BM{| 3=?VVnT%V74YJyX>^*2 ,Bh *D5oB;gQ$`qD{7k+vS+i S`^mKyx.lB Z\ y@4   sM 2    S w ` E 4 b C 4 3  3 - I x O l m J x 7   ) f  @ }   R 0 B :l ~  ,  , -V   48|.}Cm Y:,r6j4!9'NKiz{:gDQT<]^_Q<Rr{,B^OI,<v #< P % ^  3 GX$q@Wt;]7kVCD6feqi rLJi5t'ߌvaRfKaV?R?g5oDߎBߗF_j ,`ߘ߭Leg5zQ{@c'L9 Y0Zv#Op*,xd(P:].jT"LRz1QqIPceZzQPQ4r /E!+57Egy,;nw=Y Ya#h CFdp$ ^W   H 4  L e  Nz $  ' ?_tA% p g?=Xr_j gb<JZ?~j=$qEh+U]~vVhFQ 2Qa:Fu1XIWKEv>g:u(C"Z]s*^ 0;qG ka   &q , ] J ?  : [ & Y  l G q  .  {[gNb?$l]X@>+u5S<GQY hnl~wfx={'}sjacb.B7vGqwG1}yNG G+ ~7;e"Q{K-d >4C;P*]0 x*.9;Pkr 9;|n1g w|/+y]I pl<- ZI7+qq^T4;! }eOh9U*?+tm\VML-;+% |c?+dU9jl \_SA@8B357/;:NYk!{Fi6/uUH![J5~Y:P_U6m%Vz2Sx+Ii$TYY; | : 7 8  s H5j1x$i<X  VP4c)FYu|~rlA*aj?B sf0yl5cU/*H] ] ( g Z  .  s < p c  SAH^m#<qr[bIXGe9]>dMx`o%/@wt7 {Ds E . # E Y  } E F #  d z B> u  s 5gr Y#8`D~ * rP R[  NC   T;     CB J b ]  `  =  #8 .#;BHw|**d SR+f(r\3& }V1xp_[_imsKq'3:_gG 'K,mx,J;dx'Nv#%659TA^EcGOrMNv=q1h1L>+om>1 wr)3Pr%K=|$5Sws 7 Y"q!O$/|w]a9I8aI 43m8lFyS0(f|"YI{9tV3x,OK & 7-PI{Y{RX?Isov"Vbo'w;h7] ? " { c B   Me#1x$8\;q}Z hh/Wl(eh4tF'\,l5P:h{ _MtGx~6^$-b6"e  0 % n 4 U J p  K 3 L x kp)xU;%uuBG Yf@B$, {pRR9:*&()Si  8Y  %Dm,'452(;S?gBD5:5;<&6M/d%m/q p{mi]L.='' dw-V:~M|ciB.g!hAGdsIt!m`;^VsN.e~7=gdX4.q_ . 6 Y / f H w O y p }r {,&pMn"gSm:b`?ZJt^h(?pXBE/CLx/"qg;N;|~e T2fcv M2FS]?h'jz.#(OmH+GMJ]N)oGO=q+Py:ke@!T6u8~^> Re/k)I\]`*b8RAOEAC9% pg&aIgelJ:7z`w7#}Ce7XSIJRp9d3knA|[ SHh )IHKRF; Kr*J4|N4qG)^ 3 ] K 1   F (  RA16GRRnOU(>0XDFz1Xlz cR.V+j]-#6YFqum SR|06`b1 i>  i / t *  u W   X G   WL   yc 5 }JQ t;dC= } iL ., (1Ibd (Lz'HD]s }!EXc|-+%) q\>b0M$tyR9*8dN.@So nOro~qmd\Z LSdb o 1cQ8 VFPx3{6 mK2mK) 4Il}D5'I a` &N,  A0 D ] 7   * $  0  v3G.&( q+_=d 3wET0tCc 2~Q=^YPZ v(/Myl"te9no"4f0qkPtO`SZUK`@hDxKHh{>u6RK J,u+}s**IVmz7O2\1vYU8xxDPJ]8 gK1UR}5?Y\#w t xrlZRNr3D"r8~EiO57k45[q+ edVZ SK_ vDBP,eH s]R5<>6GVjv +$PWy81ulQ ]??41qQ'}j0&LHve>on3N^7gq/r3e%z/^]~f F/RWcv#))% ^G!~vdo/tmenxap/oyU+ "|I[g>w,:V0`:\-FX % P   C h  # 8 8_ q|   # a   / a/ < O 0o xq   E " d 7  j & 9 I $ M k j x F j  , G. W? wD g z     x } b P ?  N * [ k  R 4 s  S { ;   ~ 98  Z " _ ^ gbVH},U +kKB-L=f^l\=M~U_VtE)?RU-$sE+0q~ZI$pnZrKh9l(x "#T8Ycwu x*X2 U|>hJ"rC]mG/$.L'z!8*M8t8#pzae94SZ]c.kN .WVqNh*,HRSl^qp~ki{Tp>oXVYC1*&i\B0(]R;* wwxgpkwaiV]NPEEN;[=O(C%I+KL&FFA"B&K-A6D7N3BLFZM`EsSuOYXH\g]__pz&z;=~Q_o17 Q^ d.GWl{(>>U_mD"EA`~V89\s! [   S  F m3 w   I   Q b . \  , !E 2^ @u Tw D K C 6 *  X  { , v V ^ B ! i  w ^ J   Wu+Mo6%*;tTx M4J[H.Zkz;'s T.7Wa<@: PjMH0)fF])Dd|LkKH(z I#]4}kYcA.:k4zsYCF, jFmH&|a>tO2|a7gR/aNyyVUDq9U78.1!4.4EJVodgkOGB><<54@O^M{fO(_EY7Kw jCF%.e$i*# @l75&-Nm#.CLrj  4 6 x  ? I o 5&  lM  o  +%MRdZk9Bws/4Y@9JF!.)ON\czGUL0|1R)c0+6/_-XJx ' T \ 8 2 u G S ^Pj()k4D` rfRAD#KEL(lR2u\s-gS^ZDmS=  57FOjz0:i|7I/o"@X_3> |vtTr1w xjNfa{XHGN1?t4@:#*`m} Ck {%25KIRA@3jK uAX%*d`+3{G;~D@xm'gBCb]68^yHo _I lq77~OD8 f4}"d[M=6* #1=:X$[>m]F'gNt :z)K}SHX6mZ7$~qC>z JZ|8O$S<n*x8q;~6Rld{Fj -"BE=OPrP{S]XOKL=:(,fYNwgSqES6B&obM"fp(a@]njp{K!Q7h <"E~D+ jT- vH=+ i  U    G O b  S ) > H V ` \ [ i N W A 6 -  t ? x  S   F \  r&-r0r!m Wh">XzK7qKpK n&DFo/Es&|#p/pUp'PI+ ^6^ =)s{V\T\ gl1=^z?r0HK Pd{Q%UQHd$m3o/*@b^?{b[Fv93VV0 ^2M],AV^jpukjbI>mke8C$VQK1_PZ"4s@`})?Wo=o9GcR"~"J}R)ZlO::mb U DCyRe: Y$ R0 zRJ;0o/i'XY!P.C*Q8RIPT^ecr4SxSkG5q TL|9,x5/J[p"@u&Z [tPq_`}p~"KP4F(cI{wP*v!  K 0 z - % < " i   kGJUmhgg-T[A+u!hx#l9DpR/c">u=]sy\{3[y~-CWN6.g`m `9t_q'&h# =   r X   h s  2N ]@,BaO@+^ bD"(:+`)YDlH>]Lv?BrcpDg+c`,@yKtEU(rb?IvPAf+c 4-gM~%KOwo@4bRz>4d^ 7$hj Yk>^?HR?/G{sVp;5v  ^ ; N S u l  EGr#uT3Rn $YV`}=IYHQ 4 !k%""E#9 # k$J!$!~%\"%"n&Q#&#B'/$'$ ($\(j%(%(&8)\&x)&)&)0'*b'#*'?*'L*'J*'N*'>*(/*' *')')')'?)'(['(+'Q(&'&'C&'%&% &%%$$1$H$###""B"!!S!  6@f|6Wvw\ G v " q  \ ? ' gH6nuqvt|8jEu$i'j UuW4{"#+y)RHa6+U57Ig9T1ysBGtJAN + =+f8AOGW}f6]Tm[``Li-Kg ~S eS$ce.=02[?E2b"\' MN   ; < $`  Je  av}Sc@Don<u;P Z,^Q|,/a<vAX]`RZQ9D<01O;>:3k'?gH YFj3vFDZq?;l'eb~+r%1-;/&xvW o  E I | ) $ ^ n  D R +  ?t  |+_{ F|:xu r,sQv>q(o=?Y\, s*tH#_[\ M. tA {jPg#J:! aCwogNx9d6V J =9*()'t ^X D-xkdJ7&xe^JG2+nX=5 uz&8[j} 5OZznV9"xUe6A+ Pe2Ozl<#}l*|08m>k;Q:H%?+R O ~.u=X(sC }uhr{ &8BvvJeST/t+FU=A)O+ujM-YDw Fnf&Mv    sSb07  w];&GP{:C i!EZx*Pa ha0jx.N?`9 unkaQO2?:!%xnV,B ,# !!$)wiL4xc9{ dZ8"`O#| Y5qMr:M ~Pv*U L@\BqhQI=< " 7Je (('_82=@%QmXVk$vb*mF"[;NSyp,p4)>Ul"O4k6h ; 4 2 '   | R G #  a [ 5 J &   R i' - \n/> G{U&\vfG@.c1oG!v3aVHh.&  Mt +-`@Uv ;|'#ODy) Jf    F% h   9 ~ < b D    > |( F J 1 h Y # B s   ' n 9 X @ K M 6 L  N  P U K D q A L ) 3 $  o M 4 m 9 % d ; ?  ak=6v&Q^|<jj5RZ,^Y; t)?&IWYz]YS+SDWCc+h3&ii'm#')C=Bki=FucZg<:YY/nC#߳ކvZ9C%'#'3S:lQe+-&V]'OY }J`.-z35[~EEOiE7G rvCZ9vX,N!S*R&IV |G * ~ ~"  " D  _ T ] B  an>!z` (Y`n "=@_]`jhkd_VR53-~tht[\P>ACw0Y0Y2E#F#1 ) m^K9{$n MJ6zY:"d K & } V F  } W / | N * ^ /  N *  a 8  R / ^ / f [ s ! P 6     rV KA * yO%l[@0h D ~\6eO9l> zO"X4m.[(?s3j$~@5r%*};PJ] Fau]Tdtc7Zh pK oI~iIda/?p<l|ja_Bnhk)]*n5X1ubH%ZvKMJ*x#k(x kN$$'Ac 8Z?%E3^3XpYKdJx5>"X7 lb6&xn^H @ (  } i < !  ^&o=r&76{9o!3/"<%])jnmP B 9r)Q  / E P ^ V q k k c T G 9 Z+ E n4h._ZlO=%DF VPYldubyMm1S9d|8Jw  kL  & A k  <^  ' v*qO+o#Q<MrE7Sry6)v>q$f*Oh,b+\%fFl*K0oM3~kcqr[XBST]EF}e=V 3%~?Toe>2wFYB~n[?93&, )*0G&M@XQub&3V-t:[~Ne7_ |<]$@BmvC!wRjQ=~6vC6d/0g ?P 7V3Ik#Cm8AGFrY,kczF'=b<T]kcD(mkxO&q0+ w  4E   Z  \ a ) + oU  ?  $ Pb!=U7wsNEB( `DjV,]2ejB2]G  y!m!5!-"~"A"'#w#2 # $ V$!$K!$!"%!b% "%-"%q"%"&"D&"a&#&G#&\#&{#&#&#&#&#&#&#&#&#&#q&#T&#&#&f#%C#% #X%"%"$"u$X"/$ "#!l#! #$!" 9" !# T! OJ t=vyl>R#/s>M1{^0~`15E V ^ m ~  "0 /%A3N>OMkOqVl:*oTI+vaWu_+, %%߸MQޖތ?BݢݛaTܳܣtwWJ9-۷۴ۥ۶ۥۧ۬۴ (FU;xbܗ܋ܶ# NByiݬݧ(T\ޓޡPaߊ߰9]56|&og1O\YYW+k qL@9m0 uj_,G!`#tJF&kN kq)ig^[5x2w5l&V5T~*Jk/Jds #$> $##B#7 #"j"d"%!!-!# w  8jH6E!FUW"Pm 6GG!Of#%RXl*+^B7W}rDx%% Z m  4 R \  5 K d q )h&t8@1CKEYLxEqF F EV m&r #B#c)@2Sq r RMY m%k ERcI) fg8 AnJS ) Y8 oM4_T=0{/p]E8#"/:GRz :Zw1_)O>p8Jvq"hR)Tzmn#R;ak_/lEsY*sb#dOC`D sKj 8Kw&%<;87)Q)d};=*qwG~)|k,0hs)Y\4i ;Oj*1s]!z)`!<~Hw4di@2{\T="  @%r.N\vkLGpX#1r^,#fF^p_gwrK/=aDp8<pNR q YE 1   u lE L&mU;n`-7e|&<.d#ha  N!"| " !$#!#"$"$ #$#g%#%Y$ &$&%&~%'%M'&'M&'&'& (&)('I(5'S(P'p(n'c(~'f(s'O(r'5(h'(M'(8''''&_'&'g&&%&&%-&x%%%a%$$4$p$##7#r#"""A"w!! !+ U w-7oo0U,Z8vEuSVgUdjag p r f r xKaEae F\+|3w7m`)~ d+vw2UK>= [;1f'T*,~W2([L"9GW Ht"08m3R*6$`1k1RIEex8b^Al'q5@jL(q^z,%PK+v7m sZ4 [ c5'fa.9 k- o\72n N<* zsuf\VZ=D 8"2 t`QE jtUG62xc J,tkrsmwB_+]/Zv MOc3Kv]gmUY,bc{ 7Bz(}[mJiP^g  W~.@N 1 \ k % y > 5 lD96P.GaY4CX,jrB^NihFH;x/\2V  %=E3B>3+ qJpeW6.SQVQ<hx/pHdjQ,5\:%Lkem:n#U >  Fd /  | F * /  W -  / 5 t#*a~0lw$my/d:Y]8#qLM?%I6*[K;zu: T~OHHVb.C_GN1# o< t[H5. 1Xw:*r{ +R0DUaiojwc[l=ZG6v=U PdjlK#e58EZN`-h3jp 3zn<4fu/fJ:+&-}1jD\D]IcqY{gs|{!D^q      KX)k%aqj C-V@U%#T<J=nXw(/6:6!  xT^=x@7umC:n-V;V`r!"Hs -{<mL>0 i?s]C"cE$skQC55+ !5+8PDLVZl}px{nNBv$zj^H+*s>%M[8$lh;)U{0d^ R j , c W 4 x )  *& .B)cxn{pyPl,UrHQ*Tk/CcEm.I{cvAx+ >}f{ L@J_mJ[?'^}@%Z,rm5p!G 'wxvdxT^JZIU9N1ED:7D,5,1& zh_<2$nVE3{\S0pRG2$~eMF/ $,CW x+`oC{ D|2~.y~I\ jt2qsnd]Is 1Jl |4[k TNd.$hL;t-ki2UBrf,h3^9O7  QY  T  ^  o y   f  H?  )T|[UG  pl ,RPFw4DyxXR0-`  j!"6"##r$$2 % k% %b!(&!& "&n":'"}'#'Z#(#5(#s(/$(m$($($($(.%(I%(p%(%(%(%`(%-(%'%'%n'f% 'Y%&-%[&$%$%$%X$$ $ $##c#"#W""!("%!! 1! "( u  \\oJ=w$d(W1e<l D}   < 3 q  D6 r ~"v _Bbp-fYtJi`hyqW*]R Uq5y/Z1{J v`77!9 [-JV})U~(W5sb)D9mh I2_=p'Q[jw_k?D .p.{>U <]N7X(t]v )ahD-ti_tergv 5?s}%piR9iKu(b NRNX[p3KqI}F;#.n'1Oi'8  t }(l>Yx">!_,zGB2Y9pO_^ a0P7WIS`Hh<r9r,!zhT 3  #  y ~ c A B  |  uC  AaNx>&l" mE[O"*NRf|  ;'X<}PWqzz $,,}/w2m*_'Z%M%=$D$! y{q_V{IGx7m2r'yshskkkeuiaT_HxKhKO-6&+ H(T0r=} =OCt/K!6 \ g  $  5 + J " P   0Y$1Xa$}-8?\/u1:8dHDqI/Rp/~d,m&{d!,usP:!'#Dz:5Rhf`&OnT@s5O_&w?FnX&R{g[_"9E9717;s0]AEO4Q%cp{ 5Yt/=Xm9[/I_zTD*1no,!_s:Yj^G(q9w6ce-cT/UtR4VKCu6g <cL}k*I.gN`~!@a .4N,a_{+G"D\?{s =,uUa D}!]`"gC(u YD+dM" p^   2 hX    O 9 q % L < s d 4  N # l ; \ ` s       h  ^ E  3   Y -  } \ t 9 u  ] b T X P f U N R 1 _  X  c p u  0 _   - & e D y 2 e 6 z  D o d   2 eV   'XA\ Qy IjxJu9Uf-Gp #|  o # ,  5 l %  : W bXcKd^M0Gx_$qV(wXYq)Gyt_b[ykA4<=\q+4xMAs7e*l"U4XBn?e\o4CppDXs\mA/:9=m4Oj^*&}sX.mKaIbYJ\D]iY,mE|?o7 M\<~avkydU8 ubU3!Z 5T_&= +vEiM)Y5jGl7`E"{|rqlsZJ??>54/<8XCYd!a"0jNX1wJFY8i/FU[0ZO#}4P\n 6h ?_)? ou   :7 u   * ^ z @ k  / H a s n v n i b X ^ F > .   w D i I  _ < c,3Z=Rf;%Vo/T-b='mnlfgj (Q=nT+R3jO F$j:VA U }  Q O  [  S \  ] L  +/ tv   +f>[z8Tr-+@8<1u2[ F)t8e=x 0 j  A V 3  j y " # > r + g  d ,7Ll^n$ Fl-~@h2}L kKn< o:d,kAzN[MdNct#8i5](Ea2zNT'- zUj2L.!}tmQJv=a0R9J?M+,=3?HRa u{  381^D{Rl .X}(Hp>]"O)V9v7f/xTE>nn#7h&e_: |C)f(`tgFYx,Q, fmUiC`9pHx\$xNX 9hPa)C~odLTJ[)W+W+]7o1vCZu"N M4te [wDA0Z ~Do3/=Qcm7N3 `:An; c0 KI ^ b% d_ 8Jw&$aS(-Jcht3Y4W$#('(H+c'#"$ $WZ&"6,c7r88RVdk)zLi=dEP}%U~(VQkGu&\<{tIVTKPp"-ZhG[ ? @ D C V G k  T ,fgL;|6B2v'@kVK.|I5^=c@S  C )! !2!"!P"""t"#"M#4######8$#$q$Z$$$$$2%$T%$%$%$%$%$%$&$&u$&P$ &$%#%#%q#%9#%"\%" %&"$!$k!`$ $ # p# #"uD"!^Y! +e DJGA7vDSM.q.RD   b 8 h E   C+ b K"\V~ XZ-$w#yAy+r  /!QBx#\bUz 4bm3N L$Q([y7L"X[1- xwNC% ke.2\]#1u?K?D{nF,eDLR Uv3M]P DR{d5q{FOj9V'߫ބW*e 7"ݏqRBߤ߶߷ݥݍݍ-wIideߜ]Z ^Ifߑau{sg= ,Wvw[ >K|#R"E"V!'a%\.e)a"#+U ,~Y{^hVU OW3/|$/2K/:2e3I[UlHHC  n Z $ 5 ~ 5  b K KLI8}?;"Rr kCwuiE;NV~eBOK % )!H!v!!!!!J"2""n"""!#"g###-##a###/$#C$#v$#$#$!$$%$$G$$Z$$V$%|$%}$%$ %$%$%$%$ %$%$$$$$$$$$$$$$v$$K$$0$$$$#$#y$#g$x#g$E#R$#B$";$"+$~" $N"#"#!#!#a!#!x# O# ?#Q # ""v{")g"("!4!{!{?!1  dc  >dkXx)K5K2X9I%1{Vc?)E  | c ^ + zE $ 1  3   G >Jk,C+ek_)+\G@Qv]S_>RK7o N%AodP aUb}K2@ArCGG 5Nއߍ!r7܌l[ڪp׺U*ؾՁ֊]Ӿi+қ[чg щҍ>Щ>ђDψ,ϕΩτiX)H F4EαNΫaέΊΠθμqNОπ,JъO\mZҶ`W֩PՂ HيQؽ"ٙycݼHީ;ߥ7+* !*=;Ic_|*8CfS_M<j]@|I(T\9R. n   nk    $ 4 S ] v    q W = #  t Y 3 f 5    f sB Q' 0     v f > 8 @ 2 ( < B W b D k   (! va   , R > A H L w \3iSWm'W@[d[o&Sv!1Wl !!!!" """###v#$#o$>$$$)%$%B%%%&%V& &&>&&[&&&'&I'&X'&w'&{'&'&'&'&z'u&v'M&]'&E'%'%'o%&#%&$z&s$7&$&#%C#w%",%]"$!$k!<$ #I ##="["!Zn!  k YwU*v,CHoN^"n 8 l + i  H 0s > w ! ? ,o x6>z q -}f<6vxSGMR!vl'.Xy$8x1+q+:Oq8H,@d2fX;'kEow\uLrAqdaegusrn}F/ V< c6 yo]fMm?=.'$miG/!cSE< }%3Fk2Ml3Y (KWw0t3k?F#n [g(&s>n\ Z1iu$[AI,e5tif7aOL`9D!7r I<|wN|Q f 1&Q  * X    ^  {  r ' [ 7DB\N+`F^OYTG%):iS*Kbr : ];>Qa\b` [ J9 'n~UR%3Kf"8^Ux $\})Wi PGnA1-Whrc 6 M U u U   3 k  i E @   (A % z)}~V?0juhrME0 "hJ0!+-57@9;=/05 sH#Yy)ZDNBp-o=1J1ND Urn? WUp?L &}N_'TMJWp&;v6P[qBhDa\av(I 3m$p+{>i=5|pHW?p 3R}&>{g?rF$@OAw S(LB2<FQ/q'Ty#f_%o8{ K  4 i B o  S w  A W z  . K _ t y m [ ~ D d 6 \ ! B  & ! f W < ' l  c D #  x \ F 0 . z  r b a U J L B J 8 H J H ` h n      # < U & x F z  2 2 d Y  "  Y M ~ (  J K q c  . \ 1w ? W s    !&*1.'%x$gN 4  q W < 4  ^ y  J  I  e . m  W ~   l m5 JHQo c Fj",~;sY}4DiFh/L,vL/weR$ _YP+>ztifNIMH AI8F*B)C&E7FAQ>AFNRXaQkPeao[s]rWrc`YvSKInDr7n1j&P O8;)d;oFq,@ jh(Bi*g4FxGo D"~,31f/Hy$~+0n8*Bk!Xg+{EYy,>xha02t]=kceFD5==LJI[l0Pi 4XV, ZP#1s9] t^M$3^?&)C"b,5X<_@z )D d{-s{( k:oHv,J.  a K k \ _ P P + , ] VMGR~Gw,E:XQ^ZQa^qRhMk;_ OC(^<_2{4k0|A v 9t ' u 5 [ & o " F p @ C  } S X     \ J1 4 rgZW>D(0  +4;,>PQg]t, M# i9 Y a ~    3 O x     - '  5  B 6 = 8 D P E X 9 k < d " s " | ' z v z t o s Y Z o A Y : B  $      v Mn )P + vMt0Y"^8fR|Lo{:@mV16c6rCn4 la8tWpKm);+gx=K"{~^]25 bk?O.b@a H0O%e<^0)W"fHv;H `({D[ @7#l+N yeOY52|Q5~dUBR+G%ixW\FZ0OI 7/13*0/28KuIyJmborolnfpw|+9Tr?Ee,Ji- Z,lAjz"Kc-Fv"@^ KsDZ*Rz"C/Y[ -7Xu51ja:kMzI ?s.`EuI]9q6z3l-h(u.nF~*!e_1I(;!rGn\e. }W   S U / A q 7 >   \ f -@ k  R` VE{=k)@u1a#=K0VS]lktrkh]QF$,lW:j%AsVE0R Hh & 9 u y # I K { y  & : H  fG |Ja7b`g#pXz 6{;'c}5;X)y<9r6sYL:X*G&'+0*HUq%)@RRj+yEy6mSP(LvJCp<})e-i6a(R   +6(Z8dp|||}zhX8O3#Ieo5RU3r!Dk;%.g3`M@nh <&b67 uoI~: bx5Q$- x- >%SOtx=&`PfN.^'q^ /"_>j3T6M9zpy <V}')?GN[W[[_ ] FSVB 9. nmRW=8i8f$T@(l<l[D^1 _gEL2fJl7K- iG/sedN?;n2]+A/%('(f!R$K*?/->3<HWYh%w*34GTWy +Hf'Ss /hP;<|^YLUXe|4Bc(~.bV/AX!lx?6}5Bs p  X # x   ' Z / o g      1 & ?  9 % K 2 I  <  ;  +   k < f  6    \o 3   rp 4 zr.&uMFjj*Wr fiww_~V|A! izI,#[<;AxeS.`(o<W9NUWX2ucE>0 k P 0&;Ol+BJgxO&hX=zIN7!oj'~E0bOy q!9If{+$GYyF$Z1h%]&Q t"}:58V S |  + >  G ! d * i 5 j + d - ` * K  +   x J X Nj%rIr*t-kGl`J wc>ou&8j)i>kK>$z u&lk1v4{Oh-=OlB;B WLd&_Q3wXf8,    k L !  ~ 7 v 5 L - Z4Xu/XqpU-   _  } k ,X   q 9 i a  R M   4  u)  : QB)HgAI^FgFF6`no%oEB tQGQluG.s:Q1 w6}K-jZjD8) s>tJ Y cI1,"  :Ci!t8Ii.IoZMV+fmrTIl)0hU6ItS7seEXRH[it)Ea(^ >vTB;$~O>m]gU8d{v0WhRI9=x2d9@R7J:28.")e8>M  :x  9 = ? m . &   %  1  K'gW,hGQ'a2\.]zDw}bC!DsJ&s YJPMZWdBd~SI6 ' J  k r  z @    't3W0C>C\<kAS6yh 7RwIr,gM])sF,N5}|yu z,RwPw G*|>SV%s[>a) f+4CG2XdV]dljmou8mAaQe]USMbLhPi1r$a^ dJ8/ubAn8e)V(vbK>e |4IqjT>K2 \a.qzdGA5!h=vLmYXCYr'8nP|$nKNxF4kJZOso"+c=YKCN,wa1r;a 2N$B`3'>-^3p2|6&$WLu2w_JK(#kX- kU=5lW7(f\V83'5HX~/<*GTTsatD] )Eb%rJm~0#;?SNi^vn| po}Qe:VB>1toTY,=c/j=YO.\^:%Jt6872ia(SK([^ x;~3gUXl0x+\[-@[2"xaD@  *,4Y 7_5j}2^o.WHv J 3 F >  = e %  j P . a  B w  : N  7Jdq"4LRR_`_RMME/rlVV1E#  f 6  h J  { ?  o 3 b  X j . : w w 1 :  r l" /Pa"y%VH=gv-LY%n,ej4l8f6m8Omf^40 eQ/ww{cuY^mpth3U`u -*39M\!_e q s|trgWU=5y#W<P8i> o;o5 Qr2J\8%c$LJi17qzF: VoT*U+ tcnGc6XjQTZQamr~inrbvl u,ATs !CBgo&>?R[dy))BU_ss )-Vq C&d4Lk 6w0QCzw*7_kaCzU=y KH 3Ug k7e=!HKtGx=^*q^1W/FZAn,I?yoD"rW.gV C^ 5D u  $ yV  > ] b a *   p -m  RS\|MV;=+P'p1\;7,ZyO?t*l(Om|8VOgb\Z}Ml5J1[cA-}HJl_aj[h<O.i -u J =  { N K D  A\?` S!.6']'5fkhBCUd8M(fnEt5%|v$8JbntxlaWHG- ~gU>#|VE*_ O i6xb.$|J&afU;0!S5wkhS?52 ^0\(~~nnG[VMB0.p ?4tT~%dN7wV( jGmD(R*k:+b2gX[93,strcX] _k!fW{b.U9^7qLzO =+7-}86R^/_wMN+," f PsAm8\F vI[35v|OI$zU8p<&h=w. bc   : > L K ~  & K l   < N w / Bl |   :Nts!R7Y0q=f|P$@dk([5`>i$<a,N'>/bQl_    {^B$lY@U)rBS"^8r(fe;>7P*\u ] O F  F 6  o   2 I [ :'hIf>X!}3@'Q8a:\KjR\RbUSWXLKLNBBI=LIOAPY_^gm %>Ne&Nq)U9t8R`8xnd]RS[l} 6"YR~AU Gk #\&Q2ym\Zs\j`]aj_c]\A[?J&r/m)>N[9v2iDa7irxM(w\E!v7qPIlz1EGBX ~PwwF.Z`)Dc?P/xtty;^ *df>F#}=xfmX?(1)  7  ) m  D  Z d + w  / k  !h:!eFl$;bn,z<}FL~dz\sVm[QSHJ)<2s7xhjKe+{T#X  } X #  H e ' F a  Z B r  b v! ~z2$=2bF]6 |a/mP&t`W*[p5L/~_H26Ns ''U?GrVy -6HqDWh|$/B`iu-Rl6JNedzk,}5cD_GZ?H>:2# $T'lAKx*Jh$WPe V]W4wbEE OmSTQ_o n.@j%*dE`#{Wv357=@FMSc %?HZZk~>Ae\ &'FH| ;0n`y}/4HQcj|9;H^s|j`@xvmYW[H.r >yQ~pU*]%iXM<* |yiqSUDM9$# #(-?Lgq7T w+:[jC{9:Qu&Z9e#f0b3z VdaVS> [#z,}>=\c!ig<P:+v)  )  8 ) H B S g z p !9*O.[#hT ;k@FX8W 6>lq  qNrCj#4}'?jp  )KRmF32O| LS   u H D % k\  " _x3ES6)G[%Fj1I$`m7OE/9u/j'IaA]0, o[[H9,'9A5d9-RQThHtP!;7_o(uX~R?r!`@t5a@i *'B9oLLceokw1yTpYrbhfg`IoIa3QD3 {Ll.1 xIS W][7MyG.4WynB| r'+F:w^y- Q>z2q,PD nvXP($ -;QWq(Qq)Uq#V!;^xIZ.=-yscwOaBh$Ebw#-=@6=`!p[DYPmL 'M,kiM r!<bX &2_Pr(iQ6mICz/o+ [ ) p  K 9 ~ t 0 A i }  G M   G A s A,}` E/pj'&[Opr7Nl~_N.zJ(oIv?Y(#    nC L. $    b ]D ./    v H  k [ { T S * " : #   W  [ ' U * U ' s d P , S *   w Dn B  Wp3RjA}3om.?GxS'c5\d[[`ye ^ 4kHss/KK:u?\8] (lHgN;"&qN &% .@Mb5^;c)?Kvd{B[ 'Np Pi&\|#1+HQvan0S8Qj$#A?YXnD~Ti( 08EPOfmeqwitodhPS-I:(p/rQN3fwNSw?IqI,x>: r4g.ligP)7}Q]I,%-5Og!0;Jvl,wNYaU|LT.1#2B~o. o.WMi3|!7XO+bOpq ~ u  _ x ? X"O6_f],LV~ >(f5HRU[JWP7tZ){M{JHX[z)Q+}30 W 7  l u  ) d  F U  l  S  F W #iu)\K |=Gf*U%d'N#`!leE9U)`N5 m=~fmOfC:?1#( $  #%#&>IFO^brl"08?R`dz)6>ITQMP>H:+{c?wV70iB4m^#|542,z+[h M\gJC?mU3`$jM.rj,cnnPP[sJE#rG( |&H%^+;@\ko-Tn':RD{`u#Gt2M&]O @m5Hl7^wA^v1  S]  ' $ o U  n;  s0|>C= y$-p!*g:"['`&!4KJyWiwnz8pMk[bqT{G ~ureo9K9tVZv3DjB' uK0yyFKwDzL7Jl4]W #5q> T  P \  o O ~ G > = J  d  ^  Vw  ?oN_`Fn$&vF~jo.pDPz9e Py(OxO \1uXC9.*x+v8wFG]x--&$mn5z;|,{7>;J  /  d ,   # 7 i  d X # v3 { B Rdl-%^@:V) 9yZ D zD{0N%vTZ{ 1Oizze6TnFK)cg7O{)0RNnI,BS N w [  a - ^ @ w G | L z Rg,|D k+$9Wk=+X9:=|"dy!U2lf7#Xw+P|VgKZO+{m]M77)}sq v chbcmidgq l yx{&z-8C9JSZ`_tvnr{lyiynoifuajQaR-;&%z[sAP,-zlI7 p#W]$KJho. |t.? >VU{qF#^`<e"m{Ky+peZhiq~(T /Yw$f J'}vQM*-xy}e,|T;BZ#u~WK}"gI/vq8+ fr;$Zm BG gM/s\B;~(l?% M xz^QR9>,2  ')  #  -  >  X  x  j a-cV;s%xqByatW(-/u_^e @BywCl:Tk  pZX6?"F|X"UB53@YFf-qV3?[s}1_~ #  2 ~ M p W e O  La  6_ &mwn|"1<S(DLHf1*6Kl}>6Pk+@jJn-uqCO2{Y0s`tBfHL!3%  {ld[RDK:&%}kTM4s_Ss6g0lYD=( y|jaah\[]Zkx~ .'H9fXnAt*BhGtA g1f11n^l%K} BW!h6zj2Rh .?2=CV&K Q2Y@RQiTi]nrhm|x{+I]w:G3bYn|M9hG|WHxNY@P[ i)p0\ZM`B'?gK<Xk / a  Y o  ! m p  " { u $ 4 { % m|   ]c  .=z@V},9eu!gL F:qU*LfGw+Gk%6ELORKWIAC 11dWB>z|IS!Fa,h [ in#Tp"%[[  A g ;  \ / \  v +   W/ tH_-xY#%?cjD'6Q6'lX$p+XNk5LO}BR$kyRXN[/C+;-01#/+0@GUfi  &-@&d#k,;3@/=-81/)' % qbG*rY7bEx ] qAz <Uz2B u}IA( M_'H. |Dz{jeiQR&I NELFIRfZY[Dm)e| y{{*l6f:eAZOPTQW>d;c/o&)z }#zz zw}|ulncqQ^\@B27&% % 1DFSip)I!o)A;Ui6`)q%>q(w K7p+uE,%]:/W z+C@ia'0aa%:Iy[J#0[})3HsX M  I  T & | - : g i  ' 5 V E l u y   !  9  ; % R $ I 3 H 5 Q @ I B C A A < 1 ? ) @  3 ' /     u N /   d y f V R 7 B  (     a L ,  x | c p \ f a P S E R @ @ & B ) : " 9  3 ? )  * & # #          ! - = : D S Y m q y w d X K 8  o _ : %      y H 1    h ^ nC V& 0 }ig>D"b)jO&P JdtI8XxU*=Mhs32f(Ib(m:rCSxIPSgH[ZZG$y9rL5m(tO>e`N40 rtaQTG?HKT`\lq x4|5xUf`eb]|JnJ/'z {rr^O>h0U;pIoE!|8Z-( X V*i j!Mii{G.v*Gk:u-Vp3\ ;2  0 $  qH1N-^']c'~j.r@i@5Xcx$*H,X@lO^ r  5j$24o1Lgk e+qCfa$mLS,I T+p[LBFz-P&5 b^Fp)aM 3vT:urbUKI|G]?==825?IXWam|~'D{9SZ &W{3U*fG#=GUp:FG +r+Q=n DQmc>] I   +z D 1 )b  G  Y Jbs0~ip'O b=ubzS:&sBaL3| 4Wa(]UY!Wp* c  u Ad  H U  e i @ &  v S m ! \ . (  x _ D 6      ) = U o { ) J  [ r 0 ; _ f   * H H k  | 6 Q {  / A f w t o Q I -  !      &  n  A . h I U  =    V (?   w >H   pl 1 bOY;ES}P5@\tb{,tGb]dC#t-dL9ip<3 ox>O.7&%(?^-`3~U.pH.ShQ-]U9:[w-PtRKE~f0 J]CO; yf) 1=y%ku7^iM1>QS Q&qC@v+b3]&eF p9d7o;X6l @6WLk $Kt !0A.PXh|v)]L]F}"5WlLV0c62W(zxp\FC43Y=A^S  n (  w 1 N C 4 [x ^BZ5r`T#1|\!jgXFO5f-K-jQhynbYJE*|teP:. ^x7W"yJ pO&tF fhG. v5vJ&Ej0I{_?.h`<NWY _ S  l &  Wb   ;    %  O  o z d5=5}7--'UL NwYBB, &h1wQ34Iw ~Pj:m2p5T mU->[V+ ^LB{.Gq`ATG3,#X 1   o P      f P r d R D . y V /   { S - P )  z F  \ 6 P  t j8 ,  H  ? 2  w^ ' '7J8RgfU,<ObwOiyb8P *c%W>IR,WxLUCFA&m4\:`Wi/U_0<5ߜ$$ޮ ߡݿ9W\܊(ݓ@ۘ?ܕUڈX۱6bB4$ %8K=iiۖ٘۾ -KpڌܱFNۛݣ gr>Kݻ?<ީ4=ߺ@P\b.JWt#Nc}#KGl T&CAPRe]\kOa'Sw%8eJ3+zUg %NnNMA:lZ8=[h38lnM+YY N6pdaZalo& VB4|O f ; c $ Y C | C f B Q 0=)7 h{WY&9b tv:#a[G[1=zm(c,8RTBjRnxeuccMZ4zhMP3) p8t4d_d4ap|">b[QH`n%iWfqj~4p'B " i % < > o  ]  R T  j 5 N + j C  _ ;  o i N , l D3 }lwcW_I1t'xeTI=~j-t:KhQJ,<7}$3hQ-aZjzZE;nx^rO`P0GMr_b I;7k- .T4M@Ti%to;20a<=j/~Y]BH,(!oR6$ &*+=R^f +1NUt6Yw.W~=c0o%RpT!REz68. AJ^ e n$/.X0cEM*SEQWWcEu%  r   u Z {  Z z L / + 8d5r UYSW|Is$=aqy4/IEHG?. l[MtNa.( ~GE8Fd/o:Qxe//  l & r M ) 9 e M _ , H  2 & - $ " o , _ 0 R 4 D N B M 5 p ? > J L J g  y N l " U6 \   ! _ ( k  J y 2 j 4 g Du?tN q"\pB])5:AN:j4/"m@c@<CWV=YrN , .  Q  `  } o p Fc-9Vr*@dh*!cAEs8h]{[RRAg3y:P7wk EX|-^>A= LwC#Z7vZhGD8/! ZQF, nv{yqdViG`%aN>QFD;=(}b-<$7 ~qR@&ykhayVua}ZvZsa[^|ow/"`Ur4KiK*VP^}IV$a7 [ k  6 ~ BB  ~ fRnkgscT@ _NE8}o$*M:][]yl_jC-m X= P n2/|\6i fMjfb6JQ!]  ax a c o G x 4  )  ( 45LK|q _[uX-|{)G[)u"]o,hAh<"CXQ2 pj2>qY4 ||  . 8  3  7 c a   F & l Y  @ (T 3j P [ g y y z y t Z F +   s T p + 5   P K  j  S f  b G ^i<m&#pAy |>XhV%B(\U/ !~6Ut3s#Zx19a/Blg3Ai,v|Bj{Ce5t2n?3V$29\n!#zp/KH=6m- Y |uK_ Bi0"~w.Qrw3FI <k^].Gy>} d7EH\syX3Dj!*3Egs0@[v{#iJJcFt)'2lWPh.y wnH+{xob_V^UZXgh^[iFo*w}oT( iE^;wY na4e6p< \:WgvHD( \Z~QD#|Qb\kLG  vl|3|;sgorv#Fi 3W,M5alz(N7b?rMrQR9AZ[,Q(|uG#6f?y4q2N8VmXl (CetwmaaR<B"+%|Q!eJt0Bx|'AE U!UPT\?}`V6W$U! /M6j&&b |S]P'5e-G%O(d,?:q p8=A[,b1gB]%5 9+'53Vg+UI hUHnBCC`W7uQ{z0KEE9v+Rrc*2Vl d8]QkM#-B^  Xu   e q  \W  4 a b  Nk  g  !E5[ zdK~ubA"4 F:@p;5%z$ V 0   A  i + g L {   & K < ~ 5 S5#((w/^AKaow**uh$w&O*i=ogvXh]jUg[dbzl| .fG}dlOLWU1Qd9V"VSR" T ( R - = C ( >  m 7 2+G m1h7<$I]wIgP2 Qc~1/n a   |  e  &  lo  O " VtE5S]{PC5g5{ f8o^ Z7|q N4fa.]WYju/(mKp#]s}sa99/l% =5A71}o0#<x G 5 x I # < h 3  S; -H8 `+1)>{P||#M[NVb{BJ j=i i)@W7f0Zz(L *N i!#1(9D6RS PXZX kpvxm~vlTM;'bOM!fJyKD. D]-jbw :cp>7wP@6[LqAQ<]+)V5"V_8Z(yK*mG1ZG%p[-MR?u-BEP*MZTn0uvNs*DkS8?XK@tF0P{j/0|V qb| <tFI \r'f g l+   J P o  L   !  .|+I\R#k \D`x#9<NHcLL</m.OVSw rR]6< x  l  1  B $ ! GNn3yh QH/Qer:MDa,IyVB>u.b+Z=PH^[d1b?s9|9;sUl- A|yptT~R4$0  _ 7 6 6 ! a  ! o z 7 k  ] (Z7pF;iDZPLF61~Q3g3  ?m !  >q   S # m  z s  , oCH$,u[ A"zFe]*j' FX,DRzw !5Ks=k-q9_ jSx0 @x9M/fh7sTz1 TwF^\\<}$F zvUI1MLOyF0vK O9mv ? ,FQTwTZP1N-}HLSBHwN!61Qg I1Tg\b#oS~s8H} Oa$rRJ!{e[LTL_};FrfJ}2NuG-DMX.Kqse0-JZ&LWPz*M_P'be`p@v"~MI ,?g|>|sfyzvfNJE<C=LsTgz%h&PQ| a@*BZR&y&y5t^ >=>:x?G6) :x%!~Agk K"Dp)k1(wJu*R-K+jT|De?Tfz!9\oxs_I:~tae!Q?l@mUt(@_Z&1Ug3P/mMDn*Z0&0Far5Lt 8aR#D:vv HW@>{A&Pn3n= :pr@ Kb  $ ) [ T 7  h ' ^ - F :  ! 2^ }  "Rd :8_{C)\5y>>E0)dV&<i}?s kI) a n  @ w V ` e L Q *IKnR%{w33B>Se uCF*lcm{ew\-d[c?Q sVy8[7:( %)7MTC"SM{g0pVE{:G&9}\l8bTf[CK0ID *yc{=@&j^c7CK;5}`C{!,=.j+54 lE q_J(:n1Gu8*RZa3^n \XWV_eq-`8WmoTA8 ! nS1YFMUCtLJOs}>z .Ayt gh_E tB&N\n)DBa Si>W+&c% b:Z}5;GJEM:+e>U]a -xsI~Z-9c76DgDU5ZxuST+U[=D:a\51jDx,i"YELW O a(tKl;.[#SS5E7YF"e zItKC'P`"AZQ)eS 5F  r u 0 1 @ E K 5 N/KoF\7'WkyR2`z,i>me? W o s q Q `  F s  4a;&FTG' ]n&E K*':8`gEU _~Gj<*U>|n(`VD:BZA]\|<:4[ 1Rxebb.   MY  !   5. |  &  j E 0 c  1 ^ m * @ R ^ v t  z w {r `T 3I $-  z C x  K  R  q , u )  fz -  s  }^]+DLm$c&':kCLDTw fRfw0u"m){##A+K`?y&Jxe%ZyID cuKF a4d7 oT.fK.!3 lb9!w V9&%-:Qbn.Bk  A >k Z d   E g  G y ) G j 6 c    G 8 x p   @ $ t J g t  7 ^ ( @ T } T 9  b S ) ^ $ m < u 5 f  S w P \41gBW$R"TMLCq+OD')/~.F#_; r:k(|/G h)~W7{];$  0K,m5[w%U2]k0 Sll&*|@`.w_g6* gN)( .  [ &  VU'[^&1*F`Uv6khN TS*(Z>r{~piK6hDa';|2 f* 2n9S-ur > yc  E I h  LFn)s 8dn m+RY^moqjs1~ O,b/k5mH!,47OkVddIv>u6'&-91A?O?_Zuf{y 9AeisqPA{pTb#F+`._IJ[i)Gi(q+|Oes[3 ey+M"yIy&W1&Ht/TOz"rIf Io*'2P.JE kN:cD ]@xPZ4QFoy?.e.SQTabd3G2:N.MP[PPCjCH-$Gdyg;*g7W)ynC=g0A""zZX T!S%W=RE`_X}n ;a7\zEg@qD<pW^q0BpvYW6! BW}K/ F\9 \` g ,JIy,`$x6 H_06I*HN^z jN '(E,{@Zu&Y_>Rv&X2!eV=:*#$)'7ET3.i\ ;K~yF2q= YJ]^ )G ; $  SoB.m[ > \pu`KYv"6iG9 gj06 j } ":F}C1|hHO 8 62IFt0TZK} h{h tlI_6_ 0wH#~~h\ D 5    iJr[>|8mU%>$fcro^c  .!s!!""DT""""" " # " " """a"-"s!/!Y! a @ mX ]9NF(Q8]\G>T EI1Dyz E 5 y w [ 1 | F<~#cgI\ =m4: lg[=V.GWo-K'q%dWne2%`Q"|vP@vPP#0tJ~+Z ;(i]9]J"lGb4I%`0{\W@R2 )iH^/qXdBh)]T9C1  @Stz]bU>5IiF;15T9D6&Dj\L d]tXN0Sn2Ji8T ~6R>K~fnZ]YMbT LIKV7c4YU+Y:VWGZ/Ez*EtYT  s " t f = A , n {  L J  0*QSu":GOTjdiighQ[0UQ 6 8 % } e 0      z rr ag LX >C 12 (        % ; O R q   + # 8 F4 ^` sv   Jt 'Q dJ*k,PkKwE)q6Mib ~-E_sydKCvO8}%O+sZG/,q.pZ ) f ,   h IM ,   h 3 R ;  M   T l 8  Y 0 Q  s K o ,  D } G m 8  c H ^N)EwxNJ{y'75;/:t ,L# rAK]+jTwmuU<=V%_Z !oz#=9[~Js;_7^ +~[cC7Q&Y#.Zi߫gްDݠݭfmA(ܾ܏qOGCDKWAkw݊ܢݲ5#tbޯ2ݚ^މ1ߍ,PL&AH=Zr?V->neR>. _1Z@U m_+$  e /  s    S  mDl3$H]vvpN/r ]e&i , I  " 5 X j   -  9  B  M t@\?A;3%1 6 8Tr9BvFuj;]2rPBy<|HuQ~`r ?9|?T>U#}SNwai4OM'{J>   r  \ 3 & Z P j q|ym>pnRWxjVa &28B<3uB [ bqmZ!?DjEz+ b0  L # U W k s   *  5C  R_   (  i8 \e_M=e}FWjNE]yP;y;{O1g!or4@%lEY-~XJ+&~M[2f+yMs3zJ/pjG.c_ .Ln+Ky+y5o'n Qb{0S`l])KTjk0C UIfa&/ ~Uv9YF2)$!''@Tj E]l `,e]B3dIWD+Vp%Y4Sp(ZF?*[![:i# KEmr 5@UfIKB u & 2  l ) 0   = B 7 z 5 k F }  F d]     'A$sGWh"1HQdx;GVeu3@M]j'=Lgs 7Qo(}.Mbi@Lt}%2(FG PMQ[WTHF;x*b< hz(V: k,o7H_M)  { . _ & V   Ou  z ; K  n " r B  U  u 6 Q   n V;    rd >A  ytLD(rFdEE^kA1j@iHx",XwL^n]2Ji Ep7Dv0N:9Mh ZJf`IzU?7  UW  e  v 3 q  :l  ?V  >ll1/MKT87h{*Sni3e3`1G%snY9^~7z5"IZm2]9G)Sfi{} Cp"+.&z1eI3pDuE'l)Kr/y+M~)WmF)*2f'8kP(4QI ] j d ( ~ A v p [ v3zUr<g)h^{ V]a-fVxZ6_h~&4^{R:ItUo$$ bw[NN:!4nH-tkcTF571gR5vfTNq0L%`,pVYE-u:{:pL:QHu g;&Ke.y\A"TtNuoXTJ4?&{]@& wrs}|| 2y?h~7uF(|?lG 9I{A5ymV|D3LzLjqi& c3EzKq!RF^o.v6s4EN9JD9 | w 1  1 : n  Oy" LhgZnl@MkO3zBhLB{;e.H1cU{~ #,=LTo[rmkv[|N?&|xotq^meIa6ZKWA73m5F%- k R.tY:}~tka\IA$8({\vB`)D'_h1A $a5d)8[u"'b*t,_&e6 < K \ Z y X X  Q ? vYh=N_X+/cr&NNiGJ=<\2 ]"G1AF4U2n4'CKWd|"<\k~-VOQ /h)+tZ}1oD AoMA'{P2|tbTPIHO\)`@lp G|Fp,l3[xgB|YBP!oW Ym6a3d%eSJi6L2Y3i  m F : )  i _ " L  HxIjL?+k h/Dc4K#+!%1F"pH:-e Vv <`8I zsyzu}r"='lK R8c$#aXDStSJw=~&Ts$N~(<]q Zv,m _E-rBKU(s-M%@nK0Zh[U ^ m3lD/Xb@Vm3`: 6 Ku"A~ns[dLB;8.*&($(&-#,@5[=cRp}-YEr9!|j XEINMpOvCLQ.`IzruM{6zh$:o00*1-!`[7s `J   S  G 6 l ~  S t    |  ^ 6  | o L H  .    il :*    W \ 8 [qnX>>5* M  (*:lPUZK>6:BA0aYesS-W C   / oI   A O  - y  X  e  R `  W G z 6  ! Nzb#VDkBg )+'(#\]4=u@d"3w 5 G d  H p  ( k b  U  | B QHe^c~n{ \Z awSoJ]4UB<9247EjBWjE2f-1rYO+ra2E*hFq+U-sCvTi)Gk==><~48eoM0\Br+?X?xEYFIIB9' bgJ;-]^#+ ;_8Ii>9{<|sB_;3 oU/rfWMGq4WBL4E%/& ! ~YL:)brOg'P I.%vS=yprQQBA2 ef^TNUSYf~0 \R(Fb5EcWD:Jx ?QL ~m+Ab&y3r4|=A w 1 x > T cdc5^=^gFn'}N5p<kQ~%0JL6>/rEx:xD\{X69Q`Unjpu'!@ ,C t F  3 x - k  | l 9    | )\ +  y @ y @ . } a5pG2qb`Iz3M?!ym@}wapRJI,dGkS2eJ'aCs^K/oE?g^A. {|m}r}cs_e5T$[ E4)z_0 g5}E X2Jcs&ov&h_ A d@}fp&! #&#-,M`6mFk_Y/ot[7I",k"H#-]gF !@pM GHb3*EsYj7]!GS[J?J7{BNUks'OAuq +Px ;aQ,Q/ #!(,X;Y#~W 02X f  }  < . s : 1 [ PVXHh0G_0to%Q_"KnV&GVkz~}Q- qbOj2Mcm2Md:s;zPt%9 zpJ( @r QOY,?   _L   u N  l  q  U - # t B  b ?ewo)b+;=1&]m?Q3g [UJC-DKu_zxX =O $r.E X:vP/# ";]xH jD4OgBBy<g\m yg=H4PAUB?3zKD-[&S}0L[f0|;=74.-x qkX@%tP+fQ< K Sv(_&?qf& iVmz-x!e o-:.i#SP,Od&\n3zQp$>b;c[<"yb@41  1Ka,z4F\,RHwAg5l/vFbHf i|:PjcSQ`OjH} FL;W^h}y5X07ALY%  S  M  y F W - #  q 7?  .\ aN~CQwIw:#m6?Eccgc7eBbNRTJfGo;u)smsz^ZTBs9]#= nyDf+E ' {H|5W/y{V`.:+    V 1z Z D = (  c E &  d m N T & ?  & { _ 5 ! t S 8  | M  v J % p 8 h # ^ 0 KFN~Ay*p(4` D48Q?g3}u2g <UIBR3Y 5j7x4~(M(p:RItGZlI C_ bOU LVpgB9\{C[<% {uxpz{~0$`PhCX+{+qG=m#sIXeTHJ)RrCG?f':d\-j!a= gJ N=kU}(A"W6^CV^uqww}yvvyoleVcUKG59+(!  (A)M:_JvShw&?w4=s+\'c>i M;xaSDRI]Tw lK5u y K L 2 , v r a W > `}I^0K}UJq5XCW1<tDV4_Gp-8S\eYUQ>0yV({<VHt,Wj F7t\ l;jA^@DB.*n  K e  9 z  I s  ? u 2i=S )i9S&uPd3?, uw]jYZBXJSSfNd0{i=7c/I1*P.z\6}VE xH] hLg5N 4) x z/1T_y90\>w^o3]Np> W;dMQ-Qk%YXP*1a*\8 VGz iC5^])*g 7{gdXM(P8V' Qm"R=NiZ*K-6s7   , dN    < < o j {  7 D X [ i q h ` h S  A b % >      e X/ &  w G a - o  m=o+fq#dD /u3yUFu1WhLYKgk(4c$[' mH&}{=Q0|P`8mR|Za.xThHnIHFf8RD:7hp XJ6# U b  M / y " 3 N t q  Q   3 Y  q 6  [    0 8 9 A Cs < Id >F .0 ,   ~ l K j  Q 2  o W & j F  [ * } 5   H \   e *\  i1Jgh  ~Z%2T.L %oB_Lc^O1Qr5VUf'|vJq/v JN _G6BQaZW433)xbK-tJ|uhJt&ds)8z<8n+z<5mt 9 Hc i}      +! C5 [0 C F [ Q M Z  G ) J = ? _ 7 m / 1 $     A W n  * S h   9  r  9 U  Y / u i  D , U n 8    1U _z   ! ZB l   4 q,i1M ;a#/*?MMaHpCA;$ {l`(V3r.a0"y Z$ c 9 , @  o U  "  .iA.{rmJ)/kuDs7k!!:Xc'N1 2!T?5{$Fx "q^D8~z8^c;hC)xc)3"Q(Fa+1 Vey%GUQ;V!Cf /Jl(EAfKz;z"lcG  - v;  1 | +  Z V q ~  8 X x x d C  q c Y  5  }   OH  } o # qmFIVsY2G'JPAO3}5)rr:\t \kb-W]&l=,i8*Kvvu;Hpa38,-S|4m$oI. `xag*v3!/H? p  ,;  _   b E p l ? P (.K c0`yi3&Klf CY)7V7W.j<v8/:) W?IeQN$:cox6:\x# x ! Q  , j " J o [ h  s L (   8 B&x7{ XHSI^,8ZcH;3W!M8{}kabNC>-dW4vF"wU$zWP a1Ui-i(a*n(;jZV n29o6Nz,|Gf1b@M `g6V- \M+}wtan]VVIVPWCVPO5WHFSQrOyLB>=L9C.GB4WIi8:;07;61 145K'b#y3~52!-)&,,3#,/-064DA[=bAdO^[rfnhryw{~~vyuhq4V:[XUQA>B+-+M_v:Sp1T zCT{ ; H a < v c  #P 4PfK;-eCD p3z|gE>NwqvFo&\h8H @\0^1hOMX5v$6u P[PD aA s?o*`p?}>x)f9t  'CDeQf|}|fcXE&}{Y@1 sn"tZ <O Ui@nA1u.6*Ei_+y0 z&(C8_pr Q$=S\C&ߓ(ބܚ`۷V\nڤ cޮ[ٵ؇ݨj݁PkJV7MAUU^m݇ؕݫص ]o޶٭ w]X>۩^3ܦF8lLEvcS8 sEK+xwjeR`G.E2rKd_!=Ln:rje l@gU x   ( & 0  )   t E p 3zEb!S <VBJ;*|& v]W'j6y-g H+XG~8m1v=\Rv 6?Udh&9&g >]`v.7PSO`kcjhhZccEM4z/w#i P\<+ ZG&zQ-wOV Xk<Xb+$mBp85`@d[jY\H9f B  l 4 w  U & \  R,XOlq(>h(1X.tBMT r@k%^4e4t!,nAR`2 ;h.\aYߔX%T)ޙgB2xnl{x-:Nr݋޶J2i2ߙaRF-9rI~8w;N ^WF3,}a9in_SM0;uZ>YMS6^t V2z4q%a(N5^-M)l?jAc x&;>:B_HHNM^ Z.lSmym4dx9L:nOfI-xPg#R4ZnTvA0d ^CFv@LA=a+__D=5K` * v  v v  [ A H  M  -]@rZj>d?)eNq.;Kd`z_i{ o  m!!b O" ">!-#!#!#U"E$"$"$5#<%|#%#%#&($?&X$q&r$&$&$&$&$'$*'$'%&'$'$'$&$&$&v$&J$V&'$&#%#%s#R%#$"$"G$!"#!y#e!# " " !!s ToKkWdJ5Z:cM y/b*[ ! C + f  > N#e\5>lPjj|?U%(' '+4PcqHBL:m(Pwz6; fj3DR!vGi#xT-o C_/l>yD\5EwT"ArGl%5nPR)z7}_`G0.k9 m>%&~9fLYiC@1337DF?@]Pjp&6YB_ 6,@grAl/Hfi$p28Z}p Fqp2k7JZD?`&zvy`eg,oJhDhAr"P!r6?G2B8,._&[t  p ^  L  : p  J ]    #    k \ /  | V 4 \ ' w m 3 ?  tg6(sx(B n?a #Lm>#}xmo~|'O,xL9q1`e=.S  / E   t  B s  z u  F.w }wdUQ12f~#@@W+l9s2l-j.>W'm?rDk@jAbAX4EyT>a6vO'p4_Jsq BlOYk/ ]  ~q R ~  }  M   #=YB)T xwY'I\5L2NqTL\C @Qni(^VMYj*CN|J|Bl5 s:jBk%.IfK[ (e&pWn47& d#zjJ$9qD^VF/"_AkD3q[9{zmW^XZN@HK?QTP Y(\IiPgtu66m5K<Ix)?t|lK} O (  . d t )  H  h < A  - z u ]j8 el*HRJJ.gSDvT/n4n6Wt 2DIYQ2j@cLXHTPLM?GG 9/!kG}_X7"$m)S8_zLV #8e;bySN!G \ " S   g -d '    Eb $ \ ^ @ -   | } ] G 0 $    r lM A    Y p H  | <  ~d4T F^/ntI ou6J>=XT`Jb8W^E+ s>xZm0,U/b3G3w&o^:Q>J8!iNYx [M>BmOZvbݿyh$ܧ^ܐPۺx4۸ڬکڡڏڟzڒbګ`saځ$ۛ]۷ډM_ܤ۸ 8rݙQg9ODKrPn3qATCj7z;j.xGl=xR&xiJ,{"j I#+8c{: b!}\ E+RA Cih j FcO$}SAp9X!yOw[ 9u(bU;i>RR;N"Y g^ 69SZi}Y v 5   K |  S l  I M  dV   aH   V( j  EJne,Js\2`AktfP J0-4J^[dogj}i\dC^4I @)!{~`PS7L <_2y;eS?5uC ~@zg K # 4  | i N ?   U q ' V 2 ~ I ~  P .  j p ? L *     n G " |iP;v0Q)<~lP9) vlXC8, hJV3Im_=;YLn!nYm6W:H{5GkhXP"-zjkGf"`~`g#@q~(J ]l4NJ^l|D-"t Z   ! ]   ! + 1 q C S d  l N } v / Q / K X w  / G U p |@ b      4 _ x     ! C j     ?Vs  )=Tfj#$! y]En(M 7  l K~ D  m ) r 6 i  p % 8 H E C : 3 fa>%r^%W<pY0l ?Bex %jPu0ZRK^N3k)g\n7?$~fRD(('%1CM*^-vSXz)W!/ EJFi\pm6^pXT0<@3APXYPTjYHK55c7iXO%.qE}MS4Z.j4e9^Bx*Q&~s%q$j?YJ^p^[[le(Rm 5&^K_ /V}-U>W}4R"!HH_grI^ATbz=nE,vLiI*]8!g[[*g oQ2gq;+^-  mhzeiQ e D \ " b  U q E D   i | % vB   Pf  Q4`$[&F[\.EZO#l#rr6 V  kw 0  ~" / K q \ R p    G ( i Gs% =Hc7zX=uP"2|7a? 9h.f< f!*@Tm Kb|/7COa{jO#t5yzSJL9|+>wggC2y !HqRv8<ZmL3(hK0$ -;P]x 9`)Q36n;G`'{Z!aH2tMjp~78c}(8 I\$^"o892I=83)oT;~l[& l]=( qtZVB8/'. $#3 @8LW Phj!5 [l|%)HWmz )2JUkx0?Xf{2Dx)D@[`kCs",=Vvj S*Y?Na(Kl Bm} /+>:LLS.O2TAR5C>K;>47*4%oC#mQFc`&ya!M `~N-UOlA9Y+.q}Kl }NI Z ? j J.x.K_,GQHQ ^/R^Yim9.\gB%[iWz=T,xcRG#(A*k>] Bz Ju.|1d`M`.OqqR5SXmt}s-vT%85aL}[e#k-t@~3  l  h c O # ( x " R i Z . \ <   /8Cf^vr4{4wSlbbiEn=WfXH1%J*   h? = e C  ~ 0 j ' 0 x ) z & }  n d SEG#x(cwA84l<.^Z, U!tXzH1(.6E8]['._f ']j>F|H~Yy _t_t e]   O 3 &  g 8 q , L  o A d v t t f M v ( V  (  G O   ; &  D [5f,N$qMl? V7^ C~O)k" gm dx E,w7k!|S'c>{[vFY=C+;  v~fm[`ZWEU4A)}SK:5+ao7K!Z&wI7s9|~L=3S| W,k*}FfE2 lK3y|n`a]\c[ir 8kMvU8j X pEH\S]q(fRaP4c u3tPpWtEr: e0"EI`} 4  T  q      7=~Cq@V3&$ft/=BnJ),3j%3dme.NLbj|OS##?Jix"0qt 5BSng ZE$jfI= 3  Y p  q L ( -  D nEE3k(M# aGB+Z!+*f< KNjN)XipZ.P[ l.A`'Ut?f -Y[2&j>ibG@g  (   y x c \ S ^ 8 D % .  1    | ^ F $  z o _ z G e 5 L 7 % %    a O (   k [ zG _B 1+     q E . _ U 1 ~ W,vZl26nb;<YY,Uy${)j$<@?T%_\A'zGgHmz|%tGhXKo(b * S|Jl;+ 2{ER[LpL R6xr GfT=g2]2@k>ZREM-zQ9E5aDVZlhl- ^8!XSr<*pO,n7|g rzi }A|,\fG1*If6__\( zS8T<-l>E1 o   YG     \ Z   > H }  * H S x $ O6 a }   & J r * / A Z e 5s R Y }                        m c M . ,       ta F 2 !"+CHU`wfc~F=/$   & A R ~        " I k l   %=0E0JP^kdxgz# sWB$m H -  v I { P  } D ]   @ ? ] F  o 7  i Q  . ) F Id{h3hJ\gX{; l6P1/6 uEXO:cnm{{w u j/rSr, T=q"eShQj8Z? |nGC|feON3L$.'0#-"%==T]o4C[5n[{@?mk%V~6V$HO f7q ! N@RO}r"P4mdG&yWQGI$fd6}IdMj]1%gT>) {!XQ00/E[&-\)  {%     8  Q ] l QIS:Bs)/m@95Jq/<g-i+Ud h*|AYsaq`ewJs7_ZH4l0ooM' /R w{!Bxa`  9  a "  *"  \# x 9  G1  OY  c   =N r(3z+|^!:}W5w>fCskY0J==p3>2/@5DWSaq|>e ,=<ea$Km23AK<E@)85+P^qh|Ot_aa0@!Bp.7bk<2?Z kw0-A>@_6y.wYU *S3Ol Fj ,.=CVXT]XUQC8/ mQ*wujpUq-[dhfL^'XVWiS8LMR=D? ;2(O$   [#R tc;V'6Vo,jO7,u M #F%7EPlS%|G;l3je]&@qD5 $H#%/C2MY<wF&GYOKT/?-.  E  N j  N N    T= ^ =  u  ? < g  T =   N 1{ 1 1 , ("2H B W P O @q 3X   ` =   ] R  _ <  = ;   VBP[mI@%P=Yo$| Q: jN` ak0XoB}M {M-wbFD|=j+[ C#+ %#5<2=BROzXwTYYYWG]5`+\W QWDQ<:)_ ;-j^SI2clHI|GQ r;KRx!@l9P B R[!Z:UZ{5K \~'`UB4m$F1*0>[yw"Zx 2O6pf/0yp+nYUD3@>HKr0eL @F'~)sk ?\QlE<Ex<B ZD |Em= M:|So@=dK@ ~), ,+ ?W C = = 3 4 & (  + G < L H D @ 5 )  q ^ R ? 3   g K $  wO?) {e`MNBE?8=EAV`Wh~$6COTf{DYy 5 #R ?z S k   - O  n % S s   J > e a  S  1 7 a S D  28 v4 ] m gt   R   5 |   @    , Q      e Q 2     w < p ?  r |9 ,  w| #!  C S W Xw ?  {   pA  e[S\  NcLf'x|/"we6B}.;C5TJ*no$&DMr&n; k\%d[=\,." k,Ej6 wy^wZA?$^(sX8[3 z]t4TEl?aP.u#a+ }jT=% ~4H\bm!r@Qm .'=g2+QL!LtKU% &j TMߨ8ln8ެܩ$Aޣۗݧ5,ٖVO܋ػ8{BۜgתpڶMږ(~gKB:֨D֯Q֣Z֢jַُ֦ٯָ: ڃ=\בFڠ=S{۶wm]&ۍEnNPfD H9cb~==yfR:r- _1i"Jx<[m**%! yliSS2oP!J,mI-yeaiiQjEvH B\Jsy 5  J i  x  5 M } " %JoSF rN9-#1P5!9pVDkec GM-  4 Q!! "0 ^"U " " A# v# #!#8!$E!B$^!m$y!$!$!$!$!$!$!$!$~!$m!$^!$O!$:!n$!N$ %$ # # #v D#@ # "n""o!6q!! wQ .L 8WJ mIr {Q jy )}7{6W@@X'fo| R  ' "  X h {  b * Z k Ka)l^ K`B56@CZZi*Hl@K;ydd?..W5wF$oeL>v#S ]}:l9.e>zPPy):pV#3i/7h~,`JDSnYCB4Ll.H}+~:Yg-{0c'>pgQ'4K!zxDe(Z Ou^4RpR-vDA+}@mkiWMT!Fm&Fwk<:]a4_8H+(wpH:xa1 SMu3SXey1Nx*;VzrEsN ~)@Uo4v Q>kHS!e9=5Qv&p#{m)  } n 2  e G  n  Z ' P  { PWA7$lU6cHuCi%\ &?Vd*7NPiqrxipWrAj%[M7(|Q+UCU #p}B,j@/jT n /( } ) 6 k  B P a  $ x \   )@^c6VH2/_GM Am1<al/ QQ/v@ \*m I,!}j7{hR?( %AYr7Ue85LR)OLhYqcl{wkE-nX@%z \yyEK|R@8<`k t1)?){_,m 6n \e[hhn BA]r>?TfcB|Fl.C) &0?V Z%r;Jdx$4]Gj5d 2b)\Bw;1)Wf&dR_M#U1fDD}Jz7^4rP*a^ V%z8yZ1KrT?}h L,8O;3G ev6w{f)T = I ] G  V S X pV[8d^Wp3\A:a$gYT4v v_u-mYB5j\raofkCY",ta6! @J 4rr w2eGTF` OGNl9/.Yz| p 7 s j u * q  Z  9 Yx")w x%GKqD~9pK$V|nSC/$uR*u^>9jHp^`J2&~xRQ;Fjk9H!ejw YC. , Nc4]kGy+g=t8 PGZ&lmA1yK[Kq.k+bw#*%)O1)9_O S[jSj)C*hA 9w(`?4f`7y $ {  = a @@  7$z$gg >Hk}Q*4DlGKD%fko+ | > ! f! !$!!W!$"!E"!y"!"!"!""" "".""4"#8""3""5""#""""""!"!N"!'"!"i!!\dE 6LmEM- X-D?I]g76 ig?,!Im eQ 5y~!e?h#aFbX5xF(g dvu#~F.o;pj\l(T   @  S  b '  ^M?Ls 78gaA(e<~H ; yj[8n8\ <qG`  " / 3 4 ' y Y@  f:o42h>,#t"Mm^; l)G`&5,P>o7$8 U P T > l K v  j  -  A s |D  GbG: (w)SwolUgc#m+yD~awF cB J k   8 n    / TI tN o k t y A \   ~ r e W N 7 *  &   t R   v[X%y`AbDyER.%=E_nhu)o6m0o/ROFj:S'&^* Q{r@b ",PG&qa0AX*pqu_| nP߆\83+%_!3UV$  Z  q S KV    I   W BJ  F Z    W| K   X !G   cs %1   {S &\j-d'Je w6SFAK,^N41l|LWy${#sUR<lG^EW kqDADBHi(S w=V;Zo9o#m   J M   a C u - ?  S  Y  O  n 3 } =   Ix .  ju/@TG*y\@*ZC96~Y2jd]W^TWX`ioyjQ`EI@:? 1M9L/o)&;9(&)+*=,G$b)vw uYG2tfF])pbBpQ[X&3DR Ix?+&@ Bi?W:LB3J0G[$}|(C/-1:Hg!^rC?s'sP.i'5vZaZ'>1h AW9{oF;^K= uTE& |v9Z(CVwc1\N)}g&r#nUY:7LM`q(82\m{'5[ p:=km LC#]N}F;ge  8  J  d Y b / [ g ] [ # rB4stJV*]TWy"!wMz"m5]b4uCHg:j>aBr ,OMub.Tp7Q_ ,<HVZkmtz~xuisMl6l ZZ<5M*tQE\o . }4`3n&_]-C2b7i%rvp _ n - f S N @  r(  + r QK0l&l}L;``* ]_%)xhM3F.~@M@JueV;V687@8InU-6vmg5Iz^oG6$ &nflxs"4FRs"/S{8Vj:\u-8m@x_-"X+o>AUVdqq y#x#{'y5x;|@bEoA^>N1M,D</e[E,trfolks0PtI)Y{I%m,tW2VW+F DMY0&`nBdP`BcHv,QI^M4}N WPY2q` cm"dy4_KJXAR2WtE J"mQ7e?Jy&e=f9Mh.5APT^^dfm2o8x@hHyLrP|\~ok}s8Bi~.@Vmy&Fe?[L{2@Zm$?DdsAHrv I _e    ) `M {   # Y  E n 9 d   , \ + a [ n l ' 9 \ g  ~ v  b E  =  + "  * / 9 5 9 J K P w M o a P T < l / o  m  x v  w { n { j s v t  %{ 0 1 ? W ] ] i v s ~      # , : > K W V c in ap Vt > 2r w t _ g U H ` = 2 *   s 3 _ l @ 4 h D & f^*x)8 E9WULgX]OU7H*#`1ocp[6\ tdQh>*'/T-Rvi =eBv1w!i4V"`*wYhVLE25')*:?sIs[^|\YMWVR _+XNrry~/n6]Fs ?CiV.pFV RKZV7}%U IO"p:E%mdE6r[ EI @ =a-a$R4{DPXnyKpjmrkpnsg1STa]SwC@?/2/ !,)#@']%0;I_cz6Qs5c!eVQ0rG gnd?t y\DIo ( N  ( o  N. [ {}c\?zzNKfc6\j(l2MV!gLeVVkP3/weQJ1{<~D=w *Jr(dmtw/ZnzZ Y58T* k   x  4 ~ g 7  ~ B  uk  Xu 0c+Sf@n7va{JW69-.'  -:CMb|7Za $#%,1)=LXRYLD>8n ^.kr<(nI"~] rD x9\qvvjlK\ ;w!4{Yd$q\9OX x$NV$HrrqF~.@{n8W_&p2dE'W) 1Vm/L~5*iSbZ~e`XTaMji6kRWD_Kd V~/iU{9fLcV[J6%cLw ck Z4i0[ MOC\Is.:l6Y   *  3 ( . > O A L \ ^ e Y e o } | z    / D  r  4 @ X s = e  " A @ c j  E 5 w d 2 [ T   [ !T9X1|QD0nZ I$}A_q )2Ps]F0pY:o'Cp{B2|i@.ga-|91 H B D D E N I P / i  *@8@C chFRc@c3) rM0yzto :CR`j|)15=?GN:y;t<a0S'3 ze`0y)[)d`Pv#'sXU+#7\Z"\Fwr-XUwYV@3;2[SkW< Pw.rJDA+%=y6i:dANPTuOKUZcn>zpK t$EQxCj @4gOm&Q '=GFl]y_y  &17]URw#/"8,&:8H-TAYZX~`ux>_P=yFp}"d+NUx `3uB:]1,xD^d g-fO9&f_;0mgBF 8C!q4 x  o V V _ H  ( @ g [ =  \Mt]!0P}fy)KilS4bL[sB@  } ?X '  h  Q j% " | * A q  h j  l  T  ]  qW= emE0ru(K7}YzTG! 9Z ,T+yY!AP? I   "V u  ! jh   c. l  n 8 n c  g N q 0 {   : XG bi w     y { ` >    ^ b4  I 2 # > J c ^ &6!yVE'}OEYS`[g m2-HL"#Vu_jWnk&Ik,w';i2\hL6!sid `f#iw0@Wd8nQq; Ly@~7nZ)8o,/sr"x0iUB*th4*kKfK{ +F^wZfGH7sBMJ{2\_o/5G[ewsC'a m\'o= {RR93#&:9N_>j0.dw5X?NjrCG+"*6J q)>4hM2h`u$.0qeJ7  { R 5 = ) q I D q  % ) ` @ a  2 S ` t } i N C  ! t e H 1 %  j F %  _ J  r I %  z I  [ 8 l ;  ` 9 v  @ " Q}/U$wQ*?\?]E%uqSCo5V'ND D571-724,IJU^lk|^<v` ?"qf+Te : Y (  m A  r &  Z e  e  D Y Q    e    H t        W 6    o y) _  V  P G / S  LT  _E  b n WMr :uFq+[wnm(mAbw^ d#8mlC niU5OGGg -0{0l Qv>gO8#poy '67cF hAj2} F ]12{#@qNC}#j6y]@?j*^{#Hq2^q3Jp,KtAd@D_oMJyg l]:d))x:tbhM;K Wc =7_OfS p  [(#   B  y = S  & K L ( P Ru   @  =AI}ag ?`u   ! %,GAXlxo_>, "@LkiI45Sny_8" /BS{X`pJn6'yyotcjKb3Q*7 #      t Wn BS &2 #     Y ! j Q /  e :   X yJ R  w H X  ' [ ) ] % d # u & >  P S YMF6q{(GF^A{3zzO`9o %~t8-@ AoA|mo5[ i`L:^<;O9wIx)u+U$ vL#Mr/.TlfLO:')Y:9d-$!/fMVgNC1eu`6dOs_]WA2 uE$z"W/\" #xKx@;h8(DtRMUr[ Avv!Jo bO' v\\jKv[gXrkM8g19r@k"}M'GZm5HtYSYn%IY5T    { [ < #    5a9 HLY9Q(`c\7  RZNU5 YCtyu{sY6xN)CdSd35no>~|0{oD6j 2 j Z  E 0 g  /Vi ueg5"v p^6cp&){@# d{4O3  5IZ7hEq@ GQnG\,x;jt Q<j.z27WU)+55O3d+p'& }nYp2X#lK; PEwk*$tA]M#ZBK`mpq&6uub!} h)"c.Bmt7`>~ x2f&n@+#K^x'Fd 7 ]puqPwzA/Pf6Oxe-3dJ t$M!~"w2YX)4oh.X/^6^-S6ZRz)Nj$P  :Bvdz .i%G hJ}[Co8w5aOz5V<x$ >Odl#>"`5xNcvu->EPVXZef{bspZfQcA\'[4cCNC=<31.  }(+3DKa }7]c 0 Q ) v V ~  I 7 ~ `  D ( n T  M % O < j  C g : d 3[ ;\} 101*J6H4C7I5<7(+(  uoOO)&  m 9Q  G |  E } 2 6 X  V  b  k  a  gfNM18kr(DVl~4.Lbmm(;BVpmB4lj#3Xstco?5})_{$J6v=jZBf+8& 2M`y'.lG`9y(c:7ovaXr!Axn82_wt\B' pKb= v8Ru #KN jrqz'Q2$8`<:]f G b'`x.CnIliY`Xgx6"eO~C2\0<6eIYt\"k##]Sq;{X(X1 vgFoS J:l S 3  d`E>Fj0X[FRgrq~\d/!o\=s {bG"meLbgt[.qDUOW*Np)4m u J ) _ + n Zl$!nDU% d 9#^3P_ r[)'xW092:IT"rHu/3jn Z\F=4)%tZ;! Sg%C: [    ` | (  F @ { c n Y Q $ L 4   3@ bo zmAc8:];h+w\k^f`_v >Z Eq1rNq ZS U}Ji@meliw -?fj4#l/KKU rjFVXYpZ^RQWIS.Y Bf9MxbP.V4^8EI/["Rq0Sf~r]9}`Ef5| P-j? M.c*a:E o1 ~\Ru1Q"|mY@,& '(D5\3Oo{ <` 6Q9n"^ `V0z fPP&u\^_.lc>xs)q/ _ & y  " cN n  >   C  } $ 3 ? # C F > z N B 5 . 1   B [ d q w x q _ } " x w g \ { ? A %     f * T  V   > F  l d um'!k}-L5y /4\,fu(r- 5D5KS Zuz09`qhJ/<` ` qhE%!wOs0kD8 W^ <,k8Q_bQyJ Z8^f8rc>h<*$lQL;n!oAK+p'e~D+:W*/vh2?37nOB/@9D |s  ? @ t Q % U Q  ' s  + % ? O M e c i u .n Ib ^W tG z3     ~ zp _9 J #  _ } V  Y E y * c  6 Q  5 : )^+92a)x@<\eQ3hn-f c)cD)c.zX3@Dy-Af-S/uH{d\-~ #[_N\=|k9_/r$I5?NSa"x<tT}jwsizcbL7~#qUB-zMrAq :[p=:L:])vL_ lIPJ.Nt|2ftn/|DjC#p4\1p{xs~zhbe`jn8R|=KlhUMd`3JxSekV.UYB*Ba$DO#vrX7+;o$%th9zNn@m   ycU<2$9^jYdw$4e%zt J*o 2%6;W-ZCcOoi~r !4>yuhSGSUL3:_H{0oKbS+@!,?"\WQ)D*qV+vOJ qg15yAY h  f + 4 AyB0}OM-2LU 'Wi =b3AQFWH/d9]] ?`}%5,L9p"C j V 3  w ^ ) 0IL [eH:OMu NLG8 t1tbW@CtUoV]fR\jz -g(g I obW'g\3zx-<p7%3Mra-:HM}_tqupdbQ.9&)&i/J5^Rq2Js%HV{x*-6%>0NP(Y &I n  ^'CA\W n-MtG7LY3h2{mY:+uS}6l%W3*.Jf BIv;{?W|J>>|alCa _| 67Y]82y)rkXo=^ ~TF0oRnlu~Ok2NI k  9  n >  @ ' c A y d s v t ] @ # h  Y +  | ]  p B k  . plA+nmEAZ&a4VK|'m Y@""3 3\w !8+Nbb!` 2IjA  ; sM   :W k  O 0 B  d 1 v0   5 ga   ' "u F r {/[4h+>s[XsAm2W  M    G m j Jx 6)   q ! x C a : Yc . g (  s Qb *   '   |A Y @ #@ 9>u]yC.1ph ]&Y;h=}!|_<>lz ^4;ajr  }~b^;A i>\'j1W p9X2YDbMjEq]2%l[}*c!Y\"&~pbb a+i`zD"L;nTYQ^v gGc%az78>d f(M7}EnWVY`pTSWowVHAn2@yEy{2p  p | s b  S ' ^ V i  ' f&X7aQsJvuvVR-[(h,r"Hh{nh9BYK9~N9O d#`:{"7 G U Z b V O [ 'L:. \:$t\N.}uudfu J1Z]FOqJ|&/AdVwN Q5~rVKoLZ!Wwl1ljq[%H-96i7 ,?P]m=?#zH%y-i/c=`U)`?C Ol,3Af/ l%11>JGdOq[ v"5JL)Q5;e%PnKr-A$ -9R0Yogb3: 656h-]rA]'x`Qy/ x`  9  ]'_V$@$^udC2kGPDa#0DHEE?|1Z8\b0v'NrWA~m#?}M<p4{f\b>y/snT<O/ u f ` ? B $x g T S 8 ,       ~ ^ P 5  z g a F H  %  W  e y / 2 + M  s  | 1 >kB4!\?/?`V`V?c`-'UW02cAWmA-~i>?g>o,YLB  #;Nt(Np8Qy s*b!T25=6296)}%e;m> ]M0 ?lsL#[x'Hh0V8owUJ.pF|wc`Z]5cT^\`qtvl[\LKMP+YHk{Ik/SD7{j\W}V5{PyFq"q~ -Jx/G?ch#6RI{\ x%  .  5 u c G * 8+c$p6aX{",g<by0C`=[] C W  " 0 ? i  f +  P  Mz  j?&e`:8t*y&t&9C}C}U-q[7?b'U#D*>,D?FVS_ay.a?sifO"XoXIrH'41n+ {  ?  K  A }  B r  4 N [ e w ] d e U W D   t 4 p $ 0 E ]ys,R6<C/ZkPD&bAz+pA% gLA3#2n UJF?/Y&~9!j} 2l!h=|M3(Qq&CyL I2Ib2$g&fIZK=S4 {L8,?(Uhkv>ud[i8bCamRN"`.N{#<]bmllfmV\OE9N g; <od& Ju<Fr96vs*uuCznGBx< qczPT:38/%88FPbz3aG{nNIzE;!oj%|MF9#|:\77(AD R `z4< = Q L p c   o - + K  ]9hMtvLlDR/8edg$f7xG e!Cfj!z?[wgqv_z4{ n_IhJ,@oA,ml" p#Orf~>f f / A C  ` S  0q,c)W wXxWgOtYb:s#`b!VFj/|kRH( ycl%VV.(lQH,$kzpo[nOe=U)B6 8`P9tW=^:z)Bz}SU4 EuX=<6Q |@"^$@(%.t~z ziY [ 8 I  ?  *6   L  8[  *  I W  iAf d9v'0'3N>nE;57  :+40kW.Xl@H s@Z(  t w> 4   Y M(  @ U p *  K  w 1 X 0 J     aQ ?'  \P/p] UC<4%) (")&.=BMLXkso&1KS_cl_6+yiV|5W1x^JB-|OQ&`H5\e1QX9l0]jk3pUb,A|0s"6Z_X,sYxcZ|Oq-rr{YF<qz-[62N`=c *~[U4#iU#Z1i[ފ(>߁ݐN ߙn܏/j,ޱޛݐ݁݃݊ݤ< _9ܙބ޵ V^ݢ߱M޻#ߜ.l, R{9Ndk8&uA{XoU:qm87cV  t  + : 2 a { d!C3&UI<0"n`g<_|Ps .Il z|[a>V)5uQc+- qt@C +l2vJ1[(Wxa`wJDJ)>>-)65z?^AMLLU*r$~$)!4@*CQPzav +Xr 7QMqlA[@J[rw {`lIL:fg$Ek#[(EN@ b  % N ]   ; 6 V I  _\ eLa@U(2td>F,zRa(M jH-l} $3:[i9E'OC T$T hzkffV[/a(a +7$OT[oy =_?b ;r7dV0$DGxW)8KQbk|dkWC?rD \~\g{)4BKJ/lF =)io3E`x+Cy 'x%MZ]/v X:z@[U~ND-:h ^d[MG\jz_HH;GoFp8fs=)Vm8 r)x:FGWv(  9 9 s I & X:~1W O[x<Jiw2-z32n!D_00jZ}Jt8FZ-eHv$:NRp_scdq=qCn$fh`YV7iY' tBt"J%M`!Q}i,&:r~TF{4DkK}N W-7EK O  NL f  &  R ' w P   ('N;PSwP n4V}p"@NlDTCbh!P9k 'NuoL;p4N!^?k$[>)pAl.FY^-' s8V$ctS4(.n.ecHAdW b@nT5RSCy0M hEU V^I_5p~*>{(j&8iV4w1Q-|>rOp57& ~aJ/, ?Q!h'߈L߭Jx-iߙfk(Y2oyBh7k&>co0j)+l-A{RP^[1<IZ%l-L[A8>rH+v6  i  L P   ` d H - l  ' k3 a y     : I d* `F lK qa k        .Ry%?*[du+t&]x )Kj<SMD D_X?)&I .BT  qb!!JY""% 8# # $S!u$!$"(%M"{%"%"&#R&V#&~#&#&#'#%'$O'!$T' $j'-$^' $^'$^'$&'#'#'#&y#&R#m&#,&"%"%="J%!$!$:!+$ #~ D# "C".!B!-  1z 1Skv'&h}bGf.x&j  ?  I 7 e l p Li</kGRw?f3\,c"a5y!h?x g`-Ys`cQ06`Bjb8v6Q\,*Y0\[XbC=x8YINFuO;y e:?`l7;iq=:^zRyXsRTi&XYD(o;V_`]RE)uZ9hk)-J9X~PM1|%7lQu"oI  C 4 r # C \  X " D  n w : " M : `n"Z5f*Vt07rLl-`GTdOd,gf_J7Ik`=bX%w|9-J=kN@ lxOLE$5.=lRr}[&aE Jt4ZJZ&ޫޔߚ{k`S^+FG 33.;PMoy݌ި#B_ 6[އ"F/Yߒ,oY1%uv \eEM6O0U'S{(FmBjJ^X=V#WLq1H# *  ^ r 0 3 I { D T  _ D # y  w.=>NBVB{b ;^ru7a(#Uul4x6LcCjuEBnQR :[  1!&!x!G""Z#U##H#T$$$ $k 8% % %5!%!@&!&!&B"&s"&"3'"N' #s'5#'h#'#'#'#'#'#' $'$' $~'!$c' $F'$ '#&#&#c&~#&U#%&#%"5%"$G"]$!#!t#9!" b"O !E!R 5<z:+KtG-%c2I+*  ]/byFR$+jaMw-s*g%b(py-F]}G?v24f.fCt!{.L'o[GQNHa'Nq;zWY &ra@\ SyrNn?cG"yC*Vy)n;)^qGCn'm20\k 0(6FLRS\[PQYqFVD+5 0 @p2lD,o,SgEkrL~"p3{ N/Of.p/c1z D]Bn+`6  (=P1sQo0 piZ`&7tE9y1s(I[[$zM0&fM7 `B  t E |Ra?e>>[V\2',Xm,^!k )HaccZG1k0 |4a _vSzx+o&>QK0Sy^$vauWbE }v ; l  P  N | ] O Z * I  0 $ - ,  9 G P d  v + E S # L  t V   I Q j g.]:{H)Op"TywhE!YX(  ' c d  L  n  ] > n  7b   9EyS#Qm \,e/JVMdA\^.oadx(e G+l*{H%G m"Br5gm!b*J {^7: mpXG3+ snL`"z>F|cDns^F_zA Fxpz3RwL)W,KTd| '1)' |w^\R_<=2|8mvN($TUh3")j3:X4#=k-SRd!},X)YgDL1 POrviQLG`=G>/?7 .07&5B6PHLbTds #0Vv 8 F;h\w;GEWn~^NDiH`._ :7v[(@S0vl3(hM6VifE R  T /   ] 9 ~  R  = r 5 ~     4 8 l F O j h n m 6 i ; ] R O f Q s ; { $ { ~ j [ a 5 M  8 0  a  Q R % e  NU7Oed&!|FOs VJaa\Oc~_<`k~0R<`]E;-Hdm1w? V.N,yU?F96o@E> Gwex!$RDk1 D#w\]Cw5 c/  F & W 4 : 5 . % a a   Tr/Qt|  (  |P^+Qa Ds  s  Q * u , +    `wNP{8[ ' vsnYc?V4^6dDiX4?0R FZ2d A}~|zy}'Fr N~Y(BwpB^6AG,_+tqXo8<p=|1)_U'A\jvhFz;jYDW*Nql:3hD mz2#F 9QXo_3q.}DM mI Mz^kIl)t s @v)?`Lo@C#?pL9ix4sJ%R\C%=jr5> [ .  g u + 4 n S  Ie  bkm`j@=n g sH}Lx8T1ZOqar{sm]M4~^O7>aSS;z F 0R_p. y H  R   :p e0G-Y\icI 7d#*ezSvKu]{=Cg8?d,5JX 1c5sh]L9<@FR:aTr;b"8ce)LqWA8 Fc{C2kC;|a1\+M'hS !'-?GIL]OoKoQSU?A8! vV&}v;pN:/u6D_1x$1Z{ a9x)yMc6g'FL Pb; X%Z4jkWh6X RYWX`x}q``[Z_YOTrfqw.V"2Jzu<L}SF/m( {&~'0UUtc4E.zVB6vcK> ,pO  (  z  s p 4 R 4 c & }  E6c:!o ^ O1| E~"R*ERp<VgutaP1vdX0wLix5W#v1s5s /d`2 _c96   U e4 .  i f M B 3  _ G /  c d W D D 7 : " - %     &   ,  ' # (  ) %       c F t - V  0   ] x = J    g o* <kt+FBA<|&,X]'.T:rE05J1f m(cQ?a%zv'fOKrOJ'STh -Dd'Thtg8';b8R+uhL>8*/:-Y5;Yf$\17n`Sh&qp*~c3S9 |i)epBmo.[ ` 8(8hwCu >a!/,~,[3J#9 saUD2-qP`!RBkC% peI3j!P0nrfchwU}a\jx~,Mu+Y.|l%nF-.' b8#gHqQ-}Wj2N Vf/Jkz Abie@`>vG+h u NP -  N  } aH & T g 8 q &  T ^$   Z n ?  Z  h >l ( u.h2}(,c:YBvC%[Y=!rOSX%XQ s6[GI?):{|v!_~!8o*=Bv?TVR3PqghDpio.&}T.XL @a ^z/ Xf19ppEF)4}wyfrty FWyr.!sD<9m `'xIEW kqSEW OVY+o wY?0DRpb>\CX;!y>E^P[FF;q+z 41qRawFr!Oe!?}Nzbw}\cTDMGDKGI^[gz%29@Z]m xGjU~5L+vuJKjbH,h;   L) u   G S ) 3 n r   a < _  : u  92P\#xUv> m26Qch  &0sK\ nX5n 9e&2<RUdapz{^2}JnfW{A02! 3rwED,i u4- +I m 5   !o f ^  A 5  )]  u  | h }UwCg@M(1 #,_-1:%B pspXP_m.')V9W}Hk mZN)> .!$*;Rl6}0T3"F~y7.s^;8TpG9t9!EeM7O+nN%$^\(>&Q4lRUCiU`W@Q*G C2 7t`*c.J51;-I"x>c|7Xc3! FkfH0%H O+S.<:OQVg-8 jcZXV_o)H{ @bSf*vFfO hlp7.e<= fnS:6aDmM F\hrd_?c0xT*L r&q"cORDlc=\;q  6 2 l I U   M-hDa|]B+l]luCD5">j,YZYJf}mfXEVIUT`jqwwwty.Ot #N l+av&Kc 5:\r{7Rs  iT3}hJx*N& p>W(8Wx5] }Hy<zc_)5_F#n]H2"Cn"a Y1>=ax*%5l3:;2:2|IsAZ6-2uB=vU4yi5,rW("QgX/'Zn(W!f)cr2'u0 P ? 7 i      H  e +X%'/(*I&b%hi[}Cb"(;Z9I -Iar9 ` q me^5@ eUM/z[=KMGh3fgW"y)|h G M   o L  Q S6Y='^|-dvc\!SQZk@}*?W_X} k(}8D{KbG.#w ^Z@@>*63:DNZx&=Q] ( L -  F}   3e  .E}&AH@ WVNuZRtKLU/KM`{  #?EzjO\J(e*RRR  *g   v } 1 y R    @*\% ?K!U$CIe"? qED`T.&vAh/UzpM1Sy%Hrq&zw&XartR)d0C=B ' l ` 8  r i ' NR(2Qa /\Y#m>^KL&{{:K/Y+8<1OEo yA+b^9*}f]NNK:E(F'KT u5Faz 4kK>yH SBQD P M ) 8 3 + Q w$TW5vc(fJ;h3aw  }o!!OU"" #a##% $ I$ {$ !$G!$s!%!:%!:%"K%"Z%;"]%V"V%k"D%r"C%u"'%s" %m"$m"$Q"$G"d$*"+$"#!#!W#! #!"O!\"! " ! A! N s  6H Op0vbvF.~F8bv7>|1C;m?z@u@ lN/"L(Z,T u4'z/.+93_F956:$ HU  k? C    ~J 8 {  Z 9 kZ  lA  o\  y  w  \ }2u adJn/Lt_H, ,qTD};fR"#OmvL.OUiW+wF+H6HC&Zs!?T߅#{|&1ݏtA6}߬EߒsTܭ@܂3T"8# ))3ܯTܜS܏sܐݔyݵ܄܇݉+ݤYݥݟGކ$AhhߚެP"ߩbQߢVL$ct{i)!kB+dVx,lx<=%PJdLgM sCEr(d.dQuClH!x*OnW$j!DR yGGK>>a-ti Z*p]Hdc=G%q9mm!Wf"{=0Mk?$ v   g  % t  ~ E   ! B j lPVSe<oJJQm|1ET'`x67K w !N"8 " #a!J$!$x"%"&#& $?'$'%D(%(%P)[&)&1*5'*'+'c+?(+(,(^,,),o),)-)Y-*s-M*-]*-*-*-*-*-*-*-*-*~-*Q-*+-t*,W*,+*V,),)+)I+C)*(*(*O()')'(*''&`'/&&%&,%m%$$($$~#H#""C"!!! 4 8 cz&\u3GKg]q  {  q z zuknjpcgOwDw61y, 13VKby4l$ WVwe^N\sfI[[tBK}dqsk &PCe4X*=qJ{ :*^N~a.HTUorrtea`T4a+<c`)8qHa(J{/amVB9}]a8Jk& wi4},ߥwPW'f2޴ݳݸݮ|dlyt2fM- }j@.~aE }W7t; yP\':[F{gHm4l<V![/ z R q  !    rv ;PeQvcUQ?> P!eX:t,g U2(r kSVGbV2k2qo| pjKq1GE$FooBN0~A߾ߦl߶H߰(߹%߯޻޾ ?KW5ߋLߘs߽4E_i}a@bqJCu/ '$k!w*gr $[~(W)b:9;8b4Q4V'DrTbbKu2q9 L[$(gS6sc<1 avO@+*vh Fy)m-AM jL<MV0=\\J.   w^  J   z:  Q F  MR  " # g I  =q|A,_f/$|@lBd8yQk)x)'w_-5*<`PNfrHz9g1 4\'pPSal{-Nhwuq$]2LZ=z)+T2:B^]cfgl,qsk[LK8"e}?U^ n5j[T[6k2_Af|! @ ; | A ^ ; N - ( ` xAYwAU0,qvTQ:C$ j|j\SK??+5/#-;Mh </Eacn vD5zg!Q|J4VvC|3izD[0~T.sU8unMI}7b1:.(#0'.(L;3:9JSmYWu8~wP+9E\km}I226nPcuC|N $Kq !)B\Ep'eW+  | K  b 2  ] tKc7[7e` L?ltD?we I8^-x,c`/^e+ jDO2GVQW SN-A-u{J[2MrsK)m7>$wxPQ$`Gm<+\;I9HJnQ!1t<bi"Z Ym7;ru=@0}V4     V " F 5  ? } X f r= $;YQ$ONUBZ/ NY0 m\.bf)4CA@UOiTwTq:m6esZC&k+lnF3NYMy#G<+4m(^pIr KcZv6j 5 Q o 5 `  u > z  K    e z W = t t  c h Q q n ` o d | t q k v u _ m J s 5 [ 9 L  H < *     ` ?f 6    l@ 5 i?Ua Z+/3'm!n8[D8P U[jWUeAv>Uk/S4}}'X 8dIx!q;fT>4v T()")/>Qb|wsfhmr*uUxUi+#pqqg\WS_WW[Tl`x}2E)G^fpx1U 8n3C/cp Apa2UweO^3zcriNY/}A   ] R  4 y > z , a  5  O A h Y q m r J 6 [ E 3   4 ~ < . yt~7-gphPeni@qsl5r\z )'XF >cTnu7=}Sh5> ! Ca 3O3s;` e9u6TiGB*= ;}x7T+7w eR4zn3_v9 p D q  : U   / E j w | y  z   } w Pn VL 8+     E } M3nuLR~q-FEt=b qf,*Fd,WaK;W_2 zQ_Hr&Z0 sy\pKJ7B,1, $7,MT_f~}wxxuuyw~7x>wN}h{m~~xy}}{z{z~zzwwriv}p|rvqwfrvhmWfBn>mfsrfqqrfnrokk]r9~%rfqzssv|`xS3w]T2/#3LSn/HPu =gB)@Mzl0o#9GqhiS<_1 c#  e zeSTN  ( >  E A  ` V  . ' o R h   - ` j y      zk UF 8(  x @ D n  M  o   4L  } F 2ERQtXI`lu&?oJ!XIc]G* ],}dQ2y`/ kfI}Gh?e+WJ<( sW,"~wz]_T&9 p( {Sl:&P{PE=vV~,kUJC33z1f2_(mK TV._kH2k-w Q  F * ? U l w  A ]  m ( . 1 4 4 6 % .   { V G & n I  x 5 ^ $ ? kV>FI2^2n*A3mLm1 J#[1; K9Wpr=68lI;o)ILw'4orFi,VJ:,516>V^xAT4@Vz}: C!t$bkpS~@,ovnTyJ-]Nzx(Tk ia}9H )Wh5Rt6w'b&w/S%zo4`v>tZv/4o'piC?}+d'N#2(?B\k9YyD=_{VU#xvPJAR}-Js_'eLr8"D=h^ABjt)1cv>r)Z*zQ%x=&wR8pM4zdVA/zY I *#}lV>,xiI!\<|vaVO3L=-(Y,dK)koaXnJUE?D)<;:D?J!y()zf$L*}w"(]i Z ?4.U]+=ud)l={b$Ly ) b  K y  3 g < r      = * c D R ] a u {  v $ ; z P P m j o ` m f V k K p D m  Z  M ? 0   X 7  h y 3 L   zr0.{W?a=(\>eY%X;vI6mAjH%iJ6fa:* frQ^3E3!I(\7aRp!/Rbwr;j1\w 9~%G%fM.$gFw(Uq*D`8g]~~fBkP?)GZ#R< Omh#84iV3}7sMu(@ u}LdM@$ kfVQXRQ_i 4Mf'zdnAuDna8P]{L 1HFbqNy","<9OaL[[nchhha]O KI20& pQPC. }qw\[TLBB1+ /!!(/B@>@@CD>81.|#[XT-%}\~Lf>+ rS _IqDvc-TY,U$[b,6|iK79&e[XAD%+,=Z g7IeG\AuGr2qOF$f5|I3s5k_BsF.!xZ9BZ] !>0HTiOvgsx~{z|nbxQk>p@n\'m fhYUl[d]`jmqr||'2.JHdRs~#R9oNf4[?Kb/|Pr>R%z",1.1--)$t^7tW;X-rLw? ^lA i0^+w=j;?b+= WPhf.= ],g@![0mIg(I So#K& oCU+ImZm5tRH({? s_A+7|^b12 [V)4n:XAo,EvEh\S@f&& c:~``4*, !?Bg8zD^$Px-aPVCE; iD=_: v^&T04D!RjtnUn, S < k   P ' s U  W 6  F*k )8@Q7L2QCR<?:6+)h[-!   sQ F Z B   p g   ^ s  L t ' 7 }1x"3c\h"bOzfS20yjRH6/+-.(89H^Y7{Wm/N4Edr-F`u4EAMLY]\GL@i:N7b`!4t2W.QM ov*i zVcLGF9S*6pBbQRd"\Ib HJVr@QMwxRG(Xh#7 f0 T'p7hFF ;h@*xG=0 (CfD?fj7sD}0lC.3yNK|1rW+g"B|/cEn%Ot2+kK*h::Ib(L7V>x`fnxmvqxmibEV0F;g:{\_D!W.g`A+H~E g8#Im>x-PEFK -gPL4#!#7 \-'!b4  1 W ,  @ !  l Z  !;lJI Y j*=[M,q.42B+Z/*3 qW~-Z9 _|,7 sl$@ 8tA(v"vCQC|By#   i [ + [  ` n  8 k  q < V r A C   T u  =  fBsGw:t Jn5v'U(Ec}*R]|BEmTHXY_hb|,i1f9-QXq+E Rq:]&Sb'E*e`6 "3:JYh~  k6ia6$X(~A`zP9"c'GR=CUmO@W%|pxbYNN/;02.  &%&/JJXq+:J[s)H}7ELy~^0[V#+]MC!UkzY2]1\>g6$Vez   % 5C Yd      6 % ^ X  P  a  L  U  ` G h  K z a)N<j .Wm2Hjya=n"V rAu.En " a  : n  5 c { % C T q  4 NW$)U[)/jaRJG<AE[R}T0~tQE cp9G, }]pN_B[:D/9!2 !   go\GG)-qredLT=:"/ q`uC`#@ #svFE,'p@M,k(zVl,OcvE)kw;uu6%e1z:6OD|I>P`!}8Us3g]+gBkR?@)7t.~9KPb-U?}@C}_(zu9Ho"_MN kH#nN9:wwXt,B006$Gu?R.7urTBN  e = p Y W Y > Y Vu)5|`"[_ ;'gs* \}3I8TCKE4+}ZJ-rNz/LusAMF qCNzO;- E i @ a # ^ =  b 1 z f C z # b  O 1 $   { v p o n b \  \  j + c 1 j G j U l e t w x y |  2 9 Y `   + 1 D  P  i j  v   k h ] F p A h , W  E 5 ( b D # n X /  i U 4   { c ?x R )  {`tCCh[26! [1bH$P!Rx0]1${C \R6S}29B]0l6s&8rwoNdHC{`)_!DFlz !bbD&Gd?FP0w=3_u FqAp:} Fn~F`*:yijb^=X7C0-1  +.AJVn{,Bdt+=e(:!TIbr+k PqQ?"tjIb,["At Bv*dT|`ovolI|$xFY-y^ Bd8)hRn. B  9 A V u P  M G < u 1v q|`4GOjNu XBt/a8X}4LgtrR?{Sm)mLH!\ .L i:R&|fP,^\[k4u<m![ Fz 0  \ F n  W  m  X  W  i  S  a 9 {~ _;;U"y*uXmki{)}MK ~QT4^-vk^ZKCGWV$f5Rj+#ZU+bT{g%E4n'SG AAj/c -BB.QabsmafTA<|}[LJAPN3!@$aUiS8(se^,BS moC0aU@6vp~6>il pm-r2< )zQ5 6w'Rn ? E^Q? f#u[N)se:K le=5u @MIL!!Z;4 ju"57o:Nqa"jNoo(w!%u;)K%uV h\_wEn f i L 2 p , u . j  8  ? t - b ' D h > a |    0?#I-I+F3P/?.8(7'      ` sL G/ 5  { R w > V  :  x C   W  [ } ' W # m l S E 2    [  _6W#pRW0% w1vJ)I\L- KwU%F `/{kO*au%:m'd*8G{>X#qZnAQ0k^E3.  'Ok$DR+]d^.J;"A16@UUja i5~mFZ+G[}G`nz # L. `( r# %   zff7S4;zJQ0aUA I O x/txiZWT2Wo YZiM( S`=}-Eu+G^0 |X<(z"i I< 96`n!j>luf]XL>1S)` .F`{s^V5 v\> s}XvEh%` X_W_fou|a;4# !Gx)c 'cKfC'A\K jqeG"Gn,L+ kphJY,LcL!8@E+C7a=T_;Qi@: Z> up    # K j                 { o _ O =      z  p g i c fo Rh XO WJ [D O9 U, U, T U S N X JMMR]RGPOLXLMGXRGWOQLX~YtV`r_cLk?|:v/&" / D U    + O XD io    @ & | R } F }  N M  L 0 f  e R  9 9{  Ve;{q D!K@j-5Yi6}Pi~h^tLy)YF m/MNr(=>cA X ( B  e  m f  cF2s1`B1`>dOJr~42j[@ P;8 [ A n      %" Q& o9 F ; V #V Ub g s | v Py    & g  I % ^ & S  3 B a n p v o W O t > q ! \  3  O 7 >    g  w ? 6   A _'@i7.:t8@ NW5G \x>oY UFW[Wn x0`R0re(OsqQHM  e 0 $ h ) ; <  T n ]*  ` DQCI!~$e:5/h[h;Odl~urS\:J*PPk _ 0 +O  BI  9:   }p 8 ?~   Ej  G4f!_5xG##u^QPO]'$~Ed@1,8#;o][N0_$zRT [e5 m)tmR.t;V$@H 61*-GQ'o5|JPd'Q 6 ZO O.j#x = ok>ly!_GBqAGOmeF"6]9nmMJK>.- ~1d:r/dUF5A{#SbkE#unH'7P/^Yfguod `R">/,#3#Rbl*DL3|_9mA$D)6Gt$f"{Vy!'z>>z9|\qYKR%QI\h~7j&-R3=,kp TXYlj= W~;-. % =  d+  z x   K "  .  "'3K]kfb/k Q @:HEH>#f"I q"c0 G `aeW Tp#22s&H   " i r  H C - 2 n k   @f zNFE|>>s5 }5&co)__O.:]|4tuZf H\KbCKMNa2yTJ!r)rXU{9W"( jS 76+-APVp 1Ifq gJu+UBn9Mp.n;y+i+H Xcj/.;NXi&{(e(}KH7 zsZJQN\iu!-UpWa'xj#nO%9r*e3t/Q5nS;-hKG+ ~a 6   X ( L} ?fI9Q'G!ul38x?`bS;gLp3q  `G sB|;cS# J `  B I B 9 Y  :  O e xoU>,  yNRpFf@mEdJh\d\rqV'D_Uy ]  ) I 0 y f  g  B j P  H ! P  T   QG q  A  ? 9t    wFwP<0mk?ioH5|Y)M,a>\xuQX6n,Z."\usp I3  & S  W * S O  % f/+,-4`!h ^D# )9CIUabKBp@EXmOߐ0܄Cs)ڔ by1tݧׅܧ#<۸gpڼ}ڍ=:ӢٿyٲRٛ>ٟ"ٞ%٢ٿ)/PAٗiv"ժe%*yd֦Q(B`۳د7IGڡmPۣݜ+M޽_"qߔ=QjEYA /OrfN8T2@<2(;(4{H[NGW"h0?T8ddL`>+Z&]D-:s,Sgh!+m]! *g * m  ^ P 3 4  2 < k z)[f~3q"$Ptm4q]jWHxD2z]K Y7<Q`dl*lq# v] p k ` K!PK!)d!!!!!!""d9"HF"0M"Y"u"j"r"t"[d"Cm"Y"\"J"("%"s"<!! !!x!S!U*!&   r ? a 8FKx&|:J *al0:ebH OO =rtZA=d  e " 6 8  0 : R ; ,,f%P80&%&'2%AEQmtB.ZQ =u8 ?cF6k3wf>]U+A<0;!  &1CWW|xhTIxW9"z qJ4~kM<#y ef;;neZJCfsBq0VR@ 4 u!L!z"4 " ^# #U!$!a$!$""$O"%y"G%"f%"%"%"%"j%"b%">%T"%/"$!$!p$!$$6!# p# #4 "<"q!9! * (>Ya:YPeB=%P nt@z ~ q 9 | i - N Y K @  i a* (qo)EqHz]H3o8j?}EtmZ9d.+s+n3i "xEFj>1nOy(n61eB]U p+s1 [ {AlF}}hULB6# *5B^s#$:3'JNZdXs`ehlndmb^-L=<6(Vb[]nrf^aTgVD>B.}u = Ti   ' i( Q s 5 w   ?  x 5 M o 4 | r % V    $ A D X P _ h / ]  > h ~' # ' : < C J V J [ R E F = jA P" &  u B \ 9 L  y ' ^ * H T `   nV ', `t8u<@AgBuE$WB#zY<7  ~z $;=I]t 4Uj~$5FRe<oEbptmH|7f'>,^x9E_RsUUv0&3 (z}doQ\c@]}3p~"~^%J9]Lm:9 ]<wqupix^LJFDZ%]Jw0n*UR \fQlcM6>~=j=`3IK>M:T!OXPaAI  s\&q+x _;rJr5doTpDQ UQ2#),m/bT0yUz7.Ffe@/4S,-5V/KH |ZT"*zbC4' D!c-)@Pos m,?t s/i}i&ql1rY!9B(b:N h &#" z&cD t l ^ 8 /  J o  N w * * o q  A ; }  -+Y['L4u7Zgcp/:wWlmuc]M6%}b<  | gm Y: 5    l I V )   o bA "   a n N , ^   7 w Z A P    r    ? kM>R-|*]%sj^:I?/T&mAvbE.^4[7z\|0Q`va9EQyM+j^$,m?1D\=:x(w%iqkPVJdLR*\^y7Dv!)sCj__5yN!5RwJ"xA/c_09cU{+t_Y>F'#[h*i(#FzhAp*Lar1{CdXau[vOcAM ; ! W\@c ln#at2IU4 } kBo *Tn^OdV=R_t{(f #bHoWN[`>kCRRGh&0X_dR x#Pz%f]2  V  W c % ! | E  T\&FEZ$V}  pPB* wW&_FV     M    J    J  f ;  1 U z a b E =6 5  $ D% - 6 5 \I i  W   <  M .m ~   `!Iy*t1\W8l4L_uz8b~yom,NE9g)h~t1s$<4 .+7[!&J |#+pI ep@Fx C !  ].  + K 3 w    n ~ 6 J i] m3ud21|^;oDx  5Y (#@6~AEWcYy U5T-0h yni݁xݥާTOܱyݑA_2 ۿ ۶ۦ-۴NjܠB#vܾ7^ި'(ߤޛ1ߙe. el-WV=X &xf<ffWCz2_+ Km =-@ )CC:,pJZy=\luoeK/X;A<wcdW%d*OdJ#xIHSa_IPmxklT EyBZ|{0h`M8lT/66"<:pW;'g;cAo] o&3~1>3b$]r BG L M u y  #  2 pCU@$-&f $~yR3#0V'z a:{nIxD-`0y2ZGj"A d.@et&#$$%#y\O1X~)^ Gj'hBS$_o1<s.g=i.a+W DVv]/P_ `WmyGmWgNlJR t 0 6 g  E 2 ] Y l u _  T:2;vD=4^*u\_EVn:,C\45%pqFZ SP xg; 7ycpVWfc&\G01>ߐIqlq9 0i]V J^>1,,`7R`bNL.K-{Mn&D|RX]Un8bXA\!p>3r}14sd=o Ai-d @J|rB5_ /Z , D+XJog '+*56I8MCRRfMhNoLqQy>oN|G{1~D.++}}&@[~Fo(Sr_98x|.LG1!   I   {   l  l P s w   \ FNc\>|g%nn%enZ\3Fjs !!/'""D(##T '$ $K!%!s%0"%";&"&L#&#*'$k';$'$'$($((5%Q(a%e(%v(%m(%i(%c(%K(%.(%(%'%'%d'`%')%&$R&$&t$%*$%#$t#$ #r#"",":"!!$!  Gay].]{sO   bh \ . 9   a.r=q;$yf?&G GIj ioYb{_>eL/m=]6,wP;3&6$E.b0xDSo"bV[ ZF,:|5s&Bh^z &d6p0l0l0W(_|#G*eAJ@6-lG^&~/EVIiP&12Y @vi/g/Q i  u / I o   ()@CCZWcvo~3>b2f)YXc,X{m{MCC/R)t=jJ ߷\v"ލ\ߑ&qD:޽ ަޟޜޗޯ,ޮJjޓߺ+\5߁x߿ Bm6= dD&HaIFep8.*zQHns7F&q=W+b^`$ZD LP;1]"p|T]F|)tEgx1P|xv[DUZZ;h "pw'Kn jV(2|BkmZ8Mt>9~AFtV,}}>M[lS>/%zZM;"!8XpQ%0nbh=aKu=KaDyZ ;C|k,c5<JPMM; 1" {Ds1Mz,>(u]u- ~nYCkv o~ G  | t M D y .=k TL~EJ} YRA.9-WHxdaPP;HMlhx!J\-G->_ai2QvLU()QdVkH:>+rVD  )5>FP i4qJiR(NXK$t2+Q94YfPS bg?K%-j@4d5Zo,A_4?jm*xhmb)dQ_'\ti6kWf mtZ,k5j\4{C,b m 3 ?   ; N r I  % ^ * x q " Q % , 8 4 G / ": 7+ : F F & &  r L   u ? X  f ) G  @ b ' 5  1y   @> qC @ ?#,N.f<CBU{F -dU3V }'\z.2bJByy=d,;\|En:yM@sIMpF $  M { F  y % y > Q pu2s.j :'E 6<<w.7?t"Vgy^Pf,1Z@5-GGP0I[*YH-;D`P\ _ m 3 q ? vd xw jmifcc^aj1tDr\{:dRw%n Rx"7k0qA@k +s?(U}[AB4t="6:ZIh>l h-tkqF1eF4"v(fK)~ umKa 8i rh2S&zKB~&:A_l 2DS`vxxwk~yjsaRZ=A4sCfbU1$g%aM7gydJ-ryoV -]{XT$WhV= j_yn2Ai;:po` gk] aw/K>C2.|m@v&{GV( g9`      s?vH vYbO-BE?//6 _vA@yeDilS "a baXpS5:PZ`7s2q +eV oR'fg4% x|XbMn-\r !"U };|Fym R v6d? {R@5A0RV%(m~^zTqMzI{R e/r9zKU VY[nIR($V D  q ;  l G r ' Z  ;  K  G , [ , S 5 M = E 4 9 ' o k : D p u    ml   08 =LGE*7ucO#h)y%j1AW|vl8ezfn?c+k1'|V-ci*pIO9NZo:dm>ff3e,i6`-H6Pb;UwK%f/yiFO*x1`, V  c A  o   ) . 0 C ,o9U%2^h*?GX_WN/ Q*aS#Re-)T  _ d l  i 9 [ d J  < 0 #Tkz`17Ro7_4j-GQ 'uhkx'a ]/u$mUHr-tR/d=`@ {r_P=9.)##05M8XUhvL)s9n`0kWJB );inJu Z l#$m},M;%xK`ULK7V1D1!l*:#F pz   Z A k 3    J # 4 = 1 C [ V N Y H  O , F I % j ( }  \ + g ~ : x  a ? , ^ )   ck 2   E b $ t.i,Z Y/4f%V[sa4gKEj8n*g%zJoF~lTFAsJ}(t K=-s[H6 0}=|Tlgtyyjxyu8Wi ?Vpx1*9IS]g_tushsmgLy>n.P8 rPM*#v6Ai8LJc %~R3Eh-e7wY:~&Q+a~QN;'=.R/W<Q?oM v Y w f e v i{mjgUPE1)nt$1}&=<d#d.8y^"KVZ_E"j(e E74 {P#m*;5aH_b`a[F|-  p a Y Y D:m8GrE!$BvQ+](.B B*@( [IUg8+Z/ 0`8 |C}c*o?4t|RM2MSR CN|CJ'xl8'dQ{ 7?    cY   E Z  ?  @ 6 }   * t \ e  ?B n  S @FEnTfptx2jOo_huYS:'lU|FM"   e Q&    fH ( B 1 K \  C s  y  t K cOGd4 uR9vf/>l~ 7Lz%&j| jm*!vD;rlO1vOM/%3U %?gJx7H]r VP|~BIns$+NZ:$W;pJUekpqz|~oi`QY5#jT>bW0dFpD"S %KZE _%{od'E j,ia2>hidE f)e5FnRL&erTM.% ruZcCWEF1&+.$&2;MTjv;"cAgxL{K?id;Hh@A6ho8M ?wS^E?GJ=GaDnp}51lBN_Vp  P  p '  5  ? B p W  c0  be [/ZVT49rAE$fc"VV7e{DrE Di/VAx5u~S6|bRBz  & S 3 | ^ x  &? _e"{3EVk{1Qw(Y1t=JvTs'4!)d= i-6wAygjh~?@fs[bww\IV;_G{lLC=>Di&\i2@Vh-HM `^'d <I?  o    ~ o , ]  #fWG#r;SgoxqnXHuE )p~JD  ^? P V : ? h  0 8 z  _ Z.:^#Gz;ICx@A knIL& yoWUZPBNW`jv+^k/?\Jyly"Iu/:I&`Ba^j~uyzdYK(rij,&ZGz:0G;s. _5 F7:[6_5!LI=bAhN*\No~@XS p*6iyMj*UI.2&.HNBfla fc-SvNHd}!es?#$M([IL.s"m0=u4=<C ` ? S N C =   k C  h ]9\y2:^S_ULo<`+ mcL p $ % d e   . 3 < E D D 0:]B*qU)wy1J/uJ: d7o#rx +WM c*NX)lE.G W7p:=~ E~K7r8P&tfQFS]hvI Jn'RGq  S`  F &  E  V&  CC(6FZ'vj2er}2`1S|QJd.~KZ4 4tT4^s( g  3 o {  l Y  _^  t M u  d 7 X  4  v$Lh _Ji6l"S[C0u8=/rG>loJ7j-8f] 0SqcF ] plbGD1^%<@Np\@pcFEwB  OPb75B}jL$ZJj(m'R={20gu(2tp91deW \ ETb4nv!;cWO$S?s~2SVw<9hO ULjC~%E-zKNXcb>TgUmWzG$sZAf< ^c!&NTNp{ p(Fohl\u)6s)ZvU]o9X V{)qZOGN_HfCp T:'\F 1}~v c@Nm7v  s b h 7 +  F * s # d  > IA `z q   y o E 6  .  v 0  W ? V ( y  3 W  LbPr7/Tj{00zn13SW+aN4&z+{.v?]o7PoK>RzvZ 8+0 Z (  2 b L N & `Y[ a#Z+DsN(}NX~ >k54FHJ=!t I }DZNTfuZu$%t. v  O I - ZqK{$Cc5;E\ grHlu#V+)OXn^0dD5[F&x^'ye"Dxyx{hyS?FK)YclS)4ca$[`A94~[?(vV*gCs[yOF) j4zI"D}(3SUa=( 1f  4 o * w  / H O C 4 & x S  W  A f  =Zv}uGJ<4TVi @znYiK*>}Ft#NA&FKkl44Cs[4 )c0RqN|<[*^dXLbAW_vr,)\\"~8|FKwS^%BzT"-D  l >  s ( +olF ,t6-60~DSBEn 9x ?Rfr7/907v{dN=! U=Uk8;}_M#]w@Oi*;[%AX?.OvV) o 9 g b V ' @    l D  s  a H K >  | O  w K \ " 0   iV $   EA VAF9KWM{7$"I*3^0x&)|<Gh)3sMo{mI!@GZ?aa'2Z~5Z5;Jd~=c'2)385(=K4s+1+. 1De6Giomre`]H*VESc]{Ybxy4L m#RtX%F_.wv+=Mc+qfx-|rdPnjK@#~ T 1`P+$IWm8{sy" n ^ b  =7  |   O C \ f j  TrW0+<KXiso:s|yt_&TNCi#wQ   {R W C  h , x ? y ? o ;  J Q   dj B  f g c D p   v 4   `    ^ 4  t<_X; . l   ' [   2 { / @ co   h H ~   2, o  Y <   ( F  4 x  <@cS tx)<^gtO r >)sy^:Y%ek} *~QxjkP/ =SY+7P,Np48T8*~^Z   1  ? @ D R Pe Qv 7l>mYI0n:yPTY'ei9?{;cOw7S*1!!*;YcޛGH T'biXGo/ZQvXsz0[<GV$ZN o O D C 0 0 s Y B%W5Q.W k60mJ1  : 6! !w!$"!"t"#"i#[###$,$t$$$$%R%Q%%%%%'&%W& &&?&&O&&z&'&5'&['&q'&'&'&'&'&'&'x&'\&'R&'1&t' &`'%P'%+'% 'f%&:%& %&$&$Z&c$6&-$%#%#%s#k%+#3%"$"$M"o$!5$!#c!#!_# #[ "r""N!}!! h R< ~Fj@m!.J7]T}p{ =)O7rCY'}Ek#  ?>  ln   J O )  t  W  [ =  Rv 4 MRyAn@u,,~;(,n'N"[b%!]=|Xnw~nMc!L9IwZMb(R[7VPw-2{CL dU39X~޴݌aܶi_F۹ٳ0dذ*)ק؋)ոY:/^֤ӏ՚2Ԑ}&&ԭ9ЈEkҬ΂bO ~H͘͞oѯ`ёRyH^>H?KIH?FYGuY̏т̜њ̽ <`mҘͺ+:Ӑ}Q)ԫrԦ3ўՎu֥7rlpزՃe״ZۍGٗIݬۭzjR$2ߧn<tM;0Ks 8?Bei/ W+Ao + K  r ; tb )8HPZoTPbD?*  !b!""g#"%$#$$%$<&H%&%i'X&'&l(.'('L)')M()([*(*)*>)*p)+z)B+)J+)Z+)V+)?+)-+d)+9)*)*(*(<*W()()'D)W'(&(&(&'%'%%&$&$%#$#U$s"#!#B!" ! =!p 2IGH wYIk10uiRm{DAe@lzN4;#( v&Z!9<9G)j"&",0JO`s V.G={~5^OT}6fLr!4d5Cg5Pg|sR, kc,zL M<BHTI1\PV^J b  I H ,  O 7  % 5h  LQ-]-Vr 1_ $=P7o]"[6WEw8=r-A[>g IZ.qgMjhޡ!m>ߔoC*ݼݥ ݪݭܵݻ+I3[N|݁ߪݶ&+g]ި3 }L#r \u5&?Z fZ{`(vO&t;S*{"d`&*gF}"T ?c  #1::C8{7c*I'@&$ wd[OJFQSTa)vHn63wR dWhL&r_e7zn \_l";vG#[0zSj%PI9%vL#  u R x ]5|8yAUf\T&{C5sB@HpM6`dz2$q"cP8 }HO_> HCDAw&Z`6Np z >=}VY6C:S[i&~ E b : q 2 w D ( h g 6 A 3  % ( / $ 1 E P * b I s y  4  { 6 Y < } O|~,a9Af`] vK+;jq(?]x G y0HNcidb`Q> i<n7<:CrLz+=jWKU g-   Km x  v & Y  N"J5zIdw;b*Sp +8F+SVlX1e<)wP'fR 9a!"?jvߎ<-ޛKi ܌vb-3ߖx۰V۔Fۛ/ۑ ۅ%ۀۈ<ۉ@ۚZ۬߀۰ߢ6wFfܘOݷ?:nާ\ -Fr6>i((fw=:w! \W*3yDdXPWCM736WQ$jy-?vZ&a_9+%rfyH5A& tM)  ~z}|{\C'bDTxR2 ~  E c  , x Q  R  9 J p  k % | + u . ; u 2 r * ^ J  G     w ^ Q . !  H N  /  p . \&5i9^wmK8gD{qiL?1+-+''4AL\j~/Sx:O 5k+#jW-IlyA D } "  e = 6  Q  K h C ; | ,K[U -Pt3rJw & = mjF#( )! i<   x m3 O *   ` & y ;  n 3  e ) k F  \  ~ d 4 f    dN A %   D  d H $k ;    r }C W :  } ;  {xJM8%Xy],DbOFC~Bb]^Kk'D7oTzMvo6iz[>?lvL $~4D.,CtojDNp-O )] }@z4{  0eR/Vj%ߌ/wV5;ީcݶݐ|cB 2F/e#ޮ4:%Voh޷ߋv @a9UCkz Vt7NfT!8W0rM 1oa41j'87IW^MZa^cS I9X#    ` + X  : ] y  - f   P   2 o      v Q  ~ L  M    N?  w i s"  _x ? $  BE   OS  _P}]1V%Y<d"Jb`04](ur^NHxMqPwUSiw8w AXdcJ;*s Zx;)<v\ U S 3 ]  W y J d 1 BU/ Vf-q:S0`zM b1UkjvE$kba%O*o(ZI_`  c r & r l  S P  P !  @Y  { h $  ~P "   ] 2  ] O)m]FQ~SN#Q PrB7^zgv:3#cwcIi0.]t/]2kHxQ/Py,BzcA0Vk@[b-Gk%qg ?|::F1l9Tg'TDqn'9KYf| 91NTgv ()?ZnEN: Q u ^ G   % ? i P = O o n q { ?| u o i ug D^ O D -  r 5     r K > c \ P T H O W[ fA u {wZ-Da*L~7ykojm& hh o s t5 m   B u   RR e   R 7 i  H3 ~{   $l b ' x  .A f h?Xb?Z:w@F_q3!B^Cz%eO6>BTWWo3eDPPWDLDD7/)!%nNL-(:W)>h\Wp1e2\F7  lH   3;  [ 9 w  $  j  - J /   5sKn[2j]ZLZFZn0tZ$8:~[/h d ; o!s=FVc:\YNJ&-o=wAp0i|/mP T:e=&&vJXJmodR%A0#.h7 = C  I [ r o R  D Q5u{0\~0nWX#dSY=7-)!CRs Dk44Bk_j'Gw?$H V  a   Cl i  V   9C d{   +p1Og {)9eoxv{dT?$taZJ"!  W   w| L$ " v   `W .   AOt|E'<#a^t22DIvn9n2TR 6z10`+B:j&-gw-BNW%%}caF*Uz.` B,tV;&uYQA$xsmd[Dq>h7G;8') kV5(nR;6}yifbJNFC1'&.4TZs~)($<-WM][kj 4F # 0NKRa8S y8)sXWUAB{~Dq2\  F y . I  d =}"Bfp$!mY ImtjI0++IiWf GE X}VK8F-.CHd@ujh+^ODzQX4;-%4} /BC-I3SF(~. ^i0?~+ c0j Z t % V {       c 9 ~7m*> G`YD+}m5&X5/7f{N1iSm#%y;'el!i+[t/;a B~()' 9 e%޴WW jw(Jܾܗ܄pkdnl܈,ݶR'5^ޞd&r@1Lg NZLrg$sBQ:`J<"BtW=\`s-hw=QX)QRn47p jE%x" 4i   ( 2 n M  * S x 6 j  * 4 A [ P g ^ { {  ) 5 F S _ m z      , 7 @ ? L U W s }     %  $ +  , ,&7,,6BMF^LnZWanh.CVk 2=W e<Is$9%V3j\}16?Nadv8F`s  }RJq"O' _}EB zU-o|#< q !R  k c  N J }   9 E ^  mq z',4A@bw"0-lL? K*>BYa0\2Z5fNNs;iBX9VDU]Ra]~pw 8_7+Sd|"b! KZ fNz-ufq dk@O$:vf ZK-K"F"1o Q / y    F  3 D  O ' Pg $z_:%"w jf{$5Xy%9H{|_' i  e ? 7   p z  k j  V S S_N;V@BnNG JauU&7dLz~ $+BACu3eB ' }OP)RU%Y~949f}Z cX  Tl  ; (  f 0 ( E  E,  ;$1vQxF]([\Z> DJL7sN@t< IG8Y.?= ~J| j*>In#Rw2ߪ^)ޭc%ݬ]8ܶ}Sެ|Fڳ݌I&ٌ܄38؈ۧFi!شzڹ/ڑg׿9׊$Y0ֹخ֞؝֍ؚvؕ\؝[ؐOس<ةFNL] n#׊Jכ[׬ؔHQzًر:YڃٓZfۯگOVܥۧIUݩܷ c{,Mߓޣ i߈'aN~;T.0.2@@j/F'UR'2`~ Z p,B[d#&gH60[7 dT4(k> {\ >  ytVe<Y >.V%wzWD0e>ce !9!P"] " v#K!#!}$C"$"u%#%z#C&#&$$&$M'$'$'?%(s%P(%y(%(%( &(0&(I&(U&(Y&(m&(_&(Z&(]&(2&j(=&C(& (%'%'%U'%'S%&%]&$&$%y$b%1$%#$#;$a###R#""~"o"""!!o! ! !  Y  !Zw   3 Tv}"4.PFqo 1;]h)Qm U SiCVE  _m J  2 s l = & " s 5 w b f > 0 E  %  { N A     s R )    {   _ J 4s    x  ~ u v t u} ^v du Wo Ht Dp 1k 8p $m Y V M L ; 8 +         y d E x! mP>2m: NoEj}g+#c QPB7#p%| rT0 u?\+T,Fbp~jUF ߡޢݘ ݈܇*ۅ=ڄcٚs؛Ӛ׳ҿ @$yjκҟ=+̄h/ʟ΃ko^zn˩ [ơNʸɇų\r7A İŸ!ŧXųȁȳD8ɟpƧjOZȣapˋd7v͕ `ͦGϵϜt`S2ӬpX/ ,J\w;Tl9?f4Dx P\Dyd3/-J<VHnSrTUQLJ2 .  m a >)f5_Q-ckYbC!S[Mo=x0oq+ 2a k    ! +!& >!9 I!7 S!E _!F b!F \!6 V!) D!& K! 6!$!#!!   \ 3 t V < /  s])z^K=,y~slx 'J j )0E Z>\i 5 ^   7 !] 4!u l! ! ! ! '"!R"+!"li$cY$e9YR 8mfu3 ޴QZsݢ Bߔ&܊޲ AۻjGِ{,ۄb۴ס09\gمզ"EVԅטEh ֕IbճѺj}24ЮӄiQ42ϩψrKBCBQ^2Ђ[Лҕ+>rш+;ԜҪ՗ӥ,+ּԶdcؼָ؃|MO!# 2Bax$.z13 xt |3 Z5=Tt}P' " ; U<i*ch[/[D8 b !h!)#~"R${#i%r$&g%'E&q('h)'J*(!+f)+*,*e-S+-+._,2/,/7-.0-0-19.U1.1.1.2/22/k2+/k22/q2A/v2/j2/[2/>2.2.1.1Q.i1.'1-0-0=- 0,/,P/),.+m.b+-*v-*, *h,)+()M+(*D(*')3'(&Q(:&'% '%m&$% $%#r$ ##",#!x"!! &!f z WR:BBE1 d$($] 1 !~.n1wEVuB o   SO v  T  G p - *  y  Z + g   np[wF&( FZ{@~pVeE3#3UrZu&wZ$vfbK-4sU 4s+)@2nG kk3 !m]s*4 VObQ.6)vE3% ?eqW+6mZntX%&R ~~gO- X$V=wEs=L zBOr,RU.|6߯gjd&C9ߟ/v 4 ߖq6 *ߦ8ߌQjiWM)@4Eo8CcN5^_R3[w %Z  D > /  r ( W , ? ; I%d".;eQuWPa!F>QuB8j7AUY/0 v~MX4D2 ZKx(gV=#y`,pLw:K""]S.sFte03Xqpn) ;Rq O[VW"k)s@}}cai^kyf_rru 'QFp/i.zO VDkU@#%r~jL ~KF!W>VichImlo}|0\0B:/a fqT'| \J~M@kzlR|'z_3 _5wU&\ &mhQ4,KwS?~bFp;F ''  $3Mp\-X}9|G[K>)'v+*rp.,c;_\;y" +^   D S | G " > W } ' c ! O 3 \ M + 8B hW r }  ^    > u4Zx'UTGn]'V-s<NvBq S['EZ0Au}bc? 3ZHjv,ht ^=v8QwI84&yu;'.ky4Jz " X  7  [ I y    &9FRXk% Hx@]z7o5Ru+ CX4]6Ya!O`)PRO7vF6"3 W7pV|6_S&Yk9W|#-rwE&2[ZQ4Lkp]=LJ(hgNcU@/t`7wfd3m7w![GM\^ k.pNkUqfaaVoPm6^*[B+jH|!@R\+r1ABJ 5?{t:b;` _C1 X!kV7$dXJD=KRX!l5Kr3|Z\_f@ZiJ!Hp~|H 7~-t?ZF 'A/c  1i  *\  ' @   h k 8  K /   + YE zj    #))x<Z=2$# e ' m 8 G  5 8 s  E . B ? | Z& gTy%U1Bmz^VqF.rt;QeV6=vEA}B`y(*WT9L?3 i@[WG#3EpHGT  U  y W J _ ' J @ Q #pF%| \QBt AvE^!(;8/}a=gw#5uL7'1@g W $ M > > F 9 8  r% 6ygA# wwDKjk1?zuhGN(Uw`g{t?34uK k} TGyW^B.-$ wzl&z=_f! M5l/e6b<`+{.fI+pnZ2;^0`YF-EmfB{o?xo [Iwi0I"oD9N._Bw:|JGDCF;w/n#`=6{rYJ5[}G@Qb,LP;w`)Iq"1Mmw4  m^gsZB%%7r(BU7yl'p8]0o'STn/v4y2~3u)h!XG)g;]*q._{ hOX*5m.S"' m e 1 9 i  2 p w[^/T,@*--93YM{zVbI] \'?h<_ 5osTQNO7.2#1'53@BK^s ';>RG]k}%Fz '%'7ATCxXajuthiPDx-Y5c~_1~>cwE-Wa/EnjL"Vc3QvpS'0pE&]QG.m"`?7 / ,*" 5 0C$Y*q9=Lj+\8Tax2~=`:|J$WtS3bXdX&^19CLC8dhYSSMKE9#,))< FPVV\^XKcG7A)5'dDaH/jI_0=${T!fO9Fl)gTFJ1j<]7 [E7Ky (=Eix@*yAji4A;?"qT&:nMw0yHLu~M?   s , ` 1 \ X.AbL~ `q(t ABvnVa.?Xl  GFgcvfaX-{M<4%}Z / 3 t j  J M s~3Es&]Z/+kvX4mZ?R-BEZN{2h @~InfHDa?UJO\GlFY[u=/L_=j pP/Yz![m*Ag|FH a[}+#L` g RcN/T*ulU 6R~"{GZRFU wwiH1 shk{a\:>;2) |j|Gv'f[[EDEo9@@$7-:49hDABCEHF}YLQ!]d^Xnl3bYgP]YKNAW4H] ySi Js6) nL.sk%"F^N%L]E7<7/8)c")s?Cg.wj`?[ ekzd<+6w6gZ*K]_x(I)Qc9w?KW"u+mTnsxy(SC!LRM"k:K &<H7B[?fchuiywt2lntwji@qztnk| z6xQt  ,3:cEKHdbu=x`z:q%]%g%=3JkoJT.@s X    3 Bn d     A . W \ z  >  M |      $ 9 J W j v h  H 9   g < { 6 r  f f P L J 2 ` # Q  6  .         v f Z A ~(   w t  d `Z h@ T RR95~M }4pMq4Jk4V~BA#8f_PFDyI>c{#EiAzZE9(#1;Ry8n(b0z+s jn'3FT( vXO$6Co.F   G V  7 i    D 6 P B K f U y < | *  t l I u - 2    DCDEr wqW_(y:%Wm,X  $"I)h08CXov1QtC$p`=bG]-3py0Ng?iߗ~w z+mVx1!X).U:F/*.Jn!97ps Lf IPQ9_3l1~$(f.=+v~|l0Kyj^r>kxoCd G ^ "  [ T 4 W 1 D p  @+ hW f    + . ? K K Z I E .     j eP ;+  T }  ? p 3 _ > L <  {  Fj_?K& .J4RG~SN9mN:{gpdfk  !?[w*X}<p*`5503d$dt2-]=  " J P a  w  T  b >  w 6 y  # \+J^wr!q)o7U-U!4   o ; e < X h  3 x R  e T  bz  W  :!3Q/"(}"g:_O[ur J)f< vS/gd<@rYjU_CR,RE$SYjy:3EB:`YaumFe )D;q)GNOT[:[SazUV\ZN4?(/4BPXbXkeOg)hcZfZNcLMK-& ~FnLc@o9${Fi3h<Q5p:|KX$&{bMG f8{5'[$nG/_U6+y_WNF;?9ASVl }@>]{ -f;z+r D0y:/Q t)~mFh/f%!b2\H=`#P\4y: |Ig! 5  n D eA \)mMu=xY% AD|&>{-Ia ; e )!_!!!!!!!w!xC!5!  @2 p\gZF8I2~o5^y*GMPMG ? 8     %q-]6@?Pe -p0qAr!._YOl+ DHy'|9lM$ ugfbh9vZ3@`$JY+17J+T)l-+(~<-X&jQ5vX!\0t"^K`)Jl{.;BGIXORNKuWUF6B#J D5:3j$D" p1|6mE_7q!ptMeuN-c}4a=bp|e&U:T7y*j^P>N7o$M[}IzK"N;4tq]$].VLo`y8 ~*LXe}%lI{JL0-.Xm9kfO',QBt F ?  "  \  Wv  -}h6:}HPt4Up:FUOgouhq|{sjYlD^WJD7.qU- _;z`aN;i4>#- HlEKl}5qJW^ K+H{@}*5Nnc C/KkEZp%,0-'}b;#|S&9{h0R=!+6A;T/L + H ]   q V  b0oJP kK(6Cwv >x#>k.T!HtM2 gLN5tm>d-$/OqISBNI_}}j rޟjܓ5b/ܱ۽ܱ۳۪ܿۿ-V"ݔ^ܐb[ްކނc^\`{ vL4|M7FT"Jz P G Cm#v$*ne8*C0D*)i;gV=e$4,<@/k Nb09`8()2mO+LV=d2h9LF3v9x>^(]k 3a41gM. wvO>?>vPr5;b|y^TF<>IAFy=M] _ P U  x 5qCy k9V8EG)_YR F!WG"" # #!$F"%"d',$'$(P%2)%)]&t*& +A'+',(,(,(H-8)-)-)S.*.K*.* /*B/*d/ +z/!+/9+/K+/f+/h+/q+/g+/`+u/^+\/I+:/6+/+.*.*`.*".y*-J*-*0-),)v,K),)+(8+i(*$(I*')t'Q) '(&<(>&'%%'d%&$%y$V%#$#$#z#|""!*"f!p! D  ]o0'l,5b%oPF.d`1Mo  70 t o  J 2   nZL]6y<32 nVq"_HR{Fi>Bq+c](Bhz6 i_Dtk8;^C@qr93zg6aP ow'aGAPzh!6TIADG+;j 6=.#+cߗC ޑ߇2ނބݙ( ܗ܀$*ܷ=ۑcjښو5Y#o׏}f,6٩c-ոդ؛՞բbՍD՗.՜*զ %(;!KCjiًդٶL\փښ,c~׶2]܈ػoمGcAGۿ8=ܿnM_1zl Jh!1D%<=mX)qBN*Y%qQR [37hJt5e"Dl+<Pk!  X 5 I /  | E  NUr` ]1[AEG)?7i$@G ZYMR )Pr< :`l-Q1Yz|hH$8F7FFU]SYe_mXobjikUg0so /Wt%@Gab6 .V c   D!@q!j!!'"#d"f"""6#hm### $3 ;$s S$ $ $ $)!%V!%g!/%!@%!Q%!`%!d%!f%!{%!S%!Z%!A%!)%! %!$u!$K!$!>$ $ #c c# #"eO" !c!3 a 3/<P5-My>]v| ] L  m[U7 g'sAa'Du3 i:b*o-YJ.*tcE 6- $%0MBVOނhݵݒܿX2ڛsٲ/"؇naIֿK@Hf~ԯ L |0ӡwKҙ<҉'bO&J7M=VVb||ҥҟS'ӠpӳDӗRդbhG?6׼֯2Iش׸3JUozښ 4ܹFgݐݳ.Vuߕ.0s(+y({o hL@3yi8!SIddWeFh$S2Otb4 TEX,s'JmhGm -FJW ^!k'wGvNwYzsvg %&0/DTUlj"M'zNi]-_bT@.1*KIhLy"f011|2E8H  Ik     F . T*  oeFJ Vaaa.WPS; +3 EvO[c ;Qj# U   $ 3!F+!KE!St!Ly!^!T!X!E!;!;!! !x!j!N!+!%!j D  t A  D[Mbp:+Hh$KQ8y f>@9x2Uu`[I7$f^D7y l  E @ ( # h  V ? B | %  #W  &>w,g:IfCHD}=Of7$@7wb/aG$YJ"eC[u#3e?4N^I&'^/N$]F}\t*L V 4\w'wbs;}+ (1+[;"kc +Xj,c*~Ck*+ݜߞogUd89  8(T>g߬݁ݰH'_ުa7ߙ jM= }|"=4iOE=|'8A>Rp'x x S 3o    X  sR98*x<d9'R\ B:qU&  P  x F ,  r H W  I B k T C f8& +|@eL.Fi9qIS(jPp.8GG(1&($ %T en. Zv.y )m;~TLbg X P 6 D  /p  V t  <W  ''  % s=JJ*d7m{"\q^W"_cC}h)K=zeF<4I'~F5DA|0m,o\V)/p0nbV&Yjo@U!|]Ew$X(pykq{luczk]^aY\`vy0qck Kq:b  9e)*(*,+9#Qp+o!)%(15CKMZ^lkz  .CMUw%DLq :W"Il:*o1sNR#Ioe[* hl&YJ<%J Thmh(cTR+[hd`?qZ,   ` t  U  8 ' q  2 pC6/Rq97zg+^CYz5>B=;9 xb[N,3\xW_"tE4P]$cq]&  [ d  / O Y  `  A n  h  )  @ J xn#*Ma 1'w; u#zFx?xw9I;#qY6#  8Kt)CXPr#c<Q>9@ul"9\_ J 9b `         ' # %  p ?  }QBE;u0 s[GuhmA@ wb%R?m%` 48NDZs1^(GKt@T,A\v4_?fvߦ2Rާuz^T^c&?U Dtw$t06F-z5Y:  -Ky1\(Uo} &*cwE\6) vSbA-Z &a9o ]E2"nT .,"-'FQqv*'fW~)m0f cCl6IU&uKk*S   B  m  G  E]W R\%TJ>1b{Dn|gGr.W9`-PbtuV{%U5t' 0  B  aV H s    Y  / -H\XA"CX;0Vn2-Iy!x0z6Si.q\U?-{r`eHM0F7)$x^O4&fM+tn\L3"j O/lpXU??3 xoQ58wW;k>vWKv?J%O#q`b6!Z%vYY7!e(r\v1EW> }zsbsnx|>mEtQ"\]9~9ji`y7#3(y!6|N'o]WY-"0Q#<W[(e X 3 < N 9  g}?e[@Nnu!06R9T2Aw+C} (Gz%Tq-1;76wGM%t(n1^5h |Ww&c6*FYG(^ L  N  4 k  6m ?m)j UD} -Tq38l<\oLja h?SUr1R3wc J9!861a;gT\-u2mTEC@o>lCt+^ 7 %b-xgd"T}!:q^J|e1;i\s 0MjglkT\9TFl*n>(tDQ-G))qpB@ Ur37K `g#8qxDZPDUZxX7g84l0i3'sfYP NV.aS}t68ooM-xAsj:B"pbj-. P/vT%8>`m +4#M(K%BlU)`D>to"9+P7nIjQsW{WhAT@4# {fD>KV f,l=d@X 0Yx%oy xU1Yn@z>#2SD:iu mg)GDi"0p"M- ( gE?J  L J U L X A  G # * q s % "Z2v Z7^{@q >$T5b2.23,, qNzFS3n^D+  l^ 0,   fw #<  v 'd  s s 6 H a 0 ~ l   J u~s6VM7ursV.#l&;62|BbaWlL}u5p6=RYo/I ww ,Im'MT92pYc3 n 7%7eQgx`Zk:{'ZK~*6oh7&^  Qr  s      {  P!_<Nm*0DDawqR6f5Yt(kn1%M&2  | | 8  % i;~3_DtGb&If"Xw,]1iX`6\EO he!TdS!h_89 %KGwL*mD]uiW`TPgLScRs%E* 63UA`'c1tMjN>q%Q80`&;$H##X=KE]}y5y,!&r$-FJ6[BEJ."<MdR:L n)E2@ oT   2 i + < V 6l Mn st s b X F 3     x R  kKN!``/TyE/sb2`@*[ Y~4 bWLe0ZzVh, iX>?DB `.p>iC4g ^!{afUp^"tOQ'?}VQ9 x 1 ) ^  z  Bd  Ed$3}*llMI,oVfiJtPZ#+m]% C4p/91"QfD4$-S^ }-{/^^9!i/8r hw UH  8  B  g ` 7w`x'Px1K0UAyIe+#_-&Dh|m<4%NV|r+;_^b"1r?#{;qR]&PXID~ y_!eC\ZDT7)32F"u ,"!"T)%*G6y9+: B@>gKZZp$eEy}t $Kao $6<\$X$p&$ 0 $ ;M^h4L~'*GHsPzV0&i] kPx-N&'V q)mWqvX@*Y.~%9uX`"O ?  h$  `  |   5  6  7 y)_*i7?hbn. b^xY 2Ke~jW8t\;&_jv4H-HQ<Lf(_U}<:S Qn  $ d G P  }  f [ E   F   Z  x i uf IW U U T V U W ` h t } {     ) U   " 5F pO h | ?   " w    z  +  L t M a q e n >  I     9 Zs kb U A     q X 3V    l F y  o  O w l ! k Y U p$2Q EZ|7;Ii!V2iL }CYl;jB-iL^B{<Ya607Nހ.Mݽ;Iݯ-ܧOzbܑ9N3ܳ|*P#;8Nnيٺ(Ba\ڜݒ> ێ\ުSܱi!܆aoRtqLJS +wW$oUy20 BhI_'b%+v,$pSTJv6&p  Vk}J2Y St6c*!#   &<|4R9 88$"7lzn H h tHD ~H>fn  "  A  uk   P"  W Y)td  O 1  A4  A F J kI$@X:HLV[x`9gvh8 +Vl? (pW&q*SO+ sDZ6(^[K:8W4S/@+#%2>4KG`nn{rpOI4# c>cKv*JdkB7y~-6Ew IH@^yt"k D$|%s4 RdqiJK@[h!>*h5-/g6M}:v2a\dS2xQ%j jXN_xV &u;HLXTHd3y,-Gq\ Vy;Kh/ Ero8Hqu`c?1&vTmBaKeds[4Gr.J  0 Z  '  b H P 2 9  ~  g=   t1asJ+ 7;5jHOF;53,$4-* ]<'LO^ :<   \i W + w 0 N r H v 4 1  u E  q b T V ; Q  O  H K I E c c t    ! - L  w ' O ~ ) b  E  O K / k $ o N  q RsF':40GXgMD sM+aP|*Ffh3ClH\WnXk[NH9=$XwM3B!D]f5H[+[f]Ar !  h N 1 k M %0Vk)!bZ N}L ;j[67cm5Atz]>tYpnqA8/%}%m:z_'=b@Re+9wHiG$ngG;0* ",2ISa'R}1D/fIT/Go]N\2 e!S#~>H!^`x5|={2Yi-  h U 0 $ e7nD k+uBbv:$vAW1f!{<sFd8  } !A!a!!!!!2"!w"""J""J"#c"=#k"\#q"s#k"#J"#P"#$"#!#!b#!U#p!+#&!" " "? c" "{!z!!6 A CZ#\kT6(=M%YpR;}(z7{ S C  . w ]  \  E _  M gv1]dJVdEyWaq }D;?uOf. d3 3>]~(Pv+]#q:hi"8 :NACKLiG~JC0'  p%K6:2<>nA:< 2-"h)q<pH?Xl:h5Ds`"/T)h EmL'% `BawX7b@R~a[^>1 L D!zoWQN}=q;_=`+_6c9k2|;IFSf t2W@!Hso7qy@3s+gihr_'lR#(OfrO,-`eQ@)Vmkq4dTP4[dK d  C s& ]   & N h  & . 6       {W g D + W  vP&W\/*@_g= 0cDdH!x5Jq.7A\)b"Zd@L%z|3mLifr\om"tc"hM DPf`% z.XFuS9PbM)E_d X 1O hA~^ "<Ch7ET~?S}.a (E1nOYh 6t  F 3 V w , e  H $ Z [ x y   / % > ? [ ^ _ ] n h y r w | { m ^  Q n 4 q ! ` E 1  g 9 n E 2  8 B  {d<Wa,d(M+~@7PobC;zFxS7~dQ%"|iVA1$ %$22PgUtM0ReV/yf+jVsY RVS)Qy9Zy cFu>FYjy"am)1LXioro^oPs@O5C(gLuHh4c2eD_\Ma =kN a/b(sdzw 1Jfu 5F~8sF\703g6f&<^Ux@?3f2 $[qv`!0@5 C%l vjQt` r >  y  j  V Y Q + } [  8 S Is W| ` n u  t d c H Im 'S B !  k ?  Z * d 0 Q  f C Q  n X  }6a@iMOXT{G-C`ha0<hAW$) ~i[PNITQ`s*IAx(c2s0z c$qf0"RE_X2@g  2 b P &  X J B Y H?kI  =FP&U.QBK0<<((NuO  `  U m  m  h  Z  ^ ; ) k  X  NQevL1](h*\\Ci"3G@Xd$dY%2U&XAvX(pYw9R1>}uv]RPY?J"?- ! rbT8)vaf^Pv?b3X7K-=.{~ztslbIODD6@08{veobqOpK[8a'_VISJKXMV[agqn||1?I\wz&@Pbqx#6"J<]Vrcu#>/]V|.CUn@\o->yu r_%OF \ ||K|zzO,4\eG,$T  o > 7 h h 2 , `  ~Y   t _ZFGTU:r `=c 02Q^VZSAv>K7% _#l=P cj'S^!#?7b( s   K  u   3 Q y irTfW$K6AG5@:MN[M^]ghs 7Q+yE d9rZF9)|A(JExo5$~eM.!}}c~]eOeDxTtFe^-XHy>%*rx*_Gl.[zBW1YVSRr`kfQ~?}#ymoA_8_{g4 </o<fE{/E'c.p-.!u]MO))~7@kQt(qu pm" mT_A~N,~A&.7H`dm<de^|EG+(2 "-=Yp25d:u .2cs(icYb?H4;+u?%vdH5!y\3uVk<H(9 trf[??2*% <=cl &<iY{y 3Aby7:r8{N%[:tIRDtd}7DE`Uhy{wsu^H>pE{a-SXD~MC=0n5 g0,O]k@}|^yHLBV[[5'~b6JyO4 +R s%JcTIC:]n TxGremr-g %d?m^ps$|/v|(eS D q   g " o  w ? 4r    Q 4 Q T V ` "N :     ~ K^ "  k H O ; d x W 9   !wwl]=@h j9KU4 S0-uXK( {vr z!Ga=_\ "xKQ!mY@'!0F_i%9^ :aAP}% p8udHgqE|,NA(gwZ5QQ y9=[{8q+}54G? Xe:j)_2ce]-:uDyaO54l gc[aejo *;9Osz )Cm x(Q4QVk 9j!7?6JcedhtsEvx|ktdS0TM<_+z x]0d8r_J{$`O4rQ< V4!Ble YFBA?!E$')F3CRegw0!/b aAKYHy s2PM+h ~$ $    /  @Z  Q!  d 0[m  b_  :  8* `  d  cQ,PjgGOmQX ; l   hx !  h F P ? 0 (  jX   5  g" 24BjF3Hb59))VX M$a6MG7h Ry4>h<wb<<8;~SLmIN1] buCME?\Jl&f7vZ*zpzq&}t(xU L  x #    O j 2 @  "a"* k. ` ), N 7 [ b F [  V q 6 eF<!p/yN(cP1zfPJf5'5H7#Tt9 e%iQ;H<=L{]n00%loE\ hbOhQnSNCezpxU{:qpk\JKh(yHwV\7o v  ; n' O p         { T ~( l 7  4 {>:i%1~3PN#Bf0=&p .]UN{?=7;eG-]S =O6MVe~;oB sCxd^Y]b~ehmzv 7W!E"o` f]I :-Fw-[-l*C*|H2yUh5E}tBt;pN{(Up "3TV(xCP|uxprVF/S2W/hMi>?)}?#uKo;H'}si__PBI.<"3 +-EIS^oI &-  Q P 3 9 c U  P ( O 8 H:>1!$trKY02}xc\OY>Q85D7\3vNIz@Y \as\P)xiU>})*x&$':ATu#-j%P{Es) PP#@jaBs1Wr+V ( DJL XGQD:-aCp1@dKpP!o?(~M7[U ~~=,eu'3sL|(R"Ec L[lP}WnNZbj0dc n,Tb[! ha6{3\:w14fP  ! c ) " 9  Ue  asJ9dp<v\%e$eS u  / 8 X U C j 4 Y R P  'H k"TG vO94qrU9<3y,&DgTPA_C3VZ,~y#$FZs1#zhB ^ D$4In TB#99G2Kz[W]h>Tl L  / ( @ x F 9 . N ! y Q H  @M,Ul5Iop.Hn| tR3l_;pBMR(y,L <_> 7 A  & x . n  O \   l B '   >N  /t/:[JPu%WW$Wm*>A_4e(yJ}Kk:a)\C5 \s<$d,Nm*pP_!mM- ~:K f Y .h1;|`JwQ0f3V zI4ro1>}OsNj?c"M'{_tQe@i*c+a 5oC>Wp8]1n@NYA!EPzjq2}{AoFG*V(!dIjw!I":QS_kpP{3wq_K@e19 ZxGeb._[Iu.7-{17&DyulBu1X@@  Z  Q v  \ I 9 }  ?  $     u X ,  i a M J ? : #      f X @   i f Hv '?    B f * U  BOtSO{L- <c5e)H]sy.W*'uYNO.t UV9n[cFtN3lfRxE\B ߪ=JޟeH*ݻ݂߱:߂`OݭBݑ9q8P1@B>J2C v/ސ<޳DSn;ލ`޻ޚF[u߽߰XNoB0nqPZERS`ci'rh .[h \3e~ *IG0hvtMj%RHm%;) [h4'~;0j*j'ZPt+AH H#f=W0cJ];QOTDM57>'+*yTMx2aSA$  %6Qh2Gq4^[W:<6j^Z3t  + b d g 9 d  [ P]  \?O*Kj@Z54 sd:0l?*x:!|FLI*hR~}M`,9 S PG t#n es )w|0-|8"wE*x]* j5X-|KA   wu 27   c V ( d  S & ` 1 { ^ ; %  M  j C  V  qkX(A%L+v (zZA+Sm7~?XaPu$~A:o:/0|$>t!?c$Lx%8U"Kp0[` XAb __K|,-Op XFRO DbG<Eg7[ p?N{; vY#a8w}V`9>##zoU7)"?Rz%Ol(3L\rE(R)A]9u9WHv0]%Pv PJkc68[v! bIjU3ZMDS8gS.s+yL&g7yfhvV&T=Iv:Hog:v jDH_-V s+;_-gMEm* \  + @ ^ X  A < . G " c+3yX%SG,8Vlm&Ng{}lR,t]6 jVI  '19MSu5Dh|36\q=~>te Al0p''QM fC |ppUA{;G!h?kf\L1,N`Ty(i &*2K+  \u#8|x T J   : n   3Hb1O`m~>Wz)H'~;TnQ$PZDZIF wmqEjGuW<7{"BA \/k F%Kx F,}YwF <6j:%aB'zIW^:_>[/K4.[,V)o-\pM![I~2Y|\D7~iL/ rfwBc(KI8,%{^9-0GW`,lU=g9A@fI=.( 3I7ecEci=wOeDK 3^/qe c%  5 Q a Q 0  $K[P]VY=1&5H;Cq4h$"Rwl?6 7q<'Yt73om+Hi P  T %Y   g 7e     Vh /\ 8 .   y t  u , D Z n  > _ ! ) B X \ 4 ]         #       x S ;  v b 2 S  Z ` 2 R .  _ 1  h U QN{{7Uj YL/z nNl:r.=ZOWD-mtBM0x\=!qmlgiajd_xg}|!05K]lu%:JR\dyy99IS[Vhhvs|~wnde]RxFi6]'P@ \qMW09c^67rcJ,#yjCZ r=?&m{bQG:&~ rJ>9t.'R8z~V>U;[/RVx%+." .&vDa>8=@?KEGcHEYGU]Ypw}svrioARwS|!n C#RDJ_7F3z3I7= R * x  / * + e & @+,8D0P'F  sUT g?V4YrIkoL#o<E vDoVM;]!sIq  #N w   F  v , & y " H  l6  <|;-^h;"zG |hkZXMLK%]9XMZmeqx}!,( -( {L,_BD& i!c-fkY/uG'A8<1:a0$My ng'gHPbRykw&N(O*y-u1%bSg{>Ks{VjL^=M-A53+3/(.<70C/P<\JsPfm *Ir 0>k,O "E%oHx79c] (#DGc[t )G"X$mJLpz%9FZRasp$':EMXmev &&4:>EXesu &89J_r=S`68qr82'ma uZg>5im8J$vT/utxbx:}#q d  7  *    j  D  tYZ,3 iS$fD#.n+x5 qP%,Q`t.U$~U6wBTkr0XjZ, CH/[an5nk* x1& y } 5 R Y  S ~ M p  Y b ; 7    y ka [H 5; *5 *0 ( ,D &I &F 8h Mn W x    Z x Q s  [ 8 Z D {  N 6p c    <& TC W l r    | e b P *   ~ Oz 9   =i  z  E  ]  il  R7 4}P* Q"FWjy2\r{~w em+[=QNKdAtE6:>?E M5Ybz!gXLhO=vި3gݳAdx݆ܽځa8!یٗXp"X@*۫!ۡ#۝-ےAیZۮr۽ؚ/An^٤ܤ7 ڂdݤ+ڕDޓH۵J}|eGBޱ5 ߥ% }{!l'\@PaCh/ *{AKbvUs7"JS|LLL8 Or3HaUya,o1"?O:ozDne^>TmM:/)ivB${ u`  5B }  1 z ] @ /  T  j { 0 ;  fe?>cpS>!^qnxc.UIJ-f$b !:w\:8>1d  /!2 !n ! P" "7!#!O#!#"#<"<$k"$"$"%">%#w%2#%R#%g#%#&#O&#N&#~&#&#&#&#&{#&o#&]#x&2#q&#\&"H&"$&"%"%F"%"%!N%!%`!$!$ S$ $7 #j##B"s" "T!R! (  tBW[x-l#M=;Vb%j  -h Vhg W2`L@6k&Hi 8 O e |   ,  M  X rV>D %lVjTB}<uW}*g:V/f?}Ys9PMi + -&FOK|bdߜ K݁܂ۼ%ډ:ٌm?QؐS`{IԽXVrӹԲ?bѦӛрal3S=I=ӳ8ӝDӛWӝ\әЄӡНӽӷ&G(ёRm յ[ўY:֚Җ/K~ӟ,ZԾ7ՄٔS\ִڻ&'דۗcv7I٤ݽ3mޣFߖ+܈ud_BީiyPHK\}G=B^D0--N+p-%Jubh/C[@%6!n[ 4w!}*n4jHnU} (JDi# 9-'Gzp*;[*m ; W " v n 85  vLR~ATQn(;qv!$SO yF!. ! "u!#&"#"F$h#$$b%$%8%a&%&I&W'&'e'<('(U()(h)P)))*<*g***++j+?++t+#,+x,+,,-C,g-i,-,-,0.,_.,.,.,.,/,G/,^/,v/,/,/,/,/,/l,/H,/$,/,/+z/+n/p+:/M+$/+/*.*.G*q.*'.)-s)-8)j-(-(,H(s,','+F'^+&*&*9&$*%)v%J)%($e(C$'#h'|#&#f&"%6"`%!$`!R$ # :# ""(!!Pr eUu; <mbE/ 1O}Js 21NT}j,'D J ` | i q , r L ` o R Fk5vAY,d6(b:&ZQ{8^%CLlDxXt(G V!$?MXx1߇\ޘݲ D ݌:^+وڅؿ53ح_֯֔CՐԥӺ[S6ҏҵ;.ѪЫ@l/j лξiΫ%Λ͘о͇Џ͓g͏Mͣ.͸$0!7LL̀nͷѐѼD͊*q3ө΍`MԳϺ!ՉЈ i|Y^owt ڪ՚7"֢zD ܪ^Riޓ)ۏ*{ܩC\`r2j":$k",)d3F |Ga2b\g|o&}u1`& lQjP VEVJ^Y rh/"`JL!3a+G=+:Q6n O<bx g5 qgA l  y  l  _ y +/]-y2Udw(R-T$_S1b"D}4* F2u&Mz(:Ralp}priEJ4*t_AuK8b/xTQ@%y}Uo&?'y^9-x``VN<?B;E;EQccx )0?Qdd 16VPs :5qf3P%{hu 1?Y~(?=EUAJ:;5|XR&" cX( o;Yt>qEm.Dk;wt4FXl  3 M e t  u~Yw3gS>T0xQ^#*Sg.5}V-gqklw}ߒߖަީݟM} ٭<tNؑ֯ Zr? ӵԌAѼji\ЎD҆ ϴkр11ͱО͖t͋gvHpNoI}:vP͚oͷКи Jfzћ@GҙϑN0ӵЍ!ӗQҵԈғwn֏eש8ddcِm*yqۈܠ7ܚ/wݺ<ߴEOz`sB|jwv}tgs>B-!xrIKd~ j3YK;af^r9sp Me"jz"Q8?T;n>+XM 2Uk?-;+ 7  8  *  j b s ?b  T v 2:qRJ a$;T{b6]Xc4p&s$3qk$2j#}.`(s!Afjl_o Ob  !R!`!"C"!"["#g#-#i#%$e$7 $r $ % .%!h%T!%!%!%!%."&K"8&u"J&"R&"`&"t&"s&#p&#p&&#l&9#o&9#S&7#9&>#*&0#&3#% #%#%"n%":%" %k"$H"$"I$!$!#a!p#!"# "{ c"+ "!E!  f \ ,C E T6f6Y5pi]>; i+_V*  o p / L ) P   wgP!-EyeJ2!Vf25|xSKG 3b'9!0o=DN7k+! 3.N+j ?'dQ)vY5LsiYۤgݵ:n A٣l܍AZ8 ذ؊ۥuۓX~E^1Z>D A?JK[q~2ۑD^}ؙ.bۏ%UٛJܑ \۪wH'ܭޙec1Bޯ)2ߗ>U5oQ>"Tw>N ZbzWE{x-; t6tRBu8P VO">};`{-u%A0 c  Y 0  e  |  {fm1`82Dd' {3c,V| 1"386>2B.b4T"OID4hNl*I !ho,V4m=ew;pNRI|BWB-< =QZ`ra^O^;S\atu7q .)~m_Ml')a Y`,lR9-g ^E7\Oq0: Qa   ?!Y!!!U!"!"F"Z",Y"Jt"hm"ib"qg"xV"oA"p""Y">!!y!@!!k $m  +Ppl}!U(~w--e2V}G <%\  } + (   &1G?PJ`mtpwpisk{R\\Sdby8N ([2tW9\'9SQ:?b Z^1K9߼ߊߐj߀HWF/$$0:>KRg߄߆߶ߥcJk6y+V@odVBHa`.dpS,CDt(\6U)3v9Oi/ cCX.I[tz|gM9te]5b<|\Q%p#STr=T`'f1|bd8S 1 $Hl=_ J[6NlBv;xXy9vc uj%R1cb)Zn5@T NJUt*,]# y g   m 9 = 7  ,q  -iv({]'r"k&] 1_.=o@hc 0Rr$Bey"@r&Bt5\(@UCd|*Gs1Pr3BS.uV{p&I^iwpTB) `:]g"G*E%o<r7d%^-b"x>5`D#/r8sRN{U@ m  ? +  VI  d o  y c  ' = C  _  r1 |QZp=qNlgp|V&:62Pz]3@Y4enN)R 9w@qoZxy,(RZW3&]nl,B}qD0 x\C ]nDNX4Mm*zM9M8uXo6/{ImFen_UPWdxY`kaia}`gjvHw6h F&_eYq|/Yi9Z;E:F[RsQ*Cyoj0aX!BOs X3wbmvlZD*K/2kb(S0oRlS@~gO4uR2`9nE.!jL@, .Gf3T|R2+n?3yV(F/V6'K f   5 M J 9 q g 5  S\%$LY{z35@LBF@I$7az2y$6gv67o`#Jf/q,<CI:?&wfO%A!q?{ 3}=dJj4\Z%I}Hcl[G_nV&7p \ J   P p ) + YHEK{X ]?yX)mg?GsRW!BxE{] v5 Y5hl:r9{qnZ'j[e%g+AZoB~g:SuC5j,kY"\@d1OfwpVg&BxQF$m^'i?wC^(l+eZ/Ab3"2TF=o?-OtNAz\nDU*. ,5YrI LV+u>\Js\J<*6 ~Ei]eiR0P]DB7W'w . GqYTi/[Qq1JlMy(NrU@~Y%]4 R2Wi >    #  D   : H i  o + A n   9  O + c = { V s    * 2 R 6 g M j n n + R s  #8 9g L d v Bm ]3~Fdv .m-5QMs\|.IZj+j1vBWakkyqzgsZbTT?@14# \y7T As?rB'I ~s 7)   v6 -  / F a  I 8 {  R 6 s Y pvi N*<uDn mW-@3N n}.w`4x .X!<@xPy#Pl5jqodlojtc^_{sAg*+Wh ]0dW9x^ is'L#=xnp:W2cW}R$8 =6NbV|KMHD/!$49kp}zl4wT15;PpRd`Mn>{*  +7;F#90DIUM<h1c-bn SMC$ va.e:d1i3a6U GU3v4S !pG!`0zf^G@F)$ox`vZV8ef}T9m,9kZ:W'6  ANt-E=v+fX%c\<6BZ&*JqZx$FGn OxF<_ apyV)$.:j@`ti0[ @{Fy!+D\[o/=it } ,(..4*<>.+&)" %&}*~*1/;J^[k|*=i!Mj<\ ?=u|  Q O 0  t H  j  `  o G ) 0 8  3K:S9P>O%)ke"K2b( TJbc{ $9/f(Z*6 o/g.Cq6^#Mv.D{m^3: 2}  ; O  w  '  > x  s ^CQo O>Wp[vCr.uU^>t4(Kc*a a;bsG*icH2+ D _,0Gd3fQ/nV$_5eG1zBP|D2s2wO(  hKo=6@Pxs3Upsh7g8c x49_.FVnkwh Zl   k i/ ? mBp^L'zU-2x9ihi\hjry\t+t ,GO{# i  ! Vj   Z 1 n b  K P >3   # c) [  * [ : a  , O t CV} .-*95.&]&_P, N  F q ' o g :  V 6 w E ; m ]xy!|'v-l"U;4 '!~!'@7Q[(&UlNaRBx3V%]6lF&s%f \SJGGIATep'=IivBS|:No7P|#Ej'Hcv 9Yhy  T5w XK'} 1vY56?R>X) ^6Ha sl M2MRM}*v7i5vQ qEuUL+ #1N:y_F^N3 H93,O_2s$`vM cK?03)4AEuWrz 5 i z   tq Z7( |FyEh  T,ZuA~  d k %! !B!!g! "!;"!Z"!}"!"!"!"!"!"!e"Z!?"5!" ! !n Z!' ! iN &:=cb'5VU czuK0tXH/%~  y   y  7 7 Y a  A p ) I `)Sq^ODE9C*'.*2!8$E/G?lJ~hDkN~ \ 0 j ) y H $ i ' {  x s ,  i J  u X fl Jr )_k'"q];c-OVr|~~uuU0 i3d7DgSa+H. 7<  8  N ~ A N  2 <v>{,Kn 8Vy $$BPWiCS_ H[:q-jiLX(^: 7/Of|߂m["ުt޾@ުޘݎݞ޴ݜޱݗޝݻޏޒޔ$ߕRߗzߩݴ߷1r ޳( DIrގ:މV-߀)7v(e7FMVo4daB&Bp]lUH,q2UGMi/g -Pq!kV@i]R(onI@"& V!q~=(C7C FSjSn` SX}FO}O5iIY\$}Z H J{j8TdE:Hb k9Qp+ Te  I % 2x  / ` $ = ` C , U  Wu P 29&k,6FVWag!}1^l~xfR{gf  !2!l!!Y"I " " G# #%!#V!$$n!M$!$!$!$!%!!%!1%!G%!A%!U%!W%!D%!@%!$%!%e!$@!$!$ p$ A$ #V # p#'#"d"&?"!z!Q'! _ j| vo-@`=Q?@2;y3P#{ O 3I%u&B  ^     *  W   \Huu6p6eYDkbt y2[;f.%WUa% \n7k.O}*hZsa&M=KH?+:a8%TPk> 9jRV)$g\%zW5ދJ3ܐU|6ܦُBכ5`HؚԠ׶RҸTՂЈ T:ξҗ5̢8ћ˞Xʞ*Bɴμ:1ǁ`̑q5,˵Ū|jWB-ų'ŹZʋ 8gmƜ.˱@3ȑ̾UdͰNj0lͳ`&Ѩ҈vVPE|IصOcIfۜܝݳX)cpHuW`+Z ^pHSDM+ OyY6=OR  9 @yXBd~~w@vU. 1F 8PP9D t !k!!7!VA"pm"""""#(#2#/#&# ####""""{{"hZ"cA"S"T!C!?!=!8r!K`!6B!B!G H V \ n { o d V 7 3 " : b   &O<v  / d  !>! o! ! ! ! " " 4"R"l"""""""""x"j"J"=".#"""""m"X"8""w"c"W"cD"<" "!!!G!!o!E!1!} L   M f -kW-PZ X|!`y'R[|fanRg'QI - Q   g  ' 7 *D YF ~A =(%  #$g,I;+F/6@f;BF ?JYjhpmrbrt@|d5mBo5~(}y.܈,ڔ]hN?K-eױ Cץ=TՕOԮ԰Ym:ԧ_ӌbӂ4B ҢѣtяIs!^ F)4!ҽҵҦҲ Ҹ)(>F*Z^oҊџҶѨ5sӼO icӭӻ&z^ԤH9;ֆջ3HֿצSgtB؟@8۱ه:1ݹJۘ?lܮc(!lߎMH[R]Jm4)V A`DX F7{?,/Mx \Odiil#^=WM+_f_eoT^&JhBI/.w|T S < K " *   |  v  X  Z ZMJI=NU<gSP*\4V]Mn@$+^;@*  q !3!q!!!!6"0"""""f#!##f# $#e$#$$$T$6%$%$%$% %&%@&D%^&Q%}&f%&n%&r%&q%&h%&[%&F%&?%& %&$t&$J&$&$&D$%$%#G%#$2#$"Q$"$)"#!N#g!"!y" "# !!9 - 6") x~LW.+bc0&{kF9{ `uHrE P  L = m v  A c . s 6  A  T / G    ~ ao G_ J P P A G M R N \ ui kn c e _ X U \ O Q K G" G$ F7 G8 6L 2L 2K 2T N V F E 2 !    g G l F oN^a3)|*_ ]|wtTf">Wjrx& 6 +{lSQ+)^w,,gCMYkCm=r0N/7A%ߟmCߟ7 ܥtڐYn]dOwlֈٙ0֯X؂)ՖC׆HԲj.֘wCӠ"rcE95#7BHoӉ5ӹW|ֲYӔ8c5׳ԊeUؿ;يְ/s׭?Zdfً݉Bޯۉ_6ݢVgr1r>O$\&bS1{WK4ge>5X5o ih O ; I  X {F-w#\ S`w 3LbA+;* WIz=R`(~mcRCC|Z`1x7j+I= a2NOXIT0q{3X'W'yP~3> i4}W3Ygj5P*x> ^AE  < X (  7  a +t '   Xd *$ ] M %    v{ EE    x 4G     s] H? 3    s T %  kdT@+]1F3 ue6|Rb/T @'~Qol7$Wr5o x2h A7f'k"83;Obn my4R6oZ78ap(Hv2Zm8OuOv:I@ *''/>Uq:KjQe%Y:ugB,dQ%;"yJm (2Vg|gYU1<n0e*ilv od_>+ UYk+a%GCY:yX8xG y8tpN3:!-r-{:9m Qw3Ai|y zpXF+s<FO2g<e>qS I%bc")PT7Ii dK c 5 e ! ? S Q   ^ @ % a j - 0    y \n 7[ .  }pl`\QY:`[Y[]qlv~m_]\,KJ;`:},   $ < b        ) 9 N U rc ew Jy D} 4   v u d [ G , g N %   n H h 4 \!l?U w8\jO!w~ 0,*GxT[TP'>G)u*rIP\2 4nTVyD961i TKj2&p47YuLv7 f}cfB\7<"9; )),9D Rq} .!AYK\~y2hKf;"HJY+h=~)tmX XZTZP YBw5T6V)nT]!Pe2+*rFxe9U'"[[5|gB#j3%41G~ KX   9/ ys   ] / j 2 |  Z v + b 7 P . M  * @ S- rL xe f m ~           {  n ^ ] J N t? e, N2 B% .   u c K I / ,     # ? ; \ g }    & (= =I `d rx     # Gj(Efp$<m3H ^r8oQzQ{v}qqdrBe<K+Z)V ! T  H c  F ; z ! f {  & |  q Sp1FMW! yU9^\O tLEa$vc_k?#:WWR5w;D [|=]\ LEB[c}%Kn F tL5-{$D't]b#kkrHoj8|Hd+eL`I?>:qi$ @ LIJNQ/i5 u<kL@;-@:@9+Sia7bNNA^&% zv6TFN*t%I!/'$K+o EOw m\ kQH:`,[N49R1W,4Ey#&eBvcE9P| #jO&joLltR#h{>Gn"  Zy # \   $"  ,  ( o{7:=W.n 11KO]ullb`B4sLI*$UlrClYg1 \ > B P < E  3 |  NnOS6-hK>=O4oo 8a&e_)|L36X|9a,hVW@{OGIb2A?;LWj1{ v-F9&B  XK   P r J $ p 0  m w  3E   A 1 h  a   ,=MfbnztM/~M )  j A -   WD   Ge  p k  V "     Ae gNwx J!f t3Nq<r$XC>_/-IFiACYJnq>"e>\AU|zwS<x@wN&Bq=<@A/ : f  y  c @ 9 L  ,u  q {{pu%tAl4_3rq !nTHx^zSJC)9 ,,7>Pnp 4 X1LcFw;@`Z+]5&OXj1`%c$ME_s7[ CL h' }_ x     $ X +{ C S z  F k   @ j E g   P  D j , p 1 =k e  2 }  $ 5D g~ r  HpIc~G$F  Nd   - @ B u  @ $ /   V 6 QSR$6=Qa`u{ 3Qz (U=8}w/q  v'sp(Q'|lly},R1}.d$j~_ [Dt E6ymL d)o:3T\#iNgya<,SEgUZ<)a?2fTs   x?pEV gLPf/_]:^5#W8| O4psD3o4!Aa@Y r!X@ r?{xz#GdD|*oE:Pr')z@+UruB]Ga6of=, YrD  :  Z 4   gg!{-*trQc"hhH kuGPyn|^<Va$ h8x6I);##z\9c;r" r  j ?  { Y  AC PYXddFPI5_G3l;ipSj3P5:?;)_=}`G ^4HWpCN3)6&K!Y0z4&L7OBX  > H ) 0 h i  | c ; 2e i           J x G 1 a l ;  L w H   >3R&7j UZ UNuQ @&y`/MeVDr4O^.1'?Z:8n :C{cE) ~Tu![?:2.!/2HYj D6FmU$g`TH/C}]>!Jer)X,_n:z)"TK}i+ M*{OWj/Hc + Ms)&/+;H4qA=HH F%NNdy\Qb^qo vMzg#@\s ;Hau0Je{;kB*IP0p/WH"eDkP G G z I ' K T V   @ M { O 8 r W   M? w  ' nC~?[<wuO!{Gj!Rm $ @UesxkQ ~}jVrDA=a#uIr7hGQ[4F Y ^   w C  i 0 % : Q  H >  \It-TS`G3 ~IP k!O\N!Kd@{G}N Z-x<v =`~'6fl4.va4aA\NS@ q[t/hgnFqqBuUv({=6WK?|[DG"NroUGE*}L&|yUl2Z;& kE'vX4 ta8p Kg-g@l8pfKE1vI/|rzn{t)Fn7^ ipdB911dB8~0VS)U3sVY=;?FR\kz> N ] l s t]At]B QF+c0+1@   ;!u ! "8!_"!"!#""U#g"#"#"#" $#6$0#\$D#d$f#w$d#n$e#n$`#c$Y#R$B#?$4#,$#$"#"#"#v"M#7"# ""!"z!S"8! " ! w!F ! | ; jUTr=2vQSs?3[/~&X[j k b ^^S\ _fnx> 2 `  B  C e  y 1 : c r  * ? Z    { 5?   hu < Fp&|!]R~7zXwG~,R>fT3GSQ nM&8B3\z!q$l ?ZLAhaK-x5{J5WXZ.:ai8vB_SP7 D]zB;r.jP.}(S$:6$5QG)t/)-2)-)-(-({-(P-(!-E(,','M,_'+&+&+$&*%*B%)$(4$O(#'#&n"P&!%-!$ $>#$Q"b! U~'SsKh   5  b ' 7 X vJcNp M3Qy!yE}K#.-;ZVy$L}X[VE<-/ ll[F)-)97QSZ[u~{}\Y7+]FzwhwGd/b H' ~uSB,{tK8wyqj\F^*Q JID4(h M=4 v{hnckj&bBcM]X{vov$4b/:&PP{| ?0iO{ >+bW'FXt P1[ XE1#zKu'0^|<]i'4nql3-OT 09WU}B 4A>j{>  2MBQsb4m-h ")7WAxL@[O-TP_}Z_Y[^TDGA62 zL+_o3;$UeY9'}4FlIv.p_amFl` < K  G a  E x   /Y j D=| 7u&Tr+m6;Uo)a2]ecpJ*w4"vUK2y3B!-`QfysiHX-GYOj2NG|gg r=/en@U;)'i@ZP/Y[tU4V+@~L|?L-Zt3i>ls`8k3~ygFB 0Rj:dn.XuB?yoc/4l3b1ng+fcjq W#bd)Jq &e'W=`>TK5j5 (E@E`|C ;o,t_K8Hw$p u  3 g  ! c  [ `   ]#(W%Ed(=h0$Jr]2hjw ^=dQ%PXlZ   9!{!!4!W*"hc"x""""##.#2#A#8#/#%%##2#""#"/"q" A" "!!H!! N k T.Of%/>bA{7(m m6HZptJ!~`RP0z P t ( X % g P ^ =+:k4L.=Ty}^(gS'\ 4OfJ/iGEWF_Cm;x Iz+]+r28)L sgn =`iRGL|M4Vk"q"t5S_+FySH9%^Px5SN L0-+122@RO`y#7N@vh@AwG6$lt(nb,}"qB0Zz ZVB;FSdPrB` 7`Jt (IboAz2_+!HS^as 7s-+][xM~3b$ N 4 i   = K m  Y  W /    _ m S. s  H ]%sYO#(Uh0rh@xV:vT#b.Q(u^'#5>`W~"7=Ucqv}nP-~oV^1J6 kD{Fg/)sK*g?+OJ"` Jhv kc  k > ] v 6   : g X   v, du|=wgIZg^+NG;{CC_i+6_;& JbJh@Is*Qpb&6xU0p+xc`G$ yRwxrzlzdtdV__S_\krJuj1u 8zBZu x(S* \"u2'>ue$N;Nfq~@TWko{otof\\M5@#$ztJ8)P`)Hy0Gq-M\4 p a  Q  ~e /+  ` x ? 8  z   Y Z 3   Q U r  V / j $ ff;wsfKMH&,  sU7_>)|WKQ1<aZB c lGA vV%0<Zzh+/wb#":,A1Veu1LO}T#XJPF+BeULi766&&@Ug +rIw:\$ )HtH ) H 5v @ X g ` x*He+@AVWafjsvg|pwoybj_gbnMVXe/Y*Q"^XP^IKQuJdIP<7@6 A 9 5 )n $Q ).  "   y N 4  n G l J +  z c a S 7 Z 3 P  4  $       f j E 3 "        x [ }J 2 %   }    { c N r/ l s c \ P H <t ,b 'J 4  c{Ha/K/ `-wO+b5_;~9qEyMj.0^S#Y=AR4Hj9Ew&`Z&)HT`t2+aZu% S0|ej. rFeL vo*/Xn.5wR~ L#pdcU^OWmy7VKs5m7hZS"a[9}:ooJY.UoHN8#7t(=wY4p4oBuAz%!OknFj*?WT m)u9Zyktxpqpriplp}XVs>B4!! 2T &0,;_B_pIhKqS^H *gx |uP0m\8$l z . m  XS  M  v B * 0 / C   7xXb4  Wk(s+L4x] 3E8lD;AC9.D1-J@LZRG++N&xcJ$]i -*6/  a!  f &  @9  [_ Z ' x  I  wy  x ;~t~L>.TM{y5bWF1eOWB+1! h ch S+W,`@XTdnw )+STmb .Ox 6B L8`SYsikvnbUZL6! qfR?!wvICrT&z2#>X3$OfpS34j{s>js hG&+O-[+?pi;>a9}h_@5Y'N 0 )16F Zl*w/G`o;Z-vGhPNhz/]UzkH{6/+l)'{i? Kw3Fx(|m)uW7<2_'!W' Z/{soH[BY(*whO- |  _B  / W M ^  i I  c $ S\   ?JG 8l~ Y " //JPWfZ}einb`bPI0"tn[D&xP)X<_A={={@  l . a # O  3 ` ) d " } Q  O  Z % ` $ U|;E%wSy,ZE5q?sQ"kvQv*q cQQ?5r5K0hCF~hX9nRB^%gyYT; \g}H9.vFnk_.- KoQG`P``m/Tn0Kd2 $Iw+o/q-b-YJ lJ@p>Y%=- OBUw<~A 7HsC\MJLmcIq~nG&%2 w6S+GX Lj(Kw/pFm(5<AZ2?(# B{FeS+RA3QkP E!Q@FeLsXU$xF.[a6\/aC' R,,d $&Vv/VjVei~q%iV^6xu3lg cObTx  { |:   s 7 K  | I  `Q/6R\2tcI #5($.6-@TGDAr"ExQ`3+//_  c  7   \   `  O 6$Sj%@`=v8c+E$8N7q>MQ{K Gq1.5N =wH6 Z9)03DQ_w XDzy"qS)u8sO<}:z Mw- V`%Co/ba L>fJd6SsnYv3S8<RTn+AU n x*A0h,4]V+jg"/X`@j2 levRk5F3=4&0)'%+0==L[Xtk6Lhi+[o36 B=_&b&` Bi/^. oudlAX3: z%ZX  '  I ) { ^  R E  " E e r  : w  ) ? GM G'C8BD-R!` M V W > 9b #=  v 4 q J  s 6 D g   T 1    R=   `[  }u2|Glek >je"Z ]Rr\'xB~Jd)G+sl\8)uL#h^A:7yrc e]aag-[>f=}Hgj$5>JUlr@&S@{Kn;Xo6$Oat kd9lN lG)?uy3Ouq*/BP .qi .3XF_ s$-5]: f< 7Ps cU.%JuZBj[(2"2L ]/@hF /@Qfk>% { ) z =y & { g ! B { + F  #  G +   SC   uh  wVuR m^^?@x~M`J]]79%/1R~OjD17BWnZgvWz>C51.67G]az ;czkb.6Toh1U M ZT5uFd%ZSqY)|K$hw(2jWA5tv4od.<[g}*JY,8t3Mj ga_w_Nh Xz 6r7X> PiZb0zl{Y,T`UYGfI[.Fp%^? !=/>X6v3Qo4l)8 q   TG p   1 p   : 5 1 1 D < \ @ t & #   L :  y P y ( q  k V L D ^4 F0   g@8}yxvr|nvvlupjwq\pnf_ub_[b_oVjPlCbJsHmFg3c3j.v#r!w {{ !/Caq"/ H$R@nWj < W - } 9 R p |  1 P |     J  Z  }   r W -   X i(    TP #  \ 4 /~Z.yMEx(a7kw9*v#{: ]IJ? Re"GJ8BW/{*pCt(k;{njy9v!HX//uoSnwt3,{IHp1'Jj J]#t {!iJ [h >}o%j:f E-\)f *:<:bcveo}{zspUYHL/FC$ z]I=yp~rlnrn~3TjBZEz-O$e"'UyD@.uBJD)zL>K(UB =0_`2["/G\ t3 _ x     * B V  u 7 K Z g  % 9 _ w  $ Y w * H P [ w 6 x & 9 5 [ }  T .3Kp,#{Kb`A(7OMk{CegMnV4m+8^?{.E 9 q :  5k  # Y o + B a {5FHCi+q7Hj"D,Wk y_>vd3.n:{sd4.e]J%e5^JT,Xn6V,}U_4To:]%NrTFfe1(^.MYf# y6@G\ AnBM Y"w? L#Z:~V6~aQ5#y udb`ltf !.?8pO{C"H`#P"`O?!usaeappDV]-kcB9y^fSZ/Y'N(^^e h2=Pi6Jn/W!pY  q  9 3 M \ d  m Hnloi N6*<CpM/)G ,Lrb3qF ;V@|)D`ixwjj]M@+gD%n>mG%~S,{AGN*f3]~+? `UF'wsGB lvHH jg?>zkK $LiD \/| X # E   u >^ -   {q K@  ^ Q /  x h 9 /  z v/ C  g " A  > }:OoI9LDC|G&gG5yaA1s]3&^Ot B2YNwA-1BRoCސc޲@?߇$f{(1sy kv29h |%_ v0t@Q REfN' ;e0dNu/wCMR,R dY};R (y)>q97s~ R  L o  < w   I 8 h K h | # H s 1  F - t 7 Y j  = e  / R y  : \ t 8 k   " A$bP' N!Nd0W%Q!~%BNi1ve3Xsy16FHX~`ylbt]jPGyDz2)#wpq_XJGD.+ |tdNG/%kWXf7T!)mDg N3vI a2a  ^ T>   ny #8 } : g  5 A  " H j   D3 l-~CrX"G3l VE1jVICAK:XGA] wHFs?E wsC`5tX5|[Z;.t+\J . u]~Eq4U>!|Qv;=aV- V[2])MVBj5qsh[j*\'sVwn+S<jl#.yZx^YQiL_MIS |85J:}KQ&Tj^S/Fwg\!.WsI}TTGFPn0Uh|EA t]" T6VKUTOM1J BT   5  X  l  ? ^ I   J \ k ' Z $ M s  U  >"sR2#POxl D`:R`y"Cd6 8-D7_Sp` *6&E"JP*c%cqh q{yz}|wuvsu_gJf>cX$Z ULLD<@*x2dK"0(xW=#oO]*G8n= v 6 Q !   a /A #   1Y   i i 1 0 n |  '  a K  8 ^ _ }-!3=O:Qj+{r_ I & h@"0aGL^y$m2XJ5)noQD?^+:,56w*@-[ }2x(HZuGB}M`"}OoH{`F@)}zwew |y #55Zq CZIw4wJwe+iR2!j\ \EM-yHiR]_ Zo#X{6NSA d2-(){6n=^C ^3]# _q nYn<#x0lAZ\9ne P3:E+?{ + h  ( ^g   W > R M Q  N A 8 8 | 3r#IaJ0]!b#0bSl +d!<[qx_x6b$D `W(XfIE  r >   -.  o ; E 0 k  | +  ra ! ~  *K;(`gVQP =|H}Y\1C(|sSHE3;AA<PZa/=@V`i|s@c ;DQ?^Lqw',v$v)hV?%{oRC.`I, fS*=&IYC(6Puz_ &=Wv>r#M8/DdA,\n eO0m)|n>Wa\(T>X%TryVC3 sv)F9hE&3o'iFB{&[;p2*Z`nr * 8 > M M N Q < E n0 d# A 3 xH._G4m9 jnA1KaJ]o.\E*f 1zGa#\J' jJB1 ncTB>  .:F^e|7R\79`e^q|o^eOe7]&ZLD8#'  fP3}cubVC%-~_I"xbOC5v3Z> 5 seSQEE80224'52@!>6=apF9t^ :qGcDs  THwB;Oy&E s-Gu 3W o)=Zz  $4E"H"BEMC@C-,% fO;$e<}J5S!t= Jv.j#Gf (OW vM |B:Zj/PbKm<}Ro"n _XMFL<>hBlNfSkbkcry#F*qHeAtB0nmb-Z741a{/?ut%kf RV(`P*fBl CWPw  8@UHuk1QmjubpSM4*b[25CP .j+Po(i8]'O-Y}@RxdI-&];f @ `N@80&'(f8Z Au/Af+h9dG?- dR' t-O{hu!Elcy'r"| r3D OV`et+Y&XfrVM0h0H }HjR4i {+e:qTyS(po2WJ ^5d"^3qM=(mM70 %!" ,9-V;cIuX4mBkj5vmm!S; _l9br6rmc7FS MkJR VPyK  5? Zx     1 E " o : } O d |   > O ` s     . ) 0 4 H C C Y Y T ^ b X ] g b a _ P M K = i 0 \ " >  g 2 m  A   ;  j:B Oy>?`)j-L *m/GYO9Mwz=%yP@Rr< aEu@ ~yryw'CT|"AV n,5T~ -K`|,0JDB?B&&}Z6g5j/~;s1\ L0B##`g P= w RBXZ2K|&W=}v \F  @Vm;pR/ zv$gCHX'Ao wLe& i N  ; 9 ~ q  G ) a v H z  & 4 M ` [ p        v a > /  Q . p ?  c ' i # _ j , )  Q 5 ~(+zO' uh#XGMvEXjC&HJ%b5w`Ev)L!4  $!2"<<]TZbty~-ECj qmR-xXF8%W5 |da6* tiNC!]W>#Q^+FT*qQ6e0yP!k]SV08&q u svqjx~0Xj~*47>B9TSRr`Wczp+BXn|%/*>:N=UV[Rfeqjs5O~%>SL^cx)Z1Mt2x";emC@w _&oK70\WJC!fSR/fOan'Qp)@A8=33|RV+D Rl9Kh0y!D/3B>;.t>eXSo%AQKsU<FmM>b"2qYOJGB?!P3cKe^t7=Wd ^?t;3g7s@}=v^?{ ?3r/1mk :L}#A`p!MLr$J~5^b| #In|  " ?/U4c5m119*=  {pTyNn<L3}V[<1{LM&!r{ZM/}xEQ'g~@Y/ mAr'K: rjV<8 w|uv!'""0+374=)/ $!%% R/eDtHz ? KLl9*gyEj^l!'{}'G.oD? j.pG#sD xXhBT$P0/-)&/1-4P [w*h-}6x[M#v3r$I|#RBcIy}Ab)758<C"9)><8@CA8=$:3F$<#.#4 ~]WC5& w~rmxng$d4QFSRGeOu]BB524' $8AHGI[J[\SWWSM]BJ;4,}vQU;R"}^1V 7a0V ' ~b`(+zQPtCjFn< ZIU2 tW`ER732 (!)02CAgVylv*=`~(2Ee{(j no6EuZj/3Ju"Y7 lIH% -2Pi,%\_ \=n>/tBX^BK SdkDB:Ig(@# p@{(_XQ |Qb+e#Gp64    kW   9  E r 0 h j _ s @ ?   H O ' ^  W hu'a0J3+|+r:tR({J>PODisplayCAL-3.1.0.0/DisplayCAL/theme/refresh_lr.png0000644000076500000000000000235312647526531021400 0ustar devwheel00000000000000PNG  IHDR w}YtEXtSoftwareAdobe ImageReadyqe<IDATxڬU}L[U?Gy-f -0XLl(c.2Z0bt1Ɛɲ?# AT39 e-}z_Vg%}y߽B ܦ)k9T 2jncrnqd짴_ďF %&":x_Ny NwS*;gxfI<+gMo3xA"c(p֔R*2Tɘη'Ĩ}n/(~ lj *anҚ4N!#m'\7 h^ '=7Fٺ?5e٥,EvaXJC^V  ~.3vRz9Ź P"<@SݩrnwBWpHby| yۆ1HĤE ^؝9YIE@7e%rC^YugkJԻ2O1p24@Ϩ%$ oCAAze7t4;kYS̆ca6W}dd#6;dBI4qt#>4LWí%=^0_RC,RO"8 1 Cp4o?`6{¹Py]Wm KOƌ|U[?akpƠRK+LK%DHGɲ|x#!7{ŭrϺ-RoIENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/refresh_lr@2x.png0000644000076500000000000000741712647526531021760 0ustar devwheel00000000000000PNG  IHDR@ ~tEXtSoftwareAdobe ImageReadyqe<IDATxY p~}ͩkFalT;8>0)٬deU6]e9N*fڹ6Ka !68@H3f$4{}IH2ލW6w`qs{> Y..0]\hvSk8ΐ׭,=m%0M1o7p,fF'ϲg?#so5 H/Q-sO^=sBs`֠7 m߰8n֏aJAP"]~ە', 3s`yxni ^9zU^`qg뿲dnC~>xև@Q a[>U7޷/Io'Il?s_pKyH 4Ban O&q>Sw/xf7h_ƉJK@@* $Hg4W]O.̓ 6І$4 b2%`˖p$ʾEQ" qȀ& G[.{~mA8,Dy}hzn3@uxv?^;tAE ɰܩJA7LQ<)RSQ6æ5H^k_ h[QǢ!ha:NP=h]O0c H5$cҫf)o+?z)hfhv{XVIpEk*kPk$"KcrBȈ6[d<8r,ڔĔXUC՘ި'mE'ehSoܔm ܞUS*OV??}k-PgdGzzo< }%Þ?[ ^nl{՜zU'gl/ݞǾ*ˋٹXLmß%lZ^x UC:JǜvDh^cfF﬘#3wVe`,0ߓ.'F &^SRQ aâ9c-b'}' S. (^É8bYV ́(d9EC+)Pm)n).BWܬ`˓,\{ s՗Vm FAn"`Xh OB S8I o8|D0YHajJTHSAOm *UT]њC̀:l+0ّ-(^ݞ_Y1͜׮7 OբǴB|hzA ۰\[8 mVqQLMF忦Hvyş6[7R0z"cjϚs\)NuqUҸh/D>ùujS |^;ʦOa§FBPlnNkXaz-lW"h`fG±8:#s`6uښmCsav e߹5uOI^¹wܽbpEn;Y6+(rL,?@;;iAqv,qŞ%m"ƁK~pj7Ps3|ډyv6UZ M@ FU0mJn1DXQ#"j.!f#(b" p4}LQ필+q5-H8D86ݷ]z$t;WqCVRcF6d3N a"lZ6bsBݟv Su `8tj,: L=lIa$GB5Gjv'A }]]+VVRT5 :HFl& a!LaYW̩ 8vznO.6Q}o(<~N2>b~ބ.]E" &pck ~􇛗 ;Z{[ۦ-[$@d+LB6BǏD]?bųcYs/üBry(,$9pZ&c?@ޤ57 #kt =@JѹċO/J.)R WЋZCǶa Fc%Hd;a ,a"B@'~ ʄ(K!?A{O g6N0Zp=yz>gd>hZf n`[Nw{ÎָyjK~YʳX9qZ}Fl4XQl' am{ei݊eLffn3ch;0Z_0{Խ-uF +:dÄtxiPj: 3ahф!إyҲyxokO:{c |~lѳmƯ@Dž}zsi_L{^9乳c8ՀEރ/|~a q^^'MD.P>k@*67MzV:% !e`\ǼһJBO1l9 ;96}2z3(]놟LT`g7l-LwU/alf5|B+g@wXfWH,D>$DhYJjC7w7vI)x3ooSďǚ 0gwS = J=P7Qn55A̵Y-jĈ* 󝾣k)98 ;=sR֤W`/F5d0x7NDwAn%Z%y~jjˋy+~{ZM>撂mpgrvLN+`]K$\``84%5܂b-SL;ɇ9=!j.5g(]38Ւ)t//] ]W 6}=7" P0tMlh\D>-DHBkZR:PyZͬPϭ"K8r d=d)vCDIENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/shadow-bordertop.png0000644000076500000000000000021512647526531022523 0ustar devwheel00000000000000PNG  IHDRttEXtSoftwareAdobe ImageReadyqe</IDATxbd``0f 0,@KF ?qjdj$ A, g8gIENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/shadow.png0000644000076500000000000000020412647526531020523 0ustar devwheel00000000000000PNG  IHDRH-tEXtSoftwareAdobe ImageReadyqe<&IDATxbd``b ?k?t:qhdb@]] 7܃IENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/shutter_anim/0000755000076500000000000000000012653527012021226 5ustar devwheel00000000000000DisplayCAL-3.1.0.0/DisplayCAL/theme/shutter_anim/shutter_anim_01.png0000644000076500000000000002223212647526512024746 0ustar devwheel00000000000000PNG  IHDRX$aIDATx0@̻O4/| / k_[;{??G?ы?~7X\&܋{L@v#x30|߼}i4x>د|+oD M^L& ;-K-o o/g?7/_?ߋ7p,p.Z\S2jag2P (iqhy O~ߗ?_/ŷ_ Zq.Z܋߄(ex, H3Z RM_-oMϛpo_"oñùBCY8-Z dZ=Ea(y Ay/~Mc3m4l0,FjA"ñ)`܋{Z>12RV~|xF5*WH VyÚ=o+yCPi\< c~oSܛ2Pd(+eKA.'c]-|J;ep⻞c4k` sд~/ęԥn |}%+rZ`R2_Ɯg]8 t/8FX5Z Ay{^{ׂvUS碮]j փO~`{yXI5GX#m =@J5A>=j!.C]Sp+Xb1TPI,52y-pD@z-G Z <[Rǒqp $#q {Q甅6@r]zhy✊Ցp,H [Y|#/|բ.9:)`ENDaZ űb(5U)聣j,Ѹr fcMRH!1.$VբNeݶ"O H.sQ @V0H  ZPnG*ej]-uZ3Z=0zYyVAy/51Ж:o5遥J /qZ )ZZڴe,h=% K\֣&Z 7RCԀ B9XP,AjM-"b[nQ;FWH% J z`P!J1ZIq/ѽ-RS()ZQ]\dJq8\'Ή`ZXJ\k)ҿ=Y\,bm!gYY] L#GɵʥrspXhR(X]\Ir)WŊP>ebj2QZUٽ֣&k5 qe) V `:8]^H_r9ͺ5=Ǽ)@HzqܪZ8b-Pg#Ơ? qj[[\~8@p:uPۙ cj 3d-p KD@x׻RKqIxdz.4 7v{Ho fǍmx2agk=JYp,Gݣ7\dz:ߍI/9: Q<+sr hQwQo5iDWXR-VĵiOs٬4Ekҙ-o46XR`\M%B%`ozl(֬[>4c 40R$4(e=ZЏ=` 8 (HdE4lF[q+CnG8yT4ߍD)$nV Hk 9@r4't6z%׫$,nD|wda8 EtQ[3X]ok/뱔Rs(qFVH`Ej3Y\7YqYZ 3+lZbeHR %8HR>Z:n$-nV~]63h t5z8@;5̷-d$#q:mg#{ЭT2JHOHmjK}5@Z@8&I Ɨ F*N8~HrB<1ڌusd  {;9@bMs 1`]Ը[eEՄC{ V@Fz&jܫ58T&-V,7GP~/)y@*!&-m-փ (\׋7$[ݬ33Yq D9h;gi!KjIP+y2"@OYu✊5@(vX-ĕPF%c>n%pA(q x6Σ3XX V@}4 oGFjEH4rvoGv$:|xHآRk Kr: d|jo@xFO\^8dT>ڄ+7m1c>R\ڠѻg|1 \ a3EΫ!K$eŭ ܗdc#"$) ,'S*U؈a#t"K` H9dz:m+€9WDh?ArDkӉg6*8iasb 8:# ,wɑ1Hgs@WAh+qSye :GyYeGOt22ݎЫebbS; yQ8Ij(nWC05asښ&g!K=܇F8,ғsr[*=q Ľh;O9VK[W5/d`EnܣֱX Xc~ڗ!sC|/yѼ#&K=94`31S5hzMB(JpcF =w>H:x5p =x~ A>n۴=6qn=j”sҝ4Oi6uMޑ3 .fE A?٤Ҕ[B<~sF!zbX eDG(M=`d)O>@R(a~#; GI_rbgrn ~GIG@B=N8}dYUQv@A:]qyx&L ^ޫXߴ8 ]YQ}P(s: bwp%(9ŢoPfRul#v,=3Y(Ӵd]-5Ҋ 9kֿuY++rojuG0v P1kch 4ԛrrڼ9H{VP,-䌵yl'qKp;4u.SnueE w fWww >G<uP71P3 SHdAl3x-` UAq Ň4xe!gYG}la*\q)ꆗau8Go}p&.A:eE>oS'Qܣ뤀\qBCkAye4~=rGe@)G.Oᤤ-{vc]n OjVuni\6Q='O8|L7?VftẉܶI7n}ҩ3tC|B(Yc+̸Fsd2Š8YlnpG-?sŢ+.X}Tq( ?,\>r-V#L%@"[b=ֲW.rRۄ۹L1* exnfmu8np6Hz$H+ȡ%O 5ev,e3+R =A0(=G/WOȚŧKND3H%$n])x -pԸV#Gpt򌱍^"RP+VeEJp>~2 ri/$Klk:qǞC\65w8?$|3[&kziOw}+(%p֎gw Z0FñzXÌ|PݧdҿԊ^+ZO})UI+,%:smKpluz}-PV?sc\JA1(mmojZIjI hjF %j9qOW1)zJ@Jy-V2\f(PZ(H8j\aҞ_Y uykVH@i&w^$w#e=@g[8z_y(T/VpUu" 0zZZX\#w/ H\:Z[ۦ_d"'r,5l\z Vʗǘ2 ~uVČp RkEֲZka~)^&9Pj`iYjlյp;=rURExSbQo!(%!C/8J_l@J/4) k` ڄ(n#Ҳ>gq @bFIH%:T:#FIԂRKh [hcd8ýu0\URh[/e"w)XPJOݿFh;m!Y/ HڻuS*)*{|&k+k2[=֤5Xz@\4=ά+Rc]+YS)Ѳ; Bj7P`5VKfPJ@F@r/q$)uwoֲ9ꒀ,MBq4Z( ڠ5kJ ," 5`8j;ux4ZVKՊf֙t(ڠP`Egb pb&|Ur,Z(:7hO3[  J8rlc1c(wҽkuy@[m'"רd/P`iVjWM2V;& .ʧbgGB J xIY*C [ᰞ\lrb9qǥ)#p;bj$k$XjE@jȁQ[›Xqe) Eч+ Z=՚,Rc]۶E %QG ȵ ̡B8}8. Rq=-*$cp5YK05BFHSuXVi9?, if )AbvK6Lƚ@eBFՈfJppϥ Hb8~0kR J pqX [Hp/g!ķӌ/[AaZ-``r85HI,tu>W7.iqZ@)2# Ps7\5\2{t8 5H4pP;\PED E+K iδAV=2$v&[w7.^5Y(pBQFj,`7 Zg!)AbgRfXR@ǵ&5#bʻtgHc t*T1ވKNgaA.\1C˒&v²xlbɝ/h5<U6ρp<4 %Hb\-#JyR-ݮ%PZaiU" e=+Fԥ1^ɥzd85HR7]&fx$([Iu`!9Eh\G)YKб[Vt :sbJ- N`ĤFNGf%HL`< 5ք5JQ;rY3`)T60&ϗ+>xZ@ B;v|EPK1J*k eIH:p`ĎTOkVxJ@ IItu!6A6,a5BT:~ ݧh]ʗC~`jj<#O H5h- ԝS!qߧ 4{Yl 754-TfrJ kkVVl\?M,44hĆF\lBY,oяvf4@Bp<.' CQj瓟ӟs_K_қ/Ewñr9G3x %>O4/| / k_[;{??G?ы?~?p,῜sqN5,A3AFћ3?o޿4nJ);p hZ_-E+w"-hYb=3:A75<9cX| T%S0ysS 9!G>hR7,Z@'+te5<ՠ!D?0~Tc  fΦb+Q`Q=i{^#(tЙ$zFkr{V8hT8AvdmPѸH1jp9Fe t~:35A3]0 %>*T' N\=Xjo}[ (L6&CWώctm =S'w+%V^1 ܄tb 5 kaAhT-09P_1GW *FkNM59TTT,A&.4Xs rPRk{nѱ.߭e& 'A%^d+iʟ'/AA8Xr@QӠf8n]lviM!Dkt{HnIEiqȸ8 $+C`-VF(:=JΚģCtNѭSp9׽NJ@80.s;Ȝ 81jlB!z`Ex#`i&NT9 Su ܞmbdrgRX0J0QtEP;ct{E =j{a4}; V(K/(15:w;ɣ$HX?4'QqTR1 9akHPrY.'|::qQgKL@YUaoE l F%/Z50Z1Hh+#`)RkM2{@HB[bEn\k/[E0&yԛS-E]E(0XI5GXc DzhkR$`()m uMåkx`EnW(Ril@%Ռu` ={XJl$i ؁c;#^Iב kQ甅6;z+r@baitY^Q[PQQZp䠈BI`ZXZ A7xnߖXı/B|/ǟeEngvQpΎ20{)%4,RVQrr-V#g!o`R(ZD\A|A^J "n"6@tx@0qO-Īt܃{[ F.RZe(e?uj q˕>ޔYn)l|LO=Jj5՚[U Gc-p m k1 5V˸H\D[M~:k*L u浩]V둋;ZX m4H؏5k½a%/ARJaEbׯ [&== JGB%X]fp^<ͤkG)kR<˽$-lgk)x/ARDeEbwcRKyp$fPqozD׊WzD*޸Ɲ<;I+$̠b͹\VqemS\6)M-At~K㏚.! o ̷Qj7@CYz0M@%`o?GyԓCgCL!)kݫ\p{zL\=ֵ֣ꁃ5|R e`Qz,iRkVWk/7&|.9iCO  a7nc=R @px@K0J?ExKɊpvB9(snG(Ff ȜČ =Vp{bA5qJ+$gZ6'8vF+mxń̵EQ-cbIhBRk=j]8@EO0&ܓOj {]q0 q8FzNgn#&-:z.Bi{zt+b?چXzxƴf*&.e=il[GYZ0ޤCѐ\Ɋeؔ܎9Q%$>Z- \3m/r: IZd рPDq!+I@!Jn`õ\o(ehVv % Mn=pxVH`Ej3Y7YyY3+lqr9j=ZC[}`{@f}l3ӑ!] НٌG){Eu^ɽ4r-bL_#$uRPF[uڈYoG[淩d>>m #w5@Z0Uph`D_1ܬ&蘈us =+GSK(CrY yh}T/Ӛ ^Vdk<3L!pq CQlur: 5jz m1M㺽V,7uDP~vGm*w;*ˍD|JntI ⏥ ǺVAr? W8'p%HYgfrvxT<|I- u'5@F襉|"5@Ƚ8^;gE"${%c9?\')4p8`Z4C#pp^P>q@Z^#{ۑ(n%(H{=w}սBh{YaPn'`uF#M5Xx fIk6:d 1>R{޼eq-'6G$8i @¼9Xnk `, b |4@$$={+xʒJ6j V! N?O{ZD6!qV&kwvlK #_8e? MK80;yd/H@$FsP-eYvnqrٸsb 8; ,$G@(1Ye9RΔUk(1m%~ 4i#1H% מⵀ3k}_9ӼО8PHo"{p8H<,riX= t9 qжx Ʃ&<:umə#sL:`̄zO@ȦIN9FTkvrQ*6غ\ j,M{ojUsUb:C\uLwi,7Q%2wbPkt&Sսe֎zl^AKNȧ`ʝD*%,: 4^GGd\H6sנ׃pjӂS-rM)Fؓw/@Z!X֩'R#Gc,7rE!u\QH9>],5i1PC # 5q"G5 Fq}3@IX}' ׻-H9{|1@92OH,tiuƮ&#ܬVH\e%d([ F%VB{j]MoHnr YQ XfȨ}rp,.zGr}Ч۶/籍8|dP@dLvuL >9( \^Gΰh= `9,ub)I21TPo&wz $+;$FJz޼nۊޛ|YO3XG>e@Aϲ"%H☈onp43vwG=8SM:iBr4 {=k8 ]*љ͋5lI Hiʉ oCβ"O4 zؘ{0yJg?a +F>㸆qя>8!nAP ^qV$\$^rpt);42<\2qD'/vy[Q̐|9wkSnOcp ǖ]9XlmSP>w]}{AJA2ZVKՊf TȞԀK-0%A׀Ah8H۱q^ }ku9@\-Gfj! J8t`#fbSWt.R;wAw }V񴀬A>|EPK1J*k]Eo!"٬#q`5Ӛx68%HRk3]}#(62UE7ZFL~w+ +]#!C@)Qv|5i?wwIBo܃n׺R W H (::uCK״sYӒs,ctz]t˩WB..]: ]t@ttҥҥKKH..]t@ttҥҥKKH..]: ]t@tҥ裋7kp-ɵ%h:()_oy睋rM^|W_E =wS⵹Eh(ek@d@Q\^^5[ou|??7~?_y7kp-)@܋{ e5eZt@f!(% I/2{ |/~ϟ}kI?bA_wFkpxmgB(ex,H3Z kH?K/ӓ(,/_}o=w׿u_ߦ܋{ emhײtP: pւ.Rk(#<>~QnغaXԂhEM^QC(#esgYS!cԀA`Kj2C⠨(ˣ|o*=ޔP&GY)3e;|g*ϳS;H+!R qwPBI(hARQHg|Ћ{zr1sNPogYx&c2c0{!%( .JD ʔ*'bGeFks=y59'NQf3,<3 /^S7X1r1V`@)fU   (Y<7Grhŀgᙰ4<#jMP*wɚsҜR9J 2ᗣ01Px9@D?duҲXyg=:.XO] ( 5OzFoW`oDko@c{Ub9,1vKt:n c֤rp䬆t{2bK⣧`ܧ0_hR7,ZuAP7uE9`YcM: W`5Ph5yFw,!Z, EԽZJ`yc8 uD]Qg_&q-Zӭj!CCB 1ƨc ^ փgEY !P뇺iM[3]0 %>4' N\5R(O<.(L6& ԩC^;OS&.n -{rhXh5MH+@Q(r_ܫ^N&+њP툨TT4,A&}/(HLN!aq),9P85ѽnc]2ru@vFr WҔ_/AA8Xr@Qиs d0DKkBR)uKSԹbޭ@rv8hHJ3;@)4 YKͱ-P(U- L%gM C:nCSI)xle}w'NKAAE*}$KjM@i}:v|/6-h[t pn4n#4;DjԀQ C*(U eȚ# uL]^3HNsD8b?04`] PXʃ>xq{5,SA`꘺}Ŏ*Br1֭!2 ‰v4>o, F 9ѽj%AeKtEcG AYz{+edSh0j5ErN_"KR֚!ei!Ѫ In]9] Ϋrn ;`|ըT~^$b`ZAbMkA[Zw[}6˺!Z|ըcHӕ~Ws֣2kBb'%LӆghZJdBPNQswFi9X18{I1ajMZ-13i3iK AA9OúqUc C MpJ`H ,-̅ĘqƐPw eNj5"+wf+Pblfh#ڊ6\owxt?ivb+րcI0Tv{U p悲$t)mFiئGGNGuҸ ؕepQ"q9VҐwv!mߥxRH* eMBnFpCEǽz'h Igv!m#G9zZ9Ukw3 QENs2(d*$Npt1w\; ȘkECGAbV[Q`~0@3k2ʠxӶGwNGZV[~L;cj AEnV#S`jM@R[$mE:zP'pxoJܱ4c` )0Ľ-`L mBkɊ JcͳU\K}wq|S- \Pր]iSږ碭ݢhփT;a-j;rqG V1Ɛs:V`Z@i&%HJHB]5Hm&F7K=7/ tc@JKWip.)q+ch˴'ђBlf}i@}@x/NFl}#rܫ1A^F)+wb8u@ `~ *!=>m p莶 CppݫV+5tߡ#6[`xRzNmeEՄM?? \*fJ?뱏xY#ꔇS8dMN[xyP*GpI Kizu[+q4*dhfqH˔tr;gh#×ԒP=znb"p pāDm* BF^r.g;\q"<z6wڹWTkQ@^, 5R#riAB*%ڷ U{Rqt*Bt$ qs:Fw ܷ, 3Vn$E*4w)&-(yٮz|Ν)C5(k`P^7#"$) QwZ@<^_TZaKMs*MPtJŽr:8BF&kw;Rdg@eɽc!Fyb\5A] GŽE`WYcٙ䴏D^c ɽʍY:s]o2H7k.;йtw @tMP(wo$!|#eb]q &T$k. 4ܵ ;7;IXG!77Pp8 &[Lu5f*(t)2mq8]^MN5q=:~6:\ ȐP6vʻkeo17Hzz0޳y,r+ktbs6/%Swo7[0EERݩx,&8bN) ԉ,d H(cRܟ{Ԃ)פhJl{H͌ޣeSVR?<ĺrE!:1 u*JXrѹLYgq@W18w.k p{ :kcW%,!{G]ۯv"uTw5ё8d 7YQ 0T昛 -VDHvg]j_,uZ[틥{uLn ,*Ӵd-5ՊyHtJʖ,2]Nfnto,-fN9Y#X9ڎ27o{y'4)Suxҁ^V$d똄kƌ}FC7SM7?@@iB5 KB.)[Wkx㒀G uehURrbe;rD+rNz)#۟S^1ΉŭIkIa13G: 8čm|],b8d +R (0 G=h#3B\*( ʸWܰzcS@x>NXwv@X% z+ SZȭK90Q;rn" b;By s-?vĕb4 YWSD>#XCPL`T*uE"e^N7k=ӛ$Yf @X1HG@ W@1LB&6#WNˁ1i%ԁgCM2f-p'Dy1u ep(d*rZݫGk5uV,JkezH'udj7@ hD9T [Y|s{!w+d`=ҍZ਍;Z ϝ&Z!ӹz{X]Ai 26 ֧X!7 15=wcA\PJ}W-jXRjהk482)SnM2f_jEV$B fԀ׵CH)&ipݫxV1*aA}#%8}D]!If BPic3|SH 1n`5N:~,h$J h~CG[F %ת4A8 m8svs^$ ` =UkE&Vpk OC ZKA(ծҬcI8jFh3Y۞rNңWq1x 1}\o(ФYy~3hn ظ%:uao9 C3|MQ1z \%IݬY9ԂRKP([+SZ s!Rۜkz![G+bvˌVH)$s@L܎=t1*b 1BwV{ͩ 12\qڬHZIXjE*n Zj̅f\׊ 86>{ǝSa@{)([CTh `l G͔n5pr{Ҹ`JVHjZHjAF?5p̉;rhC~R`y՝4^/bjAjIj@)2+S-Gkܑuym35)ЀQ?uF5!Y1Xj7U %X̶r,e1:-π#T*L%eք,Sq\@1Ɩp8{.mkYsuH@TQq 4-Vd)HƬ(53P90JVc 8j]lu>mz$8HDlplG@jMJL )]o X x /7!jN5S!H&%Xj))Íb՘c9l Њݵ:, e$s݀5j㑹e 4[w)Wz` )wњr: V44mЎ I (C3$d "Kvl\[tZ!W#Gfj!YVp4Ǯ5%FÔ]2F $k2K 0xe"Ś`p;eCqJqGdF<ŲiX%! J xp?v21,.k>wR<ºfPKA2fMr,K*a#9P(Y9phMZk㰀ê % SHZ(%Xj rڅKk~;T10JVk9̩BN88 P.$q?-ϩpԤ[(%X-@ A1FHSuXVi9_- if)AbvK?6Mƚ@ K^滵PQc5٪s(c0#q$7-ŚԂR+Y C 9`p8}Du8ZH̞ft}(x XJ{UZ(qGMV@ 1&!85޸jK+4Wyc0h#Ro {e,es wp\ chP\)́eHtvԥrA}+mU 2$%6k&C`iǣZ@ՈYo ҷURD ͰDmx#&5g~tgHc Utbꉃ$N]3,9k>LSܮZXjpa CT,RLW>ƵqՀ q< zozv K 0UoZ˔{.-PWZXx%z@ I].zhM*qxIPj!{΃s h#Nq.j|N.յq%}#:wˆAg\$,*#5d FLj,u5z%0nk"hMeA)t/^Kز0+Z1}v&7Lv r!ϐ>CtV؁2 1F݊5q [x kq}?|&0I-bU (CpsEtMﻕRP~о/&cJTh_p }st}]k-@jϒ& s!dw(Ɣ|ӟ ___+_yKկH|]~o9k}l g^K_ҋ߸[ߺ;߹{߻??G??'?y/|w.cqL98&AI@6xpM\[/, "(xO 2(-OyDX_w?_oo-XS86Q 3t? K @)QHA(#Oo?׿Og%׿o-[9 ڸFk3Kt@'o~󛗧 ˓' ?^{Ex>;|sqNZ>64kYdZ=EQTJ8կ~(+غaX҂hE-\Z5r|{Ҫ$$OH Vyš=oQFи8(*ʅl?2Jh6 #p-H)*c}Sz ){Y;µfϸ{LA>&(OT`r■D*8(0 g*S(JYwqD>.{㚹v{ី7L~?mCM( ŬXOO0C_ @o@W `@z]zjhŀ{ឰ4#jMPh*dMnd54.oL(L #o- x+\vuZy{=6-lN]HnʂoM'7x#Z ~"*Cjn0Zp%f6m S$95c<=G/[sւ|/cL l⁶Mhڈl& 4>8%D0-VPD!07L¹c8 mD[f_&vU8P: ;Z 6drh\$`+ )o{ !PhۇiMh[3]Wv58 HXGSAgx)˰5e zf.p 5pĎo0t`] PXVO\Pb:6isW_A!9kLr@"Ut? ,xcM0` պpB&(,q'N=ld%aJ8|Z!N%Bщssw b@\(&ڞ>Y,pXW4XRUt v ƗZ0(8>яr&2ǚ\}@_niݝ p>MCeނ-G ǘhcHU|j52kRBCLKË2Lr=Ce) Ȍq$nEi9X w䥸b)k2ךZc+3KvaaW8٪Ak1!FI2j 遥78>J& qGlPFo)4DZq:5 ! p=L-?s 1Y^v/nG}F9X@bQ8gm`(u [h@YgrZ@Jqaӣ#Veh⚏պz'px]AZpL~c{q Vk%$1/u[p#YshyֵEc)rT²- qUzkh:Z~;wE?LwK܎`=h8:KR3.u0+j pD@Z)0TNǏ *s`e%[ qNǜ>Z2G[ 31,4$Pfv!j8Jr@3^LeII;6B;S<i]73pex@Pָc-VC1ނS NjUzacM@qV Յ4 UzhءA#7' PM\D@%,GO>XK+C=0FYЭZv=[2[KpDE$K9ZPȜAHfEH"XѺ$ C\#74accVp \l-g+-[iEhy 5k+f{YrO ܛ޸c 8pkp`Cz[X5|#U!]]5a2X)<)  Cf=P{,k0SVrW G-X pe26#=V-q ]o# =*KrvG9uO(FkUKJ< ~ Z}7\S,wjeUZ[ycZpQh2&$=Yq˙OoQnQ%qn>ILUҺ@uܪ2e:I-5n-qzE< tp:R#+$3oINE-pp/G A IK<ͲBf^>SeSݱAAuZaZpDH x@26:Ƥ 7k7@bi, \^ZָC;bZwJj#Vĵ t3l֩+-!5љ@#YqQ`5 [gpҾ, {C'8:1Uz+ LĔrKݫN,XZ!$B9\{ ?:tY@h:&Kp>ְ|ϴZփ;V8A' ͺ04 kʀAZLA9+1` > 8oCn?xކWL;8RkȘk+B n+Cn{< ma]n] Gѝi߹փF ~D+b;tV [=i51qz#fE)ZaWQ!;Ӱ6tŭ9AC&{[b: k ںWÀA2$kµQ:yyo$rF`Xcfc=([ d",,]Z]֩ ta@?W cZ֣VkEpxh uY{{1@ -⏘rbhpDޏHYYAo3D#ۧ-dWŔ{ںW{4gm7k) CGoQ="ek譅Y8ElaE Gdv%&I|I:A U^aA ri[.򰇛;+L,9kQ^)^S OKLzD@վ% GFCzJN:h}?n`kZEμz% !)_Nڳ'AW?%)wfA7Fїܳwʊuݵ'M6ALg5/s%LJꞻ6a-vys&Lm YWp_HZ8{A'M39&L9'ISf#Xwm@xхZNkƬN|~@!4 > 1'}rWwzV|7Kn='{Nj\8Xhs6Zmj=hX$֫H,7{]WV~Msz ȕ2h-'K8gwW@dј\'hҊHW ̹9++bAuu<1u @ʵ ɚ[rf]mœyiSڼ|ϝzs]?:nvBrHCp1ždzd} t y-E+uNt"#ܫb0_LCZOXhEZl;z 'V|q? ZGXqdwj X- A2|Zׄch܃͉3yi_޽ CnV? ((h)<=K}ND)dJJ~8v !8V10Gx`Wñ \+=8x@,`|?%j=.~S׭\ ǘk54`jrX% iGihEzcTfk(prJ`Gגͪq%kRR<^@9.Ci'27`!Pz:z иi_z8N]x _y4^^{ܬHZAiGc[zå\8⎱AADqz>wSοw![G+bv|􌋌Zk@9k1R8\W1k%f=ԁOHiEh9 q1Wk)$=֤J ,sc{ZZR8rJ ~Gz< cXM6zk ސ2c,9Vc 8ji]]88ݜkhYGq@bFINAˍv֌G@ J ,sZ F/sZ I҇|sR9aZ+b4bNjMAkIZ@e.01P:Kc`̵-qPZ1#zttG%rt9tS.m)Wk)$k210ǿ_-+r- XGdFK3`wJӈSY-!ie 9Д>=׷}>ꐀ M! @uG,NJɔ5:L부1f5րz?tj.x8 qStr7YI5e.4wԒ9ף1f(F莃pZAbj9O9s!Hְ&c"\iݡsծkXb9 Њݵ:, e$sހ1Z㑥,e.4qOAk%coFkjȵJ@]h l@ڠP`ifJ9LQb bPlQ]2jеxhxV+$k2ޚX}T;Lѵ:< Cs|vc@(C3$n5tumF }`A%Cn3w$ .OϮ \P`遇Ϲ\+>zc)-x]X=84 c#(sG |Bɔ5,5֊oBQcj,C ob9Vkka+EчUAbDKZ!P`iuC0Ƙh#ZfgЀ ji!AHZRd1Xq) jw:VkGO H٢C 1*o&5P",i c껭PLb5٪188P* 1#qVcMZAkZ1(Qa+q @Z!e4#CRP2&̾sib 1w4kůiĘ-\\5޸e h6wa ^0j.񆫰Krm.ǩNsM- 7 u@qX.V(z(]*@Nv7(wbp)HLd6n\b{^k2,`5= LAFj,`7 }8% c8蠔ArOxolK+0Q;?z~3v{(c iRx#.iAK฾+fhYju]LQCzkT|XDp噸| qj@ q[(<`{n(w`DwtjĶ4s txEkbV)Ge ꭴk@F,q.jyʥ:;d*.q'O@kt@(k LA;Y62KE[ri&(Qv:݁F}(_e>q-0+UZ1}>L\ynUe$ZW 8Aq,%(ѪL 14Z0PͶ:VvW㒀 ARZ2틏AQI\Tq ݰ`Ub պs}Aa5|8D0PMY+qY@ZIEkaPKVLFE7_*h){7S|ӴܣS ȵ*%b5ktb⊆(G>Rb; h}w>_!O.c5 1F݊?x*@5nj|&0ZV1*\CpnsEtNﻔRk$_(Ohc1%*4yڎ/89{>.]U pn!!|=F~+L`<- c@qVe ga|OKV] NօV0͂ ]"H@VE1d@|D [%C`$ eO`À]sBlʐEw,n8q-ܚ ElJ 05qq%@$ `iQ൥ڲ/GO;|[8d' т[֓B?xR'ןg_o^~;s}w?ϯ/䗿7cp,ɱ9-hds0j;Χ`x׮o֓r-?w_}OD ;|,sYkڦ’:,(#Way $o;|sqNZ>64kYdZ=EQTJ8~(+KGuðъ[͹8ǵkZ=rUIH 0lI5{(+y2|~x#Z ~ DM=\˜b=5mBmoǬIrpԬtdSS'o}:1)ZmA6mE9`cM;(BO;rnZ*k1چ6h3/ZXuFkr9+(NY29t4.c^0Pr+seh3zZږL R21n68Epc G 5@2٘2P y?mL[8$3{rXh5x :PW,WQRcL%V *FkBAD۷\@8RRѱ^i5P Ԅc?_l),5Ph85ѽmic]2r% A'9I+i_WOAA8r@ѣsS 1\X. mH[Ҧ-mL[΋{grpБtfw%t YKkX)PLa 2ǚӆ%mJZCI+xO@v4W̾D]9Vc-({ GL&PڞYE}rH.gy!u\$TSFk GLeȚ" mL[^39${9"c"L=Xoc.(֘D8j\Pb:6isW_A!טnpV~'eqtP&K`)?p|_^XRrXi9}1ޣφ I@Vfç4X)tֽX˽a]`}JV1ؙ7_j5z DQ^XẔ&5A[Zw{rp>MCeނ-GTMe5zRּr>pX@cMJH|iI|xWCg,%a4ܭ(17WpY5(җׂe5jIIL/9=[ixVyՎs{gWcC \S18d ,S@Y 1 }8!ӡo2! -9:9{TɮLĔr[Wv" Z=ejЗcάD(,~N.9ixJqd)nܧ0:g G8]Ê2Z1.N&?sbͺ4 kʀCp>*l\bEu.(.d3zbBm̥-@T GA9-)'1n+G!=?p0.7]V I[xd8Ch=H X-l{<[QL)A^(A$tBiELj1tŭ9A1 :h}?W)V\+g-O΃8mOH7 1ռaa|y-3>Tv S4$y$`G1F3ajM@8^!m Cd CG#t]T)}Jkɻ$A_}n6茓8}: OI#\@Xu1Ah[o9CG8^ G4BKxMX{j2IN쵪r+ueEi٤1ܬ=wpu.QGX3Ż+ fhLvu ,$-Hڊ`'fNH6@›ɚ[r2Ipcm^Ndf=`Ԯ@^;PkE8Z';>s+MoR71Po ߣ!%qa-P]*912qr̃vc##/j݂H>H9q[쾉KN/B'p4 s(}`V=ȣX$9|랛#<1yB(N *^ܘ~. -H]8zhdU:qБ3{H58z۲5mNp kN7el2ϱ" -$QseBƵT= CnV1XkEzEƪ}9,R{U. $Bc=<o6UN\MFbEZc#c%Ʉ1p6_b=c7ᜮbҪ:% `qDZbEZc^s](_{y8Ukp̱; Z4VVd HLDҟm mi}Z tcw@*|M0z;Պj-$"rpbUn \8 9#96wMV2.25 (1Pz R8imd~8@J+bFiLjMd5",녣8t,;Z9jn%sأf=V,BO)%({C2RV^cc*Txk%z NJn5p 1q hiΚHzA酅sqS1( 1Z+7 Íq֥rœyC*b4bN2d%K/0Ŗ58jc(3VEVz Vos\ě]w:)K{Z ڠ+V'3R^8\1.-YCihxQU8PŹ88)`K }$+wط^5W7 Є*:K1Ŋɘ5!]K0ÈWCNmpz<9@'f;丁xd $SI 1Fj̅q*xi(;j WyQ A5i ̐D8ⱆU%Vm Auf)]-3t$Gh\,d)(S橌o*kc91LA~4ZVCUjE3l`K.W$= L)cp v]-0¡˵@1(qM6DV]dբkS3[ J/8sY \8t,;GÔ-V7P<\v;D=l,Sѝc\ sb1 @rK\Ew$ .OϮ \PZxc ]0 -x]Xi#HO &5PX-1bZx-s<7 HEV-Io^B2՚ ҂&Na)#ZfM2;1IO x5K R jD8| w:Vk- efiAbvK?V&cMj̅Eq=_ =V#Кj92V NĎq$)֤,5h(5s ]\0J8,qyAu8^H|z=1PD8GzXF !7Z3q7AbLBpHgjqk (-X"4K;еMRo kd,brp ci%0ᦡ(\s@ KcLѧH/S(]*@Nv7(wu٣3qwA`" }w;M&C`A(X G-(zY񆁹X>w H 2(6].056%Q):=o#UtbꉃgnAK฾+fhYju]cD8z,@1NŇEZ W*W8$1.~ eM`S0]CLaYwU2jmՈmird IY:/%15[ 0bI3tQk.Z18 cqc>}ZeGǠJ-Fi2^R^ԨY*-L`k6Юb;Ш] W е#d0q.gd hM\-WűDR%17nY6TG0jNcVlp!HJk3]}#(*ks*` GQTkRp`8i;g㴀X@ݩboxǟ|ӴܣS ȵ*%b5ktbm(G>Rb o؄[!v>_!O.c5 1F݊ѬC2q8T31B8ss ¹͙9RJ ƃ2]#B}B@)Qv|9e7οwuI2As 3A7{]GaiARWTn(c˂xTpn͆{$%+ǮYc'xB[/2ݚE Ⱥ-Z*#,.{z  Xd3P/cq--7ܦ^(d3PzJᎍ,"H@Gז)ז}0k3|W ]d_$ M$ )) HJJ$ ))) HJJ$ )) HJJ$ )) HJJ$ )) HJJܪW}1IENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/shutter_anim/shutter_anim_06.png0000644000076500000000000002036512647526512024760 0ustar devwheel00000000000000PNG  IHDRX IDATxw$I`1-ɾL@6Oy9 /p/yկ~u}~Ͽoϯ~wr 1&8Y>^|ŋB7(z~ӟo>;w}{|>;|[8&sA$ QS~o.׿^>O}-Z5ccs.>ǵq\+gC % R8_.Oy'=Or6}/8/|w.9Bõ} hײ$(  {b;|駟^eo(n ZwK9õq\+{}G* ɝ-Ufxe \S;|*98\5y}\+̵=iW^sArGC7T*>?2Jh6 #p-H)*c=Y7fIE(F^={3 C1na[D(LrX(vTfiqN]^5s=qo#0چ6QY a^Ax;* @t%5hTb@ϽpOX{5&(q m{&{|NSBW 7GIpAP&r& ϷXBZXxt:G?z`UG5mCVI:59'ȎV :1F+K(/j9y'=E~ӟV]h3zZږL 9 R21nop2J׹y?0=u`+h+uڐ᧍ikGtx w;%Vc x(Z+0D0Z8b0O[1 mjzmr% W,.KIVک`, pp3{؛"Duxo(˕\ :y$YzVt`ɦat".Z!0@k~ກuI+,}Zh{@HB[bENuUN)[EP`g`܎j8-0kb[s}uwzoߺHN4\- r髱y* V@&bPC1 2ŚӒLӇ\OWYJ2!(h\ɹ[Qc0ި2j, 9}~gd%1&>s04>0[;*ic }ԄϬ?d ,c@ 1 }8!Ӯo2" -}xWת;Xr0-Nph02!0P8qF}ꭸqҐww!}}H3Q4. ʜZEnt́c*ҐhqWu_ )+;,㑽f=t,UZĸÕ9Z2j@#̅ϡ2ǚLG3qJպk@\+:Ow8 RV8c8Na,(sH+vݻu[֊ֵ"Jclr ǐP9.iڱqQ>PZHZvۗ4ueN{4 \'wĀ<2.0K+-\B2Vxtm!ñdEN{ ]JK1Y*NGd)`gL\;We H\>oc%`=K&r0vRxGm бTgr>PX>H⑚ }M¥sx`EN{4KR3._G G T ng̉ONe%[ qNǜ>Zt2k[ 31,4$0&kUp\3ΘcQ-!jE;6B;S\i]73OymZiV8ǵ!-HZ)ǡk^ 5+rh@j0HѰs\+;22:F~$s9VҊ\;uU@h$cj [ZNZP^[g\VdjjiE\c肱H-uH@=H홹*GKZwȵ2(/㌥VB22[Z3ZƵEnMJYKX".8n=XlxŊXнBbktPԬweWs.u3ZuR;g-[JHZ1YZ,wu5 9]+Krvǒ~`thYZc} 8ݵkcORuoqԲ>Hq\rӛ򽖛uVI{ܣyRyc=`){3断c]1"qN8]V) 癷vZ $ݩ iot +8]h85ܬ5+GB|J0|ljwzd±\|:Ƥ :r 7k3@b&}GC`IXXְ ȲDwu +Z:3lMWZBC0j)e^#YfH;v-A'yyғM!PM{bJܫdy@?"f[t=u:, 40Y 鰖3} bV >'>YŠzΠ;[f?hn5ke@fr{)Gp q 5Ro_L >wp B?XM|BM4\#9m9a%pd9@F׵X*_>E7,`unFY3qzZ#+-<{Vn['uZRdy@JH kGy %3m9 _ѐ]c3XcG C\f8nttkuY7 371׽J@:.q)mm0$V@"EsX5X m"$% QwY@^_T`Kw ȶL,}uEQ$@d-+9 5+ Lrd 57\:͛~+y H(i@C2:@ar qP]qGc ¹НC8FL7M#PXYUw9!γM֛+dj^cW7ZBg|nfhH*21/`In9D# :ktsj”sҝ4Oi6 29~fւtY,90C i@|JW1f-9'sһ:b>2$Z:ܴU*>UMDDt$l_++JO&ݬ2k0'NcRWGq`y呂ɢ1M۹NOT/4>avi`'fH6@£1Z{Pڼd) ;4.Snu-qJWMWrbe!]^7L@ PtA \qM!XHג9tw*2XCpL~3[\ gx.ޠ{kxkNe/Z@W|nx]qn۲@0K2T~oOR۬qmYz:>˽: Cn]HP3KY8xH*=:1H{2ŵOݤ:r jQkCCZOXF]) *p]z\s$|3[&C+72>8~KJ~k=j .ԪwHo ֧ZV\?㹙=Gl.8X>..)k\Nah 1V*!Ap/| &V]% - ]XULj H_N8Ncͱ"S]$>j|brgyp}ptas\]kD+FYˊ́}fp% S>:ucs@*|M0z;֊Lj@B񴵬 V1u.[G+bv|ڌBZ|x=q}ʇ1[e;@J+bFijɞ.3|}`A{ZFͭw{Ԭ]7{i2e+HAho8c 8J@h))kŞ#P G mjٕJ@6$vH'&DX3,Cs0ޠ o&Q @Z!e4#]\PjgoZ 0,gf9GfĘr KWsx1.PbAv; }P63pvpX6ye8n !H4pP\)M@B1Xj @2bV27$&Ʈ`o5n@9$k0E 5100gSjMJa.o=66qF9?b[Z E  SubꉃGfAK\ӎs -K͚Ӑe[Ҷ-.R.w*>,RL\Wtz [$%o Vꋧ`tj4X }+`DwtjĶ4sndIY#(AaX #8O5OEL\ynQa$ZYu8c~ 4C玕}Re; YqH@ )Itǎ$eٟ`Z!rݧh]ʇCq Ր8"ŚDPN dkT$~F`<Eo%\r%iG2kUJ0j -$*VVT.|[֥Bq}.6A,^o} >,V5w+~oV KԸ s}~|BR^zh!QɹhL~w)P~L|_ MƔ{i;2߻vYV¹P=qARWTn(cqTTpOH|OKV] NօV0d,(%,5ۛE, cA-nPtO =݃1w E(]ݱĵpknS+ F(- {tpE`$ WE1ז}%z䦁YZ/&aH@RR$%%III@RR$%%III@RR$%%III@RR$%%IIII@RR$%%III@RR*_.T9 IENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/shutter_anim/shutter_anim_07.png0000644000076500000000000001737512647526512024770 0ustar devwheel00000000000000PNG  IHDRXIDATx8@303 ۿ _|Kq 98\$`O?(o޿{o?~x> 3Xw9✜>h`駟 ow9(7 R_{ñ/-т8cK->pM\TXR=-ʈ⢴*,Dz뭃5O_~~mgñ|r97k55ja'aI@C(PJQ7edfO>d?sgqג+,k98Fkw9Lh5r\3q5Xd2Z K(23(,7n?駃/5q [>oBõp<4kYdZ=EQTJFx\Fm ed3?(+KGuðъp ǖs[ǵp 5r|{Ҫ$$W0lI2š=QFFh\BP6Fyc>*)M~kZ&k嚹vxIȽ?N$(WT0tCL,fP:gaт9wQ*?~ aG|g9s'QpOܛ)h1tý \\W%"FLe*B2KK޸f{^'{3_mh%0r1W`)fU  D (٩V  K=rf61b0MdwMVIsRJ!( .ʄ_mñДnX*ܳڂ6mh#ڊ6sr5I@jjO#>\BZ \XG5mCVIDkT8P: ;Z 6drh\$cXByr*X@Mlڊ635m96f. ݥa@J&Ƣ>: :.)\ ?{vA^meN~ژ6qqi.)ܓGpF(nC=(*5 5U{y{~v0h'.igyڊIhMhSD}˕lY*]*: rq+JoƍX%wqA xܪ$^w|Ԛ^Ѷ. eࠓ\FGRJ?>t0jN pй|E@`1E )1>њІ%mJƴ5mHvIGiqȸXRA! >G)pL ׄtwr\)ڨ| iCڒ6m-i{[/xO@V2W̾DAڑQ\((8Fqc_&ױ bS@qĉFĹ#h{O.% ҐY Y 3Tv: { AA)Q|]&BM˚# mL[^3HvsD8b?Ez:LѼBc.(֐pd#]@  Cִ8PEH5&9@"Utq B;:Ny睋q |qT j9jJ-e\b$YzG+:edS0'J0l !0@UKxmS@kM!Ѫ Inٝ U QJ/t.[}6˺;!Z|+}KZb5Ƃ!qk19֤ALKE_idFPNѸNs4CC!%k5jPp^ XI5jIIϜL/99փrՇu]fb MY^2GqB-Hd$$$7Oҿ Ȅ#6(2:Vt D; 1~zMH%;}av>3εx#XF bɩƩcp`czmHJPĕg}xdתkUlhĮ,-gWkppXZqnww!}}H3Q4. ʚX[N͊{KO%$Ow+;,VGvY]+K1p?c)p2TK`$Z>PBbS%}j]5 CG&n9Kq@l }enWK+➿@EjkރԞzIVt{uzHZ}K+bF z^d3@5쭤e채!"Vb-t5~QԬ^]7#ŠTB2'UEBx9~++*4y%I $s} 8}j&ƞk=bmV 㼈+}>)߭ܬV%l|HLY,ot]@'\lU ҽA:1փdycEbׯ nn G VOM֬ʻ$딿'nj7L;-e=ȟ?ݜnqetAWЙZ6+-!5Ŕ.F2k=Tm! }t :BnUz* ,ZMĔ:뽔{C+SdE?>QB0K @qGgj[@A' Aw֮ڭ04ӬKA2Γ;|w8dE_m [}.;'Ièqn8Ofa]gc1X2{u)akχ֞i5SJW.a=]H8clW+>mݚ1\7- {& X@ Π;|jX$r:5^:P&u_4u5U[ٌU)LI_/}X̺E[s'ԚfF(6R!(' qoD|R3-2X^T{'Yv2fk::bBgL*pñ3/h?9ړgS!۔X[΅0!)gt%'km*[+ˍ,1H{ňEkꍐJNtA6r8{@%$=P)CCwGG(DgtH8:Fn9zfa6j!!61舖A,Zܭ9IH#1MĖFb$woowcfB_w莁Zbʭ},Rz@r6MBb*9-Ȝoئq퀀$uk޳ǫ]˒'\@z[^2M;Bc}OL@ nKzu1Hbs $wOl@|L[ԕ\, VgӎAz$ZCmWi Mˎ4H7!$M@]fd,Vt"L0;Z( ')ݘP' C.n0p*5AR$K-/9Xj3Ea}?n`(t'[^28AW\?.}rwfr>E_6zIl^)1Ș 8-3k>vSJ*21/?WI{I Svz8t]AgB.jk]4Oi6bhGmfv)2QƬ.Bb1P)i1[d:bsd.8Yhik̊IWmZ1@tёXn WYQ 04搛BH H{{ {y'L ,t'/I*e{%Kfit'f.ro,-M o(UQOHp`$2f|Ԫ?:>zl^NI잸Tanp>KMW:@d캐 D8n+]Eg H_ɉfsj^KXRt¸@}GO u^ĺ, _? tC=1~]9:7_&hLF]vO\*@8? acS@P~̩l SHBܧ nԪw/ .7KR+ϵ" :%ssQ _{r @,w9ц*|X4Zcs]Lj.`qF:Ɗqec={Ϋ˽Up ZF TV$!9MyzN]zHW<T/Z5IHe!8Zݵ+w$nn->s2/26IH1ǘ2PjS_ 12\fR΋Lj%$ǕOZfͭ{N{ԬU7{B:L)AIHN21%%z C׶>[ 1q HGS_2IHS8CR`Z+b4pT1R;Lu IK2}clQ漶zv[Ϸ*Jlrv54.\c!ps+ҷ X-YMѢ|EӈCYdyˁܼys2)}{oϷjU4u8]%)V$!Ξ>Mzui}JZgGsOOv08NGq@ ϲ y\ Нk WuQtA2Ka^j#`IZ="VRZf8PR: иclt[t+q-;f۠ID1%@iƍv&,e.j}`poPnɐ;#7.O. I([@R5(QQCpx-x]Xh=hx<׎9B-ɐ5Yk2^P)P1S:¡7Gê %L&Ko-~!6낡1`t(X1," MTkwOe B2&<՚@ IcY]\vr#ߝZr- efL~52 CqDP ᰼Db٦^{fW*Y 1#qV2ŚI]蚠[ >(P^Gl7Gp]G.d,$^fOL3: G Kݥ8Au)121`Dq-7{f21 !%S\c "Vrl;v {.[rmn;g$t{j `P'\(( n8 X熝JB1%*9 ڧAdZ fd'`狠,08B(\!(ƀc 1fca`.(YNJ9g%\oF1CnI5\Ss( k*T1ވ[IKlAKqe&ۤedC sOtRLWƹqրAP+J`(AO2cd5K kJϥ:g8!HJ.ZJu%^cY%9Eih\s"KpDtvˎAg ɒJj붞%1Qk#T%(8@XAk,;D>w /PZlx c2'LynZdhM_Rb,k@3۱:oX#qbl!qip\$ ]$fLcGPT2U\E7l 0c!sݧhݓ!<`jj\" kAZ4ԒSQ s}D-pvk-7M=ـ\Rq-VjcMbnUQxOȑ.%fs k׳x5:\ZcܭYd.(nQc\Sq31|J롅pE%5D cδ}RJ0) al"0DNЗ1G|O{8KzneH- >t|+uM`\- }@1թ",*0gA[*#7S>Ӓs,spĽpknX(dfhޣ+;4/r  F,cxirmٗ Hs,˾J@%"Ih$%%III@RR$%%IIII@RR$%%III@RR$%%III@RR$%%III@RR$%U?2 />IENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/shutter_anim/shutter_anim_08.png0000644000076500000000000001563612647526512024767 0ustar devwheel00000000000000PNG  IHDRXeIDATxՒ+E=w 3333o,G"wE w$r裏CP;„P( P( P( P( P( BH(BH(BH(BH(BH(P2=#g8 _d3*OdL>{O>8Ї~x 5{ ;.7-~4Jrv`)SO=/0~({xo`-^ᚸc@ B(.J*? o|'j??o5{ ;.S[Zk0]  @)QHVq ՛U^0|of/w}/U_K/ߴ =Z#>w]-^4~kV׸6(RX] J_Vy\z?x@k>}~7 .@%@ @ѴdpQT,U7FYyg}vPnǦغaXъXn~õq\+{}GiU `ؒZe5{(+и8(*l($OWaIo\5y}\+̵=iWArA9!R qwPBI(`т4IvT{*?}YTZfϸ{LA>(0-ApUpqP"aTrX(vUfTAo޸f{^'{5_oPlj\ X="zy婢 (ٹ 4Td@ϽpOX{5&Pq %Y%Y ^'ͩK+ᛣ$ (~9 S T`o)u6b =r<ǽx!_*]_Hvߚ'+7o/`oTkgMOEFRcѸLxc0kYdhzR*$>zm`.hnX*ܳxO -ܴ1 *(v&+uxV16q5o`W!Xj5Xa&Xwy@Xxx O-<}1o+ ٭J3;@Ŗ HVZ{Iǖ` Kx om^Ȅo/9} NVJi~/x 2Hv[6HCfQFXN.U> ĉ,^^!l$U0M+bO, pMcx ϝBUA֘d5֭B6>s3ި &Hq 72Ir"aJpZ!MA` nG,$]Fsx V]Zn-యmRU;]Uu"G@b  -{k@[8xFe߂Bn_GҺWKjI\)`d,R+\(1Q}@%1&YLDt AnA9a LӮX'q?1$2J GToi4du"hLJ_@.z\Ӥ}@,n!#d̐{]wDz&msg8=@NNHCUKGvKuqXf|dab=NC~{>*Zqg;/Cҡ}HSh0'#(iӾC d e3Yj}d4ke֢N3uOO,8};+Hlpt*uur`9tVw8s 8xB/;$ʠx"ۥZeZGo%ql܁P=/Յh(h7AƓXW /-[ ~[pcL{\}ǺZ#BK"排4*ie}ǺZZg"{t]0ihm ]uR{fcLZWA l]1VVČ1w]d6X5hf+f{c=, bkEZ^ U]@ڬL2՜8 CF1;֊XBi.++Yaպ1{Xx>Ɗ {t]] @ S00XٺO"kdnu]{.7k7WK{=Ǭu_غG.$P :._GWj^|ljWl.5Ɗ`_4[sY9+#A.386} i7&UOБ9ܬRW0;%aZ[m'۴"ZF7tif }%0)}0ךGnÊPGt :z2)@0BRn~{m뤱nNx.9C J qW1#ެ׊PkE tC=AgН{vS0t2  Fn >WݰN) qLq0hqϘa ue8d7e lL#M7;w۬Gm QaSCvS?<:fZ >둴Jj1tţܦ즬ЌJ>dr<7[]a<$t)!+L$ABLP+h/0f&Ym}YP 5Ub=.0ZA' 碩3eMOh4=@Glf#PMYAZ`B5 X)+92X^4<#&tdMn`&%Y 'IeUQGGtL5Tn7U%+O "bH.O]AgtkBp/%twH.8PΠ;b"[mg5fa|˥?H#Ztiq7eIt-LmCBr]-,=1pX8@X9&E`(BԽ 6-3[+@Es5wx5#[*y= M;34c9M&j.VA6 3iW`R Q+{Ai^sNyoHtXĥOkhH-P:jn0xm5PX\p8 }״g+ Vc9'Ml>t^fIY@GCSKlYnЃQ%+@;VA7 PG,,O fHәsNV[&+sy/czs, ;5 4gchy 4)LVd[Ԕo[˓zI?:lm[ N舭&Scc3Po$Kmߪ6QuC]jR\%@ZN G0Cq 6`C >OG:"!9v1cJG tC=1~bE">%+L3o=a@ t@7Б3SUgH(d{iw8@+tjiZf8G`.1d*#VpqqY.*jU3~e|Xm^IҾ9vLA 2s@uZ- ]nGxlEOlAWƪʨ-0DjGˎ6hw $iӜFd`1Рܖ!;k#.'ӟI^(1],|,=X4@#x1s^i]›XqZ5ckEчuud(pO\\lt-X4@vO@wyZ1pҾMGJVp~֡|r,9(_-@-[6y٪>p U2H`Gb-E'APyfuuԅj X@ƂiF+]{2ar8V!",GX:ϩ%M+i5]* ;CadX@@М%`ZPl\+! m. ۠= ʓiAVH,&R׸D߸qetDFx\s[*Xj\ȹW5|d?T5ިzjp X-@@R[p|W'fhYڬsjl Yc>5pW!a*8HDFZ 'ԹmX+8V >Ը-̎RV@Q_*+Uзt5 +ZjT^Tk2JW .*)r]C>UwJ+oZ!j@kn)tY?95XEm׫;Y{ոhY*xw4%`l c 5ʎ-4s mm+KK׵ɏzd\L<UY ZgkZJQU ]ZXmijl HH֤fLcW$2Uݰ1 |S(L:šԴ!Epl cI@ݭ8{*VWQT O{Z7M=ـ\ƥXkRVT.\RbACRѸ>Mh}j,^o|XcYZc[f5. W#j<=ծ>_Wh^0i=䷹j>m o9]>{KݎeZ8=FXWꒀqIPnj[}Ǧr}sZ&wYc'k$ AVC` Ė!^'l~gm{o_|^+/N1\>g<!ȅcz_x_{7hzwi{o??l?裝|;3|N} QB 'F͟y{o._ݹ]уcù]xkNK` /RpL.eI$o}Y7ߴ?c/{_w?Nc9g,w7% \ר%/bH r@  #7dOw?_:I^}ջ7|U=I6ky{#Kz 58F꯾j7 XFzFr[ o۟~w믿ys8)iچq=K$G[P="DXQ0@FFy/vv ]~7oz}\ pm\#^_'{zdc9$Va7`oMP$|E o6pM^5sܓ^{o("iab)dpZMt$ΒEFgIonyի>؞<@4^3|N7I53{ី7KІ!ʆr(` I B\@DBH .87+WE~7xo\3=p/=/G7Pko3W`)1 q @FZd8VkjBϽpOx{&QЉy I%9 ) bs@BLM+)ua.YLGc;:@ - 9)}22||z 7o򁹓bHv.ܣy.G'd:Nz(4AV(:#L;meI]І-){̭jLutV;֑`KIllVj=knPnV.{e"6ĖNX9yfn[~Qk xm -6n4pΖ3! jiOw.BƦ=ubLbFqlͳ-|6ۃ`^ ys s΃E2#`K)΍`{W9x K14׽ck6q }^d\yK>\2Z66z+Z{P` {袼-n$IX>Mc{0E*Z$м=+W]6ʾ]/bE lL=/2A5deﱍ.E X]_AO7OeWk=8xT^KYQy5>,/y0j;EX>ѐj B,97L_l\Q'`ݛՌuZ2!C)4$i` Γ04fLJ P^$!VC1?|dhb>6) }il 0 bghǫ.޼$ +bG, d  "g jZ؝IM;CRW[浖cBȡ2/XqmL0;1bMVB_?5 }&`̀Ua?n%Y1׬6Xqs](>֛}0 d#}`-1~;ڂ)\%Gvڗ%dTo#`7KZ0tMSZqF@G.K`j5r]MԩFS("U#`&`iU6B[敒]@B.Fj+ugEhdtS(.]al',J+Y,۹OH7RK`}; t21ДPF6ͫO"iķL>㠓GtFl5;A:&vu$/oņXjR\$A|6Dj&;L~t REH! !N_|xqFI bJF$0#3c͠OBxIbLwg8Q8EqCȚ7\v-`٨`{0 XVJ:ℏ r6 ̘W\&p,%fxpY sc20Dz1B Vrfcͱ=` W ȡ0WPF@-އt)«b5^\=( w[k97`^)Ǥ#w"|+[&Iַ#\Ê|Ud(2ԋZlW, =98 t{儖ọ]lͱZ%A%(u/M!T,a@)". S{ 2k9XU/rʕjeM`؝$Hܺz[.uvb[UbosEh TEvMtm| 4 Ⱦ\: Fhu\5`c;ж>Sc-' fP" .7 [RcSC*ٟWA518X2e-%mlkͧjJ5AQ'>eq%E Za;')51Ě zPױOVm56jZP"-иe(کa;6`Slk?O jQZ`pD/_g.[;CSZpreA{h5[tC-+u#$ul@ئeVBPa+êhPί8a3\Cd(bG8Mܹ`DI6;,1=AײMڝDuV:`'Mm8>7!'㜛7o n f嚏&Ⱦ|<׎9B$ӒCoa5vksd_+1S5@$opGt]=GwUjBYd(ixq?- Rt)_l)9ס}s9)_,A- $VXxċDV[ UBHR :IҖr1#sTk "r,IXft= x ev֋!!b,tw>wU>!B*[݅=2ݻ6Y:9EC$h%a$ uB1+϶ @)Q$;#jՒɱ8"Vbk^B)By2d@G&; r, HdRvRC.y.b!U7V=up X,AHR[cϛ0*t5g 5|r[sYZc[t5)(nQc\S:B󞄱<Kkǜ]qR 16NKR~DGhKs cITyi;zEc>|.w- I{܃aǏ DdI9GJ y^w>cz.wys'x$Ֆc,ANK.Y772D>R!ȹE8fBIENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/splash-mask.png0000644000076500000000000000254712647526531021475 0ustar devwheel00000000000000PNG  IHDR]H4tEXtSoftwareAdobe ImageReadyqe<PLTEU~IDATxсHCA97= y-T<_'}6ٳ&nO{nn ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^Wv|a׫v|a/z®^^]/b ^>xzavz®^^+ ^ՃWvz®W^1_]bՃWvz®W^^]x^/iw4^<io4^<ig4^<i_x3wu54h_^8H`nnn n˿ @/, bD{crQ_w&q>#f!57|X 6To ~#|O~/<\nװN.t|pKY{,z}N٭W?iZ08  eOI-gAK%ŏ9+wYYE={51 i2!͜Q 1JHs?m#T/a3 YJb -0Mv % MR7XRUQQpWϠb&:KԥT۠GQ?#W~cAb@[ױcmoo߿qqmmu::mσ%`2uԩe74ׯ?:ؕ+W}!]o>~#( y삟1Y"'I#@V)$t3hW9a(AyIwNUᵎˆUZ.o%pu"Jk蕻2k'crZRh3.7Cz~(Tp cW1[`Rali燆ɡFFAɳRg%Ca#kɎ&gQhzaƈy-^)ȵlXݯ#Ggmnn7nϞEvvNK7nNcu3K1sK+6j&'\(8DX# X[)4*S؏kk;yy]`uė|o>$_(,jpT jA7 r22V8cSi9r-Ri\B)ϯZ yr~)}ߣ Oҧu1 Z` ;HC y8 -%K"dtE`> TwNNsAMTvu0!6[ 'PS'ZL\`\hGC6Ju?5 G:i9?Ϝ>흝/ZTAj<*(! 2!iA0yBVMߪ SfΣĵk~'Տ~2uϱ=DWyQIa^>JZ*ʉ~v7}啠- ބFHh󤇉VT]ևRN! Ti knf ,GK3 D}XQ{!K7QvCgW *z?O6A D Ю96j׃)c໤ZK*3b0;-@\kTs롊_ ӧ/P=dr0UF($l ji EZ;5KlI_G!$S>lعπy勯yׯSO=z?rE_/*'39d#;JgQ'|Z•)Ck2yΦa,#uR#SMҠQSg6F 'q癩$o\֡9a<M: ,-!ejfzn'=^SU%Q[.e7ۄ 4[S8aC@JeR]u; FFRM> gd ؏h#J̙=z+6_f慇)K3ߵ@u/ פn Jjb~667^~www_qW~G>_W~OJ_꣒\x^T`-L.pp i CֽcK9_-6zX! >3RtAX6)ph$`qHHo]˜ɞg O{2WeŰ )Z :&ZedTYTV m0BH{P@H) $U'4mCtGY]7=An{{ӧȑ0i /ZxJ0JjR eRT%xJvǕD ,?w}}m'N'\Ox≟'?<%AbC |߳H"=2/Ƶ3j,#0(U`jr_J lĢ O.Pb=nH%4kSS%Cja9 N&GZ.U8?"+RLTp[%Q:"I~_VmpZBE{9E{4[ 8jڃ0ex^g7& t1@ܹs/ 9׏pY&/ "+1rPDRMxeNVB\y'WYĀ0w=Ϗ~ovZO>䇆TdN:*P55&ʘ8ν!jj|n V@4+ Y ATbQq1p aPET"84aQr2֨q6y7A^PKKĄMa2vKYd5]G:AT(ú6smomm9s79rg ǬGe{ $N5=~UC@uTRBpc񅾊 bMy8se$9RL{Xrdkiԧ꼝#YB"EڣC4c+1"dh@ ԑ3f*%wNn(krW(IqV Yo0B((b Tn=FC.3|I( Ǐ?ɽmlnlSFCB] Ԝ9&DM^d׳ ڗn0}6PA,4*pw[OV>}b8Y+Sg<{+?wߙ˓t@ujCr]!پZ&"\5@*IM>Q#aQh6N*"ڥ="S+Q&&dE&In GЩP^ #ѨĔRop 5m+Fw.*NJأe6Iⅺ%m5̄2a6=Dq[ײ툊c&:qhX7^0~oSzhZU[a]z7FOZU#bcVhȐ9O8g^Zo6 :KQp2;RzlRFIi&T*L2X`+Wh](A%򒷈̠/N:V" *D7WLjކwb +qsUuTSe:{T%Mv/\o#7A-fRX1j@@3&>7;!烀"HLYǬ Bў XT|{+WxʕwU_؂{3P2dylƴ$)nۊj5Q^2hHy҈*/yꩧ~7n|b`μ.t=G.joda@[ @oJ:2j()q=(xD})a8>sFRbO 7{Q_Q:u6{X ,L mVuhz7՜^؍P'xw@5JY)9nG p0UɃ'LTu9mh;uԟ;fkRMݪ~54fNȄ)n)0Td=6ن͓lVS/ϿS,+{+n/)^T]ƹ_ 57 ?B i,#ęj\H|0!D=I3[CK.ZßTpVqiPׄ O:Ņ&}>*UױS@Ky`ȓcX"56]E29r֑r#.4 UWki5)א!_a =J=1n*sQLh0^'V8:z'qIwv߷'6ruW]/ z}ِYXs"(w9k^9EX<y!sVXg)E%  Js:ƳT~S!cRC%kB$ r%vj!uW52UTÛ61r(&d`Dc| ץր@Y盏a.\.s̞^ͦٝe G7=^ïKY>OҐ9xR=߼?cGC8oh gcwq >O{͒z{(XPxB!(*`]%B[L`AfM*ѮONz|qTڒs4 ݆a>S3ֻ#$5gߝmjV=ӟwS!5Ed@<3BT L *rrd#eS#0#2+޾{''`X{.)rGlQ!'#*!pJQnQ!s I1HEҊQ>C=EG"? {݅^d9(hF+"jNG`Wa %Tz26u߂MF$%'°Qg1n1BAY;*!'$uOvTR͠B wсYC(NFSTɅ5\wVO5V(9ef  ] k_qǥK˝G|?uz/ͧ^Z$7ݲQś(2<\Îy0 )K!AOK}1@3 pm}Ν[͋u2$GǤϛ_+'k}\gaA*b| ^sd4UZN$sQŜ@0lOR,H?W@Olˊ zP-A])]U g'HQFO P# "!FMְ MG:)zZM?'E],4}Zl"yDzuG766N]pMG6"91bYu}/Mh<~ힻ0ƬA+fpY(Z$LSPE#Qu7SC*P< 6AI=/TBieSݿ2famO[;;GSO=ذ>XV8UwQIɻeDp7'lV1szgdAVSZV 5Ϋv&J:- G"i[ l*6dp&#\eArEu=/ ZRap+.R2Ǐ6l~zљ\?:\ Fe?$'g43.-kYJ\B\By-qa87Y1BkK{/\%R5`IƲL楶^ڋ?}Sq~^^X4kUG؀ͺ3SbސؔHRǷѽl5*Կ;6Gi31 U -,^WM 7*3l ~O-q!   u;cgoDs{؜ ^{v6݃&3`(/7ey& eyojpHCZpu-0O1KpUbSHr=ckH63rqح+l? N:CwywTлHwN=^˯d_SA]"n ˎ< ԨDVlҝR";UNW? <4 R2r}`Kb!7Ȭ[tNJjk3 КɔoiAoT'Fݑ677/syww{g3l:+V<@"xi"EDLrQUx'J;gRnU;_ P8FDZoe*Ӿ)x9\/( W2PEZȉO51t[ދ7wѣG5ݡ/-Fb~H7y:iq+,ciV݀3M xw յm.CڜerL'qX8$Cci k9$Eu&q5Ь;R;ڢֻFab 3AZE z"8h*hֲtemgOYQi=0?G^±b_ق&Ы+V_3 ҇ FpL5h XN8e2D2XA*'N7: Ġ(Y%",,RDEQڎruh"h\ŵ]xN:Rv9i7ӠԊVhdVa C*iZv%Q@uHf{CA4áhi2KSVcMA2+f}p 7gs¤Ϡ dQh tS!3 Cn -|GN0!?}+Ξ;_f#9eЇvg]R8֣Wz D@QDxuSC/נEF_d6 αڿl !@ֈ9  HβUDf[ еw~?х.J}j+U)Ü9ceCף@ŌmcS(w.%p6W{~ߦ6_ndx~"Rj-R]0dLp}T ij aȾ1T9PU{B9<'  lDSo)ϡ"mXrŋɓ̎<1d^ɣb(ܘ S7ZgO>7,W.3tn'g\hws\̪r0c+ۋWk饠yqHA6xR/A e*UL8gnHT C4*a֖B$!wR2ό{\+)R3?ˏ\ ve`ggK.)p9-JVK:' L(ok6e8h Tb(sap\$ŞcaUVJA7VB*;oYsI9ɸ7p칳ɽZ z,7|?(kQׄ'-OPkt֠1vʨCE>co*h`M2܈ΡPV D4uo:)YtD&z8!@8,^5w!&@B5%pZ!6.R;vyf_f;J i*lXl һ^xtwNIg̡\LtC@LUGB8bS#FHM3Y?bF8f)E/u>G+C֧63ɓ'_(V7--묁8 Rʊ0XqG~T3:z2=LDOXU3k6^V 6CāҳArP6-مAP#:Gq[dTp8#gtp엧٘KsΟ?vZʰՏr[lc S{X}M wfecbv<؝iSrdaI7wUDsv,Du>MvMx]0juNϰ>OZVt+k%h)6WwXvɳ>zm:uϜ9)Qm슗ڇ0ĩI)JYlg=3PjjIͬ:M^@~%zx%|idgB,(87=;v?'5e BwМͮq~9py'O+ɳ7uNYD,Lv(/W~QM$Q ;֛G >m&|^L.=k(B@(#G6J6eØxc,` d 0غLJ4t&leR+Ta0/\; As,n=ye9v%.2\k'i!։h!eŲ2ԐSbT5G.2Y= $o[!QǬ͈gar|~@0dLp~_Pdvk~PPKojIxQ,6KܰyĉS/*đj'&F;kQm->8 R};Ww5w8rj +TN{ ϰ^{zQ周bIھsP@`ڬ/Ns#AB4ⱡdTHg6?1޾ٳ?PWvPVfGGW =SW^ssnvݘ{*Kki)Cf.2O$Kc* *Q)xX8a+j21i$DGzJP#k{$jQ/n<DV+N> d"yX$_ Bi!rp$WYd&M_hnWGA8x[N1{[$VPJ322kh<4ti:9S6~.E^0KpM-(kTì;>#FHl Z:+BMj!0FfSa7vΜ9}N}b-Ti5@z@=;:%E-x ?Zp @0~Vr e,*K xA3c) DDCI%4QBl(YGoHC 9r[-J56lPz[[`wlmmK}RW:+ZcQ j5}`- /< Ur\XMiJzVwopqC(W X~! DPb1%oYF2E}vU lDKř0v dܹsm{{7j,q(@$(ԆĤ;fhBHOZӠGq WЌ=JVwՆCּDV}Anm>1'OOgI4ʴLEfHE~GvIGbB}5]w?Bi6%!`SC]B=Խ\A?kHyTp<$Ov.̚zKCƤ4gmZH7l3TGLF**Kʝwy(W7I.!U W%@ P4Se[Ƃ@{?mêIF 5ܷRi]{M>q<TP$ `0/?/q M0%oO SldEߋ@hz(kkk]t.w"`yR8~̂ gLTP==P zv1F:'6PK,eYyi*I&OHuϚ *(QPȦƞBSSi426# gfGTYH@`ySZK/v .D9}̜5 DJ#\77]EFƓ^ ͕=eerV1#~,}G%-$c!pM#b8"ަA/& 'wqw R*=!;(}swAHҳ%2kyfLK}+`zdz2fTO8몖;j/O>UG0b|Y JU~ZV\u ʵL2SNc)Cc3X.Yc~2]* rkx+ װa٠cW~hӕ;Vw3 M8gķ|չCdQUh]XeؘՔ$ .|U6b?-`m4$ͽ3uyxYS)Pu:M!DanTM4'CxŐ !`ix"Bע^;Fa3_M NЕF FnKJ)P S\M4Z3YTC;TwH[y=xsCW0ڦ.͕S/Js(=/<eN&kJWի [-ipe UaC sP*dqMhBg0mmmsl!~pVƓ'O @G~޲BEQ:'ּUpj,t7sTTw."V'mo%N¸$Ap*{3 u yE1RF8ಫR]T5a*cO҂*; O4y.%kw٬~s}#…39Dة01*[$LֲAvsHi; d)ӹD "̚d~M>4$,3Ha!#XAd|ҋ"O汇J?^O gNytz~^6-Aά%$ЦӋxA H7RNCaP{؂[0`Fdc at]t鍩&l|}Ȍ)dQuҥ "Oe `|JQfInaO9?tFa~bU"P9 QGeA2dZ`"mq=  aJEq>Apm~l펝8qǎS}j#I2_ЬOtH +J1@^^,9㚳5 { "Zؚ!9T!H\"P=B ‘"FٔR ar]+FSr&9iʒ[y{k{Ϝ=smF$:{$I4?i GՔ>"IrS s4^ԐSDYZgeF[82u n-@:@7T郦 H^*V5鄒q Hu֨Rp PhhD6E7(bĄU=K lhlUM '!JN.dtқҝ*01 ɉ2T!j*M8k; \R2Ȯy+cr]m:^$O &K2ưկr]`# [_PEv=9LB{ | cbgVK}gH{/^X~^Ә|_Pӗi v U>Ȍ%ڕN/*=B#[ du|azjKxhW7EN̉mvOjr'I"ۄo]S(s]2eWv/:a+.FT7 4؊w0hMm zV#dj=:Cĝ#>VDD!v:r 3HٱP¼h"3^QCDIF7ojgهl76^gwzyk md_*V`D/ЭR6+lwlN_6`z!ȉ7Aت|<4Di8dgplUƤ ~]+tz-b'գ~ۃ2w9ra(K@u ^VZXPmhsBpOq0އ Ih%"8S?n7E?a议I\ t )9Xr94r oYO /gu GiSLD\coݽ?y֦XBKA0 d!Ko.,(:` *y#c#ln "h+fŦ?VηA0ڨ Icu`|sVBu0L|>: %"E:2;::%$f3I8H@2HcFϸ /бgzLXF7ELpיdE}F=.3d:`^*gϜ}#_B;0SgCٸn1wܐ)ȕ{w␆~;;{:;É>Z 9֢ (=0;7%aaRIV94@ S(FU# *;7?ْYݎ)rG96_ 51@ɱ[Xò W"# {(WhQRЕEVi:&!|[R/ѝ?wѻimnƨBʔxC^3aT7UAƮꭺO’2iU+,n+գ$b<#!Mԥ*W.&F&&O"9ߤr0YǕ9l |K'MVn+.^ "f9h=,pN:bн/*Ng]/Ƨ[t0BUPb^?]1.B|MNU!]K4Rʅ՘BcwfΞ9f[7#$EJX3[-*+zV@IM HZ|lhV;SA$$(,Ά]7tsmhT?D7e)FKq'WK5W^bJSHVyc3gμAzy:g ,_]:B`84L:R5 wr=ĩ#a` "fWƒHf HleIFdɃa%J0Du}U:{S q*tCXЪww^$8VX㛁չP@6t',^z.iBm* UUeoEoiB(JP$Gj`LݬFNJxAQG` ;eug zQ x+tu7"LQ4h[KT}}lnnY)c",NhWMh0 ]6{WFZA^E[GҭУ1-"WtJ?;Ng=Qqu-Bٙ2ne<+oaa77#|by2Ax 'QjN" 6]:$@+6' $熭x^rRQa"P Z `W:'jyl[GyVnXŀ,2ףy[ yMsMt9@ar޷J/Hn wyxbUl;&̺ ߽Oʝ |+DSć:' k=*zv>E`b`&H; #> CA\N;x}#G򬓭8;Sii S %D6)ϰIvjR\6b4Z 볒jݐM2fJ[Cz;NzCH͸ "t.ݩJTrCGJO?+dQ."qTEbiFњTdAլZO?Cr1YH%! Ҁ+Pu`kpVlgHS%IW1HeCl(*V #5ER65'ͮLI4lC3\="N˜>c_MoڞjkU3{Ksu(Uu^@]pX;z5tK6'#IT1@bLmhdP,U[}G"V<qgʙ ʜnݵMZackkkwkF%bZ+#X ϰqgc|~TV3gDRE~Wz -0^H/@(ո|2DYljW)K\,bBݭDF A:$GZlfـ)+_Phhˑ%$e{8G!W &33 (KMkouһ3G(s-@ϝBw/&2V] Z3G4QǼ O],`cCFVB}5E}@+mԱSUj,GP*UawanVM=4قLС#HW,]%ZvL WRढM?sFdSusAŒ)֝]Q =\_ܜϽ6 Wz9`ǦXbPԖvaL81yҬgQP֐fQч@٬ Ɂ j,8 F *\=QFgɦizZ=蕋cJBdIdGRi kݔ)LBC4Stñ5a(֑#Z:UdG:&aR3::iQDHXSWXp0(NiÕE1wv'qtlZR YUʸ}5iZU p<\’yܹogGRXHs hJjֈҍq8 n !(liB%Fdo9lȏzY.It6r1WfQ)ˬЉ(F\Щ`R,h 7YWJhԩSzyL<\ ҩ l-߳c6prZ[Gz,m>N nxRMS->(GGمQ3)(8VCqܒX ?ލ)Yf.%Cs/xGDC߶ gHS}0u !ޣFa?\)y0rV/з=IJe9NQ$P'6O:UlWR5( \hN5(e:ӧ_B1t@1XLJR" E:߾a;EkqK 6E13RQU^XNOwrz:Wih&TaX5\^fHJ|߈ {b{n cNZ6EдձS67 .|ma m*oI`]o`!ȟ-0#cJ&S .hHRDm"QQDjpV?iLQK)Y%Cmɛ-QٹHMvzJf? ’94'29TRO#s 4@QAxDuz #-Zc@617P)oPgP'Sh!> -̝vVG ŘSxWuT*Tj kIJBbmR/:$]9Hi3)],4gC"Y^:&򌟌To0<;0E>Zc :QTɦ!T5l MHzP$XtO+p38:%NXzf4wlm:lh}083i l»pI<99<ǪOgI"w-wjXXA-&;X'C߱r,mH2Ao:k Donn=v@ ugA#ƫ 804{(x^]Sl`!t,^RAZpBCNI!.a26!Χ%&7__G&V(+訌[jLL@`;ʊ\Bl.{ /.TP|e,=Sr?j&U g>=JFe@iWy8^Jn;GkMosP o`:[ Ҵɚd$N|s䆳IajrDv47 .k_[pCй;I !>MhJiKb 1{8"K;.l rv۴_~lg+!> K$=d7 ,lLss-Aǐ叉A1xtqL$6YrQ"+ٽ(ߕ@ ~[\x3gGS0o˿GV)U.z4迊+B}Q{wݬ-́Bƀ4G '~ 0c 泭5ʾIJrNB6rUWh̸Lݒr;I_Pޮ$G^"PT0' ،\5 )TjyAHnoJ#\39q`6`MUŸ%A i2K2@uʙ3#CdacUVhD&#SsKwN:+0ټg}QѝO~Ɛ`Nur⤚yC(`h˕չ͡4c 367ã{K̸~ɬT" +4p\E a'hΞ=Hd):$9uAxE;:MTZ|7 />ߟ}_ 2Ss?U;PB W3hXBRITŵ؟kq]` \C ߛ`)>oaerI-9\sФݕ-Ӎ{}@UVe9w~Jz/*I|6RSfL[+Q;=W@ߖo߼ %cmn*VEu&!1Bc*@;L^m!NARjZ7`I(ɚ:z4z/g" MKNP.n8rl T:U)@Y ͇Q9>[^>htD]-̀0WmJ):(Ӎ  7n,ݸq?6}8lm`NB(hL:2YKor? hc,>}_zglnkXl$A@!'u9]>̓Ayqt T[[1p:sILiE!>ywh)e]њQo;Qwr@3M6C︙Z.J4[bLt8EP\VW2[[_l,*teNJpTf1.e_ t%ɚ5]բ1@P;X,a~1jcjn)P0KAGP}(\]p^G`P*2QOn?'| cmx53 ,btΌTepP39밣q-k{SwiQi?~'O]fԪƌ!dKu"{w߽<__hVwD,5[{y52}mkk`\asAF = @NāY1^uzBiΪo^%5W( -{oz n ~c1g?g@ ]oT}5&8@kcF+gH4E8 mz }BS&{/o1q=bSr T.9\ SK78}Zmo{y/DZw"]p17eqK.]yA~~/{g[5`1,#M:A‚0ڭV `߬3;@0%4- 9(0"؝7zGe kgg'=❿,EA/E 1K~=yÑf~֖=ԃvK]&Ռ޶a<:q"g|J2+0Bn|3_я|7}% Z55O4k rHZ?>4ya">HU<^!VbC!?42/,"F*>YʄdSwNkoMx-{w.\XН&A`Ňv2v/³+WJ0z=RN]؆O|"oQϿ|vwx|-67鍳޿zʲ{ꩧҏȏ(o;`iG1Lуp@LY+Kv{pAbA(k 20.Q#gmjK,r &ź7jK(xq-O'.e/ky???[[c Y?}~|A[O>d>W}Y9hx1R*5+3x1ױTi*V)<[CMWy*ϴ<N֔6gRqG ˊ$5 ?15K!<ٖBzgyA |C4ShN٢.@rV[$Bh-~i)]ISZ|6VBƱM<>tKo 7F9lk>]7/z|Wg~g {/70TE/=@a@1_cqX1r֠smVܯ<@A-9!e v~N K20p0G |I U9NP chHs,["{Ko,H_k %/y 9\ye7iFXbCk_Z:u*]xy{~~O=y0Z_%d?\o7,!ɏF,[[g[GI +`F* "o7TxK_Zq/?c&58yA=szznhWFtgӓͷ!UOC\3#i&%@ zرonn_ØFLJ/?<2ThƳ(Nu4F KrF C;DdžTa|i_h5 vl8 / YU3>)lTXf]g>,ᏅTEagBB LG D2ڀ{{|UT.o?j/*زX-=ñx!CiaV,fv"VL))azC#]!<Ã3Y$2=22H>i؈El+ҩ Gbhq%H4Nx0i۾߷-.i>Ƿǟz?wl_G>QW?n_Rn ~`;-_l* '~#O~|`-k^5/d_z1k^cM]dktU| _x2/SpvTO܌_6 w__bKan++ O즼5/y?땛|n&hTuXS‰ VN\R{׼]mǷ; ߀~$NIG~/VVܿoeJi?XI nٗ\re4>MElת^O\Y5D&JwsuXTX̖1~E爚w5"1QVܐNmZ&9"98g2uw7X-D8 CzyF3vw3վ,$K.{x.ó"0w o\)DC8>˗,- ~M//[KZ/vp>OІRK3V>:z38߿;~#\H1}7~Ae1o^/{˰//|>}˴5)%4#Zwo}6?2'I 3?_\q)kc54l<}lB_̠CݐcC[[6&OW&m{pڵwϸf)yLI>BnA%!|x `7Vr_K)&+ǩ]H*!2 ;0"E:'/B~Q=MQ!?J3f]jݖ p)}% @|, 7HQ db]!6O7 7FD9-ޕk>ѿ? {s!,f!,''ſ'Q"`v>S_E|Xny'dHe{ J (}5/-~9(.OO('٦=yG-9~|gy|$cWL{l_oE˵lk^Y2-V뎙)5qs/FŧeRh/Mb_f.)W%Ϝ9guyM|7WzXl&GA7Ϗ? Ӷ9 1b/;P&;1/f&<O# ƶ8|Tԥ㋳ o ضjR.:,0э߾gfQ?ME]u%2ҵ<^"3혓{F[[<ъ N\RuHnYvN|P7?*ig<3Oiw?zLjY/{s_/mwYVv w|S`Жtc=~qSkW`)H__%,_L807_/| `>o~'i˟}׾ZNkY,nCLu[~緜v%ڤ&;8!tz>ZMРYPg-/n *e;EМQFSDդغfYYzjR!/s}쀜$  poȐqÔ)|ʐܠ Te=x=%MӞ;(;=g ]xYJN5 dj&bOUɚp~mK1Y(K"`3UA-jx~#f" w3E5G#V^KLQg>Vt|>?8꫾ oͿy? SS~-˟߾㳟[ g?}E|GZR^R@yCPG5_||^MW :v׭}fKx1'$i5y"KGJ;Zҕrv @b|qGy*y(̼Xqlw_cw N2Kbs¬0H0LBV|Yo~`RUjQiZ*^۹ AE旮\}L8dA;PŒ61%c`!ƫN!l:@b\-oF6z~>2ZDu'SEw*k0|󞇓=IѢНF,ʯ?-`ޖH?N]2;-zۿ۷x;@kUvmS˫^RnݺU_?~'2+^Qlm~_xbgoqjc,,~?t}o6t+d ^.NJ8G?I?aGSY |zaPV SZ2U&( ߺi0gUbFL>0M*znERq{87M޽/UOT\ m 51Ƹ~n?㓃Ui[XpGKg}v{ǟ'ώi -M}9ʯKG[-4䓌ƏȏpuC{)o}[Q]C$ۢOX̺hek_?|'_L: IO?ѐeʃͯmD-ɽmo=_oc[TooôzO Eh}{7v~qu~Tw'?A 5rTb롓Rs4?@h61eڎtAtp PwzDln[7oֿK->/2!'"xBB0}8 }%5 Bpw䠼{ ^ݗY2k`ZpX l!EBnܻhZwo4}!Fpkt*$9,/1!jY7g+ ,$v=,M!g_?o|*BV3OG>~{~5Y{ak,gg|b¼)&A M[4dKz+^\wiڤ/ťPr; ;NRz ;6-o?_v]}|\RȖ'уsWIDZbvpx`%}?>3^Y z>v?C?|@{:LJ;#mDf>˫_-n|k_e<<<@B-Ϻttm])v._*C.۹eIr:W?G={_Ǜ`a]LoO~<)Ipwtu>/l48,g؛kZ7??Ǹx..¹xc.4%Rhi?k?IXAoLO ~K8|y׾wlwǟ'i$i<4mܯlւ/G7}k\Pr>OJV5GY._ፇ6S=o~u=xŀUdj).DILT!AsՌ%߲D+ ZAns/]z]q56di׀,S}g}Í'Yd\9RdF& Y0R<Ї>Sug`.X#$pljc^$'(cc] Z])ʶݼqc[rPɌJRܱ=A#,H44DA޽%wm3m;3]%ˁhx?ڔmEO~ym]3g'?Ԓjz K?V⁾~dLJoo;Ʌo6,POf5բ iǜ#&geyu6">"%0!M %a %\iynY&YB𭇿?)fdMS(34TN (ýa2 c+g m(Q+XP`%mX`œ.Jtl5p"=V-3ꚢ^ϛt r8q]}^LӲP>Qva96|ɿZdt̻KSd ND-]$2awcJ>H gz3iV"qiSv``VGǝ ݗlSnv_V 4DKe⾽[1@(k3F-f̊d/R'o=+㎣-HOt?!qu񞒛'#w9Y`ZpykxH@QI< 9GI4IGM,2#L}v*}'/*J6.J2ese ~-ktFB Np/]˗/<-zxS $6f՛0OmXΦt?]ow&6{Tº9UҲjvzAMꍍUfYwyo=<<N>;(Hs`n0iT_`x}FUέ~C;p-ᢕf0MQ,"Qt7YY$y² ~,vʼCs/.-)B dz gݙA(+y`"hf &LH05,!)UC-wFт݋kx`7 9L'S% hSV5/YJGI"w){屝o02BM k/c .3@:M:/'^vM?)&T2cg+T\:!!椈sxv,ZTFZLJSibT4YYμש.)X+pQӺ&Zp~ۋΆI/كVޥ_7m oP0C47#,_l~j&qsMmX6AJ^5J͟OZ.KΝz٘osH*"?EKi}AaaQ:z fwdE#˾ m}7Dw.ЃDVY"ᰛ#t/eRFKr*٧tZ,s2(ctlgvS*5s`c)RlkM=#yKDK$P -Qe/]_#NGQbv,iC! 벡;^DUBl]v#ˡ!׷40T /pVXמ@1*4~tRԍ1PWƙcNp{s ]{ vp%pHd +1ZRuu(&2aMZ\H`k kl_; -QبЂ*6^av̙n޺ad q/ n6Uisl[2+;\f\ChJ NzrLp 1;=\n=ڎb!],"y؏ 3 s3,fe87$$ E5-ޛ1 a[,]3#4& iykV[;Fcy x-gN7+SnT/ iw5=TNAa5kv`Ʌ-Eبʬt/b0 h_LnpYs/a`9V32D~vPrD ۊRx=WBˊZvhlT0֚ EFz$7eeݕ+W_pC|beXiVACI9*[p>3fwѢ"2]>nN":4M*&ҩ7+PmO8jc?n+LIQ@n%>D4%A1Dgn`40dR|ib,^9DBK)u+#$EhPx(PuKoOÃÛ?)e Hٻ1$jD78k!lOv<_áIszf-8&M2zU, ^Yw=xk#B};&BhP*0h*U,>] U'#<;T*~ySG%9.9= >1ŗx}m ]@`{\}`[@UQsm܃úН)lc>O`o 37ɲÆ!i@fs,ބ-Dx뎎Yr& VO(} N83mm( ﳆ垃45LCsPRw0eAxZhDV e޸ygϜyl pH&"a Z!IXV#yYebgR]b4 @`Fh_@Sq7`HA*B Z 34Кf)kD-:I8SEM/')5? 蠕S~{NtBjUR'߃ql^FM:f qr;LA[ZbAF  ]eLS0I4$;JW7DN $4gť U2xb⦑V-|n!6!\\(/a$XL:dPw~!Nelw jhY#w˝2< 6g(< wm_7${dnAP !nF}dήKp tX! Cvq2Yb/ϊ)Ș󪡷(DmRu2גɭWdX˵Dﵔ4o^ą^6)4ADz1(_>3 Zm]pg-xTB5:\]Y@ZfDT#7Y\rlz$ r xBIe(WvvԪ"h4;;t cl!uoB*Fӌ3 SAq7z/67,U5THC5>^I:?P0t)ѡdڊ31;6cV$x@)-3;6`rԽfF PUxN^4#T˘h]gJv/͠+T+xq`(sȮL=\|ۗak3ytMN}[J{=jx%`Xl%BM'8gxC&n?VdIj' +;$yNV8KXȥTT Ȋz3K,eh8="2MXN6OW9׎Dx$ޮD⣚L?NgϞ}֭[\,\SWm؅ꙩ; 뾓gj{un߂ \ e5kEM&2߱ zˈwoH4D?LPC " )iySZpF|zooV*|[]jf% ǡャ@Zp:,hytb㡐7s%E9l"5UET5bMNV ;)SbhC ._9983rh|[MWYȓ}\G I%F+D81Y>*D}eMSHe 4=QF"E|Fuwa2,w Va՛7n,2GѦ2z~tvՒP΂z{);U'&BY { a_PvvDZI;(|nigtwǗ` xo9Q8H(17a9,dg ĦQpf/}W!cQOQ.Сi5YA|!S3A84! 6J Ps;ܝyQaxi&5MVck\WxrԩH-#3FĴkGO( +kŋ4\q1z'a>4^J)3{L[bn 0d&:iWG sY]>y Il÷i֭!ř:5M(`r % eMbZ\"ruk~8=fTs/ /+B`(}>}S*N}φ`Q&]OH*ːmuBDk^=#,"uN :$MLyg)\x*40U_ǘ^Iuo2KvxtI >}Dq$R#2-uU(&g+buHQxm"TxMHfګ"jMfxW>N8A ~>JgOE&{hRio;B3$Cm_ &Tu_NnCR-b t6d$Yں-µ'~PVf –-yӫ;˹_C~e<%GuāR,afM9Up9y;[@=2n-x-ph[&%%+ 8yj!&/"d)BfAM):'[UV`AR[I"o^䳡S(=2 eՙX`v8*)% @XÊ{Ӓ]lvݓ& Q- %!s<*0~R4w9g2!P4/Um}:@"z7}ag2Ak\Wbu!9Ipqcڶٞ.vMW SX3hTIL!B#ؗ9k%!\xu,Q+'+*JnBk5 WzZe#R]2$,{MmEGui̙ͬMP$I Rڑrԅ8l&`krE(< 7ǀ^,`&&F1.(#Do-<0=")᥉߸5V7~Nmٚg,]CD9$E4'Ԭ:Tl>zo(ϦZ.c[w19;A$zR3ΙHl{3=ۘn(nk4,PvJ Un\  OmBJwq UDz64D'ӱM&HCib=1N8^ '榅GQ'/O 8=H_>QdE0  L> )BD9ғ?26H=zDNEΰ|! ? \U0Ÿ~q09|2'Èkɏ7]Oe Q~`Fb!fa"gsAr]H! [Jv=f<1YVW2}O#\z=%`aIjt"cǥ62l T6ҟn> &J7իcY`!ºUIS&EVP(C1]vjŢڻ4}8\RaA( Dt2,E to1s׉/"ʾu8g6:nG!B%=HqE.PYp_G0:I1F*Ⅼl@8 G2vM ^}_ZLlqKjVnt_z$lƞ[tq8w+' ;HyKix{PrRkTV\C\Ikqte k{Bj=X f t h1Hy𡇾t1lʻ -!Z$ݔDv0WXNn#k!Y.Q*{,8\rn˹g|Q3t }oșJ)p.bY l[X9i+nOiQ7LǸͩeA27nW\.f5qbkb9mv>f^;2YYRQbCมgh".j;'P"Cxƥ_#]ZġQ=^1;1]EjLqP;<96WFGpǻ!%nhgr z05Vk*-![We'F&wdy]NA}/XV r}ݯfK/6apm0F}*t쟮puՔ<÷^[܁%6wH,x߂)\&fd e"J {edN,PNwgtwo_cT haCo gevi\<DC[P8-TGj|j*L׎W P n\BӀS)Rj&A4,b :?7J*IU O4urm,Z7g^2uJ ͋*Y`(Vj=¹7L;jz9L3x^ ĥ7_pz-_c$Y)#AE I\aR("P&9Ҋr}¿l\3^b7|衯.SmI=m"T=T{H" [  ;vPH>?p{U4\y໋2!qpXER<Wf)Pnh$$1M'H^3E.qL 2Ut.o)ѣxDN(U~[ %NO1wdD ݳFH0ع1B>E3l%FԛV&b/dũW{-}!y_|Tg&'ٖ|fU |sJۊ(w,kzϠLoL+T ^"Ө2` o9HciwJ!ad(OtaANe,ngZ(SSqjZ.'5j33$ꕰKVɥ^Y-]7HߣL5}WTsgK=7c@)57lg,qRȁ ŪS1Oþ&̮Udyz=&j NcJ,4TwòðojlYDC^vܑ!_tzS_ELVXOW ]pqZ U J,1:˘ۊ‘6V&~<4}]VٳiN퐴hIiVkmⓤ٠SZ<`OnHtFDaN~` `)b&CYdӚ+)k2EG6]cOd ,@ZvHn9RTUZV:ퟲ^YgJx~xxxe t>!Yא6j}>wՄ'l%!#uO&~2X.w}^x'4c w?؉,PDPϯRA|ɵ3ݛ6!Y9 zo=72FЌ0:̦L}+@0 }f)vbh] qW{ÊN'5:On|YfS=-R0jjK Jn֭n,:ھ`COqQ_Ub N(͵kJ<*IQihM7o'U~#&1"JGSu4q2nA24?: 41ڒjBkn1mè1j 6%-ë^i[a>Akmү4Kq@ɂ0gyS* 3EոcHi(W)&4Qe3hlDabi(ެҙ&cTѺlkp/U-"0H3!ھ$$B4dj)9::zNAL:1Ȱ>}[24}ړg^:XF;vb~Wm{_t칗A#k1> Ӎ/4(c|8~nſ2B?jVPj**#xZ&RكN% i$ SdP)ʄV?^fDcut8[|ܙN Rd`{滮%S"U$ *\ZQ lA}&:G0N|%ۖqYΆz؟\ՆVw]4juKf{kg|6o7y*U7}%$` $UOOP8"cl[+Wq 20>,=MI^sDK,G=+`iR 7Ez * Px:jnI䑉- -*ҏN3{+Ni}7 1vkR-JZk%g~_~GDH)9`I/L3 6E:xZU)# _yʕQp(_*!z$%M1X_UC'Hᒩ B1nVZ/ss֭WyTb\\Cc沬~3Y (# O*yd #Ko kNCa|2T`SGF)=sLqUҮ9+CV!rFO޸ cIp(s5& =^gY~#);jj;1㮑AARˋ6qpڵ)/)}kgN(ta6w9zz YiSo!!_E) A砡kb EUfNoY՞8Xnaa0)aAo#j@kHZspo-:*nwT ހAgS ;y˜<0C8OaYc"K~XqBV-LUnXbz^'=}j7e[~n\J3*'3ϿqˊŎi #نclB~U;%5N,4Dj %e{w9vןQDo*'2f%Ȅ`}( KIl `컢]?kގ/iN08 $;ھf7\LtyJ-$A7i`b(S {!42'n'otִ"*1[$A2Mn"Lg,T6H{St h>e$J$o*#DM,uˉSZ'V{k Ť$ŮPbsW 7`ӑZ}W%/E Hz&`M8z#cB%!?J ӾXfGgYJ(tR$!CD)nKPB}Zup=d 8ĄUmaCA! f=9Cj\ʰZz|Lhݬ1S+>Ԍ%v(3At=ynC:TɉIM3~clW4psӄt͌|nvUoѢiEϹΌVLvw:U¥ϙȁLtF* aeNIހdإL'`*~DaNg#4T{h[ nw6gs(PLfFC-ųR$*D9cF;0}ƶ _P MaU+T_F2GkJ%BmD\ԝwj$G6Ч 5}ڥ%O*jЕnLLٹ1ޡW.'\8c&]a@TY2/>zxxuҙ,B ]uD:ZGfxZ$ڨ.ke!07iӣI3Cl^GmlN M6;)".,bqwn }@,~CCWӝ%/;xhl-3C]2»z#L2UewLK$#2'2 c/YEyk`E(iaݷr*jrVw1rO`Ѻia̓FؒTu|$J_6%,mxgΜy֭[\̼C[Sb]/` ؄,2]^ 3Lҳ؈my^$UA˝z' Dt"ZJեt#Qڵ7  S¢q' \,a!+&ň92 Qm rB3V2OE SَJ]IH/g }WG)Ql\3Fׅ)l5z Y#٦;Y!8r-XrZ!e/G[e"t\xJB%eWUGd=SQ84UR+d<0L( Г=Z#nMe~/OHXbAӭb7eh ѻ=Me!@mT`b vu(0~Q0sP =Zq¢ %l3彡xP`9@L<z b91JLPYe>EU>c4_tQ(_FDi\^&D?z43 tt̮lNgH Kt:w:o2\GSG_`@gj Le˺1ݕ@4Wlyp]4W'!~1Bn4|> Q5Xʸ{C2Ip5}uTl;Ԝ!y&g b^.h}>c_Wwہ93taYy 28yn;$]Q9*0A͒8B=:\!\[v'/7f:mc_T O؟)n,x(eNeoM%D_料yxxx0_ojcfBI'pV26WA@a%,1:p0Oe=7@E$FpfrdP o(6T3B™] 0vŽRUcym/]_ '8 2oU!PU\)Fo&IPh<2iEwI!O"ùKڃ>e))L!3`0֘3MaV^BcZ g4oqIIwCk`510}>mh i9ta2v/NZ0Cr3 Vv0*e}S6 nvOCtaNզ>-6V=<$$N_ p s&6t͈_xڴ>2qC]8>g60JX;$ykYpQi:q#%^+W]TLA[^l>孧%69wycb":U0Bz*p(A>nq%.$:2'A 4bX/E2Y;cZi ?1IX ţa}ɚ3clߍM,jQÕ b)5e`jH|Fe.2L+\uӉyί:0&Yn>L:DDAiӜwHwG ^_W ޓLZd;ׯ}d(W2xwEi&SPr1ypnO3- hpZ0@4p+ @;:9.]_J"q#wW3r*i>BTp"D%Ft53[z2A|,jFbԛj g xgw$j_ձL1J=GPRfWΝ=wm2'A@RRC{&y[aLCh2|/d]'ف1B.ŀ:Ff+! pST5xC~gp 7F7$덨4|0Wy}ގ$!gsL!4%AZ ;=Հ,m@/0hg;۬^,@sJt0Biac3 }H6EM~KBě4Nf \{($Ni}PH`s@ X5V{F^u*QD91J{qgZ={ڥ7H*3O3 `,y12)Gt^XZn58#wpe.^;0Kcܠ$05[A)SZL()0Ҁ]#NbfrsQ\8>^J5˟Yw=!q @T\tƶ))iqHX|ƀ'RV<DZF Ɋ@U% ?a lӕ/}0^aΞ;|E-Ǣ호;E82#ڂ)Fm9xܔ Q%NwG;pp5 '`gpH[9x{bu3. Ucw&H#/~=J XҺ=VQl-z4*4|Ѝ s)܌@\a⠔\Yƽǡc"o#㒆V_#+RXȐ0vHд{>ތ-QY?Asl7G4n@ve ZI1%'%,5+d GN"HYRel_yKtZ}6+ db*..xyuDJ˺|s.\?;LWTa,SuE]КBPW38/`֠]I64(''ffg\v՜m`8?KA5:# ɼ e,epLnL S}ijUG,+`:LdCrW@9 ][H*.d+9 T b/«#:͞|NLGQe0]{t2QT=a)q)Dm^6%G!+wyvxLZ'e("p]ͺ;ڌ/tN*44!(K!j2se谙`tHa :AplbgHpf^G )P -֏&]9Z0Ek+]Z| CY2% Q@dpJػh7$b0M?m:!svm1=h?Z&]= :Vfo]ӿ;L0`^ؚaT؎.Iѫ SPWu9Q7rg whǼs|&`a4w7^z0+kvJV+>$Kf23{<<^mCPO9>Rh31t2 QV T bX J lh0mFrjmB8%k<sŊөvh,AF\o  i*v'qːC{z^qhzQf MLFczd!h0.e.84sNrэ7\r1 D8,zR2LAXVe/=[HH̘Ð1 ;.!wۉvkMc}|_dpKtǜA8†Aneedare\bC@БfP};5 0)}+*Vd}_gi|AqrE9Ј<Ϋԟk 4ؕ1LkvAhQ';32D0J^ ZK]Ee3/le LyV(:\ǏPP3i )9.dS(7^spZ,}\E']lgvEۤZ}bBCrctFٟ0ٽ)4F#)$R4Khj3 DTwy<ǡ@Yk3oK81Ytqh=o f$=/h)j9b0"IxP~zkǞF+LjkGڊD{LTl8Ln١#)Cخ'!0جm!"t4 sуɲC]戰Ggle =^r==P`gϘ*xLzƨc;1Z+_p楣оx"e=^.";X B!vMkX|l ipD]5NwoODq1vaӻd(K&0eg'Wļf5I)R)6%,9qܾV#!~pHL3؞參1<#;]Y/ S:ԄwԠIr5YrW HZ=hgV+smd ^GCrԞ;{o\i,k2kRnAêN>`/MVC ́R)U 71~Z:ik+o ~lpeSu٦YKaFaf9|Ö]JDjS+ix4#27ln}ժ94t^Mmbfw`^Itz!@ {(! D`ŝgQ=O36{g3QU[6ͩCˤ[NGJY۟ϐ;q` vؿfB[;'Ļ~j艱n+e|"(IL'5#bw HIReϒj&q-&1SkWVdɝh:gS"~3llD p"I ֲ@x!tmhx>)Xd o]^֑)4Ǖ٩{RR= !.enwwgΜy-cF8w4c*6Ё FE:q&t~rOiY0K 6A+ҢއMcx:#n-/ 8rV7oCfR^C/_lmLj]-(evS3Q'hHȆܻ͉_T5^[$!R bSK p\Y\,Yah>SЖ"F s~`vq5$A\,G;rϿrY.S8W\~ .g  ALvw/7\:S4KM\}$ts6ðCq2g\WNr,:H}_(Je˔ƌXt`2&tLL9/ҩTG ,]ٰ'>a9w "w S+KGORg'&#cXҒPVԭIL==~:1y)7`97;Ôw.@ŸxE/_-LOk;'PK.=ŋ"ZDK3/?v!膾\3ĸ6<Oo!$hAfե3Ɛw{_)KNZȱ3v- y9q&Bf:R" ;FM%uRxf/KV0.S3k,&#eX7' L-Xd>@7tk#Ӱ*(A[(w7z?ZA@J' (InMJr*"WF*iSΞ}_VNt`swB6hNY[f¿}s.خ`)(, Ag9WM1=BɁ']y~츤xY@'3nip?,e~d  FJ7/C"NjD51]h2QtNIDڤݕ 2Wbڹm@'MsIlݎ I@->+ӤRe4v;?uP3޹f6Aq,I$$.!"@ e`[ Q>}:dzwwۻ=oSUw0s3#{P9Ä5;ie'Oo"Yu7n_g4/Ϟf ZxyRT(aŵbTH؄F 3&r>J")'&#}c1@)0%%٘)TT6! moC^2k.dbK$Rt&Mv4YS'#."=\DKV_ SR"te. fy,T4'9}F!hqI&~yen0)E "z$VV`7v\ i; y(\zxQn3@ߗ=jB_r_G F-;> a)iXݽxv;@J^P%v?]hQ`qDsW0unCo!Eh .fDaKjc)n=yM2yM]K9Of(i76'Ҍ]BE[+ZLm^xw?_9M2e| Fٚ7"#[5KZ2\<~t f2%W;BdBaNDgz'K{} _ QJC_RPТS{^XtŚAǒMNfGBJPNg3fToigjϴ//MQ3j 0 }vQIW4!/d.h*]I/`=o7;meDERS0/F;is;vUhPe!. e )cZ4~yH+1i49x?SҿNxұ]J<%̟6pST0ͧI2P~1hH!zMQ_S%=ՙ05gv EVYN2v=Qlz_\BKas9UulWRLI  'Wuu f@'ّe "—'MD"H-t{,)BH5<);)N%51C}=#bd!`;?]_zuu̝ 0/x0.<4"{0Px bb(ǖ2aI3؛tԳI7LIEf.:),!}{Gʮh~K-N!*ۈ\``}U<fs8vt;I-A2 3T ;S]&TL r`[}ܞ" qFqZ"6$Do|?~8]I["N/J"C8e~_6]Oᡃ kG8SLerΛB.DY]("9|ܐB"h+,UVi==pQuHmx/Fc."ZgO(ZgZp& sl3mqyĐbfYx&&>(yb!v'BDUNrF(FI?(@y5+e3m!{g)KXmuޕq#3tӴPV*jGsBn ~q a]k{KT7?yW0NTN,lcs&`ܰjp(/ JLYL-Ժ!7hq:}E^J9i~IBy>(h!^TTY;IiSD>Ȱ QI=^p|b'W o\J2]=[t@\>Β."aIQ4~@-;ܓpUo7T=`P&L% MPy`Em2Gnp%ugI}_~l.0gw!&̷ 7"f`1%np{"Bx<ey&ڮw, g䮕OJuZS/Fzҭ8mM2E48f(#h#B$-`,fL׶T N Y׽m \R>3 >-` 66ݤ{> L7;,!Nz`q|eӀ`jwTw?B%A0x@xf:*z*{,3M,ޠ[ k4yZGj`rA~Nԋ+ݘuE@8Rۿ ?LyksYF M-g_*Nyvrzman1" ^~?%:s' A4oO;#⾗ v^HjN~^ "q՝s2 @;]4W9CX͑na1x0u!;0I7 ',4a8-iB(vp|!F?O@3j,ʄF<H- `e^1 %&l+`ڰ5Vi j> dʢsEeA۟ ,l'fk3J I5Fm)f$/y1[ou>D F|OQt26 ,l)f=}MӾ@M(L0R:хMoCtCknE"Y80D$F==8YP(;䓒+7 tdAvsBHJ Ez3RlW⨊,I"Fj,DM0CWg$22ʲB>j[cg),V5>[v8Qdq1 U%("I(8>P7WL ;M}!kC;KJ51>!^{gFX>lgLHR{m!mpj,s|+fž_2H39ʺW˿u/"%sn\CQc6Wd&]l`uJ<„Dmݻ@-%[bEj4$B^3eJ3Щ!O%wa- 1M^? 4A-)?&dO3 +}e9ĭgߧ{G,0Mot?neb.DE<#~,Iz{.[?cKOX@XRJ֠Y]%B"a c٤N:Ҥd=)ݣϿOi w#E-xu{/_GV9xz*h_R>xUb(E!,4CƢGgԜ+rtǷR}&",$gt>)*F*(nw_B `Mb;hP4zh~A vtfN2D r, fKMu/)D)U΁3-;:5s)ֽ1KXEŽ=)xrOtUD!9=bS?{=Og寮_ O݂2W$8*1[gsL`z$S~P.%S?P)EY q@ %y a}'Z喡5mup #˸y<8/fOX}8IYeݵbCdT+;!nNz52HyJrdPq_5m[#qRϗq4c1La{R79YƆh K'jM[)bꦶL"wyBDH&SE.l7>[_ĂWU23?__3E {QbF (]<3񂘉ܻ?RņAU7^W=qƁrY6,{7Z[bW@ڧ-b8͡1*.tbLG57^G tSXg7ZR˄QL䨔DcɕMx~_NzqL?ݤG`{7xdb>&}aF%8.g 8doه#h {Ǐ?Ȕg9}אu߽~B=u3D`!bDj7R" j0:x)*Xx{7J)po&_Xa,~Ɓ%II=~z1mz0t@ 507K Ck4|omd!k;: ÿBzAG3F6YClm ָ\X egOy.预VxZ}6ZU[8lC1p>Ly4_=y%TxoRqxӽ\c܉`Б PFZu-{#]}ްM8G~M,KC(,29ģ88ţL[hnrx5K-PWn<)Ni PgTG'VXĂp/ BlEgPqh7/.=qh$(?rW3Ew6V);;O^<9Mf[z܅(y`dĊ0Z"{}|$E(/wݿ!anNا68#uuu:7$wVtჾ@Oes*3tlb ;\i e/9 m5nԢI!7Gc/ P ,Qi zKߎu\:f#,4oEnX_p=$M tO biErO.h>܋dҌ !qdGAa~[r. FLubu{^#{s@#"*ypTʑ2ewg~y}W椻{/tb}x, 78TqlQ4݆Ė K7$OGqݧUe9D\ mv鲋lumF=܌<*""U`ۛB1{hLh+lB`XC /]xhyMC sB905euq:pz!Io:rXCWRCq`?hviyPSj`1l[QYm:=J% AYͨ\-Lviy)jxϞ'O|&#)xw?O)?O^e@wz\=d E ǢNqFfV&i^uto8;ۖ%!3x*HnX﫣D./aZe,. $JW $Xc wa9>AuT3K5H3ˆxWTtk 垖%2cp'bn"$El"+X,e >ŋE&ɁYmQu4ҚΦ 0]K5}r6\lfab7=)?5;yU8/Zb: _ Q%u}i=~{ck0çz iyJ2Y)i#TҺ=fjx`-1̶- Zw3j7l]`p]:MwR(V^ $6]YJj^+mE'?NtwZtE@S`Fi_I8z حE&c{JfZ1u_ lR,I/^HÑ]GNwof=~gGkh2Y!!946 K  EF;I?\B Nw*\Q7֍dd-ŭzQؑSP}Eo bh,F*u;XLWzT sgM)HTJ˰ rtAB9j2דS;@[\$yPW$Jj)$@(pp鎋 bi{_?01w %LH4&X33ttZ5, ;1h *:*--z˕%9=)iS qlkB{FLOTwVY{Ϟ>z!8'W@lo ݇?i. .,lEkDCWZRM,Ԋ83e{j%@aoF g~&;#oJ#|u *\2l0\F2Q*U!ܚ3 P64RS'˪+>ROĐ&i+{2`5zwH -Oe{7Yq0o˚3Ted up TYvU#\H:WRǥMa"~)TJ85FvN ޒd v==xUJsdsIm3skXOS6c"IE}o z0*چgWaۥipr.I]Q̎GM77ó=hhx>r4 .",ٞHH%DB.eMZp>x`FהZ(|N:ebҾyjSb@؜&"}KŖS9UZ $RwK4 d:K1J^]thkC(P;t7wmȉ{:6淽x5c!mٳg_<}/G) dh6k}3>yd.:̇YJfQcVe܆aPux>YH@~¢7fнCI=KL΃l5r_B琂H/ {T;s 6yiJ4 1{ ʰ^=,>{?Xi y(t_yɿ]K 0LRL)_@m=<}!5iJrS=zj+p&'J?@:jB2[-Ӕ&+fRB"/{e@t`_vyȝMl ز-GA$$3jW}")7WY qDlPioB)Pa8e_cK%rs9<2d8 ]G&ku-CP )P\[I׽/o2f<}/?{1 >wx//Lqe%~}yn6CH{؊s$ cc Dvi8o<?VI̝Y"mó؄Օ< 9(o4T:Lewmų8O|2 m$LuIF)SP uR2jrA?֥W>-|1qPdR򎝅*[MѧN(C`nv,$)RzjC!UP2xZJO{ur61J>ӿV`G?/;< ]?W)& L>*'E;3YkWa wP#D9q & ؠHo|;gC~݉_k[{Pc?1L"Y0w~%l#rj]׎)jI[wB[$Xp݅V>(ձ,P(tL-kn)Y~L6!KazpX}5L`.Uu qb#T ƆJ}gଡ଼hu-cSήԖfOü`Yk-(0p-6 e J1<]D&08¨ )S6|wmKZR>Fr1/l0Y.x ޗ*4)XvwgY c~. ^M7ǿZ1W7:܀4Aq'j5d0πVy=}Lcy-*LzW+ 4;K_D]rt`bXipO!iL„MOɞe")z  q™](-7Y0C|QE L5 ]Ҡ_6&ؓ4ީJc?l܂ tK>~/GUyW?CGSbY.vX"T2d\=Qk$DB,МTG8ۥq. 4Cډb\bvZDW0p;q:A;nBZ$,(˺MaUk0yH²W6Kly ʪƛf{WIV8]]Rnu4<0Ap]ķ⒞ nOܶ5j76gȘ7'7uB&xONx|] ?EL)2 ).|{Xt$Ȫ(lO;-H0pZ5%+ʠ41apT&pY-Z[_hswC?{w7T2SQ0WSmcعZB}E)[o"UV%Ǝ" XX0Q,2(Ewyl[Fv֘QE(ަ1 {Lpl>uȘIGg5t Z2E~9<q685Ws}AoE/>?Nxm7,P0ZV*aR1M˩Ufv`HVC-oPgVMg˃+a: "/d2)D]Qq &(1K&3gNV Z k d$╽Myu'rVdToG/^EY[g=~ɿ'90 ->Dx9D$'PaQ%Jήv)[Rv^o{#hZaE1]iro 1tR=q }6I~x''o8Q&##m GVqSa AW]UDpnQ eLBu!Ҙ 82E,iDŽt*,1gˊ'tESчƀzoD {>iB>7ӧ~1}p);8{rH€)b 5h+d] rl3]*`fB7fR;RNYu^Lĝ$QۙU u;X6c7nr5BcbbetYK((|p/ i@'Zp_= krD3*V&9dFģPM(2Y/E1ȼ°ViPKCK J»z4t czxdn}14*nD5\`[r˺7F!0Z=tf;|=̘ݠԛCG:zz ׹$ɆJy2m؆r7D)Ctq})=[}^3?MS)yJD7*^Zrˆ 1 9.fv@[ERLz(:gs>btM8OkZ}0^;(ps0sNw[@gBe0~ !"Z:n2_ьpju_ $hw٩cZP[N94 \͗d>ϖMZ>>}g5݌q鬓E.U-@ŵx"&,>c$n8E 4Iu]Pbm2fAzE^ml{1@OQMB|9ۈ92~MRd[7^IЧQBwLЌQ2h=·#|J6Ɏ6rfSq8-&6f'"jc0M9`~ d G$]ړCi99Hg]&A,O}L3nWAΓea;'zNv{'OLx:S[9?ڻDԈuq8I`rv/١SW2كϮ8wubPK B\3Ǚn#dGqϣ"er#d CT8j{`5DCrOmO o ctV"*],XE,'!7"UH(NY"*Oᶉݨʼn<xah k93KӅ}2.0 ۲AS %%ب9!ziuF"<0p_vLb賲ÖQZ̉?yO=IZ;Gу!kw0t!vrØ{6N(tDfgf*m%,ƱcFag;=a9DdJPMa/iF6d B?I :MWڈLZz%B-p c1dRaU|02ϕav'R͉gKWw[8~ixjhYRVk^;e'=w2.z߶,ݟ CivyqG1{=!=qio;](鐔mPj6 ƻkvɊE[)nz9W-$?Z<" *p^zkha,:9upy&D|W:Tho1a U$GGޡ+35x}GT4`_t*z 1vO:FV Bjӥ+ztd#|@LO a6+ ./&:&9Sꃺ>/a _׋ϟmfkT/8hq8ˤ8\= 2>k{bZKdNou e &9Tb5F[.dB:.Hrl%F`M-j&?_mB{K޵5ZS%-f5,HAN5oӧO9m;ףoW향 v}-`L 2k 86 U['< QLlx;*w(h1Rk6H7^ x{*BƍvlG.s\##zG|c\lN *C-߾ PeԆflwZTtHIw`qfUWea& Ԗw~;'3EqX. 6Y:3d !~`ZQMYx@^׍_N'ǏpľC|BkVCVB5@vxA0K.! 㔦T-_%3T$z`ձJcnC65Z͍_]S$ԧxtC#nl$psه4nPwF=KHyh4lq^fր,*`~R4i6%.Kˁ /J"!,Ē!D:==RrPXa[DNRKH&qMc"qEճh>4iE7ɻ/ʇ_nY72n*&3h94<.;L)6PeAip{ UuSTJwA33Uy}}2%HaKNyTYRo %_Bl۽DMcΟ9t;!jD{HndZNK5mgW[Ю&Y=^o7A8O%4VV~?/\Kgϱ޼+07G~P ͻ|_pfQzZlcLIw&C~Gk );_ԠO\l%Љ3f@{)_8Ɏ0Ydeq>0 i6}cqxB.>>3MPx :W% *E%ڹU E1EEܠz#S&0K+=wv.yy|r,DQh{CFjqSLt)6epvB8N}"螀)AKXln1IZe{Vzm Nң61igvᾞ~5wq~~&@qȁu:3N_$w!ݥ*}Ѕ-6n,d:+m"lXQyx"Nα.YMZUa٧҅pi]jn!Kԕt#:\.AܹnI':@&+a0^ʈ)AFikd(nŞYwRx#-]0dmI7XQ7 F)%Rh4  PNgdI٠&_4Hi^̎a!}3:<ë;|oZlN/dTޕ&x[&`ٯx3,15]&Yy)u+& 4I'E]}#gK2ҥAjU/e:_(H(wȩ+).!A1wZY ;QHA98GD9h9 GiސqmdlkJ%w Apl" T_ R*|Igʦ4T0L љ+%ūJXdžȆkcjNr wðk USh }q>¸KkvlvjR'k[i D# JPQ[<~VDŽǏr>F =ze8!ﳃnFQܛ''U~ȟ*Bȝ#!$6PrGk!cvx0{^HXOG`ɹ'CFXѣ#uHwұ5B[tT. Wmv~2[S’ۍN8w{؃D]83Zj@ Q58xޞ۳Y& |XA …d, >'3o@Apȍ}OSQY@qNww/b0wP ^P?|`<-0t sH>UMxn n͉]@{2o'4(B@/JdNwBg YS/{w[]5w#5w ޞYiW挪A%f@H-z6+YЃO4,~(9RH?a _Ytަ)XL>cZ&sغ0]PM?4[4iFqxO]iPdA| wӚh#L@l؆M^c_为 Ƭ MSiM0mDз'pAXSH>>aA2E-m *> (Ƀ[;[>Cbܢ2:ԥD! ˔ LAy`Bゑ/PVaxbRHntjMx$UvjRy#5B~Pb]YsOa{i<=e8Akq(0ۈ1 ,f?\uqYḚc8GUˊ-!am\ԿSćH D:C38(xf^h$ODͅcC=L չ8$8OZ]nw t˙/u!/q l5=m&$УFn6 K爚Lo6 KB>C%vvUSLrMHjbޭ8X..ϚIdN(8Gt;G~V;y^oT< k7^n>ͭ)p|Gf KQzuIБs}UP mX=#!HV4S:pU[>H>ݣsHs?}Ǘfxa nBMT嘳66O!ͲL WJu]4A3\ kԌمc:5GHғb |@ C116bt\NUʷfY,qŒe!5(T@p.uAݪ?W+5158 nV|i!W88"ڻJ,Khkx%5͡CDVص/wF⯲o@ly?4Goнd IFS:;H u݁Ⓩ1 9pGx%`}&e,ם(!5XV_ح1C\MVR+YMNR蕞[ם8Bc+6I?͚>2 &eMRzGjٱT~xZŐQНd`#r!ڌrÜib{m[_Y"30.tglS4[;MV}4ALC4cY6q =|5,T;mq@w} wg#Y z$2$CHkg*t8X,5R &SR[-,A6wဣ2ȋU՝}+j( OD9~vhANƸz,[{^ %wNı`(߇Qs}X9j$w=㎻sf@՚N&w*5JˢŇpѲYB{R{N@"AwhP!; l5>’dqWWDrbՆ q8((W)ޭNj\ ȟODzr0F5F3i,Q\>䂧G+>ȉt]p]{(Ie+J#xp}iXӈy>i'T"4K: )2_ϦС"tqv2H؇d^ǩĄI hIu_ 2☝5EO[4V'Gqnh:iWnS|L{+4X2y4[/.V:Ö8Gl3(+iEalZdFX OYAyX*7Hɋ+m8XpeN+S@@,ůS[V &PjS,5gFv" ƓQ ͵D: Z5 <͞=hFwϚC ?0J}1C!~@ mN>lB7T"UVC٣rȩ;"Lȝ!+%i :b³L+ 'Bkի?֜q`Vz1U+-d!2dd:D퓠v.덇._P%NG?ՌXQBeVYڀ* g!d̺U`)1D=MwWFpFtF< SO97ԝCwFQ 5\d lxaIHbfa؏*N8@yNNF7NiuEiit'&31c8$‚KmEkr~m1G- VކVt%R[x di!fʛdӺiF؋PTD1U1 4ʔ׮'ǰHK34V wɀ(2ȩ9xHIt] /]\f2!MXŖg ilfVbb hT,<H 1DKjļIU4M#. s]2C ME72q(ƎEYkt`zD>?&<~(8ʝw?N3gLs/^0_cP1SH߶<ϒdUZF[57o^2hh}e\,|hᲹ6WE G /_a<`Gqn\1JM5>] a`BXNDKWf8qOf.|LLH+MhRc + uɹ~3dN`ؾ3^+Bv*kmVgĜs A>ܫo{ՌLu1N,}[I"W0A  %3)>xUvSY)|I]d}Ų%UeRQ[ XY8!C, E3;UxSq.M/$HV};gzw3q2x@MA'2* tJmKru A^&p"0|$Cܐ$>2"k]O ^[; 7 G_˻o,o0%wpHF_or=FSX߼|/ &<˗Jlx_SP{Jݷ ETyrIPOo03`͙;uCs^kR!Sپh}E,43x>*^.!du/+maրޥ?U?( ]9q|oԠo=[O*Q;YMX7+a\w"Q5i@-hՂS"HFɺ+zؾ* 5 ,Gwd?4]Dm7E$BH)|,/Cxr1/_(//s%MzNxka2Z#5`gmE9,P1l8t`+%.wfC;= m_VC!ݲg²4N c}UO N? n1زYm_;AT>qD寜f4ґ8'(e6^2O*Ř(Dw8!hc7Υ7=%i $y5a@n!ȷY쾭7My^Ox?ŎQJg1 5ZgZ?3UcvyCJ*5tR诨DE PHldj8Du'9y3k4H}Xq[MdCQN[mQ*]9`Nqִb2Nv%:-)lhQig8@t!c9zBUރׅR>W֮/_'V0͟v3 ~͍ Jg ]ibW51/ɼ灛cF/<3+L$q:Ft}K}YgkXG \rj\YB&$軗`H5 ٲMÛGM(:}Ӓ%F!q_oތBW I/Jw.a8.!TzQ婻ԕ}ѝg liJPfαwΟh AgW: T?4>d=I\\X 0DTIu+;z"WSm*\' ;؄ ;t}LŕO!@[H $+R, ]S+,v4I Xcaj*%Pn<VJ#qsU 1KYA81j=(z]6Xx:zhI#!M% ώf=<%ֳfa%&`mZ6*tM ׍}p/ {-vIu/(Nøuق_ξaUn0QfcL_?9I3ѿ"cOޙ4;(bs%PcRPjj"d n1`c0X9Vcc13ӻ^ oڍ,p69pOBP೉ZNG.h<*c cw3ΊwNHMjMaa>_^2}p7|`[ 0% TAMeͱmX^aZNJh GXӄuQIh =QNd^y )Ŝmpz9q4=͘y q#D#.Мʶ%&tHQ.\3e!簻~@MK77Y˴[oz`fG{Bf'˫{cMgv80K1gjIGCu'꣨*b2*(;c B%iN hz+fM\[A韖} _a=Kp:Qz-im:SƘt+E VzCj ww@U䲛\bdJ͋%8f)g77r";H: UX0!vGawK5H*xmr̻!J—8/'??t'Yr$Z(SwveNϛQfnvW%N}wh~?KF2 L<5c]/}jQNHhlIaoz* X>CFC#" n `Mg0Mۍ]zj?HVcݴiٻKVٛi)L".7.y|7TVc/[fj+gT]S7pRච(j84.R9R紖&8F1xl;" TɡfuddA)0twcO+`2?'S-Je]C jRD067وelOPUP3Fk6k6k I'G4pg5pWH&̱$_LK=%«IICySݩ \,U[,0[^ZwC hcC:4?azNxZ_?Q[)CQytR8B,8k͕\;2q*lePՕݼK?fRbΘ$NpDBM4͒3D8}P2Jٔ͠|@v.3 C@Mqki Fᐎ[ aL(b};a"v$G+9@Zl-nǛruWw Аf\-T] ˡ*wNʴic}6y0 :6 ^'| [Zf-KɬQ]ae;0 CV!ḬcuGNZGcLc2J|`2ʥτyT|SZ=1 K{9c*KVbO1~ij/kEuZŽ5"*jB;R˛ "݇ܡ⺔W&-Mt(ˁgjGmHB,ȝ>puv4_w^7h~xݐvә7˾t.m˗d#܄yfcj^zd5 FZ"p0!沑ݠw BP)Fw(yt?8#}w&}6pQ5%QWej1Cl$\-Fg  QgIjAw.?/i13Cۺ ơ],&GEfcC#nZ‡fˋS٬rK\z8Ag7w~tXẒvгW&iA7z=5-Ј%x@rڟM7sJף؟5i)jT[+D{\e.); 0UObQ}Dh+}'h0J;4F3ڐ$k7VVgK"\d6Ƿ t I4gt4QƉ]T:`IXzp9;g<"BlyΛb򝹘H4}ի?z%(,Εh #2(9fW!=(Jif`'O3X57εA>/}X ~k %I4Ȟ5YڱVkQK` NEh~Bwn(eai׽ f(nJz0 mEg1K.M'>}AU0Y9,<~TH2ȐzD(xrK B1}9jA!'C .Ry\"B!83yE.e7~V ΎE|esGƳč,(d}V|ly(Q$.Ѕ)Q J ?',fO3)g.o*[U7UvxK\SШr`Р|"Nt厱^PF }0cX*{` rL^G!Y JD~q(Tڝ)#$JS[ĵ,>楪}*P͚)R8MXгHD3`kciJ[(*z `ͦ-@|Gմ}M̌0[68sWD X-'^9Z4̫F`htM7eL\30K((ewj0-}=WߑN!͟ oOy?$^w`eҜ-|s%v ^*VfגeGaYI̓ eiSZ}>`y7fAs ۩[xf("h5MAy iכ03#%q|7;gFo]8*?NGY#D?,G>xɲU%v]3+Hz,KM՚e2SS"k.'[F3рqk!˜TO+[NAC<6mv:G'?޵G;/sQ$ȉ' $0q>&FtÑI,Ć Eu Q$όEr8=}ֽV~9k5LbtWW9{^k[7+?N+<>88uzvvdW=QLXv;'$ bE8K- T''BFU[ 8хL >VENoǫ })T[3-hd>Bv)ݽB]2".k\Ki\l5Ȇq嚏6;ӳqiu\pljFj/%'(i%MkcQeR ,mDےm'u0*PRe.01d2.s:HbKȤ x-Olk+᷿=}n]i~lE+i|KZt \åWoYXkj/JÅH 2mu:±h"K_lƽpQ1CZy_ppOC#ɏF4oD.z!Ckgbe6/"^Е śp"@P[<ūv}&Aa E x:1&!QgshLI ^v;!#r4;8%p8DZt-G Jn2?AmnN uڤ,ѡӓF:|_Lw ]y{BBql+AU@H*/˻UifW13szQo13BK|azlLݡA 89]l[  3mtaNYP]lKт{ $NOoTCkƮU[Kڄ֎~TcCȖM0w4[}Q 4*<2;OEBw"%5$S&u{9.A]|W.X85Re*nB1}O\| ^yJ㥏*hJIk~&JpX'y7lqR>/{bo@U SC`L$]j3$صx#O01BEz]%? 4m164CJq.C-"g}yގ)vr>)UU~,|wT)pr`1pĿoS74(Vj]Кj"&]op`xLF\+J%,,ng4caYlMNCXx,HOJ2`ǑI".!D`^}f?ǝm"Z7(/zVG=Jb pN YP ńɳN@d Qz}E1t9%)[Bd²?vH0i ϿG]`35GKǎ^RyˈXG!@eD127aea7[=I)j4Hݱ3'@=f-"ۤHqj ewnT26Ug4u2Mͪ #3X㤐hp8 T쥽x&oz '~=o"w*Ewtb*+ɜ$PRu-=ݹ!ic&RX=Nfɚ B?[Gy?h\؏QO s# 0<D2OI7yP \"pcaMMŋjO Q#xEUb~ 2\IB Mψ#c>}sɜT&睭gnfDa0e9ozaPk $VSɖ,Pi,#s(Q/j_qS(CRg)j9y8l;B=̏Cu)AwhjVw-T\.(yt@&i\*5!tZ1'aV+0P#kJSm*`XsN܆B1?ōy"SBzN,-#DXck:{·k}]q\Ih R԰1.~M ુ;?킧xGOxvzzv٬DtHd$U'Z-VxGS X!Ned4( Z)~jJYO%z*xl'n/]!fnPP(%䏓 -1n0=,\ [AŽ]=#2Eh&WPLs$VX{]bRFWeTkĄ,>4rx=FR1|o' HQ)u)Ùjd|^}` r6u+gR죀4O;[:6ݩ*R$,Emy2BSxbd; |U&\!%]̾.o\,a;I};ؖEJUl"SɴEQK A©$G$GaK4҅=Y0{f1ó*dYW ƥ+&٢BV EC[E `weA swBK$+}  ~{#NhDQYeHBTjc`޺I Œ<a{ dV|ѥ{Vp||XO+IݻwƛȠrf4\L:m9!f걸HA88gGiJz*B.W l>B>ȍ2^l 'Qh-+}vܘ{eNHM\/.:uaIs!}}*UvۣW"ZӔQO#<C9 Ӕ 5ĬGF<$\jihtjzpե7TB`x6PÙnEyOI=T0O9k2e ͏}N 3/; صyRKiH[ g=P<b\8Ip} EvAqcY 5-l/ҽ]]J5۾Z\͋an%dGV4eQƇ =p8\O^%)۟FNrZZ8tdUo&ЄZieXVe?Sg N},M.M3^]6G(ZV,Ftݢ'M 2)r$K.~&3E^<۳P2@f» Pk+e\@?OÇZB1Q4cn'BT1. .Q#dI(b…C!G%sgn<kno>A wK/t^I@§üPh +#]If9"bbl5d{dY.0- ˲Qt:ZO$yl ]!rzs*qR2Z]`5iU\XwsR)"PX,[;نL\Y(b\Hܛ#`EžGb i2aU98U :,x k/o8j?XfPъ=#5iby4pnYzQa1=L',ЖifǓɽBw3ttܬ;Iq ="̦g0) x4WBcBs^1O f ײ? (du*ZBFu!%GU@"ݴ`va 4υ+ͤE3?Yq=4kf\`$c&$ۮ 50r tS gHݻS9r8 N,ePvSj_4X B,臶CNq+x.~5J`^)Ji;.tK Y "ROy% $ dq@Ntlv OJO_aZTϙ@ٹӲ-=IJ0f /gR 9(]SﭣIE> >0=ysq>[3!%dgm=ܔR(ł J>\uV3j(ԧ:} )!k'<>t;ɕ17 y:(7+G{abԃ|8D8CI,ՃM ()Aݐ/ӓ>SDP4uX-5c5WW=,NM&Cb"p ! {emb >yNyZ帋Y3vA .ǖs:,ݒ hȸqß2Wh%•Mu||@bWtJd$V,xbr&uy3鎆¢ݓi!ݝEUT}N&b'##(@H}ӚV5JY&]eб(xMqD"f2 ÄZ(ϫtPlmmrqA&M4=.SS _jXbg77zWnvR ȯ2pk4[d|ٗ{%9Sr{.?9,COݻww)s9<ʔw,擢POJKWmU["_xqnM?zM %&6KҚlOKW&[|n^P(Ys`W?ᾜ 7$..&&L9 U,>iOkr@"6?VMR ]x+*- EE|ch{1WS;Vldk:ċt9DK΢mEE cOu]M%*!8ɭ3F;xMy}ڇ֠hXu%HgW30yDҬT,eZpv\@{-O0놫OM6A1^*7ٷU 3[ug ٍ ny\h"F]8CGiYv) li1Yy| J㫐\bʞ(#F@&XE l*6c2,ffpOյFHR@fwv0Up62^ؠZ,_-Ѹ̸y.l*'QynZ*ed#f@]$oZ!Eaǹ|_a%)lfV)7ߟ.7'ՄjK}cԱCѫpMƙY#^H4O@]%@-du8n;!4V>%3Ѳɺ 0̭<a9"kvZO5B  ZPASQR,LYh̡ }*bҨݷ0Rd[T[4N[A My(8"Iܹsg<{8v1rHC% 7bjǠX\՗%si8vLKCrc~g]ƐW"tr "1$MENaΑ8.&zP:fU`<_'s._>5V:5 X^* S R,nЍ.h{vT,&76=lv\CIieG,Mc(tM9[n:dBwQt7ۿ4<]Ox2᝞?)Ǭ"0 e/ 7xj;1ԃ9ud輗urXJVA3${wV5g&w~'YcȂτt@gpH\c۳&doaaik?repbz7z2Q7{mC2 UM!BlPFo^4,q&˖aB0.)M{dc\0qx.O(I "3G0}TFZ O_;u^iBd4Gy=481%_oMqaVNؐ"Ha 6,dbvO{k>L $!cW1>(08$Y׀=T,u_A <wMɐgHvD2N\ȕd:}7vsz"|e MMAc0KY[Hu|+K @4?ON_ߞ< ݅ZÏ{6cU~jwE_7qxu;":4Ԉ& ]mSQ%zF~ALeެL3Z#<t\ *(+gѧBsv;\ !L[WR*SqBun%qpsҮy3yi"b{ZQZ^)1Tt@nf sm{xaۖP[ʻhiag0MphRlJ#! MXl eȺ'0+"x<+B&Zvhݿwe{fpGU25n,jx` q;fpꘒqh7Y,FS\o \ o=DA.ed01W.D ˓RAEnGzuAE-#X")O:fCy Z0QᾤJMIC}1R@q `+$-.v3zAnbKRG߫"(EZx1cܝc 7Q=_ѳ/KXUd'_l k04I,&QmXPHGbgܥM9l+"D\k]-SjQRv -z8-w<}=G]6L% 4~v{L,!͙?O.n0da#^/˜RT\p '|͊6cX^JН#mWL ;flwy6mjRFAw|1qHduzjb-mhw}YLw~~K2W:>v7=z% I2h/S\F6Eŝ |])٨~Q#]0/ Qߪjaֆ߽ŁGGGUfb:< o6N͛Tkͫ- VdTA >(S? ) hD[)=ԝ_!P^;e ?TG&0ذר OiZ4Pu>/? ]G@`Eu9%tUi͑z\F^ R'I mZG7 L~<[ʞ0 ],X@ Դ=|W|(jJ8CQ.X 9C 8h 0&{c y|=}g[淏tOr[6ФdJ!DzL4qu(89dyV+. 0zćwXD”WT*#k#]ĒHX’ar`ijAأZ"^ej^68-}$`8L"n"A XRORX(Xm81DG)ށcQ&؈#1&YVb{ium*[0\NMjeS⾒оupp|{V^}byk֢w_999};MD.EdPc#Ćﵽ%tN@x|.X +Z$UzN3mPI9^b;_/XI'\|!|-!43q*cQvvmu ߃Zذ|\yo%}\6iw Hըf%Eu)avƗR%ԙ%xLE:`7(eֈk66&>Foڈ}|Hr!zQ koK6Cѹ7o~ykׯ?7fج| ~tm%g魠$pjuW_*х<"k1Š)Yth2v]ղE9EZ@U}*'=t"^p\RH$5H晀L !  fN K"({9&dމ Ôe|k::B0v MLRd5V9#f."=_a<-b$ͣa ?b3iv!g$fh\eI碼>@9J=?6ݳJqZ_?.,dP |r 7'D",%1`EL^Kڦ rnYm5"M+LBiurm|ZCQR+I\.وK!N髿0sue[ cXx Ti!OF,ڊ];#210C;8p"ZmH) 1nApKQ im 1-v0;4&^v||;wLvrjݛןH>j"Q6w qmEv3<ȽRͬRq;8n莝8 FM}"G~p~ƅݣSs(A`Uqv鑻ʠf߇w")S#kx 'S/2;}`-\3"?7-P&i#l1YSuhj?#$ލplj6Pc unfFZc /+X *]sڌGn~Xez e<7/LybI;99fo.^CvB*]b.ݖ/a7K [U[ aNajThmIbz.3;ѡ{huW2'q bUFF3:EVܲ_s%dF٧}0!ჲ/*~),Tu)]Le6٩uE:i2E;fݿ\iRL!&i0)h۷Bȹ6:YsVqÇEʩxF%)!@:84qMm*w![ }YƇl ANg}+xn߃uņE? *, ƕb++k%0Û}蘠$?b(.V·챞}֭Ȝ -j=9-9(xi;X|<~A)V{BqӓO:7a)XJCB^QJbPѫY}([D+?Íݵ]q\>uF+98X OMlO kq;|Nr&˻R,tW'Ќ*Z& o C5 4 )${+<eTeQcVҞze@2q=Mx0|%1Wvª)Ibш̠]SC͸y~zΝuo /)3! Y_ߜ%)h{ttt޽}ڜԕ>Squ/=Đ,IȢ޲nZ[a @(tUA>%dtr(>܅ }[{ d:9l<)u&^MȌb @Xjg2eϥFk_)}h0^^e.>{3+^*ƈB;цr5l\ۀ0Lyl",ϒ0::ju;;AYBn|2(TÇѣG_q&TyssbQf\SP'|hg S`ϪP_W3 d-#]I;vC< ̧a)a/P!]]N+ěSIh(0"b~vk+k]_A YiO I2Kq", kUqR=1,%nY[e\l5@ޠ$%@w/Vd;sRSJHOYNa"x,Y#??D PVnh4 *¸$)̖sq||ʜ)k>rᕹA7޿rRA@BkSSY_Wy1U03]` ͔;UWii{fGn|FwJ!&>%f!LPTݞB?lmVRA?v-!@VA4~F=VԱI}bq, w셜7_@wSʣBh`57&W ZkY3WN;|N|ĸ3>ҕ,Χ;Lw;q?)^zS^IU?q͋#_1ė[F?mi ;*2`?L ayddj/( :ئW /nMN=@߫oI%/#9gt3Slv~"= &нMkRᖗqbP'}.?*PU9Rzuh-iٓa`z]&ʈ.E0w)Oσ‰򓲏. KC8i6c|{ ̜fMnaðV4R ĮqjPAƒ|{{7MwOWvϟJs9*kS|Ν¢hH[LM|T*QpCs$r{/Z:@E JdXt`+E2g%Z6 b5$бVH y ׺ַ᢭U( Y@5 >V˸=ptj 8"b ]:FCq|^NÎ9&4shC[֔ł yK7VnMmt>4ܳU G" YD$qtqiSÃ{ʹh ʄ@LOz oƛ>{~ga7x}L<`/cfdz&,ibQ ]>84- +ty(x~7DY_Qe1f.CP\ WFv휃K9B]uԸ*x3ϡ# BDo$zŸ+ڰ_1b~$^/G 8sC&| otnA $L˵+ A!:k0"74 dtOZt{6q?2cw w}Ӄ}gW_Q]L] nrcݕ|TQ<ևKmJl !['^-j][p'z2{ rWe%:() Rja0Đqyu3>xƍ{vvvU6ݽa)sx36~"nީV6oнs>|J n˷uм-j) ?\cptWGBQWs%Q,w 4#I1'4hVOZؠgqa _6g!nMna-`mr|Y% ̂wB&^MvAm-\a}7ā5"P>SHBD /CSy3/0a7./S'0nl`W`-uB4ޝ?lP&3}zm~ ^L7VsT+g,=ؼwGzA-r@=&\+L>$  7WB rE ۷d0+nYoT@2u$e 0tQ55*lsqC!GC_u1`j1XCD~# omA$ UA+q #(ٗeO 1md3\P(3|V_-a7h ȣ{_)OUJ;w-'zDBt&By_O}omi.(b`պaz7O-emuHNv "Ԝ q `|bXD!j>atq|$R!Dov&՜7LhVK#< YZV01vq85gT7 P/[,p5;FXqF)4$xbf cE)/I Kw-PH% 4`8<5l(k&juUvŮ2( wt3{> y$3>o4Ã<%=R "OA_\vdBJ{F)ǿ$ X!ٻ-˗*À0dE;UlZɁ*8"6o$.LjI0E@@Ykǫ$kS~&zЦ Uһ7y$LL8 ^J+hmZ3Saf1hub/peY;}ʰZ:fH@d1'NI7yPWt:YbB%RG­Oӳo߸qm^ 敷;x' J MȻY |^]U8~>޾7ow}|cgp/XJxtTB_͎&zPʪeȉ3B-~[jׅ!"ua `WvVI(ɍ\u]o;jxv: YtY<Ɍي,GH/Hwt65*VUY+21F[>nHzf]ɱHw .C XxĜ66j /k5w5%LJ)Tp]] TuZ~_ 7CE2x;x{x>:-*hѫS^|Ccg?VeؔӢ4}vlJ%cG4Y3xQm1p;E nmp-D"<ӊ_oQ!mv/$TpBcaJ+r_Ư 4_wAM,>CaG2 +$ VP3 =٩O:)Iΐ-/8?pDdG29愾 LOh?z !h HC+ Bn)M}vp_.RnC϶a$-KHϲ{pttӳ{=Ih"&πl\`kr)dieKU!=VK(DUӮ}0 .gĻ ' Ѱ$;ùhӬEAMa諨q&kc -i<$b!O)Jat_XBSU:ETz鲾jAAf`|mtIwkcz8 ]M,3w7<|oqIɄ +34Qr'=W]X"7oEk1}w8<ٯ4'eC0XB vB,D”qIYuH!nVz&;d@whvm<1(X HAz\򊾣@"l*BuIЅ%WkC%]󊮕3ftL8җ κ# FZ´09tS}]&]) b&ʬH 5sW"$E-I}GUSIݻ~G` eVn` p/9*x\@k:<Ңѣ?uI4IUQ,aے[­D9KKt[h]jw{߷1([ԦǤ)c\8=Mc2uWŢ]h'ԞFy_ 7.b^bq8hL^{8.0)Ұ)x6mG}sjcES+r JvJ!0=qӽ{oo׶g؝haz X2<t8q m֥蝏7o7%M=R:nYK;°`!AD5+ ,bU!CNA(N,6%wx=nݸodҕ :RR!G(a}B9p<6peND| %c{,7O%ˎ8I{8gNu9BG-™-04Xv2)f@-3H20ݻ{k}o0Lv%?ٗ))XvNAd@LaI@Ŕۢ{>;={p ]5T[Y[[\UG}Sl۾%{A* N7q-4z4hY7BWS#Dij~ a#]x\6_Dyy0Bx ~Uy'|U.AAsĨpVWP "Dl;fͅ_ԌlAĜ/47 Ym#/j=3W<ױ'oУh%dbV@Fcejw{bBẆb{zُ#bk2ň3Hfc!LznƢw\{ 'z87{pǟ*8r3h-k$AjQt7q\9- cu]u[BOjfWYtQ+ lw4LuVH>TFi6MlN97wA vzK 1i VLS KFu|\݉wC9ʕ/ROZ}-ii^=u֗߿IeX?3wgyl!M2欌}A${76E[ f$xLzψnU1pB׺^)ա햩ϡTYf.%xC?>0lsd@[t4w \9EDXyI7)(c%3U3FT 9ҸZ1I#[\~{AF29-ࡾMzQwVHq8ޚqI.R:mVrt<|ܛ6D3l$;@ hcEVɋe͊C-z[zo}}Ufz1hx¹VZ0- O:a]`G7HnF9GI%Phjm#P^Qae͇"o6' ;0`T!V4|9+cXCosءoFvG(H3:PJ߿M-3ARh+}GJWqzzrѣ/\.vq (7U@4.b ^JHﺗΧteS擢wrr7Ϳ}\A0HUqL[`hÒj e\ yBi鋲.%1 㮛t5zmUХ4L+v$LڄcYqqx2HhO]py"z}8L%Zm /߼r1 3R"߅*NAw $ScvlQbL"bl& ;x&b:juQ5f`PXQ 38Q Mf!Q!Tz32,0 L 5CNDz8dd#I%Q@.W׍JM'6@#R*{F`\{r &. ym8mRNӳoQŬEN ]T1)f!Q3hh;.;$?J|.ZOoz2^ϗ6l>_|^|~j_7/| ?|ڵx6Ř 5t]EixX"Rx_{} `RV^2}0@[m Nr` nݸk@̾C;1*6F|~j&osaCba^ͻ<֒J"ɮᅛ"LAۆc{4SАk;w Eيpjn0=dWo,xij&Y6ب?$^›ow08]|&e cc;P~-7q_<ټ'ޏoZ "CK䡀^\= EYxD䑪&9YLaH^q)UxhlF@>֝ڴg?ۓJX7xV<nRԃ؅̳)g4'hQhH>f@=09x9y6Vt;K̳mVǖ_>88?yʕ%W2\޲[!ʐpԆNREpmvp+FeXEQ.6G,: ( ߄ZȫnI)%ӎZLmR  ّ  (B9Xw lDrO|,?'OhA+n#c.#!MӜ}r$cR ^WǕ# 8duG&d{3^k۠gZv~6F zzzr֭?ѣ?.]}Y?'T؉4iV-Y $6tsO72AkʂS[W7̪ó⎴tH#rx^$|eq>&bR\wOQ3>g/ @Yki)i뵊L!ՔNoK&V5#o7bm@J{3egCMQah z #0knh F\gG*]yk?jMxE1"L [Oy"EբW kZ^}_~A 萍$=Cpa+["a'+dMp!wȴouRέ987R.QVx4M!~E %pR[CJ JCqԢ)@wB itM adݬB,Winݾ?~KG<@O]]=HxҝX8|1m ^F;P5)Y_,Nz|e[ԧ?鿰˗o+~JOݍtG"(( s f.,H&2D4L_*:>'( y[n0Eh!DTQpY^ :l(X$h6oؕI$өb4=wNT۰=4ûweT_=.{ ċb:K5{rs/"S]a a#;13=+٢yGM̒6D$P u%7$oCu}L{Os_k).GzqC"&4UBHq7`@aTLF0ieuk` *9* it_ʼnw$ +LS #:q8Y; 5Ӹ7 ?.먫k]' Y.fcwk؟~>~nݺ哓Rj{<!FQ $:PP'GPy cԺP2^; *t_/^ 0/ͯtLePd'rc%BA(pzP*Ʋf%/hZ> 6K@"0hGZ H $)`5jcc`n^$:bvae5oyP[+QΖj?k8ز&2-6L\om&ѣG|,*W SyZ0[lt.׾pgG<!Pm\u,@:ͨ[R׋*Ϋaګ s>^|/_KFr˅"}B:0Q #ShV q4Q75?IpV]4Pq[gth >h>3֋t#xQ2U/[{tC'ф)O0 FMZ 4~-so߾/leͮ;A*bL\y+ZWؕP\Lx׿x)[PߩaIs^O+]t3k׮'jVL,=U izNXD"55[B$R2>l}XxC&*,(9'PMfȓn ǟ֢j@we?h(*Pu/aGˀaoܧ,eUFKB-Aa;alytjmA7~n&:/tߔ'0Mb sůhX rjv(v-i!|>,w1JR{}0I@iW߫^m~«bgNҍ۞Lװk2[yi 4ص@6$Jߨu4XNѦ̠Kltr4sbԈÍG'XW{i 8g e@vjJl;^R)~n;++Gh8m~zhm ݯݹsg6ݍ"ҕQ}Y qu}#5bע0>j0!ynCK QŪ\lC{ԃz@Te2ťX6\rM+׮]+.]TW (C9@T$)t`a[>IF|]W4eRjVBHSm%: 'Z^@@հ&0{H4I_(aS=牋Lۑel7Ms\v-0 Ԯͩ4yKo],t}Xye)hCU%HbDJ|23OC>G*xNO(dDŽ`TԲV=tҟg?kKo誅 R bp& &^`iz`E(|89'8{}+5:3h2D8"SƖН6UV)RAO)!>=6ȿʾ1ڰ?H ]GU,AKޚ~bNکe!8ŲIzjn`!;_vnbRD C- o&ۡ4w |I)n2I9|/|N3y^ 3,fn?X~EPTOqګ0gV^ }9_kK/7]r 65a7|Lt{9ÅSVahX&lnLj r=::o})n):ѥ%#- afd>iS &E+s \W=xDDp"zi᫟Ue)zʕ+k׮ЕW~'WӖu$f5 H)㈤_sЮSQBA0 vL=[X S[Eb./ Py;ۢ MAAKDjz#Gg[X*9KDtVz.XwGmQcEIeA)yt.OoۻK;H>?]R4=o^Ԑ`HÐxm w1=:k C|8l'GxLK`}a OW_}_?+?tҥ7se19XE,@bPzJsbQMwPW,RCU~DEŲ`#ȁxKa0:f1dWr(IItgfN3bȡLӿ;qes~`C$D7eՔ_y;IQ]НOt=-9'A'#gY/ 1p{3 mdi'1᩹`7 5;)֜x4t!^bۂWCe/o/mO9l>ϯ?o}S˯_%QmWlk0x)>#)KwΚ] c9z J=L74 ,hX$a=p}ςЮ17:.$<ش`8|ҌZQO@ěA\bu>G~ǿqݯnQVN`Qu9z0^k+ŧW7PvD# O&꺊gRrm u$f`01^Xd41MD=o=-|!r_w6޵MB|,y ;!{e*}E/}g;!]UɘS]Pw){8&n޷*Q Nf4.CIG[,`qU֐N-t_5f4؀,Tc!17?(1[Ne=VM_JT<`jS ' \uuooW_++?r~3t5k\G$"bf  J_m =Cp&1:` a|2xCm,a `&F"fabzՖhLދֈj pM_(?܊ kM)(n|(z%''rtt>G}C3*.BAfvx-3_-f. _#X7,.0u1j=mWUX(KG[Rŗv]|]z׽tqLL{;wPs_}kK/o^ҿq2ޠt +y^Ă(]2ˌ;c0~+歉e Ż;%\@*ǑqkMM\׈%!řO(S\44MvOyI)0O^Y4mرd$[X ^f{o 5GɟI JT]yV;Z; T(xQW+bFhjsh>BCʵ==GrD\q`t]l o-Evv"_1"}umm>^~׮/]W^\r x -q%&N%\Y tC\1o ^cn%r1~ZEB5PtL1)Lf?o :.iNAakԫFP)+_PZkBòYgg>>>q||ϭޗL#T9 \ͶЁ,h"̶yxwV>6s`1i!NxMiܜsxC_Bv ašLiS_N~py;_Kߗ7]~3 +W__|{/]ͯ߿_˟CVbpR QBQ{yFDq18 3pv_D臝\S\ a9ZB*r$R*e YĉY&c9}6M>8:>qzzr{S>|d ;N; L\˝epdaXN]œ6/ԴCMHc[T Q 6]t|tsE[7b|R)'… w6O}0_\o>IpIL'߫K}/K/J}p7.]j6^|GŹ*Xδ[s7OO7_s)fߒL~4plǓϊ[Yډ/p=*QmZ[_-py mÿjR0x||.2rDm(vşDq?å"Ď>#P\P,-) )g GU"xK>OWӕ\o>ywc= EH]Z<,})-bR_Ϻ͊~.M|IQdR&E.xQ{'g&ɦDMsY+iNj>(IaR\ E{Q^|<x:R.a닏b[*̙AkkNjΊ.ܮE{,"/|͋E{]\gi lxnkm"|Q^Ygxx䋏Njċ/>>i"EUIENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/splash_anim/0000755000076500000000000000000012653527012021022 5ustar devwheel00000000000000DisplayCAL-3.1.0.0/DisplayCAL/theme/splash_anim/splash_anim_01.png0000644000076500000000000005454612647526517024360 0ustar devwheel00000000000000PNG  IHDRjY-IDATx de}ﭾɫ$&7&o7qɍxr 0KU þU n(L?9u{"CO|o۪$@x@x@x@x@x < < < < <@x@x@x@x < < < <? < < < <@x@x@x@x@x < < < Aߦ1}{g,;> U$0oեa^;d׌蚕9U`= |r(;xm"Ծo~`pO.{ʩM|ʜ^^ۤa^+c''qeOħxM{ˑ^)_+%]%[\zjR J >!ÐN"dz>Aϋ[ԴEzVBx陞FsKuԲ%{rg'9l= &@ e"k!_p|L*HD( ׌xũ̩=ު%=| gg';~]]%qJtNiQrHj$%Sh¾AC~aN*?J~@'TNN*s6S_Axk.fd6٨_0y~*9;ǯ`p?B_k9SAEN_@J}͈-ɽ=/kuz)k@xk8٤[ҭtNNsj#qy"8In_x_;;0$EyceJT`(Գ*?쩤>'NZi'OtRoϩis̳VKxn}fu^S_>Kt$:9IN,6BV0;8ÇE7`d#AcX0|pm&@Y~H|ZǴg'=>O֬ڒ5 <.Cv𜒝R]cɉ!TT#p#nD#H+v78&w$d F  scqSN}vRNg'=,Fӛ^'7=k@x`5gWlzEvJrҮGg':4'KN'mGb#ĻcXO4E"q?h4ux&"C`4h`L`E}'O*up Ou:=uEٕ7,x-mzJyh]lUvP3Ov Ʌ{j8Nr,9.CcHZh\W<E"qABf40,Hį0 wEMrd#䧔a'B EZ)ɏ˞4"hũ̩='}=*=!ҦSʃV\xHwȎ/x]OWʗ꼊N*8SlDF7iHD*$%'-'QH9ShZf)x$D/t.>;Y|㓇[H|\lFzң'[tVSx^vg'lVvN)_C:Ut$h(s\MplMpԒ$~ )&8 M*Z⑤E~rSG{|zSWHzJ ݥLr/eή'J=ؿ˩/UեH*F=8SrFIRUlt"=Lgҩp*it*5D!5ePKiI}buŒ/E{ٕ8i}QySdtMg˃VLxMwnLyώob:ο)I;٩.| 7pE$#1-(YҜHrbT,]J%RZbKLQ%3#Dz4ΎeRT&7Ig&"ctf4NϐӉAY~d,OͲ'_t_%LWgIu| щ&x<'Dg9=eGS8K!\F ,FA>_8<+Q0G紐?pD!3(KP`&3c&@QI- cL{Jo/seovKʚ5 I=T"eN'`\ԥ tNzvӛ|Xd) <+X {wQӝשLKkzHvTŒr SMu\4{t*:NsDz5,krB+ z'E҉LQ~0M9[j(/OeOH|ԸH|\4z|r^R@$=S'=`WM[]-ѱD2K5(i+NV+k+Q&J3Ru+^"~]zD?Vȯ7GάGeZڋy2ВInzSb2b˳}I1i| [xLwbh; 8Ɏn_ʲKFv^ꦹte=|;FFEpʥYg+sL,_.i,_*U`rRZ,PK~-,>ϧ/IM2g69Fңǽ=ĩ}=;͈>3/7}'IyN-55 <sJw|+R&OdTi̐?zP3{ufKDKCtⱽ{;Y$Yjy *T}Nǟ_TTe 4{J{bS$>}S_6;7ʜ2rS,G^2N4OoνMTڔwZIyN%<;t絔)/˫neL{.fr3D.:=˧|]HW8FB ]?t%  .S}^? P&ziH},(u=>̙C-$LB_aHJz_OTAhԷN/; SR^ n=ɘ6T\N[V_SK9s5JwTڷSeg^PfvK첹kIuzVtCc˓,Q͓S[''뙚L3q`&!1%ɯ^|*eJ{爉RiT,'ݽ:eSAZY0Yz 4Ģ6yjS` n\`iI/(@x&Vʙ[Ns+ed_PQ1ʮX>Y09Օ(T4E7<2~ Indt,9mbBmSSӷkAL fcZio0u! pr\&%ǩOpy>ܢ=ۣEz-ӛbeAȢ46Uhg7LY~l8a]9LtؤZߎυkLٔ]&7J;%Uv^_G+SVRȕFG'ד!9IpfIl[gL53={׬=*3w 4 n%&5N6eor|F= J/\侞 ,Oo4U"<"y6MڔX <&k73-{wRF$;uP%MRf,]2saLqWԞ.;e%Z^OPS7$M//6kC|-s|o?ڏ}nۯ}ao͎?k_/xg=uï?p/_~qOm^\.B!Y~3XzoZ_e)r铛5 yj3& 8< 5|H-k1(Ax+"< Vwn*wg74%r)SKw ]PK99reǽ:=M<9>s^ܼ&9JmG~cW'>oxҷ_|OؼťM?o>M|S[Rmfڛ0&:Gu G+ ܱ^7Ll*>X{a!365Wxxe9e͆xhFxXQ˙v*Nr >yP%OJܷC*T[:n@EݰTђ綪CK>| ~?%[Uת/=mן|K/.?DϚfKSwJi&.q]kAJt+  -E~^6y9,R|}%)yxE.kS'5_oVLxvuʙ*ޝUx*K>&2!br_FJ4!9uzf.Gx<,!v=\]o۪o;ğ~fiHz D?ri6)"RG~'vT;kTp9ti%-`}F^zBz/*u:A6 %&3;_ۻ'3_@p.e}~Q4Ư&ىٙQG_߹oRu'vKiS8wddCbead'yuBh-c3&6[Y3\lHxrnCgCv;rdһ;e*VʔvW{v=;!;'oQ C'=3'&Fnw8o<.mJ BooR^\% <U:ϟLaJd&.N~z01s,;Nv'pS۪;m/z G=IʛsSBzxA}z12f-m56zyhf2+!ʚtjf@z:e5h&4ߩf9'a5fҝePŶ)Ә3 ;Qw^%mYԤG,0mx`r}jSJy%'Olɱ41'hp%~{W <ၶ m%6^5[aqUEڻ'3Ѕ4 TT4vѧ1< 7wlV݅iIWrҧ7iA}Jy#7M- C OlǥT| pJ^+kҴ&/S/'4S'5!<ׁNutfb[9V*Of ]j32G&Rس[zO77ןc]",?7o-mNL(61ceHIyKxJyE3ͫ]_85}f'<@x5MO Mus:^"D}XS x N!:,&6i/N c\֤>7lӚvKج&Xs/?8whS^G%ҙ!tQKj9Ӓޝ1i!,=p̖ nm?{aO,齼{fMN',+RYJӚ\ܲJrϼ"v^8$$v9/^L95=~怼nWW1L 1ypE^@wc|eXṭ$Єfg(iz!qBa`nNgS\?~ͷܝwn\tw "qO\ yRn5A>1oAx+&)4)?$¹1R`\Werr3F~˯ {=׼4}sSwNO1MWW}sx+|A62:{/T/;'&5͋+jTGŠMSABxxӵf>wCx;WYx]\sKf SBx^}/ߚ~I'}ߓRsOIK 6x,9sw[=Kx]'Hgͧ¯מ j,S{~^ܒ);>Ğ$To nh=<FxMLi:%&-k - oV]ۓt x̵«%8 /SXK)=pkN£s=28GgOscNC6~"Ⱥx.-Cxi1˥6K+Ҋ@=tM{e궗Z2NMP“O ۟3izẒ=-ǣ|Iǣx4 O=m}vKS>=69}ˤץ/{=AxWo#|<Xxz^5G“GlGǻhy

~ϵ]22&<(zxdʡʥ 4`>T=DXxNxd<;?{mSs.ޱ^Ï {zgxqq{f&}rrQ`%=_*Q*OQl,ߠ>K‹Xm}:F/S ~~?g?xGK$<^<)G}9W/; 3Źf{22z@.K$<^*&$x, bxI‹x霅 n;?£ M5|!<ၝVxnL~2WLm+ Yx }Gx$G`Nj[hRx4R ^_ĦwmtSŴ|rZgѿ+e J /~{eٝ&X@&hx/岦)Mk{iMux>Ifg諒w><}z=HLs'3ޝ;:BuLk9^'oߵ<@xu/%@xzOᩃ+|b,>nTi7-/++}偳RI^} .o~SJ{W𰐝itJw򰊼lNg3=:ҬlW < 鞦jjs/'ؕ5ř1exx4ե7f-m1=3ufv.O>7whۿw˪L9zxht[L̴>t"Ct'?d PkfV.CxIMJyaWiM }x%a^Oyj/^?0(΍qisldL6'&o66kVKoqᣏ{}m5F7^{i/,fR~FLݙJuXlngyܦwjNh`)}$V%tuxE>5)O^DT23QڴLmң;#G=[M}OOK{zڛ_{{;oz' %m;^>[<ʣ6{u =;iR4dg3vTTʴIwg׻rVr+gzAx+簋lmZW4}WR^,|njGf]M1W:W>C<DXj1G==z;oBƢ;g)=77Gizˮ{'WZvTW}?qcr@_$WD'''n%ٍM}e7҄ Y7"Y3}a(Գ%wLK9S9Exv3hBx O)}"wy[Y݆Wzy<K&+ 4¥Mڤ ,e}UA(oңͱ=IZNIo.H|z󁅅H~/~O_DG:AKuSw%L^=vmnu] o'2X.3'.˧zw̧"/G{2$&'5>F_*«+kz^}EO}[0$h Mm~Nܟϭ.Tɩu#?UCÃWʮT8YR f.5TʤtǥL9Q)SNwn*.@xk*f˚Bz,+ "<1ÇpSXhjS6y7OXz|0^X^nJECОYub߸䜼E:mG%YMVg$AbJ35Y%75y86EO#эsΒiӘV牞1IvDfmHEvLKJ4ɽ;t*NәmXV[x )VR6x\ڔw~0%X(Id+5sie98tG4]CeNKi75yԔ`zZ:M1E&C/SwtӜޣK7YD7|8ƩnR} |nyxܳ%;2T].덧5q)SZ2*WU8dSs*gR @xk.<Դ)5ZBWԔ'Ol^^46~^26X26ңd*d^8o_/qU19!*s25YiS/wk姡[kԘdhMHM|m,7=ō%K)˚DSD0S(aK=;1Y$ N{%7jD'N*qu}_K}Mc{;wtGd$Ălwl[n9X5*kR}jYS~ .Ҧϋƃ檂qs!=[4W1ħ9/4JD!?MDVOPĨ.zDr?.8Jr,ac@/]D?$DgMuRW8eW(fw2iPёht'"8 ,Gxگ׷Cx- hVxʚKjSetIMTJzziY(b҉bb_rD7*W*$>Q'RH[CjDJ$8~GLS(aTxϮQΩ)5 X.A-"+BN"j ڢI^4S/V %Q^t`ꨄLϱ]N.eAuﮙt#X^qҦ'֦' L'Xzfr<=h˜GIzO_I,1o9D (k"8KҢT$g.eե:wut.QVdGhhˮQN-e6U <ၝFx^ʚͤ<&g!ܔMsWT2YI&rӚ2BG=>C~EC~J}Y,2!U> ˍ> -DwLX8:]2{ut]dӘeԷ+e^EXΰ M@xUٽ൬LSOY6~qz̋̕X2H$ y,c d&g'\;ZMwZhJ4J$CXPV K}ƏK'IN{)i._N.˗ڿ%e(Jd<$;*c6khXt,Kx-5RF7?b}:e<&Fkk$=iO.d4J%N9^[LRǥN񙩯?RO}|A]JF$ YO"zKœ 'rSGӖXra{q0kx\)Vzv<)d}9KRQvNv3tgWΤ_WN#Iy<,7iO/bQJzQ'N)iOX_0ZHi>}qݐX`,{@ː~FKnԙ(TJ2O %@k2V|S&R$ILs0ޣs]K0iܮg'ˎjW)p |SN{\gl''?kX$tB "3 㯗L1 N.WRʥKѹ:ש;>g7 vĭowH㯝d׎t5My,? 7(<K#u3Pⴈ/ S Ţ`8 wf ^0FCXp(E!_Tg9TʪhIyľA{'48fJv2' cMiO#GHce(H&FZ&#-% NJrxo'9ySk <]Bx^KS?Mz:!=q,ΞYWBŧDF~'`)"dHX$D ?"6NpvS$G/%HϿ6u;?$fTMw g'=~^#KO5hŧ:AH4iI-"Ԉ$"uB8Il<ΜEpN9ɩF~nUfd'2F*Jwj ͺA_شף,rڣJ{foF|Rg(J8܏S,?' .z&pлJASSM{roM|';g@g]S AR2d 1|0a'Em5Xjd蟁˕,95YNiDJʎX:ݪ <ၝRx*mz W'=_ҞZTǥNnQ˝,?N~fO AC/$ N@Mµqِ:Hg}:Q ӭ_Uv+ <rGIϮSӞG{<">TxHvdhe(R&*=RgcTɂLQr5ҜSΓu%;3bjϋynu9KMU||.ߧ?N"}"2N26,7H˕6]I":e%vˮtHOxXWof]oI=>ZX~r.$@.D/pMJ]4(D1oۙd'h <ၵ:EzJrڣޞZl$>9ǫ jS%(D"4&:Bcb3ƽ8Yp<|J5u?n'9;5[ʮXI-Wz].sډO:=ҩ27-BEҲCL'FIN:X_yIu^J&;@x`{zN%NޞNM_>Uʏ˞NTRE p"L '7')XDl[UAx!V'٨)KjON}' _ih$A$E'Xfr9V\]Ntͤ R&@UȰY䲤ܜ ^*9rE것Bx^˛vk&{|v.Dh*D/2NUp+NkFt; <ၵ^'4+?Uj"@.OHr) U.iJ^$+S\ iSS_DL[QAx;fi$>e\M&mCk$KلtE|Nٖ@J2$ԜD\5+U < ف=/kEvN8%&fK^nɭ <ၝYx9 xr$hIpp58Q~tA5 < 2g3ɯQ НFb\t":[$h դVBs+E6)8k_ڕ#A3j*Մ%v4.[ICvrlU,0XNm <; o%ʞk!2۩˕(N{]Sn*<4fb ֥eR vQjh%,-.@x@x < < < < <@x@x@x@x < < < <? < < < <@x@x@x@x@So$%IENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/splash_anim/splash_anim_02.png0000644000076500000000000010013612647526517024344 0ustar devwheel00000000000000PNG  IHDRj%IDATx{iv>Z3ϥT]}/j[$2E% # =a{ BR 3f< G0`B`,jt׺tթs2sZo}2SuxEdtZY044444Vƻ04444474444447444444744444474444447444444744444474444447444447444444744444474444447444444744444474444447444444744444474444474444447444444744444474444447444444744444474444447444444744444744444474444447444444744444474444447444444744444474444447444447444444744444474444447444444744444474444447444444744444474444474444447444444744444474444447444444744444474444447444444744444744444474444447444444744444474444447444444744444474444447444447444444744444474444447444444744444474444447444444744444474444474444447444444744444474444447444444744444474444447444447744444744444474444447444444744444474444447444444744444474444474444447444444744444474444447444444744444474444447444444744444744444474444447444444744444474444447444444744444474444447444447444444744444474444447444444744444474444447444444744444474444474444447444444744444474444447% `y'L9x[?{lޔkqoho]?@8u647L}x߬o <647e

23B(:k@%A\~L?q`MSVgT FCF,N;uYg;vO1h䭁[?gcZPY-Zo{Cm+Bhzg˒a&j.P.cѳce` ªyd$3 cY(K = ʓyhe ٌg<,Ml!R75/m`ǩZ_kʊ%TzjT/ !H*m`̈0Zfw&zB"r>-k9E"WV@#XY ڠ1ڧs|K7wj5dJG5b>F-.Gx !m+AC.j$M[ j$-{䑖˙j0pgw+%9zZBP HB>CфZ}` |M/fkXקSљ7d0ܔumѐُH`nuAVc26Ody&✵(9Žd||Wf-йpE9"ZJL`7}{_f(TRl*Y JQ o^"IDdJs# Og/>ypqmVCfTM\c&( 2En)Iۄ29f*/Fd}*3nhgnazwmI?b*L@EBC %M@0#h o 8؜cwg6 \>뵴eE{-2o2 w0IF\*3 z7amfV4n?f<7]m;# \)*"Ӧq|vfbLbKE?1W, M?J<}MS$Qܩ"͠A-ԇMO5%$ceߓP 23ǒD*S@nYhhf`4-x{wVsv~yvmѳb#@L ZY#jBvQPk'RS rИ Ȁf\`llcuClmSG*#[KXu!xIUK2[o {@7۞ζ33e̎ͿKӌnvlhǻ[z["\)q%ej *1!nhs<$H\I2VO&s`0_K.?;LdTX~o .j5Q{ZT5F0K@_-f!/\wIteC/'>7St@*5-5@16#r(-R? 8$eGs,HXZ5ϻ*ͽ[lLK ˷3l \v`4XD.qEo.OakZԣ]ia&­mCtT6C:̪݋'{3fGPj!Ws޺Qkށ6R` gֵy9}37\W$0cY5Ė##3ֻ"@l|DK%LiM_\j"Lf ZjݒYnH,*ofs"4p"N̓[[Y_'{|y؀e0+)^aLU)8@("v7o.o/nޘgT3NA': 6h67Q7)UU˔&]L yi!ݴxUB TtW-U 9UݘIܜzfFVϳ@9RٚAY^P J R-l̂@-p3@ ڄ x#^o&brֵL-6+=Ъ,TB8J}xuWhrQt*.(J) *8ԩ* DSp^Q+gWρw_ `{ L`?O|P浮tͮAˡS?6hg`>_їkTFafqr&T"U 8#i$#җA9qGAҜSĊTU6_׮/n{3Sa"0 *D( uթY(bsЫLRMjVԉ\ :JBZvSŬHE)>MIY8] `Ӝ$ N/at@4ťJV/ UE$U3mW="WLJl<gxqZ:r{fDbp}l6'OIճbbA®,BT+4D(PRfQFU fb7/74_/ pk~~ >Yb7Vn X+׀_:wZ|p|^=zò4fLMcPf A v P`6+^.&:(83}~rH]| Ps5#Y&ǧ>ƼYJO{8\;`:ǎO>c#5Gь.BRjx1OO/v\t1s |ti^Uk0y)\cD-:&a3*& y<79Fmͦ~ɴn[TaB *F!:3L1'+# (j `nRh^=ftBWWѥ8;H*X#.ԓTꤚ2<@Uг^]1Vd~=?Y%]e6 %f4x% t|ވkx}1VsE뭓rvqgPnZTh8˱HDO8E!&jP]DH)V`E+թEU~8j _;xvNׁdyڼ6V/qP?v`wh\6ri;u)\ 3k FM}$+%,H[We+n-gpYy9 聀pJ3N'"ӂ*ѝf47* DINFqyNG' u"؞DMa&7El$X,˃A,"N8`y"G/.h` sjK0. mдP7x]@w vT|C-\]-V7&dDX%AE\! ^C91]〲 '~o|K@ql;δobZKXݞw} xq/=M|Yc~iG3|ӡPDyw~k860ADsο`[R;OT(bA$NQ S"9Ԡ^#FBF7N:B7jB¡I749:}nZ ½+22 %05a(J K/i(TFi r`cFuV]NBIk 6EJ3R|48c ig]YM87QJj (q-&p,PO|1Z"%l9}Oi1*.@fÏGp饰|JdJVPZ6GTJ( "7ntJޠ jiJk^½{A=̄B:QdUH8 Du7X ыw*%Z0Pˉ![u SJB $ތ:Z$\_LSsRE~CMe6s7>Sޕ@ER pE)uLU%t*.Rb8,ՠ-)*bfZģ|[_` ɖ<@so]쮯 ^GoW mm Gf;u1ş)L6 @9ǣ>>[cgv67 䣧Uk.R~;U92NE7agDJ90pq؞a1cHA7!n+G2Q`YLu%!9S1PW)Y $Є{Ph(IQP(AFZ)1=Q+Dp f#SeyÜx#%)6?/Xe67W:e T`2l BEL簰fB8HRD o~wq N#p[[|;A@Bg W~rذs8'>ŌQ1`{uG=ه\m`MOKЫEFڡ0ˤכ^>-[OZ{0ӅeF18Uܨn:- 5'ʄPA;4XTuEY!BwHzE!\0s k*E'$CE0q,{Ep!hcL$NZi 4؋4Ac#xu<ܚz&Y_l}yeKi`ڗ0:&Z % ,X!,u( ^B+Ϣ+_ۿKtuX N{)M0C'~dJGw jw7vm_Hwn\}M;A.}R_,+s(VfWTOzFyt'S6ipĨ? M.t{BW;0XG kUsInf4`.AYex6HUhU`{p*3E*,\t(2ҙ%I gQTulPЭB5t=0L%#EitFܔgöQ-b43&* *Z!""29Ťę1\ Շk$AG+zK߃+P09;h,10֕CkqG`=z]zUlN3E6g܀oy 6~ L@U)7vmviVc)« I*ˌʬ>S,f9{Y1#CC=t;apN n[.tq8 ["3gD[#nX4Zb"=H"[B5èHqh1BU/ mD;H44-2jr-O5`绰a>5Sm 2q=:C:]CBٵ/p.Kn7=hɾ]_ _&,z! Hoz(64>6lOe|xl,#@mY|fs*7 D4Cdc$L#Y3 IZC3|9pjLY};D̸#,TwڳɖN0%Xrau* .'$nAĀZ']I~nV! ZiVa M \fF^"m{q/Fn5 D9ܵ~sYquz@:S8aUvES,|aAfzr+ABg3W7yY*ۥLl 5;vߩY{;!Pڣbt#e=``m-0,R5m} *y=u;EfBz: ew`iiS[t"Y~zwmLk/i}wOUeK\Ng7XXC+ѽ'%{1ő4I2\P hx酯e-KQY*yUE*b^^t@xHiC J 6-,A(em=W{ [~mF<{;V\ޜةT1[jRqaHZ٥DJ3( 蛗o=w7Hg y\`5ͣ5`}-xx77 J_Y0aUh"} khwXS (몬`Ws ul ^33'glZ+y>` PnB# `)G7H1: fm 0A뱋tܜpwM ٠9TMwԨiVc"lª2t;=I=* CYi!bt݈Ũs Evp/F߳3$|(4g-- 7b;mlK*9'$qw*DZ|Te)IJ($f+Yueq}?.g-+kB7zwn- zWg qaztu @SHN'h$)%SuՋCvE=`kz o֭!>bWknt f=,-"?x8TaJ0-\2LyR,ۉ7ӅY$[SczB7|p E$jsQsiBb`LrwH̝ Y'JXk!* ¼RD),4W*˧aMъs :通FO1l+-|`L rKd=ˊ/fi|rT +Rc]}6?]k SL[vXxfPNAmw M7'pz筩J *PtQ(iEU Dq}oQ8\kק-q]۱o \Z*ԥ5@ |st{6ۍUMCPeYxO[Tou;QJkeP-K,ʳ  Ob0mt3uG67 t( 2)&kehoQ(P""n"#JGQBHbDY23,lp6V/T0͚y}|/[4<\o{Po3Vw;X=g_;1k=.=?ZvxxaWfHf-y"u<YDCШOZ3ػg_%U;U&RsN T$b;Cp>ST"3l6x_hN #+-ɕ(e?OЫ\ͤM͙+|K~r 03'qt1"Ĺ7q!P\:NЬ.QD6tUi4D=ŗ vE67WfgԌR,j"d=|sks}hլ+rwo6U={kڮ;V|7`ɝ&ӣ@mlPLI`6ljT`"/P ]cy#oSq!n?[#+ xe| &;6{C5ƣ: zaUp6&;RxsBU6sBL ]JPR ބeS131 zcc 9˙#{W3jyLcfENQ*δ!j2d>A7A TTPi32٪6HY[.'dyẠS3/K>%Rڥ'$ڲ_!1DNcWte>c+x#^u~ّ6\l\-W,ԑZ],z;1 `@?:jIn6?~zpky)SM`Oogx:fy=&@w?ρljL^r ]]NԖ5ZvGXQL`sV**{(ndԘǚS3e!O i $Ј<y$0Ms:&ok463$4܌c( A MF%S~ :1ELuᗹ<@uQFuBy̼TN-՗'ZzuOz~?vxl3ۂvxǯZD%M (Ҿ=bnsP3rr< 쨓^X01 ;l><_{5c9~ֲ@pX.K` P%̏@c uܼKM8UiqQc2qKJ:AW*wJ LCnD;21!9(NL@r exziPe@PZh2dR:R"&PE(% %' ].,Dyj6]k>1(HH-[h'qG9`G}~ T Dڳnx#ѓܮ.lJͻ̥{!ZY Z CWh0}o`enwNkO# j~q_ }?9?6s<o=$%k {(c8;v%Y^ֺ LkZL-z))ĤFni)\!tq99u"9ЦdjX¹17aLL6S@Ca!\P!3!yÅes<ҡBSt،y"EJ4 dEd;Cn!3 o[Oz6Kz%}*fOŴ Xn5 Ze񱎗Ӗu*8#eu[7/0!nIM:Y<қPh*IvuH>QiNϛH~LN͖,Vty <ν^y&oEl ŗA Xdic@?D.wy X,SLfH"sɪQzدdՋ[^@H̎;K[A w%mR|l- b %)RĖm-1I11@cmU@8ݙIs ` <4#[D,qdN|͒2#iH} ;rzm}zuW9|lވ$ygڼؔyqԂeŠ*Mee}gew pb:|eVkasxw\!LU"9_SրfKC@%<6Q%gASҌ`˺]k9ٴ*1pp#+&'VD,<ؖ%ـ=~.ɥEsx#>ݳb 瀣֊`Sdَ@,o>7zPw1OÁ;`LoNh.:0vlv <ɝckSܻ rGz[NOGnk ?ox: 'aQsLi9 $3ƜM)InQ guaQ_R!l.*1(D"d46u'p^2`WJ.J DM0@ l`V#,AHk@׵G4\?@"1 ћ#L[~^-|LVfk38xN?|SqF|NA7D]-`yeVL9@U*0!K+n9gtj]z٧g xFK^뫅:3lMi6KyzY*7-,Ac}g+MU<\ʧ7Lܦsab G.?/'P`(&֗Wv%xTF59Mj )0׾.W͗-Ǐ?=;C<sTވKӚ֬%~Q5-z8a HW<@]`%lOuz6wW. om Sp8EO[6O=JONiځtރacw_+S'>-*lyjFlvlm=m糹pI9ׄI֘r%q3cB<,XFT3eM-k68va={ζ6&h9p9ssK>6Ll@6by}Ҩo1nӉO)ԣ%&5h_9n}BS ۀS%fy"Y;tlhhA65[8c3'Gg=͉h~nuR=kS=F֐`ק45._~8^]-,7` Kktum?^oy.n|n3SM8o.-Qe# )ZI*}ulR=dDi1{ YcSԵ/H{gf>D4S ]CS)^xLtl*6c2Buq<CS:َ+~XyG )~[?lUz]&ңVFsx.i œj53e 3쎔R 8'ÛpGze7sm{x1Al+ih_^+ gϹؑ xjt@wuusT^_,tܟ/n&M~b?q/rV׊=җy 掜W,\lZS5Ud#uQTZڒeN HiN[qތΎYSC=a+ĺmM ՃZO~O+OLӚ֒͠@'~ qJlj~ :rŎjFJltiV:, o@s="=Ӌ\Kq>i+ uiHҙQֺ:ິ@T@&ĘӰ$ݼD֕٥UyBҢ.F^8˛] nnwE3EN^% eIΰkI!rkcdT[M/)[,[R\fg"zdy,ul&Ki²فھ8W]}<)#~jr\~[hçwSSҚ[͕̕TTZ2 ꀘ>uw?W2kVn2=]jxt`Y+%B9tcлڭPjt]KBMcq,ݷNRV9|:-flxS mƼT3]Xœd(&3 |%2. mS\LbWp+쵛(%Y 炎}vL%h6;5}ɕɥGZތkP eae؃$8v\Nkrݔf ţu}/tnec8okNf)vWZ]WSt"S5,@+KZ^?[}xC TKtBQo1^)c7鷹14yzuk4Gx.}x֥kGHM:ߒҬ1=[׾О\JghP;VA:i%Yxe|9A%J{y'lSq)$H\6)rq3l97Bujl\e!+3si櫷9t5k+=s15ͺ!;fw;zxSOA6ވLxsvRjml,/Љ`z- @wb0;"93*$M&zdI&ʱ4^d階 ɎXmi9i@N+؅9b˭w)Ykuu{ZcP9Sl.@:ާg)'9J7~ވYnS v?>_Jw7NA`P|Rpy%rXqy]&J]SEz1Y) :-+M߱8@;/X^ Jq: 6íO<:(xUߥ8תKÉTK ]'n Wn1~P`q=G_ 4MġEMx!yn>Ϫ8>=` z4l\a pfGu,cm±rSGJ˴)ȥ:7׵VY'~F`L-u:,Di=C@qdW5aHPY 99\ai6'  Qn8u2 `9o+۽J耮e ~["~l"_@RMt*O6f=:zAk4\Aaevv!9 kKvhG`|~7si*o-k %Y[N;d~S7 p5= lZMk@@Kw H\ƒɧt&n/U;5c;w`B59Yr4~O(F\~|rTqy-ܖ2˟ۆУj^81-ү֧;%\feNL@k#t`yK텱i6'p1xrPؙSi&վaܺB1%. ǣ`]G-}$L,őXa bo, L = S0 }+HZf-u<3GPMd]05Ukʴz۹f g׊"O'P ];MW,JhK/7*7ⵃߝɋ61@:-ǍM13RjRNJOE>cďEs\N s r,y1 4)KCB2=7nupi\' cv=@b]r}c]Uq~DbTp~CLOo0nmnD u\ic\Ou$6. &K.(GhhLl3aͮ- HoM7gx#^/; vO'o-g^Q|Sٮ*MZ]y:gDz^s޼<d/zcM~T;_&}ٍ92NϏZ qwjA-~_M3h$i4JR(.%BBU4-& 5_?~E|X$񡕼rJ&:4&:^{=$?`ˏ>1o] '''`{ L T6X'*@a2BT[::<Wۘ:X;1 F\W TvnQFY-ȩքLk^;[omDɓuiOR|6 n܋A ݛP+nT'm( Ydm*9%vx3Up搀Yҏ.gp|{ҁ)G{#PiiO:"na ٥0zĖ}sב)A']N,ƜX %S 9}Taki@VB.Vj>+{ż0Y~ѢЧ+0A[Tn! yhB\?"{ \>Ξ_ۧF'k{BXwΈ%Rϔ"me 2a=꒝衾;qQ mEѹnbވ^{Pڮ>p66_I;̂m3ak_ ms7ct~XEMVUŽ-Ǩk͎ }YL#QΪMggS,fً9aZ p!Ȉ1<:R{kΖ n`&>yf' rۏwEX_~I m۝prv]g;fdTD @6Yܬ%D0Yn-zTk,i?O*n)/^p?5u'.M4mln#H ᦰREBWĘ1ąB/ᓿ)A$pvwUwX;| Z\02f#8 <;8ÝRo]ce%ٹ9׵$4جB?z\ӝq_\, 'XRfz,.]VLLv8,L`U\M* *4oUǠwmFxw%/W#.O)g= dAt0/vՕ쀎Gѓ͡'n0P'9)\i;~* ZI \I(SX1q.ŏ/ӧx֕sks6Mݺi6YΎ=(nƒMi '(l[] N&x_i͞>/P`Km =Nbiq%RVtbPl*\)!Ig?lg<],7g na؂ՀExkj'Vg #S6u2Ytg]u<=[)Vq9{Od@ NIɏMB 1mMP'a9H1Crá&AiєoGr*?UaYFˇٞq#p2ył0=ҚxψjBl{`>T_*Ul8V&`) k;`W:A`xSGbs<7u%5s:OQv[2" \MԊPfQhL=~>)]k6`]dM{ Ďxr8G_,x?Vw#S~܄{]=u:pAkJ~귈{gb!%XGɎt L|$Gzۖ!.J<4bJsQ] ux=>kew^x Mc''A XgݝA <^&G*MDM3pq 9chAO]=E@v_][Xmnے}svވ:_7 vQlr9MN)9ʴ/ZU*Mՠ.bPZ ͻ󰏎փ Tt斔fvy'x U׿+?wh!EHWu0r6pt!*UMS(.ּ = .7C* %vcby(z[wqeQkDzrI}>"g1>gq _.9n7.\@n{`3@VSfwШyRU4oK1y+&p8G–?| .hG =#n7.t~ަ1D-Vf1El>m]M.w:Yi J"@6I`VttMl :\]4tq~|Nal}ߩ}NN`)/\O큋d,@Ag+s?dF`xq#SҼO/냆u+mGvLO˛'{UA!E\rTЕ %Q1#Dr;( O8?kb8kw! AJk@Ggυ}xGO;{嫿4L,gnD'haI}<+ R<hVŀR:]̱ ytB pX%n!EuIfuӞ̗3s&`G1/]?eIkFZ]؁eO[i¾%yl/JO9s!N?g+_<ؠGJblg`[F81/;73ƻ@(uy*`&osQ9@\ŵb1DQE|P8yog?3Yt BFHj84ut@?G?z H~>Wo^[o[aӛ}ڲg )H}M>0#F'ɍ\HmNœVH@F?}pix Pąy"ل|N㛺SME@A;\ qiI(KKB,$5G׋g#<yL)I<+5^fg Etye?oOO2-9ƕ~~B(qpW"J p s \XI{|zziG+U8Jt1M|7u\pChoH6~j?y_~2qJͣt17;ޯOF;gߒG(FSg Lr9\N4&X #Vv5a L,4Ws-S P5})t&>U{Th/蕟=qIyw4D^R'k{.ԁyƀͫ4 ϐo;g<^^/fB9Umn* }u^22Q` i.mP&*TM |DibePe"TEI뗮~q?_+p9 @󿂒K+ qܟ?x7&IPpmK{7k?]mZܼ;k=ni2=0^kzt^>eωq!RjPtq@ {uSR ,s&jvh6wS[LŐO xMi:i R^Х@T숂~Қ.$rfY]h7\BM`#Gqϴ"y`/X?] ?3]wyrx@P m t%J,^i2*(SȻ@,/~__{ciQogռl7-`/t@ضP8{Ws>TP'K]P +Tyu_~KujC]iٜnG \Mze.va2ٽ/5Zɽ&i$zjv"JNS^(BqIb*CŻr(ė>~D(E4-)N$.Y$S,MKCc~Uxtiȗ`Za/^wpވ/=O_nU*`X6i!PR(Ye"kBY7*(^"ԢŋpT`)Ťm1{_b)k k'=w+B\OfGi)QC 4%]+(v__7͟?;t2;_cƛ>;o@8LS Xխ(ipAaqB)F8a$)dE4lZLQy^IW #Nh"CQM[COzOL0oUr. 6 3XbYk|k[Bޣv_{ >>aF gY؍Gax!ES'ئZ/N@(5G68QUT1"PDO|EHv L,8}{Gw[-;w|(ص&X7'Ç?}Jk2[&( ^6QUΙ1 B?w-Y uዪ*$ђ. %xu5ץFiKͺ)̢& KUي IO9P ŨCw G~%F" %%l4QDIM&.he6bcV,sl (AqJͮF٬¼`'N`leOZL&Dq:jB)D*+6^HW f`@bBWm- LqF וv"$)&UykI(.ʕ,'D ;mua:a):[C.Ņ:LE O/47ニnVV|I7".`uDh5RNL&b^ꤘ"R6FIu; /""j-0U,W4n-^Tud0hR h Yr%{% ř~yRVV" L·j8EɵC/+bFxB0@5A(&0aQѢ Da&CZQ6gL>-ɥ|5d,lm[b.@؛*bDJӜɣ=&QTǛoA_]/nǿ4waEb0Jo."u"&!Z&PFR2HQSVtPV)B QQzQ (&t1Up@CB{V'Ҝ㝤L$98AܤeJ{C R$3)f.ii TV\Lsk͕mv"IȢRtla2^(0c6~`) &bqTZ{|1{FѫM٭l {JsCtFbvC,mrvn.sgK2-;ۄbz0#%בyy`=ovwLq^] z~+ք 5P+䔠*69BW^BmB% P=*\58 @m }h51@\l0''͗)U )9AUAesou$biɁiAwADnD$Լ`LPg8>JߎlS:ǎLt!IW*Z3}NJ2KfG8|kB_ϻXЭoҍG݀,.S648A}=ư3Yۋ^%+" /lIkϯ#;lDJdh"@BҀ@V* !,, Q!5(Y u)Sd[qMZ ɞШBE2jpЕPYUOrvCTӝ3]ɰA)W#V/boD[@LjNMxSspr6DUHGdUC+! Œ F:YDBt"!҄'ЪVCI:[aRMxucn"]F#SOQ|;8pLeSĒscթcz?YVuW7Maވψ}ӌ~~qmGRfc.Z l2׬)nL4-NU(/&f10=4a,4XRK H$&PTz$%(}tXlsu$Bm, ZNcpK"eVtv1k4S" y8X;kq Z!Tm"PM%*!51,|cC~?vGiMpjZf:U]R܀K%m.LesRSπi}Qϻ }DZI9xqsp" y PT\lfD}JFRD4u؜S"tTYCXeAE X5Q(`khhd`C @.,P$R%X5Zw3djZ׬JA6`k3o(bdH Pi^,jP &=T SB݅!h5CV' \" RK0$pp~T_o,ΖWaogsyQ$c@p\|><)_7oyyWj0 ┊0nW=5(Ʀ PbI)lΗa?RE ('#M #4JqT䜀FM^@w Aij4eEAlzPSXhMEѯYl J2[sj8P)}pb8QTjISxqb QX/>:i!?n"D6H{ =reI@3nԿx-HwԀp#s_t[ pB/t (pix#czV>-,/AO} 0;xѱyp}߿vl+x 0w}UFӚ/[;!4fwsF=dޖ8/΅*:QKB^8(kQYyt eOjuLtEttPZ'-pѸ,$$N8\2 )!^LYW&i I qH!)%K"5@BbTg&~pTn*.sq:QI)dbmE{iV s=,mt@XJa~Fa) ln)8qnQ^/*PmuoI33Wa+3}aqh`FkPaEγ`i0ɓ~%韩\ӎS &k$#ZKV6<'/^5İ`,u`  JC4*BuW&٨d_]]1S8dZ,6;Xppw߫oqK0Ree{x\ws 0cAݔ=uj!)r6%#@]Q7 KkExQXxJ -@@ b@(npd^|0.LSk&k?S`%WYrzAP 'A-XZM6oQӆժmk7!`Zm[tq +tyaC&ҙ hB=#5yvNCw݉?7<^Tž1vkd/2Je\J+mȦHm@Vm@Rj(U`8%։ <]!^Z /Z'7*| d[294.j@ 3.QV$a>%fek_Es%!0%7`N~`ꡆ D=7&0X1g3tgS^7O P5ɗys^CﱉL=Y}O&v_v"ƿ`qZ)/yeջ'A/ҟfӬ;l*@Mvr:/B(6!6T0S#,P<;A' 3,X%I 0/D͹sŰL7FٶbS Qƭn7Yˋ bֵd+L x{{4~cg-{^je\YVv. h ;f͞Hmc(9{M<5¦N^Csz ܤϥ`bȆ ?B z @ LFa50@iE*mzhf7iG:ESk- d~B@.Kѱ6Gݤ$d"dHm:r)қdϭKg`ꋁ)]y'vx#~6AYlT=EAox`˓h4!Ўki6&)| uN @RL`vhuV9kp^OW,.EDžlfDߠX4M"jZm,[b3 sVuxtfAҬ!X0Uzg@a%d+B*4qde]}SX#Ә,;%g׳zN[ӝ@/ f 3tw>y9{fZ3Ppv㸹v'؟L۶-1͆ycHЧdnwi L4IVY `g[&+:r`.LuRbs6gVVK !jrĚq[g%D%DS,)HLmBۮu=MFwH]y?a=y``i4]~=n? yw@ԾGU)K 6cLsX: GxKy2SQ@A`i~zm=NJ$5YL ށTҚ\=2mƐ*" (Y[j8 Y [fk~Et"_(p~93vβ”C N)܈x#~F>lN^f{kj^=,Z.@OJ0,P'Ƭf IJN@:0=0]@J r%Ƴn"Eـ1\]V`SKgb{7Qk#M[8"E9ۧ[xsK!ԈDX]KO&4fOt%)8g ܧ.&w hm/@7o`y.Wxxh;d{+k@7͎]_hBGļmIQ,`@6mרKK\Pxa6 f5ґ Y2X j眹H2UmT1VXNEO@, a4NMJ`%$kbyhpLQzJl\;̎!B $=#?|xȉ%~#ey=5w,L9nvTog;͹TdFZ޺@-Gz^N!2Z /EKͮNH/ DR۸luZg l3h. ?I.&朧#pj-ݨ kVa5}:&X1N,6dt,{+x7ew~M\_mw˰; vgt`i](P7Rmaz4S̛儩\AgM[[Qkl"(MiE(,, ¬Siݨۍ8cz?Z,'M_&ygۏky+sk'q 73^}!O\=a0v=H$2Vkl>׀`m``=r ںK#|[@qs݁b>}tmݫ[{+7N?):!H}~`h#[םX87Hjdhn(.sCS#,@:Z̽j26OQ7ϱ @@z=|agvZt9:e{-* v#^=݇?bk={p}eO5v1xkl6\^ͼ 7&_߲k__~s&ۻ8LU>~xMr~?~eӓ/|\)xވ}֠,P{.wpB~CCAyjV_< ;ʭ\`u?ZӇLom{Wp'ͽ-޼9dl#![boIFzӱ㭦u-{`Z|O\[ï>#6yQv:oT/ z/r,;fٛ,`7oވ/ ݗźKN2?c<~trOe Bcx h=0~mGpz6}NLK)+Go>qgn05}ں^ey Xu_a ς ^'{tzv/dbn?>oD#ʳݺ7yol'; L_|"/ 7 x/ z/ rP,.>>~O–{50zq?o^\?^r ?}\g?s< fϋ?_H7oO'*Ⱦz?9>|?Z_}^g+6J>qZ7^1^|W1~~hY>:=&?Y D^ 1oOʱ/~ ?s z_jF 3~ok{5kWgw[^ٞ0xO$7bq{=>~w{OdDx#   kDx# @3?+6ox#~JAg7o(z)?=?x#^"/) F o#F7bĈ#F 1bĈ#1bĈF1bĈx#F1b#F1bވ#F1oĈ#F 1bĈ#1bĈ? 1̣G1b`x#F1b#F1bވ#F1oĈ#F7bĈ#F 1bĈ#1bĈF1b#F1bވ#F1oĈ#F7bĈ#F 1bĈ#1bĈF1bĈx#F1b#F1oĈ#F7bĈ#F 1bĈ#1bĈF1bĈx#F1b#F1bވ#F1oĈ#F 1bĈ#1bĈF1bĈx#F1b#F1bވ#F1oĈ#F7bĈ#F 1bĈF1bĈx#F1b#F1bވ#F1oĈ#F7bĈ#F 1bĈ#1bĈF1b#F1bވ#F1oĈ#F7bĈ#F 1bĈ#1bĈF1bĈx#F1b#F1oĈ#F7bĈ#F 1bĈ#1bĈF1bĈx#F1b#F1bވ#F1oĈ#F 1bĈ#1bĈF1bĈx#F1b_X:iIENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/splash_anim/splash_anim_15.png0000644000076500000000000020625112647526517024355 0ustar devwheel00000000000000PNG  IHDRj pIDATxkeY-wF仲U]8@@A z$gH3e2DJ&4>9Ù{}NUiqވq]r'3C^b/S_^zW^z׫W^zuիW^:իW^zիWxzիW^zի^^z׫W^zuիW^:իW^zիWxzիW^zի^^zW^z׫W^:իW^zիWxzիW^zsRzi&a: : >Ykl֯\Kի3^>bP[p2sqf5\쒸ǖ]xz r occg/ 2sQ`%Ƿ_>=Z<ŝ%ǶRGDŽUw׫o4>fx`xlѭk(,^}eON.o;Ϗ;u.xu٢R+>Y_Ӯ=_t׫ɲvaq{gȊΓ?/(R-zzMa{ұylygɐʒv^%lu?s]^u tfEPx\5?L^^_$\ߦ;@#5Ӭ ]:ٟ5Ze;`vebgf||A^^_?"mL_NI˝%G:tƕy7gm;u@l׉(e<Ƚ t/"szzQKN"SB_g> @:0XE/4yYFlRe-W_ ,PЅܮaLBϙ+vY罞96ѫ^^/%Vxc4xgy`9%ehv]䵢hveey5y-aT/i)/+}]E؜^zzy n;(=;Ycyɚ=VrĐ2uLʼqYy򳈔tիׯ;T+ ;{|jcdiO/8g kA^^/7c^'FPq =|Hi)s}׫4<;.>o]?؝n^y޼a{uby0 i<.vu 9Obo5/yƢW^>;.w5D"wMyOy݋O^"dq)o6R&m; Wv\='ѳ ay[2/怳eJ:ŝ " 믩>e/U9^4yT ;ueo-q˜`/(e^]˶ѝ!;! "m<ϯ 6zzeiPa>վN~1 <>yp >~!39Q[ԫ3^^SF86c] 8k\[fp|nN&[w/0o>h"h8Š`1#Z<zw=b!F W2kvWe gvvINmRy]\>W[\wBi!;Wkr`]^X@Xzv"c:@k>枠et. y4B‰)4 3].'t1k{]٫uumdN]E/O*U\8m5H,9RY<:.fi'l6hWVaf!i-Нjoo(^^@>uNؐл<bry?]dmE.y<sJV)-2}= 6xܵyܶDt3^^bW!+>Wn_Xb{\vXZJkViY=ϒ,qvm1>`O(VGq9uV_$`u{O>jzⲼ]loR] ;eL9'UcyD vwEB| 16yB;{N08鞵Ѿ; ~dyy<8by-X/]vbQl|92/ԼI"L-@6L^13mQWL;0ƈ}@Xq{7u׫U{N3 M F?veb' 4.*Uvggtay=}[s=b^^۫;o&)wlYI?{wKnR(9ǵvcvǮ4[Y`xy ;/Rf:iϏ9kt mU(fN޹9U4{,%v)ʜɃ˛ef(5[t֟ w^1<`w?}`li3+SwY=;`д5޽z!vG |f@H]ȩ3X\;Wϣx%;ܶ|mu}&K\ʗ)8kouM<qX"gýRm{t yOLWhݲ:Y<7 Jgxz|g1ѿ3a @)5o㏫0/TgG9S!LpRy)cq:oƍ:c~$vU6\Y31F̽>jnO']M|?{w;ivܵ掌]=x8Z9Z(h¤؜9Mp0.*Y^frwBW rЙ\;6K +=:oR3i4ƴ}'{k583JЀ]?{w /k(~MPsY_Lo(.>ф4àW~ 3beXFl_d)㭙\ ~;|W^-7+EU.2SH tn2O^rsBةI*3m Ue.q0IpХܫ^^>3. pnV?Y2ZkbcvZ(k`,X%4 =ͬew@xzL2] ز] o@p)stĕ2M+ Z$O+kW G }%.ߘVV^Zf7tW^Jv=w^mWa=x5#I{XgR\_n)+ag}&M91̘|1y-7vݰ鿲zO_@6>-t#<+Y~ pvJauLm 6}P6-G&r3/'SR&j^:v,qg.#p-/ea ^^>J8=M7٩)Guի Z,)PmfwPQys=,oצzpDZ[Z)I bZub|_ϧ•HG  $[g-)Îhxzu`c4ෞ rG2?@Thգ-]; ZXI|+|+PO[v^ԗTH+e IA2GÝ쨂> sQ\V:&8N:k]2`__ LH .; vj.e`k_]|Z9sZˍmf@ClD !0n6gX]²O>K^^_cCЃ0M j)NZ9O|9L>`t}VDвҩ𹅣+̓4ՕL չ)'$a$ *s2$NfWW^^BɝT߲;[ݟC0;%i/g ez-a/`'G[\=q'-ڀ{n_@V+3q؜|$guY6(Zzy^^~} Fs>=mõ VN<N`0hG%u"3zԐ]2&+N:%iW cCWǻ@PƂ †' ? *t}y^~Ŭ>S<A8inU cxz LLςqg+# iSz}r)SWl;l;|C9\,=< g; 1b< G zuo706νMv`eIг<].sʰW_LH/XA97sN6q5#;Z,82]lnqܩSO<`ۻ?:+C8-Ť0fPC r\EIյ2[.W^~ ^$}7ܬf c SKɒVUizKNw*6d)vl fo]n&g *eJxp>$cWr|Uf x; _j׫܋/R 0%Js0Փ0a" Ui٤b`} P t~Ɋ=zFoՀFzUɒ@ؾ!8嶤yxsV473[I+ vypIƑ \ȁ52~]NK^^^sFGBʼ  W>&HIdi8V2f(5@l-amXr|-n RlǃhX%VM*Jynh\C5N wkhvMK ֗*SBo|G| : ➇/.r> ]{*sI )|0j)mn{x 5E=EӂIsLjL-*'M`μ J0]P:SIzz:+36X$D 8?ϣ$OP+`k|r؞B^Ϛ]THWjp\%0xԸ25$LmҧL eZJƬ}O-UlvP3-F|6*Wg 2uet'$Lx5gm|SYnn "Rbv^W^_t{~ۋ>[0Ԛs̑q>SnLl =`2nqX p ;+ mzRb뚠S;9gTI9tpĵmkTP.a6 }|/Qgyz݋?o"FУS vqef:/ \sXSWFB1vCH6jN('9TJzG I4-*E_bF pְ:'$Ɓe-Z_%qɭ1,P#1\x͏u7>K0{xE@yg7琠q/WH[FJ@ *rũ>D vVg`\er:f*YZWEGJ4%fo]1p8f-җnK4SSh*O6m^V%0'>$RoX +[no ^y/x:p/X7`+j_"VܗŸ+r Qeihq_&k*Uqp F"/h9Zdyq+x?oѡqnnsʱ❟`-\v:KYAùU,kZ'zzFVSC:v1:: "|3 Mݒ5EAb'AH\UNj7ʡexNg gAmv[bފX"I2l *(Zțs`4B5W,"k0$y 6Fjgxܰٴ~Bk۩G 'j4Q] v/ >ͤm|^(M-ui@l@mqV1ZY&PNZ{o)2'Lˍ5VPX`ܵ7-9@Ws$G$/ßBI||>:9%vLGaUX@Y2vRIx>_`YE}g?X~N=iKeq" RY @R,Y3bO éi=rl7]Qy2 T@(o]:  >>].=v31plBMp9-Xt?~ QG\T 1Z? 'OGg7"&j@HivavtX0ozykG,GQ#A K2onm n`s ;~App\.?*; fmuv32J.s,)%^λy`-J#eJ;g{7ONEBE㶬|v˙)[+|BΤeLU>Nc?GV~`7@6ֽ:zOtgIgXE$̵|Wؘ貀C04(Pn /vقv9!A ˀ7XJѨTeMPEsqOr-~N|lvŔBU,kیwIWÝ&<35$Dagb>Ah֚Sj0Zkwf`/ 9D!a ì p ..3$ YfŨ0­#O1rLزo9w&Sf@?'y23¯ev-jXvx_@yR,ugm;:>ǵ7iWNRhqÛ)U u_S[rLcFJS F,,76qֈ="vz9Tvm"ßvdr(efbKfȗgL5l>M6LrIq^y5\q jmo1ij$Lҧs7vvyT`we"~Y<]m=pvAHzͱm.5};lߵvr+gfۿ3x/IGHIj(T)B`v>SlU#["\E!YbBݙWn0M)2y6,Gip"[r#g8BA6Iuvnfu[ajšIy  n~}2@M0*!3\9T39gvSNf?~ 8)w].j>J^gI v.RV|`8օqev҈Ű" zKZ Ec =<۾/]g֦ IJe_ۋRF=_uTYEs0Qlj }6~ OQYMO'>q_ZsśϤ*b6[18YJNmwWA-ʝʝn I69{`v̚_&:z)e/xt;k_ϐ2==vmlY Z5A6֠"9l/U"WX*$ H 57ƒhѧ8RB Þ}n%<ˁJ1,Y?_pk'´2293:5\#g9R ȅٜkl<@XֿW>;ݽ  nwĕa!KJdch1Er |MYsGw+cyQ5"$\|0/]=bO7K1Trs$cP&@Lin g)4m L5d ,DiP%&G7DȺnBBѯz >ltA#j *,|'UGg9>`cxPZFq]cuz WJoK9-0XyQ&; [ջoAU \qR]ιI9KP/!YۜQeRɸA=v}d&O.z [=W ɴCleτfW7gTlTcV!66&#l|dD &)&{kdHoSju'Y5PuIQ J`fL%Fś*rv<fY+ tSAYɘR%M)(@s>=5ˣyA\:\W߀s![̀7e͐)g7j1 di's;m մx>/} |pہ) L6U+r fXU5{;+OFu,'/w]qun"#mIkK3!VX\31ϦqJ\C!qأ.9C[2yN++6݅9S&\n{ӧk1&l4ˎRݣM>̇:H(Yw5rŲ7\.kX\45$*s4A߭ul.|ip4+n[}m\vjV@J x2M;ڻ+̏éKK;]᝛N=`Gau yzloBeۋCL.jh `EZ :2 TLّ 4cg>=; %(NK+0XpL.Sak@4]Q 5KZ@D"p>Xc1~f5W./'qفFD(wܲ ˭g o%M&C۞]1%%ܺ}e.%KUƨ5Havc9a; Ȋfбcׯ]&ؚS U8CӲd6 N,Y(A2bDT) r[՞Pr2]H^q.T'"8{*ALnv&&55!{v" L7W%eؼB@Gѭg'sVNxR4ĔOʖn9u?I]XԬ6kG $fGޞDթii[ \9W_}^yCZY;-]avc*M\BެQW\ҷ` ײtUO)RY,KL+Su}͕&gs`,`G@7K]k6sْI@e<F9 6bQLҴCBd;#bS1M)rTo ؘ b#TM"67oWBPȣ4 3` 3 d %ȐXI"aGc,4 4&!gMN!{pOF*aZ550H T8k5C<]*mZI@SH^h Wqz5gk* sVzqCӛK <̲&,iU w,'Hs+)sRpjqc~[vwI=O=xzZ5(2KD6ː ,И$نf2?xieJD*o2Kj|gg$MM,H^9!F¤9@!bF-˛%V~7 /f+I+k m.ַgѕʻx֗$"gtl.rt%JAX/$a2vJ +ٸRBπ dcy )Iob;x>w%دbw-ww=l5 =Y֔|fim7BftjqȞ V{q08i(þ'KHHӳ;})U)cY`% 63ƚ] Q6@DHGWwޥbb Bd#ӣuc޸$E & )14bIX e$' Eog+f3ܯ󉟤 LIGp'馚 i- ݖK}ulJYx}Ǝ)0;9tf/FȌOq׵͎bp1KVF@gLMM4L~R܁IÎNfNO+b,q ZMb8p)Tx͕UFL<ݐ"X4> G.ܘ` FczwJë%Fd1[,\%Y3WK1j8Y;ݥ/cިa!]Ȇ:,Be|9`ukiHrZ5c`W]nzuf.Lg*w˘X~r]ex7cax\T-k͜ |̨JdH''lF%$)qPZ9saP!w0ca1AsQŬ #!a<D Ǡ.kŘY8frp'T&`c`_ RX@GFB`kEb!#wxGAVFk Ȉܬ!@\*& A,yl$XلL$X^EڤFL%Eh><'̓Q?m#DOSd'NY"!1&!΃-05јlzVƛWav71m-O -zuh^۾)GM tHow_7PrL>qp,5I3gNy1V><e26r _;/KP:& 0!~hE,͋Z^l%҇G Y>zt)4Ͻ5 7`m큛WԖNG*|;L vj ɖ@DHx@|姧̘渂߹ 2 c3f4^5| Ya8E(V˚Pa"2b!R1tqܝ\-Q .R'S4݃hiCտ: lrbjP",R#^a!kN~T~li4hW2ajTP >0/' dvǮn;0gְ:+Y;ss%MsLWL󆄕لl9eg ޚ,zxͱu@׆WMV;&M4d%6olR)'[dTsSx)L2%GOn.Y:Jl!PhLY?kDn'1ևmx5Qٵ$GWlAϮ:(*0%2Ȧ!62zf^H#| ,j0GD 5ph*K: Rwډ$n#BAe~ I 1Bkg0ĥ rvI53@&1IɀW Օb=$(43IX6Е;7淿.7@W[nوbLX}8/G)V8>;B&,LDiLB{MD&2h~n+c`fD*N3-STܤb 3J7avNjipOG~vDLno]tsx3%XDY%T@<77Фɦz$rh ȃ:|"ng:jZ"K`f]p:lѥJSqr<Ͻ(}@W⁽@Nb KnawO{T7ʤ3ShJ2A}qe^f;yvdD5k'E͌c#w_+܌2 y~~ʷnlNU!5җ8MyIrј|#4p64X,6.Fls:o_گS#dJP:mdpNo3 xkC#e)<:^Ϛ}?o}LovhO=nyeL&>$qB2!IAY]4&7 ĩʘ swF82əCáaؗyggsdmcT,tufm73Qہ!z'xgl?W8OWAz}6o[ Uf VV )fs:?Xo?6f#1@D1U#a$S2gzϏG5R%| 1ۅvʸEb@9^1ܮ6T'E䀜/3n[W77_L-I.OTy:ƦhtWdKT\1yI)M 0x u+즓h,sG;h'YDQRf[{囏9<m7e{{'\ w}:s6g >mti_ʒ:! qH|(2zr&I*0f2VfϛI]/0Q&f f'o&`)j04zcF\S:#j&PH#yGDj`rQ,v 2$DJQ1fW~G>L#wgJ _&92XbR> kz ȄɈJ",CHLȾ~8 ^Gk0 wWݒ1Cd`Qߣ$` 1<'N\݌58b$ ԇE#!j: Ŷsce %%'MdVpJoPslɿ2OX~NMjjTH ?db¬Hn1aQ2 PY\Oi)Ķ$WνaYVyhc0e+mFq:㕴g:>>f&ZdLG(;q8,-SqZz.nJ ʶrQEūOYtBY꺞oe6FպeYFݔw Sר2YSM6k ׯ=#|5 1 m|rRgId`@DQt f5b%rNbd㑓d %M|l2@SNjf>kw0eA+ R ."udavT;Kl,%ƤapA˚`p"DHJ>;& ޽ O>r} %@LXB jӵz{!|(7$k[3n7! 9g'v.(gzg5<2Y:.͜<2<^:0WwO*zRd/ My &禓)$LPcMYl,/߼2V:` a :&+^M)6CJMt,2VRg^/ ˅dy㛠J |x:Rwa3ݬ=pg yI tph1äs,D ,%ů>M0!f6dLD$-a02!ABo^OwN㔒Y*2:sl ap!"$fv@~vaw^lWEbM/6w?+A&E2,+AʉƳx25%caz.]UQfao w%/'01oO_oJnUEȔ-iYV1--՚q8PH4cj '6Д%!4 sb 8S8wjr]qYRy00{wJF[fL;sx^,0ߍiMČS%Y1Fč+*`E$͌3S DdD&a"죿|YRgD>8X^i w"@iXEݹytìo'iq^{^OE 0 vD㴑7BG.\ɃYb0HG)NnB n0($s5<7{QΙĘ<9֍mA+lȫ+-I3!{m߻p7!?{~i9bl G`03Ȓc0F<o~y>$efŨ]!RXx@Ɉ q !%vxr/Jۇ35Q!SO/%Ab[.;I6029cFbyr˼]m=~:@$zyw;rBa:q6O>Ib \K%J6y,+SavSfd8q+T3KN؆_"CFlS@aqL(z^/R\ۧ ++tP$̃goLJ$^> &P4{LL!u'f1[Co4<Vgfuٹ1(34Zbn>}2SYgd'2y|0O5eVwidQ׀\83fjzvV+3woU%O6o ϖ,g;|@!U?0 g3I)4`7zOziVFUyMcwEˀTW-r8%+l)҂0++q9hCkoPo'J0|ϙP/u`r}rJqbGݸd"gv;hpc[-~ 6?fݽs2g> ey 8 m}퐃%>{ Qs)z˨,*ԮXAZܔ|: G|16J?v sUv)3!7եH=U=n4VÛ `fe03e/+(ޱW;O#@7l@A4OAxN8K4YD hJ^nJC ;DC1M0ƪf:A u`lj0LM08 vס\b:Ÿs(L"518Viސqߖ35`些S^[ix<|ŧ&l h'n@`FO<`4L2R>61%@d -nF$̃T"UTHh0D2b%bQ|mԻ?% PkΚ3󫀇 5dyL~Y?Uom |I&U;ׇ=O~c6OU`q .6|{W42|1cAO_}ndEe{u ArM0XJrD8E4QumʓOT1&&K4M'Ȗhgh>9$L)@Q79圹dSL6eQŎEd3؉e7I3iIIHsF&qGSVY!0 ky*[BLG(ND.] ,%؞/K SlJ9Xk|sϹ^KVu_Y|c/%#A?頝& >Xv+>\V'S!|fl¤DO|ΓaJ٠9vf491`JFH,"uߝ\LlᱰkwY͂pVҮ9W~VMxP+k~NJ_<~{qr嶙gOZņX)(6fGd2Y&X)+4WْN.]”Bj}2L|n*C|=66S$Qg4sI  z^w-t7zz-EFJʾ h{A=SR7IbѹS dGL1M`3G$38M&!3Rv 0dˤ0Iţ&0,Ĥ,o>:ۏSN-^lO~Z,X؍ZMh/5:|=~5d`lt{|kU+ͭ ˋ [='eBV2!5AlF0>2_rf IA@ٷX6BݗP3<7Gd7dOOcI?vJKYCw=9' Y>Rkx44 4YҜJOnD<1`s ͈0RN_}=8:"3re) (s k*W Tma$Sf!e?ș&S`Sլ`Rɤ)G#55n!P20))1El f6^`a0-2XJ-~SQt|@2gwJ9t+KSX`eKb8e#EbI ,˙&RaDYbDA'X2 ^?8;%tW/ xi0m(r]\||< nRC]#$h?#2?<؂\fC k ,aD ?F(+b9Յ!0QA bTR >ϖٿ1#n>zq:04ꐐh> #&(&++g=g] qKИe9}Os->/+7wէeZIֿ&G0ʙ9| ǿޫ+E۝N; A+GnDlfw9X%\~z"SHX H">$L/Ha&E& ٍ2r[X(J Sf% J_+ު,mݫ˴:^^j+ Fr܂WaykK쬯e>L'b2bY˜JCc^YDig@C}7[OW㤒&Q>"#S,c:Ձ$)'޺"̐ F{L!`n}ǿw_'-){jr < 賥b}lǐzj~ LaA-`We6Or_e,Ntay$X^mI) ܼ9r^/ ؅dq8ȰO}8xďم(4Y}GMyicqex? _D*YČa_}$bi#ݘւ 42d K8i$>`[.>ٵ:q|?~pƷg`+?߹u{Em0ed BuU4rHwx"[jvw$$ `R%~'}Lc0&1 3H3h"0f2 dH6z,1 !u唕X#`H$_ElrՕexkkUWy2K-kn?7g+?լpŨ"-Oɟ=BbNpxx|[m0X&@M1YҜ0x^?r&d>0X' K^ٌ{|\Nw;~x1M:tgZSv&'M:.90/g>ԙ%7#"Q:at C6X$,bƦ$H&QY  Չߘ{w<5awsJ!<[[fW6?aZlYFrx| '<+U$nÇgѰ0){Þ\{phQ(T6!g12;=1:WȠ4e,\Z} y`Ɩg?G_מN:6'|%BՁԥJ(2x4n7gr9:12<NxdgqjYK6.r-tbC V3S#BS2uRs9eR,T%&X#F)pC~0(ڼi9\Xjq)_wf`c^\ޑƑwhQӴbA)yϮ0׷GK[@ F 0 1MljwMƤD`R)+Ӕ( 1$&9svGFF66UA$<߂ȒJwb}*kX*KI=f``F m%Ob`~NHk NRz2l-dGO}z~cOB,F}Y6Rf&o&%OWu2!EF,yVN'Ev7{w}K1Yssa2QKٝfeULd2dX.&txTd,3(U]3y2&l o a1 '& eKPa14$lb fἌ2BY&(+G|{_}}M3%1eeQKFFndYY%O8+d)6 M*9˘GT13oFΜUses%!T@̙l0bBȅʲ\T5 D͚ƪ([Ȝ!_Q`XM_| 8SIvӐ4 _Bkpi.F{MNokL\{pY3%^soً+!~Kw|ߚG.I#+f_Yfb{gѭOO )GYU%S̷%xc8KjdD 'o>>y荧f (%k&Q✕ SVl|H`bHluJ8Nb} VXر1y@,bY9qdD&f9=% b!L$,p9D$$]wNmM)(gGs]AV +,pS'KI3K(L8?˱i`JT1O>EI=P^.tt$FMk+SLF&%Ҙau„A_ٕ<_o>ҽ-D&S#3. Y9O&4Hά 6eAȜ Ӕg4]9棃h3QFdT3rH=F`Yc̙ L-㺳=OBT ƍTwVu(!s+3VZ܇2ہ4sوD#hfuYFD.beh6_ՄFl>\}ľKڬ=x^y5koox2{NˬFWޝӸ`(2D=gZdRfVK tDDFbbK&"  )Dsb['fe[vfi[9&5N"7&qjҒɵ )QaJ5ګggc={/|Kca;{0?W'QHr5eX+˩0N[\3FQW_9~{> K"a%{#51ut;%qpV)QfHx896!tRd%A՘jqR#@a @^[6X@%-z#&C@Dd:6RVƱ$GLh `6t[0VJ1ͧ0]5;RfZ28V]2h3 $ZAf`3\ab3[71+3/߿w# g#[Kl`JSPHM8g*dgc'a5IFM4)s6g=(2 2onI*Qr ӧU`ൠVVNN4WX$JW?&`8~'9?/??2мo>o>N`t`=Bzh.C~W]l[J,3ˆdUa3m&0clUS̜cvhLOe{(ne{0q;1+R67'E p&ye-]4=.F'Rf5|)/9/<ӼH0`V1ʱ9æf*B, ZPM\Y,].io{Nfl0;o)vW˕ ϮWoucȶS6>l2D ڗY0̳ e&3|L @ಾ(33211ķ 2 M* `y ^i1yZ3Jjkmbi[z?Oe` l{'W2<[GPMqPĈ0Y:a0L@*30ͣ/>y!0e"ۂh S欢1Ԉ3Ħm2&ب"@dlxz혷Ьn̆lY!Ol X*90(ȲfVcjdd%9*),A%6yDjK`FczL3Ű")L]Sfed=G 9ϥFpÕ ZxZsXX܂͵WvlD@*Z3bN6@SR4g&UQ&,%<խC\I߱JjD)e5RR"4kv|s.KUYIbgܔTEܐ˙'FFĦPzy Ll9,ϱ&!OdLIG#X.L`}Q:NL&7Q_Eݞ\ۘte:qAu L-@q:&|,Ǫ+yzf6 (Yfj.\oKPc9( L9:"cbD5vhv,dbar7Ћy,OY@y<2 Gale ;d"7װ>儕rye(=חY$jڵu`وb$#1ǿ֏uDY)Iaq.M{t0n;|>|f{mD0M Il\p6VLY'74=φꖦzKrX |1L܂f7^?~÷ۏIG9wB"1eYX1)M#Д2?cMS~<<%T UM٦08#Ȳ2AJV_l0&uW A2qQxF=`"Uԭ5"Oap80e%_ȣj`=my;R,3C=f7c0[cCkbFH Ko<ЀrcUoXf{=_\6h i7#񕘾B.m&;:JdbcU0C ?9af&JL Va 1)(39ӌIZ9sYWx5Nl2oA9V==^e,yxԏ?/>~u&9Ȗ y;ҧO7GO^}򥟾{Gjd6 dfВA5QrY3xlOw6_ nΦow#e FlgdQ]JlF%㦔=%2SV%fӬ!_nKU26gv䲣ˆY$^lY},"hU>40IBx'ࠥ9a=1[*+AbKaTdyӫY.39 S2 K[vNZFݕfDhWev^!b@[!cc#&YH٘٘ɍ0S8Y~$PM`M(ƖX&dWt}ɝ^'2-;&AYӈEPVUX+xjSLs6%6И/5I@k6z*DH*@# +W1M BP汒o)M];ZUYXIa夔 v s5.RSN_[{3P)o ~G~| 軨IYR`W\|o?xGo< RFj,Q9" ~=;1eв;i)KI:!3Wy )LffgQ'"}o.7 7eyLrD􇛲l:zQՄ"'q(DjBU&x"cHtyᵶPyHDѧ'DV 筂ktʮUs֕mZIg.oL xWuo?x_WIqc[ ׺Ps22mR}Kع'|E"ȞI`HPݙJbí}3n!J;cI^̵pYpzc3A% tE-J"ru0Tѡ"4N\w4PNE42W hSM:.Q>}d?ώrwJqMV rrQHsR}>yʬ+րwYW}mځyׂui.j{Luڜ 1-%: @/N K\MKQ51A{<*r:dQtDCD]zR!LҐ.*D+P5ן.jxW64J"KgcTZ>+N:9eԬMI1%~7"]Ry^ŧ9e\CYF83Iju3DG23)W!:7ױ)MY? d[6V)R2|Pq%$l-uQ(c& .{U)qQDw/>_~8WFZk/7?mES[O̦֮|ژ@o_$)<}H$  wa^f={gҷUCr@|t2l?K=M~jzǢ[Ғ&%mMmTX1$|LrۧZ^}q %JʲUz]%P/C@i;JcJl) 1.!ՒAs5(IbIH]",.I…@x竿ߺ/'$#^"mOw =z;o;Kr5Oڙ 8}8@z%N*re<!omkT|;8$5%d|'v9{wObP& w;;K'w?^( ! Uκe\V% cb• P̡9,n sKlRՀ2qjmi-&kOWx=n.չ'q ^љs%Zo/BMXݟ ID=O-Aԓ2PZ("3&Yf%轷y훿~+o0QV!_MX."r$V?_g΍:,gpFw9k27~Q_OK+_qAwUd$R <ƍKrOvIڈpXZ!tsau6%;HN;C츗~q4.)8f1"2 q&qwj~:Yӑ WfKPc@EpBMtQt7xq^)6T+niAmV2Jv̷@_*nHuPZ.GR$iJd =mڨsD=`4zx|5z9V<ͥNj㺆׶*z9 0r\@\c$!.S7 1r,EFO8E!&j$P]D2c4VTU[7lđ f|]BK{;OB/ݿpƅڻp;!_;| ~/M s1B'87qgoO0} x?ę8k}Qc:-cK-ؑg^a堤X#Ne(BH; 5~)IC tdq^Ӥ-X%8n8M'uf̢7j${BUt1,aj4Y@E[ JVfNif(qqA<֬zPN _^za;zm<𓘪=1|9lG@oaW,N+Öw|o|o{F,h0XuH )̣ݣJr8- 0#L'Q<S%ҡ={X$"@$i\S4ɲbg#1r3+0J3JWWe*MC@ؐny$֤L|P  ٔjs:H~PYOIW!(ZTdUgظo&V 8[9ۥɌ,۵SV">/r*FV} mbn ^:~1yRqtl?.0x,8i^UQi &t/oS+nniL|=_`^2§B|]@Ϯ>K+Y<Ɠ7Gm+4X> 'xsEE*lBDP9p缩Z(U/Ǽi ޶%ץSS @PP_ I:_.%eZWKZ,~saMu>଩?4i/ qz ǭݍ&{rs>n l20nY"PR9 ec (LbZU\V,_oMDbĕ"wՐSކZʁ+?3w[xɯ,{G_7^ K0nv;؞iOx - 9- /Bu-R92}VM,SYLjqjӋ?)e"AŅB0jZ%&݈{PV6[wɼk$;?F9'U(ühr`zi޴Sm瀦vXa*|M*6_yvw/ӔƀҚ[5jXޝoz1reVLP)fk~Ii&`إT(sClXb}b):$"L*wzWַ0!x_Ii ޔ澚>8 N(Jp?p9]b (6Og. ;G@l;+Xkq>-{x5Xl"開%RV|ťYR~"`W̍Ǎ1F3x@ ,Rf[";T`I^za$EZ85}#sbR(*$KyvrA.%pl ~U-^[T]LiޔvWݘBnHkH2ǕkMn*hY- FWҒU&؁ㅩ=ߍ)zyNw˶RhsI, Z(Tj14u}TwKQV(%䰺Y]ނ jxvk552ȹ]\%#|ݐ94 N+N)d~S @ Z̉aSIAe}15Z9+nMN<2^x|:^gr ^FC22Mbi`nٸV!NN nה_6T 7m& M1pUǫIRm,j{mŅrri[c`L7 LS(N[DgjӎOgȵFy:.e@ -!iM«@\7P+ZïuE4A!uFW DK)z<Ũ(d*KB~|:JN#P~bH(XUlۜ6 8Y\ K&ҁWFbHURd ʳCas|"TR%=Q_y(X^> Ԡ+eA7}6 䵪P^>@څ+s;E[,FjTWLu^X'Ƹ+_ IoU𗽉M٣Z3ۨfGµݾKN-0_r\2SCA 5ggQl!'ՠ']`&l֖ 켮`;WV"lত6,)JִiRIh{bf(7/.^ lkbK ò֨(܄*,'{R l^; j%EئĽ {. ֩dL1rQ*Ÿª8ѧuS'(bsy9I¨un>s @NaQDC}"×*~XLؘZ&*d)ԘG* n )p`*pd43Q^זb}}/lK_>}MK[$/uy7Fj<5jyHSsyL Tb IN+ S$RI|_zX]h4hU'Y N0K4ӕgpkql\'ù١qx\k4tDvF ӱL֧R#GϓeZjrSTdL*digAl" &܅ TF N-F!$1 nu:Rh҇'v\=Q2sy[EzQ H9440 nLJa:Fg1z '`Z%Wk]ybkq\Kw~#7k}")[_ZPUk8)hCk%"(p}Tݾ}M_ W ' ^GʠxŀpW%y|5 xזb,egG# 3xkRM?6Tl>ʜfS s5M鱴(I.8NM**]nS-`3&†L`Bd:&YH7 NAM/2"zw8\P^":RtS2VZ ZB-x g˾{4T\}wa^OMPkvyM7pS7>}-uA$(G?]42UJEB$;w~D)nkצ-Jqo=?~cx 󎼵[+>=:gJ#p,KL]\a2i*zl\a?G8^7;fya[:G=3Ųݲ9p9HMvnղIF*9cA1iBs WqvRPx̓6wB֞D\uv PlHʺ~h*lBA܎p=X^^ Wpzy8Ya@uƁFřJ F~ZG \{Kwr*U96OmAEoy{}}@|dچ,27i5 Gs;-́e|we.6c9(le xcܖȞwC~:RL,wPw -[d(eVLhkP+Xc,l(/XT"X| O +x=njKhrWu^O:\܂qxϚ&G!fx ;P,2UP.W+66Vî}ysM/.WO8x5|妹*GSS1ԚY=q_8.q]SV\p-, }O$0;fhGgWtZNEpP΃`.TIUaFL'աYӐ^|GPlRM YgYj`:mt6ߧ5 5r ]=>>x gp~ V-8sV!ў`9Uk9&]M!dȱ38uHxKNpJӸ},:tecss[^gMml:_b H)Ҥ{|Բ5hZF!;Yo7~N  &+P+w:)p<5x֘W5\j+BHByUtUٜ2MS ?t xpsH4`XcJSw9P%-]5<jJsNq|͒Df}cM̯Zux=>յbI+7Qk+iXLvbR㉽pEM.Lc-?gY*Y @^ft̴VM x檲U:5؍9@Uӝ5%I6%mřY]M[x,6  pR&OD͎bT3hR+;]zT!he؏Y @*z\ H)lJadX m=.TMA^1|׀7h@ bnNdHP+=xYZ;ߐêlAaqt8-^F#6L٣ZPȍfWujք\ӜkwgoDٴ2`Y4X*9z$hEWqp[7".uU\@z̪\ay>uBXQZ-UGBj_u1iIcҘ~ģG05s4g%e\cVx.q? THWO{Z.Ҝ,gMzC<\ +e+T_jl|T\~^[jͮq6ٗNvH..L@OH1jc=.1R_1XћO'71Nꮪ4-M^5[+;FaOJר0>76:v8r{x=nš)n6(,x g)u5gDMrl -:\p`Ii"B3)޲p{=*UfUxX5cm6Ktl5Fz8:=)qAb3.fyhB#*dvd4@ݪKuTʴY*2NbIgfhœ)=`J!8rYNX z\c, !nsmwAIcvxxU]57CS*P&;\^#8+qm;stcknΰ}rQxiYDܮbn \,F6Quյn<߮~n|])̜eskDRߙAq'.p` QW4Ϛc6-%q2H]LL5RƏŊDᗑ&uYfL=z>xe3MzVu,_:vhx=>Ҵfm3j$k01\M4_웾rWg+ מ3m Wq˿esŤR 玦l ں5VsLQzqb>>kު` hcNnL#]̩1F@118E!ڏIF_:]ĤlCD|EbllփHY @TЬxZF ?+:eZMSj H سxKhgWOid=ޓbߦUZSxV*;s=1}[>9ҜfIj`\(<]]^n{zQz8YQW(>fKyr.75EX>奱) t2>Q)&d2_6><&G0IݯN uhU!hfn3;0 㔦Ԧ<(- ~YۃYTڋhJ ǒ`F)v()0q)k14XN#.`"Le+<}҇w<ڷk 9,敥 .f ՚7dRS\e~l/^ j`$\f⣀sR]U- MKiڊO3TN˩*lM/.M09Uj7]~=Z nS ' '{ +ƪJ:>g:T{BM+ @/ωbSN>gQ|Kׂ/'ZPxsdd8EK°:+c7Ο<5M5u4kۙ,wq%_<]3pK@k{B&s`rRh2Q!r]%+eH|21X澻pn. +9~|s̘5}1 4J_t7orYCL].F|<+ZYb`8>332qwA:$%9Bt;"Ҝ C˼!M[r켓 ~+0V<-x+L4JoP<UL|UTDZ6=yeYEWk<:禃/,|-H%Zv};/VUtzoخYΑUm^ 4;7f?7e3zLX:5~6ƜTd\Ÿ4X3/ 4keƟÄ[Ecnt8=UaX@2cԄј^R!ڮɥ9Tt ~V`C7 Z esKB["GBy,}oϪm#?x=>wW.NcԚ!T\hTrs'BD*\Ԕ'"NmUVV^-S&Xb{D 6m.ݦI;gʡV)LXrc&ϣ&Ha,ѬM鹩յ/;^t j$wo)b0fBOQ$μ0%YX/}}F}޼76|6/HA\m5Huƛ:^ܑA8!YFs17L 00#Q3xyE9ljER~#ڗ@TR%a~)uEq @5)u^wl En ~-/ c^׾eAyR9䬔B* Sj$Mzs·Q~d~EWOծ0kSXOvPU&ݦOYy)<SVDj|- ]]h"<~ű`2CMeSҜ_Nd pKRZ m^rp^?[*)Qp{h_XmXhNjR&WU{28nLG32@whLČ LLf?P +C\~~߇⤅^UMzcyAc)ϧ3^kV ' Ļ8W[k!XS?1B,Y W֬zil3MFqnbʮ1N4qwOߧ4_P-\=#0cPH21 Zk}BPL.ӓIy;.jxM֩M,0u ~hj/^-^Xa?lfV6SMz^7G  )ZӚ>E r{>(˙5iSb%t7~NԜRw:LkF ^2X&`.s#/s$XxV9鿡Uj ]QvL0:Z{|,)=~ĀGtDukBIk˓ ~s#^_$u&MIQrܒw~~{>w8,B|JeW̰=O絘s,\W`" |'>_R[+zݣQe봤-ݗ ZKS4lRvN@$w:<f1Vp7*).+Bԑ%A,LhO()7ȞbJ QRQzW0cS9eRӾ% j]qҨ23va{ޔ#?sgށ!ܱ \0 M;ǿE4Ȓ.`w ޲zO < x }/Vcәw?_6/X Ҏ0rc2iL+Dc' l@ J$VNbpfK,3Sц,Eى#<0X\H1ԑ_ǼH v ףٶ~V *뿖IQxB~At ɋ}j9x=n2~׸RP&>U99FDrnFoM\A(SX2(ӹjg?z'{Χ+̻9kcQ4ۆ s2U[(nxCyF-:ww7Y9(-f?ffؔlZ˖_,ZUt]L"54{8@Hkz@#Iyŧ]>ስn'1`kV 栄iCԙ(y*ܜޔ [r1sWA<\_Tf:p|8uzu;&٪1Niϟ3ϛ^U=mRa:'&2YG[[U:3%iLyCt`N: $-V@@9& Mpu7)+oK{("{$GnioL^:REQ^n'&wi34dvI'RE *I\&Vm[xhlΚV4m\-Y\PEdz/7Q)'8-jtSw%ɝqC1_=t_u S,DyƍQg7q"Jg::> b7u$Ǻ.ZܦYQ|S_^Nan YbP$[ '~^49@^t>|iЛZ[eW/]\ qzz[_l*8#Ju"mUJԗ5چP.SGl8?zp bY7ɞq<Бɼω3㈡7L@pZoͫT2\^reS|ORYFc~5=9_4׾vJ#+SW` = ".eUЕ571Bg\pw^ο?==_ w$\-?|_Az[mfhJq头c8=5ְ9bcݪ+(r'c@vIj3<2ΊvQ_H|ZV܈kW;lXRԥ76;z!->VJk66]"'ކpnCUP..afqZMI\:*N2ի?}vGKA'?p|_M8W^έwSK%Rq-*$;信g2 Be "22b ΛEP/cb*Yl:ZŇYhZVC>($^En A=_O\;эD+u;Bo Tmd$ 6$*,HdJ$BaLL B%uj"4)=m ДLzDQ2 xJ<ɯ;KBT>jc CLG& HQQ&k컁0,K>7~K_飫z챫}Z;6NܘYƒ ?7"$.cCbdɦjbJb4FXZqj,Feb'X>b({VYF c;k`g Î͛-(ҝہntk o2}<)ii@4@ØR$`) U*}U@R4@(4Q{r7*'<H3ŀ6Vzqy_ח?6,nޱN7_/}.[He EYrv $~Ա9âMY-℈Rf2\`1*Z V`gjBM] 6[ϬSj2#]Uwq qnN?Bvu{\Cs^jJA¸MQ  x) ΀"S'%tH H4SSDS"o<ֿIUVKUnV/T`< Pv.<T+/+/տQwG+鶂`ޣJ_^\sG<3;|{Ż ]nB8L &1`tKq-~1:L2 0fXSg6TcLai 86Rk(9p>38)<*/o$3 rI$0% tp&xȤ⚨a J'H5i$Is@L)$Sq,|P )(b\|-z7-& 9LiJP=9?0vy{O q(;*0n«*2`(@Sdg_Wq|GIt>+ V#|;qsAS`~T&FJ 3u1Rԙ8~ypr 6.d1m BßK=Ip }JnCfuu}R>w nJk9TRR`H&#Ԝ`JnH&)m2 TxR!%2ч$TDu:ސ(S5I CIw/̯\~g;vqWDdВLEz3ٰy|}K?jNB*``JItC.'QzBpU,{b7z_zzkz˰ӗucmss}|`y|`<oa$$01d9'0CLMh..fO;惁x.y.YmZ\\1eRk;lry%NWnq /x7PYTPNvPm=hlvi`MM )圔`!JhrQMJDcH&J*x$$PE|HK$p!]lFM't*IUI XHaI`ng6S4+>†΅02'JVn{f璅ݎ dLwJ&f>8:\'A:b'H YHB!5q{K+[ʳxӒQIxir伬Nκ2`X];J_;r?m _{ yVgbb%efHeO!1 2R ’͝rx.ML )@rH+ʀ1!PK"T459c"B`ɑXI$q (ĄI֩Zzj{ $AŸ鐩eZvRDT"& V/)L7;: #cc)N3+%emLYD`e[\%Y,X7+R@ؔL0MO9yzݱs2{tۏnVz  l;"SS3Vzl$+ "FL(=A1DT]A5%e m㤀j"AF.^&઀TzBIF%UNBL`7UmR2dƀZvĩyqHmw3I)Cĉ}P PD]4cБJ+K+}Y 0`} F0ƴ 1&fFOӒg/>:pR&"gWKzuzI;^nELޡց 5oJbL/5<ؒ( n1 mIYh DjL2l@R. yάT@I I5OJCR'r qBK`2P4jfaAdPHNUG+˾ Rc]VuYinIL󂀞ܔD\P@\\D$JPW,  TUSxHULm",jM` LU!d۵#s_>/oztLnڼnIPj)Źy5|(<4CB1X-8kp5ji"[&)BjHMjKHhJX.ӛTӥ$Jz<uHF$VU$ ɢjFjq % " bT)&zWaA@zDUs4=/~PSX8I5A-Yײ.HE"B6AWOe]RĊH@ң'NZ"L 1115YO)n x0Ek6#0n"[&w:%n6\~Su[;:zt(ިS}ݤ V{>[lf¨E 2%fO`i:G9|K BDFU$r(.24:M\d2UjsRSl%5+n͢J][;4\6;H K82$ `(^"~)CMlRׁ7\>;: ;z|ӚϢ- Ҝ.py8bg2nSWX4^èH䔄.EOf'\T䀂9Ǯ<:.Bj1PkB "]I!).Aܣ.h4nK0ݑT,cJd魮J]!dAÀiSrCs9 9j~ LHufc ק8E\R)'sm9ʀgqhVeI..e|e|_³l;ףn65n=KWR3"81Ty :NRhԼ[#o 2R"HFؠ\D߳x*UJ:ēPjX˓I6&'&McX(9K4$RF oe4Moi4*LY606D)Ҝ% 'pqxQZL8$QFq&wpu*i䨥O^ny! !::d35ONTexl[˟!Eq렇#oPQҋ#/7 Dd D6G5<5b0R fB *%<%D@Ҵ 6SrP$%L.Ք`,&`ԑ@Xb7 x3 N+#XyRbЍŝlqlY*`ht}vvx= cU1zr qq+*6;`w"F-{B9L@m\˾9†"²"/,+p() ƭ"mH+/ܑ Ó@"fzN H/T.!Z,ƃ݆Z ^!%@쩈~C&i]YZ2P bMbc8p}x;r[SdƆT0bX!yH!vׁscn?vnuojPgIcaZvűC!aUJS.O!apGvt>2/:&Jzk hBK* -u6ͬFKJs)3p#ӖOȩ2 dRy#j(L,^a˖uHV&]  Pv9\nZ/:4&v7`h`WݗkȂxeOcv gMmޔtQˋBf؝B"qne`p^ZbI SJŭuXt,۔ ;B¸(ʕAQL(55AL[_PQihsШi.2 !քeޥf@3pz|-1揀8LYR0 Su6snQmlϢ8]q2Z˛]&#Ҕ~2;6TЁף&]7C腺qZ:5C☸dPxe_9Nc bSa"*uoO6]@Ei^Jԅ#S t dH-s6ӎq}PC i")ɺ O 2_3%4s@ѶO°2Q+:1nf&tT&\v}rqءyA:z|Avu76TDaJk\,ٱ<$R!yFGF\ĆN{zo)s.]V,ɆRӟOeBt1䘑i (LF򺚽 EX\Ed2C7-ˑF \ҖUJY[*=5.N&GB4s RPD]02]vݦ Nc|qez)ًGY\^>.wL% ujo_=(˓h4]ڨx.u"FO#7dZjI #qհ'ƋKk$P- ٌAHiD SqdB&sJNe(pl6t1B̕H(j/H="+@,YXNXAXhHV4bfND8.0\OeI :5ҩY!uǵz Qݺw|\s|{yOio; *8/G]O0ncqMkNm c8_I< l1S\)NKΦuUrm,σF+eye.T[vmGܿNǎz8?n1)-Kq7%mZ\D&muB޿Qp<{V8f;&Ey?1uO]dM&LIfc쿛hm9AeZwsiٶWoǵ0ENMiXGD-0e aXU Ԙ2 +X4^!Hv2{ȡ(0Hx'UTܮūӋM'\):]ErCPSus<[]x=رFBpsNmVp 4]@OJ@@X,Ʈ:/$l|,30]@ՀOMCib@ fu3Pә(nIL-Po&que)Jx,;OKnS~zI[CSX> Ϗbkj2v (:6Ie.NOOW˺V /M@#^7mMс ;~ g!ϽxK7 at\',9R&mUt d܆Q^6zPX3J SʳP p4:ALla5( 4GB1!a%N?) :+żR@[;ؠP)5'oF6lTi~l[fpHmgс > ][SNϥLd!,Mqq*`Im*#GZXAL& 0 btq23Z\_\EgW DR^ա=?lcG ZK]-" JO_+K?!JE Q˛YՉ) 5^Ҝ?q`ESj S,fF]N(uJUo1fl`;8?Ff}PsX)%ŏ({t^sc|[ރWdvЂ]i߬.N+m WJ9NJ?d<0תܴ3D}mj2Z,ɤҪE T\ZUoxpVq+e7̍歲ty;E* n\^,>+.}@9u|O@|zwNmB qY V\˛צ6w'EՔh] x,NP[<^hY]O\.OMV\X+ԉw9]~tPlIShuu/~G זu5ߟAWU_һ #ދ-aߟ?{ҫۧ ЫjU0啹0 &0\_mlm>UwRu_@m_ f{xycEOrc|j`ׁF7p 䐙첌XW'didUo;0߉ ;W0 'hnH.r%Ԉ+OV7ӗkNF`k3'X{`iėtfh%h낵ނ.V!X)jϐ{zz5Ze.^j`YCnyŹ,_4zt㋠PrϫnRpǨ󟿡WZ_4'^d.ή8S`޸R|UUS::~m3MqWsnE^_'ܔz]u`-S-Ӝ gMO>K Y`)'zAy.8! =7O%&L.ζ|6YokgiS Mw-aV՘7 {Zm 5*jhy3;,שyEʲU˃L@kAly϶KKWU]\0`,JY垥^ק{{QֽGg{R8rPhӞuWӝy 춭z lU֧7޹֐>{˚^m-X=_(7(~Zޱ;r28˺tmŷ_W`8}kJ !m@Wy \?m(}jaׁׁX٫Zxt K B[o@kJp\W? olV]Um*`{|?/-o_.RխӘ-8͏]YA®gx;OVcb൫{ؖW{ln+\fd=/Sok]kU (>uJuuP{}z{Inwr*_b?ި[>S{t{Ayr9_;;G_>$0dOEHn ::z|w[r/rʫ/ˍkWkS5=V>^{oG>7gy}׮*'u|/~u>XSuex[,U65:ztu}л>ǿvss w<|{X:=ׁm?x/N/7 ::z||0cٿǞ_×/yq^W㯾ν0)??6g>􎍿/5P?G< |ϯOyV;z|~",qc~p ŸvZm?n/pp?Gey=tсׁ9<'b!-Ƌc= g:/u??]}a=Ƒ?=7x}' Ixx_p_'sG523G^^GOO4_ :ztuu~A`E[^S(~Aցףg||)?CgyUPhѣG=zѣG=zѣG=:zѣG=zѣG=zѣG=:zѣG^=zсףG=z|ѣG]ѣGx=zѣG^=zсףG=ztѣGx=zѣG^=zсףG=:zѣG=zѣG=zѣG=:zѣG=zѣG=zѣG=:zѣG^=zсףG=ztѣGx=zѣG^=zсףG=ztѣGx=zѣG^=zѣG=:zѣG=zѣG=zѣG=:zѣG=zѣG=zѣGx=zѣG^=zсףG=ztѣGx=zѣG^=zсףG=ztѣGx=zѣG=zѣG=:zѣG=zѣG=zѣG=:zѣG=zѣG=ztѣGx=zѣG^=zсףG=ztѣGx=zѣG^=zсףG=ztѣG=zѣG=zѣG=:zѣGO,mЇǸIENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/splash_anim/splash_anim_16.png0000644000076500000000000020671712647526517024365 0ustar devwheel00000000000000PNG  IHDRj IDATxY$i{fd,E[eKUc 1,")l>@P89>`BwךWfDƾj߽|ߧGdRzCBusssw=v=\23L5TSM5gxz joj&jjOO%צ`VI11joj jjjoj&jj jjjoj&jj joj&jj jjjoj&jj jjjoj jjjoj&jj jjjoj&jj joj&jj jjj*L/TS}s 0˱񏦀*`4BAH5C7Ǥfmxc U3hFm8|M3Ûj_cs$H{Uۇ4I=G 2ks{c &j_Ϣ> ?ZQw_9d 6{ [c &j_?V7vD'%6%SO7G ?qkV1Mi \7M?w ˯$j6xSMYdyqq9?ޱj榌dIAfӯjSW=[&o>3@'V7z%cXښZ80,^)ۧc'Sd `)>68cobvM5g>2R@Ֆ'eekI:y_XÖ:4r뎛n<0b=dy'cN<ÙiNNyN6u-ñImcv]M>Y FWܞI%[ys1*+ê㟔U-Ɠ2WY>aM5TCg:*Tqdx|7vKS0U:XӪJU3>zJvMvM5կ_ 8$^\0Ң#'''Q.Ty{IvM5կ7[%P|90@Q )7כncyge?d=58 c}9*`"|X'UN`7TSMUh (ۊMzaI vl}[o4LD{cj$mUl].vM5կ7+MC0T]坐 ZCO [GK%)@s6F &j_o ApٗXÖXqjM^5jX_9bNÖ6 1VI7y'}L`7TSMW^^HyyW^ypL#@6lIA7ċQZ6Uϧe'ocq26lP#mA%S[&v# ilXrOvV&* D-@OWZxEϺEԕ.4Z<κMTVs%c>) `g6CjǛ.&^.K9'zM5L#2H n,v 醑c6 F6 LOn5~bd=.]N7Tju^fu 0?pkO6`hCcoy 6k aW^ .p!ۛ ՉI2T4gZW7m$+Ht;^=q)`)Y^D< ,ج3G.Oi(?3sjbZm3TS2؍Nm܊X\N)o>eWBV"V|*NlVu`;zP}5'4l{J`wgH+𩲼#nj16]ز}\t.7~|ro>npkUX C& f+ XckQXlX)l'u`9<٭'m T}M71vO;=;L`kn!C2Vodu SUޢkEL#`)LK75ʍ` $fL#A6M1Y'$\OX+nSC[vO\{uH F @ooY݈jP/)9/>.&jkOmCf'֧u'r.Tlm22[?+8sPp\R*pY5C{-ʓ V0;F,5p8۱n8+}SxSMI`ye\rsT2]5`y(xVEz}q3un{ZM1`uISUhN$bg֬ZNjV; |!piQ+`T,n4SSAr6-#ǭ Nt7k+mp75R^ MXNm\O tgb>W(q*TN03#L &j,jS`SI!6(jFX&Lay(64O$sNr$`wR: ^fg>F$nՠ?3L7TzP+ipV21V7XVzlSђi<n?g Y6Yi< qImV9m]O8,ni]J4yY]WM5gW6W*g{CWK<8ؕ 6'o\p<ύmLXUO6w"tLy1 y@8Yݒr(e@>X* G=`q7TS}1!, ҇ Y^،hC'ٗO'ٓw 6ySxNLt뛀*+l7 u3ժӲ5Eey x\<}gqc71֒$|H*)ccm3\`1e9@nɁaO4[՟VA6./vkz9iX]O9t71p,C{mzrgY? +Ag%e^!PY hlWoVq͒mr>%;}>Jl_D,GvH /~JV#?խ+YN^ lcln ցe!v-c,<덥7z*Lz,A8Bio8iVir.?1Pz@{Z7zmDD lp 檰 ~3=\!3i7TR˞fyLm JP\z^/hĹ9Ђcֹc=v'l nO;DWm}vDž=o+wml5;5wJ7ctC VXےq|s]tZh$lZߊY[ׁHeǁiqͳJ  "@^vxF9gZ׾,Y]~cs ~B]ңe&XTS}J2dle~&/ZϬ^>W6h'@ag ,'M x뜭ʡޓl5}iwde¤tJ@]i mYݙ%1TS}A 2rl8+p 0v*`+nQ8s`wp5/F |س,,[`/.;ms4a~^`c-ʰՕxt^y ۚc}Kh0+ X0+.eOZ} m@Lmd`7f%j$)=Vk2Zg% ;6<.>^ߺ\V`|gxSM v,edޒhE[ZKL./@,6,`p0d+§O<.A;.d@mh _ncm~|kBJOl1Pnۚ~E[ vrVG)0s2m`{1dD)c`'} M»'jOgK3RDr˰ , bV P1JSkbti6;6euwҚg8 kwnS( fbnۛq:˿I=` .%lۻ/fbxSM`}2jZCs|0s2qce{A\v, W }`wZ[}_@OU4i.P9~ZVWp pڎӕ`'ˌ ,5ƒnxSMi`w^jUlqE}hGX'|孲'(gyc|E 9fM`wR: ; ?3<;4KQaS,ž Ĵl%a2۪nu6&JYt.~f X Ϝgy}ho[%YxeVa˲ܥ#% NON0;͌np[+4|$]kw"jLJe~ *D)YIDᘰ=;guc1fۘ7ASNioo>o] 0ަ niЀ%&tM@TkNZ1J$UefL:VԶ2V 29Q@m{X@We6V0ZC9`\Hq=Ӡ@8TS}ZM,؆aBM L, Ƹ1yø! cW,G v S6er'e|C[oG=@4{t9": 啫@j7\eQ(ߐ-Dcu옮iib =65:dӰ9>w{_cZ< ܖM"7h:0gמiß x:_݊Ypt @iV&gbxSMify%dpc%+F+KVmFxЛo|tJ$wymp}v%oVn{o ^rVGI2$Vڗ40S)Z9՝=gm2!'So>17PlmcKNg܆8[ AۡEJfyC<a`啰5v| 6&Q^'QXr<q5P-I}uյknq2C׾czR<՛@Yݺ*VG|.ޣiaҤҜjѬ>& 3CW (r Sl!-맥ChbuJt`4q0?^ijN6p”VqNAc$r.W*)sX7AZp2as/op}yahca+tC?^ zڛOVv WVmW-r.EۓĜ!yKs6W58{[g٠4"{(avTn o>Wpg:ʰcu$$hzSlE*.ڐcPqz)nSn3DžnLҁ]VfZхiq,/ms&!J10M\i;T󻄫7AXV'0nXB2|DEu$c ,.ے(%3 Mwg ^2]Wd3l=>Ɛ!㶵Yt.. p&\0__N fr<6<:E<%P6pQ=ܣgZkQZ/].B8AZ}^GX] T&HS޿Ix[*uu۲c 'j_zm 3 etJWzYޛ7qU Χv NV񌏋e-u-Mvr`53Xi:ŀ7 :1+NȵmiJeaN^Rq ՠ;Xu|M>Vób%PIt=je/{ZzºgpªJ;ɾ]Lވn>?*mr423'PSP`uɂ K BuiFfuv CW^}ohyi߶O7T/d֭靏δ{nSƦ( ZڛmPC.,:innoR PiIqA{s v+b3&i'ZsG|%C vE^JЙC<^٘Kw9Z@$]NGI.0$($/|q%ٝ-1 ̸yZV77K2e|Bw7TS}x EKel,V)۔%C[%|сs(~ΐ ML܎>jDfb]_/^N}LmL n+)}@b~Y3Yi;Opݦ6*,Pr" @f 6ҞΌ@b͠eub:~/[Z,gy+r0MG aFLLm9걳$Jc" z+@o6؎T2荁a#ٛcF11(uc[V'xqD`4UMp..p>trSXbIm_U*Iέa K#^ CCE+3-e_gߙ zaԲH<]׭ˤ'"L7TɆ=y܆ǔgt LHwzoOS1򩷼~:19+ޡv_#gvcJMX+^e3 ׆sۉY+t k+V) b9m) Qbu b Aչcu @Wߏ8X]9s ֦&9hk7 GmKڕ WyN>4<`S7LH3Z1gm1f xkr%{~֭/ɭq } B`^r&()G6~%VG*Rmo;T=s@f$0 tw%pyhVxJ>O;M-ͩU;xrUq b\ =nB-/F8V׀]ɖVPJ)-3;Z z]Ӏt5FT BgHX[J J*rffy1]P\vs15]bW03caXS ꓁xP@̾9вUMyΨ><Ėe uټŒ}C0X5-2 Ϟ,g]䑏ǵ-ֱNҵ-yJk1Cx^&izbZ0':([Гd-?k2;bÖ^YZR i[e.rk=Xa hɍXzlm؊ ) LIJearˬm&W.es{T}` nGn[..J'*t1^/܉-z+|3!TUa1`0*^pE2uD+ۘ`gk`xBun:1t]hX2]ziFgG̡,k3hW~6PꤝYJRK8lp}륂@fy9f2hzPע4P-⯗IwO)kZG?ee0Ӧ?3,o^NcS6!nU|=a VWO/_vl)%[FyJ[g?Xv8N t%Jۢtko"e!D6Dt}56Pf`mJ 1bm WC\!Y6mB=?w;;Ʒ*yli>G˥hsm9+gs%e.Mm_o ~EIC;{:`/wtjR239*u{KyRVRi: aћmҖ[4Mj0y5TgE ( 5q5TF; MNض<ن~sxqqVE }^`uu.Y"-eզL.dWԺ4%gGq=lvf)d->A`؈-ǃe\47Z BRc*{ۖzs2wZ "m-3ht}k~сlvuM7g)ݾO<Uw Iϖm*ۯذ)m]r;LNZV_Kk0'p!}!LեlKt.;K2Rl ^}<^0Cr,+1[ L9",1 ޭnn3H/p9@^zpW޻o*B^fKsNF9^3E2P2Zѩer!-)+^na:SG(焖h@gB _Eu+:s1etЫcbv:kO7կ#НWS<Qv]O.^Ng:yB pQa n@zsrǽpExG<^SsZ܂q iWqѾbN'%3{vnN(-ujK!y|Q7jOgP U1Lq9߲Ug"M8Ou`W1;5Deն.؉R~DT{Z@G'QG |c3a3aJ9\Vq%.y2;:p =fV^Jz`GK>NY08ޢ/>^ETgf׵+iݶy\3.bzN Nq#mw:Qe#_G G ؜ZkgtB/4& |xSڀI$\zi4WFq“UWߕk8.Ax "f-M%`aF.[ p}Gp VTec `q]BP.c,y+~$.|l.*`Z l!K&xdQ3l5jZ8{oYnO:@a&eJncZ  WPMDw@gM)嬮 ukQiN,o>`Q&mȧ O6)m~Yߕt{fr@.3ε.]N7]3(0]cQ۩^憯@ؙ]L,,B@`n˪! W޻en;@9ӳ1cã탅bbmb60 yv6 Sf{3NqID]f;3,D 9f羌o63\S^M1􀮎z>`wVF[|lMV]13LS6dʇ:f]tus~hv6ԶQ@f%Bnf_43*--֦L7էNÞM铼Viix"|:PP(1}_I@Rb(C#2 P r1`r`io U fP> K fRTvfuGrpfX|$' {mi LnAȜTHJl>:Z3Xd\R62xX(Ez*v> tT QXYc :VTk:).keY9:a Db<xS}>?6ISPl:Ig U$z>ìX,i@dUE۲c篣bw@WV&]g[ ܯby6v۴ t1-U]vaF-j{†~,LZ pL1a󋨒R@]ėuIEuL̬&<˭JӶvUMSd? 1BLJJ*C5(\br st+M: $ӂql4@u}5[ki?*7 (*hfp a10˳:i-*֛]^lKx4-0vu//Vd /<*4|Lƒ{waD㼓0&J4#K+ϭË@׵+96;oP}'mtp7W$yř[{0#\m?/iZ(-5ꌮ3k4PmKf&&u*Li?6 b=Y@:?NEcKO f!@> ncYe$_V0>ml0S2…+"1%$ӪG;Ef3Bu,duP(2S Akd.^6v/ xZaF I+E%80K.>3m'iaNz:< ;ɛMwԝqMojwO=xhcV+4 R71sS03o{J]BjPn.zİTtrܼGw 9u6%o.b^Gc[HL+ȘO9A/>; Ԩg`gF"svg]nY˘ۖEk?Sbe۱:1 UfPkej/e&洲&JZn]trxg ͼm[:[,/xS}쎞? @[fjqٚ&aYܲ lHe{9zyӤ*KZsVEIVbΊ&D)sRiavhdU`cQy]ܺ&|4٘ݶrrbLKẌ(o\LJ G#b0C]l>8Ҙ"]uk{rRk6drV-T)elh1:GF/hcjFXqmerY3Y:9jTg @z@gp67|8TddI sS: =-;i;-UmU w4k  ,cڕP Y^@型`T v2hSJOC$0 y]H Z.vQCV^Oʵ`2 D]% X]m;ܮ6-ZA )YiӁ_?-Ons/sD8?GGFWͅ"BcoYfkA:1Xbt\ku( tTQ1]l#\,idbmlM7է)= 湯{-6c_ޱlflZE\:xNIZn9kWt-ʜR ~5Fo]F8䏍VV)9UI"i&Ppxmmq{,(m>ZZ M7'ݝF)=<-9f NYY2Uєfx~-$ I2+NPrİyYjegterJߒPz8 `v/cXQa)L vAJflUYEK``k?pP2 dL&6fVכGW`Za%Y:k3( biQcJ^?'~i+*-PQ@:k4*ESb0>HËFtѿ{cteq[$Z:-xIZsׁ&Qbuc-q]nkZve;hK5;m^ҊU# E+g9-JV-[}o9ܺ3@׵0919`25`o?1-K&5&[.D|nGt[.9ڻl0$TyihmnR"X畿*y%nx4&ps0%XwnF/bKv |,mgEՠ%pZUVQz.Q5xS}IY =؝>*;Lsحki-9B:.fZ.jtKl,@ȭjiWFw4t*@dvRr2YҐa@MZV}uԲ<+mIywԺ>S,sdS9%Fgv ܶ0E`/\ fq>Ln&b bM>w{)Y^uvqK\ RӛcPtI)FCg \]?e~gH7Vi4E *ZqTlO39jbFFE.FQ;|x F&)HeI21+ =[T[A$ZSOj/(Oem18[a$n7kx]Jh!O6Q@#0FrjUTx@bWm-BR6\^V܎(>tΎBW–.~G/f6~:֤,̘,أz=x<łeg`:bZu޻RYIiybVVbP?TӌI*}grZQڗVu׺L:AW T@Kcexd (1堜 .Y?TݦfM-Kا7ր83LtR2~;Ý'/ˠ8)2uG(/.b.;50*-m _4KQai=i ʩ5wFrم[͚"i81AbhdC~}>5F _?Wˮ4]wFϮ?8C/XimlQ+,P$m3Quc'Hq'hms‹ [4Ay`4%34.rm2ObwSZp? op?o"֋XTѿW[9^ե>`d~Y l+y23iN4UJvwVJ!˃`PX;Zqy\ qs5jƀqe5զ3<6aRJk ؿϳa(Ca`GaKL(4 M9ʼk28Wm o= lPlSl050aA:la|imLT6W$F-`0#͔[fn&`@ Tˌ(BzRm `ᖡ`voYV/6fOxhZk; Ҕf UB&D`d3HLO:>@@j)R]/KJJF-+.Qf-+w\\?u QTbP[hML )b8Mq+j纸(4" I老,,vRST†P]dk nMI`}_C[ &O FXb1klֲ;ʋWۛXu[h3"ª~[2]oeU5pK3)t6rp3&LP`T%ei@/LoUIJKp{!Z`01D$v2XZ1Vv-֋m.fzq&gs@vB/׮AR3AFb#V73բᗳ> M'䔚R ۼv. 78g{w;@*ReO@Ecclbt90QNJ([µ.saq|bXAxD6&mg>38{$SZP2TO4T ~٢Y@n}\ yL5f} \?"JM=Py^2꿯-W \tRϠq5mRcr pY%"P2TF4Ylƅ_Tu6YC"HE1gjMcX\ovCVd:rST ȶ6o~zvo+BqN΄#fw_?WPX9w?N))2 h37wڄkFl1h>/63˭,6ojQe6f2$p tΞ0T ş=n`7[J2nu]kfZ%66+?cభ Z)~ fҊ>F^A,Щ.;%64rgntv2i~YnYqn"h3 YҖ1}k hfB8KJ Qb`D)X<W4vvL9\|_fsfpbtD޼1@-p#$D1,gv⍿_,.B!y6"Z.WO^q8x&/5Pfbmn0qF]~egܾpGn54ZY4,@*Ԙ'$AJd QUEk.\eJ#"%ijGFoH[<9Zfi ϣ*7^ZbQۺl%Efh1,O/vjkN~m^u 'bOe{g[Pknv[iBܣ}[Օs=@hYvQ )ZY_bnIb2FAmp_6IM-0&D%3#26f"b*32I$ǼQdrPMӤ&G($81S4Tf!@dB ~?\.sXWf] ,֔ Csׯ5#qa # ̈وs^߾fCJGjS68+ F'8x[=X@KS9]Þ=)E9jE$5ϟ٭:3s<=2yHcۺd0J9^LӦ>.ږ%m l N՜oS.ﭟ镳\.eq-w]-g}%Le+[@S [*ւ9Ƕ $-4%7Sa#hEX {=ahި "?GɌH\ "@И0!(`NF*NBh|HZdLBdTGXbDx?D~s.n`))Łk?ek3;,L)̻]x{o^v[8 20P&Vsn]:㻦;Q͙Z3G ~:͙ ױ Wmryq{OT +Sђ9gey\Djaڶ<&gnOKa3WHuRi;lIh_d)I/  m?T>={ۯtٮ9[sRnoT][S2ؑo//fs!3toc`{2Sd~*-J),_2,N1" sᛄFdԗ8%ICdin/Y+D;fH[ D( LfbIWl `Ă%&Ҵ[#U(2\J"$&d!f;_?3 ;I>vVMZz,Y2/|o(%bb-Yr,[ʰgER/hͥ߼ueFF+UcVzYB(h/-'9Ӽ|~W9c-*VUi?b{˷Yf 2}y>N*MX2/!N1Nl9tx޻<pGܝo_%~h~ԁ_Us Y2nٲ//3Rܲ;p5FKSK &IylT͜b`E vftw`ܭej-M+&Zh)bx t05" ؾ]o8k%8 Ylf$bDZ fA lb&f |@q 3an\&< )3$#\@8DWgRABuQX ^(Zϗrz9ȴ~>z? HJ"V~Flѥζ.D,9J-s;BzbwQ߆`hy6K߸?4Lia3SjT(/bmTVCYi>:zWszaEԈhZUXyIba=0A}^f0$YkG0 6Cl:p:2OBlΊ4 );C)ڭ1J F,٢LbS}Ro:߽ؕ^n=ׁ^93mJS(ԳTPԙEJRZ/3Sgt+L7THH { e} ?va W"4ʰ&M*޴t`QH쑱u㸑&4 F `T)$`͌#S2"pNtہ̛͘`$Җb,LH$HG$75gM\_d+ervݣ׾1$FbLA?|{CSMm9pFRS`TU|?zVck<-tFfMԁ[k`FZhC=Fc֜G" h"938YR`澄vJҮ5h{B4`M~>F-JvG[ t`{vxS?K,p~w1o.wςw:ky^)dɗrf ER”؁]ե%5$>QHܵ1yQADkǐShdepXLڶNa*FBI'0x棏BTL-^NADy4 @!KH@l 5l$}@I*c/n56)8m&,֥&,,Q`osۯB#0[~]ki{?>x;ު6f3"=uƮC2}3? 4F$Pi}rn"VEN2+D#UWoHb5JUAm1P׎c󥬁1H>wTJr\hbSvqJJu#/%f6'>ڜHhr!8Y%vGD`pH}6ؽ.T# Hn]={@wǞ˷mtf>Ffvgz, C vfn޶4?PnfbyngƩQYԅ)yUFvA3Htb5) )8`f-V@Gv3:d7AM L<4Nr 82b3rFXaJd  XgKU* `#JE)b ,QA0!FogE_?ʿ ~~)pw{KsO_̘dDjy0p`ƂZ,|_~{g9w5R2Z:FI8i_p답[m3 5LY\kX?»Sݶh)B&rciTVe-&ehz{:qŘhۚl=uZ_] J¹MP<q:} @[Uڢ@7Tݟj{sz*A[,ospfw E;s1wZũ\b06 !6_ՙ@T@M|ӁMMCh3QgTO 1dGJkdƬI@c5MhI-Υ_fE; R$e( #Ҡ e6V1H9Q@4h9Ĵ\AP. 5Y0&62"vA I392{&$ zAT=e&WS1*}(0MIR% ^xp~C fRfq%ڵ&ٸpbVR&xy7^"h& ̘XQ:oczJT{zY Uƨ5R40*Kfj#VN5B9.R{Yv0@n04o^ P = zthYx|*7Tbvm7_h՚@ zn=3AQ&A̅ה/j , lkqc5}a)ua;ܦ`[ZR "3HT S1˖vƗj%RNS7!R 1AuwlFs KP Օ^Dd x# XBLlsV~;"HFdޜ42b! cX|TsW{_焰SRF$|50HLN Q{_yBwԚt lkenk=v)mdЍs\\R#X!MyTMԷT{.Yg瞹;ڌANjhܞ j OKQR=ުL+"hbtյQig?rfhaORtMj+Oɒv~]i͌XId#M|rh$RFdR?3T{C%  f@DfBH\g/Z6dL لlb1Š,+oo|ìL"A)FŎɿ9r}" Ř٘8oE,]sYD6S *`|([haA0xeݛoӟc @jQ\y!ȅ 7ʺm6cg/=y|ѩ",F%Q&Hj3<TTuO߈k)o> N@"#]lRϔ{YNj `f4ÛWw>|*4ࣹ33쪺U_.W4Tg0"(|3 IR 4JgCP !EG5F (4a"\j`Ǒ8p(vVgٺNBSL;R~b&l~bѼNS*a>S+8Fٜ@Jm47[AMIAUQT)N@O45ffU"@9"bMDđPQ]E8ēAĈ|D 7o|i~W}ń8ۿ{{Ī `b%Xls_*ۗ*_4+((@L 蝛ou⡑" A8Sm3SeAfu`E؀4*TU޵G@Tjj 1L+[ RJ%f٠Mg.%K&K/qw*g}m6i﷽6@d,m6l H)ܰIO |Mu"+bw%|QsAx6l᳽-P lAntl] sh,\O̓]q)yYG Vj@E1De|9&c%#kX6"JoDdrxLamC"s=>Q\s un~j $)\w Ji`% & 佣VaĤ%\X*"[o_y?}6P+T9:ÿq 0Mދ8+.)s4[juBI.?zß=3`I^97: BufPtGg"DX54gBTFjeRje֘U#$pTno:cZE%9Ё jۢd45!IPw Gjt{,zi-v$ZWAW/]@ub vMm-V: ץ q*X%(4R (LfBm, .Z%D8lOH(E3d0B.7El;@b>SX6'’}.?rWWRf&Y>3ɛ0wyNEA`4H#`djZT@J$p`$Bd#fe0L|ϘlMs͗dfWwZe n̮7/ߺ31;g[%VMYp&`ǭ<RBo܇'v_k P&)/cdTkBQA4ALεQp`EFETSkLIVEEL--M5&UP4&U%U&imqK[ 8*LrmjiyZÃŮ]XIxRX|=moSݪy^; IZh d>TB1-Q@1XqAE'H*i`vϤfa0ؔ&癃̳|f%HjL7';#̆raEO(HR g&,*M+C%wE1DDO2Q,V)qAk4dİsc@a `m SI G$)I\Dl"DlbXHZばDrRo~r>6<g#Y *}o_nHC%%:kc# cwBO/Br ^}QّD^9Sc5@MQѨbVH[?¥h Uрآi6yr$Fh AT6U5Yjj aOvKJQ&ɀ:eb k'ÙQ7bnPࡒQZU'RmN7 <{|tf?[Gv'f5p*l[>tmR)!͓ " @DđȈ*f 0cFe! f ]|}X]eZe$P&42!123DvL?1c7lat܍z|h @ҤM~͇gK=5 E"$`n(NH{([ QRg%&7zmvϽ=f@ f"E wpJF"5w h yo{oU!$hb#")1A\ǐѳb4VUϳTR}ʊ`Q ̪jVJ eH QMsU%o@b4d 8dj`U;}xXH MdMDbo6l]Ve ] dǁSM7cdwρf|=+-΂ Б[κꙇ?W6~ xV<-*j@Mi&h G B UXԈ4KP 7*+F,D}"E "%0p2 ZE}ΛYbY}-\rc /-m2@?{y]Svu`ѭ Jd03l H$@$0Ą+3 Lf0 0Ȉ#N$Ƒof̬1SgghJjBU"5s[AihTp,_7%5"@p3Uc.  Y<>u"* %]{\nWK$kIbLNa|DZS&n]Or qPb=9%+1ȭX\|RW5N,/",GXL!,.$F(0W&PvSOtTP0qd ɑ(RZ-Q|{UP.@biXNח@h{rq{l\ _[_s߅c"j *Dn.'F0"H` gZ YMA ! >r3aϨ{9L*MI@y *pFELԘ #2"8(9mSr`Lß)^|S%V^/)6>*gz&1^ׁ;v_fcT?i=<)TEz>24HPf;"`"XapDE"]쫂^ywhg*ԗ6h?#9'IjaZ޽w߽[uR2&&ItR2>gQ+Dn'Q+Ğb*ܲK7&/9A[(oi,+.AFLMJL1s2b?6jjimTY}Η/2=#[!p$|rJhܚ @/t'&xm6m-cyMu,+._3yg9~:+=;U-|Z,"fuZZ9Ƴ4I\2< 0iH jlxfުd%UHIDM23șwj{{G}zB ckarRYa(Zy'os&Fȁ^ۊ?6F * MX!FJBD0҂`f{ ;b$2{oG[v-֝(U{`P`;;igq ٝ]9! bkk[shR̗)2EV;-ܤl Үe U3RE,4VQ[V`R_*n[ =YEB!2D1<]͘S &61%y*/P)=tJe1Ky?qѡh[fF׶6D_;K r%t{?ޕ3!@ /op݈9 xuB}o?vk[Q'E`JQ{ߺfVozvkw;^Ku@,R! Գ?x;o⭟ε6[@1:EF1iVg޾V18Ӵ&zQʵ4oe .ͼU ,, pߗ`}C#Y>sת37:ݬQVΪrzdtDֶ*Й%x%0MX:0۴y $ejiNurpY]^.zSb&R4֝c3gJ:-{4B",h@I҈fQal 1KIB9T%7݈?]m[ÔH} -l0^{:rU$ )r3]X^F $Xd  a¾b%4:Ӫ~N ̶om-Gij;߽GT58򨡼 ^?{'g1[R*[$|>[GƙT}DJ=43Is9jDIK!tq.Lҭ 1@ /ޙe-7hIpFY%C+w5e/cYblن코#8Vwv&N6i=TOݍ2K[QJwyFXbjLfM7+) fDQU`M TV D L&Ycp1%I-v7@ csa8+Yw*Z2(tepd@07=F8B܌X`DDL)aL}҅7^(N=6a{oC-*oDC7}?}"X1+H,Q}fU_v; 4nF41cƂ5Fs/]Ǚ/>2o1]F*%E3gc u yZ^45PdJ0H ުFjD~Xy;pt~ajёgpu\9zjfg-8UtLbF+rҲU<ڜo*lLbuag<|f7?E]^]Հ2-(ni 803eP7&(K Uab F,Fbŭ ATcqB w 21Fo-畭L>V^~\2('R_߉ ;F#  h]cvgv%KÀ [Y=(-~A~ݼ![2os&,@ܫϿYBO2,K0 [_?D>dQ ]3w }e7W Mwc`,؊w+|VZ696P;{A@ _ƈhDE_˯}0{[ |'V窎jIOծ UyD~`i낁K,Ug~1ƽwM]IA,1(`!De*Q"L1b_3[N)4!=UocA&.0os#ՅY YT3X2 ~l(}QcLJT[Ѓ"&P !ݗx b %q(D|UK_3sZʊV1,Yc |Rs(~D`D,RB, &r_}n2ʈNxo>>.G=?Y ov}&ݺAN ͋_y{QA.Oi6}(羰 9-1c<[~[I-d-H}o'H1ܫ~U}owz IFY5m%7IMv&1, uX[&r8øM~<`uM7*X:rPm(n3UmQ41!D#egx :21)Z1{i0Fĸa߬1ӂ"eVH1!o2101b2d6SP_$$+Lb.@D;G֧9OxDx{K =p~1˗.;E| )RW};?TcWѭ_=,:'گ|7 X]t1.:{^y[/ᝃcGbyG h`*̓}w7q:`cLѬ'|Uk8sZKVNWwyu/oµwZ%CqneՎXutšK#j9šSKXfVU×glfAEf`=0i.]8鱫dž!FQU0-d$FUZ揾qP\&g׮zgOY5œT!a1&a2a%\."IrWU>ɢdn'ݬԙIaɐK9(:)B4N&`R9 vŵ+)@0%,߸tc:)))}x9;|_\=0+>$D-xXq^/}3߹t.Ec%BYV=/yWu(/#خp!n |qZ\d_ɋ=rݱ]ٕkR6 '{"{6$>8ӐCx nHY[w^.-AI*W g8>ww 11Y7vTGF@khS(\^äA@D(&5є ZR$OLHTqU#y^nz[P1P4iߛ4Ӗ.M_Kd Dy/]GQ6@D|p8t@yOqh^7_?~i 󍫔yp'_ŋpp] 5ZJ+O|>ŵ}x9jh{<^s)R '5\?եWk=4w%dbe Ų HajEn9MD 2;|B¡hW !&pmTK"5AHUӨȄP9MbF"5k>$tšwmAo{ΊK=v26K[Ÿfi,k餚SgW&/]R^v?㦃Tznw_XScI'ÿ_?a r5>LO.oK/6U. tW{ԗtϚg 2$rpi•wq #܇BR#?˔h0ƺwQ9鑗sr"5w1+q0%^b)3Wk8gۥ0~@w^~\6.ݪBoԔ")=Z@غ1CC?䤪$T [iUBWJS$ILD)ꈹWI]Y@ZœD<9+6=8f!II<ߤ/oM'9ݟC~LiX]{|_|ptiQ7~w_:I^^z `5X{/}o_ym(1 ^S/})% iȲ&Aئn6_} ,x^~d|z '=y!]ɱҳI8pusQ-!G7BȲ B-y9f"@i/(Hmc=!.Zuyт_?׭hi'7c—0';Oá'./yN H뚿팺ZtE@ )!QqwĐiԸzS!T+ܩ%QDEDW>E:9t^y9fiULǧcC 1l-a:~N!Yrw~}wnpOՕo|յ:R#)bLkWܟ>wnʘY]^oJӥ:Pq> Q} !zJ[\d} \}g_\ʕVAGeY $w5S_7 )вii5 $GG7&E)ya.š6A EBn#o6箺-W (< ȳW^|^ܱv]4;Y "`ˑSP4:`e_:>z{yar{+39zػQiTIWy.š3%+u^l2q>'s^-@e8g4*审ˏaroWܡXX9cW\:%xFsHZz.11.Ց2* T01fr@]myIT UW Q@$yJR ^yl3CpK'BiHfaTYy?|!8`7ڏ'x+n}ޓ2ƂpQ-9:J{?>G^tEH@LaϿkn<Գ9VM jPCBY-ǎOܵH(#yZLX=ST%fqe*A`;CYQ@R)LXtscz"] f":/v] v8'gwZ(<'K6vDZT^ө,1+䦷k+s|#d)AxMTHII2*1.̒jr*1RU) G+ ҝKN"fFII d.ONɷM[t[/ѯ7kWHs('7)L?_2WwW޽oG7AgOQU夵 __K}!tdv"g]w^z/_֏N=h[u%Ja rsx\Y.;(W$BA9STtj,%Q;TIM)։$$&.* uAQq, E3.dK'[@7]#[ͧK:~4`Ku@:r~>_K5o֫{_G^W~Q?]}cW}:)n5W~W> >-dLP7ѡRar{潗q C=]µtfO39=Bjk$#SL@-+_`(ZN`#H{48 2E܆k+:.2a.Z|r6< j^:5=`S@pѝ{).(M޷/-.dJUtjI\J* FUB%E&TDq~\%K"D xZan gØ2R99rxխaڟeCz_Ը'`^}?E/kz컿,˷xSp\ysѧuB*wx_go?YTmW_%sC]bz?xw) wtX+i}rBeJ̼XX"3fc ՙws+{Gt\ܮSP."SQvqsrb sgPݴ@Ry#Wwm?E]Gڳҋp.,Od:.bu|G_{-랙*AB" &!]T@V(j~mg6 VpK'7"{N XtWoK㛡x;UgWe/c[>3 =G}Tpt3R—^~=_u^VʜQH%YHS 1+Cg2su䌘R{zOf^GA, =  E>wut"` USe;m"\z q?qcݜ!i^^p'Z9m7LM66)$e 2QIH]\5 "+$@$%WqARBLptPuj‚ /G%!KWa =6 x/KQ1Ӭ$du6M{ʷcp X={Gt)o^>p|'7~)/[~_x/q=@O_]ڗ?DCDum\Q'Br[W{Wէ_˯e!yV5@)F(93'颶fBޣMqL]Č=Sϯ LH w=z=RO~>J“j l/;-dy?`; t~rp:r'Õ4W&5}EC8r@Ɛf 8޷dY6wV!L &q%$Z **1Q*`̥t*%V)DD>9~g@5z:p}5yssSN^Z{/#yrLR'>x!{#{v[Oy\to|I?zi#^b1x W|{_М{rOgGdЙ U w$˪NVdž)' `olN )^FގXq)In@oYa)=X-U,\܃n;|;ߞ;z)NŹ=`i'U-A{`wT“q$U, b*TXWIx/bTJMRIQH ]tBZԅ~gg8#_;֚7y57+_X-wݒÖ pk@Җ?a -pk}, p|nux*8<7,~rQⰧf}2 ׻o0w!$l$7c=8]*F^6}=[34C"A,b:/DVyaBR=[2K}.w=[,p{Jk[p w|[–A;,/?ָF&NY/R[H̦wUGLR8_@tNea%. .JJ6 tH*F }0o[8NszŎ,o߾=os㩺奦=?E _^)~}^Gyn10SfQg<txҠNk xe.bap{=4gIT{4A N,Hj'uHppww.\.\Q%ih&ۖ{; c%?nx>saw$7w}j t1e:Ký,?.0x,:xR}рhrI>ԧ~?[qucàH)Q d,ıSiAoew~8m@gSz)o xSpw#B AY]<3A 7A81h|蕊 xMٝ[2wrwãMn+VY/E0+S@JT7'2, BIL+B9D$@\)"KGՐ674;< ޙwڗ{%~. sF.#n?qppA,'FOB )U=Xb HGKDrB]) 2*\z/I4na#)؝ i |akHs[NΎm՛xlW|,K [ >H`fz}x>xX==g6+93ů}ׯ;AcrLf:sZ&GՙrC[k2d(=x!tW1CLYɖ] B p2k@zc]8Y@%t9_*L2G(Zq߸OL:<\3AChFYNn@ܡu`=bj0)ܫI#읩rNJ-yN) Z/ 袱;K,@ΆH,No <{|\Jwv6z5,i`shN~K9`DmY;+`}8zֱ-W~X#@/~+4cՙOGlKiw>S=8-w椓bN8XG sɳut49I3UWgIE[gi!MtHd(h߆ Xr%\G8x11>1Uqǟ? ^5]j 9ryHCs9HZ,Dt')8>)uJ b)$>c7`_bcnm!3^]3XL\}ඵgR`l?\#^n0ͷ:BꊋsmN\™%ϗTpq/?7dTG]vxXH_*5\Iτ œPw b4@wQϽZυ#Q &\ԡP,{kgCRAdqu+:===8Y(S&*:h[orPE sX/TI85. 1m=PkKKNM!N\:R[ J1e>r.>]1g7l@dnēOu÷͢% h98-s20wdqcj)9Mr)&yVDw?➹I!t[娺T3x+Jr,BY&,^\d5/:w+ 3v;+Lxu7U:x.5}l2jt\dLEJ>o }Z*IB $~8Z~MAR1X Dr}m(f5b쵛-1 qno=Ch ]֥ ɼ."`XX U}!4x縜A !-<m!̳ruhӯCpy xM٣AN:=YHb;bPIT8,/F~9Ub1!38ħ*Pe?ԶVm>^_Ǹ57r!܇!&_lFaʟ%c.I%Hԭ幀'Pҕk ߫' rzﲋL-z s.grΖXS@sW[vŐ''jco|R nq8]no6y׫v"cf\׶hכ5\ڀCuw`_^; r! u6fQ骱*I*Lˀ͆2On[f~7p_b9.=zgM?e,\w6Bi2軳ϡwρ[^ֽem5bqYb>peAϮ]eAܩfbzur.9r/l- qit!D$Ir1sy7^4Ǔ:L™'^k8_o_0s*Ԗ@R\P=iMW%677-`;&n.?g4ƣ؞D+ca_J& i4Ogz} YBGsf8 ¥ˎ,dXEo(~A^AP^xoȩ0Gd-KY$4@9FT`"sTä|6VownEX^Ҁ05BdpC|.%'!N1K3=T<\@G1$seJ2$'$Xy oVT];78-!"O6v^ P\WAqNL|)bRiwU^֏ӵc."?S.CzWB,n; 2Óx`\oc4^}xAMUy >kQ(.cõ. JZ)[V'aΒu9-cU^hGT,y.L|`)7~VVr$UWow VW#- ecVKpٟ<oYSL.M=wX&"(LJr NVfUy1)aXw+}# $WAÜif9DՅDx22S#tqǜHh-ᤉXsnuJa8ynkjk)ưfNLIW0\^u'x0fh+ryS^`3/y< ͒R,zߌvA.}T>鱛o Ttp6W ঳,Mt$F%Ҡ&|uҩmwR,.#{tC#FM/455544lUǗO֜?B/=Z@s 8|'ߦ@%l/\I8ݽ [IMt^,>駛 XUfם% U)B&s % :Du% 2 )g^R0FďdSS^O'Y - xu(Ns&s5ATy :v09D-m՗8<=9x..Bmdc~2-%nc ACNnآY7:m5ۊ: ܥ+qd9 Vz$:_iwgeouM xMۗwO-Ndl kʖلCR5k"'H:t@9(cE={ +e>^]S^{[ Vj&tm.t\ d5u@W:>c|ǷK3$ܹN^3^ i8konkܴU&yY1qa&Nnq6B B};I#:z9j:Îg ?t]O MaKfâ\1;"ʤN! (ʞF  1.o_d^' lt•=p5g7 7u~4xs'""<qxrQS:($k}tYy?^tQ6&,M|H<p`{-9 uqx1i0qKPY޴}|>ܦy!4M ֐*cޫTzl#ݻsZdh)3P)CLbF9֓bھ01scwpFS^/(v,6Ý^D̼= pcA-H0?xyu~Gg/gO?or-PO>GΛdw7͞:.>|K6-\ٖӛ:{wgӜl Le >ON|:OtMÝzˇ}3t3[BpCy(synv͝6Wl,Ӧr6Ls0qW,{,6O:>L06Qb)~cȲ9Ɲ{t O7aqR#R1qb OƔU=% Mӽ =O?™Vg?$Onk 6`XÄwM,'U-{ФM$v6cGW WX9|^& ]-1G" zK!ð(cP4jK( O+V`ܒ% Ԁt&N2+̊YY.ϻ(t܁i-,0 G ɠPq9poWz6 Ά]=~`֖0Ɯ8›XM͝^ y~6pġMV-NbC>o;I.bw@b Y0wb %Q<;6w4/AӮ; ׋yf)r@(Ye xdvQ}m3A}yͭ52[ѣG>r ַ~.0|2f2O++1Ynn:!e::lc 8ن0ä r;uRҠH<\ZZ{퇟pF( '3~f~av’ǎH4O76wvaN w{), I72a~Mmz@A jΫrWoXo~ۇ1s_Qi9YaܜiW3Μ}t FKqv\pcAu#X ,6w? n xMp :,Csv`e =w%IԈKsR\\Ju#ixҊ zc|8nϊ7\MwzkNOo w6C~n;p˹/?P⑯i:9 8&HNo'KOsv/μߟ_>YXsxxox eʒ/t/̀~ĩ^GWk|pݓ1&Zalj0ܞi(ݮ`\Ix3wq߄mqvn}0EwFK07ʵRs[-s2՝C|EDUX+y7dICHVb!uS] KڜS/J6lϹTE IZ F e) ^$;0&㆝ c6B>nc>9ϱ 1 v㿘+fpOLi3Ur67n֘bT7uhLV).jiSއ4H65*z8qy^aXX V&M/xe"F^ȴ4ҝ޿vML]_0e.wy$ٗP>y5>5ΜoΙolZ2]:^ gbV|3\:ua2 &nxz0J%.:Qe(^WGgSȭ%(D _ACAC9Q`G7g21PX p^½.}?7BB1O^z#_7gn6y1w?2}i{||Colt|CN`Z~z7Q;aRvDB"4uz'4gN~’-Ԁ״bL*.K8lG0rf2Uh*QU! V@:hb [7p6)'}v> kN Xj fyN+!iCȳ/-wWF(nh2BlVer^Yg[Nz@IfFOe|4V5Sa+- j1icŦ8 -#myel?޶0E&|_n="42syREjf*2YQL*@7XF[cUa{kxyO'0hȸ=n~c6&i+󥯜&0[ lB7JN,{ MKt{r ) 4LA5X:.w76sܥ6o4OVypN YbPֱY~Ņ˵G-S7χdu><ި╓p|׻~Ϳp%ttC6NEMBD}37=6-X!@]7ɃÔNP1"j-1>'ϪnHN;ԪurW7Xض?je&N?Y?_0b9{HO5v<<Sb'Өj6(8(;ΠCKq)DH9 "& B!'n+o;d`i.b28ibj> ]'_~E1Bl8IΊZ+x0l>q֟Gp-~[rSseB3 $>CN1F, Ъ˚nEc7^yν6i8Zi'0p5'6]csZgҜ9\bS A1@ p7Q$q8JxG_+dX#>\ efe:`C,;?z[߽z$߾ѿїڣé6"lB<7\BdwnF& (.qWqBDi"0ATp&NR^4Y"/}E>sUe8Rk GR]7|aaG~7_0;[v_ß|Z~s_S7wtaIͭ9J͍p&H7-S#zX1DTCijBq),zub1Q1(G@/gO;>e'DB7+um ^G>EFw'0u9u(:SGj@i$ U:*U@RA(Qx{/<v(*|mqO!AH_B*Sy|z_ vwvޥ;N` p%d%\t[Ю̋pl{3 ṓn qeCuduS85‘5Z:e&sELHk %e hDs0}7t~%J<5ێpH\]V~怇-3ni;f;+aLRuwS w֌Kr^^(𶹸]w^XJCzKTRI{t&ԤKL. UQuQKB$ Ȯ;S+'Ջ8?e&"fn7uk]-nʝ~]}u$ \\ArrP'NO<^3OSO/GS{Y6 w@v7-7>X&4g`w3K@'%##&ܨ.&D,ͻq ifdxEz5KgҧwY- ckMww%9 kkkyp2C+@E[2qj@#G3!44H'GbɤsKaI!˴ r~owWa"nsԀtA\($>4O^D8)Bp(HN'E"=/<#FINBSrDhtq&pPJ,IH!"aRBBPSA*O@C8v~GH"F{`|4/㷍.(БJ+T Å"p1:D "$B;qW%e϶01j"ngv`^'ÜLp|hJSpw dM xMr{šC1 up 5 !zKB[@RZE2t 3P~0e'BY0IKD&$.qeP8D%Q0EäF.,e`'p X #U38 0f;=&Ihu+D'$E b"蒌Pti@s+K\=eSq(+ FAvY; ːqMJ|\ 5 esvq~ xM0 6Ϛ9?q8-Yrv\RB}J\21X X&M t4O@1SԑJ. F$L@D FX)9rπAv:IjpH5:njm (0LgAi]m&'Θ{IӓL")MܬD IV{+CSG'<¾]Ú3[>`sxVA5p 8>JX.wE$A1Us@ģN)M1c3TOagZKW &BW6GU':;*@BDq XRwue CЅpxu%MawA@9Y@HR.%ҍ!x-xϦ#ϫ1/pkjjk9ovurllk9sp9g<9/o}1 =AO%U*@EXpu ((<4M0ZU%Zo0` J][p"X#&)QgTg1e8C k$!.:^NXQV L% Zwcv'p b󒋉gTqd4;4SLёKlB;uZA區vC BݼZ4oJ55}]Ya]\iS[po4 k_[p",&Qљ2`Ǝ6g5 0SCp8jAE¹rRm5i`ҀhD`@=+ r f* ..r9lz1u-m;!}rXrK3t,z1wv!g|,.`.k`wVA.\^5JFfatj &Y5.k{*b% BDFU$r(.4:9Tc[iprq-+yzn)硗)-&t zx|a N-MwG)!M5)5Wi gA :|. d$;]f*)zE,  h@ucOj 9FE;D8S2%r, F& ~J+ :98X(f?#׃1[2(cB8!>aHr=y]p6Wʇ&, <!,99jHJ3cjY^$J/OR ]ԽLW9DN!Jw}}%gnLgw5k\wv|ҪCEiJQ=lEQ3O )5c"R.WH-<]=i`.\DےN/`d@0Rq $>%VAK_n YJKBZ”HS,Tp+5f/PT,7bٵGwRL(h)N1*/KhSrF`&Ed+Y|vMX Sv ]9vՓ/$GA/\!EX=A*6b H.`=pe;c۸}s uAeE^P0 SKUE,Kh`"1b>HD'(@m #Ֆeh2DGve d"#^x|-µ1c{zi7Ű2.q!qbi#{ĕ,}X)VY-T wwP N׃_s3ϺXנƬE-XƊ`UJSVFXй#.ڕ>2uRE݈C\Fe$!/ 3*4$L ܔ`. \0r*0nQ615J,_ju{ֺ>n["!TlFj(HLl ;ŭX* RRCpBcn#9®Bp[wpog캽cotl9Mݹt^E  N) ]; aͽc`5"1 yzGFܖĺṆ3nQ\, : 4X+?ʄRBcF r04efY2ŵd2C7-ˑz w\–ՄJY <5ɑMލ-/~rCr~;ƞLC'!`n_5 65}BxۖϻJҗ'h.k:uscL\0B||!N&ÂTKR( kϥ璃$XxqzI}u!7(!Maz*8%ҲPYTlt1B̕H(n/=QN 0HDbTvf5<`%/RG29rE!̼[aHeœ?/-|™i'E.gtS^Ȏe߿{YK@ \_(~Zk['ȝƘ0<)'u24{5i)p\\ Hni"([,s](syrr>(0pn?]~u]b&f3=/&-s~p`;n_]vqҪ.^Ϯ;]=w6a"X)@=`;KAG+ 2@O|4\^^`4Wǵ0ENMXGD-(^q(`EVhPc4ܟ R+A"+]eO)PJρUuq,r{+[-}wa|@4͇^NS^ӹ0H!Ewzs mVpP.t=z)a)d(ֈp'Iec|j2.F0ˀdtJ]qn){+MQcyxZ"֋s OXwd_քEQP4oy8f)Bh߽tj58-y^ L`S^sy;?@4owxnott]XEMYrLb˹u mqPX3vN CȳP p4:@L@a(`Qi[nRu:/%_) :+xNnJSpphbL@G9BLΙ?l㜠@؀ vyv{ SLd!+M`o86cr4.PathbϋaȌ".*HHM-W7a5T)JC2,f\^/|^@ɼ9.ujYT'NЇbܬ< hAܮy6/4hgpViw\8_8 \n="Cnnc Gca V{qzƢEÒ_bpzWx:j/U\}}*jK\}-7V?nc.9[/F uNNeDX{'VwNyE( fp^gs ,mFv'–SŦ183s=AVGny4[QܢP`ccC weI+D.|y1:B:1cA0DOX/1 VaJ 8 ǒ!HވE`+6`Ì넛Év)jlj9U wiS8.Novw{7F|.x<^/\p|륔dUg G.0O"?(eXU0 qfnh3ͧή:l2kq 2=[sy]S/p|Wݗ>8 nƣcr^x<: 't{9zx l//<4+D לrj7 WOf#57v_.zC}۵n:!qыTa׀׀ ^|wvyzgGmse]u}q1No?y|aۖx`UU \u}ԵQeh_XA6}MA7]=nT`pvsh;q ;"]^^/8>F=<}&;Wu^uzv^6^@d^u{)ϊ[* d;[ WW[/8cKno;}nm!L8:!6ݭ+Fy<OZJθ2Hz~q98eSNbBr*`Xp(C-W^^ et|jĞOVӗkNF`i#+X{`{LӼ`OA)jwzUSg.GF96O<*ˇ >!o'N<pkSww/+{IlC8V3W^-Bqҹ-–9"^? MdFՔGǧZyt}y3y{Oox~B. xM?wv'r䫺;{ixD*ipa|8q]O`qNÝG0n' WY/7×sUj!duk5nUW6a5?.~&a׀׀ =}s NBݽN43ݻSONrMJ` a.y½ Oq6?ˣ;: sgw)>ƭy998~60nuw(B6屭`9?||]^^z]]_>]MW7cN4tkkkv}åzsmsl=v|m)ke n}מ9m Cnso|N}lZe9wS{]^^/> ;yΟǷ$\N }eVs\8ܻ[pp+(VA77<\o=E^zE$~wQ]r?|IuyU<+o9 nslM]~Ol?~趹~a@׀׀7ݯtj/r&4mN&-<9MC)?|"'fc4555ԡws!,_9?9s<^<<ѣgO6sq ~`0xos~>}/ xruR?y[avv?.a׀׀ E+}iU?>N3s}_{uP}j_\= k\߮vEa&?n xM x x`{:9 /\.o='tykϠZ^S^'~}6o)W.9~|)8 xM} >$"IھMMMMM xMMMMMM xMMMMMM xMMMMMM xMMMMMM xMMMMMM xMMMMMM xMMMMMM xMMMMM xMMMMMM xMMMMMMjãkjjjjjjkjjjjjjkjjjjjjkjjjjjjkjjjjjjkjjjjjjkjjjjjjkjjjjjkjjjjjjkjjjjjjkjjjjjjkjjjjjjkjjjjjjkjjjjjjkjjjjjjkjjjjjjkjjjjjkjjjjjjkjjjjjjkjjjjjjkjjjjjjkjjjjjjkjjjjjjkjjjjjjkjjjjjjkjjjjjkjjjjjjkjjjjjjkjjjjjjkjjjjjjkjjjjjjkjjjjjjkjjjjjjkjjjjjjkjjjjjkjjjjjjkjjjjjjkjjjjjjkjjjjjjkjjjjjjkjjjjjjkjjjjjjkjjjjjjkjjjjjkjjjjjjkjjjjjjkjjjjjjkjjjjjjkjjjjjjkjjjjjjkjjjjjjkjjjjjjkjjjjjkjjjjjjkjjjjjjkjjjjjjkjjjjjjkjjjjjjkjjjjjjkjjjjjjkjjjjjjkjjjjjkjjjjjjkjjjjjjkjjjjjjkjjjjjG}mIENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/splash_version.png0000644000076500000000000000372412647526531022307 0ustar devwheel00000000000000PNG  IHDRjtEXtSoftwareAdobe ImageReadyqe<vIDATxݿe%9 'j? Ec &XYDARHc!" vX+t H!P lMxaݻ+c|ggfGMnvco x x x x x x x x x x x x x x x x x x-3oVukqVm)z.pne(ӬfӲ&vzg_YvoI~<LnVr> j[9mXn˫%o?u%_缗r6˟M.Kvr›GH^y}Bg+_YmMg~̻eLp Eo>]'̗e;&<`[ښ̮{wRќ͉,_Lx`b7,y'jb]?eq/MCFom_^ȡY탦+O]T>54\~)݉s4g+_g=PI%wgqiS&<`@[Uص̇_?϶\G673*z`aѧۈ7Y(l0XΡ=Y2X^`K@_F,ZK+M~LU#V-7ahm]sfֆUYuVqߜ)}%X(6G0O%bSX]@+<;kAUۯ4'IENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/tab_hilite@2x.png0000644000076500000000000000142612647526531021723 0ustar devwheel00000000000000PNG  IHDRFtEXtSoftwareAdobe ImageReadyqe<PLTE777444666555333888IDATxے D卉MV( }vwSsah 5BQ7ˣ?bLat#a^3cWM߰sYRSУwwk)hP3՘P9VДϳjײ4-]z;+VY q~UYZNU/Λ@Cna -)DUG :s),%U>ԟTWƴwRB*'U-$U-#GIeMRT| hOT&FɥHeSI{)y9tTf]͡k2*T~].}:tT.Vd,(ՂeTL#?KSF~+i*nMo_i|[圢w}_C6) SA@W2åбc=A@#4 Ah#=a>f lJ0<)|.s 0G:C2̱# s4l\`.8WK[58g3~a0#o!BX&g3:ƌs  Q )q %+I05:F#pU85H#Oс8 JJ2gkP>:By?k?!Wj&3%.X-OIENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/tab_selected.png0000644000076500000000000000164512647526531021666 0ustar devwheel00000000000000PNG  IHDRTH_"PLTE""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""pPMtRNS0f괓]$o{ l r9BҺ*!LzfUDM8<0YṊ ЭwoWg&@M)z>kGd.QhW&6K u.]h譖 ZY9}% Hr@{h&`u3;M Y _ӜW=.:9hxulz$/KDlH2dƢHݙ4_1=5# W_Q%NӼeuh2?4dNgv瞎G4JVLR(թWT|0H$=Ց&Q^S[d%Ϋȫ0oG( @ArFB2~fPkt޹7:Y'YjeU$l)k՘c[km]OG,A |LW* ~{"ᒽaIENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/tab_selected@2x.png0000644000076500000000000000502012647526531022227 0ustar devwheel00000000000000PNG  IHDRb ttEXtSoftwareAdobe ImageReadyqe< IDATxUO.J A ia((S˔JV PR IQESIIQ$I$(I-H Ң$, B$u_Λ7?~sϹsWLmJf 1q.!Q2WJz#)xƩW]Kվl5cީ6["UQH\ጸRgVMq>hxWTH5oԮ/Ovŧ> {IP.G<%Xtj4)>+ZsVa1^_/}+-1ǒe(}̈?} #x|*o7)4EY *ݵs$-J*YHr4"n'KoQX@s%c\Nز񳰶2}N/P$u8e~)nKH-G̓U}$ r,_`r?'!#j!@`u笅Š8$&(t^;JXT+yPT+brDYj)NIISO$Òqk)&Ё,<(/piee!е[Xo@$ E!g9v-{> JIkx @-VxtCؕdҨ]Dq ёTK9$cPl)TKE%:Ќ@'XIH Y<:wnM'hLZ31\W9^ޕ1rƱ".NH AVȃriMÞ_(wmAs(qfs Be(wW U(qm qv>:ޟ-&AxP)B#&3 8Q8e8xxK ;ՎC91̴@# = S^ @8&!6KJ\%Gi q$1zdž8ROR0%.ALJI)Plj~!q)d#qzcErfޱ~ lIQS;؎y=_8n$P޹FbրD+8v$^mFkQ~ű#sD3.<ȋ*fH7"y!$]]8$PBaI֤z7RSK<8 ฒxDZ\_'m u^N#iVюϑ|'ɵ6I ,` ѬfFKNy.ZRZ8Zw9ޤ >v,'Mq'1ylK`+ǝeQ~SviruY=y,> Β?ʌs %cyP0,l^+=%q<(@ɯCH-z=Deii=s͜򁚾> K$vIC/C+NĜ'|8IRm„cnz~&IQ jsx*MGx$'͡.6_\{gRTI?5簔Th߮fc(hو|+w K_(AMp$Ak}jyMȶVO;F<\Fw8'-Y ͍vu^M <G2?$5DjfW`[χo쾼Mmo-mӽZ!se_Y6ȣc%6EE`aЬ*yf-KYeg qd 8JIOn^|3 aHm}^kۥī*y 4kFwwIpdJ ^sCGX$,Aปd^A(>g$8uȧ2S%,K "*>8 w*NWCFɨKgq&6-Ƶ e \^isKp?B ê\[v8đj+*r]PڛU}hNYZ;%㶆h.jkr72o ;FI!(YgoIzڼ.FT[d^B@O gw{( NoITlOƯEO+j17m.w dѓ{ϙ' 4!SV\"ԬIENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/theme-info.txt0000644000076500000000000000104212647526531021325 0ustar devwheel00000000000000Theme files =========== This is the default (and only) theme. Copyright information --------------------- This theme uses some icons from various 3rd party authors licensed under GPL. See sources, misc/debian.copyright for extended copyright information. Audio credits ------------- CC0 audio files from freesound.org have been used to create some of the sound effects. These are: intro_new.wav: pulse3D.wav by Sclolex, space_string.wav by fons engine_hum_loop.wav: EnginesTurbinesOne.wav by pushkin Audio processing was done in Audacity. DisplayCAL-3.1.0.0/DisplayCAL/theme/x-2px-12x12-999.png0000644000076500000000000000030412647526531021320 0ustar devwheel00000000000000PNG  IHDR atEXtSoftwareAdobe ImageReadyqe<PLTEwwwQQQ```3336BtRNSS:IDATxl10&eLPM`go`< fR?3/X06NIENDB`DisplayCAL-3.1.0.0/DisplayCAL/ti1/0000755000076500000000000000000012653527012016117 5ustar devwheel00000000000000DisplayCAL-3.1.0.0/DisplayCAL/ti1/ccxx.ti10000644000076500000000000000115412647526507017517 0ustar devwheel00000000000000CTI1 DESCRIPTOR "Argyll Calibration Target chart information 1 for creating .ti3 for ccxxmake" ORIGINATOR "Argyll targen" CREATED "Thu Apr 19 13:24:37 2012" KEYWORD "APPROX_WHITE_POINT" APPROX_WHITE_POINT "95.045781 100.000003 108.905751" KEYWORD "COLOR_REP" COLOR_REP "RGB" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT SAMPLE_ID RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 4 BEGIN_DATA 1 100.00 100.00 100.00 95.046 100.00 108.91 2 100.00 0.0000 0.0000 41.238 21.260 1.9306 3 0.0000 100.00 0.0000 35.757 71.520 11.921 4 0.0000 0.0000 100.00 18.050 7.2205 95.055 END_DATA DisplayCAL-3.1.0.0/DisplayCAL/ti1/d3-e4-s0-g25-m3-b3-f0-crossover.ti10000644000076500000000000001447412647526507023457 0ustar devwheel00000000000000CTI1 ORIGINATOR "Argyll targen" KEYWORD "MULTI_DIM_BCC_STEPS" MULTI_DIM_BCC_STEPS "3" CREATED "Fri Oct 18 17:54:11 2013" KEYWORD "COMP_GREY_STEPS" COMP_GREY_STEPS "25" KEYWORD "BLACK_COLOR_PATCHES" BLACK_COLOR_PATCHES "4" KEYWORD "APPROX_WHITE_POINT" APPROX_WHITE_POINT "95.106486 100.000000 108.844025" DESCRIPTOR "Argyll Calibration Target chart information 1" KEYWORD "MULTI_DIM_STEPS" MULTI_DIM_STEPS "3" KEYWORD "WHITE_COLOR_PATCHES" WHITE_COLOR_PATCHES "4" KEYWORD "SINGLE_DIM_STEPS" SINGLE_DIM_STEPS "3" KEYWORD "COLOR_REP" COLOR_REP "RGB" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT SAMPLE_ID RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 73 BEGIN_DATA 1 100.0000 100.0000 100.0000 95.10649 100.0000 108.8440 2 100.0000 100.0000 100.0000 95.10649 100.0000 108.8440 3 100.0000 100.0000 100.0000 95.10649 100.0000 108.8440 4 100.0000 100.0000 100.0000 95.10649 100.0000 108.8440 5 0.000000 0.000000 0.000000 1.000000 1.000000 1.000000 6 0.000000 0.000000 0.000000 1.000000 1.000000 1.000000 7 0.000000 0.000000 0.000000 1.000000 1.000000 1.000000 8 0.000000 0.000000 0.000000 1.000000 1.000000 1.000000 9 4.166700 4.166700 4.166700 1.303726 1.319519 1.348063 10 8.333300 8.333300 8.333300 1.717853 1.755181 1.822644 11 12.50000 12.50000 12.50000 2.350416 2.420638 2.547548 12 16.66700 16.66700 16.66700 3.225924 3.341671 3.550861 13 20.83300 20.83300 20.83300 4.365228 4.540219 4.856479 14 25.00000 25.00000 25.00000 5.787770 6.036733 6.486682 15 29.16700 29.16700 29.16700 7.510475 7.849018 8.460866 16 33.33300 33.33300 33.33300 9.548618 9.993144 10.79653 17 37.50000 37.50000 37.50000 11.91787 12.48560 13.51165 18 41.66700 41.66700 41.66700 14.63156 15.34039 16.62147 19 45.83300 45.83300 45.83300 17.70189 18.57038 20.14001 20 50.00000 50.00000 50.00000 21.14266 22.19007 24.08306 21 54.16700 54.16700 54.16700 24.96491 26.21108 28.46327 22 58.33300 58.33300 58.33300 29.17879 30.64408 33.29229 23 62.50000 62.50000 62.50000 33.79707 35.50251 38.58474 24 66.66700 66.66700 66.66700 38.82914 40.79624 44.35138 25 70.83300 70.83300 70.83300 44.28359 46.53432 50.60207 26 75.00000 75.00000 75.00000 50.17267 52.72963 57.35083 27 79.16700 79.16700 79.16700 56.50443 59.39065 64.60690 28 83.33300 83.33300 83.33300 63.28623 66.52510 72.37869 29 87.50000 87.50000 87.50000 70.53008 74.14563 80.67999 30 91.66700 91.66700 91.66700 78.24293 82.25955 89.51875 31 95.83300 95.83300 95.83300 86.43106 90.87346 98.90218 32 0.000000 0.000000 50.00000 4.825152 2.529819 21.14747 33 0.000000 0.000000 100.0000 18.87111 8.147314 95.12896 34 0.000000 50.00000 0.000000 8.578171 16.15422 3.526078 35 0.000000 50.00000 50.00000 12.40332 17.68404 23.67355 36 0.000000 50.00000 100.0000 26.44928 23.30154 97.65504 37 0.000000 100.0000 0.000000 36.40521 71.80052 12.80184 38 0.000000 100.0000 50.00000 40.23036 73.33034 32.94931 39 0.000000 100.0000 100.0000 54.27632 78.94783 106.9308 40 25.00000 25.00000 75.00000 14.21660 9.407731 50.88218 41 25.00000 75.00000 25.00000 22.48648 39.42948 12.05296 42 25.00000 75.00000 75.00000 30.91530 42.80047 56.44846 43 50.00000 0.000000 0.000000 9.739336 5.506030 1.409510 44 50.00000 0.000000 50.00000 13.56449 7.035849 21.55698 45 50.00000 0.000000 100.0000 27.61044 12.65334 95.53847 46 50.00000 50.00000 0.000000 17.31751 20.66025 3.935588 47 50.00000 50.00000 100.0000 35.18861 27.80757 98.06455 48 50.00000 100.0000 0.000000 45.14454 76.30655 13.21135 49 50.00000 100.0000 50.00000 48.96970 77.83637 33.35882 50 50.00000 100.0000 100.0000 63.01565 83.45386 107.3403 51 75.00000 25.00000 25.00000 25.04513 15.96589 7.389049 52 75.00000 25.00000 75.00000 33.47396 19.33689 51.78455 53 75.00000 75.00000 25.00000 41.74384 49.35864 12.95533 54 100.0000 0.000000 0.000000 41.83017 22.05217 2.913230 55 100.0000 0.000000 50.00000 45.65532 23.58199 23.06070 56 100.0000 0.000000 100.0000 59.70128 29.19948 97.04219 57 100.0000 50.00000 0.000000 49.40834 37.20639 5.439309 58 100.0000 50.00000 50.00000 53.23349 38.73621 25.58678 59 100.0000 50.00000 100.0000 67.27945 44.35371 99.56827 60 100.0000 100.0000 0.000000 77.23538 92.85269 14.71507 61 100.0000 100.0000 50.00000 81.06053 94.38251 34.86254 62 0.000000 12.50000 100.0000 19.37917 9.163293 95.29831 63 12.50000 0.000000 100.0000 19.45702 8.449410 95.15641 64 0.000000 100.0000 12.50000 36.66166 71.90308 14.15257 65 12.50000 100.0000 0.000000 36.99112 72.10261 12.82929 66 100.0000 0.000000 12.50000 42.08662 22.15473 4.263969 67 100.0000 12.50000 0.000000 42.33823 23.06815 3.082585 68 0.000000 25.00000 100.0000 20.67239 11.74937 95.72939 69 25.00000 0.000000 100.0000 20.94839 9.218366 95.22630 70 0.000000 100.0000 25.00000 37.31442 72.16414 17.59075 71 25.00000 100.0000 0.000000 38.48249 72.87157 12.89917 72 100.0000 0.000000 25.00000 42.73938 22.41580 7.702144 73 100.0000 25.00000 0.000000 43.63145 25.65422 3.513662 END_DATA CTI1 ORIGINATOR "Argyll targen" KEYWORD "DENSITY_EXTREME_VALUES" DENSITY_EXTREME_VALUES "8" CREATED "October 18, 2013" DESCRIPTOR "Argyll Calibration Target chart information 1" KEYWORD "INDEX" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT INDEX RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 8 BEGIN_DATA 0 100.000 100.000 100.000 95.0460 100.000 108.910 1 0.00000 46.3070 100.000 24.5380 20.1970 97.2170 2 100.000 0.00000 76.4350 51.0790 25.1960 53.7500 3 0.00000 0.00000 55.4170 4.83100 1.93250 25.4410 4 100.000 64.4300 0.00000 54.5660 47.9170 6.37360 5 0.00000 34.0820 0.00000 3.40060 6.80170 1.13370 6 78.9890 0.00000 0.00000 24.2000 12.4760 1.13290 7 5.02670 4.49050 3.59250 0.33816 0.35379 0.31287 END_DATA CTI1 ORIGINATOR "Argyll targen" CREATED "October 18, 2013" DESCRIPTOR "Argyll Calibration Target chart information 1" KEYWORD "DEVICE_COMBINATION_VALUES" DEVICE_COMBINATION_VALUES "9" KEYWORD "INDEX" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT INDEX RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 9 BEGIN_DATA 0 100.00 100.00 100.00 95.046 100.00 108.91 1 0.0000 100.00 100.00 53.807 78.740 106.98 2 100.00 0.0000 100.00 59.288 28.480 96.985 3 0.0000 0.0000 100.00 18.050 7.2205 95.055 4 100.00 100.00 0.0000 76.996 92.780 13.851 5 0.0000 100.00 0.0000 35.757 71.520 11.921 6 100.00 0.0000 0.0000 41.238 21.260 1.9306 7 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 8 50.000 50.000 50.000 20.344 21.405 23.311 END_DATADisplayCAL-3.1.0.0/DisplayCAL/ti1/d3-e4-s0-g49-m3-b3-f0-crossover.ti10000644000076500000000000001476012647526507023463 0ustar devwheel00000000000000CTI1 ORIGINATOR "Argyll targen" KEYWORD "MULTI_DIM_BCC_STEPS" MULTI_DIM_BCC_STEPS "3" CREATED "Fri Oct 18 17:57:02 2013" KEYWORD "COMP_GREY_STEPS" COMP_GREY_STEPS "49" KEYWORD "BLACK_COLOR_PATCHES" BLACK_COLOR_PATCHES "4" KEYWORD "APPROX_WHITE_POINT" APPROX_WHITE_POINT "95.106486 100.000000 108.844025" DESCRIPTOR "Argyll Calibration Target chart information 1" KEYWORD "MULTI_DIM_STEPS" MULTI_DIM_STEPS "3" KEYWORD "WHITE_COLOR_PATCHES" WHITE_COLOR_PATCHES "4" KEYWORD "SINGLE_DIM_STEPS" SINGLE_DIM_STEPS "3" KEYWORD "COLOR_REP" COLOR_REP "RGB" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT SAMPLE_ID RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 97 BEGIN_DATA 1 100.00 100.00 100.00 95.106 100.00 108.84 2 100.00 100.00 100.00 95.106 100.00 108.84 3 100.00 100.00 100.00 95.106 100.00 108.84 4 100.00 100.00 100.00 95.106 100.00 108.84 5 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 6 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 7 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 8 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 9 2.0833 2.0833 2.0833 1.1517 1.1596 1.1739 10 4.1667 4.1667 4.1667 1.3037 1.3195 1.3481 11 6.2500 6.2500 6.2500 1.4852 1.5104 1.5560 12 8.3333 8.3333 8.3333 1.7179 1.7552 1.8226 13 10.417 10.417 10.417 2.0053 2.0575 2.1520 14 12.500 12.500 12.500 2.3504 2.4206 2.5475 15 14.583 14.583 14.583 2.7563 2.8476 3.0127 16 16.667 16.667 16.667 3.2259 3.3417 3.5509 17 18.750 18.750 18.750 3.7614 3.9049 4.1645 18 20.833 20.833 20.833 4.3652 4.5402 4.8565 19 22.917 22.917 22.917 5.0402 5.2503 5.6300 20 25.000 25.000 25.000 5.7878 6.0367 6.4867 21 27.083 27.083 27.083 6.6104 6.9021 7.4294 22 29.167 29.167 29.167 7.5105 7.8490 8.4609 23 31.250 31.250 31.250 8.4891 8.8786 9.5824 24 33.333 33.333 33.333 9.5486 9.9931 10.797 25 35.417 35.417 35.417 10.691 11.195 12.106 26 37.500 37.500 37.500 11.918 12.486 13.512 27 39.583 39.583 39.583 13.231 13.866 15.016 28 41.667 41.667 41.667 14.632 15.340 16.621 29 43.750 43.750 43.750 16.121 16.908 18.329 30 45.833 45.833 45.833 17.702 18.570 20.140 31 47.917 47.917 47.917 19.376 20.331 22.058 32 50.000 50.000 50.000 21.143 22.190 24.083 33 52.083 52.083 52.083 23.005 24.149 26.217 34 54.167 54.167 54.167 24.965 26.211 28.463 35 56.250 56.250 56.250 27.022 28.375 30.821 36 58.333 58.333 58.333 29.179 30.644 33.292 37 60.417 60.417 60.417 31.437 33.020 35.881 38 62.500 62.500 62.500 33.797 35.503 38.585 39 64.583 64.583 64.583 36.260 38.094 41.407 40 66.667 66.667 66.667 38.829 40.796 44.351 41 68.750 68.750 68.750 41.503 43.609 47.415 42 70.833 70.833 70.833 44.284 46.534 50.602 43 72.917 72.917 72.917 47.174 49.575 53.915 44 75.000 75.000 75.000 50.173 52.730 57.351 45 77.083 77.083 77.083 53.282 56.001 60.914 46 79.167 79.167 79.167 56.504 59.391 64.607 47 81.250 81.250 81.250 59.838 62.898 68.427 48 83.333 83.333 83.333 63.286 66.525 72.379 49 85.417 85.417 85.417 66.851 70.275 76.464 50 87.500 87.500 87.500 70.530 74.146 80.680 51 89.583 89.583 89.583 74.326 78.139 85.031 52 91.667 91.667 91.667 78.243 82.260 89.519 53 93.750 93.750 93.750 82.277 86.503 94.142 54 95.833 95.833 95.833 86.431 90.873 98.902 55 97.917 97.917 97.917 90.709 95.373 103.80 56 0.0000 0.0000 50.000 4.8252 2.5298 21.147 57 0.0000 0.0000 100.00 18.871 8.1473 95.129 58 0.0000 50.000 0.0000 8.5782 16.154 3.5261 59 0.0000 50.000 50.000 12.403 17.684 23.674 60 0.0000 50.000 100.00 26.449 23.302 97.655 61 0.0000 100.00 0.0000 36.405 71.801 12.802 62 0.0000 100.00 50.000 40.230 73.330 32.949 63 0.0000 100.00 100.00 54.276 78.948 106.93 64 25.000 25.000 75.000 14.217 9.4077 50.882 65 25.000 75.000 25.000 22.486 39.429 12.053 66 25.000 75.000 75.000 30.915 42.800 56.448 67 50.000 0.0000 0.0000 9.7393 5.5060 1.4095 68 50.000 0.0000 50.000 13.564 7.0358 21.557 69 50.000 0.0000 100.00 27.610 12.653 95.538 70 50.000 50.000 0.0000 17.318 20.660 3.9356 71 50.000 50.000 100.00 35.189 27.808 98.065 72 50.000 100.00 0.0000 45.145 76.307 13.211 73 50.000 100.00 50.000 48.970 77.836 33.359 74 50.000 100.00 100.00 63.016 83.454 107.34 75 75.000 25.000 25.000 25.045 15.966 7.3890 76 75.000 25.000 75.000 33.474 19.337 51.785 77 75.000 75.000 25.000 41.744 49.359 12.955 78 100.00 0.0000 0.0000 41.830 22.052 2.9132 79 100.00 0.0000 50.000 45.655 23.582 23.061 80 100.00 0.0000 100.00 59.701 29.199 97.042 81 100.00 50.000 0.0000 49.408 37.206 5.4393 82 100.00 50.000 50.000 53.233 38.736 25.587 83 100.00 50.000 100.00 67.279 44.354 99.568 84 100.00 100.00 0.0000 77.235 92.853 14.715 85 100.00 100.00 50.000 81.061 94.383 34.863 86 0.0000 12.500 100.00 19.379 9.1633 95.298 87 12.500 0.0000 100.00 19.457 8.4494 95.156 88 0.0000 100.00 12.500 36.662 71.903 14.153 89 12.500 100.00 0.0000 36.991 72.103 12.829 90 100.00 0.0000 12.500 42.087 22.155 4.2640 91 100.00 12.500 0.0000 42.338 23.068 3.0826 92 0.0000 25.000 100.00 20.672 11.749 95.729 93 25.000 0.0000 100.00 20.948 9.2184 95.226 94 0.0000 100.00 25.000 37.314 72.164 17.591 95 25.000 100.00 0.0000 38.482 72.872 12.899 96 100.00 0.0000 25.000 42.739 22.416 7.7021 97 100.00 25.000 0.0000 43.631 25.654 3.5137 END_DATA CTI1 ORIGINATOR "Argyll targen" KEYWORD "DENSITY_EXTREME_VALUES" DENSITY_EXTREME_VALUES "8" CREATED "October 18, 2013" DESCRIPTOR "Argyll Calibration Target chart information 1" KEYWORD "INDEX" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT INDEX RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 8 BEGIN_DATA 0 100.00 100.00 100.00 95.106 100.00 108.84 1 0.0000 47.361 100.00 25.613 21.629 97.376 2 100.00 0.0000 79.351 52.426 26.290 58.722 3 0.0000 0.0000 58.997 6.4858 3.1940 29.894 4 100.00 66.659 0.0000 56.059 50.505 7.6561 5 0.0000 35.601 0.0000 4.6856 8.3702 2.2286 6 84.444 0.0000 0.0000 28.843 15.356 2.3047 7 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 END_DATA CTI1 ORIGINATOR "Argyll targen" CREATED "October 18, 2013" DESCRIPTOR "Argyll Calibration Target chart information 1" KEYWORD "DEVICE_COMBINATION_VALUES" DEVICE_COMBINATION_VALUES "9" KEYWORD "INDEX" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT INDEX RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 9 BEGIN_DATA 0 100.00 100.00 100.00 95.106 100.00 108.84 1 0.0000 100.00 100.00 54.276 78.948 106.93 2 100.00 0.0000 100.00 59.701 29.199 97.042 3 0.0000 0.0000 100.00 18.871 8.1473 95.129 4 100.00 100.00 0.0000 77.235 92.853 14.715 5 0.0000 100.00 0.0000 36.405 71.801 12.802 6 100.00 0.0000 0.0000 41.830 22.052 2.9132 7 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 8 50.000 50.000 50.000 21.143 22.190 24.083 END_DATADisplayCAL-3.1.0.0/DisplayCAL/ti1/d3-e4-s0-g9-m3-b3-f0-crossover.ti10000644000076500000000000001210512647526507023366 0ustar devwheel00000000000000CTI1 ORIGINATOR "Argyll targen" KEYWORD "MULTI_DIM_BCC_STEPS" MULTI_DIM_BCC_STEPS "3" CREATED "Wed Oct 16 19:18:48 2013" KEYWORD "COMP_GREY_STEPS" COMP_GREY_STEPS "9" KEYWORD "BLACK_COLOR_PATCHES" BLACK_COLOR_PATCHES "4" KEYWORD "APPROX_WHITE_POINT" APPROX_WHITE_POINT "95.106486 100.000000 108.844025" DESCRIPTOR "Argyll Calibration Target chart information 1" KEYWORD "MULTI_DIM_STEPS" MULTI_DIM_STEPS "3" KEYWORD "WHITE_COLOR_PATCHES" WHITE_COLOR_PATCHES "4" KEYWORD "SINGLE_DIM_STEPS" SINGLE_DIM_STEPS "3" KEYWORD "COLOR_REP" COLOR_REP "RGB" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT SAMPLE_ID RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 57 BEGIN_DATA 1 100.000 100.000 100.000 95.1065 100.000 108.844 2 100.000 100.000 100.000 95.1065 100.000 108.844 3 100.000 100.000 100.000 95.1065 100.000 108.844 4 100.000 100.000 100.000 95.1065 100.000 108.844 5 0.00000 0.00000 0.00000 1.00000 1.00000 1.00000 6 0.00000 0.00000 0.00000 1.00000 1.00000 1.00000 7 0.00000 0.00000 0.00000 1.00000 1.00000 1.00000 8 0.00000 0.00000 0.00000 1.00000 1.00000 1.00000 9 12.5000 12.5000 12.5000 2.35042 2.42064 2.54755 10 25.0000 25.0000 25.0000 5.78777 6.03673 6.48668 11 37.5000 37.5000 37.5000 11.9179 12.4856 13.5116 12 50.0000 50.0000 50.0000 21.1427 22.1901 24.0831 13 62.5000 62.5000 62.5000 33.7971 35.5025 38.5847 14 75.0000 75.0000 75.0000 50.1727 52.7296 57.3508 15 87.5000 87.5000 87.5000 70.5301 74.1456 80.6800 16 0.00000 0.00000 50.0000 4.82515 2.52982 21.1475 17 0.00000 0.00000 100.000 18.8711 8.14731 95.1290 18 0.00000 50.0000 0.00000 8.57817 16.1542 3.52608 19 0.00000 50.0000 50.0000 12.4033 17.6840 23.6735 20 0.00000 50.0000 100.000 26.4493 23.3015 97.6550 21 0.00000 100.000 0.00000 36.4052 71.8005 12.8018 22 0.00000 100.000 50.0000 40.2304 73.3303 32.9493 23 0.00000 100.000 100.000 54.2763 78.9478 106.931 24 25.0000 25.0000 75.0000 14.2166 9.40773 50.8822 25 25.0000 75.0000 25.0000 22.4865 39.4295 12.0530 26 25.0000 75.0000 75.0000 30.9153 42.8005 56.4485 27 50.0000 0.00000 0.00000 9.73934 5.50603 1.40951 28 50.0000 0.00000 50.0000 13.5645 7.03585 21.5570 29 50.0000 0.00000 100.000 27.6104 12.6533 95.5385 30 50.0000 50.0000 0.00000 17.3175 20.6603 3.93559 31 50.0000 50.0000 100.000 35.1886 27.8076 98.0645 32 50.0000 100.000 0.00000 45.1445 76.3065 13.2113 33 50.0000 100.000 50.0000 48.9697 77.8364 33.3588 34 50.0000 100.000 100.000 63.0157 83.4539 107.340 35 75.0000 25.0000 25.0000 25.0451 15.9659 7.38905 36 75.0000 25.0000 75.0000 33.4740 19.3369 51.7845 37 75.0000 75.0000 25.0000 41.7438 49.3586 12.9553 38 100.000 0.00000 0.00000 41.8302 22.0522 2.91323 39 100.000 0.00000 50.0000 45.6553 23.5820 23.0607 40 100.000 0.00000 100.000 59.7013 29.1995 97.0422 41 100.000 50.0000 0.00000 49.4083 37.2064 5.43931 42 100.000 50.0000 50.0000 53.2335 38.7362 25.5868 43 100.000 50.0000 100.000 67.2794 44.3537 99.5683 44 100.000 100.000 0.00000 77.2354 92.8527 14.7151 45 100.000 100.000 50.0000 81.0605 94.3825 34.8625 46 0.00000 12.5000 100.000 19.3792 9.16329 95.2983 47 12.5000 0.00000 100.000 19.4570 8.44941 95.1564 48 0.00000 100.000 12.5000 36.6617 71.9031 14.1526 49 12.5000 100.000 0.00000 36.9911 72.1026 12.8293 50 100.000 0.00000 12.5000 42.0866 22.1547 4.26397 51 100.000 12.5000 0.00000 42.3382 23.0681 3.08259 52 0.00000 25.0000 100.000 20.6724 11.7494 95.7294 53 25.0000 0.00000 100.000 20.9484 9.21837 95.2263 54 0.00000 100.000 25.0000 37.3144 72.1641 17.5907 55 25.0000 100.000 0.00000 38.4825 72.8716 12.8992 56 100.000 0.00000 25.0000 42.7394 22.4158 7.70214 57 100.000 25.0000 0.00000 43.6314 25.6542 3.51366 END_DATA CTI1 ORIGINATOR "Argyll targen" KEYWORD "DENSITY_EXTREME_VALUES" DENSITY_EXTREME_VALUES "8" CREATED "October 16, 2013" DESCRIPTOR "Argyll Calibration Target chart information 1" KEYWORD "INDEX" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT INDEX RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 8 BEGIN_DATA 0 100.000 100.000 100.000 95.0460 100.000 108.910 1 0.00000 46.3070 100.000 24.5380 20.1970 97.2170 2 100.000 0.00000 76.4350 51.0790 25.1960 53.7500 3 0.00000 0.00000 55.4170 4.83100 1.93250 25.4410 4 100.000 64.4300 0.00000 54.5660 47.9170 6.37360 5 0.00000 34.0820 0.00000 3.40060 6.80170 1.13370 6 78.9890 0.00000 0.00000 24.2000 12.4760 1.13290 7 5.02670 4.49050 3.59250 0.33816 0.35379 0.31287 END_DATA CTI1 ORIGINATOR "Argyll targen" CREATED "October 16, 2013" DESCRIPTOR "Argyll Calibration Target chart information 1" KEYWORD "DEVICE_COMBINATION_VALUES" DEVICE_COMBINATION_VALUES "9" KEYWORD "INDEX" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT INDEX RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 9 BEGIN_DATA 0 100.00 100.00 100.00 95.046 100.00 108.91 1 0.0000 100.00 100.00 53.807 78.740 106.98 2 100.00 0.0000 100.00 59.288 28.480 96.985 3 0.0000 0.0000 100.00 18.050 7.2205 95.055 4 100.00 100.00 0.0000 76.996 92.780 13.851 5 0.0000 100.00 0.0000 35.757 71.520 11.921 6 100.00 0.0000 0.0000 41.238 21.260 1.9306 7 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 8 50.000 50.000 50.000 20.344 21.405 23.311 END_DATADisplayCAL-3.1.0.0/DisplayCAL/ti1/d3-e4-s13-g37-m4-b4-f0.ti10000644000076500000000000002415112647526507021516 0ustar devwheel00000000000000CTI1 ORIGINATOR "Argyll targen" KEYWORD "MULTI_DIM_BCC_STEPS" MULTI_DIM_BCC_STEPS "4" CREATED "Sat Oct 19 14:08:23 2013" KEYWORD "COMP_GREY_STEPS" COMP_GREY_STEPS "37" KEYWORD "BLACK_COLOR_PATCHES" BLACK_COLOR_PATCHES "4" KEYWORD "APPROX_WHITE_POINT" APPROX_WHITE_POINT "95.106486 100.000000 108.844025" DESCRIPTOR "Argyll Calibration Target chart information 1" KEYWORD "MULTI_DIM_STEPS" MULTI_DIM_STEPS "4" KEYWORD "WHITE_COLOR_PATCHES" WHITE_COLOR_PATCHES "4" KEYWORD "SINGLE_DIM_STEPS" SINGLE_DIM_STEPS "13" KEYWORD "COLOR_REP" COLOR_REP "RGB" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT SAMPLE_ID RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 154 BEGIN_DATA 1 100.000 100.000 100.000 95.1065 100.000 108.844 2 16.6667 50.0000 83.3333 21.3724 21.3828 65.8730 3 16.6667 83.3333 83.3333 37.2280 53.0897 71.1583 4 16.6667 16.6667 50.0000 6.62830 4.70235 21.4719 5 16.6667 16.6667 83.3333 14.6316 7.90317 63.6261 6 100.000 33.3333 100.000 62.9175 35.6311 98.1143 7 33.3333 0.00000 66.6667 11.8929 5.78548 39.0116 8 33.3333 33.3333 66.6667 15.1091 12.2171 40.0837 9 50.0000 50.0000 83.3333 29.1460 25.3909 66.2373 10 50.0000 83.3333 83.3333 45.0016 57.0978 71.5225 11 0.00000 0.00000 0.00000 1.00000 1.00000 1.00000 12 33.3333 0.00000 0.00000 4.70908 2.91242 1.17380 13 41.6667 0.00000 0.00000 6.91425 4.04941 1.27713 14 50.0000 0.00000 0.00000 9.73934 5.50603 1.40951 15 58.3333 0.00000 0.00000 13.2261 7.30384 1.57290 16 66.6667 0.00000 0.00000 17.4128 9.46250 1.76908 17 75.0000 0.00000 0.00000 22.3346 12.0002 1.99970 18 83.3333 0.00000 0.00000 28.0245 14.9339 2.26632 19 5.55556 5.55556 5.55556 1.41919 1.44098 1.48038 20 0.00000 0.00000 0.00000 1.00000 1.00000 1.00000 21 11.1111 11.1111 11.1111 2.11371 2.17162 2.27628 22 0.00000 16.6667 0.00000 1.83742 2.67460 1.27914 23 0.00000 25.0000 0.00000 2.80128 4.60205 1.60043 24 0.00000 33.3333 0.00000 4.21627 7.43164 2.07210 25 0.00000 41.6667 0.00000 6.12844 11.2555 2.70950 26 0.00000 50.0000 0.00000 8.57817 16.1542 3.52608 27 0.00000 58.3333 0.00000 11.6017 22.2004 4.53393 28 0.00000 66.6667 0.00000 15.2321 29.4602 5.74408 29 0.00000 75.0000 0.00000 19.5000 37.9948 7.16671 30 0.00000 83.3333 0.00000 24.4338 47.8611 8.81135 31 0.00000 91.6667 0.00000 30.0605 59.1128 10.6869 32 0.00000 100.000 0.00000 36.4052 71.8005 12.8018 33 33.3333 100.000 66.6667 47.2981 76.5860 50.8134 34 100.000 100.000 66.6667 84.4192 95.7257 52.5528 35 0.00000 0.00000 16.6667 1.42269 1.16905 3.22637 36 0.00000 0.00000 41.6667 3.58863 2.03529 14.6346 37 0.00000 0.00000 50.0000 4.82515 2.52982 21.1475 38 0.00000 0.00000 58.3333 6.35130 3.14018 29.1859 39 0.00000 0.00000 66.6667 8.18379 3.87306 38.8378 40 0.00000 0.00000 75.0000 10.3380 4.73463 50.1844 41 8.33333 0.00000 0.00000 1.31146 1.16059 1.01459 42 66.6667 0.00000 100.000 35.2839 16.6098 95.8980 43 100.000 0.00000 100.000 59.7013 29.1995 97.0422 44 100.000 66.6667 100.000 73.9334 57.6597 101.786 45 2.77778 2.77778 2.77778 1.20233 1.21285 1.23186 46 0.00000 0.00000 8.33333 1.13632 1.05452 1.71803 47 0.00000 8.33333 0.00000 1.27008 1.54008 1.09003 48 8.33333 8.33333 8.33333 1.71786 1.75519 1.82265 49 13.8889 13.8889 13.8889 2.61414 2.69807 2.84977 50 16.6667 16.6667 16.6667 3.22584 3.34159 3.55077 51 19.4444 19.4444 19.4444 3.95495 4.10861 4.38632 52 22.2222 22.2222 22.2222 4.80716 5.00513 5.36292 53 25.0000 25.0000 25.0000 5.78777 6.03673 6.48668 54 27.7778 27.7778 27.7778 6.90179 7.20869 7.76333 55 30.5556 30.5556 30.5556 8.15397 8.52597 9.19829 56 33.3333 33.3333 33.3333 9.54879 9.99333 10.7967 57 36.1111 36.1111 36.1111 11.0906 11.6153 12.5636 58 38.8889 38.8889 38.8889 12.7834 13.3962 14.5036 59 41.6667 41.6667 41.6667 14.6313 15.3402 16.6212 60 44.4444 44.4444 44.4444 16.6381 17.4512 18.9209 61 47.2222 47.2222 47.2222 18.8073 19.7333 21.4068 62 50.0000 50.0000 50.0000 21.1427 22.1901 24.0831 63 66.6667 66.6667 100.000 49.5160 45.0701 100.642 64 100.000 100.000 100.000 95.1065 100.000 108.844 65 58.3333 58.3333 58.3333 29.1791 30.6444 33.2927 66 61.1111 61.1111 61.1111 32.2123 33.8353 36.7686 67 63.8889 63.8889 63.8889 35.4278 37.2181 40.4535 68 66.6667 66.6667 66.6667 38.8287 40.7958 44.3509 69 69.4444 69.4444 69.4444 42.4179 44.5716 48.4641 70 72.2222 72.2222 72.2222 46.1983 48.5486 52.7963 71 75.0000 75.0000 75.0000 50.1727 52.7296 57.3508 72 77.7778 77.7778 77.7778 54.3438 57.1176 62.1308 73 80.5556 80.5556 80.5556 58.7142 61.7154 67.1393 74 83.3333 83.3333 83.3333 63.2868 66.5257 72.3793 75 86.1111 86.1111 86.1111 68.0640 71.5513 77.8539 76 88.8889 88.8889 88.8889 73.0483 76.7948 83.5658 77 91.6667 91.6667 91.6667 78.2423 82.2589 89.5180 78 94.4444 94.4444 94.4444 83.6484 87.9461 95.7133 79 0.00000 66.6667 33.3333 16.8555 30.1095 14.2949 80 0.00000 100.000 66.6667 43.5890 74.6736 50.6396 81 66.6667 33.3333 0.00000 20.6291 15.8941 2.84118 82 100.000 33.3333 0.00000 45.0464 28.4838 3.98533 83 100.000 66.6667 0.00000 56.0623 50.5124 7.65731 84 66.6667 66.6667 0.00000 31.6449 37.9227 6.51315 85 33.3333 66.6667 0.00000 18.9412 31.3726 5.91788 86 33.3333 100.000 0.00000 40.1143 73.7129 12.9756 87 66.6667 100.000 0.00000 52.8180 80.2630 13.5709 88 100.000 100.000 0.00000 77.2354 92.8527 14.7151 89 33.3333 0.00000 33.3333 6.33252 3.56169 9.72464 90 66.6667 0.00000 33.3333 19.0363 10.1118 10.3199 91 83.3333 16.6667 50.0000 32.6871 18.1383 22.6929 92 50.0000 16.6667 16.6667 10.9994 7.34968 3.91503 93 83.3333 16.6667 16.6667 29.2846 16.7776 4.77184 94 83.3333 50.0000 16.6667 36.0254 30.2572 7.01877 95 33.3333 33.3333 0.00000 7.92535 9.34406 2.24590 96 33.3333 66.6667 33.3333 20.5646 32.0219 14.4687 97 66.6667 66.6667 33.3333 33.2684 38.5720 15.0640 98 100.000 66.6667 33.3333 57.6857 51.1617 16.2081 99 0.00000 100.000 33.3333 38.0287 72.4498 21.3527 100 33.3333 100.000 33.3333 41.7377 74.3622 21.5265 101 66.6667 100.000 33.3333 54.4415 80.9123 22.1217 102 100.000 100.000 33.3333 78.8588 93.5020 23.2659 103 0.00000 0.00000 0.00000 1.00000 1.00000 1.00000 104 100.000 0.00000 33.3333 43.4536 22.7014 11.4641 105 100.000 0.00000 66.6667 49.0140 24.9252 40.7510 106 97.2222 97.2222 97.2222 89.2690 93.8590 102.154 107 100.000 100.000 100.000 95.1065 100.000 108.844 108 66.6667 33.3333 33.3333 22.2525 16.5434 11.3920 109 83.3333 50.0000 50.0000 39.4278 31.6180 24.9399 110 16.6667 50.0000 16.6667 9.96660 16.8212 5.79771 111 16.6667 50.0000 50.0000 13.3691 18.1820 23.7188 112 33.3333 66.6667 66.6667 26.1250 34.2457 43.7556 113 0.00000 0.00000 0.00000 1.00000 1.00000 1.00000 114 91.6667 0.00000 0.00000 34.5133 18.2796 2.57037 115 100.000 0.00000 0.00000 41.8302 22.0522 2.91323 116 100.000 33.3333 33.3333 46.6699 29.1331 12.5362 117 100.000 66.6667 66.6667 63.2461 53.3855 45.4951 118 0.00000 0.00000 83.3333 12.8285 5.73063 63.3017 119 0.00000 0.00000 91.6667 15.6685 6.86649 78.2607 120 0.00000 0.00000 100.000 18.8711 8.14731 95.1290 121 0.00000 66.6667 100.000 33.1032 36.6075 99.8730 122 100.000 100.000 100.000 95.1065 100.000 108.844 123 33.3333 0.00000 100.000 22.5802 10.0597 95.3028 124 33.3333 33.3333 100.000 25.7965 16.4914 96.3749 125 33.3333 66.6667 100.000 36.8123 38.5200 100.047 126 0.00000 33.3333 66.6667 11.4001 10.3047 39.9098 127 0.00000 66.6667 66.6667 22.4159 32.3333 43.5818 128 0.00000 100.000 100.000 54.2763 78.9478 106.931 129 33.3333 100.000 100.000 57.9854 80.8602 107.105 130 66.6667 100.000 100.000 70.6891 87.4103 107.700 131 66.6667 0.00000 66.6667 24.5966 12.3356 39.6068 132 66.6667 33.3333 66.6667 27.8129 18.7672 40.6789 133 100.000 33.3333 66.6667 52.2302 31.3569 41.8231 134 16.6667 83.3333 16.6667 25.8223 48.5281 11.0830 135 50.0000 83.3333 16.6667 33.5959 52.5362 11.4472 136 50.0000 50.0000 16.6667 17.7402 20.8293 6.16196 137 83.3333 83.3333 16.6667 51.8810 61.9641 12.3040 138 83.3333 83.3333 50.0000 55.2835 63.3249 30.2251 139 16.6667 0.00000 0.00000 1.96573 1.49793 1.04525 140 25.0000 0.00000 0.00000 3.07728 2.07105 1.09734 141 66.6667 33.3333 100.000 38.5002 23.0415 96.9701 142 0.00000 0.00000 25.0000 1.90921 1.36363 5.78891 143 0.00000 0.00000 33.3333 2.62344 1.64927 9.55084 144 16.6667 83.3333 50.0000 29.2247 49.8889 29.0041 145 50.0000 83.3333 50.0000 36.9983 53.8970 29.3683 146 66.6667 100.000 66.6667 60.0018 83.1361 51.4087 147 50.0000 16.6667 50.0000 14.4019 8.71045 21.8361 148 50.0000 16.6667 83.3333 22.4052 11.9113 63.9903 149 83.3333 16.6667 83.3333 40.6904 21.3392 64.8471 150 83.3333 50.0000 83.3333 47.4311 34.8188 67.0941 151 52.7778 52.7778 52.7778 23.6475 24.8252 26.9536 152 55.5556 55.5556 55.5556 26.3253 27.6422 30.0222 153 0.00000 33.3333 33.3333 5.83971 8.08091 10.6229 154 0.00000 33.3333 100.000 22.0874 14.5790 96.2011 END_DATA CTI1 ORIGINATOR "Argyll targen" KEYWORD "DENSITY_EXTREME_VALUES" DENSITY_EXTREME_VALUES "8" CREATED "October 19, 2013" DESCRIPTOR "Argyll Calibration Target chart information 1" KEYWORD "INDEX" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT INDEX RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 8 BEGIN_DATA 0 100.000 100.000 100.000 95.1065 100.000 108.844 1 0.00000 47.3607 100.000 25.6130 21.6292 97.3763 2 100.000 0.00000 79.3514 52.4258 26.2898 58.7215 3 0.00000 0.00000 58.9971 6.48583 3.19399 29.8944 4 100.000 66.6593 0.00000 56.0588 50.5054 7.65614 5 0.00000 35.6011 0.00000 4.68562 8.37021 2.22855 6 84.4444 0.00000 0.00000 28.8428 15.3558 2.30466 7 0.00000 0.00000 0.00000 1.00000 1.00000 1.00000 END_DATA CTI1 ORIGINATOR "Argyll targen" CREATED "October 19, 2013" DESCRIPTOR "Argyll Calibration Target chart information 1" KEYWORD "DEVICE_COMBINATION_VALUES" DEVICE_COMBINATION_VALUES "9" KEYWORD "INDEX" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT INDEX RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 9 BEGIN_DATA 0 100.000 100.000 100.000 95.1065 100.000 108.844 1 0.00000 100.000 100.000 54.2763 78.9478 106.931 2 100.000 0.00000 100.000 59.7013 29.1995 97.0422 3 0.00000 0.00000 100.000 18.8711 8.14731 95.1290 4 100.000 100.000 0.00000 77.2354 92.8527 14.7151 5 0.00000 100.000 0.00000 36.4052 71.8005 12.8018 6 100.000 0.00000 0.00000 41.8302 22.0522 2.91323 7 0.00000 0.00000 0.00000 1.00000 1.00000 1.00000 8 50.0000 50.0000 50.0000 21.1427 22.1901 24.0831 END_DATADisplayCAL-3.1.0.0/DisplayCAL/ti1/d3-e4-s17-g49-m5-b5-f0.ti10000644000076500000000000004024212647526507021526 0ustar devwheel00000000000000CTI1 ORIGINATOR "Argyll targen" KEYWORD "MULTI_DIM_BCC_STEPS" MULTI_DIM_BCC_STEPS "5" CREATED "Sat Oct 19 13:37:24 2013" KEYWORD "COMP_GREY_STEPS" COMP_GREY_STEPS "49" KEYWORD "BLACK_COLOR_PATCHES" BLACK_COLOR_PATCHES "4" KEYWORD "APPROX_WHITE_POINT" APPROX_WHITE_POINT "95.106486 100.000000 108.844025" DESCRIPTOR "Argyll Calibration Target chart information 1" KEYWORD "MULTI_DIM_STEPS" MULTI_DIM_STEPS "5" KEYWORD "WHITE_COLOR_PATCHES" WHITE_COLOR_PATCHES "4" KEYWORD "SINGLE_DIM_STEPS" SINGLE_DIM_STEPS "17" KEYWORD "COLOR_REP" COLOR_REP "RGB" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT SAMPLE_ID RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 271 BEGIN_DATA 1 100.000 100.000 100.000 95.1065 100.000 108.844 2 12.5000 37.5000 12.5000 5.94993 9.61866 3.74740 3 12.5000 62.5000 12.5000 14.1814 26.0794 6.49125 4 12.5000 87.5000 87.5000 40.9488 58.8934 79.2939 5 37.5000 87.5000 87.5000 45.0999 61.0337 79.4884 6 0.00000 25.0000 25.0000 3.71049 4.96568 6.38934 7 0.00000 25.0000 50.0000 6.62643 6.13187 21.7479 8 25.0000 75.0000 75.0000 30.9153 42.8005 56.4485 9 50.0000 75.0000 75.0000 37.5774 46.2355 56.7606 10 12.5000 0.00000 0.00000 1.58591 1.30210 1.02745 11 10.4167 10.4167 10.4167 2.00521 2.05749 2.15195 12 25.0000 0.00000 0.00000 3.07728 2.07105 1.09734 13 31.2500 0.00000 0.00000 4.24932 2.67536 1.15226 14 37.5000 0.00000 0.00000 5.73696 3.44239 1.22197 15 43.7500 0.00000 0.00000 7.56070 4.38272 1.30742 16 50.0000 0.00000 0.00000 9.73934 5.50603 1.40951 17 62.5000 37.5000 62.5000 25.5656 19.0418 35.8409 18 87.5000 37.5000 62.5000 41.5030 27.2592 36.5877 19 0.00000 0.00000 0.00000 1.00000 1.00000 1.00000 20 75.0000 0.00000 0.00000 22.3346 12.0002 1.99970 21 81.2500 0.00000 0.00000 26.5283 14.1625 2.19621 22 87.5000 0.00000 0.00000 31.1672 16.5543 2.41358 23 93.7500 0.00000 0.00000 36.2638 19.1821 2.65240 24 100.000 0.00000 0.00000 41.8302 22.0522 2.91323 25 62.5000 62.5000 12.5000 27.8253 33.1142 7.13058 26 75.0000 75.0000 50.0000 44.6598 50.5248 28.3139 27 8.33333 8.33333 8.33333 1.71786 1.75519 1.82265 28 0.00000 12.5000 0.00000 1.50806 2.01598 1.16935 29 0.00000 43.7500 0.00000 6.68900 12.3764 2.89635 30 0.00000 50.0000 0.00000 8.57817 16.1542 3.52608 31 0.00000 56.2500 0.00000 10.7902 20.5776 4.26342 32 0.00000 62.5000 0.00000 13.3391 25.6747 5.11306 33 12.5000 62.5000 37.5000 15.9983 26.8060 16.0610 34 0.00000 0.00000 0.00000 1.00000 1.00000 1.00000 35 0.00000 6.25000 0.00000 1.18254 1.36502 1.06085 36 0.00000 75.0000 0.00000 19.5000 37.9948 7.16671 37 0.00000 81.2500 0.00000 23.1365 45.2667 8.37888 38 0.00000 87.5000 0.00000 27.1590 53.3106 9.71972 39 0.00000 93.7500 0.00000 31.5784 62.1482 11.1929 40 0.00000 100.000 0.00000 36.4052 71.8005 12.8018 41 6.25000 6.25000 6.25000 1.48518 1.51041 1.55601 42 0.00000 0.00000 12.5000 1.25645 1.10256 2.35074 43 0.00000 0.00000 18.7500 1.52439 1.20972 3.76201 44 0.00000 0.00000 25.0000 1.90921 1.36363 5.78891 45 0.00000 0.00000 31.2500 2.42221 1.56879 8.49092 46 0.00000 0.00000 37.5000 3.07334 1.82920 11.9205 47 0.00000 0.00000 43.7500 3.87158 2.14845 16.1249 48 0.00000 0.00000 50.0000 4.82515 2.52982 21.1475 49 0.00000 0.00000 56.2500 5.94168 2.97636 27.0283 50 0.00000 0.00000 62.5000 7.22826 3.49091 33.8049 51 0.00000 0.00000 68.7500 8.69161 4.07616 41.5125 52 0.00000 0.00000 75.0000 10.3380 4.73463 50.1844 53 0.00000 0.00000 81.2500 12.1736 5.46873 59.8524 54 0.00000 0.00000 87.5000 14.2040 6.28076 70.5467 55 0.00000 0.00000 93.7500 16.4347 7.17291 82.2963 56 0.00000 0.00000 100.000 18.8711 8.14731 95.1290 57 0.00000 50.0000 100.000 26.4493 23.3015 97.6550 58 75.0000 50.0000 100.000 47.7839 34.3017 98.6547 59 0.00000 0.00000 6.25000 1.09214 1.03685 1.48530 60 2.08333 2.08333 2.08333 1.15175 1.15964 1.17390 61 4.16667 4.16667 4.16667 1.30372 1.31952 1.34806 62 12.5000 12.5000 12.5000 2.35042 2.42064 2.54755 63 14.5833 14.5833 14.5833 2.75638 2.84772 3.01278 64 16.6667 16.6667 16.6667 3.22584 3.34159 3.55077 65 18.7500 18.7500 18.7500 3.76135 3.90494 4.16445 66 20.8333 20.8333 20.8333 4.36533 4.54033 4.85660 67 22.9167 22.9167 22.9167 5.04007 5.25016 5.62984 68 25.0000 25.0000 25.0000 5.78777 6.03673 6.48668 69 27.0833 27.0833 27.0833 6.61052 6.90226 7.42953 70 29.1667 29.1667 29.1667 7.51032 7.84886 8.46069 71 31.2500 31.2500 31.2500 8.48913 8.87856 9.58238 72 6.25000 0.00000 0.00000 1.21051 1.10854 1.00986 73 33.3333 33.3333 33.3333 9.54879 9.99333 10.7967 74 35.4167 35.4167 35.4167 10.6911 11.1951 12.1058 75 39.5833 39.5833 39.5833 13.2307 13.8667 15.0161 76 41.6667 41.6667 41.6667 14.6313 15.3402 16.6212 77 43.7500 43.7500 43.7500 16.1213 16.9076 18.3287 78 45.8333 45.8333 45.8333 17.7021 18.5707 20.1403 79 47.9167 47.9167 47.9167 19.3754 20.3310 22.0579 80 50.0000 50.0000 50.0000 21.1427 22.1901 24.0831 81 52.0833 52.0833 52.0833 23.0052 24.1495 26.2175 82 54.1667 54.1667 54.1667 24.9646 26.2107 28.4629 83 56.2500 56.2500 56.2500 27.0221 28.3752 30.8208 84 58.3333 58.3333 58.3333 29.1791 30.6444 33.2927 85 60.4167 60.4167 60.4167 31.4370 33.0197 35.8802 86 62.5000 62.5000 62.5000 33.7971 35.5025 38.5847 87 64.5833 64.5833 64.5833 36.2605 38.0941 41.4078 88 66.6667 66.6667 66.6667 38.8287 40.7958 44.3509 89 68.7500 68.7500 68.7500 41.5028 43.6089 47.4154 90 70.8333 70.8333 70.8333 44.2840 46.5348 50.6026 91 72.9167 72.9167 72.9167 47.1736 49.5746 53.9140 92 75.0000 75.0000 75.0000 50.1727 52.7296 57.3508 93 77.0833 77.0833 77.0833 53.2824 56.0011 60.9145 94 79.1667 79.1667 79.1667 56.5039 59.3901 64.6063 95 81.2500 81.2500 81.2500 59.8383 62.8979 68.4275 96 83.3333 83.3333 83.3333 63.2868 66.5257 72.3793 97 85.4167 85.4167 85.4167 66.8503 70.2745 76.4631 98 87.5000 87.5000 87.5000 70.5301 74.1456 80.6800 99 89.5833 89.5833 89.5833 74.3270 78.1400 85.0312 100 91.6667 91.6667 91.6667 78.2423 82.2589 89.5180 101 93.7500 93.7500 93.7500 82.2769 86.5032 94.1415 102 95.8333 95.8333 95.8333 86.4317 90.8742 98.9029 103 97.9167 97.9167 97.9167 90.7080 95.3727 103.803 104 25.0000 25.0000 0.00000 4.87856 5.67311 1.69777 105 50.0000 25.0000 0.00000 11.5406 9.10808 2.00994 106 75.0000 25.0000 0.00000 24.1359 15.6023 2.60014 107 100.000 25.0000 0.00000 43.6314 25.6542 3.51366 108 100.000 75.0000 0.00000 60.3302 59.0470 9.07994 109 50.0000 50.0000 0.00000 17.3175 20.6603 3.93559 110 75.0000 50.0000 0.00000 29.9128 27.1544 4.52578 111 100.000 50.0000 0.00000 49.4083 37.2064 5.43931 112 100.000 100.000 100.000 95.1065 100.000 108.844 113 50.0000 75.0000 0.00000 28.2393 42.5008 7.57622 114 75.0000 75.0000 0.00000 40.8346 48.9950 8.16642 115 25.0000 75.0000 0.00000 21.5773 39.0658 7.26405 116 25.0000 100.000 0.00000 38.4825 72.8716 12.8992 117 50.0000 100.000 0.00000 45.1445 76.3065 13.2113 118 75.0000 100.000 0.00000 57.7399 82.8007 13.8015 119 100.000 100.000 0.00000 77.2354 92.8527 14.7151 120 25.0000 0.00000 25.0000 3.98649 2.43468 5.88625 121 50.0000 0.00000 25.0000 10.6485 5.86966 6.19842 122 75.0000 0.00000 25.0000 23.2439 12.3638 6.78862 123 75.0000 25.0000 25.0000 25.0451 15.9659 7.38905 124 87.5000 37.5000 37.5000 37.3481 25.5975 14.7033 125 56.2500 0.00000 0.00000 12.2903 6.82130 1.52904 126 100.000 0.00000 25.0000 42.7394 22.4158 7.70214 127 100.000 25.0000 25.0000 44.5407 26.0178 8.30257 128 100.000 25.0000 50.0000 47.4566 27.1840 23.6611 129 50.0000 25.0000 25.0000 12.4498 9.47171 6.79885 130 50.0000 50.0000 25.0000 18.2267 21.0239 8.72450 131 75.0000 50.0000 25.0000 30.8220 27.5181 9.31470 132 100.000 50.0000 25.0000 50.3176 37.5700 10.2282 133 25.0000 50.0000 25.0000 11.5647 17.5889 8.41233 134 25.0000 75.0000 25.0000 22.4865 39.4295 12.0530 135 50.0000 75.0000 25.0000 29.1485 42.8645 12.3651 136 75.0000 75.0000 25.0000 41.7438 49.3586 12.9553 137 100.000 75.0000 25.0000 61.2394 59.4106 13.8689 138 25.0000 50.0000 0.00000 10.6555 17.2253 3.62342 139 25.0000 100.000 25.0000 39.3917 73.2352 17.6881 140 50.0000 100.000 25.0000 46.0538 76.6702 18.0003 141 75.0000 100.000 25.0000 58.6491 83.1644 18.5905 142 100.000 100.000 25.0000 78.1446 93.2163 19.5040 143 25.0000 0.00000 50.0000 6.90243 3.60087 21.2448 144 50.0000 0.00000 50.0000 13.5645 7.03585 21.5570 145 75.0000 0.00000 50.0000 26.1598 13.5300 22.1472 146 100.000 0.00000 50.0000 45.6553 23.5820 23.0607 147 100.000 50.0000 75.0000 58.7464 40.9410 54.6237 148 100.000 50.0000 100.000 67.2794 44.3537 99.5683 149 50.0000 25.0000 50.0000 15.3658 10.6379 22.1574 150 75.0000 25.0000 50.0000 27.9611 17.1321 22.7476 151 100.000 25.0000 75.0000 52.9695 29.3888 52.6981 152 25.0000 25.0000 50.0000 8.70371 7.20292 21.8452 153 25.0000 50.0000 50.0000 14.4806 18.7551 23.7709 154 75.0000 50.0000 50.0000 33.7380 28.6843 24.6733 155 100.000 50.0000 50.0000 53.2335 38.7362 25.5868 156 100.000 75.0000 50.0000 64.1553 60.5768 29.2274 157 87.5000 62.5000 62.5000 49.7345 43.7199 39.3315 158 87.5000 87.5000 62.5000 63.5544 71.3558 43.9382 159 100.000 100.000 75.0000 86.5734 96.5873 63.8995 160 0.00000 68.7500 0.00000 16.2382 31.4721 6.07943 161 0.00000 100.000 25.0000 37.3144 72.1641 17.5907 162 0.00000 100.000 50.0000 40.2304 73.3303 32.9493 163 50.0000 100.000 50.0000 48.9697 77.8364 33.3588 164 75.0000 100.000 50.0000 61.5650 84.3305 33.9490 165 100.000 100.000 50.0000 81.0605 94.3825 34.8625 166 25.0000 0.00000 75.0000 12.4153 5.80568 50.2817 167 50.0000 0.00000 75.0000 19.0774 9.24066 50.5939 168 75.0000 0.00000 75.0000 31.6727 15.7348 51.1841 169 100.000 0.00000 75.0000 51.1682 25.7868 52.0976 170 100.000 0.00000 100.000 59.7013 29.1995 97.0422 171 25.0000 25.0000 75.0000 14.2166 9.40773 50.8822 172 50.0000 25.0000 75.0000 20.8787 12.8427 51.1944 173 75.0000 25.0000 75.0000 33.4740 19.3369 51.7845 174 0.00000 31.2500 0.00000 3.81760 6.63441 1.93921 175 0.00000 37.5000 0.00000 5.10758 9.21400 2.36920 176 25.0000 50.0000 75.0000 19.9935 20.9599 52.8078 177 50.0000 50.0000 75.0000 26.6555 24.3949 53.1200 178 75.0000 50.0000 75.0000 39.2509 30.8891 53.7102 179 100.000 75.0000 75.0000 69.6682 62.7816 58.2644 180 100.000 75.0000 100.000 78.2013 66.1943 103.209 181 0.00000 0.00000 0.00000 1.00000 1.00000 1.00000 182 12.5000 37.5000 37.5000 7.76682 10.3453 13.3171 183 25.0000 75.0000 50.0000 25.4024 40.5957 27.4115 184 25.0000 100.000 50.0000 42.3076 74.4014 33.0466 185 25.0000 100.000 75.0000 47.8205 76.6062 62.0836 186 50.0000 100.000 75.0000 54.4826 80.0412 62.3958 187 75.0000 100.000 75.0000 67.0779 86.5354 62.9859 188 100.000 100.000 100.000 95.1065 100.000 108.844 189 25.0000 0.00000 100.000 20.9484 9.21837 95.2263 190 50.0000 0.00000 100.000 27.6104 12.6533 95.5385 191 75.0000 0.00000 100.000 40.2058 19.1475 96.1287 192 75.0000 75.0000 100.000 58.7057 56.1423 102.295 193 0.00000 25.0000 100.000 20.6724 11.7494 95.7294 194 25.0000 25.0000 100.000 22.7497 12.8204 95.8267 195 50.0000 25.0000 100.000 29.4117 16.2554 96.1389 196 75.0000 25.0000 100.000 42.0070 22.7496 96.7291 197 100.000 25.0000 100.000 61.5026 32.8015 97.6426 198 0.00000 0.00000 0.00000 1.00000 1.00000 1.00000 199 25.0000 50.0000 100.000 28.5266 24.3726 97.7524 200 50.0000 50.0000 100.000 35.1886 27.8076 98.0645 201 50.0000 75.0000 100.000 46.1104 49.6481 101.705 202 12.5000 62.5000 62.5000 20.1532 28.4677 37.9454 203 12.5000 62.5000 87.5000 27.1290 31.2576 74.6872 204 25.0000 75.0000 100.000 39.4484 46.2132 101.393 205 0.00000 50.0000 50.0000 12.4033 17.6840 23.6735 206 0.00000 75.0000 75.0000 28.8380 41.7294 56.3511 207 0.00000 100.000 75.0000 45.7432 75.5351 61.9862 208 0.00000 100.000 100.000 54.2763 78.9478 106.931 209 25.0000 100.000 100.000 56.3536 80.0189 107.028 210 50.0000 100.000 100.000 63.0157 83.4539 107.340 211 75.0000 100.000 100.000 75.6110 89.9480 107.930 212 62.5000 0.00000 0.00000 15.2297 8.33690 1.66678 213 68.7500 0.00000 0.00000 18.5730 10.0607 1.82344 214 100.000 100.000 100.000 95.1065 100.000 108.844 215 0.00000 25.0000 0.00000 2.80128 4.60205 1.60043 216 37.5000 37.5000 12.5000 10.1010 11.7590 3.94191 217 62.5000 37.5000 12.5000 19.5938 16.6535 4.38672 218 87.5000 37.5000 12.5000 35.5312 24.8708 5.13352 219 37.5000 12.5000 12.5000 6.50147 4.56093 2.74206 220 62.5000 12.5000 12.5000 15.9942 9.45544 3.18687 221 87.5000 12.5000 12.5000 31.9317 17.6728 3.93367 222 87.5000 62.5000 12.5000 43.7627 41.3315 7.87738 223 37.5000 62.5000 12.5000 18.3325 28.2197 6.68576 224 37.5000 87.5000 12.5000 32.1524 55.8555 11.2924 225 62.5000 87.5000 12.5000 41.6451 60.7500 11.7372 226 87.5000 87.5000 12.5000 57.5826 68.9674 12.4840 227 12.5000 12.5000 37.5000 4.16730 3.14728 12.1173 228 37.5000 12.5000 37.5000 8.31836 5.28757 12.3118 229 62.5000 12.5000 37.5000 17.8111 10.1821 12.7566 230 87.5000 12.5000 37.5000 33.7486 18.3995 13.5034 231 87.5000 62.5000 37.5000 45.5796 42.0582 17.4471 232 62.5000 37.5000 37.5000 21.4106 17.3801 13.9565 233 62.5000 62.5000 37.5000 29.6421 33.8408 16.7003 234 37.5000 37.5000 37.5000 11.9179 12.4856 13.5116 235 37.5000 62.5000 37.5000 20.1494 28.9463 16.2555 236 50.0000 75.0000 50.0000 32.0645 44.0306 27.7237 237 12.5000 87.5000 12.5000 28.0013 53.7152 11.0979 238 12.5000 87.5000 37.5000 29.8182 54.4419 20.6677 239 37.5000 87.5000 37.5000 33.9692 56.5822 20.8622 240 62.5000 87.5000 37.5000 43.4620 61.4767 21.3070 241 87.5000 87.5000 37.5000 59.3994 69.6941 22.0538 242 18.7500 0.00000 0.00000 2.19807 1.61773 1.05614 243 37.5000 12.5000 62.5000 12.4733 6.94928 34.1962 244 62.5000 12.5000 62.5000 21.9661 11.8438 34.6410 245 87.5000 12.5000 62.5000 37.9035 20.0612 35.3878 246 87.5000 12.5000 87.5000 44.8792 22.8510 72.1296 247 87.5000 37.5000 87.5000 48.4787 30.0490 73.3295 248 87.5000 62.5000 87.5000 56.7102 46.5097 76.0733 249 0.00000 18.7500 0.00000 2.03889 3.07749 1.34630 250 0.00000 50.0000 25.0000 9.48738 16.5179 8.31499 251 0.00000 75.0000 25.0000 20.4092 38.3584 11.9556 252 0.00000 75.0000 50.0000 23.3251 39.5246 27.3142 253 12.5000 87.5000 62.5000 33.9731 56.1036 42.5521 254 37.5000 87.5000 62.5000 38.1242 58.2439 42.7466 255 62.5000 87.5000 62.5000 47.6169 63.1384 43.1914 256 12.5000 12.5000 62.5000 8.32223 4.80899 34.0017 257 12.5000 12.5000 87.5000 15.2979 7.59883 70.7435 258 37.5000 12.5000 87.5000 19.4490 9.73913 70.9380 259 62.5000 12.5000 87.5000 28.9418 14.6336 71.3828 260 12.5000 37.5000 62.5000 11.9217 12.0070 35.2016 261 12.5000 37.5000 87.5000 18.8975 14.7969 71.9433 262 37.5000 37.5000 87.5000 23.0485 16.9371 72.1379 263 62.5000 37.5000 87.5000 32.5413 21.8317 72.5827 264 37.5000 37.5000 62.5000 16.0728 14.1473 35.3961 265 37.5000 62.5000 62.5000 24.3043 30.6080 38.1399 266 37.5000 62.5000 87.5000 31.2800 33.3978 74.8817 267 62.5000 62.5000 87.5000 40.7728 38.2924 75.3265 268 62.5000 87.5000 87.5000 54.5927 65.9282 79.9332 269 0.00000 25.0000 75.0000 12.1393 8.33668 50.7848 270 0.00000 50.0000 75.0000 17.9162 19.8888 52.7105 271 0.00000 75.0000 100.000 37.3711 45.1421 101.296 END_DATA CTI1 ORIGINATOR "Argyll targen" KEYWORD "DENSITY_EXTREME_VALUES" DENSITY_EXTREME_VALUES "8" CREATED "October 19, 2013" DESCRIPTOR "Argyll Calibration Target chart information 1" KEYWORD "INDEX" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT INDEX RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 8 BEGIN_DATA 0 100.000 100.000 100.000 95.1065 100.000 108.844 1 0.00000 47.3607 100.000 25.6130 21.6292 97.3763 2 100.000 0.00000 79.3514 52.4258 26.2898 58.7215 3 0.00000 0.00000 58.9971 6.48583 3.19399 29.8944 4 100.000 66.6593 0.00000 56.0588 50.5054 7.65614 5 0.00000 35.6011 0.00000 4.68562 8.37021 2.22855 6 84.4444 0.00000 0.00000 28.8428 15.3558 2.30466 7 0.00000 0.00000 0.00000 1.00000 1.00000 1.00000 END_DATA CTI1 ORIGINATOR "Argyll targen" CREATED "October 19, 2013" DESCRIPTOR "Argyll Calibration Target chart information 1" KEYWORD "DEVICE_COMBINATION_VALUES" DEVICE_COMBINATION_VALUES "9" KEYWORD "INDEX" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT INDEX RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 9 BEGIN_DATA 0 100.000 100.000 100.000 95.1065 100.000 108.844 1 0.00000 100.000 100.000 54.2763 78.9478 106.931 2 100.000 0.00000 100.000 59.7013 29.1995 97.0422 3 0.00000 0.00000 100.000 18.8711 8.14731 95.1290 4 100.000 100.000 0.00000 77.2354 92.8527 14.7151 5 0.00000 100.000 0.00000 36.4052 71.8005 12.8018 6 100.000 0.00000 0.00000 41.8302 22.0522 2.91323 7 0.00000 0.00000 0.00000 1.00000 1.00000 1.00000 8 50.0000 50.0000 50.0000 21.1427 22.1901 24.0831 END_DATADisplayCAL-3.1.0.0/DisplayCAL/trash.py0000644000076500000000000000726512647526531017137 0ustar devwheel00000000000000# -*- coding: utf-8 -*- import sys import os if sys.platform == "win32": from win32com.shell import shell, shellcon import pythoncom import win32api def recycle(path): path = os.path.join(win32api.GetShortPathName(os.path.split(path)[0]), os.path.split(path)[1]) if len(path) > 259: path = win32api.GetShortPathName(path) if path.startswith("\\\\?\\") and len(path) < 260: path = path[4:] if (hasattr(shell, "CLSID_FileOperation") and hasattr(shell, "IID_IFileOperation")): # Vista and later fo = pythoncom.CoCreateInstance(shell.CLSID_FileOperation, None, pythoncom.CLSCTX_ALL, shell.IID_IFileOperation) fo.SetOperationFlags(shellcon.FOF_ALLOWUNDO | shellcon.FOF_NOCONFIRMATION | shellcon.FOF_RENAMEONCOLLISION | shellcon.FOF_SILENT) try: item = shell.SHCreateItemFromParsingName(path, None, shell.IID_IShellItem) fo.DeleteItem(item) success = fo.PerformOperations() is None aborted = fo.GetAnyOperationsAborted() except pythoncom.com_error, exception: raise TrashAborted(-1) else: # XP retcode, aborted = shell.SHFileOperation((0, shellcon.FO_DELETE, path, "", shellcon.FOF_ALLOWUNDO | shellcon.FOF_NOCONFIRMATION | shellcon.FOF_RENAMEONCOLLISION | shellcon.FOF_SILENT, None, None)) success = retcode == 0 if aborted: raise TrashAborted(aborted) return success and not aborted else: from time import strftime from urllib import quote import shutil from util_os import getenvu, expanduseru class TrashAborted(Exception): pass class TrashcanUnavailableError(Exception): pass def trash(paths): """ Move files and folders to the trash. If a trashcan facility does not exist, do not touch the files. Return a list of successfully processed paths. """ if isinstance(paths, (str, unicode)): paths = [paths] if not isinstance(paths, list): raise TypeError(str(type(paths)) + " is not list") deleted = [] if sys.platform == "win32": for path in paths: path = os.path.abspath(path) if not os.path.exists(path): raise IOError("No such file or directory: " + path) if recycle(path): deleted.append(path) else: # http://freedesktop.org/wiki/Specifications/trash-spec trashroot = os.path.join(getenvu("XDG_DATA_HOME", os.path.join(expanduseru("~"), ".local", "share")), "Trash") trashinfo = os.path.join(trashroot, "info") # Older Linux distros and Mac OS X trashcan = os.path.join(expanduseru("~"), ".Trash") if sys.platform != "darwin" and not os.path.isdir(trashcan): # Modern Linux distros trashcan = os.path.join(trashroot, "files") if not os.path.isdir(trashcan): try: os.makedirs(trashcan) except OSError: raise TrashcanUnavailableError("Not a directory: '%s'" % trashcan) for path in paths: if os.path.isdir(trashcan): n = 1 dst = os.path.join(trashcan, os.path.basename(path)) while os.path.exists(dst): # avoid name clashes n += 1 dst = os.path.join(trashcan, os.path.basename(path) + "." + str(n)) if os.path.isdir(trashinfo): info = open(os.path.join(trashinfo, os.path.basename(dst) + ".trashinfo"), "w") info.write("[Trash Info]\n") info.write("Path=%s\n" % quote(path.encode(sys.getfilesystemencoding()))) info.write("DeletionDate=" + strftime("%Y-%m-%dT%H:%M:%S")) info.close() shutil.move(path, dst) else: # if trashcan does not exist, simply delete file/folder? pass # if os.path.isdir(path) and not os.path.islink(path): # shutil.rmtree(path) # else: # os.remove(path) deleted.append(path) return deleted DisplayCAL-3.1.0.0/DisplayCAL/util_decimal.py0000644000076500000000000000124112647526531020435 0ustar devwheel00000000000000# -*- coding: utf-8 -*- import decimal import math def float2dec(f, digits=10): parts = str(f).split(".") if len(parts) > 1: if parts[1][:digits] == "9" * digits: f = math.ceil(f) elif parts[1][:digits] == "0" * digits: f = math.floor(f) return decimal.Decimal(str(f)) def stripzeros(n): """ Strip zeros and convert to decimal. Will always return the shortest decimal representation (1.0 becomes 1, 1.234567890 becomes 1.23456789). """ if isinstance(n, (float, int)): n = "%.10f" % n else: n = str(n) if "." in n: n = n.rstrip("0").rstrip(".") try: n = decimal.Decimal(n) except decimal.InvalidOperation, exception: pass return n DisplayCAL-3.1.0.0/DisplayCAL/util_http.py0000644000076500000000000000402112647526531020015 0ustar devwheel00000000000000# -*- coding: utf-8 -*- # http://code.activestate.com/recipes/146306-http-client-to-post-using-multipartform-data/ import httplib import mimetypes import uuid def post_multipart(host, selector, fields, files, charset="UTF-8"): """ Post fields and files to an http host as multipart/form-data. fields is a sequence of (name, value) elements for regular form fields. files is a sequence of (name, filename, value) elements for data to be uploaded as files Return the server's response page. """ content_type, body = encode_multipart_formdata(fields, files, charset) h = httplib.HTTPConnection(host) h.putrequest('POST', selector) h.putheader('Content-Type', content_type) h.putheader('Content-Length', str(len(body))) h.endheaders() h.send(body) resp = h.getresponse() return resp.read() def encode_multipart_formdata(fields, files, charset="UTF-8"): """ fields is a sequence of (name, value) elements for regular form fields. files is a sequence of (name, filename, value) elements for data to be uploaded as files Return (content_type, body) ready for httplib.HTTP instance """ BOUNDARY = '----=_NextPart_%s' % uuid.uuid1() CRLF = '\r\n' L = [] for (key, value) in fields: L.append('--' + BOUNDARY) L.append('Content-Disposition: form-data; name="%s"' % key) L.append('Content-Type: text/plain; charset=%s' % charset) L.append('') L.append(value.encode(charset)) for (key, filename, value) in files: L.append('--' + BOUNDARY) L.append('Content-Disposition: form-data; name="%s"; filename="%s"' % (key, filename)) L.append('Content-Type: %s' % get_content_type(filename)) L.append('') L.append(value) L.append('--' + BOUNDARY + '--') L.append('') body = CRLF.join(L) content_type = 'multipart/form-data; boundary=%s' % BOUNDARY return content_type, body def get_content_type(filename): return mimetypes.guess_type(filename)[0] or 'application/octet-stream' DisplayCAL-3.1.0.0/DisplayCAL/util_io.py0000644000076500000000000001414512647526531017455 0ustar devwheel00000000000000# -*- coding: utf-8 -*- import copy import gzip import operator import os import sys import tarfile from StringIO import StringIO from time import time from safe_print import safe_print from util_str import universal_newlines class EncodedWriter(object): """ Decode data with data_encoding and encode it with file_encoding before writing it to file_obj. Either data_encoding or file_encoding can be None. """ def __init__(self, file_obj, data_encoding=None, file_encoding=None, errors="replace"): self.file = file_obj self.data_encoding = data_encoding self.file_encoding = file_encoding self.errors = errors def __getattr__(self, name): return getattr(self.file, name) def write(self, data): if self.data_encoding and not isinstance(data, unicode): data = data.decode(self.data_encoding, self.errors) if self.file_encoding and isinstance(data, unicode): data = data.encode(self.file_encoding, self.errors) self.file.write(data) class Files(): """ Read and/or write from/to several files at once. """ def __init__(self, files, mode="r"): """ Return a Files object. files must be a list or tuple of file objects or filenames (the mode parameter is only used in the latter case). """ self.files = [] for item in files: if isinstance(item, basestring): self.files.append(open(item, mode)) else: self.files.append(item) def __iter__(self): return iter(self.files) def close(self): for item in self.files: item.close() def flush(self): for item in self.files: item.flush() def seek(self, pos, mode=0): for item in self.files: item.seek(pos, mode) def truncate(self, size=None): for item in self.files: item.truncate(size) def write(self, data): for item in self.files: item.write(data) def writelines(self, str_sequence): self.write("".join(str_sequence)) class GzipFileProper(gzip.GzipFile): """ Proper GZIP file implementation, where the optional filename in the header has directory components removed, and is converted to ISO 8859-1 (Latin-1). On Windows, the filename will also be forced to lowercase. See RFC 1952 GZIP File Format Specification version 4.3 """ def _write_gzip_header(self): self.fileobj.write('\037\213') # magic header self.fileobj.write('\010') # compression method fname = os.path.basename(self.name) if fname.endswith(".gz"): fname = fname[:-3] elif fname.endswith(".tgz"): fname = "%s.tar" % fname[:-4] elif fname.endswith(".wrz"): fname = "%s.wrl" % fname[:-4] flags = 0 if fname: flags = gzip.FNAME self.fileobj.write(chr(flags)) gzip.write32u(self.fileobj, long(time())) self.fileobj.write('\002') self.fileobj.write('\377') if fname: if sys.platform == "win32": # Windows is case insensitive by default (although it can be # set to case sensitive), so according to the GZIP spec, we # force the name to lowercase fname = fname.lower() self.fileobj.write(fname.encode("ISO-8859-1", "replace") .replace("?", "_") + '\000') def __enter__(self): return self def __exit__(self, type, value, tb): self.close() class StringIOu(StringIO): """ StringIO which converts all new line formats in buf to POSIX newlines. """ def __init__(self, buf=''): StringIO.__init__(self, universal_newlines(buf)) class Tee(Files): """ Write to a file and stdout. """ def __init__(self, file_obj): Files.__init__((sys.stdout, file_obj)) def __getattr__(self, name): return getattr(self.files[1], name) def close(self): self.files[1].close() def seek(self, pos, mode=0): return self.files[1].seek(pos, mode) def truncate(self, size=None): return self.files[1].truncate(size) class TarFileProper(tarfile.TarFile): """ Support extracting to unicode location and using base name """ def extract(self, member, path="", full=True): """Extract a member from the archive to the current working directory, using its full name or base name. Its file information is extracted as accurately as possible. `member' may be a filename or a TarInfo object. You can specify a different directory using `path'. """ self._check("r") if isinstance(member, basestring): tarinfo = self.getmember(member) else: tarinfo = member # Prepare the link target for makelink(). if tarinfo.islnk(): name = tarinfo.linkname.decode(self.encoding) if not full: name = os.path.basename(name) tarinfo._link_target = os.path.join(path, name) try: name = tarinfo.name.decode(self.encoding) if not full: name = os.path.basename(name) self._extract_member(tarinfo, os.path.join(path, name)) except EnvironmentError, e: if self.errorlevel > 0: raise else: if e.filename is None: self._dbg(1, "tarfile: %s" % e.strerror) else: self._dbg(1, "tarfile: %s %r" % (e.strerror, e.filename)) except ExtractError, e: if self.errorlevel > 1: raise else: self._dbg(1, "tarfile: %s" % e) def extractall(self, path=".", members=None, full=True): """Extract all members from the archive to the current working directory and set owner, modification time and permissions on directories afterwards. `path' specifies a different directory to extract to. `members' is optional and must be a subset of the list returned by getmembers(). """ directories = [] if members is None: members = self for tarinfo in members: if tarinfo.isdir(): # Extract directories with a safe mode. directories.append(tarinfo) tarinfo = copy.copy(tarinfo) tarinfo.mode = 0700 self.extract(tarinfo, path, full) # Reverse sort directories. directories.sort(key=operator.attrgetter('name')) directories.reverse() # Set correct owner, mtime and filemode on directories. for tarinfo in directories: name = tarinfo.name.decode(self.encoding) if not full: name = os.path.basename(name) dirpath = os.path.join(path, name) try: self.chown(tarinfo, dirpath) self.utime(tarinfo, dirpath) self.chmod(tarinfo, dirpath) except ExtractError, e: if self.errorlevel > 1: raise else: self._dbg(1, "tarfile: %s" % e) DisplayCAL-3.1.0.0/DisplayCAL/util_list.py0000644000076500000000000000343012647526531020014 0ustar devwheel00000000000000# -*- coding: utf-8 -*- import re def floatlist(alist): """ Convert all list items to floats (0.0 on error) """ result = [] for item in alist: try: result.append(float(item)) except ValueError: result.append(0.0) return result def index_ignorecase(self, value, start = None, stop = None): """ Case-insensitive version of list.index """ items = [(item.lower() if isinstance(item, (str, unicode)) else item) for item in self] return items.index(value, start or 0, stop or len(self)) def index_fallback_ignorecase(self, value, start = None, stop = None): """ Return index of value in list. Prefer a case-sensitive match. """ if value in self: return self.index(value, start or 0, stop or len(self)) return index_ignorecase(self, value, start or 0, stop or len(self)) def intlist(alist): """ Convert all list items to ints (0 on error) """ result = [] for item in alist: try: result.append(int(item)) except ValueError: result.append(0) return result def natsort(list_in): """ Sort a list which (also) contains integers naturally. """ list_out = [] # decorate alphanumeric = re.compile("\D+|\d+") numeric = re.compile("^\d+$") for i in list_in: match = alphanumeric.findall(i) tmp = [] for j in match: if numeric.match(j): tmp.append((int(j), j)) else: tmp.append((j, None)) list_out.append(tmp) list_out.sort(key=lambda item: [((v.lower() if isinstance(v, basestring) else v), j) for v, j in item]) list_in = list_out list_out = [] # undecorate for i in list_in: tmp = [] for j in i: if type(j[0]) in (int, long): tmp.append(j[1]) else: tmp.append(j[0]) list_out.append("".join(tmp)) return list_out def strlist(alist): """ Convert all list items to strings """ return [str(item) for item in alist] DisplayCAL-3.1.0.0/DisplayCAL/util_mac.py0000644000076500000000000000500712647526531017603 0ustar devwheel00000000000000# -*- coding: utf-8 -*- import subprocess as sp from time import sleep from meta import name as appname from options import verbose def get_osascript_args(applescript): """ Return arguments ready to use for osascript """ if isinstance(applescript, basestring): applescript = applescript.splitlines() args = [] for line in applescript: args.extend(['-e', line]) return args def get_osascript_args_or_run(applescript, run=True): """ Return arguments ready to use for osascript or run the AppleScript """ if run: return osascript(applescript) else: return get_osascript_args(applescript) def mac_app_activate(delay=0, mac_app_name="Finder"): """ Activate (show & bring to front) an application if it is running. """ applescript = [ 'if app "%s" is running then' % mac_app_name, # Use 'run script' to prevent the app activating upon script # compilation even if not running r'run script "tell app \"%s\" to activate"' % mac_app_name, 'end if' ] if delay: sleep(delay) return osascript(applescript) def mac_terminal_do_script(script=None, do=True): """ Run a script in Terminal. """ applescript = [ 'if app "Terminal" is running then', 'tell app "Terminal"', 'activate', 'do script ""', # Terminal is already running, open a new # window to make sure it is not blocked by # another process 'end tell', 'else', 'tell app "Terminal" to activate', # Terminal is not yet running, # launch & use first window 'end if' ] if script: applescript.extend([ 'tell app "Terminal"', 'do script "%s" in first window' % script.replace('"', '\\"'), 'end tell' ]) return get_osascript_args_or_run(applescript, script and do) def mac_terminal_set_colors(background="black", cursor="gray", text="gray", text_bold="gray", do=True): """ Set Terminal colors. """ applescript = [ 'tell app "Terminal"', 'set background color of first window to "%s"' % background, 'set cursor color of first window to "%s"' % cursor, 'set normal text color of first window to "%s"' % text, 'set bold text color of first window to "%s"' % text_bold, 'end tell' ] return get_osascript_args_or_run(applescript, do) def osascript(applescript): """ Run AppleScript with the 'osascript' command Return osascript's exit code. """ args = get_osascript_args(applescript) p = sp.Popen(['osascript'] + args, stdin=sp.PIPE, stdout=sp.PIPE, stderr=sp.PIPE) output, errors = p.communicate() retcode = p.wait() return retcode, output, errors DisplayCAL-3.1.0.0/DisplayCAL/util_os.py0000644000076500000000000003727312653526636017501 0ustar devwheel00000000000000# -*- coding: utf-8 -*- import glob import locale import os import re import shutil import subprocess as sp import sys import tempfile from os.path import join if sys.platform == "win32": import ctypes from win32file import * from winioctlcon import FSCTL_GET_REPARSE_POINT FILE_ATTRIBUTE_REPARSE_POINT = 1024 SYMBOLIC_LINK = 'symbolic' MOUNTPOINT = 'mountpoint' GENERIC = 'generic' from encoding import get_encodings fs_enc = get_encodings()[1] os._listdir = os.listdir if sys.platform == "win32": # Add support for long paths (> 260 chars) import __builtin__ import win32api __builtin__._open = __builtin__.open def open(path, *args, **kwargs): return __builtin__._open(make_win32_compatible_long_path(path), *args, **kwargs) __builtin__.open = open os._access = os.access def access(path, mode): return os._access(make_win32_compatible_long_path(path), mode) os.access = access os.path._exists = os.path.exists def exists(path): return os.path._exists(make_win32_compatible_long_path(path)) os.path.exists = exists os.path._isdir = os.path.isdir def isdir(path): return os.path._isdir(make_win32_compatible_long_path(path)) os.path.isdir = isdir os.path._isfile = os.path.isfile def isfile(path): return os.path._isfile(make_win32_compatible_long_path(path)) os.path.isfile = isfile def listdir(path): return os._listdir(make_win32_compatible_long_path(path)) os._lstat = os.lstat def lstat(path): return os._lstat(make_win32_compatible_long_path(path)) os.lstat = lstat os._mkdir = os.mkdir def mkdir(path, mode=0777): return os._mkdir(make_win32_compatible_long_path(path, 247), mode) os.mkdir = mkdir os._makedirs = os.makedirs def makedirs(path, mode=0777): return os._makedirs(make_win32_compatible_long_path(path, 247), mode) os.makedirs = makedirs os._remove = os.remove def remove(path): return os._remove(make_win32_compatible_long_path(path)) os.remove = remove os._rename = os.rename def rename(src, dst): src, dst = [make_win32_compatible_long_path(path) for path in (src, dst)] return os._rename(src, dst) os.rename = rename os._stat = os.stat def stat(path): return os._stat(make_win32_compatible_long_path(path)) os.stat = stat win32api._GetShortPathName = win32api.GetShortPathName def GetShortPathName(path): return win32api._GetShortPathName(make_win32_compatible_long_path(path)) win32api.GetShortPathName = GetShortPathName else: def listdir(path): paths = os._listdir(path) if isinstance(path, unicode): # Undecodable filenames will still be string objects. Ignore them. paths = filter(lambda path: isinstance(path, unicode), paths) return paths os.listdir = listdir def quote_args(args): """ Quote commandline arguments where needed. It quotes all arguments that contain spaces or any of the characters ^!$%&()[]{}=;'+,`~ """ args_out = [] for arg in args: if re.search("[\^!$%&()[\]{}=;'+,`~\s]", arg): arg = '"' + arg + '"' args_out.append(arg) return args_out def expanduseru(path): """ Unicode version of os.path.expanduser """ if sys.platform == "win32": # The code in this if-statement is copied from Python 2.7's expanduser # in ntpath.py, but uses getenvu() instead of os.environ[] if path[:1] != '~': return path i, n = 1, len(path) while i < n and path[i] not in '/\\': i = i + 1 if 'HOME' in os.environ: userhome = getenvu('HOME') elif 'USERPROFILE' in os.environ: userhome = getenvu('USERPROFILE') elif not 'HOMEPATH' in os.environ: return path else: try: drive = getenvu('HOMEDRIVE') except KeyError: drive = '' userhome = join(drive, getenvu('HOMEPATH')) if i != 1: #~user userhome = join(dirname(userhome), path[1:i]) return userhome + path[i:] return unicode(os.path.expanduser(path), fs_enc) def expandvarsu(path): """ Unicode version of os.path.expandvars """ if sys.platform == "win32": # The code in this if-statement is copied from Python 2.7's expandvars # in ntpath.py, but uses getenvu() instead of os.environ[] if '$' not in path and '%' not in path: return path import string varchars = string.ascii_letters + string.digits + '_-' res = '' index = 0 pathlen = len(path) while index < pathlen: c = path[index] if c == '\'': # no expansion within single quotes path = path[index + 1:] pathlen = len(path) try: index = path.index('\'') res = res + '\'' + path[:index + 1] except ValueError: res = res + path index = pathlen - 1 elif c == '%': # variable or '%' if path[index + 1:index + 2] == '%': res = res + c index = index + 1 else: path = path[index+1:] pathlen = len(path) try: index = path.index('%') except ValueError: res = res + '%' + path index = pathlen - 1 else: var = path[:index] if var in os.environ: res = res + getenvu(var) else: res = res + '%' + var + '%' elif c == '$': # variable or '$$' if path[index + 1:index + 2] == '$': res = res + c index = index + 1 elif path[index + 1:index + 2] == '{': path = path[index+2:] pathlen = len(path) try: index = path.index('}') var = path[:index] if var in os.environ: res = res + getenvu(var) else: res = res + '${' + var + '}' except ValueError: res = res + '${' + path index = pathlen - 1 else: var = '' index = index + 1 c = path[index:index + 1] while c != '' and c in varchars: var = var + c index = index + 1 c = path[index:index + 1] if var in os.environ: res = res + getenvu(var) else: res = res + '$' + var if c != '': index = index - 1 else: res = res + c index = index + 1 return res return unicode(os.path.expandvars(path), fs_enc) def get_program_file(name, foldername): """ Get path to program file """ if sys.platform == "win32": paths = getenvu("PATH", os.defpath).split(os.pathsep) paths += glob.glob(os.path.join(getenvu("PROGRAMFILES", ""), foldername)) paths += glob.glob(os.path.join(getenvu("PROGRAMW6432", ""), foldername)) exe_ext = ".exe" else: paths = None exe_ext = "" return which(name + exe_ext, paths=paths) def getenvu(name, default = None): """ Unicode version of os.getenv """ if sys.platform == "win32": name = unicode(name) # http://stackoverflow.com/questions/2608200/problems-with-umlauts-in-python-appdata-environvent-variable length = ctypes.windll.kernel32.GetEnvironmentVariableW(name, None, 0) if length == 0: return default buffer = ctypes.create_unicode_buffer(u'\0' * length) ctypes.windll.kernel32.GetEnvironmentVariableW(name, buffer, length) return buffer.value var = os.getenv(name, default) if isinstance(var, basestring): return var if isinstance(var, unicode) else unicode(var, fs_enc) def islink(path): """ Cross-platform islink implementation. Supports Windows NT symbolic links and reparse points. """ if sys.platform != "win32" or sys.getwindowsversion()[0] < 6: return os.path.islink(path) return bool(os.path.exists(path) and GetFileAttributes(path) & FILE_ATTRIBUTE_REPARSE_POINT == FILE_ATTRIBUTE_REPARSE_POINT) def is_superuser(): if sys.platform == "win32": if sys.getwindowsversion() >= (5, 1): return ctypes.windll.shell32.IsUserAnAdmin() else: try: return ctypes.windll.advpack.IsNTAdmin(0, 0) except Exception: return False else: return os.geteuid() == 0 def launch_file(filepath): """ Open a file with its assigned default app. Return tuple(returncode, stdout, stderr) or None if functionality not available """ filepath = filepath.encode(fs_enc) retcode = None kwargs = dict(stdin=sp.PIPE, stdout=sp.PIPE, stderr=sp.PIPE) if sys.platform == "darwin": retcode = sp.call(['open', filepath], **kwargs) elif sys.platform == "win32": # for win32, we could use os.startfile, but then we'd not be able # to return exitcode (does it matter?) kwargs = {} kwargs["startupinfo"] = sp.STARTUPINFO() kwargs["startupinfo"].dwFlags |= sp.STARTF_USESHOWWINDOW kwargs["startupinfo"].wShowWindow = sp.SW_HIDE kwargs["shell"] = True kwargs["close_fds"] = True retcode = sp.call('start "" /B "%s"' % filepath, **kwargs) elif which('xdg-open'): retcode = sp.call(['xdg-open', filepath], **kwargs) return retcode def listdir_re(path, rex = None): """ Filter directory contents through a regular expression """ files = os.listdir(path) if rex: rex = re.compile(rex, re.IGNORECASE) files = filter(rex.search, files) return files def make_win32_compatible_long_path(path, maxpath=259): if (sys.platform == "win32" and len(path) > maxpath and os.path.isabs(path) and not path.startswith("\\\\?\\")): path = "\\\\?\\" + path return path def movefile(src, dst, overwrite=True): """ Move a file to another location. dst can be a directory in which case a file with the same basename as src will be created in it. Set overwrite to True to make sure existing files are overwritten. """ if os.path.isdir(dst): dst = os.path.join(dst, os.path.basename(src)) if os.path.isfile(dst) and overwrite: os.remove(dst) shutil.move(src, dst) def putenvu(name, value): """ Unicode version of os.putenv (also correctly updates os.environ) """ if sys.platform == "win32" and isinstance(value, unicode): ctypes.windll.kernel32.SetEnvironmentVariableW(unicode(name), value) else: os.environ[name] = value.encode(fs_enc) def parse_reparse_buffer(original, reparse_type=SYMBOLIC_LINK): """ Implementing the below in Python: typedef struct _REPARSE_DATA_BUFFER { ULONG ReparseTag; USHORT ReparseDataLength; USHORT Reserved; union { struct { USHORT SubstituteNameOffset; USHORT SubstituteNameLength; USHORT PrintNameOffset; USHORT PrintNameLength; ULONG Flags; WCHAR PathBuffer[1]; } SymbolicLinkReparseBuffer; struct { USHORT SubstituteNameOffset; USHORT SubstituteNameLength; USHORT PrintNameOffset; USHORT PrintNameLength; WCHAR PathBuffer[1]; } MountPointReparseBuffer; struct { UCHAR DataBuffer[1]; } GenericReparseBuffer; } DUMMYUNIONNAME; } REPARSE_DATA_BUFFER, *PREPARSE_DATA_BUFFER; """ # Size of our data types SZULONG = 4 # sizeof(ULONG) SZUSHORT = 2 # sizeof(USHORT) # Our structure. # Probably a better way to iterate a dictionary in a particular order, # but I was in a hurry, unfortunately, so I used pkeys. buffer = { 'tag' : SZULONG, 'data_length' : SZUSHORT, 'reserved' : SZUSHORT, SYMBOLIC_LINK : { 'substitute_name_offset' : SZUSHORT, 'substitute_name_length' : SZUSHORT, 'print_name_offset' : SZUSHORT, 'print_name_length' : SZUSHORT, 'flags' : SZULONG, 'buffer' : u'', 'pkeys' : [ 'substitute_name_offset', 'substitute_name_length', 'print_name_offset', 'print_name_length', 'flags', ] }, MOUNTPOINT : { 'substitute_name_offset' : SZUSHORT, 'substitute_name_length' : SZUSHORT, 'print_name_offset' : SZUSHORT, 'print_name_length' : SZUSHORT, 'buffer' : u'', 'pkeys' : [ 'substitute_name_offset', 'substitute_name_length', 'print_name_offset', 'print_name_length', ] }, GENERIC : { 'pkeys' : [], 'buffer': '' } } # Header stuff buffer['tag'] = original[:SZULONG] buffer['data_length'] = original[SZULONG:SZUSHORT] buffer['reserved'] = original[SZULONG+SZUSHORT:SZUSHORT] original = original[8:] # Parsing k = reparse_type for c in buffer[k]['pkeys']: if type(buffer[k][c]) == int: sz = buffer[k][c] bytes = original[:sz] buffer[k][c] = 0 for b in bytes: n = ord(b) if n: buffer[k][c] += n original = original[sz:] # Using the offset and length's grabbed, we'll set the buffer. buffer[k]['buffer'] = original return buffer def readlink(path): """ Cross-platform implenentation of readlink. Supports Windows NT symbolic links and reparse points. """ if sys.platform != "win32": return os.readlink(path) # This wouldn't return true if the file didn't exist if not islink(path): # Mimic POSIX error raise OSError(22, 'Invalid argument', path) # Open the file correctly depending on the string type. if type(path) is unicode: createfilefn = CreateFileW else: createfilefn = CreateFile handle = CreateFile(path, GENERIC_READ, 0, None, OPEN_EXISTING, FILE_FLAG_OPEN_REPARSE_POINT, 0) # MAXIMUM_REPARSE_DATA_BUFFER_SIZE = 16384 = (16 * 1024) buffer = DeviceIoControl(handle, FSCTL_GET_REPARSE_POINT, None, 16 * 1024) # Above will return an ugly string (byte array), so we'll need to parse it. # But first, we'll close the handle to our file so we're not locking it anymore. CloseHandle(handle) # Minimum possible length (assuming that the length is bigger than 0) if len(buffer) < 9: return type(path)() # Parse and return our result. result = parse_reparse_buffer(buffer) offset = result[SYMBOLIC_LINK]['substitute_name_offset'] ending = offset + result[SYMBOLIC_LINK]['substitute_name_length'] rpath = result[SYMBOLIC_LINK]['buffer'][offset:ending].decode('UTF-16-LE') if len(rpath) > 4 and rpath[0:4] == '\\??\\': rpath = rpath[4:] return rpath def relpath(path, start): """ Return a relative version of a path """ path = os.path.abspath(path).split(os.path.sep) start = os.path.abspath(start).split(os.path.sep) if path == start: return "." elif path[:len(start)] == start: return os.path.sep.join(path[len(start):]) elif start[:len(path)] == path: return os.path.sep.join([".."] * (len(start) - len(path))) def waccess(path, mode): """ Test access to path """ if mode & os.R_OK: try: test = open(path, "rb") except EnvironmentError: return False test.close() if mode & os.W_OK: if os.path.isdir(path): dir = path else: dir = os.path.dirname(path) try: if os.path.isfile(path): test = open(path, "ab") else: test = tempfile.TemporaryFile(prefix=".", dir=dir) except EnvironmentError: return False test.close() if mode & os.X_OK: return os.access(path, mode) return True def which(executable, paths = None): """ Return the full path of executable """ if not paths: paths = getenvu("PATH", os.defpath).split(os.pathsep) for cur_dir in paths: filename = os.path.join(cur_dir, executable) if os.path.isfile(filename): try: # make sure file is actually executable if os.access(filename, os.X_OK): return filename except Exception, exception: pass return None def whereis(filename): for args in (["whereis", filename], ["locate", filename], ["ldconfig", "-p"]): try: p = sp.Popen(args, stdout=sp.PIPE) stdout, stderr = p.communicate() except: pass else: stdout_lines = stdout.strip().split(os.linesep) if args[0] == "ldconfig": for line in stdout_lines: if filename in line: return line.split("=>").pop().strip() else: result = stdout_lines.pop().split(":", 1).pop().strip() if result: return result if sys.platform == "win32" and sys.getwindowsversion() >= (6, ): class win64_disable_file_system_redirection: # http://code.activestate.com/recipes/578035-disable-file-system-redirector/ r""" Disable Windows File System Redirection. When a 32 bit program runs on a 64 bit Windows the paths to C:\Windows\System32 automatically get redirected to the 32 bit version (C:\Windows\SysWow64), if you really do need to access the contents of System32, you need to disable the file system redirection first. """ _disable = ctypes.windll.kernel32.Wow64DisableWow64FsRedirection _revert = ctypes.windll.kernel32.Wow64RevertWow64FsRedirection def __enter__(self): self.old_value = ctypes.c_long() self.success = self._disable(ctypes.byref(self.old_value)) def __exit__(self, type, value, traceback): if self.success: self._revert(self.old_value) DisplayCAL-3.1.0.0/DisplayCAL/util_str.py0000644000076500000000000002326612650252610017646 0ustar devwheel00000000000000# -*- coding: utf-8 -*- import codecs import locale import string import sys try: from functools import reduce except ImportError: # Python < 2.6 pass env_errors = (EnvironmentError, ) if sys.platform == "win32": import pywintypes env_errors = env_errors + (pywintypes.error, ) from encoding import get_encodings fs_enc = get_encodings()[1] ascii_printable = "".join([getattr(string, name) for name in "digits", "ascii_letters", "punctuation", "whitespace"]) # Control chars are defined as charcodes in the decimal range 0-31 (inclusive) # except whitespace characters, plus charcode 127 (DEL) control_chars = "".join([chr(i) for i in range(0, 9) + range(14, 32) + [127]]) # Safe character substitution - can be used for filenames # i.e. no \/:*?"<>| will be added through substitution safesubst = {u"\u00a9": u"(C)", # U+00A9 copyright sign u"\u00ae": u"(R)", # U+00AE registered sign u"\u00b1": u"+-", u"\u00b2": u"^2", # U+00B2 superscript two u"\u00b3": u"^3", # U+00B3 superscript three u"\u00b9": u"^1", # U+00B9 superscript one u"\u00d7": u"x", # U+00D7 multiplication sign u"\u00df": u"ss", u"\u00e6": u"ae", u"\u0153": u"oe", u"\u0192": u"f", u"\u02dc": u"~", u"\u02c6": u"^", u"\u2010": u"-", u"\u2012": u"-", u"\u2013": u"-", # U+2013 en dash u"\u2014": u"--", # U+2014 em dash u"\u2015": u"---", # U+2015 horizontal bar u"\u2018": u"'", u"\u2019": u"'", u"\u201a": u",", u"\u201b": u"'", u"\u201e": u",,", u"\u2026": u"...", # U+2026 ellipsis u"\u2034": u"'''", u"\u203C": u"!!", u"\u2070": u"^0", u"\u2074": u"^4", u"\u2075": u"^5", u"\u2076": u"^6", u"\u2077": u"^7", u"\u2078": u"^8", u"\u2079": u"^9", u"\u20a7": u"Pts", u"\u20a8": u"Rs", u"\u2113": u"l", u"\u2116": u"No.", u"\u2117": u"(P)", u"\u2122": u"TM", u"\u2212": u"-", u"\u2260": u"!=", u"\u2776": u"(1)", u"\u2777": u"(2)", u"\u2778": u"(3)", u"\u2779": u"(4)", u"\u277a": u"(5)", u"\u277b": u"(6)", u"\u277c": u"(7)", u"\u277d": u"(8)", u"\u277e": u"(9)", u"\u277f": u"(10)", u"\ufb01": u"fi", u"\ufb02": u"fl",} # U+2212 minus sign # Extended character substitution - can NOT be used for filenames subst = dict(safesubst) subst.update({u"\u00a6": u"|", u"\u00ab": u"<<", u"\u00bb": u">>", u"\u00bc": u"1/4", u"\u00bd": u"1/2", u"\u00be": u"3/4", u"\u00f7": u":", u"\u201c": u"\x22", u"\u201d": u"\x22", u"\u201f": u"\x22", u"\u2039": u"<", u"\u203a": u">", u"\u2044": u"/", u"\u2105": u"c/o", u"\u2153": u"1/3", u"\u2154": u"2/3", u"\u215b": u"1/8", u"\u215c": u"3/8", u"\u215d": u"5/8", u"\u215e": u"7/8", u"\u2190": u"<-", u"\u2192": u"->", u"\u2194": u"<->", u"\u2264": u"<=", u"\u2265": u"=>",}) class StrList(list): """ It's a list. It's a string. It's a list of strings that behaves like a string! And like a list.""" def __init__(self, seq=tuple()): list.__init__(self, seq) def __iadd__(self, text): self.append(text) return self def __getattr__(self, attr): return getattr(str(self), attr) def __str__(self): return "".join(self) def asciize(obj): """ Turn several unicode chars into an ASCII representation. This function either takes a string or an exception as argument (when used as error handler for encode or decode). """ chars = u"" if isinstance(obj, Exception): for char in obj.object[obj.start:obj.end]: chars += subst.get(char, u"?") return chars, obj.end else: return obj.encode("ASCII", "asciize") codecs.register_error("asciize", asciize) def safe_asciize(obj): """ Turn several unicode chars into an ASCII representation. This function either takes a string or an exception as argument (when used as error handler for encode or decode). """ chars = u"" if isinstance(obj, Exception): for char in obj.object[obj.start:obj.end]: chars += safesubst.get(char, u"_") return chars, obj.end else: return obj.encode("ASCII", "safe_asciize") codecs.register_error("safe_asciize", safe_asciize) def escape(obj): """ Turn unicode chars into escape codes. This function either takes a string or an exception as argument (when used as error handler for encode or decode). """ chars = u"" if isinstance(obj, Exception): for char in obj.object[obj.start:obj.end]: chars += subst.get(char, u"\\u" % hex(ord(char))[2:]) return chars, obj.end else: return obj.encode("ASCII", "escape") codecs.register_error("escape", escape) def make_ascii_printable(text, subst=""): return "".join([char if char in ascii_printable else subst for char in text]) def center(text, width = None): """ Center (mono-spaced) text. If no width is given, the longest line (after breaking at each newline) is used as max width. """ text = text.split("\n") if width is None: width = 0 for line in text: if len(line) > width: width = len(line) i = 0 for line in text: text[i] = line.center(width) i += 1 return "\n".join(text) def create_replace_function(template, values): """ Create a replace function for use with e.g. re.sub """ def replace_function(match, template=template, values=values): for i, group in enumerate(match.groups()): template = template.replace("\\%i" % (i + 1), group) return template % values return replace_function def ellipsis(text, maxlen=64, pos="r"): """ Truncate text to maxlen characters and add elipsis if it was longer. Elipsis position can be 'm' (middle) or 'r' (right). """ if len(text) <= maxlen: return text if pos == "r": return text[:maxlen - 1] + u"\u2026" elif pos == "m": return text[:maxlen / 2] + u"\u2026" + text[-maxlen / 2 + 1:] def hexunescape(match): """ To be used with re.sub """ return unichr(int(match.group(1), 16)) def universal_newlines(txt): """ Return txt with all new line formats converted to POSIX newlines. """ return txt.replace("\r\n", "\n").replace("\r", "\n") def replace_control_chars(txt, replacement=" ", collapse=False): """ Replace all control characters. Default replacement character is ' ' (space). If the 'collapse' keyword argument evaluates to True, consecutive replacement characters are collapsed to a single one. """ txt = strtr(txt, dict(zip(control_chars, [replacement] * len(control_chars)))) if collapse: while replacement * 2 in txt: txt = txt.replace(replacement * 2, replacement) return txt def safe_basestring(obj): """ Return a unicode or string representation of obj Return obj if isinstance(obj, basestring). Otherwise, return unicode(obj), string(obj), or repr(obj), whichever succeeds first. """ if isinstance(obj, env_errors): # Possible variations of environment-type errors: # - instance with 'errno', 'strerror', 'filename' and 'args' attributes # (created by EnvironmentError with three arguments) # NOTE: The 'args' attribute will contain only the first two arguments # - instance with 'errno', 'strerror' and 'args' attributes # (created by EnvironmentError with two arguments) # - instance with just 'args' attribute # (created by EnvironmentError with one or more than three arguments) # - urllib2.URLError with empty 'args' attribute but 'reason' and # 'filename' attributes # - pywintypes.error with 'funcname', 'message', 'strerror', 'winerror' # and 'args' attributes if hasattr(obj, "reason"): if isinstance(obj.reason, basestring): obj.args = (obj.reason, ) else: obj.args = obj.reason error = [] if getattr(obj, "errno", None) is not None: error.append("[Errno %s]" % obj.errno) elif getattr(obj, "winerror", None) is not None: # pywintypes.error error.append("[Windows Errno %s]" % obj.winerror) if getattr(obj, "strerror", None) is not None: if getattr(obj, "filename", None) is not None: error.append(obj.strerror + ":") elif getattr(obj, "funcname", None) is not None: # pywintypes.error error.append(obj.funcname + ": " + obj.strerror) else: error.append(obj.strerror) if not error: error = list(obj.args) if getattr(obj, "filename", None) is not None: error.append(obj.filename) error = [safe_unicode(arg) for arg in error] obj = " ".join(error) if not isinstance(obj, basestring): try: obj = unicode(obj) except UnicodeDecodeError: try: obj = str(obj) except UnicodeEncodeError: obj = repr(obj) return obj def safe_str(obj, enc=fs_enc, errors="replace"): """ Return string representation of obj """ obj = safe_basestring(obj) if isinstance(obj, unicode): return obj.encode(enc, errors) else: return obj def safe_unicode(obj, enc=fs_enc, errors="replace"): """ Return unicode representation of obj """ obj = safe_basestring(obj) if isinstance(obj, unicode): return obj else: return obj.decode(enc, errors) def strtr(txt, replacements): """ String multi-replace, a bit like PHP's strtr. replacements can be a dict or a list. If it is a list, all items are replaced with the empty string (""). """ if hasattr(replacements, "iteritems"): replacements = replacements.iteritems() elif isinstance(replacements, basestring): replacements = zip(replacements, [""] * len(replacements)) for srch, sub in replacements: txt = txt.replace(srch, sub) return txt def wrap(text, width = 70): """ A word-wrap function that preserves existing line breaks and spaces. Expects that existing line breaks are posix newlines (\\n). """ return reduce(lambda line, word, width=width: '%s%s%s' % (line, ' \n'[(len(line)-line.rfind('\n')-1 + len(word.split('\n',1)[0] ) >= width)], word), text.split(' ') ) def test(): for k, v in subst.iteritems(): print k, v if __name__ == "__main__": test() DisplayCAL-3.1.0.0/DisplayCAL/util_win.py0000644000076500000000000002405212647526531017641 0ustar devwheel00000000000000# -*- coding: utf-8 -*- import ctypes import _winreg import struct import sys import pywintypes import win32api import win32con import win32process import winerror from ctypes import POINTER, byref, sizeof, windll from ctypes.wintypes import HANDLE, DWORD, LPWSTR if not hasattr(ctypes, "c_bool"): # Python 2.5 ctypes.c_bool = ctypes.c_int if sys.getwindowsversion() >= (6, ): LPDWORD = POINTER(DWORD) PROCESS_QUERY_LIMITED_INFORMATION = 0x1000 kernel32 = windll.kernel32 QueryFullProcessImageNameW = kernel32.QueryFullProcessImageNameW QueryFullProcessImageNameW.argtypes = [HANDLE, DWORD, LPWSTR, LPDWORD] QueryFullProcessImageNameW.restype = bool try: psapi = ctypes.windll.psapi except WindowsError: psapi = None # http://msdn.microsoft.com/en-us/library/dd183569%28v=vs.85%29.aspx DISPLAY_DEVICE_ACTIVE = 0x1 # DISPLAY_DEVICE_ACTIVE specifies whether a monitor is presented as being "on" by the respective GDI view. # Windows Vista: EnumDisplayDevices will only enumerate monitors that can be presented as being "on." DISPLAY_DEVICE_MIRRORING_DRIVER = 0x8 # Represents a pseudo device used to mirror application drawing for remoting or other purposes. # An invisible pseudo monitor is associated with this device. # For example, NetMeeting uses it. Note that GetSystemMetrics (SM_MONITORS) only accounts for visible display monitors. DISPLAY_DEVICE_MODESPRUNED = 0x8000000 # The device has more display modes than its output devices support. DISPLAY_DEVICE_PRIMARY_DEVICE = 0x4 # The primary desktop is on the device. # For a system with a single display card, this is always set. # For a system with multiple display cards, only one device can have this set. DISPLAY_DEVICE_REMOVABLE = 0x20 # The device is removable; it cannot be the primary display. DISPLAY_DEVICE_VGA_COMPATIBLE = 0x10 # The device is VGA compatible. DISPLAY_DEVICE_DISCONNECT = 0x2000000 DISPLAY_DEVICE_MULTI_DRIVER = 0x2 DISPLAY_DEVICE_REMOTE = 0x4000000 # Icm.h CLASS_MONITOR = struct.unpack("!L", "mntr")[0] CLASS_PRINTER = struct.unpack("!L", "prtr")[0] CLASS_SCANNER = struct.unpack("!L", "scnr")[0] def _get_icm_display_device_key(device): monkey = device.DeviceKey.split("\\")[-2:] # pun totally intended subkey = "\\".join(["Software", "Microsoft", "Windows NT", "CurrentVersion", "ICM", "ProfileAssociations", "Display"] + monkey) return _winreg.CreateKey(_winreg.HKEY_CURRENT_USER, subkey) def _get_mscms_dll_handle(): try: return ctypes.windll.mscms except WindowsError: return None def calibration_management_isenabled(): """ Check if calibration is enabled under Windows 7 """ if sys.getwindowsversion() < (6, 1): # Windows XP and Vista don't have calibration management return False if False: # Using registry - NEVER # Also, does not work! key = _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE, r"SOFTWARE\Microsoft\Windows NT\CurrentVersion\ICM\Calibration") return bool(_winreg.QueryValueEx(key, "CalibrationManagementEnabled")[0]) else: # Using ctypes mscms = _get_mscms_dll_handle() pbool = ctypes.pointer(ctypes.c_bool()) if not mscms or not mscms.WcsGetCalibrationManagementState(pbool): return return bool(pbool.contents) def disable_calibration_management(): """ Disable calibration loading under Windows 7 """ enable_calibration_management(False) def disable_per_user_profiles(display_no=0): """ Disable per user profiles under Vista/Windows 7 """ enable_per_user_profiles(False, display_no) def enable_calibration_management(enable=True): """ Enable calibration loading under Windows 7 """ if sys.getwindowsversion() < (6, 1): raise NotImplementedError("Calibration Management is only available " "in Windows 7 or later") if False: # Using registry - NEVER # Also, does not work! key = _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE, r"SOFTWARE\Microsoft\Windows NT\CurrentVersion\ICM\Calibration", _winreg.KEY_SET_VALUE) _winreg.SetValueEx(key, "CalibrationManagementEnabled", 0, _winreg.REG_DWORD, int(enable)) else: # Using ctypes (must be called with elevated permissions) mscms = _get_mscms_dll_handle() if not mscms: return False if not mscms.WcsSetCalibrationManagementState(enable): raise get_windows_error(ctypes.windll.kernel32.GetLastError()) return True def enable_per_user_profiles(enable=True, display_no=0): """ Enable per user profiles under Vista/Windows 7 """ if sys.getwindowsversion() < (6, ): # Windows XP doesn't have per-user profiles raise NotImplementedError("Per-user profiles are only available " "in Windows Vista, 7 or later") device = get_display_device(display_no) if device: if False: # Using registry - NEVER key = _get_icm_display_device_key(device) _winreg.SetValueEx(key, "UsePerUserProfiles", 0, _winreg.REG_DWORD, int(enable)) else: # Using ctypes mscms = _get_mscms_dll_handle() if not mscms: return False if not mscms.WcsSetUsePerUserProfiles(unicode(device.DeviceID), CLASS_MONITOR, enable): raise get_windows_error(ctypes.windll.kernel32.GetLastError()) return True def get_display_devices(devicename): """ Get all display devices of an output (there can be several) Return value: list of display devices Example usage: get_display_devices('\\\\.\\DISPLAY1') devicename = '\\\\.\\DISPLAYn' where n is a positive integer starting at 1 """ devices = [] n = 0 while True: try: devices.append(win32api.EnumDisplayDevices(devicename, n)) except pywintypes.error: break n += 1 return devices def get_active_display_device(devicename): """ Get active display device of an output (there can only be one per output) Return value: display device object or None Example usage: get_active_display_device('\\\\.\\DISPLAY1') devicename = '\\\\.\\DISPLAYn' where n is a positive integer starting at 1 """ devices = get_display_devices(devicename) for device in devices: if (device.StateFlags & DISPLAY_DEVICE_ACTIVE and (len(devices) == 1 or device.StateFlags & DISPLAY_DEVICE_MULTI_DRIVER)): return device def get_display_device(display_no=0): # The ordering will work as long as Argyll continues using # EnumDisplayMonitors monitors = get_real_display_devices_info() moninfo = monitors[display_no] # via win32api & registry return get_active_display_device(moninfo["Device"]) def get_process_filename(pid): if sys.getwindowsversion() >= (6, ): flags = PROCESS_QUERY_LIMITED_INFORMATION else: flags = win32con.PROCESS_QUERY_INFORMATION | win32con.PROCESS_VM_READ handle = win32api.OpenProcess(flags, False, pid) try: if sys.getwindowsversion() >= (6, ): dwSize = win32con.MAX_PATH while True: dwFlags = 0 # The name should use the Win32 path format lpdwSize = DWORD(dwSize) lpExeName = ctypes.create_unicode_buffer("", lpdwSize.value + 1) success = QueryFullProcessImageNameW(int(handle), dwFlags, lpExeName, byref(lpdwSize)) if success and 0 < lpdwSize.value < dwSize: break error = kernel32.GetLastError() if error != winerror.ERROR_INSUFFICIENT_BUFFER: raise ctypes.WinError(error) dwSize = dwSize + 256 if dwSize > 0x1000: # This prevents an infinite loop under Windows Server 2008 # if the path contains spaces, see # http://msdn.microsoft.com/en-us/library/ms684919(VS.85).aspx#4 raise ctypes.WinError(error) filename = lpExeName.value else: filename = win32process.GetModuleFileNameEx(handle, 0) finally: win32api.CloseHandle(handle) return filename def get_pids(): """ Get PIDs of all running processes """ pids_count = 1024 while True: pids = (DWORD * pids_count)() pids_size = sizeof(pids) bytes = DWORD() if not psapi.EnumProcesses(byref(pids), pids_size, byref(bytes)): raise get_windows_error(ctypes.windll.kernel32.GetLastError()) if bytes.value >= pids_size: pids_count *= 2 continue count = bytes.value / (pids_size / pids_count) return filter(None, pids[:count]) def get_real_display_devices_info(): """ Return info for real (non-virtual) devices """ # See Argyll source spectro/dispwin.c MonitorEnumProc, get_displays monitors = [] for monitor in win32api.EnumDisplayMonitors(None, None): try: moninfo = win32api.GetMonitorInfo(monitor[0]) except pywintypes.error: pass else: if moninfo and not moninfo["Device"].startswith("\\\\.\\DISPLAYV"): monitors.append(moninfo) return monitors def get_windows_error(errorcode): return ctypes.WinError(errorcode) def per_user_profiles_isenabled(display_no=0): """ Check if per user profiles is enabled under Vista/Windows 7 """ if sys.getwindowsversion() < (6, ): # Windows XP doesn't have per-user profiles return False device = get_display_device(display_no) if device: if False: # Using registry - NEVER key = _get_icm_display_device_key(device) return bool(_winreg.QueryValueEx(key, "UsePerUserProfiles")[0]) else: # Using ctypes mscms = _get_mscms_dll_handle() pbool = ctypes.pointer(ctypes.c_bool()) if not mscms or not mscms.WcsGetUsePerUserProfiles(unicode(device.DeviceID), CLASS_MONITOR, pbool): return return bool(pbool.contents) def win_ver(): """ Get Windows version info """ csd = sys.getwindowsversion()[-1] # Use the registry to get product name, e.g. 'Windows 7 Ultimate'. # Not recommended, but we don't care. pname = "Windows" key = None try: key = _winreg.OpenKeyEx(_winreg.HKEY_LOCAL_MACHINE, r"SOFTWARE\Microsoft\Windows NT\CurrentVersion") pname = _winreg.QueryValueEx(key, "ProductName")[0] except Exception, e: pass finally: if key: _winreg.CloseKey(key) return pname, csd if __name__ == "__main__": if "calibration" in sys.argv[1:]: if "enable" in sys.argv[1:] or "disable" in sys.argv[1:]: enable_calibration_management(sys.argv[1:][-1] != "disable") print calibration_management_isenabled() elif "per_user_profiles" in sys.argv[1:]: if "enable" in sys.argv[1:] or "disable" in sys.argv[1:]: enable_per_user_profiles(sys.argv[1:][-1] != "disable") print per_user_profiles_isenabled() DisplayCAL-3.1.0.0/DisplayCAL/util_x.py0000644000076500000000000000115212647526531017307 0ustar devwheel00000000000000# -*- coding: utf-8 -*- import os def get_display(): """ Parse $DISPLAY and return (hostname, display number, screen number) """ display = os.getenv("DISPLAY", ":0.0").split(":") hostname = display[0] if len(display) > 1: try: display_screen = tuple(int(n) for n in display[1].split(".")) except ValueError: raise ValueError("The DISPLAY environment variable has an unknown " "format: %r" % os.getenv("DISPLAY")) display = display_screen[0] if len(display_screen) > 1: screen = display_screen[1] else: screen = 0 else: display, screen = 0, 0 return hostname, display, screen DisplayCAL-3.1.0.0/DisplayCAL/util_xml.py0000644000076500000000000000235012647526531017641 0ustar devwheel00000000000000# -*- coding: utf-8 -*- def dict2xml(d, elementname="element", pretty=True, allow_attributes=True, level=0): indent = pretty and "\t" * level or "" xml = [] attributes = [] children = [] if isinstance(d, (dict, list)): start_tag = [] start_tag.append(indent + "<" + elementname) if isinstance(d, dict): for key, value in d.iteritems(): if isinstance(value, (dict, list)) or not allow_attributes: children.append(dict2xml(value, key, pretty, allow_attributes, level + 1)) else: if pretty: attributes.append("\n" + indent) attributes.append(' %s="%s"' % (key, escape(unicode(value)))) else: for value in d: children.append(dict2xml(value, "item", pretty, allow_attributes, level + 1)) start_tag.extend(attributes) start_tag.append(children and ">" or "/>") xml.append("".join(start_tag)) if children: for child in children: xml.append(child) xml.append("%s" % (indent, elementname)) else: xml.append("%s<%s>%s" % (indent, elementname, escape(unicode(d)), elementname)) return (pretty and "\n" or "").join(xml) def escape(xml): return xml.replace("&", "&").replace("<", "<").replace(">", ">").replace('"', """) DisplayCAL-3.1.0.0/DisplayCAL/wexpect.py0000644000076500000000000035027112647526531017473 0ustar devwheel00000000000000"""Pexpect is a Python module for spawning child applications and controlling them automatically. Pexpect can be used for automating interactive applications such as ssh, ftp, passwd, telnet, etc. It can be used to a automate setup scripts for duplicating software package installations on different servers. It can be used for automated software testing. Pexpect is in the spirit of Don Libes' Expect, but Pexpect is pure Python. Other Expect-like modules for Python require TCL and Expect or require C extensions to be compiled. Pexpect does not use C, Expect, or TCL extensions. It should work on any platform that supports the standard Python pty module. The Pexpect interface focuses on ease of use so that simple tasks are easy. There are two main interfaces to Pexpect -- the function, run() and the class, spawn. You can call the run() function to execute a command and return the output. This is a handy replacement for os.system(). For example:: pexpect.run('ls -la') The more powerful interface is the spawn class. You can use this to spawn an external child command and then interact with the child by sending lines and expecting responses. For example:: child = pexpect.spawn('scp foo myname@host.example.com:.') child.expect ('Password:') child.sendline (mypassword) This works even for commands that ask for passwords or other input outside of the normal stdio streams. Credits: Noah Spurrier, Richard Holden, Marco Molteni, Kimberley Burchett, Robert Stone, Hartmut Goebel, Chad Schroeder, Erick Tryzelaar, Dave Kirby, Ids vander Molen, George Todd, Noel Taylor, Nicolas D. Cesar, Alexander Gattin, Geoffrey Marshall, Francisco Lourenco, Glen Mabey, Karthik Gurusamy, Fernando Perez, Corey Minyard, Jon Cohen, Guillaume Chazarain, Andrew Ryan, Nick Craig-Wood, Andrew Stone, Jorgen Grahn (Let me know if I forgot anyone.) Free, open source, and all that good stuff. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Pexpect Copyright (c) 2008 Noah Spurrier http://pexpect.sourceforge.net/ $Id: pexpect.py 507 2007-12-27 02:40:52Z noah $ """ import os, sys, time import select import string import re import struct import types import errno import traceback import signal import subprocess if sys.platform != 'win32': import pty import tty import termios import resource import fcntl else: from StringIO import StringIO from ctypes import windll import pywintypes from win32com.shell.shellcon import CSIDL_APPDATA from win32com.shell.shell import SHGetSpecialFolderPath from win32console import * from win32process import * from win32con import * from win32gui import * import win32api import win32file import winerror __version__ = '2.3' __revision__ = '$Revision: 399 $' __all__ = ['ExceptionPexpect', 'EOF', 'TIMEOUT', 'spawn', 'run', 'which', 'split_command_line', '__version__', '__revision__'] from meta import name as appname # Exception classes used by this module. class ExceptionPexpect(Exception): """Base class for all exceptions raised by this module. """ def __init__(self, value): self.value = value def __str__(self): return str(self.value) def get_trace(self): """This returns an abbreviated stack trace with lines that only concern the caller. In other words, the stack trace inside the Pexpect module is not included. """ tblist = traceback.extract_tb(sys.exc_info()[2]) #tblist = filter(self.__filter_not_pexpect, tblist) tblist = [item for item in tblist if self.__filter_not_pexpect(item)] tblist = traceback.format_list(tblist) return ''.join(tblist) def __filter_not_pexpect(self, trace_list_item): """This returns True if list item 0 the string 'pexpect.py' in it. """ if trace_list_item[0].find('pexpect.py') == -1: return True else: return False class EOF(ExceptionPexpect): """Raised when EOF is read from a child. This usually means the child has exited.""" class TIMEOUT(ExceptionPexpect): """Raised when a read time exceeds the timeout. """ ##class TIMEOUT_PATTERN(TIMEOUT): ## """Raised when the pattern match time exceeds the timeout. ## This is different than a read TIMEOUT because the child process may ## give output, thus never give a TIMEOUT, but the output ## may never match a pattern. ## """ ##class MAXBUFFER(ExceptionPexpect): ## """Raised when a scan buffer fills before matching an expected pattern.""" def run (command, timeout=-1, withexitstatus=False, events=None, extra_args=None, logfile=None, cwd=None, env=None): """ This function runs the given command; waits for it to finish; then returns all output as a string. STDERR is included in output. If the full path to the command is not given then the path is searched. Note that lines are terminated by CR/LF (\\r\\n) combination even on UNIX-like systems because this is the standard for pseudo ttys. If you set 'withexitstatus' to true, then run will return a tuple of (command_output, exitstatus). If 'withexitstatus' is false then this returns just command_output. The run() function can often be used instead of creating a spawn instance. For example, the following code uses spawn:: from pexpect import * child = spawn('scp foo myname@host.example.com:.') child.expect ('(?i)password') child.sendline (mypassword) The previous code can be replace with the following:: from pexpect import * run ('scp foo myname@host.example.com:.', events={'(?i)password': mypassword}) Examples ======== Start the apache daemon on the local machine:: from pexpect import * run ("/usr/local/apache/bin/apachectl start") Check in a file using SVN:: from pexpect import * run ("svn ci -m 'automatic commit' my_file.py") Run a command and capture exit status:: from pexpect import * (command_output, exitstatus) = run ('ls -l /bin', withexitstatus=1) Tricky Examples =============== The following will run SSH and execute 'ls -l' on the remote machine. The password 'secret' will be sent if the '(?i)password' pattern is ever seen:: run ("ssh username@machine.example.com 'ls -l'", events={'(?i)password':'secret\\n'}) This will start mencoder to rip a video from DVD. This will also display progress ticks every 5 seconds as it runs. For example:: from pexpect import * def print_ticks(d): print d['event_count'], run ("mencoder dvd://1 -o video.avi -oac copy -ovc copy", events={TIMEOUT:print_ticks}, timeout=5) The 'events' argument should be a dictionary of patterns and responses. Whenever one of the patterns is seen in the command out run() will send the associated response string. Note that you should put newlines in your string if Enter is necessary. The responses may also contain callback functions. Any callback is function that takes a dictionary as an argument. The dictionary contains all the locals from the run() function, so you can access the child spawn object or any other variable defined in run() (event_count, child, and extra_args are the most useful). A callback may return True to stop the current run process otherwise run() continues until the next event. A callback may also return a string which will be sent to the child. 'extra_args' is not used by directly run(). It provides a way to pass data to a callback function through run() through the locals dictionary passed to a callback. """ if timeout == -1: child = spawn(command, maxread=2000, logfile=logfile, cwd=cwd, env=env) else: child = spawn(command, timeout=timeout, maxread=2000, logfile=logfile, cwd=cwd, env=env) if events is not None: patterns = events.keys() responses = events.values() else: patterns=None # We assume that EOF or TIMEOUT will save us. responses=None child_result_list = [] event_count = 0 while 1: try: index = child.expect (patterns) if type(child.after) in types.StringTypes: child_result_list.append(child.before + child.after) else: # child.after may have been a TIMEOUT or EOF, so don't cat those. child_result_list.append(child.before) if type(responses[index]) in types.StringTypes: child.send(responses[index]) elif type(responses[index]) is types.FunctionType: callback_result = responses[index](locals()) sys.stdout.flush() if type(callback_result) in types.StringTypes: child.send(callback_result) elif callback_result: break else: raise TypeError ('The callback must be a string or function type.') event_count = event_count + 1 except TIMEOUT, e: child_result_list.append(child.before) break except EOF, e: child_result_list.append(child.before) break child_result = ''.join(child_result_list) if withexitstatus: child.close() return (child_result, child.exitstatus) else: return child_result def spawn(command, args=[], timeout=30, maxread=2000, searchwindowsize=None, logfile=None, cwd=None, env=None, codepage=None, columns=None, rows=None): log('=' * 80) log('Buffer size: %s' % maxread) if searchwindowsize: log('Search window size: %s' % searchwindowsize) log('Timeout: %ss' % timeout) if env: log('Environment:') for name in env: log('\t%s=%s' % (name, env[name])) if cwd: log('Working directory: %s' % cwd) log('Spawning %s' % join_args([command] + args)) if sys.platform == 'win32': return spawn_windows(command, args, timeout, maxread, searchwindowsize, logfile, cwd, env, codepage, columns, rows) else: return spawn_unix(command, args, timeout, maxread, searchwindowsize, logfile, cwd, env) class spawn_unix (object): """This is the main class interface for Pexpect. Use this class to start and control child applications. """ def __init__(self, command, args=[], timeout=30, maxread=2000, searchwindowsize=None, logfile=None, cwd=None, env=None): """This is the constructor. The command parameter may be a string that includes a command and any arguments to the command. For example:: child = pexpect.spawn ('/usr/bin/ftp') child = pexpect.spawn ('/usr/bin/ssh user@example.com') child = pexpect.spawn ('ls -latr /tmp') You may also construct it with a list of arguments like so:: child = pexpect.spawn ('/usr/bin/ftp', []) child = pexpect.spawn ('/usr/bin/ssh', ['user@example.com']) child = pexpect.spawn ('ls', ['-latr', '/tmp']) After this the child application will be created and will be ready to talk to. For normal use, see expect() and send() and sendline(). Remember that Pexpect does NOT interpret shell meta characters such as redirect, pipe, or wild cards (>, |, or *). This is a common mistake. If you want to run a command and pipe it through another command then you must also start a shell. For example:: child = pexpect.spawn('/bin/bash -c "ls -l | grep LOG > log_list.txt"') child.expect(pexpect.EOF) The second form of spawn (where you pass a list of arguments) is useful in situations where you wish to spawn a command and pass it its own argument list. This can make syntax more clear. For example, the following is equivalent to the previous example:: shell_cmd = 'ls -l | grep LOG > log_list.txt' child = pexpect.spawn('/bin/bash', ['-c', shell_cmd]) child.expect(pexpect.EOF) The maxread attribute sets the read buffer size. This is maximum number of bytes that Pexpect will try to read from a TTY at one time. Setting the maxread size to 1 will turn off buffering. Setting the maxread value higher may help performance in cases where large amounts of output are read back from the child. This feature is useful in conjunction with searchwindowsize. The searchwindowsize attribute sets the how far back in the incomming seach buffer Pexpect will search for pattern matches. Every time Pexpect reads some data from the child it will append the data to the incomming buffer. The default is to search from the beginning of the imcomming buffer each time new data is read from the child. But this is very inefficient if you are running a command that generates a large amount of data where you want to match The searchwindowsize does not effect the size of the incomming data buffer. You will still have access to the full buffer after expect() returns. The logfile member turns on or off logging. All input and output will be copied to the given file object. Set logfile to None to stop logging. This is the default. Set logfile to sys.stdout to echo everything to standard output. The logfile is flushed after each write. Example log input and output to a file:: child = pexpect.spawn('some_command') fout = file('mylog.txt','w') child.logfile = fout Example log to stdout:: child = pexpect.spawn('some_command') child.logfile = sys.stdout The logfile_read and logfile_send members can be used to separately log the input from the child and output sent to the child. Sometimes you don't want to see everything you write to the child. You only want to log what the child sends back. For example:: child = pexpect.spawn('some_command') child.logfile_read = sys.stdout To separately log output sent to the child use logfile_send:: self.logfile_send = fout The delaybeforesend helps overcome a weird behavior that many users were experiencing. The typical problem was that a user would expect() a "Password:" prompt and then immediately call sendline() to send the password. The user would then see that their password was echoed back to them. Passwords don't normally echo. The problem is caused by the fact that most applications print out the "Password" prompt and then turn off stdin echo, but if you send your password before the application turned off echo, then you get your password echoed. Normally this wouldn't be a problem when interacting with a human at a real keyboard. If you introduce a slight delay just before writing then this seems to clear up the problem. This was such a common problem for many users that I decided that the default pexpect behavior should be to sleep just before writing to the child application. 1/20th of a second (50 ms) seems to be enough to clear up the problem. You can set delaybeforesend to 0 to return to the old behavior. Most Linux machines don't like this to be below 0.03. I don't know why. Note that spawn is clever about finding commands on your path. It uses the same logic that "which" uses to find executables. If you wish to get the exit status of the child you must call the close() method. The exit or signal status of the child will be stored in self.exitstatus or self.signalstatus. If the child exited normally then exitstatus will store the exit return code and signalstatus will be None. If the child was terminated abnormally with a signal then signalstatus will store the signal value and exitstatus will be None. If you need more detail you can also read the self.status member which stores the status returned by os.waitpid. You can interpret this using os.WIFEXITED/os.WEXITSTATUS or os.WIFSIGNALED/os.TERMSIG. """ self.STDIN_FILENO = pty.STDIN_FILENO self.STDOUT_FILENO = pty.STDOUT_FILENO self.STDERR_FILENO = pty.STDERR_FILENO self.stdin = sys.stdin self.stdout = sys.stdout self.stderr = sys.stderr self.searcher = None self.ignorecase = False self.before = None self.after = None self.match = None self.match_index = None self.terminated = True self.exitstatus = None self.signalstatus = None self.status = None # status returned by os.waitpid self.flag_eof = False self.pid = None self.child_fd = -1 # initially closed self.timeout = timeout self.delimiter = EOF self.logfile = logfile self.logfile_read = None # input from child (read_nonblocking) self.logfile_send = None # output to send (send, sendline) self.maxread = maxread # max bytes to read at one time into buffer self.buffer = '' # This is the read buffer. See maxread. self.searchwindowsize = searchwindowsize # Anything before searchwindowsize point is preserved, but not searched. # Most Linux machines don't like delaybeforesend to be below 0.03 (30 ms). self.delaybeforesend = 0.05 # Sets sleep time used just before sending data to child. Time in seconds. self.delayafterclose = 0.1 # Sets delay in close() method to allow kernel time to update process status. Time in seconds. self.delayafterterminate = 0.1 # Sets delay in terminate() method to allow kernel time to update process status. Time in seconds. self.softspace = False # File-like object. self.name = '<' + repr(self) + '>' # File-like object. self.encoding = None # File-like object. self.closed = True # File-like object. self.ocwd = os.getcwdu() self.cwd = cwd self.env = env self.__irix_hack = (sys.platform.lower().find('irix')>=0) # This flags if we are running on irix # Solaris uses internal __fork_pty(). All others use pty.fork(). if (sys.platform.lower().find('solaris')>=0) or (sys.platform.lower().find('sunos5')>=0): self.use_native_pty_fork = False else: self.use_native_pty_fork = True # allow dummy instances for subclasses that may not use command or args. if command is None: self.command = None self.args = None self.name = '' else: self._spawn (command, args) def __del__(self): """This makes sure that no system resources are left open. Python only garbage collects Python objects. OS file descriptors are not Python objects, so they must be handled explicitly. If the child file descriptor was opened outside of this class (passed to the constructor) then this does not close it. """ if not self.closed: # It is possible for __del__ methods to execute during the # teardown of the Python VM itself. Thus self.close() may # trigger an exception because os.close may be None. # -- Fernando Perez try: self.close() except AttributeError: pass def __str__(self): """This returns a human-readable string that represents the state of the object. """ s = [] s.append(repr(self)) s.append('version: ' + __version__ + ' (' + __revision__ + ')') s.append('command: ' + str(self.command)) s.append('args: ' + str(self.args)) s.append('searcher: ' + str(self.searcher)) s.append('buffer (last 100 chars): ' + str(self.buffer)[-100:]) s.append('before (last 100 chars): ' + str(self.before)[-100:]) s.append('after: ' + str(self.after)) s.append('match: ' + str(self.match)) s.append('match_index: ' + str(self.match_index)) s.append('exitstatus: ' + str(self.exitstatus)) s.append('flag_eof: ' + str(self.flag_eof)) s.append('pid: ' + str(self.pid)) s.append('child_fd: ' + str(self.child_fd)) s.append('closed: ' + str(self.closed)) s.append('timeout: ' + str(self.timeout)) s.append('delimiter: ' + str(self.delimiter)) s.append('logfile: ' + str(self.logfile)) s.append('logfile_read: ' + str(self.logfile_read)) s.append('logfile_send: ' + str(self.logfile_send)) s.append('maxread: ' + str(self.maxread)) s.append('ignorecase: ' + str(self.ignorecase)) s.append('searchwindowsize: ' + str(self.searchwindowsize)) s.append('delaybeforesend: ' + str(self.delaybeforesend)) s.append('delayafterclose: ' + str(self.delayafterclose)) s.append('delayafterterminate: ' + str(self.delayafterterminate)) return '\n'.join(s) def _spawn(self,command,args=[]): """This starts the given command in a child process. This does all the fork/exec type of stuff for a pty. This is called by __init__. If args is empty then command will be parsed (split on spaces) and args will be set to parsed arguments. """ # The pid and child_fd of this object get set by this method. # Note that it is difficult for this method to fail. # You cannot detect if the child process cannot start. # So the only way you can tell if the child process started # or not is to try to read from the file descriptor. If you get # EOF immediately then it means that the child is already dead. # That may not necessarily be bad because you may haved spawned a child # that performs some task; creates no stdout output; and then dies. # If command is an int type then it may represent a file descriptor. if type(command) == type(0): raise ExceptionPexpect ('Command is an int type. If this is a file descriptor then maybe you want to use fdpexpect.fdspawn which takes an existing file descriptor instead of a command string.') if type (args) != type([]): raise TypeError ('The argument, args, must be a list.') if args == []: self.args = split_command_line(command) self.command = self.args[0] else: self.args = args[:] # work with a copy self.args.insert (0, command) self.command = command command_with_path = which(self.command) if command_with_path is None: raise ExceptionPexpect ('The command was not found or was not executable: %s.' % self.command) self.command = command_with_path self.args[0] = self.command self.name = '<' + ' '.join (self.args) + '>' assert self.pid is None, 'The pid member should be None.' assert self.command is not None, 'The command member should not be None.' if self.use_native_pty_fork: try: self.pid, self.child_fd = pty.fork() except OSError, e: raise ExceptionPexpect('Error! pty.fork() failed: ' + str(e)) else: # Use internal __fork_pty self.pid, self.child_fd = self.__fork_pty() if self.pid == 0: # Child try: self.child_fd = sys.stdout.fileno() # used by setwinsize() self.setwinsize(24, 80) except: # Some platforms do not like setwinsize (Cygwin). # This will cause problem when running applications that # are very picky about window size. # This is a serious limitation, but not a show stopper. pass # Do not allow child to inherit open file descriptors from parent. max_fd = resource.getrlimit(resource.RLIMIT_NOFILE)[0] for i in range (3, max_fd): try: os.close (i) except OSError: pass # I don't know why this works, but ignoring SIGHUP fixes a # problem when trying to start a Java daemon with sudo # (specifically, Tomcat). signal.signal(signal.SIGHUP, signal.SIG_IGN) if self.cwd is not None: os.chdir(self.cwd) if self.env is None: os.execv(self.command, self.args) else: os.execvpe(self.command, self.args, self.env) if self.cwd is not None: # Restore the original working dir os.chdir(self.ocwd) # Parent self.terminated = False self.closed = False def __fork_pty(self): """This implements a substitute for the forkpty system call. This should be more portable than the pty.fork() function. Specifically, this should work on Solaris. Modified 10.06.05 by Geoff Marshall: Implemented __fork_pty() method to resolve the issue with Python's pty.fork() not supporting Solaris, particularly ssh. Based on patch to posixmodule.c authored by Noah Spurrier:: http://mail.python.org/pipermail/python-dev/2003-May/035281.html """ parent_fd, child_fd = os.openpty() if parent_fd < 0 or child_fd < 0: raise ExceptionPexpect, "Error! Could not open pty with os.openpty()." pid = os.fork() if pid < 0: raise ExceptionPexpect, "Error! Failed os.fork()." elif pid == 0: # Child. os.close(parent_fd) self.__pty_make_controlling_tty(child_fd) os.dup2(child_fd, 0) os.dup2(child_fd, 1) os.dup2(child_fd, 2) if child_fd > 2: os.close(child_fd) else: # Parent. os.close(child_fd) return pid, parent_fd def __pty_make_controlling_tty(self, tty_fd): """This makes the pseudo-terminal the controlling tty. This should be more portable than the pty.fork() function. Specifically, this should work on Solaris. """ child_name = os.ttyname(tty_fd) # Disconnect from controlling tty if still connected. fd = os.open("/dev/tty", os.O_RDWR | os.O_NOCTTY); if fd >= 0: os.close(fd) os.setsid() # Verify we are disconnected from controlling tty try: fd = os.open("/dev/tty", os.O_RDWR | os.O_NOCTTY); if fd >= 0: os.close(fd) raise ExceptionPexpect, "Error! We are not disconnected from a controlling tty." except: # Good! We are disconnected from a controlling tty. pass # Verify we can open child pty. fd = os.open(child_name, os.O_RDWR); if fd < 0: raise ExceptionPexpect, "Error! Could not open child pty, " + child_name else: os.close(fd) # Verify we now have a controlling tty. fd = os.open("/dev/tty", os.O_WRONLY) if fd < 0: raise ExceptionPexpect, "Error! Could not open controlling tty, /dev/tty" else: os.close(fd) def fileno (self): # File-like object. """This returns the file descriptor of the pty for the child. """ return self.child_fd def close (self, force=True): # File-like object. """This closes the connection with the child application. Note that calling close() more than once is valid. This emulates standard Python behavior with files. Set force to True if you want to make sure that the child is terminated (SIGKILL is sent if the child ignores SIGHUP and SIGINT). """ if not self.closed: self.flush() os.close (self.child_fd) time.sleep(self.delayafterclose) # Give kernel time to update process status. if self.isalive(): if not self.terminate(force): raise ExceptionPexpect ('close() could not terminate the child using terminate()') self.child_fd = -1 self.closed = True #self.pid = None def flush (self): # File-like object. """This does nothing. It is here to support the interface for a File-like object. """ pass def isatty (self): # File-like object. """This returns True if the file descriptor is open and connected to a tty(-like) device, else False. """ return os.isatty(self.child_fd) def waitnoecho (self, timeout=-1): """This waits until the terminal ECHO flag is set False. This returns True if the echo mode is off. This returns False if the ECHO flag was not set False before the timeout. This can be used to detect when the child is waiting for a password. Usually a child application will turn off echo mode when it is waiting for the user to enter a password. For example, instead of expecting the "password:" prompt you can wait for the child to set ECHO off:: p = pexpect.spawn ('ssh user@example.com') p.waitnoecho() p.sendline(mypassword) If timeout is None then this method to block forever until ECHO flag is False. """ if timeout == -1: timeout = self.timeout if timeout is not None: end_time = time.time() + timeout while True: if not self.getecho(): return True if timeout < 0 and timeout is not None: return False if timeout is not None: timeout = end_time - time.time() time.sleep(0.1) def getecho (self): """This returns the terminal echo mode. This returns True if echo is on or False if echo is off. Child applications that are expecting you to enter a password often set ECHO False. See waitnoecho(). """ attr = termios.tcgetattr(self.child_fd) if attr[3] & termios.ECHO: return True return False def setecho (self, state): """This sets the terminal echo mode on or off. Note that anything the child sent before the echo will be lost, so you should be sure that your input buffer is empty before you call setecho(). For example, the following will work as expected:: p = pexpect.spawn('cat') p.sendline ('1234') # We will see this twice (once from tty echo and again from cat). p.expect (['1234']) p.expect (['1234']) p.setecho(False) # Turn off tty echo p.sendline ('abcd') # We will set this only once (echoed by cat). p.sendline ('wxyz') # We will set this only once (echoed by cat) p.expect (['abcd']) p.expect (['wxyz']) The following WILL NOT WORK because the lines sent before the setecho will be lost:: p = pexpect.spawn('cat') p.sendline ('1234') # We will see this twice (once from tty echo and again from cat). p.setecho(False) # Turn off tty echo p.sendline ('abcd') # We will set this only once (echoed by cat). p.sendline ('wxyz') # We will set this only once (echoed by cat) p.expect (['1234']) p.expect (['1234']) p.expect (['abcd']) p.expect (['wxyz']) """ self.child_fd attr = termios.tcgetattr(self.child_fd) if state: attr[3] = attr[3] | termios.ECHO else: attr[3] = attr[3] & ~termios.ECHO # I tried TCSADRAIN and TCSAFLUSH, but these were inconsistent # and blocked on some platforms. TCSADRAIN is probably ideal if it worked. termios.tcsetattr(self.child_fd, termios.TCSANOW, attr) def read_nonblocking (self, size = 1, timeout = -1): """This reads at most size characters from the child application. It includes a timeout. If the read does not complete within the timeout period then a TIMEOUT exception is raised. If the end of file is read then an EOF exception will be raised. If a log file was set using setlog() then all data will also be written to the log file. If timeout is None then the read may block indefinitely. If timeout is -1 then the self.timeout value is used. If timeout is 0 then the child is polled and if there was no data immediately ready then this will raise a TIMEOUT exception. The timeout refers only to the amount of time to read at least one character. This is not effected by the 'size' parameter, so if you call read_nonblocking(size=100, timeout=30) and only one character is available right away then one character will be returned immediately. It will not wait for 30 seconds for another 99 characters to come in. This is a wrapper around os.read(). It uses select.select() to implement the timeout. """ if self.closed: raise ValueError ('I/O operation on closed file in read_nonblocking().') if timeout == -1: timeout = self.timeout # Note that some systems such as Solaris do not give an EOF when # the child dies. In fact, you can still try to read # from the child_fd -- it will block forever or until TIMEOUT. # For this case, I test isalive() before doing any reading. # If isalive() is false, then I pretend that this is the same as EOF. if not self.isalive(): r,w,e = self.__select([self.child_fd], [], [], 0) # timeout of 0 means "poll" if not r: self.flag_eof = True raise EOF ('End Of File (EOF) in read_nonblocking(). Braindead platform.') elif self.__irix_hack: # This is a hack for Irix. It seems that Irix requires a long delay before checking isalive. # This adds a 2 second delay, but only when the child is terminated. r, w, e = self.__select([self.child_fd], [], [], 2) if not r and not self.isalive(): self.flag_eof = True raise EOF ('End Of File (EOF) in read_nonblocking(). Pokey platform.') r,w,e = self.__select([self.child_fd], [], [], timeout) if not r: if not self.isalive(): # Some platforms, such as Irix, will claim that their processes are alive; # then timeout on the select; and then finally admit that they are not alive. self.flag_eof = True raise EOF ('End of File (EOF) in read_nonblocking(). Very pokey platform.') else: raise TIMEOUT ('Timeout exceeded in read_nonblocking().') if self.child_fd in r: try: s = os.read(self.child_fd, size) except OSError, e: # Linux does this self.flag_eof = True raise EOF ('End Of File (EOF) in read_nonblocking(). Exception style platform.') if s == '': # BSD style self.flag_eof = True raise EOF ('End Of File (EOF) in read_nonblocking(). Empty string style platform.') if self.logfile is not None: self.logfile.write (s) self.logfile.flush() if self.logfile_read is not None: self.logfile_read.write (s) self.logfile_read.flush() return s raise ExceptionPexpect ('Reached an unexpected state in read_nonblocking().') def read (self, size = -1): # File-like object. """This reads at most "size" bytes from the file (less if the read hits EOF before obtaining size bytes). If the size argument is negative or omitted, read all data until EOF is reached. The bytes are returned as a string object. An empty string is returned when EOF is encountered immediately. """ if size == 0: return '' if size < 0: self.expect (self.delimiter) # delimiter default is EOF return self.before # I could have done this more directly by not using expect(), but # I deliberately decided to couple read() to expect() so that # I would catch any bugs early and ensure consistant behavior. # It's a little less efficient, but there is less for me to # worry about if I have to later modify read() or expect(). # Note, it's OK if size==-1 in the regex. That just means it # will never match anything in which case we stop only on EOF. cre = re.compile('.{%d}' % size, re.DOTALL) index = self.expect ([cre, self.delimiter]) # delimiter default is EOF if index == 0: return self.after ### self.before should be ''. Should I assert this? return self.before def readline (self, size = -1): # File-like object. """This reads and returns one entire line. A trailing newline is kept in the string, but may be absent when a file ends with an incomplete line. Note: This readline() looks for a \\r\\n pair even on UNIX because this is what the pseudo tty device returns. So contrary to what you may expect you will receive the newline as \\r\\n. An empty string is returned when EOF is hit immediately. Currently, the size argument is mostly ignored, so this behavior is not standard for a file-like object. If size is 0 then an empty string is returned. """ if size == 0: return '' index = self.expect (['\r\n', self.delimiter]) # delimiter default is EOF if index == 0: return self.before + '\r\n' else: return self.before def __iter__ (self): # File-like object. """This is to support iterators over a file-like object. """ return self def next (self): # File-like object. """This is to support iterators over a file-like object. """ result = self.readline() if result == "": raise StopIteration return result def readlines (self, sizehint = -1): # File-like object. """This reads until EOF using readline() and returns a list containing the lines thus read. The optional "sizehint" argument is ignored. """ lines = [] while True: line = self.readline() if not line: break lines.append(line) return lines def write(self, s): # File-like object. """This is similar to send() except that there is no return value. """ self.send (s) def writelines (self, sequence): # File-like object. """This calls write() for each element in the sequence. The sequence can be any iterable object producing strings, typically a list of strings. This does not add line separators There is no return value. """ for s in sequence: self.write (s) def send(self, s): """This sends a string to the child process. This returns the number of bytes written. If a log file was set then the data is also written to the log. """ time.sleep(self.delaybeforesend) if self.logfile is not None: self.logfile.write (s) self.logfile.flush() if self.logfile_send is not None: self.logfile_send.write (s) self.logfile_send.flush() c = os.write(self.child_fd, s) return c def sendline(self, s=''): """This is like send(), but it adds a line feed (os.linesep). This returns the number of bytes written. """ n = self.send(s) n = n + self.send (os.linesep) return n def sendcontrol(self, char): """This sends a control character to the child such as Ctrl-C or Ctrl-D. For example, to send a Ctrl-G (ASCII 7):: child.sendcontrol('g') See also, sendintr() and sendeof(). """ char = char.lower() a = ord(char) if a>=97 and a<=122: a = a - ord('a') + 1 return self.send (chr(a)) d = {'@':0, '`':0, '[':27, '{':27, '\\':28, '|':28, ']':29, '}': 29, '^':30, '~':30, '_':31, '?':127} if char not in d: return 0 return self.send (chr(d[char])) def sendeof(self): """This sends an EOF to the child. This sends a character which causes the pending parent output buffer to be sent to the waiting child program without waiting for end-of-line. If it is the first character of the line, the read() in the user program returns 0, which signifies end-of-file. This means to work as expected a sendeof() has to be called at the beginning of a line. This method does not send a newline. It is the responsibility of the caller to ensure the eof is sent at the beginning of a line. """ ### Hmmm... how do I send an EOF? ###C if ((m = write(pty, *buf, p - *buf)) < 0) ###C return (errno == EWOULDBLOCK) ? n : -1; #fd = sys.stdin.fileno() #old = termios.tcgetattr(fd) # remember current state #attr = termios.tcgetattr(fd) #attr[3] = attr[3] | termios.ICANON # ICANON must be set to recognize EOF #try: # use try/finally to ensure state gets restored # termios.tcsetattr(fd, termios.TCSADRAIN, attr) # if hasattr(termios, 'CEOF'): # os.write (self.child_fd, '%c' % termios.CEOF) # else: # # Silly platform does not define CEOF so assume CTRL-D # os.write (self.child_fd, '%c' % 4) #finally: # restore state # termios.tcsetattr(fd, termios.TCSADRAIN, old) if hasattr(termios, 'VEOF'): char = termios.tcgetattr(self.child_fd)[6][termios.VEOF] else: # platform does not define VEOF so assume CTRL-D char = chr(4) self.send(char) def sendintr(self): """This sends a SIGINT to the child. It does not require the SIGINT to be the first character on a line. """ if hasattr(termios, 'VINTR'): char = termios.tcgetattr(self.child_fd)[6][termios.VINTR] else: # platform does not define VINTR so assume CTRL-C char = chr(3) self.send (char) def eof (self): """This returns True if the EOF exception was ever raised. """ return self.flag_eof def terminate(self, force=False): """This forces a child process to terminate. It starts nicely with SIGHUP and SIGINT. If "force" is True then moves onto SIGKILL. This returns True if the child was terminated. This returns False if the child could not be terminated. """ if not self.isalive(): return True try: self.kill(signal.SIGHUP) time.sleep(self.delayafterterminate) if not self.isalive(): return True self.kill(signal.SIGCONT) time.sleep(self.delayafterterminate) if not self.isalive(): return True self.kill(signal.SIGINT) time.sleep(self.delayafterterminate) if not self.isalive(): return True if force: self.kill(signal.SIGKILL) time.sleep(self.delayafterterminate) if not self.isalive(): return True else: return False return False except OSError, e: # I think there are kernel timing issues that sometimes cause # this to happen. I think isalive() reports True, but the # process is dead to the kernel. # Make one last attempt to see if the kernel is up to date. time.sleep(self.delayafterterminate) if not self.isalive(): return True else: return False def wait(self): """This waits until the child exits. This is a blocking call. This will not read any data from the child, so this will block forever if the child has unread output and has terminated. In other words, the child may have printed output then called exit(); but, technically, the child is still alive until its output is read. """ if self.isalive(): pid, status = os.waitpid(self.pid, 0) else: raise ExceptionPexpect ('Cannot wait for dead child process.') self.exitstatus = os.WEXITSTATUS(status) if os.WIFEXITED (status): self.status = status self.exitstatus = os.WEXITSTATUS(status) self.signalstatus = None self.terminated = True elif os.WIFSIGNALED (status): self.status = status self.exitstatus = None self.signalstatus = os.WTERMSIG(status) self.terminated = True elif os.WIFSTOPPED (status): raise ExceptionPexpect ('Wait was called for a child process that is stopped. This is not supported. Is some other process attempting job control with our child pid?') return self.exitstatus def isalive(self): """This tests if the child process is running or not. This is non-blocking. If the child was terminated then this will read the exitstatus or signalstatus of the child. This returns True if the child process appears to be running or False if not. It can take literally SECONDS for Solaris to return the right status. """ if self.terminated: return False if self.flag_eof: # This is for Linux, which requires the blocking form of waitpid to get # status of a defunct process. This is super-lame. The flag_eof would have # been set in read_nonblocking(), so this should be safe. waitpid_options = 0 else: waitpid_options = os.WNOHANG try: pid, status = os.waitpid(self.pid, waitpid_options) except OSError, e: # No child processes if e[0] == errno.ECHILD: raise ExceptionPexpect ('isalive() encountered condition where "terminated" is 0, but there was no child process. Did someone else call waitpid() on our process?') else: raise e # I have to do this twice for Solaris. I can't even believe that I figured this out... # If waitpid() returns 0 it means that no child process wishes to # report, and the value of status is undefined. if pid == 0: try: pid, status = os.waitpid(self.pid, waitpid_options) ### os.WNOHANG) # Solaris! except OSError, e: # This should never happen... if e[0] == errno.ECHILD: raise ExceptionPexpect ('isalive() encountered condition that should never happen. There was no child process. Did someone else call waitpid() on our process?') else: raise e # If pid is still 0 after two calls to waitpid() then # the process really is alive. This seems to work on all platforms, except # for Irix which seems to require a blocking call on waitpid or select, so I let read_nonblocking # take care of this situation (unfortunately, this requires waiting through the timeout). if pid == 0: return True if pid == 0: return True if os.WIFEXITED (status): self.status = status self.exitstatus = os.WEXITSTATUS(status) self.signalstatus = None self.terminated = True elif os.WIFSIGNALED (status): self.status = status self.exitstatus = None self.signalstatus = os.WTERMSIG(status) self.terminated = True elif os.WIFSTOPPED (status): raise ExceptionPexpect ('isalive() encountered condition where child process is stopped. This is not supported. Is some other process attempting job control with our child pid?') return False def kill(self, sig): """This sends the given signal to the child application. In keeping with UNIX tradition it has a misleading name. It does not necessarily kill the child unless you send the right signal. """ # Same as os.kill, but the pid is given for you. if self.isalive(): os.kill(self.pid, sig) def compile_pattern_list(self, patterns): """This compiles a pattern-string or a list of pattern-strings. Patterns must be a StringType, EOF, TIMEOUT, SRE_Pattern, or a list of those. Patterns may also be None which results in an empty list (you might do this if waiting for an EOF or TIMEOUT condition without expecting any pattern). This is used by expect() when calling expect_list(). Thus expect() is nothing more than:: cpl = self.compile_pattern_list(pl) return self.expect_list(cpl, timeout) If you are using expect() within a loop it may be more efficient to compile the patterns first and then call expect_list(). This avoid calls in a loop to compile_pattern_list():: cpl = self.compile_pattern_list(my_pattern) while some_condition: ... i = self.expect_list(clp, timeout) ... """ if patterns is None: return [] if type(patterns) is not types.ListType: patterns = [patterns] compile_flags = re.DOTALL # Allow dot to match \n if self.ignorecase: compile_flags = compile_flags | re.IGNORECASE compiled_pattern_list = [] for p in patterns: if type(p) in types.StringTypes: compiled_pattern_list.append(re.compile(p, compile_flags)) elif p is EOF: compiled_pattern_list.append(EOF) elif p is TIMEOUT: compiled_pattern_list.append(TIMEOUT) elif type(p) is type(re.compile('')): compiled_pattern_list.append(p) else: raise TypeError ('Argument must be one of StringTypes, EOF, TIMEOUT, SRE_Pattern, or a list of those type. %s' % str(type(p))) return compiled_pattern_list def expect(self, pattern, timeout = -1, searchwindowsize=None): """This seeks through the stream until a pattern is matched. The pattern is overloaded and may take several types. The pattern can be a StringType, EOF, a compiled re, or a list of any of those types. Strings will be compiled to re types. This returns the index into the pattern list. If the pattern was not a list this returns index 0 on a successful match. This may raise exceptions for EOF or TIMEOUT. To avoid the EOF or TIMEOUT exceptions add EOF or TIMEOUT to the pattern list. That will cause expect to match an EOF or TIMEOUT condition instead of raising an exception. If you pass a list of patterns and more than one matches, the first match in the stream is chosen. If more than one pattern matches at that point, the leftmost in the pattern list is chosen. For example:: # the input is 'foobar' index = p.expect (['bar', 'foo', 'foobar']) # returns 1 ('foo') even though 'foobar' is a "better" match Please note, however, that buffering can affect this behavior, since input arrives in unpredictable chunks. For example:: # the input is 'foobar' index = p.expect (['foobar', 'foo']) # returns 0 ('foobar') if all input is available at once, # but returs 1 ('foo') if parts of the final 'bar' arrive late After a match is found the instance attributes 'before', 'after' and 'match' will be set. You can see all the data read before the match in 'before'. You can see the data that was matched in 'after'. The re.MatchObject used in the re match will be in 'match'. If an error occurred then 'before' will be set to all the data read so far and 'after' and 'match' will be None. If timeout is -1 then timeout will be set to the self.timeout value. A list entry may be EOF or TIMEOUT instead of a string. This will catch these exceptions and return the index of the list entry instead of raising the exception. The attribute 'after' will be set to the exception type. The attribute 'match' will be None. This allows you to write code like this:: index = p.expect (['good', 'bad', pexpect.EOF, pexpect.TIMEOUT]) if index == 0: do_something() elif index == 1: do_something_else() elif index == 2: do_some_other_thing() elif index == 3: do_something_completely_different() instead of code like this:: try: index = p.expect (['good', 'bad']) if index == 0: do_something() elif index == 1: do_something_else() except EOF: do_some_other_thing() except TIMEOUT: do_something_completely_different() These two forms are equivalent. It all depends on what you want. You can also just expect the EOF if you are waiting for all output of a child to finish. For example:: p = pexpect.spawn('/bin/ls') p.expect (pexpect.EOF) print p.before If you are trying to optimize for speed then see expect_list(). """ compiled_pattern_list = self.compile_pattern_list(pattern) return self.expect_list(compiled_pattern_list, timeout, searchwindowsize) def expect_list(self, pattern_list, timeout = -1, searchwindowsize = -1): """This takes a list of compiled regular expressions and returns the index into the pattern_list that matched the child output. The list may also contain EOF or TIMEOUT (which are not compiled regular expressions). This method is similar to the expect() method except that expect_list() does not recompile the pattern list on every call. This may help if you are trying to optimize for speed, otherwise just use the expect() method. This is called by expect(). If timeout==-1 then the self.timeout value is used. If searchwindowsize==-1 then the self.searchwindowsize value is used. """ return self.expect_loop(searcher_re(pattern_list), timeout, searchwindowsize) def expect_exact(self, pattern_list, timeout = -1, searchwindowsize = -1): """This is similar to expect(), but uses plain string matching instead of compiled regular expressions in 'pattern_list'. The 'pattern_list' may be a string; a list or other sequence of strings; or TIMEOUT and EOF. This call might be faster than expect() for two reasons: string searching is faster than RE matching and it is possible to limit the search to just the end of the input buffer. This method is also useful when you don't want to have to worry about escaping regular expression characters that you want to match.""" if type(pattern_list) in types.StringTypes or pattern_list in (TIMEOUT, EOF): pattern_list = [pattern_list] return self.expect_loop(searcher_string(pattern_list), timeout, searchwindowsize) def expect_loop(self, searcher, timeout = -1, searchwindowsize = -1): """This is the common loop used inside expect. The 'searcher' should be an instance of searcher_re or searcher_string, which describes how and what to search for in the input. See expect() for other arguments, return value and exceptions. """ self.searcher = searcher if timeout == -1: timeout = self.timeout if timeout is not None: end_time = time.time() + timeout if searchwindowsize == -1: searchwindowsize = self.searchwindowsize try: incoming = self.buffer freshlen = len(incoming) while True: # Keep reading until exception or return. index = searcher.search(incoming, freshlen, searchwindowsize) if index >= 0: self.buffer = incoming[searcher.end : ] self.before = incoming[ : searcher.start] self.after = incoming[searcher.start : searcher.end] self.match = searcher.match self.match_index = index return self.match_index # No match at this point if timeout < 0 and timeout is not None: raise TIMEOUT ('Timeout exceeded in expect_any().') # Still have time left, so read more data c = self.read_nonblocking (self.maxread, timeout) freshlen = len(c) time.sleep (0.0001) incoming = incoming + c if timeout is not None: timeout = end_time - time.time() except EOF, e: self.buffer = '' self.before = incoming self.after = EOF index = searcher.eof_index if index >= 0: self.match = EOF self.match_index = index return self.match_index else: self.match = None self.match_index = None raise EOF (str(e) + '\n' + str(self)) except TIMEOUT, e: self.buffer = incoming self.before = incoming self.after = TIMEOUT index = searcher.timeout_index if index >= 0: self.match = TIMEOUT self.match_index = index return self.match_index else: self.match = None self.match_index = None raise TIMEOUT (str(e) + '\n' + str(self)) except: self.before = incoming self.after = None self.match = None self.match_index = None raise def getwinsize(self): """This returns the terminal window size of the child tty. The return value is a tuple of (rows, cols). """ TIOCGWINSZ = getattr(termios, 'TIOCGWINSZ', 1074295912L) s = struct.pack('HHHH', 0, 0, 0, 0) x = fcntl.ioctl(self.fileno(), TIOCGWINSZ, s) return struct.unpack('HHHH', x)[0:2] def setwinsize(self, r, c): """This sets the terminal window size of the child tty. This will cause a SIGWINCH signal to be sent to the child. This does not change the physical window size. It changes the size reported to TTY-aware applications like vi or curses -- applications that respond to the SIGWINCH signal. """ # Check for buggy platforms. Some Python versions on some platforms # (notably OSF1 Alpha and RedHat 7.1) truncate the value for # termios.TIOCSWINSZ. It is not clear why this happens. # These platforms don't seem to handle the signed int very well; # yet other platforms like OpenBSD have a large negative value for # TIOCSWINSZ and they don't have a truncate problem. # Newer versions of Linux have totally different values for TIOCSWINSZ. # Note that this fix is a hack. TIOCSWINSZ = getattr(termios, 'TIOCSWINSZ', -2146929561) if TIOCSWINSZ == 2148037735L: # L is not required in Python >= 2.2. TIOCSWINSZ = -2146929561 # Same bits, but with sign. # Note, assume ws_xpixel and ws_ypixel are zero. s = struct.pack('HHHH', r, c, 0, 0) fcntl.ioctl(self.fileno(), TIOCSWINSZ, s) def interact(self, escape_character = chr(29), input_filter = None, output_filter = None): """This gives control of the child process to the interactive user (the human at the keyboard). Keystrokes are sent to the child process, and the stdout and stderr output of the child process is printed. This simply echos the child stdout and child stderr to the real stdout and it echos the real stdin to the child stdin. When the user types the escape_character this method will stop. The default for escape_character is ^]. This should not be confused with ASCII 27 -- the ESC character. ASCII 29 was chosen for historical merit because this is the character used by 'telnet' as the escape character. The escape_character will not be sent to the child process. You may pass in optional input and output filter functions. These functions should take a string and return a string. The output_filter will be passed all the output from the child process. The input_filter will be passed all the keyboard input from the user. The input_filter is run BEFORE the check for the escape_character. Note that if you change the window size of the parent the SIGWINCH signal will not be passed through to the child. If you want the child window size to change when the parent's window size changes then do something like the following example:: import pexpect, struct, fcntl, termios, signal, sys def sigwinch_passthrough (sig, data): s = struct.pack("HHHH", 0, 0, 0, 0) a = struct.unpack('hhhh', fcntl.ioctl(sys.stdout.fileno(), termios.TIOCGWINSZ , s)) global p p.setwinsize(a[0],a[1]) p = pexpect.spawn('/bin/bash') # Note this is global and used in sigwinch_passthrough. signal.signal(signal.SIGWINCH, sigwinch_passthrough) p.interact() """ # Flush the buffer. self.stdout.write (self.buffer) self.stdout.flush() self.buffer = '' mode = tty.tcgetattr(self.STDIN_FILENO) tty.setraw(self.STDIN_FILENO) try: self.__interact_copy(escape_character, input_filter, output_filter) finally: tty.tcsetattr(self.STDIN_FILENO, tty.TCSAFLUSH, mode) def __interact_writen(self, fd, data): """This is used by the interact() method. """ while data != '' and self.isalive(): n = os.write(fd, data) data = data[n:] def __interact_read(self, fd): """This is used by the interact() method. """ return os.read(fd, 1000) def __interact_copy(self, escape_character = None, input_filter = None, output_filter = None): """This is used by the interact() method. """ while self.isalive(): r,w,e = self.__select([self.child_fd, self.STDIN_FILENO], [], []) if self.child_fd in r: try: data = self.__interact_read(self.child_fd) except OSError, e: break if output_filter: data = output_filter(data) if self.logfile is not None: self.logfile.write (data) self.logfile.flush() os.write(self.STDOUT_FILENO, data) if self.STDIN_FILENO in r: data = self.__interact_read(self.STDIN_FILENO) if input_filter: data = input_filter(data) i = data.rfind(escape_character) if i != -1: data = data[:i] self.__interact_writen(self.child_fd, data) break self.__interact_writen(self.child_fd, data) def __select (self, iwtd, owtd, ewtd, timeout=None): """This is a wrapper around select.select() that ignores signals. If select.select raises a select.error exception and errno is an EINTR error then it is ignored. Mainly this is used to ignore sigwinch (terminal resize). """ # if select() is interrupted by a signal (errno==EINTR) then # we loop back and enter the select() again. if timeout is not None: end_time = time.time() + timeout while True: try: return select.select (iwtd, owtd, ewtd, timeout) except select.error, e: if e[0] == errno.EINTR: # if we loop back we have to subtract the amount of time we already waited. if timeout is not None: timeout = end_time - time.time() if timeout < 0: return ([],[],[]) else: # something else caused the select.error, so this really is an exception raise ############################################################################## # The following methods are no longer supported or allowed. def setmaxread (self, maxread): """This method is no longer supported or allowed. I don't like getters and setters without a good reason. """ raise ExceptionPexpect ('This method is no longer supported or allowed. Just assign a value to the maxread member variable.') def setlog (self, fileobject): """This method is no longer supported or allowed. """ raise ExceptionPexpect ('This method is no longer supported or allowed. Just assign a value to the logfile member variable.') ############################################################################## # End of spawn_unix class ############################################################################## class spawn_windows (spawn_unix, object): """This is the main class interface for Pexpect. Use this class to start and control child applications. """ def __init__(self, command, args=[], timeout=30, maxread=60000, searchwindowsize=None, logfile=None, cwd=None, env=None, codepage=None, columns=None, rows=None): self.stdin = sys.stdin self.stdout = sys.stdout self.stderr = sys.stderr self.searcher = None self.ignorecase = False self.before = None self.after = None self.match = None self.match_index = None self.terminated = True self.exitstatus = None self.signalstatus = None self.status = None # status returned by os.waitpid self.flag_eof = False self.pid = None self.child_fd = -1 # initially closed self.timeout = timeout self.delimiter = EOF self.logfile = logfile self.logfile_read = None # input from child (read_nonblocking) self.logfile_send = None # output to send (send, sendline) self.maxread = maxread # max bytes to read at one time into buffer self.buffer = '' # This is the read buffer. See maxread. self.searchwindowsize = searchwindowsize # Anything before searchwindowsize point is preserved, but not searched. self.delaybeforesend = 0.05 # Sets sleep time used just before sending data to child. Time in seconds. self.delayafterclose = 0.1 # Sets delay in close() method to allow kernel time to update process status. Time in seconds. self.delayafterterminate = 0.1 # Sets delay in terminate() method to allow kernel time to update process status. Time in seconds. self.softspace = False # File-like object. self.name = '<' + repr(self) + '>' # File-like object. self.encoding = None # File-like object. self.closed = True # File-like object. self.ocwd = os.getcwdu() self.cwd = cwd self.env = env self.codepage = codepage self.columns = columns self.rows = rows # allow dummy instances for subclasses that may not use command or args. if command is None: self.command = None self.args = None self.name = '' else: self._spawn (command, args) def __del__(self): """This makes sure that no system resources are left open. Python only garbage collects Python objects, not the child console.""" try: self.wtty.terminate_child() except: pass try: self.wtty.terminate() except: pass def _spawn(self,command,args=[]): """This starts the given command in a child process. This does all the fork/exec type of stuff for a pty. This is called by __init__. If args is empty then command will be parsed (split on spaces) and args will be set to parsed arguments. """ # The pid and child_fd of this object get set by this method. # Note that it is difficult for this method to fail. # You cannot detect if the child process cannot start. # So the only way you can tell if the child process started # or not is to try to read from the file descriptor. If you get # EOF immediately then it means that the child is already dead. # That may not necessarily be bad because you may haved spawned a child # that performs some task; creates no stdout output; and then dies. # If command is an int type then it may represent a file descriptor. if type(command) == type(0): raise ExceptionPexpect ('Command is an int type. If this is a file descriptor then maybe you want to use fdpexpect.fdspawn which takes an existing file descriptor instead of a command string.') if type (args) != type([]): raise TypeError ('The argument, args, must be a list.') if args == []: #Momentairly broken - path '\' characters being misinterpreted #self.args = split_command_line(command) self.args = [command] self.command = self.args[0] else: self.args = args[:] # work with a copy self.args.insert (0, command) self.command = command command_with_path = which(self.command) if command_with_path is None: raise ExceptionPexpect ('The command was not found or was not executable: %s.' % self.command) self.command = command_with_path self.args[0] = self.command self.name = '<' + ' '.join (self.args) + '>' #assert self.pid is None, 'The pid member should be None.' #assert self.command is not None, 'The command member should not be None.' self.wtty = Wtty(timeout=self.timeout, codepage=self.codepage, columns=self.columns, rows=self.rows) if self.cwd is not None: os.chdir(self.cwd) self.child_fd = self.wtty.spawn(self.command, self.args, self.env) if self.cwd is not None: # Restore the original working dir os.chdir(self.ocwd) self.terminated = False self.closed = False self.pid = self.wtty.pid def fileno (self): # File-like object. """There is no child fd.""" return 0 def close(self, force=True): # File-like object. """ Closes the child console.""" self.closed = self.terminate(force) if not self.closed: raise ExceptionPexpect ('close() could not terminate the child using terminate()') self.closed = True def isatty(self): # File-like object. """The child is always created with a console.""" return True def getecho (self): """This returns the terminal echo mode. This returns True if echo is on or False if echo is off. Child applications that are expecting you to enter a password often set ECHO False. See waitnoecho().""" return self.wtty.getecho() def setecho (self, state): """This sets the terminal echo mode on or off.""" self.wtty.setecho(state) def read_nonblocking (self, size = 1, timeout = -1): """This reads at most size characters from the child application. It includes a timeout. If the read does not complete within the timeout period then a TIMEOUT exception is raised. If the end of file is read then an EOF exception will be raised. If a log file was set using setlog() then all data will also be written to the log file. If timeout is None then the read may block indefinitely. If timeout is -1 then the self.timeout value is used. If timeout is 0 then the child is polled and if there was no data immediately ready then this will raise a TIMEOUT exception. The timeout refers only to the amount of time to read at least one character. This is not effected by the 'size' parameter, so if you call read_nonblocking(size=100, timeout=30) and only one character is available right away then one character will be returned immediately. It will not wait for 30 seconds for another 99 characters to come in. This is a wrapper around Wtty.read(). """ if self.closed: raise ValueError ('I/O operation on closed file in read_nonblocking().') if timeout == -1: timeout = self.timeout s = self.wtty.read_nonblocking(timeout, size) if s == '': if not self.wtty.isalive(): self.flag_eof = True raise EOF('End Of File (EOF) in read_nonblocking().') if timeout is None: # Do not raise TIMEOUT because we might be waiting for EOF # sleep to keep CPU utilization down time.sleep(.05) else: raise TIMEOUT ('Timeout exceeded in read_nonblocking().') else: if self.logfile is not None: self.logfile.write (s) self.logfile.flush() if self.logfile_read is not None: self.logfile_read.write (s) self.logfile_read.flush() return s def send(self, s): """This sends a string to the child process. This returns the number of bytes written. If a log file was set then the data is also written to the log. """ (self.delaybeforesend) if self.logfile is not None: self.logfile.write (s) self.logfile.flush() if self.logfile_send is not None: self.logfile_send.write (s) self.logfile_send.flush() c = self.wtty.write(s) return c ### UNIMPLEMENTED ### def sendcontrol(self, char): raise ExceptionPexpect ('sendcontrol() is not supported on windows') ### UNIMPLEMENTED ### ### Parent buffer does not wait for endline by default. def sendeof(self): raise ExceptionPexpect ('sendeof() is not supported on windows') def sendintr(self): """This sends a SIGINT to the child. It does not require the SIGINT to be the first character on a line. """ self.wtty.sendintr() def terminate(self, force=False): """Terminate the child. Force not used. """ if not self.isalive(): return True self.wtty.terminate_child() time.sleep(self.delayafterterminate) if not self.isalive(): return True return False def kill(self, sig): """Sig == sigint for ctrl-c otherwise the child is terminated.""" if sig == signal.SIGINT: self.wtty.sendintr() else: self.wtty.terminate_child() def wait(self): """This waits until the child exits. This is a blocking call. This will not read any data from the child, so this will block forever if the child has unread output and has terminated. In other words, the child may have printed output then called exit(); but, technically, the child is still alive until its output is read.""" if not self.isalive(): raise ExceptionPexpect ('Cannot wait for dead child process.') # We can't use os.waitpid under Windows because of 'permission denied' # exception? Perhaps if not running as admin (or UAC enabled under # Vista/7). Simply loop and wait for child to exit. while self.isalive(): time.sleep(.05) # Keep CPU utilization down return self.exitstatus def isalive(self): """Determines if the child is still alive.""" if self.terminated: return False if self.wtty.isalive(): return True else: self.exitstatus = GetExitCodeProcess(self.wtty.getchild()) # left-shift exit status by 8 bits like os.waitpid self.status = self.exitstatus << 8 self.terminated = True return False def getwinsize(self): """This returns the terminal window size of the child tty. The return value is a tuple of (rows, cols). """ return self.wtty.getwinsize() def setwinsize(self, r, c): """Set the size of the child screen buffer. """ self.wtty.setwinsize(r, c) ### Prototype changed def interact(self): """Makes the child console visible for interaction""" self.wtty.interact() ### Prototype changed def stop_interact(self): """Hides the child console from the user.""" self.wtty.stop_interact() ############################################################################## # End of spawn_windows class ############################################################################## class Wtty: def __init__(self, timeout=30, codepage=None, columns=None, rows=None): self.__buffer = StringIO() self.__bufferY = 0 self.__currentReadCo = PyCOORDType(0, 0) self.__parentPid = 0 self.__oproc = 0 self.conpid = 0 self.__otid = 0 self.__switch = True self.__childProcess = None self.codepage = (codepage or windll.kernel32.GetConsoleOutputCP() or windll.kernel32.GetOEMCP()) log("Code page: %s" % self.codepage) self.columns = columns self.rows = rows self.console = False self.lastRead = 0 self.lastReadData = "" self.pid = None self.processList = [] # We need a timeout for connecting to the child process self.timeout = timeout self.totalRead = 0 def spawn(self, command, args=[], env=None): """Spawns spawner.py with correct arguments.""" ts = time.time() self.startChild(args, env) while True: msg = PeekMessage(0, 0, 0, PM_REMOVE) childPid = msg[1][2] # Sometimes GetMessage returns a bogus PID, so keep calling it # until we can successfully connect to the child or timeout is # reached if childPid: try: self.__childProcess = win32api.OpenProcess(PROCESS_TERMINATE | PROCESS_QUERY_INFORMATION, False, childPid) except pywintypes.error, e: pass else: self.pid = childPid break if time.time() > ts + self.timeout: log('Timeout exceeded in Wtty.spawn().') break time.sleep(.05) if not self.__childProcess: raise ExceptionPexpect ('The process ' + args[0] + ' could not be started.') winHandle = int(GetConsoleWindow()) self.__switch = True if winHandle != 0: self.__parentPid = GetWindowThreadProcessId(winHandle)[1] # Do we have a console attached? Do not rely on winHandle, because # it will also be non-zero if we didn't have a console, and then # spawned a child process! Using sys.stdout.isatty() seems safe self.console = hasattr(sys.stdout, 'isatty') and sys.stdout.isatty() # If the original process had a console, record a list of attached # processes so we can check if we need to reattach/reallocate the # console later self.processList = GetConsoleProcessList() else: self.switchTo(False) self.__switch = False def startChild(self, args, env): si = GetStartupInfo() si.dwFlags = STARTF_USESHOWWINDOW si.wShowWindow = SW_HIDE # Determine the directory of wexpect.py or, if we are running 'frozen' # (eg. py2exe deployment), of the packed executable dirname = os.path.dirname(sys.executable if getattr(sys, 'frozen', False) else os.path.abspath(__file__)) if getattr(sys, 'frozen', False): logdir = appname else: logdir = dirname logdir = os.path.basename(logdir) spath = [dirname] pyargs = ['-c'] if getattr(sys, 'frozen', False): # If we are running 'frozen', add library.zip and lib\library.zip # to sys.path # py2exe: Needs appropriate 'zipfile' option in setup script and # 'bundle_files' 3 spath.append(os.path.join(dirname, 'library.zip')) spath.append(os.path.join(dirname, 'library.zip', appname)) if os.path.isdir(os.path.join(dirname, 'lib')): dirname = os.path.join(dirname, 'lib') spath.append(os.path.join(dirname, 'library.zip')) spath.append(os.path.join(dirname, 'library.zip', appname)) pyargs.insert(0, '-S') # skip 'import site' pid = GetCurrentProcessId() tid = win32api.GetCurrentThreadId() # If we are running 'frozen', expect python.exe in the same directory # as the packed executable. # py2exe: The python executable can be included via setup script by # adding it to 'data_files' commandLine = '"%s" %s "%s"' % (os.path.join(dirname, 'python.exe') if getattr(sys, 'frozen', False) else os.path.join(os.path.dirname(sys.executable), 'python.exe'), ' '.join(pyargs), "import sys; sys.path = %s + sys.path;" "args = %s; import wexpect;" "wexpect.ConsoleReader(wexpect.join_args(args), %i, %i, cp=%i, c=%s, r=%s, logdir=%r)" % (("%r" % spath).replace('"', r'\"'), ("%r" % args).replace('"', r'\"'), pid, tid, self.codepage, self.columns, self.rows, logdir)) log(commandLine) self.__oproc, _, self.conpid, self.__otid = CreateProcess(None, commandLine, None, None, False, CREATE_NEW_CONSOLE, env, None, si) def switchTo(self, attached=True): """Releases from the current console and attatches to the childs.""" if not self.__switch or not self.__oproc_isalive(): return if attached: FreeConsole() AttachConsole(self.conpid) self.__consin = GetStdHandle(STD_INPUT_HANDLE) self.__consout = self.getConsoleOut() def switchBack(self): """Releases from the current console and attaches to the parents.""" if not self.__switch or not self.__oproc_isalive(): return if self.console: # If we originally had a console, re-attach it (or allocate a new one) # If we didn't have a console to begin with, there's no need to # re-attach/allocate FreeConsole() if len(self.processList) > 1: # Our original console is still present, re-attach AttachConsole(self.__parentPid) else: # Our original console has been free'd, allocate a new one AllocConsole() self.__consin = None self.__consout = None def getConsoleOut(self): consout = win32file.CreateFile('CONOUT$', GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, None, OPEN_EXISTING, 0, 0) return PyConsoleScreenBufferType(consout) def getchild(self): """Returns a handle to the child process.""" return self.__childProcess def terminate(self): """Terminate the ConsoleReader process.""" win32api.TerminateProcess(self.__oproc, 1) def terminate_child(self): """Terminate the child process.""" win32api.TerminateProcess(self.__childProcess, 1) def createKeyEvent(self, char): """Creates a single key record corrosponding to the ascii character char.""" evt = PyINPUT_RECORDType(KEY_EVENT) evt.KeyDown = True evt.Char = char if char in ("\n", "\r"): evt.VirtualKeyCode = 0x0d # VK_RETURN evt.RepeatCount = 1 return evt def write(self, s): """Writes input into the child consoles input buffer.""" if len(s) == 0: return 0 records = [self.createKeyEvent(c) for c in unicode(s)] self.switchTo() try: wrote = self.__consin.WriteConsoleInput(records) except Exception, e: log(e, '_exceptions') self.switchBack() raise self.switchBack() return wrote def getPoint(self, offset): """Converts an offset to a point represented as a tuple.""" consinfo = self.__consout.GetConsoleScreenBufferInfo() x = offset % consinfo['Size'].X y = offset / consinfo['Size'].X return (x, y) def getOffset(self, x, y): """Converts a tuple-point to an offset.""" consinfo = self.__consout.GetConsoleScreenBufferInfo() return x + y * consinfo['Size'].X def readConsole(self, startCo, endCo): """Reads the console area from startCo to endCo and returns it as a string.""" buff = [] self.lastRead = 0 startCo = PyCOORDType(startCo.X, startCo.Y) endX = endCo.X endY = endCo.Y while True: startOff = self.getOffset(startCo.X, startCo.Y) endOff = self.getOffset(endX, endY) readlen = endOff - startOff if readlen > 4000: readlen = 4000 endPoint = self.getPoint(startOff + 4000) else: endPoint = self.getPoint(endOff) s = self.__consout.ReadConsoleOutputCharacter(readlen, startCo) ln = len(s) self.lastRead += ln self.totalRead += ln buff.append(s) startCo.X, startCo.Y = endPoint[0], endPoint[1] if readlen <= 0 or (startCo.X >= endX and startCo.Y >= endY): break return ''.join(buff) def parseData(self, s): """Ensures that special characters are interpretted as newlines or blanks, depending on if there written over characters or screen-buffer-fill characters.""" consinfo = self.__consout.GetConsoleScreenBufferInfo() strlist = [] for i, c in enumerate(s): strlist.append(c) if (self.totalRead - self.lastRead + i + 1) % consinfo['Size'].X == 0: strlist.append('\r\n') s = '\r\n'.join([line.rstrip(u' ') for line in ''.join(strlist).split('\r\n')]) try: return s.encode("cp%i" % self.codepage, 'replace') except LookupError: return s.encode(getattr(sys.stdout, 'encoding', None) or sys.getdefaultencoding(), 'replace') def readConsoleToCursor(self): """Reads from the current read position to the current cursor position and inserts the string into self.__buffer.""" if not self.__consout: return "" consinfo = self.__consout.GetConsoleScreenBufferInfo() cursorPos = consinfo['CursorPosition'] #log('=' * 80) #log('cursor: %r, current: %r' % (cursorPos, self.__currentReadCo)) if cursorPos.Y < self.__currentReadCo.Y: # Has the child cleared the screen buffer? self.__buffer.seek(0) self.__buffer.truncate() self.__bufferY = 0 self.__currentReadCo.X = 0 self.__currentReadCo.Y = 0 isSameX = cursorPos.X == self.__currentReadCo.X isSameY = cursorPos.Y == self.__currentReadCo.Y isSamePos = isSameX and isSameY #log('isSameY: %r' % isSameY) #log('isSamePos: %r' % isSamePos) if isSameY or not self.lastReadData.endswith('\r\n'): # Read the current slice again self.totalRead -= self.lastRead self.__currentReadCo.X = 0 self.__currentReadCo.Y = self.__bufferY #log('cursor: %r, current: %r' % (cursorPos, self.__currentReadCo)) raw = self.readConsole(self.__currentReadCo, cursorPos) rawlist = [] while raw: rawlist.append(raw[:consinfo['Size'].X]) raw = raw[consinfo['Size'].X:] raw = ''.join(rawlist) s = self.parseData(raw) for i, line in enumerate(reversed(rawlist)): if len(line) == consinfo['Size'].X: # Record the Y offset where the most recent line break was detected self.__bufferY += len(rawlist) - i break #log('lastReadData: %r' % self.lastReadData) #log('s: %r' % s) #isSameData = False if isSamePos and self.lastReadData == s: #isSameData = True s = '' #log('isSameData: %r' % isSameData) #log('s: %r' % s) if s: lastReadData = self.lastReadData pos = self.getOffset(self.__currentReadCo.X, self.__currentReadCo.Y) self.lastReadData = s if isSameY or not lastReadData.endswith('\r\n'): # Detect changed lines self.__buffer.seek(pos) buf = self.__buffer.read() #log('buf: %r' % buf) #log('raw: %r' % raw) if raw.startswith(buf): # Line has grown rawslice = raw[len(buf):] # Update last read bytes so line breaks can be detected in parseData lastRead = self.lastRead self.lastRead = len(rawslice) s = self.parseData(rawslice) self.lastRead = lastRead else: # Cursor has been repositioned s = '\r' + s #log('s: %r' % s) self.__buffer.seek(pos) self.__buffer.truncate() self.__buffer.write(raw) self.__currentReadCo.X = cursorPos.X self.__currentReadCo.Y = cursorPos.Y return s def read_nonblocking(self, timeout, size): """Reads data from the console if available, otherwise waits timeout seconds, and writes the string 'None' to the pipe if no data is available after that time.""" self.switchTo() consinfo = self.__consout.GetConsoleScreenBufferInfo() cursorPos = consinfo['CursorPosition'] maxconsoleY = consinfo['Size'].Y / 2 reset = False eof = False try: while True: #Wait for child process to be paused if cursorPos.Y > maxconsoleY: reset = True time.sleep(.2) start = time.clock() s = self.readConsoleToCursor() if reset: self.refreshConsole() reset = False if len(s) != 0: self.switchBack() return s if eof or timeout <= 0: self.switchBack() if eof and self.__oproc_isalive(): try: TerminateProcess(self.__oproc, 0) except pywintypes.error, e: log(e, '_exceptions') log('Could not terminate ConsoleReader after child exited.') return '' if not self.isalive(): eof = True # Child has already terminated, but there may still be # output coming in with a slight delay time.sleep(.1) time.sleep(0.001) end = time.clock() timeout -= end - start except Exception, e: log(e, '_exceptions') log('End Of File (EOF) in Wtty.read_nonblocking().') self.switchBack() raise EOF('End Of File (EOF) in Wtty.read_nonblocking().') def refreshConsole(self): """Clears the console after pausing the child and reading all the data currently on the console. The last line before clearing becomes the first line after clearing.""" consinfo = self.__consout.GetConsoleScreenBufferInfo() cursorPos = consinfo['CursorPosition'] startCo = PyCOORDType(0, cursorPos.Y) self.totalRead = 0 raw = self.readConsole(startCo, cursorPos) orig = PyCOORDType(0, 0) self.__consout.SetConsoleCursorPosition(orig) writelen = consinfo['Size'].X * consinfo['Size'].Y self.__consout.FillConsoleOutputCharacter(u' ', writelen, orig) self.__consout.WriteConsoleOutputCharacter(raw, orig) cursorPos.Y = 0 self.__consout.SetConsoleCursorPosition(cursorPos) self.__currentReadCo = cursorPos self.__bufferY = 0 self.__buffer.truncate(0) self.__buffer.write(raw) def setecho(self, state): """Sets the echo mode of the child console.""" self.switchTo() try: mode = self.__consin.GetConsoleMode() if state: mode |= 0x0004 else: mode &= ~0x0004 self.__consin.SetConsoleMode(mode) except: self.switchBack() raise self.switchBack() def getecho(self): """Returns the echo mode of the child console.""" self.switchTo() try: mode = self.__consin.GetConsoleMode() ret = (mode & 0x0004) > 0 self.switchBack() except: self.switchBack() raise return ret def getwinsize(self): """Returns the size of the child console as a tuple of (rows, columns).""" self.switchTo() try: size = self.__consout.GetConsoleScreenBufferInfo()['Size'] self.switchBack() except: self.switchBack() raise return (size.Y, size.X) def setwinsize(self, r, c): """Sets the child console screen buffer size to (r, c).""" self.switchTo() try: self.__consout.SetConsoleScreenBufferSize(PyCOORDType(c, r)) except: self.switchBack() raise self.switchBack() def interact(self): """Displays the child console for interaction.""" if not self.isalive(): return self.switchTo() try: ShowWindow(GetConsoleWindow(), SW_SHOW) except: self.switchBack() raise self.switchBack() def stop_interact(self): """Hides the child console.""" self.switchTo() try: ShowWindow(GetConsoleWindow(), SW_HIDE) except: self.switchBack() raise self.switchBack() def isalive(self): """True if the child is still alive, false otherwise""" return GetExitCodeProcess(self.__childProcess) == STILL_ACTIVE def __oproc_isalive(self): return GetExitCodeProcess(self.__oproc) == STILL_ACTIVE def sendintr(self): """Sends the sigint signal to the child.""" self.switchTo() try: time.sleep(.15) win32api.GenerateConsoleCtrlEvent(CTRL_BREAK_EVENT, self.pid) time.sleep(.25) except: self.switchBack() raise self.switchBack() class ConsoleReader: def __init__(self, path, pid, tid, env=None, cp=None, c=None, r=None, logdir=None): self.logdir = logdir log('=' * 80, 'consolereader', logdir) log("OEM code page: %s" % windll.kernel32.GetOEMCP(), 'consolereader', logdir) consolecp = windll.kernel32.GetConsoleOutputCP() log("Console output code page: %s" % consolecp, 'consolereader', logdir) if consolecp != cp: log("Setting console output code page to %s" % cp, 'consolereader', logdir) try: SetConsoleOutputCP(cp) except Exception, e: log(e, 'consolereader_exceptions', logdir) else: log("Console output code page: %s" % windll.kernel32.GetConsoleOutputCP(), 'consolereader', logdir) log('Spawning %s' % path, 'consolereader', logdir) try: try: consout = self.getConsoleOut() self.initConsole(consout, c, r) SetConsoleTitle(path) si = GetStartupInfo() self.__childProcess, _, childPid, self.__tid = CreateProcess(None, path, None, None, False, CREATE_NEW_PROCESS_GROUP, None, None, si) except Exception, e: log(e, 'consolereader_exceptions', logdir) time.sleep(.1) win32api.PostThreadMessage(int(tid), WM_USER, 0, 0) sys.exit() time.sleep(.1) win32api.PostThreadMessage(int(tid), WM_USER, childPid, 0) parent = win32api.OpenProcess(PROCESS_TERMINATE | PROCESS_QUERY_INFORMATION , 0, int(pid)) paused = False cursorinfo = consout.GetConsoleCursorInfo() while GetExitCodeProcess(self.__childProcess) == STILL_ACTIVE: try: if GetExitCodeProcess(parent) != STILL_ACTIVE: try: TerminateProcess(self.__childProcess, 0) except pywintypes.error, e: log(e, 'consolereader_exceptions', logdir) sys.exit() consinfo = consout.GetConsoleScreenBufferInfo() cursorPos = consinfo['CursorPosition'] maxconsoleY = consinfo['Size'].Y / 2 if cursorPos.Y > maxconsoleY and not paused: #log('ConsoleReader.__init__: cursorPos %s' #% cursorPos, 'consolereader', logdir) #log('suspendThread', 'consolereader', logdir) self.suspendThread() paused = True SetConsoleTitle(path + ' (suspended)') # Hide cursor consout.SetConsoleCursorInfo(cursorinfo[0], 0) if cursorPos.Y <= maxconsoleY and paused: #log('ConsoleReader.__init__: cursorPos %s' #% cursorPos, 'consolereader', logdir) #log('resumeThread', 'consolereader', logdir) self.resumeThread() paused = False SetConsoleTitle(path) # Show cursor consout.SetConsoleCursorInfo(cursorinfo[0], cursorinfo[1]) time.sleep(.1) except KeyboardInterrupt: # Only let child react to CTRL+C, ignore in ConsoleReader pass SetConsoleTitle(path + ' (terminated)') consout.SetConsoleCursorInfo(cursorinfo[0], 0) # Hide cursor while GetExitCodeProcess(parent) == STILL_ACTIVE: time.sleep(.1) except Exception, e: log(e, 'consolereader_exceptions', logdir) def handler(self, sig): log(sig, 'consolereader', logdir) return False def getConsoleOut(self): consout = win32file.CreateFile('CONOUT$', GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, None, OPEN_EXISTING, 0, 0) return PyConsoleScreenBufferType(consout) def initConsole(self, consout, c=None, r=None): rect = PySMALL_RECTType(0, 0, 79, 24) consout.SetConsoleWindowInfo(True, rect) size = PyCOORDType(c or 80, r or 16000) consout.SetConsoleScreenBufferSize(size) pos = PyCOORDType(0, 0) consout.FillConsoleOutputCharacter(u' ', size.X * size.Y, pos) def suspendThread(self): """Pauses the main thread of the child process.""" handle = windll.kernel32.OpenThread(THREAD_SUSPEND_RESUME, 0, self.__tid) SuspendThread(handle) def resumeThread(self): """Un-pauses the main thread of the child process.""" handle = windll.kernel32.OpenThread(THREAD_SUSPEND_RESUME, 0, self.__tid) ResumeThread(handle) class searcher_string (object): """This is a plain string search helper for the spawn.expect_any() method. Attributes: eof_index - index of EOF, or -1 timeout_index - index of TIMEOUT, or -1 After a successful match by the search() method the following attributes are available: start - index into the buffer, first byte of match end - index into the buffer, first byte after match match - the matching string itself """ def __init__(self, strings): """This creates an instance of searcher_string. This argument 'strings' may be a list; a sequence of strings; or the EOF or TIMEOUT types. """ self.eof_index = -1 self.timeout_index = -1 self._strings = [] for n, s in zip(range(len(strings)), strings): if s is EOF: self.eof_index = n continue if s is TIMEOUT: self.timeout_index = n continue self._strings.append((n, s)) def __str__(self): """This returns a human-readable string that represents the state of the object.""" ss = [ (ns[0],' %d: "%s"' % ns) for ns in self._strings ] ss.append((-1,'searcher_string:')) if self.eof_index >= 0: ss.append ((self.eof_index,' %d: EOF' % self.eof_index)) if self.timeout_index >= 0: ss.append ((self.timeout_index,' %d: TIMEOUT' % self.timeout_index)) ss.sort() ss = zip(*ss)[1] return '\n'.join(ss) def search(self, buffer, freshlen, searchwindowsize=None): """This searches 'buffer' for the first occurence of one of the search strings. 'freshlen' must indicate the number of bytes at the end of 'buffer' which have not been searched before. It helps to avoid searching the same, possibly big, buffer over and over again. See class spawn for the 'searchwindowsize' argument. If there is a match this returns the index of that string, and sets 'start', 'end' and 'match'. Otherwise, this returns -1. """ absurd_match = len(buffer) first_match = absurd_match # 'freshlen' helps a lot here. Further optimizations could # possibly include: # # using something like the Boyer-Moore Fast String Searching # Algorithm; pre-compiling the search through a list of # strings into something that can scan the input once to # search for all N strings; realize that if we search for # ['bar', 'baz'] and the input is '...foo' we need not bother # rescanning until we've read three more bytes. # # Sadly, I don't know enough about this interesting topic. /grahn for index, s in self._strings: if searchwindowsize is None: # the match, if any, can only be in the fresh data, # or at the very end of the old data offset = -(freshlen+len(s)) else: # better obey searchwindowsize offset = -searchwindowsize n = buffer.find(s, offset) if n >= 0 and n < first_match: first_match = n best_index, best_match = index, s if first_match == absurd_match: return -1 self.match = best_match self.start = first_match self.end = self.start + len(self.match) return best_index class searcher_re (object): """This is regular expression string search helper for the spawn.expect_any() method. Attributes: eof_index - index of EOF, or -1 timeout_index - index of TIMEOUT, or -1 After a successful match by the search() method the following attributes are available: start - index into the buffer, first byte of match end - index into the buffer, first byte after match match - the re.match object returned by a succesful re.search """ def __init__(self, patterns): """This creates an instance that searches for 'patterns' Where 'patterns' may be a list or other sequence of compiled regular expressions, or the EOF or TIMEOUT types.""" self.eof_index = -1 self.timeout_index = -1 self._searches = [] for n, s in zip(range(len(patterns)), patterns): if s is EOF: self.eof_index = n continue if s is TIMEOUT: self.timeout_index = n continue self._searches.append((n, s)) def __str__(self): """This returns a human-readable string that represents the state of the object.""" ss = [ (n,' %d: re.compile("%s")' % (n,str(s.pattern))) for n,s in self._searches] ss.append((-1,'searcher_re:')) if self.eof_index >= 0: ss.append ((self.eof_index,' %d: EOF' % self.eof_index)) if self.timeout_index >= 0: ss.append ((self.timeout_index,' %d: TIMEOUT' % self.timeout_index)) ss.sort() ss = zip(*ss)[1] return '\n'.join(ss) def search(self, buffer, freshlen, searchwindowsize=None): """This searches 'buffer' for the first occurence of one of the regular expressions. 'freshlen' must indicate the number of bytes at the end of 'buffer' which have not been searched before. See class spawn for the 'searchwindowsize' argument. If there is a match this returns the index of that string, and sets 'start', 'end' and 'match'. Otherwise, returns -1.""" absurd_match = len(buffer) first_match = absurd_match # 'freshlen' doesn't help here -- we cannot predict the # length of a match, and the re module provides no help. if searchwindowsize is None: searchstart = 0 else: searchstart = max(0, len(buffer)-searchwindowsize) for index, s in self._searches: match = s.search(buffer, searchstart) if match is None: continue n = match.start() if n < first_match: first_match = n the_match = match best_index = index if first_match == absurd_match: return -1 self.start = first_match self.match = the_match self.end = self.match.end() return best_index def log(e, suffix='', logdir=None): if isinstance(e, Exception): # Get the full traceback e = traceback.format_exc() #if hasattr(sys.stdout, 'isatty') and sys.stdout.isatty(): ## Only try to print if stdout is a tty, otherwise we might get ## an 'invalid handle' exception #print e if not logdir: if getattr(sys, 'frozen', False): logdir = appname else: logdir = os.path.split(os.path.dirname(os.path.abspath(__file__))) if logdir[-1] == 'lib': logdir.pop() logdir = logdir[-1] if sys.platform == "win32": parent = SHGetSpecialFolderPath(0, CSIDL_APPDATA, 1) elif sys.platform == "darwin": parent = os.path.join(os.path.expanduser("~"), "Library", "Logs") else: parent = os.getenv("XDG_DATA_HOME", os.path.expandvars("$HOME/.local/share")) # If old user data directory exists, use its basename if logdir == appname and os.path.isdir(os.path.join(parent, "dispcalGUI")): logdir = "dispcalGUI" logdir = os.path.join(parent, logdir) if sys.platform != "darwin": logdir = os.path.join(logdir, "logs") if not os.path.exists(logdir): try: os.makedirs(logdir) except OSError: pass if os.path.isdir(logdir) and os.access(logdir, os.W_OK): logfile = os.path.join(logdir, 'wexpect%s.log' % suffix) if os.path.isfile(logfile): try: logstat = os.stat(logfile) except Exception, exception: pass else: try: mtime = time.localtime(logstat.st_mtime) except ValueError, exception: # This can happen on Windows because localtime() is buggy on # that platform. See: # http://stackoverflow.com/questions/4434629/zipfile-module-in-python-runtime-problems # http://bugs.python.org/issue1760357 # To overcome this problem, we ignore the real modification # date and force a rollover mtime = time.localtime(time() - 60 * 60 * 24) if time.localtime()[:3] > mtime[:3]: # do rollover try: os.remove(logfile) except Exception, exception: pass try: fout = open(logfile, 'a') except: pass else: ts = time.time() fout.write('%s,%s %s\n' % (time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(ts)), ('%3f' % (ts - int(ts)))[2:5], e)) fout.close() def excepthook(etype, value, tb): log(''.join(traceback.format_exception(etype, value, tb))) #sys.excepthook = excepthook def which (filename): """This takes a given filename; tries to find it in the environment path; then checks if it is executable. This returns the full path to the filename if found and executable. Otherwise this returns None.""" # Special case where filename already contains a path. if os.path.dirname(filename) != '': if os.access (filename, os.X_OK): return filename if not os.environ.has_key('PATH') or os.environ['PATH'] == '': p = os.defpath else: p = os.environ['PATH'] # Oddly enough this was the one line that made Pexpect # incompatible with Python 1.5.2. #pathlist = p.split (os.pathsep) pathlist = string.split (p, os.pathsep) for path in pathlist: f = os.path.join(path, filename) if os.access(f, os.X_OK): return f return None def join_args(args): """Joins arguments into a command line. It quotes all arguments that contain spaces or any of the characters ^!$%&()[]{}=;'+,`~""" commandline = [] for arg in args: if re.search('[\^!$%&()[\]{}=;\'+,`~\s]', arg): arg = '"%s"' % arg commandline.append(arg) return ' '.join(commandline) def split_command_line(command_line): """This splits a command line into a list of arguments. It splits arguments on spaces, but handles embedded quotes, doublequotes, and escaped characters. It's impossible to do this with a regular expression, so I wrote a little state machine to parse the command line. """ arg_list = [] arg = '' # Constants to name the states we can be in. state_basic = 0 state_esc = 1 state_singlequote = 2 state_doublequote = 3 state_whitespace = 4 # The state of consuming whitespace between commands. state = state_basic state_backup = state for c in command_line: if state not in (state_esc, state_singlequote) and c == '\\': # Escape the next character state_backup = state state = state_esc elif state == state_basic or state == state_whitespace: if c == r"'": # Handle single quote state = state_singlequote elif c == r'"': # Handle double quote state = state_doublequote elif c.isspace(): # Add arg to arg_list if we aren't in the middle of whitespace. if state == state_whitespace: None # Do nothing. else: arg_list.append(arg) arg = '' state = state_whitespace else: arg = arg + c state = state_basic elif state == state_esc: # Follow bash escaping rules within double quotes: # http://www.gnu.org/software/bash/manual/html_node/Double-Quotes.html if state_backup == state_doublequote and c not in ('$', '`', '"', '\\', '\n'): arg += '\\' arg = arg + c if state_backup != state_whitespace: state = state_backup else: state = state_basic elif state == state_singlequote: if c == r"'": state = state_basic else: arg = arg + c elif state == state_doublequote: if c == r'"': state = state_basic else: arg = arg + c if arg != '': arg_list.append(arg) return arg_list DisplayCAL-3.1.0.0/DisplayCAL/worker.py0000644000076500000000000136432512653526636017336 0ustar devwheel00000000000000# -*- coding: utf-8 -*- # stdlib from __future__ import with_statement from binascii import hexlify import ctypes import getpass import glob import math import os import pipes import re import socket import shutil import string import subprocess as sp import sys import tempfile import textwrap import traceback import urllib2 import zipfile from UserString import UserString from hashlib import md5 from threading import _MainThread, currentThread from time import sleep, strftime, time if sys.platform == "darwin": from platform import mac_ver from thread import start_new_thread elif sys.platform == "win32": from ctypes import windll import _winreg # 3rd party if sys.platform == "win32": from win32com.shell import shell as win32com_shell import pythoncom import win32api import win32con elif sys.platform != "darwin": try: import dbus except ImportError: dbus = None dbus_session = None else: try: dbus_session = dbus.SessionBus() except dbus.exceptions.DBusException: dbus_session = None # custom import CGATS import ICCProfile as ICCP import audio import colormath import config import defaultpaths import imfile import localization as lang import wexpect from argyll_cgats import (add_dispcal_options_to_cal, add_options_to_ti3, cal_to_fake_profile, extract_fix_copy_cal, ti3_to_ti1, vcgt_to_cal, verify_cgats) from argyll_instruments import (get_canonical_instrument_name, instruments as all_instruments) from argyll_names import (names as argyll_names, altnames as argyll_altnames, optional as argyll_optional, viewconds, intents) from config import (autostart, autostart_home, script_ext, defaults, enc, exe, exe_ext, fs_enc, getcfg, geticon, get_data_path, get_total_patches, get_verified_path, isapp, isexe, is_ccxx_testchart, logdir, profile_ext, pydir, setcfg, split_display_name, writecfg, appbasename) from defaultpaths import cache, iccprofiles_home, iccprofiles_display_home from edid import WMIError, get_edid from jsondict import JSONDict from log import DummyLogger, LogFile, get_file_logger, log, safe_print import madvr from meta import VERSION, VERSION_BASE, domain, name as appname, version from options import debug, test, test_require_sensor_cal, verbose from ordereddict import OrderedDict from patterngenerators import (PrismaPatternGeneratorClient, ResolveLSPatternGeneratorServer, ResolveCMPatternGeneratorServer) from trash import trash from util_io import (EncodedWriter, Files, GzipFileProper, StringIOu as StringIO, TarFileProper) from util_list import intlist if sys.platform == "darwin": from util_mac import (mac_app_activate, mac_terminal_do_script, mac_terminal_set_colors, osascript) elif sys.platform == "win32": import util_win import colord from util_os import (expanduseru, getenvu, is_superuser, launch_file, make_win32_compatible_long_path, quote_args, which, whereis) if sys.platform == "win32" and sys.getwindowsversion() >= (6, ): from util_os import win64_disable_file_system_redirection from util_str import (safe_basestring, safe_str, safe_unicode, strtr, universal_newlines) from wxaddons import BetterCallLater, BetterWindowDisabler, wx from wxwindows import ConfirmDialog, InfoDialog, ProgressDialog, SimpleTerminal from wxDisplayAdjustmentFrame import DisplayAdjustmentFrame from wxDisplayUniformityFrame import DisplayUniformityFrame from wxUntetheredFrame import UntetheredFrame xrandr = None if sys.platform not in ("darwin", "win32"): try: import xrandr except ImportError: pass import wx.lib.delayedresult as delayedresult INST_CAL_MSGS = ["Do a reflective white calibration", "Do a transmissive white calibration", "Do a transmissive dark calibration", "Place the instrument on its reflective white reference", "Click the instrument on its reflective white reference", "Place the instrument in the dark", "Place cap on the instrument", # i1 Pro "or place on the calibration reference", # i1 Pro "Place ambient adapter and cap on the instrument", "Set instrument sensor to calibration position", # ColorMunki "Place the instrument on its transmissive white source", "Use the appropriate tramissive blocking", "Change filter on instrument to"] USE_WPOPEN = 0 keycodes = {wx.WXK_NUMPAD0: ord("0"), wx.WXK_NUMPAD1: ord("1"), wx.WXK_NUMPAD2: ord("2"), wx.WXK_NUMPAD3: ord("3"), wx.WXK_NUMPAD4: ord("4"), wx.WXK_NUMPAD5: ord("5"), wx.WXK_NUMPAD6: ord("6"), wx.WXK_NUMPAD7: ord("7"), wx.WXK_NUMPAD8: ord("8"), wx.WXK_NUMPAD9: ord("9"), wx.WXK_NUMPAD_ADD: ord("+"), wx.WXK_NUMPAD_ENTER: ord("\n"), wx.WXK_NUMPAD_EQUAL: ord("="), wx.WXK_NUMPAD_DIVIDE: ord("/"), wx.WXK_NUMPAD_MULTIPLY: ord("*"), wx.WXK_NUMPAD_SUBTRACT: ord("-")} technology_strings_170 = JSONDict() technology_strings_170["u"] = "Unknown" technology_strings_170.path = "technology_strings-1.7.0.json" # Argyll 1.7.1 fixes the technology type and display type selector # "uniqueification" bug and thus uses different technology selectors technology_strings_171 = JSONDict() technology_strings_171["u"] = "Unknown" technology_strings_171.path = "technology_strings-1.7.1.json" workers = [] def Property(func): return property(**func()) def add_keywords_to_cgats(cgats, keywords): """ Add keywords to CGATS """ if not isinstance(cgats, CGATS.CGATS): cgats = CGATS.CGATS(cgats) for keyword, value in keywords.iteritems(): cgats[0].add_keyword(keyword, value) return cgats def check_argyll_bin(paths=None): """ Check if the Argyll binaries can be found. """ prev_dir = None for name in argyll_names: exe = get_argyll_util(name, paths) if not exe: if name in argyll_optional: continue return False cur_dir = os.path.dirname(exe) if prev_dir: if cur_dir != prev_dir: if name in argyll_optional: if verbose: safe_print("Warning: Optional Argyll " "executable %s is not in the same " "directory as the main executables " "(%s)." % (exe, prev_dir)) else: if verbose: safe_print("Error: Main Argyll " "executable %s is not in the same " "directory as the other executables " "(%s)." % (exe, prev_dir)) return False else: prev_dir = cur_dir if verbose >= 3: safe_print("Argyll binary directory:", cur_dir) if debug: safe_print("[D] check_argyll_bin OK") if debug >= 2: if not paths: paths = getenvu("PATH", os.defpath).split(os.pathsep) argyll_dir = (getcfg("argyll.dir") or "").rstrip(os.path.sep) if argyll_dir: if argyll_dir in paths: paths.remove(argyll_dir) paths = [argyll_dir] + paths safe_print("[D] Searchpath:\n ", "\n ".join(paths)) # Fedora doesn't ship Rec709.icm config.defaults["3dlut.input.profile"] = get_data_path(os.path.join("ref", "Rec709.icm")) or \ get_data_path(os.path.join("ref", "sRGB.icm")) or "" config.defaults["testchart.reference"] = get_data_path(os.path.join("ref", "ColorChecker.cie")) or "" config.defaults["gamap_profile"] = get_data_path(os.path.join("ref", "sRGB.icm")) or "" return True def check_create_dir(path): """ Try to create a directory and show an error message on failure. """ if not os.path.exists(path): try: os.makedirs(path) except Exception, exception: return Error(lang.getstr("error.dir_creation", path) + "\n\n" + safe_unicode(exception)) if not os.path.isdir(path): return Error(lang.getstr("error.dir_notdir", path)) return True def check_cal_isfile(cal=None, missing_msg=None, notfile_msg=None, silent=False): """ Check if a calibration file exists and show an error message if not. """ if not silent: if not missing_msg: missing_msg = lang.getstr("error.calibration.file_missing", cal) if not notfile_msg: notfile_msg = lang.getstr("file_notfile", cal) return check_file_isfile(cal, missing_msg, notfile_msg, silent) def check_profile_isfile(profile_path=None, missing_msg=None, notfile_msg=None, silent=False): """ Check if a profile exists and show an error message if not. """ if not silent: if not missing_msg: missing_msg = lang.getstr("error.profile.file_missing", profile_path) if not notfile_msg: notfile_msg = lang.getstr("file_notfile", profile_path) return check_file_isfile(profile_path, missing_msg, notfile_msg, silent) def check_file_isfile(filename, missing_msg=None, notfile_msg=None, silent=False): """ Check if a file exists and show an error message if not. """ if not os.path.exists(filename): if not silent: if not missing_msg: missing_msg = lang.getstr("file.missing", filename) return Error(missing_msg) return False if not os.path.isfile(filename): if not silent: if not notfile_msg: notfile_msg = lang.getstr("file.notfile", filename) return Error(notfile_msg) return False return True def check_set_argyll_bin(paths=None): """ Check if Argyll binaries can be found, otherwise let the user choose. """ if check_argyll_bin(paths): return True else: return set_argyll_bin() def check_ti3_criteria1(RGB, XYZ, black_XYZ, white_XYZ, delta_to_sRGB_threshold_E=10, delta_to_sRGB_threshold_L=10, delta_to_sRGB_threshold_C=75, delta_to_sRGB_threshold_H=75, print_debuginfo=True): sRGBLab = colormath.RGB2Lab(RGB[0] / 100.0, RGB[1] / 100.0, RGB[2] / 100.0, noadapt=not white_XYZ) if white_XYZ: if black_XYZ: black_Lab = colormath.XYZ2Lab(*colormath.adapt(black_XYZ[0], black_XYZ[1], black_XYZ[2], white_XYZ)) black_C = math.sqrt(math.pow(black_Lab[1], 2) + math.pow(black_Lab[2], 2)) if black_Lab[0] < 3 and black_C < 3: # Sanity check: Is this color reasonably dark and achromatic? # Then do BPC so we can compare better to perfect black sRGB XYZ = colormath.apply_bpc(XYZ[0], XYZ[1], XYZ[2], black_XYZ, (0, 0, 0), white_XYZ) XYZ = colormath.adapt(XYZ[0], XYZ[1], XYZ[2], white_XYZ) Lab = colormath.XYZ2Lab(*XYZ) delta_to_sRGB = colormath.delta(*sRGBLab + Lab + (2000, )) # Depending on how (a)chromatic the sRGB color is, scale the thresholds # Use math derived from DE2000 formula to get chroma and hue angle L, a, b = sRGBLab b_pow = math.pow(b, 2) C = math.sqrt(math.pow(a, 2) + b_pow) C_pow = math.pow(C, 7) G = .5 * (1 - math.sqrt(C_pow / (C_pow + math.pow(25, 7)))) a = (1 + G) * a C = math.sqrt(math.pow(a, 2) + b_pow) h = 0 if a == 0 and b == 0 else math.degrees(math.atan2(b, a)) + (0 if b >= 0 else 360.0) # C and h scaling factors C_scale = C / 100.0 h_scale = h / 360.0 # RGB hue, saturation and value scaling factors H, S, V = colormath.RGB2HSV(*[v / 100.0 for v in RGB]) SV_scale = S * V # Scale the thresholds delta_to_sRGB_threshold_E += (delta_to_sRGB_threshold_E * max(C_scale, SV_scale)) delta_to_sRGB_threshold_L += (delta_to_sRGB_threshold_L * max(C_scale, SV_scale)) # Allow higher chroma errors as luminance of reference decreases L_scale = max(1 - (1 * C_scale) + (100.0 - L) / 100.0, 1) delta_to_sRGB_threshold_C = ((delta_to_sRGB_threshold_C * max(C_scale, SV_scale) + 2) * L_scale) delta_to_sRGB_threshold_H = ((delta_to_sRGB_threshold_H * max(C_scale, h_scale, H, SV_scale) + 2) * L_scale) criteria1 = (delta_to_sRGB["E"] > delta_to_sRGB_threshold_E and (abs(delta_to_sRGB["L"]) > delta_to_sRGB_threshold_L or abs(delta_to_sRGB["C"]) > delta_to_sRGB_threshold_C or abs(delta_to_sRGB["H"]) > delta_to_sRGB_threshold_H)) # This patch has an unusually high delta 00 to its sRGB equivalent delta_to_sRGB["E_ok"] = delta_to_sRGB["E"] <= delta_to_sRGB_threshold_E delta_to_sRGB["L_ok"] = (abs(delta_to_sRGB["L"]) <= delta_to_sRGB_threshold_L) delta_to_sRGB["C_ok"] = (abs(delta_to_sRGB["C"]) <= delta_to_sRGB_threshold_C) delta_to_sRGB["H_ok"] = (abs(delta_to_sRGB["H"]) <= delta_to_sRGB_threshold_H) delta_to_sRGB["ok"] = (delta_to_sRGB["E_ok"] and delta_to_sRGB["L_ok"] and delta_to_sRGB["C_ok"] and delta_to_sRGB["H_ok"]) debuginfo = ("RGB: %6.2f %6.2f %6.2f RGB(sRGB)->Lab(D50): %6.2f %6.2f %6.2f " "L_scale: %5.3f C: %5.2f C_scale: %5.3f h: %5.2f " "h_scale: %5.3f H: %5.2f H_scale: %5.3f S: %5.2f " "V: %5.2f SV_scale: %5.3f Thresholds: E %5.2f L %5.2f " "C %5.2f H %5.2f XYZ->Lab(D50): %6.2f %6.2f %6.2f delta " "RGB(sRGB)->Lab(D50) to XYZ->Lab(D50): dE %5.2f dL %5.2f dC " "%5.2f dH %5.2f" % (RGB[0], RGB[1], RGB[2], sRGBLab[0], sRGBLab[1], sRGBLab[2], L_scale, C, C_scale, h, h_scale, H * 360, H, S, V, SV_scale, delta_to_sRGB_threshold_E, delta_to_sRGB_threshold_L, delta_to_sRGB_threshold_C, delta_to_sRGB_threshold_H, Lab[0], Lab[1], Lab[2], delta_to_sRGB["E"], delta_to_sRGB["L"], delta_to_sRGB["C"], delta_to_sRGB["H"])) if print_debuginfo: safe_print(debuginfo) return sRGBLab, Lab, delta_to_sRGB, criteria1, debuginfo def check_ti3_criteria2(prev_Lab, Lab, prev_sRGBLab, sRGBLab, prev_RGB, RGB, sRGB_delta_E_scale_factor=.5): delta = colormath.delta(*prev_Lab + Lab + (2000, )) sRGB_delta = colormath.delta(*prev_sRGBLab + sRGBLab + (2000, )) sRGB_delta["E"] *= sRGB_delta_E_scale_factor criteria2 = delta["E"] < sRGB_delta["E"] # These two patches have different RGB values # but suspiciously low delta E 76. if criteria2 and (prev_RGB[0] == prev_RGB[1] == prev_RGB[2] and RGB[0] == RGB[1] == RGB[2]): # If RGB gray, check if the Y difference makes sense criteria2 = ((RGB[0] > prev_RGB[0] and Lab[0] <= prev_Lab[0]) or (RGB[0] < prev_RGB[0] and Lab[0] >= prev_Lab[0])) delta["L_ok"] = not criteria2 delta["E_ok"] = True else: delta["E_ok"] = not criteria2 delta["L_ok"] = True return delta, sRGB_delta, criteria2 def check_ti3(ti3, print_debuginfo=True): """ Check subsequent patches' expected vs real deltaE and collect patches with different RGB values, but suspiciously low delta E Used as a means to find misreads. The expected dE is calculated by converting from a patches RGB values (assuming sRGB) to Lab and comparing the values. """ if not isinstance(ti3, CGATS.CGATS): ti3 = CGATS.CGATS(ti3) data = ti3.queryv1("DATA") datalen = len(data) black = data.queryi1({"RGB_R": 0, "RGB_G": 0, "RGB_B": 0}) if black: black = black["XYZ_X"], black["XYZ_Y"], black["XYZ_Z"] elif print_debuginfo: safe_print("Warning - no black patch found in CGATS") white = data.queryi1({"RGB_R": 100, "RGB_G": 100, "RGB_B": 100}) if white: white = white["XYZ_X"], white["XYZ_Y"], white["XYZ_Z"] elif print_debuginfo: safe_print("Warning - no white patch found in CGATS") suspicious = [] prev = {} delta = {} for index, item in data.iteritems(): (sRGBLab, Lab, delta_to_sRGB, criteria1, debuginfo) = check_ti3_criteria1((item["RGB_R"], item["RGB_G"], item["RGB_B"]), (item["XYZ_X"], item["XYZ_Y"], item["XYZ_Z"]), black, white, print_debuginfo=False) if (criteria1 or (prev and (max(prev["item"]["RGB_R"], item["RGB_R"]) - min(prev["item"]["RGB_R"], item["RGB_R"]) > 1.0 / 2.55 or max(prev["item"]["RGB_G"], item["RGB_G"]) - min(prev["item"]["RGB_G"], item["RGB_G"]) > 1.0 / 2.55 or max(prev["item"]["RGB_B"], item["RGB_B"]) - min(prev["item"]["RGB_B"], item["RGB_B"]) > 1.0 / 2.55))): if prev: (delta, sRGB_delta, criteria2) = check_ti3_criteria2(prev["Lab"], Lab, prev["sRGBLab"], sRGBLab, (prev["item"]["RGB_R"], prev["item"]["RGB_G"], prev["item"]["RGB_B"]), (item["RGB_R"], item["RGB_G"], item["RGB_B"])) else: criteria2 = False if criteria1 or criteria2: if print_debuginfo: if criteria2: debuginfo = (("%s dE to previous XYZ->Lab(D50): " "%5.3f dE_OK: %s L_OK: %s " "0.5 dE RGB(sRGB)->Lab(D50) to previous " "RGB(sRGB)->Lab(D50): %5.3f") % (debuginfo, delta["E"], delta["E_ok"], delta["L_ok"], sRGB_delta["E"])) sample_id = "Patch #%%.0%id" % len(str(datalen)) safe_print(sample_id % item.SAMPLE_ID, debuginfo) suspicious.append((prev["item"] if criteria2 else None, item, delta if criteria2 else None, sRGB_delta if criteria2 else None, prev["delta_to_sRGB"] if criteria2 else None, delta_to_sRGB)) prev["item"] = item prev["sRGBLab"] = sRGBLab prev["Lab"] = Lab prev["delta_to_sRGB"] = delta_to_sRGB return suspicious argyll_utils = {} def get_argyll_util(name, paths=None): """ Find a single Argyll utility. Return the full path. """ cfg_argyll_dir = getcfg("argyll.dir") if paths: cache_key = os.pathsep.join(paths) else: cache_key = cfg_argyll_dir exe = argyll_utils.get(cache_key, {}).get(name, None) if exe: return exe if not paths: paths = getenvu("PATH", os.defpath).split(os.pathsep) argyll_dir = (cfg_argyll_dir or "").rstrip(os.path.sep) if argyll_dir: if argyll_dir in paths: paths.remove(argyll_dir) paths = [argyll_dir] + paths elif verbose >= 4: safe_print("Info: Searching for", name, "in", os.pathsep.join(paths)) for path in paths: for altname in argyll_altnames.get(name, []): exe = which(altname + exe_ext, [path]) if exe: break if exe: break if verbose >= 4: if exe: safe_print("Info:", name, "=", exe) else: safe_print("Info:", "|".join(argyll_altnames[name]), "not found in", os.pathsep.join(paths)) if exe: if not cache_key in argyll_utils: argyll_utils[cache_key] = {} argyll_utils[cache_key][name] = exe return exe def get_argyll_utilname(name, paths=None): """ Find a single Argyll utility. Return the basename without extension. """ exe = get_argyll_util(name, paths) if exe: exe = os.path.basename(os.path.splitext(exe)[0]) return exe def get_argyll_version(name, silent=False, paths=None): """ Determine version of a certain Argyll utility. """ argyll_version_string = get_argyll_version_string(name, silent, paths) return parse_argyll_version_string(argyll_version_string) def get_argyll_version_string(name, silent=False, paths=None): argyll_version_string = "0.0.0" if (silent and check_argyll_bin(paths)) or (not silent and check_set_argyll_bin(paths)): cmd = get_argyll_util(name, paths) if sys.platform == "win32": startupinfo = sp.STARTUPINFO() startupinfo.dwFlags |= sp.STARTF_USESHOWWINDOW startupinfo.wShowWindow = sp.SW_HIDE else: startupinfo = None try: p = sp.Popen([cmd.encode(fs_enc), "-?"], stdin=sp.PIPE, stdout=sp.PIPE, stderr=sp.STDOUT, startupinfo=startupinfo) except Exception, exception: safe_print(cmd) safe_print(exception) return argyll_version_string for i, line in enumerate((p.communicate()[0] or "").splitlines()): if isinstance(line, basestring): line = line.strip() if i == 0 and "version" in line.lower(): argyll_version_string = line[line.lower().find("version")+8:] break return argyll_version_string def get_current_profile_path(include_display_profile=True, save_profile_if_no_path=False): profile = None profile_path = getcfg("calibration.file", False) if profile_path: filename, ext = os.path.splitext(profile_path) if ext.lower() in (".icc", ".icm"): try: profile = ICCP.ICCProfile(profile_path) except Exception, exception: safe_print("ICCP.ICCProfile(%r):" % profile_path, exception) elif include_display_profile: profile = config.get_display_profile() if profile and not profile.fileName and save_profile_if_no_path: if profile.ID == "\0" * 16: profile.calculateID() profile_cache_path = os.path.join(cache, "icc") if check_create_dir(profile_cache_path) is True: profile.fileName = os.path.join(profile_cache_path, "id=" + hexlify(profile.ID) + profile_ext) if not os.path.isfile(profile.fileName): profile.write() if profile: return profile.fileName def parse_argument_string(args): """ Parses an argument string and returns a list of arguments. """ return [re.sub('^["\']|["\']$', '', arg) for arg in re.findall('(?:^|\s+)(-[^\s"\']+|"[^"]+?"|\'[^\']+?\'|[^\s"\']+)', args)] def parse_argyll_version_string(argyll_version_string): argyll_version = re.findall("(\d+|[^.\d]+)", argyll_version_string) for i, v in enumerate(argyll_version): try: argyll_version[i] = int(v) except ValueError: pass return argyll_version def get_cfg_option_from_args(option_name, argmatch, args, whole=False): """ Parse args and return option (if found), otherwise default """ option = defaults[option_name] iarg = get_arg(argmatch, args, whole) if iarg: if len(iarg[1]) == len(argmatch): # Option value is the next argument if len(args) > iarg[0] + 1: option = args[iarg[0] + 1] else: # Option value follows argument directly option = iarg[1][len(argmatch):] return option def get_options_from_args(dispcal_args=None, colprof_args=None): """ Extract options used for dispcal and colprof from argument strings. """ re_options_dispcal = [ "[moupHVF]", "d(?:\d+(?:,\d+)?|madvr|web)", "[cv]\d+", "q(?:%s)" % "|".join(config.valid_values["calibration.quality"]), "y(?:%s)" % "|".join(filter(None, config.valid_values["measurement_mode"])), "[tT](?:\d+(?:\.\d+)?)?", "w\d+(?:\.\d+)?,\d+(?:\.\d+)?", "[bfakAB]\d+(?:\.\d+)?", "(?:g(?:240|709|l|s)|[gG]\d+(?:\.\d+)?)", "[pP]\d+(?:\.\d+)?,\d+(?:\.\d+)?,\d+(?:\.\d+)?", 'X(?:\s*\d+|\s+["\'][^"\']+?["\'])', # Argyll >= 1.3.0 colorimeter correction matrix / Argyll >= 1.3.4 calibration spectral sample "I[bw]{,2}", # Argyll >= 1.3.0 drift compensation "YA", # Argyll >= 1.5.0 disable adaptive mode "Q\w+" ] re_options_colprof = [ "q[lmh]", "b[lmh]", # B2A quality "a(?:%s)" % "|".join(config.valid_values["profile.type"]), '[sSMA]\s+["\'][^"\']+?["\']', "[cd](?:%s)" % "|".join(viewconds), "[tT](?:%s)" % "|".join(intents) ] options_dispcal = [] options_colprof = [] if dispcal_args: options_dispcal = re.findall(" -(" + "|".join(re_options_dispcal) + ")", " " + dispcal_args) if colprof_args: options_colprof = re.findall(" -(" + "|".join(re_options_colprof) + ")", " " + colprof_args) return options_dispcal, options_colprof def get_options_from_cprt(cprt): """ Extract options used for dispcal and colprof from profile copyright. """ if not isinstance(cprt, unicode): if isinstance(cprt, (ICCP.TextDescriptionType, ICCP.MultiLocalizedUnicodeType)): cprt = unicode(cprt) else: cprt = unicode(cprt, fs_enc, "replace") dispcal_args = cprt.split(" dispcal ") colprof_args = None if len(dispcal_args) > 1: dispcal_args[1] = dispcal_args[1].split(" colprof ") if len(dispcal_args[1]) > 1: colprof_args = dispcal_args[1][1] dispcal_args = dispcal_args[1][0] else: dispcal_args = None colprof_args = cprt.split(" colprof ") if len(colprof_args) > 1: colprof_args = colprof_args[1] else: colprof_args = None return dispcal_args, colprof_args def get_options_from_cal(cal): if not isinstance(cal, CGATS.CGATS): cal = CGATS.CGATS(cal) if not cal or not "ARGYLL_DISPCAL_ARGS" in cal[0] or \ not cal[0].ARGYLL_DISPCAL_ARGS: return [], [] dispcal_args = cal[0].ARGYLL_DISPCAL_ARGS[0].decode("UTF-7", "replace") return get_options_from_args(dispcal_args) def get_options_from_profile(profile): """ Try and get options from profile. First, try the 'targ' tag and look for the special DisplayCAL sections 'ARGYLL_DISPCAL_ARGS' and 'ARGYLL_COLPROF_ARGS'. If either does not exist, fall back to the copyright tag (DisplayCAL < 0.4.0.2) """ if not isinstance(profile, ICCP.ICCProfile): profile = ICCP.ICCProfile(profile) dispcal_args = None colprof_args = None if "targ" in profile.tags: ti3 = CGATS.CGATS(profile.tags.targ) if 1 in ti3 and "ARGYLL_DISPCAL_ARGS" in ti3[1] and \ ti3[1].ARGYLL_DISPCAL_ARGS: dispcal_args = ti3[1].ARGYLL_DISPCAL_ARGS[0].decode("UTF-7", "replace") if 0 in ti3 and "ARGYLL_COLPROF_ARGS" in ti3[0] and \ ti3[0].ARGYLL_COLPROF_ARGS: colprof_args = ti3[0].ARGYLL_COLPROF_ARGS[0].decode("UTF-7", "replace") if not dispcal_args and "cprt" in profile.tags: dispcal_args = get_options_from_cprt(profile.getCopyright())[0] if not colprof_args and "cprt" in profile.tags: colprof_args = get_options_from_cprt(profile.getCopyright())[1] return get_options_from_args(dispcal_args, colprof_args) def get_options_from_ti3(ti3): """ Try and get options from TI3 file by looking for the special DisplayCAL sections 'ARGYLL_DISPCAL_ARGS' and 'ARGYLL_COLPROF_ARGS'. """ if not isinstance(ti3, CGATS.CGATS): ti3 = CGATS.CGATS(ti3) dispcal_args = None colprof_args = None if 1 in ti3 and "ARGYLL_DISPCAL_ARGS" in ti3[1] and \ ti3[1].ARGYLL_DISPCAL_ARGS: dispcal_args = ti3[1].ARGYLL_DISPCAL_ARGS[0].decode("UTF-7", "replace") if 0 in ti3 and "ARGYLL_COLPROF_ARGS" in ti3[0] and \ ti3[0].ARGYLL_COLPROF_ARGS: colprof_args = ti3[0].ARGYLL_COLPROF_ARGS[0].decode("UTF-7", "replace") return get_options_from_args(dispcal_args, colprof_args) def get_pattern_geometry(): """ Return pattern geometry for pattern generator """ x, y, size = [float(v) for v in getcfg("dimensions.measureframe").split(",")] size = size * defaults["size.measureframe"] match = re.search("@ -?\d+, -?\d+, (\d+)x(\d+)", getcfg("displays", raw=True)) if match: display_size = [int(item) for item in match.groups()] else: display_size = 1920, 1080 w, h = [min(size / v, 1.0) for v in display_size] if config.get_display_name(None, True) == "Prisma": w = h x = (display_size[0] - w * display_size[0]) * x / display_size[0] y = (display_size[1] - h * display_size[1]) * y / display_size[1] x, y, w, h = [max(v, 0) for v in (x, y, w, h)] size = min((w * display_size[0] * h * display_size[1]) / float(display_size[0] * display_size[1]), 1.0) return x, y, w, h, size def get_python_and_pythonpath(): """ Return (system) python and pythonpath """ # Determine the path of python, and python module search paths # If we are running 'frozen', expect python.exe in the same directory # as the packed executable. # py2exe: The python executable can be included via setup script by # adding it to 'data_files' pythonpath = list(sys.path) dirname = os.path.dirname(sys.executable) if sys.platform == "win32": if getattr(sys, "frozen", False): pythonpath = [dirname] # If we are running 'frozen', add library.zip and lib\library.zip # to sys.path # py2exe: Needs appropriate 'zipfile' option in setup script and # 'bundle_files' 3 pythonpath.append(os.path.join(dirname, "library.zip")) pythonpath.append(os.path.join(dirname, "library.zip", appname)) if os.path.isdir(os.path.join(dirname, "lib")): dirname = os.path.join(dirname, "lib") pythonpath.append(os.path.join(dirname, "library.zip")) pythonpath.append(os.path.join(dirname, "library.zip", appname)) python = os.path.join(dirname, "python.exe") else: # Linux / Mac OS X if isapp: python = os.path.join(dirname, "python") else: paths = os.defpath.split(os.pathsep) python = (which("python2.7", paths) or which("python2.6", paths) or "/usr/bin/env python") return (python, pythonpath) def get_arg(argmatch, args, whole=False): """ Return first found entry beginning with the argmatch string or None """ for i, arg in enumerate(args): if (whole and arg == argmatch) or (not whole and arg.startswith(argmatch)): return i, arg def make_argyll_compatible_path(path): """ Make the path compatible with the Argyll utilities. This is currently only effective under Windows to make sure that any unicode 'division' slashes in the profile name are replaced with underscores. """ make_compat_enc = fs_enc skip = -1 if re.match(r'\\\\\?\\', path, re.I): # Don't forget about UNC paths: # \\?\UNC\Server\Volume\File # \\?\C:\File skip = 2 parts = path.split(os.path.sep) for i, part in enumerate(parts): if i > skip: parts[i] = unicode(part.encode(make_compat_enc, "safe_asciize"), make_compat_enc).replace("/", "_").replace("?", "_") return os.path.sep.join(parts) def printcmdline(cmd, args=None, fn=safe_print, cwd=None): """ Pretty-print a command line. """ if args is None: args = [] if cwd is None: cwd = os.getcwdu() fn(" " + cmd) i = 0 lines = [] for item in args: ispath = False if item.find(os.path.sep) > -1: if os.path.dirname(item) == cwd: item = os.path.basename(item) ispath = True if sys.platform == "win32": item = sp.list2cmdline([item]) if not item.startswith('"'): item = quote_args([item])[0] else: item = pipes.quote(item) lines.append(item) i += 1 for line in lines: fn(textwrap.fill(line, 80, expand_tabs = False, replace_whitespace = False, initial_indent = " ", subsequent_indent = " ")) def set_argyll_bin(parent=None, silent=False, callafter=None, callafter_args=()): """ Set the directory containing the Argyll CMS binary executables """ if parent and not parent.IsShownOnScreen(): parent = None # do not center on parent if not visible # Check if Argyll version on PATH is newer than configured Argyll version paths = getenvu("PATH", os.defpath).split(os.pathsep) argyll_version_string = get_argyll_version_string("dispwin", True, paths) argyll_version = parse_argyll_version_string(argyll_version_string) argyll_version_string_cfg = get_argyll_version_string("dispwin", True) argyll_version_cfg = parse_argyll_version_string(argyll_version_string_cfg) # Don't prompt for 1.2.3_foo if current version is 1.2.3 # but prompt for 1.2.3 if current version is 1.2.3_foo # Also prompt for 1.2.3_beta2 if current version is 1.2.3_beta if ((argyll_version > argyll_version_cfg and (argyll_version[:4] == argyll_version_cfg[:4] or not argyll_version_string.startswith(argyll_version_string_cfg))) or (argyll_version < argyll_version_cfg and argyll_version_string_cfg.startswith(argyll_version_string))): argyll_dir = os.path.dirname(get_argyll_util("dispwin", paths) or "") dlg = ConfirmDialog(parent, msg=lang.getstr("dialog.select_argyll_version", (argyll_version_string, argyll_version_string_cfg)), ok=lang.getstr("ok"), cancel=lang.getstr("cancel"), alt=lang.getstr("browse"), bitmap=geticon(32, "dialog-question")) dlg_result = dlg.ShowModal() dlg.Destroy() if dlg_result == wx.ID_OK: setcfg("argyll.dir", None) return True if dlg_result == wx.ID_CANCEL: if callafter: callafter(*callafter_args) return False else: argyll_dir = None if parent and not check_argyll_bin(): dlg = ConfirmDialog(parent, msg=lang.getstr("dialog.argyll.notfound.choice"), ok=lang.getstr("download"), cancel=lang.getstr("cancel"), alt=lang.getstr("browse"), bitmap=geticon(32, "dialog-question")) dlg_result = dlg.ShowModal() dlg.Destroy() if dlg_result == wx.ID_OK: # Download Argyll CMS from DisplayCAL import app_update_check app_update_check(parent, silent, argyll=True) return False elif dlg_result == wx.ID_CANCEL: if callafter: callafter(*callafter_args) return False defaultPath = os.path.join(*get_verified_path("argyll.dir", path=argyll_dir)) dlg = wx.DirDialog(parent, lang.getstr("dialog.set_argyll_bin"), defaultPath=defaultPath, style=wx.DD_DIR_MUST_EXIST) dlg.Center(wx.BOTH) result = False while not result: result = dlg.ShowModal() == wx.ID_OK if result: path = dlg.GetPath().rstrip(os.path.sep) if os.path.basename(path) != "bin": path = os.path.join(path, "bin") result = check_argyll_bin([path]) if result: if verbose >= 3: safe_print("Setting Argyll binary directory:", path) setcfg("argyll.dir", path) break else: not_found = [] for name in argyll_names: if (not get_argyll_util(name, [path]) and not name in argyll_optional): not_found.append((" " + lang.getstr("or") + " ").join(filter(lambda altname: not "argyll" in altname, [altname + exe_ext for altname in argyll_altnames[name]]))) InfoDialog(parent, msg=path + "\n\n" + lang.getstr("argyll.dir.invalid", ", ".join(not_found)), ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error")) else: break dlg.Destroy() if not result and callafter: callafter(*callafter_args) return result def show_result_dialog(result, parent=None, pos=None, confirm=False): """ Show dialog depending on type of result. Result should be an exception type. An appropriate visual representation will be chosen whether result is of exception type 'Info', 'Warning' or other error. """ msg = safe_unicode(result) if not pos: pos=(-1, -1) if isinstance(result, Info): bitmap = geticon(32, "dialog-information") elif isinstance(result, Warning): bitmap = geticon(32, "dialog-warning") else: bitmap = geticon(32, "dialog-error") if confirm: cls = ConfirmDialog ok = confirm else: cls = InfoDialog ok = lang.getstr("ok") dlg = cls(parent, pos=pos, msg=msg, ok=ok, bitmap=bitmap, log=not isinstance(result, (UnloggedError, UnloggedInfo, UnloggedWarning))) if confirm: returncode = dlg.ShowModal() dlg.Destroy() return returncode == wx.ID_OK class Error(Exception): pass class Info(UserWarning): pass class UnloggedError(Error): pass class UnloggedInfo(Info): pass class UnloggedWarning(UserWarning): pass class Warn(UserWarning): pass class EvalFalse(object): """ Evaluate to False in boolean comparisons """ def __init__(self, wrapped_object): self._wrapped_object = wrapped_object def __getattribute__(self, name): return getattr(object.__getattribute__(self, "_wrapped_object"), name) def __nonzero__(self): return False class DummyDialog(object): def __init__(self, *args, **kwargs): self.is_shown_on_screen = True def Close(self): pass def Destroy(self): pass def EndModal(self, id=-1): return id def Hide(self): pass def IsShownOnScreen(self): return self.is_shown_on_screen def Show(self, show=True): self.is_shown_on_screen = show def ShowModal(self): pass class FilteredStream(): """ Wrap a stream and filter all lines written to it. """ # Discard the whole line if it is empty after replacing patterns discard = "" # If one of the triggers is contained in a line, skip the whole line triggers = ["Place instrument on test window", "key to continue", "key to retry", "key to take a reading", "] to read", "' to set", "' to report", "' to toggle", " or Q to ", "place on the white calibration reference", "read failed due to the sensor being in the wrong position", "Ambient filter should be removed"] + INST_CAL_MSGS substitutions = {r"\^\[": "", # ESC key on Linux/OSX "patch ": "Patch ", re.compile(r"Point \d+", re.I): ""} # Strip these patterns from input before writing. Note that this only works # on full lines (ending with linesep_in) prestrip = "" def __init__(self, stream, data_encoding=None, file_encoding=None, errors="replace", discard=None, linesep_in="\r\n", linesep_out="\n", substitutions=None, triggers=None, prestrip=None): self.stream = stream self.data_encoding = data_encoding self.file_encoding = file_encoding self.errors = errors if discard is not None: self.discard = discard self.linesep_in = linesep_in self.linesep_out = linesep_out if substitutions is not None: self.substitutions = substitutions if triggers is not None: self.triggers = triggers if prestrip is not None: self.prestrip = prestrip self._buffer = "" def __getattr__(self, name): return getattr(self.stream, name) def write(self, data): """ Write data to stream, stripping all unwanted output. Incoming lines are expected to be delimited by linesep_in. """ if not data: return if self.prestrip and (re.search(self.prestrip, data) or self._buffer): if not data.endswith(self.linesep_in): # Buffer all data until we see a line ending self._buffer += data return elif self._buffer: # Assemble the full line from the buffer data = self._buffer + data self._buffer = "" data = re.sub(self.prestrip, "", data) lines = [] for line in data.split(self.linesep_in): if line and not re.sub(self.discard, "", line): line = "" write = True for trigger in self.triggers: if trigger.lower() in line.lower(): write = False break if write: if self.data_encoding and not isinstance(line, unicode): line = line.decode(self.data_encoding, self.errors) for search, sub in self.substitutions.iteritems(): line = re.sub(search, sub, line) if self.file_encoding: line = line.encode(self.file_encoding, self.errors) lines.append(line) if lines: self.stream.write(self.linesep_out.join(lines)) class LineBufferedStream(): """ Buffer lines and only write them to stream if line separator is detected """ def __init__(self, stream, data_encoding=None, file_encoding=None, errors="replace", linesep_in="\r\n", linesep_out="\n"): self.buf = "" self.data_encoding = data_encoding self.file_encoding = file_encoding self.errors = errors self.linesep_in = linesep_in self.linesep_out = linesep_out self.stream = stream def __del__(self): self.commit() def __getattr__(self, name): return getattr(self.stream, name) def close(self): self.commit() self.stream.close() def commit(self): if self.buf: if self.data_encoding and not isinstance(self.buf, unicode): self.buf = self.buf.decode(self.data_encoding, self.errors) if self.file_encoding: self.buf = self.buf.encode(self.file_encoding, self.errors) self.stream.write(self.buf) self.buf = "" def write(self, data): data = data.replace(self.linesep_in, "\n") for char in data: if char == "\r": while self.buf and not self.buf.endswith(self.linesep_out): self.buf = self.buf[:-1] else: if char == "\n": self.buf += self.linesep_out self.commit() else: self.buf += char class LineCache(): """ When written to it, stores only the last n + 1 lines and returns only the last n non-empty lines when read. """ def __init__(self, maxlines=1): self.clear() self.maxlines = maxlines def clear(self): self.cache = [""] def flush(self): pass def read(self, triggers=None): lines = [""] for line in self.cache: read = True if triggers: for trigger in triggers: if trigger.lower() in line.lower(): read = False break if read and line: lines.append(line) return "\n".join(filter(lambda line: line, lines)[-self.maxlines:]) def write(self, data): for char in data: if char == "\r": self.cache[-1] = "" elif char == "\n": self.cache.append("") else: self.cache[-1] += char self.cache = (filter(lambda line: line, self.cache[:-1]) + self.cache[-1:])[-self.maxlines - 1:] class Producer(object): """ Generic producer """ def __init__(self, worker, producer, continue_next=False): self.worker = worker self.producer = producer self.continue_next = continue_next def __call__(self, *args, **kwargs): result = self.producer(*args, **kwargs) if not self.continue_next and self.worker._progress_wnd: if (hasattr(self.worker.progress_wnd, "animbmp") and self.worker.progress_wnd.progress_type in (0, 2)): # Allow time for animation fadeout wx.CallAfter(self.worker.progress_wnd.stop_timer, False) if self.worker.progress_wnd.progress_type == 0: sleep(4) else: sleep(1) return result class StringWithLengthOverride(UserString): """ Allow defined behavior in comparisons and when evaluating length """ def __init__(self, seq, length=None): UserString.__init__(self, seq) if length is None: length = len(seq) self.length = length def __len__(self): return self.length class Sudo(object): """ Determine if a command can be run via sudo """ def __init__(self): self.availoptions = {} self.sudo = which("sudo") if self.sudo: # Determine available sudo options man = which("man") if man: manproc = sp.Popen([man, "sudo"], stdout=sp.PIPE, stderr=sp.PIPE) # Strip formatting stdout = re.sub(".\x08", "", manproc.communicate()[0]) self.availoptions = {"E": bool(re.search("-E\W", stdout)), "l [command]": bool(re.search("-l\W(?:.*?\W)?command\W", stdout)), "K": bool(re.search("-K\W", stdout)), "k": bool(re.search("-k\W", stdout))} if debug: safe_print("[D] Available sudo options:", ", ".join(filter(lambda option: self.availoptions[option], self.availoptions.keys()))) def __len__(self): return int(bool(self.sudo)) def __str__(self): return str(self.sudo or "") def __unicode__(self): return unicode(self.sudo or "") def _expect_timeout(self, patterns, timeout=-1, child_timeout=1): """ wexpect.spawn.expect with better timeout handling. The default expect can block up to timeout seconds if the child is already dead. To prevent this, we run expect in a loop until a pattern is matched, timeout is reached or an exception occurs. The max time an expect call will block if the child is already dead can be set with the child_timeout parameter. """ if timeout == -1: timeout = self.subprocess.timeout patterns = list(patterns) if not wexpect.TIMEOUT in patterns: patterns.append(wexpect.TIMEOUT) start = time() while True: result = self.subprocess.expect(patterns, timeout=child_timeout) if (self.subprocess.after is not wexpect.TIMEOUT or time() - start >= timeout): break return result def _terminate(self): """ Terminate running sudo subprocess """ self.subprocess.sendcontrol("C") self._expect_timeout([wexpect.EOF], 10) if self.subprocess.after is wexpect.TIMEOUT: safe_print("Warning: sudo timed out") if not self.subprocess.terminate(force=True): safe_print("Warning: Couldn't terminate timed-out " "sudo subprocess") else: safe_print(self.subprocess.before.strip().decode(enc, "replace")) def authenticate(self, args, title, parent=None): """ Athenticate for a given command The return value will be a tuple (auth_succesful, password). auth_succesful will be a custom class that will always have length 0 if authentication was not successful or the command is not allowed (even if the actual string length is non-zero), thus allowing for easy boolean comparisons. """ # Authentication using sudo is pretty convoluted if dealing with # platform and configuration differences. Ask for a password by first # clearing any cached credentials (sudo -K) so that sudo is guaranteed # to ask for a password if a command is run through it, then we spawn # sudo true (with true being the standard GNU utility that always # has an exit status of 0) and expect the password prompt. The user # is then given the opportunity to enter a password, which is then fed # to sudo. If sudo exits with a status of 0, the password must have # been accepted, but we still don't know for sure if our command is # allowed, so we run sudo -l to determine if it is # indeed allowed. pwd = "" dlg = ConfirmDialog( parent, title=title, msg=lang.getstr("dialog.enter_password"), ok=lang.getstr("ok"), cancel=lang.getstr("cancel"), bitmap=geticon(32, "lock")) dlg.pwd_txt_ctrl = wx.TextCtrl(dlg, -1, pwd, size=(320, -1), style=wx.TE_PASSWORD | wx.TE_PROCESS_ENTER) dlg.pwd_txt_ctrl.Bind(wx.EVT_TEXT_ENTER, lambda event: dlg.EndModal(wx.ID_OK)) dlg.sizer3.Add(dlg.pwd_txt_ctrl, 1, flag=wx.TOP | wx.ALIGN_LEFT, border=12) dlg.ok.SetDefault() dlg.sizer0.SetSizeHints(dlg) dlg.sizer0.Layout() # Remove cached credentials self.kill() sudo_args = ["-p", "Password:", "true"] try: p = self.subprocess = wexpect.spawn(safe_str(self.sudo), sudo_args) except Exception, exception: return StringWithLengthOverride("Could not run %s %s: %s" % (self.sudo, " ".join(sudo_args), exception), 0), pwd self._expect_timeout(["Password:", wexpect.EOF], 10) # We need to call isalive() to set the exitstatus while p.isalive() and p.after == "Password:": # Ask for password dlg.pwd_txt_ctrl.SetFocus() result = dlg.ShowModal() pwd = dlg.pwd_txt_ctrl.GetValue() if result != wx.ID_OK: self._terminate() return False, pwd p.send(pwd + os.linesep) self._expect_timeout(["Password:", wexpect.EOF], 10) if p.after == "Password:": msg = lang.getstr("dialog.enter_password") errstr = p.before.strip().decode(enc, "replace") if errstr: safe_print(errstr) msg = "\n\n".join([errstr, msg]) dlg.message.SetLabel(msg) dlg.message.Wrap(dlg.GetSize()[0] - 32 - 12 * 2) dlg.pwd_txt_ctrl.SetValue("") dlg.sizer0.SetSizeHints(dlg) dlg.sizer0.Layout() dlg.Destroy() if p.after is wexpect.TIMEOUT: safe_print("Error: sudo timed out") if not p.terminate(force=True): safe_print("Warning: Couldn't terminate timed-out sudo " "subprocess") return StringWithLengthOverride("sudo timed out", 0), pwd if p.exitstatus != 0: return StringWithLengthOverride(p.before.strip().decode(enc, "replace") or ("sudo exited prematurely with " "status %s" % p.exitstatus), 0), pwd # Password was accepted, check if command is allowed return self.is_allowed(args, pwd), pwd def is_allowed(self, args=None, pwd=""): """ Check if a command is allowed via sudo. Return either a string listing allowed and forbidden commands, or the fully-qualified path of the command along with any arguments, or an error message in case the command is not allowed, or False if the password was not accepted. The returned error is a custom class that will always have length 0 if the command is not allowed (even if the actual string length is non-zero), thus allowing for easy boolean comparisons. """ sudo_args = ["-p", "Password:", "-l"] # Set sudo args based on available options if self.availoptions.get("l [command]") and args: sudo_args += args try: p = self.subprocess = wexpect.spawn(safe_str(self.sudo), sudo_args) except Exception, exception: return StringWithLengthOverride("Could not run %s %s: %s" % (self.sudo, " ".join(sudo_args), exception), 0) self._expect_timeout(["Password:", wexpect.EOF], 10) # We need to call isalive() to set the exitstatus while p.isalive() and p.after == "Password:": p.send(pwd + os.linesep) self._expect_timeout(["Password:", wexpect.EOF], 10) if p.after == "Password:": # Password was not accepted self._terminate() return StringWithLengthOverride(p.before.strip().decode(enc, "replace"), 0) if p.after is wexpect.TIMEOUT: safe_print("Error: sudo timed out") if not p.terminate(force=True): safe_print("Warning: Couldn't terminate timed-out sudo " "subprocess") return StringWithLengthOverride("sudo timed out", 0) if p.exitstatus != 0: return StringWithLengthOverride(p.before.strip().decode(enc, "replace") or ("sudo exited prematurely with " "status %s" % p.exitstatus), 0) return p.before.strip().decode(enc, "replace") def kill(self): """ Remove cached credentials """ kill_arg = None if self.availoptions.get("K"): kill_arg = "-K" elif self.availoptions.get("k"): kill_arg = "-k" if kill_arg: sp.call([safe_str(self.sudo), kill_arg]) class WPopen(sp.Popen): def __init__(self, *args, **kwargs): sp.Popen.__init__(self, *args, **kwargs) self._seekpos = 0 self._stdout = kwargs["stdout"] self.after = None self.before = None self.exitstatus = None self.logfile_read = None self.match = None self.maxlen = 80 self.timeout = 30 def isalive(self): self.exitstatus = self.poll() return self.exitstatus is None def expect(self, patterns, timeout=-1): if not isinstance(patterns, list): patterns = [patterns] if timeout == -1: timeout = self.timeout if timeout is not None: end = time() + timeout while timeout is None or time() < end: self._stdout.seek(self._seekpos) buf = self._stdout.read() self._seekpos += len(buf) if not buf and not self.isalive(): self.match = wexpect.EOF("End Of File (EOF) in expect() - dead child process") if wexpect.EOF in patterns: return self.match raise self.match if buf and self.logfile_read: self.logfile_read.write(buf) for pattern in patterns: if isinstance(pattern, basestring) and pattern in buf: offset = buf.find(pattern) self.after = buf[offset:] self.before = buf[:offset] self.match = buf[offset:offset + len(pattern)] return self.match sleep(.01) if timeout is not None: self.match = wexpect.TIMEOUT("Timeout exceeded in expect()") if wexpect.TIMEOUT in patterns: return self.match raise self.match def send(self, s): self.stdin.write(s) self._stdout.seek(self._seekpos) buf = self._stdout.read() self._seekpos += len(buf) if buf and self.logfile_read: self.logfile_read.write(buf) def terminate(self, force=False): sp.Popen.terminate(self) class Worker(object): def __init__(self, owner=None): """ Create and return a new worker instance. """ self.owner = owner # owner should be a wxFrame or similar if sys.platform == "win32": self.pty_encoding = "cp%i" % windll.kernel32.GetACP() else: self.pty_encoding = enc self.cmdrun = False self.dispcal_create_fast_matrix_shaper = False self.dispread_after_dispcal = False self.finished = True self.instrument_on_screen = False self.interactive = False self.spotread_just_do_instrument_calibration = False self.lastcmdname = None # Filter out warnings from OS components (e.g. shared libraries) # E.g.: # Nov 26 16:28:16 dispcal[1006] : void CGSUpdateManager::log() const: conn 0x1ec57 token 0x3ffffffffffd0a prestrip = re.compile(r"\D+\s+\d+\s+\d+:\d+:\d+\s+\w+\[\d+\]\s+:[\S\s]*") discard = [r"[\*\.]+|Current (?:RGB|XYZ)(?: +.*)?"] self.lastmsg_discard = re.compile("|".join(discard)) self.measurement_modes = {} # Sounds when measuring # Needs to be stereo! self.measurement_sound = audio.Sound(get_data_path("beep.wav")) self.commit_sound = audio.Sound(get_data_path("camera_shutter.wav")) self.options_colprof = [] self.options_dispcal = [] self.options_dispread = [] self.options_targen = [] self.pauseable = False discard = [r"^Display type is .+", r"^Doing (?:some initial|check) measurements", r"^Adjust .+? Press space when done\.\s*", r"^\s*(?:[/\\]\s+)?(?:Adjusted )?(Current", r"Initial", r"[Tt]arget) (?:Br(?:ightness)?", r"50% Level", r"white", r"(?:Near )?[Bb]lack", r"(?:advertised )?gamma", r"RGB", r"\d(?:\.\d+)?).*", r"^Gamma curve .+", r"^Display adjustment menu:", r"^Press", r"^\d\).+", r"^(?:1%|Black|Red|Green|Blue|White|Grey)\s+=.+", r"^\s*patch \d+ of \d+.*", r"^\s*point \d+.*", r"^\s*Added \d+/\d+", # These need to be last because they're very generic! r"[\*\.]+", r"\s*\d*%?"] self.recent_discard = re.compile("|".join(discard), re.I) self.subprocess_abort = False self.sudo = None self.auth_timestamp = 0 self.sessionlogfiles = {} self.tempdir = None self.thread_abort = False self.triggers = ["Password:"] self.recent = FilteredStream(LineCache(maxlines=3), self.pty_encoding, discard=self.recent_discard, triggers=self.triggers + ["stopped at user request"], prestrip=prestrip) self.lastmsg = FilteredStream(LineCache(), self.pty_encoding, discard=self.lastmsg_discard, triggers=self.triggers, prestrip=prestrip) self.clear_argyll_info() self.clear_cmd_output() self._patterngenerators = {} self._progress_dlgs = {} self._progress_wnd = None self._pwdstr = "" workers.append(self) def add_measurement_features(self, args, display=True, ignore_display_name=False, allow_nondefault_observer=False, ambient=False): """ Add common options and to dispcal, dispread and spotread arguments """ if display and not get_arg("-d", args): args.append("-d" + self.get_display()) if not get_arg("-c", args): args.append("-c%s" % getcfg("comport.number")) instrument_name = self.get_instrument_name() measurement_mode = getcfg("measurement_mode") if measurement_mode == "auto": # Make changes in DisplayCAL.MainFrame.set_ccxx_measurement_mode too! if instrument_name == "ColorHug": measurement_mode = "R" elif instrument_name == "ColorHug2": measurement_mode = "F" else: measurement_mode = "l" instrument_features = self.get_instrument_features() if (not ambient and measurement_mode and not get_arg("-y", args) and instrument_name != "specbos 1201"): # Always specify -y for colorimeters (won't be read from .cal # when updating) # The specbos 1201 (unlike 1211) doesn't support measurement # mode selection if self.argyll_version >= [1, 5, 0]: measurement_mode_map = instrument_features.get("measurement_mode_map", {}) measurement_mode = measurement_mode_map.get(measurement_mode[0], measurement_mode) args.append("-y" + measurement_mode[0]) if getcfg("measurement_mode.projector") and \ instrument_features.get("projector_mode") and \ self.argyll_version >= [1, 1, 0] and not get_arg("-p", args): # Projector mode, Argyll >= 1.1.0 Beta args.append("-p") if instrument_features.get("adaptive_mode"): if getcfg("measurement_mode.adaptive"): if ((self.argyll_version[0:3] > [1, 1, 0] or (self.argyll_version[0:3] == [1, 1, 0] and not "Beta" in self.argyll_version_string and not "RC1" in self.argyll_version_string and not "RC2" in self.argyll_version_string)) and self.argyll_version[0:3] < [1, 5, 0] and not get_arg("-V", args, True)): # Adaptive measurement mode, Argyll >= 1.1.0 RC3 args.append("-V") else: if self.argyll_version[0:3] >= [1, 5, 0]: # Disable adaptive measurement mode args.append("-YA") if (instrument_name in ("Spyder4", "Spyder5") and self.argyll_version == [1, 7, 0] and measurement_mode in ("f", "e") and not get_arg("-YR:", args)): # Prevent 'Warning - Spyder: measuring refresh rate failed' args.append("-YR:60") non_argyll_prisma = (config.get_display_name() == "Prisma" and not defaults["patterngenerator.prisma.argyll"]) if display and not (get_arg("-dweb", args) or get_arg("-dmadvr", args)): if ((self.argyll_version <= [1, 0, 4] and not get_arg("-p", args)) or (self.argyll_version > [1, 0, 4] and not get_arg("-P", args))): if ((config.get_display_name() == "Resolve" or non_argyll_prisma) and not ignore_display_name): # Move Argyll test window to lower right corner and make it # very small dimensions_measureframe = "1,1,0.01" else: dimensions_measureframe = getcfg("dimensions.measureframe") if get_arg("-dcc", args): # Rescale for Chromecast default patch size of 10% dimensions_measureframe = config.get_measureframe_dimensions( dimensions_measureframe, 10) args.append(("-p" if self.argyll_version <= [1, 0, 4] else "-P") + dimensions_measureframe) farg = get_arg("-F", args, True) if ((config.get_display_name() == "Resolve" or non_argyll_prisma) and not ignore_display_name): if farg: # Remove -F (darken background) as we relay colors to # pattern generator args = args[:farg[0]] + args[farg[0] + 1:] elif getcfg("measure.darken_background") and not farg: args.append("-F") if (display and config.get_display_name() == "Prisma" and defaults["patterngenerator.prisma.argyll"] and getcfg("patterngenerator.prisma.use_video_levels") and not get_arg("-E", args, True)): args.append("-E") if getcfg("measurement_mode.highres") and \ instrument_features.get("highres_mode") and not get_arg("-H", args, True): args.append("-H") if (allow_nondefault_observer and self.instrument_can_use_nondefault_observer() and getcfg("observer") != defaults["observer"] and not get_arg("-Q", args)): args.append("-Q" + getcfg("observer")) if (not ambient and self.instrument_can_use_ccxx() and not is_ccxx_testchart() and not get_arg("-X", args)): # Use colorimeter correction? ccmx = getcfg("colorimeter_correction_matrix_file").split(":", 1) if len(ccmx) > 1 and ccmx[1]: ccmx = ccmx[1] else: ccmx = None if ccmx and (not ccmx.lower().endswith(".ccss") or self.instrument_supports_ccss()): result = check_file_isfile(ccmx) if isinstance(result, Exception): return result try: cgats = CGATS.CGATS(ccmx) except (IOError, CGATS.CGATSError), exception: return exception else: ccxx_instrument = get_canonical_instrument_name( str(cgats.queryv1("INSTRUMENT") or ""), {"DTP94-LCD mode": "DTP94", "eye-one display": "i1 Display", "Spyder 2 LCD": "Spyder2", "Spyder 3": "Spyder3"}) if ((ccxx_instrument and instrument_name.lower().replace(" ", "") in ccxx_instrument.lower().replace(" ", "")) or ccmx.lower().endswith(".ccss")): tempdir = self.create_tempdir() if isinstance(tempdir, Exception): return tempdir ccmxcopy = os.path.join(tempdir, os.path.basename(ccmx)) if not os.path.isfile(ccmxcopy): if 0 in cgats and cgats[0].type.strip() == "CCMX": # Add display base ID if missing self.check_add_display_type_base_id(cgats) try: # Copy ccmx to profile dir cgats.write(ccmxcopy) except Exception, exception: return Error(lang.getstr("error.copy_failed", (ccmx, ccmxcopy)) + "\n\n" + safe_unicode(exception)) result = check_file_isfile(ccmxcopy) if isinstance(result, Exception): return result args.append("-X") args.append(os.path.basename(ccmxcopy)) if (display and (getcfg("drift_compensation.blacklevel") or getcfg("drift_compensation.whitelevel")) and self.argyll_version >= [1, 3, 0] and not get_arg("-I", args)): args.append("-I") if getcfg("drift_compensation.blacklevel"): args[-1] += "b" if getcfg("drift_compensation.whitelevel"): args[-1] += "w" # TTBD/FIXME: Skipping of sensor calibration can't be done in # emissive mode (see Argyll source spectro/ss.c, around line 40) if (getcfg("allow_skip_sensor_cal") and instrument_features.get("skip_sensor_cal") and self.argyll_version >= [1, 1, 0] and not get_arg("-N", args, True) and not self.spotread_just_do_instrument_calibration): args.append("-N") return True def authenticate(self, cmd, title=appname, parent=None): """ Athenticate (using sudo) for a given command The return value will either be True (authentication successful and command allowed), False (in case of the user cancelling the password dialog), None (Windows or running as root) or an error. """ if sys.platform == "win32" or os.geteuid() == 0: return self.auth_timestamp = 0 ocmd = cmd if cmd and not os.path.isabs(cmd): cmd = get_argyll_util(ocmd) if not cmd: cmd = which(ocmd) if not cmd or not os.path.isfile(cmd): return Error(lang.getstr("file.missing", ocmd)) _disabler = BetterWindowDisabler() result = True if not self.sudo: self.sudo = Sudo() if not self.sudo: result = Error(lang.getstr("file.missing", "sudo")) if result is True: pwd = self.pwd args = [cmd, "-?"] if not pwd or not self.sudo.is_allowed(args, pwd): # If no password was previously available, or if the requested # command cannot be run via sudo regardless of password (we check # this with sudo -l ), we ask for a password. safe_print(lang.getstr("auth")) progress_dlg = self._progress_wnd or getattr(wx.GetApp(), "progress_dlg", None) if parent is None: if progress_dlg and progress_dlg.IsShownOnScreen(): parent = progress_dlg else: parent = self.owner result, pwd = self.sudo.authenticate(args, title, parent) if result: self.pwd = pwd result = True elif result is False: safe_print(lang.getstr("aborted")) else: result = Error(result) if result is True: self.auth_timestamp = time() del _disabler return result def blend_profile_blackpoint(self, profile1, profile2, outoffset=0.0, gamma=2.4, gamma_type="B", size=None, apply_trc=True): """ Apply BT.1886-like tone response to profile1 using profile2 blackpoint. profile1 has to be a matrix profile """ odata = self.xicclu(profile2, (0, 0, 0), pcs="x") if len(odata) != 1 or len(odata[0]) != 3: raise ValueError("Blackpoint is invalid: %s" % odata) XYZbp = odata[0] if apply_trc: self.log(appname + ": Applying BT.1886-like TRC to " + os.path.basename(profile1.fileName)) else: self.log(appname + ": Applying BT.1886-like black offset to " + os.path.basename(profile1.fileName)) self.log(appname + ": Black XYZ (normalized 0..100) = %.6f %.6f %.6f" % tuple([v * 100 for v in XYZbp])) self.log(appname + ": Black Lab = %.6f %.6f %.6f" % tuple(colormath.XYZ2Lab(*[v * 100 for v in XYZbp]))) self.log(appname + ": Output offset = %.2f%%" % (outoffset * 100)) if not apply_trc: # Apply only the black point blending portion of BT.1886 mapping profile1.apply_black_offset(XYZbp) return if gamma_type in ("b", "g"): # Get technical gamma needed to achieve effective gamma self.log(appname + ": Effective gamma = %.2f" % gamma) tgamma = colormath.xicc_tech_gamma(gamma, XYZbp[1], outoffset) else: tgamma = gamma self.log(appname + ": Technical gamma = %.2f" % tgamma) profile1.set_bt1886_trc(XYZbp, outoffset, gamma, gamma_type, size) def calibrate_instrument_producer(self): cmd, args = get_argyll_util("spotread"), ["-v", "-e"] if cmd: result = self.add_measurement_features(args, display=False) if isinstance(result, Exception): return result self.spotread_just_do_instrument_calibration = True result = self.exec_cmd(cmd, args, skip_scripts=True) self.spotread_just_do_instrument_calibration = False return result else: return Error(lang.getstr("argyll.util.not_found", "spotread")) def instrument_can_use_ccxx(self, check_measurement_mode=True, instrument_name=None): """ Return boolean whether the instrument in its current measurement mode can use a CCMX or CCSS colorimeter correction """ # Special cases: # Spectrometer (not needed), # ColorHug (only sensible in factory or raw measurement mode), # ColorMunki Smile (only generic LCD CCFL measurement mode), # Colorimétre HCFR (only raw measurement mode), # DTP94 (only LCD, refresh and generic measurement modes) # Spyder4/5 (only generic LCD and refresh measurement modes) # K-10 (only factory measurement mode) # IMPORTANT: Make changes aswell in the following locations: # - DisplayCAL.MainFrame.create_colorimeter_correction_handler # - DisplayCAL.MainFrame.get_ccxx_measurement_modes # - DisplayCAL.MainFrame.set_ccxx_measurement_mode # - DisplayCAL.MainFrame.update_colorimeter_correction_matrix_ctrl_items # - worker.Worker.check_add_display_type_base_id if not instrument_name: instrument_name = self.get_instrument_name() return (self.argyll_version >= [1, 3, 0] and not self.get_instrument_features(instrument_name).get("spectral") and (not check_measurement_mode or getcfg("measurement_mode") == "auto" or ((instrument_name not in ("ColorHug", "ColorHug2") or getcfg("measurement_mode") in ("F", "R")) and (instrument_name != "ColorMunki Smile" or getcfg("measurement_mode") == "f") and (instrument_name != "Colorimtre HCFR" or # Missing é is NOT a typo getcfg("measurement_mode") == "R") and (instrument_name != "DTP94" or getcfg("measurement_mode") in ("l", "c", "g")) and (instrument_name not in ("Spyder4", "Spyder5") or getcfg("measurement_mode") in ("l", "c")) and (instrument_name != "K-10" or getcfg("measurement_mode") == "F")))) def instrument_can_use_nondefault_observer(self, instrument_name=None): if not instrument_name: instrument_name = self.get_instrument_name() return bool(self.get_instrument_features(instrument_name).get("spectral") or self.instrument_supports_ccss(instrument_name)) @Property def progress_wnd(): def fget(self): if not self._progress_wnd: if (getattr(self, "progress_start_timer", None) and self.progress_start_timer.IsRunning()): if currentThread().__class__ is not _MainThread: raise RuntimeError("GUI access in non-main thread!") # Instantiate the progress dialog instantly on access self.progress_start_timer.Notify() self.progress_start_timer.Stop() return self._progress_wnd def fset(self, progress_wnd): self._progress_wnd = progress_wnd return locals() @property def progress_wnds(self): progress_wnds = self._progress_dlgs.values() if hasattr(self, "terminal"): progress_wnds.append(self.terminal) return progress_wnds @Property def pwd(): def fget(self): return self._pwdstr[10:].ljust(int(math.ceil(len(self._pwdstr[10:]) / 4.0) * 4), "=").decode("base64").decode("UTF-8") def fset(self, pwd): self._pwdstr = "/tmp/%s%s" % (md5(getpass.getuser()).hexdigest().encode("base64")[:5], pwd.encode("UTF-8").encode("base64").rstrip("=\n")) return locals() def get_argyll_instrument_conf(self, what=None): """ Check for Argyll CMS udev rules/hotplug scripts """ filenames = [] if what == "installed": for filename in ("/etc/udev/rules.d/55-Argyll.rules", "/etc/udev/rules.d/45-Argyll.rules", "/etc/hotplug/Argyll", "/etc/hotplug/Argyll.usermap", "/lib/udev/rules.d/55-Argyll.rules", "/lib/udev/rules.d/69-cd-sensors.rules"): if os.path.isfile(filename): filenames.append(filename) else: if what == "expected": fn = lambda filename: filename else: fn = get_data_path if os.path.isdir("/etc/udev/rules.d"): if glob.glob("/dev/bus/usb/*/*"): # USB and serial instruments using udev, where udev # already creates /dev/bus/usb/00X/00X devices filenames.append(fn("usb/55-Argyll.rules")) else: # USB using udev, where there are NOT /dev/bus/usb/00X/00X # devices filenames.append(fn("usb/45-Argyll.rules")) else: if os.path.isdir("/etc/hotplug"): # USB using hotplug and Serial using udev # (older versions of Linux) filenames.extend(fn(filename) for filename in ("usb/Argyll", "usb/Argyll.usermap")) return filter(lambda filename: filename, filenames) def check_add_display_type_base_id(self, cgats, cfgname="measurement_mode"): """ Add DISPLAY_TYPE_BASE_ID to CCMX """ if not cgats.queryv1("DISPLAY_TYPE_BASE_ID"): # c, l (most colorimeters) # R (ColorHug and Colorimétre HCFR) # F (ColorHug) # f (ColorMunki Smile) # g (DTP94) # IMPORTANT: Make changes aswell in the following locations: # - DisplayCAL.MainFrame.create_colorimeter_correction_handler # - DisplayCAL.MainFrame.get_ccxx_measurement_modes # - DisplayCAL.MainFrame.set_ccxx_measurement_modes # - DisplayCAL.MainFrame.update_colorimeter_correction_matrix_ctrl_items # - worker.Worker.instrument_can_use_ccxx cgats[0].add_keyword("DISPLAY_TYPE_BASE_ID", {"c": 2, "l": 1, "R": 2, "F": 1, "f": 1, "g": 3}.get(getcfg(cfgname), 1)) safe_print("Added DISPLAY_TYPE_BASE_ID %r" % cgats[0].DISPLAY_TYPE_BASE_ID) def check_display_conf_oy_compat(self, display_no): """ Check the screen configuration for oyranos-monitor compatibility oyranos-monitor works off screen coordinates, so it will not handle overlapping screens (like separate X screens, which will usually have the same x, y coordinates)! So, oyranos-monitor can only be used if: - The wx.Display count is > 1 which means NOT separate X screens OR if we use the 1st screen - The screens don't overlap """ oyranos = False if wx.Display.GetCount() > 1 or display_no == 1: oyranos = True for display_rect_1 in self.display_rects: for display_rect_2 in self.display_rects: if display_rect_1 is not display_rect_2: if display_rect_1.Intersects(display_rect_2): oyranos = False break if not oyranos: break return oyranos def check_is_ambient_measuring(self, txt): if (("ambient light measuring" in txt.lower() or "Will use emissive mode instead" in txt) and not getattr(self, "is_ambient_measuring", False)): self.is_ambient_measuring = True if (getattr(self, "is_ambient_measuring", False) and "Place instrument on spot to be measured" in txt): self.is_ambient_measuring = False self.do_ambient_measurement() def do_ambient_measurement(self): if getattr(self, "subprocess_abort", False) or \ getattr(self, "thread_abort", False): # If we are aborting, ignore request return self.progress_wnd.Pulse(" " * 4) dlg = ConfirmDialog(self.progress_wnd, msg=lang.getstr("instrument.measure_ambient"), ok=lang.getstr("ok"), cancel=lang.getstr("cancel"), bitmap=geticon(32, "dialog-information")) self.progress_wnd.dlg = dlg dlg_result = dlg.ShowModal() dlg.Destroy() if self.finished: return if dlg_result != wx.ID_OK: self.abort_subprocess() return False if self.safe_send(" "): self.progress_wnd.Pulse(lang.getstr("please_wait")) def check_instrument_calibration(self, txt): """ Check if current instrument needs sensor calibration by looking at Argyll CMS command output """ if not self.instrument_calibration_complete: if "calibration complete" in txt.lower(): self.instrument_calibration_complete = True else: for calmsg in INST_CAL_MSGS: if calmsg in txt or "calibration failed" in txt.lower(): self.do_instrument_calibration( "calibration failed" in txt.lower()) break def check_instrument_place_on_screen(self, txt): """ Check if instrument should be placed on screen by looking at Argyll CMS command output """ if "place instrument on test window" in txt.lower(): self.instrument_place_on_screen_msg = True if ((self.instrument_place_on_screen_msg and "key to continue" in txt.lower()) or (self.instrument_calibration_complete and "place instrument on spot" in txt.lower() and self.progress_wnd is getattr(self, "terminal", None))): self.instrument_place_on_screen_msg = False if (self.cmdname == get_argyll_utilname("dispcal") and sys.platform == "darwin"): # On the Mac dispcal's test window # hides the cursor and steals focus start_new_thread(mac_app_activate, (1, wx.GetApp().AppName)) if (self.instrument_calibration_complete or ((config.is_untethered_display() or getcfg("measure.darken_background") or self.madtpg_fullscreen is False) and (not self.dispread_after_dispcal or self.cmdname == get_argyll_utilname("dispcal")) and not self.instrument_on_screen)): # Show a dialog asking user to place the instrument on the # screen if the instrument calibration was completed, # or if we measure a remote ("Web") display, # or if we use a black background during measurements, # but in case of the latter two only if dispread is not # run directly after dispcal self.instrument_calibration_complete = False self.instrument_place_on_screen() else: if self.isalive(): # Delay to work-around a problem with i1D2 and Argyll 1.7 # to 1.8.3 under Mac OS X 10.11 El Capitan where skipping # interactive display adjustment would botch the first # reading (black) wx.CallLater(1500, self.instrument_on_screen_continue) def instrument_on_screen_continue(self): self.safe_send(" ") self.pauseable_now = True self.instrument_on_screen = True def check_instrument_sensor_position(self, txt): """ Check instrument sensor position by looking at Argyll CMS command output """ if "read failed due to the sensor being in the wrong position" in txt.lower(): self.instrument_sensor_position_msg = True if (self.instrument_sensor_position_msg and " or q to " in txt.lower()): self.instrument_sensor_position_msg = False self.instrument_reposition_sensor() def check_retry_measurement(self, txt): if ("key to retry:" in txt and not "read stopped at user request!" in self.recent.read() and ("Sample read failed due to misread" in self.recent.read() or "Sample read failed due to communication problem" in self.recent.read()) and not self.subprocess_abort): self.retrycount += 1 self.recent.write("\r\n%s: Retrying (%s)..." % (appname, self.retrycount)) self.safe_send(" ") def check_spotread_result(self, txt): """ Check if spotread returned a result """ if (self.cmdname == get_argyll_utilname("spotread") and self.progress_wnd is not getattr(self, "terminal", None) and ("Result is XYZ:" in txt or "Result is Y:" in txt or (self.instrument_calibration_complete and self.spotread_just_do_instrument_calibration))): # Single spotread reading, we are done wx.CallLater(1000, self.quit_terminate_cmd) def do_instrument_calibration(self, failed=False): """ Ask user to initiate sensor calibration and execute. Give an option to cancel. """ if getattr(self, "subprocess_abort", False) or \ getattr(self, "thread_abort", False): # If we are aborting, ignore request return self.progress_wnd.Pulse(" " * 4) if failed: msg = lang.getstr("failure") elif self.get_instrument_name() == "ColorMunki": msg = lang.getstr("instrument.calibrate.colormunki") else: serial = re.search("Serial no. (\S+)", self.recent.read(), re.I) if serial: # Reflective calibration, white reference tile required # (e.g. i1 Pro hires mode) msg = lang.getstr("instrument.calibrate.reflective", serial.group(1)) else: # Emissive dark calibration msg = lang.getstr("instrument.calibrate") dlg = ConfirmDialog(self.progress_wnd, msg=msg + "\n\n" + self.get_instrument_name(), ok=lang.getstr("ok"), cancel=lang.getstr("cancel"), bitmap=geticon(32, "dialog-information")) self.progress_wnd.dlg = dlg dlg_result = dlg.ShowModal() dlg.Destroy() if self.finished: return if dlg_result != wx.ID_OK: self.abort_subprocess() return False self.progress_wnd.Pulse(lang.getstr("please_wait")) if self.safe_send(" "): self.progress_wnd.Pulse(lang.getstr("instrument.calibrating")) def abort_all(self, confirm=False): aborted = False for worker in workers: if not getattr(worker, "finished", True): worker.abort_subprocess(confirm) aborted = True return aborted def abort_subprocess(self, confirm=False): """ Abort the current subprocess or thread """ if getattr(self, "abort_requested", False): return self.abort_requested = True if confirm and getattr(self, "progress_wnd", None): prev_dlg = getattr(self.progress_wnd, "dlg", None) if (prev_dlg and prev_dlg.IsShownOnScreen() and not isinstance(prev_dlg, DummyDialog)): self.abort_requested = False return pause = (not getattr(self.progress_wnd, "paused", False) and hasattr(self.progress_wnd, "pause_continue_handler")) if pause: self.progress_wnd.pause_continue_handler(True) self.pause_continue() dlg = ConfirmDialog(self.progress_wnd, msg=lang.getstr("dialog.confirm_cancel"), ok=lang.getstr("yes"), cancel=lang.getstr("no"), bitmap=geticon(32, "dialog-warning")) self.progress_wnd.dlg = dlg dlg_result = dlg.ShowModal() if isinstance(prev_dlg, DummyDialog): self.progress_wnd.dlg = prev_dlg dlg.Destroy() if dlg_result != wx.ID_OK: self.progress_wnd.Resume() self.abort_requested = False return self.patch_count = 0 self.subprocess_abort = True self.thread_abort = True if self.use_patterngenerator or self.use_madnet_tpg: abortfilename = os.path.join(self.tempdir, ".abort") open(abortfilename, "w").close() delayedresult.startWorker(self.quit_terminate_consumer, self.quit_terminate_cmd) def quit_terminate_consumer(self, delayedResult): try: result = delayedResult.get() except Exception, exception: if hasattr(exception, "originalTraceback"): self.log(exception.originalTraceback, fn=log) else: self.log(traceback.format_exc(), fn=log) result = UnloggedError(exception) if isinstance(result, Exception): show_result_dialog(result, getattr(self, "progress_wnd", None)) result = False if not result: self.subprocess_abort = False self.thread_abort = False self.abort_requested = False if hasattr(self, "progress_wnd"): self.progress_wnd.Resume() def instrument_place_on_screen(self): """ Show a dialog asking user to place the instrument on the screen and give an option to cancel """ if getattr(self, "subprocess_abort", False) or \ getattr(self, "thread_abort", False): # If we are aborting, ignore request return self.progress_wnd.Pulse(" " * 4) dlg = ConfirmDialog(self.progress_wnd, msg=lang.getstr("instrument.place_on_screen") + "\n\n" + self.get_instrument_name(), ok=lang.getstr("ok"), cancel=lang.getstr("cancel"), bitmap=geticon(32, "dialog-information")) self.progress_wnd.dlg = dlg dlg_result = dlg.ShowModal() dlg.Destroy() if self.finished: return if dlg_result != wx.ID_OK: self.abort_subprocess() return False if not isinstance(self.progress_wnd, (UntetheredFrame, DisplayUniformityFrame)): self.safe_send(" ") self.pauseable_now = True self.instrument_on_screen = True def instrument_reposition_sensor(self): if getattr(self, "subprocess_abort", False) or \ getattr(self, "thread_abort", False): # If we are aborting, ignore request return self.progress_wnd.Pulse(" " * 4) dlg = ConfirmDialog(self.progress_wnd, msg=lang.getstr("instrument.reposition_sensor"), ok=lang.getstr("ok"), cancel=lang.getstr("cancel"), bitmap=geticon(32, "dialog-warning")) self.progress_wnd.dlg = dlg dlg_result = dlg.ShowModal() dlg.Destroy() if self.finished: return if dlg_result != wx.ID_OK: self.abort_subprocess() return False self.safe_send(" ") def clear_argyll_info(self): """ Clear Argyll CMS version, detected displays and instruments. """ self.argyll_bin_dir = None self.argyll_version = [0, 0, 0] self.argyll_version_string = "0.0.0" self._displays = [] self.display_edid = [] self.display_manufacturers = [] self.display_names = [] self.display_rects = [] self.displays = [] self.instruments = [] self.lut_access = [] def clear_cmd_output(self): """ Clear any output from the last run command. """ self.cmd = None self.cmdname = None self.retcode = -1 self.output = [] self.errors = [] self.recent.clear() self.retrycount = 0 self.lastmsg.clear() self.repeat = False self.send_buffer = None # Log interaction with Argyll tools if (not hasattr(self, "logger") or (isinstance(self.logger, DummyLogger) and self.owner and self.owner.Name == "mainframe")): if not self.owner or self.owner.Name != "mainframe": self.logger = DummyLogger() else: self.logger = get_file_logger("interact") if (hasattr(self, "thread") and self.thread.isAlive() and self.interactive): self.logger.info("-" * 80) self.sessionlogfile = None self.madtpg_fullscreen = None self.use_madnet_tpg = False self.use_patterngenerator = False self.patch_sequence = False self.patch_count = 0 self.patterngenerator_sent_count = 0 self.exec_cmd_returnvalue = None self.tmpfiles = {} self.buffer = [] def create_3dlut(self, profile_in, path, profile_abst=None, profile_out=None, apply_cal=True, intent="r", format="cube", size=17, input_bits=10, output_bits=12, maxval=1.0, input_encoding="n", output_encoding="n", trc_gamma=None, trc_gamma_type="B", trc_output_offset=0.0, save_link_icc=True, apply_black_offset=True, use_b2a=False): """ Create a 3D LUT from one (device link) or two (device) profiles, optionally incorporating an abstract profile. """ # .cube: http://doc.iridas.com/index.php?title=LUT_Formats # .3dl: http://www.kodak.com/US/plugins/acrobat/en/motion/products/look/UserGuide.pdf # http://download.autodesk.com/us/systemdocs/pdf/lustre_color_management_user_guide.pdf # .spi3d: https://github.com/imageworks/OpenColorIO/blob/master/src/core/FileFormatSpi3D.cpp # .mga: http://pogle.pandora-int.com/download/manual/lut3d_format.html for profile in (profile_in, profile_out): if (profile.profileClass not in ("mntr", "link", "scnr", "spac") or profile.colorSpace != "RGB"): raise NotImplementedError(lang.getstr("profile.unsupported", (profile.profileClass, profile.colorSpace))) if profile_in.profileClass == "link": break # Setup temp dir cwd = self.create_tempdir() if isinstance(cwd, Exception): raise cwd result = None path = os.path.split(path) path = os.path.join(path[0], make_argyll_compatible_path(path[1])) filename, ext = os.path.splitext(path) name = os.path.basename(filename) if profile_in.profileClass == "link": link_basename = os.path.basename(profile_in.fileName) link_filename = os.path.join(cwd, link_basename) profile_in.write(link_filename) else: # Check if files are the same if profile_in.isSame(profile_out, force_calculation=True): raise Error(lang.getstr("error.source_dest_same")) # Prepare building a device link link_basename = name + profile_ext link_filename = os.path.join(cwd, link_basename) profile_in_basename = make_argyll_compatible_path(os.path.basename(profile_in.fileName)) profile_out_basename = make_argyll_compatible_path(os.path.basename(profile_out.fileName)) if profile_in_basename == profile_out_basename: (profile_out_filename, profile_out_ext) = os.path.splitext(profile_out_basename) profile_out_basename = "%s (2)%s" % (profile_out_filename, profile_out_ext) profile_out.fileName = os.path.join(cwd, profile_out_basename) profile_out.write() profile_out_cal_path = os.path.splitext(profile_out.fileName)[0] + ".cal" manufacturer = profile_out.getDeviceManufacturerDescription() model = profile_out.getDeviceModelDescription() device_manufacturer = profile_out.device["manufacturer"] device_model = profile_out.device["model"] mmod = profile_out.tags.get("mmod") self.sessionlogfile = LogFile(name, cwd) self.sessionlogfiles[name] = self.sessionlogfile # Apply calibration? if apply_cal: # Get the calibration from profile vcgt if not profile_out.tags.get("vcgt", None): raise Error(lang.getstr("profile.no_vcgt")) try: cgats = vcgt_to_cal(profile_out) except (IOError, CGATS.CGATSInvalidError, CGATS.CGATSInvalidOperationError, CGATS.CGATSKeyError, CGATS.CGATSTypeError, CGATS.CGATSValueError), exception: raise Error(lang.getstr("cal_extraction_failed")) cgats.write(profile_out_cal_path) if self.argyll_version < [1, 6]: # Can't apply the calibration with old collink versions - # apply the calibration to the 'out' profile prior to # device linking instead applycal = get_argyll_util("applycal") if not applycal: raise Error(lang.getstr("argyll.util.not_found", "applycal")) safe_print(lang.getstr("apply_cal")) result = self.exec_cmd(applycal, ["-v", profile_out_cal_path, profile_out_basename, profile_out.fileName], capture_output=True, skip_scripts=True, sessionlogfile=self.sessionlogfile) if isinstance(result, Exception) and not getcfg("dry_run"): raise result elif not result: raise Error("\n\n".join([lang.getstr("apply_cal.error"), "\n".join(self.errors)])) profile_out = ICCP.ICCProfile(profile_out.fileName) # Deal with applying TRC collink_version_string = get_argyll_version_string("collink") collink_version = parse_argyll_version_string(collink_version_string) if trc_gamma: if collink_version >= [1, 7] or not trc_output_offset: # Make sure the profile has the expected Rec. 709 TRC # for BT.1886 self.log(appname + ": Applying Rec. 709 TRC to " + os.path.basename(profile_in.fileName)) for i, channel in enumerate(("r", "g", "b")): if channel + "TRC" in profile_in.tags: profile_in.tags[channel + "TRC"].set_trc(-709) else: # Argyll CMS prior to 1.7 beta development code 2014-07-10 # does not support output offset, alter the source profile # instead (note that accuracy is limited due to 16-bit # encoding used in ICC profile, collink 1.7 can use full # floating point processing and will be more precise) self.blend_profile_blackpoint(profile_in, profile_out, trc_output_offset, trc_gamma, trc_gamma_type) elif apply_black_offset: # Apply only the black point blending portion of BT.1886 mapping self.blend_profile_blackpoint(profile_in, profile_out, 1.0, apply_trc=False) profile_in.fileName = os.path.join(cwd, profile_in_basename) profile_in.write() # Now build the device link collink = get_argyll_util("collink") if not collink: raise Error(lang.getstr("argyll.util.not_found", "collink")) is_argyll_lut_format = (self.argyll_version >= [1, 6] and (((format == "eeColor" or (format == "cube" and collink_version >= [1, 7])) and not test) or format == "madVR")) args = ["-v", "-qh", "-g" if use_b2a else "-G", "-i%s" % intent, "-r%i" % size, "-n"] if profile_abst: profile_abst.write(os.path.join(cwd, "abstract.icc")) args.extend(["-p", "abstract.icc"]) if self.argyll_version >= [1, 6]: if format == "madVR": args.append("-3m") elif format == "eeColor" and not test: args.append("-3e") elif (format == "cube" and collink_version >= [1, 7] and not test): args.append("-3c") args.append("-e%s" % input_encoding) args.append("-E%s" % output_encoding) if (((trc_gamma and trc_gamma_type in ("b", "B")) or (not trc_gamma and apply_black_offset)) and collink_version >= [1, 7]): args.append("-b") # Use RGB->RGB forced black point hack if trc_gamma and trc_gamma_type in ("b", "B"): if collink_version >= [1, 7]: args.append("-I%s:%s:%s" % (trc_gamma_type, trc_output_offset, trc_gamma)) elif not trc_output_offset: args.append("-I%s:%s" % (trc_gamma_type, trc_gamma)) if apply_cal: # Apply the calibration when building our device link # i.e. use collink -a parameter (apply calibration curves # to link output and append linear) args.extend(["-a", os.path.basename(profile_out_cal_path)]) if getcfg("extra_args.collink").strip(): args += parse_argument_string(getcfg("extra_args.collink")) result = self.exec_cmd(collink, args + [profile_in_basename, profile_out_basename, link_filename], capture_output=True, skip_scripts=True) if (result and not isinstance(result, Exception) and save_link_icc and os.path.isfile(link_filename)): profile_link = ICCP.ICCProfile(link_filename) profile_link.setDescription(name) profile_link.setCopyright(getcfg("copyright")) if manufacturer: profile_link.setDeviceManufacturerDescription(manufacturer) if model: profile_link.setDeviceModelDescription(model) profile_link.device["manufacturer"] = device_manufacturer profile_link.device["model"] = device_model if mmod: profile_link.tags.mmod = mmod profile_link.tags.meta = ICCP.DictType() profile_link.tags.meta.update([("CMF_product", appname), ("CMF_binary", appname), ("CMF_version", version), ("collink.args", sp.list2cmdline( args + [profile_in_basename, profile_out_basename, link_basename])), ("collink.version", collink_version_string), ("encoding.input", input_encoding), ("encoding.output", output_encoding)]) profile_link.calculateID() profile_link.write(filename + profile_ext) if is_argyll_lut_format: # Collink has already written the 3DLUT for us result2 = self.wrapup(not isinstance(result, UnloggedInfo) and result, dst_path=path, ext_filter=[".3dlut", ".cube", ".log", ".txt"]) if not result: result = UnloggedError(lang.getstr("aborted")) if isinstance(result2, Exception): if isinstance(result, Exception): result = Error(safe_unicode(result) + "\n\n" + safe_unicode(result2)) else: result = result2 if not isinstance(result, Exception): return if isinstance(result, Exception): raise result elif not result: raise UnloggedError(lang.getstr("aborted")) # We have to create the 3DLUT ourselves # Create input RGB values RGB_in = [] RGB_indexes = [] seen = {} if format == "eeColor": # Fixed size size = 65 elif format == "ReShade": format = "png" step = 1.0 / (size - 1) RGB_triplet = [0.0, 0.0, 0.0] RGB_index = [0, 0, 0] # Set the fastest and slowest changing columns, from right to left if (format in ("3dl", "mga", "spi3d") or (format == "png" and getcfg("3dlut.image.order") == "bgr")): columns = (0, 1, 2) elif format == "eeColor": columns = (2, 0, 1) else: columns = (2, 1, 0) for i in xrange(0, size): # Red RGB_triplet[columns[0]] = step * i RGB_index[columns[0]] = i for j in xrange(0, size): # Green RGB_triplet[columns[1]] = step * j RGB_index[columns[1]] = j for k in xrange(0, size): # Blue RGB_triplet[columns[2]] = step * k RGB_copy = list(RGB_triplet) if format == "eeColor": # eeColor cLUT is fake 65^3 - only 64^3 is usable. # This affects full range and xvYCC RGB, so un-map # inputs to cLUT to only use 64^3 if input_encoding == "n": for l in xrange(3): RGB_copy[l] = min(RGB_copy[l] * (size - 1.0) / (size - 2.0), 100.0) elif input_encoding in ("x", "X"): for l in xrange(2): RGB_copy[1 + l] = min((RGB_copy[1 + l] * (size - 1.0) - 1.0) / (size - 3.0), 100.0) RGB_index[columns[2]] = k RGB_in.append(RGB_copy) RGB_indexes.append(list(RGB_index)) # Lookup RGB -> RGB values through devicelink profile using icclu # (Using icclu instead of xicclu because xicclu in versions # prior to Argyll CMS 1.6.0 could not deal with devicelink profiles) RGB_out = self.xicclu(link_filename, RGB_in, use_icclu=True) # Remove temporary files, move log file result2 = self.wrapup(dst_path=path, ext_filter=[".log"]) if isinstance(result, Exception): raise result if format != "png": lut = [["# Created with %s %s" % (appname, version)]] valsep = " " linesep = "\n" if format == "3dl": if maxval is None: maxval = 1023 if output_bits is None: output_bits = math.log(maxval + 1) / math.log(2) if input_bits is None: input_bits = output_bits maxval = math.pow(2, output_bits) - 1 pad = len(str(maxval)) lut.append(["# INPUT RANGE: %i" % input_bits]) lut.append(["# OUTPUT RANGE: %i" % output_bits]) lut.append([]) for i in xrange(0, size): lut[-1].append("%i" % int(round(i * step * (math.pow(2, input_bits) - 1)))) for RGB_triplet in RGB_out: lut.append([]) for component in (0, 1, 2): lut[-1].append("%i" % int(round(RGB_triplet[component] * maxval))) elif format == "cube": if maxval is None: maxval = 1.0 lut.append(["LUT_3D_SIZE %i" % size]) lut.append(["DOMAIN_MIN 0.0 0.0 0.0"]) fp_offset = str(maxval).find(".") domain_max = "DOMAIN_MAX %s %s %s" % (("%%.%if" % len(str(maxval)[fp_offset + 1:]), ) * 3) lut.append([domain_max % ((maxval ,) * 3)]) lut.append([]) for RGB_triplet in RGB_out: lut.append([]) for component in (0, 1, 2): lut[-1].append("%.6f" % (RGB_triplet[component] * maxval)) elif format == "spi3d": if maxval is None: maxval = 1.0 lut = [["SPILUT 1.0"]] lut.append(["3 3"]) lut.append(["%i %i %i" % ((size, ) * 3)]) for i, RGB_triplet in enumerate(RGB_out): lut.append([str(index) for index in RGB_indexes[i]]) for component in (0, 1, 2): lut[-1].append("%.6f" % (RGB_triplet[component] * maxval)) elif format == "eeColor": if maxval is None: maxval = 1.0 lut = [] for i, RGB_triplet in enumerate(RGB_out): lut.append(["%.6f" % (float(component) * maxval) for component in RGB_in[i].split()]) for component in (0, 1, 2): lut[-1].append("%.6f" % (RGB_triplet[component] * maxval)) linesep = "\r\n" elif format == "mga": lut = [["#HEADER"], ["#filename: %s" % os.path.basename(path)], ["#type: 3D cube file"], ["#format: 1.00"], ["#created: %s" % strftime("%d %B %Y")], ["#owner: %s" % getpass.getuser()], ["#title: %s" % os.path.splitext(os.path.basename(path))[0]], ["#END"]] lut.append([]) lut.append(["channel 3d"]) lut.append(["in %i" % (size ** 3)]) maxval = 2 ** output_bits - 1 lut.append(["out %i" % (maxval + 1)]) lut.append([""]) lut.append(["format lut"]) lut.append([""]) lut.append(["values\tred\tgreen\tblue"]) for i, RGB_triplet in enumerate(RGB_out): lut.append(["%i" % i]) for component in (0, 1, 2): lut[-1].append(("%i" % int(round(RGB_triplet[component] * maxval)))) valsep = "\t" elif format == "png": lut = [[]] if output_bits > 8: # PNG only supports 8 and 16 bit output_bits = 16 maxval = 2 ** output_bits - 1 for RGB_triplet in RGB_out: if len(lut[-1]) == size: # Append new scanline lut.append([]) lut[-1].append([int(round(v * maxval)) for v in RGB_triplet]) # Current layout is vertical if getcfg("3dlut.image.layout") == "h": # Change layout to horizontal lutv = lut lut = [[]] for i in xrange(size): if len(lut[-1]) == size ** 2: # Append new scanline lut.append([]) for j in xrange(size): lut[-1].extend(lutv[i + size * j]) if format != "png": lut.append([]) for i, line in enumerate(lut): lut[i] = valsep.join(line) result = linesep.join(lut) # Write 3DLUT lut_file = open(path, "wb") if format != "png": lut_file.write(result) else: im = imfile.Image(lut, output_bits) im.write(lut_file) lut_file.close() if isinstance(result2, Exception): raise result2 def create_tempdir(self): """ Create a temporary working directory and return its path. """ if not self.tempdir or not os.path.isdir(self.tempdir): # we create the tempdir once each calibrating/profiling run # (deleted by 'wrapup' after each run) if verbose >= 2: if not self.tempdir: msg = "there is none" else: msg = "the previous (%s) no longer exists" % self.tempdir safe_print(appname + ": Creating a new temporary directory " "because", msg) try: self.tempdir = tempfile.mkdtemp(prefix=appname + u"-") except Exception, exception: self.tempdir = None return Error("Error - couldn't create temporary directory: " + safe_str(exception)) return self.tempdir def enumerate_displays_and_ports(self, silent=False, check_lut_access=True, enumerate_ports=True, include_network_devices=True): """ Enumerate the available displays and ports. Also sets Argyll version number, availability of certain options like black point rate, and checks LUT access for each display. """ if (silent and check_argyll_bin()) or (not silent and check_set_argyll_bin()): displays = [] lut_access = [] if verbose >= 1 and not silent: safe_print(lang.getstr("enumerating_displays_and_comports")) instruments = [] if enumerate_ports: cmd = get_argyll_util("dispcal") else: cmd = get_argyll_util("dispwin") for instrument in getcfg("instruments"): # Names are canonical from 1.1.4.7 onwards, but we may have # verbose names from an old configuration instrument = get_canonical_instrument_name(instrument) if instrument.strip(): instruments.append(instrument) args = [] if include_network_devices: args.append("-dcc:?") args.append("-?") argyll_bin_dir = os.path.dirname(cmd) if (argyll_bin_dir != self.argyll_bin_dir): self.argyll_bin_dir = argyll_bin_dir safe_print(self.argyll_bin_dir) result = self.exec_cmd(cmd, args, capture_output=True, skip_scripts=True, silent=True, log_output=False) if isinstance(result, Exception): safe_print(result) arg = None defaults["calibration.black_point_hack"] = 0 defaults["calibration.black_point_rate.enabled"] = 0 defaults["patterngenerator.prisma.argyll"] = 0 n = -1 self.display_rects = [] non_standard_display_args = ("-dweb[:port]", "-dmadvr") if test: # Add dummy Chromecasts self.output.append(u" -dcc[:n]") self.output.append(u" 100 = '\xd4\xc7\xf3 Test A'") self.output.append(u" 101 = '\xd4\xc7\xf3 Test B'") for line in self.output: if isinstance(line, unicode): n += 1 line = line.strip() if n == 0 and "version" in line.lower(): argyll_version_string = line[line.lower().find("version") + 8:] if (argyll_version_string != self.argyll_version_string): self.set_argyll_version_from_string(argyll_version_string) safe_print("Argyll CMS " + self.argyll_version_string) config.defaults["copyright"] = ("No copyright. Created " "with %s %s and Argyll " "CMS %s" % (appname, version, argyll_version_string)) if self.argyll_version > [1, 0, 4]: # Rate of blending from neutral to black point. defaults["calibration.black_point_rate.enabled"] = 1 if (self.argyll_version >= [1, 7] and not "Beta" in self.argyll_version_string): # Forced black point hack available # (Argyll CMS 1.7) defaults["calibration.black_point_hack"] = 1 continue line = line.split(None, 1) if len(line) and line[0][0] == "-": arg = line[0] if arg == "-A": # Rate of blending from neutral to black point. defaults["calibration.black_point_rate.enabled"] = 1 elif arg in non_standard_display_args: displays.append(arg) elif arg == "-b" and not line[-1].startswith("bright"): # Forced black point hack available # (Argyll CMS 1.7b 2014-12-22) defaults["calibration.black_point_hack"] = 1 elif arg == "-dprisma[:host]": defaults["patterngenerator.prisma.argyll"] = 1 elif len(line) > 1 and line[1][0] == "=": value = line[1].strip(" ='") if arg == "-d": # Standard displays match = re.findall("(.+?),? at (-?\d+), (-?\d+), " "width (\d+), height (\d+)", value) if len(match): display = "%s @ %s, %s, %sx%s" % match[0] if " ".join(value.split()[-2:]) == \ "(Primary Display)": display += u" [PRIMARY]" displays.append(display) self.display_rects.append( wx.Rect(*[int(item) for item in match[0][1:]])) elif arg == "-dcc[:n]": # Chromecast if value: # Note the Chromecast name may be mangled due # to being UTF-8 encoded, but commandline output # will always be decoded to Unicode using the # stdout encoding, which may not be UTF-8 # (e.g. under Windows). We can recover characters # valid in both UTF-8 and stdout encoding # by a re-encode/decode step displays.append("Chromecast %s: %s" % (line[0], safe_unicode(safe_str(value, enc), "UTF-8"))) elif arg == "-dprisma[:host]": # Prisma # : @ # 141550000000: prisma-0000 @ 172.31.31.162 match = re.findall(".+?: (.+) @ (.+)", value) if len(match): displays.append("Prisma %s: %s @ %s" % (line[0], safe_unicode(safe_str(match[0][0], enc), "UTF-8"), match[0][1])) elif arg == "-c" and enumerate_ports: if ((re.match("/dev(?:/[\w.]+)*$", value) or re.match("COM\d+$", value)) and getcfg("skip_legacy_serial_ports")): # Skip all legacy serial ports (this means we # deliberately don't support DTP92 and # Spectrolino, although they may work when # used with a serial to USB adaptor) continue value = value.split(None, 1) if len(value) > 1: value = value[1].strip("()") else: value = value[0] value = get_canonical_instrument_name(value) instruments.append(value) if test: inames = all_instruments.keys() inames.sort() for iname in inames: iname = get_canonical_instrument_name(iname) if not iname in instruments: instruments.append(iname) if verbose >= 1 and not silent: safe_print(lang.getstr("success")) if instruments != self.instruments: self.instruments = instruments setcfg("instruments", instruments) if displays != self._displays: self._displays = list(displays) displays = filter(lambda display: not display in non_standard_display_args, displays) self.display_edid = [] self.display_manufacturers = [] self.display_names = [] if sys.platform == "win32": # The ordering will work as long # as Argyll continues using # EnumDisplayMonitors monitors = util_win.get_real_display_devices_info() for i, display in enumerate(displays): if (display.startswith("Chromecast ") or display.startswith("Prisma ")): self.display_edid.append({}) if display.startswith("Prisma "): display_manufacturer = "Q, Inc" else: display_manufacturer = "Google" self.display_manufacturers.append(display_manufacturer) self.display_names.append(display.split(":", 1)[1].strip()) continue display_name = split_display_name(display) # Make sure we have nice descriptions desc = [] if sys.platform == "win32" and i < len(monitors): # Get monitor description using win32api device = util_win.get_active_display_device( monitors[i]["Device"]) if device: desc.append(device.DeviceString.decode(fs_enc, "replace")) # Deal with HiDPI - update monitor rect m_left, m_top, m_right, m_bottom = monitors[i]["Monitor"] m_width = m_right - m_left m_height = m_bottom - m_top self.display_rects[i] = wx.Rect(m_left, m_top, m_width, m_height) is_primary = u" [PRIMARY]" in display display = " @ ".join([display_name, "%i, %i, %ix%i" % (m_left, m_top, m_width, m_height)]) if is_primary: display += u" [PRIMARY]" # Get monitor descriptions from EDID try: # Important: display_name must be given for get_edid # under Mac OS X, but it doesn't hurt to always # include it edid = get_edid(i, display_name) except (EnvironmentError, TypeError, ValueError, WMIError), exception: if isinstance(exception, EnvironmentError): safe_print(exception) edid = {} self.display_edid.append(edid) if edid: manufacturer = edid.get("manufacturer", "").split() monitor = edid.get("monitor_name", edid.get("ascii", str(edid["product_id"] or ""))) if monitor and not monitor in "".join(desc): desc = [monitor] else: manufacturer = [] if desc and desc[-1] not in display: # Only replace the description if it not already # contains the monitor model display = " @".join([" ".join(desc), display.split("@")[-1]]) displays[i] = display self.display_manufacturers.append(" ".join(manufacturer)) self.display_names.append(split_display_name(display)) if self.argyll_version >= [1, 4, 0]: displays.append("Web @ localhost") self.display_edid.append({}) self.display_manufacturers.append("") self.display_names.append("Web") if self.argyll_version >= [1, 6, 0]: displays.append("madVR") self.display_edid.append({}) self.display_manufacturers.append("") self.display_names.append("madVR") # Prisma displays.append("Prisma") self.display_edid.append({}) self.display_manufacturers.append("Q, Inc") self.display_names.append("Prisma") # Resolve displays.append("Resolve") self.display_edid.append({}) self.display_manufacturers.append("DaVinci") self.display_names.append("Resolve") # Untethered displays.append("Untethered") self.display_edid.append({}) self.display_manufacturers.append("") self.display_names.append("Untethered") # self.displays = displays setcfg("displays", displays) # Filter out Prisma, Resolve and Untethered # IMPORTANT: Also make changes to display filtering in # worker.Worker.has_separate_lut_access displays = displays[:-3] if self.argyll_version >= [1, 6, 0]: # Filter out madVR displays = displays[:-1] if self.argyll_version >= [1, 4, 0]: # Filter out Web @ localhost displays = displays[:-1] if check_lut_access: dispwin = get_argyll_util("dispwin") test_cal = get_data_path("test.cal") if not test_cal: safe_print(lang.getstr("file.missing", "test.cal")) tmp = self.create_tempdir() if isinstance(tmp, Exception): safe_print(tmp) tmp = None for i, disp in enumerate(displays): if (disp.startswith("Chromecast ") or disp.startswith("Prisma ") or not test_cal): lut_access.append(None) continue if verbose >= 1 and not silent: safe_print(lang.getstr("checking_lut_access", (i + 1))) # Save current calibration? if tmp: current_cal = os.path.join(tmp, "current.cal") result = self.save_current_video_lut(i + 1, current_cal, silent=True) # Load test.cal result = self.exec_cmd(dispwin, ["-d%s" % (i +1), "-c", test_cal], capture_output=True, skip_scripts=True, silent=True) if isinstance(result, Exception): safe_print(result) elif result is None: lut_access.append(None) continue # Check if LUT == test.cal result = self.exec_cmd(dispwin, ["-d%s" % (i +1), "-V", test_cal], capture_output=True, skip_scripts=True, silent=True) if isinstance(result, Exception): safe_print(result) elif result is None: lut_access.append(None) continue retcode = -1 for line in self.output: if line.find("IS loaded") >= 0: retcode = 0 break # Reset LUT & (re-)load previous cal (if any) if not tmp or not os.path.isfile(current_cal): current_cal = self.get_dispwin_display_profile_argument(i) result = self.exec_cmd(dispwin, ["-d%s" % (i + 1), "-c", current_cal], capture_output=True, skip_scripts=True, silent=True) if tmp and os.path.isfile(current_cal): os.remove(current_cal) if isinstance(result, Exception): safe_print(result) lut_access.append(retcode == 0) if verbose >= 1 and not silent: if retcode == 0: safe_print(lang.getstr("success")) else: safe_print(lang.getstr("failure")) else: lut_access.extend([None] * len(displays)) if self.argyll_version >= [1, 4, 0]: # Web @ localhost lut_access.append(False) if self.argyll_version >= [1, 6, 0]: # madVR lut_access.append(True) # Prisma lut_access.append(False) # Resolve lut_access.append(False) # Untethered lut_access.append(False) self.lut_access = lut_access elif silent or not check_argyll_bin(): self.clear_argyll_info() def exec_cmd(self, cmd, args=[], capture_output=False, display_output=False, low_contrast=True, skip_scripts=False, silent=False, parent=None, asroot=False, log_output=True, title=appname, shell=False, working_dir=None, dry_run=False, sessionlogfile=None): """ Execute a command. Return value is either True (succeed), False (failed), None (canceled) or an exception. cmd is the full path of the command. args are the arguments, if any. capture_output (if True) swallows any output from the command and sets the 'output' and 'errors' properties of the Worker instance. display_output shows the log after the command. low_contrast (if True) sets low contrast shell colors while the command is run. skip_scripts (if True) skips the creation of shell scripts that allow re-running the command. Note that this is also controlled by a global config option and scripts will only be created if it evaluates to False. silent (if True) skips most output and also most error dialogs (except unexpected failures) parent sets the parent window for auth dialog (if asroot is True). asroot (if True) on Linux runs the command using sudo. log_output (if True) logs any output if capture_output is also set. title = Title for auth dialog (if asroot is True) working_dir = Working directory. If None, will be determined from absulte path of last argument and last argument will be set to only the basename. If False, no working dir will be used and file arguments not changed. """ if not capture_output: capture_output = not sys.stdout.isatty() self.clear_cmd_output() if None in [cmd, args]: if verbose >= 1 and not silent: safe_print(lang.getstr("aborted")) return False self.cmd = cmd cmdname = os.path.splitext(os.path.basename(cmd))[0] self.cmdname = cmdname if not "-?" in args and cmdname == get_argyll_utilname("dispwin"): if "-I" in args or "-U" in args: if "-Sl" in args or "-Sn" in args: # Root is required if installing a profile to a system # location asroot = True elif not ("-s" in args or self.calibration_loading_generally_supported): # Loading/clearing calibration not supported # Don't actually do it, pretend we were successful if "-V" in args: self.output.append("IS loaded") self.retcode = 0 return True if asroot: silent = False measure_cmds = (get_argyll_utilname("dispcal"), get_argyll_utilname("dispread"), get_argyll_utilname("spotread")) process_cmds = (get_argyll_utilname("collink"), get_argyll_utilname("colprof"), get_argyll_utilname("targen")) # Run commands through wexpect.spawn instead of subprocess.Popen if # any of these conditions apply use_pty = args and not "-?" in args and cmdname in measure_cmds + process_cmds self.measure_cmd = not "-?" in args and cmdname in measure_cmds self.use_patterngenerator = (self.measure_cmd and cmdname != get_argyll_utilname("spotread") and (config.get_display_name() == "Resolve" or (config.get_display_name() == "Prisma" and not defaults["patterngenerator.prisma.argyll"]))) use_3dlut_override = (((self.use_patterngenerator and config.get_display_name(None, True) == "Prisma") or (config.get_display_name(None, True) == "madVR" and (sys.platform != "win32" or not getcfg("madtpg.native")))) and cmdname == get_argyll_utilname("dispread") and "-V" in args) if use_3dlut_override: args.remove("-V") working_basename = None if args and args[-1].find(os.path.sep) > -1: working_basename = os.path.basename(args[-1]) if cmdname not in (get_argyll_utilname("dispcal"), get_argyll_utilname("dispread"), get_argyll_utilname("colprof"), get_argyll_utilname("targen"), get_argyll_utilname("txt2ti3")): # Last arg is with extension working_basename = os.path.splitext(working_basename)[0] if working_dir is None: working_dir = os.path.dirname(args[-1]) if working_dir is None: working_dir = self.tempdir if working_dir and not os.path.isdir(working_dir): working_dir = None if working_dir and working_dir == self.tempdir: # Get a list of files in the temp directory and their modification # times so we can determine later if anything has changed and we # should keep the files in case of errors for filename in os.listdir(working_dir): self.tmpfiles[filename] = os.stat(os.path.join(working_dir, filename)).st_mtime if (working_basename and working_dir == self.tempdir and not silent and log_output and not getcfg("dry_run")): if sessionlogfile: self.sessionlogfile = sessionlogfile else: self.sessionlogfile = LogFile(working_basename, working_dir) self.sessionlogfiles[working_basename] = self.sessionlogfile if not silent or verbose >= 3: self.log("-" * 80) if self.sessionlogfile: safe_print("Session log: %s" % working_basename + ".log") safe_print("") use_madvr = (cmdname in (get_argyll_utilname("dispcal"), get_argyll_utilname("dispread"), get_argyll_utilname("dispwin")) and get_arg("-dmadvr", args) and madvr) if use_madvr: # Try to connect to running madTPG or launch a new instance try: if self.madtpg_connect(): # Connected # Check madVR version madvr_version = self.madtpg.get_version() if not madvr_version or madvr_version < madvr.min_version: self.madtpg.disconnect() return Error(lang.getstr("madvr.outdated", madvr.min_version)) self.log("Connected to madVR version %i.%i.%i.%i (%s)" % (madvr_version + (self.madtpg.uri, ))) fullscreen = self.madtpg.is_use_fullscreen_button_pressed() if cmdname == get_argyll_utilname("dispcal"): self.madtpg_previous_fullscreen = fullscreen if not ("-m" in args or "-u" in args) and fullscreen: # Disable fullscreen self.madtpg.set_use_fullscreen_button(False) elif (getattr(self, "madtpg_previous_fullscreen", None) and cmdname == get_argyll_utilname("dispread") and self.dispread_after_dispcal): # Restore fullscreen self.madtpg.set_use_fullscreen_button(True) self.madtpg_fullscreen = self.madtpg.is_use_fullscreen_button_pressed() if isinstance(self.madtpg, madvr.MadTPG_Net): # Need to handle calibration clearing/loading/saving # for madVR net-protocol pure python implementation cal = None calfilename = None profile = None ramp = False if cmdname == get_argyll_utilname("dispwin"): if "-c" in args: # Clear calibration self.log("MadTPG_Net clear calibration") ramp = None if "-L" in args: # NOTE: Hmm, profile will be None. It's not # functionality we currently use though. profile = config.get_display_profile() if "-s" in args: # Save calibration. Get from madTPG self.log("MadTPG_Net save calibration:", args[-1]) ramp = self.madtpg.get_device_gamma_ramp() if not ramp: self.madtpg.disconnect() return Error("madVR_GetDeviceGammaRamp failed") cal = """CAL KEYWORD "DEVICE_CLASS" DEVICE_CLASS "DISPLAY" KEYWORD "COLOR_REP" COLOR_REP "RGB" BEGIN_DATA_FORMAT RGB_I RGB_R RGB_G RGB_B END_DATA_FORMAT NUMBER_OF_SETS 256 BEGIN_DATA """ # Convert ushort_Array_256_Array_3 to dictionary RGB = {} for j in xrange(3): for i in xrange(256): if not i in RGB: RGB[i] = [] RGB[i].append(ramp[j][i] / 65535.0) # Get RGB from dictionary for i, (R, G, B) in RGB.iteritems(): cal += "%f %f %f %f\n" % (i / 255.0, R, G, B) cal += "END_DATA" # Write out .cal file try: with open(args[-1], "w") as calfile: calfile.write(cal) except (IOError, OSError), exception: self.madtpg.disconnect() return exception cal = None ramp = False elif working_basename: # .cal/.icc/.icm file to load calfilename = args[-1] elif cmdname == get_argyll_utilname("dispread"): # Check for .cal file to load # NOTE this isn't normally used as we use -K # for madTPG, but is overridable by the user k_arg = get_arg("-k", args, True) if k_arg: calfilename = args[k_arg[0] + 1] else: ramp = None else: # dispcal ramp = None if calfilename: # Load calibration from .cal file or ICC profile self.log("MadTPG_Net load calibration:", calfilename) result = check_file_isfile(calfilename) if isinstance(result, Exception): self.madtpg.disconnect() return result if calfilename.lower().endswith(".cal"): # .cal file try: cal = CGATS.CGATS(calfilename) except (IOError, CGATS.CGATSError), exception: self.madtpg.disconnect() return exception else: # ICC profile try: profile = ICCP.ICCProfile(calfilename) except (IOError, ICCP.ICCProfileInvalidError), exception: self.madtpg.disconnect() return exception if profile: # Load calibration from ICC profile vcgt (if present) if isinstance(profile.tags.get("vcgt"), ICCP.VideoCardGammaType): cal = vcgt_to_cal(profile) else: # Linear ramp = None if cal: # Check calibration we're going to load try: cal = verify_cgats(cal, ("RGB_R", "RGB_G", "RGB_B")) if len(cal.DATA) != 256: # Needs to have 256 entries raise CGATSError("%s: %s != 256" % (lang.getstr("calibration"), lang.getstr("number_of_entries"))) except CGATS.CGATSError, exception: self.madtpg.disconnect() return exception # Convert calibration to ushort_Array_256_Array_3 ramp = ((ctypes.c_ushort * 256) * 3)() for i in xrange(256): for j, channel in enumerate("RGB"): ramp[j][i] = int(round(cal.DATA[i]["RGB_" + channel] * 65535)) else: ramp = None if (ramp is not False and not self.madtpg.set_device_gamma_ramp(ramp)): self.madtpg.disconnect() return Error("madVR_SetDeviceGammaRamp failed") if (isinstance(self.madtpg, madvr.MadTPG_Net) and cmdname == get_argyll_utilname("dispwin")): # For madVR net-protocol pure python implementation # we are now done self.madtpg.disconnect() return True if not "-V" in args and not use_3dlut_override: endis = "disable" else: endis = "enable" if not getattr(self.madtpg, endis + "_3dlut")(): self.madtpg.disconnect() return Error("madVR_%s3dlut failed" % endis.capitalize()) if ((not (cmdname == get_argyll_utilname("dispwin") or self.dispread_after_dispcal) or (cmdname == get_argyll_utilname("dispcal") and ("-m" in args or "-u" in args))) and self.madtpg_fullscreen and not self.instrument_on_screen): # Show place instrument on screen message with countdown countdown = 15 madtpg_osd = not self.madtpg.is_disable_osd_button_pressed() if not madtpg_osd: # Enable OSD if disabled self.madtpg.set_disable_osd_button(False) for i in xrange(countdown): if self.subprocess_abort or self.thread_abort: break if not self.madtpg.set_osd_text( lang.getstr("instrument.place_on_screen.madvr", (countdown - i, self.get_instrument_name()))): self.madtpg.disconnect() return Error("madVR_SetOsdText failed") ts = time() if i % 2 == 0: # Flash test area red self.madtpg.show_rgb(.8, 0, 0) else: self.madtpg.show_rgb(.15, .15, .15) delay = time() - ts if delay < 1: sleep(1 - delay) self.instrument_on_screen = True if not madtpg_osd: # Disable OSD self.madtpg.set_disable_osd_button(True) # Get pattern config patternconfig = self.madtpg.get_pattern_config() if (not patternconfig or not isinstance(patternconfig, tuple) or len(patternconfig) != 4): self.madtpg.disconnect() return Error("madVR_GetPatternConfig failed") self.log("Pattern area: %i%%" % patternconfig[0]) self.log("Background level: %i%%" % patternconfig[1]) self.log("Background mode: %s" % {0: "Constant", 1: "APL gamma", 2: "APL linear"}.get(patternconfig[2], patternconfig[2])) self.log("Border width: %i pixels" % patternconfig[3]) if isinstance(self.madtpg, madvr.MadTPG_Net): args.remove("-dmadvr") args.insert(0, "-P1,1,0.01") else: # Only if using native madTPG implementation! if not get_arg("-P", args): # Setup patch size to match pattern config args.insert(0, "-P0.5,0.5,%f" % math.sqrt(patternconfig[0])) if not patternconfig[1] and self.argyll_version >= [1, 7]: # Setup black background if background level is zero. # Only do this for Argyll >= 1.7 to prevent messing # with pattern area when Argyll 1.6.x is used args.insert(0, "-F") # Disconnect self.madtpg.disconnect() self.log("") else: return Error(lang.getstr("madtpg.launch.failure")) except Exception, exception: if isinstance(getattr(self, "madtpg", None), madvr.MadTPG_Net): self.madtpg.disconnect() return exception # Use mad* net protocol pure python implementation use_madnet = use_madvr and isinstance(self.madtpg, madvr.MadTPG_Net) # Use mad* net protocol pure python implementation as pattern generator self.use_madnet_tpg = use_madnet and cmdname != get_argyll_utilname("dispwin") if self.use_patterngenerator or self.use_madnet_tpg: # Run a dummy command so we can grab the RGB numbers for # the pattern generator from the output carg = get_arg("-C", args, True) if carg: index = min(carg[0] + 1, len(args) - 1) args[index] += " && " else: args.insert(0, "-C") args.insert(1, "") index = 1 python, pythonpath = get_python_and_pythonpath() script_dir = working_dir pythonscript = """from __future__ import print_function import os, sys, time if sys.platform != "win32": print(*["\\nCurrent RGB"] + sys.argv[1:]) abortfilename = os.path.join(%r, ".abort") okfilename = os.path.join(%r, ".ok") while 1: if os.path.isfile(abortfilename): break if os.path.isfile(okfilename): try: os.remove(okfilename) except OSError, e: pass else: break time.sleep(0.001) """ % (script_dir, script_dir) waitfilename = os.path.join(script_dir, ".wait") if sys.platform == "win32": # Avoid problems with encoding python = win32api.GetShortPathName(python) for i, path in enumerate(pythonpath): if os.path.exists(path): pythonpath[i] = win32api.GetShortPathName(path) # Write out .wait.py file scriptfilename = waitfilename + ".py" with open(scriptfilename, "w") as scriptfile: scriptfile.write(pythonscript) scriptfilename = win32api.GetShortPathName(scriptfilename) # Write out .wait.cmd file with open(waitfilename + ".cmd", "w") as waitfile: waitfile.write('@echo off\n') waitfile.write('echo.\n') waitfile.write('echo Current RGB %*\n') waitfile.write('set "PYTHONPATH=%s"\n' % safe_str(os.pathsep.join(pythonpath), enc)) waitfile.write('"%s" -S "%s" %%*\n' % (safe_str(python, enc), safe_str(scriptfilename, enc))) args[index] += waitfilename else: # Write out .wait file with open(waitfilename, "w") as waitfile: waitfile.write('#!/usr/bin/env python\n') waitfile.write(pythonscript) os.chmod(waitfilename, 0755) args[index] += '"%s" ./%s' % (strtr(safe_str(python), {'"': r'\"', "$": r"\$"}), os.path.basename(waitfilename)) if verbose >= 1 or not silent: if not silent or verbose >= 3: if (not silent and (dry_run or getcfg("dry_run")) and not self.cmdrun): safe_print(lang.getstr("dry_run")) safe_print("") self.cmdrun = True if working_dir: self.log(lang.getstr("working_dir")) indent = " " for name in working_dir.split(os.path.sep): self.log(textwrap.fill(name + os.path.sep, 80, expand_tabs=False, replace_whitespace=False, initial_indent=indent, subsequent_indent=indent)) indent += " " self.log("") self.log(lang.getstr("commandline")) printcmdline(cmd if verbose >= 2 else os.path.basename(cmd), args, fn=self.log, cwd=working_dir) self.log("") if not silent and (dry_run or getcfg("dry_run")): if not self.lastcmdname or self.lastcmdname == cmdname: safe_print(lang.getstr("dry_run.end")) if self.owner and hasattr(self.owner, "infoframe_toggle_handler"): wx.CallAfter(self.owner.infoframe_toggle_handler, show=True) if use_madnet: self.madtpg.disconnect() return UnloggedInfo(lang.getstr("dry_run.info")) cmdline = [cmd] + args for i, item in enumerate(cmdline): if i > 0 and item.find(os.path.sep) > -1: if sys.platform == "win32": item = make_win32_compatible_long_path(item) if (re.search("[^\x20-\x7e]", os.path.basename(item)) and os.path.exists(item) and i < len(cmdline) - 1): # Avoid problems with encoding under Windows by using # GetShortPathName, but be careful with the last # parameter which may be used as the basename for the # output file item = win32api.GetShortPathName(item) if working_dir and os.path.dirname(cmdline[i]) == working_dir: # Strip the path from all items in the working dir item = os.path.basename(item) if item != cmdline[i]: cmdline[i] = item if (working_dir and sys.platform == "win32" and re.search("[^\x20-\x7e]", working_dir) and os.path.exists(working_dir)): # Avoid problems with encoding working_dir = win32api.GetShortPathName(working_dir) sudo = None if asroot and ((sys.platform != "win32" and os.geteuid() != 0) or (sys.platform == "win32" and sys.getwindowsversion() >= (6, ))): if sys.platform == "win32": # Vista and later pass else: if not self.auth_timestamp: if hasattr(self, "thread") and self.thread.isAlive(): # Careful: We can only show the auth dialog if running # in the main GUI thread! if use_madnet: self.madtpg.disconnect() return Error("Authentication requested in non-GUI thread") result = self.authenticate(cmd, title, parent) if result is False: if use_madnet: self.madtpg.disconnect() return None elif isinstance(result, Exception): if use_madnet: self.madtpg.disconnect() return result sudo = unicode(self.sudo) if sudo: if not use_pty: # Sudo may need a tty depending on configuration use_pty = True cmdline.insert(0, sudo) if (cmdname == get_argyll_utilname("dispwin") and sys.platform != "darwin" and self.sudo.availoptions.get("E") and getcfg("sudo.preserve_environment")): # Preserve environment so $DISPLAY is set cmdline.insert(1, "-E") if not use_pty: cmdline.insert(1, "-S") # Set empty string as password prompt to hide it from stderr cmdline.insert(1, "") cmdline.insert(1, "-p") else: # Use a designated prompt cmdline.insert(1, "Password:") cmdline.insert(1, "-p") if (working_dir and working_basename and not skip_scripts and not getcfg("skip_scripts")): try: cmdfilename = os.path.join(working_dir, working_basename + "." + cmdname + script_ext) allfilename = os.path.join(working_dir, working_basename + ".all" + script_ext) first = not os.path.exists(allfilename) last = cmdname == get_argyll_utilname("dispwin") cmdfile = open(cmdfilename, "w") allfile = open(allfilename, "a") cmdfiles = Files((cmdfile, allfile)) if first: context = cmdfiles else: context = cmdfile if sys.platform == "win32": context.write("@echo off\n") context.write(('PATH %s;%%PATH%%\n' % os.path.dirname(cmd)).encode(enc, "safe_asciize")) cmdfiles.write('pushd "%~dp0"\n'.encode(enc, "safe_asciize")) if cmdname in (get_argyll_utilname("dispcal"), get_argyll_utilname("dispread")): cmdfiles.write("color 07\n") else: context.write(('PATH=%s:$PATH\n' % os.path.dirname(cmd)).encode(enc, "safe_asciize")) if sys.platform == "darwin" and config.mac_create_app: cmdfiles.write('pushd "`dirname ' '\\"$0\\"`/../../.."\n') else: cmdfiles.write('pushd "`dirname \\"$0\\"`"\n') if cmdname in (get_argyll_utilname("dispcal"), get_argyll_utilname("dispread")) and \ sys.platform != "darwin": cmdfiles.write('echo -e "\\033[40;2;37m" && clear\n') os.chmod(cmdfilename, 0755) os.chmod(allfilename, 0755) cmdfiles.write(u" ".join(quote_args(cmdline)).replace(cmd, cmdname).encode(enc, "safe_asciize") + "\n") if sys.platform == "win32": cmdfiles.write("set exitcode=%errorlevel%\n") if cmdname in (get_argyll_utilname("dispcal"), get_argyll_utilname("dispread")): # Reset to default commandline shell colors cmdfiles.write("color\n") cmdfiles.write("popd\n") cmdfiles.write("if not %exitcode%==0 exit /B %exitcode%\n") else: cmdfiles.write("exitcode=$?\n") if cmdname in (get_argyll_utilname("dispcal"), get_argyll_utilname("dispread")) and \ sys.platform != "darwin": # reset to default commandline shell colors cmdfiles.write('echo -e "\\033[0m" && clear\n') cmdfiles.write("popd\n") cmdfiles.write("if [ $exitcode -ne 0 ]; " "then exit $exitcode; fi\n") cmdfiles.close() if sys.platform == "darwin": if config.mac_create_app: # Could also use .command file directly, but using # applescript allows giving focus to the terminal # window automatically after a delay script = mac_terminal_do_script() + \ mac_terminal_set_colors(do=False) + \ ['-e', 'set shellscript to quoted form of ' '(POSIX path of (path to resource ' '"main.command"))', '-e', 'tell app ' '"Terminal"', '-e', 'do script shellscript ' 'in first window', '-e', 'delay 3', '-e', 'activate', '-e', 'end tell', '-o'] # Part 1: "cmdfile" appfilename = os.path.join(working_dir, working_basename + "." + cmdname + ".app").encode(fs_enc) cmdargs = ['osacompile'] + script + [appfilename] p = sp.Popen(cmdargs, stdin=sp.PIPE, stdout=sp.PIPE, stderr=sp.PIPE) p.communicate() shutil.move(cmdfilename, appfilename + "/Contents/Resources/main.command") os.chmod(appfilename + "/Contents/Resources/main.command", 0755) # Part 2: "allfile" appfilename = os.path.join( working_dir, working_basename + ".all.app") cmdargs = ['osacompile'] + script + [appfilename] p = sp.Popen(cmdargs, stdin=sp.PIPE, stdout=sp.PIPE, stderr=sp.PIPE) p.communicate() shutil.copyfile(allfilename, appfilename + "/Contents/Resources/main.command") os.chmod(appfilename + "/Contents/Resources/main.command", 0755) if last: os.remove(allfilename) except Exception, exception: self.log("Warning - error during shell script creation:", safe_unicode(exception)) cmdline = [safe_str(arg, fs_enc) for arg in cmdline] working_dir = None if not working_dir else working_dir.encode(fs_enc) try: if not self.measure_cmd and self.argyll_version >= [1, 2]: # Argyll tools will no longer respond to keys if debug: self.log("[D] Setting ARGYLL_NOT_INTERACTIVE 1") os.environ["ARGYLL_NOT_INTERACTIVE"] = "1" elif "ARGYLL_NOT_INTERACTIVE" in os.environ: del os.environ["ARGYLL_NOT_INTERACTIVE"] if debug: self.log("[D] argyll_version", self.argyll_version) self.log("[D] ARGYLL_NOT_INTERACTIVE", os.environ.get("ARGYLL_NOT_INTERACTIVE")) if self.measure_cmd: for name, version in (("MIN_DISPLAY_UPDATE_DELAY_MS", [1, 5]), ("DISPLAY_SETTLE_TIME_MULT", [1, 7])): backup = os.getenv("ARGYLL_%s_BACKUP" % name) value = None if (getcfg("measure.override_%s" % name.lower()) and self.argyll_version >= version): if backup is None: # Backup current value if any current = os.getenv("ARGYLL_%s" % name, "") os.environ["ARGYLL_%s_BACKUP" % name] = current else: current = backup if current: self.log("%s: Overriding ARGYLL_%s %s" % (appname, name, current)) # Override value = str(getcfg("measure.%s" % name.lower())) self.log("%s: Setting ARGYLL_%s %s" % (appname, name, value)) elif backup is not None: value = backup del os.environ["ARGYLL_%s_BACKUP" % name] if value: self.log("%s: Restoring ARGYLL_%s %s" % (appname, name, value)) elif "ARGYLL_%s" % name in os.environ: del os.environ["ARGYLL_%s" % name] elif "ARGYLL_%s" % name in os.environ: self.log("%s: ARGYLL_%s" % (appname, name), os.getenv("ARGYLL_%s" % name)) if value: os.environ["ARGYLL_%s" % name] = value elif cmdname in (get_argyll_utilname("iccgamut"), get_argyll_utilname("tiffgamut"), get_argyll_utilname("viewgam")): os.environ["ARGYLL_3D_DISP_FORMAT"] = "VRML" if sys.platform not in ("darwin", "win32"): os.environ["ENABLE_COLORHUG"] = "1" if sys.platform == "win32": startupinfo = sp.STARTUPINFO() startupinfo.dwFlags |= sp.STARTF_USESHOWWINDOW startupinfo.wShowWindow = sp.SW_HIDE else: startupinfo = None if not use_pty: data_encoding = enc if silent: stderr = sp.STDOUT else: stderr = tempfile.SpooledTemporaryFile() if capture_output: stdout = tempfile.SpooledTemporaryFile() elif sys.stdout.isatty(): stdout = sys.stdout else: stdout = sp.PIPE if sudo: stdin = tempfile.SpooledTemporaryFile() stdin.write(self.pwd.encode(enc, "replace") + os.linesep) stdin.seek(0) else: stdin = sp.PIPE else: data_encoding = self.pty_encoding kwargs = dict(timeout=5, cwd=working_dir, env=os.environ) if sys.platform == "win32": kwargs["codepage"] = windll.kernel32.GetACP() # As Windows' console always hard wraps at the # rightmost column, increase the buffer width kwargs["columns"] = 160 stderr = None stdout = EncodedWriter(StringIO(), None, data_encoding) logfiles = [] if (hasattr(self, "thread") and self.thread.isAlive() and self.interactive and getattr(self, "terminal", None)): logfiles.append(FilteredStream(self.terminal, discard="", triggers=self.triggers)) if log_output: linebuffered_logfiles = [] if sys.stdout.isatty(): linebuffered_logfiles.append(safe_print) else: linebuffered_logfiles.append(log) if self.sessionlogfile: linebuffered_logfiles.append(self.sessionlogfile) logfiles.append(LineBufferedStream( FilteredStream(Files(linebuffered_logfiles), data_encoding, discard="", linesep_in="\n", triggers=[]))) logfiles.append(stdout) if (hasattr(self, "thread") and self.thread.isAlive() and cmdname in measure_cmds + process_cmds): logfiles.extend([self.recent, self.lastmsg, self]) logfiles = Files(logfiles) if self.use_patterngenerator: pgname = config.get_display_name() if self.patterngenerator: # Use existing pattern generator instance self.patterngenerator.logfile = logfiles self.patterngenerator.use_video_levels = getcfg("patterngenerator.%s.use_video_levels" % pgname.lower()) if hasattr(self.patterngenerator, "conn"): # Try to use existing connection try: self.patterngenerator_send((.5, ) * 3, True) except socket.error: self.patterngenerator.disconnect_client() else: self.setup_patterngenerator(logfiles) if not hasattr(self.patterngenerator, "conn"): # Wait for connection - blocking self.patterngenerator.wait() if hasattr(self.patterngenerator, "conn"): self.patterngenerator_send((.5, ) * 3) else: # User aborted before connection was established return False if pgname == "Prisma": x, y, w, h, size = get_pattern_geometry() if use_3dlut_override: self.patterngenerator.enable_processing(size=size * 100) else: self.patterngenerator.disable_processing(size=size * 100) tries = 1 while tries > 0: if self.subprocess_abort or self.thread_abort: break if use_pty: if self.argyll_version >= [1, 2] and USE_WPOPEN and \ os.environ.get("ARGYLL_NOT_INTERACTIVE"): self.subprocess = WPopen(cmdline, stdin=sp.PIPE, stdout=tempfile.SpooledTemporaryFile(), stderr=sp.STDOUT, shell=shell, cwd=working_dir, startupinfo=startupinfo) else: # Minimum Windows version: XP or Server 2003 if (sys.platform == "win32" and sys.getwindowsversion() < (5, 1)): raise Error(lang.getstr("windows.version.unsupported")) try: self.subprocess = wexpect.spawn(cmdline[0], cmdline[1:], **kwargs) except wexpect.ExceptionPexpect, exception: self.retcode = -1 raise Error(safe_unicode(exception)) if debug >= 9 or (test and not "-?" in args): self.subprocess.interact() self.subprocess.logfile_read = logfiles if self.measure_cmd: keyhit_strs = [" or Q to ", "8\) Exit"] patterns = keyhit_strs + ["Current", r" \d+ of \d+"] self.log("%s: Starting interaction with subprocess" % appname) else: patterns = [] self.log("%s: Waiting for EOF" % appname) loop = 0 pwdsent = False authfailed = False eof = False while 1: if loop < 1 and sudo: curpatterns = ["Password:"] + patterns else: curpatterns = patterns # NOTE: Using a timeout of None can block indefinitely # and prevent expect() from ever returning! self.subprocess.expect(curpatterns + [wexpect.EOF, wexpect.TIMEOUT], timeout=1) if self.subprocess.after is wexpect.EOF: self.log("%s: Reached EOF (OK)" % appname) break elif self.subprocess.after is wexpect.TIMEOUT: if not self.subprocess.isalive(): self.log("%s: Subprocess no longer alive (timeout)" % appname) if eof: break eof = True continue elif (self.subprocess.after == "Password:" and loop < 1 and sudo): if pwdsent: self.subprocess.sendcontrol("C") authfailed = True self.auth_timestamp = 0 else: self._safe_send(self.pwd.encode(enc, "replace") + os.linesep, obfuscate=True) pwdsent = True if not self.subprocess.isalive(): break continue elif self.measure_cmd: if filter(lambda keyhit_str: re.search(keyhit_str, self.subprocess.after), keyhit_strs): # Wait for the keypress self.log("%s: Waiting for send buffer" % appname) while not self.send_buffer: if not self.subprocess.isalive(): self.log("%s: Subprocess no longer alive (unknown reason)" % appname) break sleep(.05) if (self.send_buffer and self.subprocess.isalive()): self.log("%s: Sending buffer: %r" % (appname, self.send_buffer)) self._safe_send(self.send_buffer) self.send_buffer = None if not self.subprocess.isalive(): break loop += 1 # We need to call isalive() to set the exitstatus. # We can't use wait() because it might block in the # case of a timeout if self.subprocess.isalive(): self.log("%s: Checking subprocess status" % appname) while self.subprocess.isalive(): sleep(.1) self.log("%s: Subprocess no longer alive (OK)" % appname) self.retcode = self.subprocess.exitstatus if authfailed: raise Error(lang.getstr("auth.failed")) else: try: if (asroot and sys.platform == "win32" and sys.getwindowsversion() >= (6, )): win32com_shell.ShellExecuteEx(lpVerb="runas", lpFile=cmd, lpParameters=" ".join(quote_args(args))) return True else: self.subprocess = sp.Popen(cmdline, stdin=stdin, stdout=stdout, stderr=stderr, shell=shell, cwd=working_dir, startupinfo=startupinfo) except Exception, exception: self.retcode = -1 raise Error(safe_unicode(exception)) self.retcode = self.subprocess.wait() if stdin != sp.PIPE and not getattr(stdin, "closed", True): stdin.close() if self.is_working() and self.subprocess_abort and \ self.retcode == 0: self.retcode = -1 self.subprocess = None tries -= 1 if not silent and stderr: stderr.seek(0) errors = stderr.readlines() if not capture_output or stderr is not stdout: stderr.close() if len(errors): for line in errors: if "Instrument Access Failed" in line and \ "-N" in cmdline[:-1]: cmdline.remove("-N") tries = 1 break if line.strip() and \ line.find("User Aborted") < 0 and \ line.find("XRandR 1.2 is faulty - falling back " "to older extensions") < 0: self.errors.append(line.decode(data_encoding, "replace")) if tries > 0 and not use_pty: stderr = tempfile.SpooledTemporaryFile() if capture_output or use_pty: stdout.seek(0) self.output = [re.sub("^\.{4,}\s*$", "", line.decode(data_encoding, "replace")) for line in stdout.readlines()] stdout.close() if len(self.output) and log_output: if not use_pty: self.log("".join(self.output).strip()) if display_output and self.owner and \ hasattr(self.owner, "infoframe_toggle_handler"): wx.CallAfter(self.owner.infoframe_toggle_handler, show=True) if tries > 0 and not use_pty: stdout = tempfile.SpooledTemporaryFile() if not silent and len(self.errors): errstr = "".join(self.errors).strip() self.log(errstr) except (Error, socket.error, EnvironmentError, RuntimeError), exception: return exception except Exception, exception: if debug: self.log('[D] working_dir:', working_dir) errmsg = (" ".join(cmdline).decode(fs_enc) + "\n" + safe_unicode(traceback.format_exc())) self.retcode = -1 return Error(errmsg) finally: if (sudo and cmdname not in ("chown", get_argyll_utilname("dispwin")) and working_dir and working_dir == self.tempdir and os.listdir(working_dir)): # We need to take ownership of any files created by commands # run via sudo otherwise we cannot move or remove them from # the temporary directory! errors = self.errors output = self.output retcode = self.retcode self.exec_cmd("chown", ["-R", getpass.getuser().decode(fs_enc), working_dir], capture_output=capture_output, skip_scripts=True, asroot=True) self.errors = errors self.output = output self.retcode = retcode if self.patterngenerator: if hasattr(self.patterngenerator, "conn"): try: if config.get_display_name() == "Resolve": # Send fullscreen black to prevent plasma burn-in self.patterngenerator.send((0, ) * 3, x=0, y=0, w=1, h=1) else: self.patterngenerator.disconnect_client() except Exception, exception: self.log(exception) if use_madnet: self.madtpg.disconnect() if debug and not silent: self.log("*** Returncode:", self.retcode) if self.retcode != 0: if use_pty and verbose >= 1 and not silent: self.log(lang.getstr("aborted")) if use_pty and len(self.output): errmsg = None for i, line in enumerate(self.output): if "Calibrate failed with 'User hit Abort Key' (No device error)" in line: break if ((": Error" in line and not "failed with 'User Aborted'" in line and not "returned error code 1" in line) or (line.startswith("Failed to") and not "Failed to meet target" in line) or ("Requested ambient light capability" in line and len(self.output) == i + 2) or ("Diagnostic:" in line and (len(self.output) == i + 1 or self.output[i + 1].startswith("usage:"))) or "communications failure" in line.lower()): # "returned error code 1" == user aborted if (sys.platform == "win32" and ("config 1 failed (Operation not supported or " "unimplemented on this platform) (Permissions ?)") in line): self.output.insert(i, lang.getstr("argyll.instrument.driver.missing") + "\n\n" + lang.getstr("argyll.error.detail") + " ") if "Diagnostic:" in line: errmsg = line else: errmsg = "".join(self.output[i:]) startpos = errmsg.find(": Error") if startpos > -1: errmsg = errmsg[startpos + 2:] if errmsg: return UnloggedError(errmsg.strip()) if self.exec_cmd_returnvalue is not None: return self.exec_cmd_returnvalue return self.retcode == 0 def flush(self): pass def _generic_consumer(self, delayedResult, consumer, continue_next, *args, **kwargs): # consumer must accept result as first arg result = None exception = None try: result = delayedResult.get() except Exception, exception: if hasattr(exception, "originalTraceback"): self.log(exception.originalTraceback) else: self.log(traceback.format_exc()) result = UnloggedError(exception) if self.progress_start_timer.IsRunning(): self.progress_start_timer.Stop() self.finished = True if not continue_next or isinstance(result, Exception) or not result: self.stop_progress() self.subprocess_abort = False self.thread_abort = False self.recent.clear() self.lastmsg.clear() wx.CallAfter(consumer, result, *args, **kwargs) def generate_A2B0(self, profile, clutres=None, logfile=None): # Lab cLUT is currently not implemented and should NOT be used! if profile.connectionColorSpace != "XYZ": raise Error(lang.getstr("profile.unsupported", (profile.connectionColorSpace, profile.connectionColorSpace))) if logfile: safe_print("-" * 80) logfile.write("Creating perceptual A2B0 table\n") logfile.write("\n") # Make new A2B0 A2B0 = ICCP.LUT16Type() # Matrix (identity) A2B0.matrix = [[1, 0, 0], [0, 1, 0], [0, 0, 1]] # Input / output curves (linear) A2B0.input = [] A2B0.output = [] channel = [] for j in xrange(256): channel.append(j * 257) for table in (A2B0.input, A2B0.output): for i in xrange(3): table.append(channel) # cLUT if logfile: logfile.write("Generating A2B0 table lookup input values...\n") A2B0.clut = [] if not clutres: clutres = len(profile.tags.A2B0.clut[0]) if logfile: logfile.write("cLUT grid res: %i\n" % clutres) vrange = xrange(clutres) step = 1.0 / (clutres - 1.0) idata = [] for R in vrange: for G in vrange: for B in vrange: idata.append([v * step for v in (R, G, B)]) if logfile: logfile.write("Looking up input values through A2B0 table...\n") odata = self.xicclu(profile, idata, pcs="x", logfile=logfile) numrows = len(odata) if numrows != clutres ** 3: raise ValueError("Number of cLUT entries (%s) exceeds cLUT res " "maximum (%s^3 = %s)" % (numrows, clutres, clutres ** 3)) XYZbp = list(odata[0]) XYZwp = list(odata[-1]) if logfile: logfile.write("Filling cLUT...\n") for i, (X, Y, Z) in enumerate(odata): if i % clutres == 0: if self.thread_abort: raise Info(lang.getstr("aborted")) A2B0.clut.append([]) if logfile: logfile.write("\r%i%%" % round(i / (numrows - 1.0) * 100)) # Apply black point compensation XYZ = colormath.apply_bpc(X, Y, Z, XYZbp, (0, 0, 0), XYZwp) XYZ = [v / XYZwp[1] for v in XYZ] A2B0.clut[-1].append([max(v * 32768, 0) for v in XYZ]) if logfile: logfile.write("\n") profile.tags.A2B0 = A2B0 return True def generate_B2A_from_inverse_table(self, profile, clutres=None, source="A2B", tableno=None, bpc=False, logfile=None, filename=None): """ Generate a profile's B2A table by inverting the A2B table (default A2B1 or A2B0) It is also poosible to re-generate a B2A table by interpolating the B2A table itself. """ if tableno is None: if "A2B1" in profile.tags: tableno = 1 else: tableno = 0 if not clutres: if "B2A%i" % tableno in profile.tags: tablename = "B2A%i" % tableno else: tablename = "A2B%i" % tableno clutres = len(profile.tags[tablename].clut[0]) if source == "B2A" and clutres > 23: # B2A interpolation is smoothest when used with a lower cLUT res clutres = 23 if logfile: if source == "A2B": msg = ("Generating B2A%i table by inverting A2B%i table\n" % (tableno, tableno)) else: msg = "Re-generating B2A%i table by interpolation\n" % tableno logfile.write(msg) logfile.write("\n") # Note that intent 0 will be colorimetric if no other tables are # present intent = {0: "p", 1: "r", 2: "s"}[tableno] # Lookup RGB -> XYZ for primaries, black- and white point idata = [[0, 0, 0], [1, 1, 1], [1, 0, 0], [0, 1, 0], [0, 0, 1]] direction = {"A2B": "f", "B2A": "ib"}[source] odata = self.xicclu(profile, idata, intent, direction, pcs="x") # Scale to Y = 1 XYZwp_abs = odata[1] XYZwpY = odata[1][1] odata = [[n / XYZwpY for n in v] for v in odata] XYZbp = odata[0] XYZwp = odata[1] XYZr = odata[2] XYZg = odata[3] XYZb = odata[4] # Sanity check whitepoint if (round(XYZwp[0], 3) != .964 or round(XYZwp[1], 3) != 1 or round(XYZwp[2], 3) != .825): raise Error("Argyll CMS xicclu: Invalid white XYZ: " "%.4f %.4f %.4f" % tuple(XYZwp_abs)) # Get the primaries XYZrgb = [XYZr, XYZg, XYZb] # Sanity check primaries: # Red Y, Z shall not be higher than X # Green X, Z shall not be higher than Y # Blue X, Y shall not be higher than Z for i, XYZ in enumerate(XYZrgb): for j, v in enumerate(XYZ): if v > XYZ[i]: raise Error("Argyll CMS xicclu: Invalid primary %s XYZ: " "%.4f %.4f %.4f" % (("RGB"[i], ) + tuple(XYZ))) if logfile: logfile.write("Black XYZ: %.4f %.4f %.4f\n" % tuple(XYZbp)) logfile.write("White XYZ: %.4f %.4f %.4f\n" % tuple(XYZwp)) for i in xrange(3): logfile.write("%s XYZ: %.4f %.4f %.4f\n" % (("RGB"[i], ) + tuple(XYZrgb[i]))) # Prepare input PCS values if logfile: logfile.write("Generating input curve PCS values...\n") idata = [] numentries = 4096 maxval = numentries - 1.0 vrange = xrange(numentries) Lbp, abp, bbp = colormath.XYZ2Lab(*[v * 100 for v in XYZbp]) # Method to determine device <-> PCS neutral axis relationship # 0: L* (a*=b*=0) -> RGB # 1: As method 0, but blend a* b* to blackpoint hue # 2: R=G=B -> PCS # 3: As method 0, but blend a* b* to blackpoint hue in XYZ (BPC) # Method 0 and 1 result in lowest invprofcheck dE2k, with method 1 # having a slight edge due to more accurately encoding the blackpoint method = 1 if method != 2: for i in vrange: L, a, b = i / maxval * 100, 0, 0 if method in (1, 3) and not bpc and XYZbp != [0, 0, 0]: # Blend to blackpoint hue if method == 1: vv = (L - Lbp) / (100.0 - Lbp) # 0 at bp, 1 at wp vv = 1.0 - vv if vv < 0.0: vv = 0.0 elif vv > 1.0: vv = 1.0 vv = math.pow(vv, 40.0) a += vv * abp b += vv * bbp else: X, Y, Z = colormath.Lab2XYZ(L, a, b) XYZ = colormath.apply_bpc(X, Y, Z, (0, 0, 0), XYZbp) a, b = colormath.XYZ2Lab(*[v * 100 for v in XYZ])[1:] idata.append((L, a, b)) pcs = profile.connectionColorSpace[0].lower() if source == "B2A": # NOTE: # Argyll's B2A tables are slightly inaccurate: # 0 0 0 PCS -> RGB may give RGB levels > 0 (it should clip # instead). Inversely, 0 0 0 RGB -> PCS (through inverted B2A) # will return PCS values that are too low or zero (ie. not the # black point as expected) # TODO: How to deal with this? pass if method == 2: # lookup RGB -> XYZ values through profile using xicclu to get TRC odata = [] if not bpc: numentries -= 1 maxval -= 1 for i in xrange(numentries): odata.append([i / maxval] * 3) idata = self.xicclu(profile, odata, intent, {"A2B": "f", "B2A": "ib"}[source], pcs="x") if not bpc: numentries += 1 maxval += 1 idata.insert(0, [0, 0, 0]) odata.insert(0, [0, 0, 0]) wY = idata[-1][1] oXYZ = idata = [[n / wY for n in v] for v in idata] D50 = colormath.get_whitepoint("D50") fpL = [cm.XYZ2Lab(*v + [D50])[0] for v in oXYZ] else: oXYZ = [colormath.Lab2XYZ(*v) for v in idata] fpL = [v[0] for v in idata] fpX = [v[0] for v in oXYZ] fpY = [v[1] for v in oXYZ] fpZ = [v[2] for v in oXYZ] if method != 2 and bpc and XYZbp != [0, 0, 0]: if logfile: logfile.write("Applying BPC to input curve PCS values...\n") for i, (L, a, b) in enumerate(idata): X, Y, Z = colormath.Lab2XYZ(L, a, b) X, Y, Z = colormath.apply_bpc(X, Y, Z, (0, 0, 0), XYZbp, XYZwp) idata[i] = colormath.XYZ2Lab(X * 100, Y * 100, Z * 100) if logfile: logfile.write("Looking up input curve RGB values...\n") direction = {"A2B": "if", "B2A": "b"}[source] if method != 2: # Lookup Lab -> RGB values through profile using xicclu to get TRC odata = self.xicclu(profile, idata, intent, direction, pcs="l") # Sanity check white if (round(odata[-1][0], 3) != 1 or round(odata[-1][1], 3) != 1 or round(odata[-1][2], 3) != 1): raise Error("Argyll CMS xicclu: Invalid white RGB: " "%.4f %.4f %.4f" % tuple(odata[-1])) xpR = [v[0] for v in odata] xpG = [v[1] for v in odata] xpB = [v[2] for v in odata] # Initialize B2A itable = ICCP.LUT16Type() use_cam_clipping = True # Setup matrix if profile.connectionColorSpace == "XYZ": # Use a matrix that scales the profile colorspace into the XYZ # encoding range, to make optimal use of the cLUT grid points xyYrgb = [colormath.XYZ2xyY(*XYZ) for XYZ in XYZrgb] area1 = 0.5 * abs(sum(x0 * y1 - x1 * y0 for ((x0, y0, Y0), (x1, y1, Y1)) in zip(xyYrgb, xyYrgb[1:] + [xyYrgb[0]]))) if logfile: logfile.write("Setting up matrix\n") matrices = [] # RGB spaces used as PCS candidates. # Six synthetic RGB spaces that are large enough to encompass # display gamuts (except the LaserVue one) found on # http://www.tftcentral.co.uk/articles/pointers_gamut.htm # aswell as a selection of around two dozen profiles from openSUSE # ICC Profile Taxi database aswell as other user contributions rgb_spaces = [] # A colorspace that encompasses Rec709. Uses Rec. 2020 blue. rgb_spaces.append([2.2, "D50", [0.68280181011, 0.315096403371, 0.224182128906], [0.310096375087, 0.631250246526, 0.73258972168], [0.129244796433, 0.0471357502953, 0.0432281494141], "Rec709-encompassing, variant 1"]) # A colorspace that encompasses Rec709. Uses slightly different # primaries (based on WLED and B+RG LED) than variant 1. rgb_spaces.append([2.2, "D50", [0.664580313612, 0.329336320112, 0.228820800781], [0.318985161632, 0.644740328564, 0.742568969727], [0.143284983488, 0.0303535582465, 0.0286102294922], "Rec709-encompassing, variant 2"]) # A colorspace that encompasses Rec709 with imaginary red and blue rgb_spaces.append([2.2, "D50", [0.672053135694, 0.331936091367, 0.250122070312], [0.319028093312, 0.644705491217, 0.710144042969], [0.113899645442, 0.0424325604954, 0.0396270751953], "Rec709-encompassing, variant 3"]) # A colorspace with Plasma-like primaries. Uses Rec. 2020 blue. rgb_spaces.append([2.2, "D50", [0.692947816539, 0.30857396028, 0.244430541992], [0.284461719244, 0.70017174365, 0.709167480469], [0.129234824405, 0.0471509419335, 0.0464019775391], "SMPTE-431-2/DCI-P3-encompassing, variant 1"]) # A colorspace that encompasses both AdobeRGB and NTSC1953. Uses # Rec. 2020 blue. rgb_spaces.append([2.2, "D50", [0.680082575358, 0.319746686121, 0.314331054688], [0.200003470174, 0.730003123156, 0.641983032227], [0.129238369699, 0.0471305063812, 0.0436706542969], "AdobeRGB-NTSC1953-hybrid, variant 1"]) # A colorspace with Plasma-like primaries. Uses Rec. 2020 blue. # More saturated green primary than variant 1. rgb_spaces.append([2.2, "D50", [0.692943297796, 0.308579731457, 0.268966674805], [0.249088838269, 0.730263586072, 0.684844970703], [0.129230721306, 0.047147329564, 0.0461883544922], "SMPTE-431-2/DCI-P3-encompassing, variant 2"]) # A colorspace that encompasses both AdobeRGB and NTSC1953. # Different, more saturated primaries than variant 1. rgb_spaces.append([2.2, "D50", [0.700603882817, 0.299296301842, 0.274520874023], [0.200006562972, 0.75, 0.697494506836], [0.143956453416, 0.0296952711131, 0.0279693603516], "AdobeRGB-NTSC1953-hybrid, variant 2"]) # A colorspace that encompasses DCI P3 with imaginary red and blue rgb_spaces.append([2.2, "D50", [0.699964323939, 0.312334528794, 0.253814697266], [0.284337791321, 0.68212854805, 0.73779296875], [0.098165262763, 0.00937830372063, 0.00839233398438], "SMPTE-431-2/DCI-P3-encompassing, variant 3"]) # Rec. 2020 rgb_spaces.append([2.2, "D50", [0.7084978651, 0.293540723619, 0.279037475586], [0.190200063067, 0.775375775201, 0.675354003906], [0.129244405192, 0.0471399056886, 0.0456085205078], "Rec2020"]) # A colorspace that encompasses Rec2020 with imaginary primaries rgb_spaces.append([2.2, "D50", [0.71715243505, 0.296225595183, 0.291244506836], [0.191129060214, 0.795212673762, 0.700057983398], [0.0981403936826, 0.00939694681658, 0.00869750976562], "Rec2020-encompassing"]) # Find smallest candidate that encompasses space defined by actual # primaries if logfile: logfile.write("Checking for suitable PCS candidate...\n") pcs_candidate = None for rgb_space in rgb_spaces: extremes = [] for i in xrange(3): RGB = colormath.XYZ2RGB(XYZrgb[i][0], XYZrgb[i][1], XYZrgb[i][2], rgb_space=rgb_space, clamp=False) maxima = max(RGB) minima = min(RGB) if minima < 0: maxima += abs(minima) extremes.append(maxima) # Check area % (in xy for simplicity's sake) xyYrgb = rgb_space[2:5] area2 = 0.5 * abs(sum(x0 * y1 - x1 * y0 for ((x0, y0, Y0), (x1, y1, Y1)) in zip(xyYrgb, xyYrgb[1:] + [xyYrgb[0]]))) if logfile: logfile.write("%s fit: %.2f (area: %.2f%%)\n" % (rgb_space[-1], 1.0 / max(extremes), area1 / area2 * 100)) # Check if tested RGB space contains actual primaries if max(extremes) <= 1.0: if logfile: logfile.write("Using primaries: %s\n" % rgb_space[-1]) XYZrgb[0] = colormath.RGB2XYZ(1, 0, 0, rgb_space=rgb_space) XYZrgb[1] = colormath.RGB2XYZ(0, 1, 0, rgb_space=rgb_space) XYZrgb[2] = colormath.RGB2XYZ(0, 0, 1, rgb_space=rgb_space) pcs_candidate = rgb_space[-1] break if not pcs_candidate and False: # NEVER? # Create quick medium quality shaper+matrix profile and use the # matrix from that if logfile: logfile.write("No suitable PCS candidate. " "Computing best fit matrix...\n") # Lookup small testchart so profile computation finishes quickly ti1name = "ti1/d3-e4-s17-g49-m5-b5-f0.ti1" ti1 = get_data_path(ti1name) if not ti1: raise Error(lang.getstr("file.missing", ti1name)) ti1, ti3, gray = self.ti1_lookup_to_ti3(ti1, profile, intent="a", white_patches=1) dirname, basename = os.path.split(profile.fileName) basepath = os.path.join(dirname, "." + os.path.splitext(basename)[0] + "-MTX.tmp") ti3.write(basepath + ".ti3") # Calculate profile cmd, args = get_argyll_util("colprof"), ["-v", "-qm", "-as", basepath] result = self.exec_cmd(cmd, args, capture_output=True, sessionlogfile=getattr(self, "sessionlogfile", None)) if isinstance(result, Exception): raise result if result: mtx = ICCP.ICCProfile(basepath + profile_ext) XYZrgb = [] for column in "rgb": tag = mtx.tags.get(column + "XYZ") if isinstance(tag, ICCP.XYZType): XYZrgb.append(tag.values()) #os.remove(basepath + ".ti3") #os.remove(basepath + profile_ext) if not XYZrgb: raise Error(lang.getstr("profile.required_tags_missing", "rXYZ/gXYZ/bXYZ")) pcs_candidate = "BestFit" else: # If clutres is -1 (auto), set it depending on area coverage if clutres == -1: if area1 / area2 <= .51: clutres = 65 elif area1 / area2 <= .73: clutres = 45 if not pcs_candidate: # Use largest if logfile: logfile.write("Using primaries: %s\n" % rgb_spaces[-1][-1]) XYZrgb[0] = colormath.RGB2XYZ(1, 0, 0, rgb_space=rgb_spaces[-1]) XYZrgb[1] = colormath.RGB2XYZ(0, 1, 0, rgb_space=rgb_spaces[-1]) XYZrgb[2] = colormath.RGB2XYZ(0, 0, 1, rgb_space=rgb_spaces[-1]) pcs_candidate = rgb_spaces[-1][-1] for i in xrange(3): logfile.write("Using %s XYZ: %.4f %.4f %.4f\n" % (("RGB"[i], ) + tuple(XYZrgb[i]))) # Construct the final matrix Xr, Yr, Zr = XYZrgb[0] Xg, Yg, Zg = XYZrgb[1] Xb, Yb, Zb = XYZrgb[2] if logfile: logfile.write("R+G+B XYZ: %.4f %.4f %.4f\n" % (Xr + Xg + Xb, Yr + Yg + Yb, Zr + Zg + Zb)) m1 = colormath.Matrix3x3(((Xr, Xg, Xb), (Yr, Yg, Yb), (Zr, Zg, Zb))).inverted() matrices.append(m1) Sr, Sg, Sb = m1 * XYZwp if logfile: logfile.write("Correction factors: %.4f %.4f %.4f\n" % (Sr, Sg, Sb)) m2 = colormath.Matrix3x3(((Sr * Xr, Sg * Xg, Sb * Xb), (Sr * Yr, Sg * Yg, Sb * Yb), (Sr * Zr, Sg * Zg, Sb * Zb))).inverted() matrices.append(m2) scale = 1 + (32767 / 32768.0) m3 = colormath.Matrix3x3(((scale, 0, 0), (0, scale, 0), (0, 0, scale))) matrices.append(m3) for m, matrix in enumerate(matrices): if logfile: logfile.write("Matrix %i:\n" % (m + 1)) for row in matrix: logfile.write("%r\n" % row) itable.matrix = m2 * m3 if logfile: logfile.write("Final matrix:\n") for row in itable.matrix: logfile.write("%r\n" % row) else: # Use identity matrix for Lab as mandated by ICC spec itable.matrix = [[1, 0, 0], [0, 1, 0], [0, 0, 1]] if profile.connectionColorSpace == "XYZ": if logfile: logfile.write("Applying matrix to input curve XYZ values...\n") # Apply matrix rX = [] rY = [] rZ = [] for i in vrange: X, Y, Z = fpX[i], fpY[i], fpZ[i] X, Y, Z = m2 * (X, Y, Z) rX.append(X) rY.append(Y) rZ.append(Z) interp = (colormath.Interp(xpR, rX), colormath.Interp(xpG, rY), colormath.Interp(xpB, rZ)) rinterp = (colormath.Interp(rX, xpR), colormath.Interp(rY, xpG), colormath.Interp(rZ, xpB)) else: Lscale = 65280.0 / 65535.0 oldmin = (xpR[0] + xpG[0] + xpB[0]) / 3.0 oldmax = (xpR[-1] + xpG[-1] + xpB[-1]) / 3.0 oldrange = oldmax - oldmin newmin = 0.0 newmax = 100 newrange = newmax - newmin xpL = [] for i in vrange: v = (xpR[i] + xpG[i] + xpB[i]) / 3.0 v = max((((v - oldmin) * newrange) / oldrange) + newmin, 0) xpL.append(v) Linterp = colormath.Interp(xpL, fpL) rLinterp = colormath.Interp(fpL, xpL) # Set input curves # Apply inverse TRC to input values to distribute them # optimally across cLUT grid points if logfile: logfile.write("Generating input curves...\n") itable.input = [[], [], []] for j in vrange: if self.thread_abort: raise Info(lang.getstr("aborted")) if profile.connectionColorSpace == "XYZ": v = [rinterp[i](j / maxval) for i in xrange(3)] else: # CIELab PCS encoding v = [rLinterp(j / (maxval * Lscale) * 100) / 100.0] v.extend([j / maxval] * 2) for i in xrange(len(itable.input)): itable.input[i].append(min(v[i] * 65535, 65535)) if logfile and j % math.floor(maxval / 100.0) == 0: logfile.write("\r%i%%" % round(j / maxval * 100)) if logfile: logfile.write("\n") if False and method and not bpc: # Force the blackpoint - NEVER if logfile: logfile.write("Forcing B2A input curve blackpoint...\n") XYZbp_m = m2 * XYZbp for i in xrange(3): black_index = int(math.ceil(maxval * XYZbp_m[i])) if logfile: logfile.write("Channel #%i\n" % i) for j in xrange(black_index + 1): v = 0 if logfile: logfile.write("#%i %i -> %i\n" % (j, itable.input[i][j], v)) itable.input[i][j] = v if clutres == -1: # Auto clutres = 33 step = 1.0 / (clutres - 1.0) do_lookup = True if do_lookup: # Generate inverse table lookup input values if logfile: logfile.write("Generating %s%i table lookup input values...\n" % (source, tableno)) logfile.write("cLUT grid res: %i\n" % clutres) logfile.write("Looking up input values through %s%i table...\n" % (source, tableno)) idata = [] odata = [] abmaxval = 255 + (255 / 256.0) xicclu1 = Xicclu(profile, intent, direction, "n", pcs, 100) if logfile: logfile.write("%s CAM Jab for clipping\n" % (use_cam_clipping and "Using" or "Not using")) if use_cam_clipping: # Use CAM Jab for clipping for cLUT grid points after a given # threshold xicclu2 = Xicclu(profile, intent, direction, "n", pcs, 100, use_cam_clipping=True) threshold = int((clutres - 1) * 0.75) threshold2 = int((clutres - 1) / 3) for a in xrange(clutres): if self.thread_abort: if use_cam_clipping: xicclu2.exit() xicclu1.exit() raise Info(lang.getstr("aborted")) for b in xrange(clutres): for c in xrange(clutres): d, e, f = [v * step for v in (a, b, c)] if profile.connectionColorSpace == "XYZ": # Apply TRC to XYZ values to distribute them optimally # across cLUT grid points. XYZ = [interp[i](v) for i, v in enumerate((d, e, f))] ##print "%3.6f %3.6f %3.6f" % tuple(XYZ), '->', # Scale into device colorspace v = m2.inverted() * XYZ if bpc and XYZbp != [0, 0, 0]: v = colormath.apply_bpc(v[0], v[1], v[2], (0, 0, 0), XYZbp, XYZwp) ##print "%3.6f %3.6f %3.6f" % tuple(v) ##raw_input() if intent == "a": v = colormath.adapt(*v + [XYZwp, profile.tags.wtpt.ir.values()]) else: # Legacy CIELAB L = Linterp(d * 100) v = L, -128 + e * abmaxval, -128 + f * abmaxval idata.append("%.6f %.6f %.6f" % tuple(v)) # Lookup CIE -> device values through profile using xicclu if not use_cam_clipping or (a <= threshold and b <= threshold and c <= threshold): xicclu1(v) if use_cam_clipping and (a > threshold2 or b > threshold2 or c > threshold2): xicclu2(v) if logfile: logfile.write("\r%i%%" % round(len(idata) / clutres ** 3.0 * 100)) if use_cam_clipping: xicclu2.exit() xicclu1.exit() if logfile: logfile.write("\n") if logfile and (pcs == "x" or clutres // 2 != clutres / 2.0): if pcs == "x": iXYZbp = idata[0] iXYZwp = idata[-1] logfile.write("Input black XYZ: %s\n" % iXYZbp) logfile.write("Input white XYZ: %s\n" % iXYZwp) else: iLabbp = idata[clutres * (clutres // 2) + clutres // 2] iLabwp = idata[(clutres ** 2 * (clutres - 1) + clutres * (clutres // 2) + clutres // 2)] logfile.write("Input black L*a*b*: %s\n" % iLabbp) logfile.write("Input white L*a*b*: %s\n" % iLabwp) odata1 = xicclu1.get() if use_cam_clipping: # Linearly interpolate the crossover to CAM Jab clipping region cam_diag = False odata2 = xicclu2.get() j, k = 0, 0 r = float(threshold - threshold2) for a in xrange(clutres): for b in xrange(clutres): for c in xrange(clutres): if a <= threshold and b <= threshold and c <= threshold: v = odata1[j] j += 1 if a > threshold2 or b > threshold2 or c > threshold2: d = max(a, b, c) if cam_diag: v = [100.0, 100.0, 0.0] v2 = [0.0, 100.0, 100.0] else: v2 = odata2[k] k += 1 for i, n in enumerate(v): v[i] *= (threshold - d) / r v2[i] *= 1 - (threshold - d) / r v[i] += v2[i] else: if cam_diag: v = [100.0, 0.0, 100.0] else: v = odata2[k] k += 1 odata.append(v) else: odata = odata1 numrows = len(odata) if numrows != clutres ** 3: raise ValueError("Number of cLUT entries (%s) exceeds cLUT res " "maximum (%s^3 = %s)" % (numrows, clutres, clutres ** 3)) if logfile and (pcs == "x" or clutres // 2 != clutres / 2.0): if pcs == "x": oRGBbp = odata[0] oRGBwp = odata[-1] else: oRGBbp = odata[clutres * (clutres // 2) + clutres // 2] oRGBwp = odata[(clutres ** 2 * (clutres - 1) + clutres * (clutres // 2) + clutres // 2)] logfile.write("Output black RGB: %.4f %.4f %.4f\n" % tuple(oRGBbp)) logfile.write("Output white RGB: %.4f %.4f %.4f\n" % tuple(oRGBwp)) odata = [[n / 100.0 for n in v] for v in odata] # Fill cCLUT itable.clut = [] if logfile: logfile.write("Filling cLUT...\n") if not do_lookup: # Linearly scale RGB for R in xrange(clutres): if self.thread_abort: raise Info(lang.getstr("aborted")) for G in xrange(clutres): itable.clut.append([]) for B in xrange(clutres): itable.clut[-1].append([v * step * 65535 for v in (R, G, B)]) if logfile: logfile.write("\r%i%%" % round((R * G * B) / ((clutres - 1.0) ** 3) * 100)) else: for i, RGB in enumerate(odata): if i % clutres == 0: if self.thread_abort: raise Info(lang.getstr("aborted")) itable.clut.append([]) if logfile: logfile.write("\r%i%%" % round(i / (numrows - 1.0) * 100)) # Set RGB black and white explicitly if pcs == "x": if i == 0: RGB = 0, 0, 0 elif i == numrows - 1.0: RGB = 1, 1, 1 elif clutres // 2 != clutres / 2.0: # For CIELab cLUT, white- and black point will only # fall on a cLUT point if uneven cLUT res if i == clutres * (clutres // 2) + clutres // 2: ##if raw_input("%i %r" % (i, RGB)): RGB = 0, 0, 0 elif i == (clutres ** 2 * (clutres - 1) + clutres * (clutres // 2) + clutres // 2): ##if raw_input("%i %r" % (i, RGB)): RGB = 1, 1, 1 itable.clut[-1].append([v * 65535 for v in RGB]) if logfile: logfile.write("\n") if getcfg("profile.b2a.hires.diagpng") and filename: # Generate diagnostic images fname, ext = os.path.splitext(filename) for suffix, table in [("pre", profile.tags["B2A%i" % tableno]), ("post", itable)]: table.clut_writepng(fname + ".B2A%i.%s.CLUT.png" % (tableno, suffix)) # Update profile profile.tags["B2A%i" % tableno] = itable if getcfg("profile.b2a.hires.smooth"): self.smooth_B2A(profile, tableno, getcfg("profile.b2a.hires.diagpng"), filename, logfile) # Set output curves itable.output = [[], [], []] numentries = 256 maxval = numentries - 1.0 for i in xrange(len(itable.output)): for j in xrange(numentries): itable.output[i].append(j / maxval * 65535) return True def smooth_B2A(self, profile, tableno, diagpng=2, filename=None, logfile=None): """ Apply extra smoothing to the cLUT """ if not filename: filename = profile.fileName itable = profile.tags.get("B2A%i" % tableno) if not itable: return False clutres = len(itable.clut[0]) if diagpng and filename: # Generate diagnostic images fname, ext = os.path.splitext(filename) if diagpng == 2: itable.clut_writepng(fname + ".B2A%i.pre-smoothing.CLUT.png" % tableno) if logfile: logfile.write("Smoothing B2A%i...\n" % tableno) # Create a list of number of 2D grids, each one with a # size of (width x height) x grids = [] for i, block in enumerate(itable.clut): if i % clutres == 0: grids.append([]) grids[-1].append([]) for RGB in block: grids[-1][-1].append(RGB) for i, grid in enumerate(grids): for y in xrange(clutres): for x in xrange(clutres): is_dark = sum(grid[y][x]) < 65535 * .03125 * 3 if profile.connectionColorSpace == "XYZ": is_gray = x == y == i elif clutres // 2 != clutres / 2.0: # For CIELab cLUT, gray will only # fall on a cLUT point if uneven cLUT res is_gray = x == y == clutres // 2 else: is_gray = False ##print i, y, x, "%i %i %i" % tuple(v / 655.35 * 2.55 for v in grid[y][x]), is_dark, raw_input(is_gray) if is_gray else '' if is_dark or is_gray: # Don't smooth dark colors and gray axis continue RGB = [[v] for v in grid[y][x]] # Box filter, 3x3 # Center pixel weight = 1.0, surround = 0.5 for j in (0, 1): for n in (-1, 1): yi, xi = (y, y + n)[j], (x + n, x)[j] if (xi > -1 and yi > -1 and xi < clutres and yi < clutres): RGBn = grid[yi][xi] for k in xrange(3): RGB[k].append(RGBn[k] * 0.5 + RGB[k][0] * 0.5) yi, xi = y - n, (x + n, x - n)[j] if (xi > -1 and yi > -1 and xi < clutres and yi < clutres): RGBn = grid[yi][xi] for k in xrange(3): RGB[k].append(RGBn[k] * 0.5 + RGB[k][0] * 0.5) grid[y][x] = [sum(v) / float(len(v)) for v in RGB] for j, row in enumerate(grid): itable.clut[i * clutres + j] = [[v for v in RGB] for RGB in row] if diagpng and filename: itable.clut_writepng(fname + ".B2A%i.post.CLUT.extrasmooth.png" % tableno) return True def get_device_id(self, quirk=True, use_serial_32=True, truncate_edid_strings=False): """ Get org.freedesktop.ColorManager device key """ if config.is_virtual_display(): return None display_no = max(0, min(len(self.displays) - 1, getcfg("display.number") - 1)) edid = self.display_edid[display_no] if not edid and xrandr: # XrandR fallback if not (quirk and use_serial_32 and not truncate_edid_strings): return try: display_name = xrandr.get_display_name(display_no) except: pass else: if display_name: edid = {"monitor_name": display_name} return colord.device_id_from_edid(edid, quirk=quirk, use_serial_32=use_serial_32, truncate_edid_strings=truncate_edid_strings) def get_display(self): """ Get the currently configured display number. Returned is the Argyll CMS dispcal/dispread -d argument """ display_name = config.get_display_name(None, True) if display_name == "Web @ localhost": return "web:%i" % getcfg("webserver.portnumber") if display_name == "madVR": return "madvr" if display_name == "Untethered": return "0" if (display_name == "Resolve" or (display_name == "Prisma" and not defaults["patterngenerator.prisma.argyll"])): return "1" if display_name == "Prisma": host = getcfg("patterngenerator.prisma.host") try: host = socket.gethostbyname(host) except socket.error: pass return "prisma:%s" % host if display_name.startswith("Chromecast "): return "cc:%s" % display_name.split(":")[0].split(None, 1)[1].strip() if display_name.startswith("Prisma "): return "prisma:%s" % display_name.split("@")[-1].strip() display_no = min(len(self.displays), getcfg("display.number")) - 1 display = str(display_no + 1) if (self.has_separate_lut_access() or getcfg("use_separate_lut_access")) and ( not getcfg("display_lut.link") or (display_no > -1 and not self.lut_access[display_no])): display_lut_no = min(len(self.displays), getcfg("display_lut.number")) - 1 if display_lut_no > -1 and not self.lut_access[display_lut_no]: for display_lut_no, disp in enumerate(self.lut_access): if disp: break display += "," + str(display_lut_no + 1) return display def get_display_edid(self): """ Return EDID of currently configured display """ n = getcfg("display.number") - 1 if n >= 0 and n < len(self.display_edid): return self.display_edid[n] return {} def get_display_name(self, prepend_manufacturer=False, prefer_edid=False, remove_manufacturer=True): """ Return name of currently configured display """ n = getcfg("display.number") - 1 if n >= 0 and n < len(self.display_names): display = [] manufacturer = None display_name = None if prefer_edid: edid = self.get_display_edid() manufacturer = edid.get("manufacturer") display_name = edid.get("monitor_name", edid.get("ascii", str(edid.get("product_id") or ""))) if not manufacturer: manufacturer = self.display_manufacturers[n] if not display_name: display_name = self.display_names[n] if manufacturer: manufacturer = colord.quirk_manufacturer(manufacturer) if prepend_manufacturer: if manufacturer.lower() not in display_name.lower(): display.append(manufacturer) elif remove_manufacturer: start = display_name.lower().find(manufacturer.lower()) if start > -1: display_name = (display_name[:start] + display_name[start + len(manufacturer):]).lstrip() display_name = re.sub("^[^([{\w]+", "", display_name) display.append(display_name) return " ".join(display) return "" def get_display_name_short(self, prepend_manufacturer=False, prefer_edid=False): """ Return shortened name of configured display (if possible) If name can't be shortened (e.g. because it's already 10 characters or less), return full string """ display_name = self.get_display_name(prepend_manufacturer, prefer_edid) if len(display_name) > 10: maxweight = 0 for part in re.findall('[^\s_]+(?:\s*\d+)?', re.sub("\([^)]+\)", "", display_name)): digits = re.search("\d+", part) if digits: # Weigh parts with digits higher than those without chars = re.sub("\d+", "", part) weight = len(chars) + len(digits.group()) * 5 else: # Weigh parts with uppercase letters higher than those without chars = "" for char in part: if char.lower() != char: chars += char weight = len(chars) if chars and weight >= maxweight: # Weigh parts further to the right higher display_name = re.sub("^[^([{\w]+", "", part) maxweight = weight return display_name def get_dispwin_display_profile_argument(self, display_no=0): """ Return argument corresponding to the display profile for use with dispwin. Will either return '-L' (use current profile) or a filename """ arg = "-L" try: return ICCP.get_display_profile(display_no, path_only=True) or arg except Exception, exception: safe_print(exception) return arg def update_display_name_manufacturer(self, ti3, display_name=None, display_manufacturer=None, write=True): """ Update display name and manufacturer in colprof arguments embedded in 'ARGYLL_COLPROF_ARGS' section in a TI3 file. """ options_colprof = [] if not display_name and not display_manufacturer: # Note: Do not mix'n'match display name and manufacturer from # different sources try: ti3_options_colprof = get_options_from_ti3(ti3)[1] except (IOError, CGATS.CGATSInvalidError, CGATS.CGATSInvalidOperationError, CGATS.CGATSKeyError, CGATS.CGATSTypeError, CGATS.CGATSValueError), exception: safe_print(exception) ti3_options_colprof = [] for option in ti3_options_colprof: if option[0] == "M": display_name = option.split(None, 1)[-1][1:-1] elif option[0] == "A": display_manufacturer = option.split(None, 1)[-1][1:-1] if not display_name and not display_manufacturer: # Note: Do not mix'n'match display name and manufacturer from # different sources edid = self.display_edid[max(0, min(len(self.displays), getcfg("display.number") - 1))] display_name = edid.get("monitor_name", edid.get("ascii", str(edid.get("product_id") or ""))) display_manufacturer = edid.get("manufacturer") if not display_name and not display_manufacturer: # Note: Do not mix'n'match display name and manufacturer from # different sources display_name = self.get_display_name() if display_name: options_colprof.append("-M") options_colprof.append(display_name) if display_manufacturer: options_colprof.append("-A") options_colprof.append(display_manufacturer) if write: # Add dispcal and colprof arguments to ti3 if is_ccxx_testchart(): options_dispcal = [] else: options_dispcal = self.options_dispcal ti3 = add_options_to_ti3(ti3, options_dispcal, options_colprof) if ti3: ti3.write() return options_colprof def get_instrument_features(self, instrument_name=None): """ Return features of currently configured instrument """ features = all_instruments.get(instrument_name or self.get_instrument_name(), {}) if test_require_sensor_cal: features["sensor_cal"] = True features["skip_sensor_cal"] = False return features def get_instrument_measurement_modes(self, instrument_id=None, skip_ccxx_modes=True): """ Enumerate measurement modes supported by the instrument """ if not instrument_id: features = self.get_instrument_features() instrument_id = features.get("id", self.get_instrument_name()) if instrument_id: measurement_modes = self.measurement_modes.get(instrument_id, OrderedDict()) if not measurement_modes: result = self.exec_cmd(get_argyll_util("spotread"), ["-?"], capture_output=True, skip_scripts=True, silent=True, log_output=False) if isinstance(result, Exception): safe_print(result) if test: self.output.extend("""Measure spot values, Version 1.7.0_beta Author: Graeme W. Gill, licensed under the GPL Version 2 or later Diagnostic: Usage requested usage: spotread [-options] [logfile] -v Verbose mode -s Print spectrum for each reading -S Plot spectrum for each reading -c listno Set communication port from the following list (default 1) 1 = 'COM13 (Klein K-10)' 2 = 'COM1' 3 = 'COM3' 4 = 'COM4' -t Use transmission measurement mode -e Use emissive measurement mode (absolute results) -eb Use display white brightness relative measurement mode -ew Use display white point relative chromatically adjusted mode -p Use telephoto measurement mode (absolute results) -pb Use projector white brightness relative measurement mode -pw Use projector white point relative chromatically adjusted mode -a Use ambient measurement mode (absolute results) -f Use ambient flash measurement mode (absolute results) -y F K-10: Factory Default [Default,CB1] c K-10: Default CRT File P K-10: Klein DLP Lux E K-10: Klein SMPTE C b K-10: TVL XVM245 d K-10: Klein LED Bk LCD m K-10: Klein Plasma p K-10: DLP Screen o K-10: TVL LEM150 O K-10: Sony EL OLED z K-10: Eizo CG LCD L K-10: FSI 2461W h K-10: HP DreamColor 2 1 K-10: LCD CCFL Wide Gamut IPS (LCD2690WUXi) l|c Other: l = LCD, c = CRT -I illum Set simulated instrument illumination using FWA (def -i illum): M0, M1, M2, A, C, D50, D50M2, D65, F5, F8, F10 or file.sp] -i illum Choose illuminant for computation of CIE XYZ from spectral data & FWA: A, C, D50 (def.), D50M2, D65, F5, F8, F10 or file.sp -Q observ Choose CIE Observer for spectral data or CCSS instrument: 1931_2 (def), 1964_10, S&B 1955_2, shaw, J&V 1978_2 (Choose FWA during operation) -F filter Set filter configuration (if aplicable): n None p Polarising filter 6 D65 u U.V. Cut -E extrafilterfile Apply extra filter compensation file -x Display Yxy instead of Lab -h Display LCh instead of Lab -V Show running average and std. devation from ref. -T Display correlated color temperatures and CRI -N Disable auto calibration of instrument -O Do one cal. or measure and exit -H Start in high resolution spectrum mode (if available) -X file.ccmx Apply Colorimeter Correction Matrix -Y r|n Override refresh, non-refresh display mode -Y R:rate Override measured refresh rate with rate Hz -Y A Use non-adaptive integration time mode (if available). -W n|h|x Override serial port flow control: n = none, h = HW, x = Xon/Xoff -D [level] Print debug diagnostics to stderr logfile Optional file to save reading results as text""".splitlines()) measurement_modes_follow = False if self.argyll_version >= [1, 7, 1]: technology_strings = technology_strings_171 else: technology_strings = technology_strings_170 for line in self.output: line = line.strip() if line.startswith("-y "): line = line.lstrip("-y ") measurement_modes_follow = True elif line.startswith("-"): measurement_modes_follow = False parts = [v.strip() for v in line.split(None, 1)] if measurement_modes_follow and len(parts) == 2: measurement_mode, desc = parts if (measurement_mode not in (string.digits[1:] + string.ascii_letters)): # Ran out of selectors continue measurement_mode_instrument_id, desc = desc.split(":", 1) desc = desc.strip() if measurement_mode_instrument_id == instrument_id: # Found a mode for our instrument if (re.sub(r"\s*\(.*?\)$", "", desc) in technology_strings.values() + [""] and skip_ccxx_modes): # This mode is supplied via CCMX/CCSS, skip continue desc = re.sub(r"\s*(?:File|\[[^\]]*\])", "", desc) measurement_modes[measurement_mode] = desc self.measurement_modes[instrument_id] = measurement_modes return measurement_modes return {} def get_instrument_name(self): """ Return name of currently configured instrument """ n = getcfg("comport.number") - 1 if n >= 0 and n < len(self.instruments): return self.instruments[n] return "" def has_lut_access(self): display_no = min(len(self.lut_access), getcfg("display.number")) - 1 return display_no > -1 and bool(self.lut_access[display_no]) def has_separate_lut_access(self): """ Return True if separate LUT access is possible and needed. """ # Filter out Prisma, Resolve and Untethered # IMPORTANT: Also make changes to display filtering in # worker.Worker.enumerate_displays_and_ports lut_access = self.lut_access[:-3] if self.argyll_version >= [1, 6, 0]: # Filter out madVR lut_access = lut_access[:-1] if self.argyll_version >= [1, 4, 0]: # Filter out Web @ localhost lut_access = lut_access[:-1] return (len(self.displays) > 1 and False in lut_access and True in lut_access) def import_colorimeter_corrections(self, cmd, args=None, asroot=False): """ Import colorimeter corrections. cmd can be 'i1d3ccss', 'spyd4en' or 'oeminst' """ if not args: args = [] if (is_superuser() or asroot) and not "-Sl" in args: # If we are root or need root privs anyway, install to local # system scope args.insert(0, "-Sl") return self.exec_cmd(cmd, ["-v"] + args, capture_output=True, skip_scripts=True, silent=False, asroot=asroot) def import_edr(self, args=None, asroot=False): """ Import X-Rite .edr files """ return self.import_colorimeter_corrections(get_argyll_util("i1d3ccss"), args, asroot) def import_spyd4cal(self, args=None, asroot=False): """ Import Spyder4/5 calibrations to spy4cal.bin """ return self.import_colorimeter_corrections(get_argyll_util("spyd4en"), args, asroot) def install_3dlut(self, path, filename=None): basename = os.path.basename(getcfg("3dlut.input.profile")) if getcfg("3dlut.format") == "madVR" and madvr: # Install (load) 3D LUT using madTPG # Get mapping from source profile to madVR gamut slot gamut = {"Rec709.icm": 0, "SMPTE_RP145_NTSC.icm": 1, "EBU3213_PAL.icm": 2, "Rec2020.icm": 3, "SMPTE431_P3.icm": 4}.get(basename, 0) try: # Connect & load 3D LUT if (self.madtpg_connect() and self.madtpg.load_3dlut_file(path, True, gamut)): raise Info(lang.getstr("3dlut.install.success")) else: raise Error(lang.getstr("3dlut.install.failure")) except Exception, exception: return exception finally: if hasattr(self, "madtpg"): self.madtpg.quit() if isinstance(self.madtpg, madvr.MadTPG_Net): self.madtpg.shutdown() elif config.get_display_name(None, True) == "Prisma": try: # Use Prisma HTTP REST interface to upload 3D LUT if not self.patterngenerator: self.setup_patterngenerator() self.patterngenerator.connect() # Check preset. If it has a custom LUT assigned, we delete the # currently assigned LUT before uploading, unless its filename # is the same as the LUT to be uploaded, in which case it will # be simply overwritten, and unless the custom LUT is still # assigned to another preset as well. presetname = getcfg("patterngenerator.prisma.preset") if False: # NEVER? # Check all presets for currently assigned LUT # Check the preset we're going to use for the upload last presetnames = filter(lambda name: name != presetname, config.valid_values["patterngenerator.prisma.preset"]) else: # Check only the preset we're going to use for the upload presetnames = [] presetnames.append(presetname) assigned_luts = {} for presetname in presetnames: self.log("Loading Prisma preset", presetname) preset = self.patterngenerator.load_preset(presetname) assigned_lut = preset["settings"].get("cube", "") if not assigned_lut in assigned_luts: assigned_luts[assigned_lut] = 0 assigned_luts[assigned_lut] += 1 # Only remove the currently assigned custom LUT if it's not # assigned to another preset if (assigned_lut.lower().endswith(".3dl") and assigned_luts[assigned_lut] == 1): remove = preset["settings"]["cube"] else: remove = False # Check total size of installed 3D LUTs. The Prisma has 1 MB of # custom LUT storage, which is enough for 15 67 KB LUTs. maxsize = 1024 * 67 * 15 installed = self.patterngenerator.get_installed_3dluts() rawlen = len(installed["raw"]) size = 0 numinstalled = 0 for table in installed["tables"]: if table.get("n") != remove: size += table.get("s", 0) numinstalled += 1 else: rawlen -= len('{"n":"%s", "s":%i},' % (table["n"], table.get("s", 0))) filesize = os.stat(path).st_size size_exceeded = size + filesize > maxsize # NOTE that due to a bug in the Prisma firmware (1.02), # responses are sometimes truncated to 512 bytes, which means # with the current 3D LUT naming scheme we can effectively only # store two of them. response_len_exceeded = rawlen + len('{"n":"%s", "s":%i},' % (filename, filesize)) > 512 # NOTE that the total number of 3D LUT slots seems to be limited # to 32, which includes built-in LUTs. maxluts = 32 luts_exceeded = numinstalled >= maxluts if size_exceeded or response_len_exceeded or luts_exceeded: if size_exceeded: missing = size + filesize - maxsize elif luts_exceeded: missing = filesize * (numinstalled + 1 - maxluts) else: missing = size + filesize - 1024 * 67 * 2 raise Error(lang.getstr("3dlut.holder.out_of_memory", (getcfg("patterngenerator.prisma.host"), round(missing / 1024.0), getcfg("patterngenerator.prisma.host"), "Prisma"))) if remove and remove != filename: self.log("Removing currently assigned LUT", remove) self.patterngenerator.remove_3dlut(remove) self.log("Uploading LUT", path, "as", filename) self.patterngenerator.load_3dlut_file(path, filename) self.log("Setting LUT", filename) self.patterngenerator.set_3dlut(filename) self.log("Setting PrismaVue to zero") self.patterngenerator.set_prismavue(0) except Exception, exception: return exception return Info(lang.getstr("3dlut.install.success")) else: return Error(lang.getstr("3dlut.install.unsupported")) def install_profile(self, profile_path, capture_output=True, skip_scripts=False, silent=False): """ Install a profile by copying it to an appropriate location and registering it with the system """ colord_install = None oy_install = None argyll_install = self._install_profile_argyll(profile_path, capture_output, skip_scripts, silent) if argyll_install and sys.platform == "win32": # Assign profile to active display display_no = min(len(self.displays), getcfg("display.number")) - 1 ICCP.set_display_profile(os.path.basename(profile_path), display_no, use_active_display_device=True) loader_install = None profile = None try: profile = ICCP.ICCProfile(profile_path) except (IOError, ICCP.ICCProfileInvalidError), exception: return exception device_id = self.get_device_id(quirk=True) if (sys.platform not in ("darwin", "win32") and not getcfg("dry_run") and (self.argyll_version < [1, 6] or not whereis("libcolordcompat.so.*") or argyll_install is not True) and which("colormgr")): if device_id: result = False # Try a range of possible device IDs device_ids = [device_id, self.get_device_id(quirk=True, truncate_edid_strings=True), self.get_device_id(quirk=True, use_serial_32=False), self.get_device_id(quirk=True, use_serial_32=False, truncate_edid_strings=True), self.get_device_id(quirk=False), self.get_device_id(quirk=False, truncate_edid_strings=True), self.get_device_id(quirk=False, use_serial_32=False), self.get_device_id(quirk=False, use_serial_32=False, truncate_edid_strings=True)] for device_id in OrderedDict.fromkeys(device_ids).iterkeys(): if device_id: # NOTE: This can block result = self._install_profile_colord(profile, device_id) if isinstance(result, colord.CDObjectQueryError): # Device ID was not found, try next one continue else: # Either returned ok or there was another error break colord_install = result if not device_id or result is not True: gcm_import = bool(which("gcm-import")) if gcm_import: self._install_profile_gcm(profile) # gcm-import doesn't seem to return a useful exit code or # stderr output, so check for our profile profilename = os.path.basename(profile.fileName) for dirname in iccprofiles_home: profile_install_path = os.path.join(dirname, profilename) if os.path.isfile(profile_install_path): colord_install = Warn(lang.getstr("profile.import.success")) break if (which("oyranos-monitor") and self.check_display_conf_oy_compat(getcfg("display.number"))): if device_id: profile_name = re.sub("[- ]", "_", device_id.lower()) + ".icc" else: profile_name = None result = self._install_profile_oy(profile_path, profile_name, capture_output, skip_scripts, silent) oy_install = result if (argyll_install is not True and ((colord_install and not isinstance(colord_install, colord.CDError)) or oy_install is True)): # Ignore Argyll install errors if colord or Oyranos install was # succesful argyll_install = None # Check if atleast one of our profile install methods did return a # result that is not an error for result in (argyll_install, colord_install, oy_install): check = result is True or isinstance(result, Warning) if check: break # Only go on to create profile loader if profile loading on login # isn't disabled in the config file, and we are not under Mac OS X # (no loader required there), and if atleast one of our profile # install methods did return a result that is not an error if (getcfg("profile.load_on_login") and sys.platform != "darwin" and check): # Create profile loader. Failing to create it is a critical error # under Windows if calibration loading isn't handled by the OS # (this is checked), and also under Linux if colord profile install # failed (colord handles loading otherwise) check = (sys.platform == "win32" or (not colord_install or isinstance(colord_install, colord.CDError))) if (getcfg("profile.install_scope") == "l"): # We need a system-wide config file to store the path to # the Argyll binaries for the profile loader if (not config.makecfgdir("system", self) or (not config.writecfg("system", self) and check)): # If the system-wide config dir could not be created, # or the system-wide config file could not be written, # error out if under Windows or if under Linux but # colord profile install failed return Error(lang.getstr("error.autostart_system")) if sys.platform == "win32": loader_install = self._install_profile_loader_win32(silent) else: loader_install = self._install_profile_loader_xdg(silent) if loader_install is not True and check: return loader_install # Check if atleast one of our profile install methods returned a result for result in (argyll_install, colord_install, oy_install): if result is not None: return argyll_install, colord_install, oy_install, loader_install if not result: # This should never happen result = Error(lang.getstr("profile.install.error")) return result def install_argyll_instrument_conf(self, uninstall=False, filenames=None): """ (Un-)install Argyll CMS instrument configuration under Linux """ udevrules = "/etc/udev/rules.d" hotplug = "/etc/hotplug" if not os.path.isdir(udevrules) and not os.path.isdir(hotplug): return Error(lang.getstr("udev_hotplug.unavailable")) if not filenames: filenames = self.get_argyll_instrument_conf("installed" if uninstall else None) if not filenames: return Error("\n".join(lang.getstr("file.missing", filename) for filename in self.get_argyll_instrument_conf("expected"))) for filename in filenames: if filename.endswith(".rules"): dst = udevrules else: dst = hotplug if uninstall: # Move file to backup location backupdir = "".join([os.path.join(config.datahome, "backup"), os.path.dirname(filename)]) if not os.path.isdir(backupdir): os.makedirs(backupdir) cmd, args = "mv", ["-f", filename, "".join([os.path.join(config.datahome, "backup"), filename])] else: cmd, args = "cp", ["-f", filename] args.append(os.path.join(dst, os.path.basename(filename))) result = self.exec_cmd(cmd, args, capture_output=True, skip_scripts=True, asroot=True) if result is not True: break if result is True and dst == udevrules: # Reload udev rules udevadm = which("udevadm", ["/sbin"]) if udevadm: result = self.exec_cmd(udevadm, ["control", "--reload-rules"], capture_output=True, skip_scripts=True, asroot=True) return result def install_argyll_instrument_drivers(self, uninstall=False, launch_devman=False): """ (Un-)install the Argyll CMS instrument drivers under Windows """ winxp = sys.getwindowsversion() < (6,) if launch_devman: if winxp: cmd = "start" args = ["mmc", "devmgmt.msc"] else: cmd = "mmc" args = ["devmgmt.msc"] self.exec_cmd(cmd, args, capture_output=True, skip_scripts=True, asroot=not winxp, shell=winxp, working_dir=False) if not uninstall: usbinfpath = get_data_path("usb/ArgyllCMS.inf") if not usbinfpath: return Error(lang.getstr("file.missing", "usb/ArgyllCMS.inf")) if not winxp: # Windows Vista and newer with win64_disable_file_system_redirection(): pnputil = which("PnPutil.exe") if not pnputil: return Error(lang.getstr("file.missing", "PnPutil.exe")) if uninstall: result = self.exec_cmd(pnputil, ["-e"], capture_output=True, log_output=False, silent=True, skip_scripts=True) if not result: return Error(lang.getstr("argyll.instrument.drivers.uninstall.failure")) elif isinstance(result, Exception): return result output = universal_newlines("".join(self.output)) for entry in output.split("\n\n"): entry = [line.split(":", 1)[-1].strip() for line in entry.split("\n")] for value in entry: if value == "ArgyllCMS": result = self.exec_cmd(pnputil, ["-f", "-d", entry[0]], capture_output=True, skip_scripts=True, asroot=True) return result else: return self.exec_cmd(pnputil, ["-i", "-a", usbinfpath], capture_output=True, skip_scripts=True, asroot=True) else: # Windows XP #subkey = "\\".join(["Software", "Microsoft", "Windows", #"CurrentVersion"]) #try: #key = _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE, subkey, 0, #_winreg.KEY_READ | #_winreg.KEY_QUERY_VALUE | #_winreg.KEY_SET_VALUE) #newvalue = value = _winreg.QueryValueEx(key, "DevicePath")[0] #if uninstall: ## No real uninstallation possible. Just remove all paths ## ending in '\argyllcms.inf' #paths = [] #for path in value.split(os.pathsep): #path = os.path.normpath(path) #if not path.lower().endswith(r"\argyllcms.inf"): #paths.append(path) #newvalue = os.pathsep.join(paths) #elif not usbinfpath.lower() in value.lower().split(os.pathsep): #newvalue = value + os.pathsep + usbinfpath #if newvalue != value: #_winreg.SetValueEx(key, "DevicePath", 0, #_winreg.REG_EXPAND_SZ, newvalue) #except Exception, exception: #return exception if uninstall: # Uninstallation not supported pass else: sections = ["LIBUSB0_DEV"] #with open(usbinfpath, "rb") as usbinf: #sections += re.findall(r"\[(\w+_Devices)\]", usbinf.read()) working_dir, infbasename = os.path.split(usbinfpath) result = True for section in sections: result = self.exec_cmd(which("rundll32.exe"), ["setupapi,InstallHinfSection", section, "132", os.path.join(".", infbasename)], capture_output=True, skip_scripts=True, working_dir=working_dir) if isinstance(result, Exception) or not result: break if not result: result = Error(lang.getstr("argyll.instrument.drivers.install.failure")) return result def _install_profile_argyll(self, profile_path, capture_output=False, skip_scripts=False, silent=False): """ Install profile using dispwin """ if (sys.platform == "darwin" and False): # NEVER # Alternate way of 'installing' the profile under OS X by just # copying it profiles = os.path.join("Library", "ColorSync", "Profiles") profile_install_path = os.path.join(profiles, os.path.basename(profile_path)) network = os.path.join(os.path.sep, "Network", profiles) if getcfg("profile.install_scope") == "l": profile_install_path = os.path.join(os.path.sep, profile_install_path) elif (getcfg("profile.install_scope") == "n" and os.path.isdir(network)): profile_install_path = os.path.join(network, profile_install_path) else: profile_install_path = os.path.join(os.path.expanduser("~"), profile_install_path) cmd, args = "cp", ["-f", profile_path, profile_install_path] result = self.exec_cmd(cmd, args, capture_output, low_contrast=False, skip_scripts=skip_scripts, silent=silent, asroot=getcfg("profile.install_scope") in ("l", "n"), title=lang.getstr("profile.install")) if not isinstance(result, Exception) and result: self.output = ["Installed"] else: if (sys.platform == "win32" and sys.getwindowsversion() >= (6, ) and not util_win.per_user_profiles_isenabled()): # Enable per-user profiles under Vista / Windows 7 try: util_win.enable_per_user_profiles(True, getcfg("display.number") - 1) except Exception, exception: self.log("util_win.enable_per_user_profiles(True, %s): %s" % (getcfg("display.number") - 1, safe_unicode(exception))) cmd, args = self.prepare_dispwin(None, profile_path, True) if not isinstance(cmd, Exception): if "-Sl" in args and (sys.platform != "darwin" or intlist(mac_ver()[0].split(".")) >= [10, 6]): # If a 'system' install is requested under Linux, # Mac OS X >= 10.6 or Windows, # install in 'user' scope first because a system-wide install # doesn't also set it as current user profile on those systems # (on Mac OS X < 10.6, we can use ColorSyncScripting to set it). # It has the small drawback under Linux and OS X 10.6 that # it will copy the profile to both the user and system-wide # locations, though, which is not a problem under Windows as # they are the same. args.remove("-Sl") result = self.exec_cmd(cmd, args, capture_output, low_contrast=False, skip_scripts=skip_scripts, silent=silent, title=lang.getstr("profile.install")) output = list(self.output) args.insert(0, "-Sl") else: output = None result = True if not isinstance(result, Exception) and result: result = self.exec_cmd(cmd, args, capture_output, low_contrast=False, skip_scripts=skip_scripts, silent=silent, title=lang.getstr("profile.install")) else: result = cmd if not isinstance(result, Exception) and result is not None: result = False for line in output or self.output: if "Installed" in line: if (sys.platform == "darwin" and "-Sl" in args and intlist(mac_ver()[0].split(".")) < [10, 6]): # The profile has been installed, but we need a little # help from AppleScript to actually make it the default # for the current user. Only works under Mac OS < 10.6 n = getcfg("display.number") path = os.path.join(os.path.sep, "Library", "ColorSync", "Profiles", os.path.basename(args[-1])) applescript = ['tell app "ColorSyncScripting"', 'set displayProfile to POSIX file "%s" as alias' % path, 'set display profile of display %i to displayProfile' % n, 'end tell'] try: retcode, output, errors = osascript(applescript) except Exception, exception: self.log(exception) else: if errors.strip(): self.log("osascript error: %s" % errors) else: result = True break elif (sys.platform == "darwin" and False): # NEVER # After 'installing' a profile under Mac OS X by just # copying it, show system preferences applescript = ['tell application "System Preferences"', 'activate', 'set current pane to pane id "com.apple.preference.displays"', 'reveal (first anchor of current pane whose name is "displaysColorTab")', # This needs access for assistive devices enabled #'tell application "System Events"', #'tell process "System Preferences"', #'select row 2 of table 1 of scroll area 1 of group 1 of tab group 1 of window ""', #'end tell', #'end tell', 'end tell'] try: retcode, output, errors = osascript(applescript) except Exception, exception: self.log(exception) else: if errors.strip(): self.log("osascript error: %s" % errors) else: result = True else: result = True break if not result and self.errors: result = Error("".join(self.errors).strip()) # DO NOT call wrapup() here, it'll remove the profile in the temp # directory before dispwin can get a hold of it when running with UAC # under Windows, because that makes the call to dispwin run in a # separate thread. DisplayCAL.MainFrame.profile_finish_consumer calls # DisplayCAL.MainFrame.start_timers(True) after displaying the result # message which takes care of cleanup. return result def _install_profile_colord(self, profile, device_id): """ Install profile using colord """ self.log("%s: Trying device ID %r" % (appname, device_id)) try: colord.install_profile(device_id, profile, logfn=self.log) except Exception, exception: self.log(exception) return exception return True def _install_profile_gcm(self, profile): """ Install profile using gcm-import """ if which("colormgr"): # Check if profile already exists in database try: colord.get_object_path("icc-" + hexlify(profile.ID), "profile") except colord.CDObjectQueryError: # Profile not in database pass except colord.CDError, exception: self.log(exception) else: # Profile already in database, nothing to do return None # gcm-import will check if the profile is already in the database # (based on profile ID), but will fail to overwrite a profile with the # same name. We need to remove those profiles so gcm-import can work. profilename = os.path.basename(profile.fileName) for dirname in iccprofiles_home: profile_install_path = os.path.join(dirname, profilename) if os.path.isfile(profile_install_path) and \ profile_install_path != profile.fileName: try: trash([profile_install_path]) except Exception, exception: self.log(exception) else: # Give colord time to recognize that the profile was # removed, otherwise gcm-import may complain if it's # a profile that was already in the database sleep(3) if self._progress_wnd and not getattr(self._progress_wnd, "dlg", None): self._progress_wnd.dlg = DummyDialog() # Run gcm-import cmd, args = which("gcm-import"), [profile.fileName] # gcm-import does not seem to return a useful exit code (it's always 1) # or stderr output self.exec_cmd(cmd, args, capture_output=True, skip_scripts=True) def _install_profile_oy(self, profile_path, profile_name=None, capture_output=False, skip_scripts=False, silent=False): """ Install profile using oyranos-monitor """ display = self.displays[max(0, min(len(self.displays) - 1, getcfg("display.number") - 1))] x, y = [pos.strip() for pos in display.split("@")[-1].split(",")[0:2]] if getcfg("profile.install_scope") == "l": # If system-wide install, copy profile to # /var/lib/color/icc/devices/display var_icc = "/var/lib/color/icc/devices/display" if not profile_name: profile_name = os.path.basename(profile_path) profile_install_path = os.path.join(var_icc, profile_name) result = self.exec_cmd("mkdir", ["-p", os.path.dirname(profile_install_path)], capture_output=True, low_contrast=False, skip_scripts=True, silent=True, asroot=True) if not isinstance(result, Exception) and result: result = self.exec_cmd("cp", ["-f", profile_path, profile_install_path], capture_output=True, low_contrast=False, skip_scripts=True, silent=True, asroot=True) else: result = True dirname = None for dirname in iccprofiles_display_home: if os.path.isdir(dirname): # Use the first one that exists break else: dirname = None if not dirname: # Create the first one in the list dirname = iccprofiles_display_home[0] try: os.makedirs(dirname) except Exception, exception: self.log(exception) result = False if result is not False: profile_install_path = os.path.join(dirname, os.path.basename(profile_path)) try: shutil.copyfile(profile_path, profile_install_path) except Exception, exception: self.log(exception) result = False if not isinstance(result, Exception) and result is not False: cmd = which("oyranos-monitor") args = ["-x", x, "-y", y, profile_install_path] result = self.exec_cmd(cmd, args, capture_output, low_contrast=False, skip_scripts=skip_scripts, silent=silent, working_dir=False) ##if getcfg("profile.install_scope") == "l": ##result = self.exec_cmd(cmd, args, ##capture_output, ##low_contrast=False, ##skip_scripts=skip_scripts, ##silent=silent, ##asroot=True, ##working_dir=False) if not result and self.errors: result = Error("".join(self.errors).strip()) return result def _install_profile_loader_win32(self, silent=False): """ Install profile loader """ if (sys.platform == "win32" and sys.getwindowsversion() >= (6, 1) and util_win.calibration_management_isenabled()): self._uninstall_profile_loader_win32() return True # Must return either True on success or an Exception object on error result = True # Remove outdated (pre-0.5.5.9) profile loaders display_no = self.get_display() name = "%s Calibration Loader (Display %s)" % (appname, display_no) if autostart_home: loader_v01b = os.path.join(autostart_home, ("dispwin-d%s-c-L" % display_no) + ".lnk") if os.path.exists(loader_v01b): try: # delete v0.1b loader os.remove(loader_v01b) except Exception, exception: self.log(u"Warning - could not remove old " u"v0.1b calibration loader '%s': %s" % tuple(safe_unicode(s) for s in (loader_v01b, exception))) loader_v02b = os.path.join(autostart_home, name + ".lnk") if os.path.exists(loader_v02b): try: # delete v02.b/v0.2.1b loader os.remove(loader_v02b) except Exception, exception: self.log(u"Warning - could not remove old " u"v0.2b calibration loader '%s': %s" % tuple(safe_unicode(s) for s in (loader_v02b, exception))) loader_v0558 = os.path.join(autostart_home, name + ".lnk") if os.path.exists(loader_v0558): try: # delete v0.5.5.8 user loader os.remove(loader_v0558) except Exception, exception: self.log(u"Warning - could not remove old " u"v0.2b calibration loader '%s': %s" % tuple(safe_unicode(s) for s in (loader_v02b, exception))) if autostart: loader_v0558 = os.path.join(autostart, name + ".lnk") if os.path.exists(loader_v0558): try: # delete v0.5.5.8 system loader os.remove(loader_v0558) except Exception, exception: self.log(u"Warning - could not remove old " u"v0.2b calibration loader '%s': %s" % tuple(safe_unicode(s) for s in (loader_v02b, exception))) # Create unified loader name = appname + " Profile Loader" if autostart: autostart_lnkname = os.path.join(autostart, name + ".lnk") if autostart_home: autostart_home_lnkname = os.path.join(autostart_home, name + ".lnk") loader_args = [] if os.path.basename(sys.executable).lower() in ("python.exe", "pythonw.exe"): cmd = os.path.join(os.path.dirname(sys.executable), "pythonw.exe") pyw = os.path.normpath(os.path.join(pydir, "..", appname + "-apply-profiles.pyw")) if os.path.exists(pyw): # Running from source or 0install # Check if this is a 0install implementation, in which # case we want to call 0launch with the appropriate # command if re.match("sha\d+(?:new)?", os.path.basename(os.path.dirname(pydir))): cmd = which("0install-win.exe") or "0install-win.exe" loader_args.extend(["run", "--batch", "--no-wait", "--offline", "--command=run-apply-profiles", "http://%s/0install/%s.xml" % (domain.lower(), appname)]) else: # Running from source loader_args.append(u'"%s"' % pyw) else: # Regular install loader_args.append(u'"%s"' % get_data_path(os.path.join("scripts", appname + "-apply-profiles"))) else: cmd = os.path.join(pydir, appname + "-apply-profiles.exe") not_main_thread = currentThread().__class__ is not _MainThread if not_main_thread: # If running in a thread, need to call pythoncom.CoInitialize pythoncom.CoInitialize() try: scut = pythoncom.CoCreateInstance(win32com_shell.CLSID_ShellLink, None, pythoncom.CLSCTX_INPROC_SERVER, win32com_shell.IID_IShellLink) scut.SetPath(cmd) if len(loader_args) == 1: scut.SetWorkingDirectory(pydir) if os.path.basename(cmd) == appname + "-apply-profiles.exe": scut.SetIconLocation(cmd, 0) else: scut.SetIconLocation(get_data_path(os.path.join("theme", "icons", appname + "-apply-profiles.ico")), 0) scut.SetArguments(" ".join(loader_args)) scut.SetShowCmd(win32con.SW_SHOWDEFAULT) if is_superuser(): if autostart: try: scut.QueryInterface(pythoncom.IID_IPersistFile).Save(autostart_lnkname, 0) except Exception, exception: if not silent: result = Warning(lang.getstr("error.autostart_creation", autostart) + "\n" + safe_unicode(exception)) # Now try user scope else: if not silent: result = Warning(lang.getstr("error.autostart_system")) if autostart_home: if (autostart and os.path.isfile(autostart_lnkname)): # Remove existing user loader if os.path.isfile(autostart_home_lnkname): os.remove(autostart_home_lnkname) else: # Only create user loader if no system loader try: scut.QueryInterface( pythoncom.IID_IPersistFile).Save( autostart_home_lnkname, 0) except Exception, exception: if not silent: result = Warning(lang.getstr("error.autostart_creation", autostart_home) + "\n" + safe_unicode(exception)) else: if not silent: result = Warning(lang.getstr("error.autostart_user")) except Exception, exception: if not silent: result = Warning(lang.getstr("error.autostart_creation", autostart_home) + "\n" + safe_unicode(exception)) finally: if not_main_thread: # If running in a thread, need to call pythoncom.CoUninitialize pythoncom.CoUninitialize() if not os.path.isfile(os.path.join(config.confighome, appbasename + "-apply-profiles.lock")): # Run profile loader TSR program if not yet loaded if loader_args: cmdline = '%s" %s "--skip' % (cmd, " ".join(loader_args)) else: cmdline = '%s" "--skip' % cmd launch_file(cmdline) return result def _uninstall_profile_loader_win32(self): """ Uninstall profile loader """ name = appname + " Profile Loader" if autostart and is_superuser(): autostart_lnkname = os.path.join(autostart, name + ".lnk") if os.path.exists(autostart_lnkname): try: os.remove(autostart_lnkname) except Exception, exception: self.log(autostart_lnkname, exception) if autostart_home: autostart_home_lnkname = os.path.join(autostart_home, name + ".lnk") if os.path.exists(autostart_home_lnkname): try: os.remove(autostart_home_lnkname) except Exception, exception: self.log(autostart_home_lnkname, exception) return True def _install_profile_loader_xdg(self, silent=False): """ Install profile loader """ # See http://standards.freedesktop.org/autostart-spec # Must return either True on success or an Exception object on error result = True # Remove outdated (pre-0.5.5.9) profile loaders name = "%s-Calibration-Loader-Display-%s" % (appname, self.get_display()) desktopfile_path = os.path.join(autostart_home, name + ".desktop") oy_desktopfile_path = os.path.join(autostart_home, "oyranos-monitor.desktop") system_desktopfile_path = os.path.join( autostart, name + ".desktop") # Remove old (pre-0.5.5.9) dispwin user loader if os.path.exists(desktopfile_path): try: os.remove(desktopfile_path) except Exception, exception: result = Warning(lang.getstr("error.autostart_remove_old", desktopfile_path)) # Remove old (pre-0.5.5.9) oyranos user loader if os.path.exists(oy_desktopfile_path): try: os.remove(oy_desktopfile_path) except Exception, exception: result = Warning(lang.getstr("error.autostart_remove_old", oy_desktopfile_path)) # Remove old (pre-0.5.5.9) dispwin system loader if (os.path.exists(system_desktopfile_path) and (self.exec_cmd("rm", ["-f", system_desktopfile_path], capture_output=True, low_contrast=False, skip_scripts=True, silent=False, asroot=True, title=lang.getstr("autostart_remove_old")) is not True) and not silent): result = Warning(lang.getstr("error.autostart_remove_old", system_desktopfile_path)) # Create unified loader # Prepend 'z' so our loader hopefully loads after # possible nvidia-settings entry (which resets gamma table) name = "z-%s-apply-profiles" % appname desktopfile_path = os.path.join(autostart_home, name + ".desktop") system_desktopfile_path = os.path.join(autostart, name + ".desktop") try: # Create user loader, even if we later try to # move it to the system-wide location so that atleast # the user loader is present if the move to the system # dir fails if not os.path.exists(autostart_home): os.makedirs(autostart_home) desktopfile = open(desktopfile_path, "w") desktopfile.write('[Desktop Entry]\n') desktopfile.write('Version=1.0\n') desktopfile.write('Encoding=UTF-8\n') desktopfile.write('Type=Application\n') desktopfile.write('Name=%s\n' % (appname + ' ICC Profile Loader').encode("UTF-8")) desktopfile.write('Comment=%s\n' % lang.getstr("calibrationloader.description", lcode="en").encode("UTF-8")) if lang.getcode() != "en": desktopfile.write(('Comment[%s]=%s\n' % (lang.getcode(), lang.getstr("calibrationloader.description"))).encode("UTF-8")) pyw = os.path.normpath(os.path.join(pydir, "..", appname + "-apply-profiles.pyw")) icon = appname + "-apply-profiles" if os.path.exists(pyw): # Running from source, or 0install/Listaller install # Check if this is a 0install implementation, in which # case we want to call 0launch with the appropriate # command if re.match("sha\d+(?:new)?", os.path.basename(os.path.dirname(pydir))): executable = ("0launch --console --offline " "--command=run-apply-profiles " "http://%s/0install/%s.xml" % (domain.lower(), appname)) else: icon = os.path.join(pydir, "theme", "icons", "256x256", appname + "-apply-profiles.png") executable = pyw else: # Regular install executable = appname + "-apply-profiles" desktopfile.write('Icon=%s\n' % icon.encode("UTF-8")) desktopfile.write('Exec=%s\n' % executable.encode("UTF-8")) desktopfile.write('Terminal=false\n') desktopfile.close() except Exception, exception: if not silent: result = Warning(lang.getstr("error.autostart_creation", desktopfile_path) + "\n" + safe_unicode(exception)) else: if getcfg("profile.install_scope") == "l" and autostart: # Move system-wide loader if (self.exec_cmd("mkdir", ["-p", autostart], capture_output=True, low_contrast=False, skip_scripts=True, silent=True, asroot=True) is not True or self.exec_cmd("mv", ["-f", desktopfile_path, system_desktopfile_path], capture_output=True, low_contrast=False, skip_scripts=True, silent=True, asroot=True) is not True) and \ not silent: result = Warning(lang.getstr("error.autostart_creation", system_desktopfile_path)) return result def instrument_supports_ccss(self, instrument_name=None): """ Return whether instrument supports CCSS files or not """ if not instrument_name: instrument_name = self.get_instrument_name() return ("i1 DisplayPro, ColorMunki Display" in instrument_name or "Spyder4" in instrument_name or "Spyder5" in instrument_name) def create_ccxx(self, args=None, working_dir=None): """ Create CCMX or CCSS """ if not args: args = [] cmd = get_argyll_util("ccxxmake") if not "-I" in args: # Display manufacturer & name name = self.get_display_name(True) if name: args.insert(0, "-I") args.insert(1, name) elif not "-T" in args: # Display technology args.insert(0, "-T") displaytech = ["LCD" if getcfg("measurement_mode") == "l" else "CRT"] if (self.get_instrument_features().get("projector_mode") and getcfg("measurement_mode.projector")): displaytech.append("Projector") args.insert(1, " ".join(displaytech)) return self.exec_cmd(cmd, ["-v"] + args, capture_output=True, skip_scripts=True, silent=False, working_dir=working_dir) def create_gamut_views(self, profile_path): """ Generate gamut views (VRML files) and show progress in current progress dialog """ if getcfg("profile.create_gamut_views"): self.log("-" * 80) self.log(lang.getstr("gamut.view.create")) self.recent.clear() self.recent.write(lang.getstr("gamut.view.create")) sleep(.75) # Allow time for progress window to update return self.calculate_gamut(profile_path) else: return None, None def create_profile(self, dst_path=None, skip_scripts=False, display_name=None, display_manufacturer=None, tags=None): """ Create an ICC profile and process the generated file """ safe_print(lang.getstr("create_profile")) if dst_path is None: dst_path = os.path.join(getcfg("profile.save_path"), getcfg("profile.name.expanded"), getcfg("profile.name.expanded") + profile_ext) cmd, args = self.prepare_colprof( os.path.basename(os.path.splitext(dst_path)[0]), display_name, display_manufacturer) if not isinstance(cmd, Exception): result = self.exec_cmd(cmd, args, low_contrast=False, skip_scripts=skip_scripts) if (os.path.isfile(args[-1] + ".ti3.backup") and os.path.isfile(args[-1] + ".ti3")): # Restore backed up TI3 os.rename(args[-1] + ".ti3", args[-1] + ".bpc.ti3") os.rename(args[-1] + ".ti3.backup", args[-1] + ".ti3") ti3_file = open(args[-1] + ".ti3", "rb") ti3 = ti3_file.read() ti3_file.close() else: ti3 = None if os.path.isfile(args[-1] + ".chrm"): # Get ChromaticityType tag with open(args[-1] + ".chrm", "rb") as blob: chrm = ICCP.ChromaticityType(blob.read()) else: chrm = None else: result = cmd bpc_applied = False profchanged = False if not isinstance(result, Exception) and result: profile_path = args[-1] + profile_ext try: profile = ICCP.ICCProfile(profile_path) except (IOError, ICCP.ICCProfileInvalidError), exception: result = Error(lang.getstr("profile.invalid") + "\n" + profile_path) else: # Hires CIECAM02 gamut mapping - perceptual and saturation # tables, also colorimetric table for non-RGB profiles # Use collink for smoother result. # Only for XYZ LUT and if source profile is a simple matrix # profile, otherwise CIECAM02 tables will already have been # created by colprof gamap = ((getcfg("gamap_perceptual") or getcfg("gamap_saturation")) and getcfg("gamap_profile")) collink = None if ("A2B0" in profile.tags and profile.connectionColorSpace == "XYZ" and (gamap or profile.colorSpace != "RGB") and getcfg("profile.b2a.hires")): collink = get_argyll_util("collink") if not collink: self.log(lang.getstr("argyll.util.not_found", "collink")) gamap_profile = None if gamap and collink: try: gamap_profile = ICCP.ICCProfile(getcfg("gamap_profile")) except (IOError, ICCProfileInvalidError), exception: self.log(exception) else: if (not "A2B0" in gamap_profile.tags and "rXYZ" in gamap_profile.tags and "gXYZ" in gamap_profile.tags and "bXYZ" in gamap_profile.tags): # Simple matrix source profile. Change gamma to 1.0 gamap_profile.tags.rTRC = ICCP.CurveType() gamap_profile.tags.rTRC.append(1.0) gamap_profile.tags.gTRC = gamap_profile.tags.rTRC gamap_profile.tags.bTRC = gamap_profile.tags.rTRC # Write to temp file fd, gamap_profile.fileName = tempfile.mkstemp(profile_ext, dir=self.tempdir) stream = os.fdopen(fd, "wb") gamap_profile.write(stream) stream.close() if profile.colorSpace == "RGB": # Only table 0 (colorimetric) in display profile. # Assign it to table 1 as per ICC spec to prepare # for adding table 0 (perceptual) and 2 (saturation) profile.tags.B2A1 = profile.tags.B2A0 else: gamap_profile = None tables = [] if gamap_profile or (collink and profile.colorSpace != "RGB"): size = getcfg("profile.b2a.hires.size") # Make sure to map 'auto' value (-1) to an actual size size = {-1: 33}.get(size, size) collink_args = ["-v", "-q" + getcfg("profile.quality"), "-G", "-r%i" % size] for tableno, cfgname in [(0, "gamap_perceptual"), (2, "gamap_saturation")]: if getcfg(cfgname): tables.append((tableno, getcfg(cfgname + "_intent"))) if profile.colorSpace != "RGB": # Create colorimetric table for non-RGB profile tables.append((1, "r")) # Get inking rules from colprof extra args extra_args = getcfg("extra_args.colprof") inking = re.findall(r"-[Kk](?:[zhxr]|p[0-9\.\s]+)|" "-[Ll][0-9\.\s]+", extra_args) if inking: collink_args.extend(parse_argument_string(" ".join(inking))) for tableno, intent in tables: # Create device link(s) gamap_args = [] if tableno == 1: # Use PhotoPrintRGB as PCS if creating colorimetric # table for non-RGB profile. # PhotoPrintRGB is a synthetic linear gamma space # with the Rec2020 red and blue adapted to D50 # and a green of x 0.1292 (same as blue x) y 0.8185 # It almost completely encompasses PhotoGamutRGB pcs = get_data_path("ref/PhotoPrintRGB.icc") if pcs: try: gamap_profile = ICCP.ICCProfile(pcs) except (IOError, ICCProfileInvalidError), exception: self.log(exception) else: missing = lang.getstr("file.missing", "ref/PhotoPrintRGB.icc") if gamap_profile: self.log(missing) else: result = Error(missing) break else: if getcfg("gamap_src_viewcond"): gamap_args.append("-c" + getcfg("gamap_src_viewcond")) if getcfg("gamap_out_viewcond"): gamap_args.append("-d" + getcfg("gamap_out_viewcond")) link_profile = tempfile.mktemp(profile_ext, dir=self.tempdir) result = self.exec_cmd(collink, collink_args + gamap_args + ["-i" + intent, gamap_profile.fileName, profile_path, link_profile], sessionlogfile=self.sessionlogfile) if not isinstance(result, Exception) and result: try: link_profile = ICCP.ICCProfile(link_profile) except (IOError, ICCP.ICCProfileInvalidError), exception: self.log(exception) continue table = "B2A%i" % tableno profile.tags[table] = link_profile.tags.A2B0 # Remove temporary link profile os.remove(link_profile.fileName) # Update B2A matrix with source profile matrix matrix = colormath.Matrix3x3([[gamap_profile.tags.rXYZ.X, gamap_profile.tags.gXYZ.X, gamap_profile.tags.bXYZ.X], [gamap_profile.tags.rXYZ.Y, gamap_profile.tags.gXYZ.Y, gamap_profile.tags.bXYZ.Y], [gamap_profile.tags.rXYZ.Z, gamap_profile.tags.gXYZ.Z, gamap_profile.tags.bXYZ.Z]]) matrix.invert() scale = 1 + (32767 / 32768.0) matrix *= colormath.Matrix3x3(((scale, 0, 0), (0, scale, 0), (0, 0, scale))) profile.tags[table].matrix = matrix profchanged = True else: break elif (getcfg("profile.b2a.hires") and getcfg("profile.b2a.hires.smooth") and gamap): # Smooth existing B2A tables linebuffered_logfiles = [] if sys.stdout.isatty(): linebuffered_logfiles.append(safe_print) else: linebuffered_logfiles.append(log) if self.sessionlogfile: linebuffered_logfiles.append(self.sessionlogfile) logfiles = Files([LineBufferedStream( FilteredStream(Files(linebuffered_logfiles), enc, discard="", linesep_in="\n", triggers=[])), self.recent, self.lastmsg]) smooth_tables = [] for tableno in (0, 2): table = profile.tags.get("B2A%i" % tableno) if table in smooth_tables: continue if self.smooth_B2A(profile, tableno, getcfg("profile.b2a.hires.diagpng") and 2, logfile=logfiles): smooth_tables.append(table) profchanged = True if not isinstance(result, Exception) and result: if (gamap_profile and os.path.dirname(gamap_profile.fileName) == self.tempdir): # Remove temporary source profile os.remove(gamap_profile.fileName) if profchanged and tables: # Make sure we match Argyll colprof i.e. have a complete # set of tables if profile.colorSpace != "RGB": if len(tables) == 1: # We only created a colorimetric table, the # others are still low quality. Assign # colorimetric table profile.tags.B2A0 = profile.tags.B2A1 if len(tables) < 3: # We only created colorimetric and/or perceptual # tables, saturation table is still low quality. # Assign perceptual table profile.tags.B2A2 = profile.tags.B2A0 if not "A2B1" in profile.tags: profile.tags.A2B1 = profile.tags.A2B0 if not "A2B2" in profile.tags: profile.tags.A2B2 = profile.tags.A2B0 if not "B2A2" in profile.tags: profile.tags.B2A2 = profile.tags.B2A0 # A2B processing process_A2B = ("A2B0" in profile.tags and profile.colorSpace == "RGB" and profile.connectionColorSpace in ("XYZ", "Lab") and (getcfg("profile.b2a.hires") or getcfg("profile.quality.b2a") in ("l", "n"))) if ("rTRC" in profile.tags and "gTRC" in profile.tags and "bTRC" in profile.tags and isinstance(profile.tags.rTRC, ICCP.CurveType) and isinstance(profile.tags.gTRC, ICCP.CurveType) and isinstance(profile.tags.bTRC, ICCP.CurveType) and ((getcfg("profile.black_point_compensation") and not "A2B0" in profile.tags) or (process_A2B and getcfg("profile.b2a.hires"))) and len(profile.tags.rTRC) > 1 and len(profile.tags.gTRC) > 1 and len(profile.tags.bTRC) > 1): for component in ("r", "g", "b"): self.log("%s: Applying black point compensation to " "%sTRC" % (appname, component)) profile.tags["%sTRC" % component].apply_bpc() bpc_applied = True profchanged = True if process_A2B: bpc_applied = False if getcfg("profile.black_point_compensation"): if "A2B1" in profile.tags: table = "A2B1" else: table = "A2B0" if isinstance(profile.tags[table], ICCP.LUT16Type): self.log("%s: Applying black point " "compensation to %s table" % (appname, table)) profile.tags[table].apply_bpc() bpc_applied = True profchanged = True else: self.log("%s: Can't apply black point " "compensation to non-LUT16Type %s " "table" % (appname, table)) if getcfg("profile.b2a.hires"): if profchanged: # We need to write the changed profile before # enhancing B2A resolution! try: profile.write() except Exception, exception: return exception result = self.update_profile_B2A(profile) if not isinstance(result, Exception) and result: profchanged = True if profchanged and not isinstance(result, Exception) and result: if "bkpt" in profile.tags and bpc_applied: # We need to update the blackpoint tag try: odata = self.xicclu(profile, (0, 0, 0), intent="a", pcs="x") if len(odata) != 1 or len(odata[0]) != 3: raise ValueError("Blackpoint is invalid: %s" % odata) except Exception, exception: self.log(exception) else: (profile.tags.bkpt.X, profile.tags.bkpt.Y, profile.tags.bkpt.Z) = odata[0] # We need to write the changed profile try: profile.write() except Exception, exception: return exception if bpc_applied: # We need to re-do profile self check self.exec_cmd(get_argyll_util("profcheck"), [args[-1] + ".ti3", args[-1] + profile_ext], capture_output=True, skip_scripts=True) # Get profile max and avg err to be later added to metadata # Argyll outputs the following: # Profile check complete, peak err = x.xxxxxx, avg err = x.xxxxxx, RMS = x.xxxxxx peak = None avg = None rms = None for line in self.output: if line.startswith("Profile check complete"): peak = re.search("(?:peak err|max\.) = (\d+(?:\.\d+))", line) avg = re.search("avg(?: err|\.) = (\d+(?:\.\d+))", line) rms = re.search("RMS = (\d+(?:\.\d+))", line) if peak: peak = peak.groups()[0] if avg: avg = avg.groups()[0] if rms: rms = rms.groups()[0] break if not isinstance(result, Exception) and result: (gamut_volume, gamut_coverage) = self.create_gamut_views(profile_path) self.log("-" * 80) if not isinstance(result, Exception) and result: result = self.update_profile(profile, ti3, chrm, tags, avg, peak, rms, gamut_volume, gamut_coverage, quality=getcfg("profile.quality")) result2 = self.wrapup(not isinstance(result, UnloggedInfo) and result, dst_path=dst_path) if isinstance(result2, Exception): if isinstance(result, Exception): result = Error(safe_unicode(result) + "\n\n" + safe_unicode(result2)) else: result = result2 elif not isinstance(result, Exception) and result: setcfg("last_cal_or_icc_path", dst_path) setcfg("last_icc_path", dst_path) return result def update_profile(self, profile, ti3=None, chrm=None, tags=None, avg=None, peak=None, rms=None, gamut_volume=None, gamut_coverage=None, quality=None): """ Update profile tags and metadata """ if isinstance(profile, basestring): profile_path = profile try: profile = ICCP.ICCProfile(profile_path) except (IOError, ICCP.ICCProfileInvalidError), exception: return Error(lang.getstr("profile.invalid") + "\n" + profile_path) else: profile_path = profile.fileName if (profile.profileClass == "mntr" and profile.colorSpace == "RGB" and not (self.tempdir and profile_path.startswith(self.tempdir))): setcfg("last_cal_or_icc_path", profile_path) setcfg("last_icc_path", profile_path) if ti3: # Embed original TI3 profile.tags.targ = profile.tags.DevD = profile.tags.CIED = ICCP.TextType( "text\0\0\0\0" + ti3 + "\0", "targ") if chrm: # Add ChromaticityType tag profile.tags.chrm = chrm # Fixup desc tags - ASCII needs to be 7-bit # also add Unicode strings if different from ASCII if "desc" in profile.tags and isinstance(profile.tags.desc, ICCP.TextDescriptionType): profile.setDescription(profile.getDescription()) if "dmdd" in profile.tags and isinstance(profile.tags.dmdd, ICCP.TextDescriptionType): profile.setDeviceModelDescription( profile.getDeviceModelDescription()) if "dmnd" in profile.tags and isinstance(profile.tags.dmnd, ICCP.TextDescriptionType): profile.setDeviceManufacturerDescription( profile.getDeviceManufacturerDescription()) if tags and tags is not True: # Add custom tags for tagname, tag in tags.iteritems(): if tagname == "mmod": profile.device["manufacturer"] = "\0\0" + tag["manufacturer"][1] + tag["manufacturer"][0] profile.device["model"] = "\0\0" + tag["model"][0] + tag["model"][1] profile.tags[tagname] = tag elif tags is True: edid = self.get_display_edid() if edid: profile.device["manufacturer"] = "\0\0" + edid["edid"][9] + edid["edid"][8] profile.device["model"] = "\0\0" + edid["edid"][11] + edid["edid"][10] # Add Apple-specific 'mmod' tag (TODO: need full spec) mmod = ("mmod" + ("\x00" * 6) + edid["edid"][8:10] + ("\x00" * 2) + edid["edid"][11] + edid["edid"][10] + ("\x00" * 4) + ("\x00" * 20)) profile.tags.mmod = ICCP.ICCProfileTag(mmod, "mmod") # Add new meta information based on EDID profile.set_edid_metadata(edid) elif not "meta" in profile.tags: # Make sure meta tag exists profile.tags.meta = ICCP.DictType() profile.tags.meta.update({"CMF_product": appname, "CMF_binary": appname, "CMF_version": version}) # Set license profile.tags.meta["License"] = getcfg("profile.license") # Set profile quality quality = {"v": "very low", "l": "low", "m": "medium", "h": "high"}.get(quality) if quality: profile.tags.meta["Quality"] = quality # Set OPENICC_automatic_generated to "0" profile.tags.meta["OPENICC_automatic_generated"] = "0" # Set GCM DATA_source to "calib" profile.tags.meta["DATA_source"] = "calib" # Add instrument profile.tags.meta["MEASUREMENT_device"] = self.get_instrument_name().lower() spec_prefixes = "CMF_,DATA_,MEASUREMENT_,OPENICC_" # Add screen brightness if applicable if sys.platform not in ("darwin", "win32") and dbus_session: try: proxy = dbus_session.get_object("org.gnome.SettingsDaemon", "/org/gnome/SettingsDaemon/Power") iface = dbus.Interface(proxy, dbus_interface="org.gnome.SettingsDaemon.Power.Screen") brightness = iface.GetPercentage() except dbus.exceptions.DBusException: pass else: profile.tags.meta["SCREEN_brightness"] = str(brightness) spec_prefixes += ",SCREEN_" # Set device ID device_id = self.get_device_id(quirk=True) if device_id: profile.tags.meta["MAPPING_device_id"] = device_id spec_prefixes += ",MAPPING_" prefixes = (profile.tags.meta.getvalue("prefix", "", None) or spec_prefixes).split(",") for prefix in spec_prefixes.split(","): if not prefix in prefixes: prefixes.append(prefix) profile.tags.meta["prefix"] = ",".join(prefixes) if (avg, peak, rms) != (None, ) * 3: # Make sure meta tag exists if not "meta" in profile.tags: profile.tags.meta = ICCP.DictType() # Update meta prefix prefixes = (profile.tags.meta.getvalue("prefix", "", None) or "ACCURACY_").split(",") if not "ACCURACY_" in prefixes: prefixes.append("ACCURACY_") profile.tags.meta["prefix"] = ",".join(prefixes) # Add error info if avg is not None: profile.tags.meta["ACCURACY_dE76_avg"] = avg if peak is not None: profile.tags.meta["ACCURACY_dE76_max"] = peak if rms is not None: profile.tags.meta["ACCURACY_dE76_rms"] = rms profile.set_gamut_metadata(gamut_volume, gamut_coverage) # Set default rendering intent if ("B2A0" in profile.tags and ("B2A1" in profile.tags or "B2A2" in profile.tags)): profile.intent = {"p": 0, "r": 1, "s": 2, "a": 3}[getcfg("gamap_default_intent")] # Calculate profile ID profile.calculateID() try: profile.write() except Exception, exception: return exception return True def update_profile_B2A(self, profile): # Use reverse A2B interpolation to generate B2A table clutres = getcfg("profile.b2a.hires.size") linebuffered_logfiles = [] if sys.stdout.isatty(): linebuffered_logfiles.append(safe_print) else: linebuffered_logfiles.append(log) if self.sessionlogfile: linebuffered_logfiles.append(self.sessionlogfile) logfiles = Files([LineBufferedStream( FilteredStream(Files(linebuffered_logfiles), enc, discard="", linesep_in="\n", triggers=[])), self.recent, self.lastmsg]) tables = [1] self.log("-" * 80) # Add perceptual tables if not present if "A2B0" in profile.tags and not "A2B1" in profile.tags: if not isinstance(profile.tags.A2B0, ICCP.LUT16Type): self.log("%s: Can't process non-LUT16Type A2B0 table" % appname) return [] try: # Copy A2B0 logfiles.write("Generating A2B1 by copying A2B0\n") profile.tags.A2B1 = profile.tags.A2B0 if "B2A0" in profile.tags: # Copy B2A0 B2A0 = profile.tags.B2A0 profile.tags.B2A1 = B2A1 = ICCP.LUT16Type() B2A1.matrix = [] for row in B2A0.matrix: B2A1.matrix.append(list(row)) B2A1.input = [] B2A1.output = [] for table in ("input", "output"): for channel in getattr(B2A0, table): getattr(B2A1, table).append(list(channel)) B2A1.clut = [] for block in B2A0.clut: B2A1.clut.append([]) for row in block: B2A1.clut[-1].append(list(row)) except Exception, exception: return exception if not "A2B2" in profile.tags: # Argyll always creates a complete set of A2B / B2A tables if # colprof -s (perceptual) or -S (perceptual and saturation) is used, # so we can assume that if A2B2 is not present then it is safe to # re-generate B2A0 because it was not created by Argyll CMS. tables.append(0) # Invert A2B tables if present. Always invert colorimetric A2B table. results = [] bpc_applied = False filename = profile.fileName for tableno in tables: if "A2B%i" % tableno in profile.tags: if ("B2A%i" % tableno in profile.tags and profile.tags["B2A%i" % tableno] in results): continue if not isinstance(profile.tags["A2B%i" % tableno], ICCP.LUT16Type): self.log("%s: Can't process non-LUT16Type A2B%i table" % (appname, tableno)) continue # Check if we want to apply BPC bpc = tableno != 1 if (bpc and profile.tags["A2B%i" % tableno].clut[0][0] != [0, 0, 0]): # Need to apply BPC. Use temporary copy of A2B. otables = {} table = ICCP.LUT16Type(profile=profile) for i in xrange(3): if "A2B%i" % i in profile.tags: otables[i] = profile.tags["A2B%i" % i] profile.tags["A2B%i" % i] = table otable = otables[tableno] # Copy table table.matrix = [] for row in otable.matrix: table.matrix.append(list(row)) table.input = [] table.output = [] for curves in ("input", "output"): for channel in getattr(otable, curves): getattr(table, curves).append(list(channel)) table.clut = [] for block in otable.clut: table.clut.append([]) for row in block: table.clut[-1].append(list(row)) logfiles.write("Applying BPC to temporary A2B tables...\n") table.apply_bpc() bpc_applied = True elif bpc: # BPC not needed, copy existing B2A profile.tags["B2A%i" % tableno] = results[0] return results if not filename or not os.path.isfile(filename) or bpc_applied: # Write profile to temp dir tempdir = self.create_tempdir() if isinstance(tempdir, Exception): return tempdir fd, profile.fileName = tempfile.mkstemp(profile_ext, dir=tempdir) stream = os.fdopen(fd, "wb") profile.write(stream) stream.close() temp = True else: temp = False # Invert A2B try: result = self.generate_B2A_from_inverse_table(profile, clutres, "A2B", tableno, bpc, logfiles, filename) except (Error, Info), exception: return exception except Exception, exception: self.log(traceback.format_exc()) return exception else: if result: results.append(profile.tags["B2A%i" % tableno]) else: return False finally: if bpc_applied: logfiles.write("Restoring original A2B tables...\n") for i, otable in otables.iteritems(): profile.tags["A2B%i" % i] = otable if temp: os.remove(profile.fileName) if self.tempdir and not os.listdir(self.tempdir): self.wrapup(False) profile.fileName = filename return results def isalive(self, subprocess=None): """ Check if subprocess is still alive """ if not subprocess: subprocess = getattr(self, "subprocess", None) return (subprocess and ((hasattr(subprocess, "poll") and subprocess.poll() is None) or (hasattr(subprocess, "isalive") and subprocess.isalive()))) def is_working(self): """ Check if any Worker instance is busy. Return True or False. """ for worker in workers: if not getattr(worker, "finished", True): return True return False def log(self, *args, **kwargs): """ Log to global logfile and session logfile (if any) """ msg = " ".join(safe_basestring(arg) for arg in args) fn = kwargs.get("fn", safe_print) fn(msg) if self.sessionlogfile: self.sessionlogfile.write(msg + "\n") def start_measurement(self, consumer, apply_calibration=True, progress_msg="", resume=False, continue_next=False): """ Start a measurement and use a progress dialog for progress information """ self.start(consumer, self.measure, wkwargs={"apply_calibration": apply_calibration}, progress_msg=progress_msg, resume=resume, continue_next=continue_next, pauseable=True) def start_calibration(self, consumer, remove=False, progress_msg="", resume=False, continue_next=False): """ Start a calibration and use a progress dialog for progress information """ self.start(consumer, self.calibrate, wkwargs={"remove": remove}, progress_msg=progress_msg, resume=resume, continue_next=continue_next, interactive_frame="adjust", pauseable=True) def madtpg_connect(self): if not hasattr(self, "madtpg"): if sys.platform == "win32" and getcfg("madtpg.native"): # Using native implementation (madHcNet32.dll) self.madtpg = madvr.MadTPG() else: # Using madVR net-protocol pure python implementation self.madtpg = madvr.MadTPG_Net() self.madtpg.debug = verbose return self.madtpg.connect(method2=madvr.CM_StartLocalInstance) def measure(self, apply_calibration=True): """ Measure the configured testchart """ precond_ti3 = None auto = getcfg("testchart.auto_optimize") or 7 if getcfg("testchart.file") == "auto" and auto > 4: # Testchart auto-optimization # Create optimized testchart on-the-fly. To do this, create a # simple profile for preconditioning if config.get_display_name() == "Untethered": return Error(lang.getstr("testchart.auto_optimize.untethered.unsupported")) # Use small LUT testchart setcfg("testchart.file", get_data_path("ti1/d3-e4-s13-g37-m4-b4-f0.ti1")) cmd, args = self.prepare_dispread(apply_calibration) setcfg("testchart.file", "auto") if not isinstance(cmd, Exception): # Measure testchart result = self.exec_cmd(cmd, args) if not isinstance(result, Exception) and result: # Create preconditioning profile self.pauseable = False basename = args[-1] precond_ti3 = CGATS.CGATS(basename + ".ti3") cmd, args = get_argyll_util("colprof"), ["-v", "-qm", "-ax", "-bn", basename] result = self.exec_cmd(cmd, args) if (not isinstance(result, Exception) and result and getcfg("testchart.auto_optimize.fix_zero_blackpoint")): # Hmm. Some users have reported targen hanging, and I # couldn't reproduce it unless I used MinGW (32-bit) to # compile Argyll 1.7b (2015-03-06) development code # and a preconditioning profile with zero blackpoint. self.log("Pre-conditioning zero black point fix enabled") try: profile = ICCP.ICCProfile(basename + profile_ext) except Exception, exception: result = exception else: profchanged = False if isinstance(profile.tags.get("A2B0"), ICCP.LUT16Type): # Make sure blackpoint isn't zero if profile.tags.A2B0.clut[0][0] == [0, 0, 0]: profile.tags.A2B0.apply_bpc((1.0 / 65535, ) * 3) profchanged = True elif (isinstance(profile.tags.get("rTRC"), ICCP.CurveType) and isinstance(profile.tags.get("gTRC"), ICCP.CurveType) and isinstance(profile.tags.get("bTRC"), ICCP.CurveType)): # Make sure blackpoint isn't zero for channel in "rgb": if profile.tags[channel + "TRC"][0] == 0: profile.tags[channel + "TRC"].apply_bpc(1.0 / 65535) profchanged = True if profchanged: try: profile.write() except Exception, exception: result = exception self.log("Pre-conditioning zero black point fix applied") if not isinstance(result, Exception) and result: # Create optimized testchart if getcfg("use_fancy_progress"): # Fade out animation/sound self.cmdname = get_argyll_utilname("targen") # Allow time for fade out sleep(4) s = min(auto, 11) * 4 - 3 g = s * 3 - 2 f = get_total_patches(4, 4, s, g, auto, auto, 0) cmd, args = (get_argyll_util("targen"), ["-v", "-d3", "-e4", "-s%i" % s, "-g%i" % g, "-m0", "-f%i" % f, "-A1.0"]) if self.argyll_version >= [1, 1]: args.append("-G") if self.argyll_version >= [1, 3, 3]: args.append("-N0.5") if self.argyll_version >= [1, 6]: args.extend(["-B4", "-b0"]) if self.argyll_version >= [1, 6, 2]: args.append("-V1.6") args.extend(["-c", basename + profile_ext, basename]) result = self.exec_cmd(cmd, args) self.pauseable = True else: result = cmd else: result = True if getcfg("testchart.file") == "auto" and auto < 5: # Use pre-baked testchart if auto == 3: testchart = "ti1/d3-e4-s0-g25-m3-b3-f0-crossover.ti1" else: testchart = "ti1/d3-e4-s0-g49-m3-b3-f0-crossover.ti1" testchart_path = get_data_path(testchart) if testchart_path: setcfg("testchart.file", testchart_path) else: result = Error(lang.getstr("not_found", testchart)) if not isinstance(result, Exception) and result: cmd, args = self.prepare_dispread(apply_calibration) else: cmd = result if not isinstance(cmd, Exception) and cmd: if config.get_display_name() == "Untethered": cmd, args2 = get_argyll_util("spotread"), ["-v", "-e"] if getcfg("extra_args.spotread").strip(): args2 += parse_argument_string(getcfg("extra_args.spotread")) result = self.add_measurement_features(args2, False, allow_nondefault_observer=is_ccxx_testchart()) if isinstance(result, Exception): return result else: args2 = args result = self.exec_cmd(cmd, args2) if not isinstance(result, Exception) and result: self.update_display_name_manufacturer(args[-1] + ".ti3") ti3 = args[-1] + ".ti3" if precond_ti3: # Add patches from preconditioning measurements ti3 = CGATS.CGATS(ti3) precond_data = precond_ti3.queryv1("DATA") data = ti3.queryv1("DATA") data_format = ti3.queryv1("DATA_FORMAT") # Get only RGB data data.parent.DATA_FORMAT = CGATS.CGATS() data.parent.DATA_FORMAT.key = "DATA_FORMAT" data.parent.DATA_FORMAT.parent = data data.parent.DATA_FORMAT.root = data.root data.parent.DATA_FORMAT.type = "DATA_FORMAT" for i, label in enumerate(("RGB_R", "RGB_G", "RGB_B")): data.parent.DATA_FORMAT[i] = label precond_data.parent.DATA_FORMAT = data.parent.DATA_FORMAT rgbdata = str(data) # Restore DATA_FORMAT data.parent.DATA_FORMAT = data_format # Collect all preconditioning point datasets not in data precond_data.vmaxlen = data.vmaxlen precond_datasets = [] for i, dataset in precond_data.iteritems(): if not str(dataset) in rgbdata: precond_datasets.append(dataset) if precond_datasets: # Insert preconditioned point datasets after first patch self.log("%s: Adding %i fixed points" % (appname, len(precond_datasets))) data.moveby1(1, len(precond_datasets)) for i, dataset in enumerate(precond_datasets): dataset.key = i + 1 dataset.parent = data dataset.root = data.root data[dataset.key] = dataset options = {"OBSERVER": get_cfg_option_from_args("observer", "-Q", args[:-1])} ti3 = add_keywords_to_cgats(ti3, options) ti3.write() else: result = cmd result2 = self.wrapup(not isinstance(result, UnloggedInfo) and result, isinstance(result, Exception) or not result) if isinstance(result2, Exception): if isinstance(result, Exception): result = Error(safe_unicode(result) + "\n\n" + safe_unicode(result2)) else: result = result2 return result def parse(self, txt): if not txt: return self.logger.info("%r" % txt) self.check_instrument_calibration(txt) self.check_instrument_place_on_screen(txt) self.check_instrument_sensor_position(txt) self.check_retry_measurement(txt) self.check_is_ambient_measuring(txt) self.check_spotread_result(txt) if self.cmdname in (get_argyll_utilname("dispcal"), get_argyll_utilname("dispread"), get_argyll_utilname("spotread")): if (self.cmdname == get_argyll_utilname("dispcal") and ", repeat" in txt.lower()): self.repeat = True elif ", ok" in txt.lower(): self.repeat = False if (re.search(r"Patch [2-9]\d* of ", txt, re.I) or (re.search(r"Patch \d+ of |The instrument can be removed from " "the screen", txt, re.I) and self.patch_count > 1) or ("Result is XYZ:" in txt and not isinstance(self.progress_wnd, UntetheredFrame))): if self.cmdname == get_argyll_utilname("dispcal") and self.repeat: if (getcfg("measurement.play_sound") and hasattr(self.progress_wnd, "sound_on_off_btn")): self.measurement_sound.safe_play() else: if (getcfg("measurement.play_sound") and (hasattr(self.progress_wnd, "sound_on_off_btn") or isinstance(self.progress_wnd, DisplayUniformityFrame))): self.commit_sound.safe_play() if hasattr(self.progress_wnd, "animbmp"): self.progress_wnd.animbmp.frame = 0 def setup_patterngenerator(self, logfile=None): if config.get_display_name() == "Prisma": patterngenerator = PrismaPatternGeneratorClient self.patterngenerator = patterngenerator( host=getcfg("patterngenerator.prisma.host"), port=getcfg("patterngenerator.prisma.port"), use_video_levels=getcfg("patterngenerator.prisma.use_video_levels"), logfile=logfile) else: # Resolve if getcfg("patterngenerator.resolve") == "LS": patterngenerator = ResolveLSPatternGeneratorServer else: patterngenerator = ResolveCMPatternGeneratorServer self.patterngenerator = patterngenerator( port=getcfg("patterngenerator.resolve.port"), use_video_levels=getcfg("patterngenerator.resolve.use_video_levels"), logfile=logfile) @Property def patterngenerator(): def fget(self): pgname = config.get_display_name() return self._patterngenerators.get(pgname) def fset(self, patterngenerator): pgname = config.get_display_name() self._patterngenerators[pgname] = patterngenerator return locals() def patterngenerator_send(self, rgb, raise_exceptions=False): """ Send RGB color to pattern generator """ if getattr(self, "abort_requested", False): return x, y, w, h, size = get_pattern_geometry() size = min(sum((w, h)) / 2.0, 1.0) if getcfg("measure.darken_background") or size == 1.0: bgrgb = (0, 0, 0) else: # Constant APL rgbl = sum([v * size for v in rgb]) bgrgb = [(1.0 - v * size) * (1.0 - size) for v in rgb] bgrgbl = sum(bgrgb) desired_apl = getcfg("patterngenerator.apl") apl = desired_apl * 3 bgrgb = [max(apl - max(rgbl - apl, 0.0), 0.0) / bgrgbl * v for v in bgrgb] self.log("%s: Sending RGB %.3f %.3f %.3f, background RGB %.3f %.3f %.3f, " "x %.4f, y %.4f, w %.4f, h %.4f" % ((appname, ) + tuple(rgb) + tuple(bgrgb) + (x, y, w, h))) try: self.patterngenerator.send(rgb, bgrgb, x=x, y=y, w=w, h=h) except Exception, exception: if raise_exceptions: raise else: self.exec_cmd_returnvalue = exception self.abort_subprocess() else: self.patterngenerator_sent_count += 1 self.log("%s: Patterngenerator sent count: %i" % (appname, self.patterngenerator_sent_count)) @Property def pauseable(): def fget(self): return self._pauseable def fset(self, pauseable): self._pauseable = pauseable self.pauseable_now = False return locals() def pause_continue(self): if not self.pauseable or not self.pauseable_now: return if (getattr(self.progress_wnd, "paused", False) and not getattr(self, "paused", False)): self.paused = True self.safe_send("\x1b") elif (not getattr(self.progress_wnd, "paused", False) and getattr(self, "paused", False)): self.paused = False self.safe_send(" ") def prepare_colprof(self, profile_name=None, display_name=None, display_manufacturer=None): """ Prepare a colprof commandline. All options are read from the user configuration. Profile name and display name can be ovverridden by passing the corresponding arguments. """ profile_save_path = self.create_tempdir() if not profile_save_path or isinstance(profile_save_path, Exception): return profile_save_path, None # Check directory and in/output file(s) result = check_create_dir(profile_save_path) if isinstance(result, Exception): return result, None if profile_name is None: profile_name = getcfg("profile.name.expanded") inoutfile = os.path.join(profile_save_path, make_argyll_compatible_path(profile_name)) if not os.path.exists(inoutfile + ".ti3"): return Error(lang.getstr("error.measurement.file_missing", inoutfile + ".ti3")), None if not os.path.isfile(inoutfile + ".ti3"): return Error(lang.getstr("file_notfile", inoutfile + ".ti3")), None # cmd = get_argyll_util("colprof") args = [] args.append("-v") # verbose args.append("-q" + getcfg("profile.quality")) args.append("-a" + getcfg("profile.type")) gamap_args = args if getcfg("profile.type") in ["l", "x", "X"]: if getcfg("gamap_saturation"): gamap = "S" elif getcfg("gamap_perceptual"): gamap = "s" else: gamap = None gamap_profile = None if gamap and getcfg("gamap_profile"): # CIECAM02 gamut mapping - perceptual and saturation tables # Only for L*a*b* LUT or if source profile is not a simple matrix # profile, otherwise create hires CIECAM02 tables with collink try: gamap_profile = ICCP.ICCProfile(getcfg("gamap_profile")) except ICCProfileInvalidError, exception: self.log(exception) return Error(lang.getstr("profile.invalid") + "\n" + getcfg("gamap_profile")) except IOError, exception: return exception if (getcfg("profile.type") != "l" and getcfg("profile.b2a.hires") and not "A2B0" in gamap_profile.tags and "rXYZ" in gamap_profile.tags and "gXYZ" in gamap_profile.tags and "bXYZ" in gamap_profile.tags): # Make a copy so we can store options without adding them # to actual colprof arguments gamap_args = [] gamap_profile = None gamap_args.append("-" + gamap) gamap_args.append(getcfg("gamap_profile")) gamap_args.append("-t" + getcfg("gamap_perceptual_intent")) if gamap == "S": gamap_args.append("-T" + getcfg("gamap_saturation_intent")) if getcfg("gamap_src_viewcond"): gamap_args.append("-c" + getcfg("gamap_src_viewcond")) if getcfg("gamap_out_viewcond"): gamap_args.append("-d" + getcfg("gamap_out_viewcond")) b2a_q = getcfg("profile.quality.b2a") if (getcfg("profile.b2a.hires") and getcfg("profile.type") in ("l", "x", "X") and not (gamap and gamap_profile)): # Disable B2A creation in colprof, B2A is handled # by A2B inversion code b2a_q = "n" if b2a_q and b2a_q != getcfg("profile.quality"): args.append("-b" + b2a_q) args.append("-C") args.append(getcfg("copyright").encode("ASCII", "asciize")) if getcfg("extra_args.colprof").strip(): args += parse_argument_string(getcfg("extra_args.colprof")) options_dispcal = None if "-d3" in self.options_targen: # only add display desc and dispcal options if creating RGB profile options_dispcal = self.options_dispcal if len(self.displays): args.extend( self.update_display_name_manufacturer(inoutfile + ".ti3", display_name, display_manufacturer, write=False)) self.options_colprof = list(args) if gamap_args is not args: self.options_colprof.extend(gamap_args) args.append("-D") args.append(profile_name) args.append(inoutfile) # Add dispcal and colprof arguments to ti3 ti3 = add_options_to_ti3(inoutfile + ".ti3", options_dispcal, self.options_colprof) if ti3: color_rep = (ti3.queryv1("COLOR_REP") or "").split("_") # Prepare ChromaticityType tag colorants = ti3.get_colorants() if colorants and not None in colorants: chrm = ICCP.ChromaticityType() chrm.type = 0 for colorant in colorants: if color_rep[1] == "LAB": XYZ = colormath.Lab2XYZ(colorant["LAB_L"], colorant["LAB_A"], colorant["LAB_B"]) else: XYZ = (colorant["XYZ_X"], colorant["XYZ_Y"], colorant["XYZ_Z"]) chrm.channels.append(colormath.XYZ2xyY(*XYZ)[:-1]) with open(inoutfile + ".chrm", "wb") as blob: blob.write(chrm.tagData) # Black point compensation ti3[0].add_keyword("USE_BLACK_POINT_COMPENSATION", "YES" if getcfg("profile.black_point_compensation") else "NO") # Hires B2A with optional smoothing ti3[0].add_keyword("HIRES_B2A", "YES" if getcfg("profile.b2a.hires") else "NO") ti3[0].add_keyword("HIRES_B2A_SIZE", getcfg("profile.b2a.hires.size")) ti3[0].add_keyword("SMOOTH_B2A", "YES" if getcfg("profile.b2a.hires.smooth") else "NO") # Display update delay if getcfg("measure.override_min_display_update_delay_ms"): ti3[0].add_keyword("MIN_DISPLAY_UPDATE_DELAY_MS", getcfg("measure.min_display_update_delay_ms")) # Display settle time multiplier if getcfg("measure.override_display_settle_time_mult"): ti3[0].add_keyword("DISPLAY_SETTLE_TIME_MULT", getcfg("measure.display_settle_time_mult")) # Remove AUTO_OPTIMIZE if ti3[0].queryv1("AUTO_OPTIMIZE"): ti3[0].remove_keyword("AUTO_OPTIMIZE") # Add 3D LUT options if set, else remove them for keyword, cfgname in {"3DLUT_SOURCE_PROFILE": "3dlut.input.profile", "3DLUT_GAMMA": "3dlut.trc_gamma", "3DLUT_DEGREE_OF_BLACK_OUTPUT_OFFSET": "3dlut.trc_output_offset", "3DLUT_INPUT_ENCODING": "3dlut.encoding.input", "3DLUT_OUTPUT_ENCODING": "3dlut.encoding.output", "3DLUT_GAMUT_MAPPING_MODE": "3dlut.gamap.use_b2a", "3DLUT_RENDERING_INTENT": "3dlut.rendering_intent", "3DLUT_FORMAT": "3dlut.format", "3DLUT_SIZE": "3dlut.size", "3DLUT_INPUT_BITDEPTH": "3dlut.bitdepth.input", "3DLUT_OUTPUT_BITDEPTH": "3dlut.bitdepth.output", "3DLUT_APPLY_CAL": "3dlut.output.profile.apply_cal"}.iteritems(): if getcfg("3dlut.create"): value = getcfg(cfgname) if cfgname == "3dlut.gamap.use_b2a": if value: value = "g" else: value = "G" elif cfgname == "3dlut.trc_gamma": if getcfg("3dlut.trc_gamma_type") == "B": value = -value ti3[0].add_keyword(keyword, safe_str(value, "UTF-7")) elif keyword in ti3[0]: ti3[0].remove_keyword(keyword) data = ti3[0].get("DATA") if len(color_rep) == 2 and data: # Check for XYZ/Lab = 0 readings query = {} for channel in color_rep[1]: query[color_rep[1] + "_" + channel] = 0 device_labels = [] for channel in color_rep[0]: device_labels.append(color_rep[0] + "_" + channel) zeros = data.queryi(query) errors = [] remove = [] for key in zeros.keys(): sample = zeros[key] device_values = [sample[label] for label in device_labels] device_sum = 0 for value in device_values: if value >= 5: # Error on device values >= 5 errors.append(sample) self.log("Warning: Sample ID %i has %s = 0 and %s >= 5%%! (%s)" % (sample.SAMPLE_ID, color_rep[1], color_rep[0], " ".join(str(sample.queryv1(device_labels)).split()))) device_sum = 0 break device_sum += value if not device_sum: # Skip device black and device values >= 5 continue # Queue sample for removal remove.insert(0, sample) self.log("Removed sample ID %i with %s = 0 and %s < 5%% (%s)" % (sample.SAMPLE_ID, color_rep[1], color_rep[0], " ".join(str(sample.queryv1(device_labels)).split()))) for sample in remove: # Remove sample data.pop(sample) ti3.write() return cmd, args def prepare_dispcal(self, calibrate=True, verify=False, dry_run=False): """ Prepare a dispcal commandline. All options are read from the user configuration. You can choose if you want to calibrate and/or verify by passing the corresponding arguments. """ cmd = get_argyll_util("dispcal") args = [] args.append("-v2") # verbose if getcfg("argyll.debug"): args.append("-D8") result = self.add_measurement_features(args, allow_nondefault_observer=True) if isinstance(result, Exception): return result, None if calibrate: if getcfg("trc"): args.append("-q" + getcfg("calibration.quality")) profile_save_path = self.create_tempdir() if not profile_save_path or isinstance(profile_save_path, Exception): return profile_save_path, None # Check directory and in/output file(s) result = check_create_dir(profile_save_path) if isinstance(result, Exception): return result, None inoutfile = os.path.join(profile_save_path, make_argyll_compatible_path(getcfg("profile.name.expanded"))) if getcfg("profile.update") or \ self.dispcal_create_fast_matrix_shaper: args.append("-o") if getcfg("calibration.update") and not dry_run: cal = getcfg("calibration.file", False) calcopy = os.path.join(inoutfile + ".cal") filename, ext = os.path.splitext(cal) ext = ".cal" cal = filename + ext if ext.lower() == ".cal": result = check_cal_isfile(cal) if isinstance(result, Exception): return result, None if not result: return None, None if not os.path.exists(calcopy): try: # Copy cal to profile dir shutil.copyfile(cal, calcopy) except Exception, exception: return Error(lang.getstr("error.copy_failed", (cal, calcopy)) + "\n\n" + safe_unicode(exception)), None result = check_cal_isfile(calcopy) if isinstance(result, Exception): return result, None if not result: return None, None cal = calcopy else: rslt = extract_fix_copy_cal(cal, calcopy) if isinstance(rslt, ICCP.ICCProfileInvalidError): return Error(lang.getstr("profile.invalid") + "\n" + cal), None elif isinstance(rslt, Exception): return Error(lang.getstr("cal_extraction_failed") + "\n" + cal + "\n\n" + unicode(str(rslt), enc, "replace")), None if not isinstance(rslt, list): return None, None if getcfg("profile.update"): profile_path = os.path.splitext( getcfg("calibration.file", False))[0] + profile_ext result = check_profile_isfile(profile_path) if isinstance(result, Exception): return result, None if not result: return None, None profilecopy = os.path.join(inoutfile + profile_ext) if not os.path.exists(profilecopy): try: # Copy profile to profile dir shutil.copyfile(profile_path, profilecopy) except Exception, exception: return Error(lang.getstr("error.copy_failed", (profile_path, profilecopy)) + "\n\n" + safe_unicode(exception)), None result = check_profile_isfile(profilecopy) if isinstance(result, Exception): return result, None if not result: return None, None args.append("-u") if calibrate or verify: if calibrate and not \ getcfg("calibration.interactive_display_adjustment"): # Skip interactive display adjustment args.append("-m") whitepoint_colortemp = getcfg("whitepoint.colortemp", False) whitepoint_x = getcfg("whitepoint.x", False) whitepoint_y = getcfg("whitepoint.y", False) if whitepoint_colortemp or None in (whitepoint_x, whitepoint_y): whitepoint = getcfg("whitepoint.colortemp.locus") if whitepoint_colortemp: whitepoint += str(whitepoint_colortemp) args.append("-" + whitepoint) else: args.append("-w%s,%s" % (whitepoint_x, whitepoint_y)) luminance = getcfg("calibration.luminance", False) if luminance: args.append("-b%s" % luminance) if getcfg("trc"): args.append("-" + getcfg("trc.type") + str(getcfg("trc"))) args.append("-f%s" % getcfg("calibration.black_output_offset")) if bool(int(getcfg("calibration.ambient_viewcond_adjust"))): args.append("-a%s" % getcfg("calibration.ambient_viewcond_adjust.lux")) if not getcfg("calibration.black_point_correction.auto"): args.append("-k%s" % getcfg("calibration.black_point_correction")) if defaults["calibration.black_point_rate.enabled"] and \ float(getcfg("calibration.black_point_correction")) < 1: black_point_rate = getcfg("calibration.black_point_rate") if black_point_rate: args.append("-A%s" % black_point_rate) black_luminance = getcfg("calibration.black_luminance", False) if black_luminance: args.append("-B%f" % black_luminance) elif (not (getcfg("calibration.black_point_correction.auto") or getcfg("calibration.black_point_correction")) and defaults["calibration.black_point_hack"]): # Forced black point hack # (Argyll CMS 1.7b 2014-12-22) # Always use this if no black luminance or black point hue # correction specified. The rationale is that a reasonably good # quality digitally driven display should have no "dead zone" # above zero device input if set up correctly. Using this option # with a display that is not well behaved may result in a loss # of shadow detail. args.append("-b") if verify: if calibrate and type(verify) == int: args.append("-e%s" % verify) # Verify final computed curves elif self.argyll_version >= [1, 6]: args.append("-z") # Verify current curves else: args.append("-E") # Verify current curves if getcfg("extra_args.dispcal").strip(): args += parse_argument_string(getcfg("extra_args.dispcal")) if (config.get_display_name() == "Resolve" or (config.get_display_name() == "Prisma" and not defaults["patterngenerator.prisma.argyll"])): # Substitute actual measurement frame dimensions self.options_dispcal = map(lambda arg: re.sub("^-[Pp]1,1,0.01$", "-P" + getcfg("dimensions.measureframe"), arg), args) # Re-add -F (darken background) so it can be set when loading settings if getcfg("measure.darken_background"): self.options_dispcal.append("-F") else: self.options_dispcal = list(args) if calibrate: args.append(inoutfile) return cmd, args def prepare_dispread(self, apply_calibration=True): """ Prepare a dispread commandline. All options are read from the user configuration. You can choose if you want to apply the current calibration, either the previously by dispcal created one by passing in True, by passing in a valid path to a .cal file, or by passing in None (current video card gamma table). """ self.lastcmdname = get_argyll_utilname("dispread") profile_save_path = self.create_tempdir() if not profile_save_path or isinstance(profile_save_path, Exception): return profile_save_path, None # Check directory and in/output file(s) result = check_create_dir(profile_save_path) if isinstance(result, Exception): return result, None inoutfile = os.path.join(profile_save_path, make_argyll_compatible_path(getcfg("profile.name.expanded"))) if not os.path.exists(inoutfile + ".ti1"): filename, ext = os.path.splitext(getcfg("testchart.file")) result = check_file_isfile(filename + ext) if isinstance(result, Exception): return result, None try: if ext.lower() in (".icc", ".icm"): try: profile = ICCP.ICCProfile(filename + ext) except (IOError, ICCP.ICCProfileInvalidError), exception: return Error(lang.getstr("error.testchart.read", getcfg("testchart.file"))), None ti3 = StringIO(profile.tags.get("CIED", "") or profile.tags.get("targ", "")) elif ext.lower() == ".ti1": shutil.copyfile(filename + ext, inoutfile + ".ti1") else: # ti3 try: ti3 = open(filename + ext, "rU") except Exception, exception: return Error(lang.getstr("error.testchart.read", getcfg("testchart.file"))), None if ext.lower() != ".ti1": ti3_lines = [line.strip() for line in ti3] ti3.close() if not "CTI3" in ti3_lines: return Error(lang.getstr("error.testchart.invalid", getcfg("testchart.file"))), None ti1 = open(inoutfile + ".ti1", "w") ti1.write(ti3_to_ti1(ti3_lines)) ti1.close() except Exception, exception: return Error(lang.getstr("error.testchart.creation_failed", inoutfile + ".ti1") + "\n\n" + safe_unicode(exception)), None if apply_calibration is not False: if apply_calibration is True: # Always a .cal file in that case cal = os.path.join(getcfg("profile.save_path"), getcfg("profile.name.expanded"), getcfg("profile.name.expanded")) + ".cal" elif apply_calibration is None: # Use current videoLUT cal = inoutfile + ".cal" result = self.save_current_video_lut(self.get_display(), cal) if (isinstance(result, Exception) and not isinstance(result, UnloggedInfo)): return result, None else: cal = apply_calibration # can be .cal or .icc / .icm calcopy = inoutfile + ".cal" filename, ext = os.path.splitext(cal) if getcfg("dry_run"): options_dispcal = [] elif ext.lower() == ".cal": result = check_cal_isfile(cal) if isinstance(result, Exception): return result, None if not result: return None, None # Get dispcal options if present try: options_dispcal = get_options_from_cal(cal)[0] except (IOError, CGATS.CGATSInvalidError, CGATS.CGATSInvalidOperationError, CGATS.CGATSKeyError, CGATS.CGATSTypeError, CGATS.CGATSValueError), exception: return exception, None if not os.path.exists(calcopy): try: # Copy cal to temp dir shutil.copyfile(cal, calcopy) except Exception, exception: return Error(lang.getstr("error.copy_failed", (cal, calcopy)) + "\n\n" + safe_unicode(exception)), None result = check_cal_isfile(calcopy) if isinstance(result, Exception): return result, None if not result: return None, None else: # .icc / .icm result = check_profile_isfile(cal) if isinstance(result, Exception): return result, None if not result: return None, None try: profile = ICCP.ICCProfile(filename + ext) except (IOError, ICCP.ICCProfileInvalidError), exception: profile = None if profile: ti3 = StringIO(profile.tags.get("CIED", "") or profile.tags.get("targ", "")) # Get dispcal options if present options_dispcal = get_options_from_profile(profile)[0] else: ti3 = StringIO("") ti3_lines = [line.strip() for line in ti3] ti3.close() if not "CTI3" in ti3_lines: return Error(lang.getstr("error.cal_extraction", (cal))), None try: tmpcal = open(calcopy, "w") tmpcal.write(extract_cal_from_ti3(ti3_lines)) tmpcal.close() except Exception, exception: return Error(lang.getstr("error.cal_extraction", (cal)) + "\n\n" + safe_unicode(exception)), None cal = calcopy if options_dispcal: self.options_dispcal = ["-" + arg for arg in options_dispcal] # # Make sure any measurement options are present if not self.options_dispcal: self.prepare_dispcal(dry_run=True) # Special case -X because it can have a separate filename argument if "-X" in self.options_dispcal: index = self.options_dispcal.index("-X") if (len(self.options_dispcal) > index + 1 and self.options_dispcal[index + 1][0] != "-"): self.options_dispcal = (self.options_dispcal[:index] + self.options_dispcal[index + 2:]) # Strip options we may override (basically all the stuff which can be # added by add_measurement_features. -X is repeated because it can # have a number instead of explicit filename argument, e.g. -X1) dispcal_override_args = ("-F", "-H", "-I", "-P", "-V", "-X", "-d", "-c", "-p", "-y") self.options_dispcal = filter(lambda arg: not arg[:2] in dispcal_override_args, self.options_dispcal) # Only add the dispcal extra args which may override measurement features dispcal_extra_args = parse_argument_string(getcfg("extra_args.dispcal")) for i, arg in enumerate(dispcal_extra_args): if not arg.startswith("-") and i > 0: # Assume option to previous arg arg = dispcal_extra_args[i - 1] if arg[:2] in dispcal_override_args: self.options_dispcal.append(dispcal_extra_args[i]) result = self.add_measurement_features(self.options_dispcal, ignore_display_name=True) if isinstance(result, Exception): return result, None cmd = get_argyll_util("dispread") args = [] args.append("-v") # verbose if getcfg("argyll.debug"): args.append("-D8") result = self.add_measurement_features(args, allow_nondefault_observer=is_ccxx_testchart()) if isinstance(result, Exception): return result, None if apply_calibration is not False: if (self.argyll_version >= [1, 3, 3] and (not self.has_lut_access() or not getcfg("calibration.use_video_lut"))): args.append("-K") else: args.append("-k") args.append(cal) if self.get_instrument_features().get("spectral"): args.append("-s") if getcfg("extra_args.dispread").strip(): args += parse_argument_string(getcfg("extra_args.dispread")) self.options_dispread = list(args) if getattr(self, "terminal", None) and isinstance(self.terminal, UntetheredFrame): result = self.set_terminal_cgats(inoutfile + ".ti1") if isinstance(result, Exception): return result, None return cmd, self.options_dispread + [inoutfile] def prepare_dispwin(self, cal=None, profile_path=None, install=True): """ Prepare a dispwin commandline. All options are read from the user configuration. If you pass in cal as True, it will try to load the current display profile's calibration. If cal is a path, it'll use that instead. If cal is False, it'll clear the current calibration. If cal is None, it'll try to load the calibration from a profile specified by profile_path. """ cmd = get_argyll_util("dispwin") args = [] args.append("-v") if getcfg("argyll.debug"): if self.argyll_version >= [1, 3, 1]: args.append("-D8") else: args.append("-E8") args.append("-d" + self.get_display()) if sys.platform != "darwin" or cal is False: # Mac OS X 10.7 Lion needs root privileges when clearing # calibration args.append("-c") if cal is True: args.append(self.get_dispwin_display_profile_argument( max(0, min(len(self.displays), getcfg("display.number")) - 1))) elif cal: result = check_cal_isfile(cal) if isinstance(result, Exception): return result, None if not result: return None, None args.append(cal) else: if cal is None: if not profile_path: profile_save_path = os.path.join( getcfg("profile.save_path"), getcfg("profile.name.expanded")) profile_path = os.path.join(profile_save_path, getcfg("profile.name.expanded") + profile_ext) result = check_profile_isfile(profile_path) if isinstance(result, Exception): return result, None if not result: return None, None try: profile = ICCP.ICCProfile(profile_path) except (IOError, ICCP.ICCProfileInvalidError), exception: return Error(lang.getstr("profile.invalid") + "\n" + profile_path), None if profile.profileClass != "mntr" or \ profile.colorSpace != "RGB": return Error(lang.getstr("profile.unsupported", (profile.profileClass, profile.colorSpace)) + "\n" + profile_path), None if install: if getcfg("profile.install_scope") != "u" and \ (((sys.platform == "darwin" or (sys.platform != "win32" and self.argyll_version >= [1, 1, 0])) and (os.geteuid() == 0 or which("sudo"))) or (sys.platform == "win32" and sys.getwindowsversion() >= (6, ) and self.argyll_version > [1, 1, 1])): # -S option is broken on Linux with current Argyll # releases args.append("-S" + getcfg("profile.install_scope")) else: # Make sure user profile dir exists # (e.g. on Mac OS X 10.9 Mavericks, it does not by # default) for profile_dir in reversed(iccprofiles_home): if os.path.isdir(profile_dir): break if not os.path.isdir(profile_dir): try: os.makedirs(profile_dir) except OSError, exception: return exception, None args.append("-I") # Always copy to temp dir so if a user accidentally tries # to install a profile from the location where it's already # installed (e.g. system32/spool/drivers/color) it doesn't # get nuked by dispwin tmp_dir = self.create_tempdir() if not tmp_dir or isinstance(tmp_dir, Exception): return tmp_dir, None # Check directory and in/output file(s) result = check_create_dir(tmp_dir) if isinstance(result, Exception): return result, None profile_name = os.path.basename(profile_path) if (sys.platform in ("win32", "darwin") or fs_enc.upper() not in ("UTF8", "UTF-8")) and \ re.search("[^\x20-\x7e]", profile_name): # Copy to temp dir and give unique ASCII-only name to # avoid profile install issues # profile name: 'display-.icc' profile_tmp_path = os.path.join(tmp_dir, "display" + self.get_display() + "-" + md5(profile.data).hexdigest() + profile_ext) else: profile_tmp_path = os.path.join(tmp_dir, profile_name) shutil.copyfile(profile_path, profile_tmp_path) profile_path = profile_tmp_path args.append(profile_path) return cmd, args def prepare_targen(self): """ Prepare a targen commandline. All options are read from the user configuration. """ path = self.create_tempdir() if not path or isinstance(path, Exception): return path, None # Check directory and in/output file(s) result = check_create_dir(path) if isinstance(result, Exception): return result, None inoutfile = os.path.join(path, "temp") cmd = get_argyll_util("targen") args = [] args.append('-v') args.append('-d3') args.append('-e%s' % getcfg("tc_white_patches")) if self.argyll_version >= [1, 6]: args.append('-B%s' % getcfg("tc_black_patches")) args.append('-s%s' % getcfg("tc_single_channel_patches")) args.append('-g%s' % getcfg("tc_gray_patches")) args.append('-m%s' % getcfg("tc_multi_steps")) if self.argyll_version >= [1, 6, 0]: args.append('-b%s' % getcfg("tc_multi_bcc_steps")) tc_algo = getcfg("tc_algo") if getcfg("tc_fullspread_patches") > 0: args.append('-f%s' % config.get_total_patches()) if tc_algo: args.append('-' + tc_algo) if tc_algo in ("i", "I"): args.append('-a%s' % getcfg("tc_angle")) if tc_algo == "": args.append('-A%s' % getcfg("tc_adaption")) if self.argyll_version >= [1, 3, 3]: args.append('-N%s' % getcfg("tc_neutral_axis_emphasis")) if (self.argyll_version == [1, 1, "RC1"] or self.argyll_version >= [1, 1]): args.append('-G') else: args.append('-f0') if getcfg("tc_precond") and getcfg("tc_precond_profile"): args.append('-c') args.append(getcfg("tc_precond_profile")) if getcfg("tc_filter"): args.append('-F%s,%s,%s,%s' % (getcfg("tc_filter_L"), getcfg("tc_filter_a"), getcfg("tc_filter_b"), getcfg("tc_filter_rad"))) if (self.argyll_version >= [1, 6, 2] and ("-c" in args or self.argyll_version >= [1, 6, 3])): args.append('-V%s' % (1 + getcfg("tc_dark_emphasis") * 3)) if self.argyll_version == [1, 1, "RC2"] or self.argyll_version >= [1, 1]: args.append('-p%s' % getcfg("tc_gamma")) if getcfg("extra_args.targen").strip(): # Disallow -d and -D as the testchart editor only supports # video RGB (-d3) args += filter(lambda arg: not arg.lower().startswith("-d"), parse_argument_string(getcfg("extra_args.targen"))) self.options_targen = list(args) args.append(inoutfile) return cmd, args def progress_handler(self, event): """ Handle progress dialog updates and react to Argyll CMS command output """ if getattr(self, "subprocess_abort", False) or \ getattr(self, "thread_abort", False): self.progress_wnd.Pulse(lang.getstr("aborting")) return percentage = None msg = self.recent.read(FilteredStream.triggers) lastmsg = self.lastmsg.read(FilteredStream.triggers).strip() warning = r"\D+: Warning -.*" msg = re.sub(warning, "", msg) lastmsg = re.sub(warning, "", lastmsg) # Filter for '=' so that 1% reading during calibration check # measurements doesn't trigger swapping from the interactive adjustment # to the progress window if re.match(r"\s*\d+%\s*(?:[^=]+)?$", lastmsg): # colprof, download progress try: percentage = int(self.lastmsg.read().split("%")[0]) except ValueError: pass elif re.match("Patch \\d+ of \\d+", lastmsg, re.I): # dispcal/dispread components = lastmsg.split() try: start = float(components[1]) end = float(components[3]) except ValueError: pass else: percentage = max(start - 1, 0) / end * 100 elif re.match("Added \\d+/\\d+", lastmsg, re.I): # targen components = lastmsg.lower().replace("added ", "").split("/") try: start = float(components[0]) end = float(components[1]) except ValueError: pass else: percentage = start / end * 100 else: iteration = re.search("It (\\d+):", msg) if iteration: # targen try: start = float(iteration.groups()[0]) except ValueError: pass else: end = 20 percentage = min(start, 20.0) / end * 100 lastmsg = "" if (percentage is not None and time() > self.starttime + 3 and self.progress_wnd is getattr(self, "terminal", None)): # We no longer need keyboard interaction, switch over to # progress dialog wx.CallAfter(self.swap_progress_wnds) if hasattr(self.progress_wnd, "progress_type"): if self.pauseable or getattr(self, "interactive_frame", "") == "ambient": # If pauseable, we assume it's a measurement progress_type = 1 # Measuring elif self.cmdname == get_argyll_utilname("targen"): progress_type = 2 # Generating test patches else: progress_type = 0 # Processing if self.progress_wnd.progress_type != progress_type: self.progress_wnd.set_progress_type(progress_type) if getattr(self.progress_wnd, "original_msg", None) and \ msg != self.progress_wnd.original_msg: # UGLY HACK: This 'safe_print' call fixes a GTK assertion and # segfault under Arch Linux when setting the window title. # This has a chance of throwing a IOError: [Errno 9] Bad file # descriptor under Windows, so check for wxGTK if "__WXGTK__" in wx.PlatformInfo: safe_print("") self.progress_wnd.SetTitle(self.progress_wnd.original_msg) self.progress_wnd.original_msg = None if percentage is not None: if "Setting up the instrument" in msg or \ "Commencing device calibration" in msg or \ "Commencing display calibration" in msg or \ "Calibration complete" in msg: self.recent.clear() msg = "" keepGoing, skip = self.progress_wnd.Update(max(min(percentage, 100), 0), msg + "\n" + lastmsg) elif re.match("\d+(?:\.\d+)? (?:[KM]iB)", lastmsg, re.I): keepGoing, skip = self.progress_wnd.Pulse("\n".join([msg, lastmsg])) else: if getattr(self.progress_wnd, "lastmsg", "") == msg or not msg: keepGoing, skip = self.progress_wnd.Pulse() else: if "Setting up the instrument" in lastmsg: msg = lang.getstr("instrument.initializing") elif "Created web server at" in msg: webserver = re.search("(http\:\/\/[^']+)", msg) if webserver: msg = (lang.getstr("webserver.waiting") + " " + webserver.groups()[0]) keepGoing, skip = self.progress_wnd.Pulse(msg) self.pause_continue() if hasattr(self.progress_wnd, "pause_continue"): if "read stopped at user request!" in lastmsg: self.progress_wnd.pause_continue.Enable() if self.progress_wnd.pause_continue.IsShown() != self.pauseable: self.progress_wnd.pause_continue.Show(self.pauseable) self.progress_wnd.Layout() if not keepGoing and not getattr(self, "abort_requested", False): # Only confirm abort if we are not currently doing interactive # display adjustment self.abort_subprocess(not isinstance(self._progress_wnd, DisplayAdjustmentFrame)) if self.finished is True: return if (self.progress_wnd.IsShownOnScreen() and not self.progress_wnd.IsActive() and (not getattr(self.progress_wnd, "dlg", None) or not self.progress_wnd.dlg.IsShownOnScreen()) and wx.GetApp().GetTopWindow() and wx.GetApp().GetTopWindow().IsShownOnScreen() and (wx.GetApp().IsActive() or (sys.platform == "darwin" and not self.activated))): for window in wx.GetTopLevelWindows(): if (window and window is not self.progress_wnd and isinstance(window, wx.Dialog) and window.IsShownOnScreen()): return self.activated = True self.progress_wnd.Raise() def progress_dlg_start(self, progress_title="", progress_msg="", parent=None, resume=False, fancy=True): """ Start a progress dialog, replacing existing one if present """ if self._progress_wnd and \ self.progress_wnd is getattr(self, "terminal", None): self.terminal.stop_timer() self.terminal.Hide() if self.finished is True: return pauseable = getattr(self, "pauseable", False) fancy = fancy and getcfg("use_fancy_progress") if self._progress_dlgs.get((self.show_remaining_time, self.cancelable, fancy)): self.progress_wnd = self._progress_dlgs[(self.show_remaining_time, self.cancelable, fancy)] # UGLY HACK: This 'safe_print' call fixes a GTK assertion and # segfault under Arch Linux when setting the window title # This has a chance of throwing a IOError: [Errno 9] Bad file # descriptor under Windows, so check for wxGTK if "__WXGTK__" in wx.PlatformInfo: safe_print("") self.progress_wnd.SetTitle(progress_title) if not resume or not self.progress_wnd.IsShown(): self.progress_wnd.reset() self.progress_wnd.Pulse(progress_msg) if hasattr(self.progress_wnd, "pause_continue"): self.progress_wnd.pause_continue.Show(pauseable) self.progress_wnd.Layout() self.progress_wnd.Resume() if not self.progress_wnd.IsShownOnScreen(): self.progress_wnd.place() self.progress_wnd.Show() else: style = wx.PD_SMOOTH | wx.PD_ELAPSED_TIME if self.show_remaining_time: style |= wx.PD_REMAINING_TIME if self.cancelable: style |= wx.PD_CAN_ABORT # Set maximum to 101 to prevent the 'cancel' changing to 'close' # when 100 is reached self._progress_dlgs[(self.show_remaining_time, self.cancelable, fancy)] = ProgressDialog(progress_title, progress_msg, maximum=101, parent=parent, handler=self.progress_handler, keyhandler=self.terminal_key_handler, pauseable=pauseable, style=style, start_timer=False, fancy=fancy) self.progress_wnd = self._progress_dlgs[(self.show_remaining_time, self.cancelable, fancy)] if hasattr(self.progress_wnd, "progress_type"): if pauseable or getattr(self, "interactive_frame", "") == "ambient": # If pauseable, we assume it's a measurement self.progress_wnd.progress_type = 1 # Measuring elif self.cmdname == get_argyll_utilname("targen"): self.progress_wnd.progress_type = 2 # Generating test patches else: self.progress_wnd.progress_type = 0 # Processing if not self.progress_wnd.timer.IsRunning(): self.progress_wnd.start_timer() self.progress_wnd.original_msg = progress_msg def quit_terminate_cmd(self): """ Forcefully abort the current subprocess. Try to gracefully exit first by sending common Argyll CMS abort keystrokes (ESC), forcefully terminate the subprocess if not reacting """ # If running wexpect.spawn in a thread under Windows, writing to # sys.stdout from another thread can fail sporadically with IOError 9 # 'Bad file descriptor', so don't use sys.stdout # Careful: Python 2.5 Producer objects don't have a name attribute if (hasattr(self, "thread") and self.thread.isAlive() and (not hasattr(currentThread(), "name") or currentThread().name != self.thread.name)): logfn = log else: logfn = safe_print subprocess = getattr(self, "subprocess", None) if self.isalive(subprocess): try: if self.measure_cmd and hasattr(subprocess, "send"): self.log("%s: Trying to end subprocess gracefully..." % appname, fn=logfn) try: if subprocess.after == "Current": # Stop measurement self.safe_send(" ") sleep(1) ts = time() while (self.isalive(subprocess) and self.subprocess == subprocess): self.safe_send("\x1b") if time() > ts + 9: break sleep(.5) except Exception, exception: self.log(traceback.format_exc(), fn=logfn) self.log("%s: Exception in quit_terminate_command: %s" % (appname, exception), fn=logfn) if self.isalive(subprocess): self.log("%s: Trying to terminate subprocess..." % appname, fn=logfn) subprocess.terminate() ts = time() while self.isalive(subprocess): if time() > ts + 3: break sleep(.25) if sys.platform != "win32" and self.isalive(subprocess): self.log("%s: Trying to terminate subprocess forcefully..." % appname, fn=logfn) if isinstance(subprocess, sp.Popen): subprocess.kill() else: subprocess.terminate(force=True) ts = time() while self.isalive(subprocess): if time() > ts + 3: break sleep(.25) if self.isalive(subprocess): self.log("...warning: couldn't terminate subprocess.", fn=logfn) else: self.log("...subprocess terminated.", fn=logfn) except Exception, exception: self.log(traceback.format_exc(), fn=logfn) self.log("%s: Exception in quit_terminate_command: %s" % (appname, exception), fn=logfn) subprocess_isalive = self.isalive(subprocess) if (subprocess_isalive or (hasattr(self, "thread") and not self.thread.isAlive())): # We don't normally need this as closing of the progress window is # handled by _generic_consumer(), but there are two cases where it # is desirable to have this 'safety net': # 1. The user aborted a running task, but we couldn't terminate the # associated subprocess. In that case, we have a lingering # subprocess which is problematic but we can't do anything about # it. Atleast we need to give control back to the user by closing # the progress window so he can interact with the application # and doesn't have to resort to forecfully terminate it. # 2. We started a thread with continue_next=True, which then exited # without returning an error, yet not the result we were looking # for, so we never started the next thread with resume=True, but # we forgot to call stop_progress() exlicitly. This should never # happen if we design our result consumer correctly to handle # this particular case, but we need to make sure the user can # close the progress window in case we mess up. if hasattr(self, "thread") and not self.thread.isAlive(): wx.CallAfter(self.stop_progress) if subprocess_isalive: wx.CallAfter(show_result_dialog, Warning("Couldn't terminate %s. Please try to end " "it manually before continuing to use %s. " "If you can not terminate %s, restarting " "%s may also help. Apologies for the " "inconvenience." % (self.cmd, appname, self.cmd, appname)), self.owner) if self.patterngenerator: self.patterngenerator.listening = False return not subprocess_isalive def report(self, report_calibrated=True): """ Report on calibrated or uncalibrated display device response """ cmd, args = self.prepare_dispcal(calibrate=False) if isinstance(cmd, Exception): return cmd if args: if report_calibrated: args.append("-r") else: args.append("-R") return self.exec_cmd(cmd, args, capture_output=True, skip_scripts=True) def reset_cal(self): cmd, args = self.prepare_dispwin(False) result = self.exec_cmd(cmd, args, capture_output=True, skip_scripts=True, silent=False) return result def safe_send(self, bytes): self.send_buffer = bytes return True def _safe_send(self, bytes, retry=3, obfuscate=False): """ Safely send a keystroke to the current subprocess """ for i in xrange(0, retry): if obfuscate: logbytes = "***" else: logbytes = bytes self.logger.info("Sending key(s) %r (%i)" % (logbytes, i + 1)) try: wrote = self.subprocess.send(bytes) except Exception, exception: self.logger.exception("Exception: %s" % safe_unicode(exception)) else: if wrote == len(bytes): return True sleep(.25) return False def save_current_video_lut(self, display_no, outfilename, interpolate_to_256=True, silent=False): """ Save current videoLUT, optionally interpolating to n entries """ result = None if (self.argyll_version[0:3] > [1, 1, 0] or (self.argyll_version[0:3] == [1, 1, 0] and not "Beta" in self.argyll_version_string)): cmd, args = (get_argyll_util("dispwin"), ["-d%s" % display_no, "-s", outfilename]) result = self.exec_cmd(cmd, args, capture_output=True, skip_scripts=True, silent=silent) if (isinstance(result, Exception) and not isinstance(result, UnloggedInfo)): return result if not result: return Error(lang.getstr("calibration.load_error")) # Make sure there are 256 entries in the .cal file, otherwise dispwin # will complain and not be able to load it back in. # Under Windows, the GetDeviceGammaRamp API seems to enforce 256 entries # regardless of graphics card, but under Linux and Mac OS X there may be # more than 256 entries if the graphics card has greater than 8 bit # videoLUTs (e.g. Quadro and newer consumer cards) cgats = CGATS.CGATS(outfilename) data = cgats.queryv1("DATA") if data and len(data) != 256: safe_print("VideoLUT has %i entries, interpolating to 256" % len(data)) rgb = {"I": [], "R": [], "G": [], "B": []} for entry in data.itervalues(): for column in ("I", "R", "G", "B"): rgb[column].append(entry["RGB_" + column]) interp = {} for column in ("R", "G", "B"): interp[column] = colormath.Interp(rgb["I"], rgb[column]) resized = CGATS.CGATS() data.parent.DATA = resized resized.key = 'DATA' resized.parent = data.parent resized.root = cgats resized.type = 'DATA' for i in xrange(256): entry = {"RGB_I": i / 255.0} for column in ("R", "G", "B"): entry["RGB_" + column] = interp[column](entry["RGB_I"]) resized.add_data(entry) cgats.write() return result def set_argyll_version(self, name, silent=False, cfg=False): self.set_argyll_version_from_string(get_argyll_version_string(name, silent), cfg) def set_argyll_version_from_string(self, argyll_version_string, cfg=True): self.argyll_version_string = argyll_version_string if cfg: setcfg("argyll.version", argyll_version_string) writecfg() self.argyll_version = parse_argyll_version_string(argyll_version_string) def set_terminal_cgats(self, cgats_filename): try: self.terminal.cgats = CGATS.CGATS(cgats_filename) except (IOError, CGATS.CGATSInvalidError, CGATS.CGATSInvalidOperationError, CGATS.CGATSKeyError, CGATS.CGATSTypeError, CGATS.CGATSValueError), exception: return exception def argyll_support_file_exists(self, name): """ Check if named file exists in any of the known Argyll support locations valid for the chosen Argyll CMS version. """ if sys.platform != "darwin": paths = [defaultpaths.appdata] + defaultpaths.commonappdata else: paths = [defaultpaths.library_home, defaultpaths.library] searchpaths = [] if self.argyll_version >= [1, 5, 0]: if sys.platform != "darwin": searchpaths.extend(os.path.join(dir_, "ArgyllCMS", name) for dir_ in paths) else: searchpaths.extend(os.path.join(dir_, "ArgyllCMS", name) for dir_ in [defaultpaths.appdata, defaultpaths.library]) searchpaths.extend(os.path.join(dir_, "color", name) for dir_ in paths) for searchpath in searchpaths: if os.path.isfile(searchpath): return True return False def spyder2_firmware_exists(self): """ Check if the Spyder 2 firmware file exists in any of the known locations valid for the chosen Argyll CMS version. """ if self.argyll_version < [1, 2, 0]: spyd2en = get_argyll_util("spyd2en") if not spyd2en: return False return os.path.isfile(os.path.join(os.path.dirname(spyd2en), "spyd2PLD.bin")) else: return self.argyll_support_file_exists("spyd2PLD.bin") def spyder4_cal_exists(self): """ Check if the Spyder4/5 calibration file exists in any of the known locations valid for the chosen Argyll CMS version. """ if self.argyll_version < [1, 3, 6]: # We couldn't use it even if it exists return False return self.argyll_support_file_exists("spyd4cal.bin") def start(self, consumer, producer, cargs=(), ckwargs=None, wargs=(), wkwargs=None, progress_title=appname, progress_msg="", parent=None, progress_start=100, resume=False, continue_next=False, stop_timers=True, interactive_frame="", pauseable=False, cancelable=True, show_remaining_time=True, fancy=True): """ Start a worker process. Also show a progress dialog while the process is running. consumer consumer function. producer producer function. cargs consumer arguments. ckwargs consumer keyword arguments. wargs producer arguments. wkwargs producer keyword arguments. progress_title progress dialog title. Defaults to '%s'. progress_msg progress dialog message. Defaults to ''. progress_start show progress dialog after delay (ms). resume resume previous progress dialog (elapsed time etc). continue_next do not hide progress dialog after producer finishes. stop_timers stop the timers on the owner window if True interactive_frame "" or "uniformity" (selects the type of interactive window) pauseable Is the operation pauseable? (show pause button on progress dialog) cancelable Is the operation cancelable? (show cancel button on progress dialog) fancy Use fancy progress dialog with animated throbber & sound fx """ % appname if ckwargs is None: ckwargs = {} if wkwargs is None: wkwargs = {} while self.is_working(): sleep(.25) # wait until previous worker thread finishes if hasattr(self.owner, "stop_timers") and stop_timers: self.owner.stop_timers() if not parent: parent = self.owner if progress_start < 1: # Can't be zero! progress_start = 1 self.activated = False self.cmdname = None self.cmdrun = False self.finished = False self.instrument_calibration_complete = False if not resume: self.instrument_on_screen = False self.instrument_place_on_screen_msg = False self.instrument_sensor_position_msg = False self.interactive_frame = interactive_frame self.is_ambient_measuring = interactive_frame == "ambient" self.lastcmdname = None self.pauseable = pauseable self.paused = False self.cancelable = cancelable self.show_remaining_time = show_remaining_time self.fancy = fancy self.resume = resume self.subprocess_abort = False self.abort_requested = False self.starttime = time() self.thread_abort = False if fancy and (not self.interactive or interactive_frame not in ("uniformity", "untethered")): # Pre-init progress dialog bitmaps ProgressDialog.get_bitmaps(0) ProgressDialog.get_bitmaps(1) if self.interactive: self.progress_start_timer = wx.Timer() if progress_msg and progress_title == appname: progress_title = progress_msg if (config.get_display_name() == "Untethered" and interactive_frame != "uniformity"): interactive_frame = "untethered" if interactive_frame == "adjust": windowclass = DisplayAdjustmentFrame elif interactive_frame == "uniformity": windowclass = DisplayUniformityFrame elif interactive_frame == "untethered": windowclass = UntetheredFrame else: windowclass = SimpleTerminal if getattr(self, "terminal", None) and isinstance(self.terminal, windowclass): self.progress_wnd = self.terminal if not resume: if isinstance(self.progress_wnd, SimpleTerminal): self.progress_wnd.console.SetValue("") elif (isinstance(self.progress_wnd, DisplayAdjustmentFrame) or isinstance(self.progress_wnd, DisplayUniformityFrame) or isinstance(self.progress_wnd, UntetheredFrame)): self.progress_wnd.reset() self.progress_wnd.stop_timer() self.progress_wnd.Resume() self.progress_wnd.start_timer() # UGLY HACK: This 'safe_print' call fixes a GTK assertion and # segfault under Arch Linux when setting the window title safe_print("") if isinstance(self.progress_wnd, SimpleTerminal): self.progress_wnd.SetTitle(progress_title) self.progress_wnd.Show() if resume and isinstance(self.progress_wnd, SimpleTerminal): self.progress_wnd.console.ScrollLines( self.progress_wnd.console.GetNumberOfLines()) else: if getattr(self, "terminal", None): # Destroy the wx object so the decref'd python object can # be garbage collected self.terminal.Destroy() if interactive_frame == "adjust": self.terminal = DisplayAdjustmentFrame(parent, handler=self.progress_handler, keyhandler=self.terminal_key_handler) elif interactive_frame == "uniformity": self.terminal = DisplayUniformityFrame(parent, handler=self.progress_handler, keyhandler=self.terminal_key_handler) elif interactive_frame == "untethered": self.terminal = UntetheredFrame(parent, handler=self.progress_handler, keyhandler=self.terminal_key_handler) else: self.terminal = SimpleTerminal(parent, title=progress_title, handler=self.progress_handler, keyhandler=self.terminal_key_handler) self.terminal.worker = self self.progress_wnd = self.terminal else: if not progress_msg: progress_msg = lang.getstr("please_wait") # Show the progress dialog after a delay self.progress_start_timer = BetterCallLater(progress_start, self.progress_dlg_start, progress_title, progress_msg, parent, resume, fancy) if not hasattr(self, "_disabler"): self._disabler = BetterWindowDisabler(self.progress_wnds) # Can't use startWorker because we may need access to self.thread from # within thread, and startWorker does not return before the actual # thread starts running jobID = None sender = delayedresult.SenderCallAfter(self._generic_consumer, jobID, args=[consumer, continue_next] + list(cargs), kwargs=ckwargs) self.thread = delayedresult.Producer(sender, Producer(self, producer, continue_next), args=wargs, kwargs=wkwargs, name=jobID, group=None, daemon=False, senderArg=None, sendReturn=True) self.thread.start() return True def stop_progress(self): if hasattr(self, "_disabler"): del self._disabler if getattr(self, "progress_wnd", False): if getattr(self.progress_wnd, "dlg", None): if self.progress_wnd.dlg.IsShownOnScreen(): self.progress_wnd.dlg.EndModal(wx.ID_CANCEL) self.progress_wnd.dlg = None self.progress_wnd.stop_timer() self.progress_wnd.Hide() self.subprocess_abort = False self.thread_abort = False self.interactive = False def swap_progress_wnds(self): """ Swap the current interactive window with a progress dialog """ parent = self.terminal.GetParent() if isinstance(self.terminal, DisplayAdjustmentFrame): title = lang.getstr("calibration") else: title = self.terminal.GetTitle() self.progress_dlg_start(title, "", parent, self.resume, self.fancy) def terminal_key_handler(self, event): """ Key handler for the interactive window or progress dialog. """ keycode = None if event.GetEventType() in (wx.EVT_CHAR_HOOK.typeId, wx.EVT_KEY_DOWN.typeId): keycode = event.GetKeyCode() elif event.GetEventType() == wx.EVT_MENU.typeId: keycode = self.progress_wnd.id_to_keycode.get(event.GetId()) if keycode is not None and getattr(self, "subprocess", None) and \ hasattr(self.subprocess, "send"): keycode = keycodes.get(keycode, keycode) if keycode in (ord("\x1b"), ord("8"), ord("Q"), ord("q")): # exit self.abort_subprocess(True) return try: self.safe_send(chr(keycode)) except: pass def calculate_gamut(self, profile_path, intent="r", direction="f", order="n", compare_standard_gamuts=True): """ Calculate gamut, volume, and coverage % against sRGB and Adobe RGB. Return gamut volume (int, scaled to sRGB = 1.0) and coverage (dict) as tuple. """ if isinstance(profile_path, list): profile_paths = profile_path else: profile_paths = [profile_path] outname = os.path.splitext(profile_paths[0])[0] mods = [] if intent != "r": mods.append(intent) if direction != "f": mods.append(direction) if order != "n": mods.append(order) if mods: outname += " " + "".join(["[%s]" % mod.upper() for mod in mods]) gamut_volume = None gamut_coverage = {} # Create profile gamut and vrml det = getcfg("iccgamut.surface_detail") for i, profile_path in enumerate(profile_paths): if not profile_path: self.log("Warning: calculate_gamut(): No profile path %i" % i) continue result = self.exec_cmd(get_argyll_util("iccgamut"), ["-v", "-w", "-i" + intent, "-f" + direction, "-o" + order, "-d%.2f" % det, profile_path], capture_output=True, skip_scripts=True) if not isinstance(result, Exception) and result: # iccgamut output looks like this: # Header: # <...> # # Total volume of gamut is xxxxxx.xxxxxx cubic colorspace units for line in self.output: match = re.search("(\d+(?:\.\d+)?)\s+cubic\s+colorspace\s+" "units", line) if match: gamut_volume = float(match.groups()[0]) / ICCP.GAMUT_VOLUME_SRGB break else: break name = os.path.splitext(profile_paths[0])[0] gamfilename = name + ".gam" wrlfilename = name + ".wrl" tmpfilenames = [gamfilename, wrlfilename] if compare_standard_gamuts: comparison_gamuts = [("srgb", "sRGB"), ("adobe-rgb", "ClayRGB1998"), ("dci-p3", "SMPTE431_P3")] else: comparison_gamuts = [] for profile_path in profile_paths[1:]: filename, ext = os.path.splitext(profile_path) comparison_gamuts.append((filename.lower().replace(" ", "-"), filename + ".gam")) for key, src in comparison_gamuts: if not isinstance(result, Exception) and result: # Create gamut view and intersection if os.path.isabs(src): src_path = src src = os.path.splitext(os.path.basename(src))[0] else: if mods: src += " " + "".join(["[%s]" % mod.upper() for mod in mods]) src_path = get_data_path("ref/%s.gam" % src) if not src_path: continue outfilename = outname + " vs " + src if mods: outfilename += " " + "".join(["[%s]" % mod.upper() for mod in mods]) outfilename += ".wrl" tmpfilenames.append(outfilename) result = self.exec_cmd(get_argyll_util("viewgam"), ["-cw", "-t0", "-w", src_path, "-cn", "-t.3", "-s", gamfilename, "-i", outfilename], capture_output=True, skip_scripts=True) if not isinstance(result, Exception) and result: # viewgam output looks like this: # Intersecting volume = xxx.x cubic units # 'path/to/1.gam' volume = xxx.x cubic units, intersect = xx.xx% # 'path/to/2.gam' volume = xxx.x cubic units, intersect = xx.xx% for line in self.output: match = re.search("[\\\/]%s.gam'\s+volume\s*=\s*" "\d+(?:\.\d+)?\s+cubic\s+units,?" "\s+intersect\s*=\s*" "(\d+(?:\.\d+)?)" % re.escape(src), line) if match: gamut_coverage[key] = float(match.groups()[0]) / 100.0 break if not isinstance(result, Exception) and result: for tmpfilename in tmpfilenames: if (tmpfilename == gamfilename and tmpfilename != outname + ".gam"): # Use the original file name filename = outname + ".gam" elif (tmpfilename == wrlfilename and tmpfilename != outname + ".wrl"): # Use the original file name filename = outname + ".wrl" else: filename = tmpfilename try: def tweak_vrml(vrml): # Set viewpoint further away vrml = re.sub("(Viewpoint\s*\{)[^}]+\}", r"\1 position 0 0 340 }", vrml) # Fix label color for -a* axis label = re.search(r'Transform\s*\{\s*translation\s+[+\-0-9.]+\s*[+\-0-9.]+\s*[+\-0-9.]+\s+children\s*\[\s*Shape\s*\{\s*geometry\s+Text\s*\{\s*string\s*\["-a\*"\]\s*fontStyle\s+FontStyle\s*\{[^}]*\}\s*\}\s*appearance\s+Appearance\s*\{\s*material\s+Material\s*{[^}]*\}\s*\}\s*\}\s*\]\s*\}', vrml) if label: label = label.group() vrml = vrml.replace(label, re.sub(r"(diffuseColor)\s+[+\-0-9.]+\s+[+\-0-9.]+\s+[+\-0-9.]+", r"\1 0.0 1.0 0.0", label)) # Add range to axes vrml = re.sub(r'(string\s*\[")(\+?)(L\*)("\])', r'\1\3", "\2\0$\4', vrml) vrml = re.sub(r'(string\s*\[")([+\-]?)(a\*)("\])', r'\1\3", "\2\0$\4', vrml) vrml = re.sub(r'(string\s*\[")([+\-]?)(b\*)("\])', r'\1\3 \2\0$\4', vrml) vrml = vrml.replace("\0$", "100") return vrml gzfilename = filename + ".gz" if sys.platform == "win32": filename = make_win32_compatible_long_path(filename) gzfilename = make_win32_compatible_long_path(gzfilename) tmpfilename = make_win32_compatible_long_path(tmpfilename) if getcfg("vrml.compress"): # Compress gam and wrl files using gzip with GzipFileProper(gzfilename, "wb") as gz: # Always use original filename with '.gz' extension, # that way the filename in the header will be correct with open(tmpfilename, "rb") as infile: gz.write(tweak_vrml(infile.read())) # Remove uncompressed file os.remove(tmpfilename) tmpfilename = gzfilename else: with open(tmpfilename, "rb") as infile: vrml = infile.read() with open(tmpfilename, "wb") as outfile: outfile.write(tweak_vrml(vrml)) if filename.endswith(".wrl"): filename = filename[:-4] + ".wrz" else: filename = gzfilename if tmpfilename != filename: # Rename the file if filename is different if os.path.exists(filename): os.remove(filename) os.rename(tmpfilename, filename) except Exception, exception: self.log(exception) elif result: # Exception self.log(result) return gamut_volume, gamut_coverage def calibrate(self, remove=False): """ Calibrate the screen and process the generated file(s). """ capture_output = not sys.stdout.isatty() cmd, args = self.prepare_dispcal() if not isinstance(cmd, Exception): result = self.exec_cmd(cmd, args, capture_output=capture_output) else: result = cmd if not isinstance(result, Exception) and result and getcfg("trc"): dst_pathname = os.path.join(getcfg("profile.save_path"), getcfg("profile.name.expanded"), getcfg("profile.name.expanded")) cal = args[-1] + ".cal" result = check_cal_isfile( cal, lang.getstr("error.calibration.file_not_created")) if not isinstance(result, Exception) and result: cal_cgats = add_dispcal_options_to_cal(cal, self.options_dispcal) if cal_cgats: cal_cgats.write() if getcfg("profile.update") or \ self.dispcal_create_fast_matrix_shaper: profile_path = args[-1] + profile_ext result = check_profile_isfile( profile_path, lang.getstr("error.profile.file_not_created")) if not isinstance(result, Exception) and result: try: profile = ICCP.ICCProfile(profile_path) except (IOError, ICCP.ICCProfileInvalidError), exception: result = Error(lang.getstr("profile.invalid") + "\n" + profile_path) if not isinstance(result, Exception) and result: if not getcfg("profile.update"): # Created fast matrix shaper profile # we need to set cprt, targ and a few other things profile.setCopyright(getcfg("copyright")) # Fast matrix shaper profiles currently don't # contain TI3 data, but look for it anyways # to be future-proof ti3 = add_options_to_ti3( profile.tags.get("targ", profile.tags.get("CIED", "")), self.options_dispcal) if not ti3: ti3 = CGATS.CGATS("TI3\n") ti3[1] = cal_cgats edid = self.get_display_edid() display_name = edid.get("monitor_name", edid.get("ascii", str(edid.get("product_id") or ""))) display_manufacturer = edid.get("manufacturer") profile.setDeviceModelDescription(display_name) if display_manufacturer: profile.setDeviceManufacturerDescription( display_manufacturer) (gamut_volume, gamut_coverage) = self.create_gamut_views(profile_path) self.update_profile(profile, ti3=str(ti3), chrm=None, tags=True, avg=None, peak=None, rms=None, gamut_volume=gamut_volume, gamut_coverage=gamut_coverage, quality=getcfg("calibration.quality")) else: # Update desc tag - ASCII needs to be 7-bit # also add Unicode string if different from ASCII if "desc" in profile.tags and isinstance(profile.tags.desc, ICCP.TextDescriptionType): profile.setDescription( getcfg("profile.name.expanded")) # Calculate profile ID profile.calculateID() try: profile.write() except Exception, exception: self.log(exception) result2 = self.wrapup(not isinstance(result, UnloggedInfo) and result, remove or isinstance(result, Exception) or not result) if isinstance(result2, Exception): if isinstance(result, Exception): result = Error(safe_unicode(result) + "\n\n" + safe_unicode(result2)) else: result = result2 elif not isinstance(result, Exception) and result and getcfg("trc"): setcfg("last_cal_path", dst_pathname + ".cal") setcfg("calibration.file.previous", getcfg("calibration.file", False)) if (getcfg("profile.update") or self.dispcal_create_fast_matrix_shaper): setcfg("last_cal_or_icc_path", dst_pathname + profile_ext) setcfg("last_icc_path", dst_pathname + profile_ext) setcfg("calibration.file", dst_pathname + profile_ext) else: setcfg("calibration.file", dst_pathname + ".cal") setcfg("last_cal_or_icc_path", dst_pathname + ".cal") return result @property def calibration_loading_generally_supported(self): # Loading/clearing calibration seems to have undesirable side-effects # on Mac OS X 10.6 and newer return (sys.platform != "darwin" or intlist(mac_ver()[0].split(".")) < [10, 6]) @property def calibration_loading_supported(self): # Loading/clearing calibration seems to have undesirable side-effects # on Mac OS X 10.6 and newer return (self.calibration_loading_generally_supported and not config.is_virtual_display()) def change_display_profile_cal_whitepoint(self, profile, x, y, outfilename, calibration_only=False, use_collink=False): """ Change display profile (and calibration) whitepoint. Do it in an colorimetrically accurate manner (as far as possible). """ XYZw = colormath.xyY2XYZ(x, y) xicclu = get_argyll_util("xicclu") if not xicclu: return Error(lang.getstr("argyll.util.not_found", "xicclu")) tempdir = self.create_tempdir() if isinstance(tempdir, Exception): return tempdir outpathname = os.path.splitext(outfilename)[0] outname = os.path.basename(outpathname) logfiles = Files([self.recent, self.lastmsg, LineBufferedStream(safe_print)]) ofilename = profile.fileName temppathname = os.path.join(tempdir, outname) if ofilename and os.path.isfile(ofilename): # Profile comes from a file temp = False temporig = ofilename else: # Profile not associated to a file, write to temp dir temp = True profile.fileName = temporig = temppathname + ".orig.icc" profile.write(temporig) # Remember original white XYZ origXYZ = profile.tags.wtpt.X, profile.tags.wtpt.Y, profile.tags.wtpt.Z # Make a copy of the profile with changed whitepoint profile.tags.wtpt.X, profile.tags.wtpt.Y, profile.tags.wtpt.Z = XYZw tempcopy = temppathname + ".copy.icc" profile.write(tempcopy) # Generate updated calibration with changed whitepoint if use_collink: collink = get_argyll_util("collink") if not collink: profile.fileName = ofilename self.wrapup(False) return Error(lang.getstr("argyll.util.not_found", "collink")) linkpath = temppathname + ".link.icc" result = self.exec_cmd(collink, ["-v", "-n", "-G", "-iaw", "-b", tempcopy, temporig, linkpath], capture_output=True) if not result or isinstance(result, Exception): profile.fileName = ofilename self.wrapup(False) return result link = ICCP.ICCProfile(linkpath) RGBscaled = [] for i in xrange(256): RGBscaled.append([i / 255.0] * 3) RGBscaled = self.xicclu(link, RGBscaled) logfiles.write("RGB white %6.4f %6.4f %6.4f\n" % tuple(RGBscaled[-1])) # Restore original white XYZ profile.tags.wtpt.X, profile.tags.wtpt.Y, profile.tags.wtpt.Z = origXYZ # Get white RGB XYZwscaled = self.xicclu(profile, RGBscaled[-1], "a")[0] logfiles.write("XYZ white %6.4f %6.4f %6.4f, CCT %i\n" % tuple(XYZwscaled + [colormath.XYZ2CCT(*XYZwscaled)])) else: # Lookup scaled down white XYZ logfiles.write("Looking for solution...\n") XYZscaled = [] for i in xrange(2000): XYZscaled.append([v * (1 - i / 1999.0) for v in XYZw]) RGBscaled = self.xicclu(profile, XYZscaled, "a", "if", get_clip=True) # Set filename to copy (used by worker.xicclu to get profile path) profile.fileName = tempcopy # Find point at which it no longer clips for i, RGBclip in enumerate(RGBscaled): if RGBclip[3] is True: # Clipped, skip continue # Found XYZwscaled = XYZscaled[i] logfiles.write("Solution found at index %i (step size %f)\n" % (i, 1 / 1999.0)) logfiles.write("RGB white %6.4f %6.4f %6.4f\n" % tuple(RGBclip[:3])) logfiles.write("XYZ white %6.4f %6.4f %6.4f, CCT %i\n" % tuple(XYZscaled[i] + [colormath.XYZ2CCT(*XYZscaled[i])])) break else: profile.fileName = ofilename self.wrapup(False) return Error("No solution found in %i steps" % i) # Generate RGB input values # Reduce interpolation res as target whitepoint moves farther away # from profile whitepoint in RGB res = max(int(round((min(RGBclip[:3]) / 1.0) * 33)), 9) logfiles.write("Interpolation res %i\n" % res) RGBscaled = [] for i in xrange(res): RGBscaled.append([v * (i / (res - 1.0)) for v in (1, 1, 1)]) # Lookup RGB -> XYZ through whitepoint adjusted profile RGBscaled2XYZ = self.xicclu(profile, RGBscaled, "a") # Restore original XYZ profile.tags.wtpt.X, profile.tags.wtpt.Y, profile.tags.wtpt.Z = origXYZ # Restore original filename (used by worker.xicclu to get profile path) profile.fileName = temporig # Get original black point XYZk = self.xicclu(profile, [0, 0, 0], "a")[0] logfiles.write("XYZ black %6.4f %6.4f %6.4f\n" % tuple(XYZk)) logfiles.write("XYZ white after forward lookup %6.4f %6.4f %6.4f\n" % tuple(RGBscaled2XYZ[-1])) # Scale down XYZ XYZscaled = [] for i in xrange(res): XYZ = [v * XYZwscaled[1] for v in RGBscaled2XYZ[i]] if i == 0: bp_in = XYZ XYZ = colormath.apply_bpc(*XYZ, bp_in=bp_in, bp_out=XYZk, wp_out=XYZwscaled, weight=True) XYZscaled.append(XYZ) logfiles.write("XYZ white after scale down %6.4f %6.4f %6.4f\n" % tuple(XYZscaled[-1])) # Lookup XYZ -> RGB through original profile RGBscaled = self.xicclu(profile, XYZscaled, "a", "if", use_cam_clipping=True) logfiles.write("RGB black after inverse forward lookup %6.4f %6.4f %6.4f\n" % tuple(RGBscaled[0])) logfiles.write("RGB white after inverse forward lookup %6.4f %6.4f %6.4f\n" % tuple(RGBscaled[-1])) if res != 256: # Interpolate R = [] G = [] B = [] for i, RGB in enumerate(RGBscaled): R.append(RGB[0]) G.append(RGB[1]) B.append(RGB[2]) if res > 2: # Catmull-Rom spline interpolation Ri = ICCP.CRInterpolation(R) Gi = ICCP.CRInterpolation(G) Bi = ICCP.CRInterpolation(B) else: # Linear interpolation Ri = colormath.Interp(range(res), R) Gi = colormath.Interp(range(res), G) Bi = colormath.Interp(range(res), B) RGBscaled = [] step = (res - 1) / 255.0 for i in xrange(256): RGB = [Ri(i * step), Gi(i * step), Bi(i * step)] RGBscaled.append(RGB) logfiles.write("RGB black after interpolation %6.4f %6.4f %6.4f\n" % tuple(RGBscaled[0])) logfiles.write("RGB white after interpolation %6.4f %6.4f %6.4f\n" % tuple(RGBscaled[-1])) has_nonlinear_vcgt = (isinstance(profile.tags.get("vcgt"), ICCP.VideoCardGammaType) and not profile.tags.vcgt.is_linear()) if has_nonlinear_vcgt: # Apply cal ocal = vcgt_to_cal(profile) bp_out = ocal.queryv1({"RGB_R": 0, "RGB_G": 0, "RGB_B": 0}).values() ocalpath = temppathname + ".cal" ocal.filename = ocalpath RGBscaled = self.xicclu(ocal, RGBscaled) logfiles.write("RGB black after cal %6.4f %6.4f %6.4f\n" % tuple(RGBscaled[0])) logfiles.write("RGB white after cal %6.4f %6.4f %6.4f\n" % tuple(RGBscaled[-1])) else: bp_out = (0, 0, 0) cal = """CAL KEYWORD "DEVICE_CLASS" DEVICE_CLASS "DISPLAY" KEYWORD "COLOR_REP" COLOR_REP "RGB" BEGIN_DATA_FORMAT RGB_I RGB_R RGB_G RGB_B END_DATA_FORMAT NUMBER_OF_SETS 256 BEGIN_DATA """ for i, RGB in enumerate(RGBscaled): R, G, B = colormath.apply_bpc(*RGB, bp_in=RGBscaled[0], bp_out=bp_out, wp_out=RGBscaled[-1], weight=True) cal += "%f %f %f %f\n" % (i / 255.0, R, G, B) cal += "END_DATA" cal = CGATS.CGATS(cal) cal.filename = outpathname + ".cal" cal.write() if calibration_only: # Only update calibration profile.setDescription(outname) profile.tags.vcgt = cal_to_fake_profile(cal).tags.vcgt profile.tags.wtpt.X, profile.tags.wtpt.Y, profile.tags.wtpt.Z = XYZw profile.calculateID() profile.write(outfilename) self.wrapup(False) return True else: # Re-create profile cti3 = None if isinstance(profile.tags.get("targ"), ICCP.Text): # Get measurement data try: cti3 = CGATS.CGATS(profile.tags.targ) except (IOError, CGATS.CGATSError): pass else: if not 0 in cti3 or cti3[0].type.strip() != "CTI3": # Not Argyll measurement data cti3 = None if not cti3: # Use fakeread fakeread = get_argyll_util("fakeread") if not fakeread: profile.fileName = ofilename self.wrapup(False) return Error(lang.getstr("argyll.util.not_found", "fakeread")) shutil.copyfile(defaults["testchart.file"], temppathname + ".ti1") result = self.exec_cmd(fakeread, [temporig, temppathname]) if not result or isinstance(result, Exception): profile.fileName = ofilename self.wrapup(False) return result cti3 = CGATS.CGATS(temppathname + ".ti3") # Get RGB from measurement data RGBorig = [] for i, sample in cti3[0].DATA.iteritems(): RGB = [] for j, component in enumerate("RGB"): RGB.append(sample["RGB_" + component]) RGBorig.append(RGB) # Lookup RGB -> scaled RGB through calibration RGBscaled = self.xicclu(cal, RGBorig, scale=100) if has_nonlinear_vcgt: # Undo original calibration RGBscaled = self.xicclu(ocal, RGBscaled, direction="b", scale=100) # Update CAL in ti3 file if 1 in cti3 and cti3[1].type.strip() == "CAL": cti3[1].DATA = cal[0].DATA else: cti3[1] = cal[0] # Lookup scaled RGB -> XYZ through profile RGBscaled2XYZ = self.xicclu(profile, RGBscaled, "a", scale=100) # Update measurement data if "LUMINANCE_XYZ_CDM2" in cti3[0]: XYZa = [float(v) * XYZwscaled[i] for i, v in enumerate(cti3[0].LUMINANCE_XYZ_CDM2.split())] cti3[0].add_keyword("LUMINANCE_XYZ_CDM2", " ".join([str(v) for v in XYZa])) for i, sample in cti3[0].DATA.iteritems(): for j, component in enumerate("XYZ"): sample["XYZ_" + component] = RGBscaled2XYZ[i][j] / XYZwscaled[1] * 100 cti3.write(temppathname + ".ti3") # Preserve custom tags display_name = profile.getDeviceModelDescription() display_manufacturer = profile.getDeviceManufacturerDescription() tags = {} for tagname in ("mmod", "meta"): if tagname in profile.tags: tags[tagname] = profile.tags[tagname] if temp: os.remove(temporig) os.remove(tempcopy) # Compute profile self.options_targen = ["-d3"] return self.create_profile(outfilename, True, display_name, display_manufacturer, tags) def chart_lookup(self, cgats, profile, as_ti3=False, fields=None, check_missing_fields=False, function="f", pcs="l", intent="r", bt1886=None, white_patches=4, white_patches_total=True, raise_exceptions=False): """ Lookup CIE or device values through profile """ if profile.colorSpace == "RGB": labels = ('RGB_R', 'RGB_G', 'RGB_B') else: labels = ('CMYK_C', 'CMYK_M', 'CMYK_Y', 'CMYK_K') ti1 = None ti3_ref = None gray = None try: if not isinstance(cgats, CGATS.CGATS): cgats = CGATS.CGATS(cgats, True) else: # Always make a copy and do not alter a passed in CGATS instance! cgats_filename = cgats.filename cgats = CGATS.CGATS(str(cgats)) cgats.filename = cgats_filename if 0 in cgats: # only look at the first section cgats[0].filename = cgats.filename cgats = cgats[0] primaries = cgats.queryi(labels) if primaries and not as_ti3: primaries.fix_device_values_scaling(profile.colorSpace) cgats.type = 'CTI1' cgats.COLOR_REP = profile.colorSpace ti1, ti3_ref, gray = self.ti1_lookup_to_ti3(cgats, profile, function, pcs, "r", white_patches, white_patches_total) if bt1886 or intent == "a": cat = profile.guess_cat() or "Bradford" for item in ti3_ref.DATA.itervalues(): if pcs == "l": X, Y, Z = colormath.Lab2XYZ(item["LAB_L"], item["LAB_A"], item["LAB_B"]) else: X, Y, Z = item["XYZ_X"], item["XYZ_Y"], item["XYZ_Z"] if bt1886: X, Y, Z = bt1886.apply(X, Y, Z) if intent == "a": X, Y, Z = colormath.adapt(X, Y, Z, "D50", profile.tags.wtpt.values(), cat=cat) X, Y, Z = [v * 100 for v in (X, Y, Z)] if pcs == "l": (item["LAB_L"], item["LAB_A"], item["LAB_B"]) = colormath.XYZ2Lab(X, Y, Z) else: item["XYZ_X"], item["XYZ_Y"], item["XYZ_Z"] = X, Y, Z else: if not primaries and check_missing_fields: raise ValueError(lang.getstr("error.testchart.missing_fields", (cgats.filename, ", ".join(labels)))) ti1, ti3_ref = self.ti3_lookup_to_ti1(cgats, profile, fields, intent, white_patches) except Exception, exception: if raise_exceptions: raise exception InfoDialog(self.owner, msg=safe_unicode(exception), ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error")) return ti1, ti3_ref, gray def ti1_lookup_to_ti3(self, ti1, profile, function="f", pcs=None, intent="r", white_patches=4, white_patches_total=True): """ Read TI1 (filename or CGATS instance), lookup device->pcs values colorimetrically through profile using Argyll's xicclu utility and return TI3 (CGATS instance) """ # ti1 if isinstance(ti1, basestring): ti1 = CGATS.CGATS(ti1) if not isinstance(ti1, CGATS.CGATS): raise TypeError('Wrong type for ti1, needs to be CGATS.CGATS ' 'instance') # profile if isinstance(profile, basestring): profile = ICCP.ICCProfile(profile) if not isinstance(profile, ICCP.ICCProfile): raise TypeError('Wrong type for profile, needs to be ' 'ICCP.ICCProfile instance') # determine pcs for lookup color_rep = profile.connectionColorSpace.upper() if color_rep == "RGB": pcs = None elif not pcs: if color_rep == 'LAB': pcs = 'l' elif color_rep == 'XYZ': pcs = 'x' else: raise ValueError('Unknown CIE color representation ' + color_rep) else: if pcs == "l": color_rep = "LAB" elif pcs == "x": color_rep = "XYZ" # get profile color space colorspace = profile.colorSpace # required fields for ti1 if colorspace == "CMYK": required = ("CMYK_C", "CMYK_M", "CMYK_Y", "CMYK_K") else: required = ("RGB_R", "RGB_G", "RGB_B") ti1_filename = ti1.filename try: ti1 = verify_cgats(ti1, required, True) except CGATS.CGATSInvalidError: raise ValueError(lang.getstr("error.testchart.invalid", ti1_filename)) except CGATS.CGATSKeyError: raise ValueError(lang.getstr("error.testchart.missing_fields", (ti1_filename, ", ".join(required)))) # read device values from ti1 data = ti1.queryv1("DATA") if not data: raise ValueError(lang.getstr("error.testchart.invalid", ti1_filename)) device_data = data.queryv(required) if not device_data: raise ValueError(lang.getstr("error.testchart.missing_fields", (ti1_filename, ", ".join(required)))) if colorspace == "RGB" and white_patches: # make sure the first four patches are white so the whitepoint can be # averaged white_rgb = {'RGB_R': 100, 'RGB_G': 100, 'RGB_B': 100} white = dict(white_rgb) wp = ti1.queryv1("APPROX_WHITE_POINT") if wp: wp = [float(v) for v in wp.split()] wp = [CGATS.rpad((v / wp[1]) * 100.0, data.vmaxlen) for v in wp] else: wp = colormath.get_standard_illuminant("D65", scale=100) for label in data.parent.DATA_FORMAT.values(): if not label in white: if label.upper() == 'LAB_L': value = 100 elif label.upper() in ('LAB_A', 'LAB_B'): value = 0 elif label.upper() == 'XYZ_X': value = wp[0] elif label.upper() == 'XYZ_Y': value = 100 elif label.upper() == 'XYZ_Z': value = wp[2] else: value = '0' white.update({label: value}) white_added_count = 0 if profile.profileClass != "link": if white_patches_total: # Ensure total of n white patches while len(data.queryi(white_rgb)) < white_patches: data.insert(0, white) white_added_count += 1 else: # Add exactly n white patches while white_added_count < white_patches: data.insert(0, white) white_added_count += 1 safe_print("Added %i white patch(es)" % white_added_count) idata = [] for primaries in device_data.values(): idata.append(primaries.values()) if debug: safe_print("ti1_lookup_to_ti3 %s -> %s idata" % (profile.colorSpace, color_rep)) for v in idata: safe_print(" ".join(("%3.4f", ) * len(v)) % tuple(v)) # lookup device->cie values through profile using (x)icclu if pcs or self.argyll_version >= [1, 6]: use_icclu = False else: # DeviceLink profile, we have to use icclu under older Argyll CMS # versions because older xicclu cannot handle devicelink use_icclu = True input_encoding = None output_encoding = None if not pcs: # Try to determine input/output encoding for devicelink if isinstance(profile.tags.get("meta"), ICCP.DictType): input_encoding = profile.tags.meta.getvalue("encoding.input") output_encoding = profile.tags.meta.getvalue("encoding.output") if input_encoding == "T": # 'T' (clip wtw on input) not supported for xicclu input_encoding = "t" # Fall back to configured 3D LUT encoding if (not input_encoding or input_encoding not in config.valid_values["3dlut.encoding.input"]): input_encoding = getcfg("3dlut.encoding.input") if input_encoding == "T": # 'T' (clip wtw on input) not supported for xicclu input_encoding = "t" if (not output_encoding or output_encoding not in config.valid_values["3dlut.encoding.output"]): output_encoding = getcfg("3dlut.encoding.output") if (self.argyll_version < [1, 6] and not (input_encoding == output_encoding == "n")): # Fail if encoding is not n (data levels) raise ValueError("The used version of Argyll CMS only" "supports full range RGB encoding.") odata = self.xicclu(profile, idata, intent, function, pcs=pcs, scale=100, use_icclu=use_icclu, input_encoding=input_encoding, output_encoding=output_encoding) gray = [] igray = [] igray_idx = [] if colorspace == "RGB": # treat r=g=b specially: set expected a=b=0 for i, cie in enumerate(odata): r, g, b = idata[i] if r == g == b < 100: # if grayscale and not white if pcs == 'x': # Need to scale XYZ coming from xicclu # Lab is already scaled cie = colormath.XYZ2Lab(*[n * 100.0 for n in cie]) cie = (cie[0], 0, 0) # set a=b=0 igray.append("%s %s %s" % cie) igray_idx.append(i) if pcs == 'x': cie = colormath.Lab2XYZ(*cie) luminance = cie[1] else: luminance = colormath.Lab2XYZ(*cie)[1] if luminance * 100.0 >= 1: # only add if luminance is greater or equal 1% because # dark tones fluctuate too much gray.append((r, g, b)) if False: # NEVER? # set cie in odata to a=b=0 odata[i] = cie if igray and False: # NEVER? # lookup cie->device values for grays through profile using xicclu gray = [] ogray = self.xicclu(profile, igray, "r", "b", pcs="l", scale=100) for i, rgb in enumerate(ogray): cie = idata[i] if colormath.Lab2XYZ(cie[0], 0, 0)[1] * 100.0 >= 1: # only add if luminance is greater or equal 1% because # dark tones fluctuate too much gray.append(rgb) # update values in ti1 and data for ti3 for n, channel in enumerate(("R", "G", "B")): data[igray_idx[i] + white_added_count]["RGB_" + channel] = rgb[n] odata[igray_idx[i]] = cie # write output ti3 ofile = StringIO() if pcs: ofile.write('CTI3 \n') ofile.write('\nDESCRIPTOR "Argyll Calibration Target chart information 3"\n') else: ofile.write('CTI1 \n') ofile.write('\nDESCRIPTOR "Argyll Calibration Target chart information 1"\n') ofile.write('KEYWORD "DEVICE_CLASS"\n') ofile.write('DEVICE_CLASS "' + ('DISPLAY' if colorspace == 'RGB' else 'OUTPUT') + '"\n') include_sample_name = False for i, cie in enumerate(odata): if i == 0: icolor = profile.colorSpace if icolor == 'RGB': olabel = 'RGB_R RGB_G RGB_B' elif icolor == 'CMYK': olabel = 'CMYK_C CMYK_M CMYK_Y CMYK_K' else: raise ValueError('Unknown color representation ' + icolor) if color_rep == 'LAB': ilabel = 'LAB_L LAB_A LAB_B' elif color_rep in ('XYZ', 'RGB'): ilabel = 'XYZ_X XYZ_Y XYZ_Z' else: raise ValueError('Unknown CIE color representation ' + color_rep) ofile.write('KEYWORD "COLOR_REP"\n') if icolor == color_rep: ofile.write('COLOR_REP "' + icolor + '"\n') else: ofile.write('COLOR_REP "' + icolor + '_' + color_rep + '"\n') ofile.write('\n') ofile.write('NUMBER_OF_FIELDS ') if include_sample_name: ofile.write(str(2 + len(icolor) + len(color_rep)) + '\n') else: ofile.write(str(1 + len(icolor) + len(color_rep)) + '\n') ofile.write('BEGIN_DATA_FORMAT\n') ofile.write('SAMPLE_ID ') if include_sample_name: ofile.write('SAMPLE_NAME ' + olabel + ' ' + ilabel + '\n') else: ofile.write(olabel + ' ' + ilabel + '\n') ofile.write('END_DATA_FORMAT\n') ofile.write('\n') ofile.write('NUMBER_OF_SETS ' + str(len(odata)) + '\n') ofile.write('BEGIN_DATA\n') if pcs == 'x': # Need to scale XYZ coming from xicclu, Lab is already scaled cie = [round(n * 100.0, 5 - len(str(int(abs(n * 100.0))))) for n in cie] elif not pcs: # Actually CIE = RGB because Devicelink idata[i] = cie cie = [round(n * 100.0, 5 - len(str(int(abs(n * 100.0))))) for n in colormath.RGB2XYZ(*[n / 100.0 for n in cie])] device = [str(n) for n in idata[i]] cie = [str(n) for n in cie] if include_sample_name: ofile.write(str(i) + ' ' + data[i - 1][1].strip('"') + ' ' + ' '.join(device) + ' ' + ' '.join(cie) + '\n') else: ofile.write(str(i) + ' ' + ' '.join(device) + ' ' + ' '.join(cie) + '\n') ofile.write('END_DATA\n') ofile.seek(0) ti3 = CGATS.CGATS(ofile)[0] if (colorspace == "RGB" and white_patches and profile.profileClass == "link"): if white_patches_total: # Ensure total of n white patches while len(ti3.DATA.queryi(white_rgb)) < white_patches: ti3.DATA.insert(0, white) white_added_count += 1 else: # Add exactly n white patches while white_added_count < white_patches: ti3.DATA.insert(0, white) white_added_count += 1 safe_print("Added %i white patch(es)" % white_added_count) if debug: safe_print(ti3) return ti1, ti3, map(list, gray) def ti3_lookup_to_ti1(self, ti3, profile, fields=None, intent="r", add_white_patches=4): """ Read TI3 (filename or CGATS instance), lookup cie->device values colorimetrically through profile using Argyll's xicclu utility and return TI1 and compatible TI3 (CGATS instances) """ # ti3 copy = True if isinstance(ti3, basestring): copy = False ti3 = CGATS.CGATS(ti3) if not isinstance(ti3, CGATS.CGATS): raise TypeError('Wrong type for ti3, needs to be CGATS.CGATS ' 'instance') ti3_filename = ti3.filename if copy: # Make a copy and do not alter a passed in CGATS instance! ti3 = CGATS.CGATS(str(ti3)) if fields == "XYZ": labels = ("XYZ_X", "XYZ_Y", "XYZ_Z") else: labels = ("LAB_L", "LAB_A", "LAB_B") try: ti3v = verify_cgats(ti3, labels, True) except CGATS.CGATSInvalidError, exception: raise ValueError(lang.getstr("error.testchart.invalid", ti3_filename) + "\n" + lang.getstr(safe_str(exception))) except CGATS.CGATSKeyError: try: if fields: raise else: labels = ("XYZ_X", "XYZ_Y", "XYZ_Z") ti3v = verify_cgats(ti3, labels, True) except CGATS.CGATSKeyError: missing = ", ".join(labels) if not fields: missing += " " + lang.getstr("or") + " LAB_L, LAB_A, LAB_B" raise ValueError(lang.getstr("error.testchart.missing_fields", (ti3_filename, missing))) else: color_rep = 'XYZ' else: color_rep = fields or 'LAB' # profile if isinstance(profile, basestring): profile = ICCP.ICCProfile(profile) if not isinstance(profile, ICCP.ICCProfile): raise TypeError('Wrong type for profile, needs to be ' 'ICCP.ICCProfile instance') # determine pcs for lookup if color_rep == 'LAB': pcs = 'l' required = ("LAB_L", "LAB_A", "LAB_B") elif color_rep == 'XYZ': pcs = 'x' required = ("XYZ_X", "XYZ_Y", "XYZ_Z") else: raise ValueError('Unknown CIE color representation ' + color_rep) # get profile color space colorspace = profile.colorSpace # read cie values from ti3 data = ti3v.queryv1("DATA") if not data: raise ValueError(lang.getstr("error.testchart.invalid", ti3_filename)) cie_data = data.queryv(required) if not cie_data: raise ValueError(lang.getstr("error.testchart.missing_fields", (ti3_filename, ", ".join(required)))) idata = [] if colorspace == "RGB" and add_white_patches: # make sure the first four patches are white so the whitepoint can be # averaged wp = [n * 100.0 for n in profile.tags.wtpt.values()] if color_rep == 'LAB': wp = colormath.XYZ2Lab(*wp) wp = OrderedDict((('L', wp[0]), ('a', wp[1]), ('b', wp[2]))) else: wp = OrderedDict((('X', wp[0]), ('Y', wp[1]), ('Z', wp[2]))) wp = [wp] * int(add_white_patches) safe_print("Added %i white patches" % add_white_patches) else: wp = [] for cie in wp + cie_data.values(): cie = cie.values() if color_rep == 'XYZ': # assume scale 0...100 in ti3, we need to convert to 0...1 cie = [n / 100.0 for n in cie] idata.append(cie) if debug: safe_print("ti3_lookup_to_ti1 %s -> %s idata" % (color_rep, profile.colorSpace)) for v in idata: safe_print(" ".join(("%3.4f", ) * len(v)) % tuple(v)) # lookup cie->device values through profile.icc using xicclu odata = self.xicclu(profile, idata, intent, "b", pcs=pcs, scale=100) # write output ti1/ti3 ti1out = StringIO() ti1out.write('CTI1\n') ti1out.write('\n') ti1out.write('DESCRIPTOR "Argyll Calibration Target chart information 1"\n') include_sample_name = False for i, device in enumerate(odata): if i == 0: if color_rep == 'LAB': ilabel = 'LAB_L LAB_A LAB_B' elif color_rep == 'XYZ': ilabel = 'XYZ_X XYZ_Y XYZ_Z' else: raise ValueError('Unknown CIE color representation ' + color_rep) ocolor = profile.colorSpace.upper() if ocolor == 'RGB': olabel = 'RGB_R RGB_G RGB_B' elif ocolor == 'CMYK': olabel = 'CMYK_C CMYK_M CMYK_Y CMYK_K' else: raise ValueError('Unknown color representation ' + ocolor) olabels = olabel.split() # add device fields to DATA_FORMAT if not yet present if not olabels[0] in ti3v.DATA_FORMAT.values() and \ not olabels[1] in ti3v.DATA_FORMAT.values() and \ not olabels[2] in ti3v.DATA_FORMAT.values() and \ (ocolor == 'RGB' or (ocolor == 'CMYK' and not olabels[3] in ti3v.DATA_FORMAT.values())): ti3v.DATA_FORMAT.add_data(olabels) # add required fields to DATA_FORMAT if not yet present if not required[0] in ti3v.DATA_FORMAT.values() and \ not required[1] in ti3v.DATA_FORMAT.values() and \ not required[2] in ti3v.DATA_FORMAT.values(): ti3v.DATA_FORMAT.add_data(required) ti1out.write('KEYWORD "COLOR_REP"\n') ti1out.write('COLOR_REP "' + ocolor + '"\n') ti1out.write('\n') ti1out.write('NUMBER_OF_FIELDS ') if include_sample_name: ti1out.write(str(2 + len(color_rep) + len(ocolor)) + '\n') else: ti1out.write(str(1 + len(color_rep) + len(ocolor)) + '\n') ti1out.write('BEGIN_DATA_FORMAT\n') ti1out.write('SAMPLE_ID ') if include_sample_name: ti1out.write('SAMPLE_NAME ' + olabel + ' ' + ilabel + '\n') else: ti1out.write(olabel + ' ' + ilabel + '\n') ti1out.write('END_DATA_FORMAT\n') ti1out.write('\n') ti1out.write('NUMBER_OF_SETS ' + str(len(odata)) + '\n') ti1out.write('BEGIN_DATA\n') if i < len(wp): if ocolor == 'RGB': device = [100.00, 100.00, 100.00] else: device = [0, 0, 0, 0] # Make sure device values do not exceed valid range of 0..100 device = [str(max(0, min(v, 100))) for v in device] cie = (wp + cie_data.values())[i].values() cie = [str(n) for n in cie] if include_sample_name: ti1out.write(str(i + 1) + ' ' + data[i][1].strip('"') + ' ' + ' '.join(device) + ' ' + ' '.join(cie) + '\n') else: ti1out.write(str(i + 1) + ' ' + ' '.join(device) + ' ' + ' '.join(cie) + '\n') if i > len(wp) - 1: # don't include whitepoint patches in ti3 # set device values in ti3 for n, v in enumerate(olabels): ti3v.DATA[i - len(wp)][v] = float(device[n]) # set PCS values in ti3 for n, v in enumerate(cie): ti3v.DATA[i - len(wp)][required[n]] = float(v) ti1out.write('END_DATA\n') ti1out.seek(0) ti1 = CGATS.CGATS(ti1out) if debug: safe_print(ti1) return ti1, ti3v def download(self, uri): try: response = urllib2.urlopen(uri) except urllib2.URLError, exception: return exception total_size = response.info().getheader("Content-Length") if total_size is not None: try: total_size = int(total_size) except (TypeError, ValueError): return Error(lang.getstr("download_fail_wrong_size", ("<%s>" % lang.getstr("unknown"), ) * 2)) uri = response.geturl() filename = os.path.basename(uri) contentdispo = response.info().getheader("Content-Disposition") if contentdispo: filename = re.search('filename="([^"]+)"', contentdispo) if filename: filename = filename.groups()[0] download_dir = os.path.join(expanduseru("~"), "Downloads") download_path = os.path.join(download_dir, filename) if (not os.path.isfile(download_path) or (total_size is not None and os.stat(download_path).st_size != total_size)): self.recent.write(lang.getstr("downloading") + " " + filename + "\n") chunk_size = 8192 bytes_so_far = 0 bytes = [] unit = "Bytes" unit_size = 1 while True: if self.thread_abort: return False chunk = response.read(chunk_size) if not chunk: break bytes_so_far += len(chunk) bytes.append(chunk) if bytes_so_far > 1024 and unit_size < 1024: unit = "KiB" unit_size = 1024.0 elif bytes_so_far > 1048576 and unit_size < 1048576: unit = "MiB" unit_size = 1048576.0 if total_size: percent = float(bytes_so_far) / total_size percent = round(percent * 100, 2) self.lastmsg.write("\r%i%% (%.1f / %.1f %s)" % (percent, bytes_so_far / unit_size, total_size / unit_size, unit)) else: self.lastmsg.write("\r%.1f %s" % (bytes_so_far / unit_size, unit)) response.close() if not bytes: return Error(lang.getstr("download_fail_empty_response", uri)) if total_size is not None and bytes_so_far != total_size: return Error(lang.getstr("download_fail_wrong_size", (total_size, bytes_so_far))) if not os.path.isdir(download_dir): os.makedirs(download_dir) with open(download_path, "wb") as download_file: download_file.write("".join(bytes)) return download_path def process_argyll_download(self, result, exit=False): if isinstance(result, Exception): show_result_dialog(result, self.owner) elif result: if (result.lower().endswith(".zip") or result.lower().endswith(".tgz")): self.start(self.set_argyll_bin, self.extract_archive, cargs=(result, ), wargs=(result, ), progress_msg=lang.getstr("please_wait"), fancy=False) else: show_result_dialog(lang.getstr("error.file_type_unsupported") + "\n" + result, self.owner) def extract_archive(self, filename): extracted = [] if filename.lower().endswith(".zip"): cls = zipfile.ZipFile mode = "r" elif filename.lower().endswith(".tgz"): cls = TarFileProper.open # classmethod mode = "r:gz" else: return extracted with cls(filename, mode) as z: outdir = os.path.realpath(os.path.dirname(filename)) if cls is not zipfile.ZipFile: method = z.getnames else: method = z.namelist names = method() names.sort() extracted = [os.path.join(outdir, os.path.normpath(name)) for name in names] if names: name0 = os.path.normpath(names[0]) for outpath in extracted: if not os.path.realpath(outpath).startswith(os.path.join(outdir, name0)): return Error(lang.getstr("file.invalid") + "\n" + filename) if cls is not zipfile.ZipFile: z.extractall(outdir) else: for name in names: # If the ZIP file was created with Unicode names stored # in the file, 'name' will already be Unicode. # Otherwise, it'll either be 7-bit ASCII or (legacy) # cp437 encoding outname = safe_unicode(name, "cp437") outpath = os.path.join(outdir, os.path.normpath(outname)) if outname.endswith("/"): if not os.path.isdir(outpath): os.makedirs(outpath) elif not os.path.isfile(outpath): with open(outpath, "wb") as outfile: outfile.write(z.read(name)) return extracted def set_argyll_bin(self, result, filename): if isinstance(result, Exception): show_result_dialog(result, self.owner) elif result and os.path.isdir(result[0]): setcfg("argyll.dir", os.path.join(result[0], "bin")) from DisplayCAL import check_donation snapshot = VERSION > VERSION_BASE self.owner.set_argyll_bin_handler(None, True, self.owner.check_instrument_setup, (check_donation, (self.owner, snapshot))) else: show_result_dialog(lang.getstr("error.no_files_extracted_from_archive", filename), self.owner) def process_download(self, result, exit=False): if isinstance(result, Exception): show_result_dialog(result, self.owner) elif result: if exit: if self.owner: self.owner.Close() else: wx.GetApp().ExitMainLoop() launch_file(result) def verify_calibration(self): """ Verify the current calibration """ cmd, args = self.prepare_dispcal(calibrate=False, verify=True) if not isinstance(cmd, Exception): result = self.exec_cmd(cmd, args, capture_output=True, skip_scripts=True) else: result = cmd return result def measure_ti1(self, ti1_path, cal_path=None, colormanaged=False): """ Measure a TI1 testchart file """ if config.get_display_name() == "Untethered": cmd, args = get_argyll_util("spotread"), ["-v", "-e"] if getcfg("extra_args.spotread").strip(): args += parse_argument_string(getcfg("extra_args.spotread")) result = self.set_terminal_cgats(ti1_path) if isinstance(result, Exception): return result else: cmd = get_argyll_util("dispread") args = ["-v"] if config.get_display_name() in ("madVR", "Prisma") and colormanaged: args.append("-V") if cal_path: if (self.argyll_version >= [1, 3, 3] and (not self.has_lut_access() or not getcfg("calibration.use_video_lut"))): args.append("-K") else: args.append("-k") args.append(cal_path) if getcfg("extra_args.dispread").strip(): args += parse_argument_string(getcfg("extra_args.dispread")) result = self.add_measurement_features(args, cmd == get_argyll_util("dispread"), allow_nondefault_observer=is_ccxx_testchart()) if isinstance(result, Exception): return result self.options_dispread = list(args) if config.get_display_name() != "Untethered": args.append(os.path.splitext(ti1_path)[0]) return self.exec_cmd(cmd, args, skip_scripts=True) def wrapup(self, copy=True, remove=True, dst_path=None, ext_filter=None): """ Wrap up - copy and/or clean temporary file(s). """ if debug: safe_print("[D] wrapup(copy=%s, remove=%s)" % (copy, remove)) if not self.tempdir or not os.path.isdir(self.tempdir): return # nothing to do if (isinstance(copy, Exception) and not isinstance(copy, (UnloggedError, UnloggedInfo, UnloggedWarning)) and self.sessionlogfile): # This is an incomplete run, log exception to session logfile self.sessionlogfile.write(safe_basestring(copy)) while self.sessionlogfiles: self.sessionlogfiles.popitem()[1].close() if isinstance(copy, Exception): # This is an incomplete run, check if any files have been added or # modified (except log files and 'hidden' temporary files) changes = False for filename in os.listdir(self.tempdir): if (filename.endswith(".log") or filename in (".abort", ".ok", ".wait", ".wait.cmd", ".wait.py")): # Skip log files and 'hidden' temporary files continue if (filename not in self.tmpfiles or os.stat(os.path.join(self.tempdir, filename)).st_mtime != self.tmpfiles[filename]): changes = True break if not changes: copy = False result = True if copy: try: src_listdir = os.listdir(self.tempdir) except Exception, exception: result = exception remove = False if not isinstance(result, Exception) and src_listdir: if not ext_filter: ext_filter = [".app", ".cal", ".ccmx", ".ccss", ".cmd", ".command", ".gam", ".gz", ".icc", ".icm", ".log", ".png", ".sh", ".ti1", ".ti3", ".wrl", ".wrz"] save_path = getcfg("profile.save_path") if dst_path is None: dst_path = os.path.join(save_path, getcfg("profile.name.expanded"), getcfg("profile.name.expanded") + ".ext") if isinstance(copy, Exception): # This is an incomplete run parts = os.path.normpath(dst_path).split(os.sep) # DON'T use os.path.join due to how it works under Windows: # os.path.join("c:", "foo") represents a path relative to # the current directory on drive C: (c:foo), not c:\foo. if os.sep.join(parts[:-2]) == os.path.normpath(save_path): # If storage directory, save incomplete runs to # different directory parts = [config.datahome, "incomplete"] + parts[-2:] dst_path = os.sep.join(parts) result = check_create_dir(os.path.dirname(dst_path)) if isinstance(result, Exception): remove = False else: if isinstance(copy, Exception): safe_print("Moving files of incomplete run to", os.path.dirname(dst_path)) for basename in src_listdir: name, ext = os.path.splitext(basename) if ext_filter is None or ext.lower() in ext_filter: src = os.path.join(self.tempdir, basename) dst = os.path.join(os.path.dirname(dst_path), basename) if sys.platform == "win32": dst = make_win32_compatible_long_path(dst) if os.path.exists(dst): if os.path.isdir(dst): if verbose >= 2: safe_print(appname + ": Removing existing " "destination directory tree", dst) try: shutil.rmtree(dst, True) except Exception, exception: safe_print(u"Warning - directory '%s' " u"could not be removed: %s" % tuple(safe_unicode(s) for s in (dst, exception))) else: if verbose >= 2: safe_print(appname + ": Removing existing " "destination file", dst) try: os.remove(dst) except Exception, exception: safe_print(u"Warning - file '%s' could " u"not be removed: %s" % tuple(safe_unicode(s) for s in (dst, exception))) if remove: if verbose >= 2: safe_print(appname + ": Moving temporary " "object %s to %s" % (src, dst)) try: shutil.move(src, dst) except Exception, exception: safe_print(u"Warning - temporary object " u"'%s' could not be moved to " u"'%s': %s" % tuple(safe_unicode(s) for s in (src, dst, exception))) try: shutil.copyfile(src, dst) except Exception, exception: result = Error(lang.getstr("error.copy_failed", (src, dst))) else: if os.path.isdir(src): if verbose >= 2: safe_print(appname + ": Copying temporary " "directory tree %s to %s" % (src, dst)) try: shutil.copytree(src, dst) except Exception, exception: safe_print(u"Warning - temporary " u"directory '%s' could not " u"be copied to '%s': %s" % tuple(safe_unicode(s) for s in (src, dst, exception))) else: if verbose >= 2: safe_print(appname + ": Copying temporary " "file %s to %s" % (src, dst)) try: shutil.copyfile(src, dst) except Exception, exception: safe_print(u"Warning - temporary file " u"'%s' could not be copied " u"to '%s': %s" % tuple(safe_unicode(s) for s in (src, dst, exception))) if remove: try: src_listdir = os.listdir(self.tempdir) except Exception, exception: safe_print(u"Error - directory '%s' listing failed: %s" % tuple(safe_unicode(s) for s in (self.tempdir, exception))) else: for basename in src_listdir: name, ext = os.path.splitext(basename) if ext_filter is None or ext.lower() not in ext_filter: src = os.path.join(self.tempdir, basename) isdir = os.path.isdir(src) if isdir: if verbose >= 2: safe_print(appname + ": Removing temporary " "directory tree", src) try: shutil.rmtree(src, True) except Exception, exception: safe_print(u"Warning - temporary directory " u"'%s' could not be removed: %s" % tuple(safe_unicode(s) for s in (src, exception))) else: if verbose >= 2: safe_print(appname + ": Removing temporary file", src) try: os.remove(src) except Exception, exception: safe_print(u"Warning - temporary file " u"'%s' could not be removed: %s" % tuple(safe_unicode(s) for s in (src, exception))) try: src_listdir = os.listdir(self.tempdir) except Exception, exception: safe_print(u"Error - directory '%s' listing failed: %s" % tuple(safe_unicode(s) for s in (self.tempdir, exception))) else: if not src_listdir: if verbose >= 2: safe_print(appname + ": Removing empty temporary directory", self.tempdir) try: shutil.rmtree(self.tempdir, True) except Exception, exception: safe_print(u"Warning - temporary directory '%s' could " u"not be removed: %s" % tuple(safe_unicode(s) for s in (self.tempdir, exception))) if isinstance(result, Exception): result = Error(safe_unicode(result) + "\n\n" + lang.getstr("tempdir_should_still_contain_files", self.tempdir)) return result def write(self, txt): if True: # Don't buffer self._write(txt) return # NEVER - Use line buffer self.buffer.append(txt) self.buffer = [line for line in StringIO("".join(self.buffer))] for line in self.buffer: if not (line.endswith("\n") or line.rstrip().endswith(":") or line.rstrip().endswith(",") or line.rstrip().endswith(".")): break self._write(line) self.buffer = self.buffer[1:] def _write(self, txt): if re.search("press 1|space when done|patch 1 of ", txt, re.I): # There are some intial measurements which we can't check for # unless -D (debug) is used for Argyll tools if not "patch 1 of " in txt.lower() or not self.patch_sequence: if "patch 1 of " in txt.lower(): self.patch_sequence = True self.patch_count = 0 self.patterngenerator_sent_count = 0 update = re.search(r"[/\\] current|patch \d+ of |the instrument " "can be removed from the screen", txt, re.I) # Send colors to pattern generator use_patterngenerator = (self.use_patterngenerator and self.patterngenerator and hasattr(self.patterngenerator, "conn")) if use_patterngenerator or self.use_madnet_tpg: rgb = re.search(r"Current RGB(?:\s+\d+){3}((?:\s+\d+(?:\.\d+)){3})", txt) if rgb: rgb = [float(v) for v in rgb.groups()[0].strip().split()] if self.use_madnet_tpg: if self.madtpg.show_rgb(*rgb): self.patterngenerator_sent_count += 1 self.log("%s: MadTPG_Net sent count: %i" % (appname, self.patterngenerator_sent_count)) else: self.exec_cmd_returnvalue = Error(lang.getstr("patterngenerator.sync_lost")) self.abort_subprocess() else: self.patterngenerator_send(rgb) # Create .ok file which will be picked up by .wait script okfilename = os.path.join(self.tempdir, ".ok") open(okfilename, "w").close() if update: # Check if patch count is higher than patterngenerator sent count if (self.patch_count > self.patterngenerator_sent_count and self.exec_cmd_returnvalue is None): # This should never happen self.exec_cmd_returnvalue = Error(lang.getstr("patterngenerator.sync_lost")) self.abort_subprocess() if update and not (self.subprocess_abort or self.thread_abort or "the instrument can be removed from the screen" in txt.lower()): self.patch_count += 1 if use_patterngenerator or self.use_madnet_tpg: self.log("%s: Argyll CMS patch update count: %i" % (appname, self.patch_count)) if self.use_madnet_tpg and re.match("Patch \\d+ of \\d+", txt, re.I): # Set madTPG progress bar components = txt.split() try: start = int(components[1]) end = int(components[3]) except ValueError: pass else: self.madtpg.set_progress_bar_pos(start, end) # Parse wx.CallAfter(self.parse, txt) def xicclu(self, profile, idata, intent="r", direction="f", order="n", pcs=None, scale=1, cwd=None, startupinfo=None, raw=False, logfile=None, use_icclu=False, use_cam_clipping=False, get_clip=False, show_actual_if_clipped=False, input_encoding=None, output_encoding=None): """ Call xicclu, feed input floats into stdin, return output floats. input data needs to be a list of 3-tuples (or lists) with floats, alternatively a list of strings. output data will be returned in same format, or as list of strings if 'raw' is true. """ with Xicclu(profile, intent, direction, order, pcs, scale, cwd, startupinfo, use_icclu, use_cam_clipping, logfile, self, show_actual_if_clipped, input_encoding, output_encoding) as xicclu: xicclu(idata) return xicclu.get(raw, get_clip) class Xicclu(Worker): def __init__(self, profile, intent="r", direction="f", order="n", pcs=None, scale=1, cwd=None, startupinfo=None, use_icclu=False, use_cam_clipping=False, logfile=None, worker=None, show_actual_if_clipped=False, input_encoding=None, output_encoding=None): Worker.__init__(self) self.logfile = logfile self.worker = worker self.temp = False utilname = "icclu" if use_icclu else "xicclu" xicclu = get_argyll_util(utilname) if not xicclu: raise Error(lang.getstr("argyll.util.not_found", utilname)) if not isinstance(profile, (CGATS.CGATS, ICCP.ICCProfile)): if profile.lower().endswith(".cal"): profile = CGATS.CGATS(profile) else: profile = ICCP.ICCProfile(profile) is_profile = isinstance(profile, ICCP.ICCProfile) if not profile.fileName or not os.path.isfile(profile.fileName): if not cwd: cwd = self.create_tempdir() if isinstance(cwd, Exception): raise cwd fd, profile.fileName = tempfile.mkstemp(profile_ext, dir=cwd) stream = os.fdopen(fd, "wb") profile.write(stream) stream.close() self.temp = True elif not cwd: cwd = os.path.dirname(profile.fileName) profile_basename = safe_unicode(os.path.basename(profile.fileName)) profile_path = profile.fileName if sys.platform == "win32": profile_path = win32api.GetShortPathName(profile_path) self.profile_path = safe_str(profile_path) if sys.platform == "win32" and not startupinfo: startupinfo = sp.STARTUPINFO() startupinfo.dwFlags |= sp.STARTF_USESHOWWINDOW startupinfo.wShowWindow = sp.SW_HIDE xicclu = safe_str(xicclu) cwd = safe_str(cwd) args = [xicclu, "-s%s" % scale] if utilname == "xicclu": if (is_profile and show_actual_if_clipped and "A2B0" in profile.tags and ("B2A0" in profile.tags or direction == "if")): args.append("-a") if use_cam_clipping: args.append("-b") if get_argyll_version("xicclu") >= [1, 6]: # Add encoding parameters # Note: Not adding -e -E can cause problems due to unitialized # in_tvenc and out_tvenc variables in xicclu.c for Argyll 1.6.x if not input_encoding: input_encoding = "n" if not output_encoding: output_encoding = "n" args += ["-e" + input_encoding, "-E" + output_encoding] args.append("-f" + direction) if is_profile: if profile.profileClass not in ("abst", "link"): args.append("-i" + intent) if order != "n": args.append("-o" + order) if pcs and profile.profileClass != "link": args.append("-p" + pcs) args.append(self.profile_path) if debug or verbose > 1: self.sessionlogfile = LogFile(profile_basename + ".xicclu", os.path.dirname(profile.fileName)) if is_profile: profile_act = ICCP.ICCProfile(profile.fileName) self.sessionlogfile.write("Profile ID %s (actual %s)" % (hexlify(profile.ID), hexlify(profile_act.calculateID(False)))) if cwd: self.log(lang.getstr("working_dir")) indent = " " for name in cwd.split(os.path.sep): self.log(textwrap.fill(name + os.path.sep, 80, expand_tabs=False, replace_whitespace=False, initial_indent=indent, subsequent_indent=indent)) indent += " " self.log("") self.log(lang.getstr("commandline")) printcmdline(xicclu if debug or verbose > 2 else os.path.basename(xicclu), args[1:], fn=self.log, cwd=cwd) self.log("") self.stdout = tempfile.SpooledTemporaryFile() self.stderr = tempfile.SpooledTemporaryFile() self.subprocess = sp.Popen(args, stdin=sp.PIPE, stdout=self.stdout, stderr=self.stderr, cwd=cwd, startupinfo=startupinfo) def __call__(self, idata): if not isinstance(idata, basestring): idata = list(idata) # Make a copy for i, v in enumerate(idata): if isinstance(v, (float, int, long)): self([idata]) return if not isinstance(v, basestring): for n in v: if not isinstance(n, (float, int, long)): raise TypeError("xicclu: Expecting list of " "strings or n-tuples with " "floats") idata[i] = " ".join([str(n) for n in v]) else: idata = idata.splitlines() numrows = len(idata) chunklen = 1000 i = 0 p = self.subprocess while True: # Process in chunks to prevent broken pipe if input data is too # large if self.subprocess_abort or self.thread_abort: if p.poll() is None: p.stdin.write("\n") p.stdin.close() p.wait() raise Info(lang.getstr("aborted")) if p.poll() is None: # We don't use communicate() because it will end the # process p.stdin.write("\n".join(idata[chunklen * i: chunklen * (i + 1)]) + "\n") p.stdin.flush() else: # Error break if self.logfile: self.logfile.write("\r%i%%" % min(round(chunklen * (i + 1) / float(numrows) * 100), 100)) if chunklen * (i + 1) > numrows - 1: break i += 1 def __enter__(self): return self def __exit__(self, etype=None, value=None, tb=None): self.exit() if tb: return False def exit(self): p = self.subprocess if p.poll() is None: try: p.stdin.write("\n") except IOError: pass p.stdin.close() p.wait() self.stdout.seek(0) self.output = self.stdout.readlines() self.stdout.close() self.stderr.seek(0) self.errors = self.stderr.readlines() self.stderr.close() if self.sessionlogfile and self.errors: self.sessionlogfile.write("\n".join(self.errors)) if p.returncode: # Error raise IOError("\n".join(self.errors)) if self.logfile: self.logfile.write("\n") if self.temp: os.remove(self.profile_path) if self.tempdir and not os.listdir(self.tempdir): self.wrapup(False) def get(self, raw=False, get_clip=False): if raw: if self.sessionlogfile: self.sessionlogfile.write("\n".join(self.output)) self.sessionlogfile.close() return self.output parsed = [] j = 0 for i, line in enumerate(self.output): line = line.strip() if line.startswith("["): if self.sessionlogfile: self.sessionlogfile.write(line) continue elif not "->" in line: if self.sessionlogfile and line: self.sessionlogfile.write(line) continue elif self.sessionlogfile: self.sessionlogfile.write("#%i %s" % (j, line)) parts = line.split("->")[-1].strip().split() clip = parts.pop() == "(clip)" if clip: parts.pop() parsed.append([float(n) for n in parts]) if get_clip: parsed[-1].append(clip) j += 1 if self.sessionlogfile: self.sessionlogfile.close() return parsed @Property def subprocess_abort(): def fget(self): if self.worker: return self.worker.subprocess_abort return False def fset(self, v): pass return locals() @Property def thread_abort(): def fget(self): if self.worker: return self.worker.thread_abort return False def fset(self, v): pass return locals() DisplayCAL-3.1.0.0/DisplayCAL/wxaddons.py0000644000076500000000000002727412647526531017647 0ustar devwheel00000000000000# -*- coding: utf-8 -*- from time import sleep import os import sys import threading import types from wxfixes import wx def AdjustMinMax(self, minvalue=0.0, maxvalue=1.0): """ Adjust min/max """ buffer = self.GetDataBuffer() for i, byte in enumerate(buffer): buffer[i] = chr(min(int(round(minvalue * 255 + ord(byte) * (maxvalue - minvalue))), 255)) wx.Image.AdjustMinMax = AdjustMinMax def Blend(self, bitmap, x, y): """ Blend the given bitmap over the specified position in this bitmap. """ dc = wx.MemoryDC(self) dc.DrawBitmap(bitmap, x, y) wx.Bitmap.Blend = Blend def GetRealClientArea(self): """ Return the real (non-overlapping) client area of a display """ # need to fix overlapping ClientArea on some Linux multi-display setups # the client area must be always smaller than the geometry clientarea = list(self.ClientArea) if self.Geometry[0] > clientarea[0]: clientarea[0] = self.Geometry[0] if self.Geometry[1] > clientarea[1]: clientarea[1] = self.Geometry[1] if self.Geometry[2] < clientarea[2]: clientarea[2] = self.Geometry[2] if self.Geometry[3] < clientarea[3]: clientarea[3] = self.Geometry[3] return wx.Rect(*clientarea) wx.Display.GetRealClientArea = GetRealClientArea def GetAllChildren(self, skip=None): """ Get children of window and its subwindows """ if not isinstance(skip, (list, tuple)): skip = [skip] children = filter(lambda child: child not in skip, self.GetChildren()) allchildren = [] for child in children: allchildren.append(child) if hasattr(child, "GetAllChildren") and hasattr(child.GetAllChildren, "__call__"): allchildren += child.GetAllChildren(skip) return allchildren wx.Window.GetAllChildren = GetAllChildren def GetDisplay(self): """ Return the display the window is shown on """ display_no = wx.Display.GetFromWindow(self) if display_no < 0: # window outside visible area display_no = 0 return wx.Display(display_no) wx.Window.GetDisplay = GetDisplay def SetMaxFontSize(self, pointsize=11): font = self.GetFont() if font.GetPointSize() > pointsize: font.SetPointSize(pointsize) self.SetFont(font) wx.Window.SetMaxFontSize = SetMaxFontSize def SetSaneGeometry(self, x=None, y=None, w=None, h=None): """ Set a 'sane' window position and/or size (within visible screen area). """ if not None in (x, y): # First, move to coordinates given self.SetPosition((x, y)) # Returns the first display's client area if the window # is completely outside the client area of all displays display_client_rect = self.GetDisplay().ClientArea if sys.platform not in ("darwin", "win32"): # Linux safety_margin = 40 else: safety_margin = 20 if not None in (w, h): # Set given size, but resize if needed to fit inside client area min_w, min_h = self.MinSize self.SetSize((max(min(display_client_rect[2], w), min_w), max(min(display_client_rect[3] - safety_margin, h), min_h))) if not None in (x, y): if not display_client_rect.ContainsXY(x, y) or \ not display_client_rect.ContainsRect((x, y, 100, 100)): # If outside client area or near the borders, # move to leftmost / topmost coordinates of client area self.SetPosition(display_client_rect[0:2]) wx.Window.SetSaneGeometry = SetSaneGeometry def GridGetSelectedRowsFromSelection(self): """ Return the number of fully selected rows. Unlike GetSelectedRows, include rows that have been selected by chosing individual cells. """ numcols = self.GetNumberCols() rows = [] i = -1 for cell in self.GetSelection(): row, col = cell if row > i: i = row rownumcols = 0 rownumcols += 1 if rownumcols == numcols: rows.append(row) return rows wx.grid.Grid.GetSelectedRowsFromSelection = GridGetSelectedRowsFromSelection def GridGetSelectionRows(self): """ Return the selected rows, even if not all cells in a row are selected. """ rows = [] i = -1 for row, col in self.GetSelection(): if row > i: i = row rows.append(row) return rows wx.grid.Grid.GetSelectionRows = GridGetSelectionRows def IsSizer(self): """ Check if the window is a sizer """ return isinstance(self, wx.Sizer) wx.Window.IsSizer = IsSizer def get_platform_window_decoration_size(): if sys.platform in ("darwin", "win32"): # Size includes windows decoration if sys.platform == "win32": border = 8 # Windows 7 titlebar = 30 # Windows 7 else: border = 0 # Mac OS X 10.7 Lion titlebar = 22 # Mac OS X 10.7 Lion else: # Linux. Size does not include window decoration border = 0 titlebar = 0 return border, titlebar class CustomEvent(wx.PyEvent): def __init__(self, typeId, object, window=None): wx.PyEvent.__init__(self, object.GetId(), typeId) self.evtType = [typeId] self.typeId = typeId self.object = object self.window = window def GetEventObject(self): return self.object def GetEventType(self): return self.typeId def GetWindow(self): return self.window _global_timer_lock = threading.Lock() wxEVT_BETTERTIMER = wx.NewEventType() EVT_BETTERTIMER = wx.PyEventBinder(wxEVT_BETTERTIMER, 1) class BetterTimerEvent(wx.PyCommandEvent): def __init__(self, id=wx.ID_ANY, ms=0): wx.PyCommandEvent.__init__(self, wxEVT_BETTERTIMER, id) self._ms = ms def GetInterval(self): return self._ms Interval = property(GetInterval) class BetterTimer(wx.Timer): """ A wx.Timer replacement. Doing GUI updates using regular timers can be incredibly segfaulty under wxPython Phoenix when several timers run concurrently. This approach uses a global lock to work around the issue. """ def __init__(self, owner=None, timerid=wx.ID_ANY): wx.Timer.__init__(self, None, timerid) self._owner = owner def Notify(self): if self._owner and _global_timer_lock.acquire(False): try: wx.PostEvent(self._owner, BetterTimerEvent(self.Id, self.Interval)) finally: _global_timer_lock.release() class BetterCallLater(wx.CallLater): def __init__(self, millis, callableObj, *args, **kwargs): wx.CallLater.__init__(self, millis, callableObj, *args, **kwargs) def Notify(self): if _global_timer_lock.acquire(True): try: wx.CallLater.Notify(self) finally: _global_timer_lock.release() class ThreadedTimer(object): """ A wx.Timer replacement that uses threads instead of actual timers which are a limited resource """ def __init__(self, owner=None, timerid=wx.ID_ANY): self._owner = owner if timerid < 0: timerid = wx.NewId() self._id = timerid self._ms = 0 self._oneshot = False self._keep_running = False self._thread = None def _notify(self): if self._owner and _global_timer_lock.acquire(self._oneshot): try: self.Notify() finally: _global_timer_lock.release() def _timer(self): self._keep_running = True while self._keep_running: sleep(self._ms / 1000.0) if self._keep_running: wx.CallAfter(self._notify) if self._oneshot: self._keep_running = False def Destroy(self): pass def GetId(self): return self._id def GetInterval(self): return self._ms def GetOwner(self): return self._owner def SetOwner(self, owner): self._owner = owner Id = property(GetId) Interval = property(GetInterval) Owner = property(GetOwner, SetOwner) def IsOneShot(self): return self._oneshot def IsRunning(self): return self._keep_running def Notify(self): self._owner.ProcessEvent(BetterTimerEvent(self._id, self._ms)) def Start(self, milliseconds=-1, oneShot=False): if self._thread and self._thread.isAlive(): self._keep_running = False self._thread.join() if milliseconds > -1: self._ms = milliseconds self._oneshot = oneShot self._thread = threading.Thread(target=self._timer) self._thread.start() def Stop(self): self._keep_running = False class ThreadedCallLater(ThreadedTimer): def __init__(self, millis, callableObj, *args, **kwargs): BetterTimer.__init__(self) self._oneshot = True self._callable = callableObj self._has_run = False self._result = None self.SetArgs(*args, **kwargs) self.Start(millis) def GetResult(self): return self._result Result = property(GetResult) def HasRun(self): return self._has_run def Notify(self): self._result = self._callable(*self._args, **self._kwargs) self._has_run = True def SetArgs(self, *args, **kwargs): self._args = args self._kwargs = kwargs def Start(self, millis=None, *args, **kwargs): if args: self._args = args if kwargs: self._kwargs = kwargs BetterTimer.Start(self, millis, True) Restart = Start class BetterWindowDisabler(object): """ Also disables child windows instead of only top level windows. This is actually needed under Mac OS X where disabling a top level window will not prevent interaction with its children. """ def __init__(self, skip=None): self._windows = [] self.skip = skip self.id = id(self) self.disable() def __del__(self): self.enable() def disable(self): self.enable(False) def enable(self, enable=True): if not enable: skip = self.skip or [] if skip: if not isinstance(skip, (list, tuple)): skip = [skip] toplevel = list(wx.GetTopLevelWindows()) for w in toplevel: if w and w not in skip and "Inspection" not in "%s" % w: self._windows.append(w) for child in w.GetAllChildren(skip + toplevel): if child and not isinstance(child, (wx.Panel, wx.PyPanel)): # Don't disable panels, this can have weird side # effects for contained controls self._windows.append(child) def Enable(w, enable=True): w._BetterWindowDisabler_enabled = enable def Disable(w): w._BetterWindowDisabler_enabled = False for w in reversed(self._windows): if hasattr(w, "_BetterWindowDisabler_disabler_id"): continue w._BetterWindowDisabler_disabler_id = self.id enabled = w.IsEnabled() w.Disable() w._BetterWindowDisabler_Disable = w.Disable w.Disable = types.MethodType(Disable, w, type(w)) w._BetterWindowDisabler_Enable = w.Enable w.Enable = types.MethodType(Enable, w, type(w)) w.Enable(enabled) return for w in self._windows: if w: if getattr(w, "_BetterWindowDisabler_disabler_id", None) != self.id: continue if hasattr(w, "_BetterWindowDisabler_Disable"): w.Disable = w._BetterWindowDisabler_Disable if hasattr(w, "_BetterWindowDisabler_Enable"): w.Enable = w._BetterWindowDisabler_Enable if hasattr(w, "_BetterWindowDisabler_enabled"): w.Enable(w._BetterWindowDisabler_enabled) del w._BetterWindowDisabler_disabler_id class CustomGridCellEvent(CustomEvent): def __init__(self, typeId, object, row=-1, col=-1, window=None): CustomEvent.__init__(self, typeId, object, window) self.row = row self.col = col @property def Col(self): return self.col def GetRow(self): return self.row def GetCol(self): return self.col @property def Row(self): return self.row class FileDrop(wx.FileDropTarget): def __init__(self, drophandlers=None): wx.FileDropTarget.__init__(self) if drophandlers is None: drophandlers = {} self.drophandlers = drophandlers self.unsupported_handler = None def OnDropFiles(self, x, y, filenames): self._files = [] self._filenames = filenames for filename in filenames: name, ext = os.path.splitext(filename) if ext.lower() in self.drophandlers: self._files.append((ext.lower(), filename)) if self._files: self._files.reverse() wx.CallLater(1, wx.CallAfter, self.process) elif self.unsupported_handler: wx.CallLater(1, wx.CallAfter, self.unsupported_handler) return False def process(self): ms = 1.0 / 60 while self._files: if hasattr(self, "parent") and hasattr(self.parent, "worker"): while self.parent.worker.is_working(): wx.Yield() sleep(ms) if self.parent.worker.thread_abort: return ext, filename = self._files.pop() self.drophandlers[ext](filename) DisplayCAL-3.1.0.0/DisplayCAL/wxDisplayAdjustmentFrame.py0000644000076500000000000016634612647526531023022 0ustar devwheel00000000000000# -*- coding: UTF-8 -*- """ Interactive display calibration UI """ import os import re import sys if sys.platform == "win32": from ctypes import windll elif sys.platform == "darwin": from platform import mac_ver from wxaddons import wx from lib.agw import labelbook from lib.agw.fmresources import * from lib.agw.pygauge import PyGauge from config import (get_data_path, get_default_dpi, get_icon_bundle, getbitmap, getcfg, setcfg) from config import enc from log import get_file_logger from meta import name as appname from ordereddict import OrderedDict from util_list import intlist from util_str import safe_unicode, wrap from wxwindows import BaseApp, BaseFrame, FlatShadedButton, numpad_keycodes import audio import config import localization as lang BGCOLOUR = wx.Colour(0x33, 0x33, 0x33) BORDERCOLOUR = wx.Colour(0x22, 0x22, 0x22) FGCOLOUR = wx.Colour(0x99, 0x99, 0x99) CRT = True def get_panel(parent, size=wx.DefaultSize): panel = wx.Panel(parent, wx.ID_ANY, size=size) if "--debug" in sys.argv[1:]: from random import randint panel.SetBackgroundColour(wx.Colour(randint(0, 255), randint(0, 255), randint(0, 255))) get_panel.i += 1 wx.StaticText(panel, wx.ID_ANY, str(get_panel.i) + " " + str(size)) else: panel.SetBackgroundColour(BGCOLOUR) return panel get_panel.i = 0 def get_xy_vt_dE(groups): x = float(groups[0]) y = float(groups[1]) vt = "" dE = 0 if len(groups) > 2: vt = groups[2] or "" if groups[3]: dE = float(groups[3]) return x, y, vt, dE def set_label_and_size(txtctrl, label): txtctrl.SetMinSize((txtctrl.GetSize()[0], -1)) txtctrl.SetLabel(label) txtctrl.SetMinSize(txtctrl.GetSize()) class DisplayAdjustmentImageContainer(labelbook.ImageContainer): def __init__(self, parent, id=wx.ID_ANY, pos=wx.DefaultPosition, size=wx.DefaultSize, style=0, agwStyle=0, name="ImageContainer"): """ Override default agw ImageContainer to use BackgroundColour and ForegroundColour with no borders/labeltext and hilite image instead of hilite shading """ labelbook.ImageContainer.__init__(self, parent, id, pos, size, style, agwStyle, name) imagelist = None for img in ("tab_hilite", "tab_selected"): bmp = getbitmap("theme/%s" % img) if not imagelist: img_w, img_h = bmp.Size imagelist = wx.ImageList(img_w, img_h) imagelist.Add(bmp) self.stateimgs = imagelist def HitTest(self, pt): """ Returns the index of the tab at the specified position or ``wx.NOT_FOUND`` if ``None``, plus the flag style of L{HitTest}. :param `pt`: an instance of `wx.Point`, to test for hits. :return: The index of the tab at the specified position plus the hit test flag, which can be one of the following bits: ====================== ======= ================================ HitTest Flags Value Description ====================== ======= ================================ ``IMG_OVER_IMG`` 0 The mouse is over the tab icon ``IMG_OVER_PIN`` 1 The mouse is over the pin button ``IMG_OVER_EW_BORDER`` 2 The mouse is over the east-west book border ``IMG_NONE`` 3 Nowhere ====================== ======= ================================ """ if self.GetParent().GetParent().is_busy: return -1, IMG_NONE style = self.GetParent().GetAGWWindowStyleFlag() if style & INB_USE_PIN_BUTTON: if self._pinBtnRect.Contains(pt): return -1, IMG_OVER_PIN for i in xrange(len(self._pagesInfoVec)): if self._pagesInfoVec[i].GetPosition() == wx.Point(-1, -1): break if i in self.GetParent().disabled_pages: continue # For Web Hover style, we test the TextRect if not self.HasAGWFlag(INB_WEB_HILITE): buttonRect = wx.RectPS((self._pagesInfoVec[i].GetPosition()[0], self._pagesInfoVec[i].GetPosition()[1] + i * 8), self._pagesInfoVec[i].GetSize()) else: buttonRect = self._pagesInfoVec[i].GetTextRect() if buttonRect.Contains(pt): return i, IMG_OVER_IMG if self.PointOnSash(pt): return -1, IMG_OVER_EW_BORDER else: return -1, IMG_NONE def OnPaint(self, event): """ Handles the ``wx.EVT_PAINT`` event for L{ImageContainer}. :param `event`: a `wx.PaintEvent` event to be processed. """ dc = wx.BufferedPaintDC(self) style = self.GetParent().GetAGWWindowStyleFlag() backBrush = wx.Brush(self.GetBackgroundColour()) if style & INB_BORDER: borderPen = wx.Pen(wx.SystemSettings_GetColour(wx.SYS_COLOUR_3DSHADOW)) else: borderPen = wx.TRANSPARENT_PEN size = self.GetSize() # Background dc.SetBrush(backBrush) borderPen.SetWidth(1) dc.SetPen(borderPen) dc.DrawRectangle(0, 0, size.x, size.y) bUsePin = (style & INB_USE_PIN_BUTTON and [True] or [False])[0] if bUsePin: # Draw the pin button clientRect = self.GetClientRect() pinRect = wx.Rect(clientRect.GetX() + clientRect.GetWidth() - 20, 2, 20, 20) self.DrawPin(dc, pinRect, not self._bCollapsed) if self._bCollapsed: return clientSize = 0 bUseYcoord = (style & INB_RIGHT or style & INB_LEFT) if bUseYcoord: clientSize = size.GetHeight() else: clientSize = size.GetWidth() # We reserver 20 pixels for the 'pin' button # The drawing of the images start position. This is # depenedent of the style, especially when Pin button # style is requested if bUsePin: if style & INB_TOP or style & INB_BOTTOM: pos = (style & INB_BORDER and [0] or [1])[0] else: pos = (style & INB_BORDER and [20] or [21])[0] else: pos = (style & INB_BORDER and [0] or [1])[0] nPadding = 4 # Pad text with 2 pixels on the left and right nTextPaddingLeft = 2 count = 0 for i in xrange(len(self._pagesInfoVec)): if self.GetParent().GetParent().is_busy and i != self.GetParent().GetSelection(): continue if i in self.GetParent().disabled_pages: continue count = count + 1 # incase the 'fit button' style is applied, we set the rectangle width to the # text width plus padding # Incase the style IS applied, but the style is either LEFT or RIGHT # we ignore it normalFont = wx.SystemSettings_GetFont(wx.SYS_DEFAULT_GUI_FONT) dc.SetFont(normalFont) textWidth, textHeight = dc.GetTextExtent(self._pagesInfoVec[i].GetCaption()) # Restore font to be normal normalFont.SetWeight(wx.FONTWEIGHT_NORMAL) dc.SetFont(normalFont) # Default values for the surronounding rectangle # around a button rectWidth = self._nImgSize # To avoid the recangle to 'touch' the borders rectHeight = self._nImgSize # Incase the style requires non-fixed button (fit to text) # recalc the rectangle width if style & INB_FIT_BUTTON and \ not ((style & INB_LEFT) or (style & INB_RIGHT)) and \ not self._pagesInfoVec[i].GetCaption() == "" and \ not (style & INB_SHOW_ONLY_IMAGES): rectWidth = ((textWidth + nPadding * 2) > rectWidth and [nPadding * 2 + textWidth] or [rectWidth])[0] # Make the width an even number if rectWidth % 2 != 0: rectWidth += 1 # Check that we have enough space to draw the button # If Pin button is used, consider its space as well (applicable for top/botton style) # since in the left/right, its size is already considered in 'pos' pinBtnSize = (bUsePin and [20] or [0])[0] if pos + rectWidth + pinBtnSize > clientSize: break # Calculate the button rectangle modRectWidth = ((style & INB_LEFT or style & INB_RIGHT) and [rectWidth - 2] or [rectWidth])[0] modRectHeight = ((style & INB_LEFT or style & INB_RIGHT) and [rectHeight] or [rectHeight - 2])[0] if bUseYcoord: buttonRect = wx.Rect(1, pos, modRectWidth, modRectHeight) else: buttonRect = wx.Rect(pos , 1, modRectWidth, modRectHeight) if bUseYcoord: rect = wx.Rect(0, pos, rectWidth, rectWidth) else: rect = wx.Rect(pos, 0, rectWidth, rectWidth) # Incase user set both flags: # INB_SHOW_ONLY_TEXT and INB_SHOW_ONLY_IMAGES # We override them to display both if style & INB_SHOW_ONLY_TEXT and style & INB_SHOW_ONLY_IMAGES: style ^= INB_SHOW_ONLY_TEXT style ^= INB_SHOW_ONLY_IMAGES self.GetParent().SetAGWWindowStyleFlag(style) # Draw the caption and text imgTopPadding = 0 if not style & INB_SHOW_ONLY_TEXT and self._pagesInfoVec[i].GetImageIndex() != -1: if bUseYcoord: imgXcoord = 0 imgYcoord = (style & INB_SHOW_ONLY_IMAGES and [pos] or [pos + imgTopPadding])[0] + (8 * (count - 1)) else: imgXcoord = pos + (rectWidth / 2) - (self._nImgSize / 2) imgYcoord = (style & INB_SHOW_ONLY_IMAGES and [self._nImgSize / 2] or [imgTopPadding])[0] if self._nHoeveredImgIdx == i: self.stateimgs.Draw(0, dc, 0, imgYcoord, wx.IMAGELIST_DRAW_TRANSPARENT, True) if self._nIndex == i: self.stateimgs.Draw(1, dc, 0, imgYcoord, wx.IMAGELIST_DRAW_TRANSPARENT, True) self._ImageList.Draw(self._pagesInfoVec[i].GetImageIndex(), dc, imgXcoord, imgYcoord, wx.IMAGELIST_DRAW_TRANSPARENT, True) # Draw the text if not style & INB_SHOW_ONLY_IMAGES and not self._pagesInfoVec[i].GetCaption() == "": dc.SetFont(normalFont) # Check if the text can fit the size of the rectangle, # if not truncate it fixedText = self._pagesInfoVec[i].GetCaption() if not style & INB_FIT_BUTTON or (style & INB_LEFT or (style & INB_RIGHT)): fixedText = self.FixTextSize(dc, self._pagesInfoVec[i].GetCaption(), self._nImgSize *2 - 4) # Update the length of the text textWidth, textHeight = dc.GetTextExtent(fixedText) if bUseYcoord: textOffsetX = ((rectWidth - textWidth) / 2 ) textOffsetY = (not style & INB_SHOW_ONLY_TEXT and [pos + self._nImgSize + imgTopPadding + 3] or \ [pos + ((self._nImgSize * 2 - textHeight) / 2 )])[0] else: textOffsetX = (rectWidth - textWidth) / 2 + pos + nTextPaddingLeft textOffsetY = (not style & INB_SHOW_ONLY_TEXT and [self._nImgSize + imgTopPadding + 3] or \ [((self._nImgSize * 2 - textHeight) / 2 )])[0] dc.SetTextForeground(self.GetForegroundColour()) dc.DrawText(fixedText, textOffsetX, textOffsetY) # Update the page info self._pagesInfoVec[i].SetPosition(buttonRect.GetPosition()) self._pagesInfoVec[i].SetSize(buttonRect.GetSize()) pos += rectWidth # Update all buttons that can not fit into the screen as non-visible #for ii in xrange(count, len(self._pagesInfoVec)): #self._pagesInfoVec[ii].SetPosition(wx.Point(-1, -1)) # Draw the pin button if bUsePin: clientRect = self.GetClientRect() pinRect = wx.Rect(clientRect.GetX() + clientRect.GetWidth() - 20, 2, 20, 20) self.DrawPin(dc, pinRect, not self._bCollapsed) class DisplayAdjustmentFlatImageBook(labelbook.FlatImageBook): def __init__(self, parent, id=wx.ID_ANY, pos=wx.DefaultPosition, size=wx.DefaultSize, style=0, agwStyle=0, name="FlatImageBook"): """ Override default agw ImageContainer to use BackgroundColour and ForegroundColour with no borders/labeltext and hilite image instead of hilite shading """ labelbook.FlatImageBook.__init__(self, parent, id, pos, size, style, agwStyle, name) def CreateImageContainer(self): return DisplayAdjustmentImageContainer(self, wx.ID_ANY, agwStyle=self.GetAGWWindowStyleFlag()) def SetAGWWindowStyleFlag(self, agwStyle): """ Sets the window style. :param `agwStyle`: can be a combination of the following bits: =========================== =========== ================================================== Window Styles Hex Value Description =========================== =========== ================================================== ``INB_BOTTOM`` 0x1 Place labels below the page area. Available only for L{FlatImageBook}. ``INB_LEFT`` 0x2 Place labels on the left side. Available only for L{FlatImageBook}. ``INB_RIGHT`` 0x4 Place labels on the right side. ``INB_TOP`` 0x8 Place labels above the page area. ``INB_BORDER`` 0x10 Draws a border around L{LabelBook} or L{FlatImageBook}. ``INB_SHOW_ONLY_TEXT`` 0x20 Shows only text labels and no images. Available only for L{LabelBook}. ``INB_SHOW_ONLY_IMAGES`` 0x40 Shows only tab images and no label texts. Available only for L{LabelBook}. ``INB_FIT_BUTTON`` 0x80 Displays a pin button to show/hide the book control. ``INB_DRAW_SHADOW`` 0x100 Draw shadows below the book tabs. Available only for L{LabelBook}. ``INB_USE_PIN_BUTTON`` 0x200 Displays a pin button to show/hide the book control. ``INB_GRADIENT_BACKGROUND`` 0x400 Draws a gradient shading on the tabs background. Available only for L{LabelBook}. ``INB_WEB_HILITE`` 0x800 On mouse hovering, tabs behave like html hyperlinks. Available only for L{LabelBook}. ``INB_NO_RESIZE`` 0x1000 Don't allow resizing of the tab area. ``INB_FIT_LABELTEXT`` 0x2000 Will fit the tab area to the longest text (or text+image if you have images) in all the tabs. =========================== =========== ================================================== """ self._agwStyle = agwStyle # Check that we are not in initialization process if self._bInitializing: return if not self._pages: return # Detach the windows attached to the sizer if self.GetSelection() >= 0: self._mainSizer.Detach(self._windows[self.GetSelection()]) self._mainSizer.Detach(self._pages) # Create new sizer with the requested orientaion className = self.GetName() if className == "LabelBook": self._mainSizer = wx.BoxSizer(wx.HORIZONTAL) else: if agwStyle & INB_LEFT or agwStyle & INB_RIGHT: self._mainSizer = wx.BoxSizer(wx.HORIZONTAL) else: self._mainSizer = wx.BoxSizer(wx.VERTICAL) self.SetSizer(self._mainSizer) # Add the tab container and the separator self._mainSizer.Add(self._pages, 0, wx.EXPAND) if className == "FlatImageBook": scale = getcfg("app.dpi") / get_default_dpi() if scale < 1: scale = 1 if agwStyle & INB_LEFT or agwStyle & INB_RIGHT: border = int(round(24 * scale)) self._pages.SetSizeHints(self._pages._nImgSize + border, -1) else: self._pages.SetSizeHints(-1, self._pages._nImgSize) # Attach the windows back to the sizer to the sizer if self.GetSelection() >= 0: self.DoSetSelection(self._windows[self.GetSelection()]) if agwStyle & INB_FIT_LABELTEXT: self.ResizeTabArea() self._mainSizer.Layout() dummy = wx.SizeEvent(wx.DefaultSize) wx.PostEvent(self, dummy) self._pages.Refresh() class DisplayAdjustmentPanel(wx.Panel): def __init__(self, parent=None, id=wx.ID_ANY, title="", ctrltype="luminance"): wx.Panel.__init__(self, parent, id) self.ctrltype = ctrltype self.SetBackgroundColour(BGCOLOUR) self.SetForegroundColour(FGCOLOUR) self.SetSizer(wx.BoxSizer(wx.VERTICAL)) self.title_txt = wx.StaticText(self, wx.ID_ANY, title) font = self.title_txt.GetFont() font.SetPointSize(font.PointSize + 1) font.SetWeight(wx.FONTWEIGHT_BOLD) self.title_txt.SetFont(font) self.title_txt.SetForegroundColour(FGCOLOUR) self.GetSizer().Add(self.title_txt) self.sizer = wx.FlexGridSizer(0, 2, 0, 0) self.GetSizer().Add(self.sizer, flag=wx.TOP, border=8) self.gauges = OrderedDict() self.txt = OrderedDict() if ctrltype == "check_all": txt = wx.StaticText(self, wx.ID_ANY, lang.getstr("calibration.interactive_display_adjustment.check_all")) txt.SetForegroundColour(FGCOLOUR) txt.SetMaxFontSize(10) txt.Wrap(250) self.desc = txt self.GetSizer().Insert(1, txt, flag=wx.TOP, border=8) for name, lstr in (("luminance", "calibration.luminance"), ("black_level", "calibration.black_luminance"), ("white_point", "whitepoint"), ("black_point", "black_point")): bitmap = wx.StaticBitmap(self, wx.ID_ANY, getbitmap("theme/icons/16x16/%s" % name)) bitmap.SetToolTipString(lang.getstr(lstr)) self.add_txt(name, bitmap, 4) return if ctrltype.startswith("rgb"): if ctrltype == "rgb_offset": # CRT lstr = "calibration.interactive_display_adjustment.black_point.crt" else: lstr = "calibration.interactive_display_adjustment.white_point" txt = wx.StaticText(self, wx.ID_ANY, lang.getstr(lstr) + " " + lang.getstr("calibration.interactive_display_adjustment.generic_hint.plural")) txt.SetForegroundColour(FGCOLOUR) txt.SetMaxFontSize(10) txt.Wrap(250) self.desc = txt self.GetSizer().Insert(1, txt, flag=wx.TOP, border=8) self.sizer.Add((1, 4)) self.sizer.Add((1, 4)) self.add_marker() self.add_gauge("R", ctrltype + "_red", "R") self.sizer.Add((1, 4)) self.sizer.Add((1, 4)) self.add_gauge("G", ctrltype + "_green", "G") self.sizer.Add((1, 4)) self.sizer.Add((1, 4)) self.add_gauge("B", ctrltype + "_blue", "B") self.add_marker("btm") self.add_txt("rgb") else: txt = wx.StaticText(self, wx.ID_ANY, " ") txt.SetForegroundColour(FGCOLOUR) txt.SetMaxFontSize(10) txt.Wrap(250) self.desc = txt self.GetSizer().Insert(1, txt, flag=wx.TOP, border=8) self.sizer.Add((1, 4)) self.sizer.Add((1, 4)) self.add_marker() bitmapnames = {"rgb_offset": "black_level", "rgb_gain": "luminance"} lstrs = {"black_level": "calibration.black_luminance", "rgb_offset": "calibration.black_luminance", "rgb_gain": "calibration.luminance", "luminance": "calibration.luminance"} self.add_gauge("L", bitmapnames.get(ctrltype, ctrltype), lang.getstr(lstrs.get(ctrltype, ctrltype))) self.add_marker("btm") self.add_txt("luminance") def add_gauge(self, name="R", bitmapname=None, tooltip=None): if bitmapname == "black_level" or bitmapname.startswith("rgb_offset"): gaugecolors = {"R": (wx.Colour(102, 0, 0), wx.Colour(204, 0, 0)), "G": (wx.Colour(0, 102, 0), wx.Colour(0, 204, 0)), "B": (wx.Colour(0, 0, 102), wx.Colour(0, 0, 204)), "L": (wx.Colour(102, 102, 102), wx.Colour(204, 204, 204))} else: gaugecolors = {"R": (wx.Colour(153, 0, 0), wx.Colour(255, 0, 0)), "G": (wx.Colour(0, 153, 0), wx.Colour(0, 255, 0)), "B": (wx.Colour(0, 0, 153), wx.Colour(0, 0, 255)), "L": (wx.Colour(153, 153, 153), wx.Colour(255, 255, 255))} self.gauges[name] = PyGauge(self, size=(200, 8)) self.gauges[name].SetBackgroundColour(BORDERCOLOUR) self.gauges[name].SetBarGradient(gaugecolors[name]) self.gauges[name].SetBorderColour(BORDERCOLOUR) self.gauges[name].SetValue(0) if bitmapname: self.gauges[name].label = wx.StaticBitmap(self, wx.ID_ANY, getbitmap("theme/icons/16x16/%s" % bitmapname)) if tooltip: self.gauges[name].label.SetToolTipString(tooltip) else: self.gauges[name].label = wx.StaticText(self, wx.ID_ANY, name) self.gauges[name].label.SetForegroundColour(FGCOLOUR) self.sizer.Add(self.gauges[name].label, flag=wx.ALIGN_CENTER_VERTICAL | wx.RIGHT, border=8) self.sizer.Add(self.gauges[name], flag=wx.ALIGN_CENTER_VERTICAL) def add_marker(self, direction="top"): self.sizer.Add((1, 1)) self.sizer.Add(wx.StaticBitmap(self, -1, getbitmap("theme/marker_%s" % direction), size=(200, 10))) def add_txt(self, name, spacer=None, border=8): checkmark = wx.StaticBitmap(self, wx.ID_ANY, getbitmap("theme/icons/16x16/checkmark")) txtsizer = wx.BoxSizer(wx.HORIZONTAL) if spacer: self.sizer.Add(spacer, flag=wx.RIGHT | wx.ALIGN_CENTER_VERTICAL, border=8) txtsizer.Add(checkmark, flag=wx.RIGHT | wx.ALIGN_CENTER_VERTICAL, border=8) else: self.sizer.Add(checkmark, flag=wx.RIGHT | wx.TOP | wx.BOTTOM | wx.ALIGN_CENTER_VERTICAL, border=8) initial = lang.getstr("initial") current = lang.getstr("current") target = lang.getstr("target") strings = {len(initial): initial, len(current): current, len(target): target} longest = strings[max(strings.keys())] label = longest + u" x 0.0000 y 0.0000 VDT 0000K 0.0 \u0394E*00" checkmark.GetContainingSizer().Hide(checkmark) self.sizer.Add(txtsizer, flag=wx.TOP | wx.BOTTOM | wx.ALIGN_CENTER_VERTICAL, border=border) self.txt[name] = wx.StaticText(self, wx.ID_ANY, label) self.txt[name].SetForegroundColour(BGCOLOUR) self.txt[name].SetMaxFontSize(10) self.txt[name].checkmark = checkmark self.txt[name].spacer = spacer txtsizer.Add(self.txt[name]) self.txt[name].Fit() self.txt[name].SetMinSize((self.txt[name].GetSize()[0], self.txt[name].GetSize()[1] * 2)) def update_desc(self): if self.ctrltype in ("luminance", "black_level"): if self.ctrltype == "black_level": lstr = "calibration.interactive_display_adjustment.black_level.crt" elif getcfg("measurement_mode") == "c": # CRT lstr = "calibration.interactive_display_adjustment.white_level.crt" else: lstr = "calibration.interactive_display_adjustment.white_level.lcd" self.desc.SetLabel(lang.getstr(lstr) + " " + lang.getstr("calibration.interactive_display_adjustment.generic_hint.singular")) self.desc.Wrap(250) class DisplayAdjustmentFrame(BaseFrame): def __init__(self, parent=None, handler=None, keyhandler=None, start_timer=True): BaseFrame.__init__(self, parent, wx.ID_ANY, lang.getstr("calibration.interactive_display_adjustment"), style=wx.DEFAULT_FRAME_STYLE | wx.TAB_TRAVERSAL, name="displayadjustmentframe") self.SetIcons(get_icon_bundle([256, 48, 32, 16], appname)) self.SetBackgroundColour(BGCOLOUR) self.sizer = wx.FlexGridSizer(0, 3, 0, 0) self.sizer.AddGrowableCol(1) self.sizer.AddGrowableRow(2) self.SetSizer(self.sizer) # FlatImageNotebook self.lb = DisplayAdjustmentFlatImageBook(self, agwStyle=INB_LEFT | INB_SHOW_ONLY_IMAGES) self.lb.SetBackgroundColour(BGCOLOUR) self.add_panel((12, 12), flag=wx.EXPAND) self.add_panel((12, 12), flag=wx.EXPAND) self.add_panel((12, 12), flag=wx.EXPAND) self.add_panel((12, 12), flag=wx.EXPAND) self.sizer.Add(self.lb, 1, flag=wx.EXPAND) self.add_panel((12, 12), flag=wx.EXPAND) self.pagenum_2_argyll_key_num = {} # Page - black luminance self.page_black_luminance = DisplayAdjustmentPanel(self, wx.ID_ANY, lang.getstr("calibration.black_luminance"), "black_level") self.lb.AddPage(self.page_black_luminance, lang.getstr("calibration.black_luminance"), True, 0) self.pagenum_2_argyll_key_num[len(self.pagenum_2_argyll_key_num)] = "1" # Page - white point self.page_white_point = DisplayAdjustmentPanel(self, wx.ID_ANY, lang.getstr("whitepoint") + " / " + lang.getstr("calibration.luminance"), "rgb_gain") self.lb.AddPage(self.page_white_point, lang.getstr("whitepoint"), True, 1) self.pagenum_2_argyll_key_num[len(self.pagenum_2_argyll_key_num)] = "2" # Page - luminance self.page_luminance = DisplayAdjustmentPanel(self, wx.ID_ANY, lang.getstr("calibration.luminance")) self.lb.AddPage(self.page_luminance, lang.getstr("calibration.luminance"), True, 2) self.pagenum_2_argyll_key_num[len(self.pagenum_2_argyll_key_num)] = "3" # Page - black point self.page_black_point = DisplayAdjustmentPanel(self, wx.ID_ANY, lang.getstr("black_point") + " / " + lang.getstr("calibration.black_luminance"), "rgb_offset") self.lb.AddPage(self.page_black_point, lang.getstr("black_point"), True, 3) self.pagenum_2_argyll_key_num[len(self.pagenum_2_argyll_key_num)] = "4" # Page - check all self.page_check_all = DisplayAdjustmentPanel(self, wx.ID_ANY, lang.getstr("calibration.check_all"), "check_all") self.lb.AddPage(self.page_check_all, lang.getstr("calibration.check_all"), True, 4) self.pagenum_2_argyll_key_num[len(self.pagenum_2_argyll_key_num)] = "5" # Set colours on tab list self.lb.Children[0].SetBackgroundColour(BGCOLOUR) self.lb.Children[0].SetForegroundColour(FGCOLOUR) # Sound when measuring # Needs to be stereo! self.measurement_sound = audio.Sound(get_data_path("beep.wav")) # Add buttons self.btnsizer = wx.BoxSizer(wx.HORIZONTAL) self.add_panel((12, 12), flag=wx.EXPAND) self.add_panel((12, 12), flag=wx.EXPAND) self.add_panel((12, 12), flag=wx.EXPAND) self.add_panel((12, 12), flag=wx.EXPAND) self.sizer.Add(self.btnsizer, flag=wx.ALIGN_RIGHT | wx.EXPAND) self.btnsizer.Add(get_panel(self, (2, 12)), 1, flag=wx.EXPAND) self.indicator_panel = get_panel(self, (22, 12)) self.indicator_panel.SetSizer(wx.BoxSizer(wx.HORIZONTAL)) self.indicator_panel.SetForegroundColour(FGCOLOUR) self.btnsizer.Add(self.indicator_panel, flag=wx.EXPAND) self.indicator_ctrl = wx.StaticBitmap(self.indicator_panel, wx.ID_ANY, getbitmap("10x10/empty"), size=(10, 10)) self.indicator_ctrl.SetForegroundColour(FGCOLOUR) self.indicator_panel.GetSizer().Add(self.indicator_ctrl, flag=wx.ALIGN_CENTER_VERTICAL) self.indicator_panel.GetSizer().Add(get_panel(self.indicator_panel, (10, 12)), flag=wx.EXPAND) self.create_start_interactive_adjustment_button() self.adjustment_btn.SetDefault() self.btnsizer.Add(get_panel(self, (6, 12)), flag=wx.EXPAND) if getcfg("measurement.play_sound"): bitmap = getbitmap("theme/icons/16x16/sound_volume_full") else: bitmap = getbitmap("theme/icons/16x16/sound_off") self.sound_on_off_btn = self.create_gradient_button(bitmap, "", name="sound_on_off_btn") self.sound_on_off_btn.SetToolTipString(lang.getstr("measurement.play_sound")) self.sound_on_off_btn.Bind(wx.EVT_BUTTON, self.measurement_play_sound_handler) self.btnsizer.Add(get_panel(self, (12, 12)), flag=wx.EXPAND) self.calibration_btn = self.create_gradient_button(getbitmap("theme/icons/10x10/skip"), "", name="calibration_btn") self.calibration_btn.Bind(wx.EVT_BUTTON, self.continue_to_calibration) self.calibration_btn.Disable() self.add_panel((12, 12), flag=wx.EXPAND) self.add_panel((12, 12), flag=wx.EXPAND) self.add_panel((12, 12), flag=wx.EXPAND) self.add_panel((12, 12), flag=wx.EXPAND) self.keyhandler = keyhandler if sys.platform in ("darwin", "win32"): # Use an accelerator table for space, 0-9, A-Z, numpad keycodes = [ord(" ")] + range(ord("0"), ord("9")) + range(ord("A"), ord("Z")) + numpad_keycodes self.id_to_keycode = {} for keycode in keycodes: self.id_to_keycode[wx.NewId()] = keycode accels = [] for id, keycode in self.id_to_keycode.iteritems(): self.Bind(wx.EVT_MENU, self.key_handler, id=id) accels.append((wx.ACCEL_NORMAL, keycode, id)) self.SetAcceleratorTable(wx.AcceleratorTable(accels)) else: self.Bind(wx.EVT_CHAR_HOOK, self.key_handler) # Event handlers self.Bind(wx.EVT_CLOSE, self.OnClose, self) self.Bind(wx.EVT_MOVE, self.OnMove, self) self.timer = wx.Timer(self) if handler: self.Bind(wx.EVT_TIMER, handler, self.timer) self.Bind(labelbook.EVT_IMAGENOTEBOOK_PAGE_CHANGING, self.OnPageChanging) self.Bind(wx.EVT_WINDOW_DESTROY, self.OnDestroy, self) # Final initialization steps self.logger = get_file_logger("adjust") self._setup(True) self.Show() if start_timer: self.start_timer() def EndModal(self, returncode=wx.ID_OK): return returncode def MakeModal(self, makemodal=False): pass def OnClose(self, event): #if getattr(self, "measurement_play_sound_ctrl", None): #setcfg("measurement.play_sound", #int(self.measurement_play_sound_ctrl.GetValue())) config.writecfg() if not self.timer.IsRunning(): self.Destroy() else: self.keepGoing = False def OnDestroy(self, event): self.stop_timer() del self.timer def OnMove(self, event): if self.IsShownOnScreen() and not self.IsIconized() and \ (not self.GetParent() or not self.GetParent().IsShownOnScreen()): prev_x = getcfg("position.progress.x") prev_y = getcfg("position.progress.y") x, y = self.GetScreenPosition() if x != prev_x or y != prev_y: setcfg("position.progress.x", x) setcfg("position.progress.y", y) def OnPageChanging(self, event): oldsel = event.GetOldSelection() newsel = event.GetSelection() self.abort() event.Skip() def Pulse(self, msg=""): if msg: msg = safe_unicode(msg, enc) if ((msg in (lang.getstr("instrument.initializing"), lang.getstr("instrument.calibrating"), lang.getstr("please_wait"), lang.getstr("aborting")) or msg == " " * 4 or ": error -" in msg.lower() or "failed" in msg.lower() or msg.startswith(lang.getstr("webserver.waiting")) or msg.startswith(lang.getstr("connection.waiting"))) and msg != self.lastmsg): self.lastmsg = msg self.Freeze() for txt in self.lb.GetCurrentPage().txt.itervalues(): txt.checkmark.GetContainingSizer().Hide(txt.checkmark) txt.SetLabel(" ") txt = self.lb.GetCurrentPage().txt.values()[0] if txt.GetLabel() != wrap(msg, 46): txt.SetLabel(wrap(msg, 46)) txt.SetForegroundColour(FGCOLOUR) self.Thaw() return self.keepGoing, False def Resume(self): self.keepGoing = True def Update(self, value, msg=""): return self.Pulse(msg) def UpdatePulse(self, msg=""): return self.Pulse(msg) def _assign_image_list(self): imagelist = None modes = {CRT: {"black_luminance": "luminance", "luminance": "contrast"}} for img in ("black_luminance", "white_point", "luminance", "black_point", "check_all"): img = modes.get(getcfg("measurement_mode") == "c", {}).get(img, img) bmp = getbitmap("theme/icons/72x72/%s" % img) if not imagelist: img_w, img_h = bmp.Size imagelist = wx.ImageList(img_w, img_h) imagelist.Add(bmp) self.lb.AssignImageList(imagelist) def _setup(self, init=False): self.logger.info("-" * 80) self.cold_run = True self.is_busy = None self.is_measuring = None self.keepGoing = True self.lastmsg = "" self.target_br = None self._assign_image_list() if getcfg("measurement_mode") == "c": self.lb.disabled_pages = [] if getcfg("calibration.black_luminance", False): self.lb.SetSelection(0) else: self.lb.disabled_pages.append(0) self.lb.SetSelection(1) else: self.lb.disabled_pages = [0, 3] self.lb.SetSelection(1) if getcfg("trc"): self.calibration_btn.SetLabel(lang.getstr("calibration.start")) elif getcfg("calibration.continue_next"): self.calibration_btn.SetLabel(lang.getstr("calibration.skip")) else: self.calibration_btn.SetLabel(lang.getstr("finish")) for btn in (self.adjustment_btn, self.sound_on_off_btn, self.calibration_btn): if hasattr(btn, "_lastBestSize"): del btn._lastBestSize self.calibration_btn.GetContainingSizer().Layout() # Update black luminance page description self.lb.GetPage(0).update_desc() # Update white luminance page description self.lb.GetPage(2).update_desc() # Set size scale = getcfg("app.dpi") / get_default_dpi() if scale < 1: scale = 1 img_w, img_h = map(int, map(round, (84 * scale, 72 * scale))) min_h = (img_h + 8) * (self.lb.GetPageCount() - len(self.lb.disabled_pages)) + 2 - 8 if init: self.lb.SetMinSize((418, min_h)) self.lb.SetMinSize((self.lb.GetMinSize()[0], max(self.lb.GetMinSize()[1], min_h))) self.lb.GetCurrentPage().Fit() self.lb.GetCurrentPage().Layout() self.lb.Fit() self.lb.Layout() self.SetMinSize((0, 0)) self.Fit() self.Layout() # The button sizer will be as wide as the labelbook or wider, # so use it as reference w = self.btnsizer.GetSize()[0] - img_w - 12 for pagenum in xrange(0, self.lb.GetPageCount()): page = self.lb.GetPage(pagenum) page.SetSize((w, -1)) page.desc.SetLabel(page.desc.GetLabel().replace("\n", " ")) if (sys.platform == "darwin" and intlist(mac_ver()[0].split(".")) >= [10, 10]): margin = 24 else: margin = 12 page.desc.Wrap(w - margin) bitmaps = {"black_level": {CRT: "luminance", not CRT: "black_level"}, "luminance": {CRT: "contrast", not CRT: "luminance"}} if page.ctrltype == "check_all": for name in bitmaps: bitmap = bitmaps.get(name).get(getcfg("measurement_mode") == "c") page.txt[name].spacer.SetBitmap(getbitmap("theme/icons/16x16/" + bitmap)) else: ctrltype = {"rgb_offset": "black_level", "rgb_gain": "luminance"}.get(page.ctrltype, page.ctrltype) bitmap = bitmaps.get(ctrltype).get(getcfg("measurement_mode") == "c") page.gauges["L"].label.SetBitmap(getbitmap("theme/icons/16x16/" + bitmap)) page.Fit() page.Layout() for txt in page.txt.itervalues(): txt.SetLabel(" ") self.lb.SetMinSize((self.lb.GetMinSize()[0], max(self.lb.GetCurrentPage().GetSize()[1], min_h))) self.Fit() self.Sizer.SetSizeHints(self) self.Sizer.Layout() # Set position x = getcfg("position.progress.x") y = getcfg("position.progress.y") self.SetSaneGeometry(x, y) def abort(self): if self.has_worker_subprocess(): if self.is_measuring: self.worker.safe_send(" ") def abort_and_send(self, key): self.abort() if self.has_worker_subprocess(): if self.worker.safe_send(key): self.is_busy = True self.adjustment_btn.Disable() self.calibration_btn.Disable() def add_panel(self, size=wx.DefaultSize, flag=0): panel = get_panel(self, size) self.sizer.Add(panel, flag=flag) return panel def continue_to_calibration(self, event=None): if getcfg("trc"): self.abort_and_send("7") else: self.abort_and_send("8") def create_start_interactive_adjustment_button(self, icon="play", enable=False, startstop="start"): if getattr(self, "adjustment_btn", None): self.adjustment_btn._bitmap = getbitmap("theme/icons/10x10/%s" % icon) self.adjustment_btn.SetLabel(lang.getstr("calibration.interactive_display_adjustment.%s" % startstop)) self.adjustment_btn.Enable(enable) return self.adjustment_btn = self.create_gradient_button(getbitmap("theme/icons/10x10/%s" % icon), lang.getstr("calibration.interactive_display_adjustment.%s" % startstop), name="adjustment_btn") self.adjustment_btn.Bind(wx.EVT_BUTTON, self.start_interactive_adjustment) self.adjustment_btn.Enable(enable) def create_gradient_button(self, bitmap, label, name): btn = FlatShadedButton(self, bitmap=bitmap, label=label, name=name, fgcolour=FGCOLOUR) self.btnsizer.Add(btn) self.btnsizer.Layout() return btn def flush(self): pass def has_worker_subprocess(self): return bool(getattr(self, "worker", None) and getattr(self.worker, "subprocess", None)) def isatty(self): return True def key_handler(self, event): #print {wx.EVT_CHAR.typeId: 'EVT_CHAR', #wx.EVT_CHAR_HOOK.typeId: 'EVT_CHAR_HOOK', #wx.EVT_KEY_DOWN.typeId: 'EVT_KEY_DOWN', #wx.EVT_MENU.typeId: 'EVT_MENU'}.get(event.GetEventType(), #event.GetEventType()) keycode = None if event.GetEventType() in (wx.EVT_CHAR.typeId, wx.EVT_CHAR_HOOK.typeId, wx.EVT_KEY_DOWN.typeId): keycode = event.GetKeyCode() elif event.GetEventType() == wx.EVT_MENU.typeId: keycode = self.id_to_keycode.get(event.GetId()) if keycode is not None: #print chr(keycode) if keycode == ord(" "): if (event.GetEventType() != wx.EVT_MENU.typeId or not isinstance(self.FindFocus(), FlatShadedButton) or self.FindFocus() == self.adjustment_btn): if self.is_measuring: self.abort() else: self.start_interactive_adjustment() elif keycode in [ord(str(c)) for c in range(1, 6)]: key_num = chr(keycode) pagenum = dict(zip(self.pagenum_2_argyll_key_num.values(), self.pagenum_2_argyll_key_num.keys())).get(key_num) if pagenum not in self.lb.disabled_pages and not self.is_measuring: self.lb.SetSelection(pagenum) self.start_interactive_adjustment() elif keycode in (ord("\x1b"), ord("7"), ord("8"), ord("Q"), ord("q")): if not getcfg("trc") and keycode == ord("7"): # Ignore pass elif self.keyhandler: self.keyhandler(event) elif self.has_worker_subprocess(): self.worker.safe_send(chr(keycode)) else: event.Skip() else: event.Skip() else: event.Skip() def measurement_play_sound_handler(self, event): #self.measurement_play_sound_ctrl.SetValue(not self.measurement_play_sound_ctrl.GetValue()) setcfg("measurement.play_sound", int(not(bool(getcfg("measurement.play_sound"))))) if getcfg("measurement.play_sound"): bitmap = getbitmap("theme/icons/16x16/sound_volume_full") else: bitmap = getbitmap("theme/icons/16x16/sound_off") self.sound_on_off_btn._bitmap = bitmap def parse_txt(self, txt): colors = {True: wx.Colour(0x33, 0xcc, 0x0), False: FGCOLOUR} if not txt: return self.logger.info("%r" % txt) self.Pulse(txt) if "/ Current" in txt: indicator = getbitmap("theme/icons/10x10/record") else: indicator = getbitmap("theme/icons/10x10/record_outline") target_br = re.search("Target white brightness = (\d+(?:\.\d+)?)".replace(" ", "\s+"), txt, re.I) if getcfg("measurement_mode") == "c": target_bl = re.search("Target Near Black = (\d+(?:\.\d+)?), Current = (\d+(?:\.\d+)?)".replace(" ", "\s+"), txt, re.I) if target_bl: self.lb.GetCurrentPage().target_bl = ["Target", float(target_bl.groups()[0])] initial_br = re.search("(Initial|Target)(?: Br)? (\d+(?:\.\d+)?)\s*(?:, x (\d+(?:\.\d+)?)\s*, y (\d+(?:\.\d+)?)(?:\s*, (?:(V[CD]T \d+K?) )?DE(?: 2K)? (\d+(?:\.\d+)?))?|$)".replace(" ", "\s+"), txt, re.I) current_br = None current_bl = None if target_br and not getattr(self, "target_br", None): self.target_br = ["Target", float(target_br.groups()[0])] if initial_br: self.lb.GetCurrentPage().initial_br = [initial_br.groups()[0], float(initial_br.groups()[1])] + list(initial_br.groups()[2:]) if self.lb.GetCurrentPage().ctrltype != "check_all": current_br = re.search("Current(?: Br)? (\d+(?:\.\d+)?)".replace(" ", "\s+"), txt, re.I) else: current_br = re.search("Target Brightness = (?:\d+(?:\.\d+)?), Current = (\d+(?:\.\d+)?)".replace(" ", "\s+"), txt, re.I) if not current_br: current_br = re.search("Current Brightness = (\d+(?:\.\d+)?)".replace(" ", "\s+"), txt, re.I) if getcfg("measurement_mode") == "c": if target_bl: current_bl = float(target_bl.groups()[1]) else: current_bl = re.search("Black = XYZ (?:\d+(?:\.\d+)?) (\d+(?:\.\d+)?) (?:\d+(?:\.\d+)?)".replace(" ", "\s+"), txt, re.I) if current_bl: current_bl = float(current_bl.groups()[0]) xy_dE_rgb = re.search("x (\d+(?:\.\d+)?)[=+-]*, y (\d+(?:\.\d+)?)[=+-]*,? (?:(V[CD]T \d+K?) )?DE(?: 2K)? (\d+(?:\.\d+)?) R([=+-]+) G([=+-]+) B([=+-]+)".replace(" ", "\s+"), txt, re.I) white_xy_dE_re = "(?:Target white = x (?:\d+(?:\.\d+)?), y (?:\d+(?:\.\d+)?), Current|Current white) = x (\d+(?:\.\d+)?), y (\d+(?:\.\d+)?), (?:(?:(V[CD]T \d+K?) )?DE(?: 2K)?|error =) (\d+(?:\.\d+)?)".replace(" ", "\s+") white_xy_dE = re.search(white_xy_dE_re, txt, re.I) black_xy_dE = re.search(white_xy_dE_re.replace("white", "black"), txt, re.I) white_xy_target = re.search("Target white = x (\d+(?:\.\d+)?), y (\d+(?:\.\d+)?)".replace(" ", "\s+"), txt, re.I) black_xy_target = re.search("Target black = x (\d+(?:\.\d+)?), y (\d+(?:\.\d+)?)".replace(" ", "\s+"), txt, re.I) if current_br or current_bl or xy_dE_rgb or white_xy_dE or black_xy_dE: self.Freeze() #for t in ("target_br", "target_bl", "initial_br", "current_br", "current_bl"): #if locals()[t]: #print "\n" + t, locals()[t].groups(), if current_br: initial_br = getattr(self.lb.GetCurrentPage(), "initial_br", None) if self.lb.GetCurrentPage().ctrltype in ("rgb_gain", "luminance", "check_all"): target_br = getattr(self, "target_br", None) else: target_br = None if self.lb.GetCurrentPage().ctrltype == "rgb_gain" and initial_br: initial_br = ["Initial"] + initial_br[1:] compare_br = target_br or initial_br or ("Initial", float(current_br.groups()[0])) lstr = (compare_br[0]).lower() if compare_br[1]: percent = 100.0 / compare_br[1] else: percent = 100.0 l_diff = float(current_br.groups()[0]) - compare_br[1] l = int(round(50 + l_diff * percent)) if self.lb.GetCurrentPage().gauges.get("L"): self.lb.GetCurrentPage().gauges["L"].SetValue(min(max(l, 1), 100)) self.lb.GetCurrentPage().gauges["L"].Refresh() if self.lb.GetCurrentPage().txt.get("luminance"): if initial_br or target_br: #and round(l_diff, 2): if round(l_diff, 2) > 0: sign = "+" elif round(l_diff, 2) < 0: sign = "-" else: sign = u"\u00B1" # plusminus label = u"%s %.2f cd/m\u00b2\n%s %.2f cd/m\u00b2 (%s%.2f%%)" % (lang.getstr(lstr), compare_br[1], lang.getstr("current"), float(current_br.groups()[0]), sign, abs(l_diff) * percent) else: label = lang.getstr("current") + u" %.2f cd/m\u00b2" % float(current_br.groups()[0]) self.lb.GetCurrentPage().txt["luminance"].checkmark.GetContainingSizer().Show(self.lb.GetCurrentPage().txt["luminance"].checkmark, lstr == "target" and abs(l_diff) * percent <= 1) self.lb.GetCurrentPage().txt["luminance"].SetForegroundColour(colors[lstr == "target" and abs(l_diff) * percent <= 1]) set_label_and_size(self.lb.GetCurrentPage().txt["luminance"], label) if current_bl and self.lb.GetCurrentPage().txt.get("black_level"): target_bl = getattr(self.lb.GetCurrentPage(), "target_bl", None) or getattr(self.lb.GetCurrentPage(), "initial_br", None) if target_bl: percent = 100.0 / target_bl[1] if target_bl: #and round(target_bl[1], 2) != round(current_bl, 2): l_diff = current_bl - target_bl[1] if round(l_diff, 2) > 0: sign = "+" elif round(l_diff, 2) < 0: sign = "-" else: sign = u"\u00B1" # plusminus label = u"%s %.2f cd/m\u00b2\n%s %.2f cd/m\u00b2 (%s%.2f%%)" % (lang.getstr("target"), target_bl[1], lang.getstr("current"), current_bl, sign, abs(l_diff) * percent) else: if target_bl: l_diff = 0 else: l_diff = None label = lang.getstr("current") + u" %.2f cd/m\u00b2" % current_bl self.lb.GetCurrentPage().txt["black_level"].checkmark.GetContainingSizer().Show(self.lb.GetCurrentPage().txt["black_level"].checkmark, l_diff is not None and abs(l_diff) * percent <= 1) self.lb.GetCurrentPage().txt["black_level"].SetForegroundColour(colors[l_diff is not None and abs(l_diff) * percent <= 1]) set_label_and_size(self.lb.GetCurrentPage().txt["black_level"], label) # groups()[0] = x # groups()[1] = y # groups()[2] = VDT/VCT (optional) # groups()[3] = dE # groups()[4] = R +- # groups()[5] = G +- # groups()[6] = B +- if xy_dE_rgb: x, y, vdt, dE = get_xy_vt_dE(xy_dE_rgb.groups()) r = int(round(50 - (xy_dE_rgb.groups()[4].count("+") - xy_dE_rgb.groups()[4].count("-")) * (dE))) g = int(round(50 - (xy_dE_rgb.groups()[5].count("+") - xy_dE_rgb.groups()[5].count("-")) * (dE))) b = int(round(50 - (xy_dE_rgb.groups()[6].count("+") - xy_dE_rgb.groups()[6].count("-")) * (dE))) if self.lb.GetCurrentPage().gauges.get("R"): self.lb.GetCurrentPage().gauges["R"].SetValue(min(max(r, 1), 100)) self.lb.GetCurrentPage().gauges["R"].Refresh() if self.lb.GetCurrentPage().gauges.get("G"): self.lb.GetCurrentPage().gauges["G"].SetValue(min(max(g, 1), 100)) self.lb.GetCurrentPage().gauges["G"].Refresh() if self.lb.GetCurrentPage().gauges.get("B"): self.lb.GetCurrentPage().gauges["B"].SetValue(min(max(b, 1), 100)) self.lb.GetCurrentPage().gauges["B"].Refresh() if self.lb.GetCurrentPage().txt.get("rgb"): self.lb.GetCurrentPage().txt["rgb"].checkmark.GetContainingSizer().Show(self.lb.GetCurrentPage().txt["rgb"].checkmark, abs(dE) <= 1) self.lb.GetCurrentPage().txt["rgb"].SetForegroundColour(colors[abs(dE) <= 1]) label = (lang.getstr("current") + u" x %.4f y %.4f %s %.1f \u0394E*00" % (x, y, vdt, dE)).replace(" ", " ") initial_br = getattr(self.lb.GetCurrentPage(), "initial_br", None) if initial_br and len(initial_br) > 3: x, y, vdt, dE = get_xy_vt_dE(initial_br[2:]) label = (lang.getstr(initial_br[0].lower()) + u" x %.4f y %.4f %s %.1f \u0394E*00\n" % (x, y, vdt, dE)).replace(" ", " ") + label set_label_and_size(self.lb.GetCurrentPage().txt["rgb"], label) if white_xy_dE: x, y, vdt, dE = get_xy_vt_dE(white_xy_dE.groups()) if self.lb.GetCurrentPage().txt.get("white_point"): self.lb.GetCurrentPage().txt["white_point"].checkmark.GetContainingSizer().Show(self.lb.GetCurrentPage().txt["white_point"].checkmark, abs(dE) <= 1) self.lb.GetCurrentPage().txt["white_point"].SetForegroundColour(colors[abs(dE) <= 1]) label = (lang.getstr("current") + u" x %.4f y %.4f %s %.1f \u0394E*00" % (x, y, vdt, dE)).replace(" ", " ") if white_xy_target: x, y, vdt, dE = get_xy_vt_dE(white_xy_target.groups()) label = (lang.getstr("target") + u" x %.4f y %.4f\n" % (x, y)).replace(" ", " ") + label set_label_and_size(self.lb.GetCurrentPage().txt["white_point"], label) if black_xy_dE: x, y, vdt, dE = get_xy_vt_dE(black_xy_dE.groups()) if self.lb.GetCurrentPage().txt.get("white_point"): self.lb.GetCurrentPage().txt["black_point"].checkmark.GetContainingSizer().Show(self.lb.GetCurrentPage().txt["black_point"].checkmark, abs(dE) <= 1) self.lb.GetCurrentPage().txt["black_point"].SetForegroundColour(colors[abs(dE) <= 1]) label = (lang.getstr("current") + u" x %.4f y %.4f %s %.1f \u0394E*00" % (x, y, vdt, dE)).replace(" ", " ") if black_xy_target: x, y, vdt, dE = get_xy_vt_dE(black_xy_target.groups()) label = (lang.getstr("target") + u" x %.4f y %.4f\n" % (x, y)).replace(" ", " ") + label set_label_and_size(self.lb.GetCurrentPage().txt["black_point"], label) if ((current_br or current_bl or xy_dE_rgb) and self.lb.GetCurrentPage().ctrltype != "check_all"): if getcfg("measurement.play_sound"): self.measurement_sound.safe_play() self.indicator_ctrl.SetBitmap(indicator) self.btnsizer.Layout() if current_br or current_bl or xy_dE_rgb or white_xy_dE or black_xy_dE: self.lb.GetCurrentPage().Layout() self.Thaw() if "Press 1 .. 7" in txt or "8) Exit" in txt: if self.cold_run: self.cold_run = False self.Pulse(" " * 4) if self.is_measuring is not False: self.lb.Children[0].Refresh() if self.is_measuring is True: self.create_start_interactive_adjustment_button(enable=True) else: self.adjustment_btn.Enable() self.is_busy = False self.is_measuring = False self.indicator_ctrl.SetBitmap(getbitmap("10x10/empty")) self.calibration_btn.Enable() self.lb.SetFocus() # Make frame receive EVT_CHAR_HOOK events under Linux elif "initial measurements" in txt or "check measurements" in txt: self.is_busy = True self.lb.Children[0].Refresh() self.Pulse(lang.getstr("please_wait")) if not self.is_measuring: self.create_start_interactive_adjustment_button("pause", True, "stop") self.is_measuring = True self.lb.SetFocus() # Make frame receive EVT_CHAR_HOOK events under Linux #self.SetTitle("is_measuring %s timer.IsRunning %s keepGoing %s" % #(str(self.is_measuring), self.timer.IsRunning(), self.keepGoing)) def reset(self): self.Freeze() self._setup() # Reset controls for pagenum in xrange(0, self.lb.GetPageCount()): page = self.lb.GetPage(pagenum) page.initial_br = None page.target_bl = None for name in ("R", "G", "B", "L"): if page.gauges.get(name): page.gauges[name].SetValue(0) page.gauges[name].Refresh() for txt in page.txt.itervalues(): txt.checkmark.GetContainingSizer().Hide(txt.checkmark) txt.SetForegroundColour(FGCOLOUR) self.create_start_interactive_adjustment_button() self.calibration_btn.Disable() self.Thaw() def start_interactive_adjustment(self, event=None): if self.is_measuring: self.abort() else: self.abort_and_send(self.pagenum_2_argyll_key_num[self.lb.GetSelection()]) def start_timer(self, ms=50): self.timer.Start(ms) def stop_timer(self): self.timer.Stop() def write(self, txt): wx.CallAfter(self.parse_txt, txt) if __name__ == "__main__": from thread import start_new_thread from time import sleep class Subprocess(): def send(self, bytes): start_new_thread(test, (bytes,)) class Worker(object): def __init__(self): self.subprocess = Subprocess() def safe_send(self, bytes): self.subprocess.send(bytes) return True config.initcfg() lang.init() app = BaseApp(0) if "--crt" in sys.argv[1:]: setcfg("measurement_mode", "c") else: setcfg("measurement_mode", "l") app.TopWindow = DisplayAdjustmentFrame(start_timer=False) app.TopWindow.worker = Worker() app.TopWindow.Show() i = 0 def test(bytes=None): global i # 0 = dispcal -v -yl # 1 = dispcal -v -yl -b130 # 2 = dispcal -v -yl -B0.5 # 3 = dispcal -v -yl -t5200 # 4 = dispcal -v -yl -t5200 -b130 -B0.5 menu = r""" Press 1 .. 7 1) Black level (CRT: Offset/Brightness) 2) White point (Color temperature, R,G,B, Gain/Contrast) 3) White level (CRT: Gain/Contrast, LCD: Brightness/Backlight) 4) Black point (R,G,B, Offset/Brightness) 5) Check all 6) Measure and set ambient for viewing condition adjustment 7) Continue on to calibration 8) Exit """ if bytes == " ": txt = "\n" + menu elif bytes == "1": # Black level txt = [r"""Doing some initial measurements Black = XYZ 0.19 0.20 0.28 Grey = XYZ 27.20 27.79 24.57 White = XYZ 126.48 128.71 112.75 Adjust CRT brightness to get target level. Press space when done. Target 1.29 / Current 2.02 -""", r"""Doing some initial measurements Black = XYZ 0.19 0.20 0.29 Grey = XYZ 27.11 27.76 24.72 White = XYZ 125.91 128.38 113.18 Adjust CRT brightness to get target level. Press space when done. Target 1.28 / Current 2.02 -""", r"""Doing some initial measurements Black = XYZ 0.19 0.21 0.28 Grey = XYZ 27.08 27.72 24.87 White = XYZ 125.47 127.86 113.60 Adjust CRT brightness to get target level. Press space when done. Target 1.28 / Current 2.02 -""", r"""Doing some initial measurements Black = XYZ 0.19 0.20 0.29 Grey = XYZ 27.11 27.77 25.01 White = XYZ 125.21 127.80 113.90 Adjust CRT brightness to get target level. Press space when done. Target 1.28 / Current 2.03 -""", r"""Doing some initial measurements Black = XYZ 0.19 0.20 0.30 Grey = XYZ 23.56 24.14 21.83 White = XYZ 124.87 130.00 112.27 Adjust CRT brightness to get target level. Press space when done. Target 1.28 / Current 1.28"""][i] elif bytes == "2": # White point txt = [r"""Doing some initial measurements Red = XYZ 81.08 39.18 2.41 Green = XYZ 27.63 80.13 10.97 Blue = XYZ 18.24 9.90 99.75 White = XYZ 126.53 128.96 112.57 Adjust R,G & B gain to desired white point. Press space when done. Initial Br 128.96, x 0.3438 , y 0.3504 , VDT 5152K DE 2K 4.7 / Current Br 128.85, x 0.3439-, y 0.3502+ VDT 5151K DE 2K 4.8 R- G++ B-""", r"""Doing some initial measurements Red = XYZ 80.48 38.87 2.43 Green = XYZ 27.58 79.99 10.96 Blue = XYZ 18.34 9.93 100.24 White = XYZ 125.94 128.32 113.11 Adjust R,G & B gain to desired white point. Press space when done. Initial Br 130.00, x 0.3428 , y 0.3493 , VDT 5193K DE 2K 4.9 / Current Br 128.39, x 0.3428-, y 0.3496+ VDT 5190K DE 2K 4.7 R- G++ B-""", r"""Doing some initial measurements Red = XYZ 80.01 38.57 2.44 Green = XYZ 27.51 79.85 10.95 Blue = XYZ 18.45 9.94 100.77 White = XYZ 125.48 127.88 113.70 Adjust R,G & B gain to desired white point. Press space when done. Initial Br 127.88, x 0.3419 , y 0.3484 , VDT 5232K DE 2K 5.0 / Current Br 127.87, x 0.3419-, y 0.3485+ VDT 5231K DE 2K 4.9 R- G++ B-""", r"""Doing some initial measurements Red = XYZ 79.69 38.48 2.44 Green = XYZ 27.47 79.76 10.95 Blue = XYZ 18.50 9.95 101.06 White = XYZ 125.08 127.71 113.91 Adjust R,G & B gain to get target x,y. Press space when done. Target Br 127.71, x 0.3401 , y 0.3540 / Current Br 127.70, x 0.3412-, y 0.3481+ DE 4.8 R- G++ B-""", r"""Doing some initial measurements Red = XYZ 79.47 38.41 2.44 Green = XYZ 27.41 79.72 10.94 Blue = XYZ 18.52 9.96 101.20 White = XYZ 124.87 130.00 112.27 Adjust R,G & B gain to get target x,y. Press space when done. Target Br 130.00, x 0.3401 , y 0.3540 / Current Br 130.00, x 0.3401=, y 0.3540= DE 0.0 R= G= B="""][i] elif bytes == "3": # White level txt = [r"""Doing some initial measurements White = XYZ 126.56 128.83 112.65 Adjust CRT Contrast or LCD Brightness to desired level. Press space when done. Initial 128.83 / Current 128.85""", r"""Doing some initial measurements White = XYZ 125.87 128.23 113.43 Adjust CRT Contrast or LCD Brightness to get target level. Press space when done. Target 130.00 / Current 128.24 +""", r"""Doing some initial measurements White = XYZ 125.33 127.94 113.70 Adjust CRT Contrast or LCD Brightness to desired level. Press space when done. Initial 127.94 / Current 127.88""", r"""Doing some initial measurements White = XYZ 125.00 127.72 114.03 Adjust CRT Contrast or LCD Brightness to desired level. Press space when done. Initial 127.72 / Current 127.69""", r"""Doing some initial measurements White = XYZ 124.87 130.00 112.27 Adjust CRT Contrast or LCD Brightness to get target level. Press space when done. Target 130.00 / Current 130.00"""][i] elif bytes == "4": # Black point txt = [r"""Doing some initial measurements Black = XYZ 0.19 0.21 0.29 Grey = XYZ 27.25 27.83 24.52 White = XYZ 126.60 128.86 112.54 Adjust R,G & B offsets to get target x,y. Press space when done. Target Br 1.29, x 0.3440 , y 0.3502 / Current Br 2.03, x 0.3409+, y 0.3484+ DE 1.7 R++ G+ B-""", r"""Doing some initial measurements Black = XYZ 0.19 0.21 0.29 Grey = XYZ 27.19 27.87 24.94 White = XYZ 125.83 128.16 113.57 Adjust R,G & B offsets to get target x,y. Press space when done. Target Br 1.28, x 0.3423 , y 0.3487 / Current Br 2.03, x 0.3391+, y 0.3470+ DE 1.7 R++ G+ B-""", r"""Doing some initial measurements Black = XYZ 0.19 0.21 0.29 Grey = XYZ 27.14 27.79 24.97 White = XYZ 125.49 127.89 113.90 Adjust R,G & B offsets to get target x,y. Press space when done. Target Br 1.28, x 0.3417 , y 0.3482 / Current Br 2.02, x 0.3386+, y 0.3466+ DE 1.7 R++ G+ B-""", r"""Doing some initial measurements Black = XYZ 0.19 0.21 0.30 Grey = XYZ 27.10 27.79 25.12 White = XYZ 125.12 127.68 114.09 Adjust R,G & B offsets to get target x,y. Press space when done. Target Br 1.28, x 0.3401 , y 0.3540 / Current Br 2.04, x 0.3373+, y 0.3465+ DE 4.4 R+ G++ B-""", r"""Doing some initial measurements Black = XYZ 0.19 0.21 0.29 Grey = XYZ 23.56 24.14 21.83 White = XYZ 124.87 130.00 112.27 Adjust R,G & B offsets to get target x,y. Press space when done. Target Br 1.28, x 0.3401 , y 0.3540 / Current Br 1.28, x 0.3401=, y 0.3540= DE 0.0 R= G= B="""][i] elif bytes == "5": # Check all txt = [r"""Doing check measurements Black = XYZ 0.19 0.20 0.29 Grey = XYZ 27.22 27.80 24.49 White = XYZ 126.71 128.91 112.34 1% = XYZ 1.94 1.98 1.76 Current Brightness = 128.91 Target 50% Level = 24.42, Current = 27.80, error = 2.6% Target Near Black = 1.29, Current = 2.02, error = 0.6% Current white = x 0.3443, y 0.3503, VDT 5137K DE 2K 5.0 Target black = x 0.3443, y 0.3503, Current = x 0.3411, y 0.3486, error = 1.73 DE Press 1 .. 7""", r"""Doing check measurements Black = XYZ 0.19 0.21 0.29 Grey = XYZ 27.10 27.75 24.85 White = XYZ 125.78 128.17 113.53 1% = XYZ 1.93 1.98 1.79 Target Brightness = 130.00, Current = 128.17, error = -1.4% Target 50% Level = 24.28, Current = 27.75, error = 2.7% Target Near Black = 1.28, Current = 2.02, error = 0.6% Current white = x 0.3423, y 0.3488, VDT 5215K DE 2K 4.9 Target black = x 0.3423, y 0.3488, Current = x 0.3391, y 0.3467, error = 1.69 DE Press 1 .. 7""", r"""Doing check measurements Black = XYZ 0.19 0.21 0.29 Grey = XYZ 27.09 27.74 24.95 White = XYZ 125.32 127.78 113.82 1% = XYZ 1.93 1.98 1.80 Current Brightness = 127.78 Target 50% Level = 24.21, Current = 27.74, error = 2.8% Target Near Black = 1.28, Current = 2.02, error = 0.6% Current white = x 0.3415, y 0.3483, VDT 5243K DE 2K 4.9 Target black = x 0.3415, y 0.3483, Current = x 0.3386, y 0.3465, error = 1.55 DE Press 1 .. 7""", r"""Doing check measurements Black = XYZ 0.19 0.20 0.29 Grey = XYZ 26.98 27.68 24.97 White = XYZ 125.00 127.56 113.99 1% = XYZ 1.92 1.97 1.80 Current Brightness = 127.56 Target 50% Level = 24.17, Current = 27.68, error = 2.8% Target Near Black = 1.28, Current = 2.02, error = 0.6% Target white = x 0.3401, y 0.3540, Current = x 0.3410, y 0.3480, error = 4.83 DE Target black = x 0.3401, y 0.3540, Current = x 0.3372, y 0.3464, error = 4.48 DE Press 1 .. 7""", r"""Doing check measurements Black = XYZ 0.19 0.21 0.29 Grey = XYZ 23.56 24.14 21.83 White = XYZ 124.87 130.00 112.27 1% = XYZ 1.92 1.97 1.80 Target Brightness = 130.00, Current = 130.00, error = 0.0% Target 50% Level = 24.14, Current = 24.14, error = 0.0% Target Near Black = 1.27, Current = 1.27, error = 0.0% Target white = x 0.3401, y 0.3540, Current = x 0.3401, y 0.3540, error = 0.00 DE Target black = x 0.3401, y 0.3540, Current = x 0.3401, y 0.3540, error = 0.00 DE Press 1 .. 7"""][i] elif bytes == "7" or not bytes: if bytes == "7": if i < 4: i += 1 else: i -= 4 wx.CallAfter(app.TopWindow.reset) txt = [r"""Setting up the instrument Place instrument on test window. Hit Esc or Q to give up, any other key to continue: Display type is LCD Target white = native white point Target white brightness = native brightness Target black brightness = native brightness Target advertised gamma = 2.400000""", r"""Setting up the instrument Place instrument on test window. Hit Esc or Q to give up, any other key to continue: Display type is LCD Target white = native white point Target white brightness = 130.000000 cd/m^2 Target black brightness = native brightness Target advertised gamma = 2.400000""", r"""Setting up the instrument Place instrument on test window. Hit Esc or Q to give up, any other key to continue: Display type is LCD Target white = native white point Target white brightness = native brightness Target black brightness = 0.500000 cd/m^2 Target advertised gamma = 2.400000""", r"""Setting up the instrument Place instrument on test window. Hit Esc or Q to give up, any other key to continue: Display type is LCD Target white = 5200.000000 degrees kelvin Daylight spectrum Target white brightness = native brightness Target black brightness = native brightness Target advertised gamma = 2.400000""", r"""Setting up the instrument Place instrument on test window. Hit Esc or Q to give up, any other key to continue: Display type is CRT Target white = 5200.000000 degrees kelvin Daylight spectrum Target white brightness = 130.000000 cd/m^2 Target black brightness = 0.500000 cd/m^2 Target advertised gamma = 2.400000"""][i] + r""" Display adjustment menu:""" + menu elif bytes == "8": wx.CallAfter(app.TopWindow.Close) return else: return for line in txt.split("\n"): sleep(.0625) wx.CallAfter(app.TopWindow.write, line) print line start_new_thread(test, tuple()) app.MainLoop() DisplayCAL-3.1.0.0/DisplayCAL/wxDisplayUniformityFrame.py0000644000076500000000000011676712647526531023053 0ustar devwheel00000000000000# -*- coding: UTF-8 -*- """ Interactive display calibration UI """ from __future__ import with_statement from time import strftime import os import re import sys from wxaddons import wx from config import (getbitmap, getcfg, get_icon_bundle, get_display_number, get_display_rects, get_verified_path, setcfg) from log import get_file_logger, safe_print from meta import name as appname, version as appversion from util_os import launch_file, waccess from wxaddons import CustomEvent from wxMeasureFrame import MeasureFrame from wxwindows import BaseApp, BaseFrame, FlatShadedButton, numpad_keycodes import colormath import config import localization as lang import report BGCOLOUR = wx.Colour(0x33, 0x33, 0x33) BLACK = wx.Colour(0, 0, 0) BORDERCOLOUR = wx.Colour(0x22, 0x22, 0x22) FGCOLOUR = wx.Colour(0x99, 0x99, 0x99) LIGHTGRAY = wx.Colour(0xcc, 0xcc, 0xcc) MEDIUMGRAY = wx.Colour(0x80, 0x80, 0x80) WHITE = wx.Colour(0xff, 0xff, 0xff) class FlatShadedNumberedButton(FlatShadedButton): def __init__(self, parent, id=wx.ID_ANY, bitmap=None, label="", pos=wx.DefaultPosition, size=wx.DefaultSize, style=wx.NO_BORDER, validator=wx.DefaultValidator, name="gradientbutton", bgcolour=None, fgcolour=None, index=0): FlatShadedButton.__init__(self, parent, id, bitmap, label, pos, size, style, validator, name, bgcolour, fgcolour) self.index = index class DisplayUniformityFrame(BaseFrame): def __init__(self, parent=None, handler=None, keyhandler=None, start_timer=True, rows=None, cols=None): if not rows: rows = getcfg("uniformity.rows") if not cols: cols = getcfg("uniformity.cols") BaseFrame.__init__(self, parent, wx.ID_ANY, lang.getstr("report.uniformity"), style=wx.DEFAULT_FRAME_STYLE | wx.TAB_TRAVERSAL, name="displayuniformityframe") self.SetIcons(get_icon_bundle([256, 48, 32, 16], appname)) self.SetBackgroundColour(BGCOLOUR) self.sizer = wx.GridSizer(rows, cols, 0, 0) self.SetSizer(self.sizer) self.rows = rows self.cols = cols self.colors = (WHITE, wx.Colour(192, 192, 192), wx.Colour(128, 128, 128), wx.Colour(64, 64, 64)) self.labels = {} self.panels = [] self.buttons = [] for index in xrange(rows * cols): panel = wx.Panel(self, style=wx.BORDER_SIMPLE) panel.SetBackgroundColour(BGCOLOUR) sizer = wx.BoxSizer(wx.VERTICAL) panel.SetSizer(sizer) self.panels.append(panel) button = FlatShadedNumberedButton(panel, label=lang.getstr("measure"), bitmap=getbitmap("theme/icons/10x10/record"), bgcolour=LIGHTGRAY, fgcolour=BLACK, index=index) button.Bind(wx.EVT_BUTTON, self.measure) self.buttons.append(button) label = wx.StaticText(panel) label.SetForegroundColour(WHITE) self.labels[index] = label sizer.Add(label, 1, wx.ALIGN_CENTER) sizer.Add(button, 0, wx.ALIGN_BOTTOM | wx.ALIGN_CENTER | wx.BOTTOM | wx.LEFT | wx.RIGHT, border=8) self.sizer.Add(panel, 1, wx.EXPAND) self.disable_buttons() self.keyhandler = keyhandler if sys.platform in ("darwin", "win32"): # Use an accelerator table for space, 0-9, A-Z, numpad keycodes = [ord(" ")] + range(ord("0"), ord("9")) + range(ord("A"), ord("Z")) + numpad_keycodes self.id_to_keycode = {} for keycode in keycodes: self.id_to_keycode[wx.NewId()] = keycode accels = [] for id, keycode in self.id_to_keycode.iteritems(): self.Bind(wx.EVT_MENU, self.key_handler, id=id) accels.append((wx.ACCEL_NORMAL, keycode, id)) self.SetAcceleratorTable(wx.AcceleratorTable(accels)) else: self.Bind(wx.EVT_CHAR_HOOK, self.key_handler) # Event handlers self.Bind(wx.EVT_CLOSE, self.OnClose, self) self.Bind(wx.EVT_MOVE, self.OnMove, self) self.timer = wx.Timer(self) if handler: self.Bind(wx.EVT_TIMER, handler, self.timer) self.Bind(wx.EVT_WINDOW_DESTROY, self.OnDestroy, self) # Final initialization steps self.logger = get_file_logger("uniformity") self._setup() self.Show() if start_timer: self.start_timer() def EndModal(self, returncode=wx.ID_OK): return returncode def MakeModal(self, makemodal=False): pass def OnClose(self, event): if not self.timer.IsRunning(): self.Destroy() else: self.keepGoing = False def OnDestroy(self, event): self.stop_timer() del self.timer def OnMove(self, event): pass def Pulse(self, msg=""): return self.keepGoing, False def Resume(self): self.keepGoing = True def Show(self, show=True): if show: display_no = getcfg("display.number") - 1 if display_no < 0 or display_no > wx.Display.GetCount() - 1: display_no = 0 else: display_no = get_display_number(display_no) x, y, w, h = wx.Display(display_no).ClientArea # Place frame on correct display self.SetPosition((x, y)) self.SetSize((w, h)) self.disable_buttons() wx.CallAfter(self.Maximize) wx.Frame.Show(self, show) def Update(self, value, msg=""): return self.Pulse(msg) def UpdatePulse(self, msg=""): return self.Pulse(msg) def disable_buttons(self): self.enable_buttons(False) def enable_buttons(self, enable=True): for button in self.buttons: button.Enable(enable) def flush(self): pass get_display = MeasureFrame.__dict__["get_display"] def has_worker_subprocess(self): return bool(getattr(self, "worker", None) and getattr(self.worker, "subprocess", None)) def hide_cursor(self): cursor_id = wx.CURSOR_BLANK cursor = wx.StockCursor(cursor_id) self.SetCursor(cursor) for panel in self.panels: panel.SetCursor(cursor) for label in self.labels.values(): label.SetCursor(cursor) for button in self.buttons: button.SetCursor(cursor) def isatty(self): return True def key_handler(self, event): keycode = None if event.GetEventType() in (wx.EVT_CHAR.typeId, wx.EVT_CHAR_HOOK.typeId, wx.EVT_KEY_DOWN.typeId): keycode = event.GetKeyCode() elif event.GetEventType() == wx.EVT_MENU.typeId: keycode = self.id_to_keycode.get(event.GetId()) if keycode is not None: if self.has_worker_subprocess(): if keycode == 27 or chr(keycode) == "Q": # ESC or Q self.worker.abort_subprocess() elif self.index > -1 and not self.is_measuring: # Any other key self.measure(CustomEvent(wx.EVT_BUTTON.typeId, self.buttons[self.index])) else: event.Skip() def measure(self, event=None): if event: self.index = event.GetEventObject().index self.is_measuring = True self.results[self.index] = [] self.labels[self.index].SetLabel("") self.hide_cursor() self.disable_buttons() self.buttons[self.index].Hide() self.panels[self.index].SetBackgroundColour(self.colors[len(self.results[self.index])]) self.panels[self.index].Refresh() self.panels[self.index].Update() # Use a delay to allow for TFT lag wx.CallLater(200, self.safe_send, " ") def parse_txt(self, txt): if not txt: return self.logger.info("%r" % txt) if "Setting up the instrument" in txt: self.Pulse(lang.getstr("instrument.initializing")) if "Spot read failed" in txt: self.last_error = txt if "Result is XYZ:" in txt: # Result is XYZ: d.dddddd d.dddddd d.dddddd, D50 Lab: d.dddddd d.dddddd d.dddddd # CCT = ddddK (Delta E d.dddddd) # Closest Planckian temperature = ddddK (Delta E d.dddddd) # Closest Daylight temperature = ddddK (Delta E d.dddddd) XYZ = re.search("XYZ:\s+(\d+\.\d+)\s+(\d+\.\d+)\s+(\d+\.\d+)", txt) self.results[self.index].append({"XYZ": [float(value) for value in XYZ.groups()]}) self.last_error = None loci = {"t": "Daylight", "T": "Planckian"} for locus in loci.values(): if locus in txt: CT = re.search("Closest\s+%s\s+temperature\s+=\s+(\d+)K" % locus, txt, re.I) self.results[self.index][-1]["C%sT" % locus[0]] = int(CT.groups()[0]) if "key to take a reading" in txt and not self.last_error: if not self.is_measuring: self.enable_buttons() return if len(self.results[self.index]) < len(self.colors): # Take readings at 5 different brightness levels per swatch self.measure() else: self.is_measuring = False self.show_cursor() self.enable_buttons() self.buttons[self.index].Show() self.buttons[self.index].SetBitmap(getbitmap("theme/icons/16x16/checkmark")) self.panels[self.index].SetBackgroundColour(BGCOLOUR) self.panels[self.index].Refresh() self.panels[self.index].Update() if len(self.results) == self.rows * self.cols: # All swatches have been measured, show results # Let the user choose a location for the results html display_no, geometry, client_area = self.get_display() # Translate from wx display index to Argyll display index geometry = "%i, %i, %ix%i" % tuple(geometry) for i, display in enumerate(getcfg("displays")): if display.find("@ " + geometry) > -1: safe_print("Found display %s at index %i" % (display, i)) break display = display.replace(" [PRIMARY]", "") defaultFile = u"Uniformity Check %s — %s — %s" % (appversion, re.sub(r"[\\/:*?\"<>|]+", "_", display), strftime("%Y-%m-%d %H-%M.html")) defaultDir = get_verified_path(None, os.path.join(getcfg("profile.save_path"), defaultFile))[0] dlg = wx.FileDialog(self, lang.getstr("save_as"), defaultDir, defaultFile, wildcard=lang.getstr("filetype.html") + "|*.html;*.htm", style=wx.SAVE | wx.FD_OVERWRITE_PROMPT) dlg.Center(wx.BOTH) result = dlg.ShowModal() if result == wx.ID_OK: path = dlg.GetPath() if not waccess(path, os.W_OK): from worker import show_result_dialog show_result_dialog(Error(lang.getstr("error.access_denied.write", path)), self) return save_path = os.path.splitext(path)[0] + ".html" setcfg("last_filedialog_path", save_path) dlg.Destroy() if result != wx.ID_OK: return locus = loci.get(getcfg("whitepoint.colortemp.locus")) try: report.create(save_path, {"${REPORT_VERSION}": appversion, "${DISPLAY}": display, "${DATETIME}": strftime("%Y-%m-%d %H:%M:%S"), "${ROWS}": str(self.rows), "${COLS}": str(self.cols), "${RESULTS}": str(self.results), "${LOCUS}": locus}, getcfg("report.pack_js"), "uniformity") except (IOError, OSError), exception: from worker import show_result_dialog show_result_dialog(exception, self) else: launch_file(save_path) if getcfg("uniformity.measure.continuous"): self.measure(event=Event(self.buttons[self.index])) def reset(self): self._setup() for panel in self.panels: panel.SetBackgroundColour(BGCOLOUR) for button in self.buttons: button.SetBitmap(getbitmap("theme/icons/10x10/record")) button.Show() for index in self.labels: self.labels[index].SetLabel("") self.labels[index].GetContainingSizer().Layout() self.show_cursor() def _setup(self): self.logger.info("-" * 80) self.index = -1 self.is_measuring = False self.keepGoing = True self.last_error = None self.results = {} self.display_rects = get_display_rects() def safe_send(self, bytes): if self.has_worker_subprocess() and not self.worker.subprocess_abort: self.worker.safe_send(bytes) def show_cursor(self): cursor = wx.StockCursor(wx.CURSOR_ARROW) self.SetCursor(cursor) for panel in self.panels: panel.SetCursor(cursor) for label in self.labels.values(): label.SetCursor(cursor) for button in self.buttons: button.SetCursor(cursor) def start_timer(self, ms=50): self.timer.Start(ms) def stop_timer(self): self.timer.Stop() def write(self, txt): wx.CallAfter(self.parse_txt, txt) class Event(): def __init__(self, evtobj): self.evtobj = evtobj def GetEventObject(self): return self.evtobj if __name__ == "__main__": from thread import start_new_thread from time import sleep class Subprocess(): def send(self, bytes): start_new_thread(test, (bytes,)) class Worker(object): def __init__(self): self.subprocess = Subprocess() self.subprocess_abort = False def abort_subprocess(self): self.subprocess.send("Q") def safe_send(self, bytes): self.subprocess.send(bytes) return True config.initcfg() lang.init() lang.update_defaults() app = BaseApp(0) app.TopWindow = DisplayUniformityFrame(start_timer=False, cols=3) app.TopWindow.worker = Worker() app.TopWindow.Show() i = 0 def test(bytes=None): global i menu = r"""Place instrument on spot to be measured, and hit [A-Z] to read white and setup FWA compensation (keyed to letter) [a-z] to read and make FWA compensated reading from keyed reference 'r' to set reference, 's' to save spectrum, 'h' to toggle high res., 'k' to do a calibration Hit ESC or Q to exit, any other key to take a reading:""" if not bytes: txt = menu elif bytes == " ": txt = [[""" Result is XYZ: 115.629826 123.903717 122.761510, D50 Lab: 108.590836 -5.813746 -13.529075 CCT = 6104K (Delta E 7.848119) Closest Planckian temperature = 5835K (Delta E 6.927113) Closest Daylight temperature = 5963K (Delta E 3.547392) Place instrument on spot to be measured, and hit [A-Z] to read white and setup FWA compensation (keyed to letter) [a-z] to read and make FWA compensated reading from keyed reference 'r' to set reference, 's' to save spectrum, 'h' to toggle high res., 'k' to do a calibration Hit ESC or Q to exit, any other key to take a reading:""", """ Result is XYZ: 65.336831 69.578641 68.180005, D50 Lab: 86.789788 -3.888434 -10.469442 CCT = 5983K (Delta E 6.816507) Closest Planckian temperature = 5757K (Delta E 5.996638) Closest Daylight temperature = 5883K (Delta E 2.598118) Place instrument on spot to be measured, and hit [A-Z] to read white and setup FWA compensation (keyed to letter) [a-z] to read and make FWA compensated reading from keyed reference 'r' to set reference, 's' to save spectrum, 'h' to toggle high res., 'k' to do a calibration Hit ESC or Q to exit, any other key to take a reading:""", """ Result is XYZ: 26.944662 28.614568 28.107897, D50 Lab: 60.439948 -2.589848 -7.899247 CCT = 5969K (Delta E 6.279024) Closest Planckian temperature = 5760K (Delta E 5.519000) Closest Daylight temperature = 5887K (Delta E 2.119333) Place instrument on spot to be measured, and hit [A-Z] to read white and setup FWA compensation (keyed to letter) [a-z] to read and make FWA compensated reading from keyed reference 'r' to set reference, 's' to save spectrum, 'h' to toggle high res., 'k' to do a calibration Hit ESC or Q to exit, any other key to take a reading:""", """ Result is XYZ: 6.153402 6.500147 6.625585, D50 Lab: 30.640770 -1.226804 -5.876967 CCT = 6123K (Delta E 4.946609) Closest Planckian temperature = 5943K (Delta E 4.353019) Closest Daylight temperature = 6082K (Delta E 0.985734) Place instrument on spot to be measured, and hit [A-Z] to read white and setup FWA compensation (keyed to letter) [a-z] to read and make FWA compensated reading from keyed reference 'r' to set reference, 's' to save spectrum, 'h' to toggle high res., 'k' to do a calibration Hit ESC or Q to exit, any other key to take a reading:""", """ Result is XYZ: 0.104401 0.110705 0.109155, D50 Lab: 0.640770 -1.226804 -5.876967 CCT = 6123K (Delta E 4.946609) Closest Planckian temperature = 5943K (Delta E 4.353019) Closest Daylight temperature = 6082K (Delta E 0.985734) Place instrument on spot to be measured, and hit [A-Z] to read white and setup FWA compensation (keyed to letter) [a-z] to read and make FWA compensated reading from keyed reference 'r' to set reference, 's' to save spectrum, 'h' to toggle high res., 'k' to do a calibration Hit ESC or Q to exit, any other key to take a reading:"""], [""" Result is XYZ: 116.565941 124.165894 121.365684, D50 Lab: 108.678651 -4.762572 -12.508939 CCT = 5972K (Delta E 6.890329) Closest Planckian temperature = 5745K (Delta E 6.060831) Closest Daylight temperature = 5871K (Delta E 2.660205) Place instrument on spot to be measured, and hit [A-Z] to read white and setup FWA compensation (keyed to letter) [a-z] to read and make FWA compensated reading from keyed reference 'r' to set reference, 's' to save spectrum, 'h' to toggle high res., 'k' to do a calibration Hit ESC or Q to exit, any other key to take a reading:""", """ Result is XYZ: 64.511790 68.522425 66.980369, D50 Lab: 86.267011 -3.491468 -10.263432 CCT = 5945K (Delta E 6.363056) Closest Planckian temperature = 5735K (Delta E 5.590753) Closest Daylight temperature = 5862K (Delta E 2.186503) Place instrument on spot to be measured, and hit [A-Z] to read white and setup FWA compensation (keyed to letter) [a-z] to read and make FWA compensated reading from keyed reference 'r' to set reference, 's' to save spectrum, 'h' to toggle high res., 'k' to do a calibration Hit ESC or Q to exit, any other key to take a reading:""", """ Result is XYZ: 26.905684 28.417087 27.988741, D50 Lab: 60.263695 -1.987837 -8.005457 CCT = 5930K (Delta E 5.234243) Closest Planckian temperature = 5755K (Delta E 4.591707) Closest Daylight temperature = 5884K (Delta E 1.187672) Place instrument on spot to be measured, and hit [A-Z] to read white and setup FWA compensation (keyed to letter) [a-z] to read and make FWA compensated reading from keyed reference 'r' to set reference, 's' to save spectrum, 'h' to toggle high res., 'k' to do a calibration Hit ESC or Q to exit, any other key to take a reading:""", """ Result is XYZ: 6.144071 6.471379 6.584408, D50 Lab: 30.571861 -1.030833 -5.816641 CCT = 6083K (Delta E 4.418192) Closest Planckian temperature = 5923K (Delta E 3.883022) Closest Daylight temperature = 6062K (Delta E 0.510176) Place instrument on spot to be measured, and hit [A-Z] to read white and setup FWA compensation (keyed to letter) [a-z] to read and make FWA compensated reading from keyed reference 'r' to set reference, 's' to save spectrum, 'h' to toggle high res., 'k' to do a calibration Hit ESC or Q to exit, any other key to take a reading:""", """ Result is XYZ: 0.104401 0.110705 0.109155, D50 Lab: 0.571861 -1.030833 -5.816641 CCT = 6083K (Delta E 4.418192) Closest Planckian temperature = 5923K (Delta E 3.883022) Closest Daylight temperature = 6062K (Delta E 0.510176) Place instrument on spot to be measured, and hit [A-Z] to read white and setup FWA compensation (keyed to letter) [a-z] to read and make FWA compensated reading from keyed reference 'r' to set reference, 's' to save spectrum, 'h' to toggle high res., 'k' to do a calibration Hit ESC or Q to exit, any other key to take a reading:"""], [""" Result is XYZ: 116.611176 123.928350 121.363808, D50 Lab: 108.599092 -4.350754 -12.644938 CCT = 5960K (Delta E 6.444925) Closest Planckian temperature = 5747K (Delta E 5.664879) Closest Daylight temperature = 5873K (Delta E 2.263144) Place instrument on spot to be measured, and hit [A-Z] to read white and setup FWA compensation (keyed to letter) [a-z] to read and make FWA compensated reading from keyed reference 'r' to set reference, 's' to save spectrum, 'h' to toggle high res., 'k' to do a calibration Hit ESC or Q to exit, any other key to take a reading:""", """ Result is XYZ: 64.672460 68.441938 67.178377, D50 Lab: 86.226954 -2.956057 -10.516177 CCT = 5931K (Delta E 5.640857) Closest Planckian temperature = 5744K (Delta E 4.950818) Closest Daylight temperature = 5872K (Delta E 1.545901) Place instrument on spot to be measured, and hit [A-Z] to read white and setup FWA compensation (keyed to letter) [a-z] to read and make FWA compensated reading from keyed reference 'r' to set reference, 's' to save spectrum, 'h' to toggle high res., 'k' to do a calibration Hit ESC or Q to exit, any other key to take a reading:""", """ Result is XYZ: 26.708397 28.224354 27.854805, D50 Lab: 60.090889 -2.043543 -8.080532 CCT = 5946K (Delta E 5.317449) Closest Planckian temperature = 5768K (Delta E 4.666630) Closest Daylight temperature = 5897K (Delta E 1.265350) Place instrument on spot to be measured, and hit [A-Z] to read white and setup FWA compensation (keyed to letter) [a-z] to read and make FWA compensated reading from keyed reference 'r' to set reference, 's' to save spectrum, 'h' to toggle high res., 'k' to do a calibration Hit ESC or Q to exit, any other key to take a reading:""", """ Result is XYZ: 6.154005 6.469558 6.599849, D50 Lab: 30.567493 -0.904424 -5.891430 CCT = 6079K (Delta E 4.041262) Closest Planckian temperature = 5932K (Delta E 3.549922) Closest Daylight temperature = 6072K (Delta E 0.177697) Place instrument on spot to be measured, and hit [A-Z] to read white and setup FWA compensation (keyed to letter) [a-z] to read and make FWA compensated reading from keyed reference 'r' to set reference, 's' to save spectrum, 'h' to toggle high res., 'k' to do a calibration Hit ESC or Q to exit, any other key to take a reading:""", """ Result is XYZ: 0.104401 0.110705 0.109155, D50 Lab: 0.567493 -0.904424 -5.891430 CCT = 6079K (Delta E 4.041262) Closest Planckian temperature = 5932K (Delta E 3.549922) Closest Daylight temperature = 6072K (Delta E 0.177697) Place instrument on spot to be measured, and hit [A-Z] to read white and setup FWA compensation (keyed to letter) [a-z] to read and make FWA compensated reading from keyed reference 'r' to set reference, 's' to save spectrum, 'h' to toggle high res., 'k' to do a calibration Hit ESC or Q to exit, any other key to take a reading:"""], [""" Result is XYZ: 120.030166 127.667344 125.560879, D50 Lab: 109.839774 -4.542272 -13.098348 CCT = 5991K (Delta E 6.554213) Closest Planckian temperature = 5772K (Delta E 5.765044) Closest Daylight temperature = 5899K (Delta E 2.368586) Place instrument on spot to be measured, and hit [A-Z] to read white and setup FWA compensation (keyed to letter) [a-z] to read and make FWA compensated reading from keyed reference 'r' to set reference, 's' to save spectrum, 'h' to toggle high res., 'k' to do a calibration Hit ESC or Q to exit, any other key to take a reading:""", """ Result is XYZ: 66.590402 70.542611 69.377397, D50 Lab: 87.262309 -3.134252 -10.747149 CCT = 5951K (Delta E 5.807812) Closest Planckian temperature = 5758K (Delta E 5.100360) Closest Daylight temperature = 5886K (Delta E 1.698719) Place instrument on spot to be measured, and hit [A-Z] to read white and setup FWA compensation (keyed to letter) [a-z] to read and make FWA compensated reading from keyed reference 'r' to set reference, 's' to save spectrum, 'h' to toggle high res., 'k' to do a calibration Hit ESC or Q to exit, any other key to take a reading:""", """ Result is XYZ: 27.489125 29.158690 28.738045, D50 Lab: 60.921426 -2.478038 -8.105322 CCT = 5976K (Delta E 6.028851) Closest Planckian temperature = 5773K (Delta E 5.298263) Closest Daylight temperature = 5902K (Delta E 1.900430) Place instrument on spot to be measured, and hit [A-Z] to read white and setup FWA compensation (keyed to letter) [a-z] to read and make FWA compensated reading from keyed reference 'r' to set reference, 's' to save spectrum, 'h' to toggle high res., 'k' to do a calibration Hit ESC or Q to exit, any other key to take a reading:""", """ Result is XYZ: 6.326874 6.649709 6.776715, D50 Lab: 30.995780 -0.896754 -5.916062 CCT = 6071K (Delta E 4.005433) Closest Planckian temperature = 5926K (Delta E 3.517820) Closest Daylight temperature = 6065K (Delta E 0.144142) Place instrument on spot to be measured, and hit [A-Z] to read white and setup FWA compensation (keyed to letter) [a-z] to read and make FWA compensated reading from keyed reference 'r' to set reference, 's' to save spectrum, 'h' to toggle high res., 'k' to do a calibration Hit ESC or Q to exit, any other key to take a reading:""", """ Result is XYZ: 0.104401 0.110705 0.109155, D50 Lab: 0.995780 -0.896754 -5.916062 CCT = 6071K (Delta E 4.005433) Closest Planckian temperature = 5926K (Delta E 3.517820) Closest Daylight temperature = 6065K (Delta E 0.144142) Place instrument on spot to be measured, and hit [A-Z] to read white and setup FWA compensation (keyed to letter) [a-z] to read and make FWA compensated reading from keyed reference 'r' to set reference, 's' to save spectrum, 'h' to toggle high res., 'k' to do a calibration Hit ESC or Q to exit, any other key to take a reading:"""], [""" Result is XYZ: 121.643262 130.105649 128.560173, D50 Lab: 110.635861 -5.574898 -13.543244 CCT = 6071K (Delta E 7.533820) Closest Planckian temperature = 5815K (Delta E 6.643605) Closest Daylight temperature = 5943K (Delta E 3.258868) Place instrument on spot to be measured, and hit [A-Z] to read white and setup FWA compensation (keyed to letter) [a-z] to read and make FWA compensated reading from keyed reference 'r' to set reference, 's' to save spectrum, 'h' to toggle high res., 'k' to do a calibration Hit ESC or Q to exit, any other key to take a reading:""", """ Result is XYZ: 67.775736 72.266319 71.178047, D50 Lab: 88.096621 -4.123469 -10.928024 CCT = 6023K (Delta E 6.995424) Closest Planckian temperature = 5788K (Delta E 6.159783) Closest Daylight temperature = 5915K (Delta E 2.767919) Place instrument on spot to be measured, and hit [A-Z] to read white and setup FWA compensation (keyed to letter) [a-z] to read and make FWA compensated reading from keyed reference 'r' to set reference, 's' to save spectrum, 'h' to toggle high res., 'k' to do a calibration Hit ESC or Q to exit, any other key to take a reading:""", """ Result is XYZ: 28.131948 29.978900 29.595129, D50 Lab: 61.636012 -3.012753 -8.258625 CCT = 6030K (Delta E 6.867980) Closest Planckian temperature = 5798K (Delta E 6.047536) Closest Daylight temperature = 5926K (Delta E 2.657241) Place instrument on spot to be measured, and hit [A-Z] to read white and setup FWA compensation (keyed to letter) [a-z] to read and make FWA compensated reading from keyed reference 'r' to set reference, 's' to save spectrum, 'h' to toggle high res., 'k' to do a calibration Hit ESC or Q to exit, any other key to take a reading:""", """ Result is XYZ: 6.473470 6.765282 6.888164, D50 Lab: 31.266484 -0.517860 -5.923364 CCT = 6007K (Delta E 2.947859) Closest Planckian temperature = 5902K (Delta E 2.582843) Closest Daylight temperature = 6042K (Delta E 0.798814) Place instrument on spot to be measured, and hit [A-Z] to read white and setup FWA compensation (keyed to letter) [a-z] to read and make FWA compensated reading from keyed reference 'r' to set reference, 's' to save spectrum, 'h' to toggle high res., 'k' to do a calibration Hit ESC or Q to exit, any other key to take a reading:""", """ Result is XYZ: 0.104401 0.110705 0.109155, D50 Lab: 0.266484 -0.517860 -5.923364 CCT = 6007K (Delta E 2.947859) Closest Planckian temperature = 5902K (Delta E 2.582843) Closest Daylight temperature = 6042K (Delta E 0.798814) Place instrument on spot to be measured, and hit [A-Z] to read white and setup FWA compensation (keyed to letter) [a-z] to read and make FWA compensated reading from keyed reference 'r' to set reference, 's' to save spectrum, 'h' to toggle high res., 'k' to do a calibration Hit ESC or Q to exit, any other key to take a reading:"""], [""" Result is XYZ: 116.801943 124.624261 123.359911, D50 Lab: 108.831883 -5.063829 -13.483891 CCT = 6057K (Delta E 7.069302) Closest Planckian temperature = 5816K (Delta E 6.229078) Closest Daylight temperature = 5944K (Delta E 2.843045) Place instrument on spot to be measured, and hit [A-Z] to read white and setup FWA compensation (keyed to letter) [a-z] to read and make FWA compensated reading from keyed reference 'r' to set reference, 's' to save spectrum, 'h' to toggle high res., 'k' to do a calibration Hit ESC or Q to exit, any other key to take a reading:""", """ Result is XYZ: 64.869350 68.842421 67.977252, D50 Lab: 86.425958 -3.370123 -10.910497 CCT = 5991K (Delta E 6.099488) Closest Planckian temperature = 5785K (Delta E 5.362276) Closest Daylight temperature = 5914K (Delta E 1.966958) Place instrument on spot to be measured, and hit [A-Z] to read white and setup FWA compensation (keyed to letter) [a-z] to read and make FWA compensated reading from keyed reference 'r' to set reference, 's' to save spectrum, 'h' to toggle high res., 'k' to do a calibration Hit ESC or Q to exit, any other key to take a reading:""", """ Result is XYZ: 26.750888 28.302175 27.882982, D50 Lab: 60.160759 -2.171950 -8.007010 CCT = 5948K (Delta E 5.551435) Closest Planckian temperature = 5762K (Delta E 4.873477) Closest Daylight temperature = 5891K (Delta E 1.471926) Place instrument on spot to be measured, and hit [A-Z] to read white and setup FWA compensation (keyed to letter) [a-z] to read and make FWA compensated reading from keyed reference 'r' to set reference, 's' to save spectrum, 'h' to toggle high res., 'k' to do a calibration Hit ESC or Q to exit, any other key to take a reading:""", """ Result is XYZ: 6.255018 6.563924 6.746680, D50 Lab: 30.792814 -0.788285 -6.137368 CCT = 6105K (Delta E 3.641727) Closest Planckian temperature = 5970K (Delta E 3.198805) Closest Daylight temperature = 6113K (Delta E 0.167052) Place instrument on spot to be measured, and hit [A-Z] to read white and setup FWA compensation (keyed to letter) [a-z] to read and make FWA compensated reading from keyed reference 'r' to set reference, 's' to save spectrum, 'h' to toggle high res., 'k' to do a calibration Hit ESC or Q to exit, any other key to take a reading:""", """ Result is XYZ: 0.104401 0.110705 0.109155, D50 Lab: 0.792814 -0.788285 -6.137368 CCT = 6105K (Delta E 3.641727) Closest Planckian temperature = 5970K (Delta E 3.198805) Closest Daylight temperature = 6113K (Delta E 0.167052) Place instrument on spot to be measured, and hit [A-Z] to read white and setup FWA compensation (keyed to letter) [a-z] to read and make FWA compensated reading from keyed reference 'r' to set reference, 's' to save spectrum, 'h' to toggle high res., 'k' to do a calibration Hit ESC or Q to exit, any other key to take a reading:"""], [""" Result is XYZ: 115.081771 122.300809 119.963479, D50 Lab: 108.051237 -4.328489 -12.711256 CCT = 5969K (Delta E 6.425079) Closest Planckian temperature = 5755K (Delta E 5.648226) Closest Daylight temperature = 5882K (Delta E 2.248055) Place instrument on spot to be measured, and hit [A-Z] to read white and setup FWA compensation (keyed to letter) [a-z] to read and make FWA compensated reading from keyed reference 'r' to set reference, 's' to save spectrum, 'h' to toggle high res., 'k' to do a calibration Hit ESC or Q to exit, any other key to take a reading:""", """ Result is XYZ: 62.334621 66.118418 64.979303, D50 Lab: 85.056784 -3.250929 -10.473103 CCT = 5960K (Delta E 6.051574) Closest Planckian temperature = 5758K (Delta E 5.316783) Closest Daylight temperature = 5886K (Delta E 1.916058) Place instrument on spot to be measured, and hit [A-Z] to read white and setup FWA compensation (keyed to letter) [a-z] to read and make FWA compensated reading from keyed reference 'r' to set reference, 's' to save spectrum, 'h' to toggle high res., 'k' to do a calibration Hit ESC or Q to exit, any other key to take a reading:""", """ Result is XYZ: 25.849804 27.374348 27.163845, D50 Lab: 59.319238 -2.248166 -8.249728 CCT = 5996K (Delta E 5.653680) Closest Planckian temperature = 5804K (Delta E 4.968356) Closest Daylight temperature = 5934K (Delta E 1.575347) Place instrument on spot to be measured, and hit [A-Z] to read white and setup FWA compensation (keyed to letter) [a-z] to read and make FWA compensated reading from keyed reference 'r' to set reference, 's' to save spectrum, 'h' to toggle high res., 'k' to do a calibration Hit ESC or Q to exit, any other key to take a reading:""", """ Result is XYZ: 5.898029 6.233309 6.427531, D50 Lab: 29.993614 -1.240610 -6.124217 CCT = 6197K (Delta E 4.937751) Closest Planckian temperature = 6011K (Delta E 4.350182) Closest Daylight temperature = 6153K (Delta E 0.996499) Place instrument on spot to be measured, and hit [A-Z] to read white and setup FWA compensation (keyed to letter) [a-z] to read and make FWA compensated reading from keyed reference 'r' to set reference, 's' to save spectrum, 'h' to toggle high res., 'k' to do a calibration Hit ESC or Q to exit, any other key to take a reading:""", """ Result is XYZ: 0.104401 0.110705 0.109155, D50 Lab: 0.993614 -1.240610 -6.124217 CCT = 6197K (Delta E 4.937751) Closest Planckian temperature = 6011K (Delta E 4.350182) Closest Daylight temperature = 6153K (Delta E 0.996499) Place instrument on spot to be measured, and hit [A-Z] to read white and setup FWA compensation (keyed to letter) [a-z] to read and make FWA compensated reading from keyed reference 'r' to set reference, 's' to save spectrum, 'h' to toggle high res., 'k' to do a calibration Hit ESC or Q to exit, any other key to take a reading:"""], [""" Result is XYZ: 114.661874 122.077962 119.963424, D50 Lab: 107.975846 -4.649371 -12.841206 CCT = 5996K (Delta E 6.745175) Closest Planckian temperature = 5771K (Delta E 5.934859) Closest Daylight temperature = 5898K (Delta E 2.538832) Place instrument on spot to be measured, and hit [A-Z] to read white and setup FWA compensation (keyed to letter) [a-z] to read and make FWA compensated reading from keyed reference 'r' to set reference, 's' to save spectrum, 'h' to toggle high res., 'k' to do a calibration Hit ESC or Q to exit, any other key to take a reading:""", """ Result is XYZ: 61.818899 65.859246 64.979340, D50 Lab: 84.924570 -3.876653 -10.701093 CCT = 6024K (Delta E 6.822442) Closest Planckian temperature = 5794K (Delta E 6.006530) Closest Daylight temperature = 5922K (Delta E 2.615316) Place instrument on spot to be measured, and hit [A-Z] to read white and setup FWA compensation (keyed to letter) [a-z] to read and make FWA compensated reading from keyed reference 'r' to set reference, 's' to save spectrum, 'h' to toggle high res., 'k' to do a calibration Hit ESC or Q to exit, any other key to take a reading:""", """ Result is XYZ: 25.795743 27.295989 27.081138, D50 Lab: 59.247303 -2.163010 -8.233441 CCT = 5988K (Delta E 5.511791) Closest Planckian temperature = 5800K (Delta E 4.842103) Closest Daylight temperature = 5931K (Delta E 1.447924) Place instrument on spot to be measured, and hit [A-Z] to read white and setup FWA compensation (keyed to letter) [a-z] to read and make FWA compensated reading from keyed reference 'r' to set reference, 's' to save spectrum, 'h' to toggle high res., 'k' to do a calibration Hit ESC or Q to exit, any other key to take a reading:""", """ Result is XYZ: 5.925222 6.263326 6.427544, D50 Lab: 30.067324 -1.256015 -5.997186 CCT = 6170K (Delta E 5.014894) Closest Planckian temperature = 5984K (Delta E 4.416741) Closest Daylight temperature = 6124K (Delta E 1.057856) Place instrument on spot to be measured, and hit [A-Z] to read white and setup FWA compensation (keyed to letter) [a-z] to read and make FWA compensated reading from keyed reference 'r' to set reference, 's' to save spectrum, 'h' to toggle high res., 'k' to do a calibration Hit ESC or Q to exit, any other key to take a reading:""", """ Result is XYZ: 0.104401 0.110705 0.109155, D50 Lab: 0.067324 -1.256015 -5.997186 CCT = 6170K (Delta E 5.014894) Closest Planckian temperature = 5984K (Delta E 4.416741) Closest Daylight temperature = 6124K (Delta E 1.057856) Place instrument on spot to be measured, and hit [A-Z] to read white and setup FWA compensation (keyed to letter) [a-z] to read and make FWA compensated reading from keyed reference 'r' to set reference, 's' to save spectrum, 'h' to toggle high res., 'k' to do a calibration Hit ESC or Q to exit, any other key to take a reading:"""], [""" Result is XYZ: 116.839314 123.894968 122.159446, D50 Lab: 108.587904 -3.955352 -13.160232 CCT = 5975K (Delta E 5.963774) Closest Planckian temperature = 5774K (Delta E 5.240593) Closest Daylight temperature = 5903K (Delta E 1.842768) Place instrument on spot to be measured, and hit [A-Z] to read white and setup FWA compensation (keyed to letter) [a-z] to read and make FWA compensated reading from keyed reference 'r' to set reference, 's' to save spectrum, 'h' to toggle high res., 'k' to do a calibration Hit ESC or Q to exit, any other key to take a reading:""", """ Result is XYZ: 63.469751 67.164836 66.177725, D50 Lab: 85.587118 -2.928291 -10.687360 CCT = 5951K (Delta E 5.590334) Closest Planckian temperature = 5764K (Delta E 4.908104) Closest Daylight temperature = 5892K (Delta E 1.506948) Place instrument on spot to be measured, and hit [A-Z] to read white and setup FWA compensation (keyed to letter) [a-z] to read and make FWA compensated reading from keyed reference 'r' to set reference, 's' to save spectrum, 'h' to toggle high res., 'k' to do a calibration Hit ESC or Q to exit, any other key to take a reading:""", """ Result is XYZ: 26.106117 27.645671 27.403890, D50 Lab: 59.567264 -2.255152 -8.227727 CCT = 5991K (Delta E 5.663331) Closest Planckian temperature = 5798K (Delta E 4.976351) Closest Daylight temperature = 5928K (Delta E 1.582241) Place instrument on spot to be measured, and hit [A-Z] to read white and setup FWA compensation (keyed to letter) [a-z] to read and make FWA compensated reading from keyed reference 'r' to set reference, 's' to save spectrum, 'h' to toggle high res., 'k' to do a calibration Hit ESC or Q to exit, any other key to take a reading:""", """ Result is XYZ: 6.001154 6.326623 6.508185, D50 Lab: 30.221991 -1.083417 -6.086282 CCT = 6157K (Delta E 4.496558) Closest Planckian temperature = 5990K (Delta E 3.957006) Closest Daylight temperature = 6131K (Delta E 0.597640) Place instrument on spot to be measured, and hit [A-Z] to read white and setup FWA compensation (keyed to letter) [a-z] to read and make FWA compensated reading from keyed reference 'r' to set reference, 's' to save spectrum, 'h' to toggle high res., 'k' to do a calibration Hit ESC or Q to exit, any other key to take a reading:""", """ Result is XYZ: 0.104401 0.110705 0.109155, D50 Lab: 0.221991 -1.083417 -6.086282 CCT = 6157K (Delta E 4.496558) Closest Planckian temperature = 5990K (Delta E 3.957006) Closest Daylight temperature = 6131K (Delta E 0.597640) Place instrument on spot to be measured, and hit [A-Z] to read white and setup FWA compensation (keyed to letter) [a-z] to read and make FWA compensated reading from keyed reference 'r' to set reference, 's' to save spectrum, 'h' to toggle high res., 'k' to do a calibration Hit ESC or Q to exit, any other key to take a reading:"""]][app.TopWindow.index][i] if i < 3: i += 1 else: i -= 3 elif bytes in ("Q", "q"): wx.CallAfter(app.TopWindow.Close) return else: return for line in txt.split("\n"): sleep(.03125) wx.CallAfter(app.TopWindow.write, line) print line start_new_thread(test, tuple()) app.MainLoop() DisplayCAL-3.1.0.0/DisplayCAL/wxenhancedplot.py0000755000076500000000000030072612647526531021042 0ustar devwheel00000000000000#----------------------------------------------------------------------------- # Name: wx.lib.plot.py # Purpose: Line, Bar and Scatter Graphs # # Author: Gordon Williams # # Created: 2003/11/03 # RCS-ID: $Id: plot.py 65712 2010-10-01 17:56:32Z RD $ # Copyright: (c) 2002 # Licence: Use as you wish. #----------------------------------------------------------------------------- # 12/15/2003 - Jeff Grimmett (grimmtooth@softhome.net) # # o 2.5 compatability update. # o Renamed to plot.py in the wx.lib directory. # o Reworked test frame to work with wx demo framework. This saves a bit # of tedious cut and paste, and the test app is excellent. # # 12/18/2003 - Jeff Grimmett (grimmtooth@softhome.net) # # o wxScrolledMessageDialog -> ScrolledMessageDialog # # Oct 6, 2004 Gordon Williams (g_will@cyberus.ca) # - Added bar graph demo # - Modified line end shape from round to square. # - Removed FloatDCWrapper for conversion to ints and ints in arguments # # Oct 15, 2004 Gordon Williams (g_will@cyberus.ca) # - Imported modules given leading underscore to name. # - Added Cursor Line Tracking and User Point Labels. # - Demo for Cursor Line Tracking and Point Labels. # - Size of plot preview frame adjusted to show page better. # - Added helper functions PositionUserToScreen and PositionScreenToUser in PlotCanvas. # - Added functions GetClosestPoints (all curves) and GetClosestPoint (only closest curve) # can be in either user coords or screen coords. # # Jun 22, 2009 Florian Hoech (florian.hoech@gmx.de) # - Fixed exception when drawing empty plots on Mac OS X # - Fixed exception when trying to draw point labels on Mac OS X (Mac OS X # point label drawing code is still slow and only supports wx.COPY) # - Moved label positions away from axis lines a bit # - Added PolySpline class and modified demo 1 and 2 to use it # - Added center and diagonal lines option (Set/GetEnableCenterLines, # Set/GetEnableDiagonals) # - Added anti-aliasing option with optional high-resolution mode # (Set/GetEnableAntiAliasing, Set/GetEnableHiRes) and demo # - Added option to specify exact number of tick marks to use for each axis # (SetXSpec(, SetYSpec() -- work like 'min', but with # tick marks) # - Added support for background and foreground colours (enabled via # SetBackgroundColour/SetForegroundColour on a PlotCanvas instance) # - Changed PlotCanvas printing initialization from occuring in __init__ to # occur on access. This will postpone any IPP and / or CUPS warnings # which appear on stderr on some Linux systems until printing functionality # is actually used. # # """ This is a simple light weight plotting module that can be used with Boa or easily integrated into your own wxPython application. The emphasis is on small size and fast plotting for large data sets. It has a reasonable number of features to do line and scatter graphs easily as well as simple bar graphs. It is not as sophisticated or as powerful as SciPy Plt or Chaco. Both of these are great packages but consume huge amounts of computer resources for simple plots. They can be found at http://scipy.com This file contains two parts; first the re-usable library stuff, then, after a "if __name__=='__main__'" test, a simple frame and a few default plots for examples and testing. Based on wxPlotCanvas Written by K.Hinsen, R. Srinivasan; Ported to wxPython Harm van der Heijden, feb 1999 Major Additions Gordon Williams Feb. 2003 (g_will@cyberus.ca) -More style options -Zooming using mouse "rubber band" -Scroll left, right -Grid(graticule) -Printing, preview, and page set up (margins) -Axis and title labels -Cursor xy axis values -Doc strings and lots of comments -Optimizations for large number of points -Legends Did a lot of work here to speed markers up. Only a factor of 4 improvement though. Lines are much faster than markers, especially filled markers. Stay away from circles and triangles unless you only have a few thousand points. Times for 25,000 points Line - 0.078 sec Markers Square - 0.22 sec dot - 0.10 circle - 0.87 cross,plus - 0.28 triangle, triangle_down - 0.90 Thanks to Chris Barker for getting this version working on Linux. Zooming controls with mouse (when enabled): Left mouse drag - Zoom box. Left mouse double click - reset zoom. Right mouse click - zoom out centred on click location. """ import string as _string import time as _time import sys import wx # Needs Numeric or numarray or NumPy try: import numpy as _Numeric except: try: import numarray as _Numeric #if numarray is used it is renamed Numeric except: try: import Numeric as _Numeric except: msg= """ This module requires the Numeric/numarray or NumPy module, which could not be imported. It probably is not installed (it's not part of the standard Python distribution). See the Numeric Python site (http://numpy.scipy.org) for information on downloading source or binaries.""" raise ImportError, "Numeric,numarray or NumPy not found. \n" + msg else: _Numeric.Float = _Numeric.float _Numeric.Float64 = _Numeric.float64 _Numeric.Int32 = _Numeric.int32 from wxfixes import get_dc_font_scale # # Plotting classes... # class PolyPoints: """Base Class for lines and markers - All methods are private. """ def __init__(self, points, attr): self._points = _Numeric.array(points).astype(_Numeric.Float64) self._logscale = (False, False) self._pointSize = (1.0, 1.0) self.currentScale= (1,1) self.currentShift= (0,0) self.scaled = self.points self.attributes = {} self.attributes.update(self._attributes) for name, value in attr.items(): if name not in self._attributes.keys(): raise KeyError, "Style attribute incorrect. Should be one of %s" % self._attributes.keys() self.attributes[name] = value def setLogScale(self, logscale): self._logscale = logscale def __getattr__(self, name): if name == 'points': if len(self._points)>0: data = _Numeric.array(self._points,copy=True) if self._logscale[0]: data = self.log10(data, 0) if self._logscale[1]: data = self.log10(data, 1) return data else: return self._points else: raise AttributeError, name def log10(self, data, ind): data = _Numeric.compress(data[:,ind]>0,data,0) data[:,ind] = _Numeric.log10(data[:,ind]) return data def boundingBox(self): if len(self.points) == 0: # no curves to draw # defaults to (-1,-1) and (1,1) but axis can be set in Draw minXY= _Numeric.array([-1.0,-1.0]) maxXY= _Numeric.array([ 1.0, 1.0]) else: minXY= _Numeric.minimum.reduce(self.points) maxXY= _Numeric.maximum.reduce(self.points) return minXY, maxXY def scaleAndShift(self, scale=(1,1), shift=(0,0)): if len(self.points) == 0: # no curves to draw return if (scale is not self.currentScale) or (shift is not self.currentShift): # update point scaling self.scaled = scale*self.points+shift self.currentScale= scale self.currentShift= shift # else unchanged use the current scaling def getLegend(self): return self.attributes['legend'] def getClosestPoint(self, pntXY, pointScaled= True): """Returns the index of closest point on the curve, pointXY, scaledXY, distance x, y in user coords if pointScaled == True based on screen coords if pointScaled == False based on user coords """ if pointScaled == True: #Using screen coords p = self.scaled pxy = self.currentScale * _Numeric.array(pntXY)+ self.currentShift else: #Using user coords p = self.points pxy = _Numeric.array(pntXY) #determine distance for each point d= _Numeric.sqrt(_Numeric.add.reduce((p-pxy)**2,1)) #sqrt(dx^2+dy^2) pntIndex = _Numeric.argmin(d) dist = d[pntIndex] return [pntIndex, self.points[pntIndex], self.scaled[pntIndex] / self._pointSize, dist] class PolyLine(PolyPoints): """Class to define line type and style - All methods except __init__ are private. """ _attributes = {'colour': 'black', 'width': 1, 'style': wx.SOLID, 'legend': ''} def __init__(self, points, **attr): """Creates PolyLine object points - sequence (array, tuple or list) of (x,y) points making up line **attr - key word attributes Defaults: 'colour'= 'black', - wx.Pen Colour any wx.NamedColour 'width'= 1, - Pen width 'style'= wx.SOLID, - wx.Pen style 'legend'= '' - Line Legend to display """ PolyPoints.__init__(self, points, attr) def draw(self, dc, printerScale, coord= None): colour = self.attributes['colour'] width = self.attributes['width'] * printerScale * self._pointSize[0] style= self.attributes['style'] if not isinstance(colour, wx.Colour): colour = wx.NamedColour(colour) pen = wx.Pen(colour, width, style) pen.SetCap(wx.CAP_BUTT) dc.SetPen(pen) if coord is None: if len(self.scaled): # bugfix for Mac OS X dc.DrawLines(self.scaled) else: dc.DrawLines(coord) # draw legend line def getSymExtent(self, printerScale): """Width and Height of Marker""" h= self.attributes['width'] * printerScale * self._pointSize[0] w= 5 * h return (w,h) class PolySpline(PolyLine): """Class to define line type and style - All methods except __init__ are private. """ _attributes = {'colour': 'black', 'width': 1, 'style': wx.SOLID, 'legend': ''} def __init__(self, points, **attr): """Creates PolyLine object points - sequence (array, tuple or list) of (x,y) points making up line **attr - key word attributes Defaults: 'colour'= 'black', - wx.Pen Colour any wx.NamedColour 'width'= 1, - Pen width 'style'= wx.SOLID, - wx.Pen style 'legend'= '' - Line Legend to display """ PolyLine.__init__(self, points, **attr) def draw(self, dc, printerScale, coord= None): colour = self.attributes['colour'] width = self.attributes['width'] * printerScale * self._pointSize[0] style= self.attributes['style'] if not isinstance(colour, wx.Colour): colour = wx.NamedColour(colour) pen = wx.Pen(colour, width, style) pen.SetCap(wx.CAP_ROUND) dc.SetPen(pen) if coord is None: if len(self.scaled): # bugfix for Mac OS X dc.DrawSpline(self.scaled) else: dc.DrawLines(coord) # draw legend line class PolyMarker(PolyPoints): """Class to define marker type and style - All methods except __init__ are private. """ _attributes = {'colour': 'black', 'width': 1, 'size': 2, 'fillcolour': None, 'fillstyle': wx.SOLID, 'marker': 'circle', 'legend': ''} def __init__(self, points, **attr): """Creates PolyMarker object points - sequence (array, tuple or list) of (x,y) points **attr - key word attributes Defaults: 'colour'= 'black', - wx.Pen Colour any wx.NamedColour 'width'= 1, - Pen width 'size'= 2, - Marker size 'fillcolour'= same as colour, - wx.Brush Colour any wx.NamedColour 'fillstyle'= wx.SOLID, - wx.Brush fill style (use wx.TRANSPARENT for no fill) 'marker'= 'circle' - Marker shape 'legend'= '' - Marker Legend to display Marker Shapes: - 'circle' - 'dot' - 'square' - 'triangle' - 'triangle_down' - 'cross' - 'plus' """ PolyPoints.__init__(self, points, attr) def draw(self, dc, printerScale, coord= None): colour = self.attributes['colour'] width = self.attributes['width'] * printerScale * self._pointSize[0] size = self.attributes['size'] * printerScale * self._pointSize[0] fillcolour = self.attributes['fillcolour'] fillstyle = self.attributes['fillstyle'] marker = self.attributes['marker'] if colour and not isinstance(colour, wx.Colour): colour = wx.NamedColour(colour) if fillcolour and not isinstance(fillcolour, wx.Colour): fillcolour = wx.NamedColour(fillcolour) dc.SetPen(wx.Pen(colour, width)) if fillcolour: dc.SetBrush(wx.Brush(fillcolour,fillstyle)) else: dc.SetBrush(wx.Brush(colour, fillstyle)) if coord is None: if len(self.scaled): # bugfix for Mac OS X self._drawmarkers(dc, self.scaled, marker, size) else: self._drawmarkers(dc, coord, marker, size) # draw legend marker def getSymExtent(self, printerScale): """Width and Height of Marker""" s= 5*self.attributes['size'] * printerScale * self._pointSize[0] return (s,s) def _drawmarkers(self, dc, coords, marker,size=1): f = eval('self._' +marker) f(dc, coords, size) def _circle(self, dc, coords, size=1): fact= 2.5*size wh= 5.0*size rect= _Numeric.zeros((len(coords),4),_Numeric.Float)+[0.0,0.0,wh,wh] rect[:,0:2]= coords-[fact,fact] dc.DrawEllipseList(rect.astype(_Numeric.Int32)) def _dot(self, dc, coords, size=1): dc.DrawPointList(coords) def _square(self, dc, coords, size=1): fact= 2.5*size wh= 5.0*size rect= _Numeric.zeros((len(coords),4),_Numeric.Float)+[0.0,0.0,wh,wh] rect[:,0:2]= coords-[fact,fact] dc.DrawRectangleList(rect.astype(_Numeric.Int32)) def _triangle(self, dc, coords, size=1): shape= [(-2.5*size,1.44*size), (2.5*size,1.44*size), (0.0,-2.88*size)] poly= _Numeric.repeat(coords,3,0) poly.shape= (len(coords),3,2) poly += shape dc.DrawPolygonList(poly.astype(_Numeric.Int32)) def _triangle_down(self, dc, coords, size=1): shape= [(-2.5*size,-1.44*size), (2.5*size,-1.44*size), (0.0,2.88*size)] poly= _Numeric.repeat(coords,3,0) poly.shape= (len(coords),3,2) poly += shape dc.DrawPolygonList(poly.astype(_Numeric.Int32)) def _cross(self, dc, coords, size=1): fact= 2.5*size for f in [[-fact,-fact,fact,fact],[-fact,fact,fact,-fact]]: lines= _Numeric.concatenate((coords,coords),axis=1)+f dc.DrawLineList(lines.astype(_Numeric.Int32)) def _plus(self, dc, coords, size=1): fact= 2.5*size for f in [[-fact,0,fact,0],[0,-fact,0,fact]]: lines= _Numeric.concatenate((coords,coords),axis=1)+f dc.DrawLineList(lines.astype(_Numeric.Int32)) class PlotGraphics: """Container to hold PolyXXX objects and graph labels - All methods except __init__ are private. """ def __init__(self, objects, title='', xLabel='', yLabel= ''): """Creates PlotGraphics object objects - list of PolyXXX objects to make graph title - title shown at top of graph xLabel - label shown on x-axis yLabel - label shown on y-axis """ if type(objects) not in [list,tuple]: raise TypeError, "objects argument should be list or tuple" self.objects = objects self.title= title self.xLabel= xLabel self.yLabel= yLabel self._pointSize = (1.0, 1.0) def setLogScale(self, logscale): if type(logscale) != tuple: raise TypeError, 'logscale must be a tuple of bools, e.g. (False, False)' if len(self.objects) == 0: return for o in self.objects: o.setLogScale(logscale) def boundingBox(self): p1, p2 = self.objects[0].boundingBox() for o in self.objects[1:]: p1o, p2o = o.boundingBox() p1 = _Numeric.minimum(p1, p1o) p2 = _Numeric.maximum(p2, p2o) return p1, p2 def scaleAndShift(self, scale=(1,1), shift=(0,0)): for o in self.objects: o.scaleAndShift(scale, shift) def setPrinterScale(self, scale): """Thickens up lines and markers only for printing""" self.printerScale= scale def setXLabel(self, xLabel= ''): """Set the X axis label on the graph""" self.xLabel= xLabel def setYLabel(self, yLabel= ''): """Set the Y axis label on the graph""" self.yLabel= yLabel def setTitle(self, title= ''): """Set the title at the top of graph""" self.title= title def getXLabel(self): """Get x axis label string""" return self.xLabel def getYLabel(self): """Get y axis label string""" return self.yLabel def getTitle(self, title= ''): """Get the title at the top of graph""" return self.title def draw(self, dc): for o in self.objects: #t=_time.clock() # profile info o._pointSize = self._pointSize o.draw(dc, self.printerScale) #dt= _time.clock()-t #print o, "time=", dt def getSymExtent(self, printerScale): """Get max width and height of lines and markers symbols for legend""" self.objects[0]._pointSize = self._pointSize symExt = self.objects[0].getSymExtent(printerScale) for o in self.objects[1:]: o._pointSize = self._pointSize oSymExt = o.getSymExtent(printerScale) symExt = _Numeric.maximum(symExt, oSymExt) return symExt def getLegendNames(self): """Returns list of legend names""" lst = [None]*len(self) for i in range(len(self)): lst[i]= self.objects[i].getLegend() return lst def __len__(self): return len(self.objects) def __getitem__(self, item): return self.objects[item] #------------------------------------------------------------------------------- # Main window that you will want to import into your application. class PlotCanvas(wx.Panel): """ Subclass of a wx.Panel which holds two scrollbars and the actual plotting canvas (self.canvas). It allows for simple general plotting of data with zoom, labels, and automatic axis scaling.""" def __init__(self, parent, id=wx.ID_ANY, pos=wx.DefaultPosition, size=wx.DefaultSize, style=0, name="plotCanvas"): """Constructs a panel, which can be a child of a frame or any other non-control window""" wx.Panel.__init__(self, parent, id, pos, size, style, name) sizer = wx.FlexGridSizer(2,2,0,0) self.canvas = wx.Window(self, -1) self.sb_vert = wx.ScrollBar(self, -1, style=wx.SB_VERTICAL) self.sb_vert.SetScrollbar(0,1000,1000,1000) self.sb_hor = wx.ScrollBar(self, -1, style=wx.SB_HORIZONTAL) self.sb_hor.SetScrollbar(0,1000,1000,1000) sizer.Add(self.canvas, 1, wx.EXPAND) sizer.Add(self.sb_vert, 0, wx.EXPAND) sizer.Add(self.sb_hor, 0, wx.EXPAND) sizer.Add((0,0)) sizer.AddGrowableRow(0, 1) sizer.AddGrowableCol(0, 1) self.sb_vert.Show(False) self.sb_hor.Show(False) self.SetSizer(sizer) self.Fit() self.border = (1,1) self.SetBackgroundColour("white") # Create some mouse events for zooming self.canvas.Bind(wx.EVT_LEFT_DOWN, self.OnMouseLeftDown) self.canvas.Bind(wx.EVT_LEFT_UP, self.OnMouseLeftUp) self.canvas.Bind(wx.EVT_MOTION, self.OnMotion) self.canvas.Bind(wx.EVT_LEFT_DCLICK, self.OnMouseDoubleClick) self.canvas.Bind(wx.EVT_RIGHT_DOWN, self.OnMouseRightDown) # scrollbar events self.Bind(wx.EVT_SCROLL_THUMBTRACK, self.OnScroll) self.Bind(wx.EVT_SCROLL_PAGEUP, self.OnScroll) self.Bind(wx.EVT_SCROLL_PAGEDOWN, self.OnScroll) self.Bind(wx.EVT_SCROLL_LINEUP, self.OnScroll) self.Bind(wx.EVT_SCROLL_LINEDOWN, self.OnScroll) # set curser as cross-hairs self.canvas.SetCursor(wx.CROSS_CURSOR) self.HandCursor = wx.CursorFromImage(Hand.GetImage()) self.GrabHandCursor = wx.CursorFromImage(GrabHand.GetImage()) self.MagCursor = wx.CursorFromImage(MagPlus.GetImage()) # Things for printing self._print_data = None self._pageSetupData= None self.printerScale = 1 self.parent= parent # scrollbar variables self._sb_ignore = False self._adjustingSB = False self._sb_xfullrange = 0 self._sb_yfullrange = 0 self._sb_xunit = 0 self._sb_yunit = 0 self._dragEnabled = False self._screenCoordinates = _Numeric.array([0.0, 0.0]) self._logscale = (False, False) # Zooming variables self._zoomInFactor = 0.5 self._zoomOutFactor = 2 self._zoomCorner1= _Numeric.array([0.0, 0.0]) # left mouse down corner self._zoomCorner2= _Numeric.array([0.0, 0.0]) # left mouse up corner self._zoomEnabled= False self._hasDragged= False # Drawing Variables self.last_draw = None self._pointScale= 1 self._pointShift= 0 self._xSpec= 'auto' self._ySpec= 'auto' self._gridEnabled= False self._legendEnabled= False self._titleEnabled= True self._centerLinesEnabled = False self._diagonalsEnabled = False # Fonts self._fontCache = {} self._fontSizeAxis= 10 self._fontSizeTitle= 15 self._fontSizeLegend= 7 # pointLabels self._pointLabelEnabled= False self.last_PointLabel= None self._pointLabelFunc= None self.canvas.Bind(wx.EVT_LEAVE_WINDOW, self.OnLeave) self._logicalFunction = wx.COPY # wx.EQUIV not supported on Mac OS X self._useScientificNotation = False self._antiAliasingEnabled = False self._hiResEnabled = False self._pointSize = (1.0, 1.0) self._fontScale = 1.0 self.canvas.Bind(wx.EVT_PAINT, self.OnPaint) self.canvas.Bind(wx.EVT_SIZE, self.OnSize) # OnSize called to make sure the buffer is initialized. # This might result in OnSize getting called twice on some # platforms at initialization, but little harm done. self.OnSize(None) # sets the initial size based on client size self._gridColour = wx.NamedColour('black') def SetCursor(self, cursor): self.canvas.SetCursor(cursor) def GetGridColour(self): return self._gridColour def SetGridColour(self, colour): if isinstance(colour, wx.Colour): self._gridColour = colour else: self._gridColour = wx.NamedColour(colour) # SaveFile def SaveFile(self, fileName= ''): """Saves the file to the type specified in the extension. If no file name is specified a dialog box is provided. Returns True if sucessful, otherwise False. .bmp Save a Windows bitmap file. .xbm Save an X bitmap file. .xpm Save an XPM bitmap file. .png Save a Portable Network Graphics file. .jpg Save a Joint Photographic Experts Group file. """ extensions = { "bmp": wx.BITMAP_TYPE_BMP, # Save a Windows bitmap file. "xbm": wx.BITMAP_TYPE_XBM, # Save an X bitmap file. "xpm": wx.BITMAP_TYPE_XPM, # Save an XPM bitmap file. "jpg": wx.BITMAP_TYPE_JPEG, # Save a JPG file. "png": wx.BITMAP_TYPE_PNG, # Save a PNG file. } fType = _string.lower(fileName[-3:]) dlg1 = None while fType not in extensions: if dlg1: # FileDialog exists: Check for extension dlg2 = wx.MessageDialog(self, 'File name extension\n' 'must be one of\nbmp, xbm, xpm, png, or jpg', 'File Name Error', wx.OK | wx.ICON_ERROR) try: dlg2.ShowModal() finally: dlg2.Destroy() else: # FileDialog doesn't exist: just check one dlg1 = wx.FileDialog( self, "Choose a file with extension bmp, gif, xbm, xpm, png, or jpg", ".", "", "BMP files (*.bmp)|*.bmp|XBM files (*.xbm)|*.xbm|XPM file (*.xpm)|*.xpm|PNG files (*.png)|*.png|JPG files (*.jpg)|*.jpg", wx.SAVE|wx.OVERWRITE_PROMPT ) if dlg1.ShowModal() == wx.ID_OK: fileName = dlg1.GetPath() fType = _string.lower(fileName[-3:]) else: # exit without saving dlg1.Destroy() return False if dlg1: dlg1.Destroy() # Save Bitmap res= self._Buffer.SaveFile(fileName, extensions[fType]) return res @property def print_data(self): if not self._print_data: self._print_data = wx.PrintData() self._print_data.SetPaperId(wx.PAPER_LETTER) self._print_data.SetOrientation(wx.LANDSCAPE) return self._print_data @property def pageSetupData(self): if not self._pageSetupData: self._pageSetupData= wx.PageSetupDialogData() self._pageSetupData.SetMarginBottomRight((25,25)) self._pageSetupData.SetMarginTopLeft((25,25)) self._pageSetupData.SetPrintData(self.print_data) return self._pageSetupData def PageSetup(self): """Brings up the page setup dialog""" data = self.pageSetupData data.SetPrintData(self.print_data) dlg = wx.PageSetupDialog(self.parent, data) try: if dlg.ShowModal() == wx.ID_OK: data = dlg.GetPageSetupData() # returns wx.PageSetupDialogData # updates page parameters from dialog self.pageSetupData.SetMarginBottomRight(data.GetMarginBottomRight()) self.pageSetupData.SetMarginTopLeft(data.GetMarginTopLeft()) self.pageSetupData.SetPrintData(data.GetPrintData()) self._print_data=wx.PrintData(data.GetPrintData()) # updates print_data finally: dlg.Destroy() def Printout(self, paper=None): """Print current plot.""" if paper != None: self.print_data.SetPaperId(paper) pdd = wx.PrintDialogData(self.print_data) printer = wx.Printer(pdd) out = PlotPrintout(self) print_ok = printer.Print(self.parent, out) if print_ok: self._print_data = wx.PrintData(printer.GetPrintDialogData().GetPrintData()) out.Destroy() def PrintPreview(self): """Print-preview current plot.""" printout = PlotPrintout(self) printout2 = PlotPrintout(self) self.preview = wx.PrintPreview(printout, printout2, self.print_data) if not self.preview.Ok(): wx.MessageDialog(self, "Print Preview failed.\n" \ "Check that default printer is configured\n", \ "Print error", wx.OK|wx.CENTRE).ShowModal() self.preview.SetZoom(40) # search up tree to find frame instance frameInst= self while not isinstance(frameInst, wx.Frame): frameInst= frameInst.GetParent() frame = wx.PreviewFrame(self.preview, frameInst, "Preview") frame.Initialize() frame.SetPosition(self.GetPosition()) frame.SetSize((600,550)) frame.Centre(wx.BOTH) frame.Show(True) def setLogScale(self, logscale): if type(logscale) != tuple: raise TypeError, 'logscale must be a tuple of bools, e.g. (False, False)' if self.last_draw is not None: graphics, xAxis, yAxis= self.last_draw graphics.setLogScale(logscale) self.last_draw = (graphics, None, None) self.SetXSpec('min') self.SetYSpec('min') self._logscale = logscale def getLogScale(self): return self._logscale def SetFontSizeAxis(self, point= 10): """Set the tick and axis label font size (default is 10 point)""" self._fontSizeAxis= point def GetFontSizeAxis(self): """Get current tick and axis label font size in points""" return self._fontSizeAxis def SetFontSizeTitle(self, point= 15): """Set Title font size (default is 15 point)""" self._fontSizeTitle= point def GetFontSizeTitle(self): """Get current Title font size in points""" return self._fontSizeTitle def SetFontSizeLegend(self, point= 7): """Set Legend font size (default is 7 point)""" self._fontSizeLegend= point def GetFontSizeLegend(self): """Get current Legend font size in points""" return self._fontSizeLegend def SetShowScrollbars(self, value): """Set True to show scrollbars""" if value not in [True,False]: raise TypeError, "Value should be True or False" if value == self.GetShowScrollbars(): return self.sb_vert.Show(value) self.sb_hor.Show(value) wx.CallAfter(self.Layout) def GetShowScrollbars(self): """Set True to show scrollbars""" return self.sb_vert.IsShown() def SetUseScientificNotation(self, useScientificNotation): self._useScientificNotation = useScientificNotation def GetUseScientificNotation(self): return self._useScientificNotation def SetEnableAntiAliasing(self, enableAntiAliasing): """Set True to enable anti-aliasing.""" self._antiAliasingEnabled = enableAntiAliasing self.Redraw() def GetEnableAntiAliasing(self): return self._antiAliasingEnabled def SetEnableHiRes(self, enableHiRes): """Set True to enable high-resolution mode when using anti-aliasing.""" self._hiResEnabled = enableHiRes self.Redraw() def GetEnableHiRes(self): return self._hiResEnabled def SetEnableDrag(self, value): """Set True to enable drag.""" if value not in [True,False]: raise TypeError, "Value should be True or False" if value: if self.GetEnableZoom(): self.SetEnableZoom(False) self.SetCursor(self.HandCursor) else: self.SetCursor(wx.CROSS_CURSOR) self._dragEnabled = value def GetEnableDrag(self): return self._dragEnabled def SetEnableZoom(self, value): """Set True to enable zooming.""" if value not in [True,False]: raise TypeError, "Value should be True or False" if value: if self.GetEnableDrag(): self.SetEnableDrag(False) self.SetCursor(self.MagCursor) else: self.SetCursor(wx.CROSS_CURSOR) self._zoomEnabled= value def GetEnableZoom(self): """True if zooming enabled.""" return self._zoomEnabled def SetEnableGrid(self, value): """Set True, 'Horizontal' or 'Vertical' to enable grid.""" if value not in [True,False,'Horizontal','Vertical']: raise TypeError, "Value should be True, False, Horizontal or Vertical" self._gridEnabled= value self.Redraw() def GetEnableGrid(self): """True if grid enabled.""" return self._gridEnabled def SetEnableCenterLines(self, value): """Set True, 'Horizontal' or 'Vertical' to enable center line(s).""" if value not in [True,False,'Horizontal','Vertical']: raise TypeError, "Value should be True, False, Horizontal or Vertical" self._centerLinesEnabled= value self.Redraw() def GetEnableCenterLines(self): """True if grid enabled.""" return self._centerLinesEnabled def SetEnableDiagonals(self, value): """Set True, 'Bottomleft-Topright' or 'Bottomright-Topleft' to enable center line(s).""" if value not in [True,False,'Bottomleft-Topright','Bottomright-Topleft']: raise TypeError, "Value should be True, False, Bottomleft-Topright or Bottomright-Topleft" self._diagonalsEnabled= value self.Redraw() def GetEnableDiagonals(self): """True if grid enabled.""" return self._diagonalsEnabled def SetEnableLegend(self, value): """Set True to enable legend.""" if value not in [True,False]: raise TypeError, "Value should be True or False" self._legendEnabled= value self.Redraw() def GetEnableLegend(self): """True if Legend enabled.""" return self._legendEnabled def SetEnableTitle(self, value): """Set True to enable title.""" if value not in [True,False]: raise TypeError, "Value should be True or False" self._titleEnabled= value self.Redraw() def GetEnableTitle(self): """True if title enabled.""" return self._titleEnabled def SetEnablePointLabel(self, value): """Set True to enable pointLabel.""" if value not in [True,False]: raise TypeError, "Value should be True or False" self._pointLabelEnabled= value self.Redraw() #will erase existing pointLabel if present self.last_PointLabel = None def GetEnablePointLabel(self): """True if pointLabel enabled.""" return self._pointLabelEnabled def SetPointLabelFunc(self, func): """Sets the function with custom code for pointLabel drawing ******** more info needed *************** """ self._pointLabelFunc= func def GetPointLabelFunc(self): """Returns pointLabel Drawing Function""" return self._pointLabelFunc def Reset(self): """Unzoom the plot.""" self.last_PointLabel = None #reset pointLabel if self.last_draw is not None: self._Draw(self.last_draw[0]) def ScrollRight(self, units): """Move view right number of axis units.""" self.last_PointLabel = None #reset pointLabel if self.last_draw is not None: graphics, xAxis, yAxis= self.last_draw xAxis= (xAxis[0]+units, xAxis[1]+units) self._Draw(graphics,xAxis,yAxis) def ScrollUp(self, units): """Move view up number of axis units.""" self.last_PointLabel = None #reset pointLabel if self.last_draw is not None: graphics, xAxis, yAxis= self.last_draw yAxis= (yAxis[0]+units, yAxis[1]+units) self._Draw(graphics,xAxis,yAxis) def GetXY(self, event): """Wrapper around _getXY, which handles log scales""" x,y = self._getXY(event) if self.getLogScale()[0]: x = _Numeric.power(10,x) if self.getLogScale()[1]: y = _Numeric.power(10,y) return x,y def _getXY(self,event): """Takes a mouse event and returns the XY user axis values.""" x,y= self.PositionScreenToUser(event.GetPosition()) return x,y def PositionUserToScreen(self, pntXY): """Converts User position to Screen Coordinates""" userPos= _Numeric.array(pntXY) x,y= userPos * self._pointScale + self._pointShift return x,y def PositionScreenToUser(self, pntXY): """Converts Screen position to User Coordinates""" screenPos= _Numeric.array(pntXY) x,y= (screenPos-self._pointShift)/self._pointScale return x,y def SetXSpec(self, type= 'auto'): """xSpec- defines x axis type. Can be 'none', 'min' or 'auto' where: 'none' - shows no axis or tick mark values 'min' - shows min bounding box values 'auto' - rounds axis range to sensible values - like 'min', but with tick marks """ self._xSpec= type def SetYSpec(self, type= 'auto'): """ySpec- defines x axis type. Can be 'none', 'min' or 'auto' where: 'none' - shows no axis or tick mark values 'min' - shows min bounding box values 'auto' - rounds axis range to sensible values - like 'min', but with tick marks """ self._ySpec= type def GetXSpec(self): """Returns current XSpec for axis""" return self._xSpec def GetYSpec(self): """Returns current YSpec for axis""" return self._ySpec def GetXMaxRange(self): xAxis = self._getXMaxRange() if self.getLogScale()[0]: xAxis = _Numeric.power(10,xAxis) return xAxis def _getXMaxRange(self): """Returns (minX, maxX) x-axis range for displayed graph""" graphics= self.last_draw[0] p1, p2 = graphics.boundingBox() # min, max points of graphics xAxis = self._axisInterval(self._xSpec, p1[0], p2[0]) # in user units return xAxis def GetYMaxRange(self): yAxis = self._getYMaxRange() if self.getLogScale()[1]: yAxis = _Numeric.power(10,yAxis) return yAxis def _getYMaxRange(self): """Returns (minY, maxY) y-axis range for displayed graph""" graphics= self.last_draw[0] p1, p2 = graphics.boundingBox() # min, max points of graphics yAxis = self._axisInterval(self._ySpec, p1[1], p2[1]) return yAxis def GetXCurrentRange(self): xAxis = self._getXCurrentRange() if self.getLogScale()[0]: xAxis = _Numeric.power(10,xAxis) return xAxis def _getXCurrentRange(self): """Returns (minX, maxX) x-axis for currently displayed portion of graph""" return self.last_draw[1] def GetYCurrentRange(self): yAxis = self._getYCurrentRange() if self.getLogScale()[1]: yAxis = _Numeric.power(10,yAxis) return yAxis def _getYCurrentRange(self): """Returns (minY, maxY) y-axis for currently displayed portion of graph""" return self.last_draw[2] def Draw(self, graphics, xAxis = None, yAxis = None, dc = None): """Wrapper around _Draw, which handles log axes""" graphics.setLogScale(self.getLogScale()) # check Axis is either tuple or none if type(xAxis) not in [type(None),tuple]: raise TypeError, "xAxis should be None or (minX,maxX)"+str(type(xAxis)) if type(yAxis) not in [type(None),tuple]: raise TypeError, "yAxis should be None or (minY,maxY)"+str(type(xAxis)) # check case for axis = (a,b) where a==b caused by improper zooms if xAxis != None: if xAxis[0] == xAxis[1]: return if self.getLogScale()[0]: xAxis = _Numeric.log10(xAxis) if yAxis != None: if yAxis[0] == yAxis[1]: return if self.getLogScale()[1]: yAxis = _Numeric.log10(yAxis) self._Draw(graphics, xAxis, yAxis, dc) def _Draw(self, graphics, xAxis = None, yAxis = None, dc = None): """\ Draw objects in graphics with specified x and y axis. graphics- instance of PlotGraphics with list of PolyXXX objects xAxis - tuple with (min, max) axis range to view yAxis - same as xAxis dc - drawing context - doesn't have to be specified. If it's not, the offscreen buffer is used """ if dc is None: # sets new dc and clears it dc = wx.BufferedDC(wx.ClientDC(self.canvas), self._Buffer) bbr = wx.Brush(self.GetBackgroundColour(), wx.SOLID) dc.SetBackground(bbr) dc.SetBackgroundMode(wx.SOLID) dc.Clear() if self._antiAliasingEnabled: if not isinstance(dc, wx.GCDC): try: dc = wx.GCDC(dc) except Exception, exception: pass else: if self._hiResEnabled: dc.SetMapMode(wx.MM_TWIPS) # high precision - each logical unit is 1/20 of a point self._pointSize = tuple(1.0 / lscale for lscale in dc.GetLogicalScale()) self._setSize() elif self._pointSize != (1.0, 1.0): self._pointSize = (1.0, 1.0) self._setSize() self._fontScale = get_dc_font_scale(dc) graphics._pointSize = self._pointSize dc.SetTextForeground(self.GetForegroundColour()) dc.SetTextBackground(self.GetBackgroundColour()) dc.BeginDrawing() # dc.Clear() # set font size for every thing but title and legend dc.SetFont(self._getFont(self._fontSizeAxis)) # sizes axis to axis type, create lower left and upper right corners of plot if xAxis is None or yAxis is None: # One or both axis not specified in Draw p1, p2 = graphics.boundingBox() # min, max points of graphics if xAxis is None: xAxis = self._axisInterval(self._xSpec, p1[0], p2[0]) # in user units if yAxis is None: yAxis = self._axisInterval(self._ySpec, p1[1], p2[1]) # Adjust bounding box for axis spec p1[0],p1[1] = xAxis[0], yAxis[0] # lower left corner user scale (xmin,ymin) p2[0],p2[1] = xAxis[1], yAxis[1] # upper right corner user scale (xmax,ymax) else: # Both axis specified in Draw p1= _Numeric.array([xAxis[0], yAxis[0]]) # lower left corner user scale (xmin,ymin) p2= _Numeric.array([xAxis[1], yAxis[1]]) # upper right corner user scale (xmax,ymax) self.last_draw = (graphics, _Numeric.array(xAxis), _Numeric.array(yAxis)) # saves most recient values # Get ticks and textExtents for axis if required if self._xSpec is not 'none': xticks = self._xticks(xAxis[0], xAxis[1]) else: xticks = None if xticks: xTextExtent = dc.GetTextExtent(xticks[-1][1])# w h of x axis text last number on axis else: xTextExtent= (0,0) # No text for ticks if self._ySpec is not 'none': yticks = self._yticks(yAxis[0], yAxis[1]) else: yticks = None if yticks: if self.getLogScale()[1]: yTextExtent = dc.GetTextExtent('-2e-2') else: yTextExtentBottom = dc.GetTextExtent(yticks[0][1]) yTextExtentTop = dc.GetTextExtent(yticks[-1][1]) yTextExtent= (max(yTextExtentBottom[0],yTextExtentTop[0]), max(yTextExtentBottom[1],yTextExtentTop[1])) else: yTextExtent= (0,0) # No text for ticks # TextExtents for Title and Axis Labels titleWH, xLabelWH, yLabelWH= self._titleLablesWH(dc, graphics) # TextExtents for Legend legendBoxWH, legendSymExt, legendTextExt = self._legendWH(dc, graphics) # room around graph area rhsW= max(xTextExtent[0], legendBoxWH[0])+5*self._pointSize[0] # use larger of number width or legend width lhsW= yTextExtent[0]+ yLabelWH[1] + 3*self._pointSize[0] bottomH= max(xTextExtent[1], yTextExtent[1]/2.)+ xLabelWH[1] + 2*self._pointSize[1] topH= yTextExtent[1]/2. + titleWH[1] textSize_scale= _Numeric.array([rhsW+lhsW,bottomH+topH]) # make plot area smaller by text size textSize_shift= _Numeric.array([lhsW, bottomH]) # shift plot area by this amount # draw title if requested if self._titleEnabled: dc.SetFont(self._getFont(self._fontSizeTitle)) titlePos= (self.plotbox_origin[0]+ lhsW + (self.plotbox_size[0]-lhsW-rhsW)/2.- titleWH[0]/2., self.plotbox_origin[1]- self.plotbox_size[1]) dc.DrawText(graphics.getTitle(),titlePos[0],titlePos[1]) # draw label text dc.SetFont(self._getFont(self._fontSizeAxis)) xLabelPos= (self.plotbox_origin[0]+ lhsW + (self.plotbox_size[0]-lhsW-rhsW)/2.- xLabelWH[0]/2., self.plotbox_origin[1]- xLabelWH[1]) dc.DrawText(graphics.getXLabel(),xLabelPos[0],xLabelPos[1]) yLabelPos= (self.plotbox_origin[0] - 3*self._pointSize[0], self.plotbox_origin[1]- bottomH- (self.plotbox_size[1]-bottomH-topH)/2.+ yLabelWH[0]/2.) if graphics.getYLabel(): # bug fix for Linux dc.DrawRotatedText(graphics.getYLabel(),yLabelPos[0],yLabelPos[1],90) # drawing legend makers and text if self._legendEnabled: self._drawLegend(dc,graphics,rhsW,topH,legendBoxWH, legendSymExt, legendTextExt) # allow for scaling and shifting plotted points scale = (self.plotbox_size-textSize_scale) / (p2-p1)* _Numeric.array((1,-1)) shift = -p1*scale + self.plotbox_origin + textSize_shift * _Numeric.array((1,-1)) self._pointScale= scale / self._pointSize # make available for mouse events self._pointShift= shift / self._pointSize self._drawAxes(dc, p1, p2, scale, shift, xticks, yticks) graphics.scaleAndShift(scale, shift) graphics.setPrinterScale(self.printerScale) # thicken up lines and markers if printing # set clipping area so drawing does not occur outside axis box ptx,pty,rectWidth,rectHeight= self._point2ClientCoord(p1, p2) # allow graph to overlap axis lines by adding units to width and height dc.SetClippingRegion(ptx*self._pointSize[0],pty*self._pointSize[1],rectWidth*self._pointSize[0]+2,rectHeight*self._pointSize[1]+1) # Draw extras self._drawExtras(dc, p1, p2, scale, shift) # Draw the lines and markers #start = _time.clock() graphics.draw(dc) # print "entire graphics drawing took: %f second"%(_time.clock() - start) # remove the clipping region dc.DestroyClippingRegion() dc.EndDrawing() self._adjustScrollbars() def Redraw(self, dc=None): """Redraw the existing plot.""" if self.last_draw is not None: graphics, xAxis, yAxis= self.last_draw self._Draw(graphics,xAxis,yAxis,dc) def Clear(self): """Erase the window.""" self.last_PointLabel = None #reset pointLabel dc = wx.BufferedDC(wx.ClientDC(self.canvas), self._Buffer) bbr = wx.Brush(self.GetBackgroundColour(), wx.SOLID) dc.SetBackground(bbr) dc.SetBackgroundMode(wx.SOLID) dc.Clear() if self._antiAliasingEnabled: try: dc = wx.GCDC(dc) except Exception, exception: pass dc.SetTextForeground(self.GetForegroundColour()) dc.SetTextBackground(self.GetBackgroundColour()) self.last_draw = None def Zoom(self, Center, Ratio): """ Zoom on the plot Centers on the X,Y coords given in Center Zooms by the Ratio = (Xratio, Yratio) given """ self.last_PointLabel = None #reset maker x,y = Center if self.last_draw != None: (graphics, xAxis, yAxis) = self.last_draw w = (xAxis[1] - xAxis[0]) * Ratio[0] h = (yAxis[1] - yAxis[0]) * Ratio[1] xAxis = ( x - w/2, x + w/2 ) yAxis = ( y - h/2, y + h/2 ) self._Draw(graphics, xAxis, yAxis) def GetClosestPoints(self, pntXY, pointScaled= True): """Returns list with [curveNumber, legend, index of closest point, pointXY, scaledXY, distance] list for each curve. Returns [] if no curves are being plotted. x, y in user coords if pointScaled == True based on screen coords if pointScaled == False based on user coords """ if self.last_draw is None: #no graph available return [] graphics, xAxis, yAxis= self.last_draw l = [] for curveNum,obj in enumerate(graphics): #check there are points in the curve if len(obj.points) == 0: continue #go to next obj #[curveNumber, legend, index of closest point, pointXY, scaledXY, distance] cn = [curveNum]+ [obj.getLegend()]+ obj.getClosestPoint( pntXY, pointScaled) l.append(cn) return l def GetClosestPoint(self, pntXY, pointScaled= True): """Returns list with [curveNumber, legend, index of closest point, pointXY, scaledXY, distance] list for only the closest curve. Returns [] if no curves are being plotted. x, y in user coords if pointScaled == True based on screen coords if pointScaled == False based on user coords """ #closest points on screen based on screen scaling (pointScaled= True) #list [curveNumber, index, pointXY, scaledXY, distance] for each curve closestPts= self.GetClosestPoints(pntXY, pointScaled) if closestPts == []: return [] #no graph present #find one with least distance dists = [c[-1] for c in closestPts] mdist = min(dists) #Min dist i = dists.index(mdist) #index for min dist return closestPts[i] #this is the closest point on closest curve GetClosetPoint = GetClosestPoint def UpdatePointLabel(self, mDataDict): """Updates the pointLabel point on screen with data contained in mDataDict. mDataDict will be passed to your function set by SetPointLabelFunc. It can contain anything you want to display on the screen at the scaledXY point you specify. This function can be called from parent window with onClick, onMotion events etc. """ if self.last_PointLabel != None: #compare pointXY if _Numeric.sometrue(mDataDict["pointXY"] != self.last_PointLabel["pointXY"]): #closest changed self._drawPointLabel(self.last_PointLabel) #erase old self._drawPointLabel(mDataDict) #plot new else: #just plot new with no erase self._drawPointLabel(mDataDict) #plot new #save for next erase self.last_PointLabel = mDataDict # event handlers ********************************** def OnMotion(self, event): if self._zoomEnabled and event.LeftIsDown(): if self._hasDragged: self._drawRubberBand(self._zoomCorner1, self._zoomCorner2) # remove old else: self._hasDragged= True self._zoomCorner2[0], self._zoomCorner2[1] = self._getXY(event) self._drawRubberBand(self._zoomCorner1, self._zoomCorner2) # add new elif self._dragEnabled and event.LeftIsDown(): coordinates = event.GetPosition() newpos, oldpos = map(_Numeric.array, map(self.PositionScreenToUser, [coordinates, self._screenCoordinates])) dist = newpos-oldpos self._screenCoordinates = coordinates if self.last_draw is not None: graphics, xAxis, yAxis= self.last_draw yAxis -= dist[1] xAxis -= dist[0] self._Draw(graphics,xAxis,yAxis) def OnMouseLeftDown(self,event): self._zoomCorner1[0], self._zoomCorner1[1]= self._getXY(event) self._screenCoordinates = _Numeric.array(event.GetPosition()) if self._dragEnabled: self.SetCursor(self.GrabHandCursor) self.canvas.CaptureMouse() def OnMouseLeftUp(self, event): if self._zoomEnabled: if self._hasDragged == True: self._drawRubberBand(self._zoomCorner1, self._zoomCorner2) # remove old self._zoomCorner2[0], self._zoomCorner2[1]= self._getXY(event) self._hasDragged = False # reset flag minX, minY= _Numeric.minimum( self._zoomCorner1, self._zoomCorner2) maxX, maxY= _Numeric.maximum( self._zoomCorner1, self._zoomCorner2) self.last_PointLabel = None #reset pointLabel if self.last_draw != None: self._Draw(self.last_draw[0], xAxis = (minX,maxX), yAxis = (minY,maxY), dc = None) #else: # A box has not been drawn, zoom in on a point ## this interfered with the double click, so I've disables it. # X,Y = self._getXY(event) # self.Zoom( (X,Y), (self._zoomInFactor,self._zoomInFactor) ) if self._dragEnabled: self.SetCursor(self.HandCursor) if self.canvas.HasCapture(): self.canvas.ReleaseMouse() def OnMouseDoubleClick(self,event): if self._zoomEnabled: # Give a little time for the click to be totally finished # before (possibly) removing the scrollbars and trigering # size events, etc. wx.FutureCall(200,self.Reset) def OnMouseRightDown(self,event): if self._zoomEnabled: X,Y = self._getXY(event) self.Zoom( (X,Y), (self._zoomOutFactor, self._zoomOutFactor) ) def OnPaint(self, event): # All that is needed here is to draw the buffer to screen if self.last_PointLabel != None: self._drawPointLabel(self.last_PointLabel) #erase old self.last_PointLabel = None dc = wx.BufferedPaintDC(self.canvas, self._Buffer) if self._antiAliasingEnabled: try: dc = wx.GCDC(dc) except Exception, exception: pass def OnSize(self,event): # The Buffer init is done here, to make sure the buffer is always # the same size as the Window Size = self.canvas.GetClientSize() Size.width = max(1, Size.width) Size.height = max(1, Size.height) # Make new offscreen bitmap: this bitmap will always have the # current drawing in it, so it can be used to save the image to # a file, or whatever. self._Buffer = wx.EmptyBitmap(Size.width, Size.height) self._setSize() self.last_PointLabel = None #reset pointLabel if self.last_draw is None: self.Clear() else: graphics, xSpec, ySpec = self.last_draw self._Draw(graphics,xSpec,ySpec) def OnLeave(self, event): """Used to erase pointLabel when mouse outside window""" if self.last_PointLabel != None: self._drawPointLabel(self.last_PointLabel) #erase old self.last_PointLabel = None def OnScroll(self, evt): if not self._adjustingSB: self._sb_ignore = True sbpos = evt.GetPosition() if evt.GetOrientation() == wx.VERTICAL: fullrange,pagesize = self.sb_vert.GetRange(),self.sb_vert.GetPageSize() sbpos = fullrange-pagesize-sbpos dist = sbpos*self._sb_yunit-(self._getYCurrentRange()[0]-self._sb_yfullrange) self.ScrollUp(dist) if evt.GetOrientation() == wx.HORIZONTAL: dist = sbpos*self._sb_xunit-(self._getXCurrentRange()[0]-self._sb_xfullrange) self.ScrollRight(dist) # Private Methods ************************************************** def _setSize(self, width=None, height=None): """DC width and height.""" if width is None: (self.width,self.height) = self.canvas.GetClientSize() else: self.width, self.height= width,height self.width *= self._pointSize[0] # high precision self.height *= self._pointSize[1] # high precision self.plotbox_size = 0.97*_Numeric.array([self.width, self.height]) xo = 0.5*(self.width-self.plotbox_size[0]) yo = self.height-0.5*(self.height-self.plotbox_size[1]) self.plotbox_origin = _Numeric.array([xo, yo]) def _setPrinterScale(self, scale): """Used to thicken lines and increase marker size for print out.""" # line thickness on printer is very thin at 600 dot/in. Markers small self.printerScale= scale def _printDraw(self, printDC): """Used for printing.""" if self.last_draw != None: graphics, xSpec, ySpec= self.last_draw self._Draw(graphics,xSpec,ySpec,printDC) def _drawPointLabel(self, mDataDict): """Draws and erases pointLabels""" width = self._Buffer.GetWidth() height = self._Buffer.GetHeight() tmp_Buffer = self._Buffer.GetSubBitmap((0, 0, width, height)) dcs = wx.MemoryDC(self._Buffer) dcs.BeginDrawing() self._pointLabelFunc(dcs,mDataDict) #custom user pointLabel function dcs.EndDrawing() dc = wx.ClientDC( self.canvas ) dc = wx.BufferedDC(dc, self._Buffer) #this will erase if called twice dc.Blit(0, 0, width, height, dcs, 0, 0, self._logicalFunction) self._Buffer = tmp_Buffer def _drawLegend(self,dc,graphics,rhsW,topH,legendBoxWH, legendSymExt, legendTextExt): """Draws legend symbols and text""" # top right hand corner of graph box is ref corner trhc= self.plotbox_origin+ (self.plotbox_size-[rhsW,topH])*[1,-1] legendLHS= .091* legendBoxWH[0] # border space between legend sym and graph box lineHeight= max(legendSymExt[1], legendTextExt[1]) * 1.1 #1.1 used as space between lines dc.SetFont(self._getFont(self._fontSizeLegend)) for i in range(len(graphics)): o = graphics[i] s= i*lineHeight if isinstance(o,PolyMarker): # draw marker with legend pnt= (trhc[0]+legendLHS+legendSymExt[0]/2., trhc[1]+s+lineHeight/2.) o.draw(dc, self.printerScale, coord= _Numeric.array([pnt])) elif isinstance(o,PolyLine): # draw line with legend pnt1= (trhc[0]+legendLHS, trhc[1]+s+lineHeight/2.) pnt2= (trhc[0]+legendLHS+legendSymExt[0], trhc[1]+s+lineHeight/2.) o.draw(dc, self.printerScale, coord= _Numeric.array([pnt1,pnt2])) else: raise TypeError, "object is neither PolyMarker or PolyLine instance" # draw legend txt pnt= (trhc[0]+legendLHS+legendSymExt[0]+5*self._pointSize[0], trhc[1]+s+lineHeight/2.-legendTextExt[1]/2) dc.DrawText(o.getLegend(),pnt[0],pnt[1]) dc.SetFont(self._getFont(self._fontSizeAxis)) # reset def _titleLablesWH(self, dc, graphics): """Draws Title and labels and returns width and height for each""" # TextExtents for Title and Axis Labels dc.SetFont(self._getFont(self._fontSizeTitle)) if self._titleEnabled: title= graphics.getTitle() titleWH= dc.GetTextExtent(title) else: titleWH= (0,0) dc.SetFont(self._getFont(self._fontSizeAxis)) xLabel, yLabel= graphics.getXLabel(),graphics.getYLabel() xLabelWH= dc.GetTextExtent(xLabel) yLabelWH= dc.GetTextExtent(yLabel) return titleWH, xLabelWH, yLabelWH def _legendWH(self, dc, graphics): """Returns the size in screen units for legend box""" if self._legendEnabled != True: legendBoxWH= symExt= txtExt= (0,0) else: # find max symbol size symExt= graphics.getSymExtent(self.printerScale) # find max legend text extent dc.SetFont(self._getFont(self._fontSizeLegend)) txtList= graphics.getLegendNames() txtExt= dc.GetTextExtent(txtList[0]) for txt in graphics.getLegendNames()[1:]: txtExt= _Numeric.maximum(txtExt,dc.GetTextExtent(txt)) maxW= symExt[0]+txtExt[0] maxH= max(symExt[1],txtExt[1]) # padding .1 for lhs of legend box and space between lines maxW= maxW* 1.1 maxH= maxH* 1.1 * len(txtList) dc.SetFont(self._getFont(self._fontSizeAxis)) legendBoxWH= (maxW,maxH) return (legendBoxWH, symExt, txtExt) def _drawRubberBand(self, corner1, corner2): """Draws/erases rect box from corner1 to corner2""" ptx,pty,rectWidth,rectHeight= self._point2ClientCoord(corner1, corner2) # draw rectangle dc = wx.ClientDC( self.canvas ) dc.BeginDrawing() dc.SetPen(wx.Pen(wx.BLACK)) dc.SetBrush(wx.Brush( wx.WHITE, wx.TRANSPARENT ) ) dc.SetLogicalFunction(wx.INVERT) dc.DrawRectangle( ptx,pty, rectWidth,rectHeight) dc.SetLogicalFunction(wx.COPY) dc.EndDrawing() def _getFont(self,size): """Take font size, adjusts if printing and returns wx.Font""" s = size*self.printerScale*self._fontScale of = self.GetFont() # Linux speed up to get font from cache rather than X font server key = (int(s), of.GetFamily (), of.GetStyle (), of.GetWeight ()) font = self._fontCache.get (key, None) if font: return font # yeah! cache hit else: font = wx.Font(int(s), of.GetFamily(), of.GetStyle(), of.GetWeight()) self._fontCache[key] = font return font def _point2ClientCoord(self, corner1, corner2): """Converts user point coords to client screen int coords x,y,width,height""" c1= _Numeric.array(corner1) c2= _Numeric.array(corner2) # convert to screen coords pt1= c1*self._pointScale+self._pointShift pt2= c2*self._pointScale+self._pointShift # make height and width positive pul= _Numeric.minimum(pt1,pt2) # Upper left corner plr= _Numeric.maximum(pt1,pt2) # Lower right corner rectWidth, rectHeight= plr-pul ptx,pty= pul return ptx, pty, rectWidth, rectHeight def _axisInterval(self, spec, lower, upper): """Returns sensible axis range for given spec""" if spec == 'none' or spec == 'min' or isinstance(spec, (float, int)): if lower == upper: return lower-0.5, upper+0.5 else: return lower, upper elif spec == 'auto': range = upper-lower if range == 0.: return lower-0.5, upper+0.5 log = _Numeric.log10(range) power = _Numeric.floor(log) fraction = log-power if fraction <= 0.05: power = power-1 grid = 10.**power lower = lower - lower % grid mod = upper % grid if mod != 0: upper = upper - mod + grid return lower, upper elif type(spec) == type(()): lower, upper = spec if lower <= upper: return lower, upper else: return upper, lower else: raise ValueError, str(spec) + ': illegal axis specification' def _drawAxes(self, dc, p1, p2, scale, shift, xticks, yticks): penWidth= self.printerScale * self._pointSize[0] # increases thickness for printing only dc.SetPen(wx.Pen(self._gridColour, penWidth)) # set length of tick marks--long ones make grid if self._gridEnabled: x,y,width,height= self._point2ClientCoord(p1,p2) if self._gridEnabled == 'Horizontal': yTickLength= (width/2.0 +1) * self._pointSize[1] xTickLength= 3 * self.printerScale * self._pointSize[0] elif self._gridEnabled == 'Vertical': yTickLength= 3 * self.printerScale * self._pointSize[1] xTickLength= (height/2.0 +1) * self._pointSize[0] else: yTickLength= (width/2.0 +1) * self._pointSize[1] xTickLength= (height/2.0 +1) * self._pointSize[0] else: yTickLength= 3 * self.printerScale * self._pointSize[1] # lengthens lines for printing xTickLength= 3 * self.printerScale * self._pointSize[0] if self._xSpec is not 'none': lower, upper = p1[0],p2[0] text = 1 for y, d in [(p1[1], -xTickLength), (p2[1], xTickLength)]: # miny, maxy and tick lengths for x, label in xticks: pt = scale*_Numeric.array([x, y])+shift dc.DrawLine(pt[0],pt[1],pt[0],pt[1] + d) # draws tick mark d units if text: dc.DrawText(label,pt[0],pt[1]+2*self._pointSize[1]) a1 = scale*_Numeric.array([lower, y])+shift a2 = scale*_Numeric.array([upper, y])+shift dc.DrawLine(a1[0],a1[1],a2[0],a2[1]) # draws upper and lower axis line text = 0 # axis values not drawn on top side if self._ySpec is not 'none': lower, upper = p1[1],p2[1] text = 1 h = dc.GetCharHeight() for x, d in [(p1[0], -yTickLength), (p2[0], yTickLength)]: for y, label in yticks: pt = scale*_Numeric.array([x, y])+shift dc.DrawLine(pt[0],pt[1],pt[0]-d,pt[1]) if text: dc.DrawText(label,pt[0]-dc.GetTextExtent(label)[0]-3*self._pointSize[0], pt[1]-0.75*h) a1 = scale*_Numeric.array([x, lower])+shift a2 = scale*_Numeric.array([x, upper])+shift dc.DrawLine(a1[0],a1[1],a2[0],a2[1]) text = 0 # axis values not drawn on right side def _drawExtras(self, dc, p1, p2, scale, shift): b1, b2 = self.last_draw[0].boundingBox() if self._centerLinesEnabled: x, y = [b1[i] + (b2[i] - b1[i]) / 2.0 for i in xrange(2)] x, y = self.PositionUserToScreen((x, y)) x, y = x * self._pointSize[0], y * self._pointSize[1] if self._centerLinesEnabled in ('Horizontal', True): dc.DrawLine(scale[0] * p1[0] + shift[0], y, scale[0] * p2[0] + shift[0], y) if self._centerLinesEnabled in ('Vertical', True): dc.DrawLine(x, scale[1] * p1[1] + shift[1], x, scale[1] * p2[1] + shift[1]) if self._diagonalsEnabled: x1, y1 = self.PositionUserToScreen(b1) x1, y1 = x1 * self._pointSize[0], y1 * self._pointSize[1] x2, y2 = self.PositionUserToScreen(b2) x2, y2 = x2 * self._pointSize[0], y2 * self._pointSize[1] if self._diagonalsEnabled in ('Bottomleft-Topright', True): dc.DrawLine(x1, y1, x2, y2) if self._diagonalsEnabled in ('Bottomright-Topleft', True): dc.DrawLine(x1, y2, x2, y1) def _xticks(self, *args): if self._logscale[0]: return self._logticks(*args) else: attr = {'numticks': self._xSpec} return self._ticks(*args, **attr) def _yticks(self, *args): if self._logscale[1]: return self._logticks(*args) else: attr = {'numticks': self._ySpec} return self._ticks(*args, **attr) def _logticks(self, lower, upper): #lower,upper = map(_Numeric.log10,[lower,upper]) #print 'logticks',lower,upper ticks = [] mag = _Numeric.power(10,_Numeric.floor(lower)) if upper-lower > 6: t = _Numeric.power(10,_Numeric.ceil(lower)) base = _Numeric.power(10,_Numeric.floor((upper-lower)/6)) def inc(t): return t*base-t else: t = _Numeric.ceil(_Numeric.power(10,lower)/mag)*mag def inc(t): return 10**int(_Numeric.floor(_Numeric.log10(t)+1e-16)) majortick = int(_Numeric.log10(mag)) while t <= pow(10,upper): if majortick != int(_Numeric.floor(_Numeric.log10(t)+1e-16)): majortick = int(_Numeric.floor(_Numeric.log10(t)+1e-16)) ticklabel = '1e%d'%majortick else: if upper-lower < 2: minortick = int(t/pow(10,majortick)+.5) ticklabel = '%de%d'%(minortick,majortick) else: ticklabel = '' ticks.append((_Numeric.log10(t), ticklabel)) t += inc(t) if len(ticks) == 0: ticks = [(0,'')] return ticks def _ticks(self, lower, upper, numticks=None): if isinstance(numticks, (float, int)): ideal = (upper-lower)/float(numticks) else: ideal = (upper-lower)/7. log = _Numeric.log10(ideal) power = _Numeric.floor(log) if isinstance(numticks, (float, int)): grid = ideal else: fraction = log-power factor = 1. error = fraction for f, lf in self._multiples: e = _Numeric.fabs(fraction-lf) if e < error: error = e factor = f grid = factor * 10.**power if self._useScientificNotation and (power > 4 or power < -4): format = '%+7.1e' else: if ideal > int(ideal): fdigits = len(str(round(ideal, 4)).split('.')[-1][:4].rstrip('0')) else: fdigits = 0 if power >= 0: digits = max(1, int(power)) format = '%' + `digits`+'.'+`fdigits`+'f' else: digits = -int(power) format = '%'+`digits+2`+'.'+`fdigits`+'f' ticks = [] t = -grid*_Numeric.floor(-lower/grid) while t <= upper: if t == -0: t = 0 ticks.append( (t, format % (t,)) ) t = t + grid return ticks _multiples = [(2., _Numeric.log10(2.)), (5., _Numeric.log10(5.))] def _adjustScrollbars(self): if self._sb_ignore: self._sb_ignore = False return if not self.GetShowScrollbars(): return self._adjustingSB = True needScrollbars = False # horizontal scrollbar r_current = self._getXCurrentRange() r_max = list(self._getXMaxRange()) sbfullrange = float(self.sb_hor.GetRange()) r_max[0] = min(r_max[0],r_current[0]) r_max[1] = max(r_max[1],r_current[1]) self._sb_xfullrange = r_max unit = (r_max[1]-r_max[0])/float(self.sb_hor.GetRange()) pos = int((r_current[0]-r_max[0])/unit) if pos >= 0: pagesize = int((r_current[1]-r_current[0])/unit) self.sb_hor.SetScrollbar(pos, pagesize, sbfullrange, pagesize) self._sb_xunit = unit needScrollbars = needScrollbars or (pagesize != sbfullrange) else: self.sb_hor.SetScrollbar(0, 1000, 1000, 1000) # vertical scrollbar r_current = self._getYCurrentRange() r_max = list(self._getYMaxRange()) sbfullrange = float(self.sb_vert.GetRange()) r_max[0] = min(r_max[0],r_current[0]) r_max[1] = max(r_max[1],r_current[1]) self._sb_yfullrange = r_max unit = (r_max[1]-r_max[0])/sbfullrange pos = int((r_current[0]-r_max[0])/unit) if pos >= 0: pagesize = int((r_current[1]-r_current[0])/unit) pos = (sbfullrange-1-pos-pagesize) self.sb_vert.SetScrollbar(pos, pagesize, sbfullrange, pagesize) self._sb_yunit = unit needScrollbars = needScrollbars or (pagesize != sbfullrange) else: self.sb_vert.SetScrollbar(0, 1000, 1000, 1000) self.SetShowScrollbars(needScrollbars) self._adjustingSB = False #------------------------------------------------------------------------------- # Used to layout the printer page class PlotPrintout(wx.Printout): """Controls how the plot is made in printing and previewing""" # Do not change method names in this class, # we have to override wx.Printout methods here! def __init__(self, graph): """graph is instance of plotCanvas to be printed or previewed""" wx.Printout.__init__(self) self.graph = graph def HasPage(self, page): if page == 1: return True else: return False def GetPageInfo(self): return (1, 1, 1, 1) # disable page numbers def OnPrintPage(self, page): dc = self.GetDC() # allows using floats for certain functions ## print "PPI Printer",self.GetPPIPrinter() ## print "PPI Screen", self.GetPPIScreen() ## print "DC GetSize", dc.GetSize() ## print "GetPageSizePixels", self.GetPageSizePixels() # Note PPIScreen does not give the correct number # Calulate everything for printer and then scale for preview PPIPrinter= self.GetPPIPrinter() # printer dots/inch (w,h) #PPIScreen= self.GetPPIScreen() # screen dots/inch (w,h) dcSize= dc.GetSize() # DC size if self.graph._antiAliasingEnabled and not isinstance(dc, wx.GCDC): try: dc = wx.GCDC(dc) except Exception, exception: pass else: if self.graph._hiResEnabled: dc.SetMapMode(wx.MM_TWIPS) # high precision - each logical unit is 1/20 of a point pageSize= self.GetPageSizePixels() # page size in terms of pixcels clientDcSize= self.graph.GetClientSize() # find what the margins are (mm) margLeftSize,margTopSize= self.graph.pageSetupData.GetMarginTopLeft() margRightSize, margBottomSize= self.graph.pageSetupData.GetMarginBottomRight() # calculate offset and scale for dc pixLeft= margLeftSize*PPIPrinter[0]/25.4 # mm*(dots/in)/(mm/in) pixRight= margRightSize*PPIPrinter[0]/25.4 pixTop= margTopSize*PPIPrinter[1]/25.4 pixBottom= margBottomSize*PPIPrinter[1]/25.4 plotAreaW= pageSize[0]-(pixLeft+pixRight) plotAreaH= pageSize[1]-(pixTop+pixBottom) # ratio offset and scale to screen size if preview if self.IsPreview(): ratioW= float(dcSize[0])/pageSize[0] ratioH= float(dcSize[1])/pageSize[1] pixLeft *= ratioW pixTop *= ratioH plotAreaW *= ratioW plotAreaH *= ratioH # rescale plot to page or preview plot area self.graph._setSize(plotAreaW,plotAreaH) # Set offset and scale dc.SetDeviceOrigin(pixLeft,pixTop) # Thicken up pens and increase marker size for printing ratioW= float(plotAreaW)/clientDcSize[0] ratioH= float(plotAreaH)/clientDcSize[1] aveScale= (ratioW+ratioH)/2 if self.graph._antiAliasingEnabled and not self.IsPreview(): scale = dc.GetUserScale() dc.SetUserScale(scale[0] / self.graph._pointSize[0], scale[1] / self.graph._pointSize[1]) self.graph._setPrinterScale(aveScale) # tickens up pens for printing self.graph._printDraw(dc) # rescale back to original self.graph._setSize() self.graph._setPrinterScale(1) self.graph.Redraw() #to get point label scale and shift correct return True #---------------------------------------------------------------------- try: from embeddedimage import PyEmbeddedImage except ImportError: from wx.lib.embeddedimage import PyEmbeddedImage MagPlus = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABHNCSVQICAgIfAhkiAAAAOFJ" "REFUeJy1VdEOxCAIo27//8XbuKfuPASGZ0Zisoi2FJABbZM3bY8c13lo5GvbjioBPAUEB0Yc" "VZ0iGRRc56Ee8DcikEgrJD8EFpzRegQASiRtBtzuA0hrdRPYQxaEKyJPG6IHyiK3xnNZvUSS" "NvUuzgYh0il4y14nCFPk5XgmNbRbQbVotGo9msj47G3UXJ7fuz8Q8FAGEu0/PbZh2D3NoshU" "1VUydBGVZKMimlGeErdNGUmf/x7YpjMjcf8HVYvS2adr6aFVlCy/5Ijk9q8SeCR9isJR8SeJ" "8pv7S0Wu2Acr0qdj3w7DRAAAAABJRU5ErkJggg==") GrabHand = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABHNCSVQICAgIfAhkiAAAARFJ" "REFUeJy1VdESgzAIS2j//4s3s5fRQ6Rad5M7H0oxCZhWSpK1TjwUBCBJAIBItL1fijlfe1yJ" "8noCGC9KgrXO7f0SyZEDAF/H2opsAHv9V/548nplT5Jo7YAFQKQ1RMWzmHUS96suqdBrHkuV" "uxpdJjCS8CfGXWdJ2glzcquKSR5c46QOtCpgNyIHj6oieAXg3282QvMX45hy8a8H0VonJZUO" "clesjOPg/dhBTq64o1Kacz4Ri2x5RKsf8+wcWQaJJL+A+xRcZHeQeBKjK+5EFiVJ4xy4x2Mn" "1Vk4U5/DWmfPieiqbye7a3tV/cCsWKu76K76KUFFchVnhigJ/hmktelm/m3e3b8k+Ec8PqLH" "CT4JRfyK9o1xYwAAAABJRU5ErkJggg==") Hand = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABHNCSVQICAgIfAhkiAAAARBJ" "REFUeJytluECwiAIhDn1/Z942/UnjCGoq+6XNeWDC1xAqbKr6zyo61Ibds60J8GBT0yS3IEM" "ABuIpJTa4IOLiAAQksuKyixLH1ShHgTgZl8KiALxOsODPoEMkgJ25Su6zoO3ZrjRnI96OLIq" "k7dsqOCboDa4XV/nwQEQVeFtmMnvbSJja+oagKBUaLn9hzd7VipRa9ostIv0O1uhzzaqNJxk" "hViwDVxqg51kksMg9r2rDDIFwHCap130FBhdMzeAfWg//6Ki5WWQrHSv6EIUeVs0g3wT3J7r" "FmWQp/JJDXeRh2TXcJa91zAH2uN2mvXFsrIrsjS8rnftWmWfAiLIStuD9m9h9belvzgS/1fP" "X7075IwDENteAAAAAElFTkSuQmCC") #--------------------------------------------------------------------------- # if running standalone... # # ...a sample implementation using the above # def _draw1Objects(): # 100 points sin function, plotted as green circles data1 = 2.*_Numeric.pi*_Numeric.arange(200)/200. data1.shape = (100, 2) data1[:,1] = _Numeric.sin(data1[:,0]) markers1 = PolyMarker(data1, legend='Green Markers', colour='green', marker='circle',size=1) # 50 points cos function, plotted as red line data1 = 2.*_Numeric.pi*_Numeric.arange(100)/100. data1.shape = (50,2) data1[:,1] = _Numeric.cos(data1[:,0]) lines = PolySpline(data1, legend= 'Red Line', colour='red') # A few more points... pi = _Numeric.pi markers2 = PolyMarker([(0., 0.), (pi/4., 1.), (pi/2, 0.), (3.*pi/4., -1)], legend='Cross Legend', colour='blue', marker='cross') return PlotGraphics([markers1, lines, markers2],"Graph Title", "X Axis", "Y Axis") def _draw2Objects(): # 100 points sin function, plotted as green dots data1 = 2.*_Numeric.pi*_Numeric.arange(200)/200. data1.shape = (100, 2) data1[:,1] = _Numeric.sin(data1[:,0]) line1 = PolySpline(data1, legend='Green Line', colour='green', width=6, style=wx.DOT) # 50 points cos function, plotted as red dot-dash data1 = 2.*_Numeric.pi*_Numeric.arange(100)/100. data1.shape = (50,2) data1[:,1] = _Numeric.cos(data1[:,0]) line2 = PolySpline(data1, legend='Red Line', colour='red', width=3, style= wx.DOT_DASH) # A few more points... pi = _Numeric.pi markers1 = PolyMarker([(0., 0.), (pi/4., 1.), (pi/2, 0.), (3.*pi/4., -1)], legend='Cross Hatch Square', colour='blue', width= 3, size= 6, fillcolour= 'red', fillstyle= wx.CROSSDIAG_HATCH, marker='square') return PlotGraphics([markers1, line1, line2], "Big Markers with Different Line Styles") def _draw3Objects(): markerList= ['circle', 'dot', 'square', 'triangle', 'triangle_down', 'cross', 'plus', 'circle'] m=[] for i in range(len(markerList)): m.append(PolyMarker([(2*i+.5,i+.5)], legend=markerList[i], colour='blue', marker=markerList[i])) return PlotGraphics(m, "Selection of Markers", "Minimal Axis", "No Axis") def _draw4Objects(): # 25,000 point line data1 = _Numeric.arange(5e5,1e6,10) data1.shape = (25000, 2) line1 = PolyLine(data1, legend='Wide Line', colour='green', width=5) # A few more points... markers2 = PolyMarker(data1, legend='Square', colour='blue', marker='square') return PlotGraphics([line1, markers2], "25,000 Points", "Value X", "") def _draw5Objects(): # Empty graph with axis defined but no points/lines points=[] line1 = PolyLine(points, legend='Wide Line', colour='green', width=5) return PlotGraphics([line1], "Empty Plot With Just Axes", "Value X", "Value Y") def _draw6Objects(): # Bar graph points1=[(1,0), (1,10)] line1 = PolyLine(points1, colour='green', legend='Feb.', width=10) points1g=[(2,0), (2,4)] line1g = PolyLine(points1g, colour='red', legend='Mar.', width=10) points1b=[(3,0), (3,6)] line1b = PolyLine(points1b, colour='blue', legend='Apr.', width=10) points2=[(4,0), (4,12)] line2 = PolyLine(points2, colour='Yellow', legend='May', width=10) points2g=[(5,0), (5,8)] line2g = PolyLine(points2g, colour='orange', legend='June', width=10) points2b=[(6,0), (6,4)] line2b = PolyLine(points2b, colour='brown', legend='July', width=10) return PlotGraphics([line1, line1g, line1b, line2, line2g, line2b], "Bar Graph - (Turn on Grid, Legend)", "Months", "Number of Students") def _draw7Objects(): # Empty graph with axis defined but no points/lines x = _Numeric.arange(1,1000,1) y1 = 4.5*x**2 y2 = 2.2*x**3 points1 = _Numeric.transpose([x,y1]) points2 = _Numeric.transpose([x,y2]) line1 = PolyLine(points1, legend='quadratic', colour='blue', width=1) line2 = PolyLine(points2, legend='cubic', colour='red', width=1) return PlotGraphics([line1,line2], "double log plot", "Value X", "Value Y") class TestFrame(wx.Frame): def __init__(self, parent, id, title): wx.Frame.__init__(self, parent, id, title, wx.DefaultPosition, (600, 400)) # Now Create the menu bar and items self.mainmenu = wx.MenuBar() menu = wx.Menu() menu.Append(200, 'Page Setup...', 'Setup the printer page') self.Bind(wx.EVT_MENU, self.OnFilePageSetup, id=200) menu.Append(201, 'Print Preview...', 'Show the current plot on page') self.Bind(wx.EVT_MENU, self.OnFilePrintPreview, id=201) menu.Append(202, 'Print...', 'Print the current plot') self.Bind(wx.EVT_MENU, self.OnFilePrint, id=202) menu.Append(203, 'Save Plot...', 'Save current plot') self.Bind(wx.EVT_MENU, self.OnSaveFile, id=203) menu.Append(205, 'E&xit', 'Enough of this already!') self.Bind(wx.EVT_MENU, self.OnFileExit, id=205) self.mainmenu.Append(menu, '&File') menu = wx.Menu() menu.Append(206, 'Draw1', 'Draw plots1') self.Bind(wx.EVT_MENU,self.OnPlotDraw1, id=206) menu.Append(207, 'Draw2', 'Draw plots2') self.Bind(wx.EVT_MENU,self.OnPlotDraw2, id=207) menu.Append(208, 'Draw3', 'Draw plots3') self.Bind(wx.EVT_MENU,self.OnPlotDraw3, id=208) menu.Append(209, 'Draw4', 'Draw plots4') self.Bind(wx.EVT_MENU,self.OnPlotDraw4, id=209) menu.Append(210, 'Draw5', 'Draw plots5') self.Bind(wx.EVT_MENU,self.OnPlotDraw5, id=210) menu.Append(260, 'Draw6', 'Draw plots6') self.Bind(wx.EVT_MENU,self.OnPlotDraw6, id=260) menu.Append(261, 'Draw7', 'Draw plots7') self.Bind(wx.EVT_MENU,self.OnPlotDraw7, id=261) menu.Append(211, '&Redraw', 'Redraw plots') self.Bind(wx.EVT_MENU,self.OnPlotRedraw, id=211) menu.Append(212, '&Clear', 'Clear canvas') self.Bind(wx.EVT_MENU,self.OnPlotClear, id=212) menu.Append(213, '&Scale', 'Scale canvas') self.Bind(wx.EVT_MENU,self.OnPlotScale, id=213) menu.Append(214, 'Enable &Zoom', 'Enable Mouse Zoom', kind=wx.ITEM_CHECK) self.Bind(wx.EVT_MENU,self.OnEnableZoom, id=214) menu.Append(215, 'Enable &Grid', 'Turn on Grid', kind=wx.ITEM_CHECK) self.Bind(wx.EVT_MENU,self.OnEnableGrid, id=215) menu.Append(217, 'Enable &Drag', 'Activates dragging mode', kind=wx.ITEM_CHECK) self.Bind(wx.EVT_MENU,self.OnEnableDrag, id=217) menu.Append(220, 'Enable &Legend', 'Turn on Legend', kind=wx.ITEM_CHECK) self.Bind(wx.EVT_MENU,self.OnEnableLegend, id=220) menu.Append(222, 'Enable &Point Label', 'Show Closest Point', kind=wx.ITEM_CHECK) self.Bind(wx.EVT_MENU,self.OnEnablePointLabel, id=222) menu.Append(223, 'Enable &Anti-Aliasing', 'Smooth output', kind=wx.ITEM_CHECK) self.Bind(wx.EVT_MENU,self.OnEnableAntiAliasing, id=223) menu.Append(224, 'Enable &High-Resolution AA', 'Draw in higher resolution', kind=wx.ITEM_CHECK) self.Bind(wx.EVT_MENU,self.OnEnableHiRes, id=224) menu.Append(226, 'Enable Center Lines', 'Draw center lines', kind=wx.ITEM_CHECK) self.Bind(wx.EVT_MENU,self.OnEnableCenterLines, id=226) menu.Append(227, 'Enable Diagonal Lines', 'Draw diagonal lines', kind=wx.ITEM_CHECK) self.Bind(wx.EVT_MENU,self.OnEnableDiagonals, id=227) menu.Append(231, 'Set Gray Background', 'Change background colour to gray') self.Bind(wx.EVT_MENU,self.OnBackgroundGray, id=231) menu.Append(232, 'Set &White Background', 'Change background colour to white') self.Bind(wx.EVT_MENU,self.OnBackgroundWhite, id=232) menu.Append(233, 'Set Red Label Text', 'Change label text colour to red') self.Bind(wx.EVT_MENU,self.OnForegroundRed, id=233) menu.Append(234, 'Set &Black Label Text', 'Change label text colour to black') self.Bind(wx.EVT_MENU,self.OnForegroundBlack, id=234) menu.Append(225, 'Scroll Up 1', 'Move View Up 1 Unit') self.Bind(wx.EVT_MENU,self.OnScrUp, id=225) menu.Append(230, 'Scroll Rt 2', 'Move View Right 2 Units') self.Bind(wx.EVT_MENU,self.OnScrRt, id=230) menu.Append(235, '&Plot Reset', 'Reset to original plot') self.Bind(wx.EVT_MENU,self.OnReset, id=235) self.mainmenu.Append(menu, '&Plot') menu = wx.Menu() menu.Append(300, '&About', 'About this thing...') self.Bind(wx.EVT_MENU, self.OnHelpAbout, id=300) self.mainmenu.Append(menu, '&Help') self.SetMenuBar(self.mainmenu) # A status bar to tell people what's happening self.CreateStatusBar(1) self.client = PlotCanvas(self) #define the function for drawing pointLabels self.client.SetPointLabelFunc(self.DrawPointLabel) # Create mouse event for showing cursor coords in status bar self.client.canvas.Bind(wx.EVT_LEFT_DOWN, self.OnMouseLeftDown) # Show closest point when enabled self.client.canvas.Bind(wx.EVT_MOTION, self.OnMotion) self.Show(True) def DrawPointLabel(self, dc, mDataDict): """This is the fuction that defines how the pointLabels are plotted dc - DC that will be passed mDataDict - Dictionary of data that you want to use for the pointLabel As an example I have decided I want a box at the curve point with some text information about the curve plotted below. Any wxDC method can be used. """ # ---------- dc.SetPen(wx.Pen(wx.BLACK)) dc.SetBrush(wx.Brush( wx.BLACK, wx.SOLID ) ) sx, sy = mDataDict["scaledXY"] #scaled x,y of closest point dc.DrawRectangle( sx-5,sy-5, 10, 10) #10by10 square centered on point px,py = mDataDict["pointXY"] cNum = mDataDict["curveNum"] pntIn = mDataDict["pIndex"] legend = mDataDict["legend"] #make a string to display s = "Crv# %i, '%s', Pt. (%.2f,%.2f), PtInd %i" %(cNum, legend, px, py, pntIn) dc.DrawText(s, sx , sy+1) # ----------- def OnMouseLeftDown(self,event): s= "Left Mouse Down at Point: (%.4f, %.4f)" % self.client._getXY(event) self.SetStatusText(s) event.Skip() #allows plotCanvas OnMouseLeftDown to be called def OnMotion(self, event): #show closest point (when enbled) if self.client.GetEnablePointLabel() == True: #make up dict with info for the pointLabel #I've decided to mark the closest point on the closest curve dlst= self.client.GetClosestPoint( self.client._getXY(event), pointScaled= True) if dlst != []: #returns [] if none curveNum, legend, pIndex, pointXY, scaledXY, distance = dlst #make up dictionary to pass to my user function (see DrawPointLabel) mDataDict= {"curveNum":curveNum, "legend":legend, "pIndex":pIndex,\ "pointXY":pointXY, "scaledXY":scaledXY} #pass dict to update the pointLabel self.client.UpdatePointLabel(mDataDict) event.Skip() #go to next handler def OnFilePageSetup(self, event): self.client.PageSetup() def OnFilePrintPreview(self, event): self.client.PrintPreview() def OnFilePrint(self, event): self.client.Printout() def OnSaveFile(self, event): self.client.SaveFile() def OnFileExit(self, event): self.Close() def OnPlotDraw1(self, event): self.resetDefaults() self.client.Draw(_draw1Objects()) def OnPlotDraw2(self, event): self.resetDefaults() self.client.Draw(_draw2Objects()) def OnPlotDraw3(self, event): self.resetDefaults() self.client.SetFont(wx.Font(10,wx.SCRIPT,wx.NORMAL,wx.NORMAL)) self.client.SetFontSizeAxis(20) self.client.SetFontSizeLegend(12) self.client.SetXSpec('min') self.client.SetYSpec('none') self.client.Draw(_draw3Objects()) def OnPlotDraw4(self, event): self.resetDefaults() drawObj= _draw4Objects() self.client.Draw(drawObj) ## # profile ## start = _time.clock() ## for x in range(10): ## self.client.Draw(drawObj) ## print "10 plots of Draw4 took: %f sec."%(_time.clock() - start) ## # profile end def OnPlotDraw5(self, event): # Empty plot with just axes self.resetDefaults() drawObj= _draw5Objects() # make the axis X= (0,5), Y=(0,10) # (default with None is X= (-1,1), Y= (-1,1)) self.client.Draw(drawObj, xAxis= (0,5), yAxis= (0,10)) def OnPlotDraw6(self, event): #Bar Graph Example self.resetDefaults() #self.client.SetEnableLegend(True) #turn on Legend #self.client.SetEnableGrid(True) #turn on Grid self.client.SetXSpec('none') #turns off x-axis scale self.client.SetYSpec('auto') self.client.Draw(_draw6Objects(), xAxis= (0,7)) def OnPlotDraw7(self, event): #log scale example self.resetDefaults() self.client.setLogScale((True,True)) self.client.Draw(_draw7Objects()) def OnPlotRedraw(self,event): self.client.Redraw() def OnPlotClear(self,event): self.client.Clear() def OnPlotScale(self, event): if self.client.last_draw != None: graphics, xAxis, yAxis= self.client.last_draw self.client.Draw(graphics,(1,3.05),(0,1)) def OnEnableZoom(self, event): self.client.SetEnableZoom(event.IsChecked()) self.mainmenu.Check(217, not event.IsChecked()) def OnEnableGrid(self, event): self.client.SetEnableGrid(event.IsChecked()) def OnEnableDrag(self, event): self.client.SetEnableDrag(event.IsChecked()) self.mainmenu.Check(214, not event.IsChecked()) def OnEnableLegend(self, event): self.client.SetEnableLegend(event.IsChecked()) def OnEnablePointLabel(self, event): self.client.SetEnablePointLabel(event.IsChecked()) def OnEnableAntiAliasing(self, event): self.client.SetEnableAntiAliasing(event.IsChecked()) def OnEnableHiRes(self, event): self.client.SetEnableHiRes(event.IsChecked()) def OnEnableCenterLines(self, event): self.client.SetEnableCenterLines(event.IsChecked()) def OnEnableDiagonals(self, event): self.client.SetEnableDiagonals(event.IsChecked()) def OnBackgroundGray(self, event): self.client.SetBackgroundColour("#CCCCCC") self.client.Redraw() def OnBackgroundWhite(self, event): self.client.SetBackgroundColour("white") self.client.Redraw() def OnForegroundRed(self, event): self.client.SetForegroundColour("red") self.client.Redraw() def OnForegroundBlack(self, event): self.client.SetForegroundColour("black") self.client.Redraw() def OnScrUp(self, event): self.client.ScrollUp(1) def OnScrRt(self,event): self.client.ScrollRight(2) def OnReset(self,event): self.client.Reset() def OnHelpAbout(self, event): from wx.lib.dialogs import ScrolledMessageDialog about = ScrolledMessageDialog(self, __doc__, "About...") about.ShowModal() def resetDefaults(self): """Just to reset the fonts back to the PlotCanvas defaults""" self.client.SetFont(wx.Font(10,wx.SWISS,wx.NORMAL,wx.NORMAL)) self.client.SetFontSizeAxis(10) self.client.SetFontSizeLegend(7) self.client.setLogScale((False,False)) self.client.SetXSpec('auto') self.client.SetYSpec('auto') def __test(): class MyApp(wx.App): def OnInit(self): wx.InitAllImageHandlers() frame = TestFrame(None, -1, "PlotCanvas") #frame.Show(True) self.SetTopWindow(frame) return True app = MyApp(0) app.MainLoop() if __name__ == '__main__': __test() DisplayCAL-3.1.0.0/DisplayCAL/wxfixes.py0000644000076500000000000011343012647526531017503 0ustar devwheel00000000000000# -*- coding: utf-8 -*- import os import re import shutil import sys import tempfile from meta import name as appname, wx_minversion # wxversion will be removed in Phoenix try: import wxversion except ImportError: pass else: if not getattr(sys, "frozen", False): wxversion.ensureMinimal("%i.%i" % wx_minversion[:2]) import wx if wx.VERSION < wx_minversion: app = wx.PySimpleApp() result = wx.MessageBox("This application requires a version of wxPython " "greater than or equal to %s, but your most recent " "version is %s.\n\n" "Would you like to download a new version of wxPython?\n" % (".".join(str(n) for n in wx_minversion), wx.__version__), "wxPython Upgrade Needed", style=wx.YES_NO) if result == wx.YES: import webbrowser webbrowser.open("http://wxpython.org/") app.MainLoop() sys.exit() import wx.grid from wx.lib.buttons import GenBitmapButton as _GenBitmapButton from wx.lib.buttons import ThemedGenButton as _ThemedGenButton from wx.lib.buttons import GenBitmapTextButton as _GenBitmapTextButton from wx.lib import platebtn from wx import xrc from util_str import safe_str if not hasattr(platebtn, "PB_STYLE_TOGGLE"): platebtn.PB_STYLE_TOGGLE = 32 if not hasattr(platebtn, "PB_STYLE_DROPARROW"): platebtn.PB_STYLE_DROPARROW = 16 if u"phoenix" in wx.PlatformInfo: # Phoenix compatibility from wx.lib.agw import aui from wx.lib import embeddedimage import wx.adv # Deprecated items wx.DEFAULT = wx.FONTFAMILY_DEFAULT wx.DECORATIVE = wx.FONTFAMILY_DECORATIVE wx.ROMAN = wx.FONTFAMILY_ROMAN wx.SCRIPT = wx.FONTFAMILY_SCRIPT wx.SWISS = wx.FONTFAMILY_SWISS wx.MODERN = wx.FONTFAMILY_MODERN wx.TELETYPE = wx.FONTFAMILY_TELETYPE wx.NORMAL = wx.FONTWEIGHT_NORMAL | wx.FONTSTYLE_NORMAL wx.LIGHT = wx.FONTWEIGHT_LIGHT wx.BOLD = wx.FONTWEIGHT_BOLD wx.ITALIC = wx.FONTSTYLE_ITALIC wx.SLANT = wx.FONTSTYLE_SLANT wx.SOLID = wx.PENSTYLE_SOLID | wx.BRUSHSTYLE_SOLID wx.DOT = wx.PENSTYLE_DOT wx.LONG_DASH = wx.PENSTYLE_LONG_DASH wx.SHORT_DASH = wx.PENSTYLE_SHORT_DASH wx.DOT_DASH = wx.PENSTYLE_DOT_DASH wx.USER_DASH = wx.PENSTYLE_USER_DASH wx.TRANSPARENT = wx.PENSTYLE_TRANSPARENT | wx.BRUSHSTYLE_TRANSPARENT wx.STIPPLE_MASK_OPAQUE = wx.BRUSHSTYLE_STIPPLE_MASK_OPAQUE wx.STIPPLE_MASK = wx.BRUSHSTYLE_STIPPLE_MASK wx.STIPPLE = wx.BRUSHSTYLE_STIPPLE wx.BDIAGONAL_HATCH = wx.BRUSHSTYLE_BDIAGONAL_HATCH wx.CROSSDIAG_HATCH = wx.BRUSHSTYLE_CROSSDIAG_HATCH wx.FDIAGONAL_HATCH = wx.BRUSHSTYLE_FDIAGONAL_HATCH wx.CROSS_HATCH = wx.BRUSHSTYLE_CROSS_HATCH wx.HORIZONTAL_HATCH = wx.BRUSHSTYLE_HORIZONTAL_HATCH wx.VERTICAL_HATCH = wx.BRUSHSTYLE_VERTICAL_HATCH embeddedimage.PyEmbeddedImage.getBitmap = embeddedimage.PyEmbeddedImage.GetBitmap wx.CursorFromImage = wx.Cursor wx.EmptyBitmap = wx.Bitmap wx.EmptyIcon = wx.Icon wx.ImageFromStream = wx.Image wx.ListCtrl.InsertStringItem = lambda self, index, label: self.InsertItem(index, label) wx.ListCtrl.SetStringItem = lambda self, index, col, label: self.SetItem(index, col, label) wx.Menu.RemoveItem = lambda self, item: self.Remove(item) wx.NamedColour = wx.Colour wx.PyControl = wx.Control wx.PyWindow = wx.Window wx.PyPanel = wx.Panel wx.StockCursor = wx.Cursor wx.Window.SetToolTipString = wx.Window.SetToolTip # Moved items wx.HL_DEFAULT_STYLE = wx.adv.HL_DEFAULT_STYLE wx.HyperlinkCtrl = wx.adv.HyperlinkCtrl wx.HyperlinkCtrlNameStr = wx.adv.HyperlinkCtrlNameStr wx.SOUND_ASYNC = wx.adv.SOUND_ASYNC wx.Sound = wx.adv.Sound # Removed items wx.DC.BeginDrawing = lambda self: None wx.DC.DrawRectangleRect = lambda dc, rect: dc.DrawRectangle(rect) wx.DC.DrawRoundedRectangleRect = lambda dc, rect, radius: dc.DrawRoundedRectangle(rect, radius) wx.DC.EndDrawing = lambda self: None def ContainsRect(self, *args): if len(args) > 1: rect = wx.Rect(*args) else: rect = args[0] return self.Contains(rect) wx.Rect.ContainsRect = ContainsRect wx.Rect.ContainsXY = lambda self, x, y: self.Contains((x, y)) wx.RectPS = wx.Rect wx.RegionFromBitmap = wx.Region def GetItemIndex(self, window): for index, sizeritem in enumerate(self.Children): if sizeritem.Window == window: return index wx.Sizer.GetItemIndex = GetItemIndex wx.TopLevelWindow.Restore = lambda self: self.Iconize(False) # Renamed items wx.OPEN = wx.FD_OPEN wx.OVERWRITE_PROMPT = wx.FD_OVERWRITE_PROMPT wx.SAVE = wx.FD_SAVE wx.SystemSettings_GetColour = wx.SystemSettings.GetColour wx.SystemSettings_GetFont = wx.SystemSettings.GetFont wx.SystemSettings_GetMetric = wx.SystemSettings.GetMetric wx.grid.EVT_GRID_CELL_CHANGE = wx.grid.EVT_GRID_CELL_CHANGED wx.grid.Grid.wxGridSelectRows = wx.grid.Grid.GridSelectRows wx.grid.PyGridCellEditor = wx.grid.GridCellEditor wx.grid.PyGridCellRenderer = wx.grid.GridCellRenderer wx.RegionFromBitmapColour = wx.Region # Bugfixes if not hasattr(wx.grid.GridEvent, "CmdDown"): # This may be a bug in the current development version of Phoenix wx.grid.GridEvent.CmdDown = lambda self: False # Not sure if this is a bug, but the PositionToXY signature differs from # current Phoenix docs. Actual return value is a 3-tuple, not a 2-tuple: # (bool inrange, int col, int line) PositionToXY = wx.TextCtrl.PositionToXY wx.TextCtrl.PositionToXY = lambda self, pos: PositionToXY(self, pos)[1:] def TabFrame__init__(self, parent): pre = wx.Window.__init__(self) self._tabs = None self._rect = wx.Rect(0, 0, 200, 200) self._tab_ctrl_height = 20 self._tab_rect = wx.Rect() self._parent = parent # With Phoenix, the TabFrame is unintentionally visible in the top left # corner (horizontal and vertical lines with a length of 20px each that # are lighter than the border color if tabs are at the top, or a # 20x20px square if tabs are at the bottom). Setting its size to 0, 0 # prevents this. Also see https://github.com/RobinD42/Phoenix/pull/91 self.Create(parent, size=(0, 0)) aui.TabFrame.__init__ = TabFrame__init__ wx._ListCtrl = wx.ListCtrl wx._SpinCtrl = wx.SpinCtrl wx._StaticText = wx.StaticText if "gtk3" in wx.PlatformInfo: # GTK3 fixes from wx import dataview DataViewListCtrl = dataview.DataViewListCtrl class ListCtrl(DataViewListCtrl): # Implement ListCtrl as DataViewListCtrl # Works around header rendering ugliness with GTK3 def __init__(self, parent, id=wx.ID_ANY, pos=wx.DefaultPosition, size=wx.DefaultSize, style=wx.LC_ICON, validator=wx.DefaultValidator, name=wx.ListCtrlNameStr): dv_style = 0 if style & wx.LC_SINGLE_SEL: dv_style |= dataview.DV_SINGLE DataViewListCtrl.__init__(self, parent, id, pos, size, dv_style, validator) self.Name = name self._columns = {} self._items = {} self.Bind(dataview.EVT_DATAVIEW_SELECTION_CHANGED, self.OnEvent) self.Bind(dataview.EVT_DATAVIEW_ITEM_ACTIVATED, self.OnEvent) def OnEvent(self, event): typeId = event.GetEventType() if typeId == dataview.EVT_DATAVIEW_SELECTION_CHANGED.typeId: if self.GetSelectedRow() != wx.NOT_FOUND: typeId = wx.EVT_LIST_ITEM_SELECTED.typeId else: typeId = wx.EVT_LIST_ITEM_DESELECTED.typeId event = wx.ListEvent(typeId, self.Id) elif typeId == dataview.EVT_DATAVIEW_ITEM_ACTIVATED.typeId: event = wx.ListEvent(wx.EVT_LIST_ITEM_ACTIVATED.typeId, self.Id) event.SetEventObject(self) self.GetEventHandler().ProcessEvent(event) def InsertColumn(self, pos, col): self._columns[pos] = col def SetColumnWidth(self, pos, width): self.AppendTextColumn(self._columns[pos], width=width) def InsertStringItem(self, row, label): self._items[row] = [] return row def SetStringItem(self, row, col, label): self._items[row].append(label) if len(self._items[row]) == len(self._columns): # Row complete DataViewListCtrl.InsertItem(self, row, self._items[row]) def GetItem(self, row, col=0): item = self.RowToItem(row) item.GetId = lambda: row item.GetText = lambda: self.GetTextValue(row, col) return item def SetItemState(self, row, state, stateMask): if state == stateMask == wx.LIST_STATE_SELECTED: self.SelectRow(row) else: raise NotImplementedError("SetItemState is only implemented for " "selecting a single row") def GetNextItem(self, row, geometry=wx.LIST_NEXT_ALL, state=wx.LIST_STATE_DONTCARE): if (row == -1 and geometry == wx.LIST_NEXT_ALL and state == wx.LIST_STATE_SELECTED): return self.GetSelectedRow() else: raise NotImplementedError("GetNextItem is only implemented for " "returning the selected row") def GetItemCount(self): return len(self._items) GetFirstSelected = DataViewListCtrl.__dict__["GetSelectedRow"] def GetItemState(self, row, stateMask): if stateMask == wx.LIST_STATE_SELECTED: if self.GetSelectedRow() == row: return wx.LIST_STATE_SELECTED else: return 0 else: raise NotImplementedError("GetItemState is only implemented to " "check if a row is selected") def Select(self, row, on=1): if on: self.SelectRow(row) else: self.UnselectRow(row) wx.ListCtrl = ListCtrl class SpinCtrl(wx._SpinCtrl): _spinwidth = 0 def __init__(self, parent, id=wx.ID_ANY, value="", pos=wx.DefaultPosition, size=wx.DefaultSize, style=wx.SP_ARROW_KEYS, min=0, max=100, initial=0, name="wxSpinCtrl"): if size[0] != -1: # Adjust initial size for GTK3 to accomodate spin buttons if not SpinCtrl._spinwidth: spin = wx.SpinCtrl(parent, -1) text = wx.TextCtrl(parent, -1) SpinCtrl._spinwidth = spin.Size[0] - text.Size[0] + 11 spin.Destroy() text.Destroy() size = size[0] + SpinCtrl._spinwidth, size[1] wx._SpinCtrl.__init__(self, parent, id, value, pos, size, style, min, max, initial, name) wx.SpinCtrl = SpinCtrl _StaticText_SetLabel = wx._StaticText.SetLabel class StaticText(wx._StaticText): def __init__(self, *args, **kwargs): wx._StaticText.__init__(self, *args, **kwargs) def SetFont(self, font): wx.Control.SetFont(self, font) self.SetLabel(self.Label) def SetLabel(self, label): # Fix GTK3 label auto-resize on label change not working if not self.WindowStyle & wx.ST_NO_AUTORESIZE: self.MaxSize = -1, -1 self.MinSize = -1, -1 _StaticText_SetLabel(self, label) if not self.WindowStyle & wx.ST_NO_AUTORESIZE: # Find widest line max_width = 0 for line in label.splitlines(): width = self.GetTextExtent(line)[0] if width > max_width: max_width = width self.Size = max_width, -1 self.MaxSize = self.Size[0], -1 def Wrap(self, width): wx._StaticText.Wrap(self, width) self.SetLabel(self.Label) Label = property(lambda self: self.GetLabel(), SetLabel) wx.StaticText = StaticText def Property(func): return property(**func()) wx.BitmapButton._SetBitmapLabel = wx.BitmapButton.SetBitmapLabel def SetBitmapLabel(self, bitmap): """ Replacement for SetBitmapLabel which avoids flickering """ if self.GetBitmapLabel() != bitmap: self._SetBitmapLabel(bitmap) wx.BitmapButton.SetBitmapLabel = SetBitmapLabel def BitmapButtonEnable(self, enable = True): """ Replacement for BitmapButton.Enable which circumvents repainting issues (bitmap does not change on button state change) """ wx.Button.Enable(self, enable) if not hasattr(self, "_bitmaplabel"): self._bitmaplabel = self.GetBitmapLabel() if not hasattr(self, "_bitmapdisabled"): self._bitmapdisabled = self.GetBitmapDisabled() if enable: if self._bitmaplabel.IsOk(): self.SetBitmapLabel(self._bitmaplabel) else: if self._bitmapdisabled.IsOk(): self.SetBitmapLabel(self._bitmapdisabled) def BitmapButtonDisable(self): """ Replacement for BitmapButton.Disable which circumvents repainting issues (bitmap does not change on button state change) """ self.Enable(False) if not u"phoenix" in wx.PlatformInfo: wx.BitmapButton.Enable = BitmapButtonEnable wx.BitmapButton.Disable = BitmapButtonDisable def FindMenuItem(self, label): """ Replacement for wx.Menu.FindItem """ label = GTKMenuItemGetFixedLabel(label) for menuitem in self.GetMenuItems(): if GTKMenuItemGetFixedLabel(menuitem.Label) == label: return menuitem.GetId() wx.Menu.FindItem = FindMenuItem def GTKMenuItemGetFixedLabel(label): if sys.platform not in ("darwin", "win32"): # The underscore is a special character under GTK, like the # ampersand on Mac OS X and Windows # Recent wxPython versions already do the right thing, but we need # this workaround for older releases if "__" in label: label = label.replace("__", "_") while label and label[0] == "_": label = label[1:] return label if not hasattr(wx.Sizer, "GetItemIndex"): def GetItemIndex(self, item): for i, child in enumerate(self.GetChildren()): if child.GetWindow() is item: return i return -1 wx.Sizer.GetItemIndex = GetItemIndex if sys.platform == "darwin": # wxMac seems to loose foreground color of StaticText # when enabled again @Property def StaticTextEnabled(): def fget(self): return self.IsEnabled() def fset(self, enable=True): self.Enable(enable) return locals() wx.StaticText.Enabled = StaticTextEnabled def StaticTextDisable(self): self.Enable(False) wx.StaticText.Disable = StaticTextDisable def StaticTextEnable(self, enable=True): enable = bool(enable) if self.Enabled is enable: return self._enabled = enable if not hasattr(self, "_fgcolor"): self._fgcolor = self.ForegroundColour color = self._fgcolor if not enable: bgcolor = self.Parent.BackgroundColour bgblend = .5 blend = .5 color = wx.Colour(int(round(bgblend * bgcolor.Red() + blend * color.Red())), int(round(bgblend * bgcolor.Green() + blend * color.Green())), int(round(bgblend * bgcolor.Blue() + blend * color.Blue()))) self.ForegroundColour = color wx.StaticText.Enable = StaticTextEnable def StaticTextIsEnabled(self): return getattr(self, "_enabled", True) wx.StaticText.IsEnabled = StaticTextIsEnabled wx.Window._SetToolTipString = wx.Window.SetToolTipString def SetToolTipString(self, string): """ Replacement for SetToolTipString which updates correctly """ wx.Window.SetToolTip(self, None) wx.Window._SetToolTipString(self, string) wx.Window.SetToolTipString = SetToolTipString wx.Sizer._Add = wx.Sizer.Add def SizerAdd(self, *args, **kwargs): from config import get_default_dpi, getcfg scale = getcfg("app.dpi") / get_default_dpi() if scale > 1: if kwargs.get("border"): kwargs["border"] = int(round(kwargs["border"] * scale)) if args and isinstance(args[0], tuple): spacer = list(args[0]) ##print spacer, '->', for i, dimension in enumerate(spacer): if dimension > 0: spacer[i] = int(round(dimension * scale)) ##print spacer args = (tuple(spacer), ) + args[1:] return self._Add(*args, **kwargs) if not u"phoenix" in wx.PlatformInfo: # Doesn't work with Phoenix wx.Sizer.Add = SizerAdd wx._GridSizer = wx.GridSizer class GridSizer(wx._GridSizer): def __init__(self, rows=0, cols=0, vgap=0, hgap=0): if vgap or hgap: from config import get_default_dpi, getcfg scale = getcfg("app.dpi") / get_default_dpi() if scale > 1: ##print vgap, hgap, '->', vgap, hgap = [int(round(v * scale)) for v in (vgap, hgap)] ##print vgap, hgap super(GridSizer, self).__init__(rows, cols, vgap, hgap) # TODO: Yet to test if this works with Phoenix wx.GridSizer = GridSizer wx._FlexGridSizer = wx.FlexGridSizer class FlexGridSizer(wx._FlexGridSizer): def __init__(self, rows=0, cols=0, vgap=0, hgap=0): if vgap or hgap: from config import get_default_dpi, getcfg scale = getcfg("app.dpi") / get_default_dpi() if scale > 1: ##print vgap, hgap, '->', vgap, hgap = [int(round(v * scale)) for v in (vgap, hgap)] ##print vgap, hgap super(FlexGridSizer, self).__init__(rows, cols, vgap, hgap) # TODO: Yet to test if this works with Phoenix wx.FlexGridSizer = FlexGridSizer def GridGetSelection(self): """ Return selected rows, cols, block and cells """ sel = [] numrows = self.GetNumberRows() numcols = self.GetNumberCols() # rows rows = self.GetSelectedRows() for row in rows: for i in xrange(numcols): sel.append((row, i)) # cols cols = self.GetSelectedCols() for col in cols: for i in xrange(numrows): sel.append((i, col)) # block tl = self.GetSelectionBlockTopLeft() br = self.GetSelectionBlockBottomRight() if tl and br: for n in xrange(min(len(tl), len(br))): for i in xrange(tl[n][0], br[n][0] + 1): # rows for j in xrange(tl[n][1], br[n][1] + 1): # cols sel.append((i, j)) # single selected cells sel.extend(self.GetSelectedCells()) sel = list(set(sel)) sel.sort() return sel wx.grid.Grid.GetSelection = GridGetSelection def adjust_font_size_for_gcdc(font): font.SetPointSize(get_gcdc_font_size(font.PointSize)) return font def get_dc_font_scale(dc): """ Get correct font scaling factor for DC """ pointsize = (1.0, 1.0) if isinstance(dc, wx.GCDC): pointsize = tuple(1.0 / scale for scale in dc.GetLogicalScale()) if sys.platform in ("darwin", "win32") or (not isinstance(dc, wx.GCDC) and not "gtk3" in wx.PlatformInfo): return sum(pointsize) / 2.0 else: # On Linux, we need to correct the font size by a certain factor if # wx.GCDC is used, to make text the same size as if wx.GCDC weren't used from config import get_default_dpi, getcfg, set_default_app_dpi set_default_app_dpi() scale = getcfg("app.dpi") / get_default_dpi() if wx.VERSION < (2, 9): # On Linux, we need to correct the font size by a certain factor if # wx.GCDC is used, to make text the same size as if wx.GCDC weren't used screenppi = map(float, wx.ScreenDC().GetPPI()) ppi = dc.GetPPI() scale *= (screenppi[0] / ppi[0] + screenppi[1] / ppi[1]) / 2.0 return (scale * pointsize[0] + scale * pointsize[1]) / 2.0 def get_dc_font_size(size, dc): """ Get correct font size for DC """ return size * get_dc_font_scale(dc) def get_gcdc_font_size(size): dc = wx.MemoryDC(wx.EmptyBitmap(1, 1)) try: dc = wx.GCDC(dc) except: pass return get_dc_font_size(size, dc) def set_bitmap_labels(btn, disabled=True, focus=True, pressed=True): bitmap = btn.BitmapLabel if not bitmap.IsOk(): size = btn.MinSize if -1 in size: size = (16, 16) bitmap = wx.ArtProvider.GetBitmap(wx.ART_MISSING_IMAGE, size=size) # Disabled if disabled: # Use Rec. 709 luma coefficients to convert to grayscale image = bitmap.ConvertToImage().ConvertToGreyscale(.2126, .7152, .0722) if image.HasMask() and not image.HasAlpha(): image.InitAlpha() if image.HasAlpha(): alphabuffer = image.GetAlphaBuffer() for i, byte in enumerate(alphabuffer): if byte > "\0": alphabuffer[i] = chr(int(round(ord(byte) * .3))) btn.SetBitmapDisabled(image.ConvertToBitmap()) # Focus/Hover if sys.platform != "darwin" and focus: # wxMac applies hover state also to disabled buttons... image = bitmap.ConvertToImage() if image.HasMask() and not image.HasAlpha(): image.InitAlpha() databuffer = image.GetDataBuffer() for i, byte in enumerate(databuffer): if byte > "\0": databuffer[i] = chr(int(round(min(ord(byte) * 1.15, 255)))) bmp = image.ConvertToBitmap() btn.SetBitmapFocus(bmp) if hasattr(btn, "SetBitmapCurrent"): # Phoenix btn.SetBitmapCurrent(bmp) else: # Classic btn.SetBitmapHover(bmp) # Selected if pressed: image = bitmap.ConvertToImage() if image.HasMask() and not image.HasAlpha(): image.InitAlpha() databuffer = image.GetDataBuffer() for i, byte in enumerate(databuffer): if byte > "\0": databuffer[i] = chr(int(round(ord(byte) * .6))) bmp = image.ConvertToBitmap() if hasattr(btn, "SetBitmapPressed"): # Phoenix btn.SetBitmapPressed(bmp) else: # Classic btn.SetBitmapSelected(bmp) # wx.DirDialog and wx.FileDialog are normally not returned by # wx.GetTopLevelWindows, do some trickery to work around _DirDialog = wx.DirDialog _FileDialog = wx.FileDialog class PathDialogBase(wx.Dialog): def __init__(self, name): wx.Dialog.__init__(self, None, -1, name=name) self._ismodal = False self._isshown = False self.Bind(wx.EVT_WINDOW_DESTROY, self.OnDestroy) def __getattr__(self, name): return getattr(self.filedialog, name) def IsModal(self): return self._ismodal def IsShown(self): return self._isshown def OnDestroy(self, event): self.filedialog.Destroy() event.Skip() def Show(self, show=True): self._isshown = show self.filedialog.Show(show) def ShowModal(self): self._isshown = True self._ismodal = True returncode = self.filedialog.ShowModal() self._ismodal = False self._isshown = False return returncode class DirDialog(PathDialogBase): def __init__(self, *args, **kwargs): PathDialogBase.__init__(self, name="dirdialog") self.filedialog = _DirDialog(*args, **kwargs) class FileDialog(PathDialogBase): def __init__(self, *args, **kwargs): PathDialogBase.__init__(self, name="filedialog") self.filedialog = _FileDialog(*args, **kwargs) wx.DirDialog = DirDialog wx.FileDialog = FileDialog wx._ScrolledWindow = wx.ScrolledWindow class ScrolledWindow(wx._ScrolledWindow): """ ScrolledWindow that scrolls child controls into view on focus. OnChildFocus and ScrollChildIntoView borrowed from wx.lib.scrolledpanel. """ def __init__(self, *args, **kwargs): wx._ScrolledWindow.__init__(self, *args, **kwargs) self.Bind(wx.EVT_CHILD_FOCUS, self.OnChildFocus) def OnChildFocus(self, evt): # If the child window that gets the focus is not visible, # this handler will try to scroll enough to see it. evt.Skip() child = evt.GetWindow() self.ScrollChildIntoView(child) def ScrollChildIntoView(self, child): """ Scrolls the panel such that the specified child window is in view. """ sppu_x, sppu_y = self.GetScrollPixelsPerUnit() vs_x, vs_y = self.GetViewStart() cr = child.GetRect() clntsz = self.GetClientSize() new_vs_x, new_vs_y = -1, -1 # is it before the left edge? if cr.x < 0 and sppu_x > 0: new_vs_x = vs_x + (cr.x / sppu_x) # is it above the top? if cr.y < 0 and sppu_y > 0: new_vs_y = vs_y + (cr.y / sppu_y) # For the right and bottom edges, scroll enough to show the # whole control if possible, but if not just scroll such that # the top/left edges are still visible # is it past the right edge ? if cr.right > clntsz.width and sppu_x > 0: diff = (cr.right - clntsz.width) / sppu_x if cr.x - diff * sppu_x > 0: new_vs_x = vs_x + diff + 1 else: new_vs_x = vs_x + (cr.x / sppu_x) # is it below the bottom ? if cr.bottom > clntsz.height and sppu_y > 0: diff = (cr.bottom - clntsz.height) / sppu_y if cr.y - diff * sppu_y > 0: new_vs_y = vs_y + diff + 1 else: new_vs_y = vs_y + (cr.y / sppu_y) # if we need to adjust if new_vs_x != -1 or new_vs_y != -1: #print "%s: (%s, %s)" % (self.GetName(), new_vs_x, new_vs_y) self.Scroll(new_vs_x, new_vs_y) wx.ScrolledWindow = ScrolledWindow class GenButton(object): """ A generic button, based on wx.lib.buttons.GenButton. Fixes wx.lib.buttons.ThemedGenButton not taking into account backgroun color when pressed. """ def __init__(self): self.bezelWidth = 2 self.hasFocus = False self.up = True self.useFocusInd = True def OnPaint(self, event): (width, height) = self.ClientSize x1 = y1 = 0 x2 = width y2 = height dc = wx.PaintDC(self) brush = self.GetBackgroundBrush(dc) if brush is not None: brush.SetColour(self.Parent.BackgroundColour) dc.SetBackground(brush) dc.Clear() self.DrawBezel(dc, x1, y1, x2, y2) self.DrawLabel(dc, width, height) if self.hasFocus and self.useFocusInd: self.DrawFocusIndicator(dc, width, height) if not "gtk3" in wx.PlatformInfo: # GTK3 doesn't respect NO_BORDER in hovered state when using wx.BitmapButton _GenBitmapButton = wx.BitmapButton class GenBitmapButton(GenButton, _GenBitmapButton): def __init__(self, *args, **kwargs): GenButton.__init__(self) _GenBitmapButton.__init__(self, *args, **kwargs) self.hover = False set_bitmap_labels(self) if _GenBitmapButton is not wx.BitmapButton: self.Bind(wx.EVT_ENTER_WINDOW, self.OnMouseEnter) self.Bind(wx.EVT_LEAVE_WINDOW, self.OnMouseLeave) @Property def BitmapFocus(): def fget(self): return self.GetBitmapFocus() def fset(self, bitmap): self.SetBitmapFocus(self, bitmap) return locals() @Property def BitmapDisabled(): def fget(self): return self.GetBitmapDisabled() def fset(self, bitmap): self.SetBitmapDisabled(self, bitmap) return locals() @Property def BitmapHover(): def fget(self): return self.GetBitmapHover() def fset(self, bitmap): self.SetBitmapHover(self, bitmap) return locals() @Property def BitmapSelected(): def fget(self): return self.GetBitmapSelected() def fset(self, bitmap): self.SetBitmapSelected(self, bitmap) return locals() @Property def BitmapLabel(): def fget(self): return self.GetBitmapLabel() def fset(self, bitmap): self.SetBitmapLabel(self, bitmap) return locals() def DrawLabel(self, dc, width, height, dx=0, dy=0): bmp = self.BitmapLabel if self.BitmapDisabled and not self.IsEnabled(): bmp = self.BitmapDisabled elif self.BitmapSelected and not self.up: bmp = self.BitmapSelected elif self.BitmapHover and self.hover: bmp = self.BitmapHover elif self.BitmapFocus and self.hasFocus: bmp = self.BitmapFocus bw, bh = bmp.GetWidth(), bmp.GetHeight() hasMask = bmp.GetMask() != None dc.DrawBitmap(bmp, (width-bw)/2+dx, (height-bh)/2+dy, hasMask) def GetBitmapHover(self): return self.bmpHover def OnMouseEnter(self, event): if not self.IsEnabled(): return if not self.hover: self.hover = True self.Refresh() event.Skip() def OnMouseLeave(self, event): if not self.IsEnabled(): return if self.hover: self.hover = False self.Refresh() event.Skip() def SetBitmapHover(self, bitmap): self.bmpHover = bitmap class ThemedGenButton(GenButton, _ThemedGenButton): """ A themed generic button, based on wx.lib.buttons.ThemedGenButton. Fixes wx.lib.buttons.ThemedGenButton sometimes not reflecting enabled state correctly as well as not taking into account background color when pressed, and mimics a default button under Windows more closely by not drawing a focus outline and not shifting the label when pressed. Also implements state for SetDefault. """ _reallyenabled = True labelDelta = 1 def __init__(self, *args, **kwargs): GenButton.__init__(self) _ThemedGenButton.__init__(self, *args, **kwargs) self._default = False def Disable(self): self.Enable(False) def DoGetBestSize(self): """ Overridden base class virtual. Determines the best size of the button based on the label and bezel size. """ w, h, useMin = self._GetLabelSize() if self.style & wx.BU_EXACTFIT: width = w + 2 + 2 * self.bezelWidth + 4 * int(self.useFocusInd) height = h + 2 + 2 * self.bezelWidth + 4 * int(self.useFocusInd) else: defSize = wx.Button.GetDefaultSize() width = 12 + w if useMin and width < defSize.width: width = defSize.width height = 11 + h if useMin and height < defSize.height: height = defSize.height width = width + self.bezelWidth - 2 height = height + self.bezelWidth - 2 return (width, height) def DrawBezel(self, dc, x1, y1, x2, y2): rect = wx.Rect(x1, y1, x2, y2) if self.up: state = 0 else: state = wx.CONTROL_PRESSED | wx.CONTROL_SELECTED if not self.IsEnabled(): state = wx.CONTROL_DISABLED elif self._default: state |= wx.CONTROL_ISDEFAULT pt = self.ScreenToClient(wx.GetMousePosition()) if self.GetClientRect().Contains(pt): state |= wx.CONTROL_CURRENT wx.RendererNative.Get().DrawPushButton(self, dc, rect, state) def DrawLabel(self, dc, width, height, dx=0, dy=0): dc.SetFont(self.GetFont()) if self.Enabled: dc.SetTextForeground(self.ForegroundColour) else: dc.SetTextForeground(wx.SystemSettings.GetColour(wx.SYS_COLOUR_GRAYTEXT)) label = self.Label tw, th = dc.GetTextExtent(label) if sys.platform != "win32" and not self.up: dx = dy = self.labelDelta dc.DrawText(label, (width-tw)/2+dx, (height-th)/2+dy) def Enable(self, enable=True): if enable != self.Enabled: self.Enabled = enable wx.PyControl.Enable(self, enable) self.Refresh() @Property def Enabled(): def fget(self): return self._reallyenabled def fset(self, enabled): self._reallyenabled = enabled return locals() def IsEnabled(self): return self.Enabled def OnLeftDown(self, event): if not self.Enabled: return self.up = False self.CaptureMouse() self.SetFocus() self.useFocusInd = False self.Refresh() event.Skip() def OnGainFocus(self, event): self.hasFocus = True self.useFocusInd = bool(self.bezelWidth) self.Refresh() self.Update() def SetDefault(self): self._default = True _ThemedGenButton.SetDefault(self) class PlateButton(platebtn.PlateButton): """ Fixes wx.lib.platebtn.PlateButton sometimes not reflecting enabled state correctly aswelll as other quirks """ _reallyenabled = True def __init__(self, *args, **kwargs): platebtn.PlateButton.__init__(self, *args, **kwargs) self.Unbind(wx.EVT_LEAVE_WINDOW) self.Bind(wx.EVT_LEAVE_WINDOW, lambda evt: wx.CallLater(80, self.__LeaveWindow)) def DoGetBestSize(self): """Calculate the best size of the button :return: :class:`Size` """ # A liitle more padding left + right width = 24 height = 6 if self.Label: # NOTE: Should measure with a GraphicsContext to get right # size, but due to random segfaults on linux special # handling is done in the drawing instead... lsize = self.GetFullTextExtent(self.Label) width += lsize[0] height += lsize[1] if self._bmp['enable'] is not None: bsize = self._bmp['enable'].Size width += (bsize[0] + 10) if height <= bsize[1]: height = bsize[1] + 6 else: height += 3 else: width += 10 if self._menu is not None or self._style & platebtn.PB_STYLE_DROPARROW: width += 12 best = wx.Size(width, height) self.CacheBestSize(best) return best def GetBitmapLabel(self): """Get the label bitmap :return: :class:`Bitmap` or None """ return self._bmp["enable"] def __DrawBitmap(self, gc): """Draw the bitmap if one has been set :param GCDC `gc`: :class:`GCDC` to draw with :return: x cordinate to draw text at """ if self.IsEnabled(): bmp = self._bmp['enable'] else: bmp = self._bmp['disable'] xpos = 16 if bmp is not None and bmp.IsOk(): bw, bh = bmp.GetSize() ypos = (self.GetSize()[1] - bh) // 2 gc.DrawBitmap(bmp, xpos, ypos, bmp.GetMask() != None) return bw + xpos else: return xpos def __DrawButton(self): """Draw the button""" # TODO using a buffered paintdc on windows with the nobg style # causes lots of weird drawing. So currently the use of a # buffered dc is dissabled for this style. if platebtn.PB_STYLE_NOBG & self._style: dc = wx.PaintDC(self) else: dc = wx.AutoBufferedPaintDCFactory(self) dc.SetBackground(wx.Brush(self.Parent.BackgroundColour)) dc.Clear() gc = wx.GCDC(dc) # Setup gc.SetFont(adjust_font_size_for_gcdc(self.GetFont())) gc.SetBackgroundMode(wx.TRANSPARENT) # Calc Object Positions width, height = self.GetSize() tw, th = gc.GetTextExtent(self.Label) txt_y = max((height - th) // 2, 1) # The background needs some help to look transparent on # on Gtk and Windows if wx.Platform in ['__WXGTK__', '__WXMSW__']: gc.SetBrush(self.GetBackgroundBrush(gc)) gc.SetPen(wx.TRANSPARENT_PEN) gc.DrawRectangle(0, 0, width, height) gc.SetBrush(wx.TRANSPARENT_BRUSH) if self._state['cur'] == platebtn.PLATE_HIGHLIGHT and self.IsEnabled(): gc.SetTextForeground(self._color['htxt']) gc.SetPen(wx.TRANSPARENT_PEN) self.__DrawHighlight(gc, width, height) elif self._state['cur'] == platebtn.PLATE_PRESSED and self.IsEnabled(): gc.SetTextForeground(self._color['htxt']) pen = wx.Pen(platebtn.AdjustColour(self._color['press'], -80, 220), 1) gc.SetPen(pen) self.__DrawHighlight(gc, width, height) txt_x = self.__DrawBitmap(gc) t_x = max((width - tw - (txt_x + 2)) // 2, txt_x + 2) gc.DrawText(self.Label, t_x, txt_y) self.__DrawDropArrow(gc, width - 10, (height // 2) - 2) else: if self.IsEnabled(): gc.SetTextForeground(self.GetForegroundColour()) else: txt_c = wx.SystemSettings.GetColour(wx.SYS_COLOUR_GRAYTEXT) gc.SetTextForeground(txt_c) # Draw bitmap and text if self._state['cur'] != platebtn.PLATE_PRESSED or not self.IsEnabled(): txt_x = self.__DrawBitmap(gc) t_x = max((width - tw - (txt_x + 2)) // 2, txt_x + 2) gc.DrawText(self.Label, t_x, txt_y) self.__DrawDropArrow(gc, width - 10, (height // 2) - 2) def __LeaveWindow(self): """Handle updating the buttons state when the mouse cursor leaves""" if (self._style & platebtn.PB_STYLE_TOGGLE) and self._pressed: self._SetState(platebtn.PLATE_PRESSED) else: self._SetState(platebtn.PLATE_NORMAL) self._pressed = False def __PostEvent(self): """Post a button event to parent of this control""" if self._style & platebtn.PB_STYLE_TOGGLE: etype = wx.wxEVT_COMMAND_TOGGLEBUTTON_CLICKED else: etype = wx.wxEVT_COMMAND_BUTTON_CLICKED bevt = wx.CommandEvent(etype, self.GetId()) bevt.SetEventObject(self) bevt.SetString(self.GetLabel()) self.GetEventHandler().ProcessEvent(bevt) Disable = ThemedGenButton.__dict__["Disable"] Enable = ThemedGenButton.__dict__["Enable"] Enabled = ThemedGenButton.__dict__["Enabled"] IsEnabled = ThemedGenButton.__dict__["IsEnabled"] Label = property(lambda self: self.GetLabel(), lambda self, label: self.SetLabel(label)) if not hasattr(PlateButton, "_SetState"): PlateButton._SetState = PlateButton.SetState class TempXmlResource(object): _temp = None def __init__(self, xmlpath): from config import get_default_dpi, getcfg scale = getcfg("app.dpi") / get_default_dpi() if scale > 1: if not TempXmlResource._temp: try: TempXmlResource._temp = tempfile.mkdtemp(prefix=appname + u"-XRC-") except: pass if TempXmlResource._temp and os.path.isdir(TempXmlResource._temp): # Read original XML with open(xmlpath, "rb") as xmlfile: xml = xmlfile.read() # Adjust spacing for scale for tag in ("border", "hgap", "vgap"): xml = re.sub(r"<%s>(\d+)" % (tag, tag), lambda match: "<%s>%i" % (tag, round(int(match.group(1)) * scale), tag), xml) for tag in ("size", ): xml = re.sub(r"<%s>(-?\d+)\s*,\s*(-?\d+)" % (tag, tag), lambda match: "<%s>%i,%i" % ((tag, ) + tuple(round(int(v) * scale) if int(v) > 0 else int(v) for v in match.groups()) + (tag, )), xml) # Set relative paths to absolute basedir = os.path.dirname(os.path.dirname(xmlpath)) basedir = basedir.replace("\\", "/") xml = xml.replace(">../", ">%s/" % safe_str(basedir, "UTF-8")) # Write modified XML xmlpath = os.path.join(TempXmlResource._temp, os.path.basename(xmlpath)) with open(xmlpath, "wb") as xmlfile: xmlfile.write(xml) from wxwindows import BaseApp BaseApp.register_exitfunc(self._cleanup) self.xmlpath = xmlpath self.res = xrc.XmlResource(xmlpath) def _cleanup(self): if (TempXmlResource._temp and self.xmlpath.startswith(TempXmlResource._temp + os.path.sep) and os.path.isfile(self.xmlpath)): os.remove(self.xmlpath) if not os.listdir(TempXmlResource._temp): shutil.rmtree(TempXmlResource._temp) def __getattr__(self, name): return getattr(self.res, name) class ThemedGenBitmapTextButton(ThemedGenButton, _GenBitmapTextButton): """A themed generic bitmapped button with text label""" def __init__(self, parent, id=-1, bitmap=wx.NullBitmap, label='', pos=wx.DefaultPosition, size=wx.DefaultSize, style=0, validator=wx.DefaultValidator, name="genbutton"): GenButton.__init__(self) _GenBitmapTextButton.__init__(self, parent, id, bitmap, label, pos, size, style, validator, name) self._default = False def DrawLabel(self, dc, width, height, dx=0, dy=0): bmp = self.bmpLabel if bmp is not None: # if the bitmap is used if self.bmpDisabled and not self.IsEnabled(): bmp = self.bmpDisabled if self.bmpFocus and self.hasFocus: bmp = self.bmpFocus if self.bmpSelected and not self.up: bmp = self.bmpSelected bw,bh = bmp.GetWidth(), bmp.GetHeight() if sys.platform != "win32" and not self.up: dx = dy = self.labelDelta hasMask = bmp.GetMask() is not None else: bw = bh = 0 # no bitmap -> size is zero dc.SetFont(self.GetFont()) if self.IsEnabled(): dc.SetTextForeground(self.GetForegroundColour()) else: dc.SetTextForeground(wx.SystemSettings.GetColour(wx.SYS_COLOUR_GRAYTEXT)) label = self.GetLabel() tw, th = dc.GetTextExtent(label) # size of text sw, sh = dc.GetTextExtent(" ") # extra spacing from bitmap if sys.platform != "win32" and not self.up: dx = dy = self.labelDelta pos_x = (width-bw-sw-tw)/2+dx # adjust for bitmap and text to centre if bmp is not None: dc.DrawBitmap(bmp, pos_x, (height-bh)/2+dy, hasMask) # draw bitmap if available pos_x = pos_x + sw # extra spacing from bitmap dc.DrawText(label, pos_x + dx+bw, (height-th)/2+dy) # draw the text class BitmapWithThemedButton(wx.BoxSizer): def __init__(self, parent, id=-1, bitmap=wx.NullBitmap, label="", pos=wx.DefaultPosition, size=wx.DefaultSize, style=0, validator=wx.DefaultValidator, name="button"): wx.BoxSizer.__init__(self, wx.HORIZONTAL) self._bmp = wx.StaticBitmap(parent, -1, bitmap) self.Add(self._bmp, flag=wx.ALIGN_CENTER_VERTICAL) if wx.Platform == "__WXMSW__": btncls = ThemedGenButton else: btncls = wx.Button self._btn = btncls(parent, id, label, pos, size, style, validator, name) self.Add(self._btn, flag=wx.ALIGN_CENTER_VERTICAL | wx.LEFT, border=8) def __getattr__(self, name): return getattr(self._btn, name) def Bind(self, event, handler): self._btn.Bind(event, handler) def SetBitmapLabel(self, bitmap): self._bmp.SetBitmap(bitmap) self.Layout() DisplayCAL-3.1.0.0/DisplayCAL/wxLUT3DFrame.py0000644000076500000000000014471112653526636020204 0ustar devwheel00000000000000# -*- coding: utf-8 -*- from __future__ import with_statement import glob import os import re import shutil import sys if sys.platform == "win32": import win32api from argyll_cgats import cal_to_fake_profile from argyll_names import video_encodings from config import (get_data_path, get_verified_path, getcfg, geticon, hascfg, setcfg) from log import safe_print from meta import name as appname, version from options import debug from util_os import islink, readlink, waccess from util_str import safe_unicode, strtr from worker import Error, Info, get_current_profile_path, show_result_dialog import ICCProfile as ICCP import config import localization as lang import madvr import worker from worker import UnloggedWarning, check_set_argyll_bin, get_options_from_profile from wxwindows import (BaseApp, BaseFrame, ConfirmDialog, FileDrop, InfoDialog, wx) from wxfixes import TempXmlResource import xh_filebrowsebutton import xh_bitmapctrls from wx import xrc class LUT3DFrame(BaseFrame): """ 3D LUT creation window """ def __init__(self, parent=None, setup=True): self.res = TempXmlResource(get_data_path(os.path.join("xrc", "3dlut.xrc"))) self.res.InsertHandler(xh_filebrowsebutton.FileBrowseButtonWithHistoryXmlHandler()) self.res.InsertHandler(xh_bitmapctrls.BitmapButton()) self.res.InsertHandler(xh_bitmapctrls.StaticBitmap()) if hasattr(wx, "PreFrame"): # Classic pre = wx.PreFrame() self.res.LoadOnFrame(pre, parent, "lut3dframe") self.PostCreate(pre) else: # Phoenix wx.Frame.__init__(self) self.res.LoadFrame(self, parent, "lut3dframe") self.init() self.Bind(wx.EVT_CLOSE, self.OnClose) self.SetIcons(config.get_icon_bundle([256, 48, 32, 16], appname + "-3DLUT-maker")) self.set_child_ctrls_as_attrs(self) self.panel = self.FindWindowByName("panel") if setup: self.setup() def setup(self): self.worker = worker.Worker(self) self.worker.set_argyll_version("collink") for which in ("input", "abstract", "output"): ctrl = self.FindWindowByName("%s_profile_ctrl" % which) setattr(self, "%s_profile_ctrl" % which, ctrl) ctrl.changeCallback = getattr(self, "%s_profile_ctrl_handler" % which) if which not in ("abstract", "output"): ctrl.SetHistory(get_data_path("ref", "\.(icc|icm)$")) ctrl.SetMaxFontSize(11) # Drop targets droptarget = FileDrop(self, {".icc": getattr(self, "%s_drop_handler" % which), ".icm": getattr(self, "%s_drop_handler" % which)}) ctrl.SetDropTarget(droptarget) # Bind event handlers self.abstract_profile_cb.Bind(wx.EVT_CHECKBOX, self.use_abstract_profile_ctrl_handler) self.output_profile_current_btn.Bind(wx.EVT_BUTTON, self.output_profile_current_ctrl_handler) self.lut3d_trc_apply_none_ctrl.Bind(wx.EVT_RADIOBUTTON, self.lut3d_trc_apply_ctrl_handler) self.lut3d_trc_apply_black_offset_ctrl.Bind(wx.EVT_RADIOBUTTON, self.lut3d_trc_apply_ctrl_handler) self.lut3d_trc_apply_ctrl.Bind(wx.EVT_RADIOBUTTON, self.lut3d_trc_apply_ctrl_handler) self.lut3d_bind_event_handlers() self.lut3d_create_btn.SetDefault() self.setup_language() self.XYZbpin = [0, 0, 0] # XYZbpout will be set to the blackpoint of the selected profile. This # is used to determine if lack output offset controls should be shown. # Set a initial value slightly above zero so output offset controls are # shown if the selected profile doesn't exist. self.XYZbpout = [0.001, 0.001, 0.001] self.update_controls() self.update_layout() config.defaults.update({ "position.lut3dframe.x": self.GetDisplay().ClientArea[0] + 40, "position.lut3dframe.y": self.GetDisplay().ClientArea[1] + 60, "size.lut3dframe.w": self.GetMinSize()[0], "size.lut3dframe.h": self.GetMinSize()[1]}) if (hascfg("position.lut3dframe.x") and hascfg("position.lut3dframe.y") and hascfg("size.lut3dframe.w") and hascfg("size.lut3dframe.h")): self.SetSaneGeometry(int(getcfg("position.lut3dframe.x")), int(getcfg("position.lut3dframe.y")), int(getcfg("size.lut3dframe.w")), int(getcfg("size.lut3dframe.h"))) else: self.Center() def lut3d_bind_event_handlers(self): # Shared with main window self.lut3d_apply_cal_cb.Bind(wx.EVT_CHECKBOX, self.lut3d_apply_cal_ctrl_handler) self.lut3d_create_btn.Bind(wx.EVT_BUTTON, self.lut3d_create_handler) self.lut3d_trc_ctrl.Bind(wx.EVT_CHOICE, self.lut3d_trc_ctrl_handler) self.lut3d_trc_gamma_ctrl.Bind(wx.EVT_COMBOBOX, self.lut3d_trc_gamma_ctrl_handler) self.lut3d_trc_gamma_ctrl.Bind(wx.EVT_KILL_FOCUS, self.lut3d_trc_gamma_ctrl_handler) self.lut3d_trc_gamma_type_ctrl.Bind(wx.EVT_CHOICE, self.lut3d_trc_gamma_type_ctrl_handler) self.lut3d_trc_black_output_offset_ctrl.Bind(wx.EVT_SLIDER, self.lut3d_trc_black_output_offset_ctrl_handler) self.lut3d_trc_black_output_offset_intctrl.Bind(wx.EVT_TEXT, self.lut3d_trc_black_output_offset_ctrl_handler) self.encoding_input_ctrl.Bind(wx.EVT_CHOICE, self.lut3d_encoding_input_ctrl_handler) self.encoding_output_ctrl.Bind(wx.EVT_CHOICE, self.lut3d_encoding_output_ctrl_handler) self.gamut_mapping_inverse_a2b.Bind(wx.EVT_RADIOBUTTON, self.lut3d_gamut_mapping_mode_handler) self.gamut_mapping_b2a.Bind(wx.EVT_RADIOBUTTON, self.lut3d_gamut_mapping_mode_handler) self.lut3d_rendering_intent_ctrl.Bind(wx.EVT_CHOICE, self.lut3d_rendering_intent_ctrl_handler) self.lut3d_format_ctrl.Bind(wx.EVT_CHOICE, self.lut3d_format_ctrl_handler) self.lut3d_size_ctrl.Bind(wx.EVT_CHOICE, self.lut3d_size_ctrl_handler) self.lut3d_bitdepth_input_ctrl.Bind(wx.EVT_CHOICE, self.lut3d_bitdepth_input_ctrl_handler) self.lut3d_bitdepth_output_ctrl.Bind(wx.EVT_CHOICE, self.lut3d_bitdepth_output_ctrl_handler) def OnClose(self, event=None): if (getattr(self.worker, "thread", None) and self.worker.thread.isAlive()): self.worker.abort_subprocess(True) return if sys.platform == "darwin" or debug: self.focus_handler(event) if (self.IsShownOnScreen() and not self.IsMaximized() and not self.IsIconized()): x, y = self.GetScreenPosition() setcfg("position.lut3dframe.x", x) setcfg("position.lut3dframe.y", y) setcfg("size.lut3dframe.w", self.GetSize()[0]) setcfg("size.lut3dframe.h", self.GetSize()[1]) if self.Parent: config.writecfg() else: config.writecfg(module="3DLUT-maker", options=("3dlut.", "last_3dlut_path", "position.lut3dframe", "size.lut3dframe")) if event: event.Skip() def use_abstract_profile_ctrl_handler(self, event): setcfg("3dlut.use_abstract_profile", int(self.abstract_profile_cb.GetValue())) enable = bool(getcfg("3dlut.use_abstract_profile")) self.abstract_profile_ctrl.Enable(enable) def lut3d_trc_apply_ctrl_handler(self, event=None): v = self.lut3d_trc_apply_ctrl.GetValue() self.lut3d_trc_ctrl.Enable(v) self.lut3d_trc_gamma_label.Enable(v) self.lut3d_trc_gamma_ctrl.Enable(v) self.lut3d_trc_gamma_type_ctrl.Enable(v) if event: setcfg("3dlut.apply_trc", int(v)) setcfg("3dlut.apply_black_offset", int(self.lut3d_trc_apply_black_offset_ctrl.GetValue())) self.lut3d_trc_black_output_offset_label.Enable(v) self.lut3d_trc_black_output_offset_ctrl.Enable(v) self.lut3d_trc_black_output_offset_intctrl.Enable(v) self.lut3d_trc_black_output_offset_intctrl_label.Enable(v) self.lut3d_show_input_value_clipping_warning(event) def lut3d_show_input_value_clipping_warning(self, layout): self.panel.Freeze() show = (self.lut3d_trc_apply_none_ctrl.GetValue() and self.XYZbpout > self.XYZbpin and getcfg("3dlut.rendering_intent") not in ("la", "p", "pa", "ms", "s", "lp")) self.lut3d_input_value_clipping_bmp.Show(show) self.lut3d_input_value_clipping_label.Show(show) if layout: self.panel.Sizer.Layout() self.update_layout() self.panel.Thaw() def lut3d_apply_cal_ctrl_handler(self, event): setcfg("3dlut.output.profile.apply_cal", int(self.lut3d_apply_cal_cb.GetValue())) def lut3d_trc_black_output_offset_ctrl_handler(self, event): if event.GetId() == self.lut3d_trc_black_output_offset_intctrl.GetId(): self.lut3d_trc_black_output_offset_ctrl.SetValue( self.lut3d_trc_black_output_offset_intctrl.GetValue()) else: self.lut3d_trc_black_output_offset_intctrl.SetValue( self.lut3d_trc_black_output_offset_ctrl.GetValue()) v = self.lut3d_trc_black_output_offset_ctrl.GetValue() / 100.0 if v != getcfg("3dlut.trc_output_offset"): self.lut3d_set_option("3dlut.trc_output_offset", v) self.lut3d_update_trc_control() self.lut3d_show_trc_controls() def lut3d_trc_gamma_ctrl_handler(self, event): try: v = float(self.lut3d_trc_gamma_ctrl.GetValue().replace(",", ".")) if (v < config.valid_ranges["3dlut.trc_gamma"][0] or v > config.valid_ranges["3dlut.trc_gamma"][1]): raise ValueError() except ValueError: wx.Bell() self.lut3d_trc_gamma_ctrl.SetValue(str(getcfg("3dlut.trc_gamma"))) else: if str(v) != self.lut3d_trc_gamma_ctrl.GetValue(): self.lut3d_trc_gamma_ctrl.SetValue(str(v)) if v != getcfg("3dlut.trc_gamma"): self.lut3d_set_option("3dlut.trc_gamma", v) self.lut3d_update_trc_control() self.lut3d_show_trc_controls() event.Skip() def lut3d_trc_ctrl_handler(self, event): self.Freeze() if self.lut3d_trc_ctrl.GetSelection() == 1: # BT.1886 self.lut3d_set_option("3dlut.trc_gamma", 2.4) self.lut3d_set_option("3dlut.trc_gamma_type", "B") self.lut3d_set_option("3dlut.trc_output_offset", 0.0) self.lut3d_update_trc_controls() elif self.lut3d_trc_ctrl.GetSelection() == 0: # Pure power gamma 2.2 self.lut3d_set_option("3dlut.trc_gamma", 2.2) self.lut3d_set_option("3dlut.trc_gamma_type", "b") self.lut3d_set_option("3dlut.trc_output_offset", 1.0) self.lut3d_update_trc_controls() self.lut3d_show_trc_controls() self.Thaw() def lut3d_trc_gamma_type_ctrl_handler(self, event): v = self.trc_gamma_types_ab[self.lut3d_trc_gamma_type_ctrl.GetSelection()] if v != getcfg("3dlut.trc_gamma_type"): self.lut3d_set_option("3dlut.trc_gamma_type", v) self.lut3d_update_trc_control() self.lut3d_show_trc_controls() def abstract_drop_handler(self, path): if not self.worker.is_working(): self.abstract_profile_ctrl.SetPath(path) self.set_profile("abstract") def lut3d_encoding_input_ctrl_handler(self, event): encoding = self.encoding_input_ab[self.encoding_input_ctrl.GetSelection()] self.lut3d_set_option("3dlut.encoding.input", encoding) if getcfg("3dlut.format") == "eeColor": if encoding == "T": encoding = "t" self.encoding_output_ctrl.SetSelection(self.encoding_output_ba[encoding]) self.lut3d_set_option("3dlut.encoding.output", encoding) if getattr(self, "lut3dframe", None): self.lut3dframe.lut3d_update_encoding_controls() elif self.Parent: self.Parent.lut3d_update_encoding_controls() def lut3d_encoding_output_ctrl_handler(self, event): encoding = self.encoding_output_ab[self.encoding_output_ctrl.GetSelection()] if getcfg("3dlut.format") == "madVR" and encoding != "t": profile = getattr(self, "output_profile", None) if (profile and "meta" in profile.tags and isinstance(profile.tags.meta, ICCP.DictType) and "EDID_model" in profile.tags.meta): devicename = profile.tags.meta["EDID_model"] else: devicename = None dlg = ConfirmDialog(self, msg=lang.getstr("3dlut.encoding.output.warning.madvr", devicename or lang.getstr("device.name.placeholder")), ok=lang.getstr("ok"), cancel=lang.getstr("cancel"), bitmap=geticon(32, "dialog-warning")) result = dlg.ShowModal() dlg.Destroy() if result != wx.ID_OK: self.encoding_output_ctrl.SetSelection( self.encoding_output_ba[getcfg("3dlut.encoding.output")]) return False self.lut3d_set_option("3dlut.encoding.output", encoding) if getattr(self, "lut3dframe", None): self.lut3dframe.lut3d_update_encoding_controls() elif self.Parent: self.Parent.lut3d_update_encoding_controls() def input_drop_handler(self, path): if not self.worker.is_working(): self.input_profile_ctrl.SetPath(path) self.set_profile("input") def output_drop_handler(self, path): if not self.worker.is_working(): self.output_profile_ctrl.SetPath(path) self.set_profile("output") def abstract_profile_ctrl_handler(self, event): self.set_profile("abstract", silent=not event) def input_profile_ctrl_handler(self, event): self.set_profile("input", silent=not event) if self.Parent: self.Parent.lut3d_init_input_profiles() self.Parent.lut3d_update_controls() def lut3d_bitdepth_input_ctrl_handler(self, event): self.lut3d_set_option("3dlut.bitdepth.input", self.lut3d_bitdepth_ab[self.lut3d_bitdepth_input_ctrl.GetSelection()]) if getattr(self, "lut3dframe", None): self.lut3dframe.lut3d_update_shared_controls() elif self.Parent: self.Parent.lut3d_update_shared_controls() def lut3d_bitdepth_output_ctrl_handler(self, event): if (getcfg("3dlut.format") in ("png", "ReShade") and self.lut3d_bitdepth_ab[self.lut3d_bitdepth_output_ctrl.GetSelection()] not in (8, 16)): wx.Bell() self.lut3d_bitdepth_output_ctrl.SetSelection(self.lut3d_bitdepth_ba[8]) self.lut3d_set_option("3dlut.bitdepth.output", self.lut3d_bitdepth_ab[self.lut3d_bitdepth_output_ctrl.GetSelection()]) if getattr(self, "lut3dframe", None): self.lut3dframe.lut3d_update_shared_controls() elif self.Parent: self.Parent.lut3d_update_shared_controls() def lut3d_create_consumer(self, result=None): if isinstance(result, Exception): show_result_dialog(result, self) # Remove temporary files self.worker.wrapup(False) if not isinstance(result, Exception) and result: if not isinstance(self, LUT3DFrame) and getattr(self, "lut3d_path", None): # 3D LUT tab is part of main window if getcfg("3dlut.create"): # 3D LUT was created automatically after profiling, show # usual profile summary window self.profile_finish(True, getcfg("calibration.file", False), lang.getstr("calibration_profiling.complete"), lang.getstr("profiling.incomplete"), install_3dlut=True) else: # 3D LUT was created manually self.profile_finish(True, getcfg("calibration.file", False), "", lang.getstr("profiling.incomplete"), install_3dlut=True) def lut3d_create_handler(self, event, path=None, copy_from_path=None): if sys.platform == "darwin" or debug: self.focus_handler(event) if not check_set_argyll_bin(): return if isinstance(self, LUT3DFrame): profile_in = self.set_profile("input") if getcfg("3dlut.use_abstract_profile"): profile_abst = self.set_profile("abstract") else: profile_abst = None profile_out = self.set_profile("output") else: profile_abst = None profile_in_path = getcfg("3dlut.input.profile") if not profile_in_path or not os.path.isfile(profile_in_path): show_result_dialog(Error(lang.getstr("error.profile.file_missing", getcfg("3dlut.input.profile", raw=True))), parent=self) return try: profile_in = ICCP.ICCProfile(profile_in_path) except (IOError, ICCP.ICCProfileInvalidError), exception: show_result_dialog(Error(lang.getstr("profile.invalid") + "\n" + profile_in_path), parent=self) return profile_out = config.get_current_profile() if not profile_out: show_result_dialog(Error(lang.getstr("profile.invalid") + "\n%s" % getcfg("calibration.file", False)), parent=self) return if path: # Called from script client self.lut3d_path = None elif not copy_from_path: self.lut3d_set_path() path = self.lut3d_path if (not None in (profile_in, profile_out) or (profile_in and profile_in.profileClass == "link")): if profile_out and profile_in.isSame(profile_out, force_calculation=True): show_result_dialog(Error(lang.getstr("error.source_dest_same")), self) return checkoverwrite = True remember_last_3dlut_path = False if not path: defaultDir, defaultFile = get_verified_path("last_3dlut_path") if copy_from_path: defaultFile = os.path.basename(copy_from_path) # Only remember last used path if it was a deliberate user # choice via the filedialog remember_last_3dlut_path = True if copy_from_path and config.get_display_name() == "Resolve": # Find path to Resolve LUT folder if sys.platform == "win32": drives = win32api.GetLogicalDriveStrings() for drive in drives.split("\0")[:-1]: lut_dir = os.path.join(drive, "ProgramData", "Blackmagic Design", "DaVinci Resolve", "Support", "LUT") if os.path.isdir(lut_dir): defaultDir = lut_dir remember_last_3dlut_path = False break else: # Assume OS X volumes = ["/"] + glob.glob("/Volumes/*") for volume in volumes: lut_dir = os.path.join(volume, "Library", "Application Support", "Blackmagic Design", "DaVinci Resolve", "LUT") if os.path.isdir(lut_dir): defaultDir = lut_dir remember_last_3dlut_path = False break ext = getcfg("3dlut.format") if (ext != "madVR" and not isinstance(self, LUT3DFrame) and getcfg("3dlut.output.profile.apply_cal")): # Check if there's a clash between current videoLUT # and 3D LUT (do both contain non-linear calibration?) profile_display_name = profile_out.getDeviceModelDescription() tempdir = self.worker.create_tempdir() if isinstance(tempdir, Exception): show_result_dialog(tempdir, self) return tempcal = os.path.join(tempdir, "temp.cal") cancel = False real_displays_count = 0 show_nonlinear_videolut_warning = False for i, display_name in enumerate(self.worker.display_names): if (display_name == profile_display_name and display_name != "madVR" and self.worker.lut_access[i] and self.worker.save_current_video_lut( i + 1, tempcal, silent=True) is True and not cal_to_fake_profile(tempcal).tags.vcgt.is_linear()): show_nonlinear_videolut_warning = True break if not config.is_virtual_display(i): real_displays_count += 1 if (show_nonlinear_videolut_warning or real_displays_count == 1): if copy_from_path: confirm = lang.getstr("3dlut.save_as") else: confirm = lang.getstr("3dlut.install") if not show_result_dialog(UnloggedWarning( lang.getstr("3dlut.1dlut.videolut.nonlinear")), self, confirm=confirm): cancel = True if os.path.isfile(tempcal): os.remove(tempcal) if cancel: return if ext == "ReShade": dlg = wx.DirDialog(self, lang.getstr("3dlut.install"), defaultPath=defaultDir) else: if ext == "eeColor": ext = "txt" elif ext == "madVR": ext = "3dlut" defaultFile = os.path.splitext(defaultFile or os.path.basename(config.defaults.get("last_3dlut_path")))[0] + "." + ext dlg = wx.FileDialog(self, lang.getstr("3dlut.save_as"), defaultDir=defaultDir, defaultFile=defaultFile, wildcard="*." + ext, style=wx.SAVE | wx.FD_OVERWRITE_PROMPT) dlg.Center(wx.BOTH) if dlg.ShowModal() == wx.ID_OK: path = dlg.GetPath() if ext == "ReShade": path = os.path.join(path.rstrip(os.path.sep), "ColorLookupTable.png") dlg.Destroy() checkoverwrite = False if path: if not waccess(path, os.W_OK): show_result_dialog(Error(lang.getstr("error.access_denied.write", path)), self) return if remember_last_3dlut_path: setcfg("last_3dlut_path", path) if checkoverwrite and os.path.isfile(path): dlg = ConfirmDialog(self, msg=lang.getstr("dialog.confirm_overwrite", (path)), ok=lang.getstr("overwrite"), cancel=lang.getstr("cancel"), bitmap =geticon(32, "dialog-warning")) result = dlg.ShowModal() dlg.Destroy() if result != wx.ID_OK: return if self.Parent: config.writecfg() elif isinstance(self, LUT3DFrame): config.writecfg(module="3DLUT-maker", options=("3dlut.", "last_3dlut_path", "position.lut3dframe", "size.lut3dframe")) if copy_from_path: # Instead of creating a 3D LUT, copy existing one src_name = os.path.splitext(copy_from_path)[0] dst_name = os.path.splitext(path)[0] src_paths = [copy_from_path] dst_paths = [path] if getcfg("3dlut.format") == "eeColor": # eeColor: 3D LUT + 6x 1D LUT for part in ("first", "second"): for channel in ("blue", "green", "red"): src_path = "%s-%s1d%s.txt" % (src_name, part, channel) if os.path.isfile(src_path): src_paths.append(src_path) dst_paths.append("%s-%s1d%s.txt" % (dst_name, part, channel)) elif getcfg("3dlut.format") == "ReShade": dst_dir = os.path.dirname(path) # Check if MasterEffect is installed me_header_path = os.path.join(dst_dir, "MasterEffect.h") use_mclut3d = False if (use_mclut3d and os.path.isfile(me_header_path) and os.path.isdir(os.path.join(dst_dir, "MasterEffect"))): dst_paths = [os.path.join(dst_dir, "MasterEffect", "mclut3d.png")] # Alter existing MasterEffect.h with open(me_header_path, "rb") as me_header_file: me_header = me_header_file.read() # Enable LUT me_header = re.sub(r"#define\s+USE_LUT\s+0", "#define USE_LUT 1", me_header) # iLookupTableMode 2 = use mclut3d.png me_header = re.sub(r"#define\s+iLookupTableMode\s+\d+", "#define iLookupTableMode 2", me_header) # Amount of color change by lookup table. # 1.0 means full effect. me_header = re.sub(r"#define\s+fLookupTableMix\s+\d+(?:\.\d+)", "#define fLookupTableMix 1.0", me_header) with open(me_header_path, "wb") as me_header_file: me_header_file.write(me_header) else: # Write out our own shader clut_fx_path = get_data_path("ColorLookupTable.fx") if not clut_fx_path: show_result_dialog(Error(lang.getstr("file.missing", "ColorLookupTable.fx")), self) return with open(clut_fx_path, "rb") as clut_fx_file: clut_fx = clut_fx_file.read() clut_size = getcfg("3dlut.size") clut_fx = strtr(clut_fx, {"${VERSION}": version, "${WIDTH}": str(clut_size ** 2), "${HEIGHT}": str(clut_size), "${FORMAT}": "RGBA%i" % getcfg("3dlut.bitdepth.output")}) reshade_fx_path = os.path.join(dst_dir, "ReShade.fx") # Adjust path for correct installation if ReShade.fx # is a symlink. if islink(reshade_fx_path): reshade_fx_path = readlink(reshade_fx_path) path = os.path.join(os.path.dirname(reshade_fx_path), os.path.basename(path)) dst_paths = [path] if os.path.isfile(reshade_fx_path): # Alter existing ReShade.fx with open(reshade_fx_path, "rb") as reshade_fx_file: reshade_fx = reshade_fx_file.read() # Remove existing shader include reshade_fx = re.sub(r'[ \t]*//\s*Automatically\s+\S+\s+by\s+%s\s+.+[ \t]*\r?\n?' % appname, "", reshade_fx) reshade_fx = re.sub(r'[ \t]*#include\s+"ColorLookupTable.fx"[ \t]*\r?\n?', "", reshade_fx).rstrip("\r\n") else: reshade_fx = "" if reshade_fx: reshade_fx += "%s// Automatically added by %s %s%s" % (os.linesep * 2, appname, version, os.linesep) else: reshade_fx = "// Automatically created by %s %s%s" % (appname, version, os.linesep) reshade_fx += '#include "ColorLookupTable.fx"' + os.linesep clut_fx_path = os.path.join(os.path.dirname(path), "ColorLookupTable.fx") with open(clut_fx_path, "wb") as clut_fx_file: clut_fx_file.write(clut_fx) with open(reshade_fx_path, "wb") as reshade_fx_file: reshade_fx_file.write(reshade_fx) for src_path, dst_path in zip(src_paths, dst_paths): shutil.copyfile(src_path, dst_path) return self.worker.interactive = False self.worker.start(self.lut3d_create_consumer, self.lut3d_create_producer, wargs=(profile_in, profile_abst, profile_out, path), progress_msg=lang.getstr("3dlut.create"), resume=not isinstance(self, LUT3DFrame) and getcfg("3dlut.create")) def lut3d_create_producer(self, profile_in, profile_abst, profile_out, path): apply_cal = (profile_out and isinstance(profile_out.tags.get("vcgt"), ICCP.VideoCardGammaType) and (getcfg("3dlut.output.profile.apply_cal") or not hasattr(self, "lut3d_apply_cal_cb"))) input_encoding = getcfg("3dlut.encoding.input") output_encoding = getcfg("3dlut.encoding.output") if (getcfg("3dlut.apply_trc") or not hasattr(self, "lut3d_trc_apply_none_ctrl")): trc_gamma = getcfg("3dlut.trc_gamma") else: trc_gamma = None trc_gamma_type = getcfg("3dlut.trc_gamma_type") outoffset = getcfg("3dlut.trc_output_offset") intent = getcfg("3dlut.rendering_intent") format = getcfg("3dlut.format") size = getcfg("3dlut.size") input_bits = getcfg("3dlut.bitdepth.input") output_bits = getcfg("3dlut.bitdepth.output") apply_black_offset = getcfg("3dlut.apply_black_offset") use_b2a = getcfg("3dlut.gamap.use_b2a") try: self.worker.create_3dlut(profile_in, path, profile_abst, profile_out, apply_cal=apply_cal, intent=intent, format=format, size=size, input_bits=input_bits, output_bits=output_bits, input_encoding=input_encoding, output_encoding=output_encoding, trc_gamma=trc_gamma, trc_gamma_type=trc_gamma_type, trc_output_offset=outoffset, apply_black_offset=apply_black_offset, use_b2a=use_b2a) except Exception, exception: return exception return True def lut3d_format_ctrl_handler(self, event): # Get selected format format = self.lut3d_formats_ab[self.lut3d_format_ctrl.GetSelection()] if getcfg("3dlut.format") in ("eeColor", "madVR", "ReShade") and format not in ("eeColor", "madVR", "ReShade"): # If previous format was eeColor/madVR/ReShade, restore 3D LUT encoding setcfg("3dlut.encoding.input", getcfg("3dlut.encoding.input.backup")) setcfg("3dlut.encoding.output", getcfg("3dlut.encoding.output.backup")) if getcfg("3dlut.format") in ("eeColor", "madVR", "mga", "ReShade"): setcfg("3dlut.size", getcfg("3dlut.size.backup")) if getcfg("3dlut.format") not in ("eeColor", "madVR", "ReShade") and format in ("eeColor", "madVR", "ReShade"): # If selected format is eeColor/madVR/ReShade, backup 3D LUT encoding setcfg("3dlut.encoding.input.backup", getcfg("3dlut.encoding.input")) setcfg("3dlut.encoding.output.backup", getcfg("3dlut.encoding.output")) # Set selected format self.lut3d_set_option("3dlut.format", format) if format in ("eeColor", "madVR", "mga", "ReShade"): setcfg("3dlut.size.backup", getcfg("3dlut.size")) if format == "eeColor": # -et -Et for eeColor if getcfg("3dlut.encoding.input") not in ("t", "T"): self.lut3d_set_option("3dlut.encoding.input", "t") self.lut3d_set_option("3dlut.encoding.output", "t") # eeColor uses a fixed size of 65x65x65 self.lut3d_set_option("3dlut.size", 65) elif format == "mga": # Pandora uses a fixed bitdepth of 16 self.lut3d_set_option("3dlut.bitdepth.output", 16) self.lut3d_bitdepth_output_ctrl.SetSelection(self.lut3d_bitdepth_ba[16]) elif format == "madVR": # -et -Et for madVR if getcfg("3dlut.encoding.input") not in ("t", "T"): self.lut3d_set_option("3dlut.encoding.input", "t") self.lut3d_set_option("3dlut.encoding.output", "t") # collink says madVR works best with 65 self.lut3d_set_option("3dlut.size", 65) elif format in ("png", "ReShade"): if format == "ReShade": self.lut3d_set_option("3dlut.encoding.input", "n") self.lut3d_set_option("3dlut.encoding.output", "n") self.lut3d_set_option("3dlut.bitdepth.output", 8) elif getcfg("3dlut.bitdepth.output") not in (8, 16): self.lut3d_set_option("3dlut.bitdepth.output", 8) self.lut3d_bitdepth_output_ctrl.SetSelection(self.lut3d_bitdepth_ba[getcfg("3dlut.bitdepth.output")]) size = getcfg("3dlut.size") snap_size = self.lut3d_snap_size(size) if snap_size != size: self.lut3d_set_option("3dlut.size", snap_size) self.lut3d_size_ctrl.SetSelection(self.lut3d_size_ba[getcfg("3dlut.size")]) self.lut3d_update_encoding_controls() self.lut3d_enable_size_controls() self.lut3d_show_bitdepth_controls() if not isinstance(self, LUT3DFrame): self.panel.Freeze() self.lut3d_show_controls() self.calpanel.Layout() self.update_main_controls() self.panel.Thaw() if getattr(self, "lut3dframe", None): self.lut3dframe.lut3d_update_shared_controls() return elif self.Parent: self.Parent.lut3d_update_shared_controls() self.lut3d_create_btn.Enable(format != "madVR" or self.output_profile_ctrl.IsShown()) def lut3d_size_ctrl_handler(self, event): size = self.lut3d_size_ab[self.lut3d_size_ctrl.GetSelection()] snap_size = self.lut3d_snap_size(size) if snap_size != size: wx.Bell() self.lut3d_size_ctrl.SetSelection(self.lut3d_size_ba[snap_size]) self.lut3d_set_option("3dlut.size", snap_size) if getattr(self, "lut3dframe", None): self.lut3dframe.lut3d_update_shared_controls() elif self.Parent: self.Parent.lut3d_update_shared_controls() def lut3d_snap_size(self, size): if getcfg("3dlut.format") == "mga" and size not in (17, 33): if size < 33: size = 17 else: size = 33 elif getcfg("3dlut.format") == "ReShade" and size not in (16, 32, 64): if size < 32: size = 16 elif size < 64: size = 32 else: size = 64 return size def output_profile_ctrl_handler(self, event): self.set_profile("output", silent=not event) def output_profile_current_ctrl_handler(self, event): profile_path = get_current_profile_path(True, True) if profile_path and os.path.isfile(profile_path): self.output_profile_ctrl.SetPath(profile_path) self.set_profile("output", profile_path or False, silent=not event) def lut3d_gamut_mapping_mode_handler(self, event): self.lut3d_set_option("3dlut.gamap.use_b2a", int(self.gamut_mapping_b2a.GetValue())) if getattr(self, "lut3dframe", None): self.lut3dframe.update_controls() elif self.Parent: self.Parent.lut3d_update_b2a_controls() def get_commands(self): return self.get_common_commands() + ["3DLUT-maker [create ]"] def process_data(self, data): if data[0] == "3DLUT-maker" and (len(data) == 1 or (len(data) == 3 and data[1] == "create")): if self.IsIconized(): self.Restore() self.Raise() if len(data) == 3: wx.CallAfter(self.lut3d_create_handler, CustomEvent(wx.EVT_BUTTON.evtType[0], self.lut3d_create_btn), path=data[2]) return "ok" return "invalid" def lut3d_rendering_intent_ctrl_handler(self, event): self.lut3d_set_option("3dlut.rendering_intent", self.rendering_intents_ab[self.lut3d_rendering_intent_ctrl.GetSelection()]) if getattr(self, "lut3dframe", None): self.lut3dframe.lut3d_update_shared_controls() else: if hasattr(self, "lut3d_show_input_value_clipping_warning"): self.lut3d_show_input_value_clipping_warning(True) if self.Parent: self.Parent.lut3d_update_shared_controls() def set_profile(self, which, profile_path=None, silent=False): path = getattr(self, "%s_profile_ctrl" % which).GetPath() if which == "output": if profile_path is None: profile_path = get_current_profile_path(True, True) self.output_profile_current_btn.Enable(self.output_profile_ctrl.IsShown() and bool(profile_path) and os.path.isfile(profile_path) and profile_path != path) if path: if not os.path.isfile(path): if not silent: show_result_dialog(Error(lang.getstr("file.missing", path)), parent=self) return try: profile = ICCP.ICCProfile(path) except (IOError, ICCP.ICCProfileInvalidError): if not silent: show_result_dialog(Error(lang.getstr("profile.invalid") + "\n" + path), parent=self) except IOError, exception: if not silent: show_result_dialog(exception, parent=self) else: if ((which in ("input", "output") and (profile.profileClass not in ("mntr", "link", "scnr", "spac") or profile.colorSpace != "RGB")) or (which == "abstract" and (profile.profileClass != "abst" or profile.colorSpace not in ("Lab", "XYZ")))): show_result_dialog(NotImplementedError(lang.getstr("profile.unsupported", (profile.profileClass, profile.colorSpace))), parent=self) else: if profile.profileClass == "link": if which == "output": self.input_profile_ctrl.SetPath(path) if getcfg("3dlut.output.profile") == path: # The original file was probably overwritten # by the device link. Reset. setcfg("3dlut.output.profile", None) self.output_profile_ctrl.SetPath(getcfg("3dlut.output.profile")) self.set_profile("input", silent=silent) return else: self.Freeze() self.abstract_profile_cb.SetValue(False) self.abstract_profile_cb.Hide() self.abstract_profile_ctrl.Hide() self.output_profile_label.Hide() self.output_profile_ctrl.Hide() self.output_profile_current_btn.Hide() self.lut3d_apply_cal_cb.Hide() self.lut3d_trc_label.Hide() self.lut3d_trc_apply_none_ctrl.Hide() self.lut3d_input_value_clipping_bmp.Hide() self.lut3d_input_value_clipping_label.Hide() self.lut3d_trc_apply_black_offset_ctrl.Hide() self.gamut_mapping_mode.Hide() self.gamut_mapping_inverse_a2b.Hide() self.gamut_mapping_b2a.Hide() self.lut3d_show_encoding_controls(False) self.lut3d_show_trc_controls(False) self.lut3d_rendering_intent_label.Hide() self.lut3d_rendering_intent_ctrl.Hide() self.panel.GetSizer().Layout() self.update_layout() self.Thaw() else: self.Freeze() if which == "input": self.lut3d_trc_label.Show() self.lut3d_trc_apply_none_ctrl.Show() self.lut3d_trc_apply_black_offset_ctrl.Show() self.gamut_mapping_mode.Show() self.gamut_mapping_inverse_a2b.Show() self.gamut_mapping_b2a.Show() enable = bool(getcfg("3dlut.use_abstract_profile")) self.abstract_profile_cb.SetValue(enable) self.abstract_profile_cb.Show() self.abstract_profile_ctrl.Enable(enable) self.abstract_profile_ctrl.Show() self.output_profile_label.Show() self.output_profile_ctrl.Show() self.output_profile_current_btn.Show() self.lut3d_apply_cal_cb.Show() self.lut3d_show_encoding_controls() self.lut3d_update_encoding_controls() if (not hasattr(self, which + "_profile") or getcfg("3dlut.%s.profile" % which) != profile.fileName): # Get profile blackpoint so we can check if it makes # sense to show TRC type and output offset controls try: odata = self.worker.xicclu(profile, (0, 0, 0), pcs="x") except Exception, exception: wx.CallAfter(show_result_dialog, exception, self) else: if len(odata) != 1 or len(odata[0]) != 3: show_result_dialog("Blackpoint is invalid: %s" % odata, self) self.XYZbpin = odata[0] # Update controls related to output profile setattr(self, "input_profile", profile) if not self.set_profile("output", silent=silent): self.update_linking_controls() elif which == "output": enable_apply_cal = (isinstance(profile.tags.get("vcgt"), ICCP.VideoCardGammaType)) self.lut3d_apply_cal_cb.SetValue(enable_apply_cal and bool(getcfg("3dlut.output.profile.apply_cal"))) self.lut3d_apply_cal_cb.Enable(enable_apply_cal) if (not hasattr(self, which + "_profile") or getcfg("3dlut.%s.profile" % which) != profile.fileName): # Get profile blackpoint so we can check if input # values would be clipped try: odata = self.worker.xicclu(profile, (0, 0, 0), pcs="x") except Exception, exception: wx.CallAfter(show_result_dialog, exception, self) else: if len(odata) != 1 or len(odata[0]) != 3: show_result_dialog("Blackpoint is invalid: %s" % odata, self) self.XYZbpout = odata[0] self.gamut_mapping_inverse_a2b.Enable() allow_b2a_gamap = ("B2A0" in profile.tags and isinstance(profile.tags.B2A0, ICCP.LUT16Type) and profile.tags.B2A0.clut_grid_steps >= 17) # Allow using B2A instead of inverse A2B? self.gamut_mapping_b2a.Enable(allow_b2a_gamap) if not allow_b2a_gamap: setcfg("3dlut.gamap.use_b2a", 0) self.update_linking_controls() self.lut3d_trc_apply_ctrl_handler() self.lut3d_rendering_intent_label.Show() self.lut3d_rendering_intent_ctrl.Show() self.panel.GetSizer().Layout() self.update_layout() self.Thaw() setattr(self, "%s_profile" % which, profile) if which == "output" and not self.output_profile_ctrl.IsShown(): return setcfg("3dlut.%s.profile" % which, profile.fileName) self.lut3d_create_btn.Enable(bool(getcfg("3dlut.input.profile")) and os.path.isfile(getcfg("3dlut.input.profile")) and ((bool(getcfg("3dlut.output.profile")) and os.path.isfile(getcfg("3dlut.output.profile"))) or profile.profileClass == "link") and (getcfg("3dlut.format") != "madVR" or self.output_profile_ctrl.IsShown())) return profile getattr(self, "%s_profile_ctrl" % which).SetPath(getcfg("3dlut.%s.profile" % which)) else: if which == "input": getattr(self, "%s_profile_ctrl" % which).SetPath(getcfg("3dlut.%s.profile" % which)) self.lut3d_update_encoding_controls() else: if not silent: setattr(self, "%s_profile" % which, None) setcfg("3dlut.%s.profile" % which, None) if which == "output": self.lut3d_apply_cal_cb.Disable() self.lut3d_create_btn.Disable() def setup_language(self): BaseFrame.setup_language(self) for which in ("input", "abstract", "output"): msg = {"input": lang.getstr("3dlut.input.profile"), "abstract": lang.getstr("3dlut.use_abstract_profile"), "output": lang.getstr("output.profile")}[which] kwargs = dict(toolTip=msg.rstrip(":"), dialogTitle=msg, fileMask=lang.getstr("filetype.icc") + "|*.icc;*.icm") ctrl = getattr(self, "%s_profile_ctrl" % which) for name, value in kwargs.iteritems(): setattr(ctrl, name, value) self.lut3d_setup_language() def lut3d_setup_language(self): # Shared with main window items = [] for item in ("Gamma 2.2", "trc.rec1886", "custom"): items.append(lang.getstr(item)) self.lut3d_trc_ctrl.SetItems(items) self.trc_gamma_types_ab = {0: "b", 1: "B"} self.trc_gamma_types_ba = {"b": 0, "B": 1} self.lut3d_trc_gamma_type_ctrl.SetItems([lang.getstr("trc.type.relative"), lang.getstr("trc.type.absolute")]) self.rendering_intents_ab = {} self.rendering_intents_ba = {} self.lut3d_rendering_intent_ctrl.Clear() intents = list(config.valid_values["3dlut.rendering_intent"]) if self.worker.argyll_version < [1, 8, 3]: intents.remove("lp") for i, ri in enumerate(intents): self.lut3d_rendering_intent_ctrl.Append(lang.getstr("gamap.intents." + ri)) self.rendering_intents_ab[i] = ri self.rendering_intents_ba[ri] = i self.lut3d_formats_ab = {} self.lut3d_formats_ba = {} self.lut3d_format_ctrl.Clear() i = 0 for format in config.valid_values["3dlut.format"]: if format != "madVR" or self.worker.argyll_version >= [1, 6]: self.lut3d_format_ctrl.Append(lang.getstr("3dlut.format.%s" % format)) self.lut3d_formats_ab[i] = format self.lut3d_formats_ba[format] = i i += 1 self.lut3d_size_ab = {} self.lut3d_size_ba = {} self.lut3d_size_ctrl.Clear() for i, size in enumerate(config.valid_values["3dlut.size"]): self.lut3d_size_ctrl.Append("%sx%sx%s" % ((size, ) * 3)) self.lut3d_size_ab[i] = size self.lut3d_size_ba[size] = i self.lut3d_bitdepth_ab = {} self.lut3d_bitdepth_ba = {} self.lut3d_bitdepth_input_ctrl.Clear() self.lut3d_bitdepth_output_ctrl.Clear() for i, bitdepth in enumerate(config.valid_values["3dlut.bitdepth.input"]): self.lut3d_bitdepth_input_ctrl.Append(str(bitdepth)) self.lut3d_bitdepth_output_ctrl.Append(str(bitdepth)) self.lut3d_bitdepth_ab[i] = bitdepth self.lut3d_bitdepth_ba[bitdepth] = i def lut3d_setup_encoding_ctrl(self): format = getcfg("3dlut.format") # Shared with amin window if format == "madVR": encodings = ["t"] config.defaults["3dlut.encoding.input"] = "t" config.defaults["3dlut.encoding.output"] = "t" else: encodings = list(video_encodings) config.defaults["3dlut.encoding.input"] = "n" config.defaults["3dlut.encoding.output"] = "n" if format == "eeColor": # As eeColor usually needs same input & output encoding, # and xvYCC output encoding is not supported generally, # remove xvYCC input encoding choices for eeColor encodings.remove("x") encodings.remove("X") if (self.worker.argyll_version >= [1, 7] and self.worker.argyll_version != [1, 7, 0, "_beta"]): # Argyll 1.7 beta 3 (2015-04-02) added clip WTW on input TV encoding encodings.insert(2, "T") config.valid_values["3dlut.encoding.input"] = encodings # collink: xvYCC output encoding is not supported config.valid_values["3dlut.encoding.output"] = filter(lambda v: v not in ("T", "x", "X"), encodings) self.encoding_input_ab = {} self.encoding_input_ba = {} self.encoding_output_ab = {} self.encoding_output_ba = {} self.encoding_input_ctrl.Freeze() self.encoding_input_ctrl.Clear() self.encoding_output_ctrl.Freeze() self.encoding_output_ctrl.Clear() for i, encoding in enumerate(config.valid_values["3dlut.encoding.input"]): lstr = lang.getstr("3dlut.encoding.type_%s" % encoding) self.encoding_input_ctrl.Append(lstr) self.encoding_input_ab[i] = encoding self.encoding_input_ba[encoding] = i for o, encoding in enumerate(config.valid_values["3dlut.encoding.output"]): lstr = lang.getstr("3dlut.encoding.type_%s" % encoding) self.encoding_output_ctrl.Append(lstr) self.encoding_output_ab[o] = encoding self.encoding_output_ba[encoding] = o self.encoding_input_ctrl.Thaw() self.encoding_output_ctrl.Thaw() def lut3d_set_option(self, option, v, set_changed=True): """ Set option to value and update settings state """ if (hasattr(self, "profile_settings_changed") and set_changed and getcfg("3dlut.create") and v != getcfg(option)): self.profile_settings_changed() setcfg(option, v) def update_controls(self): """ Update controls with values from the configuration """ self.panel.Freeze() self.lut3d_create_btn.Disable() self.input_profile_ctrl.SetPath(getcfg("3dlut.input.profile")) self.output_profile_ctrl.SetPath(getcfg("3dlut.output.profile")) self.input_profile_ctrl_handler(None) enable = bool(getcfg("3dlut.use_abstract_profile")) self.abstract_profile_cb.SetValue(enable) self.abstract_profile_ctrl.SetPath(getcfg("3dlut.abstract.profile")) self.abstract_profile_ctrl_handler(None) self.output_profile_ctrl_handler(None) self.lut3d_update_shared_controls() self.panel.Thaw() def lut3d_update_shared_controls(self): # Shared with main window self.lut3d_update_trc_controls() self.lut3d_rendering_intent_ctrl.SetSelection(self.rendering_intents_ba[getcfg("3dlut.rendering_intent")]) format = getcfg("3dlut.format") if format == "madVR" and self.worker.argyll_version < [1, 6]: # MadVR only available with Argyll 1.6+, fall back to IRIDAS .cube format = "cube" setcfg("3dlut.format", format) self.lut3d_format_ctrl.SetSelection(self.lut3d_formats_ba[getcfg("3dlut.format")]) self.lut3d_size_ctrl.SetSelection(self.lut3d_size_ba[getcfg("3dlut.size")]) self.lut3d_enable_size_controls() self.lut3d_bitdepth_input_ctrl.SetSelection(self.lut3d_bitdepth_ba[getcfg("3dlut.bitdepth.input")]) self.lut3d_bitdepth_output_ctrl.SetSelection(self.lut3d_bitdepth_ba[getcfg("3dlut.bitdepth.output")]) self.lut3d_show_bitdepth_controls() if self.Parent: self.Parent.lut3d_update_shared_controls() def lut3d_update_trc_control(self): if (getcfg("3dlut.trc_gamma_type") == "B" and getcfg("3dlut.trc_output_offset") == 0 and getcfg("3dlut.trc_gamma") == 2.4): self.lut3d_trc_ctrl.SetSelection(1) # BT.1886 elif (getcfg("3dlut.trc_gamma_type") == "b" and getcfg("3dlut.trc_output_offset") == 1 and getcfg("3dlut.trc_gamma") == 2.2): self.lut3d_trc_ctrl.SetSelection(0) # Pure power gamma 2.2 else: self.lut3d_trc_ctrl.SetSelection(2) # Custom def lut3d_update_trc_controls(self): self.lut3d_update_trc_control() self.lut3d_trc_gamma_ctrl.SetValue(str(getcfg("3dlut.trc_gamma"))) self.lut3d_trc_gamma_type_ctrl.SetSelection(self.trc_gamma_types_ba[getcfg("3dlut.trc_gamma_type")]) outoffset = int(getcfg("3dlut.trc_output_offset") * 100) self.lut3d_trc_black_output_offset_ctrl.SetValue(outoffset) self.lut3d_trc_black_output_offset_intctrl.SetValue(outoffset) def update_linking_controls(self): self.gamut_mapping_inverse_a2b.SetValue( not getcfg("3dlut.gamap.use_b2a")) self.gamut_mapping_b2a.SetValue( bool(getcfg("3dlut.gamap.use_b2a"))) self.lut3d_show_trc_controls() if (hasattr(self, "input_profile") and "rTRC" in self.input_profile.tags and "gTRC" in self.input_profile.tags and "bTRC" in self.input_profile.tags and self.input_profile.tags.rTRC == self.input_profile.tags.gTRC == self.input_profile.tags.bTRC and isinstance(self.input_profile.tags.rTRC, ICCP.CurveType)): tf = self.input_profile.tags.rTRC.get_transfer_function() if (getcfg("3dlut.input.profile") != self.input_profile.fileName): # Use BT.1886 gamma mapping for SMPTE 240M / # Rec. 709 TRC setcfg("3dlut.apply_trc", int(tf[0][1] in (-240, -709) or tf[0][0].startswith("Gamma"))) # Use only BT.1886 black output offset setcfg("3dlut.apply_black_offset", int(tf[0][1] not in (-240, -709) and not tf[0][0].startswith("Gamma") and self.XYZbpin != self.XYZbpout)) self.lut3d_trc_apply_black_offset_ctrl.Enable( tf[0][1] not in (-240, -709) and self.XYZbpin != self.XYZbpout) # Set gamma to profile gamma if single gamma # profile if tf[0][0].startswith("Gamma"): if not getcfg("3dlut.trc_gamma.backup", False): # Backup current gamma setcfg("3dlut.trc_gamma.backup", getcfg("3dlut.trc_gamma")) setcfg("3dlut.trc_gamma", round(tf[0][1], 2)) # Restore previous gamma if not single gamma # profile elif getcfg("3dlut.trc_gamma.backup", False): setcfg("3dlut.trc_gamma", getcfg("3dlut.trc_gamma.backup")) setcfg("3dlut.trc_gamma.backup", None) self.lut3d_update_trc_controls() if getcfg("3dlut.apply_black_offset"): self.lut3d_trc_apply_black_offset_ctrl.SetValue(True) elif getcfg("3dlut.apply_trc"): self.lut3d_trc_apply_ctrl.SetValue(True) else: self.lut3d_trc_apply_none_ctrl.SetValue(True) def lut3d_show_bitdepth_controls(self): frozen = self.IsFrozen() if not frozen: self.Freeze() show = True input_show = show and getcfg("3dlut.format") == "3dl" self.lut3d_bitdepth_input_label.Show(input_show) self.lut3d_bitdepth_input_ctrl.Show(input_show) output_show = show and getcfg("3dlut.format") in ("3dl", "png") self.lut3d_bitdepth_output_label.Show(output_show) self.lut3d_bitdepth_output_ctrl.Show(output_show) if isinstance(self, LUT3DFrame): self.panel.GetSizer().Layout() self.update_layout() else: self.update_scrollbars() if not frozen: self.Thaw() def lut3d_show_trc_controls(self, show=True): self.panel.Freeze() show = show and self.worker.argyll_version >= [1, 6] if hasattr(self, "lut3d_trc_apply_ctrl"): self.lut3d_trc_apply_ctrl.Show(show) self.lut3d_trc_ctrl.Show(show) show = show and (self.lut3d_trc_ctrl.GetSelection() == 2 or # Custom (isinstance(self, LUT3DFrame) or getcfg("show_advanced_options"))) self.lut3d_trc_gamma_label.Show(show) self.lut3d_trc_gamma_ctrl.Show(show) show = show and ((hasattr(self, "lut3d_create_cb") and getcfg("3dlut.create")) or self.XYZbpout > [0, 0, 0]) self.lut3d_trc_gamma_type_ctrl.Show(show) self.lut3d_trc_black_output_offset_label.Show(show) self.lut3d_trc_black_output_offset_ctrl.Show(show) self.lut3d_trc_black_output_offset_intctrl.Show(show) self.lut3d_trc_black_output_offset_intctrl_label.Show(show) self.panel.Layout() self.panel.Thaw() def lut3d_show_encoding_controls(self, show=True): show = show and ((self.worker.argyll_version >= [1, 7] and self.worker.argyll_version != [1, 7, 0, "_beta"]) or self.worker.argyll_version >= [1, 6]) # Argyll 1.7 beta 3 (2015-04-02) added clip WTW on input TV encoding self.encoding_input_label.Show(show) self.encoding_input_ctrl.Show(show) show = show and self.worker.argyll_version >= [1, 6] self.encoding_output_label.Show(show) self.encoding_output_ctrl.Show(show) def lut3d_update_encoding_controls(self): self.lut3d_setup_encoding_ctrl() self.encoding_input_ctrl.SetSelection(self.encoding_input_ba[getcfg("3dlut.encoding.input")]) self.encoding_input_ctrl.Enable(self.encoding_input_ctrl.Count > 1) self.encoding_output_ctrl.SetSelection(self.encoding_output_ba[getcfg("3dlut.encoding.output")]) self.encoding_output_ctrl.Enable(getcfg("3dlut.format") not in ("eeColor", "madVR")) def lut3d_enable_size_controls(self): self.lut3d_size_ctrl.Enable(getcfg("3dlut.format") not in ("eeColor", "madVR")) def main(): config.initcfg("3DLUT-maker") lang.init() lang.update_defaults() app = BaseApp(0) app.TopWindow = LUT3DFrame(setup=False) if sys.platform == "darwin": app.TopWindow.init_menubar() wx.CallLater(1, _main, app) app.MainLoop() def _main(app): app.TopWindow.listen() app.TopWindow.setup() app.TopWindow.Show() if __name__ == "__main__": main() DisplayCAL-3.1.0.0/DisplayCAL/wxLUTViewer.py0000644000076500000000000017613512647526531020226 0ustar devwheel00000000000000# -*- coding: utf-8 -*- import math import os import re import subprocess as sp import sys import tempfile from argyll_cgats import cal_to_fake_profile, vcgt_to_cal from colormath import interp from config import (fs_enc, get_argyll_display_number, get_data_path, get_display_profile, get_display_rects, getcfg, geticon, get_verified_path, setcfg) from log import safe_print from meta import name as appname from options import debug from util_decimal import float2dec from util_os import waccess from util_str import safe_unicode from worker import (Error, UnloggedError, UnloggedInfo, Worker, get_argyll_util, make_argyll_compatible_path, show_result_dialog) from wxaddons import get_platform_window_decoration_size, wx from wxMeasureFrame import MeasureFrame from wxwindows import (BaseApp, BaseFrame, BitmapBackgroundPanelText, CustomCheckBox, FileDrop, InfoDialog, TooltipWindow) from wxfixes import GenBitmapButton as BitmapButton import colormath import config import wxenhancedplot as plot import localization as lang import ICCProfile as ICCP BGCOLOUR = "#333333" FGCOLOUR = "#999999" GRIDCOLOUR = "#444444" if sys.platform == "darwin": FONTSIZE_LARGE = 11 FONTSIZE_SMALL = 10 else: FONTSIZE_LARGE = 9 FONTSIZE_SMALL = 8 class CoordinateType(list): """ List of coordinates. [(Y, x)] where Y is in the range 0..100 and x in the range 0..255 """ def __init__(self, profile=None): self.profile = profile self._transfer_function = {} def get_gamma(self, use_vmin_vmax=False, average=True, least_squares=False, slice=(0.01, 0.99)): """ Return average or least squares gamma or a list of gamma values """ if len(self): start = slice[0] * 100 end = slice[1] * 100 values = [] for i, (y, x) in enumerate(self): n = colormath.XYZ2Lab(0, y, 0)[0] if n >= start and n <= end: values.append((x / 255.0 * 100, y)) else: # Identity if average or least_squares: return 1.0 return [1.0] vmin = 0 vmax = 100.0 if use_vmin_vmax: if len(self) > 2: vmin = self[0][0] vmax = self[-1][0] return colormath.get_gamma(values, 100.0, vmin, vmax, average, least_squares) def get_transfer_function(self, best=True, slice=(0.05, 0.95)): """ Return transfer function name, exponent and match percentage """ transfer_function = self._transfer_function.get((best, slice)) if transfer_function: return transfer_function trc = ICCP.CurveType() match = {} vmin = self[0][0] vmax = self[-1][0] best_yx = (0, 255) for i, (y, x) in enumerate(self): if x - 127.5 > 0 and x < best_yx[1]: best_yx = (y, x) gamma = colormath.get_gamma([(best_yx[1] / 255.0 * 100.0, best_yx[0])], 100.0, vmin, vmax) for name, exp in (("Rec. 709", -709), ("Rec. 1886", -1886), ("SMPTE 240M", -240), ("SMPTE 2084", -2084), ("DICOM", -1023), ("L*", -3.0), ("sRGB", -2.4), ("Gamma %.2f" % gamma, gamma)): if name in ("DICOM", "Rec. 1886", "SMPTE 2084"): if self.profile and isinstance(self.profile.tags.get("lumi"), ICCP.XYZType): white_cdm2 = self.profile.tags.lumi.Y else: white_cdm2 = 100.0 black_Y = vmin / 100.0 black_cdm2 = black_Y * white_cdm2 try: if name == "DICOM": trc.set_dicom_trc(black_cdm2, white_cdm2, size=len(self)) elif name == "Rec. 1886": trc.set_bt1886_trc(black_Y, size=len(self)) elif name == "SMPTE 2084": trc.set_smpte2084_trc(black_cdm2, white_cdm2, size=len(self)) except ValueError: continue else: trc.set_trc(exp, len(self), vmin * 655.35, vmax * 655.35) match[(name, exp)] = 0.0 count = 0 start = slice[0] * 255 end = slice[1] * 255 for i, (n, x) in enumerate(self): ##n = colormath.XYZ2Lab(0, n, 0)[0] if x >= start and x <= end: n = colormath.get_gamma([(x / 255.0 * 100, n)], 100.0, vmin, vmax, False) if n: n = n[0] ##n2 = colormath.XYZ2Lab(0, trc[i][0], 0)[0] n2 = colormath.get_gamma([(i / (len(trc) - 1.0) * 65535, trc[i])], 65535, vmin * 655.35, vmax * 655.35, False) if n2: n2 = n2[0] match[(name, exp)] += 1 - (max(n, n2) - min(n, n2)) / n2 count += 1 if count: match[(name, exp)] /= count if not best: self._transfer_function[(best, slice)] = match return match match, (name, exp) = sorted(zip(match.values(), match.keys()))[-1] self._transfer_function[(best, slice)] = (name, exp), match return (name, exp), match def set_trc(self, power=2.2, values=(), vmin=0, vmax=100): """ Set the response to a certain function. Positive power, or -2.4 = sRGB, -3.0 = L*, -240 = SMPTE 240M, -601 = Rec. 601, -709 = Rec. 709 (Rec. 601 and 709 transfer functions are identical) """ self[:] = [[y, x] for y, x in values] for i in xrange(len(self)): self[i][0] = vmin + colormath.specialpow(self[i][1] / 255.0, power) * (vmax - vmin) class PolyBox(plot.PolyLine): def __init__(self, x, y, w, h, **attr): plot.PolyLine.__init__(self, [(x, y), (x + w, y), (x + w, y + h), (x, y + h), (x, y)], **attr) class LUTCanvas(plot.PlotCanvas): def __init__(self, *args, **kwargs): plot.PlotCanvas.__init__(self, *args, **kwargs) self.Unbind(wx.EVT_SCROLL_THUMBTRACK) self.Unbind(wx.EVT_SCROLL_PAGEUP) self.Unbind(wx.EVT_SCROLL_PAGEDOWN) self.Unbind(wx.EVT_SCROLL_LINEUP) self.Unbind(wx.EVT_SCROLL_LINEDOWN) self.HandCursor = wx.StockCursor(wx.CURSOR_CROSS) self.GrabHandCursor = wx.StockCursor(wx.CURSOR_SIZING) self.SetBackgroundColour(BGCOLOUR) self.SetEnableAntiAliasing(True) self.SetEnableHiRes(True) self.SetEnableCenterLines(True) self.SetEnableDiagonals('Bottomleft-Topright') self.SetEnableDrag(True) self.SetEnableGrid(False) self.SetEnablePointLabel(True) self.SetEnableTitle(False) self.SetForegroundColour(FGCOLOUR) self.SetFontSizeAxis(FONTSIZE_SMALL) self.SetFontSizeLegend(FONTSIZE_SMALL) self.SetFontSizeTitle(FONTSIZE_LARGE) self.SetGridColour(GRIDCOLOUR) self.setLogScale((False,False)) self.SetPointLabelFunc(self.DrawPointLabel) self.canvas.BackgroundColour = BGCOLOUR if sys.platform == "win32" and sys.getwindowsversion() >= (6, ): # Enable/disable double buffering on-the-fly to make pointlabel work self.canvas.Bind(wx.EVT_ENTER_WINDOW, self._disabledoublebuffer) self.canvas.Bind(wx.EVT_LEAVE_WINDOW, self._enabledoublebuffer) self.worker = Worker(self.TopLevelParent) self.errors = [] self.resetzoom() def DrawLUT(self, vcgt=None, title=None, xLabel=None, yLabel=None, r=True, g=True, b=True): if not title: title = "" if not xLabel: xLabel = "" if not yLabel: yLabel = "" detect_increments = False Plot = plot.PolyLine Plot._attributes["width"] = 1 maxv = 65535 linear_points = [] axis_y = 255.0 if xLabel in ("L*", "Y"): axis_x = 100.0 else: axis_x = 255.0 self.axis_x, self.axis_y = (0, axis_x), (0, axis_y) if not self.last_draw: self.center_x = axis_x / 2.0 self.center_y = axis_y / 2.0 self.proportional = False self.spec_x = self.spec_y = 5 lines = [PolyBox(0, 0, axis_x, axis_y, colour=GRIDCOLOUR, width=1)] self.point_grid = [{}, {}, {}] if not vcgt: irange = range(0, 256) elif "data" in vcgt: # table data = list(vcgt['data']) while len(data) < 3: data.append(data[0]) r_points = [] g_points = [] b_points = [] if (not isinstance(vcgt, ICCP.VideoCardGammaTableType) and not isinstance(data[0], ICCP.CurveType)): # Coordinate list irange = range(0, len(data[0])) for i in xrange(len(data)): if i == 0 and r: for n, y in data[i]: if xLabel == "L*": n = colormath.XYZ2Lab(0, n / axis_x * 100, 0)[0] * (axis_x / 100.0) r_points.append([n, y]) self.point_grid[i][n] = y elif i == 1 and g: for n, y in data[i]: if xLabel == "L*": n = colormath.XYZ2Lab(0, n / axis_x * 100, 0)[0] * (axis_x / 100.0) g_points.append([n, y]) self.point_grid[i][n] = y elif i == 2 and b: for n, y in data[i]: if xLabel == "L*": n = colormath.XYZ2Lab(0, n / axis_x * 100, 0)[0] * (axis_x / 100.0) b_points.append([n, y]) self.point_grid[i][n] = y else: irange = range(0, vcgt['entryCount']) maxv = math.pow(256, vcgt['entrySize']) - 1 for i in irange: j = i * (axis_y / (vcgt['entryCount'] - 1)) if not detect_increments: linear_points.append([j, j]) if r: n = float(data[0][i]) / maxv * axis_x if not detect_increments or not r_points or \ i == vcgt['entryCount'] - 1 or n != i: if detect_increments and n != i and \ len(r_points) == 1 and i > 1 and \ r_points[-1][0] == r_points[-1][1]: r_points.append([i - 1, i - 1]) if xLabel == "L*": n = colormath.XYZ2Lab(0, n / axis_x * 100, 0)[0] * (axis_x / 100.0) if xLabel in ("L*", "Y"): r_points.append([n, j]) self.point_grid[0][n] = j else: r_points.append([j, n]) self.point_grid[0][j] = n if g: n = float(data[1][i]) / maxv * axis_x if not detect_increments or not g_points or \ i == vcgt['entryCount'] - 1 or n != i: if detect_increments and n != i and \ len(g_points) == 1 and i > 1 and \ g_points[-1][0] == g_points[-1][1]: g_points.append([i - 1, i - 1]) if xLabel == "L*": n = colormath.XYZ2Lab(0, n / axis_x * 100, 0)[0] * (axis_x / 100.0) if xLabel in ("L*", "Y"): g_points.append([n, j]) self.point_grid[1][n] = j else: g_points.append([j, n]) self.point_grid[1][j] = n if b: n = float(data[2][i]) / maxv * axis_x if not detect_increments or not b_points or \ i == vcgt['entryCount'] - 1 or n != i: if detect_increments and n != i and \ len(b_points) == 1 and i > 1 and \ b_points[-1][0] == b_points[-1][1]: b_points.append([i - 1, i - 1]) if xLabel == "L*": n = colormath.XYZ2Lab(0, n / axis_x * 100, 0)[0] * (axis_x / 100.0) if xLabel in ("L*", "Y"): b_points.append([n, j]) self.point_grid[2][n] = j else: b_points.append([j, n]) self.point_grid[2][j] = n else: # formula irange = range(0, 256) step = 100.0 / axis_y r_points = [] g_points = [] b_points = [] for i in irange: # float2dec(v) fixes miniscule deviations in the calculated gamma # n = float2dec(n, 8) if not detect_increments: linear_points.append([i, (i)]) if r: vmin = float2dec(vcgt["redMin"] * axis_x) v = float2dec(math.pow(step * i / 100.0, vcgt["redGamma"])) vmax = float2dec(vcgt["redMax"] * axis_x) n = vmin + v * (vmax - vmin) if xLabel == "L*": n = colormath.XYZ2Lab(0, float(n) / axis_x * 100, 0)[0] * (axis_x / 100.0) if xLabel in ("L*", "Y"): r_points.append([n, i]) self.point_grid[0][n] = i else: r_points.append([i, n]) self.point_grid[0][i] = n if g: vmin = float2dec(vcgt["greenMin"] * axis_x) v = float2dec(math.pow(step * i / 100.0, vcgt["greenGamma"])) vmax = float2dec(vcgt["greenMax"] * axis_x) n = vmin + v * (vmax - vmin) if xLabel == "L*": n = colormath.XYZ2Lab(0, float(n) / axis_x * 100, 0)[0] * (axis_x / 100.0) if xLabel in ("L*", "Y"): g_points.append([n, i]) self.point_grid[1][n] = i else: g_points.append([i, n]) self.point_grid[1][i] = n if b: vmin = float2dec(vcgt["blueMin"] * axis_x) v = float2dec(math.pow(step * i / 100.0, vcgt["blueGamma"])) vmax = float2dec(vcgt["blueMax"] * axis_x) n = vmin + v * (vmax - vmin) if xLabel == "L*": n = colormath.XYZ2Lab(0, float(n) / axis_x * 100, 0)[0] * (axis_x / 100.0) if xLabel in ("L*", "Y"): b_points.append([n, i]) self.point_grid[2][n] = i else: b_points.append([i, n]) self.point_grid[2][i] = n #for n in sorted(self.point_grid[0].keys()): #print n, self.point_grid[0].get(n), self.point_grid[1].get(n), self.point_grid[2].get(n) self.entryCount = irange[-1] + 1 linear = [[0, 0], [irange[-1], irange[-1]]] if not vcgt: if detect_increments: r_points = g_points = b_points = linear else: r_points = g_points = b_points = linear_points # Note: We need to make sure each point is a float because it # might be a decimal.Decimal, which can't be divided by floats! self.r_unique = len(set(round(float(y) / axis_y * irange[-1]) for x, y in r_points)) self.g_unique = len(set(round(float(y) / axis_y * irange[-1]) for x, y in g_points)) self.b_unique = len(set(round(float(y) / axis_y * irange[-1]) for x, y in b_points)) legend = [] colour = None if r and g and b and r_points == g_points == b_points: colour = 'white' points = r_points legend.append('R') legend.append('G') legend.append('B') elif r and g and r_points == g_points: colour = 'yellow' points = r_points legend.append('R') legend.append('G') elif r and b and r_points == b_points: colour = 'magenta' points = b_points legend.append('R') legend.append('B') elif g and b and g_points == b_points: colour = 'cyan' points = b_points legend.append('G') legend.append('B') else: if r: legend.append('R') if g: legend.append('G') if b: legend.append('B') linear_points = [(i, int(round(v / axis_y * maxv))) for i, v in linear_points] if colour and points: # Note: We need to make sure each point is a float because it # might be a decimal.Decimal, which can't be divided by floats! points_quantized = [(i, int(round(float(v) / axis_y * maxv))) for i, v in points] suffix = ((', ' + lang.getstr('linear').capitalize()) if points_quantized == (linear if detect_increments else linear_points) else '') lines.append(Plot(points, legend='='.join(legend) + suffix, colour=colour)) if colour != 'white': if r and colour not in ('yellow', 'magenta'): # Note: We need to make sure each point is a float because it # might be a decimal.Decimal, which can't be divided by floats! points_quantized = [(i, int(round(float(v) / axis_y * maxv))) for i, v in r_points] suffix = ((', ' + lang.getstr('linear').capitalize()) if points_quantized == (linear if detect_increments else linear_points) else '') lines.append(Plot(r_points, legend='R' + suffix, colour='red')) if g and colour not in ('yellow', 'cyan'): # Note: We need to make sure each point is a float because # it might be a decimal.Decimal, which can't be divided by floats! points_quantized = [(i, int(round(float(v) / axis_y * maxv))) for i, v in g_points] suffix = ((', ' + lang.getstr('linear').capitalize()) if points_quantized == (linear if detect_increments else linear_points) else '') lines.append(Plot(g_points, legend='G' + suffix, colour='green')) if b and colour not in ('cyan', 'magenta'): # Note: We need to make sure each point is a float because # it might be a decimal.Decimal, which can't be divided by floats! points_quantized = [(i, int(round(float(v) / axis_y * maxv))) for i, v in b_points] suffix = ((', ' + lang.getstr('linear').capitalize()) if points_quantized == (linear if detect_increments else linear_points) else '') lines.append(Plot(b_points, legend='B' + suffix, colour='#0080FF')) self._DrawCanvas(plot.PlotGraphics(lines, title, " ".join([xLabel, lang.getstr("in")]), " ".join([yLabel, lang.getstr("out")]))) def DrawPointLabel(self, dc, mDataDict): """ Draw point labels. dc - DC that will be passed mDataDict - Dictionary of data that you want to use for the pointLabel """ if not self.last_draw: return graphics, xAxis, yAxis= self.last_draw # sizes axis to axis type, create lower left and upper right corners of plot if xAxis is None or yAxis is None: # One or both axis not specified in Draw p1, p2 = graphics.boundingBox() # min, max points of graphics if xAxis is None: xAxis = self._axisInterval(self._xSpec, p1[0], p2[0]) # in user units if yAxis is None: yAxis = self._axisInterval(self._ySpec, p1[1], p2[1]) # Adjust bounding box for axis spec p1[0],p1[1] = xAxis[0], yAxis[0] # lower left corner user scale (xmin,ymin) p2[0],p2[1] = xAxis[1], yAxis[1] # upper right corner user scale (xmax,ymax) else: # Both axis specified in Draw p1= plot._Numeric.array([xAxis[0], yAxis[0]]) # lower left corner user scale (xmin,ymin) p2= plot._Numeric.array([xAxis[1], yAxis[1]]) # upper right corner user scale (xmax,ymax) ptx,pty,rectWidth,rectHeight= self._point2ClientCoord(p1, p2) # allow graph to overlap axis lines by adding units to width and height dc.SetClippingRegion(ptx,pty,rectWidth+2,rectHeight+2) dc.SetPen(wx.Pen(wx.WHITE, 1, wx.DOT)) dc.SetBrush(wx.Brush( wx.WHITE, wx.SOLID ) ) sx, sy = mDataDict["scaledXY"] # Scaled x, y of closest point dc.DrawLine(0, sy, ptx+rectWidth+2, sy) dc.DrawLine(sx, 0, sx, pty+rectHeight+2) def GetClosestPoints(self, pntXY, pointScaled= True): """Returns list with [curveNumber, legend, index of closest point, pointXY, scaledXY, distance] list for each curve. Returns [] if no curves are being plotted. x, y in user coords if pointScaled == True based on screen coords if pointScaled == False based on user coords """ if self.last_draw is None: #no graph available return [] graphics, xAxis, yAxis= self.last_draw l = [] for curveNum,obj in enumerate(graphics): #check there are points in the curve if len(obj.points) == 0 or isinstance(obj, PolyBox): continue #go to next obj #[curveNumber, legend, index of closest point, pointXY, scaledXY, distance] cn = [curveNum]+ [obj.getLegend()]+ obj.getClosestPoint( pntXY, pointScaled) l.append(cn) return l def _disabledoublebuffer(self, event): window = self while window: if not isinstance(window, wx.TopLevelWindow): window.SetDoubleBuffered(False) window = window.Parent event.Skip() def _enabledoublebuffer(self, event): window = self while window: if not isinstance(window, wx.TopLevelWindow): window.SetDoubleBuffered(True) window = window.Parent event.Skip() def OnMouseDoubleClick(self, event): if self.last_draw: boundingbox = self.last_draw[0].boundingBox() else: boundingbox = None self.resetzoom(boundingbox=boundingbox) if self.last_draw: self.center() def OnMouseLeftDown(self,event): self.erase_pointlabel() self._zoomCorner1[0], self._zoomCorner1[1]= self._getXY(event) self._screenCoordinates = plot._Numeric.array(event.GetPosition()) if self._dragEnabled: self.SetCursor(self.GrabHandCursor) self.canvas.CaptureMouse() def OnMouseLeftUp(self, event): if self._dragEnabled: self.SetCursor(self.HandCursor) if self.canvas.HasCapture(): self.canvas.ReleaseMouse() self._set_center() if hasattr(self.TopLevelParent, "OnMotion"): self.TopLevelParent.OnMotion(event) def _DrawCanvas(self, graphics): """ Draw proportionally correct, center and zoom """ w = float(self.GetSize()[0] or 1) h = float(self.GetSize()[1] or 1) if w > 45: w -= 45 if h > 20: h -= 20 ratio = [w / h, h / w] axis_x, axis_y = self.axis_x, self.axis_y spec_x = self.spec_x spec_y = self.spec_y if self._zoomfactor < 1: while spec_x * self._zoomfactor < self.spec_x / 2.0: spec_x *= 2 while spec_y * self._zoomfactor < self.spec_y / 2.0: spec_y *= 2 else: while spec_x * self._zoomfactor > self.spec_x * 2: spec_x /= 2 while spec_y * self._zoomfactor > self.spec_y * 2: spec_y /= 2 if self.proportional: if ratio[0] > ratio[1]: self.SetXSpec(spec_x * self._zoomfactor * ratio[0]) else: self.SetXSpec(spec_x * self._zoomfactor) if ratio[0] > 1: axis_x=tuple([v * ratio[0] for v in axis_x]) if ratio[1] > ratio[0]: self.SetYSpec(spec_y * self._zoomfactor * ratio[1]) else: self.SetYSpec(spec_y * self._zoomfactor) if ratio[1] > 1: axis_y=tuple([v * ratio[1] for v in axis_y]) else: self.SetXSpec(spec_x * self._zoomfactor) self.SetYSpec(spec_y * self._zoomfactor) x, y = self.center_x, self.center_y w = (axis_x[1] - axis_x[0]) * self._zoomfactor h = (axis_y[1] - axis_y[0]) * self._zoomfactor axis_x = (x - w / 2, x + w / 2) axis_y = (y - h / 2, y + h / 2) self.Draw(graphics, axis_x, axis_y) def _set_center(self): """ Set center position from current X and Y axis """ if not self.last_draw: return axis_x = self.GetXCurrentRange() axis_y = self.GetYCurrentRange() if axis_x[0] < 0: if axis_x[1] < 0: x = axis_x[0] + (abs(axis_x[0]) - abs(axis_x[1])) / 2.0 else: x = axis_x[0] + (abs(axis_x[1]) + abs(axis_x[0])) / 2.0 else: x = axis_x[0] + (abs(axis_x[1]) - abs(axis_x[0])) / 2.0 if axis_y[0] < 0: if axis_y[1] < 0: y = axis_y[0] + (abs(axis_y[0]) - abs(axis_y[1])) / 2.0 else: y = axis_y[0] + (abs(axis_y[1]) + abs(axis_y[0])) / 2.0 else: y = axis_y[0] + (abs(axis_y[1]) - abs(axis_y[0])) / 2.0 self.center_x, self.center_y = x, y def center(self, boundingbox=None): """ Center the current graphic """ if boundingbox: # Min, max points of graphics p1, p2 = boundingbox # In user units min_x, max_x = self._axisInterval(self._xSpec, p1[0], p2[0]) min_y, max_y = self._axisInterval(self._ySpec, p1[1], p2[1]) else: min_x, max_x = self.GetXMaxRange() min_y, max_y = self.GetYMaxRange() self.center_x = 0 + sum((min_x, max_x)) / 2.0 self.center_y = 0 + sum((min_y, max_y)) / 2.0 if not boundingbox: self.erase_pointlabel() self._DrawCanvas(self.last_draw[0]) def erase_pointlabel(self): if self.GetEnablePointLabel() and self.last_PointLabel: # Erase point label self._drawPointLabel(self.last_PointLabel) self.last_PointLabel = None def resetzoom(self, boundingbox=None): self.center_x = 0 self.center_y = 0 self._zoomfactor = 1.0 if boundingbox: # Min, max points of graphics p1, p2 = boundingbox # In user units min_x, max_x = self._axisInterval(self._xSpec, p1[0], p2[0]) min_y, max_y = self._axisInterval(self._ySpec, p1[1], p2[1]) max_abs_x = abs(min_x) + max_x max_abs_y = abs(min_y) + max_y max_abs_axis_x = (abs(self.axis_x[0]) + self.axis_x[1]) max_abs_axis_y = (abs(self.axis_y[0]) + self.axis_y[1]) w = float(self.GetSize()[0] or 1) h = float(self.GetSize()[1] or 1) if w > 45: w -= 45 if h > 20: h -= 20 ratio = [w / h, h / w] if ratio[0] > 1: max_abs_axis_x *= ratio[0] if ratio[1] > 1: max_abs_axis_y *= ratio[1] if max_abs_x / max_abs_y > max_abs_axis_x / max_abs_axis_y: self._zoomfactor = max_abs_x / max_abs_axis_x else: self._zoomfactor = max_abs_y / max_abs_axis_y def zoom(self, direction=1): _zoomfactor = .025 * direction if (self._zoomfactor + _zoomfactor > 0 and self._zoomfactor + _zoomfactor <= 5): self._zoomfactor += _zoomfactor self._set_center() self.erase_pointlabel() self._DrawCanvas(self.last_draw[0]) class LUTFrame(BaseFrame): def __init__(self, *args, **kwargs): if len(args) < 3 and not "title" in kwargs: kwargs["title"] = lang.getstr("calibration.lut_viewer.title") if not "name" in kwargs: kwargs["name"] = "lut_viewer" BaseFrame.__init__(self, *args, **kwargs) self.SetIcons(config.get_icon_bundle([256, 48, 32, 16], appname + "-curve-viewer")) self.profile = None self.xLabel = lang.getstr("in") self.yLabel = lang.getstr("out") self.sizer = wx.BoxSizer(wx.VERTICAL) self.SetSizer(self.sizer) panel = wx.Panel(self) panel.SetBackgroundColour(BGCOLOUR) self.sizer.Add(panel, flag=wx.EXPAND) panel.SetSizer(wx.FlexGridSizer(0, 5, 0, 8)) panel.Sizer.AddGrowableCol(0) panel.Sizer.AddGrowableCol(4) panel.Sizer.Add((1,1)) panel.Sizer.Add((1,12)) panel.Sizer.Add((1,12)) panel.Sizer.Add((1,12)) panel.Sizer.Add((1,1)) panel.Sizer.Add((1,1)) self.plot_mode_select = wx.Choice(panel, -1, size=(-1, -1), choices=[]) panel.Sizer.Add(self.plot_mode_select, flag=wx.ALIGN_CENTER_VERTICAL) self.Bind(wx.EVT_CHOICE, self.plot_mode_select_handler, id=self.plot_mode_select.GetId()) self.tooltip_btn = BitmapButton(panel, -1, geticon(16, "dialog-information"), style=wx.NO_BORDER) self.tooltip_btn.SetBackgroundColour(BGCOLOUR) self.tooltip_btn.Bind(wx.EVT_BUTTON, self.tooltip_handler) self.tooltip_btn.SetToolTipString(lang.getstr("gamut_plot.tooltip")) panel.Sizer.Add(self.tooltip_btn, flag=wx.ALIGN_CENTER_VERTICAL) self.save_plot_btn = BitmapButton(panel, -1, geticon(16, "camera-photo"), style=wx.NO_BORDER) self.save_plot_btn.SetBackgroundColour(BGCOLOUR) panel.Sizer.Add(self.save_plot_btn, flag=wx.ALIGN_CENTER_VERTICAL) self.save_plot_btn.Bind(wx.EVT_BUTTON, self.SaveFile) self.save_plot_btn.SetToolTipString(lang.getstr("save_as") + " " + "(*.bmp, *.xbm, *.xpm, *.jpg, *.png)") self.save_plot_btn.Disable() panel.Sizer.Add((1,1)) panel.Sizer.Add((1,1)) panel.Sizer.Add((1,4)) panel.Sizer.Add((1,4)) panel.Sizer.Add((1,4)) panel.Sizer.Add((1,1)) self.client = LUTCanvas(self) self.sizer.Add(self.client, 1, wx.EXPAND) self.box_panel = wx.Panel(self) self.box_panel.SetBackgroundColour(BGCOLOUR) self.sizer.Add(self.box_panel, flag=wx.EXPAND) self.status = BitmapBackgroundPanelText(self) self.status.SetMaxFontSize(11) self.status.label_y = 8 self.status.textshadow = False self.status.SetBackgroundColour(BGCOLOUR) self.status.SetForegroundColour(FGCOLOUR) h = self.status.GetTextExtent("Ig")[1] self.status.SetMinSize((0, h * 2 + 18)) self.sizer.Add(self.status, flag=wx.EXPAND) self.box_sizer = wx.FlexGridSizer(0, 3, 4, 4) self.box_sizer.AddGrowableCol(0) self.box_sizer.AddGrowableCol(2) self.box_panel.SetSizer(self.box_sizer) self.box_sizer.Add((0, 0)) hsizer = wx.BoxSizer(wx.HORIZONTAL) self.box_sizer.Add(hsizer, flag=wx.ALIGN_CENTER | wx.BOTTOM | wx.TOP, border=4) self.rendering_intent_select = wx.Choice(self.box_panel, -1, choices=[lang.getstr("gamap.intents.a"), lang.getstr("gamap.intents.r"), lang.getstr("gamap.intents.p"), lang.getstr("gamap.intents.s")]) hsizer.Add((10, self.rendering_intent_select.Size[1])) hsizer.Add(self.rendering_intent_select, flag=wx.ALIGN_CENTER_VERTICAL) self.rendering_intent_select.Bind(wx.EVT_CHOICE, self.rendering_intent_select_handler) self.rendering_intent_select.SetSelection(1) self.direction_select = wx.Choice(self.box_panel, -1, choices=[lang.getstr("direction.backward"), lang.getstr("direction.forward.inverted")]) hsizer.Add(self.direction_select, flag=wx.ALIGN_CENTER_VERTICAL | wx.LEFT, border=10) self.direction_select.Bind(wx.EVT_CHOICE, self.direction_select_handler) self.direction_select.SetSelection(0) self.show_actual_lut_cb = CustomCheckBox(self.box_panel, -1, lang.getstr("calibration.show_actual_lut")) self.show_actual_lut_cb.SetForegroundColour(FGCOLOUR) self.show_actual_lut_cb.SetMaxFontSize(11) hsizer.Add(self.show_actual_lut_cb, flag=wx.ALIGN_CENTER | wx.ALIGN_CENTER_VERTICAL) self.show_actual_lut_cb.Bind(wx.EVT_CHECKBOX, self.show_actual_lut_handler) self.box_sizer.Add((0, 0)) self.box_sizer.Add((0, 0)) self.cbox_sizer = wx.BoxSizer(wx.HORIZONTAL) self.box_sizer.Add(self.cbox_sizer, flag=wx.ALIGN_CENTER | wx.ALIGN_CENTER_VERTICAL | wx.TOP, border=4) self.box_sizer.Add((0, 0)) self.cbox_sizer.Add((10, 0)) self.reload_vcgt_btn = BitmapButton(self.box_panel, -1, geticon(16, "stock_refresh"), style=wx.NO_BORDER) self.reload_vcgt_btn.SetBackgroundColour(BGCOLOUR) self.cbox_sizer.Add(self.reload_vcgt_btn, flag=wx.ALIGN_CENTER_VERTICAL | wx.RIGHT, border=8) self.reload_vcgt_btn.Bind(wx.EVT_BUTTON, self.reload_vcgt_handler) self.reload_vcgt_btn.SetToolTipString( lang.getstr("calibration.load_from_display_profile")) self.reload_vcgt_btn.Disable() self.apply_bpc_btn = BitmapButton(self.box_panel, -1, geticon(16, "black_point"), style=wx.NO_BORDER) self.apply_bpc_btn.SetBackgroundColour(BGCOLOUR) self.cbox_sizer.Add(self.apply_bpc_btn, flag=wx.ALIGN_CENTER_VERTICAL | wx.RIGHT, border=8) self.apply_bpc_btn.Bind(wx.EVT_BUTTON, self.apply_bpc_handler) self.apply_bpc_btn.SetToolTipString(lang.getstr("black_point_compensation")) self.apply_bpc_btn.Disable() self.install_vcgt_btn = BitmapButton(self.box_panel, -1, geticon(16, "install"), style=wx.NO_BORDER) self.install_vcgt_btn.SetBackgroundColour(BGCOLOUR) self.cbox_sizer.Add(self.install_vcgt_btn, flag=wx.ALIGN_CENTER_VERTICAL | wx.RIGHT, border=8) self.install_vcgt_btn.Bind(wx.EVT_BUTTON, self.install_vcgt_handler) self.install_vcgt_btn.SetToolTipString(lang.getstr("apply_cal")) self.install_vcgt_btn.Disable() self.save_vcgt_btn = BitmapButton(self.box_panel, -1, geticon(16, "media-floppy"), style=wx.NO_BORDER) self.save_vcgt_btn.SetBackgroundColour(BGCOLOUR) self.cbox_sizer.Add(self.save_vcgt_btn, flag=wx.ALIGN_CENTER_VERTICAL | wx.RIGHT, border=20) self.save_vcgt_btn.Bind(wx.EVT_BUTTON, self.SaveFile) self.save_vcgt_btn.SetToolTipString(lang.getstr("save_as") + " " + "(*.cal)") self.save_vcgt_btn.Disable() self.show_as_L = CustomCheckBox(self.box_panel, -1, u"L* \u2192") self.show_as_L.SetForegroundColour(FGCOLOUR) self.show_as_L.SetMaxFontSize(11) self.show_as_L.SetValue(True) self.cbox_sizer.Add(self.show_as_L, flag=wx.ALIGN_CENTER_VERTICAL | wx.RIGHT, border=4) self.show_as_L.Bind(wx.EVT_CHECKBOX, self.DrawLUT) self.toggle_red = CustomCheckBox(self.box_panel, -1, "R") self.toggle_red.SetForegroundColour(FGCOLOUR) self.toggle_red.SetMaxFontSize(11) self.toggle_red.SetValue(True) self.cbox_sizer.Add(self.toggle_red, flag=wx.ALIGN_CENTER_VERTICAL) self.toggle_red.Bind(wx.EVT_CHECKBOX, self.DrawLUT) self.cbox_sizer.Add((4, 0)) self.toggle_green = CustomCheckBox(self.box_panel, -1, "G") self.toggle_green.SetForegroundColour(FGCOLOUR) self.toggle_green.SetMaxFontSize(11) self.toggle_green.SetValue(True) self.cbox_sizer.Add(self.toggle_green, flag=wx.ALIGN_CENTER_VERTICAL) self.toggle_green.Bind(wx.EVT_CHECKBOX, self.DrawLUT) self.cbox_sizer.Add((4, 0)) self.toggle_blue = CustomCheckBox(self.box_panel, -1, "B") self.toggle_blue.SetForegroundColour(FGCOLOUR) self.toggle_blue.SetMaxFontSize(11) self.toggle_blue.SetValue(True) self.cbox_sizer.Add(self.toggle_blue, flag=wx.ALIGN_CENTER_VERTICAL) self.toggle_blue.Bind(wx.EVT_CHECKBOX, self.DrawLUT) self.toggle_clut = CustomCheckBox(self.box_panel, -1, "LUT") self.toggle_clut.SetForegroundColour(FGCOLOUR) self.toggle_clut.SetMaxFontSize(11) self.cbox_sizer.Add(self.toggle_clut, flag=wx.ALIGN_CENTER_VERTICAL | wx.LEFT, border=16) self.toggle_clut.Bind(wx.EVT_CHECKBOX, self.toggle_clut_handler) self.client.canvas.Bind(wx.EVT_MOTION, self.OnMotion) self.droptarget = FileDrop(self) self.droptarget.drophandlers = { ".cal": self.drop_handler, ".icc": self.drop_handler, ".icm": self.drop_handler } self.client.SetDropTarget(self.droptarget) border, titlebar = get_platform_window_decoration_size() self.MinSize = (config.defaults["size.lut_viewer.w"] + border * 2, config.defaults["size.lut_viewer.h"] + titlebar + border) self.SetSaneGeometry( getcfg("position.lut_viewer.x"), getcfg("position.lut_viewer.y"), getcfg("size.lut_viewer.w") + border * 2, getcfg("size.lut_viewer.h") + titlebar + border) self.Bind(wx.EVT_MOVE, self.OnMove) self.Bind(wx.EVT_SIZE, self.OnSize) children = self.GetAllChildren() self.Bind(wx.EVT_KEY_DOWN, self.key_handler) for child in children: if isinstance(child, wx.Choice): child.SetMaxFontSize(11) child.Bind(wx.EVT_KEY_DOWN, self.key_handler) child.Bind(wx.EVT_MOUSEWHEEL, self.OnWheel) if (sys.platform == "win32" and sys.getwindowsversion() >= (6, ) and isinstance(child, wx.Panel)): # No need to enable double buffering under Linux and Mac OS X. # Under Windows, enabling double buffering on the panel seems # to work best to reduce flicker. child.SetDoubleBuffered(True) self.display_no = -1 self.display_rects = get_display_rects() def apply_bpc_handler(self, event): cal = vcgt_to_cal(self.profile) cal.filename = self.profile.fileName or "" cal.apply_bpc(weight=True) self.LoadProfile(cal_to_fake_profile(cal)) def drop_handler(self, path): """ Drag'n'drop handler for .cal/.icc/.icm files. """ filename, ext = os.path.splitext(path) if ext.lower() not in (".icc", ".icm"): profile = cal_to_fake_profile(path) if not profile: InfoDialog(self, msg=lang.getstr("error.file.open", path), ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error")) profile = None else: try: profile = ICCP.ICCProfile(path) except (IOError, ICCP.ICCProfileInvalidError), exception: InfoDialog(self, msg=lang.getstr("profile.invalid") + "\n" + path, ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error")) profile = None self.show_actual_lut_cb.SetValue(False) self.current_cal = profile self.LoadProfile(profile) get_display = MeasureFrame.__dict__["get_display"] def handle_errors(self): if self.client.errors: show_result_dialog(Error("\n\n".join(set(safe_unicode(error) for error in self.client.errors))), self) self.client.errors = [] def install_vcgt_handler(self, event): cwd = self.worker.create_tempdir() if isinstance(cwd, Exception): show_result_dialog(cwd, self) else: cal = os.path.join(cwd, re.sub(r"[\\/:*?\"<>|]+", "", make_argyll_compatible_path( self.profile.getDescription() or "Video LUT"))) vcgt_to_cal(self.profile).write(cal) cmd, args = self.worker.prepare_dispwin(cal) if isinstance(cmd, Exception): show_result_dialog(cmd, self) elif cmd: result = self.worker.exec_cmd(cmd, args, capture_output=True, skip_scripts=True) if isinstance(result, Exception): show_result_dialog(result, self) elif not result: show_result_dialog(Error("".join(self.worker.errors)), self) # Important: # Make sure to only delete the temporary cal file we created try: os.remove(cal) except Exception, exception: safe_print(u"Warning - temporary file " u"'%s' could not be removed: %s" % tuple(safe_unicode(s) for s in (cal, exception))) def key_handler(self, event): # AltDown # CmdDown # ControlDown # GetKeyCode # GetModifiers # GetPosition # GetRawKeyCode # GetRawKeyFlags # GetUniChar # GetUnicodeKey # GetX # GetY # HasModifiers # KeyCode # MetaDown # Modifiers # Position # RawKeyCode # RawKeyFlags # ShiftDown # UnicodeKey # X # Y key = event.GetKeyCode() if (event.ControlDown() or event.CmdDown()): # CTRL (Linux/Mac/Windows) / CMD (Mac) if key == 83 and self.profile: # S self.SaveFile() return else: event.Skip() elif key in (43, wx.WXK_NUMPAD_ADD): # + key zoom in self.client.zoom(-1) elif key in (45, wx.WXK_NUMPAD_SUBTRACT): # - key zoom out self.client.zoom(1) else: event.Skip() def direction_select_handler(self, event): self.toggle_clut_handler(event) def rendering_intent_select_handler(self, event): self.toggle_clut_handler(event) def toggle_clut_handler(self, event): try: self.lookup_tone_response_curves() except Exception, exception: show_result_dialog(exception, self) else: self.trc = None self.DrawLUT() self.handle_errors() def tooltip_handler(self, event): if not hasattr(self, "tooltip_window"): self.tooltip_window = TooltipWindow(self, msg=event.EventObject.ToolTip.Tip, title=event.EventObject.TopLevelParent.Title, bitmap=geticon(32, "dialog-information")) else: self.tooltip_window.Show() self.tooltip_window.Raise() def show_actual_lut_handler(self, event): setcfg("lut_viewer.show_actual_lut", int(self.show_actual_lut_cb.GetValue())) if hasattr(self, "current_cal"): profile = self.current_cal else: profile = None self.load_lut(profile=profile) def load_lut(self, profile=None): self.current_cal = profile if (getcfg("lut_viewer.show_actual_lut") and (self.worker.argyll_version[0:3] > [1, 1, 0] or (self.worker.argyll_version[0:3] == [1, 1, 0] and not "Beta" in self.worker.argyll_version_string)) and not config.is_untethered_display()): tmp = self.worker.create_tempdir() if isinstance(tmp, Exception): show_result_dialog(tmp, self) return outfilename = os.path.join(tmp, re.sub(r"[\\/:*?\"<>|]+", "", make_argyll_compatible_path( config.get_display_name( include_geometry=True) or "Video LUT"))) result = self.worker.save_current_video_lut(self.worker.get_display(), outfilename, silent=not __name__ == "__main__") if not isinstance(result, Exception) and result: profile = cal_to_fake_profile(outfilename) else: if isinstance(result, Exception): safe_print(result) # Important: lut_viewer_load_lut is called after measurements, # so make sure to only delete the temporary cal file we created try: os.remove(outfilename) except Exception, exception: safe_print(u"Warning - temporary file " u"'%s' could not be removed: %s" % tuple(safe_unicode(s) for s in (outfilename, exception))) if profile and (profile.is_loaded or not profile.fileName or os.path.isfile(profile.fileName)): if not self.profile or \ self.profile.fileName != profile.fileName or \ not self.profile.isSame(profile): self.LoadProfile(profile) else: self.LoadProfile(None) def lookup_tone_response_curves(self, intent="r"): """ Lookup Y -> RGB tone values through TRC tags or LUT """ mult = 2 size = 256 * mult # Final number of coordinates if hasattr(self, "rendering_intent_select"): intent = {0: "a", 1: "r", 2: "p", 3: "s"}.get(self.rendering_intent_select.GetSelection()) use_trc_tags = (intent == "r" and (not ("B2A0" in self.profile.tags or "A2B0" in self.profile.tags) or not self.toggle_clut.GetValue()) and isinstance(self.rTRC, ICCP.CurveType) and isinstance(self.gTRC, ICCP.CurveType) and isinstance(self.bTRC, ICCP.CurveType) and len(self.rTRC) == len(self.gTRC) == len(self.bTRC)) has_same_trc = self.rTRC == self.gTRC == self.bTRC profile = self.profile if profile.version >= 4: self.client.errors.append(Error("\n".join([lang.getstr("profile.iccv4.unsupported"), profile.getDescription()]))) return if (profile.colorSpace not in ("RGB", "GRAY") or profile.connectionColorSpace not in ("Lab", "XYZ")): if profile.colorSpace not in ("RGB", "GRAY"): unsupported_colorspace = profile.colorSpace else: unsupported_colorspace = profile.connectionColorSpace self.client.errors.append(Error(lang.getstr("profile.unsupported", (profile.profileClass, unsupported_colorspace)))) return if profile.colorSpace == "GRAY": direction = "b" elif "B2A0" in profile.tags: direction = {0: "b", 1: "if", 2: "f", 3: "ib"}.get(self.direction_select.GetSelection()) else: direction = "if" # Prepare input Lab values XYZ_triplets = [] Lab_triplets = [] RGB_triplets = [] for i in xrange(0, size): if direction in ("b", "if"): ##if intent == "a": ### Experimental - basically this makes the resulting ### response match relative colorimetric ##X, Y, Z = colormath.Lab2XYZ(i * (100.0 / (size - 1)), 0, 0) ##L, a, b = colormath.XYZ2Lab(*[v * 100 for v in ##colormath.adapt(X, Y, Z, ##whitepoint_destination=profile.tags.wtpt.values())]) ##else: a = b = 0 Lab_triplets.append([i * (100.0 / (size - 1)), a, b]) else: RGB_triplets.append([i * (1.0 / (size - 1))] * 3) if profile.colorSpace == "GRAY": use_icclu = True pcs = "x" for Lab in Lab_triplets: XYZ_triplets.append(colormath.Lab2XYZ(*Lab)) else: use_icclu = False pcs = "l" if direction in ("b", "if"): if pcs == "l": idata = Lab_triplets else: idata = XYZ_triplets else: idata = RGB_triplets order = {True: "n", False: "r"}.get(("B2A0" in self.profile.tags or "A2B0" in self.profile.tags) and self.toggle_clut.GetValue()) # Lookup values through 'input' profile using xicclu try: odata = self.worker.xicclu(profile, idata, intent, direction, order, pcs, use_icclu=use_icclu) except Exception, exception: self.client.errors.append(Error(safe_unicode(exception))) if self.client.errors: return if direction in ("b", "if"): RGB_triplets = odata else: Lab_triplets = odata self.rTRC = CoordinateType(self.profile) self.gTRC = CoordinateType(self.profile) self.bTRC = CoordinateType(self.profile) for j, RGB in enumerate(RGB_triplets): for i, v in enumerate(RGB): v = min(v, 1.0) if (not v and j < len(RGB_triplets) - 1 and not min(RGB_triplets[j + 1][i], 1.0)): continue v *= 255 X, Y, Z = colormath.Lab2XYZ(*Lab_triplets[j], **{"scale": 100}) if direction in ("b", "if"): X = Z = Y elif intent == "a": wp = profile.tags.wtpt.ir.values() X, Y, Z = colormath.adapt(X, Y, Z, wp, (1, 1, 1)) if i == 0: self.rTRC.append([X, v]) elif i == 1: self.gTRC.append([Y, v]) elif i == 2: self.bTRC.append([Z, v]) if use_trc_tags: if has_same_trc: self.bTRC = self.gTRC = self.rTRC return # Generate interpolated TRCs for transfer function detection for sig in ("rTRC", "gTRC", "bTRC"): x, xp, y, yp = [], [], [], [] # First, get actual values for i, (Y, v) in enumerate(getattr(self, sig)): ##if not i or Y >= trc[sig][i - 1]: xp.append(v) yp.append(Y) # Second, interpolate to given size and use the same y axis # for all channels for i in xrange(size): x.append(i / (size - 1.0) * 255) y.append(colormath.Lab2XYZ(i / (size - 1.0) * 100, 0, 0)[1] * 100) xi = interp(y, yp, xp) yi = interp(x, xi, y) setattr(self, "tf_" + sig, CoordinateType(self.profile)) for Y, v in zip(yi, x): if Y <= yp[0]: Y = yp[0] getattr(self, "tf_" + sig).append([Y, v]) def move_handler(self, event): if not self.IsShownOnScreen(): return display_no, geometry, client_area = self.get_display() if display_no != self.display_no: self.display_no = display_no # Translate from wx display index to Argyll display index n = get_argyll_display_number(geometry) if n is not None: # Save Argyll display index to configuration setcfg("display.number", n + 1) # Load profile self.load_lut(get_display_profile(n)) event.Skip() def plot_mode_select_handler(self, event): self.client.resetzoom() self.DrawLUT() wx.CallAfter(self.client.center) def get_commands(self): return self.get_common_commands() + ["curve-viewer [filename]", "load "] def process_data(self, data): if (data[0] == "curve-viewer" and len(data) < 3) or (data[0] == "load" and len(data) == 2): if self.IsIconized(): self.Restore() self.Raise() if len(data) == 2: path = data[1] if not os.path.isfile(path) and not os.path.isabs(path): path = get_data_path(path) if not path: return "fail" else: self.droptarget.OnDropFiles(0, 0, [path]) return "ok" return "invalid" def reload_vcgt_handler(self, event): cmd, args = self.worker.prepare_dispwin(True) if isinstance(cmd, Exception): show_result_dialog(cmd, self) elif cmd: result = self.worker.exec_cmd(cmd, args, capture_output=True, skip_scripts=True) if isinstance(result, Exception): show_result_dialog(result, self) elif not result: show_result_dialog(UnloggedError("".join(self.worker.errors)), self) else: self.load_lut(get_display_profile()) def LoadProfile(self, profile): if profile and not isinstance(profile, ICCP.ICCProfile): try: profile = ICCP.ICCProfile(profile) except (IOError, ICCP.ICCProfileInvalidError), exception: show_result_dialog(Error(lang.getstr("profile.invalid") + "\n" + profile), self) profile = None if not profile: profile = ICCP.ICCProfile() profile._data = "\0" * 128 profile._tags.desc = ICCP.TextDescriptionType("", "desc") profile.size = len(profile.data) profile.is_loaded = True if profile.getDescription(): title = u" \u2014 ".join([lang.getstr("calibration.lut_viewer.title"), profile.getDescription()]) else: title = lang.getstr("calibration.lut_viewer.title") self.SetTitle(title) self.profile = profile self.rTRC = self.tf_rTRC = profile.tags.get("rTRC", profile.tags.get("kTRC")) self.gTRC = self.tf_gTRC = profile.tags.get("gTRC", profile.tags.get("kTRC")) self.bTRC = self.tf_bTRC = profile.tags.get("bTRC", profile.tags.get("kTRC")) self.trc = None curves = [] curves.append(lang.getstr('vcgt')) self.client.errors = [] self.toggle_clut.SetValue("B2A0" in profile.tags or "A2B0" in profile.tags) if ((self.rTRC and self.gTRC and self.bTRC) or (self.toggle_clut.GetValue() and profile.colorSpace in ("RGB", "GRAY"))): try: self.lookup_tone_response_curves() except Exception, exception: wx.CallAfter(show_result_dialog, exception, self) else: curves.append(lang.getstr('[rgb]TRC')) selection = self.plot_mode_select.GetSelection() center = False if curves and (selection < 0 or selection > len(curves) - 1): selection = 0 center = True self.plot_mode_select.SetItems(curves) self.plot_mode_select.Enable(len(curves) > 1) self.plot_mode_select.SetSelection(selection) self.cbox_sizer.Layout() self.box_sizer.Layout() self.DrawLUT() if center: wx.CallAfter(self.client.center) wx.CallAfter(self.handle_errors) def add_tone_values(self, legend): if not self.profile: return colorants = legend[0] if (self.plot_mode_select.GetSelection() == 0 and 'vcgt' in self.profile.tags): if 'R' in colorants or 'G' in colorants or 'B' in colorants: legend.append(lang.getstr("tone_values")) if '=' in colorants: unique = [] if 'R' in colorants: unique.append(self.client.r_unique) if 'G' in colorants: unique.append(self.client.g_unique) if 'B' in colorants: unique.append(self.client.b_unique) unique = min(unique) legend[-1] += " %.1f%% (%i/%i)" % (unique / (self.client.entryCount / 100.0), unique, self.client.entryCount) else: if 'R' in colorants: legend[-1] += " %.1f%% (%i/%i)" % (self.client.r_unique / (self.client.entryCount / 100.0), self.client.r_unique, self.client.entryCount) if 'G' in colorants: legend[-1] += " %.1f%% (%i/%i)" % (self.client.g_unique / (self.client.entryCount / 100.0), self.client.g_unique, self.client.entryCount) if 'B' in colorants: legend[-1] += " %.1f%% (%i/%i)" % (self.client.b_unique / (self.client.entryCount / 100.0), self.client.b_unique, self.client.entryCount) unique = [] unique.append(self.client.r_unique) unique.append(self.client.g_unique) unique.append(self.client.b_unique) if not 0 in unique and not "R=G=B" in colorants: unique = min(unique) legend[-1] += ", %s %.1f%% (%i/%i)" % (lang.getstr("grayscale"), unique / (self.client.entryCount / 100.0), unique, self.client.entryCount) elif (self.plot_mode_select.GetSelection() == 1 and isinstance(self.tf_rTRC, (ICCP.CurveType, CoordinateType)) and len(self.tf_rTRC) > 1 and isinstance(self.tf_gTRC, (ICCP.CurveType, CoordinateType)) and len(self.tf_gTRC) > 1 and isinstance(self.tf_bTRC, (ICCP.CurveType, CoordinateType)) and len(self.tf_bTRC) > 1): transfer_function = None if (not getattr(self, "trc", None) and len(self.tf_rTRC) == len(self.tf_gTRC) == len(self.tf_bTRC)): if isinstance(self.tf_rTRC, ICCP.CurveType): self.trc = ICCP.CurveType(profile=self.profile) for i in xrange(len(self.tf_rTRC)): self.trc.append((self.tf_rTRC[i] + self.tf_gTRC[i] + self.tf_bTRC[i]) / 3.0) else: self.trc = CoordinateType(self.profile) for i in xrange(len(self.tf_rTRC)): self.trc.append([(self.tf_rTRC[i][0] + self.tf_gTRC[i][0] + self.tf_bTRC[i][0]) / 3.0, (self.tf_rTRC[i][1] + self.tf_gTRC[i][1] + self.tf_bTRC[i][1]) / 3.0]) if getattr(self, "trc", None): transfer_function = self.trc.get_transfer_function(slice=(0.00, 1.00)) #if "R" in colorants and "G" in colorants and "B" in colorants: #if self.profile.tags.rTRC == self.profile.tags.gTRC == self.profile.tags.bTRC: #transfer_function = self.profile.tags.rTRC.get_transfer_function() #elif ("R" in colorants and #(not "G" in colorants or #self.profile.tags.rTRC == self.profile.tags.gTRC) and #(not "B" in colorants or #self.profile.tags.rTRC == self.profile.tags.bTRC)): #transfer_function = self.profile.tags.rTRC.get_transfer_function() #elif ("G" in colorants and #(not "R" in colorants or #self.profile.tags.gTRC == self.profile.tags.rTRC) and #(not "B" in colorants or #self.profile.tags.gTRC == self.profile.tags.bTRC)): #transfer_function = self.profile.tags.gTRC.get_transfer_function() #elif ("B" in colorants and #(not "G" in colorants or #self.profile.tags.bTRC == self.profile.tags.gTRC) and #(not "R" in colorants or #self.profile.tags.bTRC == self.profile.tags.rTRC)): #transfer_function = self.profile.tags.bTRC.get_transfer_function() if transfer_function and transfer_function[1] >= .95: if self.tf_rTRC == self.tf_gTRC == self.tf_bTRC: label = lang.getstr("rgb.trc") else: label = lang.getstr("rgb.trc.averaged") if round(transfer_function[1], 2) == 1.0: value = u"%s" % (transfer_function[0][0]) else: value = u"≈ %s (Δ %.2f%%)" % (transfer_function[0][0], 100 - transfer_function[1] * 100) legend.append(" ".join([label, value])) def DrawLUT(self, event=None): self.SetStatusText('') self.Freeze() curves = None if self.profile: if self.plot_mode_select.GetSelection() == 0: if 'vcgt' in self.profile.tags: curves = self.profile.tags['vcgt'] else: curves = None elif (self.plot_mode_select.GetSelection() == 1 and isinstance(self.rTRC, (ICCP.CurveType, CoordinateType)) and isinstance(self.gTRC, (ICCP.CurveType, CoordinateType)) and isinstance(self.bTRC, (ICCP.CurveType, CoordinateType))): if (len(self.rTRC) == 1 and len(self.gTRC) == 1 and len(self.bTRC) == 1): # gamma curves = { 'redMin': 0.0, 'redGamma': self.rTRC[0], 'redMax': 1.0, 'greenMin': 0.0, 'greenGamma': self.gTRC[0], 'greenMax': 1.0, 'blueMin': 0.0, 'blueGamma': self.bTRC[0], 'blueMax': 1.0 } else: # curves curves = { 'data': [self.rTRC, self.gTRC, self.bTRC], 'entryCount': len(self.rTRC), 'entrySize': 2 } yLabel = [] if self.toggle_red.GetValue(): yLabel.append("R") if self.toggle_green.GetValue(): yLabel.append("G") if self.toggle_blue.GetValue(): yLabel.append("B") if self.plot_mode_select.GetSelection() == 0: self.xLabel = "".join(yLabel) else: if self.show_as_L.GetValue(): self.xLabel = "L*" else: self.xLabel = "Y" self.yLabel = "".join(yLabel) self.toggle_red.Enable(bool(curves)) self.toggle_green.Enable(bool(curves)) self.toggle_blue.Enable(bool(curves)) self.show_as_L.Enable(bool(curves)) self.show_as_L.Show(self.plot_mode_select.GetSelection() != 0) self.toggle_clut.Show(self.plot_mode_select.GetSelection() == 1 and ("B2A0" in self.profile.tags or "A2B0" in self.profile.tags)) self.toggle_clut.Enable(self.plot_mode_select.GetSelection() == 1 and isinstance(self.profile.tags.get("rTRC"), ICCP.CurveType) and isinstance(self.profile.tags.get("gTRC"), ICCP.CurveType) and isinstance(self.profile.tags.get("bTRC"), ICCP.CurveType)) self.save_plot_btn.Enable(bool(curves)) if hasattr(self, "reload_vcgt_btn"): self.reload_vcgt_btn.Enable(not(self.plot_mode_select.GetSelection()) and bool(self.profile)) self.reload_vcgt_btn.Show(not(self.plot_mode_select.GetSelection())) if hasattr(self, "apply_bpc_btn"): enable_bpc = (not(self.plot_mode_select.GetSelection()) and bool(self.profile) and isinstance(self.profile.tags.get("vcgt"), ICCP.VideoCardGammaType)) if enable_bpc: values = self.profile.tags.vcgt.getNormalizedValues() self.apply_bpc_btn.Enable(enable_bpc and values[0] != (0, 0, 0)) self.apply_bpc_btn.Show(not(self.plot_mode_select.GetSelection())) if hasattr(self, "install_vcgt_btn"): self.install_vcgt_btn.Enable(not(self.plot_mode_select.GetSelection()) and bool(self.profile) and isinstance(self.profile.tags.get("vcgt"), ICCP.VideoCardGammaType)) self.install_vcgt_btn.Show(not(self.plot_mode_select.GetSelection())) if hasattr(self, "save_vcgt_btn"): self.save_vcgt_btn.Enable(not(self.plot_mode_select.GetSelection()) and bool(self.profile) and isinstance(self.profile.tags.get("vcgt"), ICCP.VideoCardGammaType)) self.save_vcgt_btn.Show(not(self.plot_mode_select.GetSelection())) if hasattr(self, "show_actual_lut_cb"): self.show_actual_lut_cb.Show(self.plot_mode_select.GetSelection() == 0) if hasattr(self, "rendering_intent_select"): self.rendering_intent_select.Show(self.plot_mode_select.GetSelection() == 1) if hasattr(self, "direction_select"): self.direction_select.Show(self.toggle_clut.IsShown() and self.toggle_clut.GetValue() and "B2A0" in self.profile.tags and "A2B0" in self.profile.tags) self.show_as_L.GetContainingSizer().Layout() if hasattr(self, "cbox_sizer"): self.cbox_sizer.Layout() if hasattr(self, "box_sizer"): self.box_sizer.Layout() if self.client.last_PointLabel != None: self.client._drawPointLabel(self.client.last_PointLabel) #erase old self.client.last_PointLabel = None wx.CallAfter(self.client.DrawLUT, curves, xLabel=self.xLabel, yLabel=self.yLabel, r=self.toggle_red.GetValue() if hasattr(self, "toggle_red") else False, g=self.toggle_green.GetValue() if hasattr(self, "toggle_green") else False, b=self.toggle_blue.GetValue() if hasattr(self, "toggle_blue") else False) self.Thaw() def OnClose(self, event): self.listening = False if self.worker.tempdir and os.path.isdir(self.worker.tempdir): self.worker.wrapup(False) config.writecfg(module="curve-viewer", options=("display.number", )) event.Skip() def OnMotion(self, event): if isinstance(event, wx.MouseEvent): if not event.LeftIsDown(): self.UpdatePointLabel(self.client._getXY(event)) else: self.client.erase_pointlabel() event.Skip() # Go to next handler def OnMove(self, event=None): if self.IsShownOnScreen() and not \ self.IsMaximized() and not self.IsIconized(): x, y = self.GetScreenPosition() setcfg("position.lut_viewer.x", x) setcfg("position.lut_viewer.y", y) if event: event.Skip() def OnSize(self, event=None): if self.IsShownOnScreen() and not \ self.IsMaximized() and not self.IsIconized(): w, h = self.GetSize() border, titlebar = get_platform_window_decoration_size() setcfg("size.lut_viewer.w", w - border * 2) setcfg("size.lut_viewer.h", h - titlebar - border) if event: event.Skip() if sys.platform == "win32": # Needed under Windows when using double buffering self.Refresh() def OnWheel(self, event): xy = wx.GetMousePosition() if self.client.last_draw: if event.WheelRotation < 0: direction = 1.0 else: direction = -1.0 self.client.zoom(direction) def SaveFile(self, event=None): """Saves the file to the type specified in the extension. If no file name is specified a dialog box is provided. Returns True if sucessful, otherwise False. .bmp Save a Windows bitmap file. .xbm Save an X bitmap file. .xpm Save an XPM bitmap file. .png Save a Portable Network Graphics file. .jpg Save a Joint Photographic Experts Group file. """ fileName = " ".join([self.plot_mode_select.GetStringSelection(), os.path.basename(os.path.splitext(self.profile.fileName or lang.getstr("unnamed"))[0])]) if (event and hasattr(self, "save_vcgt_btn") and event.GetId() == self.save_vcgt_btn.GetId()): extensions = {"cal": 1} defType = "cal" else: extensions = { "bmp": wx.BITMAP_TYPE_BMP, # Save a Windows bitmap file. "xbm": wx.BITMAP_TYPE_XBM, # Save an X bitmap file. "xpm": wx.BITMAP_TYPE_XPM, # Save an XPM bitmap file. "jpg": wx.BITMAP_TYPE_JPEG, # Save a JPG file. "png": wx.BITMAP_TYPE_PNG, # Save a PNG file. } defType = "png" fileName += "." + defType fType = None dlg1 = None while fType not in extensions: if dlg1: # FileDialog exists: Check for extension InfoDialog(self, msg=lang.getstr("error.file_type_unsupported"), ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error")) else: # FileDialog doesn't exist: just check one dlg1 = wx.FileDialog( self, lang.getstr("save_as"), get_verified_path("last_filedialog_path")[0], fileName, "|".join(["%s (*.%s)|*.%s" % (ext.upper(), ext, ext) for ext in sorted(extensions.keys())]), wx.SAVE|wx.OVERWRITE_PROMPT ) dlg1.SetFilterIndex(sorted(extensions.keys()).index(defType)) if dlg1.ShowModal() == wx.ID_OK: fileName = dlg1.GetPath() if not waccess(fileName, os.W_OK): show_result_dialog(Error(lang.getstr("error.access_denied.write", fileName)), self) return fType = fileName[-3:].lower() setcfg("last_filedialog_path", fileName) else: # exit without saving dlg1.Destroy() return False if dlg1: dlg1.Destroy() # Save Bitmap if (event and hasattr(self, "save_vcgt_btn") and event.GetId() == self.save_vcgt_btn.GetId()): res = vcgt_to_cal(self.profile) res.write(fileName) else: res= self.client._Buffer.SaveFile(fileName, extensions.get(fType, ".png")) return res def SetStatusText(self, text): self.status.Label = text self.status.Refresh() def UpdatePointLabel(self, xy): if self.client.GetEnablePointLabel(): # Show closest point (when enbled) # Make up dict with info for the point label dlst = self.client.GetClosestPoint(xy, pointScaled=True) if dlst != [] and hasattr(self.client, "point_grid"): curveNum, legend, pIndex, pointXY, scaledXY, distance = dlst legend = legend.split(", ") R, G, B = (self.client.point_grid[0].get(pointXY[0], 0 if self.toggle_red.GetValue() else None), self.client.point_grid[1].get(pointXY[0], 0 if self.toggle_green.GetValue() else None), self.client.point_grid[2].get(pointXY[0], 0 if self.toggle_blue.GetValue() else None)) if (self.plot_mode_select.GetSelection() == 0 or R == G == B or ((R == G or G == B or R == B) and None in (R, G ,B))): rgb = "" else: rgb = legend[0] + " " if self.plot_mode_select.GetSelection() == 1: joiner = u" \u2192 " if self.show_as_L.GetValue(): format = "L* %.4f", "%s %.2f" else: format = "Y %.4f", "%s %.2f" axis_y = 100.0 if R == G == B or ((R == G or G == B or R == B) and None in (R, G ,B)): #if R is None: RGB = " ".join(["=".join(["%s" % v for v, s in filter(lambda v: v[1] is not None, (("R", R), ("G", G), ("B", B)))]), "%.2f" % pointXY[1]]) #else: #RGB = "R=G=B %.2f" % R else: RGB = " ".join([format[1] % (v, s) for v, s in filter(lambda v: v[1] is not None, (("R", R), ("G", G), ("B", B)))]) legend[0] = joiner.join([format[0] % pointXY[0], RGB]) pointXY = pointXY[1], pointXY[0] else: joiner = u" \u2192 " format = "%.2f", "%.2f" axis_y = 255.0 legend[0] += " " + joiner.join([format[i] % point for i, point in enumerate(pointXY)]) if (len(legend) == 1 and pointXY[0] > 0 and pointXY[0] < 255 and pointXY[1] > 0): y = pointXY[1] if (self.plot_mode_select.GetSelection() == 1 and self.show_as_L.GetValue()): y = colormath.Lab2XYZ(y, 0, 0)[1] * 100 legend.append(rgb + "Gamma %.2f" % (math.log(y / axis_y) / math.log(pointXY[0] / 255.0))) self.add_tone_values(legend) legend = [", ".join(legend[:-1])] + [legend[-1]] self.SetStatusText("\n".join(legend)) # Make up dictionary to pass to DrawPointLabel mDataDict= {"curveNum": curveNum, "legend": legend, "pIndex": pIndex, "pointXY": pointXY, "scaledXY": scaledXY} # Pass dict to update the point label self.client.UpdatePointLabel(mDataDict) def update_controls(self): self.show_actual_lut_cb.Enable((self.worker.argyll_version[0:3] > [1, 1, 0] or (self.worker.argyll_version[0:3] == [1, 1, 0] and not "Beta" in self.worker.argyll_version_string)) and not config.is_untethered_display()) self.show_actual_lut_cb.SetValue(bool(getcfg("lut_viewer.show_actual_lut")) and not config.is_untethered_display()) @property def worker(self): return self.client.worker def main(): config.initcfg("curve-viewer") # Backup display config cfg_display = getcfg("display.number") lang.init() lang.update_defaults() app = BaseApp(0) app.TopWindow = LUTFrame(None, -1) app.TopWindow.Bind(wx.EVT_CLOSE, app.TopWindow.OnClose, app.TopWindow) if sys.platform == "darwin": app.TopWindow.init_menubar() wx.CallLater(1, _main, app) app.MainLoop() def _main(app): app.TopWindow.listen() app.TopWindow.worker.enumerate_displays_and_ports(check_lut_access=False, enumerate_ports=False) app.TopWindow.display_no, geometry, client_area = app.TopWindow.get_display() app.TopWindow.Bind(wx.EVT_MOVE, app.TopWindow.move_handler, app.TopWindow) display_no = get_argyll_display_number(geometry) setcfg("display.number", display_no + 1) app.TopWindow.update_controls() for arg in sys.argv[1:]: if os.path.isfile(arg): app.TopWindow.drop_handler(safe_unicode(arg)) break else: app.TopWindow.load_lut(get_display_profile(display_no)) app.TopWindow.Show() if __name__ == '__main__': main() DisplayCAL-3.1.0.0/DisplayCAL/wxMeasureFrame.py0000644000076500000000000004732712647526531020754 0ustar devwheel00000000000000# -*- coding: utf-8 -*- import os import re import sys import config import localization as lang from config import (defaults, getcfg, geticon, get_argyll_display_number, get_default_dpi, get_display_number, get_display_rects, scale_adjustment_factor, setcfg, writecfg) from debughelpers import handle_error from log import safe_print from meta import name as appname from options import debug from util_list import floatlist, strlist from util_str import safe_unicode from wxaddons import wx from wxwindows import BaseApp, ConfirmDialog, InfoDialog, InvincibleFrame from wxfixes import GenBitmapButton as BitmapButton try: import RealDisplaySizeMM as RDSMM except ImportError, exception: RDSMM = None handle_error(u"Error - couldn't import RealDisplaySizeMM: " + safe_unicode(exception), silent=True) def get_default_size(): """ Get and return the default size for the window in pixels. The default size is always equivalent to 100 x 100 mm according to the display's size as returned by the RealDisplaySizeMM function, which uses the same code as Argyll to determine that size. This function is used internally. """ display_sizes = [] display_sizes_mm = [] for display_no in xrange(len(getcfg("displays"))): display_no = get_display_number(display_no) display_size = wx.Display(display_no).Geometry[2:] display_size_mm = [] if RDSMM: try: display_size_mm = RDSMM.RealDisplaySizeMM(display_no) except Exception, exception: handle_error(u"Error - RealDisplaySizeMM() failed: " + safe_unicode(exception), silent=True) else: display_size_mm = floatlist(display_size_mm) if debug: safe_print("[D] display_size_mm:", display_size_mm) if not len(display_size_mm) or 0 in display_size_mm: ppi_def = get_default_dpi() method = 1 if method == 0: # use configurable screen diagonal inch = 20.0 mm = inch * 25.4 f = mm / math.sqrt(math.pow(display_size[0], 2) + \ math.pow(display_size[1], 2)) w_mm = math.sqrt(math.pow(mm, 2) - \ math.pow(display_size[1] * f, 2)) h_mm = math.sqrt(math.pow(mm, 2) - \ math.pow(display_size[0] * f, 2)) display_size_mm = w_mm, h_mm elif method == 1: # use the first display display_size_1st = wx.DisplaySize() display_size_mm = floatlist(wx.DisplaySizeMM()) if 0 in display_size_mm: # bogus display_size_mm = [display_size_1st[0] / ppi_def * 25.4, display_size_1st[1] / ppi_def * 25.4] if display_no > 0: display_size_mm[0] = display_size[0] / ( display_size_1st[0] / display_size_mm[0]) display_size_mm[1] = display_size[1] / ( display_size_1st[1] / display_size_mm[1]) else: # use assumed ppi display_size_mm = (display_size[0] / ppi_def * 25.4, display_size[1] / ppi_def * 25.4) display_sizes.append(display_size) display_sizes_mm.append(display_size_mm) if sum(mm[0] for mm in display_sizes_mm) / \ len(display_sizes_mm) == display_sizes_mm[0][0] and \ sum(mm[1] for mm in display_sizes_mm) / \ len(display_sizes_mm) == display_sizes_mm[0][1]: # display_size_mm is the same for all screens, use the 1st one display_size = display_sizes[0] display_size_mm = display_sizes_mm[0] else: if getcfg("display_lut.link"): display_no = getcfg("display.number") - 1 else: display_no = getcfg("display_lut.number") - 1 display_size = display_sizes[display_no] display_size_mm = display_sizes_mm[display_no] px_per_mm = (display_size[0] / display_size_mm[0], display_size[1] / display_size_mm[1]) if debug: safe_print("[D] H px_per_mm:", px_per_mm[0]) safe_print("[D] V px_per_mm:", px_per_mm[1]) return round(100.0 * max(px_per_mm)) class MeasureFrame(InvincibleFrame): """ A rectangular window to set the measure area size for dispcal/dispread. """ exitcode = 1 def __init__(self, parent=None, id=-1): InvincibleFrame.__init__(self, parent, id, lang.getstr("measureframe.title"), style=wx.DEFAULT_FRAME_STYLE & ~(wx.RESIZE_BORDER | wx.MAXIMIZE_BOX), name="measureframe") self.SetIcons(config.get_icon_bundle([256, 48, 32, 16], appname)) self.Bind(wx.EVT_CLOSE, self.close_handler, self) self.Bind(wx.EVT_MOVE, self.move_handler, self) self.panel = wx.Panel(self, -1) self.sizer = wx.GridSizer(3, 1, 0, 0) self.panel.SetSizer(self.sizer) self.hsizer = wx.BoxSizer(wx.HORIZONTAL) self.sizer.Add(self.hsizer, flag=wx.ALIGN_CENTER_HORIZONTAL | wx.ALL | wx.ALIGN_TOP, border=10) self.zoommaxbutton = BitmapButton(self.panel, -1, geticon(32, "zoom-best-fit"), style=wx.NO_BORDER) self.Bind(wx.EVT_BUTTON, self.zoommax_handler, self.zoommaxbutton) self.hsizer.Add(self.zoommaxbutton, flag=wx.ALIGN_CENTER) self.zoommaxbutton.SetToolTipString(lang.getstr("measureframe.zoommax")) self.hsizer.Add((2, 1)) self.zoominbutton = BitmapButton(self.panel, -1, geticon(32, "zoom-in"), style=wx.NO_BORDER) self.Bind(wx.EVT_BUTTON, self.zoomin_handler, self.zoominbutton) self.hsizer.Add(self.zoominbutton, flag=wx.ALIGN_CENTER) self.zoominbutton.SetToolTipString(lang.getstr("measureframe.zoomin")) self.hsizer.Add((2, 1)) self.zoomnormalbutton = BitmapButton(self.panel, -1, geticon(32, "zoom-original"), style=wx.NO_BORDER) self.Bind(wx.EVT_BUTTON, self.zoomnormal_handler, self.zoomnormalbutton) self.hsizer.Add(self.zoomnormalbutton, flag=wx.ALIGN_CENTER) self.zoomnormalbutton.SetToolTipString(lang.getstr("measureframe." "zoomnormal")) self.hsizer.Add((2, 1)) self.zoomoutbutton = BitmapButton(self.panel, -1, geticon(32, "zoom-out"), style=wx.NO_BORDER) self.Bind(wx.EVT_BUTTON, self.zoomout_handler, self.zoomoutbutton) self.hsizer.Add(self.zoomoutbutton, flag=wx.ALIGN_CENTER) self.zoomoutbutton.SetToolTipString(lang.getstr("measureframe.zoomout")) self.centerbutton = BitmapButton(self.panel, -1, geticon(32, "window-center"), style=wx.NO_BORDER) self.Bind(wx.EVT_BUTTON, self.center_handler, self.centerbutton) self.sizer.Add(self.centerbutton, flag=wx.ALIGN_CENTER | wx.LEFT | wx.RIGHT, border=10) self.centerbutton.SetToolTipString(lang.getstr("measureframe.center")) self.vsizer = wx.BoxSizer(wx.VERTICAL) self.sizer.Add(self.vsizer, flag=wx.ALIGN_BOTTOM | wx.ALIGN_CENTER_HORIZONTAL) self.measure_darken_background_cb = wx.CheckBox(self.panel, -1, lang.getstr("measure.darken_background")) self.measure_darken_background_cb.SetValue( bool(int(getcfg("measure.darken_background")))) self.Bind(wx.EVT_CHECKBOX, self.measure_darken_background_ctrl_handler, id=self.measure_darken_background_cb.GetId()) self.vsizer.Add(self.measure_darken_background_cb, flag=wx.ALIGN_BOTTOM | wx.ALIGN_CENTER_HORIZONTAL | wx.LEFT | wx.RIGHT | wx.TOP, border=10) self.measurebutton = wx.Button(self.panel, -1, lang.getstr("measureframe.measurebutton")) self.Bind(wx.EVT_BUTTON, self.measure_handler, self.measurebutton) self.vsizer.Add(self.measurebutton, flag=wx.ALIGN_BOTTOM | wx.ALIGN_CENTER_HORIZONTAL | wx.ALL, border=10) self.measurebutton.SetMaxFontSize(11) self.measurebutton.SetDefault() self.measurebutton.SetFocus() self.display_no = wx.Display.GetFromWindow(self) self.display_rects = get_display_rects() def measure_darken_background_ctrl_handler(self, event): if self.measure_darken_background_cb.GetValue() and \ getcfg("measure.darken_background.show_warning"): dlg = ConfirmDialog(self, msg=lang.getstr("measure.darken_background." "warning"), ok=lang.getstr("ok"), cancel=lang.getstr("cancel"), bitmap=geticon(32, "dialog-warning")) chk = wx.CheckBox(dlg, -1, lang.getstr("dialog.do_not_show_again")) dlg.Bind(wx.EVT_CHECKBOX, self.measure_darken_background_warning_handler, id=chk.GetId()) dlg.sizer3.Add(chk, flag=wx.TOP | wx.ALIGN_LEFT, border=12) dlg.sizer0.SetSizeHints(dlg) dlg.sizer0.Layout() rslt = dlg.ShowModal() if rslt == wx.ID_CANCEL: self.measure_darken_background_cb.SetValue(False) setcfg("measure.darken_background", int(self.measure_darken_background_cb.GetValue())) def measure_darken_background_warning_handler(self, event): setcfg("measure.darken_background.show_warning", int(not event.GetEventObject().GetValue())) def info_handler(self, event): InfoDialog(self, msg=lang.getstr("measureframe.info"), ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-information"), log=False) def measure_handler(self, event): if self.Parent and hasattr(self.Parent, "call_pending_function"): self.Parent.call_pending_function() else: MeasureFrame.exitcode = 255 self.Close() def Show(self, show=True): if show: self.measure_darken_background_cb.SetValue( bool(int(getcfg("measure.darken_background")))) if self.Parent and hasattr(self.Parent, "display_ctrl"): display_no = self.Parent.display_ctrl.GetSelection() else: display_no = getcfg('display.number') - 1 if display_no < 0 or display_no > wx.Display.GetCount() - 1: display_no = 0 else: display_no = get_display_number(display_no) x, y = wx.Display(display_no).Geometry[:2] self.SetPosition((x, y)) # place measure frame on correct display self.place_n_zoom( *floatlist(getcfg("dimensions.measureframe").split(","))) self.display_no = wx.Display.GetFromWindow(self) elif self.IsShownOnScreen(): setcfg("dimensions.measureframe", self.get_dimensions()) if self.Parent and hasattr(self.Parent, "get_set_display"): self.Parent.get_set_display() wx.Frame.Show(self, show) def Hide(self): self.Show(False) def place_n_zoom(self, x=None, y=None, scale=None): """ Place and scale the window. x, y and scale need to be in Argyll coordinates (0.0...1.0) if given. Without arguments, they are read from the user configuration. """ if debug: safe_print("[D] measureframe.place_n_zoom") if None in (x, y, scale): cur_x, cur_y, cur_scale = floatlist(self.get_dimensions().split(",")) if x is None: x = cur_x if y is None: y = cur_y if scale is None: scale = cur_scale if scale > 50.0: # Argyll max scale = 50 if debug: safe_print(" x:", x) if debug: safe_print(" y:", y) if debug: safe_print(" scale:", scale) if debug: safe_print("[D] scale_adjustment_factor:", scale_adjustment_factor) scale /= scale_adjustment_factor if debug: safe_print("[D] scale / scale_adjustment_factor:", scale) display = self.get_display(getcfg("display.number") - 1) display_client_rect = display[2] if debug: safe_print("[D] display_client_rect:", display_client_rect) display_client_size = display_client_rect[2:] if debug: safe_print("[D] display_client_size:", display_client_size) measureframe_min_size = [max(self.sizer.GetMinSize())] * 2 if debug: safe_print("[D] measureframe_min_size:", measureframe_min_size) default_measureframe_size = get_default_size() defaults["size.measureframe"] = default_measureframe_size size = [min(display_client_size[0], default_measureframe_size * scale), min(display_client_size[1], default_measureframe_size * scale)] if measureframe_min_size[0] > size[0]: size = measureframe_min_size if size[0] > display_client_size[0]: size[0] = display_client_size[0] if size[1] > display_client_size[1]: size[1] = display_client_size[1] if max(size) >= max(display_client_size): scale = 50 if debug: safe_print("[D] measureframe_size:", size) self.SetMaxSize((-1, -1)) self.SetMinSize(size) self.SetSize(size) self.SetMaxSize(size) display_rect = display[1] if debug: safe_print("[D] display_rect:", display_rect) display_size = display_rect[2:] if debug: safe_print("[D] display_size:", display_size) if sys.platform in ("darwin", "win32"): titlebar = 0 # size already includes window decorations else: titlebar = 25 # assume titlebar height of 25px measureframe_pos = [display_rect[0] + round((display_size[0] - size[0]) * x), display_rect[1] + round((display_size[1] - size[1]) * y) - titlebar] if measureframe_pos[0] < display_client_rect[0]: measureframe_pos[0] = display_client_rect[0] if measureframe_pos[1] < display_client_rect[1]: measureframe_pos[1] = display_client_rect[1] if debug: safe_print("[D] measureframe_pos:", measureframe_pos) setcfg("dimensions.measureframe", ",".join(strlist((x, y, scale)))) self.SetPosition(measureframe_pos) def zoomin_handler(self, event): if debug: safe_print("[D] measureframe_zoomin_handler") # We can't use self.get_dimensions() here because if we are near # fullscreen, next magnification step will be larger than normal display_size = self.get_display()[1][2:] default_measureframe_size = get_default_size() size = floatlist(self.GetSize()) x, y = None, None self.place_n_zoom(x, y, scale=(display_size[0] / default_measureframe_size) / (display_size[0] / size[0]) + .125) def zoomout_handler(self, event): if debug: safe_print("[D] measureframe_zoomout_handler") # We can't use self.get_dimensions() here because if we are # fullscreen, scale will be 50, thus changes won't be visible quickly display_size = self.get_display()[1][2:] default_measureframe_size = get_default_size() size = floatlist(self.GetSize()) x, y = None, None self.place_n_zoom(x, y, scale=(display_size[0] / default_measureframe_size) / (display_size[0] / size[0]) - .125) def zoomnormal_handler(self, event): if debug: safe_print("[D] measureframe_zoomnormal_handler") x, y = None, None scale = floatlist(defaults["dimensions.measureframe"].split(","))[2] self.place_n_zoom(x, y, scale=scale) def zoommax_handler(self, event): if debug: safe_print("[D] measureframe_zoommax_handler") display_client_rect = self.get_display()[2] if debug: safe_print("[D] display_client_rect:", display_client_rect) display_client_size = display_client_rect[2:] if debug: safe_print("[D] display_client_size:", display_client_size) size = self.GetSize() if debug: safe_print(" size:", size) if max(size) >= max(display_client_size) - 50: dim = getcfg("dimensions.measureframe.unzoomed") self.place_n_zoom(*floatlist(dim.split(","))) else: setcfg("dimensions.measureframe.unzoomed", self.get_dimensions()) self.place_n_zoom(x=.5, y=.5, scale=50.0) def center_handler(self, event): if debug: safe_print("[D] measureframe_center_handler") x, y = floatlist(defaults["dimensions.measureframe"].split(","))[:2] self.place_n_zoom(x, y) def close_handler(self, event): if debug: safe_print("[D] measureframe_close_handler") self.Hide() if self.Parent: self.Parent.Show() if getattr(self.Parent, "restore_measurement_mode"): self.Parent.restore_measurement_mode() if getattr(self.Parent, "restore_testchart"): self.Parent.restore_testchart() else: writecfg() self.Destroy() if MeasureFrame.exitcode != 255: MeasureFrame.exitcode = 0 def get_display(self, display_no=None): """ Get the display number, geometry and client area, taking into account separate X screens, TwinView and similar """ if wx.Display.GetCount() == 1 and len(self.display_rects) > 1: # Separate X screens, TwinView or similar display = wx.Display(0) geometry = display.Geometry union = wx.Rect() xy = [] for rect in self.display_rects: if rect[:2] in xy or rect[2:] == geometry[2:]: # Overlapping x y coordinates or screen filling whole # reported geometry, so assume separate X screens union = None break xy.append(rect[:2]) union = union.Union(rect) if union == geometry: # Assume TwinView or similar where Argyll enumerates 1+n # displays but wx only 'sees' one that is the union of them framerect = self.Rect if display_no is not None: geometry = self.display_rects[display_no] else: display_no = 0 for i, coord in enumerate(framerect[:2]): if coord < 0: framerect[i] = 0 elif coord > geometry[i + 2]: framerect[i] = geometry[i] for i, display_rect in enumerate(self.display_rects): if display_rect.Contains(framerect[:2]): display_no = i geometry = display_rect break elif display_no is None: # Assume separate X screens display_no = 0 client_rect = wx.Rect(*tuple(geometry)).Intersect(display.GetRealClientArea()) else: display_no = wx.Display.GetFromWindow(self) display = self.GetDisplay() geometry = display.Geometry client_rect = display.GetRealClientArea() return display_no, geometry, client_rect def move_handler(self, event): if not self.IsShownOnScreen(): return display_no, geometry, client_area = self.get_display() if display_no != self.display_no: self.display_no = display_no # Translate from wx display index to Argyll display index n = get_argyll_display_number(geometry) if n is not None: # Save Argyll display index to configuration setcfg("display.number", n + 1) def get_dimensions(self): """ Calculate and return the relative dimensions from the pixel values. Returns x, y and scale in Argyll coordinates (0.0...1.0). """ if debug: safe_print("[D] measureframe.get_dimensions") display = self.get_display() display_rect = display[1] display_size = display_rect[2:] display_client_rect = display[2] display_client_size = display_client_rect[2:] if debug: safe_print("[D] display_size:", display_size) if debug: safe_print("[D] display_client_size:", display_client_size) default_measureframe_size = get_default_size() if debug: safe_print("[D] default_measureframe_size:", default_measureframe_size) measureframe_pos = floatlist(self.GetScreenPosition()) measureframe_pos[0] -= display_rect[0] measureframe_pos[1] -= display_rect[1] if debug: safe_print("[D] measureframe_pos:", measureframe_pos) size = floatlist(self.GetSize()) if debug: safe_print(" size:", size) if max(size) >= max(display_client_size) - 50: # Fullscreen? scale = 50.0 # Argyll max is 50 measureframe_pos = [.5, .5] else: scale = (display_size[0] / default_measureframe_size) / \ (display_size[0] / size[0]) if debug: safe_print("[D] scale:", scale) if debug: safe_print("[D] scale_adjustment_factor:", scale_adjustment_factor) scale *= scale_adjustment_factor if size[0] >= display_client_size[0]: measureframe_pos[0] = .5 elif measureframe_pos[0] != 0: if display_size[0] - size[0] < measureframe_pos[0]: measureframe_pos[0] = display_size[0] - size[0] measureframe_pos[0] = 1.0 / ((display_size[0] - size[0]) / (measureframe_pos[0])) if size[1] >= display_client_size[1]: measureframe_pos[1] = .5 elif measureframe_pos[1] != 0: if display_size[1] - size[1] < measureframe_pos[1]: measureframe_pos[1] = display_size[1] - size[1] if sys.platform in ("darwin", "win32"): titlebar = 0 # size already includes window decorations else: titlebar = 25 # assume titlebar height of 25px measureframe_pos[1] = 1.0 / ((display_size[1] - size[1]) / (measureframe_pos[1] + titlebar)) if debug: safe_print("[D] scale:", scale) if debug: safe_print("[D] measureframe_pos:", measureframe_pos) measureframe_dimensions = ",".join(str(max(0, n)) for n in measureframe_pos + [scale]) if debug: safe_print("[D] measureframe_dimensions:", measureframe_dimensions) return measureframe_dimensions def main(): config.initcfg() lang.init() app = BaseApp(0) app.TopWindow = MeasureFrame() app.TopWindow.Show() app.MainLoop() if __name__ == "__main__": main() sys.exit(MeasureFrame.exitcode) DisplayCAL-3.1.0.0/DisplayCAL/wxProfileInfo.py0000644000076500000000000017522512647526531020613 0ustar devwheel00000000000000# -*- coding: utf-8 -*- from __future__ import with_statement import re import subprocess as sp import math import os import sys import tempfile from config import (defaults, fs_enc, get_argyll_display_number, get_data_path, get_display_profile, get_display_rects, getbitmap, getcfg, geticon, get_verified_path, profile_ext, setcfg, writecfg) from log import safe_print from meta import name as appname from options import debug from ordereddict import OrderedDict from util_io import GzipFileProper from util_list import intlist from util_os import launch_file, make_win32_compatible_long_path, waccess from util_str import safe_unicode, strtr, universal_newlines, wrap from worker import (Error, UnloggedError, UnloggedInfo, check_set_argyll_bin, get_argyll_util, make_argyll_compatible_path, show_result_dialog) from wxaddons import get_platform_window_decoration_size, wx from wxLUTViewer import LUTCanvas, LUTFrame from wxVRML2X3D import vrmlfile2x3dfile from wxwindows import (BaseApp, BaseFrame, BitmapBackgroundPanelText, CustomCheckBox, CustomGrid, CustomRowLabelRenderer, ConfirmDialog, FileDrop, InfoDialog, SimpleBook, TwoWaySplitter) from wxfixes import GenBitmapButton as BitmapButton import colormath import config import wxenhancedplot as plot import localization as lang import ICCProfile as ICCP import x3dom BGCOLOUR = "#333333" FGCOLOUR = "#999999" TEXTCOLOUR = "#333333" if sys.platform == "darwin": FONTSIZE_SMALL = 10 else: FONTSIZE_SMALL = 8 class GamutCanvas(LUTCanvas): def __init__(self, *args, **kwargs): LUTCanvas.__init__(self, *args, **kwargs) self.SetEnableTitle(False) self.SetFontSizeAxis(FONTSIZE_SMALL) self.SetFontSizeLegend(FONTSIZE_SMALL) self.pcs_data = [] self.profiles = {} self.colorspace = "a*b*" self.intent = "" self.direction = "" self.order = "" self.reset() self.resetzoom() def DrawCanvas(self, title=None, colorspace=None, whitepoint=None, center=False, show_outline=True): if not title: title = "" if colorspace: self.colorspace = colorspace # Defaults poly = plot.PolyLine poly._attributes["width"] = 3 polys = [] # L*a*b* optimalcolors = [(52.40, 95.40, 10.58), (52.33, 91.23, 38.56), (52.31, 89.09, 65.80), (52.30, 88.24, 89.93), (59.11, 84.13, 101.46), (66.02, 75.66, 113.09), (72.36, 64.33, 123.65), (78.27, 50.88, 132.94), (83.64, 36.33, 140.63), (88.22, 22.05, 145.02), (92.09, 8.49, 143.95), (90.38, -4.04, 141.05), (87.54, -23.02, 136.16), (85.18, -37.06, 132.16), (82.10, -52.65, 126.97), (85.53, -65.59, 122.51), (82.01, -81.46, 116.55), (77.35, -97.06, 108.72), (74.76, -122.57, 90.91), (68.33, -134.27, 80.11), (63.07, -152.99, 56.41), (54.57, -159.74, 42.75), (44.43, -162.58, 27.45), (46.92, -162.26, 13.87), (48.53, -144.04, -4.73), (49.50, -115.82, -25.38), (59.18, -85.50, -47.00), (59.33, -68.64, -58.79), (59.41, -52.73, -69.57), (50.80, -25.33, -84.08), (42.05, 8.67, -98.57), (33.79, 43.74, -111.63), (26.63, 74.31, -121.90), (20.61, 98.44, -128.77), (14.87, 117.34, -131.97), (9.74, 127.16, -129.59), (5.20, 125.79, -120.43), (7.59, 122.01, -116.33), (10.21, 117.89, -111.81), (26.35, 115.11, -100.95), (40.68, 115.59, -87.47), (39.37, 115.48, -78.51), (46.49, 114.84, -66.24), (53.49, 111.63, -54.17), (52.93, 107.54, -38.16), (52.58, 101.53, -16.45), (52.40, 95.40, 10.58)] # CIE 1931 2-deg chromaticity coordinates # http://www.cvrl.org/offercsvccs.php xy = [(0.175560, 0.005294), (0.175161, 0.005256), (0.174821, 0.005221), (0.174510, 0.005182), (0.174112, 0.004964), (0.174008, 0.004981), (0.173801, 0.004915), (0.173560, 0.004923), (0.173337, 0.004797), (0.173021, 0.004775), (0.172577, 0.004799), (0.172087, 0.004833), (0.171407, 0.005102), (0.170301, 0.005789), (0.168878, 0.006900), (0.166895, 0.008556), (0.164412, 0.010858), (0.161105, 0.013793), (0.156641, 0.017705), (0.150985, 0.022740), (0.143960, 0.029703), (0.135503, 0.039879), (0.124118, 0.057803), (0.109594, 0.086843), (0.091294, 0.132702), (0.068706, 0.200723), (0.045391, 0.294976), (0.023460, 0.412703), (0.008168, 0.538423), (0.003859, 0.654823), (0.013870, 0.750186), (0.038852, 0.812016), (0.074302, 0.833803), (0.114161, 0.826207), (0.154722, 0.805864), (0.192876, 0.781629), (0.229620, 0.754329), (0.265775, 0.724324), (0.301604, 0.692308), (0.337363, 0.658848), (0.373102, 0.624451), (0.408736, 0.589607), (0.444062, 0.554714), (0.478775, 0.520202), (0.512486, 0.486591), (0.544787, 0.454434), (0.575151, 0.424232), (0.602933, 0.396497), (0.627037, 0.372491), (0.648233, 0.351395), (0.665764, 0.334011), (0.680079, 0.319747), (0.691504, 0.308342), (0.700606, 0.299301), (0.707918, 0.292027), (0.714032, 0.285929), (0.719033, 0.280935), (0.723032, 0.276948), (0.725992, 0.274008), (0.728272, 0.271728), (0.729969, 0.270031), (0.731089, 0.268911), (0.731993, 0.268007), (0.732719, 0.267281), (0.733417, 0.266583), (0.734047, 0.265953), (0.734390, 0.265610), (0.734592, 0.265408), (0.734690, 0.265310), (0.734690, 0.265310), (0.734690, 0.265310), (0.734548, 0.265452), (0.734690, 0.265310), (0.734690, 0.265310), (0.734690, 0.265310), (0.734690, 0.265310), (0.734690, 0.265310), (0.734690, 0.265310), (0.734690, 0.265310), (0.734690, 0.265310), (0.734690, 0.265310), (0.734690, 0.265310), (0.734690, 0.265310), (0.734690, 0.265310), (0.734690, 0.265310), (0.734690, 0.265310), (0.734690, 0.265310), (0.734690, 0.265310), (0.734690, 0.265310), (0.734690, 0.265310), (0.734690, 0.265310), (0.734690, 0.265310), (0.734690, 0.265310), (0.734690, 0.265310), (0.734690, 0.265310)] if self.colorspace == "xy": label_x = "x" label_y = "y" if show_outline: polys.append(plot.PolySpline(xy, colour=wx.Colour(102, 102, 102, 153), width=1.75)) polys.append(plot.PolyLine([xy[0], xy[-1]], colour=wx.Colour(102, 102, 102, 153), width=1.75)) max_x = 0.75 max_y = 0.85 min_x = -.05 min_y = -.05 step = .1 elif self.colorspace == "u'v'": label_x = "u'" label_y = "v'" if show_outline: uv = [colormath.xyY2Lu_v_(x, y, 100)[1:] for x, y in xy] polys.append(plot.PolySpline(uv, colour=wx.Colour(102, 102, 102, 153), width=1.75)) polys.append(plot.PolyLine([uv[0], uv[-1]], colour=wx.Colour(102, 102, 102, 153), width=1.75)) max_x = 0.625 max_y = 0.6 min_x = -.025 min_y = -.025 step = .1 elif self.colorspace == "u*v*": # Hard to present gamut projection appropriately in 2D # because blue tones 'cave in' towards the center label_x = "u*" label_y = "v*" max_x = 150.0 max_y = 150.0 min_x = -150.0 min_y = -150.0 step = 50 elif self.colorspace == "DIN99": label_x = "a99" label_y = "b99" max_x = 50.0 max_y = 50.0 min_x = -50.0 min_y = -50.0 step = 25 elif self.colorspace in ("DIN99b", "DIN99c", "DIN99d"): if self.colorspace == "DIN99c": label_x = "a99c" label_y = "b99c" else: label_x = "a99d" label_y = "b99d" max_x = 65.0 max_y = 65.0 min_x = -65.0 min_y = -65.0 step = 25 else: label_x = "a*" label_y = "b*" max_x = 150.0 max_y = 150.0 min_x = -150.0 min_y = -150.0 step = 50 convert2coords = {"a*b*": lambda X, Y, Z: colormath.XYZ2Lab(*[v * 100 for v in X, Y, Z])[1:], "xy": lambda X, Y, Z: colormath.XYZ2xyY(X, Y, Z)[:2], "u*v*": lambda X, Y, Z: colormath.XYZ2Luv(*[v * 100 for v in X, Y, Z])[1:], "u'v'": lambda X, Y, Z: colormath.XYZ2Lu_v_(X, Y, Z)[1:], "DIN99": lambda X, Y, Z: colormath.XYZ2DIN99(*[v * 100 for v in X, Y, Z])[1:], "DIN99b": lambda X, Y, Z: colormath.XYZ2DIN99b(*[v * 100 for v in X, Y, Z])[1:], "DIN99c": lambda X, Y, Z: colormath.XYZ2DIN99c(*[v * 100 for v in X, Y, Z])[1:], "DIN99d": lambda X, Y, Z: colormath.XYZ2DIN99d(*[v * 100 for v in X, Y, Z])[1:]}[self.colorspace] if show_outline and (self.colorspace == "a*b*" or self.colorspace.startswith("DIN99")): if self.colorspace == "a*b*": optimalcolors = [Lab[1:] for Lab in optimalcolors] else: optimalcolors = [convert2coords(*colormath.Lab2XYZ(L, a, b)) for L, a, b in optimalcolors] polys.append(plot.PolySpline(optimalcolors, colour=wx.Colour(102, 102, 102, 153), width=1.75)) # Add color temp graph from 4000 to 9000K if whitepoint == 1: colortemps = [] for kelvin in xrange(4000, 25001, 100): colortemps.append(convert2coords(*colormath.CIEDCCT2XYZ(kelvin))) polys.append(plot.PolySpline(colortemps, colour=wx.Colour(255, 255, 255, 204), width=1.5)) elif whitepoint == 2: colortemps = [] for kelvin in xrange(1667, 25001, 100): colortemps.append(convert2coords(*colormath.planckianCT2XYZ(kelvin))) polys.append(plot.PolySpline(colortemps, colour=wx.Colour(255, 255, 255, 204), width=1.5)) kwargs = {"scale": 255} amount = len(self.pcs_data) for i, pcs_triplets in enumerate(reversed(self.pcs_data)): if not pcs_triplets or len(pcs_triplets) == 1: amount -= 1 continue # Convert xicclu output to coordinates coords = [] for pcs_triplet in pcs_triplets: coords.append(convert2coords(*pcs_triplet)) profile = self.profiles.get(len(self.pcs_data) - 1 - i) if (profile and profile.profileClass == "nmcl" and "ncl2" in profile.tags and isinstance(profile.tags.ncl2, ICCP.NamedColor2Type) and profile.connectionColorSpace in ("Lab", "XYZ")): # Named color profile for j, (x, y) in enumerate(coords): RGBA = colormath.XYZ2RGB(*pcs_triplets[j], **kwargs) polys.append(plot.PolyMarker([(x, y)], colour=wx.Colour(*intlist(RGBA)), size=2, marker="plus", width=1.75)) else: xy = [] for x, y in coords[:-1]: xy.append((x, y)) if i == 0 or amount == 1: if x > max_x: max_x = x if y > max_y: max_y = y if x < min_x: min_x = x if y < min_y: min_y = y xy2 = [] for j, (x, y) in enumerate(xy): xy2.append((x, y)) if len(xy2) == self.size: xy3 = [] for k, (x, y) in enumerate(xy2): xy3.append((x, y)) if len(xy3) == 2: if i == 1: # Draw comparison profile with grey outline RGBA = 102, 102, 102, 255 w = 2 else: RGBA = colormath.XYZ2RGB(*pcs_triplets[j - len(xy2) + k], **kwargs) w = 3 polys.append(poly(list(xy3), colour=wx.Colour(*intlist(RGBA)), width=w)) if i == 1: xy3 = [] else: xy3 = xy3[1:] xy2 = xy2[self.size:] # Add whitepoint x, y = coords[-1] if i == 1: # Draw comparison profile with grey outline RGBA = 204, 204, 204, 102 marker="cross" s = 1.5 w = 1.75 else: RGBA = colormath.XYZ2RGB(*pcs_triplets[-1], **kwargs) marker = "plus" s = 2 w = 1.75 polys.append(plot.PolyMarker([(x, y)], colour=wx.Colour(*intlist(RGBA)), size=s, marker=marker, width=w)) xy_range = max(abs(min_x), abs(min_y)) + max(max_x, max_y) if center or not self.last_draw: self.axis_x = self.axis_y = (min(min_x, min_y), max(max_x, max_y)) self.spec_x = xy_range / step self.spec_y = xy_range / step if polys: graphics = plot.PlotGraphics(polys, title, label_x, label_y) p1, p2 = graphics.boundingBox() spacer = plot.PolyMarker([(p1[0] - xy_range / 20.0, p1[1] - xy_range / 20.0), (p2[0] + xy_range / 20.0, p2[1] + xy_range / 20.0)], colour=wx.Colour(0x33, 0x33, 0x33), size=0) graphics.objects.append(spacer) if center or not self.last_draw: boundingbox = spacer.boundingBox() self.resetzoom(boundingbox) self.center(boundingbox) self._DrawCanvas(graphics) def reset(self): self.axis_x = self.axis_y = -128, 128 def set_pcs_data(self, i): if len(self.pcs_data) < i + 1: self.pcs_data.append([]) else: self.pcs_data[i] = [] def setup(self, profiles=None, profile_no=None, intent="a", direction="f", order="n"): self.size = 40 # Number of segments from one primary to the next secondary color if not check_set_argyll_bin(): return # Setup xicclu xicclu = get_argyll_util("xicclu") if not xicclu: return cwd = self.worker.create_tempdir() if isinstance(cwd, Exception): raise cwd if not profiles: profiles = [ICCP.ICCProfile(get_data_path("ref/sRGB.icm")), get_display_profile()] for i, profile in enumerate(profiles): if profile_no is not None and i != profile_no: continue if (not profile or profile.profileClass == "link" or profile.connectionColorSpace not in ("Lab", "XYZ")): self.set_pcs_data(i) self.profiles[i] = None continue id = profile.calculateID(False) check = self.profiles.get(i) if (check and check.ID == id and intent == self.intent and direction == self.direction and order == self.order): continue self.profiles[i] = profile self.set_pcs_data(i) pcs_triplets = [] if (profile.profileClass == "nmcl" and "ncl2" in profile.tags and isinstance(profile.tags.ncl2, ICCP.NamedColor2Type) and profile.connectionColorSpace in ("Lab", "XYZ")): for k, v in profile.tags.ncl2.iteritems(): color = v.pcs.values() if profile.connectionColorSpace == "Lab": # Need to convert to XYZ color = colormath.Lab2XYZ(*color) if intent == "a" and "wtpt" in profile.tags: color = colormath.adapt(color[0], color[1], color[2], whitepoint_destination=profile.tags.wtpt.ir.values()) pcs_triplets.append(color) pcs_triplets.sort() elif profile.version >= 4: self.profiles[i] = None self.errors.append(Error("\n".join([lang.getstr("profile.iccv4.unsupported"), profile.getDescription()]))) continue else: channels = {'XYZ': 3, 'Lab': 3, 'Luv': 3, 'YCbr': 3, 'Yxy': 3, 'RGB': 3, 'GRAY': 1, 'HSV': 3, 'HLS': 3, 'CMYK': 4, 'CMY': 3, '2CLR': 2, '3CLR': 3, '4CLR': 4, '5CLR': 5, '6CLR': 6, '7CLR': 7, '8CLR': 8, '9CLR': 9, 'ACLR': 10, 'BCLR': 11, 'CCLR': 12, 'DCLR': 13, 'ECLR': 14, 'FCLR': 15}.get(profile.colorSpace) if not channels: self.errors.append(Error(lang.getstr("profile.unsupported", (profile.profileClass, profile.colorSpace)))) continue # Create input values device_values = [] if profile.colorSpace in ("Lab", "Luv", "XYZ", "Yxy"): # Use ICC PCSXYZ encoding range minv = 0.0 maxv = 0xffff / 32768.0 else: minv = 0.0 maxv = 1.0 step = (maxv - minv) / (self.size - 1) for j in xrange(min(3, channels)): for k in xrange(min(3, channels)): device_value = [0.0] * channels device_value[j] = maxv if j != k or channels == 1: for l in xrange(self.size): device_value[k] = minv + step * l device_values.append(list(device_value)) if profile.colorSpace in ("HLS", "HSV", "Lab", "Luv", "YCbr", "Yxy"): # Convert to actual color space # TODO: Handle HLS and YCbr tmp = list(device_values) device_values = [] for j, values in enumerate(tmp): if profile.colorSpace == "HSV": HSV = list(colormath.RGB2HSV(*values)) device_values.append(HSV) elif profile.colorSpace == "Lab": Lab = list(colormath.XYZ2Lab(*[v * 100 for v in values])) device_values.append(Lab) elif profile.colorSpace == "Luv": Luv = list(colormath.XYZ2Luv(*[v * 100 for v in values])) device_values.append(Luv) elif profile.colorSpace == "Yxy": xyY = list(colormath.XYZ2xyY(*values)) device_values.append(xyY) # Add white if profile.colorSpace == "RGB": device_values.append([1.0] * channels) elif profile.colorSpace == "HLS": device_values.append([0, 1, 0]) elif profile.colorSpace == "HSV": device_values.append([0, 0, 1]) elif profile.colorSpace in ("Lab", "Luv", "YCbr"): if profile.colorSpace == "YCbr": device_values.append([1.0, 0.0, 0.0]) else: device_values.append([100.0, 0.0, 0.0]) elif profile.colorSpace in ("XYZ", "Yxy"): if profile.colorSpace == "XYZ": device_values.append(profile.tags.wtpt.pcs.values()) else: device_values.append(profile.tags.wtpt.pcs.xyY) elif profile.colorSpace != "GRAY": device_values.append([0.0] * channels) if debug: safe_print("In:") for v in device_values: safe_print(" ".join(("%3.4f", ) * len(v)) % tuple(v)) # Lookup device -> XYZ values through profile using xicclu try: odata = self.worker.xicclu(profile, device_values, intent, direction, order) except Exception, exception: self.errors.append(Error(safe_unicode(exception))) continue if debug: safe_print("Out:") for pcs_triplet in odata: if debug: safe_print(" ".join(("%3.4f", ) * len(pcs_triplet)) % tuple(pcs_triplet)) pcs_triplets.append(pcs_triplet) if profile.connectionColorSpace == "Lab": pcs_triplets[-1] = list(colormath.Lab2XYZ(*pcs_triplets[-1])) if len(self.pcs_data) < i + 1: self.pcs_data.append(pcs_triplets) else: self.pcs_data[i] = pcs_triplets # Remove temporary files self.worker.wrapup(False) self.intent = intent self.direction = direction self.order = order class GamutViewOptions(wx.Panel): def __init__(self, *args, **kwargs): scale = getcfg("app.dpi") / config.get_default_dpi() if scale < 1: scale = 1 wx.Panel.__init__(self, *args, **kwargs) self.SetBackgroundColour(BGCOLOUR) self.sizer = wx.FlexGridSizer(0, 3, 4, 0) self.sizer.AddGrowableCol(0) self.sizer.AddGrowableCol(2) self.SetSizer(self.sizer) self.sizer.Add((0, 0)) legendsizer = wx.BoxSizer(wx.HORIZONTAL) self.sizer.Add(legendsizer) # Whitepoint legend legendsizer.Add(wx.StaticBitmap(self, -1, getbitmap("theme/cross-2px-12x12-fff")), flag=wx.ALIGN_CENTER_VERTICAL | wx.LEFT, border=2) self.whitepoint_legend = wx.StaticText(self, -1, lang.getstr("whitepoint")) self.whitepoint_legend.SetMaxFontSize(11) self.whitepoint_legend.SetForegroundColour(FGCOLOUR) legendsizer.Add(self.whitepoint_legend, flag=wx.ALIGN_CENTER_VERTICAL | wx.LEFT, border=10) # Comparison profile whitepoint legend self.comparison_whitepoint_bmp = wx.StaticBitmap(self, -1, getbitmap("theme/x-2px-12x12-999")) legendsizer.Add(self.comparison_whitepoint_bmp, flag=wx.ALIGN_CENTER_VERTICAL | wx.LEFT, border=20) self.comparison_whitepoint_legend = wx.StaticText(self, -1, "%s (%s)" % (lang.getstr("whitepoint"), lang.getstr("comparison_profile"))) self.comparison_whitepoint_legend.SetMaxFontSize(11) self.comparison_whitepoint_legend.SetForegroundColour(FGCOLOUR) legendsizer.Add(self.comparison_whitepoint_legend, flag=wx.ALIGN_CENTER_VERTICAL | wx.LEFT, border=8) self.sizer.Add((0, 0)) # Empty 'row' self.sizer.Add((0, 0)) self.sizer.Add((0, 0)) self.sizer.Add((0, 0)) self.sizer.Add((0, 0)) self.options_sizer = wx.FlexGridSizer(0, 3, 4, 8) self.sizer.Add(self.options_sizer) # Colorspace select self.colorspace_outline_bmp = wx.StaticBitmap(self, -1, getbitmap("theme/solid-16x2-666")) self.options_sizer.Add(self.colorspace_outline_bmp, flag=wx.ALIGN_CENTER_VERTICAL) self.colorspace_label = wx.StaticText(self, -1, lang.getstr("colorspace")) self.colorspace_label.SetMaxFontSize(11) self.colorspace_label.SetForegroundColour(FGCOLOUR) self.options_sizer.Add(self.colorspace_label, flag=wx.ALIGN_CENTER_VERTICAL) self.colorspace_select = wx.Choice(self, -1, size=(150 * scale, -1), choices=["CIE a*b*", "CIE u*v*", "CIE u'v'", "CIE xy", "DIN99", "DIN99b", "DIN99c", "DIN99d"]) self.options_sizer.Add(self.colorspace_select, flag=wx.ALIGN_CENTER_VERTICAL) self.colorspace_select.Bind(wx.EVT_CHOICE, self.generic_select_handler) self.colorspace_select.SetSelection(0) # Colorspace outline self.options_sizer.Add((0, 0)) self.options_sizer.Add((0, 0)) self.draw_gamut_outline_cb = CustomCheckBox(self, -1, lang.getstr("colorspace.show_outline")) self.draw_gamut_outline_cb.Bind(wx.EVT_CHECKBOX, self.draw_gamut_outline_handler) self.draw_gamut_outline_cb.SetMaxFontSize(11) self.draw_gamut_outline_cb.SetForegroundColour(FGCOLOUR) self.draw_gamut_outline_cb.SetValue(True) self.options_sizer.Add(self.draw_gamut_outline_cb, flag=wx.ALIGN_CENTER_VERTICAL | wx.LEFT, border=4) # Colortemperature curve select self.whitepoint_bmp = wx.StaticBitmap(self, -1, getbitmap("theme/solid-16x1-fff")) self.options_sizer.Add(self.whitepoint_bmp, flag=wx.ALIGN_CENTER_VERTICAL) self.whitepoint_label = wx.StaticText(self, -1, lang.getstr("whitepoint.colortemp.locus.curve")) self.whitepoint_label.SetMaxFontSize(11) self.whitepoint_label.SetForegroundColour(FGCOLOUR) self.options_sizer.Add(self.whitepoint_label, flag=wx.ALIGN_CENTER_VERTICAL) self.whitepoint_select = wx.Choice(self, -1, size=(150 * scale, -1), choices=[lang.getstr("calibration.file.none"), lang.getstr("whitepoint.colortemp.locus.daylight"), lang.getstr("whitepoint.colortemp.locus.blackbody")]) self.options_sizer.Add(self.whitepoint_select, flag=wx.ALIGN_CENTER_VERTICAL) self.whitepoint_select.Bind(wx.EVT_CHOICE, self.generic_select_handler) self.whitepoint_select.SetSelection(0) self.whitepoint_bmp.Hide() # Comparison profile select self.comparison_profile_bmp = wx.StaticBitmap(self, -1, getbitmap("theme/dashed-16x2-666")) self.options_sizer.Add(self.comparison_profile_bmp, flag=wx.ALIGN_CENTER_VERTICAL) self.comparison_profile_label = wx.StaticText(self, -1, lang.getstr("comparison_profile")) self.comparison_profile_label.SetMaxFontSize(11) self.comparison_profile_label.SetForegroundColour(FGCOLOUR) self.options_sizer.Add(self.comparison_profile_label, flag=wx.ALIGN_CENTER_VERTICAL) self.comparison_profiles = OrderedDict([(lang.getstr("calibration.file.none"), None)]) srgb = None try: srgb = ICCP.ICCProfile(get_data_path("ref/sRGB.icm")) except EnvironmentError: pass except Exception, exception: safe_print(exception) if srgb: self.comparison_profiles[os.path.basename(srgb.fileName)] = srgb for profile in config.get_standard_profiles(): basename = os.path.basename(profile.fileName) if basename not in self.comparison_profiles: self.comparison_profiles[basename] = profile self.comparison_profile_select = wx.Choice(self, -1, size=(150 * scale, -1), choices=[]) self.comparison_profiles_sort() self.options_sizer.Add(self.comparison_profile_select, flag=wx.ALIGN_CENTER_VERTICAL) self.comparison_profile_select.Bind(wx.EVT_CHOICE, self.comparison_profile_select_handler) droptarget = FileDrop(self.TopLevelParent, {".icc": self.comparison_profile_drop_handler, ".icm": self.comparison_profile_drop_handler}) self.comparison_profile_select.SetDropTarget(droptarget) if srgb: self.comparison_profile_select.SetSelection(1) self.comparison_profile_select.SetToolTipString(srgb.fileName) # Rendering intent select self.options_sizer.Add((0, 0)) self.rendering_intent_label = wx.StaticText(self, -1, lang.getstr("rendering_intent")) self.rendering_intent_label.SetMaxFontSize(11) self.rendering_intent_label.SetForegroundColour(FGCOLOUR) self.options_sizer.Add(self.rendering_intent_label, flag=wx.ALIGN_CENTER_VERTICAL) self.rendering_intent_select = wx.Choice(self, -1, size=(150 * scale, -1), choices=[lang.getstr("gamap.intents.a"), lang.getstr("gamap.intents.r"), lang.getstr("gamap.intents.p"), lang.getstr("gamap.intents.s")]) self.options_sizer.Add(self.rendering_intent_select, flag=wx.ALIGN_CENTER_VERTICAL) self.rendering_intent_select.Bind(wx.EVT_CHOICE, self.rendering_intent_select_handler) self.rendering_intent_select.SetSelection(0) self.options_sizer.Add((0, 0)) # LUT toggle self.toggle_clut = CustomCheckBox(self, -1, "LUT") self.toggle_clut.SetForegroundColour(FGCOLOUR) self.toggle_clut.SetMaxFontSize(11) self.options_sizer.Add(self.toggle_clut, flag=wx.ALIGN_CENTER_VERTICAL) self.toggle_clut.Bind(wx.EVT_CHECKBOX, self.toggle_clut_handler) self.toggle_clut.Hide() # Direction selection self.direction_select = wx.Choice(self, -1, size=(150 * scale, -1), choices=[lang.getstr("direction.forward"), lang.getstr("direction.backward.inverted")]) self.options_sizer.Add(self.direction_select, flag=wx.ALIGN_CENTER_VERTICAL) self.direction_select.Bind(wx.EVT_CHOICE, self.direction_select_handler) self.direction_select.SetSelection(0) self.direction_select.Hide() self.sizer.Add((0, 0)) def DrawCanvas(self, profile_no=None, reset=True): # Gamut plot parent = self.TopLevelParent parent.client.SetEnableCenterLines(False) parent.client.SetEnableDiagonals(False) parent.client.SetEnableGrid(True) parent.client.SetEnablePointLabel(False) try: parent.client.setup([self.comparison_profile, parent.profile], profile_no, intent=self.intent, direction=self.direction, order=self.order) except Exception, exception: show_result_dialog(exception, parent) if reset: parent.client.reset() parent.client.resetzoom() wx.CallAfter(self.draw, center=reset) wx.CallAfter(parent.handle_errors) @property def colorspace(self): return self.get_colorspace() @property def comparison_profile(self): return self.comparison_profiles.values()[self.comparison_profile_select.GetSelection()] def comparison_profile_drop_handler(self, path): try: profile = ICCP.ICCProfile(path) except Exception, exception: show_result_dialog(exception, self.TopLevelParent) else: basename = os.path.basename(profile.fileName) self.comparison_profiles[basename] = profile self.comparison_profiles_sort() self.comparison_profile_select.SetSelection(self.comparison_profiles.keys().index(basename)) self.comparison_profile_select_handler(None) def comparison_profile_select_handler(self, event): if self.comparison_profile_select.GetSelection() > 0: self.comparison_profile_select.SetToolTipString(self.comparison_profile.fileName) else: self.comparison_profile_select.SetToolTip(None) self.comparison_whitepoint_bmp.Show(self.comparison_profile_select.GetSelection() > 0) self.comparison_whitepoint_legend.Show(self.comparison_profile_select.GetSelection() > 0) self.comparison_profile_bmp.Show(self.comparison_profile_select.GetSelection() > 0) self.DrawCanvas(0, reset=False) def comparison_profiles_sort(self): comparison_profiles = self.comparison_profiles[2:] comparison_profiles.sort(cmp, key=lambda s: s.lower()) self.comparison_profiles = self.comparison_profiles[:2] self.comparison_profiles.update(comparison_profiles) self.comparison_profile_select.SetItems(self.comparison_profiles.keys()) @property def direction(self): if self.direction_select.IsShown(): return {0: "f", 1: "ib"}.get(self.direction_select.GetSelection()) else: return "f" def draw(self, center=False): colorspace = self.colorspace parent = self.TopLevelParent parent.client.proportional = True parent.client.DrawCanvas("%s %s" % (colorspace, lang.getstr("colorspace")), colorspace, whitepoint=self.whitepoint_select.GetSelection(), center=center, show_outline=self.draw_gamut_outline_cb.GetValue()) def draw_gamut_outline_handler(self, event): self.colorspace_outline_bmp.Show(self.draw_gamut_outline_cb.GetValue()) self.draw() def generic_select_handler(self, event): self.whitepoint_bmp.Show(self.whitepoint_select.GetSelection() > 0) parent = self.TopLevelParent if parent.client.profiles: self.draw(center=event.GetId() == self.colorspace_select.GetId()) else: self.DrawCanvas() def get_colorspace(self, dimensions=2): return {0: "a*b*" if dimensions == 2 else "Lab", 1: "u*v*" if dimensions == 2 else "Luv", 2: "u'v'" if dimensions == 2 else "Lu'v'", 3: "xy" if dimensions == 2 else "xyY", 4: "DIN99", 5: "DIN99b", 6: "DIN99c", 7: "DIN99d"}.get(self.colorspace_select.GetSelection(), "a*b*" if dimensions == 2 else "Lab") @property def intent(self): return {0: "a", 1: "r", 2: "p", 3: "s"}.get(self.rendering_intent_select.GetSelection()) @property def order(self): parent = self.TopLevelParent return {True: "n", False: "r"}.get(bool(parent.profile) and not ("B2A0" in parent.profile.tags or "A2B0" in parent.profile.tags) or self.toggle_clut.GetValue()) def rendering_intent_select_handler(self, event): self.DrawCanvas(reset=False) def direction_select_handler(self, event): self.DrawCanvas(reset=False) def toggle_clut_handler(self, event): parent = self.TopLevelParent self.Freeze() self.direction_select.Show(bool(parent.profile) and "B2A0" in parent.profile.tags and "A2B0" in parent.profile.tags and self.toggle_clut.GetValue()) self.DrawCanvas(reset=False) self.Thaw() class ProfileInfoFrame(LUTFrame): def __init__(self, *args, **kwargs): if len(args) < 3 and not "title" in kwargs: kwargs["title"] = lang.getstr("profile.info") if not "name" in kwargs: kwargs["name"] = "profile_info" BaseFrame.__init__(self, *args, **kwargs) self.SetIcons(config.get_icon_bundle([256, 48, 32, 16], appname + "-profile-info")) self.profile = None self.xLabel = lang.getstr("in") self.yLabel = lang.getstr("out") self.sizer = wx.BoxSizer(wx.VERTICAL) self.SetSizer(self.sizer) self.splitter = TwoWaySplitter(self, -1, agwStyle = wx.SP_LIVE_UPDATE | wx.SP_NOSASH) self.sizer.Add(self.splitter, 1, flag=wx.EXPAND) p1 = wx.Panel(self.splitter, name="canvaspanel") p1.SetBackgroundColour(BGCOLOUR) p1.sizer = wx.BoxSizer(wx.VERTICAL) p1.SetSizer(p1.sizer) self.splitter.AppendWindow(p1) self.plot_mode_sizer = wx.BoxSizer(wx.HORIZONTAL) p1.sizer.Add(self.plot_mode_sizer, flag=wx.ALIGN_CENTER | wx.TOP, border=12) # The order of the choice items is significant for compatibility # with LUTFrame: # 0 = vcgt, # 1 = [rgb]TRC # 2 = gamut self.plot_mode_select = wx.Choice(p1, -1, choices=[lang.getstr("vcgt"), lang.getstr("[rgb]TRC"), lang.getstr("gamut")]) self.plot_mode_sizer.Add(self.plot_mode_select, flag=wx.ALIGN_CENTER_VERTICAL) self.plot_mode_select.Bind(wx.EVT_CHOICE, self.plot_mode_select_handler) self.plot_mode_select.SetSelection(2) self.plot_mode_select.Disable() self.tooltip_btn = BitmapButton(p1, -1, geticon(16, "dialog-information"), style=wx.NO_BORDER) self.tooltip_btn.SetBackgroundColour(BGCOLOUR) self.tooltip_btn.Bind(wx.EVT_BUTTON, self.tooltip_handler) self.tooltip_btn.SetToolTipString(lang.getstr("gamut_plot.tooltip")) self.plot_mode_sizer.Add(self.tooltip_btn, flag=wx.ALIGN_CENTER_VERTICAL | wx.LEFT, border=8) self.save_plot_btn = BitmapButton(p1, -1, geticon(16, "camera-photo"), style=wx.NO_BORDER) self.save_plot_btn.SetBackgroundColour(BGCOLOUR) self.save_plot_btn.Bind(wx.EVT_BUTTON, self.SaveFile) self.save_plot_btn.SetToolTipString(lang.getstr("save_as") + " " + "(*.bmp, *.xbm, *.xpm, *.jpg, *.png)") self.save_plot_btn.Disable() self.plot_mode_sizer.Add(self.save_plot_btn, flag=wx.ALIGN_CENTER_VERTICAL | wx.LEFT, border=8) self.view_3d_btn = BitmapButton(p1, -1, geticon(16, "3D"), style=wx.NO_BORDER) self.view_3d_btn.SetBackgroundColour(BGCOLOUR) self.view_3d_btn.Bind(wx.EVT_BUTTON, self.view_3d) self.view_3d_btn.Bind(wx.EVT_CONTEXT_MENU, self.view_3d_format_popup) self.view_3d_btn.SetToolTipString(lang.getstr("view.3d")) self.view_3d_btn.Disable() self.plot_mode_sizer.Add(self.view_3d_btn, flag=wx.ALIGN_CENTER_VERTICAL | wx.LEFT, border=12) self.view_3d_format_btn = BitmapButton(p1, -1, getbitmap("theme/dropdown-arrow"), style=wx.NO_BORDER) self.view_3d_format_btn.MinSize = (-1, self.view_3d_btn.Size[1]) self.view_3d_format_btn.SetBackgroundColour(BGCOLOUR) self.view_3d_format_btn.Bind(wx.EVT_BUTTON, self.view_3d_format_popup) self.view_3d_format_btn.Bind(wx.EVT_CONTEXT_MENU, self.view_3d_format_popup) self.view_3d_format_btn.SetToolTipString(lang.getstr("view.3d")) self.view_3d_format_btn.Disable() self.plot_mode_sizer.Add(self.view_3d_format_btn, flag=wx.ALIGN_CENTER_VERTICAL | wx.LEFT, border=4) self.client = GamutCanvas(p1) p1.sizer.Add(self.client, 1, flag=wx.EXPAND | wx.LEFT | wx.RIGHT | wx.TOP | wx.BOTTOM, border=4) self.options_panel = SimpleBook(p1) self.options_panel.SetBackgroundColour(BGCOLOUR) p1.sizer.Add(self.options_panel, flag=wx.EXPAND | wx.BOTTOM, border=8) self.status = BitmapBackgroundPanelText(p1) self.status.SetMaxFontSize(11) self.status.label_y = 0 self.status.textshadow = False self.status.SetBackgroundColour(BGCOLOUR) self.status.SetForegroundColour(FGCOLOUR) h = self.status.GetTextExtent("Ig")[1] self.status.SetMinSize((0, h * 2 + 10)) p1.sizer.Add(self.status, flag=wx.EXPAND) # Gamut view options self.gamut_view_options = GamutViewOptions(p1) self.options_panel.AddPage(self.gamut_view_options, "") # Curve view options self.lut_view_options = wx.Panel(p1, name="lut_view_options") self.lut_view_options.SetBackgroundColour(BGCOLOUR) self.lut_view_options_sizer = self.box_sizer = wx.FlexGridSizer(0, 3, 4, 4) self.lut_view_options_sizer.AddGrowableCol(0) self.lut_view_options_sizer.AddGrowableCol(2) self.lut_view_options.SetSizer(self.lut_view_options_sizer) self.options_panel.AddPage(self.lut_view_options, "") self.lut_view_options_sizer.Add((0, 0)) hsizer = wx.BoxSizer(wx.HORIZONTAL) self.lut_view_options_sizer.Add(hsizer, flag=wx.ALIGN_CENTER | wx.BOTTOM, border=8) self.rendering_intent_select = wx.Choice(self.lut_view_options, -1, choices=[lang.getstr("gamap.intents.a"), lang.getstr("gamap.intents.r"), lang.getstr("gamap.intents.p"), lang.getstr("gamap.intents.s")]) hsizer.Add((10, self.rendering_intent_select.Size[1])) hsizer.Add(self.rendering_intent_select, flag=wx.ALIGN_CENTER_VERTICAL) self.rendering_intent_select.Bind(wx.EVT_CHOICE, self.rendering_intent_select_handler) self.rendering_intent_select.SetSelection(1) self.direction_select = wx.Choice(self.lut_view_options, -1, choices=[lang.getstr("direction.backward"), lang.getstr("direction.forward.inverted")]) hsizer.Add(self.direction_select, flag=wx.ALIGN_CENTER_VERTICAL | wx.LEFT, border=10) self.direction_select.Bind(wx.EVT_CHOICE, self.direction_select_handler) self.direction_select.SetSelection(0) self.lut_view_options_sizer.Add((0, 0)) self.lut_view_options_sizer.Add((0, 0)) hsizer = wx.BoxSizer(wx.HORIZONTAL) self.lut_view_options_sizer.Add(hsizer, flag=wx.ALIGN_CENTER) hsizer.Add((16, 0)) self.show_as_L = CustomCheckBox(self.lut_view_options, -1, u"L* \u2192") self.show_as_L.SetForegroundColour(FGCOLOUR) self.show_as_L.SetValue(True) hsizer.Add(self.show_as_L, flag=wx.ALIGN_CENTER_VERTICAL | wx.RIGHT, border=4) self.show_as_L.Bind(wx.EVT_CHECKBOX, self.DrawLUT) self.toggle_red = CustomCheckBox(self.lut_view_options, -1, "R") self.toggle_red.SetForegroundColour(FGCOLOUR) self.toggle_red.SetValue(True) hsizer.Add(self.toggle_red, flag=wx.ALIGN_CENTER_VERTICAL) self.toggle_red.Bind(wx.EVT_CHECKBOX, self.DrawLUT) hsizer.Add((4, 0)) self.toggle_green = CustomCheckBox(self.lut_view_options, -1, "G") self.toggle_green.SetForegroundColour(FGCOLOUR) self.toggle_green.SetValue(True) hsizer.Add(self.toggle_green, flag=wx.ALIGN_CENTER_VERTICAL) self.toggle_green.Bind(wx.EVT_CHECKBOX, self.DrawLUT) hsizer.Add((4, 0)) self.toggle_blue = CustomCheckBox(self.lut_view_options, -1, "B") self.toggle_blue.SetForegroundColour(FGCOLOUR) self.toggle_blue.SetValue(True) hsizer.Add(self.toggle_blue, flag=wx.ALIGN_CENTER_VERTICAL) self.toggle_blue.Bind(wx.EVT_CHECKBOX, self.DrawLUT) self.toggle_clut = CustomCheckBox(self.lut_view_options, -1, "LUT") self.toggle_clut.SetForegroundColour(FGCOLOUR) hsizer.Add(self.toggle_clut, flag=wx.ALIGN_CENTER_VERTICAL | wx.LEFT, border=16) self.toggle_clut.Bind(wx.EVT_CHECKBOX, self.toggle_clut_handler) self.lut_view_options_sizer.Add((0, 0)) p2 = wx.Panel(self.splitter, name="gridpanel") p2.sizer = wx.BoxSizer(wx.VERTICAL) p2.SetSizer(p2.sizer) self.splitter.AppendWindow(p2) self.grid = CustomGrid(p2, -1) self.grid.alternate_row_label_background_color = wx.Colour(230, 230, 230) self.grid.alternate_cell_background_color = self.grid.alternate_row_label_background_color self.grid.draw_horizontal_grid_lines = False self.grid.draw_vertical_grid_lines = False self.grid.draw_row_labels = False self.grid.show_cursor_outline = False self.grid.style = "" self.grid.CreateGrid(0, 2) self.grid.SetCellHighlightPenWidth(0) self.grid.SetCellHighlightROPenWidth(0) self.grid.SetDefaultCellBackgroundColour(self.grid.GetLabelBackgroundColour()) font = self.grid.GetDefaultCellFont() if font.PointSize > 11: font.PointSize = 11 self.grid.SetDefaultCellFont(font) self.grid.SetSelectionMode(wx.grid.Grid.wxGridSelectRows) self.grid.SetRowLabelSize(self.grid.GetDefaultRowSize()) self.grid.SetColLabelSize(0) self.grid.DisableDragRowSize() self.grid.EnableDragColSize() self.grid.EnableEditing(False) self.grid.EnableGridLines(False) self.grid.Bind(wx.grid.EVT_GRID_COL_SIZE, self.resize_grid) p2.sizer.Add(self.grid, 1, flag=wx.EXPAND) drophandlers = { ".icc": self.drop_handler, ".icm": self.drop_handler } self.droptarget = FileDrop(self, drophandlers) self.client.SetDropTarget(self.droptarget) droptarget = FileDrop(self, drophandlers) self.grid.SetDropTarget(droptarget) min_w = max(self.options_panel.GetBestSize()[0] + 24, defaults["size.profile_info.w"] - self.splitter._GetSashSize()) self.splitter.SetMinimumPaneSize(min_w) self.splitter.SetHSplit(0) border, titlebar = get_platform_window_decoration_size() self.SetSaneGeometry( getcfg("position.profile_info.x"), getcfg("position.profile_info.y"), defaults["size.profile_info.split.w"] + border * 2, getcfg("size.profile_info.h") + titlebar + border) self.SetMinSize((min_w + border * 2, defaults["size.profile_info.h"] + titlebar + border)) self.splitter.SetSplitSize((defaults["size.profile_info.split.w"] + border * 2, self.GetSize()[1])) self.splitter.SetExpandedSize(self.GetSize()) self.client.canvas.Bind(wx.EVT_MOTION, self.OnMotion) self.Bind(wx.EVT_CLOSE, self.OnClose) self.Bind(wx.EVT_MOVE, self.OnMove) self.Bind(wx.EVT_SIZE, self.OnSize) self.Bind(wx.EVT_SPLITTER_SASH_POS_CHANGING, self.OnSashPosChanging) self.display_no = -1 self.display_rects = get_display_rects() children = self.GetAllChildren() self.Bind(wx.EVT_KEY_DOWN, self.key_handler) for child in children: if isinstance(child, wx.Choice): child.SetMaxFontSize(11) child.Bind(wx.EVT_KEY_DOWN, self.key_handler) child.Bind(wx.EVT_MOUSEWHEEL, self.OnWheel) if (sys.platform == "win32" and sys.getwindowsversion() >= (6, ) and isinstance(child, wx.Panel)): # No need to enable double buffering under Linux and Mac OS X. # Under Windows, enabling double buffering on the panel seems # to work best to reduce flicker. child.SetDoubleBuffered(True) def DrawCanvas(self, profile_no=None, reset=True): self.SetStatusText('') if self.plot_mode_select.GetSelection() == self.plot_mode_select.GetCount() - 1: # Gamut plot self.plot_mode_sizer.Show(self.view_3d_btn) self.plot_mode_sizer.Show(self.view_3d_format_btn) self.options_panel.GetCurrentPage().DrawCanvas(reset=reset) self.save_plot_btn.Enable() self.view_3d_btn.Enable() self.view_3d_format_btn.Enable() else: # Curves plot self.plot_mode_sizer.Hide(self.view_3d_btn) self.plot_mode_sizer.Hide(self.view_3d_format_btn) self.client.SetEnableCenterLines(True) self.client.SetEnableDiagonals('Bottomleft-Topright') self.client.SetEnableGrid(False) self.client.SetEnablePointLabel(True) if (isinstance(self.profile.tags.get("vcgt"), ICCP.VideoCardGammaType) or (self.rTRC and self.gTRC and self.bTRC) or (("B2A0" in self.profile.tags or "A2B0" in self.profile.tags) and self.profile.colorSpace == "RGB")): self.toggle_red.Enable() self.toggle_green.Enable() self.toggle_blue.Enable() self.DrawLUT() self.handle_errors() else: self.toggle_red.Disable() self.toggle_green.Disable() self.toggle_blue.Disable() self.client.DrawLUT() self.splitter.GetTopLeft().sizer.Layout() self.splitter.GetTopLeft().Refresh() def LoadProfile(self, profile, reset=True): if not isinstance(profile, ICCP.ICCProfile): try: profile = ICCP.ICCProfile(profile) except (IOError, ICCP.ICCProfileInvalidError), exception: show_result_dialog(Error(lang.getstr("profile.invalid") + "\n" + profile), self) self.DrawCanvas(reset=reset) return self.profile = profile self.rTRC = self.tf_rTRC = profile.tags.get("rTRC", profile.tags.get("kTRC")) self.gTRC = self.tf_gTRC = profile.tags.get("gTRC", profile.tags.get("kTRC")) self.bTRC = self.tf_bTRC = profile.tags.get("bTRC", profile.tags.get("kTRC")) self.trc = None self.gamut_view_options.direction_select.Show("B2A0" in self.profile.tags and "A2B0" in self.profile.tags) self.gamut_view_options.toggle_clut.SetValue("B2A0" in profile.tags or "A2B0" in profile.tags) self.gamut_view_options.toggle_clut.Show("B2A0" in profile.tags or "A2B0" in profile.tags) self.gamut_view_options.toggle_clut.Enable(isinstance(self.rTRC, ICCP.CurveType) and isinstance(self.gTRC, ICCP.CurveType) and isinstance(self.bTRC, ICCP.CurveType)) self.toggle_clut.SetValue("B2A0" in profile.tags or "A2B0" in profile.tags) plot_mode = self.plot_mode_select.GetSelection() plot_mode_count = self.plot_mode_select.GetCount() choice = [] info = profile.get_info() self.client.errors = [] if ((self.rTRC and self.gTRC and self.bTRC) or (("B2A0" in self.profile.tags or "A2B0" in self.profile.tags) and self.profile.colorSpace == "RGB")): # vcgt needs to be in here for compatibility with LUTFrame choice.append(lang.getstr("vcgt")) try: self.lookup_tone_response_curves() except Exception, exception: wx.CallAfter(show_result_dialog, exception, self) else: choice.append(lang.getstr("[rgb]TRC")) choice.append(lang.getstr("gamut")) self.Freeze() self.plot_mode_select.SetItems(choice) if plot_mode_count != self.plot_mode_select.GetCount(): plot_mode = self.plot_mode_select.GetCount() - 1 self.plot_mode_select.SetSelection(min(plot_mode, self.plot_mode_select.GetCount() - 1)) self.select_current_page() self.plot_mode_select.Enable() self.SetTitle(u" \u2014 ".join([lang.getstr("profile.info"), profile.getDescription()])) rows = [("", "")] lines = [] for label, value in info: label = label.replace("\0", "") value = wrap(universal_newlines(value.strip()).replace("\t", "\n"), 52).replace("\0", "").split("\n") linecount = len(value) for i, line in enumerate(value): value[i] = line.strip() label = universal_newlines(label).split("\n") while len(label) < linecount: label.append("") lines.extend(zip(label, value)) for i, line in enumerate(lines): line = list(line) indent = re.match("\s+", line[0]) for j, v in enumerate(line): if v.endswith("_"): continue key = re.sub("[^0-9A-Za-z]+", "_", strtr(line[j], {u"\u0394E": "Delta E"}).lower().strip(), 0).strip("_") val = lang.getstr(key) if key != val: line[j] = val if indent: #if i + 1 < len(lines) and lines[i + 1][0].startswith(" "): #marker = u" ├ " #else: #marker = u" └ " line[0] = indent.group() + line[0].strip() elif line[0]: #if i + 1 < len(lines) and lines[i + 1][0].startswith(" "): #marker = u"▼ " #else: #marker = u"► " pass rows.append(line) rows.append(("", "")) if self.grid.GetNumberRows(): self.grid.DeleteRows(0, self.grid.GetNumberRows()) self.grid.AppendRows(len(rows)) labelcolor = self.grid.GetLabelTextColour() alpha = 102 namedcolor = False for i, (label, value) in enumerate(rows): self.grid.SetCellValue(i, 0, " " + label) bgcolor = self.grid.GetCellBackgroundColour(i, 0) bgblend = (255 - alpha) / 255.0 blend = alpha / 255.0 textcolor = wx.Colour(int(round(bgblend * bgcolor.Red() + blend * labelcolor.Red())), int(round(bgblend * bgcolor.Green() + blend * labelcolor.Green())), int(round(bgblend * bgcolor.Blue() + blend * labelcolor.Blue()))) if label == lang.getstr("named_colors"): namedcolor = True elif label.strip() and label.lstrip() == label: namedcolor = False if namedcolor: color = re.match("(Lab|XYZ)((?:\s+-?\d+(?:\.\d+)){3,})", value) else: color = None if color: if color.groups()[0] == "Lab": color = colormath.Lab2RGB(*[float(v) for v in color.groups()[1].strip().split()], **dict(scale=255)) else: # XYZ color = colormath.XYZ2RGB(*[float(v) for v in color.groups()[1].strip().split()], **dict(scale=255)) labelbgcolor = wx.Colour(*[int(round(v)) for v in color]) self.grid.SetRowLabelRenderer(i, CustomRowLabelRenderer(labelbgcolor)) self.grid.SetCellTextColour(i, 0, textcolor) self.grid.SetCellValue(i, 1, value) self.grid.AutoSizeColumn(0) self.resize_grid() self.grid.ClearSelection() self.Layout() self.DrawCanvas(reset=reset) self.Thaw() def OnClose(self, event): if (getattr(self.worker, "thread", None) and self.worker.thread.isAlive()): self.worker.abort_subprocess(True) return self.worker.wrapup(False) writecfg(module="profile-info", options=("3d.format", "last_cal_or_icc_path", "last_icc_path", "position.profile_info", "size.profile_info")) event.Skip() def OnMotion(self, event): if isinstance(event, wx.MouseEvent): xy = self.client._getXY(event) else: xy = event if self.plot_mode_select.GetSelection() < self.plot_mode_select.GetCount() - 1: # Curves plot if isinstance(event, wx.MouseEvent): if not event.LeftIsDown(): self.UpdatePointLabel(xy) else: self.client.erase_pointlabel() else: # Gamut plot page = self.options_panel.GetCurrentPage() if (page.colorspace in ("a*b*", "u*v*") or page.colorspace.startswith("DIN99")): format = "%.2f %.2f" else: format = "%.4f %.4f" whitepoint_no = page.whitepoint_select.GetSelection() if whitepoint_no > 0: if page.colorspace == "a*b*": x, y, Y = colormath.Lab2xyY(100.0, xy[0], xy[1]) elif page.colorspace == "u*v*": X, Y, Z = colormath.Luv2XYZ(100.0, xy[0], xy[1]) x, y = colormath.XYZ2xyY(X, Y, Z)[:2] elif page.colorspace == "u'v'": x, y = colormath.u_v_2xy(xy[0], xy[1]) elif page.colorspace.startswith("DIN99"): # DIN99 L99 = colormath.Lab2DIN99(100, 0, 0)[0] if page.colorspace == "DIN99b": # DIN99b a, b = colormath.DIN99b2Lab(L99, xy[0], xy[1])[1:] elif page.colorspace == "DIN99c": # DIN99c a, b = colormath.DIN99c2Lab(L99, xy[0], xy[1])[1:] elif page.colorspace == "DIN99d": # DIN99d a, b = colormath.DIN99d2Lab(L99, xy[0], xy[1])[1:] else: # DIN99 a, b = colormath.DIN992Lab(L99, xy[0], xy[1])[1:] x, y = colormath.Lab2xyY(100.0, a, b)[:2] else: # xy x, y = xy cct, delta = colormath.xy_CCT_delta(x, y, daylight=whitepoint_no == 1) status = format % xy if cct: if delta: locus = {"Blackbody": "blackbody", "Daylight": "daylight"}.get(page.whitepoint_select.GetStringSelection(), page.whitepoint_select.GetStringSelection()) status = u"%s, CCT %i (%s %.2f)" % ( format % xy, cct, lang.getstr("delta_e_to_locus", locus), delta["E"]) else: status = u"%s, CCT %i" % (format % xy, cct) self.SetStatusText(status) else: self.SetStatusText(format % xy) if isinstance(event, wx.MouseEvent): event.Skip() # Go to next handler def OnMove(self, event=None): if self.IsShownOnScreen() and not \ self.IsMaximized() and not self.IsIconized(): x, y = self.GetScreenPosition() setcfg("position.profile_info.x", x) setcfg("position.profile_info.y", y) if event: event.Skip() def OnSashPosChanging(self, event): border, titlebar = get_platform_window_decoration_size() self.splitter.SetExpandedSize((self.splitter._splitx + self.splitter._GetSashSize() + border * 2, self.GetSize()[1])) setcfg("size.profile_info.w", self.splitter._splitx + self.splitter._GetSashSize()) wx.CallAfter(self.redraw) wx.CallAfter(self.resize_grid) def OnSize(self, event=None): if self.IsShownOnScreen() and self.IsMaximized(): self.splitter.AdjustLayout() self.splitter.Refresh() wx.CallAfter(self.redraw) wx.CallAfter(self.resize_grid) if self.IsShownOnScreen() and not self.IsIconized(): wx.CallAfter(self._setsize) if event: event.Skip() def OnWheel(self, event): xy = wx.GetMousePosition() if not self.client.GetClientRect().Contains(self.client.ScreenToClient(xy)): if self.grid.GetClientRect().Contains(self.grid.ScreenToClient(xy)): self.grid.SetFocus() event.Skip() elif self.client.last_draw: if event.WheelRotation < 0: direction = 1.0 else: direction = -1.0 self.client.zoom(direction) def _setsize(self): if not self.IsMaximized(): w, h = self.GetSize() border, titlebar = get_platform_window_decoration_size() if self.splitter._expanded < 0: self.splitter.SetExpandedSize((self.splitter._splitx + self.splitter._GetSashSize() + border * 2, self.GetSize()[1])) self.splitter.SetSplitSize((w, self.GetSize()[1])) setcfg("size.profile_info.w", self.splitter._splitx + self.splitter._GetSashSize()) setcfg("size.profile_info.split.w", w - border * 2) else: self.splitter.SetExpandedSize((w, self.GetSize()[1])) setcfg("size.profile_info.w", w - border * 2) setcfg("size.profile_info.h", h - titlebar - border) def drop_handler(self, path): """ Drag'n'drop handler for .cal/.icc/.icm files. """ self.LoadProfile(path, reset=False) def get_platform_window_size(self, defaultwidth=None, defaultheight=None, split=False): if split: name = ".split" else: name = "" if not defaultwidth: defaultwidth = defaults["size.profile_info%s.w" % name] if not defaultheight: defaultheight = defaults["size.profile_info.h"] border, titlebar = get_platform_window_decoration_size() #return (max(max(getcfg("size.profile_info%s.w" % name), #defaultwidth) + border * 2, self.GetMinSize()[0]), #max(getcfg("size.profile_info.h"), #defaultheight) + titlebar + border) if split: w, h = self.splitter.GetSplitSize() else: w, h = self.splitter.GetExpandedSize() return (max(w, defaultwidth + border * 2, self.GetMinSize()[0]), max(h, defaultheight + titlebar + border)) def key_handler(self, event): # AltDown # CmdDown # ControlDown # GetKeyCode # GetModifiers # GetPosition # GetRawKeyCode # GetRawKeyFlags # GetUniChar # GetUnicodeKey # GetX # GetY # HasModifiers # KeyCode # MetaDown # Modifiers # Position # RawKeyCode # RawKeyFlags # ShiftDown # UnicodeKey # X # Y key = event.GetKeyCode() if (event.ControlDown() or event.CmdDown()): # CTRL (Linux/Mac/Windows) / CMD (Mac) focus = self.FindFocus() if focus and self.grid in (focus, focus.GetParent(), focus.GetGrandParent()): event.Skip() if key == 83 and self.profile: # S self.SaveFile() return else: event.Skip() elif key in (43, wx.WXK_NUMPAD_ADD): # + key zoom in self.client.zoom(-1) elif key in (45, wx.WXK_NUMPAD_SUBTRACT): # - key zoom out self.client.zoom(1) else: event.Skip() def plot_mode_select_handler(self, event): self.Freeze() self.select_current_page() reset = (self.plot_mode_select.GetSelection() == self.plot_mode_select.GetCount() - 1) if not reset: self.client.resetzoom() self.DrawCanvas(reset=reset) if not reset: wx.CallAfter(self.client.center) self.Thaw() def get_commands(self): return self.get_common_commands() + ["profile-info [filename]", "load "] def process_data(self, data): if (data[0] == "profile-info" and len(data) < 3) or (data[0] == "load" and len(data) == 2): if self.IsIconized(): self.Restore() self.Raise() if len(data) == 2: path = data[1] if not os.path.isfile(path) and not os.path.isabs(path): path = get_data_path(path) if not path: return "fail" else: self.droptarget.OnDropFiles(0, 0, [path]) return "ok" return "invalid" def redraw(self): if self.plot_mode_select.GetSelection() == self.plot_mode_select.GetCount() - 1 and self.client.last_draw: # Update gamut plot self.client.Parent.Freeze() self.client._DrawCanvas(self.client.last_draw[0]) self.client.Parent.Thaw() def resize_grid(self, event=None): self.grid.SetColSize(1, max(self.grid.GetSize()[0] - self.grid.GetRowLabelSize() - self.grid.GetColSize(0) - wx.SystemSettings_GetMetric(wx.SYS_VSCROLL_X), 0)) self.grid.SetMargins(0 - wx.SystemSettings_GetMetric(wx.SYS_VSCROLL_X), 0 - wx.SystemSettings_GetMetric(wx.SYS_HSCROLL_Y)) self.grid.ForceRefresh() def select_current_page(self): if self.plot_mode_select.GetSelection() == self.plot_mode_select.GetCount() - 1: # Gamut plot self.options_panel.SetSelection(0) else: # Curves plot self.options_panel.SetSelection(1) self.splitter.GetTopLeft().Layout() def view_3d(self, event): profile = self.profile if not profile: defaultDir, defaultFile = get_verified_path("last_icc_path") dlg = wx.FileDialog(self, lang.getstr("profile.choose"), defaultDir=defaultDir, defaultFile=defaultFile, wildcard=lang.getstr("filetype.icc") + "|*.icc;*.icm", style=wx.FD_OPEN | wx.FD_FILE_MUST_EXIST) dlg.Center(wx.BOTH) result = dlg.ShowModal() path = dlg.GetPath() dlg.Destroy() if result != wx.ID_OK: return try: profile = ICCP.ICCProfile(path) except (IOError, ICCP.ICCProfileInvalidError), exception: show_result_dialog(Error(lang.getstr("profile.invalid") + "\n" + path), self) else: setcfg("last_icc_path", path) setcfg("last_cal_or_icc_path", path) if profile: view_3d_format = getcfg("3d.format") if view_3d_format == "HTML": x3d = True html = True elif view_3d_format == "X3D": x3d = True html = False else: x3d = False html = False profile_path = None if profile.fileName and os.path.isfile(profile.fileName): profile_path = profile.fileName if not profile_path or not waccess(os.path.dirname(profile_path), os.W_OK): result = self.worker.create_tempdir() if isinstance(result, Exception): show_result_dialog(result, self) return desc = profile.getDescription() profile_path = os.path.join(self.worker.tempdir, make_argyll_compatible_path(desc) + profile_ext) profile.write(profile_path) profile_mtime = os.stat(profile_path).st_mtime filename, ext = os.path.splitext(profile_path) comparison_profile = self.gamut_view_options.comparison_profile comparison_profile_path = None comparison_profile_mtime = 0 if comparison_profile: comparison_profile_path = comparison_profile.fileName if (comparison_profile_path and not waccess(os.path.dirname(comparison_profile_path), os.W_OK)): result = self.worker.create_tempdir() if isinstance(result, Exception): show_result_dialog(result, self) return comparison_profile_path = os.path.join(self.worker.tempdir, make_argyll_compatible_path(os.path.basename(comparison_profile_path))) comparison_profile.write(comparison_profile_path) comparison_profile_mtime = os.stat(comparison_profile_path).st_mtime mods = [] intent = self.gamut_view_options.intent if intent != "r": mods.append(intent) direction = self.gamut_view_options.direction[-1] if direction != "f": mods.append(direction) order = self.gamut_view_options.order if order != "n": mods.append(order) if mods: filename += " " + "".join(["[%s]" % mod.upper() for mod in mods]) if comparison_profile_path: filename += " vs " + os.path.splitext(os.path.basename(comparison_profile_path))[0] if mods: filename += " " + "".join(["[%s]" % mod.upper() for mod in mods]) for vrmlext in (".vrml", ".vrml.gz", ".wrl", ".wrl.gz", ".wrz"): vrmlpath = filename + vrmlext if sys.platform == "win32": vrmlpath = make_win32_compatible_long_path(vrmlpath) if os.path.isfile(vrmlpath): break outfilename = filename colorspace = self.gamut_view_options.get_colorspace(3) if colorspace != "Lab": outfilename += " " + colorspace vrmloutpath = outfilename + vrmlext x3dpath = outfilename + ".x3d" if html: finalpath = x3dpath + ".html" elif x3d: finalpath = x3dpath else: finalpath = vrmloutpath if sys.platform == "win32": vrmloutpath = make_win32_compatible_long_path(vrmloutpath) x3dpath = make_win32_compatible_long_path(x3dpath) finalpath = make_win32_compatible_long_path(finalpath) for outpath in (finalpath, vrmloutpath, vrmlpath): if os.path.isfile(outpath): mtime = os.stat(outpath).st_mtime if profile_mtime > mtime or comparison_profile_mtime > mtime: # Profile(s) have changed, delete existing 3D visualization # so it will be re-generated os.remove(outpath) if os.path.isfile(finalpath): launch_file(finalpath) else: if os.path.isfile(vrmloutpath): self.view_3d_consumer(True, None, None, vrmloutpath, x3d, x3dpath, html) elif os.path.isfile(vrmlpath): self.view_3d_consumer(True, colorspace, None, vrmlpath, x3d, x3dpath, html) else: # Create VRML file profile_paths = [profile_path] if comparison_profile_path: profile_paths.append(comparison_profile_path) self.worker.start(self.view_3d_consumer, self.worker.calculate_gamut, cargs=(colorspace, filename, None, x3d, x3dpath, html), wargs=(profile_paths, intent, direction, order, False), progress_msg=lang.getstr("gamut.view.create"), continue_next=x3d, fancy=False) def view_3d_consumer(self, result, colorspace, filename, vrmlpath, x3d, x3dpath, html): if filename: if getcfg("vrml.compress"): vrmlpath = filename + ".wrz" else: vrmlpath = filename + ".wrl" if os.path.isfile(vrmlpath) and colorspace not in ("Lab", None): filename, ext = os.path.splitext(vrmlpath) if ext.lower() in (".gz", ".wrz"): cls = GzipFileProper else: cls = open with cls(vrmlpath, "rb") as vrmlfile: vrml = vrmlfile.read() vrml = x3dom.update_vrml(vrml, colorspace) vrmlpath = filename + " " + colorspace + ext with cls(vrmlpath, "wb") as vrmlfile: vrmlfile.write(vrml) if not os.path.isfile(vrmlpath): if self.worker.errors: result = UnloggedError("".join(self.worker.errors).strip()) else: result = Error(lang.getstr("file.missing", vrmlpath)) if isinstance(result, Exception): self.worker.stop_progress() show_result_dialog(result, self) elif x3d: vrmlfile2x3dfile(vrmlpath, x3dpath, embed=getcfg("x3dom.embed"), html=html, view=True, force=False, cache=getcfg("x3dom.cache"), worker=self.worker) else: launch_file(vrmlpath) def view_3d_format_popup(self, event): menu = wx.Menu() item_selected = False for file_format in config.valid_values["3d.format"]: item = menu.AppendRadioItem(-1, file_format) item.Check(file_format == getcfg("3d.format")) self.Bind(wx.EVT_MENU, self.view_3d_format_handler, id=item.Id) self.PopupMenu(menu) for item in menu.MenuItems: self.Unbind(wx.EVT_MENU, id=item.Id) menu.Destroy() def view_3d_format_handler(self, event): for item in event.EventObject.MenuItems: if item.IsChecked(): setcfg("3d.format", item.GetItemLabelText()) self.view_3d(None) def main(): config.initcfg("profile-info") lang.init() lang.update_defaults() app = BaseApp(0) app.TopWindow = ProfileInfoFrame(None, -1) if sys.platform == "darwin": app.TopWindow.init_menubar() wx.CallLater(1, _main, app) app.MainLoop() def _main(app): app.TopWindow.listen() display_no = get_argyll_display_number(app.TopWindow.get_display()[1]) for arg in sys.argv[1:]: if os.path.isfile(arg): app.TopWindow.drop_handler(safe_unicode(arg)) break else: app.TopWindow.LoadProfile(get_display_profile(display_no)) app.TopWindow.Show() if __name__ == "__main__": main() DisplayCAL-3.1.0.0/DisplayCAL/wxReportFrame.py0000644000076500000000000010153112647526531020612 0ustar devwheel00000000000000# -*- coding: utf-8 -*- from time import gmtime, strftime import math import os import sys from config import get_data_path, initcfg, getcfg, geticon, hascfg, setcfg from log import safe_print from meta import name as appname from util_str import strtr from worker import Error, get_current_profile_path, show_result_dialog import CGATS import ICCProfile as ICCP import config import localization as lang import worker from wxTestchartEditor import TestchartEditor from wxwindows import BaseApp, BaseFrame, FileDrop, InfoDialog, wx from wxfixes import TempXmlResource import xh_fancytext import xh_filebrowsebutton import xh_hstretchstatbmp import xh_bitmapctrls from wx import xrc class ReportFrame(BaseFrame): """ Measurement report creation window """ def __init__(self, parent=None): BaseFrame.__init__(self, parent, -1, lang.getstr("measurement_report")) self.Bind(wx.EVT_CLOSE, self.OnClose) self.SetIcons(config.get_icon_bundle([256, 48, 32, 16], appname)) res = TempXmlResource(get_data_path(os.path.join("xrc", "report.xrc"))) res.InsertHandler(xh_fancytext.StaticFancyTextCtrlXmlHandler()) res.InsertHandler(xh_filebrowsebutton.FileBrowseButtonWithHistoryXmlHandler()) res.InsertHandler(xh_hstretchstatbmp.HStretchStaticBitmapXmlHandler()) res.InsertHandler(xh_bitmapctrls.BitmapButton()) res.InsertHandler(xh_bitmapctrls.StaticBitmap()) self.panel = res.LoadPanel(self, "panel") self.Sizer = wx.BoxSizer(wx.VERTICAL) self.Sizer.Add(self.panel, 1, flag=wx.EXPAND) self.set_child_ctrls_as_attrs(self) self.measurement_report_btn = wx.Button(self.panel, -1, lang.getstr("measure")) self.panel.Sizer.Insert(2, self.measurement_report_btn, flag=wx.RIGHT | wx.BOTTOM | wx.ALIGN_RIGHT, border=16) self.worker = worker.Worker(self) self.worker.set_argyll_version("xicclu") BaseFrame.setup_language(self) self.mr_setup_language() self.mr_init_controls() self.mr_init_frame() def mr_init_controls(self): for which in ("chart", "simulation_profile", "devlink_profile", "output_profile"): ctrl = self.FindWindowByName("%s_ctrl" % which) setattr(self, "%s_ctrl" % which, ctrl) ctrl.changeCallback = getattr(self, "%s_ctrl_handler" % which) if which not in ("devlink_profile", "output_profile"): if which == "chart": wildcard = "\.(cie|ti1|ti3)$" else: wildcard = "\.(icc|icm)$" history = [] if which == "simulation_profile": standard_profiles = config.get_standard_profiles(True) basenames = [] for path in standard_profiles: basename = os.path.basename(path) if not basename in basenames: basenames.append(basename) history.append(path) else: paths = get_data_path("ref", wildcard) or [] for path in paths: basepath, ext = os.path.splitext(path) if not (path.lower().endswith(".ti2") and basepath + ".cie" in paths): history.append(path) history = sorted(history, key=lambda path: os.path.basename(path).lower()) ctrl.SetHistory(history) ctrl.SetMaxFontSize(11) # Drop targets handler = getattr(self, "%s_drop_handler" % which) if which.endswith("_profile"): drophandlers = {".icc": handler, ".icm": handler} else: drophandlers = {".cgats": handler, ".cie": handler, ".ti1": handler, ".ti2": handler, ".ti3": handler, ".txt": handler} ctrl.SetDropTarget(FileDrop(self, drophandlers)) # Bind event handlers self.fields_ctrl.Bind(wx.EVT_CHOICE, self.fields_ctrl_handler) self.chart_btn.Bind(wx.EVT_BUTTON, self.chart_btn_handler) self.simulation_profile_cb.Bind(wx.EVT_CHECKBOX, self.use_simulation_profile_ctrl_handler) self.use_simulation_profile_as_output_cb.Bind(wx.EVT_CHECKBOX, self.use_simulation_profile_as_output_handler) self.enable_3dlut_cb.Bind(wx.EVT_CHECKBOX, self.enable_3dlut_handler) self.apply_none_ctrl.Bind(wx.EVT_RADIOBUTTON, self.apply_trc_ctrl_handler) self.apply_black_offset_ctrl.Bind(wx.EVT_RADIOBUTTON, self.apply_trc_ctrl_handler) self.apply_trc_ctrl.Bind(wx.EVT_RADIOBUTTON, self.apply_trc_ctrl_handler) self.mr_trc_ctrl.Bind(wx.EVT_CHOICE, self.mr_trc_ctrl_handler) self.mr_trc_gamma_ctrl.Bind(wx.EVT_COMBOBOX, self.mr_trc_gamma_ctrl_handler) self.mr_trc_gamma_ctrl.Bind(wx.EVT_KILL_FOCUS, self.mr_trc_gamma_ctrl_handler) self.mr_trc_gamma_type_ctrl.Bind(wx.EVT_CHOICE, self.mr_trc_gamma_type_ctrl_handler) self.mr_black_output_offset_ctrl.Bind(wx.EVT_SLIDER, self.mr_black_output_offset_ctrl_handler) self.mr_black_output_offset_intctrl.Bind(wx.EVT_TEXT, self.mr_black_output_offset_ctrl_handler) self.simulate_whitepoint_cb.Bind(wx.EVT_CHECKBOX, self.simulate_whitepoint_ctrl_handler) self.simulate_whitepoint_relative_cb.Bind(wx.EVT_CHECKBOX, self.simulate_whitepoint_relative_ctrl_handler) self.devlink_profile_cb.Bind(wx.EVT_CHECKBOX, self.use_devlink_profile_ctrl_handler) self.output_profile_current_btn.Bind(wx.EVT_BUTTON, self.output_profile_current_ctrl_handler) self.mr_update_controls() def mr_init_frame(self): self.measurement_report_btn.SetDefault() self.update_layout() config.defaults.update({ "position.reportframe.x": self.GetDisplay().ClientArea[0] + 40, "position.reportframe.y": self.GetDisplay().ClientArea[1] + 60, "size.reportframe.w": self.GetMinSize()[0], "size.reportframe.h": self.GetMinSize()[1]}) if (hascfg("position.reportframe.x") and hascfg("position.reportframe.y") and hascfg("size.reportframe.w") and hascfg("size.reportframe.h")): self.SetSaneGeometry(int(getcfg("position.reportframe.x")), int(getcfg("position.reportframe.y")), int(getcfg("size.reportframe.w")), int(getcfg("size.reportframe.h"))) else: self.Center() def OnClose(self, event=None): if (self.IsShownOnScreen() and not self.IsMaximized() and not self.IsIconized()): x, y = self.GetScreenPosition() setcfg("position.reportframe.x", x) setcfg("position.reportframe.y", y) setcfg("size.reportframe.w", self.GetSize()[0]) setcfg("size.reportframe.h", self.GetSize()[1]) config.writecfg() if event: event.Skip() def apply_trc_ctrl_handler(self, event): v = self.apply_trc_ctrl.GetValue() setcfg("measurement_report.apply_trc", int(v)) setcfg("measurement_report.apply_black_offset", int(self.apply_black_offset_ctrl.GetValue())) self.mr_update_main_controls() def mr_black_output_offset_ctrl_handler(self, event): if event.GetId() == self.mr_black_output_offset_intctrl.GetId(): self.mr_black_output_offset_ctrl.SetValue( self.mr_black_output_offset_intctrl.GetValue()) else: self.mr_black_output_offset_intctrl.SetValue( self.mr_black_output_offset_ctrl.GetValue()) v = self.mr_black_output_offset_ctrl.GetValue() / 100.0 if v != getcfg("measurement_report.trc_output_offset"): setcfg("measurement_report.trc_output_offset", v) self.mr_update_trc_control() self.mr_show_trc_controls() def mr_trc_gamma_ctrl_handler(self, event): try: v = float(self.mr_trc_gamma_ctrl.GetValue().replace(",", ".")) if (v < config.valid_ranges["measurement_report.trc_gamma"][0] or v > config.valid_ranges["measurement_report.trc_gamma"][1]): raise ValueError() except ValueError: wx.Bell() self.mr_trc_gamma_ctrl.SetValue(str(getcfg("measurement_report.trc_gamma"))) else: if str(v) != self.mr_trc_gamma_ctrl.GetValue(): self.mr_trc_gamma_ctrl.SetValue(str(v)) if v != getcfg("measurement_report.trc_gamma"): setcfg("measurement_report.trc_gamma", v) self.mr_update_trc_control() self.mr_show_trc_controls() event.Skip() def mr_trc_ctrl_handler(self, event): self.Freeze() if self.mr_trc_ctrl.GetSelection() == 1: # BT.1886 setcfg("measurement_report.trc_gamma", 2.4) setcfg("measurement_report.trc_gamma_type", "B") setcfg("measurement_report.trc_output_offset", 0.0) self.mr_update_trc_controls() elif self.mr_trc_ctrl.GetSelection() == 0: # Pure power gamma 2.2 setcfg("measurement_report.trc_gamma", 2.2) setcfg("measurement_report.trc_gamma_type", "b") setcfg("measurement_report.trc_output_offset", 1.0) self.mr_update_trc_controls() self.mr_show_trc_controls() self.Thaw() def mr_trc_gamma_type_ctrl_handler(self, event): v = self.trc_gamma_types_ab[self.mr_trc_gamma_type_ctrl.GetSelection()] if v != getcfg("measurement_report.trc_gamma_type"): setcfg("measurement_report.trc_gamma_type", v) self.mr_update_trc_control() self.mr_show_trc_controls() def chart_btn_handler(self, event): if self.Parent: parent = self.Parent else: parent = self chart = getcfg("measurement_report.chart") if not hasattr(parent, "tcframe"): parent.tcframe = TestchartEditor(parent, path=chart, cfg="measurement_report.chart", parent_set_chart_methodname="mr_set_testchart") elif (not hasattr(parent.tcframe, "ti1") or chart != parent.tcframe.ti1.filename): parent.tcframe.tc_load_cfg_from_ti1(None, chart, "measurement_report.chart", "mr_set_testchart") setcfg("tc.show", 1) parent.tcframe.Show() parent.tcframe.Raise() def chart_ctrl_handler(self, event): chart = self.chart_ctrl.GetPath() values = [] try: cgats = CGATS.CGATS(chart) except (IOError, CGATS.CGATSInvalidError, CGATS.CGATSInvalidOperationError, CGATS.CGATSKeyError, CGATS.CGATSTypeError, CGATS.CGATSValueError), exception: show_result_dialog(exception, self) else: data_format = cgats.queryv1("DATA_FORMAT") accurate = cgats.queryv1("ACCURATE_EXPECTED_VALUES") == "true" if data_format: basename, ext = os.path.splitext(chart) for column in data_format.itervalues(): column_prefix = column.split("_")[0] if (column_prefix in ("CMYK", "LAB", "RGB", "XYZ") and column_prefix not in values and (((ext.lower() == ".cie" or accurate) and column_prefix in ("LAB", "XYZ")) or (ext.lower() == ".ti1" and column_prefix in ("CMYK", "RGB")) or (ext.lower() not in (".cie", ".ti1")))): values.append(column_prefix) if values: self.panel.Freeze() self.fields_ctrl.SetItems(values) self.fields_ctrl.GetContainingSizer().Layout() self.panel.Thaw() fields = getcfg("measurement_report.chart.fields") if ext.lower() == ".ti1": index = 0 elif "RGB" in values and not ext.lower() == ".cie": index = values.index("RGB") elif "CMYK" in values: index = values.index("CMYK") elif "XYZ" in values: index = values.index("XYZ") elif "LAB" in values: index = values.index("LAB") else: index = 0 self.fields_ctrl.SetSelection(index) setcfg("measurement_report.chart", chart) self.chart_patches_amount.Freeze() self.chart_patches_amount.SetLabel( str(cgats.queryv1("NUMBER_OF_SETS") or "")) self.update_estimated_measurement_time("chart") self.chart_patches_amount.GetContainingSizer().Layout() self.chart_patches_amount.Thaw() self.chart_white = cgats.get_white_cie() if event: v = int(not self.chart_white or not "RGB" in values) setcfg("measurement_report.whitepoint.simulate", v) setcfg("measurement_report.whitepoint.simulate.relative", v) if not values: if chart: show_result_dialog(lang.getstr("error.testchart.missing_fields", (chart, "RGB/CMYK %s LAB/XYZ" % lang.getstr("or"))), self) self.chart_ctrl.SetPath(getcfg("measurement_report.chart")) else: self.chart_btn.Enable("RGB" in values) if self.Parent: parent = self.Parent else: parent = self if (event and self.chart_btn.Enabled and hasattr(parent, "tcframe") and self.tcframe.IsShownOnScreen() and (not hasattr(parent.tcframe, "ti1") or chart != parent.tcframe.ti1.filename)): parent.tcframe.tc_load_cfg_from_ti1(None, chart, "measurement_report.chart", "mr_set_testchart") self.fields_ctrl.Enable(self.fields_ctrl.GetCount() > 1) self.fields_ctrl_handler(event) def chart_drop_handler(self, path): if not self.worker.is_working(): self.chart_ctrl.SetPath(path) self.chart_ctrl_handler(True) def devlink_profile_ctrl_handler(self, event): self.set_profile("devlink") def devlink_profile_drop_handler(self, path): if not self.worker.is_working(): self.devlink_profile_ctrl.SetPath(path) self.set_profile("devlink") def enable_3dlut_handler(self, event): setcfg("3dlut.enable", int(self.enable_3dlut_cb.GetValue())) setcfg("measurement_report.use_devlink_profile", 0) self.mr_update_main_controls() def fields_ctrl_handler(self, event): setcfg("measurement_report.chart.fields", self.fields_ctrl.GetStringSelection()) if event: self.mr_update_main_controls() def output_profile_ctrl_handler(self, event): self.set_profile("output") def output_profile_current_ctrl_handler(self, event): profile_path = get_current_profile_path(True, True) if profile_path and os.path.isfile(profile_path): self.output_profile_ctrl.SetPath(profile_path) self.set_profile("output") def output_profile_drop_handler(self, path): if not self.worker.is_working(): self.output_profile_ctrl.SetPath(path) self.set_profile("output") def set_profile(self, which, profile_path=None, silent=False): path = getattr(self, "%s_profile_ctrl" % which).GetPath() if which == "output": ##if profile_path is None: ##profile_path = get_current_profile_path(True, True) ##self.output_profile_current_btn.Enable(self.output_profile_ctrl.IsShown() and ##bool(profile_path) and ##os.path.isfile(profile_path) and ##profile_path != path) profile = config.get_current_profile(True) if profile: path = profile.fileName else: path = None setcfg("measurement_report.output_profile", path) # XYZbpout will be set to the blackpoint of the selected profile. # This is used to determine if black output offset controls should # be shown. Set a initial value slightly above zero so output # offset controls are shown if the selected profile doesn't exist. self.XYZbpout = [0.001, 0.001, 0.001] else: profile = None if which == "input": self.XYZbpin = [0, 0, 0] if path or profile: if path and not os.path.isfile(path): if not silent: show_result_dialog(Error(lang.getstr("file.missing", path)), parent=self) return if not profile: try: profile = ICCP.ICCProfile(path) except (IOError, ICCP.ICCProfileInvalidError): if not silent: show_result_dialog(Error(lang.getstr("profile.invalid") + "\n" + path), parent=self) except IOError, exception: if not silent: show_result_dialog(exception, parent=self) if profile: if ((which == "simulation" and (profile.profileClass not in ("mntr", "prtr") or profile.colorSpace not in ("CMYK", "RGB"))) or (which == "output" and (profile.profileClass != "mntr" or profile.colorSpace != "RGB")) or (which == "devlink" and profile.profileClass != "link")): show_result_dialog(NotImplementedError(lang.getstr("profile.unsupported", (profile.profileClass, profile.colorSpace))), parent=self) else: if (not getattr(self, which + "_profile", None) or getattr(self, which + "_profile").fileName != profile.fileName): if which == "simulation": # Get profile blackpoint so we can check if it makes # sense to show TRC type and output offset controls try: odata = self.worker.xicclu(profile, (0, 0, 0), pcs="x") except Exception, exception: show_result_dialog(exception, self) else: if len(odata) != 1 or len(odata[0]) != 3: show_result_dialog("Blackpoint is invalid: %s" % odata, self) self.XYZbpin = odata[0] elif which == "output": # Get profile blackpoint so we can check if input # values would be clipped try: odata = self.worker.xicclu(profile, (0, 0, 0), pcs="x") except Exception, exception: show_result_dialog(exception, self) else: if len(odata) != 1 or len(odata[0]) != 3: show_result_dialog("Blackpoint is invalid: %s" % odata, self) self.XYZbpout = odata[0] setattr(self, "%s_profile" % which, profile) if not silent: setcfg("measurement_report.%s_profile" % which, profile.fileName) if which == "simulation": self.use_simulation_profile_ctrl_handler(None) elif hasattr(self, "XYZbpin"): self.mr_update_main_controls() return profile if path: getattr(self, "%s_profile_ctrl" % which).SetPath(getcfg("measurement_report.%s_profile" % which)) else: setattr(self, "%s_profile" % which, None) if not silent: setcfg("measurement_report.%s_profile" % which, None) self.mr_update_main_controls() def mr_setup_language(self): # Shared with main window for which in ("chart", "simulation_profile", "devlink_profile", "output_profile"): if which.endswith("_profile"): wildcard = lang.getstr("filetype.icc") + "|*.icc;*.icm" else: wildcard = (lang.getstr("filetype.ti1_ti3_txt") + "|*.cgats;*.cie;*.ti1;*.ti2;*.ti3;*.txt") msg = {"chart": "measurement_report_choose_chart_or_reference", "devlink_profile": "devicelink_profile", "output_profile": "measurement_report_choose_profile"}.get(which, which) kwargs = dict(toolTip=lang.getstr(msg).rstrip(":"), dialogTitle=lang.getstr(msg), fileMask=wildcard) ctrl = getattr(self, "%s_ctrl" % which) for name, value in kwargs.iteritems(): setattr(ctrl, name, value) items = [] for item in ("Gamma 2.2", "trc.rec1886", "custom"): items.append(lang.getstr(item)) self.mr_trc_ctrl.SetItems(items) self.trc_gamma_types_ab = {0: "b", 1: "B"} self.trc_gamma_types_ba = {"b": 0, "B": 1} self.mr_trc_gamma_type_ctrl.SetItems([lang.getstr("trc.type.relative"), lang.getstr("trc.type.absolute")]) def mr_show_trc_controls(self): shown = self.apply_trc_ctrl.IsShown() enable6 = (shown and bool(getcfg("measurement_report.apply_trc"))) show = shown and self.mr_trc_ctrl.GetSelection() == 2 self.panel.Freeze() self.mr_trc_ctrl.Enable(enable6) self.mr_trc_ctrl.Show(shown) self.mr_trc_gamma_label.Enable(enable6) self.mr_trc_gamma_label.Show(show) self.mr_trc_gamma_ctrl.Enable(enable6) self.mr_trc_gamma_ctrl.Show(show) self.mr_trc_gamma_type_ctrl.Enable(enable6) self.mr_black_output_offset_label.Enable(enable6 and self.XYZbpout > [0, 0, 0]) self.mr_black_output_offset_label.Show(show and self.XYZbpout > [0, 0, 0]) self.mr_black_output_offset_ctrl.Enable(enable6 and self.XYZbpout > [0, 0, 0]) self.mr_black_output_offset_ctrl.Show(show and self.XYZbpout > [0, 0, 0]) self.mr_black_output_offset_intctrl.Enable(enable6 and self.XYZbpout > [0, 0, 0]) self.mr_black_output_offset_intctrl.Show(show and self.XYZbpout > [0, 0, 0]) self.mr_black_output_offset_intctrl_label.Enable(enable6 and self.XYZbpout > [0, 0, 0]) self.mr_black_output_offset_intctrl_label.Show(show and self.XYZbpout > [0, 0, 0]) self.mr_trc_gamma_type_ctrl.Show(show and self.XYZbpout > [0, 0, 0]) self.panel.Layout() self.panel.Thaw() def simulate_whitepoint_ctrl_handler(self, event): v = self.simulate_whitepoint_cb.GetValue() setcfg("measurement_report.whitepoint.simulate", int(v)) self.mr_update_main_controls() def simulate_whitepoint_relative_ctrl_handler(self, event): setcfg("measurement_report.whitepoint.simulate.relative", int(self.simulate_whitepoint_relative_cb.GetValue())) def simulation_profile_ctrl_handler(self, event): self.set_profile("simulation") def simulation_profile_drop_handler(self, path): if not self.worker.is_working(): self.simulation_profile_ctrl.SetPath(path) self.set_profile("simulation") def mr_update_controls(self): """ Update controls with values from the configuration """ self.panel.Freeze() self.simulation_profile_ctrl.SetPath(getcfg("measurement_report.simulation_profile")) self.set_profile("simulation", silent=True) self.mr_update_trc_controls() self.devlink_profile_ctrl.SetPath(getcfg("measurement_report.devlink_profile")) self.set_profile("devlink", silent=True) self.output_profile_ctrl.SetPath(getcfg("measurement_report.output_profile")) self.set_profile("output", silent=True) self.mr_set_testchart(getcfg("measurement_report.chart")) self.use_simulation_profile_ctrl_handler(None) self.panel.Thaw() def mr_update_trc_control(self): if (getcfg("measurement_report.trc_gamma_type") == "B" and getcfg("measurement_report.trc_output_offset") == 0 and getcfg("measurement_report.trc_gamma") == 2.4): self.mr_trc_ctrl.SetSelection(1) # BT.1886 elif (getcfg("measurement_report.trc_gamma_type") == "b" and getcfg("measurement_report.trc_output_offset") == 1 and getcfg("measurement_report.trc_gamma") == 2.2): self.mr_trc_ctrl.SetSelection(0) # Pure power gamma 2.2 else: self.mr_trc_ctrl.SetSelection(2) # Custom def mr_update_trc_controls(self): self.mr_update_trc_control() self.mr_trc_gamma_ctrl.SetValue(str(getcfg("measurement_report.trc_gamma"))) self.mr_trc_gamma_type_ctrl.SetSelection(self.trc_gamma_types_ba[getcfg("measurement_report.trc_gamma_type")]) outoffset = int(getcfg("measurement_report.trc_output_offset") * 100) self.mr_black_output_offset_ctrl.SetValue(outoffset) self.mr_black_output_offset_intctrl.SetValue(outoffset) def mr_set_testchart(self, path): self.chart_ctrl.SetPath(path) self.chart_ctrl_handler(None) def mr_update_main_controls(self): ##print "MR update main ctrls", self.panel.Freeze() chart_has_white = bool(getattr(self, "chart_white", None)) color = getcfg("measurement_report.chart.fields") sim_profile_color = (getattr(self, "simulation_profile", None) and self.simulation_profile.colorSpace) if getcfg("measurement_report.use_simulation_profile"): setcfg("measurement_report.use_simulation_profile", int(sim_profile_color == color)) self.simulation_profile_cb.Enable(sim_profile_color == color) self.simulation_profile_cb.Show(color in ("CMYK", "RGB")) enable1 = bool(getcfg("measurement_report.use_simulation_profile")) ##print enable1, enable2 = (sim_profile_color == "RGB" and bool(getcfg("measurement_report.use_simulation_profile_as_output"))) self.simulation_profile_cb.SetValue(enable1) self.simulation_profile_ctrl.Show(color in ("CMYK", "RGB")) self.use_simulation_profile_as_output_cb.Show(enable1 and sim_profile_color == "RGB") self.use_simulation_profile_as_output_cb.SetValue(enable1 and enable2) self.enable_3dlut_cb.Enable(enable1 and enable2) self.enable_3dlut_cb.SetValue(enable1 and enable2 and bool(getcfg("3dlut.enable"))) self.enable_3dlut_cb.Show(enable1 and sim_profile_color == "RGB" and config.get_display_name() in ("madVR", "Prisma")) enable5 = (sim_profile_color == "RGB" and isinstance(self.simulation_profile.tags.get("rXYZ"), ICCP.XYZType) and isinstance(self.simulation_profile.tags.get("gXYZ"), ICCP.XYZType) and isinstance(self.simulation_profile.tags.get("bXYZ"), ICCP.XYZType)) ##print enable5, self.XYZbpin, self.XYZbpout self.mr_trc_label.Show(enable1 and enable5) self.apply_none_ctrl.Show(enable1 and enable5) self.apply_none_ctrl.SetValue( (not getcfg("measurement_report.apply_black_offset") and not getcfg("measurement_report.apply_trc")) or not enable5) self.apply_black_offset_ctrl.Show(enable1 and enable5) self.apply_black_offset_ctrl.SetValue(enable5 and bool(getcfg("measurement_report.apply_black_offset"))) self.apply_trc_ctrl.Show(enable1 and enable5) self.apply_trc_ctrl.SetValue(enable5 and bool(getcfg("measurement_report.apply_trc"))) enable6 = (enable1 and enable5 and bool(getcfg("measurement_report.apply_trc") or getcfg("measurement_report.apply_black_offset"))) self.mr_show_trc_controls() show = (self.apply_none_ctrl.GetValue() and enable1 and enable5 and self.XYZbpout > self.XYZbpin) self.input_value_clipping_bmp.Show(show) self.input_value_clipping_label.Show(show) self.simulate_whitepoint_cb.Enable((enable1 and not enable2) or (color in ("LAB", "XYZ") and chart_has_white)) enable3 = bool(getcfg("measurement_report.whitepoint.simulate")) self.simulate_whitepoint_cb.SetValue(((enable1 and not enable2) or color in ("LAB", "XYZ")) and enable3) self.simulate_whitepoint_relative_cb.Enable(((enable1 and not enable2) or color in ("LAB", "XYZ")) and enable3) self.simulate_whitepoint_relative_cb.SetValue( ((enable1 and not enable2) or color in ("LAB", "XYZ")) and enable3 and bool(getcfg("measurement_report.whitepoint.simulate.relative"))) self.devlink_profile_cb.Show(enable1 and enable2) enable4 = bool(getcfg("measurement_report.use_devlink_profile")) self.devlink_profile_cb.SetValue(enable1 and enable2 and enable4) self.devlink_profile_ctrl.Enable(enable1 and enable2 and enable4) self.devlink_profile_ctrl.Show(enable1 and enable2) self.output_profile_label.Enable((color in ("LAB", "RGB", "XYZ") or enable1) and (not enable1 or not enable2 or self.apply_trc_ctrl.GetValue() or self.apply_black_offset_ctrl.GetValue())) self.output_profile_ctrl.Enable((color in ("LAB", "RGB", "XYZ") or enable1) and (not enable1 or not enable2 or self.apply_trc_ctrl.GetValue() or self.apply_black_offset_ctrl.GetValue())) output_profile = ((hasattr(self, "presets") and getcfg("measurement_report.output_profile") not in self.presets or not hasattr(self, "presets")) and bool(getattr(self, "output_profile", None))) self.measurement_report_btn.Enable(((enable1 and enable2 and (not enable6 or output_profile) and (not enable4 or (bool(getcfg("measurement_report.devlink_profile")) and os.path.isfile(getcfg("measurement_report.devlink_profile"))))) or (((not enable1 and color in ("LAB", "RGB", "XYZ")) or (enable1 and sim_profile_color == color and not enable2)) and output_profile)) and bool(getcfg("measurement_report.chart")) and os.path.isfile(getcfg("measurement_report.chart"))) self.panel.Layout() self.panel.Thaw() if hasattr(self, "update_scrollbars"): self.update_scrollbars() self.calpanel.Layout() else: self.update_layout() def update_estimated_measurement_time(self, which, patches=None): """ Update the estimated measurement time shown """ integration_time = self.worker.get_instrument_features().get("integration_time") if integration_time: if which == "chart" and not patches: patches = int(self.chart_patches_amount.Label) opatches = patches # Scale integration time based on display technology tech = getcfg("display.technology").lower() prop = [1, 1] if "plasma" in tech or "crt" in tech: prop[0] = 1.9 elif "projector" in tech or "dlp" in tech: prop[0] = 2.2 prop[1] = 2.2 elif "oled" in tech: prop[0] = 2.2 integration_time = [min(prop[i] * v, 20) for i, v in enumerate(integration_time)] # Get time per patch (tpp) tpp = [v for v in integration_time] if (("plasma" in tech or "crt" in tech or "projector" in tech or "dlp" in tech) and self.worker.get_instrument_name() in ("ColorMunki", "DTP92", "DTP94", "i1 Display", "i1 Display 1", "i1 Display 2", "i1 DisplayPro, ColorMunki Display", "i1 Monitor", "i1 Pro", "i1 Pro 2", "K-10", "specbos", "Spyder2", "Spyder3", "Spyder4", "Spyder5")): # Not all instruments can measure refresh rate! Add .25 secs # for those who do if refresh mode is used. tpp = [v + .25 for v in tpp] if config.get_display_name() == "madVR": # madVR takes a tad longer tpp = [v + .45 for v in tpp] min_delay_s = .2 if getcfg("measure.override_min_display_update_delay_ms"): # Add additional display update delay (zero at <= 200 ms) min_delay_ms = getcfg("measure.min_display_update_delay_ms") min_delay_s = max(min_delay_ms / 1000.0, min_delay_s) if getcfg("measure.override_display_settle_time_mult"): # We don't have access to display rise/fall time, so use this as # generic delay multiplier settle_mult = getcfg("measure.display_settle_time_mult") else: settle_mult = 1.0 tpp = [v + min_delay_s + .145 * settle_mult for v in tpp] avg_delay = sum(tpp) / (8 / 3.0) seconds = avg_delay * patches oseconds = seconds if getcfg("drift_compensation.blacklevel"): # Assume black patch every 60 seconds seconds += math.ceil(oseconds / 60.0) * ((20 - tpp[0]) / 2.0 + tpp[0]) # Assume black patch every n samples seconds += math.ceil(opatches / 40.0) * ((20 - tpp[0]) / 2.0 + tpp[0]) if getcfg("drift_compensation.whitelevel"): # Assume white patch every 60 seconds seconds += math.ceil(oseconds / 60.0) * tpp[1] # Assume white patch every n samples seconds += math.ceil(opatches / 40.0) * tpp[1] timestamp = gmtime(seconds) hours = int(strftime("%H", timestamp)) minutes = int(strftime("%M", timestamp)) minutes += int(math.ceil(int(strftime("%S", timestamp)) / 60.0)) if minutes > 59: minutes = 0 hours += 1 else: hours, minutes = "--", "--" getattr(self, which + "_meas_time").Label = lang.getstr("estimated_measurement_time", (hours, minutes)) # Show visual warning by coloring the text if measurement is going to # take a long time. Display and instrument stability and repeatability # may be an issue over such long periods of time. if hours != "--" and hours > 7: # Warning color "red" color = "#FF3300" elif hours != "--" and hours > 3: # Warning color "orange" color = "#F07F00" else: # Default text color color = wx.SystemSettings.GetColour(wx.SYS_COLOUR_WINDOWTEXT) getattr(self, which + "_meas_time").ForegroundColour = color def use_devlink_profile_ctrl_handler(self, event): setcfg("3dlut.enable", 0) setcfg("measurement_report.use_devlink_profile", int(self.devlink_profile_cb.GetValue())) self.mr_update_main_controls() def use_simulation_profile_ctrl_handler(self, event): if event: use_sim_profile = self.simulation_profile_cb.GetValue() setcfg("measurement_report.use_simulation_profile", int(use_sim_profile)) else: use_sim_profile = getcfg("measurement_report.use_simulation_profile") sim_profile = getattr(self, "simulation_profile", None) enable = False if sim_profile: v = int(sim_profile.profileClass == "prtr") setcfg("measurement_report.whitepoint.simulate", v) setcfg("measurement_report.whitepoint.simulate.relative", v) if ("rTRC" in sim_profile.tags and "gTRC" in sim_profile.tags and "bTRC" in sim_profile.tags and sim_profile.tags.rTRC == sim_profile.tags.gTRC == sim_profile.tags.bTRC and isinstance(sim_profile.tags.rTRC, ICCP.CurveType)): tf = sim_profile.tags.rTRC.get_transfer_function() # Use BT.1886 gamma mapping for SMPTE 240M / Rec. 709 TRC setcfg("measurement_report.apply_trc", int(tf[0][1] in (-240, -709) or tf[0][0].startswith("Gamma"))) # Use only BT.1886 black output offset setcfg("measurement_report.apply_black_offset", int(tf[0][1] not in (-240, -709) and not tf[0][0].startswith("Gamma") and self.XYZbpin != self.XYZbpout)) # Set gamma to profile gamma if single gamma profile if tf[0][0].startswith("Gamma"): if not getcfg("measurement_report.trc_gamma.backup", False): # Backup current gamma setcfg("measurement_report.trc_gamma.backup", getcfg("measurement_report.trc_gamma")) setcfg("measurement_report.trc_gamma", round(tf[0][1], 2)) # Restore previous gamma if not single gamma profile elif getcfg("measurement_report.trc_gamma.backup", False): setcfg("measurement_report.trc_gamma", getcfg("measurement_report.trc_gamma.backup")) setcfg("measurement_report.trc_gamma.backup", None) self.mr_update_trc_controls() enable = (tf[0][1] not in (-240, -709) and self.XYZbpin != self.XYZbpout) self.apply_black_offset_ctrl.Enable(use_sim_profile and enable) self.mr_update_main_controls() def use_simulation_profile_as_output_handler(self, event): setcfg("measurement_report.use_simulation_profile_as_output", int(self.use_simulation_profile_as_output_cb.GetValue())) self.mr_update_main_controls() if __name__ == "__main__": config.initcfg() lang.init() lang.update_defaults() app = BaseApp(0) app.TopWindow = ReportFrame() app.TopWindow.Show() app.MainLoop() DisplayCAL-3.1.0.0/DisplayCAL/wxScriptingClient.py0000644000076500000000000004225312647526531021472 0ustar devwheel00000000000000# -*- coding: utf-8 -*- from __future__ import with_statement from time import sleep import errno import os import socket import sys import threading from config import confighome, getcfg, geticon, initcfg, setcfg, writecfg from meta import name as appname from safe_print import safe_print from util_str import safe_str, safe_unicode, universal_newlines from wexpect import split_command_line from wxaddons import wx from wxfixes import GenBitmapButton from wxwindows import BaseApp, SimpleTerminal, numpad_keycodes import config import demjson import localization as lang import wx.lib.delayedresult as delayedresult ERRORCOLOR = "#FF3300" RESPONSECOLOR = "#CCCCCC" class ScriptingClientFrame(SimpleTerminal): def __init__(self): SimpleTerminal.__init__(self, None, wx.ID_ANY, lang.getstr("scripting-client"), start_timer=False, pos=(getcfg("position.scripting.x"), getcfg("position.scripting.y")), size=(getcfg("size.scripting.w"), getcfg("size.scripting.h")), consolestyle=wx.TE_CHARWRAP | wx.TE_MULTILINE | wx.TE_PROCESS_ENTER | wx.TE_RICH | wx.VSCROLL | wx.NO_BORDER, show=False, name="scriptingframe") self.SetIcons(config.get_icon_bundle([256, 48, 32, 16], appname + "-scripting-client")) self.console.SetForegroundColour("#EEEEEE") self.console.SetDefaultStyle(wx.TextAttr("#EEEEEE")) self.busy = False self.commands = [] self.history = [] self.historyfilename = os.path.join(confighome, config.appbasename + "-scripting-client.history") if os.path.isfile(self.historyfilename): try: with open(self.historyfilename) as historyfile: for line in historyfile: self.history.append(safe_unicode(line, "UTF-8").rstrip("\r\n")) except EnvironmentError, exception: safe_print("Warning - couldn't read history file:", exception) # Always have empty selection at bottom self.history.append("") self.historypos = len(self.history) - 1 self.overwrite = False # Determine which application we should connect to by default (if any) self.conn = None scripting_hosts = self.get_scripting_hosts() self.sizer.Layout() if sys.platform != "darwin": # Under Mac OS X, the transparency messes up the window shadow if # there is another window's border behind self.SetTransparent(240) self.Bind(wx.EVT_ACTIVATE, self.OnActivate) self.Bind(wx.EVT_SIZE, self.OnSize) self.Unbind(wx.EVT_CHAR_HOOK) self.console.Unbind(wx.EVT_KEY_DOWN, self.console) self.console.Bind(wx.EVT_KEY_DOWN, self.key_handler) self.console.Bind(wx.EVT_TEXT_COPY, self.copy_text_handler) self.console.Bind(wx.EVT_TEXT_PASTE, self.paste_text_handler) if sys.platform == "darwin": # Under Mac OS X, pasting text via the context menu isn't catched # by EVT_TEXT_PASTE. TODO: Implement custom context menu. self.console.Bind(wx.EVT_CONTEXT_MENU, lambda event: None) if scripting_hosts: self.add_text("> getscriptinghosts" + "\n") for host in scripting_hosts: self.add_text(host + "\n") ip_port = scripting_hosts[0].split()[0] self.add_text("> connect " + ip_port + "\n") self.connect_handler(ip_port) def OnActivate(self, event): self.console.SetFocus() linecount = self.console.GetNumberOfLines() lastline = self.console.GetLineText(linecount - 1) lastpos = self.console.GetLastPosition() start, end = self.console.GetSelection() if (start == end and self.console.GetInsertionPoint() < lastpos - len(lastline)): self.console.SetInsertionPoint(lastpos) def OnClose(self, event): # So we can send_command('close') ourselves without prematurely exiting # the wx main loop while self.busy: wx.Yield() sleep(.05) self.Hide() try: with open(self.historyfilename, "wb") as historyfile: for command in self.history: if command: historyfile.write(safe_str(command, "UTF-8") + os.linesep) except EnvironmentError, exception: safe_print("Warning - couldn't write history file:", exception) self.listening = False self.Destroy() def OnMove(self, event=None): if self.IsShownOnScreen() and not self.IsMaximized() and not \ self.IsIconized(): x, y = self.GetScreenPosition() setcfg("position.scripting.x", x) setcfg("position.scripting.y", y) if event: event.Skip() def OnSize(self, event=None): if self.IsShownOnScreen() and not self.IsMaximized() and not \ self.IsIconized(): w, h = self.GetSize() setcfg("size.scripting.w", w) setcfg("size.scripting.h", h) if event: event.Skip() def add_error_text(self, text): self.add_text(text) end = self.console.GetLastPosition() start = end - len(text) self.mark_text(start, end, ERRORCOLOR) def check_result(self, delayedResult, get_response=False, additional_commands=None, colorize=True): try: result = delayedResult.get() except Exception, exception: if hasattr(exception, "originalTraceback"): self.add_text(exception.originalTraceback) result = exception if result: text = "%s\n" % safe_unicode(result) self.add_text(text) if colorize or isinstance(result, Exception): end = self.console.GetLastPosition() start = end - len(text) if isinstance(result, Exception): color = ERRORCOLOR else: color = RESPONSECOLOR self.mark_text(start, end, color) if get_response and not isinstance(result, Exception): delayedresult.startWorker(self.check_result, get_response, cargs=(False, additional_commands)) else: self.add_text("> ") if additional_commands: self.add_text(additional_commands[0].rstrip("\n")) if additional_commands[0].endswith("\n"): self.send_command_handler(additional_commands[0], additional_commands[1:]) return self.console.SetFocus() self.busy = False def clear(self): self.console.Clear() self.add_text("> ") self.console.SetInsertionPoint(2) def connect_handler(self, ip_port): ip, port = ip_port.split(":", 1) try: port = int(port) except ValueError: self.add_error_text(lang.getstr("port.invalid", port) + "\n") self.add_text("> ") return if self.conn: self.disconnect() self.add_text(lang.getstr("connecting.to", (ip, port)) + "\n") self.busy = True delayedresult.startWorker(self.check_result, self.connect, cargs=(self.get_app_info, None, False), wargs=(ip, port)) def copy_text_handler(self, event): # Override native copy to clipboard because reading the text back # from wx.TheClipboard results in wrongly encoded characters under # Mac OS X # TODO: The correct way to fix this would actually be in the pasting # code because pasting text that was copied from other sources still # has the problem with this workaround clipdata = wx.TextDataObject() clipdata.SetText(self.console.GetStringSelection()) wx.TheClipboard.Open() wx.TheClipboard.SetData(clipdata) wx.TheClipboard.Close() def disconnect(self): if self.conn: try: peer = self.conn.getpeername() self.conn.shutdown(socket.SHUT_RDWR) except socket.error, exception: if exception.errno != errno.ENOTCONN: self.add_text(safe_unicode(exception) + "\n") else: self.add_text(lang.getstr("disconnected.from", peer) + "\n") self.conn.close() del self.conn self.conn = None self.commands = [] else: self.add_error_text(lang.getstr("not_connected") + "\n") def get_app_info(self): commands = ["setresponseformat plain", "getcommands", "getappname"] try: for command in commands: self.conn.send_command(command) response = self.conn.get_single_response() if command == "getcommands": self.commands = response.splitlines() elif command == "getappname": wx.CallAfter(self.add_text, lang.getstr("connected.to.at", ((response, ) + self.conn.getpeername())) + "\n%s\n" % lang.getstr("scripting-client.cmdhelptext")) except socket.error, exception: return exception def get_commands(self): return self.get_common_commands() + ["clear", "connect :", "disconnect", "echo ", "getscriptinghosts"] def get_common_commands(self): cmds = SimpleTerminal.get_common_commands(self) return filter(lambda cmd: not cmd.startswith("echo "), cmds) def get_last_line(self): linecount = self.console.GetNumberOfLines() lastline = self.console.GetLineText(linecount - 1) lastpos = self.console.GetLastPosition() start, end = self.console.GetSelection() startcol, startrow = self.console.PositionToXY(start) endcol, endrow = self.console.PositionToXY(end) if startcol > lastpos or endcol > lastpos: # Under Mac OS X, PositionToXY seems to be broken and returns insane # numbers. Calculate them ourselves. Note they will only be correct # for the last line, but that's all we care about. startcol = len(lastline) - (lastpos - start) endcol = len(lastline) - (lastpos - end) return lastline, lastpos, startcol, endcol def get_response(self): try: return "< " + "\n< ".join(self.conn.get_single_response().splitlines()) except socket.error, exception: return exception def key_handler(self, event): ##safe_print("KeyCode", event.KeyCode, "UnicodeKey", event.UnicodeKey, ##"AltDown:", event.AltDown(), ##"CmdDown:", event.CmdDown(), ##"ControlDown:", event.ControlDown(), ##"MetaDown:", event.MetaDown(), ##"ShiftDown:", event.ShiftDown(), ##"console.CanUndo:", self.console.CanUndo(), ##"console.CanRedo:", self.console.CanRedo()) insertionpoint = self.console.GetInsertionPoint() lastline, lastpos, startcol, endcol = self.get_last_line() ##safe_print(insertionpoint, lastline, lastpos, startcol, endcol) cmd_or_ctrl = (event.ControlDown() or event.CmdDown()) and not event.AltDown() if cmd_or_ctrl and event.KeyCode == 65: # A self.console.SelectAll() elif cmd_or_ctrl and event.KeyCode in (67, 88): # C self.copy_text_handler(None) elif insertionpoint >= lastpos - len(lastline): if cmd_or_ctrl: if startcol > 1 and event.KeyCode == 86: # V self.paste_text_handler(None) elif event.KeyCode in (89, 90): # Y / Z if (event.KeyCode == 89 or (sys.platform != "win32" and event.ShiftDown())): if self.console.CanRedo(): self.console.Redo() else: wx.Bell() elif self.console.CanUndo() and lastline[2:]: self.console.Undo() else: wx.Bell() elif event.KeyCode != wx.WXK_SHIFT and event.UnicodeKey: # wxPython 3 "Phoenix" defines UnicodeKey as "\x00" when # control key pressed if event.UnicodeKey != "\0": wx.Bell() elif event.KeyCode in (10, 13, wx.WXK_NUMPAD_ENTER): # Enter, return key self.send_command_handler(lastline[2:]) elif event.KeyCode == wx.WXK_BACK: # Backspace if startcol > 1 and endcol > 2: if endcol > startcol: # TextCtrl.WriteText would be optimal, but it doesn't # do anything under wxGTK with wxPython 2.8.12 self.add_text("\r" + lastline[:startcol] + lastline[endcol:]) self.console.SetInsertionPoint(lastpos - len(lastline) + startcol) else: event.Skip() else: wx.Bell() elif event.KeyCode in (wx.WXK_DELETE, wx.WXK_NUMPAD_DELETE): if startcol > 1 and (endcol < len(lastline) or startcol < endcol): if endcol > startcol: # TextCtrl.WriteText would be optimal, but it doesn't # do anything under wxGTK with wxPython 2.8.12 self.add_text("\r" + lastline[:startcol] + lastline[endcol:]) self.console.SetInsertionPoint(lastpos - len(lastline) + startcol) else: event.Skip() else: wx.Bell() elif event.KeyCode in (wx.WXK_DOWN, wx.WXK_NUMPAD_DOWN, wx.WXK_NUMPAD_PAGEDOWN, wx.WXK_PAGEDOWN): if self.historypos < len(self.history) - 1: self.historypos += 1 self.add_text("\r> " + self.history[self.historypos]) else: wx.Bell() elif event.KeyCode in (wx.WXK_END, wx.WXK_NUMPAD_END): event.Skip() elif event.KeyCode in (wx.WXK_HOME, wx.WXK_NUMPAD_HOME): self.console.SetInsertionPoint(lastpos - len(lastline) + 2) elif event.KeyCode in (wx.WXK_INSERT, wx.WXK_NUMPAD_INSERT): self.overwrite = not self.overwrite elif event.KeyCode in (wx.WXK_LEFT, wx.WXK_NUMPAD_LEFT): if (startcol > 2): event.Skip() else: wx.Bell() elif event.KeyCode in (wx.WXK_RIGHT, wx.WXK_NUMPAD_RIGHT): if endcol < len(lastline): event.Skip() else: wx.Bell() elif event.KeyCode in (wx.WXK_UP, wx.WXK_NUMPAD_UP, wx.WXK_NUMPAD_PAGEUP, wx.WXK_PAGEUP): if self.historypos > 0: self.historypos -= 1 self.add_text("\r> " + self.history[self.historypos]) else: wx.Bell() elif event.KeyCode == wx.WXK_TAB: # Tab completion # Can't use built-in AutoComplete feature because it only # works for single-line TextCtrls commonpart = lastline[2:endcol] candidates = [] for command in sorted(list(set(self.commands + self.get_commands()))): command = command.split()[0] if command.startswith(commonpart): candidates.append(command) findcommon = bool(candidates) while findcommon and len(candidates[0]) > len(commonpart): commonpart += candidates[0][len(commonpart)] for candidate in candidates: if candidate.startswith(commonpart): continue else: commonpart = commonpart[:-1] findcommon = False break if len(candidates) > 1: self.add_text("\n%s\n" % " ".join(candidates)) self.add_text("\r> " + commonpart + lastline[endcol:]) self.console.SetInsertionPoint(self.console.GetLastPosition() - len(lastline[endcol:])) elif event.UnicodeKey or event.KeyCode in numpad_keycodes: if startcol > 1: event.Skip() if self.overwrite and startcol == endcol: self.add_text("\r> " + lastline[2:startcol] + lastline[endcol + 1:]) self.console.SetInsertionPoint(insertionpoint) else: wx.Bell() self.console.SetInsertionPoint(lastpos) elif event.KeyCode not in (wx.WXK_ALT, wx.WXK_COMMAND, wx.WXK_CONTROL, wx.WXK_SHIFT): wx.Bell() self.console.SetInsertionPoint(lastpos) def mark_text(self, start, end, color): self.console.SetStyle(start, end, wx.TextAttr(color)) def paste_text_handler(self, event): do = wx.TextDataObject() wx.TheClipboard.Open() success = wx.TheClipboard.GetData(do) wx.TheClipboard.Close() if success: insertionpoint = self.console.GetInsertionPoint() lastline, lastpos, startcol, endcol = self.get_last_line() cliptext = universal_newlines(do.GetText()) lines = cliptext.replace("\n", "\n\0").split("\0") command1 = (lastline[2:startcol] + lines[0].rstrip("\n") + lastline[endcol:]) self.add_text("\r> " + command1) if "\n" in cliptext: self.send_command_handler(command1, lines[1:]) else: self.console.SetInsertionPoint(insertionpoint + len(cliptext)) def process_data(self, data): if data[0] == "echo" and len(data) > 1: linecount = self.console.GetNumberOfLines() lastline = self.console.GetLineText(linecount - 1) if lastline: self.add_text("\n") txt = " ".join(data[1:]) safe_print(txt) self.add_text(txt + "\n") if lastline: self.add_text("> ") return "ok" return "invalid" def process_data_local(self, data): if data[0] == "clear" and len(data) == 1: self.clear() elif (data[0] == "connect" and len(data) == 2 and len(data[1].split(":")) == 2): wx.CallAfter(self.connect_handler, data[1]) elif data[0] == "disconnect" and len(data) == 1: self.disconnect() self.add_text("> ") #elif data[0] == "echo" and len(data) > 1: #self.add_text(" ".join(data[1:]) + "\n") #return elif data[0] == "getscriptinghosts" and len(data) == 1: return self.get_scripting_hosts() else: return "invalid" return "ok" def send_command(self, command): try: self.conn.send_command(command) except socket.error, exception: return exception if not wx.GetApp().IsMainLoopRunning(): delayedresult.AbortEvent()() def send_command_handler(self, command, additional_commands=None): self.add_text("\n") command = command.strip() if not command: self.add_text("> ") return data = split_command_line(command) response = self.process_data_local(data) if response == "ok": pass elif isinstance(response, list): self.add_text("\n".join(response)) self.add_text("\n> ") elif not self or not self.conn: self.add_error_text(lang.getstr("not_connected") + "\n") self.add_text("> ") else: self.busy = True delayedresult.startWorker(self.check_result, self.send_command, cargs=(self.get_response, additional_commands), wargs=(command, )) self.history.insert(len(self.history) - 1, command) if len(self.history) > 1000: del self.history[0] self.historypos = len(self.history) - 1 def main(): config.initcfg("scripting-client") lang.init() app = BaseApp(0) app.TopWindow = ScriptingClientFrame() if sys.platform == "darwin": app.TopWindow.init_menubar() app.TopWindow.listen() app.TopWindow.Show() app.MainLoop() writecfg(module="scripting-client", options=("position.scripting", "size.scripting")) if __name__ == "__main__": main() DisplayCAL-3.1.0.0/DisplayCAL/wxSynthICCFrame.py0000644000076500000000000006213512647526531020771 0ustar devwheel00000000000000# -*- coding: utf-8 -*- import math import os import sys from ICCProfile import ICCProfile from config import get_data_path, get_verified_path, getcfg, hascfg, setcfg from log import safe_print from meta import name as appname from options import debug from util_os import waccess from worker import Error, show_result_dialog import ICCProfile as ICCP import colormath import config import localization as lang import worker from wxwindows import BaseApp, BaseFrame, FileDrop, InfoDialog, wx from wxfixes import TempXmlResource import floatspin import xh_floatspin import xh_bitmapctrls from wx import xrc class SynthICCFrame(BaseFrame): """ 3D LUT creation window """ def __init__(self, parent=None): self.res = TempXmlResource(get_data_path(os.path.join("xrc", "synthicc.xrc"))) self.res.InsertHandler(xh_floatspin.FloatSpinCtrlXmlHandler()) self.res.InsertHandler(xh_bitmapctrls.BitmapButton()) self.res.InsertHandler(xh_bitmapctrls.StaticBitmap()) if hasattr(wx, "PreFrame"): # Classic pre = wx.PreFrame() self.res.LoadOnFrame(pre, parent, "synthiccframe") self.PostCreate(pre) else: # Phoenix wx.Frame.__init__(self) self.res.LoadFrame(self, parent, "synthiccframe") self.init() self.Bind(wx.EVT_CLOSE, self.OnClose) self.SetIcons(config.get_icon_bundle([256, 48, 32, 16], appname + "-synthprofile")) self.set_child_ctrls_as_attrs(self) self.panel = self.FindWindowByName("panel") self._updating_ctrls = False # Presets presets = [""] + sorted(colormath.rgb_spaces.keys()) self.preset_ctrl.SetItems(presets) self.worker = worker.Worker(self) # Drop targets self.droptarget = FileDrop(self) self.droptarget.drophandlers = {".icc": self.drop_handler, ".icm": self.drop_handler} self.panel.SetDropTarget(self.droptarget) # Bind event handlers self.preset_ctrl.Bind(wx.EVT_CHOICE, self.preset_ctrl_handler) for color in ("red", "green", "blue", "white", "black"): for component in "XYZxy": if component in "xy": handler = "xy" else: handler = "XYZ" self.Bind(floatspin.EVT_FLOATSPIN, getattr(self, "%s_%s_ctrl_handler" % (color, handler)), getattr(self, "%s_%s" % (color, component))) self.black_point_cb.Bind(wx.EVT_CHECKBOX, self.black_point_enable_handler) self.trc_ctrl.Bind(wx.EVT_CHOICE, self.trc_ctrl_handler) self.trc_gamma_ctrl.Bind(wx.EVT_COMBOBOX, self.trc_gamma_ctrl_handler) self.trc_gamma_ctrl.Bind(wx.EVT_KILL_FOCUS, self.trc_gamma_ctrl_handler) self.trc_gamma_type_ctrl.Bind(wx.EVT_CHOICE, self.trc_gamma_type_ctrl_handler) self.black_output_offset_ctrl.Bind(wx.EVT_SLIDER, self.black_output_offset_ctrl_handler) self.black_output_offset_intctrl.Bind(wx.EVT_TEXT, self.black_output_offset_ctrl_handler) self.colorspace_rgb_ctrl.Bind(wx.EVT_RADIOBUTTON, self.colorspace_ctrl_handler) self.colorspace_gray_ctrl.Bind(wx.EVT_RADIOBUTTON, self.colorspace_ctrl_handler) self.black_luminance_ctrl.Bind(floatspin.EVT_FLOATSPIN, self.black_luminance_ctrl_handler) self.luminance_ctrl.Bind(floatspin.EVT_FLOATSPIN, self.luminance_ctrl_handler) self.save_as_btn.Bind(wx.EVT_BUTTON, self.save_as_btn_handler) self.save_as_btn.SetDefault() self.save_as_btn.Disable() self.setup_language() self.update_controls() self.update_layout() self.save_btn.Hide() config.defaults.update({ "position.synthiccframe.x": self.GetDisplay().ClientArea[0] + 40, "position.synthiccframe.y": self.GetDisplay().ClientArea[1] + 60, "size.synthiccframe.w": self.GetMinSize()[0], "size.synthiccframe.h": self.GetMinSize()[1]}) if (hascfg("position.synthiccframe.x") and hascfg("position.synthiccframe.y") and hascfg("size.synthiccframe.w") and hascfg("size.synthiccframe.h")): self.SetSaneGeometry(int(getcfg("position.synthiccframe.x")), int(getcfg("position.synthiccframe.y")), int(getcfg("size.synthiccframe.w")), int(getcfg("size.synthiccframe.h"))) else: self.Center() def OnClose(self, event=None): if sys.platform == "darwin" or debug: self.focus_handler(event) if (self.IsShownOnScreen() and not self.IsMaximized() and not self.IsIconized()): x, y = self.GetScreenPosition() setcfg("position.synthiccframe.x", x) setcfg("position.synthiccframe.y", y) setcfg("size.synthiccframe.w", self.GetSize()[0]) setcfg("size.synthiccframe.h", self.GetSize()[1]) if self.Parent: config.writecfg() else: config.writecfg(module="synthprofile", options=("synthprofile.", "last_icc_path", "position.synthiccframe", "size.synthiccframe")) if event: event.Skip() def black_luminance_ctrl_handler(self, event): v = self.black_luminance_ctrl.GetValue() white_Y = getcfg("synthprofile.luminance") if v >= white_Y * .9: if event: wx.Bell() v = white_Y * .9 if event: min_Y = (1 / 65535.0) * 100 increment = (1 / 65535.0) * white_Y if increment < min_Y: increment = min_Y * (white_Y / 100.0) min_inc = 1.0 / (10.0 ** self.black_luminance_ctrl.GetDigits()) if increment < min_inc: increment = min_inc self.black_luminance_ctrl.SetIncrement(increment) fmt = "%%.%if" % self.black_luminance_ctrl.GetDigits() if fmt % v > fmt % 0 and fmt % v < fmt % increment: if event: v = increment else: v = 0 elif fmt % v == fmt % 0: v = 0 v = round(v / increment) * increment self.black_luminance_ctrl.SetValue(v) old = getcfg("synthprofile.black_luminance") setcfg("synthprofile.black_luminance", v) if event: self.black_xy_ctrl_handler(None) self.black_point_cb.Enable(v > 0) self.black_point_enable_handler(None) if (v != old and (old == 0 or v == 0)) or event is True: self.Freeze() i = self.trc_ctrl.GetSelection() self.trc_gamma_type_ctrl.Show(i in (0, 4) and bool(v)) if not v: self.bpc_ctrl.SetValue(False) self.bpc_ctrl.Enable(bool(v)) black_output_offset_show = (i in (0, 4) and bool(v)) self.black_output_offset_label.Show(black_output_offset_show) self.black_output_offset_ctrl.Show(black_output_offset_show) self.black_output_offset_intctrl.Show(black_output_offset_show) self.black_output_offset_intctrl_label.Show(black_output_offset_show) self.panel.GetSizer().Layout() self.update_layout() self.Thaw() def black_output_offset_ctrl_handler(self, event): if event.GetId() == self.black_output_offset_intctrl.GetId(): self.black_output_offset_ctrl.SetValue( self.black_output_offset_intctrl.GetValue()) else: self.black_output_offset_intctrl.SetValue( self.black_output_offset_ctrl.GetValue()) v = self.black_output_offset_ctrl.GetValue() / 100.0 setcfg("synthprofile.trc_output_offset", v) self.update_trc_control() def black_point_enable_handler(self, event): v = getcfg("synthprofile.black_luminance") for component in "XYZxy": getattr(self, "black_%s" % component).Enable(v > 0 and self.black_point_cb.Value) def black_XYZ_ctrl_handler(self, event): luminance = getcfg("synthprofile.luminance") XYZ = [] for component in "XYZ": XYZ.append(getattr(self, "black_%s" % component).GetValue() / 100.0) if component == "Y": self.black_luminance_ctrl.SetValue(XYZ[-1] * luminance) self.black_luminance_ctrl_handler(None) if not XYZ[-1]: XYZ = [0, 0, 0] for i in xrange(3): getattr(self, "black_%s" % "XYZ"[i]).SetValue(0) break for i, v in enumerate(colormath.XYZ2xyY(*XYZ)[:2]): getattr(self, "black_%s" % "xy"[i]).SetValue(v) def black_xy_ctrl_handler(self, event): # Black Y scaled to 0..1 range Y = (getcfg("synthprofile.black_luminance") / getcfg("synthprofile.luminance")) xy = [] for component in "xy": xy.append(getattr(self, "black_%s" % component).GetValue() or 1.0 / 3) getattr(self, "black_%s" % component).SetValue(xy[-1]) for i, v in enumerate(colormath.xyY2XYZ(*xy + [Y])): getattr(self, "black_%s" % "XYZ"[i]).SetValue(v * 100) def blue_XYZ_ctrl_handler(self, event): self.parse_XYZ("blue") def blue_xy_ctrl_handler(self, event): self.parse_xy("blue") def colorspace_ctrl_handler(self, event): show = bool(self.colorspace_rgb_ctrl.Value) for color in ("red", "green", "blue"): getattr(self, "label_%s" % color).Show(show) for component in "XYZxy": getattr(self, "%s_%s" % (color, component)).Show(show) self.enable_save_as_btn() self.update_layout() def drop_handler(self, path): try: profile = ICCP.ICCProfile(path) except (IOError, ICCP.ICCProfileInvalidError), exception: show_result_dialog(Error(lang.getstr("profile.invalid") + "\n" + path), self) else: if profile.version >= 4: show_result_dialog(Error(lang.getstr("profile.iccv4.unsupported")), self) return if (profile.colorSpace not in ("RGB", "GRAY") or profile.connectionColorSpace not in ("Lab", "XYZ")): show_result_dialog(Error(lang.getstr("profile.unsupported", (profile.profileClass, profile.colorSpace))), self) return rgb = [(1, 1, 1), (0, 0, 0), (1, 0, 0), (0, 1, 0), (0, 0, 1)] for i in xrange(256): rgb.append((1.0 / 255 * i, 1.0 / 255 * i, 1.0 / 255 * i)) try: colors = self.worker.xicclu(profile, rgb, intent="a", pcs="x") except Exception, exception: show_result_dialog(exception, self) else: self.panel.Freeze() for ctrl, value in [(self.colorspace_rgb_ctrl, profile.colorSpace == "RGB"), (self.colorspace_gray_ctrl, profile.colorSpace == "GRAY")]: ctrl.SetValue(value) self.colorspace_ctrl_handler(None) if "lumi" in profile.tags: luminance = profile.tags.lumi.Y else: luminance = 100 setcfg("synthprofile.luminance", luminance) self.luminance_ctrl.SetValue(luminance) for i, color in enumerate(("white", "black")): for j, component in enumerate("XYZ"): getattr(self, "%s_%s" % (color, component)).SetValue(colors[i][j] / colors[0][1] * 100) self.parse_XYZ(color) for i, color in enumerate(("red", "green", "blue")): xyY = colormath.XYZ2xyY(*colors[2 + i]) for j, component in enumerate("xy"): getattr(self, "%s_%s" % (color, component)).SetValue(xyY[j]) self.parse_xy(None) self.black_XYZ_ctrl_handler(None) trc = ICCP.CurveType(profile=profile) for XYZ in colors[5:]: trc.append(XYZ[1] / colors[0][1] * 65535) transfer_function = trc.get_transfer_function() if transfer_function and transfer_function[1] >= .95: # Use detected transfer function gamma = transfer_function[0][1] else: # Use 50% gamma value gamma = math.log(colors[132][1]) / math.log(128.0 / 255) self.set_trc(round(gamma, 2)) setcfg("synthprofile.trc_gamma_type", "g") self.trc_gamma_type_ctrl.SetSelection(self.trc_gamma_types_ba["g"]) self.panel.Thaw() def enable_save_as_btn(self): self.save_as_btn.Enable(bool(self.get_XYZ())) def get_XYZ(self): """ Get XYZ in 0..1 range """ XYZ = {} black_Y = (getcfg("synthprofile.black_luminance") / getcfg("synthprofile.luminance")) for color in ("white", "red", "green", "blue", "black"): for component in "XYZ": v = getattr(self, "%s_%s" % (color, component)).GetValue() / 100.0 if color == "black": key = "k" if not self.black_point_cb.Value: v = XYZ["w%s" % component] * black_Y else: key = color[0] XYZ[key + component] = v if (XYZ["wX"] and XYZ["wY"] and XYZ["wZ"] and (self.colorspace_gray_ctrl.Value or (XYZ["rX"] and XYZ["gY"] and XYZ["bZ"]))): return XYZ def green_XYZ_ctrl_handler(self, event): self.parse_XYZ("green") def green_xy_ctrl_handler(self, event): self.parse_xy("green") def luminance_ctrl_handler(self, event): v = self.luminance_ctrl.GetValue() setcfg("synthprofile.luminance", v) self.black_luminance_ctrl_handler(event) def parse_XYZ(self, name, set_blackpoint=False): if not set_blackpoint: set_blackpoint = not self.black_point_cb.Value if not self._updating_ctrls: self.preset_ctrl.SetSelection(0) XYZ = {} # Black Y scaled to 0..1 range black_Y = (getcfg("synthprofile.black_luminance") / getcfg("synthprofile.luminance")) for component in "XYZ": v = getattr(self, "%s_%s" % (name, component)).GetValue() XYZ[component] = v if name == "white" and set_blackpoint: getattr(self, "black_%s" % (component)).SetValue(v * black_Y) if "X" in XYZ and "Y" in XYZ and "Z" in XYZ: xyY = colormath.XYZ2xyY(XYZ["X"], XYZ["Y"], XYZ["Z"]) for i, component in enumerate("xy"): getattr(self, "%s_%s" % (name, component)).SetValue(xyY[i]) if name == "white" and set_blackpoint: getattr(self, "black_%s" % (component)).SetValue(xyY[i]) self.enable_save_as_btn() def parse_xy(self, name=None, set_blackpoint=False): if not set_blackpoint: set_blackpoint = not self.black_point_cb.Value if not self._updating_ctrls: self.preset_ctrl.SetSelection(0) xy = {} for color in ("white", "red", "green", "blue"): for component in "xy": v = getattr(self, "%s_%s" % (color, component)).GetValue() xy[color[0] + component] = v if name == "white": wXYZ = colormath.xyY2XYZ(xy["wx"], xy["wy"], 1.0) else: wXYZ = [] for component in "XYZ": wXYZ.append(getattr(self, "white_%s" % component).GetValue() / 100.0) if name == "white": # Black Y scaled to 0..1 range black_Y = (getcfg("synthprofile.black_luminance") / getcfg("synthprofile.luminance")) for i, component in enumerate("XYZ"): getattr(self, "white_%s" % component).SetValue(wXYZ[i] * 100) if set_blackpoint: getattr(self, "black_%s" % component).SetValue(wXYZ[i] * black_Y * 100) has_rgb_xy = True # Calculate RGB to XYZ matrix from chromaticities and white try: mtx = colormath.rgb_to_xyz_matrix(xy["rx"], xy["ry"], xy["gx"], xy["gy"], xy["bx"], xy["by"], wXYZ) except ZeroDivisionError: # Singular matrix has_rgb_xy = False rgb = {"r": (1.0, 0.0, 0.0), "g": (0.0, 1.0, 0.0), "b": (0.0, 0.0, 1.0)} XYZ = {} for color in ("red", "green", "blue"): if has_rgb_xy: # Calculate XYZ for primaries v = mtx * rgb[color[0]] if not has_rgb_xy: v = (0, 0, 0) XYZ[color[0]] = v for i, component in enumerate("XYZ"): getattr(self, "%s_%s" % (color, component)).SetValue(XYZ[color[0]][i] * 100) self.enable_save_as_btn() def preset_ctrl_handler(self, event): preset_name = self.preset_ctrl.GetStringSelection() if preset_name: gamma, white, red, green, blue = colormath.rgb_spaces[preset_name] white = colormath.get_whitepoint(white) self._updating_ctrls = True for i, component in enumerate("XYZ"): getattr(self, "white_%s" % component).SetValue(white[i] * 100) self.parse_XYZ("white", True) for color in ("red", "green", "blue"): for i, component in enumerate("xy"): getattr(self, "%s_%s" % (color, component)).SetValue(locals()[color][i]) self.parse_xy(None) self.set_trc(gamma) self._updating_ctrls = False def get_commands(self): return self.get_common_commands() + ["synthprofile [filename]", "load "] def process_data(self, data): if (data[0] == "synthprofile" and len(data) < 3) or (data[0] == "load" and len(data) == 2): if self.IsIconized(): self.Restore() self.Raise() if len(data) == 2: path = data[1] if not os.path.isfile(path) and not os.path.isabs(path): path = get_data_path(path) if not path: return "fail" else: self.droptarget.OnDropFiles(0, 0, [path]) return "ok" return "invalid" def set_trc(self, gamma): if gamma == -1023: # DICOM self.trc_ctrl.SetSelection(1) elif gamma == -3.0: # L* self.trc_ctrl.SetSelection(2) elif gamma == -709: # Rec. 709 self.trc_ctrl.SetSelection(3) elif gamma == -1886: # Rec. 1886 self.trc_ctrl.SetSelection(4) self.trc_ctrl_handler() elif gamma == -240: # SMPTE 240M self.trc_ctrl.SetSelection(5) elif gamma == -2084: # SMPTE 2084 self.trc_ctrl.SetSelection(6) elif gamma == -2.4: # sRGB self.trc_ctrl.SetSelection(7) else: # Gamma self.trc_ctrl.SetSelection(0) setcfg("synthprofile.trc_gamma", gamma) self.update_trc_controls() def profile_name_ctrl_handler(self, event): self.enable_save_as_btn() def red_XYZ_ctrl_handler(self, event): self.parse_XYZ("red") def red_xy_ctrl_handler(self, event): self.parse_xy("red") def save_as_btn_handler(self, event): XYZ = self.get_XYZ() try: gamma = float(self.trc_gamma_ctrl.Value) except ValueError: wx.Bell() gamma = 2.2 self.trc_gamma_ctrl.Value = str(gamma) white = XYZ["wX"], XYZ["wY"], XYZ["wZ"] if self.trc_ctrl.GetSelection() in (0, 1, 4, 6): # 0 = Gamma # 1 = DICOM - trc set here is not actually used in the end # 4 = Rec. 1886 - trc set here is only used if black = 0 # 6 = SMPTE 2084 - trc set here is not actually used in the end trc = gamma elif self.trc_ctrl.GetSelection() == 2: # L* trc = -3.0 elif self.trc_ctrl.GetSelection() == 3: # Rec. 709 trc = -709 elif self.trc_ctrl.GetSelection() == 5: # SMPTE 240M trc = -240 elif self.trc_ctrl.GetSelection() == 7: # sRGB trc = -2.4 defaultDir, defaultFile = get_verified_path("last_icc_path") defaultFile = lang.getstr("unnamed") if self.colorspace_rgb_ctrl.Value: # Color profile profile = ICCP.ICCProfile.from_XYZ((XYZ["rX"], XYZ["rY"], XYZ["rZ"]), (XYZ["gX"], XYZ["gY"], XYZ["gZ"]), (XYZ["bX"], XYZ["bY"], XYZ["bZ"]), (XYZ["wX"], XYZ["wY"], XYZ["wZ"]), trc, defaultFile, getcfg("copyright")) black = colormath.adapt(XYZ["kX"], XYZ["kY"], XYZ["kZ"], white) profile.tags.rTRC = ICCP.CurveType(profile=profile) profile.tags.gTRC = ICCP.CurveType(profile=profile) profile.tags.bTRC = ICCP.CurveType(profile=profile) channels = "rgb" else: # Grayscale profile profile = ICCP.ICCProfile() profile.colorSpace = "GRAY" profile.setCopyright(getcfg("copyright")) profile.tags.wtpt = ICCP.XYZType() (profile.tags.wtpt.X, profile.tags.wtpt.Y, profile.tags.wtpt.Z) = (XYZ["wX"], XYZ["wY"], XYZ["wZ"]) black = [XYZ["wY"] * (getcfg("synthprofile.black_luminance") / getcfg("synthprofile.luminance"))] * 3 profile.tags.kTRC = ICCP.CurveType(profile=profile) channels = "k" if self.trc_ctrl.GetSelection() == 1: # DICOM # Absolute luminance values! try: if self.colorspace_rgb_ctrl.Value: # Color profile profile.set_dicom_trc([v * getcfg("synthprofile.luminance") for v in black], getcfg("synthprofile.luminance")) else: # Grayscale profile profile.tags.kTRC.set_dicom_trc(getcfg("synthprofile.black_luminance"), getcfg("synthprofile.luminance")) except ValueError, exception: show_result_dialog(exception, self) return elif self.trc_ctrl.GetSelection() in (0, 4) and black != [0, 0, 0]: # Gamma with output offset or Rec. 1886-like outoffset = getcfg("synthprofile.trc_output_offset") if self.colorspace_rgb_ctrl.Value: # Color profile profile.set_bt1886_trc(black, outoffset, gamma, getcfg("synthprofile.trc_gamma_type")) else: # Grayscale profile profile.tags.kTRC.set_bt1886_trc(black[1], outoffset, gamma, getcfg("synthprofile.trc_gamma_type")) elif self.trc_ctrl.GetSelection() == 6: # SMPTE 2084 if self.colorspace_rgb_ctrl.Value: # Color profile profile.set_smpte2084_trc([v * getcfg("synthprofile.luminance") for v in black], getcfg("synthprofile.luminance")) else: # Grayscale profile profile.tags.kTRC.set_smpte2084_trc(getcfg("synthprofile.black_luminance"), getcfg("synthprofile.luminance")) elif black != [0, 0, 0]: if self.colorspace_rgb_ctrl.Value: # Color profile rXYZ = profile.tags.rXYZ.values() gXYZ = profile.tags.gXYZ.values() bXYZ = profile.tags.bXYZ.values() mtx = colormath.Matrix3x3([[rXYZ[0], gXYZ[0], bXYZ[0]], [rXYZ[1], gXYZ[1], bXYZ[1]], [rXYZ[2], gXYZ[2], bXYZ[2]]]) rgbblack = mtx.inverted() * black else: # Grayscale profile rgbblack = black # Optimize for uInt16Number encoding rgbblack = [round(max(v, 0) * 65535) / 65535 for v in rgbblack] for i, channel in enumerate(channels): TRC = profile.tags["%sTRC" % channel] TRC.set_trc(trc, 1024, vmin=rgbblack[i] * 65535) else: for channel in channels: profile.tags["%sTRC" % channel].set_trc(trc, 1) if black != [0, 0, 0] and self.bpc_ctrl.Value: for channel in channels: profile.tags["%sTRC" % channel].apply_bpc() for tagname in ("lumi", "bkpt"): if tagname == "lumi": # Absolute X, Y, Z = [(v / XYZ["wY"]) * getcfg("synthprofile.luminance") for v in (XYZ["wX"], XYZ["wY"], XYZ["wZ"])] else: X, Y, Z = (XYZ["kX"], XYZ["kY"], XYZ["kZ"]) profile.tags[tagname] = ICCP.XYZType() (profile.tags[tagname].X, profile.tags[tagname].Y, profile.tags[tagname].Z) = X, Y, Z path = None dlg = wx.FileDialog(self, lang.getstr("save_as"), defaultDir=defaultDir, defaultFile=defaultFile, wildcard="*.icc", style=wx.SAVE | wx.FD_OVERWRITE_PROMPT) dlg.Center(wx.BOTH) if dlg.ShowModal() == wx.ID_OK: path = dlg.GetPath() dlg.Destroy() if path: if os.path.splitext(path)[1].lower() not in (".icc", ".icm"): path += ".icc" if not waccess(path, os.W_OK): show_result_dialog(Error(lang.getstr("error.access_denied.write", path)), self) return setcfg("last_icc_path", path) profile.setDescription(os.path.splitext(os.path.basename(path))[0]) profile.calculateID() try: profile.write(path) except Exception, exception: show_result_dialog(exception, self) def setup_language(self): BaseFrame.setup_language(self) items = [] for item in self.trc_ctrl.Items: items.append(lang.getstr(item)) self.trc_ctrl.SetItems(items) self.trc_ctrl.SetSelection(0) self.trc_gamma_types_ab = {0: "g", 1: "G"} self.trc_gamma_types_ba = {"g": 0, "G": 1} self.trc_gamma_type_ctrl.SetItems([lang.getstr("trc.type.relative"), lang.getstr("trc.type.absolute")]) def trc_ctrl_handler(self, event=None): if not self._updating_ctrls: self.preset_ctrl.SetSelection(0) i = self.trc_ctrl.GetSelection() if i == 4: # BT.1886 setcfg("synthprofile.trc_gamma", 2.4) setcfg("synthprofile.trc_gamma_type", "G") setcfg("synthprofile.trc_output_offset", 0.0) if not self._updating_ctrls: self.update_trc_controls() def trc_gamma_type_ctrl_handler(self, event): setcfg("synthprofile.trc_gamma_type", self.trc_gamma_types_ab[self.trc_gamma_type_ctrl.GetSelection()]) self.update_trc_control() def trc_gamma_ctrl_handler(self, event): if not self._updating_ctrls: try: v = float(self.trc_gamma_ctrl.GetValue().replace(",", ".")) if (v < config.valid_ranges["gamma"][0] or v > config.valid_ranges["gamma"][1]): raise ValueError() except ValueError: wx.Bell() self.trc_gamma_ctrl.SetValue(str(getcfg("synthprofile.trc_gamma"))) else: if str(v) != self.trc_gamma_ctrl.GetValue(): self.trc_gamma_ctrl.SetValue(str(v)) setcfg("synthprofile.trc_gamma", float(self.trc_gamma_ctrl.GetValue())) self.preset_ctrl.SetSelection(0) self.update_trc_control() event.Skip() def update_controls(self): """ Update controls with values from the configuration """ self.luminance_ctrl.SetValue(getcfg("synthprofile.luminance")) self.black_luminance_ctrl.SetValue(getcfg("synthprofile.black_luminance")) self.update_trc_control() self.update_trc_controls() def update_trc_control(self): if self.trc_ctrl.GetSelection() in (0, 4): if (getcfg("synthprofile.trc_gamma_type") == "G" and getcfg("synthprofile.trc_output_offset") == 0 and getcfg("synthprofile.trc_gamma") == 2.4): self.trc_ctrl.SetSelection(4) # BT.1886 else: self.trc_ctrl.SetSelection(0) # Gamma def update_trc_controls(self): i = self.trc_ctrl.GetSelection() self.panel.Freeze() self.trc_gamma_label.Show(i in (0, 4)) self.trc_gamma_ctrl.SetValue(str(getcfg("synthprofile.trc_gamma"))) self.trc_gamma_ctrl.Show(i in (0, 4)) self.trc_gamma_type_ctrl.SetSelection(self.trc_gamma_types_ba[getcfg("synthprofile.trc_gamma_type")]) self.panel.GetSizer().Layout() self.panel.Thaw() if i in (0, 4): outoffset = int(getcfg("synthprofile.trc_output_offset") * 100) else: outoffset = 100 self.black_output_offset_ctrl.SetValue(outoffset) self.black_output_offset_intctrl.SetValue(outoffset) self.black_luminance_ctrl_handler(True) def white_XYZ_ctrl_handler(self, event): self.parse_XYZ("white") self.parse_xy() def white_xy_ctrl_handler(self, event): self.parse_xy("white") def main(): config.initcfg("synthprofile") lang.init() lang.update_defaults() app = BaseApp(0) app.TopWindow = SynthICCFrame() if sys.platform == "darwin": app.TopWindow.init_menubar() wx.CallLater(1, _main, app) app.MainLoop() def _main(app): app.TopWindow.listen() app.process_argv(1) app.TopWindow.Show() if __name__ == "__main__": main() DisplayCAL-3.1.0.0/DisplayCAL/wxTestchartEditor.py0000644000076500000000000037661412647526531021514 0ustar devwheel00000000000000# -*- coding: utf-8 -*- from __future__ import with_statement import csv import math import os import re import shutil import sys import time if sys.platform == "win32": import win32file import CGATS import ICCProfile as ICCP import colormath import config import imfile import localization as lang from argyll_RGB2XYZ import RGB2XYZ as argyll_RGB2XYZ, XYZ2RGB as argyll_XYZ2RGB from argyll_cgats import ti3_to_ti1, verify_cgats from config import (defaults, getbitmap, getcfg, geticon, get_current_profile, get_display_name, get_data_path, get_total_patches, get_verified_path, hascfg, profile_ext, setcfg, writecfg) from debughelpers import handle_error from log import safe_print from meta import name as appname from options import debug, tc_use_alternate_preview, test, verbose from ordereddict import OrderedDict from util_io import StringIOu as StringIO from util_os import expanduseru, is_superuser, launch_file, waccess from util_str import safe_str, safe_unicode from worker import (Error, Worker, check_file_isfile, check_set_argyll_bin, get_argyll_util, get_current_profile_path, show_result_dialog) from wxaddons import CustomEvent, CustomGridCellEvent, wx from wxwindows import (BaseApp, BaseFrame, CustomGrid, ConfirmDialog, FileBrowseBitmapButtonWithChoiceHistory, FileDrop, InfoDialog, get_gradient_panel) from wxfixes import GenBitmapButton as BitmapButton import floatspin from wxMeasureFrame import get_default_size def swap_dict_keys_values(mydict): return dict([(v, k) for (k, v) in mydict.iteritems()]) class TestchartEditor(BaseFrame): def __init__(self, parent = None, id = -1, path=None, cfg="testchart.file", parent_set_chart_methodname="set_testchart", setup=True): BaseFrame.__init__(self, parent, id, lang.getstr("testchart.edit"), name="tcgen") self.SetIcons(config.get_icon_bundle([256, 48, 32, 16], appname + "-testchart-editor")) self.Bind(wx.EVT_CLOSE, self.tc_close_handler) self.tc_algos_ab = { "": lang.getstr("tc.ofp"), "t": lang.getstr("tc.t"), "r": lang.getstr("tc.r"), "R": lang.getstr("tc.R"), "q": lang.getstr("tc.q"), "i": lang.getstr("tc.i"), "I": lang.getstr("tc.I") } self.cfg = cfg self.parent_set_chart_methodname = parent_set_chart_methodname if setup: self.setup(path) def setup(self, path=None): self.worker = Worker(self) self.worker.set_argyll_version("targen") if self.worker.argyll_version >= [1, 1, 0]: self.tc_algos_ab["Q"] = lang.getstr("tc.Q") self.tc_algos_ba = swap_dict_keys_values(self.tc_algos_ab) self.label_b2a = {"R %": "RGB_R", "G %": "RGB_G", "B %": "RGB_B", "X": "XYZ_X", "Y": "XYZ_Y", "Z": "XYZ_Z"} self.droptarget = FileDrop(self) self.droptarget.drophandlers = { ".cgats": self.ti1_drop_handler, ".cie": self.tc_drop_ti3_handler, ".csv": self.csv_drop_handler, ".gam": self.tc_drop_ti3_handler, ".icc": self.ti1_drop_handler, ".icm": self.ti1_drop_handler, ".jpg": self.tc_drop_ti3_handler, ".jpeg": self.tc_drop_ti3_handler, ".png": self.tc_drop_ti3_handler, ".tif": self.tc_drop_ti3_handler, ".tiff": self.tc_drop_ti3_handler, ".ti1": self.ti1_drop_handler, ".ti3": self.ti1_drop_handler, ".txt": self.ti1_drop_handler } scale = getcfg("app.dpi") / config.get_default_dpi() if scale < 1: scale = 1 if tc_use_alternate_preview: # splitter splitter = self.splitter = wx.SplitterWindow(self, -1, style = wx.SP_LIVE_UPDATE | wx.SP_3DSASH) if wx.VERSION < (2, 9): self.Bind(wx.EVT_SPLITTER_SASH_POS_CHANGED, self.tc_sash_handler, splitter) self.Bind(wx.EVT_SPLITTER_SASH_POS_CHANGING, self.tc_sash_handler, splitter) p1 = wx.Panel(splitter) p1.sizer = wx.BoxSizer(wx.VERTICAL) p1.SetSizer(p1.sizer) p2 = wx.Panel(splitter) # Setting a droptarget seems to cause crash when destroying ##p2.SetDropTarget(self.droptarget) p2.sizer = wx.BoxSizer(wx.VERTICAL) p2.SetSizer(p2.sizer) splitter.SetMinimumPaneSize(23) # splitter end panel = self.panel = p1 else: panel = self.panel = wx.Panel(self) panel.SetDropTarget(self.droptarget) self.sizer = wx.BoxSizer(wx.VERTICAL) panel.SetSizer(self.sizer) border = 4 sizer = wx.FlexGridSizer(0, 4, 0, 0) self.sizer.Add(sizer, flag = (wx.ALL & ~wx.BOTTOM), border = 12) # white patches sizer.Add(wx.StaticText(panel, -1, lang.getstr("tc.white")), flag = wx.ALL | wx.ALIGN_CENTER_VERTICAL, border = border) self.tc_white_patches = wx.SpinCtrl(panel, -1, size = (65 * scale, -1), min = 0, name = "tc_white_patches") self.Bind(wx.EVT_TEXT, self.tc_white_patches_handler, id = self.tc_white_patches.GetId()) sizer.Add(self.tc_white_patches, flag = wx.ALL | wx.ALIGN_CENTER_VERTICAL, border = border) # single channel patches sizer.Add(wx.StaticText(panel, -1, lang.getstr("tc.single")), flag = wx.ALL | wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_RIGHT, border = border) self.tc_single_channel_patches = wx.SpinCtrl(panel, -1, size = (65 * scale, -1), min = 0, max = 256, name = "tc_single_channel_patches") self.tc_single_channel_patches.Bind(wx.EVT_KILL_FOCUS, self.tc_single_channel_patches_handler) self.Bind(wx.EVT_SPINCTRL, self.tc_single_channel_patches_handler, id = self.tc_single_channel_patches.GetId()) hsizer = wx.BoxSizer(wx.HORIZONTAL) sizer.Add(hsizer) hsizer.Add(self.tc_single_channel_patches, flag = wx.ALL | wx.ALIGN_CENTER_VERTICAL, border = border) hsizer.Add(wx.StaticText(panel, -1, lang.getstr("tc.single.perchannel")), flag = wx.ALL | wx.ALIGN_CENTER_VERTICAL, border = border) # black patches if self.worker.argyll_version >= [1, 6]: hsizer.Add(wx.StaticText(panel, -1, lang.getstr("tc.black")), flag=wx.ALL | wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_RIGHT, border=border) self.tc_black_patches = wx.SpinCtrl(panel, -1, size=(65 * scale, -1), min=0, name="tc_black_patches") self.Bind(wx.EVT_TEXT, self.tc_black_patches_handler, id=self.tc_black_patches.GetId()) hsizer.Add(self.tc_black_patches, flag=wx.ALL | wx.ALIGN_CENTER_VERTICAL, border=border) # gray axis patches sizer.Add(wx.StaticText(panel, -1, lang.getstr("tc.gray")), flag = wx.ALL | wx.ALIGN_CENTER_VERTICAL, border = border) self.tc_gray_patches = wx.SpinCtrl(panel, -1, size = (65 * scale, -1), min = 0, max = 256, name = "tc_gray_patches") self.tc_gray_patches.Bind(wx.EVT_KILL_FOCUS, self.tc_gray_handler) self.Bind(wx.EVT_SPINCTRL, self.tc_gray_handler, id = self.tc_gray_patches.GetId()) sizer.Add(self.tc_gray_patches, flag = wx.ALL | wx.ALIGN_CENTER_VERTICAL, border = border) # multidim steps sizer.Add(wx.StaticText(panel, -1, lang.getstr("tc.multidim")), flag = wx.ALL | wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_RIGHT, border = border) hsizer = wx.BoxSizer(wx.HORIZONTAL) sizer.Add(hsizer) self.tc_multi_steps = wx.SpinCtrl(panel, -1, size = (65 * scale, -1), min = 0, max = 21, name = "tc_multi_steps") # 16 multi dim steps = 4096 patches self.tc_multi_steps.Bind(wx.EVT_KILL_FOCUS, self.tc_multi_steps_handler) self.Bind(wx.EVT_SPINCTRL, self.tc_multi_steps_handler, id = self.tc_multi_steps.GetId()) hsizer.Add(self.tc_multi_steps, flag = wx.ALL | wx.ALIGN_CENTER_VERTICAL, border = border) if self.worker.argyll_version >= [1, 6, 0]: self.tc_multi_bcc_cb = wx.CheckBox(panel, -1, lang.getstr("centered")) self.tc_multi_bcc_cb.Bind(wx.EVT_CHECKBOX, self.tc_multi_bcc_cb_handler) hsizer.Add(self.tc_multi_bcc_cb, flag=wx.LEFT | wx.ALIGN_CENTER_VERTICAL, border=border) self.tc_multi_patches = wx.StaticText(panel, -1, "", name = "tc_multi_patches") hsizer.Add(self.tc_multi_patches, flag = wx.ALL | wx.ALIGN_CENTER_VERTICAL, border = border) # full spread patches sizer.Add(wx.StaticText(panel, -1, lang.getstr("tc.fullspread")), flag = wx.ALL | wx.ALIGN_CENTER_VERTICAL, border = border) self.tc_fullspread_patches = wx.SpinCtrl(panel, -1, size = (65 * scale, -1), min = 0, max = 9999, name = "tc_fullspread_patches") self.Bind(wx.EVT_TEXT, self.tc_fullspread_handler, id = self.tc_fullspread_patches.GetId()) sizer.Add(self.tc_fullspread_patches, flag = wx.ALL | wx.ALIGN_CENTER_VERTICAL, border = border) # algo algos = self.tc_algos_ab.values() algos.sort() sizer.Add(wx.StaticText(panel, -1, lang.getstr("tc.algo")), flag = wx.ALL | wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_RIGHT, border = border) self.tc_algo = wx.Choice(panel, -1, choices = algos, name = "tc_algo") self.tc_algo.Disable() self.Bind(wx.EVT_CHOICE, self.tc_algo_handler, id = self.tc_algo.GetId()) sizer.Add(self.tc_algo, flag = wx.ALL | wx.ALIGN_CENTER_VERTICAL, border = border) # adaption hsizer = wx.BoxSizer(wx.HORIZONTAL) sizer.Add(hsizer, 1, flag = wx.EXPAND) hsizer.Add(wx.StaticText(panel, -1, lang.getstr("tc.adaption")), flag = wx.ALL | wx.ALIGN_CENTER_VERTICAL, border = border) self.tc_adaption_slider = wx.Slider(panel, -1, 0, 0, 100, size = (64 * scale, -1), name = "tc_adaption_slider") self.tc_adaption_slider.Disable() self.Bind(wx.EVT_SLIDER, self.tc_adaption_handler, id = self.tc_adaption_slider.GetId()) hsizer.Add(self.tc_adaption_slider, flag = wx.ALIGN_CENTER_VERTICAL) self.tc_adaption_intctrl = wx.SpinCtrl(panel, -1, size = (65 * scale, -1), min = 0, max = 100, name = "tc_adaption_intctrl") self.tc_adaption_intctrl.Disable() self.Bind(wx.EVT_TEXT, self.tc_adaption_handler, id = self.tc_adaption_intctrl.GetId()) sizer.Add(self.tc_adaption_intctrl, flag = wx.ALL | wx.ALIGN_CENTER_VERTICAL, border = border) hsizer = wx.GridSizer(0, 2, 0, 0) sizer.Add(hsizer, 1, flag = wx.EXPAND) hsizer.Add(wx.StaticText(panel, -1, "%"), flag = wx.ALL | wx.ALIGN_CENTER_VERTICAL, border = border) hsizer.Add(wx.StaticText(panel, -1, lang.getstr("tc.angle")), flag = wx.ALL | wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_RIGHT, border = border) # angle hsizer = wx.BoxSizer(wx.HORIZONTAL) sizer.Add(hsizer, 1, flag = wx.EXPAND) self.tc_angle_slider = wx.Slider(panel, -1, 0, 0, 5000, size = (128 * scale, -1), name = "tc_angle_slider") self.tc_angle_slider.Disable() self.Bind(wx.EVT_SLIDER, self.tc_angle_handler, id = self.tc_angle_slider.GetId()) hsizer.Add(self.tc_angle_slider, flag = wx.ALIGN_CENTER_VERTICAL) self.tc_angle_intctrl = wx.SpinCtrl(panel, -1, size = (75 * scale, -1), min = 0, max = 5000, name = "tc_angle_intctrl") self.tc_angle_intctrl.Disable() self.Bind(wx.EVT_TEXT, self.tc_angle_handler, id = self.tc_angle_intctrl.GetId()) hsizer.Add(self.tc_angle_intctrl, flag = wx.ALL | wx.ALIGN_CENTER_VERTICAL, border = border) # gamma if (self.worker.argyll_version == [1, 1, "RC2"] or self.worker.argyll_version >= [1, 1]): sizer.Add(wx.StaticText(panel, -1, lang.getstr("trc.gamma")), flag=wx.ALL | wx.ALIGN_CENTER_VERTICAL, border=border) self.tc_gamma_floatctrl = floatspin.FloatSpin(panel, -1, size=(65 * scale, -1), min_val=0.0, max_val=9.9, increment=0.05, digits=2, name="tc_gamma_floatctrl") self.Bind(floatspin.EVT_FLOATSPIN, self.tc_gamma_handler, id=self.tc_gamma_floatctrl.GetId()) sizer.Add(self.tc_gamma_floatctrl, flag=wx.ALL | wx.ALIGN_CENTER_VERTICAL, border=border) # neutral axis emphasis if self.worker.argyll_version >= [1, 3, 3]: sizer.Add(wx.StaticText(panel, -1, lang.getstr("tc.neutral_axis_emphasis")), flag=wx.ALL | wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_RIGHT, border=border) hsizer = wx.BoxSizer(wx.HORIZONTAL) sizer.Add(hsizer, 1, flag = wx.EXPAND) self.tc_neutral_axis_emphasis_slider = wx.Slider(panel, -1, 0, 0, 100, size=(64 * scale, -1), name="tc_neutral_axis_emphasis_slider") self.tc_neutral_axis_emphasis_slider.Disable() self.Bind(wx.EVT_SLIDER, self.tc_neutral_axis_emphasis_handler, id=self.tc_neutral_axis_emphasis_slider.GetId()) hsizer.Add(self.tc_neutral_axis_emphasis_slider, flag=wx.ALIGN_CENTER_VERTICAL) self.tc_neutral_axis_emphasis_intctrl = wx.SpinCtrl(panel, -1, size=(65 * scale, -1), min=0, max=100, name="tc_neutral_axis_emphasis_intctrl") self.tc_neutral_axis_emphasis_intctrl.Disable() self.Bind(wx.EVT_TEXT, self.tc_neutral_axis_emphasis_handler, id=self.tc_neutral_axis_emphasis_intctrl.GetId()) hsizer.Add(self.tc_neutral_axis_emphasis_intctrl, flag=wx.ALL | wx.ALIGN_CENTER_VERTICAL, border=border) hsizer.Add(wx.StaticText(panel, -1, "%"), flag=wx.ALL | wx.ALIGN_CENTER_VERTICAL, border=border) # dark patch emphasis if self.worker.argyll_version >= [1, 6, 2]: hsizer.Add(wx.StaticText(panel, -1, lang.getstr("tc.dark_emphasis")), flag=wx.ALL | wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_RIGHT, border=border) self.tc_dark_emphasis_slider = wx.Slider(panel, -1, 0, 0, 100, size=(64 * scale, -1), name="tc_dark_emphasis_slider") self.tc_dark_emphasis_slider.Disable() self.Bind(wx.EVT_SLIDER, self.tc_dark_emphasis_handler, id=self.tc_dark_emphasis_slider.GetId()) hsizer.Add(self.tc_dark_emphasis_slider, flag=wx.ALIGN_CENTER_VERTICAL) self.tc_dark_emphasis_intctrl = wx.SpinCtrl(panel, -1, size=(65 * scale, -1), min=0, max=100, name="tc_dark_emphasis_intctrl") self.tc_dark_emphasis_intctrl.Disable() self.Bind(wx.EVT_TEXT, self.tc_dark_emphasis_handler, id=self.tc_dark_emphasis_intctrl.GetId()) hsizer.Add(self.tc_dark_emphasis_intctrl, flag=wx.ALL | wx.ALIGN_CENTER_VERTICAL, border=border) hsizer.Add(wx.StaticText(panel, -1, "%"), flag=wx.ALL | wx.ALIGN_CENTER_VERTICAL, border=border) # precond profile hsizer = wx.BoxSizer(wx.HORIZONTAL) self.sizer.Add(hsizer, flag = wx.ALL & ~(wx.BOTTOM | wx.TOP) | wx.EXPAND, border = 12) self.tc_precond = wx.CheckBox(panel, -1, lang.getstr("tc.precond"), name = "tc_precond") self.tc_precond.Disable() self.Bind(wx.EVT_CHECKBOX, self.tc_precond_handler, id = self.tc_precond.GetId()) hsizer.Add(self.tc_precond, flag = wx.ALL | wx.ALIGN_CENTER_VERTICAL, border = border) self.tc_precond_profile = FileBrowseBitmapButtonWithChoiceHistory( panel, -1, toolTip=lang.getstr("tc.precond"), dialogTitle=lang.getstr("tc.precond"), fileMask=lang.getstr("filetype.icc_mpp") + "|*.icc;*.icm;*.mpp", changeCallback=self.tc_precond_profile_handler, history=get_data_path("ref", "\.(icm|icc)$")) self.tc_precond_profile.SetMaxFontSize(11) hsizer.Add(self.tc_precond_profile, 1, flag = wx.ALL | wx.ALIGN_CENTER_VERTICAL, border = border) self.tc_precond_profile_current_btn = wx.Button(panel, -1, lang.getstr("profile.current"), name="tc_precond_profile_current") self.Bind(wx.EVT_BUTTON, self.tc_precond_profile_current_ctrl_handler, id=self.tc_precond_profile_current_btn.GetId()) hsizer.Add(self.tc_precond_profile_current_btn, 0, flag=wx.ALL | wx.ALIGN_CENTER_VERTICAL, border=border) self.precond_droptarget = FileDrop(self) self.precond_droptarget.drophandlers = { ".icc": self.precond_profile_drop_handler, ".icm": self.precond_profile_drop_handler } self.tc_precond_profile.SetDropTarget(self.precond_droptarget) # limit samples to lab sphere hsizer = wx.BoxSizer(wx.HORIZONTAL) self.sizer.Add(hsizer, flag = wx.ALL & ~(wx.BOTTOM | wx.TOP), border = 12) self.tc_filter = wx.CheckBox(panel, -1, lang.getstr("tc.limit.sphere"), name = "tc_filter") self.Bind(wx.EVT_CHECKBOX, self.tc_filter_handler, id = self.tc_filter.GetId()) hsizer.Add(self.tc_filter, flag = wx.ALL | wx.ALIGN_CENTER_VERTICAL, border = border) # L hsizer.Add(wx.StaticText(panel, -1, "L"), flag = wx.ALL | wx.ALIGN_CENTER_VERTICAL, border = border) self.tc_filter_L = wx.SpinCtrl(panel, -1, initial = 50, size = (65 * scale, -1), min = 0, max = 100, name = "tc_filter_L") self.Bind(wx.EVT_TEXT, self.tc_filter_handler, id = self.tc_filter_L.GetId()) hsizer.Add(self.tc_filter_L, flag = wx.ALL | wx.ALIGN_CENTER_VERTICAL, border = border) # a hsizer.Add(wx.StaticText(panel, -1, "a"), flag = wx.ALL | wx.ALIGN_CENTER_VERTICAL, border = border) self.tc_filter_a = wx.SpinCtrl(panel, -1, initial = 0, size = (65 * scale, -1), min = -128, max = 127, name = "tc_filter_a") self.Bind(wx.EVT_TEXT, self.tc_filter_handler, id = self.tc_filter_a.GetId()) hsizer.Add(self.tc_filter_a, flag = wx.ALL | wx.ALIGN_CENTER_VERTICAL, border = border) # b hsizer.Add(wx.StaticText(panel, -1, "b"), flag = wx.ALL | wx.ALIGN_CENTER_VERTICAL, border = border) self.tc_filter_b = wx.SpinCtrl(panel, -1, initial = 0, size = (65 * scale, -1), min = -128, max = 127, name = "tc_filter_b") self.Bind(wx.EVT_TEXT, self.tc_filter_handler, id = self.tc_filter_b.GetId()) hsizer.Add(self.tc_filter_b, flag = wx.ALL | wx.ALIGN_CENTER_VERTICAL, border = border) # radius hsizer.Add(wx.StaticText(panel, -1, lang.getstr("tc.limit.sphere_radius")), flag = wx.ALL | wx.ALIGN_CENTER_VERTICAL, border = border) self.tc_filter_rad = wx.SpinCtrl(panel, -1, initial = 255, size = (65 * scale, -1), min = 1, max = 255, name = "tc_filter_rad") self.Bind(wx.EVT_TEXT, self.tc_filter_handler, id = self.tc_filter_rad.GetId()) hsizer.Add(self.tc_filter_rad, flag = wx.ALL | wx.ALIGN_CENTER_VERTICAL, border = border) # diagnostic VRML files hsizer = wx.BoxSizer(wx.HORIZONTAL) self.sizer.Add(hsizer, flag = wx.ALL & ~(wx.BOTTOM | wx.TOP), border = 12 + border) self.vrml_save_as_btn = wx.BitmapButton(panel, -1, geticon(16, "3D")) if sys.platform == "darwin": # Work-around bitmap cutoff on left and right side w = self.vrml_save_as_btn.Size[0] + 4 else: w = -1 self.vrml_save_as_btn.MinSize = (w, -1) self.vrml_save_as_btn.SetToolTipString(lang.getstr("tc.3d")) self.vrml_save_as_btn.Disable() self.Bind(wx.EVT_BUTTON, self.tc_view_3d, id=self.vrml_save_as_btn.GetId()) self.vrml_save_as_btn.Bind(wx.EVT_CONTEXT_MENU, self.view_3d_format_popup) hsizer.Add(self.vrml_save_as_btn, flag=wx.TOP | wx.BOTTOM | wx.ALIGN_CENTER_VERTICAL, border=border * 2) hsizer.Add((1, 1)) self.view_3d_format_btn = wx.BitmapButton(panel, -1, getbitmap("theme/dropdown-arrow")) if sys.platform == "darwin": # Work-around bitmap cutoff on left and right side w = self.view_3d_format_btn.Size[0] + 4 else: w = -1 self.view_3d_format_btn.MinSize = (w, self.vrml_save_as_btn.Size[1]) self.view_3d_format_btn.Bind(wx.EVT_BUTTON, self.view_3d_format_popup) self.view_3d_format_btn.Bind(wx.EVT_CONTEXT_MENU, self.view_3d_format_popup) self.view_3d_format_btn.SetToolTipString(lang.getstr("tc.3d")) self.view_3d_format_btn.Disable() hsizer.Add(self.view_3d_format_btn, flag=(wx.ALL & ~wx.LEFT) | wx.ALIGN_CENTER_VERTICAL, border=border * 2) self.tc_vrml_cie = wx.CheckBox(panel, -1, "", name = "tc_vrml_cie", style = wx.RB_GROUP) self.tc_vrml_cie.SetToolTipString(lang.getstr("tc.3d")) self.Bind(wx.EVT_CHECKBOX, self.tc_vrml_handler, id = self.tc_vrml_cie.GetId()) hsizer.Add(self.tc_vrml_cie, flag = (wx.ALL & ~wx.LEFT) | wx.ALIGN_CENTER_VERTICAL, border = border * 2) self.tc_vrml_cie_colorspace_ctrl = wx.Choice(panel, -1, choices=config.valid_values["tc_vrml_cie_colorspace"]) self.tc_vrml_cie_colorspace_ctrl.SetToolTipString(lang.getstr("tc.3d")) self.Bind(wx.EVT_CHOICE, self.tc_vrml_handler, id=self.tc_vrml_cie_colorspace_ctrl.GetId()) hsizer.Add(self.tc_vrml_cie_colorspace_ctrl, flag=(wx.ALL & ~wx.LEFT) | wx.ALIGN_CENTER_VERTICAL, border=border * 2) self.tc_vrml_device = wx.CheckBox(panel, -1, "", name = "tc_vrml_device") self.tc_vrml_device.SetToolTipString(lang.getstr("tc.3d")) self.Bind(wx.EVT_CHECKBOX, self.tc_vrml_handler, id = self.tc_vrml_device.GetId()) hsizer.Add(self.tc_vrml_device, flag = (wx.ALL & ~wx.LEFT) | wx.ALIGN_CENTER_VERTICAL, border = border * 2) self.tc_vrml_device_colorspace_ctrl = wx.Choice(panel, -1, choices=config.valid_values["tc_vrml_device_colorspace"]) self.tc_vrml_device_colorspace_ctrl.SetToolTipString(lang.getstr("tc.3d")) self.Bind(wx.EVT_CHOICE, self.tc_vrml_handler, id=self.tc_vrml_device_colorspace_ctrl.GetId()) hsizer.Add(self.tc_vrml_device_colorspace_ctrl, flag=(wx.ALL & ~wx.LEFT) | wx.ALIGN_CENTER_VERTICAL, border=border * 2) hsizer.Add(wx.StaticText(panel, -1, lang.getstr("tc.vrml.black_offset")), flag=wx.ALL | wx.ALIGN_CENTER_VERTICAL, border=border) self.tc_vrml_black_offset_intctrl = wx.SpinCtrl(panel, -1, size=(55 * scale, -1), min=0, max=40, name="tc_vrml_black_offset_intctrl") self.Bind(wx.EVT_TEXT, self.tc_vrml_black_offset_ctrl_handler, id=self.tc_vrml_black_offset_intctrl.GetId()) hsizer.Add(self.tc_vrml_black_offset_intctrl, flag=wx.ALL | wx.ALIGN_CENTER_VERTICAL, border=border) self.tc_vrml_use_D50_cb = wx.CheckBox(panel, -1, lang.getstr("tc.vrml.use_D50"), name="tc_vrml_use_D50_cb") self.Bind(wx.EVT_CHECKBOX, self.tc_vrml_use_D50_handler, id=self.tc_vrml_use_D50_cb.GetId()) hsizer.Add(self.tc_vrml_use_D50_cb, flag=wx.ALL | wx.ALIGN_CENTER_VERTICAL, border=border) self.tc_vrml_compress_cb = wx.CheckBox(panel, -1, lang.getstr("compression.gzip"), name="tc_vrml_compress_cb") self.Bind(wx.EVT_CHECKBOX, self.tc_vrml_compress_handler, id=self.tc_vrml_compress_cb.GetId()) hsizer.Add(self.tc_vrml_compress_cb, flag=wx.ALL | wx.ALIGN_CENTER_VERTICAL, border=border) # buttons hsizer = wx.BoxSizer(wx.HORIZONTAL) self.sizer.Add(hsizer, flag = (wx.ALL & ~wx.BOTTOM) | wx.ALIGN_CENTER, border = 12) self.preview_btn = wx.Button(panel, -1, lang.getstr("testchart.create"), name = "tc_create") self.Bind(wx.EVT_BUTTON, self.tc_preview_handler, id = self.preview_btn.GetId()) hsizer.Add(self.preview_btn, flag = wx.ALL | wx.ALIGN_CENTER_VERTICAL, border = border) self.save_btn = wx.Button(panel, -1, lang.getstr("save")) self.save_btn.Disable() self.Bind(wx.EVT_BUTTON, self.tc_save_handler, id = self.save_btn.GetId()) hsizer.Add(self.save_btn, flag = wx.ALL | wx.ALIGN_CENTER_VERTICAL, border = border) self.save_as_btn = wx.Button(panel, -1, lang.getstr("save_as")) self.save_as_btn.Disable() self.Bind(wx.EVT_BUTTON, self.tc_save_as_handler, id = self.save_as_btn.GetId()) hsizer.Add(self.save_as_btn, flag = wx.ALL | wx.ALIGN_CENTER_VERTICAL, border = border) self.export_btn = wx.Button(panel, -1, lang.getstr("export"), name = "tc_export") self.export_btn.Disable() self.Bind(wx.EVT_BUTTON, self.tc_export_handler, id = self.export_btn.GetId()) hsizer.Add(self.export_btn, flag = wx.ALL | wx.ALIGN_CENTER_VERTICAL, border = border) self.clear_btn = wx.Button(panel, -1, lang.getstr("testchart.discard"), name = "tc_clear") self.clear_btn.Disable() self.Bind(wx.EVT_BUTTON, self.tc_clear_handler, id = self.clear_btn.GetId()) hsizer.Add(self.clear_btn, flag = wx.ALL | wx.ALIGN_CENTER_VERTICAL, border = border) # buttons row 2 hsizer = wx.BoxSizer(wx.HORIZONTAL) self.sizer.Add(hsizer, flag=wx.ALIGN_CENTER | wx.LEFT | wx.RIGHT, border=12) hsizer.Add(wx.StaticText(panel, -1, lang.getstr("testchart.add_saturation_sweeps")), flag=wx.ALL | wx.ALIGN_CENTER_VERTICAL, border=border) self.saturation_sweeps_intctrl = wx.SpinCtrl(panel, -1, size=(50 * scale, -1), initial=getcfg("tc.saturation_sweeps"), min=2, max=255) self.saturation_sweeps_intctrl.Disable() hsizer.Add(self.saturation_sweeps_intctrl, flag=wx.ALL | wx.ALIGN_CENTER_VERTICAL, border=border) for color in ("R", "G", "B", "C", "M", "Y"): name = "saturation_sweeps_%s_btn" % color setattr(self, name, wx.Button(panel, -1, color, size=(30 * scale, -1))) getattr(self, "saturation_sweeps_%s_btn" % color).Disable() self.Bind(wx.EVT_BUTTON, self.tc_add_saturation_sweeps_handler, id=getattr(self, name).GetId()) hsizer.Add(getattr(self, name), flag=wx.ALL | wx.ALIGN_CENTER_VERTICAL, border=border) self.saturation_sweeps_custom_btn = wx.Button(panel, -1, "=", size=(30 * scale, -1)) self.saturation_sweeps_custom_btn.Disable() self.Bind(wx.EVT_BUTTON, self.tc_add_saturation_sweeps_handler, id=self.saturation_sweeps_custom_btn.GetId()) hsizer.Add(self.saturation_sweeps_custom_btn, flag=wx.ALL | wx.ALIGN_CENTER_VERTICAL, border=border) for component in ("R", "G", "B"): hsizer.Add(wx.StaticText(panel, -1, component), flag=wx.ALL | wx.ALIGN_CENTER_VERTICAL, border=border) name = "saturation_sweeps_custom_%s_ctrl" % component setattr(self, name, floatspin.FloatSpin(panel, -1, size=(65 * scale, -1), value=getcfg("tc.saturation_sweeps.custom.%s" % component), min_val=0, max_val=100, increment=100.0 / 255, digits=2)) getattr(self, "saturation_sweeps_custom_%s_ctrl" % component).Disable() self.Bind(floatspin.EVT_FLOATSPIN, self.tc_algo_handler, id=getattr(self, name).GetId()) hsizer.Add(getattr(self, name), flag=wx.ALL | wx.ALIGN_CENTER_VERTICAL, border=border) # buttons row 3 hsizer = wx.BoxSizer(wx.HORIZONTAL) self.sizer.Add(hsizer, flag=wx.ALIGN_CENTER | wx.LEFT | wx.RIGHT, border=12) self.add_ti3_btn = wx.Button(panel, -1, lang.getstr("testchart.add_ti3_patches")) self.add_ti3_btn.Disable() self.Bind(wx.EVT_BUTTON, self.tc_add_ti3_handler, id=self.add_ti3_btn.GetId()) hsizer.Add(self.add_ti3_btn, flag=wx.ALL | wx.ALIGN_CENTER_VERTICAL, border=border) self.add_ti3_relative_cb = wx.CheckBox(panel, -1, lang.getstr("whitepoint.simulate.relative")) self.add_ti3_relative_cb.Disable() self.Bind(wx.EVT_CHECKBOX, self.tc_add_ti3_relative_handler, id=self.add_ti3_relative_cb.GetId()) hsizer.Add(self.add_ti3_relative_cb, flag=wx.ALL | wx.ALIGN_CENTER_VERTICAL, border=border) hsizer.Add((50, 1)) patch_order_choices = [] for lstr in ("testchart.sort_RGB_gray_to_top", "testchart.sort_RGB_white_to_top", "testchart.sort_RGB_red_to_top", "testchart.sort_RGB_green_to_top", "testchart.sort_RGB_blue_to_top", "testchart.sort_RGB_cyan_to_top", "testchart.sort_RGB_magenta_to_top", "testchart.sort_RGB_yellow_to_top", "testchart.sort_by_HSI", "testchart.sort_by_HSL", "testchart.sort_by_HSV", "testchart.sort_by_L", "testchart.sort_by_RGB", "testchart.sort_by_RGB_sum", "testchart.optimize_for_untethered_auto_mode"): patch_order_choices.append(lang.getstr(lstr)) self.change_patch_order_ctrl = wx.Choice(panel, -1, choices=patch_order_choices) self.change_patch_order_ctrl.SetSelection(0) self.change_patch_order_ctrl.SetToolTipString(lang.getstr("testchart.change_patch_order")) hsizer.Add(self.change_patch_order_ctrl, flag=wx.ALL | wx.ALIGN_CENTER_VERTICAL, border=border) self.change_patch_order_btn = wx.Button(panel, -1, lang.getstr("apply")) self.Bind(wx.EVT_BUTTON, self.tc_sort_handler, id=self.change_patch_order_btn.GetId()) hsizer.Add(self.change_patch_order_btn, flag=wx.ALL | wx.ALIGN_CENTER_VERTICAL, border=border) # grid self.sizer.Add((-1, 12)) self.grid = CustomGrid(panel, -1, size=(-1, 100)) self.grid.DisableDragColSize() self.grid.EnableGridLines(False) self.grid.SetCellHighlightPenWidth(0) self.grid.SetCellHighlightROPenWidth(0) self.grid.SetColLabelSize(self.grid.GetDefaultRowSize()) self.grid.SetDefaultCellAlignment(wx.ALIGN_CENTER, wx.ALIGN_CENTER) self.grid.SetRowLabelAlignment(wx.ALIGN_RIGHT, wx.ALIGN_CENTER) self.grid.SetScrollRate(0, 5) self.grid.draw_horizontal_grid_lines = False self.grid.draw_vertical_grid_lines = False self.sizer.Add(self.grid, 1, flag=wx.EXPAND) self.grid.CreateGrid(0, 0) font = self.grid.GetDefaultCellFont() if font.PointSize > 11: font.PointSize = 11 self.grid.SetDefaultCellFont(font) self.Bind(wx.grid.EVT_GRID_CELL_CHANGE, self.tc_grid_cell_change_handler) self.grid.Bind(wx.grid.EVT_GRID_LABEL_LEFT_CLICK, self.tc_grid_label_left_click_handler) self.grid.Bind(wx.grid.EVT_GRID_LABEL_LEFT_DCLICK, self.tc_grid_label_left_dclick_handler) self.grid.Bind(wx.grid.EVT_GRID_RANGE_SELECT, self.tc_grid_range_select_handler) self.grid.DisableDragRowSize() if tc_use_alternate_preview: separator_color = wx.SystemSettings.GetColour(wx.SYS_COLOUR_3DSHADOW) separator = wx.Panel(panel, size=(-1, 1)) separator.BackgroundColour = separator_color self.sizer.Add(separator, flag=wx.EXPAND) # preview area if tc_use_alternate_preview: self.sizer.SetSizeHints(self) self.sizer.Layout() self.sizer.SetMinSize((self.sizer.MinSize[0], self.sizer.MinSize[1] + 1)) p1.SetMinSize(self.sizer.MinSize) splitter.SplitHorizontally(p1, p2, self.sizer.GetMinSize()[1]) hsizer = wx.BoxSizer(wx.VERTICAL) gradientpanel = get_gradient_panel(p2, lang.getstr("preview")) gradientpanel.MinSize = (-1, 23) p2.sizer.Add(gradientpanel, flag=wx.EXPAND) p2.sizer.Add(hsizer, 1, flag=wx.EXPAND) p2.BackgroundColour = "#333333" preview = CustomGrid(p2, -1, size=(-1, 100)) preview.DisableDragColSize() preview.DisableDragRowSize() preview.EnableEditing(False) preview.EnableGridLines(False) preview.SetCellHighlightPenWidth(0) preview.SetCellHighlightROPenWidth(0) preview.SetColLabelSize(self.grid.GetDefaultRowSize()) preview.SetDefaultCellAlignment(wx.ALIGN_CENTER, wx.ALIGN_CENTER) preview.SetRowLabelAlignment(wx.ALIGN_RIGHT, wx.ALIGN_CENTER) preview.SetLabelTextColour("#CCCCCC") preview.SetScrollRate(0, 5) preview._default_col_label_renderer.bgcolor = "#333333" preview._default_row_label_renderer.bgcolor = "#333333" preview.alternate_cell_background_color = False preview.alternate_row_label_background_color = False preview.draw_horizontal_grid_lines = False preview.draw_vertical_grid_lines = False preview.rendernative = False preview.style = "" preview.CreateGrid(0, 0) font = preview.GetDefaultCellFont() if font.PointSize > 11: font.PointSize = 11 preview.SetDefaultCellFont(font) preview.SetLabelFont(font) preview.Bind(wx.grid.EVT_GRID_CELL_LEFT_CLICK, self.tc_mouseclick_handler) self.preview = preview preview.SetDefaultCellBackgroundColour("#333333") preview.SetLabelBackgroundColour("#333333") hsizer.Add(preview, 1, wx.EXPAND) panel = p2 if sys.platform not in ("darwin", "win32"): separator_color = wx.SystemSettings.GetColour(wx.SYS_COLOUR_3DSHADOW) separator = wx.Panel(panel, size=(-1, 1)) separator.BackgroundColour = separator_color panel.Sizer.Add(separator, flag=wx.EXPAND) # status status = wx.StatusBar(self, -1) if u"phoenix" in wx.PlatformInfo: # Phoenix status.SetStatusStyles(1, wx.SB_FLAT) else: # Classic status.SetStatusStyles([wx.SB_FLAT]) self.SetStatusBar(status) # layout if tc_use_alternate_preview: self.SetMinSize((self.GetMinSize()[0], self.GetMinSize()[1] + splitter.SashSize + p2.sizer.MinSize[1])) else: self.sizer.SetSizeHints(self) self.sizer.Layout() defaults.update({ "position.tcgen.x": self.GetDisplay().ClientArea[0] + 40, "position.tcgen.y": self.GetDisplay().ClientArea[1] + 60, "size.tcgen.w": self.GetMinSize()[0], "size.tcgen.h": self.GetMinSize()[1] }) if hascfg("position.tcgen.x") and hascfg("position.tcgen.y") and hascfg("size.tcgen.w") and hascfg("size.tcgen.h"): self.SetSaneGeometry(int(getcfg("position.tcgen.x")), int(getcfg("position.tcgen.y")), int(getcfg("size.tcgen.w")), int(getcfg("size.tcgen.h"))) else: self.Center() self.tc_size_handler() children = self.GetAllChildren() for child in children: if hasattr(child, "SetFont"): child.SetMaxFontSize(11) child.Bind(wx.EVT_KEY_DOWN, self.tc_key_handler) if (sys.platform == "win32" and sys.getwindowsversion() >= (6, ) and isinstance(child, wx.Panel)): # No need to enable double buffering under Linux and Mac OS X. # Under Windows, enabling double buffering on the panel seems # to work best to reduce flicker. child.SetDoubleBuffered(True) self.Bind(wx.EVT_MOVE, self.tc_move_handler) self.Bind(wx.EVT_SIZE, self.tc_size_handler, self) self.Bind(wx.EVT_MAXIMIZE, self.tc_size_handler, self) self.Children[0].Bind(wx.EVT_WINDOW_DESTROY, self.tc_destroy_handler) self.tc_update_controls() self.tc_check() if path is not False: wx.CallAfter(self.tc_load_cfg_from_ti1, None, path) def csv_drop_handler(self, path): if self.worker.is_working(): return if not self.tc_check_save_ti1(): return self.worker.start(self.csv_convert_finish, self.csv_convert, wargs=(path, ), progress_msg=lang.getstr("testchart.read"), parent=self, progress_start=500, cancelable=False, continue_next=True, show_remaining_time=False, fancy=False) def csv_convert(self, path): # Read CSV file and get rows rows = [] maxval = 100.0 try: with open(path, "rb") as csvfile: sniffer = csv.Sniffer() rawcsv = csvfile.read() dialect = sniffer.sniff(rawcsv, delimiters=",;\t") has_header = sniffer.has_header(rawcsv) csvfile.seek(0) for i, row in enumerate(csv.reader(csvfile, dialect=dialect)): if has_header: continue if len(row) == 3 or len(row) == 6: # Add row number before first column row.insert(0, i) if len(row) not in (4, 7): raise ValueError(lang.getstr("error.testchart.invalid", path)) row = [int(row[0])] + [float(v) for v in row[1:]] for v in row[1:]: if v > maxval: maxval = v rows.append(row) except Exception, exception: result = exception else: # Scale to 0..100 if actual value range is different if maxval > 100: for i, row in enumerate(rows): rows[i][1:] = [v / maxval * 100 for v in row[1:]] # Create temporary TI1 ti1 = CGATS.CGATS("""CTI1 KEYWORD "COLOR_REP" COLOR_REP "RGB" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT SAMPLE_ID RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 4 BEGIN_DATA END_DATA""") # Add rows to TI1 data = ti1[0].DATA for row in rows: if len(row) < 7: # Missing XYZ, add via simple sRGB-like model row.extend(v * 100 for v in argyll_RGB2XYZ(*[v / 100.0 for v in row[1:]])) data.add_data(row) # Create temp dir result = tmp = self.worker.create_tempdir() if not isinstance(result, Exception): # Write out temporary TI1 ti1.filename = os.path.join(tmp, os.path.splitext(os.path.basename(path))[0] + ".ti1") ti1.write() result = ti1 return result def csv_convert_finish(self, result): if isinstance(result, Exception): show_result_dialog(result, self) else: self.tc_load_cfg_from_ti1(None, result.filename, resume=True) def precond_profile_drop_handler(self, path): self.tc_precond_profile.SetPath(path) self.tc_precond_profile_handler() def get_commands(self): return (self.get_common_commands() + ["testchart-editor [filename | create filename]", "load "]) def process_data(self, data): if (data[0] == "testchart-editor" and (len(data) < 3 or (len(data) == 3 and data[1] == "create"))) or (data[0] == "load" and len(data) == 2): if self.IsIconized(): self.Restore() self.Raise() if len(data) == 2: path = data[1] if not os.path.isfile(path) and not os.path.isabs(path): path = get_data_path(path) if not path: return "fail" else: self.droptarget.OnDropFiles(0, 0, [path]) elif len(data) == 3: # Create testchart wx.CallAfter(self.tc_preview_handler, path=data[2]) return "ok" return "invalid" def ti1_drop_handler(self, path): self.tc_load_cfg_from_ti1(None, path) def resize_grid(self): num_cols = self.grid.GetNumberCols() if not num_cols: return grid_w = self.grid.GetSize()[0] - self.grid.GetRowLabelSize() - self.grid.GetDefaultRowSize() col_w = round(grid_w / (num_cols - 1)) last_col_w = grid_w - col_w * (num_cols - 2) for i in xrange(num_cols): if i == 3: w = self.grid.GetDefaultRowSize() elif i == num_cols - 2: w = last_col_w - wx.SystemSettings_GetMetric(wx.SYS_VSCROLL_X) else: w = col_w self.grid.SetColSize(i, w) self.grid.SetMargins(0 - wx.SystemSettings_GetMetric(wx.SYS_VSCROLL_X), 0) self.grid.ForceRefresh() if hasattr(self, "preview"): num_cols = self.preview.GetNumberCols() if not num_cols: return grid_w = (self.preview.GetSize()[0] - self.preview.GetRowLabelSize() - wx.SystemSettings_GetMetric(wx.SYS_VSCROLL_X)) col_w = round(grid_w / num_cols) for i in xrange(num_cols): self.preview.SetColSize(i, col_w) self.preview.SetMargins(0 - wx.SystemSettings_GetMetric(wx.SYS_VSCROLL_X), 0) self.preview.ForceRefresh() def tc_grid_range_select_handler(self, event): if debug: safe_print("[D] tc_grid_range_select_handler") if not self.grid.GetBatchCount(): wx.CallAfter(self.tc_set_default_status) event.Skip() def tc_grid_label_left_click_handler(self, event): wx.CallAfter(self.tc_set_default_status) event.Skip() def tc_grid_label_left_dclick_handler(self, event): row, col = event.GetRow(), event.GetCol() if col == -1: # row label clicked data = self.ti1.queryv1("DATA") wp = self.ti1.queryv1("APPROX_WHITE_POINT") if wp: wp = [float(v) for v in wp.split()] wp = [(v / wp[1]) * 100.0 for v in wp] else: wp = colormath.get_standard_illuminant("D65", scale=100) newdata = { "SAMPLE_ID": row + 2, "RGB_R": 100.0, "RGB_G": 100.0, "RGB_B": 100.0, "XYZ_X": wp[0], "XYZ_Y": 100.0, "XYZ_Z": wp[2] } self.tc_add_data(row, [newdata]) event.Skip() def tc_key_handler(self, event): # AltDown # CmdDown # ControlDown # GetKeyCode # GetModifiers # GetPosition # GetRawKeyCode # GetRawKeyFlags # GetUniChar # GetUnicodeKey # GetX # GetY # HasModifiers # KeyCode # MetaDown # Modifiers # Position # RawKeyCode # RawKeyFlags # ShiftDown # UnicodeKey # X # Y if debug: safe_print("[D] event.KeyCode", event.GetKeyCode(), "event.RawKeyCode", event.GetRawKeyCode(), "event.UniChar", event.GetUniChar(), "event.UnicodeKey", event.GetUnicodeKey(), "CTRL/CMD:", event.ControlDown() or event.CmdDown(), "ALT:", event.AltDown(), "SHIFT:", event.ShiftDown()) if (event.ControlDown() or event.CmdDown()): # CTRL (Linux/Mac/Windows) / CMD (Mac) key = event.GetKeyCode() focus = self.FindFocus() if focus and self.grid in (focus, focus.GetParent(), focus.GetGrandParent()): if key in (8, 127): # BACKSPACE / DEL rows = self.grid.GetSelectionRows() if rows and len(rows) and min(rows) >= 0 and max(rows) + 1 <= self.grid.GetNumberRows(): if len(rows) == self.grid.GetNumberRows(): self.tc_check_save_ti1() else: self.tc_delete_rows(rows) return if key == 83: # S if (hasattr(self, "ti1")): if (event.ShiftDown() or event.AltDown() or not self.ti1.filename or not os.path.exists(self.ti1.filename)): self.tc_save_as_handler() elif self.ti1.modified: self.tc_save_handler(True) return else: event.Skip() else: event.Skip() def tc_sash_handler(self, event): if event.GetSashPosition() < self.sizer.GetMinSize()[1]: self.splitter.SetSashPosition(self.sizer.GetMinSize()[1]) event.Skip() def tc_size_handler(self, event = None): wx.CallAfter(self.resize_grid) if self.IsShownOnScreen() and not self.IsMaximized() and not self.IsIconized(): w, h = self.GetSize() setcfg("size.tcgen.w", w) setcfg("size.tcgen.h", h) if event: event.Skip() def tc_sort_handler(self, event): idx = self.change_patch_order_ctrl.GetSelection() if idx == 0: self.ti1.sort_RGB_gray_to_top() elif idx == 1: self.ti1.sort_RGB_white_to_top() elif idx == 2: self.ti1.sort_RGB_to_top(1, 0, 0) # Red elif idx == 3: self.ti1.sort_RGB_to_top(0, 1, 0) # Green elif idx == 4: self.ti1.sort_RGB_to_top(0, 0, 1) # Blue elif idx == 5: self.ti1.sort_RGB_to_top(0, 1, 1) # Cyan elif idx == 6: self.ti1.sort_RGB_to_top(1, 0, 1) # Magenta elif idx == 7: self.ti1.sort_RGB_to_top(1, 1, 0) # Yellow elif idx == 8: self.ti1.sort_by_HSI() elif idx == 9: self.ti1.sort_by_HSL() elif idx == 10: self.ti1.sort_by_HSV() elif idx == 11: self.ti1.sort_by_L() elif idx == 12: self.ti1.sort_by_RGB() elif idx == 13: self.ti1.sort_by_RGB_sum() elif idx == 14: self.ti1.checkerboard() self.tc_clear(False) self.tc_preview(True) def tc_enable_sort_controls(self): enable = hasattr(self, "ti1") self.change_patch_order_ctrl.Enable(enable) self.change_patch_order_btn.Enable(enable) def tc_grid_cell_change_handler(self, event, save_check=True): data = self.ti1[0]["DATA"] sample = data[event.GetRow()] label = self.label_b2a.get(self.grid.GetColLabelValue(event.GetCol())) strval = "0" + self.grid.GetCellValue(event.GetRow(), event.GetCol()).replace(",", ".") value_set = False try: value = float(strval) if value > 100: raise ValueError("RGB value %r%% is invalid" % value) elif value < 0: raise ValueError("Negative RGB value %r%% is invalid" % value) except ValueError, exception: if not self.grid.GetBatchCount(): wx.Bell() if label in self.ti1[0]["DATA_FORMAT"].values(): strval = str(sample[label]) if "." in strval: strval = strval.rstrip("0").rstrip(".") else: strval = "" else: if label in ("RGB_R", "RGB_G", "RGB_B"): sample[label] = value # If the same RGB combo is already in the ti1, use its XYZ # TODO: Implement proper lookup when using precond profile # This costs too much performance when updating multiple cells! # (e.g. paste operation from spreadsheet) ##ref = data.queryi({"RGB_R": sample["RGB_R"], ##"RGB_G": sample["RGB_G"], ##"RGB_B": sample["RGB_B"]}) ##if ref: ##for i in ref: ##if ref[i] != sample: ##ref = ref[i] ##break ##if "XYZ_X" in ref: ##XYZ = [component / 100.0 for component in (ref["XYZ_X"], ref["XYZ_Y"], ref["XYZ_Z"])] ##else: # Fall back to default D65-ish values XYZ = argyll_RGB2XYZ(*[component / 100.0 for component in (sample["RGB_R"], sample["RGB_G"], sample["RGB_B"])]) sample["XYZ_X"], sample["XYZ_Y"], sample["XYZ_Z"] = [component * 100.0 for component in XYZ] # FIXME: Should this be removed? There are no XYZ fields in the editor #for label in ("XYZ_X", "XYZ_Y", "XYZ_Z"): #for col in range(self.grid.GetNumberCols()): #if self.label_b2a.get(self.grid.GetColLabelValue(col)) == label: #self.grid.SetCellValue(event.GetRow(), col, str(round(sample[label], 4))) #value_set = True elif label in ("XYZ_X", "XYZ_Y", "XYZ_Z"): # FIXME: Should this be removed? There are no XYZ fields in the editor if value < 0: value = 0.0 sample[label] = value RGB = argyll_XYZ2RGB(*[component / 100.0 for component in (sample["XYZ_X"], sample["XYZ_Y"], sample["XYZ_Z"])]) sample["RGB_R"], sample["RGB_G"], sample["RGB_B"] = [component * 100.0 for component in RGB] for label in ("RGB_R", "RGB_G", "RGB_B"): for col in range(self.grid.GetNumberCols()): if self.label_b2a.get(self.grid.GetColLabelValue(col)) == label: self.grid.SetCellValue(event.GetRow(), col, str(round(sample[label], 4))) value_set = True self.tc_grid_setcolorlabel(event.GetRow(), data) if not self.grid.GetBatchCount() and save_check: self.tc_save_check() if not value_set: self.grid.SetCellValue(event.GetRow(), event.GetCol(), re.sub("^0+(?!\.)", "", strval) or "0") def tc_white_patches_handler(self, event = None): setcfg("tc_white_patches", self.tc_white_patches.GetValue()) self.tc_check() if event: event.Skip() def tc_black_patches_handler(self, event = None): setcfg("tc_black_patches", self.tc_black_patches.GetValue()) self.tc_check() if event: event.Skip() def tc_single_channel_patches_handler(self, event = None): if event: event.Skip() event = CustomEvent(event.GetEventType(), event.GetEventObject()) if event and event.GetEventType() == wx.EVT_TEXT.evtType[0]: wx.CallLater(3000, self.tc_single_channel_patches_handler2, event) # 3 seconds delay to allow user to finish keying in a value before it is validated else: wx.CallAfter(self.tc_single_channel_patches_handler2, event) def tc_single_channel_patches_handler2(self, event = None): if self.tc_single_channel_patches.GetValue() == 1: if event and event.GetEventType() in (0, wx.EVT_SPINCTRL.evtType[0]) and getcfg("tc_single_channel_patches") == 2: # decrease self.tc_single_channel_patches.SetValue(0) else: # increase self.tc_single_channel_patches.SetValue(2) setcfg("tc_single_channel_patches", self.tc_single_channel_patches.GetValue()) self.tc_check() def tc_gray_handler(self, event = None): if event: event.Skip() event = CustomEvent(event.GetEventType(), event.GetEventObject()) if event and event.GetEventType() == wx.EVT_TEXT.evtType[0]: wx.CallLater(3000, self.tc_gray_handler2, event) # 3 seconds delay to allow user to finish keying in a value before it is validated else: wx.CallAfter(self.tc_gray_handler2, event) def tc_gray_handler2(self, event = None): if self.tc_gray_patches.GetValue() == 1: if event and event.GetEventType() in (0, wx.EVT_SPINCTRL.evtType[0]) and getcfg("tc_gray_patches") == 2: # decrease self.tc_gray_patches.SetValue(0) else: # increase self.tc_gray_patches.SetValue(2) setcfg("tc_gray_patches", self.tc_gray_patches.GetValue()) self.tc_check() def tc_fullspread_handler(self, event = None): setcfg("tc_fullspread_patches", self.tc_fullspread_patches.GetValue()) self.tc_algo_handler() self.tc_check() def tc_gamma_handler(self, event): setcfg("tc_gamma", self.tc_gamma_floatctrl.GetValue()) def tc_get_total_patches(self, white_patches = None, black_patches=None, single_channel_patches = None, gray_patches = None, multi_steps = None, multi_bcc_steps=None, fullspread_patches = None): if hasattr(self, "ti1") and [white_patches, black_patches, single_channel_patches, gray_patches, multi_steps, multi_bcc_steps, fullspread_patches] == [None] * 7: return self.ti1.queryv1("NUMBER_OF_SETS") if white_patches is None: white_patches = self.tc_white_patches.GetValue() if black_patches is None: if self.worker.argyll_version >= [1, 6]: black_patches = self.tc_black_patches.GetValue() elif hasattr(self, "ti1"): black_patches = self.ti1.queryv1("BLACK_COLOR_PATCHES") if single_channel_patches is None: single_channel_patches = self.tc_single_channel_patches.GetValue() single_channel_patches_total = single_channel_patches * 3 if gray_patches is None: gray_patches = self.tc_gray_patches.GetValue() if (gray_patches == 0 and (single_channel_patches > 0 or black_patches > 0) and white_patches > 0): gray_patches = 2 if multi_steps is None: multi_steps = self.tc_multi_steps.GetValue() if multi_bcc_steps is None and getcfg("tc_multi_bcc") and self.worker.argyll_version >= [1, 6]: multi_bcc_steps = self.tc_multi_steps.GetValue() if fullspread_patches is None: fullspread_patches = self.tc_fullspread_patches.GetValue() return get_total_patches(white_patches, black_patches, single_channel_patches, gray_patches, multi_steps, multi_bcc_steps, fullspread_patches) def tc_get_black_patches(self): if self.worker.argyll_version >= [1, 6]: black_patches = self.tc_black_patches.GetValue() else: black_patches = 0 single_channel_patches = self.tc_single_channel_patches.GetValue() gray_patches = self.tc_gray_patches.GetValue() if gray_patches == 0 and single_channel_patches > 0 and black_patches > 0: gray_patches = 2 multi_steps = self.tc_multi_steps.GetValue() if multi_steps > 1 or gray_patches > 1: # black always in multi channel or gray patches black_patches -= 1 return max(0, black_patches) def tc_get_white_patches(self): white_patches = self.tc_white_patches.GetValue() single_channel_patches = self.tc_single_channel_patches.GetValue() gray_patches = self.tc_gray_patches.GetValue() if gray_patches == 0 and single_channel_patches > 0 and white_patches > 0: gray_patches = 2 multi_steps = self.tc_multi_steps.GetValue() if multi_steps > 1 or gray_patches > 1: # white always in multi channel or gray patches white_patches -= 1 return max(0, white_patches) def tc_multi_steps_handler(self, event = None): if event: event.Skip() event = CustomEvent(event.GetEventType(), event.GetEventObject()) if event and event.GetEventType() == wx.EVT_TEXT.evtType[0]: wx.CallLater(3000, self.tc_multi_steps_handler2, event) # 3 seconds delay to allow user to finish keying in a value before it is validated else: wx.CallAfter(self.tc_multi_steps_handler2, event) def tc_multi_steps_handler2(self, event = None): if self.tc_multi_steps.GetValue() == 1: if event and event.GetEventType() in (0, wx.EVT_SPINCTRL.evtType[0]) and getcfg("tc_multi_steps") == 2: # decrease self.tc_multi_steps.SetValue(0) else: # increase self.tc_multi_steps.SetValue(2) multi_steps = self.tc_multi_steps.GetValue() multi_patches = int(math.pow(multi_steps, 3)) if getcfg("tc_multi_bcc") and self.worker.argyll_version >= [1, 6]: pref = "tc_multi_bcc_steps" if multi_steps: multi_patches += int(math.pow(multi_steps - 1, 3)) multi_steps += multi_steps - 1 setcfg("tc_multi_steps", self.tc_multi_steps.GetValue()) else: pref = "tc_multi_steps" setcfg("tc_multi_bcc_steps", 0) self.tc_multi_patches.SetLabel(lang.getstr("tc.multidim.patches", (multi_patches, multi_steps))) setcfg(pref, self.tc_multi_steps.GetValue()) self.tc_check() def tc_neutral_axis_emphasis_handler(self, event=None): if event.GetId() == self.tc_neutral_axis_emphasis_slider.GetId(): self.tc_neutral_axis_emphasis_intctrl.SetValue(self.tc_neutral_axis_emphasis_slider.GetValue()) else: self.tc_neutral_axis_emphasis_slider.SetValue(self.tc_neutral_axis_emphasis_intctrl.GetValue()) setcfg("tc_neutral_axis_emphasis", self.tc_neutral_axis_emphasis_intctrl.GetValue() / 100.0) self.tc_algo_handler() def tc_dark_emphasis_handler(self, event=None): if event.GetId() == self.tc_dark_emphasis_slider.GetId(): self.tc_dark_emphasis_intctrl.SetValue(self.tc_dark_emphasis_slider.GetValue()) else: self.tc_dark_emphasis_slider.SetValue(self.tc_dark_emphasis_intctrl.GetValue()) setcfg("tc_dark_emphasis", self.tc_dark_emphasis_intctrl.GetValue() / 100.0) self.tc_algo_handler() def tc_algo_handler(self, event = None): tc_algo_enable = self.tc_fullspread_patches.GetValue() > 0 self.tc_algo.Enable(tc_algo_enable) tc_algo = self.tc_algos_ba[self.tc_algo.GetStringSelection()] self.tc_adaption_slider.Enable(tc_algo_enable and tc_algo == "") self.tc_adaption_intctrl.Enable(tc_algo_enable and tc_algo == "") tc_precond_enable = (tc_algo in ("I", "Q", "R", "t") or (tc_algo == "" and self.tc_adaption_slider.GetValue() > 0)) if self.worker.argyll_version >= [1, 3, 3]: self.tc_neutral_axis_emphasis_slider.Enable(tc_algo_enable and tc_precond_enable) self.tc_neutral_axis_emphasis_intctrl.Enable(tc_algo_enable and tc_precond_enable) self.tc_precond.Enable(bool(getcfg("tc_precond_profile"))) if not getcfg("tc_precond_profile"): self.tc_precond.SetValue(False) else: self.tc_precond.SetValue(bool(int(getcfg("tc_precond")))) if self.worker.argyll_version >= [1, 6, 2]: tc_dark_emphasis_enable = (self.worker.argyll_version >= [1, 6, 3] or (tc_precond_enable and bool(int(getcfg("tc_precond"))) and bool(getcfg("tc_precond_profile")))) self.tc_dark_emphasis_slider.Enable(tc_dark_emphasis_enable) self.tc_dark_emphasis_intctrl.Enable(tc_dark_emphasis_enable) self.tc_angle_slider.Enable(tc_algo_enable and tc_algo in ("i", "I")) self.tc_angle_intctrl.Enable(tc_algo_enable and tc_algo in ("i", "I")) setcfg("tc_algo", tc_algo) self.tc_enable_add_precond_controls() def tc_enable_add_precond_controls(self): tc_algo = getcfg("tc_algo") add_preconditioned_enable = (hasattr(self, "ti1") and bool(getcfg("tc_precond_profile"))) self.saturation_sweeps_intctrl.Enable(add_preconditioned_enable) for color in ("R", "G", "B", "C", "M", "Y"): getattr(self, "saturation_sweeps_%s_btn" % color).Enable( add_preconditioned_enable) RGB = {} for component in ("R", "G", "B"): ctrl = getattr(self, "saturation_sweeps_custom_%s_ctrl" % component) ctrl.Enable(add_preconditioned_enable) RGB[component] = ctrl.GetValue() self.saturation_sweeps_custom_btn.Enable( add_preconditioned_enable and not (RGB["R"] == RGB["G"] == RGB["B"])) self.add_ti3_btn.Enable(add_preconditioned_enable) self.add_ti3_relative_cb.Enable(add_preconditioned_enable) def tc_adaption_handler(self, event = None): if event.GetId() == self.tc_adaption_slider.GetId(): self.tc_adaption_intctrl.SetValue(self.tc_adaption_slider.GetValue()) else: self.tc_adaption_slider.SetValue(self.tc_adaption_intctrl.GetValue()) setcfg("tc_adaption", self.tc_adaption_intctrl.GetValue() / 100.0) self.tc_algo_handler() def tc_add_saturation_sweeps_handler(self, event): try: profile = ICCP.ICCProfile(getcfg("tc_precond_profile")) except (IOError, ICCP.ICCProfileInvalidError), exception: show_result_dialog(exception, self) else: rgb_space = profile.get_rgb_space() if not rgb_space: show_result_dialog(Error( lang.getstr("profile.required_tags_missing", lang.getstr("profile.type.shaper_matrix"))), self) return R, G, B = {self.saturation_sweeps_R_btn.GetId(): (1, 0, 0), self.saturation_sweeps_G_btn.GetId(): (0, 1, 0), self.saturation_sweeps_B_btn.GetId(): (0, 0, 1), self.saturation_sweeps_C_btn.GetId(): (0, 1, 1), self.saturation_sweeps_M_btn.GetId(): (1, 0, 1), self.saturation_sweeps_Y_btn.GetId(): (1, 1, 0), self.saturation_sweeps_custom_btn.GetId(): (self.saturation_sweeps_custom_R_ctrl.GetValue() / 100.0, self.saturation_sweeps_custom_G_ctrl.GetValue() / 100.0, self.saturation_sweeps_custom_B_ctrl.GetValue() / 100.0)}[event.GetId()] maxv = self.saturation_sweeps_intctrl.GetValue() newdata = [] rows = self.grid.GetSelectionRows() if rows: row = rows[-1] else: row = self.grid.GetNumberRows() - 1 for i in xrange(maxv): saturation = 1.0 / (maxv - 1) * i RGB, xyY = colormath.RGBsaturation(R, G, B, 1.0 / (maxv - 1) * i, rgb_space) X, Y, Z = colormath.xyY2XYZ(*xyY) newdata.append({ "SAMPLE_ID": row + 2, "RGB_R": round(RGB[0] * 100, 4), "RGB_G": round(RGB[1] * 100, 4), "RGB_B": round(RGB[2] * 100, 4), "XYZ_X": X * 100, "XYZ_Y": Y * 100, "XYZ_Z": Z * 100 }) self.tc_add_data(row, newdata) self.grid.select_row(row + len(newdata)) def tc_drop_ti3_handler(self, path): if not hasattr(self, "ti1"): wx.Bell() elif getcfg("tc_precond_profile"): self.tc_add_ti3_handler(None, path) else: show_result_dialog(lang.getstr("tc.precond.notset"), self) def tc_add_ti3_handler(self, event, chart=None): try: profile = ICCP.ICCProfile(getcfg("tc_precond_profile")) except (IOError, ICCP.ICCProfileInvalidError), exception: show_result_dialog(exception, self) return if not chart: defaultDir, defaultFile = get_verified_path("testchart.reference") dlg = wx.FileDialog(self, lang.getstr("testchart_or_reference"), defaultDir=defaultDir, defaultFile=defaultFile, wildcard=(lang.getstr("filetype.ti1_ti3_txt") + "|*.cgats;*.cie;*.gam;*.icc;*.icm;*.jpg;*.jpeg;*.png;*.ti1;*.ti2;*.ti3;*.tif;*.tiff;*.txt"), style=wx.FD_OPEN | wx.FD_FILE_MUST_EXIST) dlg.Center(wx.BOTH) result = dlg.ShowModal() if result == wx.ID_OK: chart = dlg.GetPath() setcfg("testchart.reference", chart) dlg.Destroy() if result != wx.ID_OK: return use_gamut = False # Determine if this is an image filename, ext = os.path.splitext(chart) if ext.lower() in (".jpg", ".jpeg", ".png", ".tif", ".tiff"): llevel = wx.Log.GetLogLevel() wx.Log.SetLogLevel(0) # Suppress TIFF library related message popups try: img = wx.Image(chart, wx.BITMAP_TYPE_ANY) if not img.IsOk(): raise Error(lang.getstr("error.file_type_unsupported")) except Exception, exception: show_result_dialog(exception, self) return finally: wx.Log.SetLogLevel(llevel) if test: dlg = ConfirmDialog(self, title=lang.getstr("testchart.add_ti3_patches"), msg=lang.getstr("gamut"), ok="L*a*b*", alt="RGB", bitmap=geticon(32, appname + "-testchart-editor")) result = dlg.ShowModal() if result == wx.ID_CANCEL: return use_gamut = result == wx.ID_OK else: img = None if ext.lower() in (".icc", ".icm"): try: nclprof = ICCP.ICCProfile(chart) if (nclprof.profileClass != "nmcl" or not "ncl2" in nclprof.tags or not isinstance(nclprof.tags.ncl2, ICCP.NamedColor2Type) or nclprof.connectionColorSpace not in ("Lab", "XYZ")): raise Error(lang.getstr("profile.only_named_color")) except Exception, exception: show_result_dialog(exception, self) return if nclprof.connectionColorSpace == "Lab": data_format = "LAB_L LAB_A LAB_B" else: data_format = " XYZ_X XYZ_Y XYZ_Z" chart = ["GAMUT ", "BEGIN_DATA_FORMAT", data_format, "END_DATA_FORMAT", "BEGIN_DATA", "END_DATA"] if "wtpt" in nclprof.tags: chart.insert(1, 'KEYWORD "APPROX_WHITE_POINT"') chart.insert(2, 'APPROX_WHITE_POINT "%.4f %.4f %.4f"' % tuple(v * 100 for v in nclprof.tags.wtpt.ir.values())) for k, v in nclprof.tags.ncl2.iteritems(): chart.insert(-1, "%.4f %.4f %.4f" % tuple(v.pcs.values())) chart = "\n".join(chart) self.worker.start(self.tc_add_ti3_consumer, self.tc_add_ti3, cargs=(profile, ), wargs=(chart, img, use_gamut, profile), wkwargs={}, progress_msg=lang.getstr("testchart.add_ti3_patches"), parent=self, progress_start=500, fancy=False) def tc_add_ti3_consumer(self, result, profile=None): if isinstance(result, Exception): show_result_dialog(result, self) else: chart = result data_format = chart.queryv1("DATA_FORMAT").values() if getcfg("tc_add_ti3_relative"): intent = "r" else: intent = "a" if not (chart[0].type.strip() == "GAMUT" and "RGB_R" in data_format and "RGB_G" in data_format and "RGB_B" in data_format): as_ti3 = ("LAB_L" in data_format and "LAB_A" in data_format and "LAB_B" in data_format) or ("XYZ_X" in data_format and "XYZ_Y" in data_format and "XYZ_Z" in data_format) if getcfg("tc_add_ti3_relative"): adapted = chart.adapt() ti1, ti3, void = self.worker.chart_lookup(chart, profile, as_ti3, intent=intent, white_patches=False) if not ti1 or not ti3: return if as_ti3: chart = ti1 else: chart = ti3 dataset = chart.queryi1("DATA") data_format = dataset.queryv1("DATA_FORMAT").values() # Returned CIE values are always either XYZ or Lab if ("LAB_L" in data_format and "LAB_A" in data_format and "LAB_B" in data_format): cie = "Lab" else: cie = "XYZ" newdata = [] rows = self.grid.GetSelectionRows() if rows: row = rows[-1] else: row = self.grid.GetNumberRows() - 1 for i in dataset.DATA: if cie == "Lab": (dataset.DATA[i]["XYZ_X"], dataset.DATA[i]["XYZ_Y"], dataset.DATA[i]["XYZ_Z"]) = colormath.Lab2XYZ( dataset.DATA[i]["LAB_L"], dataset.DATA[i]["LAB_A"], dataset.DATA[i]["LAB_B"], scale=100) if intent == "r": (dataset.DATA[i]["XYZ_X"], dataset.DATA[i]["XYZ_Y"], dataset.DATA[i]["XYZ_Z"]) = colormath.adapt( dataset.DATA[i]["XYZ_X"], dataset.DATA[i]["XYZ_Y"], dataset.DATA[i]["XYZ_Z"], "D50", profile.tags.wtpt.values()) entry = {"SAMPLE_ID": row + 2 + i} for label in ("RGB_R", "RGB_G", "RGB_B", "XYZ_X", "XYZ_Y", "XYZ_Z"): entry[label] = round(dataset.DATA[i][label], 4) newdata.append(entry) self.tc_add_data(row, newdata) self.grid.select_row(row + len(newdata)) def tc_add_ti3(self, chart, img=None, use_gamut=True, profile=None): if img: cwd = self.worker.create_tempdir() if isinstance(cwd, Exception): return cwd size = 70.0 scale = math.sqrt((img.Width * img.Height) / (size * size)) w, h = int(round(img.Width / scale)), int(round(img.Height / scale)) loresimg = img.Scale(w, h, wx.IMAGE_QUALITY_NORMAL) if loresimg.CountColours() < img.CountColours(size * size): # Assume a photo quality = wx.IMAGE_QUALITY_HIGH else: # Assume a target quality = wx.IMAGE_QUALITY_NORMAL ext = os.path.splitext(chart)[1] if (ext.lower() in (".tif", ".tiff") or (self.worker.argyll_version >= [1, 4] and ext.lower() in (".jpeg", ".jpg"))): imgpath = chart else: imgpath = os.path.join(cwd, "image.tif") img.SaveFile(imgpath, wx.BITMAP_TYPE_TIF) outpath = os.path.join(cwd, "imageout.tif") # Process image to get colors # Two ways to do this: Convert image using cctiff # or use tiffgamut # In both cases, a profile embedded in the image will be used # with the preconditioning profile as fallback if there is no # image profile if not use_gamut: # Use cctiff cmdname = "cctiff" else: # Use tiffgamut cmdname = "tiffgamut" gam = os.path.join(cwd, "image.gam") cmd = get_argyll_util(cmdname) if cmd: ppath = getcfg("tc_precond_profile") intent = "r" if getcfg("tc_add_ti3_relative") else "a" for n in xrange(2 if ppath else 1): if use_gamut: res = 10 if imgpath == chart else 1 args = ["-d%s" % res, "-O", gam] #if self.worker.argyll_version >= [1, 0, 4]: #args.append("-f100") else: args = ["-a"] if self.worker.argyll_version >= [1, 4]: # Always save as TIFF args.append("-fT") elif self.worker.argyll_version >= [1, 1]: # TIFF photometric encoding 1..n args.append("-t1") else: # TIFF photometric encoding 1..n args.append("-e1") args.append("-i%s" % intent) if n == 0: # Try to use embedded profile args.append(imgpath) if not use_gamut: # Target args.append("-i%s" % intent) args.append(ppath) else: # Fall back to preconditioning profile args.append(ppath) args.append(imgpath) if not use_gamut: args.append(outpath) result = self.worker.exec_cmd(cmd, ["-v"] + args, capture_output=True, skip_scripts=True) if not result: errors = "".join(self.worker.errors) if ("Error - Can't open profile in file" in errors or "Error - Can't read profile" in errors): # Try again? continue break if isinstance(result, Exception) or not result: self.worker.wrapup(False) if isinstance(result, Exception): return result elif result: if use_gamut: chart = gam else: last_output_space = None for line in self.worker.output: if line.startswith("Output space ="): last_output_space = line.split("=")[1].strip() if last_output_space == "RGB": chart = outpath else: chart = imgpath else: return Error("\n".join(self.worker.errors or self.worker.output)) else: return Error(lang.getstr("argyll.util.not_found", cmdname)) if not use_gamut: llevel = wx.Log.GetLogLevel() wx.Log.SetLogLevel(0) # Suppress TIFF library related message popups try: img = wx.Image(chart, wx.BITMAP_TYPE_ANY) if not img.IsOk(): raise Error(lang.getstr("error.file_type_unsupported")) except Exception, exception: return exception finally: wx.Log.SetLogLevel(llevel) self.worker.wrapup(False) if img.Width != w or img.Height != h: img.Rescale(w, h, quality) # Select RGB colors and fill chart chart = ["TI1 ", "BEGIN_DATA_FORMAT", "RGB_R RGB_G RGB_B", "END_DATA_FORMAT", "BEGIN_DATA", "END_DATA"] for y in xrange(h): for x in xrange(w): R, G, B = (img.GetRed(x, y) / 2.55, img.GetGreen(x, y) / 2.55, img.GetBlue(x, y) / 2.55) chart.insert(-1, "%.4f %.4f %.4f" % (R, G, B)) chart = "\n".join(chart) try: chart = CGATS.CGATS(chart) if not chart.queryv1("DATA_FORMAT"): raise CGATS.CGATSError(lang.getstr("error.testchart.missing_fields", (chart.filename, "DATA_FORMAT"))) except (IOError, CGATS.CGATSError), exception: return exception finally: path = None if isinstance(chart, CGATS.CGATS): if chart.filename: path = chart.filename elif os.path.isfile(chart): path = chart if path and os.path.dirname(path) == self.worker.tempdir: self.worker.wrapup(False) if img: if use_gamut: threshold = 2 else: threshold = 4 try: void, ti3, void = self.worker.chart_lookup(chart, profile, intent=intent, white_patches=False, raise_exceptions=True) except Exception, exception: return exception if ti3: chart = ti3 else: return Error(lang.getstr("error.generic", (-1, lang.getstr("unknown")))) colorsets = OrderedDict() weights = {} demph = getcfg("tc_dark_emphasis") # Select Lab color data = chart.queryv1("DATA") for sample in data.itervalues(): if not use_gamut: RGB = sample["RGB_R"], sample["RGB_G"], sample["RGB_B"] L, a, b = (sample["LAB_L"], sample["LAB_A"], sample["LAB_B"]) color = round(L / 10), round(a / 15), round(b / 15) if not color in colorsets: weights[color] = 0 colorsets[color] = [] if L >= 50: weights[color] += L / 50 - demph else: weights[color] += L / 50 + demph colorsets[color].append((L, a, b)) if not use_gamut: colorsets[color][-1] += RGB # Fill chart data_format = "LAB_L LAB_A LAB_B" if not use_gamut: data_format += " RGB_R RGB_G RGB_B" chart = ["GAMUT ", "BEGIN_DATA_FORMAT", data_format, "END_DATA_FORMAT", "BEGIN_DATA", "END_DATA"] weight = bool(filter(lambda color: weights[color] >= threshold, colorsets.iterkeys())) for color, colors in colorsets.iteritems(): if weight and weights[color] < threshold: continue L, a, b = 0, 0, 0 R, G, B = 0, 0, 0 for v in colors: L += v[0] a += v[1] b += v[2] if len(v) == 6: R += v[3] G += v[4] B += v[5] L /= len(colors) a /= len(colors) b /= len(colors) R /= len(colors) G /= len(colors) B /= len(colors) chart.insert(-1, "%.4f %.4f %.4f" % (L, a, b)) if not use_gamut: chart[-2] += " %.4f %.4f %.4f" % (R, G, B) chart = CGATS.CGATS("\n".join(chart)) else: chart.fix_device_values_scaling() return chart def tc_add_ti3_relative_handler(self, event): setcfg("tc_add_ti3_relative", int(self.add_ti3_relative_cb.GetValue())) def tc_angle_handler(self, event = None): if event.GetId() == self.tc_angle_slider.GetId(): self.tc_angle_intctrl.SetValue(self.tc_angle_slider.GetValue()) else: self.tc_angle_slider.SetValue(self.tc_angle_intctrl.GetValue()) setcfg("tc_angle", self.tc_angle_intctrl.GetValue() / 10000.0) def tc_multi_bcc_cb_handler(self, event=None): setcfg("tc_multi_bcc", int(self.tc_multi_bcc_cb.GetValue())) self.tc_multi_steps_handler2() def tc_precond_handler(self, event = None): setcfg("tc_precond", int(self.tc_precond.GetValue())) self.tc_adaption_slider.SetValue((1 if getcfg("tc_precond") else defaults["tc_adaption"]) * 100) self.tc_adaption_handler(self.tc_adaption_slider) self.tc_algo_handler() def tc_precond_profile_handler(self, event = None): tc_precond_enable = bool(self.tc_precond_profile.GetPath()) self.tc_precond.Enable(tc_precond_enable) setcfg("tc_precond_profile", self.tc_precond_profile.GetPath()) self.tc_algo_handler() def tc_precond_profile_current_ctrl_handler(self, event): profile_path = get_current_profile_path(True, True) if profile_path: self.tc_precond_profile.SetPath(profile_path) self.tc_precond_profile_handler() else: show_result_dialog(Error(lang.getstr("display_profile.not_detected", get_display_name(None, True))), self) def tc_filter_handler(self, event = None): setcfg("tc_filter", int(self.tc_filter.GetValue())) setcfg("tc_filter_L", self.tc_filter_L.GetValue()) setcfg("tc_filter_a", self.tc_filter_a.GetValue()) setcfg("tc_filter_b", self.tc_filter_b.GetValue()) setcfg("tc_filter_rad", self.tc_filter_rad.GetValue()) def tc_vrml_black_offset_ctrl_handler(self, event): setcfg("tc_vrml_black_offset", self.tc_vrml_black_offset_intctrl.GetValue()) def tc_vrml_compress_handler(self, event): setcfg("vrml.compress", int(self.tc_vrml_compress_cb.GetValue())) def tc_vrml_handler(self, event = None): d = self.tc_vrml_device.GetValue() l = self.tc_vrml_cie.GetValue() if event: setcfg("tc_vrml_device", int(d)) setcfg("tc_vrml_cie", int(l)) setcfg("tc_vrml_cie_colorspace", self.tc_vrml_cie_colorspace_ctrl.GetStringSelection()) setcfg("tc_vrml_device_colorspace", self.tc_vrml_device_colorspace_ctrl.GetStringSelection()) self.vrml_save_as_btn.Enable(hasattr(self, "ti1") and (d or l)) self.view_3d_format_btn.Enable(hasattr(self, "ti1") and (d or l)) def tc_vrml_use_D50_handler(self, event): setcfg("tc_vrml_use_D50", int(self.tc_vrml_use_D50_cb.GetValue())) def tc_update_controls(self): self.tc_algo.SetStringSelection(self.tc_algos_ab.get(getcfg("tc_algo"), self.tc_algos_ab.get(defaults["tc_algo"]))) self.tc_white_patches.SetValue(getcfg("tc_white_patches")) if self.worker.argyll_version >= [1, 6]: self.tc_black_patches.SetValue(getcfg("tc_black_patches")) self.tc_single_channel_patches.SetValue(getcfg("tc_single_channel_patches")) self.tc_gray_patches.SetValue(getcfg("tc_gray_patches")) if getcfg("tc_multi_bcc_steps"): setcfg("tc_multi_bcc", 1) self.tc_multi_steps.SetValue(getcfg("tc_multi_bcc_steps")) else: setcfg("tc_multi_bcc", 0) self.tc_multi_steps.SetValue(getcfg("tc_multi_steps")) if hasattr(self, "tc_multi_bcc_cb"): self.tc_multi_bcc_cb.SetValue(bool(getcfg("tc_multi_bcc"))) self.tc_multi_steps_handler2() self.tc_fullspread_patches.SetValue(getcfg("tc_fullspread_patches")) self.tc_angle_slider.SetValue(getcfg("tc_angle") * 10000) self.tc_angle_handler(self.tc_angle_slider) self.tc_adaption_slider.SetValue(getcfg("tc_adaption") * 100) self.tc_adaption_handler(self.tc_adaption_slider) if (self.worker.argyll_version == [1, 1, "RC2"] or self.worker.argyll_version >= [1, 1]): self.tc_gamma_floatctrl.SetValue(getcfg("tc_gamma")) if self.worker.argyll_version >= [1, 3, 3]: self.tc_neutral_axis_emphasis_slider.SetValue(getcfg("tc_neutral_axis_emphasis") * 100) self.tc_neutral_axis_emphasis_handler(self.tc_neutral_axis_emphasis_slider) if self.worker.argyll_version >= [1, 6, 2]: self.tc_dark_emphasis_slider.SetValue(getcfg("tc_dark_emphasis") * 100) self.tc_dark_emphasis_handler(self.tc_dark_emphasis_slider) self.tc_precond_profile.SetPath(getcfg("tc_precond_profile")) self.tc_filter.SetValue(bool(int(getcfg("tc_filter")))) self.tc_filter_L.SetValue(getcfg("tc_filter_L")) self.tc_filter_a.SetValue(getcfg("tc_filter_a")) self.tc_filter_b.SetValue(getcfg("tc_filter_b")) self.tc_filter_rad.SetValue(getcfg("tc_filter_rad")) self.tc_vrml_cie.SetValue(bool(int(getcfg("tc_vrml_cie")))) self.tc_vrml_cie_colorspace_ctrl.SetSelection( config.valid_values["tc_vrml_cie_colorspace"].index(getcfg("tc_vrml_cie_colorspace"))) self.tc_vrml_device_colorspace_ctrl.SetSelection( config.valid_values["tc_vrml_device_colorspace"].index(getcfg("tc_vrml_device_colorspace"))) self.tc_vrml_device.SetValue(bool(int(getcfg("tc_vrml_device")))) self.tc_vrml_black_offset_intctrl.SetValue(getcfg("tc_vrml_black_offset")) self.tc_vrml_use_D50_cb.SetValue(bool(getcfg("tc_vrml_use_D50"))) self.tc_vrml_handler() self.tc_vrml_compress_cb.SetValue(bool(getcfg("vrml.compress"))) self.add_ti3_relative_cb.SetValue(bool(getcfg("tc_add_ti3_relative"))) self.tc_enable_sort_controls() def tc_check(self, event = None): white_patches = self.tc_white_patches.GetValue() self.tc_amount = self.tc_get_total_patches(white_patches) self.preview_btn.Enable(self.tc_amount - max(0, self.tc_get_white_patches()) - max(0, self.tc_get_black_patches()) >= 8) self.clear_btn.Enable(hasattr(self, "ti1")) self.tc_save_check() self.save_as_btn.Enable(hasattr(self, "ti1")) self.export_btn.Enable(hasattr(self, "ti1")) self.tc_vrml_handler() self.tc_enable_add_precond_controls() self.tc_enable_sort_controls() self.tc_set_default_status() def tc_save_check(self): self.save_btn.Enable(hasattr(self, "ti1") and self.ti1.modified and bool(self.ti1.filename) and os.path.exists(self.ti1.filename) and get_data_path(os.path.join("ref", os.path.basename(self.ti1.filename))) != self.ti1.filename and get_data_path(os.path.join("ti1", os.path.basename(self.ti1.filename))) != self.ti1.filename) def tc_save_cfg(self): setcfg("tc_white_patches", self.tc_white_patches.GetValue()) if self.worker.argyll_version >= [1, 6]: setcfg("tc_black_patches", self.tc_black_patches.GetValue()) setcfg("tc_single_channel_patches", self.tc_single_channel_patches.GetValue()) setcfg("tc_gray_patches", self.tc_gray_patches.GetValue()) setcfg("tc_multi_steps", self.tc_multi_steps.GetValue()) setcfg("tc_fullspread_patches", self.tc_fullspread_patches.GetValue()) tc_algo = self.tc_algos_ba[self.tc_algo.GetStringSelection()] setcfg("tc_algo", tc_algo) setcfg("tc_angle", self.tc_angle_intctrl.GetValue() / 10000.0) setcfg("tc_adaption", self.tc_adaption_intctrl.GetValue() / 100.0) tc_precond_enable = tc_algo in ("I", "Q", "R", "t") or (tc_algo == "" and self.tc_adaption_slider.GetValue() > 0) if tc_precond_enable: setcfg("tc_precond", int(self.tc_precond.GetValue())) setcfg("tc_precond_profile", self.tc_precond_profile.GetPath()) setcfg("tc_filter", int(self.tc_filter.GetValue())) setcfg("tc_filter_L", self.tc_filter_L.GetValue()) setcfg("tc_filter_a", self.tc_filter_a.GetValue()) setcfg("tc_filter_b", self.tc_filter_b.GetValue()) setcfg("tc_filter_rad", self.tc_filter_rad.GetValue()) setcfg("tc_vrml_cie", int(self.tc_vrml_cie.GetValue())) setcfg("tc_vrml_device", int(self.tc_vrml_device.GetValue())) def tc_preview_handler(self, event=None, path=None): if self.worker.is_working(): return fullspread_patches = getcfg("tc_fullspread_patches") single_patches = getcfg("tc_single_channel_patches") gray_patches = getcfg("tc_gray_patches") multidim_patches = getcfg("tc_multi_steps") multidim_bcc_patches = getcfg("tc_multi_bcc_steps") wkwargs = {} if fullspread_patches and (single_patches > 2 or gray_patches > 2 or multidim_patches > 2 or multidim_bcc_patches) and wx.GetKeyState(wx.WXK_SHIFT): dlg = ConfirmDialog(self, -1, lang.getstr("testchart.create"), lang.getstr("testchart.separate_fixed_points"), ok=lang.getstr("ok"), cancel=lang.getstr("cancel"), bitmap=geticon(32, appname + "-testchart-editor")) dlg.sizer3.Add((1, 4)) for name in ("single", "gray", "multidim"): if (locals()[name + "_patches"] > 2 or (name == "multidim" and multidim_bcc_patches)): setattr(dlg, name, wx.CheckBox(dlg, -1, lang.getstr("tc." + name))) dlg.sizer3.Add(getattr(dlg, name), 1, flag=wx.TOP, border=4) getattr(dlg, name).Value = True dlg.sizer0.SetSizeHints(dlg) dlg.sizer0.Layout() choice = dlg.ShowModal() for name in ("single", "gray", "multidim"): if hasattr(dlg, name): wkwargs[name] = getattr(dlg, name).Value dlg.Destroy() if choice == wx.ID_CANCEL: return if not self.tc_check_save_ti1(): return if not check_set_argyll_bin(): return safe_print("-" * 80) safe_print(lang.getstr("testchart.create")) self.worker.interactive = False self.worker.start(self.tc_preview, self.tc_create, cargs=(path, ), wargs=(), wkwargs=wkwargs, progress_msg=lang.getstr("testchart.create"), parent=self, progress_start=500) def tc_preview_update(self, startindex): if not hasattr(self, "preview"): return numcols = self.preview.GetNumberCols() startrow = startindex / numcols startcol = startindex % numcols i = 0 row = startrow numrows = self.preview.GetNumberRows() neededrows = math.ceil(float(self.grid.GetNumberRows()) / numcols) - numrows if neededrows > 0: self.preview.AppendRows(neededrows) while True: if row == startrow: cols = xrange(startcol, numcols) else: cols = xrange(numcols) for col in cols: if startindex + i < self.grid.GetNumberRows(): color = self.grid.GetCellBackgroundColour(startindex + i, 3) textcolor = self.grid.GetCellTextColour(startindex + i, 3) value = self.grid.GetCellValue(startindex + i, 3) else: color = self.preview.GetDefaultCellBackgroundColour() textcolor = self.preview.GetDefaultCellTextColour() value = "" self.preview.SetCellBackgroundColour(row, col, color) self.preview.SetCellTextColour(row, col, textcolor) self.preview.SetCellValue(row, col, value) i += 1 row += 1 if startindex + i >= self.grid.GetNumberRows(): break if row < self.preview.GetNumberRows(): self.preview.DeleteRows(row, self.preview.GetNumberRows() - row) def tc_clear_handler(self, event): self.tc_check_save_ti1() def tc_clear(self, clear_ti1=True): grid = self.grid if grid.GetNumberRows() > 0: grid.DeleteRows(0, grid.GetNumberRows()) if grid.GetNumberCols() > 0: grid.DeleteCols(0, grid.GetNumberCols()) grid.Refresh() self.separator.Hide() self.sizer.Layout() if hasattr(self, "preview"): if self.preview.GetNumberRows() > 0: self.preview.DeleteRows(0, self.preview.GetNumberRows()) if self.preview.GetNumberCols() > 0: self.preview.DeleteCols(0, self.preview.GetNumberCols()) self.preview.Refresh() if clear_ti1: if hasattr(self, "ti1"): del self.ti1 self.tc_update_controls() self.tc_check() # UGLY HACK: This 'safe_print' call fixes a GTK assertion and # segfault under Arch Linux when setting the window title safe_print("") self.SetTitle(lang.getstr("testchart.edit")) def tc_export_handler(self, event): if not hasattr(self, "ti1"): return path = None (defaultDir, defaultFile) = (get_verified_path("last_testchart_export_path")[0], os.path.basename(os.path.splitext(self.ti1.filename or defaults["last_testchart_export_path"])[0])) dlg = wx.FileDialog(self, lang.getstr("export"), defaultDir=defaultDir, defaultFile=defaultFile, # Disable JPEG as it introduces slight color errors wildcard=##lang.getstr("filetype.jpg") + "|*.jpg|" + lang.getstr("filetype.png") + " (8-bit)|*.png|" + lang.getstr("filetype.png") + " (16-bit)|*.png|" + lang.getstr("filetype.tif") + " (8-bit)|*.tif|" + lang.getstr("filetype.tif") + " (16-bit)|*.tif|" + "DPX|*.dpx|" + "CSV (0.0..100.0)|*.csv|" + "CSV (0..255)|*.csv|" + "CSV (0..1023)|*.csv", style=wx.SAVE | wx.OVERWRITE_PROMPT) dlg.Center(wx.BOTH) if dlg.ShowModal() == wx.ID_OK: filter_index = dlg.GetFilterIndex() path = dlg.GetPath() dlg.Destroy() if path: if not waccess(path, os.W_OK): show_result_dialog(Error(lang.getstr("error.access_denied.write", path)), self) return setcfg("last_testchart_export_path", path) self.writecfg() else: return if filter_index < 5: # Image format scale = getcfg("app.dpi") / config.get_default_dpi() if scale < 1: scale = 1 dlg = ConfirmDialog(self, title=lang.getstr("export"), msg=lang.getstr("testchart.export.repeat_patch"), ok=lang.getstr("ok"), cancel=lang.getstr("cancel"), bitmap=geticon(32, appname + "-testchart-editor")) sizer = wx.BoxSizer(wx.HORIZONTAL) dlg.sizer3.Add(sizer, 0, flag=wx.TOP | wx.ALIGN_LEFT, border=12) intctrl = wx.SpinCtrl(dlg, -1, size=(60 * scale, -1), min=config.valid_ranges["tc_export_repeat_patch_max"][0], max=config.valid_ranges["tc_export_repeat_patch_max"][1], value=str(getcfg("tc_export_repeat_patch_max"))) sizer.Add(intctrl, 0, flag=wx.RIGHT | wx.ALIGN_CENTER_VERTICAL, border=4) sizer.Add(wx.StaticText(dlg, -1, u"× " + lang.getstr("max")), 0, flag=wx.RIGHT | wx.ALIGN_CENTER_VERTICAL, border=12) intctrl2 = wx.SpinCtrl(dlg, -1, size=(60 * scale, -1), min=config.valid_ranges["tc_export_repeat_patch_min"][0], max=config.valid_ranges["tc_export_repeat_patch_min"][1], value=str(getcfg("tc_export_repeat_patch_min"))) sizer.Add(intctrl2, 0, flag=wx.RIGHT | wx.ALIGN_CENTER_VERTICAL, border=4) sizer.Add(wx.StaticText(dlg, -1, u"× " + lang.getstr("min")), 0, flag=wx.RIGHT | wx.ALIGN_CENTER_VERTICAL, border=12) dlg.sizer0.SetSizeHints(dlg) dlg.sizer0.Layout() result = dlg.ShowModal() repeatmax = intctrl.GetValue() repeatmin = intctrl2.GetValue() dlg.Destroy() if result != wx.ID_OK: return setcfg("tc_export_repeat_patch_max", repeatmax) setcfg("tc_export_repeat_patch_min", repeatmin) self.writecfg() defaults["size.measureframe"] = get_default_size() self.display_size = wx.DisplaySize() if path: self.worker.start(lambda result: None, self.tc_export, wargs=(path, filter_index), wkwargs={}, progress_msg=lang.getstr("export"), parent=self, progress_start=500, fancy=False) def tc_export(self, path, filter_index): if filter_index < 5: # Image format self.tc_export_subroutine(path, filter_index) else: # CSV with open(path, "wb") as csvfile: self.tc_export_subroutine(csv.writer(csvfile), filter_index) def tc_export_subroutine(self, target, filter_index, allow_gaps=False): maxlen = len(self.ti1[0].DATA) if filter_index < 5: # Image format name, ext = os.path.splitext(target)[0], {0: ".png", 1: ".png", 2: ".tif", 3: ".tif", 4: ".dpx"}[filter_index] format = {".dpx": "DPX", ".png": "PNG", ".tif": "TIFF"}[ext] bitdepth = {0: 8, 1: 16, 2: 8, 3: 16, 4: 10}[filter_index] vscale = (2 ** bitdepth - 1) / 100.0 repeatmax = getcfg("tc_export_repeat_patch_max") repeatmin = getcfg("tc_export_repeat_patch_min") maxcount = maxlen * repeatmax filenameformat = "%%s-%%0%id%%s" % len(str(maxcount)) count = 0 secs = 0 # Scale from screen dimensions to fixed 1080p viewport sw, sh = 1920, 1080 x, y, size = [float(v) for v in getcfg("dimensions.measureframe").split(",")] size *= defaults["size.measureframe"] displays = getcfg("displays") match = None display_no = getcfg("display.number") - 1 if display_no in range(len(displays)): match = re.search("@ -?\d+, -?\d+, (\d+)x(\d+)", displays[display_no]) if match: display_size = [int(item) for item in match.groups()] else: display_size = self.display_size w, h = [min(size / v, 1.0) for v in display_size] x = (display_size[0] - size) * x / display_size[0] y = (display_size[1] - size) * y / display_size[1] x, y, w, h = [max(v, 0) for v in (x, y, w, h)] x, w = [int(round(v * sw)) for v in (x, w)] y, h = [int(round(v * sh)) for v in (y, h)] dimensions = w, h else: # CSV vscale = {5: 1.0, 6: 2.55, 7: 10.23}[filter_index] is_winnt6 = sys.platform == "win32" and sys.getwindowsversion() >= (6, ) use_winnt6_symlinks = is_winnt6 and is_superuser() for i in xrange(maxlen): if self.worker.thread_abort: break self.worker.lastmsg.write("%d%%\n" % (100.0 / maxlen * (i + 1))) R, G, B = (self.ti1[0].DATA[i]["RGB_R"], self.ti1[0].DATA[i]["RGB_G"], self.ti1[0].DATA[i]["RGB_B"]) if not filter_index < 5: # CSV if vscale != 1: R, G, B = [int(round(v * vscale)) for v in [R, G, B]] target.writerow([str(v) for v in [i, R, G, B]]) continue # Image format X, Y, Z = colormath.RGB2XYZ(R / 100.0, G / 100.0, B / 100.0, scale=100.0) L, a, b = colormath.XYZ2Lab(X, Y, Z) # Careful when rounding floats! # Incorrect: int(round(50 * 2.55)) = 127 (127.499999) # Correct: int(round(float(str(50 * 2.55)))) = 128 (127.5) color = (int(round(float(str(R * vscale)))), int(round(float(str(G * vscale)))), int(round(float(str(B * vscale))))) count += 1 filename = filenameformat % (name, count, ext) repeat = int(round(repeatmin + ((repeatmax - repeatmin) / 100.0 * (100 - L)))) imfile.write([[color]], filename, bitdepth, format, dimensions, {"original_width": sw, "original_height": sh, "offset_x": x, "offset_y": y, "frame_position": count, "frame_rate": 1, "held_count": repeat if allow_gaps else 1, "timecode": [int(v) for v in time.strftime("%H:%M:%S:00", time.gmtime(secs)).split(":")]}) secs += 1 ##safe_print("RGB", R, G, B, "L* %.2f" % L, "repeat", repeat) if repeat > 1: if allow_gaps: count += repeat - 1 secs += repeat - 1 continue for j in xrange(repeat - 1): count += 1 filecopyname = filenameformat % (name, count, ext) if format == "DPX": imfile.write([[color]], filecopyname, bitdepth, format, dimensions, {"original_width": sw, "original_height": sh, "offset_x": x, "offset_y": y, "frame_position": count, "frame_rate": 1, "timecode": [int(v) for v in time.strftime("%H:%M:%S:00", time.gmtime(secs)).split(":")]}) secs += 1 if format == "DPX": continue if os.path.isfile(filecopyname): os.unlink(filecopyname) if is_winnt6: if use_winnt6_symlinks: win32file.CreateSymbolicLink(filecopyname, os.path.basename(filename), 0) else: shutil.copyfile(filename, filecopyname) else: os.symlink(os.path.basename(filename), filecopyname) def tc_save_handler(self, event = None): self.tc_save_as_handler(event, path = self.ti1.filename) def tc_save_as_handler(self, event = None, path = None): checkoverwrite = True if path is None or (event and not os.path.isfile(path)): path = None defaultDir = get_verified_path("last_ti1_path")[0] if hasattr(self, "ti1") and self.ti1.filename: if os.path.isfile(self.ti1.filename): defaultDir = os.path.dirname(self.ti1.filename) defaultFile = os.path.basename(self.ti1.filename) else: defaultFile = os.path.basename(config.defaults["last_ti1_path"]) dlg = wx.FileDialog(self, lang.getstr("save_as"), defaultDir = defaultDir, defaultFile = defaultFile, wildcard = lang.getstr("filetype.ti1") + "|*.ti1", style = wx.SAVE | wx.OVERWRITE_PROMPT) dlg.Center(wx.BOTH) if dlg.ShowModal() == wx.ID_OK: path = dlg.GetPath() dlg.Destroy() if path: filename, ext = os.path.splitext(path) if ext.lower() != ".ti1": path += ".ti1" else: checkoverwrite = False if path: if not waccess(path, os.W_OK): show_result_dialog(Error(lang.getstr("error.access_denied.write", path)), self) return if checkoverwrite and os.path.isfile(path): dlg = ConfirmDialog(self, msg=lang.getstr("dialog.confirm_overwrite", (path)), ok=lang.getstr("overwrite"), cancel=lang.getstr("cancel"), bitmap=geticon(32, "dialog-warning")) result = dlg.ShowModal() dlg.Destroy() if result != wx.ID_OK: return setcfg("last_ti1_path", path) try: file_ = open(path, "w") file_.write(str(self.ti1)) file_.close() self.ti1.filename = path self.ti1.root.setmodified(False) if not self.IsBeingDeleted(): # UGLY HACK: This 'safe_print' call fixes a GTK assertion and # segfault under Arch Linux when setting the window title safe_print("") self.SetTitle(lang.getstr("testchart.edit").rstrip(".") + ": " + os.path.basename(path)) except Exception, exception: handle_error(Error(u"Error - testchart could not be saved: " + safe_unicode(exception)), parent=self) else: if self.Parent: if path != getcfg(self.cfg) and self.parent_set_chart_methodname: dlg = ConfirmDialog(self, msg = lang.getstr("testchart.confirm_select"), ok = lang.getstr("testchart.select"), cancel = lang.getstr("testchart.dont_select"), bitmap = geticon(32, "dialog-question")) result = dlg.ShowModal() dlg.Destroy() if result == wx.ID_OK: setcfg(self.cfg, path) self.writecfg() if path == getcfg(self.cfg) and self.parent_set_chart_methodname: getattr(self.Parent, self.parent_set_chart_methodname)(path) if not self.IsBeingDeleted(): self.save_btn.Disable() return True return False def tc_view_3d(self, event): if (self.ti1.filename and not (self.worker.tempdir and self.ti1.filename.startswith(self.worker.tempdir)) and waccess(os.path.dirname(self.ti1.filename), os.W_OK)): regenerate = self.ti1.modified paths = self.tc_save_3d(os.path.splitext(self.ti1.filename)[0], regenerate=regenerate) if (not regenerate and os.path.isfile(self.ti1.filename)): # Check if the testchart is newer than the 3D file(s) ti1_mtime = os.stat(self.ti1.filename).st_mtime for path in paths: if os.stat(path).st_mtime < ti1_mtime: regenerate = True break if regenerate: paths = self.tc_save_3d(os.path.splitext(self.ti1.filename)[0], regenerate=True) else: paths = self.tc_save_3d_as_handler(None) for path in paths: launch_file(path) def tc_save_3d_as_handler(self, event): path = None paths = [] if (hasattr(self, "ti1") and self.ti1.filename and os.path.isfile(self.ti1.filename)): defaultDir = os.path.dirname(self.ti1.filename) defaultFile = self.ti1.filename else: defaultDir = get_verified_path("last_vrml_path")[0] defaultFile = defaults["last_vrml_path"] view_3d_format = getcfg("3d.format") if view_3d_format == "HTML": formatext = ".html" elif view_3d_format == "VRML": if getcfg("vrml.compress"): formatext = ".wrz" else: formatext = ".wrl" else: formatext = ".x3d" defaultFile = os.path.splitext(os.path.basename(defaultFile))[0] + formatext dlg = wx.FileDialog(self, lang.getstr("save_as"), defaultDir=defaultDir, defaultFile=defaultFile, wildcard=lang.getstr("view.3d") + "|*" + formatext, style=wx.SAVE | wx.OVERWRITE_PROMPT) dlg.Center(wx.BOTH) if dlg.ShowModal() == wx.ID_OK: path = dlg.GetPath() dlg.Destroy() if path: if not waccess(path, os.W_OK): show_result_dialog(Error(lang.getstr("error.access_denied.write", path)), self) return [] filename, ext = os.path.splitext(path) if ext.lower() != formatext: path += formatext setcfg("last_vrml_path", path) paths = self.tc_save_3d(filename) return paths def tc_save_3d(self, filename, regenerate=True): paths = [] view_3d_format = getcfg("3d.format") if view_3d_format == "VRML": if getcfg("vrml.compress"): formatext = ".wrz" else: formatext = ".wrl" else: formatext = ".x3d" if view_3d_format == "HTML": formatext += ".html" if getcfg("tc_vrml_device") or getcfg("tc_vrml_cie"): colorspaces = [] if getcfg("tc_vrml_device"): colorspaces.append(getcfg("tc_vrml_device_colorspace")) if getcfg("tc_vrml_cie"): colorspaces.append(getcfg("tc_vrml_cie_colorspace")) for colorspace in colorspaces: path = filename + " " + colorspace + formatext if os.path.exists(path): if regenerate: dlg = ConfirmDialog(self, msg=lang.getstr("dialog.confirm_overwrite", (path)), ok=lang.getstr("overwrite"), cancel=lang.getstr("cancel"), bitmap=geticon(32, "dialog-warning")) result = dlg.ShowModal() dlg.Destroy() else: result = wx.ID_CANCEL if result != wx.ID_OK: paths.append(path) continue try: self.ti1[0].export_3d(path, colorspace, RGB_black_offset=getcfg("tc_vrml_black_offset"), normalize_RGB_white=getcfg("tc_vrml_use_D50"), compress=formatext == ".wrz", format=view_3d_format) except Exception, exception: handle_error(UserWarning(u"Warning - 3D file could not be " "saved: " + safe_unicode(exception)), parent=self) else: paths.append(path) return paths def tc_check_save_ti1(self, clear = True): if hasattr(self, "ti1"): if (self.ti1.root.modified or not self.ti1.filename or not os.path.exists(self.ti1.filename)): if self.save_btn.Enabled: ok = lang.getstr("save") else: ok = lang.getstr("save_as") dlg = ConfirmDialog(self, msg = lang.getstr("testchart.save_or_discard"), ok = ok, cancel = lang.getstr("cancel"), bitmap = geticon(32, "dialog-warning")) if self.IsBeingDeleted(): dlg.buttonpanel.Hide(0) if self.save_btn.Enabled: dlg.save_as = wx.Button(dlg.buttonpanel, -1, lang.getstr("save_as")) ID_SAVE_AS = dlg.save_as.GetId() dlg.Bind(wx.EVT_BUTTON, dlg.OnClose, id = ID_SAVE_AS) dlg.sizer2.Add((12, 12)) dlg.sizer2.Add(dlg.save_as) else: ID_SAVE_AS = wx.ID_OK dlg.discard = wx.Button(dlg.buttonpanel, -1, lang.getstr("testchart.discard")) ID_DISCARD = dlg.discard.GetId() dlg.Bind(wx.EVT_BUTTON, dlg.OnClose, id = ID_DISCARD) dlg.sizer2.Add((12, 12)) dlg.sizer2.Add(dlg.discard) dlg.buttonpanel.Layout() dlg.sizer0.SetSizeHints(dlg) dlg.sizer0.Layout() result = dlg.ShowModal() dlg.Destroy() if result in (wx.ID_OK, ID_SAVE_AS): if result == ID_SAVE_AS: path = None else: path = self.ti1.filename if not self.tc_save_as_handler(True, path): return False elif result == wx.ID_CANCEL: return False clear = True if clear and not self.IsBeingDeleted(): self.tc_clear() return True def tc_close_handler(self, event = None): if (getattr(self.worker, "thread", None) and self.worker.thread.isAlive()): self.worker.abort_subprocess(True) return if (not event or self.IsShownOnScreen()) and self.tc_check_save_ti1(False): setcfg("tc.saturation_sweeps", self.saturation_sweeps_intctrl.GetValue()) for component in ("R", "G", "B"): setcfg("tc.saturation_sweeps.custom.%s" % component, getattr(self, "saturation_sweeps_custom_%s_ctrl" % component).GetValue()) self.worker.wrapup(False) self.Hide() if self.Parent: setcfg("tc.show", 0) return True else: self.writecfg() self.Destroy() def tc_move_handler(self, event = None): if self.IsShownOnScreen() and not self.IsMaximized() and not self.IsIconized(): x, y = self.GetScreenPosition() setcfg("position.tcgen.x", x) setcfg("position.tcgen.y", y) if event: event.Skip() def tc_destroy_handler(self, event): event.Skip() def tc_load_cfg_from_ti1(self, event = None, path = None, cfg=None, parent_set_chart_methodname=None, resume=False): if self.worker.is_working(): return if cfg: self.cfg = cfg if path is None: path = getcfg(self.cfg) if path == "auto": return if parent_set_chart_methodname: self.parent_set_chart_methodname = parent_set_chart_methodname if not self.tc_check_save_ti1(): return safe_print(lang.getstr("testchart.read")) self.worker.interactive = False self.worker.start(self.tc_load_cfg_from_ti1_finish, self.tc_load_cfg_from_ti1_worker, wargs=(path, ), wkwargs={}, progress_title=lang.getstr("testchart.read"), progress_msg=lang.getstr("testchart.read"), parent=self, progress_start=500, cancelable=False, resume=resume, show_remaining_time=False, fancy=False) def tc_load_cfg_from_ti1_worker(self, path): path = safe_unicode(path) try: filename, ext = os.path.splitext(path) if ext.lower() not in (".icc", ".icm"): if ext.lower() == ".ti3": ti1 = CGATS.CGATS(ti3_to_ti1(open(path, "rU"))) ti1.filename = filename + ".ti1" else: ti1 = CGATS.CGATS(path) ti1.filename = path else: # icc or icm profile profile = ICCP.ICCProfile(path) ti1 = CGATS.CGATS(ti3_to_ti1(profile.tags.get("CIED", "") or profile.tags.get("targ", ""))) ti1.filename = filename + ".ti1" ti1.fix_device_values_scaling() try: ti1_1 = verify_cgats(ti1, ("RGB_R", "RGB_B", "RGB_G")) except CGATS.CGATSError, exception: msg = {CGATS.CGATSKeyError: lang.getstr("error.testchart.missing_fields", (path, "RGB_R, RGB_G, RGB_B"))}.get(exception.__class__, lang.getstr("error.testchart.invalid", path) + "\n" + lang.getstr(safe_str(exception))) return Error(msg) else: try: verify_cgats(ti1, ("XYZ_X", "XYZ_Y", "XYZ_Z")) except CGATS.CGATSKeyError: # Missing XYZ, add via simple sRGB-like model data = ti1_1.queryv1("DATA") data.parent.DATA_FORMAT.add_data(("XYZ_X", "XYZ_Y", "XYZ_Z")) for sample in data.itervalues(): XYZ = argyll_RGB2XYZ(*[sample["RGB_" + channel] / 100.0 for channel in "RGB"]) for i, component in enumerate("XYZ"): sample["XYZ_" + component] = XYZ[i] * 100 else: if ext.lower() not in (".ti1", ".ti2") and ti1_1: ti1_1.add_keyword("ACCURATE_EXPECTED_VALUES", "true") ti1.root.setmodified(False) self.ti1 = ti1 except Exception, exception: return Error(lang.getstr("error.testchart.read", path) + "\n\n" + safe_unicode(exception)) white_patches = self.ti1.queryv1("WHITE_COLOR_PATCHES") or None black_patches = self.ti1.queryv1("BLACK_COLOR_PATCHES") or None single_channel_patches = self.ti1.queryv1("SINGLE_DIM_STEPS") or None gray_patches = self.ti1.queryv1("COMP_GREY_STEPS") or None multi_bcc_steps = self.ti1.queryv1("MULTI_DIM_BCC_STEPS") or 0 multi_steps = self.ti1.queryv1("MULTI_DIM_STEPS") or multi_bcc_steps fullspread_patches = self.ti1.queryv1("NUMBER_OF_SETS") gamma = self.ti1.queryv1("EXTRA_DEV_POW") or 1.0 dark_emphasis = ((self.ti1.queryv1("DARK_REGION_EMPHASIS") or 1.0) - 1.0) / 3.0 if None in (white_patches, single_channel_patches, gray_patches, multi_steps): if None in (single_channel_patches, gray_patches, multi_steps): white_patches = 0 black_patches = 0 R = [] G = [] B = [] gray_channel = [0] data = self.ti1.queryv1("DATA") multi = { "R": [], "G": [], "B": [] } if multi_steps is None: multi_steps = 0 uniqueRGB = [] vmaxlen = 4 for i in data: if self.worker.thread_abort: return False patch = [round(float(str(v * 2.55)), vmaxlen) for v in (data[i]["RGB_R"], data[i]["RGB_G"], data[i]["RGB_B"])] # normalize to 0...255 range strpatch = [str(int(round(round(v, 1)))) for v in patch] if patch[0] == patch[1] == patch[2] == 255: # white white_patches += 1 if 255 not in gray_channel: gray_channel.append(255) elif patch[0] == patch[1] == patch[2] == 0: # black black_patches += 1 if 0 not in R and 0 not in G and 0 not in B: R.append(0) G.append(0) B.append(0) if 0 not in gray_channel: gray_channel.append(0) elif patch[2] == patch[1] == 0 and patch[0] not in R: # red R.append(patch[0]) elif patch[0] == patch[2] == 0 and patch[1] not in G: # green G.append(patch[1]) elif patch[0] == patch[1] == 0 and patch[2] not in B: # blue B.append(patch[2]) elif patch[0] == patch[1] == patch[2]: # gray if patch[0] not in gray_channel: gray_channel.append(patch[0]) elif multi_steps == 0: multi_steps = None if debug >= 9: safe_print("[D]", strpatch) if strpatch not in uniqueRGB: uniqueRGB.append(strpatch) if patch[0] not in multi["R"]: multi["R"].append(patch[0]) if patch[1] not in multi["G"]: multi["G"].append(patch[1]) if patch[2] not in multi["B"]: multi["B"].append(patch[2]) if single_channel_patches is None: single_channel_patches = min(len(R), len(G), len(B)) if gray_patches is None: gray_patches = len(gray_channel) if multi_steps is None: multi_steps = 0 if single_channel_patches is None: # NEVER (old code, needs work for demphasis/gamma, remove?) R_inc = self.tc_get_increments(R, vmaxlen) G_inc = self.tc_get_increments(G, vmaxlen) B_inc = self.tc_get_increments(B, vmaxlen) if debug: safe_print("[D] R_inc:") for i in R_inc: if self.worker.thread_abort: return False safe_print("[D] %s: x%s" % (i, R_inc[i])) safe_print("[D] G_inc:") for i in G_inc: if self.worker.thread_abort: return False safe_print("[D] %s: x%s" % (i, G_inc[i])) safe_print("[D] B_inc:") for i in B_inc: if self.worker.thread_abort: return False safe_print("[D] %s: x%s" % (i, B_inc[i])) RGB_inc = {"0": 0} for inc in R_inc: if self.worker.thread_abort: return False if inc in G_inc and inc in B_inc and R_inc[inc] == G_inc[inc] == B_inc[inc]: RGB_inc[inc] = R_inc[inc] for inc in G_inc: if self.worker.thread_abort: return False if inc in R_inc and inc in B_inc and R_inc[inc] == G_inc[inc] == B_inc[inc]: RGB_inc[inc] = G_inc[inc] for inc in B_inc: if self.worker.thread_abort: return False if inc in R_inc and inc in G_inc and R_inc[inc] == G_inc[inc] == B_inc[inc]: RGB_inc[inc] = B_inc[inc] if False: RGB_inc_max = max(RGB_inc.values()) if RGB_inc_max > 0: single_channel_patches = RGB_inc_max + 1 else: single_channel_patches = 0 else: single_inc = {"0": 0} for inc in RGB_inc: if self.worker.thread_abort: return False if inc != "0": finc = float(inc) n = int(round(float(str(255.0 / finc)))) finc = 255.0 / n n += 1 if debug >= 9: safe_print("[D] inc:", inc) safe_print("[D] n:", n) for i in range(n): if self.worker.thread_abort: return False v = str(int(round(float(str(i * finc))))) if debug >= 9: safe_print("[D] Searching for", v) if [v, "0", "0"] in uniqueRGB and ["0", v, "0"] in uniqueRGB and ["0", "0", v] in uniqueRGB: if not inc in single_inc: single_inc[inc] = 0 single_inc[inc] += 1 else: if debug >= 9: safe_print("[D] Not found!") break single_channel_patches = max(single_inc.values()) if debug: safe_print("[D] single_channel_patches:", single_channel_patches) if 0 in R + G + B: fullspread_patches += 3 # black in single channel patches elif single_channel_patches >= 2: fullspread_patches += 3 # black always in SINGLE_DIM_STEPS if gray_patches is None: # NEVER (old code, needs work for demphasis/gamma, remove?) RGB_inc = self.tc_get_increments(gray_channel, vmaxlen) if debug: safe_print("[D] RGB_inc:") for i in RGB_inc: if self.worker.thread_abort: return False safe_print("[D] %s: x%s" % (i, RGB_inc[i])) if False: RGB_inc_max = max(RGB_inc.values()) if RGB_inc_max > 0: gray_patches = RGB_inc_max + 1 else: gray_patches = 0 else: gray_inc = {"0": 0} for inc in RGB_inc: if self.worker.thread_abort: return False if inc != "0": finc = float(inc) n = int(round(float(str(255.0 / finc)))) finc = 255.0 / n n += 1 if debug >= 9: safe_print("[D] inc:", inc) safe_print("[D] n:", n) for i in range(n): if self.worker.thread_abort: return False v = str(int(round(float(str(i * finc))))) if debug >= 9: safe_print("[D] Searching for", v) if [v, v, v] in uniqueRGB: if not inc in gray_inc: gray_inc[inc] = 0 gray_inc[inc] += 1 else: if debug >= 9: safe_print("[D] Not found!") break gray_patches = max(gray_inc.values()) if debug: safe_print("[D] gray_patches:", gray_patches) if 0 in gray_channel: fullspread_patches += 1 # black in gray patches if 255 in gray_channel: fullspread_patches += 1 # white in gray patches elif gray_patches >= 2: fullspread_patches += 2 # black and white always in COMP_GREY_STEPS if multi_steps is None: # NEVER (old code, needs work for demphasis/gamma, remove?) R_inc = self.tc_get_increments(multi["R"], vmaxlen) G_inc = self.tc_get_increments(multi["G"], vmaxlen) B_inc = self.tc_get_increments(multi["B"], vmaxlen) RGB_inc = {"0": 0} for inc in R_inc: if self.worker.thread_abort: return False if inc in G_inc and inc in B_inc and R_inc[inc] == G_inc[inc] == B_inc[inc]: RGB_inc[inc] = R_inc[inc] for inc in G_inc: if self.worker.thread_abort: return False if inc in R_inc and inc in B_inc and R_inc[inc] == G_inc[inc] == B_inc[inc]: RGB_inc[inc] = G_inc[inc] for inc in B_inc: if self.worker.thread_abort: return False if inc in R_inc and inc in G_inc and R_inc[inc] == G_inc[inc] == B_inc[inc]: RGB_inc[inc] = B_inc[inc] if debug: safe_print("[D] RGB_inc:") for i in RGB_inc: if self.worker.thread_abort: return False safe_print("[D] %s: x%s" % (i, RGB_inc[i])) multi_inc = {"0": 0} for inc in RGB_inc: if self.worker.thread_abort: return False if inc != "0": finc = float(inc) n = int(round(float(str(255.0 / finc)))) finc = 255.0 / n n += 1 if debug >= 9: safe_print("[D] inc:", inc) safe_print("[D] n:", n) for i in range(n): if self.worker.thread_abort: return False r = str(int(round(float(str(i * finc))))) for j in range(n): if self.worker.thread_abort: return False g = str(int(round(float(str(j * finc))))) for k in range(n): if self.worker.thread_abort: return False b = str(int(round(float(str(k * finc))))) if debug >= 9: safe_print("[D] Searching for", i, j, k, [r, g, b]) if [r, g, b] in uniqueRGB: if not inc in multi_inc: multi_inc[inc] = 0 multi_inc[inc] += 1 else: if debug >= 9: safe_print("[D] Not found! (b loop)") break if [r, g, b] not in uniqueRGB: if debug >= 9: safe_print("[D] Not found! (g loop)") break if [r, g, b] not in uniqueRGB: if debug >= 9: safe_print("[D] Not found! (r loop)") break multi_patches = max(multi_inc.values()) multi_steps = int(float(str(math.pow(multi_patches, 1 / 3.0)))) if debug: safe_print("[D] multi_patches:", multi_patches) safe_print("[D] multi_steps:", multi_steps) elif multi_steps >= 2: fullspread_patches += 2 # black and white always in MULTI_DIM_STEPS else: white_patches = len(self.ti1[0].queryi({"RGB_R": 100, "RGB_G": 100, "RGB_B": 100})) black_patches = len(self.ti1[0].queryi({"RGB_R": 0, "RGB_G": 0, "RGB_B": 0})) if single_channel_patches >= 2: fullspread_patches += 3 # black always in SINGLE_DIM_STEPS if gray_patches >= 2: fullspread_patches += 2 # black and white always in COMP_GREY_STEPS if multi_steps >= 2: fullspread_patches += 2 # black and white always in MULTI_DIM_STEPS fullspread_patches -= white_patches if self.worker.argyll_version >= [1, 6]: fullspread_patches -= black_patches fullspread_patches -= single_channel_patches * 3 fullspread_patches -= gray_patches fullspread_patches -= int(float(str(math.pow(multi_steps, 3)))) - single_channel_patches * 3 return (white_patches, black_patches, single_channel_patches, gray_patches, multi_steps, multi_bcc_steps, fullspread_patches, gamma, dark_emphasis) def tc_load_cfg_from_ti1_finish(self, result): self.worker.wrapup(False) if isinstance(result, tuple): # UGLY HACK: This 'safe_print' call fixes a GTK assertion and # segfault under Arch Linux when setting the window title safe_print("") self.SetTitle(lang.getstr("testchart.edit").rstrip(".") + ": " + os.path.basename(self.ti1.filename)) safe_print(lang.getstr("success")) (white_patches, black_patches, single_channel_patches, gray_patches, multi_steps, multi_bcc_steps, fullspread_patches, gamma, dark_emphasis) = result fullspread_ba = { "ERROR_OPTIMISED_PATCHES": "", # OFPS in older Argyll CMS versions #"ERROR_OPTIMISED_PATCHES": "R", # Perc. space random - same keyword as OFPS in older Argyll CMS versions, don't use "IFP_PATCHES": "t", # Inc. far point "INC_FAR_PATCHES": "t", # Inc. far point in older Argyll CMS versions "OFPS_PATCHES": "", # OFPS "RANDOM_DEVICE_PATCHES": "r", # Dev. space random "RANDOM_PATCHES": "r", # Dev. space random in older Argyll CMS versions "RANDOM_PERCEPTUAL_PATCHES": "R", # Perc. space random #"RANDOM_PERCEPTUAL_PATCHES": "Q", # Perc. space filling quasi-random - same keyword as perc. space random, don't use "SIMPLEX_DEVICE_PATCHES": "i", # Dev. space body centered cubic grid "SIMPLEX_PERCEPTUAL_PATCHES": "I", # Perc. space body centered cubic grid "SPACEFILING_RANDOM_PATCHES": "q", # Device space filling quasi-random, typo in older Argyll CMS versions "SPACEFILLING_RANDOM_PATCHES": "q", # Device space filling quasi-random } algo = None for key in fullspread_ba.keys(): if self.ti1.queryv1(key) > 0: algo = fullspread_ba[key] break if white_patches != None: setcfg("tc_white_patches", white_patches) if black_patches != None: setcfg("tc_black_patches", black_patches) if single_channel_patches != None: setcfg("tc_single_channel_patches", single_channel_patches) if gray_patches != None: setcfg("tc_gray_patches", gray_patches) if multi_steps != None: setcfg("tc_multi_steps", multi_steps) if multi_bcc_steps != None: setcfg("tc_multi_bcc_steps", multi_bcc_steps) setcfg("tc_fullspread_patches", self.ti1.queryv1("NUMBER_OF_SETS") - self.tc_get_total_patches(white_patches, black_patches, single_channel_patches, gray_patches, multi_steps, multi_bcc_steps, 0)) if gamma != None: setcfg("tc_gamma", gamma) if dark_emphasis != None: setcfg("tc_dark_emphasis", dark_emphasis) if algo != None: setcfg("tc_algo", algo) self.writecfg() self.tc_update_controls() self.tc_preview(True) return True else: safe_print(lang.getstr("aborted")) if self.Parent and hasattr(self.Parent, "start_timers"): self.Parent.start_timers() if isinstance(result, Exception): show_result_dialog(result, self) def tc_get_increments(self, channel, vmaxlen = 4): channel.sort() increments = {"0": 0} for i, v in enumerate(channel): for j in reversed(xrange(i, len(channel))): inc = round(float(str(channel[j] - v)), vmaxlen) if inc > 0: inc = str(inc) if not inc in increments: increments[inc] = 0 increments[inc] += 1 return increments def tc_create(self, gray=False, multidim=False, single=False): """ Create testchart using targen. Setting gray, multidim or single to True will ad those patches in a separate step if any number of iterative patches are to be generated as well. """ self.writecfg() fullspread_patches = getcfg("tc_fullspread_patches") white_patches = getcfg("tc_white_patches") black_patches = getcfg("tc_black_patches") single_patches = getcfg("tc_single_channel_patches") gray_patches = getcfg("tc_gray_patches") multidim_patches = getcfg("tc_multi_steps") multidim_bcc_patches = getcfg("tc_multi_bcc_steps") extra_args = getcfg("extra_args.targen") result = True fixed_ti1 = None if fullspread_patches > 0 and (gray or multidim or single): # Generate fixed points first so they don't punch "holes" into the # OFPS distribution setcfg("tc_white_patches", 0) setcfg("tc_black_patches", 0) if not single: setcfg("tc_single_channel_patches", 0) if not gray: setcfg("tc_gray_patches", 0) if not multidim: setcfg("tc_multi_steps", 0) setcfg("tc_multi_bcc_steps", 0) setcfg("tc_fullspread_patches", 0) setcfg("extra_args.targen", "") result = self.tc_create_ti1() if fullspread_patches > 0 and (gray or multidim or single): setcfg("tc_white_patches", white_patches) setcfg("tc_black_patches", black_patches) if single: setcfg("tc_single_channel_patches", 2) else: setcfg("tc_single_channel_patches", single_patches) if gray: setcfg("tc_gray_patches", 2) else: setcfg("tc_gray_patches", gray_patches) if multidim: setcfg("tc_multi_steps", 2) setcfg("tc_multi_bcc_steps", 0) else: setcfg("tc_multi_steps", multidim_patches) setcfg("tc_multi_bcc_steps", multidim_bcc_patches) setcfg("tc_fullspread_patches", fullspread_patches) setcfg("extra_args.targen", extra_args) fixed_ti1 = result if not isinstance(result, Exception) and result: result = self.tc_create_ti1() if isinstance(result, CGATS.CGATS): if fixed_ti1: if gray: result[0].add_keyword("COMP_GREY_STEPS", gray_patches) if multidim: result[0].add_keyword("MULTI_DIM_STEPS", multidim_patches) if multidim_bcc_patches: result[0].add_keyword("MULTI_DIM_BCC_STEPS", multidim_bcc_patches) if single: result[0].add_keyword("SINGLE_DIM_STEPS", single_patches) fixed_data = fixed_ti1.queryv1("DATA") data = result.queryv1("DATA") data_format = result.queryv1("DATA_FORMAT") # Get only RGB data data.parent.DATA_FORMAT = CGATS.CGATS() data.parent.DATA_FORMAT.key = "DATA_FORMAT" data.parent.DATA_FORMAT.parent = data data.parent.DATA_FORMAT.root = data.root data.parent.DATA_FORMAT.type = "DATA_FORMAT" for i, label in enumerate(("RGB_R", "RGB_G", "RGB_B")): data.parent.DATA_FORMAT[i] = label fixed_data.parent.DATA_FORMAT = data.parent.DATA_FORMAT rgbdata = str(data) # Restore DATA_FORMAT data.parent.DATA_FORMAT = data_format # Collect all fixed point datasets not in data fixed_data.vmaxlen = data.vmaxlen fixed_datasets = [] for i, dataset in fixed_data.iteritems(): if not str(dataset) in rgbdata: fixed_datasets.append(dataset) if fixed_datasets: # Insert fixed point datasets after first patch data.moveby1(1, len(fixed_datasets)) for i, dataset in enumerate(fixed_datasets): dataset.key = i + 1 dataset.parent = data dataset.root = data.root data[dataset.key] = dataset self.ti1 = result setcfg("tc_single_channel_patches", single_patches) setcfg("tc_gray_patches", gray_patches) setcfg("tc_multi_steps", multidim_patches) setcfg("tc_multi_bcc_steps", multidim_bcc_patches) return result def tc_create_ti1(self): cmd, args = self.worker.prepare_targen() if not isinstance(cmd, Exception): result = self.worker.exec_cmd(cmd, args, low_contrast = False, skip_scripts = True, silent = False, parent = self) else: result = cmd if not isinstance(result, Exception) and result: if not isinstance(result, Exception): path = os.path.join(self.worker.tempdir, "temp.ti1") result = check_file_isfile(path, silent = False) if not isinstance(result, Exception) and result: try: result = CGATS.CGATS(path) safe_print(lang.getstr("success")) except Exception, exception: result = Error(u"Error - testchart file could not be read: " + safe_unicode(exception)) else: result.filename = None self.worker.wrapup(False) return result def tc_preview(self, result, path=None): self.tc_check() if isinstance(result, Exception): show_result_dialog(result, self) elif result: if not hasattr(self, "separator"): # We add this here because of a wxGTK 2.8 quirk where the # vertical scrollbar otherwise has a 1px horizontal # line at the top otherwise. separator_color = wx.SystemSettings.GetColour(wx.SYS_COLOUR_3DSHADOW) self.separator = wx.Panel(self.panel, size=(-1, 1)) self.separator.BackgroundColour = separator_color index = len(self.sizer.Children) - 1 if (sys.platform not in ("darwin", "win32") or tc_use_alternate_preview): index -= 1 self.sizer.Insert(index, self.separator, flag=wx.EXPAND) else: self.separator.Show() self.sizer.Layout() if verbose >= 1: safe_print(lang.getstr("tc.preview.create")) data = self.ti1.queryv1("DATA") modified = self.ti1.modified data.vmaxlen = 6 self.ti1.modified = modified if hasattr(self, "preview"): self.preview.BeginBatch() w = self.grid.GetDefaultRowSize() numcols = (self.sizer.Size[0] - wx.SystemSettings_GetMetric(wx.SYS_VSCROLL_X)) / w self.preview.AppendCols(numcols) for i in xrange(numcols): self.preview.SetColLabelValue(i, str(i + 1)) grid = self.grid grid.BeginBatch() data_format = self.ti1.queryv1("DATA_FORMAT") for i in data_format: if data_format[i] in ("RGB_R", "RGB_G", "RGB_B"): grid.AppendCols(1) grid.SetColLabelValue(grid.GetNumberCols() - 1, data_format[i].split("_")[-1] + " %") grid.AppendCols(1) grid.SetColLabelValue(grid.GetNumberCols() - 1, "") grid.SetColSize(grid.GetNumberCols() - 1, self.grid.GetDefaultRowSize()) self.tc_amount = self.ti1.queryv1("NUMBER_OF_SETS") grid.AppendRows(self.tc_amount) dc = wx.MemoryDC(wx.EmptyBitmap(1, 1)) dc.SetFont(grid.GetLabelFont()) w, h = dc.GetTextExtent("99%s" % self.ti1.queryv1("NUMBER_OF_SETS")) grid.SetRowLabelSize(max(w, grid.GetDefaultRowSize())) attr = wx.grid.GridCellAttr() attr.SetAlignment(wx.ALIGN_CENTER, wx.ALIGN_CENTER) attr.SetReadOnly() grid.SetColAttr(grid.GetNumberCols() - 1, attr) for i in data: sample = data[i] for j in range(grid.GetNumberCols()): label = self.label_b2a.get(grid.GetColLabelValue(j)) if label in ("RGB_R", "RGB_G", "RGB_B"): grid.SetCellValue(i, j, CGATS.rpad(sample[label], data.vmaxlen + (1 if sample[label] < 0 else 0))) self.tc_grid_setcolorlabel(i, data) self.tc_preview_update(0) if hasattr(self, "preview"): w, h = dc.GetTextExtent("99%s" % self.preview.GetNumberRows()) self.preview.SetRowLabelSize(max(w, grid.GetDefaultRowSize())) self.preview.EndBatch() self.tc_set_default_status() if verbose >= 1: safe_print(lang.getstr("success")) self.resize_grid() grid.EndBatch() if path: wx.CallAfter(self.tc_save_as_handler, path=path) if self.Parent and hasattr(self.Parent, "start_timers"): self.Parent.start_timers() def tc_add_data(self, row, newdata): self.grid.BeginBatch() self.grid.InsertRows(row + 1, len(newdata)) data = self.ti1.queryv1("DATA") if hasattr(self, "preview"): self.preview.BeginBatch() data_format = self.ti1.queryv1("DATA_FORMAT") data.moveby1(row + 1, len(newdata)) for i in xrange(len(newdata)): dataset = CGATS.CGATS() for label in data_format.itervalues(): if not label in newdata[i]: newdata[i][label] = 0.0 dataset[label] = newdata[i][label] dataset.key = row + 1 + i dataset.parent = data dataset.root = data.root dataset.type = 'SAMPLE' data[dataset.key] = dataset for label in ("RGB_R", "RGB_G", "RGB_B"): for col in range(self.grid.GetNumberCols()): if self.label_b2a.get(self.grid.GetColLabelValue(col)) == label: sample = newdata[i] self.grid.SetCellValue(row + 1 + i, col, CGATS.rpad(sample[label], data.vmaxlen + (1 if sample[label] < 0 else 0))) self.tc_grid_setcolorlabel(row + 1 + i, data) self.tc_preview_update(row + 1) self.grid.EndBatch() self.tc_amount = self.ti1.queryv1("NUMBER_OF_SETS") self.tc_set_default_status() self.tc_save_check() if hasattr(self, "preview"): self.preview.EndBatch() def tc_grid_setcolorlabel(self, row, data=None): grid = self.grid col = grid.GetNumberCols() - 1 if data is None: data = self.ti1.queryv1("DATA") sample = data[row] style, colour, labeltext, labelcolour = self.tc_getcolorlabel(sample) grid.SetCellBackgroundColour(row, col, colour) grid.SetCellValue(row, col, labeltext) if labelcolour: grid.SetCellTextColour(row, col, labelcolour) self.grid.Refresh() if hasattr(self, "preview"): style, colour, labeltext, labelcolour = self.tc_getcolorlabel(sample) numcols = self.preview.GetNumberCols() row = sample.key / numcols col = sample.key % numcols if row > self.preview.GetNumberRows() - 1: self.preview.AppendRows(1) self.preview.SetCellBackgroundColour(row, col, colour) self.preview.SetCellValue(row, col, labeltext) if labelcolour: self.preview.SetCellTextColour(row, col, labelcolour) self.preview.Refresh() def tc_getcolorlabel(self, sample): scale = 2.55 colour = wx.Colour(*[int(round(value * scale)) for value in (sample.RGB_R, sample.RGB_G, sample.RGB_B)]) # mark patches: # W = white (R/G/B == 100) # K = black (R/G/B == 0) # k = light black (R == G == B > 0) # R = red # r = light red (R == 100 and G/B > 0) # G = green # g = light green (G == 100 and R/B > 0) # B = blue # b = light blue (B == 100 and R/G > 0) # C = cyan # c = light cyan (G/B == 100 and R > 0) # M = magenta # m = light magenta (R/B == 100 and G > 0) # Y = yellow # y = light yellow (R/G == 100 and B > 0) # border = 50% value style = wx.NO_BORDER if sample.RGB_R == sample.RGB_G == sample.RGB_B: # Neutral / black / white if sample.RGB_R < 50: labelcolour = wx.Colour(255, 255, 255) else: if sample.RGB_R == 50: style = wx.SIMPLE_BORDER labelcolour = wx.Colour(0, 0, 0) if sample.RGB_R <= 50: labeltext = "K" elif sample.RGB_R == 100: labeltext = "W" else: labeltext = "k" elif (sample.RGB_G == 0 and sample.RGB_B == 0) or (sample.RGB_R == 100 and sample.RGB_G == sample.RGB_B): # Red if sample.RGB_R > 75: labelcolour = wx.Colour(0, 0, 0) else: labelcolour = wx.Colour(255, 255, 255) if sample.RGB_R == 50: style = wx.SIMPLE_BORDER if sample.RGB_R == 100 and sample.RGB_G > 0: labeltext = "r" else: labeltext = "R" elif (sample.RGB_R == 0 and sample.RGB_B == 0) or (sample.RGB_G == 100 and sample.RGB_R == sample.RGB_B): # Green if sample.RGB_G > 75: labelcolour = wx.Colour(0, 0, 0) else: labelcolour = wx.Colour(255, 255, 255) if sample.RGB_G == 50: style = wx.SIMPLE_BORDER if sample.RGB_G == 100 and sample.RGB_R > 0: labeltext = "g" else: labeltext = "G" elif (sample.RGB_R == 0 and sample.RGB_G == 0) or (sample.RGB_B == 100 and sample.RGB_R == sample.RGB_G): # Blue if sample.RGB_R > 25: labelcolour = wx.Colour(0, 0, 0) else: labelcolour = wx.Colour(255, 255, 255) if sample.RGB_B == 50: style = wx.SIMPLE_BORDER if sample.RGB_B == 100 and sample.RGB_R > 0: labeltext = "b" else: labeltext = "B" elif (sample.RGB_R == 0 or sample.RGB_B == 100) and sample.RGB_G == sample.RGB_B: # Cyan if sample.RGB_G > 75: labelcolour = wx.Colour(0, 0, 0) else: labelcolour = wx.Colour(255, 255, 255) if sample.RGB_G == 50: style = wx.SIMPLE_BORDER if sample.RGB_G == 100 and sample.RGB_R > 0: labeltext = "c" else: labeltext = "C" elif (sample.RGB_G == 0 or sample.RGB_R == 100) and sample.RGB_R == sample.RGB_B: # Magenta if sample.RGB_R > 75: labelcolour = wx.Colour(0, 0, 0) else: labelcolour = wx.Colour(255, 255, 255) if sample.RGB_R == 50: style = wx.SIMPLE_BORDER if sample.RGB_R == 100 and sample.RGB_G > 0: labeltext = "m" else: labeltext = "M" elif (sample.RGB_B == 0 or sample.RGB_G == 100) and sample.RGB_R == sample.RGB_G: # Yellow if sample.RGB_G > 75: labelcolour = wx.Colour(0, 0, 0) else: labelcolour = wx.Colour(255, 255, 255) if sample.RGB_R == 100 and sample.RGB_G == 50: style = wx.SIMPLE_BORDER if sample.RGB_B > 0: labeltext = "y" else: labeltext = "Y" else: labeltext = "" labelcolour = None return style, colour, labeltext, labelcolour def tc_set_default_status(self, event = None): if hasattr(self, "tc_amount"): statustxt = "%s: %s" % (lang.getstr("tc.patches.total"), self.tc_amount) sel = self.grid.GetSelectionRows() if sel: statustxt += " / %s: %s" % (lang.getstr("tc.patches.selected"), len(sel)) index = self.grid.GetGridCursorRow() if index > -1: colour = self.grid.GetCellBackgroundColour(index, 3) patchinfo = u" \u2014 %s %s: R=%s G=%s B=%s" % (lang.getstr("tc.patch"), index + 1, colour[0], colour[1], colour[2]) statustxt += patchinfo self.SetStatusText(statustxt) def tc_mouseclick_handler(self, event): if not getattr(self, "ti1", None): return index = event.Row * self.preview.GetNumberCols() + event.Col if index > self.ti1.queryv1("NUMBER_OF_SETS") - 1: return self.grid.select_row(index, event.ShiftDown(), event.ControlDown() or event.CmdDown()) return def tc_delete_rows(self, rows): self.grid.BeginBatch() if hasattr(self, "preview"): self.preview.BeginBatch() rows.sort() rows.reverse() data = self.ti1.queryv1("DATA") # Optimization: Delete consecutive rows in least number of operations consecutive = [] rows.append(-1) for row in rows: if row == -1 or (consecutive and consecutive[-1] != row + 1): self.grid.DeleteRows(consecutive[-1], len(consecutive)) if consecutive[0] != len(data) - 1: data.moveby1(consecutive[-1] + len(consecutive), -len(consecutive)) for crow in consecutive: dict.pop(data, len(data) - 1) consecutive = [] consecutive.append(row) rows.pop() if hasattr(self, "preview"): self.tc_preview_update(rows[-1]) data.setmodified() self.tc_amount = self.ti1.queryv1("NUMBER_OF_SETS") row = min(rows[-1], self.grid.GetNumberRows() - 1) self.grid.SelectRow(row) self.grid.SetGridCursor(row, 0) self.grid.MakeCellVisible(row, 0) self.grid.EndBatch() self.tc_save_check() if hasattr(self, "preview"): self.preview.EndBatch() self.tc_set_default_status() def view_3d_format_popup(self, event): menu = wx.Menu() item_selected = False for file_format in config.valid_values["3d.format"]: item = menu.AppendRadioItem(-1, file_format) item.Check(file_format == getcfg("3d.format")) self.Bind(wx.EVT_MENU, self.view_3d_format_handler, id=item.Id) self.PopupMenu(menu) for item in menu.MenuItems: self.Unbind(wx.EVT_MENU, id=item.Id) menu.Destroy() def view_3d_format_handler(self, event): for item in event.EventObject.MenuItems: if item.IsChecked(): setcfg("3d.format", item.GetItemLabelText()) self.tc_view_3d(None) def writecfg(self): if self.Parent: writecfg() else: writecfg(module="testchart-editor", options=("3d_format", "last_ti1_path", "last_testchart_export_path", "last_vrml_path", "position.tcgen", "size.tcgen", "tc.", "tc_")) def main(): config.initcfg("testchart-editor") lang.init() lang.update_defaults() app = BaseApp(0) app.TopWindow = TestchartEditor(setup=False) if sys.platform == "darwin": app.TopWindow.init_menubar() wx.CallLater(1, _main, app) app.MainLoop() def _main(app): app.TopWindow.listen() app.TopWindow.setup(path=False) app.process_argv(1) or app.TopWindow.tc_load_cfg_from_ti1() app.TopWindow.Show() if __name__ == "__main__": main() DisplayCAL-3.1.0.0/DisplayCAL/wxUntetheredFrame.py0000644000076500000000000006272612647526531021462 0ustar devwheel00000000000000# -*- coding: UTF-8 -*- """ Interactive display calibration UI """ import math import os import re import sys import time from wxaddons import wx from config import (getbitmap, getcfg, geticon, get_data_path, get_icon_bundle, setcfg) from log import get_file_logger, safe_print from meta import name as appname from options import debug, test, verbose from wxwindows import (BaseApp, BaseFrame, BitmapBackgroundPanel, CustomCheckBox, CustomGrid, FlatShadedButton, numpad_keycodes) import CGATS import audio import colormath import config import localization as lang BGCOLOUR = wx.Colour(0x33, 0x33, 0x33) FGCOLOUR = wx.Colour(0x99, 0x99, 0x99) class UntetheredFrame(BaseFrame): def __init__(self, parent=None, handler=None, keyhandler=None, start_timer=True): BaseFrame.__init__(self, parent, wx.ID_ANY, lang.getstr("measurement.untethered"), style=wx.DEFAULT_FRAME_STYLE, name="untetheredframe") self.SetIcons(get_icon_bundle([256, 48, 32, 16], appname)) self.sizer = wx.FlexGridSizer(2, 1, 0, 0) self.sizer.AddGrowableCol(0) self.sizer.AddGrowableRow(0) self.sizer.AddGrowableRow(1) self.panel = wx.Panel(self) self.SetSizer(self.sizer) self.sizer.Add(self.panel, 1, wx.EXPAND) self.panel.SetBackgroundColour(BGCOLOUR) panelsizer = wx.FlexGridSizer(3, 2, 8, 8) panelsizer.AddGrowableCol(0) panelsizer.AddGrowableCol(1) panelsizer.AddGrowableRow(1) self.panel.SetSizer(panelsizer) self.label_RGB = wx.StaticText(self.panel, wx.ID_ANY, " ") self.label_RGB.SetForegroundColour(FGCOLOUR) panelsizer.Add(self.label_RGB, 0, wx.TOP | wx.LEFT | wx.EXPAND, border=8) self.label_XYZ = wx.StaticText(self.panel, wx.ID_ANY, " ") self.label_XYZ.SetForegroundColour(FGCOLOUR) panelsizer.Add(self.label_XYZ, 0, wx.TOP | wx.RIGHT | wx.EXPAND, border=8) if sys.platform == "darwin": style = wx.BORDER_THEME else: style = wx.BORDER_SIMPLE self.panel_RGB = BitmapBackgroundPanel(self.panel, size=(256, 256), style=style) self.panel_RGB.scalebitmap = (True, True) self.panel_RGB.SetBitmap(getbitmap("theme/checkerboard-32x32x5-333-444")) panelsizer.Add(self.panel_RGB, 1, wx.LEFT | wx.EXPAND, border=8) self.panel_XYZ = BitmapBackgroundPanel(self.panel, size=(256, 256), style=style) self.panel_XYZ.scalebitmap = (True, True) self.panel_XYZ.SetBitmap(getbitmap("theme/checkerboard-32x32x5-333-444")) panelsizer.Add(self.panel_XYZ, 1, wx.RIGHT | wx.EXPAND, border=8) sizer = wx.BoxSizer(wx.HORIZONTAL) self.back_btn = FlatShadedButton(self.panel, bitmap=geticon(10, "back"), label="", fgcolour=FGCOLOUR) self.back_btn.Bind(wx.EVT_BUTTON, self.back_btn_handler) sizer.Add(self.back_btn, 0, wx.LEFT | wx.RIGHT, border=8) self.label_index = wx.StaticText(self.panel, wx.ID_ANY, " ") self.label_index.SetForegroundColour(FGCOLOUR) sizer.Add(self.label_index, 0, wx.ALIGN_CENTER_VERTICAL) self.next_btn = FlatShadedButton(self.panel, bitmap=geticon(10, "play"), label="", fgcolour=FGCOLOUR) self.next_btn.Bind(wx.EVT_BUTTON, self.next_btn_handler) sizer.Add(self.next_btn, 0, wx.LEFT, border=8) sizer.Add((12, 1), 1) self.measure_auto_cb = CustomCheckBox(self.panel, wx.ID_ANY, lang.getstr("auto")) self.measure_auto_cb.SetForegroundColour(FGCOLOUR) self.measure_auto_cb.Bind(wx.EVT_CHECKBOX, self.measure_auto_ctrl_handler) sizer.Add(self.measure_auto_cb, 0, wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_RIGHT) panelsizer.Add(sizer, 0, wx.BOTTOM | wx.EXPAND, border=8) sizer = wx.BoxSizer(wx.HORIZONTAL) self.measure_btn = FlatShadedButton(self.panel, bitmap=geticon(10, "play"), label=lang.getstr("measure"), fgcolour=FGCOLOUR) self.measure_btn.Bind(wx.EVT_BUTTON, self.measure_btn_handler) sizer.Add(self.measure_btn, 0, wx.RIGHT, border=6) # Sound when measuring # Needs to be stereo! self.measurement_sound = audio.Sound(get_data_path("beep.wav")) self.commit_sound = audio.Sound(get_data_path("camera_shutter.wav")) if getcfg("measurement.play_sound"): bitmap = geticon(16, "sound_volume_full") else: bitmap = geticon(16, "sound_off") self.sound_on_off_btn = FlatShadedButton(self.panel, bitmap=bitmap, fgcolour=FGCOLOUR) self.sound_on_off_btn.SetToolTipString(lang.getstr("measurement.play_sound")) self.sound_on_off_btn.Bind(wx.EVT_BUTTON, self.measurement_play_sound_handler) sizer.Add(self.sound_on_off_btn, 0) sizer.Add((12, 1), 1) self.finish_btn = FlatShadedButton(self.panel, label=lang.getstr("finish"), fgcolour=FGCOLOUR) self.finish_btn.Bind(wx.EVT_BUTTON, self.finish_btn_handler) sizer.Add(self.finish_btn, 0, wx.RIGHT, border=8) panelsizer.Add(sizer, 0, wx.BOTTOM | wx.EXPAND, border=8) self.grid = CustomGrid(self, -1, size=(536, 256)) self.grid.DisableDragColSize() self.grid.DisableDragRowSize() self.grid.SetScrollRate(0, 5) self.grid.SetCellHighlightROPenWidth(0) self.grid.SetColLabelSize(self.grid.GetDefaultRowSize()) self.grid.SetDefaultCellAlignment(wx.ALIGN_CENTER, wx.ALIGN_CENTER) self.grid.SetRowLabelAlignment(wx.ALIGN_RIGHT, wx.ALIGN_CENTER) self.grid.draw_horizontal_grid_lines = False self.grid.draw_vertical_grid_lines = False self.grid.style = "" self.grid.CreateGrid(0, 9) self.grid.SetRowLabelSize(62) for i in xrange(9): if i in (3, 4): size = self.grid.GetDefaultRowSize() if i == 4: attr = wx.grid.GridCellAttr() attr.SetBackgroundColour(wx.Colour(0, 0, 0, 0)) self.grid.SetColAttr(i, attr) else: size = 62 self.grid.SetColSize(i, size) for i, label in enumerate(["R", "G", "B", "", "", "L*", "a*", "b*", ""]): self.grid.SetColLabelValue(i, label) self.grid.SetCellHighlightPenWidth(0) self.grid.SetDefaultCellBackgroundColour(self.grid.GetLabelBackgroundColour()) font = self.grid.GetDefaultCellFont() if font.PointSize > 11: font.PointSize = 11 self.grid.SetDefaultCellFont(font) self.grid.SetSelectionMode(wx.grid.Grid.wxGridSelectRows) self.grid.EnableEditing(False) self.grid.EnableGridLines(False) self.grid.Bind(wx.grid.EVT_GRID_LABEL_LEFT_CLICK, self.grid_left_click_handler) self.grid.Bind(wx.grid.EVT_GRID_CELL_LEFT_CLICK, self.grid_left_click_handler) self.sizer.Add(self.grid, 1, wx.EXPAND) self.Fit() self.SetMinSize(self.GetSize()) self.keyhandler = keyhandler if sys.platform in ("darwin", "win32"): # Use an accelerator table for space, 0-9, A-Z, numpad keycodes = [ord(" ")] + range(ord("0"), ord("9")) + range(ord("A"), ord("Z")) + numpad_keycodes self.id_to_keycode = {} for keycode in keycodes: self.id_to_keycode[wx.NewId()] = keycode accels = [] for id, keycode in self.id_to_keycode.iteritems(): self.Bind(wx.EVT_MENU, self.key_handler, id=id) accels.append((wx.ACCEL_NORMAL, keycode, id)) self.SetAcceleratorTable(wx.AcceleratorTable(accels)) else: self.Bind(wx.EVT_CHAR_HOOK, self.key_handler) self.Bind(wx.EVT_KEY_DOWN, self.key_handler) # Event handlers self.Bind(wx.EVT_CLOSE, self.OnClose, self) self.Bind(wx.EVT_MOVE, self.OnMove, self) self.Bind(wx.EVT_SIZE, self.OnResize, self) self.timer = wx.Timer(self) if handler: self.Bind(wx.EVT_TIMER, handler, self.timer) self.Bind(wx.EVT_WINDOW_DESTROY, self.OnDestroy, self) # Final initialization steps for child in self.GetAllChildren(): if (sys.platform == "win32" and sys.getwindowsversion() >= (6, ) and isinstance(child, wx.Panel)): # No need to enable double buffering under Linux and Mac OS X. # Under Windows, enabling double buffering on the panel seems # to work best to reduce flicker. child.SetDoubleBuffered(True) self.logger = get_file_logger("untethered") self._setup() self.Show() if start_timer: self.start_timer() def EndModal(self, returncode=wx.ID_OK): return returncode def MakeModal(self, makemodal=False): pass def OnClose(self, event): config.writecfg() if not self.timer.IsRunning(): self.Destroy() else: self.keepGoing = False def OnDestroy(self, event): self.stop_timer() del self.timer def OnMove(self, event): if self.IsShownOnScreen() and not self.IsIconized() and \ (not self.GetParent() or not self.GetParent().IsShownOnScreen()): prev_x = getcfg("position.progress.x") prev_y = getcfg("position.progress.y") x, y = self.GetScreenPosition() if x != prev_x or y != prev_y: setcfg("position.progress.x", x) setcfg("position.progress.y", y) def OnResize(self, event): wx.CallAfter(self.resize_grid) event.Skip() def Pulse(self, msg=""): if msg == lang.getstr("instrument.initializing"): self.label_RGB.SetLabel(msg) return self.keepGoing, False def Resume(self): self.keepGoing = True def Update(self, value, msg=""): return self.Pulse(msg) def UpdatePulse(self, msg=""): return self.Pulse(msg) def back_btn_handler(self, event): if self.index > 0: self.update(self.index - 1) def enable_btns(self, enable=True, enable_measure_button=False): self.is_measuring = not enable and enable_measure_button self.back_btn.Enable(enable and self.index > 0) self.next_btn.Enable(enable and self.index < self.index_max) self.measure_btn._bitmap = geticon(10, {True: "play", False: "pause"}.get(enable)) self.measure_btn.Enable(enable or enable_measure_button) self.measure_btn.SetDefault() def finish_btn_handler(self, event): self.finish_btn.Disable() self.cgats[0].type = "CTI3" self.cgats[0].add_keyword("COLOR_REP", "RGB_XYZ") if self.white_XYZ[1] > 0: # Normalize to Y = 100 query = self.cgats[0].DATA for i in query: XYZ = query[i]["XYZ_X"], query[i]["XYZ_Y"], query[i]["XYZ_Z"] XYZ = [v / self.white_XYZ[1] * 100 for v in XYZ] query[i]["XYZ_X"], query[i]["XYZ_Y"], query[i]["XYZ_Z"] = XYZ normalized = "YES" else: normalized = "NO" self.cgats[0].add_keyword("NORMALIZED_TO_Y_100", normalized) self.cgats[0].add_keyword("DEVICE_CLASS", "DISPLAY") self.cgats[0].add_keyword("INSTRUMENT_TYPE_SPECTRAL", "NO") if hasattr(self.cgats[0], "APPROX_WHITE_POINT"): self.cgats[0].remove_keyword("APPROX_WHITE_POINT") self.cgats[0].write(os.path.splitext(self.cgats.filename)[0] + ".ti3") self.safe_send("Q") time.sleep(.5) self.safe_send("Q") def flush(self): pass def get_Lab_RGB(self): row = self.cgats[0].DATA[self.index] XYZ = row["XYZ_X"], row["XYZ_Y"], row["XYZ_Z"] self.last_XYZ = XYZ Lab = colormath.XYZ2Lab(*XYZ) if self.white_XYZ[1] > 0: XYZ = [v / self.white_XYZ[1] * 100 for v in XYZ] white_XYZ_Y100 = [v / self.white_XYZ[1] * 100 for v in self.white_XYZ] white_CCT = colormath.XYZ2CCT(*white_XYZ_Y100) if white_CCT: DXYZ = colormath.CIEDCCT2XYZ(white_CCT, scale=100.0) if DXYZ: white_CIEDCCT_Lab = colormath.XYZ2Lab(*DXYZ) PXYZ = colormath.planckianCT2XYZ(white_CCT, scale=100.0) if PXYZ: white_planckianCCT_Lab = colormath.XYZ2Lab(*PXYZ) white_Lab = colormath.XYZ2Lab(*white_XYZ_Y100) if (DXYZ and PXYZ and (colormath.delta(*white_CIEDCCT_Lab + white_Lab)["E"] < 6 or colormath.delta(*white_planckianCCT_Lab + white_Lab)["E"] < 6)): # Is white close enough to daylight or planckian locus? XYZ = colormath.adapt(XYZ[0], XYZ[1], XYZ[2], white_XYZ_Y100, "D65") X, Y, Z = [v / 100.0 for v in XYZ] color = [int(round(v)) for v in colormath.XYZ2RGB(X, Y, Z, scale=255)] return Lab, color def grid_left_click_handler(self, event): if not self.is_measuring: row, col = event.GetRow(), event.GetCol() if row == -1 and col > -1: # col label clicked pass elif row > -1: # row clicked if not (event.CmdDown() or event.ControlDown() or event.ShiftDown()): self.update(row) event.Skip() def has_worker_subprocess(self): return bool(getattr(self, "worker", None) and getattr(self.worker, "subprocess", None)) def isatty(self): return True def key_handler(self, event): keycode = None if event.GetEventType() in (wx.EVT_CHAR.typeId, wx.EVT_CHAR_HOOK.typeId, wx.EVT_KEY_DOWN.typeId): keycode = event.GetKeyCode() elif event.GetEventType() == wx.EVT_MENU.typeId: keycode = self.id_to_keycode.get(event.GetId()) if keycode is not None: if event.GetEventType() == wx.EVT_KEY_DOWN.typeId: if keycode in (wx.WXK_UP, wx.WXK_NUMPAD_UP): self.back_btn_handler(None) elif keycode in (wx.WXK_DOWN, wx.WXK_NUMPAD_DOWN): self.next_btn_handler(None) elif keycode in (wx.WXK_HOME, wx.WXK_NUMPAD_HOME): if self.index > -1: self.update(0) elif keycode in (wx.WXK_END, wx.WXK_NUMPAD_END): if self.index_max > -1: self.update(self.index_max) elif keycode in (wx.WXK_PAGEDOWN, wx.WXK_NUMPAD_PAGEDOWN): if self.index > -1: self.grid.MovePageDown() self.update(self.grid.GetGridCursorRow()) elif keycode in (wx.WXK_PAGEUP, wx.WXK_NUMPAD_PAGEUP): if self.index > -1: self.grid.MovePageUp() self.update(self.grid.GetGridCursorRow()) elif event.ControlDown() or event.CmdDown(): event.Skip() return elif self.has_worker_subprocess() and keycode < 255: if keycode == 27 or chr(keycode) == "Q": # ESC or Q self.worker.abort_subprocess() elif (not isinstance(self.FindFocus(), wx.Control) or keycode != 32): self.measure_btn_handler(None) return event.Skip() def measure(self, event=None): self.enable_btns(False, True) # Use a delay to allow for TFT lag wx.CallLater(200, self.safe_send, " ") def measure_auto_ctrl_handler(self, event): auto = self.measure_auto_cb.GetValue() setcfg("untethered.measure.auto", int(auto)) def measure_btn_handler(self, event): if self.is_measuring: self.is_measuring = False else: self.last_XYZ = (-1, -1, -1) self.measure_count = 1 self.measure() def measurement_play_sound_handler(self, event): setcfg("measurement.play_sound", int(not(bool(getcfg("measurement.play_sound"))))) if getcfg("measurement.play_sound"): bitmap = geticon(16, "sound_volume_full") else: bitmap = geticon(16, "sound_off") self.sound_on_off_btn._bitmap = bitmap def next_btn_handler(self, event): if self.index < self.index_max: self.update(self.index + 1) def parse_txt(self, txt): if not txt or not self.keepGoing: return self.logger.info("%r" % txt) data_len = len(self.cgats[0].DATA) if (self.grid.GetNumberRows() < data_len): self.index = 0 self.index_max = data_len - 1 self.grid.AppendRows(data_len - self.grid.GetNumberRows()) for i in self.cgats[0].DATA: self.grid.SetRowLabelValue(i, "%i" % (i + 1)) row = self.cgats[0].DATA[i] RGB = [] for j, label in enumerate("RGB"): value = int(round(float(str(row["RGB_%s" % label] * 2.55)))) self.grid.SetCellValue(row.SAMPLE_ID - 1, j, "%i" % value) RGB.append(value) self.grid.SetCellBackgroundColour(row.SAMPLE_ID - 1, 3, wx.Colour(*RGB)) if "Connecting to the instrument" in txt: self.Pulse(lang.getstr("instrument.initializing")) if "Spot read needs a calibration" in txt: self.is_measuring = False if "Spot read failed" in txt: self.last_error = txt if "Result is XYZ:" in txt: self.last_error = None if getcfg("measurement.play_sound"): self.measurement_sound.safe_play() # Result is XYZ: d.dddddd d.dddddd d.dddddd, D50 Lab: d.dddddd d.dddddd d.dddddd XYZ = re.search("XYZ:\s+(-?\d+(?:\.\d+)?)\s+(-?\d+(?:\.\d+)?)\s+(-?\d+(?:\.\d+)?)", txt) if not XYZ: return XYZ = [float(v) for v in XYZ.groups()] row = self.cgats[0].DATA[self.index] if (row["RGB_R"] == 100 and row["RGB_G"] == 100 and row["RGB_B"] == 100): # White if XYZ[1] > 0: self.cgats[0].add_keyword("LUMINANCE_XYZ_CDM2", "%.6f %.6f %.6f" % tuple(XYZ)) self.white_XYZ = XYZ Lab1 = colormath.XYZ2Lab(*self.last_XYZ) Lab2 = colormath.XYZ2Lab(*XYZ) delta = colormath.delta(*Lab1 + Lab2) if debug or test or verbose > 1: safe_print("Last recorded Lab: %.4f %.4f %.4f" % Lab1) safe_print("Current Lab: %.4f %.4f %.4f" % Lab2) safe_print("Delta E to last recorded Lab: %.4f" % delta["E"]) safe_print("Abs. delta L to last recorded Lab: %.4f" % abs(delta["L"])) safe_print("Abs. delta C to last recorded Lab: %.4f" % abs(delta["C"])) if (delta["E"] > getcfg("untethered.min_delta") or (abs(delta["L"]) > getcfg("untethered.min_delta.lightness") and abs(delta["C"]) < getcfg("untethered.max_delta.chroma"))): self.measure_count += 1 if self.measure_count == 2: if getcfg("measurement.play_sound"): self.commit_sound.safe_play() self.measure_count = 0 # Reset row label self.grid.SetRowLabelValue(self.index, "%i" % (self.index + 1)) # Update CGATS query = self.cgats[0].queryi({"RGB_R": row["RGB_R"], "RGB_G": row["RGB_G"], "RGB_B": row["RGB_B"]}) for i in query: index = query[i].SAMPLE_ID - 1 if index not in self.measured: self.measured.append(index) if index == self.index + 1: # Increment the index if we have consecutive patches self.index = index query[i]["XYZ_X"], query[i]["XYZ_Y"], query[i]["XYZ_Z"] = XYZ if getcfg("untethered.measure.auto"): self.show_RGB(False, False) self.show_XYZ() Lab, color = self.get_Lab_RGB() for i in query: row = query[i] self.grid.SetCellBackgroundColour(query[i].SAMPLE_ID - 1, 4, wx.Colour(*color)) for j in xrange(3): self.grid.SetCellValue(query[i].SAMPLE_ID - 1, 5 + j, "%.2f" % Lab[j]) self.grid.MakeCellVisible(self.index, 0) self.grid.ForceRefresh() if len(self.measured) == data_len: self.finished = True self.finish_btn.Enable() else: # Jump to the next or previous unmeasured patch, if any index = self.index for i in xrange(self.index + 1, data_len): if (getcfg("untethered.measure.auto") or not i in self.measured): self.index = i break if self.index == index: for i in xrange(self.index - 1, -1, -1): if not i in self.measured: self.index = i break if self.index != index: # Mark the row containing the next/previous patch self.grid.SetRowLabelValue(self.index, u"\u25ba %i" % (self.index + 1)) self.grid.MakeCellVisible(self.index, 0) if "key to take a reading" in txt and not self.last_error: if getcfg("untethered.measure.auto") and self.is_measuring: if not self.finished: self.measure() else: self.enable_btns() else: show_XYZ = self.index in self.measured delay = getcfg("untethered.measure.manual.delay") * 1000 wx.CallLater(delay, self.show_RGB, not show_XYZ) if show_XYZ: wx.CallLater(delay, self.show_XYZ) wx.CallLater(delay, self.enable_btns) def pause_continue_handler(self, event=None): if not event: self.parse_txt(self.worker.lastmsg.read()) @property def paused(self): return False def reset(self): self._setup() def resize_grid(self): num_cols = self.grid.GetNumberCols() if not num_cols: return grid_w = self.grid.GetSize()[0] - self.grid.GetDefaultRowSize() * 2 col_w = round(grid_w / (num_cols - 1)) last_col_w = grid_w - col_w * (num_cols - 2) self.grid.SetRowLabelSize(col_w) for i in xrange(num_cols): if i in (3, 4): w = self.grid.GetDefaultRowSize() elif i == num_cols - 1: w = last_col_w - wx.SystemSettings_GetMetric(wx.SYS_VSCROLL_X) else: w = col_w self.grid.SetColSize(i, w) self.grid.SetMargins(0 - wx.SystemSettings_GetMetric(wx.SYS_VSCROLL_X), 0) self.grid.ForceRefresh() def _setup(self): self.logger.info("-" * 80) self.is_measuring = False self.keepGoing = True self.last_error = None self.index = -1 self.index_max = -1 self.last_XYZ = (-1, -1, -1) self.white_XYZ = (-1, -1, -1) self.measure_count = 0 self.measured = [] self.finished = False self.label_RGB.SetLabel(" ") self.label_XYZ.SetLabel(" ") self.panel_RGB.SetBackgroundColour(BGCOLOUR) self.panel_RGB.Refresh() self.panel_RGB.Update() self.panel_XYZ.SetBackgroundColour(BGCOLOUR) self.panel_XYZ.Refresh() self.panel_XYZ.Update() self.label_index.SetLabel(" ") self.enable_btns(False) self.measure_auto_cb.SetValue(bool(getcfg("untethered.measure.auto"))) self.finish_btn.Disable() if self.grid.GetNumberRows(): self.grid.DeleteRows(0, self.grid.GetNumberRows()) # Set position x = getcfg("position.progress.x") y = getcfg("position.progress.y") self.SetSaneGeometry(x, y) def safe_send(self, bytes): if self.has_worker_subprocess() and not self.worker.subprocess_abort: self.worker.safe_send(bytes) def show_RGB(self, clear_XYZ=True, mark_current_row=True): row = self.cgats[0].DATA[self.index] self.label_RGB.SetLabel("RGB %i %i %i" % (round(row["RGB_R"] * 2.55), round(row["RGB_G"] * 2.55), round(row["RGB_B"] * 2.55))) color = [int(round(v * 2.55)) for v in (row["RGB_R"], row["RGB_G"], row["RGB_B"])] self.panel_RGB.SetBackgroundColour(wx.Colour(*color)) self.panel_RGB.SetBitmap(None) self.panel_RGB.Refresh() self.panel_RGB.Update() if clear_XYZ: self.label_XYZ.SetLabel(" ") self.panel_XYZ.SetBackgroundColour(BGCOLOUR) self.panel_XYZ.SetBitmap(getbitmap("theme/checkerboard-32x32x5-333-444")) self.panel_XYZ.Refresh() self.panel_XYZ.Update() if mark_current_row: self.grid.SetRowLabelValue(self.index, u"\u25ba %i" % (self.index + 1)) self.grid.MakeCellVisible(self.index, 0) self.grid.SelectRow(self.index) self.grid.SetGridCursor(self.index, 0) self.label_index.SetLabel("%i/%i" % (self.index + 1, len(self.cgats[0].DATA))) self.label_index.GetContainingSizer().Layout() def show_XYZ(self): Lab, color = self.get_Lab_RGB() self.label_XYZ.SetLabel("L*a*b* %.2f %.2f %.2f" % Lab) self.panel_XYZ.SetBackgroundColour(wx.Colour(*color)) self.panel_XYZ.SetBitmap(None) self.panel_XYZ.Refresh() self.panel_XYZ.Update() def start_timer(self, ms=50): self.timer.Start(ms) def stop_timer(self): self.timer.Stop() def update(self, index): # Reset row label self.grid.SetRowLabelValue(self.index, "%i" % (self.index + 1)) self.index = index show_XYZ = self.index in self.measured self.show_RGB(not show_XYZ) if show_XYZ: self.show_XYZ() self.enable_btns() def write(self, txt): wx.CallAfter(self.parse_txt, txt) if __name__ == "__main__": from thread import start_new_thread from time import sleep import random from util_io import Files import ICCProfile as ICCP import worker class Subprocess(): def send(self, bytes): start_new_thread(test, (bytes,)) class Worker(worker.Worker): def __init__(self): worker.Worker.__init__(self) self.finished = False self.instrument_calibration_complete = False self.instrument_place_on_screen_msg = False self.instrument_sensor_position_msg = False self.is_ambient_measuring = False self.subprocess = Subprocess() self.subprocess_abort = False def abort_subprocess(self): self.safe_send("Q") def safe_send(self, bytes): print "*** Sending %r" % bytes self.subprocess.send(bytes) return True config.initcfg() print "untethered.min_delta", getcfg("untethered.min_delta") print "untethered.min_delta.lightness", getcfg("untethered.min_delta.lightness") print "untethered.max_delta.chroma", getcfg("untethered.max_delta.chroma") lang.init() lang.update_defaults() app = BaseApp(0) app.TopWindow = UntetheredFrame(start_timer=False) testchart = getcfg("testchart.file") if os.path.splitext(testchart)[1].lower() in (".icc", ".icm"): try: testchart = ICCP.ICCProfile(testchart).tags.targ except: pass try: app.TopWindow.cgats = CGATS.CGATS(testchart) except: app.TopWindow.cgats = CGATS.CGATS("""TI1 BEGIN_DATA_FORMAT SAMPLE_ID RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT BEGIN_DATA 1 0 0 0 0 0 0 END_DATA """) app.TopWindow.worker = Worker() app.TopWindow.worker.progress_wnd = app.TopWindow app.TopWindow.Show() files = Files([app.TopWindow.worker, app.TopWindow]) def test(bytes=None): print "*** Received %r" % bytes menu = r"""Place instrument on spot to be measured, and hit [A-Z] to read white and setup FWA compensation (keyed to letter) [a-z] to read and make FWA compensated reading from keyed reference 'r' to set reference, 's' to save spectrum, 'h' to toggle high res., 'k' to do a calibration Hit ESC or Q to exit, any other key to take a reading:""" if not bytes: txt = menu elif bytes == " ": i = app.TopWindow.index row = app.TopWindow.cgats[0].DATA[i] txt = [""" Result is XYZ: %.6f %.6f %.6f Place instrument on spot to be measured, and hit [A-Z] to read white and setup FWA compensation (keyed to letter) [a-z] to read and make FWA compensated reading from keyed reference 'r' to set reference, 's' to save spectrum, 'h' to toggle high res., 'k' to do a calibration Hit ESC or Q to exit, any other key to take a reading:""" % (row.XYZ_X, row.XYZ_Y, row.XYZ_Z), """" Result is XYZ: %.6f %.6f %.6f Spot read needs a calibration before continuing Place cap on the instrument, or place on a dark surface, or place on the white calibration reference, and then hit any key to continue, or hit Esc or Q to abort:""" % (row.XYZ_X, row.XYZ_Y, row.XYZ_Z)][random.choice([0, 1])] elif bytes in ("Q", "q"): wx.CallAfter(app.TopWindow.Close) return else: return for line in txt.split("\n"): sleep(.03125) if app.TopWindow: wx.CallAfter(files.write, line) print line start_new_thread(test, tuple()) app.MainLoop() DisplayCAL-3.1.0.0/DisplayCAL/wxVRML2X3D.py0000644000076500000000000001665512647526531017561 0ustar devwheel00000000000000# -*- coding: utf-8 -*- import os import sys from meta import name as appname from safe_print import safe_print from util_os import launch_file, make_win32_compatible_long_path, waccess from util_str import safe_unicode from worker import Worker, show_result_dialog from wxaddons import wx from wxfixes import GenBitmapButton as BitmapButton from wxwindows import BaseApp, BaseFrame, FileDrop import config import localization as lang import x3dom class VRML2X3DFrame(BaseFrame): def __init__(self, html, embed, view, force, cache): BaseFrame.__init__(self, None, wx.ID_ANY, lang.getstr("vrml_to_x3d_converter"), style=wx.DEFAULT_FRAME_STYLE & ~(wx.MAXIMIZE_BOX | wx.RESIZE_BORDER), name="vrml2x3dframe") self.SetIcons(config.get_icon_bundle([256, 48, 32, 16], appname + "-VRML-to-X3D-converter")) self.cache = cache self.embed = embed self.force = force self.html = html self.worker = Worker(self) sizer = wx.BoxSizer(wx.HORIZONTAL) self.SetSizer(sizer) panel = wx.Panel(self) sizer.Add(panel) panelsizer = wx.BoxSizer(wx.HORIZONTAL) panel.SetSizer(panelsizer) self.btn = BitmapButton(panel, wx.ID_ANY, config.geticon(256, "document-open"), style=wx.NO_BORDER) self.btn.SetToolTipString(lang.getstr("file.select")) self.btn.Bind(wx.EVT_BUTTON, lambda event: vrmlfile2x3dfile(None, html=html, embed=embed, view=view, force=force, cache=cache, worker=self.worker)) self.droptarget = FileDrop(self) vrml_drop_handler = lambda vrmlpath: vrmlfile2x3dfile(vrmlpath, html=html, embed=embed, view=view, force=force, cache=cache, worker=self.worker) self.droptarget.drophandlers = { ".vrml": vrml_drop_handler, ".vrml.gz": vrml_drop_handler, ".wrl": vrml_drop_handler, ".wrl.gz": vrml_drop_handler, ".wrz": vrml_drop_handler } self.btn.SetDropTarget(self.droptarget) panelsizer.Add(self.btn, flag=wx.ALL, border=12) self.Fit() self.SetMinSize(self.GetSize()) self.SetMaxSize(self.GetSize()) def get_commands(self): return (self.get_common_commands() + ["VRML-to-X3D-converter [filename...]", "load "]) def process_data(self, data): if data[0] in ("VRML-to-X3D-converter", "load"): if self.IsIconized(): self.Restore() self.Raise() if len(data) > 1: self.droptarget.OnDropFiles(0, 0, data[1:]) return "ok" return "invalid" def main(): if "--help" in sys.argv[1:]: safe_print("Usage: %s [--embed] [--no-gui] [--view] [FILE]" % sys.argv[0]) safe_print("Convert VRML file to X3D") safe_print("The output is written to FILENAME.x3d(.html)") safe_print("") safe_print(" --embed Embed viewer components in HTML instead of " "referencing them") safe_print(" --force Force fresh download of viewer components") safe_print(" --no-cache Don't use viewer components cache (only " "uses existing cache if") safe_print(" embedding components, can be overridden " "with --force)") safe_print(" --no-gui Don't show GUI (terminal mode)") safe_print(" --no-html Don't generate HTML file") safe_print(" --view View the generated file (if --no-gui)") safe_print(" FILE Filename of VRML file to convert") return config.initcfg("VRML-to-X3D-converter") lang.init() lang.update_defaults() cache = not "--no-cache" in sys.argv[1:] embed = "--embed" in sys.argv force = "--force" in sys.argv html = not "--no-html" in sys.argv[1:] if "--no-gui" in sys.argv[1:]: view = "--view" in sys.argv[1:] for arg in sys.argv[1:]: if os.path.isfile(arg): vrmlfile2x3dfile(safe_unicode(arg), html=html, embed=embed, view=view, force=force, cache=cache) else: view = not "--no-view" in sys.argv[1:] app = BaseApp(0) app.TopWindow = VRML2X3DFrame(html, embed, view, force, cache) if sys.platform == "darwin": app.TopWindow.init_menubar() wx.CallLater(1, _main, app) app.MainLoop() def _main(app): app.TopWindow.listen() app.process_argv() app.TopWindow.Show() def vrmlfile2x3dfile(vrmlpath=None, x3dpath=None, html=True, embed=False, view=False, force=False, cache=True, worker=None): """ Convert VRML to HTML. Output is written to .x3d.html unless you set x3dpath to desired output path, or False to be prompted for an output path. """ while not vrmlpath or not os.path.isfile(vrmlpath): if "--no-gui" in sys.argv[1:]: if not vrmlpath or vrmlpath.startswith("--"): safe_print("No filename given.") else: safe_print("%r is not a file." % vrmlpath) sys.exit(1) if not wx.GetApp(): app = BaseApp(0) defaultDir, defaultFile = config.get_verified_path("last_vrml_path") dlg = wx.FileDialog(None, lang.getstr("file.select"), defaultDir=defaultDir, defaultFile=defaultFile, wildcard=lang.getstr("filetype.vrml") + "|*.vrml;*.vrml.gz;*.wrl.gz;*.wrl;*.wrz", style=wx.FD_OPEN | wx.FD_FILE_MUST_EXIST) dlg.Center(wx.BOTH) result = dlg.ShowModal() vrmlpath = dlg.GetPath() dlg.Destroy() if result != wx.ID_OK: return config.setcfg("last_vrml_path", vrmlpath) config.writecfg(module="VRML-to-X3D-converter", options=("last_vrml_path", )) filename, ext = os.path.splitext(vrmlpath) if x3dpath is None: x3dpath = filename + ".x3d" if x3dpath: dirname = os.path.dirname(x3dpath) while not x3dpath or not waccess(dirname, os.W_OK): if "--no-gui" in sys.argv[1:]: if not x3dpath: safe_print("No HTML output filename given.") else: safe_print("%r is not writable." % dirname) sys.exit(1) if not wx.GetApp(): app = BaseApp(0) if x3dpath: defaultDir, defaultFile = os.path.split(x3dpath) else: defaultFile = os.path.basename(filename) + ".x3d" dlg = wx.FileDialog(None, lang.getstr("error.access_denied.write", dirname), defaultDir=defaultDir, defaultFile=defaultFile, wildcard=lang.getstr("filetype.x3d") + "|*.x3d", style=wx.SAVE | wx.FD_OVERWRITE_PROMPT) dlg.Center(wx.BOTH) result = dlg.ShowModal() dlg.Destroy() if result != wx.ID_OK: return x3dpath = dlg.GetPath() dirname = os.path.dirname(x3dpath) vrmlpath, x3dpath = [safe_unicode(path) for path in (vrmlpath, x3dpath)] if sys.platform == "win32": vrmlpath = make_win32_compatible_long_path(vrmlpath) x3dpath = make_win32_compatible_long_path(x3dpath) if html: finalpath = x3dpath + ".html" if sys.platform == "win32": finalpath = make_win32_compatible_long_path(finalpath) x3dpath = finalpath[:-5] else: finalpath = x3dpath if worker: worker.clear_cmd_output() worker.start(lambda result: show_result_dialog(result, wx.GetApp().GetTopWindow()) if isinstance(result, Exception) else result and view and launch_file(finalpath), x3dom.vrmlfile2x3dfile, wargs=(vrmlpath, x3dpath, html, embed, force, cache, worker), progress_title=lang.getstr("vrml_to_x3d_converter"), progress_start=1, resume=worker.progress_wnd and worker.progress_wnd.IsShownOnScreen(), fancy=False) else: result = x3dom.vrmlfile2x3dfile(vrmlpath, x3dpath, html, embed, force, cache, None) if not isinstance(result, Exception) and result and view: launch_file(finalpath) else: sys.exit(1) if __name__ == "__main__": main() DisplayCAL-3.1.0.0/DisplayCAL/wxwindows.py0000644000076500000000000055415612653526636020100 0ustar devwheel00000000000000# -*- coding: utf-8 -*- from datetime import datetime from time import gmtime, sleep, strftime, time import errno import math import os import re import socket import string import subprocess as sp import sys import tarfile import threading import warnings import xml.parsers.expat import zipfile import demjson import ICCProfile as ICCP import audio import config from config import (defaults, getbitmap, getcfg, geticon, get_data_path, get_default_dpi, get_verified_path, pyname, setcfg, confighome, appbasename, logdir, set_default_app_dpi) from debughelpers import getevtobjname, getevttype, handle_error from log import log as log_, safe_print from meta import name as appname from options import debug from ordereddict import OrderedDict from network import ScriptingClientSocket from util_io import StringIOu as StringIO from util_os import get_program_file, launch_file, waccess from util_str import safe_str, safe_unicode, wrap from util_xml import dict2xml from wxaddons import (CustomEvent, FileDrop as _FileDrop, get_platform_window_decoration_size, wx, BetterWindowDisabler, BetterTimer, EVT_BETTERTIMER) from wexpect import split_command_line from wxfixes import (GenBitmapButton, GenButton, GTKMenuItemGetFixedLabel, ThemedGenButton, adjust_font_size_for_gcdc, get_dc_font_size, set_bitmap_labels) from lib.agw import labelbook, pygauge from lib.agw.gradientbutton import GradientButton, HOVER from lib.agw.fourwaysplitter import (_TOLERANCE, FLAG_CHANGED, FLAG_PRESSED, NOWHERE, FourWaySplitter, FourWaySplitterEvent) import localization as lang import util_str import floatspin try: from wx.lib.agw import aui from wx.lib.agw.aui import AuiDefaultTabArt except ImportError: from wx import aui from wx.aui import PyAuiTabArt as AuiDefaultTabArt import wx.lib.filebrowsebutton as filebrowse from wx.lib import fancytext from wx.lib.statbmp import GenStaticBitmap import wx.html numpad_keycodes = [wx.WXK_NUMPAD0, wx.WXK_NUMPAD1, wx.WXK_NUMPAD2, wx.WXK_NUMPAD3, wx.WXK_NUMPAD4, wx.WXK_NUMPAD5, wx.WXK_NUMPAD6, wx.WXK_NUMPAD7, wx.WXK_NUMPAD8, wx.WXK_NUMPAD9, wx.WXK_NUMPAD_ADD, wx.WXK_NUMPAD_DECIMAL, wx.WXK_NUMPAD_ENTER, wx.WXK_NUMPAD_EQUAL, wx.WXK_NUMPAD_DIVIDE, wx.WXK_NUMPAD_MULTIPLY, wx.WXK_NUMPAD_SEPARATOR, wx.WXK_NUMPAD_SUBTRACT] def Property(func): return property(**func()) class AboutDialog(wx.Dialog): def __init__(self, *args, **kwargs): kwargs["style"] = wx.DEFAULT_DIALOG_STYLE & ~(wx.RESIZE_BORDER | wx.MAXIMIZE_BOX) kwargs["name"] = "aboutdialog" wx.Dialog.__init__(self, *args, **kwargs) self.set_properties() self.sizer = wx.BoxSizer(wx.VERTICAL) self.SetSizer(self.sizer) def set_properties(self): icon = wx.EmptyIcon() self.SetIcon(icon) def OnClose(self, event): self.Hide() def Layout(self): self.sizer.SetSizeHints(self) self.sizer.Layout() def add_items(self, items): self.ok = ThemedGenButton(self, -1, lang.getstr("ok")) self.Bind(wx.EVT_BUTTON, self.OnClose, id=self.ok.GetId()) items.extend([self.ok, (1, 16)]) pointsize = 10 for item in items: if isinstance(item, wx.Window): font = item.GetFont() if item.GetLabel() and font.GetPointSize() > pointsize: font.SetPointSize(pointsize) item.SetFont(font) flag = wx.ALIGN_CENTER_HORIZONTAL if isinstance(item, (wx.Panel, wx.PyPanel)): flag |= wx.EXPAND else: flag |= wx.LEFT | wx.RIGHT self.sizer.Add(item, 0, flag, 12) self.ok.SetDefault() self.ok.SetFocus() class AnimatedBitmap(wx.PyControl): """ Animated bitmap """ def __init__(self, parent, id=wx.ID_ANY, bitmaps=None, range=(0, -1), loop=True, pos=wx.DefaultPosition, size=wx.DefaultSize, style=wx.NO_BORDER): """ Create animated bitmap bitmaps should be an array of bitmaps. range should be the indexes of the range of frames that should be looped. -1 means last frame. """ wx.PyControl.__init__(self, parent, id, pos, size, style) self._minsize = size self.SetBitmaps(bitmaps or [], range, loop) # Avoid flickering under Windows self.Bind(wx.EVT_ERASE_BACKGROUND, lambda event: None) self.Bind(wx.EVT_PAINT, self.OnPaint) self._timer = BetterTimer(self) self.Bind(EVT_BETTERTIMER, self.OnTimer, self._timer) self.Bind(wx.EVT_WINDOW_DESTROY, self.OnDestroy) def OnDestroy(self, event): self._timer.Stop() del self._timer def DoGetBestSize(self): return self._minsize def OnPaint(self, event): dc = wx.BufferedPaintDC(self) dc.SetBackground(wx.Brush(self.Parent.BackgroundColour)) dc.Clear() if self._bitmaps: if self.frame > len(self._bitmaps) - 1: self.frame = len(self._bitmaps) - 1 dc.DrawBitmap(self._bitmaps[self.frame], 0, 0, True) def OnTimer(self, event): first_frame, last_frame = self.range if first_frame < 0: first_frame += len(self._bitmaps) if last_frame < 0: last_frame += len(self._bitmaps) frame = self.frame if frame < last_frame: frame += 1 elif self.loop: frame = first_frame if frame != self.frame: self.frame = frame self.Refresh() def Play(self, fps=24): self._timer.Start(1000.0 / fps) def Stop(self): self._timer.Stop() def SetBitmaps(self, bitmaps, range=(0, -1), loop=True): w, h = self._minsize for bitmap in bitmaps: w = max(bitmap.Size[0], w) h = max(bitmap.Size[0], h) self._minsize = w, h self._bitmaps = bitmaps self.loop = loop self.range = range self.frame = 0 class AuiBetterTabArt(AuiDefaultTabArt): def DrawTab(self, dc, wnd, page, in_rect, close_button_state, paint_control=False): """ Draws a single tab. :param `dc`: a :class:`DC` device context; :param `wnd`: a :class:`Window` instance object; :param `page`: the tab control page associated with the tab; :param Rect `in_rect`: rectangle the tab should be confined to; :param integer `close_button_state`: the state of the close button on the tab; :param bool `paint_control`: whether to draw the control inside a tab (if any) on a :class:`MemoryDC`. """ # if the caption is empty, measure some temporary text caption = page.caption if not caption: caption = "Xj" dc.SetFont(self._selected_font) if hasattr(dc, "GetFullMultiLineTextExtent"): # Phoenix selected_textx, selected_texty = dc.GetMultiLineTextExtent(caption) else: # Classic selected_textx, selected_texty, dummy = dc.GetMultiLineTextExtent(caption) dc.SetFont(self._normal_font) if hasattr(dc, "GetFullMultiLineTextExtent"): # Phoenix normal_textx, normal_texty = dc.GetMultiLineTextExtent(caption) else: # Classic normal_textx, normal_texty, dummy = dc.GetMultiLineTextExtent(caption) control = page.control # figure out the size of the tab tab_size, x_extent = self.GetTabSize(dc, wnd, page.caption, page.bitmap, page.active, close_button_state, control) tab_height = self._tab_ctrl_height - 3 tab_width = tab_size[0] tab_x = in_rect.x tab_y = in_rect.y + in_rect.height - tab_height caption = page.caption # select pen, brush and font for the tab to be drawn if page.active: dc.SetFont(self._selected_font) textx, texty = selected_textx, selected_texty else: dc.SetFont(self._normal_font) textx, texty = normal_textx, normal_texty if not page.enabled: dc.SetTextForeground(self._tab_disabled_text_colour) pagebitmap = page.dis_bitmap else: dc.SetTextForeground(self._tab_text_colour(page)) pagebitmap = page.bitmap # create points that will make the tab outline clip_width = tab_width if tab_x + clip_width > in_rect.x + in_rect.width: clip_width = in_rect.x + in_rect.width - tab_x # since the above code above doesn't play well with WXDFB or WXCOCOA, # we'll just use a rectangle for the clipping region for now -- dc.SetClippingRegion(tab_x, tab_y, clip_width+1, tab_height-3) border_points = [wx.Point() for i in xrange(6)] agwFlags = self.GetAGWFlags() if agwFlags & aui.AUI_NB_BOTTOM: border_points[0] = wx.Point(tab_x, tab_y) border_points[1] = wx.Point(tab_x, tab_y+tab_height-6) border_points[2] = wx.Point(tab_x+2, tab_y+tab_height-4) border_points[3] = wx.Point(tab_x+tab_width-2, tab_y+tab_height-4) border_points[4] = wx.Point(tab_x+tab_width, tab_y+tab_height-6) border_points[5] = wx.Point(tab_x+tab_width, tab_y) else: #if (agwFlags & aui.AUI_NB_TOP) border_points[0] = wx.Point(tab_x, tab_y+tab_height-4) border_points[1] = wx.Point(tab_x, tab_y+2) border_points[2] = wx.Point(tab_x+2, tab_y) border_points[3] = wx.Point(tab_x+tab_width-2, tab_y) border_points[4] = wx.Point(tab_x+tab_width, tab_y+2) border_points[5] = wx.Point(tab_x+tab_width, tab_y+tab_height-4) # TODO: else if (agwFlags & aui.AUI_NB_LEFT) # TODO: else if (agwFlags & aui.AUI_NB_RIGHT) drawn_tab_yoff = border_points[1].y drawn_tab_height = border_points[0].y - border_points[1].y if page.active: # draw active tab # draw base background colour r = wx.Rect(tab_x, tab_y, tab_width, tab_height) dc.SetPen(self._base_colour_pen) dc.SetBrush(self._base_colour_brush) dc.DrawRectangle(r.x+1, r.y+1, r.width-1, r.height-4) # this white helps fill out the gradient at the top of the tab dc.SetPen( wx.Pen(self._tab_gradient_highlight_colour) ) dc.SetBrush( wx.Brush(self._tab_gradient_highlight_colour) ) dc.DrawRectangle(r.x+2, r.y+1, r.width-3, r.height-4) # these two points help the rounded corners appear more antialiased dc.SetPen(self._base_colour_pen) dc.DrawPoint(r.x+2, r.y+1) dc.DrawPoint(r.x+r.width-2, r.y+1) # set rectangle down a bit for gradient drawing r.SetHeight(r.GetHeight()/2) r.x += 2 r.width -= 3 r.y += r.height r.y -= 2 # draw gradient background top_colour = self._tab_bottom_colour bottom_colour = self._tab_top_colour dc.GradientFillLinear(r, bottom_colour, top_colour, wx.NORTH) else: # draw inactive tab r = wx.Rect(tab_x, tab_y+1, tab_width, tab_height-3) # start the gradent up a bit and leave the inside border inset # by a pixel for a 3D look. Only the top half of the inactive # tab will have a slight gradient r.x += 2 r.y += 1 r.width -= 3 r.height /= 2 # -- draw top gradient fill for glossy look top_colour = self._tab_inactive_top_colour bottom_colour = self._tab_inactive_bottom_colour dc.GradientFillLinear(r, bottom_colour, top_colour, wx.NORTH) r.y += r.height r.y -= 1 # -- draw bottom fill for glossy look top_colour = self._tab_inactive_bottom_colour bottom_colour = self._tab_inactive_bottom_colour dc.GradientFillLinear(r, top_colour, bottom_colour, wx.SOUTH) # draw tab outline dc.SetPen(self._border_pen) dc.SetBrush(wx.TRANSPARENT_BRUSH) dc.DrawPolygon(border_points) # there are two horizontal grey lines at the bottom of the tab control, # this gets rid of the top one of those lines in the tab control if page.active: if agwFlags & aui.AUI_NB_BOTTOM: dc.SetPen(wx.Pen(self._background_bottom_colour)) # TODO: else if (agwFlags & aui.AUI_NB_LEFT) # TODO: else if (agwFlags & aui.AUI_NB_RIGHT) else: # for aui.AUI_NB_TOP dc.SetPen(self._base_colour_pen) dc.DrawLine(border_points[0].x+1, border_points[0].y, border_points[5].x, border_points[5].y) text_offset = tab_x + 8 close_button_width = 0 if close_button_state != aui.AUI_BUTTON_STATE_HIDDEN: close_button_width = self._active_close_bmp.GetWidth() if agwFlags & aui.AUI_NB_CLOSE_ON_TAB_LEFT: text_offset += close_button_width - 5 bitmap_offset = 0 if pagebitmap.IsOk(): bitmap_offset = tab_x + 8 if agwFlags & aui.AUI_NB_CLOSE_ON_TAB_LEFT and close_button_width: bitmap_offset += close_button_width - 5 # draw bitmap dc.DrawBitmap(pagebitmap, bitmap_offset, drawn_tab_yoff + (drawn_tab_height/2) - (pagebitmap.GetHeight()/2), True) text_offset = bitmap_offset + pagebitmap.GetWidth() text_offset += 3 # bitmap padding else: if agwFlags & aui.AUI_NB_CLOSE_ON_TAB_LEFT == 0 or not close_button_width: text_offset = tab_x + 8 draw_text = aui.ChopText(dc, caption, tab_width - (text_offset-tab_x) - close_button_width) ypos = drawn_tab_yoff + (drawn_tab_height)/2 - (texty/2) - 1 offset_focus = text_offset if control is not None: try: if control.GetPosition() != wx.Point(text_offset+1, ypos): control.SetPosition(wx.Point(text_offset+1, ypos)) if not control.IsShown(): control.Show() if paint_control: bmp = aui.TakeScreenShot(control.GetScreenRect()) dc.DrawBitmap(bmp, text_offset+1, ypos, True) controlW, controlH = control.GetSize() text_offset += controlW + 4 textx += controlW + 4 except wx.PyDeadObjectError: pass # draw tab text if hasattr(dc, "GetFullMultiLineTextExtent"): # Phoenix rectx, recty = dc.GetMultiLineTextExtent(draw_text) else: # Classic rectx, recty, dummy = dc.GetMultiLineTextExtent(draw_text) textfg = dc.GetTextForeground() shadow = wx.SystemSettings.GetColour(wx.SYS_COLOUR_3DLIGHT) dc.SetTextForeground(shadow) dc.DrawLabel(draw_text, wx.Rect(text_offset + 1, ypos + 1, rectx, recty)) dc.SetTextForeground(textfg) dc.DrawLabel(draw_text, wx.Rect(text_offset, ypos, rectx, recty)) # draw focus rectangle if (agwFlags & aui.AUI_NB_NO_TAB_FOCUS) == 0: self.DrawFocusRectangle(dc, page, wnd, draw_text, offset_focus, bitmap_offset, drawn_tab_yoff, drawn_tab_height, rectx, recty) out_button_rect = wx.Rect() # draw close button if necessary if close_button_state != aui.AUI_BUTTON_STATE_HIDDEN: bmp = self._disabled_close_bmp if close_button_state == aui.AUI_BUTTON_STATE_HOVER: bmp = self._hover_close_bmp elif close_button_state == aui.AUI_BUTTON_STATE_PRESSED: bmp = self._pressed_close_bmp shift = (agwFlags & aui.AUI_NB_BOTTOM and [1] or [0])[0] if agwFlags & aui.AUI_NB_CLOSE_ON_TAB_LEFT: rect = wx.Rect(tab_x + 4, tab_y + (tab_height - bmp.GetHeight())/2 - shift, close_button_width, tab_height) else: rect = wx.Rect(tab_x + tab_width - close_button_width - 1, tab_y + (tab_height - bmp.GetHeight())/2 - shift, close_button_width, tab_height) rect = aui.IndentPressedBitmap(rect, close_button_state) dc.DrawBitmap(bmp, rect.x, rect.y, True) out_button_rect = rect out_tab_rect = wx.Rect(tab_x, tab_y, tab_width, tab_height) dc.DestroyClippingRegion() return out_tab_rect, out_button_rect, x_extent def SetDefaultColours(self, base_colour=None): """ Sets the default colours, which are calculated from the given base colour. :param `base_colour`: an instance of :class:`Colour`. If defaulted to ``None``, a colour is generated accordingly to the platform and theme. """ if base_colour is None: base_colour = aui.GetBaseColour() self.SetBaseColour( base_colour ) self._border_colour = aui.StepColour(base_colour, 75) self._border_pen = wx.Pen(self._border_colour) self._background_top_colour = aui.StepColour(self._base_colour, 90) self._background_bottom_colour = aui.StepColour(self._base_colour, 120) self._tab_top_colour = self._base_colour self._tab_bottom_colour = aui.StepColour(self._base_colour, 130) self._tab_gradient_highlight_colour = aui.StepColour(self._base_colour, 130) self._tab_inactive_top_colour = self._background_top_colour self._tab_inactive_bottom_colour = aui.StepColour(self._base_colour, 110) self._tab_text_colour = lambda page: page.text_colour self._tab_disabled_text_colour = wx.SystemSettings.GetColour(wx.SYS_COLOUR_GRAYTEXT) class BaseApp(wx.App): """ Application base class implementing common functionality. """ _exithandlers = [] _mainloopexit = False def OnInit(self): self.AppName = pyname set_default_app_dpi() return True def MacOpenFiles(self, paths): if (self.TopWindow and isinstance(getattr(self.TopWindow, "droptarget", None), FileDrop)): self.TopWindow.droptarget.OnDropFiles(0, 0, paths) def MacReopenApp(self): if self.TopWindow and self.TopWindow.IsShownOnScreen(): self.TopWindow.Raise() def process_argv(self, count=0): paths = [] for arg in sys.argv[1:]: if os.path.isfile(arg): paths.append(safe_unicode(arg)) if len(paths) == count: break if paths: self.MacOpenFiles(paths) return paths def ExitMainLoop(self): BaseApp._mainloopexit = True try: self.TopWindow.listening = False except: pass BaseApp._run_exitfuncs() return wx.App.ExitMainLoop(self) @staticmethod def IsMainLoopRunning(): return not BaseApp._mainloopexit and wx.App.IsMainLoopRunning() def OnExit(self): BaseApp._run_exitfuncs() @staticmethod def _run_exitfuncs(): """run any registered exit functions _exithandlers is traversed in reverse order so functions are executed last in, first out. """ # Inspired by python's 'atexit' module. # It's important that the exit handlers run *before* the actual main # loop exits, otherwise they might not run at all if the app is closed # externally (e.g. if the OS asks the app to close on logout). # Using the 'atexit' module will NOT work! exc_info = None while BaseApp._exithandlers: func, args, kwargs = BaseApp._exithandlers.pop() try: func(*args, **kwargs) except SystemExit: exc_info = sys.exc_info() except: import traceback print >> sys.stderr, "Error in BaseApp._run_exitfuncs:" traceback.print_exc() exc_info = sys.exc_info() if exc_info is not None: raise exc_info[0], exc_info[1], exc_info[2] @staticmethod def register_exitfunc(func, *args, **kwargs): BaseApp._exithandlers.append((func, args, kwargs)) active_window = None responseformats = {} class BaseFrame(wx.Frame): """ Main frame base class. """ def __init__(self, *args, **kwargs): wx.Frame.__init__(self, *args, **kwargs) self.init() def FindWindowByName(self, name): """ wxPython Phoenix FindWindowByName descends into the parent windows, we don't want that """ for child in self.GetAllChildren(): if hasattr(child, "Name") and child.Name == name: return child def OnClose(self, event): self.listening = False if wx.GetApp().TopWindow is self and wx.GetApp().GetExitOnFrameDelete(): BaseApp._mainloopexit = True BaseApp._run_exitfuncs() event.Skip() def OnDestroy(self, event): self.listening = False event.Skip() def init(self): self.Bind(wx.EVT_ACTIVATE, self.activate_handler) self.Bind(wx.EVT_CLOSE, self.OnClose) self.Bind(wx.EVT_WINDOW_DESTROY, self.OnDestroy) def init_menubar(self): self.MenuBar = wx.MenuBar() filemenu = wx.Menu() quit = filemenu.Append(-1 if wx.VERSION < (2, 9) else wx.ID_EXIT, "&%s\tCtrl+Q" % lang.getstr("menuitem.quit")) self.Bind(wx.EVT_MENU, lambda event: self.Close(), quit) if sys.platform != "darwin": self.MenuBar.Append(filemenu, "&%s" % lang.getstr("menu.file")) def activate_handler(self, event): global active_window active_window = self def listen(self): if isinstance(getattr(sys, "_appsocket", None), socket.socket): addr, port = sys._appsocket.getsockname() if addr == "0.0.0.0": try: addr = socket.gethostbyname(socket.gethostname()) except socket.error: pass safe_print(lang.getstr("app.listening", (addr, port))) self.listening = True self.listener = threading.Thread(target=self.connection_handler, name="ScriptingHost.ConnectionHandler") self.listener.start() def connect(self, ip, port): if getattr(self, "conn", None): self.conn.disconnect() self.conn = ScriptingClientSocket() self.conn.settimeout(3) try: self.conn.connect((ip, port)) except socket.error, exception: del self.conn self.conn = None return exception return lang.getstr("connection.established") def connection_handler(self): """ Handle socket connections """ self._msghandlercount = 0 while self and getattr(self, "listening", False): try: # Wait for connection conn, addrport = sys._appsocket.accept() except socket.timeout: continue except socket.error, exception: if exception.errno == errno.EWOULDBLOCK: sleep(.05) continue break if (addrport[0] != "127.0.0.1" and not getcfg("app.allow_network_clients")): # Network client disallowed conn.close() safe_print(lang.getstr("app.client.network.disallowed", addrport)) sleep(.2) continue try: conn.settimeout(.2) except socket.error, exception: conn.close() safe_print(lang.getstr("app.client.ignored", exception)) sleep(.2) continue safe_print(lang.getstr("app.client.connect", addrport)) self._msghandlercount += 1 threading.Thread(target=self.message_handler, name="ScriptingHost.MessageHandler-%d" % self._msghandlercount, args=(conn, addrport)).start() sys._appsocket.close() def message_handler(self, conn, addrport): """ Handle messages sent via socket """ responseformats[conn] = "plain" buffer = "" while self and getattr(self, "listening", False): # Wait for incoming message try: incoming = conn.recv(4096) except socket.timeout: continue except socket.error, exception: if exception.errno == errno.EWOULDBLOCK: sleep(.05) continue break else: if not incoming: break buffer += incoming while "\n" in buffer and self and getattr(self, "listening", False): end = buffer.find("\n") line = buffer[:end].strip() buffer = buffer[end + 1:] if line: command_timestamp = datetime.now().strftime("%Y-%m-%dTH:%M:%S.%f") line = safe_unicode(line, "UTF-8") safe_print(lang.getstr("app.incoming_message", addrport + (line, ))) data = split_command_line(line) response = None # Non-UI commands if data[0] == "getappname" and len(data) == 1: response = pyname elif data[0] == "getcfg" and len(data) < 3: if len(data) == 2: # Return cfg value if data[1] in defaults: if responseformats[conn].startswith("xml"): response = {"name": data[1], "value": getcfg(data[1])} else: response = {data[1]: getcfg(data[1])} else: response = "invalid" else: # Return whole cfg if responseformats[conn] != "plain": response = [] else: response = OrderedDict() for name in sorted(defaults): value = getcfg(name, False) if value is not None: if responseformats[conn] != "plain": response.append({"name": name, "value": value}) else: response[name] = value elif data[0] == "getcommands" and len(data) == 1: response = sorted(self.get_commands()) elif data[0] == "getdefault" and len(data) == 2: if data[1] in defaults: if responseformats[conn] != "plain": response = {"name": data[1], "value": defaults[data[1]]} else: response = {data[1]: defaults[data[1]]} else: response = "invalid" elif data[0] == "getdefaults" and len(data) == 1: if responseformats[conn] != "plain": response = [] else: response = OrderedDict() for name in sorted(defaults): if responseformats[conn] != "plain": response.append({"name": name, "value": defaults[name]}) else: response[name] = defaults[name] elif data[0] == "getvalid" and len(data) == 1: if responseformats[conn] != "plain": response = {} for section, options in (("ranges", config.valid_ranges), ("values", config.valid_values)): valid = response[section] = [] for name, values in options.iteritems(): valid.append({"name": name, "values": values}) else: response = {"ranges": config.valid_ranges, "values": config.valid_values} if responseformats[conn] == "plain": valid = [] for section, options in response.iteritems(): valid.append("[%s]" % section) for name, values in options.iteritems(): valid.append("%s = %s" % (name, " ".join(demjson.encode(value) for value in values))) response = valid elif (data[0] == "setresponseformat" and len(data) == 2 and data[1] in ("json", "json.pretty", "plain", "xml", "xml.pretty")): responseformats[conn] = data[1] response = "ok" if response is not None: self.send_response(response, data, conn, command_timestamp) continue # UI commands wx.CallAfter(self.finish_processing, data, conn, command_timestamp) try: conn.shutdown(socket.SHUT_RDWR) except socket.error, exception: if exception.errno != errno.ENOTCONN: safe_print("Warning - could not shutdown connection:", exception) safe_print(lang.getstr("app.client.disconnect", addrport)) conn.close() responseformats.pop(conn) def get_app_state(self, format): win = self.get_top_window() if isinstance(win, wx.Dialog) and win.IsShown(): if isinstance(win, (DirDialog, FileDialog)): response = format_ui_element(win, format) if format != "plain": response.update({"message": win.Message, "path": win.Path}) else: response = [response, demjson.encode(win.Message), "path", demjson.encode(win.Path)] elif isinstance(win, (AboutDialog, BaseInteractiveDialog, ProgressDialog)): response = format_ui_element(win, format) if format == "plain": response = [response] if hasattr(win, "message") and win.message: if format != "plain": response["message"] = win.message.Label else: response.append(demjson.encode(win.message.Label)) # Ordering in tab order for child in win.GetAllChildren(): if (child and isinstance(child, (FlatShadedButton, GenButton, wx.Button)) and child.TopLevelParent is win and child.IsShownOnScreen() and child.IsEnabled()): if format != "plain": if not "buttons" in response: response["buttons"] = [] response["buttons"].append(child.Label) else: if not "buttons" in response: response.append("buttons") response.append(demjson.encode(child.Label)) elif win.__class__ is wx.Dialog: response = format_ui_element(win, format) if format == "plain": response = [response] else: return "blocked" if format == "plain": response = " ".join(response) return response if hasattr(self, "worker") and self.worker.is_working(): return "busy" return "idle" def get_commands(self): return self.get_common_commands() def get_common_commands(self): cmds = ["abort", "activate [window]", "alt", "cancel", "ok [filename]", "close [window]", "echo ", "getactivewindow", "getappname", "getcellvalues [window] ", "getcommands", "getcfg [option]", "getdefault ", "restore-defaults [category...]", "setcfg

Version history

2016-01-11 10:34 (UTC) 3.0.6.3

3.0.6.3

Fixed in this release:

  • Traceback after first run on some configurations.
2016-01-04 18:14 (UTC) 3.0.6.2

3.0.6.2

Fixed in this release:

  • Mac OS X: 'NoneType' error when creating a 3D LUT after profiling or trying to install/save a 3D LUT.
2015-12-24 19:34 (UTC) 3.0.6.1

3.0.6.1

Fixed in this release:

  • Standalone tools: If Argyll CMS executables were not found at launch, the dialog asking for their location closed immediately.
  • Mac OS X: Error message “'Menu' object has no attribute 'IsShownOnScreen'” when trying to use the menu or Cmd-Q to quit after using some of the controls.
  • Mac OS X: Find Argyll CMS reference files if Argyll CMS was installed via Homebrew.
  • Mac OS X: Application logfiles for standalone tools weren't written anymore (regression of r3431).
  • Mac OS X: Standalone tools couldn't be run in parallel to each other or the main application.
2015-12-21 21:12 (UTC) 3.0.6

3.0.6

Added in this release:

  • Support for the Q, Inc./Murideo Prisma video processor (pattern generation, 3D LUT upload).
  • Support for Argyll 1.8.3 (and newer) luminance preserving perceptual intent.
  • CIECAM02 viewing conditions for critical print evaluation environment (ISO-3664 P1) and television/film studio.

Changed in this release:

  • Advanced option: Smoother CIECAM02 perceptual and saturation gamut mapping for XYZ LUT profiles if the source profile is a matrix profile and “Enhance effective resolution of PCS to device tables” is enabled. Also works if creating CMYK (printer) profiles from existing reflective measurements (you can specify black generation and ink limiting parameters as additional commandline parameters to colprof).
  • Advanced option: Default CIECAM02 perceptual gamut mapping to (ICC) perceptual.
  • Profile information, 3D gamut visualization: Re-generate existing gamut visualization if involved profile(s) have a newer modification date than the visualization file(s).
  • When changing the 3D LUT input color space on the 3D LUT tab, automatically set a corresponding tone curve (match standalone 3D LUT maker behavior).

Fixed in this release:

  • Colorimeter correction creation: Reference instrument, manufacturer name/ID and observer choice weren't added to the correction file if it was created by Argyll CMS 1.8 or newer. This could prevent uploading the correction to the online database.
  • Optimize performance of adding log messages to the log window, especially under Mac OS X where enabling Argyll debug output could generate high CPU load and stall UI updates due to the huge amount of messages generated each second during measurements.
  • Re-enumerate 3D LUT input color space profiles when changing to a different Argyll CMS version.
  • When re-creating a profile from an existing measurement file or profile that contains 3D LUT settings, remove those settings from its enclosed settings container if automatic 3D LUT creation after profiling is disabled in the current configuration (prevents a 3D LUT being automatically created unexpectedly after re-creating the profile).
  • Curve viewer: Hovering a specific channel would display unexpected zero values for the other two channels in the status bar (regression of r3309, ${APPNAME} >= 3.0.3).
  • Mac OS X: Revert r3478 (${APPNAME} >= 3.0.4.3) which prevented custom values typed into comboboxes actually updating the configuration due to a Mac OS X specific wxWidgets bug that is not yet fixed in wxPython (#9862). Work-around the underlying problem that r3478 was meant to fix (wxPython 3 generates an EVT_TEXT when calling SetValue on a ComboBox, which could cause an infinite loop of events to be generated, wxPython 2.8 does not).
2015-11-26 21:14 (UTC) 3.0.5

3.0.5

Changed in this release:

  • Added Rec. 2020 as well as Rec. 709, SMPTE 431-2 (DCI P3) and Rec. 2020 derivatives with imaginary primaries to PCS candidates for enhancing the effective resolution of PCS to device tables, and set the default lookup table size to “Auto” (base 33x33x33, increased if needed).
  • Enabled verification without a display profile by using the simulation profile as output with its tone curve unmodified.

Fixed in this release:

  • Black point compensation (when enabled) was not being applied to PCS-to-device table when creating XYZ LUT profiles. Note that using black point compensation for LUT profiles is neither recommended nor required, as it needlessly reduces the accuracy of the profile, and LUT profiles by default are generated with a perceptual table that maps the black point.
  • Work-around a problem with i1D2 and Argyll 1.7 to 1.8.3 under Mac OS X 10.11 El Capitan where disabling interactive display adjustment would botch the first reading (black).
  • Calibration loader: Don't show bogus “Calibration curves could not be loaded” message when using Argyll CMS 1.8.3 and the display profile does not contain calibration (profiles not created by ${APPNAME} or Argyll CMS).
2015-09-25 22:16 (UTC) 3.0.4.3

3.0.4.3

Fixed in this release:

  • Restore 3D LUT source colorspace setting when loading a settings file.
  • Error message popup when selecting xvYCC encoding for eeColor (this input encoding is unsupported for eeColor 3D LUTs).
  • When selecting a settings file that changes the 3D LUT format, make sure the selectable 3D LUT encodings are updated.
  • File parsing errors when reading a measurement file to be used for a measurement report could prevent the main window from reappearing.
  • Profile 3D gamut view, testchart 3D diagnostic: X3D file could not be created if the file name started with a number.
  • Cosmetic: Standalone 3D LUT maker: Set controls to the correct state if no target profile is set and hide all irrelevant controls if using a device link profile as source profile.
  • Mac OS X: Hang when when changing whitepoint chromaticity coordinates.
2015-09-07 14:31 (UTC) 3.0.4.2

3.0.4.2

Changed in this release:

  • Show a progress dialog during user-initiated display and instrument enumeration to give some visual feedback (and the ability to cancel) in case it takes longer than expected.
  • Give initial display and instrument enumeration at startup a timeout of ten seconds.
  • Removed option to automatically detect new instruments.
  • Linux: Enable verifying display profiles only available via X atom.
  • Linux: Cache the current display profile on disk if it comes from an X atom to allow it to be used as preconditioning profile for the testchart editor or as destination profile for the standalone 3D LUT maker (the cache path is ~/.cache/icc/id=<profile-id>.icc).

Fixed in this release:

  • Sporadic failure to create a spectral colorimeter correction when using Argyll CMS 1.8 and newer.
  • Linux: Traceback when using the “Current profile” button on the testchart editor to set the preconditioning profile to the current display profile, and the display profile path is not available (e.g. if the profile comes from an X atom).
2015-09-01 12:56 (UTC) 3.0.4.1

3.0.4.1

Fixed in this release:

  • wxPython Phoenix compatibility: Ensure that timer notifications run in the main GUI thread.
  • Mac OS X: Fix Resolve pattern generator loosing sync immediately if ${APPNAME} is running standalone from a path that contains spaces.
2015-08-10 01:22 (UTC) 3.0.4

3.0.4

Added in this release:

  • Ability to create 3D LUTs in PNG (Portable Network Graphic) and ReShade format. The latter allows fully color managed Direct3D (8–11.2) and OpenGL applications (e.g. games) under Windows (Vista and higher).
  • Compatibility for updated Argyll CMS 1.8 Beta display technology mappings when creating colorimeter corrections.
  • “Apply calibration (vcgt)” to 3D LUT tab as advanced option, as well as a warning when installing a 3D LUT with applied calibration for a display with non-linear videocard gamma tables.
  • Option to enable/disable the 3D LUT tab.

Changed in this release:

  • Speed up calculation of 3D LUTs in 3DL, MGA, and SPI3D format when using a size smaller than 65x65x65.
  • Only prompt to import colorimeter corrections from the vendor software if none is currently selected.
  • Changed uniformity measurement report criteria to follow ISO 12646:2015 and allow selection of the layout to be used. “Update measurement or uniformity report” in the “Tools” menu can now also be used to update old uniformity reports.
  • The “Install profile” button changes to “Install 3D LUT” when on the 3D LUT tab.

Fixed in this release:

  • “Auto” colorimeter correction setting not selecting an available correction if the display device name contained the manufacturer name.
  • When creating a 3D LUT as part of a profiling run and if the path to Argyll CMS contained non-ASCII characters, profile creation failed with an Unicode error.
  • Linux (cosmetic): Background of some bitmap buttons was black when wxGTK is built against GTK3.
  • Linux (cosmetic): Splash screen mask not working correctly with wxPython 3 classic.
  • Mac OS X, Windows: Changing (only) the 3D LUT gamma type setting and creating a 3D LUT from an existing profile could lead to a confirmation prompt to overwrite an existing 3D LUT with a different gamma type setting, because this setting was differentiated in the 3D LUT file name with the uppercase or lowercase letter “B” (Windows and Mac OS X have a case-insensitive file system).

2015-07-09 15:00 (UTC) 3.0.3.1

3.0.3.1

Fixed in this release:

  • Make sure there are exactly 256 entries when saving the current videoLUT, otherwise dispwin will complain and not be able to load it back in. Fixes restoring current videoLUT after checking access under Linux when using a graphics card with more than 256 videoLUT entries per channel (e.g. nVidia Quadro).
2015-07-06 22:58 (UTC) 3.0.3

3.0.3

Added in this release:

  • Curve viewer and profile information: Detect more known tone response curves.
  • Colorimetric observer choice as advanced calibration option for instruments that support it (i.e. spectrometers as well as i1 Display Pro, ColorMunki Display and Spyder 4/5).
  • Synthetic ICC profile creator:
    • SMPTE 2084 HDR tone response curve option.
    • Re-introduced black point compensation option.

Changed in this release:

  • All remaining presets now use testchart auto-optimization for best profiling accuracy. Setting the patch amount slider to 73 or 97 patches will create a simple matrix-based profile aimed at quickly profiling high quality professional displays that are often very linear and have good additive color mixing properties.
  • When saving a 3D LUT for Resolve, try to find the Resolve LUT folder automatically.
  • When saving an existing 3D LUT, pre-fill the filename field in the file dialog with the existing name instead of “Unnamed”.
  • During interactive display adjustment, allow cancelling without confirmation and don't show “Calibration has not been finished” message.
  • Removed most pre-baked testcharts.
  • Improved the help text on the “Profiling” tab.

Fixed in this release:

  • When creating a profile and accompanying 3D LUT (from new measurements) that overwrite existing files with the same name (popup confirmation before commencing measurements), the progress dialog was never closed automatically and the application window never re-enabled after creating the profile. This could happen if the profile name didn't contain a fine grained enough time or other component distinguishing it from the name of the existing files, e.g. when measuring and creating two or more profiles as well as accompanying 3D LUTs, for the same display, with the same settings, in a single session one after the other.
  • When switching to the “Untethered” display, the “Profile only” button wasn't shown if not already visible.
  • Verifying using a device link profile that alters (corrects) device white on a display that was not adjusted to match the target whitepoint using the display controls, showed higher than actual errors in the measurement report (device link and 3D LUT being fine regardless) due to the report not accounting for the difference of unaltered (uncorrected) device white versus altered (corrected) device white.
  • Set 3D LUT verification options for Resolve automatically after profile generation.
  • Switching from pre-baked testchart to “Auto” and back to same previous pre-baked chart didn't work (was still using “Auto” testchart).
  • When changing the calibration tone curve of an existing profile (that used 1D LUT calibration) to “As measured”, store the updated setting in newly created profiles (unless using an existing calibration).
  • After creating a 3D LUT that incorporates 1D LUT calibration and previewing this calibration on a display connected directly to the system when saving/installing the 3D LUT, restore video card gamma table to the current display profile calibration (if any) afterwards.
  • Creating colorimeter correction with non-7-bit-ASCII characters in the description.
  • Added workaround for undecodable strings in some 3rd party ICC profiles.
  • Restoring defaults from the “Options” menu no longer resets the contribution popup “Do not show again” preference.
  • Cosmetic: Work-around Argyll CMS 1.7 (harmless) warning message “Spyder: Measuring refresh rate failed” when using the Spyder4/5 with measurement modes “LCD (CCFL)” or “LCD (White LED)”.
  • Synthetic ICC profile creator:
    • Very low non-zero black points (Y around 0.0015 on a 0..100 scale) were parsed as zero from existing profiles due to rounding down to the next legal 16-bit ICC profile v2 encoded value.
    • Parsing grayscale profiles and profiles with a PCS other than CIE XYZ now works.
  • madTPG network interface cross-platform support (Linux/Mac OS X): Reset video card gamma table when calibrating.
  • Linux: Work-around visual wxPython quirks when wxGTK is built against GTK3.
  • Linux (cosmetic): Prefer pygame audio backend to avoid fade crackling.
2015-06-08 00:08 (UTC) 3.0.2

3.0.2

Added in this release:

  • Instrument first-time setup (i.e. importing colorimeter corrections) will now automatically run when it hasn't been run before.

Changed in this release:

  • Removed black point correction choice when switching to “refresh” measurement mode.
  • Cosmetic: Always show main buttons, but disable them if no action is possible.

Fixed in this release:

  • Mac OS X (standalone): Use bundled python when running from application bundle (fixes Resolve and madTPG interface).
  • Windows: Installing a profile as system default wasn't working correctly when UAC was enabled (regression of a change in 3.0.1).
2015-05-31 20:35 (UTC) 3.0.1

3.0.1

Added in this release:

  • madTPG network interface cross-platform support. This means you can now connect from Linux or Mac OS X to madTPG running under Windows.
  • Functionality to change display profile (and calibration) whitepoint of existing profiles without re-measuring (no UI, only available via the command line). This is more or less a gimmick and should not be used if colorimetric accuracy is important, but should result in a more precise white point change than using (for example) f.lux or redshift because it fully takes into account the profile colorimetry, although white point shifting in real time is not supported.
  • Option to enable/disable startup sound.
  • Additional verification testcharts (roughly 750 and 1000 patches in size).
  • Output number placeholder for use in the profile name (as another means to disinguish equal display models).

Changed in this release:

  • Force planckian locus in measurement reports if color temperature is >= 1667 and < 4000.
  • Improve “enhance effective resolution of PCS-to-device tables” slightly: Move CAM Jab clipping blending region from 50%..100% to 33%..75% in the cLUT grid. This improves inverse profile self check errors very slightly and in some cases visually further improves gamut mapping smoothness in the blue region for gamuts that are really limited there (e.g. Laptops/Notebooks, cheap TN panels).

Fixed in this release:

  • Uniformity measurements not working with spectrometer if instrument self-calibration is performed during the measurements.
  • Work-around Python 2.7 configuration file parsing bug if configuration file gets corrupted (e.g. through hard disk issues, destructive edits or similar).
  • When installing a profile, always copy it to a temporary directory first so if accidentally installing a profile from the location where it's already installed (e.g. system32\spool\drivers\color) it doesn't get nuked by dispwin.
  • Cosmetic: Fix “ProgressDialog object has no attribute 'remaining_time'” when the fancy progress dialog is disabled under “Options” and using the testchart editor to create a testchart.
  • Chromecast messing with display enumeration under Linux and Mac OS X.
  • If missing, add DISPLAY_TYPE_BASE_ID to colorimeter correction matrix (CCMX) files when reading (fixes “Instrument access failed” when using Argyll CMS 1.7 with older CCMX files).
  • When creating a synthetic ICC profile with Rec. 1886 tone response curve and a black level of zero, the fallback gamma value of 2.2 was used instead of the configured gamma of 2.4.
2015-05-02 22:11 (UTC) 3.0

3.0

Added in this release:

  • Tabbed user interface. See screenshots.
  • Full support for Argyll CMS 1.7.0, which includes support for the ColorHug2, K-10A, Spyder5, the capability to use a Google Chromecast as pattern generator, and more. Note that the accuracy of using a ChromeCast is limited due to the internal RGB to YCbCr conversion and upscaling in the device.
  • Optional automatic testchart optimization as part of the characterization process.
  • madTPG launches automatically when used (requires madVR 0.87.12 or later).
  • Optionally create a 3D LUT automatically after profiling. 3D LUT settings are stored in the profile and synced with measurement report settings when loaded.
  • 1-click install of madVR 3D LUTs after generation (requires madVR 0.87.12 or later).
  • 3D LUT maker: Optionally allow to use PCS-to-device instead of inverse device-to-PCS gamut mapping. This allows for fast creation of 3D LUTs, but the result is dependent on the quality and accuracy of the profile's B2A tables.
  • 3D LUT maker/measurement report: Added an option to just apply black output offset to the tone response curve instead of overriding it completely. This option is only available for source profiles that have a tone response curve which is not defined by a simple power function (e.g. sRGB). Also added a warning message if input values would be clipped when using the tone response curve unmodified.
  • Show reference versus corrected colorimeter measurements along with delta E when creating a colorimeter correction matrix.
  • Optionally clip WTW on input when creating a 3D LUT (requires Argyll CMS 1.7 or later).
  • Additional error checking for patterngenerator network interface: Check if each Argyll test pattern update is followed by a network send. Fail with a sync error otherwise.
  • Easily create a compressed archive of the currently selected profile and related files with the click of a button next to the “Settings” dropdown.
  • Testchart editor:
    • Support loading of CGATS files which do not contain XYZ values.
    • CSV import (drag and drop a CSV file) and export.
    • Export 16-bit PNG and TIFF or 10-bit DPX files.
    • Improved speed of image file export.
    • Dragging and dropping image files extracts and adds reference patches if a preconditioning profile is set.

Changed in this release:

  • Generate XYZ LUT profiles by default and for all presets. Consequently, black point compensation now defaults to off and is an advanced option (not shown by default).
  • XYZ LUT + matrix profiles will always have black point compensated matrix TRC tags. That way “dumb” applications which fall back to the matrix won't clip shadow detail if they don't support BPC internally, while “smart” applications can use the accurate LUTs.
  • When creating XYZ LUT profiles with enhanced effective PCS-to-device table resolution, improve reproduction of saturated colors for displays with limited gamut (e.g. smaller than sRGB), increasing visible detail and saturation in those areas. This should typically affect saturated blues the most. Users of displays that cover most of sRGB except parts of the blue region may see an improvement as well. Also, more accurately encode the PCS-to-device black point.
  • Show display technology type of spectral colorimeter corrections and sort by the shown name instead of the filename.
  • Moved display update delay and settle time controls to main window (“Show advanced options” must be enabled).
  • Force a minimum display update delay of 600 ms for Resolve irrespective of chosen preset.
  • Don't unload current settings file when changing calibration tone curve to “As measured”.
  • When creating a profile, automatically filter out XYZ = 0 readings if the RGB stimulus is < 5% (except black).
  • Files generated during incomplete/failed runs are moved to a different location than the storage directory. See “User data and configuration file locations”, “Incomplete/failed runs”. Compare the list of files in the temporary directory and their modification times before and after running Argyll CMS tools to determine if files should be kept in case of errors.
  • When updating via Zero Install, force exact version.
  • 3D LUT: Default to 65x65x65 cube for all 3D LUT formats except Pandora (.mga) which only supports 17x17x17 and 33x33x33.
  • 3D LUT: Default to 16..235 TV level encoding for the eeColor.
  • Measurement report: Changed displayed range of Y to be always 0..100 with four decimal digits.
  • Linux, Windows: On application startup, the current video LUT is restored after checking video LUT access. This differs from the previous behavior where the video LUT was reset to the calibration (if present) of the currently assigned display profile(s) (if any).

Fixed in this release:

  • Error message when trying to quit the application while the “About” dialog was shown (regression of a change in 2.6 how lingering dialogs are handled on application exit).
  • Using Resolve as pattern generator prevented ambient measurements.
  • Fixed bug with Resolve interface related to APL that resulted in pattern updates being rejected by Resolve due to negative background RGB. This could happen with bright patches if the test patch size was above roughly 30% and below 100% screen area.
  • Due to file descriptors for session logfiles not being closed after being done with the file, ${APPNAME} could run out of available file descriptors when used to create or inspect a large amount of profiles in a single session.
  • Disabled rollover for session logfiles.
  • Worked around uninitialized variables with Argyll's xicclu utility in versions 1.6.x to prevent unexpected color lookup output values.
  • Make sure the 1% reading during calibration check measurements doesn't trigger continuing to the following step.
  • Clicking the “Pause” button on the progress dialog in the first few seconds before instrument initialization was complete would not pause measurements, and disabled the button until clicking “Cancel”.
  • Verifying a device link created with an encoding other than full range RGB.
  • Curve viewer: Amount of tone values and grayscale % for calibration curves was not calculated correctly if the number of entries was not 256.
  • Testchart editor: Deleting a selection of non-consecutive rows didn't work correctly.
2014-11-15 20:46 (UTC) 2.6

2.6

Added in this release:

  • Scripting support (locally and over the network).
  • Possibilty to do spectrometer self-calibration on its own (look in the “Options” menu). Useful in conjunction with “Allow to skip spectrometer self-calibration”.
  • Curve viewer, profile information: Support plotting tone response curve of grayscale profiles.
  • wxPython 3.0.2 “Phoenix” compatibility.
  • Linux: Install/uninstall instrument configuration files (udev rules/hotplug scripts) from the “Tools” menu.

Changed in this release:

  • Use extended testchart as default for matrix profiles.
  • When switching profiles or displays, make sure the measurement report and 3D LUT creation windows are updated accordingly if shown.
  • Unset Argyll display update delay/settle time environment variables after disabling their override when they were not set initially.
  • All standalone tools have separate configuration files (overridden by main configuration if newer and vice versa) and logfiles.
  • VRML to X3D converter can now do batch processing.
  • Enhanced UI for colorimeter correction creation.
  • Limit the ability to create colorimeter corrections for the Klein K-10 to factory measurement mode.
  • Detect instruments at startup if no instruments were previously configured.
  • Changed “Resolve” preset to use a minimum display update delay of 600 ms and constant APL patterns by default.
  • Restore defaults for display update delay and settle time multiplier when loading settings without override.
  • Linux: The system-wide configuration file is ignored except for the profile loader.

Fixed in this release:

  • Calibration curve plot was not working anymore for profiles with formula-type vcgt tags (regression of r2384, did not affect Argyll-generated profiles).
  • Re-use existing Resolve connection if possible and only shut it down on application exit (fixes “Address already in use” error under Linux and Mac OS X).
  • When using Resolve, the measurement window position and size aswell as the “Use black background” setting were not correctly stored in the generated calibration file and/or profile and could thus not be restored by loading the file(s).
  • When exporting test patches as image files, limit pixel dimensions to FullHD (fixes memory error when exporting fullscreen patches).
  • When applying a tone response curve to an existing profile, make sure curve values can't become negative at and near zero input.
  • Fix generation of synthetic grayscale profiles.
  • Linux (only if Argyll CMS was installed via Zero Install)/Mac OS X/Windows: If the Argyll CMS directory was not explicitly configured, Argyll CMS reference profiles (e.g. Rec709.icm) were not added automatically to file dropdown lists and the “Install Argyll CMS instrument drivers...” menu item (Windows only) was grayed out (this impacted convenience, not functionality).
  • Cosmetic, Mac OS X 10.8 and earlier: Splash screen had a light gray border instead of being semi-transparent.
  • Mac OS X 10.10 Yosemite: Disable functionality to load/clear calibration like under Mac OS X 10.6 and up.
2014-09-06 00:07 (UTC) 2.5

2.5

Added in this release:

  • Argyll CMS 1.7 beta compatibility: Klein K10-A support (requires Argyll CMS 1.7 beta test 2014-05-21 or newer) and updated technology strings for colorimeter correction creation. When creating 3D LUTs with Rec. 1886 or custom tone response curve, force RGB source 0 0 0 to map to RGB destination 0 0 0 (requires Argyll CMS 1.7 beta development code 2014-07-10 or newer).
  • Enable black output offset instead of all-input offset for 3D LUTs, measurement report and synthetic profile creation (based on Argyll CMS 1.7 beta development code 2014-07-12, thanks to Graeme Gill). Note that for 3D LUTs, if using output offset ideally Argyll CMS 1.7 should be used aswell once it becomes available since the current implementation in ${APPNAME} that enables output offset when used with Argyll CMS 1.6.3 or older has limited 16-bit precision for the black point mapping (due to the implementation altering the source profile TRC on-the-fly in that case, and the ICCv2 16-bit encoding used for the TRC tags in the source profile), while Argyll CMS 1.7 will enable full floating point processing (due to the black point mapping then taking place internally in collink, and ${APPNAME} not having to alter the source profile TRC beforehand).
  • Black point can be specified in XYZ or chromaticity coordinates when creating a synthetic ICC profile.
  • When dropping an existing profile onto the synthetic ICC profile creation window, set whitepoint, primaries, blackpoint and tone response curve (average) according to the profile.
  • Support for the Resolve 10.1 (and newer) CM pattern generator. See also 3D LUT creation workflow for Resolve on the ${APPNAME} Wiki.
  • Enable interactive display adjustment without creating calibration curves by setting “Tone curve” to “As measured”. This also causes all calibration setting placeholders in the profile name to be ignored.
  • Added options to override the minimum display update delay (requires Argyll CMS 1.5 or newer) and display settle time multiplier (requires Argyll CMS 1.7 Beta or newer). These options can be found in the “Set additional commandline arguments...” window accessible from the “Options” menu. Note that these two settings (unlike the additional commandline parameters) are stored in the profile, and will be restored when the profile is selected again under “Settings”.
  • Testchart editor: If generating any number of iterative patches as well as single channel, gray or multidimensional patches, it is possible to add the single channel, gray and multidimensional patches in a separate step by holding the shift key while clicking on “Create testchart”. This prevents those patches affecting the iterative patch distribution, with the drawback of making the patch distribution less even. This is an experimental feature.
  • Windows: Simplified Argyll CMS instrument driver installation by adding a respective menu item to the “Tools” menu.

Changed in this release:

  • Visual overhaul.
  • Calibration curves are no longer automatically loaded into the video card gamma table when loading a settings file. To manually load calibration curves into the video card gamma table, choose “Load calibration curves from calibration file or profile...” in the “Options” menu (Linux and Windows only), or install a profile, or use the “Preview calibration” checkbox (Linux and Windows only) in the profile installation dialog. The previous behavior can be restored by editing ${APPNAME}.ini and adding a line calibration.autoload = 1.
  • Split “Smooth B2A tables” into “Enhance effective resolution of colorimetric PCS[11]-to-device table” and “Smoothing” options and moved them to advanced gamut mapping options.
  • Renamed “Apply BT.1886 gamma mapping” to “Apply tone response curve”.
  • Always override the source profile tone response curve when using “Apply tone response curve” (3D LUT creation and measurement report) so the result will be correct for the chosen parameters regardless of source profile tone response curve.
  • Removed black point compensation option from synthetic profile creation window.
  • Changing the black level or black point Y value when creating a synthetic ICC profile now rounds up or down to make it a multiple of the 16-bit encoding precision used in ICC v2 profiles (which is roughly 0.00153 when normalized to 0..100).
  • Re-enabled moving the standalone curve viewer between displays updating the graph according to the display it is currently on.
  • Always append the measurement mode to the instrument string in the measurement report.
  • Confirm quitting the application (via the application menu “Quit” item or the associated keyboard shortcut) if a task is still running (in practice this only affects Mac OS X as the menu is not accessible on other platforms while a task is running).
  • When selecting “Locate Argyll CMS executables...” in the menu to switch to a different Argyll CMS version, automatically detect if a newer version is on the search path and offer to use it right away without having to manually browse to the location.
  • Renamed “Gamma” entry in calibration tone response curve dropdown to “Custom” to emphasize that it is a curve with custom gamma exponent and other parameters.
  • When switching calibration tone response curve from Rec. 1886 to custom, restore the previous gamma and black output offset parameters (or defaults in case a preset was used).
  • Show an error message if trying to measure the ambient light color with an instrument which only has a monochrome ambient sensor (e.g. Spyder 3 and 4 Elite or Pro).
  • Importing colorimeter corrections and enabling the Spyder 2 is now truly automatic (necessary files are downloaded if not present on the local system).
  • Made black level control an advanced calibration option.
  • Loading a profile that does not contain calibration settings sets all calibration options to “As measured”.
  • When creating or loading a profile (except presets), it is now automatically set as the current profile in the measurement report and 3D LUT creation windows.
  • Enabled interactive display adjustment for the madVR and Resolve presets and altered them to not do video card gamma table calibration by default.
  • All presets that create LUT profiles use optimized testcharts.
  • When a virtual display is selected, don't offer profile installation but 3D LUT creation instead.
  • ReadMe: Completed testchart editor documentation.
  • Testchart editor: Always enable “Add saturation sweeps” and “Add reference patches...” controls when a preconditioning profile is set, regardless of selected patch distribution and adaptation.
  • Testchart editor: When enabling/disabling the preconditioning profile, set adaptation to 100%/10% respectively.
  • Testchart editor: Greatly improved the speed of inserting patches into large testcharts with thousands of patches.
  • Linux, profile installation: Try to install the profile using all available systems regardless if one of them fails to install the profile. Only report profile installation as failed if all available systems failed to install the profile. Report specific failures when profile installation only partly succeeds.
  • Linux, profile installation: Try colormgr as fallback (if available) if profile installation using Argyll 1.6+ failed.
  • Linux: Use the EDID MD5 to find the device ID (this only works with colord versions released after 26. Apr. 2013).
  • Mac OS X: No longer require administrator privileges if running from a non-administrator user account.
  • Windows Vista and newer: Enable system-wide profile and OEM files installation without the need to run the whole application as administrator. The UAC shield icon is shown on buttons if an action requires administrator privileges.

Fixed in this release:

  • The “Apply BT.1886 gamma mapping” checkbox in the 3D LUT creation window did re-enable itself when clicking on “Create 3D LUT” if Rec709.icm was selected as source profile.
  • Synthetic ICC profile creation: Setting gamma to absolute or relative when not using Rec. 1886 now actually makes a difference (previously the end result was always an absolute curve).
  • “Show actual calibration curves from video card” could not be enabled in the standalone curve viewer if the previously selected display did not allow video LUT access.
  • Measuring the ambient light level with an instrument which only has a monochrome ambient sensor (e.g. Spyder 3 and 4 Elite or Pro).
  • If loading a settings file created with automatic black point hue correction, that setting was not restored and the default value of no correction was used.
  • When doing a “Profile only” and using the current calibration from the video card gamma table, Argyll CMS expects 256 entries. Interpolate on-the-fly if the number of entries in the video card gamma table is not 256 (this currently only affects Mac OS X 10.9 and newer where the table contains 1024 entries).
  • If the display manufacturer string recorded in a profile was the same as the three-letter manufacturer ID string (e.g. NEC), the profile could not be uploaded to the openSUSE ICC Profile Taxi service due to a bogus “missing metadata” error message (regression of r1422).
  • Profile information window: Color coordinates in the status bar were wrong if the selected colorspace was not a*b* (bug introduced in ${APPNAME} 2.0).
  • The specbos 1201 was not working due to not supporting measurement mode selection.
  • When getting normalized vcgt tag values, scaling was off if the vcgt wasn't 16-bit. This prevented e.g. the measurement report from working with certain 3rd-party display profiles.
  • Cosmetic: Correct padding of the patch number in the measurement report summary (fixes missing padding when multiple patches are evaluated for a single criterion).
  • Trivial: Tab order of controls (top-down, left-right).
  • Testchart editor: IndexError if trying to add saturation sweeps or reference patches when no cells are selected.
  • Linux, profile installation: Do not regard a missing colormgr as error.
  • Mac OS X: Selecting “About”, “Locate Argyll CMS executables...” (preferences) and “Quit” in the application menu does something again (this stopped working with the move to wxPython 3.0 GUI library in ${APPNAME} 2.0).
2014-05-11 19:00 (UTC) 2.1

2.1

Added in this release:

  • “Auto” measurement mode for the ColorHug. This will automatically create a colorimeter correction with the reference based on EDID[10] as part of the normal measurement process. This is a work-around for the red primary shift problem that some ColorHug users are experiencing (note that this will make ColorHug measurements closely match the gamut boundaries defined by the primaries and whitepoint from EDID). This mode should only be used as a last resort if no colorimeter correction with reference measurements from a spectrometer or other known accurate instrument can be obtained.
  • Auto-update functionality. Apply updates from within ${APPNAME} under Mac OS X and Windows, or if using Zero Install.

Changed in this release:

  • Improved Zero Install integration. Installation is now as simple as a standalone installation.
  • Switched “Smooth B2A tables” off and “Low quality B2A tables” back on for the madVR preset to save some time during profile generation.
  • The HTML-embedded X3D viewer will now by default try and load its components from the web, with a fallback to a locally cached copy (if available) and not anymore the other way around. This means generated HTML files will automatically use updated viewer components when an internet connection is available.
  • Choosing “Profile information” from the “File” menu will now always present a file dialog to pick a profile and no longer use the profile currently selected in the main window (this functionality is still available via the small blue “Info” button next to the settings dropdown).
  • Show profile information with right pane expanded by default.
  • Don't lock measurement mode for colorimeter corrections, instead set colorimeter correction to none if an incompatible measurement mode is selected.
  • Allow black point compensation if “low quality B2A tables” is enabled.
  • Windows: Limit profile name length so that the length of the path of the temporary directory plus the length of the profile name does not exceed 254 characters (which is the maximum useable length for Argyll CMS tools where an extension with a length of four characters is added automatically).

Fixed in this release:

  • When using the ColorHug in “Factory” or “Raw” measurement mode in ${APPNAME} (r1378 or later) with a colorimeter correction that was created with Argyll CMS 1.5 or later, the measurement mode was being locked to the wrong mode (a colorimeter correction created in “Factory” mode would lock to “Raw” and vice versa).
  • Transpareny rendering in the HTML-embedded X3D viewer: Transparency is now gamma-corrected.
  • Tone response curves plot: Removed the very slight interpolation offset error at zero input (around +0.5 RGB on a 0-255 scale for a synthetic 16-bit tone response curve following a gamma of 2.2 with no black offset) for tone response curves that have zero output at non-zero input.
  • Trying to open files with unicode characters in their filename or path in the standalone testchart editor, curve viewer, profile information, or VRML to X3D converter application from the commandline, via the desktop's “open with” functionality, or by assigning a supported filetype to be opened with the respective application failed (dragging and dropping the file onto the respective application window worked fine).
  • Correctly reflect in the GUI if black point compensation can be applied. Black point compensation is available for curves + matrix profiles and XYZLUT profiles with either “low quality B2A tables” or “smooth B2A tables” enabled.
  • Linux: Fixed a problem with unicode when querying colord for the current display profile (regression of r1832).
  • Windows: Report could not be saved after finishing display uniformity measurements due to the file dialog not receiving mouse clicks or keyboard input.
  • Windows: Work-around python issues with long pathnames (>= 260 characters).
2014-04-23 00:43 (UTC) 2.0

2.0

Added in this release:

  • New profiling option “smooth B2A tables” for XYZ LUT profiles. This should improve the smoothness of the relative colorimetric gamut mapping. Enabling this option will also generate a simple but effective perceptual mapping (which will be almost identical to the colorimetric mapping, but map the black point) if no other advanced gamut mapping options have been chosen.

    See below example images for the result you can expect (note though that the particular synthetic image chosen, a “granger rainbow”, exaggerates banding, real-world material is much less likely to show this).

    Original Granger Rainbow image

    Original “granger rainbow” image

    Granger Rainbow - default colorimetric rendering

    Default colorimetric rendering (2500 OFPS XYZ LUT profile)

    Granger Rainbow - “smooth” colorimetric rendering

    “Smooth” colorimetric rendering (2500 OFPS XYZ LUT profile, inverted A2B)

    Granger Rainbow - “smooth” perceptual rendering

    “Smooth” perceptual rendering (2500 OFPS XYZ LUT profile, inverted A2B)

    For the test, the image has been converted from sRGB to the display profile. Note that the sRGB blue in the image is actually out of gamut for the specific display used, which made the test particularly challenging (the edges visible in the blue gradient for the rendering are a result of the color being out of gamut, and the gamut mapping thus hitting the less smooth gamut boundaries).

    Technical discussion: “smooth B2A tables” works by inverting the already present A2B colorimetric table, making use of Argyll CMS to do clipping in CAM Jab for saturated colors. A new cLUT, cLUT matrix and cLUT device channel curves are then generated. The matrix and device channel curves scale and transform the input values to distribute them across the cLUT grid points, trying to make good use of the limited number of points. Additional smoothing is then applied to the cLUT (this can be disabled by editing ${APPNAME}.ini and adding a line profile.b2a.smooth.extra = 0). Diagnostic PNG images are created for each of the B2A cLUT tables (pre/post/post smoothing). This approach is relatively straightforward, but seems very effective in creating a smooth yet accurate mapping. There is a drawback though, if the native device gamut boundary is bumpy, the error at the gamut boundary and thus the max error can go up. In most cases, I feel this will be acceptable, and the smoothness and often also increased in-gamut accuracy should make up for the potential higher max error. If you're interested, you can check the error of the B2A table vs the A2B table by running (in a terminal) invprofcheck -k -h -w -e on the profile, and compare it to the error of a profile where “smooth B2A tables” was not used. Comments and feedback welcome as always.

  • Synthetic ICC profiles can be created with DICOM or BT.1886 tone response curve, with or without black offset, and can either be RGB (curves + matrix) or gray (curves only).
  • Expanded the color space choices for profile gamut views with L*u*v* and DIN99 family colorspaces.
  • Expanded the color space choices for diagnostic 3D views of testcharts with HSI, HSL, DIN99 family, LCH(ab), LCH(uv), L*u*v*, Lu'v' and xyY colorspaces. To differentiate the LCH(ab) and LCH(uv) views from L*a*b* and L*u*v* respectively, a layout where the hue angle increases along the horizontal and chroma along the vertical axis is used.
  • 3D views of profile gamuts and testcharts can be created as VRML, X3D, or X3D in HTML with embedded viewer for WebGL-enabled browsers.
  • VRML to X3D standalone converter. Output options are X3D (XML) and X3D in HTML. The HTML files generated by default use the X3DOM runtime to implement a viewer, which requires a WebGL-enabled browser. The converter can be run from a terminal without GUI. Run it with the --help argument to view the list of options.
  • Rendering intent and direction selector for curve viewer tone response curve plot. Also changed layout of controls slightly.
  • LUT checkbox to profile info gamut view (if the profile is a LUT profile and contains both LUT and matrix tags). This allows inspecting the gamut characterized by the LUT versus the one defined by the matrix.
  • Show estimated remaining time in the progress dialog if applicable. Note that it is not always particularly accurate, and for operations consisting of multiple steps (e.g. calibration & profiling), the shown estimate is for the current (sub-)step only.

Changed in this release:

  • Slightly adjusted presets:
    • Changed “madVR” and “Video” presets to use Rec. 1886 as calibration target.
    • Changed “Prepress” and “Softproof” presets to use full black point hue correction during calibration.
    • Disabled interactive display adjustment for “Laptop” preset.
    • Set profile type for those presets that defaulted to curves + matrix to single curve + matrix.
  • Changed profile black point compensation option to map the black point to zero more reliably. This means black point compensation can no longer be used for L*a*b* LUT profiles, and will only be applied to the LUT part of XYZ LUT profiles if the new “smooth B2A tables” profiling option is used.
  • Changed 3D LUT and measurement report settings to automatically enable/disable Rec. 1886 gamma mapping if the source profile has/doesn't have a known “camera” transfer function (e.g. SMPTE 240M or Rec. 709).
  • Unlocked calibration Rec. 1886 gamma controls to bring them in line with the 3D LUT and measurement report offerings.
  • Set BT.1886 gamma mapping defaults to gamma 2.4 absolute to match the recommendation.
  • Show error message in case of ambient measurement failing due to instrument communications failure.
  • Curve viewer: Enable dragging and zooming.
  • Profile information comparison profile selection, measurement report simulation profile selection: The list of automatically recognized profiles (if they are installed) has been extended to the full range of ECI offset, gravure and newsprint profiles as well as their basICColor equivalents (available on colormanagement.org) and an increased range of RGB working space profiles. Other profiles can be added by dragging-and-dropping them on the profile list.
  • Never center the display adjustment and untethered measurement windows on the screen, or show them at their parent window coordinates if no previous coordinates were stored in the configuration (always use default coordinates of topleft screen corner in that case).
  • In the case of essential resource files missing (e.g. broken installation or deleted application files), show a more informative error message.
  • Diagnostic 3D views of testcharts are no longer created automatically. You have to click the “3D” button.
  • Slightly increased the logging verbosity.
  • Linux: No longer use GObject Introspection to interface with colord. It could in rare cases cause hard to diagnose problems with wxPython. Rely on colord support in Argyll CMS 1.6 and newer instead (with a fallback to colormgr for profile queries or if libcolordcompat.so is not available for profile installation).
  • Linux: Deal with distribution-specific differences for the location of Argyll CMS reference files (currently supported are XDG_DATA_DIRS/argyllcms/ref, XDG_DATA_DIRS/color/argyll and XDG_DATA_DIRS/color/argyll/ref).
  • Linux: Use udev hwdb instead of pnp.ids for looking up PNP ID to manufacturer name if available.

Fixed in this release:

  • Unhandled exception when trying to start measurements on a display that was added/enabled while ${APPNAME} was already running.
  • In case of untethered measurements, correctly detect and react to recurring need for intermittent instrument calibration.
  • Re-enabled the ability to generate some 3D LUT formats from existing DeviceLink profiles.
  • Don't allow leading dashes in profile filename which might trick the Argyll CMS tools into mistaking parts of it as an option parameter.
  • Refresh display measurement mode was not correctly restored from saved settings.
  • Moving the measurement window between displays resulted in an error and did not update the display configuration (regression of r1737).
  • Linux: Make curve viewer and profile information compatible with wxPython 3.0.
  • Linux: When the trash directory was not already present, files couldn't be moved to the trash.
  • Linux: System-wide profile installation should now also work if sudo is configured to require a TTY.
  • Linux/colord interface: Leave out manufacturer name part of device ID if the PNP ID wasn't found in the database.
  • Linux/colord interface: Deal with potential differences in device ID depending on installed colord version and desktop environment.
  • Linux, Mac OS X: In rare cases, a worker thread could reach an infinitely blocked state.
  • Mac OS X: Standalone tools (broken due to internal symlinks pointing to wrong locations).
  • Mac OS X: Create user profile directory if it does not exist when trying to install a profile (fixes inability to install a profile if the user profile directory does not exist).
  • Mac OS X 10.6 and newer: Calibration loading/clearing is now disabled due to undesirable side-effects (loading calibration from the current display profile could make it necessary to manually restore the display profile by opening system preferences → display → color and loading or clearing a calibration could have side-effects on calibration and profiling measurements).
2014-02-09 22:55 (UTC) 1.7.5.7

1.7.5.7

Added in this release:

  • Unique icons for all standalone tools.
  • Profile information can plot and display colors from named color profiles (including ICC v4). Thanks to Alexander Bohn for adding the original named color support in the ICC profile module.
  • Testchart editor, “Add reference patches”: Named color profiles can be used as reference.
  • Linux: Desktop entries for standalone tools.
  • Mac OS X: Application bundles for standalone tools (Note: They won't work without the main application being present in the same folder, as the resources are shared and contained in the main application bundle).

Changed in this release:

  • Error handling: Omit traceback from error messages for filesystem and operating system related errors (like disk full or no read permissions on a file) as such errors are not code-related.
  • Updated french translation (thanks to Loïc Guegant).
  • If a profile is corrupted, show the curves window regardless if enabled. Show the profile error message only when the corrupted profile is first accessed, not each time the curves window is shown/hidden.
  • Testchart editor, “Add reference patches” (dealing with image colorspaces): Support Lab TIFF images. Fail on colorspace mismatches.
  • Removed DCI_P3.icm profile (prefer SMPTE431_P3.icm which is part of recent Argyll CMS releases).

Fixed in this release:

  • Disable double-click centering and scaling for curve views (this was never supposed to be possible in the first place).
  • Testchart editor, “Add reference patches” (chromatic adaptation): When no device white is available, make sure alternate whitepoint definitions (APPROX_WHITE_POINT, LUMINANCE_XYZ_CDM2 fields) are actually used if present.
  • Always automatically add a file type extension to the filename in the curve/gamut saving dialog (fixes “unsupported filetype” error when trying to save under Mac OS X without manually adding the extension to the filename).
  • Calibration preview for calibration & profile from “<current>” setting no longer switches between .cal and .icm file created in that same run.
2014-01-19 10:02 (UTC) 1.7.1.6

1.7.1.6

Added in this release:

  • A new option to not use the video card gamma table to apply calibration (default like in 1.5.2.5/1.5.3.1: On for madVR, off for everything else).
  • Correlated color temperature, gamma, RGB gray balance and gamut graphs to measurement report.
  • Re-added the default testchart for gamma + matrix profiles.
  • Testchart editor: Dark region emphasis controls (Argyll CMS 1.6.2).
  • Testchart editor: Black patches amount control (Argyll CMS 1.6).
  • Testchart editor: Ability to add saturation sweeps and reference patches (from CGATS or images) to a testchart if using a preconditioning profile and adaptation = 100%.
  • Standalone curve viewer. This allows to view the curves of the currently assigned display profile or the actual video card gamma table without launching ${APPNAME}.
  • Curve viewer can reload, apply black point compensation to, load into the videocard, and export calibration files.

Changed in this release:

  • Untethered measurements window: Enable keyboard navigation in the grid view (up/down/pageup/pagedown/home/end keys).
  • Measurements are now pauseable.
  • Cancelling a potentially long-running operation like measurements or profile generation now needs to be confirmed.
  • Improved robustness of ambient measurement code.
  • Show an error message when communication with the instrument fails (instead of just logging the error).
  • Show an error message when trying to measure ambient light and ambient measurements are unsupported (instead of just logging the error).
  • Regenerated testcharts preconditioned by gamma-based profiles with slight dark region emphasis.
  • Updated french translation (thanks to Loïc Guégant).
  • “Allow skipping of spectrometer calibration” will now always try to skip spectrometer calibration if enabled, not just when doing a calibration and subsequent profile in one go (“Calibrate & profile”). This means a calibration timeout will then be in effect (which is 60 minutes for the ColorMunki Design/Photo, i1 Pro and i1 Pro 2), and a recalibration will only be needed if this timeout has been exceeded before the start of an operation.
  • Testchart VRML export: Only use Bradford chromatic adaptation if ACCURATE_EXPECTED_VALUES in the .ti1 file is true (i.e. a preconditioning profile was used), otherwise XYZ scaling (to visually match VRML files generated by Argyll CMS).
  • Renamed “Verify profile” to “Measurement report”. Added options for BT.1886 gamma mapping, whitepoint simulation, (limited) support for device link profiles, and madVR color management (3D LUTs). Overhauled report HTML layout and style.
  • Use nicer filenames and titles for HTML reports and uniformity check (e.g. include the display name for which the report was generated).
  • Improved dealing with profile linking errors during 3D LUT generation (show error dialog instead of just logging the error).
  • Always use a cLUT resolution of 65 and don't preserve device curves for 3D LUT generation, regardless of the selected 3D LUT format or size (this should make results consistent between eeColor/madVR, which were always generated like that, and the other formats).
  • Allow the use of PC levels for madVR 3D LUT output encoding.
  • Synchronize input and output encoding for eeColor 3D LUT format.
  • Disable xvYCC output encoding (not supported) and consequently disable it also as input encoding for eeColor because it needs the same input/output encoding.
  • Allow loading of calibration files that do not contain settings.
  • Testchart editor: Combined patch ordering controls.
  • Testchart editor: Vastly enhanced performance of row delete operations on very large testcharts (several thousand patches). Also slightly improved speed of testchart loading.
  • Measurement report charts: Each larger chart contains all the patches from the previous smaller chart. Re-generated video charts preconditioned to Rec. 709 and with slight dark region emphasis.
  • Windows 7 and up: Prefer ${APPNAME} profile loader over calibration loading facility of the OS (the latter introduces quantization artifacts and applies wrong scaling, the former uses Argyll CMS and thus doesn't have these problems).
  • Windows: Do not regard unability to determine startup folders as fatal error (this means an autostart entry to load calibration on login can not be created automatically in that case though, so unless Windows 7 or newer is used which has the ability to load calibration without external utilities, calibration needs to be loaded manually).
  • Windows/madVR: Always reset the video card gamma table to linear when using a calibration file and not using the video card gamma table to apply the calibration (this should prevent the potential problem of double calibration being applied if loading a calibration on a display, then switching over to madVR on the same display and using a calibration file while not using the video card gamma table to apply the calibration).

Fixed in this release:

  • A possible unicode decode error when the computer name contains non-ASCII characters, introduced in 1.5.2.5.
  • In some instances the handling of profile name placeholders was quirky (problematic character sequences were those consisting of the same characters, case insensitive, as calibration speed or profile quality shortcodes, i.e. FxF, MxM, SxS, VFxVF and VSxVS, with x being any non alphanumeric character).
  • When loading a settings file, only switch to the associated display device if it can be unambiguously determined (fixes multi-screen setups with identical screens always switching to the first one, a bug introduced in 1.5.2.5).
  • Ignore messages from the logging module (fixes a bogus error message being displayed under Windows when closing ${APPNAME}, introduced in 1.5.2.5).
  • Handling of separate video card gamma table access controls was a bit quirky since the addition of virtual display devices.
  • If the 3D LUT target profile was overwritten by the generated device link profile (which could happen if choosing the same path and file name for the 3D LUT/device link profile as the target profile), it prevented changing the source profile.
  • Instrument (spectrometer) calibration can be required multiple times during a calibration run, depending on its duration. This was not handled correctly by the GUI.
  • 3D LUT generation with TV RGB 16-235 encoding could lead to wrongly encoded 3D LUTs if not using the eeColor or madVR format.
  • 3D LUT generation with YCbCr encodings failed with an error if not using the eeColor or madVR format.
  • Standalone utilities (3D LUT maker, curve viewer, profile information, and testchart editor) now function properly even if ${APPNAME} itself was never launched before (previously the Argyll CMS version was read from the configuration, so if it was never configured before it could happen that not all available options where shown or it was never asked to select an Argyll CMS executable directory in case the Argyll CMS executables were not found).
  • Don't block other windows when an operation fails while a progress dialog with a modal dialog on top is shown.
2013-10-23 20:09 (UTC) 1.5.3.1

1.5.3.1

Added in this release:

  • New feature: When creating a profile from existing measurement data, averaging of measurements can be performed by selecting multiple files.

Fixed in this release:

  • Fixed possible unicode error in logging module.
  • Fixed a bug with optimizing a testchart for untethered measurements halving the amount of different device combinations by repeating patches if the total patch count was even.
  • Mac OS X 10.6: Fixed weird behavior due to a bug in OS X 10.6's version of sudo.
2013-10-22 14:32 (UTC) 1.5.2.5

1.5.2.5

Added in this release:

  • Full Argyll CMS 1.6.0 support (e.g. JETI specbos 1211/1201, madVR calibration and 3D LUT generation, body centered cubic grid option for creating testcharts).
  • Testchart editor: Charts can be exported as PNG or TIFF files.
  • Testchart editor: Gamma and neutral axis emphasis controls.
  • Testchart editor: “Use current profile as preconditioning profile” button.
  • Testchart editor: Save VRML diagnostic files for testcharts without the need to re-generate the chart.
  • Testchart editor: Sort patches by L*, RGB, sum of RGB or sort RGB gray and white to top.
  • Untethered display measurement and profiling. Be sure to read the note on optimizing testcharts for untethered measurements in automatic mode.
  • Shortcut for the BT.1886 tone curve (previously available by setting gamma to 2.4, absolute, and black output offset to zero).
  • 3D LUT: Enable additional intents.
  • 3D LUT: Support eeColor and Pandora LUT formats.
  • 3D LUT: Support Argyll CMS 1.6 video encodings and BT.1886 gamma mapping.
  • Windows 8 Argyll CMS driver installation instructions to the ReadMe.
  • Instructions how to proceed when a process cannot be started to the ReadMe.
  • Softproof preset (based on FOGRA recommendation).
  • madVR preset.
  • sRGB preset.
  • Allow specifying extra arguments for Argyll's targen command.
  • Computer name, EDID serial and EDID CRC32 placeholders for use in the profile name.
  • Synthetic profile creation facility (e.g. for use as source in 3D LUT generation).
  • ACES RGB and DCI P3 colorspace definitions and reference profiles.
  • Dry run. If enabled in the options menu, all functionality that calls Argyll CMS executables will effectively do nothing. This allows review of the used command line parameters by checking the log.
  • Additional session logs are saved for most operations involving the Argyll tools (i.e. directly in the folder where created files are saved to).
  • Show profile self check ΔE*76 info in profile installation dialog.

Changed in this release:

  • Testchart and preset improvements:
    • All testcharts for LUT profiles have been complemented with additional single channel patches. This should in most cases improve average and maximum delta E of generated profiles, in some cases significantly. In fact, testing has shown that the new “small testchart for LUT profiles” with 154 patches total yields better results than the previous “extended testchart for LUT profiles” with 238 patches.
    • The charts for curves + matrix profiles have been improved by adding a few additional body centered cubic grid patches - all the charts which are not tuned for a certain display type are body centered cubic grid based (this was also the case previously for the LUT testcharts, but not for the matrix charts).
    • The patch order in the LUT charts has been optimized to improve measurement speed.
    • The chart for gamma + matrix profiles has been removed in favor of the updated default chart for matrix profiles.
    • New additional charts for LUT profiles have been added in various sizes.
    • For each of the new charts for LUT profiles, starting from the “very large” size, optimized farthest-point-sampled versions have been added which are pre-conditioned for several common display types: sRGB tone response with Rec. 709 primaries and D65 whitepoint (consumer-grade displays), gamma 2.2 with Rec. 709 primaries and D65 whitepoint (consumer-grade displays, TVs), gamma 2.2 with AdobeRGB primaries and D65 whitepoint (entry-level and high-end graphics displays), L* tone response with NTSC primaries and D50 whitepoint (high-end graphics displays).
    • The naming and patch count of the testcharts for LUT profiles has changed. The mapping that most closely resembles the old testcharts is as follows (total number of patches in parentheses):
      • Old “Default testchart for LUT profiles” (124) → new “Small testchart for LUT profiles” (154)
      • Old “Extended testchart for LUT profiles” (238) → new “Default testchart for LUT profiles” (270)
      • Old “Large testchart for LUT profiles” (396) → new “Extended testchart for LUT profiles” (442)
      • Old “Very large testchart for LUT profiles” (912) → new “Very large testchart for LUT profiles” (994)
      • Old “Massive testchart for LUT profiles” (2386) → new “Massive testchart for LUT profiles” (2527)
    Use of the new charts is highly recommended. All presets have been updated to use the new chart types. The “prepress" preset has also been updated to generate a XYZ LUT profile by default.
  • Detect if the instrument can use CCMX or CCSS colorimeter corrections based on the measurement mode. Disable colorimeter corrections for non-base display types.
  • Correctly map measurement mode to DISPLAY_TYPE_BASE_ID for all supported instruments when creating CCMX.
  • If a colorimeter correction with DISPLAY_TYPE_BASE_ID or DISPLAY_TYPE_REFRESH is selected, automatically set the correct measurement mode.
  • If measuring the colorimeter correction testchart, automatically ensure a suitable measurement mode for colorimeters (if they support more than refresh and non-refresh measurement modes).
  • Do not use spline interpolation for curve plots.
  • Updated french translation, thanks to Loïc Guégant.
  • Renamed calibration quality to calibration speed.
  • Set calibration speed for all presets to medium.
  • Standalone testchart editor: Parse first non-option argument as file to be opened.
  • Testchart editor: Always generate good optimized points rather than fast.
  • Testchart editor: Use existing file path when saving testchart.
  • Testchart editor: Greatly improved the speed of paste operations when comparatively large data sets are used.
  • Disallow -d and -D as extra arguments for Argyll's targen as the testchart editor only supports video RGB.
  • Reset adaptive measurement mode when restoring defaults.
  • Close all profile information windows when hiding the main window instead of just hiding them (don't reopen them when the main window is shown again).
  • Curve viewer: Use float formatting for input RGB display.
  • Only skip legacy serial ports if no instrument detected.
  • Also specify Argyll dispcal/dispread -y parameter for spectrometers.
  • Use Rec. 709 whitepoint chromaticity coordinates for “Video” preset.
  • Changed profile installation error message for virtual display devices.
  • Make it clearer which calibration is used when doing a “Profile only”: When a calibration file is going to be used, change the message from the warning “The current calibration curves will be used” to the informational “The calibration file <x> will be used” with the usual options to embed/not embed/reset video card gamma table.
  • Allow the use of calibration curves when profiling a web display.
  • When creating a colorimeter correction from profile(s), get the instrument name from the embedded TI3 if the data source is not EDID.
  • Do not specify (superfluous and thus ignored) patch window positioning arguments for dispcal/dispread when using a virtual display.
  • 3D LUT: Removed black point compensation option (no longer easily possible because it now uses Argyll's collink internally. You can still have the effect of BPC by creating a display profile with BPC enabled and using it as destination profile during 3D LUT creation).
  • Always copy/move temporary files to the save location if not a dry run, also in case of an error. If copy/move fails, keep them in the temporary directory and inform the user.
  • Disable black point compensation for the “Prepress” preset (there are three presets without bpc - “madVR”, “Prepress” and “Softproof”) and use L* as calibration tone curve.

Fixed in this release:

  • Show black point correction choice also when switching from refresh to any other measurement mode instead of only when switching from refresh to LCD measurement mode or vice versa.
  • Corrected averaged RGB transfer function display.
  • Adaptive measurement mode could not be disabled (regression of r1152 where adaptive measurement mode was made default in ${APPNAME}).
  • Work-around a very rare problem where a (bogus) display size of 0x0 mm is returned.
  • Check if the configured colorimeter correction exists before adding it to the list.
  • Update colorimeter correction and testchart lists after deleting settings files.
  • Don't carry over colprof arguments from testchart file (fixes occasional wrong display model and manufacturer in profiles).
  • Average, RMS and maximum delta E metadata was not added to profiles if equal to or greater than 10.
  • Unhandled exception when 3D LUT window was opened and there was no profile selected under settings and also no display profile set.
  • Unhandled exception if colorimeter correction does not exist.
  • Standalone curve viewer: Fix loading of .cal file via commandline argument.
  • Don't strip trailing zeros when displaying average gamma in the status bar of the profile information or curve window.
  • Only set adaptive and hires measurement mode when the instrument supports it (fixes measurement mode switching to non-adaptive if toggling betweeen a colorimeter and a spectrometer).
  • Mac OS X with Argyll CMS 1.5 and newer: Also search library folders for Argyll CMS support files (fixes imported colorimeter corrections not found).
  • Only fall back to private copy of pnp.ids under Mac OS X and Windows.
  • Updated link to Datacolor website download section for the Spyder 2 Windows installers.
  • Transposed bits for EDID red y chromaticity coordinate.
  • Curve viewer / profile info window: Reset tone response curve calculation when toggling LUT checkbox.
  • Correctly react to detected display changes when the actual physical displays didn't change (e.g. when switching Argyll between versions supporting and not supporting the virtual “Web” display).
  • Keypresses or cancel were not recognized during patch reading.
  • Display uniformity measurements: Q or ESC had to be pressed twice to exit.
  • Do not use “install profile” message for non-display profiles.
  • 3D LUT: “apply vcgt” checkbox stayed disabled after switching from a devicelink source profile to a non-devicelink source profile.
  • Update all open windows when switching Argyll versions
  • Do not reset selected colorimeter correction to none when selecting a preset or a settings file.
  • Measurement window position was not correct when switching from web display.
  • Show an error message when choosing a directory as profile save path where no subdirectories can be created.
  • Python 2.7 compatibility: Mask u16Fixed16Number (fixes profile information not working for profiles with negative XYZ or chromaticity values when using Python 2.7).
  • wxPython 2.9 compatibility: Do not specify number of rows in dynamically growing FlexGridSizer.
  • Linux: Use colord's quirk_vendor_name to fix the manufacturer string.
  • Mac OS X 10.6 and up: Clearing and loading calibration needs root privileges in some circumstances.
  • Windows: Correctly escape quotes in arguments (fixes hang when profile name, program path or Argyll path contains a single quote).
  • Windows: Show a meaningful error message when a subprocess can't be started instead of hanging indefinitely.
  • Windows: Ignore WMI errors.
  • Windows: Selecting testcharts saved in the root of a drive under Windows.
  • Windows: Disable broken Windows 2000 support (was broken since 0.8.5.6 when the interactive display adjustment GUI was introduced and is not fixable as Windows 2000 does not implement the required AttachConsole functionality).
  • Windows/Mac OS X: If Argyll profile installation failed, a success message was still shown.
2013-03-03 19:42 (UTC) 1.2.7.0

1.2.7.0

Fixed in this release:

  • Colorimeter correction creation not working when using Argyll CMS 1.5.0 because of missing newly required fields in CGATS data.
  • Mac OS X: Accidentally swapped “/Users/<Username>/Library/Application Support” and “/Library/Application Support”.
2013-03-01 09:39 (UTC) 1.2.6.6

1.2.6.6

Added in this release:

  • Argyll CMS 1.5.0 compatibility.
  • Ability to do remote measurements using Argyll CMS 1.4.0 and newer (Firefox is recommended as client). See remote measurements and profiling.
  • Include black level and contrast in profile verification reports (if possible, i.e. if the test chart contains a RGB=0 patch).
  • 3D LUT: Support color space conversion ('spac') profiles.
  • DCI P3 reference profile.
  • Add “Quality” (if applicable) and “License” metadata to profiles.
  • Add colord device ID mapping to profile metadata.
  • Linux: Add screen brightness to profile metadata if profiling a mobile computer's screen (using the org.gnome.SettingsDaemon.Power DBus interface).
  • Additional logging.

Changed in this release:

  • Revised display uniformity test to generate HTML reports.
  • Use a delay of 200 ms for display uniformity measurements.
  • Detect “Calibrate failed with 'User hit Abort Key' (No device error)” Argyll CMS error message and ignore further errors to prevent popping up multiple error dialogs.
  • Reload currently selected calibration after verifying a profile.
  • Add metadata to fast shaper matrix profiles (e.g. gamut volume and coverage).
  • When deleting a settings file, also offer CCSS, CCMX and files starting with the settings file basename in the same directory for deletion.
  • Enable use of absolute values in profile verification reports regardless of testchart.
  • When loading a profile without calibration settings, look for an accompanying colorimeter correction in the same directory.
  • When only creating a profile and not calibrating, give a clear choice whether to embed current calibration curves in a profile or not.
  • When using black point compensation, keep the black point compensated TI3 measurement file in addition to the unaltered file.
  • When restoring default settings, don't reset the 3D LUT abstract profile as well as 3D LUT and profile info window positions.
  • Truncate the colorimeter correction description displayed in the dropdown if it's overly long.
  • Only load linear calibration curves into the curve viewer when resetting the video card gamma table.
  • Do not remove spaces from the instrument name when assembling the profile name.
  • Only compress JavaScript in HTML reports if the report.pack_js configuration option is set (default 1 = compress).

Fixed in this release:

  • Improved instrument event handling.
  • When measuring the screen using a spectrometer, make sure to repeat the instrument calibration until it is successfully completed or canceled (ColorMunki Design/Photo).
  • When measuring ambient light with a spectrometer, abort after a 30 second timeout if instrument calibration did not complete.
  • Correctly react if the instrument sensor is in the wrong position and prompt the user to set the correct position.
  • Mouse cursor and clicked “Measure” button stayed hidden when aborting a measurement in the display device uniformity test window.
  • Updating the calibration (vcgt) of a profile didn't work if first selecting a .cal file, ticking the “Update calibration” checkbox and then switching to the profile.
  • Disable all calibration controls (except the quality slider) when “Update calibration” is ticked.
  • Only enable “Update calibration” checkbox if calibration can actually be updated.
  • Disable the “Create colorimeter correction...” and “Create 3D LUT...” menu items as well as the “LUT” checkbox in the curves and profile information windows if Argyll CMS executables are not found.
  • Update measurement modes when switching Argyll versions.
  • wxPython 2.9 compatibility.
  • Set manufacturer, model, creator and ID in reference profiles (except ClayRGB and sRGB from Argyll).
  • Only switch over to progress dialog after a three second delay (fixes erroneously switching over to progress dialog under Windows when running calibration or display uniformity measurements directly after a canceled testchart measurement).
  • If using a DTP92, only offer refresh measurement mode.
  • Make sure updated profiles also have updated descriptions.
  • Also overwrite .gam.gz and .wrz files if overwriting an existing profile.
  • Mac OS X: Make sure the menus are re-enabled after calibrate & profile.
2013-01-07 19:41 (UTC) 1.1.8.3

1.1.8.3

Changed in this release:

  • Show display device uniformity measurement window on selected display device if multiple display devices are connected.
  • Hide mouse cursor and clicked button while measuring display device uniformity.

Fixed in this release:

  • Sporadic measurement hang when measuring display device uniformity.
  • Wrong window being shown when calibrating after display device uniformity measurements or vice versa.
2013-01-05 13:32 (UTC) 1.1.7.0

1.1.7.0

Added in this release:

  • Preliminary Argyll CMS 1.5.0 compatibility.
  • Added facility to measure and report display device uniformity. Known issue: Sometimes measurements hang. Press space to try and continue.
  • 3D LUTs can optionally incorporate abstract (“Look”) profiles.
  • 3D LUTs can be created from Device Link (class “link”) and input (class “scnr”) profiles.
  • 3D LUTs can also be created in SPI3D format.

Changed in this release:

  • Updated french translation, thanks to Loïc Guégant.

Fixed in this release:

  • Fedora: Calibration curves were reset to linear when installing a profile and using the Fedora packaged Argyll CMS.
  • Linux, Mac OS X, Windows (Administrator): Colorimeter corrections imported from i1 Profiler and ColorMunki Display software were not listed in the dropdown menu.
2012-11-05 20:32 (UTC) 1.1.2.9

1.1.2.9

Changed in this release:

  • Simplified Spyder 2 enabling instructions.

Fixed in this release:

  • Broken Unicode support (unhandled exception) when dealing with colorimeter correction descriptions containing 8-Bit characters.
  • Check if xicclu is found before attempting to use it for the profile information window (gets rid of bogus “'NoneType' object has no attribute 'encode'” message).
  • Use a default generic message when prompting to choose a profile.
2012-10-05 19:04 (UTC) 1.1.2.1

1.1.2.1

Changed in this release:

  • Disable source profile selector in advanced gamut mapping options if not atleast one of perceptual or saturation checkboxes is selected.
  • Only show a warning if an incompatible colorimeter correction is explicitly selected via the filebrowser.
  • Show a less cryptic error message if an invalid file is selected when importing colorimeter corrections from other display profiling software.

Fixed in this release:

  • Whitepoint color temperature is an integer, not a float. This fixes calibration settings being detected as changed when they actually haven't.
  • Worked around a bug in wxPython where controls in a hidden window react to focus events. This fixes the sporadic hang after calibration measurements during a “Calibrate & profile” run.
  • Linux, Mac OS X: Unhandled exception when trying to import colorimeter corrections from other display profiling software and selecting a file with '.txt' extension.
2012-09-15 15:38 (UTC) 1.1

1.1

Added in this release:

  • Additional profile name placeholder %ds for the display device serial from EDID if applicable (may be empty or bogus).
  • Windows: Additional profile name placeholders %dnw (DeviceString) and %dnws (shortened DeviceString, it may be the same as %dnw if shortening isn't possible). The former is equivalent to what's shown in the display device dropdown. The DeviceString is often more verbose as the sometimes very generic EDID device name (placeholder %dn).

Changed in this release:

  • Updated spanish translation (thanks to Roberto Quintero).

Fixed in this release:

  • Show an error message if a colorimeter correction cannot be used with the selected instrument.
  • Show an error message when trying to import colorimeter corrections from an unsupported filetype.
2012-08-01 10:13 (UTC) 1.0.9.0

1.0.9.0

Changed in this release:

  • Use the original file basename for colorimeter corrections copied over to the storage directory (previously, if a colorimeter correction was copied, it inherited the same basename as the rest of the measurement/profile/calibration files, thus making it a bit cumbersome to determine which colorimeter correction was originally the source, especially in profile verification reports which only showed the filename and not the description from the file contents).
  • Show colorimeter correction file basename in addition to the description if they are different.
  • Linux: Fall back to gcm-import if colord profile installation fails.

Fixed in this release:

  • When switching to L*/Rec. 709/SMPTE or sRGB and then loading settings with a gamma value, the gamma entry field was not shown.
  • Report on calibrated/uncalibrated display and calibration verification did not work if using a colorimeter correction (regression of changeset #1020).
  • Do not freeze if loading a settings file which had an accompanying colorimeter correction that was since deleted.
  • Windows 2000: Don't fail to launch.
2012-06-28 22:05 (UTC) 1.0.7.7

1.0.7.7

This is a bug-fix release for version 1.0.7.6.

Fixed in this release:

  • Unhandled exception in gamut view calculation after profile creation if using french localization.
2012-06-23 00:25 (UTC) 1.0.7.6

1.0.7.6

Added in this release:

  • Option to auto-select a suitable colorimeter correction if available locally.
  • Ability to choose between L*a*b*, XYZ and xyY in profile verification reports.

Changed in this release:

  • Reset default black point correction from automatic to off.
  • If a profile contains no 'vcgt' tag, assume linear calibration.
  • When creating a colorimeter correction, remember the last selected reference and colorimeter measurement file separately.
  • When creating a colorimeter correction, automatically only use white, red, green and blue patches (at 100% device value each) from measurement files, regardless if they contain more patches. This allows re-using of measurement files with different patch counts (as long as they contain those four combinations) that have been created as by-product of other operations, e.g. during profiling. Note that measurements still need to be done under identical conditions and within reasonable timeframe (ideally less than a few minutes apart) to minimize effects of display and instrument drift when creating colorimeter corrections from them.
  • When measuring the colorimeter correction testchart, automatically set the resulting measurement as last selected reference or colorimeter file depending on whether it contains spectral data or not.
  • When restoring the current calibration after measuring the colorimeter correction testchart, do it silently (don't show a message window).
  • Filter colorimeter corrections by selected instrument.
  • Show colorimeter correction description in the dropdown instead of the filename. Show the filename and path on mouse hover.
  • ColorHug: Only enable colorimeter corrections for “Factory” and “Raw” measurement modes.
  • ColorHug: Automatically set “Factory” measurement mode when measuring the colorimeter correction testchart and measurement mode is not yet “Factory” or “Raw”. Restore previous measurement mode afterwards.
  • Linux: Enable ColorHug support by default.
  • Linux: colord wrapper now uses PyGObject instead of ctypes.
  • Updated french translation, thanks to Loïc Guégant.

Fixed in this release:

  • When creating a 3D LUT, don't fail if the target profile contains no 'vcgt' tag and the preference is “Apply calibration” (which is the default) irrespective of checkbox state.
  • Use colorimeter correction (if applicable) from settings stored in calibration files and profiles when loading them.
  • When creating a colorimeter correction, the display name in the description is now taken from the measurement file if available.
  • When creating a colorimeter correction, automatically order the measurements exactly the same by device (RGB) triplets.
  • Hide any profile information window(s) when the main window is hidden and restore them when it is shown again.
  • Correct ID on profile created from EDID after adding gamut coverage/volume metadata.
  • Measurement modes other than “LCD (generic)” and “Refresh (generic)” are now correctly restored from settings embedded in calibration files and profiles.
  • If using the current calibration curves for profiling without calibrating (“Profile only” with “Reset video card gamma table” unchecked), using Argyll CMS 1.4.0, the resulting profile will now contain a 'vcgt' tag with the current calibration like with previous Argyll versions.
  • RGB bars and chromaticity/color temperature readouts when adjusting a whitepoint with blackbody target are now working correctly.
  • Ignore and do not show any explicitly selected Colorimeter Calibration Spectral Sample (CCSS) file for instruments that do not support it.
  • Changing Argyll version/binaries in ${APPNAME} with automatic instrument detection switched off is working correctly again without the need to restart the program.
  • Show ColorHug-specific measurement modes (please run instrument detection once again to refresh the list if you already used the ColorHug in a previous version of ${APPNAME}).
  • Saturation gamut mapping settings are no longer ignored.
  • Trying to view profile information for profiles whose black point X Y Z sum is zero will no longer result in a division by zero error.
  • Black point compensation is no longer attempted if not atleast one black or white patch is found in measurement data.
  • Linux: Don't error out if profile installation with dispwin fails, but profile installation via colord or oyranos-monitor is successful (fixes profile installation when using the distribution-packaged Argyll under Fedora)
  • Linux: colord device key name now correctly adheres to device naming spec for xrandr devices (fixes some profile installation problems).
  • Linux, Windows: Correctly detect in the profile loader if linear calibration is assumed when using Argyll CMS 1.4.0 or newer.
  • Windows: Continuous measurements during interactive display adjustment are now stopped reliably when clicking the “Stop measurements” button or hitting the space key.
2012-04-02 19:24 (UTC) 0.9.9.1

0.9.9.1

Added in this release:

  • Spyder 4 support if using Argyll CMS >= 1.3.6. To make all measurement modes available, you have to use “Import correction matrices from other display profiling softwares...” from the “Tools” menu.
  • Experimental ColorHug support is enabled through Argyll CMS >= 1.3.6 if the ENABLE_COLORHUG environment variable is set, but the ColorHug currently doesn't work reliably across all platforms.
  • Added information about instrument measurement modes to the ReadMe.

Changed in this release:

  • GUI spring-cleaning: Re-arranged some controls and replaced radiobuttons and read-only combo-boxes with choice controls instead. Only the controls related to a selected choice are shown.
  • Default calibration black point correction to automatic.
  • Replaced previous 19-patch colorimeter correction testchart with smaller 4-patch version (just red, green, blue at 100% each and white, as is the default with Argyll CMS 1.3.6).
  • Linux packages: Added Argyll CMS to dependencies. Please note: If you want the latest Argyll features or run into problems, it is recommended to download the standalone Argyll binaries from argyllcms.com as the distribution repositories often only contain older Argyll CMS releases.

Fixed in this release:

  • Fixed unhandled exception when adding metadata to a profile from EDID that contains an invalid (out of range) gamma value.
  • Fixed slightly off the mark whitepoint in resulting profile when using black point compensation (typical max. error 0.2 ΔE*76). You may want to re-create existing profiles.
  • Do not reset visibility of advanced calibration options when restoring defaults.
  • Store black point compensation setting in profiles.
  • Mac OS X: The application bundle now again contains all required files (no missing files when dragging just the bundle to Mac OS X “Applications” folder).
2012-03-15 14:45 (UTC) 0.9.6.6

0.9.6.6

Added in this release:

  • Black point compensation option for profiles (default ON). This effectively prevents black crush, but at the expense of accuracy of the resulting profile.
  • Profile information window with 2D gamut plot as well as information pane which shows profile header and tag data in detail (with few exceptions).
  • Ability to create display correction 3D LUTs for use in movie post-processing applications that don't have ICC support. Currently supported are the .3dl and .cube formats.
  • Write gamut VRML files and calculate coverage and volume percentages against sRGB and Adobe RGB when creating profiles.
  • Add 'chrm' tag (xy chromaticities for each primary) to created profiles. Unlike the values from 'rXYZ', 'gXYZ', 'bXYZ', A2Bx or 'clrt' tags, the 'chrm' data corresponds to the actual measured chromaticities without chromatic adaptation or interpolation. The 'chrm' tag is purely informational.
  • Windows 7 and later: Added an option to let the operating system handle calibration loading when installing a profile (this option requires ${APPNAME} to be run as Administrator and is also available in the ${APPNAME} installer. If selecting the option there, the ${APPNAME} Profile Loader will not be installed to the startup items. A shortcut to the loader is still available in the ${APPNAME} folder in the start menu though, to be able to quickly force a reload of calibration).

Changed in this release:

  • Instrument detection now defaults to manual. A click on the icon with the swirling arrows or choosing the corresponding menu item in the “Options” menu detects connected instruments. Automatic instrument detection can be (re-)enabled/disabled there, too.
  • The ${APPNAME} Profile Loader can now be set to not show error messages again (errors will still be logged).
  • Tone response curves are now plotted as L* → RGB by default and are also calculated for LUT profiles (profiles with both LUT and matrix TRC tags allow on-the-fly switching between them). In addition, the transfer function is shown if it can be estimated.
  • Windows: Allow enabling/disabling of calibration loading on login when installing a profile (to be able to change this option when Windows 7 or later is set up to handle calibration loading, either ${APPNAME} needs to be run as administrator or in the Windows color management control panel “Advanced” tab, click on “Change system defaults...” and disable “Use Windows display calibration”).

Fixed in this release:

  • Do not fail to launch due to unhandled exception when parsing CGATS files containing KEYWORD, INDEX, SAMPLE_ID or DATA_FORMAT values in exponential notation.
  • Do not use exponential notation for low (< 0.0001) calibration black level target values.
  • Correctly handle failed instrument calibration (by asking to repeat) and measurement failures which are not misreads or communication failures (and should thus not be retried automatically).
  • Also look at ASCII descriptor blocks when determining the display device name from EDID (fixes display model not being set in profiles for certain Apple displays).
  • Don't loose 'mmod' tag (monitor make and model) when creating a profile from measurement data embedded in an existing profile.
  • Automatically restore calibration after measuring the colorimeter correction testchart.
  • Restore Argyll CMS < 1.3.0 compatibility (broken in 0.8.9.3).
  • Windows Vista, 7 and later: Automatically enable “Use my settings for this device” in Windows' colormanagement settings when installing a profile.
2012-02-11 03:56 (UTC) 0.8.9.3

0.8.9.3

Fixed in this release:

  • Selecting a smaller default testchart than the recommended one did not work (was reset to the recommended default when starting measurements or re-starting ${APPNAME}).
  • Restore previously selected testchart if canceling colorimeter correction measurements.
  • Disable the “Measure” button in the “Create colorimeter correction” dialog if no display or instrument detected/selected.
  • Disable menus while the main window isn't shown (only affects operating systems where the menu is not part of the main window e.g. Mac OS X).
  • Linux: Fixed i1 Display Pro / ColorMunki Display missing from Argyll udev rules (this was actually already fixed in 0.8.5.2, but not mentioned in the changelog).
  • Mac OS X Lion: Removed sporadic password dialog being shown after calibration measurements when running “Calibrate & profile”.
  • Mac OS X Lion: Fixed an issue with profile installation for the current user which only installed the profile for the root user, thus not making it available in system preferences and making e.g. the login screen the only visible place where it was effectively being used.

Changed in this release:

  • Allow the selection of LCD or CRT measurement modes for spectrometers too (determines the available controls during interactive display adjustment).

Added in this release:

  • GUI for interactive display adjustment.
  • Add 'mmod' tag (monitor make and model, an Apple-specific private tag) to created profiles (ensures the profiles still show up in Mac OS X system preferences if “Show profiles for this display only” is ticked).
2012-01-24 18:40 (UTC) 0.8.5.2

0.8.5.2

Fixed in this release:

  • Added missing numbers to “delta E too high” message when trying to upload a profile with low self-fit accuracy.
  • Decoding of numerical manufacturer ID from EDID when adding metadata to a profile was done in the wrong byte order.
  • Fixed missing terminating NUL character for copyright tag when creating a profile from EDID.
  • Fixed missing underscore in EDID colorimetric metadata key names as per the ICC meta Tag for Monitor Profiles specification.
  • Linux: Display measurements couldn't be started if ${APPNAME} was installed via the 0install feed.
  • Mac OS X: The file which maps Plug'n'Play device IDs to manufacturer names was not found when running from the application bundle, resulting in manufacturer entries in profiles always being equivalent to the three-letter PnP ID instead of the full manufacturer name.

Changed in this release:

  • Measurements for colorimeter corrections can now be started directly from the dialog, and the previous testchart is restored afterwards.
  • Add more metadata to generated profiles to allow better automatic selection/ranking on systems that support it and standardized a few previously ${APPNAME}-only keys (ICC meta Tag for Monitor Profiles / GCM metadata specification).
  • Use product code as fallback for make/model when creating profiles from EDID.
  • Windows: In case of an Argyll CMS 'config 1 failed' error upon trying to use an instrument, inform the user its driver may not be installed.

Added in this release:

  • Added ability to specify the display technology for created colorimeter corrections.
  • Enabled overriding of default gamut mapping intents for LUT profiles. “Luminance matched appearance” is the default override for perceptual intent, which provides an effect similar to black point compensation.
  • The colorimeter corrections database now has a public web interface and API.
2011-12-08 13:33 (UTC) 0.8.1.9

0.8.1.9

Fixed in this release:

  • Ignore 'unknown' (not required) fields when verifying CGATS (fixes bug 'invalid testchart' after profiling with spectrometer, introduced in r780).
  • Force a default testchart if the selected one is invalid.
  • Linux (autopackage): Set PYTHONDONTWRITEBYTECODE= (empty string) to fix installation on Mandriva 2011.

Changed in this release:

  • Default profile type should be 3x shaper + matrix, not single shaper + matrix.
  • Some of the advanced calibration options (gamma type relative/absolute, ambient adjustment, black point correction and offset) are now hidden by default and can be shown via the corresponding menu item in the options menu.

Added in this release:

  • Option to share profiles via the openSUSE ICC Profile Taxi service.
  • Option to create profiles from extended display identification data (EDID).
  • Linux (GNOME 3): colord compatibility (query current profile, install & set profile).
2011-10-06 21:44 (UTC) 0.7.8.9

0.7.8.9

Fixed in this release:

  • Additional commandline arguments were ignored when doing profile verification measurements.
  • Windows: If the startup folder in the start menu was deliberately deleted, the profile loader shortcut wasn't created when installing a profile.
  • Windows: Profile loader correctly verifies if the calibration was sucessfully loaded.

Changed in this release:

  • Skip legacy serial ports by default when detecting instruments (serial instruments like the DTP92 or Spectrolino will no longer be selectable unless you manually set skip_legacy_serial_ports = 0 in ${APPNAME}.ini or use a serial to USB adapter).
  • Windows: The profile loader shortcut in the startup folder inside the start menu is now created at installation time (and removed when uninstalling).
  • When checking for program updates, show the changelog for the new version if an update is available.
  • Confirm enabling of debugging output.

Added in this release:

  • Support for Argyll CMS 1.3.4 features: i1 Display Pro and Colormunki Display, Colorimeter Calibration Spectral Sample (.ccss) files.
  • Ability to import colorimeter corrections from other display profiling softwares. Currently iColor Display, i1 Profiler and ColorMunki Display are supported.
  • Ability to create correction matrices and Calibration Spectral Sample files, with the option to share them via an online database.
  • Option to automatically check for program updates on startup.
  • Added information how to fix instrument not working correctly/constantly disconnecting under Linux due to a conflict with libmtp (thanks to Pascal Obry who notified me of the issue back in May 2011).
2011-08-05 01:06 (UTC) 0.7.3.7

0.7.3.7

Fixed in this release:

  • Linux: Fixed multi-display support when not using separate X screens.
  • Mac OS X: Fixed not being able to run under a standard user account, and Mac OS X 10.7 compatibility.
  • Mac OS X 10.4.x: Fixed functionality requiring elevated privileges, e.g. installing profiles system wide or enabling the Spyder 2 using Argyll 1.1.x (regression of a change introduced in r706 / 0.7.0.7)
  • Windows: Fixed several problems with special characters in paths which are not representable through the file system encoding.
  • Windows: Worked around OS localtime() bug. If the system's clock was set to a date far into the future, ${APPNAME} failed to launch on subsequent runs because of the logfile's timestamp which could not be processed by localtime().
  • Windows Vista/7: Querying the user display profile resulted in a “not found” error if the checkbox “Use my settings for this device” was never ticked in Windows' color management control panel, failing the fallback of querying the system display profile in case of no user display profile.

Changed in this release:

  • All presets now use curves + matrix as profile type (for better overall application compatibility).
  • Better feedback when trying to open broken/invalid files (display an error dialog instead of just logging the error).
  • Icons in the task switcher on Windows Vista/7 (and presumably Linux) should now be crisp and not pixelated.
2011-06-02 21:45 (UTC) 0.7.0.7

0.7.0.7

Fixed in this release:

  • wxPython 2.8.12 compatibility.
  • Linux: Preserve environment when installing a profile system-wide so $DISPLAY is available for dispwin.
  • Linux (Source): Changed highest supported Python version to “lower than 3.0” because openSUSE Build Service would choke on “lower than or equal to 2.7” when building for Ubuntu 11.04.
  • Linux (Source): Fixed setup.py bdist_deb as far as possible (see notes under installing from source, additional setup commands, bdist_deb)
  • Windows: Fixed error when the display profile cannot be determined (e.g. when running remotely).
2011-04-20 21:08 (UTC) 0.7.0.0

0.7.0.0

Fixed in this release:

  • Updating profile verification reports created in versions prior to revision 672 should not strip calibration and gray balance information anymore (regression of a change in r672).
  • If the Spyder 2 was enabled using Argyll CMS 1.2 or newer, this should now be reflected correctly in the “Tools” menu by a checkmark next to the “Enable Spyder 2” menu item.
  • Linux (Autopackage, DEB and RPM installs) and source: Fixed missing application icons in sizes other than 16x16 and 32x32 if the source archive was created with setup.py under Mac OS X or Windows (regression of a change in r501).
  • Linux/Windows: The location of the Argyll binaries was not stored in the system-wide configuration, which could prevent the profile loader from finding the Argyll binaries if they were not on the PATH environment variable and a profile was installed system-wide.
  • Windows: Fixed program termination if EnumDisplayDevices fails (e.g. when running remotely).
  • Windows: Fixed program termination if a display device has no driver entry in the registry (the very generic Windows error message is misleading in that case: It pretends a file was not found).
  • Windows XP: Correctly enumerate display device names and EDID.

Changed in this release:

  • When doing verification measurements of a (non-Argyll) profile containing a chromatic adaptation 'chad' tag, ${APPNAME} now tries to use the same chromatic adaptation transform to calculate adapted values from the measurements instead of using a hardcoded Bradford transform.
  • The default delta E formula for “RGB + gray balance” evaluation is now DE 2000.
  • The delta E formula is now locked for the Fogra MediaWedge and IDEAlliance Control Strip evaluation criteria.
  • The “Update calibration” and “Update profile” checkboxes were combined into one. This removes the ambiguity about what “Update profile” functionality actually was: Only updating the calibration inside the profile. Both updating stand-alone calibration '.cal' files and calibrations embedded in profiles are now handled with the single “Update calibration” checkbox. The slightly different workflow of only updating the calibration, and then creating an actual new profile on top of it in one go, is still possible by explicitly loading a calibration '.cal' file under “Settings”.
  • Made the GUI a bit nicer towards low screen resolutions by moving more controls into the scrollable area and also removing the graphical banner and allowing horizontal scrollbars if things get really cramped.
  • Windows Vista/7 and later: To be able to install a profile system-wide, you now need to run ${APPNAME} explicitly as administrator (right-click the ${APPNAME} icon, then select “Run as administrator”) to show the appropriate controls in the profile installation dialog.

Added in this release:

2011-01-24 03:56 (UTC) 0.6.7.7

0.6.7.7

Fixed in this release:

  • Fixed measurements hanging at the start if using the black background option.
  • wxPython 2.9 compatibility.
  • Windows: Potential COM error caused by obsolete code.
  • Windows Vista/7: Potential WMI errors when trying to read a display's EDID are now suppressed (the EDID can not be read on systems where WMI has errors, which may prevent more accurate display descriptions, but will not impede functionality otherwise).

Added in this release:

  • Profiles can now be dragged and dropped onto the curve viewer.
  • When using the profile verification feature, it is now possible to first select a simulation profile before choosing a testchart.
2010-11-05 03:12 (UTC) 0.6.6.7

0.6.6.7

Fixed in this release:

  • Re-enabled warning message from the profile loader if the calibration in the video card does not match the requested calibration after loading.
  • Fixed “Show curves” checkbox in the profile installation dialog not doing anything if the curve viewer was not shown before (regression of a change in version 0.6.2.2).
  • Fixed a small visual glitch where the message “Calibration complete” was not cleared from the progress window after instrument calibration.
  • Fixed possibility of unprintable characters from EDID strings (e.g. display name) causing errors.
  • Fixed Argyll CMS diagnostic output not working for dispwin when using Argyll CMS 1.3.1
  • Linux: Fixed Autopackage install not working with Python 2.7

Added in this release:

  • Linux: Added a “Load profile and calibration on login” checkbox to the profile installation dialog. Normally, you want to keep this checked, so that ${APPNAME}'s profile loader can setup the configured display(s). But if you use another solution for loading profiles, like Oyranos with the CompICC plugin, you should uncheck it, so that display profiles are solely handled by CompICC.
  • Mac OS X: Like on the other platforms, EDID is now used if available.
2010-10-24 04:36 (UTC) 0.6.5.3

0.6.5.3

Fixed in this release:

  • Fixed a bug where the wrong correction matrix setting was stored in a profile or calibration file when changing the correction matrix, and creating a profile with a previous settings file selected which used a different correction matrix. Note this didn't affect measurements when creating the new profile or calibration file, but when loading it in ${APPNAME}, the correction matrix used for the previously selected settings file was set instead of the one actually used when creating the new file.
  • Fixed missing XYZ values for the assumed whitepoint in profile verification reports.
  • Fixed crash when the manufacturer ID from a display's EDID contains invalid data.
  • Honor the selected display when loading calibration curves from a settings file.
  • Linux: Installing profiles under multi-display configurations using separate X screens should now work better when Oyranos is installed (previously, when the profile for the second screen was installed after the profile for the first screen, it would override the first profile in the Oyranos configuration. Profiles can be re-installed with this version of ${APPNAME} to fix this).
  • Linux: Profile loader: When Oyranos is installed, but not xcalib, the fallback to dispwin to load the calibration curves was not working.

Changed in this release:

  • Reset additional commandline arguments too when restoring defaults.
  • The profile loader will no longer show an error message when unable to determine a display's current ICC profile, as there may just not be any profile installed for the respective display. Instead, such errors are now silently logged.
  • Improved error messages from the profile loader by adding some information about the affected display for easier troubleshooting of multi-display configurations.
  • Windows: Profile installation: When a system-wide autostart entry for the calibration loader already exists, do not create a per-user entry.
  • Linux: The autopackage can now be installed just for the current user. Note this will not setup instrument access though, as that requires root privileges.

Added in this release:

  • Save the device model and manufacturer description to measurement data (.ti3) files and use that information when creating a profile.
  • Log all output from the profile loader.
  • Ability to just measure a testchart and create a measurement data file (menu “Options”, “Measure testchart”).
  • Approximate gamma for grayscales is shown in profile verification reports.
  • Build system: Added --skip-postinstall option.
2010-09-19 17:53 (UTC) 0.6.2.2

0.6.2.2

Fixed in this release:

  • Trying to verify or view curves of a (non-Argyll) profile with a 'formula' type vcgt tag no longer fails with a 'NameError'.
  • When the measurement window was moved to the leftmost and/or topmost coordinates of the screen, the calculated relative position could become negative and prevent starting measurements.
  • Trying to profile a display which provides an empty model description via EDID no longer fails.
  • Profile name placeholder %im (instrument measurement mode) now inserts the correct string.
  • Profiling did not finish if “Show actual calibration curves from video card gamma table” was checked and the curves window shown.
  • Fixed black point correction rate not being restored correctly when loading settings.
  • Fixed conversion of the color temperature to xy chromaticity coordinates (the input fields in the GUI) which was erroneously being calculated with the formula for daylight even if a blackbody locus was chosen.
  • Fixed assumed whitepoint in profile verification reports erroneously being calculated with the formula for daylight even if a blackbody locus was originally chosen when creating the profile.
  • Fixed profile verification reports not working in Internet Explorer 5.x-6.0 and Opera 7.x.
  • Fixed profile verification reports showing “missing data” for some fields if using the Fogra Media Wedge V3 criteria and the reference file contained both XYZ and Lab data.
  • Mac OS X: A double extension (.icc.icm) is no longer added when creating a profile from an existing one (menu “Options”, “Create profile from measurement data...”).

Changed in this release:

  • When loading settings from calibration (.cal) files, the actual parameters chosen when calibrating are now set instead of stored measured values (e.g. whitepoint, black- and white level. Will only work for .cal files created in this version and up).
  • “Allow skipping of spectrometer self-calibration” (in the “Options” menu) for characterization readings after calibration is now disabled by default to help sensor stability (especially for the ColorMunki).
  • Black point correction rate now uses a floating-point control with the range 0.05...20.0 (consistent with the Argyll CMS dispcal commandline tool) instead of the previous integer control with the range 5...2000.
  • The default evaluation criteria for RGB testcharts in profile verification reports is now RGB only.
  • The default Delta E formula used for results in profile verification reports is now Delta E 2000 (except for standardised criteria like the Fogra Media Wedge V3).
  • Additional statistics in profile verification reports are now hidden by default.
  • Selecting “CMYK” or “RGB” in profile verification reports now actually makes a difference (shows the corresponding device values in the overview).
  • “Evaluate gray balance through calibration only” in profile verification reports is now disabled by default.
  • Windows: Installing a profile system-wide removes an existing user autostart entry for the profile loader to avoid having two entries.
  • Windows: EDID info will be used if available instead of generic device strings ('PnP-Monitor' et al).

Added in this release:

  • Ability to enable Argyll CMS diagnostic (debugging) output for measurements via menu “Options”.
  • Option to choose blackbody whitepoint reference instead of daylight in profile verification reports.
  • Original profile whitepoint is now shown in profile verification reports.
  • Instrument black level and display white level drift compensation options when using Argyll CMS >= 1.3.0
  • Ability to choose a correction matrix for colorimeters when using Argyll CMS >= 1.3.0
  • Allow setting of additional commandline arguments for dispcal, dispread, spotread and colprof via a new menu item in the “Options” menu.
  • IDEAlliance Control Strip 2009 aim values for profile verification with CMYK test charts.
  • Profile verification report shows instrument measurement mode and correction matrix (if any).
  • Menu option to update existing profile verification reports with the current templates.
2010-08-01 03:19 (UTC) 0.5.8.1

0.5.8.1

Fixed in this release:

  • Argyll CMS 1.2.0 compatibility
2010-07-25 13:19 (UTC) 0.5.8.0

0.5.8.0

Fixed in this release:

  • The timeout of 10 seconds for the startup of Argyll tools and instrument initialization was too short for some instruments and is now increased to 30 seconds. If the timeout is ever exceeded, ${APPNAME} should now also abort automatically and no longer hang.
  • When previewing the calibration upon profile installation, use a linear calibration if no display profile is present when toggling the preview on and off (fixes the curve viewer not updating).
  • Fixed closing the log window not re-enabling the “show log automatically” menuitem.
  • Linux (Autopackage install): Fixed menu entry sometimes disappearing permanently after logging out under GNOME.
  • Linux: Fixed ${APPNAME} not working if libX11 or libXrandr do not expose certain functions (e.g. under Mandriva 2009).
  • Linux: Fixed not being able to install a profile using GNOME Color Manager when the profile was not writable.
  • Linux: Fixed not being able to install a profile using Oyranos when the profile was not located in ~/.color/icc/devices/display.
  • Linux/Mac OS X: Saving a log file from the log window now works correctly.
  • Mac OS X: The terminal should no longer lose its focus when the measurement area is shown. This should also make the mouse cursor reappear which is otherwise hidden by dispcal/dispread.
  • Mac OS X 10.6: The current display profile should now be determined correctly (e.g. for the curve viewer) when loading its calibration curves or selecting the “<Current>” settings.
  • Windows (installer): An unused console window is no longer shown when launching ${APPNAME} via the installed shortcuts.
  • Windows: Fixed executable not working under Windows 2000.

Changed in this release:

  • Do not pass through the “hit any key to retry” message from Argyll CMS tools to the progress dialog in case of misreads/port communication problems (retries happen automatically, so there is no need and also no possibility for keyboard interaction).
  • Enabling the Spyder 2 is now less cumbersome if the original installation CD is not available (especially on Mac OS X, where the firmware couldn't be found if a recent version of the Spyder 2 software was installed) and should work with the downloadable Spyder 2 software installers (but they need to be run to install the software first because the firmware can't be extracted from the installer binaries directly). Messages are now hopefully more informative to give a better idea of what to do. If the firmware can't be extracted from the Spyder 2 software installer, you are asked to install the software and try again. If that can't be done because of platform incompatibility (Linux), the last choice is to locate the Spyder.lib/CVSpyder.dll file manually (it must be copied from a Mac OS X or Windows system in that case).
  • Linux: Allow installation of profiles using GNOME Color Manager even if XRandR is not working/available.
  • Linux: Installation now checks for existing udev rules/hotplug scripts for instruments and only installs its own rules if none exist yet.
  • Linux/Windows: The profile loader will now show a warning dialog if a profile couldn't be loaded.
  • Linux/Windows: Device model and manufacturer are added to profiles if EDID[10] info is available.

+ Numerous other small fixes and changes.

2010-06-29 19:23 (UTC) 0.4.9.2

0.4.9.2

Fixed in this release:

  • Spectrometer sensor calibration sometimes accidentally occured when the instrument was still attached to the screen, leading to erroneous subsequent readings.
  • Immediately close a profile after reading to avoid locking it (fixes not being able to delete files from within the GUI).
  • Fixed quirks in “update calibration” and “update profile” operation.
  • The system-wide installation option in the profile install dialog is no longer hidden just because a profile has no embedded calibration curves (vcgt tag).
  • If the calibration curves of the current display profile couldn't be loaded for some reason (broken video card gamma table access, or no profile set), the curve viewer was not yet shown, and then a profile under “Settings” was selected, and then deleted, and then the curve viewer called up, an unhandled exception was raised.
  • Fixed ambient measurement via the “Measure” buttons timing out with the ColorMunki and various error handling issues regardless of instrument which could lead to an un-cancelable, forever looping progress bar.
  • Fixed ambient color temperature measurement via the “Measure” button not updating the kelvin field if selected.
  • Linux (only if the detected filesystem encoding is not UTF-8), Mac OS X and Windows: When installing a profile with “special” characters in the filename (everything not representable as 7-bit ASCII), it is now given an unique name containing the display number and MD5 hash, which fixes a few problems with filename encoding under Linux and Mac OS (under Linux the profile couldn't be successfully installed, under Mac OS X system-wide installation partly broke). This also fixes an issue under Windows where a profile whose name starts with the same first few characters (but has not the same name) as an already existing file in the system profile directory could accidentally overwrite that file, because I had not considered that filenames returned by win32api.GetShortPathName are only unique for the directory where a given file resides—and upon installation, that is the profile storage directory, not the system profile directory.
  • Linux, Mac OS X: When installing a profile, interaction with the curves window works now while the installation dialog is shown.
  • Windows (standalone executable): Fixed ambient measurement via the “Measure” buttons reproducably hanging (regardless of instrument) if the MS Visual C++ 2008 Redistributable Package (x86) was not installed.

Added in this release:

  • Linux: Oyranos support. If it is available, profiles are imported to the Oyranos database using oyranos-monitor upon installation, and an appropriate autostart entry is created to load calibration curves and setup the X _ICC_PROFILE atoms on login.
  • Linux: Rudimentary support for GNOME Color Manager. If it is available and XRandR is working, profiles are imported to GCM upon installation. Any calibration loaders created previously by ${APPNAME} will be removed (except the possible oyranos-monitor entry). You then still have to manually assign the profile to a display in the GCM preferences by selecting it and then choosing the profile from the dropdown menu (in the future, this process will be made obsolete by using GCM library functions). Loading of calibration curves and setting up the X _ICC_PROFILE atom and XRandR output properties is then handled by GCM.
  • Menu option to automatically show the log window after certain operations (measurements, profile creation).

Changed in this release:

  • The terminal window is now only shown when required (e.g. keyboard interaction during interactive display adjustment). Also, the terminal used is no longer an external application, but a minimal emulator that just passes keyboard input to the Argyll CMS tools.
  • All measurements which do not require keyboard interaction with Argyll CMS tools now show a progress dialog with the option to cancel the measurements. All output that was previously visible through the terminal is still available via the log window (“Tools” menu) and -file.
  • Always load calibration curves before installing a profile, even if the profile has no vcgt tag (resets calibration to linear).
  • Automatically scroll to bottom when messages are added to the log window.
  • Store calibration and profiling settings in extra sections inside the TI3 file instead of the profile copyright tag. Use “generic” copyright information (“Created with ${APPNAME} <version> and Argyll CMS <version>”), overridable by adding a line copyright = My copyright information in ${APPNAME}'s configuration file.
  • Made sure that only 7-bit ASCII gets written to a profile's copyright, ASCII description, and ASCII device model description. ICC v2 Unicode and Mac ScriptCode descriptions are now also written by default.
  • Presets default to high profile quality.
  • Remember visible state of curves, log window and testchart editor.
  • Updated french translation (thanks).
  • Linux: Unattended calibration & profiling no longer depends on xautomation.
  • Linux: EDID[10] is now used (if available) when generating descriptive identifiers for displays.
  • Linux: When determining a display's associated profile, check XrandR _ICC_PROFILE output properties first if available.
  • Linux: The option to install a profile system-wide is not offered if using GNOME Color Manager to install profiles (GCM has its own way to set profiles as system default).
  • Linux (only when GCM is not installed or XRandR is not working), Mac OS X, Windows: Installing a profile system-wide now also sets it as default for the current user.
  • Windows Vista and later: The option to install a profile system-wide is no longer offered if using Argyll CMS <= 1.1.1 (system scope in Argyll releases up to 1.1.1 acts like user scope on those systems).

+ Numerous other small fixes and changes. There is now also a mailing list for discussion and support as well as announcements (see at the top of this document).

2010-05-07 22:36 (UTC) 0.3.9.9

0.3.9.9

Fixed in this release:

  • Fixed unreliable (hanging occasionally) profile install when using system scope under Linux and Mac OS X (regression of a change in SVN r391 / 0.3.9.3).
  • Fixed ICC profile truncation if actual tag data is not in the same order as the tag table (regression of a change in SVN r274 / 0.3.0.7. Argyll profiles were not affected).
  • Fixed potential invalid profile name being generated if some unicode characters can't be conveyed in the file system encoding (Windows, Linux).
  • Fixed possible backslash in profile name due to wrong escaping when replacing invalid characters.
  • Fixed support for codepages 65000 (UTF-7) and 65001 (UTF-8) in the main application under Windows. This is actually a fix for shortcomings of Python.
2010-05-03 18:45 (UTC) 0.3.9.3

0.3.9.3

Added in this release:

  • Show percentage and amount of tone values per channel (+ grayscales) for calibration curves in the curve viewer and profile verification reports.
  • Profile verification: Enabled gray balance evaluation for all RGB charts containing grayscales (R=G=B). Added option to verify graybalance through calibration only (sets the target L* of each grayscale patch to the measured L* and target a*=b*=0).
  • Added documentation for the interactive display adjustment part of calibration.
  • Added further documentation of the profile verification feature with detailed information about underlying technical aspects.

Fixed in this release:

  • Fixed an unicode error after creating a profile verification report in a path containing unicode characters and a few other unrelated (potential) unicode errors.
  • Fixed potential unhandled exception if a JSON language file is malformed.
  • Fixed unhandled exception (local variable referenced before assignment) if trying to view calibration curves of an output with no video card gamma table access.
  • Fixed rare unhandled exception (local variable referenced before assignment) if logfile couldn't be renamed or removed during rollover.
  • Fail more gracefully (omit traceback from error message) if temp directory couldn't be created.
  • Fixed handling of XDG_CONFIG_DIRS and the system-wide autostart directory if the preferred configuration directory does not exist under Linux when installing a profile in local system scope, which prevented the system-wide autostart entry to be created.
  • Correctly determine system display profile under Windows Vista and 7 if no user profile is set. Fall back to sRGB if no display profile is set.

Changed in this release:

  • Changed default gamma from 2.4 to 2.2 in an attempt to increase the amount of available gamma table tone values after calibration for LCD screens, which often have a native response that is closer to a gamma of 2.2 than 2.4.
  • Changed default profile type to single curve + matrix.
  • Profile verification: Only evaluate grayscales (R=G=B) if their luminance is atleast 1% of the white luminance. Also evaluate combined Δa and Δb range.
  • Moved instrument feature details to separate JSON configuration file.
  • Made compatible with wxPython 2.8.6.0.
2010-03-31 15:24 (UTC) 0.3.8.0

0.3.8.0

Added in this release:

  • “Very large” testchart with 912 patches.
  • Profile verification: Support (non-Argyll) profiles which use chromatic adaption.

Fixed in this release:

  • Improved error message when Argyll binaries are not found (only files not found are now shown, together with alternatives). Automatically fall back to xicclu if icclu is not found (eg. Ubuntu's Argyll 1.0.3 package doesn't contain icclu).
  • Fixed 'invalid syntax' error when running under Python 2.5.
  • Profile verification report: Fixed a parsing error when reference or measurement data contained numbers in exponential notation.
  • Linux: Unhandled exception if DISPLAY environment variable is in the format [host]:displaynumber instead of [host]:displaynumber.screennumber (eg. :0 instead of :0.0).
  • Mac OS X: Fixed values entered in combo boxes not updating the configuration correctly under some circumstances.

Changed in this release:

  • Profile verification: Lookup device values relative colorimetrically and adapt the measured values to D50 before comparison (using Bradford matrix), so that the measured whitepoint corresponds to L*a*b* 100 0 0. Please note that verification results obtained with reference files measured in earlier versions of ${APPNAME} should not be compared to those obtained via this new approach if the display whitepoint is not D50, as the results are likely to be different as an effect of the relative lookup and the chromatic adaption.
  • Profile verification: Improved support for non-Argyll CGATS text files. Handling is as follows:
    • If the file contains RGB_R RGB_G RGB_B fields, it is handled like a Argyll *.ti1 (testchart) file—any XYZ or Lab data is ignored and the RGB numbers are sent to the display and measured. Afterwards, the measured values are compared to the expected values, which are obtained by sending the RGB numbers through the profile. If RGB values above 100 are found, a range of 0-255 is assumed. Otherwise, a range of 0-100 (like Argyll *.ti1) is assumed.
    • If the file doesn't contain RGB_R RGB_G RGB_B fields, but XYZ_X XYZ_Y XYZ_Z or LAB_L LAB_A LAB_B, it is handled like a Argyll measurement data (*.ti3) file—the values are used to lookup corresponding RGB numbers through the profile and these are then sent to the display and measured. Afterwards, the measured values are compared to the original XYZ or Lab values.
  • Profile verification report: Show measured whitepoint and assumed target color temperature (based on closest daylight temperature), and use them to calculate the Delta E for the whitepoint. A few performance improvements when processing large datasets with several hundred or thousand measurements.
  • GUI and ReadMe: Changed all occurences of the term “LUT curves” to “calibration curves” and also changed all occurences of the term “video LUT” to “video card gamma table” to better distinguish from “LUT profile”. Also renamed the “LUT viewer” to curve viewer as a more accurate description of its functionality.
2010-03-17 18:50 (UTC) 0.3.6.4

0.3.6.4

Added in this release:

  • Profile verification: CGATS-compatible text files (*.txt) containing measurement data can now be selected in addition to Argyll testchart (*.ti1) and measurement data (*.ti3) files.
  • Profile verification report: Depending on the chart used, you can now choose among different evaluation criteria from within the report. Also added Fogra Media Wedge V3 tolerance values for CMYK testcharts.

Fixed in this release:

  • Profile verification: Error 'Unknown color representation Lab' when trying to verify a L*a*b* LUT profile.
  • Profile verification: Wrong XYZ scaling when reading from *.ti3 files containing XYZ, but no L*a*b* values.
  • Profile verification: When measuring a display other than the first one, the calibration curves were erroneously still loaded to the 1st display.

Changed in this release:

  • Profile verification report: Show nominal and actual measured values as L*a*b* instead of XYZ. Reduced visible decimals in report to increase readability.
  • Split the cramped “Extra” menu into “Options” and “Tools”.
2010-03-13 06:31 (UTC) 0.3.6.2

0.3.6.2

Added in this release:

  • Profile verification by measurements. Argyll testchart (*.ti1) and measurement data (*.ti3) files can be measured.

Fixed in this release:

  • Testchart editor: Do not automatically select a saved testchart (regression of a change in 0.3.3.5). Do not show empty rows when creating a testchart using an algorythm that does not create the expected number of rows.
  • Bumped wxPython version check to 2.8.8.0 so a proper error message is displayed if wxPython is too old.
  • Linux: When using TwinView or Xinerama, the size of the measurement window was sometimes not correct.
  • Linux: Failure in get_argyll_version if Argyll utilities have alternate names (eg. argyll-targen instead of targen), which could prevent being able to open the testchart editor (regression of a change in 0.3.3.5).
  • Mac OS X 10.4: Fall back to ColorSyncScripting if Image Events does not return a display profile.

Changed in this release:

  • Linux: Info window no longer stays always on top.
  • Linux: When getting the current profile for a display, also look at the _ICC_DEVICE_PROFILE atom (see draft ICC Profiles in X Specification 0.4).
2010-03-02 20:12 (UTC) 0.3.3.6

0.3.3.6

Fixed in this release:

  • Linux/Mac OS X: 'tcgetattr failed' when trying to calibrate or profile.

Changed in this release:

  • Linux: Updated udev rules.
2010-03-01 06:27 (UTC) 0.3.3.5

0.3.3.5

Added in this release:

  • Capability to set whitepoint or ambient light level for viewing condition adjustment by measuring ambient light.
  • Profile name %tpa placeholder (test patch amount).
  • Documentation for ambient light level viewing conditions adjustment, advanced profiling options (gamut mapping) and testchart editor in the ReadMe. Also a few additions to the existing whitepoint/white level and tone curve documentation (mostly taken from the Argyll CMS documentation).
  • Two entries to the known issues & solutions section in the ReadMe (swapped colors and Photoshop “Monitor profile appears to be defective”).

Changed in this release:

  • New improved testcharts and presets, with lower patch counts: 12 patches default for gamma+matrix profiles, 48 patches default for curves+matrix profiles (former chart had 91 patches), 124 patches default for LUT profiles which should actually be usable this time around when coupled with a profile quality setting of “high”, unlike its predecessor with 127 patches which yielded mediocre results at best (but for increased accuracy, the new 238-patch “extended” testchart is recommended). 396 and 2386-patch charts (the new “large” and “massive” quantity) are also included.
  • Default to high profile quality (and force for gamma+matrix profiles, as there is no processing penalty like for curves+matrix or LUT profiles).
  • Removed limit for remembered settings files.
  • When calibration or profiling measurements fail, first show the main application window, then the error message (small dialog boxes are sometimes hard to spot on big screens if the application context is missing).
  • Moved profile quality, type and advanced settings above testchart selector (this order is more logical, as profile quality and type influences testchart selection).
  • Testchart editor: Default to adaption of 10% for testchart creation using optimized farthest point sampling (OFPS). Support both device and L*a*b* diagnostic VRML files when creating testcharts using Argyll >= 1.1.0. No longer calculate the amount of white/gray/single color patches or multidimensional cube steps if info is missing in testchart file (calculations take way too long for little added benefit).
  • Cleaned up the known issues & solutions section in the ReadMe.

Fixed in this release:

  • Wrong value for adaption settings in testchart editor being stored.
  • Linux (cosmetic): Incorrect special characters in console window when using non-english locale under certain configurations (regression of a change introduced in 0.3.0.7).
  • Non-critical: File information in Argyll CGATS TI1 to TI3 conversion.
  • Testchart editor: Do not allow overwriting of predefined testcharts when saving. Correctly remember last used filename when “saving as...”.
  • Log window: Correctly remember last used filename when saving.
  • Typo in the ReadMe (the second “Report on calibrated display device” entry under “Menu commands” should have been “Report on uncalibrated display device”).
2010-02-17 15:53 (UTC) 0.3.1.0

0.3.1.0

Fixed in this release:

  • Running “Calibrate & profile” several times in succession no longer fails on the 2nd and subsequent runs.
  • Linux: Missing wxPython version check for the measurement window subprocess.
2010-02-15 17:27 (UTC) 0.3.0.9

0.3.0.9

Added in this release:

  • Test chart editor: Support for Argyll 1.1.0 perceptual space-filling quasi-random test patch distribution.
2010-02-13 16:36 (UTC) 0.3.0.8

0.3.0.8

Fixed in this release:

  • #2951168 Windows: Critical bug with win32 API calls to get the display name returning 8-bit characters where only ASCII was expected.
2010-02-12 20:13 (UTC) 0.3.0.7

0.3.0.7

Added in this release:

  • Support for Argyll >= 1.1.0 adaptive emissive measurement mode with the i1 Pro spectrometer.
  • All of Argyll's profile types are now available (XYZ LUT on Windows only if using Argyll >= 1.1.0).
  • Support for “very low” calibration quality.
  • Optionally create a fast matrix/shaper profile when just calibrating.
  • “Reset video card gamma table” checkbox in the dialog shown when just profiling.
  • Information how to install Argyll >= 1.1.0 USB drivers on Windows Vista/7 64-bit to the “known issues and solutions” section in the ReadMe.
  • ReadMe, license, bug tracker and support forum can now be accessed from the “Help” menu.
  • “Check for update...” in the help menu (launches a web browser and displays the ${APPNAME} homepage if a new version is found).
  • Curve viewer: Capability to show the actual curves from the video card.
  • Curve viewer: Capability to show a matrix profile's rTRC/gTRC/bTRC curves.

Changed in this release:

  • When restoring defaults, selected display/instrument/measurement mode, language and profile name are retained.
  • The display/instrument selector is only enabled if more than one device detected respectively.
  • Changed i1 Pro highres measurement mode from implicit to user choice.
  • Gamut mapping: When selecting a source profile, pre-select a source viewing condition based on profile class (monitor or printer).
  • Updated defaults and presets to Argyll 1.1.0 values (i.e. black output offset).
  • Short display name placeholder (%dns) for profile name should not yield single numbers or model name without model number any more (or atleast less likely).
  • Log messages from most informational and all error dialogs.
  • Show file paths in most dialogs involving file processing.
  • Documentation in the ReadMe has been updated and is now more or less complete for the main application (testchart editor docs are still to be done). Setup instructions have also been streamlined.
  • Moved information how to fix video card gamma table access under Linux/X11 to the “known issues and solutions” section in the ReadMe.
  • Linux: Updated udev rules to those provided with Argyll 1.1.0. Removed obsolete permissions and policy files.
  • Linux: In multi-display setups using separate X screens, it should no longer be necessary to launch ${APPNAME} on the display you want to measure.
  • Windows: Get names of displays via additional Windows API calls (should yield more descriptive names than “DISPLAY1”, “DISPLAY2” etc.)
  • Windows (cosmetic): Use default command prompt text color, and a darker variant only when doing measurements.
  • ${APPNAME} version now corresponds to SVN revision number, split into its digit components. Build system (setup.py) uses SVN to generate version information.

Fixed in this release:

  • Curve viewer: When no display is selected (i.e. when Argyll binaries are not found), it will now try to show the vcgt of the 1st display's profile.
  • Curve viewer: When hiding the viewer and loading different calibration curves, those changes were not reflected when showing the viewer again.
  • Curve viewer: If a profile does not contain a 'vcgt' tag, clear canvas and disable R/G/B checkboxes.
  • Selection of display used for video card gamma table access not working correctly.
  • Loading of calibration upon initial preview in profile installation dialog if profile does not contain ${APPNAME} settings.
  • Do not show failure message if user cancels profile installation via the password dialog when installing in system scope.
  • In some cases, values read from the configuration file were not correctly validated (would only show with deliberately altered or broken config file).
  • colprof output is no longer swallowed when creating a matrix profile with Argyll versions <= 1.0.4.
  • Linux: Fall back to ASCII if detected encoding is not UTF-8 to fix profile install issues.
  • Linux/Mac OS X: Enabling the Spyder 2 colorimeter might need elevated privileges.
  • Linux/Mac OS X: When installing a profile in local system scope, the necessary password was not accepted under newer Linux distros and also Mac OS X > 10.4.11
  • Mac OS X (cosmetic): Suppress spurious AppleScript messages.
  • Windows: Get display profile via registry instead of Windows API because the latter does not reflect runtime changes to profile associations (you still need to refresh the curve viewer when changing profile associations outside of ${APPNAME} while it is running).

Known issues in this release:

  • Linux: You can't interact with the drop-down menu or the checkboxes in the curve viewer while a profile installation dialog is shown.
2009-07-16
  • Fixed a glitch in the Linux Autopackage installer where it would install even if required libraries were missing.
2009-06-30 0.2.6b3 (SVN r239)
  • fix (Windows): Fixed a critical bug in the Windows codepath which tried to access non-existent paths when certain settings were used.
2009-06-26 0.2.6b2
  • fix: Only look at <major>.<minor> during the Python version check (fixes a critical error on Ubuntu 9.10 Beta, where the Python revision number has an unexpected value).
  • fix: The curve viewer is now also able to plot calibration curves from *.cal files.
  • fix (Linux): If launched on an X display which is not the first display, the measurement window's location no longer determines the display which is used for measurements. This allows non-Xinerama multiscreen configurations to work with ${APPNAME}. Note: You need to launch ${APPNAME} on the display you want to measure, e.g. `DISPLAY=:0.1 ${APPNAME}`.
  • fix (Linux): Get the profile from the correct display when loading a display's calibration curves into the curve viewer.
  • fix (Linux, cosmetic): Suppress CUPS warnings encountered on some systems when using the curve viewer.
  • fix (Mac OS X): Do not offer 'Network' scope during profile installation if /Network/Library/ColorSync/Profiles does not exist.
  • fix (Windows, cosmetic): Made sure the message "Debug: src/helpers.cpp(140): 'CreateActCtx' failed with error 0x0000007b (the filename, directory name, or volume label syntax is incorrect.)" is not shown when launching the standalone Windows executable, by changing the way *.pyd files are bundled (they are now copied to the executable's directory and are no longer part of the executable itself).
  • chg: The curve viewer resets to linear if a display without associated profile is selected.
2009-06-22 0.2.6b
  • fix: calibration preview checkbox in the “install profile” dialog should now correctly toggle between previous and new calibration.
  • fix: profiling failed when creating a profile on top of an existing calibration.
  • fix: correctly decode environment variables (should fix a failure when trying to create a profile and the username contains non-ASCII characters).
  • fix: automatic restoration of defaults before loading settings from a profile or cal file should no longer restore “do not show again” dialogs.
  • fix (Windows): several errors related to character encoding.
  • chg: unattended calibration and profiling: wait 10 seconds instead of 5 after calibration before trying to start profiling measurements (some instruments seem to need longer to initialize than others, e.g. Spyder 2).
  • chg (Python packages and source): instead of requiring wxPython 2.8.x specifically, only ensure a minimal version of 2.8.
  • add: Curve viewer.
2009-06-11 21:33 (UTC)
  • Added Linux Autopackage download.
  • Renamed 55-Argyll.rules to 92-Argyll.rules, so it can work on Debian too.
  • Removed “Creating a standalone executable from source” section from the ReadMe (the topic is still handled under “Installing from source” / “Additional setup.py commands”).
2009-06-07 0.2.5b4
  • fix: “TypeError: coercing to Unicode: need string or buffer, instance found” when calling any of the get*Description() methods of an ICCProfile instance, which caused profile creation from existing profile to fail.
  • fix: (Windows Vista) application exit on launch if autostart directory did not exist.
  • fix: (source, Debian and RPM packages) use the correct wxPython version
  • fix: tab-key traversal of calibration settings controls.
  • fix: automatically scroll into view focused calibration settings controls if scrollbars are shown.
  • fix: properly clean & remove temporary directory.
  • fix: (cosmetic) added some padding to calibration settings right-hand side so scrollbar won't overlap if shown.
  • chg: (cosmetic) enable auto-sizing (fit to contents) for colortemp locus, trc type and profile type selectors.
  • chg: (cosmetic) do not show vendor name in instrument select dropdown (conserve some space).
  • chg: (cosmetic) made the instrument selector a little narrower (needs less space now to display instrument name because the vendor name is stripped) and the measure mode selector a bit wider (to accommodate for projector mode).
  • chg: only try to re-start within terminal if running as standalone executable.
  • chg: show application restart request in the chosen language after changing it.
  • chg: allow resizing/maximizing of main window (a minimal size is forced to prevent layout glitches).
  • chg: (Linux) install from source or package will try to automatically setup access to your instrument. Some services (PolicyKit/HAL or udev) may need to be restarted to get the updated configuration recognized. If in doubt, a reboot should work in all cases.
  • add: french translation (by Loïc Guégant, thanks!)
  • add: bdist_deb command and --cfg option for setup.py
2009-05-16 0.2.5b3
  • Fixed calibration loader autostart entry creation (“access denied” error) under Windows Vista and later with User Account Control enabled.
2009-05-07 0.2.5b2
  • Fixed “error: nothing to repeat” when using a spectrometer.
2009-05-05 0.2.5b
  • fix: encoding-related issues on all platforms and strange Unicode-related problems with AppleScript and Terminal on Mac OS X 10.4 (Details).
  • fix: (Windows) several actions unexpectedly failing under Windows 7 (${APPNAME} created temporary files via system calls on several occasions, but on Windows, this does not create the file in the user's temp directory as one would expect, but in the ROOT directory e.g. C:\—a sane method is now being used instead).
  • fix: bug in sorting function caused leading and trailing zeroes of numbers in testchart filenames to get lost, thus failing to load such files.
  • fix: (Linux) “No module named _md5” error with the standalone executable on some Linux distros (apparently an OpenSSL-related issue, because normally it wouldn't fall back to the legacy _md5 module which is not even built by default in recent Python versions). The fallback _md5 module is now included.
  • fix: calibration was not automatically added & selected in the dropdown menu when only calibrating.
  • fix: dropping a profile which was not created in ${APPNAME} onto the application window no longer results in an unhandled error.
  • fix: when trying to load calibration curves from a profile which actually does not contain any, an error message is now shown instead of resetting the video card gamma table to linear and erroneously stating the curves were succesfully loaded.
  • fix: add display device name as device model description when profiling.
  • fix: when creating a new profile from an existing profile, use that profile's device model description if present.
  • fix: also create .app/.sh/.cmd files when creating a new profile from existing measurement data.
  • fix: restore advanced gamut mapping options to default if selecting a profile which does not contain those settings.
  • fix: allow free selection of source and target viewing conditions in advanced gamut mapping options for LUT[7] profiles regardless of source profile type.
  • fix: if the screen or instrument that was selected in a previous session is not available, select an available one.
  • fix: (Mac) the “enable spyder 2” menu item would not allow to select files other than “setup.exe”.
  • fix: [src] (Mac) if ${APPNAME} was installed as application and then run from (separate) source, multiple copies were launched at certain occasions.
  • fix: selecting a different Argyll binary directory than the previous one now actually works.
  • chg: the previously empty entry at the top of the settings dropdown (settings which are not associated to a profile or .cal file) is now named “<current settings>”.
  • chg: changed settings which are associated to a profile or .cal file are now marked with a leading asterisk in the settings dropdown.
  • chg: default to a gamma of 2.4 (Argyll default).
  • chg: warn before changed settings are discarded.
  • chg: new default profile naming scheme.
  • chg: new default file locations on all platforms.
    - On Linux, ${APPNAME} now adheres to the XDG Base Directory Specification—the configuration file is saved as $XDG_CONFIG_HOME/${APPNAME}/${APPNAME}.ini ($XDG_CONFIG_HOME defaults to ~/.config if not set), all files created during calibration/profiling go into $XDG_DATA_HOME/${APPNAME}/storage/ ($XDG_DATA_HOME defaults to ~/.local/share if not set) by default, and logfiles into $XDG_DATA_HOME/${APPNAME}/logs/
    Any old (pre v0.2.5b) configuration data is retained in the file ~/.${APPNAME} and may be safely deleted after using v0.2.5b or newer for the first time.
    - On Mac OS, the configuration is saved as ~/Library/Preferences/${APPNAME}/${APPNAME}.ini, all files created during calibration/profiling go into ~/Library/Application Support/${APPNAME}/storage/ by default, and logfiles into ~/Library/Logs/${APPNAME}/
    Any old (pre v0.2.5b) configuration data is retained in the file ~/Library/Preferences/${APPNAME} Preferences and may be safely deleted after using v0.2.5b or newer for the first time.
    - On Windows, the configuration file is saved as %APPDATA%\${APPNAME}\${APPNAME}.ini, all files created during calibration/profiling go into %APPDATA%\${APPNAME}\storage\ by default, and logfiles into %APPDATA%\${APPNAME}\logs\
    Any old (pre v0.2.5b) configuration data is retained in the registry key HKEY_CURRENT_USER\Software\${APPNAME}.
  • chg: [build/src] (Windows) removed MS Visual C++ 2008 Redistributable DLLs from the source package. Users who build under Windows will have them anyway as they are installed with Python 2.6, so they are now copied directly from %SystemRoot%\WinSxS (Windows side-by-side assemblies) if possible.
  • chg: [build/src] SendKeys is now a dependency on Windows when running or building from source.
  • chg: [build/src] made ${APPNAME} a distutils package, so it can be built/installed via setup.py.
  • chg: default locations are now also searched for resource files ($XDG_DATA_HOME/${APPNAME}, $XDG_DATA_DIRS/${APPNAME} on Linux, ~/Library/Application Support/${APPNAME}, /Library/Application Support/${APPNAME} on Mac OS X, %APPDATA%\${APPNAME}, %COMMONAPPDATA%\${APPNAME} and %COMMONPROGRAMFILES%\${APPNAME} on Windows) in addition to the current working directory (which is always searched first if it differs from the executable directory) and the executable directory (which is always searched last).
  • chg: better error handling. For unhandled exceptions, a message box is shown and an entry is written to the logfile.
  • chg: (Linux) the calibration loader will no longer try and handle gnome-screensaver quirks—it was working too unreliably, and should really be fixed in gnome-screensaver. The current recommendation is to not use a screensaver at all if possible, and instead rely on the system's energy saving options.
  • chg: (Linux) there's no longer an installer for the Linux version.
  • chg: cancelling of certain operations like profile calculation and testchart generation is now also supported when using Python 2.5
  • chg: when searching for Argyll executables, also search for files with “argyll-” prefix or “-argyll” suffix (thanks to Mark Whitis for report).
  • chg: disable measurement mode selection when using a spectrometer.
  • add: logging (also see the change related to file-storage). Logfiles are created per-date. A maximum of 5 old ones is being kept as backup.
  • add: placeholders like display name, measurement device, whitepoint etc. can now be used in the profile name.
  • add: unattended calibration and profiling for some instruments, meaning it is no longer necessary to press a key after calibration to start the measurements for profiling (needs xautomation under Linux).
  • add: settings and related files can be deleted.
  • add: (Linux, Mac, Vista) profile install scope can be selected (note: local system scope install is broken with current Argyll versions under Linux).
  • add: version and translation information in the about window.
  • add: projector mode when using Argyll 1.1.0 Beta or newer with the X-Rite ColorMunki.
2009-01-01
Linux and sourcecode bugfix update: Creation of the autostart entry failed when the autostart directory did not yet exist.
2008-12-24 0.2.1b
  • fix: video card gamma table access check always returned false when no display profile was set.
  • chg: (Linux) ${APPNAME} now uses the autostart specification from freedesktop.org for the profile loader under Linux when installing profiles. NOTE for users: This also means you should manually remove any autostarts from previous versions, e.g.
    rm ~/.gnome2/dispwin-*.sh
    rm ~/.kde/Autostart/dispwin-*.sh

    and then re-install your current profile so the new loader is created. The new loader will be created in $XDG_CONFIG_HOME/autostart/ (if set) or ~/.config/autostart/ (if not set), with the filename ${APPNAME}-Calibration-Loader-Display-x.desktop, where x is the display number.
  • chg: the calibration loader will check if gnome-screensaver is running and if so, exit it before loading the calibration, then start it again to prevent resetting the calibration when activated.
  • chg: .sh/.cmd file in profile folder is no longer created when just installing a profile.
  • add: message box when selecting LUT[7] as profile type with recommendation to use more samples for higher quality profiles.
  • add: default to english locale if translation doesn't exist.
2008-12-18 0.2b
  • fix: no longer possible to introduce invalid value types through a malformed config file (which could lead to ${APPNAME} not launching).
  • fix: windows can no longer be moved permanently out of the visible screen area.
  • fix: spaces and special chars in the profile name should work now (should have from the start, but I had some superfluous code which broke it).
  • fix: spaces in the path to ${APPNAME} should work now under Linux and Mac OS X too (Windows had no problem)
  • fix: measurement file no longer gets deleted after successful measurement if profile generation fails (was a simple oversight on my side).
  • fix: [cosmetic] logo header now always spans the whole width of the window.
  • fix: [cosmetic] (Mac OS X) on first launch, a second, unused, terminal window is no longer opened.
  • fix: windows will now try to adjust its height to fit on small screens (scrollbars might appear).
  • chg: “Calibration file” renamed to “Settings” and moved to the top, is now a dropdown box remembering the last 10 used files. Settings are stored in and loaded from profiles.
  • chg: renamed “Display type” to “Measurement mode” and moved over to measurement device selector.
  • chg: default to “LCD” for measurement mode.
  • chg: default testchart file names are now localized.
  • chg: new default testcharts, four flavours: matrix default (91 patches), LUT[7] default (127 patches), large (512 patches) and massive (3012 patches).
  • chg: testchart selector is now a dropdown box, shows all testchart files in chosen directory plus the default testcharts.
  • chg: [build/src] new and improved build system.
  • chg: [build/src] Python 2.6 is now the recommended version to run and/or build ${APPNAME}. Python 2.5 is still supported, but you will not be able to cancel profile or testchart creation through the GUI[4].
  • chg: (Linux) externally installed wxGTK is no longer a dependency for executables.
  • chg: [build] Executables are now completely self-contained. The following paths are searched for additional language files: <user home directory>/${APPNAME}/lang, <${APPNAME} root directory>/lang
  • add: all settings now stored in profile whenever possible.
  • add: “Install” button next to settings dropdown to install selected profile.
  • add: dropdown to choose the display to use for video card gamma table access if all of the following applies:
    - more than one display connected
    - one of those displays seems to have non-working video card gamma table access (detected on startup)
    - one of those displays seems to have working video card gamma table access (detected on startup)
  • add: show patch count of selected testchart next to dropdown.
  • add: ability to select an icc profile (if it contains appropriate data) or measurement data file (.ti3) as testchart (converted on-the-fly).
  • add: testchart generator with editing cabability (experimental)
    - to select patches, click and drag the mouse over table cells, or hold SHIFT (select range) or CTRL/CMD (add/remove single cells/rows to/from selection)
    - to add a patch, double-click a row label
    - to delete patches, select them, then hold CTRL or CMD and hit DEL or BACKSPACE (will always delete whole rows even if only single cells selected)
    - CTRL-C/CTRL-V/CTRL-A = copy/paste/select all
  • add: advanced gamut mapping options for LUT[7]-type profiles, can also be used to overcome an apparent Photoshop CS3 bug under Mac OS X where the brush cursor shows strange artifacts when using LUT[7]-profiles with only one intent (thanks to Klaus Karcher for reporting this).
  • add: ability to generate profile from existing measurement data, even from an existing profile (if it contains appropriate data).
  • add: drag and drop calibration files (.cal), profiles (.icc/.icm), testcharts (.ti1) and measurement data files (.ti3) to the main window to process/select them (does not work very reliably on Mac OS X depending on where you drop the files, and you also get no optical feedback during the drag operation like the changed mouse cursor on Linux/Windows. Your best bet when dropping any files is perhaps the unoccupied area below “Settings”).
  • add: fully movable/resizable measurement window.
  • add: profile and testchart creation can be aborted (when running from source only if using Python >= 2.6).
  • add: “Before” / “After” switch when calibration / profiling complete.
  • add: menu item to enable Spyder 2 from within ${APPNAME}.
  • add: italian and spanish GUI[4] translations (thanks contributors!)
  • Numerous other small fixes/changes.
2008-08-21
Executable-only update for Linux (thanks to Patrice Vetsel for bug report): ${APPNAME} is now built against wxGTK 2.8.7.1, which becomes a dependency.
2008-08-18 0.1b
First public release.

DisplayCAL-3.1.0.0/misc/Info.plist0000644000076500000000000000224612647526533016416 0ustar devwheel00000000000000 CFBundleDevelopmentRegion English CFBundleExecutable %(CFBundleExecutable)s CFBundleGetInfoString %(CFBundleGetInfoString)s CFBundleIdentifier %(CFBundleIdentifier)s CFBundleInfoDictionaryVersion 6.0 CFBundleName %(CFBundleName)s CFBundlePackageType APPL CFBundleShortVersionString %(CFBundleShortVersionString)s CFBundleLongVersionString %(CFBundleLongVersionString)s CFBundleSignature %(CFBundleSignature)s CFBundleVersion %(CFBundleVersion)s NSHumanReadableCopyright %(NSHumanReadableCopyright)s CFBundleLocalizations en de es fr it DisplayCAL-3.1.0.0/misc/InnoSetup/0000755000076500000000000000000012653527012016354 5ustar devwheel00000000000000DisplayCAL-3.1.0.0/misc/InnoSetup/v5/0000755000076500000000000000000012653527012016706 5ustar devwheel00000000000000DisplayCAL-3.1.0.0/misc/InnoSetup/v5/Default.isl0000644000076500000000000004205012647526531021014 0ustar devwheel00000000000000; *** Inno Setup version 5.1.11+ English messages *** ; ; To download user-contributed translations of this file, go to: ; http://www.jrsoftware.org/files/istrans/ ; ; Note: When translating this text, do not add periods (.) to the end of ; messages that didn't have them already, because on those messages Inno ; Setup adds the periods automatically (appending a period would result in ; two periods being displayed). [LangOptions] ; The following three entries are very important. Be sure to read and ; understand the '[LangOptions] section' topic in the help file. LanguageName=English LanguageID=$0409 LanguageCodePage=0 ; If the language you are translating to requires special font faces or ; sizes, uncomment any of the following entries and change them accordingly. ;DialogFontName= ;DialogFontSize=8 ;WelcomeFontName=Verdana ;WelcomeFontSize=12 ;TitleFontName=Arial ;TitleFontSize=29 ;CopyrightFontName=Arial ;CopyrightFontSize=8 [Messages] ; *** Application titles SetupAppTitle=Setup SetupWindowTitle=Setup - %1 UninstallAppTitle=Uninstall UninstallAppFullTitle=%1 Uninstall ; *** Misc. common InformationTitle=Information ConfirmTitle=Confirm ErrorTitle=Error ; *** SetupLdr messages SetupLdrStartupMessage=This will install %1. Do you wish to continue? LdrCannotCreateTemp=Unable to create a temporary file. Setup aborted LdrCannotExecTemp=Unable to execute file in the temporary directory. Setup aborted ; *** Startup error messages LastErrorMessage=%1.%n%nError %2: %3 SetupFileMissing=The file %1 is missing from the installation directory. Please correct the problem or obtain a new copy of the program. SetupFileCorrupt=The setup files are corrupted. Please obtain a new copy of the program. SetupFileCorruptOrWrongVer=The setup files are corrupted, or are incompatible with this version of Setup. Please correct the problem or obtain a new copy of the program. NotOnThisPlatform=This program will not run on %1. OnlyOnThisPlatform=This program must be run on %1. OnlyOnTheseArchitectures=This program can only be installed on versions of Windows designed for the following processor architectures:%n%n%1 MissingWOW64APIs=The version of Windows you are running does not include functionality required by Setup to perform a 64-bit installation. To correct this problem, please install Service Pack %1. WinVersionTooLowError=This program requires %1 version %2 or later. WinVersionTooHighError=This program cannot be installed on %1 version %2 or later. AdminPrivilegesRequired=You must be logged in as an administrator when installing this program. PowerUserPrivilegesRequired=You must be logged in as an administrator or as a member of the Power Users group when installing this program. SetupAppRunningError=Setup has detected that %1 is currently running.%n%nPlease close all instances of it now, then click OK to continue, or Cancel to exit. UninstallAppRunningError=Uninstall has detected that %1 is currently running.%n%nPlease close all instances of it now, then click OK to continue, or Cancel to exit. ; *** Misc. errors ErrorCreatingDir=Setup was unable to create the directory "%1" ErrorTooManyFilesInDir=Unable to create a file in the directory "%1" because it contains too many files ; *** Setup common messages ExitSetupTitle=Exit Setup ExitSetupMessage=Setup is not complete. If you exit now, the program will not be installed.%n%nYou may run Setup again at another time to complete the installation.%n%nExit Setup? AboutSetupMenuItem=&About Setup... AboutSetupTitle=About Setup AboutSetupMessage=%1 version %2%n%3%n%n%1 home page:%n%4 AboutSetupNote= TranslatorNote= ; *** Buttons ButtonBack=< &Back ButtonNext=&Next > ButtonInstall=&Install ButtonOK=OK ButtonCancel=Cancel ButtonYes=&Yes ButtonYesToAll=Yes to &All ButtonNo=&No ButtonNoToAll=N&o to All ButtonFinish=&Finish ButtonBrowse=&Browse... ButtonWizardBrowse=B&rowse... ButtonNewFolder=&Make New Folder ; *** "Select Language" dialog messages SelectLanguageTitle=Select Setup Language SelectLanguageLabel=Select the language to use during the installation: ; *** Common wizard text ClickNext=Click Next to continue, or Cancel to exit Setup. BeveledLabel= BrowseDialogTitle=Browse For Folder BrowseDialogLabel=Select a folder in the list below, then click OK. NewFolderName=New Folder ; *** "Welcome" wizard page WelcomeLabel1=Welcome to the [name] Setup Wizard WelcomeLabel2=This will install [name/ver] on your computer.%n%nIt is recommended that you close all other applications before continuing. ; *** "Password" wizard page WizardPassword=Password PasswordLabel1=This installation is password protected. PasswordLabel3=Please provide the password, then click Next to continue. Passwords are case-sensitive. PasswordEditLabel=&Password: IncorrectPassword=The password you entered is not correct. Please try again. ; *** "License Agreement" wizard page WizardLicense=License Agreement LicenseLabel=Please read the following important information before continuing. LicenseLabel3=Please read the following License Agreement. You must accept the terms of this agreement before continuing with the installation. LicenseAccepted=I &accept the agreement LicenseNotAccepted=I &do not accept the agreement ; *** "Information" wizard pages WizardInfoBefore=Information InfoBeforeLabel=Please read the following important information before continuing. InfoBeforeClickLabel=When you are ready to continue with Setup, click Next. WizardInfoAfter=Information InfoAfterLabel=Please read the following important information before continuing. InfoAfterClickLabel=When you are ready to continue with Setup, click Next. ; *** "User Information" wizard page WizardUserInfo=User Information UserInfoDesc=Please enter your information. UserInfoName=&User Name: UserInfoOrg=&Organization: UserInfoSerial=&Serial Number: UserInfoNameRequired=You must enter a name. ; *** "Select Destination Location" wizard page WizardSelectDir=Select Destination Location SelectDirDesc=Where should [name] be installed? SelectDirLabel3=Setup will install [name] into the following folder. SelectDirBrowseLabel=To continue, click Next. If you would like to select a different folder, click Browse. DiskSpaceMBLabel=At least [mb] MB of free disk space is required. ToUNCPathname=Setup cannot install to a UNC pathname. If you are trying to install to a network, you will need to map a network drive. InvalidPath=You must enter a full path with drive letter; for example:%n%nC:\APP%n%nor a UNC path in the form:%n%n\\server\share InvalidDrive=The drive or UNC share you selected does not exist or is not accessible. Please select another. DiskSpaceWarningTitle=Not Enough Disk Space DiskSpaceWarning=Setup requires at least %1 KB of free space to install, but the selected drive only has %2 KB available.%n%nDo you want to continue anyway? DirNameTooLong=The folder name or path is too long. InvalidDirName=The folder name is not valid. BadDirName32=Folder names cannot include any of the following characters:%n%n%1 DirExistsTitle=Folder Exists DirExists=The folder:%n%n%1%n%nalready exists. Would you like to install to that folder anyway? DirDoesntExistTitle=Folder Does Not Exist DirDoesntExist=The folder:%n%n%1%n%ndoes not exist. Would you like the folder to be created? ; *** "Select Components" wizard page WizardSelectComponents=Select Components SelectComponentsDesc=Which components should be installed? SelectComponentsLabel2=Select the components you want to install; clear the components you do not want to install. Click Next when you are ready to continue. FullInstallation=Full installation ; if possible don't translate 'Compact' as 'Minimal' (I mean 'Minimal' in your language) CompactInstallation=Compact installation CustomInstallation=Custom installation NoUninstallWarningTitle=Components Exist NoUninstallWarning=Setup has detected that the following components are already installed on your computer:%n%n%1%n%nDeselecting these components will not uninstall them.%n%nWould you like to continue anyway? ComponentSize1=%1 KB ComponentSize2=%1 MB ComponentsDiskSpaceMBLabel=Current selection requires at least [mb] MB of disk space. ; *** "Select Additional Tasks" wizard page WizardSelectTasks=Select Additional Tasks SelectTasksDesc=Which additional tasks should be performed? SelectTasksLabel2=Select the additional tasks you would like Setup to perform while installing [name], then click Next. ; *** "Select Start Menu Folder" wizard page WizardSelectProgramGroup=Select Start Menu Folder SelectStartMenuFolderDesc=Where should Setup place the program's shortcuts? SelectStartMenuFolderLabel3=Setup will create the program's shortcuts in the following Start Menu folder. SelectStartMenuFolderBrowseLabel=To continue, click Next. If you would like to select a different folder, click Browse. MustEnterGroupName=You must enter a folder name. GroupNameTooLong=The folder name or path is too long. InvalidGroupName=The folder name is not valid. BadGroupName=The folder name cannot include any of the following characters:%n%n%1 NoProgramGroupCheck2=&Don't create a Start Menu folder ; *** "Ready to Install" wizard page WizardReady=Ready to Install ReadyLabel1=Setup is now ready to begin installing [name] on your computer. ReadyLabel2a=Click Install to continue with the installation, or click Back if you want to review or change any settings. ReadyLabel2b=Click Install to continue with the installation. ReadyMemoUserInfo=User information: ReadyMemoDir=Destination location: ReadyMemoType=Setup type: ReadyMemoComponents=Selected components: ReadyMemoGroup=Start Menu folder: ReadyMemoTasks=Additional tasks: ; *** "Preparing to Install" wizard page WizardPreparing=Preparing to Install PreparingDesc=Setup is preparing to install [name] on your computer. PreviousInstallNotCompleted=The installation/removal of a previous program was not completed. You will need to restart your computer to complete that installation.%n%nAfter restarting your computer, run Setup again to complete the installation of [name]. CannotContinue=Setup cannot continue. Please click Cancel to exit. ; *** "Installing" wizard page WizardInstalling=Installing InstallingLabel=Please wait while Setup installs [name] on your computer. ; *** "Setup Completed" wizard page FinishedHeadingLabel=Completing the [name] Setup Wizard FinishedLabelNoIcons=Setup has finished installing [name] on your computer. FinishedLabel=Setup has finished installing [name] on your computer. The application may be launched by selecting the installed icons. ClickFinish=Click Finish to exit Setup. FinishedRestartLabel=To complete the installation of [name], Setup must restart your computer. Would you like to restart now? FinishedRestartMessage=To complete the installation of [name], Setup must restart your computer.%n%nWould you like to restart now? ShowReadmeCheck=Yes, I would like to view the README file YesRadio=&Yes, restart the computer now NoRadio=&No, I will restart the computer later ; used for example as 'Run MyProg.exe' RunEntryExec=Run %1 ; used for example as 'View Readme.txt' RunEntryShellExec=View %1 ; *** "Setup Needs the Next Disk" stuff ChangeDiskTitle=Setup Needs the Next Disk SelectDiskLabel2=Please insert Disk %1 and click OK.%n%nIf the files on this disk can be found in a folder other than the one displayed below, enter the correct path or click Browse. PathLabel=&Path: FileNotInDir2=The file "%1" could not be located in "%2". Please insert the correct disk or select another folder. SelectDirectoryLabel=Please specify the location of the next disk. ; *** Installation phase messages SetupAborted=Setup was not completed.%n%nPlease correct the problem and run Setup again. EntryAbortRetryIgnore=Click Retry to try again, Ignore to proceed anyway, or Abort to cancel installation. ; *** Installation status messages StatusCreateDirs=Creating directories... StatusExtractFiles=Extracting files... StatusCreateIcons=Creating shortcuts... StatusCreateIniEntries=Creating INI entries... StatusCreateRegistryEntries=Creating registry entries... StatusRegisterFiles=Registering files... StatusSavingUninstall=Saving uninstall information... StatusRunProgram=Finishing installation... StatusRollback=Rolling back changes... ; *** Misc. errors ErrorInternal2=Internal error: %1 ErrorFunctionFailedNoCode=%1 failed ErrorFunctionFailed=%1 failed; code %2 ErrorFunctionFailedWithMessage=%1 failed; code %2.%n%3 ErrorExecutingProgram=Unable to execute file:%n%1 ; *** Registry errors ErrorRegOpenKey=Error opening registry key:%n%1\%2 ErrorRegCreateKey=Error creating registry key:%n%1\%2 ErrorRegWriteKey=Error writing to registry key:%n%1\%2 ; *** INI errors ErrorIniEntry=Error creating INI entry in file "%1". ; *** File copying errors FileAbortRetryIgnore=Click Retry to try again, Ignore to skip this file (not recommended), or Abort to cancel installation. FileAbortRetryIgnore2=Click Retry to try again, Ignore to proceed anyway (not recommended), or Abort to cancel installation. SourceIsCorrupted=The source file is corrupted SourceDoesntExist=The source file "%1" does not exist ExistingFileReadOnly=The existing file is marked as read-only.%n%nClick Retry to remove the read-only attribute and try again, Ignore to skip this file, or Abort to cancel installation. ErrorReadingExistingDest=An error occurred while trying to read the existing file: FileExists=The file already exists.%n%nWould you like Setup to overwrite it? ExistingFileNewer=The existing file is newer than the one Setup is trying to install. It is recommended that you keep the existing file.%n%nDo you want to keep the existing file? ErrorChangingAttr=An error occurred while trying to change the attributes of the existing file: ErrorCreatingTemp=An error occurred while trying to create a file in the destination directory: ErrorReadingSource=An error occurred while trying to read the source file: ErrorCopying=An error occurred while trying to copy a file: ErrorReplacingExistingFile=An error occurred while trying to replace the existing file: ErrorRestartReplace=RestartReplace failed: ErrorRenamingTemp=An error occurred while trying to rename a file in the destination directory: ErrorRegisterServer=Unable to register the DLL/OCX: %1 ErrorRegSvr32Failed=RegSvr32 failed with exit code %1 ErrorRegisterTypeLib=Unable to register the type library: %1 ; *** Post-installation errors ErrorOpeningReadme=An error occurred while trying to open the README file. ErrorRestartingComputer=Setup was unable to restart the computer. Please do this manually. ; *** Uninstaller messages UninstallNotFound=File "%1" does not exist. Cannot uninstall. UninstallOpenError=File "%1" could not be opened. Cannot uninstall UninstallUnsupportedVer=The uninstall log file "%1" is in a format not recognized by this version of the uninstaller. Cannot uninstall UninstallUnknownEntry=An unknown entry (%1) was encountered in the uninstall log ConfirmUninstall=Are you sure you want to completely remove %1 and all of its components? UninstallOnlyOnWin64=This installation can only be uninstalled on 64-bit Windows. OnlyAdminCanUninstall=This installation can only be uninstalled by a user with administrative privileges. UninstallStatusLabel=Please wait while %1 is removed from your computer. UninstalledAll=%1 was successfully removed from your computer. UninstalledMost=%1 uninstall complete.%n%nSome elements could not be removed. These can be removed manually. UninstalledAndNeedsRestart=To complete the uninstallation of %1, your computer must be restarted.%n%nWould you like to restart now? UninstallDataCorrupted="%1" file is corrupted. Cannot uninstall ; *** Uninstallation phase messages ConfirmDeleteSharedFileTitle=Remove Shared File? ConfirmDeleteSharedFile2=The system indicates that the following shared file is no longer in use by any programs. Would you like for Uninstall to remove this shared file?%n%nIf any programs are still using this file and it is removed, those programs may not function properly. If you are unsure, choose No. Leaving the file on your system will not cause any harm. SharedFileNameLabel=File name: SharedFileLocationLabel=Location: WizardUninstalling=Uninstall Status StatusUninstalling=Uninstalling %1... ; The custom messages below aren't used by Setup itself, but if you make ; use of them in your scripts, you'll want to translate them. [CustomMessages] NameAndVersion=%1 version %2 AdditionalIcons=Additional icons: CreateDesktopIcon=Create a &desktop icon CreateQuickLaunchIcon=Create a &Quick Launch icon ProgramOnTheWeb=%1 on the Web UninstallProgram=Uninstall %1 LaunchProgram=Launch %1 AssocFileExtension=&Associate %1 with the %2 file extension AssocingFileExtension=Associating %1 with the %2 file extension... AskRemove=Do you want to remove %1? SelectVersion=Select version ChangeIntegration=Change desktop integration CalibrationLoading=Calibration loading on login: CalibrationLoadingHandledByDisplayCAL=Let DisplayCAL handle calibration loading (high precision and reliability) CalibrationLoadingHandledByOS=Let the operating system handle calibration loading (low precision and reliability)DisplayCAL-3.1.0.0/misc/InnoSetup/v5/Languages/0000755000076500000000000000000012653527012020614 5ustar devwheel00000000000000DisplayCAL-3.1.0.0/misc/InnoSetup/v5/Languages/French.isl0000644000076500000000000005067512647526531022557 0ustar devwheel00000000000000; *** Inno Setup version 5.1.11+ French messages *** ; ; To download user-contributed translations of this file, go to: ; http://www.jrsoftware.org/is3rdparty.php ; ; Note: When translating this text, do not add periods (.) to the end of ; messages that didn't have them already, because on those messages Inno ; Setup adds the periods automatically (appending a period would result in ; two periods being displayed). ; ; Maintained by Pierre Yager (pierre@levosgien.net) ; ; Contributors : Frdric Bonduelle, Francis Pallini, Lumina, Pascal Peyrot ; ; Changes : ; + Accents on uppercase letters ; http://www.academie-francaise.fr/langue/questions.html#accentuation (lumina) ; + Typography quotes [see ISBN: 978-2-7433-0482-9] ; http://fr.wikipedia.org/wiki/Guillemet (lumina) ; + Binary units (Kio, Mio) [IEC 80000-13:2008] ; http://fr.wikipedia.org/wiki/Octet (lumina) ; + Reverted to standard units (Ko, Mo) to follow Windows Explorer Standard ; http://blogs.msdn.com/b/oldnewthing/archive/2009/06/11/9725386.aspx ; ; $jrsoftware: issrc/Files/Languages/French.isl,v 1.18 2011/02/15 14:52:59 mlaan Exp $ [LangOptions] LanguageName=Fran<00E7>ais LanguageID=$040C LanguageCodePage=1252 [Messages] ; *** Application titles SetupAppTitle=Installation SetupWindowTitle=Installation - %1 UninstallAppTitle=Dsinstallation UninstallAppFullTitle=Dsinstallation - %1 ; *** Misc. common InformationTitle=Information ConfirmTitle=Confirmation ErrorTitle=Erreur ; *** SetupLdr messages SetupLdrStartupMessage=Cet assistant va installer %1. Voulez-vous continuer ? LdrCannotCreateTemp=Impossible de crer un fichier temporaire. Abandon de l'installation LdrCannotExecTemp=Impossible d'excuter un fichier depuis le dossier temporaire. Abandon de l'installation ; *** Startup error messages LastErrorMessage=%1.%n%nErreur %2 : %3 SetupFileMissing=Le fichier %1 est absent du dossier d'installation. Veuillez corriger le problme ou vous procurer une nouvelle copie du programme. SetupFileCorrupt=Les fichiers d'installation sont altrs. Veuillez vous procurer une nouvelle copie du programme. SetupFileCorruptOrWrongVer=Les fichiers d'installation sont altrs ou ne sont pas compatibles avec cette version de l'assistant d'installation. Veuillez corriger le problme ou vous procurer une nouvelle copie du programme. NotOnThisPlatform=Ce programme ne fonctionne pas sous %1. OnlyOnThisPlatform=Ce programme ne peut fonctionner que sous %1. OnlyOnTheseArchitectures=Ce programme ne peut tre install que sur des versions de Windows qui supportent ces architectures : %n%n%1 MissingWOW64APIs=La version de Windows que vous utilisez ne dispose pas des fonctionnalits ncessaires pour que l'assistant puisse raliser une installation 64 bits. Pour corriger ce problme vous devez installer le Service Pack %1. WinVersionTooLowError=Ce programme requiert la version %2 ou suprieure de %1. WinVersionTooHighError=Ce programme ne peut pas tre install sous %1 version %2 ou suprieure. AdminPrivilegesRequired=Vous devez disposer des droits d'administration de cet ordinateur pour installer ce programme. PowerUserPrivilegesRequired=Vous devez disposer des droits d'administration ou faire partie du groupe Utilisateurs avec pouvoir de cet ordinateur pour installer ce programme. SetupAppRunningError=L'assistant d'installation a dtect que %1 est actuellement en cours d'excution.%n%nVeuillez fermer toutes les instances de cette application puis appuyer sur OK pour continuer, ou bien appuyer sur Annuler pour abandonner l'installation. UninstallAppRunningError=La procdure de dsinstallation a dtect que %1 est actuellement en cours d'excution.%n%nVeuillez fermer toutes les instances de cette application puis appuyer sur OK pour continuer, ou bien appuyer sur Annuler pour abandonner la dsinstallation. ; *** Misc. errors ErrorCreatingDir=L'assistant d'installation n'a pas pu crer le dossier "%1" ErrorTooManyFilesInDir=L'assistant d'installation n'a pas pu crer un fichier dans le dossier "%1" car celui-ci contient trop de fichiers ; *** Setup common messages ExitSetupTitle=Quitter l'installation ExitSetupMessage=L'installation n'est pas termine. Si vous abandonnez maintenant, le programme ne sera pas install.%n%nVous devrez relancer cet assistant pour finir l'installation.%n%nVoulez-vous quand mme quitter l'assistant d'installation ? AboutSetupMenuItem=& propos... AboutSetupTitle= Propos de l'assistant d'installation AboutSetupMessage=%1 version %2%n%3%n%nPage d'accueil de %1 :%n%4 AboutSetupNote= TranslatorNote=Traduction franaise maintenue par Pierre Yager (pierre@levosgien.net) ; *** Buttons ButtonBack=< &Prcdent ButtonNext=&Suivant > ButtonInstall=&Installer ButtonOK=OK ButtonCancel=Annuler ButtonYes=&Oui ButtonYesToAll=Oui pour &tout ButtonNo=&Non ButtonNoToAll=N&on pour tout ButtonFinish=&Terminer ButtonBrowse=Pa&rcourir... ButtonWizardBrowse=Pa&rcourir... ButtonNewFolder=Nouveau &dossier ; *** "Select Language" dialog messages SelectLanguageTitle=Langue de l'assistant d'installation SelectLanguageLabel=Veuillez slectionner la langue qui sera utilise par l'assistant d'installation : ; *** Common wizard text ClickNext=Appuyez sur Suivant pour continuer ou sur Annuler pour abandonner l'installation. BeveledLabel= BrowseDialogTitle=Parcourir les dossiers BrowseDialogLabel=Veuillez choisir un dossier de destination, puis appuyez sur OK. NewFolderName=Nouveau dossier ; *** "Welcome" wizard page WelcomeLabel1=Bienvenue dans l'assistant d'installation de [name] WelcomeLabel2=Cet assistant va vous guider dans l'installation de [name/ver] sur votre ordinateur.%n%nIl est recommand de fermer toutes les applications actives avant de continuer. ; *** "Password" wizard page WizardPassword=Mot de passe PasswordLabel1=Cette installation est protge par un mot de passe. PasswordLabel3=Veuillez saisir le mot de passe (attention la distinction entre majuscules et minuscules) puis appuyez sur Suivant pour continuer. PasswordEditLabel=&Mot de passe : IncorrectPassword=Le mot de passe saisi n'est pas valide. Veuillez essayer nouveau. ; *** "License Agreement" wizard page WizardLicense=Accord de licence LicenseLabel=Les informations suivantes sont importantes. Veuillez les lire avant de continuer. LicenseLabel3=Veuillez lire le contrat de licence suivant. Vous devez en accepter tous les termes avant de continuer l'installation. LicenseAccepted=Je comprends et j'&accepte les termes du contrat de licence LicenseNotAccepted=Je &refuse les termes du contrat de licence ; *** "Information" wizard pages WizardInfoBefore=Information InfoBeforeLabel=Les informations suivantes sont importantes. Veuillez les lire avant de continuer. InfoBeforeClickLabel=Lorsque vous tes prt continuer, appuyez sur Suivant. WizardInfoAfter=Information InfoAfterLabel=Les informations suivantes sont importantes. Veuillez les lire avant de continuer. InfoAfterClickLabel=Lorsque vous tes prt continuer, appuyez sur Suivant. ; *** "User Information" wizard page WizardUserInfo=Informations sur l'Utilisateur UserInfoDesc=Veuillez saisir les informations qui vous concernent. UserInfoName=&Nom d'utilisateur : UserInfoOrg=&Organisation : UserInfoSerial=Numro de &srie : UserInfoNameRequired=Vous devez au moins saisir un nom. ; *** "Select Destination Location" wizard page WizardSelectDir=Dossier de destination SelectDirDesc=O [name] doit-il tre install ? SelectDirLabel3=L'assistant va installer [name] dans le dossier suivant. SelectDirBrowseLabel=Pour continuer, appuyez sur Suivant. Si vous souhaitez choisir un dossier diffrent, appuyez sur Parcourir. DiskSpaceMBLabel=Le programme requiert au moins [mb] Mo d'espace disque disponible. ToUNCPathname=L'assistant d'installation ne supporte pas les chemins rseau. Si vous souhaitez effectuer cette installation sur un rseau, vous devez d'abord connecter un lecteur rseau. InvalidPath=Vous devez saisir un chemin complet avec sa lettre de lecteur ; par exemple :%n%nC:\APP%n%nou un chemin rseau de la forme :%n%n\\serveur\partage InvalidDrive=L'unit ou l'emplacement rseau que vous avez slectionn n'existe pas ou n'est pas accessible. Veuillez choisir une autre destination. DiskSpaceWarningTitle=Espace disponible insuffisant DiskSpaceWarning=L'assistant a besoin d'au moins %1 Ko d'espace disponible pour effectuer l'installation, mais l'unit que vous avez slectionne ne dispose que de %2 Ko d'espace disponible.%n%nSouhaitez-vous continuer malgr tout ? DirNameTooLong=Le nom ou le chemin du dossier est trop long. InvalidDirName=Le nom du dossier est invalide. BadDirName32=Le nom du dossier ne doit contenir aucun des caractres suivants :%n%n%1 DirExistsTitle=Dossier existant DirExists=Le dossier :%n%n%1%n%nexiste dj. Souhaitez-vous installer dans ce dossier malgr tout ? DirDoesntExistTitle=Le dossier n'existe pas DirDoesntExist=Le dossier %n%n%1%n%nn'existe pas. Souhaitez-vous que ce dossier soit cr ? ; *** "Select Components" wizard page WizardSelectComponents=Composants installer SelectComponentsDesc=Quels composants de l'application souhaitez-vous installer ? SelectComponentsLabel2=Slectionnez les composants que vous dsirez installer ; dcochez les composants que vous ne dsirez pas installer. Appuyez ensuite sur Suivant pour continuer l'installation. FullInstallation=Installation complte ; if possible don't translate 'Compact' as 'Minimal' (I mean 'Minimal' in your language) CompactInstallation=Installation compacte CustomInstallation=Installation personnalise NoUninstallWarningTitle=Composants existants NoUninstallWarning=L'assistant d'installation a dtect que les composants suivants sont dj installs sur votre systme :%n%n%1%n%nDslectionner ces composants ne les dsinstallera pas pour autant.%n%nVoulez-vous continuer malgr tout ? ComponentSize1=%1 Ko ComponentSize2=%1 Mo ComponentsDiskSpaceMBLabel=Les composants slectionns ncessitent au moins [mb] Mo d'espace disponible. ; *** "Select Additional Tasks" wizard page WizardSelectTasks=Tches supplmentaires SelectTasksDesc=Quelles sont les tches supplmentaires qui doivent tre effectues ? SelectTasksLabel2=Slectionnez les tches supplmentaires que l'assistant d'installation doit effectuer pendant l'installation de [name], puis appuyez sur Suivant. ; *** "Select Start Menu Folder" wizard page WizardSelectProgramGroup=Slection du dossier du menu Dmarrer SelectStartMenuFolderDesc=O l'assistant d'installation doit-il placer les raccourcis du programme ? SelectStartMenuFolderLabel3=L'assistant va crer les raccourcis du programme dans le dossier du menu Dmarrer indiqu ci-dessous. SelectStartMenuFolderBrowseLabel=Appuyez sur Suivant pour continuer. Appuyez sur Parcourir si vous souhaitez slectionner un autre dossier du menu Dmarrer. MustEnterGroupName=Vous devez saisir un nom de dossier du menu Dmarrer. GroupNameTooLong=Le nom ou le chemin du dossier est trop long. InvalidGroupName=Le nom du dossier n'est pas valide. BadGroupName=Le nom du dossier ne doit contenir aucun des caractres suivants :%n%n%1 NoProgramGroupCheck2=Ne pas crer de &dossier dans le menu Dmarrer ; *** "Ready to Install" wizard page WizardReady=Prt installer ReadyLabel1=L'assistant dispose prsent de toutes les informations pour installer [name] sur votre ordinateur. ReadyLabel2a=Appuyez sur Installer pour procder l'installation ou sur Prcdent pour revoir ou modifier une option d'installation. ReadyLabel2b=Appuyez sur Installer pour procder l'installation. ReadyMemoUserInfo=Informations sur l'utilisateur : ReadyMemoDir=Dossier de destination : ReadyMemoType=Type d'installation : ReadyMemoComponents=Composants slectionns : ReadyMemoGroup=Dossier du menu Dmarrer : ReadyMemoTasks=Tches supplmentaires : ; *** "Preparing to Install" wizard page WizardPreparing=Prparation de l'installation PreparingDesc=L'assistant d'installation prpare l'installation de [name] sur votre ordinateur. PreviousInstallNotCompleted=L'installation ou la suppression d'un programme prcdent n'est pas totalement acheve. Veuillez redmarrer votre ordinateur pour achever cette installation ou suppression.%n%nUne fois votre ordinateur redmarr, veuillez relancer cet assistant pour reprendre l'installation de [name]. CannotContinue=L'assistant ne peut pas continuer. Veuillez appuyer sur Annuler pour abandonner l'installation. ; *** "Installing" wizard page WizardInstalling=Installation en cours InstallingLabel=Veuillez patienter pendant que l'assistant installe [name] sur votre ordinateur. ; *** "Setup Completed" wizard page FinishedHeadingLabel=Fin de l'installation de [name] FinishedLabelNoIcons=L'assistant a termin l'installation de [name] sur votre ordinateur. FinishedLabel=L'assistant a termin l'installation de [name] sur votre ordinateur. L'application peut tre lance l'aide des icnes cres sur le Bureau par l'installation. ClickFinish=Veuillez appuyer sur Terminer pour quitter l'assistant d'installation. FinishedRestartLabel=L'assistant doit redmarrer votre ordinateur pour terminer l'installation de [name].%n%nVoulez-vous redmarrer maintenant ? FinishedRestartMessage=L'assistant doit redmarrer votre ordinateur pour terminer l'installation de [name].%n%nVoulez-vous redmarrer maintenant ? ShowReadmeCheck=Oui, je souhaite lire le fichier LISEZMOI YesRadio=&Oui, redmarrer mon ordinateur maintenant NoRadio=&Non, je prfre redmarrer mon ordinateur plus tard ; used for example as 'Run MyProg.exe' RunEntryExec=Excuter %1 ; used for example as 'View Readme.txt' RunEntryShellExec=Voir %1 ; *** "Setup Needs the Next Disk" stuff ChangeDiskTitle=L'assistant a besoin du disque suivant SelectDiskLabel2=Veuillez insrer le disque %1 et appuyer sur OK.%n%nSi les fichiers de ce disque se trouvent un emplacement diffrent de celui indiqu ci-dessous, veuillez saisir le chemin correspondant ou appuyez sur Parcourir. PathLabel=&Chemin : FileNotInDir2=Le fichier "%1" ne peut pas tre trouv dans "%2". Veuillez insrer le bon disque ou slectionner un autre dossier. SelectDirectoryLabel=Veuillez indiquer l'emplacement du disque suivant. ; *** Installation phase messages SetupAborted=L'installation n'est pas termine.%n%nVeuillez corriger le problme et relancer l'installation. EntryAbortRetryIgnore=Appuyez sur Ressayer pour essayer nouveau, Ignorer pour continuer malgr tout, ou Abandonner pour annuler l'installation. ; *** Installation status messages StatusCreateDirs=Cration des dossiers... StatusExtractFiles=Extraction des fichiers... StatusCreateIcons=Cration des raccourcis... StatusCreateIniEntries=Cration des entres du fichier INI... StatusCreateRegistryEntries=Cration des entres de registre... StatusRegisterFiles=Enregistrement des fichiers... StatusSavingUninstall=Sauvegarde des informations de dsinstallation... StatusRunProgram=Finalisation de l'installation... StatusRollback=Annulation des modifications... ; *** Misc. errors ErrorInternal2=Erreur interne : %1 ErrorFunctionFailedNoCode=%1 a chou ErrorFunctionFailed=%1 a chou ; code %2 ErrorFunctionFailedWithMessage=%1 a chou ; code %2.%n%3 ErrorExecutingProgram=Impossible d'excuter le fichier :%n%1 ; *** Registry errors ErrorRegOpenKey=Erreur lors de l'ouverture de la cl de registre :%n%1\%2 ErrorRegCreateKey=Erreur lors de la cration de la cl de registre :%n%1\%2 ErrorRegWriteKey=Erreur lors de l'criture de la cl de registre :%n%1\%2 ; *** INI errors ErrorIniEntry=Erreur d'criture d'une entre dans le fichier INI "%1". ; *** File copying errors FileAbortRetryIgnore=Appuyez sur Ressayer pour essayer nouveau, Ignorer pour passer ce fichier (dconseill), ou Abandonner pour annuler l'installation. FileAbortRetryIgnore2=Appuyez sur Ressayer pour essayer nouveau, Ignorer pour continuer malgr tout (dconseill), ou Abandonner pour annuler l'installation. SourceIsCorrupted=Le fichier source est altr SourceDoesntExist=Le fichier source "%1" n'existe pas ExistingFileReadOnly=Le fichier existant est protg en lecture seule.%n%nAppuyez sur Ressayer pour enlever la protection et essayer nouveau, Ignorer pour passer ce fichier, ou Abandonner pour annuler l'installation. ErrorReadingExistingDest=Une erreur s'est produite lors de la tentative de lecture du fichier existant : FileExists=Le fichier existe dj.%n%nSouhaitez-vous que l'installation le remplace ? ExistingFileNewer=Le fichier existant est plus rcent que celui que l'assistant essaie d'installer. Il est recommand de conserver le fichier existant.%n%nSouhaitez-vous conserver le fichier existant ? ErrorChangingAttr=Une erreur est survenue en essayant de modifier les attributs du fichier existant : ErrorCreatingTemp=Une erreur est survenue en essayant de crer un fichier dans le dossier de destination : ErrorReadingSource=Une erreur est survenue lors de la lecture du fichier source : ErrorCopying=Une erreur est survenue lors de la copie d'un fichier : ErrorReplacingExistingFile=Une erreur est survenue lors du remplacement d'un fichier existant : ErrorRestartReplace=Le marquage d'un fichier pour remplacement au redmarrage de l'ordinateur a chou : ErrorRenamingTemp=Une erreur est survenue en essayant de renommer un fichier dans le dossier de destination : ErrorRegisterServer=Impossible d'enregistrer la bibliothque DLL/OCX : %1 ErrorRegSvr32Failed=RegSvr32 a chou et a retourn le code d'erreur %1 ErrorRegisterTypeLib=Impossible d'enregistrer la bibliothque de type : %1 ; *** Post-installation errors ErrorOpeningReadme=Une erreur est survenue l'ouverture du fichier LISEZMOI. ErrorRestartingComputer=L'installation n'a pas pu redmarrer l'ordinateur. Merci de bien vouloir le faire vous-mme. ; *** Uninstaller messages UninstallNotFound=Le fichier "%1" n'existe pas. Impossible de dsinstaller. UninstallOpenError=Le fichier "%1" n'a pas pu tre ouvert. Impossible de dsinstaller UninstallUnsupportedVer=Le format du fichier journal de dsinstallation "%1" n'est pas reconnu par cette version de la procdure de dsinstallation. Impossible de dsinstaller UninstallUnknownEntry=Une entre inconnue (%1) a t rencontre dans le fichier journal de dsinstallation ConfirmUninstall=Voulez-vous vraiment dsinstaller compltement %1 ainsi que tous ses composants ? UninstallOnlyOnWin64=La dsinstallation de ce programme ne fonctionne qu'avec une version 64 bits de Windows. OnlyAdminCanUninstall=Ce programme ne peut tre dsinstall que par un utilisateur disposant des droits d'administration. UninstallStatusLabel=Veuillez patienter pendant que %1 est retir de votre ordinateur. UninstalledAll=%1 a t correctement dsinstall de cet ordinateur. UninstalledMost=La dsinstallation de %1 est termine.%n%nCertains lments n'ont pas pu tre supprims automatiquement. Vous pouvez les supprimer manuellement. UninstalledAndNeedsRestart=Vous devez redmarrer l'ordinateur pour terminer la dsinstallation de %1.%n%nVoulez-vous redmarrer maintenant ? UninstallDataCorrupted=Le ficher "%1" est altr. Impossible de dsinstaller ; *** Uninstallation phase messages ConfirmDeleteSharedFileTitle=Supprimer les fichiers partags ? ConfirmDeleteSharedFile2=Le systme indique que le fichier partag suivant n'est plus utilis par aucun programme. Souhaitez-vous que la dsinstallation supprime ce fichier partag ?%n%nSi des programmes utilisent encore ce fichier et qu'il est supprim, ces programmes ne pourront plus fonctionner correctement. Si vous n'tes pas sr, choisissez Non. Laisser ce fichier dans votre systme ne posera pas de problme. SharedFileNameLabel=Nom du fichier : SharedFileLocationLabel=Emplacement : WizardUninstalling=tat de la dsinstallation StatusUninstalling=Dsinstallation de %1... ; Les messages personnaliss suivants ne sont pas utilis par l'installation ; elle-mme, mais si vous les utilisez dans vos scripts, vous devez les ; traduire [CustomMessages] NameAndVersion=%1 version %2 AdditionalIcons=Icnes supplmentaires : CreateDesktopIcon=Crer une icne sur le &Bureau CreateQuickLaunchIcon=Crer une icne dans la barre de &Lancement rapide ProgramOnTheWeb=Page d'accueil de %1 UninstallProgram=Dsinstaller %1 LaunchProgram=Excuter %1 AssocFileExtension=&Associer %1 avec l'extension de fichier %2 AssocingFileExtension=Associe %1 avec l'extension de fichier %2... CalibrationLoading=Chargement d'talonnage lors de la connexion: CalibrationLoadingHandledByDisplayCAL=DisplayCAL Profile Loader (haute prcision et de la fiabilit) CalibrationLoadingHandledByOS=Systme d'exploitation (faible prcision et de la fiabilit)DisplayCAL-3.1.0.0/misc/InnoSetup/v5/Languages/German.isl0000644000076500000000000004572512647526531022563 0ustar devwheel00000000000000; ****************************************************** ; *** *** ; *** Inno Setup version 5.1.11+ German messages *** ; *** *** ; *** Original Author: *** ; *** *** ; *** Michael Reitz (innosetup@assimilate.de) *** ; *** *** ; *** Contributors: *** ; *** *** ; *** Roland Ruder (info@rr4u.de) *** ; *** LaughingMan (puma.d@web.de) *** ; *** *** ; ****************************************************** ; ; Diese bersetzung hlt sich an die neue deutsche Rechtschreibung. [LangOptions] LanguageName=Deutsch LanguageID=$0407 LanguageCodePage=1252 [Messages] ; *** Application titles SetupAppTitle=Setup SetupWindowTitle=Setup - %1 UninstallAppTitle=Entfernen UninstallAppFullTitle=%1 entfernen ; *** Misc. common InformationTitle=Information ConfirmTitle=Besttigen ErrorTitle=Fehler ; *** SetupLdr messages SetupLdrStartupMessage=%1 wird jetzt installiert. Mchten Sie fortfahren? LdrCannotCreateTemp=Es konnte keine temporre Datei erstellt werden. Das Setup wurde abgebrochen LdrCannotExecTemp=Die Datei konnte nicht im temporren Ordner ausgefhrt werden. Das Setup wurde abgebrochen ; *** Startup error messages LastErrorMessage=%1.%n%nFehler %2: %3 SetupFileMissing=Die Datei %1 fehlt im Installations-Ordner. Bitte beheben Sie das Problem, oder besorgen Sie sich eine neue Kopie des Programms. SetupFileCorrupt=Die Setup-Dateien sind beschdigt. Besorgen Sie sich bitte eine neue Kopie des Programms. SetupFileCorruptOrWrongVer=Die Setup-Dateien sind beschdigt oder inkompatibel zu dieser Version des Setups. Bitte beheben Sie das Problem, oder besorgen Sie sich eine neue Kopie des Programms. NotOnThisPlatform=Dieses Programm kann nicht unter %1 ausgefhrt werden. OnlyOnThisPlatform=Dieses Programm muss unter %1 ausgefhrt werden. OnlyOnTheseArchitectures=Dieses Programm kann nur auf Windows-Versionen installiert werden, die folgende Prozessor-Architekturen untersttzen:%n%n%1 MissingWOW64APIs=Ihre Windows-Version enthlt nicht die Funktionen, die vom Setup fr eine 64-bit Installation bentigt werden. Installieren Sie bitte Service Pack %1, um dieses Problem zu beheben. WinVersionTooLowError=Dieses Programm bentigt %1 Version %2 oder hher. WinVersionTooHighError=Dieses Programm kann nicht unter %1 Version %2 oder hher installiert werden. AdminPrivilegesRequired=Sie mssen als Administrator angemeldet sein, um dieses Programm installieren zu knnen. PowerUserPrivilegesRequired=Sie mssen als Administrator oder als Mitglied der Hauptbenutzer-Gruppe angemeldet sein, um dieses Programm installieren zu knnen. SetupAppRunningError=Das Setup hat entdeckt, dass %1 zur Zeit ausgefhrt wird.%n%nBitte schlieen Sie jetzt alle laufenden Instanzen, und klicken Sie auf "OK", um fortzufahren, oder auf "Abbrechen", um zu beenden. UninstallAppRunningError=Die Deinstallation hat entdeckt, dass %1 zur Zeit ausgefhrt wird.%n%nBitte schlieen Sie jetzt alle laufenden Instanzen, und klicken Sie auf "OK", um fortzufahren, oder auf "Abbrechen", um zu beenden. ; *** Misc. errors ErrorCreatingDir=Das Setup konnte den Ordner "%1" nicht erstellen ErrorTooManyFilesInDir=Das Setup konnte eine Datei im Ordner "%1" nicht erstellen, weil er zu viele Dateien enthlt ; *** Setup common messages ExitSetupTitle=Setup verlassen ExitSetupMessage=Das Setup ist noch nicht abgeschlossen. Wenn Sie jetzt beenden, wird das Programm nicht installiert.%n%nSie knnen das Setup zu einem spteren Zeitpunkt nochmals ausfhren, um die Installation zu vervollstndigen.%n%nSetup verlassen? AboutSetupMenuItem=&ber das Setup ... AboutSetupTitle=ber das Setup AboutSetupMessage=%1 Version %2%n%3%n%n%1 Internet-Seite:%n%4 AboutSetupNote= TranslatorNote=German translation maintained by Michael Reitz (innosetup@assimilate.de) ; *** Buttons ButtonBack=< &Zurck ButtonNext=&Weiter > ButtonInstall=&Installieren ButtonOK=OK ButtonCancel=Abbrechen ButtonYes=&Ja ButtonYesToAll=J&a fr Alle ButtonNo=&Nein ButtonNoToAll=N&ein fr Alle ButtonFinish=&Fertigstellen ButtonBrowse=&Durchsuchen ... ButtonWizardBrowse=Du&rchsuchen ... ButtonNewFolder=&Neuen Ordner erstellen ; *** "Select Language" dialog messages SelectLanguageTitle=Setup-Sprache auswhlen SelectLanguageLabel=Whlen Sie die Sprache aus, die whrend der Installation benutzt werden soll: ; *** Common wizard text ClickNext="Weiter" zum Fortfahren, "Abbrechen" zum Verlassen. BeveledLabel= BrowseDialogTitle=Ordner suchen BrowseDialogLabel=Whlen Sie einen Ordner aus, und klicken Sie danach auf "OK". NewFolderName=Neuer Ordner ; *** "Welcome" wizard page WelcomeLabel1=Willkommen zum [name] Setup-Assistenten WelcomeLabel2=Dieser Assistent wird jetzt [name/ver] auf Ihrem Computer installieren.%n%nSie sollten alle anderen Anwendungen beenden, bevor Sie mit dem Setup fortfahren. ; *** "Password" wizard page WizardPassword=Passwort PasswordLabel1=Diese Installation wird durch ein Passwort geschtzt. PasswordLabel3=Bitte geben Sie das Passwort ein, und klicken Sie danach auf "Weiter". Achten Sie auf korrekte Gro-/Kleinschreibung. PasswordEditLabel=&Passwort: IncorrectPassword=Das eingegebene Passwort ist nicht korrekt. Bitte versuchen Sie es noch einmal. ; *** "License Agreement" wizard page WizardLicense=Lizenzvereinbarung LicenseLabel=Lesen Sie bitte folgende, wichtige Informationen bevor Sie fortfahren. LicenseLabel3=Lesen Sie bitte die folgenden Lizenzvereinbarungen. Benutzen Sie bei Bedarf die Bildlaufleiste oder drcken Sie die "Bild Ab"-Taste. LicenseAccepted=Ich &akzeptiere die Vereinbarung LicenseNotAccepted=Ich &lehne die Vereinbarung ab ; *** "Information" wizard pages WizardInfoBefore=Information InfoBeforeLabel=Lesen Sie bitte folgende, wichtige Informationen bevor Sie fortfahren. InfoBeforeClickLabel=Klicken Sie auf "Weiter", sobald Sie bereit sind mit dem Setup fortzufahren. WizardInfoAfter=Information InfoAfterLabel=Lesen Sie bitte folgende, wichtige Informationen bevor Sie fortfahren. InfoAfterClickLabel=Klicken Sie auf "Weiter", sobald Sie bereit sind mit dem Setup fortzufahren. ; *** "User Information" wizard page WizardUserInfo=Benutzerinformationen UserInfoDesc=Bitte tragen Sie Ihre Daten ein. UserInfoName=&Name: UserInfoOrg=&Organisation: UserInfoSerial=&Seriennummer: UserInfoNameRequired=Sie mssen einen Namen eintragen. ; *** "Select Destination Location" wizard page WizardSelectDir=Ziel-Ordner whlen SelectDirDesc=Wohin soll [name] installiert werden? SelectDirLabel3=Das Setup wird [name] in den folgenden Ordner installieren. SelectDirBrowseLabel=Klicken Sie auf "Weiter", um fortzufahren. Klicken Sie auf "Durchsuchen", falls Sie einen anderen Ordner auswhlen mchten. DiskSpaceMBLabel=Mindestens [mb] MB freier Speicherplatz ist erforderlich. ToUNCPathname=Das Setup kann nicht in einen UNC-Pfad installieren. Wenn Sie auf ein Netzlaufwerk installieren mchten, mssen Sie dem Netzwerkpfad einen Laufwerksbuchstaben zuordnen. InvalidPath=Sie mssen einen vollstndigen Pfad mit einem Laufwerksbuchstaben angeben; z.B.:%n%nC:\Beispiel%n%noder einen UNC-Pfad in der Form:%n%n\\Server\Freigabe InvalidDrive=Das angegebene Laufwerk bzw. der UNC-Pfad existiert nicht oder es kann nicht darauf zugegriffen werden. Whlen Sie bitte einen anderen Ordner. DiskSpaceWarningTitle=Nicht genug freier Speicherplatz DiskSpaceWarning=Das Setup bentigt mindestens %1 KB freien Speicherplatz zum Installieren, aber auf dem ausgewhlten Laufwerk sind nur %2 KB verfgbar.%n%nMchten Sie trotzdem fortfahren? DirNameTooLong=Der Ordnername/Pfad ist zu lang. InvalidDirName=Der Ordnername ist nicht gltig. BadDirName32=Ordnernamen drfen keine der folgenden Zeichen enthalten:%n%n%1 DirExistsTitle=Ordner existiert bereits DirExists=Der Ordner:%n%n%1%n%n existiert bereits. Mchten Sie trotzdem in diesen Ordner installieren? DirDoesntExistTitle=Ordner ist nicht vorhanden DirDoesntExist=Der Ordner:%n%n%1%n%nist nicht vorhanden. Soll der Ordner erstellt werden? ; *** "Select Components" wizard page WizardSelectComponents=Komponenten auswhlen SelectComponentsDesc=Welche Komponenten sollen installiert werden? SelectComponentsLabel2=Whlen Sie die Komponenten aus, die Sie installieren mchten. Klicken Sie auf "Weiter", wenn sie bereit sind fortzufahren. FullInstallation=Vollstndige Installation CompactInstallation=Kompakte Installation CustomInstallation=Benutzerdefinierte Installation NoUninstallWarningTitle=Komponenten vorhanden NoUninstallWarning=Das Setup hat festgestellt, dass die folgenden Komponenten bereits auf Ihrem Computer installiert sind:%n%n%1%n%nDiese nicht mehr ausgewhlten Komponenten werden nicht vom Computer entfernt.%n%nMchten Sie trotzdem fortfahren? ComponentSize1=%1 KB ComponentSize2=%1 MB ComponentsDiskSpaceMBLabel=Die aktuelle Auswahl erfordert min. [mb] MB Speicherplatz. ; *** "Select Additional Tasks" wizard page WizardSelectTasks=Zustzliche Aufgaben auswhlen SelectTasksDesc=Welche zustzlichen Aufgaben sollen ausgefhrt werden? SelectTasksLabel2=Whlen Sie die zustzlichen Aufgaben aus, die das Setup whrend der Installation von [name] ausfhren soll, und klicken Sie danach auf "Weiter". ; *** "Select Start Menu Folder" wizard page WizardSelectProgramGroup=Startmen-Ordner auswhlen SelectStartMenuFolderDesc=Wo soll das Setup die Programm-Verknpfungen erstellen? SelectStartMenuFolderLabel3=Das Setup wird die Programm-Verknpfungen im folgenden Startmen-Ordner erstellen. SelectStartMenuFolderBrowseLabel=Klicken Sie auf "Weiter", um fortzufahren. Klicken Sie auf "Durchsuchen", falls Sie einen anderen Ordner auswhlen mchten. MustEnterGroupName=Sie mssen einen Ordnernamen eingeben. GroupNameTooLong=Der Ordnername/Pfad ist zu lang. InvalidGroupName=Der Ordnername ist nicht gltig. BadGroupName=Der Ordnername darf keine der folgenden Zeichen enthalten:%n%n%1 NoProgramGroupCheck2=&Keinen Ordner im Startmen erstellen ; *** "Ready to Install" wizard page WizardReady=Installation durchfhren ReadyLabel1=Das Setup ist jetzt bereit, [name] auf Ihrem Computer zu installieren. ReadyLabel2a=Klicken Sie auf "Installieren", um mit der Installation zu beginnen, oder auf "Zurck", um Ihre Einstellungen zu berprfen oder zu ndern. ReadyLabel2b=Klicken Sie auf "Installieren", um mit der Installation zu beginnen. ReadyMemoUserInfo=Benutzerinformationen: ReadyMemoDir=Ziel-Ordner: ReadyMemoType=Setup-Typ: ReadyMemoComponents=Ausgewhlte Komponenten: ReadyMemoGroup=Startmen-Ordner: ReadyMemoTasks=Zustzliche Aufgaben: ; *** "Preparing to Install" wizard page WizardPreparing=Vorbereitung der Installation PreparingDesc=Das Setup bereitet die Installation von [name] auf diesen Computer vor. PreviousInstallNotCompleted=Eine vorherige Installation/Deinstallation eines Programms wurde nicht abgeschlossen. Der Computer muss neu gestartet werden, um die Installation/Deinstallation zu beenden.%n%nStarten Sie das Setup nach dem Neustart Ihres Computers erneut, um die Installation von [name] durchzufhren. CannotContinue=Das Setup kann nicht fortfahren. Bitte klicken Sie auf "Abbrechen" zum Verlassen. ; *** "Installing" wizard page WizardInstalling=Installiere ... InstallingLabel=Warten Sie bitte whrend [name] auf Ihrem Computer installiert wird. ; *** "Setup Completed" wizard page FinishedHeadingLabel=Beenden des [name] Setup-Assistenten FinishedLabelNoIcons=Das Setup hat die Installation von [name] auf Ihrem Computer abgeschlossen. FinishedLabel=Das Setup hat die Installation von [name] auf Ihrem Computer abgeschlossen. Die Anwendung kann ber die installierten Programm-Verknpfungen gestartet werden. ClickFinish=Klicken Sie auf "Fertigstellen", um das Setup zu beenden. FinishedRestartLabel=Um die Installation von [name] abzuschlieen, muss das Setup Ihren Computer neu starten. Mchten Sie jetzt neu starten? FinishedRestartMessage=Um die Installation von [name] abzuschlieen, muss das Setup Ihren Computer neu starten.%n%nMchten Sie jetzt neu starten? ShowReadmeCheck=Ja, ich mchte die LIESMICH-Datei sehen YesRadio=&Ja, Computer jetzt neu starten NoRadio=&Nein, ich werde den Computer spter neu starten RunEntryExec=%1 starten RunEntryShellExec=%1 anzeigen ; *** "Setup Needs the Next Disk" stuff ChangeDiskTitle=Nchste Diskette einlegen SelectDiskLabel2=Legen Sie bitte Diskette %1 ein, und klicken Sie auf "OK".%n%nWenn sich die Dateien von dieser Diskette in einem anderen als dem angezeigten Ordner befinden, dann geben Sie bitte den korrekten Pfad ein oder klicken auf "Durchsuchen". PathLabel=&Pfad: FileNotInDir2=Die Datei "%1" befindet sich nicht in "%2". Bitte Ordner ndern oder richtige Diskette einlegen. SelectDirectoryLabel=Geben Sie bitte an, wo die nchste Diskette eingelegt wird. ; *** Installation phase messages SetupAborted=Das Setup konnte nicht abgeschlossen werden.%n%nBeheben Sie bitte das Problem, und starten Sie das Setup erneut. EntryAbortRetryIgnore=Klicken Sie auf "Wiederholen" fr einen weiteren Versuch, "Ignorieren", um trotzdem fortzufahren, oder "Abbrechen", um die Installation abzubrechen. ; *** Installation status messages StatusCreateDirs=Ordner werden erstellt ... StatusExtractFiles=Dateien werden entpackt ... StatusCreateIcons=Verknpfungen werden erstellt ... StatusCreateIniEntries=INI-Eintrge werden erstellt ... StatusCreateRegistryEntries=Registry-Eintrge werden erstellt ... StatusRegisterFiles=Dateien werden registriert ... StatusSavingUninstall=Deinstallations-Informationen werden gespeichert ... StatusRunProgram=Installation wird beendet ... StatusRollback=nderungen werden rckgngig gemacht ... ; *** Misc. errors ErrorInternal2=Interner Fehler: %1 ErrorFunctionFailedNoCode=%1 schlug fehl ErrorFunctionFailed=%1 schlug fehl; Code %2 ErrorFunctionFailedWithMessage=%1 schlug fehl; Code %2.%n%3 ErrorExecutingProgram=Datei kann nicht ausgefhrt werden:%n%1 ; *** Registry errors ErrorRegOpenKey=Registry-Schlssel konnte nicht geffnet werden:%n%1\%2 ErrorRegCreateKey=Registry-Schlssel konnte nicht erstellt werden:%n%1\%2 ErrorRegWriteKey=Fehler beim Schreiben des Registry-Schlssels:%n%1\%2 ; *** INI errors ErrorIniEntry=Fehler beim Erstellen eines INI-Eintrages in der Datei "%1". ; *** File copying errors FileAbortRetryIgnore=Klicken Sie auf "Wiederholen" fr einen weiteren Versuch, "Ignorieren", um diese Datei zu berspringen (nicht empfohlen), oder "Abbrechen", um die Installation abzubrechen. FileAbortRetryIgnore2=Klicken Sie auf "Wiederholen" fr einen weiteren Versuch, "Ignorieren", um trotzdem fortzufahren (nicht empfohlen), oder "Abbrechen", um die Installation abzubrechen. SourceIsCorrupted=Die Quelldatei ist beschdigt SourceDoesntExist=Die Quelldatei "%1" existiert nicht ExistingFileReadOnly=Die vorhandene Datei ist schreibgeschtzt.%n%nKlicken Sie auf "Wiederholen", um den Schreibschutz zu entfernen, "Ignorieren", um die Datei zu berspringen, oder "Abbrechen", um die Installation abzubrechen. ErrorReadingExistingDest=Lesefehler in Datei: FileExists=Die Datei ist bereits vorhanden.%n%nSoll sie berschrieben werden? ExistingFileNewer=Die vorhandene Datei ist neuer als die Datei, die installiert werden soll. Es wird empfohlen die vorhandene Datei beizubehalten.%n%n Mchten Sie die vorhandene Datei beibehalten? ErrorChangingAttr=Fehler beim ndern der Datei-Attribute: ErrorCreatingTemp=Fehler beim Erstellen einer Datei im Ziel-Ordner: ErrorReadingSource=Fehler beim Lesen der Quelldatei: ErrorCopying=Fehler beim Kopieren einer Datei: ErrorReplacingExistingFile=Fehler beim Ersetzen einer vorhandenen Datei: ErrorRestartReplace="Ersetzen nach Neustart" fehlgeschlagen: ErrorRenamingTemp=Fehler beim Umbenennen einer Datei im Ziel-Ordner: ErrorRegisterServer=DLL/OCX konnte nicht registriert werden: %1 ErrorRegSvr32Failed=RegSvr32-Aufruf scheiterte mit Exit-Code %1 ErrorRegisterTypeLib=Typen-Bibliothek konnte nicht registriert werden: %1 ; *** Post-installation errors ErrorOpeningReadme=Fehler beim ffnen der LIESMICH-Datei. ErrorRestartingComputer=Das Setup konnte den Computer nicht neu starten. Bitte fhren Sie den Neustart manuell durch. ; *** Uninstaller messages UninstallNotFound=Die Datei "%1" existiert nicht. Entfernen der Anwendung fehlgeschlagen. UninstallOpenError=Die Datei "%1" konnte nicht geffnet werden. Entfernen der Anwendung fehlgeschlagen. UninstallUnsupportedVer=Das Format der Deinstallations-Datei "%1" konnte nicht erkannt werden. Entfernen der Anwendung fehlgeschlagen UninstallUnknownEntry=In der Deinstallations-Datei wurde ein unbekannter Eintrag (%1) gefunden ConfirmUninstall=Sind Sie sicher, dass Sie %1 und alle zugehrigen Komponenten entfernen mchten? UninstallOnlyOnWin64=Diese Installation kann nur unter 64-bit Windows-Versionen entfernt werden. OnlyAdminCanUninstall=Diese Installation kann nur von einem Benutzer mit Administrator-Rechten entfernt werden. UninstallStatusLabel=Warten Sie bitte whrend %1 von Ihrem Computer entfernt wird. UninstalledAll=%1 wurde erfolgreich von Ihrem Computer entfernt. UninstalledMost=Entfernen von %1 beendet.%n%nEinige Komponenten konnten nicht entfernt werden. Diese knnen von Ihnen manuell gelscht werden. UninstalledAndNeedsRestart=Um die Deinstallation von %1 abzuschlieen, muss Ihr Computer neu gestartet werden.%n%nMchten Sie jetzt neu starten? UninstallDataCorrupted="%1"-Datei ist beschdigt. Entfernen der Anwendung fehlgeschlagen. ; *** Uninstallation phase messages ConfirmDeleteSharedFileTitle=Gemeinsame Datei entfernen? ConfirmDeleteSharedFile2=Das System zeigt an, dass die folgende gemeinsame Datei von keinem anderen Programm mehr benutzt wird. Mchten Sie diese Datei entfernen lassen?%nSollte es doch noch Programme geben, die diese Datei benutzen, und sie wird entfernt, funktionieren diese Programme vielleicht nicht mehr richtig. Wenn Sie unsicher sind, whlen Sie "Nein" um die Datei im System zu belassen. Es schadet Ihrem System nicht, wenn Sie die Datei behalten. SharedFileNameLabel=Dateiname: SharedFileLocationLabel=Ordner: WizardUninstalling=Entfernen (Status) StatusUninstalling=Entferne %1 ... [CustomMessages] NameAndVersion=%1 Version %2 AdditionalIcons=Zustzliche Symbole: CreateDesktopIcon=&Desktop-Symbol erstellen CreateQuickLaunchIcon=Symbol in der Schnellstartleiste erstellen ProgramOnTheWeb=%1 im Internet UninstallProgram=%1 entfernen LaunchProgram=%1 starten AssocFileExtension=&Registriere %1 mit der %2-Dateierweiterung AssocingFileExtension=%1 wird mit der %2-Dateierweiterung registriert... AskRemove=Mchten Sie %1 entfernen? SelectVersion=Version auswhlen ChangeIntegration=Desktopintegration ndern CalibrationLoading=Kalibrierung bei Anmeldung laden: CalibrationLoadingHandledByDisplayCAL=DisplayCAL Profil-Lader (hohe Przision und Zuverlssigkeit) CalibrationLoadingHandledByOS=Betriebssystem (niedrige Przision und Zuverlssigkeit)DisplayCAL-3.1.0.0/misc/InnoSetup/v5/Languages/Italian.isl0000644000076500000000000004454112647526531022726 0ustar devwheel00000000000000; *** Inno Setup versione 5.1.11+ lingua Italiana *** ; ; To download user-contributed translations of this file, go to: ; http://www.jrsoftware.org/is3rdparty.php ; ; Note: When translating this text, do not add periods (.) to the end of ; messages that didn't have them already, because on those messages Inno ; Setup adds the periods automatically (appending a period would result in ; two periods being displayed). ; ; Italian.isl revisione 30b - 2007/02/28 (Basato su Default.isl 1.69) ; ; Tradotto da ale5000 ; E-mail: ale5000 AT tiscali DOT it ; Segnalatemi via e-mail eventuali errori o suggerimenti. [LangOptions] ; The following three entries are very important. Be sure to read and ; understand the '[LangOptions] section' topic in the help file. LanguageName=Italiano LanguageID=$0410 LanguageCodePage=1252 ; If the language you are translating to requires special font faces or ; sizes, uncomment any of the following entries and change them accordingly. ;DialogFontName= ;DialogFontSize=8 ;WelcomeFontName=Verdana ;WelcomeFontSize=12 ;TitleFontName=Arial ;TitleFontSize=29 ;CopyrightFontName=Arial ;CopyrightFontSize=8 [Messages] ; *** Application titles SetupAppTitle=Installazione SetupWindowTitle=Installazione di %1 UninstallAppTitle=Disinstallazione UninstallAppFullTitle=Disinstallazione di %1 ; *** Misc. common InformationTitle=Informazioni ConfirmTitle=Conferma ErrorTitle=Errore ; *** SetupLdr messages SetupLdrStartupMessage=Questa l'installazione di %1. Si desidera continuare? LdrCannotCreateTemp=Impossibile creare un file temporaneo. Installazione annullata LdrCannotExecTemp=Impossibile eseguire un file nella cartella temporanea. Installazione annullata ; *** Startup error messages LastErrorMessage=%1.%n%nErrore %2: %3 SetupFileMissing=File %1 non trovato nella cartella di installazione. Correggere il problema o richiedere una nuova copia del software. SetupFileCorrupt=I file di installazione sono danneggiati. Richiedere una nuova copia del software. SetupFileCorruptOrWrongVer=I file di installazione sono danneggiati, o sono incompatibili con questa versione del programma di installazione. Correggere il problema o richiedere una nuova copia del software. NotOnThisPlatform=Questo programma non compatibile con %1. OnlyOnThisPlatform=Questo programma richiede %1. OnlyOnTheseArchitectures=Questo programma pu essere installato solo su versioni di Windows progettate per le seguenti architetture del processore:%n%n%1 MissingWOW64APIs=La versione di Windows utilizzata non include la funzionalit richiesta dal programma di installazione per realizzare un'installazione a 64-bit. Per correggere questo problema, installare il Service Pack %1. WinVersionTooLowError=Questo programma richiede %1 versione %2 o successiva. WinVersionTooHighError=Questo programma non pu essere installato su %1 versione %2 o successiva. AdminPrivilegesRequired=Sono richiesti privilegi di amministratore per installare questo programma. PowerUserPrivilegesRequired=Sono richiesti privilegi di amministratore o di Power Users per poter installare questo programma. SetupAppRunningError=%1 attualmente in esecuzione.%n%nChiudere adesso tutte le istanze del programma e poi premere OK, oppure premere Annulla per uscire. UninstallAppRunningError=%1 attualmente in esecuzione.%n%nChiudere adesso tutte le istanze del programma e poi premere OK, oppure premere Annulla per uscire. ; *** Misc. errors ErrorCreatingDir=Impossibile creare la cartella "%1" ErrorTooManyFilesInDir=Impossibile creare i file nella cartella "%1" perch contiene troppi file ; *** Setup common messages ExitSetupTitle=Uscita dall'installazione ExitSetupMessage=L'installazione non completa. Uscendo dall'installazione in questo momento, il programma non sar installato.%n%n possibile eseguire l'installazione in un secondo tempo.%n%nUscire dall'installazione? AboutSetupMenuItem=&Informazioni sull'installazione... AboutSetupTitle=Informazioni sull'installazione AboutSetupMessage=%1 versione %2%n%3%n%n%1 sito web:%n%4 AboutSetupNote= TranslatorNote= ; *** Buttons ButtonBack=< &Indietro ButtonNext=&Avanti > ButtonInstall=&Installa ButtonOK=OK ButtonCancel=Annulla ButtonYes=&Si ButtonYesToAll=Si a &tutto ButtonNo=&No ButtonNoToAll=N&o a tutto ButtonFinish=&Fine ButtonBrowse=&Sfoglia... ButtonWizardBrowse=S&foglia... ButtonNewFolder=&Crea nuova cartella ; *** "Select Language" dialog messages SelectLanguageTitle=Selezionare la lingua dell'installazione SelectLanguageLabel=Selezionare la lingua da utilizzare durante l'installazione: ; *** Common wizard text ClickNext=Premere Avanti per continuare, o Annulla per uscire. BeveledLabel= BrowseDialogTitle=Sfoglia per cartelle BrowseDialogLabel=Selezionare una cartella dalla lista, poi premere OK. NewFolderName=Nuova cartella ; *** "Welcome" wizard page WelcomeLabel1=Benvenuti nel programma di installazione di [name] WelcomeLabel2=[name/ver] sar installato sul computer.%n%nSi consiglia di chiudere tutte le applicazioni attive prima di procedere. ; *** "Password" wizard page WizardPassword=Password PasswordLabel1=Questa installazione protetta da password. PasswordLabel3=Inserire la password, poi premere Avanti per continuare. Le password sono sensibili alle maiuscole/minuscole. PasswordEditLabel=&Password: IncorrectPassword=La password inserita non corretta, riprovare. ; *** "License Agreement" wizard page WizardLicense=Contratto di licenza LicenseLabel=Leggere con attenzione le informazioni che seguono prima di procedere. LicenseLabel3=Leggere il seguente contratto di licenza. necessario accettare tutti i termini del contratto per procedere con l'installazione. LicenseAccepted=&Accetto i termini del contratto di licenza LicenseNotAccepted=&Non accetto i termini del contratto di licenza ; *** "Information" wizard pages WizardInfoBefore=Informazioni InfoBeforeLabel=Leggere le importanti informazioni che seguono prima di procedere. InfoBeforeClickLabel=Quando si pronti per proseguire, premere Avanti. WizardInfoAfter=Informazioni InfoAfterLabel=Leggere le importanti informazioni che seguono prima di procedere. InfoAfterClickLabel=Quando si pronti per proseguire, premere Avanti. ; *** "User Information" wizard page WizardUserInfo=Informazioni utente UserInfoDesc=Inserire le seguenti informazioni. UserInfoName=&Nome: UserInfoOrg=&Societ: UserInfoSerial=&Numero di serie: UserInfoNameRequired= necessario inserire un nome. ; *** "Select Destination Location" wizard page WizardSelectDir=Selezione della cartella di installazione SelectDirDesc=Dove si vuole installare [name]? SelectDirLabel3=[name] sar installato nella seguente cartella. SelectDirBrowseLabel=Per continuare, premere Avanti. Per scegliere un'altra cartella, premere Sfoglia. DiskSpaceMBLabel=Sono richiesti almeno [mb] MB di spazio sul disco. ToUNCPathname=Non possiblie installare su un percorso di rete. Se si sta installando attraverso una rete, si deve connettere la risorsa come una unit di rete. InvalidPath=Si deve inserire un percorso completo di lettera di unit; per esempio:%n%nC:\APP%n%no un percorso di rete nella forma:%n%n\\server\condivisione InvalidDrive=L'unit o il percorso di rete selezionato non esiste o non accessibile. Selezionarne un'altro. DiskSpaceWarningTitle=Spazio su disco insufficiente DiskSpaceWarning=L'installazione richiede almeno %1 KB di spazio libero per eseguire l'installazione, ma l'unit selezionata ha solo %2 KB disponibili.%n%nSi desidera continuare comunque? DirNameTooLong=Il nome della cartella o il percorso sono troppo lunghi. InvalidDirName=Il nome della cartella non valido. BadDirName32=Il nome della cartella non pu includere nessuno dei caratteri seguenti:%n%n%1 DirExistsTitle=Cartella gi esistente DirExists=La cartella:%n%n%1 esiste gi.%n%nSi desidera utilizzarla comunque? DirDoesntExistTitle=Cartella inesistente DirDoesntExist=La cartella:%n%n%1 non esiste.%n%nSi desidera crearla? ; *** "Select Components" wizard page WizardSelectComponents=Selezione componenti SelectComponentsDesc=Quali componenti devono essere installati? SelectComponentsLabel2=Selezionare i componenti da installare, deselezionare quelli che non si desidera installare. Premere Avanti per continuare. FullInstallation=Installazione completa ; if possible don't translate 'Compact' as 'Minimal' (I mean 'Minimal' in your language) CompactInstallation=Installazione compatta CustomInstallation=Installazione personalizzata NoUninstallWarningTitle=Componente esistente NoUninstallWarning=I seguenti componenti sono gi installati sul computer:%n%n%1%n%nDeselezionando questi componenti non verranno disinstallati.%n%nSi desidera continuare comunque? ComponentSize1=%1 KB ComponentSize2=%1 MB ComponentsDiskSpaceMBLabel=La selezione corrente richiede almeno [mb] MB di spazio su disco. ; *** "Select Additional Tasks" wizard page WizardSelectTasks=Selezione processi addizionali SelectTasksDesc=Quali processi aggiuntivi si vogliono avviare? SelectTasksLabel2=Selezionare i processi aggiuntivi che verranno eseguiti durante l'installazione di [name], poi premere Avanti. ; *** "Select Start Menu Folder" wizard page WizardSelectProgramGroup=Selezione della cartella nel Menu Avvio/Start SelectStartMenuFolderDesc=Dove si vuole inserire i collegamenti al programma? SelectStartMenuFolderLabel3=Saranno creati i collegamenti al programma nella seguente cartella del Menu Avvio/Start. SelectStartMenuFolderBrowseLabel=Per continuare, premere Avanti. Per selezionare un'altra cartella, premere Sfoglia. MustEnterGroupName=Si deve inserire il nome della cartella. GroupNameTooLong=Il nome della cartella o il percorso sono troppo lunghi. InvalidGroupName=Il nome della cartella non valido. BadGroupName=Il nome della cartella non pu includere nessuno dei caratteri seguenti:%n%n%1 NoProgramGroupCheck2=&Non creare una cartella nel Menu Avvio/Start ; *** "Ready to Install" wizard page WizardReady=Pronto per l'installazione ReadyLabel1=Il programma di installazione pronto per iniziare l'installazione di [name] sul computer. ReadyLabel2a=Premere Installa per continuare con l'installazione, o Indietro per rivedere o modificare le impostazioni. ReadyLabel2b=Premere Installa per procedere con l'installazione. ReadyMemoUserInfo=Informazioni utente: ReadyMemoDir=Cartella di installazione: ReadyMemoType=Tipo di installazione: ReadyMemoComponents=Componenti selezionati: ReadyMemoGroup=Cartella del menu Avvio/Start: ReadyMemoTasks=Processi addizionali: ; *** "Preparing to Install" wizard page WizardPreparing=Preparazione all'installazione PreparingDesc=Preparazione all'installazione di [name] sul computer. PreviousInstallNotCompleted=L'installazione/disinstallazione precedente del programma non stata completata. necessario riavviare il sistema per completare l'installazione.%n%nAl successivo riavvio del sistema eseguire di nuovo l'installazione di [name]. CannotContinue=L'installazione non pu continuare. Premere Annulla per uscire. ; *** "Installing" wizard page WizardInstalling=Installazione in corso InstallingLabel=Attendere il completamento dell'installazione di [name] sul computer. ; *** "Setup Completed" wizard page FinishedHeadingLabel=Completamento dell'installazione di [name] FinishedLabelNoIcons=L'installazione di [name] stata completata con successo. FinishedLabel=L'installazione di [name] stata completata con successo. L'applicazione pu essere eseguita selezionando le relative icone. ClickFinish=Premere Fine per uscire dall'installazione. FinishedRestartLabel=Per completare l'installazione di [name], necessario riavviare il sistema. Si desidera riavviare adesso? FinishedRestartMessage=Per completare l'installazione di [name], necessario riavviare il sistema.%n%nSi desidera riavviare adesso? ShowReadmeCheck=Si, desidero vedere il file LEGGIMI adesso YesRadio=&Si, riavvia il sistema adesso NoRadio=&No, riavvia il sistema pi tardi ; used for example as 'Run MyProg.exe' RunEntryExec=Avvia %1 ; used for example as 'View Readme.txt' RunEntryShellExec=Visualizza %1 ; *** "Setup Needs the Next Disk" stuff ChangeDiskTitle=L'installazione necessita del disco successivo SelectDiskLabel2=Inserire il disco %1 e premere OK.%n%nSe i file su questo disco si trovano in una cartella diversa da quella visualizzata sotto, inserire il percorso corretto o premere Sfoglia. PathLabel=&Percorso: FileNotInDir2=Il file "%1" non stato trovato in "%2". Inserire il disco corretto o selezionare un'altra cartella. SelectDirectoryLabel=Specificare il percorso del prossimo disco. ; *** Installation phase messages SetupAborted=L'installazione non stata completata.%n%nCorreggere il problema e rieseguire nuovamente l'installazione. EntryAbortRetryIgnore=Premere Riprova per ritentare nuovamente, Ignora per procedere in ogni caso, o Interrompi per terminare l'installazione. ; *** Installation status messages StatusCreateDirs=Creazione cartelle... StatusExtractFiles=Estrazione file... StatusCreateIcons=Creazione icone... StatusCreateIniEntries=Creazione voci nei file INI... StatusCreateRegistryEntries=Creazione voci di registro... StatusRegisterFiles=Registrazione file... StatusSavingUninstall=Salvataggio delle informazioni di disinstallazione... StatusRunProgram=Termine dell'installazione... StatusRollback=Recupero delle modifiche... ; *** Misc. errors ErrorInternal2=Errore Interno %1 ErrorFunctionFailedNoCode=%1 fallito ErrorFunctionFailed=%1 fallito; codice %2 ErrorFunctionFailedWithMessage=%1 fallito; codice %2.%n%3 ErrorExecutingProgram=Impossibile eseguire il file:%n%1 ; *** Registry errors ErrorRegOpenKey=Errore di apertura della chiave di registro:%n%1\%2 ErrorRegCreateKey=Errore di creazione della chiave di registro:%n%1\%2 ErrorRegWriteKey=Errore di scrittura della chiave di registro:%n%1\%2 ; *** INI errors ErrorIniEntry=Errore nella creazione delle voci INI nel file "%1". ; *** File copying errors FileAbortRetryIgnore=Premere Riprova per tentare di nuovo, Ignora per saltare questo file (sconsigliato), o Interrompi per terminare l'installazione. FileAbortRetryIgnore2=Premere Riprova per tentare di nuovo, Ignora per proseguire comunque (sconsigliato), o Interrompi per terminare l'installazione. SourceIsCorrupted=Il file sorgente danneggiato SourceDoesntExist=Il file sorgente "%1" non esiste ExistingFileReadOnly=Il file esistente ha l'attributo di sola lettura.%n%nPremere Riprova per rimuovere l'attributo di sola lettura e ritentare, Ignora per saltare questo file, o Interrompi per terminare l'installazione. ErrorReadingExistingDest=Si verificato un errore durante la lettura del file esistente: FileExists=Il file esiste gi.%n%nDesideri sovrascriverlo? ExistingFileNewer=Il file esistente pi recente di quello che si st installando. Si raccomanda di mantenere il file esistente.%n%nSi desidera mantenere il file esistente? ErrorChangingAttr=Si verificato un errore durante il tentativo di modifica dell'attributo del file esistente: ErrorCreatingTemp=Si verificato un errore durante la creazione di un file nella cartella di installazione: ErrorReadingSource=Si verificato un errore durante la lettura del file sorgente: ErrorCopying=Si verificato un errore durante la copia di un file: ErrorReplacingExistingFile=Si verificato un errore durante la sovrascrittura del file esistente: ErrorRestartReplace=Errore durante Riavvio-Sostituzione: ErrorRenamingTemp=Si verificato un errore durante il tentativo di rinominare un file nella cartella di installazione: ErrorRegisterServer=Impossibile registrare la DLL/OCX: %1 ErrorRegSvr32Failed=RegSvr32 fallito con codice di uscita %1 ErrorRegisterTypeLib=Impossibile registrare la libreria di tipo: %1 ; *** Post-installation errors ErrorOpeningReadme=Si verificato un errore durante l'apertura del file LEGGIMI. ErrorRestartingComputer=Impossibile riavviare il sistema. Riavviare manualmente. ; *** Uninstaller messages UninstallNotFound=Il file "%1" non esiste. Impossibile disinstallare. UninstallOpenError=Il file "%1" non pu essere aperto. Impossibile disinstallare UninstallUnsupportedVer=Il file log di disinstallazione "%1" in un formato non riconosciuto da questa versione del programma di disinstallazione. Impossibile disinstallare UninstallUnknownEntry=Trovata una voce sconosciuta (%1) nel file di log della disinstallazione ConfirmUninstall=Si desidera rimuovere completamente %1 e tutti i suoi componenti? UninstallOnlyOnWin64=Questo programma pu essere disinstallato solo su Windows a 64-bit. OnlyAdminCanUninstall=Questa applicazione pu essere disinstallata solo da un utente con privilegi di amministratore. UninstallStatusLabel=Attendere fino a che %1 stato rimosso dal computer. UninstalledAll=%1 stato rimosso con successo dal computer. UninstalledMost=Disinstallazione di %1 completata.%n%nAlcuni elementi non possono essere rimossi. Dovranno essere rimossi manualmente. UninstalledAndNeedsRestart=Per completare la disinstallazione di %1, necessario riavviare il sistema.%n%nSi desidera riavviare adesso? UninstallDataCorrupted=Il file "%1" danneggiato. Impossibile disinstallare ; *** Uninstallation phase messages ConfirmDeleteSharedFileTitle=Rimuovere il file condiviso? ConfirmDeleteSharedFile2=Il sistema indica che il seguente file condiviso non pi usato da nessun programma. Rimuovere questo file condiviso?%n%nSe qualche programma usasse questo file, potrebbe non funzionare pi correttamente. Se non si sicuri, scegliere No. Lasciare il file nel sistema non pu causare danni. SharedFileNameLabel=Nome del file: SharedFileLocationLabel=Percorso: WizardUninstalling=Stato della disinstallazione StatusUninstalling=Disinstallazione di %1 in corso... ; The custom messages below aren't used by Setup itself, but if you make ; use of them in your scripts, you'll want to translate them. [CustomMessages] NameAndVersion=%1 versione %2 AdditionalIcons=Icone aggiuntive: CreateDesktopIcon=Crea un'icona sul &desktop CreateQuickLaunchIcon=Crea un'icona nella barra &Avvio veloce ProgramOnTheWeb=%1 sul Web UninstallProgram=Disinstalla %1 LaunchProgram=Avvia %1 AssocFileExtension=&Associa l'estensione %2 a %1 AssocingFileExtension=Associazione dell'estensione %2 a %1 in corso... CalibrationLoading=Caricamento di calibrazione su login: CalibrationLoadingHandledByDisplayCAL=DisplayCAL Profile Loader (alta precisione ed affidabilit) CalibrationLoadingHandledByOS=Sistema operativo (bassa precisione ed affidabilit)DisplayCAL-3.1.0.0/misc/InnoSetup/v5/Languages/Spanish.isl0000644000076500000000000004500212647526531022743 0ustar devwheel00000000000000; *** Inno Setup version 5.1.11+ Spanish messages *** ; ; Maintained by Jorge Andres Brugger (jbrugger@gmx.net) ; Spanish.isl version 0.9 (20100922) ; Default.isl version 1.72 ; ; Thanks to Germn Giraldo, Jordi Latorre, Ximo Tamarit, Emiliano Llano, ; Ramn Verduzco, Graciela Garca and Carles Millan [LangOptions] ; The following three entries are very important. Be sure to read and ; understand the '[LangOptions] section' topic in the help file. LanguageName=Espa<00F1>ol LanguageID=$0c0a LanguageCodePage=1252 ; If the language you are translating to requires special font faces or ; sizes, uncomment any of the following entries and change them accordingly. ;DialogFontName= ;DialogFontSize=8 ;WelcomeFontName=Verdana ;WelcomeFontSize=12 ;TitleFontName=Arial ;TitleFontSize=29 ;CopyrightFontName=Arial ;CopyrightFontSize=8 [Messages] ; *** Application titles SetupAppTitle=Instalar SetupWindowTitle=Instalar - %1 UninstallAppTitle=Desinstalar UninstallAppFullTitle=Desinstalar - %1 ; *** Misc. common InformationTitle=Informacin ConfirmTitle=Confirmar ErrorTitle=Error ; *** SetupLdr messages SetupLdrStartupMessage=Este programa instalar %1. Desea continuar? LdrCannotCreateTemp=Imposible crear archivo temporal. Instalacin interrumpida LdrCannotExecTemp=Imposible ejecutar archivo en la carpeta temporal. Instalacin interrumpida ; *** Startup error messages LastErrorMessage=%1.%n%nError %2: %3 SetupFileMissing=El archivo %1 no se encuentra en la carpeta de instalacin. Por favor, solucione el problema u obtenga una copia nueva del programa. SetupFileCorrupt=Los archivos de instalacin estn daados. Por favor, obtenga una copia nueva del programa. SetupFileCorruptOrWrongVer=Los archivos de instalacin estn daados, o son incompatibles con esta versin del programa de instalacin. Por favor, solucione el problema u obtenga una copia nueva del programa. NotOnThisPlatform=Este programa no se ejecutar en %1. OnlyOnThisPlatform=Este programa debe ejecutarse en %1. OnlyOnTheseArchitectures=Este programa slo puede instalarse en versiones de Windows diseadas para las siguientes arquitecturas de procesadores:%n%n%1 MissingWOW64APIs=La versin de Windows que est utilizando no cuenta con la funcionalidad requerida por el instalador para realizar una instalacin de 64-bits. Para solucionar este problema, por favor instale el Service Pack %1. WinVersionTooLowError=Este programa requiere %1 versin %2 o posterior. WinVersionTooHighError=Este programa no puede instalarse en %1 versin %2 o posterior. AdminPrivilegesRequired=Debe iniciar la sesin como administrador para instalar este programa. PowerUserPrivilegesRequired=Debe iniciar la sesin como administrador o como un miembro del grupo Usuarios Avanzados para instalar este programa. SetupAppRunningError=El programa de instalacin ha detectado que %1 est ejecutndose.%n%nPor favor, cirrelo ahora, luego haga clic en Aceptar para continuar, o en Cancelar para salir. UninstallAppRunningError=El desinstalador ha detectado que %1 est ejecutndose.%n%nPor favor, cirrelo ahora, luego haga clic en Aceptar para continuar, o en Cancelar para salir. ; *** Misc. errors ErrorCreatingDir=El programa de instalacin no pudo crear la carpeta "%1" ErrorTooManyFilesInDir=Imposible crear un archivo en la carpeta "%1" porque contiene demasiados archivos ; *** Setup common messages ExitSetupTitle=Salir de la Instalacin ExitSetupMessage=La instalacin no se ha completado an. Si cancela ahora, el programa no ser instalado.%n%nPuede ejecutar nuevamente el programa de instalacin en otra ocasin para completarla.%n%nSalir de la instalacin? AboutSetupMenuItem=&Acerca de Instalar... AboutSetupTitle=Acerca de Instalar AboutSetupMessage=%1 versin %2%n%3%n%n%1 sitio Web:%n%4 AboutSetupNote= TranslatorNote=Spanish translation maintained by Jorge Andres Brugger (jbrugger@gmx.net) ; *** Buttons ButtonBack=< &Atrs ButtonNext=&Siguiente > ButtonInstall=&Instalar ButtonOK=Aceptar ButtonCancel=Cancelar ButtonYes=&S ButtonYesToAll=S a &Todo ButtonNo=&No ButtonNoToAll=N&o a Todo ButtonFinish=&Finalizar ButtonBrowse=&Examinar... ButtonWizardBrowse=&Examinar... ButtonNewFolder=&Crear Nueva Carpeta ; *** "Select Language" dialog messages SelectLanguageTitle=Seleccione el Idioma de la Instalacin SelectLanguageLabel=Seleccione el idioma a utilizar durante la instalacin: ; *** Common wizard text ClickNext=Haga clic en Siguiente para continuar, o en Cancelar para salir de la instalacin. BeveledLabel= BrowseDialogTitle=Buscar Carpeta BrowseDialogLabel=Seleccione una carpeta, y luego haga clic en Aceptar. NewFolderName=Nueva Carpeta ; *** "Welcome" wizard page WelcomeLabel1=Bienvenido al asistente de instalacin de [name] WelcomeLabel2=Este programa instalar [name/ver] en su sistema.%n%nSe recomienda que cierre todas las dems aplicaciones antes de continuar. ; *** "Password" wizard page WizardPassword=Contrasea PasswordLabel1=Esta instalacin est protegida por contrasea. PasswordLabel3=Por favor, ingrese la contrasea, y haga clic en Siguiente para continuar. En las contraseas se hace diferencia entre maysculas y minsculas. PasswordEditLabel=&Contrasea: IncorrectPassword=La contrasea ingresada no es correcta. Por favor, intntelo nuevamente. ; *** "License Agreement" wizard page WizardLicense=Acuerdo de Licencia LicenseLabel=Por favor, lea la siguiente informacin de importancia antes de continuar. LicenseLabel3=Por favor, lea el siguiente acuerdo de licencia. Debe aceptar los trminos de este acuerdo antes de continuar con la instalacin. LicenseAccepted=A&cepto el acuerdo LicenseNotAccepted=&No acepto el acuerdo ; *** "Information" wizard pages WizardInfoBefore=Informacin InfoBeforeLabel=Por favor, lea la siguiente informacin de importancia antes de continuar. InfoBeforeClickLabel=Cuando est listo para continuar con la instalacin, haga clic en Siguiente. WizardInfoAfter=Informacin InfoAfterLabel=Por favor, lea la siguiente informacin de importancia antes de continuar. InfoAfterClickLabel=Cuando est listo para continuar, haga clic en Siguiente. ; *** "User Information" wizard page WizardUserInfo=Informacin de Usuario UserInfoDesc=Por favor, introduzca su informacin. UserInfoName=Nombre de &Usuario: UserInfoOrg=&Organizacin: UserInfoSerial=Nmero de &Serie: UserInfoNameRequired=Debe ingresar un nombre. ; *** "Select Destination Location" wizard page WizardSelectDir=Seleccione la Carpeta de Destino SelectDirDesc=Dnde debe instalarse [name]? SelectDirLabel3=El programa instalar [name] en la siguiente carpeta. SelectDirBrowseLabel=Para continuar, haga clic en Siguiente. Si desea seleccionar una carpeta diferente, haga clic en Examinar. DiskSpaceMBLabel=Se requieren al menos [mb] MB de espacio libre en el disco. ToUNCPathname=No es posible realizar la instalacin en una ruta de acceso UNC. Si est intentando instalar en una red, necesitar mapear una unidad de la red. InvalidPath=Debe ingresar una ruta completa con la letra de la unidad; por ejemplo:%n%nC:\APP%n%no una ruta de acceso UNC de la siguiente forma:%n%n\\servidor\compartido InvalidDrive=La unidad o ruta de acceso UNC que seleccion no existe o no es accesible. Por favor, seleccione otra. DiskSpaceWarningTitle=Espacio Insuficiente en Disco DiskSpaceWarning=La instalacin requiere al menos %1 KB de espacio libre, pero la unidad seleccionada slo cuenta con %2 KB disponibles.%n%nDesea continuar de todas formas? DirNameTooLong=El nombre de la carpeta o la ruta son demasiado largos. InvalidDirName=El nombre de la carpeta no es vlido. BadDirName32=Los nombres de carpetas no pueden incluir los siguientes caracteres:%n%n%1 DirExistsTitle=La Carpeta Ya Existe DirExists=La carpeta:%n%n%1%n%nya existe. Desea realizar la instalacin en esa carpeta de todas formas? DirDoesntExistTitle=La Carpeta No Existe DirDoesntExist=La carpeta:%n%n%1%n%nno existe. Desea crear esa carpeta? ; *** "Select Components" wizard page WizardSelectComponents=Seleccione los Componentes SelectComponentsDesc=Qu componentes deben instalarse? SelectComponentsLabel2=Seleccione los componentes que desea instalar; desactive los componentes que no desea instalar. Haga clic en Siguiente cuando est listo para continuar. FullInstallation=Instalacin Completa ; if possible don't translate 'Compact' as 'Minimal' (I mean 'Minimal' in your language) CompactInstallation=Instalacin Compacta CustomInstallation=Instalacin Personalizada NoUninstallWarningTitle=Componentes Existentes NoUninstallWarning=El programa de instalacin ha detectado que los siguientes componentes ya estn instalados en su sistema:%n%n%1%n%nQuitar la seleccin a estos componentes no los desinstalar.%n%nDesea continuar de todos modos? ComponentSize1=%1 KB ComponentSize2=%1 MB ComponentsDiskSpaceMBLabel=La seleccin actual requiere al menos [mb] MB de espacio en disco. ; *** "Select Additional Tasks" wizard page WizardSelectTasks=Seleccione las Tareas Adicionales SelectTasksDesc=Qu tareas adicionales deben realizarse? SelectTasksLabel2=Seleccione las tareas adicionales que desea que se realicen durante la instalacin de [name] y haga clic en Siguiente. ; *** "Select Start Menu Folder" wizard page WizardSelectProgramGroup=Seleccione la Carpeta del Men Inicio SelectStartMenuFolderDesc=Dnde deben colocarse los accesos directos del programa? SelectStartMenuFolderLabel3=El programa de instalacin crear los accesos directos del programa en la siguiente carpeta del Men Inicio. SelectStartMenuFolderBrowseLabel=Para continuar, haga clic en Siguiente. Si desea seleccionar una carpeta distinta, haga clic en Examinar. MustEnterGroupName=Debe proporcionar un nombre de carpeta. GroupNameTooLong=El nombre de la carpeta o la ruta son demasiado largos. InvalidGroupName=El nombre de la carpeta no es vlido. BadGroupName=El nombre de la carpeta no puede incluir ninguno de los siguientes caracteres:%n%n%1 NoProgramGroupCheck2=&No crear una carpeta en el Men Inicio ; *** "Ready to Install" wizard page WizardReady=Listo para Instalar ReadyLabel1=Ahora el programa est listo para iniciar la instalacin de [name] en su sistema. ReadyLabel2a=Haga clic en Instalar para continuar con el proceso, o haga clic en Atrs si desea revisar o cambiar alguna configuracin. ReadyLabel2b=Haga clic en Instalar para continuar con el proceso. ReadyMemoUserInfo=Informacin del usuario: ReadyMemoDir=Carpeta de Destino: ReadyMemoType=Tipo de Instalacin: ReadyMemoComponents=Componentes Seleccionados: ReadyMemoGroup=Carpeta del Men Inicio: ReadyMemoTasks=Tareas Adicionales: ; *** "Preparing to Install" wizard page WizardPreparing=Preparndose para Instalar PreparingDesc=El programa de instalacin est preparndose para instalar [name] en su sistema. PreviousInstallNotCompleted=La instalacin/desinstalacin previa de un programa no se complet. Deber reiniciar el sistema para completar esa instalacin.%n%nUna vez reiniciado el sistema, ejecute el programa de instalacin nuevamente para completar la instalacin de [name]. CannotContinue=El programa de instalacin no puede continuar. Por favor, presione Cancelar para salir. ; *** "Installing" wizard page WizardInstalling=Instalando InstallingLabel=Por favor, espere mientras se instala [name] en su sistema. ; *** "Setup Completed" wizard page FinishedHeadingLabel=Completando la instalacin de [name] FinishedLabelNoIcons=El programa complet la instalacin de [name] en su sistema. FinishedLabel=El programa complet la instalacin de [name] en su sistema. Puede ejecutar la aplicacin haciendo clic sobre el icono instalado. ClickFinish=Haga clic en Finalizar para salir del programa de instalacin. FinishedRestartLabel=Para completar la instalacin de [name], su sistema debe reiniciarse. Desea reiniciarlo ahora? FinishedRestartMessage=Para completar la instalacin de [name], su sistema debe reiniciarse.%n%nDesea reiniciarlo ahora? ShowReadmeCheck=S, deseo ver el archivo LAME YesRadio=&S, deseo reiniciar el sistema ahora NoRadio=&No, reiniciar el sistema ms tarde ; used for example as 'Run MyProg.exe' RunEntryExec=Ejecutar %1 ; used for example as 'View Readme.txt' RunEntryShellExec=Ver %1 ; *** "Setup Needs the Next Disk" stuff ChangeDiskTitle=El Programa de Instalacin Necesita el Siguiente Disco SelectDiskLabel2=Por favor, inserte el Disco %1 y haga clic en Aceptar.%n%nSi los archivos pueden ser hallados en una carpeta diferente a la indicada abajo, introduzca la ruta correcta o haga clic en Examinar. PathLabel=&Ruta: FileNotInDir2=El archivo "%1" no se ha podido hallar en "%2". Por favor, inserte el disco correcto o seleccione otra carpeta. SelectDirectoryLabel=Por favor, especifique la ubicacin del siguiente disco. ; *** Installation phase messages SetupAborted=La instalacin no se ha completado.%n%nPor favor solucione el problema y ejecute nuevamente el programa de instalacin. EntryAbortRetryIgnore=Haga clic en Reintentar para intentarlo de nuevo, en Omitir para continuar de todas formas, o en Anular para cancelar la instalacin. ; *** Installation status messages StatusCreateDirs=Creando carpetas... StatusExtractFiles=Extrayendo archivos... StatusCreateIcons=Creando accesos directos... StatusCreateIniEntries=Creando entradas INI... StatusCreateRegistryEntries=Creando entradas de registro... StatusRegisterFiles=Registrando archivos... StatusSavingUninstall=Guardando informacin para desinstalar... StatusRunProgram=Terminando la instalacin... StatusRollback=Deshaciendo cambios... ; *** Misc. errors ErrorInternal2=Error interno: %1 ErrorFunctionFailedNoCode=%1 fall ErrorFunctionFailed=%1 fall; cdigo %2 ErrorFunctionFailedWithMessage=%1 fall; cdigo %2.%n%3 ErrorExecutingProgram=Imposible ejecutar el archivo:%n%1 ; *** Registry errors ErrorRegOpenKey=Error al abrir la clave del registro:%n%1\%2 ErrorRegCreateKey=Error al crear la clave del registro:%n%1\%2 ErrorRegWriteKey=Error al escribir la clave del registro:%n%1\%2 ; *** INI errors ErrorIniEntry=Error al crear entrada INI en el archivo "%1". ; *** File copying errors FileAbortRetryIgnore=Haga clic en Reintentar para intentarlo de nuevo, en Omitir para excluir este archivo (no recomendado), o en Anular para cancelar la instalacin. FileAbortRetryIgnore2=Haga clic en Reintentar para intentarlo de nuevo, en Omitir para continuar de todas formas (no recomendado), o en Anular para cancelar la instalacin. SourceIsCorrupted=El archivo de origen est daado SourceDoesntExist=El archivo de origen "%1" no existe ExistingFileReadOnly=El archivo existente est marcado como slo-lectura.%n%nHaga clic en Reintentar para quitar el atributo de slo-lectura e intentarlo de nuevo, en Omitir para excluir este archivo, o en Anular para cancelar la instalacin. ErrorReadingExistingDest=Ocurri un error mientras se intentaba leer el archivo: FileExists=El archivo ya existe.%n%nDesea sobreescribirlo? ExistingFileNewer=El archivo existente es ms reciente que el que est tratando de instalar. Se recomienda que mantenga el archivo existente.%n%nDesea mantener el archivo existente? ErrorChangingAttr=Ocurri un error al intentar cambiar los atributos del archivo: ErrorCreatingTemp=Ocurri un error al intentar crear un archivo en la carpeta de destino: ErrorReadingSource=Ocurri un error al intentar leer el archivo de origen: ErrorCopying=Ocurri un error al intentar copiar el archivo: ErrorReplacingExistingFile=Ocurri un error al intentar reemplazar el archivo existente: ErrorRestartReplace=Fall reintento de reemplazar: ErrorRenamingTemp=Ocurri un error al intentar renombrar un archivo en la carpeta de destino: ErrorRegisterServer=Imposible registrar el DLL/OCX: %1 ErrorRegSvr32Failed=RegSvr32 fall con el cdigo de salida %1 ErrorRegisterTypeLib=Imposible registrar la librera de tipos: %1 ; *** Post-installation errors ErrorOpeningReadme=Ocurri un error al intentar abrir el archivo LAME. ErrorRestartingComputer=El programa de instalacin no pudo reiniciar el equipo. Por favor, hgalo manualmente. ; *** Uninstaller messages UninstallNotFound=El archivo "%1" no existe. Imposible desinstalar. UninstallOpenError=El archivo "%1" no pudo ser abierto. Imposible desinstalar UninstallUnsupportedVer=El archivo de registro para desinstalar "%1" est en un formato no reconocido por esta versin del desinstalador. Imposible desinstalar UninstallUnknownEntry=Una entrada desconocida (%1) fue encontrada en el registro de desinstalacin ConfirmUninstall=Est seguro que desea desinstalar completamente %1 y todos sus componentes? UninstallOnlyOnWin64=Este programa slo puede ser desinstalado en Windows de 64-bits. OnlyAdminCanUninstall=Este programa slo puede ser desinstalado por un usuario con privilegios administrativos. UninstallStatusLabel=Por favor, espere mientras %1 es desinstalado de su sistema. UninstalledAll=%1 fue desinstalado satisfactoriamente de su sistema. UninstalledMost=La desinstalacin de %1 ha sido completada.%n%nAlgunos elementos no pudieron eliminarse. Estos pueden ser eliminados manualmente. UninstalledAndNeedsRestart=Para completar la desinstalacin de %1, su sistema debe reiniciarse.%n%nDesea reiniciarlo ahora? UninstallDataCorrupted=El archivo "%1" est daado. No puede desinstalarse ; *** Uninstallation phase messages ConfirmDeleteSharedFileTitle=Eliminar Archivo Compartido? ConfirmDeleteSharedFile2=El sistema indica que el siguiente archivo compartido no es usado por ningn otro programa. Desea eliminar este archivo compartido?%n%nSi hay programas que usan este archivo y el mismo es eliminado, esos programas pueden dejar de funcionar correctamente. Si no est seguro, elija No. Dejar el archivo en su sistema no producir ningn dao. SharedFileNameLabel=Archivo: SharedFileLocationLabel=Ubicacin: WizardUninstalling=Estado de la Desinstalacin StatusUninstalling=Desinstalando %1... ; The custom messages below aren't used by Setup itself, but if you make ; use of them in your scripts, you'll want to translate them. [CustomMessages] NameAndVersion=%1 versin %2 AdditionalIcons=Iconos adicionales: CreateDesktopIcon=Crear un icono en el &escritorio CreateQuickLaunchIcon=Crear un icono de &Inicio Rpido ProgramOnTheWeb=%1 en la Web UninstallProgram=Desinstalar %1 LaunchProgram=Ejecutar %1 AssocFileExtension=&Asociar %1 con la extensin de archivo %2 AssocingFileExtension=Asociando %1 con la extensin de archivo %2... CalibrationLoading=Calibracin de la carga en inicio de sesin: CalibrationLoadingHandledByDisplayCAL=DisplayCAL Profile Loader (alta precisin y fiabilidad) CalibrationLoadingHandledByOS=Sistema operativo (baja precisin y fiabilidad)DisplayCAL-3.1.0.0/misc/low_contrast.icc0000644000076500000000000004172412647526533017650 0ustar devwheel00000000000000Cargl mntrRGB XYZ  */acspMSFT????????-argldesc8gcprtYdmddcwtpt`bkpttclrt~vcgtrXYZ gXYZ 0bXYZ DrTRC X gTRC d bTRC p DevD|4XCIED|4Xdesc low_contrasttext(c) 2009 Id. Created with dispcalGUI and Argyll CMS: dispcal colprof -v -qh -asdesc DISPLAY1XYZ omXYZ clrtRed8Green2\< FBlue[vcgt3334h556667j88999:n;;<<<=p> >???@sAABBBCvDDEEEFyGGHHHI|JJKKKLMMNNNOPPQQQRS STTTUV#VWWWXY&YZZZ[\)\]]]^_+_```ab/bcccde1effggh5hiijjk7kllmmn;noop pq=qrrs stAtuuvvwCwxxyyzGz{{||}I}~~M灁PꄄS퇇!V$Y󍍎'\*Ē^-ȕb0ʘd3Λh6Оj9ԡn<֤p ?٧tBܪvE߭zH|K峀O鶃Q빆 T)#W&Z)]ő,`ȕ/c˗23334h556667j88999:n;;<<<=p> >???@sAABBBCvDDEEEFyGGHHHI|JJKKKLMMNNNOPPQQQRS STTTUV#VWWWXY&YZZZ[\)\]]]^_+_```ab/bcccde1effggh5hiijjk7kllmmn;noop pq=qrrs stAtuuvvwCwxxyyzGz{{||}I}~~M灁PꄄS퇇!V$Y󍍎'\*Ē^-ȕb0ʘd3Λh6Оj9ԡn<֤p ?٧tBܪvE߭zH|K峀O鶃Q빆 T)#W&Z)]ő,`ȕ/c˗23334h556667j88999:n;;<<<=p> >???@sAABBBCvDDEEEFyGGHHHI|JJKKKLMMNNNOPPQQQRS STTTUV#VWWWXY&YZZZ[\)\]]]^_+_```ab/bcccde1effggh5hiijjk7kllmmn;noop pq=qrrs stAtuuvvwCwxxyyzGz{{||}I}~~M灁PꄄS퇇!V$Y󍍎'\*Ē^-ȕb0ʘd3Λh6Оj9ԡn<֤p ?٧tBܪvE߭zH|K峀O鶃Q빆 T)#W&Z)]ő,`ȕ/c˗2XYZ o9xXYZ bfXYZ $gcurvDDFHLQW_hs8Ut*T @u[] 2 }  g a  k $ FvH oVA2)&*4F`D{  !`""#]$ $%s&*&'(b)$)*+{,G--./0c1;223456q7U8;9#: :;<=>?@ABCDEFGHIKLM7NSOqPQRTU(VQW|XY[ \A]x^_a4bycef`gijskm:npqrtpuwhxzk{}z+Z3ԍxĒnɗw'؜Cq0򨻪^2ճuHʾzU4͵Ϧіӆyl`VNF?==?EMXfucurv-D\w;bAsOH^ A 3 5 E  c )]1 yZ?* +Fi/k !Y""#a$$%&D''()U**+,-^.2//012q3O4.5 56789:o;\0?'@ ABCD$E-F:GJH\IqJKLMNP!QERjSTUW X4YbZ[\^4_r`ac?deg:hikcln9oqrtuw xz {}~,P憀^MQY r)⤞^%˭zN!̸[6ŹǡɉwkaVLB91)$ )4CTh|curv{{})B]y"Ir)\8s1tG + z  r  x / M yHfG. ~~ 9]$_  !M!"#U$ $%y&6&'(})E**+,}-P.%./012j3I4)5 56789:w;e54444r5m>f3g4g4g4g4f3m;j8g3g4γ֝;668C@IQZbku|_\WQLFG@755556{?f4g5h5g5h5g4ml:l:l;yMQFIPYdhqzff_YRRKD@????G>?o>p>p?o>tErBp>p>o?zMMDLVamuig`YRQH@:7778A67q7i7j7i6p?m;j6j7j7uETP[ep|qnf_WUMD>:98:C899k9l9k8q@o=k8l9l9vG^]itxumd\YPGA<;:;C9::n:m:l9rAp>m9m:m:wHjkxɀ}tkb^UKD><<=>E;<<{?F;<<4’ּԹvY>˜ǔǓǓǔəǓƔǔǔǔƓɗǖǓǓǔƔǔǔɘǓǔǓǓ}ǓyƔvʙʚ͙ȟ˰ѵˤO<=6*lÓպгyٶn˜Ȕ|ǔǔȕʙǔǔǔǔǔǔɘɖǔǔǔǔǔȕʙǔǔǔ|ǔwǔsǔpʙxʙ}ʘ̜ꚜͰӶѢ@54/"XŔԷе΢˚}˚˛˛͟˚˚˛˛˛˚̝̜˚˚˛˚˚˛͞˚˚˚}˛y˛v˚t͞y̝{͝ѡġӶֻ٢3.,(~{EʘڽѦʗsʗvʗyʗ}̜ʗʗʗʗɗɖ˛˙ɖʗʗʗɗʗ̜ɗyʗvɗrɗpʗmʖj̛p˚qʙưўۑҴչܛ''%}!zv2}НĬʗnʗpʗsʘw͜ʗ{ʗ}ʗʗʗʖ̛˙ʗʗʗʗ}ʗzʗy̜|ʗsʗpʗnʗlʗjʖh̛m˙lʘn˚zϝʞǨдԻ{~!{xvr]Ξs˗m˘o˘q͝zʗt˗v˘x˘y˘z˗z̚͜}ʗz˗y˘xʘv˘u˘s͝w˘n˘m˘kʘj˘h˗f͛l˚j˘j̚r͜ҟȉΫгӽgxvtsϠu˘l̙nΝu˘o˘q˘r˘s˙t˘s͜y̚w˘s˘s˙r̘p˘p˙oΝt˘k̘j˘i˘h˙g˘f͜l̛j˘g̚m͛wΝР鄆{~ҭϳRswƬիҥ}РuРwРxРxРxПxѤ~Ѣ|РxРxРwРwРvСvѥ|ПsРtРsРsРrПqѤvѢtРqРuѡ{ѣզġӲ׻ͨDisplayCAL-3.1.0.0/misc/media/install-py.bmp0000644000076500000000000035044012647526531020321 0ustar devwheel00000000000000BM 6(  g3f3f3f3f4f3f3f3f4g3f3f3f3f3f3f3f3f3f3f3g3f3f3f3f4f3f3f3f3f3f3f3f3f3f3f3g3f3f3f3f4f3f3f3f3f3f4f3f3f3f4f3f3f4f3f3g4f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f4f3f3g3f3f3f3g3f3f4f4f3f3f3f3f3f3f3f3f3f3f3f4f3f3f3f3f3f3f3f3f3f3f3f3g3f3f3f3f3f3f3f3f3f3f3f3f3f4f3f3f3f3f3f3f3f3f3f4f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3g3g3f3f3f3f3f3f3f3f3f4f3g3f3f3f3g3f3f3f3f4f4f3f4f3f3g3f3f3f3f3g3f3f3f3f3g4f3g3f4f3f3f3f3f3f4f4f3f3f3f4f3f3f3f3f3f3f3f4g3f3g3f3f3f4g4f3g3g3g3g3f4f3f3f3f3g3f3f3g4f3g4g3f3f3g4f3f3g3f3g3f3f3f3f3f4f4f3f4f3f3f3f4f3f3f3f3f3f4f3g3g3f4f3f3g3f3f3f3g3g3f3f3g4f3f3f3g4f4f3f3f3f3g3f3f3f3g3f3f3f3f3f3f3f3g3f3f3f4g3f3f4f4g3g4f4g3f3f3f3f3f3f4g3g3f3f3f3f3f3f4f3g4f3g4f3f3g3f3f3f4f3f4f4f3f3g3f3f3f3g3f4f3f3f3f3f3f3g4g4f3f3f3f3f3g3g4f4g3f3f3f3g3f3f3f3f3g4f4f3g3g4f4f3f4g3f4g4g3f4f3f3g3f4f3f3g4f3f3g3f3f3f3f4f3f4f3f3g4f3f3g3f3f3g3g3f3f3f3f4f3f3f3f3g3f3g4g3g3f3f3f3g3f4f3g3f3f3f4f4g3f3f3g4f3f4g3g3f4f3f3f3g4f3f4f4g3g3f3g3f3f4g3g3g4g3g3f3g4g4g3f3f3f3g4f3g4f3f3f3f3g3f3g3g3f3f3f3f3f3f3g3f4g3f4g4g3f3f3g3g4f3g4f4g4g4g3g3f4f4f3g3g3f4f3f3f3g4f3f3f3g4f3g3g3f3f3f4f4g3f4f3g3f4f3g3g4g4g3f4g4g3f3g4f4g3g4f4f4f4f3g3g3f3f4g3f4g3f4f4f4g4f3g4f4f4g4f3g3f4g3g4g3f3f4g3f3g3f4g4f3f3f3f3g3f4g3f4f4g3f4f3f3f4f4f3f4f3f4g4g3f3f4g3g3f3g3f4f3f4f3f3f4g3g3f4f3g3g4g3f3f3f3g3g4f3f4g3g3f3g3f3f3f3f3f4f3g4f4f4f4f4g4f4g3g3g3g3g3g3g3f4g3g3g4f3f3f4f4g3f3f3g3f3f4g4f4g4f4g3g4f3f4f3f4g4g3g3f4f4g3f4f3g4f4f4g4f3f3f3g3g4g3f4g4g3g3g3f4f3g4f4g3f4f4g3g3g4f3g4f3g3f3f3g4f3f4f4g3f4f3f3f4f4f4f3g3g4f4f3f3f3g4g3f3f3g4g4f3g4f4g3g3g3g4f4g4g4f3f4g4f3f3g3f3f3g3f3g4g4f4g4f3f3g3g4f4g3g3g4f3f3g4g4f3f3f4f4f4f4f4g3f4g4f3g3f4f3g3g4f3g3f4f4g4f4g4f4g4g4f4g4g4f4f4f4g3g4g4g3g4g4g4f3g3g4g4g4g4f3f3g4f4f4g4g4g3g4g3g4g3g4g4g4f4g4g4g4f4g4f4f4g4g3f3f4g3f3g4g4g4g4g3g4g3g3g3g4f4g3f3g3g4g3g4f4f4f4g3g4f4g4f4f4f4g4g4g4g3g4g4f4f3f4g3g4g4g4f4g4g4g4f4g4f4g4g4f3g4f3g4g4g3g3g4g3g3f4f3f3g3g3g4g4g4f4g3f4g4g4f3f4g4f3g3g4g3g3g3g4g3g4g4f3g4f4g4f4f4f4g3g4g4f4f4g4g3f4f3g4g4f3f4f4f4g4g3f4g4f4g4g4g3g4f3g4g3g4g4g4g3g4f4g4g4g4g4g3g4g4g4g3g4g4g4g3f3g3g4g4f4f3g3g4f4f4g3g3g4g4g4f4g4g3f3f4f4g4g3g3g4g4f3g4g3g3g3g4f4f4g4g4g4g4g4g3g4f4f4g3g4g4g4f4g4f3f4g4f3g4g3f4g4f4g4g3g4g4g4g4f4f4f4g4g4g4g4f4f3g4g3g3g4g4f4f4f4f4g4g4f4g4g4f4g4g4g4g3g3g4g4f4f4f4g4g3g4g4g4g4g3g4g4g4g4g4g4f3g4g4g4f4g4g4g4g4g4g4g4g4g4g4g4g3g4g4g4g4g4g4f4f4f4g4g4g4g4g4g4g3f4f4g4g4g4g4g4f4f4g3f3g4g4g3g4g3g4g4f4g4g4g4g4g4g4g3g4g4f3g4g4g4g4g3g4g4g3f4g4f4g4g4g4f3g4g4f4g4g4g3g4g4g4g4g4g4g4g3g4g4g4g4g4g4g4f4f3g4g3g4g4g3g4g4g4g4g4g4g4g3g4f4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g3g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g3g4g4g4g3g4g4g4g3f4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g3g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4f4g4f4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g3g4g4g4g3g4g4g4g4g4g4g4g4g4g3g4g4g4g4g4g4g4g4g4g4g4g4g4g3g4g4g4g4g4g4g4g4f4f4g4g4g4g4g4g4g4g5g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4h4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g5g4h5g4g4g4g5g4g4h4g5g4g4h4g4g4g4g4g4g4g4g4g5g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4h4g4g4h4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4h4g4h4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4h4g4g4g4g4g4g4g4g4g4g4g4h4g4g4g4g4g4g4g4g4g4h4h4h4g4g5g4g4g4g4g4g4h4h4g4g4g4h4h5g4g4g4g4g4g4g4h4g4g5g4h4h4g5g4g4g4g4g4g4g4g4g4g5g4g4h4h4g4g5g4g5g4g4g5g5g4h4g4h4h4g4g4g4g4h4h4g5g5h4h4g5h4g5g4g4g4g4g4g4h4g4h4g4g4g4g4g4g4g4g4g5g4g4g5h4g4g4g4g5g4g4h5g5g4g4h5g4g4g4g4g4g5g4g4g4g4h4g4h4h4h4g4h4g5g4h5g4g4g4h4g4g4g4g5g4h4g5g4g4g4g4h4g4g4h4h4g4g4g4g4g4g4g5g4g4h4g4g4g5g4g5g4g5h5h4g4g4g4h4g4h4g4h5g4g4g5g4g5g4g4g4g4h4h5g5g4h5h4g4h4g5g5g4g4h4g5g4h4h4g4h5g4g4g5g4g5g4h5h5g4g4g5g4h4g4g5h4g5g4g5g4h4h4g5h4h4g5g4h4h4h4h4g4g4h5g4g4g5g4h4g5g4h5h4h4g4g5g5g4g4g5g4g4g4g4g4h5h4g4g4g5g4h4g5g4h4g4g4g5g5g5g4g4h5g4h5h4h5g5h4h4g4g5g5g5g4g4g4g4g4g4g4h4g4g5g4g5g4h4g4g5g5g4g4h4g4g5g5g5g5g5g4h5g5g5h5h4g4h4h5g4h5g5g4g4h4h4g5g4h5h5g4h4g5h5h5g4h5g5g4h4h5h4h4g4h5g4g5g4h4g5h4g4h5h4h4g5g4g5h5h4g5g5g5g4h5g4h5g5g4h4g5h4g5h5g5g5g4g5g4h5g5g4h5g4g5g4g4g4g4h4g5h5g4h5h5g4h4h5g4h5h4h5g4h4g4h5g4h5h5h5h4h4h4h5g4g5h4h5h5g5h5g5g5g4g4g5g5g4h4h5g5g4g4g4g4h4g4g4h4g4h5g4g4h5g4g5g4h4h4g5g4g5h4h5g4h5g5g4g5h5g5h4g4h4g5g5h4h5g5h5h5h4g4g4h5g5g5h5h4g5h4g5h4g5g5h5h5h4h4h4h5h5g5h5h5h4h4h5h5h5g4h5h4h5g5h5h5h4g5h5h4g4g5h5h5h4h4h5g5h5h4g5g5h4g4h5g5h4g5g4h5h4g5g4h4h4h4h4h4h4h5g5g4g4g4h4g5g5h4g4h5h5g5h4g5h5h5h5g4h4g5g4h5h4h4g5g5h4h4h5h5h5h5g4g5h4h5g4h4g4g4h5g5g4h5h4g4g5g5h5h4g5h5g5g4g5h5g5g5g5g4h4g5g5g4h4h5h4h4h5g5h5h5h5h5h4h4g5h5g5g5h4g5h4h5h5h5h5h4g5h5h4h5h5h5h5g4g5g5h5h5h4h5g5h5h5h4h5g5h5h5h4g5h4h5g5h5h5h5g5g5g4h4h5g5g5h5g5h5h5g5h5h5g5g4h5h5g5g5h4h5h5g5h5h5h5h5g4h5h4h5g5h4h4h4h5h4g5g4h5h4h5h5g5h4h5h5h5g5g5g5h5h4h5g4g4h4g5h5g5g5h5h5h5h4g5h5g4h5h5h5g5g5h5h4g5g5h5g4g5h4h5h5g4h5h5g5g5h4g5g4g4g5h4h4g5h4h5g5g5h5h4h5h5h5h5h5h5g4h4h5g5h4h5h5h5h5h5h5g5h5h5h5h5h5h4h4h5g5h5g4g5h5h5h5h5h4h5h5g5h4h5h5h5h5h5h5h5h5g5h5g5h5h5h5g5h5h5g5h5h4h5g5h4h5h5h5h5h5h4h5h5h5h5h5h4h5h5g4h5h5h5h4g5h5h5g5g5h5h4h5h4h5h5h5h5h5h5g5h5h5h5h5g4g5h5h5h5h5h4h5h4h5h5g5h5h5g5h5g5h5h5g4h5g5h5h5h5h5h4h4h5g5h5h5h4g5h5g4h5h5g5h5h5h4h5h5g5h4h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5g5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5g5h5h5h5h5h5h5h5h5h5h5g5h5h5h5h5h5h5h5h5h4h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5i5h5h5h5i5h5h5h5h5h5h5h5h5h6h5h5h5h5h5h5h5h5h5h5h5h5h5i5h5h5h6h6h6h5h5h5i5i5h5h5h5h6h5h5i5h5h5h5h5h5h6h5h5h6h5i5i6h5h5h5h5h5h5h6h5h5h5h5h5h5h5h5h5h5h5h5h5h6h5i5h5h6i5h5h5h5h5h5i5h5h5h5h6h5i5i5h6h5h6h5h5i5h5h5h6h5i5h5h5h5h6i5h5h5i5h5h5h5h5h5h6h5i5h5i5h5h5h5h5h5h5h5h5h5h5h5h5h5h6h6h5h5h5h5h6h5h5i5h5h5h5h5h6h5h5i6h5h5h5h5h5h6i5h5h5i5h5h6i5h6h5h5i5i5h5h5h5h5i5h6h6h5i6h5h6h6h5h5h5h5i5h5h5h5i6h5h5h5h5h5i5h5h5h6i5h6h6h5h5i5i5i6h5h5h5i6h5i5h5h5i5i5h5h5h5h5h6h5h6h5h5h5h5i5h5h6h5h5h5i5h6h5h5h6i6i5h5i5h5h5h5h5h5i5h5h5i6h6h5h6i6h5h6h5h5h6h5h5h5h5h5h5h5h5h5h5h6i6i5h5h6h6h5h5h5i5h5h6i6i5i5i5i5h5h5h5h5h5i5h5h6h5h5h6i5h6i5h6i5h6h6h5h5i5i6h5i5i5i6i5h5h6h5h5i5h6i6i5h6h5h5h5h5i5i6i5h6h5h5h6i5h6h5h5h5i5h5i6i6i5h6h5h6h5h6i6h5i5h5h5h6h5h5i5i6h5h6i6i6h5h5i5h5h6i5i5h5i5i5i6h5h5h6i5h6i5h5h6i5h5h6i6i5h5h6i5h5h6i5i6h5h5h6h6i6i5i5h5i5i6h5h5i5i6h5h5h6h5h5h6h5h5h6i5h5i5i5h6h6i6i5h5i5h5h6h5h5i5i5h6h6i6h5h5h6i5h5i5h5i6h6i6h6h6i5h5i6i5i6h6h6i5i5h6i5i6i5i6i6h5i5i6h5h6h6h6h6h6h6h6h5h6h6i5h6i6h6i5i5i5h6h6h5h6i5i6h5b1Y.Z.c3i5i6i6h5h6i5i6h5i6h6i5i5h5i5i5i6h5i6h5i5i6i5i5i6i5h6i5h5f4]/X.^0f5h6i6h5h6h5h5h6h6i5h5i6h6h6i6i6h5h6i6i6i6h5i6h6h6i6i6h6h5i6h5h6i5h6h5i5i6i6h6i5h6i6i6i6h5h6h6i6i6h5i5h6i5h6i6h6h6i6h6i6i6h5h6i5h5i6h5i6i5i5i6h6i6i5i5i5i6i5i6h5i6i6i6h6i6h6i6h6h5i5i6h6h6h6i5h6h6i6h6i6i6h5i6i5i5i5h6i5i5i5h5i6h6i5h6d4cZ.i6i6i5i5i6h5h5i6h5h5i5h5i5i6h6i6h6h5h6i6i5i6h6i6h6i5h5i6b1÷µ^/i6i6i6h6i5h6i6i6i6i6h6h6h5h6i6h6i6i6i5h6h5h5h6i6i5h5i6h5i6h5i6i5h6h6i5h5h5i6h6i6i5i6i6h6i5h5h6i6i6i6h6i5i6i6h5i6i5i5h6i6h6i6i6h6h6i5i6h6i6i6i6h6i5i5i5i5i5h5h6i6h6i6i6i6i6i6h6i6i6h6i6i6i5i6i6i6i5i6i6i6i6h6h6h5i6i5h6h5i6i6h6i6i6i6d3{aU,i5h6i6h6i6i6h6i6i6i5h6i6i5i6h6i6i5i6h6h6h6i6i6i6h6i6i6i5d4fD^8e5h6h6i5i6i5i6i6h6i6i6i5i5i5i6i6i6i6i6i6i6i6i6i6h6i6i6h6h6h6i6h6i5i6i6i6i6i6i6i6i6i6h6i6i5i6h5i6i6i6i6i6i6i6i6h6i6i6i6h5i6h6i5i6i6i5i6i6i6i6i6i6i6i6i6i6i6i6i6i6h6i6i6i6i6i6i6i6i6i6i6i6i6h6i6i6i6i6i6i6i6i6i6i6i6i6i6i6i6i5i6h6i6i6d3{aU,h5i6i6i6i6i6i6i6i6i6i6i6i6i6i6i6i6i6i6i6i6i6i6i5i6i6i6i6i6\/`1i6i6i5i6h6h6i6i6i6i6i6i6i6i6i6i6i6i6i6i6i6i6i6i6i6i6i6i6i6i6i6i6i6i6i6i6i6i6i6i6i6i6i6i6i5i6i6i6i6h5i6i6i6i6i6i6i6i6i6i6h6i6i6i6i6i6i6i6i6i6i6i6i6i6i6i6i6i6i7h6b2Y.U,U,U,U-U-U,V,Y._1e4h6j6i6i6i6i6f5^0Y.^0f5i6g5a2[.V,U,Y-_1f5i6d3{a{S+_1X-V,X-^0e4i6i6i6i6c3Z/Z.c3i6g5b2[/V,V,[/b3e4a1\/b2h5i6i6d3qSW,g6i6i6j6i6i6i6i6i6i6f5`1Z.V,V,U,X-^0d4h5g5`1X-V,\/e4i6i6i6i6j6i6i6i6g5`1X-V,[/b3`1X-U,U,U,U,U,U,U,U,Z/c3i6i6i6i6i6i6i6i6i6i6i6i7i6i6j6i6i6j6i6i7j6j6i7i6i6i7i6e4c᫚rS]/f5i6i6i6i6a2ĶĶ`1e4Y.|`:d3d3{aeD#iFb2h6i6g6mHmIf5^0oßnV-}df4j7i6h6W.nb4i6j6i7i7i6i6i6g5`1^8|a[/`2҄Z/g5i7i6i6i6i6j6i6`1X.mIg5i6i7i6i6i6j6i6i6j6i7i6i6i7i7j7i7i6j7i7i7i6j7j6i6i6i7d3|aV-d5i6i7i6^1]0h>`:`2|aqSc4i6g5gFgFa2}a|ad4j6j7h7W-ÅZ/h6j6j7i7i7i7f5[.ȿ]8zW5nc3i6j7i6i6i6j6i6V,|X.gFg5j7i7i7j6i6i6i6i7j7i6j6i6i7i7j7j6j6i7i7j6i6i7i6i7i7j7d4|ar[yQ*U,U,U,zR+nǽ҆`9f5j7j7]0]1]1қnzR+|T+w^Z.{aғz`|T+zS*mV,h6f5hFgF]/xV5V,yR*}{ad4j7j7e4qSqSd3j6j7i7j7h5Z/ӇfE^1i7i7j7j6i7i7d3|a_9^0mIh6i7i7i7i7i7i6i7j7j7j6j6i6i7j7i6j7i7i6j7j7i7j7j7i6j6j6e4|a|ae3j7i7i7h5b4Z.x_ȿ[/i6j7^0^1f5^1\0c3h6i6^1lV-|azX5c2i6h6`1bC|c3g5hFhF[/ɿ|T,c4f5c2uO)|ae4j7i7^1^1i7j7j6i7`1[8V,V-xQ*Y-{a~V,h5i7j7j7j6i7_1^1`2lI&V-V-V,V,U,[.d4i6i7j6i7i6j6i6i7j7i7j7j7j7j7j7j7j7j7i7j7j7i7j6j6i7i7i6e4|a{ae4j6j7j6j7j7i5^1{{`d4j7^1^0j6j6j7i7j7g5[/zҁW,|aV,j7j7j6j7[/ǽȾ]0f5hFgF`2}}yR*V,lI&|ae4j7f5^8yh^9f5j7j7g5_9nQ^1f5i7j7h5`1_9Z/e5W-k{R+V-V-V-V-V-nJ'|ad3a2Y.j7j7j7j7j7j7j7j7j7j7j7i7j7j7j6j7j7j7j7j7j6j7j7j7j7j7k7j7j7j7j7j7j7j7e4|a|ae4j7j7j7j7j7j7h6V-È\0j7^1^1j7j7h6a2Y.]8o^1|aV-j7j7j7j7`2Y.g5hFhFe5]0||ae4j7a2qL'a2j7j7a2m`2i7j7j7j7j7j7g5e4h6j7a2҃X.i6a2Y.j7j8j7k7j7j7j7j7j7j7j7j7j7j7j7j7j7j7j7j7j7j7j7j7j7j7j7k7j7j8j7j7j7j7f4|a|ae4j7k7j7j8k7j7j7`2_:i7^1^1j7d4V-ҟo^1d4|aW-j8j7j7j7b3|X.g5hGhGg5i6a3}T,|ae4h6V-|]0qSX-h6j7\1ҁW-h6j8j8j7j7j7j7j7k8j7j8h5^8b3j8b2Y.j7k8j8k7j7j7j7k7k7k7j7k7j7k7k7j7j7j7j7j7j7j7k7j8j8k8j7j8k7j7j8j7j7j8e4|a|ae4j7j8k7j7j8j8j7c4nqTg5^1^1e5kHҭ]8[/d3i6e5|aV-j8k7k7k7a3|Y/g6hGhGg5j7k7h6d3^1Y.V-lI'|af4c4|`:g5Y/nc4j8X._1k7j8k7j7k7k7j7j7j8j8k7j7\1ȾsN)V-W-{T+tY?^8g6k7a3Y/j7k8j8j8j8j7j7k7k8j7j7k7j7j8j7j7j8k8j8j7j8k7j8j8k7j7j8k7j7k7j8j7k8j7e5|a|ae5k8j8k8j7k8k7j7f5qSoe5_2^1_1ɿ}T,a2h6j7j8j8e4|azS*h6j7k8k8_2҇[/h5hFhFg5k8i6g6j8k7k8k8W.|ae5Z.`1j8b4|ÆZ/i7W-b3j8j8k8j8j8k7k7j8j8k8k7k7e5{aW.i6k8a3^1j7k8a2Y.k7k8k8k7k8j8k7j8j7k8k8j8j8k8k7j8k7j7j8j7j7j8j8j8k8k7k8k8k8k7k8j8k7k8f4|a|af4k7k7k8j7k8k8j8f6qT|af5_2_1\0k^1i7h7c4`2e5d5|a{]0h5k8f4zS+a3g5hGhFh6d5nJwV^1g5k8e5dEsUb2|agFg6k8h6`:qTe5W.|b2k7k8k8k8k8k7j8k7k7k8k7j7j6X.|ae5i7X-|af5k7k8b3Y.k7k8k8k7k8j8k7j8k7k8j7k7k7k8k8k8k7j8k8k7j7k8k8j8k8k8k8k8k8k7k7k8k7k8f5|a|af5k8k8j8k8k7k8k8d4osUg5_2_2`2mQ~U-zS+|әxWb3|axQ+~U,eDhGg6h6hGhGh6j?\7~V-|Z7Y/\0Æ[0j8k7j8_2_2Y/`2k8k8k8k8k8j8k8k8k8k7k8k8j8a3^1e5|aX-i7k7k8b3Z.k8k8k7j8k7j8j8k8k7k8k7k7k8j8k8k7k8j8k8k8k7k8k8k8k8k8k8k8k8k8k8k8k8k8f5|a|af5k8k8k8k8k8k8k8a3`;i7_2_2g6kHa3|aĻ`2k8h6hGhGh6c4po_2hFod4k8k8k8g6gF^9Z/Ǿ҃Y/j7k8k8k8k8k8k8k8k8k8k8k8k8g6hG_:[0b3k8k8k8b4Z/k8k8k8k8k8k8k8k8k8k8k8k8k8k8k8k8k8k8k8k8k8k8k8l8k8k8k8l9k8l8k8k8k8k8f5|a|af5k8k8k8k8k8k8i7V-É]1k8c3ŷŷb3k8e4lHȿrU`2e6dwQ*}᧒}]2i7l8h6iGhGi6i7a3jGØ}ba2c5Z/i7k8l9k8k8]1^1z`c4k8l8k8l9k8k8i8g6i7k9k8k8k8\1Ǿ|zX6^9h6k8k8l9b3Z/k8k8k8k8k8k8k8k8l8k8l8k8k8k9k8k8k8k8k8k8k8k9l8l9k8l8k9k9l9k8k9k8k9l8f5|b|af6l8l8k8k9l8j7`3|ae5l9h7`2\1a2i7l8k8g7`2Z0W.Y/^1f5k8k7d4]1_3f5d4\0Y.Y.[0c5j7l8l8i6hGhGh7l8l9g6a3Z/X.X.]1f5j7h6a3[/]1g7k9k9k8l9l8g6_3[/a3f5`:fEa2h6l8k8g6a2a;ra3k8k8l9k9d4o˜xȾ]2k9k8l8k8b4[0k8k9l8l8l8k9k8l8k8k8k9k9k8l8k9k9k8l9l8k8k8k9k8l8l8k8l8k9k9k8l9l9l9k8f5|a|af6k8l9k8i8e4\0x_ɿ\1k8l8k8l8l9l9k9k9l9k8k9k9l9k9l8k8l9l8k8l9l9k9l8k8k8l8k8l8k9l8k8h6iGiGh7l8k9k8l9l9l9k8k9k9l8l9l9l8k8k8k8k9k8l8k8k8l9l9k8l8b4}]8W.~V.gFqTe6k9k9l9j8W-|ae6l8k9k9k8b3Z/k9k8l9l8k8k9l9l8l8k9l8l9l8l9l8k9k9l9k8k8k8l9l9k9l9l9l9k9k8l9l9l9l9l8f6|bs\{S,X.X.W.}T-oǾ҈bp=p=p=p>p=p=p=p=p=p>p=p=p=p=q=p=p=p=p=p=p=p=p=p=q=p=p=p=p=p=p=p=p>q=p=p=p=p=p=p=p=p=p>p=q=p=p=p=p=p=p=q=p=p=p=p=p=p>p=p=p=p=p=p=p=p>p=p>p=q=p=q>p=p=p>p=p=p=p=p=p=p=p=p=p=p=p=p=p=p=p>p=p=p=p>q=p=p=p=p=p=p=p=p=p=p=p=p>p>p>p=p=q=p>q=p>p=p=p=p=q=p=p=p=p=q=p=q=p=p=p=p=p=p=p=p=p=q>p>p=p=p=p=p=p=p>p=q=p=p=q=p=p=p=q>q>p>p=q>p>p=p=p>p=p>p=q=q>p>q>p>p=p=q=q=p=q=q=q=p=q=p>p=p>q=q>p=p=p>p>p=p=q=p=p=p=p=p=p=q=p>q>q=p=p>p>p=p=p>p>q=p=p=p=p=q=p=p>q=p>p=p=p=p=p>p=q=q=p>p>p=p=p=p>q=p=p>p>q=p=p=p=p>p>p=p=p=p=p>p=q=p=q=q=q=p=q=p=q>q=p=q=p=p=p=p=p=p=q=p>q=p=p=q>q=p=p>q=p=p=p=p>p>p>q=p=p=p=p=q=q=q>p=q=p=p=p=p=p>q>p=q=p=p=q=q>p>p=p=q>q=q>q=q>p=p>p>q>q>q=p>q>p>q>p>p=p=p>p>q=p=p=q=p>q=p=q=q>p=p=p=p=p=p=p>p>p=q=q=p>p>q>q>p>q=p=p=q>q>q>p=q>p>p>q>q=q=q>p=q=q=q>p>p=q>q>q>q>p>q=q=p=p=q>p>p>q>q>p=p=q=q>p=q>p>q=p=p=p=p=q>p>q>q>p>p>p=p=q=q=q=q=q>p=p>q>p>q=p=p=p=p>q=q>q>p>q=p>p=p>q=q=q=q>q>p=q=q>q=q>p>p>q=q=p>q>p=p>q=q>p=q>p=q=q>p>p>p>p=q>q>p>p>q=q>q>q>q=p>p>q>q>q=q>q>q>q=q=p=q>q>p>p>p>p=p>p>q=q=q>q>q>q=p=q=q>q>q>q>q>p>p>q=q>p>q=q>q=q=q>q>q=q>q>q>p=q>p>q>p>q>q>q>q>q=q>q>q>q>q=q>q>p=q>p=p>q>q>q>q>q>p=q>q>p=p=q>q>p>q>q>q>q>p>p=q>p>p>q>p>q=p>q=q>p>p=p=p=q=q>q>q=p>q=p>q>q>q=p>p>q>q>q>q>p=q=q=q>p=p=q=p>q>q=q=q>q>p>p>q>p>q=q>q>q>q>q>q>q>q>q>q>q>q>q>q>q=p>q>q>q>q>q=q>q>q>q>q>q>p>q>q=q>q>q>q>q>q>q>q=q>q>q>q>q>q=q>q>p>q>q>q>q>q>q>p>q>q>q>q>q>q>q>q>q>p>q=q>q>q>q>q>q>q=q>q>q>q=q>p>p>q>q>q>q>q>q>q>q>q>q>q>q>q>q>q>q>q>q>q=q>q>q>q>q>q>q>q>q>q>q>q>q=q>q>q>q>q>q>q>q>q>q>q>q>q>q>q>q>q>q>q>q>q>q>q>q>q>q>p>q>q=q>q>q>q=q>q>q=q=q>q>q>q>q>q>q>q>q>q>q>r>q>r>q>q>q>q>q>q>q>q>q?q>q>q>q>q>r>q>r>q>q>q>q?q>q>q>q>q>r>q>q>q>q>q>q?q>q>q>q>q?q?q>r>q>q>q>q>q>q?q>q>q>q?q>q>r>q>q>q>q>q>q>r>q>r>q>q>q?q?q>q>q>q>q>q>q>q>q>q?q>q?q>q>q>q>q>q?r?q>q>q?q?q>q>q>q>q>q>q>q>q>q?r>q?q>q>q>q>q>q>q>q>q>r>q>q>q>q>q>q>q>q>q>q>q>q>q>q>q>r>r>q>q>q>q>q>q>r>q>q>q?q?q?q>q?q>r>q?r>q>r>q>r>r>q?q>q>r?q>r?q>r>r?q>r>q>r?q?r>r>q>r?r>r>q>r>r>q?r>q>r>q>q>r>r>r?q?q>q>q>q?r>q?q>q?r?r>r>q>q>q>r>q>q>q?q?r>q>q?r?q>q?q>q>q>q>r?r>q>r?q?q>q?q>q>r>q>r>q?q?q?q>r>r>q>q?q?r>q?q>q>r>q>q?q?r>q?q?r>r>r?q?q?q?q>q>q?r>q>q>r>r?q?r>q?q?q?q>q>q>q>r>r>r>q>r>r>q>q?r?r>q>q>q>r?q>q>q?q>r>r>r?r>q>r>q?q>q?q?q?q?r>q>q?q?r>r>r>q?q?r>q?r>q>r>q?r>q>r>q>q?r>q>r>r?q?q?r?q>r?q>r?q>q>r?r>q?r?r?r>q?r?q?r?r>q>r?r?r?q>q>q?q?r>r?r>r?r?q?r?r>r?q?r?q?r?r?q?r?q>q>q?q>r?r>q?r?r?r?r>q>q?r?q>r>q?q>r?r>r?q>q?r?q>q?r>q?r>r>q>q?q>r?r>r>r?r>q>r>q>q>r>r?r>q?r?r?r?r>r?r?r>q?q?r?r>q?q>r?r?r?q?q?r?q?r?r?q>r>q?r?r?q>q?r?r>r?q>r>q>q?r?r?r?q?r>r?r>r>r?r?q?q>r?r?r>r>r?r>r>r>q>r?r?r>q?r?q?r>q?r?r?r?r>r?r>q?r?r?q?r?r>r?r?r?r>q?r?r>q?r?r?r?r?q?r?r>r>r?r?r?q?r?q?q?r>q?q?r?r?r?r?r?r?r?r?r?r>r?r?r?r>r?r?r>r?r?r?r?q?q?r>q?r?q>r>r?r?r?r>r?r>r>r?r?r?r?r?r?r?r?r?r?q?r>q?r>q>q?r?r>r?r?r?q?r>q?r>q?r?r?r>r?r?r>r?q?r?r?r?r?r?r?r?r?q?q?q>r?r?r?r?r>r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?s?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r@r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?s@r?r?r?r?r?r?r?r?r?r?r?s?r?r@r@r?r@r?r?r?s?r?s?r?r?r@r?r?r?r?r?r?r?r?r@r@r?s?r?r?r?r?r@r?r?r?r?r?r?s?s?r?r?r@s?s?r?r?r?r?r@r?s@r?r?r?s?s?r?r?r?r?r?r?r@s?r@r@r?r?r?r?r?s?r@r?r?r?r?r?s?r?r?r?r?r?r@r?s?r?r?r?s@r?r@r@r?r?r@r@r?r?r?r?r@r?r?r?r?s@r?r?r@s?s?r?s?r?r?r@r?r@r@s?s?r@r?s?s?r?r@r@r?s?r?r@s@r@r@r?s@s@s@s?r?s@r?r@r?r?r@r@s@r@s?r@s@r@r?r?r@r?r?r?r?r?s?s@s?r?r@s@r?s@s?r?s@r@s@r?r@r?r@s@s?s?r?r@s@r?r@s@s?s@s@r@s?s?s?s?s@r?r@s@s?r?s@r?r@r?r?r?s@r@s@r@r@r@r@r@s@r@s?s@r?s@s?r?s@r@s?s@s?r?r?s?s?r@s@r?s@s@s@s@s?s?r?r@r@r?r?r?s@r?s?s?r?r?r@r@s?s?r?s?r@r@r@r?s?r?s@r?s@s?r?s?r?s?r@s@r?r@r@r@s?r?s@s@s@s@s@r@s@s?s@r@s@s@r@s@s@s@r?s@s@r@s@s@s@r@r@s@r?s?r?s?s?r@r?r@r@s?s@s?s@r?r@r@s@r?r?r@r@s@s@s@s?s?s@s@s?s?s@r@r?r@s@r@s@r@r@s@s?s@s@r?r@r@s@s@s?s?r?s?r?r?r@r@s@s?s@s?s?s?s@r@s?s@s@r@r@s?r@r@r@s@s@s?r@s?s?s@r@s@r@s@r?r@s@s@s?r@r@r@r@s@s@s?r@r?s@r?r?s@r@r?s@s@s@r?s@r@r@s@s@r?s@r@r@s@s@s@s@s@r@r?s@r@s?s@s@s@s?s@s@s@s@s@s@r@r@s@s@r@s@s@s@s@s@r@r@s@s?r@s@s@s@s@s@s@s@s@s@s@s@s@s@s@s@r@s@s@s@s@s@s@s@s@s@r@s@s?s@s@r@s@s@s@s@s@r@s@s?s@s@s@s@s@s@s@s@s@r@s@s@s@s@s@s@s@s@s@s@s@s@s@s@s@s@s@r@s@s@s@s@r@s@s@s@r@s@s@s@s@s@s?s@r?s@s@s@s@s@s@s@s@s@s@r@s@s@s@s?s?r@r@s@s@r@s@s?s@s@s@s@s@s?s@s@s?s@s@s@s@s@s@s@s@s@s@s@s@sAs@s@s@s@s@s@sAs@s@s@t@s@s@s@s@s@s@s@sAs@s@sAs@s@s@s@s@s@s@s@s@s@s@s@s@sAs@s@s@s@t@s@sAsAs@sAs@s@s@s@s@s@s@s@s@sAs@t@s@s@s@s@s@sAs@s@s@s@s@s@s@s@s@s@s@s@s@s@s@s@s@s@s@s@sAt@t@s@s@s@s@s@s@sAs@s@s@tAs@s@s@s@s@s@sAs@s@sAs@s@s@s@s@s@s@s@s@s@s@s@s@s@s@s@t@s@s@sAs@s@s@s@s@sAs@s@s@s@s@s@s@s@s@s@s@s@s@s@t@s@sAt@tAsAt@s@t@t@sAt@t@s@sAt@tAs@s@s@s@t@s@s@sAs@t@s@s@s@tAs@sAs@s@sAs@s@sAsAs@s@t@sAt@sAsAs@sAsAs@tAs@s@s@s@s@t@s@t@s@s@s@t@sAs@s@s@sAs@tAt@t@s@s@t@tAs@sAtAs@t@sAsAtAs@s@s@t@t@t@s@tAtAt@s@tAs@t@s@t@s@s@s@tAsAs@t@tAt@s@sAt@s@tAs@t@s@s@s@s@s@s@tAs@t@t@t@sAs@t@s@tAtAs@s@s@s@t@tAtAt@s@tAs@t@sAs@t@tAsAsAt@sAs@tAtAt@tAt@s@t@tAt@sAtAt@t@tAt@t@sAsAtAs@t@s@sAt@s@sAtAsAtAtAs@sAsAtAtAsAt@tAt@tAtAsAt@tAt@s@t@t@sAtAs@t@t@tAt@s@sAs@tAsAt@sAtAtAsAs@sAsAtAt@tAt@tAs@s@tAt@s@tAsAtAtAsAtAs@s@sAs@s@tAs@tAtAt@tAs@s@t@t@t@tAt@tAt@sAt@sAsAs@tAtAtAsAt@tAs@tAt@tAtAsAsAt@t@s@s@sAs@tAsAsAs@t@t@t@tAsAt@t@t@tAs@tAsAt@t@tAt@s@tAt@sAtAsAtAt@sAtAtAtAtAtAt@s@tAtAsAt@sAsAtAsAs@t@s@tAsAtAsAt@tAt@tAt@tAsAtAtAsAt@t@tAt@sAtAtAtAsAt@tAsAt@sAsAtAtAtAtAtAtAtAsAsAs@t@t@tAsAs@t@sAsAs@tAt@sAt@tAs@sAtAtAt@sAt@tAtAs@sAtAsAt@tAsAtAs@tAtAtAt@s@t@tAtAtAt@tAtAtAs@tAtAtAtAt@s@t@tAtAtAsAtAt@tAtAtAsAt@tAsAtAtAsAtAsAtAtAsAs@tAtAs@t@t@t@t@tAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAsAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAt@tAtAtAtAsAtAtAt@tAtAtAtAtAtAtAtAtAtAtAtAtAsAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAt@tAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAuAtAtAuAtAtAtBtBtAtAtAuAtAtAtAtAtAtAtAtAuAtAtAtBtAtAtAuAtAtAuAtAuAuAtAtAtAtAtAtAtAtAtBtAuAtAtAtAuAtAtAtAtBtBtAtBtAtAuAuAtAtAtAuAtAtAtAtAuBtAuAtBtAtAtAtAtAtBtBtAtAtAtBtAtAtAtAtAtAtAtBuAtAuAtAtAtBuBtAuAuAuAuAtBtAtAtAtAuAtAtAuBtAuBuAtAtAuBtAtAuAtAuAtAtAtAtAtBtBtAtBtAtAtAtBtAtAtAtAuAtBtAuAuAtBtAtAuAtAtAtAuAuAtBuAtBtBuAtBtAtAtBtBtAtBtAtBuBuAtBtBuAuAtAuAuBtAtBtAtAtBuAuAtBtBuAuBtBuAtAtAtAtAtAtBuAuAtAtAuAtAtBtBtAuBtAuBuAuAuAuAtAtBtAtBtBuAtAuAtAtAtBuAtBtAtAtAuAuBtAuBuBuAtAtBtAtAuAuBtBuAtAtAtAuAtAtBuAuAuBtBtBuAuBtBuAuBuAtBuBuAtBtAtAuBtBtAtAuBtBtAuAtAtBtBtBtAuBuAtBuBuAtAuAtAtAuAuAtAtAtAtBtAtAtAtBuAtAuBuAuAtAtAtBuBuBtAuBtBuBuAuAuBuBuBuBuBtBuBtAtAuAuAtAuAuAuBuBtBuBtAuAuAuBtBuBuBuBuAuBuBuBuAuAtAtAuBtAuBuAtBtBtBuBtBuAuBtAtBuBtAtAtBuAtBuAtBuBuAtBuBuAuBuAuBuBuBuBuAuAtBtBtBuBuAtBtAtAtBuBtBtBtBuBtBuAuBtAtAtBuBuAuBuBuBtBtBuBuBuBuAtBuBuAuBuBtBuAuBuBtBtBtAuAuBtBuBuBuBuAtBtBuBuBtBuBtBuBuBuAuAtBuAuBuAtAtBuAuAuBuBuBtAuAtBtBuBuBuBuBuBuBuBuBuBuBuBuBuBuBuAuBuBuAuAtBtBuBuBuBuBuBuBuBuBuBuBtBtAuBuBuAuBuBtBuBuBuBtBuBuBuBuBuBtBuBuBuBuBuBuBuBuBuBuBuBuAuBuAuBuBuBuAuBuBuBuBtBuBuBuBuBuBuBuBuBuBuBuBuBuBuAuBuAuBuBuBuBuBuAuBuBuAuBuBuBuBuBuBuBuBtAuBuBuBuBuBuBuBuBuBuBuBuBuBuBuBuBuAuBuBuBuBuBuBuAuBuBuBuBuBuBuBuBuBuBuBuAuBuBuBtBuBuBuBuBuBtBvBuBuCuBvCuBuBuBvBuBuBuBuBuBvBuBuBuBuBuCuBuBuBuBuBuBuBuBuBuBuBuBuBuCuBuBuCvBuBuBuCuBuCuBuBuBuBvBuBuBuBuBuBuBuBuBuBuCuBuBuBuBvBuCuBuBuBuCuBuBvBuBvBuBuBuBvBuBuBvCuCuBuBuBuBuCuBuBuBuBuBuBvBuBuBvCuBuBuBvBuBuBuBuBuBuBuBuBuBuBuBuBvBvCvCuCuBuBvBuBvBuBuBuBuBuBuBuBuCuBuCuBuBuBuBuBuBuBuBuBvBuBvBvBuBuBuBuBuBuBvBuBvBuCuCuCuBuCuBvBvBvBuCvBvCuBuBvBuBvBuBuCvCvBvCvBuBvBuCuBuCuBuCuCuBuBvBuBvBuBvBuBuBvBvBuBuBuBuBuBuCuBuBuBuBvBvCuBuBvCvBuBuBvCvBuBuCuCuBuCuBuCvBuCvBuBuBuBuBvCuBuCuBvBvBuBuCuBvBuCuBvBvCvBuBuBuBvCvBuBuBuBuBvCuCuBuBuCuCuBuBuBuBvBuBuBuBuBuBuCuCuBuBuBvCuCuBuBvBuBuBvBuCuBuCvBvBvCvCuBuCuCuCvBuBuBvBuBuBuBuBuBuBvBvCuCuCvBuBuCvCvCuCuCvCuBvCuCvCuCvCvBvCvCuCvCvBvCvBvCuCuCvCvCvCuBuBuCvCuBuCuBvBuCuBuCuCuBuBvBvBuBuCvCvBvCvCvBvBuCuBuBvCvCvCuBvCvBvCvCvBuBvCvCuCuCvCvBuCvCvCvBvBvBuBuCuCuBvBvBvBvCvBuBuCuBvCuBvBvCuCuCuBuBuBvCvCvBvCvBvBuCuCuCuBuCuBvBuBvBvCvCuBuBuBuBvCuBvBvCvBuCvBuBvBvCuCuBvCvCuBvCvCuBvBvBvBuBuCvBvCuBvCuBvCvBvCuCvCvCvCvCvBuCvCvCvCvBuCvBvCvCvCvCvCvCvCuCvCvCvCuBuCuCvCvCvCvBvCuCvCvCuCuBvBvCvBuCvCvCvCvCvCvCvCvCvBvCvCvCvBvCuCuCvCvCuBvBvCvCvCvBvBvBvCvCvBvCvCuCvBvCvCvCuBvCvCuCvBuCvBvCvCvCvBvBuCvCvCuCuBvCvBvCvBvCvCvCvBvCvBvCvCvCvCuCvCvCvCvCuCuCuCvBvCvCvCvCvCvCvBvCvCvCvBvCvCvCvCuCuCvCvCvBuCvCvCvBvBvCvCvBvCvCvCvCuCvCvCvCvCvCvCvCvCvCvCvCvCvCvCvCvCvCvCvCwCvCvCvCvCvCvCvCvCvCvCvCvCvCvCvCvCvDvCvCvCvCvCvCvCvCvCvCvCvCvCvCvCvCvCvCwCvCvCvCvCvCvCvCvCvCvCvCvCvCvCvCvCvCvCvCvCvCvDvCvCvCvCvCvCvCvCvCvCvCvCwCvCvCvCvCvCvCvCvCvCvCvCvCvCvCvCvCvCvCvCvCvCvCvCvCvCwCvCvCwCvCvCvCvCvCvCvCvCvCvCvCvCvCvCvCwCvCwCvCvCvCvCvCvCvCvCvCvCvCvCvCvCvCvCvCwCvCwCwCvCvDvDvDvCvCvCvCvCvCvCwCvCvDvCvDvCwCvCvDvCvCvCwCvCwCwCvCvDvCvCvCwCvDvCwCwCvCvCvCwCwDvCvCvCvCvDvCvCwCvCvDvCwCwCvDvCvCvCvCvCvCvCvCwCvDvCvCwCwCwCvDvCvDvCvCvDvDvCwCvCwCwCvCvCvCvCwCwCvDvDwCwCvDwCvDvCvCvDvCvCvCwCvCwCvCvCvCvCvCvCvCvCvDvCvCvDwCvCvCvCvDvCvCwDvDvCvCwDvCvCvCvCvCvDvCvCvCvCwCvCwCwCwDvCwCvDwCwCwDvDvCvCwDvCwDvDvCwCvDwCvCvCwCvDvDvDwDwDvDvCvDwCwDvCwCvCwDwDvDvCvDwDvDvCvDwDwCvCwCvDwCwDwCvCwDwCwDvDwCvDvCwDvCvCwDwDvDvCwDwDwCwCwDvDvCwCwCvDvCwCwCvCwDvDvDvDwCvDwCwDwDvCvCvDvCwCwCvDwCwDvCvDvCwCwCvDwCwCvDvCwCwDwCwDvDvDwDvCvDwDvCwCwDvCwDwCwCvDvDvDvDvCvDvDvCvDvCvDwDwDvCvCwDvCwCvDvCwCwCwCwDwDvDwDwCwDvCwCvCvCwDwDwDwDwDvCvDwDwDwCwDwDvDvDvDwDvDwDvDvDwCvDvDvCwCwDwCwCwDwDwDwDvDvDwDwDwDwDwDvDwCwDwDwDvDwDwCwDwDvDvDwDwDwCwCvDwDwDwDwDvDwCwCwDwCwCwCwDwCvDwCwDwDwDvCwDwDwDwDwCvDwDwDvDvDwDwCwDwCwDvDwCwDvDwDvDwDvDwDvCwDwCwDvDwDwDvCvDwCwCvCvCwDwDwDwDwDwDwCwDwDwCwDwDwDvDwDvCwDwCwDwDwDwDwCwDwDwDvDwCwDwDvDwDwDvDwDvCvDwDwDwDwDwDwDwDwDwCwDwDwDwDwDwDwDwDwDwDwDwDwDwDwCwDwDwDwDwDwDwDwDwDwDwDwDwDwDwDwDwDwDvDwDwDwDwDwCwDwDwDwDwDwDwDwDwDwDvDwDwDwDwCwDwDwDvDwDwDwDwDwDwDwDwDwDwDwDwDwDwDwDwDwDwDwDwDwDwDwDwDwDwDwDwDwDwDwDwDwDwDwDwDvDwDwDwDwDwDwDwDwDwDwDwDwDwDvDwDwDwDwDwDwDwDwDwDwDwDwDwDwDvDwDwDwDwDwDwDwDwDwCwDwDwDwDwDwDvDwDwDwCwDwDwDwEwDwDwExDxDwEwEwDxDwDwDwDwDwDxDwDxDwDwDwDxEwExDwDwDwEwEwDwDwDwEwDwEwDwDwDxEwDwEwDwEwDwDwDxDwDxDwDxDwDwDxDwEwDwDwDwEwDwDxDwEwEwEwEwDwDwEwDwEwDwEwDwEwDxDwDwEwEwDwDwDwEwDwDwEwDwEwDwDwDwEwDwDwDwEwEwDwDwEwDwEwDwEwEwDwDwDxDwEwDwDxDxDwDwDwEwDwDxDxEwDwDwDwEwDxEwDwDwDwDwDwDwDwDwDwDxEwEwDwExExEwDwEwEwDwDwDwDwDwEwDwDxEwDxDxDxEwEwDwDwEwEwExDwEwDwEwEwExDxDxDwDxDwDwDxEwEwDwExDwDxEwDwDwDwDxEwDwDwDxExDwExExEwDwDwExDxEwDxDwDxEwDxEwDwDwExExExExDwDxDwExDwDxDxEwEwExEwExEwDwEwDxExExDwExExEwExEwDwEwEwDxDwExEwDwDwDxEwDwDxExDwDxDxEwDxDwDwDxDwExExDwDwDxExDxDwDwDwExDwEwEwDwExDwEwExEwDwExEwDwEwDxDwExDxEwDwDxEwDwDwDwExDxExExEwDxExDxExExExExDxDwDwDxDwDxDxDwExExDxExDxExDxExEwDwDxEwDwExExEwEwExDwDxExExExDxEwExDxDxExDwDxEwDxDxEwEwDxExDxEwExExExDxExExEwDxDwEwDxDxExExDxExDxExExDxExEwDxExDxDxExDxExDxExDxEwExDwExExEwExDxDxExEwEwExEwEwExExEwExDxDxDxDxEwExExDxEwEwDxExExDxDwEwEwExExEwEwDwEwExExDxEwDwDxDxEwExEwExEwDxDxExExEwDxExDxExExExExExExExDxExEwExExExExExExExExExExExExExExExExExExExEwExExExExEwDxDxExExExExExExExExExExExExExDxExEwExExExEwEwExExExExExExExExExExExExExExExDxExExExEwDxExExDxExExExExExExExExExExEwExExExExEwExExExExExExExEwExDxExExExExEwExExDxExExExExExDxExExExExExExExExExExExExExExExExExExExEwDxExExExExExExExExExExExFxExExFxExEyExExExFyFxExExExExExExEyEyExExExFxExExEyExExExExExEyExExExExExFxExEyExExExExExExFyExExExExExFxExExExEyExExExExExExExFxFxExFxExExFxExExExEyExExExExFxExExExExExExExExEyExExFxExEyEyExFxExExEyExEyExExExExExExExExExExExFxExExExExExExExExExEyExExExExFxFxExExExExExExExEyExExEyExFxExEyExExFxExExEyFxFyExEyFxEyFxExFxExFyExExExExExEyFxExFxExFyEyFxExFyExEyFxEyFxEyExExFxExExFyExFyExFyExFxFxExEyEyFxEyEyEyFyExExFxExEyExFyFyExFxExExExEyEyFyExFxExExFyExFxExExExExExFyFyExFxExExExFyFxEyExExExFxExEyEyFxExFyFyFxExEyExExFyEyExEyEyEyFxExExFyExEyExExFyExExFyFyExExFyExExFyExFxExExFxFyFyEyExEyEyFxExEyEyFxExExFxExEyFxFyFyEyFyFxFyExExFyFyFyFxFyEyFyFxEyFyEyExFyFxFyFyFxFxFyEyFyFxFyFxFyFyExEyFyEyFxFxFyEyFxFyEyFyFyFyFxEyEyFxExFyFxFxFyFxFxFxFxFyFyEyFyFxFyEyEyExFxFxExFyEyFyFyEyFyFxFyFyFyFyEyFyEyFxEyFxFyFyExEyEyEyFxEyFxEyEyFyEyEyFyExFyFxEyFyExFyEyFxFyFyFxFyExFxFxFyFxEyFxFxFyFyFxExFyFyFyFxFyFxFxFyFyFxFxFyFxFxFyEyFxEyFyFyFyFyFyFyFyFxFyFyEyFxEyFyFyFyFyFyFyFyFxFyFyFyFyEyFxFyEyFyFyEyFyEyEyFxFyFyEyFyEyFyEyFyFyFyFyFyFyFyFyFyFyFyEyFyFyFxFyFxFyFyFxFyFyFyEyFyEyEyEyFyFyFyExFyFxFyExFyFyExFyFyFyFyFyEyEyFyEyEyFxExEyFyFyEyFxFyFyFyFyFyFyFyFxFyFyFyEyFyFyFxFyFyFyFyFyFyFyFyExFyFyFyFyFxFyFyFxFyFyFyFyFyExFyExFyFyFyFyFyFyFyFyFyFyEyFxFyFyFyFyFyFzFyFyFyFyFyFyFyFyFyFzFyFyFyFyFyFyGyFyFyFyFyFyGyFyFyFyFyFyFyFyFyFyGyFzFyFyFyFyFyFyFyFyFzFyFyFyFyFyFyFyFyFyFyFyGzFyFyFyFyFyFyFyFyFyFyGyFyFyFyFyFyFyFyFyFyFyFyGyFyFyFyGzFyFyFyFyFyFyFyFyFyGyFyFyFyFzFyFyFyFyFyFyFyFyFzFyFyFyFyFzGyGyFyFyFyFyFyFyFyGyFyFyFyFyFyFyFyFyGyFyFyFyGyFyFyFyGyFyFyFyFyFyGyFyFyFyFyFyFyFzFyFyFyFyFzFyFyFyGzFzGyFyFzFyGyGyFyFyFyFzGyFyFyFyFyFyGyGyGyFzFyGzFyFyFzFyGzFyFyFyFzFyGyFyFyFyFyFyGyGzGyGzGyGyGyFyFzGzGyFyFyGyGyGyFyFyGyFyFyFyGyFyFzGyFyFyFyFzGzGzGzFyFzFyFzFzFyFzFzFyGyGyGyGyFyGyFyGzFyGzGzGyFyFzGyFzGyFzFyGyFzFyFyFzFzFzFyGyFyFyGyGyGyFzGyFyFzGzFyFyGyGzGyFyGyFzGyGyGyFyFyFyGyFzFyFzGyGyGyGyGyGyGzGyGzGzFyGyGyGzGzGyGzGyGzFyFzGyGyFzGyGyGyGzGyFzGzGzGzFzFyGyFzGzGzGzGzGyGyGyFyGyGzGyGyGzGyGyGyFzGzGyGzFyFyFzGzFyFzGyFyGzFzGyFzFyFyFzGzGyFzGzFyGyGzFzGzGyFzFzFzFzGzGyGzFzFzGyGzGzFyGyFzGzFzGyGyGyFyFzFzFzFzGzFyGyGzGyFzFyFzGyGyFyFzFzFzGyGzFzGzGyGzFzFyFyFzGyGyFyFzGzGzFzGyFzGzFzFyFyGzGyFyFzGyGzFzGzFyGzFyGyGyFzFzGyGzGzGzGzFzGzGzGzFzFzGzFzGyGzFzGyGzGzFyGzFyGzGzGyGzFzGyGzGyGzFzFzFyGzGzGzGzGzFyGyGyGzGyFyGzGzGyGzGzGzGyGzGzFzFzGzFzGzGzGzGyFzFzFzGzFyGzGzGzFzGzGzFyGzFzGzGzGzGzGzGzFzGyGzGzFzGzGyFzGzGyGzGzGzGyGzGzGzFzGzFzFzGyGzGzGzGzGzFzGzGyGzGzGzGzGzGzGzGyGyGzFzGzGzFzGzGzGzGzGyGyGyGzGzGzGyGyGzGzGzGzGyGzGyGzGzGyGzGzGzGzGzGzGzGzGzGzGzGzGzG{GzGzGzGzGzHzGzGzGzGzGzGzGzGzGzGzGzGzGzGzGzGzG{GzGzGzGzG{GzGzGzGzGzGzGzGzGzGzGzGzGzGzGzGzGzGzGzGzGzGzGzGzGzGzGzGzGzGzHzGzGzGzGzG{GzGzGzGzGzGzHzGzGzGzGzGzGzGzHzGzGzGzGzGzGzGzGzGzGzGzGzGzGzGzGzGzHzGzGzGzGzGzGzGzGzGzGzGzGzGzHzGzGzGzGzGzGzGzGzGzGzGzG{GzGzGzGzGzGzGzGzGzGzGzGzGzGzGzGzG{G{GzGzHzG{G{HzH{GzGzGzGzGzGzGzG{HzGzG{GzGzG{GzGzHzHzGzG{GzGzHzG{H{GzGzHzH{GzGzGzGzHzHzGzG{GzGzGzGzHzGzGzGzGzGzG{GzGzGzGzGzG{GzGzGzGzGzHzHzHzGzHzH{GzGzHzG{GzGzGzHzGzGzHzGzGzGzGzGzGzGzGzGzGzGzHzG{GzGzG{GzGzG{GzH{GzGzGzGzGzGzHzH{HzGzHzHzHzGzGzGzG{HzGzGzHzHzGzGzGzGzGzH{GzGzGzHzH{GzHzH{G{H{HzHzH{G{GzHzHzGzGzGzHzGzGzH{GzH{HzH{GzG{H{H{HzG{G{H{G{HzG{GzG{HzGzG{HzGzH{H{GzGzGzG{HzHzG{HzGzG{HzHzGzG{G{H{G{H{HzH{GzHzHzHzGzHzG{HzHzG{G{HzHzG{G{H{G{H{G{HzH{H{HzGzG{GzHzG{HzH{HzHzG{H{G{H{HzGzG{GzH{G{H{GzHzGzG{GzG{H{H{G{G{H{GzG{H{H{G{G{HzHzGzHzGzG{G{G{H{HzH{GzGzHzG{H{GzGzHzG{GzH{HzH{G{HzGzG{GzG{G{G{G{G{G{GzH{H{H{GzH{HzHzH{H{H{H{H{H{GzH{HzHzG{HzH{HzG{H{G{H{G{HzHzH{H{G{H{H{HzG{H{H{H{HzH{H{HzH{H{HzHzG{GzHzHzG{HzH{G{HzG{H{G{H{G{H{HzG{H{G{H{H{GzG{HzH{G{HzG{G{G{G{HzH{H{H{H{G{HzH{GzH{HzH{H{H{HzG{H{H{H{H{G{HzH{G{G{HzG{H{H{HzHzHzH{G{G{HzHzH{H{H{HzHzG{H{G{G{H{HzHzG{G{H{H{HzH{G{HzG{HzHzHzH{G{G{G{G{H{H{H{HzH{H{H{GzH{G{H{H{H{HzH{G{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H|H{I{H{I{I{H{I{H{H{H{I{I{H{H|H{H{H{H|H{H{I{H{H{I{I{H{H{I{I{H{H{H|H|H|H{H{I{H{H{H{H|H|H{I{H{I{H{H|H|H{I|H{H{H{H|I{H|H|H|I{H{I{H|H|H{H{H{H{H|H{H{I|H{H{H|I|I{H{I|H{I{H{H{H{H|H{H{H{H{H{I{H{H|I{H|H{I{H{H{H{H{I{H|H{H{H{H{H|H{H|I{H|H|H{H{I|H{H{H{I{H|I{H|H{H{H{I{I{H{H{H{H{H|I{H{I|H{H{I|H{H{I{I{I{H{H{H|I|I|I|I{H|I{H|I{I{H{I{H|H|I|I|H{I{I|H{I{H|I|I{I{H|I|H{I|H{H{I{H{H{H|H{I{I|I{H{I|H|H{I|H{H{I|H{I|H|I{I{H{H|I|H{H{I{I{I{H{H{H{H{I|I|H{H|H{I{H{I|I{H{H{H{H{H{H|H|H|I|H{I|H{H{I|H|I|I{I{H|I{I{I|I{I{H{I{I{I|H|H{H|I{I|I{H{I|H{I|H|H{I|H|I{H|H|H{I|H{I|I{H|I|H{I|I|H{H|I|I{I|H{H|H|H{H{H{I|I|I{I{I|I{H{H{I|I{I|H|H{I|H{I{H|I|H|I|I|I|I{I|H{H|H|I|I|H|I{I|H{I|H|I|H|H|H|I|I|I|H|I|I|I{H|I{I{I|H{H|I|I|H|H|I{I|I|I{I|I{I{I{I|I|I{I|I{H|I|H{I|H{I{H|I|I|I|I|I|I{I{H|H|I|I|I|H{I|I{H{I{I|H|I|I{I|I{H{I|I|I|I{I{H|I|H|I|H|H{I{H{I|I|I|I|I|H|I|I{I|I|H|I|I|I{I|I|I|I{I|I|I|I{I{I{H|I|I|I|I|H|I{I{I|I|I|I|H|H|I|I|I|H|I|I{I{I|I{I{I{H|I|I|H|I|I|I|I|I|I|I|I|I|I{I|I|I|I|I|I|I|I|I|I|I|I|H|I|I|I|I|H|I|I|I|I|H|I{I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|H|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|H|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|J|I|J|J|J|I|J}I|I|I|I|I}I|I|J}I|J|I|I|I|I}J}I|I|J|I}I|J|I}I|I|I|I}I|J}J|I|I|I|I|I}J|I|I|I}I|J|I|I|I|I|I|I|I|I}I}I|I|J|I|I|I|J}I}I|I|J}I|I|J|I}I|I}I|I|I}I|I|I|I|I|I}J|I}I}I|I|I}I}I|I}J|I|J|I|I|I}I|J}J}I|J}I|I|I|J|I|I|I}I|I|I|I|I|J|I|I|I|I|I|J}J|I|J}I|I}I|J|J|I|I|I|I|J}I}I|I|J|I|I|I|I|I|I|I}J|I}I|I}I|I|I}I}J|I|I}I|J|J}J}J|I|J|I|J|I|I|I}I|I}J|I}I|J|J|I|J|J}I|I}I|J|I}J|J|I}I}I|J|I|J}J}J|J}J|I}I|I|J|J|I}J}I}J}J|J}I|I}J|J}J}J|J}I|J|I|I}J}J}J}J|I|I|J}J}J|I|J}J|I}J}I}I}J|I}J}I|J|J}I}I|J|J|I}I}J|I|J}J}I|J|J}I|I|I}J|J|J|I}J|J|I|J|I|I|J|I|I}I|I|I|I|I}I}I|I|I}J}J}I|J}I}I}J}I|J|J}I|J|J|I|I|J}I|I|I}J}I}I}J|I}I}J|J}J|J}J|J}I}J|J}J|J|J}J}I}I}J|J}I|I|I|J}J|I}J|J|J}J}J}J|J}I}J}J}I}J}J}J}J}J}I|I|J}J}J}J}J|J}J|I}I}J}I}I|J}J}J|J}J}I}J}J|I}J}I}J}I|I}I}I}J}I|J}J}J}J}J|J}J|J}J}I}J}J}J}J|J|J|J}J}J}I}J|I}I}J}I}J}J}J|J}J}I}I}J|I}I}J}J}J}J}J}J|I}I|I}J}J|J|I|J}J|J}J|J}I|I}I}J}J|I}I}J}J}I}I}J}J|J}J|J|I|J}J}J}J}J}J}J}I|J}J}J}J}J}J}J}J}J}J}J}I}J}J}J}J}J|J}J}J}J}J}J}I}J}J}J}J}J}J}J}J}J}J}J}J}J}I}J}J}J}J}J}J}J|J}J}J}J}J}J}J}J}I}J}J}J}I}J}J}J}J}I}J}J}J|J}I}J}I}J}J}I}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|I}J}J}J}J}J}J}J}J}J}J}J}J}J}J}I}J}J}J}J|J}J|J}J}I}J}J}J}J}J}J}I}J}J}J}J}I}J}J}J|J}J|J}J}J}J}J}J}J}J}J}J}J}K}J}K}J}K}K~J}K}J}J}K}J}K}J}J}K}J}J}J}J}J}J}K}J~J~J}J}K}J}J~J~J}J}J}J}J}J}J~K}J}J~J~J}J}J}J}J}J~J}J}K}J}J}J}J}J}J}K}J~J}J}J}J}J}J}K}J}J}K}J~J}K}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~K}J}K}J}J}K}J}J~J}J}J}J}J}J}J}J}J}J}K}J}J~J}J}J}J}J}J}J}J}J}K}J~J}J}J}J}J}J}J}J}J}J}J}J}J}J}J}J}J}J}K}K}J~J}K}J~K}J}J}J}K}K~K}J~J~J}K}K~K~J}K}J}K}K}J~K~K~J}K~J}J~J}J}K}J~J~J~K}J}J}J~K~K~K~J~K}K}J~J}J~J~K}K}K}K~K}J}K~J}K~J}J}J}J~K}J~J}J}K~J~J}J~J~J~J}K}J~J}K}J~J}K}K~J}K~K}J}J~J~K~J}J~J}J}K~K~K}K~K}K}K}K~K}J~J~J}J~K}J}K}K}J}K}J}J}K}J~K}J~K}J}J~J~J}J}J}K}J}J}J}J}J}J~J~J}J}J~J~K~K~J~K~J}K}K}K~K}J~J}K}J}K~J}K~J}J~J~K}K}K~K}K}J}K}K~K~K~K~K~K}K~K~K~J~J}K~K~K~K~J~K}K~J}J~J}K}K~K}K~K}J}J}J}K~J}J}K~K~K~K}K}J~J~K}K~K}K~K~K~K~K~K~K~J~J}K}K~J}J}J~K~J~J~K~K}J~J~J~J}J}K}J}K~K}K}K~J~K~J}K}J}K~K~K}K~K~K~K~K}K~J~K}K~K~J~K~J~K}K}J~J~J~K~K~J~K~J}J~J~K~K}J~K~K~J}K}J~K~J}J}J~K~K}K}K~K~K}K}J}K~K~K~K~J~K}K}K~J~K~K}K~K~K~J~K}J~J~K~K~K~K~K~K~K~K~J~K~K~K~K}K~K~K~K~K~K~K~J~K~K~K~K~K~K~J~K~K~J~K}K~K~K~K~K~K~K~K~K~K~K}K~K~K~K~K~K~K~K~K}K~K~K~J~K~K~K}K~K~K}K~K~K~K~K~K~J~K~K~K~K~K~K~K~K~J}K}K~K}K~K~K~K~K}J~K~K~K~K~K~K~K~K~K~K~K~K~K~K~K~K~K~K~K~J~K~J}K~K~K~K~K~K~K}K~K~J~K}K~J~K}K~K~K~K~K~K~K~K~K~K~K~K~K~K~K~K~K~J~K~K~J~K~J~K}K~K~KK~K~K~K~KK~K~K~K~KK~K~L~KKKK~K~K~K~K~K~K~K~KK~K~K~KK~K~K~K~L~KKK~KK~K~KK~K~K~K~K~L~K~K~L~K~K~KK~L~K~K~K~K~KK~K~KK~K~KK~K~KKL~K~K~L~K~K~K~LK~KKK~K~LK~K~K~LK~KK~K~K~K~K~K~K~K~K~K~K~K~KL~K~LK~K~K~K~KK~K~L~K~KK~K~K~K~K~K~K~K~K~KK~K~KK~KKL~K~L~K~K~KK~K~KKK~K~K~L~K~K~K~K~LK~K~K~KL~K~L~KK~LL~L~K~K~LK~KL~LK~LKKKK~L~K~L~KL~K~K~K~KL~L~KKLK~K~K~KL~L~L~LKKL~K~KKLL~K~KL~LLK~LK~LLK~L~L~L~K~L~K~KL~K~L~K~KKK~K~KL~LK~K~KKK~K~LL~L~KK~L~L~L~K~LLK~KK~LLK~L~KLLK~K~L~K~LK~LL~LLL~L~K~L~K~LKK~LKL~LKL~K~L~K~L~L~L~LKK~L~KK~LK~K~L~L~KLLLLLL~KL~LL~KK~LLL~K~L~LLLLLLLL~KKLKK~KLL~LKLLKK~K~K~L~K~K~KKKLLL~LL~KKK~KK~KK~LLL~K~LLLLKKK~KK~K~K~LKLL~KKKL~KLL~K~LLK~KK~LKL~L~KLL~LLK~L~LL~LLLLK~KL~LL~KL~LKKK~LLL~KK~KLKK~KL~K~K~LLLKKLLLKKKL~KL~LKL~KL~LLLLLLLLLLL~LLLLLKLLLKLLLLLKLLLLLKLLLKK~LKLKLLKLLLLLLLLLLLLLLLLLLLLLLLL~LLLLL~LLL~LLL~LKLLLLL~LL~LLLKLLLKLLLLLLLLLLL~LL~LLKLLL~LLLLLLL~LLLLLLLL~LLLLLLLLLLLLLLLLL~LLLLLLLLLLLMMLMLLLLLLLMLLLLMLLLMLLLLLLMMMLLLLLLLLLLLLLLLMLLLLLLLMLLLMLMLLLLLLLLLMLLLLLMLLLLLLLMLLLLLLLLLLLMLLMLMMLLLLLLLLMLLLLLLLLLLLLLLLMLLLLLLLLLLMLMMLMLLLLLLLLMLLLMMMLLLLLMLLMLLLLMMLLLLLMMMMMLLMLMMLLMMLLMLLMLLLMLLLLLLLLLLMLLMLLLMLLLLLLMLLLMLLMLLMLLLLMLLMLLMLMMLMLMMLLLLLLLLLLLLLMMMMLLMLLLLMMLMLLLMLLLMMLMLLMMMLLLMMMMMLLMLMMMMMMMMLMMMMLLMMMLMMLMMLMMMMMMMLMMLMMMLMMMLMLMMMLMMLLLMMMLMLMMMLMMMLLMLMLMLLLMLLLMMLLMLMLLMMMMMMMLMLLLMMLLMMLMLMMLLMLLMLLMLLMLMLMLMMMMMMLMMMMMMMMMMMMMLMMMMLMMLMMMMMMMMMMMLMMMMMMMMMMMLLMMMMMMMMMLMMMMMMMMMMMMLMMMMMMMMMMMMLMMMMMLMMMMMMMMMMLMMMMMMMMMMMMMLMMMMMLMMMMMMMMLMMMMMLMMMMMMMMMMMMMMLMMMMNMMMMMMMMMMMMNNMMMMNMMMMMMMMMMMMMMMMMMMNMMNMMMMMMMMMNMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMNMMMMMMMMMMNMMMMMMMMMMMMMMMMNMMMMNMMMMMMMMMMMMMMMMMMMMMMMNMNNNNMMMMMMMNMMNMNMMMMNMMMNMNMMNNMMNMNMNMNNNMMMNMNMMNNNMNMNMMNNMMNMMMNMMNMNMMMNNMNMNMMNMNNNMMMMMNNMMMMMMNMMMMMMNMNMNMMMNMMMMMNNMNNNMNMMNMNMMMNMMMMMMMMMMNNNNNMNNNNNMNNNNMNNNNNMNNNNNMNMNMNNNNNNNNNNMMNNNNMMMMNNMNNNMMMMMMNMNMNMMMNNMNNNMMNNNNNMNNNNMMNMMNNNMMMMMNNMMMNNMMNNNMNNNNNNMNNMMMMNNNMMNNMNNNNMNNNMNNNNMNNNNMNNNNNNNNNNNNNMNNNNNNNNNNMMNNNNNNNNMNNMNNNMNNNNNNNNNNNNNNNNNMNNNNNNNNNNNNNMNMNMNMNMNMMNNMNMNNNNNNNNNNNMNNNNNNNNNNNNNNNNNNNMNNNNNNMNMNMMNNNNMMNNMNNNNONNNNNNNNNNNNNNNNNNNNONNNNNONNNNNNNNNNONNNNNONNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNONNNNONNNNNNNNNNOONNNNNNNNNNONNNNNNNNNNNNNNNNNONNONNNNNOOONNNNONNNNNNNNNNNNNONNNNONNNONNOOONNNOONNNOONONNNNOOONONONNNNNNNNNNNNNONNNNNNNNNOONNONNONNONONNNNOOONNNNONNOOOONOONNONNONNNONNNNONNNNONOONNNNNONOOOONNOONOONOOOOOOOONOONNNOOOOONNONOOONNOOOONNNNOONNOOONONNOOONNOONNOONNNNNNONOOOONNOOOOONNOONOOOOOONOONNONONOOONOOOOOOOONONNNOOONNOONNOONNOOONNONNONOONOOONNNONOONONOOOONONOOOOOONOOOOOOOOOOONOOOOOOOOOOONOOONOOOOOONOOOONOOOOOOOOONOOOOOOOONOONOOONOOOOONOONNOOOOONOOONOONNNOOOOOOOONOOOOOOOOOOOONOOOOOOOOOOOOOOOOOOPOOOOOPQPOOOPOOOPOOOOOOOOOOOPOOOOOOOOOOOPOPOOOOOOOOOOOOOOPOPOOOOOOOOOOOOOOOOOOOOOOOPOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPOOOOOOOOOOOOOOOOOOOPOOOPPPPPPQTUSOOOOPPOOPOPPOOOOPOOOPOOPOOPPOPOPPOOOPOPOPPOPOPOOPOPPPOPPOOOPOOPPPOOOOOPOOOPPPOOOPOOOOOOOPOOOOOOPPOPOOOOOPOPOOOOPPOOOOOOOPOOOPOOPPPOOOOPPPPOPOPOOPPPRTVXZYQPPPPPOPOOPOOPPPPOOOPPPPPOOPOOOPPPOOPOPOPOPOPOOPOPPOOPOPOPOOPPOPPPOPOPPOPPPOOOOPPPPPOPPPOPOPPOPOOOOPPOPPPPOOPOPOOPPPOOPOOPOPPOOOPPPPPPPPOOPOPOPOPRTVXZ\^_TPPPPPPPPOPOPPPPPPOPOPPPPPPPPPPPPPOOPPPPPPPPOPPPOPOPOPPPPPPPPPOPPPPPPOPPPPPPPOPPPPPPOPOOPOOPPPPPPPPPPPPPPPPPPPPPOOPOPOPPPPPPPPPPPPPPPPPPPPPPPPPRTVXZ\^`beXPPPPPPPPPPPPPPPQPPPPPPPPPPPPPPPPPPPPPPPPPPPPQPPPPPQPPPPPPPPPPPPPPPQPPPPPPPPPPPPPPPPPPPPPQPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPQQQPPPPPPPRTVXZ\^acefi]PPPPPQPQPPQPPPPPPPPQPPPPPPPPQPPPPPPPPPPPQPPPPPPPPQPQPPPPPPPPPPPPPQQPPPPPPQPPQPQQPPPQQPPPQQPQPPPQQPQPPPPPQQPPPPPPQPPPPPPQPPPPQQPQPPQPPQQQPPRTWX[\^abegikmcQPQPPQPPQPPQQQQQPPQPQPQPPPQQQQPQPPPPPPQPQPQQPPPPPPPPQQQPPQPQQPQPQPPPQQQQPPQPPQQQQPQQQQQPPQQPQPPQPPQPQPPPQPQPQQPQQQQQQQQPPQQPQPQQQPQQPQQQRTWXZ\_acegikmordPQQQQQQPQQQQQQQQQQQQQQQQPQQQPQQQQQQPQQPQQQPPQPQPQQQPQPQQQQPQPQPPPPQQQQQQQQQQPPPQPQPPQQQQQPQQQQQQQPPPPQQQQQQQQQQQQQQPPQQQQQQQQQQQQQQQQQSTWX[]_acegiknorsvfQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQRQQQQQRSTWX[]_acehiknortvxzgQQQQRRQRQRQQRRQQQQQRQRQQRQQQQQRQQQQQQQQQRQQRQQQQQRQQQRQQQQQQRQQQQRQQRRQQRQQQQRQQQQQQQQRQQRQQQQQQRRQQQQQQRRRRQRQRQQQQRRQQQRQQRQQQRRSTWX[]_acegilnortvxz|bRRQRRRRQRQRQRQQRRQRRQƅT˅TԅUUTTSRRRބRԅRԅQЄQŅQ„RQRRQRRQQRQQQQRQQRQQQRQRRRQQRQRRRQQQRRRQQQRQRQQQRRRRQQRRRRRQRRQRQQQRRRRRRRRRQRQRQQQRQQRRQQRRSTWX[]_acehilnortvx{|]QQRRQRRRQRRRRRS˅WڅZ\^^\[YYWVUTRRRRRRRRQRQօQĄRQQRQRRRRQRRRRRRRRQRRRQRRRRQRRRRRRQRRRQRRQQQQRRRRRRRRRQRRRRRRQQRQQRRRRRRRRRRRRRRRRRRRRSTWY[]_acehilnprtvx{|򁸐WRRRRRRRRRRŅVۅ\becba_^][ZYXVUTSRRRRRRRRQRRRRRӅRRRRRRRRRRRRRRRQRRRRRRQRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRQRRRRRRRRRRRQRRRRRRRRSSTWY[]_adehilnprtvx{|~SRSRRSSąV߅`gihfedca`_]\[ZXWVTSSRRRSRRRRRRRSRRRS؅RSSRRRRRRRSRSRRRRRRRSSRSSRRRRRRSRSRRSSRRRRRRRRRRRRSSRRRRRSSRRRRRRRRRRRSRRRRRRSSTWY[]_adehjlnprtvy{}rRRRSԇ^inlkjigedcb`_^\[ZYWVUSRSSSRRRSRRRSSRSSRSRS̅SRSRSRRRRRRSSSRSRSRRRRSRRSSSRRSSSRRSRSSRRSSRSSRRRSRRRRRRRSSRSRRRSRSSSSRRRSSUWY[]_adehjlnpruvy{|bUۈcpponmljhhfedba`_][ZYXWUTSRSSSSSSRSSSRSRRSSSRSSӆRSRSRRRRSSSRSSRSRSRSSSSSRRRRSSRSRRSSRRRRSSRSSSSRRSSSSSRSRSRRSSSSRSSSSSSSUWY[]_adehjlnpruwy{}ttrqpomlkihgedcb`^^\[ZYWVUTSSSSSSSSSSSSSSSSSSSSSSS҆SSSSSSSSSSSSSSSSRSSSRSSSSSSSSSSSSSSSSSSRRRSSRRRSSSSRSSSSSSSSSSSSSSSSSUWY[]`bdfhjlnqruwy{}ȋusrqonlkjhhfecba__]\[YXVVTSSTSSSSSTSTSSSSSTSSSSSSSSΆSSSSSSSTSSSSSSTSSSSSSSSSSTSSSSSSSSSSTSSSSSSSSSSSSSSSSSTSSSSSSSSSSSSWY[]`bdehjlnqruwy{}|trqpnmkjihgedba`_]\[YXWVTTTTSSSSTTTSSSSTSSSTTSSTTSSSSSSSSSTSSSSSTSSSSTSSSTTSTTSSSTSTTSTTSTTSSTSSSSSSSTSTTSTTTSTSSSTSSZ[]`adfhjlnqruwy{}ۘtsqponlkihgfeca`_^]\ZYXVUSTTTTSTTTTSTSTSSSSSSTSTSTTTT؇TTSSTSSSSSTTTSSTTSSTTSSSSSTSTSTTTTSTTTTTTSSSTTTTTTSSSTTSSTTTSSST[^`bdfhjlnqruwy{~srqonmljihfedba`^]\[YXWVTTTTTTSTTTTTSSTTTTTTTTTTTTTSTSTTTTTTTTTTTTTSTTTSTTTTTTTTTTTTTTTTTTSSSTTTTTTTSSTTTTTSSTSTTTTT^`bdfhjlnqruwy{~trqpomlkihgedca`_^][ZYWVUTTTTTUTTTTTTTTTUTTTTTTTTTTTTTT͇TUTTTTTUTTTTTTTTTTTTUUUTTTTUTTTTUTTTTTTUTTTTTTUTTTTTUTTTTTTTT`bdfhjmnqruwy{~srqonmljihfecba`^][[YXVUTUUUTUUUTTUTUTTTTUTTUTTUUTUTTTT߇UTUUTTTUUTUTUUTTTTUUTTUTTTTTTTUTUTUTTTUUTTTUTUTTUTTUTTTUTUUUbdghkmnqsuwy{~ݠtrqpnmlkihgedca`_^\[YXWVTTUUUUTTUTUTTTUUUUTTUTUUTTUUTUTUUUUUUUUTUUTUUUUUUUTTTUTUTUTUUUTUUTUUTTUTUUTUUUUUUTUUUUUTUTUdghkmoqsuwy{~sqpomlkihgfeca`_^][ZYXVUUUUTTUUTUUUUUUUUUUTUUUUUUUUUUUUUUUUUUUTTUUUUUUUUUUUUTTUUTUUUUUTTTUTUUUUTUTUUUUUTUTUUUUUUUUghkmoqtuwz{~Ϝsrqonmkjihfedba`^]\[YXWVUUUUUUUUUUUUUVUUUUUUUUUUUUUUUUUUUUĈUUUUUVUUUUUUUUUUUUUUUUUUUUUUUUVUUUUUUUUUUUUUUUUUUUUUUUUUhkmoqtuwz|~wsqpnmlkihgeecaa_^\[ZXWVUUVUUUUUVUUVUUVUUVUVUVUUVUUUUVUUUUUÈVVUUUVUUVVUVUUUUUVVUVVUUUVUUUUVUUVUUVVVVVUUVUUUUVUVUUVVkmoqsuxz|~srponmkjigfecba`^]\[YXWUVVUVUVVVUVUVUVVUVUUVVVUVUUVUVVVVUVUÈVVUVUVUUUVVVVUVVVVUVVVUVVUVUVUUUVVUUVUVVUVVUUUVUUUUVUUmoqtuxz{~trqoomlkihfedba`_^\[YXWVVVUVUVVVUVVUVUVVVUVVUUUVUVVVVUVVUUVVVVVVVUVUUVVVVVUVUVVVVVVVVVUVUVVVUVVUVVVUUVVVVVVVVUVVUoqtuxz|~{srponlkjhgfdcba_^][ZYXVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVqtuxz|~trqonmkjigfedba`^^\[YXWVVWVVWWWWWVVVVVVVVVVVWVVVWVVVVVVVVVVVVVVVVWVVVVVWVVVWVVVVWWVVVVVVWWVVVVVVVVVWWVVVWVVVVVVVtuxz|~ޯtsqpnmljjhgfdcb`_^][ZXXVVWWVVWVVVWVWVVVWVVVVWVVWVWVVVVWWVWVVWډVWVWWWVWVWVVVWVWWWVVWWVVWWVVVVVWWVWWVVVWWWWVVWWVWWVvxz|~usrponmkjhgfecb``^]\ZYXWVWWVWWVVWVWWWWWVVWWVWWWVWWWVVWWVWWWWWVΉWWWWWWWVWWWWWWWWWWWWVVVWVWWWWVWVWWVWVWWVVWWVVWWWVWxz}~trqpnmlkihgedca`_^\[ZXWVWWWVWVWWWWWWWWWWWWVWWWVWWWWWWWWWVWWWWWŠWWWWWWVWWWWVWWWWWWVWWWWWWWWWWWWWWVWWWWWWWWVWWWWWWz}~tsqqonmkjhgfdcba`^][ZYXWWWXWWWWWWWWXWWXWWWXWWWXWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWXWXWWWWWWWWXWWWWWWWWW}~۳usrqonmkkihfedba`^^\[ZXWWXWWWWWWXWWXWXWXWWXWWXWWWWWXXWWWXXWXWWWՋXWWWXXWWWWXXWWWWWWWWWXWWWXWXWWWWWWXWXXXWXXWWWWWW~utsqpnnljjhgedcba_]][ZYWXWXWWWWXWWWWXXXWWXXXXWWXXWWXWWWWXWXXXWWXÊXWXWWWWWWXWWWWWXWXXWXXXXWXWXXWXXWWWXWXXWXWXXXXX{usqqonmkjigfedba`^]\[YXXXXWXXXXXXXWWXXXXXXWXXWXXXXXWXXXXXXWXXXXWWXXXXWXXXXXXWWXXXXXXXXXXXXXWXXWWXXXXWXWXXXXXXWutrqpnmljihgedca`_^\[ZXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXʋXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXutsqpommkjigfdcba_^]\[YXXXXXXXXXXXXXYXXYXXXYYXXXXYXXXXXXXXXXXXXXXXXXXYYXXXXXXYYYYXXXYXXXYXXXXXXXYXXXXXYYXXXXYX¢vtsrqpnmljiggecba`^^\[YYXXYXXXXXYXYXYYXXXYXXXXXYXYXXXXXXXXYXYYYXYϋYYXXXXXXXYXXYXXYYXXXXXXYYYYXYXYXYYXXYYXYXYYYYаwutsqpomlkjhffdcb`_^][ZYYXYXXYYYYYYYXYXXYYXYYXXYYYYYXYYXXYXYYYXYYYYYYYYYYYYYYYYYXYYYXXYYYYXXYYYYYYYYYXYYYYYYYYٹwvtsrqonmkjigfecba`^]\[YYYYYYYYYYYYYYYYYYYXYYYXYYYYYXYYYYYYYYYYYYY͌YYYYXYYYYYYYYYYYYYYXYYYYYYYYYYYYYYXYYYXXXYYY߾wvutsqpnnljihgedca`_]][ZYZYYYYYYYYYYYYYYZYYYYYYYYZYYYYYZYYYYYYYYYYYYYYYYYYYYYZYYYYYYYYYYYZYYYYYYYYYYYYYYYYYYYYxwvtsqpomlkjhgfecb`_^]\ZYZYYYYYZYYYYYZYZZZYZYYYYZZZYYYYZZYZYYYZZZZZnjYYYZZYYYYZYYZYYZZYYZYYYYYZYYYYYYYZYZYYYYYYYywvutrppnmkjiggedca`_]\[ZYZZZYZYYYYYZYYZYZZZYZYYZYZZYYYZZYYYYYYYYYZZYZYZYZYYYYYYZZZZZZYYZZZZYZYYZZYYYYZZYZYZYYyxwussqpomljjhgfdcb`_]][ZZZZZZZZZZYZYYZZZZZZZZZZYZYYYZZYZYZZYZYYZZZZZZYYZZZZZZZYZZZZZYZZZZZZYZZZZZZZYYZZZZZZZYzxwvtsrqonmkjigfecba`^]\ZZZZZZZZZZZZZZZZZZZZZZZZZYZZZZZZZZZZZZZZZZZZэZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZzywwusrqpnmljjhfedca`_]\[ZZ[[ZZZ[ZZ[ZZZ[Z[ZZZZZ[ZZZ[ZZZZZZZZZ[[ZZZZZZ[[ZZ[ZZZ[Z[ZZ[ZZZZZ[Z[[ZZ[[Z[ZZZZZ[Z[[Z[Z{yxwutsrponlkjigfdcb`_^]\Z[ZZZZZ[Z[ZZ[ZZ[[ZZZ[[Z[Z[ZZZZ[[[[Z[Z[Z[[Z[ZZZ[[[[ZZZ[[ZZ[Z[[[[Z[[ZZ[[ZZZ[[ZZ[[ZZZZZ[{zxwvttrqonmkjigfedca`^]\[Z[ZZ[[[ZZZ[[[[[[[[ZZ[[[[Z[ZZ[[[Z[[Z[[[[Z[[[ώ[Z[[[[Z[[Z[Z[Z[[Z[[[ZZZ[[[[Z[[[[[[Z[[[[Z[ּ|zywwutrqpomljihgfdcb`_]][[[[Z[[Z[[[[[Z[[[[[[ZZ[[Z[[[[[[[[[[[[ZZ[[[Z[[[[[Z[[[Z[[[[[[[[[[[[[[[[[[[Z[[Z[[[[[Z[[[̲|{zxwvtsrponmljigfecba`^]\[[[[[\\[[[[\[[[[[[[[[[[\[[[[[[[[[[[[[[[[[[[[[[[[[[[[Ž[[[[[[[[[[[[\[[[[[[[[[[Ž[\[[[[[[[¨}|zywvusrqpnmljihgfdcb`_]\[[\\[[[[[[[[\[\[[[\[[[[[[\[\\[[[\[[[[[[[[\[\Î[[Ž[[[\\\[Ž[[Ž[[Ž\[[Ž\[[[[Ž\[[[\[[\Ž[Ž[Ž\[[[Ž\[[\[}|{yxwutsqpomlkiigfdcb``^\[\\\\\[\[\[[\[\[[[[\[[\[\[[\\[\[\[\[\\\[[[[[Ϗ[\\\Ž[\[\\\[Ž[Ž[Ž[Ž\Ž[[\[Ž[[Ž[[[Ž\Ž[\\\\[Ž\\[\[\\Ž\Ž[~}{zxwvusrqpnmkjihfecca`_]\\\\\[\\[\[\[\\\\[\\\\\[\\[\[\[\[\[\\[\[\\[\܏\\[\\\\Ž\[[\\\\[[\[\\\\[Ž\Ž\\\Ž[[[\Ž\\[\\Ž\\\\~}{zyxvutsqpomlkihgfdcb`_^]\\\\\\\\\\\\\\\\\[\\\\\[\\\\\\\\[\\\\\\\\\\\\[\\\\\[\\\\\\\\\\Ž\\\\[\\\\\\Ž\[\\\\\Ž\\\}|{yxwvtsrqonlkjigfecba`^]\\\\\]\\\\\\\]\\\\\\\\\\\\\\]\\\\\\\\\]\\\\\Ï\\\\Ï\\\\Ï\\\Ï\\\Ï\\\\\]Ð]\\\\\]\\\\\\\Ï\\\\]ҹ~}|zyxvusrqonmljihfedca`_^\]\\]]\\\]\]]]]]\\\\\\]]\]]\\\\\\\\\\]\\\\\\]Ï]]\]Ï\Ï\\\Ï]\\Ï]Ï\Ï]\]Ð\\Ð\]\\\\Ï]Ï\Ï\Ï\\Ï]\Ð\\Ï\\]\\}|zyxwutsrpomlkjigedcba_^]]\\\]]]]]\\]\\]\]\]]\]]]\\\]]]]]]]]\\]]]\]]Ɛ]Ï\Ð\Ð]Ð]\Ð\]\\]Ï\\Ï\\]]]]Ð\Ï]\Ð\Ï]\Ð\Ð\Ï]]]Ï]Ï\]]]\Ï]Ï]Ð]~|{zywvusrppnmljihfedba__]]]]\]]]\\]\]]]]]]]]]]]]]]]]\]]]\\]]\]]\]\]]͐\Ð]Ï\Ð]]\Ð]Ï\Ð]Ð]Ð]Ð]]Ð\Ï\Ð]]Ð]]]Ï]Ð\Ï]Ï]]\Ð]]Ï]Ï\]Ð]Ï]Ð\Ï\Ï]\\]~}|zyxvutsqpnmlkihgedcb`_^]]]]]]]]]]]]]\]]]]]]]]]]]]]]]]]]]]]]]]]]]]]Ӑ\Ð]Ð]Ð]Ð\]Ð]Ï]Ï]Ð]Ð]]Ð]Ð]Ð]Ï]Ð]Ð]Ð]Ð]Ð\Ï]Ð]Ð]Ð]Ð]Ð]Ï]Ð]Ï]Ð]Ð]Ð]Ð]]]Ð]Ð]]ѹ~}{yxwvtsrqonlkjhgfecca_^]^]]]]]]]]]^]]^]^]]]]]]]]]]]]]]]]]]]]]]]^]^Ց]Đ]Ñ]Ð]Ð]Ð]Ñ^Đ]Ð]Ð]Ð]Ð]Ð]Ð]Ð]Ð]Ð]Ð]Ð^Ð]Ð]Ð]Ð]Ð]Ð]Ð]Đ^Ð]Ñ]Ð]Ð]Ð]Ð]Ð]Ð]Ð]Ð]Ð]Ð]~|{zywvusrqpomljihfedba`_]]]^^]]]]^]^]]^^]]]]^^]]]]]]^]]]]]]]]]]]^]]ؑ]Đ]đ]Ð^đ^Ð^đ]Đ^Đ^đ]Ð]Ð^Ñ]Đ]Ð]Ð]Ð^Ñ]Đ]Ð^Ð]Đ]đ]Ð^Ð]Đ]Đ]Ð]Ð]Ð^Ð]Ð^Ð]Ð]đ]Ñ]Ð]Ð^Ð]~}|zyxvutrrpomlkjigeecb`_^^]]^]^^]]]]^^]^]]^^]]]^]^^^]^^^]^]^^]]^^]]ۑ^đ]Ñ^đ]Ñ^Ð^đ^Đ^Ð]đ]Đ]Ñ^đ]Ð^đ^Đ^đ^đ]Đ^Ñ]Đ^Ñ^Ð]Đ]Ð]Ð^Ð]Ð^đ]Đ^Đ]Ð]Đ]Ð]Ð^Đ^Ð]Đ]Đ^׿~~|{zywvusrqonlljigfedba`_^]^^^]^]^^^^^^^^^]]^^]^^]^]^]^]^^]^]]^]]^^ݐ]đ^đ]Ñ]Ð]Ñ]Đ^đ^Ñ^Đ^Đ^Ð]đ^Ñ]Đ]Ñ^Ð^Ð^Đ^đ^đ^Ð]đ^đ^Đ^Ñ^đ]đ^Đ^Ð]Ð]đ^đ]Ñ^Ñ^đ^đ^đ^Đ^~}|zyxvutrqpomlkihgedcb`_^^^^^^^^^^^^^^^^^^^^^^^^^^^]^^^^^]^^^^^]]^ܑ^đ^đ^đ]Ñ^đ^đ^Ñ^đ^đ]đ^Đ^đ^Đ^đ^Ñ^Ñ]đ^đ^đ]Ñ^đ^đ^Đ^đ^Ñ^Đ^đ^đ^đ^Ñ^đ^đ^đ^đ^đ^đ^đ^đ]}|{yxwutsrponlkjhgfecba_^^^^^^^^^^^^^^^^^_^^^^^^^^_^^^^_^^^^^^^^_^ܑ_ő^đ^đ^đ^đ^đ^đ^Ē^đ^đ_đ^đ^ő^đ^đ^Ē^đ^ő^đ_đ^ő^đ^đ^đ^đ^đ^đ^đ^đ_đ^đ^đ^đ^đ^Ē_đ^Ē^ő^ŭ~}{zywvutrqonmkjihfedba`__^_^^_^^^^^__^_^^_^^^^_^__^^^^^^^^^^^^^^^ّ^Ē^Ē_đ^ő^ő^Ē^Ē^đ^ő^đ^đ^đ^đ^đ_đ^đ^Ē^ő^đ_Ē^Œ^Œ^Ē_Ē^đ_Œ^đ_Ē_ő^đ^Ē^đ_ő^đ^ő^Œ^đ^ő_}{zyxwvtsqpnnlkihgfdca`__^_^__^^^^_^^_^^^_^_^_^__^____^_^^^^^_^__ב_Ē_ő_ő^Œ^đ^Œ_Œ^Ē^đ^Œ_đ^đ_đ_Ē^ő_ő_Ē_Ē^ő^ő^ő_Œ_ő_Œ_đ^đ_đ^Ē^ő^ő^ő^Œ^đ^đ_đ^Œ_Ē_đ^Һ~|{yxwvusrponlkjhgfddba`__^_^^_^____^___^__^_^_^_^^^^_^______^^__Ӓ_Œ^Œ^đ^đ_ő_đ^Œ^Œ^Ē^Œ_Œ_Ē_Ē_ő_Ē^Œ_Ē^Œ_đ^Œ^ő_ő^Ē_Ē^đ^Œ_Œ_Œ^Ē_ő^Œ^Œ^Œ_Œ_Œ_Ē^Œ_Ē^~}|zyxvutrqpnmlkihfedcb`__^_____________^^_^___________^____^__^_͒_ő_Œ^Œ_Œ_Œ_ő_Ē_Œ^Œ_Œ_đ_Œ^Œ_Œ_Œ_ő_Œ_Œ_Œ^Œ_ő^ő^Œ_Œ^ő^Œ_Œ_Œ_Œ_Œ^Ē_ő_Œ_Ē^Œ_Œ_Œ_Ē^~}|{yxwutsrponlkjhgfdcba`___________________________________`____ǒ_Œ_œ_Œ`Œ_ƒ_Œ`Œ_Œ_Œ_œ_Œ_Œ_Œ_Œ_Œ_Œ_Œ_Œ_Œ_Œ_Œ_ƒ_Œ_Œ_Œ_Œ_œ_Œ_Œ_Œ_Œ_Œ_Œ_Œ_Œ_Œ_Œ`Œ_~|{zywvusrqonmkjihfedca``__`________``________________``________ƒ_Œ_ƒ_Œ_œ_Œ_ƒ_Œ_Œ_Œ`Œ`Œ_Ɠ_œ_œ`œ_Œ_ƒ_Œ_Œ_Œ_Œ`œ_ƒ_Œ`œ`œ_ƒ_ƒ_Œ_Œ_ƒ_Œ_Œ_œ_Œ_Œ_Œ_Œ_~}{zyxwutrrpomlkjhgfdcaa_```___`_`__```_`_`__``__`_`_`__`_`___``œ_œ`Œ_Œ`œ_œ_Œ`Ɠ_Œ`ƒ`ƒ`Ɠ_ƒ_œ_œ_Œ_ƒ`œ`ƒ`ƒ_ƒ`Ɠ_Œ_Œ_Œ`ƒ_ƒ_Œ_œ_Œ_ƒ_ƒ`ƒ_Ɠ`œ_œ`œ_Œ_Ɠ_~~|{yxwvusrqonlkjihfedba```__````____``_```______`_`_`___``_```_œ_ƒ`Ɠ`Œ`œ`œ`Ɠ_ƒ`Ɠ`ƒ`Ɠ`Œ_Œ_ƒ`œ_ƒ_Ɠ`ƒ`œ`œ_ƒ_Ɠ_Ɠ_Ɠ_œ`œ`œ_œ_Ɠ_ƒ`Œ`œ_Ɠ_ƒ`Ɠ`œ`Ɠ_œ`œ`~|{zyxvutrqpnmlkiggedca``_```_```````_`````````_`````````````_ݓ`ƒ_Ɠ`Ɠ_Ɠ`Ɠ_Ɠ`œ_Ɠ_ƒ_ƒ_ƒ`ƒ`Ɠ_Ɠ`Ɠ_œ`Ɠ`Ɠ`œ`Ɠ`Ɠ`Ɠ`Ɠ`Ɠ_Ɠ`Ɠ`ƒ_ƒ`Ɠ`Ɠ`œ`Ɠ`Ɠ`Ɠ`œ`Ɠ`Ɠ`Ɠ`Ɠ`~}|{yxwutsqponlkjhgedcba````````````_`````````````````````````ѓ`Ɠ`Ɠ`Ɠ`Ɠ`ƒ`Ɠ_Ɠ`Ɠ`Ɠ`Ɠ_Ɠ`Ɠ`Ɠ`Ɠ`Ɠ`Ɠ`Ɠ`Ɠ`Ɠ`Ɠ`Ɠ`Ɠ`Ɠ`Ɠ`Ɠ`Ɠ`Ɠ`ƒ`Ɠ`œ`Ɠ`Ɠ`œ`œ`Ɠ`Ɠ`Ɠ`Ɠ`Ɠ`~|{zxwvusrqonmkjigfedbbaa````a````````````a``a```````````````Ǔ`Ɠ`Ǔ`Ɠ`Ɠ`Ɠ`Ɠ`Ǔ`Ɠ`Ɠ`Ɣ`Ɠ`Ɠ`Ǔ`ƓaƓ`Ɠ`Ɠ`Ɠ`Ɣ`ƔaƓ`Ɠ`Ɠ`Ɠ`Ɠ`Ɠ`Ɠ`Ǔ`ƓaƓ`Ɣ`Ɠ`Ɠ`Ɠ`Ǔ`Ɠ`Ɠ`Ǔ`Ɠa~}{zyxvutrqpnmljjhgedca`a``````a```a```a````a``a```aa````````ǔ`Ɣ`ǔ`Ǔ`Ɠ`ǔ`Ɣ`ƓaƓ`Ɣ`ƓaƔ`Ǔ`ǓaƔaƓ`Ɠ`Ɠaǔ`ǔ`ǓaƓ`ǔ`ƔaƔaƓ`Ɣ`Ɠ`Ɣ`Ǔ`ǔ`Ǔ`Ɠ`ƓaƔ`Ɠ`Ǔ`Ɣ`ǔ`Ɣ`~~|{yxwvusqqommkjigfdcbaaaa````aa``a````aaaa``a```aa``aaa`a`aƓaǔ`ǔaƔaƔaǔaǓaǓ`Ɣ`ƔaƓ`ƔaƓ`ǔ`Ɣ`Ǔ`Ǔ`Ɠ`ƓaƓaƓ`Ǔ`ǔaƓ`Ɣ`Ɣ`ƔaƔaǓaǓ`ǔ`ǔaǔaƔaƔ`ǔaƔaǓ`ǔ`Ɠ`~}{zyxvtsrqpnmljihgedca`a```aaa`aa````a`````aaaaa```````aaaГ`ƔaƓaǓaǓaǔ`ǔ`Ǔ`Ɣ`Ɣ`Ǔ`Ɠ`Ǔaǔ`ǔaǓaǔ`Ǔ`ǔ`ǓaƓ`ǔaǓaǔ`ǓaƓaƔ`Ǔ`ǔ`ǔaƔ`ǔaǓaƔ`ǔaǔaƔaǓaǓ`ǓaǓa~}|{ywwutsqpnnlkihgfdcaaaaaa`aa```a`a`aa`aaaaaaaaaaaaa`aaaaǔaǔaǔaǔaǓaǔ`ǔaǓaǔaǔaǓaǔaǔ`ǔaǔaǔaƔaǔaǔ`ƔaƔaǔaǓaǔaǓaǔaǔ`Ǔaǔaǔ`ǔaǔaǓaǔ`ƔaǓaǓaǔaǓaǔaǔa~|{zxwvtsrqonmkjigfedbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa`aǔaǔaǔaǔaǔaǔaǔaǔaǔaǔaǔaǔaǔaǔaǔaǔaǔaǔaǔaǔaǔaǔaǔaǔaǔaǔaǔaǔaǔaǔaǔaǔaǔaǔaǔaǔaǓaǔaǔaǔaǔa~}{zywvutrqpnmljihgedcbaaaaaabbbaaabaaaaabaaabaabaaabaaaaԕaǔaȔaǔaȕaǔaǔaȔaǔaǔaȔaǔaȔaǔaǔaǔaǔaǔaǔaȕaȕaǔaǕaǔaǔaȔaǔaǔbǔaǔaǔaǔaȔaǔaǕaǕaȔaǔaȔbǕaǔaǕa~}|{yxwutsqqonlkjigfecbaaabbbaababbabbbabaaaababbaabbaabaȔbǕaǕaǔaǕaǔaǕaǔaǕaȔbǔbǔaǔaǕbǕaǔaǔbǔbȔaȕaǔaȔaǔaǕaȔbȕaȕaǔaǔbȔaȔaǕaǔbǔaǔaǔaǔaǕaǔaǕaǕbǔa}|{zywvttrppnmkjigfedbbbaabbabbaabaaaabaabbaaaaabababaaaǕaȔaȕbǔaȕbȔaǔbǔbǔaǕaȔbȔbȕbȔaǔaȕbǔaȕbǔbȕaȕaȔbȔaǔbȔbȕaǕaȕbȔbȔbǕbǔbȔaȕbǔbȔaȕbȔbȔbǔbǔbǕb~}|zywvutrqpnmlkjhfedcbabaaabbbbabaaabaababbbbbaaabaaab̕bǕbǔbȔaȔbǕaǕbǕbȕaȕbȕaȕbȔaȕaȕbȕbȕbȕbȔbȔaȕaȔbȔaȕaǕbȕbȕbǕbȕaȕbǕbȕbǕbȔbȕbǕbȕbȔbǕaȔbȔaȕbȕb~}|{zxwvtsrponmkjigfecbbbbbabbbbbbbbbbabbabbbbbbabbbbbaǔbȕaȕbȕbȔbȕbǔaȕbǕbȕbȕbȔaǕaȕaȕbǕbȕbȕbȕbȔbȕbȕbȕbȕbȕaȕaȕaȕbȕaȕbȕaȕaȕbǔbȕbȕbȕbȔaȕbȕbȕbȔbȔb~}{zxwvusrqpnmljihfedcbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbӕbȕbȕbȕbȕbȕbȕbȕbȕbȕbȕbȕbȕbȕbȕbȕbȕbȔbȕbȕbȕbȕbȕbȕbȕbȕbȕbȕbȕbȕbȕbȕbȕbǕbȕbȕbȕbȕbȕbȕbȕbȕbȕbȕb~}|zyxwutsqponlkjhgfdcbbbbbbcbbbbbcbbbbbbbbbbbbbbbbbbȕbȖbȖbȖbȕbȕbȕbȕbȖbȕbȕbȕcȕbȖbȕbȕbȕbȕbȕbɕbȖbȕbȕbɕbȕbȕbȕbȖbȕcȕbȕbȕbȕbȖbȕbɕbȕbȕbȕbȕbȕbɕbȕbȕb}|{zxwvutrponlljigfedbcbbcbccbccbbccbbbbcbbbbcbbbcbҕbȖbȕbȕbȕbɖbȕbȕbɕbȕbȕcɕbɕcȖbȕbȖbȕbȕbȕbȕcȕbɖbȖbɕbɕbɕcȖbȕcȖbɕbȕbȕbɕbȕbȖbȕbȕbɕbȖcȕcɖcȖbȖbɕcɕc~}{zywvusrqpomlkjhgedccccccbcccbcccccbbbcbbbbcbbcbbɖcȕbɕbȕbȕcȖcɕbȖcɕcȖcȕcɖcȖbɖcȕcɖbɖbɕcȖcȕbɕcȕbɖcȕcɖcȖcȕbȖbȕbɖbȖbɖcɖbȕcɖbȖbȕbȖbȕbȕcȕbȕcȖcȕcɕb~}|{yxvvtsqponlkiigfdcbbccbccccccbccbcbbcbbcbcbcbcіcɖcȖcɖbȖcɖbȕcȕcɖbȖcȕcɕcɖcȖbȖcɖcȕcȕbȕcȖbɕbɖcȖbȖbȖcɕcɕcɕcɖbȖcɕcɖbȖbɕbȕcɕcɖcɖbɕbɖcɖbɕbɖbȖcɖcȖb~}{zxwvusrqpnmkjihfedccccccccbcbccbccccbbcccbccccȖcɕcȖcɖcɖbɖcɖcȖcȖcɖbɕbɖcɖcɖcȖbȕbȖcɖbɖbɖbɖcɖcɖcȖcȕcȕcɖcɖbɖcɖcȖcɕbɖcɖcȕcɖcɕcɖcɕcȖcɕcȖcɖbɖcɕcɖb~||zyxvutsqpomlkihgedcccbccbccccbcccccccccccccccʖcɖbɖcȖcɖcɕcɖbɖcɖcɖcɖcɖcɖbɖbɖcɖcɖcɕcɖcȖcɖcɖcɖcɖcȖcɖcȖcȖcɖbɖcɖcɖcɖcɖcɖcɖcɖcɖcɖcɖcɖcɕcɕcɖcɖcɖcɖc}|{yxwvtsrponlkjigfeccccccccccccccccccccccccccזcɖcʖcɖcɖcɖcɖcɖdɖcɖcɖcɖcɖcɖcɖcɖcɖcɖcɖcɖcɖcʖcʖcɖcɖcɖcɖcɖcɖcɖcɖcɖcɖcɖcɖcɖcɖcɖcɖcɖcɖcɖcɖcɖcʖcɖcɖcɖcҸɴ̵~|{zywvusrqonmljihffdcccccccccdccdcccccdccccccɖcɖdɖdʗcʖdʖcɖdɖcʖcɖdɗcɖdɗcɖcɖcɖdɖcɖdɖcɖcɖcʖcɖdɖcɗdɖdʗcɗcɖcɖcɖcɖcɖdɖcɗcɖcɖcɖcʖcʖcɖcɖcʖcɖdɖcɖdɗcɖcͳɱʱɲʳն}|zyxvvtsrpomlkjigedddcdcddcdcddcdddccccdcdd˗cɖcɗcʗcɖdɖcɖcɖdɖdʖcɖcɗcʖcʖdɖdʗcɖcʗdʖdɖcʖdʗcɗcɗcʗcɗcɗcɗdɗcʗcɗcɖcɗcɖcɗcɖdʖcɖdʗdɖcɗcʖcɖcɖcɖcɖcɗcʗcʖcԳɬɭʮɯʯɰɱɱ~}{yxwvusrqonlkjhhfeccddcddcccccdddccdcdddcҗcʗcɖcɖdɗdʖcɖdɗdʖdɗcɖcʗdʖdɖcɗcɗcʗcɗcɖcɖcʖcʖcɖdɖcɗcɗcɖcʖdʖdʖcʖdʖcɖcʗdʖcʗcʗcɗdʖdɖcʗdɗdɖcɗcʖcʖdʗdɖdʖdɗdַͪɩɪɪʫʬɭɬɭʮʯɯ˱~}{zywvutrqpomljihgedcccddddddddcdcddcddddߗcɗdʗcʗdʗcɗcɗcʗcɖcɖcɗdʗcɖdɗcɗdɗdʗdʗdʗdɗdʗcɗcʗdɗcɖcʖcʖcʗcʖdʗdɗdʗcʗcʗdʖdʖcʗcʗdɗdʗcʗcɖcʗcʗcɗdʖcɗdɗcʖdɗdɗdɦɧʧɨʨʩɪʪɫɬɬʬʭʮ̯~}|{yxwvtsrponlkihgfeddddddcdddddcddddcdddʗdʗdʗcʗcʗdʗdʗdʗdʗdʗcʗdɗdʗcɗcʗdʗdʗdʗcʗcʖcʖdʗdʗdʖcɗdʗdʗdʗdɖdʗdʖdɗdʗdʗcɗdɗdʗdʗcʖdʖdɗdɗdʖdʖdʗdʗdʗdʗcʗdʗdɗdʤʤʥɦɦʧʧʨʩʪʪʫʬʬʭѯī|{yywvtsrponmkjihfeddddcddddddddddddddd˗dɗdɗcʗdʗdʗdʗdʖdʗdʗdʗdʗdʖdʗdʗdʗdɗdʗdʗcɖdʗdʗdʗdʗdʗdʗdʗdʗdʗdʗdʗdʗdɗdʗdʖcʗdʗdɗdʗdʗdʗdʗdʗdʖdɗdʗdʗdʗdʗdʗdʗdʗdʢʢˣʤʤʥʦʧʧʧʨʩʪʪʫʫծ|zyxvutrqpnmlkihgedddddddddddddddeddd̗dʗdʗdʗdʗdʗdʗdʗdʗdʗdʗdʗdʗdʗdʗdʗdʗdʗdʗdʗdʗdʗdʗdʗdʗdʗdʗdʗdʗdʗdʗdʗdʗeʗdʗdʗdʗdʗdʗdʗdʗdʘdʗdʗdʗdʗdʗdʗdʗdʗdʗdʗdʗdʠʡʡʡʢʣʤ˥ʥʦ˧ʧʧʨʩʪʪ֮|yxwvtsrponlljhgfedddddddddddddedddϗd˗dʗdʗd˘dʗdʗdʗdʘeʘdʗdʗdʗdʗdʗd˗dʗdʗd˗dʗdʗeʗdʗdʗdʗd˘eʗeʗd˗dʘdʗd˘dʗdʗdʗeʗd˗dʗdʘeʗdʗdʘdʗdʗdʗd˘d˗dʗdʗdʗd˗dʗdʗdʗeʞʞʟˠʡˡʢˢˣˤʤʥʦʦʧʧʨʩحś|xwvutrqonmkjihgeddddddddededddddΘdʗd˗e˗dʗdʘdʘeʗdʗdʗdʗdʗdʗe˗dʗdʗdʗdʗdʗdʗd˗e˘eʗdʗdʗd˗dʘd˘eʘdʘeʗdʘdʗd˘dʘdʗd˘d˘dʗdʗeʗeʗdʗdʗd˗eʗd˘eʗd˘dʘdʗdʗeʘdʗdʘeʛʜʝ˞ʟʟˠˡˡˡˢʣʤʤʥʦʦʧʨث͹†|{yvutsrpnmlkihgfddeddddeddeddde̘d˗d˗dʘdʘd˗dʘd˗d˗d˘eʘeʗdʘdʗd˗dʘdʗd˗d˘eʘd˗d˗eʘeʗdʘe˗eʘd˘eʘdʘd˗dʗe˗e˘d˘d˗eʗe˗d˗dʗd˘eʘeʘdʗe˗d˗dʗeʘe˘e˘e˗dʘeʗd˗dʘd˗d˚ʛʛ˜˜ʝʞ˟ʟˠʠˡʢˢʣʤʤ˥ʥ˦ԩňā}{yxuusqponmkjhgfeddeddeeedeedd̗eʘdʘd˗dʘdʗdʘeʗd˗e˘eʗd˗d˘e˗d˘dʘeʗdʘeʗd˗e˗d˘d˗eʘeʘd˗eʗe˗e˘dʗd˘e˘dʗd˘e˘e˗d˗dʗdʘeʘd˗dʗe˘e˗d˗e˗d˘e˗eʘdʘeʘeʘe˘d˘eʘeʗe˘dʘ˘ʙ˚˚ʛ˜˜ʝʞ˟ʟ˟ˠˡˢˢʣʤ˥˥ЦɍƈĄÀ~{zxvttrqpnmljiggedeeeedeeeded̘e˘e˘d˘eʗd˘eʗe˘eʘd˗eʗd˘e˗eʘeʗe˘d˘eʗdʘe˘eʗe˘e˗d˘eʘdʘdʘe˗d˗e˘e˘e˘e˘e˗e˘d˘e˗e˘e˘e˘eʘe˘dʘdʘd˗e˘e˗e˗eʘd˘e˗e˘e˘e˘d˘e˘e˘eʘd˘˘ʘ˘˙˙ʙ˚ʛ˜˜˝ʞ˟˟˟ˠˡˡˢˣʤͤ˗ɌƇŃ}zyvutsqponlkihgeeeeeeeeedeߗd˘e˘e˘e˗d˘e˘d˘e˘e˘e˘dʘe˘e˘dʘeʗd˗e˗e˗e˘eʘe˗e˘e˗d˘e˘e˗d˘e˘e˘eʘeʗe˘e˘eʘd˘e˘eʘeʘe˘e˗eʘe˗e˘d˘e˘d˘dʘe˗e˘e˘eʗe˘dʗe˘d˘e˘e˘eʘe˘e˘˘˘ʗ˘˘˘˙˙˙˚˛˜˜˝˞˞˟˟ˠˡˢˢˣȓɍLjł{yxvtsrqonmkjigfeeeeeedde՘e˘e˘e˘e˘e˘e˘e˘e˘e˘e˘e˘e˘e˘eʘe˘e˘e˘e˘e˘d˘e˘eʘe˘e˘e˘e˘e˘eʘe˘eʘe˘e˘e˘d˘e˘d˘e˘e˘e˘e˘e˘eʘe˘e˘e˘e˘e˘e˘e˘e˗e˘e˘e˘eʘe˘e˘e˘e˘e˘e˘e˘˘˘˘˘˘˘˘˘˘˘˙˚˚˛˜˜˝˞˞˟˟ˠˡˢդŽÓʍȇƂ~|zwutrqpnmljihgeeeeeeee͘e˘e̘e˘e˘e˘e˘e˘e˘e˘e˘e˘e˘e˘e˘e˘e˘e˘e˘e˘e˘e˘e˘e˘e˘e˘e˘e˘e˘e˘e˘e˘e˘e˘e˘e˘e˘e˘e˘e˘e˘e˙e˘e˘e˘e˘e˘e˘e˘e˘e˘e˘e˘f˘e˘e˘e˘e˘e˘e˘e˘e˘f˘˘˘˘˘˙˘˘˙˘˘˙˘˘˙̙˚˛˜˜˝˝̞˟˟ˠΡʎɆƂ}{yvtsqpomlkjhgfefeeeۙf˙e˘e̘e˘e˘e˘e˙e˘f˘f˘e˘e̘e̘e˘e˘e˘f˘e˘e˘e˘e˘e˘f˘e˘e̘e˘e˘e˘e˙e˘f˘e˘e̘e˘e˘e˘e˘f˘e˘e˘e̙e˘e˘e˘e˘e˘e˘f˘e˘e˘e̘e˘e˘e˘e˘e˘e˘e˘e˘e˘e̘e˘e˘e˘˙˘˘˘˘˙̘˘˘̘˙˘˘˘˘˘˙˙˚˛˜˝˜˝˞˟˟ԢĭɍɆȁ}{xuurqpnmkjihfeeeeϚe͚f̚e͘e˘e˘e˘e˘e˙e˙e˘e̙e˘f̘f˘e˙e˘f̙e˙e̙e˘f˘e˘f̙e˙e˘e˘e̘e̘e˙e̘f˘e˙e˘e̘e˙e˙e˘f˘f˙e̘f˘e˘e˘f̘e˙e̘e˘e˘f˘e̘f˘e˘e˙e˘e̙e˘e˘f˘f̘e̘e˘e˘e˙e˘f˙˙̙˘˙̙˙˘˘˘˘˘̘˘˙̘˘˙̘̙˙̙̚˛˜˜˝˝˞̟ާͶĭnjʅȁ|ywusqpnmljjhgfeٞeѝeϛeϚfΚf̚e͙e̘f̘f̘f˘e̙e˘e˘e̘e̘e˘e˘f̘e˘e˘e˙e˘e̘f̙e̘f˘e̘e˙f˘e̘e˘f˘f˘e˘e˙f˙f˘e˙f˘f˙f̘f˘f˙e˙f̙e˘e˘e̙e˘e˘e˙e˘e˘e˘e̘e˘e˘f˙e˘e̙e̘f˙e˘f˘e̘e˘e̘̙˘˙˙˙˙˘˘̙̘̘̙˘˙˘̘̙˙̙˙˘˙̙̙˚˛˛˜̝˝͞ϴٌ˅ɀ|xvtrqommkjigeأeסeԠeҝeќfϜeΚfΙf͙e̘e̙f̘e˙e̘f̙f̙f˘e̙e̘e̘f̙e˙e˘f˙f˙f̙f˘f̘e˙f̘f̘f̙f̘f˘e̙f̘e̘f̘f˘f˘e̙f˘e̙e˘e˘e̙f˙f˙e̘e̘e̙f˘e˙e̘f˙e˘f̘f˘e̙f̙f˘f̙e˙e˘f̙f̘f˘e̙f̙˙˙̙˘˙̘˘˘˘˘˙̙˘̙˙̘̘̙˘˙̘˙˙˘˘˙̙˚̚˛˜˜͝ҳů˅ʀ{xusqpnmkigffާeڤeأe֡fԟfҝfϜfϛe͛e̙f͚e͘f̙e̙f̙e˘f̙f̙e˘e̘e̙f˙e̙f̘f˘e˘f̙e̘f̙e˘e˙f˘f˘e̙f˙e̙e̙f˙e̘f˘f˘f̙f̙f̘e˙f˘f̘e̙f˘f˙e˘f̙f̙e̙e˘f̙f̙f˘f̙e̙e̘e˘f˙f̘e̙e̘f̘e˘e̘̙̘̘̘˘̙˘˘̙̙̙̘̘̘̙˙̘˙˙̙̙˙̙̙˙̙̙̙̙̙̚˚̛̜˝ءֲůʅˀ{wurqmjfeffffߩfܦeڤfעfՠfӝfѝfМfϛfΚf̚e͙f̙e˙f̙e̙e̙f̙e˘f̘e̙e˙e̙e̙f̙f˙f˘f˘f̙f˘f̘f̘f̙e̘f˙f̘f̙e̙f̙f̘f̙f̙e̘f̙f˘f̙f̙f̙f˙e̙e˙f̘f̙e̘f̙f̙e̘e̙e̙e̙e̙f̙e̙f̙f̘e˙f̘f̙̙̙̙˘˙̘̙̙̙̘˘̙̙̙̙̙̘̙˙̙̘˙̙̙˙˙˙̙̙̙̘˙̛̙̝̚̚Пٰưƅ{vojfffefffeffާfۥfأfաeӟfҝfѝfϛf͛f͚f͚f͙f̙e̙f̙f˙f˘f̙f̙f̙f̙e˙e̘f̘f˙f̙f̙f˙f˙e̘f̙f̙e̙f̙f̙f̙f̘f˙e̙f̙f̙f˙f̙f̙f̘e̙f̙f˙f̙f̙e˙e̙f˙f̙f̙f̙e̙f̘f̘f̙f̙f̙f̙e̙f̙f̘̙̙̙˙̙̙̘̙̙̙˙̙̙̘̙̘̙̙̙̙̙̙̙̙˙̙̙̘̙̙̙˙̙̘̙̙˛̛̞̠УޫޭDz|smkhggffffffffffݧf٤fעfԠfӟeѝfМfϛeΛf͚f͚e̘f̙e˙f̙f̙e˙f̙f̙e̙f̙e˙f̙f̙f˙f̙f̙f̙f̙f̙f̙e˙e̙e̙f̙f̙e̙f̙f̙e̙f̙f̘f̘f̙f̙f˙f̙f̙f̙f̙f̙f̙f̙e̙f˙f̙f˙f̙f̙f˙f̙f̙f̙f̢̛̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̝̟̦̪̚Ϯ٢ǫœڽݺ~wrnkihgffffffffffިfܦf٣f֡fԠfҞfѝfϜfΛfΚf͚f͙f̙f̙f̙f̙f̙f̙f̙f̙f̙f̙f̙f̙f̙f̙f̙f̙f̙f̙f̙f̙f̙f̙f̙f̙f̙f̙f̙f̙f̙f̙f̙f̙f̙f̙f̙f̙f̙f̙f̙f̙f̙f̙f̙f̙f̙f̙f̙f̙f̙f̙fDisplayCAL-3.1.0.0/misc/media/install.bmp0000644000076500000000000045566012647526531017705 0ustar devwheel00000000000000BM[6(:z[  f3f3f3f3f3f3f3f3f3f3f3f3f4f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3g3f3g3f3f3f3f4f3f3g3f3f3f3f3f3f3f3g3f3f3f3f3f3f3f3g3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3g3f3f4f3f4f3f3f3f4f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f4g3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3g3f3f3f3f3f3f3f3f3f3f3g3f3g3f3f3f3f3f3f3f3g3f3f3f3f3f3f3f3f3f3f3f3f3f3g3f3g3f3f3f3g3f3f3f3f3f3g3f4f3g3g3f3f4g4f4f3f3f3g3f3f3f3f3f3f3f3f3g4f4f3g3g3f3g3f3f3f3f3g3f3f4f3f3f3f4f3f3f3f3f3g3f3f3f4f3f3f3g3f3f3g3f3f3g3g3f3f4f3f3f3f3f3f3f3f3f3f4g3f3f3f4f3f3f3f3g3f3f3f3g3f4f3f3f3f3f3f4f3f3g3g3f4f4f3f3f3f3f3g3f3f3f3g3f3f3f4f3f3f4f3f4g3g3f3f3f3g3f3f3f3g3f3f3f3f3f3f3f3f4g3f3f3f3f3f3f3f4g3f3g4f3g3f3f4f3f3f3f3f3f4f3f3f4f4f3f3g4f3f4f3f3f3f3g3f3g3f4f4f3f3g3f3f4f3f3f3f3f4g3g4f3f4f3f3f3f3f3f3f4f3f3f3f3f3f3f3g3f3f3f4g3g3f4f3f4f3f3g3g3f3f4g3f4f3g4f3f3f3f3f3f4f3f4g3f4g3f4f3f3g3g4f3f3f3f4f3f3f3f4f3f3g3f4f3f4f3f3f3f3f3f3f3g3f3f3f4f3f3f4f3f3g3f3f3g3f3f3g3f3f4g3f3g3f3g3f3f3g4f4f3f3f3g3f3f3f3f3f3g3g3f3f3f3g3f4f3f4g3f4g3f3f4f3f3f3g3g4f4g4g3f3f4f3g4f4f4g3f3g3f3f3f3f3f3g4g3g3g3f3g4f4g3f3g3g4f4f3f4f4g4f3f3f3f4g3g3f3g3g3f3g3f3f4f4f3g4f3g4f3f3f3f3f3f3g3g4f3g4g3f3f4f3f4g3f3g4g3f3f3g3g3g4f4f3f3g3f4f3f3f4g3f3f3g4f3f4f3f3f4f4g3f4g3g3f3f4g3f4f4f3f3g3g3f4g3f4f4g3f3g4g4g3f3f4g4g3g3f4f3f3f3g4f3g4f3f3g4g3f3g3f3f3f4g3f4f4f3f3f4f4g3f4f3g3f3f3g3f4f3g4f4g3f4g3f4g3f4f3g3f4f3f3f3f3f3g3g3f4f3f4f4g3g4g4f4g3f3g4g3f4f3f4g4g3f3g3g3f4g4g3g3f3f3f3f4g3f3g3g4f3f4g3f4g4f4f4f3g4g4g3g4g3g3g3g3g4g4f3g4f4g4f3f4g4g3f3g4f4f3f3f4f3g3g4f4g3g3g3g3f3f3f3g4g3f4f3f4g3f3f3f3f3f4g3g4f3f3f4f3g3g4g4f3f3f3g4f4g3f4f3f4f3f3g3g3f4g4g4g4f3f4f3f4f3g4f4g3g4g3f3f3f4f4f4f4g3f3f3f4f4f3g3g4g3f4g4f4f4g3f4f4f3g3f4g4f3f3f3f4g4f3f3f4g4g3f3g3g3f3f4f3g3g3f4f4f3f4f4g4g4f4g3f4f4f3g3g4f4f3f4g3g4g3f3g4f3f3g4g4f3f3g3g3f3f4g4f3f3g4f4g3f3g3f3f4g3g4g4g3f4f4f4f4f4f3g4g4f4f4f3f3f4f3g4g3f3g4g3g3f3f4g3g4f3g3f3f4g4f3f4g3g3g4g4g4f3g3g4f3f3g3f4g3g4g3f3f4f4f4g3f3f3g4g4f4g3g4f4f4g4g3g3g4f4f4g4f3g4g3g3g4f4g4g3f4g3f3f4g3g4g4g3f3g4g3g3f3f4g4f4g4f3f4g4g3g4g3f4g3g4g3f3f4g4f4f3f3g3f4f4g4f4f3g4g4g3g4f4g3g4f3g4g4f3g4f4g3f4g3g3g4f3g4f3g4g3f3g4f3f4g4g4g4g3f3f4f4g4g4f4g3g4g4g4f4g3g3g3g3g4g4g4g3g4f4f3g4g4f3g3g4g4g4g3g3g4g3g4g4g4f3f4f3g3f3g4g4g4g3g4f3f3g4g4g4g3g4f3g3g3g4f4g3g3f4g3g3g4f4g4f3f3f4g4g4f3f4f4g4g4g4g3g3g4g3f4f3f4f4g4g3g4g3f4f4g3g3g3g3f4g3g3f4g4g3g4g4f4g3f4g4f4g4g4g3g3g4g3g4g3f4g4g4g4g4f3g4g3g4f3g3g3g4g4g4g4g4g4g3f4f3g3f4f4f3g4g4f4g4f4g4f4g4f4g4g3f4g3g4f4f3g4f4g3g4g4g4g4f4f4g3g4f3g3g4g4f3g4g4g3f4f4g4g4f4g4g4g4g4g3f4g3g3g4g4g3g4g3f4g4g4g4g4g3g4g4g4g3g4g4g3f3f4g4g3f4g4g4g4g4f4g4f4g3g3g4g4g4g4g3f4f4g3g4f3f4g4g3g4g3g4g4g4g4g3g3g4g3g3f3g4f3g4f4g3f4g3g4f4f4g4g3f3f4g4f4g4g4g4f4f3f4g4g4g4g3g4g4g3g3g4g3g3g4g3f3g4f4f3g4g3g4g4f4g4g3g4g4g4g3g3g4f3g3g4g4g4g3f4g4g4g4g4g4g4g4g4g4f3g4f4g3g3g4g4g4g4g4g3f4g4g4g3f4g3f4g4g4g4f4g4g4g3g3g3g4g4g3f4g4g4g4f4g4g4g3g4g4g4g4g4g3f4g4g4g4f4g4g4f4g4g4g4f4f4g4g4g4g3f4g4g4g3g3g4f4f3g4g4g4g4g3g3f4g4g4g4g4g3g3g4f4g4f3g4g4f4g4g3g4f4g4g4g4g3g4g4g3g4g4g3g4g4g4g4g4g4g4g4g4f3g3g4f4f4g4g4g4g4f4g4g4g4g4g4g3g3g4g4f4f4g4g4f4g4g4f4f4g4g4f3g4g4g4g4g4f4g4g4g4g4g3g4g4g4g4g4g3g4g4f4g4f4g4g4g4g3g4g4g4g4g4g4f3g4g4g3f4g4g4g4g4g4g4g4g4f3g4g4g4g4g4f3g3g4g3g4g4g4g4g3g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g3g4g4g4f3g4g4g4g4g4g4g3g4g4g4g3g4g4g3g4g4f4g4f3g4f3g4g4g4g4g4g4g4g4g4g4g4g4g4f4f4g3g3g4g4f4g4g3g4g4g4g3g4f4g4g4g3g4g4g4f4g4g4g4g4g4g4g4g4f4g4g4g4g3f4g4g4f3g4g4g4g4g3f4g3f3g4g4g4g4g4g4g4g3g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4f4g4g4g4g4g4f4g4g4g4g4g4g4g4g4g4g4g4g4f4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4f4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4h4g4g4g4h4g4g4g4g4g5g4g4g4g4g4g4g4g5g4g4g4g4g4g4g4g4g4g4g4g4g4h4g5g4g4g4g4g4g4g4g4g4g5g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4h5g5g4g4g4g4g4g5g4g4g4h4g4g4g4g4g4g4g4g5g4g4g4g4g4g4g4h4g4g5g4g4g4g4g4g4g4g4g4g4g4g4g4h4g4g4g5g4g4h4g4g4g4h4g4g4h4g4g4h4g4g4g4g4g4g4g5g4g4g4g4g4g4g4g4g4g4g4g4g4g5g5g4g4g4h4g4g4g4g4g4g5g4g4g4g4g4g4h4g4g4g4h4g4g4g4g4g4g5g4g4g4h5g4g4g4g4g5g5h4g4h4g5g4h5g4g4g5g5g4g4g4g4g4g4h4g5g4g4g5g4g4h4g4g4g4g4g4g4g4g5g4g4g4h4h4g4g4g4g4g4g5g4g4g4g4g4g4g4g4g4g5g4g5g4g4g4g5g4g4g4g4g5g4g4g4g4g5g4g4h4g4g4g5g4g4g4g5g5g4h4h4g5h4g4g4g5g5g4g4g4g4g4g4g4g5h5g4g4h4g4g4g4g4g5h5h4g4g5g4h5g4g5g4g4g4g4g4h5g4g4g4g4g4h4h5g4g4g4g5g4h5g4g4g4g4g4g4g4g4g5h4g4g5g4g5g4h4h4g4h4g4g4h4g4g4g4g4g5h4h5g4g4h4h5g4h4g4h4g4g5g4g4g4g4g4g5g5h5g4h4h5g4h4h4g4h5g4g4h4g4g4g5g4h4g4g4g4h5h5g4g5g5g4g5h4g4g5h5g4h4g4g5g5g4g4h5g4g4h4g4g4h4g5g4g4g4g4g5h5g5g4h4g4g4h4h4g4h4h4g4g5g5g5g4g5h4g5g4g5g5g5g4g4h5g4h5g4h4g5g4g4g4g4h4g4h4h5g4g4g4g5g5g4g5h4g4g5g4g4g5g5h5h4g4g4g5g5g5g4h4h4g4g4g4g4g5g5g5g5g4h5h4g5g4g5g4g5g5g5h5g5h4g4g5g5h4g5h4g4g4g4h4g4g5h4g5h5h5g5h4g5g4g4g5h4g5h5h5g4g4g5h5g4h5h4g5h5g4g4g4h5g5h4g4g5g4g4h5g5g5g5g4h5g4g4h4h5h5g5g4h4h4g4g5g5g5g4g4g4h5g4g4h5h4g4g4g5h4h4h4g4g5h5h4g5g4g5g4g4g4g5h4h4h4h4g5g5g4h4g4g4h5g4g4g5h4h4g4g5g5g5h4g4h4g4g4g4g4g5g5g5g4g4g4g4g5g4g4g4g4g4h5h4g5g5g5g4h4g4h4h4h5h4g4g4h4h4g5g4g5h4g4g4h4h5h5h4h4h5g5h5h5g5g4h5g4g5h5g4h5g5g4h4h5h4h5g4g5h4g4h4h4h4g5g4g4h4g4h5h4h4h4h5h5g5h5h4h4h5h5g4g4g4g5g4h4h5h4h5g5h5g4g5g4h5h5g5g4g4h4g5h4g5h4h4g4g5h5g5h5h4h4h5h5h5g4h4h5h5g5h4g5h4h5g4h4h4h4h4h4h4h5g4g5g4h4g4h5h4g5g5h5g4g5h5g4g5g4g5g5h5g4h5g4h4h5g5g5g4h5g4g4g5g5g4h5g5h5g4g5g4g4g5g4g4g5h5g5h5h5h5g4h4h5h4g4g4g5g4g5g5g5h4g4g4h5h4h4g5h4h5g4g5h5g5h5h5g5h4g5h5g5g4h4h5h5h5g4h5h5h5h5g4g4h4g5h5g5h5h4h5g5g4h5h5h5h5g5g5h5h5h4g5h5h4h5g5g4g4h4h4h5g5g5h5h4h5g5g4h5g5h5h5h5g5g5h5h5h5g4g5h5h5g4g4g4g5g5h5h5h5h5h5h5h4h5g4h5h4h5g5h5h5h4g4h4g4h5g5g5g5g4g5h4h5h5g4h5h4h5h5h4g5h4h5h5h5g4h4g4h5g4g4h4g4g5h5h4h5h5g5h5g4g5h5g5g5h4h5g4g4h5h4h4h4h5g5h5h4g5g4h4g5g4h5g5g5h5h5h4h4h5g4g5h5g5h4h4h5g5g5h5h5h5h4g5h5h4h5h5h5h5g5h4h4h5h5h5h5h5h5g4h5h4h5h4h4h5g5h5h5h5h5g4h5g4h4h5g4h5g4h5h5h4g4h5g5h5h4g5h5h5h5h4g5g5h5h4g5h5g5h5h5h5h4h4h4h4h5h4g5h4h5g4h4h4g5h5g5g5h5g5h5g5g5h4h5h5g5h5h4h5h4h5g5g5h5g5h4h5h5h5g5h4g4h5h5h5h4h4h4g4h5g5g5h4g5h5g5h5h5h5h4h5g5g5h4h5h4h4h5g5h5h5h4h5g5h4h5g5h5h5g4g5h4g5g5g5h5g5h5h5g4h5h4h5g5h5h5h5h5h4g5h5h5h5h5h5g5g4h4g5h4h5h5h5h5h5h5h5h4g5h5h5h5g5h5h5h4h5h5g5g5h5h5h4g5g5g5h5h5g5h5h5h5g5h5h5h5g4h4h4h5g5h5g5h5h5h5g4h5h5h5h5h5g5h5g4h4g5h5h4h5h4h5g5h5h5h5h5h5h5h5h5h5h5h5h5g5h5h5h5h4h5h5g5h5h5h4g5h4h5h5h5h5h5h5h5g5h4h5h4g5g4h5h5g5h5h5h5h5h4h5h5h5h5g5g5h5h5h5h4h5h4h5h5h5h5h5h5g5h5h5h5h4h5h5g5h5h4h5h4h5h5g4h4h4h5h5h4h5h5h5h5h5h4h5h5h5g5h5g5h4h5g5h5h5h5h5h5g5h5h5h5h5h5h5h5h5h5h5h5g5h5h4h5h5h4h5g5h5h5h5g4h5h5h5h5h5h5h5h5h5h5h5h5h5g5h5h5h5h5h5h5h5h5h5g5h5h5h5h4h5h5h5h5h4h5h5h5h4h5h4h5h5h5h5h5g5h5h5h5h5h5h4h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5g5h5h5h5h5h5h5h5h5h5h5h5h5h4h4h5h5g4h5h5h4h5h4h5h5h5h5h5h5h4h5h5h5h5h4g5h5h5h5h5g4h5h4h4h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5i6h5h5h5h5h5h5h5h5h5h6h5h5h5h5h5h5h5h5h6h5h5h5h5h5i5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h6h5h5h5h5h5h5h5i5h5h5h5h5h5h6h5h5h5h5h5h5h5i5h5h5h5h5h5i5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h6h5h5i5h5h5h5h5h5h5h5h6h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h6h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5i6h5h5h6i5i5h5h5h5h5h5h5h5h5h5h5h5i5h5h5h5h6h5h5h5h5h5h5h5i5h5h5i5h6h5h5h5h5h5h5h5h5h6h5h5h5h6h6h5h5h5h5h5h5h5h5h5h6h5h5h6h5i6h5h5h6h5h5h5h5i5h5h5i5h5h5h5i5i6h6h5h5h5h5h5h5h5i5h5h5i5h5h5h5i5i5h5h5h5h6h5h6h5h5h5h5h5h5h5h5h5h6h5h5h5h5h5h5h5h5h6h6h5h5i5h5h5h5h5h5h6h5h5h6i5h5h5h6h5h5h5h5h5h5h5h5h6h5h5h5i5h5h5h5h5i6i5i5h5h5h6h5i5i5i6h5h5h6h5h5h5h6h5h6h5h5h5h5i6h5i5h6i6h6h5h6h5h5h5h5i5h6i5h6h6h6h5i6h5h5i5h5h5h5h5h6i5i6h6h5h6i5h6h5i5h5h5h6i6h6i5h5h5i5h5h5i5h5h5h6i5h6h5h5h6h5h5h5h5h5i6i5h5h6i5h5h6h6i6i5h6h5i5h5h5h6i5h5i6h6h6i5h6h5h5h5h6i6h6i5i5h6h6i6i5h6i6h5h5h6h5h5i6h5i5i5h5i5h5i6h5h5h5h5i6h5h5h6h6h5h6h5h5h5h5i5i6h5h6i5h5i6h5h5h5h5h5h6h6i5i6h5h5h6h5h5h6h5h5i5h5h6h5i5h5h5h5i5h5i6h5h5h5i6h6h5h5h6h5h5i6i5h6i5i5i5h5i5i5h5h5i6i5h6h5i6h6h5i5i5h5h6h5h5h5h5h5i5h5i5h5i6h6h5h5h5h5h5h5i6h5h5i6h5h6i5i5h6h6h5i6i5h5i5h5i6h6h5h5h5i5i6h5i5h5i6h5i5h5i6i6h6i5h6h5h5i5i5i6h5h5h5h5i6i5h5h6i6h5h6i5h6i5h5i5h5h5h5i6h5h5h5h5i6h6h5h6i5i5h5h5h5h6h6i5h5h6h5i5h5h5h5h5h5h5h5h6i5h5h5h5h5i6i5h5h5i6i6i5i6h5h6h5i6h6h6h5h5h5i6i5h6h5h6i5h5h6h6h5i6h6i6i6h6i5i6i6i5i6h6i6i5i5i5h6h5i6h6i5h5h5i6h5h5h5i5h5i5h6h5h5i5h4a2Y.Y.c3i6i5i5h5h6i6h6h6h5i6h5i5h5h5i6i6i6h6h5h5i6i5i5h5i5i5h5i6e3]0X-^0f4i6h5i5h6h6i5i6i6h6i5h6h5i6h5i5i5h5h6i5h6h5h6i6i5i5i6h6i5i6h6i5h5i6h6i6h5h5i5i6i6h5h6h6i5i5i5i6h6i5i5h6i5i5i6h6i5i5i5h5h6i6h6i5i6i5i5i5h5h6h5i5i5h6h6i6i5i6i6h6h5i5i6i6i5i5h6i6i6i6i6h5h6h5h6i5i5i5h6i6i6h5i5i6h6h5i6i6i5h5h5i6h5i6i6i5h5i5h6h5h6i6i6i6h6i5h5d3cY.i5h6h6h6i5i6h6h6i6h6h6i5i6i5h5h6i6i6i6h5i5i6i6i6i5h6h6i6a2÷µ^/i6h5i6h6i5i5h6h6h5h6i6h5h6i6i5h6i6i5i5h5i6i6i6i5i6h6h5i6h5i5h6i5i5i6i5i5h5i5h5i6h5h5h6i6i5i6i5i5i6h6i6h6i6i6i6i5i5i6i5i6h5i6i5h5h6i5i5h6i5h6i6i6h6i6h6i6i6i5i6i6i6h6i5h6h6i6i6h5i6i6h6i6i6i6i6i6i6i5i6i6h6i6h6h6i5i5h6i6h5i5i5i6i6i5h6i6i6i6h6i6i6h5h6i6i5h6d3{aU+i5i6i6h6h6i6i6i6i5h6i6i5h5i6h6i6i6h6i5h6i6i5i6i5h6h5i5h5d3eE^8f5h6i6h6i6i6i6i5h6h6i6i6i6i6i6i6i6h5i6i6i5i6h5i6i6h6h6i6h5h5i6i5h5i6i6h6i6h6i6i5i5i5i6i6i6i5h6h6i6h6h6i5i5h5i6i6i6i5h6i6i5h5i6h6i6i6i6i5h6i6h6i6i6i6i6i6i6i6i6h6i6h5i6i6i6i6i6i6i6i6h6h6i6i6i6i6i6i6i6i6i6i6h6i6i6i6i6i5h6i6i6i5i6i6i5i6i6i6i6i6i6i5i6i5i6h6d3{aT,i6i6i6i6i6i6i5i6h6i6i6i6i6i6h6h6i6i6i6h6i5i6i5i6h6i6i5i6i6\/_1i6i6h5i6i5i6i5i5i6i6i6i6h6h6i6i6i6i5i6i6i6i6i6i6i6i6i6h6h6i6i6i6i6i6i5i6i6i6i6i6i5i6h6i6i6i6i6i6i6i6i6h6i6i6i6i5i6i6i6i6i6i6i6i6i5h6i6i6i6i6h6i5i6i6i6i6i6i6h6i6i6i6i6i6i5i6i6i6i6i6i5h5b2Y.U,U,U,U,U,U,V,Y._1e4h6i6i6i6i6i6f5^0Y.^0f5i6g5a2Z.V,U,X-_1f5i6d3{a{S+_1X-T,X-^0e4h6i6i6h6c3Z.Z.c3i6g5b2[/V,V,[.b3e4`0\/b2h5i5i6d3qSU,g5i6i6i6i6i6i6i6i6i6f5`1Z.V,U,U,X-^0d3h5g5`1X-V,\/e4i6i6i6i6h6i6i6i6f5`1X-V,[/b3`1X-T,U,~U,U,U+U,U,U,Y.c3i6i6i6i6i6i6i6i6i6i6i6i6i6i6i6i6i6i6i6i6i6i6i6i6i6i6i7j7i6i6i6i6i6i6j6i6i6j6i7e4c᫚rS\/f5i6j6i6i6`1ĶĶ`1e4Y.|`:d3d3{adD#iFa3i6i6g5mHmHf4^0nÞoV,}ce4i6j6h6W-nc3i6i6i6i6i6i6i6g5_1^8|a[/`1҄Z/g5i6i6i6i6i6i6i6`1X-mHg5i6i6i6j6i6i6i6i6i7i6i7i6i6i6i6i6i6i6i6i6i6j6j6j7i6i7i6j6i6i6i6i6j6i7i7i7j7i6e3{aV,d4i7i6i6^0]0i?a:a2{aqSd3j7f5gFhFa2|b|ad3i6i6h6W.ÅZ.h6i7i6i6i6j7g5Z.ȿ]8zX5od3i6i7i6i6j6i7h5V,{W-hFg5i6j7j6i6i6i6i6i6j6j7i6j6i6i6j7i6i6i6i6j6i6j7i7i6j6j7i7i6i7j6i6j7j7j6j6j6i6i6d3{ar[yR*U,V-V,zR*nǽ҆_9e4i6i7^1]0]1қmzS*{S+x^Z.|aғz`|T+{R+mW,g5f5gFgF\/xV5U,yQ*|{ad3j6j6d3qSqSd3j6j7i6i6g5Z/҇fF^0j6j6i7i7i7i6d4|a^9]0mHg5i6j6i6j6i6j6j7j7j6i6i7i6i6j7i6i6i7i6i7i7j7j6j7j7i7i6i7j6j6j7i6i7j6j6i6i6i6j6d4|a{ad3j6i6i7h6b4Z.w^ɾ[/i6j7]0^1f4^1\/c3h6i5]0lV,{ayX5b3h6h5a2bC|b3g5gFgF\/ɿ|S,c4e5b2uO({ae4j7j6^1^0j7j6i7i7`1[8U,U,yQ*X-{`~V,g5i6j6j6j7j7_0^0`2lI&U,U,U-V,V,[.d4j7i6i6i6i6j6i6i6i6j7i7i6i6i6i6i6j7j6j7j7j7j7i6j6j6j6j6j6j6j7i7j7j6j7j7j7j7j6j6d3{a{ae4j6j7j7j6i6i5^1{{`c4j7^0^0j7i7j6j7j7g5[.yҁV-|aU,i6i6j7i7[/ƽȾ\/g5hFgF`1}|yR*U-lI%{ae4i6g5^8yh^9f5j7j7g5^9mQ]0f5i6j7g6`2_9Y/d4V-lzR+U-V-V,U-V,nJ&{ad4a1Y.i6j6j7j7i6i7i6j7j7i7i7j6j7i7j6i6j6i7j7j6j7j7j7i7j7i7j6j6j7j6j7j7i6i7i7i7j7j7i7j7i7i7j7j7i7i7e3|a|ad4j7j7j7i7i6j6g6V-È\/j7]1^0j7j7g6a2Y.]8o^0|aV,i7j7j7j7`1Y.f5hFhFe5\/|{ae3i7a2pL'`2j7j7a2m`2i6i7j7j7i7j7g5e4h6j7a2҃X.i6a2Y.j7j7j7j6i7j6j6i7j7j7j7j6j7j7j6j6j6j7j7j6j7j6j7j6j7j7i7j7j7j7j7j7j6j7j7j7j7j7j6j7j6j7i6j7j6j7e4|a|ae3j7j7j7j7j7j7j7_1_:h6]1^1j7d4V-ҟo^0c4|aU-i7j7j7j7b3|X.g5hFhFg5h6a2}T,|ae4h6V-|]0qSW-h6j6\0ҁW-h5i7j7j7i7j7j7j7j7j7j7g5]8a2j7`2Y.j7j7j7j7j6j7j7j7j6j7i7i7j7j7j6j7j7j7j7j7j6j7j7j7j6j6j7j7j7j7j7j7j7j7j7j7j7j7j7j7j7j7j7j7j7j7e4|a|ae4j7j7j7j7j7j7j7c4nqTf5^1^1e5jGҭ]8[/c3h6d4|aV-j7j7j7j7a2|Y.g5hFhFg5j7i7h6c3^1Y.V-lI&|ae4c3|_:f5Y.nc4j7X.^1j7j7j7j7j7j7j7j7j7j7j7j7\0ȾsM(V-V-{S+tY?^8g5j7a2Y.j7j7j7j6j7j7j7j7j7j7j7j7j7j7j7j7j7j7j7j7j7j7j7j7j7j7j7j8k7j7j7j8j7j7j7j7j7j7j7j7j7j8j7j7k7j8e4|a|af5j7j7j7j7j7j7j7e5qSoe4^1^1_1ɿ|U,a2g5j7j7j7e5|azS*h6j7j7j7^1҇[/g5hFhFg5j7h6g5i7j7j7j7W-|ad4Y.`1j7b4|ÆZ/i7W-a2j7k7j7j7j7j8k8j7j7j7j7j7d4{aW-i6j7`2]0j7j7a2Y.k7j8j7j7j7k7j7j7j7j7j8j7j7j7k7j7j7j7k7j7j7k7j7j7j8j7j7j7j7k7j7j7j7j7k7j7j7k7j8j7j7j8j7j7k7j7e4|a|ae4j7k8k7j7j7j7k7e5qS|ae4_1_1[/k^1i7h6b3`1d4e4|az\0g5k7e4yS*`2g6hFhFg5d4mIvV^1g5k7e4dEsUa2|afFf6j7g5_:qTe4V-{a2k7j8j8j7k8j7j7j7j8j8j7j7i6X-|ae4i6W-|ae5j7j7a2Z.j7k7k7j8k7j7j8j7k8j7k8j7j7j7j7j7j7j7j7k8k7j7j7j7j7j7j7j7j8j8k7k7j7k8k7k7k7j7k8j7j7j7j7j8j7k7e4|a|af5k7k7k7j7k7j7k8d4nrTg5_1_2`2mQ}T,yS+|әwVa2|awQ*~V-eDhFg5g5hFhGg5i?\7~V,|Z6Y/[/Æ[0k8k7k8_1^1Y._1j8j7k7j8k8k7k8j7k7j8k8j7j8`2^1d4|aX-i6j8j7a2Z.k8j8j7k8j8j7j7j7j8j8j8j7k7j8k8k7k7j7k8j7j8k8j8j7j7j7j7j8j7j8k7j8k8k7j8j7j7j7j8j8j8j8k7k8k7j7e5|a|af5j7k8k8k8k7k8j8a3_:h7_2_1f6kGa3|aĻ`2k7g6hGhFg6c3po_2gFnd4j7k8k7f5gF^9Z.Ǿ҃Y.j7j7k7j7k7j8k8k8j8k8j8j7k8g6hG^:[/a3k8j8j7a2Z/k7k8k7j7j7k7j8j8j8j8k7j8k7j7k8j7k8j7k7k8j7k7j7j7k8j8k7k8k8j8k8j7j7j8k8j8k8k8k8k7k8k7k8j8j8j8f5|a|ae4k8k7j7k8k8k8i7V,É]0k8a3ŷŷa3j8d4jGȾrT`1e4dwP*|᧑}]0i7k8h6hFhFh6i7a3iFØ}b_2c4Y/i6k8k8k7k8]1]1z`b3k8k7k7k8j8k7h6g6i7k7j7k8k8\0Ǿ|zX6^9h5j8k7k7a3Z.k8k7j7j8k8j8k8k8j7k8j7k8k7j8j8k8k8k8k8k8k8j8k7k8k7k8k7j8k8k8k8k8j8k7k8k8k8k8j8k7k8j8k7k8k7k7f5|a|af5k8j8j8k8k8j7_2|ae5k8h6`2[0`2h6k8k8f5`2Y/W-Y/^1f5j8j7c4[0^2e5c4\0X-W.[0b4i7k8j7g6hFhGh6k8k8g6a2Z/W-W.\1e5j7h6a3Z/]1g6k8j8k8k8k8g6^1[/a3f5`:eE_1g6k8k7g6_2`;ra3i8k7j7k7d4o˜xȾ\1k8k8j8k8a3Z/k8k7j8k8k8k8j8k8k8k8j8j8k8k7j8j7k8k8k8k8k8k8k7k8k8k8k8k8k8k8k8k8k8k8k8k8k8k8k8k8k7k8j8k8k8k8f5|a|af5k8k8k8i7d4[0x_ɿ[0j7k8k8j8k8k8k8k8k8k8k8k8k8j8k8k8k8k8k8k8j8k8k8k8k8k8j8k8k8k8k8h6hFhGh6k8k8k8k8k8k8k8k8k8k8k8k8k8k8k8k8k8k8k8k8j8k8k8k8k8b3}]8V-~V-gFqTe5k8k8k8i7W-{ae5k8k8k8k8b3Z/k8k8k8k8k8k8k8k8j8k8k8k8k8j7k8k8k8k8j8k8k7k8k8k8k8k8k7k8k8k8k8k8k8k8k8l8k8k8k9k8k8k9k8k8k8k8f5|as\zS+X-W-W-|T,oǾ҈ap=p=p=p=p=p=p=p=q=q=p=p=p=q=p=p=p=p=p=p=p=p=p=p=q=p=p=q=q=p=p=q>p>p=p=p=q=p=p=p=p=p=p=p=p=q=p>p=p=q=p=p=p=p=p=p=p=p=p>p=p=p=p>p=p=p=p=p=p=p=p=p>p=p=p=p=p=p=q=p=p=p=p=p=p=p=p=p=p=p=p=p=p=p=p>p=p=p=p>p=p=p=p=q=p=p=p=p=p>p=p=p=p=p=p>p=p=p=q=p=p=p=p=p=p=p=p=p=p=p=p=p=p=p=p=p=p=p=p>p=p=p=p=p=q=p=p=p=q=p=p=p=p=p=p=p=p=p=p=p=p>q=p>q=p>q=p=p=q=p>p=p=p=p=p=p=q=p=p=p=p>q>p=p=q>p=p>p=p=p=p=q=p=q=p>p>p=p=q=p=p>p=p=p=p=p>q=q>p>p>p=p=p=p=p=p=p>p=p=p=p=p=p=p=q=p=p=q>q=q=p>p=p>p=p=q=q=p=p>q=p>p=q>p=p=p=p=p=p>p=p>q=p>q=p>p=p=q=q>p=p=p=p>p>p=p=p>p=p=q=p>p=q>p=p=p=p=p=p=p=q=p=p=q>p=p=p>p=p=q=p=p=q=p=p=q=p=p>q=p=q=p=q=p=p=q>p>p=p=p=q=p=p=p=p=p=q=q=p=p=p=q=p>p=q>p=p=p=p>q>p=p=p>q>q=p=q>q=p=p>p=q=q=p>q=p=q=p=q=p=p=p=q>q=q=q=p=q>p>q=p=q>q>p>p=q>p>q>p>q=p=q>q=q=p=q=q=p>q=p=p>p>p>q>p=q>p=p>p=q=p=p=q=q>p=q>q=p=q>p>p>q=p=q>q>p=p>q=q>q>p>p=p=q=p>p=p=p>q=p=p>q>p>p>q>p=p>p>q>p>q=q=p=p>q=p>p>p=p=q=q=p>q=p>q>q=p=q>q>q>q=p>q>q=q=p>q=p=p=q>p=q>p=q=q>q=p=q>p=p=p>q=q>p>q=p>p>p>q=q>p=q>p>p=q=p>q=q>q=q>q>p=p>q>p>p=q=q=p>p>q>p>q=q>q>q>q>p>q>q=q>q>p>q=p=q>q>p>p>q>q>q>p=q=q=q>q>q=q=p=q=p=p>q=q>q=q>q=q>q=q>q>p>p>p>q>q>q=q>q=q=q=q>q>q>p=q>p>q>q=p>q>q=p=q>p>p>q=p>p=q>q>p>q=q>q=q>p>p=q>q>q=p>p=q>q=q=q>p=p=p>q=q>p>p>p>p=q>q>q>p=p=q=q>p>q=p>p>p>q>q=q=q=p>q>q>q>p=p>q=p>p=q>p>q>q>q>q=q=q>p>p>p>q>q=q=p>q>p>q=q>q=p>q>p>p>q=p>q>q=q=p>q>q>q>q=q>q=q>p=q=q>q>q>q>q>q>q>q=q>p>p>q>p>q>p>q>q>q>q=q>q>q=q>q>q>p>q>q=q>q>q>q>p>p=q>q>p=p>q>q>q=q>q>q>q>q>q>q=p>q=q>q>q>q>q>q>q>p>p>p>q>q=q>q>q>p>q>p=q>q=q>q>p>q>q>q>q>p>q=q>q=q>q>q>q>p>q>q=q=q>q>q>p>q=q>q>p=q=q>q>q>q=q=p>q>p>q=q>q>q>q>p>q>q>q>q>q>q=q>q>q>p>q>q>q>q=q>q>q>q>q>p>q>q=p>q>q>q>q=q>q>q>q>p=p>q>p>q>q=p>q>q>q>q=q>q>q>q>q>q>q>q>p>q>q>q>q>q>q>q>q>q>q>q>q>q>q>q>q>q>q>q>p>q>q>q>q>q>q>q>q>q>q>q>q>q>q>q>q>q>q>q>q>q>q>q>q>q>q>q>q>p>q>q>q=q>q>q>q>q>q>q>p>q>q>q>q>q>q>q>q>q>q>q>q>q>q>q>q>q>q>q>q>q>q>q>q>q>q>q>q>q>q=q>q>q>q>q>q>q>q>q>q>q>q>p>q>q>q>q>q>q>q>q>q>q>q>q>q>q>q>q>q>q>q>q>q>q>q>q>q>q>q>q>q>q>q>q>q>q>q>q>q>q>q>q>q>q>q>q>q>q>q>q>q>q>q>q>q>q>r>q>q>q>r>q>q>r>q>q>r>q?r>q>r>q>r>q>q>q>q>q>q?r>q>q>q>q>q?q?q?q>q>q>r>r>q>q>r>q?q>q>r>q>q>q>q>q>q?q>q>q?r>q>q?q>q>q>q?r>r>q?r>q>q>r>q>q>q>q>r>q>r>q>q>q?q>q>q>q?r>q>q>q>q>q>q>q>q>q>q?q>q>q>q?q>q?q>q>q>q>r>q?q>q>q>q>q>q?q>r>q>q>q>r>q>q>q>q?q>q>r>q>q>r>q>q>q>q>q>q>r>q>q>q>q>q?q?q>q>q>r>q?q?r>q>q>q>q>q>r>r>r>q?q?q>q>q>q>q>q?q>q>q>q>q>r>q>q>q>q>q>q>q>q?r>r>q?q>q?q>q>r>r?q>q?r>q>q>r?q>r?q>r>r>q>q>q>q>r>q>q?q?r>q?r>q?q?q>q>q>q>q>r>q>q>q?q>q>r>q>r>q>q?r>q?q?r?r?q>q>r>r>q?r>r?q>r?r>q>r>q>q?q>q>q>q?q>q?q>q?q>q>r>q>q>q>r?q?r>q>q?q?q>q>r?q?r>r>q>q>r>r>r>q>q>q>q>q?q?q>r?r?q?q?r>q>q?q>q>q>q>q>r>r>q>q?r>q?q?r>q>q?r?q>q>q>q>q>q?q?q?r>q>q>q>q>r>q>q?q>r?r>q>q>q?q>r>q?q?q?q?r?r?q?r?q>r?r>r>r?q>r?q>q>r>q?r?q>q?q?q?q>r?r>q?q?q>q?q>r?q>r>r>q?r>q?q?r>r>q>q?q?q>q?r?q?r>r>q>q?r?q?q>r>r?r>q?q>q>r>q?q>r?r?r>r?r>q?r?r?r?r>r>q>r>q?r?r>r?q?r?q?q?q?q>r>r>q>q?q>r?q>q>r>q?r>r>q?r?r?r>r>q?r>r>r?q?r>q>r?q>q>r?q>q?r?r>q?r?r?r>q>q>r>q?q>r>q>r?r>q>r?q>q>q?q>q>r?q>r>q>r>q?r?r?q>r>r>q>r?q>r>q>r?q?r?r?r?q>q?r?r>r?q?r?q?r>q?q?r?q?r?r>r?r?q>r?r>q>q?r?q?r?r?r?r?r>r?r?r?r?r?r?q?r>r?r>r?r?r?r>q?r?q>r?q?r?q?r>q>r?q>r?r?r?r?q?q?q?r?r?r?r>q?q?r?q>r>q>r?r?r?r?q?q?q?r>r?r?r?q?r?q?r>q?r?r?r>r?r?q?q>r>q?r>r?r>r?r>q>r?r>q>r?r>q?r?r>q?r>r?r>r?r?q?q?q?r>r?q?q?r?r>q?r?q?r?q?r>q?r?q?r?q?r?q?q?r?q?r?r?r?q?r?r>r?q>r?r?r?q?q>q?q?r?r?q>r?r?r?q?r>r>r?r?r?r?r?r?r?r?q?r?r?r?r?r?r?q?r?r?r>r?r>r?r?r?r?r?r?r?r?r?r?r?r?r>r?q?r>q?r?q>r?r>r>r?r?r?r>r?r>r?r>r?r?r?r?r?r?r?q?r?r?r?q>r?r?q?r?r?r?r?r?r?r?r?r?r?r>r>r>r?r?r?r?r?q?r?r?r?r?q>r?r?r?r?r?r>r>r?r>r>r?r>r>r?r?r?q?r?r?r?r?q?r?r?r?r?r?r?q>q?r?r?r?r?r?q?r?q?q?r?r>r?r?r?q?r?r?q?r?r?q?r?r?r?r>q?r>r?r?r?r?r?r?q?q?q?r?q>r?r?q?r?q>r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?s?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r@r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r@r?r?r?r?r?r?r?r?r?r?r?r?r?r@r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r@r?r?r?r?r?r?r?r@r?r?r?r?r?r?r?r?r?r?r?r?r@r?r?r?r@r?r?r?r?r@r@r?r?r?r?s?s@s?r?r?r?s?r?r?r@s?r?r?r?r?r?r?r@s?r?r?r?r?r?s?s?r?r?r?r?s?r?r?r?r?r?s?s?r?r?r?r@r?s?r?s?r?r@r?r?r?r?r?r?r@s@r?s?s?r?s?s?r?s?r?r?s?r?r?r?r?r?r?r?r?r?s@r?r?r?r?r@s?r?r@s@r?s?r?r@r@r?r?s?r?r?s?r?r?s?r@r?r?r?r?r?s?r@r?s?r?r?s?r?r?s?s?r?r?r@r@r?r@s?r@r?r@r?r@r?r?s@r?r@r?s?r@r?r?r?r?s?r?s?s@r?r?r?r@r@r?r?s?r?r@r?r?r@s@r@s@r?r?s@s?r?r?r@r?r@r@r@r?r?r?s?r@r?s@s?r@r?r@r?r@r@r@s@r@s?r?r@r@s?r@s?r?r@r?s?r?r@s?r@s@s@r@s?r@r?r?r@s?r@s@s@r?r?r@s@r?s@s?r@s@r?r?r?s@r@s?r?r@r?r?s@r@r@r@r?s@r?r?s?s@s@r@r?s?s?r?r@r@r@r?r?r?s@r?r?s@s?r?r?r@s?s?s?r?r@s@s?r@r?r@r?r?r?r@s?s?s?s?r@r@r?s?r?r?s@r?r?r@s?s?r?r@r@r@s?r?s?r?r?r?r?r@r@r@r?r?r?r?r@r?r?r?r?r?s@s?s@s?s?s?s@r@s@s?r@r?s?r@r?s@r@r?s@s@r?s?s?s@s@s?s?s@s@s@s@s@r?s@s?r@s@s@s@r@r?s?s@s?s@r?r@s?r?s?s?s@r@r?r?s?r?s@s?s?s?s@s@r@s@s?s?s@s@r?r?r?r@r?s?s@s?s@r@s@r?r@r?s@s@r@r?r?s?r@s@s@s?s?r?r@s@r@s@s?s?s@s@s@r@s?s@s@r@s?r@s@s@r@s?s?s?s@s?s@s@r?r@r?s?r?s@s?r@r@s@r?r@s@r?r@r?r@r@s@r?s@r@s?s@s@r@r?s@r?r?r@r@r?s@r@s@r?r@r?r?r@r?r?r@s@s@r@s@s@r@s@s@r?r@s?r@r@r@s@r@s@s@r?s@s@s@s@s?s@r?s@s@s@s@s@r@s?r@s@s@r@s?s@s@s@r@s@s@s@s@s?r@s?r@s@r@s@s@s@r@s?s@s@s@s@s@r@s@s@s@r@s@s@s@r@r@r@s?s?s@r@r@s@s?s@r@r?s@s@s@s@s@r@r@s@s@s@s?r@s@s@r@s?r?r@r@s@s@s@s@s@s@s?s@r?s@s?s@r@s@s@s@s?s?r@s@s@r@s@r?s@s?s@s@r?s@s@s@s@s@s@s@s@s@s@s@s@r?s@r?r@s?s?s@s@s@s@s@s@s@r?r@s@s@s@s?s@r@s@s@r@s@s@s@s@s@s@s@s@s?s@s@s@s@s@s?s@s@s@s@s@s@s@s@s@s@s@s@r@s@s@s@s?r@s@s@s@s@s@s@s@s@s@s@s@s@s@s@s@s@s@s@s@s@s@s@s@s@s@s@s@s@s@s@s@s@s@s@s@s@s@s@s@s@s@s@s@s@s@s@s@s@s@s@s@s?s@s@r@s@s@s@s?s?s@s?s@s?s@s@s@r@s@s@s@s@s@s@s@r@s@s@s@s?s@s@r@s@s@s@s?s@s@s@s@s@s@s@s@s@s@s?s?s@s@s@s@s?s@s@s@r@s@s@s@s@s@s@s@s@s@s@s@s@s?s@s@s@s@s@s@s@s@sAs@s@s@s@s@s@s@s@s@t@sAs@s@sAsAs@s@s@s@s@s@s@s@s@s@s@s@s@s@t@s@sAsAs@s@s@t@s@s@s@sAs@s@t@s@s@t@s@s@s@t@s@t@s@t@s@sAs@t@s@s@s@s@sAt@s@s@s@s@s@t@t@s@s@t@s@s@s@s@s@s@s@sAs@s@s@sAs@s@s@s@s@s@sAs@s@sAs@s@s@s@s@s@sAs@t@s@s@s@s@s@t@s@s@s@s@s@s@t@s@sAs@s@s@s@s@s@s@tAs@s@s@s@s@s@s@sAs@s@s@s@s@s@tAt@s@t@s@tAs@s@s@s@s@s@s@s@s@s@s@s@t@t@tAs@s@s@s@t@t@s@t@sAt@s@sAsAs@s@sAs@t@s@s@t@s@s@t@sAs@sAsAsAs@sAs@s@sAs@s@t@s@s@t@s@sAt@s@s@s@sAs@s@sAt@s@s@s@s@s@sAs@s@s@s@s@s@s@s@sAtAs@sAt@sAs@s@t@sAs@s@sAs@s@t@tAs@tAs@tAs@s@t@t@tAs@sAt@s@s@s@s@s@sAs@sAs@tAsAt@s@s@s@s@s@s@s@t@s@tAs@sAt@s@s@s@s@t@sAsAsAs@s@s@s@s@t@s@t@s@t@s@sAsAs@s@tAs@s@s@sAs@s@t@s@t@s@s@t@sAs@s@sAt@s@s@s@t@t@tAs@sAt@s@s@t@s@sAsAs@tAtAtAt@s@tAs@t@s@t@tAs@sAs@tAt@tAs@tAsAt@sAs@t@sAt@tAs@t@s@tAsAt@tAsAtAsAs@tAs@s@tAs@t@s@sAt@sAsAtAs@sAsAsAtAs@tAs@tAtAsAt@s@s@tAtAs@tAtAtAsAs@t@sAsAt@sAs@t@s@s@sAsAsAt@s@tAsAsAtAtAtAs@sAtAs@tAsAtAsAs@s@tAtAsAtAtAsAt@s@sAt@t@tAtAsAtAtAtAsAsAs@t@s@sAs@t@t@s@t@t@tAsAs@tAsAsAt@tAs@sAt@t@t@t@s@s@t@s@s@sAtAs@sAtAs@tAtAt@tAt@sAtAsAtAtAt@s@sAs@tAtAt@sAt@tAtAt@t@tAtAsAtAtAsAt@tAtAsAtAsAs@s@sAtAs@sAtAt@s@t@s@tAs@t@s@tAsAtAt@t@tAt@tAsAsAtAtAtAsAtAsAt@tAtAsAsAsAtAsAtAtAtAtAt@sAtAt@sAsAtAt@tAs@sAt@tAsAt@tAt@sAtAtAt@tAtAtAtAsAsAt@t@s@tAsAsAtAtAtAsAt@tAtAsAt@tAsAt@tAs@tAtAtAtAs@sAsAsAsAsAsAtAsAtAs@tAs@sAt@sAtAsAsAt@t@tAtAtAtAtAtAtAt@tAtAtAs@tAsAtAtAt@tAs@tAs@tAtAtAt@tAtAtAtAtAtAtAt@t@tAtAsAt@sAtAtAtAsAtAtAtAtAtAtAtAtAtAsAtAsAs@tAt@tAtAtAsAtAtAtAtAt@tAtAtAtAtAtAtAtAtAs@tAtAtAsAt@tAsAtAtAtAtAtAtAtAt@tAtAtAtAtAtAtAtAt@tAsAtAtAt@tAtAtAsAsAtAtAtAtAtAtAtAtAtAtAsAsAtAt@tAsAtAtAtAtAt@tAtAtAsAt@tAtAtAtAtAtAtAt@tAtAt@tAtAtAtAt@tAtAtAtAt@tAt@tAtAsAt@sAtAsAsAtAtAtAtAtAtAtAtAtAtAtAuAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAuAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAuAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAuAtAtAtAtAtAuAtAtAtAtAuAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAuAuAtAtBtAtAtAuAtAtAtAtBuAtBtBuBtAtBtAuAtAtAtAtAtAuBuAtBtAtAuAtAtBtAtAuBtAuAtBtBuAtAtAuAuAtBuBtAtAuAtAtAtBtBtAtAtAuBtAtAtAtAtAuAtAtAtAuAtAtBuAtAtAuBuAtAtAtBtAtAtBtAtAtAtAtAtAtAuAuAtAtAtAuBuAtAtAtAuAtAuAtAtBtAuBuAuAtAuAtBtBtAtBtAtAtAtBtAtAtAuAtAtAtAuAtBtAtAuAuAuAuBtBtAuBtAuAtAuBtBuAtAtAtAuBuAtAtAtBuAtAtAuAtAuAtAtBtAuAtBtAtBuAuAtAuBuAtAuBtBtBuBtAuAtBuBtAtBuAtBuBuAtBuBtAtAuAuAuBtAtAtAuAtAuBtBtAtBtAtBtAuAtAtAuAtBtAuAtBtBtAuBuBtAtAtAuBtAuBuBuAtAuAtBtAtBtBuBtBtBtAtAtAuBuBuAtBuAtBtBtBtAuAtBtBuBtBtBtAuBuAtAtBuBuBuBtAuAtBuBuBuAtBtAtAtBtAtAtAuAuBtAuBtBtAuAtBtBtAtAuBtAtBtBuAtBuBuAuAtAtBuBtBuAtBtBtAuBtAuAtBtAuAuAuAuAtAtAtAuAtAtAtBuBuAuAuAuAuBtAuBtAuAuBuBtBuAuAuBuBuBuBuAuBuBtAtBuAtBuBuAtBtAuBtBuBuBuAuBuBuBtBuAtBtBuAuAtAuBuBtBtBuBtBuBuBuBuAuBuBtBuBtBtBtAuAtBuBtAuAuAtBuBuAtBuBuBuBtBuBuBtAtBuAuAtBtBuBuBuBuAuAuBuBtAtAuBuBuBuAtAtBuAtAtBtBuBuBtBuAtAuBuAuAuAtBtAtAtAtAtBtAtBuAuBtBuBtBuBtBuBuAtBtBtAtAuBuBtBuBuBtAtBuAuAuAtAuAuBtAtBuBtAtAuBtAtAuBuBtBuBtBuBuAuAuAtBuBuBuAtBtAuBtBtBtAuAtAtBuBuBuBuBuBuBuBuBuAuBtBuBuBtBuBuBuBuBuBuBtBuBuBuBtBuBtAuBuBuBuBuBuBuBtBtBtBuBuBtBuBuBuBuBuBuBuBtBuBuBuBuBuAtBuBuBuAuBuBuAuBuBuAuBuBuBuAuBuAuBtBuBuBuBtBtBuAuBtBuBuBuBuAtBtBuBuBuBuBuBtBtAuBuBuBtBuAuBuAuBtBuBuAuBuBuBtBuAuBtBuBuBtAuBuAuBuAuAuBuBuBuBtBtBuAuBuBuAuBuBuBuBuBuBuBuBuBtBtBuBuAuBuBuBuAuBuAuBuAuBuAuBtBuBuBuBuBuBuBuBuBtBuBuBuBuBuBuBuBuBuBuBuBuBuBuBuBuBuBuBuBuBuBuBuBuBuBuBuBuBuBuBuBuBuBuBuBuBuBuBuBuBuBuBuBuBuBuBuBuBuBuBuBuBuBuBuBuBuBuBuBuBuBuBuBuBuBuBuBuBuBuBuBuBuBuBuBuBuBuBuBuBuBuBuBuBtBuBuBtBuBuBuBuBuBuBuBuBuBuBuBuBuBuBuBuBuBuAuBuBuBuBuBuBuBuBuBuBuBuBuBuBuBuBuBuBuBuBuBuBuBuBuBuBuBuBuBuBuBuBuBuBuBuBuBuBuBuBuBuBuBuBuBuBuBuBuBuBuBuBuAuBuBuBuBuBuBuBuCvBuBuBuBuBuBvBvCuBvBuBuBvCuBuBuBuBuBuBuBuBuBuBuCvCuBuBuBuBuBuBvBuBuBvBuCuBvBuBuBvBvBuBuBuBuBuBuCuBvBuCvBvBuCuBvBuCuBuBvBuBvBuBuBuBuCuBuCuBuBuBuBuBuBvBuBuBvBuBuBuBuCvBuBuBuBuCvCuCuBuCuBuBvBuBuBuCvBuCuBvBuBvBvBuBuBvBuBuBvBuBvBvBvBuBuCuBuBuBuBuBuCvCuBuBuCvBvCuBuCvBuBuBuBvCuBuBuBuBuBuBuBuBuBuBuCuBvBuBvBuBvCuCuBuBuCvBuBuBuBuBuBuBvBuBvBuBvBvCvCvBuBuCuBuBvCuBuBuCuBvCuBuBvBvBvCuCuCuBvBuCuBuCuBvBvCuCuCvCvBvCuCuBvBuCvBvBuCvBuBuBvCuBuBuBuBuCuBuBvBuBuCuBuCvCuBuBuBvBuCvCuCuCvCvBuBuCuBuCuBvBuBuBuBuBuBvBvCuBvBuBuCvCuCuCvCvBvBuCuCuCuBvBuBvCuBvBvBuBuCuCuBuBvBvBuCvBvBuBvCvCuBuBuCuBuBuBuBvBvBuCuCvCuCvCuBuBuBuCvCuBuCuCuCvBuCuBvBuBvCuCuBuBvBvCvBvBuCuBuBuBvBuBuBvCvBuBuBvBuBvBuBvCuBvCuCvCvCuBuBuCvCvCvCvCvBvBvCuCvBvCvCvCuCvCvCuBvCvCvBvBvCuBuCuBuCuCuCvBvCvCvCvCuCuCuCvCvBuCvBuBuBuCvCvCuBuBvCvCvBvBvCvCuBvBuCuCuCvBvBvCuBvBvCvBuCvBuBuCuBvBvBuBvCuCvCvCuBuCvBvBuCvBvBuBuCvCuCuBvBvBvBuBuBuBvCuBvCuCvCvCvBuBvBvCuBuCuCvCvCuBuBvBuCuCuBvBvBvCvCvCvCvCvBvBvCuCuCuCuBvCvBuCvBuBuBuBuBvCuBuBvCvBuCvBuCuCuBuBvBvCuCuCvBvCuCvCuCvBuCvCvCvCvCvCuCvCvCvBuCvCvCvCvCuCuCvCvBvCvCvBuCvCvCvBvCuBvCvCvCvBvCuCvBvBvCuCvCvCvCuBvCvCuCvBvCvCvBuBuBvCvCvCvCvBvCvCvCuBvCvBvCvCvCvCvCvCuCuCvBvCvBuCvCuBuCvCuCuCvCvCvCvCvBvCuCvCuCuCvCuCvCvBvCvCvBvCuCvCvCvCvCvCvCvCuCuCvBuBvBvCvCvCuCuCvBuBuCuCuCvCuCuBvCvCvCvCvCuCuBvBvBvCvCvBvBvCvCvCvCvCvBvCvCuCvCuCuCvCvCvCvBvCvCvCvCvCvBvCvCvBvBvCvCvCvCvCvCvCvBvCvCvCvCvCvBvBvBvCvCvCvCvCvCvCvCvCvCvCvCvBvCvCvCvCvCvCvCvCvCvCvBvCvCvCvCvCvCvCvCvCvCvCvCvCvCvCvCvCvCvCvCvCvCvCvCuCvCvCvCvCvCvCvCvCvCvCvCvCuBvCvBvCvCvCvCvBuCvCuCvCvCvCvCvCuCvCvCvCvCvCvCvCvCvCvBvCvCvCvCvCuCvCvCvCvCvCvCvCuCvCvCvCvCvCvCvBvCvCvCvCvCvCvCvCvCvCvCvCvCvCuCvCuCvCvCvCvCvCvCvCvCvCvCvBvCvCvCvCvCvCvCvCvCwCvCvCvCwCvCvCvDvCvCwCvCvCvCvDvCvCvDvCvCvCvCvCvCvDvCvCvDvCvCvCvCwCvCvCwDvCvCvCwCvDvCvCwCvCvCwDvCvCwCvDvCvCvCvCwCvCvCvCvCvCvCvCvCvDvCvCvCvCwCvCvDvDvCvCvCvCvCvCvCvCwCvCwCvCvCvCvCvCvCvCvCvCwCvCvCvCvCvCvCwCvCvCwDvCvDvCvCvCwCvCvCvCvCvCvCvCvCvDvCvCvCwCvCvCvCvCwCvCvCvDvCvCvCvDvDvCwCvCvCvCvCvCvCvCvCvDwCvCvCvCwCvCvCvCvCvCvCwDvCvDvCvCwCvCwCwCwDvDwCwCwCvCvDvDvDwDvDvCwCwCvCvCvCvDvDwDvCvCvCwCwDvCwDwCwCwCwDwCwCvDvCwDwCvCwCwDvCvDvCvDvCwCvDvDvCwDwCvCvCwCvCvCwCwCwCvDvDwCvCwCvCvDvDvCvCwCwCwCwDvDwCvCwCvDwDvCvCvCwCvCvCwDvCvCvDvDwDvDvCvCvCwCvDvCwCvDwDvCwCvCvDvCvCvCwCwCvDvCvCvCvDvCvDvDwCwCvCwCvCvDvCvCvCwDvDwDvDvDvDvCvCvCvCvCvCvCwCvDwDvCvCwDvCwDwDvCvCwCvCvDvCvDwCvDvDvDvDwCwCvCvCwDvDvCwCwDvDvDwCwCvCwCvCvDvDvDwDwCwCvCvCwDvDwCvDvDwCvDvDwDwDwDvDwCvCvDvCvDvDvCvCvDvDvCwCwDwCvCwDwCwCvCvDwCwCwDvDwCwCwCwCvCwCvDvCvCvDwCvCwCvDvCvCvCvCwCwCvDwCwDvCwDwCwCvDvCwCwDvCvCvCvCwDwDwCwDwCvCvDvCwDvDvDvDwCwDvDvDvCvCvDwCwCvDvCvCwCwCwDwCwDvDwDwDwCvCwDvCvDvCwCwDwDvDwDwCvCwCwDwCvCvDvDvDwDwDwCvCvCvDwCvDwDvDvDwDvDwDwDwDvCwDwCwCwCvDwDwCvDvDwDvDwDwDwDwCwDwCvDvDwDvDwDwCwDwDwCvDwDvDvDwDwDwDvDvCwDwDwDwDvCwCvDwDwDwCwDvDvCvDvDvCwDwDwDwDwDwDvDwCvDwDwCwDwDwDvCvDwDvDvCwDvCwDwDwDvDvDwDwDwCwCwDwDvDwCwDwCvDwDvDvCwDwDwDwCvCvDwCvDwCwDvDwCwCwDwCwCvCvDvDwCvCwDwCwDvCwCwDwDvDwDvDwDwDwDwDwCwCwCvDwDvCwDwDwDwCwDwDwDwDwDwCvDwCwDwDwCvCwDvCwCwDvCvDvCwDvCwDwDwDwDwDwDvDwDwDwDwDwDwDvDwDwDvDwDwDwDwDwDwDwDwDwDwDwDwDwDwDwDwDwDvDvDwDwDvDwDwDwDwDwDvDwDwDwDwDwCwDwDwDwDwDwDwDwDwDwDwDwDwDwDwDwDwDwDwDwDwDwDvDwDwDwDwDvDwDwDwDvCwCvDwCwDwCwDwDwCwDwDwCwDwDvDwCwDwDwDwDvDwDwDwDwDwDwDwDwDwDwDwDwCwDwDwDwDwDwDwDwDwDwDvDvDwDwDvDwDwDvDwDvCwDwCwDvDwDwDvDwDwCwDwDvDwCwDwDwDwDvDwDvDvDwDwDwDwDwDwDwDwDwDwDwDwDwDwEwDwDxEwDxDwDwDwDwDwDwDwDwDwDxDwDwEwDwDwDwDwEwDxDwDwDwDwDwDwDwDwDwDxDwDwDwDwDwDxDwDwDwDwDxDwDwEwDwDwDwDwDwDwDwDwDwDwDxDwDwDwDwDwDxDwDwEwDwDwDwDwDwDwDwDwEwDwDwDwDwDwDwDwDxDwDxDwDwDwDwDwDwDxDwDxDwDwDxEwDwDwEwDwDxEwDwDwDwDwDwDwDwDwEwEwDwDwDwDwDwDwDwExDwDwDwDwEwDwDwDwDwDwDwEwDwEwDwDwDwDwDwDwDwDwDwDwDwDwDwDwDwEwDwDwDwDwDwDwDwDxDwDxDxDwDwDwDwDwEwDwEwEwDwDwDwDwDwDwEwDwDxDwDwDwDwEwDwDwDwEwDwEwExDwDwDwDwExDwDwDwDxDwDxDwExExDwEwDwDxDwDwDwDwEwExDwEwDxDwExDwDwExDwExDwEwDwDwDwExEwEwDxDwDxDxEwEwDwEwDxDwDwEwDwDwDwEwDxEwDwDxDxEwDwDxDxDxEwDwDxEwDwEwDwDxDwDxDwDxDxDwDxEwDwDxDxDxDwDwDwDwDwEwDwDwExEwEwDxExDwEwDxDxDwEwDwDwDwDwDwExEwEwDwDwDwExExDwDxDxDxDwDwDxDwDwEwExEwDwExEwDwDwDxDwExDwDxEwExDxDwDxDxExExEwDxEwDwDwEwDwExEwExExDxExDxEwEwEwExDwEwEwDxDwDxExDwDxExDxEwDwDwExExExDxEwExDwDwEwDwEwEwDwDxDwExDxDwDxDwDxDxDwDwExDwDwDxExDwDxDxDxEwExDwEwDwDxExExEwDxDxExExDxExEwEwDxDxDxDwDwDxExExDwDxExDwDxExEwDxExDxDxEwDxDwDxDxEwExDwDwExExDwDxExEwExEwDxExDxDwExDwDxDwDwExDwDwEwDwDxExDxDwExDwDwExDwEwExDwEwExExExEwDxEwEwExEwExExDxDxEwDxExDxDwDxExEwExEwDxDwExEwEwEwEwDxEwExDxExDxDxDxEwEwExExExEwEwEwExExEwEwEwEwDxExExDxExExExEwDxEwEwDxEwExEwEwDxDxEwExEwEwEwExExExDwExEwExExEwDwDwDxDwExExExExDxExDxEwEwEwExExExEwEwEwExEwEwExDxExExEwDxEwEwExEwEwEwDxDwDwDwExExDxEwDxExExDwExDwDxDxExExExEwEwEwDxDxEwExExEwDxEwExEwEwDwExExExDwExExEwEwExExExExExExExExExExEwExExDxExExExExDwExExExExExExDxExExExExExExEwEwDxEwExExExExExExExExExExExEwExExExExDwDxExEwExExExEwExExExExExExExExExEwExExExExExExDwExEwEwExEwEwExExExExEwExDxExEwExDxExEwExExDxEwExExExExExExExExEwExExExExEwExExExExExExExExExExExExExExExExDwExExExExExDxDxExExExEwExExExEwExExExExExExExExEwExExEwDxEwExExExEwExExExExExExExExExExExExExExExExExExExExExExExExExExExExEyExExExFxExExFxExExExExExExExExExExExExExExExExExExExFxEyExExExEyExFxExEyExExFxExExExExEyExExEyExExExExExExFxExExExExExExExExExExExExFxExExExExExExExExExExFyExExExExFxExExExExExExExExExExExExExExExExExExExExExExExExExExExExExExExFxFxExExExExExExExExExExExExExExExExEyExEyExFxEyExFxEyExFxFxEyExExExExEyEyFyEyExExFxEyFxFxExEyEyExFxExExFxExFxExExExEyEyExExFyFxExFyFxExExExExExExFyEyFyExFxFxFyExFxExExExExExExExExExExFyFyExExFxExExFxFxExExExExExExFxExEyExEyFyExExEyEyExExFxFxFxFxFyExExEyEyFxExExExExFxExExExExEyExExEyExExEyEyEyExExEyExFxExEyFxFxFxEyExEyFxExExExExExEyExFxExFyFxFxEyExExEyExExEyFyExEyFxExExEyEyFxFyExFxExEyEyExFxEyExFyEyEyFyFyFxExExExFxEyEyEyFxFyExFyFyExFxExFyFxExFxEyFxEyExExEyEyExFxFyFxEyFxEyFxEyEyEyExFxExEyFxFyFxEyEyFyFyFxEyExFyExFxFyEyExFxFyExFyFxEyExExFyExEyExExExEyEyFxFyExFyExExEyFxEyFyFyFxFxExExExEyFyFyExFyFxExFxFyExFxFxFxExFxEyFxEyExFyFxExExFyFyExExExFyEyEyExEyFyEyFxFyFxExEyExFyExExExFyFxFyExFxEyExEyFxFyEyFxFyFyExEyFxFyFxFyFxExFyEyEyFxExFxFxFxFxExExFxFxEyEyEyEyEyFxFyFyFyFyFyExFyFyFyEyFyEyEyFyFyFyExFyFyEyFyEyFxEyExEyExFyFyFyEyFyFyEyFyEyFyEyFyFyFyFyFyExExExExFyFyExFyEyEyFxFxExExEyExFyFxEyFxFyFxFxExEyEyFxFyFyFyExFxEyFyEyEyFyFxFyFyEyFyFxFxFyFxFxEyFyFyFxExEyFxExEyEyFxFyExFyEyExExEyEyFyFxEyFyFyFyFyEyExFyFyExExExFxFyEyFyExFyFyFyFxFyFyFyFyFyFyFyEyEyFxFyFyFyFxFyFxFyFxFyFyFyEyFyFxFyFyFyEyFxFyFyFyEyFyFyFyFyFxFyFyFyEyFxFyFyFyFyFyFyFyFyFyEyFyFyFyFyFyEyFyFyFyFyFyFyFyFyFxFxFyFyFyFyFyFyFyFyFxFyFyFxEyFyFyExEyFyFyFyFyFyFyFyFyFyFyFyFyFyFyFyFyFxFyEyEyEyFyFyEyEyEyFyFyFyFyExFyFyFyFxFyFxFyFxFyFxFxFyFyFxFyFxFyFyEyFyFyFyFyFyFyFyFyExFyFyFyFyFyFyFyFyFyEyEyFyFyEyFyEyFyFyFyFxFyFyFyFyFyGyFyFyFyFyFyFyFyFyFyFyFyFyFyFyFyFyFyFyFyFyFyFyFyFyGyFyFyFyFyFyFyFyFyFyFyFyGzFyGyFyFyFyFyFzFyFyFyFyFyFyFyFyFyFyFyGyFyFyFyFyFyFyFyFyFzFyFyFyFyFyFzFyFyFyFyFyFyFyFyFyFyFyFyFyFyFyGyFzFyFyFyFyFyFyFyFzFyFyFyFyFyFyFyFyFyFyFyFyFyFyFyFyFyFyFyFyFyFyFyFyFyFyFyFyFyFyGyFyFyFyFyFyFyFyFyFyFyFyFyFzFyFyFyFyFyFyFyFzFyFyFyFyFzFyFyFyFyFyFyFzFzFyFyFzFyFyFzFyGyFzFzFyFyFyFyFyFyFyFyGzFyFyFyGyFyFyGzFyFzFyFzGyGyGyFzFzFzFyFyFyFzFyFyFyFyFyFyFzGyGyFyFyFyGyFyFzFyGzFyFyFyFyFyGyFyFyFzFyFzFyFyGyFyFzFyFyFyFyFyFyFyFyGyFyFyGyGyFyFyFyFyFyFzFyFyFyGzFyFyFzFzFzGyFyFyFzFzGyFyFyFyGzFyFzFyGyFyFyFyGzFyGyGzFyGzGyFyFyGyFyFyFyFyFyFyFyFyFyFzFyFyGyGyFyGyFyGyFyGyFzFyFyFzFyFyGzFyFyFzFyFyGyGyGyFzGzFzGyGzFyFyFzFyFzGyGyFyFyGyGyFzFzFyFyFyFyGyFyGzGzGzFyFyFzFzGzFyFzGzFyFyGyFzGzFyFzFyGzGzFyFyGzFyGzGyGzFzFzGzGzFzGyFzGyFzGyFyFzFyFzFzGyGzGyGzFyGzGzGzFzGyFyGzGyFyGzGzGyGzFzGzFyGzFyFyFzFyFzFzGyFyGyFzGzGzFzGyGyGyFzFyGzFyFzFyFyFzGzGzGzFyFyGyGyFzFzGyGyFzFzFzFyFzFyFyGyFzGzFyFyGzFyGyFyFzFzGyGyFyFyFyGyFyFyGzGzGyFyFyFyGyGzFyFyGzFyGyFyGyGyFyGyFyGyGzGzGzGyGzFzGzGzFyFyGyGyGyGyGyFzFyGzFzGyGyGyFzGyFzGzFyGzGzFyFyFyFzGyGzFzGyFzGzGzGzFyGzGzFzGzFzGzFzFyFyGzFzFzFyGzGzFyFyGyGzGzGzGyGyFyGzGyGyFyGzGyFyGzGzGzFyGyGzGzFzGyFyGyGzGyGzFzGyGzGyGzGzFzFyGyGzGyFzFzFzGzGzFzFyGzFzFyFyFzFzFzGzGyFzFyGyGzGzGzGzGzFyFyFyGzGzGzFyGzGzGzGyGzGzGzGzGzFzGyGzGzGyGyGyGzGzFyFzFzFzGzGzGzGyGzFzFyGzGzGyFzGzFzFzFzFzGzGzGzGzGzGzGzGyGzGzGzGzGzGzGzGzGzGyGzGzFzGzGzGzGzGzGzGzGzGzFyGzGzFzGzGzGzFzGyGzGzGyGzGzGzGyGzGzGzGzGzFzGzGzGzGzGzGzGzGzGzGyFzGzGzGzFyGzGzFzFzGzGzGzGzGzGzGzGzGzGzGzGzFzGzGzGzGzFzGzGzGzGyGzGzGzGzFzGzGzGzFzGzGzGzGzGzGzGyFzGzGzGzGyGzGzGzFzGzGzGzGzGzGzGzGzGzGzGyGzGzGzGzFzGzGzGyGzGzGyGyGyGzGzGyGzGzGzGyGzGzGzGzGzGzGzGzGzGzG{G{G{GzGzGzGzGzGzGzGzGzGzGzGzGzHzGzG{GzGzGzGzGzGzGzH{GzHzGzG{GzGzGzGzGzGzGzGzHzGzGzGzGzGzGzGzGzGzGzGzHzGzGzGzGzG{GzGzGzGzGzGzGzGzGzGzGzG{GzGzGzGzGzG{GzGzGzGzGzGzGzGzGzGzGzGzGzGzGzHzGzGzGzGzHzGzGzGzGzGzGzGzGzGzGzGzGzGzGzGzHzGzGzGzH{GzGzGzGzGzGzGzGzGzG{GzGzGzGzG{GzGzGzGzGzG{GzGzGzGzGzGzGzGzGzGzHzGzGzGzG{GzGzGzGzGzGzGzGzG{GzGzG{HzGzHzGzGzG{GzGzGzGzGzGzH{G{G{G{GzHzG{HzGzGzGzGzH{GzGzHzH{GzHzG{GzGzGzG{GzGzHzGzGzGzGzHzGzGzH{GzGzGzGzHzHzGzHzHzGzGzGzHzH{HzGzGzHzGzGzG{GzHzGzGzHzHzHzGzGzGzG{GzGzGzGzG{GzGzH{HzG{G{GzGzHzGzGzHzGzGzGzGzGzGzGzH{G{GzG{HzGzHzHzGzGzGzGzG{GzG{GzGzGzGzHzGzGzG{G{GzH{GzGzGzG{GzHzG{HzH{G{GzG{GzGzHzGzGzHzHzG{GzGzHzHzG{G{G{GzG{GzGzGzG{G{G{G{G{HzGzG{HzH{G{H{HzGzH{G{G{GzH{HzG{GzHzHzG{H{G{HzHzG{HzG{G{HzH{H{H{G{H{GzGzGzH{G{HzG{H{H{HzG{G{GzHzH{GzG{G{GzHzG{HzGzGzHzG{H{GzHzG{GzG{G{G{HzGzG{H{GzGzG{GzGzGzH{GzHzGzH{HzGzHzHzGzHzHzH{GzH{GzHzGzHzH{H{H{H{H{HzGzGzHzHzH{G{HzGzG{G{GzG{GzG{H{HzGzG{GzGzG{HzGzG{HzGzH{GzG{HzG{GzG{H{HzG{GzGzH{HzGzHzGzH{H{GzGzG{H{G{GzGzHzHzGzG{G{G{G{HzHzGzH{H{G{G{H{HzG{H{G{H{GzH{GzG{H{H{G{HzH{HzG{G{HzGzGzH{HzH{H{HzHzG{G{H{H{H{H{HzH{H{GzHzHzH{HzH{H{H{GzHzH{HzGzH{HzH{GzH{H{GzHzHzHzH{H{H{GzH{H{G{GzH{G{H{GzHzG{GzH{H{GzGzH{HzH{H{HzH{H{G{G{G{G{HzG{G{HzH{H{H{G{H{G{HzH{HzGzH{H{GzH{H{HzHzG{H{HzHzH{H{H{G{GzHzHzH{HzGzGzHzG{G{H{H{G{G{H{H{H{G{HzG{GzGzHzG{G{GzG{H{G{G{G{H{H{HzH{H{H{H{G{H{HzH{G{H{G{H{HzGzH{H{H{HzHzG{H{H{H{H{H{H{H{H{HzH{H{H{H{G{H{G{H{HzG{H{H{H{H{H{H{G{H{H{H{H{H{HzH{H{H{H{H{H{H{G{H{HzH{H{H{H{HzH{H{H{H{H{H{HzHzG{GzH{HzH{H{G{H{GzH{HzG{H{H{G{H{H{H{HzG{H{H{H{G{HzH{H{HzG{H{H{H{H{H{H{H{H{H{G{H{H{H{H{HzG{HzH{H{H{H{H{H{H{H{HzGzG{H{G{H{H{G{HzH{H{H{G{H{G{H{H{HzH{H{H{H{H{H{H{H{H{H{H{H{G{H{H{GzH{H{H{H{H{I{H{H{H{H{H{H{H|H{H{H{I{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{I{H{H{H{H|H{H{H{H{H{H{H{H{H{H|H{H{H{H{H{H{H|H{H{H{H{H{H|H{H{H{H{H{H{H|H{H{H{H{H{H|H{H{H{H|H{H{H{H{H{H{H{H{H{H|H{H{H{H{H{H{H{H{H{H{H{H{H{I{H{H{H{H{H{H{H{H{H{H{H{I{H{H{H|H{H{H{H|H{H{H{H{H{H{H{H{H{H{H{H|H{H{H{H{H{H{I{H{H{H{H{H{H{H{H{H{H{H|H{H{H{H{H{H{I{H{H{H{H{H{H{H{H{H{H{H{H{I{H|H|H|H|I{I|I{H|H{I{I{H{I|H|H{H{H{I|H{H{I|H{I|H{H{H{H{H|H{H|H{I{H{H{H{I{I|I{H{H{H|H{H{H{H{H{H{H{H{H|I{H{H{I{H{H{I{H{I|H{I{H|I{H{H|H{H|I{I{H|I{I{H{I{I{H{H{H{H{H{H{H{I|H{H{H{I{H{H{H|H{H{I{I{I|I{I{I{H{I{I|H{H{H|H{H{H{H{H{I|H|I{H|H{H{H|H{I{I{H{I|H{I{H|H{H{H|I{I{H{H{H{H|H{H|H|H{H{I{H{H{H{H{H{H{H{H|H{H|H|I{H{I{H{H{H{H{H{I|I|H|I{H{H|H|H{I|I|I{I|H|H{I|H{I{I{H|I|I|H|I|I|I|I|H|H{H|I{H|I{H{I{I|I{I{H|H|H|H{I|I|H{H|I|H|H{H{I{H{H{I|I|I{I|I|H|H{H|H|H{H|H|H{H{I{H{I|H|H|H|I{I|H{H|H{H|I|I|H|H{H|H|I{I|H{H|I{I{H|H|I{H{H|I|H|I{H{I{H{H{I{I|I|I{H|H{H{H|H{H{I{I{H{H|H{H|H{H|H{I{H{I{I|I{H|H{I{I{H|I|H{H{I|H|H{I|I|I{I{I|H{I|I|H{H|I|H{I{I{I{H|H{H{H|I|H{H{I{I{H|I|I|H|I|I{I|H|I|H{I|H|I{H{I{I{H|H|I|I|H|H|I|H|I|I{I|H|H|H|I{I|I{I{I{I{I{H|I|I|I|I|I|H|I{H|H|I|I|I|I|H|I{I|I{I|I{I|I|I|H{I|I|I|I|I|H|I|I{H{I|H|I|H{I{I|I|H{I{H{I|I|I|I|I|H|I|I|I|I|H|H|H|I|I|H|I{I|I|I{H|I|I{I|I{I|I|I{I|I|H{H|I|I|H|I{I{I{I|I|I|I|I{I|I|I|H{H|H|I|H{I{I|I|I|I|H|H{I{I|I{I|I|H|I|I|I|H|I|I|I|I{I|I|H|I|H|H|I{I{I|H{I|H{I{I{I|I|H|I|I|I|I{I|I{I|I|I|I|I|I|I|I|I{I{I{I|I|H|I{I|I|H|I|I|I|I|H{I|I|I{I|I|I|I|I|I|I|I|I{I{H|I|I|I|H|I|I|H|I|I|I|I{I|H|I|I|I|H|I|I|I|I|I|I|H|I|I{I|I|I|I|I{I|I|H|I|I|H{I|I|I|I|I|H|H|I{I|H|I|I{I|I|I{I|I|I|H|I|I|I|I|I|I|I|I|H|I|I|I|I|I{I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|H{H{I|I|H{I|I|I|I|I|I|I{I|I|I|I|I|I|I|H|H|I|I|H|H{I|I|I|I|I{I|I|I|I|I|J|I|I|I|I|I|I|I}I|J|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I}J|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|J|I|I|I|I|I|I|I|J|I|I|I|I|I|I}I|J|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|J|I|I|I|I|J|I|I|I|I|J|I|I|J|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|J|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|J|I}I|I|I|I|J|I|I}I|J|I}J|I}I}I|I|I|I|J|I|I|J|J|I|J}J|I|I|I}I|I|I|I|I|J|J|I|I|I}J}I|I|I|I}I}I|I|J|I}J|I}I|J|J|J}I|I|I}I}I|I|I|I|I|I|I|I|J|I|I|I|I}I|I}J|I|J|J}I|J}I}I}I}I|I|I|I|I|I}J|I}J}J|I}I}I|I|I}J|J|I}I|I}I|I|I|I|I|J|I|I|J|I|J|J|J|I|I|I|J}I|I|I}I}I|I|I|I}I|I|J|I}I}I|I|J}I|I|J|I}I|I|I|I|I|J}I|I|I}J}I|I|I|I|J|I|I|I}I|I|J|I}I|J}I|I|I|I|I|I|I|I}I}I}I|I}J}I|J}J}I|J|J|J|J|I}J}I|J|J}I}J|J}I|I|I|I|I|I|I}I}J|I|J}J}J|I}J|I}J|I}J}I}I}J}I|I|J|J|J|I}I|J}I|I|I|I}J|I|I|J|J}J}J|J}J}I}I}I|J|J|I}J}I|J}I|I|J|I}J|I|I}I}I}I|I|I}J}J}J}J}I}I|I}J}J|I|J|I}I|J|I|I}I|J|I}I|J|I|I|I|J}I}J|J}I}J|I}J|I|I}J}J|I|J|I|I|J|I|I|J}J|I}J}I}J|J|I|J}I}I|J}J|I|I|J|J}J|I|I}I|I|J}J}I}I|I|I|I}I}J}I|I}J}J|I}J|I}I}J}J}I}J}I}I}J|J}I|J|J}I}I|J}J}J}I}J|J}J|J}J}I}J|J}J}I}J}J}I}I}J}J}J|J|I}J|I}J}J|J|J|J}J|I}J}I|J|I}J|J|I|I}J|J}J|J}J}J|J}I}J}J}I}I}J}I}J}I}J|J|J|J}I}J|J|J|I|I}J|J|J|J}I|J}J}J|I|J|I}I}I}J}I}I|J|I}J}J}J}I|J}J}J}J}J|J}J}J}I|J|I|J}I}I|J}I}J}I}I|I|I}J}J|J}J|I}J}J}J}J|I}I}J}J|I|I}J}I}J}I}J|J}J|J|J}J|I}I}J}J}I|J|J|J|J}J}I}I}I}J}J}I}J|J|I}J}J}J}I}J}J}J}J}J}J}J}J}J}I}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}I}J}J}J}J|J}J}J}I}J}J}J}J}J}J}J}I}J}J}J}J}J}J}J}I}J}J}J|J}J}J}J}J}J}J}J}J}J}J}J}J}J}I}J}J}J}J}I}J}I}J}J}I}J}I}J}J}I}J}J}J}I|J}J}J}J|J}I}J}J}J}J}J}J}J}J}I}J}J}J}J}J}J|J}I}I}J}J|J|J}J}J}J}J}J}I}J}J}J}J}J}J|J}J}J}J}J}J}J}J}K}J}J}K}J~J}J}J}K}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}K}J}J}J}K}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}J}J}J}J}J~J}J~J}J}J}J~J}J}J}J}K}J}K}J}J}J}J}J}J}J}J}J}J}J}J}K}J}J}J}J}J}K}J}J}J}J}K}J}J}J}J}J~K~J}J}K}J}J~J}J}J}J}J}J}J}J}J}J}J}J}J}J}J}J}K}J}J}K}J}J}K~J}J}K}J}J~J}J}J}J}J}J~J}K~K}J}J}J}K}J}J}J~J}J~J~J~K}J}J~J~J}J}J}J}J}J~J}K}J}J}J}J}J~K~J~J}J~J~J}J}J~J}J~J}K}J~J~J~K~J}J}J}J}J}J}J}J}J}J}J~J}J~J}J~J}J}J~J~K}J}J}K}J}J}K}J}K}J}J~J~J}J}J}J~K}J}J~J~J}J}J}J}J}K}J}J}J}J~J}J}J}J}J~J}K}J}J~J~J}K}J}J}K}K}K~J~J}K}K}J}J~J~J}J}J}J}K}J}J}K}K}J}J}J}J}K}J~J}J}K}K}J}J}J}J}J}J}J~J}J}J}J}K}J~K~J~K}J~K}J}K}J~K~K}K}K}J}K~J~K}J~J}K~J~J~K}K}J~J}J~J}J}J}K}J}J~K}J}J}J~K~K}K}K~K~J~K~J~J}J}J~J}J}K}J}J}K}K~J~J}K}K~K}K~K}K~J}K~K~J~J}K}J~J~K~J~K~J}J}K~K~K}K}J}J}K~J}K}K}K~J}J}J}K}J}K}K~K~K}K}K}J}K}K}K}K~J}J}J}J~J~J}K}K}K~K~J}K}J}J~J}K}J}J~J}J}K~J~K~J~K~J}J}J}K}J~K~K~J~K~J}K}J}K~J}K~J~J}J}K}K}J}K~K~K}K~K~K~J}J}J}J}K}J~J~K~J~K~K}K~K~J}K~J}K~K}K~K~K~K~J~K}J~J~K}J~K~J~K}K~K~K~K~J~J}K}K}K~K}K}J~K~K}K~K~J~K~K~J~K~K~J~J~K}J~J~J~K}J~K}K}J}K~K~K~K}K}K~J}K~K~K~K~K~J}K~J~K~K~J}K~K~K~K}J~K~K~K~K}J~J~K~J}K}J}K~K~K~J~K}K}K~K~K}K}J~K~K~K}J}K}K~K~J~J~J~K~K~K}J~J~K}K~K}J}J~K~K}K~K~K~J}J~K~K~K~J~J~K~K~J}K~J~J~J~K}K~K~K}K~K}K~K~J~K~K~K~J}K~K~K}K}K~J~K~J~J~K~J~K~K~K}K~K~K~K~K~J}K~K~K~J~J~K~K~J~K~K}K~K~K~K~K~K}K~J~K~K~K~K~K~K~K~K~K~K~K~K~K~J}K~K}K~K~K~K~J~K~K~K}K~K~K}K}K}K~K~K~K}K~J~K~K}K~K~K~K~J~K~K~K~K~J~K~K~K~K~K~K~K~K~K~K}K~K~K~K}K~K~K~K~K~K}K~K~J~K~K~K~K~K~K}K~K}K~K~K~K~K~K}K~J~K~K~K~K}K~K~K~K~K~J~J~K~K~J~K~J~K~K~K~K~K~K~K~K~K}J~K~K~J~K~K~K}K~J}K}K}J}K~K~K~K~K~K~J~K~K~K~K~K~KK~K~K~K~K~K~K~K~K~K~KK~KK~K~K~K~K~K~K~KK~K~K~K~K~K~K~K~K~K~K~K~K~KK~KK~K~K~K~K~K~KK~K~K~K~K~K~K~KK~K~K~KK~K~K~K~K~K~K~K~K~K~K~K~K~KL~K~K~K~K~K~K~LK~K~K~K~K~K~L~K~K~L~K~K~K~K~K~L~K~L~K~K~K~L~K~K~K~K~K~L~K~K~K~K~K~K~L~K~K~L~K~K~K~K~K~K~K~K~K~K~K~K~KK~K~K~K~KKK~K~K~K~K~K~K~K~K~K~K~L~K~K~K~K~K~L~K~K~K~K~K~K~K~K~K~KK~L~K~LK~K~L~KKK~K~K~K~K~K~KLK~KL~K~K~K~K~LK~KL~LK~K~L~K~KK~K~K~L~KK~KL~K~KK~K~L~KK~L~K~L~K~K~K~K~K~K~K~L~K~K~L~K~K~LK~K~K~K~KKK~KKKK~KL~KK~LK~KLKKK~K~K~K~K~LK~KK~K~K~K~K~K~K~KK~K~K~K~K~L~K~K~L~KK~KL~K~K~K~K~K~K~LL~K~L~K~L~K~K~L~L~KK~K~L~K~K~K~K~KKK~K~K~L~K~LK~KK~K~K~K~K~L~K~L~K~KLK~K~K~KLK~LKLK~K~KL~K~KLK~K~L~KL~L~LLK~KL~K~KL~KLKK~LLLL~K~LLK~L~K~LL~LKK~L~KKLKKK~KLL~L~L~K~LK~LK~L~LKK~K~LLL~KLKLK~K~L~K~LL~K~LK~LKL~LK~LKKL~KK~L~KLKK~L~KKLKKKK~L~KL~K~LL~K~LK~K~LL~K~L~L~LKK~LK~K~L~KK~L~K~K~K~K~K~L~K~LKK~L~L~L~K~K~L~KL~L~LKK~KLL~KL~L~LLKKKLKL~LLLLLKL~KL~L~KL~LLLLLLK~LKLLLLK~L~K~KKKLL~LLLLK~LLKL~LLL~LKLK~L~L~LKK~K~LL~LKL~LLL~L~LLK~L~LKLL~LKLKL~KKLK~KLLK~LK~L~KLKLK~LLLLL~L~K~LLLL~K~LK~LL~L~KKKLK~LL~LLLK~L~LKK~L~LL~K~KLLK~LLL~K~LL~L~L~L~LLK~KLL~K~LKK~LL~LK~LL~LKLLL~LLLLLLLLL~LLLLKLLLLLLLL~LLLLLKLL~LLLLLLKLL~LL~K~LLLLKLKLLLLLLLLLLL~LL~LLKL~KLLLKLL~LLLLLLLKLKLLLLLLLLLLL~LLLL~LLLLLLKLLLL~LLKLLL~LLLLLLLLLL~LLL~LL~KLL~LL~LLKKLLLLLLLL~LL~KKL~LLKLLL~LLLMLLLLLLLLLLLLLMLMLLLLLLLLLLLLLLLMLLLLLMLLLMLLLMLLLMLLLLLMLLLLLLMLLLLLLLLLMLLLLLLLLLLLMLLLMLLMLLLMLLLLLLLLLLLLLLMLLLLLLLLLLLLLLLLLLMLLLLLLMLMLLLLLMLMLLLLLLLLLLLLMMLLMLMMMLLMLMLLLLLMLLMMMMLLLMLLLMLLLMLLLLMMLLMLMMLLLLLMLLLLMLLMLLLMLLLLLMMLLLMLLLLMLMLLMLLMMLMLLMLLLLLLLMLLLLLMLLLMLLMLLMMLLLMLLLLLMLLLMMLLLMMLLLMLMLLLMMMLMLLMMMLMLLMLLMLLLMMMLMMLLMLLMLLMMLMLLLMMLMMMLLMLLLMLMLMMLMMLMLLMLMLMLLMLMMLMLLMMMLLLMMMMLLLLLMLLMLLMLLLMMLLLMLMMMLMLLLMMLLMLLMMMLMLLLLMLLMLLLMMLLMMMLMLMMMLLMLLLLMMLMLLMLLLLMLLLLMMMMMLLMMMLMLMLMMLMMLLMMMLLMMMLMMMMMLLMLMMMMMLMMMMLLLLMLLMMMMMMLMMMMMLLMMMLMMMMMLMLMLLLMMMMMMLMMMMMMMMMMLMMLMMMMMLMMMMMLMMLLLMLMMMMMMLLLMMMMMMMMMMMLMMMMLLMLMLMMMLMMMMMMMMMMMMMMMMMLMMMMMMMMMMMMLMMMMMMLMMMLMMMMMLMMMMMMMMMMMMMMMLMMMMMMMLMMMMMMLMMMMMMMMMMMMMMLMMMMMMMMMMMMMMMLMMMMMMMMMMMMMMMMMMMMMMMMMMMMLMMMMMMMMMMMMMMMMMMLMMMMMMMMMMMMMMMMMMMMMMMNNMMMMMMMMMMMMNMMMMMMMMMMMMMMMMMMNNMMNMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMNMMMMMMMMMMMMMMMMNNNMMMMMMMMNMMMMMMMMNMMNMMNMMMMMMNMMMMMMMMMMMMMNMMMNMMMMMNMMMMMNMMMMMNMMMMMMMNMMNNMMNMMNMNMMNNNMMMMNMMMMMMNMMNMMNMMMMNNNMMMMMMMMMMNNMMMMMMMMMMMMMMNMMNMNMMMNMNMMMNMNMMMMMMMMMNNMNMNNMMMMMMMMNMMMMMMNMNNNNMMMMNMNMNMMMMMMMMMMNNMNNMMMMMNMNMMNMMNMNMMNMNMNNNMNMMNNMMNNNNNMNNNNMNNNNNNMNMNMNMMNNNMNNNNMNNNNMMNMNNNNNNNNMNMMNMNMMMNNMNNNMNMNNMNMNMMMNMNNMMMNNMNNNMMMNNNMMNMNMMMNMNNMNMNNNNMMMMNNMNNNNNNMNMMNNMMNMMNMMMMMNNNNMNNNNNNNMMNMNMNMNNNNMNNNNNNNMNNNNNMNMMNNMMNMNMNMNNMMMNNNMNNNNMNNNNNMNNMNMMNNNNNNNMNNNNNNNMNNNNNMNNMNNNNNMNMNNNNNNNNNNMNNNMMMNNNNNNNMNNNNNNMNNNNNNMNNNNNNNNNNNNNNNNNNNNNNNNNMNNNNNNNNNNNNNNMNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNMNMNNNNNNNNNNNNMNNNNNMNNNNNNNNMNMNNNNNNNNNNNMNNNNNNNNNNNNNNNMNNNNNNNNNNNNNOONNNNNNNNNNNNNNONNNNNNONNNNNNNNNNNNNNONNNNNNNNONNNNONNNNNNNNNNNONNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNONNNNNONNNONNNNNNNNNNONNNNNNNNNNONNNNNNNNNOONNNNOOONNNONNNNNNNNNNNOONONONNNONNNNONNNNNONNONNNONONNNNNNNOOONNNNONNNNNONNOONNNNNONNNNNONONNNNONNONNONONNNNNNNNNNNNONONNNOONNNNONNNNNOOONNONNNNONNNNNONNNNNOONONOOONNNOOOONNOOONNOOONONOONNNONNONONNNONOOONOONONOOONOONOOONONNOONOOONONNONNOOOOOONNONNNONOOONNNOONOOONONOOOOONOOONOONONNNOOOOOONOONOOOOONNOONOOOONNOOONNONOOOOOOONNOOOOOONOOOONNOOOOOOOONONONOOOOONNNOOOONONOONOOOOOOOOOONONONONNOOOOOOONOOOONONOONNNOOONOONONOOOOOONNOONNOOOOOOOOOOOOONNOOOOONNNNOONONNOONNOOOOONOOONNONOONOOONONOOOONOOOOOOONNONONOOOOOOOOOOOOOOONOOOOOONOOOOOOOOOONNOOOONOOOOOOOOOOOOOOOONOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOONOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOONOOOOONOOOOOOOOPOOOOOOPOOPOOOOOOPOOOOOOOOOOOOOOOOPOOOOOOOPOOOOOOOPOOOOOOPOOOOPOOOOOOOOOOOOOOOOOOOOOOOOOOOPOOOOPOOOOOOOOPOOOPOOPOOOOPOOOOOOOOOOOOOOOOOOOOPPOPOOOOOOOOOOPOPOOOOOOOOOPOOOOPOPOOOOOOPOPOPPOOOOPOOOOOPPPOOOOOOPPPOOOOOOOOOOOPPOOPOOOPOOPOOOOOPOOPOOOOPOOOOOOOOOOPPOPPOPOOOPOPPPOOPOOOPPOOPOOOOPOOOOOOOOOOPOPOOPOOOOPOPOOOOOPOOOOOOOOOOOPPOPPPOPPOOOPPPOPPPPPPPOPPOPPPPOOPPPPPPOOPOOPPPPPPPPOOPPOOPOOOPPOPPPPPOPOOOPOOOOOPPOOPOPOOOPOPPPOOPOOOOOOPOPOPPPOPOOPOOOOOPOPOOOPPOPPOOOOOPPOOOPOOOPPPOPOPOOOPPPPPOPPOPOOPPPPPOPOPPPPPPPPOPPPPPPOOOPPPPPPPOPPPOPPOPOPPPPOPPPPPPPPPOPPPOPPPPOOPPPPPPPOPPOPPPPOPOPPPPPPPOPPPOOPPPPPPOPOPPOPPOPOPOPOPPPPPPPOPPPPOPPPPPPPPPPPPPPPPPPPPPPPPPPPPOOPPPPPOPPPPPPPPPPPPPPPPPPPPPPPOPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPOPPOPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPOPPPPPPPPPPPPPPPPPPPPPPPPQPPPPQQPPPPPPPPPPPPPPPPQPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPQQPPPPPPPPPPPQPPPPPPPPPPPPPPPQPPPPPPPPPQPPPPPPQPPPPPPQPPQPQPPPPPPPQPQPQPQPPPPPPPPPQQPQPPPPPPPQPPPPPPPPPQPPPPQQPPPPQPPPPPPPPQPQPQPPQQPQQQPQPQPPPPPPQPPPPPQQPQQPPQQQPPPQPPQQPPPQPPPQPPQQPPPPPQPPPPPPPQPPPPPQPPPPQPPPPPPPPPPPQQPPQPPQPQPPPPPPPPQPQPQQPPPPQPPPPPPPPPQQPPPPPPQPPQQPQPPQQQQPPQQQPQQPQPPQPQPQQPPQQPQQPQQPQQPPPQQQPQQPQPPQPPPPPPPPQPPQQPQPPQPQQQQQPPQPQPQPPQPPPPQQQQQPQPQQQPPPQPQPQPPQQPQQQQQQQQQQQQPPPQPQQQPPQPPQPPPQPPPPQQPQQPPPQQQQPQQPPQQQQQPQQQQPQPPPPQPRSRQQQQQQPQQQQQQQQQPQQPQPQQQQQPPQPPQQQQQQPPQQQQPQQQQQPPPQQQQQQPPQQQQQPQQQQQQQPQQQQPQQPQQQQQQPQQQQPPQQQQPQQQQQPPPQPQQQQPQPQQQQQPPPQQPQPQQQQQQQQQQQQQQQQQQQQQPQQQPQQQRSUWUQPQQQQPQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQPQQQQQQPQQQQPQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQPQQQQQQQQQQQQQQQQQQQPQQQQQQQQQRQQQQRQQQQQQQQQQRQQQRSUWY[ZSRQQQQQQRQQQQQQQRQQRQQRQQQQQQQQQQQQQQQQQQQQQQQQQQRQRQQRQQQQQQQQQQQQRQQQQQQQQQQQRQQQQQQQQQQQQQQQQQQQRQRQQQQRQQQQQRQQQRQQQQRQQQQQQQQQQQQQQRQQRRRQRQRQQQRQRQQQQRSVWY[]_`WRQRRQQQQRRRRRQRQRQQQQRQQQRQQQQQQRQQRQQRRQRRQQQQQQQQRQRRRRRRRQQQQQQRRQRQQRQRQRQQQQQQRQQQQQQQQQQQRRQRQRRRRQQRQRQQQQRQRQRRQRQQRQRQQRQRQQQRQQQRRRRRQRRRRQRRRQRSVXY[]_acdZQRRQQRQQQQQQRRRRRQQRRRRRRRQRQQQRRQQQRQQRQQQQQQRQRRRQQRQRQRQRQRRQRRQRRRQRQRRQQQQQQRQQQRQQRQQRQRQQQRRRRRQRQRRRRQQRQQRRRRRQRRQQRQRQQQRRRQQRRRRQRQRRRQQRRRRRTVXY[]_acdgh^QRQRRRRRRQRRQQRRRRRRRQRRRRRRRRQQQRRRQQRRRQRRRRRQQRQRQRRRQRRQRRRRRRRRQRRRRRQRRRQRRRRRQRRRQRQQRRRRRRQRQRRQQQRRRRRRRQRRRRRRQRQRQQRQRRRRRRRRRRRRRRRRRRRRRRTVXY\]_acdghklcQRRRRRRRRRRRRRRRRRRRRQRRRRRRRRRRRRRRRRRRRRRRRRRRQQRQRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRQRRRRRRRRRRRRRRRRRRRRRQRQQRRRRRRRRRRRSRRRRRRRRRRRRRTVXY\]_acdghklnpgRRRRRRRRRRRSSRRRRRRSRRRRRRRRSRSRRRRRSRRRRRRRSRSSRRRRRRRSRRRRSRRRRRRRSRRRRRRRRRRRRRRRSRRRRRRSSSRRRRSRRRRRRRSRRRRRRRRRSRRRSSSRRSRSRRSSRSRRRRSSRRRRRRTVXY\]_aceghklnpruhRSSRSRRRRRRRSSRRSSRRSSRRRSRRRRSSSRRSRRRRRRRRSRSRRSRRRRRRRRRRRSRSSRRRRRRRSSRRSSRSRRRRRRRSRRRRRRRRRRRSSRRRRRRSRSRRRRRRRRSRRRRRSRRSRRSSRSRRRRSSRSSSTVXY\]_aceghkmoprtvyjRRSSSSSRSRRSSSRSSSSSSSRRSSRRSSSRRSRSSRSRSSRRSSSRSRRSSRSRSSRRRSRSRSSRSRSRSSSSSSSSSRSRSRRSSSSRRSRSRRRSSSSRRSSRRSSRRSRRRSSRSSSSRRRRSSSSSSSRSRRSRRTVXY\]_acegikmoqruvyz|iSRSRSSSSSSSSSSSSRSSSSSRSRSRRSSSSSRSRSRSSSSSSSRSSSSSSSSRRRSSSSSSRSSRRSSSSRSRSRSRSRSRRSRSSRSSSSRSRSSSRSSSRSRSSRSSSSRSSSSSSSSSSSSSSSSSSSSSSSSSSTVXY\]`acegikmoqruvyz}~cSSSSSSSSSRSSSSSSSSSS†UΆVՆWXWXWWVUTSRRSSSRSՆSɆSSSSSSSSRSSSSSSSSSSSRSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSRSRSSSSSSSSSSSSSSSSSSSSSSSSSSSTSSSSSSSSSSTVXY\]`acegikmoqruvyz}~^SSTSSSTTSSSSSSTΆY܆[^``_]\\ZYWVUTTSSSSSSSTSSSTنSɆSSSSSSSSSSSSSSSTSSSTSSSSSSSSSTTSSTSSSSSTSSSSSSSSSSSSSSTSSSSSSSTSSSSSTSSSSSSSSSSSSSSSSSTSSSSSTVXY\^`acfgikmoqsuvyz}~򂺔YTTSTSSTTST†V؆]bgedca`_^][[YXWUTTSTSSTSSSSTTTSSTTЇSSSTSTTTSSSSSSSTSTSSSSSTTSTSSSSSSTSTSSTSTSTSSSSTSTSSSTSSTSSSSSSSSSSSTSSSSSSSSTSTTTSSTSTSUVXZ\^`bcegikmoqsuvyz}~~TSTTTTTVن_hkihgeecba__]\[YXWVUTTSTSSSSTTTTSTSSTSTSӇSTSSSSTTSSTTSSSTSSTTTSSSSTTTSSTSSTSSSTTSTSSTSSTSSTTTTTSSTSTSTSSSTTTTSTSSSSSSTTTSSTTTUVXZ\^`bcegjkmoqsuvyz}~oTTTT͈\gomlkjigfedca`_^][ZYXVVTSTSSTTTTTSTSTTTTTTTTTTŇTSTSTSTSTSTTSTSTSTTTTTTTSTSSTTTSTTTSTTTSSSSTTSTSSTTTTTTSTTTTTTTTTTTTTTTTSTSTTTTTUVXZ\^`bcfgjkmoqsuvyz}~^Tԉ`nqponmkjihgedcba_^]\[YXWVUTTSTTTTTTTTTTTTTTTTTTTTT͇TTTTTTTTTTTTTTTTSTTTTTTTTTTTTTTTTTTTTTTTTTTSTTTTTTTTTTTTTTTTSTTTTTTTSTTTTTUTTUVXZ\^`bcfgjkmoqsuwy{}~stsrqonmlkihgfecba`_]\[ZYWVUTTTTUTTTTTTTTTTTTTTTTTTTTT͇TTTTTTUTTUUTTTTTTTUTTTUTTTTUTTTTTTTTTTTTTTTTTTTTUTUTTTTTTUTUUTTTTTTTTTUUTTUVX[\^`bcfgjkmoqsuwyz}~Ċusrrpomlkjigfedca`_^\[ZYXWUTUTTUTTTUTTUUUUTTUTTTUTTTTUUʈUUTTTTTUTUTTTTTUTUTUTTTUTTTUUTTTTTTTTTUUUTTTUTUUTUUTUTTTUUUTUTTUTUUTTTUUVX[\^`bcfgjknoqsuwy{}~{tsrqonmkkihfedcba__]\[ZXWVUTUTTUTTUTTTUTUUTUTUTUUTTUUUTUUUTUTTUTTUTTUTUUTTTUUUTTUTTTUUTUUTTTUUTUTUTTUTUTTUTTUTUTUUUUTTTTTUUTUVX[\^`bdfgjknoqsuwy{}הttrqpomlkjigfedca`^^][ZYXWUUUUUUUTUTUUTUUUUTTUUUTUUUUUUUUԇTUUUUTTUUUTTUTTTUUUUUUUTTUUTUTUTUUUUUUTUUTUUTTTUUUUUUUUUTUTUUTUUTUUWX[\^`bdfgjknoqsuwy{}tsqponmkjihgedcb`_^\\[YXWVUUUUUUUUTUUUUTUUTUUUUTUUUUUUUUUUˆUUUUUUTUUUUTUUUUUTTUUUUUUUUUUUUUUTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUWY[\_`bdfhjknoqsuwy{}tsrqpnmlkihgfecba`^]\[ZYWVUUUUUUUUVUUUUUUUUUUUUUUVUUUUUUUUUΈUUUUUUUUVUVUUUUUUUVUUUVUUUUUUUUUVUUUUUUUUUUUUUUUUUUUUUVUUUVUUUWY[\_`bdfgjlnpqsuwy{}srqponlkjigfedbaa_^\[ZYXWUUUUUUVUVUUUUUUUUUUUUUUVVUUUUVVUUV߈VUUUUUUUUVVUUVUUVUUVUUVUUUUVVUVVVVUVVVUUUVUVUUUUVUVVUUUUUUVUWY[\_`bdfgjknoqtuwy{}tsqqonmkkihgeecb``^]\[YXWVUUVUVVVVUVVVVUUVUVVVVUUUVVUUUUUVVUVVVUUUVVVVUVVVUVUVVUVUVVVVVVVUUUVVVVVUUUVUUVVVUUUVVUUVVUVUUY[\_`bdfgjknpqtuxy|}srqpomlkjigfdcba`_^][ZXWWVUUVVVUUUVUUVVUVVUVVUUUVVVVVUVVVVVUUʼnVVVVVUVUUVVVVUVUUVUVVUUUVVUVVUUUUVVVVUUVVVVVUUUUVVUVVVUUV[\_`bdfhjlnprsuxy|}ݡtsqponmkjihfedcb`_^]\ZYXWVVVVVVUUVVVVVUUVUVVVVVVVUVVVVVVVVVUVVʉVVVVVVUVUVVVUVVUVVVVVVVVVVVVVVVVVVUUVVVVVVVVVVVVVVUVVVVV\_`bdfhjlnprtuxy|}|srqoomljihgfdcba`^^][ZYWWVVVVVVVVVVVVVVVVVVVVVVVVWVVVVVVVVVVVVωVVVVVVVVVVVVVVWVVVWVVVVVVVVVVVVWVVVVVVVVVVVVVVVVVVVVWVV_`bdfhjlnprtuxy|}ǘsrqpomlkjhgfedba`_^\\ZYXWVVVWVVVVVVVVVVVWVWVVVVVWWVVVWVWVVVVVWVΉVVWVWWVVVVVVVWVVWVVWVVVWVVVVVWVVWVVWVWWVVWVVVVVVVVVVVV`bdfijlnprtuxy|}urqponllkihgedcb``^]\ZZYWVWVVVVWWVWWWVWWVVVVWVWVWVWWWVWWVWVVVWVW͉WVWVWWWWVWWVWVVVVWVVWVWVVVVVVWVVVVVWVVWVVWWVVVWVVVWWVcefijmnprtvxy|}srpoomljjhgfedba`^^\[ZXXVVWWWVWVWWWVWWWWWVVWWWWWVWWWWWWVVWWVWWWWˊWVVVWVWWWWVVVWWVWWVVVWWVWWVWWWWWWWWWVWVWWVWWWVVWVVWWefijmnprtvxy|}Тssqponmkjihfedca`_^]\ZYXVWWWWWWWWWVWWWWWWVWWWWWWWWWWWWWWWVWWWWWWWƊWWWWWWVWWWWWWWWWWWWWVWWWWWWVWWVWWWVWVWWWWWWWVWWVVWWfijmnprtvxy|}usrqonmljihgfdcba`^]\[ZXWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWXWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWijmnprtvxy|}srqpnmlkjigfedbb`_^\\[YXWWWWWXXWWWXWWWWWXWXWWXXWXWWWWWWWWWWWWWXWWWWWWWXWXWXWWXWWWWWWWXWWWWWWWWWWWWWWXWWWWWWXWWWWWWWjmnprtvxz|}Ütrrponlkjihfedcba_^]\ZZXWWWWXXWXXXWWWWWXWXXXWWWWWWXWWWWWWXXWXWWWWWWXWXWWWWXWWWXXWWXWWWXXWXWXWWWWWXXXXWXWXWXXWWXWXWWmnprtvxz|}tsrqpnmlkihgfedba_^]\[ZYXWXXWWXXXXWWXWXXXXXXXWXXWXXXXWXXXWWXWXXWXXX΋XXXXXWWXWWWXWWXWXXXXXWXXXXWXWXXWWXXXWXXXXXXWXWWXnqrtvxz|~xtrqponlkjihfedbb`_^]\ZYXXXXXXXXWWXXXXXXWXXXXXWXXWXXXXXXXXWXXXXXXXXW‹XXXXXXXXWXXXXXXXXXXWWXWXWXXWXXXXXXXWWXXXXXWWXXWqrtvxz|~tsrponmljihgedcba`^]\[ZXXXXXXXXWXWXWXWXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXWXXXXXXXXXXXXXXXXXXXWXXXXXXXXXXXXXXXXXXrtvxz|~usrqpnmlkjhgfecba`_^\[ZYXXYXXXXXXXYYXXXXXXXXYXXXXXXXXXXXXXXXXXYYXXXXӋXYXXXYXXYXXYXYXYXYXXXXXXYXXXXXXXXXXYYXXYXXXYXXtvxz|ծutrqponlljiggfdcaa_^]\ZZYXYXYXXYXXYXYYXXXXXXXXXXXYXXYXXYXYXXXXXYXYXXXXXYXXXXXXXXYYXXXXXYYXXYXXYXYXYYXXXXYXXXYXYXXXvxz|~vtsrqpnmkjjhgeedba_^]\[ZXXXXYXXXYXXXYXYXXYXYYYXYYYXYYXXXXXYXXYYYXYYYYXXXXYYXYXYYYYXYXXYXYXXXXXYYXXXXXYXYYXYYXYYXXXxz|vutrqponlkjihfedca`_^\[ZYXYYXXXXXYXYYXYYXYYXYYYYXYYYYXYYXXXYXYYXYXYYYYȌYXYXYXXYXYYYYXYYXXYXYYYYYYYYYYYXYYYYYYYYYXYX{|utsrpommljihgfdcb`_^]\[ZYYYYYYXYYYYXYYYYYXYYYYYYXYYYYYYYYYYYYYYYYYYYYYYYYYXYYYYYYXYYYYYYYYYYYYYYYYYYYXYYYXYYYYYYY|vtsrqpomlkjhgfecba`_]\[ZYZYYYYYYYYYYYYYYYYYYYYYYYYYYYZYYYYYYYYYYYYYYYY̌YYYYYYYYYYYYYYYYYYYYYYYYYYYZYYYYYYYYYYYYYYYvutsqponlkjihfedcb`_^][ZYYYYYYYYZYYZYYYZZYYYYZYYYYYYYYYYYYYYYYYYYZZYYYYYYZZZZYYYZYYYZYYYYYYYZYYYYYZZYYYYZYYYYYZZYwutsrppnmkjihgedcba__]\[ZZYZZYYZYYZYYYYYZYZYZZYYYZYYYYYZYZYYYYYYYYYYZZZʌYYZZYYYYYYYYYYZYYZZYYYYYYYZZZYZYZYZYYYZZYZǧwvtsrqponlkjhgfecca`_^\\ZYYYYZZZYZZZZZYZZZZYZYZYYZZYZZZZYZYYZYYZZYYZZZZZYZZYYZYYZYYZZZZZZZZZZZZZZYZZYZZZYYZZZZYYZίxvutsqpommkjiggedcba_^]\[ZYYZZZZZZYZYZZZZZZYZYYZYZYZZZZZYYZZZZZYZZZZZZZYǍZZYYZYYYZZZZYZZZZZZYZZZZZYZYZZYZZZZYZZZZZӳxwvtsrqonmlkihgfecba`_]\[ZZZZZZZZZZZZZZZYZZZYZZZZZZZZZYZZZZZZZZZZZZZYZZZZZZZZZZZZZZZZZZZZZZZZZZZYZZZZZZZZZZZZZZZZӵxwvusrqponlkjigfedca`_^][ZZZZZZZZZZZZZZZ[ZZZZZZZZZZZZ[ZZZZZZZZZZZZZZZZZZZZZZZ[ZZZZZZZZZZZZZZZZZZZ[ZZZZZZ[ZZZZZZ[Zӵyxwutsrponmkkihgedcba__]\[Z[Z[[Z[[ZZZZZZZZ[ZZ[Z[ZZ[ZZ[[ZZ[[[ZZZ[ZZZ[ZZZZ[э[Z[Z[ZZZZZZZ[ZZ[ZZ[ZZZZZZZZZZZZ[ZZ[ZZ[ZZӶyxwvtsrqonmlkjigfecca`_^\[Z[Z[Z[ZZZ[ZZ[ZZ[Z[[[[Z[[ZZ[Z[ZZ[[[[Z[[Z[Z[[[ZZ[ZZ[ZZZZ[[[[Z[Z[Z[[ZZZ[[[Z[Z[ZZ[Z[[Z[Z[Z[ͱzyxvutsrponlkjigfedcaa_^]\[Z[Z[[[[[[Z[Z[[Z[[[[[[[Z[Z[[[[Z[ZZZZ[[[Z[[Z[[Z[[Ž[[[Z[Z[[[ZZZ[[[Z[[[[[[[Z[[Z[[[Z[Z[ZZ[ZZ̰zyxwutsrqonmlkihgfecb`__]\[[[[[[[[[[[[[[[[[Z[[[[[[[[[[[[[Z[[[[[[[[Z[[Z[Z[[Ў[[Z[Z[[[[[[[[[[[[[[[Z[Z[[[Z[[[[[[[[[Z[ZĪ{yxwvusrqpomlkjigfedca`_^][[[[[[[[[[[[[[[\[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[|zyxvutsqponmljihgedcb``^]\\[[\\[[\[\[[[[[\[[\[[[[[[[[[[[[[[\[[[[\\[[[[\\[[[Ž[[\[[Ž[[\[[\[[[Ž\[Ž[[[Ž[\\Ž[[[Ž\[[[[\[\[[\[{{zxwutsrqonmlkjhgfedba`^^][[[[[[\[[\\[[\[[\[[\\[\[[[[\[\\\[[[[[[\[[[\\[\\[Ȏ\[[\Ž[\[[[[\Ž[\\[\[[\[\[[[\Ž[\Ž[[[[[[\Ž[[[Ž[|{zywvusrqpomlkjhhgedcba_^\[\\\\\\\\[[\\\[[[\\\\\[[\[\\\[[\[[\\\\[[\[\\\\\[֎\\\[[Ž\[\Ž\Ž[[\[Ž\\\\\\[\[[\\[\\Ž[[Ž\[\Ž\\\\\}{zyxwutsqqonlljihffdcba`^]\\\\\\[\\\\\\\\\\[\[\[\\[\[[[[\\\\\\\[\\[\[\\\\\\\\Ž[\\Ž[[\\Ž\\\[Ž\\\[Ž\[\\\\Ž\\\[[[\\[Ž\\\\Ž[~}|{yxwvusrqpomlkjhgfedba`_^][\\\\\\\\\\\\\\[\\\\\\\\\\\\\\\\\\[\\\\[\\\\\[\\Ž\\Ž\\\\[\\\\\\Ž[\\[\\\\\\\\\Ž\\\\\\[[\[\}|{zywvutsqponlkjihffdcb`_^]\\\\\\\\\\\\]\\\\\\\\\\\\\\]\\\\\\\\\\\\\]\\\\\\Ï]Ï\]\\\\\\\\\\\\\\]\\\Ï\\\Ï\\\\\Ï\]\\]\\\ѷ~}{{yxwvusrqpnmlkjhgfdcba`_]\\\\\\]]\\]\]\]\\\\\]\\\\\\]\\\]\]\\\\\\]\]\]\\]ʏ\Ð\\\]\Ï\Ï\\Ð\\\]]]\\Ï\]\\\\]\\\]]]\\]\Ï\\\~}|{yxwvutrqpommkjhggedbba_^\\\\\]\\]]]\]\\]]\]]]\]\]]]\]\]\\\]]]]]\\\\]\\\\Ԑ\\Ï\Ð\Ï\\]\]]Ð]\]\]]]\Ï\\Ï]\Ð]]Ï]]Ï]\Ï\Ï\Ï\Ï\\Ð]]Ï\]}}{zywvutsqponmkjihffdcb`_^]]\]]]\\\]]\\\\]]\]]]\\\\]]\\]]\]]]\\\]]\\]]\]\]܏\Ð]]Ï]]]\Ð]Ï\\Ð\Ð]]Ð]Ð]\\\]]Ð]\Ð\]Ï]]Ï\\Ð]Ï]Ð]Ï]]Ð\\]Ð\~}{zyxvvusrqpnmlkjhgfecba`^^]\]]]]]]]]]\]\\]]]]]]\]]]]]]\]]]]]\]]\]]]]]]]]]]Ð]Ð]Ï]Ð]]Ð]Ð]Ð]Ð]Ï]Ï]]Ð]Ï]]]Ð]Ð]Ð]Ð]Ð]Ð]Ï]Ï]]]Ð]Ð]\]Ð]Ð]\Ð]Ð]Ð]}|{zywvutsqponlkjihfedcb`_^\]]]]]]]]]]]]]]]]]\]]]]]]]]]]]]]]]]]]]]]\\]]]]]]]Ð]Ð]Ð]Ð]Ð]Ð]Ð]Ð]Ð]Ð]Ð]Ð]Ð]Ð]Ð\Ð\Ð]Ð]Ð]Ð]Ð]]Ï]Ð]Ð]Ð]Ð]Ð]Ð]Ð]Ð]Ð]Ð\Ð]Ð]~|{zyxvutsrponmljihgfdcba`^]^]]]^]]]]]]]]]]]]]]]]]]]]]]]^]]]]]]]]]]]]]]]]]^Ð]Ð^Ð^Ð]Ð]Ð]Ð]Ð]Ð]Ð]Ð]Ð]Đ]Ð]Ð]Ð]Ð]Ð]Ð]Ð]Ð]Ð]Ð^Ð]Ð]Ñ]Ð^Ð]Ñ^Ð]Ð]Ð^Ð]Ð]Ð]Ð^~}|zyxwvttrqpnmlkjhgfedbb`_^]^^]]^]]]]]]]^^]^]]]]]]]]]]^]^]]]]^]^]]]]]]^]]]Ð^Ñ]Ð]Ð^Ð]Ð]Ð]Đ^Ð^Ð]Ð]Ñ]Ð]Ð]Ð]Đ]Ð]Ð]Ð]Ð]Ð]Ð]Ð]Ñ]Ð]Ð]Ð]Ð]Ð^Ñ^Ð^Ð]Đ^Ð]Đ]Ñ]~}|{zyxwutrqponmkjihgedca``^]]^]]]^]^]]^]^]]^]]]]]^]]]]^^]^^]^]]]^]^^^]]^]^Ð]đ^Ð^Ð]Ð]Đ^Ñ]đ]Ñ^Ð^Đ^Ð^Ð]Ñ]Ñ]Ð]đ]Ð]Đ^Đ^Ñ]đ^đ]đ^Ñ]Đ]Ð^Ð]đ]Ñ]Ð]Đ^Ð]Đ^đ]Đ]Ǯ~||zyxwvtsrqpnmlkihgedcba`_^^^^]^]]]^]]]]]^^]]^^^]]]^]^^^]]^]]]]]]^]^]^^^]đ^Ð^Đ]Ð^Đ]Đ]đ]Đ]Ð]Ñ^Ð]đ^đ]đ]Đ]đ^Ð^Ð]đ^Đ^Ñ]Ñ]Đ]Ð]Đ]đ^đ^Đ]Ð]Đ]Đ^Ð]Ð]Đ]Đ^Đ^~}|zzywvttrqpnnlkjihfedbb`_]^^^^]]^^^^^^^]^^]^^^^]^]^^^^^^^]^^^]]^^^^^^]^]đ^Đ^Ñ]Đ^Ñ^đ]đ^đ]đ^Ñ]đ^đ]Ñ^đ^đ^đ^Đ^Ñ^Đ^Đ]đ^Đ^Ñ^đ^đ]đ^đ^Ð^đ^đ^Đ^đ^Ð^Đ^Ð^đ^~|{zywvutsrponmljihgedcba`^^]^^^]^^^^^^^^^^^^^^^^]^^^^^^^^^^^^^^^]^^]^^^^đ^đ^đ^đ^đ^đ^Đ^đ^đ^Ñ^Ñ^đ^đ^Đ]Đ^đ^đ^đ^đ^đ^đ^Đ^đ^đ]đ^Đ^Ñ^Ñ^đ^đ^đ]Ñ^đ^đ^đ^đ^~}|zyxwvtsrqpnmlkjhgfecba`_^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^_^^^^^^^^đ^đ^đ^đ^đ^đ^đ^Œ^ő^đ^đ^đ^đ^đ^đ^đ^đ^đ^đ_đ^đ^đ^đ_đ^đ_ő^đ^đ^đ^đ^đ^đ^đ^đ^đ^đ^~}|{zxwvutrqponlljiggfdca``^^^_^^^^^^^_^^^^^^^^^_^^^^^^^_^^^^^_^^^^^^^^^^Ē^đ^Ē^đ^đ^ő^ő_đ^đ^ő^đ^đ^đ^Ē_Ē^đ^Œ^Œ^Ē^đ^Ē^Ē^đ^đ^Ē^Ē^ő^đ^ő_đ_đ^đ^đ^đ^đ_đ^и~||zyxvvtsrqpnmkjjhgedcba_^^^__^^^^_^_^^_^^^_^^^_^^^^^^^_^___^_^_^^^^^_^đ_đ^ő^Ē^đ^ő_đ_đ^Œ_đ_Ē_Œ_đ_Ē^đ^đ^Œ^Œ_ő_Ē_Ē^đ^Ē^ő_đ^đ_đ_Ē^ő^ő^Œ_đ^đ^ő^đ^đ^~}|{yxwvtsrqonnlkjhgfedbb`_^^___^_^___^^^__^^^_^^_____^__^_^__^__^^^^_^^ő^Œ_Œ_Ē_Œ_ő^ő_ő^ő_ő^Ē^ő^đ_Œ^Ē_ő^Ē^đ_ő_ő^Œ_Ē_ő^ő^ő^Œ_đ^Œ_Œ_Œ^ő^Ē^đ_ő^đ_Œ_Լ}|{zxxvussrponlkjihgedcaa_^^__^_^_________^^_______^_^__^_^____^____^__Œ_Œ_ő^Œ_Œ_ő_ő_Ē_Œ_Œ_Œ_Œ_Œ^Ē_Œ_đ_Ē_ő_ő_Ē^Ē^ő_Ē_ő^Ē^Œ^Ē_Œ_Œ^đ_Ē_Ē_Œ_ő_Œ_Ē_}}|zyxwvtsrqpnmkkihgeecba`___^___^___^___________^_________________^___Œ_Ē_Œ_Ē_Œ_ő_ő_Œ_Œ_Œ_Œ_Œ_Ē_Œ_Œ_Œ_Œ_ő_Ē_Ē_Ē_Œ_Œ^ő_Œ_Œ_Œ^Œ_Œ_Œ^Œ_Œ_Œ_Œ_Œ_Œ_~}|{zxwvutrqpomlkjigfedca`____________________________________________ݒ_Œ_Œ_Œ_Œ_Œ_Œ_Œ_Œ_Œ_Œ_Œ_Œ_Œ_Œ_Œ_Œ_Œ_Œ_Œ_Œ_Œ_Œ_Œ_Œ_Œ_Œ_Œ_Œ_Œ_Œ_Œ_Œ_Œ_Œ_Œ_Œ_}|{zyxvutsqqonmkjihgedcba_______________`_______`____`__________``___Ւ_Œ_Œ_œ_Œ_Œ_œ_Œ`Œ_œ_ƒ_Œ_Ɠ_œ_Œ_Œ_Œ_Œ_Œ_Œ`Œ_œ_Œ_œ_œ_Œ_Œ_œ_Œ`Œ_Œ_œ_Œ_Ɠ_Œ_Œ_Œ_~}|{yxwuusrqonmlkjhgfecba`_________`_________``__`__`__`______```____͒`ƒ_Ɠ_œ`Œ`Œ`œ`Ɠ_Ɠ`Œ`Œ_œ_Œ`Ɠ_ƒ_ƒ`œ_ƒ_Œ_Œ`ƒ_Œ_Œ_Œ_ƒ`ƒ_Œ_Ɠ_Œ_Œ`ƒ_Œ`œ`ƒ_Œ_ƒ_Ɠ_~}|{zxxvutsrpomlkjigfedcaa___``__`___``________``_____`_``__``__``_``Œ_Ɠ`œ`Ɠ_œ_œ_Œ_Œ_Œ_ƒ`ƒ`Œ`œ_œ`Œ`œ`œ_Œ_Œ`ƒ_ƒ`œ_ƒ`ƒ_ƒ_Œ_Œ`œ`Ɠ`Œ_ƒ_Œ`ƒ`œ_œ_Ɠ_œ_~}|zyxvvtsqqonmkkihgfecba__```__``_`_````_``___``_``````_````````__`Œ_ƒ`œ`œ`œ_Ɠ_ƒ_Ɠ`œ`œ`œ_œ`ƒ`ƒ_Ɠ_œ`Œ`Ɠ`ƒ`Ɠ_ƒ_Ɠ`œ`ƒ`Ɠ_Ɠ`œ`ƒ_Œ_Œ_œ`Ɠ`Ɠ`Ɠ`œ_Ɠ`Ɠ`~}|{zxwvusrqpnmlkjhgfedca````````_``_````_``___``_`_`_`````___```_``Ɠ`Ɠ`Ɠ`Ɠ`Ɠ`œ`Ɠ_œ`ƒ_œ`Ɠ_Ɠ_ƒ_Ɠ`Ɠ_Ɠ`Ɠ`œ_ƒ_œ`Ɠ`Ɠ_ƒ`Ɠ`Ɠ`ƒ`Ɠ`œ_Ɠ_œ`Ɠ`Ɠ`Ɠ`Ɠ`Ɠ_Ɠ`Ɠ`}|{zywvutsqponmkjihgedcba````````_`````````_`````_````_`_`_``_````ד`Ɠ`Ɠ`Ɠ`Ɠ`Ɠ`Ɠ`Ɠ`Ɠ`Ɠ`Ɠ`Ɠ`Ɠ`Ɠ`ƒ`Ɠ`œ`œ`ƒ`Ɠ`œ`ƒ`Ɠ`œ`Ɠ`œ`Ɠ`Ɠ`Ɠ`œ`Ɠ`Ɠ`œ_Ɠ`Ɠ`Ɠ`Ɠ`œ`~}|zyxwutsrqonmlkihgfdcba```````````a``````````a```````````````aaaʓ`Ǔ`Ɠ`Ɠ`Ɠ`Ɠ`Ɠ`Ɣ`Ɠ`Ɠ`Ɠ`Ɠ`Ɠ`Ɠ`Ɠ`ƓaƔ`Ɠ`Ɠ`Ɠ`Ǔ`Ɠ`Ɠ`ƓaƓ`Ɣ`Ɠ`ƓaƓ`ƓaƓ`Ɠ`Ɠ`Ɠ`Ɠ`Ɠ`Ɣ`Ɠ`~|{yxwvutrqpomlkjhgfedba``a``a```a``a`a```````````a`a````````````Ɠ`Ɠ`ƓaƓ`Ɠ`Ǔ`Ɠ`Ǔ`Ǔ`ƓaǔaƔaƓ`Ɣ`Ǔ`ǓaƓ`Ɠ`Ɠ`Ɠ`Ɠ`ƓaƓ`Ɠ`ǔ`ƓaƔ`Ǔ`ƓaƓ`Ɠ`Ǔ`ǓaƓ`Ɠ`Ɠ`Ɠ`Ɣ`}|{zyxvutsqqonlljihgedcb``a````aaaa`a`a````````a`````a`a```aa`aa`Ɠ`Ǔaǔ`ǓaƔaǓaǓ`Ɣ`ǓaǓaƓaƓ`ǔaǓ`ƔaƓ`Ɠ`Ɠ`ƓaǓaƔaƓ`Ɠ`ƓaǓ`ƓaƓaǓ`ǓaƓaǓaƓ`ƔaƔ`Ɠ`Ɣ`Ǔ`Ɣa~}|{yxwutsrppnmljiigfdcba`a`aa`aaaaaaaa``aa`a`aaaaaa``````a`aa``Ԕ`Ɣ`ƓaǓaǓ`ƓaǓ`Ɣ`ǔ`ƓaƓaƓ`ƓaƓ`ƓaǓaƔ`ƔaƔ`Ɠaǔ`ǓaƔ`Ǔ`Ǔ`Ǔ`ƔaƔ`Ɣaǔaǔ`Ǔ`ǔaǔaƓ`ƔaƓaǔ`Ɠ`}|{zywvusrqpnnlkjihfedbbaaa`a````aaaaaaa`aaa``a```aaa`aaa```a``ǔaƓaǔaƔ`ǔ`ǔ`Ɠ`Ɣaǔaǔaǔ`ǔ`ǔaǔ`Ɠ`ǔaǔ`ǔ`ƔaƓaǔaǔ`ǔaƔ`ǔ`ǓaǓ`Ɣ`ǔaǔ`Ǔ`ǔaƔaǔaƔaƓaǓ`ǔ`Ɣa~}{zyxwutsrqonlljihfedcba``a``aaaaa`a`aaaaaaaaaaa`a`a`a`a`aa`aaƓaǔ`ƔaǓaǓaǓaǔaǔaǔaƓ`ǓaǔaǓ`ǔaƔaƔaǔ`ǔaƔaƔaƔ`ǔaǔaƔaǔaǔaǔ`ǔ`ǔaǔaƔ`ǔaǔ`ǔ`ǓaǔaǔaǓaƔa~}|{yxwvusrqpnmlkjhgfedbaaaa`aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaՔaƔaǔaǔaǔ`ǔaƔaǔaǔaǓaǔaǔaǔaǔaǔaƔaƔaǔaǔaǓ`ǔaǔaǔaƔaǔaǔaǔaǔaǔaƔaǔaǔ`ǔaǔaǔaƔaǔaƔaǔaǔa~}|{zywvutrqqonlkjihfedcbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabǔbǔaǔaǔaȔaǔaǔaǔaǔbǔaǔaǔaǔbǔaǔaǔaǔaǔbǔaǔaǔaǔaȔaǔaǔaǔaǔaǔaǔaǔaǔaǔaǔaǔaǔaǔaǔaǔaǔaǔa~}{{yxvutsrqpnmljihgfdcbaabaaaaaabaabaabaabaaabaaaaababaaaaaߔbǔaǕbǕaȔaǔaǔaȔaǔbȕaȔbǔaǔaǔaǕaǔaǔaǔaǔaǔaǔaǔaǔaǔaǔaǔaǕaǔaǔaǔaǕaǔbǔbǔaǕaǔaǔaȕbǔaȔaǔb~}|{yxwvttrqpnmlkjihfedbababaabaaaaaaaaaaaaaaaabaabbaaaababa˔aȕbȕaǔaȕbǕaȔaǔbǔaǕaǔbȕaǕaǔaǔaȔbǕbǔaǕaǕaǔaǕaȕaǔbǔaȔaǔbǕbȔaȕaǔaȕbȕaǕaǔbǔaǔbǕaǔaǔbǕa~|{zywvutsqponlkjihfedcbabaaabbababbaabbaaabaaabbbababbaabaǔbǕaǕaȔbȔbȕbȔaȔaǔaǔaȕaȕaȔbǔbȕbȕaȕbǕbȕaǕaǔaǔaȔbȔaǕbǕaǕbȕaǔbǔbȔbǕbǔbǔaǔaǕaǕbȕaǔbȔbȔa~}{zyxvvtsrqonmkkjhgeedbbabbbbbbbabbbbaababbabaabbbbbbbaaaѕbǕbǕaȔbȕbǕaǔbǔaȔbȕbȕaȔbȔaǕbǔaȕbȕaȔaȕaǕaȔbǔbȕbǔbǕbǔaǕbǔaȕaǕbǕbȔbǔaȔaǕbȔbȕbǔbȕaǕbǕbǕb~}|{zxwvutrqoonlkjihfedcababbbbabbbaabbbbbababbabbbbaabbbaȕaǕbǕaȕbȔbȕbȕbȕbǕbȕaȔbȕbȕbȕaȕbǕaǕaǕbȕbȕbǕaǔbȕbȕaȕbȕaȕbǔaǕaȔaȕaȔbȕbȕbȕaȕbȕbǕaȕbȕaȕbǕa~|{zyxvutsqponmljihgedcbbbbbbbbbbbbbabbbbbbbbbbbbbabbbbbЕaȕbȔbȕbȕbȕaȕbȕbȕbǕbȕbȔbȕbȕbȕaȕbȕbȕbȕbȕbȕbǕbȕbȕbȕbȕaȕbȕbȕbȕbȕbȕaȕbȕbȕbȕbȕbǕbȕbȕbȕbȔbȕb~}|zyxwvtsrqpnmlkihgfecbbbbbbbbbbbbcbbbbbbbbbbbbbbbbbbbbȕbȕbȕbȕbȕbȕbȕbȕbȕbȕbȕbȕbȕbȕbȕbȕbȕbȕbȕcȕbȕbȕbȕbȕbȖbȕbȕbȕbȕbȕbȕbȕbȕbȕbȕbȕbȕbȕbȕbȕbȕbȕbȕb~~|{zxxvutrqpomlkjigfedcccbbbbbbbbbbbbbbcbbbbbbbbbbcbbbϕbȕbȕbɕbȕbȕbȖbȕbȕcȕbȕcȕbȕbȕbɖbȕbɕbɕbȕbɕbȕbȕbȕbȕbȕbȕbȕcȕbȕbɕbȕcȕbȕbȖbɕcȖbȕbȕbȕbȕbɕcȕbȕbȕb~|{zyxvutsrponmljihgedcbbccccbbbcbbbbbbbbcbbbbcbbbbbbbȕbȕbȖbȖcȖbȕbȕbɖbɕcȖbɕbȖbȖbȕbȕcȕbȖcȖbɕbɕbȕbɕbȕbȕbȕcȕbȕcȖcȕcɕbɖbȖcɖcȖbȖbȕbɖbȕbȖcɕbȕbɖbɕbȕb~}|zzxwvtsrqoomlkjigfedbcbbbbcbccbcbcccbcbbccbbcccbbbɖbȕbȕbȕcɕcɕcɕbɖcɕbȕbȕbȕcȖcȖbȕbɕbȕbȕcɕbɖbȖcɕbȖcɕcɖcȕbȕbɖcȕbȕcȖbȖbȕbɖbȕbȕcɕbȖbɕbȕcɖcȕbɕbɕbȕc~~|{zywvussrponmkjiggedcbccbccbbcbbcbbbbcccccccbccbb֕cɕcȖbɖcɖcȖbɕcɕcɖbɕcɖbɕbȕbɕcȖbȖcȖcɖcȕbɕbɖcȖbȕcɕcɕcȖbȕcɕcɖcɕcɕcȕbȖbȖbɕcȖbȖbȖcȖcɕbɕcɕcɕbȖcɖcȖcֻʴ~|{zyxwvtsrponmkkihgeecccccccbccbcccccccbbbcbcbcbccȖcȕbɖcȖcȕbɕcɖcɕbɖbȕcɖbɕcɕcɖcɖcɕcɖcɖcɖcȕcɖbȕcɖcɖcɕcȖcɖbȖcɕcɕcȖbȖcɖcȖbɖcȖbɖbɕcȖbɖbɖcɖcɖbɖcɖbɖcԷɱȲɲд~}|{zxwuusrqpomlkjigfddccccccccccccccccccbbccccccc˖cɕcɕcɖcɖcȖbȖbȖcɖcɖbɖcɕcɖcɖcɖcɕbɖbɕbȖcȕbȖcɖcȖcɖcȖbȖcɕbɖcɖcɕcɖcȖcɖbɖbɖbɖcɕcɖcɖcȕcȖbȖcȖcɖcɕcɖcɖcͯɮɯɯɯɰɱ~|{zywvutsqponlkjhhgedcbcccccccccbccccccbcccccccԕcɖcɖcɖcɖcɖcɖcɖcɖbɖcɖcɖcɖcɖcɖcɖcɖcɖcɖcɖcɖcɖcɖbɖcɕcȖcɖcɖcɖcɖcȖcɖcɖcɖcɖcɖcɖcɕcɖcɖcɖcɖcɖcɖbɖcɖcɖcɖcѯɪɫɬɬɭɭɮɯɯɯ~}{zyxwutsrqonmlkihgfecccccccccccccccccccccccccdɖcɖcɖcɖcɖcɖcɖcɖcɖcɖcɖcɖcɖcɖcɗcɖcɖcɖcɖcɖcɖcɖcɖcɖcɖcɖcɖcɖcɖcʖcɖcɖcɖcɖdɖcɖcɖcɖcɖcɖcɖcɖcɖcɖcɖcɖcʗcɖcغͩɧɧɨʩɩɪɪɫɬɬɭɭɮ̯~}|{yxwvutrqpommkjhggedccccccddcccdcccccdcdcccdɖcʖdɖcɖcɖcɖcʖcʖcɖcʖcʖcɗcɖcɖcɖcɖdɖcɖcɖcɖcɗcɖcɖcɖdʖcɖdɖcɖdʖcɖcɖcɗcɖcɖcɖcɖcɖcɖcɖdɖcɗcɖcʖcɖcɖcɖcɖcɖcɖcӯʢɣɤɤɤɥɦɧɧɧɨɩʩɪɪɫɬɬʬЯ~|{zywvutsqponlljihgeecccccdccddccccccdcdcdcc˗cɖcɖcʖcɖcɖcɖcʖcʗcʖcʖcɗdɖdɖcɖdɖcɖcʖcɗcɗcɖcʗcɖcɖdɗcʖcʖcɗcɖcɗcɖcɗcɖdɖdɖcɗcɗdɗcɖcɖcʖdɖcɗcɗdɖcɗcɖcʖcɖcɗcʟɠɡʡʡɢɣɣɤɤɥɦʧɧʧɨʩɩʪʪɫɬ֯Ǹ|{yxwvtsrppomljihgfdddcddcccdcdccdcddddcdd͗cɖdɗcɗcɖcɖdɖdɗcʖcɖdɗdɖdɗcʖcɖdɖcʖdʗcʖcɗcɗdɖcʖdɗcʖdɗdɗdɖcɖcɖdʗcɖcʖcʖcʖcɖcɖcɖcɖcɗdʖdɖcʖdɖcɖcʖdɖdɖdɗcɗdɖcʞʞʞɟɠɠɡʡɢɣʤɤɤʥʦʧɧɧɨʩɪɩɪܯ|yywvutrqpommkjhgfedcddcddddccccddddccdcіdʖdɖcʗdʗdʗcɗdʗdɗdʗdɗcɗcʖcʗdɖcɗdʖdʖdɖdɗdɖdʗcɗcɗcɗcɖdʗdɗcʖcʗdʗcɗcɖcɖdʖcʖdɗdɗdʗdʗdʗdɗcʗcɖcɗcɗcʖcʗcɗcʖdɖdʖcɛɜʝʝʝʞʟɠʠɡɡʢɣʤʣʤʥɦɧʧʧɨɩɪݮ~{yxvutsrponmkjihgedddddddddcdcdcdcddcc՗dʗdʗcʗcʗdʗcɗdʗdʖdɗcɗcɗcʗdɖdɗdɖdʖdʖdɖdʖcɗdɗdɗdɗdɗdʗcʗdɖcʗcʗdɗdʗcɗdɗcʗdʖdɗdɖdɗdʖdʗdɗdʗcɖdʗdʗdʗdʗdʗcʗdʗdɖcʖdɚʚɛɛʜʝʝʞʞʟɠʡʡʡʢʣɣɤʤʥʦʧɧʧʨޭȩ~|{ywvusrqpnmlkjhgfedcdddcdcddddddddddԗdɗdʗdɖdʖdʖdʗdɗcʗdʖcʖcʗcʖdʖdɖdɗdʗcʖdʗdʗdɖcʖdʗdʗdʗcɖdʗcʗcʗdɖdʖcɗdʖdʗcɗcʖdʗdʖcʗdɗdɗdʗcʖdɗcʗdɗdʗdʗcʗcʗcɖdʖdʗcʗdʘʘʙʚʚʛʛɜʝʝʞʞʟɠʡʡʡʢʣɤɤʤʥʦʧʧ߬~}{zxvutsqpnnlkjihfedddddddddccddddcdԖdʗdʖdʖdʖdʗdʗcʗdʗdʗdʗdʗdʗdʗcʗdʗdʖdʗdʗdʗdʗdʗdʗcʗdʗdʗdʗdʖcʗdʗdʗcɗdʗdʖdʗdɗdʗcʗdʗcʗdʗdʗdʗdʗdʗdʖdʗdʖdʗdʗdʖcʗdɗdʗdʗdʗɗʗʘʘʙʚʚʛʛʜʝʞɞʞʟʠʡʡɡʢʣʤʤʤʥʦڪą‚|{yxwutsrponmljihgfddddddddddddddddӗcʗdʗdʗdʗdʗdʗdʗdʗdʗdʖdʗdʗdʗdʗdʗdɗdʗdʗdʗdʗdʗdʗdʗdʗdʖdʗdʗdʗdʗdʗcʗdʗdʗdʗdʗdʗdʗdʗdʗdʗdʗdʗdʗdʗdʗdʗdʗdʗdʗdʗdʗdʗdʗdʗdʗdʗʗʗʗʗʗʘʙʙʚʚʛʛ˜ʝʝʞʞʟʠʡʡʡʢʣʤʤʤէljŅÁ}zywvtsrqpnmlkjhgfeddddddddddddddϗdʗeʘdʗdʗdʗdʗdʗeʗdʗdʗdʗeʘdʗd˗eʗdʘdʗeʗdʗdʗdʗdʗdʗd˗dʗdʘdʗdʗd˗dʗdʗdʗdʗdʗdʗdʗdʗdʗdʗdʗd˗dʗdʗdʗdʗdʗdʗdʘdʗdʗdʗdʗdʗdʗdʗdʗdʗʗʘ˗˗ʗʗʗʗʘ˘ʙʚʚʛʛ˜ʝʝʞʞʟʠʠʡʡʢʣʤѥ˟LjńÀ~|ywvutrqponlkjihgeddddddddeeded̗dʗdʗdʗdʗdʗdʘdʗdʗdʘdʗdʗeʗdʗdʗeʘdʗdʗdʗd˗dʗeʗeʗdʘd˘dʗeʘdʗdʘd˗dʗdʘdʗd˘eʗdʗdʗdʘdʗdʘe˗eʗdʗdʗdʘdʗdʘeʘdʗdʗd˗dʗdʗdʗdʘdʗdʗe˗dʗʗʗʗʗʗʗ˗ʘ˗ʗʗʘʘʙ˚˚ʛʛʜ˝ʝ˞ʟʟʠʠʡˡʢ̣ƹȏljƄĀ}{ywvtsrponmljjhgfedeeddddddedʘdʗdʗdʗdʗdʘd˘eʘd˗e˗dʘeʘdʗd˘dʗdʘdʘe˗dʘeʗeʘdʘdʗdʗd˘d˗dʗdʗeʗdʗd˘dʗdʘd˘dʗeʗeʗdʗdʘd˗dʗdʘdʗe˗e˗d˗dʗd˗dʘdʗd˗dʘdʘdʗeʘe˗dʗdʗeʗeʗʗ˗˗ʗ˗˗ʘʗʘʗ˘ʘ˗ʘ˘ʘ˙˙˚ʛ˛ʜʝʝʞʟʟˠʠˡˢާƎȈDŽ}zxwttrqpnnlkihgfedeeeeddde՗dʗd˗eʘd˘dʘdʘeʗe˗d˗d˗dʘd˗e˗d˘eʗdʗd˗dʗd˗dʗdʘdʘdʗd˗dʗdʘd˘dʗdʘd˘e˗dʗe˗eʗdʗdʘdʘd˘eʗd˗e˗eʗe˘eʘd˘d˗eʗe˗dʗd˘d˗eʗdʗdʘdʘe˗d˗dʘdʘe˗d˗˘˘ʘ˘˗˘ʘ˘ʘʘ˗ʗʘ˘˗ʗ˗˘˙˙˙˚ʛʛ˜˜ʝʞ˞˟ʠˠҢÏȉǃ|zwvtsrponmljihfededeedde̘d˗d˗e˗dʗd˘d˗d˗dʘe˘d˗eʘd˗e˘eʗeʗdʗdʘe˘dʗdʗdʘd˗d˘e˘d˘eʗdʗd˘dʘd˗dʘdʗdʘd˗eʘd˗e˗eʗeʗe˗eʘe˘e˘dʘdʗd˘d˘dʘdʗdʘe˗d˘d˘eʗd˘dʘe˘e˘dʗd˘d˗dʘ˘ʘʗ˗˘˘˘˘ʗ˘˘˘˗ʗʘ˘˘˗ʘʘ˘˘ʙ˙ʚ˛˜˜˜ʝ˞˟˟̟ȈȂ~{ywusrqpnmlkihgfdddddeۘe˘e˘d˘e˗e˘e˗eʘeʗd˘e˘e˗eʗe˗d˗eʘd˘eʗdʘdʗe˘e˘d˘e˗eʘeʘe˗dʘe˗dʗd˗e˗dʗd˘eʗeʗd˗dʘeʘeʗe˗e˘eʘdʘeʘe˘d˘dʗe˘dʘd˘e˗d˘dʘeʗe˘eʘeʗe˗e˘e˗eʘe˗eʘeʘʗ˘˘ʘ˘˘ʘʘ˘˘ʘ˘ʘ˗ʘ˗ʘ˗˘˘ʘ˗˘˘ʙ˙˙ʚ˛˜˜˜˝˞˟РƲȇɃ~{xuurqonnlkiigfeeddeϚd̙e̙e̗e˘e˘dʗe˘dʗe˘e˘e˘eʘe˘e˘dʘe˗d˘d˘e˗d˘e˘d˘e˗e˘e˘e˘eʘdʘd˗e˗e˘e˘eʗeʗd˘e˘e˗e˘e˘dʘeʘe˘d˘e˘e˘d˘dʘeʗdʘd˘dʘe˗dʘeʘe˗dʗeʘeʘe˘e˗e˗e˘d˗e˘e˘ʗ˘˘˘ʘ˘ʘ˘˘ʘ˘˘˘˘˘ʘ˘˘˘˘˘˘˘˘˘˘˘˙˙ʙ˚ʛ˜˜ʜ˝˞٢ڲƱƇɂ~zwutrponmkjihfeee؞dѝeϛe͚e͙e̙e̙e˘e˘e˘d˗e˘e˘eʘdʘd˘e˘e˘d˘eʘe˗e˘e˘e˘eʘe˘eʗe˘d˘d˘eʘeʘe˘eʘe˘e˘eʘe˘e˗e˘e˘eʘd˗eʘe˗e˘e˘e˘eʘd˘e˘e˗eʗe˘eʘe˗d˗e˗e˘eʘe˘e˗dʘdʘe˘eʗeʘe˘˘˘˘˘˘˘ʘ˘˗˘˘˘˘˘˘˘˘ʘ˘˘˘ʘ˘˘˘˘˘˘˗˘ʙ˘˙˚˛˜˜˜˝ۣ߰Ʋ‡ʂ}zvtsqonmlkihgfeآe֡eԟeҝeМeϚe͙e͙e̙d̗e˘e˘e˘e˘e˘e˘e˗e˗e˘e˗eʘe˘e˘e˘eʗe˘d˘e˘e˘e˘e˘e˘d˗e˘e˘eʘd˘e˘e˘e˘e˘eʘe˘e˘d˘e˘e˘e˘e˘d˘e˘eʘe˘e˘eʘe˘eʘe˘e˘eʘe˗eʘe˘e˗e˘e˘e˘e˘e˘˘̘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˙˙˙˚˛˜˜˜ܣƳʂ}yvtrpomlkjheeeݦeڤeעeՠeӟeѝeϛeΚe͚e̙e̙e̘e˘e˘e˘e˘e˘e˘e˘e˘e˘e˘e˘e˘e˘e˘e˘e˘e˘e˙e˘e˘e˘e˘e˘e˘e˘e˘e˘e˘e˘e˘e˘e˘e˘e˘e˘e˘e˘e˘e˘e˘e˘e˘e˘e˘e˘e˘e˘e˘e˘e˘e˘e˘e˘e˘e˘e˘e̘˘˘˘˘˘˘˘˘˘˘˘˘˘̘˘˘̘˘˘˙̙˘˘˘˘˘˘˙˘˘˘˘˘˘˘˘˘̙˙˚˛˜˜ԞǴªɀ}xvsqonlifeeeeeߧeܥe٣e֡e՟eӝeМeϛeΚe͙e̙e̙e̘e̘e˘e˘e˘e˘e˘e˘e˙e˘e˘f̘e̘e˘e˘e˘e˙e˘e˘e˙e˙e˘e˘e˘e˙e˘e˘e˘e̘e˙e˘e˘e˘e˘e˘e̙e˘e˘e̙e˙e˘e˘e˙f˘f̘e˘e˘e˙e˘e˘e̘e̘e˘e˘e˘e˘˙˘˙˙˘̘˘˘˘˘˙˘˘˘˘̘˘˘̘˘˘˘˙˘̘̘̘˘˙̘˙˙˘˘˙˙˘˘˘˘˙˙˚̛˜Νߥɴªƀ}xurnhfeefeeeeefݦeڤfآfՠeӞeѝfϜfΛe͚f̙e̚e̘e˘e˘e˘f˘e̘f˘f˙e˘f̙e˘e˙e˘e˘e˙e̘f˘e˘e˘e̘e˘e˘e˙e˘e̘e̘e˘e˘f˘e˘e̘f˘e̘f˘e˘e̘e˘e˙e˘e˘e˘f˘f˘e˘e˙e˘e˘e˘e˘e˘e˘e˘f˙e˘f˘˘˘˙̘̘˘˘̘˙˙̙˙˙̙˙˙˙˘˘˙˘˙̘˘˘˙˘̙˘˘˘̘̘˙˙˘˙˘̙̘˘˘̘˙˚̛˜˞Πܧ˴ëwnihfgeeefffeeeeߨfݥeڣeסeՠeҟeМeϜfΚeΙf̙e͙f̘e˘e˘e˘f˙e˘e̘e̘e˘f˘e˘e˘e˘f̙f˙e˘e˘e˙e˘e˘f˘e̙e̘e˘e˙e˘e˘e˘e̘e˘e̘e˘e˙f˘e˙e˙e̘e̙f˘f˙e̘e̙e˙f˘e̘e˘f˘f˘f̘e˘e̘e̘f˙̘˘˙̘˘̙̘˘˘˙˘˘˘˘˙˙̘˘̘˘˘̘˙̙̘˘̘˘̘˘˘˙̘̙̙˙˘˘˙˙̘˙˘˘̙˘˚˜˝̠̣˦Ԫϳé繏ⶃzspkihggefeefefeeefިeۥeآeՠfԟfҝfНfϛeΚfΙf͚e͘f˙e̘f˙e˙f˙e˘e˘e˙f˘f˘e˘e˘e˘f˘e̘f˘f˘e˙f̙f˘e̙f˘f˘f˙e˙f̙f̘f̙e̘e̙f˙e˘f̘e̘f̙f˙e˘e˙e˙e˘f̙e˙e̘e̘e˘e˘e̘f̙e˘e˙e˘˙̙˘˙˘̘˙̘˙˘̙˙̙̘̙˘̙̘̘˘̙̘˙˙˙˙˘̙˙˘̘̙̙˘˘̘˘̘˙˙˙˙̙̘˘̘˚̛̝̟̚ˢ̧˪˨̝˝֟ޠѥà־ٹܷztokjgffefeeefefffeߨfݧfڣeآf՟eӟeўeМfϛeΚf͙e͙f˘f̙f˙f̘f̘e̙e˘e̘f˘e˙e˘e˙f̙f̙f˙f˙f˙f̘e˘f˘e̘f˘f̘e̘f˘f̘f̙f̘f˙e˘f̘f̘e̙e˙f̘f˘e̘f˙e˙f̙e˘e˙f̘e̘e˙e̙f̘e̘e˙e˙˘˘̙˙˙˘˙˙̙˘̘̙˙̘̙̙̙˙̙˘̙̙˙̙̙˙˙˘̙˙̘̙˙̙˙̘̙̙̙̙˘̘˘̙˘˙̙˚̛̞̟̚ˣ˧̪ˡ˝̞˟̟ˠˠ̡̰֤̾ġֿعܷߴ{tpljhffeeffeffeefffߨeۥf٣f֢eԟeҞfНeϜe͛fΚe̙e͙f̘f˘e̙f˘e̘e˙f˘f̙f̙e˘f̘f˙f˙e̙e˙f̘e̙e̘e̘f̙e˙f̘e̘f˙f̘e̙f˘f̙e̘f˙e˘e̘f̘e̙f˘e˙f˙e˘e̙f̘e˘f˙f̙f˙f˙e̘e˘f˙˘̙̙˘̘˙˙̙̙˙̘˙˙̘̙˙̙̘˘˙̙̘̙˙̙̙̙̘̙˙̘̘̙˘̘̙˙˘̘̘̙̙˙̙˘̛̛̙̙̙̚˝̡ˤ̧˩̞̝˝˞̵̡̟̠̠̽٤Ţտغ۷޵{vqmjhggefeefffffffffݧeڥfآf֡fԟeҞeЛeϛfΚf͙f̚f͙f˘e̘e˙f˘f̘f˙f̙f˘e˙e˙f˙f̘e̙f̘f̙f˙f̙e̘e̘f̘e˙f̙f̘f̙f˘f˙f̘f˙f̘f˙f̙e̘f̙e̙f̘f̘e˙e˘f̙e̙f˙f̙f̙f˘f˘f̙˙˙˙̙˙˙̙̘˙̙̙̘˘̘˙̙̙̙̙̙̙̙˘̙̙̙̙˙̙̙̙̙̙̙˘̙˘̙˙̘̙̙̘̘˘̙̘̘̚˙˛̝˟̢̥̩˧̝̝̞̞̞̟̠ˤ̸̽ߠŤ׻۶ݵ~uqmjgggeeefffffeffffߧfܦf٣f֢fՠfӞfНeЛfϛe͚f̙e͚f̘f̙e̙f̙e˘e̙e˘e̘f̙f̙f̘f̙f̙f˙f̙e̙f̙f̘e̘f̙e̙f˘f˙f̘f̙f̙f̙f̙f̘e˙f˘f̘e˙e̙f˙f̘f̙f̙f˙e̘f̙f̙f˙e̘f̙̙˙̙̙̙̙̙̙̙̙̙˙˙̙˘̘̙̙˙̘̙̙̙̙˘̘̘̙̙˙̙̘̙̙̙̘̙̙̙̙˙̘˘̙̘̙̙˙˙̜̞̚̚ˠ̧̣̪̣̟̟̟̟̠̠ˠ̧˹̻ʳƦ׻ڶݴ~wrnkihgefefffffffffffާfۥfآf֡eԟeўfНfΛf͚f͙f͚f͙f˙f̙f̙f̘e˙f̙f̙f̙f̙f̙f̙e̙f̙f̙f̙f̙e̙f˙f̙f̘f˙f̙e̙f˘f̘f˙f̘f̙f˙f̙f̙e˙f̙f˙f̙f̙f̙f˘e̙f̙f̙e̘f̙̙̙˙̙̙̙̙̙̙̙̙̙̙̙̙̘̙˙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̘̙̙̙̙̙̙̙̙̙̙˙̙˙̙̙̚˛̸̡̧̢̡̡̡̡̡̡̢̝̟̤̪̪̻̿ðβǧֻٶܴxrnkiggeffffffffffefffݦfڤfעfԠfӟfѝfМfϛfΚf͚f͚f̙f̙f̙f̙f̙f̙f̙f̙f̘f̙f̙f̘f̘f̙f̙f̙f̙f̙f̙f̙f̙f̙f̙f̙f̙f̙f̙f̙e̙f̙f̙f̙f̙f˙e˙f˙f̙f̙f̙f̙f̙f̸̢̨̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̜̝̟̦̩̣̣̣̣̣̣̣̣̯̺̾̚̚ïѱɨռط۴߳ysokihggffffffffffffffިfۥf٣f֡fԟfҞfѝfϜfΛfΚf͚f͙f̙f̙f̙f̙f̙f̙f̙f̙f̙f̙f̙f̙f̙f̙f̙f̙f̙f̙f̙f̙f̙f̙f̙f̙f̙f̙f̙f̙f̙f̙f̙f̙f̙f̙f̙f̙f̙f̙f̙fDisplayCAL-3.1.0.0/misc/obs-autopackage-deploy/0000755000076500000000000000000012653527012020767 5ustar devwheel00000000000000DisplayCAL-3.1.0.0/misc/obs-autopackage-deploy/DisplayCAL.spec0000644000076500000000000000531512647526531023604 0ustar devwheel00000000000000# # spec file for package DisplayCAL # # Copyright (c) ${YEAR} SUSE LINUX Products GmbH, Nuernberg, Germany. # Copyright (c) ${YEAR} Florian Hoech # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed # upon. The license for this file, and modifications and additions to the # file, is the same license as for the pristine package itself (unless the # license for the pristine package is not an Open Source License, in which # case the license is the MIT License). An "Open Source License" is a # license that conforms to the Open Source Definition (Version 1.9) # published by the Open Source Initiative. # Please submit bugfixes or comments via http://bugs.opensuse.org/ # %define numpy_version 1.0 %define py_minversion ${PY_MINVERSION} %define py_maxversion ${PY_MAXVERSION} %define wx_minversion ${WX_MINVERSION} Summary: ${SUMMARY} License: GPL-3.0+ Group: Applications/Multimedia Name: ${PACKAGE} Version: ${VERSION} Release: 0 Source: ${URL}download/%{name}-%version.tar.gz Url: ${URL} BuildArch: noarch BuildRoot: %{_tmppath}/%{name}-%{version}-build BuildRequires: autopackage-devel BuildRequires: python < 3.0 BuildRequires: python >= %{py_minversion} %if 0%{?mandriva_version} > 0 Requires: autopackage Requires: python < 3.0 Requires: python >= %{py_minversion} Requires: python-numpy >= %{numpy_version} Requires: wxPythonGTK >= %{wx_minversion} %else %if 0%{?suse_version} > 0 Requires: autopackage Requires: python < 3.0 Requires: python >= %{py_minversion} Requires: python-numpy >= %{numpy_version} Requires: python-wxGTK >= %{wx_minversion} %py_requires %else %if 0%{?fedora_version} > 0 Requires: autopackage Requires: numpy >= %{numpy_version} Requires: python < 3.0 Requires: python >= %{py_minversion} Requires: wxPython >= %{wx_minversion} %endif %endif %endif %description ${DESC} %prep %setup # Make files executable chmod +x misc/Argyll chmod +x scripts/* chmod +x util/*.sh # Convert line endings in LICENSE.txt python -c "f = open('LICENSE.txt', 'rb') d = f.read().replace('\r\n', '\n').replace('\r', '\n') f.close() f = open('LICENSE.txt', 'wb') f.write(d) f.close()" %build util/dist_autopackage.sh chmod +x dist/${APPNAME}-*.package %install mkdir -p %{buildroot}/var/lib/packages mv dist/${APPNAME}-*.package %{buildroot}/var/lib/packages mv dist/${APPNAME}-*.package.meta %{buildroot}/var/lib/packages %clean rm -rf $RPM_BUILD_ROOT %files %defattr(-,root,root) /var/lib/packages/${APPNAME}-*.package /var/lib/packages/${APPNAME}-*.package.meta %changelog DisplayCAL-3.1.0.0/misc/PKGBUILD0000644000076500000000000000355312647526533015574 0ustar devwheel00000000000000# Maintainer: ${MAINTAINER} <${MAINTAINER_EMAIL}> pkgname=${APPNAME_LOWER} _pkgname=${PACKAGE} pkgver=${VERSION} pkgrel=1 pkgdesc="${SUMMARY}" arch=('i686' 'x86_64') url="${URL}" license=('GPL3') makedepends=('libx11' 'libxinerama' 'libxrandr' 'libxxf86vm') depends=('python2>=${PY_MINVERSION}' 'wxpython>=${WX_MINVERSION}' 'python2-numpy' 'python2-pygame' 'desktop-file-utils' 'hicolor-icon-theme' 'xdg-utils') optdepends=('argyllcms: calibration & profiling support') conflicts=('dispcalgui' 'dispcalgui-0install' '${APPNAME_LOWER}-0install') install=${pkgname}.install source=("${URL}download/${_pkgname}-${pkgver}.tar.gz") md5sums=('${MD5}') build() { cd "${srcdir}/${_pkgname}-${pkgver}" # Convert line endings in LICENSE.txt python2 -c "f = open('LICENSE.txt', 'rb') d = f.read().replace('\r\n', '\n').replace('\r', '\n') f.close() f = open('LICENSE.txt', 'wb') f.write(d) f.close()" python2 setup.py build --use-distutils } package() { cd "${srcdir}/${_pkgname}-${pkgver}" python2 setup.py install --root="${pkgdir}" --optimize=1 --skip-instrument-configuration-files --skip-postinstall # udev/hotplug mkdir -p "${pkgdir}/usr/share/${_pkgname}/usb" # USB and serial instruments using udev, where udev already creates /dev/bus/usb/00X/00X devices cp -f "misc/55-Argyll.rules" "${pkgdir}/usr/share/${_pkgname}/usb/55-Argyll.rules" # USB using udev, where there are NOT /dev/bus/usb/00X/00X devices cp -f "misc/45-Argyll.rules" "${pkgdir}/usr/share/${_pkgname}/usb/45-Argyll.rules" # USB using hotplug and Serial using udev (older versions of Linux) cp -f "misc/Argyll" "${pkgdir}/usr/share/${_pkgname}/usb/Argyll" cp -f "misc/Argyll.usermap" "${pkgdir}/usr/share/${_pkgname}/usb/Argyll.usermap" # Fix permissions - read for all, eXecute for directories and scripts chmod -R +rX "${pkgdir}" } # vim:set ts=2 sw=2 et: DisplayCAL-3.1.0.0/misc/py2exe/0000755000076500000000000000000012653527012015644 5ustar devwheel00000000000000DisplayCAL-3.1.0.0/misc/py2exe/boot_common.py0000644000076500000000000000604212647526532020544 0ustar devwheel00000000000000# Common py2exe boot script - executed for all target types. # When we are a windows_exe we have no console, and writing to # sys.stderr or sys.stdout will sooner or later raise an exception, # and tracebacks will be lost anyway (see explanation below). # # We assume that output to sys.stdout can go to the bitsink, but we # *want* to see tracebacks. So we redirect sys.stdout into an object # with a write method doing nothing, and sys.stderr into a logfile # having the same name as the executable, with '.log' appended. # # We only open the logfile if something is written to sys.stderr. # # If the logfile cannot be opened for *any* reason, we have no choice # but silently ignore the error. # # More elaborate explanation on why this is needed: # # The sys.stdout and sys.stderr that GUI programs get (from Windows) are # more than useless. This is not a py2exe problem, pythonw.exe behaves # in the same way. # # To demonstrate, run this program with pythonw.exe: # # import sys # sys.stderr = open("out.log", "w") # for i in range(10000): # print i # # and open the 'out.log' file. It contains this: # # Traceback (most recent call last): # File "out.py", line 6, in ? # print i # IOError: [Errno 9] Bad file descriptor # # In other words, after printing a certain number of bytes to the # system-supplied sys.stdout (or sys.stderr) an exception will be raised. # import sys if sys.frozen == "windows_exe": class Stderr(object): encoding = None softspace = 0 _file = None _error = None def write(self, text, alert=sys._MessageBox, fname=sys.executable + '.log'): if self._file is None and self._error is None: try: self._file = open(fname, 'w') except Exception, details: self._error = details if self._file is not None: self._file.write(text) self._file.flush() def flush(self): if self._file is not None: self._file.flush() def isatty(self): return False sys.stderr = Stderr() del sys._MessageBox del Stderr class Blackhole(object): encoding = None softspace = 0 def write(self, text): pass def flush(self): pass def isatty(self): return False sys.stdout = Blackhole() del Blackhole del sys # Disable linecache.getline() which is called by # traceback.extract_stack() when an exception occurs to try and read # the filenames embedded in the packaged python code. This is really # annoying on windows when the d: or e: on our build box refers to # someone elses removable or network drive so the getline() call # causes it to ask them to insert a disk in that drive. import linecache def fake_getline(filename, lineno, module_globals=None): return '' linecache.orig_getline = linecache.getline linecache.getline = fake_getline del linecache, fake_getline DisplayCAL-3.1.0.0/misc/py2exe/build_exe.py.patch0000644000076500000000000000107012647526532021263 0ustar devwheel00000000000000--- build_exe.py.bak Sat Aug 30 18:56:46 2008 +++ build_exe.py Sun Jan 26 03:56:21 2014 @@ -790,7 +790,8 @@ # Build an executable for the target # template is the exe-stub to use, and arcname is the zipfile # containing the python modules. - from py2exe_util import add_resource, add_icon + from py2exe_util import add_resource + from icon import add_icon ext = os.path.splitext(template)[1] exe_base = target.get_dest_base() exe_path = os.path.join(self.dist_dir, exe_base + ext) DisplayCAL-3.1.0.0/misc/py2exe/icon.py0000644000076500000000000001425412647526532017165 0ustar devwheel00000000000000#----------------------------------------------------------------------------- # Copyright (c) 2013, PyInstaller Development Team. # # Distributed under the terms of the GNU General Public License with exception # for distributing bootloader. # # The full license is in the file COPYING.txt, distributed with this software. #----------------------------------------------------------------------------- RT_ICON = 3 RT_GROUP_ICON = 14 LOAD_LIBRARY_AS_DATAFILE = 2 import struct import types try: StringTypes = types.StringTypes except AttributeError: StringTypes = [ type("") ] import logging logger = logging.getLogger() class Structure: def __init__(self): size = self._sizeInBytes = struct.calcsize(self._format_) self._fields_ = list(struct.unpack(self._format_, '\000' * size)) indexes = self._indexes_ = {} for i, nm in enumerate(self._names_): indexes[nm] = i def dump(self): logger.info("DUMP of %s", self) for name in self._names_: if not name.startswith('_'): logger.info("%20s = %s", name, getattr(self, name)) logger.info("") def __getattr__(self, name): if name in self._names_: index = self._indexes_[name] return self._fields_[index] try: return self.__dict__[name] except KeyError: raise AttributeError, name def __setattr__(self, name, value): if name in self._names_: index = self._indexes_[name] self._fields_[index] = value else: self.__dict__[name] = value def tostring(self): return apply(struct.pack, [self._format_,] + self._fields_) def fromfile(self, file): data = file.read(self._sizeInBytes) self._fields_ = list(struct.unpack(self._format_, data)) class ICONDIRHEADER(Structure): _names_ = "idReserved", "idType", "idCount" _format_ = "hhh" class ICONDIRENTRY(Structure): _names_ = ("bWidth", "bHeight", "bColorCount", "bReserved", "wPlanes", "wBitCount", "dwBytesInRes", "dwImageOffset") _format_ = "bbbbhhii" class GRPICONDIR(Structure): _names_ = "idReserved", "idType", "idCount" _format_ = "hhh" class GRPICONDIRENTRY(Structure): _names_ = ("bWidth", "bHeight", "bColorCount", "bReserved", "wPlanes", "wBitCount", "dwBytesInRes", "nID") _format_ = "bbbbhhih" class IconFile: def __init__(self, path): self.path = path file = open(path, "rb") self.entries = [] self.images = [] header = self.header = ICONDIRHEADER() header.fromfile(file) for i in range(header.idCount): entry = ICONDIRENTRY() entry.fromfile(file) self.entries.append(entry) for e in self.entries: file.seek(e.dwImageOffset, 0) self.images.append(file.read(e.dwBytesInRes)) def grp_icon_dir(self): return self.header.tostring() def grp_icondir_entries(self, id=1): data = "" for entry in self.entries: e = GRPICONDIRENTRY() for n in e._names_[:-1]: setattr(e, n, getattr(entry, n)) e.nID = id id = id + 1 data = data + e.tostring() return data def CopyIcons_FromIco(dstpath, srcpath, id=1): import win32api #, win32con icons = map(IconFile, srcpath) logger.info("Updating icons from %s to %s", srcpath, dstpath) hdst = win32api.BeginUpdateResource(dstpath, 0) iconid = 1 for i, f in enumerate(icons): data = f.grp_icon_dir() data = data + f.grp_icondir_entries(iconid) win32api.UpdateResource(hdst, RT_GROUP_ICON, i, data) logger.info("Writing RT_GROUP_ICON %d resource with %d bytes", i, len(data)) for data in f.images: win32api.UpdateResource(hdst, RT_ICON, iconid, data) logger.info("Writing RT_ICON %d resource with %d bytes", iconid, len(data)) iconid = iconid + 1 win32api.EndUpdateResource(hdst, 0) def CopyIcons(dstpath, srcpath): import os.path if type(srcpath) in StringTypes: srcpath = [ srcpath ] def splitter(s): try: srcpath, index = s.split(',') return srcpath.strip(), int(index) except ValueError: return s, None srcpath = map(splitter, srcpath) logger.info("SRCPATH %s", srcpath) if len(srcpath) > 1: # At the moment, we support multiple icons only from .ico files srcs = [] for s in srcpath: e = os.path.splitext(s[0])[1] if e.lower() != '.ico': raise ValueError, "multiple icons supported only from .ico files" if s[1] is not None: raise ValueError, "index not allowed for .ico files" srcs.append(s[0]) return CopyIcons_FromIco(dstpath, srcs) srcpath,index = srcpath[0] srcext = os.path.splitext(srcpath)[1] if srcext.lower() == '.ico': return CopyIcons_FromIco(dstpath, [srcpath]) if index is not None: logger.info("Updating icons from %s, %d to %s", srcpath, index, dstpath) else: logger.info("Updating icons from %s to %s", srcpath, dstpath) import win32api #, win32con hdst = win32api.BeginUpdateResource(dstpath, 0) hsrc = win32api.LoadLibraryEx(srcpath, 0, LOAD_LIBRARY_AS_DATAFILE) if index is None: grpname = win32api.EnumResourceNames(hsrc, RT_GROUP_ICON)[0] elif index >= 0: grpname = win32api.EnumResourceNames(hsrc, RT_GROUP_ICON)[index] else: grpname = -index data = win32api.LoadResource(hsrc, RT_GROUP_ICON, grpname) win32api.UpdateResource(hdst, RT_GROUP_ICON, grpname, data) for iconname in win32api.EnumResourceNames(hsrc, RT_ICON): data = win32api.LoadResource(hsrc, RT_ICON, iconname) win32api.UpdateResource(hdst, RT_ICON, iconname, data) win32api.FreeLibrary(hsrc) win32api.EndUpdateResource(hdst, 0) def add_icon(exe_path, ico_filename, ico_id): CopyIcons(exe_path, "%s,%i" % (ico_filename, ico_id)) if __name__ == "__main__": import sys dstpath = sys.argv[1] srcpath = sys.argv[2:] CopyIcons(dstpath, srcpath) DisplayCAL-3.1.0.0/misc/py2exe/README.txt0000644000076500000000000000123712647526532017356 0ustar devwheel00000000000000Patches for py2exe 0.6.9 Copy these files into the py2exe directory, overwriting existing files. boot_common.py The original stdout and stderr redirection does not implement the 'isatty' method. The patched file adds it. build_exe.py The add_icon method is faulty. When adding icons to an exe, it begins counting at index 0, which is wrong (it should start at 1). Also, it does not reset the index for additional targets, so if the first target got 7 icons (index 0..6) then the next target's icon index will begin at 7. The patched file works around those problems by not using the faulty implementation, but a tried-and-tested one from PyInstaller (icon.py) instead. DisplayCAL-3.1.0.0/misc/README.template.html0000644000076500000000000073561512653526636020121 0ustar devwheel00000000000000 ${APPNAME} (formerly known as dispcalGUI)—Open Source Display Calibration and Characterization powered by Argyll CMS

If you'd like to measure color on the go, you may also be interested in ArgyllPRO ColorMeter by Graeme Gill, author of Argyll CMS. Available for Android from the Google Play store. Check out the 2 Minute Overview + Guided Tour Video.

About ${APPNAME}

${APPNAME} is a graphical user interface developed by Florian Höch for the display calibration and profiling tools of Argyll CMS, an open source color management system developed by Graeme Gill.

Calibrate and characterize your display devices using one of the many supported hardware sensors, with support for multi-display setups and a variety of available settings like customizable whitepoint, luminance, tone response curve as well as the option to create matrix and look-up-table ICC profiles, with optional gamut mapping, as well as some proprietary 3D LUT formats. Other features include:

  • Support of colorimeter correction for different screens via correction matrices or calibration specral sample files (the latter only for specific colorimeters i.e. i1 Display Pro, ColorMunki Display and Spyder 4/5).
  • Profile verification and measurement report: Check the quality of profiles and 3D LUTs via measurements. Also supports custom CGATS files (e.g. FOGRA, GRACoL/IDEAlliance, SWOP) and using of reference profiles to obtain test values.
  • Test chart editor: Create charts with any amount of color patches, easy copy & paste from CGATS, CSV files (only tab-delimited) and spreadsheet applications.
  • Create synthetic ICC (matrix) profiles with custom primaries, white- and blackpoint as well as tone response.

Screenshots


Display & instrument settings

Calibration settings

Profiling settings


3D LUT settings

Verification settings

Testchart editor


Display adjustment

Profile information

Calibration curves


KDE4

Mac OS X

Windows 10

Disclaimer

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.

${APPNAME} is written in Python and uses the 3rd-party packages NumPy, demjson (JSON[6] library) and wxPython (GUI[4] toolkit). It also makes extensive use of several Argyll CMS utilities. The build system to create standalone executables additionally uses setuptools and py2app on Mac OS X or py2exe on Windows. All of these software packages are © by their respective authors.

Get ${APPNAME} standalone

Please continue with the Quickstart Guide.

Get ${APPNAME} via Zero Install

  • Brief introduction to Zero Install

    (Note: Usually you do not have to install Zero Install separately, it is handled automatically by the ${APPNAME} downloads linked below. The following paragraph is only informational.)

    Zero Install is a decentralised cross-platform software installation system. The benefits you get from Zero Install are:

    • Always up-to-date. Zero Install automatically keeps all software updated.
    • Easily switch between software versions from within Zero Install if desired.
    • No administrator rights needed to add or update software (*).

    * Note: Installing/updating Zero Install itself or software dependencies through the operating system's mechanisms may require administrative privileges.

  • For Linux

    Native packages for several distributions are available via openSUSE Build Service:

    Arch Linux note: The zeroinstall-injector 2.6.1 package in AUR is broken. Get a working version here:

    Please note:

    • The version number in the package name does not necessarily reflect the ${APPNAME} version.

    Packages made for older distributions may work on newer distributions as long as nothing substantial has changed (i.e. Python version). Also there are several distributions out there that are based on one in the above list (e.g. Linux Mint which is based on Ubuntu). This means that packages for that base distribution should also work on derivatives, you just need to know which version the derivative is based upon and pick your download accordingly. In all other cases, please try the instructions below or one of the standalone installations.

    Alternate installation method

    If your distribution is not listed above, please follow these instructions:

    1. Install the 0install or zeroinstall-injector package from your distribution. In case it is not available, there are pre-compiled generic binaries. Download the appropriate archive for your system, unpack it, cd to the extracted folder in a terminal, and run sudo ./install.sh local to install to /usr/local, or ./install.sh home to install to your home directory (you may have to add ~/bin to your PATH variable in that case). You'll need libcurl installed (most systems have it by default).
    2. Choose the 0install entry from the applications menu (older versions of Zero Install will have an “Add New Program” entry instead).
    3. Drag ${APPNAME}'s Zero Install feed link to the Zero Install window.

    Note on ${APPNAME}'s standalone tools under Linux (3D LUT maker, curve viewer, profile information, synthetic profile creator, testchart editor, VRML to X3D converter): If using the alternate installation method, an application icon entry will only be created for ${APPNAME} itself. This is currently a limitation of Zero Install under Linux. You can manually install icon entries for the standalone tools by running the following in a terminal:

    0launch --command=install-standalone-tools-icons \
    ${URL}0install/${APPNAME}.xml

    And you may uninstall them again with:

    0launch --command=uninstall-standalone-tools-icons \
    ${URL}0install/${APPNAME}.xml
  • For Mac OS X (10.5 or newer)

    Download the ${APPNAME} Zero Install Launcher disk image and run any of the included applications.

  • For Windows (XP or newer)

    Download and install the ${APPNAME} Zero Install Setup: Administrator install | Per-user install.

  • Manually updating or switching between software versions

    Updates are normally applied automatically. If you want to manually update or switch between software versions, please follow the instructions below.

    • Linux

      Choose the 0install entry from the applications menu (older versions of Zero Install will have a “Manage Programs” entry instead). In the window that opens, right-click the ${APPNAME} icon and select “Choose versions” (with older versions of Zero Install, you have to click the small “Update or change version” icon below the “Run” button instead). You can then click the “Refresh all” button to update, or click the small button to the right of an entry and select “Show versions”.

      To select a specific software version, click on the version entry and set the rating to “preferred” (note that this will prevent updates being downloaded for the selected software until you manually change to a different version or reset the rating).

    • Mac OS X

      Run the 0install Launcher. In the window that opens, click the “Refresh all” button to update, or click the small button to the right of an entry and select “Show versions”.

      To select a specific software version, click on the version entry and set the rating to “preferred” (note that this will prevent updates being downloaded for the selected software until you manually change to a different version or reset the rating).

    • Windows

      Choose the Zero Install entry from the start page under Windows 8, or the respective subfolder of the programs folder in the start menu under Windows 10, Windows 7 and earlier, and switch to the “My Applications” tab in the window that opens. Click the small “down” arrow inside the “Start” button to the right of the ${APPNAME} entry and choose “Update” or “Select version”.

      To select a specific software version, click on the “change” link next to an item, then click on the version entry and set the rating to “preferred” (note that this will prevent updates being downloaded for the selected software until you manually change to a different version or reset the rating).

Please continue with the Quickstart Guide.

Quickstart guide

This short guide intends to get you up and running quickly, but if you run into a problem, please refer to the full prerequisites and installation sections.

  1. Launch ${APPNAME}. If it cannot find Argyll CMS on your computer, it will prompt you to automatically download the latest version or select the location manually.

  2. Windows only: If your measurement device is not a ColorMunki Display, i1 Display Pro, Huey, ColorHug, specbos or K-10, you need to install an Argyll-specific driver before continuing. Select “Install Argyll CMS instrument drivers...” from the “Tools” menu. See also “Instrument driver installation under Windows”.

    Mac OS X only: If you want to use the HCFR colorimeter, follow the instructions in the “HCFR Colorimeter” section under “Installing Argyll CMS on Mac OS X” in the Argyll CMS documentation before continuing.

    Connect your measurement device to your computer.

  3. Click the small icon with the swirling arrow in between the “Display device” and “Instrument” controls to detect connected display devices and instruments. The detected instrument(s) should show up in the “Instrument” dropdown.

    If your measurement device is a Spyder 2, a popup dialog will show which will let you enable the device. This is required to be able to use the Spyder 2 with Argyll CMS and ${APPNAME}.

    If your measurement device is a i1 Display 2, i1 Display Pro, ColorMunki Display, DTP94, Spyder 2/3/4/5, a popup dialog will show and allow you to import generic colorimeter corrections from the vendor software which may help measurement accuracy on the type of display you're using. After importing, they are available under the “Correction” dropdown, where you can choose one that fits the type of display you have, or leave it at “Auto” if there is no match. Note: Importing from the Spyder 4/5 software enables additional measurement modes for that instrument.

  4. Click “Calibrate & profile”. That's it!

    Feel free to check out the Wiki for guides and tutorials, and refer to the documentation for advanced usage instructions (optional).

    Linux only: If you can't access your instrument, choose “Install Argyll CMS instrument configuration files...” from the “Tools” menu (if that menu item is grayed out, the Argyll CMS version you're currently using has probably been installed from the distribution's repository and should already be setup correctly for instrument access). If you still cannot access the instrument, try unplugging and reconnecting it, or a reboot. If all else fails, read “Installing Argyll CMS on Linux: Setting up instrument access” in the Argyll CMS documentation.

System requirements and other prerequisites

General system requirements

  • A recent Linux, Mac OS X (10.5 or newer) or Windows (XP/Server 2003 or newer) operating system.
  • A graphics card with at least 24 bits per pixel (true color) support and the desktop set up to use this color depth.

Argyll CMS

To use ${APPNAME}, you need to download and install Argyll CMS (1.0 or newer).

Supported instruments

You need one of the supported instruments to make measurements. All instruments supported by Argyll CMS are also supported by ${APPNAME}. For display readings, these currently are:

Colorimeters

  • CalMAN X2 (treated as i1 Display 2)
  • Datacolor/ColorVision Spyder 2
  • Datacolor Spyder 3 (since Argyll CMS 1.1.0)
  • Datacolor Spyder 4 (since Argyll CMS 1.3.6)
  • Datacolor Spyder 5 (since Argyll CMS 1.7.0)
  • HP Advanced Profiling Solution (treated as i1 Display 2)
  • HP DreamColor (treated as i1 Display 2)
  • Hughski ColorHug (Linux support since Argyll CMS 1.3.6, Windows support with newest ColorHug firmware since Argyll CMS 1.5.0, fully functional Mac OS X support since Argyll CMS 1.6.2)
  • Hughski ColorHug2 (new in Argyll CMS 1.7.0)
  • Image Engineering EX1 (new in Argyll CMS 1.8.0 Beta)
  • Klein K10-A (new in Argyll CMS 1.7.0)
  • Lacie Blue Eye (treated as i1 Display 2)
  • Sequel Imaging MonacoOPTIX (treated as i1 Display 1)
  • X-Rite ColorMunki Create (treated as i1 Display 2)
  • X-Rite ColorMunki Smile (since Argyll CMS 1.5.0)
  • X-Rite DTP92
  • X-Rite DTP94
  • X-Rite/GretagMacbeth/Pantone Huey
  • X-Rite/GretagMacbeth i1 Display 1
  • X-Rite/GretagMacbeth i1 Display 2/LT
  • X-Rite i1 Display Pro, ColorMunki Display (since Argyll CMS 1.3.4)

Spectrometers

  • JETI specbos 1211/1201 (since Argyll CMS 1.6.0)
  • X-Rite ColorMunki Design, ColorMunki Photo (since Argyll CMS 1.1.0)
  • X-Rite/GretagMacbeth i1 Monitor (since Argyll CMS 1.0.3)
  • X-Rite/GretagMacbeth i1 Pro
  • X-Rite i1 Pro 2 (since Argyll CMS 1.5.0)
  • X-Rite/GretagMacbeth Spectrolino

If you've decided to buy a color instrument because Argyll CMS supports it, please let the dealer and manufacturer know that “You bought it because Argyll CMS supports it”—thanks.

Note that the i1 Display Pro and i1 Pro are very different instruments despite their naming similarities.

Also there are currently (2014-05-20) five instruments (or rather, packages) under the ColorMunki brand, two of which are spectrometers, and three are colorimeters (not all of them being recent offerings, but you should be able to find them used in case they are no longer sold new):

  • The ColorMunki Design and ColorMunki Photo spectrometers differ only in the functionality of the bundled vendor software. There are no differences between the instruments when used with Argyll CMS and ${APPNAME}.
  • The ColorMunki Display colorimeter is a less expensive version of the i1 Display Pro colorimeter. It comes bundled with a simpler vendor software and has longer measurement times compared to the i1 Display Pro. Apart from that, the instrument appears to be virtually identical.
  • The ColorMunki Create and ColorMunki Smile colorimeters are similar hardware as the i1 Display 2 (with the ColorMunki Smile no longer having a built-in correction for CRT but for white LED backlit LCD instead).

Additional requirements for unattended calibration and profiling

When using a spectrometer that is supported by the unattended feature (see below), having to take the instrument off the screen to do a sensor self-calibration again after display calibration before starting the measurements for profiling may be avoided if the menu item “Allow skipping of spectrometer self-calibration” in the “Options” menu is checked (colorimeter measurements are always unattended because they generally do not require a sensor calibration away from the screen, with the exception of the i1 Display 1).

Unattended calibration and profiling currently supports the following spectrometers in addition to most colorimeters:

  • X-Rite ColorMunki
  • X-Rite/GretagMacbeth i1 Monitor & Pro
  • X-Rite/GretagMacbeth Spectrolino
  • X-Rite i1 Pro 2

Be aware you may still be forced to do a sensor calibration if the instrument requires it. Also, please look at the possible caveats.

Additional requirements for using the source code

You can skip this section if you downloaded a package, installer, ZIP archive or disk image of ${APPNAME} for your operating system and do not want to run from source.

All platforms:

  • Python >= v2.6 <= v2.7.x (2.7.x is the recommended version. Mac OS X users: If you want to compile ${APPNAME}'s C extension module, it is advisable to first install XCode and then the official python.org Python)
  • NumPy
  • wxPython GUI[4] toolkit

Windows:

Additional requirements for compiling the C extension module

Normally you can skip this section as the source code contains pre-compiled versions of the C extension module that ${APPNAME} uses.

Linux:

  • GCC and development headers for Python + X11 + Xrandr + Xinerama + Xxf86vm if not already installed, they should be available through your distribution's packaging system

Mac OS X:

  • XCode
  • py2app if you want to build a standalone executable. On Mac OS X before 10.5, install setuptools first: sudo python util/ez_setup.py setuptools

Windows:

  • a C-compiler (e.g. MS Visual C++ Express or MinGW. If you're using the official python.org Python 2.6 or later I'd recommend Visual C++ Express as it works out of the box)
  • py2exe if you want to build a standalone executable

Running directly from source

After satisfying all additional requirements for using the source code, you can simply run any of the included .pyw files from a terminal, e.g. python2 ${APPNAME}.pyw, or install the software so you can access it via your desktop's application menu with python2 setup.py install. Run python2 setup.py --help to view available options.

One-time setup instructions for source code checked out from SVN:

Run python2 setup.py to create the version file so you don't see the update popup at launch.

If the pre-compiled extension module that is included in the sources does not work for you (in that case you'll notice that the movable measurement window's size does not closely match the size of the borderless window generated by Argyll CMS during display measurements) or you want to re-build it unconditionally, run python2 setup.py build_ext -i to re-build it from scratch (you need to satisfy the requirements for compiling the C extension module first).

Installation

It is recommended to first remove all previous versions unless you used Zero Install to get them.

Instrument driver installation under Windows

You only need to install the Argyll-specific driver if your measurement device is not a ColorMunki Display, i1 Display Pro, Huey, ColorHug, specbos or K-10.

If you are using Windows 8, 8.1, or 10, you need to disable driver signature enforcement before you can install the driver. If Secure Boot is enabled in the UEFI[12] setup, you need to disable it first. Refer to your mainboard or firmware manual how to go about this. Usually entering the firmware setup requires holding the DEL key when the system starts booting.

Method 1: Disable driver signature enforcement temporarily

  1. Go to “Settings” (hover the lower right corner of the screen, then click the gear icon)
  2. Select “Power” (the on/off icon)
  3. Hold the SHIFT key down and click “Restart”.
  4. Select “Troubleshoot → “Advanced Options” → “Startup Settings” → “Restart”
  5. After reboot, select “Disable Driver Signature Enforcement” (number 7 on the list)

Method 2: Disable driver signature enforcement permanently

  1. Open an elevated command prompt. Search for “Command Prompt” in the Windows start menu, right-click and select “Run as administrator”
  2. Run the following command: bcdedit /set loadoptions DDISABLE_INTEGRITY_CHECKS
  3. Run the following command: bcdedit /set TESTSIGNING ON
  4. Reboot

To install the Argyll-specific driver that is needed to use some instruments, launch ${APPNAME} and select “Install Argyll CMS instrument drivers...” from the “Tools” menu.

To switch between the Argyll CMS and vendor drivers, launch Windows' Device Manager and locate the instrument in the device list. It may be underneath one of the top level items. Right click on the instrument and select “Update Driver Software...”, then choose “Browse my computer for driver software”, “Let me pick from a list of device drivers on my computer” and finally select the Argyll driver for your instrument from the list.

Linux package (.deb/.rpm)

A lot of distributions allow easy installation of packages via the graphical desktop, i.e. by double-clicking the package file's icon. Please consult your distribution's documentation if you are unsure how to install packages.

If you cannot access your instrument, first try unplugging and reconnecting it, or a reboot. If that doesn't help, read “Installing Argyll CMS on Linux: Setting up instrument access”.

Linux Autopackage (.package)

Before installing the autopackage, first install wxPython (on some systems called python-wxGTK or python-wxWidgets) and NumPy using your system's package management software. To install the autopackage, follow these three steps (you only have to do it once, next time, you can just skip these steps and open the .package file directly):

  1. Click on the package with your right mouse button. Then click on the “Properties” menu item.
  2. Go to the “Permissions” tab.
    • Check the “Execute”, “Exec” or “Is Executable” checkbox. If there are more than one Execute/Exec checkboxes, check the top-most one.
    • Click “Close” or “OK”, depending on the dialog.
  3. If you already have the software installed from your distributions packages or from the source, remove it first. Then open the package file. If you are asked whether you want to display or run the package, choose “Run”.

The installation will now begin. Follow further intructions that are displayed, if any.

If you cannot access your instrument, first try unplugging and reconnecting it, or a reboot. If that doesn't help, read “Installing Argyll CMS on Linux: Setting up instrument access”.

Mac OS X

Mount the disk image and option-drag its icon to your “Applications” folder. Afterwards open the “${APPNAME}” folder in your “Applications” folder and drag ${APPNAME}'s icon to the dock if you want easy access.

If you want to use the HCFR colorimeter under Mac OS X, follow the instructions under “installing Argyll CMS on Mac OS X” in the Argyll CMS documentation.

Windows (Installer)

Launch the installer which will guide you trough the required setup steps.

If your measurement device is not a ColorMunki Display, i1 Display Pro, Huey, ColorHug, specbos or K-10, you need to install an Argyll-specific driver. See “Instrument driver installation under Windows”.

Windows (ZIP archive)

Unpack and then simply run ${APPNAME} from the created folder.

If your measurement device is not a ColorMunki Display, i1 Display Pro, Huey, ColorHug, specbos or K-10, you need to install an Argyll-specific driver. See “Instrument driver installation under Windows”.

Source code (all platforms)

See the “Prerequisites” section to run directly from source.

Starting with ${APPNAME} 0.2.5b, you can use standard distutils/setuptools commands with setup.py to build, install, and create packages. sudo python setup.py install will compile the extension modules and do a standard installation. Run python setup.py --help or python setup.py --help-commands for more information. A few additional commands and options which are not part of distutils or setuptools (and thus do not appear in the help) are also available:

Additional setup commands

0install
Create/update 0install feeds and create Mac OS X application bundles to run those feeds.
appdata
Create/update AppData file.
bdist_appdmg (Mac OS X only)
Creates a DMG of previously created (by the py2app or bdist_standalone commands) application bundles, or if used together with the 0install command.
bdist_deb (Linux/Debian-based)
Create an installable Debian (.deb) package, much like the standard distutils command bdist_rpm for RPM packages. Prerequisites: You first need to install alien and rpmdb, create a dummy RPM database via sudo rpmdb --initdb, then edit (or create from scratch) the setup.cfg (you can have a look at misc/setup.ubuntu9.cfg for a working example). Under Ubuntu, running utils/dist_ubuntu.sh will automatically use the correct setup.cfg. If you are using Ubuntu 11.04 or any other debian-based distribution which has Python 2.7 as default, you need to edit /usr/lib/python2.7/distutils/command/bdist_rpm.py, and change the line install_cmd = ('%s install -O1 --root=$RPM_BUILD_ROOT ' to install_cmd = ('%s install --root=$RPM_BUILD_ROOT ' by removing the -O1 flag. Also, you need to change /usr/lib/rpm/brp-compress to do nothing (e.g. change the file contents to exit 0, but don't forget to create a backup copy first) otherwise you will get errors when building.
bdist_lipa
Create a Listaller package.
bdist_pyi
An alternative to bdist_standalone, which uses PyInstaller instead of bbfreeze/py2app/py2exe.
bdist_standalone
Creates a standalone application that does not require a Python installation. Uses bbfreeze on Linux, py2app on Mac OS X and py2exe on Windows. setup.py will try and automatically download/install these packages for you if they are not yet installed and if not using the --use-distutils switch. Note: On Mac OS X, older versions of py2app (before 0.4) are not able to access files inside python “egg” files (which are basically ZIP-compressed folders). Setuptools, which is needed by py2app, will normally be installed in “egg” form, thus preventing those older py2app versions from accessing its contents. To fix this, you need to remove any installed setuptools-<version>-py<python-version>.egg files from your Python installation's site-packages directory (normally found under /Library/Frameworks/Python.framework/Versions/Current/lib). Then, run sudo python util/ez_setup.py -Z setuptools which will install setuptools unpacked, thus allowing py2app to acces all its files. This is no longer an issue with py2app 0.4 and later.
buildservice
Creates control files for openSUSE Build Service (also happens implicitly when invoking sdist).
finalize_msi (Windows only)
Adds icons and start menu shortcuts to the MSI installer previously created with bdist_msi. Successful MSI creation needs a patched msilib (additional information).
inno (Windows only)
Creates Inno Setup scripts which can be used to compile setup executables for standalone applications generated by the py2exe or bdist_standalone commands and for 0install.
purge
Removes the build and ${APPNAME}.egg-info directories including their contents.
purge_dist
Removes the dist directory and its contents.
readme
Creates README.html by parsing misc/README.template.html and substituting placeholders like date and version numbers.
uninstall
Uninstalls the package. You can specify the same options as for the install command.

Additional setup options

--cfg=<name>
Use an alternate setup.cfg, e.g. tailored for a given Linux distribution. The original setup.cfg is backed up and restored afterwards. The alternate file must exist as misc/setup.<name>.cfg
-n, --dry-run
Don't actually do anything. Useful in combination with the uninstall command to see which files would be removed.
--skip-instrument-configuration-files
Skip installation of udev rules and hotplug scripts.
--skip-postinstall
Skip post-installation on Linux (an entry in the desktop menu will still be created, but may not become visible until logging out and back in or rebooting) and Windows (no shortcuts in the start menu will be created at all).
--stability=stable | testing | developer | buggy | insecure
Set the stability for the implementation that is added/updated via the 0install command.
--use-distutils
Force setup to use distutils (default) instead of setuptools. This is useful in combination with the bdist* commands, because it will avoid an artificial dependency on setuptools. This is actually a switch, use it once and the choice is remembered until you specify the --use-setuptools switch (see next paragraph).
--use-setuptools
Force setup to try and use setuptools instead of distutils. This is actually a switch, use it once and the choice is remembered until you specify the --use-distutils switch (see above).

Instrument-specific setup

If your measurement device is a i1 Display 2, i1 Display Pro, ColorMunki Display, DTP94, Spyder 2/3/4/5, you'll want to import the colorimeter corrections that are part of the vendor software packages, which can be used to better match the instrument to a particular type of display. Note: The full range of measurement modes for the Spyder 4/5 are also only available if they are imported from the Spyder 4/5 software.

Choose “Import colorimeter corrections from other display profiling software...” from ${APPNAME}'s “Tools” menu.

If your measurement device is a Spyder 2, you need to enable it to be able to use it with Argyll CMS and ${APPNAME}. Choose “Enable Spyder 2 colorimeter...” from ${APPNAME}'s “Tools” menu.

Basic concept of display calibration and profiling

If you have previous experience, skip ahead. If you are new to display calibration, here is a quick outline of the basic concept.

First, the display behavior is measured and adjusted to meet user-definable target characteristics, like brightness, gamma and white point. This step is generally referred to as calibration. Calibration is done by adjusting the monitor controls, and the output of the graphics card (via calibration curves, also sometimes called video LUT[7] curves—please don't confuse these with LUT profiles, the differences are explained here) to get as close as possible to the chosen target.
To meet the user-defined target characteristics, it is generally advisable to get as far as possible by using the monitor controls, and only thereafter by manipulating the output of the video card via calibration curves, which are loaded into the video card gamma table, to get the best results.

Second, the calibrated displays response is measured and an ICC[5] profile describing it is created.

Optionally and for convenience purposes, the calibration is stored in the profile, but both still need to be used together to get correct results. This can lead to some ambiguity, because loading the calibration curves from the profile is generally the responsibility of a third party utility or the OS, while applications using the profile to do color transforms usually don't know or care about the calibration (they don't need to). Currently, the only OS that applies calibration curves out-of-the-box is Mac OS X (under Windows 7 or later you can enable it, but it's off by default and doesn't offer the same high precision as the ${APPNAME} profile loader)—for other OS's, ${APPNAME} takes care of creating an appropriate loader.

Even non-color-managed applications will benefit from a loaded calibration because it is stored in the graphics card—it is “global”. But the calibration alone will not yield accurate colors—only fully color-managed applications will make use of display profiles and the necessary color transforms.

Regrettably there are several image viewing and editing applications that only implement half-baked color management by not using the system's display profile (or any display profile at all), but an internal and often unchangeable “default” color space like sRGB, and sending output unaltered to the display after converting to that default colorspace. If the display's actual response is close to sRGB, you might get pleasing (albeit not accurate) results, but on displays which behave differently, for example wide-color-gamut displays, even mundane colors can get a strong tendency towards neon.

A note about colorimeters, displays and ${APPNAME}

Colorimeters need a correction in hardware or software to obtain correct measurements from different types of displays (please also see “Wide Gamut Displays and Colorimeters” on the Argyll CMS website for more information). The latter is supported when using Argyll CMS >= 1.3.0, so if you own a display and colorimeter which has not been specifically tuned for this display (i.e. does not contain a correction in hardware), you can apply a correction that has been calculated from spectrometer measurements to help better measure such a screen.
You need a spectrometer in the first place to do the necessary measurements to create such a correction, or you may query ${APPNAME}'s Colorimeter Corrections Database, and there's also a list of contributed colorimeter correction files on the Argyll CMS websiteplease note though that a matrix created for one particular instrument/display combination may not work well for different instances of the same combination because of display manufacturing variations and generally low inter-instrument agreement of most older colorimeters (with the exception of the DTP94), newer devices like the i1 Display Pro/ColorMunki Display and possibly the Spyder 4/5 seem to be less affected by this.
Starting with ${APPNAME} 0.6.8, you can also import generic corrections from some profiling softwares by choosing the corresponding item in the “Tools” menu.

If you buy a screen bundled with a colorimeter, the instrument may have been matched to the screen in some way already, so you may not need a software correction in that case.

Special note about the X-Rite i1 Display Pro, ColorMunki Display and Spyder 4/5 colorimeters

These instruments greatly reduce the amount of work needed to match them to a display because they contain the spectral sensitivities of their filters in hardware, so only a spectrometer reading of the display is needed to create the correction (in contrast to matching other colorimeters to a display, which needs two readings: One with a spectrometer and one with the colorimeter).
That means anyone with a particular screen and a spectrometer can create a special Colorimeter Calibration Spectral Set (.ccss) file of that screen for use with those colorimeters, without needing to actually have access to the colorimeter itself.

Usage

Through the main window, you can choose your settings. When running calibration measurements, another window will guide you through the interactive part of display adjustment.

Settings file

Here, you can load a preset, or a calibration (.cal) or ICC profile (.icc / .icm) file from a previous run. This will set options to those stored in the file. If the file contains only a subset of settings, the other options will automatically be reset to defaults (except the 3D LUT settings, which won't be reset if the settings file doesn't contain 3D LUT settings, and the verification settings which will never be reset automatically).

If a calibration file or profile is loaded in this way, its name will show up here to indicate that the settings reflect those in the file. Also, if a calibration is present it can be used as the base when “Just Profiling”.
The chosen settings file will stay selected as long as you do not change any of the calibration or profiling settings, with one exception: When a .cal file with the same base name as the settings file exists in the same directory, adjusting the quality and profiling controls will not cause unloading of the settings file. This allows you to use an existing calibration with new profiling settings for “Just Profiling”, or to update an existing calibration with different quality and/or profiling settings. If you change settings in other situations, the file will get unloaded (but current settings will be retained—unloading just happens to remind you that the settings no longer match those in the file), and current display profile's calibration curves will be restored (if present, otherwise they will reset to linear).

When a calibration file is selected, the “Update calibration” checkbox will become available, which takes less time than a calibration from scratch. If a ICC[5] profile is selected, and a calibration file with the same base name exists in the same directory, the profile will be updated with the new calibration. Ticking the “Update calibration” checkbox will gray out all options as well as the “Calibrate & profile” and “Just profile” buttons, only the quality level will be changeable.

Predefined settings (presets)

Starting with ${APPNAME} v0.2.5b, predefined settings for several use cases are selectable in the settings dropdown. I strongly recommend to NOT view these presets as the solitary “correct” settings you absolutely should use unmodified if your use case matches their description. Rather view them as starting points, from where you can work towards your own, optimized (in terms of your requirements, hardware, surroundings, and personal preference) settings.

Why has a default gamma of 2.2 been chosen for some presets?

Many displays, be it CRT, LCD, Plasma or OLED, have a default response characteristic close to a gamma of approx. 2.2-2.4 (for CRTs, this is the actual native behaviour; and other technologies typically try to mimic CRTs). A target response curve for calibration that is reasonably close to the native response of a display should help to minimize calibration artifacts like banding, because the adjustments needed to the video card's gamma tables via calibration curves will not be as strong as if a target response farther away from the display's native response had been chosen.

Of course, you can and should change the calibration response curve to a value suitable for your own requirements. For example, you might have a display that offers hardware calibration or gamma controls, that has been internally calibrated/adjusted to a different response curve, or your display's response is simply not close to a gamma of 2.2 for other reasons. You can run “Report on uncalibrated display device” from the “Tools” menu to measure the approximated overall gamma among other info.

Tabs

The main user interface is divided into tabs, with each tab containing a sub-set of settings. Not all tabs may be available at any given time. Unavailable tabs will be grayed out.

Choosing the display to calibrate and the measurement device

After connecting the instrument, click the small icon with the swirling arrow in between the “Display device” and “Instrument” controls to detect connected display devices and instruments.

Choosing a display device

Directly connected displays will appear at the top of the list as entries in the form “Display Name/Model @ x, y, w, h” with x, y, w and h being virtual screen coordinates depending on resolution and DPI settings. Apart from those directly connected displays, a few additional options are also available:

Web @ localhost

Starts a standalone web server on your machine, which then allows a local or remote web browser to display the color test patches, e.g. to calibrate/profile a smartphone or tablet computer.

Note that if you use this method of displaying test patches, then colors will be displayed with 8 bit per component precision, and any screen-saver or power-saver will not be automatically disabled. You will also be at the mercy of any color management applied by the web browser, and may have to carefully review and configure such color management.

madVR

Causes test patches to be displayed using the madVR Test Pattern Generator (madTPG) application which comes with the madVR video renderer (only available for Windows, but you can connect via local network from Linux and Mac OS X). Note that while you can adjust the test pattern configuration controls in madTPG itself, you should not normally alter the “disable videoLUT” and “disable 3D LUT” controls, as these will be set appropriately automatically when doing measurements.

Note that if you want to create a 3D LUT for use with madVR, there is a “Video 3D LUT for madVR” preset available under “Settings” that will not only configure ${APPNAME} to use madTPG, but also setup the correct 3D LUT format and encoding for madVR.

Prisma

The Q, Inc./Murideo Prisma is a video processor and combined pattern generator/3D LUT holder accessible over the network.

Note that if you want to create a 3D LUT for use with a Prisma, there is a “Video 3D LUT for Prisma” preset available under “Settings” that will not only configure ${APPNAME} to use a Prisma, but also setup the correct 3D LUT format and encoding.

Also note that the Prisma has 1 MB of internal memory for custom LUT storage, which is enough for around 15 17x17x17 LUTs. You may occasionally need to enter the Prisma's administrative interface via a web browser to delete old LUTs to make space for new ones.

Resolve

Allows you to use the built-in pattern generator of DaVinci Resolve video editing and grading software, which is accessible over the network or on the local machine. The way this works is that you start a calibration or profiling run in ${APPNAME}, position the measurement window and click “Start measurement”. A message “Waiting for connection on IP:PORT” should appear. Note the IP and port numbers. In Resolve, switch to the “Color” tab and then choose “Monitor calibration”, “CalMAN” in the “Color” menu (Resolve version 11 and earlier) or the “Workspace” menu (Resolve 12).
Enter the IP address in the window that opens (port should already be filled) and click “Connect” (if Resolve is running on the same machine as ${APPNAME}, enter localhost or 127.0.0.1 instead). The position of the measurement window you placed earlier will be mimicked on the display you have connected via Resolve.

Note that if you want to create a 3D LUT for use with Resolve, there is a “Video 3D LUT for Resolve” preset available under “Settings” that will not only configure ${APPNAME} to use Resolve, but also setup the correct 3D LUT format and encoding.

Note that if you want to create a 3D LUT for a display that is directly connected (e.g. for Resolve's GUI viewer), you should not use the Resolve pattern generator, and select the actual display device instead which will allow for quicker measurements (Resolve's pattern generator has additional delay).

Untethered

See untethered display measurements. Please note that the untethered mode should generally only be used if you've exhausted all other options.

Choosing a measurement mode

Some instruments may support different measurement modes for different types of display devices. In general, there are three base measurement modes: “LCD”, “Refresh” (e.g. CRT and Plasma are refresh-type displays) and “Projector” (the latter is only available if supported by the instrument). Some instruments like the Spyder 4/5 and ColorHug support additional measurement modes, where a mode is coupled with a predefined colorimeter correction (in that case, the colorimeter correction dropdown will automatically be set to “None”).
Variations of these measurement modes may be available depending on the instrument: “Adaptive” measurement mode for spectrometers uses varying integration times (always used by colorimeters) to increase accuracy of dark readings. “HiRes” turns on high resolution spectral mode for spectrometers like the i1 Pro, which may increase the accuracy of measurements.

Drift compensation during measurements (only available if using Argyll CMS >= 1.3.0)

White level drift compensation tries to counter luminance changes of a warming up display device. For this purpose, a white test patch is measured periodically, which increases the overall time needed for measurements.

Black level drift compensation tries to counter measurement deviations caused by black calibration drift of a warming up measurement device. For this purpose, a black test patch is measured periodically, which increases the overall time needed for measurements. Many colorimeters are temperature stabilised, in which case black level drift compensation should not be needed, but spectrometers like the i1 Pro or ColorMunki Design/Photo are not temperature compensated.

Override display update delay (only available if using Argyll CMS >= 1.5.0, only visible if “Show advanced options” in the “Options” menu is enabled)

Normally a delay of 200 msec is allowed between changing a patch color in software, and that change appearing in the displayed color itself. For some instuments (i.e. i1d3, i1pro, ColorMunki, Klein K10-A) ArgyllCMS will automatically measure and set an appropriate update delay during instrument calibration. In rare situations this delay may not be sufficient (ie. some TV's with extensive image processing features turned on), and a larger delay can be set here.

Override display settle time multiplier (only available if using Argyll CMS >= 1.7.0, only visible if “Show advanced options” in the “Options” menu is enabled)

Normally the display technology type determines how long is allowed between when a patch color change appears on the display, and when that change has settled down, and as actually complete within measurement tolerance. A CRT or Plasma display for instance, can have quite a long settling delay due to the decay characteristics of the phosphor used, while an LCD can also have a noticeable settling delay due to the liquid crystal response time and any response time enhancement circuit (instruments without a display technology type selection such as spectrometers assume a worst case).
The display settle time multiplier allows the rise and fall times of the model to be scaled to extend or reduce the settling time. For instance, a multiplier of 2.0 would double the settling time, while a multiplier of 0.5 would halve it.

Choosing a colorimeter correction for a particular display

This can improve a colorimeters accuracy for a particular type of display, please also see “A note about colorimeters, displays and ${APPNAME}”. You can import generic matrices from some other display profiling softwares as well as check the online Colorimeter Corrections Database for a match of your display/instrument combination (click the small globe next to the correction dropdown)—please note though that all colorimeter corrections in the online database have been contributed by various users, and their usefulness to your particular situation is up to you to evaluate: They may or may not improve the absolute accuracy of your colorimeter with your display. A list of contributed correction matrices can also be found on the Argyll CMS website.

Please note this option is only available if using Argyll CMS >= 1.3.0 and a colorimeter.

Calibration settings

Interactive display adjustment
Turning this off skips straight to calibration or profiling measurements instead of giving you the opportunity to alter the display's controls first. You will normally want to keep this checked, to be able to use the controls to get closer to the chosen target characteristics.
Observer

To see this setting, you need to have an instrument that supports spectral readings (i.e. a spectrometer) or spectral sample calibration (e.g. i1 DisplayPro, ColorMunki Display and Spyder4/5), and go into the “Options” menu, and enable “Show advanced options”.

This can be used to select a different colorimetric observer, also known as color matching function (CMF), for instruments that support it. The default is the CIE 1931 standard 2° observer.

Note that if you select anything other than the default 1931 2 degree observer, then the Y values will not be cd/m², due to the Y curve not being the CIE 1924 photopic V(λ) luminosity function.

White point

Allows setting the target white point locus to the equivalent of a daylight or black body spectrum of the given temperature in degrees Kelvin, or as chromaticity co-ordinates. By default the white point target will be the native white of the display, and it's color temperature and delta E to the daylight spectrum locus will be shown during monitor adjustment, and adjustments will be recommended to put the display white point directly on the Daylight locus. If a daylight color temperature is given, then this will become the target of the adjustment, and the recommended adjustments will be those needed to make the monitor white point meet the target. Typical values might be 5000 for matching printed output, or 6500, which gives a brighter, bluer look. A white point temperature different to that native to the display may limit the maximum brightness possible.

If you want to find out the current uncalibrated whitepoint of your display, you can run “Report on uncalibrated display device” from the “Tools” menu to measure it.

If you want to adjust the whitepoint to the chromaticities of your ambient lighting, or those of a viewing booth as used in prepress and photography, and your measurement device has ambient measuring capability (e.g. like the i1 Pro or i1 Display with their respective ambient measurement heads), you can use the “Measure” button next to the whitepoint settings. If you want to measure ambient lighting, place the instrument upwards, beside the display. Or if you want to measure a viewing booth, put a metamerism-free gray card inside the booth and point the instrument towards it. Further instructions how to measure ambient may be available in your instrument's documentation.

White level

Set the target brightness of white in cd/m2. If this number cannot be reached, the brightest output possible is chosen, consistent with matching the white point target. Note that many of the instruments are not particularly accurate when assessing the absolute display brightness in cd/m2. Note that some LCD screens behave a little strangely near their absolute white point, and may therefore exhibit odd behavior at values just below white. It may be advisable in such cases to set a brightness slightly less than the maximum such a display is capable of.

If you want to find out the current uncalibrated white level of your display, you can run “Report on uncalibrated display device” from the “Tools” menu to measure it.

Black level

(To see this setting, go into the “Options” menu, and enable “Show advanced options”)

Can be used to set the target brightness of black in cd/m2 and is useful for e.g. matching two different screens with different native blacks to one another, by measuring the black levels on both (i.e. in the “Tools” menu, choose “Report on uncalibrated display”) and then entering the highest measured value. Normally you may want to use native black level though, to maximize contrast ratio. Setting too high a value may also give strange results as it interacts with trying to achieve the target “advertised” tone curve shape. Using a black output offset of 100% tries to minimize such problems.

Tone curve / gamma

The target response curve is normally an exponential curve (output = inputgamma), and defaults to 2.2 (which is close to a typical CRT displays real response). Four pre-defined curves can be used as well: the sRGB colorspace response curve, which is an exponent curve with a straight segment at the dark end and an overall response of approximately gamma 2.2, the L* curve, which is the response of the CIE L*a*b* perceptual colorspace, the Rec. 709 video standard response curve and the SMPTE 240M video standard response curve.
Another possible choice is “As measured”, which will skip video card gamma table (1D LUT) calibration.

Note that a real display usually can't reproduce any of the ideal pre-defined curves, since it will have a non-zero black point, whereas all the ideal curves assume zero light at zero input.

For gamma values, you can also specify wheter it should be interpreted relative, meaning the gamma value provided is used to set an actual response curve in light of the non-zero black of the actual display that has the same relative output at 50% input as the ideal gamma power curve, or absolute, which allows the actual power to be specified instead, meaning that after the actual displays non-zero black is accounted for, the response at 50% input will probably not match that of the ideal power curve with that gamma value (to see this setting, you have to go into the “Options” menu, and enable “Show advanced options”).

To allow for the non-zero black level of a real display, by default the target curve values will be offset so that zero input gives the actual black level of the display (output offset). This ensures that the target curve better corresponds to the typical natural behavior of displays, but it may not be the most visually even progression from display minimum. This behavior can be changed using the black output offset option (see further below).

Also note that many color spaces are encoded with, and labelled as having a gamma of approximately 2.2 (ie. sRGB, REC 709, SMPTE 240M, Macintosh OS X 10.6), but are actually intended to be displayed on a display with a typical CRT gamma of 2.4 viewed in a darkened environment.
This is because this 2.2 gamma is a source gamma encoding in bright viewing conditions such as a television studio, while typical display viewing conditions are quite dark by comparison, and a contrast expansion of (approx.) gamma 1.1 is desirable to make the images look as intended.
So if you are displaying images encoded to the sRGB standard, or displaying video through the calibration, just setting the gamma curve to sRGB or REC 709 (respectively) is probably not what you want! What you probably want to do, is to set the gamma curve to about gamma 2.4, so that the contrast range is expanded appropriately, or alternatively use sRGB or REC 709 or a gamma of 2.2 but also specify the actual ambient viewing conditions via a light level in Lux, so that an appropriate contrast enhancement can be made during calibration. If your instrument is capable of measuring ambient light levels, then you can do so.
(For in-depth technical information about sRGB, see “A Standard Default Color Space for the Internet: sRGB” at the ICC[5] website for details of how it is intended to be used)

If you're wondering what gamma value you should use, you can run “Report on uncalibrated display device” from the “Tools” menu to measure the approximated overall gamma among other info. Setting the gamma to the reported value can then help to reduce calibration artifacts like banding, because the adjustments needed for the video card's gamma table should not be as strong as if a gamma further away from the display's native response was chosen.

Ambient light level

(To see this setting, go into the “Options” menu, and enable “Show advanced options”)

As explained for the tone curve settings, often colors are encoded in a situation with viewing conditions that are quite different to the viewing conditions of a typical display, with the expectation that this difference in viewing conditions will be allowed for in the way the display is calibrated. The ambient light level option is a way of doing this. By default calibration will not make any allowances for viewing conditions, but will calibrate to the specified response curve, but if the ambient light level is entered or measured, an appropriate viewing conditions adjustment will be performed. For a gamma value or sRGB, the original viewing conditions will be assumed to be that of the sRGB standard viewing conditions, while for REC 709 and SMPTE 240M they will be assumed to be television studio viewing conditions.
By specifying or measuring the ambient lighting for your display, a viewing conditions adjustment based on the CIECAM02 color appearance model will be made for the brightness of your display and the contrast it makes with your ambient light levels.

Please note your measurement device needs ambient measuring capability (e.g. like the i1 Pro or i1 Display with their respective ambient measurement heads) to measure the ambient light level.

Black output offset

(To see this setting, go into the “Options” menu, and enable “Show advanced options”)

Real displays do not have a zero black response, while all the target response curves do, so this has to be allowed for in some way.

The default way of handling this (equivalent to 100% black output offset) is to allow for this at the output of the ideal response curve, by offsetting and scaling the output values. This defined a curve that will match the responses that many other systems provide and may be a better match to the natural response of the display, but will give a less visually even response from black.

The other alternative is to offset and scale the input values into the ideal response curve so that zero input gives the actual non-zero display response. This ensures the most visually even progression from display minimum, but might be hard to achieve since it is different to the natural response of a display.

A subtlety is to provide a split between how much of the offset is accounted for as input to the ideal response curve, and how much is accounted for at the output, where the degree is 0.0 accounts for it all as input offset, and 100% accounts for all of it as output offset.

Black point correction

(To see this setting, go into the “Options” menu, and enable “Show advanced options”)

Normally dispcal will attempt to make all colors down the neutral axis (R=G=B) have the same hue as the chosen white point. Near the black point, red, green or blue can only be added, not subtracted from zero, so the process of making the near black colors have the desired hue, will lighten them to some extent. For a device with a good contrast ratio or a black point that has nearly the same hue as the white, this is not a problem. If the device contrast ratio is not so good, and the black hue is noticeably different to that of the chosen white point (which is often the case for LCD type displays), this could have a noticeably detrimental effect on an already limited contrast ratio. Here the amount of black point hue correction can be controlled.
By default a factor of 100% will be used, which is usually good for “Refresh”-type displays like CRT or Plasma and also by default a factor of 0% is used for LCD type displays, but you can override these with a custom value between 0% (no correction) to 100% (full correction), or enable automatically setting it based on the measured black level of the display.

If less than full correction is chosen, then the resulting calibration curves will have the target white point down most of the curve, but will then cross over to the native or compromise black point.

Black point correction rate (only available if using Argyll CMS >= 1.0.4)

(To see this setting, go into the “Options” menu, and enable “Show advanced options”)

If the black point is not being set completely to the same hue as the white point (ie. because the factor is less than 100%), then the resulting calibration curves will have the target white point down most of the curve, but will then blend over to the native or compromise black point that is blacker, but not of the right hue. The rate of this blend can be controlled. The default value is 4.0, which results in a target that switches from the white point target to the black, moderately close to the black point. While this typically gives a good visual result with the target neutral hue being maintained to the point where the crossover to the black hue is not visible, it may be asking too much of some displays (typically LCD type displays), and there may be some visual effects due to inconsistent color with viewing angle. For this situation a smaller value may give a better visual result (e.g. try values of 3.0 or 2.0. A value of 1.0 will set a pure linear blend from white point to black point). If there is too much coloration near black, try a larger value, e.g. 6.0 or 8.0.

Calibration speed

(This setting will not apply and be hidden when the tone curve is set to “As measured”)

Determines how much time and effort to go to in calibrating the display. The lower the speed, the more test readings will be done, the more refinement passes will be done, the tighter will be the accuracy tolerance, and the more detailed will be the calibration of the display. The result will ultimately be limited by the accuracy of the instrument, the repeatability of the display and instrument, and the resolution of the video card gamma table entries and digital or analogue output (RAMDAC).

Profiling settings

Profile quality
Sets the level of effort and/or detail in the resulting profile. For table based profiles (LUT[7]), it sets the main lookup table size, and hence quality in the resulting profile. For matrix profiles it sets the per channel curve detail level and fitting “effort”.
Black point compensation (enable “Show advanced options” in the “Options” menu)

(Note: This option has no effect if just calibrating and creating a simple curves + matrix profile directly from the calibration data without additional profiling measurements)

This effectively prevents black crush when using the profile, but at the expense of accuracy. It is generally best to only use this option when it is not certain that the applications you are going to use have a high quality color management implementation. For LUT profiles, more sophisticated options exist (i.e. advanced gamut mapping options and use either “Enhance effective resolution of colorimetric PCS[11]-to-device tables”, which is enabled by default, or “Gamut mapping for perceptual intent”, which can be used to create a perceptual table that maps the black point).

Profile type (enable “Show advanced options” in the “Options” menu)

Generally you can differentiate between two types of profiles: LUT[7] based and matrix based.

Matrix based profiles are smaller in filesize, somewhat less accurate (though in most cases smoother) compared to LUT[7] based types, and usually have the best compatibility across CMM[2]s, applications and systems — but only support the colorimetric intent for color transforms. For matrix based profiles, the PCS[11] is always XYZ. You can choose between using individual curves for each channel (red, green and blue), a single curve for all channels, individual gamma values for each channel or a single gamma for all channels. Curves are more accurate than gamma values. A single curve or gamma can be used if individual curves or gamma values degrade the gray balance of an otherwise good calibration.

LUT[7] based profiles are larger in filesize, more accurate (but may sacrifice smoothness), in some cases less compatible (applications might not be able to use or show bugs/quirks with LUT[7] type profiles, or certain variations of them). When choosing a LUT[7] based profile type, advanced gamut mapping options become available which you can use to create perceptual and/or saturation tables inside the profile in addition to the default colorimetric tables which are always created.
L*a*b* or XYZ can be used as PCS[11], with XYZ being recommended especially for wide-gamut displays bacause their primaries might exceed the ICC[5] L*a*b* encoding range (Note: Under Windows, XYZ LUT[7] types are only available in ${APPNAME} if using Argyll CMS >= 1.1.0 because of a requirement for matrix tags in the profile, which are not created by prior Argyll CMS versions).
As it is hard to verify if the LUT[7] of an combined XYZ LUT[7] + matrix profile is actually used, you may choose to create a profile with a swapped matrix, ie. blue-red-green instead of red-green-blue, so it will be obvious if an application uses the (deliberately wrong) matrix instead of the (correct) LUT because the colors will look very wrong (e.g. everything that should be red will be blue, green will be red, blue will be green, yellow will be purple etc).

Note: LUT[7]-based profiles (which contain three-dimensional LUTs) might be confused with video card LUT[7] (calibration) curves (one-dimensional LUTs), but they're two different things. Both LUT[7]-based and matrix-based profiles may include calibration curves which can be loaded into a video card's gamma table hardware.

Advanced gamut mapping options (enable “Show advanced options” in the “Options” menu)

You can choose any of the following options after selecting a LUT profile type and clicking “Advanced...”. Note: The options “Low quality PCS[11]-to-device tables” and “Enhance effective resolution of colorimetric PCS[11]-to-device table” are mutually exclusive.

Low quality PCS[11]-to-device tables

Choose this option if the profile is only going to be used with inverse device-to-PCS[11] gamut mapping to create a DeviceLink or 3D LUT (${APPNAME} always uses inverse device-to-PCS[11] gamut mapping when creating a DeviceLink/3D LUT). This will reduce the processing time needed to create the PCS[11]-to-device tables. Don't choose this option if you want to install or otherwise use the profile.

Enhance effective resolution of colorimetric PCS[11]-to-device table

To use this option, you have to select a XYZ or L*a*b* LUT profile type (XYZ will be more effective). This option increases the effective resolution of the PCS[11] to device colorimetric color lookup table by using a matrix to limit the XYZ space and fill the whole grid with the values obtained by inverting the device-to-PCS[11] table, as well as optionally applies smoothing. If no CIECAM02 gamut mapping has been enabled for the perceptual intent, a simple but effective perceptual table (which is almost identical to the colorimetric table, but maps the black point to zero) will also be generated.

You can also set the interpolated lookup table size. The default “Auto” will use a base 33x33x33 resulution that is increased if needed and provide a good balance between smoothness and accuracy. Lowering the resolution can increase smoothness (at the potential expense of some accuracy), while increasing resolution may make the resulting profile potentially more accurate (at the expense of some smoothness). Note that computation will need a lot of memory (>= 4 GB of RAM recommended to prevent swapping to harddisk) especially at higher resolutions.

See below example images for the result you can expect, where the original image has been converted from sRGB to the display profile. Note though that the particular synthetic image chosen, a “granger rainbow”, exaggerates banding, real-world material is much less likely to show this. Also note that the sRGB blue in the image is actually out of gamut for the specific display used, and the edges visible in the blue gradient for the rendering are a result of the color being out of gamut, and the gamut mapping thus hitting the less smooth gamut boundaries.

Original Granger Rainbow image

Original “granger rainbow” image

Granger Rainbow - default colorimetric rendering

Default colorimetric rendering (2500 OFPS XYZ LUT profile)

Granger Rainbow - “smooth” colorimetric rendering

“Smooth” colorimetric rendering (2500 OFPS XYZ LUT profile, inverted A2B)

Granger Rainbow - “smooth” perceptual rendering

“Smooth” perceptual rendering (2500 OFPS XYZ LUT profile, inverted A2B)

Default rendering intent for profile

Sets the default rendering intent. In theory applications could use this, in practice they don't, so changing this setting probably won't have any effect whatsoever.

CIECAM02 gamut mapping

Note: When enabling one of the CIECAM02 gamut mapping options, and the source profile is a matrix profile, then enabling effective resolution enhancement will also influence the CIECAM02 gamut mapping, making it smoother, more accurate and also generated faster as a side-effect.

Normally, profiles created by ${APPNAME} only incorporate the colorimetric rendering intent, which means colors outside the display's gamut will be clipped to the next in-gamut color. LUT-type profiles can also have gamut mapping by implementing perceptual and/or saturation rendering intents (gamut compression/expansion). You can choose if and which of those you want by specifying a source profile and marking the appropriate checkboxes. Note that a input, output, display or device colororspace profile should be specified as source, not a non-device colorspace, device link, abstract or named color profile. You can also choose viewing conditions which describe the intended use of both the source and the display profile that is to be generated. An appropriate source viewing condition is chosen automatically based on the source profile type.

An explanation of the available rendering intents can be found in the 3D LUT section “Rendering intent”.

For more information on why a source gamut is needed, see “About ICC profiles and Gamut Mapping” in the Argyll CMS documentation.

One strategy for getting the best perceptual results with display profiles is as follows: Select a CMYK profile as source for gamut mapping. Then, when converting from another RGB profile to the display profile, use relative colorimetric intent, and if converting from a CMYK profile, use the perceptual intent.
Another approach which especially helps limited-gamut displays is to choose one of the larger (gamut-wise) source profiles you usually work with for gamut mapping, and then always use perceptual intent when converting to the display profile.

Please note that not all applications support setting a rendering intent for display profiles and might default to colorimetric (e.g. Photoshop normally uses relative colorimetric with black point compensation, but can use different intents via custom soft proofing settings).

Testchart file
You can choose the test patches used when profiling the display here. The default “Auto” optimized setting takes the actual display characteristics into account. You can further increase potential profile accuracy by increasing the number of patches using the slider.
Testchart editor

The provided default testcharts should work well in most situations, but allowing you to create custom charts ensures maximum flexibility when characterizing a display and can improve profiling accuracy and efficiency. See also optimizing testcharts.

Testchart generation options

You can enter the amount of patches to be generated for each patch type (white, black, gray, single channel, iterative and multidimensional cube steps). The iterative algorythm can be tuned if more than zero patches are to be generated. What follows is a quick description of the several available iterative algorythms, with “device space” meaning in this case RGB coordinates, and “perceptual space” meaning the (assumed) XYZ numbers of those RGB coordinates. The assumed XYZ numbers can be influenced by providing a previous profile, thus allowing optimized test point placement.

  • Optimized Farthest Point Sampling (OFPS) will optimize the point locations to minimize the distance from any point in device space to the nearest sample point
  • Incremental Far Point Distribution incrementally searches for test points that are as far away as possible from any existing points
  • Device space random chooses test points with an even random distribution in device space
  • Perceptual space random chooses test points with an even random distribution in perceptual space
  • Device space filling quasi-random chooses test points with a quasi-random, space filling distribution in device space
  • Perceptual space filling quasi-random chooses test points with a quasi-random, space filling distribution in perceptual space
  • Device space body centered cubic grid chooses test points with body centered cubic distribution in device space
  • Perceptual space body centered cubic grid chooses test points with body centered cubic distribution in perceptual space

You can set the degree of adaptation to the known device characteristics used by the default full spread OFPS algorithm. A preconditioning profile should be provided if adaptation is set above a low level. By default the adaptation is 10% (low), and should be set to 100% (maximum) if a profile is provided. But, if for instance, the preconditioning profile doesn't represent the device behavior very well, a lower adaption than 100% might be appropriate.

For the body centered grid distributions, the angle parameter sets the overall angle that the grid distribution has.

The “Gamma” parameter sets a power-like (to avoid the excessive compression that a real power function would apply) value applied to all of the device values after they are generated. A value greater than 1.0 will cause a tighter spacing of test values near device value 0.0, while a value less than 1.0 will cause a tighter spacing near device value 1.0. Note that the device model used to create the expected patch values will not take into account the applied power, nor will the more complex full spread algorithms correctly take into account the power.

The neutral axis emphasis parameter allows changing the degree to which the patch distribution should emphasise the neutral axis. Since the neutral axis is regarded as the most visually critical area of the color space, it can help maximize the quality of the resulting profile to place more measurement patches in this region. This emphasis is only effective for perceptual patch distributions, and for the default OFPS distribution if the adaptation parameter is set to a high value. It is also most effective when a preconditioning profile is provided, since this is the only way that neutral can be determined. The default value of 50% provides an effect about twice the emphasis of the CIE94 Delta E formula.

The dark region emphasis parameter allows changing the degree to which the patch distribution should emphasis dark region of the device response. Display devices used for video or film reproduction are typically viewed in dark viewing environments with no strong white reference, and typically employ a range of brightness levels in different scenes. This often means that the devices dark region response is of particular importance, so increasing the relative number of sample points in the dark region may improve the balance of accuracy of the resulting profile for video or film reproduction. This emphasis is only effective for perceptual patch distributions where a preconditioning profile is provided. The default value of 0% provides no emphasis of the dark regions. A value somewhere around 15% - 30% is a good place to start for video profile use. A scaled down version of this parameter will be passed on to the profiler. Note that increasing the proportion of dark patches will typically lengthen the time that an instrument takes to read the whole chart. Emphasizing the dark region characterization will reduce the accuracy of measuring and modelling the lighter regions, given a fixed number of test points and profile quality/grid resolution. The parameter will also be used in an analogous way to the “Gamma” value in changing the distribution of single channel, grayscale and multidimensional steps.

The “Limit samples to sphere” option is used to define an L*a*b* sphere to filter the test points through. Only test points within the sphere (defined by it's center and radius) will be in the generated testchart. This can be good for targeting supplemental test points at a troublesome area of a device. The accuracy of the L*a*b* target will be best when a reasonably accurate preconditioning profile for the device is chosen. Note that the actual number of points generated can be hard to predict, and will depend on the type of generation used. If the OFPS, device and perceptual space random and device space filling quasi-random methods are used, then the target number of points will be achieved. All other means of generating points will generate a smaller number of test points than expected. For this reason, the device space filling quasi-random method is probably the easiest to use.

Generating diagnostic 3D views of testcharts

You can generate 3D views in several formats. The default HTML format should be viewable in a modern WebGL-enabled browser. You can choose the colorspace(s) you want to view the results in and also control whether to use RGB black offset (which will lighten up dark colors so they are better visible) and whether you want white to be neutral. All of these options are purely visual and will not influence the actual test patches.

Other functions

If generating any number of iterative patches as well as single channel, gray or multidimensional patches, you can add the single channel, gray and multidimensional patches in a separate step by holding the shift key while clicking on “Create testchart”. This prevents those patches affecting the iterative patch distribution, with the drawback of making the patch distribution less even. This is an experimental feature.

You are also able to:

  • Export patches as CSV, TIFF, PNG or DPX files, and set how often each patch should be repeated when exporting as images after you click the “Export” button (black patches will be repeated according to the “Max” value, and white patches according to the “Min” value, and patches in between according to their lightness in L* scaled to a value between “Min” and “Max”).
  • Add saturation sweeps which are often used in a video or film context to check color saturation. A preconditioning profile needs to be used to enable this.
  • Add reference patches from measurement files in CGATS format, from named color ICC profiles, or by analyzing TIFF, JPEG or PNG images. A preconditioning profile needs to be used to enable this.
  • Sort patches by various color criteria (warning: this will interfere with the Argyll CMS 1.6.0 or newer patch order optimisation which minimizes measurement times, so manual sorting should only be used for visual inspection of testcharts, or if required to optimize the patch order for untethered measurements in automatic mode where it is useful to maximize the lightness difference from patch to patch so the automatism has an easier time detecting changes).

Patch editor

Controls for the spreadsheet-like patch editor are as follows:

  • To select patches, click and drag the mouse over table cells, or hold SHIFT (select range) or CTRL/CMD (add/remove single cells/rows to/from selection)
  • To add a patch below an existing one, double-click a row label
  • To delete patches, select them, then hold CTRL (Linux, Windows) or CMD (Mac OS X) and hit DEL or BACKSPACE (will always delete whole rows even if only single cells are selected)
  • CTRL-C/CTRL-V/CTRL-A = copy/paste/select all

If you want to insert a certain amount of patches generated in a spreadsheet application (as RGB coordinates in the range 0.0-100.0 per channel), the easiest way to do this is to save them as CSV file and drag & drop it on the testchart editor window to import it.

Profile name

As long as you do not enter your own text here, the profile name is auto generated from the chosen calibration and profiling options. The current auto naming mechanism creates quite verbose names which are not necessarily nice to read, but they can help in identifying the profile.
Also note that the profile name is not only used for the resulting profile, but for all intermediate files as well (filename extensions are added automatically) and all files are stored in a folder of that name. You can choose where this folder is created by clicking the disk icon next to the field (it defaults to your system's default location for user data).

Here's an example under Linux, on other platforms some file extensions and the location of the home directory will differ. See User data and configuration file locations. You can mouse over the filenames to get a tooltip with a short description what the file is for:

Chosen profile save path: ~/.local/share/${APPNAME}/storage

Profile name: mydisplay

The following folder will be created: ~/.local/share/${APPNAME}/storage/mydisplay

During calibration & profiling the following files will be created:

~/.local/share/${APPNAME}/storage/mydisplay/mydisplay vs ClayRGB1998.log
~/.local/share/${APPNAME}/storage/mydisplay/mydisplay vs ClayRGB1998.wrz
~/.local/share/${APPNAME}/storage/mydisplay/mydisplay vs sRGB.log
~/.local/share/${APPNAME}/storage/mydisplay/mydisplay vs sRGB.wrz
~/.local/share/${APPNAME}/storage/mydisplay/mydisplay.cal
~/.local/share/${APPNAME}/storage/mydisplay/mydisplay.gam.gz
~/.local/share/${APPNAME}/storage/mydisplay/mydisplay.icc
~/.local/share/${APPNAME}/storage/mydisplay/mydisplay.log
~/.local/share/${APPNAME}/storage/mydisplay/mydisplay.ti1
~/.local/share/${APPNAME}/storage/mydisplay/mydisplay.ti3
~/.local/share/${APPNAME}/storage/mydisplay/mydisplay.wrz

Any used colorimeter correction file will also be copied to the profile folder.

Calibrating / profiling

If you are unclear about the difference between calibration and profiling (also called characterization), see “Calibration vs. Characterization” in the Argyll CMS documentation.

Please let the screen stabilize for at least half an hour after powering it up before doing any measurements or assessing its color properties. The screen can be used normally with other applications during that time.

After you have set your options, click on the button at the bottom to start the actual calibration/profiling process. The main window will hide during measurements, and should pop up again after they are completed (or after an error). You can always cancel out of running measurements using the “Cancel” button in the progress dialog, or by pressing ESC or Q. Viewing the informational log window (from the “Tools” menu) after measurements will give you access to the raw output of the Argyll CMS commandline tools and other verbose information.

Adjusting a display before calibration

If you clicked “Calibrate” or “Calibrate & profile” and have not turned off “Interactive display adjustment”, you will be presented with the interactive display adjustment window which contains several options to help you bring a display's characteristics closer to the chosen target values. Depending on wheter you have a “Refresh”- or LCD-type display, I will try to give some recommendations here which options to adjust, and which to skip.

Adjusting a LCD display

For LCD displays, you will in most cases only want to adjust white point (if the screen has RGB gain or other whitepoint controls) and white level (with the white level also affecting the black level unless you have a local dimming LED model), as many LCDs lack the necessary “offset” controls to adjust the black point (and even if they happen to have them, they often change the overall color temperature, not only the black point). Also note that for most LCD screens, you should leave the “contrast” control at (factory) default.

White point
If your screen has RGB gain, colortemperature or other whitepoint controls, the first step should be adjusting the whitepoint. Note that you may also benefit from this adjustment if you have set the target whitepoint to “native”, as it will allow you to bring it closer to the daylight or blackbody locus, which can help the human visual system to better adapt to the whitepoint. Look at the bars shown during the measurements to adjust RGB gains and minimize the delta E to the target whitepoint.
White level
Continue with the white level adjustment. If you have set a target white level, you may reduce or increase the brightness of your screen (ideally using only the backlight) until the desired value is reached (i.e. the bar ends at the marked center position). If you haven't set a target, simply adjust the screen to a visually pleasing brightness that doesn't cause eye strain.
Adjusting a “Refresh”-type display like CRT or Plasma
Black level
On “Refresh”-type displays, this adjustment is usually done using the “brightness” control. You may reduce or increase the brightness of your screen until the desired black level is reached (i.e. the bar ends at the marked center position).
White point
The next step should be adjusting the whitepoint, using the display's RGB gain controls or other means of adjusting the whitepoint. Note that you may also benefit from this adjustment if you have set the target whitepoint to “native”, as it will allow you to bring it closer to the daylight or blackbody locus, which can help the human visual system to better adapt to the whitepoint. Look at the bars shown during the measurements to adjust RGB gains and minimize the delta E to the target whitepoint.
White level
Continue with the white level adjustment. On “Refresh”-type displays this is usually done using the “contrast” control. If you have set a target white level, you may reduce or increase contrast until the desired value is reached (i.e. the bar ends at the marked center position). If you haven't set a target, simply adjust the screen to a visually pleasing level that doesn't cause eye strain.
Black point
If your display has RGB offset controls, you can adjust the black point as well, in much the same way that you adjusted the whitepoint.
Finishing adjustments and starting calibration/characterization

After the adjustments, you can run a check on all the settings by choosing the last option from the left-hand menu to verify the achieved values. If adjusting one setting adversely affected another, you can then simply repeat the respective option as necessary until the target parameters are met.

Finally, select “Continue on to calibration/profiling” to start the non-interactive part. You may want to get a coffee or two as the process can take a fair amount of time, especially if you selected a high quality level. If you only wanted help to adjust the display and don't want/need calibration curves to be created, you can also choose to exit by closing the interactive display adjustment window and then select “Profile only” from the main window.
If you originally selected “Calibrate & profile” and fulfil the requirements for unattended calibration & profiling, the characterization measurements for the profiling process should start automatically after calibration is finished. Otherwise, you may be forced to take the instrument off the screen to do a sensor self-calibration before starting the profiling measurements.

Optimizing testcharts for improved profiling accuracy and efficiency

The easiest way to use an optimized testchart for profiling is to set the testchart to “Auto” and adjusting the patch amount slider to the desired number of test patches. Optimization will happen automatically as part of the profiling measurements (this will increase measurement and processing times by a certain degree).
Alternatively, if you want to do generate an optimized chart manually prior to a new profiling run, you could go about this in the following way:

  • Have a previous display profile and select it under “Settings”.
  • Select one of the pre-baked testcharts to use as base and bring up the testchart editor.
  • Next to “Preconditioning profile” click on “current profile”. It should automatically select the previous profile you've chosen. Then place a check in the checkbox. Make sure adaptation is set to a high level (e.g. 100%)
  • If desired, adjust the number of patches and make sure the iterative patches amount is not zero.
  • Create the chart and save it. Click “yes” when asked to select the newly generated chart.
  • Start the profiling measurements (e.g. click “calibrate & profile” or “profile only”).

Profile installation

When installing a profile after creating or updating it, a startup item to load its calibration curves automatically on login will be created (on Windows and Linux, Mac OS X does not need a loader). You may also prevent this loader from doing anything by removing the check in the “Load calibration curves on Login” checkbox in the profile installation dialog, and in case you are using Windows 7 or later, you may let the operating system handle calibration loading instead (note that the Windows internal calibration loader does not offer the same high precision as the ${APPNAME} profile loader, due to wrong scaling and 8-bit quantization).

Profile loader (Windows)

Under Windows, the profile loader will stay in the taskbar tray and keep the calibration loaded. In addition, the profile loader is madVR-aware and will disable calibration loading if it detects e.g. madTPG or madVR being used by a video player. A right-click menu also allows you to set the desired calibration state and a few other options:

  • Reload calibration from current display device profile(s). Selecting this reloads the calibration instantly, and also sets the desired calibration state (see “Preserve calibration state” below).
  • Reset video card gamma table. Selecting this resets the video card gamma tables instantly, and also sets the desired calibration state (see “Preserve calibration state” below).
  • Preserve calibration state. This periodically checks if the video card gamma tables match the desired calibration state. It may take up to three seconds until the selected calibration state is automatically re-applied.
  • Fix profile associations automatically when only one display is active in a multi-display setup. This is a work-around for applications (and Windows itself) querying the display profile in a way that does not take into account the active display, which can lead to a wrong profile being used. A pre-requisite for this working correctly is that the profile loader has to be running before you switch from a multi-display to a single-display configuration in Windows, and the profile associations have to be correct at this point. Note that quitting the profile loader will restore profile associations to what they were (honoring any changes to profile associations during its runtime).

Creating 3D LUTs

You can create display correction RGB-in/RGB-out 3D LUTs (for use in video playback or editing applications/devices that don't have ICC support) as part of the profiling process.

3D LUT settings

Create 3D LUT after profiling
Normally after profiling, you'll be given the option to install the profile to make it available for ICC color managed applications. If this box is checked, you'll have the option to generate a 3D LUT (with the chosen settings) instead, and the 3D LUT settings will also be stored inside the profile, so that they can be easily restored by selecting the profile under “Settings” if needed. If this box is unchecked, you can create a 3D LUT from an existing profile.
Source colorspace/source profile
This sets the source colorspace for the 3D LUT, which is normally a video standard space like defined by Rec. 709 or Rec. 2020.
Tone curve
This allows to set a predefined or custom tone response curve for the 3D LUT. Predefined settings are Rec. 1886 (input offset) and Gamma 2.2 (output offset, pure power).
Apply calibration (vcgt) (only visible if “Show advanced options” in the “Options” menu is enabled)
Apply the profile's 1D LUT calibration (if any) to the 3D LUT. Nornmally, this should always be enabled if the profile contains a non-linear 1D LUT calibration, otherwise you have to make sure the 1D calibration is loaded whenever the 3D LUT is used.
Gamut mapping mode (only visible if “Show advanced options” in the “Options” menu is enabled)
The default gamut mapping mode is “Inverse device to PCS” and gives the most accurate results. In case a profile with high enough PCS-to-device tables is used, the option “PCS-to-device” is selectable as well, which allows for quicker generation of a 3D LUT, but is somewhat less accurate.
Rendering intent
  • “Absolute colorimetric” is intended to reproduce colors exactly. Out of gamut colors will be clipped to the closest possible match. The destination whitepoint will be altered to match the source whitepoint if possible, which may get clipped if it is out of gamut.
  • “Absolute appearance” maps colors from source to destination, trying to match the appearance of colors as closely as possible, but may not exactly map the whitepoint. Out of gamut colors will be clipped to the closest possible match.
  • “Absolute colorimetric with white point scaling” behaves almost exactly like “Absolute colorimetric”, but will scale the source colorspace down to make sure the source whitepoint isn't clipped.
  • “Luminance matched appearance” linearly compresses or expands the luminance axis from white to black to match the source to the destination space, while not otherwise altering the gamut, clipping any out of gamut colors to the closest match. The destination whitepoint is not altered to match the source whitepoint.
  • “Perceptual” uses three-dimensional compression to make the source gamut fit within the destination gamut. As much as possible, clipping is avoided, hues and the overall appearance is maintained. The destination whitepoint is not altered to match the source whitepoint. This intent is useful if the destination gamut is smaller than the source gamut.
  • “Perceptual appearance” uses three-dimensional compression to make the source gamut fit within the destination gamut. As much as possible, clipping is avoided, hues and the overall appearance is maintained. The destination whitepoint is altered to match the source whitepoint. This intent is useful if the destination gamut is smaller than the source gamut.
  • “Luminance preserving perceptual” (Argyll CMS 1.8.3+) uses compression to make the source gamut fit within the destination gamut, but very heavily weights the preservation of the luminance value of the source, which will compromise the preservation of saturation. No contrast enhancement is used if the dynamic range is reduced. This intent may be of use where preserving the tonal distinctions in images is more important than maintaining overall colorfulness or contrast.
  • “Preserve saturation” uses three-dimensional compression and expansion to try and make the source gamut match the destination gamut, and also favours higher saturation over hue or lightness preservation. The destination whitepoint is not altered to match the source whitepoint.
  • “Relative colorimetric” is intended to reproduce colors exactly, but relative to the destination whitepoint which will not be altered to match the source whitepoint. Out of gamut colors will be clipped to the closest possible match. This intent is useful if you have calibrated a display to a custom whitepoint that you want to keep.
  • “Saturation” uses the same basic gamut mapping as “Preserve saturation”, but increases saturation slightly in highly saturated areas of the gamut.
3D LUT file format
Sets the output format for the 3D LUT. Currently supported are Autodesk/Kodak (.3dl), Iridas (.cube), eeColor (.txt), madVR (.3dlut), Pandora (.mga), Portable Network Graphic (.png), ReShade (.png, .fx) and Sony Imageworks (.spi3d). Note that an ICC device link profile (the ICC equivalent of an RGB-in/RGB-out 3D LUT) is always created as well.
Input/output encoding
Some 3D LUT formats allow you to set the input/output encoding. Note that in most cases, sensible defaults will be chosen depending on selected 3D LUT format, but may be application- or workflow-specific.
Input/output bit depth
Some 3D LUT formats allow you to set the input/output bit depth. Note that in most cases, sensible defaults will be chosen depending on selected 3D LUT format, but may be application- or workflow-specific.

Installing 3D LUTs

Depending on the 3D LUT file format, installing or saving the 3D LUT to a specific location may be required before it can be used. You will be asked to install or save the 3D LUT directly after it was created. If you need to install or save the 3D LUT again at a later point, switch to the “3D LUT” tab and click the small “Install 3D LUT” button next to the “Settings” dropdown (the same button that installs display profiles when on the “Display & instrument” tab and a directly connected, desktop-accessible display is selected).

Installing 3D LUTs for the ReShade injector

First, you need to install ReShade for each application or game you want to use a 3D LUT with. Follow the installation instructions in the ReShade README, but in case you are using ReShade Core do not copy the example ReShade.fx that comes with it. If you want to use the 3D LUT together with one of the other shader packs available for ReShade, install that too prior to installing the 3D LUT. Then, install the 3D LUT from within ${APPNAME} to the same folder where you previously installed/copied ReShade and related files. The default toggle key to turn the 3D LUT on and off is the HOME key. You can change this key or disable the 3D LUT altogether by editing ColorLookUpTable.fx (with a text editor) inside the application/game folder where you installed the 3D LUT. To remove a 3D LUT completely, delete ColorLookUpTable.png and ColorLookUpTable.fx, as well as edit ReShade.fx and remove the line #include "ColorLookupTable.fx" near the end.

Verification / measurement report

You can do verification measurements to assess the display chain's (display profile - video card and the calibration curves in its gamma table - monitor) fit to the measured data, or to find out about the soft proofing capabilities of the display chain.

To do the former, you have to select a CGATS[1] testchart file containing device values (RGB). The measured values are then compared to the values obtained by feeding the device RGB numbers through the display profile (measured vs expected values). The default verification chart contains 26 patches and can be used, for example, to check if a display needs to be re-profiled. If a RGB testchart with gray patches (R=G=B) is measured, like the default and extended verification charts, you also have the option to evaluate the graybalance through the calibration only, by placing a check in the corresponding box on the report.

To perform a check on the soft proofing capabilities, you have to provide a CGATS reference file containing XYZ or L*a*b* data, or a combination of simulation profile and testchart file, which will be fed through the display profile to lookup corresponding device (RGB) values, and then be sent to the display and measured. Afterwards, the measured values are compared to the original XYZ or L*a*b* values, which can give a hint how suitable (or unsuitable) the display is for softproofing to the colorspace indicated by the reference.

The profile that is to be evaluated can be chosen freely. You can select it in ${APPNAME}'s main window under “settings”. The report files generated after the verification measurements are plain HTML with some embedded JavaScript, and are fully self-contained. They also contain the reference and measurement data, which consists of device RGB numbers, original measured XYZ values, and D50-adapted L*a*b* values computed from the XYZ numbers, and which can be examined as plain text directly from the report at the click of a button.

HowTo—Common scenarios

Select the profile you want to evaluate under “Settings” (for evaluating 3D LUTs and DeviceLink profiles, this setting has significance for a Rec. 1886 or custom gamma tone response curve, because they depend on the black level).

There are two sets of default verification charts in different sizes, one for general use and one for Rec. 709 video. The “small” and “extended” versions can be used for a quick to moderate check to see if a display should be re-profiled, or if the used profile/3D LUT is any good to begin with. The “large” and “xl” versions can be used for a more thorough check. Also, you can create your own customized verification charts with the testchart editor.

Checking the accuracy of a display profile (evaluating how well the profile characterizes the display)

In this case, you want to use a testchart with RGB device values and no simulation profile. Select a suitable file under “testchart or reference” and disable “simulation profile”. Other settings that do not apply in this case will be grayed out.

Checking how well a display can simulate another colorspace (evaluating softproofing capabilities, 3D LUTs, DeviceLink profiles, or native display performance)

There are two ways of doing this:

  • Use a reference file with XYZ or L*a*b* aim values,
  • or use a combination of testchart with RGB or CMYK device values and an RGB or CMYK simulation profile (for an RGB testchart, it will only allow you to use an RGB simulation profile and vice versa, and equally a CMYK testchart needs to be used with a CMYK simulation profile)

Then, you have a few options that influence the simulation.

  • Whitepoint simulation. If you are using a reference file that contains device white (100% RGB or 0% CMYK), or if you use a combination of testchart and simulation profile, you can choose if you want whitepoint simulation of the reference or simulation profile, and if so, if you want the whitepoint simulated relative to the target profile whitepoint. To explain the latter option: Let's assume a reference has a whitepoint that is slightly blueish (compared to D50), and a target profile has a whitepoint that is more blueish (compared to D50). If you do not choose to simulate the reference white relative to the target profile whitepoint, and the target profile's gamut is large and accurate enough to accomodate the reference white, then that is exactly what you will get. Depending on the adaptation state of your eyes though, it may be reasonable to assume that you are to a large extent adapted to the target profile whitepoint (assuming it is valid for the device), and the simulated whitepoint will look a little yellowish compared to the target profile whitepoint. In this case, choosing to simulate the whitepoint relative to that of the target profile may give you a better visual match e.g. in a softproofing scenario where you compare to a hardcopy proof under a certain illuminant, that is close to but not quite D50, and the display whitepoint has been matched to that illuminant. It will “add” the simulated whitepoint “on top” of the target profile whitepoint, so in our example the simulated whitepoint will be even more blueish than that of the target profile alone.
  • Using the simulation profile as target profile will override the profile set under “Settings”. Whitepoint simulation does not apply here because color management will not be used and the display device is expected to be in the state described by the simulation profile. This may be accomplished in several ways, for example the display may be calibrated internally or externally, by a 3D LUT or device link profile. If this setting is enabled, a few other options will be available:
    • Enable 3D LUT (if using the madVR display device/madTPG under Windows, or a Prisma video processor). This allows you to check how well the 3D LUT transforms the simulation colorspace to the display colorspace. Note this setting can not be used together with a DeviceLink profile.
    • DeviceLink profile. This allows you to check how well the DeviceLink transforms the simulation colorspace to the display colorspace. Note this setting can not be used together with the “Enable 3D LUT” setting.
  • Tone response curve. If you are evaluating a 3D LUT or DeviceLink profile, choose the same settings here as during 3D LUT/DeviceLink creation (and also make sure the same target profile is set, because it is used to map the blackpoint).
    To check a display that does not have an associated profile (e.g. “Untethered”), set the verification tone curve to “Unmodified”. In case you want to verify against a different tone response curve instead, you need to create a synthetic profile for this purpose (“Tools” menu).

How were the nominal and recommended aim values chosen?

The nominal tolerances, with the whitepoint, average, maximum and gray balance Delta E CIE 1976 aim values stemming from UGRA/Fogra Media Wedge and UDACT, are pretty generous, so I've included somewhat stricter “recommended” numbers which I've chosen more or less arbitrarily to provide a bit “extra safety margin”.

For reports generated from reference files that contain CMYK numbers in addition to L*a*b* or XYZ values, you can also select the official Fogra Media Wedge V3 or IDEAlliance Control Strip aim values for paper white, CMYK solids and CMY grey, if the chart contains the right CMYK combinations.

How are the results of the profile verification report to be interpreted?

This depends on the chart that was measured. The explanation in the first paragraph sums it up pretty well: If you have calibrated and profiled your display, and want to check how well the profile fits a set of measurements (profile accuracy), or if you want to know if your display has drifted and needs to be re-calibrated/re-profiled, you select a chart containing RGB numbers for the verification. Note that directly after profiling, accuracy can be expected to be high if the profile characterizes the display well, which will usually be the case if the display behaviour is not very non-linear, in which case creating a LUT profile instead of a “Curves + matrix” one, or increasing the number of measured patches for LUT profiles, can help.

If you want to know how well your profile can simulate another colorspace (softproofing), select a reference file containing L*a*b* or XYZ values, like one of the Fogra Media Wedge subsets, or a combination of a simulation profile and testchart. Be warned though, only wide-gamut displays will handle a larger offset printing colorspace like FOGRA39 or similar well enough.

In both cases, you should check that atleast the nominal tolerances are not exceeded. For a bit “extra safety margin”, look at the recommended values instead.

Note that both tests are “closed-loop” and will not tell you an “absolute” truth in terms of “color quality” or “color accuracy” as they may not show if your instrument is faulty/measures wrong (a profile created from repeatable wrong measurements will usually still verify well against other wrong measurements from the same instrument if they don't fluctuate too much) or does not cope with your display well (which is especially true for colorimeters and wide-gamut screens, as such combinations need a correction in hardware or software to obtain accurate results—this problem does not exist with spectrometers, which do not need a correction for wide-gamut, but have lately been discovered to have issues measuring the correct brightness of some LED backlit displays which use white LEDs), or if colors on your screen match an actual colored object next to it (like a print). It is perfectly possible to obtain good verification results but the actual visual performance being sub-par. It is always wise to combine such measurements with a test of the actual visual appearance via a “known good” reference, like a print or proof (although it should not be forgotten that those also have tolerances, and illumination also plays a big role when assessing visual results). Keep all that in mind when admiring (or pulling your hair out over) verification results :)

How are profiles evaluated against the measured values?

Different softwares use different methods (which are not always disclosed in detail) to compare and evaluate measurements. This section aims to give interested users a better insight how ${APPNAME}'s profile verification feature works “under the hood”.

How is a testchart or reference file used?

There are currently two slightly different paths depending if a testchart or reference file is used for the verification measurements, as outlined above. In both cases, Argyll's xicclu utility is run behind the scenes and the values of the testchart or reference file are fed relative colorimetrically (if no whitepoint simualtion is used) or absolute colorimetrically (if whitepoint simulation is used) through the profile that is tested to obtain corresponding L*a*b* (in the case of RGB testcharts) or device RGB numbers (in the case of XYZ or L*a*b* reference files or a combination of simulation profile and testchart). If a combination of simulation profile and testchart is used as reference, the reference L*a*b* values are calculated by feeding the device numbers from the testchart through the simulation profile absolute colorimetrically if whitepoint simulation is enabled (which will be the default if the simulation profile is a printer profile) and relative colorimetrically if whitepoint simulation is disabled (which will be the default if the simulation profile is a display profile, like most RGB working spaces). Then, the original RGB values from the testchart, or the looked up RGB values for a reference are sent to the display through the calibration curves of the profile that is going to be evaluated. A reference white of D50 (ICC default) and complete chromatic adaption of the viewer to the display's whitepoint is assumed if “simulate whitepoint relative to target profile whitepoint” is used, so the measured XYZ values are adapted to D50 (with the measured whitepoint as source reference white) using the Bradford transform (see Chromatic Adaption on Bruce Lindbloom's website for the formula and matrix that is used by ${APPNAME}) or with the adaption matrix from the profile in the case of profiles with 'chad' chromatic adaption tag, and converted to L*a*b*. The L*a*b* values are then compared by the generated dynamic report, with user-selectable critera and ΔE (delta E) formula.

How is the assumed vs. measured whitepoint ΔE calculated?

In a report, the correlated color temperature and assumed target whitepoint, as well as the whitepoint ΔE, do warrant some further explanations: The whitepoint ΔE is calculated as difference between the measured whitepoint's and the assumed target whitepoint's normalized XYZ values, which are first converted to L*a*b*. The assumed target whitepoint color temperature shown is simply the rounded correlated color temparature (100K threshold) calculated from the measured XYZ values. The XYZ values for the assumed target whitepoint are obtained by calculating the chromaticity (xy) coordinates of a CIE D (daylight) or blackbody illuminant of that color temperature and converting them to XYZ. You can find all the used formulas on Bruce Lindbloom's website and on Wikipedia.

How is the gray balance “range” evaluated?

The gray balance “range” uses a combined delta a/delta b absolute deviation (e.g. if max delta a = -0.5 and max delta b = 0.7, the range is 1.2). Because results in the extreme darks can be problematic due to lack of instrument accuracy and other effects like a black point which has a different chromaticity than the whitepoint, the gray balance check in ${APPNAME} only takes into account gray patches with a minimum measured luminance of 1% (i.e. if the white luminance = 120 cd/m², then only patches with at least 1.2 cd/m² will be taken into account).

What does the “Evaluate gray balance through calibration only” checkbox on a report actually do?

It sets the nominal (target) L* value to the measured L* value and a*=b*=0, so the profile is effectively ignored and only the calibration (if any) will influence the results of the gray balance checks. Note that this option will not make a difference for a “Single curve + matrix” profile, as the single curve effectively already achieves a similar thing (the L* values can be different, but they are ignored for the gray balance checks and only influence the overall result).

Special functionality

Remote measurements and profiling

When using Argyll CMS 1.4.0 and newer, remote measurements on a device not directly connected to the machine that is running ${APPNAME} is possible (e.g. a smartphone or tablet). The remote device needs to be able to run a web browser (Firefox recommended), and the local machine running ${APPNAME} may need firewall rules added or altered to allow incoming connections. To set up remote profiling, select “Web @ localhost” from the display device dropdown menu, then choose the desired action (e.g. “Profile only”). When the message “Webserver waiting at http://<IP>:<Port>” appears, open the shown address in the remote browser and attach the measurement device.
NOTE: If you use this method of displaying test patches, there is no access to the display video LUT[7]s and hardware calibration is not possible. The colors will be displayed with 8 bit per component precision, and any screen-saver or power-saver will not be automatically disabled. You will also be at the mercy of any color management applied by the web browser, and may have to carefully review and configure such color management.
Note: Close the web browser window or tab after each run, otherwise reconnection may fail upon further runs.

madVR test pattern generator

${APPNAME} supports the madVR test pattern generator (madTPG) and madVR 3D LUT formats since version 1.5.2.5 when used together with Argyll CMS 1.6.0 or newer.

Resolve (10.1+) as pattern generator

Since version 2.5, ${APPNAME} can use Resolve (10.1+) as pattern generator. Select the “Resolve” entry from the display devices dropdown in ${APPNAME} and in Resolve itself choose “Monitor calibration”, “CalMAN” in the “Color” menu.

Untethered display measurements

Please note that the untethered mode should generally only be used if you've exhausted all other options.

Untethered mode is another option to measure and profile a remote display that is not connected via standard means (calibration is not supported). To use untethered mode, the testchart that should be used needs to be optimized, then exported as image files (via the testchart editor) and those image files need to be displayed on the device that should be measured, in successive order. The procedure is as follows:

  • Select the desired testchart, then open the testchart editor.
  • Select “Optimize for untethered in auto mode” from the sorting options dropdown, click “Apply”, then export the testchart.
  • Burn the images to a DVD, copy them on an USB stick or use any other available means to get them to display onto the device that should be measured.
  • In ${APPNAME}'s display dropdown, select “Untethered” (the last option).
  • Show the first image on the remote display, and attach the instrument. Then select “Profile only”.

Measurements will commence, and changes in the displayed image should be automatically detected if “auto” mode is enabled. Use whatever means available to you to cycle through the images from first to last, carefully monitoring the measurement process and only changing to the next image if the current one has been successfully measured (as will be shown in the untethered measurement window). Note that untethered mode will be (atleast) twice as slow as normal display measurements.

Non-UI functionality

There is a bit of functionality that is not available via the UI and needs to be run from a command prompt or ternminal. Use of this functionality currently requires 0install, or running from source.

Change display profile and calibration whitepoint

Note that this reduces the profile gamut and accuracy.

Via 0install:

0install run --command=change-display-profile-cal-whitepoint -- \
  ${URL}0install/${APPNAME}.xml \
  [-t temp | -T temp | -w x,y] [--cal-only] [inprofile] outfilename

From source:

python util/change_display_profile_cal_whitepoint.py- \
  ${URL}0install/${APPNAME}.xml \
  [-t temp | -T temp | -w x,y] [--cal-only] [inprofile] outfilename
-t temp
Use daylight color temperature temp as whitepoint target.
-T temp
Use blackbody color temperature temp as whitepoint target.
-w x,y
Use x,y chromaticity as whitepoint target.
--cal-only (optional)
Only alter the calibration embedded in the profile, not the profile itself.
inprofile (optional)
Use profile inprofile instead of the current display profile.
outfilename
Output profile filename. The changed profile will be written to this file.
Enable/disable Windows 7 and later calibration loading

Note that Windows calibration loading is of lower quality than using Argyll CMS because Windows always quantizes the calibration to 8 bit and scales it wrongly. This is not the case when using the ${APPNAME} calibration loader which uses Argyll CMS.

Via 0install:

0install run --command=set-calibration-loading -- \
  ${URL}0install/${APPNAME}.xml [--os]

From source:

python -c "import sys; from ${APPNAME} import util_win; \
  util_win.calibration_management_isenabled() or \
  util_win.enable_calibration_management() \
  if '--os' in sys.argv[1:] else \
  not util_win.calibration_management_isenabled() or \
  util_win.disable_calibration_management();" [--os]

The --os option determines wether Windows calibration loading functionality should be enbaled or disabled.

Scripting

${APPNAME} supports scripting locally and over the network (the latter must be explicitly enabled by setting app.allow_network_clients = 1 in ${APPNAME}.ini) via sockets. ${APPNAME} must be already running on the target machine for this to work. Below is an example connecting to a running instance on the default port 15411 and starting calibration measurements (the port is configurable in ${APPNAME}.ini as app.port, although if the desired port is not available an unused one will be chosen automatically. You can read the actual used port from the file ${APPNAME}.lock in the configuration file folder of ${APPNAME} while it is running). The example is written in Python and deals with some of the intricacies of sockets as well.

#!/usr/bin/env python2

import socket

class DCGScriptingClientSocket(socket.socket):

	def __enter__(self):
		return self

	def __exit__(self, etype, value, tb):
		# Disconnect
		try:
			# Will fail if the socket isn't connected, i.e. if there was an
			# error during the call to connect()
			self.shutdown(socket.SHUT_RDWR)
		except socket.error:
			pass
		self.close()

	def __init__(self):
		socket.socket.__init__(self)
		self.recv_buffer = ''

	def get_single_response(self):
		# Buffer received data until EOT (response end marker) and return
		# single response (additional data will still be in the buffer)
		while not '\4' in self.recv_buffer:
			incoming = self.recv(4096)
			if incoming == '':
				raise socket.error("Connection broken")
			self.recv_buffer += incoming
		end = self.recv_buffer.find('\4')
		single_response = self.recv_buffer[:end]
		self.recv_buffer = self.recv_buffer[end + 1:]
		return single_response

	def send_and_check(self, command, expected_response="ok"):
		""" Send command, get & check response """
		self.send_command(command)
		single_response = self.get_single_response()
		if single_response != expected_response:
			# Check application state. If a modal dialog is displayed, choose
			# the OK option. Note that this is just an example and normally you
			# should be very careful with this, as it could mean confirming a
			# potentially destructive operation (e.g. discarding current
			# settings, overwriting existing files etc).
			self.send_command('getstate')
			state = self.get_single_response()
			if 'Dialog' in state.split()[0]:
				self.send_command('ok')
				if self.get_single_response() == expected_response:
					return
			raise RuntimeError('%r got unexpected response: %r != %r' %
							   (command, single_response, expected_response))

	def send_command(self, command):
		# Automatically append newline (command end marker)
		self.sendall(command + '\n')

# Generate a list of commands we want to execute in order
commands = []

# Load “Laptop” preset
commands.append('load presets/laptop.icc')

# Setup calibration & profiling measurements
commands.append('calibrate-profile')

# Start actual measurements
commands.append('measure')

# Create socket & send commands
with DCGScriptingClientSocket() as client:
	client.settimeout(3)  # Set a timeout of 3 seconds

	# Open connection
	client.connect(('127.0.0.1', 15411))  # Default port

	for command in commands:
		client.send_and_check(command)

Each command needs to be terminated with a newline character (after any arguments the command may accept). Note that data sent must be UTF-8 encoded, and if arguments contain spaces they should be encased in double or single quotes. You should check the response for each command sent (the response end marker is ASCII 0x4 EOT, and the default response format is a plain text format, but JSON and XML are also available). The common return values for commands are either ok in case the command was understood (note that this does not indicate if the command finished processing), busy or blocked in case the command was ignored because another operation was running or a modal dialog blocks the UI, failed in case the command or an argument could not be processed successfully, forbidden in case the command was not allowed (this may be a temporary condition depending on the circumstances, e.g. when trying to interact with an UI element that is currently disabled), invalid in case the command (or one of its arguments) was invalid, or error followed by an error message in case of an unhandled exception. Other return values are possible depending on the command. All values returned are UTF-8 encoded. If the return value is blocked (e.g. because a modal dialog is displayed) you should check the application state with the getstate command to determine the further course of action.

List of supported commands

Below is a list of the currently supported commands (the list contains all valid commands for the main application, the standalone tools will typically just support a smaller subset. You can use the “${APPNAME} Scripting Client” standalone tool to learn about and experiment with commands). Note that filename arguments must refer to files present on the target machine running ${APPNAME}.

3DLUT-maker [create filename]
Show 3D LUT creation tab, or create 3D LUT filename.
abort
Try to abort a currently running operation.
activate [window ID | name | label]
Activate window window or the main application window (bring it to the front). If it is minimized, restore it.
alt | cancel | ok [filename]
If a modal dialog is shown, call the default action (ok), the alternate action (if applicable), or cancel it. If a file dialog is shown, using ok filename chooses that file.
calibrate
Setup calibration measurements (note that this won't give a choice whether to create a fast curves + matrix profile as well, if you want that use interact mainframe calibrate_btn instead). For non-virtual displays as well as pattern generators (except madVR), call the measure command afterwards to commence measurements.
calibrate-profile
Setup calibration & profiling measurements. For non-virtual displays as well as pattern generators (except madVR), call the measure command afterwards to commence measurements.
close [window ID | name | label]
Close window window or the current active window (if the window is the main window, this quits the application). Note that this tries to abort any running operations first, so you may want to check application state via the getstate command.
create-colorimeter-correction
Create colorimeter correction.
create-profile [filename]
Create profile from existing measurements (profile or measurement file).
curve-viewer [filename]
Show curves, optionally loading filename. Relative paths are possible e.g. for presets: curve-viewer presets/photo.icc
${APPNAME} [filename]
Bring the main window to the front. If it is minimized, restore it. Optionally, load filename.
enable-spyder2
Enable the spyder 2.
getactivewindow
Get the current active window. The returned format is classname ID name label state. state is either enabled or disabled.
getcellvalues [window ID | name | label] <grid ID | name | label>
Get cell values from grid grid of window window or the current active window.
getappname
Get the name of the application you're connected to.
getcfg [option]
Get configuration option, or whole configuration (key-value pairs in INI format).
getcommands
Get list of commands supported by this application.
getdefault <option>
Get default option (key-value pair in INI format).
getdefaults
Get all defaults (key-value pairs in INI format).
getmenus
Get available menus in the format ID "label" state. state is either enabled or disabled.
getmenuitems [menuposition | label]
Get available menu items in the format menuposition "menulabel" menuitemID "menuitemlabel" state [checkable] [checked]. state is either enabled or disabled.
getstate
Get application state. Return value will be either idle, busy, dialogclassname ID dialogname [dialoglabel] state "messagetext" [path "path"] [buttons "buttonlabel"...] if a modal dialog is shown or blocked in case the UI is currently blocked. Most commands will not work if the UI is blocked—the only way to resolve the block is to non-programmatically interact with the actual UI elements of the application or closing it. Note that a state of blocked should normally only occur if an actual file dialog is shown. If using the scripting interface exclusively, this should never happen because it uses a replacement file dialog that supports the same actions as a real file dialog, but doesn't block. Also note that a return value of blocked for any of the other commands just means that a modal dialog is currently waiting to be interacted with, only if getstate also returns blocked you cannot resolve the situation with scripting alone.
getuielement [window ID | name | label] <element ID | name | label>
getuielements [window ID | name | label]
Get a single UI element or a list of the visible UI elements of window window or the current active window. Each returned line represents an UI element and has the format classname ID name ["label"] state [checked] [value "value"] [items "item"...]. classname is the internal UI library class name. It can help you determine what type of UI element it is, and which interactions it supports. ID is a numeric identifier. name is the name of the UI element. "label" (if present) is a label which further helps in identifying the UI element. You can use the latter three with the interact command. state is either enabled or disabled. items "item"... (if present) is a list of items connected to the UI element (i.e. selection choices).
getvalid
Get valid values for options that have constraints (key-value pairs in INI format). There are two sections, ranges and values. ranges are the valid ranges for options that accept numeric values (note that integer options not covered by ranges are typically boolean types). values are the valid values for options that only accept certain values. Options not covered by ranges and values are limited to their data type (you can't set a numeric option to a string and vice versa).
getwindows
Get a list of visible windows. The returned format is a list of classname ID name label state. state is either enabled or disabled.
import-colorimeter-corrections [filename...]
Import colorimeter corrections.
install-profile [filename]
Install a profile.
interact [window ID | name | label] <element ID | name | label> [setvalue value]
Interact with the UI element element of window window or the current active window, e.g. invoke a button or set a control to a value.
invokemenu <menuposition | menulabel> <menuitemID | menuitemlabel>
Invoke a menu item.
load <filename>
Load filename. Relative paths are possible e.g. for presets: load presets/photo.icc
measure
Start measurements (must be setup first!).
measure-uniformity
Measure screen uniformity.
measurement-report [filename]
If no filename given, show measurement report tab. Otherwise, setup measurement to create the HTML report filename. For non-virtual displays as well as pattern generators (except madVR), call the measure command afterwards to commence measurements.
profile
Setup profiling measurements (note that this will always use the current calibration if applicable, if you want to use linear calibration instead call load linear.cal prior to calling profile). For non-virtual displays as well as pattern generators (except madVR), call the measure command afterwards to commence measurements.
profile-info [filename]
Show profile information, optionally loading profile filename. Relative paths are possible e.g. for presets: profile-info presets/photo.icc
refresh
Update the GUI after configuration changes via setcfg or restore-defaults.
report-calibrated
Report on calibrated display. For non-virtual displays as well as pattern generators (except madVR), call the measure command afterwards to commence measurements.
report-uncalibrated
Report on uncalibrated display. For non-virtual displays as well as pattern generators (except madVR), call the measure command afterwards to commence measurements.
restore-defaults [category...]
Restore defaults globally or just for category. Call refresh after changing the configuration to update the GUI.
setlanguage <languagecode>
Set language.
setcfg <option> <value>
Set configuration option to value. The special value null clears a configuration option. Call refresh after changing the configuration to update the GUI. Also see getdefaults and getvalid.
setresponseformat <format>
Set the format for responses. The default plain is a text format that is easy to read, but not necessarily the best for parsing programmatically. The other possible formats are json, json.pretty, xml and xml.pretty. The *.pretty formats use newlines and indentation to make them easier to read.
synthprofile [filename]
Show synthetic profile creation window, optionally loading profile filename.
testchart-editor [filename | create filename]
Show testchart editor window, optionally loading or creating testchart filename. Relative paths are possible e.g. for loading a default testchart: testchart-editor ti1/d3-e4-s17-g49-m5-b5-f0.ti1
verify-calibration
Verify calibration. For non-virtual displays as well as pattern generators (except madVR), call the measure command afterwards to commence measurements.

Interacting with UI elements

  • Invoking a button: interact [window] <button> e.g. show profile name placeholders information: interact mainframe profile_name_info_btn
  • Setting a value on a dropdown, text field, or slider: interact [window] <element> setvalue "value" e.g. set calibration gamma to 2.4: interact mainframe trc_textctrl setvalue 2.4 (note that for changing multiple options at once it is generally preferable to call setcfg <option> <value> for each option you want to set followed by a single refresh instead)
  • Setting a cell value on a grid: interact [window] <grid> setvalue "row,col,value" e.g. while the testchart editor is shown, set the cell at the second column of the first row to 33: interact tcgen grid setvalue "0,1,33"

Caveats and limitations

There are a few things to be aware of when using commands that interact with the UI directly (i.e. activate, alt | cancel | ok, close, interact and invokemenu).

Referring to windows and UI elements: You can refer to windows and UI elements by their ID, name or label (you can find out about windows and UI elements with the getmenus/getmenuitems, getuielement/getuielements, and getwindows commands). If an object's ID is negative, it means that it has been automatically assigned at object creation time and is only valid during the lifetime of the object (i.e. for modal dialogs, only while the dialog is displayed). For this reason, using an object's name instead is easier, but names (aswell as non automatically assigned IDs) are not guaranteed to be unique, even for objects which share the same parent window (although most of the “important” controls as well as application windows will have unique names). Another possibility is to use an object's label, which while also not guaranteed to be unique, still has a fairly high likelihood of being unique for controls that share the same parent window, but has the drawback that it is localized (although you can ensure a specific UI language by calling setlanguage) and is subject to change when the localization is updated.

Sequential operations: Calling commands that interact with the UI in rapid succession may require the use of additional delays between sending commands to allow the GUI to react (so getstate will return the actual UI state after a specific command), although there is a default delay for commands that interact with the UI of atleast 55 ms. A good rule of thumb for sending commands is to use a “send command” → “read response” → “optionally wait a few extra ms” → “get application state (send getstate command)” → “read response” cycle.

Setting values: If setting a value on an UI element returns ok, this is not always an indication that the value was actually changed, but only that the attempt to set the value has not failed, i.e. the event handler of the element may still do error checking and change the value to something sane if it was not valid. If you want to make sure that the intended value is set, use getuielement on the affected element(s) and check the value (or even better, if you use JSON or XML response format, you can check the object property/element of the response instead which will reflect the object's current state and saves you one request). In general it is preferable to use interact <elementname> setvalue <value> only on dialogs, and in all other cases use a sequence of setcfg <option> <value> (repeat as necessary, optionally call load <filename> or restore-defaults first to minimize the amount of configuration options that you need to change) followed by a call to refresh to update the UI.

Also, not all controls may offer a comprehensive scripting interface. I'm open to suggestions though.

User data and configuration file locations

${APPNAME} uses the following folders for configuration, logfiles and storage (the storage directory is configurable). Note that if you have upgraded to ${APPNAME} from dispcalGUI, that ${APPNAME} will continue to use the existing dispcalGUI directories and configuration file names (so replace ${APPNAME} with dispcalGUI in the lists below).

Configuration

  • Linux: /home/Your Username/.config/${APPNAME}
  • Mac OS X: /Users/Your Username/Library/Preferences/${APPNAME}
  • Windows Vista and newer: C:\Users\Your Username\AppData\Roaming\${APPNAME}
  • Windows XP: C:\Documents and Settings\Your Username\Application Data\${APPNAME}

Logs

  • Linux: /home/Your Username/.local/share/${APPNAME}/logs
  • Mac OS X: /Users/Your Username/Library/Logs/${APPNAME} and
    /Users/Your Username/Library/Logs/0install
  • Windows Vista and newer: C:\Users\Your Username\AppData\Roaming\${APPNAME}\logs
  • Windows XP: C:\Documents and Settings\Your Username\Application Data\${APPNAME}\logs

Storage

  • Linux: /home/Your Username/.local/share/${APPNAME}/storage
  • Mac OS X: /Users/Your Username/Library/Application Support/${APPNAME}/storage
  • Windows Vista and newer: C:\Users\Your Username\AppData\Roaming\${APPNAME}\storage
  • Windows XP: C:\Documents and Settings\Your Username\Application Data\${APPNAME}\storage

Incomplete/failed runs (useful for troubleshooting)

  • Linux: /home/Your Username/.local/share/${APPNAME}/incomplete
  • Mac OS X: /Users/Your Username/Library/Application Support/${APPNAME}/incomplete
  • Windows Vista and newer: C:\Users\Your Username\AppData\Roaming\${APPNAME}\incomplete
  • Windows XP: C:\Documents and Settings\Your Username\Application Data\${APPNAME}\incomplete

Known issues and solutions

General: Wacky image colors (swapped colors)
Solution: This happens when you created a “XYZ LUT + swapped matrix” profile and is a way to alert you that the software you're using does not support XYZ LUT profiles and falls back to the included matrix (which generally means you'd loose accuracy). If you're having this situation only in some applications, creating a “XYZ LUT + matrix” profile will remedy it (but please keep in mind that those applications not supporting XYZ LUT will still fall back to the matrix, so results can be different from applications that support XYZ LUT correctly). If all colormanaged applications you use show swapped colors, you should create a matrix profile instead. Note that you do not have to re-run any measurements: In ${APPNAME}, choose a profile type as suggested previously, adjust quality and profile name if you want, then choose “Create profile from measurement data...” in the “Options” menu and select the profile you had the issue with.
General: Measurements are failing (“Sample read failed”) if using the “Allow skipping of spectrometer self-calibration” option and/or highres/adaptive mode
Solution: Disable either or all of the above options. The problem seems to mainly occur with the ColorMunki.
USB 3.0 connectivity issues (instrument not found, access failing, or not working properly)
Such issues would usually manifest themselves through instruments not being found, or randomly disconnecting even if seemingly working fine for some time. From all information that is known about these issues, they seem to be related to USB 3.0, not related to software as the vendor software is also affected, and they seem to occur irrespective of operating system or device drivers.
The underlying issue seems to be that while USB 3.0 has been designed to be backwards compatible with USB 2.0, some USB 2 devices do not seem to work reliably when connected over USB 3. As currently available instruments with USB connectivity are usually USB 2 devices, they may be affected.
Solution: A potential solution to such USB 3.0 connectivity issues is to connect the instrument to a USB 2.0 port (if available) or the use of an externally powered USB 2.0 hub.
Windows: “The process <dispcal.exe|dispread.exe|coloprof.exe|...> could not be started.”
Solution: If you downloaded Argyll CMS manually, go to your Argyll_VX.X.X\bin directory, and right-click the exe file from the error message. Select “Properties”, and then if there is a text on the “General” tab under security “This file came from another computer and might be blocked”, click “Unblock”. Sometimes also over-zealous Antivirus or 3rd-party Firewall solutions cause such errors, and you may have to add exceptions for all involved programs (which may include all the Argyll CMS executables and if you're using Zero Install also python.exe which you'll find in a subdirectory under C:\ProgramData\0install.net\implementations) or (temporarily) disable the Antivirus/Firewall.
Photoshop: “The monitor profile […] appears to be defective. Please rerun your monitor calibration software.”
Solution: Adobe ACE, Adobe's color conversion engine, contains monitor profile validation functionality which attempts to filter out bad profiles. With XYZ LUT profiles created in Argyll CMS versions up to 1.3.2, the B2A white point mapping is sometimes not particularly accurate, just enough so that ACE will see it as a problem, but in actual use it may only have little impact that the whitepoint is a bit off. So if you get a similar message when launching Photoshop, with the options “Use profile regardless” and “Ignore profile”, you may choose “Use profile regardless” and check visually or with the pipette in Photoshop if the inaccurate whitepoint poses a problem. This issue is fixed in Argyll CMS 1.3.3 and newer. Alternatively, you can create a L*a*b* LUT profile.
MS Windows Vista: The calibration gets unloaded when a User Access Control prompt is shown
Solution: (Intel and Intel/AMD hybrid graphics users please see “The Calibration gets unloaded after login/resume/User Access Control prompt” first) This Windows Vista bug seems to have been fixed under Windows 7 (and later), and can be remedied under Vista by either manually reloading calibration, or disabling UAC—but please note that you sacrifice security by doing this. To manually reload the calibration, either open ${APPNAME} and select “Load calibration curves from current display profile” in the “Options” menu, or (quicker) open the Windows start menu and select “${APPNAME} Profile Loader” in the “Startup” subfolder. To disable UAC[9] (not recommended!), open the Windows start menu and enter “msconfig” in the search box. Click on the Tools tab. Select the line “Disable UAC” and click the “Launch” button. Close msconfig. You need to reboot your system for changes to apply.
MS Windows with Intel graphics (also Intel/AMD hybrid): The Calibration gets unloaded after login/resume/User Access Control prompt
Solution: The Intel graphics drivers contain several utilities that interfere with correct calibration loading. A workaround is to rename, move or disable (e.g. using a tool like AutoRuns) the following files:
C:\Windows\system32\igfxtray.exe
C:\Windows\system32\igfxpph.dll
C:\Windows\system32\igfxpers.exe
MS Windows Vista and later: The display profile isn't used if it was installed for the current user
Solution: Open the Windows start menu, select “Control Panel”, then “Color Management” (you may have to select “Classic View” under Vista and anything other than “Category View” under Windows 7 and later to see it). Under the “Devices” tab, select your display device, then tick “Use my settings for this device”.
MS Windows 7 or later: Calibration does not load automatically on login when not using the ${APPNAME} Profile Loader
Solution: Open the Windows start menu, select “Control Panel”, then “Color Management” (you may have to select something other than “Category View” to see it). Select the “Advanced” tab, then “Change system defaults...”, and finally tick the “Use Windows display calibration” checkbox. Note that the precision of Windows' built-in calibration loading is inferior compared to the ${APPNAME} profile loader and may introduce inaccuracies and artifacts.
MS Windows XP, multiple displays: One profile is used by all displays connected to a graphics card
Solution: The underlying issue is that Windows XP assigns color profiles per (logical) graphics card, not per output. Most XP graphics drivers present only one logical card to the OS even if the card itself has multiple outputs. There are several possible solutions to this problem:
  • Use different graphics cards and connect only one display to each (this is probably the preferable solution in terms of ease of use and is least prone to configuration error)
  • Install and use the Windows XP color control applet
  • Some graphics cards, like the Matrox Parhelia APV (no longer produced), will expose two logical cards to the OS when using a specific vendor driver (some older ATI drivers also had this feature, but it seems to have been removed from newer ones)
Mac OS X: If running via 0install, ${APPNAME} won't launch anymore under Mac OS X 10.11 “El Capitan”
Solution:
  1. Run the “0install Launcher” application from the ${APPNAME}-0install.dmg disk image.
  2. Click “Refresh”, then “Run”. An updated library will be downloaded, and ${APPNAME} should launch.
  3. From now on, you can start ${APPNAME} normally as usual.
Mac OS X: ${APPNAME}.app is damaged and can't be opened.
Solution: Go to the “Security & Privacy” settings in System Preferences and set “Allow applications downloaded from” (under the “General” tab) to the “Anywhere” setting. After you have successfully launched ${APPNAME}, you can change the setting back to a more secure option and ${APPNAME} will continue to run properly.
Photoshop CS3 (Mac OS X): Under Mac OS X, the brush cursor in Photoshop CS3 looks funny (box around brush)
Solution: This seems to be a bug which shows with LUT[7]-type profiles that have only one rendering intent. You can try to overcome it by selecting “Advanced...” next to the profile type dropdown, selecting an existing ICC[5] profile as source (for hints as to which profile to select, see “Advanced gamut mapping options”) and tick at least one of the “Enhance effective resolution of colorimetric PCS[11]-to-device table” or “Apply gamut mapping to” checkboxes before profiling. To do that for an existing profile, adjust quality and profile name if you want, choose “Create profile from measurement data...” from the “Options” menu and select the profile. Note that this does not always solve the issue. Trying another profile type (XYZ LUT instead of L*a*b* LUT) might also help.
Linux/Windows: No video card gamma table access (“Calibrate only” and “Calibrate & profile” buttons grayed, “Profile only” button available)
Solution: Make sure you have not selected a display that doesn't support calibration (i.e. “Web @ localhost” or “Untethered”) and that you have enabled “Interactive display adjustment” or set the tone curve to a different value than “As measured”. Under Linux, please refer to the Argyll CMS documentation, “Installing the software on Linux with X11” and “Note on X11 multi-monitor setups” / “Fixing access to Video LUTs” therein. Under Windows, please also see the solution posted under “The display profile isn't used if it was installed for the current user” if you are using Windows and make sure you have a recent driver for your video card installed.
Linux: Instrument not working correctly/constantly disconnecting (conflict with libmtp)
Solution: There is a bug on some systems with libmtp that causes instruments to continuously switch between connected and disconnected state. This seems to be a bug in libmtp-runtime. You can work around it by renaming /lib/udev/mtp-probe or updating to libmtp 1.0.6 where the issue should be fixed.

Get help

Need help with a specific task or problem? It may be a good idea to first check the known issues & solutions if the topic has been covered. If you want to report a bug, please see the guidelines on bug reporting. Otherwise, feel free to use one of the following channels:

Report a bug

Found a bug? If so, please first check the issue tracker, it may have been reported already. Otherwise, please follow these guidelines for reporting bugs:

  • Try to give a short, but concise summary of the problem.
  • Try to give some steps to reproduce the problem.
  • Always attach logfiles if possible. They are usually automatically created by ${APPNAME} as part of normal program operation. The easiest way to do that is to choose “Show log” from the “Tools” menu and then click the “Create compressed archive...” button (not the “Save as...” button as this will only save the session log) on the log window. You can also find the logfiles here:
    • Linux: /home/Your Username/.local/share/${APPNAME}/logs
    • Mac OS X: /Users/Your Username/Library/Logs/${APPNAME} and
      /Users/Your Username/Library/Logs/0install
    • Windows Vista and newer: C:\Users\Your Username\AppData\Roaming\${APPNAME}\logs
    • Windows XP: C:\Documents and Settings\Your Username\Application Data\${APPNAME}\logs

    As the folder may contain several logfiles, it is a good idea to compress the whole folder to a ZIP or tar.gz archive that you can easily attach to a bug report.

    Please note the logfiles may contain your username as well as paths of files you may have used in ${APPNAME}. I will respect your privacy at all times, but you may want to consider this when attaching logfiles to public places like the issue tracker.

Create a new ticket (or if the bug has been reported already, use the existing ticket) at the issue tracker, following the guidelines above, and attach the logfiles archive.

If you don't want to or can't use the bug tracker, feel free to use one of the other support channels.

Discussion

Do you want to get in touch with me or other users regarding ${APPNAME} or related topics? The general discussion forum or dispcalgui-users mailing list is a good place to do so. You can also contact me directly via E-Mail: florian ‹at› displaycal . net.

To-Do / planned features (in no particular order)

  • On first launch, guide user through basic setup using a wizard (postpone ${APPNAME} update check until after wizard has run?):
    • Check Argyll CMS availability, if not available or outdated, offer automatic download & installation (consider 0install/native Linux distribution packages?) (implemented)
    • Windows only: Install instrument drivers if necessary (probably need to check if already installed)
    • Check available instruments and instrument capabilities
    • Do instrument specific first launch stuff:
      • Import OEM files (implemented)
      • Choose/create colorimeter correction if applicable
  • When an instrument is first selected:
    • Check if OEM files from the vendor software have already been imported (if applicable); if not, offer to do it. (implemented in v2.1.1.3 Beta and newer, after detecting instruments)
    • Check colorimeter corrections if applicable (from respective vendor software and online database, skip the latter if a spectro is available), in case of no usable specific or generic correction, offer to create one if possible, preferably using spectro measurements as reference, EDID as user-selectable fallback? (Need to sanity-check EDID red/green/blue/white xy coordinates in that case! Possibly against sRGB and AdobeRGB as the most commonly cited gamuts for standard gamut and wide-gamut displays? As some cheaper panels and many of those found in Laptops/Notebooks are sometimes very limited in gamut, additionally a special “low-gamut RGB” may be needed)
    • Users need to be made aware of the implications their colorimeter correction choice has, e.g.
      • When using a correction created from spectral reference measurements of the specific display (user needs a spectro): Usually very good accuracy/match to user's specific display/instrument combination
      • When using a vendor-supplied generic correction: Good (?) (e.g. i1 DisplayPro, ColorMunki Display) to poor (?) (e.g. i1 Display 1/2/LT, Huey, ColorHug) accuracy/match to user's specific display/instrument combination, in case of CCSS considered preferable to corrections supplied by other users because of lab-grade equipment (high spectral resolution) used by vendor.
      • When using a correction supplied by another user for the same display/instrument combination: Good (?) (e.g. i1 DisplayPro, ColorMunki Display, DTP94) to poor (?) (e.g. i1 Display 1/2/LT, Huey, ColorHug) accuracy/match to user's specific display/instrument combination
      • When using EDID of the specific display as reference: Moderate (?) to poor (?) accuracy/match to user's specific display/instrument combination (could be ok match, could be awful, but should in most cases still be able to fix problems like e.g. ColorHug red sensitivity so may be ok as last resort)
  • When trying to import colorimeter corrections or enable the Spyder 2, have automatic mode download the vendor software if needed. (implemented in v2.1.1.2 Beta and newer)
  • (Long-term) improve UI.
  • Better interface to GNOME Color Manager (implemented in v0.8.1.0+)
  • Measure and report on screen homogenity / evenness of illumination
  • Get rid of the terminal and implement a proper GUI for the interactive part of calibration (implemented in v0.8.5.6+)
  • Better user interface for profile verification: If a test set contains multiple value formats (CMYK, RGB, XYZ, L*a*b*), allow selection which one(s) should be used in a “setup” window (“setup” window implemented in v1.5.6.9+, value format selection added in v1.6.3.5)
  • Add gamut coverage percentages to the profile verification report if the test set contains reference values (not *.ti1): Calculate profiles from test set and verification measurements on-the-fly and create gamut volumes from test set profile, evaluated profile, and verification measurements profile using Argyll's iccgamut tool. Compare gamut volumes using Argyll's viewgam tool with -i option and include the results in the report (coverage calculation for test set reference and profile to be evaluated could be done before the actual measurements and also shown in the yet-to-be-implemented profile verification “setup” window).
  • Complete the documentation in the README
  • German language README (postponed)
  • Profile verification (feed XYZ or L*a*b* to display profile, display corresponding RGB values, measure, output Delta E) (implemented in v0.3.6+)
  • “Before” / “After” switch when calibration / profiling complete (implemented in v0.2+)
  • Store all settings in profile, allow loading of settings from profile in addition to .cal file (implemented in v0.2+)
  • Document the code (code documentation could still be enhanced, for now it'll do)
  • Code cleanup (mostly done)

Thanks and acknowledgements

I would like to thank the following people:

Graeme Gill, for creating Argyll CMS

Translators: Loïc Guégant, François Leclerc (french translation), Roberto Quintero (spanish translation), Tommaso Schiavinotto (italian translation)

Recent contributors: Toni Kettula, Peter Varo, Matt Nelson, Chris Daughtry, Ilie Florin Catarama, Pierre Dubertrand, Joseph Wohlscheid, Harald Puerzel, Riley Brandt Photography, Harald Hugenschmidt, Visceral Psyche Films, David Tiroletto, alain perrier, Jens Hartwig, Carlos Mazon, Ian Castledine, Alberto Caso, Franz Senftl, Sarah Gerweck more...

And everyone who sent me feedback or bug reports, suggested features, or simply uses ${APPNAME}.

Acknowledgements

Part of the comprehensive Argyll CMS documentation has been used in this document, and was only slightly altered to better fit ${APPNAME}'s behavior and notations.

Changelog

${ISODATE} ${ISOTIME} (UTC) ${VERSION_SHORT} ${STABILITY}

${VERSION_SHORT} ${STABILITY}

dispcalGUI has been renamed to ${APPNAME}.

If you upgrade using 0install under Linux: It is recommended that you download the respective ${APPNAME}-0install package for your distribution and install it so that the applications accessible via the menu of your desktop environment are updated properly.

If you upgrade using 0install under Mac OS X: It is recommended that you delete existing dispcalGUI application icons, then download the ${APPNAME}-0install.dmg disk image to get updated applications.

Added in this release:

  • Better HiDPI support. All text should now be crisp on HiDPI displays (with the exception of axis labels on curve and gamut graphs under Mac OS X). Icons will be scaled according to the scaling factor or DPI set in the display settings under Windows, or the respective (font) scaling or DPI system setting under Linux. Icons will be scaled down or up from their 2x version if a matching size is not available. Note that support for crisp icons in HiDPI mode is currently not available in the GTK3 and Mac OS X port of wxPython/wxWidgets. Also note that if you run a multi-monitor configuration, the application is system-DPI aware but not per-monitor-DPI aware, which is a limitation of wxPython/wxWidgets (under Windows, you will need to log out and back in after changing DPI settings for changes to take effect in ${APPNAME}).
  • When having created a compressed archive of a profile and related files, it can now also be imported back in via drag'n'drop or the “Load settings...” menu entry and respective button.
  • Argyll CMS can be automatically downloaded and updated.
  • A compressed logs archive can be created from the log window.
  • Windows: New profile loader. It will stay in the taskbar tray and automatically reload calibration if the display configuration changes or if the calibration is lost (although fullscreen Direct3D applications can still override the calibration). It can also automatically fix profile associations when switching from a multi-monitor configuration to a single display and vice versa (only under Vista and later). In addition, the profile loader is madVR-aware and will disable calibration loading if it detects e.g. madTPG or madVR being used by a video player.

Changed in this release:

  • Changed default calibration speed from “Medium” to “Fast”. Typically this cuts calibration time in half, while the accuracy difference is negligible at below 0.2 delta E.
  • Enabled “Enhance effective resolution of PCS to device tables” and smoothing for L*a*b* LUT profiles.

Fixed in this release:

  • In some cases, importing colorimeter corrections from the vendor software CD could fail (falling back to downloading them from the web).
  • Moving the auto testchart patches slider to a value that changed the profile type did not update BPC accordingly (shaper+matrix defaults to BPC on).
  • Minor: Safari/IE messed up positioning of CCT graph vertical axis labels in measurement reports.
  • Minor: When clicking the “Install profile” button while not on the 3D LUT tab, and “Create 3D LUT after profiling” is enabled, don't create a 3D LUT.
  • Minor: When changing profile type, only change the selected testchart if needed, and default to “Auto” for all profile types.
  • Minor: 1st launch defaults were slightly different from what was intended (testchart should be “Auto”).
  • Minor: Use OS line separator when writing configuration files.
  • Linux: Text and icon sizes should be more consistent accross the application when the system text scaling or DPI has been adjusted (application restart required).
  • Linux: Fall back to use the XrandR display name for colord device IDs if EDID is not available.
  • Linux/Mac OS X: madVR test pattern generator interface was prone to connection failures due to a race condition. Also, verifying a madVR 3D LUT didn't work.

View changelog entries for older versions

Definitions

[1] CGATS
Graphic Arts Technologies Standards, CGATS.5 Data Exchange Format (ANSI CGATS.5-1993 Annex J)
[2] CMM / CMS
Color Management Module / Color Management System
[3] GPL
GNU General Public License — gnu.org/licenses/gpl.html
[4] GUI
Graphical User Interface
[5] ICC
International Color Consortium — color.org
[6] JSON
JavaScript Object Notation, a lightweight data-interchange format — json.org
[7] LUT
Look Up Table — en.wikipedia.org/wiki/Lookup_table
[8] SVN
Subversion, a version-control system — subversion.tigris.org
[9] UAC
User Account Control — en.wikipedia.org/wiki/User_Account_Control
[10] EDID
Extended Display Identification Data — en.wikipedia.org/wiki/EDID
[11] PCS
Profile Connection Space — en.wikipedia.org/wiki/ICC_profile
[12] UEFI
Unified Extensible Firmware Interface — en.wikipedia.org/wiki/UEFI

DisplayCAL-3.1.0.0/misc/setup.debian.cfg0000644000076500000000000000114512647526533017505 0ustar devwheel00000000000000[bdist_rpm] # IMPORTANT: # install all packages listed under build_requires below # then run sudo rpmdb --initdb before running setup.py bdist_rpm release = 1 distribution_name = Debian packager = Florian Höch group = graphics python = /usr/bin/python requires = argyll, python-wxgtk3.0, python-numpy # build_requires = alien, build-essential, libxinerama-dev, libxrandr-dev, libxxf86vm-dev, python >= 2.5, python <= 2.7, python-all-dev post_install = misc/debian.postinst post_uninstall = misc/debian.postrm # keep_temp = 1 [install] compile = 0 prefix = /usr record = INSTALLED_FILES DisplayCAL-3.1.0.0/misc/setup.fedora.cfg0000644000076500000000000000105512647526533017523 0ustar devwheel00000000000000[bdist_rpm] release = 1 distribution_name = Fedora packager = Florian Höch group = Applications/Multimedia python = /usr/bin/python requires = argyllcms, wxPython, numpy build_requires = gcc, libX11-devel, libXinerama-devel, libXrandr-devel, libXxf86vm-devel, python >= 2.5, python <= 2.7, python-devel, rpm-build post_install = util/rpm_postinstall.sh post_uninstall = util/rpm_postuninstall.sh doc_files = LICENSE.txt README.html screenshots/ theme/ # keep_temp = 1 [install] optimize = 2 prefix = /usr record = INSTALLED_FILES DisplayCAL-3.1.0.0/misc/setup.mandriva.cfg0000644000076500000000000000075712647526533020074 0ustar devwheel00000000000000[bdist_rpm] release = 1 distribution_name = Mandriva packager = Florian Höch group = Graphics python = /usr/bin/python requires = argyllcms, wxPythonGTK, python-numpy build_requires = gcc, python >= 2.5, python <= 2.7, libpython-devel, rpm-build, libxorg-x11-devel post_install = util/rpm_postinstall.sh post_uninstall = util/rpm_postuninstall.sh doc_files = LICENSE.txt README.html screenshots/ theme/ # keep_temp = 1 [install] prefix = /usr record = INSTALLED_FILES DisplayCAL-3.1.0.0/misc/setup.mandriva64.cfg0000644000076500000000000000076112647526533020241 0ustar devwheel00000000000000[bdist_rpm] release = 1 distribution_name = Mandriva packager = Florian Höch group = Graphics python = /usr/bin/python requires = argyllcms, wxPythonGTK, python-numpy build_requires = gcc, python >= 2.5, python <= 2.7, libpython-devel, rpm-build, lib64xorg-x11-devel post_install = util/rpm_postinstall.sh post_uninstall = util/rpm_postuninstall.sh doc_files = LICENSE.txt README.html screenshots/ theme/ # keep_temp = 1 [install] prefix = /usr record = INSTALLED_FILES DisplayCAL-3.1.0.0/misc/setup.openSUSE.cfg0000644000076500000000000000076712647526533017735 0ustar devwheel00000000000000[bdist_rpm] release = 1 distribution_name = openSUSE packager = Florian Höch group = Productivity/Graphics/Other python = /usr/bin/python requires = argyllcms, python-wxGTK, python-numpy build_requires = gcc, python >= 2.5, python <= 2.7, python-devel, rpm, xorg-x11-devel post_install = util/rpm_postinstall.sh post_uninstall = util/rpm_postuninstall.sh doc_files = LICENSE.txt README.html screenshots/ theme/ # keep_temp = 1 [install] prefix = /usr record = INSTALLED_FILES DisplayCAL-3.1.0.0/misc/setup.ubuntu.cfg0000644000076500000000000000117212647526533017605 0ustar devwheel00000000000000[bdist_rpm] # IMPORTANT: # install all packages listed under build_requires below # then run sudo rpmdb --initdb before running setup.py bdist_rpm release = 1 distribution_name = Ubuntu packager = Florian Höch group = graphics python = /usr/bin/python requires = argyll, python-wxgtk3.0, python-numpy # build_requires = alien, build-essential, libxinerama-dev, libxrandr-dev, libxxf86vm-dev, python >= 2.5, python <= 2.7, python-all-dev post_install = misc/debian.postinst post_uninstall = misc/debian.postrm # keep_temp = 1 [install] compile = 0 install-layout = deb prefix = /usr record = INSTALLED_FILES DisplayCAL-3.1.0.0/misc/tests/0000755000076500000000000000000012653527012015572 5ustar devwheel00000000000000DisplayCAL-3.1.0.0/misc/tests/fakecgats.txt0000644000076500000000000000002012647526531020263 0ustar devwheel00000000000000CC BEGIN_DATADisplayCAL-3.1.0.0/misc/tests/junk.cal0000644000076500000000000000014012647526531017225 0ustar devwheel00000000000000 DisplayCAL-3.1.0.0/misc/tests/junk.icc0000644000076500000000000000000112647526531017220 0ustar devwheel00000000000000DisplayCAL-3.1.0.0/misc/tests/junk.icm0000644000076500000000000000000112647526531017232 0ustar devwheel00000000000000DisplayCAL-3.1.0.0/misc/tests/junk.ti10000644000076500000000000000000112647526531017157 0ustar devwheel00000000000000DisplayCAL-3.1.0.0/misc/tests/junk.ti20000644000076500000000000000000112647526531017160 0ustar devwheel00000000000000DisplayCAL-3.1.0.0/misc/tests/junk.ti30000644000076500000000000000000112647526531017161 0ustar devwheel00000000000000DisplayCAL-3.1.0.0/misc/ti3/0000755000076500000000000000000012653527012015127 5ustar devwheel00000000000000DisplayCAL-3.1.0.0/misc/ti3/default.ti30000644000076500000000000005671612647526532017224 0ustar devwheel00000000000000CTI3 DESCRIPTOR "Argyll Calibration Target chart information 3" ORIGINATOR "Argyll dispread" CREATED "Sat Mar 14 19:00:55 2009" KEYWORD "DEVICE_CLASS" DEVICE_CLASS "DISPLAY" KEYWORD "APPROX_WHITE_POINT" APPROX_WHITE_POINT "95.106486 100.000000 108.844025" KEYWORD "COLOR_REP" COLOR_REP "RGB_XYZ" KEYWORD "BLACK_COLOR_PATCHES" BLACK_COLOR_PATCHES "4" KEYWORD "COMP_GREY_STEPS" COMP_GREY_STEPS "49" KEYWORD "MULTI_DIM_BCC_STEPS" MULTI_DIM_BCC_STEPS "5" KEYWORD "MULTI_DIM_STEPS" MULTI_DIM_STEPS "5" KEYWORD "SINGLE_DIM_STEPS" SINGLE_DIM_STEPS "17" KEYWORD "WHITE_COLOR_PATCHES" WHITE_COLOR_PATCHES "4" KEYWORD "AUTO_OPTIMIZE" AUTO_OPTIMIZE "5" BEGIN_ARGYLL_COLPROF_ARGS -qh -aX END_ARGYLL_COLPROF_ARGS NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT SAMPLE_ID RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 271 BEGIN_DATA 1 100.000 100.000 100.000 95.1065 100.000 108.844 2 12.5000 37.5000 12.5000 5.94993 9.61866 3.74740 3 12.5000 62.5000 12.5000 14.1814 26.0794 6.49125 4 12.5000 87.5000 87.5000 40.9488 58.8934 79.2939 5 37.5000 87.5000 87.5000 45.0999 61.0337 79.4884 6 0.00000 25.0000 25.0000 3.71049 4.96568 6.38934 7 0.00000 25.0000 50.0000 6.62643 6.13187 21.7479 8 25.0000 75.0000 75.0000 30.9153 42.8005 56.4485 9 50.0000 75.0000 75.0000 37.5774 46.2355 56.7606 10 12.5000 0.00000 0.00000 1.58591 1.30210 1.02745 11 10.4167 10.4167 10.4167 2.00521 2.05749 2.15195 12 25.0000 0.00000 0.00000 3.07728 2.07105 1.09734 13 31.2500 0.00000 0.00000 4.24932 2.67536 1.15226 14 37.5000 0.00000 0.00000 5.73696 3.44239 1.22197 15 43.7500 0.00000 0.00000 7.56070 4.38272 1.30742 16 50.0000 0.00000 0.00000 9.73934 5.50603 1.40951 17 62.5000 37.5000 62.5000 25.5656 19.0418 35.8409 18 87.5000 37.5000 62.5000 41.5030 27.2592 36.5877 19 0.00000 0.00000 0.00000 1.00000 1.00000 1.00000 20 75.0000 0.00000 0.00000 22.3346 12.0002 1.99970 21 81.2500 0.00000 0.00000 26.5283 14.1625 2.19621 22 87.5000 0.00000 0.00000 31.1672 16.5543 2.41358 23 93.7500 0.00000 0.00000 36.2638 19.1821 2.65240 24 100.000 0.00000 0.00000 41.8302 22.0522 2.91323 25 62.5000 62.5000 12.5000 27.8253 33.1142 7.13058 26 75.0000 75.0000 50.0000 44.6598 50.5248 28.3139 27 8.33333 8.33333 8.33333 1.71786 1.75519 1.82265 28 0.00000 12.5000 0.00000 1.50806 2.01598 1.16935 29 0.00000 43.7500 0.00000 6.68900 12.3764 2.89635 30 0.00000 50.0000 0.00000 8.57817 16.1542 3.52608 31 0.00000 56.2500 0.00000 10.7902 20.5776 4.26342 32 0.00000 62.5000 0.00000 13.3391 25.6747 5.11306 33 12.5000 62.5000 37.5000 15.9983 26.8060 16.0610 34 0.00000 0.00000 0.00000 1.00000 1.00000 1.00000 35 0.00000 6.25000 0.00000 1.18254 1.36502 1.06085 36 0.00000 75.0000 0.00000 19.5000 37.9948 7.16671 37 0.00000 81.2500 0.00000 23.1365 45.2667 8.37888 38 0.00000 87.5000 0.00000 27.1590 53.3106 9.71972 39 0.00000 93.7500 0.00000 31.5784 62.1482 11.1929 40 0.00000 100.000 0.00000 36.4052 71.8005 12.8018 41 6.25000 6.25000 6.25000 1.48518 1.51041 1.55601 42 0.00000 0.00000 12.5000 1.25645 1.10256 2.35074 43 0.00000 0.00000 18.7500 1.52439 1.20972 3.76201 44 0.00000 0.00000 25.0000 1.90921 1.36363 5.78891 45 0.00000 0.00000 31.2500 2.42221 1.56879 8.49092 46 0.00000 0.00000 37.5000 3.07334 1.82920 11.9205 47 0.00000 0.00000 43.7500 3.87158 2.14845 16.1249 48 0.00000 0.00000 50.0000 4.82515 2.52982 21.1475 49 0.00000 0.00000 56.2500 5.94168 2.97636 27.0283 50 0.00000 0.00000 62.5000 7.22826 3.49091 33.8049 51 0.00000 0.00000 68.7500 8.69161 4.07616 41.5125 52 0.00000 0.00000 75.0000 10.3380 4.73463 50.1844 53 0.00000 0.00000 81.2500 12.1736 5.46873 59.8524 54 0.00000 0.00000 87.5000 14.2040 6.28076 70.5467 55 0.00000 0.00000 93.7500 16.4347 7.17291 82.2963 56 0.00000 0.00000 100.000 18.8711 8.14731 95.1290 57 0.00000 50.0000 100.000 26.4493 23.3015 97.6550 58 75.0000 50.0000 100.000 47.7839 34.3017 98.6547 59 0.00000 0.00000 6.25000 1.09214 1.03685 1.48530 60 2.08333 2.08333 2.08333 1.15175 1.15964 1.17390 61 4.16667 4.16667 4.16667 1.30372 1.31952 1.34806 62 12.5000 12.5000 12.5000 2.35042 2.42064 2.54755 63 14.5833 14.5833 14.5833 2.75638 2.84772 3.01278 64 16.6667 16.6667 16.6667 3.22584 3.34159 3.55077 65 18.7500 18.7500 18.7500 3.76135 3.90494 4.16445 66 20.8333 20.8333 20.8333 4.36533 4.54033 4.85660 67 22.9167 22.9167 22.9167 5.04007 5.25016 5.62984 68 25.0000 25.0000 25.0000 5.78777 6.03673 6.48668 69 27.0833 27.0833 27.0833 6.61052 6.90226 7.42953 70 29.1667 29.1667 29.1667 7.51032 7.84886 8.46069 71 31.2500 31.2500 31.2500 8.48913 8.87856 9.58238 72 6.25000 0.00000 0.00000 1.21051 1.10854 1.00986 73 33.3333 33.3333 33.3333 9.54879 9.99333 10.7967 74 35.4167 35.4167 35.4167 10.6911 11.1951 12.1058 75 39.5833 39.5833 39.5833 13.2307 13.8667 15.0161 76 41.6667 41.6667 41.6667 14.6313 15.3402 16.6212 77 43.7500 43.7500 43.7500 16.1213 16.9076 18.3287 78 45.8333 45.8333 45.8333 17.7021 18.5707 20.1403 79 47.9167 47.9167 47.9167 19.3754 20.3310 22.0579 80 50.0000 50.0000 50.0000 21.1427 22.1901 24.0831 81 52.0833 52.0833 52.0833 23.0052 24.1495 26.2175 82 54.1667 54.1667 54.1667 24.9646 26.2107 28.4629 83 56.2500 56.2500 56.2500 27.0221 28.3752 30.8208 84 58.3333 58.3333 58.3333 29.1791 30.6444 33.2927 85 60.4167 60.4167 60.4167 31.4370 33.0197 35.8802 86 62.5000 62.5000 62.5000 33.7971 35.5025 38.5847 87 64.5833 64.5833 64.5833 36.2605 38.0941 41.4078 88 66.6667 66.6667 66.6667 38.8287 40.7958 44.3509 89 68.7500 68.7500 68.7500 41.5028 43.6089 47.4154 90 70.8333 70.8333 70.8333 44.2840 46.5348 50.6026 91 72.9167 72.9167 72.9167 47.1736 49.5746 53.9140 92 75.0000 75.0000 75.0000 50.1727 52.7296 57.3508 93 77.0833 77.0833 77.0833 53.2824 56.0011 60.9145 94 79.1667 79.1667 79.1667 56.5039 59.3901 64.6063 95 81.2500 81.2500 81.2500 59.8383 62.8979 68.4275 96 83.3333 83.3333 83.3333 63.2868 66.5257 72.3793 97 85.4167 85.4167 85.4167 66.8503 70.2745 76.4631 98 87.5000 87.5000 87.5000 70.5301 74.1456 80.6800 99 89.5833 89.5833 89.5833 74.3270 78.1400 85.0312 100 91.6667 91.6667 91.6667 78.2423 82.2589 89.5180 101 93.7500 93.7500 93.7500 82.2769 86.5032 94.1415 102 95.8333 95.8333 95.8333 86.4317 90.8742 98.9029 103 97.9167 97.9167 97.9167 90.7080 95.3727 103.803 104 25.0000 25.0000 0.00000 4.87856 5.67311 1.69777 105 50.0000 25.0000 0.00000 11.5406 9.10808 2.00994 106 75.0000 25.0000 0.00000 24.1359 15.6023 2.60014 107 100.000 25.0000 0.00000 43.6314 25.6542 3.51366 108 100.000 75.0000 0.00000 60.3302 59.0470 9.07994 109 50.0000 50.0000 0.00000 17.3175 20.6603 3.93559 110 75.0000 50.0000 0.00000 29.9128 27.1544 4.52578 111 100.000 50.0000 0.00000 49.4083 37.2064 5.43931 112 100.000 100.000 100.000 95.1065 100.000 108.844 113 50.0000 75.0000 0.00000 28.2393 42.5008 7.57622 114 75.0000 75.0000 0.00000 40.8346 48.9950 8.16642 115 25.0000 75.0000 0.00000 21.5773 39.0658 7.26405 116 25.0000 100.000 0.00000 38.4825 72.8716 12.8992 117 50.0000 100.000 0.00000 45.1445 76.3065 13.2113 118 75.0000 100.000 0.00000 57.7399 82.8007 13.8015 119 100.000 100.000 0.00000 77.2354 92.8527 14.7151 120 25.0000 0.00000 25.0000 3.98649 2.43468 5.88625 121 50.0000 0.00000 25.0000 10.6485 5.86966 6.19842 122 75.0000 0.00000 25.0000 23.2439 12.3638 6.78862 123 75.0000 25.0000 25.0000 25.0451 15.9659 7.38905 124 87.5000 37.5000 37.5000 37.3481 25.5975 14.7033 125 56.2500 0.00000 0.00000 12.2903 6.82130 1.52904 126 100.000 0.00000 25.0000 42.7394 22.4158 7.70214 127 100.000 25.0000 25.0000 44.5407 26.0178 8.30257 128 100.000 25.0000 50.0000 47.4566 27.1840 23.6611 129 50.0000 25.0000 25.0000 12.4498 9.47171 6.79885 130 50.0000 50.0000 25.0000 18.2267 21.0239 8.72450 131 75.0000 50.0000 25.0000 30.8220 27.5181 9.31470 132 100.000 50.0000 25.0000 50.3176 37.5700 10.2282 133 25.0000 50.0000 25.0000 11.5647 17.5889 8.41233 134 25.0000 75.0000 25.0000 22.4865 39.4295 12.0530 135 50.0000 75.0000 25.0000 29.1485 42.8645 12.3651 136 75.0000 75.0000 25.0000 41.7438 49.3586 12.9553 137 100.000 75.0000 25.0000 61.2394 59.4106 13.8689 138 25.0000 50.0000 0.00000 10.6555 17.2253 3.62342 139 25.0000 100.000 25.0000 39.3917 73.2352 17.6881 140 50.0000 100.000 25.0000 46.0538 76.6702 18.0003 141 75.0000 100.000 25.0000 58.6491 83.1644 18.5905 142 100.000 100.000 25.0000 78.1446 93.2163 19.5040 143 25.0000 0.00000 50.0000 6.90243 3.60087 21.2448 144 50.0000 0.00000 50.0000 13.5645 7.03585 21.5570 145 75.0000 0.00000 50.0000 26.1598 13.5300 22.1472 146 100.000 0.00000 50.0000 45.6553 23.5820 23.0607 147 100.000 50.0000 75.0000 58.7464 40.9410 54.6237 148 100.000 50.0000 100.000 67.2794 44.3537 99.5683 149 50.0000 25.0000 50.0000 15.3658 10.6379 22.1574 150 75.0000 25.0000 50.0000 27.9611 17.1321 22.7476 151 100.000 25.0000 75.0000 52.9695 29.3888 52.6981 152 25.0000 25.0000 50.0000 8.70371 7.20292 21.8452 153 25.0000 50.0000 50.0000 14.4806 18.7551 23.7709 154 75.0000 50.0000 50.0000 33.7380 28.6843 24.6733 155 100.000 50.0000 50.0000 53.2335 38.7362 25.5868 156 100.000 75.0000 50.0000 64.1553 60.5768 29.2274 157 87.5000 62.5000 62.5000 49.7345 43.7199 39.3315 158 87.5000 87.5000 62.5000 63.5544 71.3558 43.9382 159 100.000 100.000 75.0000 86.5734 96.5873 63.8995 160 0.00000 68.7500 0.00000 16.2382 31.4721 6.07943 161 0.00000 100.000 25.0000 37.3144 72.1641 17.5907 162 0.00000 100.000 50.0000 40.2304 73.3303 32.9493 163 50.0000 100.000 50.0000 48.9697 77.8364 33.3588 164 75.0000 100.000 50.0000 61.5650 84.3305 33.9490 165 100.000 100.000 50.0000 81.0605 94.3825 34.8625 166 25.0000 0.00000 75.0000 12.4153 5.80568 50.2817 167 50.0000 0.00000 75.0000 19.0774 9.24066 50.5939 168 75.0000 0.00000 75.0000 31.6727 15.7348 51.1841 169 100.000 0.00000 75.0000 51.1682 25.7868 52.0976 170 100.000 0.00000 100.000 59.7013 29.1995 97.0422 171 25.0000 25.0000 75.0000 14.2166 9.40773 50.8822 172 50.0000 25.0000 75.0000 20.8787 12.8427 51.1944 173 75.0000 25.0000 75.0000 33.4740 19.3369 51.7845 174 0.00000 31.2500 0.00000 3.81760 6.63441 1.93921 175 0.00000 37.5000 0.00000 5.10758 9.21400 2.36920 176 25.0000 50.0000 75.0000 19.9935 20.9599 52.8078 177 50.0000 50.0000 75.0000 26.6555 24.3949 53.1200 178 75.0000 50.0000 75.0000 39.2509 30.8891 53.7102 179 100.000 75.0000 75.0000 69.6682 62.7816 58.2644 180 100.000 75.0000 100.000 78.2013 66.1943 103.209 181 0.00000 0.00000 0.00000 1.00000 1.00000 1.00000 182 12.5000 37.5000 37.5000 7.76682 10.3453 13.3171 183 25.0000 75.0000 50.0000 25.4024 40.5957 27.4115 184 25.0000 100.000 50.0000 42.3076 74.4014 33.0466 185 25.0000 100.000 75.0000 47.8205 76.6062 62.0836 186 50.0000 100.000 75.0000 54.4826 80.0412 62.3958 187 75.0000 100.000 75.0000 67.0779 86.5354 62.9859 188 100.000 100.000 100.000 95.1065 100.000 108.844 189 25.0000 0.00000 100.000 20.9484 9.21837 95.2263 190 50.0000 0.00000 100.000 27.6104 12.6533 95.5385 191 75.0000 0.00000 100.000 40.2058 19.1475 96.1287 192 75.0000 75.0000 100.000 58.7057 56.1423 102.295 193 0.00000 25.0000 100.000 20.6724 11.7494 95.7294 194 25.0000 25.0000 100.000 22.7497 12.8204 95.8267 195 50.0000 25.0000 100.000 29.4117 16.2554 96.1389 196 75.0000 25.0000 100.000 42.0070 22.7496 96.7291 197 100.000 25.0000 100.000 61.5026 32.8015 97.6426 198 0.00000 0.00000 0.00000 1.00000 1.00000 1.00000 199 25.0000 50.0000 100.000 28.5266 24.3726 97.7524 200 50.0000 50.0000 100.000 35.1886 27.8076 98.0645 201 50.0000 75.0000 100.000 46.1104 49.6481 101.705 202 12.5000 62.5000 62.5000 20.1532 28.4677 37.9454 203 12.5000 62.5000 87.5000 27.1290 31.2576 74.6872 204 25.0000 75.0000 100.000 39.4484 46.2132 101.393 205 0.00000 50.0000 50.0000 12.4033 17.6840 23.6735 206 0.00000 75.0000 75.0000 28.8380 41.7294 56.3511 207 0.00000 100.000 75.0000 45.7432 75.5351 61.9862 208 0.00000 100.000 100.000 54.2763 78.9478 106.931 209 25.0000 100.000 100.000 56.3536 80.0189 107.028 210 50.0000 100.000 100.000 63.0157 83.4539 107.340 211 75.0000 100.000 100.000 75.6110 89.9480 107.930 212 62.5000 0.00000 0.00000 15.2297 8.33690 1.66678 213 68.7500 0.00000 0.00000 18.5730 10.0607 1.82344 214 100.000 100.000 100.000 95.1065 100.000 108.844 215 0.00000 25.0000 0.00000 2.80128 4.60205 1.60043 216 37.5000 37.5000 12.5000 10.1010 11.7590 3.94191 217 62.5000 37.5000 12.5000 19.5938 16.6535 4.38672 218 87.5000 37.5000 12.5000 35.5312 24.8708 5.13352 219 37.5000 12.5000 12.5000 6.50147 4.56093 2.74206 220 62.5000 12.5000 12.5000 15.9942 9.45544 3.18687 221 87.5000 12.5000 12.5000 31.9317 17.6728 3.93367 222 87.5000 62.5000 12.5000 43.7627 41.3315 7.87738 223 37.5000 62.5000 12.5000 18.3325 28.2197 6.68576 224 37.5000 87.5000 12.5000 32.1524 55.8555 11.2924 225 62.5000 87.5000 12.5000 41.6451 60.7500 11.7372 226 87.5000 87.5000 12.5000 57.5826 68.9674 12.4840 227 12.5000 12.5000 37.5000 4.16730 3.14728 12.1173 228 37.5000 12.5000 37.5000 8.31836 5.28757 12.3118 229 62.5000 12.5000 37.5000 17.8111 10.1821 12.7566 230 87.5000 12.5000 37.5000 33.7486 18.3995 13.5034 231 87.5000 62.5000 37.5000 45.5796 42.0582 17.4471 232 62.5000 37.5000 37.5000 21.4106 17.3801 13.9565 233 62.5000 62.5000 37.5000 29.6421 33.8408 16.7003 234 37.5000 37.5000 37.5000 11.9179 12.4856 13.5116 235 37.5000 62.5000 37.5000 20.1494 28.9463 16.2555 236 50.0000 75.0000 50.0000 32.0645 44.0306 27.7237 237 12.5000 87.5000 12.5000 28.0013 53.7152 11.0979 238 12.5000 87.5000 37.5000 29.8182 54.4419 20.6677 239 37.5000 87.5000 37.5000 33.9692 56.5822 20.8622 240 62.5000 87.5000 37.5000 43.4620 61.4767 21.3070 241 87.5000 87.5000 37.5000 59.3994 69.6941 22.0538 242 18.7500 0.00000 0.00000 2.19807 1.61773 1.05614 243 37.5000 12.5000 62.5000 12.4733 6.94928 34.1962 244 62.5000 12.5000 62.5000 21.9661 11.8438 34.6410 245 87.5000 12.5000 62.5000 37.9035 20.0612 35.3878 246 87.5000 12.5000 87.5000 44.8792 22.8510 72.1296 247 87.5000 37.5000 87.5000 48.4787 30.0490 73.3295 248 87.5000 62.5000 87.5000 56.7102 46.5097 76.0733 249 0.00000 18.7500 0.00000 2.03889 3.07749 1.34630 250 0.00000 50.0000 25.0000 9.48738 16.5179 8.31499 251 0.00000 75.0000 25.0000 20.4092 38.3584 11.9556 252 0.00000 75.0000 50.0000 23.3251 39.5246 27.3142 253 12.5000 87.5000 62.5000 33.9731 56.1036 42.5521 254 37.5000 87.5000 62.5000 38.1242 58.2439 42.7466 255 62.5000 87.5000 62.5000 47.6169 63.1384 43.1914 256 12.5000 12.5000 62.5000 8.32223 4.80899 34.0017 257 12.5000 12.5000 87.5000 15.2979 7.59883 70.7435 258 37.5000 12.5000 87.5000 19.4490 9.73913 70.9380 259 62.5000 12.5000 87.5000 28.9418 14.6336 71.3828 260 12.5000 37.5000 62.5000 11.9217 12.0070 35.2016 261 12.5000 37.5000 87.5000 18.8975 14.7969 71.9433 262 37.5000 37.5000 87.5000 23.0485 16.9371 72.1379 263 62.5000 37.5000 87.5000 32.5413 21.8317 72.5827 264 37.5000 37.5000 62.5000 16.0728 14.1473 35.3961 265 37.5000 62.5000 62.5000 24.3043 30.6080 38.1399 266 37.5000 62.5000 87.5000 31.2800 33.3978 74.8817 267 62.5000 62.5000 87.5000 40.7728 38.2924 75.3265 268 62.5000 87.5000 87.5000 54.5927 65.9282 79.9332 269 0.00000 25.0000 75.0000 12.1393 8.33668 50.7848 270 0.00000 50.0000 75.0000 17.9162 19.8888 52.7105 271 0.00000 75.0000 100.000 37.3711 45.1421 101.296 END_DATA CAL DESCRIPTOR "Argyll Device Calibration State" ORIGINATOR "Argyll dispcal" CREATED "Sat Mar 14 19:07:36 2009" KEYWORD "DEVICE_CLASS" DEVICE_CLASS "DISPLAY" KEYWORD "COLOR_REP" COLOR_REP "RGB" BEGIN_ARGYLL_DISPCAL_ARGS -ql -t -g2.2 -f1 -k0 END_ARGYLL_DISPCAL_ARGS KEYWORD "RGB_I" NUMBER_OF_FIELDS 4 BEGIN_DATA_FORMAT RGB_I RGB_R RGB_G RGB_B END_DATA_FORMAT NUMBER_OF_SETS 256 BEGIN_DATA 0.00000 0.00000 0.00000 0.00000 0.00392 0.00392 0.00392 0.00392 0.00784 0.00784 0.00784 0.00784 0.01176 0.01176 0.01176 0.01176 0.01569 0.01569 0.01569 0.01569 0.01961 0.01961 0.01961 0.01961 0.02353 0.02353 0.02353 0.02353 0.02745 0.02745 0.02745 0.02745 0.03137 0.03137 0.03137 0.03137 0.03529 0.03529 0.03529 0.03529 0.03922 0.03922 0.03922 0.03922 0.04314 0.04314 0.04314 0.04314 0.04706 0.04706 0.04706 0.04706 0.05098 0.05098 0.05098 0.05098 0.05490 0.05490 0.05490 0.05490 0.05882 0.05882 0.05882 0.05882 0.06275 0.06275 0.06275 0.06275 0.06667 0.06667 0.06667 0.06667 0.07059 0.07059 0.07059 0.07059 0.07451 0.07451 0.07451 0.07451 0.07843 0.07843 0.07843 0.07843 0.08235 0.08235 0.08235 0.08235 0.08627 0.08627 0.08627 0.08627 0.09020 0.09020 0.09020 0.09020 0.09412 0.09412 0.09412 0.09412 0.09804 0.09804 0.09804 0.09804 0.10196 0.10196 0.10196 0.10196 0.10588 0.10588 0.10588 0.10588 0.10980 0.10980 0.10980 0.10980 0.11373 0.11373 0.11373 0.11373 0.11765 0.11765 0.11765 0.11765 0.12157 0.12157 0.12157 0.12157 0.12549 0.12549 0.12549 0.12549 0.12941 0.12941 0.12941 0.12941 0.13333 0.13333 0.13333 0.13333 0.13725 0.13725 0.13725 0.13725 0.14118 0.14118 0.14118 0.14118 0.14510 0.14510 0.14510 0.14510 0.14902 0.14902 0.14902 0.14902 0.15294 0.15294 0.15294 0.15294 0.15686 0.15686 0.15686 0.15686 0.16078 0.16078 0.16078 0.16078 0.16471 0.16471 0.16471 0.16471 0.16863 0.16863 0.16863 0.16863 0.17255 0.17255 0.17255 0.17255 0.17647 0.17647 0.17647 0.17647 0.18039 0.18039 0.18039 0.18039 0.18431 0.18431 0.18431 0.18431 0.18824 0.18824 0.18824 0.18824 0.19216 0.19216 0.19216 0.19216 0.19608 0.19608 0.19608 0.19608 0.20000 0.20000 0.20000 0.20000 0.20392 0.20392 0.20392 0.20392 0.20784 0.20784 0.20784 0.20784 0.21176 0.21176 0.21176 0.21176 0.21569 0.21569 0.21569 0.21569 0.21961 0.21961 0.21961 0.21961 0.22353 0.22353 0.22353 0.22353 0.22745 0.22745 0.22745 0.22745 0.23137 0.23137 0.23137 0.23137 0.23529 0.23529 0.23529 0.23529 0.23922 0.23922 0.23922 0.23922 0.24314 0.24314 0.24314 0.24314 0.24706 0.24706 0.24706 0.24706 0.25098 0.25098 0.25098 0.25098 0.25490 0.25490 0.25490 0.25490 0.25882 0.25882 0.25882 0.25882 0.26275 0.26275 0.26275 0.26275 0.26667 0.26667 0.26667 0.26667 0.27059 0.27059 0.27059 0.27059 0.27451 0.27451 0.27451 0.27451 0.27843 0.27843 0.27843 0.27843 0.28235 0.28235 0.28235 0.28235 0.28627 0.28627 0.28627 0.28627 0.29020 0.29020 0.29020 0.29020 0.29412 0.29412 0.29412 0.29412 0.29804 0.29804 0.29804 0.29804 0.30196 0.30196 0.30196 0.30196 0.30588 0.30588 0.30588 0.30588 0.30980 0.30980 0.30980 0.30980 0.31373 0.31373 0.31373 0.31373 0.31765 0.31765 0.31765 0.31765 0.32157 0.32157 0.32157 0.32157 0.32549 0.32549 0.32549 0.32549 0.32941 0.32941 0.32941 0.32941 0.33333 0.33333 0.33333 0.33333 0.33725 0.33725 0.33725 0.33725 0.34118 0.34118 0.34118 0.34118 0.34510 0.34510 0.34510 0.34510 0.34902 0.34902 0.34902 0.34902 0.35294 0.35294 0.35294 0.35294 0.35686 0.35686 0.35686 0.35686 0.36078 0.36078 0.36078 0.36078 0.36471 0.36471 0.36471 0.36471 0.36863 0.36863 0.36863 0.36863 0.37255 0.37255 0.37255 0.37255 0.37647 0.37647 0.37647 0.37647 0.38039 0.38039 0.38039 0.38039 0.38431 0.38431 0.38431 0.38431 0.38824 0.38824 0.38824 0.38824 0.39216 0.39216 0.39216 0.39216 0.39608 0.39608 0.39608 0.39608 0.40000 0.40000 0.40000 0.40000 0.40392 0.40392 0.40392 0.40392 0.40784 0.40784 0.40784 0.40784 0.41176 0.41176 0.41176 0.41176 0.41569 0.41569 0.41569 0.41569 0.41961 0.41961 0.41961 0.41961 0.42353 0.42353 0.42353 0.42353 0.42745 0.42745 0.42745 0.42745 0.43137 0.43137 0.43137 0.43137 0.43529 0.43529 0.43529 0.43529 0.43922 0.43922 0.43922 0.43922 0.44314 0.44314 0.44314 0.44314 0.44706 0.44706 0.44706 0.44706 0.45098 0.45098 0.45098 0.45098 0.45490 0.45490 0.45490 0.45490 0.45882 0.45882 0.45882 0.45882 0.46275 0.46275 0.46275 0.46275 0.46667 0.46667 0.46667 0.46667 0.47059 0.47059 0.47059 0.47059 0.47451 0.47451 0.47451 0.47451 0.47843 0.47843 0.47843 0.47843 0.48235 0.48235 0.48235 0.48235 0.48627 0.48627 0.48627 0.48627 0.49020 0.49020 0.49020 0.49020 0.49412 0.49412 0.49412 0.49412 0.49804 0.49804 0.49804 0.49804 0.50196 0.50196 0.50196 0.50196 0.50588 0.50588 0.50588 0.50588 0.50980 0.50980 0.50980 0.50980 0.51373 0.51373 0.51373 0.51373 0.51765 0.51765 0.51765 0.51765 0.52157 0.52157 0.52157 0.52157 0.52549 0.52549 0.52549 0.52549 0.52941 0.52941 0.52941 0.52941 0.53333 0.53333 0.53333 0.53333 0.53725 0.53725 0.53725 0.53725 0.54118 0.54118 0.54118 0.54118 0.54510 0.54510 0.54510 0.54510 0.54902 0.54902 0.54902 0.54902 0.55294 0.55294 0.55294 0.55294 0.55686 0.55686 0.55686 0.55686 0.56078 0.56078 0.56078 0.56078 0.56471 0.56471 0.56471 0.56471 0.56863 0.56863 0.56863 0.56863 0.57255 0.57255 0.57255 0.57255 0.57647 0.57647 0.57647 0.57647 0.58039 0.58039 0.58039 0.58039 0.58431 0.58431 0.58431 0.58431 0.58824 0.58824 0.58824 0.58824 0.59216 0.59216 0.59216 0.59216 0.59608 0.59608 0.59608 0.59608 0.60000 0.60000 0.60000 0.60000 0.60392 0.60392 0.60392 0.60392 0.60784 0.60784 0.60784 0.60784 0.61176 0.61176 0.61176 0.61176 0.61569 0.61569 0.61569 0.61569 0.61961 0.61961 0.61961 0.61961 0.62353 0.62353 0.62353 0.62353 0.62745 0.62745 0.62745 0.62745 0.63137 0.63137 0.63137 0.63137 0.63529 0.63529 0.63529 0.63529 0.63922 0.63922 0.63922 0.63922 0.64314 0.64314 0.64314 0.64314 0.64706 0.64706 0.64706 0.64706 0.65098 0.65098 0.65098 0.65098 0.65490 0.65490 0.65490 0.65490 0.65882 0.65882 0.65882 0.65882 0.66275 0.66275 0.66275 0.66275 0.66667 0.66667 0.66667 0.66667 0.67059 0.67059 0.67059 0.67059 0.67451 0.67451 0.67451 0.67451 0.67843 0.67843 0.67843 0.67843 0.68235 0.68235 0.68235 0.68235 0.68627 0.68627 0.68627 0.68627 0.69020 0.69020 0.69020 0.69020 0.69412 0.69412 0.69412 0.69412 0.69804 0.69804 0.69804 0.69804 0.70196 0.70196 0.70196 0.70196 0.70588 0.70588 0.70588 0.70588 0.70980 0.70980 0.70980 0.70980 0.71373 0.71373 0.71373 0.71373 0.71765 0.71765 0.71765 0.71765 0.72157 0.72157 0.72157 0.72157 0.72549 0.72549 0.72549 0.72549 0.72941 0.72941 0.72941 0.72941 0.73333 0.73333 0.73333 0.73333 0.73725 0.73725 0.73725 0.73725 0.74118 0.74118 0.74118 0.74118 0.74510 0.74510 0.74510 0.74510 0.74902 0.74902 0.74902 0.74902 0.75294 0.75294 0.75294 0.75294 0.75686 0.75686 0.75686 0.75686 0.76078 0.76078 0.76078 0.76078 0.76471 0.76471 0.76471 0.76471 0.76863 0.76863 0.76863 0.76863 0.77255 0.77255 0.77255 0.77255 0.77647 0.77647 0.77647 0.77647 0.78039 0.78039 0.78039 0.78039 0.78431 0.78431 0.78431 0.78431 0.78824 0.78824 0.78824 0.78824 0.79216 0.79216 0.79216 0.79216 0.79608 0.79608 0.79608 0.79608 0.80000 0.80000 0.80000 0.80000 0.80392 0.80392 0.80392 0.80392 0.80784 0.80784 0.80784 0.80784 0.81176 0.81176 0.81176 0.81176 0.81569 0.81569 0.81569 0.81569 0.81961 0.81961 0.81961 0.81961 0.82353 0.82353 0.82353 0.82353 0.82745 0.82745 0.82745 0.82745 0.83137 0.83137 0.83137 0.83137 0.83529 0.83529 0.83529 0.83529 0.83922 0.83922 0.83922 0.83922 0.84314 0.84314 0.84314 0.84314 0.84706 0.84706 0.84706 0.84706 0.85098 0.85098 0.85098 0.85098 0.85490 0.85490 0.85490 0.85490 0.85882 0.85882 0.85882 0.85882 0.86275 0.86275 0.86275 0.86275 0.86667 0.86667 0.86667 0.86667 0.87059 0.87059 0.87059 0.87059 0.87451 0.87451 0.87451 0.87451 0.87843 0.87843 0.87843 0.87843 0.88235 0.88235 0.88235 0.88235 0.88627 0.88627 0.88627 0.88627 0.89020 0.89020 0.89020 0.89020 0.89412 0.89412 0.89412 0.89412 0.89804 0.89804 0.89804 0.89804 0.90196 0.90196 0.90196 0.90196 0.90588 0.90588 0.90588 0.90588 0.90980 0.90980 0.90980 0.90980 0.91373 0.91373 0.91373 0.91373 0.91765 0.91765 0.91765 0.91765 0.92157 0.92157 0.92157 0.92157 0.92549 0.92549 0.92549 0.92549 0.92941 0.92941 0.92941 0.92941 0.93333 0.93333 0.93333 0.93333 0.93725 0.93725 0.93725 0.93725 0.94118 0.94118 0.94118 0.94118 0.94510 0.94510 0.94510 0.94510 0.94902 0.94902 0.94902 0.94902 0.95294 0.95294 0.95294 0.95294 0.95686 0.95686 0.95686 0.95686 0.96078 0.96078 0.96078 0.96078 0.96471 0.96471 0.96471 0.96471 0.96863 0.96863 0.96863 0.96863 0.97255 0.97255 0.97255 0.97255 0.97647 0.97647 0.97647 0.97647 0.98039 0.98039 0.98039 0.98039 0.98431 0.98431 0.98431 0.98431 0.98824 0.98824 0.98824 0.98824 0.99216 0.99216 0.99216 0.99216 0.99608 0.99608 0.99608 0.99608 1.00000 1.00000 1.00000 1.00000 END_DATA DisplayCAL-3.1.0.0/misc/ti3/laptop.ti30000644000076500000000000005560512647526532017073 0ustar devwheel00000000000000CTI3 DESCRIPTOR "Argyll Calibration Target chart information 3" ORIGINATOR "Argyll dispread" CREATED "Sat Mar 14 19:00:55 2009" KEYWORD "DEVICE_CLASS" DEVICE_CLASS "DISPLAY" KEYWORD "APPROX_WHITE_POINT" APPROX_WHITE_POINT "95.106486 100.000000 108.844025" KEYWORD "COLOR_REP" COLOR_REP "RGB_XYZ" KEYWORD "BLACK_COLOR_PATCHES" BLACK_COLOR_PATCHES "4" KEYWORD "COMP_GREY_STEPS" COMP_GREY_STEPS "49" KEYWORD "MULTI_DIM_BCC_STEPS" MULTI_DIM_BCC_STEPS "5" KEYWORD "MULTI_DIM_STEPS" MULTI_DIM_STEPS "5" KEYWORD "SINGLE_DIM_STEPS" SINGLE_DIM_STEPS "17" KEYWORD "WHITE_COLOR_PATCHES" WHITE_COLOR_PATCHES "4" KEYWORD "AUTO_OPTIMIZE" AUTO_OPTIMIZE "5" BEGIN_ARGYLL_COLPROF_ARGS -qh -aX END_ARGYLL_COLPROF_ARGS NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT SAMPLE_ID RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 271 BEGIN_DATA 1 100.000 100.000 100.000 95.1065 100.000 108.844 2 12.5000 37.5000 12.5000 5.94993 9.61866 3.74740 3 12.5000 62.5000 12.5000 14.1814 26.0794 6.49125 4 12.5000 87.5000 87.5000 40.9488 58.8934 79.2939 5 37.5000 87.5000 87.5000 45.0999 61.0337 79.4884 6 0.00000 25.0000 25.0000 3.71049 4.96568 6.38934 7 0.00000 25.0000 50.0000 6.62643 6.13187 21.7479 8 25.0000 75.0000 75.0000 30.9153 42.8005 56.4485 9 50.0000 75.0000 75.0000 37.5774 46.2355 56.7606 10 12.5000 0.00000 0.00000 1.58591 1.30210 1.02745 11 10.4167 10.4167 10.4167 2.00521 2.05749 2.15195 12 25.0000 0.00000 0.00000 3.07728 2.07105 1.09734 13 31.2500 0.00000 0.00000 4.24932 2.67536 1.15226 14 37.5000 0.00000 0.00000 5.73696 3.44239 1.22197 15 43.7500 0.00000 0.00000 7.56070 4.38272 1.30742 16 50.0000 0.00000 0.00000 9.73934 5.50603 1.40951 17 62.5000 37.5000 62.5000 25.5656 19.0418 35.8409 18 87.5000 37.5000 62.5000 41.5030 27.2592 36.5877 19 0.00000 0.00000 0.00000 1.00000 1.00000 1.00000 20 75.0000 0.00000 0.00000 22.3346 12.0002 1.99970 21 81.2500 0.00000 0.00000 26.5283 14.1625 2.19621 22 87.5000 0.00000 0.00000 31.1672 16.5543 2.41358 23 93.7500 0.00000 0.00000 36.2638 19.1821 2.65240 24 100.000 0.00000 0.00000 41.8302 22.0522 2.91323 25 62.5000 62.5000 12.5000 27.8253 33.1142 7.13058 26 75.0000 75.0000 50.0000 44.6598 50.5248 28.3139 27 8.33333 8.33333 8.33333 1.71786 1.75519 1.82265 28 0.00000 12.5000 0.00000 1.50806 2.01598 1.16935 29 0.00000 43.7500 0.00000 6.68900 12.3764 2.89635 30 0.00000 50.0000 0.00000 8.57817 16.1542 3.52608 31 0.00000 56.2500 0.00000 10.7902 20.5776 4.26342 32 0.00000 62.5000 0.00000 13.3391 25.6747 5.11306 33 12.5000 62.5000 37.5000 15.9983 26.8060 16.0610 34 0.00000 0.00000 0.00000 1.00000 1.00000 1.00000 35 0.00000 6.25000 0.00000 1.18254 1.36502 1.06085 36 0.00000 75.0000 0.00000 19.5000 37.9948 7.16671 37 0.00000 81.2500 0.00000 23.1365 45.2667 8.37888 38 0.00000 87.5000 0.00000 27.1590 53.3106 9.71972 39 0.00000 93.7500 0.00000 31.5784 62.1482 11.1929 40 0.00000 100.000 0.00000 36.4052 71.8005 12.8018 41 6.25000 6.25000 6.25000 1.48518 1.51041 1.55601 42 0.00000 0.00000 12.5000 1.25645 1.10256 2.35074 43 0.00000 0.00000 18.7500 1.52439 1.20972 3.76201 44 0.00000 0.00000 25.0000 1.90921 1.36363 5.78891 45 0.00000 0.00000 31.2500 2.42221 1.56879 8.49092 46 0.00000 0.00000 37.5000 3.07334 1.82920 11.9205 47 0.00000 0.00000 43.7500 3.87158 2.14845 16.1249 48 0.00000 0.00000 50.0000 4.82515 2.52982 21.1475 49 0.00000 0.00000 56.2500 5.94168 2.97636 27.0283 50 0.00000 0.00000 62.5000 7.22826 3.49091 33.8049 51 0.00000 0.00000 68.7500 8.69161 4.07616 41.5125 52 0.00000 0.00000 75.0000 10.3380 4.73463 50.1844 53 0.00000 0.00000 81.2500 12.1736 5.46873 59.8524 54 0.00000 0.00000 87.5000 14.2040 6.28076 70.5467 55 0.00000 0.00000 93.7500 16.4347 7.17291 82.2963 56 0.00000 0.00000 100.000 18.8711 8.14731 95.1290 57 0.00000 50.0000 100.000 26.4493 23.3015 97.6550 58 75.0000 50.0000 100.000 47.7839 34.3017 98.6547 59 0.00000 0.00000 6.25000 1.09214 1.03685 1.48530 60 2.08333 2.08333 2.08333 1.15175 1.15964 1.17390 61 4.16667 4.16667 4.16667 1.30372 1.31952 1.34806 62 12.5000 12.5000 12.5000 2.35042 2.42064 2.54755 63 14.5833 14.5833 14.5833 2.75638 2.84772 3.01278 64 16.6667 16.6667 16.6667 3.22584 3.34159 3.55077 65 18.7500 18.7500 18.7500 3.76135 3.90494 4.16445 66 20.8333 20.8333 20.8333 4.36533 4.54033 4.85660 67 22.9167 22.9167 22.9167 5.04007 5.25016 5.62984 68 25.0000 25.0000 25.0000 5.78777 6.03673 6.48668 69 27.0833 27.0833 27.0833 6.61052 6.90226 7.42953 70 29.1667 29.1667 29.1667 7.51032 7.84886 8.46069 71 31.2500 31.2500 31.2500 8.48913 8.87856 9.58238 72 6.25000 0.00000 0.00000 1.21051 1.10854 1.00986 73 33.3333 33.3333 33.3333 9.54879 9.99333 10.7967 74 35.4167 35.4167 35.4167 10.6911 11.1951 12.1058 75 39.5833 39.5833 39.5833 13.2307 13.8667 15.0161 76 41.6667 41.6667 41.6667 14.6313 15.3402 16.6212 77 43.7500 43.7500 43.7500 16.1213 16.9076 18.3287 78 45.8333 45.8333 45.8333 17.7021 18.5707 20.1403 79 47.9167 47.9167 47.9167 19.3754 20.3310 22.0579 80 50.0000 50.0000 50.0000 21.1427 22.1901 24.0831 81 52.0833 52.0833 52.0833 23.0052 24.1495 26.2175 82 54.1667 54.1667 54.1667 24.9646 26.2107 28.4629 83 56.2500 56.2500 56.2500 27.0221 28.3752 30.8208 84 58.3333 58.3333 58.3333 29.1791 30.6444 33.2927 85 60.4167 60.4167 60.4167 31.4370 33.0197 35.8802 86 62.5000 62.5000 62.5000 33.7971 35.5025 38.5847 87 64.5833 64.5833 64.5833 36.2605 38.0941 41.4078 88 66.6667 66.6667 66.6667 38.8287 40.7958 44.3509 89 68.7500 68.7500 68.7500 41.5028 43.6089 47.4154 90 70.8333 70.8333 70.8333 44.2840 46.5348 50.6026 91 72.9167 72.9167 72.9167 47.1736 49.5746 53.9140 92 75.0000 75.0000 75.0000 50.1727 52.7296 57.3508 93 77.0833 77.0833 77.0833 53.2824 56.0011 60.9145 94 79.1667 79.1667 79.1667 56.5039 59.3901 64.6063 95 81.2500 81.2500 81.2500 59.8383 62.8979 68.4275 96 83.3333 83.3333 83.3333 63.2868 66.5257 72.3793 97 85.4167 85.4167 85.4167 66.8503 70.2745 76.4631 98 87.5000 87.5000 87.5000 70.5301 74.1456 80.6800 99 89.5833 89.5833 89.5833 74.3270 78.1400 85.0312 100 91.6667 91.6667 91.6667 78.2423 82.2589 89.5180 101 93.7500 93.7500 93.7500 82.2769 86.5032 94.1415 102 95.8333 95.8333 95.8333 86.4317 90.8742 98.9029 103 97.9167 97.9167 97.9167 90.7080 95.3727 103.803 104 25.0000 25.0000 0.00000 4.87856 5.67311 1.69777 105 50.0000 25.0000 0.00000 11.5406 9.10808 2.00994 106 75.0000 25.0000 0.00000 24.1359 15.6023 2.60014 107 100.000 25.0000 0.00000 43.6314 25.6542 3.51366 108 100.000 75.0000 0.00000 60.3302 59.0470 9.07994 109 50.0000 50.0000 0.00000 17.3175 20.6603 3.93559 110 75.0000 50.0000 0.00000 29.9128 27.1544 4.52578 111 100.000 50.0000 0.00000 49.4083 37.2064 5.43931 112 100.000 100.000 100.000 95.1065 100.000 108.844 113 50.0000 75.0000 0.00000 28.2393 42.5008 7.57622 114 75.0000 75.0000 0.00000 40.8346 48.9950 8.16642 115 25.0000 75.0000 0.00000 21.5773 39.0658 7.26405 116 25.0000 100.000 0.00000 38.4825 72.8716 12.8992 117 50.0000 100.000 0.00000 45.1445 76.3065 13.2113 118 75.0000 100.000 0.00000 57.7399 82.8007 13.8015 119 100.000 100.000 0.00000 77.2354 92.8527 14.7151 120 25.0000 0.00000 25.0000 3.98649 2.43468 5.88625 121 50.0000 0.00000 25.0000 10.6485 5.86966 6.19842 122 75.0000 0.00000 25.0000 23.2439 12.3638 6.78862 123 75.0000 25.0000 25.0000 25.0451 15.9659 7.38905 124 87.5000 37.5000 37.5000 37.3481 25.5975 14.7033 125 56.2500 0.00000 0.00000 12.2903 6.82130 1.52904 126 100.000 0.00000 25.0000 42.7394 22.4158 7.70214 127 100.000 25.0000 25.0000 44.5407 26.0178 8.30257 128 100.000 25.0000 50.0000 47.4566 27.1840 23.6611 129 50.0000 25.0000 25.0000 12.4498 9.47171 6.79885 130 50.0000 50.0000 25.0000 18.2267 21.0239 8.72450 131 75.0000 50.0000 25.0000 30.8220 27.5181 9.31470 132 100.000 50.0000 25.0000 50.3176 37.5700 10.2282 133 25.0000 50.0000 25.0000 11.5647 17.5889 8.41233 134 25.0000 75.0000 25.0000 22.4865 39.4295 12.0530 135 50.0000 75.0000 25.0000 29.1485 42.8645 12.3651 136 75.0000 75.0000 25.0000 41.7438 49.3586 12.9553 137 100.000 75.0000 25.0000 61.2394 59.4106 13.8689 138 25.0000 50.0000 0.00000 10.6555 17.2253 3.62342 139 25.0000 100.000 25.0000 39.3917 73.2352 17.6881 140 50.0000 100.000 25.0000 46.0538 76.6702 18.0003 141 75.0000 100.000 25.0000 58.6491 83.1644 18.5905 142 100.000 100.000 25.0000 78.1446 93.2163 19.5040 143 25.0000 0.00000 50.0000 6.90243 3.60087 21.2448 144 50.0000 0.00000 50.0000 13.5645 7.03585 21.5570 145 75.0000 0.00000 50.0000 26.1598 13.5300 22.1472 146 100.000 0.00000 50.0000 45.6553 23.5820 23.0607 147 100.000 50.0000 75.0000 58.7464 40.9410 54.6237 148 100.000 50.0000 100.000 67.2794 44.3537 99.5683 149 50.0000 25.0000 50.0000 15.3658 10.6379 22.1574 150 75.0000 25.0000 50.0000 27.9611 17.1321 22.7476 151 100.000 25.0000 75.0000 52.9695 29.3888 52.6981 152 25.0000 25.0000 50.0000 8.70371 7.20292 21.8452 153 25.0000 50.0000 50.0000 14.4806 18.7551 23.7709 154 75.0000 50.0000 50.0000 33.7380 28.6843 24.6733 155 100.000 50.0000 50.0000 53.2335 38.7362 25.5868 156 100.000 75.0000 50.0000 64.1553 60.5768 29.2274 157 87.5000 62.5000 62.5000 49.7345 43.7199 39.3315 158 87.5000 87.5000 62.5000 63.5544 71.3558 43.9382 159 100.000 100.000 75.0000 86.5734 96.5873 63.8995 160 0.00000 68.7500 0.00000 16.2382 31.4721 6.07943 161 0.00000 100.000 25.0000 37.3144 72.1641 17.5907 162 0.00000 100.000 50.0000 40.2304 73.3303 32.9493 163 50.0000 100.000 50.0000 48.9697 77.8364 33.3588 164 75.0000 100.000 50.0000 61.5650 84.3305 33.9490 165 100.000 100.000 50.0000 81.0605 94.3825 34.8625 166 25.0000 0.00000 75.0000 12.4153 5.80568 50.2817 167 50.0000 0.00000 75.0000 19.0774 9.24066 50.5939 168 75.0000 0.00000 75.0000 31.6727 15.7348 51.1841 169 100.000 0.00000 75.0000 51.1682 25.7868 52.0976 170 100.000 0.00000 100.000 59.7013 29.1995 97.0422 171 25.0000 25.0000 75.0000 14.2166 9.40773 50.8822 172 50.0000 25.0000 75.0000 20.8787 12.8427 51.1944 173 75.0000 25.0000 75.0000 33.4740 19.3369 51.7845 174 0.00000 31.2500 0.00000 3.81760 6.63441 1.93921 175 0.00000 37.5000 0.00000 5.10758 9.21400 2.36920 176 25.0000 50.0000 75.0000 19.9935 20.9599 52.8078 177 50.0000 50.0000 75.0000 26.6555 24.3949 53.1200 178 75.0000 50.0000 75.0000 39.2509 30.8891 53.7102 179 100.000 75.0000 75.0000 69.6682 62.7816 58.2644 180 100.000 75.0000 100.000 78.2013 66.1943 103.209 181 0.00000 0.00000 0.00000 1.00000 1.00000 1.00000 182 12.5000 37.5000 37.5000 7.76682 10.3453 13.3171 183 25.0000 75.0000 50.0000 25.4024 40.5957 27.4115 184 25.0000 100.000 50.0000 42.3076 74.4014 33.0466 185 25.0000 100.000 75.0000 47.8205 76.6062 62.0836 186 50.0000 100.000 75.0000 54.4826 80.0412 62.3958 187 75.0000 100.000 75.0000 67.0779 86.5354 62.9859 188 100.000 100.000 100.000 95.1065 100.000 108.844 189 25.0000 0.00000 100.000 20.9484 9.21837 95.2263 190 50.0000 0.00000 100.000 27.6104 12.6533 95.5385 191 75.0000 0.00000 100.000 40.2058 19.1475 96.1287 192 75.0000 75.0000 100.000 58.7057 56.1423 102.295 193 0.00000 25.0000 100.000 20.6724 11.7494 95.7294 194 25.0000 25.0000 100.000 22.7497 12.8204 95.8267 195 50.0000 25.0000 100.000 29.4117 16.2554 96.1389 196 75.0000 25.0000 100.000 42.0070 22.7496 96.7291 197 100.000 25.0000 100.000 61.5026 32.8015 97.6426 198 0.00000 0.00000 0.00000 1.00000 1.00000 1.00000 199 25.0000 50.0000 100.000 28.5266 24.3726 97.7524 200 50.0000 50.0000 100.000 35.1886 27.8076 98.0645 201 50.0000 75.0000 100.000 46.1104 49.6481 101.705 202 12.5000 62.5000 62.5000 20.1532 28.4677 37.9454 203 12.5000 62.5000 87.5000 27.1290 31.2576 74.6872 204 25.0000 75.0000 100.000 39.4484 46.2132 101.393 205 0.00000 50.0000 50.0000 12.4033 17.6840 23.6735 206 0.00000 75.0000 75.0000 28.8380 41.7294 56.3511 207 0.00000 100.000 75.0000 45.7432 75.5351 61.9862 208 0.00000 100.000 100.000 54.2763 78.9478 106.931 209 25.0000 100.000 100.000 56.3536 80.0189 107.028 210 50.0000 100.000 100.000 63.0157 83.4539 107.340 211 75.0000 100.000 100.000 75.6110 89.9480 107.930 212 62.5000 0.00000 0.00000 15.2297 8.33690 1.66678 213 68.7500 0.00000 0.00000 18.5730 10.0607 1.82344 214 100.000 100.000 100.000 95.1065 100.000 108.844 215 0.00000 25.0000 0.00000 2.80128 4.60205 1.60043 216 37.5000 37.5000 12.5000 10.1010 11.7590 3.94191 217 62.5000 37.5000 12.5000 19.5938 16.6535 4.38672 218 87.5000 37.5000 12.5000 35.5312 24.8708 5.13352 219 37.5000 12.5000 12.5000 6.50147 4.56093 2.74206 220 62.5000 12.5000 12.5000 15.9942 9.45544 3.18687 221 87.5000 12.5000 12.5000 31.9317 17.6728 3.93367 222 87.5000 62.5000 12.5000 43.7627 41.3315 7.87738 223 37.5000 62.5000 12.5000 18.3325 28.2197 6.68576 224 37.5000 87.5000 12.5000 32.1524 55.8555 11.2924 225 62.5000 87.5000 12.5000 41.6451 60.7500 11.7372 226 87.5000 87.5000 12.5000 57.5826 68.9674 12.4840 227 12.5000 12.5000 37.5000 4.16730 3.14728 12.1173 228 37.5000 12.5000 37.5000 8.31836 5.28757 12.3118 229 62.5000 12.5000 37.5000 17.8111 10.1821 12.7566 230 87.5000 12.5000 37.5000 33.7486 18.3995 13.5034 231 87.5000 62.5000 37.5000 45.5796 42.0582 17.4471 232 62.5000 37.5000 37.5000 21.4106 17.3801 13.9565 233 62.5000 62.5000 37.5000 29.6421 33.8408 16.7003 234 37.5000 37.5000 37.5000 11.9179 12.4856 13.5116 235 37.5000 62.5000 37.5000 20.1494 28.9463 16.2555 236 50.0000 75.0000 50.0000 32.0645 44.0306 27.7237 237 12.5000 87.5000 12.5000 28.0013 53.7152 11.0979 238 12.5000 87.5000 37.5000 29.8182 54.4419 20.6677 239 37.5000 87.5000 37.5000 33.9692 56.5822 20.8622 240 62.5000 87.5000 37.5000 43.4620 61.4767 21.3070 241 87.5000 87.5000 37.5000 59.3994 69.6941 22.0538 242 18.7500 0.00000 0.00000 2.19807 1.61773 1.05614 243 37.5000 12.5000 62.5000 12.4733 6.94928 34.1962 244 62.5000 12.5000 62.5000 21.9661 11.8438 34.6410 245 87.5000 12.5000 62.5000 37.9035 20.0612 35.3878 246 87.5000 12.5000 87.5000 44.8792 22.8510 72.1296 247 87.5000 37.5000 87.5000 48.4787 30.0490 73.3295 248 87.5000 62.5000 87.5000 56.7102 46.5097 76.0733 249 0.00000 18.7500 0.00000 2.03889 3.07749 1.34630 250 0.00000 50.0000 25.0000 9.48738 16.5179 8.31499 251 0.00000 75.0000 25.0000 20.4092 38.3584 11.9556 252 0.00000 75.0000 50.0000 23.3251 39.5246 27.3142 253 12.5000 87.5000 62.5000 33.9731 56.1036 42.5521 254 37.5000 87.5000 62.5000 38.1242 58.2439 42.7466 255 62.5000 87.5000 62.5000 47.6169 63.1384 43.1914 256 12.5000 12.5000 62.5000 8.32223 4.80899 34.0017 257 12.5000 12.5000 87.5000 15.2979 7.59883 70.7435 258 37.5000 12.5000 87.5000 19.4490 9.73913 70.9380 259 62.5000 12.5000 87.5000 28.9418 14.6336 71.3828 260 12.5000 37.5000 62.5000 11.9217 12.0070 35.2016 261 12.5000 37.5000 87.5000 18.8975 14.7969 71.9433 262 37.5000 37.5000 87.5000 23.0485 16.9371 72.1379 263 62.5000 37.5000 87.5000 32.5413 21.8317 72.5827 264 37.5000 37.5000 62.5000 16.0728 14.1473 35.3961 265 37.5000 62.5000 62.5000 24.3043 30.6080 38.1399 266 37.5000 62.5000 87.5000 31.2800 33.3978 74.8817 267 62.5000 62.5000 87.5000 40.7728 38.2924 75.3265 268 62.5000 87.5000 87.5000 54.5927 65.9282 79.9332 269 0.00000 25.0000 75.0000 12.1393 8.33668 50.7848 270 0.00000 50.0000 75.0000 17.9162 19.8888 52.7105 271 0.00000 75.0000 100.000 37.3711 45.1421 101.296 END_DATA CAL DESCRIPTOR "Argyll Device Calibration State" ORIGINATOR "Argyll dispcal" CREATED "Sat Mar 14 19:07:36 2009" KEYWORD "DEVICE_CLASS" DEVICE_CLASS "DISPLAY" KEYWORD "COLOR_REP" COLOR_REP "RGB" BEGIN_ARGYLL_DISPCAL_ARGS -ql -t -g2.2 -f1 -k0 -m END_ARGYLL_DISPCAL_ARGS KEYWORD "RGB_I" NUMBER_OF_FIELDS 4 BEGIN_DATA_FORMAT RGB_I RGB_R RGB_G RGB_B END_DATA_FORMAT NUMBER_OF_SETS 256 BEGIN_DATA 0.00000 0.00000 0.00000 0.00000 0.00392 0.00392 0.00392 0.00392 0.00784 0.00784 0.00784 0.00784 0.01176 0.01176 0.01176 0.01176 0.01569 0.01569 0.01569 0.01569 0.01961 0.01961 0.01961 0.01961 0.02353 0.02353 0.02353 0.02353 0.02745 0.02745 0.02745 0.02745 0.03137 0.03137 0.03137 0.03137 0.03529 0.03529 0.03529 0.03529 0.03922 0.03922 0.03922 0.03922 0.04314 0.04314 0.04314 0.04314 0.04706 0.04706 0.04706 0.04706 0.05098 0.05098 0.05098 0.05098 0.05490 0.05490 0.05490 0.05490 0.05882 0.05882 0.05882 0.05882 0.06275 0.06275 0.06275 0.06275 0.06667 0.06667 0.06667 0.06667 0.07059 0.07059 0.07059 0.07059 0.07451 0.07451 0.07451 0.07451 0.07843 0.07843 0.07843 0.07843 0.08235 0.08235 0.08235 0.08235 0.08627 0.08627 0.08627 0.08627 0.09020 0.09020 0.09020 0.09020 0.09412 0.09412 0.09412 0.09412 0.09804 0.09804 0.09804 0.09804 0.10196 0.10196 0.10196 0.10196 0.10588 0.10588 0.10588 0.10588 0.10980 0.10980 0.10980 0.10980 0.11373 0.11373 0.11373 0.11373 0.11765 0.11765 0.11765 0.11765 0.12157 0.12157 0.12157 0.12157 0.12549 0.12549 0.12549 0.12549 0.12941 0.12941 0.12941 0.12941 0.13333 0.13333 0.13333 0.13333 0.13725 0.13725 0.13725 0.13725 0.14118 0.14118 0.14118 0.14118 0.14510 0.14510 0.14510 0.14510 0.14902 0.14902 0.14902 0.14902 0.15294 0.15294 0.15294 0.15294 0.15686 0.15686 0.15686 0.15686 0.16078 0.16078 0.16078 0.16078 0.16471 0.16471 0.16471 0.16471 0.16863 0.16863 0.16863 0.16863 0.17255 0.17255 0.17255 0.17255 0.17647 0.17647 0.17647 0.17647 0.18039 0.18039 0.18039 0.18039 0.18431 0.18431 0.18431 0.18431 0.18824 0.18824 0.18824 0.18824 0.19216 0.19216 0.19216 0.19216 0.19608 0.19608 0.19608 0.19608 0.20000 0.20000 0.20000 0.20000 0.20392 0.20392 0.20392 0.20392 0.20784 0.20784 0.20784 0.20784 0.21176 0.21176 0.21176 0.21176 0.21569 0.21569 0.21569 0.21569 0.21961 0.21961 0.21961 0.21961 0.22353 0.22353 0.22353 0.22353 0.22745 0.22745 0.22745 0.22745 0.23137 0.23137 0.23137 0.23137 0.23529 0.23529 0.23529 0.23529 0.23922 0.23922 0.23922 0.23922 0.24314 0.24314 0.24314 0.24314 0.24706 0.24706 0.24706 0.24706 0.25098 0.25098 0.25098 0.25098 0.25490 0.25490 0.25490 0.25490 0.25882 0.25882 0.25882 0.25882 0.26275 0.26275 0.26275 0.26275 0.26667 0.26667 0.26667 0.26667 0.27059 0.27059 0.27059 0.27059 0.27451 0.27451 0.27451 0.27451 0.27843 0.27843 0.27843 0.27843 0.28235 0.28235 0.28235 0.28235 0.28627 0.28627 0.28627 0.28627 0.29020 0.29020 0.29020 0.29020 0.29412 0.29412 0.29412 0.29412 0.29804 0.29804 0.29804 0.29804 0.30196 0.30196 0.30196 0.30196 0.30588 0.30588 0.30588 0.30588 0.30980 0.30980 0.30980 0.30980 0.31373 0.31373 0.31373 0.31373 0.31765 0.31765 0.31765 0.31765 0.32157 0.32157 0.32157 0.32157 0.32549 0.32549 0.32549 0.32549 0.32941 0.32941 0.32941 0.32941 0.33333 0.33333 0.33333 0.33333 0.33725 0.33725 0.33725 0.33725 0.34118 0.34118 0.34118 0.34118 0.34510 0.34510 0.34510 0.34510 0.34902 0.34902 0.34902 0.34902 0.35294 0.35294 0.35294 0.35294 0.35686 0.35686 0.35686 0.35686 0.36078 0.36078 0.36078 0.36078 0.36471 0.36471 0.36471 0.36471 0.36863 0.36863 0.36863 0.36863 0.37255 0.37255 0.37255 0.37255 0.37647 0.37647 0.37647 0.37647 0.38039 0.38039 0.38039 0.38039 0.38431 0.38431 0.38431 0.38431 0.38824 0.38824 0.38824 0.38824 0.39216 0.39216 0.39216 0.39216 0.39608 0.39608 0.39608 0.39608 0.40000 0.40000 0.40000 0.40000 0.40392 0.40392 0.40392 0.40392 0.40784 0.40784 0.40784 0.40784 0.41176 0.41176 0.41176 0.41176 0.41569 0.41569 0.41569 0.41569 0.41961 0.41961 0.41961 0.41961 0.42353 0.42353 0.42353 0.42353 0.42745 0.42745 0.42745 0.42745 0.43137 0.43137 0.43137 0.43137 0.43529 0.43529 0.43529 0.43529 0.43922 0.43922 0.43922 0.43922 0.44314 0.44314 0.44314 0.44314 0.44706 0.44706 0.44706 0.44706 0.45098 0.45098 0.45098 0.45098 0.45490 0.45490 0.45490 0.45490 0.45882 0.45882 0.45882 0.45882 0.46275 0.46275 0.46275 0.46275 0.46667 0.46667 0.46667 0.46667 0.47059 0.47059 0.47059 0.47059 0.47451 0.47451 0.47451 0.47451 0.47843 0.47843 0.47843 0.47843 0.48235 0.48235 0.48235 0.48235 0.48627 0.48627 0.48627 0.48627 0.49020 0.49020 0.49020 0.49020 0.49412 0.49412 0.49412 0.49412 0.49804 0.49804 0.49804 0.49804 0.50196 0.50196 0.50196 0.50196 0.50588 0.50588 0.50588 0.50588 0.50980 0.50980 0.50980 0.50980 0.51373 0.51373 0.51373 0.51373 0.51765 0.51765 0.51765 0.51765 0.52157 0.52157 0.52157 0.52157 0.52549 0.52549 0.52549 0.52549 0.52941 0.52941 0.52941 0.52941 0.53333 0.53333 0.53333 0.53333 0.53725 0.53725 0.53725 0.53725 0.54118 0.54118 0.54118 0.54118 0.54510 0.54510 0.54510 0.54510 0.54902 0.54902 0.54902 0.54902 0.55294 0.55294 0.55294 0.55294 0.55686 0.55686 0.55686 0.55686 0.56078 0.56078 0.56078 0.56078 0.56471 0.56471 0.56471 0.56471 0.56863 0.56863 0.56863 0.56863 0.57255 0.57255 0.57255 0.57255 0.57647 0.57647 0.57647 0.57647 0.58039 0.58039 0.58039 0.58039 0.58431 0.58431 0.58431 0.58431 0.58824 0.58824 0.58824 0.58824 0.59216 0.59216 0.59216 0.59216 0.59608 0.59608 0.59608 0.59608 0.60000 0.60000 0.60000 0.60000 0.60392 0.60392 0.60392 0.60392 0.60784 0.60784 0.60784 0.60784 0.61176 0.61176 0.61176 0.61176 0.61569 0.61569 0.61569 0.61569 0.61961 0.61961 0.61961 0.61961 0.62353 0.62353 0.62353 0.62353 0.62745 0.62745 0.62745 0.62745 0.63137 0.63137 0.63137 0.63137 0.63529 0.63529 0.63529 0.63529 0.63922 0.63922 0.63922 0.63922 0.64314 0.64314 0.64314 0.64314 0.64706 0.64706 0.64706 0.64706 0.65098 0.65098 0.65098 0.65098 0.65490 0.65490 0.65490 0.65490 0.65882 0.65882 0.65882 0.65882 0.66275 0.66275 0.66275 0.66275 0.66667 0.66667 0.66667 0.66667 0.67059 0.67059 0.67059 0.67059 0.67451 0.67451 0.67451 0.67451 0.67843 0.67843 0.67843 0.67843 0.68235 0.68235 0.68235 0.68235 0.68627 0.68627 0.68627 0.68627 0.69020 0.69020 0.69020 0.69020 0.69412 0.69412 0.69412 0.69412 0.69804 0.69804 0.69804 0.69804 0.70196 0.70196 0.70196 0.70196 0.70588 0.70588 0.70588 0.70588 0.70980 0.70980 0.70980 0.70980 0.71373 0.71373 0.71373 0.71373 0.71765 0.71765 0.71765 0.71765 0.72157 0.72157 0.72157 0.72157 0.72549 0.72549 0.72549 0.72549 0.72941 0.72941 0.72941 0.72941 0.73333 0.73333 0.73333 0.73333 0.73725 0.73725 0.73725 0.73725 0.74118 0.74118 0.74118 0.74118 0.74510 0.74510 0.74510 0.74510 0.74902 0.74902 0.74902 0.74902 0.75294 0.75294 0.75294 0.75294 0.75686 0.75686 0.75686 0.75686 0.76078 0.76078 0.76078 0.76078 0.76471 0.76471 0.76471 0.76471 0.76863 0.76863 0.76863 0.76863 0.77255 0.77255 0.77255 0.77255 0.77647 0.77647 0.77647 0.77647 0.78039 0.78039 0.78039 0.78039 0.78431 0.78431 0.78431 0.78431 0.78824 0.78824 0.78824 0.78824 0.79216 0.79216 0.79216 0.79216 0.79608 0.79608 0.79608 0.79608 0.80000 0.80000 0.80000 0.80000 0.80392 0.80392 0.80392 0.80392 0.80784 0.80784 0.80784 0.80784 0.81176 0.81176 0.81176 0.81176 0.81569 0.81569 0.81569 0.81569 0.81961 0.81961 0.81961 0.81961 0.82353 0.82353 0.82353 0.82353 0.82745 0.82745 0.82745 0.82745 0.83137 0.83137 0.83137 0.83137 0.83529 0.83529 0.83529 0.83529 0.83922 0.83922 0.83922 0.83922 0.84314 0.84314 0.84314 0.84314 0.84706 0.84706 0.84706 0.84706 0.85098 0.85098 0.85098 0.85098 0.85490 0.85490 0.85490 0.85490 0.85882 0.85882 0.85882 0.85882 0.86275 0.86275 0.86275 0.86275 0.86667 0.86667 0.86667 0.86667 0.87059 0.87059 0.87059 0.87059 0.87451 0.87451 0.87451 0.87451 0.87843 0.87843 0.87843 0.87843 0.88235 0.88235 0.88235 0.88235 0.88627 0.88627 0.88627 0.88627 0.89020 0.89020 0.89020 0.89020 0.89412 0.89412 0.89412 0.89412 0.89804 0.89804 0.89804 0.89804 0.90196 0.90196 0.90196 0.90196 0.90588 0.90588 0.90588 0.90588 0.90980 0.90980 0.90980 0.90980 0.91373 0.91373 0.91373 0.91373 0.91765 0.91765 0.91765 0.91765 0.92157 0.92157 0.92157 0.92157 0.92549 0.92549 0.92549 0.92549 0.92941 0.92941 0.92941 0.92941 0.93333 0.93333 0.93333 0.93333 0.93725 0.93725 0.93725 0.93725 0.94118 0.94118 0.94118 0.94118 0.94510 0.94510 0.94510 0.94510 0.94902 0.94902 0.94902 0.94902 0.95294 0.95294 0.95294 0.95294 0.95686 0.95686 0.95686 0.95686 0.96078 0.96078 0.96078 0.96078 0.96471 0.96471 0.96471 0.96471 0.96863 0.96863 0.96863 0.96863 0.97255 0.97255 0.97255 0.97255 0.97647 0.97647 0.97647 0.97647 0.98039 0.98039 0.98039 0.98039 0.98431 0.98431 0.98431 0.98431 0.98824 0.98824 0.98824 0.98824 0.99216 0.99216 0.99216 0.99216 0.99608 0.99608 0.99608 0.99608 1.00000 1.00000 1.00000 1.00000 END_DATA DisplayCAL-3.1.0.0/misc/ti3/low_contrast.ti30000644000076500000000000002760412647526532020310 0ustar devwheel00000000000000CTI3 DESCRIPTOR "Argyll Calibration Target chart information 3" ORIGINATOR "Argyll dispread" CREATED "Sat Mar 14 19:00:55 2009" KEYWORD "DEVICE_CLASS" DEVICE_CLASS "DISPLAY" KEYWORD "APPROX_WHITE_POINT" APPROX_WHITE_POINT "95.106486 100.000000 108.844025" KEYWORD "COLOR_REP" COLOR_REP "RGB_XYZ" KEYWORD "BLACK_COLOR_PATCHES" BLACK_COLOR_PATCHES "4" KEYWORD "COMP_GREY_STEPS" COMP_GREY_STEPS "9" KEYWORD "MULTI_DIM_BCC_STEPS" MULTI_DIM_BCC_STEPS "3" KEYWORD "MULTI_DIM_STEPS" MULTI_DIM_STEPS "3" KEYWORD "SINGLE_DIM_STEPS" SINGLE_DIM_STEPS "3" KEYWORD "WHITE_COLOR_PATCHES" WHITE_COLOR_PATCHES "4" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT SAMPLE_ID RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 57 BEGIN_DATA 1 100.000 100.000 100.000 95.1065 100.000 108.844 2 100.000 100.000 100.000 95.1065 100.000 108.844 3 100.000 100.000 100.000 95.1065 100.000 108.844 4 100.000 100.000 100.000 95.1065 100.000 108.844 5 0.00000 0.00000 0.00000 1.00000 1.00000 1.00000 6 0.00000 0.00000 0.00000 1.00000 1.00000 1.00000 7 0.00000 0.00000 0.00000 1.00000 1.00000 1.00000 8 0.00000 0.00000 0.00000 1.00000 1.00000 1.00000 9 12.5000 12.5000 12.5000 2.35042 2.42064 2.54755 10 25.0000 25.0000 25.0000 5.78777 6.03673 6.48668 11 37.5000 37.5000 37.5000 11.9179 12.4856 13.5116 12 50.0000 50.0000 50.0000 21.1427 22.1901 24.0831 13 62.5000 62.5000 62.5000 33.7971 35.5025 38.5847 14 75.0000 75.0000 75.0000 50.1727 52.7296 57.3508 15 87.5000 87.5000 87.5000 70.5301 74.1456 80.6800 16 0.00000 0.00000 50.0000 4.82515 2.52982 21.1475 17 0.00000 0.00000 100.000 18.8711 8.14731 95.1290 18 0.00000 50.0000 0.00000 8.57817 16.1542 3.52608 19 0.00000 50.0000 50.0000 12.4033 17.6840 23.6735 20 0.00000 50.0000 100.000 26.4493 23.3015 97.6550 21 0.00000 100.000 0.00000 36.4052 71.8005 12.8018 22 0.00000 100.000 50.0000 40.2304 73.3303 32.9493 23 0.00000 100.000 100.000 54.2763 78.9478 106.931 24 25.0000 25.0000 75.0000 14.2166 9.40773 50.8822 25 25.0000 75.0000 25.0000 22.4865 39.4295 12.0530 26 25.0000 75.0000 75.0000 30.9153 42.8005 56.4485 27 50.0000 0.00000 0.00000 9.73934 5.50603 1.40951 28 50.0000 0.00000 50.0000 13.5645 7.03585 21.5570 29 50.0000 0.00000 100.000 27.6104 12.6533 95.5385 30 50.0000 50.0000 0.00000 17.3175 20.6603 3.93559 31 50.0000 50.0000 100.000 35.1886 27.8076 98.0645 32 50.0000 100.000 0.00000 45.1445 76.3065 13.2113 33 50.0000 100.000 50.0000 48.9697 77.8364 33.3588 34 50.0000 100.000 100.000 63.0157 83.4539 107.340 35 75.0000 25.0000 25.0000 25.0451 15.9659 7.38905 36 75.0000 25.0000 75.0000 33.4740 19.3369 51.7845 37 75.0000 75.0000 25.0000 41.7438 49.3586 12.9553 38 100.000 0.00000 0.00000 41.8302 22.0522 2.91323 39 100.000 0.00000 50.0000 45.6553 23.5820 23.0607 40 100.000 0.00000 100.000 59.7013 29.1995 97.0422 41 100.000 50.0000 0.00000 49.4083 37.2064 5.43931 42 100.000 50.0000 50.0000 53.2335 38.7362 25.5868 43 100.000 50.0000 100.000 67.2794 44.3537 99.5683 44 100.000 100.000 0.00000 77.2354 92.8527 14.7151 45 100.000 100.000 50.0000 81.0605 94.3825 34.8625 46 0.00000 12.5000 100.000 19.3792 9.16329 95.2983 47 12.5000 0.00000 100.000 19.4570 8.44941 95.1564 48 0.00000 100.000 12.5000 36.6617 71.9031 14.1526 49 12.5000 100.000 0.00000 36.9911 72.1026 12.8293 50 100.000 0.00000 12.5000 42.0866 22.1547 4.26397 51 100.000 12.5000 0.00000 42.3382 23.0681 3.08259 52 0.00000 25.0000 100.000 20.6724 11.7494 95.7294 53 25.0000 0.00000 100.000 20.9484 9.21837 95.2263 54 0.00000 100.000 25.0000 37.3144 72.1641 17.5907 55 25.0000 100.000 0.00000 38.4825 72.8716 12.8992 56 100.000 0.00000 25.0000 42.7394 22.4158 7.70214 57 100.000 25.0000 0.00000 43.6314 25.6542 3.51366 END_DATA CAL DESCRIPTOR "Argyll Device Calibration State" ORIGINATOR "Argyll dispcal" CREATED "Sat Mar 14 19:07:36 2009" KEYWORD "DEVICE_CLASS" DEVICE_CLASS "DISPLAY" KEYWORD "COLOR_REP" COLOR_REP "RGB" KEYWORD "RGB_I" NUMBER_OF_FIELDS 4 BEGIN_DATA_FORMAT RGB_I RGB_R RGB_G RGB_B END_DATA_FORMAT NUMBER_OF_SETS 256 BEGIN_DATA 0.00000 0.20000 0.20000 0.20000 0.00392 0.20235 0.20235 0.20235 0.00784 0.20471 0.20471 0.20471 0.01176 0.20706 0.20706 0.20706 0.01569 0.20941 0.20941 0.20941 0.01961 0.21176 0.21176 0.21176 0.02353 0.21412 0.21412 0.21412 0.02745 0.21647 0.21647 0.21647 0.03137 0.21882 0.21882 0.21882 0.03529 0.22118 0.22118 0.22118 0.03922 0.22353 0.22353 0.22353 0.04314 0.22588 0.22588 0.22588 0.04706 0.22824 0.22824 0.22824 0.05098 0.23059 0.23059 0.23059 0.05490 0.23294 0.23294 0.23294 0.05882 0.23529 0.23529 0.23529 0.06275 0.23765 0.23765 0.23765 0.06667 0.24000 0.24000 0.24000 0.07059 0.24235 0.24235 0.24235 0.07451 0.24471 0.24471 0.24471 0.07843 0.24706 0.24706 0.24706 0.08235 0.24941 0.24941 0.24941 0.08627 0.25176 0.25176 0.25176 0.09020 0.25412 0.25412 0.25412 0.09412 0.25647 0.25647 0.25647 0.09804 0.25882 0.25882 0.25882 0.10196 0.26118 0.26118 0.26118 0.10588 0.26353 0.26353 0.26353 0.10980 0.26588 0.26588 0.26588 0.11373 0.26824 0.26824 0.26824 0.11765 0.27059 0.27059 0.27059 0.12157 0.27294 0.27294 0.27294 0.12549 0.27529 0.27529 0.27529 0.12941 0.27765 0.27765 0.27765 0.13333 0.28000 0.28000 0.28000 0.13725 0.28235 0.28235 0.28235 0.14118 0.28471 0.28471 0.28471 0.14510 0.28706 0.28706 0.28706 0.14902 0.28941 0.28941 0.28941 0.15294 0.29176 0.29176 0.29176 0.15686 0.29412 0.29412 0.29412 0.16078 0.29647 0.29647 0.29647 0.16471 0.29882 0.29882 0.29882 0.16863 0.30118 0.30118 0.30118 0.17255 0.30353 0.30353 0.30353 0.17647 0.30588 0.30588 0.30588 0.18039 0.30824 0.30824 0.30824 0.18431 0.31059 0.31059 0.31059 0.18824 0.31294 0.31294 0.31294 0.19216 0.31529 0.31529 0.31529 0.19608 0.31765 0.31765 0.31765 0.20000 0.32000 0.32000 0.32000 0.20392 0.32235 0.32235 0.32235 0.20784 0.32471 0.32471 0.32471 0.21176 0.32706 0.32706 0.32706 0.21569 0.32941 0.32941 0.32941 0.21961 0.33176 0.33176 0.33176 0.22353 0.33412 0.33412 0.33412 0.22745 0.33647 0.33647 0.33647 0.23137 0.33882 0.33882 0.33882 0.23529 0.34118 0.34118 0.34118 0.23922 0.34353 0.34353 0.34353 0.24314 0.34588 0.34588 0.34588 0.24706 0.34824 0.34824 0.34824 0.25098 0.35059 0.35059 0.35059 0.25490 0.35294 0.35294 0.35294 0.25882 0.35529 0.35529 0.35529 0.26275 0.35765 0.35765 0.35765 0.26667 0.36000 0.36000 0.36000 0.27059 0.36235 0.36235 0.36235 0.27451 0.36471 0.36471 0.36471 0.27843 0.36706 0.36706 0.36706 0.28235 0.36941 0.36941 0.36941 0.28627 0.37176 0.37176 0.37176 0.29020 0.37412 0.37412 0.37412 0.29412 0.37647 0.37647 0.37647 0.29804 0.37882 0.37882 0.37882 0.30196 0.38118 0.38118 0.38118 0.30588 0.38353 0.38353 0.38353 0.30980 0.38588 0.38588 0.38588 0.31373 0.38824 0.38824 0.38824 0.31765 0.39059 0.39059 0.39059 0.32157 0.39294 0.39294 0.39294 0.32549 0.39529 0.39529 0.39529 0.32941 0.39765 0.39765 0.39765 0.33333 0.40000 0.40000 0.40000 0.33725 0.40235 0.40235 0.40235 0.34118 0.40471 0.40471 0.40471 0.34510 0.40706 0.40706 0.40706 0.34902 0.40941 0.40941 0.40941 0.35294 0.41176 0.41176 0.41176 0.35686 0.41412 0.41412 0.41412 0.36078 0.41647 0.41647 0.41647 0.36471 0.41882 0.41882 0.41882 0.36863 0.42118 0.42118 0.42118 0.37255 0.42353 0.42353 0.42353 0.37647 0.42588 0.42588 0.42588 0.38039 0.42824 0.42824 0.42824 0.38431 0.43059 0.43059 0.43059 0.38824 0.43294 0.43294 0.43294 0.39216 0.43529 0.43529 0.43529 0.39608 0.43765 0.43765 0.43765 0.40000 0.44000 0.44000 0.44000 0.40392 0.44235 0.44235 0.44235 0.40784 0.44471 0.44471 0.44471 0.41176 0.44706 0.44706 0.44706 0.41569 0.44941 0.44941 0.44941 0.41961 0.45176 0.45176 0.45176 0.42353 0.45412 0.45412 0.45412 0.42745 0.45647 0.45647 0.45647 0.43137 0.45882 0.45882 0.45882 0.43529 0.46118 0.46118 0.46118 0.43922 0.46353 0.46353 0.46353 0.44314 0.46588 0.46588 0.46588 0.44706 0.46824 0.46824 0.46824 0.45098 0.47059 0.47059 0.47059 0.45490 0.47294 0.47294 0.47294 0.45882 0.47529 0.47529 0.47529 0.46275 0.47765 0.47765 0.47765 0.46667 0.48000 0.48000 0.48000 0.47059 0.48235 0.48235 0.48235 0.47451 0.48471 0.48471 0.48471 0.47843 0.48706 0.48706 0.48706 0.48235 0.48941 0.48941 0.48941 0.48627 0.49176 0.49176 0.49176 0.49020 0.49412 0.49412 0.49412 0.49412 0.49647 0.49647 0.49647 0.49804 0.49882 0.49882 0.49882 0.50196 0.50118 0.50118 0.50118 0.50588 0.50353 0.50353 0.50353 0.50980 0.50588 0.50588 0.50588 0.51373 0.50824 0.50824 0.50824 0.51765 0.51059 0.51059 0.51059 0.52157 0.51294 0.51294 0.51294 0.52549 0.51529 0.51529 0.51529 0.52941 0.51765 0.51765 0.51765 0.53333 0.52000 0.52000 0.52000 0.53725 0.52235 0.52235 0.52235 0.54118 0.52471 0.52471 0.52471 0.54510 0.52706 0.52706 0.52706 0.54902 0.52941 0.52941 0.52941 0.55294 0.53176 0.53176 0.53176 0.55686 0.53412 0.53412 0.53412 0.56078 0.53647 0.53647 0.53647 0.56471 0.53882 0.53882 0.53882 0.56863 0.54118 0.54118 0.54118 0.57255 0.54353 0.54353 0.54353 0.57647 0.54588 0.54588 0.54588 0.58039 0.54824 0.54824 0.54824 0.58431 0.55059 0.55059 0.55059 0.58824 0.55294 0.55294 0.55294 0.59216 0.55529 0.55529 0.55529 0.59608 0.55765 0.55765 0.55765 0.60000 0.56000 0.56000 0.56000 0.60392 0.56235 0.56235 0.56235 0.60784 0.56471 0.56471 0.56471 0.61176 0.56706 0.56706 0.56706 0.61569 0.56941 0.56941 0.56941 0.61961 0.57176 0.57176 0.57176 0.62353 0.57412 0.57412 0.57412 0.62745 0.57647 0.57647 0.57647 0.63137 0.57882 0.57882 0.57882 0.63529 0.58118 0.58118 0.58118 0.63922 0.58353 0.58353 0.58353 0.64314 0.58588 0.58588 0.58588 0.64706 0.58824 0.58824 0.58824 0.65098 0.59059 0.59059 0.59059 0.65490 0.59294 0.59294 0.59294 0.65882 0.59529 0.59529 0.59529 0.66275 0.59765 0.59765 0.59765 0.66667 0.60000 0.60000 0.60000 0.67059 0.60235 0.60235 0.60235 0.67451 0.60471 0.60471 0.60471 0.67843 0.60706 0.60706 0.60706 0.68235 0.60941 0.60941 0.60941 0.68627 0.61176 0.61176 0.61176 0.69020 0.61412 0.61412 0.61412 0.69412 0.61647 0.61647 0.61647 0.69804 0.61882 0.61882 0.61882 0.70196 0.62118 0.62118 0.62118 0.70588 0.62353 0.62353 0.62353 0.70980 0.62588 0.62588 0.62588 0.71373 0.62824 0.62824 0.62824 0.71765 0.63059 0.63059 0.63059 0.72157 0.63294 0.63294 0.63294 0.72549 0.63529 0.63529 0.63529 0.72941 0.63765 0.63765 0.63765 0.73333 0.64000 0.64000 0.64000 0.73725 0.64235 0.64235 0.64235 0.74118 0.64471 0.64471 0.64471 0.74510 0.64706 0.64706 0.64706 0.74902 0.64941 0.64941 0.64941 0.75294 0.65176 0.65176 0.65176 0.75686 0.65412 0.65412 0.65412 0.76078 0.65647 0.65647 0.65647 0.76471 0.65882 0.65882 0.65882 0.76863 0.66118 0.66118 0.66118 0.77255 0.66353 0.66353 0.66353 0.77647 0.66588 0.66588 0.66588 0.78039 0.66824 0.66824 0.66824 0.78431 0.67059 0.67059 0.67059 0.78824 0.67294 0.67294 0.67294 0.79216 0.67529 0.67529 0.67529 0.79608 0.67765 0.67765 0.67765 0.80000 0.68000 0.68000 0.68000 0.80392 0.68235 0.68235 0.68235 0.80784 0.68471 0.68471 0.68471 0.81176 0.68706 0.68706 0.68706 0.81569 0.68941 0.68941 0.68941 0.81961 0.69176 0.69176 0.69176 0.82353 0.69412 0.69412 0.69412 0.82745 0.69647 0.69647 0.69647 0.83137 0.69882 0.69882 0.69882 0.83529 0.70118 0.70118 0.70118 0.83922 0.70353 0.70353 0.70353 0.84314 0.70588 0.70588 0.70588 0.84706 0.70824 0.70824 0.70824 0.85098 0.71059 0.71059 0.71059 0.85490 0.71294 0.71294 0.71294 0.85882 0.71529 0.71529 0.71529 0.86275 0.71765 0.71765 0.71765 0.86667 0.72000 0.72000 0.72000 0.87059 0.72235 0.72235 0.72235 0.87451 0.72471 0.72471 0.72471 0.87843 0.72706 0.72706 0.72706 0.88235 0.72941 0.72941 0.72941 0.88627 0.73176 0.73176 0.73176 0.89020 0.73412 0.73412 0.73412 0.89412 0.73647 0.73647 0.73647 0.89804 0.73882 0.73882 0.73882 0.90196 0.74118 0.74118 0.74118 0.90588 0.74353 0.74353 0.74353 0.90980 0.74588 0.74588 0.74588 0.91373 0.74824 0.74824 0.74824 0.91765 0.75059 0.75059 0.75059 0.92157 0.75294 0.75294 0.75294 0.92549 0.75529 0.75529 0.75529 0.92941 0.75765 0.75765 0.75765 0.93333 0.76000 0.76000 0.76000 0.93725 0.76235 0.76235 0.76235 0.94118 0.76471 0.76471 0.76471 0.94510 0.76706 0.76706 0.76706 0.94902 0.76941 0.76941 0.76941 0.95294 0.77176 0.77176 0.77176 0.95686 0.77412 0.77412 0.77412 0.96078 0.77647 0.77647 0.77647 0.96471 0.77882 0.77882 0.77882 0.96863 0.78118 0.78118 0.78118 0.97255 0.78353 0.78353 0.78353 0.97647 0.78588 0.78588 0.78588 0.98039 0.78824 0.78824 0.78824 0.98431 0.79059 0.79059 0.79059 0.98824 0.79294 0.79294 0.79294 0.99216 0.79529 0.79529 0.79529 0.99608 0.79765 0.79765 0.79765 1.00000 0.80000 0.80000 0.80000 END_DATA DisplayCAL-3.1.0.0/misc/ti3/office_web.ti30000644000076500000000000005560612647526532017665 0ustar devwheel00000000000000CTI3 DESCRIPTOR "Argyll Calibration Target chart information 3" ORIGINATOR "Argyll dispread" CREATED "Sat Mar 14 19:00:55 2009" KEYWORD "DEVICE_CLASS" DEVICE_CLASS "DISPLAY" KEYWORD "APPROX_WHITE_POINT" APPROX_WHITE_POINT "95.106486 100.000000 108.844025" KEYWORD "COLOR_REP" COLOR_REP "RGB_XYZ" KEYWORD "BLACK_COLOR_PATCHES" BLACK_COLOR_PATCHES "4" KEYWORD "COMP_GREY_STEPS" COMP_GREY_STEPS "49" KEYWORD "MULTI_DIM_BCC_STEPS" MULTI_DIM_BCC_STEPS "5" KEYWORD "MULTI_DIM_STEPS" MULTI_DIM_STEPS "5" KEYWORD "SINGLE_DIM_STEPS" SINGLE_DIM_STEPS "17" KEYWORD "WHITE_COLOR_PATCHES" WHITE_COLOR_PATCHES "4" KEYWORD "AUTO_OPTIMIZE" AUTO_OPTIMIZE "5" BEGIN_ARGYLL_COLPROF_ARGS -qh -aX END_ARGYLL_COLPROF_ARGS NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT SAMPLE_ID RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 271 BEGIN_DATA 1 100.000 100.000 100.000 95.1065 100.000 108.844 2 12.5000 37.5000 12.5000 5.94993 9.61866 3.74740 3 12.5000 62.5000 12.5000 14.1814 26.0794 6.49125 4 12.5000 87.5000 87.5000 40.9488 58.8934 79.2939 5 37.5000 87.5000 87.5000 45.0999 61.0337 79.4884 6 0.00000 25.0000 25.0000 3.71049 4.96568 6.38934 7 0.00000 25.0000 50.0000 6.62643 6.13187 21.7479 8 25.0000 75.0000 75.0000 30.9153 42.8005 56.4485 9 50.0000 75.0000 75.0000 37.5774 46.2355 56.7606 10 12.5000 0.00000 0.00000 1.58591 1.30210 1.02745 11 10.4167 10.4167 10.4167 2.00521 2.05749 2.15195 12 25.0000 0.00000 0.00000 3.07728 2.07105 1.09734 13 31.2500 0.00000 0.00000 4.24932 2.67536 1.15226 14 37.5000 0.00000 0.00000 5.73696 3.44239 1.22197 15 43.7500 0.00000 0.00000 7.56070 4.38272 1.30742 16 50.0000 0.00000 0.00000 9.73934 5.50603 1.40951 17 62.5000 37.5000 62.5000 25.5656 19.0418 35.8409 18 87.5000 37.5000 62.5000 41.5030 27.2592 36.5877 19 0.00000 0.00000 0.00000 1.00000 1.00000 1.00000 20 75.0000 0.00000 0.00000 22.3346 12.0002 1.99970 21 81.2500 0.00000 0.00000 26.5283 14.1625 2.19621 22 87.5000 0.00000 0.00000 31.1672 16.5543 2.41358 23 93.7500 0.00000 0.00000 36.2638 19.1821 2.65240 24 100.000 0.00000 0.00000 41.8302 22.0522 2.91323 25 62.5000 62.5000 12.5000 27.8253 33.1142 7.13058 26 75.0000 75.0000 50.0000 44.6598 50.5248 28.3139 27 8.33333 8.33333 8.33333 1.71786 1.75519 1.82265 28 0.00000 12.5000 0.00000 1.50806 2.01598 1.16935 29 0.00000 43.7500 0.00000 6.68900 12.3764 2.89635 30 0.00000 50.0000 0.00000 8.57817 16.1542 3.52608 31 0.00000 56.2500 0.00000 10.7902 20.5776 4.26342 32 0.00000 62.5000 0.00000 13.3391 25.6747 5.11306 33 12.5000 62.5000 37.5000 15.9983 26.8060 16.0610 34 0.00000 0.00000 0.00000 1.00000 1.00000 1.00000 35 0.00000 6.25000 0.00000 1.18254 1.36502 1.06085 36 0.00000 75.0000 0.00000 19.5000 37.9948 7.16671 37 0.00000 81.2500 0.00000 23.1365 45.2667 8.37888 38 0.00000 87.5000 0.00000 27.1590 53.3106 9.71972 39 0.00000 93.7500 0.00000 31.5784 62.1482 11.1929 40 0.00000 100.000 0.00000 36.4052 71.8005 12.8018 41 6.25000 6.25000 6.25000 1.48518 1.51041 1.55601 42 0.00000 0.00000 12.5000 1.25645 1.10256 2.35074 43 0.00000 0.00000 18.7500 1.52439 1.20972 3.76201 44 0.00000 0.00000 25.0000 1.90921 1.36363 5.78891 45 0.00000 0.00000 31.2500 2.42221 1.56879 8.49092 46 0.00000 0.00000 37.5000 3.07334 1.82920 11.9205 47 0.00000 0.00000 43.7500 3.87158 2.14845 16.1249 48 0.00000 0.00000 50.0000 4.82515 2.52982 21.1475 49 0.00000 0.00000 56.2500 5.94168 2.97636 27.0283 50 0.00000 0.00000 62.5000 7.22826 3.49091 33.8049 51 0.00000 0.00000 68.7500 8.69161 4.07616 41.5125 52 0.00000 0.00000 75.0000 10.3380 4.73463 50.1844 53 0.00000 0.00000 81.2500 12.1736 5.46873 59.8524 54 0.00000 0.00000 87.5000 14.2040 6.28076 70.5467 55 0.00000 0.00000 93.7500 16.4347 7.17291 82.2963 56 0.00000 0.00000 100.000 18.8711 8.14731 95.1290 57 0.00000 50.0000 100.000 26.4493 23.3015 97.6550 58 75.0000 50.0000 100.000 47.7839 34.3017 98.6547 59 0.00000 0.00000 6.25000 1.09214 1.03685 1.48530 60 2.08333 2.08333 2.08333 1.15175 1.15964 1.17390 61 4.16667 4.16667 4.16667 1.30372 1.31952 1.34806 62 12.5000 12.5000 12.5000 2.35042 2.42064 2.54755 63 14.5833 14.5833 14.5833 2.75638 2.84772 3.01278 64 16.6667 16.6667 16.6667 3.22584 3.34159 3.55077 65 18.7500 18.7500 18.7500 3.76135 3.90494 4.16445 66 20.8333 20.8333 20.8333 4.36533 4.54033 4.85660 67 22.9167 22.9167 22.9167 5.04007 5.25016 5.62984 68 25.0000 25.0000 25.0000 5.78777 6.03673 6.48668 69 27.0833 27.0833 27.0833 6.61052 6.90226 7.42953 70 29.1667 29.1667 29.1667 7.51032 7.84886 8.46069 71 31.2500 31.2500 31.2500 8.48913 8.87856 9.58238 72 6.25000 0.00000 0.00000 1.21051 1.10854 1.00986 73 33.3333 33.3333 33.3333 9.54879 9.99333 10.7967 74 35.4167 35.4167 35.4167 10.6911 11.1951 12.1058 75 39.5833 39.5833 39.5833 13.2307 13.8667 15.0161 76 41.6667 41.6667 41.6667 14.6313 15.3402 16.6212 77 43.7500 43.7500 43.7500 16.1213 16.9076 18.3287 78 45.8333 45.8333 45.8333 17.7021 18.5707 20.1403 79 47.9167 47.9167 47.9167 19.3754 20.3310 22.0579 80 50.0000 50.0000 50.0000 21.1427 22.1901 24.0831 81 52.0833 52.0833 52.0833 23.0052 24.1495 26.2175 82 54.1667 54.1667 54.1667 24.9646 26.2107 28.4629 83 56.2500 56.2500 56.2500 27.0221 28.3752 30.8208 84 58.3333 58.3333 58.3333 29.1791 30.6444 33.2927 85 60.4167 60.4167 60.4167 31.4370 33.0197 35.8802 86 62.5000 62.5000 62.5000 33.7971 35.5025 38.5847 87 64.5833 64.5833 64.5833 36.2605 38.0941 41.4078 88 66.6667 66.6667 66.6667 38.8287 40.7958 44.3509 89 68.7500 68.7500 68.7500 41.5028 43.6089 47.4154 90 70.8333 70.8333 70.8333 44.2840 46.5348 50.6026 91 72.9167 72.9167 72.9167 47.1736 49.5746 53.9140 92 75.0000 75.0000 75.0000 50.1727 52.7296 57.3508 93 77.0833 77.0833 77.0833 53.2824 56.0011 60.9145 94 79.1667 79.1667 79.1667 56.5039 59.3901 64.6063 95 81.2500 81.2500 81.2500 59.8383 62.8979 68.4275 96 83.3333 83.3333 83.3333 63.2868 66.5257 72.3793 97 85.4167 85.4167 85.4167 66.8503 70.2745 76.4631 98 87.5000 87.5000 87.5000 70.5301 74.1456 80.6800 99 89.5833 89.5833 89.5833 74.3270 78.1400 85.0312 100 91.6667 91.6667 91.6667 78.2423 82.2589 89.5180 101 93.7500 93.7500 93.7500 82.2769 86.5032 94.1415 102 95.8333 95.8333 95.8333 86.4317 90.8742 98.9029 103 97.9167 97.9167 97.9167 90.7080 95.3727 103.803 104 25.0000 25.0000 0.00000 4.87856 5.67311 1.69777 105 50.0000 25.0000 0.00000 11.5406 9.10808 2.00994 106 75.0000 25.0000 0.00000 24.1359 15.6023 2.60014 107 100.000 25.0000 0.00000 43.6314 25.6542 3.51366 108 100.000 75.0000 0.00000 60.3302 59.0470 9.07994 109 50.0000 50.0000 0.00000 17.3175 20.6603 3.93559 110 75.0000 50.0000 0.00000 29.9128 27.1544 4.52578 111 100.000 50.0000 0.00000 49.4083 37.2064 5.43931 112 100.000 100.000 100.000 95.1065 100.000 108.844 113 50.0000 75.0000 0.00000 28.2393 42.5008 7.57622 114 75.0000 75.0000 0.00000 40.8346 48.9950 8.16642 115 25.0000 75.0000 0.00000 21.5773 39.0658 7.26405 116 25.0000 100.000 0.00000 38.4825 72.8716 12.8992 117 50.0000 100.000 0.00000 45.1445 76.3065 13.2113 118 75.0000 100.000 0.00000 57.7399 82.8007 13.8015 119 100.000 100.000 0.00000 77.2354 92.8527 14.7151 120 25.0000 0.00000 25.0000 3.98649 2.43468 5.88625 121 50.0000 0.00000 25.0000 10.6485 5.86966 6.19842 122 75.0000 0.00000 25.0000 23.2439 12.3638 6.78862 123 75.0000 25.0000 25.0000 25.0451 15.9659 7.38905 124 87.5000 37.5000 37.5000 37.3481 25.5975 14.7033 125 56.2500 0.00000 0.00000 12.2903 6.82130 1.52904 126 100.000 0.00000 25.0000 42.7394 22.4158 7.70214 127 100.000 25.0000 25.0000 44.5407 26.0178 8.30257 128 100.000 25.0000 50.0000 47.4566 27.1840 23.6611 129 50.0000 25.0000 25.0000 12.4498 9.47171 6.79885 130 50.0000 50.0000 25.0000 18.2267 21.0239 8.72450 131 75.0000 50.0000 25.0000 30.8220 27.5181 9.31470 132 100.000 50.0000 25.0000 50.3176 37.5700 10.2282 133 25.0000 50.0000 25.0000 11.5647 17.5889 8.41233 134 25.0000 75.0000 25.0000 22.4865 39.4295 12.0530 135 50.0000 75.0000 25.0000 29.1485 42.8645 12.3651 136 75.0000 75.0000 25.0000 41.7438 49.3586 12.9553 137 100.000 75.0000 25.0000 61.2394 59.4106 13.8689 138 25.0000 50.0000 0.00000 10.6555 17.2253 3.62342 139 25.0000 100.000 25.0000 39.3917 73.2352 17.6881 140 50.0000 100.000 25.0000 46.0538 76.6702 18.0003 141 75.0000 100.000 25.0000 58.6491 83.1644 18.5905 142 100.000 100.000 25.0000 78.1446 93.2163 19.5040 143 25.0000 0.00000 50.0000 6.90243 3.60087 21.2448 144 50.0000 0.00000 50.0000 13.5645 7.03585 21.5570 145 75.0000 0.00000 50.0000 26.1598 13.5300 22.1472 146 100.000 0.00000 50.0000 45.6553 23.5820 23.0607 147 100.000 50.0000 75.0000 58.7464 40.9410 54.6237 148 100.000 50.0000 100.000 67.2794 44.3537 99.5683 149 50.0000 25.0000 50.0000 15.3658 10.6379 22.1574 150 75.0000 25.0000 50.0000 27.9611 17.1321 22.7476 151 100.000 25.0000 75.0000 52.9695 29.3888 52.6981 152 25.0000 25.0000 50.0000 8.70371 7.20292 21.8452 153 25.0000 50.0000 50.0000 14.4806 18.7551 23.7709 154 75.0000 50.0000 50.0000 33.7380 28.6843 24.6733 155 100.000 50.0000 50.0000 53.2335 38.7362 25.5868 156 100.000 75.0000 50.0000 64.1553 60.5768 29.2274 157 87.5000 62.5000 62.5000 49.7345 43.7199 39.3315 158 87.5000 87.5000 62.5000 63.5544 71.3558 43.9382 159 100.000 100.000 75.0000 86.5734 96.5873 63.8995 160 0.00000 68.7500 0.00000 16.2382 31.4721 6.07943 161 0.00000 100.000 25.0000 37.3144 72.1641 17.5907 162 0.00000 100.000 50.0000 40.2304 73.3303 32.9493 163 50.0000 100.000 50.0000 48.9697 77.8364 33.3588 164 75.0000 100.000 50.0000 61.5650 84.3305 33.9490 165 100.000 100.000 50.0000 81.0605 94.3825 34.8625 166 25.0000 0.00000 75.0000 12.4153 5.80568 50.2817 167 50.0000 0.00000 75.0000 19.0774 9.24066 50.5939 168 75.0000 0.00000 75.0000 31.6727 15.7348 51.1841 169 100.000 0.00000 75.0000 51.1682 25.7868 52.0976 170 100.000 0.00000 100.000 59.7013 29.1995 97.0422 171 25.0000 25.0000 75.0000 14.2166 9.40773 50.8822 172 50.0000 25.0000 75.0000 20.8787 12.8427 51.1944 173 75.0000 25.0000 75.0000 33.4740 19.3369 51.7845 174 0.00000 31.2500 0.00000 3.81760 6.63441 1.93921 175 0.00000 37.5000 0.00000 5.10758 9.21400 2.36920 176 25.0000 50.0000 75.0000 19.9935 20.9599 52.8078 177 50.0000 50.0000 75.0000 26.6555 24.3949 53.1200 178 75.0000 50.0000 75.0000 39.2509 30.8891 53.7102 179 100.000 75.0000 75.0000 69.6682 62.7816 58.2644 180 100.000 75.0000 100.000 78.2013 66.1943 103.209 181 0.00000 0.00000 0.00000 1.00000 1.00000 1.00000 182 12.5000 37.5000 37.5000 7.76682 10.3453 13.3171 183 25.0000 75.0000 50.0000 25.4024 40.5957 27.4115 184 25.0000 100.000 50.0000 42.3076 74.4014 33.0466 185 25.0000 100.000 75.0000 47.8205 76.6062 62.0836 186 50.0000 100.000 75.0000 54.4826 80.0412 62.3958 187 75.0000 100.000 75.0000 67.0779 86.5354 62.9859 188 100.000 100.000 100.000 95.1065 100.000 108.844 189 25.0000 0.00000 100.000 20.9484 9.21837 95.2263 190 50.0000 0.00000 100.000 27.6104 12.6533 95.5385 191 75.0000 0.00000 100.000 40.2058 19.1475 96.1287 192 75.0000 75.0000 100.000 58.7057 56.1423 102.295 193 0.00000 25.0000 100.000 20.6724 11.7494 95.7294 194 25.0000 25.0000 100.000 22.7497 12.8204 95.8267 195 50.0000 25.0000 100.000 29.4117 16.2554 96.1389 196 75.0000 25.0000 100.000 42.0070 22.7496 96.7291 197 100.000 25.0000 100.000 61.5026 32.8015 97.6426 198 0.00000 0.00000 0.00000 1.00000 1.00000 1.00000 199 25.0000 50.0000 100.000 28.5266 24.3726 97.7524 200 50.0000 50.0000 100.000 35.1886 27.8076 98.0645 201 50.0000 75.0000 100.000 46.1104 49.6481 101.705 202 12.5000 62.5000 62.5000 20.1532 28.4677 37.9454 203 12.5000 62.5000 87.5000 27.1290 31.2576 74.6872 204 25.0000 75.0000 100.000 39.4484 46.2132 101.393 205 0.00000 50.0000 50.0000 12.4033 17.6840 23.6735 206 0.00000 75.0000 75.0000 28.8380 41.7294 56.3511 207 0.00000 100.000 75.0000 45.7432 75.5351 61.9862 208 0.00000 100.000 100.000 54.2763 78.9478 106.931 209 25.0000 100.000 100.000 56.3536 80.0189 107.028 210 50.0000 100.000 100.000 63.0157 83.4539 107.340 211 75.0000 100.000 100.000 75.6110 89.9480 107.930 212 62.5000 0.00000 0.00000 15.2297 8.33690 1.66678 213 68.7500 0.00000 0.00000 18.5730 10.0607 1.82344 214 100.000 100.000 100.000 95.1065 100.000 108.844 215 0.00000 25.0000 0.00000 2.80128 4.60205 1.60043 216 37.5000 37.5000 12.5000 10.1010 11.7590 3.94191 217 62.5000 37.5000 12.5000 19.5938 16.6535 4.38672 218 87.5000 37.5000 12.5000 35.5312 24.8708 5.13352 219 37.5000 12.5000 12.5000 6.50147 4.56093 2.74206 220 62.5000 12.5000 12.5000 15.9942 9.45544 3.18687 221 87.5000 12.5000 12.5000 31.9317 17.6728 3.93367 222 87.5000 62.5000 12.5000 43.7627 41.3315 7.87738 223 37.5000 62.5000 12.5000 18.3325 28.2197 6.68576 224 37.5000 87.5000 12.5000 32.1524 55.8555 11.2924 225 62.5000 87.5000 12.5000 41.6451 60.7500 11.7372 226 87.5000 87.5000 12.5000 57.5826 68.9674 12.4840 227 12.5000 12.5000 37.5000 4.16730 3.14728 12.1173 228 37.5000 12.5000 37.5000 8.31836 5.28757 12.3118 229 62.5000 12.5000 37.5000 17.8111 10.1821 12.7566 230 87.5000 12.5000 37.5000 33.7486 18.3995 13.5034 231 87.5000 62.5000 37.5000 45.5796 42.0582 17.4471 232 62.5000 37.5000 37.5000 21.4106 17.3801 13.9565 233 62.5000 62.5000 37.5000 29.6421 33.8408 16.7003 234 37.5000 37.5000 37.5000 11.9179 12.4856 13.5116 235 37.5000 62.5000 37.5000 20.1494 28.9463 16.2555 236 50.0000 75.0000 50.0000 32.0645 44.0306 27.7237 237 12.5000 87.5000 12.5000 28.0013 53.7152 11.0979 238 12.5000 87.5000 37.5000 29.8182 54.4419 20.6677 239 37.5000 87.5000 37.5000 33.9692 56.5822 20.8622 240 62.5000 87.5000 37.5000 43.4620 61.4767 21.3070 241 87.5000 87.5000 37.5000 59.3994 69.6941 22.0538 242 18.7500 0.00000 0.00000 2.19807 1.61773 1.05614 243 37.5000 12.5000 62.5000 12.4733 6.94928 34.1962 244 62.5000 12.5000 62.5000 21.9661 11.8438 34.6410 245 87.5000 12.5000 62.5000 37.9035 20.0612 35.3878 246 87.5000 12.5000 87.5000 44.8792 22.8510 72.1296 247 87.5000 37.5000 87.5000 48.4787 30.0490 73.3295 248 87.5000 62.5000 87.5000 56.7102 46.5097 76.0733 249 0.00000 18.7500 0.00000 2.03889 3.07749 1.34630 250 0.00000 50.0000 25.0000 9.48738 16.5179 8.31499 251 0.00000 75.0000 25.0000 20.4092 38.3584 11.9556 252 0.00000 75.0000 50.0000 23.3251 39.5246 27.3142 253 12.5000 87.5000 62.5000 33.9731 56.1036 42.5521 254 37.5000 87.5000 62.5000 38.1242 58.2439 42.7466 255 62.5000 87.5000 62.5000 47.6169 63.1384 43.1914 256 12.5000 12.5000 62.5000 8.32223 4.80899 34.0017 257 12.5000 12.5000 87.5000 15.2979 7.59883 70.7435 258 37.5000 12.5000 87.5000 19.4490 9.73913 70.9380 259 62.5000 12.5000 87.5000 28.9418 14.6336 71.3828 260 12.5000 37.5000 62.5000 11.9217 12.0070 35.2016 261 12.5000 37.5000 87.5000 18.8975 14.7969 71.9433 262 37.5000 37.5000 87.5000 23.0485 16.9371 72.1379 263 62.5000 37.5000 87.5000 32.5413 21.8317 72.5827 264 37.5000 37.5000 62.5000 16.0728 14.1473 35.3961 265 37.5000 62.5000 62.5000 24.3043 30.6080 38.1399 266 37.5000 62.5000 87.5000 31.2800 33.3978 74.8817 267 62.5000 62.5000 87.5000 40.7728 38.2924 75.3265 268 62.5000 87.5000 87.5000 54.5927 65.9282 79.9332 269 0.00000 25.0000 75.0000 12.1393 8.33668 50.7848 270 0.00000 50.0000 75.0000 17.9162 19.8888 52.7105 271 0.00000 75.0000 100.000 37.3711 45.1421 101.296 END_DATA CAL DESCRIPTOR "Argyll Device Calibration State" ORIGINATOR "Argyll dispcal" CREATED "Sat Mar 14 19:07:36 2009" KEYWORD "DEVICE_CLASS" DEVICE_CLASS "DISPLAY" KEYWORD "COLOR_REP" COLOR_REP "RGB" BEGIN_ARGYLL_DISPCAL_ARGS -ql -t6500 -g2.2 -f1 -k0 END_ARGYLL_DISPCAL_ARGS KEYWORD "RGB_I" NUMBER_OF_FIELDS 4 BEGIN_DATA_FORMAT RGB_I RGB_R RGB_G RGB_B END_DATA_FORMAT NUMBER_OF_SETS 256 BEGIN_DATA 0.00000 0.00000 0.00000 0.00000 0.00392 0.00392 0.00392 0.00392 0.00784 0.00784 0.00784 0.00784 0.01176 0.01176 0.01176 0.01176 0.01569 0.01569 0.01569 0.01569 0.01961 0.01961 0.01961 0.01961 0.02353 0.02353 0.02353 0.02353 0.02745 0.02745 0.02745 0.02745 0.03137 0.03137 0.03137 0.03137 0.03529 0.03529 0.03529 0.03529 0.03922 0.03922 0.03922 0.03922 0.04314 0.04314 0.04314 0.04314 0.04706 0.04706 0.04706 0.04706 0.05098 0.05098 0.05098 0.05098 0.05490 0.05490 0.05490 0.05490 0.05882 0.05882 0.05882 0.05882 0.06275 0.06275 0.06275 0.06275 0.06667 0.06667 0.06667 0.06667 0.07059 0.07059 0.07059 0.07059 0.07451 0.07451 0.07451 0.07451 0.07843 0.07843 0.07843 0.07843 0.08235 0.08235 0.08235 0.08235 0.08627 0.08627 0.08627 0.08627 0.09020 0.09020 0.09020 0.09020 0.09412 0.09412 0.09412 0.09412 0.09804 0.09804 0.09804 0.09804 0.10196 0.10196 0.10196 0.10196 0.10588 0.10588 0.10588 0.10588 0.10980 0.10980 0.10980 0.10980 0.11373 0.11373 0.11373 0.11373 0.11765 0.11765 0.11765 0.11765 0.12157 0.12157 0.12157 0.12157 0.12549 0.12549 0.12549 0.12549 0.12941 0.12941 0.12941 0.12941 0.13333 0.13333 0.13333 0.13333 0.13725 0.13725 0.13725 0.13725 0.14118 0.14118 0.14118 0.14118 0.14510 0.14510 0.14510 0.14510 0.14902 0.14902 0.14902 0.14902 0.15294 0.15294 0.15294 0.15294 0.15686 0.15686 0.15686 0.15686 0.16078 0.16078 0.16078 0.16078 0.16471 0.16471 0.16471 0.16471 0.16863 0.16863 0.16863 0.16863 0.17255 0.17255 0.17255 0.17255 0.17647 0.17647 0.17647 0.17647 0.18039 0.18039 0.18039 0.18039 0.18431 0.18431 0.18431 0.18431 0.18824 0.18824 0.18824 0.18824 0.19216 0.19216 0.19216 0.19216 0.19608 0.19608 0.19608 0.19608 0.20000 0.20000 0.20000 0.20000 0.20392 0.20392 0.20392 0.20392 0.20784 0.20784 0.20784 0.20784 0.21176 0.21176 0.21176 0.21176 0.21569 0.21569 0.21569 0.21569 0.21961 0.21961 0.21961 0.21961 0.22353 0.22353 0.22353 0.22353 0.22745 0.22745 0.22745 0.22745 0.23137 0.23137 0.23137 0.23137 0.23529 0.23529 0.23529 0.23529 0.23922 0.23922 0.23922 0.23922 0.24314 0.24314 0.24314 0.24314 0.24706 0.24706 0.24706 0.24706 0.25098 0.25098 0.25098 0.25098 0.25490 0.25490 0.25490 0.25490 0.25882 0.25882 0.25882 0.25882 0.26275 0.26275 0.26275 0.26275 0.26667 0.26667 0.26667 0.26667 0.27059 0.27059 0.27059 0.27059 0.27451 0.27451 0.27451 0.27451 0.27843 0.27843 0.27843 0.27843 0.28235 0.28235 0.28235 0.28235 0.28627 0.28627 0.28627 0.28627 0.29020 0.29020 0.29020 0.29020 0.29412 0.29412 0.29412 0.29412 0.29804 0.29804 0.29804 0.29804 0.30196 0.30196 0.30196 0.30196 0.30588 0.30588 0.30588 0.30588 0.30980 0.30980 0.30980 0.30980 0.31373 0.31373 0.31373 0.31373 0.31765 0.31765 0.31765 0.31765 0.32157 0.32157 0.32157 0.32157 0.32549 0.32549 0.32549 0.32549 0.32941 0.32941 0.32941 0.32941 0.33333 0.33333 0.33333 0.33333 0.33725 0.33725 0.33725 0.33725 0.34118 0.34118 0.34118 0.34118 0.34510 0.34510 0.34510 0.34510 0.34902 0.34902 0.34902 0.34902 0.35294 0.35294 0.35294 0.35294 0.35686 0.35686 0.35686 0.35686 0.36078 0.36078 0.36078 0.36078 0.36471 0.36471 0.36471 0.36471 0.36863 0.36863 0.36863 0.36863 0.37255 0.37255 0.37255 0.37255 0.37647 0.37647 0.37647 0.37647 0.38039 0.38039 0.38039 0.38039 0.38431 0.38431 0.38431 0.38431 0.38824 0.38824 0.38824 0.38824 0.39216 0.39216 0.39216 0.39216 0.39608 0.39608 0.39608 0.39608 0.40000 0.40000 0.40000 0.40000 0.40392 0.40392 0.40392 0.40392 0.40784 0.40784 0.40784 0.40784 0.41176 0.41176 0.41176 0.41176 0.41569 0.41569 0.41569 0.41569 0.41961 0.41961 0.41961 0.41961 0.42353 0.42353 0.42353 0.42353 0.42745 0.42745 0.42745 0.42745 0.43137 0.43137 0.43137 0.43137 0.43529 0.43529 0.43529 0.43529 0.43922 0.43922 0.43922 0.43922 0.44314 0.44314 0.44314 0.44314 0.44706 0.44706 0.44706 0.44706 0.45098 0.45098 0.45098 0.45098 0.45490 0.45490 0.45490 0.45490 0.45882 0.45882 0.45882 0.45882 0.46275 0.46275 0.46275 0.46275 0.46667 0.46667 0.46667 0.46667 0.47059 0.47059 0.47059 0.47059 0.47451 0.47451 0.47451 0.47451 0.47843 0.47843 0.47843 0.47843 0.48235 0.48235 0.48235 0.48235 0.48627 0.48627 0.48627 0.48627 0.49020 0.49020 0.49020 0.49020 0.49412 0.49412 0.49412 0.49412 0.49804 0.49804 0.49804 0.49804 0.50196 0.50196 0.50196 0.50196 0.50588 0.50588 0.50588 0.50588 0.50980 0.50980 0.50980 0.50980 0.51373 0.51373 0.51373 0.51373 0.51765 0.51765 0.51765 0.51765 0.52157 0.52157 0.52157 0.52157 0.52549 0.52549 0.52549 0.52549 0.52941 0.52941 0.52941 0.52941 0.53333 0.53333 0.53333 0.53333 0.53725 0.53725 0.53725 0.53725 0.54118 0.54118 0.54118 0.54118 0.54510 0.54510 0.54510 0.54510 0.54902 0.54902 0.54902 0.54902 0.55294 0.55294 0.55294 0.55294 0.55686 0.55686 0.55686 0.55686 0.56078 0.56078 0.56078 0.56078 0.56471 0.56471 0.56471 0.56471 0.56863 0.56863 0.56863 0.56863 0.57255 0.57255 0.57255 0.57255 0.57647 0.57647 0.57647 0.57647 0.58039 0.58039 0.58039 0.58039 0.58431 0.58431 0.58431 0.58431 0.58824 0.58824 0.58824 0.58824 0.59216 0.59216 0.59216 0.59216 0.59608 0.59608 0.59608 0.59608 0.60000 0.60000 0.60000 0.60000 0.60392 0.60392 0.60392 0.60392 0.60784 0.60784 0.60784 0.60784 0.61176 0.61176 0.61176 0.61176 0.61569 0.61569 0.61569 0.61569 0.61961 0.61961 0.61961 0.61961 0.62353 0.62353 0.62353 0.62353 0.62745 0.62745 0.62745 0.62745 0.63137 0.63137 0.63137 0.63137 0.63529 0.63529 0.63529 0.63529 0.63922 0.63922 0.63922 0.63922 0.64314 0.64314 0.64314 0.64314 0.64706 0.64706 0.64706 0.64706 0.65098 0.65098 0.65098 0.65098 0.65490 0.65490 0.65490 0.65490 0.65882 0.65882 0.65882 0.65882 0.66275 0.66275 0.66275 0.66275 0.66667 0.66667 0.66667 0.66667 0.67059 0.67059 0.67059 0.67059 0.67451 0.67451 0.67451 0.67451 0.67843 0.67843 0.67843 0.67843 0.68235 0.68235 0.68235 0.68235 0.68627 0.68627 0.68627 0.68627 0.69020 0.69020 0.69020 0.69020 0.69412 0.69412 0.69412 0.69412 0.69804 0.69804 0.69804 0.69804 0.70196 0.70196 0.70196 0.70196 0.70588 0.70588 0.70588 0.70588 0.70980 0.70980 0.70980 0.70980 0.71373 0.71373 0.71373 0.71373 0.71765 0.71765 0.71765 0.71765 0.72157 0.72157 0.72157 0.72157 0.72549 0.72549 0.72549 0.72549 0.72941 0.72941 0.72941 0.72941 0.73333 0.73333 0.73333 0.73333 0.73725 0.73725 0.73725 0.73725 0.74118 0.74118 0.74118 0.74118 0.74510 0.74510 0.74510 0.74510 0.74902 0.74902 0.74902 0.74902 0.75294 0.75294 0.75294 0.75294 0.75686 0.75686 0.75686 0.75686 0.76078 0.76078 0.76078 0.76078 0.76471 0.76471 0.76471 0.76471 0.76863 0.76863 0.76863 0.76863 0.77255 0.77255 0.77255 0.77255 0.77647 0.77647 0.77647 0.77647 0.78039 0.78039 0.78039 0.78039 0.78431 0.78431 0.78431 0.78431 0.78824 0.78824 0.78824 0.78824 0.79216 0.79216 0.79216 0.79216 0.79608 0.79608 0.79608 0.79608 0.80000 0.80000 0.80000 0.80000 0.80392 0.80392 0.80392 0.80392 0.80784 0.80784 0.80784 0.80784 0.81176 0.81176 0.81176 0.81176 0.81569 0.81569 0.81569 0.81569 0.81961 0.81961 0.81961 0.81961 0.82353 0.82353 0.82353 0.82353 0.82745 0.82745 0.82745 0.82745 0.83137 0.83137 0.83137 0.83137 0.83529 0.83529 0.83529 0.83529 0.83922 0.83922 0.83922 0.83922 0.84314 0.84314 0.84314 0.84314 0.84706 0.84706 0.84706 0.84706 0.85098 0.85098 0.85098 0.85098 0.85490 0.85490 0.85490 0.85490 0.85882 0.85882 0.85882 0.85882 0.86275 0.86275 0.86275 0.86275 0.86667 0.86667 0.86667 0.86667 0.87059 0.87059 0.87059 0.87059 0.87451 0.87451 0.87451 0.87451 0.87843 0.87843 0.87843 0.87843 0.88235 0.88235 0.88235 0.88235 0.88627 0.88627 0.88627 0.88627 0.89020 0.89020 0.89020 0.89020 0.89412 0.89412 0.89412 0.89412 0.89804 0.89804 0.89804 0.89804 0.90196 0.90196 0.90196 0.90196 0.90588 0.90588 0.90588 0.90588 0.90980 0.90980 0.90980 0.90980 0.91373 0.91373 0.91373 0.91373 0.91765 0.91765 0.91765 0.91765 0.92157 0.92157 0.92157 0.92157 0.92549 0.92549 0.92549 0.92549 0.92941 0.92941 0.92941 0.92941 0.93333 0.93333 0.93333 0.93333 0.93725 0.93725 0.93725 0.93725 0.94118 0.94118 0.94118 0.94118 0.94510 0.94510 0.94510 0.94510 0.94902 0.94902 0.94902 0.94902 0.95294 0.95294 0.95294 0.95294 0.95686 0.95686 0.95686 0.95686 0.96078 0.96078 0.96078 0.96078 0.96471 0.96471 0.96471 0.96471 0.96863 0.96863 0.96863 0.96863 0.97255 0.97255 0.97255 0.97255 0.97647 0.97647 0.97647 0.97647 0.98039 0.98039 0.98039 0.98039 0.98431 0.98431 0.98431 0.98431 0.98824 0.98824 0.98824 0.98824 0.99216 0.99216 0.99216 0.99216 0.99608 0.99608 0.99608 0.99608 1.00000 1.00000 1.00000 1.00000 END_DATA DisplayCAL-3.1.0.0/misc/ti3/photo.ti30000644000076500000000000005560612647526532016726 0ustar devwheel00000000000000CTI3 DESCRIPTOR "Argyll Calibration Target chart information 3" ORIGINATOR "Argyll dispread" CREATED "Tue Feb 23 08:46:43 2010" KEYWORD "DEVICE_CLASS" DEVICE_CLASS "DISPLAY" KEYWORD "APPROX_WHITE_POINT" APPROX_WHITE_POINT "95.106486 100.000000 108.844025" KEYWORD "COLOR_REP" COLOR_REP "RGB_XYZ" KEYWORD "BLACK_COLOR_PATCHES" BLACK_COLOR_PATCHES "4" KEYWORD "COMP_GREY_STEPS" COMP_GREY_STEPS "49" KEYWORD "MULTI_DIM_BCC_STEPS" MULTI_DIM_BCC_STEPS "5" KEYWORD "MULTI_DIM_STEPS" MULTI_DIM_STEPS "5" KEYWORD "SINGLE_DIM_STEPS" SINGLE_DIM_STEPS "17" KEYWORD "WHITE_COLOR_PATCHES" WHITE_COLOR_PATCHES "4" KEYWORD "AUTO_OPTIMIZE" AUTO_OPTIMIZE "6" BEGIN_ARGYLL_COLPROF_ARGS -qh -aX END_ARGYLL_COLPROF_ARGS NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT SAMPLE_ID RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 271 BEGIN_DATA 1 100.000 100.000 100.000 95.1065 100.000 108.844 2 12.5000 37.5000 12.5000 5.94993 9.61866 3.74740 3 12.5000 62.5000 12.5000 14.1814 26.0794 6.49125 4 12.5000 87.5000 87.5000 40.9488 58.8934 79.2939 5 37.5000 87.5000 87.5000 45.0999 61.0337 79.4884 6 0.00000 25.0000 25.0000 3.71049 4.96568 6.38934 7 0.00000 25.0000 50.0000 6.62643 6.13187 21.7479 8 25.0000 75.0000 75.0000 30.9153 42.8005 56.4485 9 50.0000 75.0000 75.0000 37.5774 46.2355 56.7606 10 12.5000 0.00000 0.00000 1.58591 1.30210 1.02745 11 10.4167 10.4167 10.4167 2.00521 2.05749 2.15195 12 25.0000 0.00000 0.00000 3.07728 2.07105 1.09734 13 31.2500 0.00000 0.00000 4.24932 2.67536 1.15226 14 37.5000 0.00000 0.00000 5.73696 3.44239 1.22197 15 43.7500 0.00000 0.00000 7.56070 4.38272 1.30742 16 50.0000 0.00000 0.00000 9.73934 5.50603 1.40951 17 62.5000 37.5000 62.5000 25.5656 19.0418 35.8409 18 87.5000 37.5000 62.5000 41.5030 27.2592 36.5877 19 0.00000 0.00000 0.00000 1.00000 1.00000 1.00000 20 75.0000 0.00000 0.00000 22.3346 12.0002 1.99970 21 81.2500 0.00000 0.00000 26.5283 14.1625 2.19621 22 87.5000 0.00000 0.00000 31.1672 16.5543 2.41358 23 93.7500 0.00000 0.00000 36.2638 19.1821 2.65240 24 100.000 0.00000 0.00000 41.8302 22.0522 2.91323 25 62.5000 62.5000 12.5000 27.8253 33.1142 7.13058 26 75.0000 75.0000 50.0000 44.6598 50.5248 28.3139 27 8.33333 8.33333 8.33333 1.71786 1.75519 1.82265 28 0.00000 12.5000 0.00000 1.50806 2.01598 1.16935 29 0.00000 43.7500 0.00000 6.68900 12.3764 2.89635 30 0.00000 50.0000 0.00000 8.57817 16.1542 3.52608 31 0.00000 56.2500 0.00000 10.7902 20.5776 4.26342 32 0.00000 62.5000 0.00000 13.3391 25.6747 5.11306 33 12.5000 62.5000 37.5000 15.9983 26.8060 16.0610 34 0.00000 0.00000 0.00000 1.00000 1.00000 1.00000 35 0.00000 6.25000 0.00000 1.18254 1.36502 1.06085 36 0.00000 75.0000 0.00000 19.5000 37.9948 7.16671 37 0.00000 81.2500 0.00000 23.1365 45.2667 8.37888 38 0.00000 87.5000 0.00000 27.1590 53.3106 9.71972 39 0.00000 93.7500 0.00000 31.5784 62.1482 11.1929 40 0.00000 100.000 0.00000 36.4052 71.8005 12.8018 41 6.25000 6.25000 6.25000 1.48518 1.51041 1.55601 42 0.00000 0.00000 12.5000 1.25645 1.10256 2.35074 43 0.00000 0.00000 18.7500 1.52439 1.20972 3.76201 44 0.00000 0.00000 25.0000 1.90921 1.36363 5.78891 45 0.00000 0.00000 31.2500 2.42221 1.56879 8.49092 46 0.00000 0.00000 37.5000 3.07334 1.82920 11.9205 47 0.00000 0.00000 43.7500 3.87158 2.14845 16.1249 48 0.00000 0.00000 50.0000 4.82515 2.52982 21.1475 49 0.00000 0.00000 56.2500 5.94168 2.97636 27.0283 50 0.00000 0.00000 62.5000 7.22826 3.49091 33.8049 51 0.00000 0.00000 68.7500 8.69161 4.07616 41.5125 52 0.00000 0.00000 75.0000 10.3380 4.73463 50.1844 53 0.00000 0.00000 81.2500 12.1736 5.46873 59.8524 54 0.00000 0.00000 87.5000 14.2040 6.28076 70.5467 55 0.00000 0.00000 93.7500 16.4347 7.17291 82.2963 56 0.00000 0.00000 100.000 18.8711 8.14731 95.1290 57 0.00000 50.0000 100.000 26.4493 23.3015 97.6550 58 75.0000 50.0000 100.000 47.7839 34.3017 98.6547 59 0.00000 0.00000 6.25000 1.09214 1.03685 1.48530 60 2.08333 2.08333 2.08333 1.15175 1.15964 1.17390 61 4.16667 4.16667 4.16667 1.30372 1.31952 1.34806 62 12.5000 12.5000 12.5000 2.35042 2.42064 2.54755 63 14.5833 14.5833 14.5833 2.75638 2.84772 3.01278 64 16.6667 16.6667 16.6667 3.22584 3.34159 3.55077 65 18.7500 18.7500 18.7500 3.76135 3.90494 4.16445 66 20.8333 20.8333 20.8333 4.36533 4.54033 4.85660 67 22.9167 22.9167 22.9167 5.04007 5.25016 5.62984 68 25.0000 25.0000 25.0000 5.78777 6.03673 6.48668 69 27.0833 27.0833 27.0833 6.61052 6.90226 7.42953 70 29.1667 29.1667 29.1667 7.51032 7.84886 8.46069 71 31.2500 31.2500 31.2500 8.48913 8.87856 9.58238 72 6.25000 0.00000 0.00000 1.21051 1.10854 1.00986 73 33.3333 33.3333 33.3333 9.54879 9.99333 10.7967 74 35.4167 35.4167 35.4167 10.6911 11.1951 12.1058 75 39.5833 39.5833 39.5833 13.2307 13.8667 15.0161 76 41.6667 41.6667 41.6667 14.6313 15.3402 16.6212 77 43.7500 43.7500 43.7500 16.1213 16.9076 18.3287 78 45.8333 45.8333 45.8333 17.7021 18.5707 20.1403 79 47.9167 47.9167 47.9167 19.3754 20.3310 22.0579 80 50.0000 50.0000 50.0000 21.1427 22.1901 24.0831 81 52.0833 52.0833 52.0833 23.0052 24.1495 26.2175 82 54.1667 54.1667 54.1667 24.9646 26.2107 28.4629 83 56.2500 56.2500 56.2500 27.0221 28.3752 30.8208 84 58.3333 58.3333 58.3333 29.1791 30.6444 33.2927 85 60.4167 60.4167 60.4167 31.4370 33.0197 35.8802 86 62.5000 62.5000 62.5000 33.7971 35.5025 38.5847 87 64.5833 64.5833 64.5833 36.2605 38.0941 41.4078 88 66.6667 66.6667 66.6667 38.8287 40.7958 44.3509 89 68.7500 68.7500 68.7500 41.5028 43.6089 47.4154 90 70.8333 70.8333 70.8333 44.2840 46.5348 50.6026 91 72.9167 72.9167 72.9167 47.1736 49.5746 53.9140 92 75.0000 75.0000 75.0000 50.1727 52.7296 57.3508 93 77.0833 77.0833 77.0833 53.2824 56.0011 60.9145 94 79.1667 79.1667 79.1667 56.5039 59.3901 64.6063 95 81.2500 81.2500 81.2500 59.8383 62.8979 68.4275 96 83.3333 83.3333 83.3333 63.2868 66.5257 72.3793 97 85.4167 85.4167 85.4167 66.8503 70.2745 76.4631 98 87.5000 87.5000 87.5000 70.5301 74.1456 80.6800 99 89.5833 89.5833 89.5833 74.3270 78.1400 85.0312 100 91.6667 91.6667 91.6667 78.2423 82.2589 89.5180 101 93.7500 93.7500 93.7500 82.2769 86.5032 94.1415 102 95.8333 95.8333 95.8333 86.4317 90.8742 98.9029 103 97.9167 97.9167 97.9167 90.7080 95.3727 103.803 104 25.0000 25.0000 0.00000 4.87856 5.67311 1.69777 105 50.0000 25.0000 0.00000 11.5406 9.10808 2.00994 106 75.0000 25.0000 0.00000 24.1359 15.6023 2.60014 107 100.000 25.0000 0.00000 43.6314 25.6542 3.51366 108 100.000 75.0000 0.00000 60.3302 59.0470 9.07994 109 50.0000 50.0000 0.00000 17.3175 20.6603 3.93559 110 75.0000 50.0000 0.00000 29.9128 27.1544 4.52578 111 100.000 50.0000 0.00000 49.4083 37.2064 5.43931 112 100.000 100.000 100.000 95.1065 100.000 108.844 113 50.0000 75.0000 0.00000 28.2393 42.5008 7.57622 114 75.0000 75.0000 0.00000 40.8346 48.9950 8.16642 115 25.0000 75.0000 0.00000 21.5773 39.0658 7.26405 116 25.0000 100.000 0.00000 38.4825 72.8716 12.8992 117 50.0000 100.000 0.00000 45.1445 76.3065 13.2113 118 75.0000 100.000 0.00000 57.7399 82.8007 13.8015 119 100.000 100.000 0.00000 77.2354 92.8527 14.7151 120 25.0000 0.00000 25.0000 3.98649 2.43468 5.88625 121 50.0000 0.00000 25.0000 10.6485 5.86966 6.19842 122 75.0000 0.00000 25.0000 23.2439 12.3638 6.78862 123 75.0000 25.0000 25.0000 25.0451 15.9659 7.38905 124 87.5000 37.5000 37.5000 37.3481 25.5975 14.7033 125 56.2500 0.00000 0.00000 12.2903 6.82130 1.52904 126 100.000 0.00000 25.0000 42.7394 22.4158 7.70214 127 100.000 25.0000 25.0000 44.5407 26.0178 8.30257 128 100.000 25.0000 50.0000 47.4566 27.1840 23.6611 129 50.0000 25.0000 25.0000 12.4498 9.47171 6.79885 130 50.0000 50.0000 25.0000 18.2267 21.0239 8.72450 131 75.0000 50.0000 25.0000 30.8220 27.5181 9.31470 132 100.000 50.0000 25.0000 50.3176 37.5700 10.2282 133 25.0000 50.0000 25.0000 11.5647 17.5889 8.41233 134 25.0000 75.0000 25.0000 22.4865 39.4295 12.0530 135 50.0000 75.0000 25.0000 29.1485 42.8645 12.3651 136 75.0000 75.0000 25.0000 41.7438 49.3586 12.9553 137 100.000 75.0000 25.0000 61.2394 59.4106 13.8689 138 25.0000 50.0000 0.00000 10.6555 17.2253 3.62342 139 25.0000 100.000 25.0000 39.3917 73.2352 17.6881 140 50.0000 100.000 25.0000 46.0538 76.6702 18.0003 141 75.0000 100.000 25.0000 58.6491 83.1644 18.5905 142 100.000 100.000 25.0000 78.1446 93.2163 19.5040 143 25.0000 0.00000 50.0000 6.90243 3.60087 21.2448 144 50.0000 0.00000 50.0000 13.5645 7.03585 21.5570 145 75.0000 0.00000 50.0000 26.1598 13.5300 22.1472 146 100.000 0.00000 50.0000 45.6553 23.5820 23.0607 147 100.000 50.0000 75.0000 58.7464 40.9410 54.6237 148 100.000 50.0000 100.000 67.2794 44.3537 99.5683 149 50.0000 25.0000 50.0000 15.3658 10.6379 22.1574 150 75.0000 25.0000 50.0000 27.9611 17.1321 22.7476 151 100.000 25.0000 75.0000 52.9695 29.3888 52.6981 152 25.0000 25.0000 50.0000 8.70371 7.20292 21.8452 153 25.0000 50.0000 50.0000 14.4806 18.7551 23.7709 154 75.0000 50.0000 50.0000 33.7380 28.6843 24.6733 155 100.000 50.0000 50.0000 53.2335 38.7362 25.5868 156 100.000 75.0000 50.0000 64.1553 60.5768 29.2274 157 87.5000 62.5000 62.5000 49.7345 43.7199 39.3315 158 87.5000 87.5000 62.5000 63.5544 71.3558 43.9382 159 100.000 100.000 75.0000 86.5734 96.5873 63.8995 160 0.00000 68.7500 0.00000 16.2382 31.4721 6.07943 161 0.00000 100.000 25.0000 37.3144 72.1641 17.5907 162 0.00000 100.000 50.0000 40.2304 73.3303 32.9493 163 50.0000 100.000 50.0000 48.9697 77.8364 33.3588 164 75.0000 100.000 50.0000 61.5650 84.3305 33.9490 165 100.000 100.000 50.0000 81.0605 94.3825 34.8625 166 25.0000 0.00000 75.0000 12.4153 5.80568 50.2817 167 50.0000 0.00000 75.0000 19.0774 9.24066 50.5939 168 75.0000 0.00000 75.0000 31.6727 15.7348 51.1841 169 100.000 0.00000 75.0000 51.1682 25.7868 52.0976 170 100.000 0.00000 100.000 59.7013 29.1995 97.0422 171 25.0000 25.0000 75.0000 14.2166 9.40773 50.8822 172 50.0000 25.0000 75.0000 20.8787 12.8427 51.1944 173 75.0000 25.0000 75.0000 33.4740 19.3369 51.7845 174 0.00000 31.2500 0.00000 3.81760 6.63441 1.93921 175 0.00000 37.5000 0.00000 5.10758 9.21400 2.36920 176 25.0000 50.0000 75.0000 19.9935 20.9599 52.8078 177 50.0000 50.0000 75.0000 26.6555 24.3949 53.1200 178 75.0000 50.0000 75.0000 39.2509 30.8891 53.7102 179 100.000 75.0000 75.0000 69.6682 62.7816 58.2644 180 100.000 75.0000 100.000 78.2013 66.1943 103.209 181 0.00000 0.00000 0.00000 1.00000 1.00000 1.00000 182 12.5000 37.5000 37.5000 7.76682 10.3453 13.3171 183 25.0000 75.0000 50.0000 25.4024 40.5957 27.4115 184 25.0000 100.000 50.0000 42.3076 74.4014 33.0466 185 25.0000 100.000 75.0000 47.8205 76.6062 62.0836 186 50.0000 100.000 75.0000 54.4826 80.0412 62.3958 187 75.0000 100.000 75.0000 67.0779 86.5354 62.9859 188 100.000 100.000 100.000 95.1065 100.000 108.844 189 25.0000 0.00000 100.000 20.9484 9.21837 95.2263 190 50.0000 0.00000 100.000 27.6104 12.6533 95.5385 191 75.0000 0.00000 100.000 40.2058 19.1475 96.1287 192 75.0000 75.0000 100.000 58.7057 56.1423 102.295 193 0.00000 25.0000 100.000 20.6724 11.7494 95.7294 194 25.0000 25.0000 100.000 22.7497 12.8204 95.8267 195 50.0000 25.0000 100.000 29.4117 16.2554 96.1389 196 75.0000 25.0000 100.000 42.0070 22.7496 96.7291 197 100.000 25.0000 100.000 61.5026 32.8015 97.6426 198 0.00000 0.00000 0.00000 1.00000 1.00000 1.00000 199 25.0000 50.0000 100.000 28.5266 24.3726 97.7524 200 50.0000 50.0000 100.000 35.1886 27.8076 98.0645 201 50.0000 75.0000 100.000 46.1104 49.6481 101.705 202 12.5000 62.5000 62.5000 20.1532 28.4677 37.9454 203 12.5000 62.5000 87.5000 27.1290 31.2576 74.6872 204 25.0000 75.0000 100.000 39.4484 46.2132 101.393 205 0.00000 50.0000 50.0000 12.4033 17.6840 23.6735 206 0.00000 75.0000 75.0000 28.8380 41.7294 56.3511 207 0.00000 100.000 75.0000 45.7432 75.5351 61.9862 208 0.00000 100.000 100.000 54.2763 78.9478 106.931 209 25.0000 100.000 100.000 56.3536 80.0189 107.028 210 50.0000 100.000 100.000 63.0157 83.4539 107.340 211 75.0000 100.000 100.000 75.6110 89.9480 107.930 212 62.5000 0.00000 0.00000 15.2297 8.33690 1.66678 213 68.7500 0.00000 0.00000 18.5730 10.0607 1.82344 214 100.000 100.000 100.000 95.1065 100.000 108.844 215 0.00000 25.0000 0.00000 2.80128 4.60205 1.60043 216 37.5000 37.5000 12.5000 10.1010 11.7590 3.94191 217 62.5000 37.5000 12.5000 19.5938 16.6535 4.38672 218 87.5000 37.5000 12.5000 35.5312 24.8708 5.13352 219 37.5000 12.5000 12.5000 6.50147 4.56093 2.74206 220 62.5000 12.5000 12.5000 15.9942 9.45544 3.18687 221 87.5000 12.5000 12.5000 31.9317 17.6728 3.93367 222 87.5000 62.5000 12.5000 43.7627 41.3315 7.87738 223 37.5000 62.5000 12.5000 18.3325 28.2197 6.68576 224 37.5000 87.5000 12.5000 32.1524 55.8555 11.2924 225 62.5000 87.5000 12.5000 41.6451 60.7500 11.7372 226 87.5000 87.5000 12.5000 57.5826 68.9674 12.4840 227 12.5000 12.5000 37.5000 4.16730 3.14728 12.1173 228 37.5000 12.5000 37.5000 8.31836 5.28757 12.3118 229 62.5000 12.5000 37.5000 17.8111 10.1821 12.7566 230 87.5000 12.5000 37.5000 33.7486 18.3995 13.5034 231 87.5000 62.5000 37.5000 45.5796 42.0582 17.4471 232 62.5000 37.5000 37.5000 21.4106 17.3801 13.9565 233 62.5000 62.5000 37.5000 29.6421 33.8408 16.7003 234 37.5000 37.5000 37.5000 11.9179 12.4856 13.5116 235 37.5000 62.5000 37.5000 20.1494 28.9463 16.2555 236 50.0000 75.0000 50.0000 32.0645 44.0306 27.7237 237 12.5000 87.5000 12.5000 28.0013 53.7152 11.0979 238 12.5000 87.5000 37.5000 29.8182 54.4419 20.6677 239 37.5000 87.5000 37.5000 33.9692 56.5822 20.8622 240 62.5000 87.5000 37.5000 43.4620 61.4767 21.3070 241 87.5000 87.5000 37.5000 59.3994 69.6941 22.0538 242 18.7500 0.00000 0.00000 2.19807 1.61773 1.05614 243 37.5000 12.5000 62.5000 12.4733 6.94928 34.1962 244 62.5000 12.5000 62.5000 21.9661 11.8438 34.6410 245 87.5000 12.5000 62.5000 37.9035 20.0612 35.3878 246 87.5000 12.5000 87.5000 44.8792 22.8510 72.1296 247 87.5000 37.5000 87.5000 48.4787 30.0490 73.3295 248 87.5000 62.5000 87.5000 56.7102 46.5097 76.0733 249 0.00000 18.7500 0.00000 2.03889 3.07749 1.34630 250 0.00000 50.0000 25.0000 9.48738 16.5179 8.31499 251 0.00000 75.0000 25.0000 20.4092 38.3584 11.9556 252 0.00000 75.0000 50.0000 23.3251 39.5246 27.3142 253 12.5000 87.5000 62.5000 33.9731 56.1036 42.5521 254 37.5000 87.5000 62.5000 38.1242 58.2439 42.7466 255 62.5000 87.5000 62.5000 47.6169 63.1384 43.1914 256 12.5000 12.5000 62.5000 8.32223 4.80899 34.0017 257 12.5000 12.5000 87.5000 15.2979 7.59883 70.7435 258 37.5000 12.5000 87.5000 19.4490 9.73913 70.9380 259 62.5000 12.5000 87.5000 28.9418 14.6336 71.3828 260 12.5000 37.5000 62.5000 11.9217 12.0070 35.2016 261 12.5000 37.5000 87.5000 18.8975 14.7969 71.9433 262 37.5000 37.5000 87.5000 23.0485 16.9371 72.1379 263 62.5000 37.5000 87.5000 32.5413 21.8317 72.5827 264 37.5000 37.5000 62.5000 16.0728 14.1473 35.3961 265 37.5000 62.5000 62.5000 24.3043 30.6080 38.1399 266 37.5000 62.5000 87.5000 31.2800 33.3978 74.8817 267 62.5000 62.5000 87.5000 40.7728 38.2924 75.3265 268 62.5000 87.5000 87.5000 54.5927 65.9282 79.9332 269 0.00000 25.0000 75.0000 12.1393 8.33668 50.7848 270 0.00000 50.0000 75.0000 17.9162 19.8888 52.7105 271 0.00000 75.0000 100.000 37.3711 45.1421 101.296 END_DATA CAL DESCRIPTOR "Argyll Device Calibration State" ORIGINATOR "Argyll dispcal" CREATED "Sat Mar 14 19:07:36 2009" KEYWORD "DEVICE_CLASS" DEVICE_CLASS "DISPLAY" KEYWORD "COLOR_REP" COLOR_REP "RGB" BEGIN_ARGYLL_DISPCAL_ARGS -qm -t5000 -g2.2 -f1 -k0 END_ARGYLL_DISPCAL_ARGS KEYWORD "RGB_I" NUMBER_OF_FIELDS 4 BEGIN_DATA_FORMAT RGB_I RGB_R RGB_G RGB_B END_DATA_FORMAT NUMBER_OF_SETS 256 BEGIN_DATA 0.00000 0.00000 0.00000 0.00000 0.00392 0.00392 0.00392 0.00392 0.00784 0.00784 0.00784 0.00784 0.01176 0.01176 0.01176 0.01176 0.01569 0.01569 0.01569 0.01569 0.01961 0.01961 0.01961 0.01961 0.02353 0.02353 0.02353 0.02353 0.02745 0.02745 0.02745 0.02745 0.03137 0.03137 0.03137 0.03137 0.03529 0.03529 0.03529 0.03529 0.03922 0.03922 0.03922 0.03922 0.04314 0.04314 0.04314 0.04314 0.04706 0.04706 0.04706 0.04706 0.05098 0.05098 0.05098 0.05098 0.05490 0.05490 0.05490 0.05490 0.05882 0.05882 0.05882 0.05882 0.06275 0.06275 0.06275 0.06275 0.06667 0.06667 0.06667 0.06667 0.07059 0.07059 0.07059 0.07059 0.07451 0.07451 0.07451 0.07451 0.07843 0.07843 0.07843 0.07843 0.08235 0.08235 0.08235 0.08235 0.08627 0.08627 0.08627 0.08627 0.09020 0.09020 0.09020 0.09020 0.09412 0.09412 0.09412 0.09412 0.09804 0.09804 0.09804 0.09804 0.10196 0.10196 0.10196 0.10196 0.10588 0.10588 0.10588 0.10588 0.10980 0.10980 0.10980 0.10980 0.11373 0.11373 0.11373 0.11373 0.11765 0.11765 0.11765 0.11765 0.12157 0.12157 0.12157 0.12157 0.12549 0.12549 0.12549 0.12549 0.12941 0.12941 0.12941 0.12941 0.13333 0.13333 0.13333 0.13333 0.13725 0.13725 0.13725 0.13725 0.14118 0.14118 0.14118 0.14118 0.14510 0.14510 0.14510 0.14510 0.14902 0.14902 0.14902 0.14902 0.15294 0.15294 0.15294 0.15294 0.15686 0.15686 0.15686 0.15686 0.16078 0.16078 0.16078 0.16078 0.16471 0.16471 0.16471 0.16471 0.16863 0.16863 0.16863 0.16863 0.17255 0.17255 0.17255 0.17255 0.17647 0.17647 0.17647 0.17647 0.18039 0.18039 0.18039 0.18039 0.18431 0.18431 0.18431 0.18431 0.18824 0.18824 0.18824 0.18824 0.19216 0.19216 0.19216 0.19216 0.19608 0.19608 0.19608 0.19608 0.20000 0.20000 0.20000 0.20000 0.20392 0.20392 0.20392 0.20392 0.20784 0.20784 0.20784 0.20784 0.21176 0.21176 0.21176 0.21176 0.21569 0.21569 0.21569 0.21569 0.21961 0.21961 0.21961 0.21961 0.22353 0.22353 0.22353 0.22353 0.22745 0.22745 0.22745 0.22745 0.23137 0.23137 0.23137 0.23137 0.23529 0.23529 0.23529 0.23529 0.23922 0.23922 0.23922 0.23922 0.24314 0.24314 0.24314 0.24314 0.24706 0.24706 0.24706 0.24706 0.25098 0.25098 0.25098 0.25098 0.25490 0.25490 0.25490 0.25490 0.25882 0.25882 0.25882 0.25882 0.26275 0.26275 0.26275 0.26275 0.26667 0.26667 0.26667 0.26667 0.27059 0.27059 0.27059 0.27059 0.27451 0.27451 0.27451 0.27451 0.27843 0.27843 0.27843 0.27843 0.28235 0.28235 0.28235 0.28235 0.28627 0.28627 0.28627 0.28627 0.29020 0.29020 0.29020 0.29020 0.29412 0.29412 0.29412 0.29412 0.29804 0.29804 0.29804 0.29804 0.30196 0.30196 0.30196 0.30196 0.30588 0.30588 0.30588 0.30588 0.30980 0.30980 0.30980 0.30980 0.31373 0.31373 0.31373 0.31373 0.31765 0.31765 0.31765 0.31765 0.32157 0.32157 0.32157 0.32157 0.32549 0.32549 0.32549 0.32549 0.32941 0.32941 0.32941 0.32941 0.33333 0.33333 0.33333 0.33333 0.33725 0.33725 0.33725 0.33725 0.34118 0.34118 0.34118 0.34118 0.34510 0.34510 0.34510 0.34510 0.34902 0.34902 0.34902 0.34902 0.35294 0.35294 0.35294 0.35294 0.35686 0.35686 0.35686 0.35686 0.36078 0.36078 0.36078 0.36078 0.36471 0.36471 0.36471 0.36471 0.36863 0.36863 0.36863 0.36863 0.37255 0.37255 0.37255 0.37255 0.37647 0.37647 0.37647 0.37647 0.38039 0.38039 0.38039 0.38039 0.38431 0.38431 0.38431 0.38431 0.38824 0.38824 0.38824 0.38824 0.39216 0.39216 0.39216 0.39216 0.39608 0.39608 0.39608 0.39608 0.40000 0.40000 0.40000 0.40000 0.40392 0.40392 0.40392 0.40392 0.40784 0.40784 0.40784 0.40784 0.41176 0.41176 0.41176 0.41176 0.41569 0.41569 0.41569 0.41569 0.41961 0.41961 0.41961 0.41961 0.42353 0.42353 0.42353 0.42353 0.42745 0.42745 0.42745 0.42745 0.43137 0.43137 0.43137 0.43137 0.43529 0.43529 0.43529 0.43529 0.43922 0.43922 0.43922 0.43922 0.44314 0.44314 0.44314 0.44314 0.44706 0.44706 0.44706 0.44706 0.45098 0.45098 0.45098 0.45098 0.45490 0.45490 0.45490 0.45490 0.45882 0.45882 0.45882 0.45882 0.46275 0.46275 0.46275 0.46275 0.46667 0.46667 0.46667 0.46667 0.47059 0.47059 0.47059 0.47059 0.47451 0.47451 0.47451 0.47451 0.47843 0.47843 0.47843 0.47843 0.48235 0.48235 0.48235 0.48235 0.48627 0.48627 0.48627 0.48627 0.49020 0.49020 0.49020 0.49020 0.49412 0.49412 0.49412 0.49412 0.49804 0.49804 0.49804 0.49804 0.50196 0.50196 0.50196 0.50196 0.50588 0.50588 0.50588 0.50588 0.50980 0.50980 0.50980 0.50980 0.51373 0.51373 0.51373 0.51373 0.51765 0.51765 0.51765 0.51765 0.52157 0.52157 0.52157 0.52157 0.52549 0.52549 0.52549 0.52549 0.52941 0.52941 0.52941 0.52941 0.53333 0.53333 0.53333 0.53333 0.53725 0.53725 0.53725 0.53725 0.54118 0.54118 0.54118 0.54118 0.54510 0.54510 0.54510 0.54510 0.54902 0.54902 0.54902 0.54902 0.55294 0.55294 0.55294 0.55294 0.55686 0.55686 0.55686 0.55686 0.56078 0.56078 0.56078 0.56078 0.56471 0.56471 0.56471 0.56471 0.56863 0.56863 0.56863 0.56863 0.57255 0.57255 0.57255 0.57255 0.57647 0.57647 0.57647 0.57647 0.58039 0.58039 0.58039 0.58039 0.58431 0.58431 0.58431 0.58431 0.58824 0.58824 0.58824 0.58824 0.59216 0.59216 0.59216 0.59216 0.59608 0.59608 0.59608 0.59608 0.60000 0.60000 0.60000 0.60000 0.60392 0.60392 0.60392 0.60392 0.60784 0.60784 0.60784 0.60784 0.61176 0.61176 0.61176 0.61176 0.61569 0.61569 0.61569 0.61569 0.61961 0.61961 0.61961 0.61961 0.62353 0.62353 0.62353 0.62353 0.62745 0.62745 0.62745 0.62745 0.63137 0.63137 0.63137 0.63137 0.63529 0.63529 0.63529 0.63529 0.63922 0.63922 0.63922 0.63922 0.64314 0.64314 0.64314 0.64314 0.64706 0.64706 0.64706 0.64706 0.65098 0.65098 0.65098 0.65098 0.65490 0.65490 0.65490 0.65490 0.65882 0.65882 0.65882 0.65882 0.66275 0.66275 0.66275 0.66275 0.66667 0.66667 0.66667 0.66667 0.67059 0.67059 0.67059 0.67059 0.67451 0.67451 0.67451 0.67451 0.67843 0.67843 0.67843 0.67843 0.68235 0.68235 0.68235 0.68235 0.68627 0.68627 0.68627 0.68627 0.69020 0.69020 0.69020 0.69020 0.69412 0.69412 0.69412 0.69412 0.69804 0.69804 0.69804 0.69804 0.70196 0.70196 0.70196 0.70196 0.70588 0.70588 0.70588 0.70588 0.70980 0.70980 0.70980 0.70980 0.71373 0.71373 0.71373 0.71373 0.71765 0.71765 0.71765 0.71765 0.72157 0.72157 0.72157 0.72157 0.72549 0.72549 0.72549 0.72549 0.72941 0.72941 0.72941 0.72941 0.73333 0.73333 0.73333 0.73333 0.73725 0.73725 0.73725 0.73725 0.74118 0.74118 0.74118 0.74118 0.74510 0.74510 0.74510 0.74510 0.74902 0.74902 0.74902 0.74902 0.75294 0.75294 0.75294 0.75294 0.75686 0.75686 0.75686 0.75686 0.76078 0.76078 0.76078 0.76078 0.76471 0.76471 0.76471 0.76471 0.76863 0.76863 0.76863 0.76863 0.77255 0.77255 0.77255 0.77255 0.77647 0.77647 0.77647 0.77647 0.78039 0.78039 0.78039 0.78039 0.78431 0.78431 0.78431 0.78431 0.78824 0.78824 0.78824 0.78824 0.79216 0.79216 0.79216 0.79216 0.79608 0.79608 0.79608 0.79608 0.80000 0.80000 0.80000 0.80000 0.80392 0.80392 0.80392 0.80392 0.80784 0.80784 0.80784 0.80784 0.81176 0.81176 0.81176 0.81176 0.81569 0.81569 0.81569 0.81569 0.81961 0.81961 0.81961 0.81961 0.82353 0.82353 0.82353 0.82353 0.82745 0.82745 0.82745 0.82745 0.83137 0.83137 0.83137 0.83137 0.83529 0.83529 0.83529 0.83529 0.83922 0.83922 0.83922 0.83922 0.84314 0.84314 0.84314 0.84314 0.84706 0.84706 0.84706 0.84706 0.85098 0.85098 0.85098 0.85098 0.85490 0.85490 0.85490 0.85490 0.85882 0.85882 0.85882 0.85882 0.86275 0.86275 0.86275 0.86275 0.86667 0.86667 0.86667 0.86667 0.87059 0.87059 0.87059 0.87059 0.87451 0.87451 0.87451 0.87451 0.87843 0.87843 0.87843 0.87843 0.88235 0.88235 0.88235 0.88235 0.88627 0.88627 0.88627 0.88627 0.89020 0.89020 0.89020 0.89020 0.89412 0.89412 0.89412 0.89412 0.89804 0.89804 0.89804 0.89804 0.90196 0.90196 0.90196 0.90196 0.90588 0.90588 0.90588 0.90588 0.90980 0.90980 0.90980 0.90980 0.91373 0.91373 0.91373 0.91373 0.91765 0.91765 0.91765 0.91765 0.92157 0.92157 0.92157 0.92157 0.92549 0.92549 0.92549 0.92549 0.92941 0.92941 0.92941 0.92941 0.93333 0.93333 0.93333 0.93333 0.93725 0.93725 0.93725 0.93725 0.94118 0.94118 0.94118 0.94118 0.94510 0.94510 0.94510 0.94510 0.94902 0.94902 0.94902 0.94902 0.95294 0.95294 0.95294 0.95294 0.95686 0.95686 0.95686 0.95686 0.96078 0.96078 0.96078 0.96078 0.96471 0.96471 0.96471 0.96471 0.96863 0.96863 0.96863 0.96863 0.97255 0.97255 0.97255 0.97255 0.97647 0.97647 0.97647 0.97647 0.98039 0.98039 0.98039 0.98039 0.98431 0.98431 0.98431 0.98431 0.98824 0.98824 0.98824 0.98824 0.99216 0.99216 0.99216 0.99216 0.99608 0.99608 0.99608 0.99608 1.00000 1.00000 1.00000 1.00000 END_DATA DisplayCAL-3.1.0.0/misc/ti3/prepress.ti30000644000076500000000000005572312647526532017440 0ustar devwheel00000000000000CTI3 DESCRIPTOR "Argyll Calibration Target chart information 3" ORIGINATOR "Argyll dispread" CREATED "Tue Feb 23 08:46:43 2010" KEYWORD "DEVICE_CLASS" DEVICE_CLASS "DISPLAY" KEYWORD "APPROX_WHITE_POINT" APPROX_WHITE_POINT "95.106486 100.000000 108.844025" KEYWORD "COLOR_REP" COLOR_REP "RGB_XYZ" KEYWORD "BLACK_COLOR_PATCHES" BLACK_COLOR_PATCHES "4" KEYWORD "COMP_GREY_STEPS" COMP_GREY_STEPS "49" KEYWORD "MULTI_DIM_BCC_STEPS" MULTI_DIM_BCC_STEPS "5" KEYWORD "MULTI_DIM_STEPS" MULTI_DIM_STEPS "5" KEYWORD "SINGLE_DIM_STEPS" SINGLE_DIM_STEPS "17" KEYWORD "WHITE_COLOR_PATCHES" WHITE_COLOR_PATCHES "4" KEYWORD "USE_BLACK_POINT_COMPENSATION" USE_BLACK_POINT_COMPENSATION "NO" KEYWORD "AUTO_OPTIMIZE" AUTO_OPTIMIZE "6" BEGIN_ARGYLL_COLPROF_ARGS -qh -ax END_ARGYLL_COLPROF_ARGS NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT SAMPLE_ID RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 271 BEGIN_DATA 1 100.000 100.000 100.000 95.1065 100.000 108.844 2 12.5000 37.5000 12.5000 5.94993 9.61866 3.74740 3 12.5000 62.5000 12.5000 14.1814 26.0794 6.49125 4 12.5000 87.5000 87.5000 40.9488 58.8934 79.2939 5 37.5000 87.5000 87.5000 45.0999 61.0337 79.4884 6 0.00000 25.0000 25.0000 3.71049 4.96568 6.38934 7 0.00000 25.0000 50.0000 6.62643 6.13187 21.7479 8 25.0000 75.0000 75.0000 30.9153 42.8005 56.4485 9 50.0000 75.0000 75.0000 37.5774 46.2355 56.7606 10 12.5000 0.00000 0.00000 1.58591 1.30210 1.02745 11 10.4167 10.4167 10.4167 2.00521 2.05749 2.15195 12 25.0000 0.00000 0.00000 3.07728 2.07105 1.09734 13 31.2500 0.00000 0.00000 4.24932 2.67536 1.15226 14 37.5000 0.00000 0.00000 5.73696 3.44239 1.22197 15 43.7500 0.00000 0.00000 7.56070 4.38272 1.30742 16 50.0000 0.00000 0.00000 9.73934 5.50603 1.40951 17 62.5000 37.5000 62.5000 25.5656 19.0418 35.8409 18 87.5000 37.5000 62.5000 41.5030 27.2592 36.5877 19 0.00000 0.00000 0.00000 1.00000 1.00000 1.00000 20 75.0000 0.00000 0.00000 22.3346 12.0002 1.99970 21 81.2500 0.00000 0.00000 26.5283 14.1625 2.19621 22 87.5000 0.00000 0.00000 31.1672 16.5543 2.41358 23 93.7500 0.00000 0.00000 36.2638 19.1821 2.65240 24 100.000 0.00000 0.00000 41.8302 22.0522 2.91323 25 62.5000 62.5000 12.5000 27.8253 33.1142 7.13058 26 75.0000 75.0000 50.0000 44.6598 50.5248 28.3139 27 8.33333 8.33333 8.33333 1.71786 1.75519 1.82265 28 0.00000 12.5000 0.00000 1.50806 2.01598 1.16935 29 0.00000 43.7500 0.00000 6.68900 12.3764 2.89635 30 0.00000 50.0000 0.00000 8.57817 16.1542 3.52608 31 0.00000 56.2500 0.00000 10.7902 20.5776 4.26342 32 0.00000 62.5000 0.00000 13.3391 25.6747 5.11306 33 12.5000 62.5000 37.5000 15.9983 26.8060 16.0610 34 0.00000 0.00000 0.00000 1.00000 1.00000 1.00000 35 0.00000 6.25000 0.00000 1.18254 1.36502 1.06085 36 0.00000 75.0000 0.00000 19.5000 37.9948 7.16671 37 0.00000 81.2500 0.00000 23.1365 45.2667 8.37888 38 0.00000 87.5000 0.00000 27.1590 53.3106 9.71972 39 0.00000 93.7500 0.00000 31.5784 62.1482 11.1929 40 0.00000 100.000 0.00000 36.4052 71.8005 12.8018 41 6.25000 6.25000 6.25000 1.48518 1.51041 1.55601 42 0.00000 0.00000 12.5000 1.25645 1.10256 2.35074 43 0.00000 0.00000 18.7500 1.52439 1.20972 3.76201 44 0.00000 0.00000 25.0000 1.90921 1.36363 5.78891 45 0.00000 0.00000 31.2500 2.42221 1.56879 8.49092 46 0.00000 0.00000 37.5000 3.07334 1.82920 11.9205 47 0.00000 0.00000 43.7500 3.87158 2.14845 16.1249 48 0.00000 0.00000 50.0000 4.82515 2.52982 21.1475 49 0.00000 0.00000 56.2500 5.94168 2.97636 27.0283 50 0.00000 0.00000 62.5000 7.22826 3.49091 33.8049 51 0.00000 0.00000 68.7500 8.69161 4.07616 41.5125 52 0.00000 0.00000 75.0000 10.3380 4.73463 50.1844 53 0.00000 0.00000 81.2500 12.1736 5.46873 59.8524 54 0.00000 0.00000 87.5000 14.2040 6.28076 70.5467 55 0.00000 0.00000 93.7500 16.4347 7.17291 82.2963 56 0.00000 0.00000 100.000 18.8711 8.14731 95.1290 57 0.00000 50.0000 100.000 26.4493 23.3015 97.6550 58 75.0000 50.0000 100.000 47.7839 34.3017 98.6547 59 0.00000 0.00000 6.25000 1.09214 1.03685 1.48530 60 2.08333 2.08333 2.08333 1.15175 1.15964 1.17390 61 4.16667 4.16667 4.16667 1.30372 1.31952 1.34806 62 12.5000 12.5000 12.5000 2.35042 2.42064 2.54755 63 14.5833 14.5833 14.5833 2.75638 2.84772 3.01278 64 16.6667 16.6667 16.6667 3.22584 3.34159 3.55077 65 18.7500 18.7500 18.7500 3.76135 3.90494 4.16445 66 20.8333 20.8333 20.8333 4.36533 4.54033 4.85660 67 22.9167 22.9167 22.9167 5.04007 5.25016 5.62984 68 25.0000 25.0000 25.0000 5.78777 6.03673 6.48668 69 27.0833 27.0833 27.0833 6.61052 6.90226 7.42953 70 29.1667 29.1667 29.1667 7.51032 7.84886 8.46069 71 31.2500 31.2500 31.2500 8.48913 8.87856 9.58238 72 6.25000 0.00000 0.00000 1.21051 1.10854 1.00986 73 33.3333 33.3333 33.3333 9.54879 9.99333 10.7967 74 35.4167 35.4167 35.4167 10.6911 11.1951 12.1058 75 39.5833 39.5833 39.5833 13.2307 13.8667 15.0161 76 41.6667 41.6667 41.6667 14.6313 15.3402 16.6212 77 43.7500 43.7500 43.7500 16.1213 16.9076 18.3287 78 45.8333 45.8333 45.8333 17.7021 18.5707 20.1403 79 47.9167 47.9167 47.9167 19.3754 20.3310 22.0579 80 50.0000 50.0000 50.0000 21.1427 22.1901 24.0831 81 52.0833 52.0833 52.0833 23.0052 24.1495 26.2175 82 54.1667 54.1667 54.1667 24.9646 26.2107 28.4629 83 56.2500 56.2500 56.2500 27.0221 28.3752 30.8208 84 58.3333 58.3333 58.3333 29.1791 30.6444 33.2927 85 60.4167 60.4167 60.4167 31.4370 33.0197 35.8802 86 62.5000 62.5000 62.5000 33.7971 35.5025 38.5847 87 64.5833 64.5833 64.5833 36.2605 38.0941 41.4078 88 66.6667 66.6667 66.6667 38.8287 40.7958 44.3509 89 68.7500 68.7500 68.7500 41.5028 43.6089 47.4154 90 70.8333 70.8333 70.8333 44.2840 46.5348 50.6026 91 72.9167 72.9167 72.9167 47.1736 49.5746 53.9140 92 75.0000 75.0000 75.0000 50.1727 52.7296 57.3508 93 77.0833 77.0833 77.0833 53.2824 56.0011 60.9145 94 79.1667 79.1667 79.1667 56.5039 59.3901 64.6063 95 81.2500 81.2500 81.2500 59.8383 62.8979 68.4275 96 83.3333 83.3333 83.3333 63.2868 66.5257 72.3793 97 85.4167 85.4167 85.4167 66.8503 70.2745 76.4631 98 87.5000 87.5000 87.5000 70.5301 74.1456 80.6800 99 89.5833 89.5833 89.5833 74.3270 78.1400 85.0312 100 91.6667 91.6667 91.6667 78.2423 82.2589 89.5180 101 93.7500 93.7500 93.7500 82.2769 86.5032 94.1415 102 95.8333 95.8333 95.8333 86.4317 90.8742 98.9029 103 97.9167 97.9167 97.9167 90.7080 95.3727 103.803 104 25.0000 25.0000 0.00000 4.87856 5.67311 1.69777 105 50.0000 25.0000 0.00000 11.5406 9.10808 2.00994 106 75.0000 25.0000 0.00000 24.1359 15.6023 2.60014 107 100.000 25.0000 0.00000 43.6314 25.6542 3.51366 108 100.000 75.0000 0.00000 60.3302 59.0470 9.07994 109 50.0000 50.0000 0.00000 17.3175 20.6603 3.93559 110 75.0000 50.0000 0.00000 29.9128 27.1544 4.52578 111 100.000 50.0000 0.00000 49.4083 37.2064 5.43931 112 100.000 100.000 100.000 95.1065 100.000 108.844 113 50.0000 75.0000 0.00000 28.2393 42.5008 7.57622 114 75.0000 75.0000 0.00000 40.8346 48.9950 8.16642 115 25.0000 75.0000 0.00000 21.5773 39.0658 7.26405 116 25.0000 100.000 0.00000 38.4825 72.8716 12.8992 117 50.0000 100.000 0.00000 45.1445 76.3065 13.2113 118 75.0000 100.000 0.00000 57.7399 82.8007 13.8015 119 100.000 100.000 0.00000 77.2354 92.8527 14.7151 120 25.0000 0.00000 25.0000 3.98649 2.43468 5.88625 121 50.0000 0.00000 25.0000 10.6485 5.86966 6.19842 122 75.0000 0.00000 25.0000 23.2439 12.3638 6.78862 123 75.0000 25.0000 25.0000 25.0451 15.9659 7.38905 124 87.5000 37.5000 37.5000 37.3481 25.5975 14.7033 125 56.2500 0.00000 0.00000 12.2903 6.82130 1.52904 126 100.000 0.00000 25.0000 42.7394 22.4158 7.70214 127 100.000 25.0000 25.0000 44.5407 26.0178 8.30257 128 100.000 25.0000 50.0000 47.4566 27.1840 23.6611 129 50.0000 25.0000 25.0000 12.4498 9.47171 6.79885 130 50.0000 50.0000 25.0000 18.2267 21.0239 8.72450 131 75.0000 50.0000 25.0000 30.8220 27.5181 9.31470 132 100.000 50.0000 25.0000 50.3176 37.5700 10.2282 133 25.0000 50.0000 25.0000 11.5647 17.5889 8.41233 134 25.0000 75.0000 25.0000 22.4865 39.4295 12.0530 135 50.0000 75.0000 25.0000 29.1485 42.8645 12.3651 136 75.0000 75.0000 25.0000 41.7438 49.3586 12.9553 137 100.000 75.0000 25.0000 61.2394 59.4106 13.8689 138 25.0000 50.0000 0.00000 10.6555 17.2253 3.62342 139 25.0000 100.000 25.0000 39.3917 73.2352 17.6881 140 50.0000 100.000 25.0000 46.0538 76.6702 18.0003 141 75.0000 100.000 25.0000 58.6491 83.1644 18.5905 142 100.000 100.000 25.0000 78.1446 93.2163 19.5040 143 25.0000 0.00000 50.0000 6.90243 3.60087 21.2448 144 50.0000 0.00000 50.0000 13.5645 7.03585 21.5570 145 75.0000 0.00000 50.0000 26.1598 13.5300 22.1472 146 100.000 0.00000 50.0000 45.6553 23.5820 23.0607 147 100.000 50.0000 75.0000 58.7464 40.9410 54.6237 148 100.000 50.0000 100.000 67.2794 44.3537 99.5683 149 50.0000 25.0000 50.0000 15.3658 10.6379 22.1574 150 75.0000 25.0000 50.0000 27.9611 17.1321 22.7476 151 100.000 25.0000 75.0000 52.9695 29.3888 52.6981 152 25.0000 25.0000 50.0000 8.70371 7.20292 21.8452 153 25.0000 50.0000 50.0000 14.4806 18.7551 23.7709 154 75.0000 50.0000 50.0000 33.7380 28.6843 24.6733 155 100.000 50.0000 50.0000 53.2335 38.7362 25.5868 156 100.000 75.0000 50.0000 64.1553 60.5768 29.2274 157 87.5000 62.5000 62.5000 49.7345 43.7199 39.3315 158 87.5000 87.5000 62.5000 63.5544 71.3558 43.9382 159 100.000 100.000 75.0000 86.5734 96.5873 63.8995 160 0.00000 68.7500 0.00000 16.2382 31.4721 6.07943 161 0.00000 100.000 25.0000 37.3144 72.1641 17.5907 162 0.00000 100.000 50.0000 40.2304 73.3303 32.9493 163 50.0000 100.000 50.0000 48.9697 77.8364 33.3588 164 75.0000 100.000 50.0000 61.5650 84.3305 33.9490 165 100.000 100.000 50.0000 81.0605 94.3825 34.8625 166 25.0000 0.00000 75.0000 12.4153 5.80568 50.2817 167 50.0000 0.00000 75.0000 19.0774 9.24066 50.5939 168 75.0000 0.00000 75.0000 31.6727 15.7348 51.1841 169 100.000 0.00000 75.0000 51.1682 25.7868 52.0976 170 100.000 0.00000 100.000 59.7013 29.1995 97.0422 171 25.0000 25.0000 75.0000 14.2166 9.40773 50.8822 172 50.0000 25.0000 75.0000 20.8787 12.8427 51.1944 173 75.0000 25.0000 75.0000 33.4740 19.3369 51.7845 174 0.00000 31.2500 0.00000 3.81760 6.63441 1.93921 175 0.00000 37.5000 0.00000 5.10758 9.21400 2.36920 176 25.0000 50.0000 75.0000 19.9935 20.9599 52.8078 177 50.0000 50.0000 75.0000 26.6555 24.3949 53.1200 178 75.0000 50.0000 75.0000 39.2509 30.8891 53.7102 179 100.000 75.0000 75.0000 69.6682 62.7816 58.2644 180 100.000 75.0000 100.000 78.2013 66.1943 103.209 181 0.00000 0.00000 0.00000 1.00000 1.00000 1.00000 182 12.5000 37.5000 37.5000 7.76682 10.3453 13.3171 183 25.0000 75.0000 50.0000 25.4024 40.5957 27.4115 184 25.0000 100.000 50.0000 42.3076 74.4014 33.0466 185 25.0000 100.000 75.0000 47.8205 76.6062 62.0836 186 50.0000 100.000 75.0000 54.4826 80.0412 62.3958 187 75.0000 100.000 75.0000 67.0779 86.5354 62.9859 188 100.000 100.000 100.000 95.1065 100.000 108.844 189 25.0000 0.00000 100.000 20.9484 9.21837 95.2263 190 50.0000 0.00000 100.000 27.6104 12.6533 95.5385 191 75.0000 0.00000 100.000 40.2058 19.1475 96.1287 192 75.0000 75.0000 100.000 58.7057 56.1423 102.295 193 0.00000 25.0000 100.000 20.6724 11.7494 95.7294 194 25.0000 25.0000 100.000 22.7497 12.8204 95.8267 195 50.0000 25.0000 100.000 29.4117 16.2554 96.1389 196 75.0000 25.0000 100.000 42.0070 22.7496 96.7291 197 100.000 25.0000 100.000 61.5026 32.8015 97.6426 198 0.00000 0.00000 0.00000 1.00000 1.00000 1.00000 199 25.0000 50.0000 100.000 28.5266 24.3726 97.7524 200 50.0000 50.0000 100.000 35.1886 27.8076 98.0645 201 50.0000 75.0000 100.000 46.1104 49.6481 101.705 202 12.5000 62.5000 62.5000 20.1532 28.4677 37.9454 203 12.5000 62.5000 87.5000 27.1290 31.2576 74.6872 204 25.0000 75.0000 100.000 39.4484 46.2132 101.393 205 0.00000 50.0000 50.0000 12.4033 17.6840 23.6735 206 0.00000 75.0000 75.0000 28.8380 41.7294 56.3511 207 0.00000 100.000 75.0000 45.7432 75.5351 61.9862 208 0.00000 100.000 100.000 54.2763 78.9478 106.931 209 25.0000 100.000 100.000 56.3536 80.0189 107.028 210 50.0000 100.000 100.000 63.0157 83.4539 107.340 211 75.0000 100.000 100.000 75.6110 89.9480 107.930 212 62.5000 0.00000 0.00000 15.2297 8.33690 1.66678 213 68.7500 0.00000 0.00000 18.5730 10.0607 1.82344 214 100.000 100.000 100.000 95.1065 100.000 108.844 215 0.00000 25.0000 0.00000 2.80128 4.60205 1.60043 216 37.5000 37.5000 12.5000 10.1010 11.7590 3.94191 217 62.5000 37.5000 12.5000 19.5938 16.6535 4.38672 218 87.5000 37.5000 12.5000 35.5312 24.8708 5.13352 219 37.5000 12.5000 12.5000 6.50147 4.56093 2.74206 220 62.5000 12.5000 12.5000 15.9942 9.45544 3.18687 221 87.5000 12.5000 12.5000 31.9317 17.6728 3.93367 222 87.5000 62.5000 12.5000 43.7627 41.3315 7.87738 223 37.5000 62.5000 12.5000 18.3325 28.2197 6.68576 224 37.5000 87.5000 12.5000 32.1524 55.8555 11.2924 225 62.5000 87.5000 12.5000 41.6451 60.7500 11.7372 226 87.5000 87.5000 12.5000 57.5826 68.9674 12.4840 227 12.5000 12.5000 37.5000 4.16730 3.14728 12.1173 228 37.5000 12.5000 37.5000 8.31836 5.28757 12.3118 229 62.5000 12.5000 37.5000 17.8111 10.1821 12.7566 230 87.5000 12.5000 37.5000 33.7486 18.3995 13.5034 231 87.5000 62.5000 37.5000 45.5796 42.0582 17.4471 232 62.5000 37.5000 37.5000 21.4106 17.3801 13.9565 233 62.5000 62.5000 37.5000 29.6421 33.8408 16.7003 234 37.5000 37.5000 37.5000 11.9179 12.4856 13.5116 235 37.5000 62.5000 37.5000 20.1494 28.9463 16.2555 236 50.0000 75.0000 50.0000 32.0645 44.0306 27.7237 237 12.5000 87.5000 12.5000 28.0013 53.7152 11.0979 238 12.5000 87.5000 37.5000 29.8182 54.4419 20.6677 239 37.5000 87.5000 37.5000 33.9692 56.5822 20.8622 240 62.5000 87.5000 37.5000 43.4620 61.4767 21.3070 241 87.5000 87.5000 37.5000 59.3994 69.6941 22.0538 242 18.7500 0.00000 0.00000 2.19807 1.61773 1.05614 243 37.5000 12.5000 62.5000 12.4733 6.94928 34.1962 244 62.5000 12.5000 62.5000 21.9661 11.8438 34.6410 245 87.5000 12.5000 62.5000 37.9035 20.0612 35.3878 246 87.5000 12.5000 87.5000 44.8792 22.8510 72.1296 247 87.5000 37.5000 87.5000 48.4787 30.0490 73.3295 248 87.5000 62.5000 87.5000 56.7102 46.5097 76.0733 249 0.00000 18.7500 0.00000 2.03889 3.07749 1.34630 250 0.00000 50.0000 25.0000 9.48738 16.5179 8.31499 251 0.00000 75.0000 25.0000 20.4092 38.3584 11.9556 252 0.00000 75.0000 50.0000 23.3251 39.5246 27.3142 253 12.5000 87.5000 62.5000 33.9731 56.1036 42.5521 254 37.5000 87.5000 62.5000 38.1242 58.2439 42.7466 255 62.5000 87.5000 62.5000 47.6169 63.1384 43.1914 256 12.5000 12.5000 62.5000 8.32223 4.80899 34.0017 257 12.5000 12.5000 87.5000 15.2979 7.59883 70.7435 258 37.5000 12.5000 87.5000 19.4490 9.73913 70.9380 259 62.5000 12.5000 87.5000 28.9418 14.6336 71.3828 260 12.5000 37.5000 62.5000 11.9217 12.0070 35.2016 261 12.5000 37.5000 87.5000 18.8975 14.7969 71.9433 262 37.5000 37.5000 87.5000 23.0485 16.9371 72.1379 263 62.5000 37.5000 87.5000 32.5413 21.8317 72.5827 264 37.5000 37.5000 62.5000 16.0728 14.1473 35.3961 265 37.5000 62.5000 62.5000 24.3043 30.6080 38.1399 266 37.5000 62.5000 87.5000 31.2800 33.3978 74.8817 267 62.5000 62.5000 87.5000 40.7728 38.2924 75.3265 268 62.5000 87.5000 87.5000 54.5927 65.9282 79.9332 269 0.00000 25.0000 75.0000 12.1393 8.33668 50.7848 270 0.00000 50.0000 75.0000 17.9162 19.8888 52.7105 271 0.00000 75.0000 100.000 37.3711 45.1421 101.296 END_DATA CAL DESCRIPTOR "Argyll Device Calibration State" ORIGINATOR "Argyll dispcal" CREATED "Sat Mar 14 19:07:36 2009" KEYWORD "DEVICE_CLASS" DEVICE_CLASS "DISPLAY" KEYWORD "COLOR_REP" COLOR_REP "RGB" BEGIN_ARGYLL_DISPCAL_ARGS -qm -t5000 -b130 -gl -f1 -k1 END_ARGYLL_DISPCAL_ARGS KEYWORD "RGB_I" NUMBER_OF_FIELDS 4 BEGIN_DATA_FORMAT RGB_I RGB_R RGB_G RGB_B END_DATA_FORMAT NUMBER_OF_SETS 256 BEGIN_DATA 0.00000 0.00000 0.00000 0.00000 0.00392 0.00392 0.00392 0.00392 0.00784 0.00784 0.00784 0.00784 0.01176 0.01176 0.01176 0.01176 0.01569 0.01569 0.01569 0.01569 0.01961 0.01961 0.01961 0.01961 0.02353 0.02353 0.02353 0.02353 0.02745 0.02745 0.02745 0.02745 0.03137 0.03137 0.03137 0.03137 0.03529 0.03529 0.03529 0.03529 0.03922 0.03922 0.03922 0.03922 0.04314 0.04314 0.04314 0.04314 0.04706 0.04706 0.04706 0.04706 0.05098 0.05098 0.05098 0.05098 0.05490 0.05490 0.05490 0.05490 0.05882 0.05882 0.05882 0.05882 0.06275 0.06275 0.06275 0.06275 0.06667 0.06667 0.06667 0.06667 0.07059 0.07059 0.07059 0.07059 0.07451 0.07451 0.07451 0.07451 0.07843 0.07843 0.07843 0.07843 0.08235 0.08235 0.08235 0.08235 0.08627 0.08627 0.08627 0.08627 0.09020 0.09020 0.09020 0.09020 0.09412 0.09412 0.09412 0.09412 0.09804 0.09804 0.09804 0.09804 0.10196 0.10196 0.10196 0.10196 0.10588 0.10588 0.10588 0.10588 0.10980 0.10980 0.10980 0.10980 0.11373 0.11373 0.11373 0.11373 0.11765 0.11765 0.11765 0.11765 0.12157 0.12157 0.12157 0.12157 0.12549 0.12549 0.12549 0.12549 0.12941 0.12941 0.12941 0.12941 0.13333 0.13333 0.13333 0.13333 0.13725 0.13725 0.13725 0.13725 0.14118 0.14118 0.14118 0.14118 0.14510 0.14510 0.14510 0.14510 0.14902 0.14902 0.14902 0.14902 0.15294 0.15294 0.15294 0.15294 0.15686 0.15686 0.15686 0.15686 0.16078 0.16078 0.16078 0.16078 0.16471 0.16471 0.16471 0.16471 0.16863 0.16863 0.16863 0.16863 0.17255 0.17255 0.17255 0.17255 0.17647 0.17647 0.17647 0.17647 0.18039 0.18039 0.18039 0.18039 0.18431 0.18431 0.18431 0.18431 0.18824 0.18824 0.18824 0.18824 0.19216 0.19216 0.19216 0.19216 0.19608 0.19608 0.19608 0.19608 0.20000 0.20000 0.20000 0.20000 0.20392 0.20392 0.20392 0.20392 0.20784 0.20784 0.20784 0.20784 0.21176 0.21176 0.21176 0.21176 0.21569 0.21569 0.21569 0.21569 0.21961 0.21961 0.21961 0.21961 0.22353 0.22353 0.22353 0.22353 0.22745 0.22745 0.22745 0.22745 0.23137 0.23137 0.23137 0.23137 0.23529 0.23529 0.23529 0.23529 0.23922 0.23922 0.23922 0.23922 0.24314 0.24314 0.24314 0.24314 0.24706 0.24706 0.24706 0.24706 0.25098 0.25098 0.25098 0.25098 0.25490 0.25490 0.25490 0.25490 0.25882 0.25882 0.25882 0.25882 0.26275 0.26275 0.26275 0.26275 0.26667 0.26667 0.26667 0.26667 0.27059 0.27059 0.27059 0.27059 0.27451 0.27451 0.27451 0.27451 0.27843 0.27843 0.27843 0.27843 0.28235 0.28235 0.28235 0.28235 0.28627 0.28627 0.28627 0.28627 0.29020 0.29020 0.29020 0.29020 0.29412 0.29412 0.29412 0.29412 0.29804 0.29804 0.29804 0.29804 0.30196 0.30196 0.30196 0.30196 0.30588 0.30588 0.30588 0.30588 0.30980 0.30980 0.30980 0.30980 0.31373 0.31373 0.31373 0.31373 0.31765 0.31765 0.31765 0.31765 0.32157 0.32157 0.32157 0.32157 0.32549 0.32549 0.32549 0.32549 0.32941 0.32941 0.32941 0.32941 0.33333 0.33333 0.33333 0.33333 0.33725 0.33725 0.33725 0.33725 0.34118 0.34118 0.34118 0.34118 0.34510 0.34510 0.34510 0.34510 0.34902 0.34902 0.34902 0.34902 0.35294 0.35294 0.35294 0.35294 0.35686 0.35686 0.35686 0.35686 0.36078 0.36078 0.36078 0.36078 0.36471 0.36471 0.36471 0.36471 0.36863 0.36863 0.36863 0.36863 0.37255 0.37255 0.37255 0.37255 0.37647 0.37647 0.37647 0.37647 0.38039 0.38039 0.38039 0.38039 0.38431 0.38431 0.38431 0.38431 0.38824 0.38824 0.38824 0.38824 0.39216 0.39216 0.39216 0.39216 0.39608 0.39608 0.39608 0.39608 0.40000 0.40000 0.40000 0.40000 0.40392 0.40392 0.40392 0.40392 0.40784 0.40784 0.40784 0.40784 0.41176 0.41176 0.41176 0.41176 0.41569 0.41569 0.41569 0.41569 0.41961 0.41961 0.41961 0.41961 0.42353 0.42353 0.42353 0.42353 0.42745 0.42745 0.42745 0.42745 0.43137 0.43137 0.43137 0.43137 0.43529 0.43529 0.43529 0.43529 0.43922 0.43922 0.43922 0.43922 0.44314 0.44314 0.44314 0.44314 0.44706 0.44706 0.44706 0.44706 0.45098 0.45098 0.45098 0.45098 0.45490 0.45490 0.45490 0.45490 0.45882 0.45882 0.45882 0.45882 0.46275 0.46275 0.46275 0.46275 0.46667 0.46667 0.46667 0.46667 0.47059 0.47059 0.47059 0.47059 0.47451 0.47451 0.47451 0.47451 0.47843 0.47843 0.47843 0.47843 0.48235 0.48235 0.48235 0.48235 0.48627 0.48627 0.48627 0.48627 0.49020 0.49020 0.49020 0.49020 0.49412 0.49412 0.49412 0.49412 0.49804 0.49804 0.49804 0.49804 0.50196 0.50196 0.50196 0.50196 0.50588 0.50588 0.50588 0.50588 0.50980 0.50980 0.50980 0.50980 0.51373 0.51373 0.51373 0.51373 0.51765 0.51765 0.51765 0.51765 0.52157 0.52157 0.52157 0.52157 0.52549 0.52549 0.52549 0.52549 0.52941 0.52941 0.52941 0.52941 0.53333 0.53333 0.53333 0.53333 0.53725 0.53725 0.53725 0.53725 0.54118 0.54118 0.54118 0.54118 0.54510 0.54510 0.54510 0.54510 0.54902 0.54902 0.54902 0.54902 0.55294 0.55294 0.55294 0.55294 0.55686 0.55686 0.55686 0.55686 0.56078 0.56078 0.56078 0.56078 0.56471 0.56471 0.56471 0.56471 0.56863 0.56863 0.56863 0.56863 0.57255 0.57255 0.57255 0.57255 0.57647 0.57647 0.57647 0.57647 0.58039 0.58039 0.58039 0.58039 0.58431 0.58431 0.58431 0.58431 0.58824 0.58824 0.58824 0.58824 0.59216 0.59216 0.59216 0.59216 0.59608 0.59608 0.59608 0.59608 0.60000 0.60000 0.60000 0.60000 0.60392 0.60392 0.60392 0.60392 0.60784 0.60784 0.60784 0.60784 0.61176 0.61176 0.61176 0.61176 0.61569 0.61569 0.61569 0.61569 0.61961 0.61961 0.61961 0.61961 0.62353 0.62353 0.62353 0.62353 0.62745 0.62745 0.62745 0.62745 0.63137 0.63137 0.63137 0.63137 0.63529 0.63529 0.63529 0.63529 0.63922 0.63922 0.63922 0.63922 0.64314 0.64314 0.64314 0.64314 0.64706 0.64706 0.64706 0.64706 0.65098 0.65098 0.65098 0.65098 0.65490 0.65490 0.65490 0.65490 0.65882 0.65882 0.65882 0.65882 0.66275 0.66275 0.66275 0.66275 0.66667 0.66667 0.66667 0.66667 0.67059 0.67059 0.67059 0.67059 0.67451 0.67451 0.67451 0.67451 0.67843 0.67843 0.67843 0.67843 0.68235 0.68235 0.68235 0.68235 0.68627 0.68627 0.68627 0.68627 0.69020 0.69020 0.69020 0.69020 0.69412 0.69412 0.69412 0.69412 0.69804 0.69804 0.69804 0.69804 0.70196 0.70196 0.70196 0.70196 0.70588 0.70588 0.70588 0.70588 0.70980 0.70980 0.70980 0.70980 0.71373 0.71373 0.71373 0.71373 0.71765 0.71765 0.71765 0.71765 0.72157 0.72157 0.72157 0.72157 0.72549 0.72549 0.72549 0.72549 0.72941 0.72941 0.72941 0.72941 0.73333 0.73333 0.73333 0.73333 0.73725 0.73725 0.73725 0.73725 0.74118 0.74118 0.74118 0.74118 0.74510 0.74510 0.74510 0.74510 0.74902 0.74902 0.74902 0.74902 0.75294 0.75294 0.75294 0.75294 0.75686 0.75686 0.75686 0.75686 0.76078 0.76078 0.76078 0.76078 0.76471 0.76471 0.76471 0.76471 0.76863 0.76863 0.76863 0.76863 0.77255 0.77255 0.77255 0.77255 0.77647 0.77647 0.77647 0.77647 0.78039 0.78039 0.78039 0.78039 0.78431 0.78431 0.78431 0.78431 0.78824 0.78824 0.78824 0.78824 0.79216 0.79216 0.79216 0.79216 0.79608 0.79608 0.79608 0.79608 0.80000 0.80000 0.80000 0.80000 0.80392 0.80392 0.80392 0.80392 0.80784 0.80784 0.80784 0.80784 0.81176 0.81176 0.81176 0.81176 0.81569 0.81569 0.81569 0.81569 0.81961 0.81961 0.81961 0.81961 0.82353 0.82353 0.82353 0.82353 0.82745 0.82745 0.82745 0.82745 0.83137 0.83137 0.83137 0.83137 0.83529 0.83529 0.83529 0.83529 0.83922 0.83922 0.83922 0.83922 0.84314 0.84314 0.84314 0.84314 0.84706 0.84706 0.84706 0.84706 0.85098 0.85098 0.85098 0.85098 0.85490 0.85490 0.85490 0.85490 0.85882 0.85882 0.85882 0.85882 0.86275 0.86275 0.86275 0.86275 0.86667 0.86667 0.86667 0.86667 0.87059 0.87059 0.87059 0.87059 0.87451 0.87451 0.87451 0.87451 0.87843 0.87843 0.87843 0.87843 0.88235 0.88235 0.88235 0.88235 0.88627 0.88627 0.88627 0.88627 0.89020 0.89020 0.89020 0.89020 0.89412 0.89412 0.89412 0.89412 0.89804 0.89804 0.89804 0.89804 0.90196 0.90196 0.90196 0.90196 0.90588 0.90588 0.90588 0.90588 0.90980 0.90980 0.90980 0.90980 0.91373 0.91373 0.91373 0.91373 0.91765 0.91765 0.91765 0.91765 0.92157 0.92157 0.92157 0.92157 0.92549 0.92549 0.92549 0.92549 0.92941 0.92941 0.92941 0.92941 0.93333 0.93333 0.93333 0.93333 0.93725 0.93725 0.93725 0.93725 0.94118 0.94118 0.94118 0.94118 0.94510 0.94510 0.94510 0.94510 0.94902 0.94902 0.94902 0.94902 0.95294 0.95294 0.95294 0.95294 0.95686 0.95686 0.95686 0.95686 0.96078 0.96078 0.96078 0.96078 0.96471 0.96471 0.96471 0.96471 0.96863 0.96863 0.96863 0.96863 0.97255 0.97255 0.97255 0.97255 0.97647 0.97647 0.97647 0.97647 0.98039 0.98039 0.98039 0.98039 0.98431 0.98431 0.98431 0.98431 0.98824 0.98824 0.98824 0.98824 0.99216 0.99216 0.99216 0.99216 0.99608 0.99608 0.99608 0.99608 1.00000 1.00000 1.00000 1.00000 END_DATA DisplayCAL-3.1.0.0/misc/ti3/softproof.ti30000644000076500000000000005704112647526532017611 0ustar devwheel00000000000000CTI3 DESCRIPTOR "Argyll Calibration Target chart information 3" ORIGINATOR "Argyll dispread" CREATED "Tue Feb 23 08:46:43 2010" KEYWORD "DEVICE_CLASS" DEVICE_CLASS "DISPLAY" KEYWORD "APPROX_WHITE_POINT" APPROX_WHITE_POINT "95.106486 100.000000 108.844025" KEYWORD "COLOR_REP" COLOR_REP "RGB_XYZ" KEYWORD "BLACK_COLOR_PATCHES" BLACK_COLOR_PATCHES "4" KEYWORD "COMP_GREY_STEPS" COMP_GREY_STEPS "49" KEYWORD "MULTI_DIM_BCC_STEPS" MULTI_DIM_BCC_STEPS "5" KEYWORD "MULTI_DIM_STEPS" MULTI_DIM_STEPS "5" KEYWORD "SINGLE_DIM_STEPS" SINGLE_DIM_STEPS "17" KEYWORD "WHITE_COLOR_PATCHES" WHITE_COLOR_PATCHES "4" KEYWORD "USE_BLACK_POINT_COMPENSATION" USE_BLACK_POINT_COMPENSATION "NO" KEYWORD "AUTO_OPTIMIZE" AUTO_OPTIMIZE "6" BEGIN_ARGYLL_COLPROF_ARGS -qh -ax END_ARGYLL_COLPROF_ARGS NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT SAMPLE_ID RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 271 BEGIN_DATA 1 100.000 100.000 100.000 95.1065 100.000 108.844 2 12.5000 37.5000 12.5000 5.94993 9.61866 3.74740 3 12.5000 62.5000 12.5000 14.1814 26.0794 6.49125 4 12.5000 87.5000 87.5000 40.9488 58.8934 79.2939 5 37.5000 87.5000 87.5000 45.0999 61.0337 79.4884 6 0.00000 25.0000 25.0000 3.71049 4.96568 6.38934 7 0.00000 25.0000 50.0000 6.62643 6.13187 21.7479 8 25.0000 75.0000 75.0000 30.9153 42.8005 56.4485 9 50.0000 75.0000 75.0000 37.5774 46.2355 56.7606 10 12.5000 0.00000 0.00000 1.58591 1.30210 1.02745 11 10.4167 10.4167 10.4167 2.00521 2.05749 2.15195 12 25.0000 0.00000 0.00000 3.07728 2.07105 1.09734 13 31.2500 0.00000 0.00000 4.24932 2.67536 1.15226 14 37.5000 0.00000 0.00000 5.73696 3.44239 1.22197 15 43.7500 0.00000 0.00000 7.56070 4.38272 1.30742 16 50.0000 0.00000 0.00000 9.73934 5.50603 1.40951 17 62.5000 37.5000 62.5000 25.5656 19.0418 35.8409 18 87.5000 37.5000 62.5000 41.5030 27.2592 36.5877 19 0.00000 0.00000 0.00000 1.00000 1.00000 1.00000 20 75.0000 0.00000 0.00000 22.3346 12.0002 1.99970 21 81.2500 0.00000 0.00000 26.5283 14.1625 2.19621 22 87.5000 0.00000 0.00000 31.1672 16.5543 2.41358 23 93.7500 0.00000 0.00000 36.2638 19.1821 2.65240 24 100.000 0.00000 0.00000 41.8302 22.0522 2.91323 25 62.5000 62.5000 12.5000 27.8253 33.1142 7.13058 26 75.0000 75.0000 50.0000 44.6598 50.5248 28.3139 27 8.33333 8.33333 8.33333 1.71786 1.75519 1.82265 28 0.00000 12.5000 0.00000 1.50806 2.01598 1.16935 29 0.00000 43.7500 0.00000 6.68900 12.3764 2.89635 30 0.00000 50.0000 0.00000 8.57817 16.1542 3.52608 31 0.00000 56.2500 0.00000 10.7902 20.5776 4.26342 32 0.00000 62.5000 0.00000 13.3391 25.6747 5.11306 33 12.5000 62.5000 37.5000 15.9983 26.8060 16.0610 34 0.00000 0.00000 0.00000 1.00000 1.00000 1.00000 35 0.00000 6.25000 0.00000 1.18254 1.36502 1.06085 36 0.00000 75.0000 0.00000 19.5000 37.9948 7.16671 37 0.00000 81.2500 0.00000 23.1365 45.2667 8.37888 38 0.00000 87.5000 0.00000 27.1590 53.3106 9.71972 39 0.00000 93.7500 0.00000 31.5784 62.1482 11.1929 40 0.00000 100.000 0.00000 36.4052 71.8005 12.8018 41 6.25000 6.25000 6.25000 1.48518 1.51041 1.55601 42 0.00000 0.00000 12.5000 1.25645 1.10256 2.35074 43 0.00000 0.00000 18.7500 1.52439 1.20972 3.76201 44 0.00000 0.00000 25.0000 1.90921 1.36363 5.78891 45 0.00000 0.00000 31.2500 2.42221 1.56879 8.49092 46 0.00000 0.00000 37.5000 3.07334 1.82920 11.9205 47 0.00000 0.00000 43.7500 3.87158 2.14845 16.1249 48 0.00000 0.00000 50.0000 4.82515 2.52982 21.1475 49 0.00000 0.00000 56.2500 5.94168 2.97636 27.0283 50 0.00000 0.00000 62.5000 7.22826 3.49091 33.8049 51 0.00000 0.00000 68.7500 8.69161 4.07616 41.5125 52 0.00000 0.00000 75.0000 10.3380 4.73463 50.1844 53 0.00000 0.00000 81.2500 12.1736 5.46873 59.8524 54 0.00000 0.00000 87.5000 14.2040 6.28076 70.5467 55 0.00000 0.00000 93.7500 16.4347 7.17291 82.2963 56 0.00000 0.00000 100.000 18.8711 8.14731 95.1290 57 0.00000 50.0000 100.000 26.4493 23.3015 97.6550 58 75.0000 50.0000 100.000 47.7839 34.3017 98.6547 59 0.00000 0.00000 6.25000 1.09214 1.03685 1.48530 60 2.08333 2.08333 2.08333 1.15175 1.15964 1.17390 61 4.16667 4.16667 4.16667 1.30372 1.31952 1.34806 62 12.5000 12.5000 12.5000 2.35042 2.42064 2.54755 63 14.5833 14.5833 14.5833 2.75638 2.84772 3.01278 64 16.6667 16.6667 16.6667 3.22584 3.34159 3.55077 65 18.7500 18.7500 18.7500 3.76135 3.90494 4.16445 66 20.8333 20.8333 20.8333 4.36533 4.54033 4.85660 67 22.9167 22.9167 22.9167 5.04007 5.25016 5.62984 68 25.0000 25.0000 25.0000 5.78777 6.03673 6.48668 69 27.0833 27.0833 27.0833 6.61052 6.90226 7.42953 70 29.1667 29.1667 29.1667 7.51032 7.84886 8.46069 71 31.2500 31.2500 31.2500 8.48913 8.87856 9.58238 72 6.25000 0.00000 0.00000 1.21051 1.10854 1.00986 73 33.3333 33.3333 33.3333 9.54879 9.99333 10.7967 74 35.4167 35.4167 35.4167 10.6911 11.1951 12.1058 75 39.5833 39.5833 39.5833 13.2307 13.8667 15.0161 76 41.6667 41.6667 41.6667 14.6313 15.3402 16.6212 77 43.7500 43.7500 43.7500 16.1213 16.9076 18.3287 78 45.8333 45.8333 45.8333 17.7021 18.5707 20.1403 79 47.9167 47.9167 47.9167 19.3754 20.3310 22.0579 80 50.0000 50.0000 50.0000 21.1427 22.1901 24.0831 81 52.0833 52.0833 52.0833 23.0052 24.1495 26.2175 82 54.1667 54.1667 54.1667 24.9646 26.2107 28.4629 83 56.2500 56.2500 56.2500 27.0221 28.3752 30.8208 84 58.3333 58.3333 58.3333 29.1791 30.6444 33.2927 85 60.4167 60.4167 60.4167 31.4370 33.0197 35.8802 86 62.5000 62.5000 62.5000 33.7971 35.5025 38.5847 87 64.5833 64.5833 64.5833 36.2605 38.0941 41.4078 88 66.6667 66.6667 66.6667 38.8287 40.7958 44.3509 89 68.7500 68.7500 68.7500 41.5028 43.6089 47.4154 90 70.8333 70.8333 70.8333 44.2840 46.5348 50.6026 91 72.9167 72.9167 72.9167 47.1736 49.5746 53.9140 92 75.0000 75.0000 75.0000 50.1727 52.7296 57.3508 93 77.0833 77.0833 77.0833 53.2824 56.0011 60.9145 94 79.1667 79.1667 79.1667 56.5039 59.3901 64.6063 95 81.2500 81.2500 81.2500 59.8383 62.8979 68.4275 96 83.3333 83.3333 83.3333 63.2868 66.5257 72.3793 97 85.4167 85.4167 85.4167 66.8503 70.2745 76.4631 98 87.5000 87.5000 87.5000 70.5301 74.1456 80.6800 99 89.5833 89.5833 89.5833 74.3270 78.1400 85.0312 100 91.6667 91.6667 91.6667 78.2423 82.2589 89.5180 101 93.7500 93.7500 93.7500 82.2769 86.5032 94.1415 102 95.8333 95.8333 95.8333 86.4317 90.8742 98.9029 103 97.9167 97.9167 97.9167 90.7080 95.3727 103.803 104 25.0000 25.0000 0.00000 4.87856 5.67311 1.69777 105 50.0000 25.0000 0.00000 11.5406 9.10808 2.00994 106 75.0000 25.0000 0.00000 24.1359 15.6023 2.60014 107 100.000 25.0000 0.00000 43.6314 25.6542 3.51366 108 100.000 75.0000 0.00000 60.3302 59.0470 9.07994 109 50.0000 50.0000 0.00000 17.3175 20.6603 3.93559 110 75.0000 50.0000 0.00000 29.9128 27.1544 4.52578 111 100.000 50.0000 0.00000 49.4083 37.2064 5.43931 112 100.000 100.000 100.000 95.1065 100.000 108.844 113 50.0000 75.0000 0.00000 28.2393 42.5008 7.57622 114 75.0000 75.0000 0.00000 40.8346 48.9950 8.16642 115 25.0000 75.0000 0.00000 21.5773 39.0658 7.26405 116 25.0000 100.000 0.00000 38.4825 72.8716 12.8992 117 50.0000 100.000 0.00000 45.1445 76.3065 13.2113 118 75.0000 100.000 0.00000 57.7399 82.8007 13.8015 119 100.000 100.000 0.00000 77.2354 92.8527 14.7151 120 25.0000 0.00000 25.0000 3.98649 2.43468 5.88625 121 50.0000 0.00000 25.0000 10.6485 5.86966 6.19842 122 75.0000 0.00000 25.0000 23.2439 12.3638 6.78862 123 75.0000 25.0000 25.0000 25.0451 15.9659 7.38905 124 87.5000 37.5000 37.5000 37.3481 25.5975 14.7033 125 56.2500 0.00000 0.00000 12.2903 6.82130 1.52904 126 100.000 0.00000 25.0000 42.7394 22.4158 7.70214 127 100.000 25.0000 25.0000 44.5407 26.0178 8.30257 128 100.000 25.0000 50.0000 47.4566 27.1840 23.6611 129 50.0000 25.0000 25.0000 12.4498 9.47171 6.79885 130 50.0000 50.0000 25.0000 18.2267 21.0239 8.72450 131 75.0000 50.0000 25.0000 30.8220 27.5181 9.31470 132 100.000 50.0000 25.0000 50.3176 37.5700 10.2282 133 25.0000 50.0000 25.0000 11.5647 17.5889 8.41233 134 25.0000 75.0000 25.0000 22.4865 39.4295 12.0530 135 50.0000 75.0000 25.0000 29.1485 42.8645 12.3651 136 75.0000 75.0000 25.0000 41.7438 49.3586 12.9553 137 100.000 75.0000 25.0000 61.2394 59.4106 13.8689 138 25.0000 50.0000 0.00000 10.6555 17.2253 3.62342 139 25.0000 100.000 25.0000 39.3917 73.2352 17.6881 140 50.0000 100.000 25.0000 46.0538 76.6702 18.0003 141 75.0000 100.000 25.0000 58.6491 83.1644 18.5905 142 100.000 100.000 25.0000 78.1446 93.2163 19.5040 143 25.0000 0.00000 50.0000 6.90243 3.60087 21.2448 144 50.0000 0.00000 50.0000 13.5645 7.03585 21.5570 145 75.0000 0.00000 50.0000 26.1598 13.5300 22.1472 146 100.000 0.00000 50.0000 45.6553 23.5820 23.0607 147 100.000 50.0000 75.0000 58.7464 40.9410 54.6237 148 100.000 50.0000 100.000 67.2794 44.3537 99.5683 149 50.0000 25.0000 50.0000 15.3658 10.6379 22.1574 150 75.0000 25.0000 50.0000 27.9611 17.1321 22.7476 151 100.000 25.0000 75.0000 52.9695 29.3888 52.6981 152 25.0000 25.0000 50.0000 8.70371 7.20292 21.8452 153 25.0000 50.0000 50.0000 14.4806 18.7551 23.7709 154 75.0000 50.0000 50.0000 33.7380 28.6843 24.6733 155 100.000 50.0000 50.0000 53.2335 38.7362 25.5868 156 100.000 75.0000 50.0000 64.1553 60.5768 29.2274 157 87.5000 62.5000 62.5000 49.7345 43.7199 39.3315 158 87.5000 87.5000 62.5000 63.5544 71.3558 43.9382 159 100.000 100.000 75.0000 86.5734 96.5873 63.8995 160 0.00000 68.7500 0.00000 16.2382 31.4721 6.07943 161 0.00000 100.000 25.0000 37.3144 72.1641 17.5907 162 0.00000 100.000 50.0000 40.2304 73.3303 32.9493 163 50.0000 100.000 50.0000 48.9697 77.8364 33.3588 164 75.0000 100.000 50.0000 61.5650 84.3305 33.9490 165 100.000 100.000 50.0000 81.0605 94.3825 34.8625 166 25.0000 0.00000 75.0000 12.4153 5.80568 50.2817 167 50.0000 0.00000 75.0000 19.0774 9.24066 50.5939 168 75.0000 0.00000 75.0000 31.6727 15.7348 51.1841 169 100.000 0.00000 75.0000 51.1682 25.7868 52.0976 170 100.000 0.00000 100.000 59.7013 29.1995 97.0422 171 25.0000 25.0000 75.0000 14.2166 9.40773 50.8822 172 50.0000 25.0000 75.0000 20.8787 12.8427 51.1944 173 75.0000 25.0000 75.0000 33.4740 19.3369 51.7845 174 0.00000 31.2500 0.00000 3.81760 6.63441 1.93921 175 0.00000 37.5000 0.00000 5.10758 9.21400 2.36920 176 25.0000 50.0000 75.0000 19.9935 20.9599 52.8078 177 50.0000 50.0000 75.0000 26.6555 24.3949 53.1200 178 75.0000 50.0000 75.0000 39.2509 30.8891 53.7102 179 100.000 75.0000 75.0000 69.6682 62.7816 58.2644 180 100.000 75.0000 100.000 78.2013 66.1943 103.209 181 0.00000 0.00000 0.00000 1.00000 1.00000 1.00000 182 12.5000 37.5000 37.5000 7.76682 10.3453 13.3171 183 25.0000 75.0000 50.0000 25.4024 40.5957 27.4115 184 25.0000 100.000 50.0000 42.3076 74.4014 33.0466 185 25.0000 100.000 75.0000 47.8205 76.6062 62.0836 186 50.0000 100.000 75.0000 54.4826 80.0412 62.3958 187 75.0000 100.000 75.0000 67.0779 86.5354 62.9859 188 100.000 100.000 100.000 95.1065 100.000 108.844 189 25.0000 0.00000 100.000 20.9484 9.21837 95.2263 190 50.0000 0.00000 100.000 27.6104 12.6533 95.5385 191 75.0000 0.00000 100.000 40.2058 19.1475 96.1287 192 75.0000 75.0000 100.000 58.7057 56.1423 102.295 193 0.00000 25.0000 100.000 20.6724 11.7494 95.7294 194 25.0000 25.0000 100.000 22.7497 12.8204 95.8267 195 50.0000 25.0000 100.000 29.4117 16.2554 96.1389 196 75.0000 25.0000 100.000 42.0070 22.7496 96.7291 197 100.000 25.0000 100.000 61.5026 32.8015 97.6426 198 0.00000 0.00000 0.00000 1.00000 1.00000 1.00000 199 25.0000 50.0000 100.000 28.5266 24.3726 97.7524 200 50.0000 50.0000 100.000 35.1886 27.8076 98.0645 201 50.0000 75.0000 100.000 46.1104 49.6481 101.705 202 12.5000 62.5000 62.5000 20.1532 28.4677 37.9454 203 12.5000 62.5000 87.5000 27.1290 31.2576 74.6872 204 25.0000 75.0000 100.000 39.4484 46.2132 101.393 205 0.00000 50.0000 50.0000 12.4033 17.6840 23.6735 206 0.00000 75.0000 75.0000 28.8380 41.7294 56.3511 207 0.00000 100.000 75.0000 45.7432 75.5351 61.9862 208 0.00000 100.000 100.000 54.2763 78.9478 106.931 209 25.0000 100.000 100.000 56.3536 80.0189 107.028 210 50.0000 100.000 100.000 63.0157 83.4539 107.340 211 75.0000 100.000 100.000 75.6110 89.9480 107.930 212 62.5000 0.00000 0.00000 15.2297 8.33690 1.66678 213 68.7500 0.00000 0.00000 18.5730 10.0607 1.82344 214 100.000 100.000 100.000 95.1065 100.000 108.844 215 0.00000 25.0000 0.00000 2.80128 4.60205 1.60043 216 37.5000 37.5000 12.5000 10.1010 11.7590 3.94191 217 62.5000 37.5000 12.5000 19.5938 16.6535 4.38672 218 87.5000 37.5000 12.5000 35.5312 24.8708 5.13352 219 37.5000 12.5000 12.5000 6.50147 4.56093 2.74206 220 62.5000 12.5000 12.5000 15.9942 9.45544 3.18687 221 87.5000 12.5000 12.5000 31.9317 17.6728 3.93367 222 87.5000 62.5000 12.5000 43.7627 41.3315 7.87738 223 37.5000 62.5000 12.5000 18.3325 28.2197 6.68576 224 37.5000 87.5000 12.5000 32.1524 55.8555 11.2924 225 62.5000 87.5000 12.5000 41.6451 60.7500 11.7372 226 87.5000 87.5000 12.5000 57.5826 68.9674 12.4840 227 12.5000 12.5000 37.5000 4.16730 3.14728 12.1173 228 37.5000 12.5000 37.5000 8.31836 5.28757 12.3118 229 62.5000 12.5000 37.5000 17.8111 10.1821 12.7566 230 87.5000 12.5000 37.5000 33.7486 18.3995 13.5034 231 87.5000 62.5000 37.5000 45.5796 42.0582 17.4471 232 62.5000 37.5000 37.5000 21.4106 17.3801 13.9565 233 62.5000 62.5000 37.5000 29.6421 33.8408 16.7003 234 37.5000 37.5000 37.5000 11.9179 12.4856 13.5116 235 37.5000 62.5000 37.5000 20.1494 28.9463 16.2555 236 50.0000 75.0000 50.0000 32.0645 44.0306 27.7237 237 12.5000 87.5000 12.5000 28.0013 53.7152 11.0979 238 12.5000 87.5000 37.5000 29.8182 54.4419 20.6677 239 37.5000 87.5000 37.5000 33.9692 56.5822 20.8622 240 62.5000 87.5000 37.5000 43.4620 61.4767 21.3070 241 87.5000 87.5000 37.5000 59.3994 69.6941 22.0538 242 18.7500 0.00000 0.00000 2.19807 1.61773 1.05614 243 37.5000 12.5000 62.5000 12.4733 6.94928 34.1962 244 62.5000 12.5000 62.5000 21.9661 11.8438 34.6410 245 87.5000 12.5000 62.5000 37.9035 20.0612 35.3878 246 87.5000 12.5000 87.5000 44.8792 22.8510 72.1296 247 87.5000 37.5000 87.5000 48.4787 30.0490 73.3295 248 87.5000 62.5000 87.5000 56.7102 46.5097 76.0733 249 0.00000 18.7500 0.00000 2.03889 3.07749 1.34630 250 0.00000 50.0000 25.0000 9.48738 16.5179 8.31499 251 0.00000 75.0000 25.0000 20.4092 38.3584 11.9556 252 0.00000 75.0000 50.0000 23.3251 39.5246 27.3142 253 12.5000 87.5000 62.5000 33.9731 56.1036 42.5521 254 37.5000 87.5000 62.5000 38.1242 58.2439 42.7466 255 62.5000 87.5000 62.5000 47.6169 63.1384 43.1914 256 12.5000 12.5000 62.5000 8.32223 4.80899 34.0017 257 12.5000 12.5000 87.5000 15.2979 7.59883 70.7435 258 37.5000 12.5000 87.5000 19.4490 9.73913 70.9380 259 62.5000 12.5000 87.5000 28.9418 14.6336 71.3828 260 12.5000 37.5000 62.5000 11.9217 12.0070 35.2016 261 12.5000 37.5000 87.5000 18.8975 14.7969 71.9433 262 37.5000 37.5000 87.5000 23.0485 16.9371 72.1379 263 62.5000 37.5000 87.5000 32.5413 21.8317 72.5827 264 37.5000 37.5000 62.5000 16.0728 14.1473 35.3961 265 37.5000 62.5000 62.5000 24.3043 30.6080 38.1399 266 37.5000 62.5000 87.5000 31.2800 33.3978 74.8817 267 62.5000 62.5000 87.5000 40.7728 38.2924 75.3265 268 62.5000 87.5000 87.5000 54.5927 65.9282 79.9332 269 0.00000 25.0000 75.0000 12.1393 8.33668 50.7848 270 0.00000 50.0000 75.0000 17.9162 19.8888 52.7105 271 0.00000 75.0000 100.000 37.3711 45.1421 101.296 END_DATA CAL DESCRIPTOR "Argyll Device Calibration State" ORIGINATOR "Argyll dispcal" CREATED "Sat Mar 14 19:07:36 2009" KEYWORD "DEVICE_CLASS" DEVICE_CLASS "DISPLAY" KEYWORD "COLOR_REP" COLOR_REP "RGB" BEGIN_ARGYLL_DISPCAL_ARGS -qm -t5500 -b160 -gl -f1 -k1 END_ARGYLL_DISPCAL_ARGS KEYWORD "RGB_I" NUMBER_OF_FIELDS 4 BEGIN_DATA_FORMAT RGB_I RGB_R RGB_G RGB_B END_DATA_FORMAT NUMBER_OF_SETS 256 BEGIN_DATA 0.00000 0.00000 0.00000 0.00000 0.00392 0.00392 0.00392 0.00392 0.00784 0.00784 0.00784 0.00784 0.01176 0.01176 0.01176 0.01176 0.01569 0.01569 0.01569 0.01569 0.01961 0.01961 0.01961 0.01961 0.02353 0.02353 0.02353 0.02353 0.02745 0.02745 0.02745 0.02745 0.03137 0.03137 0.03137 0.03137 0.03529 0.03529 0.03529 0.03529 0.03922 0.03922 0.03922 0.03922 0.04314 0.04314 0.04314 0.04314 0.04706 0.04706 0.04706 0.04706 0.05098 0.05098 0.05098 0.05098 0.05490 0.05490 0.05490 0.05490 0.05882 0.05882 0.05882 0.05882 0.06275 0.06275 0.06275 0.06275 0.06667 0.06667 0.06667 0.06667 0.07059 0.07059 0.07059 0.07059 0.07451 0.07451 0.07451 0.07451 0.07843 0.07843 0.07843 0.07843 0.08235 0.08235 0.08235 0.08235 0.08627 0.08627 0.08627 0.08627 0.09020 0.09020 0.09020 0.09020 0.09412 0.09412 0.09412 0.09412 0.09804 0.09804 0.09804 0.09804 0.10196 0.10196 0.10196 0.10196 0.10588 0.10588 0.10588 0.10588 0.10980 0.10980 0.10980 0.10980 0.11373 0.11373 0.11373 0.11373 0.11765 0.11765 0.11765 0.11765 0.12157 0.12157 0.12157 0.12157 0.12549 0.12549 0.12549 0.12549 0.12941 0.12941 0.12941 0.12941 0.13333 0.13333 0.13333 0.13333 0.13725 0.13725 0.13725 0.13725 0.14118 0.14118 0.14118 0.14118 0.14510 0.14510 0.14510 0.14510 0.14902 0.14902 0.14902 0.14902 0.15294 0.15294 0.15294 0.15294 0.15686 0.15686 0.15686 0.15686 0.16078 0.16078 0.16078 0.16078 0.16471 0.16471 0.16471 0.16471 0.16863 0.16863 0.16863 0.16863 0.17255 0.17255 0.17255 0.17255 0.17647 0.17647 0.17647 0.17647 0.18039 0.18039 0.18039 0.18039 0.18431 0.18431 0.18431 0.18431 0.18824 0.18824 0.18824 0.18824 0.19216 0.19216 0.19216 0.19216 0.19608 0.19608 0.19608 0.19608 0.20000 0.20000 0.20000 0.20000 0.20392 0.20392 0.20392 0.20392 0.20784 0.20784 0.20784 0.20784 0.21176 0.21176 0.21176 0.21176 0.21569 0.21569 0.21569 0.21569 0.21961 0.21961 0.21961 0.21961 0.22353 0.22353 0.22353 0.22353 0.22745 0.22745 0.22745 0.22745 0.23137 0.23137 0.23137 0.23137 0.23529 0.23529 0.23529 0.23529 0.23922 0.23922 0.23922 0.23922 0.24314 0.24314 0.24314 0.24314 0.24706 0.24706 0.24706 0.24706 0.25098 0.25098 0.25098 0.25098 0.25490 0.25490 0.25490 0.25490 0.25882 0.25882 0.25882 0.25882 0.26275 0.26275 0.26275 0.26275 0.26667 0.26667 0.26667 0.26667 0.27059 0.27059 0.27059 0.27059 0.27451 0.27451 0.27451 0.27451 0.27843 0.27843 0.27843 0.27843 0.28235 0.28235 0.28235 0.28235 0.28627 0.28627 0.28627 0.28627 0.29020 0.29020 0.29020 0.29020 0.29412 0.29412 0.29412 0.29412 0.29804 0.29804 0.29804 0.29804 0.30196 0.30196 0.30196 0.30196 0.30588 0.30588 0.30588 0.30588 0.30980 0.30980 0.30980 0.30980 0.31373 0.31373 0.31373 0.31373 0.31765 0.31765 0.31765 0.31765 0.32157 0.32157 0.32157 0.32157 0.32549 0.32549 0.32549 0.32549 0.32941 0.32941 0.32941 0.32941 0.33333 0.33333 0.33333 0.33333 0.33725 0.33725 0.33725 0.33725 0.34118 0.34118 0.34118 0.34118 0.34510 0.34510 0.34510 0.34510 0.34902 0.34902 0.34902 0.34902 0.35294 0.35294 0.35294 0.35294 0.35686 0.35686 0.35686 0.35686 0.36078 0.36078 0.36078 0.36078 0.36471 0.36471 0.36471 0.36471 0.36863 0.36863 0.36863 0.36863 0.37255 0.37255 0.37255 0.37255 0.37647 0.37647 0.37647 0.37647 0.38039 0.38039 0.38039 0.38039 0.38431 0.38431 0.38431 0.38431 0.38824 0.38824 0.38824 0.38824 0.39216 0.39216 0.39216 0.39216 0.39608 0.39608 0.39608 0.39608 0.40000 0.40000 0.40000 0.40000 0.40392 0.40392 0.40392 0.40392 0.40784 0.40784 0.40784 0.40784 0.41176 0.41176 0.41176 0.41176 0.41569 0.41569 0.41569 0.41569 0.41961 0.41961 0.41961 0.41961 0.42353 0.42353 0.42353 0.42353 0.42745 0.42745 0.42745 0.42745 0.43137 0.43137 0.43137 0.43137 0.43529 0.43529 0.43529 0.43529 0.43922 0.43922 0.43922 0.43922 0.44314 0.44314 0.44314 0.44314 0.44706 0.44706 0.44706 0.44706 0.45098 0.45098 0.45098 0.45098 0.45490 0.45490 0.45490 0.45490 0.45882 0.45882 0.45882 0.45882 0.46275 0.46275 0.46275 0.46275 0.46667 0.46667 0.46667 0.46667 0.47059 0.47059 0.47059 0.47059 0.47451 0.47451 0.47451 0.47451 0.47843 0.47843 0.47843 0.47843 0.48235 0.48235 0.48235 0.48235 0.48627 0.48627 0.48627 0.48627 0.49020 0.49020 0.49020 0.49020 0.49412 0.49412 0.49412 0.49412 0.49804 0.49804 0.49804 0.49804 0.50196 0.50196 0.50196 0.50196 0.50588 0.50588 0.50588 0.50588 0.50980 0.50980 0.50980 0.50980 0.51373 0.51373 0.51373 0.51373 0.51765 0.51765 0.51765 0.51765 0.52157 0.52157 0.52157 0.52157 0.52549 0.52549 0.52549 0.52549 0.52941 0.52941 0.52941 0.52941 0.53333 0.53333 0.53333 0.53333 0.53725 0.53725 0.53725 0.53725 0.54118 0.54118 0.54118 0.54118 0.54510 0.54510 0.54510 0.54510 0.54902 0.54902 0.54902 0.54902 0.55294 0.55294 0.55294 0.55294 0.55686 0.55686 0.55686 0.55686 0.56078 0.56078 0.56078 0.56078 0.56471 0.56471 0.56471 0.56471 0.56863 0.56863 0.56863 0.56863 0.57255 0.57255 0.57255 0.57255 0.57647 0.57647 0.57647 0.57647 0.58039 0.58039 0.58039 0.58039 0.58431 0.58431 0.58431 0.58431 0.58824 0.58824 0.58824 0.58824 0.59216 0.59216 0.59216 0.59216 0.59608 0.59608 0.59608 0.59608 0.60000 0.60000 0.60000 0.60000 0.60392 0.60392 0.60392 0.60392 0.60784 0.60784 0.60784 0.60784 0.61176 0.61176 0.61176 0.61176 0.61569 0.61569 0.61569 0.61569 0.61961 0.61961 0.61961 0.61961 0.62353 0.62353 0.62353 0.62353 0.62745 0.62745 0.62745 0.62745 0.63137 0.63137 0.63137 0.63137 0.63529 0.63529 0.63529 0.63529 0.63922 0.63922 0.63922 0.63922 0.64314 0.64314 0.64314 0.64314 0.64706 0.64706 0.64706 0.64706 0.65098 0.65098 0.65098 0.65098 0.65490 0.65490 0.65490 0.65490 0.65882 0.65882 0.65882 0.65882 0.66275 0.66275 0.66275 0.66275 0.66667 0.66667 0.66667 0.66667 0.67059 0.67059 0.67059 0.67059 0.67451 0.67451 0.67451 0.67451 0.67843 0.67843 0.67843 0.67843 0.68235 0.68235 0.68235 0.68235 0.68627 0.68627 0.68627 0.68627 0.69020 0.69020 0.69020 0.69020 0.69412 0.69412 0.69412 0.69412 0.69804 0.69804 0.69804 0.69804 0.70196 0.70196 0.70196 0.70196 0.70588 0.70588 0.70588 0.70588 0.70980 0.70980 0.70980 0.70980 0.71373 0.71373 0.71373 0.71373 0.71765 0.71765 0.71765 0.71765 0.72157 0.72157 0.72157 0.72157 0.72549 0.72549 0.72549 0.72549 0.72941 0.72941 0.72941 0.72941 0.73333 0.73333 0.73333 0.73333 0.73725 0.73725 0.73725 0.73725 0.74118 0.74118 0.74118 0.74118 0.74510 0.74510 0.74510 0.74510 0.74902 0.74902 0.74902 0.74902 0.75294 0.75294 0.75294 0.75294 0.75686 0.75686 0.75686 0.75686 0.76078 0.76078 0.76078 0.76078 0.76471 0.76471 0.76471 0.76471 0.76863 0.76863 0.76863 0.76863 0.77255 0.77255 0.77255 0.77255 0.77647 0.77647 0.77647 0.77647 0.78039 0.78039 0.78039 0.78039 0.78431 0.78431 0.78431 0.78431 0.78824 0.78824 0.78824 0.78824 0.79216 0.79216 0.79216 0.79216 0.79608 0.79608 0.79608 0.79608 0.80000 0.80000 0.80000 0.80000 0.80392 0.80392 0.80392 0.80392 0.80784 0.80784 0.80784 0.80784 0.81176 0.81176 0.81176 0.81176 0.81569 0.81569 0.81569 0.81569 0.81961 0.81961 0.81961 0.81961 0.82353 0.82353 0.82353 0.82353 0.82745 0.82745 0.82745 0.82745 0.83137 0.83137 0.83137 0.83137 0.83529 0.83529 0.83529 0.83529 0.83922 0.83922 0.83922 0.83922 0.84314 0.84314 0.84314 0.84314 0.84706 0.84706 0.84706 0.84706 0.85098 0.85098 0.85098 0.85098 0.85490 0.85490 0.85490 0.85490 0.85882 0.85882 0.85882 0.85882 0.86275 0.86275 0.86275 0.86275 0.86667 0.86667 0.86667 0.86667 0.87059 0.87059 0.87059 0.87059 0.87451 0.87451 0.87451 0.87451 0.87843 0.87843 0.87843 0.87843 0.88235 0.88235 0.88235 0.88235 0.88627 0.88627 0.88627 0.88627 0.89020 0.89020 0.89020 0.89020 0.89412 0.89412 0.89412 0.89412 0.89804 0.89804 0.89804 0.89804 0.90196 0.90196 0.90196 0.90196 0.90588 0.90588 0.90588 0.90588 0.90980 0.90980 0.90980 0.90980 0.91373 0.91373 0.91373 0.91373 0.91765 0.91765 0.91765 0.91765 0.92157 0.92157 0.92157 0.92157 0.92549 0.92549 0.92549 0.92549 0.92941 0.92941 0.92941 0.92941 0.93333 0.93333 0.93333 0.93333 0.93725 0.93725 0.93725 0.93725 0.94118 0.94118 0.94118 0.94118 0.94510 0.94510 0.94510 0.94510 0.94902 0.94902 0.94902 0.94902 0.95294 0.95294 0.95294 0.95294 0.95686 0.95686 0.95686 0.95686 0.96078 0.96078 0.96078 0.96078 0.96471 0.96471 0.96471 0.96471 0.96863 0.96863 0.96863 0.96863 0.97255 0.97255 0.97255 0.97255 0.97647 0.97647 0.97647 0.97647 0.98039 0.98039 0.98039 0.98039 0.98431 0.98431 0.98431 0.98431 0.98824 0.98824 0.98824 0.98824 0.99216 0.99216 0.99216 0.99216 0.99608 0.99608 0.99608 0.99608 1.00000 1.00000 1.00000 1.00000 END_DATA DisplayCAL-3.1.0.0/misc/ti3/sRGB.ti30000644000076500000000000005673112647526532016372 0ustar devwheel00000000000000CTI3 DESCRIPTOR "Argyll Calibration Target chart information 3" ORIGINATOR "Argyll dispread" CREATED "Sat Mar 14 19:00:55 2009" KEYWORD "DEVICE_CLASS" DEVICE_CLASS "DISPLAY" KEYWORD "APPROX_WHITE_POINT" APPROX_WHITE_POINT "95.106486 100.000000 108.844025" KEYWORD "COLOR_REP" COLOR_REP "RGB_XYZ" KEYWORD "BLACK_COLOR_PATCHES" BLACK_COLOR_PATCHES "4" KEYWORD "COMP_GREY_STEPS" COMP_GREY_STEPS "49" KEYWORD "MULTI_DIM_BCC_STEPS" MULTI_DIM_BCC_STEPS "5" KEYWORD "MULTI_DIM_STEPS" MULTI_DIM_STEPS "5" KEYWORD "SINGLE_DIM_STEPS" SINGLE_DIM_STEPS "17" KEYWORD "WHITE_COLOR_PATCHES" WHITE_COLOR_PATCHES "4" KEYWORD "AUTO_OPTIMIZE" AUTO_OPTIMIZE "6" BEGIN_ARGYLL_COLPROF_ARGS -qh -aX END_ARGYLL_COLPROF_ARGS NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT SAMPLE_ID RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 271 BEGIN_DATA 1 100.000 100.000 100.000 95.1065 100.000 108.844 2 12.5000 37.5000 12.5000 5.94993 9.61866 3.74740 3 12.5000 62.5000 12.5000 14.1814 26.0794 6.49125 4 12.5000 87.5000 87.5000 40.9488 58.8934 79.2939 5 37.5000 87.5000 87.5000 45.0999 61.0337 79.4884 6 0.00000 25.0000 25.0000 3.71049 4.96568 6.38934 7 0.00000 25.0000 50.0000 6.62643 6.13187 21.7479 8 25.0000 75.0000 75.0000 30.9153 42.8005 56.4485 9 50.0000 75.0000 75.0000 37.5774 46.2355 56.7606 10 12.5000 0.00000 0.00000 1.58591 1.30210 1.02745 11 10.4167 10.4167 10.4167 2.00521 2.05749 2.15195 12 25.0000 0.00000 0.00000 3.07728 2.07105 1.09734 13 31.2500 0.00000 0.00000 4.24932 2.67536 1.15226 14 37.5000 0.00000 0.00000 5.73696 3.44239 1.22197 15 43.7500 0.00000 0.00000 7.56070 4.38272 1.30742 16 50.0000 0.00000 0.00000 9.73934 5.50603 1.40951 17 62.5000 37.5000 62.5000 25.5656 19.0418 35.8409 18 87.5000 37.5000 62.5000 41.5030 27.2592 36.5877 19 0.00000 0.00000 0.00000 1.00000 1.00000 1.00000 20 75.0000 0.00000 0.00000 22.3346 12.0002 1.99970 21 81.2500 0.00000 0.00000 26.5283 14.1625 2.19621 22 87.5000 0.00000 0.00000 31.1672 16.5543 2.41358 23 93.7500 0.00000 0.00000 36.2638 19.1821 2.65240 24 100.000 0.00000 0.00000 41.8302 22.0522 2.91323 25 62.5000 62.5000 12.5000 27.8253 33.1142 7.13058 26 75.0000 75.0000 50.0000 44.6598 50.5248 28.3139 27 8.33333 8.33333 8.33333 1.71786 1.75519 1.82265 28 0.00000 12.5000 0.00000 1.50806 2.01598 1.16935 29 0.00000 43.7500 0.00000 6.68900 12.3764 2.89635 30 0.00000 50.0000 0.00000 8.57817 16.1542 3.52608 31 0.00000 56.2500 0.00000 10.7902 20.5776 4.26342 32 0.00000 62.5000 0.00000 13.3391 25.6747 5.11306 33 12.5000 62.5000 37.5000 15.9983 26.8060 16.0610 34 0.00000 0.00000 0.00000 1.00000 1.00000 1.00000 35 0.00000 6.25000 0.00000 1.18254 1.36502 1.06085 36 0.00000 75.0000 0.00000 19.5000 37.9948 7.16671 37 0.00000 81.2500 0.00000 23.1365 45.2667 8.37888 38 0.00000 87.5000 0.00000 27.1590 53.3106 9.71972 39 0.00000 93.7500 0.00000 31.5784 62.1482 11.1929 40 0.00000 100.000 0.00000 36.4052 71.8005 12.8018 41 6.25000 6.25000 6.25000 1.48518 1.51041 1.55601 42 0.00000 0.00000 12.5000 1.25645 1.10256 2.35074 43 0.00000 0.00000 18.7500 1.52439 1.20972 3.76201 44 0.00000 0.00000 25.0000 1.90921 1.36363 5.78891 45 0.00000 0.00000 31.2500 2.42221 1.56879 8.49092 46 0.00000 0.00000 37.5000 3.07334 1.82920 11.9205 47 0.00000 0.00000 43.7500 3.87158 2.14845 16.1249 48 0.00000 0.00000 50.0000 4.82515 2.52982 21.1475 49 0.00000 0.00000 56.2500 5.94168 2.97636 27.0283 50 0.00000 0.00000 62.5000 7.22826 3.49091 33.8049 51 0.00000 0.00000 68.7500 8.69161 4.07616 41.5125 52 0.00000 0.00000 75.0000 10.3380 4.73463 50.1844 53 0.00000 0.00000 81.2500 12.1736 5.46873 59.8524 54 0.00000 0.00000 87.5000 14.2040 6.28076 70.5467 55 0.00000 0.00000 93.7500 16.4347 7.17291 82.2963 56 0.00000 0.00000 100.000 18.8711 8.14731 95.1290 57 0.00000 50.0000 100.000 26.4493 23.3015 97.6550 58 75.0000 50.0000 100.000 47.7839 34.3017 98.6547 59 0.00000 0.00000 6.25000 1.09214 1.03685 1.48530 60 2.08333 2.08333 2.08333 1.15175 1.15964 1.17390 61 4.16667 4.16667 4.16667 1.30372 1.31952 1.34806 62 12.5000 12.5000 12.5000 2.35042 2.42064 2.54755 63 14.5833 14.5833 14.5833 2.75638 2.84772 3.01278 64 16.6667 16.6667 16.6667 3.22584 3.34159 3.55077 65 18.7500 18.7500 18.7500 3.76135 3.90494 4.16445 66 20.8333 20.8333 20.8333 4.36533 4.54033 4.85660 67 22.9167 22.9167 22.9167 5.04007 5.25016 5.62984 68 25.0000 25.0000 25.0000 5.78777 6.03673 6.48668 69 27.0833 27.0833 27.0833 6.61052 6.90226 7.42953 70 29.1667 29.1667 29.1667 7.51032 7.84886 8.46069 71 31.2500 31.2500 31.2500 8.48913 8.87856 9.58238 72 6.25000 0.00000 0.00000 1.21051 1.10854 1.00986 73 33.3333 33.3333 33.3333 9.54879 9.99333 10.7967 74 35.4167 35.4167 35.4167 10.6911 11.1951 12.1058 75 39.5833 39.5833 39.5833 13.2307 13.8667 15.0161 76 41.6667 41.6667 41.6667 14.6313 15.3402 16.6212 77 43.7500 43.7500 43.7500 16.1213 16.9076 18.3287 78 45.8333 45.8333 45.8333 17.7021 18.5707 20.1403 79 47.9167 47.9167 47.9167 19.3754 20.3310 22.0579 80 50.0000 50.0000 50.0000 21.1427 22.1901 24.0831 81 52.0833 52.0833 52.0833 23.0052 24.1495 26.2175 82 54.1667 54.1667 54.1667 24.9646 26.2107 28.4629 83 56.2500 56.2500 56.2500 27.0221 28.3752 30.8208 84 58.3333 58.3333 58.3333 29.1791 30.6444 33.2927 85 60.4167 60.4167 60.4167 31.4370 33.0197 35.8802 86 62.5000 62.5000 62.5000 33.7971 35.5025 38.5847 87 64.5833 64.5833 64.5833 36.2605 38.0941 41.4078 88 66.6667 66.6667 66.6667 38.8287 40.7958 44.3509 89 68.7500 68.7500 68.7500 41.5028 43.6089 47.4154 90 70.8333 70.8333 70.8333 44.2840 46.5348 50.6026 91 72.9167 72.9167 72.9167 47.1736 49.5746 53.9140 92 75.0000 75.0000 75.0000 50.1727 52.7296 57.3508 93 77.0833 77.0833 77.0833 53.2824 56.0011 60.9145 94 79.1667 79.1667 79.1667 56.5039 59.3901 64.6063 95 81.2500 81.2500 81.2500 59.8383 62.8979 68.4275 96 83.3333 83.3333 83.3333 63.2868 66.5257 72.3793 97 85.4167 85.4167 85.4167 66.8503 70.2745 76.4631 98 87.5000 87.5000 87.5000 70.5301 74.1456 80.6800 99 89.5833 89.5833 89.5833 74.3270 78.1400 85.0312 100 91.6667 91.6667 91.6667 78.2423 82.2589 89.5180 101 93.7500 93.7500 93.7500 82.2769 86.5032 94.1415 102 95.8333 95.8333 95.8333 86.4317 90.8742 98.9029 103 97.9167 97.9167 97.9167 90.7080 95.3727 103.803 104 25.0000 25.0000 0.00000 4.87856 5.67311 1.69777 105 50.0000 25.0000 0.00000 11.5406 9.10808 2.00994 106 75.0000 25.0000 0.00000 24.1359 15.6023 2.60014 107 100.000 25.0000 0.00000 43.6314 25.6542 3.51366 108 100.000 75.0000 0.00000 60.3302 59.0470 9.07994 109 50.0000 50.0000 0.00000 17.3175 20.6603 3.93559 110 75.0000 50.0000 0.00000 29.9128 27.1544 4.52578 111 100.000 50.0000 0.00000 49.4083 37.2064 5.43931 112 100.000 100.000 100.000 95.1065 100.000 108.844 113 50.0000 75.0000 0.00000 28.2393 42.5008 7.57622 114 75.0000 75.0000 0.00000 40.8346 48.9950 8.16642 115 25.0000 75.0000 0.00000 21.5773 39.0658 7.26405 116 25.0000 100.000 0.00000 38.4825 72.8716 12.8992 117 50.0000 100.000 0.00000 45.1445 76.3065 13.2113 118 75.0000 100.000 0.00000 57.7399 82.8007 13.8015 119 100.000 100.000 0.00000 77.2354 92.8527 14.7151 120 25.0000 0.00000 25.0000 3.98649 2.43468 5.88625 121 50.0000 0.00000 25.0000 10.6485 5.86966 6.19842 122 75.0000 0.00000 25.0000 23.2439 12.3638 6.78862 123 75.0000 25.0000 25.0000 25.0451 15.9659 7.38905 124 87.5000 37.5000 37.5000 37.3481 25.5975 14.7033 125 56.2500 0.00000 0.00000 12.2903 6.82130 1.52904 126 100.000 0.00000 25.0000 42.7394 22.4158 7.70214 127 100.000 25.0000 25.0000 44.5407 26.0178 8.30257 128 100.000 25.0000 50.0000 47.4566 27.1840 23.6611 129 50.0000 25.0000 25.0000 12.4498 9.47171 6.79885 130 50.0000 50.0000 25.0000 18.2267 21.0239 8.72450 131 75.0000 50.0000 25.0000 30.8220 27.5181 9.31470 132 100.000 50.0000 25.0000 50.3176 37.5700 10.2282 133 25.0000 50.0000 25.0000 11.5647 17.5889 8.41233 134 25.0000 75.0000 25.0000 22.4865 39.4295 12.0530 135 50.0000 75.0000 25.0000 29.1485 42.8645 12.3651 136 75.0000 75.0000 25.0000 41.7438 49.3586 12.9553 137 100.000 75.0000 25.0000 61.2394 59.4106 13.8689 138 25.0000 50.0000 0.00000 10.6555 17.2253 3.62342 139 25.0000 100.000 25.0000 39.3917 73.2352 17.6881 140 50.0000 100.000 25.0000 46.0538 76.6702 18.0003 141 75.0000 100.000 25.0000 58.6491 83.1644 18.5905 142 100.000 100.000 25.0000 78.1446 93.2163 19.5040 143 25.0000 0.00000 50.0000 6.90243 3.60087 21.2448 144 50.0000 0.00000 50.0000 13.5645 7.03585 21.5570 145 75.0000 0.00000 50.0000 26.1598 13.5300 22.1472 146 100.000 0.00000 50.0000 45.6553 23.5820 23.0607 147 100.000 50.0000 75.0000 58.7464 40.9410 54.6237 148 100.000 50.0000 100.000 67.2794 44.3537 99.5683 149 50.0000 25.0000 50.0000 15.3658 10.6379 22.1574 150 75.0000 25.0000 50.0000 27.9611 17.1321 22.7476 151 100.000 25.0000 75.0000 52.9695 29.3888 52.6981 152 25.0000 25.0000 50.0000 8.70371 7.20292 21.8452 153 25.0000 50.0000 50.0000 14.4806 18.7551 23.7709 154 75.0000 50.0000 50.0000 33.7380 28.6843 24.6733 155 100.000 50.0000 50.0000 53.2335 38.7362 25.5868 156 100.000 75.0000 50.0000 64.1553 60.5768 29.2274 157 87.5000 62.5000 62.5000 49.7345 43.7199 39.3315 158 87.5000 87.5000 62.5000 63.5544 71.3558 43.9382 159 100.000 100.000 75.0000 86.5734 96.5873 63.8995 160 0.00000 68.7500 0.00000 16.2382 31.4721 6.07943 161 0.00000 100.000 25.0000 37.3144 72.1641 17.5907 162 0.00000 100.000 50.0000 40.2304 73.3303 32.9493 163 50.0000 100.000 50.0000 48.9697 77.8364 33.3588 164 75.0000 100.000 50.0000 61.5650 84.3305 33.9490 165 100.000 100.000 50.0000 81.0605 94.3825 34.8625 166 25.0000 0.00000 75.0000 12.4153 5.80568 50.2817 167 50.0000 0.00000 75.0000 19.0774 9.24066 50.5939 168 75.0000 0.00000 75.0000 31.6727 15.7348 51.1841 169 100.000 0.00000 75.0000 51.1682 25.7868 52.0976 170 100.000 0.00000 100.000 59.7013 29.1995 97.0422 171 25.0000 25.0000 75.0000 14.2166 9.40773 50.8822 172 50.0000 25.0000 75.0000 20.8787 12.8427 51.1944 173 75.0000 25.0000 75.0000 33.4740 19.3369 51.7845 174 0.00000 31.2500 0.00000 3.81760 6.63441 1.93921 175 0.00000 37.5000 0.00000 5.10758 9.21400 2.36920 176 25.0000 50.0000 75.0000 19.9935 20.9599 52.8078 177 50.0000 50.0000 75.0000 26.6555 24.3949 53.1200 178 75.0000 50.0000 75.0000 39.2509 30.8891 53.7102 179 100.000 75.0000 75.0000 69.6682 62.7816 58.2644 180 100.000 75.0000 100.000 78.2013 66.1943 103.209 181 0.00000 0.00000 0.00000 1.00000 1.00000 1.00000 182 12.5000 37.5000 37.5000 7.76682 10.3453 13.3171 183 25.0000 75.0000 50.0000 25.4024 40.5957 27.4115 184 25.0000 100.000 50.0000 42.3076 74.4014 33.0466 185 25.0000 100.000 75.0000 47.8205 76.6062 62.0836 186 50.0000 100.000 75.0000 54.4826 80.0412 62.3958 187 75.0000 100.000 75.0000 67.0779 86.5354 62.9859 188 100.000 100.000 100.000 95.1065 100.000 108.844 189 25.0000 0.00000 100.000 20.9484 9.21837 95.2263 190 50.0000 0.00000 100.000 27.6104 12.6533 95.5385 191 75.0000 0.00000 100.000 40.2058 19.1475 96.1287 192 75.0000 75.0000 100.000 58.7057 56.1423 102.295 193 0.00000 25.0000 100.000 20.6724 11.7494 95.7294 194 25.0000 25.0000 100.000 22.7497 12.8204 95.8267 195 50.0000 25.0000 100.000 29.4117 16.2554 96.1389 196 75.0000 25.0000 100.000 42.0070 22.7496 96.7291 197 100.000 25.0000 100.000 61.5026 32.8015 97.6426 198 0.00000 0.00000 0.00000 1.00000 1.00000 1.00000 199 25.0000 50.0000 100.000 28.5266 24.3726 97.7524 200 50.0000 50.0000 100.000 35.1886 27.8076 98.0645 201 50.0000 75.0000 100.000 46.1104 49.6481 101.705 202 12.5000 62.5000 62.5000 20.1532 28.4677 37.9454 203 12.5000 62.5000 87.5000 27.1290 31.2576 74.6872 204 25.0000 75.0000 100.000 39.4484 46.2132 101.393 205 0.00000 50.0000 50.0000 12.4033 17.6840 23.6735 206 0.00000 75.0000 75.0000 28.8380 41.7294 56.3511 207 0.00000 100.000 75.0000 45.7432 75.5351 61.9862 208 0.00000 100.000 100.000 54.2763 78.9478 106.931 209 25.0000 100.000 100.000 56.3536 80.0189 107.028 210 50.0000 100.000 100.000 63.0157 83.4539 107.340 211 75.0000 100.000 100.000 75.6110 89.9480 107.930 212 62.5000 0.00000 0.00000 15.2297 8.33690 1.66678 213 68.7500 0.00000 0.00000 18.5730 10.0607 1.82344 214 100.000 100.000 100.000 95.1065 100.000 108.844 215 0.00000 25.0000 0.00000 2.80128 4.60205 1.60043 216 37.5000 37.5000 12.5000 10.1010 11.7590 3.94191 217 62.5000 37.5000 12.5000 19.5938 16.6535 4.38672 218 87.5000 37.5000 12.5000 35.5312 24.8708 5.13352 219 37.5000 12.5000 12.5000 6.50147 4.56093 2.74206 220 62.5000 12.5000 12.5000 15.9942 9.45544 3.18687 221 87.5000 12.5000 12.5000 31.9317 17.6728 3.93367 222 87.5000 62.5000 12.5000 43.7627 41.3315 7.87738 223 37.5000 62.5000 12.5000 18.3325 28.2197 6.68576 224 37.5000 87.5000 12.5000 32.1524 55.8555 11.2924 225 62.5000 87.5000 12.5000 41.6451 60.7500 11.7372 226 87.5000 87.5000 12.5000 57.5826 68.9674 12.4840 227 12.5000 12.5000 37.5000 4.16730 3.14728 12.1173 228 37.5000 12.5000 37.5000 8.31836 5.28757 12.3118 229 62.5000 12.5000 37.5000 17.8111 10.1821 12.7566 230 87.5000 12.5000 37.5000 33.7486 18.3995 13.5034 231 87.5000 62.5000 37.5000 45.5796 42.0582 17.4471 232 62.5000 37.5000 37.5000 21.4106 17.3801 13.9565 233 62.5000 62.5000 37.5000 29.6421 33.8408 16.7003 234 37.5000 37.5000 37.5000 11.9179 12.4856 13.5116 235 37.5000 62.5000 37.5000 20.1494 28.9463 16.2555 236 50.0000 75.0000 50.0000 32.0645 44.0306 27.7237 237 12.5000 87.5000 12.5000 28.0013 53.7152 11.0979 238 12.5000 87.5000 37.5000 29.8182 54.4419 20.6677 239 37.5000 87.5000 37.5000 33.9692 56.5822 20.8622 240 62.5000 87.5000 37.5000 43.4620 61.4767 21.3070 241 87.5000 87.5000 37.5000 59.3994 69.6941 22.0538 242 18.7500 0.00000 0.00000 2.19807 1.61773 1.05614 243 37.5000 12.5000 62.5000 12.4733 6.94928 34.1962 244 62.5000 12.5000 62.5000 21.9661 11.8438 34.6410 245 87.5000 12.5000 62.5000 37.9035 20.0612 35.3878 246 87.5000 12.5000 87.5000 44.8792 22.8510 72.1296 247 87.5000 37.5000 87.5000 48.4787 30.0490 73.3295 248 87.5000 62.5000 87.5000 56.7102 46.5097 76.0733 249 0.00000 18.7500 0.00000 2.03889 3.07749 1.34630 250 0.00000 50.0000 25.0000 9.48738 16.5179 8.31499 251 0.00000 75.0000 25.0000 20.4092 38.3584 11.9556 252 0.00000 75.0000 50.0000 23.3251 39.5246 27.3142 253 12.5000 87.5000 62.5000 33.9731 56.1036 42.5521 254 37.5000 87.5000 62.5000 38.1242 58.2439 42.7466 255 62.5000 87.5000 62.5000 47.6169 63.1384 43.1914 256 12.5000 12.5000 62.5000 8.32223 4.80899 34.0017 257 12.5000 12.5000 87.5000 15.2979 7.59883 70.7435 258 37.5000 12.5000 87.5000 19.4490 9.73913 70.9380 259 62.5000 12.5000 87.5000 28.9418 14.6336 71.3828 260 12.5000 37.5000 62.5000 11.9217 12.0070 35.2016 261 12.5000 37.5000 87.5000 18.8975 14.7969 71.9433 262 37.5000 37.5000 87.5000 23.0485 16.9371 72.1379 263 62.5000 37.5000 87.5000 32.5413 21.8317 72.5827 264 37.5000 37.5000 62.5000 16.0728 14.1473 35.3961 265 37.5000 62.5000 62.5000 24.3043 30.6080 38.1399 266 37.5000 62.5000 87.5000 31.2800 33.3978 74.8817 267 62.5000 62.5000 87.5000 40.7728 38.2924 75.3265 268 62.5000 87.5000 87.5000 54.5927 65.9282 79.9332 269 0.00000 25.0000 75.0000 12.1393 8.33668 50.7848 270 0.00000 50.0000 75.0000 17.9162 19.8888 52.7105 271 0.00000 75.0000 100.000 37.3711 45.1421 101.296 END_DATA CAL DESCRIPTOR "Argyll Device Calibration State" ORIGINATOR "Argyll dispcal" CREATED "Sat Mar 14 19:07:36 2009" KEYWORD "DEVICE_CLASS" DEVICE_CLASS "DISPLAY" KEYWORD "COLOR_REP" COLOR_REP "RGB" BEGIN_ARGYLL_DISPCAL_ARGS -ql -w0.3127,0.3290 -gs -f1 -k0 END_ARGYLL_DISPCAL_ARGS KEYWORD "RGB_I" NUMBER_OF_FIELDS 4 BEGIN_DATA_FORMAT RGB_I RGB_R RGB_G RGB_B END_DATA_FORMAT NUMBER_OF_SETS 256 BEGIN_DATA 0.00000 0.00000 0.00000 0.00000 0.00392 0.00392 0.00392 0.00392 0.00784 0.00784 0.00784 0.00784 0.01176 0.01176 0.01176 0.01176 0.01569 0.01569 0.01569 0.01569 0.01961 0.01961 0.01961 0.01961 0.02353 0.02353 0.02353 0.02353 0.02745 0.02745 0.02745 0.02745 0.03137 0.03137 0.03137 0.03137 0.03529 0.03529 0.03529 0.03529 0.03922 0.03922 0.03922 0.03922 0.04314 0.04314 0.04314 0.04314 0.04706 0.04706 0.04706 0.04706 0.05098 0.05098 0.05098 0.05098 0.05490 0.05490 0.05490 0.05490 0.05882 0.05882 0.05882 0.05882 0.06275 0.06275 0.06275 0.06275 0.06667 0.06667 0.06667 0.06667 0.07059 0.07059 0.07059 0.07059 0.07451 0.07451 0.07451 0.07451 0.07843 0.07843 0.07843 0.07843 0.08235 0.08235 0.08235 0.08235 0.08627 0.08627 0.08627 0.08627 0.09020 0.09020 0.09020 0.09020 0.09412 0.09412 0.09412 0.09412 0.09804 0.09804 0.09804 0.09804 0.10196 0.10196 0.10196 0.10196 0.10588 0.10588 0.10588 0.10588 0.10980 0.10980 0.10980 0.10980 0.11373 0.11373 0.11373 0.11373 0.11765 0.11765 0.11765 0.11765 0.12157 0.12157 0.12157 0.12157 0.12549 0.12549 0.12549 0.12549 0.12941 0.12941 0.12941 0.12941 0.13333 0.13333 0.13333 0.13333 0.13725 0.13725 0.13725 0.13725 0.14118 0.14118 0.14118 0.14118 0.14510 0.14510 0.14510 0.14510 0.14902 0.14902 0.14902 0.14902 0.15294 0.15294 0.15294 0.15294 0.15686 0.15686 0.15686 0.15686 0.16078 0.16078 0.16078 0.16078 0.16471 0.16471 0.16471 0.16471 0.16863 0.16863 0.16863 0.16863 0.17255 0.17255 0.17255 0.17255 0.17647 0.17647 0.17647 0.17647 0.18039 0.18039 0.18039 0.18039 0.18431 0.18431 0.18431 0.18431 0.18824 0.18824 0.18824 0.18824 0.19216 0.19216 0.19216 0.19216 0.19608 0.19608 0.19608 0.19608 0.20000 0.20000 0.20000 0.20000 0.20392 0.20392 0.20392 0.20392 0.20784 0.20784 0.20784 0.20784 0.21176 0.21176 0.21176 0.21176 0.21569 0.21569 0.21569 0.21569 0.21961 0.21961 0.21961 0.21961 0.22353 0.22353 0.22353 0.22353 0.22745 0.22745 0.22745 0.22745 0.23137 0.23137 0.23137 0.23137 0.23529 0.23529 0.23529 0.23529 0.23922 0.23922 0.23922 0.23922 0.24314 0.24314 0.24314 0.24314 0.24706 0.24706 0.24706 0.24706 0.25098 0.25098 0.25098 0.25098 0.25490 0.25490 0.25490 0.25490 0.25882 0.25882 0.25882 0.25882 0.26275 0.26275 0.26275 0.26275 0.26667 0.26667 0.26667 0.26667 0.27059 0.27059 0.27059 0.27059 0.27451 0.27451 0.27451 0.27451 0.27843 0.27843 0.27843 0.27843 0.28235 0.28235 0.28235 0.28235 0.28627 0.28627 0.28627 0.28627 0.29020 0.29020 0.29020 0.29020 0.29412 0.29412 0.29412 0.29412 0.29804 0.29804 0.29804 0.29804 0.30196 0.30196 0.30196 0.30196 0.30588 0.30588 0.30588 0.30588 0.30980 0.30980 0.30980 0.30980 0.31373 0.31373 0.31373 0.31373 0.31765 0.31765 0.31765 0.31765 0.32157 0.32157 0.32157 0.32157 0.32549 0.32549 0.32549 0.32549 0.32941 0.32941 0.32941 0.32941 0.33333 0.33333 0.33333 0.33333 0.33725 0.33725 0.33725 0.33725 0.34118 0.34118 0.34118 0.34118 0.34510 0.34510 0.34510 0.34510 0.34902 0.34902 0.34902 0.34902 0.35294 0.35294 0.35294 0.35294 0.35686 0.35686 0.35686 0.35686 0.36078 0.36078 0.36078 0.36078 0.36471 0.36471 0.36471 0.36471 0.36863 0.36863 0.36863 0.36863 0.37255 0.37255 0.37255 0.37255 0.37647 0.37647 0.37647 0.37647 0.38039 0.38039 0.38039 0.38039 0.38431 0.38431 0.38431 0.38431 0.38824 0.38824 0.38824 0.38824 0.39216 0.39216 0.39216 0.39216 0.39608 0.39608 0.39608 0.39608 0.40000 0.40000 0.40000 0.40000 0.40392 0.40392 0.40392 0.40392 0.40784 0.40784 0.40784 0.40784 0.41176 0.41176 0.41176 0.41176 0.41569 0.41569 0.41569 0.41569 0.41961 0.41961 0.41961 0.41961 0.42353 0.42353 0.42353 0.42353 0.42745 0.42745 0.42745 0.42745 0.43137 0.43137 0.43137 0.43137 0.43529 0.43529 0.43529 0.43529 0.43922 0.43922 0.43922 0.43922 0.44314 0.44314 0.44314 0.44314 0.44706 0.44706 0.44706 0.44706 0.45098 0.45098 0.45098 0.45098 0.45490 0.45490 0.45490 0.45490 0.45882 0.45882 0.45882 0.45882 0.46275 0.46275 0.46275 0.46275 0.46667 0.46667 0.46667 0.46667 0.47059 0.47059 0.47059 0.47059 0.47451 0.47451 0.47451 0.47451 0.47843 0.47843 0.47843 0.47843 0.48235 0.48235 0.48235 0.48235 0.48627 0.48627 0.48627 0.48627 0.49020 0.49020 0.49020 0.49020 0.49412 0.49412 0.49412 0.49412 0.49804 0.49804 0.49804 0.49804 0.50196 0.50196 0.50196 0.50196 0.50588 0.50588 0.50588 0.50588 0.50980 0.50980 0.50980 0.50980 0.51373 0.51373 0.51373 0.51373 0.51765 0.51765 0.51765 0.51765 0.52157 0.52157 0.52157 0.52157 0.52549 0.52549 0.52549 0.52549 0.52941 0.52941 0.52941 0.52941 0.53333 0.53333 0.53333 0.53333 0.53725 0.53725 0.53725 0.53725 0.54118 0.54118 0.54118 0.54118 0.54510 0.54510 0.54510 0.54510 0.54902 0.54902 0.54902 0.54902 0.55294 0.55294 0.55294 0.55294 0.55686 0.55686 0.55686 0.55686 0.56078 0.56078 0.56078 0.56078 0.56471 0.56471 0.56471 0.56471 0.56863 0.56863 0.56863 0.56863 0.57255 0.57255 0.57255 0.57255 0.57647 0.57647 0.57647 0.57647 0.58039 0.58039 0.58039 0.58039 0.58431 0.58431 0.58431 0.58431 0.58824 0.58824 0.58824 0.58824 0.59216 0.59216 0.59216 0.59216 0.59608 0.59608 0.59608 0.59608 0.60000 0.60000 0.60000 0.60000 0.60392 0.60392 0.60392 0.60392 0.60784 0.60784 0.60784 0.60784 0.61176 0.61176 0.61176 0.61176 0.61569 0.61569 0.61569 0.61569 0.61961 0.61961 0.61961 0.61961 0.62353 0.62353 0.62353 0.62353 0.62745 0.62745 0.62745 0.62745 0.63137 0.63137 0.63137 0.63137 0.63529 0.63529 0.63529 0.63529 0.63922 0.63922 0.63922 0.63922 0.64314 0.64314 0.64314 0.64314 0.64706 0.64706 0.64706 0.64706 0.65098 0.65098 0.65098 0.65098 0.65490 0.65490 0.65490 0.65490 0.65882 0.65882 0.65882 0.65882 0.66275 0.66275 0.66275 0.66275 0.66667 0.66667 0.66667 0.66667 0.67059 0.67059 0.67059 0.67059 0.67451 0.67451 0.67451 0.67451 0.67843 0.67843 0.67843 0.67843 0.68235 0.68235 0.68235 0.68235 0.68627 0.68627 0.68627 0.68627 0.69020 0.69020 0.69020 0.69020 0.69412 0.69412 0.69412 0.69412 0.69804 0.69804 0.69804 0.69804 0.70196 0.70196 0.70196 0.70196 0.70588 0.70588 0.70588 0.70588 0.70980 0.70980 0.70980 0.70980 0.71373 0.71373 0.71373 0.71373 0.71765 0.71765 0.71765 0.71765 0.72157 0.72157 0.72157 0.72157 0.72549 0.72549 0.72549 0.72549 0.72941 0.72941 0.72941 0.72941 0.73333 0.73333 0.73333 0.73333 0.73725 0.73725 0.73725 0.73725 0.74118 0.74118 0.74118 0.74118 0.74510 0.74510 0.74510 0.74510 0.74902 0.74902 0.74902 0.74902 0.75294 0.75294 0.75294 0.75294 0.75686 0.75686 0.75686 0.75686 0.76078 0.76078 0.76078 0.76078 0.76471 0.76471 0.76471 0.76471 0.76863 0.76863 0.76863 0.76863 0.77255 0.77255 0.77255 0.77255 0.77647 0.77647 0.77647 0.77647 0.78039 0.78039 0.78039 0.78039 0.78431 0.78431 0.78431 0.78431 0.78824 0.78824 0.78824 0.78824 0.79216 0.79216 0.79216 0.79216 0.79608 0.79608 0.79608 0.79608 0.80000 0.80000 0.80000 0.80000 0.80392 0.80392 0.80392 0.80392 0.80784 0.80784 0.80784 0.80784 0.81176 0.81176 0.81176 0.81176 0.81569 0.81569 0.81569 0.81569 0.81961 0.81961 0.81961 0.81961 0.82353 0.82353 0.82353 0.82353 0.82745 0.82745 0.82745 0.82745 0.83137 0.83137 0.83137 0.83137 0.83529 0.83529 0.83529 0.83529 0.83922 0.83922 0.83922 0.83922 0.84314 0.84314 0.84314 0.84314 0.84706 0.84706 0.84706 0.84706 0.85098 0.85098 0.85098 0.85098 0.85490 0.85490 0.85490 0.85490 0.85882 0.85882 0.85882 0.85882 0.86275 0.86275 0.86275 0.86275 0.86667 0.86667 0.86667 0.86667 0.87059 0.87059 0.87059 0.87059 0.87451 0.87451 0.87451 0.87451 0.87843 0.87843 0.87843 0.87843 0.88235 0.88235 0.88235 0.88235 0.88627 0.88627 0.88627 0.88627 0.89020 0.89020 0.89020 0.89020 0.89412 0.89412 0.89412 0.89412 0.89804 0.89804 0.89804 0.89804 0.90196 0.90196 0.90196 0.90196 0.90588 0.90588 0.90588 0.90588 0.90980 0.90980 0.90980 0.90980 0.91373 0.91373 0.91373 0.91373 0.91765 0.91765 0.91765 0.91765 0.92157 0.92157 0.92157 0.92157 0.92549 0.92549 0.92549 0.92549 0.92941 0.92941 0.92941 0.92941 0.93333 0.93333 0.93333 0.93333 0.93725 0.93725 0.93725 0.93725 0.94118 0.94118 0.94118 0.94118 0.94510 0.94510 0.94510 0.94510 0.94902 0.94902 0.94902 0.94902 0.95294 0.95294 0.95294 0.95294 0.95686 0.95686 0.95686 0.95686 0.96078 0.96078 0.96078 0.96078 0.96471 0.96471 0.96471 0.96471 0.96863 0.96863 0.96863 0.96863 0.97255 0.97255 0.97255 0.97255 0.97647 0.97647 0.97647 0.97647 0.98039 0.98039 0.98039 0.98039 0.98431 0.98431 0.98431 0.98431 0.98824 0.98824 0.98824 0.98824 0.99216 0.99216 0.99216 0.99216 0.99608 0.99608 0.99608 0.99608 1.00000 1.00000 1.00000 1.00000 END_DATA DisplayCAL-3.1.0.0/misc/ti3/video.ti30000644000076500000000000005561712647526532016705 0ustar devwheel00000000000000CTI3 DESCRIPTOR "Argyll Calibration Target chart information 3" ORIGINATOR "Argyll dispread" CREATED "Sat Mar 14 19:00:55 2009" KEYWORD "DEVICE_CLASS" DEVICE_CLASS "DISPLAY" KEYWORD "APPROX_WHITE_POINT" APPROX_WHITE_POINT "95.106486 100.000000 108.844025" KEYWORD "COLOR_REP" COLOR_REP "RGB_XYZ" KEYWORD "BLACK_COLOR_PATCHES" BLACK_COLOR_PATCHES "4" KEYWORD "COMP_GREY_STEPS" COMP_GREY_STEPS "49" KEYWORD "MULTI_DIM_BCC_STEPS" MULTI_DIM_BCC_STEPS "5" KEYWORD "MULTI_DIM_STEPS" MULTI_DIM_STEPS "5" KEYWORD "SINGLE_DIM_STEPS" SINGLE_DIM_STEPS "17" KEYWORD "WHITE_COLOR_PATCHES" WHITE_COLOR_PATCHES "4" KEYWORD "AUTO_OPTIMIZE" AUTO_OPTIMIZE "9" BEGIN_ARGYLL_COLPROF_ARGS -qh -aX END_ARGYLL_COLPROF_ARGS NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT SAMPLE_ID RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 271 BEGIN_DATA 1 100.000 100.000 100.000 95.1065 100.000 108.844 2 12.5000 37.5000 12.5000 5.94993 9.61866 3.74740 3 12.5000 62.5000 12.5000 14.1814 26.0794 6.49125 4 12.5000 87.5000 87.5000 40.9488 58.8934 79.2939 5 37.5000 87.5000 87.5000 45.0999 61.0337 79.4884 6 0.00000 25.0000 25.0000 3.71049 4.96568 6.38934 7 0.00000 25.0000 50.0000 6.62643 6.13187 21.7479 8 25.0000 75.0000 75.0000 30.9153 42.8005 56.4485 9 50.0000 75.0000 75.0000 37.5774 46.2355 56.7606 10 12.5000 0.00000 0.00000 1.58591 1.30210 1.02745 11 10.4167 10.4167 10.4167 2.00521 2.05749 2.15195 12 25.0000 0.00000 0.00000 3.07728 2.07105 1.09734 13 31.2500 0.00000 0.00000 4.24932 2.67536 1.15226 14 37.5000 0.00000 0.00000 5.73696 3.44239 1.22197 15 43.7500 0.00000 0.00000 7.56070 4.38272 1.30742 16 50.0000 0.00000 0.00000 9.73934 5.50603 1.40951 17 62.5000 37.5000 62.5000 25.5656 19.0418 35.8409 18 87.5000 37.5000 62.5000 41.5030 27.2592 36.5877 19 0.00000 0.00000 0.00000 1.00000 1.00000 1.00000 20 75.0000 0.00000 0.00000 22.3346 12.0002 1.99970 21 81.2500 0.00000 0.00000 26.5283 14.1625 2.19621 22 87.5000 0.00000 0.00000 31.1672 16.5543 2.41358 23 93.7500 0.00000 0.00000 36.2638 19.1821 2.65240 24 100.000 0.00000 0.00000 41.8302 22.0522 2.91323 25 62.5000 62.5000 12.5000 27.8253 33.1142 7.13058 26 75.0000 75.0000 50.0000 44.6598 50.5248 28.3139 27 8.33333 8.33333 8.33333 1.71786 1.75519 1.82265 28 0.00000 12.5000 0.00000 1.50806 2.01598 1.16935 29 0.00000 43.7500 0.00000 6.68900 12.3764 2.89635 30 0.00000 50.0000 0.00000 8.57817 16.1542 3.52608 31 0.00000 56.2500 0.00000 10.7902 20.5776 4.26342 32 0.00000 62.5000 0.00000 13.3391 25.6747 5.11306 33 12.5000 62.5000 37.5000 15.9983 26.8060 16.0610 34 0.00000 0.00000 0.00000 1.00000 1.00000 1.00000 35 0.00000 6.25000 0.00000 1.18254 1.36502 1.06085 36 0.00000 75.0000 0.00000 19.5000 37.9948 7.16671 37 0.00000 81.2500 0.00000 23.1365 45.2667 8.37888 38 0.00000 87.5000 0.00000 27.1590 53.3106 9.71972 39 0.00000 93.7500 0.00000 31.5784 62.1482 11.1929 40 0.00000 100.000 0.00000 36.4052 71.8005 12.8018 41 6.25000 6.25000 6.25000 1.48518 1.51041 1.55601 42 0.00000 0.00000 12.5000 1.25645 1.10256 2.35074 43 0.00000 0.00000 18.7500 1.52439 1.20972 3.76201 44 0.00000 0.00000 25.0000 1.90921 1.36363 5.78891 45 0.00000 0.00000 31.2500 2.42221 1.56879 8.49092 46 0.00000 0.00000 37.5000 3.07334 1.82920 11.9205 47 0.00000 0.00000 43.7500 3.87158 2.14845 16.1249 48 0.00000 0.00000 50.0000 4.82515 2.52982 21.1475 49 0.00000 0.00000 56.2500 5.94168 2.97636 27.0283 50 0.00000 0.00000 62.5000 7.22826 3.49091 33.8049 51 0.00000 0.00000 68.7500 8.69161 4.07616 41.5125 52 0.00000 0.00000 75.0000 10.3380 4.73463 50.1844 53 0.00000 0.00000 81.2500 12.1736 5.46873 59.8524 54 0.00000 0.00000 87.5000 14.2040 6.28076 70.5467 55 0.00000 0.00000 93.7500 16.4347 7.17291 82.2963 56 0.00000 0.00000 100.000 18.8711 8.14731 95.1290 57 0.00000 50.0000 100.000 26.4493 23.3015 97.6550 58 75.0000 50.0000 100.000 47.7839 34.3017 98.6547 59 0.00000 0.00000 6.25000 1.09214 1.03685 1.48530 60 2.08333 2.08333 2.08333 1.15175 1.15964 1.17390 61 4.16667 4.16667 4.16667 1.30372 1.31952 1.34806 62 12.5000 12.5000 12.5000 2.35042 2.42064 2.54755 63 14.5833 14.5833 14.5833 2.75638 2.84772 3.01278 64 16.6667 16.6667 16.6667 3.22584 3.34159 3.55077 65 18.7500 18.7500 18.7500 3.76135 3.90494 4.16445 66 20.8333 20.8333 20.8333 4.36533 4.54033 4.85660 67 22.9167 22.9167 22.9167 5.04007 5.25016 5.62984 68 25.0000 25.0000 25.0000 5.78777 6.03673 6.48668 69 27.0833 27.0833 27.0833 6.61052 6.90226 7.42953 70 29.1667 29.1667 29.1667 7.51032 7.84886 8.46069 71 31.2500 31.2500 31.2500 8.48913 8.87856 9.58238 72 6.25000 0.00000 0.00000 1.21051 1.10854 1.00986 73 33.3333 33.3333 33.3333 9.54879 9.99333 10.7967 74 35.4167 35.4167 35.4167 10.6911 11.1951 12.1058 75 39.5833 39.5833 39.5833 13.2307 13.8667 15.0161 76 41.6667 41.6667 41.6667 14.6313 15.3402 16.6212 77 43.7500 43.7500 43.7500 16.1213 16.9076 18.3287 78 45.8333 45.8333 45.8333 17.7021 18.5707 20.1403 79 47.9167 47.9167 47.9167 19.3754 20.3310 22.0579 80 50.0000 50.0000 50.0000 21.1427 22.1901 24.0831 81 52.0833 52.0833 52.0833 23.0052 24.1495 26.2175 82 54.1667 54.1667 54.1667 24.9646 26.2107 28.4629 83 56.2500 56.2500 56.2500 27.0221 28.3752 30.8208 84 58.3333 58.3333 58.3333 29.1791 30.6444 33.2927 85 60.4167 60.4167 60.4167 31.4370 33.0197 35.8802 86 62.5000 62.5000 62.5000 33.7971 35.5025 38.5847 87 64.5833 64.5833 64.5833 36.2605 38.0941 41.4078 88 66.6667 66.6667 66.6667 38.8287 40.7958 44.3509 89 68.7500 68.7500 68.7500 41.5028 43.6089 47.4154 90 70.8333 70.8333 70.8333 44.2840 46.5348 50.6026 91 72.9167 72.9167 72.9167 47.1736 49.5746 53.9140 92 75.0000 75.0000 75.0000 50.1727 52.7296 57.3508 93 77.0833 77.0833 77.0833 53.2824 56.0011 60.9145 94 79.1667 79.1667 79.1667 56.5039 59.3901 64.6063 95 81.2500 81.2500 81.2500 59.8383 62.8979 68.4275 96 83.3333 83.3333 83.3333 63.2868 66.5257 72.3793 97 85.4167 85.4167 85.4167 66.8503 70.2745 76.4631 98 87.5000 87.5000 87.5000 70.5301 74.1456 80.6800 99 89.5833 89.5833 89.5833 74.3270 78.1400 85.0312 100 91.6667 91.6667 91.6667 78.2423 82.2589 89.5180 101 93.7500 93.7500 93.7500 82.2769 86.5032 94.1415 102 95.8333 95.8333 95.8333 86.4317 90.8742 98.9029 103 97.9167 97.9167 97.9167 90.7080 95.3727 103.803 104 25.0000 25.0000 0.00000 4.87856 5.67311 1.69777 105 50.0000 25.0000 0.00000 11.5406 9.10808 2.00994 106 75.0000 25.0000 0.00000 24.1359 15.6023 2.60014 107 100.000 25.0000 0.00000 43.6314 25.6542 3.51366 108 100.000 75.0000 0.00000 60.3302 59.0470 9.07994 109 50.0000 50.0000 0.00000 17.3175 20.6603 3.93559 110 75.0000 50.0000 0.00000 29.9128 27.1544 4.52578 111 100.000 50.0000 0.00000 49.4083 37.2064 5.43931 112 100.000 100.000 100.000 95.1065 100.000 108.844 113 50.0000 75.0000 0.00000 28.2393 42.5008 7.57622 114 75.0000 75.0000 0.00000 40.8346 48.9950 8.16642 115 25.0000 75.0000 0.00000 21.5773 39.0658 7.26405 116 25.0000 100.000 0.00000 38.4825 72.8716 12.8992 117 50.0000 100.000 0.00000 45.1445 76.3065 13.2113 118 75.0000 100.000 0.00000 57.7399 82.8007 13.8015 119 100.000 100.000 0.00000 77.2354 92.8527 14.7151 120 25.0000 0.00000 25.0000 3.98649 2.43468 5.88625 121 50.0000 0.00000 25.0000 10.6485 5.86966 6.19842 122 75.0000 0.00000 25.0000 23.2439 12.3638 6.78862 123 75.0000 25.0000 25.0000 25.0451 15.9659 7.38905 124 87.5000 37.5000 37.5000 37.3481 25.5975 14.7033 125 56.2500 0.00000 0.00000 12.2903 6.82130 1.52904 126 100.000 0.00000 25.0000 42.7394 22.4158 7.70214 127 100.000 25.0000 25.0000 44.5407 26.0178 8.30257 128 100.000 25.0000 50.0000 47.4566 27.1840 23.6611 129 50.0000 25.0000 25.0000 12.4498 9.47171 6.79885 130 50.0000 50.0000 25.0000 18.2267 21.0239 8.72450 131 75.0000 50.0000 25.0000 30.8220 27.5181 9.31470 132 100.000 50.0000 25.0000 50.3176 37.5700 10.2282 133 25.0000 50.0000 25.0000 11.5647 17.5889 8.41233 134 25.0000 75.0000 25.0000 22.4865 39.4295 12.0530 135 50.0000 75.0000 25.0000 29.1485 42.8645 12.3651 136 75.0000 75.0000 25.0000 41.7438 49.3586 12.9553 137 100.000 75.0000 25.0000 61.2394 59.4106 13.8689 138 25.0000 50.0000 0.00000 10.6555 17.2253 3.62342 139 25.0000 100.000 25.0000 39.3917 73.2352 17.6881 140 50.0000 100.000 25.0000 46.0538 76.6702 18.0003 141 75.0000 100.000 25.0000 58.6491 83.1644 18.5905 142 100.000 100.000 25.0000 78.1446 93.2163 19.5040 143 25.0000 0.00000 50.0000 6.90243 3.60087 21.2448 144 50.0000 0.00000 50.0000 13.5645 7.03585 21.5570 145 75.0000 0.00000 50.0000 26.1598 13.5300 22.1472 146 100.000 0.00000 50.0000 45.6553 23.5820 23.0607 147 100.000 50.0000 75.0000 58.7464 40.9410 54.6237 148 100.000 50.0000 100.000 67.2794 44.3537 99.5683 149 50.0000 25.0000 50.0000 15.3658 10.6379 22.1574 150 75.0000 25.0000 50.0000 27.9611 17.1321 22.7476 151 100.000 25.0000 75.0000 52.9695 29.3888 52.6981 152 25.0000 25.0000 50.0000 8.70371 7.20292 21.8452 153 25.0000 50.0000 50.0000 14.4806 18.7551 23.7709 154 75.0000 50.0000 50.0000 33.7380 28.6843 24.6733 155 100.000 50.0000 50.0000 53.2335 38.7362 25.5868 156 100.000 75.0000 50.0000 64.1553 60.5768 29.2274 157 87.5000 62.5000 62.5000 49.7345 43.7199 39.3315 158 87.5000 87.5000 62.5000 63.5544 71.3558 43.9382 159 100.000 100.000 75.0000 86.5734 96.5873 63.8995 160 0.00000 68.7500 0.00000 16.2382 31.4721 6.07943 161 0.00000 100.000 25.0000 37.3144 72.1641 17.5907 162 0.00000 100.000 50.0000 40.2304 73.3303 32.9493 163 50.0000 100.000 50.0000 48.9697 77.8364 33.3588 164 75.0000 100.000 50.0000 61.5650 84.3305 33.9490 165 100.000 100.000 50.0000 81.0605 94.3825 34.8625 166 25.0000 0.00000 75.0000 12.4153 5.80568 50.2817 167 50.0000 0.00000 75.0000 19.0774 9.24066 50.5939 168 75.0000 0.00000 75.0000 31.6727 15.7348 51.1841 169 100.000 0.00000 75.0000 51.1682 25.7868 52.0976 170 100.000 0.00000 100.000 59.7013 29.1995 97.0422 171 25.0000 25.0000 75.0000 14.2166 9.40773 50.8822 172 50.0000 25.0000 75.0000 20.8787 12.8427 51.1944 173 75.0000 25.0000 75.0000 33.4740 19.3369 51.7845 174 0.00000 31.2500 0.00000 3.81760 6.63441 1.93921 175 0.00000 37.5000 0.00000 5.10758 9.21400 2.36920 176 25.0000 50.0000 75.0000 19.9935 20.9599 52.8078 177 50.0000 50.0000 75.0000 26.6555 24.3949 53.1200 178 75.0000 50.0000 75.0000 39.2509 30.8891 53.7102 179 100.000 75.0000 75.0000 69.6682 62.7816 58.2644 180 100.000 75.0000 100.000 78.2013 66.1943 103.209 181 0.00000 0.00000 0.00000 1.00000 1.00000 1.00000 182 12.5000 37.5000 37.5000 7.76682 10.3453 13.3171 183 25.0000 75.0000 50.0000 25.4024 40.5957 27.4115 184 25.0000 100.000 50.0000 42.3076 74.4014 33.0466 185 25.0000 100.000 75.0000 47.8205 76.6062 62.0836 186 50.0000 100.000 75.0000 54.4826 80.0412 62.3958 187 75.0000 100.000 75.0000 67.0779 86.5354 62.9859 188 100.000 100.000 100.000 95.1065 100.000 108.844 189 25.0000 0.00000 100.000 20.9484 9.21837 95.2263 190 50.0000 0.00000 100.000 27.6104 12.6533 95.5385 191 75.0000 0.00000 100.000 40.2058 19.1475 96.1287 192 75.0000 75.0000 100.000 58.7057 56.1423 102.295 193 0.00000 25.0000 100.000 20.6724 11.7494 95.7294 194 25.0000 25.0000 100.000 22.7497 12.8204 95.8267 195 50.0000 25.0000 100.000 29.4117 16.2554 96.1389 196 75.0000 25.0000 100.000 42.0070 22.7496 96.7291 197 100.000 25.0000 100.000 61.5026 32.8015 97.6426 198 0.00000 0.00000 0.00000 1.00000 1.00000 1.00000 199 25.0000 50.0000 100.000 28.5266 24.3726 97.7524 200 50.0000 50.0000 100.000 35.1886 27.8076 98.0645 201 50.0000 75.0000 100.000 46.1104 49.6481 101.705 202 12.5000 62.5000 62.5000 20.1532 28.4677 37.9454 203 12.5000 62.5000 87.5000 27.1290 31.2576 74.6872 204 25.0000 75.0000 100.000 39.4484 46.2132 101.393 205 0.00000 50.0000 50.0000 12.4033 17.6840 23.6735 206 0.00000 75.0000 75.0000 28.8380 41.7294 56.3511 207 0.00000 100.000 75.0000 45.7432 75.5351 61.9862 208 0.00000 100.000 100.000 54.2763 78.9478 106.931 209 25.0000 100.000 100.000 56.3536 80.0189 107.028 210 50.0000 100.000 100.000 63.0157 83.4539 107.340 211 75.0000 100.000 100.000 75.6110 89.9480 107.930 212 62.5000 0.00000 0.00000 15.2297 8.33690 1.66678 213 68.7500 0.00000 0.00000 18.5730 10.0607 1.82344 214 100.000 100.000 100.000 95.1065 100.000 108.844 215 0.00000 25.0000 0.00000 2.80128 4.60205 1.60043 216 37.5000 37.5000 12.5000 10.1010 11.7590 3.94191 217 62.5000 37.5000 12.5000 19.5938 16.6535 4.38672 218 87.5000 37.5000 12.5000 35.5312 24.8708 5.13352 219 37.5000 12.5000 12.5000 6.50147 4.56093 2.74206 220 62.5000 12.5000 12.5000 15.9942 9.45544 3.18687 221 87.5000 12.5000 12.5000 31.9317 17.6728 3.93367 222 87.5000 62.5000 12.5000 43.7627 41.3315 7.87738 223 37.5000 62.5000 12.5000 18.3325 28.2197 6.68576 224 37.5000 87.5000 12.5000 32.1524 55.8555 11.2924 225 62.5000 87.5000 12.5000 41.6451 60.7500 11.7372 226 87.5000 87.5000 12.5000 57.5826 68.9674 12.4840 227 12.5000 12.5000 37.5000 4.16730 3.14728 12.1173 228 37.5000 12.5000 37.5000 8.31836 5.28757 12.3118 229 62.5000 12.5000 37.5000 17.8111 10.1821 12.7566 230 87.5000 12.5000 37.5000 33.7486 18.3995 13.5034 231 87.5000 62.5000 37.5000 45.5796 42.0582 17.4471 232 62.5000 37.5000 37.5000 21.4106 17.3801 13.9565 233 62.5000 62.5000 37.5000 29.6421 33.8408 16.7003 234 37.5000 37.5000 37.5000 11.9179 12.4856 13.5116 235 37.5000 62.5000 37.5000 20.1494 28.9463 16.2555 236 50.0000 75.0000 50.0000 32.0645 44.0306 27.7237 237 12.5000 87.5000 12.5000 28.0013 53.7152 11.0979 238 12.5000 87.5000 37.5000 29.8182 54.4419 20.6677 239 37.5000 87.5000 37.5000 33.9692 56.5822 20.8622 240 62.5000 87.5000 37.5000 43.4620 61.4767 21.3070 241 87.5000 87.5000 37.5000 59.3994 69.6941 22.0538 242 18.7500 0.00000 0.00000 2.19807 1.61773 1.05614 243 37.5000 12.5000 62.5000 12.4733 6.94928 34.1962 244 62.5000 12.5000 62.5000 21.9661 11.8438 34.6410 245 87.5000 12.5000 62.5000 37.9035 20.0612 35.3878 246 87.5000 12.5000 87.5000 44.8792 22.8510 72.1296 247 87.5000 37.5000 87.5000 48.4787 30.0490 73.3295 248 87.5000 62.5000 87.5000 56.7102 46.5097 76.0733 249 0.00000 18.7500 0.00000 2.03889 3.07749 1.34630 250 0.00000 50.0000 25.0000 9.48738 16.5179 8.31499 251 0.00000 75.0000 25.0000 20.4092 38.3584 11.9556 252 0.00000 75.0000 50.0000 23.3251 39.5246 27.3142 253 12.5000 87.5000 62.5000 33.9731 56.1036 42.5521 254 37.5000 87.5000 62.5000 38.1242 58.2439 42.7466 255 62.5000 87.5000 62.5000 47.6169 63.1384 43.1914 256 12.5000 12.5000 62.5000 8.32223 4.80899 34.0017 257 12.5000 12.5000 87.5000 15.2979 7.59883 70.7435 258 37.5000 12.5000 87.5000 19.4490 9.73913 70.9380 259 62.5000 12.5000 87.5000 28.9418 14.6336 71.3828 260 12.5000 37.5000 62.5000 11.9217 12.0070 35.2016 261 12.5000 37.5000 87.5000 18.8975 14.7969 71.9433 262 37.5000 37.5000 87.5000 23.0485 16.9371 72.1379 263 62.5000 37.5000 87.5000 32.5413 21.8317 72.5827 264 37.5000 37.5000 62.5000 16.0728 14.1473 35.3961 265 37.5000 62.5000 62.5000 24.3043 30.6080 38.1399 266 37.5000 62.5000 87.5000 31.2800 33.3978 74.8817 267 62.5000 62.5000 87.5000 40.7728 38.2924 75.3265 268 62.5000 87.5000 87.5000 54.5927 65.9282 79.9332 269 0.00000 25.0000 75.0000 12.1393 8.33668 50.7848 270 0.00000 50.0000 75.0000 17.9162 19.8888 52.7105 271 0.00000 75.0000 100.000 37.3711 45.1421 101.296 END_DATA CAL DESCRIPTOR "Argyll Device Calibration State" ORIGINATOR "Argyll dispcal" CREATED "Sat Mar 14 19:07:36 2009" KEYWORD "DEVICE_CLASS" DEVICE_CLASS "DISPLAY" KEYWORD "COLOR_REP" COLOR_REP "RGB" BEGIN_ARGYLL_DISPCAL_ARGS -qm -w0.3127,0.3290 -G2.4 -f0 -k0 END_ARGYLL_DISPCAL_ARGS KEYWORD "RGB_I" NUMBER_OF_FIELDS 4 BEGIN_DATA_FORMAT RGB_I RGB_R RGB_G RGB_B END_DATA_FORMAT NUMBER_OF_SETS 256 BEGIN_DATA 0.00000 0.00000 0.00000 0.00000 0.00392 0.00392 0.00392 0.00392 0.00784 0.00784 0.00784 0.00784 0.01176 0.01176 0.01176 0.01176 0.01569 0.01569 0.01569 0.01569 0.01961 0.01961 0.01961 0.01961 0.02353 0.02353 0.02353 0.02353 0.02745 0.02745 0.02745 0.02745 0.03137 0.03137 0.03137 0.03137 0.03529 0.03529 0.03529 0.03529 0.03922 0.03922 0.03922 0.03922 0.04314 0.04314 0.04314 0.04314 0.04706 0.04706 0.04706 0.04706 0.05098 0.05098 0.05098 0.05098 0.05490 0.05490 0.05490 0.05490 0.05882 0.05882 0.05882 0.05882 0.06275 0.06275 0.06275 0.06275 0.06667 0.06667 0.06667 0.06667 0.07059 0.07059 0.07059 0.07059 0.07451 0.07451 0.07451 0.07451 0.07843 0.07843 0.07843 0.07843 0.08235 0.08235 0.08235 0.08235 0.08627 0.08627 0.08627 0.08627 0.09020 0.09020 0.09020 0.09020 0.09412 0.09412 0.09412 0.09412 0.09804 0.09804 0.09804 0.09804 0.10196 0.10196 0.10196 0.10196 0.10588 0.10588 0.10588 0.10588 0.10980 0.10980 0.10980 0.10980 0.11373 0.11373 0.11373 0.11373 0.11765 0.11765 0.11765 0.11765 0.12157 0.12157 0.12157 0.12157 0.12549 0.12549 0.12549 0.12549 0.12941 0.12941 0.12941 0.12941 0.13333 0.13333 0.13333 0.13333 0.13725 0.13725 0.13725 0.13725 0.14118 0.14118 0.14118 0.14118 0.14510 0.14510 0.14510 0.14510 0.14902 0.14902 0.14902 0.14902 0.15294 0.15294 0.15294 0.15294 0.15686 0.15686 0.15686 0.15686 0.16078 0.16078 0.16078 0.16078 0.16471 0.16471 0.16471 0.16471 0.16863 0.16863 0.16863 0.16863 0.17255 0.17255 0.17255 0.17255 0.17647 0.17647 0.17647 0.17647 0.18039 0.18039 0.18039 0.18039 0.18431 0.18431 0.18431 0.18431 0.18824 0.18824 0.18824 0.18824 0.19216 0.19216 0.19216 0.19216 0.19608 0.19608 0.19608 0.19608 0.20000 0.20000 0.20000 0.20000 0.20392 0.20392 0.20392 0.20392 0.20784 0.20784 0.20784 0.20784 0.21176 0.21176 0.21176 0.21176 0.21569 0.21569 0.21569 0.21569 0.21961 0.21961 0.21961 0.21961 0.22353 0.22353 0.22353 0.22353 0.22745 0.22745 0.22745 0.22745 0.23137 0.23137 0.23137 0.23137 0.23529 0.23529 0.23529 0.23529 0.23922 0.23922 0.23922 0.23922 0.24314 0.24314 0.24314 0.24314 0.24706 0.24706 0.24706 0.24706 0.25098 0.25098 0.25098 0.25098 0.25490 0.25490 0.25490 0.25490 0.25882 0.25882 0.25882 0.25882 0.26275 0.26275 0.26275 0.26275 0.26667 0.26667 0.26667 0.26667 0.27059 0.27059 0.27059 0.27059 0.27451 0.27451 0.27451 0.27451 0.27843 0.27843 0.27843 0.27843 0.28235 0.28235 0.28235 0.28235 0.28627 0.28627 0.28627 0.28627 0.29020 0.29020 0.29020 0.29020 0.29412 0.29412 0.29412 0.29412 0.29804 0.29804 0.29804 0.29804 0.30196 0.30196 0.30196 0.30196 0.30588 0.30588 0.30588 0.30588 0.30980 0.30980 0.30980 0.30980 0.31373 0.31373 0.31373 0.31373 0.31765 0.31765 0.31765 0.31765 0.32157 0.32157 0.32157 0.32157 0.32549 0.32549 0.32549 0.32549 0.32941 0.32941 0.32941 0.32941 0.33333 0.33333 0.33333 0.33333 0.33725 0.33725 0.33725 0.33725 0.34118 0.34118 0.34118 0.34118 0.34510 0.34510 0.34510 0.34510 0.34902 0.34902 0.34902 0.34902 0.35294 0.35294 0.35294 0.35294 0.35686 0.35686 0.35686 0.35686 0.36078 0.36078 0.36078 0.36078 0.36471 0.36471 0.36471 0.36471 0.36863 0.36863 0.36863 0.36863 0.37255 0.37255 0.37255 0.37255 0.37647 0.37647 0.37647 0.37647 0.38039 0.38039 0.38039 0.38039 0.38431 0.38431 0.38431 0.38431 0.38824 0.38824 0.38824 0.38824 0.39216 0.39216 0.39216 0.39216 0.39608 0.39608 0.39608 0.39608 0.40000 0.40000 0.40000 0.40000 0.40392 0.40392 0.40392 0.40392 0.40784 0.40784 0.40784 0.40784 0.41176 0.41176 0.41176 0.41176 0.41569 0.41569 0.41569 0.41569 0.41961 0.41961 0.41961 0.41961 0.42353 0.42353 0.42353 0.42353 0.42745 0.42745 0.42745 0.42745 0.43137 0.43137 0.43137 0.43137 0.43529 0.43529 0.43529 0.43529 0.43922 0.43922 0.43922 0.43922 0.44314 0.44314 0.44314 0.44314 0.44706 0.44706 0.44706 0.44706 0.45098 0.45098 0.45098 0.45098 0.45490 0.45490 0.45490 0.45490 0.45882 0.45882 0.45882 0.45882 0.46275 0.46275 0.46275 0.46275 0.46667 0.46667 0.46667 0.46667 0.47059 0.47059 0.47059 0.47059 0.47451 0.47451 0.47451 0.47451 0.47843 0.47843 0.47843 0.47843 0.48235 0.48235 0.48235 0.48235 0.48627 0.48627 0.48627 0.48627 0.49020 0.49020 0.49020 0.49020 0.49412 0.49412 0.49412 0.49412 0.49804 0.49804 0.49804 0.49804 0.50196 0.50196 0.50196 0.50196 0.50588 0.50588 0.50588 0.50588 0.50980 0.50980 0.50980 0.50980 0.51373 0.51373 0.51373 0.51373 0.51765 0.51765 0.51765 0.51765 0.52157 0.52157 0.52157 0.52157 0.52549 0.52549 0.52549 0.52549 0.52941 0.52941 0.52941 0.52941 0.53333 0.53333 0.53333 0.53333 0.53725 0.53725 0.53725 0.53725 0.54118 0.54118 0.54118 0.54118 0.54510 0.54510 0.54510 0.54510 0.54902 0.54902 0.54902 0.54902 0.55294 0.55294 0.55294 0.55294 0.55686 0.55686 0.55686 0.55686 0.56078 0.56078 0.56078 0.56078 0.56471 0.56471 0.56471 0.56471 0.56863 0.56863 0.56863 0.56863 0.57255 0.57255 0.57255 0.57255 0.57647 0.57647 0.57647 0.57647 0.58039 0.58039 0.58039 0.58039 0.58431 0.58431 0.58431 0.58431 0.58824 0.58824 0.58824 0.58824 0.59216 0.59216 0.59216 0.59216 0.59608 0.59608 0.59608 0.59608 0.60000 0.60000 0.60000 0.60000 0.60392 0.60392 0.60392 0.60392 0.60784 0.60784 0.60784 0.60784 0.61176 0.61176 0.61176 0.61176 0.61569 0.61569 0.61569 0.61569 0.61961 0.61961 0.61961 0.61961 0.62353 0.62353 0.62353 0.62353 0.62745 0.62745 0.62745 0.62745 0.63137 0.63137 0.63137 0.63137 0.63529 0.63529 0.63529 0.63529 0.63922 0.63922 0.63922 0.63922 0.64314 0.64314 0.64314 0.64314 0.64706 0.64706 0.64706 0.64706 0.65098 0.65098 0.65098 0.65098 0.65490 0.65490 0.65490 0.65490 0.65882 0.65882 0.65882 0.65882 0.66275 0.66275 0.66275 0.66275 0.66667 0.66667 0.66667 0.66667 0.67059 0.67059 0.67059 0.67059 0.67451 0.67451 0.67451 0.67451 0.67843 0.67843 0.67843 0.67843 0.68235 0.68235 0.68235 0.68235 0.68627 0.68627 0.68627 0.68627 0.69020 0.69020 0.69020 0.69020 0.69412 0.69412 0.69412 0.69412 0.69804 0.69804 0.69804 0.69804 0.70196 0.70196 0.70196 0.70196 0.70588 0.70588 0.70588 0.70588 0.70980 0.70980 0.70980 0.70980 0.71373 0.71373 0.71373 0.71373 0.71765 0.71765 0.71765 0.71765 0.72157 0.72157 0.72157 0.72157 0.72549 0.72549 0.72549 0.72549 0.72941 0.72941 0.72941 0.72941 0.73333 0.73333 0.73333 0.73333 0.73725 0.73725 0.73725 0.73725 0.74118 0.74118 0.74118 0.74118 0.74510 0.74510 0.74510 0.74510 0.74902 0.74902 0.74902 0.74902 0.75294 0.75294 0.75294 0.75294 0.75686 0.75686 0.75686 0.75686 0.76078 0.76078 0.76078 0.76078 0.76471 0.76471 0.76471 0.76471 0.76863 0.76863 0.76863 0.76863 0.77255 0.77255 0.77255 0.77255 0.77647 0.77647 0.77647 0.77647 0.78039 0.78039 0.78039 0.78039 0.78431 0.78431 0.78431 0.78431 0.78824 0.78824 0.78824 0.78824 0.79216 0.79216 0.79216 0.79216 0.79608 0.79608 0.79608 0.79608 0.80000 0.80000 0.80000 0.80000 0.80392 0.80392 0.80392 0.80392 0.80784 0.80784 0.80784 0.80784 0.81176 0.81176 0.81176 0.81176 0.81569 0.81569 0.81569 0.81569 0.81961 0.81961 0.81961 0.81961 0.82353 0.82353 0.82353 0.82353 0.82745 0.82745 0.82745 0.82745 0.83137 0.83137 0.83137 0.83137 0.83529 0.83529 0.83529 0.83529 0.83922 0.83922 0.83922 0.83922 0.84314 0.84314 0.84314 0.84314 0.84706 0.84706 0.84706 0.84706 0.85098 0.85098 0.85098 0.85098 0.85490 0.85490 0.85490 0.85490 0.85882 0.85882 0.85882 0.85882 0.86275 0.86275 0.86275 0.86275 0.86667 0.86667 0.86667 0.86667 0.87059 0.87059 0.87059 0.87059 0.87451 0.87451 0.87451 0.87451 0.87843 0.87843 0.87843 0.87843 0.88235 0.88235 0.88235 0.88235 0.88627 0.88627 0.88627 0.88627 0.89020 0.89020 0.89020 0.89020 0.89412 0.89412 0.89412 0.89412 0.89804 0.89804 0.89804 0.89804 0.90196 0.90196 0.90196 0.90196 0.90588 0.90588 0.90588 0.90588 0.90980 0.90980 0.90980 0.90980 0.91373 0.91373 0.91373 0.91373 0.91765 0.91765 0.91765 0.91765 0.92157 0.92157 0.92157 0.92157 0.92549 0.92549 0.92549 0.92549 0.92941 0.92941 0.92941 0.92941 0.93333 0.93333 0.93333 0.93333 0.93725 0.93725 0.93725 0.93725 0.94118 0.94118 0.94118 0.94118 0.94510 0.94510 0.94510 0.94510 0.94902 0.94902 0.94902 0.94902 0.95294 0.95294 0.95294 0.95294 0.95686 0.95686 0.95686 0.95686 0.96078 0.96078 0.96078 0.96078 0.96471 0.96471 0.96471 0.96471 0.96863 0.96863 0.96863 0.96863 0.97255 0.97255 0.97255 0.97255 0.97647 0.97647 0.97647 0.97647 0.98039 0.98039 0.98039 0.98039 0.98431 0.98431 0.98431 0.98431 0.98824 0.98824 0.98824 0.98824 0.99216 0.99216 0.99216 0.99216 0.99608 0.99608 0.99608 0.99608 1.00000 1.00000 1.00000 1.00000 END_DATA DisplayCAL-3.1.0.0/misc/ti3/video_eeColor.ti30000644000076500000000000034731712647526532020356 0ustar devwheel00000000000000CTI3 DESCRIPTOR "Argyll Calibration Target chart information 3" ORIGINATOR "Argyll dispread" CREATED "Sat Mar 14 19:00:55 2009" KEYWORD "DEVICE_CLASS" DEVICE_CLASS "DISPLAY" KEYWORD "APPROX_WHITE_POINT" APPROX_WHITE_POINT "95.045781 100.000003 108.905751" KEYWORD "DARK_REGION_EMPHASIS" DARK_REGION_EMPHASIS "1.6" KEYWORD "ACCURATE_EXPECTED_VALUES" ACCURATE_EXPECTED_VALUES "true" KEYWORD "COLOR_REP" COLOR_REP "RGB_XYZ" KEYWORD "BLACK_COLOR_PATCHES" BLACK_COLOR_PATCHES "4" KEYWORD "COMP_GREY_STEPS" COMP_GREY_STEPS "97" KEYWORD "SINGLE_DIM_STEPS" SINGLE_DIM_STEPS "33" KEYWORD "WHITE_COLOR_PATCHES" WHITE_COLOR_PATCHES "4" KEYWORD "USE_BLACK_POINT_COMPENSATION" USE_BLACK_POINT_COMPENSATION "NO" KEYWORD "HIRES_B2A" HIRES_B2A "NO" KEYWORD "AUTO_OPTIMIZE" AUTO_OPTIMIZE "9" KEYWORD "3DLUT_SOURCE_PROFILE" 3DLUT_SOURCE_PROFILE "ref/Rec709.icm" KEYWORD "3DLUT_GAMMA" 3DLUT_GAMMA "-2.4" KEYWORD "3DLUT_DEGREE_OF_BLACK_OUTPUT_OFFSET" 3DLUT_DEGREE_OF_BLACK_OUTPUT_OFFSET "0.0" KEYWORD "3DLUT_INPUT_ENCODING" 3DLUT_INPUT_ENCODING "t" KEYWORD "3DLUT_OUTPUT_ENCODING" 3DLUT_OUTPUT_ENCODING "t" KEYWORD "3DLUT_GAMUT_MAPPING_MODE" 3DLUT_GAMUT_MAPPING_MODE "G" KEYWORD "3DLUT_RENDERING_INTENT" 3DLUT_RENDERING_INTENT "aw" KEYWORD "3DLUT_FORMAT" 3DLUT_FORMAT "eeColor" KEYWORD "3DLUT_SIZE" 3DLUT_SIZE "65" BEGIN_ARGYLL_COLPROF_ARGS -qh -bl -ax -M "SII REPEATER" END_ARGYLL_COLPROF_ARGS NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT SAMPLE_ID RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 1399 BEGIN_DATA 1 100.0000000 100.0000000 100.0000000 95.04580000 100.0000000 108.9060000 2 36.18660000 40.25050000 29.03860000 10.43240000 12.41520000 8.082730000 3 75.62240000 56.57030000 28.01850000 33.62140000 32.37170000 10.24120000 4 82.79480000 56.83720000 43.69100000 40.46860000 35.84890000 20.10110000 5 19.47590000 14.15960000 0.000000000 1.614820000 1.553530000 0.214771000 6 20.94060000 9.655240000 0.000000000 1.533610000 1.101250000 0.131754000 7 21.64610000 0.000000000 9.880980000 1.535610000 0.778814000 0.651906000 8 64.49270000 50.86790000 23.72350000 24.56660000 24.58230000 7.448250000 9 78.94490000 73.49390000 36.37540000 44.63550000 49.75270000 17.48580000 10 0.000000000 15.10070000 0.000000000 0.559497000 1.119080000 0.186522000 11 0.000000000 9.493670000 0.000000000 0.201613000 0.403256000 0.067212600 12 11.29030000 0.000000000 0.000000000 0.340406000 0.175489000 0.015935900 13 13.15790000 0.000000000 0.000000000 0.476651000 0.245728000 0.022314200 14 13.21410000 8.186610000 0.000000000 0.626698000 0.539183000 0.071050300 15 6.646220000 6.646220000 6.646220000 0.244634000 0.257385000 0.280307000 16 9.493670000 9.493670000 9.493670000 0.535904000 0.563838000 0.614052000 17 15.10070000 0.000000000 0.000000000 0.645261000 0.332651000 0.030207600 18 17.12330000 0.000000000 0.000000000 0.850733000 0.438578000 0.039826700 19 19.23080000 0.000000000 0.000000000 1.098130000 0.566119000 0.051408600 20 21.42860000 0.000000000 0.000000000 1.393190000 0.718230000 0.065221500 21 23.72260000 0.000000000 0.000000000 1.742400000 0.898261000 0.081569800 22 26.11940000 0.000000000 0.000000000 2.153160000 1.110020000 0.100799000 23 28.62600000 0.000000000 0.000000000 2.633900000 1.357850000 0.123305000 24 31.25000000 0.000000000 0.000000000 3.194240000 1.646720000 0.149537000 25 34.00000000 0.000000000 0.000000000 3.845230000 1.982330000 0.180013000 26 36.88520000 0.000000000 0.000000000 4.599570000 2.371210000 0.215327000 27 39.91600000 0.000000000 0.000000000 5.471880000 2.820920000 0.256164000 28 43.10340000 0.000000000 0.000000000 6.479100000 3.340170000 0.303316000 29 46.46020000 0.000000000 0.000000000 7.640830000 3.939070000 0.357702000 30 50.00000000 0.000000000 0.000000000 8.979910000 4.629410000 0.420390000 31 53.73830000 0.000000000 0.000000000 10.52300000 5.424900000 0.492628000 32 57.69230000 0.000000000 0.000000000 12.30120000 6.341650000 0.575877000 33 61.88120000 0.000000000 0.000000000 14.35140000 7.398570000 0.671854000 34 66.32650000 0.000000000 0.000000000 16.71680000 8.618020000 0.782591000 35 71.05260000 0.000000000 0.000000000 19.44890000 10.02650000 0.910491000 36 76.08700000 0.000000000 0.000000000 22.60880000 11.65550000 1.058420000 37 81.46070000 0.000000000 0.000000000 26.26990000 13.54290000 1.229810000 38 87.20930000 0.000000000 0.000000000 30.52020000 15.73410000 1.428790000 39 93.37350000 0.000000000 0.000000000 35.46650000 18.28400000 1.660350000 40 100.0000000 0.000000000 0.000000000 41.23850000 21.25960000 1.930560000 41 13.02300000 15.75260000 0.000000000 1.079970000 1.468310000 0.226506000 42 10.68380000 10.68380000 10.68380000 0.694840000 0.731058000 0.796164000 43 4.491020000 0.000000000 0.000000000 0.044824300 0.023108300 0.002098430 44 7.201650000 7.201650000 7.201650000 0.291861000 0.307074000 0.334421000 45 0.000000000 1.445090000 0.000000000 0.003210470 0.006421420 0.001070290 46 0.000000000 2.941180000 0.000000000 0.015321700 0.030645700 0.005107870 47 0.000000000 4.491020000 0.000000000 0.038866600 0.077738900 0.012957100 48 7.763980000 7.763980000 7.763980000 0.344338000 0.362287000 0.394551000 49 0.000000000 13.15790000 0.000000000 0.413298000 0.826656000 0.137783000 50 0.000000000 17.12330000 0.000000000 0.737658000 1.475430000 0.245916000 51 0.000000000 19.23080000 0.000000000 0.952175000 1.904490000 0.317431000 52 0.000000000 21.42860000 0.000000000 1.208020000 2.416210000 0.402721000 53 0.000000000 23.72260000 0.000000000 1.510810000 3.021850000 0.503667000 54 0.000000000 26.11940000 0.000000000 1.866980000 3.734230000 0.622403000 55 0.000000000 28.62600000 0.000000000 2.283820000 4.567970000 0.761366000 56 0.000000000 31.25000000 0.000000000 2.769680000 5.539770000 0.923340000 57 0.000000000 34.00000000 0.000000000 3.334140000 6.668780000 1.111520000 58 0.000000000 36.88520000 0.000000000 3.988220000 7.977030000 1.329570000 59 0.000000000 39.91600000 0.000000000 4.744590000 9.489890000 1.581730000 60 0.000000000 43.10340000 0.000000000 5.617940000 11.23670000 1.872880000 61 0.000000000 46.46020000 0.000000000 6.625260000 13.25150000 2.208690000 62 0.000000000 50.00000000 0.000000000 7.786350000 15.57390000 2.595770000 63 0.000000000 53.73830000 0.000000000 9.124320000 18.25000000 3.041810000 64 0.000000000 57.69230000 0.000000000 10.66620000 21.33400000 3.555850000 65 0.000000000 61.88120000 0.000000000 12.44390000 24.88960000 4.148480000 66 0.000000000 66.32650000 0.000000000 14.49490000 28.99200000 4.832240000 67 0.000000000 71.05260000 0.000000000 16.86390000 33.73020000 5.621980000 68 0.000000000 76.08700000 0.000000000 19.60380000 39.21050000 6.535400000 69 0.000000000 81.46070000 0.000000000 22.77820000 45.55980000 7.593680000 70 0.000000000 87.20930000 0.000000000 26.46360000 52.93120000 8.822290000 71 0.000000000 93.37350000 0.000000000 30.75250000 61.50950000 10.25210000 72 0.000000000 100.0000000 0.000000000 35.75730000 71.51990000 11.92060000 73 28.34880000 100.0000000 70.37100000 46.66960000 76.18290000 55.93060000 74 67.98480000 100.0000000 74.26580000 62.78950000 84.37210000 62.15630000 75 83.59200000 100.0000000 74.15010000 72.91270000 89.59460000 62.46250000 76 100.0000000 100.0000000 79.29620000 87.83280000 97.11460000 70.92110000 77 9.863630000 9.892620000 0.000000000 0.473628000 0.571849000 0.085421100 78 0.000000000 0.000000000 2.941180000 0.007734280 0.003093910 0.040730200 79 0.000000000 0.000000000 4.491020000 0.019619500 0.007848320 0.103320000 80 0.000000000 0.000000000 6.097560000 0.038438800 0.015376500 0.202426000 81 0.000000000 0.000000000 13.15790000 0.208629000 0.083457100 1.098680000 82 0.000000000 0.000000000 17.12330000 0.372364000 0.148955000 1.960940000 83 0.000000000 0.000000000 19.23080000 0.480650000 0.192272000 2.531190000 84 0.000000000 0.000000000 21.42860000 0.609797000 0.243934000 3.211300000 85 0.000000000 0.000000000 23.72260000 0.762647000 0.305078000 4.016240000 86 0.000000000 0.000000000 26.11940000 0.942436000 0.376999000 4.963040000 87 0.000000000 0.000000000 28.62600000 1.152850000 0.461170000 6.071130000 88 0.000000000 0.000000000 31.25000000 1.398110000 0.559281000 7.362710000 89 0.000000000 0.000000000 34.00000000 1.683050000 0.673263000 8.863250000 90 0.000000000 0.000000000 36.88520000 2.013220000 0.805340000 10.60200000 91 0.000000000 0.000000000 39.91600000 2.395030000 0.958075000 12.61270000 92 0.000000000 0.000000000 43.10340000 2.835890000 1.134430000 14.93430000 93 0.000000000 0.000000000 46.46020000 3.344380000 1.337840000 17.61210000 94 0.000000000 0.000000000 50.00000000 3.930490000 1.572300000 20.69870000 95 0.000000000 0.000000000 53.73830000 4.605880000 1.842470000 24.25540000 96 0.000000000 0.000000000 66.32650000 7.316920000 2.926960000 38.53230000 97 0.000000000 0.000000000 71.05260000 8.512740000 3.405320000 44.82970000 98 0.000000000 0.000000000 76.08700000 9.895840000 3.958590000 52.11330000 99 0.000000000 0.000000000 81.46070000 11.49830000 4.599600000 60.55200000 100 0.000000000 0.000000000 87.20930000 13.35860000 5.343790000 70.34900000 101 0.000000000 0.000000000 93.37350000 15.52360000 6.209840000 81.75010000 102 0.000000000 0.000000000 100.0000000 18.05000000 7.220460000 95.05460000 103 55.83310000 0.000000000 79.89610000 22.46440000 10.30840000 58.55950000 104 65.71360000 65.46360000 80.69580000 41.72460000 41.11790000 64.77050000 105 0.000000000 16.36620000 11.20940000 0.814484000 1.394420000 0.994951000 106 11.90480000 11.90480000 11.90480000 0.881537000 0.927487000 1.010090000 107 7.763980000 0.000000000 0.000000000 0.149401000 0.077020800 0.006994160 108 0.000000000 7.763980000 0.000000000 0.129544000 0.259107000 0.043186600 109 0.000000000 0.000000000 7.763980000 0.065392700 0.026158800 0.344370000 110 0.000000000 6.097560000 0.000000000 0.076147800 0.152307000 0.025385700 111 6.097560000 0.000000000 0.000000000 0.087820400 0.045274000 0.004111270 112 0.000000000 0.000000000 1.445090000 0.001620620 0.000648290 0.008534490 113 0.476190000 0.476190000 0.476190000 0.000742788 0.000781505 0.000851104 114 0.957854000 0.957854000 0.957854000 0.003454370 0.003634430 0.003958100 115 1.445090000 1.445090000 1.445090000 0.008533690 0.008978510 0.009778110 116 9.493670000 0.000000000 0.000000000 0.232518000 0.119870000 0.010885200 117 1.937980000 1.937980000 1.937980000 0.016272000 0.017120200 0.018644900 118 0.000000000 0.000000000 9.493670000 0.101773000 0.040711700 0.535954000 119 2.436650000 2.436650000 2.436650000 0.026923800 0.028327200 0.030850000 120 2.941180000 2.941180000 2.941180000 0.040726400 0.042849200 0.046665300 121 3.451680000 3.451680000 3.451680000 0.057908400 0.060926800 0.066352800 122 3.968250000 3.968250000 3.968250000 0.078694900 0.082796800 0.090170500 123 4.491020000 4.491020000 4.491020000 0.103310000 0.108695000 0.118376000 124 5.020080000 5.020080000 5.020080000 0.131981000 0.138860000 0.151227000 125 0.000000000 0.000000000 11.29030000 0.148995000 0.059601800 0.784634000 126 5.555560000 5.555560000 5.555560000 0.164935000 0.173533000 0.188987000 127 6.097560000 6.097560000 6.097560000 0.202407000 0.212957000 0.231923000 128 8.333330000 8.333330000 8.333330000 0.402325000 0.423296000 0.460994000 129 12.52720000 12.52720000 12.52720000 0.986096000 1.037500000 1.129890000 130 13.15790000 13.15790000 13.15790000 1.098580000 1.155840000 1.258780000 131 13.79690000 13.79690000 13.79690000 1.219340000 1.282900000 1.397150000 132 14.44440000 14.44440000 14.44440000 1.348750000 1.419050000 1.545430000 133 15.76580000 15.76580000 15.76580000 1.635060000 1.720280000 1.873490000 134 16.43990000 16.43990000 16.43990000 1.792770000 1.886220000 2.054200000 135 17.12330000 17.12330000 17.12330000 1.960760000 2.062960000 2.246680000 136 17.81610000 17.81610000 17.81610000 2.139470000 2.250990000 2.451450000 137 18.51850000 18.51850000 18.51850000 2.329370000 2.450790000 2.669050000 138 19.23080000 19.23080000 19.23080000 2.530960000 2.662880000 2.900030000 139 19.95310000 19.95310000 19.95310000 2.744730000 2.887800000 3.144980000 140 20.68560000 20.68560000 20.68560000 2.971230000 3.126100000 3.404510000 141 21.42860000 21.42860000 21.42860000 3.211000000 3.378370000 3.679240000 142 22.18230000 22.18230000 22.18230000 3.464630000 3.645220000 3.969850000 143 23.72260000 23.72260000 23.72260000 4.015870000 4.225190000 4.601480000 144 24.50980000 24.50980000 24.50980000 4.314770000 4.539670000 4.943970000 145 25.30860000 25.30860000 25.30860000 4.630100000 4.871440000 5.305280000 146 26.11940000 26.11940000 26.11940000 4.962580000 5.221250000 5.686240000 147 26.94240000 26.94240000 26.94240000 5.312950000 5.589890000 6.087710000 148 27.77780000 27.77780000 27.77780000 5.682010000 5.978180000 6.510580000 149 28.62600000 28.62600000 28.62600000 6.070570000 6.386990000 6.955800000 150 29.48720000 29.48720000 29.48720000 6.479480000 6.817220000 7.424350000 151 30.36180000 30.36180000 30.36180000 6.909660000 7.269820000 7.917250000 152 31.25000000 31.25000000 31.25000000 7.362030000 7.745770000 8.435590000 153 32.15220000 32.15220000 32.15220000 7.837590000 8.246120000 8.980490000 154 33.06880000 33.06880000 33.06880000 8.337360000 8.771940000 9.553140000 155 34.00000000 34.00000000 34.00000000 8.862420000 9.324370000 10.15480000 156 34.94620000 34.94620000 34.94620000 9.413920000 9.904620000 10.78670000 157 35.90790000 35.90790000 35.90790000 9.993030000 10.51390000 11.45030000 158 36.88520000 36.88520000 36.88520000 10.60100000 11.15360000 12.14690000 159 37.87880000 37.87880000 37.87880000 11.23920000 11.82500000 12.87810000 160 38.88890000 38.88890000 38.88890000 11.90880000 12.52960000 13.64540000 161 39.91600000 39.91600000 39.91600000 12.61150000 13.26890000 14.45060000 162 40.96050000 40.96050000 40.96050000 13.34870000 14.04450000 15.29520000 163 42.02280000 42.02280000 42.02280000 14.12190000 14.85800000 16.18120000 164 43.10340000 43.10340000 43.10340000 14.93290000 15.71130000 17.11050000 165 44.20290000 44.20290000 44.20290000 15.78340000 16.60610000 18.08500000 166 45.32160000 45.32160000 45.32160000 16.67530000 17.54450000 19.10700000 167 46.46020000 46.46020000 46.46020000 17.61050000 18.52840000 20.17850000 168 47.61900000 47.61900000 47.61900000 18.59100000 19.56000000 21.30200000 169 48.79880000 48.79880000 48.79880000 19.61900000 20.64160000 22.47990000 170 50.00000000 50.00000000 50.00000000 20.69670000 21.77560000 23.71480000 171 51.22320000 51.22320000 51.22320000 21.82670000 22.96440000 25.00950000 172 52.46910000 52.46910000 52.46910000 23.01130000 24.21070000 26.36680000 173 53.73830000 53.73830000 53.73830000 24.25320000 25.51740000 27.78990000 174 55.03140000 55.03140000 55.03140000 25.55520000 26.88730000 29.28180000 175 56.34920000 56.34920000 56.34920000 26.92030000 28.32360000 30.84600000 176 57.69230000 57.69230000 57.69230000 28.35170000 29.82950000 32.48600000 177 59.06150000 59.06150000 59.06150000 29.85250000 31.40860000 34.20580000 178 60.45750000 60.45750000 60.45750000 31.42640000 33.06450000 36.00910000 179 61.88120000 61.88120000 61.88120000 33.07690000 34.80100000 37.90030000 180 63.33330000 63.33330000 63.33330000 34.80800000 36.62230000 39.88380000 181 64.81480000 64.81480000 64.81480000 36.62380000 38.53280000 41.96440000 182 66.32650000 66.32650000 66.32650000 38.52870000 40.53700000 44.14710000 183 67.86940000 67.86940000 67.86940000 40.52730000 42.63970000 46.43710000 184 69.44440000 69.44440000 69.44440000 42.62450000 44.84630000 48.84020000 185 71.05260000 71.05260000 71.05260000 44.82550000 47.16200000 51.36210000 186 72.69500000 72.69500000 72.69500000 47.13590000 49.59280000 54.00940000 187 74.37280000 74.37280000 74.37280000 49.56140000 52.14480000 56.78870000 188 76.08700000 76.08700000 76.08700000 52.10840000 54.82460000 59.70710000 189 77.83880000 77.83880000 77.83880000 54.78350000 57.63910000 62.77220000 190 79.62960000 79.62960000 79.62960000 57.59360000 60.59570000 65.99220000 191 81.46070000 81.46070000 81.46070000 60.54640000 63.70230000 69.37550000 192 83.33330000 83.33330000 83.33330000 63.64960000 66.96740000 72.93130000 193 85.24900000 85.24900000 85.24900000 66.91200000 70.39970000 76.66940000 194 87.20930000 87.20930000 87.20930000 70.34240000 74.00900000 80.60010000 195 89.21570000 89.21570000 89.21570000 73.95070000 77.80530000 84.73450000 196 91.26980000 91.26980000 91.26980000 77.74700000 81.79960000 89.08440000 197 100.0000000 100.0000000 91.96320000 92.00840000 98.78500000 92.91030000 198 100.0000000 81.60980000 76.74380000 74.19320000 71.03720000 62.66260000 199 100.0000000 84.45000000 86.88810000 79.14620000 75.87800000 79.93090000 200 10.94810000 0.000000000 9.601720000 0.422464000 0.205741000 0.564354000 201 0.000000000 0.000000000 15.10070000 0.282430000 0.112979000 1.487330000 202 0.000000000 10.33340000 22.67520000 0.933476000 0.762126000 3.717550000 203 29.91970000 0.000000000 42.70670000 5.681600000 2.608070000 14.76950000 204 44.35130000 0.000000000 67.30290000 14.45470000 6.579090000 40.11370000 205 49.52420000 69.01080000 78.69820000 35.26760000 40.43180000 61.81220000 206 23.75210000 70.09500000 0.000000000 18.11520000 33.63920000 5.538480000 207 53.09250000 71.70330000 0.000000000 27.45220000 39.69580000 6.215520000 208 100.0000000 85.42810000 33.11380000 68.11600000 72.47760000 18.72450000 209 100.0000000 91.35830000 69.54470000 78.67070000 83.13580000 54.46620000 210 46.72430000 20.89060000 43.02070000 11.70290000 7.402950000 15.61430000 211 66.90700000 19.55090000 51.63590000 22.24650000 12.44730000 23.34420000 212 0.000000000 0.000000000 57.69230000 5.384230000 2.153830000 28.35430000 213 0.000000000 45.59070000 80.88170000 17.67500000 17.24030000 61.72840000 214 0.000000000 62.98100000 84.26860000 25.32340000 30.82840000 69.54960000 215 0.000000000 45.08500000 59.05490000 11.86950000 14.67140000 31.91550000 216 0.000000000 64.62960000 71.11170000 22.22020000 30.79730000 49.47620000 217 0.000000000 52.38060000 57.51790000 13.97350000 19.39080000 31.04160000 218 0.000000000 69.86820000 68.43220000 24.08930000 35.64120000 46.69180000 219 0.000000000 70.48080000 100.0000000 34.61680000 40.35660000 100.5780000 220 0.000000000 79.35790000 100.0000000 39.55510000 50.23390000 102.2240000 221 0.000000000 88.78420000 100.0000000 45.57600000 62.27660000 104.2310000 222 0.000000000 41.38020000 31.03300000 6.512640000 10.82310000 8.962870000 223 0.000000000 58.32010000 30.07070000 12.20790000 22.36190000 10.40700000 224 47.77500000 37.97340000 0.000000000 12.37600000 12.69220000 1.797710000 225 61.25000000 46.87190000 0.000000000 20.78650000 20.74470000 2.908840000 226 70.64520000 60.11200000 0.000000000 30.87940000 33.25200000 4.791160000 227 83.29470000 84.23340000 0.000000000 52.10640000 63.26250000 9.465270000 228 65.23390000 68.26600000 0.000000000 31.56060000 39.19800000 5.902970000 229 68.39920000 78.31160000 14.21970000 39.02120000 51.09640000 9.103550000 230 74.32500000 100.0000000 38.72730000 59.47160000 83.48650000 24.72720000 231 79.58850000 100.0000000 84.97470000 73.33500000 89.43500000 79.53460000 232 0.000000000 18.62310000 21.20980000 1.483450000 2.013140000 3.435440000 233 0.000000000 25.31750000 31.72670000 3.188680000 4.064940000 8.193120000 234 0.000000000 34.90900000 45.97710000 6.801720000 8.374630000 18.38980000 235 68.27620000 43.77400000 49.31960000 27.44230000 22.33530000 22.85580000 236 76.82380000 70.03830000 53.78700000 44.04710000 46.43160000 30.83190000 237 0.000000000 32.92980000 28.79140000 4.275250000 6.682900000 7.184590000 238 0.000000000 73.75240000 63.54720000 24.96480000 39.27720000 41.17270000 239 0.000000000 100.0000000 77.27440000 45.99600000 75.61560000 65.83920000 240 0.000000000 100.0000000 88.30430000 49.48760000 77.01240000 84.22670000 241 0.000000000 100.0000000 100.0000000 53.80730000 78.74040000 106.9750000 242 0.000000000 39.39160000 61.53190000 10.81250000 11.69960000 34.20710000 243 0.000000000 44.09460000 100.0000000 23.95600000 19.03330000 97.02350000 244 0.000000000 52.35390000 100.0000000 26.66540000 24.45240000 97.92680000 245 0.000000000 61.07990000 100.0000000 30.14230000 31.40680000 99.08590000 246 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 247 41.54630000 0.000000000 12.81390000 6.172290000 3.159260000 1.316250000 248 70.31060000 0.000000000 23.65710000 19.76310000 10.10090000 4.881600000 249 84.78780000 0.000000000 47.23920000 32.15640000 16.17690000 19.61110000 250 100.0000000 0.000000000 52.92420000 45.69230000 23.04130000 25.38520000 251 100.0000000 0.000000000 63.08060000 47.79090000 23.88080000 36.43710000 252 100.0000000 0.000000000 86.90030000 54.49320000 26.56190000 71.73250000 253 68.22890000 19.45920000 60.43860000 24.73070000 13.51140000 32.56630000 254 48.72460000 0.000000000 34.30220000 10.20000000 5.060170000 9.434580000 255 53.83400000 0.000000000 45.04880000 13.68920000 6.696250000 16.95140000 256 67.68530000 0.000000000 45.44390000 20.66480000 10.28540000 17.59420000 257 81.86040000 0.000000000 57.65320000 31.93040000 15.84010000 29.55520000 258 85.37840000 0.000000000 88.42760000 42.90120000 20.52610000 73.89210000 259 35.12170000 51.67870000 44.44730000 15.53660000 20.08960000 18.96210000 260 35.46710000 50.54140000 54.26730000 16.89880000 20.00510000 27.63910000 261 35.06590000 58.32980000 61.56210000 21.25310000 26.46190000 36.54150000 262 37.98160000 74.68580000 93.19550000 39.18280000 46.35280000 87.91110000 263 64.46880000 83.77100000 100.0000000 57.97760000 63.76650000 103.8650000 264 78.79220000 83.70940000 100.0000000 66.64850000 68.17850000 104.2600000 265 100.0000000 91.11700000 100.0000000 88.43020000 86.76780000 106.7000000 266 24.52780000 0.000000000 30.82510000 3.231760000 1.509370000 7.232100000 267 26.78640000 0.000000000 70.09100000 10.53740000 4.478100000 43.61270000 268 32.26250000 0.000000000 100.0000000 21.47630000 8.986810000 95.21500000 269 41.60570000 26.46420000 100.0000000 25.96590000 14.15420000 95.97590000 270 43.49310000 55.64040000 100.0000000 34.50830000 30.32830000 98.64760000 271 49.41410000 69.26280000 100.0000000 42.74380000 43.62120000 100.7790000 272 87.38650000 68.53030000 100.0000000 64.28200000 54.17770000 101.6820000 273 100.0000000 70.32150000 100.0000000 75.77310000 61.45180000 102.4810000 274 57.05340000 10.24880000 17.93840000 12.65460000 6.830390000 2.813580000 275 81.57000000 0.000000000 14.12310000 26.59130000 13.68040000 2.517210000 276 100.0000000 100.0000000 53.18250000 81.49750000 94.58040000 37.55820000 277 23.05960000 26.79320000 0.000000000 3.611640000 4.793350000 0.734901000 278 34.13740000 29.37270000 0.000000000 6.296380000 6.834130000 0.987346000 279 32.55640000 80.25540000 32.30620000 27.04300000 46.49410000 15.43350000 280 58.17970000 100.0000000 36.82360000 50.29410000 78.78240000 23.07030000 281 83.54270000 100.0000000 54.40440000 68.25880000 87.72880000 38.14210000 282 89.27070000 100.0000000 66.01880000 75.12900000 90.98060000 51.56490000 283 66.72690000 72.46480000 50.02420000 38.48400000 45.52900000 27.38440000 284 100.0000000 87.27330000 56.80130000 72.94790000 76.35770000 38.16730000 285 57.75510000 51.51830000 31.22700000 22.04240000 23.54810000 10.70030000 286 100.0000000 53.93300000 31.98570000 51.90720000 40.24400000 12.74600000 287 100.0000000 64.63140000 35.47410000 56.77890000 49.38620000 16.22570000 288 100.0000000 67.54200000 48.16870000 59.94480000 52.88140000 26.02760000 289 50.82600000 34.81090000 23.64250000 13.57790000 12.12570000 5.592940000 290 74.50760000 34.78060000 23.70110000 25.85550000 18.44470000 6.187360000 291 74.80590000 60.99490000 100.0000000 51.88550000 42.56120000 100.0930000 292 75.51760000 71.74190000 100.0000000 57.51420000 53.13900000 101.8380000 293 0.000000000 70.77200000 33.60510000 18.35810000 34.09410000 14.21170000 294 0.000000000 85.54980000 37.24240000 27.42510000 51.56380000 19.28640000 295 0.000000000 100.0000000 38.83460000 38.01200000 72.42180000 23.79400000 296 0.000000000 100.0000000 53.37790000 40.29550000 73.33530000 35.81970000 297 0.000000000 23.42150000 12.51660000 1.655870000 3.012900000 1.474050000 298 0.000000000 33.74690000 14.29130000 3.530000000 6.660170000 2.411030000 299 76.51200000 42.82270000 64.60180000 35.33030000 25.63780000 39.28060000 300 90.95650000 61.21350000 65.16050000 52.66620000 44.37710000 42.67610000 301 35.83790000 17.90660000 19.48910000 5.626100000 4.051600000 3.080030000 302 51.74140000 23.38280000 26.49130000 12.11790000 8.307800000 6.060970000 303 86.42750000 51.87350000 84.87650000 50.94940000 37.34610000 70.49200000 304 100.0000000 57.73610000 100.0000000 69.97250000 49.84980000 100.5470000 305 0.000000000 45.49680000 16.16890000 6.655130000 12.78600000 3.837800000 306 15.40400000 54.88520000 32.03670000 11.70890000 20.05580000 10.99450000 307 25.43920000 100.0000000 91.44970000 52.61790000 78.49930000 90.10720000 308 33.60700000 100.0000000 100.0000000 57.55550000 80.67260000 107.1510000 309 0.000000000 35.99710000 66.56310000 11.15450000 10.51070000 40.09540000 310 0.000000000 37.62620000 83.49760000 16.30660000 13.19000000 65.32080000 311 25.70480000 0.000000000 22.66030000 2.768260000 1.347470000 3.728610000 312 100.0000000 0.000000000 25.12220000 42.10360000 21.60570000 6.486400000 313 100.0000000 0.000000000 34.27690000 42.95180000 21.94500000 10.95330000 314 100.0000000 0.000000000 43.47890000 44.12900000 22.41590000 17.15240000 315 16.94390000 0.000000000 19.64370000 1.334900000 0.630008000 2.691180000 316 15.27790000 8.502690000 21.40190000 1.428370000 0.901001000 3.286270000 317 11.55950000 25.56510000 33.91570000 3.813350000 4.416590000 9.425510000 318 0.000000000 53.56840000 44.48770000 12.10100000 19.33940000 19.03010000 319 0.000000000 65.37960000 51.20780000 18.18600000 29.74650000 26.49600000 320 0.000000000 82.14170000 58.76390000 28.80570000 48.64440000 37.25950000 321 0.000000000 100.0000000 65.27270000 42.82100000 74.34550000 49.11920000 322 17.92590000 21.10810000 13.36620000 2.325500000 2.908900000 1.570930000 323 24.55140000 17.89220000 17.91850000 3.103020000 2.758380000 2.525640000 324 32.26720000 35.31460000 82.87670000 18.99400000 13.79320000 64.25970000 325 20.95070000 32.28680000 39.12180000 6.593070000 7.552180000 13.12150000 326 37.29560000 37.04950000 52.32510000 13.08390000 12.22260000 24.43800000 327 46.70300000 100.0000000 79.55160000 54.40020000 79.87020000 69.75730000 328 56.97890000 100.0000000 100.0000000 65.77650000 84.91080000 107.5360000 329 0.000000000 43.67700000 24.89290000 6.631510000 11.90730000 6.393010000 330 0.000000000 70.38840000 45.80690000 19.76090000 34.33750000 22.57910000 331 49.68160000 69.57050000 48.97210000 28.70950000 38.26910000 25.55620000 332 100.0000000 70.42320000 68.15070000 65.54230000 57.44310000 48.34500000 333 53.40590000 35.08430000 32.46350000 15.47310000 13.10500000 9.683100000 334 71.03330000 33.87260000 31.11420000 24.12880000 17.18840000 9.304860000 335 100.0000000 53.27580000 42.16010000 52.89220000 40.24650000 19.14000000 336 100.0000000 77.17180000 53.54310000 66.03140000 63.53800000 32.73470000 337 100.0000000 21.12680000 0.000000000 42.40940000 23.60170000 2.320910000 338 100.0000000 21.04540000 18.88240000 42.86120000 23.76660000 4.749060000 339 100.0000000 21.68090000 40.48210000 44.94840000 24.72710000 15.35320000 340 100.0000000 19.02560000 51.30270000 46.32770000 24.78350000 24.14390000 341 51.58180000 24.09540000 0.000000000 11.18010000 8.084860000 0.971428000 342 71.14940000 23.40830000 0.000000000 20.97430000 12.99100000 1.402330000 343 84.52920000 36.02010000 0.000000000 32.28080000 22.26150000 2.595950000 344 100.0000000 36.08740000 0.000000000 45.03940000 28.86210000 3.197710000 345 100.0000000 73.56880000 0.000000000 59.44360000 57.67260000 7.999690000 346 100.0000000 86.17350000 0.000000000 67.01580000 72.81800000 10.52400000 347 15.10070000 15.10070000 15.10070000 1.487190000 1.564710000 1.704060000 348 10.08490000 10.08490000 10.08490000 0.612056000 0.643959000 0.701309000 349 0.000000000 11.29030000 0.000000000 0.295161000 0.590365000 0.098399100 350 11.29030000 11.29030000 11.29030000 0.784561000 0.825456000 0.898969000 351 40.36230000 32.79050000 25.84320000 9.606860000 9.417190000 6.137270000 352 47.73890000 38.56910000 47.42830000 16.01010000 14.38120000 20.27580000 353 47.51700000 39.87250000 62.61730000 19.20860000 16.18500000 35.90530000 354 59.89720000 62.95070000 100.0000000 44.33070000 39.95280000 99.98780000 355 65.58440000 75.65990000 100.0000000 53.72090000 54.35600000 102.2730000 356 100.0000000 80.84430000 100.0000000 81.68940000 73.28520000 104.4530000 357 45.74350000 22.67340000 29.48030000 9.981640000 7.034360000 7.278390000 358 53.92080000 28.84010000 42.45540000 15.66620000 11.20620000 15.71520000 359 75.30950000 29.37450000 44.14200000 27.50940000 17.42540000 17.57770000 360 38.12510000 41.34480000 22.11150000 10.72600000 13.06440000 5.381190000 361 37.85270000 75.21170000 41.88290000 26.64260000 41.80040000 20.61920000 362 44.94770000 100.0000000 44.47740000 45.90030000 76.39790000 28.25450000 363 27.82910000 42.06700000 60.86510000 13.85740000 14.35010000 33.78830000 364 45.53960000 54.98260000 60.91670000 22.97550000 25.38920000 35.49780000 365 50.84600000 73.25150000 74.56890000 36.81720000 44.65890000 56.30190000 366 58.24590000 83.01470000 75.60540000 46.06580000 57.87310000 59.89470000 367 41.79670000 60.83140000 53.76490000 22.65020000 28.93640000 28.56060000 368 52.81550000 100.0000000 57.36450000 51.20410000 78.86900000 40.39600000 369 52.66790000 100.0000000 69.15840000 53.84640000 79.91880000 54.63510000 370 63.00490000 100.0000000 83.41090000 62.80050000 84.06240000 76.40560000 371 28.23840000 0.000000000 17.02260000 2.923680000 1.464790000 2.055330000 372 44.93150000 13.47710000 100.0000000 25.58450000 11.75150000 95.53220000 373 56.74050000 24.06330000 100.0000000 31.46820000 16.45240000 96.12950000 374 70.66040000 33.59710000 100.0000000 40.51140000 23.62180000 97.03690000 375 86.98590000 44.71320000 100.0000000 54.48830000 35.04640000 98.50550000 376 23.51830000 10.56320000 76.16640000 11.88310000 5.358990000 52.39810000 377 38.74230000 20.56940000 76.20250000 16.15720000 8.821790000 52.89550000 378 59.54810000 39.57380000 75.90410000 27.68750000 20.04860000 54.00770000 379 72.45280000 58.73980000 76.83110000 41.50840000 36.70560000 57.89050000 380 93.37350000 93.37350000 93.37350000 81.74250000 86.00330000 93.66260000 381 95.52850000 95.52850000 95.52850000 85.94890000 90.42900000 98.48230000 382 97.73660000 97.73660000 97.73660000 90.37880000 95.08980000 103.5580000 383 0.000000000 15.57160000 35.87560000 2.492600000 1.954910000 10.17380000 384 0.000000000 19.86960000 35.08170000 2.826180000 2.767670000 9.836340000 385 27.00260000 20.61760000 50.36790000 7.420640000 5.011740000 21.51350000 386 26.97610000 29.77110000 61.05270000 10.89920000 8.610580000 33.05190000 387 41.67990000 28.86190000 62.91330000 14.85750000 10.35940000 35.36250000 388 45.94140000 77.64390000 71.80230000 36.66280000 48.32450000 53.05850000 389 47.79290000 80.80180000 83.00370000 42.48890000 53.73860000 70.94300000 390 46.83360000 84.04540000 100.0000000 50.22460000 60.02910000 103.5520000 391 0.000000000 21.06240000 64.94430000 8.148840000 5.120820000 37.17600000 392 0.000000000 29.32450000 67.53760000 10.02210000 7.862490000 40.89930000 393 0.000000000 48.99920000 72.75430000 16.41530000 18.48380000 49.70770000 394 100.0000000 49.20250000 74.82600000 58.29300000 40.10810000 54.66890000 395 100.0000000 64.00690000 80.14890000 65.73690000 52.50670000 64.82720000 396 57.06540000 42.30960000 47.42200000 20.90060000 18.37720000 20.78400000 397 62.55650000 48.61410000 48.63840000 25.71670000 23.69730000 22.60750000 398 22.94690000 22.94690000 22.94690000 3.732700000 3.927270000 4.277020000 399 25.02750000 20.22760000 23.59470000 3.777880000 3.440350000 4.415270000 400 25.09310000 20.96920000 34.81140000 4.895900000 4.029210000 9.811340000 401 100.0000000 37.77550000 37.72810000 47.55720000 30.51260000 14.47380000 402 100.0000000 39.36850000 47.13230000 49.29280000 31.84640000 21.64230000 403 100.0000000 46.32630000 60.42730000 53.78340000 36.81210000 35.52010000 404 100.0000000 60.04890000 63.27230000 59.48270000 47.19590000 40.55120000 405 58.97390000 17.19250000 0.000000000 13.65450000 8.144180000 0.852494000 406 82.86290000 20.24720000 0.000000000 28.34100000 16.19380000 1.632350000 407 100.0000000 56.66120000 18.74620000 51.94430000 41.94590000 7.741180000 408 100.0000000 77.13630000 20.41770000 61.99010000 61.88860000 11.55330000 409 100.0000000 100.0000000 21.17330000 77.58970000 93.01710000 16.97890000 410 10.24510000 0.000000000 17.23850000 0.652821000 0.292900000 2.002950000 411 0.000000000 12.12380000 19.33590000 0.831656000 0.885062000 2.676800000 412 0.000000000 0.000000000 61.88120000 6.281580000 2.512790000 33.08000000 413 42.03990000 0.000000000 85.33520000 18.86810000 8.256090000 67.35420000 414 57.02950000 0.000000000 100.0000000 30.04260000 13.40300000 95.61610000 415 78.47000000 0.000000000 100.0000000 42.24540000 19.69390000 96.18730000 416 100.0000000 0.000000000 100.0000000 59.28850000 28.48010000 96.98520000 417 100.0000000 24.20990000 100.0000000 60.86840000 31.64020000 97.51190000 418 37.22360000 0.000000000 35.69940000 6.566480000 3.168800000 10.08650000 419 46.36570000 0.000000000 50.64270000 11.64910000 5.538560000 21.64440000 420 57.03430000 0.000000000 64.07960000 18.77760000 8.896980000 36.28130000 421 100.0000000 0.000000000 74.74930000 50.75570000 25.06680000 52.05020000 422 100.0000000 36.75840000 74.33500000 54.59820000 32.93740000 52.76080000 423 100.0000000 41.64100000 86.47080000 59.55680000 36.91970000 72.71190000 424 100.0000000 42.18430000 100.0000000 64.64630000 39.19660000 98.77130000 425 63.15820000 0.000000000 28.23930000 16.12970000 8.186080000 6.594990000 426 74.75620000 0.000000000 36.88390000 23.76130000 12.01720000 11.61930000 427 85.46240000 0.000000000 35.39810000 31.03080000 15.78490000 11.05120000 428 0.000000000 17.76410000 50.28520000 4.779700000 3.191680000 21.22580000 429 0.000000000 17.81970000 86.07750000 13.78560000 6.803070000 68.62520000 430 0.000000000 16.51100000 100.0000000 18.73090000 8.582350000 95.28160000 431 0.000000000 35.62870000 100.0000000 21.74550000 14.61200000 96.28660000 432 41.47440000 38.77230000 100.0000000 28.45350000 19.19150000 96.81710000 433 47.94840000 48.96450000 100.0000000 33.67560000 26.31570000 97.91700000 434 62.63830000 53.19290000 100.0000000 41.71230000 32.66470000 98.71900000 435 19.99000000 35.89980000 32.71870000 6.500080000 8.750990000 9.453920000 436 25.64450000 100.0000000 45.32760000 40.99300000 73.85320000 28.69900000 437 66.12700000 100.0000000 50.96560000 56.46310000 81.72080000 34.28600000 438 44.36640000 53.42320000 28.54190000 17.05640000 22.03280000 9.357920000 439 48.49150000 65.47570000 33.87810000 24.15380000 33.17620000 13.88350000 440 59.17360000 73.79380000 78.23160000 41.85410000 47.57180000 62.11740000 441 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 442 2.941180000 0.000000000 0.000000000 0.017670400 0.009109590 0.000827230 443 8.909850000 8.909850000 8.909850000 0.466089000 0.490383000 0.534056000 444 44.40240000 84.74530000 0.000000000 31.76340000 53.26340000 8.607160000 445 44.03720000 100.0000000 0.000000000 42.54910000 75.02130000 12.23850000 446 73.93760000 100.0000000 0.000000000 56.98530000 82.46350000 12.91430000 447 86.67970000 100.0000000 0.000000000 65.87140000 87.04460000 13.33030000 448 100.0000000 100.0000000 0.000000000 76.99580000 92.77950000 13.85110000 449 100.0000000 100.0000000 66.02370000 84.23940000 95.67720000 51.99760000 450 35.78880000 15.73370000 0.000000000 4.916600000 3.443800000 0.405651000 451 41.69810000 25.61310000 0.000000000 7.811900000 6.682220000 0.878167000 452 55.59570000 34.65640000 0.000000000 14.81680000 12.80100000 1.690110000 453 84.58290000 47.60900000 0.000000000 35.52610000 28.69350000 3.666440000 454 100.0000000 50.03240000 0.000000000 49.03590000 36.85570000 4.530040000 455 100.0000000 62.38890000 0.000000000 53.90800000 46.60060000 6.154260000 456 19.76820000 43.91870000 0.000000000 7.021040000 12.31090000 2.006290000 457 26.64670000 64.35390000 39.42340000 18.14420000 29.22160000 16.90000000 458 24.80520000 66.87960000 100.0000000 34.73410000 37.73770000 100.0660000 459 44.74760000 92.09100000 100.0000000 54.91630000 70.51410000 105.3290000 460 78.54690000 92.35400000 100.0000000 72.31640000 79.76290000 106.1970000 461 89.83530000 91.55390000 100.0000000 80.07780000 82.91950000 106.3980000 462 89.83820000 100.0000000 100.0000000 86.38750000 95.53640000 108.5000000 463 100.0000000 100.0000000 100.0000000 95.04580000 100.0000000 108.9060000 464 30.61980000 36.57930000 0.000000000 6.970120000 9.406820000 1.448420000 465 32.22310000 46.29290000 0.000000000 9.989990000 14.90840000 2.351210000 466 48.54030000 50.96630000 11.69310000 16.69550000 20.64520000 3.948760000 467 48.08970000 56.97300000 0.000000000 18.61860000 25.00270000 3.844950000 468 57.42180000 57.83970000 11.96540000 23.07030000 27.79820000 5.037330000 469 83.20730000 73.44680000 0.000000000 45.66340000 50.47010000 7.335580000 470 52.45290000 47.03090000 18.35860000 17.21690000 18.92930000 5.021450000 471 55.73800000 49.73010000 38.12780000 21.26300000 22.13460000 14.50220000 472 60.26610000 53.12200000 54.81130000 27.24680000 26.69770000 28.93280000 473 11.27770000 6.767730000 15.84690000 0.749378000 0.492244000 1.701600000 474 0.000000000 8.603320000 12.70520000 0.355521000 0.402004000 1.071380000 475 0.000000000 10.11480000 40.20410000 2.664990000 1.436910000 12.89110000 476 0.000000000 12.55950000 55.24120000 5.267010000 2.703920000 25.89670000 477 21.39250000 33.55170000 87.90110000 18.21900000 12.63000000 72.72660000 478 26.32970000 47.19720000 100.0000000 27.10010000 22.06840000 97.44370000 479 50.08370000 55.35810000 68.38280000 26.57820000 27.25830000 44.87740000 480 85.07940000 54.25090000 68.95970000 46.19270000 36.72490000 46.43600000 481 100.0000000 92.72810000 91.14350000 86.24540000 87.72640000 89.54530000 482 100.0000000 100.0000000 100.0000000 95.04580000 100.0000000 108.9060000 483 11.28200000 27.83220000 24.77960000 3.326090000 4.805010000 5.151920000 484 0.000000000 26.38200000 38.65840000 4.140730000 4.710250000 12.39150000 485 0.000000000 24.79990000 51.26250000 5.817880000 4.992810000 22.42090000 486 13.04630000 27.16830000 63.48920000 9.149820000 6.971790000 35.70050000 487 0.000000000 44.00680000 41.68240000 8.514450000 12.81490000 15.83310000 488 29.05200000 83.18820000 46.05850000 29.85610000 50.42700000 25.35870000 489 46.75420000 87.43330000 52.95160000 38.81980000 59.00840000 32.71630000 490 47.64710000 87.38550000 82.90270000 46.60870000 62.11100000 72.17410000 491 0.000000000 31.64850000 21.24880000 3.446540000 5.935760000 4.101780000 492 0.000000000 58.77640000 18.51730000 11.55430000 22.40260000 6.033710000 493 45.54840000 71.56150000 15.20880000 24.73240000 38.14960000 7.564200000 494 49.77640000 91.76190000 17.57810000 38.88360000 63.94070000 12.36050000 495 23.13920000 56.89240000 0.000000000 11.99320000 21.53930000 3.525550000 496 24.88550000 100.0000000 0.000000000 37.69310000 72.51780000 12.01120000 497 74.45340000 100.0000000 22.42230000 57.98600000 82.90160000 16.47760000 498 87.13760000 100.0000000 24.13940000 67.01480000 87.54250000 17.51980000 499 28.24970000 33.96910000 28.37460000 7.016560000 8.426690000 7.183570000 500 40.83400000 32.94620000 31.87820000 10.32420000 9.772500000 8.998580000 501 100.0000000 32.93960000 52.07860000 48.64700000 29.19920000 25.60570000 502 100.0000000 37.20870000 63.52700000 51.95890000 32.05350000 38.33160000 503 100.0000000 57.13860000 69.88230000 59.88830000 45.42910000 48.63360000 504 38.55020000 21.43610000 36.89510000 8.291930000 5.836890000 11.24850000 505 59.73370000 26.33850000 35.94760000 17.08280000 11.41010000 11.27390000 506 64.42260000 24.89420000 42.18150000 20.06360000 12.52490000 15.53480000 507 20.40940000 12.95690000 10.43770000 1.776510000 1.494530000 0.851985000 508 18.15310000 19.76930000 4.327400000 1.997210000 2.529660000 0.477815000 509 15.82200000 24.03100000 26.11490000 3.211410000 3.854370000 5.512790000 510 16.84860000 68.86050000 37.15060000 18.60700000 32.72530000 16.05640000 511 36.11830000 69.92240000 52.33110000 25.01620000 36.56360000 28.51330000 512 84.02830000 79.77710000 57.78090000 55.28350000 60.17520000 37.01970000 513 100.0000000 82.61000000 67.17900000 72.25480000 71.25550000 49.39170000 514 61.04100000 71.12810000 25.12030000 31.69460000 41.33450000 10.84220000 515 68.58690000 87.43940000 23.39920000 45.35280000 62.81200000 13.61280000 516 88.46170000 89.84230000 41.40930000 62.34150000 73.78330000 24.56680000 517 87.92100000 100.0000000 42.21950000 69.53750000 88.62160000 27.64420000 518 62.40780000 74.11230000 38.27490000 35.30750000 45.41860000 18.35300000 519 64.63950000 92.82480000 40.04880000 48.56500000 69.82570000 23.56470000 520 72.65580000 94.01150000 54.77130000 56.44640000 74.88960000 36.65570000 521 19.65700000 30.38680000 9.637400000 3.861770000 5.844960000 1.476080000 522 18.01450000 32.87220000 0.000000000 4.046900000 6.682290000 1.076570000 523 81.31420000 41.81490000 18.22190000 31.84820000 24.17140000 5.225230000 524 86.69920000 59.27730000 20.18930000 41.98520000 38.39070000 8.001700000 525 100.0000000 67.48680000 21.58350000 56.91640000 51.62650000 10.21320000 526 20.86420000 17.95120000 9.943050000 2.244810000 2.359220000 0.927664000 527 22.75300000 20.64220000 0.000000000 2.702270000 3.044970000 0.445348000 528 32.28610000 31.02060000 9.641560000 6.262250000 7.262050000 1.623650000 529 33.81240000 45.31770000 13.41980000 10.28880000 14.59090000 3.416180000 530 32.64550000 53.64630000 9.055120000 12.69810000 20.03080000 3.678000000 531 16.38040000 5.029340000 10.35840000 0.944802000 0.546849000 0.701951000 532 17.12060000 0.000000000 13.06010000 1.055670000 0.520523000 1.120610000 533 16.12000000 7.635410000 15.99720000 1.190450000 0.762066000 1.764980000 534 14.83030000 12.22600000 17.37040000 1.356050000 1.176750000 2.169970000 535 20.51510000 0.000000000 55.24110000 6.159820000 2.610300000 25.83150000 536 74.18930000 22.33360000 77.55190000 33.03000000 17.80030000 55.78780000 537 85.03970000 22.49630000 90.64660000 44.76360000 23.39290000 78.39140000 538 36.66110000 0.000000000 25.40800000 5.425220000 2.694420000 4.883080000 539 83.11890000 0.000000000 23.41580000 28.20140000 14.45310000 5.188420000 540 91.53260000 45.31090000 27.02380000 41.23270000 30.44820000 9.028370000 541 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 542 0.000000000 53.78440000 36.34230000 11.09020000 19.06390000 13.30940000 543 38.99700000 65.36770000 40.87710000 21.76040000 31.76790000 18.21350000 544 52.79210000 66.72470000 56.35360000 29.92000000 36.63860000 32.29750000 545 52.71670000 57.01310000 51.25340000 24.63050000 27.64650000 25.79370000 546 60.92910000 59.45420000 51.23240000 29.41270000 31.60250000 26.28570000 547 67.88940000 63.26750000 59.15770000 36.35020000 37.47930000 35.14170000 548 76.06570000 70.33510000 61.42700000 45.26720000 47.10640000 39.10400000 549 36.00080000 22.01870000 17.04370000 6.011450000 4.960370000 2.572590000 550 43.59980000 36.13760000 17.68790000 10.85680000 11.21110000 3.688030000 551 45.43090000 43.84860000 33.04630000 14.68820000 16.05050000 10.61100000 552 46.88420000 78.69230000 33.58550000 30.54370000 46.89790000 16.02990000 553 17.18100000 93.68350000 15.55630000 32.13600000 62.52190000 11.95500000 554 17.97250000 92.65330000 55.58420000 36.14050000 62.94330000 36.24890000 555 21.30290000 92.87220000 100.0000000 49.81580000 68.71500000 105.2500000 556 24.17560000 49.33120000 53.00780000 13.84480000 17.84360000 26.14120000 557 69.11040000 57.15880000 54.24930000 33.45210000 32.21730000 29.10610000 558 72.34530000 56.41780000 59.02930000 36.05290000 33.00840000 34.15220000 559 35.10160000 49.96010000 34.99290000 13.69030000 18.39010000 12.22680000 560 42.17870000 49.53100000 33.34740000 15.41680000 19.08410000 11.32510000 561 53.43340000 59.86010000 42.54300000 24.71510000 29.59650000 18.85340000 562 74.57350000 63.26860000 55.49540000 39.64090000 39.26270000 31.40230000 563 86.98430000 70.00270000 56.86280000 51.88340000 50.37500000 34.32700000 564 94.08190000 73.57610000 72.48340000 63.16430000 58.56940000 54.59760000 565 21.01220000 12.04690000 17.42020000 2.061480000 1.523470000 2.212440000 566 67.23400000 0.000000000 13.82860000 17.45670000 8.972560000 2.031960000 567 100.0000000 0.000000000 14.56500000 41.49930000 21.36400000 3.304320000 568 100.0000000 45.15130000 18.09440000 47.88060000 33.87210000 6.218590000 569 100.0000000 89.28010000 19.59460000 69.60460000 77.19470000 13.85780000 570 100.0000000 100.0000000 38.09140000 79.15660000 93.64390000 25.23050000 571 16.27190000 17.98520000 22.17040000 2.239440000 2.298630000 3.770440000 572 14.01670000 45.18920000 62.41860000 13.18320000 15.31070000 35.81880000 573 18.99200000 51.11520000 73.09580000 18.30220000 20.52320000 50.48850000 574 19.29350000 57.83830000 92.59640000 27.07260000 28.11990000 83.88880000 575 47.13690000 59.24230000 91.46800000 34.02980000 32.61580000 82.26460000 576 46.88860000 75.85580000 100.0000000 45.31970000 50.18880000 101.9110000 577 13.27060000 40.50610000 24.58790000 6.211070000 10.38160000 6.001820000 578 11.90310000 47.30160000 23.21880000 8.001850000 14.27320000 6.146540000 579 0.000000000 71.81600000 21.39940000 17.87280000 34.77550000 8.957360000 580 9.889460000 25.83390000 9.706380000 2.183620000 3.818930000 1.182160000 581 66.03030000 25.08600000 9.544040000 18.36440000 11.99180000 1.886680000 582 68.38000000 33.12260000 0.000000000 21.02410000 15.51190000 1.886280000 583 81.43930000 38.47530000 43.58590000 33.53690000 23.45050000 17.99240000 584 91.13970000 43.87750000 61.26930000 45.61520000 31.47960000 35.88670000 585 33.51640000 46.49130000 23.12900000 11.08230000 15.48040000 6.184890000 586 41.62470000 65.55930000 22.50950000 20.80860000 31.62480000 8.569430000 587 39.09880000 29.02660000 9.436070000 7.683660000 7.445380000 1.558600000 588 47.65710000 35.45630000 10.02090000 11.85140000 11.52470000 2.200800000 589 72.18710000 56.16390000 12.81340000 30.38980000 30.57140000 5.331130000 590 80.37700000 58.44370000 65.95180000 43.70790000 37.99040000 42.90780000 591 88.99580000 66.08200000 77.95220000 56.72700000 49.38430000 61.25130000 592 91.78460000 73.08740000 89.61560000 66.27960000 59.17130000 82.26950000 593 24.47440000 46.03020000 28.64020000 9.511440000 14.40700000 8.329140000 594 22.24320000 69.76370000 29.14370000 18.90990000 33.65850000 11.78620000 595 74.92220000 89.93040000 46.43160000 53.50810000 69.23410000 28.05050000 596 82.95900000 88.94490000 59.03810000 60.64430000 71.63820000 40.32250000 597 100.0000000 91.52230000 81.48580000 82.17210000 84.72180000 72.33400000 598 45.03450000 20.66470000 52.65840000 12.65480000 7.670970000 23.90220000 599 53.72920000 24.35500000 81.69030000 23.68950000 13.25290000 61.95400000 600 27.83380000 8.828420000 31.77830000 4.098730000 2.200590000 7.812470000 601 40.60120000 8.930590000 44.13610000 8.844300000 4.476090000 16.05720000 602 57.20970000 7.029410000 56.08440000 17.23990000 8.457820000 27.24550000 603 67.41690000 10.07980000 66.29390000 24.86620000 12.31650000 39.37840000 604 83.71920000 0.000000000 70.83600000 36.35410000 17.76490000 45.83560000 605 78.52330000 20.52290000 61.06100000 31.43010000 17.12950000 33.62400000 606 100.0000000 21.23380000 62.69100000 48.88630000 26.21350000 36.36480000 607 85.00120000 20.52480000 42.07850000 32.63490000 18.14490000 15.88120000 608 91.13290000 64.17060000 53.73370000 51.70560000 46.13490000 30.31840000 609 100.0000000 73.08180000 61.08780000 65.28550000 59.58720000 40.06610000 610 26.15040000 14.93200000 9.012800000 2.795420000 2.241010000 0.761094000 611 28.26600000 12.03120000 0.000000000 2.901060000 1.999520000 0.233081000 612 43.58280000 13.49900000 0.000000000 7.075830000 4.296910000 0.456543000 613 43.09630000 43.43380000 81.19570000 23.60600000 19.33270000 62.32750000 614 60.56650000 83.41310000 83.83020000 49.93220000 59.95210000 73.13390000 615 60.93400000 83.22900000 90.50130000 52.24530000 60.71250000 84.93190000 616 73.41490000 90.51630000 92.78380000 64.92900000 74.34410000 91.17210000 617 72.72810000 100.0000000 92.15440000 71.31040000 88.10660000 92.30020000 618 24.05490000 40.86220000 44.31740000 9.806520000 12.12370000 17.62450000 619 34.20180000 39.96800000 61.33950000 14.81510000 13.99010000 34.21510000 620 50.52100000 45.41190000 60.22910000 21.40660000 19.70660000 33.69940000 621 54.01600000 47.19750000 77.55110000 27.82110000 23.33320000 57.12900000 622 20.08960000 19.16670000 27.73920000 3.229870000 2.944120000 6.036910000 623 17.10040000 79.29850000 27.88650000 23.40630000 43.81530000 12.92870000 624 47.49680000 79.54390000 56.12300000 34.70430000 49.39740000 34.26750000 625 49.89310000 81.19930000 65.98360000 38.78950000 52.74040000 46.05410000 626 72.75430000 42.32810000 32.11090000 27.37040000 21.95290000 10.57490000 627 82.87780000 46.15940000 30.98950000 35.18930000 27.67900000 10.68310000 628 65.25250000 35.72640000 21.69030000 20.47140000 16.00090000 5.292600000 629 72.08460000 41.91780000 20.33430000 25.90260000 21.13510000 5.562930000 630 82.65980000 65.20770000 30.75010000 42.43990000 42.45230000 13.03090000 631 85.57390000 80.61410000 49.40870000 55.36550000 61.14920000 28.95590000 632 9.743040000 18.03620000 16.55700000 1.418900000 1.919200000 2.108330000 633 0.000000000 23.28540000 20.45090000 2.000530000 3.120840000 3.381330000 634 0.000000000 57.74660000 55.13530000 15.56170000 23.32770000 29.22700000 635 0.000000000 57.39860000 71.30380000 19.12620000 24.52770000 48.69510000 636 0.000000000 72.90340000 85.56570000 30.65620000 40.81750000 73.41520000 637 0.000000000 82.17610000 86.25440000 36.25960000 51.66040000 76.40720000 638 43.25030000 90.55320000 92.11920000 50.34300000 66.89050000 89.24350000 639 64.01310000 92.11460000 100.0000000 63.35930000 74.89160000 105.7290000 640 37.18560000 29.46270000 52.97830000 11.57940000 9.066310000 24.53770000 641 53.80240000 31.14780000 77.38360000 23.57090000 15.04760000 55.49690000 642 57.91760000 38.96520000 100.0000000 34.95670000 22.61660000 97.13550000 643 17.27420000 0.000000000 39.70910000 3.235130000 1.394310000 12.51000000 644 22.49960000 9.290780000 40.04310000 4.155040000 2.148900000 12.83790000 645 26.37300000 50.72010000 39.38780000 12.56040000 18.13560000 15.03020000 646 28.82490000 54.96190000 52.78630000 16.69010000 22.32640000 26.64180000 647 39.54670000 56.26410000 55.18790000 20.33880000 24.90710000 29.33380000 648 43.21670000 57.96170000 73.49440000 26.46210000 28.58120000 52.18530000 649 0.000000000 12.92710000 12.89570000 0.597116000 0.874942000 1.183630000 650 56.85900000 33.03400000 9.660840000 15.14900000 12.44340000 2.157920000 651 69.44780000 42.66730000 0.000000000 23.98960000 20.52330000 2.697330000 652 79.21360000 54.23070000 0.000000000 34.01170000 31.35460000 4.259880000 653 86.49030000 64.75280000 0.000000000 43.71890000 42.95090000 5.986690000 654 92.79830000 65.60920000 11.23070000 49.28740000 46.40300000 7.131530000 655 29.17280000 18.80550000 0.000000000 3.652300000 3.228650000 0.430743000 656 28.51560000 37.41760000 51.03910000 10.83990000 11.22380000 23.15090000 657 36.41860000 49.54730000 58.91270000 17.74260000 19.82650000 32.44390000 658 65.21250000 52.54370000 65.49630000 31.90670000 28.51950000 41.12850000 659 73.16400000 64.87650000 65.76840000 41.73200000 41.18280000 43.39670000 660 59.45370000 27.83610000 22.47730000 15.96720000 11.34160000 4.898290000 661 75.84910000 71.31640000 19.93170000 39.97560000 45.78980000 9.457690000 662 83.17420000 71.03910000 26.41190000 45.32310000 48.27970000 11.99310000 663 34.87770000 0.000000000 55.46690000 9.004920000 4.071940000 26.19480000 664 34.53240000 9.466650000 64.63450000 11.09190000 5.217230000 36.65660000 665 50.89930000 12.50310000 82.43510000 21.51130000 10.27490000 62.71680000 666 69.01010000 16.04420000 100.0000000 36.92980000 17.90260000 96.12170000 667 0.000000000 9.480420000 28.66380000 1.357200000 0.864532000 6.155810000 668 9.978890000 18.24330000 31.29340000 2.509790000 2.390770000 7.680040000 669 10.13370000 18.70570000 45.06590000 4.291940000 3.181490000 16.78180000 670 27.04720000 16.36700000 65.57660000 10.12910000 5.389160000 37.91210000 671 45.82180000 36.82510000 79.19860000 22.19350000 16.09280000 58.58740000 672 58.23390000 50.20080000 90.00280000 34.72970000 27.91250000 78.60670000 673 0.000000000 84.93780000 21.55530000 25.58920000 50.19360000 11.57800000 674 0.000000000 100.0000000 21.82760000 36.39240000 71.77390000 15.26480000 675 25.66410000 100.0000000 27.61850000 38.89430000 73.01400000 17.62870000 676 80.52120000 31.17720000 31.83290000 29.81980000 19.29570000 9.785600000 677 91.70420000 31.54770000 37.10210000 38.95430000 24.04510000 13.27810000 678 90.23710000 34.52550000 63.04480000 42.89190000 26.47590000 37.15320000 679 91.56160000 46.34520000 78.42920000 51.13790000 34.92380000 59.49360000 680 91.24330000 100.0000000 82.22860000 81.20660000 93.59460000 75.31320000 681 31.82140000 38.19640000 36.47830000 9.595450000 11.11360000 11.93780000 682 30.55530000 38.20240000 41.25570000 9.923680000 11.21440000 15.14100000 683 30.25970000 89.50930000 67.57440000 38.62180000 60.63340000 49.62600000 684 48.70020000 89.08840000 75.88430000 46.04630000 63.77610000 61.45090000 685 67.93730000 92.74280000 78.81670000 58.61360000 73.96210000 67.23910000 686 25.48940000 42.06780000 32.45230000 8.885100000 12.31120000 9.870990000 687 37.70120000 57.75460000 32.00750000 16.99160000 24.46230000 11.55120000 688 54.84670000 60.02530000 34.01680000 24.32900000 29.62550000 13.26790000 689 58.19120000 82.06230000 42.48220000 38.43300000 53.86470000 22.76950000 690 23.85990000 31.32110000 19.31260000 5.033360000 6.671320000 3.565510000 691 28.86210000 37.43070000 19.10200000 7.274590000 9.810820000 3.992810000 692 27.75920000 53.29410000 17.48600000 11.81090000 19.34490000 5.155470000 693 25.62090000 58.69930000 26.11720000 14.08600000 23.60240000 8.752490000 694 83.31550000 70.96980000 65.40290000 51.51870000 50.71220000 44.26190000 695 84.98240000 81.82770000 75.02310000 61.43110000 64.71440000 59.54310000 696 21.85560000 19.64770000 16.07330000 2.777130000 2.876160000 2.107040000 697 19.78060000 23.52310000 36.12960000 4.575010000 4.338060000 10.67930000 698 19.55040000 28.37630000 46.99610000 6.808710000 6.439830000 18.86210000 699 21.27100000 53.84450000 46.30250000 13.85420000 20.36390000 20.60010000 700 32.63660000 75.84370000 49.32390000 26.79500000 42.27290000 26.74210000 701 9.296120000 17.96540000 10.41760000 1.166640000 1.804110000 0.941093000 702 11.62640000 19.93890000 6.612350000 1.440020000 2.267690000 0.602626000 703 36.32110000 81.79470000 15.14410000 27.71460000 48.37750000 9.367210000 704 43.83890000 100.0000000 24.00490000 43.26480000 75.29980000 16.35750000 705 20.14560000 42.31670000 10.09510000 6.727700000 11.46420000 2.468930000 706 27.20660000 84.78290000 0.000000000 27.22650000 50.96050000 8.401720000 707 58.23280000 84.99840000 53.24140000 42.07940000 58.30310000 32.69060000 708 79.22280000 85.91870000 72.24270000 59.14830000 67.49390000 56.19210000 709 43.77480000 27.74120000 35.68380000 10.70640000 8.467620000 10.88170000 710 69.12360000 39.13290000 39.93590000 25.24650000 19.48200000 14.99780000 711 78.84320000 48.09370000 45.08620000 34.72830000 28.15450000 20.01460000 712 41.04650000 25.09110000 26.08910000 8.467680000 6.794180000 5.792550000 713 43.67160000 29.00900000 24.65860000 9.850370000 8.473420000 5.469120000 714 57.24700000 38.03990000 50.98100000 20.46340000 16.41200000 23.59130000 715 63.21830000 37.94490000 60.00190000 25.15640000 18.59240000 33.02990000 716 25.02050000 9.456150000 51.08270000 6.278920000 3.057800000 21.85560000 717 71.57470000 0.000000000 73.98450000 29.06900000 13.91120000 49.92410000 718 74.65340000 11.40000000 81.66340000 33.54540000 16.40590000 61.99940000 719 86.75910000 15.62960000 100.0000000 48.82830000 23.98360000 96.66840000 720 54.72160000 14.51550000 68.32050000 19.27340000 9.795480000 41.80950000 721 100.0000000 21.96480000 74.55020000 51.97560000 27.59570000 52.18220000 722 100.0000000 23.25010000 86.64850000 55.85430000 29.41920000 71.77040000 723 100.0000000 54.99710000 87.10590000 64.16330000 45.79290000 75.29700000 724 13.66940000 22.76260000 0.000000000 1.897950000 3.026630000 0.484189000 725 19.02520000 24.63370000 10.20580000 2.833170000 3.883610000 1.225760000 726 15.39720000 24.68270000 14.63440000 2.585610000 3.749990000 1.969310000 727 56.87270000 24.90190000 10.58300000 13.73030000 9.558990000 1.798990000 728 76.07810000 35.66230000 91.63420000 41.20100000 25.01770000 80.73120000 729 22.20000000 13.94390000 100.0000000 20.02540000 8.935940000 95.28170000 730 84.66790000 31.30690000 100.0000000 49.42910000 27.52570000 97.32050000 731 37.17870000 14.04210000 28.35970000 6.286690000 3.818470000 6.325710000 732 44.66840000 21.22830000 34.86670000 9.969910000 6.691110000 10.09030000 733 58.18100000 24.62320000 46.93670000 17.59160000 11.10850000 19.14520000 734 87.83390000 36.03170000 51.04250000 38.90400000 25.20500000 24.37390000 735 52.78360000 21.37710000 35.49880000 13.16840000 8.358920000 10.61950000 736 71.03220000 20.81890000 47.61840000 24.10080000 13.70000000 19.88000000 737 80.81230000 22.41070000 55.20620000 32.03250000 17.92840000 27.38920000 738 52.50290000 15.07810000 39.55670000 12.90380000 7.209020000 13.01830000 739 89.57760000 10.90290000 45.79520000 35.88600000 18.53190000 18.66910000 740 100.0000000 22.78460000 30.10810000 43.90920000 24.54030000 9.175450000 741 100.0000000 38.96610000 28.14980000 46.84940000 30.70440000 9.281960000 742 100.0000000 76.22370000 39.79890000 63.29940000 61.57720000 21.02330000 743 100.0000000 90.10400000 47.69480000 73.21540000 79.54900000 30.06750000 744 28.89730000 61.73290000 48.87420000 18.80600000 27.64050000 23.94010000 745 34.94950000 72.69240000 60.65610000 27.82840000 39.97680000 37.75940000 746 67.47540000 75.35750000 75.46870000 46.27290000 51.22640000 58.39760000 747 77.72330000 83.28260000 76.74160000 57.68970000 64.07870000 62.18570000 748 58.11440000 65.73460000 80.46930000 37.90470000 39.34750000 64.26630000 749 68.98370000 83.47910000 80.96760000 53.60880000 62.01360000 68.61580000 750 78.24500000 90.83850000 80.48270000 64.18610000 74.77060000 69.74020000 751 39.56340000 46.68410000 46.03820000 15.33980000 17.47000000 19.74560000 752 39.04990000 70.56480000 75.26030000 31.48540000 39.77570000 56.65770000 753 45.53060000 75.69990000 85.26470000 39.40610000 47.62620000 73.74990000 754 88.27200000 80.96840000 100.0000000 71.87070000 68.33580000 104.0150000 755 30.26620000 24.27010000 61.16330000 10.68820000 7.161330000 32.91080000 756 35.56730000 32.07120000 71.66490000 15.85300000 11.52400000 46.86000000 757 20.76450000 10.52910000 30.83470000 2.910730000 1.719600000 7.294480000 758 17.50940000 14.13270000 31.85210000 2.835180000 2.011240000 7.881380000 759 14.56360000 7.749620000 33.65860000 2.371000000 1.223730000 8.739630000 760 11.98030000 21.39490000 55.96370000 6.627490000 4.622250000 26.93900000 761 10.11670000 44.89670000 90.67240000 20.96530000 18.25000000 78.70040000 762 21.24040000 55.85960000 100.0000000 29.35160000 27.79680000 98.43070000 763 0.000000000 28.64560000 82.97680000 14.26140000 9.364850000 63.82070000 764 0.000000000 26.73490000 100.0000000 20.01510000 11.15100000 95.70970000 765 26.01060000 75.66050000 100.0000000 39.54640000 47.04910000 101.6100000 766 61.90840000 10.83850000 14.10080000 14.87800000 8.042550000 2.041760000 767 67.73010000 12.90590000 9.728820000 18.00820000 9.859400000 1.517110000 768 78.12990000 27.79300000 16.50770000 26.44910000 16.77300000 3.644650000 769 89.98800000 51.64230000 21.89920000 41.69930000 33.83460000 7.686240000 770 89.15680000 77.82800000 77.90800000 63.06720000 61.89790000 63.26450000 771 88.69880000 78.68160000 90.87150000 67.40600000 64.39230000 85.52860000 772 36.59070000 27.46250000 35.52590000 8.457470000 7.240860000 10.66820000 773 35.77920000 25.55150000 42.54340000 8.836040000 6.877900000 15.30530000 774 63.92000000 66.76370000 59.89700000 35.96490000 39.69820000 36.41610000 775 75.38760000 77.54730000 59.69330000 48.39860000 54.62740000 38.41380000 776 43.72380000 44.76850000 39.69050000 15.15760000 16.60650000 14.80520000 777 79.41020000 44.54380000 50.71490000 34.93180000 26.50570000 24.53110000 778 87.81460000 51.55460000 62.11090000 45.64970000 35.16720000 37.57790000 779 46.67210000 31.37420000 43.81030000 13.45080000 10.74280000 16.77100000 780 49.12410000 34.57860000 54.79480000 16.90510000 13.29690000 26.87440000 781 68.91670000 46.60100000 69.29490000 32.91220000 25.93830000 45.50160000 782 73.75250000 47.33510000 100.0000000 46.06400000 31.91050000 98.34410000 783 20.41850000 25.08640000 68.22640000 10.74700000 7.177500000 41.62950000 784 21.26710000 54.41540000 68.34850000 18.56580000 22.59270000 44.35390000 785 21.13110000 61.43960000 81.11670000 24.99220000 29.75420000 64.13800000 786 15.39690000 72.79180000 56.53490000 23.60800000 37.97980000 33.07890000 787 30.27220000 100.0000000 58.67940000 44.32470000 75.29110000 41.49220000 788 28.89860000 100.0000000 81.94840000 50.09690000 77.56670000 73.39860000 789 51.18170000 100.0000000 90.58800000 59.73390000 82.20300000 88.84570000 790 18.35740000 43.01520000 76.09580000 16.48250000 15.65690000 54.03750000 791 25.00140000 41.99780000 84.05210000 19.57960000 16.54830000 66.72960000 792 31.41090000 59.00470000 82.87530000 26.37970000 28.85850000 66.77610000 793 29.69900000 73.19840000 86.87520000 34.10650000 42.78230000 75.89360000 794 39.54270000 82.41800000 92.00410000 43.75840000 55.52020000 87.17880000 795 26.35040000 19.46190000 14.34850000 3.425200000 3.187890000 1.757890000 796 30.81660000 24.76470000 8.940710000 4.847440000 4.954090000 1.168310000 797 51.91350000 27.95140000 17.40620000 12.30620000 9.517000000 3.211950000 798 59.66690000 39.56370000 20.68790000 18.46360000 16.36120000 5.143540000 799 67.99170000 59.36080000 20.76020000 29.57890000 32.04300000 7.607500000 800 68.37510000 59.87240000 38.66270000 31.67890000 33.25460000 16.45290000 801 81.27620000 69.01730000 41.95030000 44.63060000 46.18600000 20.56730000 802 100.0000000 71.98380000 77.93080000 69.02310000 60.14230000 62.64690000 803 26.26190000 16.58880000 22.36370000 3.536910000 2.767380000 3.858950000 804 35.04700000 17.66140000 59.01810000 10.56020000 5.962560000 30.26280000 805 58.70750000 48.69180000 68.48470000 27.97840000 24.42190000 44.39070000 806 65.89950000 50.08080000 76.87950000 34.41900000 28.17560000 56.69110000 807 65.21410000 53.50210000 86.43140000 38.24070000 31.61690000 72.74280000 808 27.06650000 27.15410000 22.24110000 5.023910000 5.532500000 4.272110000 809 37.88950000 35.31200000 21.20110000 9.098800000 10.00160000 4.573290000 810 36.49980000 38.63670000 11.15750000 9.056290000 11.20900000 2.447270000 811 42.34130000 42.95490000 0.000000000 11.80530000 14.36340000 2.150350000 812 55.47560000 52.50190000 0.000000000 19.95460000 23.15740000 3.418350000 813 76.55450000 57.38450000 37.53620000 35.54910000 33.73500000 15.60490000 814 87.12530000 56.87610000 100.0000000 58.84270000 43.59710000 99.92650000 815 23.41250000 18.87030000 92.10730000 17.67050000 8.725660000 79.71570000 816 23.75670000 26.55110000 100.0000000 21.73340000 11.99290000 95.78170000 817 23.51790000 36.81240000 100.0000000 23.73040000 16.04420000 96.45850000 818 0.000000000 15.03870000 71.23710000 9.115890000 4.533800000 45.27090000 819 13.13390000 11.44050000 84.40330000 13.21020000 5.825460000 65.59030000 820 23.40030000 0.000000000 86.73630000 14.89060000 6.151900000 69.59180000 821 30.52560000 82.59170000 85.60940000 39.33880000 53.65700000 75.51140000 822 27.57600000 14.73950000 15.45400000 3.253740000 2.430650000 1.855350000 823 46.63490000 10.61360000 10.91830000 8.100220000 4.542420000 1.175460000 824 49.99330000 27.20380000 23.22510000 11.74690000 9.002930000 4.934250000 825 74.24540000 25.05120000 22.42600000 23.80000000 14.72030000 5.119910000 826 81.09320000 42.16010000 36.91330000 33.37760000 24.91850000 13.62130000 827 58.68070000 46.17380000 39.47560000 21.64250000 20.59050000 15.08540000 828 61.35030000 76.09540000 54.40210000 38.42250000 48.37260000 32.11550000 829 66.12540000 76.02670000 62.27190000 42.54430000 50.25070000 40.84250000 830 0.000000000 85.08570000 49.59580000 28.92800000 51.68230000 28.68910000 831 10.53400000 92.01340000 63.15140000 36.63690000 62.33460000 44.53190000 832 40.94710000 28.17990000 18.25800000 8.422650000 7.568070000 3.264580000 833 100.0000000 32.40630000 14.33690000 44.49050000 27.36100000 4.257590000 834 100.0000000 51.60970000 50.96990000 53.68690000 39.59770000 26.30560000 835 100.0000000 62.56750000 53.94140000 58.63220000 48.61830000 30.63830000 836 18.94880000 35.11170000 20.20700000 5.177600000 7.920170000 4.065200000 837 17.37540000 58.69230000 42.45010000 14.69780000 23.70560000 18.17490000 838 16.64260000 62.44560000 53.30420000 18.01840000 27.61340000 28.09620000 839 13.81360000 70.22980000 79.91810000 27.99270000 37.56080000 63.56350000 840 15.82700000 93.62380000 80.69380000 42.91110000 66.74640000 69.65150000 841 12.93780000 97.81400000 94.22920000 50.35820000 74.69900000 94.78330000 842 26.59190000 25.60550000 31.36630000 5.436470000 5.293070000 8.123740000 843 24.85190000 29.32420000 38.23370000 6.516790000 6.683090000 12.36630000 844 27.98710000 31.00830000 45.17150000 8.372880000 7.995640000 17.58060000 845 48.27530000 65.43690000 62.63120000 28.83380000 35.00940000 39.04820000 846 54.54980000 73.88490000 65.79580000 36.44200000 45.24040000 44.49320000 847 16.33650000 21.91510000 18.81660000 2.494450000 3.117250000 2.871850000 848 15.58310000 19.37090000 37.26160000 3.717650000 3.115150000 11.19630000 849 19.94810000 17.08950000 41.13640000 4.483740000 3.106310000 13.77690000 850 36.86440000 16.85320000 40.81180000 7.820990000 4.798990000 13.69610000 851 38.07260000 33.91280000 39.75760000 10.62100000 10.12330000 13.83900000 852 39.76770000 44.39690000 49.58560000 15.28180000 16.33330000 22.57610000 853 38.83820000 49.18550000 67.54300000 20.27760000 20.72380000 42.84850000 854 45.25340000 62.91740000 67.94430000 27.83310000 32.61930000 45.26980000 855 51.62810000 62.67820000 71.13850000 30.97000000 33.98190000 49.66690000 856 80.24220000 68.30650000 74.16220000 50.23060000 47.77250000 55.60280000 857 81.66510000 75.57260000 79.86050000 56.73590000 56.65080000 65.64220000 858 10.00700000 7.606290000 25.23400000 1.258500000 0.731725000 4.654040000 859 13.45270000 0.000000000 27.03560000 1.517120000 0.664693000 5.377400000 860 38.75420000 7.677200000 75.97110000 15.11680000 6.841610000 52.22110000 861 69.57370000 0.000000000 87.00920000 31.86100000 14.89010000 70.86370000 862 89.15070000 60.64520000 93.90100000 59.65530000 46.61130000 88.23750000 863 32.01160000 17.66440000 27.97890000 5.254160000 3.754740000 6.194410000 864 35.44040000 23.09410000 28.69610000 6.795860000 5.483940000 6.775880000 865 34.16380000 27.73180000 30.08020000 7.301540000 6.777710000 7.662140000 866 49.99820000 40.54560000 39.09890000 16.17850000 15.36670000 14.10930000 867 49.09800000 45.13000000 51.54460000 19.04520000 18.56020000 24.60690000 868 58.48090000 61.38060000 68.54810000 32.76440000 34.12970000 46.09620000 869 67.19920000 61.10670000 83.30390000 41.38650000 37.91070000 68.44670000 870 81.04840000 65.72380000 88.63440000 54.02860000 47.34610000 78.85430000 871 100.0000000 68.98770000 90.14730000 71.41160000 58.61930000 82.86600000 872 100.0000000 78.60200000 89.70540000 76.50960000 69.06300000 83.80370000 873 70.05840000 82.47060000 0.000000000 42.25930000 56.53180000 8.684970000 874 80.26920000 86.90470000 14.84610000 51.96510000 65.74540000 11.37800000 875 91.27030000 93.37560000 9.299470000 64.58450000 78.94190000 12.34390000 876 37.87690000 59.84480000 0.000000000 16.43690000 25.63750000 4.082420000 877 38.07400000 70.59150000 0.000000000 21.55600000 35.79320000 5.772930000 878 59.62050000 86.24950000 0.000000000 39.05090000 58.47560000 9.229210000 879 59.82670000 100.0000000 0.000000000 49.08170000 78.38900000 12.54430000 880 60.28770000 100.0000000 22.26230000 49.97170000 78.77120000 16.04750000 881 71.40600000 20.87850000 27.88440000 21.89130000 12.85370000 7.031440000 882 91.39610000 27.18320000 73.93690000 45.16520000 25.23690000 51.19300000 883 92.52880000 33.11210000 82.74820000 49.81210000 28.97500000 65.35290000 884 78.69870000 29.57060000 69.77860000 34.98420000 20.73210000 45.03850000 885 81.84240000 41.34510000 80.89320000 42.99040000 28.46550000 62.57960000 886 86.11180000 63.11320000 82.55100000 54.51660000 46.03040000 68.07050000 887 71.24740000 100.0000000 63.99440000 62.08660000 84.31230000 48.45190000 888 76.71650000 100.0000000 100.0000000 76.82960000 90.60900000 108.0530000 889 100.0000000 100.0000000 100.0000000 95.04580000 100.0000000 108.9060000 890 51.32810000 19.33590000 17.55760000 10.87000000 6.989010000 2.838600000 891 81.60820000 16.98080000 20.05280000 27.62580000 15.25630000 4.251420000 892 86.66620000 21.06800000 29.86020000 32.53250000 18.35310000 8.459000000 893 53.69280000 0.000000000 20.64050000 11.06490000 5.639430000 3.448980000 894 55.57810000 14.96940000 23.91940000 12.65710000 7.250220000 4.803310000 895 56.25500000 22.58510000 53.03060000 17.46690000 10.50120000 24.55530000 896 62.03470000 27.00290000 75.38200000 26.13390000 15.33510000 52.40250000 897 68.26460000 72.44200000 82.96980000 47.37950000 49.16840000 69.74690000 898 71.59770000 81.96390000 94.84990000 58.93590000 62.80530000 93.24300000 899 11.90110000 82.51170000 72.68880000 32.76160000 50.63980000 54.96010000 900 0.000000000 86.28700000 80.73100000 37.12500000 56.21740000 67.98400000 901 0.000000000 87.51640000 71.12470000 35.20080000 56.75490000 53.82050000 902 75.55560000 92.06090000 73.45120000 61.23030000 74.76440000 59.20530000 903 32.67890000 0.000000000 13.41390000 3.741930000 1.903940000 1.311230000 904 31.42690000 8.489940000 9.491790000 3.493550000 2.023380000 0.739693000 905 48.64320000 9.936640000 43.67820000 11.59530000 5.971370000 15.84580000 906 61.68080000 11.11170000 42.85250000 17.33410000 9.035960000 15.50590000 907 65.46480000 0.000000000 57.05460000 21.49710000 10.47550000 28.43000000 908 93.02220000 10.48130000 59.87840000 41.26740000 20.97180000 32.50120000 909 93.75350000 13.28680000 76.87590000 46.32990000 23.34210000 55.12510000 910 13.40800000 8.545560000 12.24210000 0.834796000 0.647289000 1.014090000 911 8.880180000 19.05410000 23.58510000 1.886750000 2.270920000 4.285680000 912 0.000000000 17.69510000 26.94970000 1.802500000 1.989820000 5.580970000 913 24.81140000 22.84260000 83.95160000 15.59910000 8.686830000 65.25230000 914 30.71680000 51.12150000 84.42010000 23.68820000 22.91310000 68.36510000 915 40.28500000 54.58560000 79.73410000 25.99660000 26.15530000 61.17500000 916 46.74080000 67.25990000 84.28570000 35.08350000 38.84610000 70.61190000 917 37.22150000 9.549400000 18.09400000 5.316890000 2.995660000 2.501500000 918 44.34980000 0.000000000 22.65540000 7.587470000 3.831960000 3.952500000 919 44.64790000 9.365870000 29.58430000 8.435780000 4.496260000 6.920110000 920 58.27010000 0.000000000 33.39280000 14.19150000 7.129270000 9.107490000 921 81.20510000 17.10800000 33.76850000 28.48310000 15.58540000 10.19780000 922 81.98150000 52.77930000 32.05990000 36.88970000 31.86710000 11.95980000 923 89.86630000 66.30120000 46.67430000 50.46370000 47.12660000 24.14560000 924 71.80480000 49.42420000 38.28340000 29.68000000 26.31760000 14.96830000 925 72.80000000 57.19000000 46.04260000 34.25800000 32.81600000 21.71450000 926 89.73020000 57.15720000 52.98120000 47.40830000 39.43880000 28.51510000 927 35.62410000 74.25880000 22.28930000 23.50850000 39.63090000 9.896320000 928 44.97320000 92.39710000 32.95750000 38.73460000 64.39960000 18.62740000 929 0.000000000 31.02000000 32.82600000 4.282930000 6.073690000 9.112540000 930 0.000000000 29.98560000 49.46620000 6.367980000 6.594360000 21.05890000 931 14.46500000 32.30160000 56.04380000 8.617480000 8.281460000 27.62350000 932 12.02760000 38.52470000 62.79710000 11.26760000 11.57460000 35.64770000 933 0.000000000 55.52880000 86.75520000 23.01240000 24.89690000 72.81510000 934 61.19670000 73.93140000 86.88590000 45.65760000 49.32900000 76.56730000 935 33.77550000 32.76560000 24.56810000 7.687030000 8.431040000 5.539860000 936 86.36770000 36.53450000 26.05850000 34.71910000 23.58830000 7.638200000 937 43.45890000 18.74320000 19.34640000 7.984100000 5.395780000 3.173640000 938 47.15980000 15.94380000 72.44980000 17.41190000 8.886120000 47.37110000 939 94.25500000 15.18750000 90.21090000 51.16430000 25.55570000 77.66810000 940 60.95530000 7.524820000 92.16520000 29.08950000 13.43360000 80.13180000 941 76.20180000 16.07210000 93.67510000 38.95980000 19.23180000 83.60790000 942 22.33490000 9.448260000 20.95910000 2.306380000 1.418100000 3.196570000 943 32.30040000 21.85040000 21.86000000 5.333180000 4.547830000 3.936380000 944 32.61760000 27.00830000 24.38010000 6.329230000 6.152810000 5.099350000 945 33.02240000 35.27250000 41.87220000 9.881800000 10.15360000 15.38600000 946 41.53290000 33.70110000 48.21500000 12.86970000 11.07030000 20.47800000 947 40.73540000 39.26520000 47.93210000 13.88000000 13.53560000 20.65600000 948 45.27520000 40.15510000 35.15190000 13.83710000 14.06130000 11.47760000 949 60.36090000 40.45710000 41.37790000 21.06680000 17.81680000 15.91630000 950 71.74630000 51.22430000 47.47210000 31.58740000 28.07060000 22.13450000 951 80.33760000 65.64880000 47.62780000 43.18320000 42.89310000 24.51740000 952 69.44660000 48.23470000 27.06170000 26.70850000 24.33250000 8.629660000 953 89.60630000 89.68040000 26.58190000 61.51580000 73.37840000 16.05640000 954 27.80370000 33.42660000 10.07600000 5.798110000 7.743900000 1.797280000 955 45.46640000 48.52940000 20.27950000 15.11780000 18.55650000 5.616640000 956 52.55640000 60.39410000 23.15260000 22.53930000 29.04830000 8.208560000 957 58.87030000 57.08370000 26.57330000 24.25960000 27.86370000 9.230630000 958 68.24330000 68.50640000 27.92560000 34.45280000 40.74090000 11.77090000 959 93.03510000 70.62730000 28.31390000 52.95240000 51.87650000 13.12190000 960 23.60300000 12.99950000 27.39670000 3.172340000 2.111990000 5.727330000 961 29.70780000 9.169240000 27.39500000 4.091180000 2.265520000 5.707790000 962 55.71130000 7.265520000 27.91930000 12.59450000 6.533020000 6.317030000 963 60.99610000 10.64610000 50.03890000 18.10050000 9.261640000 21.47150000 964 60.38670000 31.13590000 61.55480000 22.55660000 14.99040000 34.25010000 965 62.99510000 55.97900000 62.69500000 31.37240000 30.24610000 38.07070000 966 78.23760000 86.51820000 85.25420000 62.75150000 69.48930000 76.72170000 967 86.88270000 93.04920000 93.57230000 76.38380000 82.88440000 93.72430000 968 25.91930000 24.32220000 16.05210000 4.036180000 4.413010000 2.332430000 969 92.52810000 29.44310000 27.67260000 38.26380000 23.20960000 8.072790000 970 93.09680000 43.52290000 36.66390000 42.96140000 30.43840000 14.02530000 971 93.23620000 57.50150000 38.92800000 48.20730000 40.31080000 17.12130000 972 92.89330000 79.14710000 43.76380000 59.37850000 62.01330000 24.21110000 973 39.86480000 56.22260000 22.23530000 16.19570000 23.23460000 7.098300000 974 43.87840000 85.59220000 42.00200000 34.81340000 55.34190000 22.88990000 975 65.09800000 88.15050000 64.29700000 49.97280000 65.20010000 45.77090000 976 16.39050000 31.74530000 44.23610000 6.642200000 7.334070000 16.80300000 977 16.35290000 35.04550000 52.73490000 8.751470000 9.292110000 24.49460000 978 19.52160000 82.20810000 66.22480000 31.66770000 49.98650000 46.20330000 979 33.44030000 81.95220000 70.76190000 35.22530000 51.45260000 52.29560000 980 36.82270000 92.95540000 80.15040000 46.12830000 67.70620000 68.79660000 981 28.94450000 25.93420000 44.86170000 7.633310000 6.306250000 17.04600000 982 30.80460000 25.39280000 74.48080000 14.29190000 8.882270000 50.45440000 983 74.77430000 12.74300000 35.19970000 23.96150000 12.71490000 10.71270000 984 77.02670000 8.900220000 47.26850000 26.87610000 13.71390000 19.43870000 985 88.45840000 15.09600000 52.99420000 36.51570000 19.13910000 25.18350000 986 87.83730000 46.81370000 67.98330000 45.46720000 32.54870000 44.37810000 987 89.14820000 75.39260000 83.46730000 63.37520000 59.79390000 71.78530000 988 29.18910000 40.29660000 68.94290000 15.56060000 14.29420000 43.69810000 989 29.84900000 86.23980000 80.95900000 40.05180000 57.67200000 68.47820000 990 6.238760000 37.03560000 53.02900000 8.589660000 9.885750000 24.90270000 991 10.53270000 37.08830000 75.58680000 14.08220000 12.12610000 52.72230000 992 12.80030000 39.16630000 92.81950000 20.32120000 15.46270000 82.22540000 993 36.46140000 43.17030000 93.22220000 25.58960000 19.77450000 83.54830000 994 34.95320000 60.93350000 92.01980000 31.14790000 32.17920000 83.36760000 995 38.64640000 61.95710000 100.0000000 35.62390000 34.80470000 99.45290000 996 13.54190000 48.60270000 34.92100000 9.608530000 15.60850000 11.86250000 997 9.878450000 51.88920000 48.90410000 12.44530000 18.52570000 22.54220000 998 12.63890000 62.46190000 65.49880000 20.25610000 28.47840000 41.73770000 999 26.64480000 67.43530000 67.79910000 24.96170000 34.30000000 45.55570000 1000 40.60160000 68.59070000 66.61080000 28.67230000 37.09640000 44.36480000 1001 59.29950000 75.19960000 72.09200000 40.96100000 48.46430000 53.26530000 1002 59.92170000 94.23720000 86.50840000 57.87610000 74.91050000 80.19930000 1003 13.33200000 35.75840000 44.56980000 7.268210000 8.924870000 17.33940000 1004 10.54820000 42.87570000 51.78450000 10.09160000 12.95600000 24.22300000 1005 12.50540000 50.40910000 53.14330000 12.84780000 17.87310000 26.33130000 1006 8.450030000 52.51220000 62.34810000 15.23900000 19.99420000 36.53100000 1007 21.68840000 52.28740000 81.25070000 21.45510000 22.49490000 63.14040000 1008 49.88730000 52.09890000 91.87170000 32.43860000 27.64670000 82.14620000 1009 8.821240000 11.39540000 34.97880000 2.290520000 1.421130000 9.543800000 1010 14.59930000 14.98260000 61.72490000 7.395750000 3.907620000 33.10790000 1011 14.10740000 9.424530000 66.73070000 8.169320000 3.649570000 39.14260000 1012 23.90850000 29.84270000 93.30490000 19.77390000 12.11950000 82.53540000 1013 26.65150000 67.24050000 92.27610000 32.31380000 37.08870000 84.73730000 1014 17.89220000 22.98490000 29.23840000 3.554220000 3.785250000 6.874170000 1015 26.78680000 20.34020000 28.39470000 4.485660000 3.780880000 6.429460000 1016 30.12370000 18.37680000 33.22310000 5.407810000 3.882360000 8.849140000 1017 39.45870000 61.06610000 46.46550000 20.76650000 28.26280000 21.89560000 1018 44.97080000 69.61170000 58.38480000 28.76070000 38.12190000 34.81550000 1019 57.41040000 71.52190000 92.14250000 44.35620000 46.52700000 85.67240000 1020 76.11660000 55.58930000 70.16670000 40.73900000 34.63920000 47.94590000 1021 93.79200000 55.65580000 77.77690000 56.05830000 42.33200000 59.65510000 1022 93.54370000 62.35040000 88.69020000 62.12380000 49.20940000 78.88790000 1023 93.27060000 86.37000000 99.62020000 79.18690000 77.21740000 104.5550000 1024 50.82430000 52.68700000 57.71800000 23.43450000 24.42880000 31.73030000 1025 56.30380000 54.33480000 64.63740000 27.92140000 27.47480000 40.06950000 1026 63.38460000 57.47190000 72.36450000 34.56850000 32.50000000 50.90450000 1027 44.35940000 53.94440000 49.01870000 19.86580000 23.46750000 23.20640000 1028 45.06340000 92.48350000 68.64550000 45.14760000 67.06760000 51.93020000 1029 57.65870000 91.95190000 72.34080000 50.87350000 69.34480000 57.12360000 1030 30.71030000 56.12140000 37.03770000 15.14360000 22.47480000 14.18890000 1031 51.82790000 58.64280000 79.25340000 31.59850000 31.45440000 61.14310000 1032 75.95290000 61.71630000 91.81500000 49.85190000 42.33860000 83.95780000 1033 28.58140000 17.89510000 39.54690000 5.784250000 3.917550000 12.75150000 1034 30.53800000 14.37190000 45.23990000 6.692420000 3.830830000 16.92020000 1035 36.82620000 10.14340000 50.76480000 8.880520000 4.455000000 21.69370000 1036 84.72980000 78.93860000 66.61600000 57.28770000 60.23730000 47.33030000 1037 86.59390000 86.56590000 69.11000000 64.09390000 70.77100000 52.26470000 1038 11.68160000 42.48370000 14.08000000 6.050840000 11.17040000 3.106490000 1039 14.85290000 51.38550000 12.49370000 9.077130000 16.93400000 3.766120000 1040 51.33520000 51.82630000 34.47620000 19.67660000 22.45220000 12.39290000 1041 51.70760000 53.32240000 42.85720000 21.43830000 24.04520000 18.19020000 1042 79.76050000 79.24270000 91.25410000 61.27490000 61.70930000 86.04530000 1043 81.73540000 87.69640000 94.06730000 69.03330000 73.53880000 93.26200000 1044 9.637480000 16.56100000 24.79220000 1.766090000 1.831010000 4.665040000 1045 8.426810000 13.51910000 29.12300000 1.814890000 1.448580000 6.459980000 1046 29.53530000 40.93160000 48.68120000 11.54170000 12.96610000 21.32070000 1047 38.04610000 44.01390000 56.41150000 15.93100000 16.35380000 29.17990000 1048 46.55480000 47.72860000 57.25200000 19.99890000 20.13470000 30.58340000 1049 67.00280000 48.95870000 56.38940000 29.64860000 25.73020000 30.24370000 1050 18.13890000 12.95410000 14.93710000 1.640760000 1.406900000 1.630470000 1051 40.61070000 24.20300000 9.311020000 7.359960000 6.127100000 1.305980000 1052 47.37990000 22.08160000 8.279160000 9.343210000 6.723850000 1.200300000 1053 59.47990000 77.73100000 16.96070000 34.06710000 48.02560000 9.386050000 1054 61.64680000 91.38040000 18.90750000 44.02250000 66.18130000 12.88180000 1055 23.27830000 28.63140000 32.07190000 5.436460000 6.023690000 8.635230000 1056 32.20900000 28.59560000 39.40860000 8.020880000 7.248730000 13.18220000 1057 43.28980000 28.28540000 75.01950000 18.35840000 11.65880000 51.56670000 1058 51.45690000 30.18050000 91.93790000 27.13440000 16.06440000 80.31460000 1059 65.84450000 63.02620000 92.61690000 44.65510000 40.49430000 85.38980000 1060 71.43360000 73.38670000 93.26790000 53.27020000 52.55460000 88.50440000 1061 38.04620000 29.77510000 88.46990000 21.20120000 13.03460000 73.66540000 1062 37.36090000 48.47580000 87.41200000 25.43190000 22.35890000 73.35540000 1063 54.43930000 79.15380000 93.34380000 47.72370000 54.55780000 89.32870000 1064 63.50630000 93.57760000 93.23920000 61.56840000 75.82840000 92.50440000 1065 7.926100000 22.22180000 22.13220000 2.119590000 2.959780000 3.891350000 1066 20.51110000 27.32790000 20.88240000 3.903730000 5.007570000 3.780760000 1067 37.49590000 37.15300000 31.78370000 10.27200000 11.14380000 9.216210000 1068 74.66300000 72.09790000 46.93730000 42.52340000 47.38050000 24.83310000 1069 81.02140000 74.97800000 72.27170000 53.77750000 54.88250000 54.08170000 1070 93.26940000 83.10560000 77.29120000 69.42520000 69.94450000 63.53570000 1071 96.17430000 84.30100000 91.37660000 77.21260000 74.56000000 87.91450000 1072 62.02400000 20.07320000 22.91680000 16.17750000 9.811710000 4.746380000 1073 79.57570000 21.57180000 46.55990000 29.53750000 16.65930000 19.27210000 1074 79.02520000 34.05020000 61.16250000 34.04070000 21.80790000 34.50650000 1075 75.49590000 45.70120000 57.92530000 34.04610000 26.41040000 31.77740000 1076 92.74940000 90.56920000 63.87260000 70.43980000 78.23020000 46.68950000 1077 33.55570000 27.28480000 17.71980000 6.192170000 6.196900000 2.974320000 1078 32.86590000 41.70760000 35.46260000 10.64080000 13.03040000 11.63260000 1079 31.26790000 45.19930000 44.57690000 12.48800000 15.34370000 18.30890000 1080 35.22930000 63.20930000 79.35880000 28.05230000 32.56560000 61.71050000 1081 43.36800000 66.49810000 91.32720000 35.92960000 38.45700000 83.02890000 1082 30.92420000 51.28010000 68.64200000 19.24340000 21.22980000 44.44300000 1083 35.07750000 56.26140000 67.82570000 21.89700000 25.38520000 44.03120000 1084 64.49050000 70.17700000 75.58710000 41.87960000 44.82650000 57.56980000 1085 75.29530000 79.85080000 84.20070000 56.26070000 59.94030000 73.42360000 1086 89.18920000 93.83860000 86.60860000 76.31230000 83.97880000 81.15360000 1087 88.84590000 100.0000000 92.35600000 82.70530000 93.97260000 93.21270000 1088 9.169040000 15.34010000 17.51500000 1.185940000 1.426070000 2.264120000 1089 11.28350000 12.36420000 20.07640000 1.228760000 1.107560000 2.918540000 1090 7.758740000 8.455170000 19.87400000 0.822165000 0.596167000 2.780200000 1091 37.05060000 66.94820000 32.07420000 20.92090000 32.57990000 12.94640000 1092 73.04610000 79.71690000 48.48070000 46.06140000 55.56720000 27.54910000 1093 85.73830000 92.63570000 52.06020000 63.91560000 77.32030000 34.07180000 1094 42.95560000 20.41270000 13.78870000 7.747210000 5.578960000 1.880820000 1095 93.23600000 18.43900000 9.688770000 36.32620000 20.00370000 2.504840000 1096 53.58320000 0.000000000 12.81250000 10.65310000 5.469250000 1.525770000 1097 57.05280000 69.13620000 43.46470000 30.77150000 39.10520000 21.06680000 1098 56.63430000 91.68720000 48.33310000 45.00290000 66.64090000 29.61360000 1099 57.64850000 92.69780000 62.50090000 48.96660000 69.43430000 44.47750000 1100 19.66130000 58.77220000 58.02510000 17.71590000 24.99770000 32.47310000 1101 25.31460000 72.47990000 65.01490000 26.63030000 39.07570000 42.84380000 1102 11.02960000 36.82280000 36.45380000 6.258540000 8.898830000 11.67090000 1103 11.08770000 43.95170000 37.99980000 8.340490000 12.75720000 13.28950000 1104 65.58080000 67.43090000 37.18470000 33.38660000 39.29040000 16.56660000 1105 92.19480000 67.75010000 38.05720000 51.83380000 49.02100000 18.03480000 1106 66.72170000 47.29710000 10.64440000 23.95810000 22.56580000 3.779300000 1107 81.13310000 65.01260000 12.86390000 40.10750000 41.24670000 6.888590000 1108 92.60500000 86.12580000 8.715340000 60.65800000 69.48420000 10.65750000 1109 91.92170000 89.50420000 84.66040000 74.79940000 78.71380000 76.85130000 1110 68.42910000 64.66880000 71.64680000 40.28470000 40.12080000 51.06700000 1111 76.06900000 74.16780000 81.98420000 52.79120000 53.38250000 68.64730000 1112 89.64880000 73.63660000 96.86260000 67.49940000 59.93680000 96.21880000 1113 36.52590000 6.653190000 21.80120000 5.227210000 2.758580000 3.576900000 1114 45.40580000 9.620080000 18.95960000 7.938100000 4.346670000 2.862660000 1115 50.43670000 16.98590000 27.54760000 10.93750000 6.592140000 6.249590000 1116 62.85560000 28.05740000 31.33260000 18.44460000 12.59050000 8.829420000 1117 74.96280000 28.10250000 36.59350000 26.05200000 16.45780000 12.17380000 1118 89.32660000 30.69140000 43.10650000 37.67180000 23.04530000 17.33020000 1119 89.64230000 44.38940000 44.27510000 41.42550000 29.90610000 19.35750000 1120 64.91420000 31.97110000 9.849500000 18.96650000 14.08850000 2.298380000 1121 75.57230000 33.04720000 10.03440000 25.52090000 17.79350000 2.692290000 1122 85.30450000 79.87770000 19.61210000 51.39130000 58.82440000 11.27690000 1123 91.97640000 79.68920000 61.08980000 62.11910000 63.53970000 40.99810000 1124 18.44450000 13.68490000 22.03320000 2.100660000 1.677010000 3.611060000 1125 69.69420000 9.399170000 28.09330000 19.94390000 10.44670000 6.763860000 1126 79.69080000 9.507240000 27.21740000 26.26500000 13.72150000 6.672710000 1127 89.23370000 22.50290000 63.57020000 40.11000000 21.90520000 37.04940000 1128 88.40270000 36.11390000 70.74130000 43.68430000 27.19880000 47.14010000 1129 94.37940000 63.35040000 72.77930000 58.38940000 48.51770000 53.32860000 1130 77.39320000 52.24080000 54.37640000 36.77270000 31.14120000 28.85060000 1131 89.80560000 53.02650000 56.77220000 46.61200000 36.58420000 31.84730000 1132 89.38130000 64.63480000 61.41770000 52.08970000 46.47090000 38.61110000 1133 67.01150000 67.30320000 53.09530000 36.55290000 40.54850000 29.41230000 1134 66.27060000 82.77150000 71.18130000 48.82470000 59.20870000 53.65460000 1135 68.45550000 90.74980000 85.06040000 59.44910000 72.06890000 77.06110000 1136 10.56100000 29.55440000 16.94690000 3.107780000 5.197270000 2.747290000 1137 9.419710000 27.77370000 28.89620000 3.542420000 4.862820000 6.920990000 1138 47.57470000 39.55580000 26.80870000 13.69870000 13.85170000 7.183010000 1139 47.46410000 44.96910000 24.97900000 15.02960000 16.80460000 6.929630000 1140 58.34210000 65.54960000 52.19370000 31.05190000 36.47820000 28.04740000 1141 77.32340000 66.97260000 79.27410000 49.06240000 46.02530000 63.06800000 1142 28.64910000 12.54000000 19.04060000 3.480660000 2.292060000 2.723960000 1143 29.54650000 9.256680000 22.15070000 3.670380000 2.099560000 3.649900000 1144 50.48150000 14.17850000 51.93040000 13.93030000 7.411190000 23.08860000 1145 77.42820000 12.19430000 66.32560000 31.16090000 15.73830000 39.74750000 1146 77.62030000 43.55920000 72.91680000 38.38400000 27.28280000 50.47970000 1147 69.42030000 43.44190000 76.22470000 34.13050000 24.93290000 55.09150000 1148 69.38470000 46.96830000 90.08200000 39.59010000 28.82700000 78.67240000 1149 78.01820000 53.59180000 91.09420000 47.66220000 36.33810000 81.56770000 1150 40.79090000 47.71840000 39.45060000 15.09950000 17.94600000 14.90260000 1151 47.11630000 57.82050000 46.32210000 21.92110000 26.83000000 21.43930000 1152 9.684760000 14.42450000 6.067540000 0.786834000 1.152280000 0.380259000 1153 14.39040000 15.77450000 10.77410000 1.330690000 1.584830000 0.940377000 1154 9.530100000 23.48020000 17.24070000 2.089550000 3.226440000 2.494010000 1155 17.55600000 44.99320000 44.68800000 10.14280000 14.04020000 18.26860000 1156 47.28120000 55.38510000 55.70680000 22.67660000 25.59050000 29.87480000 1157 8.005570000 13.64210000 10.49610000 0.734212000 1.028190000 0.825008000 1158 11.34220000 6.732770000 5.279080000 0.466539000 0.377860000 0.195099000 1159 24.64160000 8.972740000 8.451470000 2.151190000 1.364280000 0.563062000 1160 28.54250000 8.715170000 13.62580000 3.009360000 1.773370000 1.364630000 1161 43.15720000 25.57530000 48.38680000 11.93640000 8.377500000 20.15670000 1162 46.67550000 48.20700000 67.32470000 22.46570000 21.37600000 42.57580000 1163 56.65420000 54.09060000 75.41710000 30.78130000 28.48980000 54.74870000 1164 77.76180000 55.02310000 81.42090000 44.81470000 36.04520000 64.80130000 1165 10.91450000 24.90070000 39.37790000 4.321330000 4.454530000 12.81690000 1166 8.910710000 23.56170000 44.53360000 4.737580000 4.300080000 16.55140000 1167 10.90510000 28.75220000 58.06560000 8.082570000 6.959600000 29.54290000 1168 12.08640000 32.00430000 78.12750000 13.80310000 10.23780000 56.22790000 1169 26.70110000 73.10540000 77.97320000 30.65730000 41.25320000 61.08790000 1170 24.41660000 82.41640000 91.71720000 40.15100000 53.67090000 86.47280000 1171 25.14990000 84.20730000 100.0000000 44.53280000 57.24850000 103.3160000 1172 15.82950000 93.94440000 72.45990000 40.77120000 66.26410000 57.22950000 1173 88.46500000 95.03620000 71.81970000 72.18080000 83.66730000 58.03320000 1174 29.62620000 31.23430000 16.76420000 5.962590000 7.140220000 2.926950000 1175 45.06340000 60.42080000 12.51640000 19.13880000 27.37420000 5.254990000 1176 51.48780000 81.02320000 11.46160000 32.24210000 50.02280000 8.763710000 1177 75.94400000 92.85820000 10.16440000 53.01420000 72.42010000 11.80490000 1178 76.26360000 93.50490000 63.61470000 60.24720000 76.08530000 46.50000000 1179 91.95130000 92.47350000 79.68370000 75.34750000 82.27220000 69.32640000 1180 66.68820000 75.49130000 68.92960000 44.14920000 50.44580000 49.15190000 1181 70.05020000 83.15650000 89.97000000 56.99100000 63.11260000 84.16800000 1182 79.31170000 94.97110000 89.47950000 70.82670000 82.27180000 86.24080000 1183 14.25120000 38.59180000 29.99520000 6.251060000 9.615260000 8.223390000 1184 8.576980000 46.06510000 74.32870000 16.08780000 16.86100000 51.67780000 1185 12.73000000 51.19000000 90.41140000 23.10410000 22.41400000 78.90930000 1186 12.45520000 62.94490000 93.80200000 29.02240000 32.33080000 86.90420000 1187 9.281660000 24.74920000 75.45220000 11.59480000 7.317300000 51.72510000 1188 7.275710000 25.22980000 87.85760000 15.43750000 8.958540000 72.08690000 1189 14.97540000 19.30710000 75.43060000 11.30310000 6.131650000 51.47960000 1190 63.18110000 16.90190000 78.22670000 26.25780000 13.38600000 56.33300000 1191 71.47950000 24.04780000 87.85470000 34.84050000 18.70430000 72.94060000 1192 57.67410000 39.96870000 66.27600000 24.35570000 18.77680000 40.62950000 1193 72.73410000 59.75600000 67.73610000 39.66210000 36.66960000 45.15630000 1194 74.36260000 75.45880000 67.33520000 48.31070000 52.61020000 47.25640000 1195 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 1196 7.710020000 10.15680000 6.203640000 0.420937000 0.559623000 0.295110000 1197 7.612170000 4.618980000 10.11310000 0.301345000 0.203224000 0.636356000 1198 30.28710000 63.57770000 15.43310000 16.48460000 28.07080000 6.102600000 1199 34.00210000 92.80980000 14.70120000 34.45770000 62.78500000 11.69870000 1200 39.94850000 95.35840000 90.38020000 52.14040000 73.02820000 87.09130000 1201 21.70130000 28.66040000 27.26250000 4.757880000 5.732790000 6.283750000 1202 20.63100000 33.10070000 25.73260000 5.336990000 7.312590000 5.910750000 1203 61.14130000 38.88710000 28.48010000 19.59650000 16.62170000 8.151090000 1204 61.80640000 61.36260000 42.29090000 29.24860000 32.90010000 19.06460000 1205 44.91050000 59.22180000 40.26050000 20.83030000 27.22990000 16.95180000 1206 49.99250000 74.18350000 43.04700000 30.34600000 42.84450000 21.49280000 1207 67.69390000 83.84290000 52.49630000 46.12810000 59.30520000 31.94880000 1208 74.54440000 84.85120000 63.39050000 53.15190000 63.62630000 44.19840000 1209 12.65390000 32.43660000 9.078530000 3.535910000 6.275350000 1.508440000 1210 10.27680000 30.78420000 23.05510000 3.672750000 5.789010000 4.678200000 1211 10.37250000 31.07700000 36.38210000 4.971880000 6.399540000 11.21190000 1212 11.43210000 38.40340000 43.03950000 7.534660000 10.02800000 16.35490000 1213 0.000000000 40.73120000 45.85760000 8.210030000 11.22130000 18.76730000 1214 41.42260000 45.38370000 73.28320000 21.34030000 19.29080000 50.35870000 1215 51.42930000 53.84570000 82.97730000 30.69290000 28.04580000 66.56150000 1216 71.81530000 12.78580000 20.17470000 20.83310000 11.25440000 3.873980000 1217 72.59920000 7.440620000 54.75370000 25.30950000 12.66860000 26.26870000 1218 79.93730000 60.33610000 54.23330000 41.67200000 38.41550000 29.85340000 1219 64.04890000 23.69560000 16.88540000 17.34840000 11.13930000 3.128620000 1220 91.04910000 27.31500000 18.62540000 36.06180000 21.59760000 4.616840000 1221 90.03810000 39.30900000 16.64050000 37.67680000 26.19360000 4.903400000 1222 33.24830000 15.57040000 10.78940000 4.394080000 3.138230000 1.081010000 1223 35.44630000 11.28760000 91.72670000 19.43700000 8.734100000 78.90840000 1224 45.95460000 18.11990000 91.08340000 22.99310000 11.39610000 78.03310000 1225 15.55610000 14.89220000 5.936390000 1.267720000 1.455000000 0.403999000 1226 17.05060000 13.77280000 9.164060000 1.393950000 1.386170000 0.687679000 1227 14.69930000 10.39800000 8.937570000 0.943539000 0.841757000 0.579899000 1228 8.826190000 11.11870000 14.22730000 0.731206000 0.772028000 1.409100000 1229 6.437110000 8.179000000 15.38370000 0.538399000 0.459239000 1.602370000 1230 5.951050000 52.34510000 69.99720000 16.93250000 20.56360000 46.25320000 1231 9.232850000 58.92620000 83.86440000 23.65070000 27.36650000 68.28670000 1232 11.68040000 75.69230000 92.35900000 34.90280000 45.01610000 86.28780000 1233 6.351260000 81.46890000 92.34760000 38.03030000 51.68030000 87.38760000 1234 20.31460000 89.10210000 91.43460000 43.80560000 62.05910000 87.37030000 1235 53.01520000 87.00210000 93.97770000 52.28500000 64.21920000 92.17250000 1236 90.00530000 86.71960000 92.77820000 74.15830000 75.26770000 90.85350000 1237 1.445090000 0.000000000 0.000000000 0.003702600 0.001908800 0.000173336 1238 13.56080000 92.53170000 32.87570000 32.21840000 61.18440000 18.30520000 1239 75.42190000 91.66890000 36.61140000 53.68830000 71.29190000 21.31280000 1240 93.20680000 90.72590000 54.20300000 68.88870000 77.82890000 35.99660000 1241 25.23860000 18.16100000 7.137190000 2.890610000 2.730340000 0.659536000 1242 33.00280000 20.03620000 9.726100000 4.750990000 3.983980000 1.081250000 1243 34.38430000 18.05020000 84.68600000 17.29310000 8.698370000 66.41070000 1244 20.91300000 24.27940000 50.46040000 6.920950000 5.465110000 21.71200000 1245 18.31900000 35.01640000 65.28960000 11.61190000 10.45110000 38.45190000 1246 26.02460000 45.68080000 70.68180000 16.93460000 17.23510000 46.54470000 1247 25.36540000 49.93070000 94.62990000 25.76810000 22.96230000 86.87110000 1248 38.32000000 35.31740000 63.14590000 15.19450000 12.45620000 36.02760000 1249 48.48260000 37.88230000 70.32140000 20.94190000 16.11370000 45.62400000 1250 15.86020000 14.00440000 26.27860000 2.147950000 1.700780000 5.221500000 1251 11.25920000 57.31340000 24.49210000 11.66920000 21.52880000 7.828860000 1252 6.114910000 62.53930000 41.61760000 15.45050000 26.57130000 18.07580000 1253 11.65980000 78.14880000 46.01220000 24.43040000 43.08330000 24.18920000 1254 14.06040000 79.97310000 37.75400000 24.54390000 44.88210000 18.47680000 1255 17.52700000 91.53340000 44.67530000 33.39910000 60.56410000 26.01320000 1256 35.24230000 92.67390000 45.58610000 37.61660000 63.92870000 27.17030000 1257 30.23550000 90.43260000 30.76500000 32.98400000 59.40110000 16.80820000 1258 82.53420000 93.02630000 30.24750000 58.84020000 75.46670000 18.28740000 1259 76.54930000 50.64270000 17.87660000 31.32950000 27.99310000 5.898000000 1260 88.61980000 52.67390000 42.68610000 43.12370000 34.87400000 19.00910000 1261 46.81620000 22.14060000 64.82460000 16.02570000 9.385250000 37.43590000 1262 63.01910000 20.12970000 90.18320000 30.37200000 15.55960000 76.78320000 1263 62.74990000 34.35550000 90.29340000 32.62920000 20.22020000 77.76670000 1264 78.85570000 72.28420000 90.75750000 56.55430000 53.47170000 83.78110000 1265 43.60790000 35.14440000 38.61250000 12.45930000 11.48970000 13.23120000 1266 53.61020000 34.11960000 41.08170000 16.37940000 13.13770000 15.04720000 1267 63.65740000 36.33140000 48.52960000 22.81140000 17.06200000 21.38460000 1268 67.88780000 45.08940000 60.21150000 29.71230000 23.84340000 34.04030000 1269 82.68240000 53.54650000 75.09630000 45.81170000 35.94680000 54.92140000 1270 23.28060000 4.536670000 17.00300000 2.078180000 1.088020000 2.022280000 1271 22.31120000 9.006000000 13.01760000 1.905820000 1.225510000 1.204210000 1272 20.50680000 12.76300000 5.439990000 1.681200000 1.437070000 0.345561000 1273 20.12340000 16.56160000 53.16690000 6.397710000 3.796260000 23.97720000 1274 27.88470000 32.22340000 54.42860000 10.18620000 9.102990000 26.05010000 1275 28.21660000 35.95750000 73.02990000 15.36520000 12.47520000 48.99580000 1276 46.51770000 39.06810000 90.42260000 26.65250000 18.78840000 78.04330000 1277 18.78970000 3.835200000 25.62730000 1.974800000 0.954450000 4.817730000 1278 31.80020000 6.725560000 37.60000000 5.513710000 2.740170000 11.24600000 1279 32.74740000 63.83470000 57.92570000 22.29700000 30.64870000 33.21490000 1280 35.99050000 80.31010000 61.21150000 32.56750000 48.85660000 39.86160000 1281 42.42790000 96.78820000 60.61650000 45.54070000 72.19260000 42.99900000 1282 29.58180000 40.62190000 27.14470000 8.788020000 11.73280000 7.178030000 1283 58.82760000 44.15440000 31.13110000 20.14990000 19.02200000 9.877090000 1284 65.89420000 52.92000000 37.14780000 27.34450000 26.95730000 14.48100000 1285 65.54560000 59.30100000 46.12240000 30.90950000 32.37720000 21.87180000 1286 82.27590000 65.23240000 65.46260000 47.93480000 44.63710000 43.35290000 1287 93.31010000 76.94330000 68.03030000 63.24250000 61.53910000 49.09880000 1288 94.38990000 87.19740000 72.69500000 71.72830000 75.22070000 57.66010000 1289 93.41810000 86.60820000 88.17210000 75.25290000 75.90970000 82.41950000 1290 53.29130000 49.27330000 45.26100000 21.02850000 21.66960000 19.62500000 1291 62.37610000 54.22280000 47.45890000 27.41580000 27.54500000 22.24160000 1292 91.18730000 9.951890000 15.16290000 34.17450000 17.91700000 3.151450000 1293 93.68130000 12.80220000 23.14710000 36.83570000 19.48410000 5.607180000 1294 93.29800000 11.62470000 31.56030000 37.14700000 19.45260000 9.286770000 1295 93.14560000 14.33110000 40.28450000 38.21900000 20.16110000 14.68790000 1296 91.41500000 8.841860000 67.03280000 41.51280000 20.79200000 41.08250000 1297 87.18510000 7.726400000 80.24420000 41.75380000 20.43070000 60.05180000 1298 68.97070000 31.56980000 60.38760000 27.00300000 17.43830000 33.14650000 1299 70.30620000 35.01200000 70.62150000 30.95830000 20.26950000 46.30880000 1300 70.04770000 37.30100000 81.59260000 34.47610000 22.50940000 63.01300000 1301 83.50610000 46.67820000 91.22150000 49.18380000 33.59010000 81.19400000 1302 94.26810000 47.41200000 92.40100000 58.31570000 38.59580000 83.89430000 1303 56.97610000 47.18090000 55.63660000 23.79260000 21.86620000 29.02470000 1304 57.40670000 65.13240000 66.43910000 33.43920000 37.06720000 43.88880000 1305 58.48010000 65.43010000 91.85320000 41.71440000 40.66050000 84.13440000 1306 21.72170000 33.39130000 34.89950000 6.422240000 7.862090000 10.52250000 1307 19.10780000 70.51180000 48.41640000 21.32750000 35.19120000 24.86320000 1308 19.13660000 82.18150000 56.59680000 29.47210000 49.07610000 34.97680000 1309 15.73280000 89.28060000 85.84270000 41.47440000 61.26080000 77.27010000 1310 13.14380000 65.54740000 81.53350000 26.11950000 33.10210000 65.40170000 1311 12.04630000 70.55520000 93.17840000 32.45020000 39.59680000 86.92920000 1312 4.513480000 91.46300000 94.78410000 45.47490000 65.21690000 94.28930000 1313 17.98960000 62.08440000 70.43570000 21.83330000 28.89920000 48.20100000 1314 14.92120000 76.46260000 72.87940000 29.44730000 43.56230000 54.03950000 1315 10.53370000 76.24820000 78.82790000 30.68430000 43.82310000 62.91090000 1316 8.995660000 66.30180000 60.48030000 20.66270000 31.46410000 36.29330000 1317 56.66090000 65.58880000 61.02650000 32.05790000 36.81970000 37.35180000 1318 57.96780000 79.17440000 61.99260000 40.13320000 51.72610000 40.92580000 1319 16.14690000 62.13910000 17.29770000 13.68670000 25.65620000 6.226740000 1320 19.62630000 70.39090000 14.48530000 17.92650000 33.73830000 6.918520000 1321 18.75500000 81.69550000 15.67290000 24.26870000 46.50760000 9.304650000 1322 35.64330000 87.24060000 58.30180000 36.26050000 57.37630000 38.04620000 1323 24.92420000 44.02250000 39.28730000 10.14000000 13.69690000 14.23270000 1324 92.92030000 45.22180000 52.72970000 45.75000000 32.34380000 26.98950000 1325 91.71690000 72.48310000 77.26680000 61.95340000 56.91470000 61.37710000 1326 50.51570000 43.21630000 45.91840000 18.09440000 17.34040000 19.47730000 1327 55.52440000 42.02250000 57.62460000 21.99060000 18.60390000 30.58170000 1328 36.07860000 17.71890000 24.27490000 5.978770000 4.170240000 4.694980000 1329 41.67640000 14.34360000 24.83720000 7.360030000 4.438660000 4.891180000 1330 43.45160000 10.27280000 35.63710000 8.700990000 4.626050000 10.21770000 1331 68.34510000 12.02140000 38.94220000 20.46340000 10.79050000 12.89480000 1332 67.66660000 35.09350000 43.31510000 23.90980000 17.30190000 17.10550000 1333 53.50820000 30.18810000 33.67710000 14.63910000 11.16740000 10.02290000 1334 71.86360000 62.81730000 32.32400000 34.30810000 36.60760000 13.15190000 1335 55.52360000 43.89520000 23.64600000 17.91180000 17.82770000 6.466460000 1336 65.09090000 81.61000000 32.75360000 40.46010000 54.63270000 16.53960000 1337 40.60920000 50.10750000 9.305230000 13.60370000 18.61630000 3.386940000 1338 54.06280000 66.41680000 10.19650000 25.32060000 34.62370000 5.973020000 1339 62.58200000 66.33770000 12.90490000 29.41150000 36.66680000 6.575480000 1340 90.31720000 75.18700000 18.93540000 52.52550000 55.37720000 10.35630000 1341 89.48070000 81.32160000 35.49380000 56.83850000 62.77830000 18.81940000 1342 98.27870000 91.75180000 35.16350000 71.09590000 80.37260000 21.26680000 1343 53.47620000 73.28290000 28.89250000 29.63700000 41.94020000 12.70090000 1344 53.65560000 85.70130000 29.22480000 37.16160000 56.82840000 15.33520000 1345 25.53130000 38.87220000 9.246350000 6.620030000 10.04690000 2.093790000 1346 23.95260000 42.48480000 55.87110000 12.23940000 13.80970000 28.32060000 1347 23.89400000 47.63030000 56.71840000 13.95430000 16.98390000 29.72800000 1348 24.95660000 55.99290000 63.00750000 18.47120000 23.59500000 37.83940000 1349 32.50820000 64.17840000 73.71190000 26.19560000 32.45500000 53.26050000 1350 33.49440000 77.67230000 75.77190000 34.03980000 46.87030000 58.65260000 1351 46.67130000 31.61110000 34.29710000 12.27350000 10.34630000 10.34270000 1352 49.19460000 29.84490000 58.92890000 16.80930000 11.73040000 30.94820000 1353 55.96940000 30.62240000 68.08590000 21.90720000 14.33110000 42.23770000 1354 36.67160000 22.12650000 51.97220000 10.11690000 6.645710000 23.18150000 1355 56.52030000 20.23980000 62.19990000 19.17680000 10.73430000 34.36150000 1356 67.49460000 24.26130000 68.50830000 26.81510000 15.27300000 42.71730000 1357 81.48440000 33.32100000 84.20440000 41.84340000 24.87820000 67.42190000 1358 19.53530000 40.04690000 18.23540000 6.343270000 10.31560000 3.898350000 1359 26.70980000 50.32530000 24.44240000 10.97430000 17.28930000 7.028070000 1360 89.22210000 59.03820000 30.11230000 44.60060000 39.50320000 12.02920000 1361 49.38740000 32.18660000 14.95290000 11.97160000 10.52760000 2.849940000 1362 57.01390000 42.63330000 12.37190000 17.65160000 17.22060000 3.348820000 1363 57.80090000 49.55300000 9.913030000 20.09820000 21.68200000 3.712670000 1364 66.62030000 61.83290000 10.42610000 29.42770000 33.59910000 5.590180000 1365 75.93830000 74.17920000 8.014210000 41.12090000 48.71430000 7.603570000 1366 75.64920000 80.25540000 27.85390000 45.45290000 56.03330000 14.11070000 1367 77.49100000 81.11840000 40.41580000 48.56630000 58.25830000 21.58820000 1368 24.77270000 24.47010000 9.836810000 3.644070000 4.267270000 1.208430000 1369 65.28400000 40.67320000 12.31800000 21.26970000 18.28550000 3.354600000 1370 79.37380000 45.25940000 10.80200000 31.20220000 25.35560000 3.958610000 1371 92.59050000 45.22340000 9.589990000 41.16330000 30.47820000 4.259310000 1372 92.47240000 57.14200000 10.38800000 45.28590000 38.83680000 5.760290000 1373 95.79270000 77.77170000 7.755180000 58.15510000 60.51340000 8.957810000 1374 43.17080000 39.10300000 8.697070000 11.12000000 12.45520000 2.258100000 1375 49.89060000 37.95120000 31.44550000 14.60030000 13.66700000 9.298290000 1376 56.27290000 39.58540000 84.24400000 28.68410000 20.27380000 67.29370000 1377 57.78570000 44.18990000 94.83090000 34.34060000 24.65830000 87.13890000 1378 13.37640000 12.20150000 44.46690000 3.881240000 2.169880000 16.13280000 1379 10.57270000 8.880130000 49.82920000 4.369720000 2.060550000 20.61530000 1380 45.72370000 9.076480000 58.66210000 13.14490000 6.402610000 29.81940000 1381 58.30920000 3.686140000 72.81920000 21.60270000 10.13640000 47.91540000 1382 83.37590000 20.10710000 76.70540000 38.77120000 20.38330000 54.69380000 1383 53.79250000 30.63750000 50.23060000 17.16850000 12.32900000 22.28690000 1384 67.89000000 32.08250000 52.52890000 24.91120000 16.69310000 24.87310000 1385 77.93560000 36.69560000 53.81320000 32.39770000 22.02260000 26.76020000 1386 17.58500000 8.598190000 8.065160000 1.135240000 0.817757000 0.470715000 1387 37.30110000 11.91510000 6.228700000 5.086930000 3.111110000 0.543597000 1388 39.72790000 10.50970000 13.16740000 5.876450000 3.379660000 1.438010000 1389 52.89750000 16.18610000 8.935880000 10.90510000 6.579240000 1.162250000 1390 77.62440000 16.42250000 8.832210000 24.38540000 13.56040000 1.787600000 1391 89.14880000 30.58670000 9.217900000 34.77030000 21.83650000 2.882700000 1392 90.72860000 29.02860000 54.79040000 40.45610000 23.79750000 27.65580000 1393 92.21300000 32.89750000 91.93040000 52.60610000 29.99110000 81.64630000 1394 35.18160000 9.191850000 33.10820000 5.920540000 3.147640000 8.616690000 1395 54.29950000 11.14590000 33.15610000 12.64560000 6.761220000 8.986300000 1396 64.76240000 18.56730000 32.91780000 18.31100000 10.56740000 9.291030000 1397 61.77100000 34.81750000 31.00780000 19.18270000 14.94590000 9.078140000 1398 64.85870000 42.99050000 38.01170000 23.65050000 20.23660000 13.93420000 1399 90.52570000 75.10450000 51.01810000 56.29110000 56.82920000 29.53920000 END_DATA CAL DESCRIPTOR "Argyll Device Calibration State" ORIGINATOR "Argyll dispcal" CREATED "Sat Mar 14 19:07:36 2009" KEYWORD "DEVICE_CLASS" DEVICE_CLASS "DISPLAY" KEYWORD "COLOR_REP" COLOR_REP "RGB" BEGIN_ARGYLL_DISPCAL_ARGS -qm -w0.3127,0.3290 -f0 -k0 END_ARGYLL_DISPCAL_ARGS KEYWORD "RGB_I" NUMBER_OF_FIELDS 4 BEGIN_DATA_FORMAT RGB_I RGB_R RGB_G RGB_B END_DATA_FORMAT NUMBER_OF_SETS 256 BEGIN_DATA 0.00000 0.00000 0.00000 0.00000 0.00392 0.00392 0.00392 0.00392 0.00784 0.00784 0.00784 0.00784 0.01176 0.01176 0.01176 0.01176 0.01569 0.01569 0.01569 0.01569 0.01961 0.01961 0.01961 0.01961 0.02353 0.02353 0.02353 0.02353 0.02745 0.02745 0.02745 0.02745 0.03137 0.03137 0.03137 0.03137 0.03529 0.03529 0.03529 0.03529 0.03922 0.03922 0.03922 0.03922 0.04314 0.04314 0.04314 0.04314 0.04706 0.04706 0.04706 0.04706 0.05098 0.05098 0.05098 0.05098 0.05490 0.05490 0.05490 0.05490 0.05882 0.05882 0.05882 0.05882 0.06275 0.06275 0.06275 0.06275 0.06667 0.06667 0.06667 0.06667 0.07059 0.07059 0.07059 0.07059 0.07451 0.07451 0.07451 0.07451 0.07843 0.07843 0.07843 0.07843 0.08235 0.08235 0.08235 0.08235 0.08627 0.08627 0.08627 0.08627 0.09020 0.09020 0.09020 0.09020 0.09412 0.09412 0.09412 0.09412 0.09804 0.09804 0.09804 0.09804 0.10196 0.10196 0.10196 0.10196 0.10588 0.10588 0.10588 0.10588 0.10980 0.10980 0.10980 0.10980 0.11373 0.11373 0.11373 0.11373 0.11765 0.11765 0.11765 0.11765 0.12157 0.12157 0.12157 0.12157 0.12549 0.12549 0.12549 0.12549 0.12941 0.12941 0.12941 0.12941 0.13333 0.13333 0.13333 0.13333 0.13725 0.13725 0.13725 0.13725 0.14118 0.14118 0.14118 0.14118 0.14510 0.14510 0.14510 0.14510 0.14902 0.14902 0.14902 0.14902 0.15294 0.15294 0.15294 0.15294 0.15686 0.15686 0.15686 0.15686 0.16078 0.16078 0.16078 0.16078 0.16471 0.16471 0.16471 0.16471 0.16863 0.16863 0.16863 0.16863 0.17255 0.17255 0.17255 0.17255 0.17647 0.17647 0.17647 0.17647 0.18039 0.18039 0.18039 0.18039 0.18431 0.18431 0.18431 0.18431 0.18824 0.18824 0.18824 0.18824 0.19216 0.19216 0.19216 0.19216 0.19608 0.19608 0.19608 0.19608 0.20000 0.20000 0.20000 0.20000 0.20392 0.20392 0.20392 0.20392 0.20784 0.20784 0.20784 0.20784 0.21176 0.21176 0.21176 0.21176 0.21569 0.21569 0.21569 0.21569 0.21961 0.21961 0.21961 0.21961 0.22353 0.22353 0.22353 0.22353 0.22745 0.22745 0.22745 0.22745 0.23137 0.23137 0.23137 0.23137 0.23529 0.23529 0.23529 0.23529 0.23922 0.23922 0.23922 0.23922 0.24314 0.24314 0.24314 0.24314 0.24706 0.24706 0.24706 0.24706 0.25098 0.25098 0.25098 0.25098 0.25490 0.25490 0.25490 0.25490 0.25882 0.25882 0.25882 0.25882 0.26275 0.26275 0.26275 0.26275 0.26667 0.26667 0.26667 0.26667 0.27059 0.27059 0.27059 0.27059 0.27451 0.27451 0.27451 0.27451 0.27843 0.27843 0.27843 0.27843 0.28235 0.28235 0.28235 0.28235 0.28627 0.28627 0.28627 0.28627 0.29020 0.29020 0.29020 0.29020 0.29412 0.29412 0.29412 0.29412 0.29804 0.29804 0.29804 0.29804 0.30196 0.30196 0.30196 0.30196 0.30588 0.30588 0.30588 0.30588 0.30980 0.30980 0.30980 0.30980 0.31373 0.31373 0.31373 0.31373 0.31765 0.31765 0.31765 0.31765 0.32157 0.32157 0.32157 0.32157 0.32549 0.32549 0.32549 0.32549 0.32941 0.32941 0.32941 0.32941 0.33333 0.33333 0.33333 0.33333 0.33725 0.33725 0.33725 0.33725 0.34118 0.34118 0.34118 0.34118 0.34510 0.34510 0.34510 0.34510 0.34902 0.34902 0.34902 0.34902 0.35294 0.35294 0.35294 0.35294 0.35686 0.35686 0.35686 0.35686 0.36078 0.36078 0.36078 0.36078 0.36471 0.36471 0.36471 0.36471 0.36863 0.36863 0.36863 0.36863 0.37255 0.37255 0.37255 0.37255 0.37647 0.37647 0.37647 0.37647 0.38039 0.38039 0.38039 0.38039 0.38431 0.38431 0.38431 0.38431 0.38824 0.38824 0.38824 0.38824 0.39216 0.39216 0.39216 0.39216 0.39608 0.39608 0.39608 0.39608 0.40000 0.40000 0.40000 0.40000 0.40392 0.40392 0.40392 0.40392 0.40784 0.40784 0.40784 0.40784 0.41176 0.41176 0.41176 0.41176 0.41569 0.41569 0.41569 0.41569 0.41961 0.41961 0.41961 0.41961 0.42353 0.42353 0.42353 0.42353 0.42745 0.42745 0.42745 0.42745 0.43137 0.43137 0.43137 0.43137 0.43529 0.43529 0.43529 0.43529 0.43922 0.43922 0.43922 0.43922 0.44314 0.44314 0.44314 0.44314 0.44706 0.44706 0.44706 0.44706 0.45098 0.45098 0.45098 0.45098 0.45490 0.45490 0.45490 0.45490 0.45882 0.45882 0.45882 0.45882 0.46275 0.46275 0.46275 0.46275 0.46667 0.46667 0.46667 0.46667 0.47059 0.47059 0.47059 0.47059 0.47451 0.47451 0.47451 0.47451 0.47843 0.47843 0.47843 0.47843 0.48235 0.48235 0.48235 0.48235 0.48627 0.48627 0.48627 0.48627 0.49020 0.49020 0.49020 0.49020 0.49412 0.49412 0.49412 0.49412 0.49804 0.49804 0.49804 0.49804 0.50196 0.50196 0.50196 0.50196 0.50588 0.50588 0.50588 0.50588 0.50980 0.50980 0.50980 0.50980 0.51373 0.51373 0.51373 0.51373 0.51765 0.51765 0.51765 0.51765 0.52157 0.52157 0.52157 0.52157 0.52549 0.52549 0.52549 0.52549 0.52941 0.52941 0.52941 0.52941 0.53333 0.53333 0.53333 0.53333 0.53725 0.53725 0.53725 0.53725 0.54118 0.54118 0.54118 0.54118 0.54510 0.54510 0.54510 0.54510 0.54902 0.54902 0.54902 0.54902 0.55294 0.55294 0.55294 0.55294 0.55686 0.55686 0.55686 0.55686 0.56078 0.56078 0.56078 0.56078 0.56471 0.56471 0.56471 0.56471 0.56863 0.56863 0.56863 0.56863 0.57255 0.57255 0.57255 0.57255 0.57647 0.57647 0.57647 0.57647 0.58039 0.58039 0.58039 0.58039 0.58431 0.58431 0.58431 0.58431 0.58824 0.58824 0.58824 0.58824 0.59216 0.59216 0.59216 0.59216 0.59608 0.59608 0.59608 0.59608 0.60000 0.60000 0.60000 0.60000 0.60392 0.60392 0.60392 0.60392 0.60784 0.60784 0.60784 0.60784 0.61176 0.61176 0.61176 0.61176 0.61569 0.61569 0.61569 0.61569 0.61961 0.61961 0.61961 0.61961 0.62353 0.62353 0.62353 0.62353 0.62745 0.62745 0.62745 0.62745 0.63137 0.63137 0.63137 0.63137 0.63529 0.63529 0.63529 0.63529 0.63922 0.63922 0.63922 0.63922 0.64314 0.64314 0.64314 0.64314 0.64706 0.64706 0.64706 0.64706 0.65098 0.65098 0.65098 0.65098 0.65490 0.65490 0.65490 0.65490 0.65882 0.65882 0.65882 0.65882 0.66275 0.66275 0.66275 0.66275 0.66667 0.66667 0.66667 0.66667 0.67059 0.67059 0.67059 0.67059 0.67451 0.67451 0.67451 0.67451 0.67843 0.67843 0.67843 0.67843 0.68235 0.68235 0.68235 0.68235 0.68627 0.68627 0.68627 0.68627 0.69020 0.69020 0.69020 0.69020 0.69412 0.69412 0.69412 0.69412 0.69804 0.69804 0.69804 0.69804 0.70196 0.70196 0.70196 0.70196 0.70588 0.70588 0.70588 0.70588 0.70980 0.70980 0.70980 0.70980 0.71373 0.71373 0.71373 0.71373 0.71765 0.71765 0.71765 0.71765 0.72157 0.72157 0.72157 0.72157 0.72549 0.72549 0.72549 0.72549 0.72941 0.72941 0.72941 0.72941 0.73333 0.73333 0.73333 0.73333 0.73725 0.73725 0.73725 0.73725 0.74118 0.74118 0.74118 0.74118 0.74510 0.74510 0.74510 0.74510 0.74902 0.74902 0.74902 0.74902 0.75294 0.75294 0.75294 0.75294 0.75686 0.75686 0.75686 0.75686 0.76078 0.76078 0.76078 0.76078 0.76471 0.76471 0.76471 0.76471 0.76863 0.76863 0.76863 0.76863 0.77255 0.77255 0.77255 0.77255 0.77647 0.77647 0.77647 0.77647 0.78039 0.78039 0.78039 0.78039 0.78431 0.78431 0.78431 0.78431 0.78824 0.78824 0.78824 0.78824 0.79216 0.79216 0.79216 0.79216 0.79608 0.79608 0.79608 0.79608 0.80000 0.80000 0.80000 0.80000 0.80392 0.80392 0.80392 0.80392 0.80784 0.80784 0.80784 0.80784 0.81176 0.81176 0.81176 0.81176 0.81569 0.81569 0.81569 0.81569 0.81961 0.81961 0.81961 0.81961 0.82353 0.82353 0.82353 0.82353 0.82745 0.82745 0.82745 0.82745 0.83137 0.83137 0.83137 0.83137 0.83529 0.83529 0.83529 0.83529 0.83922 0.83922 0.83922 0.83922 0.84314 0.84314 0.84314 0.84314 0.84706 0.84706 0.84706 0.84706 0.85098 0.85098 0.85098 0.85098 0.85490 0.85490 0.85490 0.85490 0.85882 0.85882 0.85882 0.85882 0.86275 0.86275 0.86275 0.86275 0.86667 0.86667 0.86667 0.86667 0.87059 0.87059 0.87059 0.87059 0.87451 0.87451 0.87451 0.87451 0.87843 0.87843 0.87843 0.87843 0.88235 0.88235 0.88235 0.88235 0.88627 0.88627 0.88627 0.88627 0.89020 0.89020 0.89020 0.89020 0.89412 0.89412 0.89412 0.89412 0.89804 0.89804 0.89804 0.89804 0.90196 0.90196 0.90196 0.90196 0.90588 0.90588 0.90588 0.90588 0.90980 0.90980 0.90980 0.90980 0.91373 0.91373 0.91373 0.91373 0.91765 0.91765 0.91765 0.91765 0.92157 0.92157 0.92157 0.92157 0.92549 0.92549 0.92549 0.92549 0.92941 0.92941 0.92941 0.92941 0.93333 0.93333 0.93333 0.93333 0.93725 0.93725 0.93725 0.93725 0.94118 0.94118 0.94118 0.94118 0.94510 0.94510 0.94510 0.94510 0.94902 0.94902 0.94902 0.94902 0.95294 0.95294 0.95294 0.95294 0.95686 0.95686 0.95686 0.95686 0.96078 0.96078 0.96078 0.96078 0.96471 0.96471 0.96471 0.96471 0.96863 0.96863 0.96863 0.96863 0.97255 0.97255 0.97255 0.97255 0.97647 0.97647 0.97647 0.97647 0.98039 0.98039 0.98039 0.98039 0.98431 0.98431 0.98431 0.98431 0.98824 0.98824 0.98824 0.98824 0.99216 0.99216 0.99216 0.99216 0.99608 0.99608 0.99608 0.99608 1.00000 1.00000 1.00000 1.00000 END_DATA DisplayCAL-3.1.0.0/misc/ti3/video_madVR.ti30000644000076500000000000034730312647526532017772 0ustar devwheel00000000000000CTI3 DESCRIPTOR "Argyll Calibration Target chart information 3" ORIGINATOR "Argyll dispread" CREATED "Sat Mar 14 19:00:55 2009" KEYWORD "DEVICE_CLASS" DEVICE_CLASS "DISPLAY" KEYWORD "APPROX_WHITE_POINT" APPROX_WHITE_POINT "95.045781 100.000003 108.905751" KEYWORD "DARK_REGION_EMPHASIS" DARK_REGION_EMPHASIS "1.6" KEYWORD "ACCURATE_EXPECTED_VALUES" ACCURATE_EXPECTED_VALUES "true" KEYWORD "COLOR_REP" COLOR_REP "RGB_XYZ" KEYWORD "BLACK_COLOR_PATCHES" BLACK_COLOR_PATCHES "4" KEYWORD "COMP_GREY_STEPS" COMP_GREY_STEPS "97" KEYWORD "SINGLE_DIM_STEPS" SINGLE_DIM_STEPS "33" KEYWORD "WHITE_COLOR_PATCHES" WHITE_COLOR_PATCHES "4" KEYWORD "USE_BLACK_POINT_COMPENSATION" USE_BLACK_POINT_COMPENSATION "NO" KEYWORD "HIRES_B2A" HIRES_B2A "NO" KEYWORD "AUTO_OPTIMIZE" AUTO_OPTIMIZE "9" KEYWORD "3DLUT_SOURCE_PROFILE" 3DLUT_SOURCE_PROFILE "ref/Rec709.icm" KEYWORD "3DLUT_GAMMA" 3DLUT_GAMMA "-2.4" KEYWORD "3DLUT_DEGREE_OF_BLACK_OUTPUT_OFFSET" 3DLUT_DEGREE_OF_BLACK_OUTPUT_OFFSET "0.0" KEYWORD "3DLUT_INPUT_ENCODING" 3DLUT_INPUT_ENCODING "t" KEYWORD "3DLUT_OUTPUT_ENCODING" 3DLUT_OUTPUT_ENCODING "t" KEYWORD "3DLUT_GAMUT_MAPPING_MODE" 3DLUT_GAMUT_MAPPING_MODE "G" KEYWORD "3DLUT_RENDERING_INTENT" 3DLUT_RENDERING_INTENT "aw" KEYWORD "3DLUT_FORMAT" 3DLUT_FORMAT "madVR" KEYWORD "3DLUT_SIZE" 3DLUT_SIZE "65" BEGIN_ARGYLL_COLPROF_ARGS -qh -bl -ax END_ARGYLL_COLPROF_ARGS NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT SAMPLE_ID RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 1399 BEGIN_DATA 1 100.0000000 100.0000000 100.0000000 95.04580000 100.0000000 108.9060000 2 36.18660000 40.25050000 29.03860000 10.43240000 12.41520000 8.082730000 3 75.62240000 56.57030000 28.01850000 33.62140000 32.37170000 10.24120000 4 82.79480000 56.83720000 43.69100000 40.46860000 35.84890000 20.10110000 5 19.47590000 14.15960000 0.000000000 1.614820000 1.553530000 0.214771000 6 20.94060000 9.655240000 0.000000000 1.533610000 1.101250000 0.131754000 7 21.64610000 0.000000000 9.880980000 1.535610000 0.778814000 0.651906000 8 64.49270000 50.86790000 23.72350000 24.56660000 24.58230000 7.448250000 9 78.94490000 73.49390000 36.37540000 44.63550000 49.75270000 17.48580000 10 0.000000000 15.10070000 0.000000000 0.559497000 1.119080000 0.186522000 11 0.000000000 9.493670000 0.000000000 0.201613000 0.403256000 0.067212600 12 11.29030000 0.000000000 0.000000000 0.340406000 0.175489000 0.015935900 13 13.15790000 0.000000000 0.000000000 0.476651000 0.245728000 0.022314200 14 13.21410000 8.186610000 0.000000000 0.626698000 0.539183000 0.071050300 15 6.646220000 6.646220000 6.646220000 0.244634000 0.257385000 0.280307000 16 9.493670000 9.493670000 9.493670000 0.535904000 0.563838000 0.614052000 17 15.10070000 0.000000000 0.000000000 0.645261000 0.332651000 0.030207600 18 17.12330000 0.000000000 0.000000000 0.850733000 0.438578000 0.039826700 19 19.23080000 0.000000000 0.000000000 1.098130000 0.566119000 0.051408600 20 21.42860000 0.000000000 0.000000000 1.393190000 0.718230000 0.065221500 21 23.72260000 0.000000000 0.000000000 1.742400000 0.898261000 0.081569800 22 26.11940000 0.000000000 0.000000000 2.153160000 1.110020000 0.100799000 23 28.62600000 0.000000000 0.000000000 2.633900000 1.357850000 0.123305000 24 31.25000000 0.000000000 0.000000000 3.194240000 1.646720000 0.149537000 25 34.00000000 0.000000000 0.000000000 3.845230000 1.982330000 0.180013000 26 36.88520000 0.000000000 0.000000000 4.599570000 2.371210000 0.215327000 27 39.91600000 0.000000000 0.000000000 5.471880000 2.820920000 0.256164000 28 43.10340000 0.000000000 0.000000000 6.479100000 3.340170000 0.303316000 29 46.46020000 0.000000000 0.000000000 7.640830000 3.939070000 0.357702000 30 50.00000000 0.000000000 0.000000000 8.979910000 4.629410000 0.420390000 31 53.73830000 0.000000000 0.000000000 10.52300000 5.424900000 0.492628000 32 57.69230000 0.000000000 0.000000000 12.30120000 6.341650000 0.575877000 33 61.88120000 0.000000000 0.000000000 14.35140000 7.398570000 0.671854000 34 66.32650000 0.000000000 0.000000000 16.71680000 8.618020000 0.782591000 35 71.05260000 0.000000000 0.000000000 19.44890000 10.02650000 0.910491000 36 76.08700000 0.000000000 0.000000000 22.60880000 11.65550000 1.058420000 37 81.46070000 0.000000000 0.000000000 26.26990000 13.54290000 1.229810000 38 87.20930000 0.000000000 0.000000000 30.52020000 15.73410000 1.428790000 39 93.37350000 0.000000000 0.000000000 35.46650000 18.28400000 1.660350000 40 100.0000000 0.000000000 0.000000000 41.23850000 21.25960000 1.930560000 41 13.02300000 15.75260000 0.000000000 1.079970000 1.468310000 0.226506000 42 10.68380000 10.68380000 10.68380000 0.694840000 0.731058000 0.796164000 43 4.491020000 0.000000000 0.000000000 0.044824300 0.023108300 0.002098430 44 7.201650000 7.201650000 7.201650000 0.291861000 0.307074000 0.334421000 45 0.000000000 1.445090000 0.000000000 0.003210470 0.006421420 0.001070290 46 0.000000000 2.941180000 0.000000000 0.015321700 0.030645700 0.005107870 47 0.000000000 4.491020000 0.000000000 0.038866600 0.077738900 0.012957100 48 7.763980000 7.763980000 7.763980000 0.344338000 0.362287000 0.394551000 49 0.000000000 13.15790000 0.000000000 0.413298000 0.826656000 0.137783000 50 0.000000000 17.12330000 0.000000000 0.737658000 1.475430000 0.245916000 51 0.000000000 19.23080000 0.000000000 0.952175000 1.904490000 0.317431000 52 0.000000000 21.42860000 0.000000000 1.208020000 2.416210000 0.402721000 53 0.000000000 23.72260000 0.000000000 1.510810000 3.021850000 0.503667000 54 0.000000000 26.11940000 0.000000000 1.866980000 3.734230000 0.622403000 55 0.000000000 28.62600000 0.000000000 2.283820000 4.567970000 0.761366000 56 0.000000000 31.25000000 0.000000000 2.769680000 5.539770000 0.923340000 57 0.000000000 34.00000000 0.000000000 3.334140000 6.668780000 1.111520000 58 0.000000000 36.88520000 0.000000000 3.988220000 7.977030000 1.329570000 59 0.000000000 39.91600000 0.000000000 4.744590000 9.489890000 1.581730000 60 0.000000000 43.10340000 0.000000000 5.617940000 11.23670000 1.872880000 61 0.000000000 46.46020000 0.000000000 6.625260000 13.25150000 2.208690000 62 0.000000000 50.00000000 0.000000000 7.786350000 15.57390000 2.595770000 63 0.000000000 53.73830000 0.000000000 9.124320000 18.25000000 3.041810000 64 0.000000000 57.69230000 0.000000000 10.66620000 21.33400000 3.555850000 65 0.000000000 61.88120000 0.000000000 12.44390000 24.88960000 4.148480000 66 0.000000000 66.32650000 0.000000000 14.49490000 28.99200000 4.832240000 67 0.000000000 71.05260000 0.000000000 16.86390000 33.73020000 5.621980000 68 0.000000000 76.08700000 0.000000000 19.60380000 39.21050000 6.535400000 69 0.000000000 81.46070000 0.000000000 22.77820000 45.55980000 7.593680000 70 0.000000000 87.20930000 0.000000000 26.46360000 52.93120000 8.822290000 71 0.000000000 93.37350000 0.000000000 30.75250000 61.50950000 10.25210000 72 0.000000000 100.0000000 0.000000000 35.75730000 71.51990000 11.92060000 73 28.34880000 100.0000000 70.37100000 46.66960000 76.18290000 55.93060000 74 67.98480000 100.0000000 74.26580000 62.78950000 84.37210000 62.15630000 75 83.59200000 100.0000000 74.15010000 72.91270000 89.59460000 62.46250000 76 100.0000000 100.0000000 79.29620000 87.83280000 97.11460000 70.92110000 77 9.863630000 9.892620000 0.000000000 0.473628000 0.571849000 0.085421100 78 0.000000000 0.000000000 2.941180000 0.007734280 0.003093910 0.040730200 79 0.000000000 0.000000000 4.491020000 0.019619500 0.007848320 0.103320000 80 0.000000000 0.000000000 6.097560000 0.038438800 0.015376500 0.202426000 81 0.000000000 0.000000000 13.15790000 0.208629000 0.083457100 1.098680000 82 0.000000000 0.000000000 17.12330000 0.372364000 0.148955000 1.960940000 83 0.000000000 0.000000000 19.23080000 0.480650000 0.192272000 2.531190000 84 0.000000000 0.000000000 21.42860000 0.609797000 0.243934000 3.211300000 85 0.000000000 0.000000000 23.72260000 0.762647000 0.305078000 4.016240000 86 0.000000000 0.000000000 26.11940000 0.942436000 0.376999000 4.963040000 87 0.000000000 0.000000000 28.62600000 1.152850000 0.461170000 6.071130000 88 0.000000000 0.000000000 31.25000000 1.398110000 0.559281000 7.362710000 89 0.000000000 0.000000000 34.00000000 1.683050000 0.673263000 8.863250000 90 0.000000000 0.000000000 36.88520000 2.013220000 0.805340000 10.60200000 91 0.000000000 0.000000000 39.91600000 2.395030000 0.958075000 12.61270000 92 0.000000000 0.000000000 43.10340000 2.835890000 1.134430000 14.93430000 93 0.000000000 0.000000000 46.46020000 3.344380000 1.337840000 17.61210000 94 0.000000000 0.000000000 50.00000000 3.930490000 1.572300000 20.69870000 95 0.000000000 0.000000000 53.73830000 4.605880000 1.842470000 24.25540000 96 0.000000000 0.000000000 66.32650000 7.316920000 2.926960000 38.53230000 97 0.000000000 0.000000000 71.05260000 8.512740000 3.405320000 44.82970000 98 0.000000000 0.000000000 76.08700000 9.895840000 3.958590000 52.11330000 99 0.000000000 0.000000000 81.46070000 11.49830000 4.599600000 60.55200000 100 0.000000000 0.000000000 87.20930000 13.35860000 5.343790000 70.34900000 101 0.000000000 0.000000000 93.37350000 15.52360000 6.209840000 81.75010000 102 0.000000000 0.000000000 100.0000000 18.05000000 7.220460000 95.05460000 103 55.83310000 0.000000000 79.89610000 22.46440000 10.30840000 58.55950000 104 65.71360000 65.46360000 80.69580000 41.72460000 41.11790000 64.77050000 105 0.000000000 16.36620000 11.20940000 0.814484000 1.394420000 0.994951000 106 11.90480000 11.90480000 11.90480000 0.881537000 0.927487000 1.010090000 107 7.763980000 0.000000000 0.000000000 0.149401000 0.077020800 0.006994160 108 0.000000000 7.763980000 0.000000000 0.129544000 0.259107000 0.043186600 109 0.000000000 0.000000000 7.763980000 0.065392700 0.026158800 0.344370000 110 0.000000000 6.097560000 0.000000000 0.076147800 0.152307000 0.025385700 111 6.097560000 0.000000000 0.000000000 0.087820400 0.045274000 0.004111270 112 0.000000000 0.000000000 1.445090000 0.001620620 0.000648290 0.008534490 113 0.476190000 0.476190000 0.476190000 0.000742788 0.000781505 0.000851104 114 0.957854000 0.957854000 0.957854000 0.003454370 0.003634430 0.003958100 115 1.445090000 1.445090000 1.445090000 0.008533690 0.008978510 0.009778110 116 9.493670000 0.000000000 0.000000000 0.232518000 0.119870000 0.010885200 117 1.937980000 1.937980000 1.937980000 0.016272000 0.017120200 0.018644900 118 0.000000000 0.000000000 9.493670000 0.101773000 0.040711700 0.535954000 119 2.436650000 2.436650000 2.436650000 0.026923800 0.028327200 0.030850000 120 2.941180000 2.941180000 2.941180000 0.040726400 0.042849200 0.046665300 121 3.451680000 3.451680000 3.451680000 0.057908400 0.060926800 0.066352800 122 3.968250000 3.968250000 3.968250000 0.078694900 0.082796800 0.090170500 123 4.491020000 4.491020000 4.491020000 0.103310000 0.108695000 0.118376000 124 5.020080000 5.020080000 5.020080000 0.131981000 0.138860000 0.151227000 125 0.000000000 0.000000000 11.29030000 0.148995000 0.059601800 0.784634000 126 5.555560000 5.555560000 5.555560000 0.164935000 0.173533000 0.188987000 127 6.097560000 6.097560000 6.097560000 0.202407000 0.212957000 0.231923000 128 8.333330000 8.333330000 8.333330000 0.402325000 0.423296000 0.460994000 129 12.52720000 12.52720000 12.52720000 0.986096000 1.037500000 1.129890000 130 13.15790000 13.15790000 13.15790000 1.098580000 1.155840000 1.258780000 131 13.79690000 13.79690000 13.79690000 1.219340000 1.282900000 1.397150000 132 14.44440000 14.44440000 14.44440000 1.348750000 1.419050000 1.545430000 133 15.76580000 15.76580000 15.76580000 1.635060000 1.720280000 1.873490000 134 16.43990000 16.43990000 16.43990000 1.792770000 1.886220000 2.054200000 135 17.12330000 17.12330000 17.12330000 1.960760000 2.062960000 2.246680000 136 17.81610000 17.81610000 17.81610000 2.139470000 2.250990000 2.451450000 137 18.51850000 18.51850000 18.51850000 2.329370000 2.450790000 2.669050000 138 19.23080000 19.23080000 19.23080000 2.530960000 2.662880000 2.900030000 139 19.95310000 19.95310000 19.95310000 2.744730000 2.887800000 3.144980000 140 20.68560000 20.68560000 20.68560000 2.971230000 3.126100000 3.404510000 141 21.42860000 21.42860000 21.42860000 3.211000000 3.378370000 3.679240000 142 22.18230000 22.18230000 22.18230000 3.464630000 3.645220000 3.969850000 143 23.72260000 23.72260000 23.72260000 4.015870000 4.225190000 4.601480000 144 24.50980000 24.50980000 24.50980000 4.314770000 4.539670000 4.943970000 145 25.30860000 25.30860000 25.30860000 4.630100000 4.871440000 5.305280000 146 26.11940000 26.11940000 26.11940000 4.962580000 5.221250000 5.686240000 147 26.94240000 26.94240000 26.94240000 5.312950000 5.589890000 6.087710000 148 27.77780000 27.77780000 27.77780000 5.682010000 5.978180000 6.510580000 149 28.62600000 28.62600000 28.62600000 6.070570000 6.386990000 6.955800000 150 29.48720000 29.48720000 29.48720000 6.479480000 6.817220000 7.424350000 151 30.36180000 30.36180000 30.36180000 6.909660000 7.269820000 7.917250000 152 31.25000000 31.25000000 31.25000000 7.362030000 7.745770000 8.435590000 153 32.15220000 32.15220000 32.15220000 7.837590000 8.246120000 8.980490000 154 33.06880000 33.06880000 33.06880000 8.337360000 8.771940000 9.553140000 155 34.00000000 34.00000000 34.00000000 8.862420000 9.324370000 10.15480000 156 34.94620000 34.94620000 34.94620000 9.413920000 9.904620000 10.78670000 157 35.90790000 35.90790000 35.90790000 9.993030000 10.51390000 11.45030000 158 36.88520000 36.88520000 36.88520000 10.60100000 11.15360000 12.14690000 159 37.87880000 37.87880000 37.87880000 11.23920000 11.82500000 12.87810000 160 38.88890000 38.88890000 38.88890000 11.90880000 12.52960000 13.64540000 161 39.91600000 39.91600000 39.91600000 12.61150000 13.26890000 14.45060000 162 40.96050000 40.96050000 40.96050000 13.34870000 14.04450000 15.29520000 163 42.02280000 42.02280000 42.02280000 14.12190000 14.85800000 16.18120000 164 43.10340000 43.10340000 43.10340000 14.93290000 15.71130000 17.11050000 165 44.20290000 44.20290000 44.20290000 15.78340000 16.60610000 18.08500000 166 45.32160000 45.32160000 45.32160000 16.67530000 17.54450000 19.10700000 167 46.46020000 46.46020000 46.46020000 17.61050000 18.52840000 20.17850000 168 47.61900000 47.61900000 47.61900000 18.59100000 19.56000000 21.30200000 169 48.79880000 48.79880000 48.79880000 19.61900000 20.64160000 22.47990000 170 50.00000000 50.00000000 50.00000000 20.69670000 21.77560000 23.71480000 171 51.22320000 51.22320000 51.22320000 21.82670000 22.96440000 25.00950000 172 52.46910000 52.46910000 52.46910000 23.01130000 24.21070000 26.36680000 173 53.73830000 53.73830000 53.73830000 24.25320000 25.51740000 27.78990000 174 55.03140000 55.03140000 55.03140000 25.55520000 26.88730000 29.28180000 175 56.34920000 56.34920000 56.34920000 26.92030000 28.32360000 30.84600000 176 57.69230000 57.69230000 57.69230000 28.35170000 29.82950000 32.48600000 177 59.06150000 59.06150000 59.06150000 29.85250000 31.40860000 34.20580000 178 60.45750000 60.45750000 60.45750000 31.42640000 33.06450000 36.00910000 179 61.88120000 61.88120000 61.88120000 33.07690000 34.80100000 37.90030000 180 63.33330000 63.33330000 63.33330000 34.80800000 36.62230000 39.88380000 181 64.81480000 64.81480000 64.81480000 36.62380000 38.53280000 41.96440000 182 66.32650000 66.32650000 66.32650000 38.52870000 40.53700000 44.14710000 183 67.86940000 67.86940000 67.86940000 40.52730000 42.63970000 46.43710000 184 69.44440000 69.44440000 69.44440000 42.62450000 44.84630000 48.84020000 185 71.05260000 71.05260000 71.05260000 44.82550000 47.16200000 51.36210000 186 72.69500000 72.69500000 72.69500000 47.13590000 49.59280000 54.00940000 187 74.37280000 74.37280000 74.37280000 49.56140000 52.14480000 56.78870000 188 76.08700000 76.08700000 76.08700000 52.10840000 54.82460000 59.70710000 189 77.83880000 77.83880000 77.83880000 54.78350000 57.63910000 62.77220000 190 79.62960000 79.62960000 79.62960000 57.59360000 60.59570000 65.99220000 191 81.46070000 81.46070000 81.46070000 60.54640000 63.70230000 69.37550000 192 83.33330000 83.33330000 83.33330000 63.64960000 66.96740000 72.93130000 193 85.24900000 85.24900000 85.24900000 66.91200000 70.39970000 76.66940000 194 87.20930000 87.20930000 87.20930000 70.34240000 74.00900000 80.60010000 195 89.21570000 89.21570000 89.21570000 73.95070000 77.80530000 84.73450000 196 91.26980000 91.26980000 91.26980000 77.74700000 81.79960000 89.08440000 197 100.0000000 100.0000000 91.96320000 92.00840000 98.78500000 92.91030000 198 100.0000000 81.60980000 76.74380000 74.19320000 71.03720000 62.66260000 199 100.0000000 84.45000000 86.88810000 79.14620000 75.87800000 79.93090000 200 10.94810000 0.000000000 9.601720000 0.422464000 0.205741000 0.564354000 201 0.000000000 0.000000000 15.10070000 0.282430000 0.112979000 1.487330000 202 0.000000000 10.33340000 22.67520000 0.933476000 0.762126000 3.717550000 203 29.91970000 0.000000000 42.70670000 5.681600000 2.608070000 14.76950000 204 44.35130000 0.000000000 67.30290000 14.45470000 6.579090000 40.11370000 205 49.52420000 69.01080000 78.69820000 35.26760000 40.43180000 61.81220000 206 23.75210000 70.09500000 0.000000000 18.11520000 33.63920000 5.538480000 207 53.09250000 71.70330000 0.000000000 27.45220000 39.69580000 6.215520000 208 100.0000000 85.42810000 33.11380000 68.11600000 72.47760000 18.72450000 209 100.0000000 91.35830000 69.54470000 78.67070000 83.13580000 54.46620000 210 46.72430000 20.89060000 43.02070000 11.70290000 7.402950000 15.61430000 211 66.90700000 19.55090000 51.63590000 22.24650000 12.44730000 23.34420000 212 0.000000000 0.000000000 57.69230000 5.384230000 2.153830000 28.35430000 213 0.000000000 45.59070000 80.88170000 17.67500000 17.24030000 61.72840000 214 0.000000000 62.98100000 84.26860000 25.32340000 30.82840000 69.54960000 215 0.000000000 45.08500000 59.05490000 11.86950000 14.67140000 31.91550000 216 0.000000000 64.62960000 71.11170000 22.22020000 30.79730000 49.47620000 217 0.000000000 52.38060000 57.51790000 13.97350000 19.39080000 31.04160000 218 0.000000000 69.86820000 68.43220000 24.08930000 35.64120000 46.69180000 219 0.000000000 70.48080000 100.0000000 34.61680000 40.35660000 100.5780000 220 0.000000000 79.35790000 100.0000000 39.55510000 50.23390000 102.2240000 221 0.000000000 88.78420000 100.0000000 45.57600000 62.27660000 104.2310000 222 0.000000000 41.38020000 31.03300000 6.512640000 10.82310000 8.962870000 223 0.000000000 58.32010000 30.07070000 12.20790000 22.36190000 10.40700000 224 47.77500000 37.97340000 0.000000000 12.37600000 12.69220000 1.797710000 225 61.25000000 46.87190000 0.000000000 20.78650000 20.74470000 2.908840000 226 70.64520000 60.11200000 0.000000000 30.87940000 33.25200000 4.791160000 227 83.29470000 84.23340000 0.000000000 52.10640000 63.26250000 9.465270000 228 65.23390000 68.26600000 0.000000000 31.56060000 39.19800000 5.902970000 229 68.39920000 78.31160000 14.21970000 39.02120000 51.09640000 9.103550000 230 74.32500000 100.0000000 38.72730000 59.47160000 83.48650000 24.72720000 231 79.58850000 100.0000000 84.97470000 73.33500000 89.43500000 79.53460000 232 0.000000000 18.62310000 21.20980000 1.483450000 2.013140000 3.435440000 233 0.000000000 25.31750000 31.72670000 3.188680000 4.064940000 8.193120000 234 0.000000000 34.90900000 45.97710000 6.801720000 8.374630000 18.38980000 235 68.27620000 43.77400000 49.31960000 27.44230000 22.33530000 22.85580000 236 76.82380000 70.03830000 53.78700000 44.04710000 46.43160000 30.83190000 237 0.000000000 32.92980000 28.79140000 4.275250000 6.682900000 7.184590000 238 0.000000000 73.75240000 63.54720000 24.96480000 39.27720000 41.17270000 239 0.000000000 100.0000000 77.27440000 45.99600000 75.61560000 65.83920000 240 0.000000000 100.0000000 88.30430000 49.48760000 77.01240000 84.22670000 241 0.000000000 100.0000000 100.0000000 53.80730000 78.74040000 106.9750000 242 0.000000000 39.39160000 61.53190000 10.81250000 11.69960000 34.20710000 243 0.000000000 44.09460000 100.0000000 23.95600000 19.03330000 97.02350000 244 0.000000000 52.35390000 100.0000000 26.66540000 24.45240000 97.92680000 245 0.000000000 61.07990000 100.0000000 30.14230000 31.40680000 99.08590000 246 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 247 41.54630000 0.000000000 12.81390000 6.172290000 3.159260000 1.316250000 248 70.31060000 0.000000000 23.65710000 19.76310000 10.10090000 4.881600000 249 84.78780000 0.000000000 47.23920000 32.15640000 16.17690000 19.61110000 250 100.0000000 0.000000000 52.92420000 45.69230000 23.04130000 25.38520000 251 100.0000000 0.000000000 63.08060000 47.79090000 23.88080000 36.43710000 252 100.0000000 0.000000000 86.90030000 54.49320000 26.56190000 71.73250000 253 68.22890000 19.45920000 60.43860000 24.73070000 13.51140000 32.56630000 254 48.72460000 0.000000000 34.30220000 10.20000000 5.060170000 9.434580000 255 53.83400000 0.000000000 45.04880000 13.68920000 6.696250000 16.95140000 256 67.68530000 0.000000000 45.44390000 20.66480000 10.28540000 17.59420000 257 81.86040000 0.000000000 57.65320000 31.93040000 15.84010000 29.55520000 258 85.37840000 0.000000000 88.42760000 42.90120000 20.52610000 73.89210000 259 35.12170000 51.67870000 44.44730000 15.53660000 20.08960000 18.96210000 260 35.46710000 50.54140000 54.26730000 16.89880000 20.00510000 27.63910000 261 35.06590000 58.32980000 61.56210000 21.25310000 26.46190000 36.54150000 262 37.98160000 74.68580000 93.19550000 39.18280000 46.35280000 87.91110000 263 64.46880000 83.77100000 100.0000000 57.97760000 63.76650000 103.8650000 264 78.79220000 83.70940000 100.0000000 66.64850000 68.17850000 104.2600000 265 100.0000000 91.11700000 100.0000000 88.43020000 86.76780000 106.7000000 266 24.52780000 0.000000000 30.82510000 3.231760000 1.509370000 7.232100000 267 26.78640000 0.000000000 70.09100000 10.53740000 4.478100000 43.61270000 268 32.26250000 0.000000000 100.0000000 21.47630000 8.986810000 95.21500000 269 41.60570000 26.46420000 100.0000000 25.96590000 14.15420000 95.97590000 270 43.49310000 55.64040000 100.0000000 34.50830000 30.32830000 98.64760000 271 49.41410000 69.26280000 100.0000000 42.74380000 43.62120000 100.7790000 272 87.38650000 68.53030000 100.0000000 64.28200000 54.17770000 101.6820000 273 100.0000000 70.32150000 100.0000000 75.77310000 61.45180000 102.4810000 274 57.05340000 10.24880000 17.93840000 12.65460000 6.830390000 2.813580000 275 81.57000000 0.000000000 14.12310000 26.59130000 13.68040000 2.517210000 276 100.0000000 100.0000000 53.18250000 81.49750000 94.58040000 37.55820000 277 23.05960000 26.79320000 0.000000000 3.611640000 4.793350000 0.734901000 278 34.13740000 29.37270000 0.000000000 6.296380000 6.834130000 0.987346000 279 32.55640000 80.25540000 32.30620000 27.04300000 46.49410000 15.43350000 280 58.17970000 100.0000000 36.82360000 50.29410000 78.78240000 23.07030000 281 83.54270000 100.0000000 54.40440000 68.25880000 87.72880000 38.14210000 282 89.27070000 100.0000000 66.01880000 75.12900000 90.98060000 51.56490000 283 66.72690000 72.46480000 50.02420000 38.48400000 45.52900000 27.38440000 284 100.0000000 87.27330000 56.80130000 72.94790000 76.35770000 38.16730000 285 57.75510000 51.51830000 31.22700000 22.04240000 23.54810000 10.70030000 286 100.0000000 53.93300000 31.98570000 51.90720000 40.24400000 12.74600000 287 100.0000000 64.63140000 35.47410000 56.77890000 49.38620000 16.22570000 288 100.0000000 67.54200000 48.16870000 59.94480000 52.88140000 26.02760000 289 50.82600000 34.81090000 23.64250000 13.57790000 12.12570000 5.592940000 290 74.50760000 34.78060000 23.70110000 25.85550000 18.44470000 6.187360000 291 74.80590000 60.99490000 100.0000000 51.88550000 42.56120000 100.0930000 292 75.51760000 71.74190000 100.0000000 57.51420000 53.13900000 101.8380000 293 0.000000000 70.77200000 33.60510000 18.35810000 34.09410000 14.21170000 294 0.000000000 85.54980000 37.24240000 27.42510000 51.56380000 19.28640000 295 0.000000000 100.0000000 38.83460000 38.01200000 72.42180000 23.79400000 296 0.000000000 100.0000000 53.37790000 40.29550000 73.33530000 35.81970000 297 0.000000000 23.42150000 12.51660000 1.655870000 3.012900000 1.474050000 298 0.000000000 33.74690000 14.29130000 3.530000000 6.660170000 2.411030000 299 76.51200000 42.82270000 64.60180000 35.33030000 25.63780000 39.28060000 300 90.95650000 61.21350000 65.16050000 52.66620000 44.37710000 42.67610000 301 35.83790000 17.90660000 19.48910000 5.626100000 4.051600000 3.080030000 302 51.74140000 23.38280000 26.49130000 12.11790000 8.307800000 6.060970000 303 86.42750000 51.87350000 84.87650000 50.94940000 37.34610000 70.49200000 304 100.0000000 57.73610000 100.0000000 69.97250000 49.84980000 100.5470000 305 0.000000000 45.49680000 16.16890000 6.655130000 12.78600000 3.837800000 306 15.40400000 54.88520000 32.03670000 11.70890000 20.05580000 10.99450000 307 25.43920000 100.0000000 91.44970000 52.61790000 78.49930000 90.10720000 308 33.60700000 100.0000000 100.0000000 57.55550000 80.67260000 107.1510000 309 0.000000000 35.99710000 66.56310000 11.15450000 10.51070000 40.09540000 310 0.000000000 37.62620000 83.49760000 16.30660000 13.19000000 65.32080000 311 25.70480000 0.000000000 22.66030000 2.768260000 1.347470000 3.728610000 312 100.0000000 0.000000000 25.12220000 42.10360000 21.60570000 6.486400000 313 100.0000000 0.000000000 34.27690000 42.95180000 21.94500000 10.95330000 314 100.0000000 0.000000000 43.47890000 44.12900000 22.41590000 17.15240000 315 16.94390000 0.000000000 19.64370000 1.334900000 0.630008000 2.691180000 316 15.27790000 8.502690000 21.40190000 1.428370000 0.901001000 3.286270000 317 11.55950000 25.56510000 33.91570000 3.813350000 4.416590000 9.425510000 318 0.000000000 53.56840000 44.48770000 12.10100000 19.33940000 19.03010000 319 0.000000000 65.37960000 51.20780000 18.18600000 29.74650000 26.49600000 320 0.000000000 82.14170000 58.76390000 28.80570000 48.64440000 37.25950000 321 0.000000000 100.0000000 65.27270000 42.82100000 74.34550000 49.11920000 322 17.92590000 21.10810000 13.36620000 2.325500000 2.908900000 1.570930000 323 24.55140000 17.89220000 17.91850000 3.103020000 2.758380000 2.525640000 324 32.26720000 35.31460000 82.87670000 18.99400000 13.79320000 64.25970000 325 20.95070000 32.28680000 39.12180000 6.593070000 7.552180000 13.12150000 326 37.29560000 37.04950000 52.32510000 13.08390000 12.22260000 24.43800000 327 46.70300000 100.0000000 79.55160000 54.40020000 79.87020000 69.75730000 328 56.97890000 100.0000000 100.0000000 65.77650000 84.91080000 107.5360000 329 0.000000000 43.67700000 24.89290000 6.631510000 11.90730000 6.393010000 330 0.000000000 70.38840000 45.80690000 19.76090000 34.33750000 22.57910000 331 49.68160000 69.57050000 48.97210000 28.70950000 38.26910000 25.55620000 332 100.0000000 70.42320000 68.15070000 65.54230000 57.44310000 48.34500000 333 53.40590000 35.08430000 32.46350000 15.47310000 13.10500000 9.683100000 334 71.03330000 33.87260000 31.11420000 24.12880000 17.18840000 9.304860000 335 100.0000000 53.27580000 42.16010000 52.89220000 40.24650000 19.14000000 336 100.0000000 77.17180000 53.54310000 66.03140000 63.53800000 32.73470000 337 100.0000000 21.12680000 0.000000000 42.40940000 23.60170000 2.320910000 338 100.0000000 21.04540000 18.88240000 42.86120000 23.76660000 4.749060000 339 100.0000000 21.68090000 40.48210000 44.94840000 24.72710000 15.35320000 340 100.0000000 19.02560000 51.30270000 46.32770000 24.78350000 24.14390000 341 51.58180000 24.09540000 0.000000000 11.18010000 8.084860000 0.971428000 342 71.14940000 23.40830000 0.000000000 20.97430000 12.99100000 1.402330000 343 84.52920000 36.02010000 0.000000000 32.28080000 22.26150000 2.595950000 344 100.0000000 36.08740000 0.000000000 45.03940000 28.86210000 3.197710000 345 100.0000000 73.56880000 0.000000000 59.44360000 57.67260000 7.999690000 346 100.0000000 86.17350000 0.000000000 67.01580000 72.81800000 10.52400000 347 15.10070000 15.10070000 15.10070000 1.487190000 1.564710000 1.704060000 348 10.08490000 10.08490000 10.08490000 0.612056000 0.643959000 0.701309000 349 0.000000000 11.29030000 0.000000000 0.295161000 0.590365000 0.098399100 350 11.29030000 11.29030000 11.29030000 0.784561000 0.825456000 0.898969000 351 40.36230000 32.79050000 25.84320000 9.606860000 9.417190000 6.137270000 352 47.73890000 38.56910000 47.42830000 16.01010000 14.38120000 20.27580000 353 47.51700000 39.87250000 62.61730000 19.20860000 16.18500000 35.90530000 354 59.89720000 62.95070000 100.0000000 44.33070000 39.95280000 99.98780000 355 65.58440000 75.65990000 100.0000000 53.72090000 54.35600000 102.2730000 356 100.0000000 80.84430000 100.0000000 81.68940000 73.28520000 104.4530000 357 45.74350000 22.67340000 29.48030000 9.981640000 7.034360000 7.278390000 358 53.92080000 28.84010000 42.45540000 15.66620000 11.20620000 15.71520000 359 75.30950000 29.37450000 44.14200000 27.50940000 17.42540000 17.57770000 360 38.12510000 41.34480000 22.11150000 10.72600000 13.06440000 5.381190000 361 37.85270000 75.21170000 41.88290000 26.64260000 41.80040000 20.61920000 362 44.94770000 100.0000000 44.47740000 45.90030000 76.39790000 28.25450000 363 27.82910000 42.06700000 60.86510000 13.85740000 14.35010000 33.78830000 364 45.53960000 54.98260000 60.91670000 22.97550000 25.38920000 35.49780000 365 50.84600000 73.25150000 74.56890000 36.81720000 44.65890000 56.30190000 366 58.24590000 83.01470000 75.60540000 46.06580000 57.87310000 59.89470000 367 41.79670000 60.83140000 53.76490000 22.65020000 28.93640000 28.56060000 368 52.81550000 100.0000000 57.36450000 51.20410000 78.86900000 40.39600000 369 52.66790000 100.0000000 69.15840000 53.84640000 79.91880000 54.63510000 370 63.00490000 100.0000000 83.41090000 62.80050000 84.06240000 76.40560000 371 28.23840000 0.000000000 17.02260000 2.923680000 1.464790000 2.055330000 372 44.93150000 13.47710000 100.0000000 25.58450000 11.75150000 95.53220000 373 56.74050000 24.06330000 100.0000000 31.46820000 16.45240000 96.12950000 374 70.66040000 33.59710000 100.0000000 40.51140000 23.62180000 97.03690000 375 86.98590000 44.71320000 100.0000000 54.48830000 35.04640000 98.50550000 376 23.51830000 10.56320000 76.16640000 11.88310000 5.358990000 52.39810000 377 38.74230000 20.56940000 76.20250000 16.15720000 8.821790000 52.89550000 378 59.54810000 39.57380000 75.90410000 27.68750000 20.04860000 54.00770000 379 72.45280000 58.73980000 76.83110000 41.50840000 36.70560000 57.89050000 380 93.37350000 93.37350000 93.37350000 81.74250000 86.00330000 93.66260000 381 95.52850000 95.52850000 95.52850000 85.94890000 90.42900000 98.48230000 382 97.73660000 97.73660000 97.73660000 90.37880000 95.08980000 103.5580000 383 0.000000000 15.57160000 35.87560000 2.492600000 1.954910000 10.17380000 384 0.000000000 19.86960000 35.08170000 2.826180000 2.767670000 9.836340000 385 27.00260000 20.61760000 50.36790000 7.420640000 5.011740000 21.51350000 386 26.97610000 29.77110000 61.05270000 10.89920000 8.610580000 33.05190000 387 41.67990000 28.86190000 62.91330000 14.85750000 10.35940000 35.36250000 388 45.94140000 77.64390000 71.80230000 36.66280000 48.32450000 53.05850000 389 47.79290000 80.80180000 83.00370000 42.48890000 53.73860000 70.94300000 390 46.83360000 84.04540000 100.0000000 50.22460000 60.02910000 103.5520000 391 0.000000000 21.06240000 64.94430000 8.148840000 5.120820000 37.17600000 392 0.000000000 29.32450000 67.53760000 10.02210000 7.862490000 40.89930000 393 0.000000000 48.99920000 72.75430000 16.41530000 18.48380000 49.70770000 394 100.0000000 49.20250000 74.82600000 58.29300000 40.10810000 54.66890000 395 100.0000000 64.00690000 80.14890000 65.73690000 52.50670000 64.82720000 396 57.06540000 42.30960000 47.42200000 20.90060000 18.37720000 20.78400000 397 62.55650000 48.61410000 48.63840000 25.71670000 23.69730000 22.60750000 398 22.94690000 22.94690000 22.94690000 3.732700000 3.927270000 4.277020000 399 25.02750000 20.22760000 23.59470000 3.777880000 3.440350000 4.415270000 400 25.09310000 20.96920000 34.81140000 4.895900000 4.029210000 9.811340000 401 100.0000000 37.77550000 37.72810000 47.55720000 30.51260000 14.47380000 402 100.0000000 39.36850000 47.13230000 49.29280000 31.84640000 21.64230000 403 100.0000000 46.32630000 60.42730000 53.78340000 36.81210000 35.52010000 404 100.0000000 60.04890000 63.27230000 59.48270000 47.19590000 40.55120000 405 58.97390000 17.19250000 0.000000000 13.65450000 8.144180000 0.852494000 406 82.86290000 20.24720000 0.000000000 28.34100000 16.19380000 1.632350000 407 100.0000000 56.66120000 18.74620000 51.94430000 41.94590000 7.741180000 408 100.0000000 77.13630000 20.41770000 61.99010000 61.88860000 11.55330000 409 100.0000000 100.0000000 21.17330000 77.58970000 93.01710000 16.97890000 410 10.24510000 0.000000000 17.23850000 0.652821000 0.292900000 2.002950000 411 0.000000000 12.12380000 19.33590000 0.831656000 0.885062000 2.676800000 412 0.000000000 0.000000000 61.88120000 6.281580000 2.512790000 33.08000000 413 42.03990000 0.000000000 85.33520000 18.86810000 8.256090000 67.35420000 414 57.02950000 0.000000000 100.0000000 30.04260000 13.40300000 95.61610000 415 78.47000000 0.000000000 100.0000000 42.24540000 19.69390000 96.18730000 416 100.0000000 0.000000000 100.0000000 59.28850000 28.48010000 96.98520000 417 100.0000000 24.20990000 100.0000000 60.86840000 31.64020000 97.51190000 418 37.22360000 0.000000000 35.69940000 6.566480000 3.168800000 10.08650000 419 46.36570000 0.000000000 50.64270000 11.64910000 5.538560000 21.64440000 420 57.03430000 0.000000000 64.07960000 18.77760000 8.896980000 36.28130000 421 100.0000000 0.000000000 74.74930000 50.75570000 25.06680000 52.05020000 422 100.0000000 36.75840000 74.33500000 54.59820000 32.93740000 52.76080000 423 100.0000000 41.64100000 86.47080000 59.55680000 36.91970000 72.71190000 424 100.0000000 42.18430000 100.0000000 64.64630000 39.19660000 98.77130000 425 63.15820000 0.000000000 28.23930000 16.12970000 8.186080000 6.594990000 426 74.75620000 0.000000000 36.88390000 23.76130000 12.01720000 11.61930000 427 85.46240000 0.000000000 35.39810000 31.03080000 15.78490000 11.05120000 428 0.000000000 17.76410000 50.28520000 4.779700000 3.191680000 21.22580000 429 0.000000000 17.81970000 86.07750000 13.78560000 6.803070000 68.62520000 430 0.000000000 16.51100000 100.0000000 18.73090000 8.582350000 95.28160000 431 0.000000000 35.62870000 100.0000000 21.74550000 14.61200000 96.28660000 432 41.47440000 38.77230000 100.0000000 28.45350000 19.19150000 96.81710000 433 47.94840000 48.96450000 100.0000000 33.67560000 26.31570000 97.91700000 434 62.63830000 53.19290000 100.0000000 41.71230000 32.66470000 98.71900000 435 19.99000000 35.89980000 32.71870000 6.500080000 8.750990000 9.453920000 436 25.64450000 100.0000000 45.32760000 40.99300000 73.85320000 28.69900000 437 66.12700000 100.0000000 50.96560000 56.46310000 81.72080000 34.28600000 438 44.36640000 53.42320000 28.54190000 17.05640000 22.03280000 9.357920000 439 48.49150000 65.47570000 33.87810000 24.15380000 33.17620000 13.88350000 440 59.17360000 73.79380000 78.23160000 41.85410000 47.57180000 62.11740000 441 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 442 2.941180000 0.000000000 0.000000000 0.017670400 0.009109590 0.000827230 443 8.909850000 8.909850000 8.909850000 0.466089000 0.490383000 0.534056000 444 44.40240000 84.74530000 0.000000000 31.76340000 53.26340000 8.607160000 445 44.03720000 100.0000000 0.000000000 42.54910000 75.02130000 12.23850000 446 73.93760000 100.0000000 0.000000000 56.98530000 82.46350000 12.91430000 447 86.67970000 100.0000000 0.000000000 65.87140000 87.04460000 13.33030000 448 100.0000000 100.0000000 0.000000000 76.99580000 92.77950000 13.85110000 449 100.0000000 100.0000000 66.02370000 84.23940000 95.67720000 51.99760000 450 35.78880000 15.73370000 0.000000000 4.916600000 3.443800000 0.405651000 451 41.69810000 25.61310000 0.000000000 7.811900000 6.682220000 0.878167000 452 55.59570000 34.65640000 0.000000000 14.81680000 12.80100000 1.690110000 453 84.58290000 47.60900000 0.000000000 35.52610000 28.69350000 3.666440000 454 100.0000000 50.03240000 0.000000000 49.03590000 36.85570000 4.530040000 455 100.0000000 62.38890000 0.000000000 53.90800000 46.60060000 6.154260000 456 19.76820000 43.91870000 0.000000000 7.021040000 12.31090000 2.006290000 457 26.64670000 64.35390000 39.42340000 18.14420000 29.22160000 16.90000000 458 24.80520000 66.87960000 100.0000000 34.73410000 37.73770000 100.0660000 459 44.74760000 92.09100000 100.0000000 54.91630000 70.51410000 105.3290000 460 78.54690000 92.35400000 100.0000000 72.31640000 79.76290000 106.1970000 461 89.83530000 91.55390000 100.0000000 80.07780000 82.91950000 106.3980000 462 89.83820000 100.0000000 100.0000000 86.38750000 95.53640000 108.5000000 463 100.0000000 100.0000000 100.0000000 95.04580000 100.0000000 108.9060000 464 30.61980000 36.57930000 0.000000000 6.970120000 9.406820000 1.448420000 465 32.22310000 46.29290000 0.000000000 9.989990000 14.90840000 2.351210000 466 48.54030000 50.96630000 11.69310000 16.69550000 20.64520000 3.948760000 467 48.08970000 56.97300000 0.000000000 18.61860000 25.00270000 3.844950000 468 57.42180000 57.83970000 11.96540000 23.07030000 27.79820000 5.037330000 469 83.20730000 73.44680000 0.000000000 45.66340000 50.47010000 7.335580000 470 52.45290000 47.03090000 18.35860000 17.21690000 18.92930000 5.021450000 471 55.73800000 49.73010000 38.12780000 21.26300000 22.13460000 14.50220000 472 60.26610000 53.12200000 54.81130000 27.24680000 26.69770000 28.93280000 473 11.27770000 6.767730000 15.84690000 0.749378000 0.492244000 1.701600000 474 0.000000000 8.603320000 12.70520000 0.355521000 0.402004000 1.071380000 475 0.000000000 10.11480000 40.20410000 2.664990000 1.436910000 12.89110000 476 0.000000000 12.55950000 55.24120000 5.267010000 2.703920000 25.89670000 477 21.39250000 33.55170000 87.90110000 18.21900000 12.63000000 72.72660000 478 26.32970000 47.19720000 100.0000000 27.10010000 22.06840000 97.44370000 479 50.08370000 55.35810000 68.38280000 26.57820000 27.25830000 44.87740000 480 85.07940000 54.25090000 68.95970000 46.19270000 36.72490000 46.43600000 481 100.0000000 92.72810000 91.14350000 86.24540000 87.72640000 89.54530000 482 100.0000000 100.0000000 100.0000000 95.04580000 100.0000000 108.9060000 483 11.28200000 27.83220000 24.77960000 3.326090000 4.805010000 5.151920000 484 0.000000000 26.38200000 38.65840000 4.140730000 4.710250000 12.39150000 485 0.000000000 24.79990000 51.26250000 5.817880000 4.992810000 22.42090000 486 13.04630000 27.16830000 63.48920000 9.149820000 6.971790000 35.70050000 487 0.000000000 44.00680000 41.68240000 8.514450000 12.81490000 15.83310000 488 29.05200000 83.18820000 46.05850000 29.85610000 50.42700000 25.35870000 489 46.75420000 87.43330000 52.95160000 38.81980000 59.00840000 32.71630000 490 47.64710000 87.38550000 82.90270000 46.60870000 62.11100000 72.17410000 491 0.000000000 31.64850000 21.24880000 3.446540000 5.935760000 4.101780000 492 0.000000000 58.77640000 18.51730000 11.55430000 22.40260000 6.033710000 493 45.54840000 71.56150000 15.20880000 24.73240000 38.14960000 7.564200000 494 49.77640000 91.76190000 17.57810000 38.88360000 63.94070000 12.36050000 495 23.13920000 56.89240000 0.000000000 11.99320000 21.53930000 3.525550000 496 24.88550000 100.0000000 0.000000000 37.69310000 72.51780000 12.01120000 497 74.45340000 100.0000000 22.42230000 57.98600000 82.90160000 16.47760000 498 87.13760000 100.0000000 24.13940000 67.01480000 87.54250000 17.51980000 499 28.24970000 33.96910000 28.37460000 7.016560000 8.426690000 7.183570000 500 40.83400000 32.94620000 31.87820000 10.32420000 9.772500000 8.998580000 501 100.0000000 32.93960000 52.07860000 48.64700000 29.19920000 25.60570000 502 100.0000000 37.20870000 63.52700000 51.95890000 32.05350000 38.33160000 503 100.0000000 57.13860000 69.88230000 59.88830000 45.42910000 48.63360000 504 38.55020000 21.43610000 36.89510000 8.291930000 5.836890000 11.24850000 505 59.73370000 26.33850000 35.94760000 17.08280000 11.41010000 11.27390000 506 64.42260000 24.89420000 42.18150000 20.06360000 12.52490000 15.53480000 507 20.40940000 12.95690000 10.43770000 1.776510000 1.494530000 0.851985000 508 18.15310000 19.76930000 4.327400000 1.997210000 2.529660000 0.477815000 509 15.82200000 24.03100000 26.11490000 3.211410000 3.854370000 5.512790000 510 16.84860000 68.86050000 37.15060000 18.60700000 32.72530000 16.05640000 511 36.11830000 69.92240000 52.33110000 25.01620000 36.56360000 28.51330000 512 84.02830000 79.77710000 57.78090000 55.28350000 60.17520000 37.01970000 513 100.0000000 82.61000000 67.17900000 72.25480000 71.25550000 49.39170000 514 61.04100000 71.12810000 25.12030000 31.69460000 41.33450000 10.84220000 515 68.58690000 87.43940000 23.39920000 45.35280000 62.81200000 13.61280000 516 88.46170000 89.84230000 41.40930000 62.34150000 73.78330000 24.56680000 517 87.92100000 100.0000000 42.21950000 69.53750000 88.62160000 27.64420000 518 62.40780000 74.11230000 38.27490000 35.30750000 45.41860000 18.35300000 519 64.63950000 92.82480000 40.04880000 48.56500000 69.82570000 23.56470000 520 72.65580000 94.01150000 54.77130000 56.44640000 74.88960000 36.65570000 521 19.65700000 30.38680000 9.637400000 3.861770000 5.844960000 1.476080000 522 18.01450000 32.87220000 0.000000000 4.046900000 6.682290000 1.076570000 523 81.31420000 41.81490000 18.22190000 31.84820000 24.17140000 5.225230000 524 86.69920000 59.27730000 20.18930000 41.98520000 38.39070000 8.001700000 525 100.0000000 67.48680000 21.58350000 56.91640000 51.62650000 10.21320000 526 20.86420000 17.95120000 9.943050000 2.244810000 2.359220000 0.927664000 527 22.75300000 20.64220000 0.000000000 2.702270000 3.044970000 0.445348000 528 32.28610000 31.02060000 9.641560000 6.262250000 7.262050000 1.623650000 529 33.81240000 45.31770000 13.41980000 10.28880000 14.59090000 3.416180000 530 32.64550000 53.64630000 9.055120000 12.69810000 20.03080000 3.678000000 531 16.38040000 5.029340000 10.35840000 0.944802000 0.546849000 0.701951000 532 17.12060000 0.000000000 13.06010000 1.055670000 0.520523000 1.120610000 533 16.12000000 7.635410000 15.99720000 1.190450000 0.762066000 1.764980000 534 14.83030000 12.22600000 17.37040000 1.356050000 1.176750000 2.169970000 535 20.51510000 0.000000000 55.24110000 6.159820000 2.610300000 25.83150000 536 74.18930000 22.33360000 77.55190000 33.03000000 17.80030000 55.78780000 537 85.03970000 22.49630000 90.64660000 44.76360000 23.39290000 78.39140000 538 36.66110000 0.000000000 25.40800000 5.425220000 2.694420000 4.883080000 539 83.11890000 0.000000000 23.41580000 28.20140000 14.45310000 5.188420000 540 91.53260000 45.31090000 27.02380000 41.23270000 30.44820000 9.028370000 541 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 542 0.000000000 53.78440000 36.34230000 11.09020000 19.06390000 13.30940000 543 38.99700000 65.36770000 40.87710000 21.76040000 31.76790000 18.21350000 544 52.79210000 66.72470000 56.35360000 29.92000000 36.63860000 32.29750000 545 52.71670000 57.01310000 51.25340000 24.63050000 27.64650000 25.79370000 546 60.92910000 59.45420000 51.23240000 29.41270000 31.60250000 26.28570000 547 67.88940000 63.26750000 59.15770000 36.35020000 37.47930000 35.14170000 548 76.06570000 70.33510000 61.42700000 45.26720000 47.10640000 39.10400000 549 36.00080000 22.01870000 17.04370000 6.011450000 4.960370000 2.572590000 550 43.59980000 36.13760000 17.68790000 10.85680000 11.21110000 3.688030000 551 45.43090000 43.84860000 33.04630000 14.68820000 16.05050000 10.61100000 552 46.88420000 78.69230000 33.58550000 30.54370000 46.89790000 16.02990000 553 17.18100000 93.68350000 15.55630000 32.13600000 62.52190000 11.95500000 554 17.97250000 92.65330000 55.58420000 36.14050000 62.94330000 36.24890000 555 21.30290000 92.87220000 100.0000000 49.81580000 68.71500000 105.2500000 556 24.17560000 49.33120000 53.00780000 13.84480000 17.84360000 26.14120000 557 69.11040000 57.15880000 54.24930000 33.45210000 32.21730000 29.10610000 558 72.34530000 56.41780000 59.02930000 36.05290000 33.00840000 34.15220000 559 35.10160000 49.96010000 34.99290000 13.69030000 18.39010000 12.22680000 560 42.17870000 49.53100000 33.34740000 15.41680000 19.08410000 11.32510000 561 53.43340000 59.86010000 42.54300000 24.71510000 29.59650000 18.85340000 562 74.57350000 63.26860000 55.49540000 39.64090000 39.26270000 31.40230000 563 86.98430000 70.00270000 56.86280000 51.88340000 50.37500000 34.32700000 564 94.08190000 73.57610000 72.48340000 63.16430000 58.56940000 54.59760000 565 21.01220000 12.04690000 17.42020000 2.061480000 1.523470000 2.212440000 566 67.23400000 0.000000000 13.82860000 17.45670000 8.972560000 2.031960000 567 100.0000000 0.000000000 14.56500000 41.49930000 21.36400000 3.304320000 568 100.0000000 45.15130000 18.09440000 47.88060000 33.87210000 6.218590000 569 100.0000000 89.28010000 19.59460000 69.60460000 77.19470000 13.85780000 570 100.0000000 100.0000000 38.09140000 79.15660000 93.64390000 25.23050000 571 16.27190000 17.98520000 22.17040000 2.239440000 2.298630000 3.770440000 572 14.01670000 45.18920000 62.41860000 13.18320000 15.31070000 35.81880000 573 18.99200000 51.11520000 73.09580000 18.30220000 20.52320000 50.48850000 574 19.29350000 57.83830000 92.59640000 27.07260000 28.11990000 83.88880000 575 47.13690000 59.24230000 91.46800000 34.02980000 32.61580000 82.26460000 576 46.88860000 75.85580000 100.0000000 45.31970000 50.18880000 101.9110000 577 13.27060000 40.50610000 24.58790000 6.211070000 10.38160000 6.001820000 578 11.90310000 47.30160000 23.21880000 8.001850000 14.27320000 6.146540000 579 0.000000000 71.81600000 21.39940000 17.87280000 34.77550000 8.957360000 580 9.889460000 25.83390000 9.706380000 2.183620000 3.818930000 1.182160000 581 66.03030000 25.08600000 9.544040000 18.36440000 11.99180000 1.886680000 582 68.38000000 33.12260000 0.000000000 21.02410000 15.51190000 1.886280000 583 81.43930000 38.47530000 43.58590000 33.53690000 23.45050000 17.99240000 584 91.13970000 43.87750000 61.26930000 45.61520000 31.47960000 35.88670000 585 33.51640000 46.49130000 23.12900000 11.08230000 15.48040000 6.184890000 586 41.62470000 65.55930000 22.50950000 20.80860000 31.62480000 8.569430000 587 39.09880000 29.02660000 9.436070000 7.683660000 7.445380000 1.558600000 588 47.65710000 35.45630000 10.02090000 11.85140000 11.52470000 2.200800000 589 72.18710000 56.16390000 12.81340000 30.38980000 30.57140000 5.331130000 590 80.37700000 58.44370000 65.95180000 43.70790000 37.99040000 42.90780000 591 88.99580000 66.08200000 77.95220000 56.72700000 49.38430000 61.25130000 592 91.78460000 73.08740000 89.61560000 66.27960000 59.17130000 82.26950000 593 24.47440000 46.03020000 28.64020000 9.511440000 14.40700000 8.329140000 594 22.24320000 69.76370000 29.14370000 18.90990000 33.65850000 11.78620000 595 74.92220000 89.93040000 46.43160000 53.50810000 69.23410000 28.05050000 596 82.95900000 88.94490000 59.03810000 60.64430000 71.63820000 40.32250000 597 100.0000000 91.52230000 81.48580000 82.17210000 84.72180000 72.33400000 598 45.03450000 20.66470000 52.65840000 12.65480000 7.670970000 23.90220000 599 53.72920000 24.35500000 81.69030000 23.68950000 13.25290000 61.95400000 600 27.83380000 8.828420000 31.77830000 4.098730000 2.200590000 7.812470000 601 40.60120000 8.930590000 44.13610000 8.844300000 4.476090000 16.05720000 602 57.20970000 7.029410000 56.08440000 17.23990000 8.457820000 27.24550000 603 67.41690000 10.07980000 66.29390000 24.86620000 12.31650000 39.37840000 604 83.71920000 0.000000000 70.83600000 36.35410000 17.76490000 45.83560000 605 78.52330000 20.52290000 61.06100000 31.43010000 17.12950000 33.62400000 606 100.0000000 21.23380000 62.69100000 48.88630000 26.21350000 36.36480000 607 85.00120000 20.52480000 42.07850000 32.63490000 18.14490000 15.88120000 608 91.13290000 64.17060000 53.73370000 51.70560000 46.13490000 30.31840000 609 100.0000000 73.08180000 61.08780000 65.28550000 59.58720000 40.06610000 610 26.15040000 14.93200000 9.012800000 2.795420000 2.241010000 0.761094000 611 28.26600000 12.03120000 0.000000000 2.901060000 1.999520000 0.233081000 612 43.58280000 13.49900000 0.000000000 7.075830000 4.296910000 0.456543000 613 43.09630000 43.43380000 81.19570000 23.60600000 19.33270000 62.32750000 614 60.56650000 83.41310000 83.83020000 49.93220000 59.95210000 73.13390000 615 60.93400000 83.22900000 90.50130000 52.24530000 60.71250000 84.93190000 616 73.41490000 90.51630000 92.78380000 64.92900000 74.34410000 91.17210000 617 72.72810000 100.0000000 92.15440000 71.31040000 88.10660000 92.30020000 618 24.05490000 40.86220000 44.31740000 9.806520000 12.12370000 17.62450000 619 34.20180000 39.96800000 61.33950000 14.81510000 13.99010000 34.21510000 620 50.52100000 45.41190000 60.22910000 21.40660000 19.70660000 33.69940000 621 54.01600000 47.19750000 77.55110000 27.82110000 23.33320000 57.12900000 622 20.08960000 19.16670000 27.73920000 3.229870000 2.944120000 6.036910000 623 17.10040000 79.29850000 27.88650000 23.40630000 43.81530000 12.92870000 624 47.49680000 79.54390000 56.12300000 34.70430000 49.39740000 34.26750000 625 49.89310000 81.19930000 65.98360000 38.78950000 52.74040000 46.05410000 626 72.75430000 42.32810000 32.11090000 27.37040000 21.95290000 10.57490000 627 82.87780000 46.15940000 30.98950000 35.18930000 27.67900000 10.68310000 628 65.25250000 35.72640000 21.69030000 20.47140000 16.00090000 5.292600000 629 72.08460000 41.91780000 20.33430000 25.90260000 21.13510000 5.562930000 630 82.65980000 65.20770000 30.75010000 42.43990000 42.45230000 13.03090000 631 85.57390000 80.61410000 49.40870000 55.36550000 61.14920000 28.95590000 632 9.743040000 18.03620000 16.55700000 1.418900000 1.919200000 2.108330000 633 0.000000000 23.28540000 20.45090000 2.000530000 3.120840000 3.381330000 634 0.000000000 57.74660000 55.13530000 15.56170000 23.32770000 29.22700000 635 0.000000000 57.39860000 71.30380000 19.12620000 24.52770000 48.69510000 636 0.000000000 72.90340000 85.56570000 30.65620000 40.81750000 73.41520000 637 0.000000000 82.17610000 86.25440000 36.25960000 51.66040000 76.40720000 638 43.25030000 90.55320000 92.11920000 50.34300000 66.89050000 89.24350000 639 64.01310000 92.11460000 100.0000000 63.35930000 74.89160000 105.7290000 640 37.18560000 29.46270000 52.97830000 11.57940000 9.066310000 24.53770000 641 53.80240000 31.14780000 77.38360000 23.57090000 15.04760000 55.49690000 642 57.91760000 38.96520000 100.0000000 34.95670000 22.61660000 97.13550000 643 17.27420000 0.000000000 39.70910000 3.235130000 1.394310000 12.51000000 644 22.49960000 9.290780000 40.04310000 4.155040000 2.148900000 12.83790000 645 26.37300000 50.72010000 39.38780000 12.56040000 18.13560000 15.03020000 646 28.82490000 54.96190000 52.78630000 16.69010000 22.32640000 26.64180000 647 39.54670000 56.26410000 55.18790000 20.33880000 24.90710000 29.33380000 648 43.21670000 57.96170000 73.49440000 26.46210000 28.58120000 52.18530000 649 0.000000000 12.92710000 12.89570000 0.597116000 0.874942000 1.183630000 650 56.85900000 33.03400000 9.660840000 15.14900000 12.44340000 2.157920000 651 69.44780000 42.66730000 0.000000000 23.98960000 20.52330000 2.697330000 652 79.21360000 54.23070000 0.000000000 34.01170000 31.35460000 4.259880000 653 86.49030000 64.75280000 0.000000000 43.71890000 42.95090000 5.986690000 654 92.79830000 65.60920000 11.23070000 49.28740000 46.40300000 7.131530000 655 29.17280000 18.80550000 0.000000000 3.652300000 3.228650000 0.430743000 656 28.51560000 37.41760000 51.03910000 10.83990000 11.22380000 23.15090000 657 36.41860000 49.54730000 58.91270000 17.74260000 19.82650000 32.44390000 658 65.21250000 52.54370000 65.49630000 31.90670000 28.51950000 41.12850000 659 73.16400000 64.87650000 65.76840000 41.73200000 41.18280000 43.39670000 660 59.45370000 27.83610000 22.47730000 15.96720000 11.34160000 4.898290000 661 75.84910000 71.31640000 19.93170000 39.97560000 45.78980000 9.457690000 662 83.17420000 71.03910000 26.41190000 45.32310000 48.27970000 11.99310000 663 34.87770000 0.000000000 55.46690000 9.004920000 4.071940000 26.19480000 664 34.53240000 9.466650000 64.63450000 11.09190000 5.217230000 36.65660000 665 50.89930000 12.50310000 82.43510000 21.51130000 10.27490000 62.71680000 666 69.01010000 16.04420000 100.0000000 36.92980000 17.90260000 96.12170000 667 0.000000000 9.480420000 28.66380000 1.357200000 0.864532000 6.155810000 668 9.978890000 18.24330000 31.29340000 2.509790000 2.390770000 7.680040000 669 10.13370000 18.70570000 45.06590000 4.291940000 3.181490000 16.78180000 670 27.04720000 16.36700000 65.57660000 10.12910000 5.389160000 37.91210000 671 45.82180000 36.82510000 79.19860000 22.19350000 16.09280000 58.58740000 672 58.23390000 50.20080000 90.00280000 34.72970000 27.91250000 78.60670000 673 0.000000000 84.93780000 21.55530000 25.58920000 50.19360000 11.57800000 674 0.000000000 100.0000000 21.82760000 36.39240000 71.77390000 15.26480000 675 25.66410000 100.0000000 27.61850000 38.89430000 73.01400000 17.62870000 676 80.52120000 31.17720000 31.83290000 29.81980000 19.29570000 9.785600000 677 91.70420000 31.54770000 37.10210000 38.95430000 24.04510000 13.27810000 678 90.23710000 34.52550000 63.04480000 42.89190000 26.47590000 37.15320000 679 91.56160000 46.34520000 78.42920000 51.13790000 34.92380000 59.49360000 680 91.24330000 100.0000000 82.22860000 81.20660000 93.59460000 75.31320000 681 31.82140000 38.19640000 36.47830000 9.595450000 11.11360000 11.93780000 682 30.55530000 38.20240000 41.25570000 9.923680000 11.21440000 15.14100000 683 30.25970000 89.50930000 67.57440000 38.62180000 60.63340000 49.62600000 684 48.70020000 89.08840000 75.88430000 46.04630000 63.77610000 61.45090000 685 67.93730000 92.74280000 78.81670000 58.61360000 73.96210000 67.23910000 686 25.48940000 42.06780000 32.45230000 8.885100000 12.31120000 9.870990000 687 37.70120000 57.75460000 32.00750000 16.99160000 24.46230000 11.55120000 688 54.84670000 60.02530000 34.01680000 24.32900000 29.62550000 13.26790000 689 58.19120000 82.06230000 42.48220000 38.43300000 53.86470000 22.76950000 690 23.85990000 31.32110000 19.31260000 5.033360000 6.671320000 3.565510000 691 28.86210000 37.43070000 19.10200000 7.274590000 9.810820000 3.992810000 692 27.75920000 53.29410000 17.48600000 11.81090000 19.34490000 5.155470000 693 25.62090000 58.69930000 26.11720000 14.08600000 23.60240000 8.752490000 694 83.31550000 70.96980000 65.40290000 51.51870000 50.71220000 44.26190000 695 84.98240000 81.82770000 75.02310000 61.43110000 64.71440000 59.54310000 696 21.85560000 19.64770000 16.07330000 2.777130000 2.876160000 2.107040000 697 19.78060000 23.52310000 36.12960000 4.575010000 4.338060000 10.67930000 698 19.55040000 28.37630000 46.99610000 6.808710000 6.439830000 18.86210000 699 21.27100000 53.84450000 46.30250000 13.85420000 20.36390000 20.60010000 700 32.63660000 75.84370000 49.32390000 26.79500000 42.27290000 26.74210000 701 9.296120000 17.96540000 10.41760000 1.166640000 1.804110000 0.941093000 702 11.62640000 19.93890000 6.612350000 1.440020000 2.267690000 0.602626000 703 36.32110000 81.79470000 15.14410000 27.71460000 48.37750000 9.367210000 704 43.83890000 100.0000000 24.00490000 43.26480000 75.29980000 16.35750000 705 20.14560000 42.31670000 10.09510000 6.727700000 11.46420000 2.468930000 706 27.20660000 84.78290000 0.000000000 27.22650000 50.96050000 8.401720000 707 58.23280000 84.99840000 53.24140000 42.07940000 58.30310000 32.69060000 708 79.22280000 85.91870000 72.24270000 59.14830000 67.49390000 56.19210000 709 43.77480000 27.74120000 35.68380000 10.70640000 8.467620000 10.88170000 710 69.12360000 39.13290000 39.93590000 25.24650000 19.48200000 14.99780000 711 78.84320000 48.09370000 45.08620000 34.72830000 28.15450000 20.01460000 712 41.04650000 25.09110000 26.08910000 8.467680000 6.794180000 5.792550000 713 43.67160000 29.00900000 24.65860000 9.850370000 8.473420000 5.469120000 714 57.24700000 38.03990000 50.98100000 20.46340000 16.41200000 23.59130000 715 63.21830000 37.94490000 60.00190000 25.15640000 18.59240000 33.02990000 716 25.02050000 9.456150000 51.08270000 6.278920000 3.057800000 21.85560000 717 71.57470000 0.000000000 73.98450000 29.06900000 13.91120000 49.92410000 718 74.65340000 11.40000000 81.66340000 33.54540000 16.40590000 61.99940000 719 86.75910000 15.62960000 100.0000000 48.82830000 23.98360000 96.66840000 720 54.72160000 14.51550000 68.32050000 19.27340000 9.795480000 41.80950000 721 100.0000000 21.96480000 74.55020000 51.97560000 27.59570000 52.18220000 722 100.0000000 23.25010000 86.64850000 55.85430000 29.41920000 71.77040000 723 100.0000000 54.99710000 87.10590000 64.16330000 45.79290000 75.29700000 724 13.66940000 22.76260000 0.000000000 1.897950000 3.026630000 0.484189000 725 19.02520000 24.63370000 10.20580000 2.833170000 3.883610000 1.225760000 726 15.39720000 24.68270000 14.63440000 2.585610000 3.749990000 1.969310000 727 56.87270000 24.90190000 10.58300000 13.73030000 9.558990000 1.798990000 728 76.07810000 35.66230000 91.63420000 41.20100000 25.01770000 80.73120000 729 22.20000000 13.94390000 100.0000000 20.02540000 8.935940000 95.28170000 730 84.66790000 31.30690000 100.0000000 49.42910000 27.52570000 97.32050000 731 37.17870000 14.04210000 28.35970000 6.286690000 3.818470000 6.325710000 732 44.66840000 21.22830000 34.86670000 9.969910000 6.691110000 10.09030000 733 58.18100000 24.62320000 46.93670000 17.59160000 11.10850000 19.14520000 734 87.83390000 36.03170000 51.04250000 38.90400000 25.20500000 24.37390000 735 52.78360000 21.37710000 35.49880000 13.16840000 8.358920000 10.61950000 736 71.03220000 20.81890000 47.61840000 24.10080000 13.70000000 19.88000000 737 80.81230000 22.41070000 55.20620000 32.03250000 17.92840000 27.38920000 738 52.50290000 15.07810000 39.55670000 12.90380000 7.209020000 13.01830000 739 89.57760000 10.90290000 45.79520000 35.88600000 18.53190000 18.66910000 740 100.0000000 22.78460000 30.10810000 43.90920000 24.54030000 9.175450000 741 100.0000000 38.96610000 28.14980000 46.84940000 30.70440000 9.281960000 742 100.0000000 76.22370000 39.79890000 63.29940000 61.57720000 21.02330000 743 100.0000000 90.10400000 47.69480000 73.21540000 79.54900000 30.06750000 744 28.89730000 61.73290000 48.87420000 18.80600000 27.64050000 23.94010000 745 34.94950000 72.69240000 60.65610000 27.82840000 39.97680000 37.75940000 746 67.47540000 75.35750000 75.46870000 46.27290000 51.22640000 58.39760000 747 77.72330000 83.28260000 76.74160000 57.68970000 64.07870000 62.18570000 748 58.11440000 65.73460000 80.46930000 37.90470000 39.34750000 64.26630000 749 68.98370000 83.47910000 80.96760000 53.60880000 62.01360000 68.61580000 750 78.24500000 90.83850000 80.48270000 64.18610000 74.77060000 69.74020000 751 39.56340000 46.68410000 46.03820000 15.33980000 17.47000000 19.74560000 752 39.04990000 70.56480000 75.26030000 31.48540000 39.77570000 56.65770000 753 45.53060000 75.69990000 85.26470000 39.40610000 47.62620000 73.74990000 754 88.27200000 80.96840000 100.0000000 71.87070000 68.33580000 104.0150000 755 30.26620000 24.27010000 61.16330000 10.68820000 7.161330000 32.91080000 756 35.56730000 32.07120000 71.66490000 15.85300000 11.52400000 46.86000000 757 20.76450000 10.52910000 30.83470000 2.910730000 1.719600000 7.294480000 758 17.50940000 14.13270000 31.85210000 2.835180000 2.011240000 7.881380000 759 14.56360000 7.749620000 33.65860000 2.371000000 1.223730000 8.739630000 760 11.98030000 21.39490000 55.96370000 6.627490000 4.622250000 26.93900000 761 10.11670000 44.89670000 90.67240000 20.96530000 18.25000000 78.70040000 762 21.24040000 55.85960000 100.0000000 29.35160000 27.79680000 98.43070000 763 0.000000000 28.64560000 82.97680000 14.26140000 9.364850000 63.82070000 764 0.000000000 26.73490000 100.0000000 20.01510000 11.15100000 95.70970000 765 26.01060000 75.66050000 100.0000000 39.54640000 47.04910000 101.6100000 766 61.90840000 10.83850000 14.10080000 14.87800000 8.042550000 2.041760000 767 67.73010000 12.90590000 9.728820000 18.00820000 9.859400000 1.517110000 768 78.12990000 27.79300000 16.50770000 26.44910000 16.77300000 3.644650000 769 89.98800000 51.64230000 21.89920000 41.69930000 33.83460000 7.686240000 770 89.15680000 77.82800000 77.90800000 63.06720000 61.89790000 63.26450000 771 88.69880000 78.68160000 90.87150000 67.40600000 64.39230000 85.52860000 772 36.59070000 27.46250000 35.52590000 8.457470000 7.240860000 10.66820000 773 35.77920000 25.55150000 42.54340000 8.836040000 6.877900000 15.30530000 774 63.92000000 66.76370000 59.89700000 35.96490000 39.69820000 36.41610000 775 75.38760000 77.54730000 59.69330000 48.39860000 54.62740000 38.41380000 776 43.72380000 44.76850000 39.69050000 15.15760000 16.60650000 14.80520000 777 79.41020000 44.54380000 50.71490000 34.93180000 26.50570000 24.53110000 778 87.81460000 51.55460000 62.11090000 45.64970000 35.16720000 37.57790000 779 46.67210000 31.37420000 43.81030000 13.45080000 10.74280000 16.77100000 780 49.12410000 34.57860000 54.79480000 16.90510000 13.29690000 26.87440000 781 68.91670000 46.60100000 69.29490000 32.91220000 25.93830000 45.50160000 782 73.75250000 47.33510000 100.0000000 46.06400000 31.91050000 98.34410000 783 20.41850000 25.08640000 68.22640000 10.74700000 7.177500000 41.62950000 784 21.26710000 54.41540000 68.34850000 18.56580000 22.59270000 44.35390000 785 21.13110000 61.43960000 81.11670000 24.99220000 29.75420000 64.13800000 786 15.39690000 72.79180000 56.53490000 23.60800000 37.97980000 33.07890000 787 30.27220000 100.0000000 58.67940000 44.32470000 75.29110000 41.49220000 788 28.89860000 100.0000000 81.94840000 50.09690000 77.56670000 73.39860000 789 51.18170000 100.0000000 90.58800000 59.73390000 82.20300000 88.84570000 790 18.35740000 43.01520000 76.09580000 16.48250000 15.65690000 54.03750000 791 25.00140000 41.99780000 84.05210000 19.57960000 16.54830000 66.72960000 792 31.41090000 59.00470000 82.87530000 26.37970000 28.85850000 66.77610000 793 29.69900000 73.19840000 86.87520000 34.10650000 42.78230000 75.89360000 794 39.54270000 82.41800000 92.00410000 43.75840000 55.52020000 87.17880000 795 26.35040000 19.46190000 14.34850000 3.425200000 3.187890000 1.757890000 796 30.81660000 24.76470000 8.940710000 4.847440000 4.954090000 1.168310000 797 51.91350000 27.95140000 17.40620000 12.30620000 9.517000000 3.211950000 798 59.66690000 39.56370000 20.68790000 18.46360000 16.36120000 5.143540000 799 67.99170000 59.36080000 20.76020000 29.57890000 32.04300000 7.607500000 800 68.37510000 59.87240000 38.66270000 31.67890000 33.25460000 16.45290000 801 81.27620000 69.01730000 41.95030000 44.63060000 46.18600000 20.56730000 802 100.0000000 71.98380000 77.93080000 69.02310000 60.14230000 62.64690000 803 26.26190000 16.58880000 22.36370000 3.536910000 2.767380000 3.858950000 804 35.04700000 17.66140000 59.01810000 10.56020000 5.962560000 30.26280000 805 58.70750000 48.69180000 68.48470000 27.97840000 24.42190000 44.39070000 806 65.89950000 50.08080000 76.87950000 34.41900000 28.17560000 56.69110000 807 65.21410000 53.50210000 86.43140000 38.24070000 31.61690000 72.74280000 808 27.06650000 27.15410000 22.24110000 5.023910000 5.532500000 4.272110000 809 37.88950000 35.31200000 21.20110000 9.098800000 10.00160000 4.573290000 810 36.49980000 38.63670000 11.15750000 9.056290000 11.20900000 2.447270000 811 42.34130000 42.95490000 0.000000000 11.80530000 14.36340000 2.150350000 812 55.47560000 52.50190000 0.000000000 19.95460000 23.15740000 3.418350000 813 76.55450000 57.38450000 37.53620000 35.54910000 33.73500000 15.60490000 814 87.12530000 56.87610000 100.0000000 58.84270000 43.59710000 99.92650000 815 23.41250000 18.87030000 92.10730000 17.67050000 8.725660000 79.71570000 816 23.75670000 26.55110000 100.0000000 21.73340000 11.99290000 95.78170000 817 23.51790000 36.81240000 100.0000000 23.73040000 16.04420000 96.45850000 818 0.000000000 15.03870000 71.23710000 9.115890000 4.533800000 45.27090000 819 13.13390000 11.44050000 84.40330000 13.21020000 5.825460000 65.59030000 820 23.40030000 0.000000000 86.73630000 14.89060000 6.151900000 69.59180000 821 30.52560000 82.59170000 85.60940000 39.33880000 53.65700000 75.51140000 822 27.57600000 14.73950000 15.45400000 3.253740000 2.430650000 1.855350000 823 46.63490000 10.61360000 10.91830000 8.100220000 4.542420000 1.175460000 824 49.99330000 27.20380000 23.22510000 11.74690000 9.002930000 4.934250000 825 74.24540000 25.05120000 22.42600000 23.80000000 14.72030000 5.119910000 826 81.09320000 42.16010000 36.91330000 33.37760000 24.91850000 13.62130000 827 58.68070000 46.17380000 39.47560000 21.64250000 20.59050000 15.08540000 828 61.35030000 76.09540000 54.40210000 38.42250000 48.37260000 32.11550000 829 66.12540000 76.02670000 62.27190000 42.54430000 50.25070000 40.84250000 830 0.000000000 85.08570000 49.59580000 28.92800000 51.68230000 28.68910000 831 10.53400000 92.01340000 63.15140000 36.63690000 62.33460000 44.53190000 832 40.94710000 28.17990000 18.25800000 8.422650000 7.568070000 3.264580000 833 100.0000000 32.40630000 14.33690000 44.49050000 27.36100000 4.257590000 834 100.0000000 51.60970000 50.96990000 53.68690000 39.59770000 26.30560000 835 100.0000000 62.56750000 53.94140000 58.63220000 48.61830000 30.63830000 836 18.94880000 35.11170000 20.20700000 5.177600000 7.920170000 4.065200000 837 17.37540000 58.69230000 42.45010000 14.69780000 23.70560000 18.17490000 838 16.64260000 62.44560000 53.30420000 18.01840000 27.61340000 28.09620000 839 13.81360000 70.22980000 79.91810000 27.99270000 37.56080000 63.56350000 840 15.82700000 93.62380000 80.69380000 42.91110000 66.74640000 69.65150000 841 12.93780000 97.81400000 94.22920000 50.35820000 74.69900000 94.78330000 842 26.59190000 25.60550000 31.36630000 5.436470000 5.293070000 8.123740000 843 24.85190000 29.32420000 38.23370000 6.516790000 6.683090000 12.36630000 844 27.98710000 31.00830000 45.17150000 8.372880000 7.995640000 17.58060000 845 48.27530000 65.43690000 62.63120000 28.83380000 35.00940000 39.04820000 846 54.54980000 73.88490000 65.79580000 36.44200000 45.24040000 44.49320000 847 16.33650000 21.91510000 18.81660000 2.494450000 3.117250000 2.871850000 848 15.58310000 19.37090000 37.26160000 3.717650000 3.115150000 11.19630000 849 19.94810000 17.08950000 41.13640000 4.483740000 3.106310000 13.77690000 850 36.86440000 16.85320000 40.81180000 7.820990000 4.798990000 13.69610000 851 38.07260000 33.91280000 39.75760000 10.62100000 10.12330000 13.83900000 852 39.76770000 44.39690000 49.58560000 15.28180000 16.33330000 22.57610000 853 38.83820000 49.18550000 67.54300000 20.27760000 20.72380000 42.84850000 854 45.25340000 62.91740000 67.94430000 27.83310000 32.61930000 45.26980000 855 51.62810000 62.67820000 71.13850000 30.97000000 33.98190000 49.66690000 856 80.24220000 68.30650000 74.16220000 50.23060000 47.77250000 55.60280000 857 81.66510000 75.57260000 79.86050000 56.73590000 56.65080000 65.64220000 858 10.00700000 7.606290000 25.23400000 1.258500000 0.731725000 4.654040000 859 13.45270000 0.000000000 27.03560000 1.517120000 0.664693000 5.377400000 860 38.75420000 7.677200000 75.97110000 15.11680000 6.841610000 52.22110000 861 69.57370000 0.000000000 87.00920000 31.86100000 14.89010000 70.86370000 862 89.15070000 60.64520000 93.90100000 59.65530000 46.61130000 88.23750000 863 32.01160000 17.66440000 27.97890000 5.254160000 3.754740000 6.194410000 864 35.44040000 23.09410000 28.69610000 6.795860000 5.483940000 6.775880000 865 34.16380000 27.73180000 30.08020000 7.301540000 6.777710000 7.662140000 866 49.99820000 40.54560000 39.09890000 16.17850000 15.36670000 14.10930000 867 49.09800000 45.13000000 51.54460000 19.04520000 18.56020000 24.60690000 868 58.48090000 61.38060000 68.54810000 32.76440000 34.12970000 46.09620000 869 67.19920000 61.10670000 83.30390000 41.38650000 37.91070000 68.44670000 870 81.04840000 65.72380000 88.63440000 54.02860000 47.34610000 78.85430000 871 100.0000000 68.98770000 90.14730000 71.41160000 58.61930000 82.86600000 872 100.0000000 78.60200000 89.70540000 76.50960000 69.06300000 83.80370000 873 70.05840000 82.47060000 0.000000000 42.25930000 56.53180000 8.684970000 874 80.26920000 86.90470000 14.84610000 51.96510000 65.74540000 11.37800000 875 91.27030000 93.37560000 9.299470000 64.58450000 78.94190000 12.34390000 876 37.87690000 59.84480000 0.000000000 16.43690000 25.63750000 4.082420000 877 38.07400000 70.59150000 0.000000000 21.55600000 35.79320000 5.772930000 878 59.62050000 86.24950000 0.000000000 39.05090000 58.47560000 9.229210000 879 59.82670000 100.0000000 0.000000000 49.08170000 78.38900000 12.54430000 880 60.28770000 100.0000000 22.26230000 49.97170000 78.77120000 16.04750000 881 71.40600000 20.87850000 27.88440000 21.89130000 12.85370000 7.031440000 882 91.39610000 27.18320000 73.93690000 45.16520000 25.23690000 51.19300000 883 92.52880000 33.11210000 82.74820000 49.81210000 28.97500000 65.35290000 884 78.69870000 29.57060000 69.77860000 34.98420000 20.73210000 45.03850000 885 81.84240000 41.34510000 80.89320000 42.99040000 28.46550000 62.57960000 886 86.11180000 63.11320000 82.55100000 54.51660000 46.03040000 68.07050000 887 71.24740000 100.0000000 63.99440000 62.08660000 84.31230000 48.45190000 888 76.71650000 100.0000000 100.0000000 76.82960000 90.60900000 108.0530000 889 100.0000000 100.0000000 100.0000000 95.04580000 100.0000000 108.9060000 890 51.32810000 19.33590000 17.55760000 10.87000000 6.989010000 2.838600000 891 81.60820000 16.98080000 20.05280000 27.62580000 15.25630000 4.251420000 892 86.66620000 21.06800000 29.86020000 32.53250000 18.35310000 8.459000000 893 53.69280000 0.000000000 20.64050000 11.06490000 5.639430000 3.448980000 894 55.57810000 14.96940000 23.91940000 12.65710000 7.250220000 4.803310000 895 56.25500000 22.58510000 53.03060000 17.46690000 10.50120000 24.55530000 896 62.03470000 27.00290000 75.38200000 26.13390000 15.33510000 52.40250000 897 68.26460000 72.44200000 82.96980000 47.37950000 49.16840000 69.74690000 898 71.59770000 81.96390000 94.84990000 58.93590000 62.80530000 93.24300000 899 11.90110000 82.51170000 72.68880000 32.76160000 50.63980000 54.96010000 900 0.000000000 86.28700000 80.73100000 37.12500000 56.21740000 67.98400000 901 0.000000000 87.51640000 71.12470000 35.20080000 56.75490000 53.82050000 902 75.55560000 92.06090000 73.45120000 61.23030000 74.76440000 59.20530000 903 32.67890000 0.000000000 13.41390000 3.741930000 1.903940000 1.311230000 904 31.42690000 8.489940000 9.491790000 3.493550000 2.023380000 0.739693000 905 48.64320000 9.936640000 43.67820000 11.59530000 5.971370000 15.84580000 906 61.68080000 11.11170000 42.85250000 17.33410000 9.035960000 15.50590000 907 65.46480000 0.000000000 57.05460000 21.49710000 10.47550000 28.43000000 908 93.02220000 10.48130000 59.87840000 41.26740000 20.97180000 32.50120000 909 93.75350000 13.28680000 76.87590000 46.32990000 23.34210000 55.12510000 910 13.40800000 8.545560000 12.24210000 0.834796000 0.647289000 1.014090000 911 8.880180000 19.05410000 23.58510000 1.886750000 2.270920000 4.285680000 912 0.000000000 17.69510000 26.94970000 1.802500000 1.989820000 5.580970000 913 24.81140000 22.84260000 83.95160000 15.59910000 8.686830000 65.25230000 914 30.71680000 51.12150000 84.42010000 23.68820000 22.91310000 68.36510000 915 40.28500000 54.58560000 79.73410000 25.99660000 26.15530000 61.17500000 916 46.74080000 67.25990000 84.28570000 35.08350000 38.84610000 70.61190000 917 37.22150000 9.549400000 18.09400000 5.316890000 2.995660000 2.501500000 918 44.34980000 0.000000000 22.65540000 7.587470000 3.831960000 3.952500000 919 44.64790000 9.365870000 29.58430000 8.435780000 4.496260000 6.920110000 920 58.27010000 0.000000000 33.39280000 14.19150000 7.129270000 9.107490000 921 81.20510000 17.10800000 33.76850000 28.48310000 15.58540000 10.19780000 922 81.98150000 52.77930000 32.05990000 36.88970000 31.86710000 11.95980000 923 89.86630000 66.30120000 46.67430000 50.46370000 47.12660000 24.14560000 924 71.80480000 49.42420000 38.28340000 29.68000000 26.31760000 14.96830000 925 72.80000000 57.19000000 46.04260000 34.25800000 32.81600000 21.71450000 926 89.73020000 57.15720000 52.98120000 47.40830000 39.43880000 28.51510000 927 35.62410000 74.25880000 22.28930000 23.50850000 39.63090000 9.896320000 928 44.97320000 92.39710000 32.95750000 38.73460000 64.39960000 18.62740000 929 0.000000000 31.02000000 32.82600000 4.282930000 6.073690000 9.112540000 930 0.000000000 29.98560000 49.46620000 6.367980000 6.594360000 21.05890000 931 14.46500000 32.30160000 56.04380000 8.617480000 8.281460000 27.62350000 932 12.02760000 38.52470000 62.79710000 11.26760000 11.57460000 35.64770000 933 0.000000000 55.52880000 86.75520000 23.01240000 24.89690000 72.81510000 934 61.19670000 73.93140000 86.88590000 45.65760000 49.32900000 76.56730000 935 33.77550000 32.76560000 24.56810000 7.687030000 8.431040000 5.539860000 936 86.36770000 36.53450000 26.05850000 34.71910000 23.58830000 7.638200000 937 43.45890000 18.74320000 19.34640000 7.984100000 5.395780000 3.173640000 938 47.15980000 15.94380000 72.44980000 17.41190000 8.886120000 47.37110000 939 94.25500000 15.18750000 90.21090000 51.16430000 25.55570000 77.66810000 940 60.95530000 7.524820000 92.16520000 29.08950000 13.43360000 80.13180000 941 76.20180000 16.07210000 93.67510000 38.95980000 19.23180000 83.60790000 942 22.33490000 9.448260000 20.95910000 2.306380000 1.418100000 3.196570000 943 32.30040000 21.85040000 21.86000000 5.333180000 4.547830000 3.936380000 944 32.61760000 27.00830000 24.38010000 6.329230000 6.152810000 5.099350000 945 33.02240000 35.27250000 41.87220000 9.881800000 10.15360000 15.38600000 946 41.53290000 33.70110000 48.21500000 12.86970000 11.07030000 20.47800000 947 40.73540000 39.26520000 47.93210000 13.88000000 13.53560000 20.65600000 948 45.27520000 40.15510000 35.15190000 13.83710000 14.06130000 11.47760000 949 60.36090000 40.45710000 41.37790000 21.06680000 17.81680000 15.91630000 950 71.74630000 51.22430000 47.47210000 31.58740000 28.07060000 22.13450000 951 80.33760000 65.64880000 47.62780000 43.18320000 42.89310000 24.51740000 952 69.44660000 48.23470000 27.06170000 26.70850000 24.33250000 8.629660000 953 89.60630000 89.68040000 26.58190000 61.51580000 73.37840000 16.05640000 954 27.80370000 33.42660000 10.07600000 5.798110000 7.743900000 1.797280000 955 45.46640000 48.52940000 20.27950000 15.11780000 18.55650000 5.616640000 956 52.55640000 60.39410000 23.15260000 22.53930000 29.04830000 8.208560000 957 58.87030000 57.08370000 26.57330000 24.25960000 27.86370000 9.230630000 958 68.24330000 68.50640000 27.92560000 34.45280000 40.74090000 11.77090000 959 93.03510000 70.62730000 28.31390000 52.95240000 51.87650000 13.12190000 960 23.60300000 12.99950000 27.39670000 3.172340000 2.111990000 5.727330000 961 29.70780000 9.169240000 27.39500000 4.091180000 2.265520000 5.707790000 962 55.71130000 7.265520000 27.91930000 12.59450000 6.533020000 6.317030000 963 60.99610000 10.64610000 50.03890000 18.10050000 9.261640000 21.47150000 964 60.38670000 31.13590000 61.55480000 22.55660000 14.99040000 34.25010000 965 62.99510000 55.97900000 62.69500000 31.37240000 30.24610000 38.07070000 966 78.23760000 86.51820000 85.25420000 62.75150000 69.48930000 76.72170000 967 86.88270000 93.04920000 93.57230000 76.38380000 82.88440000 93.72430000 968 25.91930000 24.32220000 16.05210000 4.036180000 4.413010000 2.332430000 969 92.52810000 29.44310000 27.67260000 38.26380000 23.20960000 8.072790000 970 93.09680000 43.52290000 36.66390000 42.96140000 30.43840000 14.02530000 971 93.23620000 57.50150000 38.92800000 48.20730000 40.31080000 17.12130000 972 92.89330000 79.14710000 43.76380000 59.37850000 62.01330000 24.21110000 973 39.86480000 56.22260000 22.23530000 16.19570000 23.23460000 7.098300000 974 43.87840000 85.59220000 42.00200000 34.81340000 55.34190000 22.88990000 975 65.09800000 88.15050000 64.29700000 49.97280000 65.20010000 45.77090000 976 16.39050000 31.74530000 44.23610000 6.642200000 7.334070000 16.80300000 977 16.35290000 35.04550000 52.73490000 8.751470000 9.292110000 24.49460000 978 19.52160000 82.20810000 66.22480000 31.66770000 49.98650000 46.20330000 979 33.44030000 81.95220000 70.76190000 35.22530000 51.45260000 52.29560000 980 36.82270000 92.95540000 80.15040000 46.12830000 67.70620000 68.79660000 981 28.94450000 25.93420000 44.86170000 7.633310000 6.306250000 17.04600000 982 30.80460000 25.39280000 74.48080000 14.29190000 8.882270000 50.45440000 983 74.77430000 12.74300000 35.19970000 23.96150000 12.71490000 10.71270000 984 77.02670000 8.900220000 47.26850000 26.87610000 13.71390000 19.43870000 985 88.45840000 15.09600000 52.99420000 36.51570000 19.13910000 25.18350000 986 87.83730000 46.81370000 67.98330000 45.46720000 32.54870000 44.37810000 987 89.14820000 75.39260000 83.46730000 63.37520000 59.79390000 71.78530000 988 29.18910000 40.29660000 68.94290000 15.56060000 14.29420000 43.69810000 989 29.84900000 86.23980000 80.95900000 40.05180000 57.67200000 68.47820000 990 6.238760000 37.03560000 53.02900000 8.589660000 9.885750000 24.90270000 991 10.53270000 37.08830000 75.58680000 14.08220000 12.12610000 52.72230000 992 12.80030000 39.16630000 92.81950000 20.32120000 15.46270000 82.22540000 993 36.46140000 43.17030000 93.22220000 25.58960000 19.77450000 83.54830000 994 34.95320000 60.93350000 92.01980000 31.14790000 32.17920000 83.36760000 995 38.64640000 61.95710000 100.0000000 35.62390000 34.80470000 99.45290000 996 13.54190000 48.60270000 34.92100000 9.608530000 15.60850000 11.86250000 997 9.878450000 51.88920000 48.90410000 12.44530000 18.52570000 22.54220000 998 12.63890000 62.46190000 65.49880000 20.25610000 28.47840000 41.73770000 999 26.64480000 67.43530000 67.79910000 24.96170000 34.30000000 45.55570000 1000 40.60160000 68.59070000 66.61080000 28.67230000 37.09640000 44.36480000 1001 59.29950000 75.19960000 72.09200000 40.96100000 48.46430000 53.26530000 1002 59.92170000 94.23720000 86.50840000 57.87610000 74.91050000 80.19930000 1003 13.33200000 35.75840000 44.56980000 7.268210000 8.924870000 17.33940000 1004 10.54820000 42.87570000 51.78450000 10.09160000 12.95600000 24.22300000 1005 12.50540000 50.40910000 53.14330000 12.84780000 17.87310000 26.33130000 1006 8.450030000 52.51220000 62.34810000 15.23900000 19.99420000 36.53100000 1007 21.68840000 52.28740000 81.25070000 21.45510000 22.49490000 63.14040000 1008 49.88730000 52.09890000 91.87170000 32.43860000 27.64670000 82.14620000 1009 8.821240000 11.39540000 34.97880000 2.290520000 1.421130000 9.543800000 1010 14.59930000 14.98260000 61.72490000 7.395750000 3.907620000 33.10790000 1011 14.10740000 9.424530000 66.73070000 8.169320000 3.649570000 39.14260000 1012 23.90850000 29.84270000 93.30490000 19.77390000 12.11950000 82.53540000 1013 26.65150000 67.24050000 92.27610000 32.31380000 37.08870000 84.73730000 1014 17.89220000 22.98490000 29.23840000 3.554220000 3.785250000 6.874170000 1015 26.78680000 20.34020000 28.39470000 4.485660000 3.780880000 6.429460000 1016 30.12370000 18.37680000 33.22310000 5.407810000 3.882360000 8.849140000 1017 39.45870000 61.06610000 46.46550000 20.76650000 28.26280000 21.89560000 1018 44.97080000 69.61170000 58.38480000 28.76070000 38.12190000 34.81550000 1019 57.41040000 71.52190000 92.14250000 44.35620000 46.52700000 85.67240000 1020 76.11660000 55.58930000 70.16670000 40.73900000 34.63920000 47.94590000 1021 93.79200000 55.65580000 77.77690000 56.05830000 42.33200000 59.65510000 1022 93.54370000 62.35040000 88.69020000 62.12380000 49.20940000 78.88790000 1023 93.27060000 86.37000000 99.62020000 79.18690000 77.21740000 104.5550000 1024 50.82430000 52.68700000 57.71800000 23.43450000 24.42880000 31.73030000 1025 56.30380000 54.33480000 64.63740000 27.92140000 27.47480000 40.06950000 1026 63.38460000 57.47190000 72.36450000 34.56850000 32.50000000 50.90450000 1027 44.35940000 53.94440000 49.01870000 19.86580000 23.46750000 23.20640000 1028 45.06340000 92.48350000 68.64550000 45.14760000 67.06760000 51.93020000 1029 57.65870000 91.95190000 72.34080000 50.87350000 69.34480000 57.12360000 1030 30.71030000 56.12140000 37.03770000 15.14360000 22.47480000 14.18890000 1031 51.82790000 58.64280000 79.25340000 31.59850000 31.45440000 61.14310000 1032 75.95290000 61.71630000 91.81500000 49.85190000 42.33860000 83.95780000 1033 28.58140000 17.89510000 39.54690000 5.784250000 3.917550000 12.75150000 1034 30.53800000 14.37190000 45.23990000 6.692420000 3.830830000 16.92020000 1035 36.82620000 10.14340000 50.76480000 8.880520000 4.455000000 21.69370000 1036 84.72980000 78.93860000 66.61600000 57.28770000 60.23730000 47.33030000 1037 86.59390000 86.56590000 69.11000000 64.09390000 70.77100000 52.26470000 1038 11.68160000 42.48370000 14.08000000 6.050840000 11.17040000 3.106490000 1039 14.85290000 51.38550000 12.49370000 9.077130000 16.93400000 3.766120000 1040 51.33520000 51.82630000 34.47620000 19.67660000 22.45220000 12.39290000 1041 51.70760000 53.32240000 42.85720000 21.43830000 24.04520000 18.19020000 1042 79.76050000 79.24270000 91.25410000 61.27490000 61.70930000 86.04530000 1043 81.73540000 87.69640000 94.06730000 69.03330000 73.53880000 93.26200000 1044 9.637480000 16.56100000 24.79220000 1.766090000 1.831010000 4.665040000 1045 8.426810000 13.51910000 29.12300000 1.814890000 1.448580000 6.459980000 1046 29.53530000 40.93160000 48.68120000 11.54170000 12.96610000 21.32070000 1047 38.04610000 44.01390000 56.41150000 15.93100000 16.35380000 29.17990000 1048 46.55480000 47.72860000 57.25200000 19.99890000 20.13470000 30.58340000 1049 67.00280000 48.95870000 56.38940000 29.64860000 25.73020000 30.24370000 1050 18.13890000 12.95410000 14.93710000 1.640760000 1.406900000 1.630470000 1051 40.61070000 24.20300000 9.311020000 7.359960000 6.127100000 1.305980000 1052 47.37990000 22.08160000 8.279160000 9.343210000 6.723850000 1.200300000 1053 59.47990000 77.73100000 16.96070000 34.06710000 48.02560000 9.386050000 1054 61.64680000 91.38040000 18.90750000 44.02250000 66.18130000 12.88180000 1055 23.27830000 28.63140000 32.07190000 5.436460000 6.023690000 8.635230000 1056 32.20900000 28.59560000 39.40860000 8.020880000 7.248730000 13.18220000 1057 43.28980000 28.28540000 75.01950000 18.35840000 11.65880000 51.56670000 1058 51.45690000 30.18050000 91.93790000 27.13440000 16.06440000 80.31460000 1059 65.84450000 63.02620000 92.61690000 44.65510000 40.49430000 85.38980000 1060 71.43360000 73.38670000 93.26790000 53.27020000 52.55460000 88.50440000 1061 38.04620000 29.77510000 88.46990000 21.20120000 13.03460000 73.66540000 1062 37.36090000 48.47580000 87.41200000 25.43190000 22.35890000 73.35540000 1063 54.43930000 79.15380000 93.34380000 47.72370000 54.55780000 89.32870000 1064 63.50630000 93.57760000 93.23920000 61.56840000 75.82840000 92.50440000 1065 7.926100000 22.22180000 22.13220000 2.119590000 2.959780000 3.891350000 1066 20.51110000 27.32790000 20.88240000 3.903730000 5.007570000 3.780760000 1067 37.49590000 37.15300000 31.78370000 10.27200000 11.14380000 9.216210000 1068 74.66300000 72.09790000 46.93730000 42.52340000 47.38050000 24.83310000 1069 81.02140000 74.97800000 72.27170000 53.77750000 54.88250000 54.08170000 1070 93.26940000 83.10560000 77.29120000 69.42520000 69.94450000 63.53570000 1071 96.17430000 84.30100000 91.37660000 77.21260000 74.56000000 87.91450000 1072 62.02400000 20.07320000 22.91680000 16.17750000 9.811710000 4.746380000 1073 79.57570000 21.57180000 46.55990000 29.53750000 16.65930000 19.27210000 1074 79.02520000 34.05020000 61.16250000 34.04070000 21.80790000 34.50650000 1075 75.49590000 45.70120000 57.92530000 34.04610000 26.41040000 31.77740000 1076 92.74940000 90.56920000 63.87260000 70.43980000 78.23020000 46.68950000 1077 33.55570000 27.28480000 17.71980000 6.192170000 6.196900000 2.974320000 1078 32.86590000 41.70760000 35.46260000 10.64080000 13.03040000 11.63260000 1079 31.26790000 45.19930000 44.57690000 12.48800000 15.34370000 18.30890000 1080 35.22930000 63.20930000 79.35880000 28.05230000 32.56560000 61.71050000 1081 43.36800000 66.49810000 91.32720000 35.92960000 38.45700000 83.02890000 1082 30.92420000 51.28010000 68.64200000 19.24340000 21.22980000 44.44300000 1083 35.07750000 56.26140000 67.82570000 21.89700000 25.38520000 44.03120000 1084 64.49050000 70.17700000 75.58710000 41.87960000 44.82650000 57.56980000 1085 75.29530000 79.85080000 84.20070000 56.26070000 59.94030000 73.42360000 1086 89.18920000 93.83860000 86.60860000 76.31230000 83.97880000 81.15360000 1087 88.84590000 100.0000000 92.35600000 82.70530000 93.97260000 93.21270000 1088 9.169040000 15.34010000 17.51500000 1.185940000 1.426070000 2.264120000 1089 11.28350000 12.36420000 20.07640000 1.228760000 1.107560000 2.918540000 1090 7.758740000 8.455170000 19.87400000 0.822165000 0.596167000 2.780200000 1091 37.05060000 66.94820000 32.07420000 20.92090000 32.57990000 12.94640000 1092 73.04610000 79.71690000 48.48070000 46.06140000 55.56720000 27.54910000 1093 85.73830000 92.63570000 52.06020000 63.91560000 77.32030000 34.07180000 1094 42.95560000 20.41270000 13.78870000 7.747210000 5.578960000 1.880820000 1095 93.23600000 18.43900000 9.688770000 36.32620000 20.00370000 2.504840000 1096 53.58320000 0.000000000 12.81250000 10.65310000 5.469250000 1.525770000 1097 57.05280000 69.13620000 43.46470000 30.77150000 39.10520000 21.06680000 1098 56.63430000 91.68720000 48.33310000 45.00290000 66.64090000 29.61360000 1099 57.64850000 92.69780000 62.50090000 48.96660000 69.43430000 44.47750000 1100 19.66130000 58.77220000 58.02510000 17.71590000 24.99770000 32.47310000 1101 25.31460000 72.47990000 65.01490000 26.63030000 39.07570000 42.84380000 1102 11.02960000 36.82280000 36.45380000 6.258540000 8.898830000 11.67090000 1103 11.08770000 43.95170000 37.99980000 8.340490000 12.75720000 13.28950000 1104 65.58080000 67.43090000 37.18470000 33.38660000 39.29040000 16.56660000 1105 92.19480000 67.75010000 38.05720000 51.83380000 49.02100000 18.03480000 1106 66.72170000 47.29710000 10.64440000 23.95810000 22.56580000 3.779300000 1107 81.13310000 65.01260000 12.86390000 40.10750000 41.24670000 6.888590000 1108 92.60500000 86.12580000 8.715340000 60.65800000 69.48420000 10.65750000 1109 91.92170000 89.50420000 84.66040000 74.79940000 78.71380000 76.85130000 1110 68.42910000 64.66880000 71.64680000 40.28470000 40.12080000 51.06700000 1111 76.06900000 74.16780000 81.98420000 52.79120000 53.38250000 68.64730000 1112 89.64880000 73.63660000 96.86260000 67.49940000 59.93680000 96.21880000 1113 36.52590000 6.653190000 21.80120000 5.227210000 2.758580000 3.576900000 1114 45.40580000 9.620080000 18.95960000 7.938100000 4.346670000 2.862660000 1115 50.43670000 16.98590000 27.54760000 10.93750000 6.592140000 6.249590000 1116 62.85560000 28.05740000 31.33260000 18.44460000 12.59050000 8.829420000 1117 74.96280000 28.10250000 36.59350000 26.05200000 16.45780000 12.17380000 1118 89.32660000 30.69140000 43.10650000 37.67180000 23.04530000 17.33020000 1119 89.64230000 44.38940000 44.27510000 41.42550000 29.90610000 19.35750000 1120 64.91420000 31.97110000 9.849500000 18.96650000 14.08850000 2.298380000 1121 75.57230000 33.04720000 10.03440000 25.52090000 17.79350000 2.692290000 1122 85.30450000 79.87770000 19.61210000 51.39130000 58.82440000 11.27690000 1123 91.97640000 79.68920000 61.08980000 62.11910000 63.53970000 40.99810000 1124 18.44450000 13.68490000 22.03320000 2.100660000 1.677010000 3.611060000 1125 69.69420000 9.399170000 28.09330000 19.94390000 10.44670000 6.763860000 1126 79.69080000 9.507240000 27.21740000 26.26500000 13.72150000 6.672710000 1127 89.23370000 22.50290000 63.57020000 40.11000000 21.90520000 37.04940000 1128 88.40270000 36.11390000 70.74130000 43.68430000 27.19880000 47.14010000 1129 94.37940000 63.35040000 72.77930000 58.38940000 48.51770000 53.32860000 1130 77.39320000 52.24080000 54.37640000 36.77270000 31.14120000 28.85060000 1131 89.80560000 53.02650000 56.77220000 46.61200000 36.58420000 31.84730000 1132 89.38130000 64.63480000 61.41770000 52.08970000 46.47090000 38.61110000 1133 67.01150000 67.30320000 53.09530000 36.55290000 40.54850000 29.41230000 1134 66.27060000 82.77150000 71.18130000 48.82470000 59.20870000 53.65460000 1135 68.45550000 90.74980000 85.06040000 59.44910000 72.06890000 77.06110000 1136 10.56100000 29.55440000 16.94690000 3.107780000 5.197270000 2.747290000 1137 9.419710000 27.77370000 28.89620000 3.542420000 4.862820000 6.920990000 1138 47.57470000 39.55580000 26.80870000 13.69870000 13.85170000 7.183010000 1139 47.46410000 44.96910000 24.97900000 15.02960000 16.80460000 6.929630000 1140 58.34210000 65.54960000 52.19370000 31.05190000 36.47820000 28.04740000 1141 77.32340000 66.97260000 79.27410000 49.06240000 46.02530000 63.06800000 1142 28.64910000 12.54000000 19.04060000 3.480660000 2.292060000 2.723960000 1143 29.54650000 9.256680000 22.15070000 3.670380000 2.099560000 3.649900000 1144 50.48150000 14.17850000 51.93040000 13.93030000 7.411190000 23.08860000 1145 77.42820000 12.19430000 66.32560000 31.16090000 15.73830000 39.74750000 1146 77.62030000 43.55920000 72.91680000 38.38400000 27.28280000 50.47970000 1147 69.42030000 43.44190000 76.22470000 34.13050000 24.93290000 55.09150000 1148 69.38470000 46.96830000 90.08200000 39.59010000 28.82700000 78.67240000 1149 78.01820000 53.59180000 91.09420000 47.66220000 36.33810000 81.56770000 1150 40.79090000 47.71840000 39.45060000 15.09950000 17.94600000 14.90260000 1151 47.11630000 57.82050000 46.32210000 21.92110000 26.83000000 21.43930000 1152 9.684760000 14.42450000 6.067540000 0.786834000 1.152280000 0.380259000 1153 14.39040000 15.77450000 10.77410000 1.330690000 1.584830000 0.940377000 1154 9.530100000 23.48020000 17.24070000 2.089550000 3.226440000 2.494010000 1155 17.55600000 44.99320000 44.68800000 10.14280000 14.04020000 18.26860000 1156 47.28120000 55.38510000 55.70680000 22.67660000 25.59050000 29.87480000 1157 8.005570000 13.64210000 10.49610000 0.734212000 1.028190000 0.825008000 1158 11.34220000 6.732770000 5.279080000 0.466539000 0.377860000 0.195099000 1159 24.64160000 8.972740000 8.451470000 2.151190000 1.364280000 0.563062000 1160 28.54250000 8.715170000 13.62580000 3.009360000 1.773370000 1.364630000 1161 43.15720000 25.57530000 48.38680000 11.93640000 8.377500000 20.15670000 1162 46.67550000 48.20700000 67.32470000 22.46570000 21.37600000 42.57580000 1163 56.65420000 54.09060000 75.41710000 30.78130000 28.48980000 54.74870000 1164 77.76180000 55.02310000 81.42090000 44.81470000 36.04520000 64.80130000 1165 10.91450000 24.90070000 39.37790000 4.321330000 4.454530000 12.81690000 1166 8.910710000 23.56170000 44.53360000 4.737580000 4.300080000 16.55140000 1167 10.90510000 28.75220000 58.06560000 8.082570000 6.959600000 29.54290000 1168 12.08640000 32.00430000 78.12750000 13.80310000 10.23780000 56.22790000 1169 26.70110000 73.10540000 77.97320000 30.65730000 41.25320000 61.08790000 1170 24.41660000 82.41640000 91.71720000 40.15100000 53.67090000 86.47280000 1171 25.14990000 84.20730000 100.0000000 44.53280000 57.24850000 103.3160000 1172 15.82950000 93.94440000 72.45990000 40.77120000 66.26410000 57.22950000 1173 88.46500000 95.03620000 71.81970000 72.18080000 83.66730000 58.03320000 1174 29.62620000 31.23430000 16.76420000 5.962590000 7.140220000 2.926950000 1175 45.06340000 60.42080000 12.51640000 19.13880000 27.37420000 5.254990000 1176 51.48780000 81.02320000 11.46160000 32.24210000 50.02280000 8.763710000 1177 75.94400000 92.85820000 10.16440000 53.01420000 72.42010000 11.80490000 1178 76.26360000 93.50490000 63.61470000 60.24720000 76.08530000 46.50000000 1179 91.95130000 92.47350000 79.68370000 75.34750000 82.27220000 69.32640000 1180 66.68820000 75.49130000 68.92960000 44.14920000 50.44580000 49.15190000 1181 70.05020000 83.15650000 89.97000000 56.99100000 63.11260000 84.16800000 1182 79.31170000 94.97110000 89.47950000 70.82670000 82.27180000 86.24080000 1183 14.25120000 38.59180000 29.99520000 6.251060000 9.615260000 8.223390000 1184 8.576980000 46.06510000 74.32870000 16.08780000 16.86100000 51.67780000 1185 12.73000000 51.19000000 90.41140000 23.10410000 22.41400000 78.90930000 1186 12.45520000 62.94490000 93.80200000 29.02240000 32.33080000 86.90420000 1187 9.281660000 24.74920000 75.45220000 11.59480000 7.317300000 51.72510000 1188 7.275710000 25.22980000 87.85760000 15.43750000 8.958540000 72.08690000 1189 14.97540000 19.30710000 75.43060000 11.30310000 6.131650000 51.47960000 1190 63.18110000 16.90190000 78.22670000 26.25780000 13.38600000 56.33300000 1191 71.47950000 24.04780000 87.85470000 34.84050000 18.70430000 72.94060000 1192 57.67410000 39.96870000 66.27600000 24.35570000 18.77680000 40.62950000 1193 72.73410000 59.75600000 67.73610000 39.66210000 36.66960000 45.15630000 1194 74.36260000 75.45880000 67.33520000 48.31070000 52.61020000 47.25640000 1195 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 1196 7.710020000 10.15680000 6.203640000 0.420937000 0.559623000 0.295110000 1197 7.612170000 4.618980000 10.11310000 0.301345000 0.203224000 0.636356000 1198 30.28710000 63.57770000 15.43310000 16.48460000 28.07080000 6.102600000 1199 34.00210000 92.80980000 14.70120000 34.45770000 62.78500000 11.69870000 1200 39.94850000 95.35840000 90.38020000 52.14040000 73.02820000 87.09130000 1201 21.70130000 28.66040000 27.26250000 4.757880000 5.732790000 6.283750000 1202 20.63100000 33.10070000 25.73260000 5.336990000 7.312590000 5.910750000 1203 61.14130000 38.88710000 28.48010000 19.59650000 16.62170000 8.151090000 1204 61.80640000 61.36260000 42.29090000 29.24860000 32.90010000 19.06460000 1205 44.91050000 59.22180000 40.26050000 20.83030000 27.22990000 16.95180000 1206 49.99250000 74.18350000 43.04700000 30.34600000 42.84450000 21.49280000 1207 67.69390000 83.84290000 52.49630000 46.12810000 59.30520000 31.94880000 1208 74.54440000 84.85120000 63.39050000 53.15190000 63.62630000 44.19840000 1209 12.65390000 32.43660000 9.078530000 3.535910000 6.275350000 1.508440000 1210 10.27680000 30.78420000 23.05510000 3.672750000 5.789010000 4.678200000 1211 10.37250000 31.07700000 36.38210000 4.971880000 6.399540000 11.21190000 1212 11.43210000 38.40340000 43.03950000 7.534660000 10.02800000 16.35490000 1213 0.000000000 40.73120000 45.85760000 8.210030000 11.22130000 18.76730000 1214 41.42260000 45.38370000 73.28320000 21.34030000 19.29080000 50.35870000 1215 51.42930000 53.84570000 82.97730000 30.69290000 28.04580000 66.56150000 1216 71.81530000 12.78580000 20.17470000 20.83310000 11.25440000 3.873980000 1217 72.59920000 7.440620000 54.75370000 25.30950000 12.66860000 26.26870000 1218 79.93730000 60.33610000 54.23330000 41.67200000 38.41550000 29.85340000 1219 64.04890000 23.69560000 16.88540000 17.34840000 11.13930000 3.128620000 1220 91.04910000 27.31500000 18.62540000 36.06180000 21.59760000 4.616840000 1221 90.03810000 39.30900000 16.64050000 37.67680000 26.19360000 4.903400000 1222 33.24830000 15.57040000 10.78940000 4.394080000 3.138230000 1.081010000 1223 35.44630000 11.28760000 91.72670000 19.43700000 8.734100000 78.90840000 1224 45.95460000 18.11990000 91.08340000 22.99310000 11.39610000 78.03310000 1225 15.55610000 14.89220000 5.936390000 1.267720000 1.455000000 0.403999000 1226 17.05060000 13.77280000 9.164060000 1.393950000 1.386170000 0.687679000 1227 14.69930000 10.39800000 8.937570000 0.943539000 0.841757000 0.579899000 1228 8.826190000 11.11870000 14.22730000 0.731206000 0.772028000 1.409100000 1229 6.437110000 8.179000000 15.38370000 0.538399000 0.459239000 1.602370000 1230 5.951050000 52.34510000 69.99720000 16.93250000 20.56360000 46.25320000 1231 9.232850000 58.92620000 83.86440000 23.65070000 27.36650000 68.28670000 1232 11.68040000 75.69230000 92.35900000 34.90280000 45.01610000 86.28780000 1233 6.351260000 81.46890000 92.34760000 38.03030000 51.68030000 87.38760000 1234 20.31460000 89.10210000 91.43460000 43.80560000 62.05910000 87.37030000 1235 53.01520000 87.00210000 93.97770000 52.28500000 64.21920000 92.17250000 1236 90.00530000 86.71960000 92.77820000 74.15830000 75.26770000 90.85350000 1237 1.445090000 0.000000000 0.000000000 0.003702600 0.001908800 0.000173336 1238 13.56080000 92.53170000 32.87570000 32.21840000 61.18440000 18.30520000 1239 75.42190000 91.66890000 36.61140000 53.68830000 71.29190000 21.31280000 1240 93.20680000 90.72590000 54.20300000 68.88870000 77.82890000 35.99660000 1241 25.23860000 18.16100000 7.137190000 2.890610000 2.730340000 0.659536000 1242 33.00280000 20.03620000 9.726100000 4.750990000 3.983980000 1.081250000 1243 34.38430000 18.05020000 84.68600000 17.29310000 8.698370000 66.41070000 1244 20.91300000 24.27940000 50.46040000 6.920950000 5.465110000 21.71200000 1245 18.31900000 35.01640000 65.28960000 11.61190000 10.45110000 38.45190000 1246 26.02460000 45.68080000 70.68180000 16.93460000 17.23510000 46.54470000 1247 25.36540000 49.93070000 94.62990000 25.76810000 22.96230000 86.87110000 1248 38.32000000 35.31740000 63.14590000 15.19450000 12.45620000 36.02760000 1249 48.48260000 37.88230000 70.32140000 20.94190000 16.11370000 45.62400000 1250 15.86020000 14.00440000 26.27860000 2.147950000 1.700780000 5.221500000 1251 11.25920000 57.31340000 24.49210000 11.66920000 21.52880000 7.828860000 1252 6.114910000 62.53930000 41.61760000 15.45050000 26.57130000 18.07580000 1253 11.65980000 78.14880000 46.01220000 24.43040000 43.08330000 24.18920000 1254 14.06040000 79.97310000 37.75400000 24.54390000 44.88210000 18.47680000 1255 17.52700000 91.53340000 44.67530000 33.39910000 60.56410000 26.01320000 1256 35.24230000 92.67390000 45.58610000 37.61660000 63.92870000 27.17030000 1257 30.23550000 90.43260000 30.76500000 32.98400000 59.40110000 16.80820000 1258 82.53420000 93.02630000 30.24750000 58.84020000 75.46670000 18.28740000 1259 76.54930000 50.64270000 17.87660000 31.32950000 27.99310000 5.898000000 1260 88.61980000 52.67390000 42.68610000 43.12370000 34.87400000 19.00910000 1261 46.81620000 22.14060000 64.82460000 16.02570000 9.385250000 37.43590000 1262 63.01910000 20.12970000 90.18320000 30.37200000 15.55960000 76.78320000 1263 62.74990000 34.35550000 90.29340000 32.62920000 20.22020000 77.76670000 1264 78.85570000 72.28420000 90.75750000 56.55430000 53.47170000 83.78110000 1265 43.60790000 35.14440000 38.61250000 12.45930000 11.48970000 13.23120000 1266 53.61020000 34.11960000 41.08170000 16.37940000 13.13770000 15.04720000 1267 63.65740000 36.33140000 48.52960000 22.81140000 17.06200000 21.38460000 1268 67.88780000 45.08940000 60.21150000 29.71230000 23.84340000 34.04030000 1269 82.68240000 53.54650000 75.09630000 45.81170000 35.94680000 54.92140000 1270 23.28060000 4.536670000 17.00300000 2.078180000 1.088020000 2.022280000 1271 22.31120000 9.006000000 13.01760000 1.905820000 1.225510000 1.204210000 1272 20.50680000 12.76300000 5.439990000 1.681200000 1.437070000 0.345561000 1273 20.12340000 16.56160000 53.16690000 6.397710000 3.796260000 23.97720000 1274 27.88470000 32.22340000 54.42860000 10.18620000 9.102990000 26.05010000 1275 28.21660000 35.95750000 73.02990000 15.36520000 12.47520000 48.99580000 1276 46.51770000 39.06810000 90.42260000 26.65250000 18.78840000 78.04330000 1277 18.78970000 3.835200000 25.62730000 1.974800000 0.954450000 4.817730000 1278 31.80020000 6.725560000 37.60000000 5.513710000 2.740170000 11.24600000 1279 32.74740000 63.83470000 57.92570000 22.29700000 30.64870000 33.21490000 1280 35.99050000 80.31010000 61.21150000 32.56750000 48.85660000 39.86160000 1281 42.42790000 96.78820000 60.61650000 45.54070000 72.19260000 42.99900000 1282 29.58180000 40.62190000 27.14470000 8.788020000 11.73280000 7.178030000 1283 58.82760000 44.15440000 31.13110000 20.14990000 19.02200000 9.877090000 1284 65.89420000 52.92000000 37.14780000 27.34450000 26.95730000 14.48100000 1285 65.54560000 59.30100000 46.12240000 30.90950000 32.37720000 21.87180000 1286 82.27590000 65.23240000 65.46260000 47.93480000 44.63710000 43.35290000 1287 93.31010000 76.94330000 68.03030000 63.24250000 61.53910000 49.09880000 1288 94.38990000 87.19740000 72.69500000 71.72830000 75.22070000 57.66010000 1289 93.41810000 86.60820000 88.17210000 75.25290000 75.90970000 82.41950000 1290 53.29130000 49.27330000 45.26100000 21.02850000 21.66960000 19.62500000 1291 62.37610000 54.22280000 47.45890000 27.41580000 27.54500000 22.24160000 1292 91.18730000 9.951890000 15.16290000 34.17450000 17.91700000 3.151450000 1293 93.68130000 12.80220000 23.14710000 36.83570000 19.48410000 5.607180000 1294 93.29800000 11.62470000 31.56030000 37.14700000 19.45260000 9.286770000 1295 93.14560000 14.33110000 40.28450000 38.21900000 20.16110000 14.68790000 1296 91.41500000 8.841860000 67.03280000 41.51280000 20.79200000 41.08250000 1297 87.18510000 7.726400000 80.24420000 41.75380000 20.43070000 60.05180000 1298 68.97070000 31.56980000 60.38760000 27.00300000 17.43830000 33.14650000 1299 70.30620000 35.01200000 70.62150000 30.95830000 20.26950000 46.30880000 1300 70.04770000 37.30100000 81.59260000 34.47610000 22.50940000 63.01300000 1301 83.50610000 46.67820000 91.22150000 49.18380000 33.59010000 81.19400000 1302 94.26810000 47.41200000 92.40100000 58.31570000 38.59580000 83.89430000 1303 56.97610000 47.18090000 55.63660000 23.79260000 21.86620000 29.02470000 1304 57.40670000 65.13240000 66.43910000 33.43920000 37.06720000 43.88880000 1305 58.48010000 65.43010000 91.85320000 41.71440000 40.66050000 84.13440000 1306 21.72170000 33.39130000 34.89950000 6.422240000 7.862090000 10.52250000 1307 19.10780000 70.51180000 48.41640000 21.32750000 35.19120000 24.86320000 1308 19.13660000 82.18150000 56.59680000 29.47210000 49.07610000 34.97680000 1309 15.73280000 89.28060000 85.84270000 41.47440000 61.26080000 77.27010000 1310 13.14380000 65.54740000 81.53350000 26.11950000 33.10210000 65.40170000 1311 12.04630000 70.55520000 93.17840000 32.45020000 39.59680000 86.92920000 1312 4.513480000 91.46300000 94.78410000 45.47490000 65.21690000 94.28930000 1313 17.98960000 62.08440000 70.43570000 21.83330000 28.89920000 48.20100000 1314 14.92120000 76.46260000 72.87940000 29.44730000 43.56230000 54.03950000 1315 10.53370000 76.24820000 78.82790000 30.68430000 43.82310000 62.91090000 1316 8.995660000 66.30180000 60.48030000 20.66270000 31.46410000 36.29330000 1317 56.66090000 65.58880000 61.02650000 32.05790000 36.81970000 37.35180000 1318 57.96780000 79.17440000 61.99260000 40.13320000 51.72610000 40.92580000 1319 16.14690000 62.13910000 17.29770000 13.68670000 25.65620000 6.226740000 1320 19.62630000 70.39090000 14.48530000 17.92650000 33.73830000 6.918520000 1321 18.75500000 81.69550000 15.67290000 24.26870000 46.50760000 9.304650000 1322 35.64330000 87.24060000 58.30180000 36.26050000 57.37630000 38.04620000 1323 24.92420000 44.02250000 39.28730000 10.14000000 13.69690000 14.23270000 1324 92.92030000 45.22180000 52.72970000 45.75000000 32.34380000 26.98950000 1325 91.71690000 72.48310000 77.26680000 61.95340000 56.91470000 61.37710000 1326 50.51570000 43.21630000 45.91840000 18.09440000 17.34040000 19.47730000 1327 55.52440000 42.02250000 57.62460000 21.99060000 18.60390000 30.58170000 1328 36.07860000 17.71890000 24.27490000 5.978770000 4.170240000 4.694980000 1329 41.67640000 14.34360000 24.83720000 7.360030000 4.438660000 4.891180000 1330 43.45160000 10.27280000 35.63710000 8.700990000 4.626050000 10.21770000 1331 68.34510000 12.02140000 38.94220000 20.46340000 10.79050000 12.89480000 1332 67.66660000 35.09350000 43.31510000 23.90980000 17.30190000 17.10550000 1333 53.50820000 30.18810000 33.67710000 14.63910000 11.16740000 10.02290000 1334 71.86360000 62.81730000 32.32400000 34.30810000 36.60760000 13.15190000 1335 55.52360000 43.89520000 23.64600000 17.91180000 17.82770000 6.466460000 1336 65.09090000 81.61000000 32.75360000 40.46010000 54.63270000 16.53960000 1337 40.60920000 50.10750000 9.305230000 13.60370000 18.61630000 3.386940000 1338 54.06280000 66.41680000 10.19650000 25.32060000 34.62370000 5.973020000 1339 62.58200000 66.33770000 12.90490000 29.41150000 36.66680000 6.575480000 1340 90.31720000 75.18700000 18.93540000 52.52550000 55.37720000 10.35630000 1341 89.48070000 81.32160000 35.49380000 56.83850000 62.77830000 18.81940000 1342 98.27870000 91.75180000 35.16350000 71.09590000 80.37260000 21.26680000 1343 53.47620000 73.28290000 28.89250000 29.63700000 41.94020000 12.70090000 1344 53.65560000 85.70130000 29.22480000 37.16160000 56.82840000 15.33520000 1345 25.53130000 38.87220000 9.246350000 6.620030000 10.04690000 2.093790000 1346 23.95260000 42.48480000 55.87110000 12.23940000 13.80970000 28.32060000 1347 23.89400000 47.63030000 56.71840000 13.95430000 16.98390000 29.72800000 1348 24.95660000 55.99290000 63.00750000 18.47120000 23.59500000 37.83940000 1349 32.50820000 64.17840000 73.71190000 26.19560000 32.45500000 53.26050000 1350 33.49440000 77.67230000 75.77190000 34.03980000 46.87030000 58.65260000 1351 46.67130000 31.61110000 34.29710000 12.27350000 10.34630000 10.34270000 1352 49.19460000 29.84490000 58.92890000 16.80930000 11.73040000 30.94820000 1353 55.96940000 30.62240000 68.08590000 21.90720000 14.33110000 42.23770000 1354 36.67160000 22.12650000 51.97220000 10.11690000 6.645710000 23.18150000 1355 56.52030000 20.23980000 62.19990000 19.17680000 10.73430000 34.36150000 1356 67.49460000 24.26130000 68.50830000 26.81510000 15.27300000 42.71730000 1357 81.48440000 33.32100000 84.20440000 41.84340000 24.87820000 67.42190000 1358 19.53530000 40.04690000 18.23540000 6.343270000 10.31560000 3.898350000 1359 26.70980000 50.32530000 24.44240000 10.97430000 17.28930000 7.028070000 1360 89.22210000 59.03820000 30.11230000 44.60060000 39.50320000 12.02920000 1361 49.38740000 32.18660000 14.95290000 11.97160000 10.52760000 2.849940000 1362 57.01390000 42.63330000 12.37190000 17.65160000 17.22060000 3.348820000 1363 57.80090000 49.55300000 9.913030000 20.09820000 21.68200000 3.712670000 1364 66.62030000 61.83290000 10.42610000 29.42770000 33.59910000 5.590180000 1365 75.93830000 74.17920000 8.014210000 41.12090000 48.71430000 7.603570000 1366 75.64920000 80.25540000 27.85390000 45.45290000 56.03330000 14.11070000 1367 77.49100000 81.11840000 40.41580000 48.56630000 58.25830000 21.58820000 1368 24.77270000 24.47010000 9.836810000 3.644070000 4.267270000 1.208430000 1369 65.28400000 40.67320000 12.31800000 21.26970000 18.28550000 3.354600000 1370 79.37380000 45.25940000 10.80200000 31.20220000 25.35560000 3.958610000 1371 92.59050000 45.22340000 9.589990000 41.16330000 30.47820000 4.259310000 1372 92.47240000 57.14200000 10.38800000 45.28590000 38.83680000 5.760290000 1373 95.79270000 77.77170000 7.755180000 58.15510000 60.51340000 8.957810000 1374 43.17080000 39.10300000 8.697070000 11.12000000 12.45520000 2.258100000 1375 49.89060000 37.95120000 31.44550000 14.60030000 13.66700000 9.298290000 1376 56.27290000 39.58540000 84.24400000 28.68410000 20.27380000 67.29370000 1377 57.78570000 44.18990000 94.83090000 34.34060000 24.65830000 87.13890000 1378 13.37640000 12.20150000 44.46690000 3.881240000 2.169880000 16.13280000 1379 10.57270000 8.880130000 49.82920000 4.369720000 2.060550000 20.61530000 1380 45.72370000 9.076480000 58.66210000 13.14490000 6.402610000 29.81940000 1381 58.30920000 3.686140000 72.81920000 21.60270000 10.13640000 47.91540000 1382 83.37590000 20.10710000 76.70540000 38.77120000 20.38330000 54.69380000 1383 53.79250000 30.63750000 50.23060000 17.16850000 12.32900000 22.28690000 1384 67.89000000 32.08250000 52.52890000 24.91120000 16.69310000 24.87310000 1385 77.93560000 36.69560000 53.81320000 32.39770000 22.02260000 26.76020000 1386 17.58500000 8.598190000 8.065160000 1.135240000 0.817757000 0.470715000 1387 37.30110000 11.91510000 6.228700000 5.086930000 3.111110000 0.543597000 1388 39.72790000 10.50970000 13.16740000 5.876450000 3.379660000 1.438010000 1389 52.89750000 16.18610000 8.935880000 10.90510000 6.579240000 1.162250000 1390 77.62440000 16.42250000 8.832210000 24.38540000 13.56040000 1.787600000 1391 89.14880000 30.58670000 9.217900000 34.77030000 21.83650000 2.882700000 1392 90.72860000 29.02860000 54.79040000 40.45610000 23.79750000 27.65580000 1393 92.21300000 32.89750000 91.93040000 52.60610000 29.99110000 81.64630000 1394 35.18160000 9.191850000 33.10820000 5.920540000 3.147640000 8.616690000 1395 54.29950000 11.14590000 33.15610000 12.64560000 6.761220000 8.986300000 1396 64.76240000 18.56730000 32.91780000 18.31100000 10.56740000 9.291030000 1397 61.77100000 34.81750000 31.00780000 19.18270000 14.94590000 9.078140000 1398 64.85870000 42.99050000 38.01170000 23.65050000 20.23660000 13.93420000 1399 90.52570000 75.10450000 51.01810000 56.29110000 56.82920000 29.53920000 END_DATA CAL DESCRIPTOR "Argyll Device Calibration State" ORIGINATOR "Argyll dispcal" CREATED "Sat Mar 14 19:07:36 2009" KEYWORD "DEVICE_CLASS" DEVICE_CLASS "DISPLAY" KEYWORD "COLOR_REP" COLOR_REP "RGB" BEGIN_ARGYLL_DISPCAL_ARGS -dmadvr -qm -w0.3127,0.3290 -f0 -k0 END_ARGYLL_DISPCAL_ARGS KEYWORD "RGB_I" NUMBER_OF_FIELDS 4 BEGIN_DATA_FORMAT RGB_I RGB_R RGB_G RGB_B END_DATA_FORMAT NUMBER_OF_SETS 256 BEGIN_DATA 0.00000 0.00000 0.00000 0.00000 0.00392 0.00392 0.00392 0.00392 0.00784 0.00784 0.00784 0.00784 0.01176 0.01176 0.01176 0.01176 0.01569 0.01569 0.01569 0.01569 0.01961 0.01961 0.01961 0.01961 0.02353 0.02353 0.02353 0.02353 0.02745 0.02745 0.02745 0.02745 0.03137 0.03137 0.03137 0.03137 0.03529 0.03529 0.03529 0.03529 0.03922 0.03922 0.03922 0.03922 0.04314 0.04314 0.04314 0.04314 0.04706 0.04706 0.04706 0.04706 0.05098 0.05098 0.05098 0.05098 0.05490 0.05490 0.05490 0.05490 0.05882 0.05882 0.05882 0.05882 0.06275 0.06275 0.06275 0.06275 0.06667 0.06667 0.06667 0.06667 0.07059 0.07059 0.07059 0.07059 0.07451 0.07451 0.07451 0.07451 0.07843 0.07843 0.07843 0.07843 0.08235 0.08235 0.08235 0.08235 0.08627 0.08627 0.08627 0.08627 0.09020 0.09020 0.09020 0.09020 0.09412 0.09412 0.09412 0.09412 0.09804 0.09804 0.09804 0.09804 0.10196 0.10196 0.10196 0.10196 0.10588 0.10588 0.10588 0.10588 0.10980 0.10980 0.10980 0.10980 0.11373 0.11373 0.11373 0.11373 0.11765 0.11765 0.11765 0.11765 0.12157 0.12157 0.12157 0.12157 0.12549 0.12549 0.12549 0.12549 0.12941 0.12941 0.12941 0.12941 0.13333 0.13333 0.13333 0.13333 0.13725 0.13725 0.13725 0.13725 0.14118 0.14118 0.14118 0.14118 0.14510 0.14510 0.14510 0.14510 0.14902 0.14902 0.14902 0.14902 0.15294 0.15294 0.15294 0.15294 0.15686 0.15686 0.15686 0.15686 0.16078 0.16078 0.16078 0.16078 0.16471 0.16471 0.16471 0.16471 0.16863 0.16863 0.16863 0.16863 0.17255 0.17255 0.17255 0.17255 0.17647 0.17647 0.17647 0.17647 0.18039 0.18039 0.18039 0.18039 0.18431 0.18431 0.18431 0.18431 0.18824 0.18824 0.18824 0.18824 0.19216 0.19216 0.19216 0.19216 0.19608 0.19608 0.19608 0.19608 0.20000 0.20000 0.20000 0.20000 0.20392 0.20392 0.20392 0.20392 0.20784 0.20784 0.20784 0.20784 0.21176 0.21176 0.21176 0.21176 0.21569 0.21569 0.21569 0.21569 0.21961 0.21961 0.21961 0.21961 0.22353 0.22353 0.22353 0.22353 0.22745 0.22745 0.22745 0.22745 0.23137 0.23137 0.23137 0.23137 0.23529 0.23529 0.23529 0.23529 0.23922 0.23922 0.23922 0.23922 0.24314 0.24314 0.24314 0.24314 0.24706 0.24706 0.24706 0.24706 0.25098 0.25098 0.25098 0.25098 0.25490 0.25490 0.25490 0.25490 0.25882 0.25882 0.25882 0.25882 0.26275 0.26275 0.26275 0.26275 0.26667 0.26667 0.26667 0.26667 0.27059 0.27059 0.27059 0.27059 0.27451 0.27451 0.27451 0.27451 0.27843 0.27843 0.27843 0.27843 0.28235 0.28235 0.28235 0.28235 0.28627 0.28627 0.28627 0.28627 0.29020 0.29020 0.29020 0.29020 0.29412 0.29412 0.29412 0.29412 0.29804 0.29804 0.29804 0.29804 0.30196 0.30196 0.30196 0.30196 0.30588 0.30588 0.30588 0.30588 0.30980 0.30980 0.30980 0.30980 0.31373 0.31373 0.31373 0.31373 0.31765 0.31765 0.31765 0.31765 0.32157 0.32157 0.32157 0.32157 0.32549 0.32549 0.32549 0.32549 0.32941 0.32941 0.32941 0.32941 0.33333 0.33333 0.33333 0.33333 0.33725 0.33725 0.33725 0.33725 0.34118 0.34118 0.34118 0.34118 0.34510 0.34510 0.34510 0.34510 0.34902 0.34902 0.34902 0.34902 0.35294 0.35294 0.35294 0.35294 0.35686 0.35686 0.35686 0.35686 0.36078 0.36078 0.36078 0.36078 0.36471 0.36471 0.36471 0.36471 0.36863 0.36863 0.36863 0.36863 0.37255 0.37255 0.37255 0.37255 0.37647 0.37647 0.37647 0.37647 0.38039 0.38039 0.38039 0.38039 0.38431 0.38431 0.38431 0.38431 0.38824 0.38824 0.38824 0.38824 0.39216 0.39216 0.39216 0.39216 0.39608 0.39608 0.39608 0.39608 0.40000 0.40000 0.40000 0.40000 0.40392 0.40392 0.40392 0.40392 0.40784 0.40784 0.40784 0.40784 0.41176 0.41176 0.41176 0.41176 0.41569 0.41569 0.41569 0.41569 0.41961 0.41961 0.41961 0.41961 0.42353 0.42353 0.42353 0.42353 0.42745 0.42745 0.42745 0.42745 0.43137 0.43137 0.43137 0.43137 0.43529 0.43529 0.43529 0.43529 0.43922 0.43922 0.43922 0.43922 0.44314 0.44314 0.44314 0.44314 0.44706 0.44706 0.44706 0.44706 0.45098 0.45098 0.45098 0.45098 0.45490 0.45490 0.45490 0.45490 0.45882 0.45882 0.45882 0.45882 0.46275 0.46275 0.46275 0.46275 0.46667 0.46667 0.46667 0.46667 0.47059 0.47059 0.47059 0.47059 0.47451 0.47451 0.47451 0.47451 0.47843 0.47843 0.47843 0.47843 0.48235 0.48235 0.48235 0.48235 0.48627 0.48627 0.48627 0.48627 0.49020 0.49020 0.49020 0.49020 0.49412 0.49412 0.49412 0.49412 0.49804 0.49804 0.49804 0.49804 0.50196 0.50196 0.50196 0.50196 0.50588 0.50588 0.50588 0.50588 0.50980 0.50980 0.50980 0.50980 0.51373 0.51373 0.51373 0.51373 0.51765 0.51765 0.51765 0.51765 0.52157 0.52157 0.52157 0.52157 0.52549 0.52549 0.52549 0.52549 0.52941 0.52941 0.52941 0.52941 0.53333 0.53333 0.53333 0.53333 0.53725 0.53725 0.53725 0.53725 0.54118 0.54118 0.54118 0.54118 0.54510 0.54510 0.54510 0.54510 0.54902 0.54902 0.54902 0.54902 0.55294 0.55294 0.55294 0.55294 0.55686 0.55686 0.55686 0.55686 0.56078 0.56078 0.56078 0.56078 0.56471 0.56471 0.56471 0.56471 0.56863 0.56863 0.56863 0.56863 0.57255 0.57255 0.57255 0.57255 0.57647 0.57647 0.57647 0.57647 0.58039 0.58039 0.58039 0.58039 0.58431 0.58431 0.58431 0.58431 0.58824 0.58824 0.58824 0.58824 0.59216 0.59216 0.59216 0.59216 0.59608 0.59608 0.59608 0.59608 0.60000 0.60000 0.60000 0.60000 0.60392 0.60392 0.60392 0.60392 0.60784 0.60784 0.60784 0.60784 0.61176 0.61176 0.61176 0.61176 0.61569 0.61569 0.61569 0.61569 0.61961 0.61961 0.61961 0.61961 0.62353 0.62353 0.62353 0.62353 0.62745 0.62745 0.62745 0.62745 0.63137 0.63137 0.63137 0.63137 0.63529 0.63529 0.63529 0.63529 0.63922 0.63922 0.63922 0.63922 0.64314 0.64314 0.64314 0.64314 0.64706 0.64706 0.64706 0.64706 0.65098 0.65098 0.65098 0.65098 0.65490 0.65490 0.65490 0.65490 0.65882 0.65882 0.65882 0.65882 0.66275 0.66275 0.66275 0.66275 0.66667 0.66667 0.66667 0.66667 0.67059 0.67059 0.67059 0.67059 0.67451 0.67451 0.67451 0.67451 0.67843 0.67843 0.67843 0.67843 0.68235 0.68235 0.68235 0.68235 0.68627 0.68627 0.68627 0.68627 0.69020 0.69020 0.69020 0.69020 0.69412 0.69412 0.69412 0.69412 0.69804 0.69804 0.69804 0.69804 0.70196 0.70196 0.70196 0.70196 0.70588 0.70588 0.70588 0.70588 0.70980 0.70980 0.70980 0.70980 0.71373 0.71373 0.71373 0.71373 0.71765 0.71765 0.71765 0.71765 0.72157 0.72157 0.72157 0.72157 0.72549 0.72549 0.72549 0.72549 0.72941 0.72941 0.72941 0.72941 0.73333 0.73333 0.73333 0.73333 0.73725 0.73725 0.73725 0.73725 0.74118 0.74118 0.74118 0.74118 0.74510 0.74510 0.74510 0.74510 0.74902 0.74902 0.74902 0.74902 0.75294 0.75294 0.75294 0.75294 0.75686 0.75686 0.75686 0.75686 0.76078 0.76078 0.76078 0.76078 0.76471 0.76471 0.76471 0.76471 0.76863 0.76863 0.76863 0.76863 0.77255 0.77255 0.77255 0.77255 0.77647 0.77647 0.77647 0.77647 0.78039 0.78039 0.78039 0.78039 0.78431 0.78431 0.78431 0.78431 0.78824 0.78824 0.78824 0.78824 0.79216 0.79216 0.79216 0.79216 0.79608 0.79608 0.79608 0.79608 0.80000 0.80000 0.80000 0.80000 0.80392 0.80392 0.80392 0.80392 0.80784 0.80784 0.80784 0.80784 0.81176 0.81176 0.81176 0.81176 0.81569 0.81569 0.81569 0.81569 0.81961 0.81961 0.81961 0.81961 0.82353 0.82353 0.82353 0.82353 0.82745 0.82745 0.82745 0.82745 0.83137 0.83137 0.83137 0.83137 0.83529 0.83529 0.83529 0.83529 0.83922 0.83922 0.83922 0.83922 0.84314 0.84314 0.84314 0.84314 0.84706 0.84706 0.84706 0.84706 0.85098 0.85098 0.85098 0.85098 0.85490 0.85490 0.85490 0.85490 0.85882 0.85882 0.85882 0.85882 0.86275 0.86275 0.86275 0.86275 0.86667 0.86667 0.86667 0.86667 0.87059 0.87059 0.87059 0.87059 0.87451 0.87451 0.87451 0.87451 0.87843 0.87843 0.87843 0.87843 0.88235 0.88235 0.88235 0.88235 0.88627 0.88627 0.88627 0.88627 0.89020 0.89020 0.89020 0.89020 0.89412 0.89412 0.89412 0.89412 0.89804 0.89804 0.89804 0.89804 0.90196 0.90196 0.90196 0.90196 0.90588 0.90588 0.90588 0.90588 0.90980 0.90980 0.90980 0.90980 0.91373 0.91373 0.91373 0.91373 0.91765 0.91765 0.91765 0.91765 0.92157 0.92157 0.92157 0.92157 0.92549 0.92549 0.92549 0.92549 0.92941 0.92941 0.92941 0.92941 0.93333 0.93333 0.93333 0.93333 0.93725 0.93725 0.93725 0.93725 0.94118 0.94118 0.94118 0.94118 0.94510 0.94510 0.94510 0.94510 0.94902 0.94902 0.94902 0.94902 0.95294 0.95294 0.95294 0.95294 0.95686 0.95686 0.95686 0.95686 0.96078 0.96078 0.96078 0.96078 0.96471 0.96471 0.96471 0.96471 0.96863 0.96863 0.96863 0.96863 0.97255 0.97255 0.97255 0.97255 0.97647 0.97647 0.97647 0.97647 0.98039 0.98039 0.98039 0.98039 0.98431 0.98431 0.98431 0.98431 0.98824 0.98824 0.98824 0.98824 0.99216 0.99216 0.99216 0.99216 0.99608 0.99608 0.99608 0.99608 1.00000 1.00000 1.00000 1.00000 END_DATA DisplayCAL-3.1.0.0/misc/ti3/video_Prisma.ti30000644000076500000000000034747512647526532020226 0ustar devwheel00000000000000CTI3 DESCRIPTOR "Argyll Calibration Target chart information 3" ORIGINATOR "Argyll dispread" CREATED "Sat Mar 14 19:00:55 2009" KEYWORD "DEVICE_CLASS" DEVICE_CLASS "DISPLAY" KEYWORD "APPROX_WHITE_POINT" APPROX_WHITE_POINT "95.045781 100.000003 108.905751" KEYWORD "DARK_REGION_EMPHASIS" DARK_REGION_EMPHASIS "1.6" KEYWORD "ACCURATE_EXPECTED_VALUES" ACCURATE_EXPECTED_VALUES "true" KEYWORD "COLOR_REP" COLOR_REP "RGB_XYZ" KEYWORD "BLACK_COLOR_PATCHES" BLACK_COLOR_PATCHES "4" KEYWORD "COMP_GREY_STEPS" COMP_GREY_STEPS "97" KEYWORD "SINGLE_DIM_STEPS" SINGLE_DIM_STEPS "33" KEYWORD "WHITE_COLOR_PATCHES" WHITE_COLOR_PATCHES "4" KEYWORD "USE_BLACK_POINT_COMPENSATION" USE_BLACK_POINT_COMPENSATION "NO" KEYWORD "HIRES_B2A" HIRES_B2A "NO" KEYWORD "AUTO_OPTIMIZE" AUTO_OPTIMIZE "9" KEYWORD "3DLUT_SOURCE_PROFILE" 3DLUT_SOURCE_PROFILE "ref/Rec709.icm" KEYWORD "3DLUT_GAMMA" 3DLUT_GAMMA "-2.4" KEYWORD "3DLUT_DEGREE_OF_BLACK_OUTPUT_OFFSET" 3DLUT_DEGREE_OF_BLACK_OUTPUT_OFFSET "0.0" KEYWORD "3DLUT_INPUT_ENCODING" 3DLUT_INPUT_ENCODING "t" KEYWORD "3DLUT_OUTPUT_ENCODING" 3DLUT_OUTPUT_ENCODING "t" KEYWORD "3DLUT_GAMUT_MAPPING_MODE" 3DLUT_GAMUT_MAPPING_MODE "G" KEYWORD "3DLUT_RENDERING_INTENT" 3DLUT_RENDERING_INTENT "aw" KEYWORD "3DLUT_FORMAT" 3DLUT_FORMAT "3dl" KEYWORD "3DLUT_SIZE" 3DLUT_SIZE "17" KEYWORD "3DLUT_INPUT_BITDEPTH" 3DLUT_INPUT_BITDEPTH "10" KEYWORD "3DLUT_OUTPUT_BITDEPTH" 3DLUT_OUTPUT_BITDEPTH "12" BEGIN_ARGYLL_COLPROF_ARGS -qh -bl -ax -M "Prisma" END_ARGYLL_COLPROF_ARGS NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT SAMPLE_ID RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 1399 BEGIN_DATA 1 100.0000000 100.0000000 100.0000000 95.04580000 100.0000000 108.9060000 2 36.18660000 40.25050000 29.03860000 10.43240000 12.41520000 8.082730000 3 75.62240000 56.57030000 28.01850000 33.62140000 32.37170000 10.24120000 4 82.79480000 56.83720000 43.69100000 40.46860000 35.84890000 20.10110000 5 19.47590000 14.15960000 0.000000000 1.614820000 1.553530000 0.214771000 6 20.94060000 9.655240000 0.000000000 1.533610000 1.101250000 0.131754000 7 21.64610000 0.000000000 9.880980000 1.535610000 0.778814000 0.651906000 8 64.49270000 50.86790000 23.72350000 24.56660000 24.58230000 7.448250000 9 78.94490000 73.49390000 36.37540000 44.63550000 49.75270000 17.48580000 10 0.000000000 15.10070000 0.000000000 0.559497000 1.119080000 0.186522000 11 0.000000000 9.493670000 0.000000000 0.201613000 0.403256000 0.067212600 12 11.29030000 0.000000000 0.000000000 0.340406000 0.175489000 0.015935900 13 13.15790000 0.000000000 0.000000000 0.476651000 0.245728000 0.022314200 14 13.21410000 8.186610000 0.000000000 0.626698000 0.539183000 0.071050300 15 6.646220000 6.646220000 6.646220000 0.244634000 0.257385000 0.280307000 16 9.493670000 9.493670000 9.493670000 0.535904000 0.563838000 0.614052000 17 15.10070000 0.000000000 0.000000000 0.645261000 0.332651000 0.030207600 18 17.12330000 0.000000000 0.000000000 0.850733000 0.438578000 0.039826700 19 19.23080000 0.000000000 0.000000000 1.098130000 0.566119000 0.051408600 20 21.42860000 0.000000000 0.000000000 1.393190000 0.718230000 0.065221500 21 23.72260000 0.000000000 0.000000000 1.742400000 0.898261000 0.081569800 22 26.11940000 0.000000000 0.000000000 2.153160000 1.110020000 0.100799000 23 28.62600000 0.000000000 0.000000000 2.633900000 1.357850000 0.123305000 24 31.25000000 0.000000000 0.000000000 3.194240000 1.646720000 0.149537000 25 34.00000000 0.000000000 0.000000000 3.845230000 1.982330000 0.180013000 26 36.88520000 0.000000000 0.000000000 4.599570000 2.371210000 0.215327000 27 39.91600000 0.000000000 0.000000000 5.471880000 2.820920000 0.256164000 28 43.10340000 0.000000000 0.000000000 6.479100000 3.340170000 0.303316000 29 46.46020000 0.000000000 0.000000000 7.640830000 3.939070000 0.357702000 30 50.00000000 0.000000000 0.000000000 8.979910000 4.629410000 0.420390000 31 53.73830000 0.000000000 0.000000000 10.52300000 5.424900000 0.492628000 32 57.69230000 0.000000000 0.000000000 12.30120000 6.341650000 0.575877000 33 61.88120000 0.000000000 0.000000000 14.35140000 7.398570000 0.671854000 34 66.32650000 0.000000000 0.000000000 16.71680000 8.618020000 0.782591000 35 71.05260000 0.000000000 0.000000000 19.44890000 10.02650000 0.910491000 36 76.08700000 0.000000000 0.000000000 22.60880000 11.65550000 1.058420000 37 81.46070000 0.000000000 0.000000000 26.26990000 13.54290000 1.229810000 38 87.20930000 0.000000000 0.000000000 30.52020000 15.73410000 1.428790000 39 93.37350000 0.000000000 0.000000000 35.46650000 18.28400000 1.660350000 40 100.0000000 0.000000000 0.000000000 41.23850000 21.25960000 1.930560000 41 13.02300000 15.75260000 0.000000000 1.079970000 1.468310000 0.226506000 42 10.68380000 10.68380000 10.68380000 0.694840000 0.731058000 0.796164000 43 4.491020000 0.000000000 0.000000000 0.044824300 0.023108300 0.002098430 44 7.201650000 7.201650000 7.201650000 0.291861000 0.307074000 0.334421000 45 0.000000000 1.445090000 0.000000000 0.003210470 0.006421420 0.001070290 46 0.000000000 2.941180000 0.000000000 0.015321700 0.030645700 0.005107870 47 0.000000000 4.491020000 0.000000000 0.038866600 0.077738900 0.012957100 48 7.763980000 7.763980000 7.763980000 0.344338000 0.362287000 0.394551000 49 0.000000000 13.15790000 0.000000000 0.413298000 0.826656000 0.137783000 50 0.000000000 17.12330000 0.000000000 0.737658000 1.475430000 0.245916000 51 0.000000000 19.23080000 0.000000000 0.952175000 1.904490000 0.317431000 52 0.000000000 21.42860000 0.000000000 1.208020000 2.416210000 0.402721000 53 0.000000000 23.72260000 0.000000000 1.510810000 3.021850000 0.503667000 54 0.000000000 26.11940000 0.000000000 1.866980000 3.734230000 0.622403000 55 0.000000000 28.62600000 0.000000000 2.283820000 4.567970000 0.761366000 56 0.000000000 31.25000000 0.000000000 2.769680000 5.539770000 0.923340000 57 0.000000000 34.00000000 0.000000000 3.334140000 6.668780000 1.111520000 58 0.000000000 36.88520000 0.000000000 3.988220000 7.977030000 1.329570000 59 0.000000000 39.91600000 0.000000000 4.744590000 9.489890000 1.581730000 60 0.000000000 43.10340000 0.000000000 5.617940000 11.23670000 1.872880000 61 0.000000000 46.46020000 0.000000000 6.625260000 13.25150000 2.208690000 62 0.000000000 50.00000000 0.000000000 7.786350000 15.57390000 2.595770000 63 0.000000000 53.73830000 0.000000000 9.124320000 18.25000000 3.041810000 64 0.000000000 57.69230000 0.000000000 10.66620000 21.33400000 3.555850000 65 0.000000000 61.88120000 0.000000000 12.44390000 24.88960000 4.148480000 66 0.000000000 66.32650000 0.000000000 14.49490000 28.99200000 4.832240000 67 0.000000000 71.05260000 0.000000000 16.86390000 33.73020000 5.621980000 68 0.000000000 76.08700000 0.000000000 19.60380000 39.21050000 6.535400000 69 0.000000000 81.46070000 0.000000000 22.77820000 45.55980000 7.593680000 70 0.000000000 87.20930000 0.000000000 26.46360000 52.93120000 8.822290000 71 0.000000000 93.37350000 0.000000000 30.75250000 61.50950000 10.25210000 72 0.000000000 100.0000000 0.000000000 35.75730000 71.51990000 11.92060000 73 28.34880000 100.0000000 70.37100000 46.66960000 76.18290000 55.93060000 74 67.98480000 100.0000000 74.26580000 62.78950000 84.37210000 62.15630000 75 83.59200000 100.0000000 74.15010000 72.91270000 89.59460000 62.46250000 76 100.0000000 100.0000000 79.29620000 87.83280000 97.11460000 70.92110000 77 9.863630000 9.892620000 0.000000000 0.473628000 0.571849000 0.085421100 78 0.000000000 0.000000000 2.941180000 0.007734280 0.003093910 0.040730200 79 0.000000000 0.000000000 4.491020000 0.019619500 0.007848320 0.103320000 80 0.000000000 0.000000000 6.097560000 0.038438800 0.015376500 0.202426000 81 0.000000000 0.000000000 13.15790000 0.208629000 0.083457100 1.098680000 82 0.000000000 0.000000000 17.12330000 0.372364000 0.148955000 1.960940000 83 0.000000000 0.000000000 19.23080000 0.480650000 0.192272000 2.531190000 84 0.000000000 0.000000000 21.42860000 0.609797000 0.243934000 3.211300000 85 0.000000000 0.000000000 23.72260000 0.762647000 0.305078000 4.016240000 86 0.000000000 0.000000000 26.11940000 0.942436000 0.376999000 4.963040000 87 0.000000000 0.000000000 28.62600000 1.152850000 0.461170000 6.071130000 88 0.000000000 0.000000000 31.25000000 1.398110000 0.559281000 7.362710000 89 0.000000000 0.000000000 34.00000000 1.683050000 0.673263000 8.863250000 90 0.000000000 0.000000000 36.88520000 2.013220000 0.805340000 10.60200000 91 0.000000000 0.000000000 39.91600000 2.395030000 0.958075000 12.61270000 92 0.000000000 0.000000000 43.10340000 2.835890000 1.134430000 14.93430000 93 0.000000000 0.000000000 46.46020000 3.344380000 1.337840000 17.61210000 94 0.000000000 0.000000000 50.00000000 3.930490000 1.572300000 20.69870000 95 0.000000000 0.000000000 53.73830000 4.605880000 1.842470000 24.25540000 96 0.000000000 0.000000000 66.32650000 7.316920000 2.926960000 38.53230000 97 0.000000000 0.000000000 71.05260000 8.512740000 3.405320000 44.82970000 98 0.000000000 0.000000000 76.08700000 9.895840000 3.958590000 52.11330000 99 0.000000000 0.000000000 81.46070000 11.49830000 4.599600000 60.55200000 100 0.000000000 0.000000000 87.20930000 13.35860000 5.343790000 70.34900000 101 0.000000000 0.000000000 93.37350000 15.52360000 6.209840000 81.75010000 102 0.000000000 0.000000000 100.0000000 18.05000000 7.220460000 95.05460000 103 55.83310000 0.000000000 79.89610000 22.46440000 10.30840000 58.55950000 104 65.71360000 65.46360000 80.69580000 41.72460000 41.11790000 64.77050000 105 0.000000000 16.36620000 11.20940000 0.814484000 1.394420000 0.994951000 106 11.90480000 11.90480000 11.90480000 0.881537000 0.927487000 1.010090000 107 7.763980000 0.000000000 0.000000000 0.149401000 0.077020800 0.006994160 108 0.000000000 7.763980000 0.000000000 0.129544000 0.259107000 0.043186600 109 0.000000000 0.000000000 7.763980000 0.065392700 0.026158800 0.344370000 110 0.000000000 6.097560000 0.000000000 0.076147800 0.152307000 0.025385700 111 6.097560000 0.000000000 0.000000000 0.087820400 0.045274000 0.004111270 112 0.000000000 0.000000000 1.445090000 0.001620620 0.000648290 0.008534490 113 0.476190000 0.476190000 0.476190000 0.000742788 0.000781505 0.000851104 114 0.957854000 0.957854000 0.957854000 0.003454370 0.003634430 0.003958100 115 1.445090000 1.445090000 1.445090000 0.008533690 0.008978510 0.009778110 116 9.493670000 0.000000000 0.000000000 0.232518000 0.119870000 0.010885200 117 1.937980000 1.937980000 1.937980000 0.016272000 0.017120200 0.018644900 118 0.000000000 0.000000000 9.493670000 0.101773000 0.040711700 0.535954000 119 2.436650000 2.436650000 2.436650000 0.026923800 0.028327200 0.030850000 120 2.941180000 2.941180000 2.941180000 0.040726400 0.042849200 0.046665300 121 3.451680000 3.451680000 3.451680000 0.057908400 0.060926800 0.066352800 122 3.968250000 3.968250000 3.968250000 0.078694900 0.082796800 0.090170500 123 4.491020000 4.491020000 4.491020000 0.103310000 0.108695000 0.118376000 124 5.020080000 5.020080000 5.020080000 0.131981000 0.138860000 0.151227000 125 0.000000000 0.000000000 11.29030000 0.148995000 0.059601800 0.784634000 126 5.555560000 5.555560000 5.555560000 0.164935000 0.173533000 0.188987000 127 6.097560000 6.097560000 6.097560000 0.202407000 0.212957000 0.231923000 128 8.333330000 8.333330000 8.333330000 0.402325000 0.423296000 0.460994000 129 12.52720000 12.52720000 12.52720000 0.986096000 1.037500000 1.129890000 130 13.15790000 13.15790000 13.15790000 1.098580000 1.155840000 1.258780000 131 13.79690000 13.79690000 13.79690000 1.219340000 1.282900000 1.397150000 132 14.44440000 14.44440000 14.44440000 1.348750000 1.419050000 1.545430000 133 15.76580000 15.76580000 15.76580000 1.635060000 1.720280000 1.873490000 134 16.43990000 16.43990000 16.43990000 1.792770000 1.886220000 2.054200000 135 17.12330000 17.12330000 17.12330000 1.960760000 2.062960000 2.246680000 136 17.81610000 17.81610000 17.81610000 2.139470000 2.250990000 2.451450000 137 18.51850000 18.51850000 18.51850000 2.329370000 2.450790000 2.669050000 138 19.23080000 19.23080000 19.23080000 2.530960000 2.662880000 2.900030000 139 19.95310000 19.95310000 19.95310000 2.744730000 2.887800000 3.144980000 140 20.68560000 20.68560000 20.68560000 2.971230000 3.126100000 3.404510000 141 21.42860000 21.42860000 21.42860000 3.211000000 3.378370000 3.679240000 142 22.18230000 22.18230000 22.18230000 3.464630000 3.645220000 3.969850000 143 23.72260000 23.72260000 23.72260000 4.015870000 4.225190000 4.601480000 144 24.50980000 24.50980000 24.50980000 4.314770000 4.539670000 4.943970000 145 25.30860000 25.30860000 25.30860000 4.630100000 4.871440000 5.305280000 146 26.11940000 26.11940000 26.11940000 4.962580000 5.221250000 5.686240000 147 26.94240000 26.94240000 26.94240000 5.312950000 5.589890000 6.087710000 148 27.77780000 27.77780000 27.77780000 5.682010000 5.978180000 6.510580000 149 28.62600000 28.62600000 28.62600000 6.070570000 6.386990000 6.955800000 150 29.48720000 29.48720000 29.48720000 6.479480000 6.817220000 7.424350000 151 30.36180000 30.36180000 30.36180000 6.909660000 7.269820000 7.917250000 152 31.25000000 31.25000000 31.25000000 7.362030000 7.745770000 8.435590000 153 32.15220000 32.15220000 32.15220000 7.837590000 8.246120000 8.980490000 154 33.06880000 33.06880000 33.06880000 8.337360000 8.771940000 9.553140000 155 34.00000000 34.00000000 34.00000000 8.862420000 9.324370000 10.15480000 156 34.94620000 34.94620000 34.94620000 9.413920000 9.904620000 10.78670000 157 35.90790000 35.90790000 35.90790000 9.993030000 10.51390000 11.45030000 158 36.88520000 36.88520000 36.88520000 10.60100000 11.15360000 12.14690000 159 37.87880000 37.87880000 37.87880000 11.23920000 11.82500000 12.87810000 160 38.88890000 38.88890000 38.88890000 11.90880000 12.52960000 13.64540000 161 39.91600000 39.91600000 39.91600000 12.61150000 13.26890000 14.45060000 162 40.96050000 40.96050000 40.96050000 13.34870000 14.04450000 15.29520000 163 42.02280000 42.02280000 42.02280000 14.12190000 14.85800000 16.18120000 164 43.10340000 43.10340000 43.10340000 14.93290000 15.71130000 17.11050000 165 44.20290000 44.20290000 44.20290000 15.78340000 16.60610000 18.08500000 166 45.32160000 45.32160000 45.32160000 16.67530000 17.54450000 19.10700000 167 46.46020000 46.46020000 46.46020000 17.61050000 18.52840000 20.17850000 168 47.61900000 47.61900000 47.61900000 18.59100000 19.56000000 21.30200000 169 48.79880000 48.79880000 48.79880000 19.61900000 20.64160000 22.47990000 170 50.00000000 50.00000000 50.00000000 20.69670000 21.77560000 23.71480000 171 51.22320000 51.22320000 51.22320000 21.82670000 22.96440000 25.00950000 172 52.46910000 52.46910000 52.46910000 23.01130000 24.21070000 26.36680000 173 53.73830000 53.73830000 53.73830000 24.25320000 25.51740000 27.78990000 174 55.03140000 55.03140000 55.03140000 25.55520000 26.88730000 29.28180000 175 56.34920000 56.34920000 56.34920000 26.92030000 28.32360000 30.84600000 176 57.69230000 57.69230000 57.69230000 28.35170000 29.82950000 32.48600000 177 59.06150000 59.06150000 59.06150000 29.85250000 31.40860000 34.20580000 178 60.45750000 60.45750000 60.45750000 31.42640000 33.06450000 36.00910000 179 61.88120000 61.88120000 61.88120000 33.07690000 34.80100000 37.90030000 180 63.33330000 63.33330000 63.33330000 34.80800000 36.62230000 39.88380000 181 64.81480000 64.81480000 64.81480000 36.62380000 38.53280000 41.96440000 182 66.32650000 66.32650000 66.32650000 38.52870000 40.53700000 44.14710000 183 67.86940000 67.86940000 67.86940000 40.52730000 42.63970000 46.43710000 184 69.44440000 69.44440000 69.44440000 42.62450000 44.84630000 48.84020000 185 71.05260000 71.05260000 71.05260000 44.82550000 47.16200000 51.36210000 186 72.69500000 72.69500000 72.69500000 47.13590000 49.59280000 54.00940000 187 74.37280000 74.37280000 74.37280000 49.56140000 52.14480000 56.78870000 188 76.08700000 76.08700000 76.08700000 52.10840000 54.82460000 59.70710000 189 77.83880000 77.83880000 77.83880000 54.78350000 57.63910000 62.77220000 190 79.62960000 79.62960000 79.62960000 57.59360000 60.59570000 65.99220000 191 81.46070000 81.46070000 81.46070000 60.54640000 63.70230000 69.37550000 192 83.33330000 83.33330000 83.33330000 63.64960000 66.96740000 72.93130000 193 85.24900000 85.24900000 85.24900000 66.91200000 70.39970000 76.66940000 194 87.20930000 87.20930000 87.20930000 70.34240000 74.00900000 80.60010000 195 89.21570000 89.21570000 89.21570000 73.95070000 77.80530000 84.73450000 196 91.26980000 91.26980000 91.26980000 77.74700000 81.79960000 89.08440000 197 100.0000000 100.0000000 91.96320000 92.00840000 98.78500000 92.91030000 198 100.0000000 81.60980000 76.74380000 74.19320000 71.03720000 62.66260000 199 100.0000000 84.45000000 86.88810000 79.14620000 75.87800000 79.93090000 200 10.94810000 0.000000000 9.601720000 0.422464000 0.205741000 0.564354000 201 0.000000000 0.000000000 15.10070000 0.282430000 0.112979000 1.487330000 202 0.000000000 10.33340000 22.67520000 0.933476000 0.762126000 3.717550000 203 29.91970000 0.000000000 42.70670000 5.681600000 2.608070000 14.76950000 204 44.35130000 0.000000000 67.30290000 14.45470000 6.579090000 40.11370000 205 49.52420000 69.01080000 78.69820000 35.26760000 40.43180000 61.81220000 206 23.75210000 70.09500000 0.000000000 18.11520000 33.63920000 5.538480000 207 53.09250000 71.70330000 0.000000000 27.45220000 39.69580000 6.215520000 208 100.0000000 85.42810000 33.11380000 68.11600000 72.47760000 18.72450000 209 100.0000000 91.35830000 69.54470000 78.67070000 83.13580000 54.46620000 210 46.72430000 20.89060000 43.02070000 11.70290000 7.402950000 15.61430000 211 66.90700000 19.55090000 51.63590000 22.24650000 12.44730000 23.34420000 212 0.000000000 0.000000000 57.69230000 5.384230000 2.153830000 28.35430000 213 0.000000000 45.59070000 80.88170000 17.67500000 17.24030000 61.72840000 214 0.000000000 62.98100000 84.26860000 25.32340000 30.82840000 69.54960000 215 0.000000000 45.08500000 59.05490000 11.86950000 14.67140000 31.91550000 216 0.000000000 64.62960000 71.11170000 22.22020000 30.79730000 49.47620000 217 0.000000000 52.38060000 57.51790000 13.97350000 19.39080000 31.04160000 218 0.000000000 69.86820000 68.43220000 24.08930000 35.64120000 46.69180000 219 0.000000000 70.48080000 100.0000000 34.61680000 40.35660000 100.5780000 220 0.000000000 79.35790000 100.0000000 39.55510000 50.23390000 102.2240000 221 0.000000000 88.78420000 100.0000000 45.57600000 62.27660000 104.2310000 222 0.000000000 41.38020000 31.03300000 6.512640000 10.82310000 8.962870000 223 0.000000000 58.32010000 30.07070000 12.20790000 22.36190000 10.40700000 224 47.77500000 37.97340000 0.000000000 12.37600000 12.69220000 1.797710000 225 61.25000000 46.87190000 0.000000000 20.78650000 20.74470000 2.908840000 226 70.64520000 60.11200000 0.000000000 30.87940000 33.25200000 4.791160000 227 83.29470000 84.23340000 0.000000000 52.10640000 63.26250000 9.465270000 228 65.23390000 68.26600000 0.000000000 31.56060000 39.19800000 5.902970000 229 68.39920000 78.31160000 14.21970000 39.02120000 51.09640000 9.103550000 230 74.32500000 100.0000000 38.72730000 59.47160000 83.48650000 24.72720000 231 79.58850000 100.0000000 84.97470000 73.33500000 89.43500000 79.53460000 232 0.000000000 18.62310000 21.20980000 1.483450000 2.013140000 3.435440000 233 0.000000000 25.31750000 31.72670000 3.188680000 4.064940000 8.193120000 234 0.000000000 34.90900000 45.97710000 6.801720000 8.374630000 18.38980000 235 68.27620000 43.77400000 49.31960000 27.44230000 22.33530000 22.85580000 236 76.82380000 70.03830000 53.78700000 44.04710000 46.43160000 30.83190000 237 0.000000000 32.92980000 28.79140000 4.275250000 6.682900000 7.184590000 238 0.000000000 73.75240000 63.54720000 24.96480000 39.27720000 41.17270000 239 0.000000000 100.0000000 77.27440000 45.99600000 75.61560000 65.83920000 240 0.000000000 100.0000000 88.30430000 49.48760000 77.01240000 84.22670000 241 0.000000000 100.0000000 100.0000000 53.80730000 78.74040000 106.9750000 242 0.000000000 39.39160000 61.53190000 10.81250000 11.69960000 34.20710000 243 0.000000000 44.09460000 100.0000000 23.95600000 19.03330000 97.02350000 244 0.000000000 52.35390000 100.0000000 26.66540000 24.45240000 97.92680000 245 0.000000000 61.07990000 100.0000000 30.14230000 31.40680000 99.08590000 246 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 247 41.54630000 0.000000000 12.81390000 6.172290000 3.159260000 1.316250000 248 70.31060000 0.000000000 23.65710000 19.76310000 10.10090000 4.881600000 249 84.78780000 0.000000000 47.23920000 32.15640000 16.17690000 19.61110000 250 100.0000000 0.000000000 52.92420000 45.69230000 23.04130000 25.38520000 251 100.0000000 0.000000000 63.08060000 47.79090000 23.88080000 36.43710000 252 100.0000000 0.000000000 86.90030000 54.49320000 26.56190000 71.73250000 253 68.22890000 19.45920000 60.43860000 24.73070000 13.51140000 32.56630000 254 48.72460000 0.000000000 34.30220000 10.20000000 5.060170000 9.434580000 255 53.83400000 0.000000000 45.04880000 13.68920000 6.696250000 16.95140000 256 67.68530000 0.000000000 45.44390000 20.66480000 10.28540000 17.59420000 257 81.86040000 0.000000000 57.65320000 31.93040000 15.84010000 29.55520000 258 85.37840000 0.000000000 88.42760000 42.90120000 20.52610000 73.89210000 259 35.12170000 51.67870000 44.44730000 15.53660000 20.08960000 18.96210000 260 35.46710000 50.54140000 54.26730000 16.89880000 20.00510000 27.63910000 261 35.06590000 58.32980000 61.56210000 21.25310000 26.46190000 36.54150000 262 37.98160000 74.68580000 93.19550000 39.18280000 46.35280000 87.91110000 263 64.46880000 83.77100000 100.0000000 57.97760000 63.76650000 103.8650000 264 78.79220000 83.70940000 100.0000000 66.64850000 68.17850000 104.2600000 265 100.0000000 91.11700000 100.0000000 88.43020000 86.76780000 106.7000000 266 24.52780000 0.000000000 30.82510000 3.231760000 1.509370000 7.232100000 267 26.78640000 0.000000000 70.09100000 10.53740000 4.478100000 43.61270000 268 32.26250000 0.000000000 100.0000000 21.47630000 8.986810000 95.21500000 269 41.60570000 26.46420000 100.0000000 25.96590000 14.15420000 95.97590000 270 43.49310000 55.64040000 100.0000000 34.50830000 30.32830000 98.64760000 271 49.41410000 69.26280000 100.0000000 42.74380000 43.62120000 100.7790000 272 87.38650000 68.53030000 100.0000000 64.28200000 54.17770000 101.6820000 273 100.0000000 70.32150000 100.0000000 75.77310000 61.45180000 102.4810000 274 57.05340000 10.24880000 17.93840000 12.65460000 6.830390000 2.813580000 275 81.57000000 0.000000000 14.12310000 26.59130000 13.68040000 2.517210000 276 100.0000000 100.0000000 53.18250000 81.49750000 94.58040000 37.55820000 277 23.05960000 26.79320000 0.000000000 3.611640000 4.793350000 0.734901000 278 34.13740000 29.37270000 0.000000000 6.296380000 6.834130000 0.987346000 279 32.55640000 80.25540000 32.30620000 27.04300000 46.49410000 15.43350000 280 58.17970000 100.0000000 36.82360000 50.29410000 78.78240000 23.07030000 281 83.54270000 100.0000000 54.40440000 68.25880000 87.72880000 38.14210000 282 89.27070000 100.0000000 66.01880000 75.12900000 90.98060000 51.56490000 283 66.72690000 72.46480000 50.02420000 38.48400000 45.52900000 27.38440000 284 100.0000000 87.27330000 56.80130000 72.94790000 76.35770000 38.16730000 285 57.75510000 51.51830000 31.22700000 22.04240000 23.54810000 10.70030000 286 100.0000000 53.93300000 31.98570000 51.90720000 40.24400000 12.74600000 287 100.0000000 64.63140000 35.47410000 56.77890000 49.38620000 16.22570000 288 100.0000000 67.54200000 48.16870000 59.94480000 52.88140000 26.02760000 289 50.82600000 34.81090000 23.64250000 13.57790000 12.12570000 5.592940000 290 74.50760000 34.78060000 23.70110000 25.85550000 18.44470000 6.187360000 291 74.80590000 60.99490000 100.0000000 51.88550000 42.56120000 100.0930000 292 75.51760000 71.74190000 100.0000000 57.51420000 53.13900000 101.8380000 293 0.000000000 70.77200000 33.60510000 18.35810000 34.09410000 14.21170000 294 0.000000000 85.54980000 37.24240000 27.42510000 51.56380000 19.28640000 295 0.000000000 100.0000000 38.83460000 38.01200000 72.42180000 23.79400000 296 0.000000000 100.0000000 53.37790000 40.29550000 73.33530000 35.81970000 297 0.000000000 23.42150000 12.51660000 1.655870000 3.012900000 1.474050000 298 0.000000000 33.74690000 14.29130000 3.530000000 6.660170000 2.411030000 299 76.51200000 42.82270000 64.60180000 35.33030000 25.63780000 39.28060000 300 90.95650000 61.21350000 65.16050000 52.66620000 44.37710000 42.67610000 301 35.83790000 17.90660000 19.48910000 5.626100000 4.051600000 3.080030000 302 51.74140000 23.38280000 26.49130000 12.11790000 8.307800000 6.060970000 303 86.42750000 51.87350000 84.87650000 50.94940000 37.34610000 70.49200000 304 100.0000000 57.73610000 100.0000000 69.97250000 49.84980000 100.5470000 305 0.000000000 45.49680000 16.16890000 6.655130000 12.78600000 3.837800000 306 15.40400000 54.88520000 32.03670000 11.70890000 20.05580000 10.99450000 307 25.43920000 100.0000000 91.44970000 52.61790000 78.49930000 90.10720000 308 33.60700000 100.0000000 100.0000000 57.55550000 80.67260000 107.1510000 309 0.000000000 35.99710000 66.56310000 11.15450000 10.51070000 40.09540000 310 0.000000000 37.62620000 83.49760000 16.30660000 13.19000000 65.32080000 311 25.70480000 0.000000000 22.66030000 2.768260000 1.347470000 3.728610000 312 100.0000000 0.000000000 25.12220000 42.10360000 21.60570000 6.486400000 313 100.0000000 0.000000000 34.27690000 42.95180000 21.94500000 10.95330000 314 100.0000000 0.000000000 43.47890000 44.12900000 22.41590000 17.15240000 315 16.94390000 0.000000000 19.64370000 1.334900000 0.630008000 2.691180000 316 15.27790000 8.502690000 21.40190000 1.428370000 0.901001000 3.286270000 317 11.55950000 25.56510000 33.91570000 3.813350000 4.416590000 9.425510000 318 0.000000000 53.56840000 44.48770000 12.10100000 19.33940000 19.03010000 319 0.000000000 65.37960000 51.20780000 18.18600000 29.74650000 26.49600000 320 0.000000000 82.14170000 58.76390000 28.80570000 48.64440000 37.25950000 321 0.000000000 100.0000000 65.27270000 42.82100000 74.34550000 49.11920000 322 17.92590000 21.10810000 13.36620000 2.325500000 2.908900000 1.570930000 323 24.55140000 17.89220000 17.91850000 3.103020000 2.758380000 2.525640000 324 32.26720000 35.31460000 82.87670000 18.99400000 13.79320000 64.25970000 325 20.95070000 32.28680000 39.12180000 6.593070000 7.552180000 13.12150000 326 37.29560000 37.04950000 52.32510000 13.08390000 12.22260000 24.43800000 327 46.70300000 100.0000000 79.55160000 54.40020000 79.87020000 69.75730000 328 56.97890000 100.0000000 100.0000000 65.77650000 84.91080000 107.5360000 329 0.000000000 43.67700000 24.89290000 6.631510000 11.90730000 6.393010000 330 0.000000000 70.38840000 45.80690000 19.76090000 34.33750000 22.57910000 331 49.68160000 69.57050000 48.97210000 28.70950000 38.26910000 25.55620000 332 100.0000000 70.42320000 68.15070000 65.54230000 57.44310000 48.34500000 333 53.40590000 35.08430000 32.46350000 15.47310000 13.10500000 9.683100000 334 71.03330000 33.87260000 31.11420000 24.12880000 17.18840000 9.304860000 335 100.0000000 53.27580000 42.16010000 52.89220000 40.24650000 19.14000000 336 100.0000000 77.17180000 53.54310000 66.03140000 63.53800000 32.73470000 337 100.0000000 21.12680000 0.000000000 42.40940000 23.60170000 2.320910000 338 100.0000000 21.04540000 18.88240000 42.86120000 23.76660000 4.749060000 339 100.0000000 21.68090000 40.48210000 44.94840000 24.72710000 15.35320000 340 100.0000000 19.02560000 51.30270000 46.32770000 24.78350000 24.14390000 341 51.58180000 24.09540000 0.000000000 11.18010000 8.084860000 0.971428000 342 71.14940000 23.40830000 0.000000000 20.97430000 12.99100000 1.402330000 343 84.52920000 36.02010000 0.000000000 32.28080000 22.26150000 2.595950000 344 100.0000000 36.08740000 0.000000000 45.03940000 28.86210000 3.197710000 345 100.0000000 73.56880000 0.000000000 59.44360000 57.67260000 7.999690000 346 100.0000000 86.17350000 0.000000000 67.01580000 72.81800000 10.52400000 347 15.10070000 15.10070000 15.10070000 1.487190000 1.564710000 1.704060000 348 10.08490000 10.08490000 10.08490000 0.612056000 0.643959000 0.701309000 349 0.000000000 11.29030000 0.000000000 0.295161000 0.590365000 0.098399100 350 11.29030000 11.29030000 11.29030000 0.784561000 0.825456000 0.898969000 351 40.36230000 32.79050000 25.84320000 9.606860000 9.417190000 6.137270000 352 47.73890000 38.56910000 47.42830000 16.01010000 14.38120000 20.27580000 353 47.51700000 39.87250000 62.61730000 19.20860000 16.18500000 35.90530000 354 59.89720000 62.95070000 100.0000000 44.33070000 39.95280000 99.98780000 355 65.58440000 75.65990000 100.0000000 53.72090000 54.35600000 102.2730000 356 100.0000000 80.84430000 100.0000000 81.68940000 73.28520000 104.4530000 357 45.74350000 22.67340000 29.48030000 9.981640000 7.034360000 7.278390000 358 53.92080000 28.84010000 42.45540000 15.66620000 11.20620000 15.71520000 359 75.30950000 29.37450000 44.14200000 27.50940000 17.42540000 17.57770000 360 38.12510000 41.34480000 22.11150000 10.72600000 13.06440000 5.381190000 361 37.85270000 75.21170000 41.88290000 26.64260000 41.80040000 20.61920000 362 44.94770000 100.0000000 44.47740000 45.90030000 76.39790000 28.25450000 363 27.82910000 42.06700000 60.86510000 13.85740000 14.35010000 33.78830000 364 45.53960000 54.98260000 60.91670000 22.97550000 25.38920000 35.49780000 365 50.84600000 73.25150000 74.56890000 36.81720000 44.65890000 56.30190000 366 58.24590000 83.01470000 75.60540000 46.06580000 57.87310000 59.89470000 367 41.79670000 60.83140000 53.76490000 22.65020000 28.93640000 28.56060000 368 52.81550000 100.0000000 57.36450000 51.20410000 78.86900000 40.39600000 369 52.66790000 100.0000000 69.15840000 53.84640000 79.91880000 54.63510000 370 63.00490000 100.0000000 83.41090000 62.80050000 84.06240000 76.40560000 371 28.23840000 0.000000000 17.02260000 2.923680000 1.464790000 2.055330000 372 44.93150000 13.47710000 100.0000000 25.58450000 11.75150000 95.53220000 373 56.74050000 24.06330000 100.0000000 31.46820000 16.45240000 96.12950000 374 70.66040000 33.59710000 100.0000000 40.51140000 23.62180000 97.03690000 375 86.98590000 44.71320000 100.0000000 54.48830000 35.04640000 98.50550000 376 23.51830000 10.56320000 76.16640000 11.88310000 5.358990000 52.39810000 377 38.74230000 20.56940000 76.20250000 16.15720000 8.821790000 52.89550000 378 59.54810000 39.57380000 75.90410000 27.68750000 20.04860000 54.00770000 379 72.45280000 58.73980000 76.83110000 41.50840000 36.70560000 57.89050000 380 93.37350000 93.37350000 93.37350000 81.74250000 86.00330000 93.66260000 381 95.52850000 95.52850000 95.52850000 85.94890000 90.42900000 98.48230000 382 97.73660000 97.73660000 97.73660000 90.37880000 95.08980000 103.5580000 383 0.000000000 15.57160000 35.87560000 2.492600000 1.954910000 10.17380000 384 0.000000000 19.86960000 35.08170000 2.826180000 2.767670000 9.836340000 385 27.00260000 20.61760000 50.36790000 7.420640000 5.011740000 21.51350000 386 26.97610000 29.77110000 61.05270000 10.89920000 8.610580000 33.05190000 387 41.67990000 28.86190000 62.91330000 14.85750000 10.35940000 35.36250000 388 45.94140000 77.64390000 71.80230000 36.66280000 48.32450000 53.05850000 389 47.79290000 80.80180000 83.00370000 42.48890000 53.73860000 70.94300000 390 46.83360000 84.04540000 100.0000000 50.22460000 60.02910000 103.5520000 391 0.000000000 21.06240000 64.94430000 8.148840000 5.120820000 37.17600000 392 0.000000000 29.32450000 67.53760000 10.02210000 7.862490000 40.89930000 393 0.000000000 48.99920000 72.75430000 16.41530000 18.48380000 49.70770000 394 100.0000000 49.20250000 74.82600000 58.29300000 40.10810000 54.66890000 395 100.0000000 64.00690000 80.14890000 65.73690000 52.50670000 64.82720000 396 57.06540000 42.30960000 47.42200000 20.90060000 18.37720000 20.78400000 397 62.55650000 48.61410000 48.63840000 25.71670000 23.69730000 22.60750000 398 22.94690000 22.94690000 22.94690000 3.732700000 3.927270000 4.277020000 399 25.02750000 20.22760000 23.59470000 3.777880000 3.440350000 4.415270000 400 25.09310000 20.96920000 34.81140000 4.895900000 4.029210000 9.811340000 401 100.0000000 37.77550000 37.72810000 47.55720000 30.51260000 14.47380000 402 100.0000000 39.36850000 47.13230000 49.29280000 31.84640000 21.64230000 403 100.0000000 46.32630000 60.42730000 53.78340000 36.81210000 35.52010000 404 100.0000000 60.04890000 63.27230000 59.48270000 47.19590000 40.55120000 405 58.97390000 17.19250000 0.000000000 13.65450000 8.144180000 0.852494000 406 82.86290000 20.24720000 0.000000000 28.34100000 16.19380000 1.632350000 407 100.0000000 56.66120000 18.74620000 51.94430000 41.94590000 7.741180000 408 100.0000000 77.13630000 20.41770000 61.99010000 61.88860000 11.55330000 409 100.0000000 100.0000000 21.17330000 77.58970000 93.01710000 16.97890000 410 10.24510000 0.000000000 17.23850000 0.652821000 0.292900000 2.002950000 411 0.000000000 12.12380000 19.33590000 0.831656000 0.885062000 2.676800000 412 0.000000000 0.000000000 61.88120000 6.281580000 2.512790000 33.08000000 413 42.03990000 0.000000000 85.33520000 18.86810000 8.256090000 67.35420000 414 57.02950000 0.000000000 100.0000000 30.04260000 13.40300000 95.61610000 415 78.47000000 0.000000000 100.0000000 42.24540000 19.69390000 96.18730000 416 100.0000000 0.000000000 100.0000000 59.28850000 28.48010000 96.98520000 417 100.0000000 24.20990000 100.0000000 60.86840000 31.64020000 97.51190000 418 37.22360000 0.000000000 35.69940000 6.566480000 3.168800000 10.08650000 419 46.36570000 0.000000000 50.64270000 11.64910000 5.538560000 21.64440000 420 57.03430000 0.000000000 64.07960000 18.77760000 8.896980000 36.28130000 421 100.0000000 0.000000000 74.74930000 50.75570000 25.06680000 52.05020000 422 100.0000000 36.75840000 74.33500000 54.59820000 32.93740000 52.76080000 423 100.0000000 41.64100000 86.47080000 59.55680000 36.91970000 72.71190000 424 100.0000000 42.18430000 100.0000000 64.64630000 39.19660000 98.77130000 425 63.15820000 0.000000000 28.23930000 16.12970000 8.186080000 6.594990000 426 74.75620000 0.000000000 36.88390000 23.76130000 12.01720000 11.61930000 427 85.46240000 0.000000000 35.39810000 31.03080000 15.78490000 11.05120000 428 0.000000000 17.76410000 50.28520000 4.779700000 3.191680000 21.22580000 429 0.000000000 17.81970000 86.07750000 13.78560000 6.803070000 68.62520000 430 0.000000000 16.51100000 100.0000000 18.73090000 8.582350000 95.28160000 431 0.000000000 35.62870000 100.0000000 21.74550000 14.61200000 96.28660000 432 41.47440000 38.77230000 100.0000000 28.45350000 19.19150000 96.81710000 433 47.94840000 48.96450000 100.0000000 33.67560000 26.31570000 97.91700000 434 62.63830000 53.19290000 100.0000000 41.71230000 32.66470000 98.71900000 435 19.99000000 35.89980000 32.71870000 6.500080000 8.750990000 9.453920000 436 25.64450000 100.0000000 45.32760000 40.99300000 73.85320000 28.69900000 437 66.12700000 100.0000000 50.96560000 56.46310000 81.72080000 34.28600000 438 44.36640000 53.42320000 28.54190000 17.05640000 22.03280000 9.357920000 439 48.49150000 65.47570000 33.87810000 24.15380000 33.17620000 13.88350000 440 59.17360000 73.79380000 78.23160000 41.85410000 47.57180000 62.11740000 441 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 442 2.941180000 0.000000000 0.000000000 0.017670400 0.009109590 0.000827230 443 8.909850000 8.909850000 8.909850000 0.466089000 0.490383000 0.534056000 444 44.40240000 84.74530000 0.000000000 31.76340000 53.26340000 8.607160000 445 44.03720000 100.0000000 0.000000000 42.54910000 75.02130000 12.23850000 446 73.93760000 100.0000000 0.000000000 56.98530000 82.46350000 12.91430000 447 86.67970000 100.0000000 0.000000000 65.87140000 87.04460000 13.33030000 448 100.0000000 100.0000000 0.000000000 76.99580000 92.77950000 13.85110000 449 100.0000000 100.0000000 66.02370000 84.23940000 95.67720000 51.99760000 450 35.78880000 15.73370000 0.000000000 4.916600000 3.443800000 0.405651000 451 41.69810000 25.61310000 0.000000000 7.811900000 6.682220000 0.878167000 452 55.59570000 34.65640000 0.000000000 14.81680000 12.80100000 1.690110000 453 84.58290000 47.60900000 0.000000000 35.52610000 28.69350000 3.666440000 454 100.0000000 50.03240000 0.000000000 49.03590000 36.85570000 4.530040000 455 100.0000000 62.38890000 0.000000000 53.90800000 46.60060000 6.154260000 456 19.76820000 43.91870000 0.000000000 7.021040000 12.31090000 2.006290000 457 26.64670000 64.35390000 39.42340000 18.14420000 29.22160000 16.90000000 458 24.80520000 66.87960000 100.0000000 34.73410000 37.73770000 100.0660000 459 44.74760000 92.09100000 100.0000000 54.91630000 70.51410000 105.3290000 460 78.54690000 92.35400000 100.0000000 72.31640000 79.76290000 106.1970000 461 89.83530000 91.55390000 100.0000000 80.07780000 82.91950000 106.3980000 462 89.83820000 100.0000000 100.0000000 86.38750000 95.53640000 108.5000000 463 100.0000000 100.0000000 100.0000000 95.04580000 100.0000000 108.9060000 464 30.61980000 36.57930000 0.000000000 6.970120000 9.406820000 1.448420000 465 32.22310000 46.29290000 0.000000000 9.989990000 14.90840000 2.351210000 466 48.54030000 50.96630000 11.69310000 16.69550000 20.64520000 3.948760000 467 48.08970000 56.97300000 0.000000000 18.61860000 25.00270000 3.844950000 468 57.42180000 57.83970000 11.96540000 23.07030000 27.79820000 5.037330000 469 83.20730000 73.44680000 0.000000000 45.66340000 50.47010000 7.335580000 470 52.45290000 47.03090000 18.35860000 17.21690000 18.92930000 5.021450000 471 55.73800000 49.73010000 38.12780000 21.26300000 22.13460000 14.50220000 472 60.26610000 53.12200000 54.81130000 27.24680000 26.69770000 28.93280000 473 11.27770000 6.767730000 15.84690000 0.749378000 0.492244000 1.701600000 474 0.000000000 8.603320000 12.70520000 0.355521000 0.402004000 1.071380000 475 0.000000000 10.11480000 40.20410000 2.664990000 1.436910000 12.89110000 476 0.000000000 12.55950000 55.24120000 5.267010000 2.703920000 25.89670000 477 21.39250000 33.55170000 87.90110000 18.21900000 12.63000000 72.72660000 478 26.32970000 47.19720000 100.0000000 27.10010000 22.06840000 97.44370000 479 50.08370000 55.35810000 68.38280000 26.57820000 27.25830000 44.87740000 480 85.07940000 54.25090000 68.95970000 46.19270000 36.72490000 46.43600000 481 100.0000000 92.72810000 91.14350000 86.24540000 87.72640000 89.54530000 482 100.0000000 100.0000000 100.0000000 95.04580000 100.0000000 108.9060000 483 11.28200000 27.83220000 24.77960000 3.326090000 4.805010000 5.151920000 484 0.000000000 26.38200000 38.65840000 4.140730000 4.710250000 12.39150000 485 0.000000000 24.79990000 51.26250000 5.817880000 4.992810000 22.42090000 486 13.04630000 27.16830000 63.48920000 9.149820000 6.971790000 35.70050000 487 0.000000000 44.00680000 41.68240000 8.514450000 12.81490000 15.83310000 488 29.05200000 83.18820000 46.05850000 29.85610000 50.42700000 25.35870000 489 46.75420000 87.43330000 52.95160000 38.81980000 59.00840000 32.71630000 490 47.64710000 87.38550000 82.90270000 46.60870000 62.11100000 72.17410000 491 0.000000000 31.64850000 21.24880000 3.446540000 5.935760000 4.101780000 492 0.000000000 58.77640000 18.51730000 11.55430000 22.40260000 6.033710000 493 45.54840000 71.56150000 15.20880000 24.73240000 38.14960000 7.564200000 494 49.77640000 91.76190000 17.57810000 38.88360000 63.94070000 12.36050000 495 23.13920000 56.89240000 0.000000000 11.99320000 21.53930000 3.525550000 496 24.88550000 100.0000000 0.000000000 37.69310000 72.51780000 12.01120000 497 74.45340000 100.0000000 22.42230000 57.98600000 82.90160000 16.47760000 498 87.13760000 100.0000000 24.13940000 67.01480000 87.54250000 17.51980000 499 28.24970000 33.96910000 28.37460000 7.016560000 8.426690000 7.183570000 500 40.83400000 32.94620000 31.87820000 10.32420000 9.772500000 8.998580000 501 100.0000000 32.93960000 52.07860000 48.64700000 29.19920000 25.60570000 502 100.0000000 37.20870000 63.52700000 51.95890000 32.05350000 38.33160000 503 100.0000000 57.13860000 69.88230000 59.88830000 45.42910000 48.63360000 504 38.55020000 21.43610000 36.89510000 8.291930000 5.836890000 11.24850000 505 59.73370000 26.33850000 35.94760000 17.08280000 11.41010000 11.27390000 506 64.42260000 24.89420000 42.18150000 20.06360000 12.52490000 15.53480000 507 20.40940000 12.95690000 10.43770000 1.776510000 1.494530000 0.851985000 508 18.15310000 19.76930000 4.327400000 1.997210000 2.529660000 0.477815000 509 15.82200000 24.03100000 26.11490000 3.211410000 3.854370000 5.512790000 510 16.84860000 68.86050000 37.15060000 18.60700000 32.72530000 16.05640000 511 36.11830000 69.92240000 52.33110000 25.01620000 36.56360000 28.51330000 512 84.02830000 79.77710000 57.78090000 55.28350000 60.17520000 37.01970000 513 100.0000000 82.61000000 67.17900000 72.25480000 71.25550000 49.39170000 514 61.04100000 71.12810000 25.12030000 31.69460000 41.33450000 10.84220000 515 68.58690000 87.43940000 23.39920000 45.35280000 62.81200000 13.61280000 516 88.46170000 89.84230000 41.40930000 62.34150000 73.78330000 24.56680000 517 87.92100000 100.0000000 42.21950000 69.53750000 88.62160000 27.64420000 518 62.40780000 74.11230000 38.27490000 35.30750000 45.41860000 18.35300000 519 64.63950000 92.82480000 40.04880000 48.56500000 69.82570000 23.56470000 520 72.65580000 94.01150000 54.77130000 56.44640000 74.88960000 36.65570000 521 19.65700000 30.38680000 9.637400000 3.861770000 5.844960000 1.476080000 522 18.01450000 32.87220000 0.000000000 4.046900000 6.682290000 1.076570000 523 81.31420000 41.81490000 18.22190000 31.84820000 24.17140000 5.225230000 524 86.69920000 59.27730000 20.18930000 41.98520000 38.39070000 8.001700000 525 100.0000000 67.48680000 21.58350000 56.91640000 51.62650000 10.21320000 526 20.86420000 17.95120000 9.943050000 2.244810000 2.359220000 0.927664000 527 22.75300000 20.64220000 0.000000000 2.702270000 3.044970000 0.445348000 528 32.28610000 31.02060000 9.641560000 6.262250000 7.262050000 1.623650000 529 33.81240000 45.31770000 13.41980000 10.28880000 14.59090000 3.416180000 530 32.64550000 53.64630000 9.055120000 12.69810000 20.03080000 3.678000000 531 16.38040000 5.029340000 10.35840000 0.944802000 0.546849000 0.701951000 532 17.12060000 0.000000000 13.06010000 1.055670000 0.520523000 1.120610000 533 16.12000000 7.635410000 15.99720000 1.190450000 0.762066000 1.764980000 534 14.83030000 12.22600000 17.37040000 1.356050000 1.176750000 2.169970000 535 20.51510000 0.000000000 55.24110000 6.159820000 2.610300000 25.83150000 536 74.18930000 22.33360000 77.55190000 33.03000000 17.80030000 55.78780000 537 85.03970000 22.49630000 90.64660000 44.76360000 23.39290000 78.39140000 538 36.66110000 0.000000000 25.40800000 5.425220000 2.694420000 4.883080000 539 83.11890000 0.000000000 23.41580000 28.20140000 14.45310000 5.188420000 540 91.53260000 45.31090000 27.02380000 41.23270000 30.44820000 9.028370000 541 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 542 0.000000000 53.78440000 36.34230000 11.09020000 19.06390000 13.30940000 543 38.99700000 65.36770000 40.87710000 21.76040000 31.76790000 18.21350000 544 52.79210000 66.72470000 56.35360000 29.92000000 36.63860000 32.29750000 545 52.71670000 57.01310000 51.25340000 24.63050000 27.64650000 25.79370000 546 60.92910000 59.45420000 51.23240000 29.41270000 31.60250000 26.28570000 547 67.88940000 63.26750000 59.15770000 36.35020000 37.47930000 35.14170000 548 76.06570000 70.33510000 61.42700000 45.26720000 47.10640000 39.10400000 549 36.00080000 22.01870000 17.04370000 6.011450000 4.960370000 2.572590000 550 43.59980000 36.13760000 17.68790000 10.85680000 11.21110000 3.688030000 551 45.43090000 43.84860000 33.04630000 14.68820000 16.05050000 10.61100000 552 46.88420000 78.69230000 33.58550000 30.54370000 46.89790000 16.02990000 553 17.18100000 93.68350000 15.55630000 32.13600000 62.52190000 11.95500000 554 17.97250000 92.65330000 55.58420000 36.14050000 62.94330000 36.24890000 555 21.30290000 92.87220000 100.0000000 49.81580000 68.71500000 105.2500000 556 24.17560000 49.33120000 53.00780000 13.84480000 17.84360000 26.14120000 557 69.11040000 57.15880000 54.24930000 33.45210000 32.21730000 29.10610000 558 72.34530000 56.41780000 59.02930000 36.05290000 33.00840000 34.15220000 559 35.10160000 49.96010000 34.99290000 13.69030000 18.39010000 12.22680000 560 42.17870000 49.53100000 33.34740000 15.41680000 19.08410000 11.32510000 561 53.43340000 59.86010000 42.54300000 24.71510000 29.59650000 18.85340000 562 74.57350000 63.26860000 55.49540000 39.64090000 39.26270000 31.40230000 563 86.98430000 70.00270000 56.86280000 51.88340000 50.37500000 34.32700000 564 94.08190000 73.57610000 72.48340000 63.16430000 58.56940000 54.59760000 565 21.01220000 12.04690000 17.42020000 2.061480000 1.523470000 2.212440000 566 67.23400000 0.000000000 13.82860000 17.45670000 8.972560000 2.031960000 567 100.0000000 0.000000000 14.56500000 41.49930000 21.36400000 3.304320000 568 100.0000000 45.15130000 18.09440000 47.88060000 33.87210000 6.218590000 569 100.0000000 89.28010000 19.59460000 69.60460000 77.19470000 13.85780000 570 100.0000000 100.0000000 38.09140000 79.15660000 93.64390000 25.23050000 571 16.27190000 17.98520000 22.17040000 2.239440000 2.298630000 3.770440000 572 14.01670000 45.18920000 62.41860000 13.18320000 15.31070000 35.81880000 573 18.99200000 51.11520000 73.09580000 18.30220000 20.52320000 50.48850000 574 19.29350000 57.83830000 92.59640000 27.07260000 28.11990000 83.88880000 575 47.13690000 59.24230000 91.46800000 34.02980000 32.61580000 82.26460000 576 46.88860000 75.85580000 100.0000000 45.31970000 50.18880000 101.9110000 577 13.27060000 40.50610000 24.58790000 6.211070000 10.38160000 6.001820000 578 11.90310000 47.30160000 23.21880000 8.001850000 14.27320000 6.146540000 579 0.000000000 71.81600000 21.39940000 17.87280000 34.77550000 8.957360000 580 9.889460000 25.83390000 9.706380000 2.183620000 3.818930000 1.182160000 581 66.03030000 25.08600000 9.544040000 18.36440000 11.99180000 1.886680000 582 68.38000000 33.12260000 0.000000000 21.02410000 15.51190000 1.886280000 583 81.43930000 38.47530000 43.58590000 33.53690000 23.45050000 17.99240000 584 91.13970000 43.87750000 61.26930000 45.61520000 31.47960000 35.88670000 585 33.51640000 46.49130000 23.12900000 11.08230000 15.48040000 6.184890000 586 41.62470000 65.55930000 22.50950000 20.80860000 31.62480000 8.569430000 587 39.09880000 29.02660000 9.436070000 7.683660000 7.445380000 1.558600000 588 47.65710000 35.45630000 10.02090000 11.85140000 11.52470000 2.200800000 589 72.18710000 56.16390000 12.81340000 30.38980000 30.57140000 5.331130000 590 80.37700000 58.44370000 65.95180000 43.70790000 37.99040000 42.90780000 591 88.99580000 66.08200000 77.95220000 56.72700000 49.38430000 61.25130000 592 91.78460000 73.08740000 89.61560000 66.27960000 59.17130000 82.26950000 593 24.47440000 46.03020000 28.64020000 9.511440000 14.40700000 8.329140000 594 22.24320000 69.76370000 29.14370000 18.90990000 33.65850000 11.78620000 595 74.92220000 89.93040000 46.43160000 53.50810000 69.23410000 28.05050000 596 82.95900000 88.94490000 59.03810000 60.64430000 71.63820000 40.32250000 597 100.0000000 91.52230000 81.48580000 82.17210000 84.72180000 72.33400000 598 45.03450000 20.66470000 52.65840000 12.65480000 7.670970000 23.90220000 599 53.72920000 24.35500000 81.69030000 23.68950000 13.25290000 61.95400000 600 27.83380000 8.828420000 31.77830000 4.098730000 2.200590000 7.812470000 601 40.60120000 8.930590000 44.13610000 8.844300000 4.476090000 16.05720000 602 57.20970000 7.029410000 56.08440000 17.23990000 8.457820000 27.24550000 603 67.41690000 10.07980000 66.29390000 24.86620000 12.31650000 39.37840000 604 83.71920000 0.000000000 70.83600000 36.35410000 17.76490000 45.83560000 605 78.52330000 20.52290000 61.06100000 31.43010000 17.12950000 33.62400000 606 100.0000000 21.23380000 62.69100000 48.88630000 26.21350000 36.36480000 607 85.00120000 20.52480000 42.07850000 32.63490000 18.14490000 15.88120000 608 91.13290000 64.17060000 53.73370000 51.70560000 46.13490000 30.31840000 609 100.0000000 73.08180000 61.08780000 65.28550000 59.58720000 40.06610000 610 26.15040000 14.93200000 9.012800000 2.795420000 2.241010000 0.761094000 611 28.26600000 12.03120000 0.000000000 2.901060000 1.999520000 0.233081000 612 43.58280000 13.49900000 0.000000000 7.075830000 4.296910000 0.456543000 613 43.09630000 43.43380000 81.19570000 23.60600000 19.33270000 62.32750000 614 60.56650000 83.41310000 83.83020000 49.93220000 59.95210000 73.13390000 615 60.93400000 83.22900000 90.50130000 52.24530000 60.71250000 84.93190000 616 73.41490000 90.51630000 92.78380000 64.92900000 74.34410000 91.17210000 617 72.72810000 100.0000000 92.15440000 71.31040000 88.10660000 92.30020000 618 24.05490000 40.86220000 44.31740000 9.806520000 12.12370000 17.62450000 619 34.20180000 39.96800000 61.33950000 14.81510000 13.99010000 34.21510000 620 50.52100000 45.41190000 60.22910000 21.40660000 19.70660000 33.69940000 621 54.01600000 47.19750000 77.55110000 27.82110000 23.33320000 57.12900000 622 20.08960000 19.16670000 27.73920000 3.229870000 2.944120000 6.036910000 623 17.10040000 79.29850000 27.88650000 23.40630000 43.81530000 12.92870000 624 47.49680000 79.54390000 56.12300000 34.70430000 49.39740000 34.26750000 625 49.89310000 81.19930000 65.98360000 38.78950000 52.74040000 46.05410000 626 72.75430000 42.32810000 32.11090000 27.37040000 21.95290000 10.57490000 627 82.87780000 46.15940000 30.98950000 35.18930000 27.67900000 10.68310000 628 65.25250000 35.72640000 21.69030000 20.47140000 16.00090000 5.292600000 629 72.08460000 41.91780000 20.33430000 25.90260000 21.13510000 5.562930000 630 82.65980000 65.20770000 30.75010000 42.43990000 42.45230000 13.03090000 631 85.57390000 80.61410000 49.40870000 55.36550000 61.14920000 28.95590000 632 9.743040000 18.03620000 16.55700000 1.418900000 1.919200000 2.108330000 633 0.000000000 23.28540000 20.45090000 2.000530000 3.120840000 3.381330000 634 0.000000000 57.74660000 55.13530000 15.56170000 23.32770000 29.22700000 635 0.000000000 57.39860000 71.30380000 19.12620000 24.52770000 48.69510000 636 0.000000000 72.90340000 85.56570000 30.65620000 40.81750000 73.41520000 637 0.000000000 82.17610000 86.25440000 36.25960000 51.66040000 76.40720000 638 43.25030000 90.55320000 92.11920000 50.34300000 66.89050000 89.24350000 639 64.01310000 92.11460000 100.0000000 63.35930000 74.89160000 105.7290000 640 37.18560000 29.46270000 52.97830000 11.57940000 9.066310000 24.53770000 641 53.80240000 31.14780000 77.38360000 23.57090000 15.04760000 55.49690000 642 57.91760000 38.96520000 100.0000000 34.95670000 22.61660000 97.13550000 643 17.27420000 0.000000000 39.70910000 3.235130000 1.394310000 12.51000000 644 22.49960000 9.290780000 40.04310000 4.155040000 2.148900000 12.83790000 645 26.37300000 50.72010000 39.38780000 12.56040000 18.13560000 15.03020000 646 28.82490000 54.96190000 52.78630000 16.69010000 22.32640000 26.64180000 647 39.54670000 56.26410000 55.18790000 20.33880000 24.90710000 29.33380000 648 43.21670000 57.96170000 73.49440000 26.46210000 28.58120000 52.18530000 649 0.000000000 12.92710000 12.89570000 0.597116000 0.874942000 1.183630000 650 56.85900000 33.03400000 9.660840000 15.14900000 12.44340000 2.157920000 651 69.44780000 42.66730000 0.000000000 23.98960000 20.52330000 2.697330000 652 79.21360000 54.23070000 0.000000000 34.01170000 31.35460000 4.259880000 653 86.49030000 64.75280000 0.000000000 43.71890000 42.95090000 5.986690000 654 92.79830000 65.60920000 11.23070000 49.28740000 46.40300000 7.131530000 655 29.17280000 18.80550000 0.000000000 3.652300000 3.228650000 0.430743000 656 28.51560000 37.41760000 51.03910000 10.83990000 11.22380000 23.15090000 657 36.41860000 49.54730000 58.91270000 17.74260000 19.82650000 32.44390000 658 65.21250000 52.54370000 65.49630000 31.90670000 28.51950000 41.12850000 659 73.16400000 64.87650000 65.76840000 41.73200000 41.18280000 43.39670000 660 59.45370000 27.83610000 22.47730000 15.96720000 11.34160000 4.898290000 661 75.84910000 71.31640000 19.93170000 39.97560000 45.78980000 9.457690000 662 83.17420000 71.03910000 26.41190000 45.32310000 48.27970000 11.99310000 663 34.87770000 0.000000000 55.46690000 9.004920000 4.071940000 26.19480000 664 34.53240000 9.466650000 64.63450000 11.09190000 5.217230000 36.65660000 665 50.89930000 12.50310000 82.43510000 21.51130000 10.27490000 62.71680000 666 69.01010000 16.04420000 100.0000000 36.92980000 17.90260000 96.12170000 667 0.000000000 9.480420000 28.66380000 1.357200000 0.864532000 6.155810000 668 9.978890000 18.24330000 31.29340000 2.509790000 2.390770000 7.680040000 669 10.13370000 18.70570000 45.06590000 4.291940000 3.181490000 16.78180000 670 27.04720000 16.36700000 65.57660000 10.12910000 5.389160000 37.91210000 671 45.82180000 36.82510000 79.19860000 22.19350000 16.09280000 58.58740000 672 58.23390000 50.20080000 90.00280000 34.72970000 27.91250000 78.60670000 673 0.000000000 84.93780000 21.55530000 25.58920000 50.19360000 11.57800000 674 0.000000000 100.0000000 21.82760000 36.39240000 71.77390000 15.26480000 675 25.66410000 100.0000000 27.61850000 38.89430000 73.01400000 17.62870000 676 80.52120000 31.17720000 31.83290000 29.81980000 19.29570000 9.785600000 677 91.70420000 31.54770000 37.10210000 38.95430000 24.04510000 13.27810000 678 90.23710000 34.52550000 63.04480000 42.89190000 26.47590000 37.15320000 679 91.56160000 46.34520000 78.42920000 51.13790000 34.92380000 59.49360000 680 91.24330000 100.0000000 82.22860000 81.20660000 93.59460000 75.31320000 681 31.82140000 38.19640000 36.47830000 9.595450000 11.11360000 11.93780000 682 30.55530000 38.20240000 41.25570000 9.923680000 11.21440000 15.14100000 683 30.25970000 89.50930000 67.57440000 38.62180000 60.63340000 49.62600000 684 48.70020000 89.08840000 75.88430000 46.04630000 63.77610000 61.45090000 685 67.93730000 92.74280000 78.81670000 58.61360000 73.96210000 67.23910000 686 25.48940000 42.06780000 32.45230000 8.885100000 12.31120000 9.870990000 687 37.70120000 57.75460000 32.00750000 16.99160000 24.46230000 11.55120000 688 54.84670000 60.02530000 34.01680000 24.32900000 29.62550000 13.26790000 689 58.19120000 82.06230000 42.48220000 38.43300000 53.86470000 22.76950000 690 23.85990000 31.32110000 19.31260000 5.033360000 6.671320000 3.565510000 691 28.86210000 37.43070000 19.10200000 7.274590000 9.810820000 3.992810000 692 27.75920000 53.29410000 17.48600000 11.81090000 19.34490000 5.155470000 693 25.62090000 58.69930000 26.11720000 14.08600000 23.60240000 8.752490000 694 83.31550000 70.96980000 65.40290000 51.51870000 50.71220000 44.26190000 695 84.98240000 81.82770000 75.02310000 61.43110000 64.71440000 59.54310000 696 21.85560000 19.64770000 16.07330000 2.777130000 2.876160000 2.107040000 697 19.78060000 23.52310000 36.12960000 4.575010000 4.338060000 10.67930000 698 19.55040000 28.37630000 46.99610000 6.808710000 6.439830000 18.86210000 699 21.27100000 53.84450000 46.30250000 13.85420000 20.36390000 20.60010000 700 32.63660000 75.84370000 49.32390000 26.79500000 42.27290000 26.74210000 701 9.296120000 17.96540000 10.41760000 1.166640000 1.804110000 0.941093000 702 11.62640000 19.93890000 6.612350000 1.440020000 2.267690000 0.602626000 703 36.32110000 81.79470000 15.14410000 27.71460000 48.37750000 9.367210000 704 43.83890000 100.0000000 24.00490000 43.26480000 75.29980000 16.35750000 705 20.14560000 42.31670000 10.09510000 6.727700000 11.46420000 2.468930000 706 27.20660000 84.78290000 0.000000000 27.22650000 50.96050000 8.401720000 707 58.23280000 84.99840000 53.24140000 42.07940000 58.30310000 32.69060000 708 79.22280000 85.91870000 72.24270000 59.14830000 67.49390000 56.19210000 709 43.77480000 27.74120000 35.68380000 10.70640000 8.467620000 10.88170000 710 69.12360000 39.13290000 39.93590000 25.24650000 19.48200000 14.99780000 711 78.84320000 48.09370000 45.08620000 34.72830000 28.15450000 20.01460000 712 41.04650000 25.09110000 26.08910000 8.467680000 6.794180000 5.792550000 713 43.67160000 29.00900000 24.65860000 9.850370000 8.473420000 5.469120000 714 57.24700000 38.03990000 50.98100000 20.46340000 16.41200000 23.59130000 715 63.21830000 37.94490000 60.00190000 25.15640000 18.59240000 33.02990000 716 25.02050000 9.456150000 51.08270000 6.278920000 3.057800000 21.85560000 717 71.57470000 0.000000000 73.98450000 29.06900000 13.91120000 49.92410000 718 74.65340000 11.40000000 81.66340000 33.54540000 16.40590000 61.99940000 719 86.75910000 15.62960000 100.0000000 48.82830000 23.98360000 96.66840000 720 54.72160000 14.51550000 68.32050000 19.27340000 9.795480000 41.80950000 721 100.0000000 21.96480000 74.55020000 51.97560000 27.59570000 52.18220000 722 100.0000000 23.25010000 86.64850000 55.85430000 29.41920000 71.77040000 723 100.0000000 54.99710000 87.10590000 64.16330000 45.79290000 75.29700000 724 13.66940000 22.76260000 0.000000000 1.897950000 3.026630000 0.484189000 725 19.02520000 24.63370000 10.20580000 2.833170000 3.883610000 1.225760000 726 15.39720000 24.68270000 14.63440000 2.585610000 3.749990000 1.969310000 727 56.87270000 24.90190000 10.58300000 13.73030000 9.558990000 1.798990000 728 76.07810000 35.66230000 91.63420000 41.20100000 25.01770000 80.73120000 729 22.20000000 13.94390000 100.0000000 20.02540000 8.935940000 95.28170000 730 84.66790000 31.30690000 100.0000000 49.42910000 27.52570000 97.32050000 731 37.17870000 14.04210000 28.35970000 6.286690000 3.818470000 6.325710000 732 44.66840000 21.22830000 34.86670000 9.969910000 6.691110000 10.09030000 733 58.18100000 24.62320000 46.93670000 17.59160000 11.10850000 19.14520000 734 87.83390000 36.03170000 51.04250000 38.90400000 25.20500000 24.37390000 735 52.78360000 21.37710000 35.49880000 13.16840000 8.358920000 10.61950000 736 71.03220000 20.81890000 47.61840000 24.10080000 13.70000000 19.88000000 737 80.81230000 22.41070000 55.20620000 32.03250000 17.92840000 27.38920000 738 52.50290000 15.07810000 39.55670000 12.90380000 7.209020000 13.01830000 739 89.57760000 10.90290000 45.79520000 35.88600000 18.53190000 18.66910000 740 100.0000000 22.78460000 30.10810000 43.90920000 24.54030000 9.175450000 741 100.0000000 38.96610000 28.14980000 46.84940000 30.70440000 9.281960000 742 100.0000000 76.22370000 39.79890000 63.29940000 61.57720000 21.02330000 743 100.0000000 90.10400000 47.69480000 73.21540000 79.54900000 30.06750000 744 28.89730000 61.73290000 48.87420000 18.80600000 27.64050000 23.94010000 745 34.94950000 72.69240000 60.65610000 27.82840000 39.97680000 37.75940000 746 67.47540000 75.35750000 75.46870000 46.27290000 51.22640000 58.39760000 747 77.72330000 83.28260000 76.74160000 57.68970000 64.07870000 62.18570000 748 58.11440000 65.73460000 80.46930000 37.90470000 39.34750000 64.26630000 749 68.98370000 83.47910000 80.96760000 53.60880000 62.01360000 68.61580000 750 78.24500000 90.83850000 80.48270000 64.18610000 74.77060000 69.74020000 751 39.56340000 46.68410000 46.03820000 15.33980000 17.47000000 19.74560000 752 39.04990000 70.56480000 75.26030000 31.48540000 39.77570000 56.65770000 753 45.53060000 75.69990000 85.26470000 39.40610000 47.62620000 73.74990000 754 88.27200000 80.96840000 100.0000000 71.87070000 68.33580000 104.0150000 755 30.26620000 24.27010000 61.16330000 10.68820000 7.161330000 32.91080000 756 35.56730000 32.07120000 71.66490000 15.85300000 11.52400000 46.86000000 757 20.76450000 10.52910000 30.83470000 2.910730000 1.719600000 7.294480000 758 17.50940000 14.13270000 31.85210000 2.835180000 2.011240000 7.881380000 759 14.56360000 7.749620000 33.65860000 2.371000000 1.223730000 8.739630000 760 11.98030000 21.39490000 55.96370000 6.627490000 4.622250000 26.93900000 761 10.11670000 44.89670000 90.67240000 20.96530000 18.25000000 78.70040000 762 21.24040000 55.85960000 100.0000000 29.35160000 27.79680000 98.43070000 763 0.000000000 28.64560000 82.97680000 14.26140000 9.364850000 63.82070000 764 0.000000000 26.73490000 100.0000000 20.01510000 11.15100000 95.70970000 765 26.01060000 75.66050000 100.0000000 39.54640000 47.04910000 101.6100000 766 61.90840000 10.83850000 14.10080000 14.87800000 8.042550000 2.041760000 767 67.73010000 12.90590000 9.728820000 18.00820000 9.859400000 1.517110000 768 78.12990000 27.79300000 16.50770000 26.44910000 16.77300000 3.644650000 769 89.98800000 51.64230000 21.89920000 41.69930000 33.83460000 7.686240000 770 89.15680000 77.82800000 77.90800000 63.06720000 61.89790000 63.26450000 771 88.69880000 78.68160000 90.87150000 67.40600000 64.39230000 85.52860000 772 36.59070000 27.46250000 35.52590000 8.457470000 7.240860000 10.66820000 773 35.77920000 25.55150000 42.54340000 8.836040000 6.877900000 15.30530000 774 63.92000000 66.76370000 59.89700000 35.96490000 39.69820000 36.41610000 775 75.38760000 77.54730000 59.69330000 48.39860000 54.62740000 38.41380000 776 43.72380000 44.76850000 39.69050000 15.15760000 16.60650000 14.80520000 777 79.41020000 44.54380000 50.71490000 34.93180000 26.50570000 24.53110000 778 87.81460000 51.55460000 62.11090000 45.64970000 35.16720000 37.57790000 779 46.67210000 31.37420000 43.81030000 13.45080000 10.74280000 16.77100000 780 49.12410000 34.57860000 54.79480000 16.90510000 13.29690000 26.87440000 781 68.91670000 46.60100000 69.29490000 32.91220000 25.93830000 45.50160000 782 73.75250000 47.33510000 100.0000000 46.06400000 31.91050000 98.34410000 783 20.41850000 25.08640000 68.22640000 10.74700000 7.177500000 41.62950000 784 21.26710000 54.41540000 68.34850000 18.56580000 22.59270000 44.35390000 785 21.13110000 61.43960000 81.11670000 24.99220000 29.75420000 64.13800000 786 15.39690000 72.79180000 56.53490000 23.60800000 37.97980000 33.07890000 787 30.27220000 100.0000000 58.67940000 44.32470000 75.29110000 41.49220000 788 28.89860000 100.0000000 81.94840000 50.09690000 77.56670000 73.39860000 789 51.18170000 100.0000000 90.58800000 59.73390000 82.20300000 88.84570000 790 18.35740000 43.01520000 76.09580000 16.48250000 15.65690000 54.03750000 791 25.00140000 41.99780000 84.05210000 19.57960000 16.54830000 66.72960000 792 31.41090000 59.00470000 82.87530000 26.37970000 28.85850000 66.77610000 793 29.69900000 73.19840000 86.87520000 34.10650000 42.78230000 75.89360000 794 39.54270000 82.41800000 92.00410000 43.75840000 55.52020000 87.17880000 795 26.35040000 19.46190000 14.34850000 3.425200000 3.187890000 1.757890000 796 30.81660000 24.76470000 8.940710000 4.847440000 4.954090000 1.168310000 797 51.91350000 27.95140000 17.40620000 12.30620000 9.517000000 3.211950000 798 59.66690000 39.56370000 20.68790000 18.46360000 16.36120000 5.143540000 799 67.99170000 59.36080000 20.76020000 29.57890000 32.04300000 7.607500000 800 68.37510000 59.87240000 38.66270000 31.67890000 33.25460000 16.45290000 801 81.27620000 69.01730000 41.95030000 44.63060000 46.18600000 20.56730000 802 100.0000000 71.98380000 77.93080000 69.02310000 60.14230000 62.64690000 803 26.26190000 16.58880000 22.36370000 3.536910000 2.767380000 3.858950000 804 35.04700000 17.66140000 59.01810000 10.56020000 5.962560000 30.26280000 805 58.70750000 48.69180000 68.48470000 27.97840000 24.42190000 44.39070000 806 65.89950000 50.08080000 76.87950000 34.41900000 28.17560000 56.69110000 807 65.21410000 53.50210000 86.43140000 38.24070000 31.61690000 72.74280000 808 27.06650000 27.15410000 22.24110000 5.023910000 5.532500000 4.272110000 809 37.88950000 35.31200000 21.20110000 9.098800000 10.00160000 4.573290000 810 36.49980000 38.63670000 11.15750000 9.056290000 11.20900000 2.447270000 811 42.34130000 42.95490000 0.000000000 11.80530000 14.36340000 2.150350000 812 55.47560000 52.50190000 0.000000000 19.95460000 23.15740000 3.418350000 813 76.55450000 57.38450000 37.53620000 35.54910000 33.73500000 15.60490000 814 87.12530000 56.87610000 100.0000000 58.84270000 43.59710000 99.92650000 815 23.41250000 18.87030000 92.10730000 17.67050000 8.725660000 79.71570000 816 23.75670000 26.55110000 100.0000000 21.73340000 11.99290000 95.78170000 817 23.51790000 36.81240000 100.0000000 23.73040000 16.04420000 96.45850000 818 0.000000000 15.03870000 71.23710000 9.115890000 4.533800000 45.27090000 819 13.13390000 11.44050000 84.40330000 13.21020000 5.825460000 65.59030000 820 23.40030000 0.000000000 86.73630000 14.89060000 6.151900000 69.59180000 821 30.52560000 82.59170000 85.60940000 39.33880000 53.65700000 75.51140000 822 27.57600000 14.73950000 15.45400000 3.253740000 2.430650000 1.855350000 823 46.63490000 10.61360000 10.91830000 8.100220000 4.542420000 1.175460000 824 49.99330000 27.20380000 23.22510000 11.74690000 9.002930000 4.934250000 825 74.24540000 25.05120000 22.42600000 23.80000000 14.72030000 5.119910000 826 81.09320000 42.16010000 36.91330000 33.37760000 24.91850000 13.62130000 827 58.68070000 46.17380000 39.47560000 21.64250000 20.59050000 15.08540000 828 61.35030000 76.09540000 54.40210000 38.42250000 48.37260000 32.11550000 829 66.12540000 76.02670000 62.27190000 42.54430000 50.25070000 40.84250000 830 0.000000000 85.08570000 49.59580000 28.92800000 51.68230000 28.68910000 831 10.53400000 92.01340000 63.15140000 36.63690000 62.33460000 44.53190000 832 40.94710000 28.17990000 18.25800000 8.422650000 7.568070000 3.264580000 833 100.0000000 32.40630000 14.33690000 44.49050000 27.36100000 4.257590000 834 100.0000000 51.60970000 50.96990000 53.68690000 39.59770000 26.30560000 835 100.0000000 62.56750000 53.94140000 58.63220000 48.61830000 30.63830000 836 18.94880000 35.11170000 20.20700000 5.177600000 7.920170000 4.065200000 837 17.37540000 58.69230000 42.45010000 14.69780000 23.70560000 18.17490000 838 16.64260000 62.44560000 53.30420000 18.01840000 27.61340000 28.09620000 839 13.81360000 70.22980000 79.91810000 27.99270000 37.56080000 63.56350000 840 15.82700000 93.62380000 80.69380000 42.91110000 66.74640000 69.65150000 841 12.93780000 97.81400000 94.22920000 50.35820000 74.69900000 94.78330000 842 26.59190000 25.60550000 31.36630000 5.436470000 5.293070000 8.123740000 843 24.85190000 29.32420000 38.23370000 6.516790000 6.683090000 12.36630000 844 27.98710000 31.00830000 45.17150000 8.372880000 7.995640000 17.58060000 845 48.27530000 65.43690000 62.63120000 28.83380000 35.00940000 39.04820000 846 54.54980000 73.88490000 65.79580000 36.44200000 45.24040000 44.49320000 847 16.33650000 21.91510000 18.81660000 2.494450000 3.117250000 2.871850000 848 15.58310000 19.37090000 37.26160000 3.717650000 3.115150000 11.19630000 849 19.94810000 17.08950000 41.13640000 4.483740000 3.106310000 13.77690000 850 36.86440000 16.85320000 40.81180000 7.820990000 4.798990000 13.69610000 851 38.07260000 33.91280000 39.75760000 10.62100000 10.12330000 13.83900000 852 39.76770000 44.39690000 49.58560000 15.28180000 16.33330000 22.57610000 853 38.83820000 49.18550000 67.54300000 20.27760000 20.72380000 42.84850000 854 45.25340000 62.91740000 67.94430000 27.83310000 32.61930000 45.26980000 855 51.62810000 62.67820000 71.13850000 30.97000000 33.98190000 49.66690000 856 80.24220000 68.30650000 74.16220000 50.23060000 47.77250000 55.60280000 857 81.66510000 75.57260000 79.86050000 56.73590000 56.65080000 65.64220000 858 10.00700000 7.606290000 25.23400000 1.258500000 0.731725000 4.654040000 859 13.45270000 0.000000000 27.03560000 1.517120000 0.664693000 5.377400000 860 38.75420000 7.677200000 75.97110000 15.11680000 6.841610000 52.22110000 861 69.57370000 0.000000000 87.00920000 31.86100000 14.89010000 70.86370000 862 89.15070000 60.64520000 93.90100000 59.65530000 46.61130000 88.23750000 863 32.01160000 17.66440000 27.97890000 5.254160000 3.754740000 6.194410000 864 35.44040000 23.09410000 28.69610000 6.795860000 5.483940000 6.775880000 865 34.16380000 27.73180000 30.08020000 7.301540000 6.777710000 7.662140000 866 49.99820000 40.54560000 39.09890000 16.17850000 15.36670000 14.10930000 867 49.09800000 45.13000000 51.54460000 19.04520000 18.56020000 24.60690000 868 58.48090000 61.38060000 68.54810000 32.76440000 34.12970000 46.09620000 869 67.19920000 61.10670000 83.30390000 41.38650000 37.91070000 68.44670000 870 81.04840000 65.72380000 88.63440000 54.02860000 47.34610000 78.85430000 871 100.0000000 68.98770000 90.14730000 71.41160000 58.61930000 82.86600000 872 100.0000000 78.60200000 89.70540000 76.50960000 69.06300000 83.80370000 873 70.05840000 82.47060000 0.000000000 42.25930000 56.53180000 8.684970000 874 80.26920000 86.90470000 14.84610000 51.96510000 65.74540000 11.37800000 875 91.27030000 93.37560000 9.299470000 64.58450000 78.94190000 12.34390000 876 37.87690000 59.84480000 0.000000000 16.43690000 25.63750000 4.082420000 877 38.07400000 70.59150000 0.000000000 21.55600000 35.79320000 5.772930000 878 59.62050000 86.24950000 0.000000000 39.05090000 58.47560000 9.229210000 879 59.82670000 100.0000000 0.000000000 49.08170000 78.38900000 12.54430000 880 60.28770000 100.0000000 22.26230000 49.97170000 78.77120000 16.04750000 881 71.40600000 20.87850000 27.88440000 21.89130000 12.85370000 7.031440000 882 91.39610000 27.18320000 73.93690000 45.16520000 25.23690000 51.19300000 883 92.52880000 33.11210000 82.74820000 49.81210000 28.97500000 65.35290000 884 78.69870000 29.57060000 69.77860000 34.98420000 20.73210000 45.03850000 885 81.84240000 41.34510000 80.89320000 42.99040000 28.46550000 62.57960000 886 86.11180000 63.11320000 82.55100000 54.51660000 46.03040000 68.07050000 887 71.24740000 100.0000000 63.99440000 62.08660000 84.31230000 48.45190000 888 76.71650000 100.0000000 100.0000000 76.82960000 90.60900000 108.0530000 889 100.0000000 100.0000000 100.0000000 95.04580000 100.0000000 108.9060000 890 51.32810000 19.33590000 17.55760000 10.87000000 6.989010000 2.838600000 891 81.60820000 16.98080000 20.05280000 27.62580000 15.25630000 4.251420000 892 86.66620000 21.06800000 29.86020000 32.53250000 18.35310000 8.459000000 893 53.69280000 0.000000000 20.64050000 11.06490000 5.639430000 3.448980000 894 55.57810000 14.96940000 23.91940000 12.65710000 7.250220000 4.803310000 895 56.25500000 22.58510000 53.03060000 17.46690000 10.50120000 24.55530000 896 62.03470000 27.00290000 75.38200000 26.13390000 15.33510000 52.40250000 897 68.26460000 72.44200000 82.96980000 47.37950000 49.16840000 69.74690000 898 71.59770000 81.96390000 94.84990000 58.93590000 62.80530000 93.24300000 899 11.90110000 82.51170000 72.68880000 32.76160000 50.63980000 54.96010000 900 0.000000000 86.28700000 80.73100000 37.12500000 56.21740000 67.98400000 901 0.000000000 87.51640000 71.12470000 35.20080000 56.75490000 53.82050000 902 75.55560000 92.06090000 73.45120000 61.23030000 74.76440000 59.20530000 903 32.67890000 0.000000000 13.41390000 3.741930000 1.903940000 1.311230000 904 31.42690000 8.489940000 9.491790000 3.493550000 2.023380000 0.739693000 905 48.64320000 9.936640000 43.67820000 11.59530000 5.971370000 15.84580000 906 61.68080000 11.11170000 42.85250000 17.33410000 9.035960000 15.50590000 907 65.46480000 0.000000000 57.05460000 21.49710000 10.47550000 28.43000000 908 93.02220000 10.48130000 59.87840000 41.26740000 20.97180000 32.50120000 909 93.75350000 13.28680000 76.87590000 46.32990000 23.34210000 55.12510000 910 13.40800000 8.545560000 12.24210000 0.834796000 0.647289000 1.014090000 911 8.880180000 19.05410000 23.58510000 1.886750000 2.270920000 4.285680000 912 0.000000000 17.69510000 26.94970000 1.802500000 1.989820000 5.580970000 913 24.81140000 22.84260000 83.95160000 15.59910000 8.686830000 65.25230000 914 30.71680000 51.12150000 84.42010000 23.68820000 22.91310000 68.36510000 915 40.28500000 54.58560000 79.73410000 25.99660000 26.15530000 61.17500000 916 46.74080000 67.25990000 84.28570000 35.08350000 38.84610000 70.61190000 917 37.22150000 9.549400000 18.09400000 5.316890000 2.995660000 2.501500000 918 44.34980000 0.000000000 22.65540000 7.587470000 3.831960000 3.952500000 919 44.64790000 9.365870000 29.58430000 8.435780000 4.496260000 6.920110000 920 58.27010000 0.000000000 33.39280000 14.19150000 7.129270000 9.107490000 921 81.20510000 17.10800000 33.76850000 28.48310000 15.58540000 10.19780000 922 81.98150000 52.77930000 32.05990000 36.88970000 31.86710000 11.95980000 923 89.86630000 66.30120000 46.67430000 50.46370000 47.12660000 24.14560000 924 71.80480000 49.42420000 38.28340000 29.68000000 26.31760000 14.96830000 925 72.80000000 57.19000000 46.04260000 34.25800000 32.81600000 21.71450000 926 89.73020000 57.15720000 52.98120000 47.40830000 39.43880000 28.51510000 927 35.62410000 74.25880000 22.28930000 23.50850000 39.63090000 9.896320000 928 44.97320000 92.39710000 32.95750000 38.73460000 64.39960000 18.62740000 929 0.000000000 31.02000000 32.82600000 4.282930000 6.073690000 9.112540000 930 0.000000000 29.98560000 49.46620000 6.367980000 6.594360000 21.05890000 931 14.46500000 32.30160000 56.04380000 8.617480000 8.281460000 27.62350000 932 12.02760000 38.52470000 62.79710000 11.26760000 11.57460000 35.64770000 933 0.000000000 55.52880000 86.75520000 23.01240000 24.89690000 72.81510000 934 61.19670000 73.93140000 86.88590000 45.65760000 49.32900000 76.56730000 935 33.77550000 32.76560000 24.56810000 7.687030000 8.431040000 5.539860000 936 86.36770000 36.53450000 26.05850000 34.71910000 23.58830000 7.638200000 937 43.45890000 18.74320000 19.34640000 7.984100000 5.395780000 3.173640000 938 47.15980000 15.94380000 72.44980000 17.41190000 8.886120000 47.37110000 939 94.25500000 15.18750000 90.21090000 51.16430000 25.55570000 77.66810000 940 60.95530000 7.524820000 92.16520000 29.08950000 13.43360000 80.13180000 941 76.20180000 16.07210000 93.67510000 38.95980000 19.23180000 83.60790000 942 22.33490000 9.448260000 20.95910000 2.306380000 1.418100000 3.196570000 943 32.30040000 21.85040000 21.86000000 5.333180000 4.547830000 3.936380000 944 32.61760000 27.00830000 24.38010000 6.329230000 6.152810000 5.099350000 945 33.02240000 35.27250000 41.87220000 9.881800000 10.15360000 15.38600000 946 41.53290000 33.70110000 48.21500000 12.86970000 11.07030000 20.47800000 947 40.73540000 39.26520000 47.93210000 13.88000000 13.53560000 20.65600000 948 45.27520000 40.15510000 35.15190000 13.83710000 14.06130000 11.47760000 949 60.36090000 40.45710000 41.37790000 21.06680000 17.81680000 15.91630000 950 71.74630000 51.22430000 47.47210000 31.58740000 28.07060000 22.13450000 951 80.33760000 65.64880000 47.62780000 43.18320000 42.89310000 24.51740000 952 69.44660000 48.23470000 27.06170000 26.70850000 24.33250000 8.629660000 953 89.60630000 89.68040000 26.58190000 61.51580000 73.37840000 16.05640000 954 27.80370000 33.42660000 10.07600000 5.798110000 7.743900000 1.797280000 955 45.46640000 48.52940000 20.27950000 15.11780000 18.55650000 5.616640000 956 52.55640000 60.39410000 23.15260000 22.53930000 29.04830000 8.208560000 957 58.87030000 57.08370000 26.57330000 24.25960000 27.86370000 9.230630000 958 68.24330000 68.50640000 27.92560000 34.45280000 40.74090000 11.77090000 959 93.03510000 70.62730000 28.31390000 52.95240000 51.87650000 13.12190000 960 23.60300000 12.99950000 27.39670000 3.172340000 2.111990000 5.727330000 961 29.70780000 9.169240000 27.39500000 4.091180000 2.265520000 5.707790000 962 55.71130000 7.265520000 27.91930000 12.59450000 6.533020000 6.317030000 963 60.99610000 10.64610000 50.03890000 18.10050000 9.261640000 21.47150000 964 60.38670000 31.13590000 61.55480000 22.55660000 14.99040000 34.25010000 965 62.99510000 55.97900000 62.69500000 31.37240000 30.24610000 38.07070000 966 78.23760000 86.51820000 85.25420000 62.75150000 69.48930000 76.72170000 967 86.88270000 93.04920000 93.57230000 76.38380000 82.88440000 93.72430000 968 25.91930000 24.32220000 16.05210000 4.036180000 4.413010000 2.332430000 969 92.52810000 29.44310000 27.67260000 38.26380000 23.20960000 8.072790000 970 93.09680000 43.52290000 36.66390000 42.96140000 30.43840000 14.02530000 971 93.23620000 57.50150000 38.92800000 48.20730000 40.31080000 17.12130000 972 92.89330000 79.14710000 43.76380000 59.37850000 62.01330000 24.21110000 973 39.86480000 56.22260000 22.23530000 16.19570000 23.23460000 7.098300000 974 43.87840000 85.59220000 42.00200000 34.81340000 55.34190000 22.88990000 975 65.09800000 88.15050000 64.29700000 49.97280000 65.20010000 45.77090000 976 16.39050000 31.74530000 44.23610000 6.642200000 7.334070000 16.80300000 977 16.35290000 35.04550000 52.73490000 8.751470000 9.292110000 24.49460000 978 19.52160000 82.20810000 66.22480000 31.66770000 49.98650000 46.20330000 979 33.44030000 81.95220000 70.76190000 35.22530000 51.45260000 52.29560000 980 36.82270000 92.95540000 80.15040000 46.12830000 67.70620000 68.79660000 981 28.94450000 25.93420000 44.86170000 7.633310000 6.306250000 17.04600000 982 30.80460000 25.39280000 74.48080000 14.29190000 8.882270000 50.45440000 983 74.77430000 12.74300000 35.19970000 23.96150000 12.71490000 10.71270000 984 77.02670000 8.900220000 47.26850000 26.87610000 13.71390000 19.43870000 985 88.45840000 15.09600000 52.99420000 36.51570000 19.13910000 25.18350000 986 87.83730000 46.81370000 67.98330000 45.46720000 32.54870000 44.37810000 987 89.14820000 75.39260000 83.46730000 63.37520000 59.79390000 71.78530000 988 29.18910000 40.29660000 68.94290000 15.56060000 14.29420000 43.69810000 989 29.84900000 86.23980000 80.95900000 40.05180000 57.67200000 68.47820000 990 6.238760000 37.03560000 53.02900000 8.589660000 9.885750000 24.90270000 991 10.53270000 37.08830000 75.58680000 14.08220000 12.12610000 52.72230000 992 12.80030000 39.16630000 92.81950000 20.32120000 15.46270000 82.22540000 993 36.46140000 43.17030000 93.22220000 25.58960000 19.77450000 83.54830000 994 34.95320000 60.93350000 92.01980000 31.14790000 32.17920000 83.36760000 995 38.64640000 61.95710000 100.0000000 35.62390000 34.80470000 99.45290000 996 13.54190000 48.60270000 34.92100000 9.608530000 15.60850000 11.86250000 997 9.878450000 51.88920000 48.90410000 12.44530000 18.52570000 22.54220000 998 12.63890000 62.46190000 65.49880000 20.25610000 28.47840000 41.73770000 999 26.64480000 67.43530000 67.79910000 24.96170000 34.30000000 45.55570000 1000 40.60160000 68.59070000 66.61080000 28.67230000 37.09640000 44.36480000 1001 59.29950000 75.19960000 72.09200000 40.96100000 48.46430000 53.26530000 1002 59.92170000 94.23720000 86.50840000 57.87610000 74.91050000 80.19930000 1003 13.33200000 35.75840000 44.56980000 7.268210000 8.924870000 17.33940000 1004 10.54820000 42.87570000 51.78450000 10.09160000 12.95600000 24.22300000 1005 12.50540000 50.40910000 53.14330000 12.84780000 17.87310000 26.33130000 1006 8.450030000 52.51220000 62.34810000 15.23900000 19.99420000 36.53100000 1007 21.68840000 52.28740000 81.25070000 21.45510000 22.49490000 63.14040000 1008 49.88730000 52.09890000 91.87170000 32.43860000 27.64670000 82.14620000 1009 8.821240000 11.39540000 34.97880000 2.290520000 1.421130000 9.543800000 1010 14.59930000 14.98260000 61.72490000 7.395750000 3.907620000 33.10790000 1011 14.10740000 9.424530000 66.73070000 8.169320000 3.649570000 39.14260000 1012 23.90850000 29.84270000 93.30490000 19.77390000 12.11950000 82.53540000 1013 26.65150000 67.24050000 92.27610000 32.31380000 37.08870000 84.73730000 1014 17.89220000 22.98490000 29.23840000 3.554220000 3.785250000 6.874170000 1015 26.78680000 20.34020000 28.39470000 4.485660000 3.780880000 6.429460000 1016 30.12370000 18.37680000 33.22310000 5.407810000 3.882360000 8.849140000 1017 39.45870000 61.06610000 46.46550000 20.76650000 28.26280000 21.89560000 1018 44.97080000 69.61170000 58.38480000 28.76070000 38.12190000 34.81550000 1019 57.41040000 71.52190000 92.14250000 44.35620000 46.52700000 85.67240000 1020 76.11660000 55.58930000 70.16670000 40.73900000 34.63920000 47.94590000 1021 93.79200000 55.65580000 77.77690000 56.05830000 42.33200000 59.65510000 1022 93.54370000 62.35040000 88.69020000 62.12380000 49.20940000 78.88790000 1023 93.27060000 86.37000000 99.62020000 79.18690000 77.21740000 104.5550000 1024 50.82430000 52.68700000 57.71800000 23.43450000 24.42880000 31.73030000 1025 56.30380000 54.33480000 64.63740000 27.92140000 27.47480000 40.06950000 1026 63.38460000 57.47190000 72.36450000 34.56850000 32.50000000 50.90450000 1027 44.35940000 53.94440000 49.01870000 19.86580000 23.46750000 23.20640000 1028 45.06340000 92.48350000 68.64550000 45.14760000 67.06760000 51.93020000 1029 57.65870000 91.95190000 72.34080000 50.87350000 69.34480000 57.12360000 1030 30.71030000 56.12140000 37.03770000 15.14360000 22.47480000 14.18890000 1031 51.82790000 58.64280000 79.25340000 31.59850000 31.45440000 61.14310000 1032 75.95290000 61.71630000 91.81500000 49.85190000 42.33860000 83.95780000 1033 28.58140000 17.89510000 39.54690000 5.784250000 3.917550000 12.75150000 1034 30.53800000 14.37190000 45.23990000 6.692420000 3.830830000 16.92020000 1035 36.82620000 10.14340000 50.76480000 8.880520000 4.455000000 21.69370000 1036 84.72980000 78.93860000 66.61600000 57.28770000 60.23730000 47.33030000 1037 86.59390000 86.56590000 69.11000000 64.09390000 70.77100000 52.26470000 1038 11.68160000 42.48370000 14.08000000 6.050840000 11.17040000 3.106490000 1039 14.85290000 51.38550000 12.49370000 9.077130000 16.93400000 3.766120000 1040 51.33520000 51.82630000 34.47620000 19.67660000 22.45220000 12.39290000 1041 51.70760000 53.32240000 42.85720000 21.43830000 24.04520000 18.19020000 1042 79.76050000 79.24270000 91.25410000 61.27490000 61.70930000 86.04530000 1043 81.73540000 87.69640000 94.06730000 69.03330000 73.53880000 93.26200000 1044 9.637480000 16.56100000 24.79220000 1.766090000 1.831010000 4.665040000 1045 8.426810000 13.51910000 29.12300000 1.814890000 1.448580000 6.459980000 1046 29.53530000 40.93160000 48.68120000 11.54170000 12.96610000 21.32070000 1047 38.04610000 44.01390000 56.41150000 15.93100000 16.35380000 29.17990000 1048 46.55480000 47.72860000 57.25200000 19.99890000 20.13470000 30.58340000 1049 67.00280000 48.95870000 56.38940000 29.64860000 25.73020000 30.24370000 1050 18.13890000 12.95410000 14.93710000 1.640760000 1.406900000 1.630470000 1051 40.61070000 24.20300000 9.311020000 7.359960000 6.127100000 1.305980000 1052 47.37990000 22.08160000 8.279160000 9.343210000 6.723850000 1.200300000 1053 59.47990000 77.73100000 16.96070000 34.06710000 48.02560000 9.386050000 1054 61.64680000 91.38040000 18.90750000 44.02250000 66.18130000 12.88180000 1055 23.27830000 28.63140000 32.07190000 5.436460000 6.023690000 8.635230000 1056 32.20900000 28.59560000 39.40860000 8.020880000 7.248730000 13.18220000 1057 43.28980000 28.28540000 75.01950000 18.35840000 11.65880000 51.56670000 1058 51.45690000 30.18050000 91.93790000 27.13440000 16.06440000 80.31460000 1059 65.84450000 63.02620000 92.61690000 44.65510000 40.49430000 85.38980000 1060 71.43360000 73.38670000 93.26790000 53.27020000 52.55460000 88.50440000 1061 38.04620000 29.77510000 88.46990000 21.20120000 13.03460000 73.66540000 1062 37.36090000 48.47580000 87.41200000 25.43190000 22.35890000 73.35540000 1063 54.43930000 79.15380000 93.34380000 47.72370000 54.55780000 89.32870000 1064 63.50630000 93.57760000 93.23920000 61.56840000 75.82840000 92.50440000 1065 7.926100000 22.22180000 22.13220000 2.119590000 2.959780000 3.891350000 1066 20.51110000 27.32790000 20.88240000 3.903730000 5.007570000 3.780760000 1067 37.49590000 37.15300000 31.78370000 10.27200000 11.14380000 9.216210000 1068 74.66300000 72.09790000 46.93730000 42.52340000 47.38050000 24.83310000 1069 81.02140000 74.97800000 72.27170000 53.77750000 54.88250000 54.08170000 1070 93.26940000 83.10560000 77.29120000 69.42520000 69.94450000 63.53570000 1071 96.17430000 84.30100000 91.37660000 77.21260000 74.56000000 87.91450000 1072 62.02400000 20.07320000 22.91680000 16.17750000 9.811710000 4.746380000 1073 79.57570000 21.57180000 46.55990000 29.53750000 16.65930000 19.27210000 1074 79.02520000 34.05020000 61.16250000 34.04070000 21.80790000 34.50650000 1075 75.49590000 45.70120000 57.92530000 34.04610000 26.41040000 31.77740000 1076 92.74940000 90.56920000 63.87260000 70.43980000 78.23020000 46.68950000 1077 33.55570000 27.28480000 17.71980000 6.192170000 6.196900000 2.974320000 1078 32.86590000 41.70760000 35.46260000 10.64080000 13.03040000 11.63260000 1079 31.26790000 45.19930000 44.57690000 12.48800000 15.34370000 18.30890000 1080 35.22930000 63.20930000 79.35880000 28.05230000 32.56560000 61.71050000 1081 43.36800000 66.49810000 91.32720000 35.92960000 38.45700000 83.02890000 1082 30.92420000 51.28010000 68.64200000 19.24340000 21.22980000 44.44300000 1083 35.07750000 56.26140000 67.82570000 21.89700000 25.38520000 44.03120000 1084 64.49050000 70.17700000 75.58710000 41.87960000 44.82650000 57.56980000 1085 75.29530000 79.85080000 84.20070000 56.26070000 59.94030000 73.42360000 1086 89.18920000 93.83860000 86.60860000 76.31230000 83.97880000 81.15360000 1087 88.84590000 100.0000000 92.35600000 82.70530000 93.97260000 93.21270000 1088 9.169040000 15.34010000 17.51500000 1.185940000 1.426070000 2.264120000 1089 11.28350000 12.36420000 20.07640000 1.228760000 1.107560000 2.918540000 1090 7.758740000 8.455170000 19.87400000 0.822165000 0.596167000 2.780200000 1091 37.05060000 66.94820000 32.07420000 20.92090000 32.57990000 12.94640000 1092 73.04610000 79.71690000 48.48070000 46.06140000 55.56720000 27.54910000 1093 85.73830000 92.63570000 52.06020000 63.91560000 77.32030000 34.07180000 1094 42.95560000 20.41270000 13.78870000 7.747210000 5.578960000 1.880820000 1095 93.23600000 18.43900000 9.688770000 36.32620000 20.00370000 2.504840000 1096 53.58320000 0.000000000 12.81250000 10.65310000 5.469250000 1.525770000 1097 57.05280000 69.13620000 43.46470000 30.77150000 39.10520000 21.06680000 1098 56.63430000 91.68720000 48.33310000 45.00290000 66.64090000 29.61360000 1099 57.64850000 92.69780000 62.50090000 48.96660000 69.43430000 44.47750000 1100 19.66130000 58.77220000 58.02510000 17.71590000 24.99770000 32.47310000 1101 25.31460000 72.47990000 65.01490000 26.63030000 39.07570000 42.84380000 1102 11.02960000 36.82280000 36.45380000 6.258540000 8.898830000 11.67090000 1103 11.08770000 43.95170000 37.99980000 8.340490000 12.75720000 13.28950000 1104 65.58080000 67.43090000 37.18470000 33.38660000 39.29040000 16.56660000 1105 92.19480000 67.75010000 38.05720000 51.83380000 49.02100000 18.03480000 1106 66.72170000 47.29710000 10.64440000 23.95810000 22.56580000 3.779300000 1107 81.13310000 65.01260000 12.86390000 40.10750000 41.24670000 6.888590000 1108 92.60500000 86.12580000 8.715340000 60.65800000 69.48420000 10.65750000 1109 91.92170000 89.50420000 84.66040000 74.79940000 78.71380000 76.85130000 1110 68.42910000 64.66880000 71.64680000 40.28470000 40.12080000 51.06700000 1111 76.06900000 74.16780000 81.98420000 52.79120000 53.38250000 68.64730000 1112 89.64880000 73.63660000 96.86260000 67.49940000 59.93680000 96.21880000 1113 36.52590000 6.653190000 21.80120000 5.227210000 2.758580000 3.576900000 1114 45.40580000 9.620080000 18.95960000 7.938100000 4.346670000 2.862660000 1115 50.43670000 16.98590000 27.54760000 10.93750000 6.592140000 6.249590000 1116 62.85560000 28.05740000 31.33260000 18.44460000 12.59050000 8.829420000 1117 74.96280000 28.10250000 36.59350000 26.05200000 16.45780000 12.17380000 1118 89.32660000 30.69140000 43.10650000 37.67180000 23.04530000 17.33020000 1119 89.64230000 44.38940000 44.27510000 41.42550000 29.90610000 19.35750000 1120 64.91420000 31.97110000 9.849500000 18.96650000 14.08850000 2.298380000 1121 75.57230000 33.04720000 10.03440000 25.52090000 17.79350000 2.692290000 1122 85.30450000 79.87770000 19.61210000 51.39130000 58.82440000 11.27690000 1123 91.97640000 79.68920000 61.08980000 62.11910000 63.53970000 40.99810000 1124 18.44450000 13.68490000 22.03320000 2.100660000 1.677010000 3.611060000 1125 69.69420000 9.399170000 28.09330000 19.94390000 10.44670000 6.763860000 1126 79.69080000 9.507240000 27.21740000 26.26500000 13.72150000 6.672710000 1127 89.23370000 22.50290000 63.57020000 40.11000000 21.90520000 37.04940000 1128 88.40270000 36.11390000 70.74130000 43.68430000 27.19880000 47.14010000 1129 94.37940000 63.35040000 72.77930000 58.38940000 48.51770000 53.32860000 1130 77.39320000 52.24080000 54.37640000 36.77270000 31.14120000 28.85060000 1131 89.80560000 53.02650000 56.77220000 46.61200000 36.58420000 31.84730000 1132 89.38130000 64.63480000 61.41770000 52.08970000 46.47090000 38.61110000 1133 67.01150000 67.30320000 53.09530000 36.55290000 40.54850000 29.41230000 1134 66.27060000 82.77150000 71.18130000 48.82470000 59.20870000 53.65460000 1135 68.45550000 90.74980000 85.06040000 59.44910000 72.06890000 77.06110000 1136 10.56100000 29.55440000 16.94690000 3.107780000 5.197270000 2.747290000 1137 9.419710000 27.77370000 28.89620000 3.542420000 4.862820000 6.920990000 1138 47.57470000 39.55580000 26.80870000 13.69870000 13.85170000 7.183010000 1139 47.46410000 44.96910000 24.97900000 15.02960000 16.80460000 6.929630000 1140 58.34210000 65.54960000 52.19370000 31.05190000 36.47820000 28.04740000 1141 77.32340000 66.97260000 79.27410000 49.06240000 46.02530000 63.06800000 1142 28.64910000 12.54000000 19.04060000 3.480660000 2.292060000 2.723960000 1143 29.54650000 9.256680000 22.15070000 3.670380000 2.099560000 3.649900000 1144 50.48150000 14.17850000 51.93040000 13.93030000 7.411190000 23.08860000 1145 77.42820000 12.19430000 66.32560000 31.16090000 15.73830000 39.74750000 1146 77.62030000 43.55920000 72.91680000 38.38400000 27.28280000 50.47970000 1147 69.42030000 43.44190000 76.22470000 34.13050000 24.93290000 55.09150000 1148 69.38470000 46.96830000 90.08200000 39.59010000 28.82700000 78.67240000 1149 78.01820000 53.59180000 91.09420000 47.66220000 36.33810000 81.56770000 1150 40.79090000 47.71840000 39.45060000 15.09950000 17.94600000 14.90260000 1151 47.11630000 57.82050000 46.32210000 21.92110000 26.83000000 21.43930000 1152 9.684760000 14.42450000 6.067540000 0.786834000 1.152280000 0.380259000 1153 14.39040000 15.77450000 10.77410000 1.330690000 1.584830000 0.940377000 1154 9.530100000 23.48020000 17.24070000 2.089550000 3.226440000 2.494010000 1155 17.55600000 44.99320000 44.68800000 10.14280000 14.04020000 18.26860000 1156 47.28120000 55.38510000 55.70680000 22.67660000 25.59050000 29.87480000 1157 8.005570000 13.64210000 10.49610000 0.734212000 1.028190000 0.825008000 1158 11.34220000 6.732770000 5.279080000 0.466539000 0.377860000 0.195099000 1159 24.64160000 8.972740000 8.451470000 2.151190000 1.364280000 0.563062000 1160 28.54250000 8.715170000 13.62580000 3.009360000 1.773370000 1.364630000 1161 43.15720000 25.57530000 48.38680000 11.93640000 8.377500000 20.15670000 1162 46.67550000 48.20700000 67.32470000 22.46570000 21.37600000 42.57580000 1163 56.65420000 54.09060000 75.41710000 30.78130000 28.48980000 54.74870000 1164 77.76180000 55.02310000 81.42090000 44.81470000 36.04520000 64.80130000 1165 10.91450000 24.90070000 39.37790000 4.321330000 4.454530000 12.81690000 1166 8.910710000 23.56170000 44.53360000 4.737580000 4.300080000 16.55140000 1167 10.90510000 28.75220000 58.06560000 8.082570000 6.959600000 29.54290000 1168 12.08640000 32.00430000 78.12750000 13.80310000 10.23780000 56.22790000 1169 26.70110000 73.10540000 77.97320000 30.65730000 41.25320000 61.08790000 1170 24.41660000 82.41640000 91.71720000 40.15100000 53.67090000 86.47280000 1171 25.14990000 84.20730000 100.0000000 44.53280000 57.24850000 103.3160000 1172 15.82950000 93.94440000 72.45990000 40.77120000 66.26410000 57.22950000 1173 88.46500000 95.03620000 71.81970000 72.18080000 83.66730000 58.03320000 1174 29.62620000 31.23430000 16.76420000 5.962590000 7.140220000 2.926950000 1175 45.06340000 60.42080000 12.51640000 19.13880000 27.37420000 5.254990000 1176 51.48780000 81.02320000 11.46160000 32.24210000 50.02280000 8.763710000 1177 75.94400000 92.85820000 10.16440000 53.01420000 72.42010000 11.80490000 1178 76.26360000 93.50490000 63.61470000 60.24720000 76.08530000 46.50000000 1179 91.95130000 92.47350000 79.68370000 75.34750000 82.27220000 69.32640000 1180 66.68820000 75.49130000 68.92960000 44.14920000 50.44580000 49.15190000 1181 70.05020000 83.15650000 89.97000000 56.99100000 63.11260000 84.16800000 1182 79.31170000 94.97110000 89.47950000 70.82670000 82.27180000 86.24080000 1183 14.25120000 38.59180000 29.99520000 6.251060000 9.615260000 8.223390000 1184 8.576980000 46.06510000 74.32870000 16.08780000 16.86100000 51.67780000 1185 12.73000000 51.19000000 90.41140000 23.10410000 22.41400000 78.90930000 1186 12.45520000 62.94490000 93.80200000 29.02240000 32.33080000 86.90420000 1187 9.281660000 24.74920000 75.45220000 11.59480000 7.317300000 51.72510000 1188 7.275710000 25.22980000 87.85760000 15.43750000 8.958540000 72.08690000 1189 14.97540000 19.30710000 75.43060000 11.30310000 6.131650000 51.47960000 1190 63.18110000 16.90190000 78.22670000 26.25780000 13.38600000 56.33300000 1191 71.47950000 24.04780000 87.85470000 34.84050000 18.70430000 72.94060000 1192 57.67410000 39.96870000 66.27600000 24.35570000 18.77680000 40.62950000 1193 72.73410000 59.75600000 67.73610000 39.66210000 36.66960000 45.15630000 1194 74.36260000 75.45880000 67.33520000 48.31070000 52.61020000 47.25640000 1195 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 1196 7.710020000 10.15680000 6.203640000 0.420937000 0.559623000 0.295110000 1197 7.612170000 4.618980000 10.11310000 0.301345000 0.203224000 0.636356000 1198 30.28710000 63.57770000 15.43310000 16.48460000 28.07080000 6.102600000 1199 34.00210000 92.80980000 14.70120000 34.45770000 62.78500000 11.69870000 1200 39.94850000 95.35840000 90.38020000 52.14040000 73.02820000 87.09130000 1201 21.70130000 28.66040000 27.26250000 4.757880000 5.732790000 6.283750000 1202 20.63100000 33.10070000 25.73260000 5.336990000 7.312590000 5.910750000 1203 61.14130000 38.88710000 28.48010000 19.59650000 16.62170000 8.151090000 1204 61.80640000 61.36260000 42.29090000 29.24860000 32.90010000 19.06460000 1205 44.91050000 59.22180000 40.26050000 20.83030000 27.22990000 16.95180000 1206 49.99250000 74.18350000 43.04700000 30.34600000 42.84450000 21.49280000 1207 67.69390000 83.84290000 52.49630000 46.12810000 59.30520000 31.94880000 1208 74.54440000 84.85120000 63.39050000 53.15190000 63.62630000 44.19840000 1209 12.65390000 32.43660000 9.078530000 3.535910000 6.275350000 1.508440000 1210 10.27680000 30.78420000 23.05510000 3.672750000 5.789010000 4.678200000 1211 10.37250000 31.07700000 36.38210000 4.971880000 6.399540000 11.21190000 1212 11.43210000 38.40340000 43.03950000 7.534660000 10.02800000 16.35490000 1213 0.000000000 40.73120000 45.85760000 8.210030000 11.22130000 18.76730000 1214 41.42260000 45.38370000 73.28320000 21.34030000 19.29080000 50.35870000 1215 51.42930000 53.84570000 82.97730000 30.69290000 28.04580000 66.56150000 1216 71.81530000 12.78580000 20.17470000 20.83310000 11.25440000 3.873980000 1217 72.59920000 7.440620000 54.75370000 25.30950000 12.66860000 26.26870000 1218 79.93730000 60.33610000 54.23330000 41.67200000 38.41550000 29.85340000 1219 64.04890000 23.69560000 16.88540000 17.34840000 11.13930000 3.128620000 1220 91.04910000 27.31500000 18.62540000 36.06180000 21.59760000 4.616840000 1221 90.03810000 39.30900000 16.64050000 37.67680000 26.19360000 4.903400000 1222 33.24830000 15.57040000 10.78940000 4.394080000 3.138230000 1.081010000 1223 35.44630000 11.28760000 91.72670000 19.43700000 8.734100000 78.90840000 1224 45.95460000 18.11990000 91.08340000 22.99310000 11.39610000 78.03310000 1225 15.55610000 14.89220000 5.936390000 1.267720000 1.455000000 0.403999000 1226 17.05060000 13.77280000 9.164060000 1.393950000 1.386170000 0.687679000 1227 14.69930000 10.39800000 8.937570000 0.943539000 0.841757000 0.579899000 1228 8.826190000 11.11870000 14.22730000 0.731206000 0.772028000 1.409100000 1229 6.437110000 8.179000000 15.38370000 0.538399000 0.459239000 1.602370000 1230 5.951050000 52.34510000 69.99720000 16.93250000 20.56360000 46.25320000 1231 9.232850000 58.92620000 83.86440000 23.65070000 27.36650000 68.28670000 1232 11.68040000 75.69230000 92.35900000 34.90280000 45.01610000 86.28780000 1233 6.351260000 81.46890000 92.34760000 38.03030000 51.68030000 87.38760000 1234 20.31460000 89.10210000 91.43460000 43.80560000 62.05910000 87.37030000 1235 53.01520000 87.00210000 93.97770000 52.28500000 64.21920000 92.17250000 1236 90.00530000 86.71960000 92.77820000 74.15830000 75.26770000 90.85350000 1237 1.445090000 0.000000000 0.000000000 0.003702600 0.001908800 0.000173336 1238 13.56080000 92.53170000 32.87570000 32.21840000 61.18440000 18.30520000 1239 75.42190000 91.66890000 36.61140000 53.68830000 71.29190000 21.31280000 1240 93.20680000 90.72590000 54.20300000 68.88870000 77.82890000 35.99660000 1241 25.23860000 18.16100000 7.137190000 2.890610000 2.730340000 0.659536000 1242 33.00280000 20.03620000 9.726100000 4.750990000 3.983980000 1.081250000 1243 34.38430000 18.05020000 84.68600000 17.29310000 8.698370000 66.41070000 1244 20.91300000 24.27940000 50.46040000 6.920950000 5.465110000 21.71200000 1245 18.31900000 35.01640000 65.28960000 11.61190000 10.45110000 38.45190000 1246 26.02460000 45.68080000 70.68180000 16.93460000 17.23510000 46.54470000 1247 25.36540000 49.93070000 94.62990000 25.76810000 22.96230000 86.87110000 1248 38.32000000 35.31740000 63.14590000 15.19450000 12.45620000 36.02760000 1249 48.48260000 37.88230000 70.32140000 20.94190000 16.11370000 45.62400000 1250 15.86020000 14.00440000 26.27860000 2.147950000 1.700780000 5.221500000 1251 11.25920000 57.31340000 24.49210000 11.66920000 21.52880000 7.828860000 1252 6.114910000 62.53930000 41.61760000 15.45050000 26.57130000 18.07580000 1253 11.65980000 78.14880000 46.01220000 24.43040000 43.08330000 24.18920000 1254 14.06040000 79.97310000 37.75400000 24.54390000 44.88210000 18.47680000 1255 17.52700000 91.53340000 44.67530000 33.39910000 60.56410000 26.01320000 1256 35.24230000 92.67390000 45.58610000 37.61660000 63.92870000 27.17030000 1257 30.23550000 90.43260000 30.76500000 32.98400000 59.40110000 16.80820000 1258 82.53420000 93.02630000 30.24750000 58.84020000 75.46670000 18.28740000 1259 76.54930000 50.64270000 17.87660000 31.32950000 27.99310000 5.898000000 1260 88.61980000 52.67390000 42.68610000 43.12370000 34.87400000 19.00910000 1261 46.81620000 22.14060000 64.82460000 16.02570000 9.385250000 37.43590000 1262 63.01910000 20.12970000 90.18320000 30.37200000 15.55960000 76.78320000 1263 62.74990000 34.35550000 90.29340000 32.62920000 20.22020000 77.76670000 1264 78.85570000 72.28420000 90.75750000 56.55430000 53.47170000 83.78110000 1265 43.60790000 35.14440000 38.61250000 12.45930000 11.48970000 13.23120000 1266 53.61020000 34.11960000 41.08170000 16.37940000 13.13770000 15.04720000 1267 63.65740000 36.33140000 48.52960000 22.81140000 17.06200000 21.38460000 1268 67.88780000 45.08940000 60.21150000 29.71230000 23.84340000 34.04030000 1269 82.68240000 53.54650000 75.09630000 45.81170000 35.94680000 54.92140000 1270 23.28060000 4.536670000 17.00300000 2.078180000 1.088020000 2.022280000 1271 22.31120000 9.006000000 13.01760000 1.905820000 1.225510000 1.204210000 1272 20.50680000 12.76300000 5.439990000 1.681200000 1.437070000 0.345561000 1273 20.12340000 16.56160000 53.16690000 6.397710000 3.796260000 23.97720000 1274 27.88470000 32.22340000 54.42860000 10.18620000 9.102990000 26.05010000 1275 28.21660000 35.95750000 73.02990000 15.36520000 12.47520000 48.99580000 1276 46.51770000 39.06810000 90.42260000 26.65250000 18.78840000 78.04330000 1277 18.78970000 3.835200000 25.62730000 1.974800000 0.954450000 4.817730000 1278 31.80020000 6.725560000 37.60000000 5.513710000 2.740170000 11.24600000 1279 32.74740000 63.83470000 57.92570000 22.29700000 30.64870000 33.21490000 1280 35.99050000 80.31010000 61.21150000 32.56750000 48.85660000 39.86160000 1281 42.42790000 96.78820000 60.61650000 45.54070000 72.19260000 42.99900000 1282 29.58180000 40.62190000 27.14470000 8.788020000 11.73280000 7.178030000 1283 58.82760000 44.15440000 31.13110000 20.14990000 19.02200000 9.877090000 1284 65.89420000 52.92000000 37.14780000 27.34450000 26.95730000 14.48100000 1285 65.54560000 59.30100000 46.12240000 30.90950000 32.37720000 21.87180000 1286 82.27590000 65.23240000 65.46260000 47.93480000 44.63710000 43.35290000 1287 93.31010000 76.94330000 68.03030000 63.24250000 61.53910000 49.09880000 1288 94.38990000 87.19740000 72.69500000 71.72830000 75.22070000 57.66010000 1289 93.41810000 86.60820000 88.17210000 75.25290000 75.90970000 82.41950000 1290 53.29130000 49.27330000 45.26100000 21.02850000 21.66960000 19.62500000 1291 62.37610000 54.22280000 47.45890000 27.41580000 27.54500000 22.24160000 1292 91.18730000 9.951890000 15.16290000 34.17450000 17.91700000 3.151450000 1293 93.68130000 12.80220000 23.14710000 36.83570000 19.48410000 5.607180000 1294 93.29800000 11.62470000 31.56030000 37.14700000 19.45260000 9.286770000 1295 93.14560000 14.33110000 40.28450000 38.21900000 20.16110000 14.68790000 1296 91.41500000 8.841860000 67.03280000 41.51280000 20.79200000 41.08250000 1297 87.18510000 7.726400000 80.24420000 41.75380000 20.43070000 60.05180000 1298 68.97070000 31.56980000 60.38760000 27.00300000 17.43830000 33.14650000 1299 70.30620000 35.01200000 70.62150000 30.95830000 20.26950000 46.30880000 1300 70.04770000 37.30100000 81.59260000 34.47610000 22.50940000 63.01300000 1301 83.50610000 46.67820000 91.22150000 49.18380000 33.59010000 81.19400000 1302 94.26810000 47.41200000 92.40100000 58.31570000 38.59580000 83.89430000 1303 56.97610000 47.18090000 55.63660000 23.79260000 21.86620000 29.02470000 1304 57.40670000 65.13240000 66.43910000 33.43920000 37.06720000 43.88880000 1305 58.48010000 65.43010000 91.85320000 41.71440000 40.66050000 84.13440000 1306 21.72170000 33.39130000 34.89950000 6.422240000 7.862090000 10.52250000 1307 19.10780000 70.51180000 48.41640000 21.32750000 35.19120000 24.86320000 1308 19.13660000 82.18150000 56.59680000 29.47210000 49.07610000 34.97680000 1309 15.73280000 89.28060000 85.84270000 41.47440000 61.26080000 77.27010000 1310 13.14380000 65.54740000 81.53350000 26.11950000 33.10210000 65.40170000 1311 12.04630000 70.55520000 93.17840000 32.45020000 39.59680000 86.92920000 1312 4.513480000 91.46300000 94.78410000 45.47490000 65.21690000 94.28930000 1313 17.98960000 62.08440000 70.43570000 21.83330000 28.89920000 48.20100000 1314 14.92120000 76.46260000 72.87940000 29.44730000 43.56230000 54.03950000 1315 10.53370000 76.24820000 78.82790000 30.68430000 43.82310000 62.91090000 1316 8.995660000 66.30180000 60.48030000 20.66270000 31.46410000 36.29330000 1317 56.66090000 65.58880000 61.02650000 32.05790000 36.81970000 37.35180000 1318 57.96780000 79.17440000 61.99260000 40.13320000 51.72610000 40.92580000 1319 16.14690000 62.13910000 17.29770000 13.68670000 25.65620000 6.226740000 1320 19.62630000 70.39090000 14.48530000 17.92650000 33.73830000 6.918520000 1321 18.75500000 81.69550000 15.67290000 24.26870000 46.50760000 9.304650000 1322 35.64330000 87.24060000 58.30180000 36.26050000 57.37630000 38.04620000 1323 24.92420000 44.02250000 39.28730000 10.14000000 13.69690000 14.23270000 1324 92.92030000 45.22180000 52.72970000 45.75000000 32.34380000 26.98950000 1325 91.71690000 72.48310000 77.26680000 61.95340000 56.91470000 61.37710000 1326 50.51570000 43.21630000 45.91840000 18.09440000 17.34040000 19.47730000 1327 55.52440000 42.02250000 57.62460000 21.99060000 18.60390000 30.58170000 1328 36.07860000 17.71890000 24.27490000 5.978770000 4.170240000 4.694980000 1329 41.67640000 14.34360000 24.83720000 7.360030000 4.438660000 4.891180000 1330 43.45160000 10.27280000 35.63710000 8.700990000 4.626050000 10.21770000 1331 68.34510000 12.02140000 38.94220000 20.46340000 10.79050000 12.89480000 1332 67.66660000 35.09350000 43.31510000 23.90980000 17.30190000 17.10550000 1333 53.50820000 30.18810000 33.67710000 14.63910000 11.16740000 10.02290000 1334 71.86360000 62.81730000 32.32400000 34.30810000 36.60760000 13.15190000 1335 55.52360000 43.89520000 23.64600000 17.91180000 17.82770000 6.466460000 1336 65.09090000 81.61000000 32.75360000 40.46010000 54.63270000 16.53960000 1337 40.60920000 50.10750000 9.305230000 13.60370000 18.61630000 3.386940000 1338 54.06280000 66.41680000 10.19650000 25.32060000 34.62370000 5.973020000 1339 62.58200000 66.33770000 12.90490000 29.41150000 36.66680000 6.575480000 1340 90.31720000 75.18700000 18.93540000 52.52550000 55.37720000 10.35630000 1341 89.48070000 81.32160000 35.49380000 56.83850000 62.77830000 18.81940000 1342 98.27870000 91.75180000 35.16350000 71.09590000 80.37260000 21.26680000 1343 53.47620000 73.28290000 28.89250000 29.63700000 41.94020000 12.70090000 1344 53.65560000 85.70130000 29.22480000 37.16160000 56.82840000 15.33520000 1345 25.53130000 38.87220000 9.246350000 6.620030000 10.04690000 2.093790000 1346 23.95260000 42.48480000 55.87110000 12.23940000 13.80970000 28.32060000 1347 23.89400000 47.63030000 56.71840000 13.95430000 16.98390000 29.72800000 1348 24.95660000 55.99290000 63.00750000 18.47120000 23.59500000 37.83940000 1349 32.50820000 64.17840000 73.71190000 26.19560000 32.45500000 53.26050000 1350 33.49440000 77.67230000 75.77190000 34.03980000 46.87030000 58.65260000 1351 46.67130000 31.61110000 34.29710000 12.27350000 10.34630000 10.34270000 1352 49.19460000 29.84490000 58.92890000 16.80930000 11.73040000 30.94820000 1353 55.96940000 30.62240000 68.08590000 21.90720000 14.33110000 42.23770000 1354 36.67160000 22.12650000 51.97220000 10.11690000 6.645710000 23.18150000 1355 56.52030000 20.23980000 62.19990000 19.17680000 10.73430000 34.36150000 1356 67.49460000 24.26130000 68.50830000 26.81510000 15.27300000 42.71730000 1357 81.48440000 33.32100000 84.20440000 41.84340000 24.87820000 67.42190000 1358 19.53530000 40.04690000 18.23540000 6.343270000 10.31560000 3.898350000 1359 26.70980000 50.32530000 24.44240000 10.97430000 17.28930000 7.028070000 1360 89.22210000 59.03820000 30.11230000 44.60060000 39.50320000 12.02920000 1361 49.38740000 32.18660000 14.95290000 11.97160000 10.52760000 2.849940000 1362 57.01390000 42.63330000 12.37190000 17.65160000 17.22060000 3.348820000 1363 57.80090000 49.55300000 9.913030000 20.09820000 21.68200000 3.712670000 1364 66.62030000 61.83290000 10.42610000 29.42770000 33.59910000 5.590180000 1365 75.93830000 74.17920000 8.014210000 41.12090000 48.71430000 7.603570000 1366 75.64920000 80.25540000 27.85390000 45.45290000 56.03330000 14.11070000 1367 77.49100000 81.11840000 40.41580000 48.56630000 58.25830000 21.58820000 1368 24.77270000 24.47010000 9.836810000 3.644070000 4.267270000 1.208430000 1369 65.28400000 40.67320000 12.31800000 21.26970000 18.28550000 3.354600000 1370 79.37380000 45.25940000 10.80200000 31.20220000 25.35560000 3.958610000 1371 92.59050000 45.22340000 9.589990000 41.16330000 30.47820000 4.259310000 1372 92.47240000 57.14200000 10.38800000 45.28590000 38.83680000 5.760290000 1373 95.79270000 77.77170000 7.755180000 58.15510000 60.51340000 8.957810000 1374 43.17080000 39.10300000 8.697070000 11.12000000 12.45520000 2.258100000 1375 49.89060000 37.95120000 31.44550000 14.60030000 13.66700000 9.298290000 1376 56.27290000 39.58540000 84.24400000 28.68410000 20.27380000 67.29370000 1377 57.78570000 44.18990000 94.83090000 34.34060000 24.65830000 87.13890000 1378 13.37640000 12.20150000 44.46690000 3.881240000 2.169880000 16.13280000 1379 10.57270000 8.880130000 49.82920000 4.369720000 2.060550000 20.61530000 1380 45.72370000 9.076480000 58.66210000 13.14490000 6.402610000 29.81940000 1381 58.30920000 3.686140000 72.81920000 21.60270000 10.13640000 47.91540000 1382 83.37590000 20.10710000 76.70540000 38.77120000 20.38330000 54.69380000 1383 53.79250000 30.63750000 50.23060000 17.16850000 12.32900000 22.28690000 1384 67.89000000 32.08250000 52.52890000 24.91120000 16.69310000 24.87310000 1385 77.93560000 36.69560000 53.81320000 32.39770000 22.02260000 26.76020000 1386 17.58500000 8.598190000 8.065160000 1.135240000 0.817757000 0.470715000 1387 37.30110000 11.91510000 6.228700000 5.086930000 3.111110000 0.543597000 1388 39.72790000 10.50970000 13.16740000 5.876450000 3.379660000 1.438010000 1389 52.89750000 16.18610000 8.935880000 10.90510000 6.579240000 1.162250000 1390 77.62440000 16.42250000 8.832210000 24.38540000 13.56040000 1.787600000 1391 89.14880000 30.58670000 9.217900000 34.77030000 21.83650000 2.882700000 1392 90.72860000 29.02860000 54.79040000 40.45610000 23.79750000 27.65580000 1393 92.21300000 32.89750000 91.93040000 52.60610000 29.99110000 81.64630000 1394 35.18160000 9.191850000 33.10820000 5.920540000 3.147640000 8.616690000 1395 54.29950000 11.14590000 33.15610000 12.64560000 6.761220000 8.986300000 1396 64.76240000 18.56730000 32.91780000 18.31100000 10.56740000 9.291030000 1397 61.77100000 34.81750000 31.00780000 19.18270000 14.94590000 9.078140000 1398 64.85870000 42.99050000 38.01170000 23.65050000 20.23660000 13.93420000 1399 90.52570000 75.10450000 51.01810000 56.29110000 56.82920000 29.53920000 END_DATA CAL DESCRIPTOR "Argyll Device Calibration State" ORIGINATOR "Argyll dispcal" CREATED "Sat Mar 14 19:07:36 2009" KEYWORD "DEVICE_CLASS" DEVICE_CLASS "DISPLAY" KEYWORD "COLOR_REP" COLOR_REP "RGB" BEGIN_ARGYLL_DISPCAL_ARGS -qm -w0.3127,0.3290 -f0 -k0 END_ARGYLL_DISPCAL_ARGS KEYWORD "RGB_I" NUMBER_OF_FIELDS 4 BEGIN_DATA_FORMAT RGB_I RGB_R RGB_G RGB_B END_DATA_FORMAT NUMBER_OF_SETS 256 BEGIN_DATA 0.00000 0.00000 0.00000 0.00000 0.00392 0.00392 0.00392 0.00392 0.00784 0.00784 0.00784 0.00784 0.01176 0.01176 0.01176 0.01176 0.01569 0.01569 0.01569 0.01569 0.01961 0.01961 0.01961 0.01961 0.02353 0.02353 0.02353 0.02353 0.02745 0.02745 0.02745 0.02745 0.03137 0.03137 0.03137 0.03137 0.03529 0.03529 0.03529 0.03529 0.03922 0.03922 0.03922 0.03922 0.04314 0.04314 0.04314 0.04314 0.04706 0.04706 0.04706 0.04706 0.05098 0.05098 0.05098 0.05098 0.05490 0.05490 0.05490 0.05490 0.05882 0.05882 0.05882 0.05882 0.06275 0.06275 0.06275 0.06275 0.06667 0.06667 0.06667 0.06667 0.07059 0.07059 0.07059 0.07059 0.07451 0.07451 0.07451 0.07451 0.07843 0.07843 0.07843 0.07843 0.08235 0.08235 0.08235 0.08235 0.08627 0.08627 0.08627 0.08627 0.09020 0.09020 0.09020 0.09020 0.09412 0.09412 0.09412 0.09412 0.09804 0.09804 0.09804 0.09804 0.10196 0.10196 0.10196 0.10196 0.10588 0.10588 0.10588 0.10588 0.10980 0.10980 0.10980 0.10980 0.11373 0.11373 0.11373 0.11373 0.11765 0.11765 0.11765 0.11765 0.12157 0.12157 0.12157 0.12157 0.12549 0.12549 0.12549 0.12549 0.12941 0.12941 0.12941 0.12941 0.13333 0.13333 0.13333 0.13333 0.13725 0.13725 0.13725 0.13725 0.14118 0.14118 0.14118 0.14118 0.14510 0.14510 0.14510 0.14510 0.14902 0.14902 0.14902 0.14902 0.15294 0.15294 0.15294 0.15294 0.15686 0.15686 0.15686 0.15686 0.16078 0.16078 0.16078 0.16078 0.16471 0.16471 0.16471 0.16471 0.16863 0.16863 0.16863 0.16863 0.17255 0.17255 0.17255 0.17255 0.17647 0.17647 0.17647 0.17647 0.18039 0.18039 0.18039 0.18039 0.18431 0.18431 0.18431 0.18431 0.18824 0.18824 0.18824 0.18824 0.19216 0.19216 0.19216 0.19216 0.19608 0.19608 0.19608 0.19608 0.20000 0.20000 0.20000 0.20000 0.20392 0.20392 0.20392 0.20392 0.20784 0.20784 0.20784 0.20784 0.21176 0.21176 0.21176 0.21176 0.21569 0.21569 0.21569 0.21569 0.21961 0.21961 0.21961 0.21961 0.22353 0.22353 0.22353 0.22353 0.22745 0.22745 0.22745 0.22745 0.23137 0.23137 0.23137 0.23137 0.23529 0.23529 0.23529 0.23529 0.23922 0.23922 0.23922 0.23922 0.24314 0.24314 0.24314 0.24314 0.24706 0.24706 0.24706 0.24706 0.25098 0.25098 0.25098 0.25098 0.25490 0.25490 0.25490 0.25490 0.25882 0.25882 0.25882 0.25882 0.26275 0.26275 0.26275 0.26275 0.26667 0.26667 0.26667 0.26667 0.27059 0.27059 0.27059 0.27059 0.27451 0.27451 0.27451 0.27451 0.27843 0.27843 0.27843 0.27843 0.28235 0.28235 0.28235 0.28235 0.28627 0.28627 0.28627 0.28627 0.29020 0.29020 0.29020 0.29020 0.29412 0.29412 0.29412 0.29412 0.29804 0.29804 0.29804 0.29804 0.30196 0.30196 0.30196 0.30196 0.30588 0.30588 0.30588 0.30588 0.30980 0.30980 0.30980 0.30980 0.31373 0.31373 0.31373 0.31373 0.31765 0.31765 0.31765 0.31765 0.32157 0.32157 0.32157 0.32157 0.32549 0.32549 0.32549 0.32549 0.32941 0.32941 0.32941 0.32941 0.33333 0.33333 0.33333 0.33333 0.33725 0.33725 0.33725 0.33725 0.34118 0.34118 0.34118 0.34118 0.34510 0.34510 0.34510 0.34510 0.34902 0.34902 0.34902 0.34902 0.35294 0.35294 0.35294 0.35294 0.35686 0.35686 0.35686 0.35686 0.36078 0.36078 0.36078 0.36078 0.36471 0.36471 0.36471 0.36471 0.36863 0.36863 0.36863 0.36863 0.37255 0.37255 0.37255 0.37255 0.37647 0.37647 0.37647 0.37647 0.38039 0.38039 0.38039 0.38039 0.38431 0.38431 0.38431 0.38431 0.38824 0.38824 0.38824 0.38824 0.39216 0.39216 0.39216 0.39216 0.39608 0.39608 0.39608 0.39608 0.40000 0.40000 0.40000 0.40000 0.40392 0.40392 0.40392 0.40392 0.40784 0.40784 0.40784 0.40784 0.41176 0.41176 0.41176 0.41176 0.41569 0.41569 0.41569 0.41569 0.41961 0.41961 0.41961 0.41961 0.42353 0.42353 0.42353 0.42353 0.42745 0.42745 0.42745 0.42745 0.43137 0.43137 0.43137 0.43137 0.43529 0.43529 0.43529 0.43529 0.43922 0.43922 0.43922 0.43922 0.44314 0.44314 0.44314 0.44314 0.44706 0.44706 0.44706 0.44706 0.45098 0.45098 0.45098 0.45098 0.45490 0.45490 0.45490 0.45490 0.45882 0.45882 0.45882 0.45882 0.46275 0.46275 0.46275 0.46275 0.46667 0.46667 0.46667 0.46667 0.47059 0.47059 0.47059 0.47059 0.47451 0.47451 0.47451 0.47451 0.47843 0.47843 0.47843 0.47843 0.48235 0.48235 0.48235 0.48235 0.48627 0.48627 0.48627 0.48627 0.49020 0.49020 0.49020 0.49020 0.49412 0.49412 0.49412 0.49412 0.49804 0.49804 0.49804 0.49804 0.50196 0.50196 0.50196 0.50196 0.50588 0.50588 0.50588 0.50588 0.50980 0.50980 0.50980 0.50980 0.51373 0.51373 0.51373 0.51373 0.51765 0.51765 0.51765 0.51765 0.52157 0.52157 0.52157 0.52157 0.52549 0.52549 0.52549 0.52549 0.52941 0.52941 0.52941 0.52941 0.53333 0.53333 0.53333 0.53333 0.53725 0.53725 0.53725 0.53725 0.54118 0.54118 0.54118 0.54118 0.54510 0.54510 0.54510 0.54510 0.54902 0.54902 0.54902 0.54902 0.55294 0.55294 0.55294 0.55294 0.55686 0.55686 0.55686 0.55686 0.56078 0.56078 0.56078 0.56078 0.56471 0.56471 0.56471 0.56471 0.56863 0.56863 0.56863 0.56863 0.57255 0.57255 0.57255 0.57255 0.57647 0.57647 0.57647 0.57647 0.58039 0.58039 0.58039 0.58039 0.58431 0.58431 0.58431 0.58431 0.58824 0.58824 0.58824 0.58824 0.59216 0.59216 0.59216 0.59216 0.59608 0.59608 0.59608 0.59608 0.60000 0.60000 0.60000 0.60000 0.60392 0.60392 0.60392 0.60392 0.60784 0.60784 0.60784 0.60784 0.61176 0.61176 0.61176 0.61176 0.61569 0.61569 0.61569 0.61569 0.61961 0.61961 0.61961 0.61961 0.62353 0.62353 0.62353 0.62353 0.62745 0.62745 0.62745 0.62745 0.63137 0.63137 0.63137 0.63137 0.63529 0.63529 0.63529 0.63529 0.63922 0.63922 0.63922 0.63922 0.64314 0.64314 0.64314 0.64314 0.64706 0.64706 0.64706 0.64706 0.65098 0.65098 0.65098 0.65098 0.65490 0.65490 0.65490 0.65490 0.65882 0.65882 0.65882 0.65882 0.66275 0.66275 0.66275 0.66275 0.66667 0.66667 0.66667 0.66667 0.67059 0.67059 0.67059 0.67059 0.67451 0.67451 0.67451 0.67451 0.67843 0.67843 0.67843 0.67843 0.68235 0.68235 0.68235 0.68235 0.68627 0.68627 0.68627 0.68627 0.69020 0.69020 0.69020 0.69020 0.69412 0.69412 0.69412 0.69412 0.69804 0.69804 0.69804 0.69804 0.70196 0.70196 0.70196 0.70196 0.70588 0.70588 0.70588 0.70588 0.70980 0.70980 0.70980 0.70980 0.71373 0.71373 0.71373 0.71373 0.71765 0.71765 0.71765 0.71765 0.72157 0.72157 0.72157 0.72157 0.72549 0.72549 0.72549 0.72549 0.72941 0.72941 0.72941 0.72941 0.73333 0.73333 0.73333 0.73333 0.73725 0.73725 0.73725 0.73725 0.74118 0.74118 0.74118 0.74118 0.74510 0.74510 0.74510 0.74510 0.74902 0.74902 0.74902 0.74902 0.75294 0.75294 0.75294 0.75294 0.75686 0.75686 0.75686 0.75686 0.76078 0.76078 0.76078 0.76078 0.76471 0.76471 0.76471 0.76471 0.76863 0.76863 0.76863 0.76863 0.77255 0.77255 0.77255 0.77255 0.77647 0.77647 0.77647 0.77647 0.78039 0.78039 0.78039 0.78039 0.78431 0.78431 0.78431 0.78431 0.78824 0.78824 0.78824 0.78824 0.79216 0.79216 0.79216 0.79216 0.79608 0.79608 0.79608 0.79608 0.80000 0.80000 0.80000 0.80000 0.80392 0.80392 0.80392 0.80392 0.80784 0.80784 0.80784 0.80784 0.81176 0.81176 0.81176 0.81176 0.81569 0.81569 0.81569 0.81569 0.81961 0.81961 0.81961 0.81961 0.82353 0.82353 0.82353 0.82353 0.82745 0.82745 0.82745 0.82745 0.83137 0.83137 0.83137 0.83137 0.83529 0.83529 0.83529 0.83529 0.83922 0.83922 0.83922 0.83922 0.84314 0.84314 0.84314 0.84314 0.84706 0.84706 0.84706 0.84706 0.85098 0.85098 0.85098 0.85098 0.85490 0.85490 0.85490 0.85490 0.85882 0.85882 0.85882 0.85882 0.86275 0.86275 0.86275 0.86275 0.86667 0.86667 0.86667 0.86667 0.87059 0.87059 0.87059 0.87059 0.87451 0.87451 0.87451 0.87451 0.87843 0.87843 0.87843 0.87843 0.88235 0.88235 0.88235 0.88235 0.88627 0.88627 0.88627 0.88627 0.89020 0.89020 0.89020 0.89020 0.89412 0.89412 0.89412 0.89412 0.89804 0.89804 0.89804 0.89804 0.90196 0.90196 0.90196 0.90196 0.90588 0.90588 0.90588 0.90588 0.90980 0.90980 0.90980 0.90980 0.91373 0.91373 0.91373 0.91373 0.91765 0.91765 0.91765 0.91765 0.92157 0.92157 0.92157 0.92157 0.92549 0.92549 0.92549 0.92549 0.92941 0.92941 0.92941 0.92941 0.93333 0.93333 0.93333 0.93333 0.93725 0.93725 0.93725 0.93725 0.94118 0.94118 0.94118 0.94118 0.94510 0.94510 0.94510 0.94510 0.94902 0.94902 0.94902 0.94902 0.95294 0.95294 0.95294 0.95294 0.95686 0.95686 0.95686 0.95686 0.96078 0.96078 0.96078 0.96078 0.96471 0.96471 0.96471 0.96471 0.96863 0.96863 0.96863 0.96863 0.97255 0.97255 0.97255 0.97255 0.97647 0.97647 0.97647 0.97647 0.98039 0.98039 0.98039 0.98039 0.98431 0.98431 0.98431 0.98431 0.98824 0.98824 0.98824 0.98824 0.99216 0.99216 0.99216 0.99216 0.99608 0.99608 0.99608 0.99608 1.00000 1.00000 1.00000 1.00000 END_DATA DisplayCAL-3.1.0.0/misc/ti3/video_ReShade.ti30000644000076500000000000006027012647526532020267 0ustar devwheel00000000000000CTI3 DESCRIPTOR "Argyll Calibration Target chart information 3" ORIGINATOR "Argyll dispread" CREATED "Sat Mar 14 19:00:55 2009" KEYWORD "DEVICE_CLASS" DEVICE_CLASS "DISPLAY" KEYWORD "APPROX_WHITE_POINT" APPROX_WHITE_POINT "95.045781 100.000003 108.905751" KEYWORD "DARK_REGION_EMPHASIS" DARK_REGION_EMPHASIS "1.6" KEYWORD "ACCURATE_EXPECTED_VALUES" ACCURATE_EXPECTED_VALUES "true" KEYWORD "COLOR_REP" COLOR_REP "RGB_XYZ" KEYWORD "BLACK_COLOR_PATCHES" BLACK_COLOR_PATCHES "4" KEYWORD "COMP_GREY_STEPS" COMP_GREY_STEPS "97" KEYWORD "SINGLE_DIM_STEPS" SINGLE_DIM_STEPS "33" KEYWORD "WHITE_COLOR_PATCHES" WHITE_COLOR_PATCHES "4" KEYWORD "USE_BLACK_POINT_COMPENSATION" USE_BLACK_POINT_COMPENSATION "NO" KEYWORD "HIRES_B2A" HIRES_B2A "NO" KEYWORD "AUTO_OPTIMIZE" AUTO_OPTIMIZE "5" KEYWORD "3DLUT_SOURCE_PROFILE" 3DLUT_SOURCE_PROFILE "ref/Rec709.icm" KEYWORD "3DLUT_GAMMA" 3DLUT_GAMMA "-2.4" KEYWORD "3DLUT_DEGREE_OF_BLACK_OUTPUT_OFFSET" 3DLUT_DEGREE_OF_BLACK_OUTPUT_OFFSET "0.0" KEYWORD "3DLUT_INPUT_ENCODING" 3DLUT_INPUT_ENCODING "n" KEYWORD "3DLUT_OUTPUT_ENCODING" 3DLUT_OUTPUT_ENCODING "n" KEYWORD "3DLUT_GAMUT_MAPPING_MODE" 3DLUT_GAMUT_MAPPING_MODE "G" KEYWORD "3DLUT_RENDERING_INTENT" 3DLUT_RENDERING_INTENT "aw" KEYWORD "3DLUT_FORMAT" 3DLUT_FORMAT "ReShade" KEYWORD "3DLUT_SIZE" 3DLUT_SIZE "64" KEYWORD "3DLUT_OUTPUT_BITDEPTH" 3DLUT_OUTPUT_BITDEPTH "8" BEGIN_ARGYLL_COLPROF_ARGS -qh -bl -ax END_ARGYLL_COLPROF_ARGS NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT SAMPLE_ID RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 271 BEGIN_DATA 1 100.000 100.000 100.000 95.1065 100.000 108.844 2 12.5000 37.5000 12.5000 5.94993 9.61866 3.74740 3 12.5000 62.5000 12.5000 14.1814 26.0794 6.49125 4 12.5000 87.5000 87.5000 40.9488 58.8934 79.2939 5 37.5000 87.5000 87.5000 45.0999 61.0337 79.4884 6 0.00000 25.0000 25.0000 3.71049 4.96568 6.38934 7 0.00000 25.0000 50.0000 6.62643 6.13187 21.7479 8 25.0000 75.0000 75.0000 30.9153 42.8005 56.4485 9 50.0000 75.0000 75.0000 37.5774 46.2355 56.7606 10 12.5000 0.00000 0.00000 1.58591 1.30210 1.02745 11 10.4167 10.4167 10.4167 2.00521 2.05749 2.15195 12 25.0000 0.00000 0.00000 3.07728 2.07105 1.09734 13 31.2500 0.00000 0.00000 4.24932 2.67536 1.15226 14 37.5000 0.00000 0.00000 5.73696 3.44239 1.22197 15 43.7500 0.00000 0.00000 7.56070 4.38272 1.30742 16 50.0000 0.00000 0.00000 9.73934 5.50603 1.40951 17 62.5000 37.5000 62.5000 25.5656 19.0418 35.8409 18 87.5000 37.5000 62.5000 41.5030 27.2592 36.5877 19 0.00000 0.00000 0.00000 1.00000 1.00000 1.00000 20 75.0000 0.00000 0.00000 22.3346 12.0002 1.99970 21 81.2500 0.00000 0.00000 26.5283 14.1625 2.19621 22 87.5000 0.00000 0.00000 31.1672 16.5543 2.41358 23 93.7500 0.00000 0.00000 36.2638 19.1821 2.65240 24 100.000 0.00000 0.00000 41.8302 22.0522 2.91323 25 62.5000 62.5000 12.5000 27.8253 33.1142 7.13058 26 75.0000 75.0000 50.0000 44.6598 50.5248 28.3139 27 8.33333 8.33333 8.33333 1.71786 1.75519 1.82265 28 0.00000 12.5000 0.00000 1.50806 2.01598 1.16935 29 0.00000 43.7500 0.00000 6.68900 12.3764 2.89635 30 0.00000 50.0000 0.00000 8.57817 16.1542 3.52608 31 0.00000 56.2500 0.00000 10.7902 20.5776 4.26342 32 0.00000 62.5000 0.00000 13.3391 25.6747 5.11306 33 12.5000 62.5000 37.5000 15.9983 26.8060 16.0610 34 0.00000 0.00000 0.00000 1.00000 1.00000 1.00000 35 0.00000 6.25000 0.00000 1.18254 1.36502 1.06085 36 0.00000 75.0000 0.00000 19.5000 37.9948 7.16671 37 0.00000 81.2500 0.00000 23.1365 45.2667 8.37888 38 0.00000 87.5000 0.00000 27.1590 53.3106 9.71972 39 0.00000 93.7500 0.00000 31.5784 62.1482 11.1929 40 0.00000 100.000 0.00000 36.4052 71.8005 12.8018 41 6.25000 6.25000 6.25000 1.48518 1.51041 1.55601 42 0.00000 0.00000 12.5000 1.25645 1.10256 2.35074 43 0.00000 0.00000 18.7500 1.52439 1.20972 3.76201 44 0.00000 0.00000 25.0000 1.90921 1.36363 5.78891 45 0.00000 0.00000 31.2500 2.42221 1.56879 8.49092 46 0.00000 0.00000 37.5000 3.07334 1.82920 11.9205 47 0.00000 0.00000 43.7500 3.87158 2.14845 16.1249 48 0.00000 0.00000 50.0000 4.82515 2.52982 21.1475 49 0.00000 0.00000 56.2500 5.94168 2.97636 27.0283 50 0.00000 0.00000 62.5000 7.22826 3.49091 33.8049 51 0.00000 0.00000 68.7500 8.69161 4.07616 41.5125 52 0.00000 0.00000 75.0000 10.3380 4.73463 50.1844 53 0.00000 0.00000 81.2500 12.1736 5.46873 59.8524 54 0.00000 0.00000 87.5000 14.2040 6.28076 70.5467 55 0.00000 0.00000 93.7500 16.4347 7.17291 82.2963 56 0.00000 0.00000 100.000 18.8711 8.14731 95.1290 57 0.00000 50.0000 100.000 26.4493 23.3015 97.6550 58 75.0000 50.0000 100.000 47.7839 34.3017 98.6547 59 0.00000 0.00000 6.25000 1.09214 1.03685 1.48530 60 2.08333 2.08333 2.08333 1.15175 1.15964 1.17390 61 4.16667 4.16667 4.16667 1.30372 1.31952 1.34806 62 12.5000 12.5000 12.5000 2.35042 2.42064 2.54755 63 14.5833 14.5833 14.5833 2.75638 2.84772 3.01278 64 16.6667 16.6667 16.6667 3.22584 3.34159 3.55077 65 18.7500 18.7500 18.7500 3.76135 3.90494 4.16445 66 20.8333 20.8333 20.8333 4.36533 4.54033 4.85660 67 22.9167 22.9167 22.9167 5.04007 5.25016 5.62984 68 25.0000 25.0000 25.0000 5.78777 6.03673 6.48668 69 27.0833 27.0833 27.0833 6.61052 6.90226 7.42953 70 29.1667 29.1667 29.1667 7.51032 7.84886 8.46069 71 31.2500 31.2500 31.2500 8.48913 8.87856 9.58238 72 6.25000 0.00000 0.00000 1.21051 1.10854 1.00986 73 33.3333 33.3333 33.3333 9.54879 9.99333 10.7967 74 35.4167 35.4167 35.4167 10.6911 11.1951 12.1058 75 39.5833 39.5833 39.5833 13.2307 13.8667 15.0161 76 41.6667 41.6667 41.6667 14.6313 15.3402 16.6212 77 43.7500 43.7500 43.7500 16.1213 16.9076 18.3287 78 45.8333 45.8333 45.8333 17.7021 18.5707 20.1403 79 47.9167 47.9167 47.9167 19.3754 20.3310 22.0579 80 50.0000 50.0000 50.0000 21.1427 22.1901 24.0831 81 52.0833 52.0833 52.0833 23.0052 24.1495 26.2175 82 54.1667 54.1667 54.1667 24.9646 26.2107 28.4629 83 56.2500 56.2500 56.2500 27.0221 28.3752 30.8208 84 58.3333 58.3333 58.3333 29.1791 30.6444 33.2927 85 60.4167 60.4167 60.4167 31.4370 33.0197 35.8802 86 62.5000 62.5000 62.5000 33.7971 35.5025 38.5847 87 64.5833 64.5833 64.5833 36.2605 38.0941 41.4078 88 66.6667 66.6667 66.6667 38.8287 40.7958 44.3509 89 68.7500 68.7500 68.7500 41.5028 43.6089 47.4154 90 70.8333 70.8333 70.8333 44.2840 46.5348 50.6026 91 72.9167 72.9167 72.9167 47.1736 49.5746 53.9140 92 75.0000 75.0000 75.0000 50.1727 52.7296 57.3508 93 77.0833 77.0833 77.0833 53.2824 56.0011 60.9145 94 79.1667 79.1667 79.1667 56.5039 59.3901 64.6063 95 81.2500 81.2500 81.2500 59.8383 62.8979 68.4275 96 83.3333 83.3333 83.3333 63.2868 66.5257 72.3793 97 85.4167 85.4167 85.4167 66.8503 70.2745 76.4631 98 87.5000 87.5000 87.5000 70.5301 74.1456 80.6800 99 89.5833 89.5833 89.5833 74.3270 78.1400 85.0312 100 91.6667 91.6667 91.6667 78.2423 82.2589 89.5180 101 93.7500 93.7500 93.7500 82.2769 86.5032 94.1415 102 95.8333 95.8333 95.8333 86.4317 90.8742 98.9029 103 97.9167 97.9167 97.9167 90.7080 95.3727 103.803 104 25.0000 25.0000 0.00000 4.87856 5.67311 1.69777 105 50.0000 25.0000 0.00000 11.5406 9.10808 2.00994 106 75.0000 25.0000 0.00000 24.1359 15.6023 2.60014 107 100.000 25.0000 0.00000 43.6314 25.6542 3.51366 108 100.000 75.0000 0.00000 60.3302 59.0470 9.07994 109 50.0000 50.0000 0.00000 17.3175 20.6603 3.93559 110 75.0000 50.0000 0.00000 29.9128 27.1544 4.52578 111 100.000 50.0000 0.00000 49.4083 37.2064 5.43931 112 100.000 100.000 100.000 95.1065 100.000 108.844 113 50.0000 75.0000 0.00000 28.2393 42.5008 7.57622 114 75.0000 75.0000 0.00000 40.8346 48.9950 8.16642 115 25.0000 75.0000 0.00000 21.5773 39.0658 7.26405 116 25.0000 100.000 0.00000 38.4825 72.8716 12.8992 117 50.0000 100.000 0.00000 45.1445 76.3065 13.2113 118 75.0000 100.000 0.00000 57.7399 82.8007 13.8015 119 100.000 100.000 0.00000 77.2354 92.8527 14.7151 120 25.0000 0.00000 25.0000 3.98649 2.43468 5.88625 121 50.0000 0.00000 25.0000 10.6485 5.86966 6.19842 122 75.0000 0.00000 25.0000 23.2439 12.3638 6.78862 123 75.0000 25.0000 25.0000 25.0451 15.9659 7.38905 124 87.5000 37.5000 37.5000 37.3481 25.5975 14.7033 125 56.2500 0.00000 0.00000 12.2903 6.82130 1.52904 126 100.000 0.00000 25.0000 42.7394 22.4158 7.70214 127 100.000 25.0000 25.0000 44.5407 26.0178 8.30257 128 100.000 25.0000 50.0000 47.4566 27.1840 23.6611 129 50.0000 25.0000 25.0000 12.4498 9.47171 6.79885 130 50.0000 50.0000 25.0000 18.2267 21.0239 8.72450 131 75.0000 50.0000 25.0000 30.8220 27.5181 9.31470 132 100.000 50.0000 25.0000 50.3176 37.5700 10.2282 133 25.0000 50.0000 25.0000 11.5647 17.5889 8.41233 134 25.0000 75.0000 25.0000 22.4865 39.4295 12.0530 135 50.0000 75.0000 25.0000 29.1485 42.8645 12.3651 136 75.0000 75.0000 25.0000 41.7438 49.3586 12.9553 137 100.000 75.0000 25.0000 61.2394 59.4106 13.8689 138 25.0000 50.0000 0.00000 10.6555 17.2253 3.62342 139 25.0000 100.000 25.0000 39.3917 73.2352 17.6881 140 50.0000 100.000 25.0000 46.0538 76.6702 18.0003 141 75.0000 100.000 25.0000 58.6491 83.1644 18.5905 142 100.000 100.000 25.0000 78.1446 93.2163 19.5040 143 25.0000 0.00000 50.0000 6.90243 3.60087 21.2448 144 50.0000 0.00000 50.0000 13.5645 7.03585 21.5570 145 75.0000 0.00000 50.0000 26.1598 13.5300 22.1472 146 100.000 0.00000 50.0000 45.6553 23.5820 23.0607 147 100.000 50.0000 75.0000 58.7464 40.9410 54.6237 148 100.000 50.0000 100.000 67.2794 44.3537 99.5683 149 50.0000 25.0000 50.0000 15.3658 10.6379 22.1574 150 75.0000 25.0000 50.0000 27.9611 17.1321 22.7476 151 100.000 25.0000 75.0000 52.9695 29.3888 52.6981 152 25.0000 25.0000 50.0000 8.70371 7.20292 21.8452 153 25.0000 50.0000 50.0000 14.4806 18.7551 23.7709 154 75.0000 50.0000 50.0000 33.7380 28.6843 24.6733 155 100.000 50.0000 50.0000 53.2335 38.7362 25.5868 156 100.000 75.0000 50.0000 64.1553 60.5768 29.2274 157 87.5000 62.5000 62.5000 49.7345 43.7199 39.3315 158 87.5000 87.5000 62.5000 63.5544 71.3558 43.9382 159 100.000 100.000 75.0000 86.5734 96.5873 63.8995 160 0.00000 68.7500 0.00000 16.2382 31.4721 6.07943 161 0.00000 100.000 25.0000 37.3144 72.1641 17.5907 162 0.00000 100.000 50.0000 40.2304 73.3303 32.9493 163 50.0000 100.000 50.0000 48.9697 77.8364 33.3588 164 75.0000 100.000 50.0000 61.5650 84.3305 33.9490 165 100.000 100.000 50.0000 81.0605 94.3825 34.8625 166 25.0000 0.00000 75.0000 12.4153 5.80568 50.2817 167 50.0000 0.00000 75.0000 19.0774 9.24066 50.5939 168 75.0000 0.00000 75.0000 31.6727 15.7348 51.1841 169 100.000 0.00000 75.0000 51.1682 25.7868 52.0976 170 100.000 0.00000 100.000 59.7013 29.1995 97.0422 171 25.0000 25.0000 75.0000 14.2166 9.40773 50.8822 172 50.0000 25.0000 75.0000 20.8787 12.8427 51.1944 173 75.0000 25.0000 75.0000 33.4740 19.3369 51.7845 174 0.00000 31.2500 0.00000 3.81760 6.63441 1.93921 175 0.00000 37.5000 0.00000 5.10758 9.21400 2.36920 176 25.0000 50.0000 75.0000 19.9935 20.9599 52.8078 177 50.0000 50.0000 75.0000 26.6555 24.3949 53.1200 178 75.0000 50.0000 75.0000 39.2509 30.8891 53.7102 179 100.000 75.0000 75.0000 69.6682 62.7816 58.2644 180 100.000 75.0000 100.000 78.2013 66.1943 103.209 181 0.00000 0.00000 0.00000 1.00000 1.00000 1.00000 182 12.5000 37.5000 37.5000 7.76682 10.3453 13.3171 183 25.0000 75.0000 50.0000 25.4024 40.5957 27.4115 184 25.0000 100.000 50.0000 42.3076 74.4014 33.0466 185 25.0000 100.000 75.0000 47.8205 76.6062 62.0836 186 50.0000 100.000 75.0000 54.4826 80.0412 62.3958 187 75.0000 100.000 75.0000 67.0779 86.5354 62.9859 188 100.000 100.000 100.000 95.1065 100.000 108.844 189 25.0000 0.00000 100.000 20.9484 9.21837 95.2263 190 50.0000 0.00000 100.000 27.6104 12.6533 95.5385 191 75.0000 0.00000 100.000 40.2058 19.1475 96.1287 192 75.0000 75.0000 100.000 58.7057 56.1423 102.295 193 0.00000 25.0000 100.000 20.6724 11.7494 95.7294 194 25.0000 25.0000 100.000 22.7497 12.8204 95.8267 195 50.0000 25.0000 100.000 29.4117 16.2554 96.1389 196 75.0000 25.0000 100.000 42.0070 22.7496 96.7291 197 100.000 25.0000 100.000 61.5026 32.8015 97.6426 198 0.00000 0.00000 0.00000 1.00000 1.00000 1.00000 199 25.0000 50.0000 100.000 28.5266 24.3726 97.7524 200 50.0000 50.0000 100.000 35.1886 27.8076 98.0645 201 50.0000 75.0000 100.000 46.1104 49.6481 101.705 202 12.5000 62.5000 62.5000 20.1532 28.4677 37.9454 203 12.5000 62.5000 87.5000 27.1290 31.2576 74.6872 204 25.0000 75.0000 100.000 39.4484 46.2132 101.393 205 0.00000 50.0000 50.0000 12.4033 17.6840 23.6735 206 0.00000 75.0000 75.0000 28.8380 41.7294 56.3511 207 0.00000 100.000 75.0000 45.7432 75.5351 61.9862 208 0.00000 100.000 100.000 54.2763 78.9478 106.931 209 25.0000 100.000 100.000 56.3536 80.0189 107.028 210 50.0000 100.000 100.000 63.0157 83.4539 107.340 211 75.0000 100.000 100.000 75.6110 89.9480 107.930 212 62.5000 0.00000 0.00000 15.2297 8.33690 1.66678 213 68.7500 0.00000 0.00000 18.5730 10.0607 1.82344 214 100.000 100.000 100.000 95.1065 100.000 108.844 215 0.00000 25.0000 0.00000 2.80128 4.60205 1.60043 216 37.5000 37.5000 12.5000 10.1010 11.7590 3.94191 217 62.5000 37.5000 12.5000 19.5938 16.6535 4.38672 218 87.5000 37.5000 12.5000 35.5312 24.8708 5.13352 219 37.5000 12.5000 12.5000 6.50147 4.56093 2.74206 220 62.5000 12.5000 12.5000 15.9942 9.45544 3.18687 221 87.5000 12.5000 12.5000 31.9317 17.6728 3.93367 222 87.5000 62.5000 12.5000 43.7627 41.3315 7.87738 223 37.5000 62.5000 12.5000 18.3325 28.2197 6.68576 224 37.5000 87.5000 12.5000 32.1524 55.8555 11.2924 225 62.5000 87.5000 12.5000 41.6451 60.7500 11.7372 226 87.5000 87.5000 12.5000 57.5826 68.9674 12.4840 227 12.5000 12.5000 37.5000 4.16730 3.14728 12.1173 228 37.5000 12.5000 37.5000 8.31836 5.28757 12.3118 229 62.5000 12.5000 37.5000 17.8111 10.1821 12.7566 230 87.5000 12.5000 37.5000 33.7486 18.3995 13.5034 231 87.5000 62.5000 37.5000 45.5796 42.0582 17.4471 232 62.5000 37.5000 37.5000 21.4106 17.3801 13.9565 233 62.5000 62.5000 37.5000 29.6421 33.8408 16.7003 234 37.5000 37.5000 37.5000 11.9179 12.4856 13.5116 235 37.5000 62.5000 37.5000 20.1494 28.9463 16.2555 236 50.0000 75.0000 50.0000 32.0645 44.0306 27.7237 237 12.5000 87.5000 12.5000 28.0013 53.7152 11.0979 238 12.5000 87.5000 37.5000 29.8182 54.4419 20.6677 239 37.5000 87.5000 37.5000 33.9692 56.5822 20.8622 240 62.5000 87.5000 37.5000 43.4620 61.4767 21.3070 241 87.5000 87.5000 37.5000 59.3994 69.6941 22.0538 242 18.7500 0.00000 0.00000 2.19807 1.61773 1.05614 243 37.5000 12.5000 62.5000 12.4733 6.94928 34.1962 244 62.5000 12.5000 62.5000 21.9661 11.8438 34.6410 245 87.5000 12.5000 62.5000 37.9035 20.0612 35.3878 246 87.5000 12.5000 87.5000 44.8792 22.8510 72.1296 247 87.5000 37.5000 87.5000 48.4787 30.0490 73.3295 248 87.5000 62.5000 87.5000 56.7102 46.5097 76.0733 249 0.00000 18.7500 0.00000 2.03889 3.07749 1.34630 250 0.00000 50.0000 25.0000 9.48738 16.5179 8.31499 251 0.00000 75.0000 25.0000 20.4092 38.3584 11.9556 252 0.00000 75.0000 50.0000 23.3251 39.5246 27.3142 253 12.5000 87.5000 62.5000 33.9731 56.1036 42.5521 254 37.5000 87.5000 62.5000 38.1242 58.2439 42.7466 255 62.5000 87.5000 62.5000 47.6169 63.1384 43.1914 256 12.5000 12.5000 62.5000 8.32223 4.80899 34.0017 257 12.5000 12.5000 87.5000 15.2979 7.59883 70.7435 258 37.5000 12.5000 87.5000 19.4490 9.73913 70.9380 259 62.5000 12.5000 87.5000 28.9418 14.6336 71.3828 260 12.5000 37.5000 62.5000 11.9217 12.0070 35.2016 261 12.5000 37.5000 87.5000 18.8975 14.7969 71.9433 262 37.5000 37.5000 87.5000 23.0485 16.9371 72.1379 263 62.5000 37.5000 87.5000 32.5413 21.8317 72.5827 264 37.5000 37.5000 62.5000 16.0728 14.1473 35.3961 265 37.5000 62.5000 62.5000 24.3043 30.6080 38.1399 266 37.5000 62.5000 87.5000 31.2800 33.3978 74.8817 267 62.5000 62.5000 87.5000 40.7728 38.2924 75.3265 268 62.5000 87.5000 87.5000 54.5927 65.9282 79.9332 269 0.00000 25.0000 75.0000 12.1393 8.33668 50.7848 270 0.00000 50.0000 75.0000 17.9162 19.8888 52.7105 271 0.00000 75.0000 100.000 37.3711 45.1421 101.296 END_DATA CAL DESCRIPTOR "Argyll Device Calibration State" ORIGINATOR "Argyll dispcal" CREATED "Sat Mar 14 19:07:36 2009" KEYWORD "DEVICE_CLASS" DEVICE_CLASS "DISPLAY" KEYWORD "COLOR_REP" COLOR_REP "RGB" BEGIN_ARGYLL_DISPCAL_ARGS -qm -w0.3127,0.3290 -f0 -k0 END_ARGYLL_DISPCAL_ARGS KEYWORD "RGB_I" NUMBER_OF_FIELDS 4 BEGIN_DATA_FORMAT RGB_I RGB_R RGB_G RGB_B END_DATA_FORMAT NUMBER_OF_SETS 256 BEGIN_DATA 0.00000 0.00000 0.00000 0.00000 0.00392 0.00392 0.00392 0.00392 0.00784 0.00784 0.00784 0.00784 0.01176 0.01176 0.01176 0.01176 0.01569 0.01569 0.01569 0.01569 0.01961 0.01961 0.01961 0.01961 0.02353 0.02353 0.02353 0.02353 0.02745 0.02745 0.02745 0.02745 0.03137 0.03137 0.03137 0.03137 0.03529 0.03529 0.03529 0.03529 0.03922 0.03922 0.03922 0.03922 0.04314 0.04314 0.04314 0.04314 0.04706 0.04706 0.04706 0.04706 0.05098 0.05098 0.05098 0.05098 0.05490 0.05490 0.05490 0.05490 0.05882 0.05882 0.05882 0.05882 0.06275 0.06275 0.06275 0.06275 0.06667 0.06667 0.06667 0.06667 0.07059 0.07059 0.07059 0.07059 0.07451 0.07451 0.07451 0.07451 0.07843 0.07843 0.07843 0.07843 0.08235 0.08235 0.08235 0.08235 0.08627 0.08627 0.08627 0.08627 0.09020 0.09020 0.09020 0.09020 0.09412 0.09412 0.09412 0.09412 0.09804 0.09804 0.09804 0.09804 0.10196 0.10196 0.10196 0.10196 0.10588 0.10588 0.10588 0.10588 0.10980 0.10980 0.10980 0.10980 0.11373 0.11373 0.11373 0.11373 0.11765 0.11765 0.11765 0.11765 0.12157 0.12157 0.12157 0.12157 0.12549 0.12549 0.12549 0.12549 0.12941 0.12941 0.12941 0.12941 0.13333 0.13333 0.13333 0.13333 0.13725 0.13725 0.13725 0.13725 0.14118 0.14118 0.14118 0.14118 0.14510 0.14510 0.14510 0.14510 0.14902 0.14902 0.14902 0.14902 0.15294 0.15294 0.15294 0.15294 0.15686 0.15686 0.15686 0.15686 0.16078 0.16078 0.16078 0.16078 0.16471 0.16471 0.16471 0.16471 0.16863 0.16863 0.16863 0.16863 0.17255 0.17255 0.17255 0.17255 0.17647 0.17647 0.17647 0.17647 0.18039 0.18039 0.18039 0.18039 0.18431 0.18431 0.18431 0.18431 0.18824 0.18824 0.18824 0.18824 0.19216 0.19216 0.19216 0.19216 0.19608 0.19608 0.19608 0.19608 0.20000 0.20000 0.20000 0.20000 0.20392 0.20392 0.20392 0.20392 0.20784 0.20784 0.20784 0.20784 0.21176 0.21176 0.21176 0.21176 0.21569 0.21569 0.21569 0.21569 0.21961 0.21961 0.21961 0.21961 0.22353 0.22353 0.22353 0.22353 0.22745 0.22745 0.22745 0.22745 0.23137 0.23137 0.23137 0.23137 0.23529 0.23529 0.23529 0.23529 0.23922 0.23922 0.23922 0.23922 0.24314 0.24314 0.24314 0.24314 0.24706 0.24706 0.24706 0.24706 0.25098 0.25098 0.25098 0.25098 0.25490 0.25490 0.25490 0.25490 0.25882 0.25882 0.25882 0.25882 0.26275 0.26275 0.26275 0.26275 0.26667 0.26667 0.26667 0.26667 0.27059 0.27059 0.27059 0.27059 0.27451 0.27451 0.27451 0.27451 0.27843 0.27843 0.27843 0.27843 0.28235 0.28235 0.28235 0.28235 0.28627 0.28627 0.28627 0.28627 0.29020 0.29020 0.29020 0.29020 0.29412 0.29412 0.29412 0.29412 0.29804 0.29804 0.29804 0.29804 0.30196 0.30196 0.30196 0.30196 0.30588 0.30588 0.30588 0.30588 0.30980 0.30980 0.30980 0.30980 0.31373 0.31373 0.31373 0.31373 0.31765 0.31765 0.31765 0.31765 0.32157 0.32157 0.32157 0.32157 0.32549 0.32549 0.32549 0.32549 0.32941 0.32941 0.32941 0.32941 0.33333 0.33333 0.33333 0.33333 0.33725 0.33725 0.33725 0.33725 0.34118 0.34118 0.34118 0.34118 0.34510 0.34510 0.34510 0.34510 0.34902 0.34902 0.34902 0.34902 0.35294 0.35294 0.35294 0.35294 0.35686 0.35686 0.35686 0.35686 0.36078 0.36078 0.36078 0.36078 0.36471 0.36471 0.36471 0.36471 0.36863 0.36863 0.36863 0.36863 0.37255 0.37255 0.37255 0.37255 0.37647 0.37647 0.37647 0.37647 0.38039 0.38039 0.38039 0.38039 0.38431 0.38431 0.38431 0.38431 0.38824 0.38824 0.38824 0.38824 0.39216 0.39216 0.39216 0.39216 0.39608 0.39608 0.39608 0.39608 0.40000 0.40000 0.40000 0.40000 0.40392 0.40392 0.40392 0.40392 0.40784 0.40784 0.40784 0.40784 0.41176 0.41176 0.41176 0.41176 0.41569 0.41569 0.41569 0.41569 0.41961 0.41961 0.41961 0.41961 0.42353 0.42353 0.42353 0.42353 0.42745 0.42745 0.42745 0.42745 0.43137 0.43137 0.43137 0.43137 0.43529 0.43529 0.43529 0.43529 0.43922 0.43922 0.43922 0.43922 0.44314 0.44314 0.44314 0.44314 0.44706 0.44706 0.44706 0.44706 0.45098 0.45098 0.45098 0.45098 0.45490 0.45490 0.45490 0.45490 0.45882 0.45882 0.45882 0.45882 0.46275 0.46275 0.46275 0.46275 0.46667 0.46667 0.46667 0.46667 0.47059 0.47059 0.47059 0.47059 0.47451 0.47451 0.47451 0.47451 0.47843 0.47843 0.47843 0.47843 0.48235 0.48235 0.48235 0.48235 0.48627 0.48627 0.48627 0.48627 0.49020 0.49020 0.49020 0.49020 0.49412 0.49412 0.49412 0.49412 0.49804 0.49804 0.49804 0.49804 0.50196 0.50196 0.50196 0.50196 0.50588 0.50588 0.50588 0.50588 0.50980 0.50980 0.50980 0.50980 0.51373 0.51373 0.51373 0.51373 0.51765 0.51765 0.51765 0.51765 0.52157 0.52157 0.52157 0.52157 0.52549 0.52549 0.52549 0.52549 0.52941 0.52941 0.52941 0.52941 0.53333 0.53333 0.53333 0.53333 0.53725 0.53725 0.53725 0.53725 0.54118 0.54118 0.54118 0.54118 0.54510 0.54510 0.54510 0.54510 0.54902 0.54902 0.54902 0.54902 0.55294 0.55294 0.55294 0.55294 0.55686 0.55686 0.55686 0.55686 0.56078 0.56078 0.56078 0.56078 0.56471 0.56471 0.56471 0.56471 0.56863 0.56863 0.56863 0.56863 0.57255 0.57255 0.57255 0.57255 0.57647 0.57647 0.57647 0.57647 0.58039 0.58039 0.58039 0.58039 0.58431 0.58431 0.58431 0.58431 0.58824 0.58824 0.58824 0.58824 0.59216 0.59216 0.59216 0.59216 0.59608 0.59608 0.59608 0.59608 0.60000 0.60000 0.60000 0.60000 0.60392 0.60392 0.60392 0.60392 0.60784 0.60784 0.60784 0.60784 0.61176 0.61176 0.61176 0.61176 0.61569 0.61569 0.61569 0.61569 0.61961 0.61961 0.61961 0.61961 0.62353 0.62353 0.62353 0.62353 0.62745 0.62745 0.62745 0.62745 0.63137 0.63137 0.63137 0.63137 0.63529 0.63529 0.63529 0.63529 0.63922 0.63922 0.63922 0.63922 0.64314 0.64314 0.64314 0.64314 0.64706 0.64706 0.64706 0.64706 0.65098 0.65098 0.65098 0.65098 0.65490 0.65490 0.65490 0.65490 0.65882 0.65882 0.65882 0.65882 0.66275 0.66275 0.66275 0.66275 0.66667 0.66667 0.66667 0.66667 0.67059 0.67059 0.67059 0.67059 0.67451 0.67451 0.67451 0.67451 0.67843 0.67843 0.67843 0.67843 0.68235 0.68235 0.68235 0.68235 0.68627 0.68627 0.68627 0.68627 0.69020 0.69020 0.69020 0.69020 0.69412 0.69412 0.69412 0.69412 0.69804 0.69804 0.69804 0.69804 0.70196 0.70196 0.70196 0.70196 0.70588 0.70588 0.70588 0.70588 0.70980 0.70980 0.70980 0.70980 0.71373 0.71373 0.71373 0.71373 0.71765 0.71765 0.71765 0.71765 0.72157 0.72157 0.72157 0.72157 0.72549 0.72549 0.72549 0.72549 0.72941 0.72941 0.72941 0.72941 0.73333 0.73333 0.73333 0.73333 0.73725 0.73725 0.73725 0.73725 0.74118 0.74118 0.74118 0.74118 0.74510 0.74510 0.74510 0.74510 0.74902 0.74902 0.74902 0.74902 0.75294 0.75294 0.75294 0.75294 0.75686 0.75686 0.75686 0.75686 0.76078 0.76078 0.76078 0.76078 0.76471 0.76471 0.76471 0.76471 0.76863 0.76863 0.76863 0.76863 0.77255 0.77255 0.77255 0.77255 0.77647 0.77647 0.77647 0.77647 0.78039 0.78039 0.78039 0.78039 0.78431 0.78431 0.78431 0.78431 0.78824 0.78824 0.78824 0.78824 0.79216 0.79216 0.79216 0.79216 0.79608 0.79608 0.79608 0.79608 0.80000 0.80000 0.80000 0.80000 0.80392 0.80392 0.80392 0.80392 0.80784 0.80784 0.80784 0.80784 0.81176 0.81176 0.81176 0.81176 0.81569 0.81569 0.81569 0.81569 0.81961 0.81961 0.81961 0.81961 0.82353 0.82353 0.82353 0.82353 0.82745 0.82745 0.82745 0.82745 0.83137 0.83137 0.83137 0.83137 0.83529 0.83529 0.83529 0.83529 0.83922 0.83922 0.83922 0.83922 0.84314 0.84314 0.84314 0.84314 0.84706 0.84706 0.84706 0.84706 0.85098 0.85098 0.85098 0.85098 0.85490 0.85490 0.85490 0.85490 0.85882 0.85882 0.85882 0.85882 0.86275 0.86275 0.86275 0.86275 0.86667 0.86667 0.86667 0.86667 0.87059 0.87059 0.87059 0.87059 0.87451 0.87451 0.87451 0.87451 0.87843 0.87843 0.87843 0.87843 0.88235 0.88235 0.88235 0.88235 0.88627 0.88627 0.88627 0.88627 0.89020 0.89020 0.89020 0.89020 0.89412 0.89412 0.89412 0.89412 0.89804 0.89804 0.89804 0.89804 0.90196 0.90196 0.90196 0.90196 0.90588 0.90588 0.90588 0.90588 0.90980 0.90980 0.90980 0.90980 0.91373 0.91373 0.91373 0.91373 0.91765 0.91765 0.91765 0.91765 0.92157 0.92157 0.92157 0.92157 0.92549 0.92549 0.92549 0.92549 0.92941 0.92941 0.92941 0.92941 0.93333 0.93333 0.93333 0.93333 0.93725 0.93725 0.93725 0.93725 0.94118 0.94118 0.94118 0.94118 0.94510 0.94510 0.94510 0.94510 0.94902 0.94902 0.94902 0.94902 0.95294 0.95294 0.95294 0.95294 0.95686 0.95686 0.95686 0.95686 0.96078 0.96078 0.96078 0.96078 0.96471 0.96471 0.96471 0.96471 0.96863 0.96863 0.96863 0.96863 0.97255 0.97255 0.97255 0.97255 0.97647 0.97647 0.97647 0.97647 0.98039 0.98039 0.98039 0.98039 0.98431 0.98431 0.98431 0.98431 0.98824 0.98824 0.98824 0.98824 0.99216 0.99216 0.99216 0.99216 0.99608 0.99608 0.99608 0.99608 1.00000 1.00000 1.00000 1.00000 END_DATA DisplayCAL-3.1.0.0/misc/ti3/video_resolve.ti30000644000076500000000000034742112647526532020441 0ustar devwheel00000000000000CTI3 DESCRIPTOR "Argyll Calibration Target chart information 3" ORIGINATOR "Argyll dispread" CREATED "Sat Mar 14 19:00:55 2009" KEYWORD "DEVICE_CLASS" DEVICE_CLASS "DISPLAY" KEYWORD "APPROX_WHITE_POINT" APPROX_WHITE_POINT "95.045781 100.000003 108.905751" KEYWORD "DARK_REGION_EMPHASIS" DARK_REGION_EMPHASIS "1.6" KEYWORD "ACCURATE_EXPECTED_VALUES" ACCURATE_EXPECTED_VALUES "true" KEYWORD "COLOR_REP" COLOR_REP "RGB_XYZ" KEYWORD "BLACK_COLOR_PATCHES" BLACK_COLOR_PATCHES "4" KEYWORD "COMP_GREY_STEPS" COMP_GREY_STEPS "97" KEYWORD "SINGLE_DIM_STEPS" SINGLE_DIM_STEPS "33" KEYWORD "WHITE_COLOR_PATCHES" WHITE_COLOR_PATCHES "4" KEYWORD "USE_BLACK_POINT_COMPENSATION" USE_BLACK_POINT_COMPENSATION "NO" KEYWORD "MIN_DISPLAY_UPDATE_DELAY_MS" MIN_DISPLAY_UPDATE_DELAY_MS "600" KEYWORD "HIRES_B2A" HIRES_B2A "NO" KEYWORD "AUTO_OPTIMIZE" AUTO_OPTIMIZE "9" KEYWORD "3DLUT_SOURCE_PROFILE" 3DLUT_SOURCE_PROFILE "ref/Rec709.icm" KEYWORD "3DLUT_GAMMA" 3DLUT_GAMMA "-2.4" KEYWORD "3DLUT_DEGREE_OF_BLACK_OUTPUT_OFFSET" 3DLUT_DEGREE_OF_BLACK_OUTPUT_OFFSET "0.0" KEYWORD "3DLUT_INPUT_ENCODING" 3DLUT_INPUT_ENCODING "n" KEYWORD "3DLUT_OUTPUT_ENCODING" 3DLUT_OUTPUT_ENCODING "n" KEYWORD "3DLUT_GAMUT_MAPPING_MODE" 3DLUT_GAMUT_MAPPING_MODE "G" KEYWORD "3DLUT_RENDERING_INTENT" 3DLUT_RENDERING_INTENT "aw" KEYWORD "3DLUT_FORMAT" 3DLUT_FORMAT "cube" KEYWORD "3DLUT_SIZE" 3DLUT_SIZE "65" BEGIN_ARGYLL_COLPROF_ARGS -qh -bl -ax -M "Resolve" END_ARGYLL_COLPROF_ARGS NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT SAMPLE_ID RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 1399 BEGIN_DATA 1 100.0000000 100.0000000 100.0000000 95.04580000 100.0000000 108.9060000 2 36.18660000 40.25050000 29.03860000 10.43240000 12.41520000 8.082730000 3 75.62240000 56.57030000 28.01850000 33.62140000 32.37170000 10.24120000 4 82.79480000 56.83720000 43.69100000 40.46860000 35.84890000 20.10110000 5 19.47590000 14.15960000 0.000000000 1.614820000 1.553530000 0.214771000 6 20.94060000 9.655240000 0.000000000 1.533610000 1.101250000 0.131754000 7 21.64610000 0.000000000 9.880980000 1.535610000 0.778814000 0.651906000 8 64.49270000 50.86790000 23.72350000 24.56660000 24.58230000 7.448250000 9 78.94490000 73.49390000 36.37540000 44.63550000 49.75270000 17.48580000 10 0.000000000 15.10070000 0.000000000 0.559497000 1.119080000 0.186522000 11 0.000000000 9.493670000 0.000000000 0.201613000 0.403256000 0.067212600 12 11.29030000 0.000000000 0.000000000 0.340406000 0.175489000 0.015935900 13 13.15790000 0.000000000 0.000000000 0.476651000 0.245728000 0.022314200 14 13.21410000 8.186610000 0.000000000 0.626698000 0.539183000 0.071050300 15 6.646220000 6.646220000 6.646220000 0.244634000 0.257385000 0.280307000 16 9.493670000 9.493670000 9.493670000 0.535904000 0.563838000 0.614052000 17 15.10070000 0.000000000 0.000000000 0.645261000 0.332651000 0.030207600 18 17.12330000 0.000000000 0.000000000 0.850733000 0.438578000 0.039826700 19 19.23080000 0.000000000 0.000000000 1.098130000 0.566119000 0.051408600 20 21.42860000 0.000000000 0.000000000 1.393190000 0.718230000 0.065221500 21 23.72260000 0.000000000 0.000000000 1.742400000 0.898261000 0.081569800 22 26.11940000 0.000000000 0.000000000 2.153160000 1.110020000 0.100799000 23 28.62600000 0.000000000 0.000000000 2.633900000 1.357850000 0.123305000 24 31.25000000 0.000000000 0.000000000 3.194240000 1.646720000 0.149537000 25 34.00000000 0.000000000 0.000000000 3.845230000 1.982330000 0.180013000 26 36.88520000 0.000000000 0.000000000 4.599570000 2.371210000 0.215327000 27 39.91600000 0.000000000 0.000000000 5.471880000 2.820920000 0.256164000 28 43.10340000 0.000000000 0.000000000 6.479100000 3.340170000 0.303316000 29 46.46020000 0.000000000 0.000000000 7.640830000 3.939070000 0.357702000 30 50.00000000 0.000000000 0.000000000 8.979910000 4.629410000 0.420390000 31 53.73830000 0.000000000 0.000000000 10.52300000 5.424900000 0.492628000 32 57.69230000 0.000000000 0.000000000 12.30120000 6.341650000 0.575877000 33 61.88120000 0.000000000 0.000000000 14.35140000 7.398570000 0.671854000 34 66.32650000 0.000000000 0.000000000 16.71680000 8.618020000 0.782591000 35 71.05260000 0.000000000 0.000000000 19.44890000 10.02650000 0.910491000 36 76.08700000 0.000000000 0.000000000 22.60880000 11.65550000 1.058420000 37 81.46070000 0.000000000 0.000000000 26.26990000 13.54290000 1.229810000 38 87.20930000 0.000000000 0.000000000 30.52020000 15.73410000 1.428790000 39 93.37350000 0.000000000 0.000000000 35.46650000 18.28400000 1.660350000 40 100.0000000 0.000000000 0.000000000 41.23850000 21.25960000 1.930560000 41 13.02300000 15.75260000 0.000000000 1.079970000 1.468310000 0.226506000 42 10.68380000 10.68380000 10.68380000 0.694840000 0.731058000 0.796164000 43 4.491020000 0.000000000 0.000000000 0.044824300 0.023108300 0.002098430 44 7.201650000 7.201650000 7.201650000 0.291861000 0.307074000 0.334421000 45 0.000000000 1.445090000 0.000000000 0.003210470 0.006421420 0.001070290 46 0.000000000 2.941180000 0.000000000 0.015321700 0.030645700 0.005107870 47 0.000000000 4.491020000 0.000000000 0.038866600 0.077738900 0.012957100 48 7.763980000 7.763980000 7.763980000 0.344338000 0.362287000 0.394551000 49 0.000000000 13.15790000 0.000000000 0.413298000 0.826656000 0.137783000 50 0.000000000 17.12330000 0.000000000 0.737658000 1.475430000 0.245916000 51 0.000000000 19.23080000 0.000000000 0.952175000 1.904490000 0.317431000 52 0.000000000 21.42860000 0.000000000 1.208020000 2.416210000 0.402721000 53 0.000000000 23.72260000 0.000000000 1.510810000 3.021850000 0.503667000 54 0.000000000 26.11940000 0.000000000 1.866980000 3.734230000 0.622403000 55 0.000000000 28.62600000 0.000000000 2.283820000 4.567970000 0.761366000 56 0.000000000 31.25000000 0.000000000 2.769680000 5.539770000 0.923340000 57 0.000000000 34.00000000 0.000000000 3.334140000 6.668780000 1.111520000 58 0.000000000 36.88520000 0.000000000 3.988220000 7.977030000 1.329570000 59 0.000000000 39.91600000 0.000000000 4.744590000 9.489890000 1.581730000 60 0.000000000 43.10340000 0.000000000 5.617940000 11.23670000 1.872880000 61 0.000000000 46.46020000 0.000000000 6.625260000 13.25150000 2.208690000 62 0.000000000 50.00000000 0.000000000 7.786350000 15.57390000 2.595770000 63 0.000000000 53.73830000 0.000000000 9.124320000 18.25000000 3.041810000 64 0.000000000 57.69230000 0.000000000 10.66620000 21.33400000 3.555850000 65 0.000000000 61.88120000 0.000000000 12.44390000 24.88960000 4.148480000 66 0.000000000 66.32650000 0.000000000 14.49490000 28.99200000 4.832240000 67 0.000000000 71.05260000 0.000000000 16.86390000 33.73020000 5.621980000 68 0.000000000 76.08700000 0.000000000 19.60380000 39.21050000 6.535400000 69 0.000000000 81.46070000 0.000000000 22.77820000 45.55980000 7.593680000 70 0.000000000 87.20930000 0.000000000 26.46360000 52.93120000 8.822290000 71 0.000000000 93.37350000 0.000000000 30.75250000 61.50950000 10.25210000 72 0.000000000 100.0000000 0.000000000 35.75730000 71.51990000 11.92060000 73 28.34880000 100.0000000 70.37100000 46.66960000 76.18290000 55.93060000 74 67.98480000 100.0000000 74.26580000 62.78950000 84.37210000 62.15630000 75 83.59200000 100.0000000 74.15010000 72.91270000 89.59460000 62.46250000 76 100.0000000 100.0000000 79.29620000 87.83280000 97.11460000 70.92110000 77 9.863630000 9.892620000 0.000000000 0.473628000 0.571849000 0.085421100 78 0.000000000 0.000000000 2.941180000 0.007734280 0.003093910 0.040730200 79 0.000000000 0.000000000 4.491020000 0.019619500 0.007848320 0.103320000 80 0.000000000 0.000000000 6.097560000 0.038438800 0.015376500 0.202426000 81 0.000000000 0.000000000 13.15790000 0.208629000 0.083457100 1.098680000 82 0.000000000 0.000000000 17.12330000 0.372364000 0.148955000 1.960940000 83 0.000000000 0.000000000 19.23080000 0.480650000 0.192272000 2.531190000 84 0.000000000 0.000000000 21.42860000 0.609797000 0.243934000 3.211300000 85 0.000000000 0.000000000 23.72260000 0.762647000 0.305078000 4.016240000 86 0.000000000 0.000000000 26.11940000 0.942436000 0.376999000 4.963040000 87 0.000000000 0.000000000 28.62600000 1.152850000 0.461170000 6.071130000 88 0.000000000 0.000000000 31.25000000 1.398110000 0.559281000 7.362710000 89 0.000000000 0.000000000 34.00000000 1.683050000 0.673263000 8.863250000 90 0.000000000 0.000000000 36.88520000 2.013220000 0.805340000 10.60200000 91 0.000000000 0.000000000 39.91600000 2.395030000 0.958075000 12.61270000 92 0.000000000 0.000000000 43.10340000 2.835890000 1.134430000 14.93430000 93 0.000000000 0.000000000 46.46020000 3.344380000 1.337840000 17.61210000 94 0.000000000 0.000000000 50.00000000 3.930490000 1.572300000 20.69870000 95 0.000000000 0.000000000 53.73830000 4.605880000 1.842470000 24.25540000 96 0.000000000 0.000000000 66.32650000 7.316920000 2.926960000 38.53230000 97 0.000000000 0.000000000 71.05260000 8.512740000 3.405320000 44.82970000 98 0.000000000 0.000000000 76.08700000 9.895840000 3.958590000 52.11330000 99 0.000000000 0.000000000 81.46070000 11.49830000 4.599600000 60.55200000 100 0.000000000 0.000000000 87.20930000 13.35860000 5.343790000 70.34900000 101 0.000000000 0.000000000 93.37350000 15.52360000 6.209840000 81.75010000 102 0.000000000 0.000000000 100.0000000 18.05000000 7.220460000 95.05460000 103 55.83310000 0.000000000 79.89610000 22.46440000 10.30840000 58.55950000 104 65.71360000 65.46360000 80.69580000 41.72460000 41.11790000 64.77050000 105 0.000000000 16.36620000 11.20940000 0.814484000 1.394420000 0.994951000 106 11.90480000 11.90480000 11.90480000 0.881537000 0.927487000 1.010090000 107 7.763980000 0.000000000 0.000000000 0.149401000 0.077020800 0.006994160 108 0.000000000 7.763980000 0.000000000 0.129544000 0.259107000 0.043186600 109 0.000000000 0.000000000 7.763980000 0.065392700 0.026158800 0.344370000 110 0.000000000 6.097560000 0.000000000 0.076147800 0.152307000 0.025385700 111 6.097560000 0.000000000 0.000000000 0.087820400 0.045274000 0.004111270 112 0.000000000 0.000000000 1.445090000 0.001620620 0.000648290 0.008534490 113 0.476190000 0.476190000 0.476190000 0.000742788 0.000781505 0.000851104 114 0.957854000 0.957854000 0.957854000 0.003454370 0.003634430 0.003958100 115 1.445090000 1.445090000 1.445090000 0.008533690 0.008978510 0.009778110 116 9.493670000 0.000000000 0.000000000 0.232518000 0.119870000 0.010885200 117 1.937980000 1.937980000 1.937980000 0.016272000 0.017120200 0.018644900 118 0.000000000 0.000000000 9.493670000 0.101773000 0.040711700 0.535954000 119 2.436650000 2.436650000 2.436650000 0.026923800 0.028327200 0.030850000 120 2.941180000 2.941180000 2.941180000 0.040726400 0.042849200 0.046665300 121 3.451680000 3.451680000 3.451680000 0.057908400 0.060926800 0.066352800 122 3.968250000 3.968250000 3.968250000 0.078694900 0.082796800 0.090170500 123 4.491020000 4.491020000 4.491020000 0.103310000 0.108695000 0.118376000 124 5.020080000 5.020080000 5.020080000 0.131981000 0.138860000 0.151227000 125 0.000000000 0.000000000 11.29030000 0.148995000 0.059601800 0.784634000 126 5.555560000 5.555560000 5.555560000 0.164935000 0.173533000 0.188987000 127 6.097560000 6.097560000 6.097560000 0.202407000 0.212957000 0.231923000 128 8.333330000 8.333330000 8.333330000 0.402325000 0.423296000 0.460994000 129 12.52720000 12.52720000 12.52720000 0.986096000 1.037500000 1.129890000 130 13.15790000 13.15790000 13.15790000 1.098580000 1.155840000 1.258780000 131 13.79690000 13.79690000 13.79690000 1.219340000 1.282900000 1.397150000 132 14.44440000 14.44440000 14.44440000 1.348750000 1.419050000 1.545430000 133 15.76580000 15.76580000 15.76580000 1.635060000 1.720280000 1.873490000 134 16.43990000 16.43990000 16.43990000 1.792770000 1.886220000 2.054200000 135 17.12330000 17.12330000 17.12330000 1.960760000 2.062960000 2.246680000 136 17.81610000 17.81610000 17.81610000 2.139470000 2.250990000 2.451450000 137 18.51850000 18.51850000 18.51850000 2.329370000 2.450790000 2.669050000 138 19.23080000 19.23080000 19.23080000 2.530960000 2.662880000 2.900030000 139 19.95310000 19.95310000 19.95310000 2.744730000 2.887800000 3.144980000 140 20.68560000 20.68560000 20.68560000 2.971230000 3.126100000 3.404510000 141 21.42860000 21.42860000 21.42860000 3.211000000 3.378370000 3.679240000 142 22.18230000 22.18230000 22.18230000 3.464630000 3.645220000 3.969850000 143 23.72260000 23.72260000 23.72260000 4.015870000 4.225190000 4.601480000 144 24.50980000 24.50980000 24.50980000 4.314770000 4.539670000 4.943970000 145 25.30860000 25.30860000 25.30860000 4.630100000 4.871440000 5.305280000 146 26.11940000 26.11940000 26.11940000 4.962580000 5.221250000 5.686240000 147 26.94240000 26.94240000 26.94240000 5.312950000 5.589890000 6.087710000 148 27.77780000 27.77780000 27.77780000 5.682010000 5.978180000 6.510580000 149 28.62600000 28.62600000 28.62600000 6.070570000 6.386990000 6.955800000 150 29.48720000 29.48720000 29.48720000 6.479480000 6.817220000 7.424350000 151 30.36180000 30.36180000 30.36180000 6.909660000 7.269820000 7.917250000 152 31.25000000 31.25000000 31.25000000 7.362030000 7.745770000 8.435590000 153 32.15220000 32.15220000 32.15220000 7.837590000 8.246120000 8.980490000 154 33.06880000 33.06880000 33.06880000 8.337360000 8.771940000 9.553140000 155 34.00000000 34.00000000 34.00000000 8.862420000 9.324370000 10.15480000 156 34.94620000 34.94620000 34.94620000 9.413920000 9.904620000 10.78670000 157 35.90790000 35.90790000 35.90790000 9.993030000 10.51390000 11.45030000 158 36.88520000 36.88520000 36.88520000 10.60100000 11.15360000 12.14690000 159 37.87880000 37.87880000 37.87880000 11.23920000 11.82500000 12.87810000 160 38.88890000 38.88890000 38.88890000 11.90880000 12.52960000 13.64540000 161 39.91600000 39.91600000 39.91600000 12.61150000 13.26890000 14.45060000 162 40.96050000 40.96050000 40.96050000 13.34870000 14.04450000 15.29520000 163 42.02280000 42.02280000 42.02280000 14.12190000 14.85800000 16.18120000 164 43.10340000 43.10340000 43.10340000 14.93290000 15.71130000 17.11050000 165 44.20290000 44.20290000 44.20290000 15.78340000 16.60610000 18.08500000 166 45.32160000 45.32160000 45.32160000 16.67530000 17.54450000 19.10700000 167 46.46020000 46.46020000 46.46020000 17.61050000 18.52840000 20.17850000 168 47.61900000 47.61900000 47.61900000 18.59100000 19.56000000 21.30200000 169 48.79880000 48.79880000 48.79880000 19.61900000 20.64160000 22.47990000 170 50.00000000 50.00000000 50.00000000 20.69670000 21.77560000 23.71480000 171 51.22320000 51.22320000 51.22320000 21.82670000 22.96440000 25.00950000 172 52.46910000 52.46910000 52.46910000 23.01130000 24.21070000 26.36680000 173 53.73830000 53.73830000 53.73830000 24.25320000 25.51740000 27.78990000 174 55.03140000 55.03140000 55.03140000 25.55520000 26.88730000 29.28180000 175 56.34920000 56.34920000 56.34920000 26.92030000 28.32360000 30.84600000 176 57.69230000 57.69230000 57.69230000 28.35170000 29.82950000 32.48600000 177 59.06150000 59.06150000 59.06150000 29.85250000 31.40860000 34.20580000 178 60.45750000 60.45750000 60.45750000 31.42640000 33.06450000 36.00910000 179 61.88120000 61.88120000 61.88120000 33.07690000 34.80100000 37.90030000 180 63.33330000 63.33330000 63.33330000 34.80800000 36.62230000 39.88380000 181 64.81480000 64.81480000 64.81480000 36.62380000 38.53280000 41.96440000 182 66.32650000 66.32650000 66.32650000 38.52870000 40.53700000 44.14710000 183 67.86940000 67.86940000 67.86940000 40.52730000 42.63970000 46.43710000 184 69.44440000 69.44440000 69.44440000 42.62450000 44.84630000 48.84020000 185 71.05260000 71.05260000 71.05260000 44.82550000 47.16200000 51.36210000 186 72.69500000 72.69500000 72.69500000 47.13590000 49.59280000 54.00940000 187 74.37280000 74.37280000 74.37280000 49.56140000 52.14480000 56.78870000 188 76.08700000 76.08700000 76.08700000 52.10840000 54.82460000 59.70710000 189 77.83880000 77.83880000 77.83880000 54.78350000 57.63910000 62.77220000 190 79.62960000 79.62960000 79.62960000 57.59360000 60.59570000 65.99220000 191 81.46070000 81.46070000 81.46070000 60.54640000 63.70230000 69.37550000 192 83.33330000 83.33330000 83.33330000 63.64960000 66.96740000 72.93130000 193 85.24900000 85.24900000 85.24900000 66.91200000 70.39970000 76.66940000 194 87.20930000 87.20930000 87.20930000 70.34240000 74.00900000 80.60010000 195 89.21570000 89.21570000 89.21570000 73.95070000 77.80530000 84.73450000 196 91.26980000 91.26980000 91.26980000 77.74700000 81.79960000 89.08440000 197 100.0000000 100.0000000 91.96320000 92.00840000 98.78500000 92.91030000 198 100.0000000 81.60980000 76.74380000 74.19320000 71.03720000 62.66260000 199 100.0000000 84.45000000 86.88810000 79.14620000 75.87800000 79.93090000 200 10.94810000 0.000000000 9.601720000 0.422464000 0.205741000 0.564354000 201 0.000000000 0.000000000 15.10070000 0.282430000 0.112979000 1.487330000 202 0.000000000 10.33340000 22.67520000 0.933476000 0.762126000 3.717550000 203 29.91970000 0.000000000 42.70670000 5.681600000 2.608070000 14.76950000 204 44.35130000 0.000000000 67.30290000 14.45470000 6.579090000 40.11370000 205 49.52420000 69.01080000 78.69820000 35.26760000 40.43180000 61.81220000 206 23.75210000 70.09500000 0.000000000 18.11520000 33.63920000 5.538480000 207 53.09250000 71.70330000 0.000000000 27.45220000 39.69580000 6.215520000 208 100.0000000 85.42810000 33.11380000 68.11600000 72.47760000 18.72450000 209 100.0000000 91.35830000 69.54470000 78.67070000 83.13580000 54.46620000 210 46.72430000 20.89060000 43.02070000 11.70290000 7.402950000 15.61430000 211 66.90700000 19.55090000 51.63590000 22.24650000 12.44730000 23.34420000 212 0.000000000 0.000000000 57.69230000 5.384230000 2.153830000 28.35430000 213 0.000000000 45.59070000 80.88170000 17.67500000 17.24030000 61.72840000 214 0.000000000 62.98100000 84.26860000 25.32340000 30.82840000 69.54960000 215 0.000000000 45.08500000 59.05490000 11.86950000 14.67140000 31.91550000 216 0.000000000 64.62960000 71.11170000 22.22020000 30.79730000 49.47620000 217 0.000000000 52.38060000 57.51790000 13.97350000 19.39080000 31.04160000 218 0.000000000 69.86820000 68.43220000 24.08930000 35.64120000 46.69180000 219 0.000000000 70.48080000 100.0000000 34.61680000 40.35660000 100.5780000 220 0.000000000 79.35790000 100.0000000 39.55510000 50.23390000 102.2240000 221 0.000000000 88.78420000 100.0000000 45.57600000 62.27660000 104.2310000 222 0.000000000 41.38020000 31.03300000 6.512640000 10.82310000 8.962870000 223 0.000000000 58.32010000 30.07070000 12.20790000 22.36190000 10.40700000 224 47.77500000 37.97340000 0.000000000 12.37600000 12.69220000 1.797710000 225 61.25000000 46.87190000 0.000000000 20.78650000 20.74470000 2.908840000 226 70.64520000 60.11200000 0.000000000 30.87940000 33.25200000 4.791160000 227 83.29470000 84.23340000 0.000000000 52.10640000 63.26250000 9.465270000 228 65.23390000 68.26600000 0.000000000 31.56060000 39.19800000 5.902970000 229 68.39920000 78.31160000 14.21970000 39.02120000 51.09640000 9.103550000 230 74.32500000 100.0000000 38.72730000 59.47160000 83.48650000 24.72720000 231 79.58850000 100.0000000 84.97470000 73.33500000 89.43500000 79.53460000 232 0.000000000 18.62310000 21.20980000 1.483450000 2.013140000 3.435440000 233 0.000000000 25.31750000 31.72670000 3.188680000 4.064940000 8.193120000 234 0.000000000 34.90900000 45.97710000 6.801720000 8.374630000 18.38980000 235 68.27620000 43.77400000 49.31960000 27.44230000 22.33530000 22.85580000 236 76.82380000 70.03830000 53.78700000 44.04710000 46.43160000 30.83190000 237 0.000000000 32.92980000 28.79140000 4.275250000 6.682900000 7.184590000 238 0.000000000 73.75240000 63.54720000 24.96480000 39.27720000 41.17270000 239 0.000000000 100.0000000 77.27440000 45.99600000 75.61560000 65.83920000 240 0.000000000 100.0000000 88.30430000 49.48760000 77.01240000 84.22670000 241 0.000000000 100.0000000 100.0000000 53.80730000 78.74040000 106.9750000 242 0.000000000 39.39160000 61.53190000 10.81250000 11.69960000 34.20710000 243 0.000000000 44.09460000 100.0000000 23.95600000 19.03330000 97.02350000 244 0.000000000 52.35390000 100.0000000 26.66540000 24.45240000 97.92680000 245 0.000000000 61.07990000 100.0000000 30.14230000 31.40680000 99.08590000 246 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 247 41.54630000 0.000000000 12.81390000 6.172290000 3.159260000 1.316250000 248 70.31060000 0.000000000 23.65710000 19.76310000 10.10090000 4.881600000 249 84.78780000 0.000000000 47.23920000 32.15640000 16.17690000 19.61110000 250 100.0000000 0.000000000 52.92420000 45.69230000 23.04130000 25.38520000 251 100.0000000 0.000000000 63.08060000 47.79090000 23.88080000 36.43710000 252 100.0000000 0.000000000 86.90030000 54.49320000 26.56190000 71.73250000 253 68.22890000 19.45920000 60.43860000 24.73070000 13.51140000 32.56630000 254 48.72460000 0.000000000 34.30220000 10.20000000 5.060170000 9.434580000 255 53.83400000 0.000000000 45.04880000 13.68920000 6.696250000 16.95140000 256 67.68530000 0.000000000 45.44390000 20.66480000 10.28540000 17.59420000 257 81.86040000 0.000000000 57.65320000 31.93040000 15.84010000 29.55520000 258 85.37840000 0.000000000 88.42760000 42.90120000 20.52610000 73.89210000 259 35.12170000 51.67870000 44.44730000 15.53660000 20.08960000 18.96210000 260 35.46710000 50.54140000 54.26730000 16.89880000 20.00510000 27.63910000 261 35.06590000 58.32980000 61.56210000 21.25310000 26.46190000 36.54150000 262 37.98160000 74.68580000 93.19550000 39.18280000 46.35280000 87.91110000 263 64.46880000 83.77100000 100.0000000 57.97760000 63.76650000 103.8650000 264 78.79220000 83.70940000 100.0000000 66.64850000 68.17850000 104.2600000 265 100.0000000 91.11700000 100.0000000 88.43020000 86.76780000 106.7000000 266 24.52780000 0.000000000 30.82510000 3.231760000 1.509370000 7.232100000 267 26.78640000 0.000000000 70.09100000 10.53740000 4.478100000 43.61270000 268 32.26250000 0.000000000 100.0000000 21.47630000 8.986810000 95.21500000 269 41.60570000 26.46420000 100.0000000 25.96590000 14.15420000 95.97590000 270 43.49310000 55.64040000 100.0000000 34.50830000 30.32830000 98.64760000 271 49.41410000 69.26280000 100.0000000 42.74380000 43.62120000 100.7790000 272 87.38650000 68.53030000 100.0000000 64.28200000 54.17770000 101.6820000 273 100.0000000 70.32150000 100.0000000 75.77310000 61.45180000 102.4810000 274 57.05340000 10.24880000 17.93840000 12.65460000 6.830390000 2.813580000 275 81.57000000 0.000000000 14.12310000 26.59130000 13.68040000 2.517210000 276 100.0000000 100.0000000 53.18250000 81.49750000 94.58040000 37.55820000 277 23.05960000 26.79320000 0.000000000 3.611640000 4.793350000 0.734901000 278 34.13740000 29.37270000 0.000000000 6.296380000 6.834130000 0.987346000 279 32.55640000 80.25540000 32.30620000 27.04300000 46.49410000 15.43350000 280 58.17970000 100.0000000 36.82360000 50.29410000 78.78240000 23.07030000 281 83.54270000 100.0000000 54.40440000 68.25880000 87.72880000 38.14210000 282 89.27070000 100.0000000 66.01880000 75.12900000 90.98060000 51.56490000 283 66.72690000 72.46480000 50.02420000 38.48400000 45.52900000 27.38440000 284 100.0000000 87.27330000 56.80130000 72.94790000 76.35770000 38.16730000 285 57.75510000 51.51830000 31.22700000 22.04240000 23.54810000 10.70030000 286 100.0000000 53.93300000 31.98570000 51.90720000 40.24400000 12.74600000 287 100.0000000 64.63140000 35.47410000 56.77890000 49.38620000 16.22570000 288 100.0000000 67.54200000 48.16870000 59.94480000 52.88140000 26.02760000 289 50.82600000 34.81090000 23.64250000 13.57790000 12.12570000 5.592940000 290 74.50760000 34.78060000 23.70110000 25.85550000 18.44470000 6.187360000 291 74.80590000 60.99490000 100.0000000 51.88550000 42.56120000 100.0930000 292 75.51760000 71.74190000 100.0000000 57.51420000 53.13900000 101.8380000 293 0.000000000 70.77200000 33.60510000 18.35810000 34.09410000 14.21170000 294 0.000000000 85.54980000 37.24240000 27.42510000 51.56380000 19.28640000 295 0.000000000 100.0000000 38.83460000 38.01200000 72.42180000 23.79400000 296 0.000000000 100.0000000 53.37790000 40.29550000 73.33530000 35.81970000 297 0.000000000 23.42150000 12.51660000 1.655870000 3.012900000 1.474050000 298 0.000000000 33.74690000 14.29130000 3.530000000 6.660170000 2.411030000 299 76.51200000 42.82270000 64.60180000 35.33030000 25.63780000 39.28060000 300 90.95650000 61.21350000 65.16050000 52.66620000 44.37710000 42.67610000 301 35.83790000 17.90660000 19.48910000 5.626100000 4.051600000 3.080030000 302 51.74140000 23.38280000 26.49130000 12.11790000 8.307800000 6.060970000 303 86.42750000 51.87350000 84.87650000 50.94940000 37.34610000 70.49200000 304 100.0000000 57.73610000 100.0000000 69.97250000 49.84980000 100.5470000 305 0.000000000 45.49680000 16.16890000 6.655130000 12.78600000 3.837800000 306 15.40400000 54.88520000 32.03670000 11.70890000 20.05580000 10.99450000 307 25.43920000 100.0000000 91.44970000 52.61790000 78.49930000 90.10720000 308 33.60700000 100.0000000 100.0000000 57.55550000 80.67260000 107.1510000 309 0.000000000 35.99710000 66.56310000 11.15450000 10.51070000 40.09540000 310 0.000000000 37.62620000 83.49760000 16.30660000 13.19000000 65.32080000 311 25.70480000 0.000000000 22.66030000 2.768260000 1.347470000 3.728610000 312 100.0000000 0.000000000 25.12220000 42.10360000 21.60570000 6.486400000 313 100.0000000 0.000000000 34.27690000 42.95180000 21.94500000 10.95330000 314 100.0000000 0.000000000 43.47890000 44.12900000 22.41590000 17.15240000 315 16.94390000 0.000000000 19.64370000 1.334900000 0.630008000 2.691180000 316 15.27790000 8.502690000 21.40190000 1.428370000 0.901001000 3.286270000 317 11.55950000 25.56510000 33.91570000 3.813350000 4.416590000 9.425510000 318 0.000000000 53.56840000 44.48770000 12.10100000 19.33940000 19.03010000 319 0.000000000 65.37960000 51.20780000 18.18600000 29.74650000 26.49600000 320 0.000000000 82.14170000 58.76390000 28.80570000 48.64440000 37.25950000 321 0.000000000 100.0000000 65.27270000 42.82100000 74.34550000 49.11920000 322 17.92590000 21.10810000 13.36620000 2.325500000 2.908900000 1.570930000 323 24.55140000 17.89220000 17.91850000 3.103020000 2.758380000 2.525640000 324 32.26720000 35.31460000 82.87670000 18.99400000 13.79320000 64.25970000 325 20.95070000 32.28680000 39.12180000 6.593070000 7.552180000 13.12150000 326 37.29560000 37.04950000 52.32510000 13.08390000 12.22260000 24.43800000 327 46.70300000 100.0000000 79.55160000 54.40020000 79.87020000 69.75730000 328 56.97890000 100.0000000 100.0000000 65.77650000 84.91080000 107.5360000 329 0.000000000 43.67700000 24.89290000 6.631510000 11.90730000 6.393010000 330 0.000000000 70.38840000 45.80690000 19.76090000 34.33750000 22.57910000 331 49.68160000 69.57050000 48.97210000 28.70950000 38.26910000 25.55620000 332 100.0000000 70.42320000 68.15070000 65.54230000 57.44310000 48.34500000 333 53.40590000 35.08430000 32.46350000 15.47310000 13.10500000 9.683100000 334 71.03330000 33.87260000 31.11420000 24.12880000 17.18840000 9.304860000 335 100.0000000 53.27580000 42.16010000 52.89220000 40.24650000 19.14000000 336 100.0000000 77.17180000 53.54310000 66.03140000 63.53800000 32.73470000 337 100.0000000 21.12680000 0.000000000 42.40940000 23.60170000 2.320910000 338 100.0000000 21.04540000 18.88240000 42.86120000 23.76660000 4.749060000 339 100.0000000 21.68090000 40.48210000 44.94840000 24.72710000 15.35320000 340 100.0000000 19.02560000 51.30270000 46.32770000 24.78350000 24.14390000 341 51.58180000 24.09540000 0.000000000 11.18010000 8.084860000 0.971428000 342 71.14940000 23.40830000 0.000000000 20.97430000 12.99100000 1.402330000 343 84.52920000 36.02010000 0.000000000 32.28080000 22.26150000 2.595950000 344 100.0000000 36.08740000 0.000000000 45.03940000 28.86210000 3.197710000 345 100.0000000 73.56880000 0.000000000 59.44360000 57.67260000 7.999690000 346 100.0000000 86.17350000 0.000000000 67.01580000 72.81800000 10.52400000 347 15.10070000 15.10070000 15.10070000 1.487190000 1.564710000 1.704060000 348 10.08490000 10.08490000 10.08490000 0.612056000 0.643959000 0.701309000 349 0.000000000 11.29030000 0.000000000 0.295161000 0.590365000 0.098399100 350 11.29030000 11.29030000 11.29030000 0.784561000 0.825456000 0.898969000 351 40.36230000 32.79050000 25.84320000 9.606860000 9.417190000 6.137270000 352 47.73890000 38.56910000 47.42830000 16.01010000 14.38120000 20.27580000 353 47.51700000 39.87250000 62.61730000 19.20860000 16.18500000 35.90530000 354 59.89720000 62.95070000 100.0000000 44.33070000 39.95280000 99.98780000 355 65.58440000 75.65990000 100.0000000 53.72090000 54.35600000 102.2730000 356 100.0000000 80.84430000 100.0000000 81.68940000 73.28520000 104.4530000 357 45.74350000 22.67340000 29.48030000 9.981640000 7.034360000 7.278390000 358 53.92080000 28.84010000 42.45540000 15.66620000 11.20620000 15.71520000 359 75.30950000 29.37450000 44.14200000 27.50940000 17.42540000 17.57770000 360 38.12510000 41.34480000 22.11150000 10.72600000 13.06440000 5.381190000 361 37.85270000 75.21170000 41.88290000 26.64260000 41.80040000 20.61920000 362 44.94770000 100.0000000 44.47740000 45.90030000 76.39790000 28.25450000 363 27.82910000 42.06700000 60.86510000 13.85740000 14.35010000 33.78830000 364 45.53960000 54.98260000 60.91670000 22.97550000 25.38920000 35.49780000 365 50.84600000 73.25150000 74.56890000 36.81720000 44.65890000 56.30190000 366 58.24590000 83.01470000 75.60540000 46.06580000 57.87310000 59.89470000 367 41.79670000 60.83140000 53.76490000 22.65020000 28.93640000 28.56060000 368 52.81550000 100.0000000 57.36450000 51.20410000 78.86900000 40.39600000 369 52.66790000 100.0000000 69.15840000 53.84640000 79.91880000 54.63510000 370 63.00490000 100.0000000 83.41090000 62.80050000 84.06240000 76.40560000 371 28.23840000 0.000000000 17.02260000 2.923680000 1.464790000 2.055330000 372 44.93150000 13.47710000 100.0000000 25.58450000 11.75150000 95.53220000 373 56.74050000 24.06330000 100.0000000 31.46820000 16.45240000 96.12950000 374 70.66040000 33.59710000 100.0000000 40.51140000 23.62180000 97.03690000 375 86.98590000 44.71320000 100.0000000 54.48830000 35.04640000 98.50550000 376 23.51830000 10.56320000 76.16640000 11.88310000 5.358990000 52.39810000 377 38.74230000 20.56940000 76.20250000 16.15720000 8.821790000 52.89550000 378 59.54810000 39.57380000 75.90410000 27.68750000 20.04860000 54.00770000 379 72.45280000 58.73980000 76.83110000 41.50840000 36.70560000 57.89050000 380 93.37350000 93.37350000 93.37350000 81.74250000 86.00330000 93.66260000 381 95.52850000 95.52850000 95.52850000 85.94890000 90.42900000 98.48230000 382 97.73660000 97.73660000 97.73660000 90.37880000 95.08980000 103.5580000 383 0.000000000 15.57160000 35.87560000 2.492600000 1.954910000 10.17380000 384 0.000000000 19.86960000 35.08170000 2.826180000 2.767670000 9.836340000 385 27.00260000 20.61760000 50.36790000 7.420640000 5.011740000 21.51350000 386 26.97610000 29.77110000 61.05270000 10.89920000 8.610580000 33.05190000 387 41.67990000 28.86190000 62.91330000 14.85750000 10.35940000 35.36250000 388 45.94140000 77.64390000 71.80230000 36.66280000 48.32450000 53.05850000 389 47.79290000 80.80180000 83.00370000 42.48890000 53.73860000 70.94300000 390 46.83360000 84.04540000 100.0000000 50.22460000 60.02910000 103.5520000 391 0.000000000 21.06240000 64.94430000 8.148840000 5.120820000 37.17600000 392 0.000000000 29.32450000 67.53760000 10.02210000 7.862490000 40.89930000 393 0.000000000 48.99920000 72.75430000 16.41530000 18.48380000 49.70770000 394 100.0000000 49.20250000 74.82600000 58.29300000 40.10810000 54.66890000 395 100.0000000 64.00690000 80.14890000 65.73690000 52.50670000 64.82720000 396 57.06540000 42.30960000 47.42200000 20.90060000 18.37720000 20.78400000 397 62.55650000 48.61410000 48.63840000 25.71670000 23.69730000 22.60750000 398 22.94690000 22.94690000 22.94690000 3.732700000 3.927270000 4.277020000 399 25.02750000 20.22760000 23.59470000 3.777880000 3.440350000 4.415270000 400 25.09310000 20.96920000 34.81140000 4.895900000 4.029210000 9.811340000 401 100.0000000 37.77550000 37.72810000 47.55720000 30.51260000 14.47380000 402 100.0000000 39.36850000 47.13230000 49.29280000 31.84640000 21.64230000 403 100.0000000 46.32630000 60.42730000 53.78340000 36.81210000 35.52010000 404 100.0000000 60.04890000 63.27230000 59.48270000 47.19590000 40.55120000 405 58.97390000 17.19250000 0.000000000 13.65450000 8.144180000 0.852494000 406 82.86290000 20.24720000 0.000000000 28.34100000 16.19380000 1.632350000 407 100.0000000 56.66120000 18.74620000 51.94430000 41.94590000 7.741180000 408 100.0000000 77.13630000 20.41770000 61.99010000 61.88860000 11.55330000 409 100.0000000 100.0000000 21.17330000 77.58970000 93.01710000 16.97890000 410 10.24510000 0.000000000 17.23850000 0.652821000 0.292900000 2.002950000 411 0.000000000 12.12380000 19.33590000 0.831656000 0.885062000 2.676800000 412 0.000000000 0.000000000 61.88120000 6.281580000 2.512790000 33.08000000 413 42.03990000 0.000000000 85.33520000 18.86810000 8.256090000 67.35420000 414 57.02950000 0.000000000 100.0000000 30.04260000 13.40300000 95.61610000 415 78.47000000 0.000000000 100.0000000 42.24540000 19.69390000 96.18730000 416 100.0000000 0.000000000 100.0000000 59.28850000 28.48010000 96.98520000 417 100.0000000 24.20990000 100.0000000 60.86840000 31.64020000 97.51190000 418 37.22360000 0.000000000 35.69940000 6.566480000 3.168800000 10.08650000 419 46.36570000 0.000000000 50.64270000 11.64910000 5.538560000 21.64440000 420 57.03430000 0.000000000 64.07960000 18.77760000 8.896980000 36.28130000 421 100.0000000 0.000000000 74.74930000 50.75570000 25.06680000 52.05020000 422 100.0000000 36.75840000 74.33500000 54.59820000 32.93740000 52.76080000 423 100.0000000 41.64100000 86.47080000 59.55680000 36.91970000 72.71190000 424 100.0000000 42.18430000 100.0000000 64.64630000 39.19660000 98.77130000 425 63.15820000 0.000000000 28.23930000 16.12970000 8.186080000 6.594990000 426 74.75620000 0.000000000 36.88390000 23.76130000 12.01720000 11.61930000 427 85.46240000 0.000000000 35.39810000 31.03080000 15.78490000 11.05120000 428 0.000000000 17.76410000 50.28520000 4.779700000 3.191680000 21.22580000 429 0.000000000 17.81970000 86.07750000 13.78560000 6.803070000 68.62520000 430 0.000000000 16.51100000 100.0000000 18.73090000 8.582350000 95.28160000 431 0.000000000 35.62870000 100.0000000 21.74550000 14.61200000 96.28660000 432 41.47440000 38.77230000 100.0000000 28.45350000 19.19150000 96.81710000 433 47.94840000 48.96450000 100.0000000 33.67560000 26.31570000 97.91700000 434 62.63830000 53.19290000 100.0000000 41.71230000 32.66470000 98.71900000 435 19.99000000 35.89980000 32.71870000 6.500080000 8.750990000 9.453920000 436 25.64450000 100.0000000 45.32760000 40.99300000 73.85320000 28.69900000 437 66.12700000 100.0000000 50.96560000 56.46310000 81.72080000 34.28600000 438 44.36640000 53.42320000 28.54190000 17.05640000 22.03280000 9.357920000 439 48.49150000 65.47570000 33.87810000 24.15380000 33.17620000 13.88350000 440 59.17360000 73.79380000 78.23160000 41.85410000 47.57180000 62.11740000 441 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 442 2.941180000 0.000000000 0.000000000 0.017670400 0.009109590 0.000827230 443 8.909850000 8.909850000 8.909850000 0.466089000 0.490383000 0.534056000 444 44.40240000 84.74530000 0.000000000 31.76340000 53.26340000 8.607160000 445 44.03720000 100.0000000 0.000000000 42.54910000 75.02130000 12.23850000 446 73.93760000 100.0000000 0.000000000 56.98530000 82.46350000 12.91430000 447 86.67970000 100.0000000 0.000000000 65.87140000 87.04460000 13.33030000 448 100.0000000 100.0000000 0.000000000 76.99580000 92.77950000 13.85110000 449 100.0000000 100.0000000 66.02370000 84.23940000 95.67720000 51.99760000 450 35.78880000 15.73370000 0.000000000 4.916600000 3.443800000 0.405651000 451 41.69810000 25.61310000 0.000000000 7.811900000 6.682220000 0.878167000 452 55.59570000 34.65640000 0.000000000 14.81680000 12.80100000 1.690110000 453 84.58290000 47.60900000 0.000000000 35.52610000 28.69350000 3.666440000 454 100.0000000 50.03240000 0.000000000 49.03590000 36.85570000 4.530040000 455 100.0000000 62.38890000 0.000000000 53.90800000 46.60060000 6.154260000 456 19.76820000 43.91870000 0.000000000 7.021040000 12.31090000 2.006290000 457 26.64670000 64.35390000 39.42340000 18.14420000 29.22160000 16.90000000 458 24.80520000 66.87960000 100.0000000 34.73410000 37.73770000 100.0660000 459 44.74760000 92.09100000 100.0000000 54.91630000 70.51410000 105.3290000 460 78.54690000 92.35400000 100.0000000 72.31640000 79.76290000 106.1970000 461 89.83530000 91.55390000 100.0000000 80.07780000 82.91950000 106.3980000 462 89.83820000 100.0000000 100.0000000 86.38750000 95.53640000 108.5000000 463 100.0000000 100.0000000 100.0000000 95.04580000 100.0000000 108.9060000 464 30.61980000 36.57930000 0.000000000 6.970120000 9.406820000 1.448420000 465 32.22310000 46.29290000 0.000000000 9.989990000 14.90840000 2.351210000 466 48.54030000 50.96630000 11.69310000 16.69550000 20.64520000 3.948760000 467 48.08970000 56.97300000 0.000000000 18.61860000 25.00270000 3.844950000 468 57.42180000 57.83970000 11.96540000 23.07030000 27.79820000 5.037330000 469 83.20730000 73.44680000 0.000000000 45.66340000 50.47010000 7.335580000 470 52.45290000 47.03090000 18.35860000 17.21690000 18.92930000 5.021450000 471 55.73800000 49.73010000 38.12780000 21.26300000 22.13460000 14.50220000 472 60.26610000 53.12200000 54.81130000 27.24680000 26.69770000 28.93280000 473 11.27770000 6.767730000 15.84690000 0.749378000 0.492244000 1.701600000 474 0.000000000 8.603320000 12.70520000 0.355521000 0.402004000 1.071380000 475 0.000000000 10.11480000 40.20410000 2.664990000 1.436910000 12.89110000 476 0.000000000 12.55950000 55.24120000 5.267010000 2.703920000 25.89670000 477 21.39250000 33.55170000 87.90110000 18.21900000 12.63000000 72.72660000 478 26.32970000 47.19720000 100.0000000 27.10010000 22.06840000 97.44370000 479 50.08370000 55.35810000 68.38280000 26.57820000 27.25830000 44.87740000 480 85.07940000 54.25090000 68.95970000 46.19270000 36.72490000 46.43600000 481 100.0000000 92.72810000 91.14350000 86.24540000 87.72640000 89.54530000 482 100.0000000 100.0000000 100.0000000 95.04580000 100.0000000 108.9060000 483 11.28200000 27.83220000 24.77960000 3.326090000 4.805010000 5.151920000 484 0.000000000 26.38200000 38.65840000 4.140730000 4.710250000 12.39150000 485 0.000000000 24.79990000 51.26250000 5.817880000 4.992810000 22.42090000 486 13.04630000 27.16830000 63.48920000 9.149820000 6.971790000 35.70050000 487 0.000000000 44.00680000 41.68240000 8.514450000 12.81490000 15.83310000 488 29.05200000 83.18820000 46.05850000 29.85610000 50.42700000 25.35870000 489 46.75420000 87.43330000 52.95160000 38.81980000 59.00840000 32.71630000 490 47.64710000 87.38550000 82.90270000 46.60870000 62.11100000 72.17410000 491 0.000000000 31.64850000 21.24880000 3.446540000 5.935760000 4.101780000 492 0.000000000 58.77640000 18.51730000 11.55430000 22.40260000 6.033710000 493 45.54840000 71.56150000 15.20880000 24.73240000 38.14960000 7.564200000 494 49.77640000 91.76190000 17.57810000 38.88360000 63.94070000 12.36050000 495 23.13920000 56.89240000 0.000000000 11.99320000 21.53930000 3.525550000 496 24.88550000 100.0000000 0.000000000 37.69310000 72.51780000 12.01120000 497 74.45340000 100.0000000 22.42230000 57.98600000 82.90160000 16.47760000 498 87.13760000 100.0000000 24.13940000 67.01480000 87.54250000 17.51980000 499 28.24970000 33.96910000 28.37460000 7.016560000 8.426690000 7.183570000 500 40.83400000 32.94620000 31.87820000 10.32420000 9.772500000 8.998580000 501 100.0000000 32.93960000 52.07860000 48.64700000 29.19920000 25.60570000 502 100.0000000 37.20870000 63.52700000 51.95890000 32.05350000 38.33160000 503 100.0000000 57.13860000 69.88230000 59.88830000 45.42910000 48.63360000 504 38.55020000 21.43610000 36.89510000 8.291930000 5.836890000 11.24850000 505 59.73370000 26.33850000 35.94760000 17.08280000 11.41010000 11.27390000 506 64.42260000 24.89420000 42.18150000 20.06360000 12.52490000 15.53480000 507 20.40940000 12.95690000 10.43770000 1.776510000 1.494530000 0.851985000 508 18.15310000 19.76930000 4.327400000 1.997210000 2.529660000 0.477815000 509 15.82200000 24.03100000 26.11490000 3.211410000 3.854370000 5.512790000 510 16.84860000 68.86050000 37.15060000 18.60700000 32.72530000 16.05640000 511 36.11830000 69.92240000 52.33110000 25.01620000 36.56360000 28.51330000 512 84.02830000 79.77710000 57.78090000 55.28350000 60.17520000 37.01970000 513 100.0000000 82.61000000 67.17900000 72.25480000 71.25550000 49.39170000 514 61.04100000 71.12810000 25.12030000 31.69460000 41.33450000 10.84220000 515 68.58690000 87.43940000 23.39920000 45.35280000 62.81200000 13.61280000 516 88.46170000 89.84230000 41.40930000 62.34150000 73.78330000 24.56680000 517 87.92100000 100.0000000 42.21950000 69.53750000 88.62160000 27.64420000 518 62.40780000 74.11230000 38.27490000 35.30750000 45.41860000 18.35300000 519 64.63950000 92.82480000 40.04880000 48.56500000 69.82570000 23.56470000 520 72.65580000 94.01150000 54.77130000 56.44640000 74.88960000 36.65570000 521 19.65700000 30.38680000 9.637400000 3.861770000 5.844960000 1.476080000 522 18.01450000 32.87220000 0.000000000 4.046900000 6.682290000 1.076570000 523 81.31420000 41.81490000 18.22190000 31.84820000 24.17140000 5.225230000 524 86.69920000 59.27730000 20.18930000 41.98520000 38.39070000 8.001700000 525 100.0000000 67.48680000 21.58350000 56.91640000 51.62650000 10.21320000 526 20.86420000 17.95120000 9.943050000 2.244810000 2.359220000 0.927664000 527 22.75300000 20.64220000 0.000000000 2.702270000 3.044970000 0.445348000 528 32.28610000 31.02060000 9.641560000 6.262250000 7.262050000 1.623650000 529 33.81240000 45.31770000 13.41980000 10.28880000 14.59090000 3.416180000 530 32.64550000 53.64630000 9.055120000 12.69810000 20.03080000 3.678000000 531 16.38040000 5.029340000 10.35840000 0.944802000 0.546849000 0.701951000 532 17.12060000 0.000000000 13.06010000 1.055670000 0.520523000 1.120610000 533 16.12000000 7.635410000 15.99720000 1.190450000 0.762066000 1.764980000 534 14.83030000 12.22600000 17.37040000 1.356050000 1.176750000 2.169970000 535 20.51510000 0.000000000 55.24110000 6.159820000 2.610300000 25.83150000 536 74.18930000 22.33360000 77.55190000 33.03000000 17.80030000 55.78780000 537 85.03970000 22.49630000 90.64660000 44.76360000 23.39290000 78.39140000 538 36.66110000 0.000000000 25.40800000 5.425220000 2.694420000 4.883080000 539 83.11890000 0.000000000 23.41580000 28.20140000 14.45310000 5.188420000 540 91.53260000 45.31090000 27.02380000 41.23270000 30.44820000 9.028370000 541 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 542 0.000000000 53.78440000 36.34230000 11.09020000 19.06390000 13.30940000 543 38.99700000 65.36770000 40.87710000 21.76040000 31.76790000 18.21350000 544 52.79210000 66.72470000 56.35360000 29.92000000 36.63860000 32.29750000 545 52.71670000 57.01310000 51.25340000 24.63050000 27.64650000 25.79370000 546 60.92910000 59.45420000 51.23240000 29.41270000 31.60250000 26.28570000 547 67.88940000 63.26750000 59.15770000 36.35020000 37.47930000 35.14170000 548 76.06570000 70.33510000 61.42700000 45.26720000 47.10640000 39.10400000 549 36.00080000 22.01870000 17.04370000 6.011450000 4.960370000 2.572590000 550 43.59980000 36.13760000 17.68790000 10.85680000 11.21110000 3.688030000 551 45.43090000 43.84860000 33.04630000 14.68820000 16.05050000 10.61100000 552 46.88420000 78.69230000 33.58550000 30.54370000 46.89790000 16.02990000 553 17.18100000 93.68350000 15.55630000 32.13600000 62.52190000 11.95500000 554 17.97250000 92.65330000 55.58420000 36.14050000 62.94330000 36.24890000 555 21.30290000 92.87220000 100.0000000 49.81580000 68.71500000 105.2500000 556 24.17560000 49.33120000 53.00780000 13.84480000 17.84360000 26.14120000 557 69.11040000 57.15880000 54.24930000 33.45210000 32.21730000 29.10610000 558 72.34530000 56.41780000 59.02930000 36.05290000 33.00840000 34.15220000 559 35.10160000 49.96010000 34.99290000 13.69030000 18.39010000 12.22680000 560 42.17870000 49.53100000 33.34740000 15.41680000 19.08410000 11.32510000 561 53.43340000 59.86010000 42.54300000 24.71510000 29.59650000 18.85340000 562 74.57350000 63.26860000 55.49540000 39.64090000 39.26270000 31.40230000 563 86.98430000 70.00270000 56.86280000 51.88340000 50.37500000 34.32700000 564 94.08190000 73.57610000 72.48340000 63.16430000 58.56940000 54.59760000 565 21.01220000 12.04690000 17.42020000 2.061480000 1.523470000 2.212440000 566 67.23400000 0.000000000 13.82860000 17.45670000 8.972560000 2.031960000 567 100.0000000 0.000000000 14.56500000 41.49930000 21.36400000 3.304320000 568 100.0000000 45.15130000 18.09440000 47.88060000 33.87210000 6.218590000 569 100.0000000 89.28010000 19.59460000 69.60460000 77.19470000 13.85780000 570 100.0000000 100.0000000 38.09140000 79.15660000 93.64390000 25.23050000 571 16.27190000 17.98520000 22.17040000 2.239440000 2.298630000 3.770440000 572 14.01670000 45.18920000 62.41860000 13.18320000 15.31070000 35.81880000 573 18.99200000 51.11520000 73.09580000 18.30220000 20.52320000 50.48850000 574 19.29350000 57.83830000 92.59640000 27.07260000 28.11990000 83.88880000 575 47.13690000 59.24230000 91.46800000 34.02980000 32.61580000 82.26460000 576 46.88860000 75.85580000 100.0000000 45.31970000 50.18880000 101.9110000 577 13.27060000 40.50610000 24.58790000 6.211070000 10.38160000 6.001820000 578 11.90310000 47.30160000 23.21880000 8.001850000 14.27320000 6.146540000 579 0.000000000 71.81600000 21.39940000 17.87280000 34.77550000 8.957360000 580 9.889460000 25.83390000 9.706380000 2.183620000 3.818930000 1.182160000 581 66.03030000 25.08600000 9.544040000 18.36440000 11.99180000 1.886680000 582 68.38000000 33.12260000 0.000000000 21.02410000 15.51190000 1.886280000 583 81.43930000 38.47530000 43.58590000 33.53690000 23.45050000 17.99240000 584 91.13970000 43.87750000 61.26930000 45.61520000 31.47960000 35.88670000 585 33.51640000 46.49130000 23.12900000 11.08230000 15.48040000 6.184890000 586 41.62470000 65.55930000 22.50950000 20.80860000 31.62480000 8.569430000 587 39.09880000 29.02660000 9.436070000 7.683660000 7.445380000 1.558600000 588 47.65710000 35.45630000 10.02090000 11.85140000 11.52470000 2.200800000 589 72.18710000 56.16390000 12.81340000 30.38980000 30.57140000 5.331130000 590 80.37700000 58.44370000 65.95180000 43.70790000 37.99040000 42.90780000 591 88.99580000 66.08200000 77.95220000 56.72700000 49.38430000 61.25130000 592 91.78460000 73.08740000 89.61560000 66.27960000 59.17130000 82.26950000 593 24.47440000 46.03020000 28.64020000 9.511440000 14.40700000 8.329140000 594 22.24320000 69.76370000 29.14370000 18.90990000 33.65850000 11.78620000 595 74.92220000 89.93040000 46.43160000 53.50810000 69.23410000 28.05050000 596 82.95900000 88.94490000 59.03810000 60.64430000 71.63820000 40.32250000 597 100.0000000 91.52230000 81.48580000 82.17210000 84.72180000 72.33400000 598 45.03450000 20.66470000 52.65840000 12.65480000 7.670970000 23.90220000 599 53.72920000 24.35500000 81.69030000 23.68950000 13.25290000 61.95400000 600 27.83380000 8.828420000 31.77830000 4.098730000 2.200590000 7.812470000 601 40.60120000 8.930590000 44.13610000 8.844300000 4.476090000 16.05720000 602 57.20970000 7.029410000 56.08440000 17.23990000 8.457820000 27.24550000 603 67.41690000 10.07980000 66.29390000 24.86620000 12.31650000 39.37840000 604 83.71920000 0.000000000 70.83600000 36.35410000 17.76490000 45.83560000 605 78.52330000 20.52290000 61.06100000 31.43010000 17.12950000 33.62400000 606 100.0000000 21.23380000 62.69100000 48.88630000 26.21350000 36.36480000 607 85.00120000 20.52480000 42.07850000 32.63490000 18.14490000 15.88120000 608 91.13290000 64.17060000 53.73370000 51.70560000 46.13490000 30.31840000 609 100.0000000 73.08180000 61.08780000 65.28550000 59.58720000 40.06610000 610 26.15040000 14.93200000 9.012800000 2.795420000 2.241010000 0.761094000 611 28.26600000 12.03120000 0.000000000 2.901060000 1.999520000 0.233081000 612 43.58280000 13.49900000 0.000000000 7.075830000 4.296910000 0.456543000 613 43.09630000 43.43380000 81.19570000 23.60600000 19.33270000 62.32750000 614 60.56650000 83.41310000 83.83020000 49.93220000 59.95210000 73.13390000 615 60.93400000 83.22900000 90.50130000 52.24530000 60.71250000 84.93190000 616 73.41490000 90.51630000 92.78380000 64.92900000 74.34410000 91.17210000 617 72.72810000 100.0000000 92.15440000 71.31040000 88.10660000 92.30020000 618 24.05490000 40.86220000 44.31740000 9.806520000 12.12370000 17.62450000 619 34.20180000 39.96800000 61.33950000 14.81510000 13.99010000 34.21510000 620 50.52100000 45.41190000 60.22910000 21.40660000 19.70660000 33.69940000 621 54.01600000 47.19750000 77.55110000 27.82110000 23.33320000 57.12900000 622 20.08960000 19.16670000 27.73920000 3.229870000 2.944120000 6.036910000 623 17.10040000 79.29850000 27.88650000 23.40630000 43.81530000 12.92870000 624 47.49680000 79.54390000 56.12300000 34.70430000 49.39740000 34.26750000 625 49.89310000 81.19930000 65.98360000 38.78950000 52.74040000 46.05410000 626 72.75430000 42.32810000 32.11090000 27.37040000 21.95290000 10.57490000 627 82.87780000 46.15940000 30.98950000 35.18930000 27.67900000 10.68310000 628 65.25250000 35.72640000 21.69030000 20.47140000 16.00090000 5.292600000 629 72.08460000 41.91780000 20.33430000 25.90260000 21.13510000 5.562930000 630 82.65980000 65.20770000 30.75010000 42.43990000 42.45230000 13.03090000 631 85.57390000 80.61410000 49.40870000 55.36550000 61.14920000 28.95590000 632 9.743040000 18.03620000 16.55700000 1.418900000 1.919200000 2.108330000 633 0.000000000 23.28540000 20.45090000 2.000530000 3.120840000 3.381330000 634 0.000000000 57.74660000 55.13530000 15.56170000 23.32770000 29.22700000 635 0.000000000 57.39860000 71.30380000 19.12620000 24.52770000 48.69510000 636 0.000000000 72.90340000 85.56570000 30.65620000 40.81750000 73.41520000 637 0.000000000 82.17610000 86.25440000 36.25960000 51.66040000 76.40720000 638 43.25030000 90.55320000 92.11920000 50.34300000 66.89050000 89.24350000 639 64.01310000 92.11460000 100.0000000 63.35930000 74.89160000 105.7290000 640 37.18560000 29.46270000 52.97830000 11.57940000 9.066310000 24.53770000 641 53.80240000 31.14780000 77.38360000 23.57090000 15.04760000 55.49690000 642 57.91760000 38.96520000 100.0000000 34.95670000 22.61660000 97.13550000 643 17.27420000 0.000000000 39.70910000 3.235130000 1.394310000 12.51000000 644 22.49960000 9.290780000 40.04310000 4.155040000 2.148900000 12.83790000 645 26.37300000 50.72010000 39.38780000 12.56040000 18.13560000 15.03020000 646 28.82490000 54.96190000 52.78630000 16.69010000 22.32640000 26.64180000 647 39.54670000 56.26410000 55.18790000 20.33880000 24.90710000 29.33380000 648 43.21670000 57.96170000 73.49440000 26.46210000 28.58120000 52.18530000 649 0.000000000 12.92710000 12.89570000 0.597116000 0.874942000 1.183630000 650 56.85900000 33.03400000 9.660840000 15.14900000 12.44340000 2.157920000 651 69.44780000 42.66730000 0.000000000 23.98960000 20.52330000 2.697330000 652 79.21360000 54.23070000 0.000000000 34.01170000 31.35460000 4.259880000 653 86.49030000 64.75280000 0.000000000 43.71890000 42.95090000 5.986690000 654 92.79830000 65.60920000 11.23070000 49.28740000 46.40300000 7.131530000 655 29.17280000 18.80550000 0.000000000 3.652300000 3.228650000 0.430743000 656 28.51560000 37.41760000 51.03910000 10.83990000 11.22380000 23.15090000 657 36.41860000 49.54730000 58.91270000 17.74260000 19.82650000 32.44390000 658 65.21250000 52.54370000 65.49630000 31.90670000 28.51950000 41.12850000 659 73.16400000 64.87650000 65.76840000 41.73200000 41.18280000 43.39670000 660 59.45370000 27.83610000 22.47730000 15.96720000 11.34160000 4.898290000 661 75.84910000 71.31640000 19.93170000 39.97560000 45.78980000 9.457690000 662 83.17420000 71.03910000 26.41190000 45.32310000 48.27970000 11.99310000 663 34.87770000 0.000000000 55.46690000 9.004920000 4.071940000 26.19480000 664 34.53240000 9.466650000 64.63450000 11.09190000 5.217230000 36.65660000 665 50.89930000 12.50310000 82.43510000 21.51130000 10.27490000 62.71680000 666 69.01010000 16.04420000 100.0000000 36.92980000 17.90260000 96.12170000 667 0.000000000 9.480420000 28.66380000 1.357200000 0.864532000 6.155810000 668 9.978890000 18.24330000 31.29340000 2.509790000 2.390770000 7.680040000 669 10.13370000 18.70570000 45.06590000 4.291940000 3.181490000 16.78180000 670 27.04720000 16.36700000 65.57660000 10.12910000 5.389160000 37.91210000 671 45.82180000 36.82510000 79.19860000 22.19350000 16.09280000 58.58740000 672 58.23390000 50.20080000 90.00280000 34.72970000 27.91250000 78.60670000 673 0.000000000 84.93780000 21.55530000 25.58920000 50.19360000 11.57800000 674 0.000000000 100.0000000 21.82760000 36.39240000 71.77390000 15.26480000 675 25.66410000 100.0000000 27.61850000 38.89430000 73.01400000 17.62870000 676 80.52120000 31.17720000 31.83290000 29.81980000 19.29570000 9.785600000 677 91.70420000 31.54770000 37.10210000 38.95430000 24.04510000 13.27810000 678 90.23710000 34.52550000 63.04480000 42.89190000 26.47590000 37.15320000 679 91.56160000 46.34520000 78.42920000 51.13790000 34.92380000 59.49360000 680 91.24330000 100.0000000 82.22860000 81.20660000 93.59460000 75.31320000 681 31.82140000 38.19640000 36.47830000 9.595450000 11.11360000 11.93780000 682 30.55530000 38.20240000 41.25570000 9.923680000 11.21440000 15.14100000 683 30.25970000 89.50930000 67.57440000 38.62180000 60.63340000 49.62600000 684 48.70020000 89.08840000 75.88430000 46.04630000 63.77610000 61.45090000 685 67.93730000 92.74280000 78.81670000 58.61360000 73.96210000 67.23910000 686 25.48940000 42.06780000 32.45230000 8.885100000 12.31120000 9.870990000 687 37.70120000 57.75460000 32.00750000 16.99160000 24.46230000 11.55120000 688 54.84670000 60.02530000 34.01680000 24.32900000 29.62550000 13.26790000 689 58.19120000 82.06230000 42.48220000 38.43300000 53.86470000 22.76950000 690 23.85990000 31.32110000 19.31260000 5.033360000 6.671320000 3.565510000 691 28.86210000 37.43070000 19.10200000 7.274590000 9.810820000 3.992810000 692 27.75920000 53.29410000 17.48600000 11.81090000 19.34490000 5.155470000 693 25.62090000 58.69930000 26.11720000 14.08600000 23.60240000 8.752490000 694 83.31550000 70.96980000 65.40290000 51.51870000 50.71220000 44.26190000 695 84.98240000 81.82770000 75.02310000 61.43110000 64.71440000 59.54310000 696 21.85560000 19.64770000 16.07330000 2.777130000 2.876160000 2.107040000 697 19.78060000 23.52310000 36.12960000 4.575010000 4.338060000 10.67930000 698 19.55040000 28.37630000 46.99610000 6.808710000 6.439830000 18.86210000 699 21.27100000 53.84450000 46.30250000 13.85420000 20.36390000 20.60010000 700 32.63660000 75.84370000 49.32390000 26.79500000 42.27290000 26.74210000 701 9.296120000 17.96540000 10.41760000 1.166640000 1.804110000 0.941093000 702 11.62640000 19.93890000 6.612350000 1.440020000 2.267690000 0.602626000 703 36.32110000 81.79470000 15.14410000 27.71460000 48.37750000 9.367210000 704 43.83890000 100.0000000 24.00490000 43.26480000 75.29980000 16.35750000 705 20.14560000 42.31670000 10.09510000 6.727700000 11.46420000 2.468930000 706 27.20660000 84.78290000 0.000000000 27.22650000 50.96050000 8.401720000 707 58.23280000 84.99840000 53.24140000 42.07940000 58.30310000 32.69060000 708 79.22280000 85.91870000 72.24270000 59.14830000 67.49390000 56.19210000 709 43.77480000 27.74120000 35.68380000 10.70640000 8.467620000 10.88170000 710 69.12360000 39.13290000 39.93590000 25.24650000 19.48200000 14.99780000 711 78.84320000 48.09370000 45.08620000 34.72830000 28.15450000 20.01460000 712 41.04650000 25.09110000 26.08910000 8.467680000 6.794180000 5.792550000 713 43.67160000 29.00900000 24.65860000 9.850370000 8.473420000 5.469120000 714 57.24700000 38.03990000 50.98100000 20.46340000 16.41200000 23.59130000 715 63.21830000 37.94490000 60.00190000 25.15640000 18.59240000 33.02990000 716 25.02050000 9.456150000 51.08270000 6.278920000 3.057800000 21.85560000 717 71.57470000 0.000000000 73.98450000 29.06900000 13.91120000 49.92410000 718 74.65340000 11.40000000 81.66340000 33.54540000 16.40590000 61.99940000 719 86.75910000 15.62960000 100.0000000 48.82830000 23.98360000 96.66840000 720 54.72160000 14.51550000 68.32050000 19.27340000 9.795480000 41.80950000 721 100.0000000 21.96480000 74.55020000 51.97560000 27.59570000 52.18220000 722 100.0000000 23.25010000 86.64850000 55.85430000 29.41920000 71.77040000 723 100.0000000 54.99710000 87.10590000 64.16330000 45.79290000 75.29700000 724 13.66940000 22.76260000 0.000000000 1.897950000 3.026630000 0.484189000 725 19.02520000 24.63370000 10.20580000 2.833170000 3.883610000 1.225760000 726 15.39720000 24.68270000 14.63440000 2.585610000 3.749990000 1.969310000 727 56.87270000 24.90190000 10.58300000 13.73030000 9.558990000 1.798990000 728 76.07810000 35.66230000 91.63420000 41.20100000 25.01770000 80.73120000 729 22.20000000 13.94390000 100.0000000 20.02540000 8.935940000 95.28170000 730 84.66790000 31.30690000 100.0000000 49.42910000 27.52570000 97.32050000 731 37.17870000 14.04210000 28.35970000 6.286690000 3.818470000 6.325710000 732 44.66840000 21.22830000 34.86670000 9.969910000 6.691110000 10.09030000 733 58.18100000 24.62320000 46.93670000 17.59160000 11.10850000 19.14520000 734 87.83390000 36.03170000 51.04250000 38.90400000 25.20500000 24.37390000 735 52.78360000 21.37710000 35.49880000 13.16840000 8.358920000 10.61950000 736 71.03220000 20.81890000 47.61840000 24.10080000 13.70000000 19.88000000 737 80.81230000 22.41070000 55.20620000 32.03250000 17.92840000 27.38920000 738 52.50290000 15.07810000 39.55670000 12.90380000 7.209020000 13.01830000 739 89.57760000 10.90290000 45.79520000 35.88600000 18.53190000 18.66910000 740 100.0000000 22.78460000 30.10810000 43.90920000 24.54030000 9.175450000 741 100.0000000 38.96610000 28.14980000 46.84940000 30.70440000 9.281960000 742 100.0000000 76.22370000 39.79890000 63.29940000 61.57720000 21.02330000 743 100.0000000 90.10400000 47.69480000 73.21540000 79.54900000 30.06750000 744 28.89730000 61.73290000 48.87420000 18.80600000 27.64050000 23.94010000 745 34.94950000 72.69240000 60.65610000 27.82840000 39.97680000 37.75940000 746 67.47540000 75.35750000 75.46870000 46.27290000 51.22640000 58.39760000 747 77.72330000 83.28260000 76.74160000 57.68970000 64.07870000 62.18570000 748 58.11440000 65.73460000 80.46930000 37.90470000 39.34750000 64.26630000 749 68.98370000 83.47910000 80.96760000 53.60880000 62.01360000 68.61580000 750 78.24500000 90.83850000 80.48270000 64.18610000 74.77060000 69.74020000 751 39.56340000 46.68410000 46.03820000 15.33980000 17.47000000 19.74560000 752 39.04990000 70.56480000 75.26030000 31.48540000 39.77570000 56.65770000 753 45.53060000 75.69990000 85.26470000 39.40610000 47.62620000 73.74990000 754 88.27200000 80.96840000 100.0000000 71.87070000 68.33580000 104.0150000 755 30.26620000 24.27010000 61.16330000 10.68820000 7.161330000 32.91080000 756 35.56730000 32.07120000 71.66490000 15.85300000 11.52400000 46.86000000 757 20.76450000 10.52910000 30.83470000 2.910730000 1.719600000 7.294480000 758 17.50940000 14.13270000 31.85210000 2.835180000 2.011240000 7.881380000 759 14.56360000 7.749620000 33.65860000 2.371000000 1.223730000 8.739630000 760 11.98030000 21.39490000 55.96370000 6.627490000 4.622250000 26.93900000 761 10.11670000 44.89670000 90.67240000 20.96530000 18.25000000 78.70040000 762 21.24040000 55.85960000 100.0000000 29.35160000 27.79680000 98.43070000 763 0.000000000 28.64560000 82.97680000 14.26140000 9.364850000 63.82070000 764 0.000000000 26.73490000 100.0000000 20.01510000 11.15100000 95.70970000 765 26.01060000 75.66050000 100.0000000 39.54640000 47.04910000 101.6100000 766 61.90840000 10.83850000 14.10080000 14.87800000 8.042550000 2.041760000 767 67.73010000 12.90590000 9.728820000 18.00820000 9.859400000 1.517110000 768 78.12990000 27.79300000 16.50770000 26.44910000 16.77300000 3.644650000 769 89.98800000 51.64230000 21.89920000 41.69930000 33.83460000 7.686240000 770 89.15680000 77.82800000 77.90800000 63.06720000 61.89790000 63.26450000 771 88.69880000 78.68160000 90.87150000 67.40600000 64.39230000 85.52860000 772 36.59070000 27.46250000 35.52590000 8.457470000 7.240860000 10.66820000 773 35.77920000 25.55150000 42.54340000 8.836040000 6.877900000 15.30530000 774 63.92000000 66.76370000 59.89700000 35.96490000 39.69820000 36.41610000 775 75.38760000 77.54730000 59.69330000 48.39860000 54.62740000 38.41380000 776 43.72380000 44.76850000 39.69050000 15.15760000 16.60650000 14.80520000 777 79.41020000 44.54380000 50.71490000 34.93180000 26.50570000 24.53110000 778 87.81460000 51.55460000 62.11090000 45.64970000 35.16720000 37.57790000 779 46.67210000 31.37420000 43.81030000 13.45080000 10.74280000 16.77100000 780 49.12410000 34.57860000 54.79480000 16.90510000 13.29690000 26.87440000 781 68.91670000 46.60100000 69.29490000 32.91220000 25.93830000 45.50160000 782 73.75250000 47.33510000 100.0000000 46.06400000 31.91050000 98.34410000 783 20.41850000 25.08640000 68.22640000 10.74700000 7.177500000 41.62950000 784 21.26710000 54.41540000 68.34850000 18.56580000 22.59270000 44.35390000 785 21.13110000 61.43960000 81.11670000 24.99220000 29.75420000 64.13800000 786 15.39690000 72.79180000 56.53490000 23.60800000 37.97980000 33.07890000 787 30.27220000 100.0000000 58.67940000 44.32470000 75.29110000 41.49220000 788 28.89860000 100.0000000 81.94840000 50.09690000 77.56670000 73.39860000 789 51.18170000 100.0000000 90.58800000 59.73390000 82.20300000 88.84570000 790 18.35740000 43.01520000 76.09580000 16.48250000 15.65690000 54.03750000 791 25.00140000 41.99780000 84.05210000 19.57960000 16.54830000 66.72960000 792 31.41090000 59.00470000 82.87530000 26.37970000 28.85850000 66.77610000 793 29.69900000 73.19840000 86.87520000 34.10650000 42.78230000 75.89360000 794 39.54270000 82.41800000 92.00410000 43.75840000 55.52020000 87.17880000 795 26.35040000 19.46190000 14.34850000 3.425200000 3.187890000 1.757890000 796 30.81660000 24.76470000 8.940710000 4.847440000 4.954090000 1.168310000 797 51.91350000 27.95140000 17.40620000 12.30620000 9.517000000 3.211950000 798 59.66690000 39.56370000 20.68790000 18.46360000 16.36120000 5.143540000 799 67.99170000 59.36080000 20.76020000 29.57890000 32.04300000 7.607500000 800 68.37510000 59.87240000 38.66270000 31.67890000 33.25460000 16.45290000 801 81.27620000 69.01730000 41.95030000 44.63060000 46.18600000 20.56730000 802 100.0000000 71.98380000 77.93080000 69.02310000 60.14230000 62.64690000 803 26.26190000 16.58880000 22.36370000 3.536910000 2.767380000 3.858950000 804 35.04700000 17.66140000 59.01810000 10.56020000 5.962560000 30.26280000 805 58.70750000 48.69180000 68.48470000 27.97840000 24.42190000 44.39070000 806 65.89950000 50.08080000 76.87950000 34.41900000 28.17560000 56.69110000 807 65.21410000 53.50210000 86.43140000 38.24070000 31.61690000 72.74280000 808 27.06650000 27.15410000 22.24110000 5.023910000 5.532500000 4.272110000 809 37.88950000 35.31200000 21.20110000 9.098800000 10.00160000 4.573290000 810 36.49980000 38.63670000 11.15750000 9.056290000 11.20900000 2.447270000 811 42.34130000 42.95490000 0.000000000 11.80530000 14.36340000 2.150350000 812 55.47560000 52.50190000 0.000000000 19.95460000 23.15740000 3.418350000 813 76.55450000 57.38450000 37.53620000 35.54910000 33.73500000 15.60490000 814 87.12530000 56.87610000 100.0000000 58.84270000 43.59710000 99.92650000 815 23.41250000 18.87030000 92.10730000 17.67050000 8.725660000 79.71570000 816 23.75670000 26.55110000 100.0000000 21.73340000 11.99290000 95.78170000 817 23.51790000 36.81240000 100.0000000 23.73040000 16.04420000 96.45850000 818 0.000000000 15.03870000 71.23710000 9.115890000 4.533800000 45.27090000 819 13.13390000 11.44050000 84.40330000 13.21020000 5.825460000 65.59030000 820 23.40030000 0.000000000 86.73630000 14.89060000 6.151900000 69.59180000 821 30.52560000 82.59170000 85.60940000 39.33880000 53.65700000 75.51140000 822 27.57600000 14.73950000 15.45400000 3.253740000 2.430650000 1.855350000 823 46.63490000 10.61360000 10.91830000 8.100220000 4.542420000 1.175460000 824 49.99330000 27.20380000 23.22510000 11.74690000 9.002930000 4.934250000 825 74.24540000 25.05120000 22.42600000 23.80000000 14.72030000 5.119910000 826 81.09320000 42.16010000 36.91330000 33.37760000 24.91850000 13.62130000 827 58.68070000 46.17380000 39.47560000 21.64250000 20.59050000 15.08540000 828 61.35030000 76.09540000 54.40210000 38.42250000 48.37260000 32.11550000 829 66.12540000 76.02670000 62.27190000 42.54430000 50.25070000 40.84250000 830 0.000000000 85.08570000 49.59580000 28.92800000 51.68230000 28.68910000 831 10.53400000 92.01340000 63.15140000 36.63690000 62.33460000 44.53190000 832 40.94710000 28.17990000 18.25800000 8.422650000 7.568070000 3.264580000 833 100.0000000 32.40630000 14.33690000 44.49050000 27.36100000 4.257590000 834 100.0000000 51.60970000 50.96990000 53.68690000 39.59770000 26.30560000 835 100.0000000 62.56750000 53.94140000 58.63220000 48.61830000 30.63830000 836 18.94880000 35.11170000 20.20700000 5.177600000 7.920170000 4.065200000 837 17.37540000 58.69230000 42.45010000 14.69780000 23.70560000 18.17490000 838 16.64260000 62.44560000 53.30420000 18.01840000 27.61340000 28.09620000 839 13.81360000 70.22980000 79.91810000 27.99270000 37.56080000 63.56350000 840 15.82700000 93.62380000 80.69380000 42.91110000 66.74640000 69.65150000 841 12.93780000 97.81400000 94.22920000 50.35820000 74.69900000 94.78330000 842 26.59190000 25.60550000 31.36630000 5.436470000 5.293070000 8.123740000 843 24.85190000 29.32420000 38.23370000 6.516790000 6.683090000 12.36630000 844 27.98710000 31.00830000 45.17150000 8.372880000 7.995640000 17.58060000 845 48.27530000 65.43690000 62.63120000 28.83380000 35.00940000 39.04820000 846 54.54980000 73.88490000 65.79580000 36.44200000 45.24040000 44.49320000 847 16.33650000 21.91510000 18.81660000 2.494450000 3.117250000 2.871850000 848 15.58310000 19.37090000 37.26160000 3.717650000 3.115150000 11.19630000 849 19.94810000 17.08950000 41.13640000 4.483740000 3.106310000 13.77690000 850 36.86440000 16.85320000 40.81180000 7.820990000 4.798990000 13.69610000 851 38.07260000 33.91280000 39.75760000 10.62100000 10.12330000 13.83900000 852 39.76770000 44.39690000 49.58560000 15.28180000 16.33330000 22.57610000 853 38.83820000 49.18550000 67.54300000 20.27760000 20.72380000 42.84850000 854 45.25340000 62.91740000 67.94430000 27.83310000 32.61930000 45.26980000 855 51.62810000 62.67820000 71.13850000 30.97000000 33.98190000 49.66690000 856 80.24220000 68.30650000 74.16220000 50.23060000 47.77250000 55.60280000 857 81.66510000 75.57260000 79.86050000 56.73590000 56.65080000 65.64220000 858 10.00700000 7.606290000 25.23400000 1.258500000 0.731725000 4.654040000 859 13.45270000 0.000000000 27.03560000 1.517120000 0.664693000 5.377400000 860 38.75420000 7.677200000 75.97110000 15.11680000 6.841610000 52.22110000 861 69.57370000 0.000000000 87.00920000 31.86100000 14.89010000 70.86370000 862 89.15070000 60.64520000 93.90100000 59.65530000 46.61130000 88.23750000 863 32.01160000 17.66440000 27.97890000 5.254160000 3.754740000 6.194410000 864 35.44040000 23.09410000 28.69610000 6.795860000 5.483940000 6.775880000 865 34.16380000 27.73180000 30.08020000 7.301540000 6.777710000 7.662140000 866 49.99820000 40.54560000 39.09890000 16.17850000 15.36670000 14.10930000 867 49.09800000 45.13000000 51.54460000 19.04520000 18.56020000 24.60690000 868 58.48090000 61.38060000 68.54810000 32.76440000 34.12970000 46.09620000 869 67.19920000 61.10670000 83.30390000 41.38650000 37.91070000 68.44670000 870 81.04840000 65.72380000 88.63440000 54.02860000 47.34610000 78.85430000 871 100.0000000 68.98770000 90.14730000 71.41160000 58.61930000 82.86600000 872 100.0000000 78.60200000 89.70540000 76.50960000 69.06300000 83.80370000 873 70.05840000 82.47060000 0.000000000 42.25930000 56.53180000 8.684970000 874 80.26920000 86.90470000 14.84610000 51.96510000 65.74540000 11.37800000 875 91.27030000 93.37560000 9.299470000 64.58450000 78.94190000 12.34390000 876 37.87690000 59.84480000 0.000000000 16.43690000 25.63750000 4.082420000 877 38.07400000 70.59150000 0.000000000 21.55600000 35.79320000 5.772930000 878 59.62050000 86.24950000 0.000000000 39.05090000 58.47560000 9.229210000 879 59.82670000 100.0000000 0.000000000 49.08170000 78.38900000 12.54430000 880 60.28770000 100.0000000 22.26230000 49.97170000 78.77120000 16.04750000 881 71.40600000 20.87850000 27.88440000 21.89130000 12.85370000 7.031440000 882 91.39610000 27.18320000 73.93690000 45.16520000 25.23690000 51.19300000 883 92.52880000 33.11210000 82.74820000 49.81210000 28.97500000 65.35290000 884 78.69870000 29.57060000 69.77860000 34.98420000 20.73210000 45.03850000 885 81.84240000 41.34510000 80.89320000 42.99040000 28.46550000 62.57960000 886 86.11180000 63.11320000 82.55100000 54.51660000 46.03040000 68.07050000 887 71.24740000 100.0000000 63.99440000 62.08660000 84.31230000 48.45190000 888 76.71650000 100.0000000 100.0000000 76.82960000 90.60900000 108.0530000 889 100.0000000 100.0000000 100.0000000 95.04580000 100.0000000 108.9060000 890 51.32810000 19.33590000 17.55760000 10.87000000 6.989010000 2.838600000 891 81.60820000 16.98080000 20.05280000 27.62580000 15.25630000 4.251420000 892 86.66620000 21.06800000 29.86020000 32.53250000 18.35310000 8.459000000 893 53.69280000 0.000000000 20.64050000 11.06490000 5.639430000 3.448980000 894 55.57810000 14.96940000 23.91940000 12.65710000 7.250220000 4.803310000 895 56.25500000 22.58510000 53.03060000 17.46690000 10.50120000 24.55530000 896 62.03470000 27.00290000 75.38200000 26.13390000 15.33510000 52.40250000 897 68.26460000 72.44200000 82.96980000 47.37950000 49.16840000 69.74690000 898 71.59770000 81.96390000 94.84990000 58.93590000 62.80530000 93.24300000 899 11.90110000 82.51170000 72.68880000 32.76160000 50.63980000 54.96010000 900 0.000000000 86.28700000 80.73100000 37.12500000 56.21740000 67.98400000 901 0.000000000 87.51640000 71.12470000 35.20080000 56.75490000 53.82050000 902 75.55560000 92.06090000 73.45120000 61.23030000 74.76440000 59.20530000 903 32.67890000 0.000000000 13.41390000 3.741930000 1.903940000 1.311230000 904 31.42690000 8.489940000 9.491790000 3.493550000 2.023380000 0.739693000 905 48.64320000 9.936640000 43.67820000 11.59530000 5.971370000 15.84580000 906 61.68080000 11.11170000 42.85250000 17.33410000 9.035960000 15.50590000 907 65.46480000 0.000000000 57.05460000 21.49710000 10.47550000 28.43000000 908 93.02220000 10.48130000 59.87840000 41.26740000 20.97180000 32.50120000 909 93.75350000 13.28680000 76.87590000 46.32990000 23.34210000 55.12510000 910 13.40800000 8.545560000 12.24210000 0.834796000 0.647289000 1.014090000 911 8.880180000 19.05410000 23.58510000 1.886750000 2.270920000 4.285680000 912 0.000000000 17.69510000 26.94970000 1.802500000 1.989820000 5.580970000 913 24.81140000 22.84260000 83.95160000 15.59910000 8.686830000 65.25230000 914 30.71680000 51.12150000 84.42010000 23.68820000 22.91310000 68.36510000 915 40.28500000 54.58560000 79.73410000 25.99660000 26.15530000 61.17500000 916 46.74080000 67.25990000 84.28570000 35.08350000 38.84610000 70.61190000 917 37.22150000 9.549400000 18.09400000 5.316890000 2.995660000 2.501500000 918 44.34980000 0.000000000 22.65540000 7.587470000 3.831960000 3.952500000 919 44.64790000 9.365870000 29.58430000 8.435780000 4.496260000 6.920110000 920 58.27010000 0.000000000 33.39280000 14.19150000 7.129270000 9.107490000 921 81.20510000 17.10800000 33.76850000 28.48310000 15.58540000 10.19780000 922 81.98150000 52.77930000 32.05990000 36.88970000 31.86710000 11.95980000 923 89.86630000 66.30120000 46.67430000 50.46370000 47.12660000 24.14560000 924 71.80480000 49.42420000 38.28340000 29.68000000 26.31760000 14.96830000 925 72.80000000 57.19000000 46.04260000 34.25800000 32.81600000 21.71450000 926 89.73020000 57.15720000 52.98120000 47.40830000 39.43880000 28.51510000 927 35.62410000 74.25880000 22.28930000 23.50850000 39.63090000 9.896320000 928 44.97320000 92.39710000 32.95750000 38.73460000 64.39960000 18.62740000 929 0.000000000 31.02000000 32.82600000 4.282930000 6.073690000 9.112540000 930 0.000000000 29.98560000 49.46620000 6.367980000 6.594360000 21.05890000 931 14.46500000 32.30160000 56.04380000 8.617480000 8.281460000 27.62350000 932 12.02760000 38.52470000 62.79710000 11.26760000 11.57460000 35.64770000 933 0.000000000 55.52880000 86.75520000 23.01240000 24.89690000 72.81510000 934 61.19670000 73.93140000 86.88590000 45.65760000 49.32900000 76.56730000 935 33.77550000 32.76560000 24.56810000 7.687030000 8.431040000 5.539860000 936 86.36770000 36.53450000 26.05850000 34.71910000 23.58830000 7.638200000 937 43.45890000 18.74320000 19.34640000 7.984100000 5.395780000 3.173640000 938 47.15980000 15.94380000 72.44980000 17.41190000 8.886120000 47.37110000 939 94.25500000 15.18750000 90.21090000 51.16430000 25.55570000 77.66810000 940 60.95530000 7.524820000 92.16520000 29.08950000 13.43360000 80.13180000 941 76.20180000 16.07210000 93.67510000 38.95980000 19.23180000 83.60790000 942 22.33490000 9.448260000 20.95910000 2.306380000 1.418100000 3.196570000 943 32.30040000 21.85040000 21.86000000 5.333180000 4.547830000 3.936380000 944 32.61760000 27.00830000 24.38010000 6.329230000 6.152810000 5.099350000 945 33.02240000 35.27250000 41.87220000 9.881800000 10.15360000 15.38600000 946 41.53290000 33.70110000 48.21500000 12.86970000 11.07030000 20.47800000 947 40.73540000 39.26520000 47.93210000 13.88000000 13.53560000 20.65600000 948 45.27520000 40.15510000 35.15190000 13.83710000 14.06130000 11.47760000 949 60.36090000 40.45710000 41.37790000 21.06680000 17.81680000 15.91630000 950 71.74630000 51.22430000 47.47210000 31.58740000 28.07060000 22.13450000 951 80.33760000 65.64880000 47.62780000 43.18320000 42.89310000 24.51740000 952 69.44660000 48.23470000 27.06170000 26.70850000 24.33250000 8.629660000 953 89.60630000 89.68040000 26.58190000 61.51580000 73.37840000 16.05640000 954 27.80370000 33.42660000 10.07600000 5.798110000 7.743900000 1.797280000 955 45.46640000 48.52940000 20.27950000 15.11780000 18.55650000 5.616640000 956 52.55640000 60.39410000 23.15260000 22.53930000 29.04830000 8.208560000 957 58.87030000 57.08370000 26.57330000 24.25960000 27.86370000 9.230630000 958 68.24330000 68.50640000 27.92560000 34.45280000 40.74090000 11.77090000 959 93.03510000 70.62730000 28.31390000 52.95240000 51.87650000 13.12190000 960 23.60300000 12.99950000 27.39670000 3.172340000 2.111990000 5.727330000 961 29.70780000 9.169240000 27.39500000 4.091180000 2.265520000 5.707790000 962 55.71130000 7.265520000 27.91930000 12.59450000 6.533020000 6.317030000 963 60.99610000 10.64610000 50.03890000 18.10050000 9.261640000 21.47150000 964 60.38670000 31.13590000 61.55480000 22.55660000 14.99040000 34.25010000 965 62.99510000 55.97900000 62.69500000 31.37240000 30.24610000 38.07070000 966 78.23760000 86.51820000 85.25420000 62.75150000 69.48930000 76.72170000 967 86.88270000 93.04920000 93.57230000 76.38380000 82.88440000 93.72430000 968 25.91930000 24.32220000 16.05210000 4.036180000 4.413010000 2.332430000 969 92.52810000 29.44310000 27.67260000 38.26380000 23.20960000 8.072790000 970 93.09680000 43.52290000 36.66390000 42.96140000 30.43840000 14.02530000 971 93.23620000 57.50150000 38.92800000 48.20730000 40.31080000 17.12130000 972 92.89330000 79.14710000 43.76380000 59.37850000 62.01330000 24.21110000 973 39.86480000 56.22260000 22.23530000 16.19570000 23.23460000 7.098300000 974 43.87840000 85.59220000 42.00200000 34.81340000 55.34190000 22.88990000 975 65.09800000 88.15050000 64.29700000 49.97280000 65.20010000 45.77090000 976 16.39050000 31.74530000 44.23610000 6.642200000 7.334070000 16.80300000 977 16.35290000 35.04550000 52.73490000 8.751470000 9.292110000 24.49460000 978 19.52160000 82.20810000 66.22480000 31.66770000 49.98650000 46.20330000 979 33.44030000 81.95220000 70.76190000 35.22530000 51.45260000 52.29560000 980 36.82270000 92.95540000 80.15040000 46.12830000 67.70620000 68.79660000 981 28.94450000 25.93420000 44.86170000 7.633310000 6.306250000 17.04600000 982 30.80460000 25.39280000 74.48080000 14.29190000 8.882270000 50.45440000 983 74.77430000 12.74300000 35.19970000 23.96150000 12.71490000 10.71270000 984 77.02670000 8.900220000 47.26850000 26.87610000 13.71390000 19.43870000 985 88.45840000 15.09600000 52.99420000 36.51570000 19.13910000 25.18350000 986 87.83730000 46.81370000 67.98330000 45.46720000 32.54870000 44.37810000 987 89.14820000 75.39260000 83.46730000 63.37520000 59.79390000 71.78530000 988 29.18910000 40.29660000 68.94290000 15.56060000 14.29420000 43.69810000 989 29.84900000 86.23980000 80.95900000 40.05180000 57.67200000 68.47820000 990 6.238760000 37.03560000 53.02900000 8.589660000 9.885750000 24.90270000 991 10.53270000 37.08830000 75.58680000 14.08220000 12.12610000 52.72230000 992 12.80030000 39.16630000 92.81950000 20.32120000 15.46270000 82.22540000 993 36.46140000 43.17030000 93.22220000 25.58960000 19.77450000 83.54830000 994 34.95320000 60.93350000 92.01980000 31.14790000 32.17920000 83.36760000 995 38.64640000 61.95710000 100.0000000 35.62390000 34.80470000 99.45290000 996 13.54190000 48.60270000 34.92100000 9.608530000 15.60850000 11.86250000 997 9.878450000 51.88920000 48.90410000 12.44530000 18.52570000 22.54220000 998 12.63890000 62.46190000 65.49880000 20.25610000 28.47840000 41.73770000 999 26.64480000 67.43530000 67.79910000 24.96170000 34.30000000 45.55570000 1000 40.60160000 68.59070000 66.61080000 28.67230000 37.09640000 44.36480000 1001 59.29950000 75.19960000 72.09200000 40.96100000 48.46430000 53.26530000 1002 59.92170000 94.23720000 86.50840000 57.87610000 74.91050000 80.19930000 1003 13.33200000 35.75840000 44.56980000 7.268210000 8.924870000 17.33940000 1004 10.54820000 42.87570000 51.78450000 10.09160000 12.95600000 24.22300000 1005 12.50540000 50.40910000 53.14330000 12.84780000 17.87310000 26.33130000 1006 8.450030000 52.51220000 62.34810000 15.23900000 19.99420000 36.53100000 1007 21.68840000 52.28740000 81.25070000 21.45510000 22.49490000 63.14040000 1008 49.88730000 52.09890000 91.87170000 32.43860000 27.64670000 82.14620000 1009 8.821240000 11.39540000 34.97880000 2.290520000 1.421130000 9.543800000 1010 14.59930000 14.98260000 61.72490000 7.395750000 3.907620000 33.10790000 1011 14.10740000 9.424530000 66.73070000 8.169320000 3.649570000 39.14260000 1012 23.90850000 29.84270000 93.30490000 19.77390000 12.11950000 82.53540000 1013 26.65150000 67.24050000 92.27610000 32.31380000 37.08870000 84.73730000 1014 17.89220000 22.98490000 29.23840000 3.554220000 3.785250000 6.874170000 1015 26.78680000 20.34020000 28.39470000 4.485660000 3.780880000 6.429460000 1016 30.12370000 18.37680000 33.22310000 5.407810000 3.882360000 8.849140000 1017 39.45870000 61.06610000 46.46550000 20.76650000 28.26280000 21.89560000 1018 44.97080000 69.61170000 58.38480000 28.76070000 38.12190000 34.81550000 1019 57.41040000 71.52190000 92.14250000 44.35620000 46.52700000 85.67240000 1020 76.11660000 55.58930000 70.16670000 40.73900000 34.63920000 47.94590000 1021 93.79200000 55.65580000 77.77690000 56.05830000 42.33200000 59.65510000 1022 93.54370000 62.35040000 88.69020000 62.12380000 49.20940000 78.88790000 1023 93.27060000 86.37000000 99.62020000 79.18690000 77.21740000 104.5550000 1024 50.82430000 52.68700000 57.71800000 23.43450000 24.42880000 31.73030000 1025 56.30380000 54.33480000 64.63740000 27.92140000 27.47480000 40.06950000 1026 63.38460000 57.47190000 72.36450000 34.56850000 32.50000000 50.90450000 1027 44.35940000 53.94440000 49.01870000 19.86580000 23.46750000 23.20640000 1028 45.06340000 92.48350000 68.64550000 45.14760000 67.06760000 51.93020000 1029 57.65870000 91.95190000 72.34080000 50.87350000 69.34480000 57.12360000 1030 30.71030000 56.12140000 37.03770000 15.14360000 22.47480000 14.18890000 1031 51.82790000 58.64280000 79.25340000 31.59850000 31.45440000 61.14310000 1032 75.95290000 61.71630000 91.81500000 49.85190000 42.33860000 83.95780000 1033 28.58140000 17.89510000 39.54690000 5.784250000 3.917550000 12.75150000 1034 30.53800000 14.37190000 45.23990000 6.692420000 3.830830000 16.92020000 1035 36.82620000 10.14340000 50.76480000 8.880520000 4.455000000 21.69370000 1036 84.72980000 78.93860000 66.61600000 57.28770000 60.23730000 47.33030000 1037 86.59390000 86.56590000 69.11000000 64.09390000 70.77100000 52.26470000 1038 11.68160000 42.48370000 14.08000000 6.050840000 11.17040000 3.106490000 1039 14.85290000 51.38550000 12.49370000 9.077130000 16.93400000 3.766120000 1040 51.33520000 51.82630000 34.47620000 19.67660000 22.45220000 12.39290000 1041 51.70760000 53.32240000 42.85720000 21.43830000 24.04520000 18.19020000 1042 79.76050000 79.24270000 91.25410000 61.27490000 61.70930000 86.04530000 1043 81.73540000 87.69640000 94.06730000 69.03330000 73.53880000 93.26200000 1044 9.637480000 16.56100000 24.79220000 1.766090000 1.831010000 4.665040000 1045 8.426810000 13.51910000 29.12300000 1.814890000 1.448580000 6.459980000 1046 29.53530000 40.93160000 48.68120000 11.54170000 12.96610000 21.32070000 1047 38.04610000 44.01390000 56.41150000 15.93100000 16.35380000 29.17990000 1048 46.55480000 47.72860000 57.25200000 19.99890000 20.13470000 30.58340000 1049 67.00280000 48.95870000 56.38940000 29.64860000 25.73020000 30.24370000 1050 18.13890000 12.95410000 14.93710000 1.640760000 1.406900000 1.630470000 1051 40.61070000 24.20300000 9.311020000 7.359960000 6.127100000 1.305980000 1052 47.37990000 22.08160000 8.279160000 9.343210000 6.723850000 1.200300000 1053 59.47990000 77.73100000 16.96070000 34.06710000 48.02560000 9.386050000 1054 61.64680000 91.38040000 18.90750000 44.02250000 66.18130000 12.88180000 1055 23.27830000 28.63140000 32.07190000 5.436460000 6.023690000 8.635230000 1056 32.20900000 28.59560000 39.40860000 8.020880000 7.248730000 13.18220000 1057 43.28980000 28.28540000 75.01950000 18.35840000 11.65880000 51.56670000 1058 51.45690000 30.18050000 91.93790000 27.13440000 16.06440000 80.31460000 1059 65.84450000 63.02620000 92.61690000 44.65510000 40.49430000 85.38980000 1060 71.43360000 73.38670000 93.26790000 53.27020000 52.55460000 88.50440000 1061 38.04620000 29.77510000 88.46990000 21.20120000 13.03460000 73.66540000 1062 37.36090000 48.47580000 87.41200000 25.43190000 22.35890000 73.35540000 1063 54.43930000 79.15380000 93.34380000 47.72370000 54.55780000 89.32870000 1064 63.50630000 93.57760000 93.23920000 61.56840000 75.82840000 92.50440000 1065 7.926100000 22.22180000 22.13220000 2.119590000 2.959780000 3.891350000 1066 20.51110000 27.32790000 20.88240000 3.903730000 5.007570000 3.780760000 1067 37.49590000 37.15300000 31.78370000 10.27200000 11.14380000 9.216210000 1068 74.66300000 72.09790000 46.93730000 42.52340000 47.38050000 24.83310000 1069 81.02140000 74.97800000 72.27170000 53.77750000 54.88250000 54.08170000 1070 93.26940000 83.10560000 77.29120000 69.42520000 69.94450000 63.53570000 1071 96.17430000 84.30100000 91.37660000 77.21260000 74.56000000 87.91450000 1072 62.02400000 20.07320000 22.91680000 16.17750000 9.811710000 4.746380000 1073 79.57570000 21.57180000 46.55990000 29.53750000 16.65930000 19.27210000 1074 79.02520000 34.05020000 61.16250000 34.04070000 21.80790000 34.50650000 1075 75.49590000 45.70120000 57.92530000 34.04610000 26.41040000 31.77740000 1076 92.74940000 90.56920000 63.87260000 70.43980000 78.23020000 46.68950000 1077 33.55570000 27.28480000 17.71980000 6.192170000 6.196900000 2.974320000 1078 32.86590000 41.70760000 35.46260000 10.64080000 13.03040000 11.63260000 1079 31.26790000 45.19930000 44.57690000 12.48800000 15.34370000 18.30890000 1080 35.22930000 63.20930000 79.35880000 28.05230000 32.56560000 61.71050000 1081 43.36800000 66.49810000 91.32720000 35.92960000 38.45700000 83.02890000 1082 30.92420000 51.28010000 68.64200000 19.24340000 21.22980000 44.44300000 1083 35.07750000 56.26140000 67.82570000 21.89700000 25.38520000 44.03120000 1084 64.49050000 70.17700000 75.58710000 41.87960000 44.82650000 57.56980000 1085 75.29530000 79.85080000 84.20070000 56.26070000 59.94030000 73.42360000 1086 89.18920000 93.83860000 86.60860000 76.31230000 83.97880000 81.15360000 1087 88.84590000 100.0000000 92.35600000 82.70530000 93.97260000 93.21270000 1088 9.169040000 15.34010000 17.51500000 1.185940000 1.426070000 2.264120000 1089 11.28350000 12.36420000 20.07640000 1.228760000 1.107560000 2.918540000 1090 7.758740000 8.455170000 19.87400000 0.822165000 0.596167000 2.780200000 1091 37.05060000 66.94820000 32.07420000 20.92090000 32.57990000 12.94640000 1092 73.04610000 79.71690000 48.48070000 46.06140000 55.56720000 27.54910000 1093 85.73830000 92.63570000 52.06020000 63.91560000 77.32030000 34.07180000 1094 42.95560000 20.41270000 13.78870000 7.747210000 5.578960000 1.880820000 1095 93.23600000 18.43900000 9.688770000 36.32620000 20.00370000 2.504840000 1096 53.58320000 0.000000000 12.81250000 10.65310000 5.469250000 1.525770000 1097 57.05280000 69.13620000 43.46470000 30.77150000 39.10520000 21.06680000 1098 56.63430000 91.68720000 48.33310000 45.00290000 66.64090000 29.61360000 1099 57.64850000 92.69780000 62.50090000 48.96660000 69.43430000 44.47750000 1100 19.66130000 58.77220000 58.02510000 17.71590000 24.99770000 32.47310000 1101 25.31460000 72.47990000 65.01490000 26.63030000 39.07570000 42.84380000 1102 11.02960000 36.82280000 36.45380000 6.258540000 8.898830000 11.67090000 1103 11.08770000 43.95170000 37.99980000 8.340490000 12.75720000 13.28950000 1104 65.58080000 67.43090000 37.18470000 33.38660000 39.29040000 16.56660000 1105 92.19480000 67.75010000 38.05720000 51.83380000 49.02100000 18.03480000 1106 66.72170000 47.29710000 10.64440000 23.95810000 22.56580000 3.779300000 1107 81.13310000 65.01260000 12.86390000 40.10750000 41.24670000 6.888590000 1108 92.60500000 86.12580000 8.715340000 60.65800000 69.48420000 10.65750000 1109 91.92170000 89.50420000 84.66040000 74.79940000 78.71380000 76.85130000 1110 68.42910000 64.66880000 71.64680000 40.28470000 40.12080000 51.06700000 1111 76.06900000 74.16780000 81.98420000 52.79120000 53.38250000 68.64730000 1112 89.64880000 73.63660000 96.86260000 67.49940000 59.93680000 96.21880000 1113 36.52590000 6.653190000 21.80120000 5.227210000 2.758580000 3.576900000 1114 45.40580000 9.620080000 18.95960000 7.938100000 4.346670000 2.862660000 1115 50.43670000 16.98590000 27.54760000 10.93750000 6.592140000 6.249590000 1116 62.85560000 28.05740000 31.33260000 18.44460000 12.59050000 8.829420000 1117 74.96280000 28.10250000 36.59350000 26.05200000 16.45780000 12.17380000 1118 89.32660000 30.69140000 43.10650000 37.67180000 23.04530000 17.33020000 1119 89.64230000 44.38940000 44.27510000 41.42550000 29.90610000 19.35750000 1120 64.91420000 31.97110000 9.849500000 18.96650000 14.08850000 2.298380000 1121 75.57230000 33.04720000 10.03440000 25.52090000 17.79350000 2.692290000 1122 85.30450000 79.87770000 19.61210000 51.39130000 58.82440000 11.27690000 1123 91.97640000 79.68920000 61.08980000 62.11910000 63.53970000 40.99810000 1124 18.44450000 13.68490000 22.03320000 2.100660000 1.677010000 3.611060000 1125 69.69420000 9.399170000 28.09330000 19.94390000 10.44670000 6.763860000 1126 79.69080000 9.507240000 27.21740000 26.26500000 13.72150000 6.672710000 1127 89.23370000 22.50290000 63.57020000 40.11000000 21.90520000 37.04940000 1128 88.40270000 36.11390000 70.74130000 43.68430000 27.19880000 47.14010000 1129 94.37940000 63.35040000 72.77930000 58.38940000 48.51770000 53.32860000 1130 77.39320000 52.24080000 54.37640000 36.77270000 31.14120000 28.85060000 1131 89.80560000 53.02650000 56.77220000 46.61200000 36.58420000 31.84730000 1132 89.38130000 64.63480000 61.41770000 52.08970000 46.47090000 38.61110000 1133 67.01150000 67.30320000 53.09530000 36.55290000 40.54850000 29.41230000 1134 66.27060000 82.77150000 71.18130000 48.82470000 59.20870000 53.65460000 1135 68.45550000 90.74980000 85.06040000 59.44910000 72.06890000 77.06110000 1136 10.56100000 29.55440000 16.94690000 3.107780000 5.197270000 2.747290000 1137 9.419710000 27.77370000 28.89620000 3.542420000 4.862820000 6.920990000 1138 47.57470000 39.55580000 26.80870000 13.69870000 13.85170000 7.183010000 1139 47.46410000 44.96910000 24.97900000 15.02960000 16.80460000 6.929630000 1140 58.34210000 65.54960000 52.19370000 31.05190000 36.47820000 28.04740000 1141 77.32340000 66.97260000 79.27410000 49.06240000 46.02530000 63.06800000 1142 28.64910000 12.54000000 19.04060000 3.480660000 2.292060000 2.723960000 1143 29.54650000 9.256680000 22.15070000 3.670380000 2.099560000 3.649900000 1144 50.48150000 14.17850000 51.93040000 13.93030000 7.411190000 23.08860000 1145 77.42820000 12.19430000 66.32560000 31.16090000 15.73830000 39.74750000 1146 77.62030000 43.55920000 72.91680000 38.38400000 27.28280000 50.47970000 1147 69.42030000 43.44190000 76.22470000 34.13050000 24.93290000 55.09150000 1148 69.38470000 46.96830000 90.08200000 39.59010000 28.82700000 78.67240000 1149 78.01820000 53.59180000 91.09420000 47.66220000 36.33810000 81.56770000 1150 40.79090000 47.71840000 39.45060000 15.09950000 17.94600000 14.90260000 1151 47.11630000 57.82050000 46.32210000 21.92110000 26.83000000 21.43930000 1152 9.684760000 14.42450000 6.067540000 0.786834000 1.152280000 0.380259000 1153 14.39040000 15.77450000 10.77410000 1.330690000 1.584830000 0.940377000 1154 9.530100000 23.48020000 17.24070000 2.089550000 3.226440000 2.494010000 1155 17.55600000 44.99320000 44.68800000 10.14280000 14.04020000 18.26860000 1156 47.28120000 55.38510000 55.70680000 22.67660000 25.59050000 29.87480000 1157 8.005570000 13.64210000 10.49610000 0.734212000 1.028190000 0.825008000 1158 11.34220000 6.732770000 5.279080000 0.466539000 0.377860000 0.195099000 1159 24.64160000 8.972740000 8.451470000 2.151190000 1.364280000 0.563062000 1160 28.54250000 8.715170000 13.62580000 3.009360000 1.773370000 1.364630000 1161 43.15720000 25.57530000 48.38680000 11.93640000 8.377500000 20.15670000 1162 46.67550000 48.20700000 67.32470000 22.46570000 21.37600000 42.57580000 1163 56.65420000 54.09060000 75.41710000 30.78130000 28.48980000 54.74870000 1164 77.76180000 55.02310000 81.42090000 44.81470000 36.04520000 64.80130000 1165 10.91450000 24.90070000 39.37790000 4.321330000 4.454530000 12.81690000 1166 8.910710000 23.56170000 44.53360000 4.737580000 4.300080000 16.55140000 1167 10.90510000 28.75220000 58.06560000 8.082570000 6.959600000 29.54290000 1168 12.08640000 32.00430000 78.12750000 13.80310000 10.23780000 56.22790000 1169 26.70110000 73.10540000 77.97320000 30.65730000 41.25320000 61.08790000 1170 24.41660000 82.41640000 91.71720000 40.15100000 53.67090000 86.47280000 1171 25.14990000 84.20730000 100.0000000 44.53280000 57.24850000 103.3160000 1172 15.82950000 93.94440000 72.45990000 40.77120000 66.26410000 57.22950000 1173 88.46500000 95.03620000 71.81970000 72.18080000 83.66730000 58.03320000 1174 29.62620000 31.23430000 16.76420000 5.962590000 7.140220000 2.926950000 1175 45.06340000 60.42080000 12.51640000 19.13880000 27.37420000 5.254990000 1176 51.48780000 81.02320000 11.46160000 32.24210000 50.02280000 8.763710000 1177 75.94400000 92.85820000 10.16440000 53.01420000 72.42010000 11.80490000 1178 76.26360000 93.50490000 63.61470000 60.24720000 76.08530000 46.50000000 1179 91.95130000 92.47350000 79.68370000 75.34750000 82.27220000 69.32640000 1180 66.68820000 75.49130000 68.92960000 44.14920000 50.44580000 49.15190000 1181 70.05020000 83.15650000 89.97000000 56.99100000 63.11260000 84.16800000 1182 79.31170000 94.97110000 89.47950000 70.82670000 82.27180000 86.24080000 1183 14.25120000 38.59180000 29.99520000 6.251060000 9.615260000 8.223390000 1184 8.576980000 46.06510000 74.32870000 16.08780000 16.86100000 51.67780000 1185 12.73000000 51.19000000 90.41140000 23.10410000 22.41400000 78.90930000 1186 12.45520000 62.94490000 93.80200000 29.02240000 32.33080000 86.90420000 1187 9.281660000 24.74920000 75.45220000 11.59480000 7.317300000 51.72510000 1188 7.275710000 25.22980000 87.85760000 15.43750000 8.958540000 72.08690000 1189 14.97540000 19.30710000 75.43060000 11.30310000 6.131650000 51.47960000 1190 63.18110000 16.90190000 78.22670000 26.25780000 13.38600000 56.33300000 1191 71.47950000 24.04780000 87.85470000 34.84050000 18.70430000 72.94060000 1192 57.67410000 39.96870000 66.27600000 24.35570000 18.77680000 40.62950000 1193 72.73410000 59.75600000 67.73610000 39.66210000 36.66960000 45.15630000 1194 74.36260000 75.45880000 67.33520000 48.31070000 52.61020000 47.25640000 1195 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 1196 7.710020000 10.15680000 6.203640000 0.420937000 0.559623000 0.295110000 1197 7.612170000 4.618980000 10.11310000 0.301345000 0.203224000 0.636356000 1198 30.28710000 63.57770000 15.43310000 16.48460000 28.07080000 6.102600000 1199 34.00210000 92.80980000 14.70120000 34.45770000 62.78500000 11.69870000 1200 39.94850000 95.35840000 90.38020000 52.14040000 73.02820000 87.09130000 1201 21.70130000 28.66040000 27.26250000 4.757880000 5.732790000 6.283750000 1202 20.63100000 33.10070000 25.73260000 5.336990000 7.312590000 5.910750000 1203 61.14130000 38.88710000 28.48010000 19.59650000 16.62170000 8.151090000 1204 61.80640000 61.36260000 42.29090000 29.24860000 32.90010000 19.06460000 1205 44.91050000 59.22180000 40.26050000 20.83030000 27.22990000 16.95180000 1206 49.99250000 74.18350000 43.04700000 30.34600000 42.84450000 21.49280000 1207 67.69390000 83.84290000 52.49630000 46.12810000 59.30520000 31.94880000 1208 74.54440000 84.85120000 63.39050000 53.15190000 63.62630000 44.19840000 1209 12.65390000 32.43660000 9.078530000 3.535910000 6.275350000 1.508440000 1210 10.27680000 30.78420000 23.05510000 3.672750000 5.789010000 4.678200000 1211 10.37250000 31.07700000 36.38210000 4.971880000 6.399540000 11.21190000 1212 11.43210000 38.40340000 43.03950000 7.534660000 10.02800000 16.35490000 1213 0.000000000 40.73120000 45.85760000 8.210030000 11.22130000 18.76730000 1214 41.42260000 45.38370000 73.28320000 21.34030000 19.29080000 50.35870000 1215 51.42930000 53.84570000 82.97730000 30.69290000 28.04580000 66.56150000 1216 71.81530000 12.78580000 20.17470000 20.83310000 11.25440000 3.873980000 1217 72.59920000 7.440620000 54.75370000 25.30950000 12.66860000 26.26870000 1218 79.93730000 60.33610000 54.23330000 41.67200000 38.41550000 29.85340000 1219 64.04890000 23.69560000 16.88540000 17.34840000 11.13930000 3.128620000 1220 91.04910000 27.31500000 18.62540000 36.06180000 21.59760000 4.616840000 1221 90.03810000 39.30900000 16.64050000 37.67680000 26.19360000 4.903400000 1222 33.24830000 15.57040000 10.78940000 4.394080000 3.138230000 1.081010000 1223 35.44630000 11.28760000 91.72670000 19.43700000 8.734100000 78.90840000 1224 45.95460000 18.11990000 91.08340000 22.99310000 11.39610000 78.03310000 1225 15.55610000 14.89220000 5.936390000 1.267720000 1.455000000 0.403999000 1226 17.05060000 13.77280000 9.164060000 1.393950000 1.386170000 0.687679000 1227 14.69930000 10.39800000 8.937570000 0.943539000 0.841757000 0.579899000 1228 8.826190000 11.11870000 14.22730000 0.731206000 0.772028000 1.409100000 1229 6.437110000 8.179000000 15.38370000 0.538399000 0.459239000 1.602370000 1230 5.951050000 52.34510000 69.99720000 16.93250000 20.56360000 46.25320000 1231 9.232850000 58.92620000 83.86440000 23.65070000 27.36650000 68.28670000 1232 11.68040000 75.69230000 92.35900000 34.90280000 45.01610000 86.28780000 1233 6.351260000 81.46890000 92.34760000 38.03030000 51.68030000 87.38760000 1234 20.31460000 89.10210000 91.43460000 43.80560000 62.05910000 87.37030000 1235 53.01520000 87.00210000 93.97770000 52.28500000 64.21920000 92.17250000 1236 90.00530000 86.71960000 92.77820000 74.15830000 75.26770000 90.85350000 1237 1.445090000 0.000000000 0.000000000 0.003702600 0.001908800 0.000173336 1238 13.56080000 92.53170000 32.87570000 32.21840000 61.18440000 18.30520000 1239 75.42190000 91.66890000 36.61140000 53.68830000 71.29190000 21.31280000 1240 93.20680000 90.72590000 54.20300000 68.88870000 77.82890000 35.99660000 1241 25.23860000 18.16100000 7.137190000 2.890610000 2.730340000 0.659536000 1242 33.00280000 20.03620000 9.726100000 4.750990000 3.983980000 1.081250000 1243 34.38430000 18.05020000 84.68600000 17.29310000 8.698370000 66.41070000 1244 20.91300000 24.27940000 50.46040000 6.920950000 5.465110000 21.71200000 1245 18.31900000 35.01640000 65.28960000 11.61190000 10.45110000 38.45190000 1246 26.02460000 45.68080000 70.68180000 16.93460000 17.23510000 46.54470000 1247 25.36540000 49.93070000 94.62990000 25.76810000 22.96230000 86.87110000 1248 38.32000000 35.31740000 63.14590000 15.19450000 12.45620000 36.02760000 1249 48.48260000 37.88230000 70.32140000 20.94190000 16.11370000 45.62400000 1250 15.86020000 14.00440000 26.27860000 2.147950000 1.700780000 5.221500000 1251 11.25920000 57.31340000 24.49210000 11.66920000 21.52880000 7.828860000 1252 6.114910000 62.53930000 41.61760000 15.45050000 26.57130000 18.07580000 1253 11.65980000 78.14880000 46.01220000 24.43040000 43.08330000 24.18920000 1254 14.06040000 79.97310000 37.75400000 24.54390000 44.88210000 18.47680000 1255 17.52700000 91.53340000 44.67530000 33.39910000 60.56410000 26.01320000 1256 35.24230000 92.67390000 45.58610000 37.61660000 63.92870000 27.17030000 1257 30.23550000 90.43260000 30.76500000 32.98400000 59.40110000 16.80820000 1258 82.53420000 93.02630000 30.24750000 58.84020000 75.46670000 18.28740000 1259 76.54930000 50.64270000 17.87660000 31.32950000 27.99310000 5.898000000 1260 88.61980000 52.67390000 42.68610000 43.12370000 34.87400000 19.00910000 1261 46.81620000 22.14060000 64.82460000 16.02570000 9.385250000 37.43590000 1262 63.01910000 20.12970000 90.18320000 30.37200000 15.55960000 76.78320000 1263 62.74990000 34.35550000 90.29340000 32.62920000 20.22020000 77.76670000 1264 78.85570000 72.28420000 90.75750000 56.55430000 53.47170000 83.78110000 1265 43.60790000 35.14440000 38.61250000 12.45930000 11.48970000 13.23120000 1266 53.61020000 34.11960000 41.08170000 16.37940000 13.13770000 15.04720000 1267 63.65740000 36.33140000 48.52960000 22.81140000 17.06200000 21.38460000 1268 67.88780000 45.08940000 60.21150000 29.71230000 23.84340000 34.04030000 1269 82.68240000 53.54650000 75.09630000 45.81170000 35.94680000 54.92140000 1270 23.28060000 4.536670000 17.00300000 2.078180000 1.088020000 2.022280000 1271 22.31120000 9.006000000 13.01760000 1.905820000 1.225510000 1.204210000 1272 20.50680000 12.76300000 5.439990000 1.681200000 1.437070000 0.345561000 1273 20.12340000 16.56160000 53.16690000 6.397710000 3.796260000 23.97720000 1274 27.88470000 32.22340000 54.42860000 10.18620000 9.102990000 26.05010000 1275 28.21660000 35.95750000 73.02990000 15.36520000 12.47520000 48.99580000 1276 46.51770000 39.06810000 90.42260000 26.65250000 18.78840000 78.04330000 1277 18.78970000 3.835200000 25.62730000 1.974800000 0.954450000 4.817730000 1278 31.80020000 6.725560000 37.60000000 5.513710000 2.740170000 11.24600000 1279 32.74740000 63.83470000 57.92570000 22.29700000 30.64870000 33.21490000 1280 35.99050000 80.31010000 61.21150000 32.56750000 48.85660000 39.86160000 1281 42.42790000 96.78820000 60.61650000 45.54070000 72.19260000 42.99900000 1282 29.58180000 40.62190000 27.14470000 8.788020000 11.73280000 7.178030000 1283 58.82760000 44.15440000 31.13110000 20.14990000 19.02200000 9.877090000 1284 65.89420000 52.92000000 37.14780000 27.34450000 26.95730000 14.48100000 1285 65.54560000 59.30100000 46.12240000 30.90950000 32.37720000 21.87180000 1286 82.27590000 65.23240000 65.46260000 47.93480000 44.63710000 43.35290000 1287 93.31010000 76.94330000 68.03030000 63.24250000 61.53910000 49.09880000 1288 94.38990000 87.19740000 72.69500000 71.72830000 75.22070000 57.66010000 1289 93.41810000 86.60820000 88.17210000 75.25290000 75.90970000 82.41950000 1290 53.29130000 49.27330000 45.26100000 21.02850000 21.66960000 19.62500000 1291 62.37610000 54.22280000 47.45890000 27.41580000 27.54500000 22.24160000 1292 91.18730000 9.951890000 15.16290000 34.17450000 17.91700000 3.151450000 1293 93.68130000 12.80220000 23.14710000 36.83570000 19.48410000 5.607180000 1294 93.29800000 11.62470000 31.56030000 37.14700000 19.45260000 9.286770000 1295 93.14560000 14.33110000 40.28450000 38.21900000 20.16110000 14.68790000 1296 91.41500000 8.841860000 67.03280000 41.51280000 20.79200000 41.08250000 1297 87.18510000 7.726400000 80.24420000 41.75380000 20.43070000 60.05180000 1298 68.97070000 31.56980000 60.38760000 27.00300000 17.43830000 33.14650000 1299 70.30620000 35.01200000 70.62150000 30.95830000 20.26950000 46.30880000 1300 70.04770000 37.30100000 81.59260000 34.47610000 22.50940000 63.01300000 1301 83.50610000 46.67820000 91.22150000 49.18380000 33.59010000 81.19400000 1302 94.26810000 47.41200000 92.40100000 58.31570000 38.59580000 83.89430000 1303 56.97610000 47.18090000 55.63660000 23.79260000 21.86620000 29.02470000 1304 57.40670000 65.13240000 66.43910000 33.43920000 37.06720000 43.88880000 1305 58.48010000 65.43010000 91.85320000 41.71440000 40.66050000 84.13440000 1306 21.72170000 33.39130000 34.89950000 6.422240000 7.862090000 10.52250000 1307 19.10780000 70.51180000 48.41640000 21.32750000 35.19120000 24.86320000 1308 19.13660000 82.18150000 56.59680000 29.47210000 49.07610000 34.97680000 1309 15.73280000 89.28060000 85.84270000 41.47440000 61.26080000 77.27010000 1310 13.14380000 65.54740000 81.53350000 26.11950000 33.10210000 65.40170000 1311 12.04630000 70.55520000 93.17840000 32.45020000 39.59680000 86.92920000 1312 4.513480000 91.46300000 94.78410000 45.47490000 65.21690000 94.28930000 1313 17.98960000 62.08440000 70.43570000 21.83330000 28.89920000 48.20100000 1314 14.92120000 76.46260000 72.87940000 29.44730000 43.56230000 54.03950000 1315 10.53370000 76.24820000 78.82790000 30.68430000 43.82310000 62.91090000 1316 8.995660000 66.30180000 60.48030000 20.66270000 31.46410000 36.29330000 1317 56.66090000 65.58880000 61.02650000 32.05790000 36.81970000 37.35180000 1318 57.96780000 79.17440000 61.99260000 40.13320000 51.72610000 40.92580000 1319 16.14690000 62.13910000 17.29770000 13.68670000 25.65620000 6.226740000 1320 19.62630000 70.39090000 14.48530000 17.92650000 33.73830000 6.918520000 1321 18.75500000 81.69550000 15.67290000 24.26870000 46.50760000 9.304650000 1322 35.64330000 87.24060000 58.30180000 36.26050000 57.37630000 38.04620000 1323 24.92420000 44.02250000 39.28730000 10.14000000 13.69690000 14.23270000 1324 92.92030000 45.22180000 52.72970000 45.75000000 32.34380000 26.98950000 1325 91.71690000 72.48310000 77.26680000 61.95340000 56.91470000 61.37710000 1326 50.51570000 43.21630000 45.91840000 18.09440000 17.34040000 19.47730000 1327 55.52440000 42.02250000 57.62460000 21.99060000 18.60390000 30.58170000 1328 36.07860000 17.71890000 24.27490000 5.978770000 4.170240000 4.694980000 1329 41.67640000 14.34360000 24.83720000 7.360030000 4.438660000 4.891180000 1330 43.45160000 10.27280000 35.63710000 8.700990000 4.626050000 10.21770000 1331 68.34510000 12.02140000 38.94220000 20.46340000 10.79050000 12.89480000 1332 67.66660000 35.09350000 43.31510000 23.90980000 17.30190000 17.10550000 1333 53.50820000 30.18810000 33.67710000 14.63910000 11.16740000 10.02290000 1334 71.86360000 62.81730000 32.32400000 34.30810000 36.60760000 13.15190000 1335 55.52360000 43.89520000 23.64600000 17.91180000 17.82770000 6.466460000 1336 65.09090000 81.61000000 32.75360000 40.46010000 54.63270000 16.53960000 1337 40.60920000 50.10750000 9.305230000 13.60370000 18.61630000 3.386940000 1338 54.06280000 66.41680000 10.19650000 25.32060000 34.62370000 5.973020000 1339 62.58200000 66.33770000 12.90490000 29.41150000 36.66680000 6.575480000 1340 90.31720000 75.18700000 18.93540000 52.52550000 55.37720000 10.35630000 1341 89.48070000 81.32160000 35.49380000 56.83850000 62.77830000 18.81940000 1342 98.27870000 91.75180000 35.16350000 71.09590000 80.37260000 21.26680000 1343 53.47620000 73.28290000 28.89250000 29.63700000 41.94020000 12.70090000 1344 53.65560000 85.70130000 29.22480000 37.16160000 56.82840000 15.33520000 1345 25.53130000 38.87220000 9.246350000 6.620030000 10.04690000 2.093790000 1346 23.95260000 42.48480000 55.87110000 12.23940000 13.80970000 28.32060000 1347 23.89400000 47.63030000 56.71840000 13.95430000 16.98390000 29.72800000 1348 24.95660000 55.99290000 63.00750000 18.47120000 23.59500000 37.83940000 1349 32.50820000 64.17840000 73.71190000 26.19560000 32.45500000 53.26050000 1350 33.49440000 77.67230000 75.77190000 34.03980000 46.87030000 58.65260000 1351 46.67130000 31.61110000 34.29710000 12.27350000 10.34630000 10.34270000 1352 49.19460000 29.84490000 58.92890000 16.80930000 11.73040000 30.94820000 1353 55.96940000 30.62240000 68.08590000 21.90720000 14.33110000 42.23770000 1354 36.67160000 22.12650000 51.97220000 10.11690000 6.645710000 23.18150000 1355 56.52030000 20.23980000 62.19990000 19.17680000 10.73430000 34.36150000 1356 67.49460000 24.26130000 68.50830000 26.81510000 15.27300000 42.71730000 1357 81.48440000 33.32100000 84.20440000 41.84340000 24.87820000 67.42190000 1358 19.53530000 40.04690000 18.23540000 6.343270000 10.31560000 3.898350000 1359 26.70980000 50.32530000 24.44240000 10.97430000 17.28930000 7.028070000 1360 89.22210000 59.03820000 30.11230000 44.60060000 39.50320000 12.02920000 1361 49.38740000 32.18660000 14.95290000 11.97160000 10.52760000 2.849940000 1362 57.01390000 42.63330000 12.37190000 17.65160000 17.22060000 3.348820000 1363 57.80090000 49.55300000 9.913030000 20.09820000 21.68200000 3.712670000 1364 66.62030000 61.83290000 10.42610000 29.42770000 33.59910000 5.590180000 1365 75.93830000 74.17920000 8.014210000 41.12090000 48.71430000 7.603570000 1366 75.64920000 80.25540000 27.85390000 45.45290000 56.03330000 14.11070000 1367 77.49100000 81.11840000 40.41580000 48.56630000 58.25830000 21.58820000 1368 24.77270000 24.47010000 9.836810000 3.644070000 4.267270000 1.208430000 1369 65.28400000 40.67320000 12.31800000 21.26970000 18.28550000 3.354600000 1370 79.37380000 45.25940000 10.80200000 31.20220000 25.35560000 3.958610000 1371 92.59050000 45.22340000 9.589990000 41.16330000 30.47820000 4.259310000 1372 92.47240000 57.14200000 10.38800000 45.28590000 38.83680000 5.760290000 1373 95.79270000 77.77170000 7.755180000 58.15510000 60.51340000 8.957810000 1374 43.17080000 39.10300000 8.697070000 11.12000000 12.45520000 2.258100000 1375 49.89060000 37.95120000 31.44550000 14.60030000 13.66700000 9.298290000 1376 56.27290000 39.58540000 84.24400000 28.68410000 20.27380000 67.29370000 1377 57.78570000 44.18990000 94.83090000 34.34060000 24.65830000 87.13890000 1378 13.37640000 12.20150000 44.46690000 3.881240000 2.169880000 16.13280000 1379 10.57270000 8.880130000 49.82920000 4.369720000 2.060550000 20.61530000 1380 45.72370000 9.076480000 58.66210000 13.14490000 6.402610000 29.81940000 1381 58.30920000 3.686140000 72.81920000 21.60270000 10.13640000 47.91540000 1382 83.37590000 20.10710000 76.70540000 38.77120000 20.38330000 54.69380000 1383 53.79250000 30.63750000 50.23060000 17.16850000 12.32900000 22.28690000 1384 67.89000000 32.08250000 52.52890000 24.91120000 16.69310000 24.87310000 1385 77.93560000 36.69560000 53.81320000 32.39770000 22.02260000 26.76020000 1386 17.58500000 8.598190000 8.065160000 1.135240000 0.817757000 0.470715000 1387 37.30110000 11.91510000 6.228700000 5.086930000 3.111110000 0.543597000 1388 39.72790000 10.50970000 13.16740000 5.876450000 3.379660000 1.438010000 1389 52.89750000 16.18610000 8.935880000 10.90510000 6.579240000 1.162250000 1390 77.62440000 16.42250000 8.832210000 24.38540000 13.56040000 1.787600000 1391 89.14880000 30.58670000 9.217900000 34.77030000 21.83650000 2.882700000 1392 90.72860000 29.02860000 54.79040000 40.45610000 23.79750000 27.65580000 1393 92.21300000 32.89750000 91.93040000 52.60610000 29.99110000 81.64630000 1394 35.18160000 9.191850000 33.10820000 5.920540000 3.147640000 8.616690000 1395 54.29950000 11.14590000 33.15610000 12.64560000 6.761220000 8.986300000 1396 64.76240000 18.56730000 32.91780000 18.31100000 10.56740000 9.291030000 1397 61.77100000 34.81750000 31.00780000 19.18270000 14.94590000 9.078140000 1398 64.85870000 42.99050000 38.01170000 23.65050000 20.23660000 13.93420000 1399 90.52570000 75.10450000 51.01810000 56.29110000 56.82920000 29.53920000 END_DATA CAL DESCRIPTOR "Argyll Device Calibration State" ORIGINATOR "Argyll dispcal" CREATED "Sat Mar 14 19:07:36 2009" KEYWORD "DEVICE_CLASS" DEVICE_CLASS "DISPLAY" KEYWORD "COLOR_REP" COLOR_REP "RGB" BEGIN_ARGYLL_DISPCAL_ARGS -qm -w0.3127,0.3290 -f0 -k0 END_ARGYLL_DISPCAL_ARGS KEYWORD "RGB_I" NUMBER_OF_FIELDS 4 BEGIN_DATA_FORMAT RGB_I RGB_R RGB_G RGB_B END_DATA_FORMAT NUMBER_OF_SETS 256 BEGIN_DATA 0.00000 0.00000 0.00000 0.00000 0.00392 0.00392 0.00392 0.00392 0.00784 0.00784 0.00784 0.00784 0.01176 0.01176 0.01176 0.01176 0.01569 0.01569 0.01569 0.01569 0.01961 0.01961 0.01961 0.01961 0.02353 0.02353 0.02353 0.02353 0.02745 0.02745 0.02745 0.02745 0.03137 0.03137 0.03137 0.03137 0.03529 0.03529 0.03529 0.03529 0.03922 0.03922 0.03922 0.03922 0.04314 0.04314 0.04314 0.04314 0.04706 0.04706 0.04706 0.04706 0.05098 0.05098 0.05098 0.05098 0.05490 0.05490 0.05490 0.05490 0.05882 0.05882 0.05882 0.05882 0.06275 0.06275 0.06275 0.06275 0.06667 0.06667 0.06667 0.06667 0.07059 0.07059 0.07059 0.07059 0.07451 0.07451 0.07451 0.07451 0.07843 0.07843 0.07843 0.07843 0.08235 0.08235 0.08235 0.08235 0.08627 0.08627 0.08627 0.08627 0.09020 0.09020 0.09020 0.09020 0.09412 0.09412 0.09412 0.09412 0.09804 0.09804 0.09804 0.09804 0.10196 0.10196 0.10196 0.10196 0.10588 0.10588 0.10588 0.10588 0.10980 0.10980 0.10980 0.10980 0.11373 0.11373 0.11373 0.11373 0.11765 0.11765 0.11765 0.11765 0.12157 0.12157 0.12157 0.12157 0.12549 0.12549 0.12549 0.12549 0.12941 0.12941 0.12941 0.12941 0.13333 0.13333 0.13333 0.13333 0.13725 0.13725 0.13725 0.13725 0.14118 0.14118 0.14118 0.14118 0.14510 0.14510 0.14510 0.14510 0.14902 0.14902 0.14902 0.14902 0.15294 0.15294 0.15294 0.15294 0.15686 0.15686 0.15686 0.15686 0.16078 0.16078 0.16078 0.16078 0.16471 0.16471 0.16471 0.16471 0.16863 0.16863 0.16863 0.16863 0.17255 0.17255 0.17255 0.17255 0.17647 0.17647 0.17647 0.17647 0.18039 0.18039 0.18039 0.18039 0.18431 0.18431 0.18431 0.18431 0.18824 0.18824 0.18824 0.18824 0.19216 0.19216 0.19216 0.19216 0.19608 0.19608 0.19608 0.19608 0.20000 0.20000 0.20000 0.20000 0.20392 0.20392 0.20392 0.20392 0.20784 0.20784 0.20784 0.20784 0.21176 0.21176 0.21176 0.21176 0.21569 0.21569 0.21569 0.21569 0.21961 0.21961 0.21961 0.21961 0.22353 0.22353 0.22353 0.22353 0.22745 0.22745 0.22745 0.22745 0.23137 0.23137 0.23137 0.23137 0.23529 0.23529 0.23529 0.23529 0.23922 0.23922 0.23922 0.23922 0.24314 0.24314 0.24314 0.24314 0.24706 0.24706 0.24706 0.24706 0.25098 0.25098 0.25098 0.25098 0.25490 0.25490 0.25490 0.25490 0.25882 0.25882 0.25882 0.25882 0.26275 0.26275 0.26275 0.26275 0.26667 0.26667 0.26667 0.26667 0.27059 0.27059 0.27059 0.27059 0.27451 0.27451 0.27451 0.27451 0.27843 0.27843 0.27843 0.27843 0.28235 0.28235 0.28235 0.28235 0.28627 0.28627 0.28627 0.28627 0.29020 0.29020 0.29020 0.29020 0.29412 0.29412 0.29412 0.29412 0.29804 0.29804 0.29804 0.29804 0.30196 0.30196 0.30196 0.30196 0.30588 0.30588 0.30588 0.30588 0.30980 0.30980 0.30980 0.30980 0.31373 0.31373 0.31373 0.31373 0.31765 0.31765 0.31765 0.31765 0.32157 0.32157 0.32157 0.32157 0.32549 0.32549 0.32549 0.32549 0.32941 0.32941 0.32941 0.32941 0.33333 0.33333 0.33333 0.33333 0.33725 0.33725 0.33725 0.33725 0.34118 0.34118 0.34118 0.34118 0.34510 0.34510 0.34510 0.34510 0.34902 0.34902 0.34902 0.34902 0.35294 0.35294 0.35294 0.35294 0.35686 0.35686 0.35686 0.35686 0.36078 0.36078 0.36078 0.36078 0.36471 0.36471 0.36471 0.36471 0.36863 0.36863 0.36863 0.36863 0.37255 0.37255 0.37255 0.37255 0.37647 0.37647 0.37647 0.37647 0.38039 0.38039 0.38039 0.38039 0.38431 0.38431 0.38431 0.38431 0.38824 0.38824 0.38824 0.38824 0.39216 0.39216 0.39216 0.39216 0.39608 0.39608 0.39608 0.39608 0.40000 0.40000 0.40000 0.40000 0.40392 0.40392 0.40392 0.40392 0.40784 0.40784 0.40784 0.40784 0.41176 0.41176 0.41176 0.41176 0.41569 0.41569 0.41569 0.41569 0.41961 0.41961 0.41961 0.41961 0.42353 0.42353 0.42353 0.42353 0.42745 0.42745 0.42745 0.42745 0.43137 0.43137 0.43137 0.43137 0.43529 0.43529 0.43529 0.43529 0.43922 0.43922 0.43922 0.43922 0.44314 0.44314 0.44314 0.44314 0.44706 0.44706 0.44706 0.44706 0.45098 0.45098 0.45098 0.45098 0.45490 0.45490 0.45490 0.45490 0.45882 0.45882 0.45882 0.45882 0.46275 0.46275 0.46275 0.46275 0.46667 0.46667 0.46667 0.46667 0.47059 0.47059 0.47059 0.47059 0.47451 0.47451 0.47451 0.47451 0.47843 0.47843 0.47843 0.47843 0.48235 0.48235 0.48235 0.48235 0.48627 0.48627 0.48627 0.48627 0.49020 0.49020 0.49020 0.49020 0.49412 0.49412 0.49412 0.49412 0.49804 0.49804 0.49804 0.49804 0.50196 0.50196 0.50196 0.50196 0.50588 0.50588 0.50588 0.50588 0.50980 0.50980 0.50980 0.50980 0.51373 0.51373 0.51373 0.51373 0.51765 0.51765 0.51765 0.51765 0.52157 0.52157 0.52157 0.52157 0.52549 0.52549 0.52549 0.52549 0.52941 0.52941 0.52941 0.52941 0.53333 0.53333 0.53333 0.53333 0.53725 0.53725 0.53725 0.53725 0.54118 0.54118 0.54118 0.54118 0.54510 0.54510 0.54510 0.54510 0.54902 0.54902 0.54902 0.54902 0.55294 0.55294 0.55294 0.55294 0.55686 0.55686 0.55686 0.55686 0.56078 0.56078 0.56078 0.56078 0.56471 0.56471 0.56471 0.56471 0.56863 0.56863 0.56863 0.56863 0.57255 0.57255 0.57255 0.57255 0.57647 0.57647 0.57647 0.57647 0.58039 0.58039 0.58039 0.58039 0.58431 0.58431 0.58431 0.58431 0.58824 0.58824 0.58824 0.58824 0.59216 0.59216 0.59216 0.59216 0.59608 0.59608 0.59608 0.59608 0.60000 0.60000 0.60000 0.60000 0.60392 0.60392 0.60392 0.60392 0.60784 0.60784 0.60784 0.60784 0.61176 0.61176 0.61176 0.61176 0.61569 0.61569 0.61569 0.61569 0.61961 0.61961 0.61961 0.61961 0.62353 0.62353 0.62353 0.62353 0.62745 0.62745 0.62745 0.62745 0.63137 0.63137 0.63137 0.63137 0.63529 0.63529 0.63529 0.63529 0.63922 0.63922 0.63922 0.63922 0.64314 0.64314 0.64314 0.64314 0.64706 0.64706 0.64706 0.64706 0.65098 0.65098 0.65098 0.65098 0.65490 0.65490 0.65490 0.65490 0.65882 0.65882 0.65882 0.65882 0.66275 0.66275 0.66275 0.66275 0.66667 0.66667 0.66667 0.66667 0.67059 0.67059 0.67059 0.67059 0.67451 0.67451 0.67451 0.67451 0.67843 0.67843 0.67843 0.67843 0.68235 0.68235 0.68235 0.68235 0.68627 0.68627 0.68627 0.68627 0.69020 0.69020 0.69020 0.69020 0.69412 0.69412 0.69412 0.69412 0.69804 0.69804 0.69804 0.69804 0.70196 0.70196 0.70196 0.70196 0.70588 0.70588 0.70588 0.70588 0.70980 0.70980 0.70980 0.70980 0.71373 0.71373 0.71373 0.71373 0.71765 0.71765 0.71765 0.71765 0.72157 0.72157 0.72157 0.72157 0.72549 0.72549 0.72549 0.72549 0.72941 0.72941 0.72941 0.72941 0.73333 0.73333 0.73333 0.73333 0.73725 0.73725 0.73725 0.73725 0.74118 0.74118 0.74118 0.74118 0.74510 0.74510 0.74510 0.74510 0.74902 0.74902 0.74902 0.74902 0.75294 0.75294 0.75294 0.75294 0.75686 0.75686 0.75686 0.75686 0.76078 0.76078 0.76078 0.76078 0.76471 0.76471 0.76471 0.76471 0.76863 0.76863 0.76863 0.76863 0.77255 0.77255 0.77255 0.77255 0.77647 0.77647 0.77647 0.77647 0.78039 0.78039 0.78039 0.78039 0.78431 0.78431 0.78431 0.78431 0.78824 0.78824 0.78824 0.78824 0.79216 0.79216 0.79216 0.79216 0.79608 0.79608 0.79608 0.79608 0.80000 0.80000 0.80000 0.80000 0.80392 0.80392 0.80392 0.80392 0.80784 0.80784 0.80784 0.80784 0.81176 0.81176 0.81176 0.81176 0.81569 0.81569 0.81569 0.81569 0.81961 0.81961 0.81961 0.81961 0.82353 0.82353 0.82353 0.82353 0.82745 0.82745 0.82745 0.82745 0.83137 0.83137 0.83137 0.83137 0.83529 0.83529 0.83529 0.83529 0.83922 0.83922 0.83922 0.83922 0.84314 0.84314 0.84314 0.84314 0.84706 0.84706 0.84706 0.84706 0.85098 0.85098 0.85098 0.85098 0.85490 0.85490 0.85490 0.85490 0.85882 0.85882 0.85882 0.85882 0.86275 0.86275 0.86275 0.86275 0.86667 0.86667 0.86667 0.86667 0.87059 0.87059 0.87059 0.87059 0.87451 0.87451 0.87451 0.87451 0.87843 0.87843 0.87843 0.87843 0.88235 0.88235 0.88235 0.88235 0.88627 0.88627 0.88627 0.88627 0.89020 0.89020 0.89020 0.89020 0.89412 0.89412 0.89412 0.89412 0.89804 0.89804 0.89804 0.89804 0.90196 0.90196 0.90196 0.90196 0.90588 0.90588 0.90588 0.90588 0.90980 0.90980 0.90980 0.90980 0.91373 0.91373 0.91373 0.91373 0.91765 0.91765 0.91765 0.91765 0.92157 0.92157 0.92157 0.92157 0.92549 0.92549 0.92549 0.92549 0.92941 0.92941 0.92941 0.92941 0.93333 0.93333 0.93333 0.93333 0.93725 0.93725 0.93725 0.93725 0.94118 0.94118 0.94118 0.94118 0.94510 0.94510 0.94510 0.94510 0.94902 0.94902 0.94902 0.94902 0.95294 0.95294 0.95294 0.95294 0.95686 0.95686 0.95686 0.95686 0.96078 0.96078 0.96078 0.96078 0.96471 0.96471 0.96471 0.96471 0.96863 0.96863 0.96863 0.96863 0.97255 0.97255 0.97255 0.97255 0.97647 0.97647 0.97647 0.97647 0.98039 0.98039 0.98039 0.98039 0.98431 0.98431 0.98431 0.98431 0.98824 0.98824 0.98824 0.98824 0.99216 0.99216 0.99216 0.99216 0.99608 0.99608 0.99608 0.99608 1.00000 1.00000 1.00000 1.00000 END_DATA DisplayCAL-3.1.0.0/misc/winversion.txt0000644000076500000000000000276712647526533017422 0ustar devwheel00000000000000# UTF-8 # # For more details about fixed file info 'ffi' see: # http://msdn.microsoft.com/en-us/library/ms646997.aspx VSVersionInfo( ffi=FixedFileInfo( # filevers and prodvers should be always a tuple with four items: (1, 2, 3, 4) # Set not needed items to zero 0. filevers=%(filevers)s, prodvers=%(prodvers)s, # Contains a bitmask that specifies the valid bits 'flags'r mask=0x0, # Contains a bitmask that specifies the Boolean attributes of the file. flags=0x0, # The operating system for which this file was designed. # 0x4 - NT and there is no need to change it. OS=0x4, # The general type of file. # 0x1 - the file is an application. fileType=0x1, # The function of the file. # 0x0 - the function is not defined for this fileType subtype=0x0, # Creation date and time stamp. date=(0, 0) ), kids=[ StringFileInfo( [ StringTable( u'040904b0', [StringStruct(u'CompanyName', u'%(CompanyName)s'), StringStruct(u'FileDescription', u'%(FileDescription)s'), StringStruct(u'FileVersion', u'%(FileVersion)s'), StringStruct(u'InternalName', u'%(InternalName)s'), StringStruct(u'LegalCopyright', u'%(LegalCopyright)s'), StringStruct(u'OriginalFilename', u'%(OriginalFilename)s'), StringStruct(u'ProductName', u'%(ProductName)s'), StringStruct(u'ProductVersion', u'%(ProductVersion)s')]) ]), VarFileInfo([VarStruct(u'Translation', [1033, 1200])]) ] ) DisplayCAL-3.1.0.0/misc/xrced_plugins/0000755000076500000000000000000012653527012017276 5ustar devwheel00000000000000DisplayCAL-3.1.0.0/misc/xrced_plugins/fancytext.crx0000644000076500000000000000104612647526532022033 0ustar devwheel00000000000000 control pos size label 1 xh_fancytext StaticFancyTextCtrlXmlHandler control This class works similar to StaticText except it interprets its text as FancyText. DisplayCAL-3.1.0.0/misc/xrced_plugins/filebrowsebutton.crx0000644000076500000000000000321012647526532023416 0ustar devwheel00000000000000 control pos size labelText buttonText toolTip dialogTitle startDirectory initialValue fileMask fileMode labelWidth 1 xh_filebrowsebutton FileBrowseButtonXmlHandler gizmo A control to allow the user to type in a filename or browse with the standard file dialog to select file 10 control pos size labelText buttonText toolTip dialogTitle startDirectory initialValue fileMask fileMode labelWidth 1 xh_filebrowsebutton FileBrowseButtonWithHistoryXmlHandler gizmo A control to allow the user to type in a filename or browse with the standard file dialog to select file 10 DisplayCAL-3.1.0.0/misc/xrced_plugins/floatspin.crx0000644000076500000000000000144412647526532022027 0ustar devwheel00000000000000 control pos size value min_val max_val increment digits 1 FS_LEFT FS_RIGHT FS_CENTRE FS_READONLY EVT_FLOATSPIN xh_floatspin FloatSpinCtrlXmlHandler gizmo Floating Point SpinCtrl 10 DisplayCAL-3.1.0.0/misc/xrced_plugins/hstretchstatbmp.crx0000644000076500000000000000105412647526532023244 0ustar devwheel00000000000000 control pos size bitmap:BitmapAttribute 1 xh_hstretchstatbmp HStretchStaticBitmapXmlHandler control An automatically horizontally stretching StaticBitmap. DisplayCAL-3.1.0.0/misc/xrced_plugins/xh_floatspin.py0000644000076500000000000000255112647526532022362 0ustar devwheel00000000000000# -*- coding: utf-8 -*- import wx import wx.xrc as xrc try: import wx.lib.agw.floatspin as floatspin except ImportError: import floatspin class FloatSpinCtrlXmlHandler(xrc.XmlResourceHandler): def __init__(self): xrc.XmlResourceHandler.__init__(self) # Standard styles self.AddWindowStyles() # Custom styles self.AddStyle('FS_LEFT', floatspin.FS_LEFT) self.AddStyle('FS_RIGHT', floatspin.FS_RIGHT) self.AddStyle('FS_CENTRE', floatspin.FS_CENTRE) self.AddStyle('FS_READONLY', floatspin.FS_READONLY) def CanHandle(self,node): return self.IsOfClass(node, 'FloatSpin') # Process XML parameters and create the object def DoCreateResource(self): try: min_val = float(self.GetText('min_val')) except: min_val = None try: max_val = float(self.GetText('max_val')) except: max_val = None try: increment = float(self.GetText('increment')) except: increment = 1.0 w = floatspin.FloatSpin(parent=self.GetParentAsWindow(), id=self.GetID(), pos=self.GetPosition(), size=self.GetSize(), style=self.GetStyle(), min_val=min_val, max_val=max_val, increment=increment, name=self.GetName()) try: w.SetValue(float(self.GetText('value'))) except: w.SetValue(0.0) try: w.SetDigits(int(self.GetText('digits'))) except: pass self.SetupWindow(w) return w DisplayCAL-3.1.0.0/misc/z-displaycal-apply-profiles.desktop0000644000076500000000000000073712647526533023404 0ustar devwheel00000000000000[Desktop Entry] Version=1.0 Encoding=UTF-8 Type=Application Name=Calibration Loader Name[de]=Kalibrierungs-Lader GenericName=Calibration and ICC Profile Loader GenericName[de]=Kalibrierungs- und ICC-Profil-Lader Icon=displaycal-apply-profiles Exec=displaycal-apply-profiles Terminal=false Comment[de]=Setzt ICC-Profile und lädt Kalibrierungskurven für alle konfigurierten Anzeigegeräte Comment=Sets ICC profiles and loads calibration curves for all configured display devices DisplayCAL-3.1.0.0/PKG-INFO0000644000076500000000000000330112653527012014567 0ustar devwheel00000000000000Metadata-Version: 1.1 Name: DisplayCAL Version: 3.1.0.0 Summary: A graphical front-end for display calibration and profiling using Argyll CMS Home-page: http://displaycal.net/ Author: Florian Hoech Author-email: florian@displaycal.net License: GPL v3 Download-URL: http://displaycal.net/DisplayCAL-3.1.0.0.tar.gz Description: Calibrates and characterizes display devices using a hardware sensor, driven by the open source color management system Argyll CMS. Supports multi-display setups and a variety of available settings like customizable whitepoint, luminance, black level, tone response curve as well as the creation of matrix and look-up-table ICC profiles with optional gamut mapping. Calibrations and profiles can be verified through measurements, and profiles can be installed to make them available to color management aware applications. Profile installation can utilize Argyll CMS, Oyranos and/or GNOME Color Manager if available, for flexible integration. Platform: Python >= 2.6 <= 2.7 Platform: Linux/Unix with X11 Platform: Mac OS X >= 10.4 Platform: Windows 2000 and newer Classifier: Development Status :: 5 - Production/Stable Classifier: Environment :: MacOS X Classifier: Environment :: Win32 (MS Windows) Classifier: Environment :: X11 Applications Classifier: Intended Audience :: End Users/Desktop Classifier: License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+) Classifier: Operating System :: OS Independent Classifier: Programming Language :: Python :: 2.6 Classifier: Programming Language :: Python :: 2.7 Classifier: Topic :: Multimedia :: Graphics Requires: wxPython (>= 2.8.8) Provides: DisplayCAL DisplayCAL-3.1.0.0/README.html0000644000076500000000000074115712653526636015352 0ustar devwheel00000000000000 DisplayCAL (formerly known as dispcalGUI)—Open Source Display Calibration and Characterization powered by Argyll CMS

If you'd like to measure color on the go, you may also be interested in ArgyllPRO ColorMeter by Graeme Gill, author of Argyll CMS. Available for Android from the Google Play store. Check out the 2 Minute Overview + Guided Tour Video.

About DisplayCAL

DisplayCAL is a graphical user interface developed by Florian Höch for the display calibration and profiling tools of Argyll CMS, an open source color management system developed by Graeme Gill.

Calibrate and characterize your display devices using one of the many supported hardware sensors, with support for multi-display setups and a variety of available settings like customizable whitepoint, luminance, tone response curve as well as the option to create matrix and look-up-table ICC profiles, with optional gamut mapping, as well as some proprietary 3D LUT formats. Other features include:

  • Support of colorimeter correction for different screens via correction matrices or calibration specral sample files (the latter only for specific colorimeters i.e. i1 Display Pro, ColorMunki Display and Spyder 4/5).
  • Profile verification and measurement report: Check the quality of profiles and 3D LUTs via measurements. Also supports custom CGATS files (e.g. FOGRA, GRACoL/IDEAlliance, SWOP) and using of reference profiles to obtain test values.
  • Test chart editor: Create charts with any amount of color patches, easy copy & paste from CGATS, CSV files (only tab-delimited) and spreadsheet applications.
  • Create synthetic ICC (matrix) profiles with custom primaries, white- and blackpoint as well as tone response.

Screenshots


Display & instrument settings

Calibration settings

Profiling settings


3D LUT settings

Verification settings

Testchart editor


Display adjustment

Profile information

Calibration curves


KDE4

Mac OS X

Windows 10

Disclaimer

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.

DisplayCAL is written in Python and uses the 3rd-party packages NumPy, demjson (JSON[6] library) and wxPython (GUI[4] toolkit). It also makes extensive use of several Argyll CMS utilities. The build system to create standalone executables additionally uses setuptools and py2app on Mac OS X or py2exe on Windows. All of these software packages are © by their respective authors.

Get DisplayCAL standalone

Please continue with the Quickstart Guide.

Get DisplayCAL via Zero Install

  • Brief introduction to Zero Install

    (Note: Usually you do not have to install Zero Install separately, it is handled automatically by the DisplayCAL downloads linked below. The following paragraph is only informational.)

    Zero Install is a decentralised cross-platform software installation system. The benefits you get from Zero Install are:

    • Always up-to-date. Zero Install automatically keeps all software updated.
    • Easily switch between software versions from within Zero Install if desired.
    • No administrator rights needed to add or update software (*).

    * Note: Installing/updating Zero Install itself or software dependencies through the operating system's mechanisms may require administrative privileges.

  • For Linux

    Native packages for several distributions are available via openSUSE Build Service:

    Arch Linux note: The zeroinstall-injector 2.6.1 package in AUR is broken. Get a working version here:

    Please note:

    • The version number in the package name does not necessarily reflect the DisplayCAL version.

    Packages made for older distributions may work on newer distributions as long as nothing substantial has changed (i.e. Python version). Also there are several distributions out there that are based on one in the above list (e.g. Linux Mint which is based on Ubuntu). This means that packages for that base distribution should also work on derivatives, you just need to know which version the derivative is based upon and pick your download accordingly. In all other cases, please try the instructions below or one of the standalone installations.

    Alternate installation method

    If your distribution is not listed above, please follow these instructions:

    1. Install the 0install or zeroinstall-injector package from your distribution. In case it is not available, there are pre-compiled generic binaries. Download the appropriate archive for your system, unpack it, cd to the extracted folder in a terminal, and run sudo ./install.sh local to install to /usr/local, or ./install.sh home to install to your home directory (you may have to add ~/bin to your PATH variable in that case). You'll need libcurl installed (most systems have it by default).
    2. Choose the 0install entry from the applications menu (older versions of Zero Install will have an “Add New Program” entry instead).
    3. Drag DisplayCAL's Zero Install feed link to the Zero Install window.

    Note on DisplayCAL's standalone tools under Linux (3D LUT maker, curve viewer, profile information, synthetic profile creator, testchart editor, VRML to X3D converter): If using the alternate installation method, an application icon entry will only be created for DisplayCAL itself. This is currently a limitation of Zero Install under Linux. You can manually install icon entries for the standalone tools by running the following in a terminal:

    0launch --command=install-standalone-tools-icons \
    http://displaycal.net/0install/DisplayCAL.xml

    And you may uninstall them again with:

    0launch --command=uninstall-standalone-tools-icons \
    http://displaycal.net/0install/DisplayCAL.xml
  • For Mac OS X (10.5 or newer)

    Download the DisplayCAL Zero Install Launcher disk image and run any of the included applications.

  • For Windows (XP or newer)

    Download and install the DisplayCAL Zero Install Setup: Administrator install | Per-user install.

  • Manually updating or switching between software versions

    Updates are normally applied automatically. If you want to manually update or switch between software versions, please follow the instructions below.

    • Linux

      Choose the 0install entry from the applications menu (older versions of Zero Install will have a “Manage Programs” entry instead). In the window that opens, right-click the DisplayCAL icon and select “Choose versions” (with older versions of Zero Install, you have to click the small “Update or change version” icon below the “Run” button instead). You can then click the “Refresh all” button to update, or click the small button to the right of an entry and select “Show versions”.

      To select a specific software version, click on the version entry and set the rating to “preferred” (note that this will prevent updates being downloaded for the selected software until you manually change to a different version or reset the rating).

    • Mac OS X

      Run the 0install Launcher. In the window that opens, click the “Refresh all” button to update, or click the small button to the right of an entry and select “Show versions”.

      To select a specific software version, click on the version entry and set the rating to “preferred” (note that this will prevent updates being downloaded for the selected software until you manually change to a different version or reset the rating).

    • Windows

      Choose the Zero Install entry from the start page under Windows 8, or the respective subfolder of the programs folder in the start menu under Windows 10, Windows 7 and earlier, and switch to the “My Applications” tab in the window that opens. Click the small “down” arrow inside the “Start” button to the right of the DisplayCAL entry and choose “Update” or “Select version”.

      To select a specific software version, click on the “change” link next to an item, then click on the version entry and set the rating to “preferred” (note that this will prevent updates being downloaded for the selected software until you manually change to a different version or reset the rating).

Please continue with the Quickstart Guide.

Quickstart guide

This short guide intends to get you up and running quickly, but if you run into a problem, please refer to the full prerequisites and installation sections.

  1. Launch DisplayCAL. If it cannot find Argyll CMS on your computer, it will prompt you to automatically download the latest version or select the location manually.

  2. Windows only: If your measurement device is not a ColorMunki Display, i1 Display Pro, Huey, ColorHug, specbos or K-10, you need to install an Argyll-specific driver before continuing. Select “Install Argyll CMS instrument drivers...” from the “Tools” menu. See also “Instrument driver installation under Windows”.

    Mac OS X only: If you want to use the HCFR colorimeter, follow the instructions in the “HCFR Colorimeter” section under “Installing Argyll CMS on Mac OS X” in the Argyll CMS documentation before continuing.

    Connect your measurement device to your computer.

  3. Click the small icon with the swirling arrow in between the “Display device” and “Instrument” controls to detect connected display devices and instruments. The detected instrument(s) should show up in the “Instrument” dropdown.

    If your measurement device is a Spyder 2, a popup dialog will show which will let you enable the device. This is required to be able to use the Spyder 2 with Argyll CMS and DisplayCAL.

    If your measurement device is a i1 Display 2, i1 Display Pro, ColorMunki Display, DTP94, Spyder 2/3/4/5, a popup dialog will show and allow you to import generic colorimeter corrections from the vendor software which may help measurement accuracy on the type of display you're using. After importing, they are available under the “Correction” dropdown, where you can choose one that fits the type of display you have, or leave it at “Auto” if there is no match. Note: Importing from the Spyder 4/5 software enables additional measurement modes for that instrument.

  4. Click “Calibrate & profile”. That's it!

    Feel free to check out the Wiki for guides and tutorials, and refer to the documentation for advanced usage instructions (optional).

    Linux only: If you can't access your instrument, choose “Install Argyll CMS instrument configuration files...” from the “Tools” menu (if that menu item is grayed out, the Argyll CMS version you're currently using has probably been installed from the distribution's repository and should already be setup correctly for instrument access). If you still cannot access the instrument, try unplugging and reconnecting it, or a reboot. If all else fails, read “Installing Argyll CMS on Linux: Setting up instrument access” in the Argyll CMS documentation.

System requirements and other prerequisites

General system requirements

  • A recent Linux, Mac OS X (10.5 or newer) or Windows (XP/Server 2003 or newer) operating system.
  • A graphics card with at least 24 bits per pixel (true color) support and the desktop set up to use this color depth.

Argyll CMS

To use DisplayCAL, you need to download and install Argyll CMS (1.0 or newer).

Supported instruments

You need one of the supported instruments to make measurements. All instruments supported by Argyll CMS are also supported by DisplayCAL. For display readings, these currently are:

Colorimeters

  • CalMAN X2 (treated as i1 Display 2)
  • Datacolor/ColorVision Spyder 2
  • Datacolor Spyder 3 (since Argyll CMS 1.1.0)
  • Datacolor Spyder 4 (since Argyll CMS 1.3.6)
  • Datacolor Spyder 5 (since Argyll CMS 1.7.0)
  • HP Advanced Profiling Solution (treated as i1 Display 2)
  • HP DreamColor (treated as i1 Display 2)
  • Hughski ColorHug (Linux support since Argyll CMS 1.3.6, Windows support with newest ColorHug firmware since Argyll CMS 1.5.0, fully functional Mac OS X support since Argyll CMS 1.6.2)
  • Hughski ColorHug2 (new in Argyll CMS 1.7.0)
  • Image Engineering EX1 (new in Argyll CMS 1.8.0 Beta)
  • Klein K10-A (new in Argyll CMS 1.7.0)
  • Lacie Blue Eye (treated as i1 Display 2)
  • Sequel Imaging MonacoOPTIX (treated as i1 Display 1)
  • X-Rite ColorMunki Create (treated as i1 Display 2)
  • X-Rite ColorMunki Smile (since Argyll CMS 1.5.0)
  • X-Rite DTP92
  • X-Rite DTP94
  • X-Rite/GretagMacbeth/Pantone Huey
  • X-Rite/GretagMacbeth i1 Display 1
  • X-Rite/GretagMacbeth i1 Display 2/LT
  • X-Rite i1 Display Pro, ColorMunki Display (since Argyll CMS 1.3.4)

Spectrometers

  • JETI specbos 1211/1201 (since Argyll CMS 1.6.0)
  • X-Rite ColorMunki Design, ColorMunki Photo (since Argyll CMS 1.1.0)
  • X-Rite/GretagMacbeth i1 Monitor (since Argyll CMS 1.0.3)
  • X-Rite/GretagMacbeth i1 Pro
  • X-Rite i1 Pro 2 (since Argyll CMS 1.5.0)
  • X-Rite/GretagMacbeth Spectrolino

If you've decided to buy a color instrument because Argyll CMS supports it, please let the dealer and manufacturer know that “You bought it because Argyll CMS supports it”—thanks.

Note that the i1 Display Pro and i1 Pro are very different instruments despite their naming similarities.

Also there are currently (2014-05-20) five instruments (or rather, packages) under the ColorMunki brand, two of which are spectrometers, and three are colorimeters (not all of them being recent offerings, but you should be able to find them used in case they are no longer sold new):

  • The ColorMunki Design and ColorMunki Photo spectrometers differ only in the functionality of the bundled vendor software. There are no differences between the instruments when used with Argyll CMS and DisplayCAL.
  • The ColorMunki Display colorimeter is a less expensive version of the i1 Display Pro colorimeter. It comes bundled with a simpler vendor software and has longer measurement times compared to the i1 Display Pro. Apart from that, the instrument appears to be virtually identical.
  • The ColorMunki Create and ColorMunki Smile colorimeters are similar hardware as the i1 Display 2 (with the ColorMunki Smile no longer having a built-in correction for CRT but for white LED backlit LCD instead).

Additional requirements for unattended calibration and profiling

When using a spectrometer that is supported by the unattended feature (see below), having to take the instrument off the screen to do a sensor self-calibration again after display calibration before starting the measurements for profiling may be avoided if the menu item “Allow skipping of spectrometer self-calibration” in the “Options” menu is checked (colorimeter measurements are always unattended because they generally do not require a sensor calibration away from the screen, with the exception of the i1 Display 1).

Unattended calibration and profiling currently supports the following spectrometers in addition to most colorimeters:

  • X-Rite ColorMunki
  • X-Rite/GretagMacbeth i1 Monitor & Pro
  • X-Rite/GretagMacbeth Spectrolino
  • X-Rite i1 Pro 2

Be aware you may still be forced to do a sensor calibration if the instrument requires it. Also, please look at the possible caveats.

Additional requirements for using the source code

You can skip this section if you downloaded a package, installer, ZIP archive or disk image of DisplayCAL for your operating system and do not want to run from source.

All platforms:

  • Python >= v2.6 <= v2.7.x (2.7.x is the recommended version. Mac OS X users: If you want to compile DisplayCAL's C extension module, it is advisable to first install XCode and then the official python.org Python)
  • NumPy
  • wxPython GUI[4] toolkit

Windows:

Additional requirements for compiling the C extension module

Normally you can skip this section as the source code contains pre-compiled versions of the C extension module that DisplayCAL uses.

Linux:

  • GCC and development headers for Python + X11 + Xrandr + Xinerama + Xxf86vm if not already installed, they should be available through your distribution's packaging system

Mac OS X:

  • XCode
  • py2app if you want to build a standalone executable. On Mac OS X before 10.5, install setuptools first: sudo python util/ez_setup.py setuptools

Windows:

  • a C-compiler (e.g. MS Visual C++ Express or MinGW. If you're using the official python.org Python 2.6 or later I'd recommend Visual C++ Express as it works out of the box)
  • py2exe if you want to build a standalone executable

Running directly from source

After satisfying all additional requirements for using the source code, you can simply run any of the included .pyw files from a terminal, e.g. python2 DisplayCAL.pyw, or install the software so you can access it via your desktop's application menu with python2 setup.py install. Run python2 setup.py --help to view available options.

One-time setup instructions for source code checked out from SVN:

Run python2 setup.py to create the version file so you don't see the update popup at launch.

If the pre-compiled extension module that is included in the sources does not work for you (in that case you'll notice that the movable measurement window's size does not closely match the size of the borderless window generated by Argyll CMS during display measurements) or you want to re-build it unconditionally, run python2 setup.py build_ext -i to re-build it from scratch (you need to satisfy the requirements for compiling the C extension module first).

Installation

It is recommended to first remove all previous versions unless you used Zero Install to get them.

Instrument driver installation under Windows

You only need to install the Argyll-specific driver if your measurement device is not a ColorMunki Display, i1 Display Pro, Huey, ColorHug, specbos or K-10.

If you are using Windows 8, 8.1, or 10, you need to disable driver signature enforcement before you can install the driver. If Secure Boot is enabled in the UEFI[12] setup, you need to disable it first. Refer to your mainboard or firmware manual how to go about this. Usually entering the firmware setup requires holding the DEL key when the system starts booting.

Method 1: Disable driver signature enforcement temporarily

  1. Go to “Settings” (hover the lower right corner of the screen, then click the gear icon)
  2. Select “Power” (the on/off icon)
  3. Hold the SHIFT key down and click “Restart”.
  4. Select “Troubleshoot → “Advanced Options” → “Startup Settings” → “Restart”
  5. After reboot, select “Disable Driver Signature Enforcement” (number 7 on the list)

Method 2: Disable driver signature enforcement permanently

  1. Open an elevated command prompt. Search for “Command Prompt” in the Windows start menu, right-click and select “Run as administrator”
  2. Run the following command: bcdedit /set loadoptions DDISABLE_INTEGRITY_CHECKS
  3. Run the following command: bcdedit /set TESTSIGNING ON
  4. Reboot

To install the Argyll-specific driver that is needed to use some instruments, launch DisplayCAL and select “Install Argyll CMS instrument drivers...” from the “Tools” menu.

To switch between the Argyll CMS and vendor drivers, launch Windows' Device Manager and locate the instrument in the device list. It may be underneath one of the top level items. Right click on the instrument and select “Update Driver Software...”, then choose “Browse my computer for driver software”, “Let me pick from a list of device drivers on my computer” and finally select the Argyll driver for your instrument from the list.

Linux package (.deb/.rpm)

A lot of distributions allow easy installation of packages via the graphical desktop, i.e. by double-clicking the package file's icon. Please consult your distribution's documentation if you are unsure how to install packages.

If you cannot access your instrument, first try unplugging and reconnecting it, or a reboot. If that doesn't help, read “Installing Argyll CMS on Linux: Setting up instrument access”.

Linux Autopackage (.package)

Before installing the autopackage, first install wxPython (on some systems called python-wxGTK or python-wxWidgets) and NumPy using your system's package management software. To install the autopackage, follow these three steps (you only have to do it once, next time, you can just skip these steps and open the .package file directly):

  1. Click on the package with your right mouse button. Then click on the “Properties” menu item.
  2. Go to the “Permissions” tab.
    • Check the “Execute”, “Exec” or “Is Executable” checkbox. If there are more than one Execute/Exec checkboxes, check the top-most one.
    • Click “Close” or “OK”, depending on the dialog.
  3. If you already have the software installed from your distributions packages or from the source, remove it first. Then open the package file. If you are asked whether you want to display or run the package, choose “Run”.

The installation will now begin. Follow further intructions that are displayed, if any.

If you cannot access your instrument, first try unplugging and reconnecting it, or a reboot. If that doesn't help, read “Installing Argyll CMS on Linux: Setting up instrument access”.

Mac OS X

Mount the disk image and option-drag its icon to your “Applications” folder. Afterwards open the “DisplayCAL” folder in your “Applications” folder and drag DisplayCAL's icon to the dock if you want easy access.

If you want to use the HCFR colorimeter under Mac OS X, follow the instructions under “installing Argyll CMS on Mac OS X” in the Argyll CMS documentation.

Windows (Installer)

Launch the installer which will guide you trough the required setup steps.

If your measurement device is not a ColorMunki Display, i1 Display Pro, Huey, ColorHug, specbos or K-10, you need to install an Argyll-specific driver. See “Instrument driver installation under Windows”.

Windows (ZIP archive)

Unpack and then simply run DisplayCAL from the created folder.

If your measurement device is not a ColorMunki Display, i1 Display Pro, Huey, ColorHug, specbos or K-10, you need to install an Argyll-specific driver. See “Instrument driver installation under Windows”.

Source code (all platforms)

See the “Prerequisites” section to run directly from source.

Starting with DisplayCAL 0.2.5b, you can use standard distutils/setuptools commands with setup.py to build, install, and create packages. sudo python setup.py install will compile the extension modules and do a standard installation. Run python setup.py --help or python setup.py --help-commands for more information. A few additional commands and options which are not part of distutils or setuptools (and thus do not appear in the help) are also available:

Additional setup commands

0install
Create/update 0install feeds and create Mac OS X application bundles to run those feeds.
appdata
Create/update AppData file.
bdist_appdmg (Mac OS X only)
Creates a DMG of previously created (by the py2app or bdist_standalone commands) application bundles, or if used together with the 0install command.
bdist_deb (Linux/Debian-based)
Create an installable Debian (.deb) package, much like the standard distutils command bdist_rpm for RPM packages. Prerequisites: You first need to install alien and rpmdb, create a dummy RPM database via sudo rpmdb --initdb, then edit (or create from scratch) the setup.cfg (you can have a look at misc/setup.ubuntu9.cfg for a working example). Under Ubuntu, running utils/dist_ubuntu.sh will automatically use the correct setup.cfg. If you are using Ubuntu 11.04 or any other debian-based distribution which has Python 2.7 as default, you need to edit /usr/lib/python2.7/distutils/command/bdist_rpm.py, and change the line install_cmd = ('%s install -O1 --root=$RPM_BUILD_ROOT ' to install_cmd = ('%s install --root=$RPM_BUILD_ROOT ' by removing the -O1 flag. Also, you need to change /usr/lib/rpm/brp-compress to do nothing (e.g. change the file contents to exit 0, but don't forget to create a backup copy first) otherwise you will get errors when building.
bdist_lipa
Create a Listaller package.
bdist_pyi
An alternative to bdist_standalone, which uses PyInstaller instead of bbfreeze/py2app/py2exe.
bdist_standalone
Creates a standalone application that does not require a Python installation. Uses bbfreeze on Linux, py2app on Mac OS X and py2exe on Windows. setup.py will try and automatically download/install these packages for you if they are not yet installed and if not using the --use-distutils switch. Note: On Mac OS X, older versions of py2app (before 0.4) are not able to access files inside python “egg” files (which are basically ZIP-compressed folders). Setuptools, which is needed by py2app, will normally be installed in “egg” form, thus preventing those older py2app versions from accessing its contents. To fix this, you need to remove any installed setuptools-<version>-py<python-version>.egg files from your Python installation's site-packages directory (normally found under /Library/Frameworks/Python.framework/Versions/Current/lib). Then, run sudo python util/ez_setup.py -Z setuptools which will install setuptools unpacked, thus allowing py2app to acces all its files. This is no longer an issue with py2app 0.4 and later.
buildservice
Creates control files for openSUSE Build Service (also happens implicitly when invoking sdist).
finalize_msi (Windows only)
Adds icons and start menu shortcuts to the MSI installer previously created with bdist_msi. Successful MSI creation needs a patched msilib (additional information).
inno (Windows only)
Creates Inno Setup scripts which can be used to compile setup executables for standalone applications generated by the py2exe or bdist_standalone commands and for 0install.
purge
Removes the build and DisplayCAL.egg-info directories including their contents.
purge_dist
Removes the dist directory and its contents.
readme
Creates README.html by parsing misc/README.template.html and substituting placeholders like date and version numbers.
uninstall
Uninstalls the package. You can specify the same options as for the install command.

Additional setup options

--cfg=<name>
Use an alternate setup.cfg, e.g. tailored for a given Linux distribution. The original setup.cfg is backed up and restored afterwards. The alternate file must exist as misc/setup.<name>.cfg
-n, --dry-run
Don't actually do anything. Useful in combination with the uninstall command to see which files would be removed.
--skip-instrument-configuration-files
Skip installation of udev rules and hotplug scripts.
--skip-postinstall
Skip post-installation on Linux (an entry in the desktop menu will still be created, but may not become visible until logging out and back in or rebooting) and Windows (no shortcuts in the start menu will be created at all).
--stability=stable | testing | developer | buggy | insecure
Set the stability for the implementation that is added/updated via the 0install command.
--use-distutils
Force setup to use distutils (default) instead of setuptools. This is useful in combination with the bdist* commands, because it will avoid an artificial dependency on setuptools. This is actually a switch, use it once and the choice is remembered until you specify the --use-setuptools switch (see next paragraph).
--use-setuptools
Force setup to try and use setuptools instead of distutils. This is actually a switch, use it once and the choice is remembered until you specify the --use-distutils switch (see above).

Instrument-specific setup

If your measurement device is a i1 Display 2, i1 Display Pro, ColorMunki Display, DTP94, Spyder 2/3/4/5, you'll want to import the colorimeter corrections that are part of the vendor software packages, which can be used to better match the instrument to a particular type of display. Note: The full range of measurement modes for the Spyder 4/5 are also only available if they are imported from the Spyder 4/5 software.

Choose “Import colorimeter corrections from other display profiling software...” from DisplayCAL's “Tools” menu.

If your measurement device is a Spyder 2, you need to enable it to be able to use it with Argyll CMS and DisplayCAL. Choose “Enable Spyder 2 colorimeter...” from DisplayCAL's “Tools” menu.

Basic concept of display calibration and profiling

If you have previous experience, skip ahead. If you are new to display calibration, here is a quick outline of the basic concept.

First, the display behavior is measured and adjusted to meet user-definable target characteristics, like brightness, gamma and white point. This step is generally referred to as calibration. Calibration is done by adjusting the monitor controls, and the output of the graphics card (via calibration curves, also sometimes called video LUT[7] curves—please don't confuse these with LUT profiles, the differences are explained here) to get as close as possible to the chosen target.
To meet the user-defined target characteristics, it is generally advisable to get as far as possible by using the monitor controls, and only thereafter by manipulating the output of the video card via calibration curves, which are loaded into the video card gamma table, to get the best results.

Second, the calibrated displays response is measured and an ICC[5] profile describing it is created.

Optionally and for convenience purposes, the calibration is stored in the profile, but both still need to be used together to get correct results. This can lead to some ambiguity, because loading the calibration curves from the profile is generally the responsibility of a third party utility or the OS, while applications using the profile to do color transforms usually don't know or care about the calibration (they don't need to). Currently, the only OS that applies calibration curves out-of-the-box is Mac OS X (under Windows 7 or later you can enable it, but it's off by default and doesn't offer the same high precision as the DisplayCAL profile loader)—for other OS's, DisplayCAL takes care of creating an appropriate loader.

Even non-color-managed applications will benefit from a loaded calibration because it is stored in the graphics card—it is “global”. But the calibration alone will not yield accurate colors—only fully color-managed applications will make use of display profiles and the necessary color transforms.

Regrettably there are several image viewing and editing applications that only implement half-baked color management by not using the system's display profile (or any display profile at all), but an internal and often unchangeable “default” color space like sRGB, and sending output unaltered to the display after converting to that default colorspace. If the display's actual response is close to sRGB, you might get pleasing (albeit not accurate) results, but on displays which behave differently, for example wide-color-gamut displays, even mundane colors can get a strong tendency towards neon.

A note about colorimeters, displays and DisplayCAL

Colorimeters need a correction in hardware or software to obtain correct measurements from different types of displays (please also see “Wide Gamut Displays and Colorimeters” on the Argyll CMS website for more information). The latter is supported when using Argyll CMS >= 1.3.0, so if you own a display and colorimeter which has not been specifically tuned for this display (i.e. does not contain a correction in hardware), you can apply a correction that has been calculated from spectrometer measurements to help better measure such a screen.
You need a spectrometer in the first place to do the necessary measurements to create such a correction, or you may query DisplayCAL's Colorimeter Corrections Database, and there's also a list of contributed colorimeter correction files on the Argyll CMS websiteplease note though that a matrix created for one particular instrument/display combination may not work well for different instances of the same combination because of display manufacturing variations and generally low inter-instrument agreement of most older colorimeters (with the exception of the DTP94), newer devices like the i1 Display Pro/ColorMunki Display and possibly the Spyder 4/5 seem to be less affected by this.
Starting with DisplayCAL 0.6.8, you can also import generic corrections from some profiling softwares by choosing the corresponding item in the “Tools” menu.

If you buy a screen bundled with a colorimeter, the instrument may have been matched to the screen in some way already, so you may not need a software correction in that case.

Special note about the X-Rite i1 Display Pro, ColorMunki Display and Spyder 4/5 colorimeters

These instruments greatly reduce the amount of work needed to match them to a display because they contain the spectral sensitivities of their filters in hardware, so only a spectrometer reading of the display is needed to create the correction (in contrast to matching other colorimeters to a display, which needs two readings: One with a spectrometer and one with the colorimeter).
That means anyone with a particular screen and a spectrometer can create a special Colorimeter Calibration Spectral Set (.ccss) file of that screen for use with those colorimeters, without needing to actually have access to the colorimeter itself.

Usage

Through the main window, you can choose your settings. When running calibration measurements, another window will guide you through the interactive part of display adjustment.

Settings file

Here, you can load a preset, or a calibration (.cal) or ICC profile (.icc / .icm) file from a previous run. This will set options to those stored in the file. If the file contains only a subset of settings, the other options will automatically be reset to defaults (except the 3D LUT settings, which won't be reset if the settings file doesn't contain 3D LUT settings, and the verification settings which will never be reset automatically).

If a calibration file or profile is loaded in this way, its name will show up here to indicate that the settings reflect those in the file. Also, if a calibration is present it can be used as the base when “Just Profiling”.
The chosen settings file will stay selected as long as you do not change any of the calibration or profiling settings, with one exception: When a .cal file with the same base name as the settings file exists in the same directory, adjusting the quality and profiling controls will not cause unloading of the settings file. This allows you to use an existing calibration with new profiling settings for “Just Profiling”, or to update an existing calibration with different quality and/or profiling settings. If you change settings in other situations, the file will get unloaded (but current settings will be retained—unloading just happens to remind you that the settings no longer match those in the file), and current display profile's calibration curves will be restored (if present, otherwise they will reset to linear).

When a calibration file is selected, the “Update calibration” checkbox will become available, which takes less time than a calibration from scratch. If a ICC[5] profile is selected, and a calibration file with the same base name exists in the same directory, the profile will be updated with the new calibration. Ticking the “Update calibration” checkbox will gray out all options as well as the “Calibrate & profile” and “Just profile” buttons, only the quality level will be changeable.

Predefined settings (presets)

Starting with DisplayCAL v0.2.5b, predefined settings for several use cases are selectable in the settings dropdown. I strongly recommend to NOT view these presets as the solitary “correct” settings you absolutely should use unmodified if your use case matches their description. Rather view them as starting points, from where you can work towards your own, optimized (in terms of your requirements, hardware, surroundings, and personal preference) settings.

Why has a default gamma of 2.2 been chosen for some presets?

Many displays, be it CRT, LCD, Plasma or OLED, have a default response characteristic close to a gamma of approx. 2.2-2.4 (for CRTs, this is the actual native behaviour; and other technologies typically try to mimic CRTs). A target response curve for calibration that is reasonably close to the native response of a display should help to minimize calibration artifacts like banding, because the adjustments needed to the video card's gamma tables via calibration curves will not be as strong as if a target response farther away from the display's native response had been chosen.

Of course, you can and should change the calibration response curve to a value suitable for your own requirements. For example, you might have a display that offers hardware calibration or gamma controls, that has been internally calibrated/adjusted to a different response curve, or your display's response is simply not close to a gamma of 2.2 for other reasons. You can run “Report on uncalibrated display device” from the “Tools” menu to measure the approximated overall gamma among other info.

Tabs

The main user interface is divided into tabs, with each tab containing a sub-set of settings. Not all tabs may be available at any given time. Unavailable tabs will be grayed out.

Choosing the display to calibrate and the measurement device

After connecting the instrument, click the small icon with the swirling arrow in between the “Display device” and “Instrument” controls to detect connected display devices and instruments.

Choosing a display device

Directly connected displays will appear at the top of the list as entries in the form “Display Name/Model @ x, y, w, h” with x, y, w and h being virtual screen coordinates depending on resolution and DPI settings. Apart from those directly connected displays, a few additional options are also available:

Web @ localhost

Starts a standalone web server on your machine, which then allows a local or remote web browser to display the color test patches, e.g. to calibrate/profile a smartphone or tablet computer.

Note that if you use this method of displaying test patches, then colors will be displayed with 8 bit per component precision, and any screen-saver or power-saver will not be automatically disabled. You will also be at the mercy of any color management applied by the web browser, and may have to carefully review and configure such color management.

madVR

Causes test patches to be displayed using the madVR Test Pattern Generator (madTPG) application which comes with the madVR video renderer (only available for Windows, but you can connect via local network from Linux and Mac OS X). Note that while you can adjust the test pattern configuration controls in madTPG itself, you should not normally alter the “disable videoLUT” and “disable 3D LUT” controls, as these will be set appropriately automatically when doing measurements.

Note that if you want to create a 3D LUT for use with madVR, there is a “Video 3D LUT for madVR” preset available under “Settings” that will not only configure DisplayCAL to use madTPG, but also setup the correct 3D LUT format and encoding for madVR.

Prisma

The Q, Inc./Murideo Prisma is a video processor and combined pattern generator/3D LUT holder accessible over the network.

Note that if you want to create a 3D LUT for use with a Prisma, there is a “Video 3D LUT for Prisma” preset available under “Settings” that will not only configure DisplayCAL to use a Prisma, but also setup the correct 3D LUT format and encoding.

Also note that the Prisma has 1 MB of internal memory for custom LUT storage, which is enough for around 15 17x17x17 LUTs. You may occasionally need to enter the Prisma's administrative interface via a web browser to delete old LUTs to make space for new ones.

Resolve

Allows you to use the built-in pattern generator of DaVinci Resolve video editing and grading software, which is accessible over the network or on the local machine. The way this works is that you start a calibration or profiling run in DisplayCAL, position the measurement window and click “Start measurement”. A message “Waiting for connection on IP:PORT” should appear. Note the IP and port numbers. In Resolve, switch to the “Color” tab and then choose “Monitor calibration”, “CalMAN” in the “Color” menu (Resolve version 11 and earlier) or the “Workspace” menu (Resolve 12).
Enter the IP address in the window that opens (port should already be filled) and click “Connect” (if Resolve is running on the same machine as DisplayCAL, enter localhost or 127.0.0.1 instead). The position of the measurement window you placed earlier will be mimicked on the display you have connected via Resolve.

Note that if you want to create a 3D LUT for use with Resolve, there is a “Video 3D LUT for Resolve” preset available under “Settings” that will not only configure DisplayCAL to use Resolve, but also setup the correct 3D LUT format and encoding.

Note that if you want to create a 3D LUT for a display that is directly connected (e.g. for Resolve's GUI viewer), you should not use the Resolve pattern generator, and select the actual display device instead which will allow for quicker measurements (Resolve's pattern generator has additional delay).

Untethered

See untethered display measurements. Please note that the untethered mode should generally only be used if you've exhausted all other options.

Choosing a measurement mode

Some instruments may support different measurement modes for different types of display devices. In general, there are three base measurement modes: “LCD”, “Refresh” (e.g. CRT and Plasma are refresh-type displays) and “Projector” (the latter is only available if supported by the instrument). Some instruments like the Spyder 4/5 and ColorHug support additional measurement modes, where a mode is coupled with a predefined colorimeter correction (in that case, the colorimeter correction dropdown will automatically be set to “None”).
Variations of these measurement modes may be available depending on the instrument: “Adaptive” measurement mode for spectrometers uses varying integration times (always used by colorimeters) to increase accuracy of dark readings. “HiRes” turns on high resolution spectral mode for spectrometers like the i1 Pro, which may increase the accuracy of measurements.

Drift compensation during measurements (only available if using Argyll CMS >= 1.3.0)

White level drift compensation tries to counter luminance changes of a warming up display device. For this purpose, a white test patch is measured periodically, which increases the overall time needed for measurements.

Black level drift compensation tries to counter measurement deviations caused by black calibration drift of a warming up measurement device. For this purpose, a black test patch is measured periodically, which increases the overall time needed for measurements. Many colorimeters are temperature stabilised, in which case black level drift compensation should not be needed, but spectrometers like the i1 Pro or ColorMunki Design/Photo are not temperature compensated.

Override display update delay (only available if using Argyll CMS >= 1.5.0, only visible if “Show advanced options” in the “Options” menu is enabled)

Normally a delay of 200 msec is allowed between changing a patch color in software, and that change appearing in the displayed color itself. For some instuments (i.e. i1d3, i1pro, ColorMunki, Klein K10-A) ArgyllCMS will automatically measure and set an appropriate update delay during instrument calibration. In rare situations this delay may not be sufficient (ie. some TV's with extensive image processing features turned on), and a larger delay can be set here.

Override display settle time multiplier (only available if using Argyll CMS >= 1.7.0, only visible if “Show advanced options” in the “Options” menu is enabled)

Normally the display technology type determines how long is allowed between when a patch color change appears on the display, and when that change has settled down, and as actually complete within measurement tolerance. A CRT or Plasma display for instance, can have quite a long settling delay due to the decay characteristics of the phosphor used, while an LCD can also have a noticeable settling delay due to the liquid crystal response time and any response time enhancement circuit (instruments without a display technology type selection such as spectrometers assume a worst case).
The display settle time multiplier allows the rise and fall times of the model to be scaled to extend or reduce the settling time. For instance, a multiplier of 2.0 would double the settling time, while a multiplier of 0.5 would halve it.

Choosing a colorimeter correction for a particular display

This can improve a colorimeters accuracy for a particular type of display, please also see “A note about colorimeters, displays and DisplayCAL”. You can import generic matrices from some other display profiling softwares as well as check the online Colorimeter Corrections Database for a match of your display/instrument combination (click the small globe next to the correction dropdown)—please note though that all colorimeter corrections in the online database have been contributed by various users, and their usefulness to your particular situation is up to you to evaluate: They may or may not improve the absolute accuracy of your colorimeter with your display. A list of contributed correction matrices can also be found on the Argyll CMS website.

Please note this option is only available if using Argyll CMS >= 1.3.0 and a colorimeter.

Calibration settings

Interactive display adjustment
Turning this off skips straight to calibration or profiling measurements instead of giving you the opportunity to alter the display's controls first. You will normally want to keep this checked, to be able to use the controls to get closer to the chosen target characteristics.
Observer

To see this setting, you need to have an instrument that supports spectral readings (i.e. a spectrometer) or spectral sample calibration (e.g. i1 DisplayPro, ColorMunki Display and Spyder4/5), and go into the “Options” menu, and enable “Show advanced options”.

This can be used to select a different colorimetric observer, also known as color matching function (CMF), for instruments that support it. The default is the CIE 1931 standard 2° observer.

Note that if you select anything other than the default 1931 2 degree observer, then the Y values will not be cd/m², due to the Y curve not being the CIE 1924 photopic V(λ) luminosity function.

White point

Allows setting the target white point locus to the equivalent of a daylight or black body spectrum of the given temperature in degrees Kelvin, or as chromaticity co-ordinates. By default the white point target will be the native white of the display, and it's color temperature and delta E to the daylight spectrum locus will be shown during monitor adjustment, and adjustments will be recommended to put the display white point directly on the Daylight locus. If a daylight color temperature is given, then this will become the target of the adjustment, and the recommended adjustments will be those needed to make the monitor white point meet the target. Typical values might be 5000 for matching printed output, or 6500, which gives a brighter, bluer look. A white point temperature different to that native to the display may limit the maximum brightness possible.

If you want to find out the current uncalibrated whitepoint of your display, you can run “Report on uncalibrated display device” from the “Tools” menu to measure it.

If you want to adjust the whitepoint to the chromaticities of your ambient lighting, or those of a viewing booth as used in prepress and photography, and your measurement device has ambient measuring capability (e.g. like the i1 Pro or i1 Display with their respective ambient measurement heads), you can use the “Measure” button next to the whitepoint settings. If you want to measure ambient lighting, place the instrument upwards, beside the display. Or if you want to measure a viewing booth, put a metamerism-free gray card inside the booth and point the instrument towards it. Further instructions how to measure ambient may be available in your instrument's documentation.

White level

Set the target brightness of white in cd/m2. If this number cannot be reached, the brightest output possible is chosen, consistent with matching the white point target. Note that many of the instruments are not particularly accurate when assessing the absolute display brightness in cd/m2. Note that some LCD screens behave a little strangely near their absolute white point, and may therefore exhibit odd behavior at values just below white. It may be advisable in such cases to set a brightness slightly less than the maximum such a display is capable of.

If you want to find out the current uncalibrated white level of your display, you can run “Report on uncalibrated display device” from the “Tools” menu to measure it.

Black level

(To see this setting, go into the “Options” menu, and enable “Show advanced options”)

Can be used to set the target brightness of black in cd/m2 and is useful for e.g. matching two different screens with different native blacks to one another, by measuring the black levels on both (i.e. in the “Tools” menu, choose “Report on uncalibrated display”) and then entering the highest measured value. Normally you may want to use native black level though, to maximize contrast ratio. Setting too high a value may also give strange results as it interacts with trying to achieve the target “advertised” tone curve shape. Using a black output offset of 100% tries to minimize such problems.

Tone curve / gamma

The target response curve is normally an exponential curve (output = inputgamma), and defaults to 2.2 (which is close to a typical CRT displays real response). Four pre-defined curves can be used as well: the sRGB colorspace response curve, which is an exponent curve with a straight segment at the dark end and an overall response of approximately gamma 2.2, the L* curve, which is the response of the CIE L*a*b* perceptual colorspace, the Rec. 709 video standard response curve and the SMPTE 240M video standard response curve.
Another possible choice is “As measured”, which will skip video card gamma table (1D LUT) calibration.

Note that a real display usually can't reproduce any of the ideal pre-defined curves, since it will have a non-zero black point, whereas all the ideal curves assume zero light at zero input.

For gamma values, you can also specify wheter it should be interpreted relative, meaning the gamma value provided is used to set an actual response curve in light of the non-zero black of the actual display that has the same relative output at 50% input as the ideal gamma power curve, or absolute, which allows the actual power to be specified instead, meaning that after the actual displays non-zero black is accounted for, the response at 50% input will probably not match that of the ideal power curve with that gamma value (to see this setting, you have to go into the “Options” menu, and enable “Show advanced options”).

To allow for the non-zero black level of a real display, by default the target curve values will be offset so that zero input gives the actual black level of the display (output offset). This ensures that the target curve better corresponds to the typical natural behavior of displays, but it may not be the most visually even progression from display minimum. This behavior can be changed using the black output offset option (see further below).

Also note that many color spaces are encoded with, and labelled as having a gamma of approximately 2.2 (ie. sRGB, REC 709, SMPTE 240M, Macintosh OS X 10.6), but are actually intended to be displayed on a display with a typical CRT gamma of 2.4 viewed in a darkened environment.
This is because this 2.2 gamma is a source gamma encoding in bright viewing conditions such as a television studio, while typical display viewing conditions are quite dark by comparison, and a contrast expansion of (approx.) gamma 1.1 is desirable to make the images look as intended.
So if you are displaying images encoded to the sRGB standard, or displaying video through the calibration, just setting the gamma curve to sRGB or REC 709 (respectively) is probably not what you want! What you probably want to do, is to set the gamma curve to about gamma 2.4, so that the contrast range is expanded appropriately, or alternatively use sRGB or REC 709 or a gamma of 2.2 but also specify the actual ambient viewing conditions via a light level in Lux, so that an appropriate contrast enhancement can be made during calibration. If your instrument is capable of measuring ambient light levels, then you can do so.
(For in-depth technical information about sRGB, see “A Standard Default Color Space for the Internet: sRGB” at the ICC[5] website for details of how it is intended to be used)

If you're wondering what gamma value you should use, you can run “Report on uncalibrated display device” from the “Tools” menu to measure the approximated overall gamma among other info. Setting the gamma to the reported value can then help to reduce calibration artifacts like banding, because the adjustments needed for the video card's gamma table should not be as strong as if a gamma further away from the display's native response was chosen.

Ambient light level

(To see this setting, go into the “Options” menu, and enable “Show advanced options”)

As explained for the tone curve settings, often colors are encoded in a situation with viewing conditions that are quite different to the viewing conditions of a typical display, with the expectation that this difference in viewing conditions will be allowed for in the way the display is calibrated. The ambient light level option is a way of doing this. By default calibration will not make any allowances for viewing conditions, but will calibrate to the specified response curve, but if the ambient light level is entered or measured, an appropriate viewing conditions adjustment will be performed. For a gamma value or sRGB, the original viewing conditions will be assumed to be that of the sRGB standard viewing conditions, while for REC 709 and SMPTE 240M they will be assumed to be television studio viewing conditions.
By specifying or measuring the ambient lighting for your display, a viewing conditions adjustment based on the CIECAM02 color appearance model will be made for the brightness of your display and the contrast it makes with your ambient light levels.

Please note your measurement device needs ambient measuring capability (e.g. like the i1 Pro or i1 Display with their respective ambient measurement heads) to measure the ambient light level.

Black output offset

(To see this setting, go into the “Options” menu, and enable “Show advanced options”)

Real displays do not have a zero black response, while all the target response curves do, so this has to be allowed for in some way.

The default way of handling this (equivalent to 100% black output offset) is to allow for this at the output of the ideal response curve, by offsetting and scaling the output values. This defined a curve that will match the responses that many other systems provide and may be a better match to the natural response of the display, but will give a less visually even response from black.

The other alternative is to offset and scale the input values into the ideal response curve so that zero input gives the actual non-zero display response. This ensures the most visually even progression from display minimum, but might be hard to achieve since it is different to the natural response of a display.

A subtlety is to provide a split between how much of the offset is accounted for as input to the ideal response curve, and how much is accounted for at the output, where the degree is 0.0 accounts for it all as input offset, and 100% accounts for all of it as output offset.

Black point correction

(To see this setting, go into the “Options” menu, and enable “Show advanced options”)

Normally dispcal will attempt to make all colors down the neutral axis (R=G=B) have the same hue as the chosen white point. Near the black point, red, green or blue can only be added, not subtracted from zero, so the process of making the near black colors have the desired hue, will lighten them to some extent. For a device with a good contrast ratio or a black point that has nearly the same hue as the white, this is not a problem. If the device contrast ratio is not so good, and the black hue is noticeably different to that of the chosen white point (which is often the case for LCD type displays), this could have a noticeably detrimental effect on an already limited contrast ratio. Here the amount of black point hue correction can be controlled.
By default a factor of 100% will be used, which is usually good for “Refresh”-type displays like CRT or Plasma and also by default a factor of 0% is used for LCD type displays, but you can override these with a custom value between 0% (no correction) to 100% (full correction), or enable automatically setting it based on the measured black level of the display.

If less than full correction is chosen, then the resulting calibration curves will have the target white point down most of the curve, but will then cross over to the native or compromise black point.

Black point correction rate (only available if using Argyll CMS >= 1.0.4)

(To see this setting, go into the “Options” menu, and enable “Show advanced options”)

If the black point is not being set completely to the same hue as the white point (ie. because the factor is less than 100%), then the resulting calibration curves will have the target white point down most of the curve, but will then blend over to the native or compromise black point that is blacker, but not of the right hue. The rate of this blend can be controlled. The default value is 4.0, which results in a target that switches from the white point target to the black, moderately close to the black point. While this typically gives a good visual result with the target neutral hue being maintained to the point where the crossover to the black hue is not visible, it may be asking too much of some displays (typically LCD type displays), and there may be some visual effects due to inconsistent color with viewing angle. For this situation a smaller value may give a better visual result (e.g. try values of 3.0 or 2.0. A value of 1.0 will set a pure linear blend from white point to black point). If there is too much coloration near black, try a larger value, e.g. 6.0 or 8.0.

Calibration speed

(This setting will not apply and be hidden when the tone curve is set to “As measured”)

Determines how much time and effort to go to in calibrating the display. The lower the speed, the more test readings will be done, the more refinement passes will be done, the tighter will be the accuracy tolerance, and the more detailed will be the calibration of the display. The result will ultimately be limited by the accuracy of the instrument, the repeatability of the display and instrument, and the resolution of the video card gamma table entries and digital or analogue output (RAMDAC).

Profiling settings

Profile quality
Sets the level of effort and/or detail in the resulting profile. For table based profiles (LUT[7]), it sets the main lookup table size, and hence quality in the resulting profile. For matrix profiles it sets the per channel curve detail level and fitting “effort”.
Black point compensation (enable “Show advanced options” in the “Options” menu)

(Note: This option has no effect if just calibrating and creating a simple curves + matrix profile directly from the calibration data without additional profiling measurements)

This effectively prevents black crush when using the profile, but at the expense of accuracy. It is generally best to only use this option when it is not certain that the applications you are going to use have a high quality color management implementation. For LUT profiles, more sophisticated options exist (i.e. advanced gamut mapping options and use either “Enhance effective resolution of colorimetric PCS[11]-to-device tables”, which is enabled by default, or “Gamut mapping for perceptual intent”, which can be used to create a perceptual table that maps the black point).

Profile type (enable “Show advanced options” in the “Options” menu)

Generally you can differentiate between two types of profiles: LUT[7] based and matrix based.

Matrix based profiles are smaller in filesize, somewhat less accurate (though in most cases smoother) compared to LUT[7] based types, and usually have the best compatibility across CMM[2]s, applications and systems — but only support the colorimetric intent for color transforms. For matrix based profiles, the PCS[11] is always XYZ. You can choose between using individual curves for each channel (red, green and blue), a single curve for all channels, individual gamma values for each channel or a single gamma for all channels. Curves are more accurate than gamma values. A single curve or gamma can be used if individual curves or gamma values degrade the gray balance of an otherwise good calibration.

LUT[7] based profiles are larger in filesize, more accurate (but may sacrifice smoothness), in some cases less compatible (applications might not be able to use or show bugs/quirks with LUT[7] type profiles, or certain variations of them). When choosing a LUT[7] based profile type, advanced gamut mapping options become available which you can use to create perceptual and/or saturation tables inside the profile in addition to the default colorimetric tables which are always created.
L*a*b* or XYZ can be used as PCS[11], with XYZ being recommended especially for wide-gamut displays bacause their primaries might exceed the ICC[5] L*a*b* encoding range (Note: Under Windows, XYZ LUT[7] types are only available in DisplayCAL if using Argyll CMS >= 1.1.0 because of a requirement for matrix tags in the profile, which are not created by prior Argyll CMS versions).
As it is hard to verify if the LUT[7] of an combined XYZ LUT[7] + matrix profile is actually used, you may choose to create a profile with a swapped matrix, ie. blue-red-green instead of red-green-blue, so it will be obvious if an application uses the (deliberately wrong) matrix instead of the (correct) LUT because the colors will look very wrong (e.g. everything that should be red will be blue, green will be red, blue will be green, yellow will be purple etc).

Note: LUT[7]-based profiles (which contain three-dimensional LUTs) might be confused with video card LUT[7] (calibration) curves (one-dimensional LUTs), but they're two different things. Both LUT[7]-based and matrix-based profiles may include calibration curves which can be loaded into a video card's gamma table hardware.

Advanced gamut mapping options (enable “Show advanced options” in the “Options” menu)

You can choose any of the following options after selecting a LUT profile type and clicking “Advanced...”. Note: The options “Low quality PCS[11]-to-device tables” and “Enhance effective resolution of colorimetric PCS[11]-to-device table” are mutually exclusive.

Low quality PCS[11]-to-device tables

Choose this option if the profile is only going to be used with inverse device-to-PCS[11] gamut mapping to create a DeviceLink or 3D LUT (DisplayCAL always uses inverse device-to-PCS[11] gamut mapping when creating a DeviceLink/3D LUT). This will reduce the processing time needed to create the PCS[11]-to-device tables. Don't choose this option if you want to install or otherwise use the profile.

Enhance effective resolution of colorimetric PCS[11]-to-device table

To use this option, you have to select a XYZ or L*a*b* LUT profile type (XYZ will be more effective). This option increases the effective resolution of the PCS[11] to device colorimetric color lookup table by using a matrix to limit the XYZ space and fill the whole grid with the values obtained by inverting the device-to-PCS[11] table, as well as optionally applies smoothing. If no CIECAM02 gamut mapping has been enabled for the perceptual intent, a simple but effective perceptual table (which is almost identical to the colorimetric table, but maps the black point to zero) will also be generated.

You can also set the interpolated lookup table size. The default “Auto” will use a base 33x33x33 resulution that is increased if needed and provide a good balance between smoothness and accuracy. Lowering the resolution can increase smoothness (at the potential expense of some accuracy), while increasing resolution may make the resulting profile potentially more accurate (at the expense of some smoothness). Note that computation will need a lot of memory (>= 4 GB of RAM recommended to prevent swapping to harddisk) especially at higher resolutions.

See below example images for the result you can expect, where the original image has been converted from sRGB to the display profile. Note though that the particular synthetic image chosen, a “granger rainbow”, exaggerates banding, real-world material is much less likely to show this. Also note that the sRGB blue in the image is actually out of gamut for the specific display used, and the edges visible in the blue gradient for the rendering are a result of the color being out of gamut, and the gamut mapping thus hitting the less smooth gamut boundaries.

Original Granger Rainbow image

Original “granger rainbow” image

Granger Rainbow - default colorimetric rendering

Default colorimetric rendering (2500 OFPS XYZ LUT profile)

Granger Rainbow - “smooth” colorimetric rendering

“Smooth” colorimetric rendering (2500 OFPS XYZ LUT profile, inverted A2B)

Granger Rainbow - “smooth” perceptual rendering

“Smooth” perceptual rendering (2500 OFPS XYZ LUT profile, inverted A2B)

Default rendering intent for profile

Sets the default rendering intent. In theory applications could use this, in practice they don't, so changing this setting probably won't have any effect whatsoever.

CIECAM02 gamut mapping

Note: When enabling one of the CIECAM02 gamut mapping options, and the source profile is a matrix profile, then enabling effective resolution enhancement will also influence the CIECAM02 gamut mapping, making it smoother, more accurate and also generated faster as a side-effect.

Normally, profiles created by DisplayCAL only incorporate the colorimetric rendering intent, which means colors outside the display's gamut will be clipped to the next in-gamut color. LUT-type profiles can also have gamut mapping by implementing perceptual and/or saturation rendering intents (gamut compression/expansion). You can choose if and which of those you want by specifying a source profile and marking the appropriate checkboxes. Note that a input, output, display or device colororspace profile should be specified as source, not a non-device colorspace, device link, abstract or named color profile. You can also choose viewing conditions which describe the intended use of both the source and the display profile that is to be generated. An appropriate source viewing condition is chosen automatically based on the source profile type.

An explanation of the available rendering intents can be found in the 3D LUT section “Rendering intent”.

For more information on why a source gamut is needed, see “About ICC profiles and Gamut Mapping” in the Argyll CMS documentation.

One strategy for getting the best perceptual results with display profiles is as follows: Select a CMYK profile as source for gamut mapping. Then, when converting from another RGB profile to the display profile, use relative colorimetric intent, and if converting from a CMYK profile, use the perceptual intent.
Another approach which especially helps limited-gamut displays is to choose one of the larger (gamut-wise) source profiles you usually work with for gamut mapping, and then always use perceptual intent when converting to the display profile.

Please note that not all applications support setting a rendering intent for display profiles and might default to colorimetric (e.g. Photoshop normally uses relative colorimetric with black point compensation, but can use different intents via custom soft proofing settings).

Testchart file
You can choose the test patches used when profiling the display here. The default “Auto” optimized setting takes the actual display characteristics into account. You can further increase potential profile accuracy by increasing the number of patches using the slider.
Testchart editor

The provided default testcharts should work well in most situations, but allowing you to create custom charts ensures maximum flexibility when characterizing a display and can improve profiling accuracy and efficiency. See also optimizing testcharts.

Testchart generation options

You can enter the amount of patches to be generated for each patch type (white, black, gray, single channel, iterative and multidimensional cube steps). The iterative algorythm can be tuned if more than zero patches are to be generated. What follows is a quick description of the several available iterative algorythms, with “device space” meaning in this case RGB coordinates, and “perceptual space” meaning the (assumed) XYZ numbers of those RGB coordinates. The assumed XYZ numbers can be influenced by providing a previous profile, thus allowing optimized test point placement.

  • Optimized Farthest Point Sampling (OFPS) will optimize the point locations to minimize the distance from any point in device space to the nearest sample point
  • Incremental Far Point Distribution incrementally searches for test points that are as far away as possible from any existing points
  • Device space random chooses test points with an even random distribution in device space
  • Perceptual space random chooses test points with an even random distribution in perceptual space
  • Device space filling quasi-random chooses test points with a quasi-random, space filling distribution in device space
  • Perceptual space filling quasi-random chooses test points with a quasi-random, space filling distribution in perceptual space
  • Device space body centered cubic grid chooses test points with body centered cubic distribution in device space
  • Perceptual space body centered cubic grid chooses test points with body centered cubic distribution in perceptual space

You can set the degree of adaptation to the known device characteristics used by the default full spread OFPS algorithm. A preconditioning profile should be provided if adaptation is set above a low level. By default the adaptation is 10% (low), and should be set to 100% (maximum) if a profile is provided. But, if for instance, the preconditioning profile doesn't represent the device behavior very well, a lower adaption than 100% might be appropriate.

For the body centered grid distributions, the angle parameter sets the overall angle that the grid distribution has.

The “Gamma” parameter sets a power-like (to avoid the excessive compression that a real power function would apply) value applied to all of the device values after they are generated. A value greater than 1.0 will cause a tighter spacing of test values near device value 0.0, while a value less than 1.0 will cause a tighter spacing near device value 1.0. Note that the device model used to create the expected patch values will not take into account the applied power, nor will the more complex full spread algorithms correctly take into account the power.

The neutral axis emphasis parameter allows changing the degree to which the patch distribution should emphasise the neutral axis. Since the neutral axis is regarded as the most visually critical area of the color space, it can help maximize the quality of the resulting profile to place more measurement patches in this region. This emphasis is only effective for perceptual patch distributions, and for the default OFPS distribution if the adaptation parameter is set to a high value. It is also most effective when a preconditioning profile is provided, since this is the only way that neutral can be determined. The default value of 50% provides an effect about twice the emphasis of the CIE94 Delta E formula.

The dark region emphasis parameter allows changing the degree to which the patch distribution should emphasis dark region of the device response. Display devices used for video or film reproduction are typically viewed in dark viewing environments with no strong white reference, and typically employ a range of brightness levels in different scenes. This often means that the devices dark region response is of particular importance, so increasing the relative number of sample points in the dark region may improve the balance of accuracy of the resulting profile for video or film reproduction. This emphasis is only effective for perceptual patch distributions where a preconditioning profile is provided. The default value of 0% provides no emphasis of the dark regions. A value somewhere around 15% - 30% is a good place to start for video profile use. A scaled down version of this parameter will be passed on to the profiler. Note that increasing the proportion of dark patches will typically lengthen the time that an instrument takes to read the whole chart. Emphasizing the dark region characterization will reduce the accuracy of measuring and modelling the lighter regions, given a fixed number of test points and profile quality/grid resolution. The parameter will also be used in an analogous way to the “Gamma” value in changing the distribution of single channel, grayscale and multidimensional steps.

The “Limit samples to sphere” option is used to define an L*a*b* sphere to filter the test points through. Only test points within the sphere (defined by it's center and radius) will be in the generated testchart. This can be good for targeting supplemental test points at a troublesome area of a device. The accuracy of the L*a*b* target will be best when a reasonably accurate preconditioning profile for the device is chosen. Note that the actual number of points generated can be hard to predict, and will depend on the type of generation used. If the OFPS, device and perceptual space random and device space filling quasi-random methods are used, then the target number of points will be achieved. All other means of generating points will generate a smaller number of test points than expected. For this reason, the device space filling quasi-random method is probably the easiest to use.

Generating diagnostic 3D views of testcharts

You can generate 3D views in several formats. The default HTML format should be viewable in a modern WebGL-enabled browser. You can choose the colorspace(s) you want to view the results in and also control whether to use RGB black offset (which will lighten up dark colors so they are better visible) and whether you want white to be neutral. All of these options are purely visual and will not influence the actual test patches.

Other functions

If generating any number of iterative patches as well as single channel, gray or multidimensional patches, you can add the single channel, gray and multidimensional patches in a separate step by holding the shift key while clicking on “Create testchart”. This prevents those patches affecting the iterative patch distribution, with the drawback of making the patch distribution less even. This is an experimental feature.

You are also able to:

  • Export patches as CSV, TIFF, PNG or DPX files, and set how often each patch should be repeated when exporting as images after you click the “Export” button (black patches will be repeated according to the “Max” value, and white patches according to the “Min” value, and patches in between according to their lightness in L* scaled to a value between “Min” and “Max”).
  • Add saturation sweeps which are often used in a video or film context to check color saturation. A preconditioning profile needs to be used to enable this.
  • Add reference patches from measurement files in CGATS format, from named color ICC profiles, or by analyzing TIFF, JPEG or PNG images. A preconditioning profile needs to be used to enable this.
  • Sort patches by various color criteria (warning: this will interfere with the Argyll CMS 1.6.0 or newer patch order optimisation which minimizes measurement times, so manual sorting should only be used for visual inspection of testcharts, or if required to optimize the patch order for untethered measurements in automatic mode where it is useful to maximize the lightness difference from patch to patch so the automatism has an easier time detecting changes).

Patch editor

Controls for the spreadsheet-like patch editor are as follows:

  • To select patches, click and drag the mouse over table cells, or hold SHIFT (select range) or CTRL/CMD (add/remove single cells/rows to/from selection)
  • To add a patch below an existing one, double-click a row label
  • To delete patches, select them, then hold CTRL (Linux, Windows) or CMD (Mac OS X) and hit DEL or BACKSPACE (will always delete whole rows even if only single cells are selected)
  • CTRL-C/CTRL-V/CTRL-A = copy/paste/select all

If you want to insert a certain amount of patches generated in a spreadsheet application (as RGB coordinates in the range 0.0-100.0 per channel), the easiest way to do this is to save them as CSV file and drag & drop it on the testchart editor window to import it.

Profile name

As long as you do not enter your own text here, the profile name is auto generated from the chosen calibration and profiling options. The current auto naming mechanism creates quite verbose names which are not necessarily nice to read, but they can help in identifying the profile.
Also note that the profile name is not only used for the resulting profile, but for all intermediate files as well (filename extensions are added automatically) and all files are stored in a folder of that name. You can choose where this folder is created by clicking the disk icon next to the field (it defaults to your system's default location for user data).

Here's an example under Linux, on other platforms some file extensions and the location of the home directory will differ. See User data and configuration file locations. You can mouse over the filenames to get a tooltip with a short description what the file is for:

Chosen profile save path: ~/.local/share/DisplayCAL/storage

Profile name: mydisplay

The following folder will be created: ~/.local/share/DisplayCAL/storage/mydisplay

During calibration & profiling the following files will be created:

~/.local/share/DisplayCAL/storage/mydisplay/mydisplay vs ClayRGB1998.log
~/.local/share/DisplayCAL/storage/mydisplay/mydisplay vs ClayRGB1998.wrz
~/.local/share/DisplayCAL/storage/mydisplay/mydisplay vs sRGB.log
~/.local/share/DisplayCAL/storage/mydisplay/mydisplay vs sRGB.wrz
~/.local/share/DisplayCAL/storage/mydisplay/mydisplay.cal
~/.local/share/DisplayCAL/storage/mydisplay/mydisplay.gam.gz
~/.local/share/DisplayCAL/storage/mydisplay/mydisplay.icc
~/.local/share/DisplayCAL/storage/mydisplay/mydisplay.log
~/.local/share/DisplayCAL/storage/mydisplay/mydisplay.ti1
~/.local/share/DisplayCAL/storage/mydisplay/mydisplay.ti3
~/.local/share/DisplayCAL/storage/mydisplay/mydisplay.wrz

Any used colorimeter correction file will also be copied to the profile folder.

Calibrating / profiling

If you are unclear about the difference between calibration and profiling (also called characterization), see “Calibration vs. Characterization” in the Argyll CMS documentation.

Please let the screen stabilize for at least half an hour after powering it up before doing any measurements or assessing its color properties. The screen can be used normally with other applications during that time.

After you have set your options, click on the button at the bottom to start the actual calibration/profiling process. The main window will hide during measurements, and should pop up again after they are completed (or after an error). You can always cancel out of running measurements using the “Cancel” button in the progress dialog, or by pressing ESC or Q. Viewing the informational log window (from the “Tools” menu) after measurements will give you access to the raw output of the Argyll CMS commandline tools and other verbose information.

Adjusting a display before calibration

If you clicked “Calibrate” or “Calibrate & profile” and have not turned off “Interactive display adjustment”, you will be presented with the interactive display adjustment window which contains several options to help you bring a display's characteristics closer to the chosen target values. Depending on wheter you have a “Refresh”- or LCD-type display, I will try to give some recommendations here which options to adjust, and which to skip.

Adjusting a LCD display

For LCD displays, you will in most cases only want to adjust white point (if the screen has RGB gain or other whitepoint controls) and white level (with the white level also affecting the black level unless you have a local dimming LED model), as many LCDs lack the necessary “offset” controls to adjust the black point (and even if they happen to have them, they often change the overall color temperature, not only the black point). Also note that for most LCD screens, you should leave the “contrast” control at (factory) default.

White point
If your screen has RGB gain, colortemperature or other whitepoint controls, the first step should be adjusting the whitepoint. Note that you may also benefit from this adjustment if you have set the target whitepoint to “native”, as it will allow you to bring it closer to the daylight or blackbody locus, which can help the human visual system to better adapt to the whitepoint. Look at the bars shown during the measurements to adjust RGB gains and minimize the delta E to the target whitepoint.
White level
Continue with the white level adjustment. If you have set a target white level, you may reduce or increase the brightness of your screen (ideally using only the backlight) until the desired value is reached (i.e. the bar ends at the marked center position). If you haven't set a target, simply adjust the screen to a visually pleasing brightness that doesn't cause eye strain.
Adjusting a “Refresh”-type display like CRT or Plasma
Black level
On “Refresh”-type displays, this adjustment is usually done using the “brightness” control. You may reduce or increase the brightness of your screen until the desired black level is reached (i.e. the bar ends at the marked center position).
White point
The next step should be adjusting the whitepoint, using the display's RGB gain controls or other means of adjusting the whitepoint. Note that you may also benefit from this adjustment if you have set the target whitepoint to “native”, as it will allow you to bring it closer to the daylight or blackbody locus, which can help the human visual system to better adapt to the whitepoint. Look at the bars shown during the measurements to adjust RGB gains and minimize the delta E to the target whitepoint.
White level
Continue with the white level adjustment. On “Refresh”-type displays this is usually done using the “contrast” control. If you have set a target white level, you may reduce or increase contrast until the desired value is reached (i.e. the bar ends at the marked center position). If you haven't set a target, simply adjust the screen to a visually pleasing level that doesn't cause eye strain.
Black point
If your display has RGB offset controls, you can adjust the black point as well, in much the same way that you adjusted the whitepoint.
Finishing adjustments and starting calibration/characterization

After the adjustments, you can run a check on all the settings by choosing the last option from the left-hand menu to verify the achieved values. If adjusting one setting adversely affected another, you can then simply repeat the respective option as necessary until the target parameters are met.

Finally, select “Continue on to calibration/profiling” to start the non-interactive part. You may want to get a coffee or two as the process can take a fair amount of time, especially if you selected a high quality level. If you only wanted help to adjust the display and don't want/need calibration curves to be created, you can also choose to exit by closing the interactive display adjustment window and then select “Profile only” from the main window.
If you originally selected “Calibrate & profile” and fulfil the requirements for unattended calibration & profiling, the characterization measurements for the profiling process should start automatically after calibration is finished. Otherwise, you may be forced to take the instrument off the screen to do a sensor self-calibration before starting the profiling measurements.

Optimizing testcharts for improved profiling accuracy and efficiency

The easiest way to use an optimized testchart for profiling is to set the testchart to “Auto” and adjusting the patch amount slider to the desired number of test patches. Optimization will happen automatically as part of the profiling measurements (this will increase measurement and processing times by a certain degree).
Alternatively, if you want to do generate an optimized chart manually prior to a new profiling run, you could go about this in the following way:

  • Have a previous display profile and select it under “Settings”.
  • Select one of the pre-baked testcharts to use as base and bring up the testchart editor.
  • Next to “Preconditioning profile” click on “current profile”. It should automatically select the previous profile you've chosen. Then place a check in the checkbox. Make sure adaptation is set to a high level (e.g. 100%)
  • If desired, adjust the number of patches and make sure the iterative patches amount is not zero.
  • Create the chart and save it. Click “yes” when asked to select the newly generated chart.
  • Start the profiling measurements (e.g. click “calibrate & profile” or “profile only”).

Profile installation

When installing a profile after creating or updating it, a startup item to load its calibration curves automatically on login will be created (on Windows and Linux, Mac OS X does not need a loader). You may also prevent this loader from doing anything by removing the check in the “Load calibration curves on Login” checkbox in the profile installation dialog, and in case you are using Windows 7 or later, you may let the operating system handle calibration loading instead (note that the Windows internal calibration loader does not offer the same high precision as the DisplayCAL profile loader, due to wrong scaling and 8-bit quantization).

Profile loader (Windows)

Under Windows, the profile loader will stay in the taskbar tray and keep the calibration loaded. In addition, the profile loader is madVR-aware and will disable calibration loading if it detects e.g. madTPG or madVR being used by a video player. A right-click menu also allows you to set the desired calibration state and a few other options:

  • Reload calibration from current display device profile(s). Selecting this reloads the calibration instantly, and also sets the desired calibration state (see “Preserve calibration state” below).
  • Reset video card gamma table. Selecting this resets the video card gamma tables instantly, and also sets the desired calibration state (see “Preserve calibration state” below).
  • Preserve calibration state. This periodically checks if the video card gamma tables match the desired calibration state. It may take up to three seconds until the selected calibration state is automatically re-applied.
  • Fix profile associations automatically when only one display is active in a multi-display setup. This is a work-around for applications (and Windows itself) querying the display profile in a way that does not take into account the active display, which can lead to a wrong profile being used. A pre-requisite for this working correctly is that the profile loader has to be running before you switch from a multi-display to a single-display configuration in Windows, and the profile associations have to be correct at this point. Note that quitting the profile loader will restore profile associations to what they were (honoring any changes to profile associations during its runtime).

Creating 3D LUTs

You can create display correction RGB-in/RGB-out 3D LUTs (for use in video playback or editing applications/devices that don't have ICC support) as part of the profiling process.

3D LUT settings

Create 3D LUT after profiling
Normally after profiling, you'll be given the option to install the profile to make it available for ICC color managed applications. If this box is checked, you'll have the option to generate a 3D LUT (with the chosen settings) instead, and the 3D LUT settings will also be stored inside the profile, so that they can be easily restored by selecting the profile under “Settings” if needed. If this box is unchecked, you can create a 3D LUT from an existing profile.
Source colorspace/source profile
This sets the source colorspace for the 3D LUT, which is normally a video standard space like defined by Rec. 709 or Rec. 2020.
Tone curve
This allows to set a predefined or custom tone response curve for the 3D LUT. Predefined settings are Rec. 1886 (input offset) and Gamma 2.2 (output offset, pure power).
Apply calibration (vcgt) (only visible if “Show advanced options” in the “Options” menu is enabled)
Apply the profile's 1D LUT calibration (if any) to the 3D LUT. Nornmally, this should always be enabled if the profile contains a non-linear 1D LUT calibration, otherwise you have to make sure the 1D calibration is loaded whenever the 3D LUT is used.
Gamut mapping mode (only visible if “Show advanced options” in the “Options” menu is enabled)
The default gamut mapping mode is “Inverse device to PCS” and gives the most accurate results. In case a profile with high enough PCS-to-device tables is used, the option “PCS-to-device” is selectable as well, which allows for quicker generation of a 3D LUT, but is somewhat less accurate.
Rendering intent
  • “Absolute colorimetric” is intended to reproduce colors exactly. Out of gamut colors will be clipped to the closest possible match. The destination whitepoint will be altered to match the source whitepoint if possible, which may get clipped if it is out of gamut.
  • “Absolute appearance” maps colors from source to destination, trying to match the appearance of colors as closely as possible, but may not exactly map the whitepoint. Out of gamut colors will be clipped to the closest possible match.
  • “Absolute colorimetric with white point scaling” behaves almost exactly like “Absolute colorimetric”, but will scale the source colorspace down to make sure the source whitepoint isn't clipped.
  • “Luminance matched appearance” linearly compresses or expands the luminance axis from white to black to match the source to the destination space, while not otherwise altering the gamut, clipping any out of gamut colors to the closest match. The destination whitepoint is not altered to match the source whitepoint.
  • “Perceptual” uses three-dimensional compression to make the source gamut fit within the destination gamut. As much as possible, clipping is avoided, hues and the overall appearance is maintained. The destination whitepoint is not altered to match the source whitepoint. This intent is useful if the destination gamut is smaller than the source gamut.
  • “Perceptual appearance” uses three-dimensional compression to make the source gamut fit within the destination gamut. As much as possible, clipping is avoided, hues and the overall appearance is maintained. The destination whitepoint is altered to match the source whitepoint. This intent is useful if the destination gamut is smaller than the source gamut.
  • “Luminance preserving perceptual” (Argyll CMS 1.8.3+) uses compression to make the source gamut fit within the destination gamut, but very heavily weights the preservation of the luminance value of the source, which will compromise the preservation of saturation. No contrast enhancement is used if the dynamic range is reduced. This intent may be of use where preserving the tonal distinctions in images is more important than maintaining overall colorfulness or contrast.
  • “Preserve saturation” uses three-dimensional compression and expansion to try and make the source gamut match the destination gamut, and also favours higher saturation over hue or lightness preservation. The destination whitepoint is not altered to match the source whitepoint.
  • “Relative colorimetric” is intended to reproduce colors exactly, but relative to the destination whitepoint which will not be altered to match the source whitepoint. Out of gamut colors will be clipped to the closest possible match. This intent is useful if you have calibrated a display to a custom whitepoint that you want to keep.
  • “Saturation” uses the same basic gamut mapping as “Preserve saturation”, but increases saturation slightly in highly saturated areas of the gamut.
3D LUT file format
Sets the output format for the 3D LUT. Currently supported are Autodesk/Kodak (.3dl), Iridas (.cube), eeColor (.txt), madVR (.3dlut), Pandora (.mga), Portable Network Graphic (.png), ReShade (.png, .fx) and Sony Imageworks (.spi3d). Note that an ICC device link profile (the ICC equivalent of an RGB-in/RGB-out 3D LUT) is always created as well.
Input/output encoding
Some 3D LUT formats allow you to set the input/output encoding. Note that in most cases, sensible defaults will be chosen depending on selected 3D LUT format, but may be application- or workflow-specific.
Input/output bit depth
Some 3D LUT formats allow you to set the input/output bit depth. Note that in most cases, sensible defaults will be chosen depending on selected 3D LUT format, but may be application- or workflow-specific.

Installing 3D LUTs

Depending on the 3D LUT file format, installing or saving the 3D LUT to a specific location may be required before it can be used. You will be asked to install or save the 3D LUT directly after it was created. If you need to install or save the 3D LUT again at a later point, switch to the “3D LUT” tab and click the small “Install 3D LUT” button next to the “Settings” dropdown (the same button that installs display profiles when on the “Display & instrument” tab and a directly connected, desktop-accessible display is selected).

Installing 3D LUTs for the ReShade injector

First, you need to install ReShade for each application or game you want to use a 3D LUT with. Follow the installation instructions in the ReShade README, but in case you are using ReShade Core do not copy the example ReShade.fx that comes with it. If you want to use the 3D LUT together with one of the other shader packs available for ReShade, install that too prior to installing the 3D LUT. Then, install the 3D LUT from within DisplayCAL to the same folder where you previously installed/copied ReShade and related files. The default toggle key to turn the 3D LUT on and off is the HOME key. You can change this key or disable the 3D LUT altogether by editing ColorLookUpTable.fx (with a text editor) inside the application/game folder where you installed the 3D LUT. To remove a 3D LUT completely, delete ColorLookUpTable.png and ColorLookUpTable.fx, as well as edit ReShade.fx and remove the line #include "ColorLookupTable.fx" near the end.

Verification / measurement report

You can do verification measurements to assess the display chain's (display profile - video card and the calibration curves in its gamma table - monitor) fit to the measured data, or to find out about the soft proofing capabilities of the display chain.

To do the former, you have to select a CGATS[1] testchart file containing device values (RGB). The measured values are then compared to the values obtained by feeding the device RGB numbers through the display profile (measured vs expected values). The default verification chart contains 26 patches and can be used, for example, to check if a display needs to be re-profiled. If a RGB testchart with gray patches (R=G=B) is measured, like the default and extended verification charts, you also have the option to evaluate the graybalance through the calibration only, by placing a check in the corresponding box on the report.

To perform a check on the soft proofing capabilities, you have to provide a CGATS reference file containing XYZ or L*a*b* data, or a combination of simulation profile and testchart file, which will be fed through the display profile to lookup corresponding device (RGB) values, and then be sent to the display and measured. Afterwards, the measured values are compared to the original XYZ or L*a*b* values, which can give a hint how suitable (or unsuitable) the display is for softproofing to the colorspace indicated by the reference.

The profile that is to be evaluated can be chosen freely. You can select it in DisplayCAL's main window under “settings”. The report files generated after the verification measurements are plain HTML with some embedded JavaScript, and are fully self-contained. They also contain the reference and measurement data, which consists of device RGB numbers, original measured XYZ values, and D50-adapted L*a*b* values computed from the XYZ numbers, and which can be examined as plain text directly from the report at the click of a button.

HowTo—Common scenarios

Select the profile you want to evaluate under “Settings” (for evaluating 3D LUTs and DeviceLink profiles, this setting has significance for a Rec. 1886 or custom gamma tone response curve, because they depend on the black level).

There are two sets of default verification charts in different sizes, one for general use and one for Rec. 709 video. The “small” and “extended” versions can be used for a quick to moderate check to see if a display should be re-profiled, or if the used profile/3D LUT is any good to begin with. The “large” and “xl” versions can be used for a more thorough check. Also, you can create your own customized verification charts with the testchart editor.

Checking the accuracy of a display profile (evaluating how well the profile characterizes the display)

In this case, you want to use a testchart with RGB device values and no simulation profile. Select a suitable file under “testchart or reference” and disable “simulation profile”. Other settings that do not apply in this case will be grayed out.

Checking how well a display can simulate another colorspace (evaluating softproofing capabilities, 3D LUTs, DeviceLink profiles, or native display performance)

There are two ways of doing this:

  • Use a reference file with XYZ or L*a*b* aim values,
  • or use a combination of testchart with RGB or CMYK device values and an RGB or CMYK simulation profile (for an RGB testchart, it will only allow you to use an RGB simulation profile and vice versa, and equally a CMYK testchart needs to be used with a CMYK simulation profile)

Then, you have a few options that influence the simulation.

  • Whitepoint simulation. If you are using a reference file that contains device white (100% RGB or 0% CMYK), or if you use a combination of testchart and simulation profile, you can choose if you want whitepoint simulation of the reference or simulation profile, and if so, if you want the whitepoint simulated relative to the target profile whitepoint. To explain the latter option: Let's assume a reference has a whitepoint that is slightly blueish (compared to D50), and a target profile has a whitepoint that is more blueish (compared to D50). If you do not choose to simulate the reference white relative to the target profile whitepoint, and the target profile's gamut is large and accurate enough to accomodate the reference white, then that is exactly what you will get. Depending on the adaptation state of your eyes though, it may be reasonable to assume that you are to a large extent adapted to the target profile whitepoint (assuming it is valid for the device), and the simulated whitepoint will look a little yellowish compared to the target profile whitepoint. In this case, choosing to simulate the whitepoint relative to that of the target profile may give you a better visual match e.g. in a softproofing scenario where you compare to a hardcopy proof under a certain illuminant, that is close to but not quite D50, and the display whitepoint has been matched to that illuminant. It will “add” the simulated whitepoint “on top” of the target profile whitepoint, so in our example the simulated whitepoint will be even more blueish than that of the target profile alone.
  • Using the simulation profile as target profile will override the profile set under “Settings”. Whitepoint simulation does not apply here because color management will not be used and the display device is expected to be in the state described by the simulation profile. This may be accomplished in several ways, for example the display may be calibrated internally or externally, by a 3D LUT or device link profile. If this setting is enabled, a few other options will be available:
    • Enable 3D LUT (if using the madVR display device/madTPG under Windows, or a Prisma video processor). This allows you to check how well the 3D LUT transforms the simulation colorspace to the display colorspace. Note this setting can not be used together with a DeviceLink profile.
    • DeviceLink profile. This allows you to check how well the DeviceLink transforms the simulation colorspace to the display colorspace. Note this setting can not be used together with the “Enable 3D LUT” setting.
  • Tone response curve. If you are evaluating a 3D LUT or DeviceLink profile, choose the same settings here as during 3D LUT/DeviceLink creation (and also make sure the same target profile is set, because it is used to map the blackpoint).
    To check a display that does not have an associated profile (e.g. “Untethered”), set the verification tone curve to “Unmodified”. In case you want to verify against a different tone response curve instead, you need to create a synthetic profile for this purpose (“Tools” menu).

How were the nominal and recommended aim values chosen?

The nominal tolerances, with the whitepoint, average, maximum and gray balance Delta E CIE 1976 aim values stemming from UGRA/Fogra Media Wedge and UDACT, are pretty generous, so I've included somewhat stricter “recommended” numbers which I've chosen more or less arbitrarily to provide a bit “extra safety margin”.

For reports generated from reference files that contain CMYK numbers in addition to L*a*b* or XYZ values, you can also select the official Fogra Media Wedge V3 or IDEAlliance Control Strip aim values for paper white, CMYK solids and CMY grey, if the chart contains the right CMYK combinations.

How are the results of the profile verification report to be interpreted?

This depends on the chart that was measured. The explanation in the first paragraph sums it up pretty well: If you have calibrated and profiled your display, and want to check how well the profile fits a set of measurements (profile accuracy), or if you want to know if your display has drifted and needs to be re-calibrated/re-profiled, you select a chart containing RGB numbers for the verification. Note that directly after profiling, accuracy can be expected to be high if the profile characterizes the display well, which will usually be the case if the display behaviour is not very non-linear, in which case creating a LUT profile instead of a “Curves + matrix” one, or increasing the number of measured patches for LUT profiles, can help.

If you want to know how well your profile can simulate another colorspace (softproofing), select a reference file containing L*a*b* or XYZ values, like one of the Fogra Media Wedge subsets, or a combination of a simulation profile and testchart. Be warned though, only wide-gamut displays will handle a larger offset printing colorspace like FOGRA39 or similar well enough.

In both cases, you should check that atleast the nominal tolerances are not exceeded. For a bit “extra safety margin”, look at the recommended values instead.

Note that both tests are “closed-loop” and will not tell you an “absolute” truth in terms of “color quality” or “color accuracy” as they may not show if your instrument is faulty/measures wrong (a profile created from repeatable wrong measurements will usually still verify well against other wrong measurements from the same instrument if they don't fluctuate too much) or does not cope with your display well (which is especially true for colorimeters and wide-gamut screens, as such combinations need a correction in hardware or software to obtain accurate results—this problem does not exist with spectrometers, which do not need a correction for wide-gamut, but have lately been discovered to have issues measuring the correct brightness of some LED backlit displays which use white LEDs), or if colors on your screen match an actual colored object next to it (like a print). It is perfectly possible to obtain good verification results but the actual visual performance being sub-par. It is always wise to combine such measurements with a test of the actual visual appearance via a “known good” reference, like a print or proof (although it should not be forgotten that those also have tolerances, and illumination also plays a big role when assessing visual results). Keep all that in mind when admiring (or pulling your hair out over) verification results :)

How are profiles evaluated against the measured values?

Different softwares use different methods (which are not always disclosed in detail) to compare and evaluate measurements. This section aims to give interested users a better insight how DisplayCAL's profile verification feature works “under the hood”.

How is a testchart or reference file used?

There are currently two slightly different paths depending if a testchart or reference file is used for the verification measurements, as outlined above. In both cases, Argyll's xicclu utility is run behind the scenes and the values of the testchart or reference file are fed relative colorimetrically (if no whitepoint simualtion is used) or absolute colorimetrically (if whitepoint simulation is used) through the profile that is tested to obtain corresponding L*a*b* (in the case of RGB testcharts) or device RGB numbers (in the case of XYZ or L*a*b* reference files or a combination of simulation profile and testchart). If a combination of simulation profile and testchart is used as reference, the reference L*a*b* values are calculated by feeding the device numbers from the testchart through the simulation profile absolute colorimetrically if whitepoint simulation is enabled (which will be the default if the simulation profile is a printer profile) and relative colorimetrically if whitepoint simulation is disabled (which will be the default if the simulation profile is a display profile, like most RGB working spaces). Then, the original RGB values from the testchart, or the looked up RGB values for a reference are sent to the display through the calibration curves of the profile that is going to be evaluated. A reference white of D50 (ICC default) and complete chromatic adaption of the viewer to the display's whitepoint is assumed if “simulate whitepoint relative to target profile whitepoint” is used, so the measured XYZ values are adapted to D50 (with the measured whitepoint as source reference white) using the Bradford transform (see Chromatic Adaption on Bruce Lindbloom's website for the formula and matrix that is used by DisplayCAL) or with the adaption matrix from the profile in the case of profiles with 'chad' chromatic adaption tag, and converted to L*a*b*. The L*a*b* values are then compared by the generated dynamic report, with user-selectable critera and ΔE (delta E) formula.

How is the assumed vs. measured whitepoint ΔE calculated?

In a report, the correlated color temperature and assumed target whitepoint, as well as the whitepoint ΔE, do warrant some further explanations: The whitepoint ΔE is calculated as difference between the measured whitepoint's and the assumed target whitepoint's normalized XYZ values, which are first converted to L*a*b*. The assumed target whitepoint color temperature shown is simply the rounded correlated color temparature (100K threshold) calculated from the measured XYZ values. The XYZ values for the assumed target whitepoint are obtained by calculating the chromaticity (xy) coordinates of a CIE D (daylight) or blackbody illuminant of that color temperature and converting them to XYZ. You can find all the used formulas on Bruce Lindbloom's website and on Wikipedia.

How is the gray balance “range” evaluated?

The gray balance “range” uses a combined delta a/delta b absolute deviation (e.g. if max delta a = -0.5 and max delta b = 0.7, the range is 1.2). Because results in the extreme darks can be problematic due to lack of instrument accuracy and other effects like a black point which has a different chromaticity than the whitepoint, the gray balance check in DisplayCAL only takes into account gray patches with a minimum measured luminance of 1% (i.e. if the white luminance = 120 cd/m², then only patches with at least 1.2 cd/m² will be taken into account).

What does the “Evaluate gray balance through calibration only” checkbox on a report actually do?

It sets the nominal (target) L* value to the measured L* value and a*=b*=0, so the profile is effectively ignored and only the calibration (if any) will influence the results of the gray balance checks. Note that this option will not make a difference for a “Single curve + matrix” profile, as the single curve effectively already achieves a similar thing (the L* values can be different, but they are ignored for the gray balance checks and only influence the overall result).

Special functionality

Remote measurements and profiling

When using Argyll CMS 1.4.0 and newer, remote measurements on a device not directly connected to the machine that is running DisplayCAL is possible (e.g. a smartphone or tablet). The remote device needs to be able to run a web browser (Firefox recommended), and the local machine running DisplayCAL may need firewall rules added or altered to allow incoming connections. To set up remote profiling, select “Web @ localhost” from the display device dropdown menu, then choose the desired action (e.g. “Profile only”). When the message “Webserver waiting at http://<IP>:<Port>” appears, open the shown address in the remote browser and attach the measurement device.
NOTE: If you use this method of displaying test patches, there is no access to the display video LUT[7]s and hardware calibration is not possible. The colors will be displayed with 8 bit per component precision, and any screen-saver or power-saver will not be automatically disabled. You will also be at the mercy of any color management applied by the web browser, and may have to carefully review and configure such color management.
Note: Close the web browser window or tab after each run, otherwise reconnection may fail upon further runs.

madVR test pattern generator

DisplayCAL supports the madVR test pattern generator (madTPG) and madVR 3D LUT formats since version 1.5.2.5 when used together with Argyll CMS 1.6.0 or newer.

Resolve (10.1+) as pattern generator

Since version 2.5, DisplayCAL can use Resolve (10.1+) as pattern generator. Select the “Resolve” entry from the display devices dropdown in DisplayCAL and in Resolve itself choose “Monitor calibration”, “CalMAN” in the “Color” menu.

Untethered display measurements

Please note that the untethered mode should generally only be used if you've exhausted all other options.

Untethered mode is another option to measure and profile a remote display that is not connected via standard means (calibration is not supported). To use untethered mode, the testchart that should be used needs to be optimized, then exported as image files (via the testchart editor) and those image files need to be displayed on the device that should be measured, in successive order. The procedure is as follows:

  • Select the desired testchart, then open the testchart editor.
  • Select “Optimize for untethered in auto mode” from the sorting options dropdown, click “Apply”, then export the testchart.
  • Burn the images to a DVD, copy them on an USB stick or use any other available means to get them to display onto the device that should be measured.
  • In DisplayCAL's display dropdown, select “Untethered” (the last option).
  • Show the first image on the remote display, and attach the instrument. Then select “Profile only”.

Measurements will commence, and changes in the displayed image should be automatically detected if “auto” mode is enabled. Use whatever means available to you to cycle through the images from first to last, carefully monitoring the measurement process and only changing to the next image if the current one has been successfully measured (as will be shown in the untethered measurement window). Note that untethered mode will be (atleast) twice as slow as normal display measurements.

Non-UI functionality

There is a bit of functionality that is not available via the UI and needs to be run from a command prompt or ternminal. Use of this functionality currently requires 0install, or running from source.

Change display profile and calibration whitepoint

Note that this reduces the profile gamut and accuracy.

Via 0install:

0install run --command=change-display-profile-cal-whitepoint -- \
  http://displaycal.net/0install/DisplayCAL.xml \
  [-t temp | -T temp | -w x,y] [--cal-only] [inprofile] outfilename

From source:

python util/change_display_profile_cal_whitepoint.py- \
  http://displaycal.net/0install/DisplayCAL.xml \
  [-t temp | -T temp | -w x,y] [--cal-only] [inprofile] outfilename
-t temp
Use daylight color temperature temp as whitepoint target.
-T temp
Use blackbody color temperature temp as whitepoint target.
-w x,y
Use x,y chromaticity as whitepoint target.
--cal-only (optional)
Only alter the calibration embedded in the profile, not the profile itself.
inprofile (optional)
Use profile inprofile instead of the current display profile.
outfilename
Output profile filename. The changed profile will be written to this file.
Enable/disable Windows 7 and later calibration loading

Note that Windows calibration loading is of lower quality than using Argyll CMS because Windows always quantizes the calibration to 8 bit and scales it wrongly. This is not the case when using the DisplayCAL calibration loader which uses Argyll CMS.

Via 0install:

0install run --command=set-calibration-loading -- \
  http://displaycal.net/0install/DisplayCAL.xml [--os]

From source:

python -c "import sys; from DisplayCAL import util_win; \
  util_win.calibration_management_isenabled() or \
  util_win.enable_calibration_management() \
  if '--os' in sys.argv[1:] else \
  not util_win.calibration_management_isenabled() or \
  util_win.disable_calibration_management();" [--os]

The --os option determines wether Windows calibration loading functionality should be enbaled or disabled.

Scripting

DisplayCAL supports scripting locally and over the network (the latter must be explicitly enabled by setting app.allow_network_clients = 1 in DisplayCAL.ini) via sockets. DisplayCAL must be already running on the target machine for this to work. Below is an example connecting to a running instance on the default port 15411 and starting calibration measurements (the port is configurable in DisplayCAL.ini as app.port, although if the desired port is not available an unused one will be chosen automatically. You can read the actual used port from the file DisplayCAL.lock in the configuration file folder of DisplayCAL while it is running). The example is written in Python and deals with some of the intricacies of sockets as well.

#!/usr/bin/env python2

import socket

class DCGScriptingClientSocket(socket.socket):

	def __enter__(self):
		return self

	def __exit__(self, etype, value, tb):
		# Disconnect
		try:
			# Will fail if the socket isn't connected, i.e. if there was an
			# error during the call to connect()
			self.shutdown(socket.SHUT_RDWR)
		except socket.error:
			pass
		self.close()

	def __init__(self):
		socket.socket.__init__(self)
		self.recv_buffer = ''

	def get_single_response(self):
		# Buffer received data until EOT (response end marker) and return
		# single response (additional data will still be in the buffer)
		while not '\4' in self.recv_buffer:
			incoming = self.recv(4096)
			if incoming == '':
				raise socket.error("Connection broken")
			self.recv_buffer += incoming
		end = self.recv_buffer.find('\4')
		single_response = self.recv_buffer[:end]
		self.recv_buffer = self.recv_buffer[end + 1:]
		return single_response

	def send_and_check(self, command, expected_response="ok"):
		""" Send command, get & check response """
		self.send_command(command)
		single_response = self.get_single_response()
		if single_response != expected_response:
			# Check application state. If a modal dialog is displayed, choose
			# the OK option. Note that this is just an example and normally you
			# should be very careful with this, as it could mean confirming a
			# potentially destructive operation (e.g. discarding current
			# settings, overwriting existing files etc).
			self.send_command('getstate')
			state = self.get_single_response()
			if 'Dialog' in state.split()[0]:
				self.send_command('ok')
				if self.get_single_response() == expected_response:
					return
			raise RuntimeError('%r got unexpected response: %r != %r' %
							   (command, single_response, expected_response))

	def send_command(self, command):
		# Automatically append newline (command end marker)
		self.sendall(command + '\n')

# Generate a list of commands we want to execute in order
commands = []

# Load “Laptop” preset
commands.append('load presets/laptop.icc')

# Setup calibration & profiling measurements
commands.append('calibrate-profile')

# Start actual measurements
commands.append('measure')

# Create socket & send commands
with DCGScriptingClientSocket() as client:
	client.settimeout(3)  # Set a timeout of 3 seconds

	# Open connection
	client.connect(('127.0.0.1', 15411))  # Default port

	for command in commands:
		client.send_and_check(command)

Each command needs to be terminated with a newline character (after any arguments the command may accept). Note that data sent must be UTF-8 encoded, and if arguments contain spaces they should be encased in double or single quotes. You should check the response for each command sent (the response end marker is ASCII 0x4 EOT, and the default response format is a plain text format, but JSON and XML are also available). The common return values for commands are either ok in case the command was understood (note that this does not indicate if the command finished processing), busy or blocked in case the command was ignored because another operation was running or a modal dialog blocks the UI, failed in case the command or an argument could not be processed successfully, forbidden in case the command was not allowed (this may be a temporary condition depending on the circumstances, e.g. when trying to interact with an UI element that is currently disabled), invalid in case the command (or one of its arguments) was invalid, or error followed by an error message in case of an unhandled exception. Other return values are possible depending on the command. All values returned are UTF-8 encoded. If the return value is blocked (e.g. because a modal dialog is displayed) you should check the application state with the getstate command to determine the further course of action.

List of supported commands

Below is a list of the currently supported commands (the list contains all valid commands for the main application, the standalone tools will typically just support a smaller subset. You can use the “DisplayCAL Scripting Client” standalone tool to learn about and experiment with commands). Note that filename arguments must refer to files present on the target machine running DisplayCAL.

3DLUT-maker [create filename]
Show 3D LUT creation tab, or create 3D LUT filename.
abort
Try to abort a currently running operation.
activate [window ID | name | label]
Activate window window or the main application window (bring it to the front). If it is minimized, restore it.
alt | cancel | ok [filename]
If a modal dialog is shown, call the default action (ok), the alternate action (if applicable), or cancel it. If a file dialog is shown, using ok filename chooses that file.
calibrate
Setup calibration measurements (note that this won't give a choice whether to create a fast curves + matrix profile as well, if you want that use interact mainframe calibrate_btn instead). For non-virtual displays as well as pattern generators (except madVR), call the measure command afterwards to commence measurements.
calibrate-profile
Setup calibration & profiling measurements. For non-virtual displays as well as pattern generators (except madVR), call the measure command afterwards to commence measurements.
close [window ID | name | label]
Close window window or the current active window (if the window is the main window, this quits the application). Note that this tries to abort any running operations first, so you may want to check application state via the getstate command.
create-colorimeter-correction
Create colorimeter correction.
create-profile [filename]
Create profile from existing measurements (profile or measurement file).
curve-viewer [filename]
Show curves, optionally loading filename. Relative paths are possible e.g. for presets: curve-viewer presets/photo.icc
DisplayCAL [filename]
Bring the main window to the front. If it is minimized, restore it. Optionally, load filename.
enable-spyder2
Enable the spyder 2.
getactivewindow
Get the current active window. The returned format is classname ID name label state. state is either enabled or disabled.
getcellvalues [window ID | name | label] <grid ID | name | label>
Get cell values from grid grid of window window or the current active window.
getappname
Get the name of the application you're connected to.
getcfg [option]
Get configuration option, or whole configuration (key-value pairs in INI format).
getcommands
Get list of commands supported by this application.
getdefault <option>
Get default option (key-value pair in INI format).
getdefaults
Get all defaults (key-value pairs in INI format).
getmenus
Get available menus in the format ID "label" state. state is either enabled or disabled.
getmenuitems [menuposition | label]
Get available menu items in the format menuposition "menulabel" menuitemID "menuitemlabel" state [checkable] [checked]. state is either enabled or disabled.
getstate
Get application state. Return value will be either idle, busy, dialogclassname ID dialogname [dialoglabel] state "messagetext" [path "path"] [buttons "buttonlabel"...] if a modal dialog is shown or blocked in case the UI is currently blocked. Most commands will not work if the UI is blocked—the only way to resolve the block is to non-programmatically interact with the actual UI elements of the application or closing it. Note that a state of blocked should normally only occur if an actual file dialog is shown. If using the scripting interface exclusively, this should never happen because it uses a replacement file dialog that supports the same actions as a real file dialog, but doesn't block. Also note that a return value of blocked for any of the other commands just means that a modal dialog is currently waiting to be interacted with, only if getstate also returns blocked you cannot resolve the situation with scripting alone.
getuielement [window ID | name | label] <element ID | name | label>
getuielements [window ID | name | label]
Get a single UI element or a list of the visible UI elements of window window or the current active window. Each returned line represents an UI element and has the format classname ID name ["label"] state [checked] [value "value"] [items "item"...]. classname is the internal UI library class name. It can help you determine what type of UI element it is, and which interactions it supports. ID is a numeric identifier. name is the name of the UI element. "label" (if present) is a label which further helps in identifying the UI element. You can use the latter three with the interact command. state is either enabled or disabled. items "item"... (if present) is a list of items connected to the UI element (i.e. selection choices).
getvalid
Get valid values for options that have constraints (key-value pairs in INI format). There are two sections, ranges and values. ranges are the valid ranges for options that accept numeric values (note that integer options not covered by ranges are typically boolean types). values are the valid values for options that only accept certain values. Options not covered by ranges and values are limited to their data type (you can't set a numeric option to a string and vice versa).
getwindows
Get a list of visible windows. The returned format is a list of classname ID name label state. state is either enabled or disabled.
import-colorimeter-corrections [filename...]
Import colorimeter corrections.
install-profile [filename]
Install a profile.
interact [window ID | name | label] <element ID | name | label> [setvalue value]
Interact with the UI element element of window window or the current active window, e.g. invoke a button or set a control to a value.
invokemenu <menuposition | menulabel> <menuitemID | menuitemlabel>
Invoke a menu item.
load <filename>
Load filename. Relative paths are possible e.g. for presets: load presets/photo.icc
measure
Start measurements (must be setup first!).
measure-uniformity
Measure screen uniformity.
measurement-report [filename]
If no filename given, show measurement report tab. Otherwise, setup measurement to create the HTML report filename. For non-virtual displays as well as pattern generators (except madVR), call the measure command afterwards to commence measurements.
profile
Setup profiling measurements (note that this will always use the current calibration if applicable, if you want to use linear calibration instead call load linear.cal prior to calling profile). For non-virtual displays as well as pattern generators (except madVR), call the measure command afterwards to commence measurements.
profile-info [filename]
Show profile information, optionally loading profile filename. Relative paths are possible e.g. for presets: profile-info presets/photo.icc
refresh
Update the GUI after configuration changes via setcfg or restore-defaults.
report-calibrated
Report on calibrated display. For non-virtual displays as well as pattern generators (except madVR), call the measure command afterwards to commence measurements.
report-uncalibrated
Report on uncalibrated display. For non-virtual displays as well as pattern generators (except madVR), call the measure command afterwards to commence measurements.
restore-defaults [category...]
Restore defaults globally or just for category. Call refresh after changing the configuration to update the GUI.
setlanguage <languagecode>
Set language.
setcfg <option> <value>
Set configuration option to value. The special value null clears a configuration option. Call refresh after changing the configuration to update the GUI. Also see getdefaults and getvalid.
setresponseformat <format>
Set the format for responses. The default plain is a text format that is easy to read, but not necessarily the best for parsing programmatically. The other possible formats are json, json.pretty, xml and xml.pretty. The *.pretty formats use newlines and indentation to make them easier to read.
synthprofile [filename]
Show synthetic profile creation window, optionally loading profile filename.
testchart-editor [filename | create filename]
Show testchart editor window, optionally loading or creating testchart filename. Relative paths are possible e.g. for loading a default testchart: testchart-editor ti1/d3-e4-s17-g49-m5-b5-f0.ti1
verify-calibration
Verify calibration. For non-virtual displays as well as pattern generators (except madVR), call the measure command afterwards to commence measurements.

Interacting with UI elements

  • Invoking a button: interact [window] <button> e.g. show profile name placeholders information: interact mainframe profile_name_info_btn
  • Setting a value on a dropdown, text field, or slider: interact [window] <element> setvalue "value" e.g. set calibration gamma to 2.4: interact mainframe trc_textctrl setvalue 2.4 (note that for changing multiple options at once it is generally preferable to call setcfg <option> <value> for each option you want to set followed by a single refresh instead)
  • Setting a cell value on a grid: interact [window] <grid> setvalue "row,col,value" e.g. while the testchart editor is shown, set the cell at the second column of the first row to 33: interact tcgen grid setvalue "0,1,33"

Caveats and limitations

There are a few things to be aware of when using commands that interact with the UI directly (i.e. activate, alt | cancel | ok, close, interact and invokemenu).

Referring to windows and UI elements: You can refer to windows and UI elements by their ID, name or label (you can find out about windows and UI elements with the getmenus/getmenuitems, getuielement/getuielements, and getwindows commands). If an object's ID is negative, it means that it has been automatically assigned at object creation time and is only valid during the lifetime of the object (i.e. for modal dialogs, only while the dialog is displayed). For this reason, using an object's name instead is easier, but names (aswell as non automatically assigned IDs) are not guaranteed to be unique, even for objects which share the same parent window (although most of the “important” controls as well as application windows will have unique names). Another possibility is to use an object's label, which while also not guaranteed to be unique, still has a fairly high likelihood of being unique for controls that share the same parent window, but has the drawback that it is localized (although you can ensure a specific UI language by calling setlanguage) and is subject to change when the localization is updated.

Sequential operations: Calling commands that interact with the UI in rapid succession may require the use of additional delays between sending commands to allow the GUI to react (so getstate will return the actual UI state after a specific command), although there is a default delay for commands that interact with the UI of atleast 55 ms. A good rule of thumb for sending commands is to use a “send command” → “read response” → “optionally wait a few extra ms” → “get application state (send getstate command)” → “read response” cycle.

Setting values: If setting a value on an UI element returns ok, this is not always an indication that the value was actually changed, but only that the attempt to set the value has not failed, i.e. the event handler of the element may still do error checking and change the value to something sane if it was not valid. If you want to make sure that the intended value is set, use getuielement on the affected element(s) and check the value (or even better, if you use JSON or XML response format, you can check the object property/element of the response instead which will reflect the object's current state and saves you one request). In general it is preferable to use interact <elementname> setvalue <value> only on dialogs, and in all other cases use a sequence of setcfg <option> <value> (repeat as necessary, optionally call load <filename> or restore-defaults first to minimize the amount of configuration options that you need to change) followed by a call to refresh to update the UI.

Also, not all controls may offer a comprehensive scripting interface. I'm open to suggestions though.

User data and configuration file locations

DisplayCAL uses the following folders for configuration, logfiles and storage (the storage directory is configurable). Note that if you have upgraded to DisplayCAL from dispcalGUI, that DisplayCAL will continue to use the existing dispcalGUI directories and configuration file names (so replace DisplayCAL with dispcalGUI in the lists below).

Configuration

  • Linux: /home/Your Username/.config/DisplayCAL
  • Mac OS X: /Users/Your Username/Library/Preferences/DisplayCAL
  • Windows Vista and newer: C:\Users\Your Username\AppData\Roaming\DisplayCAL
  • Windows XP: C:\Documents and Settings\Your Username\Application Data\DisplayCAL

Logs

  • Linux: /home/Your Username/.local/share/DisplayCAL/logs
  • Mac OS X: /Users/Your Username/Library/Logs/DisplayCAL and
    /Users/Your Username/Library/Logs/0install
  • Windows Vista and newer: C:\Users\Your Username\AppData\Roaming\DisplayCAL\logs
  • Windows XP: C:\Documents and Settings\Your Username\Application Data\DisplayCAL\logs

Storage

  • Linux: /home/Your Username/.local/share/DisplayCAL/storage
  • Mac OS X: /Users/Your Username/Library/Application Support/DisplayCAL/storage
  • Windows Vista and newer: C:\Users\Your Username\AppData\Roaming\DisplayCAL\storage
  • Windows XP: C:\Documents and Settings\Your Username\Application Data\DisplayCAL\storage

Incomplete/failed runs (useful for troubleshooting)

  • Linux: /home/Your Username/.local/share/DisplayCAL/incomplete
  • Mac OS X: /Users/Your Username/Library/Application Support/DisplayCAL/incomplete
  • Windows Vista and newer: C:\Users\Your Username\AppData\Roaming\DisplayCAL\incomplete
  • Windows XP: C:\Documents and Settings\Your Username\Application Data\DisplayCAL\incomplete

Known issues and solutions

General: Wacky image colors (swapped colors)
Solution: This happens when you created a “XYZ LUT + swapped matrix” profile and is a way to alert you that the software you're using does not support XYZ LUT profiles and falls back to the included matrix (which generally means you'd loose accuracy). If you're having this situation only in some applications, creating a “XYZ LUT + matrix” profile will remedy it (but please keep in mind that those applications not supporting XYZ LUT will still fall back to the matrix, so results can be different from applications that support XYZ LUT correctly). If all colormanaged applications you use show swapped colors, you should create a matrix profile instead. Note that you do not have to re-run any measurements: In DisplayCAL, choose a profile type as suggested previously, adjust quality and profile name if you want, then choose “Create profile from measurement data...” in the “Options” menu and select the profile you had the issue with.
General: Measurements are failing (“Sample read failed”) if using the “Allow skipping of spectrometer self-calibration” option and/or highres/adaptive mode
Solution: Disable either or all of the above options. The problem seems to mainly occur with the ColorMunki.
USB 3.0 connectivity issues (instrument not found, access failing, or not working properly)
Such issues would usually manifest themselves through instruments not being found, or randomly disconnecting even if seemingly working fine for some time. From all information that is known about these issues, they seem to be related to USB 3.0, not related to software as the vendor software is also affected, and they seem to occur irrespective of operating system or device drivers.
The underlying issue seems to be that while USB 3.0 has been designed to be backwards compatible with USB 2.0, some USB 2 devices do not seem to work reliably when connected over USB 3. As currently available instruments with USB connectivity are usually USB 2 devices, they may be affected.
Solution: A potential solution to such USB 3.0 connectivity issues is to connect the instrument to a USB 2.0 port (if available) or the use of an externally powered USB 2.0 hub.
Windows: “The process <dispcal.exe|dispread.exe|coloprof.exe|...> could not be started.”
Solution: If you downloaded Argyll CMS manually, go to your Argyll_VX.X.X\bin directory, and right-click the exe file from the error message. Select “Properties”, and then if there is a text on the “General” tab under security “This file came from another computer and might be blocked”, click “Unblock”. Sometimes also over-zealous Antivirus or 3rd-party Firewall solutions cause such errors, and you may have to add exceptions for all involved programs (which may include all the Argyll CMS executables and if you're using Zero Install also python.exe which you'll find in a subdirectory under C:\ProgramData\0install.net\implementations) or (temporarily) disable the Antivirus/Firewall.
Photoshop: “The monitor profile […] appears to be defective. Please rerun your monitor calibration software.”
Solution: Adobe ACE, Adobe's color conversion engine, contains monitor profile validation functionality which attempts to filter out bad profiles. With XYZ LUT profiles created in Argyll CMS versions up to 1.3.2, the B2A white point mapping is sometimes not particularly accurate, just enough so that ACE will see it as a problem, but in actual use it may only have little impact that the whitepoint is a bit off. So if you get a similar message when launching Photoshop, with the options “Use profile regardless” and “Ignore profile”, you may choose “Use profile regardless” and check visually or with the pipette in Photoshop if the inaccurate whitepoint poses a problem. This issue is fixed in Argyll CMS 1.3.3 and newer. Alternatively, you can create a L*a*b* LUT profile.
MS Windows Vista: The calibration gets unloaded when a User Access Control prompt is shown
Solution: (Intel and Intel/AMD hybrid graphics users please see “The Calibration gets unloaded after login/resume/User Access Control prompt” first) This Windows Vista bug seems to have been fixed under Windows 7 (and later), and can be remedied under Vista by either manually reloading calibration, or disabling UAC—but please note that you sacrifice security by doing this. To manually reload the calibration, either open DisplayCAL and select “Load calibration curves from current display profile” in the “Options” menu, or (quicker) open the Windows start menu and select “DisplayCAL Profile Loader” in the “Startup” subfolder. To disable UAC[9] (not recommended!), open the Windows start menu and enter “msconfig” in the search box. Click on the Tools tab. Select the line “Disable UAC” and click the “Launch” button. Close msconfig. You need to reboot your system for changes to apply.
MS Windows with Intel graphics (also Intel/AMD hybrid): The Calibration gets unloaded after login/resume/User Access Control prompt
Solution: The Intel graphics drivers contain several utilities that interfere with correct calibration loading. A workaround is to rename, move or disable (e.g. using a tool like AutoRuns) the following files:
C:\Windows\system32\igfxtray.exe
C:\Windows\system32\igfxpph.dll
C:\Windows\system32\igfxpers.exe
MS Windows Vista and later: The display profile isn't used if it was installed for the current user
Solution: Open the Windows start menu, select “Control Panel”, then “Color Management” (you may have to select “Classic View” under Vista and anything other than “Category View” under Windows 7 and later to see it). Under the “Devices” tab, select your display device, then tick “Use my settings for this device”.
MS Windows 7 or later: Calibration does not load automatically on login when not using the DisplayCAL Profile Loader
Solution: Open the Windows start menu, select “Control Panel”, then “Color Management” (you may have to select something other than “Category View” to see it). Select the “Advanced” tab, then “Change system defaults...”, and finally tick the “Use Windows display calibration” checkbox. Note that the precision of Windows' built-in calibration loading is inferior compared to the DisplayCAL profile loader and may introduce inaccuracies and artifacts.
MS Windows XP, multiple displays: One profile is used by all displays connected to a graphics card
Solution: The underlying issue is that Windows XP assigns color profiles per (logical) graphics card, not per output. Most XP graphics drivers present only one logical card to the OS even if the card itself has multiple outputs. There are several possible solutions to this problem:
  • Use different graphics cards and connect only one display to each (this is probably the preferable solution in terms of ease of use and is least prone to configuration error)
  • Install and use the Windows XP color control applet
  • Some graphics cards, like the Matrox Parhelia APV (no longer produced), will expose two logical cards to the OS when using a specific vendor driver (some older ATI drivers also had this feature, but it seems to have been removed from newer ones)
Mac OS X: If running via 0install, DisplayCAL won't launch anymore under Mac OS X 10.11 “El Capitan”
Solution:
  1. Run the “0install Launcher” application from the DisplayCAL-0install.dmg disk image.
  2. Click “Refresh”, then “Run”. An updated library will be downloaded, and DisplayCAL should launch.
  3. From now on, you can start DisplayCAL normally as usual.
Mac OS X: DisplayCAL.app is damaged and can't be opened.
Solution: Go to the “Security & Privacy” settings in System Preferences and set “Allow applications downloaded from” (under the “General” tab) to the “Anywhere” setting. After you have successfully launched DisplayCAL, you can change the setting back to a more secure option and DisplayCAL will continue to run properly.
Photoshop CS3 (Mac OS X): Under Mac OS X, the brush cursor in Photoshop CS3 looks funny (box around brush)
Solution: This seems to be a bug which shows with LUT[7]-type profiles that have only one rendering intent. You can try to overcome it by selecting “Advanced...” next to the profile type dropdown, selecting an existing ICC[5] profile as source (for hints as to which profile to select, see “Advanced gamut mapping options”) and tick at least one of the “Enhance effective resolution of colorimetric PCS[11]-to-device table” or “Apply gamut mapping to” checkboxes before profiling. To do that for an existing profile, adjust quality and profile name if you want, choose “Create profile from measurement data...” from the “Options” menu and select the profile. Note that this does not always solve the issue. Trying another profile type (XYZ LUT instead of L*a*b* LUT) might also help.
Linux/Windows: No video card gamma table access (“Calibrate only” and “Calibrate & profile” buttons grayed, “Profile only” button available)
Solution: Make sure you have not selected a display that doesn't support calibration (i.e. “Web @ localhost” or “Untethered”) and that you have enabled “Interactive display adjustment” or set the tone curve to a different value than “As measured”. Under Linux, please refer to the Argyll CMS documentation, “Installing the software on Linux with X11” and “Note on X11 multi-monitor setups” / “Fixing access to Video LUTs” therein. Under Windows, please also see the solution posted under “The display profile isn't used if it was installed for the current user” if you are using Windows and make sure you have a recent driver for your video card installed.
Linux: Instrument not working correctly/constantly disconnecting (conflict with libmtp)
Solution: There is a bug on some systems with libmtp that causes instruments to continuously switch between connected and disconnected state. This seems to be a bug in libmtp-runtime. You can work around it by renaming /lib/udev/mtp-probe or updating to libmtp 1.0.6 where the issue should be fixed.

Get help

Need help with a specific task or problem? It may be a good idea to first check the known issues & solutions if the topic has been covered. If you want to report a bug, please see the guidelines on bug reporting. Otherwise, feel free to use one of the following channels:

Report a bug

Found a bug? If so, please first check the issue tracker, it may have been reported already. Otherwise, please follow these guidelines for reporting bugs:

  • Try to give a short, but concise summary of the problem.
  • Try to give some steps to reproduce the problem.
  • Always attach logfiles if possible. They are usually automatically created by DisplayCAL as part of normal program operation. The easiest way to do that is to choose “Show log” from the “Tools” menu and then click the “Create compressed archive...” button (not the “Save as...” button as this will only save the session log) on the log window. You can also find the logfiles here:
    • Linux: /home/Your Username/.local/share/DisplayCAL/logs
    • Mac OS X: /Users/Your Username/Library/Logs/DisplayCAL and
      /Users/Your Username/Library/Logs/0install
    • Windows Vista and newer: C:\Users\Your Username\AppData\Roaming\DisplayCAL\logs
    • Windows XP: C:\Documents and Settings\Your Username\Application Data\DisplayCAL\logs

    As the folder may contain several logfiles, it is a good idea to compress the whole folder to a ZIP or tar.gz archive that you can easily attach to a bug report.

    Please note the logfiles may contain your username as well as paths of files you may have used in DisplayCAL. I will respect your privacy at all times, but you may want to consider this when attaching logfiles to public places like the issue tracker.

Create a new ticket (or if the bug has been reported already, use the existing ticket) at the issue tracker, following the guidelines above, and attach the logfiles archive.

If you don't want to or can't use the bug tracker, feel free to use one of the other support channels.

Discussion

Do you want to get in touch with me or other users regarding DisplayCAL or related topics? The general discussion forum or dispcalgui-users mailing list is a good place to do so. You can also contact me directly via E-Mail: florian ‹at› displaycal . net.

To-Do / planned features (in no particular order)

  • On first launch, guide user through basic setup using a wizard (postpone DisplayCAL update check until after wizard has run?):
    • Check Argyll CMS availability, if not available or outdated, offer automatic download & installation (consider 0install/native Linux distribution packages?) (implemented)
    • Windows only: Install instrument drivers if necessary (probably need to check if already installed)
    • Check available instruments and instrument capabilities
    • Do instrument specific first launch stuff:
      • Import OEM files (implemented)
      • Choose/create colorimeter correction if applicable
  • When an instrument is first selected:
    • Check if OEM files from the vendor software have already been imported (if applicable); if not, offer to do it. (implemented in v2.1.1.3 Beta and newer, after detecting instruments)
    • Check colorimeter corrections if applicable (from respective vendor software and online database, skip the latter if a spectro is available), in case of no usable specific or generic correction, offer to create one if possible, preferably using spectro measurements as reference, EDID as user-selectable fallback? (Need to sanity-check EDID red/green/blue/white xy coordinates in that case! Possibly against sRGB and AdobeRGB as the most commonly cited gamuts for standard gamut and wide-gamut displays? As some cheaper panels and many of those found in Laptops/Notebooks are sometimes very limited in gamut, additionally a special “low-gamut RGB” may be needed)
    • Users need to be made aware of the implications their colorimeter correction choice has, e.g.
      • When using a correction created from spectral reference measurements of the specific display (user needs a spectro): Usually very good accuracy/match to user's specific display/instrument combination
      • When using a vendor-supplied generic correction: Good (?) (e.g. i1 DisplayPro, ColorMunki Display) to poor (?) (e.g. i1 Display 1/2/LT, Huey, ColorHug) accuracy/match to user's specific display/instrument combination, in case of CCSS considered preferable to corrections supplied by other users because of lab-grade equipment (high spectral resolution) used by vendor.
      • When using a correction supplied by another user for the same display/instrument combination: Good (?) (e.g. i1 DisplayPro, ColorMunki Display, DTP94) to poor (?) (e.g. i1 Display 1/2/LT, Huey, ColorHug) accuracy/match to user's specific display/instrument combination
      • When using EDID of the specific display as reference: Moderate (?) to poor (?) accuracy/match to user's specific display/instrument combination (could be ok match, could be awful, but should in most cases still be able to fix problems like e.g. ColorHug red sensitivity so may be ok as last resort)
  • When trying to import colorimeter corrections or enable the Spyder 2, have automatic mode download the vendor software if needed. (implemented in v2.1.1.2 Beta and newer)
  • (Long-term) improve UI.
  • Better interface to GNOME Color Manager (implemented in v0.8.1.0+)
  • Measure and report on screen homogenity / evenness of illumination
  • Get rid of the terminal and implement a proper GUI for the interactive part of calibration (implemented in v0.8.5.6+)
  • Better user interface for profile verification: If a test set contains multiple value formats (CMYK, RGB, XYZ, L*a*b*), allow selection which one(s) should be used in a “setup” window (“setup” window implemented in v1.5.6.9+, value format selection added in v1.6.3.5)
  • Add gamut coverage percentages to the profile verification report if the test set contains reference values (not *.ti1): Calculate profiles from test set and verification measurements on-the-fly and create gamut volumes from test set profile, evaluated profile, and verification measurements profile using Argyll's iccgamut tool. Compare gamut volumes using Argyll's viewgam tool with -i option and include the results in the report (coverage calculation for test set reference and profile to be evaluated could be done before the actual measurements and also shown in the yet-to-be-implemented profile verification “setup” window).
  • Complete the documentation in the README
  • German language README (postponed)
  • Profile verification (feed XYZ or L*a*b* to display profile, display corresponding RGB values, measure, output Delta E) (implemented in v0.3.6+)
  • “Before” / “After” switch when calibration / profiling complete (implemented in v0.2+)
  • Store all settings in profile, allow loading of settings from profile in addition to .cal file (implemented in v0.2+)
  • Document the code (code documentation could still be enhanced, for now it'll do)
  • Code cleanup (mostly done)

Thanks and acknowledgements

I would like to thank the following people:

Graeme Gill, for creating Argyll CMS

Translators: Loïc Guégant, François Leclerc (french translation), Roberto Quintero (spanish translation), Tommaso Schiavinotto (italian translation)

Recent contributors: Toni Kettula, Peter Varo, Matt Nelson, Chris Daughtry, Ilie Florin Catarama, Pierre Dubertrand, Joseph Wohlscheid, Harald Puerzel, Riley Brandt Photography, Harald Hugenschmidt, Visceral Psyche Films, David Tiroletto, alain perrier, Jens Hartwig, Carlos Mazon, Ian Castledine, Alberto Caso, Franz Senftl, Sarah Gerweck more...

And everyone who sent me feedback or bug reports, suggested features, or simply uses DisplayCAL.

Acknowledgements

Part of the comprehensive Argyll CMS documentation has been used in this document, and was only slightly altered to better fit DisplayCAL's behavior and notations.

Changelog

2016-02-01 00:32 (UTC) 3.1

3.1

dispcalGUI has been renamed to DisplayCAL.

If you upgrade using 0install under Linux: It is recommended that you download the respective DisplayCAL-0install package for your distribution and install it so that the applications accessible via the menu of your desktop environment are updated properly.

If you upgrade using 0install under Mac OS X: It is recommended that you delete existing dispcalGUI application icons, then download the DisplayCAL-0install.dmg disk image to get updated applications.

Added in this release:

  • Better HiDPI support. All text should now be crisp on HiDPI displays (with the exception of axis labels on curve and gamut graphs under Mac OS X). Icons will be scaled according to the scaling factor or DPI set in the display settings under Windows, or the respective (font) scaling or DPI system setting under Linux. Icons will be scaled down or up from their 2x version if a matching size is not available. Note that support for crisp icons in HiDPI mode is currently not available in the GTK3 and Mac OS X port of wxPython/wxWidgets. Also note that if you run a multi-monitor configuration, the application is system-DPI aware but not per-monitor-DPI aware, which is a limitation of wxPython/wxWidgets (under Windows, you will need to log out and back in after changing DPI settings for changes to take effect in DisplayCAL).
  • When having created a compressed archive of a profile and related files, it can now also be imported back in via drag'n'drop or the “Load settings...” menu entry and respective button.
  • Argyll CMS can be automatically downloaded and updated.
  • A compressed logs archive can be created from the log window.
  • Windows: New profile loader. It will stay in the taskbar tray and automatically reload calibration if the display configuration changes or if the calibration is lost (although fullscreen Direct3D applications can still override the calibration). It can also automatically fix profile associations when switching from a multi-monitor configuration to a single display and vice versa (only under Vista and later). In addition, the profile loader is madVR-aware and will disable calibration loading if it detects e.g. madTPG or madVR being used by a video player.

Changed in this release:

  • Changed default calibration speed from “Medium” to “Fast”. Typically this cuts calibration time in half, while the accuracy difference is negligible at below 0.2 delta E.
  • Enabled “Enhance effective resolution of PCS to device tables” and smoothing for L*a*b* LUT profiles.

Fixed in this release:

  • In some cases, importing colorimeter corrections from the vendor software CD could fail (falling back to downloading them from the web).
  • Moving the auto testchart patches slider to a value that changed the profile type did not update BPC accordingly (shaper+matrix defaults to BPC on).
  • Minor: Safari/IE messed up positioning of CCT graph vertical axis labels in measurement reports.
  • Minor: When clicking the “Install profile” button while not on the 3D LUT tab, and “Create 3D LUT after profiling” is enabled, don't create a 3D LUT.
  • Minor: When changing profile type, only change the selected testchart if needed, and default to “Auto” for all profile types.
  • Minor: 1st launch defaults were slightly different from what was intended (testchart should be “Auto”).
  • Minor: Use OS line separator when writing configuration files.
  • Linux: Text and icon sizes should be more consistent accross the application when the system text scaling or DPI has been adjusted (application restart required).
  • Linux: Fall back to use the XrandR display name for colord device IDs if EDID is not available.
  • Linux/Mac OS X: madVR test pattern generator interface was prone to connection failures due to a race condition. Also, verifying a madVR 3D LUT didn't work.

View changelog entries for older versions

Definitions

[1] CGATS
Graphic Arts Technologies Standards, CGATS.5 Data Exchange Format (ANSI CGATS.5-1993 Annex J)
[2] CMM / CMS
Color Management Module / Color Management System
[3] GPL
GNU General Public License — gnu.org/licenses/gpl.html
[4] GUI
Graphical User Interface
[5] ICC
International Color Consortium — color.org
[6] JSON
JavaScript Object Notation, a lightweight data-interchange format — json.org
[7] LUT
Look Up Table — en.wikipedia.org/wiki/Lookup_table
[8] SVN
Subversion, a version-control system — subversion.tigris.org
[9] UAC
User Account Control — en.wikipedia.org/wiki/User_Account_Control
[10] EDID
Extended Display Identification Data — en.wikipedia.org/wiki/EDID
[11] PCS
Profile Connection Space — en.wikipedia.org/wiki/ICC_profile
[12] UEFI
Unified Extensible Firmware Interface — en.wikipedia.org/wiki/UEFI

DisplayCAL-3.1.0.0/screenshots/0000755000076500000000000000000012653527012016035 5ustar devwheel00000000000000DisplayCAL-3.1.0.0/screenshots/DisplayCAL-screenshot-GNOME-1024x576.png0000644000076500000000000025662512647526537024562 0ustar devwheel00000000000000PNG  IHDR@tEXtSoftwareAdobe ImageReadyqe<]7IDATx|W%K;ۀ  Tz'$Z t06q7:]N؆ןm;7o\˖-ڵkѱcǔ9s\VSSsՒB!B!+T%M-.ZpS?4?\ݶm&c@޽n#B!BQ˱tR(Ϳ`Lǎ7 e̙Ǝ; 33D!B! 'N3dȐQF]խ[%B!B!~?@%KlqԜݳgO !B! W^g{`{B!B!y߭s?!B!&S"'B!B~B!B/FB!B!@!B! `!B!+B!B B!?ÉۭB!4/@!ټu^}CfF>p8 H!.!Bvo~8 _O!f].Ц~h8/b5x[wޏJ}՗a|+*1bIgP>uyE8D?u1 c:B5SԔF%#!CYEwI޼k4MĿl++u]7I_|^[} ru#c(WY7&aȹ9BiW\_goS~7<]_t9zyxoN{znN ir>mur.b?uB!$Ձ<Ӹ:yDoz@!V #U˖87'qSgԑv?(#ɶ_|lQɾ%;=F=9a2Q Ͽ6~\7]ue=`zAz"?[U>dB!\1Or)mp?.ivmOs)v !=#E{AļxEh}>Q~AD] - "^ "eI]/_/eegoM"u muʟ9NMiA! TUU,{^];טF@M55p)/d[sB!d7k$t[k۟  د빧h7\]݃I_|;NWwvZ7?.XcV"]/0$ڶF=381~s:z~!BvgIw72N(Ң_GȺ9!=xm!9l/:[@#[Nz_@_['H^'27/ƘQ`E>;X׋1>dA N\B5p <3Z\pbݚ@;!|3c"5Rou[^s)b}%œ+.,S'HWb=-^h%O9v an.G,N#-_"{\u:&<۷&N1U; `0`IB/3C<=޶3}{o3/ lD[B ϜBWb=^JX|8cu꤅t*ОT^Ĺ9f:mQ2++.&kL'B"ގX8iG/=L@l8#EB!䗊A:_頻Qۚ=e B~ bEtQ{=$RB7w8bL"ljpcX=C8eEԖյS}Jܿ;6OQScy>&[ n@Ao $ }zYeMWնV-yB>N|}M{mo>8ȸA Ow~VC^~eI!&'׹}1 ykn"o7\=D&. OwGLTo2)_?B/eQ |B!}ŻުpxRP}㷿-%6'1QB!\p!?$4p;ч! B>x%|,ӫf-B!{V~B!d[~АAzs!. B!B~0B!BB!B!W#!B!_ B!B~0B!BB!B!W#!B!_ B!Bh B!B B!BB!B!4B!B!B!B!@!B!!B!B!B!. dߠ6l@(BǎN!B!4ߞ;vY=wC8qf:rno|ii)^{m|=l߾2h<7hӦ.Mgטѣ 7zzοa!|Zʽuam9[n_|87ܳςbB!B 8cnjYץS'hҭKן"PwMĸǢ]۶Q'MWLŽw݉={6֮[n).#=}Wc?F8#^W_~Ytnدwo}OU>3+vӻ;B!|؇:46ʶ(OuZExгG<W^{=~<'x,k XvM̺tT"v(&^o {vZ絘ؼeK4940t{zZZl+<-5n祿gddh׫o 6@!Bi^@22 6EhxapUW"'2gf#_(h:O>4fϙ;1\U^ VՂ9O?*c*лW/\zхҹS;P|?}:Ub@?u|9%lڼYGMw1Kvŭ͍}Nu,Β-O8n,P.޹xa}E K-}8 qGpyI+z{ʖ|a u}{!B!y f.MN{L8Ɵr;ڴn}Jd;ҫɍ^v~_bo~k֠SZm\p>jjjڛoOކ?kų/=迻j}\^nڈޮ#.:<}qnO>/I _Oݿo_;\wfVfe{)SއpǘFB!r$C<}-ZR;uh_*H_ܯcDŽwj&[z64Ć:ut@2p6'ǸƢGnmEExw@k=EuiF,jouZ irF2Qm eYj{sPACmn9>sptN'ܨc[ZnznO4]E睛0!!!B!:Oy󐖖^=k!~= /@֭y;"'@m-˯~/+|Z?cAbǶK{}9=h1\BEe%^} *iW_Ѓ\4fkysi eq" &% dd}5Mxڋog͵W]{_4}Cn?@OVwCe˔PaG!B!BHSpGr]EOqN消Z }_(1\)+z9 H!U{;rOx#)L:x=6}:~Sڃ/2`aa64ޓ"PXbPXPݖZ8ꮯ'B!'&F~0sJJKѱC{,Y o>{lL^lB!B& %d('s.nÌ0,{Qo \]Wq%@H PݱI!B!q^D/%7ם.Ŷ_)a=SHΒo[;2?@EH?`(ۑn LGX/Um Vpd=x@O!B!d+߭qgװ^BiH&Spa/hӯ YKqSrE/:<^ ? 80"a#TTԄd~B!BhWeZr*3ō=RMH(yUf?}Y KiSUSdY7TQ ǏV-KNg_(CR2?vȿ_9!B!7r_}SXەaZ>S M^#V5X=U5_ XUI 6#T\\O!B!d0Iuʸ^ $ `a RbGLPOX'AՎ[{P\%KZg '}Vwim .S{=VT`9_؜/B!Bh_rūnm1W;/X]2WHOٱ1I6faŲ|%џ9_v|t]TXY"X[Y~(/?d OK"F#>jv B!\r!_.1߆eѡBw1 ߞύEYX"a_IA6h`IJ3XukYN׿&<fFx)gi5bR%!B!d_4 JQ߆ZmQH~*3cB˶Taiy zgfD=LlX@Duza%fm4W;q^9ժEW)rGg)J\~.^W0Al:gܭb\f60*-}TGRr{v7Rc[ue/k k _j:mFu VUϟ\Qꨩ*CMe~/dDm"-4=[ cRk*9v@IAOTH!B ?w9^ܵ^k KZn.S_*Aqf?3`ƺ lݘa&f`daK :7,TZm%uGB5_Rљ[c—h]6{ݗ胼TN8l,fGZڍo^kCyg7L1/!E1vh'tmG4 渗>aҲL/ʊp@n՗Cx|)u#Ņ'?oV=yu ?Uݖm}&`sբ\cv·s$6v׷QB!nJW=뜯Ͽ~tv\x2|6!`)J3m)n + m_Vaa6K6@ ⭎~e;4ץ.}v3kt:Y-i}0&|9 >|>SN1 )[5lf׵~7¡v/7L({auƜxÙ2͡ İ~c/@_p)XS!Zn87ߠ8>Y1h2s "!B! .Tr%"vu+#'91\\j-ōJ3tv/dO}۾5:PQLL0ֿ"VT@ϣ=,V>5ZadN8r`4z8zwi>%Vpxx%f(l4j#-2!e`Xc"2FW zbv?W~ѕ~d1l`/o[kR[Z̶@U9F,1q8kuy(1e- 1٪xq WwRZmŨ`2@B!B/J"ㄾxnk*nĈȲrx0 {J/LAi$s#Oa Dſ;R3˰d6!v?puOͰ/#G՟㝖EUBL:\MXZ<^f%b]@"v+J1[G2>q-~-38wk\uֱz;/?U%;pgD1b thSޭӰԌ:e"%ݱnؾ1DZ~pOi50< B!_Uzv:^cfT wnJ4_ds5xSmF\wLj/GEȭۂ\,0ිyl>Tð -Ƚ1}c?y:HU8hߦ9w:K S a.:_³_T#3Rù'ɷ R=WϾ_ w2mxet|t r ԥF#r^zY7>Ux8}DGqPlزC fIW9CS~K/؁푝U:k[Ց-Ɯa>5^qa}e}5{9/݁Ҳ ]{?q./@)rbC2*-~|^',-ƤFPDܪo4B!By@pfh*cWD0?+n(Z>"5C9;Ϗ:{qUQSQ#:!eQ+b$z"g?bo&ɫ #éΌMz7Az+ዅ;PS [g1ٿ}xqxu &/ة/[+έsfY; ~=_ڵǐNXRG&؈?]ſ>ݏ,\ 3iȅs|A5œAA~vDwspG )ˑ٢@⨀D'O #[I !B!d48ſ`巽.K,/ġ? HWˀe__DDžH0*PawcCq!,JWU@n^jkU o+t~NG Oxͷ쬊~.cG(X^l+!~֨Z۸}]'67|sy`xnx)OsGA}pG۞E 7DT?z \:0w?[_-FuQ[/8J.9i$.~}y{78e7b?|y̨# Af#Θ D\S]z~ux2D :b{zD4`\DF8rS;U/TR)֍qY~J`gZۨMB!B+QvDĿX~wyjLoSz5>K])!ҧ𣥁0WHFt1hڱ3Jf~篅RkZkTxTl)`[e(XpP<2 [CYhѶnwk*0xzĹߟ| SWV"}/P)x|thS1t3j1\w g n-!%3R=>jk_A}tO*?_ Aߨ:5pt//-W po^Me8QuS97cm6+LEOn" /ZicKX;t3o0# HmC!B!d/39@ԛk} xO !%XrBpy-WkG).x~]zP/O/b?P"K\d0j'fOgĝpc s!3d6W$ Pt~N0c2+`Z2I@yz0i9y8#q~]5>)P~5ճ3Ut4BHkT~B0怮xcek= EX3:'V7BZ Hp2dӟw?[#uĒW60vH]*? ]rt++"s z[w۾)Ii B!5O@vzX[+Sr/0qƅ<.(S"r?Uִk]5;ѪGkwaL[h~P4BE0BJа5 a$F%8żш!ߪe{sQ:2I?bX18p@o|>c&X' Rk,Sܴܙi;o$`VbC1H2@ y [co /g-G;߾P0S';ah I} dwUOeE:P L-$J)sU]:aut'/]h"Vvݷ"NlVmgDGB!Baſ/ㄿſZm}&K\0﯊R \(*@=^…j͢/(n3Aӌ?%@&V-g|er88!c,\LkMImG69z2B ;b!gmڪ UC 7 @vaGoi$ b9R2[ Pb*pu4N)-s7Q]c #2Ďxw9()zoAa+Ǵ)1>YUa8 !B!d/3XK5؟c ^8_6Μ/^Vd&{7NnUoCj7؞/`7!SGB"_ ZR*ؠV`v$z P 1'>R~"TGutי0q~1ޝRv>&~X-uV>3^R^/f=`Y)F_ӀĪFJV޳f78a@|8xz>ŽQâ5Q@ߞ]0k~Rhݮ2,B}f%0$!1_QJ>aʜ ~"2Pۻ@+UgDSMB!BcH1eݭqpd/h;t-ewU*sրH0">3LepE\&.Td_SuToT;~gBӢ2 NXW^#^r)3u=yB3q3oL >L'֓7ڶ9_?fg+Aߣ3ukСg7]|Ĩ1U8a7]tuezzC٭>e%:_1RxsTzHS~k7q#͑_ _곏dgzL UaVͨ>8>6;m5U`*um%BOS| ş0ΎS7O<|Y|:ׁ_i}1# b4tD!B!{nj݈/}:qc?kU}J_hfw 6R5rP#=rukڪj}Xk#ȍjN/D,#gn J(ٲY{ʣ2Ⱦ0j ekwf % N@DܕF!f2ٸ,C?cq?E({`O~ډo[ mfbKcz݄9ք uɾN_6-1G_Ւm[T*o7KˮF^ X1N covKw$Hc< B!!ݠ뉛rI996ۆ{=ߛ lenMd|=:k^ɮS+ߨDDF6 XF -1G"!O-FZ'eq;lI Oq ⇯#7 xu+;̴W`xuǻo~_Dbϫ2=H"G!BpƙgFm+NZ%֝JɖEWBeOQfxC⿅Zeer`-QJ*/uoR (QTUWU֔l!\"?lpRMZVE%KJ Pu%251N dɗH82=],=F]rU# Dѓ@Pȸ^_-q U:? 24 ./hʺ>UwX#m񦦫ͦIm/w\g,җ@"@z|wvi m31r^29"a yyR3u~R=x)Id!B!sTZZQG]Q䫥RJ0o)liԲl\=~ -rSsT$#&T`gB?7bG'臍OdA=DL&^dOk$.6a (*K"^tZvU7%C/ps>Fet$O yYeΈ`U8!Ѻ`?B!BȾe;uDn̒DavcZdJ ڧ}LAs?͵]Ks6Vۢ7oXx7-vA,?'`5r5?f$vc´dA!B!^@<$f[_:Y-;Բšm#l:K:VW?`:ĿLL7,=~9b "I*f%D? akl .nÔoƝTB!B PPֺ뼈/Aǡ,Og[Ke8/Eq!+_DVpD-׳,KN > &="=^,X#~Lgח[x=~w/I10\B!B*@mTKd8 Ce{HYoO6p @"@G,#?q9VK ZN'K?@)1hB!BHCrڃڴIXNofNKc'IͿmbP2: RK4 ODxAԍ|B!BI3V@'@Rٵr$hͨwDW3Z @A{'3Է40&hh&!B!vV?wboi#.0"DO VŊ2}tFM9rpiB!B!{ 'F;~ !+VZ#KZlpGb~}?@#?B!B9Mdv\M/]2QV;܅@a.:@)F$l H@I1!B!}`'s2i5PkO09̑ZGL{ۡ_?Mg q].@!B!9\[z2-;B(͚ Tϕi0j4B!Bg 8;1'fJaP\byR?G-A$@  +'#ۅd4Kyiغ5!v0!Bv ޯ_$^DbMR@iutUq:_1# ﺏ~'؄C!0x#q>888l`'ʀ~rR5ck^;)Msݲ_w .X۰s0O[t:=v$ſ> %Vn*hIMEXh)An>!Ὑ'*u_Yx# 1g֟垓;|N%cpՉCp֑}q}ѫ}>qdjRuRsNka2t,]N9bm($BH1ێHtė!UUSjEpK,Z1Lou}C~PDfk@ 90e&L[Eۤ+a{.Υ*^s3ŷys)ꃶYxuտ?"nOg_B|=o?KWTNeuN=U WlsN1~]O˂H L1½b,]_Hs[| 7 M;fhWh}WiY8l@'Uf$BH`;N"֫<S,vUݵK\$E@!+4>߮sꖞhWsFMT% ď+`R:0R;M=6df_{?TZJTO|*UebMTzϩStjs:$ƕJ>nڋTzV<{XG-(N1BUI)=ŧ7fv ѥMN˽S{;i$#H&jOSv^ǖ(*jRsؾoc7s4}-߽]CzEOkI6%UKQhBؼQk26lsnp[vуbsQEwR<w.^6nFi>~ L~oɺlj>B!dLO!.ԍh b ~#Πy{[jZl0EQ4e=xHr><%=^>n)^dԞDKC S>W~z%Cзs6jɵx=^آnp%GQ".>N:&ٹ|I #'eAN=o{-% wСv>#o 1*텯u '_,f/ߌkeq(W߭T· MO"_}=ϾݨhWԽ6}+W Ɏцuo:\n7ϗ+O߯R7 l '9Y7s#qƝ`ݶCskT9O?/[oHv^vV}/Z~~{{8gtzbαְcҦ G}p]PORK=8눾~ů_`\~3lڭC!BYXLd 9B6??RGɇD:ceKۼ3 A\ƃSxk>;W3@tx䅕N@ˣ`ޔ[7\ /Ӣ{<}x;fckqQb\8Gʇ&E~w%Ur Wy`Ҍ8fXW 30怮˔a\BuH*gU:`IY(Ms&3OhQ#_|~XҪ>OczOV?ߘBLZ=C%FMӒճX˘69հޯZĒitoi޴Ev-kg>*JŴ~vT? {cL_d3O< 'eow L/D*\~- x:w)[, r uY(&W<4Q?i%Kq_]>Z>^=n~O3WcXNI?F)CDr7΅Ͳ&XMŸ?.ߌJ\Jn&>Dw">WgbL-4S3cD XaG˖O)؂>'쥣ukg{WE<,]O0τY:R`.zD I?f=3ݡ >?o:׺"1Yۭ <u:Fߕ[Tİ!,h'#o}:kYpH;\Y>Ot^/ޔ{R򉰖G}0B/.ʫ>#?b$9{t?hKS1+m=qNHoE!Ƭ6B!4!s^@zjTR4 H)q\!g9<^Hmu5Oިp%&\ 2cO묬~!| .SOP-6Ykz9a81бU~@?qu\ kW;2wq[if'lOVnS]r$Z5&tX/Pn;qj۩$LS!oi'2)𘓔Hϵ6mw}U=!tS#qYZM_qyUIdSq.:Ca6=$1Sc4MwY-H}o[3~}間@":)!"wO~$BOʕE ]u4=ez#>B! @hC,AxkD j1v@/TUsXDz|MиM%0EDUYY'cuzU+Kw%xA:^ ^AY'^7{6E=;G_JDXay,㉡f2N;;&eG±lKq¢zm?j=r3uxwm.؈ g92]wRBAI֪E:>8|Pg<{MnsoZ׎{$=D"|Hoߐ`-t1C 7jo\!BHS UEaGF= s}#8 e 99]P c@s'bP:_G*牮L{.>~g{VKDya:A'nvO؟}O%̜2^oAQi"^%~J6tLS͆MH>Y()A=]q״Eu_VN!-תv^[xw"'_rÒzhG'G: nҎM;b1?sHWimtoh B2!kV+J9HZi0wx 0HTj8lYҊJ}H cyW=Ƀm(HA2b)qݒvGhI%bFm lϵy%#⤦%Z[{z^'eAJ0$GluLS$:|SD;QÈ^b~Xh yz a:ς$Zt$>jO}a˹dwi[+__;D&eo\t[dK+N8XiSXM[^{_(AԾm蘦ޛ }{#a5L.q̰Pʇ& ǓvPҘ߽+I`9`{Oton)*׆{& OA G 0lN]rSl0`J%$C-!!@ O BKPB(w66p]-NŖ-}<޻m7;37|3Vw7tlAA#;.mGu}kZQYꝿn 2 mh;G@I5xU-tM\! jG%2~x+X`k{{Cd>L4D U3GNք͍_Z+=69ތ-Ak=%c/fUCy8oxzqtltM09=(BBG`_ JGq/AO_ggu05{;PDWbomgt7ov,My뀐1Bt:˫_4DRS  470=BJџqgyw =G@.)o f0: |Mhߞҧ 6yRI`7)q߈ǍTO퓍Y&{g:fS4qzf<)d}O}llP$Ӂ]yN{߸gyoʛ!yj]MsvtUWʯނuA'tnAAI\Cx*%tzzzKlnpeưhʟu4ѣR?g2Vmك;k% pЗ7LIdu@a   ph lF!veyT5vfs9i/   ]R:bؙ\Q ]yڤz7 d1:t c3z    u"կI|?3ַӆ$wW*m+̤   p,kylA=֣6lQ 1znZi '   5:}(@4kЀM(vnz[z&yti@01M   B6ijt#@̶tATW^0BomvoSl0u+V<Lw{mTJHЕ   pb$n6/܁flQ[96Z @8I/$=A LFs+E'J    Ų v{ݢtFjc=]oܪQS[^*+٠Ү@zAAA>i0:4@[-DU?bu`̂?}2_AAAx֏C(h.+,#@~OׯWKK[^f@gK $   }K>:`vcЩ##T5;G4m&JlEz&N   Amw*yFVldo<P o|$6#4=,#=`7btl 'EB6џ.%2.g$3Gx~  fwiҭ-E[@G<`JmM,M[ڜoغcʢQgm<3@ERg1۵[(/>f8fLҒR!  BW75 ,%}c]HJ-G86VGưy=v7#/V@ 9B8bnS[^x^ Z>b0E]g"{S" AA-lm\Y 4Xt%&[]X!J%.4w1[ _<);e6( hV'6AoD˿Lד=pXn  Яm,Cc`:FO¡>Z@A a"QwNT]hV:3eH_AAA1DшU QBJ؇#FJ1jiIoב Q@^=a:  ],DΌF;#9$ t`|պ`"ipGR' {f`@d02hNp8R  B6 )ޯvW=*U I@O8dk#u#A 6ˈ   3؍٥?а@ .%Ioft!A~ơX%   T؁}8̳ UJcyl':Ѹs#ƍ.TܟŪ1rHl۶rU! !XG,CKM;w/?0 J,U:3?\"}ԑ ҟagٌgAAAQkN+9|( صkfΜ&̝;W?>t ,]C!F_WWǣv>#|K= ƨBnR̙5go}w$_843(AިrV-dr焑Dm٩GaotC  `3DBؼe9p~lE^KL5?nP@Oux衇b2d|ML8+WĤI{n{xw8W<& CEv>M)SyfL0A_GGѣu49 {Gz >h\3V-]!>qlF#}v̞=1܎$#={@wء0l0-Mzlx$[>ĎoM߶r9xiR12(֛TQiJdIQMK-Y?.w ˅>vTc2s,j]>uуpw9}۫{Ѝ!vFqq|>TU߽p>lLT@UuqiX?m߁tcj]PTT  S:@j}0koݸ:58z@^rq;w=4{GsE`߽@wC9D \jc|3fKz aHc5ro_u/tvko 3ݥE̹99kiiGbSߥp۶ߺmkZx z1\|8۝[AA84pv+‹3Enn.^|y`v?H@; whF۸-[`СZ4+VϞxaPkeF ӧkſ5,zcp_SSg_Z}^}Ww4<~ۦYi 2!~,ں'DWԂs&arQq;zvI1f x" m~I//cȸ>D5`r7sk˶Fr\7}.h2j.XQ3w$O-\ ]==.XX? Z<_~%8`@B^W\E|SN{E}x# gw[*%'ͺ?Nwޅ5k'=<<Ǣ%K tao߀gƵ_jji眧8SuĿz;l=AABN94D_WE)'}Je⿠'zf;hSNGE8=(ǎ5khiӦ^s:c6ݳo7X"zr\T,f`ö6g]">x쬤Aryo&8D! Q ]aozo S.MxbJdcޥ?;[@ ǃ| \}LŸʧ/^oɺ>?:n&?{ nl68uutͯ`; SG .íWGXgZ=&4ao+?C:pO6mޢT!QXhbm'=uwe|N.-)nn7 Vý=ZZ姷kĕ)B1sxb~z{a 7 ER{p%i?FM#=z#;3r:f6IMi#O@vW~2+;q͏F3s6%vݯY`B<>7v{N8t6|~E?Y=ul3o-ߦ_f|ze6z iڲǴn؅O=Dhыan}ke$E_[8bL|wy`w~H~ O?dC=>xvs_ Q^c*R9j8rLأzXm:ud%ulB׺&.8\:c~tmxpia  g83+/@N?Ltva=0F$m…M{iO!tfOU{.N5!4 Xx}i,f i0~2/w7g&`ؠާ|O#e &3  ~$-^{N ,qݝkrU'٧w\t1L!`f|SE-_Xl[Ι_~u\pܳRR|zX(C9.-u1Xwos g;/02ΖSOa[o! _J| 1AA{ m{rs]nuH^~=;WQP:W,8ޜ.]⚢bSq\Rlsj<8➞} Ǟ~3+`!=hQ`ڵ8C0zVpG~b=a8~le|o;U<>Qo?+6W:t-c,&0⎮"9{3h& /M3i8`O]KΑ)#隫/,|?83qg?Y^}M{ w# w(ק+))KS6CBXӈKK} Uu5U+@AA88`SO9xަzlڴ2g%{byX9bn{z=Gy6:p#Srxl`yG^=?[+w=F LWn%?H:To<6vqt:j@ju;QQ݈_~TP^ՈaeJުz818瘉'ڝ3ޥst7(90XUpuk:z4tf`/8_<9 m/ױկu|C#oUݕBYwŤI؈-k';6ui_݉<=:<.QB7vșQW[[n G̚*E  _zj Ŷmk3~Ơ֙[WWfy}z=#) `2 ()4Rs`ʕ@7K6ldzot"MlhLmcS@omP%_hB`~qPa:DiGAǍ7n%x7_v<~Y'9Ls%fN{wik+ @!廞מ{p `z+p?l `?3u`BnpOo+-ƓO?p$R̚y8įx-p=wnÓcs{ÏoY* zH}phcipI'3N/  i?@mM ڴ1[۝텙a8P0{lm0a1suz`4q籖4BpXqug^ܒ_^ė/j3?xv5~qlez8 W7 G1\ИԔ%dK rA8˺Vۃڦ VsfϿx ;^ĵSHt60=u^ocW}Dq ?G  hG{}Vnү#b9yؙ3 -r<@΍͟Oc,--՞4 l u*r`֭Z͛Zoڎ W.1qy3kJ`5XWp~˓>1?'֕14td MQ@&,Cv4eW{u!zX  mK(X6n([Z .·{aԘqxZJd=jd }ɀׯqJ_cǣ0ţd߶2-L&('3m8 ~=Taʨxr*S'{SoAA`27fS:Z}WPCp8Ao3:]:K`Kz_2WſGN9Xo%7C) AAAPAAA    AAAA    bAAAA    @AAA1    AAAA    bAAAA    @AAA1    AAAA7}r'AAArGAAAAh;!   }         bAAAA        }Q   AAAAAAA~x   B1,   зAAAA    @AAAn}0DH$g|/"V`Rۭ|>x^XAA1v  EAArrrxRrp*qɩd[ ~w7%("UcҌ8vO׿$s) ZTo!$.Vas4K8$.KW>_Iγy}ޘY=Ñ,gsa_ >9[{zs6 b`S$3O!1w\3VoKki%6^|E]7p J*k֫m'}X77Wm >wa/_b Ѹk22ǸcphE<' _A }h4ti=Wn;kuel֧VHK.uh]g{uسs*"!EW?<xCLڗHX^P8YJpB/8,Oې{GYe`hU{wk/39SH zmW #*5Dpx|\BTD t$-UO k䚫^{~RL^*k7q"X }בxza?O` P~Z M'S1ǒ+إh^CB*AA+=2Dw۹Tݸ1;{fEK3n Ժk*z x["Z7#7F P  `urCAA 'pv9` t>/|nv}@͔a:M]Qɧ)SRާLAi$ --FDZ㱈jtT5R؄ oPeCAȈH190;;+K$1VP3|vyFۆ9s^AXb*Z8 ["+P `8`&DTvKՏ=2_:#b0G/A 1tg&wG$[ۺ=vUVƎ;[ܧ8ߏHKDžߋ#{rsA|r`qi',#i p+af(yx9uj0(}?& Lv Q\sz #lr 7?=GeT܈#1/2O0vX\M| ˃ueCat{6ٛ@Yū0>|M#Ov%K~!gH(_7t(v2|q1E?4m.~o 0f6 V5U4Cu/! y:pXAĈPx %i_WNRSZ3YVQKp -M]0kX&ی9R?G'L3ߠoUҟ9(Pk Щ@χ_d*KN:yS)_|Aa䩖Q@=*(RU 2_w_K5Èd iD'֟haݦC9;@~^,Ǘ0p:FLL~%]8A,EstD26q/Q󿊀#c-3Uu,5~0$~D!LQaMfěĠ-!8,**ffiHV#Lp]0`FH.Cr.@4nO.[Iz>?'9+#V8sV]9Q+bJuKC- +YO.I/`y{#fMfPz8ba\1cb6 rj󾢢Y'Zn%g̏qOñۃX`EPR2L{M`qH Bd2UA10HNޱ͵Tג/?QYj 0Յ:aU $EF VE>oN=@B_=3Љ^dV3?{Pֱa|qͰWm0 zNƷ?UO?ς u=UC• '3v-v0yd _+DWȅh?|zYΆ/#P&$4w.ι~V.Ś#0Gރ-D"2)U*C(̱Pi,"fr_EE b(TkoLmK qwOq'X_h; ]5oBpJ܈f9n=L7?R ^4>~DI7y (@Q 0fg iQҾCI9@TGGBǜO'.coҍB݌qn37u:D{06~Yv܆!j7a >ZEzލeD Z%*?<(ߠ6~18zѪ]EW 2Ta ϗe09P4yFaUF#ɁLax+Ğp;Y><B}i =4%v#f2nyH41 ê,@Ɋ a}2&V>`zF6l\3;\8c\mh=G AĆ?Ys@ItV\H% ޔ ڏy̱vR-0fihF ΚX&`pd :T7ow!7΂#Vayy>u*Fz*AWZz yߎ_: q q2\OanG>ZN,Z-1PҚ"oEmfH uK+VۃgcًS[{# WP)W5]c)-#a2 d@a5f~~%^=OE7MD`،R^Drڦs%I5)a q??0<(}4oaU}Naxd_veƍm:.ozˆN #QGl*EmBÍ1FpeTc+J>8 wjڽ"Zw*5&#n:Sխ J8 P|챈3r;Pc'#qt1-/ۧ~׸wս(NWaԸ 1o!ns*Ԕx\*kB{tnQJǎŮrO_of+8e Kd@r =.Z7U~Ht:_w6ַuMfR bR`o+m5@(mlQ1 '4"d/V8qH |o,y|r B8pw3z)IC }_@z#n`|@qq1?3ԕP6z6Fg3S3wn 8G \aT*P^^NtL2Rƃ/2e>Ygc>A%JEk<]x9 ֞(1p|0 E#nz ^XڥB{xn~ {Ieڵ1s|^zsѣu{Tpt Cƞ C9vVb{ /g?hQycݺu&NCj17ʚ}1H'VO#5h7@)D2I@'a`sg/ozO^tb@NB}ͼ>m+cZ;rsj25ktX)--Emmm)v;quQ,Ir{2{uڻ4ϳjP$~\?!.ҝ,=m fJ7c]j_}x=Jnp%581.ӗ@WU=¾>3ז˚Ѡ%lϮ=f;˨Q;tuOW芊 mȋ/wuݛ2lܸqt0痕o:VNyz@Gj6Ru8#2 GïbQ6]cF,Ҿ/,'M:{ɇEJݪUz? xs|HDbh(WF4}z:RP/eYP\?H G4 1=VFy^Wxmgy ;c2bUk__;QW>X~&-i8toPei~Q*Vִda]VWWץT8A }r1b=  (;5_ۗW}1 e NG*`w{xoq̝;r y_Zȟ|͎*CY[Sޝ#Y$g/m %vxg}Vv|?Op-aFrykg><'ʕ+uO矯-_tu#?^X1v{Sq #tOFH-SK+Shg Nz~86;$^: e>DzBdr4@5FΞpGEgzabOZ:C5\ {1 G- wy L_/VÞ%vH6xN9Yn[lIVѻ+' Kf,\Qn#V4K^eY`}~gHo(~_> @qxO'"˫DIūØ0"-8=+j#TG7#~>E֭[SmzHEpW gWsdXt}}8pg:a",OU\ŪQuUkmqq̚0ZZb q ĚhBb ?Vҿߟj{=MMMM7ݔjp^CʟǸ[uqf-kXQxR~dmlq(V}uiO$LqlwFym ]i䱝.9!yIO=@`n>cHqK'v,8n{/.XYZ: ;wԮtaGslp)s4]FZu  PA4 X l\C ѽ>RXظiqbРAq4|PY~X PgV~_t@ܵk~_G? 0^/=bK{ey>w:^e8P,rFuzrږQ2X1U.=?LIoH&?ݱKW ׮] - C\lp,= h`뤽av.>W/47i׭L7\>#Kɋ.H3`'4?ltIAߕFq߻ߗC1=J|a+F={g?w{aBa(1rpHaϳՋLAzhFq{hq>HL{ꩧj=ԈUHW?Z٠bN.YyG;F[o-Å%Yݙ"cQYӀ*?JgY(szu+Bnq.¡0J enjCjn9~7\87oBp py=d) GmoB*wu4n *h/TGрp\k{S=fykŪ;o ;9hb{^PmVL:]ya:N@2¾I2 r=Go73tiz(4 LExDXX[nc3h>H g٠rqpLg?E.Q hgaGw߭ RZ>)JY- bӳǚUR ^[#pV$پ3fHz68:#t}3'u[^,n `FΎ zbxMwg4՛p[ dlkH$?'SgsUxܫ!zk&KLɈ8:r%6m.ڟ7Jth /ғ7+칱>Kk=)==5Ȟ/ Hh KvsuFK ԅ3 0}*^mJ݃uuu@՝')R塺!~O)FѤbվ}l&䨿/} ?Ϝ1Mod=DsKQl1֑G_4Y.}]\nzZ9+HlDZvXcᳵ_wτa:N->PV=জ^XnIC39.ť˩舻kW%B}`AyԔ.Lgs)t:$T:쑧5.,8y&Ecɭk?~Ā@ D}{:B?'oϗ ZO..ŘSw@xݡBaXZS Y3LL ݫun04SE-)4SͥN1&SIclhwZQ&-7hj~D3TlxN{Z 喽 K6xhwι_:X;'aFp߷+W,u0WeCWN aʨ@CcUZeHmo؀%娬ލ!萦MVGmc_~3 6Fgg7t-6į/C8jHTAmt;Z\tL?%WmDi17c{M!i)(Ò='a;3N%]L:5_8a!bp_gнm߁T֩h,-` kɞ\avj{*!u z呀GRIkp,XL,X~ MnZyZs&E믿^%ܟݽ(xδ k=6+go% ,O}BIt-e\wF*[8n{ܷ|ͱk$[n,7n9:},S^J^ n% 02/T)OTˁÆ.d`PŌŠWU>Q6z*PAU5lh@ (/ÇӤ) #È\HH~Csys:(XgG {A7AXXϘ?Vg F;X?p=λ/@|j$w(!֒Q?ysg ,)GónʝNHdP.*I`^G.-۶ -=zݬӘGbOql [yڊP|k5q*-ZtN=59Mzm?M~GH`NgMk2 j'+1e H]GA)<-J▕NN|kS[Zx->2-V={J=|O7}‚IBV۬:r)+>ڳQHĐa EkIY`~^w0yw2 ;XaXƉlב~~7VD <ʖ}/;)6ksF(h\Fd~lx 3|,#̩8^' iÜ/Cˇi Ei2 c#o*4c$m6:.]>ߐCYMf`F f狆L ,0"avΕ)3F曵{%s'4u5AENrۅÛ|nsD7r}V󨲪7ϫux=D. +rb/T&D1sz27o*bt**sSl!Mx-^{5ӂ&lU~X8vH]/l7`7`i쨍z@h,hdϺ> ˳ <)8;9LBY`}=&[0qr_&4i fO{Jp&46G |nϡ|m }NKoFgbz# ~_rzwM"Tܿ%!ղ0:.ߜSKcR)}@n fk]@S# e}{~ҤQChV'/ >C?|esak_%m|=?E=wNdY Z& @E3> P `BC "suu#k:lu!vò "o(ESmڔ% ho*,z\=tpbaBT4Dp0h/K1 aR}Q"QhԀHYC SG¹٭Kzq5{Y/DQ?~: w#Z>=xcr8rzC4WZ<]RaIJ;$ $BJ) )ևY]A@콋bogAQ, ;(CB ɦ~Yn6M )^vs޹̜3g@1zp>q2‰,""tv|A! ^B>B qN+* ^ +A>"@ ~Qy)9_JsX|O3.&|˪Eu^_7X."<XkhD!@m PfPXa ^Q Zwx/q9=>Eh?_ ')yaPX9JWd;-ac$+@eQL$0_6E>_f5P۳X\Y V-ݮ{OI#_jmݟZf"/>JP*2RtHnn5o&D:ePY{Rz[Q(}n?K6rܥ1rpeIܔ#ž.{+y8y;$@)P$T msѿDE$#G&I-ZNY_M! 5;$w1kē)q2+0N@o0JNlP/oӑNvc3`4?H2e2@fs_cÀ ɕ~c,RPOak >AFGΪ-ȟ?˦JAS/p0?mENEy ʆCa± sK2կYdE `(8JV մÏȄ}]$0E"BKfmUls0pԴc J IN;"{{kU>0@zķP[mZM3GμȇҜCUQPg^^j! ^f߭!qb (ڡϒ[o,_}DR2R%moJ·Iegg}BU{YP_rj bcT"? E.Kv$ٽQT,߰]Bu:*; _G}ìEGlX7BD /.j`b_;|lشA+L$_ Ǟqkj~ϵ0;Tz}Rogsڄ Y4B :gիP`@mJ ߩw*ݪ}]lQnϑ4-͝cQy#RVe`'ʜ,}≠EݓSR>}@()3!`JX/E>=;IYJo {n _&: M#iּϐj '@ڌLdY(]U> N6뱇ZP 5I dy\3eP2S/$Z'HƮ|)B`2K L L'J R.XԺUr5| {*bQSY qK_].0?Kl cWvSTh+|V p.p N+fs)I$>.,y_i"n>9ARk[6hYƵr_Є G}_DR IhH#oȸqi]sam&M_ReOnTFzC%XKN\_!*a~n !T!Ew}UAY^t_4xL ,@>+WC$*7Eb*i?*!J`wA:w-F9-1 _ /r(;!?G]0m_;Kect?! 2$p):.Yyҳcۢ^FmAaS eKpؒû0e ~}O^] $G>̡~͵˥]Ru ޛTR&Ѷx$=C7]i"#'S8ҏL+=7=OLQУsb%]N wKTh$BH1F7m (""_z/:tzMxlnP"I"Xu$\lRPT[plڞ%YCDsփ?)e֯uF.. ƶ%M=Sҹ;iPS&lܸ^KP1Yb4lIUWW_X=ic+_ɳ&)9mŞ3@rrH~^bKD<ɑA%+x ]#"ވ͒PmbMncG;ZsY{fef2}zSQ` 'Oe_"?!e  smINNOBBK6Y ;!&(êÿ-bw@ mÅA X`` qXWJaPKP)5VGNe+"@HUifS&Ս5+~B MӳFtWۥx{'-0!efɇKa`_NffPvGfiyopmǷ{qBȱ'B*H1! A3OB{FT/n0|u]GF!B SJJ۷O+:N.R]}a?;;[>I>!B GhN xf6MIuf((܊cB!BbB!BH݅6B!BB!BB!B!5!B! -!B!*!B!RB!B!@ B!B!@ B!B!@ B!B! B!B!B!BB!BB!BB!B͜9(''9A!B!R"""K  B!Bj)Wv(B!BP@!B!(B!B!uZB!B!TB!B! B!B!P@!B!*!B!B!B!B bNB!B!]@ B!B! B!B!P@!B!B!B!véB!B! B!B!P@!B!*!B!B!B!B[:‹%33SǮҶukq0}(Za|>ԣT&NaiB!3$&&BaϐrM?!cC{HTYv#GTGWuMϿ+W=w!sϗpDiM#G&B!5ݺ Cǟdu'5W^!Җ=W0X$8ObKZ=㠼ګҬiS7ߒ-iiz2d WI~~v=ݬk)5mO!s%KL{0u}"""yJ=':ʄy'JN]ʨ#d?uV|DVГ0!B=qOpiz_@_c (0ee;JbҾRF!T+4Ɨ.[&Ͼ> '1 is3ޔ{0hצmlݪ?[j:?a[^xy:'Ou]wjscO?Be_1zJiDF9 n?$$4џ_+d=~h?!Ri +sss6ùg~?o^#kn򨀿~FyN;܁f|͛5׬['&&ɊdŞպU+4pVعSߧWOB!QMɬfKn^x kڹ17s>XlٲqG3?XG6׾՘_s~OӈBO1h\m{G'x:w^Zm-={p]=ZVv">tEs[HlݾMW6l$o$% ;OvBH<~ˮ={[g{ NL(:tYzwO<4oLf2G>xϵ&B!Ȕt,Ό !bٕXé9JAAv>HB!ǒB ꔪQ {>!B!:Cnk& -YLYr\,}B!B!uj .EEE%B!Bj;7u7ևB!B!BwB!BB!BB!B!TB!B! B!B!P@!B!*!B!B!B!B B!B B!BB!BB!B!TB!B!ʱ*"p$K,,!@"Yf AAAu28 m/(P'={K\8!@nشAoڤi5>(];wؘXV Bj))uZ߶QV"ե,TeB!k]eͺ5uVBjx;kMmDK0LYͲ,1B!$~." J޶QV"եϧ@B!B!` d`pnB!},!689}~;!+5!Ryz ];GYBH },!689}~,daa!KB۪b ybC<)1#mrn2oَzU|JOUR.}-Z-B!U5Fc$,DG7ZHdhdgeWd[+Oу;W?["^#hBH핐k}(+B@U̒mOLF.QR?2LD^Rҳُ˗m{-DŬF Bj|\7,UOׯWc;wvm۲ϯ*5(>SׯtԩVOf͚I`$h})|XծmҢitl\vm)-clu+=LRc@FgT)=_n7^}Mv<56_;yߓHV*Qx0kȐnI+v[͛'o+R~}}{A[f֬Y: 0=F "~'L C(93 q͛ \s5%ț~A?5~+V,Y3p3k{#ezzo#?pWȋI&< iGֺ;vlLY[oL0V\T yxُ?x~䅩8G=UO*OlS湯+~|4mT:v誗Vc-syXzEHeBPw sn{^DFKS>Me#ҧer[_ƍٲ ~sijl_H֭,о}d۶,mڴ>}z _HNwXXH%>g=Ǒ=*"UH%$$RcAAlܸI~΂i$^ _" Pya`*%ޙyKjj Px2kIKKx[t}ԫW5@}MD p >ҚpOFh袋\_r:_.9x6@x] 0º\B>l4B8y!YPgA3q4y{O:$WZ_;w\9ӏ/wT>25!!oꬎi4qyհ ^xAX0 >2܏kwxCc"lqnĉ~xQ!]to(S A@5?ҋx"mFSZ%EyO7P_갵^",S>ּր"O|U Ҍ|4eGo7QFkSb_gˁګ+u0Hs@#cϕpmH2gSiA=ϗ$Sg̑[Ǐ`i)'JOi .]:l)V&υGݞ#_E wy={…w^ҶmϫPZ#l9f+JBBF;h4%%E*=z;_9VVο(%fWi^@ѼysUG޽G ""RѦ\砎:&yy^{,ڵ+Ԑ+T!'.7~[W0R+Xwk ~onUWr3*ɡz,%v,={ȘNNMKTgrȸ>D ҡ]{񋎎F/Z=, َicp g-f팀hͽw`j !4]}՞$iQ<e  /Py}ᆱ￿H7߬gHpMB[nq]>CBM4!4hӦMZh=QNF`V># #N -ΛkLZ9(E]EV<^(4! &L^#J}S³@ n˪L4:o-cPN'xB1sBOW:Wk5;hM ٰa ( *kZ>A ڳgʃf dÆ7(&#ò~0|yobmgވQWuJ=Ar߾ЊYgc:z=i /sZRRSVEqzd 0uBV*MNyW+?&>iѢ8e>[{;Zj#EFDx͋PUmêMh)~(.%%ҋ pO`"9ġ+[K?8wٓP-3 ,x_0pš63 DO301zF788!aX# M\ d ύo dfM7 G}T+7PHrY4H7WF) x7 iýx5ný0gl(G<uƚH'ϱ!ƒĽL;maC_.'^30w q2\%\A̶<1c|#@&.6̳iy<GG Aw E>Mzm҂"0cD'Diy#?K>x*gĥšr"äoOzz;C yMZݗU V%Q /wY*s;fI {4?G9p!qǁ\# !yt|2mnZ'atqEYw3̵Ʋ5Jټ* "> i"_ߗ.@GFD˒3wxf Ks-vo.9YndP{0C1<nB rĈS߾0&f H;ҍY/O)ִ4juO>OZ޲eFhc /xp.* }RK4x zF2f1jl@@P~܄T JoPvho6[ߵ{0v٣?[4oXJjʴ3O4Q/=BK{rڱc1`.}~Z5(|Cjah \ި pҖgMN滧r3 "L/ 306 ^()SJ+;iղ=OFC!rG PGq[J+SVDue#ϨoᕥzOLƜy'3]7nKـQ>>נNFن6Zۼc'yLPM8(N=u̞=K@|Kdd_틻8r{qyߋdmmGJaPdϔ_5%-x20U{!vl*/l-~WEZZvNΝ7Lcїfh's0Cß `WddKun,iG5.XdId%_cL37) -=,&'7n_nlTczR:wrL*uM׬yq$;;G雺92ЙCw?Py`I 8uI?5~<&}͚&HbҾp}~*L-0A6GkJX_5*(aK uR,I%^ ўH(D EUYbB4$:V0[KJ`G9,[R;+x3sR䡞q2$x^,|P&~{J,@ت:;^6#j xD{#_S^ j@aayrٯ<3zj-g !(Zg,|m"qEſ}YӡC|k\B07uN ai}4v~uzUP4<JMu [it Sq'|I'j3r#߭}ui٢E@e%_cg_d@~2euO?߇yؙ6wVc}e!-7/_=͋#]ت: @ {ߍ Bi3 G/V\OX5i€ҀBŴ ޞG!(G./.yNڄ{j''r] z`u022?օc8L>NnM@gb>5khHWE 1˾tR=@G9:΅Z@#l6~wM.\\l':>x ?ST,/FjH@!F\ a&-O>IԭK2oo`Ϳ'/z|ث6Wj5òoNBCmrΙg|Ś&7NԆ59Ի}ڣ˄pЯoa;E+}+.Lx쩧߾:.S_ԛw){LҒe˴^"mZn]8P7k8gZ_0Zn-6nt]_g.pN {&;O3_ W˵W^ybImH#E]kتF>8b a_5w 70vJXmBުUkp!b=#BziF oBL! B փV,:|)z4޷iJ-[ar*Jp4hyƚmcfnȑJЌ;(`-9R҂C'&&jq( G(7P zYbĈ2xqf/,ûR(WWZQ/(o>wj%K.ճxiSwK>}ȃSgt2#w(⤿z6-`0[mE'S'Ͽ NxGE7{gȔq9;1ZaQ$KyC{WkzJI&ҲP8~Z1, 3g՜W-z1YpIЂ7sLqmݎp@0t4_ey5|=[9|i5xw|]ӧO ȝwީä D~B`K6;XpԩSK 7믿^Po]{ٿSrcrw/ij[Zµl}hM{>cpocb;>x駋)&BYUkWIWs_>C.:3~d<|!@-&vlU⤫O3vc1d`V`ZwA΂:=Ko񧟭 }c˰~meʝdDI˴K\t pL>*{s{0Qa מÌ-,9<ƿEE7ak?O*-m{wܩ6(kv8|_v(Ze_"V߭ _J^<jPm }9?>X1!ʃl)'_hnn**U_gD B!21^*u55 a=MYT>?` lS%a؄BH% ϢDEFIzz7R{{6CYT>?` ͚Ľ+,5B!$s$%5EZ4oQgڽ[ZjE%!H{6CYT>?` BҾ$IB!#<<\5mۂ:fma Φ Mk}FYT>?` D,q($BH^Ws]c Bض"|/ uy`B!ʅc B/BOB!BB!BB!B!TB!B! B!B!P@!B!*!B!B!B!B B!B B!BB!BB!B!TB!B! B!B!P@!B!*!B!B!B!RGUFv]9tl6 *{aa>4i"ݻwB!pA!05km۶2bĈHV\;޽{$!±!R| ;J~~z<[^$))0uU2i%O}Q9̳%%5EKʨ3Δ 6mw-1c͞3'`7aΛW^yAmٺͯ<ΖRνbW?ķ&@zG!ukK.BkK^^^@Wp\q!J :HmͻOCpS'AwQ*l}z`"9ch /͚IVd?Ȑ{ ^Tҡ]{{~$v*7䃏f_ ʭ7(4!nSWyL!؏5 %cN;Mrrej{iРn(-W+!^3<P|7l ,_R ]۶2.:!(FrJ1IڷOK(giؽgܵk<*a(φDvvVmۥ{׮j0t܇'OL)W1Sר|oXfVaÆ׋bu6qZAeSr }ōB 10lRF{-yRd`}@YA Ḃ +!5G`4΁[.8.N,\RCK2㭷%##S 褓Pˬwf;g~r+oO>\7fTЖII u=aZsW}܋/Η/f~|]YG ={ob< niM>sC6Fn>ݠC߳Ǟ!7߮zu lQ _q#H<-xKwh?+G+PO^xU8pP|99s1ɲeѵ]t &Me(Lӫ:5 oq#J`a]ZҩLx?Wp\Av t0f{v҉ɚu$Tu<:WluU\@+@k wϞ' *VԍmPNWmw_jٻW}bjCru>ҩXWp\A hgӛvȘ%apZ9pZk -6@^=rE"Ktz :(~hǞ>Z^} 9r䈞uԡh:<{:bܽG6MhR2^M֮sP<y Ξ ###|:w8ٶC ¢cʜdaaU|iz[nh:^_]&x=1WF k!Rc H =\C=Kd/s3N/q>W?hb3Z|+8ขRD k4iՙ ٿY0B}y ft_wXYڻo.-[;,3Çˌ7smmc`(K|r{TG椧s]LLuFGK@`f`ZV(PϦ>|ےW>\w5rYgy9WUR/4Ǣ5~w֭^_^|Y{7֊Wp\q!( KJJv,k6jp};kj%AXXX⎵\(a6,/}zҝG W_%M&Ⱦ}u <_a`+ L֨@5}ߠ~}9僙;Ҟ^={JʼnO_8a4jP/(`ӫ~6]Z5Lzxmn'<693ڻ򐔴OeWz1h Ru,esǎ:;o'9pbv@5؁"S^Y Le5dPpá=unvv>W?xT =חjق +8 :ҥKeӦM^ͩGܷo_zDh@9u ';}n_xUYo>W<ݐ7yN40:]_zz"?sr9x-IdiT_w԰xxy&siղ<:mλoѽ>O??DGgzYV2,1xһDޤg 0DbOy> Le5VZ Mh?CK+ߝ^_`c98{;Lu{;+8ขHfΜY4zA͛-KxUY/}uB7;[bT#K/sH4l[:/˳=Dg?Q.U uy vz35\yʏXŽ+1؁ƾPl !Ԝ~> WBH ={v8DaHZ[۟he-eygs,:~6vuop sÆoBjXS[ZP~ +!$P3 !B!*!B!R 1 HM̙=3B!WBh@!B!P@!B!*!B!B!B!B B!BB!BB!B!TB!B! B!B! B!B!P@!B!*!B!B!B!B B!BB!BB!B!TB!B!TB!B! B!B!P@!B!*!B!B!B!B B!BH1 EEE~Iڗ$YYB!BHfMIB|1C K%Q3B!p slشAoڤ)3 r,?eB!B䍮ʚuk+` B!T ZcB'B!BH8A!B!)wB1xH!B*P@ B!TAǐ ^Bf!B!R?*³=-6o*q{rͷ4gevAY倄IMgx>DERWjh@!B@-WHpp\Vf<}%$Z쒋;[ z2{.yar|Tc%?{E/$@қJQ) 삠b`E@إ " ) J*%}dͲevwnٙ||' R?rD"D(!6:k0!"UddɞqC}ϊC~oZj% 9cJX&w)΋IL,+T&6IxBYss=rqoazr K-~\;~g@nբǼ+Cd r2 N= v|3vYTdsA[o˸*f{f}g?QNII/NLcRL&*U*W|u:Mbb,@P=;|Zze?gmJگۼ6eYpQ~m^eHGJ+#kє2wMBE?8y^IN>>mr}eEDH"$2<_ )RX)[eDG, ɐ[z,#۱ID!RfVlKԟ%~S`b8tj!7Nԫ'Џ*a $O9K?k;)wuԫSl >W$33S=>Tխ#˖KtR\ B`>ƁѾݾWE%(8HMt–&:P͚6\]Se+@2d}\_+zh٢#sj׬S8^{Ry̐{OJxHIMy@mh_HŊ{sU.3Wx~&]8Kg J'ʪFgV>O>:uJZO8.?-E\G{7_8VFA'Lgcn"_r=zμ)Ggez<0q}ggނdo\<:A۹Uطޖ'SbNR_jfo)UrR|֭^irie"9r$^d5z-kwiJzfHpU,l)+'Oqi%@ȕ/-t(K<>dK<)Yj~A(Mz_O6SA;):(TMvŠ9deeɉ'tt,4q'y o2d*(DFWS,,DsR]zgÄ6p}h{8m_VZ>}ko-MT[5oM:0aҩkWvdwHp/O<~҆VXZaru6HRr[-խSۧv㈻tIZ5aЧ^} 1'$ȻoBۭkWy'ߐO'V+QxvsB[</˕wSj=y[eq,YVqkׯex?~m^7j$;v^!{2ӻi,{e,B!J+I/+e4YpI<̌|+Smn(68"+}ǮMTfϖ,]CH͊?K$!gFJvHq#SuRHGtpIJMcI$,Xc_إ`@ڦ֖uiUZ$8qRL.+WӧNI -Ԯes/(&'pc`{[ۦ|Cy6a dڵZe\4Nlbbj%Wv,+VR4 )}{/=`2᧟.u)!!Q|9iviSYf7RGrek>,m.t|O@֬[g+Qß}V>}˧=Ik{JHD=L|m9KmZߧw/yp}N=Ko>kZ7B.g5ߍҥoˠwt×gNSrƆMnu|(_[:r|6xԩ=t#~2ErOGVMrn~*7n-[TVۆuo7N6b 4><0DߟKm\-zgc`L1Sq?ݺ^sK9_YYx{MAھ3w>ڷ&vq!Wz54XqtrΨ !c7}&x0yͷdcCqbki]Gc_Jezշ #Gɻo!^|iTTI&Oga8ʧjժ2GdY|P]|Pw~5j@ @Wjj:sri& be:ɓ'N&f۪px]5\{XpIC|{}Ya_.U*GʏKԠnSrTZE? Sx,zmnݪ.{T0m<gZ^_ qO>6n.q#h$WPV-[Jm8>_&[Oؾc[ ++Wk{ 5j1}5)2j=RX_˴XJsInW+ +׸j 1g=W\u\)o;NDy|Amh!< KRrMxɒ%:Q<¯'s49}:-߹-ZrC K騥qL /‹eIFFx$++G+KDRN_؀ nvAz~v}6umF_Ŋbwlwl޺UƎ-mZ.U[߭'Ͱ.XS8[aAŲLhn k<[3m!{W g5mzmfgj+k\;k?ciӵ5,5XszN@M.Oy {錙2M4;+r3O+A{.dNMJU: EŁP T /Om,A9U(_^ߧ xߠN/m|ӿJMJtBybNǶ A K:^*_9瑟^.";|6쁲l2ZaӨ1[ #Af0<JJraL!+w)-5*!=҆sʠ{(/#=[ҥiӴёŋWyӦ=khPYU5$+GȦ}$#3\CKj.Pg r4!UZ6[ClyKrxx1yeKwo-'OmZ 1^Nt꿵ˢ1@d*ppq'/גYo|INiԀ`c2bthguڽw;x{G[ʧRE.,T/:3-eV/{`GZn._IIIR] 1t֝ņ L b 9PQ/%y>}i7ޤӾNK0FMjTua9u߼eKuիw5unW-<pLaұ(.[.7x843YnRR+-r}c@^P?X~a+׸j \8|m3-#K>t\֡Yu rK?<.C.pDFFY]`=z7\'.ÞzXJ*i{4C[\VZw@etyX!+˜eOȩ* $2ثO$.GW}]6?T)Y;sֆ2wOҾm[ k)&sXXrZ`ǓdǑyW|]3^qw:=,36hkXz$VTYk|fOLɒ.W3,oWO[ow*(x#;^7jϿHV:xu|3T޿{wulC0MbR\VJG' 寿ː{._a~?: {o0^aSz!uԱSÝ[ ޶+;w9?&$$:ȡxK0tR¯X+܍Vɗr &{ RSu`pzIAU^6 7w)j,]\ W5Oa ҞAk֬y.O"(GB;O:]q썍Ӈ=ȃȳ#FȗHo%n ~U}f> 3>ʹ.]ZD>?+ޏu{Ɗ`J?_{w{ąNۣkܵ_ۘ;(H^t'e2X"f~evrJ4iܘ B.m.qqۜ~읇&%%K~STD|ycjrJ_"sRd6r2-CgoPpčfnyeUR<-I٪C< /w|]I "#c5|_?B!*Oxm\oYib{ip܈7<7poF7<& ,zBU&+de:-HsÞ9}7yZ2l/<-Y-@~hvygOy(M2[4ka  |t\}2"Ywޒ]wgIMaDDZzljo|/zZ9KQD [ާ)WF/+zAU^#Vȳ҆2u+VrϿf7ġz.Ox'YyldZ)#W|9y ZmyX֞wwtγCEeXᤞ=EӷZO(.e~7_/^-y@ɋ6WڶB.2pL˟<U$%%ttjQCXMjTB~]̉t}p)Z˔LԱZeu̵}>}F=ۆ&ZؓVhg&8gfeSQc통BTSkm 7aAhQgG`ZdIA c,hJK⽖UrŢ_kGs&\ÞqA@!F l-Z|>PV\7tHF3s\9aР{٥U3IU%2"Z)$%%UIW*-UhE$|w u!Up.3K+OPv`=2WC!>΂} -MwmWuݾ7_x7 '?p?dBGGQ]j2{e8ٴl lհ4mX/L K\ h?W wxr%!4Tn0϶EȅEX恭ٿ !Tc @Q&x1C=}*/ _~K'־!}B.^pU.,s)PLB!ND EO0BB!B8 H/B! ;sQ"8w`+SOIxX8B!rB9GTRU< KKpvFB!BIKO$V r(Sv9t@!B!~'<<\Tl\W|B!`tʒL\NȎH!B!$L!B!P@!B!*!B!B!B!B B!BB!BB!B!TB!B! B!B! B!B!P@!B!*!B!B!B!B B!BB!BPߞ={XB!Bȅhݺ5KB!B@پ}{ 55A!B!\h@PPKB!BB!B!TB!B! B!B!P@!B!*!B!B!B!B B!BB!BB!BB!B!TB!B! B!B!,B!B! B!B!P@!B!*!B!B!B!B Т 4hԨQC$55UN8!KjXsB!B{]ʖ-[(W斅B!BȅΖ۷ҥK%==]e߾}#iii5B!B!|V@߱c>jժCCCDriiҤ]V;&1KRXB!BHQTɓ'aÆZ+W?S hk=˿a >>^n* ,Оڵ.]HDD$''Kƍ%$$5L!B!/z͚5eʔ)ҼysmoԨO7 0++K|bŴSN!{j#UV{uQxq2!B!* A6l^~O=.]Z_sq?zT?.NtR=/WTRE+:u$T6m$QQQ< ?^y2!B!* AߢE ㏵p>`_dfeɎ;eXINIVWHxxDJcHzZ&ʑ%?CGDHJZҳgOi,s|/7lJ,'w B!B@!QB3fW p'[n)Y2RjԨ$ѥ$\}W, XdIgefH* Icvٵ{Ԩ^]_ ϙ#_=B!B!0VnAn6IȐWظX)U2Jԓrei~b:Jp ?" YRbT>yB{:xX! U]1 !˜eV݁렔 gB!'CƎ+N~7$IIIqRvui޼ԮUGʕ %xH%&ՒSԮܺMJO5jIL/ifZ9z䘴^$vO v^i`%::ZWhrر̞=; GF(c̟?_oܰaO?1fMr&ޑ*~)SFj׮-}QHWQŋK޽⫔ӱT%=:j:ulٲ+|XBOnvO(@'o_pB_69?T=GBʨ5\#d)!-U4ic)]N3s$3#'mM`pdfeK0\q.=%x"+WK]"ZjAYK%n,G͛KJŸL:U矷_ޓ5jZ-[&8gωQ/FyTR: R4xeΜ9Z(4i\qն[XXMOm׭[W/9s|Vtb(A?/\{yU^Uܹs (^p>(1}E|PO֯ =zЖYgegHӦHʕxx0 -gm2 5ȑl̔lj#A%u$<ː2*JKcB%9%EZl)u״iSy&? 4(r4#V0ny~QvA_-2j?uP>¢7 k=x`>eHllߡ=ys5n{@? Oaա1ڂs{;ޫG_yEW>s#n<a?pOƬٟvl5'3S$79%HRq$8 oBQ#yFYFҗ/p|n$P玫،o2{>wϦg̝?ߘͷܢm4k̈1(]&}!C5k4ʔ)cP¨Nu|#$$Ę6m's3fΜiԩS3J#22xy5su5g>}_҂qϯۍ;8+_t;Ν;. 2BCCP*]Fl5;vu_WY)wwT1w^Fz 50*Wl,Yӧ+Vh{СC 3oTZPByVG>ݫjUT-Zϡцzy}Fԯ_5jaoP$DlhkNG|΃#sտlz-]4sPC%:۟>/GyĨVf͚^]ogksV㌵k[li;ksO?tkQnʕg۶a^WAt\r%ԩS-͛U[:tȸEԨ]s -Ѹqc=ԨQׯ2ԝ +VXcWo7Ah_渆i&K\W\q /:¿.^^ޣg?1o㶕>|PNލm۶՟ͲpֿO_w7*V@?Ƹc9ߛ1 y^?zsRB['@\+U}dϞ&ZP*VsQGV缿Y# JOGvz:%3reڤD ZZSOHDɒrM$8Hdz]k:u@`A,P^/6~xWS-2gj,3faeȼB΍>..N@"7xlٲEԀoQbQœbMUiZڛnIʠ&[ M@Xz`yW&s΢^4%bA8:WɯzBy²2ǒ7|S?1,J5wDڜ/Qct)AC^}|V22Z2(hꫯt}QGw=ź^뮻W^]cloM6:!O0:`~qgٿX|f0&}q 7%׼^ڲkoT['Wk*=t &sδj0śoYkNeZ@i;8-J~9Zox(aMyGݍM~ )˞pv|{<׾Փrup?gVaK/JiÍ>eYirUW]!7Xϐg}Vw5לeu{XLqn[oԂ@.]l3} pmח>ڜ7}~<3ۗI2eʔ~9s6\yط93-h@_qL<uVmɁ ,@N2fϞm@%}ϝczը:G{v|Cz5u9yJ*0V])/gz$''͛3,Y;oM):t5ypiݽs=t{;:oVޫG_yKE['05@rligº\ma s22ady=gwHҿ4[-WZ Pfc,U͛7ϭ\;-;vM8pֺ〷kO`_>ߛz[OOaoYu4aaG?Rm-+b>ֲAw뭷|Zi%СCuy,_\rC# ]wvU`bŊ~^qSNusVW_pU/bMzm+>"Vy84wiܸq 2&N>Ռs?hhr-hS}2UbC||i>g֭/χׂE v>~o /W> Z恪Ck wYkx[E-oDanl\ M9 \]>$5U[KAa,88D0g` %AxddϙY]"c$D dճׯ-NIJKUdɒ \Ỏ-ܥRe* wݐ ,b[}P@enVp=&Ug@>|8w*+|g[ͯ7W6:/'#?]Qg%A[]nqRdIuS9>a* &L@f͚5sAڀzpƺu, V<Ջ7mjLwmjz7|LH삋<,a'lׄw/¥v05&p 1xcڵzB7qD$\ϱ㎯R KY͛7p>2(h~0_D9]ߗ2/̼@uBAo OlZi#IZK]v-  bRUusM -Cɝ8'lCSTRE"ĉTPפd9,6]tk `(*X~am¤kOn#^ca,_͛7p@c- c=u4wX><_ /ef5op?,;;kv2a=xA(7޹y]}-[A;T['$P!\}VK6mRVuKkl湼}B_|!\zkMɹ: ]Kl$-[)aR[DwK pEws-pnWw b1Acjo3ߺs=w{3b^Bsb9V몞 `()Ƥ?Y9pNj1x9@Nߟ@3s "ú~a wb_gklv;b9X%FAV0po ke|ò=3>CQe毼2>˟ބ3N}@ωQwuz+ ;oEs=%Pb} 5,URHnh!׶d#R܅bAyt,t7 8 ̔b SDDFf`Qp%3m%s `,>Oδ: }z'C5ݽ`ń@`b}ї>6q!Yc);Ei|;_@l#Xbe}3N}@ω.]o%ޔya筨} }綄X h#K4m* a%oظAkq4ΈA\e93+K!ɉ iSp 1v-6.V6o,k׮}m_9;?bS*ڡ|w/(;[9r~ʑ{J\lĝ$vbԷv!?fGb;ȱcDz`e!%~W_RJRn]9y*w Ow&?~g[`SٳWBI%'egIffi/^ƙVLꗩ J2=B! RB#X63xv6D_!B 4kC.<.w6 @#Ö*W,%Jh>a1l{J`iߡmxݺR\ 9 tY>niYY]PIRS$+'G'8ؐb0@mGF!w.F9(is<"Vukח J7 #6vnz˿9ҲyKY$]:or9( *kזHOZ:ҵ@NvmI!B!B95%E[س90\?NO9QṮ:Az@26z^Hd!ғz'tzF&B!B_[=v4WW>tXm`W@ŁA6'<ePW*99r8gJP9*gB!B @>}dg}r>, y0!ɿ$@ yn'%7`pV׭+eH4ٷV$`˞ǥYfyB!B!TlWJ9"%9%Uvܙ+̫I=Y %y%O`z +_ iB[pPg@)* 6dB!Bt]b!!a&w-YЛfL!zv8?opb,!oHpP>@PFU(/'˗lϿr:-M%)1Q:o=!B!* ȕW^) %+3w ʆ  >a:{-w5# WWׅe]wI2e$v^v 0%'cB!B/^\z!{Ȉ QҿIRRR>뻳Z 05AyemJ V z^]32䏥4dK7A !B!*-"G%#=]JDEIBb,g?? [o 3濳"IHR,;[BvޫXsy衇XB!B'uk>22BټE~m{̔`#A d-Aw%[K~srM)q{ʵzI:uXB!B7]tMȞݻ$D ?Z.-uǎ'OQșm%/#Ffg.YY_/!1" [^_(QHIb!2dk:}ӦMc *$ϟcH Ĺ ݕ}jR_i&C 1j֬i)Sٳ?{g5jH?vء*VC=dJ+^xP/jժ)`Fǎm5Ӷ~zΝ;.Pa#44Ը 5#~fΜiԩSG4qsW>|X]KMmfx*<N:?gm|MoDGGgO S^G__AeLnݺFXXӧO\k7V3^C z\A]arU׮8;d޼y:՗J5aǏp<}l\NBC$"2B۲m|Wԩp"ټe v/.ёQb닚o/i3fgf˚uVcꈕÇzY H ҄!8/寿5 r} 7zܹsEMW_ 괩I,\P^{5s_~xz,;w% O?x?vɤIdʕ&Z2n8QPqw?gɔZJ_W ȬYsM+|fddM7ݤ ݻwo>둚K޽E dK.zW7oDMo-[k+\ѷo_9r䈮ۍ7괙mS\:ZjpEA8x`INNum]wqhtl\r,Xy\y啢W]~=oڜ~ڵKuرoC[w{f>e٠AٿS-dȑ2ydㅫ4.nݕvxj}x*ތ^vn[n@: !r^xXҴA r^z!֭3 x^{kKkoeoƨ1/4>%c+[k8?i{cյ/xߑs={2>cɒ%2 %n;vHIIXɧ=f2w\_՟aZz>wn4m%h˰|ͺ,#Dzwֱ.̙g|-Wwygx*Wu)< F^j iwJ(=16X)cJl9%s^SگoŊΚX1#7>d„ ޼C< [O}J;uu{_dẇ7c7`G2euЙV[a31-ζ$ܹs&Os&B˃ϲymHzq}Yf=VZ\ڵ,;&4CaAI6mDMUYwu\ݱcǎ׉rp/_iĺ_x = y˖-UVǀ@ ּ}S)HBXĝsU{e;[o-p4.nGewowqJxw䫯~ZDn}Qx/B!VLp`r'|ށm=&]QzJY^+/'pIT *H:wI9rlZNHV,Kgn4;HY8\L i0[TVMRGd^ILbӝdrw 1f"Oqu)fLUbbll`k6ݻw> EnŎ+{GLWT Rn-W+:\Չ, Fc l? h6g_sۗ}]{KiPC?Ay|oeO< [Oef~gx<Û6%>nMtpc,t:! (A!Ws"d ^V/FLaGqݻWkM}B! (_>{>#1aS>ktE[x=E;wX8dn &rx-m;Un]dln؜TXQ;c)=9m'4a{O!?*CLx m۳gkF_= ė2sG+NX͛sζtW΄kr}ݎ/_n;vZ:\Չ;wmQlݺu҈qoѣG2ǂ? VV/yn+sXD}Q뮁}]q\%~6b-ammou~W3< [O8:39wf2iܸn'5 /,={Y=q<³ݩS'FxB!߻8 ͈/6OwyP/UgyQ>Q f5Jc/ul[uuGͷiG:۷ooH;@1@dDFg;+:t萎VXF|16h>|8aϵjղ]>͛u:4!J4"Fk0\r]Ե7p5lٲ!b7گu5aEFoDʭꮜ R'ޖ:?G0ny_4ɺnhu3f6ͫvc_סO+*_xFOuws6*ގLcu5>B!qrB aVqOk0} &E)=(#,aχ~w-`邲SyzSX %|_㎳mFw6Vڜ~a~Ϳvw/^C@t kmIDžsG\۱۟tl'B!$\h>978[|^ XC}׬Y#Ǐ=%x'|"m۶d9.B! BHg!#,CC!n7n8 B(`}Ԅ]WQ۱B!\ j Bu8'$p`5lqB!,B!B! B!B!P@!B!*!B!B!B!B B!BB!BB!B!TB!B!TB!B! B!B!P@!B!*!B!B!B!B B!BB!BB!BB!B!TB!B! B!B!P@!B!*!B!B!B!B B!BB!BB!BB!B!TB!B! B!B!P@!B!*!B!B!B!B B!BB!BB!BB!B!TB!B!h={6KB!B[㎠<`i/';'~IENDB`DisplayCAL-3.1.0.0/screenshots/DisplayCAL-screenshot-GNOME-3DLUT-settings-thumb.png0000644000076500000000000003167412647526537027343 0ustar devwheel00000000000000PNG  IHDR}_,XtEXtSoftwareAdobe ImageReadyqe<3^IDATx}yu߯gvg  ABh]))KcIS$rJ$UT*e;IKRdE PAcwfvg;],H@?`v>{Ų,xG;~0 xaiPK_ ?9 yP_2?$> ] G^GH&?@|R\ |OYx ^] )A(`Xv gO@HAvBv:(O$pT<u++byC|a*H}e]^4 mVipPZ+n ?6%ETEetqy$5X*OH100(jܕmevj'Bw|m}-w HbָFu-WH:V1T0`0 =MZ$ͪcDp$u, YTW[fɖQSΜgxϳ}G b_*SODeX8vsXluڬ|u)_#*;mxWr6okѯ(!πGɓ/>" .[1Vt-<ʠ<"p|wl5XkvR Pi@sLfBhq.bAOm`ܷ LybQ&&a۝+&$I?N3 VPm@[W搟_q$m<9zDʇFD/.]igKҥP8 .-U1R^}L._w={ 2gS"`$awѭfqW/SZ hðL...Vѣi4.~$r6a&* `$npm8Z-OF2oc5Z 8ۀGZ~>H&J> Eu5|wn-cT(fw%&.xn*eX$%b$2%db~*&m &B.'h\Ņ[I X'"=d*>$ABώ'T4;.qME@e25+bpccК eR,ۦ쑠u2IUq\#/lg`X=mޟ[%,cpLQp\Bę;*@ 4Sڣ Ⱦ X $̑;9 ?HFl2C~;X ؞)UQ 0bi1_p(- ُкnж>aDRhQ卆mCv DmR:]A٦Hq EX@E=0T/_(5P#[l E'5KjH7WJOW@ѽKc?I&!"X/&D,PZm>]1-f1FRF3aɸ&*&X.ԈbWHIkLR\ȖIENJ"P*dߴ nH"2CQ#JjI`&8X ^/@8J _($ ?l̇R Sͥ #t펉R3򛚫(b$pFe5VĘHzSoWmfx K6I~TmPVxuԚqx4I#Mpih*Xڨu#Aa$Ƚ`㫨0bOtCf̞kYJ7 X5m8Xݜ$\%qmgf#[ȍ=qXv~ Çl4ۛ?6z;߳W#}V^Zw6[gۑȊ}O rt}6/Q sמ׮Ys^%hf)HbqnW}Nb Tw6i=q&)`j{FqI4]HXwYZNmOƅQX]U\Y#&9*~tMG cg5kKoWb]Gxc[?<-_-cPaǴ%Xso2ىQɹ=WA:Y̙+bч}~MSo~0ZݟzsvCRrBCoB Ψv6M+F?4 i{GrݶhÃىakMDNd(,0=hO<.Hz˶ ,G!R[X.v۷;ac pMƂ,VvPC4{fb:ֵSڥ%> \vAb|$OKjW2G8C! C (߸a4uzG?C/5 b0; &fp;E8=xh¸e]'?5\ ZM1g6tۑqfmD <(:8b zdQ&iOpr #Nv"f^X !Z$#7=;^sN9|8wuIj(&|fDCC20ƝDkP |5,(ڑxև׊lB+ g*=梻V^=}j֦ ~`#UvDw 9H=GNȽ%jH~bn'LKǶ>O-DtXU\ El'XtyrRl;thv=z_## I3A |jYσx{X dI=JۄVƒ? LC Tv< O=THx"깎x!;9gZpg]%^jH AoEOϟ܇Ds鼾'ᜬAcz'hx_`'>_^B]7U[Dn^݀5鮎v:XV86#148'_qӫb1COQL@8fn9γs2/KFQT;36Ir̯*^&bxqS(b/~ v 32{[(JNI" JbjQo&LEC"EVfWM\qamۨ|'qsITpWX?uLL5JXO*tC0zڹ~>N,a$n\)`:2; b^h oLۯƮ`p ҸXFЏ9$'0=9&9/ƹ+ch7p靫r;_VM NR ~XEf(AtM49^Av0E3<܃q|Q"GP*"`A!$QTD#)te :y~uր4r~ ʕOM\]fo_ F:vΝ#:ƪEjRW}~9IX46lG#y$$ vE;z8 ܫu:vJzec#<<1 xqhf e|BDT*!d>&ֶlzxꗉ&$moX"DW~őd>yR` x7%֎|= f[q{&&>qs~;- hQ'Ez"R겭CnoX="w}1?̵o`iϛg~\[[%(wt6ulع'm(ϒAU<+8G U!&**)!h6_j'66iK!kկz~R"u˥af]YY+F^.lnUۮD(ܶ0isL=+2H.ƖOU^}mvI\x1H??>ȱydIϣvd}9\JzPG'7AG!b6VCSXU c F@ 6=~noݎS[ZZ5ٳgg}ѵAܛqˆyX# ~2Ce;`qaC!iTi0>TFUOU~fjǙbB^=|6}A Ǟ=X>&6H[h=3vمG荨/ {?}6<)F*$a$!"0I'i>рJrE+81T,vkw~!LQX"8p`G0H  I%ulW+(}{cX[ZVEhJԓK&cI?zDW֐zK$CkW`.!` itu fda5H2RcyyMlVDzZf1D:f| i2MvBw!A>7!Ii!:wK$DZhS~`Z$̝PbqdՕp< R=@3{dVa:'Gynlo҆P: ^8-A˃]Ws#Y]TIYHKu7"Md)箖Kzz]H3зz&36!e=͙]gfJΨsz߼? Yul\%%9m"H<5Ȯbi፲~%EmgPf@ gީd{ }7AlM~@zuV<+zih,&ڌJtpP{0K{n6h]/~xo4HZ;z"{ъcǸ}/RNR&3(y!m"2lF۰^`OU͖krI[v" sޝ29^72]zMÒZ 17:(ך]b"0tbŭx{'124הD$ƭy4Z$1a| J"mA>űZbh_N Th]" N~ME[Q$ߝ;Xd3r=KKk2-7[-)Hjf YǮH{u5x.PW%0R~2< 0h, NFnmďX(ijpѦmuiR/ mc^x(ݫ,~~GKH_-hphC#]Z=ILO[S >{BtT1α0QbZ % #CC )Z &Y vjHz\:m^d z:w6۱v^_3r}Bpn+`:5+|#`xm;d]**ag4^\;nNnjVZ:%/W^d>$/^-‘^l$-?yjG/+/b_.ZH^x x~BUSL$$gًx,TH' lno`tjK H0P@cq1LÙ.\zSmT055rMolر`gO_{nc bt:Yw}TTܟ^,bx*5rv4) s6DG \acc |y ҦEGAV$$D4$L c5,.-cbrFJ ß9,vJ*o3!Ԧ_9ҵ7#g[^`/e^ݵ].`bbzq@ MwROQX/fO]}-3S.Z4xXccqFހ;MNHP"off7??I魽2^[.@0!bpNr`ྴA\oyw7>!ۥSQّ QǠNJۂ.w|HeE3ov^ֵ;:nJФJ<ꊸy턫VZV/K^n%ZT 6x;ݐmx*G ,)R,^pJԪ0בbgtHţ>+I,9{+R2U<=wV%N)nH*eEY=rfVb}Q$['| f- #aF#_b-fa Ce|<ўbm4>ݬM7G{ ܣ} WFkvw܇ gېp @`+\GtvjܠڇQ4ZV_^&e5mRo5|Vݤwm.~Aw4ڹн>v8\n}i+Wn"!>8 kxN( rpo-R\@(-;ҮrdW,|q2U+! \=nau=1iåH9R."pMiSUPfڥ?*n`*> dUdZ<ǐr[S{st=١~k qggIɏ(J {NJ=cdl)ZM߸L6; ;\*B7Tr LJ< [orkTkVhuL u~UՇX4@˵vx5}y C֋5}x~6+k_B|t+xOq|~ 7nBR (#SxW.J 1y/|8?ǵ+P|~/-c Ky_^{vfEÑSȹ"Ӈ2Z[a0aܼzyAfJ5:!qhziJO{ mQE"lQ J׾VcO].Ĺԑ(N>q/'B ǦہG@K&pgpha7ef4Q̯Kg8ó Tq-Tҭ9|Æ%ԧNWqA\~:B! >[X^Z 86KzeUb^4F4ZmgJKf:<'j#Ө+pȬLDNML!N#WP A‹:W!F2T^9x>`"@#@|dg^HܗH(E?8IP8FVrU$Y<'Pn@9sᖤj4ǃe0:>R=%N1J`P}$`s||d+++t=A=$FuNNA˹ٳg_?‰a 94~ZFMh8|Ν}FQG?A3vu4[@~3u\<ܜ3DX5::37ΞCU $H!frr 7h%7o_3ƣGX5˗'5HvW#cv/"]ǏtؓSȭ.ci%| -2" "LL>} %\(R,l9xƧ17wM!U,J*3&Jzs}fj2xQ6QbjzJ>.ILqD>s9DjJs~,^>tl_M q+ B} NA/?ۣ>5+zssW{{1xAΗݪ|K6o|Ppp|>Kprk#b۟Wc{_Ul1;Z+l͠sDd6 |$ VI1/w}Ep$^YY@ťE/t蝮dL54[ໃim7e.߶Ādתm+>nvK fd2Z&/__so`qb~ ftc8骴G ->l1::OS/|sq[R$^l}F@RU\nחG/~񋘝#1}%;;zt>B\B5I$c$Bh&V PFMON[Cn6P4tAc)9bqC<djjo}^¿$"Qj琗iKbahhJYҔZCRH/&gE (;dnrrI̼4ڟ:d x|^ms}K4Cy&'lK{z˼l +N/6yt(t/]t;Q]__vpHG>\{o'ŶSޟGBt?WOWuB!B!]@!B!B @B!B!Bb(B!B!rCB!B! B!B!P$B!B!, !B!B!g1 !B!B9H!B!BY @B!B!Bb(B!B!rCB!B!'@Qv!B!B::;,B!B!4+$B!BN/4#= 4=C!B!q̹)P$=tu!B!rrD=y9@ 3 !B!C2?snN!P$>&+=V~5 zƵlyQ$I|vOr.6[ !B!]]ld 婀"9 @,m~Wm>!B!Brӝg9N̽$8mrYJٞU!B!B%eleQ(t'uT'fC!B!BI'_̤{1" P$Ķ;OWDcB!B!\%m_ ~8I|?{Rе !B!bҝ]SmbٞѺɟP$,_@v|- !B!bҝ埆t0e,&Q(t%sbϝKP~?!B!S+ТJSG{^~~ hYa]>'^=枛ͥ.ԧw.~x S!B!SxLC$MGaٶz-lAms Y[oašsE'B!BICu(p9#׿#] -J0si%#/k0['\W]6E/x0qM4X7k  ^.7|PyB!B!r~MvO?็8[0L!xVbgb7n@}e'/1]Þ"jӖ[qM7u'Ϸ/{vmG$N߯d_b˦uiH!B!NN͒I๋߭`W`0œ"s7幘FmNӕxNjKz-(ȫx܈D"y5FMxЯo-[W_˙Ϝ9suNXr9J_0h`?(<|N[Zڰs^)¸[;RuHC3hȯ۶±Ʀ6l Ӂ oM;?c̘1i)))w܉|dY:p{>яkJ !B!$yfg] [J #^Yx:63J\ŏ;cJ1ZK0%Un,;ֆ'W>pXC>8\_m^W_}U{y㱜yOsruVUUnLEP#ɓaKq`=nV)&xG+0t''-/Bf?&#8x>.xcUzeU 6~;/+X7GfܷF7` 8@rQBHݻLlټ>kP$B!ұMb`a>Yd"Waa!X EьyܜysѣG?cI;v.yI1󫮺&Mx^ymСi@!(*+=?F<~ӟ>qU+IWGVZ`(oI?}ku2=2ƬYs϶47ᦛo߀_U9B!BH\:hxA?\~W8]A S'#! Eqۘ~}ZxПlʵy2Ro+W\Kowy ~gu̙$6ȑ#䍗SY^x'w] &N9AUu5>kpMX3ǽ_%ߣ '7׭5}|R+Ȧpl޼> IP<[W_)1cƣ~C!B!$4SG;: ;ǡH"M* (hPki7o?SO|ixNUS::BRRsٜlkmM>K$e90g:LT ɼOݻvJPъtc5z:Q,^1L: /L1ao`͚U3g.f^2KxMuW&motGƟ'.~d;*k.v?B!Br3)nHȹn@W݁&h3Nr pn|oC x.Cu&y0y( #/Gy 9'g?ii( ◾*<Щi j]=N,oSpuP.5MokƠhZ8d\K뿽+:(*rAy557_-Gn`M-(.*2.(g>--9:VRݙ|Xҍ5gv6cǝ׉+ /<5kVK>_4O^ߺu39*Dmm_/,efyps(*KϴaU(,o5J-(|n:\N6K{G4{کMoyt,OIPXNva}'N`B!BG^t,3¯Ö %: B[L0hS8ǧ#3K.;8֬Y恓uhnjcIq?1!B! B4ҙnHLiRԖ5Jܖ-;f]ENv<L-`#r昂q7Vx3R-˕+fWWW"%pg\.DQD"*Mtuq*~eM/\#B!Bș;/ = 8x^=-'# B^ƀ'*pG4UP=yI.'CM׿͛@!B!g<| ؓH/ޭ 0!B!BNח -t$o$B!B陧I>,B!B!g<|HzaDžB!B9s@҃  B!B9@7K>]FZi#$V6+jilƶH>r:pJ*jZr7vh+F֡v_o7A忺lgDXw :s8yPJK9jqm}0-h#~5x*Ōq[Ҭ*L%B!rtdv ?F i=la aȐN_5*p}qܵaTߌT#HpɂP`rQt{tpCW܈%*ضȾ#tDMRD4/?B!B!@?4H#m)@DWWtơH9PSeyp@Cs*c2g% 5BQLq8WTiRsd ~Y?UnR!B!rP$Q\`f#[ǪI`EZ;L qҺ)%5TlkܐnjYGyҒ0!pm=:{"'"xO7*Fڅ4Bєb/!it%B!BȉCv*之H kB)P=i8.ZOun.]Z)EI s5!5֟Uj*Baʼn _e\%,@vXN+A$,,Zu iG!B!@?gȺs% 0NWIqve-p_?GV59}qڱtĿ))8\wZ w ;Vy PYQ UqIOMKAN:&(1 ֟ A!B! @H8ll[Xb[ZZfh-]{l0b]j흀BKs lE-D\W,DrgE4[߄_6?R(B!B!$Bϙ`h1ZQi{[HaAþxqߎ+z某{{H[6?'.,Vel)7`]ݗVB!B95P$^ ŬGo#U~TGŀ")MåjtEW6!CQ/ÁDFM* dĿthsv b  _[T!B!rH3Qw 2҄PdH`뺪"aUSJGDѧ"hs"a~iXoH*>XnDЏE}S3b́!B!@{ifgE06"HM =iiQ qe` zln ρbl DfMQLahEKC+?n)G!B!S@?)23Uqiۺ[ѮĠtF $YA?c׎J"ЇCWRU%Rz(V"=҄XK[ /f qſN? p!+~Rm8B!B! $P│r8EDTw`p! &?s+~w5nW Bqqx0O zy +%\}ng/ᷓgerEhG,2딿h@.U N.O2AߌۦǕ3'ᅥQXRuJ8اoǟ4qF(vA5XePpuSs7A `x]q^xegGQF$؎H_UϕlA̡@)1|<혎>4u1kj14೹~'vP#`ZMVf0*"[7O5>yӯƟ⪾Ң-@cGϿ̾ϾV{L]X?Ŧki*B퍘lj/|()**}Kv[^i*%jv!exmG^SXHGBpFY۟]U>9_sֽ: E~,x?C)/ !B!S@?'MI(_:Z%?k̤zUVm<*Ovfol%.4.bq,9t 6/f ~,ki]YVCZ}cq8]Bd6fL˦Nè}ހ^+nK/o7]Qcz޽/ae[> oOFihc?r뢒]?:q$V{跂k3Ftfxaptr4 Qg↭F WC3z(p.zP3:e B!B!BIeZ笭8v/No~88t9PR'j;VEqw!.P#)ZOmnG#Y\~>n #n h \R44⺥)um6ݎCSW/RRNx+ޯ^.؆B> 9@ӷK2xi>+*rQqmpUQqɶ,_ӧNB>ջBpy}=>5G1DZ+a[CqP/DPn@8쒢 G4 ݡS$B!rJH@V:̈ "d>5@兪h(X ȁST*芌ªؓqp/=`߲"o'}g*<4E“Xv R̺xav ”phw<%P;"2i(T)c LK87-32?ࢣ] DwAA>b$o+7jQ^(Wo2Q(Wϗm=#`JC 5S7ݒ#ꯞBYO8XĨx޿`Z4 -.HHS\"@F/l3&2'wMO X飈U<F_ -Eh?Bwmxu&௯)p3l@Q'fw$G'Z~'Vۈ,cIo!jjɴ%#AՋ^zU| mM%XYM56NB!Bȩ ɟ },OIVBk_l\Xfkq^㸠!qja3!)6nr#!d<2y@9\ߎ^s @zr?g!l.yXw]X] ! Wg?t%7 +zxf@Olq4 ւ_QRbœdWFDBqy_ŘԴW>v| cіirpBo ,ҷo?sK7KoJ\0[;ebaW'G_^gtU&ٺc/5DPR]sCw開K]Q\>݌,X ۸q`6?EeiЭ ՋϓA@F\ӯ^-TN# !B!S@?=R(]KX)X&@w_!ZJU،+иGVGGF#Wf_kPN!F?(vs.E:BľVe?t́kh &hE;+,:q۬ROaK\ϻ`<,]sƍf$O,zN p,\8i4>yX͇sfס7]*=ԫגmqF>cg?}F{\7ΟShFԐWO$\Y- #ټ.ϴb p^cY6%@iYi c2s4x Ս5a;^#~9.z[h)MjʄB!Bȩ %[tl⟢ؒOGJswPZj;,ftRWT]r ?TjBl vD RCjxew+b0nیug#Lk LhhjIe].sCoY#bVzY?/3z$~/,݁~#o\|`xb)u?,F[ž)N8/7 ˵źX;nj;*(k}=tڛqYs65E[ᣲ"aoG(?~b07L|V-+G[=4- +4 H!B!Bj}?\؇*6kL VVT9RU (A6$\8p`591ctf6 =V-?I=7S`΁FwmA;|`/ٳ 3R\V@ 8KHSTEAi ^ys>ve.3Sh{cN)0w⟈Edpkg͕KhqS=:BMrMEױ/kO J/7e` w~9ޟЎ.)Κ1znaצ;**=-OOzB!B! %CL/CKJH/P\kB¡H53eL;:Mѥ'ĽE*ЌGQq3hhM%~b+-P5ƹ# ͸0]~VTJOTȾ!xEUV<>ԑ\b_خ{  us.ݷ]a$`}xdǛ^u0-K|r\"vtM3GY;n/m؋.FVcf/S1f@7ίш~!5 S _ OQYz.33Obk'.lީEX"tcp* MZ"Pr=u a!1Lw^ڪaA)i13 ORI+6~x2`άYZnznTLYw 9uFkEfPF.ٵxeN.b?ڝf_#mQj !gпWZ{B,\0v LZ']} gId{=_?q-V!aY#:#QxrNT?Ik? Vja&cX"Y>zb FsS=Wfb3OD[c!B!S @?,fYi֚y%%} STԤDÄ%1*Y:#thnfg >4T*RbkujP=`O ZB[`}›2"30I4*' Z0ځ{?usއ$~gp7Yqu0?Z&-J cЬ.U5u)ɵӰm!EG?i)@)Dn}FE@ ]|@{!a3Zꥥ\V݌}1Io p[wW^OQu2m' @Mh/kV`KL 5Z秏zQ,^`-[6#tXbW^8oNZY- +ߕ~on7ΗZSe{Z}}V'#)p)GW% J{iz J:>I \8;˧OC6!´ۿoor}۷1F B!B!9I\020 aY0*luZ5VBqLwdgrPlՅ~2杷]z>Ǝ{@[nJ^=?|%-B^τ|'_G쫺[WNk MXN=7eYOF,zMK.k6 g gAibHoi Y /`\6mlZ;e[~;۰`rpɄ5MwPX;Yl]X]6_ۏ֓y"GB!B\QHYSH-%7{.[rôɓI׏,MC"/iMQѪB2]_,K ĶHCǪI+k Ր!@$,6:"VXE̘n&Ͳ)9/a#2XK/jR J PXB#툆#֚ 1,D ~XO+Y,ȴxv杰fs5pbA?Ѱ,CX5EXoxI״@QDCrޱX8('58f񼨏B,(;n<#"MY݆ )z~;IYOїpZ4 Ey;Qw\PM7kݮ`9NH'.wIO6B!BN&/wLkšH5jm4w6jCg?$=@ =A04Rf|wύ%%nϔ uıXʑFQ:p EDZX 0W }WOZ/~( slr;!>!B! P$= !~%ȴPJ|FHk=)o,: /h3غ~p8ؼO~R[qV,nr4?đ]> H~O (§uEC(wGphiU(ÿ8B!B! ijKgòK 2Ru])  L?XCHS)56Owv%u/=h;ny \t ֦]E.uXb#"^AB!B9Uj'ȋ>)k-M_/sߞz<! 1/jUĉ뜸^bVaBg5*9X/6CqS d.te`LK@ 1d_J\P& VD C3^.b CB!B!=gn[hHz@6dŶUm9VIKىuYY`v{. B10j ~1Y6\=zݯ""qi+'<>ۖ /B!B!A! E.!%%䴄1;qY~`z v {صLk?"f%+o_SD b]!B!CXƐI[ +qk/?#"Ggf"MOM$+o.?U0Cw  !B!B{(.~%z8b˜.!6ZD6 CPzmt/a{V_MgR])}h !B!B (a_/!5ĐR{@JK(t )m7!La+%,҅? *, {" !B!B[( S2 Jϳtbi6[6 1Pl[=n&i(tSk~s`+L+@9y?Yі>z0ј߉nu>Q 0Qud5(%`1Ҿg3p-߀oݙ=&B!IOf2H&\_2Z q|Y{`'RӬz/YR#!']y.x w> #Oō1aPt̰I̬Sf/\2Wl݇?uV\;u4`M}4%g~?-?y(l'd3Fa:?ЁX < O3f=q)s8~Q?T2NO<=%cԁ|%mXo';㺛qg>?{ڍ2V\5ZF7` j@=f5 7>3Sk+W5F)! !B(`xH'8QS UKTLMoyxߖ'60r4|A3: DzoGLaqJ (?qWǞ^vLːNlfWעߺeoѸu~\ z슙W]\܀~wގ:w*C ^oj]N6[SVbXpS=yn%~ݔ]L"|^Z*GWV7^}-^l=nA͛\t{~<*흠v2W~E>㱕X'2GOKqb޵i˥؁F|g!H0﬚2 O\\RnVVwu=ξNs1E}z}|.kݸ>3݃da'>fL&&?]u!>>sKF Ǔ;z W=tv Jm WyxuhNUیkLg.EwXgc닾Gw9f$Uv뎦h¸kǗ/?: z>>(9.&jTWE`Ƽ ONbeGnԫL}<|cr]k: wKzgԿ#ލ߼ҀFOջgQNxL-f/."|SӰߨ뛑\uqK}uoW)nL\ߍ}mQ؈SEFyQe(\G+ǔ[Fp{[e}+ƍ%؇=qcqY>+AU߷ 1ʎn1+:ًX/2+GbfܨiɋXhv:z9VGmmFc}QNB!P$:gODHTak+&ncbZR43ΫQ$.1t,E|ɉ"-2ւ2؀pꑴTo!JF9)<)O!,rL c{%n7q?:h?'8)Epmenl.üxX4w9.cǓЮڠjqbԽ $2BY<>F:~c/Zm?tK9uk bA[NgzZ5^x?xUoՎVx_Tч<{;XOkѾ}]b{gFIY|?V[+̾[\zU}:y/yx˴tڶ|kĊ9>a?4E\K?^3y|}ݗٺ;13lsCF|[@~lKp`GcA_{=<Գ|y~$b\>z:4mb2; ]67 %IW&%2VJ60)ԓN PB,OӳQl6;3چ_߆WY&f,ƭk۱IB4_?*DAen],zOq>X5}1ՊGvt}7:X=.CϬS>dX;FUƱ9'\F~^lo6}6ckDZ7k"-M8Ѩ*vWrUT;2DYLd)+Vouͧn*j0ǒ?)uHY a+Ι:f˧̖CxP Ϧ6_6 'W#0rћFεFs|Sk@E]3=u&+Y5FԀ?oVl:q_t==+භa¤an듰e+rB! ! a;CJQex|` c*LRճO6Ix䎱V79cYmXb K`˘Zۅ7iu-Mmu$hWMB܂=?&i$o^-5TK>2/"HQŇNu=k^mNދl3xo }_`kqݝS<ݷD5~iI|&OvX߆g ۷?mc'Ƒ>mj} zޓ֫g|UƨG~Ox^2-l-*|7QwS5[qlIYF%3t<@#f8OSw+6`{I J@B IH!!H#)CB`\euntζdKG;wgg}y#XZ1 7V|ov_+4G#5@=iOa՘wbqVp!B(D|h]hВ['_jr:{JLDB[T7#,PMSR@lĿ3|cC ;g]0CJz%; jV=k_̝o~ gx!Wע2&l$bQ: YWyb"EEx?|:t@ge!6V#]#'ښ6}S9㽈WB3(8d-_Nj8]Uak|"fL+3!VQ! 9j]sfN ³pCVA7ڣ}ܧNKdW p`:vei(ypsp ?Sn\tdNiw$mqX;ΚgbJ{2w@!C!B$z!vc'c^o4(Jw(\4 \ު-yZmjaڪXY9_؎]J!`15 jPCq.4KP5^Ԋ:VUCqD7O kl[mqf^7߼~vmXR5ؖg3Ni~r;ExlK8!_3d_ݬKb_-G['O3Kcm5ޭ_,OUڣ}اF,ye2 ߘ3;][㽏jɾ^ CSiӴrӸqi߼g]>l,^߸̏7NV\17; ׮ўn72 JS,G|Q^c a{ l\u8GՎf}~<~uk~ l#~~6\|踣qjf4>}µ9ukq磟c\XfB!~] .T^E?\+Km$?09X ILnt-V/.UkÐ1\#tUw; r-mޛ֖> !B!| t&B @5QXx")zРT~vЙ!UX"`k33_HG!B! @51]s8O YC k%6Rp*6MMgC|8Ѿ. B!B!_(្ {шu=gM,nWş vٱXB!B!Iȉt)PR$L_g),Efg_O:aQd 2'݀ !B!ҷHF0%i&Bk9_zL^gwS2uNMZjAB!B!-(1@w>CR!A,[PK,љclWbH-Ѥ%M 4HX~zN܁ !B!wH0 ?!P?p.۸]h4իԙ$#5:B!B!BdMG~SE@؊|LNvfXݙ`]!.Xr+ !B!BI֤p be C7ꐃ.]s;4_} F !B!Bz $kS--0`v7%/WDnhJ[6mZچg!B!BIdvXV" Q)z\u-1aYo|)y=,g"HB!B! $kR@+5 3z4c 0[5tf^N:XvxKۙ/!B!BH߄ ɚxƩveСPy=]: )knb[ʶ푀mwf6kNKQcGB!B!oAdR%ά"5_Bʴ\2()V0-A@=؊+Ȯ?+B!B!](< &uoVm8rQ^m0f`@KD?{IKU0?KB!BP$Yc LӰPE۴xagkjjkohtsb} B!BP$YtXcttMjY"`0eƍ,+LuaH~Q$?{L["B!BP$Ycw(yYSUxOS VZ[HX! ݲ b#ېtM$)] B!B!@5`璗]L e چm˨'^k@: @Kٍ>JSKa$Et/=B!B! @5Bg+9fXYH,A-[r܎psV6 O/(D"o~m-( IYG œ(uCxN!BH4]xuy bq'B deN55LOGEeikɨlۈV%!.C֚i Iנ]0|E>Iד a5j$*B!VhkkCIa Ee}Bv dȦ?@'dgSҢ`8vjI[s5DK-jmc.xAUp>HF`MֆQi9mH zv/Ib${`"L2E EE@V~A=B!~OLuh@L|Et0 5;?a,BZ d$OC6ր] ~*Y3^C+B!?^ﳪ_h!}WkJEm!#T .Šsa^8!Erk#!0 i;f[x<>@1pS5FK_R}:s_ O@Y_[TMk~h D`$#`ds_7_g[SH}()*J`!ïķ{¦ņC.™];@Zax9|\x.9<Bkjy.Eфcml4yùpP&q~/Nn,).Rs^G"/?_f8FSSm/B|sݺ8 Ң z4lN,?±2!9KrCGvsg/߯Ã?]Ua}^qL u~ 1F'mBIҙKxC7Hd5?PO2>˥3q+/}"1bPh'Q(M m?;ǯ >Y>pFsT}s=ԶxmC?_o;{~VOz%zlj!U]dQ o?[Cv!$Y>*0;dB;]&y&obq6q$`8A[[{bv܎K.>hD9:5h @((Ŀ`^1d}(,b>'Oߞ0ky(D7!NVs%^a'cCrzB3pYkP^c ^1~ ~X{OpdBC"*! UӇa)7jZlk Fg%I3^2 ͅxEKgn3Jt%ʪGS'2j|gV**ǭ;ɰF|x-gs+*ń#Y|Y~`S`޲QŴBxJF17_wߍ-އi#Z|h~ v|ܿ˰^<<g^OwQT-yokBU/׿~&J߇1߀r1]:nńBHyw]ڼy37 #u^ƙlVA֬)CSh8"~|ԌǖtNFGVxBtmgmSw֒%BZz["87h14uWd*z*1 19g˰R(ƾmjw r^[kjpz' P$B\ 2 F6#M3]?c|0. nF?1U | Z!0Y ] xd/JaUxӧ AQCmظh'ŶJ֠7L/֎X ? n:NêU (s;f{SӵPp̝;V6^X@\e5]8I 5b:lNGQVc#"^[[Xΐrz؎NK_cogSA96$[TfKD@ᶭ}֖х>(OL)D[v[_ہm-)f]^*czޛz6Փ$ '.-mosC,/.?3&:HT/ߠRLs 0oib ^Hy"89(hܱD}/\d/}qܰ+Ukq+N7+Fix+'9y1ɣ1AQ*QTW⿏y;tyXB+ڂϾ.lPWҾj]xxo91@m _M%#qDQ>K@<(کxwS'ҵX̃xe 97\|q\HJ al|| cC/+ynrw~n(:dx |ϰ¿ >䪗oc~sH1ɛeSrլ\ّQ#TGڱ{qoW&؞lBFEWÇOUM"EN]X,ߦ]C`L&r9pÆ8߾8N㘎P; wa0dXk42B+mNcnju)ݣBPCpES44ꐯXBJ~'D.![ˁv)k8#b\Pqޗ,aO}"8?v.Zn5#{J< ZԩW̛*pyV",~ ًfr-^,-Eme[D8:ۇE!ڴ UYǖbض-(OGHLҹì8$MSϸU|>,Z6D^\ԱH  ${BfϖGҚ. ~|8\wܿ]Ĝ;a.|\57ןǏW{k;*93'yԏ֗cŶvjJJ ]F/9qϯ_.1)=&èvqL0[Q;c619zi7[ۛ0}WHnC[o#pH!7WT!rtX!1b;ɨ=܈*r'iTMn؂ B =lf#ሩcX09&%9_cj&kOn?:(v<}.g&9N;Q:р !>ZK K8KqDRn;4U38ȖI`!3&'Ī^w_@d0F9(Wk \"fw ;)C\!,\وL顲xQa5ZU- @KKM.!0(u!8f@L +R,ȈN!E֡\𥿥~u!g\ObnU?Ǟ+rՖіy-X벢כ!ǚB!mZ::E?iW6NjTqϕbSӁv^iDc$+ sMŗ=Yc]Va~K]]Wʯjh#BȾw!dez:%$LX t4 ~y=?wD,;$ n"d ?agg FblYK$7kXʫ3GbN6(/S^W@ dAdOMwv78:Ӆ|'pH . K?^:Owɸ f4#cU:$:,yWphw 7;Ƭ[*ExxB!dEt~(DAQt'_]:"8spy߿ yy$e$w[KW$D7&\9vBB=@HLk>!B bտtD1(ބsdx+I^ 0ddO[BJ&._6.GyS1ЉlS'cPVx8b?םS;/ZTbkkSf>m^߮ـ/:PL~]|ez/a^)yU5YUa`?S8a6F,V,˼uX|0@(}> !)%UŇkQŝRQHKشTB -U+pc)Gb3xau/ct{M|V9܈E-Bg<P[aHOM܊AcQ"QsBu{șᗾcPb%? s]+a8rh & sƝj= f88yt`oBEt& \O 9 G)_mf8$KK.~Ԍjw4R)iĶ-fG E~Mo=uBv=6a8ҷG! 5MZVGa]ѣGY$i:E}ھ}Cy\Gؤz/j}E(LgPD{6햀<ÞNnځw^&g+Wbܙa<=٦]g@+ISޚ</ 5ɸ櫇XCŖ۟?jʼn`cp9ә·2M.»֠Yi;O-Ĭf7r>yoln<}7@h/pOFfNB؊< _vcj4݀iѽ+^_~I)]~tⅤ[1ʟ{yOß^"F̺G7~%5תNF\ـG^|{pv~3 #.7=g sIW%`tP;;siX[x0qq51/˴E8z\(>>, a8eY* 1aQ'rcC'pv Tk>5ٯn.˓ ܩB?(./ébX_-J{V*]=A8!Bz@$R:pdi)5x ҂+zF,M-ì?- u/I&E$th&m?U'"ϕ؊\ܛp1! r7^7.n ;O_ vTր#qU&?[(d#pd?_d!)ْCWIܶ$lVvхי{/o~gx殉Xg޿zZ:B̗x ظ1-S*c _ߎ"_=u0nN~syJ!>AUE9{c$mxkѣ #l\[}YFރHŘsIx7OՓ)P̆(8(3ݓ!B ;Iz@Jߝwd63{2 (ԷNl;0D?ٽllĩgq5P8P(lz:\ZO/ Uv)٫!mm {E<}fD%<-O!gH' 1],@p?lgXMt+%JH4X&e;7]UN݊ōT< p&G!4:o,'"}E4!pIy̵I}'@s?Nnoѷe3,.>P$.‚^(ʹL85d)c ܍sÈb!~ n6IKQB!{@B>5G:3$', _ŬB:(!B 24t!:M5Bs0"YMm-CqTB(B++d}rqpRГJpLVIdB!`}.} Kc<P$3>.cTa-^m̘~б؅ĐB!{]ϪY2XSW?_z,A @B(B1xjy G*ro!衠G!B:G6GURY:BȞAOۖTįB!BȾS@!B!Bȁ @B!B!B`(B!B!rCB!B! B!B!P$B!B! !B!B!0 !B!B9H!B!B @B!B!B`(B!B!rCB!B! B!B!P$B!B! !B!B!0 !B!B9qliz< B!B! $k$II B!BgP$YpcB!B!Ad - !B!BIB!B!AEB!B!Z !B!BH H!B!H !B!BH B!B!?B!B!rC @5$B!BP$Y> !B!B4"B!B!$khH!B!H!BɊx<Y*EчdEbvr6!^ !B!$#B BFD"4׫'ө'{!Su1:~ ! !B!$!_^^`0 Tw纥 unn.B!{ @B!Bu!C@wOo!b= @!VUU門B|H!doH!1j`3 !7MMM8|pٟ4  @II sN"PXc5B[x !I Ts8$6h[Bz*̈́7a„}"0Y:Xu8?"PXbV+6!݅ !?=f\'F ?>qx|!%J7رFA&͍0tt$I}םذ!ϟB1fݺe0˩_,úFZ)--ſ["B!BBهX_\vb"] PЂ(d1/$e Té #;WgS3ž)*q1n cڼp8LrPco-؎h\ XԒ( d=25&V>?y."1m[ _H:)ơ[mDŽ׮=2/cxkjG 55KJd!~|Tj=yu/R>gn{F+8T_FTnU \ kF-}P^Y骢l:9x^/J^rKe@\q" 2ǵ\U;6qKкEF{-|BH: ?%kv`цfx=q6CI͡5 ioߏP[&aWT2Yh(T5w8"c!E31XهJJҦk^bQT b^m X̙ui{%̮cȑ#QVV<"07/= aw9&)ħ[WKѾZF.>(:y 8vmKKwJy**Ɗ9Tu+>%%zo@'M*m!B^k(&C 4xP,[ր>]72dx(rpbJ8oM^Q-ѭd" z>U,υ.I–Zc۩%yk0$/)oUQHinnFqqHbwXzƢWFMq5v)" ٮj'0,!߉{cӦZyrٺ6)Z)r{%Fj4Rw"zsQQ~}Eq1v,ssP<vఱ1t2N\r%P$# 0ݺgEb43I;oJ:9}.'>RL Ed=z]\b80%2H;-P2@ >t]b\;hMU])I1@C4]-0'kIv`T{03*!(E*q/$da H9Bfep;vnQ9 gG =(*ǥPָ5BbuСC转iqkf$VbfXW=^9f]x}ؙ_)ZިχIDk+PUxG#?1wBSL{L]v; ri*(.1XS-J+䃷Q !|{\ sWH~6DF۠J!$p'%ɪ) A .FeCs:%]\h\ 1B "_&4]!rQdד_PՆ-|pb3}ehrDk _aam*fCkؚH|0Q6 =`kUΪUUUKeDbáQŐr@ԏCrck8v & FaPݛhmi2Go bEQڲH^ցHEBڹ3u_*+1 *SXX_ P*R3Ɂ@у_WMS$dH!]d3Z}OM?#׈ ,vXw1.QY1:Y  OOهp -) CT#矰+Г_O=HA0[M @iӗ3֒KK\ ZZa?cz7~xT [F3#r0"Z"v#zo>JX]_Wąw d!y#+P(kYQx$,Xp\2  K܍pN_-n͐#b.\h Q=mp9 <,]xuz .{@I*+PO㌣#*5"yð hZ.!X,4r5-nhszsa2kq N酬CQ w^!f߁Ч%5d; +^ z&-XZ|zngX*t+ +@ɧ=;9jAO iIZ_}E,e@ڴp۪.hHA ߫N~OP< TYprX_^w-& ~p+mZ ĖX9 :.O j%[|WKkE~\qmE̙8M+Wbui)z䓘? ׿#ת0DY|"<+++.TunL35N~H|M-`SBRHBH?VF2%>7!ġ+nj-*P9w۶R1pE'Zڥ ȿHXKr7_LGR4:'#f MT'R@N] a+pL % @eBvO6Ŀ61t0u6-l.4v[QYF˓5qĴn*y#7Ya#WxĉVYEkiA{7X;=''*ȀSd=*=Θ-WV@rJ?vBH;ì&Ed_5êARTCEtX(p?E}.J9_Vі6VGV<ܩX(҅;u=%O $eІB$@#!>mgZ#;Zc6D4ކ \N<k[c*ρt->nǒ a>ȱ@~uW_f~uxޱͭ|O.?.ElVvbxX~SSpyriQsGŪڕZqBnX B(؈v99Eh?Ñom!L YWlZqp 2Jc evu,K4!%$V'+NAp5,STm"e!ZVF 1D/IFĿ)yaH!.pa`Bik#vWc <<ҟ2BV .<>kmbNoDt p=>5୶CBG_|c}G㯟u)(z/A($J(r*AE1+W#a{ᰂ_7vD\o|_ڽr3>r%d51_s^tZ?t,rPC~]#\ -E3]s-'6tAm/j1hܾE#gP Og).V4aG_t W\ËѨ!=8Fh]G'Bt!"')~S $ݺG{xXV~VjI.<&NC"Vʥa}w亇;^@~u 񗜎cwlļN(65Xn݇H8ƌ@kUu`>]60)Ÿ ,z% @ɴo&.B)RܦJ Z#0t%/l Q>cuH}58x˵{Q=gBh97Wds7>=1ǫ%p>" (a_{w,ZQ\,yS[K-՞߸~o KLK ɺXo$A^NjV5XGR{k`jT8sXQBH}xr1oF&NO[G+ifhCv .OwlʅO|i qu"B-%n<&gLE\Yd,/FO{p#2|?rp÷%!\p2'آ} ~a vΫIf`agGL`pMl+Tk>>2GS]A/~rpÏҜ8vz]]zxr~V|bO: aᅬ q! k@=΂) +G[BX$d_D'Ŀ"@Hkܺo"?KxZknw'$+qG`d0 zfhgϗ!CqD y{wTW.b1(ZJ{7` o[p®+vjR\vv|^ mŠ/'{a'∛~k NAtM ];޲5 G#54  Yz_@w#-_wS2QBJ($7o&N3Nǩ`j[>DoWu;uM%-w圩g>6?٣RlP C{|{7nQT (t7;=&mZ:JIssP5{|l2͜^s? =ۉIrwQ$\q3/uų3j$u߳+|&]$v=g;>^Ɔ`D\7~~7zoy7ƿ.jY˿ h /J%)V|_C*N~a*n^\ևawƙ0oxhaZSecϏD !kvk \7 ^Pd%uֲd@,`kCMP-N\ ~>of'v VZb} Һ']' V.o,2|ݻ=Ej?j0tk xMuZ 3()n畵\@CkS.tzKA}Hd yu>|tX3o*@joKbZrmD?G}\]~Y6UZyi+¢{aĸ,~Cm+\9/#<HD Qm=RQPBTru?h<!&sRIB :u_fa]m0R_lR*|3X%e:32߃x 7,Ɨ\rq-̲j'v˂uAz`t"wϘ{c  ;;wچy=)Ӌ1ps2TP/zm\8VE,齐"|ǘ5c*_P-Z3q|R[|(Y{5Co}#wA"xb8{8TtW/ތǧ\\ 9/]t#fgq`S>g:~N.q:TeO?[\Zv#Vhgpxs{Sl/ft_Բq3]࠘̚5b)n@\XnS ( vf 7_CUszᏯDD#\0grH+лϬZdb앷#E񺙘9[ٞ#^iPHzFke`<{S!AT9IL`Ǡ:)۰Ne2`CN.{ ZC6 }F6dmzPe3w lعvu*Ts7ና#îs=͟y~$"9v?Yaف5P`崝yj09Z #h(W?BZrUEo qg18ذKL]'kG#9o>aTx H7ec/J腑G{^ha(چ6cGȫ&l͕>7螅E*bzB\d{e؎1j@˞s:zɿQiȐC6o_ס27 ;w>X|N|1-J-Θc%[2SJ|Wc=\ąp d6~b1Xy'!%۟]X=wTgbp#N\sTlm{e76(x=\`8aqmQfX܀](}tn Q.1 dILGjb z?c_R`o*uJdV'Y9`~@DbbLrr `?LûuFo{MζL8\8f@rYGp\AmlC Cr}seA8 yL/ŬMD%TRj#1Ht ]dansܚABtt}{5b3tjњ hf)mUBo::ڡ6ox{j6jfZFdgN{ǽ?viqQ1`SN@>qx{<\~> •u,u[܀zq_"vØjxw-^̷% W|諷r~+ωP·y䏟Xx恷9/MōݎDOk;+E܇qJ؄ck~+?Ijn؎>jw.6?^Դ[T(q5-P o>}I@!MD!w,FOoipx`6h |x8c\{U#ۮvTo\#cXu{7nrH޿c.>>sjf{|`ƣӠqɑbo+zۍ ykdi[ nW=Ï?pׄVlp`QmF~)v<~Rcѡ zX\b1I{ァWTTV+t6,2MHM0z&ipJ#F9כl8T oQJy o)F!@R')IlЭeSgq!Eݲ2~]+4ƘlcR0Pe-w0<0~ Qq°d:~ب ;4s 2K+5uMCݮxx ,6dUu{T+6|e)F3 `T?qz>eEg֭V#[0 Q|=W%vg W%rOfC]szƮa ]h/o{ O u#"هE@9)XDb6˧I >"[K{iE4jP_i3mbѷj e"GC4fijY]~Kmgw WWڷo9ά~E^$5zQuv="cjdfkűN4׍ەÒâsȂv8,ڎN>UBYSbd;aҍh5 (AДbBthwS&84lVν6ߏ 0ٴA:L7kh;z'4t| qT+}i[G=Ʀ& 5`cE3ޏ=ѵ}"=sFU(1Ӵ[`c Q%l̵1,)wʐڭ(_g<q,sM񓆖O@ 44ï} qŧxfߨJ?w^7B{һ/< zǐDf-쪛'`} =Mv}-o,$Q;|Qw> #|_1" V +fCgE`P9x)xׂ&>i{^p Bs ]^x/X`OWXzZ"TXQY@fɠ5^\KbT`t?WEj __`ԛt;yHN9XF,3Ar>3Hn2kGJR VEjmƪs|Gu3-]{\gۑu&{A.q[*)pT>}8DJѳc'?KrAg4ccp;1du#ϭ;ʏ:WQ_ӧ`$+wW___ IJ%y_j5줫j>ݖzߓ?*x׏v %m,1g1=Lm,WkvΨ1> U.;KosVL J^a#qS*k#%F?vdh`  Fա6W4XAj..CMk.tièfd"KgCSnU=?- WMø0 8n :Zv?%Y@#1&rxeXr;j"t"ƥ93WJdmGYK!qׇ:r42J%rv>DÈكj1?qJp$o.?Oނ ]QvV5&߃ѵ٬fNGrHl`RvE oR[RܕZq)9E{ʂ򘕢@obnʭ$U ؕb- [ aoNYw ' !6S&|GE'ʃjJv;Ql7ijVEy:ٿU>g{|36ۓ뼥u]NٸNnaHzl &$~KL%%ϘLBVz~j|9֕N NI0S HzToƶiې"ە~OlqnAE WdIFH~`GȘ (u_cv ;"S>Bfd3]D88m2eGd cc@>x-֗(N)*FA37 c.M$$>)߮i‹Qaӎ\{7jn]?-5Sn;=&a 68GxMC3J.$թ}d2KKšk ~Bc0̮1I8+Md9lQq㾭x8deb¢"8BuzccU"FjL=> ;Eӎq[ͨ@Wu$\;s#.Ɵ?W_; EvݿwQ4[#}'r?v`0-pJ~߷:+#_khfWV6v 90S X͏Vϗ?w|p"v)^y?.?&?=O/mٳ_P?A5kjOm2,?Yk fyex a]Pb|:&E~b_ע1r9U֣ Ev`0Wm6,i3S{X/_.x_Le[ڡsDR<_Qg{FRj2ǵuFu|/:PHT6mG+}?0 q7 :Lgy jbֺvYLڄ@o.-4Ĵ]cOHFb#qp^^&tmrLTWG].̚3sr0e & 2ed&O.շo0gNeO#o1RO/@3}_#Ɂl߈q#ixژ]nRz Ǡ@NDLLu o'*uGwȺ^w߇P=$P? 反DZ|ף <_Nm=X% Ğӗ}t ;#>ʆ٦l86̇#vCwF1g]6LZ{?\=`+g_-Ey`Z|ڎFCUXdc=D3l_;[ӡ|f?~ L_`1{rb$@*ldd^ӶMЕ[_0a?YW5w+O@ȺSSn&e:rc RZ&(J0( _fDHZc/0<\py?; a1ֻpmb=UJXx#z 쌡;+[ +プkviŧwc;tnJm6XvcDށì%\&9يXD&kWru ɀM/mšw֠<D7INEQ7Yc\q=`4D"<ÏNdoǒ>A86J$DI>| U‚Dqtun5|yPnD %I_nc} b'$l &Z R΃ %e{#>!'3eA| %<4ժFYpʱcїs0?u=[iU}6;c;)WEJG"j5,s,CbEVGf)CXנ"RjzJ~Ek=] q'Ocl#63.(ly;LC R.j+:ͫ%NEK()7F-"aʦ^(7CmE֮lq܀ T;v"çR_݆WWiũBGgvp|> &D M\riB<19";l6#YL jfj3Vܽ0z~~>e'y\]]6nZSvujTޝ%kKU2i͸ÔnXt1~:бw,JVEpKV/Ipz~5ZѾݎ^B)J.o߾iiilHA]`zƷw!6]z: @Ct:$:bm \DAK.aI/hՖsƆсKCM~BAA}b~y\,X T^n I5kPb`8ҁP IyՕ^c!k7?*_~=':yW] "2Ԭ?Q1C\3٠#3)cYh \7G|\< KK̃6Z''x6OkĨ"nw>Cx]_r ĭA)@5{_d)43΢@OyRjE`   b  ۅJ1Es+۞U)o2Mu3?xĸ4n:4jg@ю gE͏G-Nx؇`P^^.=:[OaS߮ڥn}y 2[7A:a$"%Պ-.l CAJQo.l:@M̿wQ/'PCT+6^R C{$n۸(C,旣:GTKX"ѓ%.VO߻woW!&:H_˖-B'j(5Lh lϚlV0""~m/MEϯײL濖` Y~-(j(&-  f?ul FUt=7sLh6{CW>^Z:5 P`&ǽ` *zGYyhHE ˃o݂3<\L|V-URoXu!6 Xhbrz{:sP4|8ʍY8{<_Л>;0$:111Mf__J˸"T _ Et[)zek`XDF^D$_Yd-hk}A -0\u6ҥ&^t>3y"vkAn Pyni/`Zee( @T3~E`M&bEyҎuBܐ< 9qj#gQ8&ԩ^aO[1h8mĄ zXIIIձ^Oʻ=}=VU IGyUFB?RM 2M;o4':DJwϞ=pǝ#..U1-ЊI<.#/aE E6łX &U(㿐F/Sn}` @eEŸ1 h_^.!UVk.ƢFkA! IFbYz1z:h׆ms;> ~srrбcǽv>h1`'}zB"rΝjfh?Pn]SuUl':u0#!֌-ۼCv!60soxsA"Cpbxp_((̇?_kY $$$f |6+\t k%nz=ڛ>Fw\k^I?5 G0-6كbHR.0%9l VD"-w&O TU _o"0LcVi1x=Ũ -anh `ffnMnےeƂFO(((۟Y- S'mݜ{}|=JWg=B<h]D{\b+" l +DK U ~%v\jꯡkQ {&Cu2ͦD %ɧWL2BEmQ[1^`WS.< |6Golh~Gs8ES} EXZ$jnA>4胘F'"jf걨C{9.\.YB)()ilfnrnnV'&e:5Ud=5K.~ +W)zr%cC;A{aIiZH+Qx5}Q$.E k⼇#Ir2aC2nu%p귣м[Kg \76;_l?6EגiBS]]Jud$ |>?^M&<6k/1h}d_SE R$x%:$ XKy-Jml= YB *[0ބRKz]^6 @K ALgQo@>jVh!j"[ht6^qJ8Ǩi"^TT@.K- 6tjDD2 H+Q{ĊQdIW 5_i-zͧDϠLd^W ""j-є4%%EmvکKY'FdhݸtLy#";$: Dt}Wd4v1ڊ*%$$ˉ@`ii)զ{s҈"W^^fh&%%PYDDah?@+"$2E pDEEPmG,sө6. FDD }͉dRsbP~} SD_hm042Ⱦ2%"=@"""""jBv"`ՠ:"*HDDDm@"""""R @6&"":\DDDDDDDDD/blLсDDDDDDDDD1blLc`"""""""3b1 @""""""""DDDDDDDDD16 0сDDDDDDDDD1fRĘHDDDDDDDta Aą@DDDDDD8B.jO: E 5{n;d"!!&Yy܇JjC4 ٍ" EL灅77oNA0 5ω `bR;' 77%EhʅFa"HB8N  7/=[!Mč6e/9ǝv-82?"""""5qT?-h2!$.43imlǽ))V%W[1+PP]3?+,GG˺3Q>RpaSU~܁;F'xɗxәX]Vǂp+08^<]U3>ħ?/ sbw8\83uv62Lw;^9MF٨tٿUt.^~5XfKEZe^l%;vxrpktxaSL. <=mDXj|r3߇V0O!|Z @Vk[Ew^nێ]+\ Ȇ;0{ $G 2zZ_:9(V]qT#d_ݻy 8f>݄?.FQЮp}lb㊬2pl_/ ⋹( I8Ď&}""""""jf-짎,(z{HeĹOŇ,Ǯ$׷u_@%=w}ݙ҇`P~=} F^.{9.2&-,Wmf#A,u@,a_:,}1_|=9ـZ>%!.t0Zy؉|STjȝ;9iV-hVtI,+Ӯ*e5|ڮ`2ੳ%NF7ؾ;d v<NeL=NzHNn˪=e` 6#HD.sA 7_"""""6&7t_\_فri03)r_ 8-"q߂K]oϟË#ǡnJA4f`y^G>}֩L19P¸Kso>ŃXLr=wpqD\8{?~(50X.-NkYMh1`^]7oADDDDDtၽ`b@?jf^zDXdْ}*F92!.5n^q{OB Ft%L ͊ "0CЪABFbAĠ3nuCk]g"g@tj$C;} +Q/XhsaHĈgDnpi1f7d""""">,d VɌ+]X!/CX7SX+KTV<,*7?=r>"#]`B""""""'&x jOʿ@@ XR|>[jâsqgR&ϓ/"O+`l}D@p;f5P@G;&?"""""}- p0:WܣfE$:|е(q8m;o"N`!"""""g (?Ϭ=Dq7YvJ?{ m(/}})ٍ P3q57[;oc8d vȭxpmUftٿC$p ;7l@ۿʔe qU8- lx&* \ fY8w\(ۄwQ7OUCNǑW"o͇߿[#]|! bZ7֕#[p`==p7ƾGjw1e;I<$Qc:9_A [0tŀ]7 p|شdgqM >?f'nڀߨ ڭT埿/lR@^>& _1|>m zt/ wRǏc1C.DR^]3~[}C&7.ιB exsSrڠRt&ze)[>Mщ{xI]z#IeNrѭw_t174A3Jí<^1A\6S"'䉭\M,IXrY6+Lu(N`"N ˰/ˑT/DN _n{7u|9{0.0K%+l *#D'湲u:ޫcv87_%>~d+yf6x'ਉ7㒎??'O=σbb7K\-1عf<6ON>:>={G '5: ?~E1:L[ߨcP.5Yurb|5z OPTYWaml7q쨽[sf.oHlXґY;«\tP1Fu!֣QM=.:hYbŲ keثu{~x#ȂWkpضQ_Vf]{R3⻯VIG"w|3y<\|~?Jޅ7 r~RSguV?#PZǃ 5@$Ik|}"rg>ࣨ6?%BzЋ, ("r)"V.µ , # =@H%uwgپ1N=ٹ߼sMZká#puqŀ}rj mb[]83z=r?;Hq 58c)؆gsP &!]~[* Nyorwb?':ecx\#ѮwYTTSwNоe0m!he₮|%~Ec9)aU&91HuNTԖN>$ב? >w݁ 5mjH42gQzmkR(IIƵ=J7'WBuPWߊF*`D'S2xƘi==n0 Q% ZO늑s0~a=~=nOBJbl#q~hzwSpO4V+?H_-U\n kQ]+"$ںKa--TURFxy|ݣ%dl^e!st*u@^EF?{`Kt2.k U @srNASrCWn ۯӮuKAy+RAo\W,JURtc ƥ+aWv`OX"ޮy |`3*vjoDu7$3W[ &.^i+yX_VZH@kK~\s!iAx&R%5<|=__&{]kcY^0+a4.I`ʠOT nU]U2cXؽ|Vp JFdžfՔ IOxYYxgךGnz[+ݨ:g6V/M%ZE(#^v &"""""*)-/a~m n&9ͤ\-S~^OW,ϟG`y \6*@T1Y4gr)OF!T;X<~K4t'@W`h_ BDDDDtۺz=$I(,7:NY;zθJT&?.M(BIn#M`nc @s>Hxp,̙{-9Y* aQh:h,||@*ÙO*<+\U @snhOeeծ/^j]W77bd܎9@兰G ѕ!"""""1H9 (ODuBŀkTHq$"""""Z>R2DDDDDDDDD DDDDDDDDD DDDDDDDDD DDDDDDDDD DDDDDDDDD DDDDDDDDD DDDDDDDDD DDDDDDDDD DDDDDDDDD DDDDDDDDD DDDDDDDDD DDDDDDDDD DDDDDDDDD DDDDDDDDD DDDDDDDDD DDDDDDDDD ! D$d#?7^NT/T/R  9wq">)&V~B>uXg3úJDDDDDDTod_̂VA|bk?QĊ}K@w [ ҕpNUT로N0#'"H"""""8 R>Wܫ(QCtR?'`XD$<""""" ]Y)<<<Y-J+ϓ̭jx1DZu\})%ru *[LQ!Zy 9"0֮%[RmHuF͵)JhYU(*`00DDDDDTo1HD_eIKLqڈj^j}ܾY(J̮DDDDDT1HTYe\vF SVY>> hqSU1/ ...uUuDDDDDD _BT|+/GIH&SzG0asݓ$ѡ2HDDDDD QPxd=;]Dq_#_k/?bN~z:/:܆~Ds+D3cpe͟;yW ?ƌ5i8_憰v}0jL?5{!7 >+=b]bĈ^Hv"?7]Wyh<^Y0fd4Vż϶uYqZOG37.fR~yo<ߖeܳ3-݃kW¼~"3<=[*k~|8LeCOn-&]IѤ" ,Ndm =běx{ }Y=$h|s L4E]fa4d} AOK'U_1T|N7xĆ/m( <OC6 vgv\Zw >z]7o.U7u0@M ε61iR>B h HڢMX>ymyM[v;}9b|bޑ#pWlrW|p/ap$.MZ)͇A)ڋߜ@@70wS 8F];4 =Zyѣa`ٛ/\tB.o@K \'!E+$X~@'+T2%f-Uj[? M&kз㯋TWV:i**mwy|e?Bua/ A؆?7h&Jphkx['08 8e:J_y\?x Gv!3^<> |bHQPK8 L^G@7t9y 6"n FE-_5 A}먪s6xr>+y/@DA9i(ĞȎ'F­ܰ^?_ÀX9So[S)!kjXf$~} \Ղ(IUgYai|2Br^E|z3N{mJqh xu>|΅gxR~j!މw+IӲ}8x_gbg `ߡ\ظCc-[D28_)Y%Uy^W>N1j}IK`úEVFǴjT**DDDDDD Twmx2#<# o=nCLCiƲ -5 'Z_OkMַt%DoNR jr1\{N0nz>${HvפVoiH_[TT8 0 C@uFpA.p`|a^ w?g'}`[RF>X .jt;߸o_߷eمC8#wxp$xnmS~.5ڦtw_൱Hz+z|*QF]3/|tr܎bA2JjŬ6,?IYb^d:0CضSuĠI#(9}8?t*[V1ڷ Z+ys26qt+UhK%S;ӦL˕^h!8&DK̴/0K$Mǖ7mޏ2_-hgg>fِǬr>WǴCIYa <0mjmS1U]{-?yR % (IW$"""""1HuNp B";qW1iW6>|ؖL .sG]cmrvܦ5HhkWi/7}^ċVYĉ); o≇3419dڽP2> hIDݏIZ;{[C9du3 ǹ: 8%K^Pqlz#E6Sy p@og}J  B@`w1eZ YV3'?[f;_ee ZX_bb@IA)B-iwx) n9f/< %"#2"X$5 AIXjb_IY J5XOV('rDDDDDD!6lddm\{::س?$kl(6(a\coeB12N Gu C뉫OMoaN~Uވ wv,0= 4Gof͛<5`>1fQшmzF?8PVKƺvQ+ʲc1diXnͽmU-I\"""""-Δ/gtHlƾ. No6\ x߭)T{?GKؼ2Cp6jCЮC/V8oHPP]/tK‡btoMa6 :sD v}U?,,.7&S~-?AP 6.?@.`Bߡ9V`EX7$I8u1MZ*Յ$ b5>8WtcVyl;eh\&1MwEԗ;\TXǣ :k<}/?ng(M|="Jr p¹^09<,N:vdlnkkd=ѴwS^pO4V+?H1*9GSµ׿t򄫾Yx7 }:U݉&LÑ-ubZ $r؝ ̘1ܢGll"@P*ԕ]czj* L|ht$w+?ErkT0ܝjV{ϱh4˛y"(}h*x^3>pgxo56C 4.;KVQ T|?Ֆ_nzhb ιbܣؾbDÃߍhGɞJ[˧aUdxl8h%W[ z5BRW+f%d  Kƒ=l}Kg]>sdlDvCq8ΫÐh5ʐ~i Wɩkw1gTlչqMV-Ċח/=4Aٛ!P+"jWԊzD_jDѻu\S>fk&xuswC:{p[qʗUiAӵbZ˺VQQ6tΛoooA":::.5X$,u]$- -X $gvF &9jrb$X<~mo6mw ]Y@_bwY6dTgNqX8o22c֗_b!1ܜJJPA₵_M``lz z:$c0~u_;~Y~θJ$7Mr$,j QJ7ZXjZZ2ulKn7ihZ[bKS%*Q= 7 Kb4 vվ /hL/$ 99̓WS= >޾ J%0 DDDDDDC@D;y8\]\wwOMSk^"""""kDTod_̂VA|bk?QD}K@w[ ֎sx:]N&}A $5cQ(seɽWtYbh>Hdge1xDDDDDD&Еa}JyJмSӉcKkaK:'YkXaLD/p2$9#ejZbZA?%`$ :ݲP``HLQa늪a}Uy:*5.mSKhEQr؏`v&"""""v0HupNNTBF|2n `3Ee%$i:ƭ)@YY\\\bkj|)X:_+""""""ߘCQ$' t8c|C܆P=߿)$|WʖQu*c&ӏOGG#>>ƕ֖*>$"""""v0HuCpA`\3*_J p: Z ż>¼~"3<=[*"͚e 3L)"ۡװ+4. ‚ i,Q;#  (Qx=gc޺pOzQGcoxw0Wrl8v%b&}G/8]j\#&nFL~gDdm|O؏A;׋5/ۿҺQO_/YEYhRl<)h}TxK~ |bHQͮ8{/c띂*ͮaVeö}E1&xi5,ۿ'Z9Fdlmkh ]Ebκ?pX.w[KQ18^ L]ϿMܪ(6f ƝFGӑk_ƒyO"Ɲm喣Iroş:fEVS3)8Wwy|e?B׊5&^Н?z?olKiC2v]TаK Gv pFGt] nE;]!%nlg[!npMߊqe7Vrgi PX*B IxkKzO0:i*š/Uzt$J.;!jrl?裂PˤGL }8NDqz&E#㾫[.b bCEv5aW:Bf5=WZQ ]j@yCHk?z"ڷ`L]+N Pl$MM' |7.AWٵ(ۿ[$o]6ki%}iOc+mâh2,"%. 9{"qͲR*ucx|0:O=] Hw<;fyQ8lO߳Boa×Уѕo(,5SyT*we jv&"""""0HQDh6b %c|h",WD #㔀npf0ػx*O{;3ΣT 9zv*3| h>*rӭZ̒s%DS0tm;uXG 4]|qZnmH醗Ub8EVAP".+%FœkKPx$.avk[džoT<"ˀ.7ss/ew]M7b+8igIk % (.HDDDDDD,&^SFxy|ݣ%dl^e!stx 'owL^W͂-p\c<uSqO-|(G&f0:G],_= _.qސ2&ᕌڒܺe7E[3I4> hI`EݏIZ;{[C%"Qima$juM?u/%eއ ߅? ރbAPvy<<s3 Kk:mAg,)MA1-S] =nF0tIB/$-le)!:&ުh{ ^$& T؈c'Z[Jrύؓv7hyU.(Ny\E@7<[⠪["ش;(c^2p<_(oh9Z[kIZGR/!""""#9I3. pE҈_6 8TfH x.z~B邗u['m5N5H5ZѺ.~Ʃ ˗áQb{+XPKf%gm-D%!&}x4|2z[[~. MgG?i8:{E-3-9Y)Wh ?Z&Cko 5]Vr7ugo( [ǭ|Vt.220cr>1A*"Չh|9. DTo(]L%'L@sI%-b{-[Y?sףC/`\,dkmA.j7$ʡg!MѶ$Ô_YPxn @D<8aԳW7֣8˽qs3}Vܸa\L_^( &QUE_lXSq28ܜmeOdLQRѥu8roۊbnC|B"[]C$zETHLjLDDDDDDDtT Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Qa>$ 99̓WQ5Vo_B""""r"/dɓD{B KDTݽO2C3{'9`Yj4Olbm' k-pNUts/``w>9@$z#;;aQDD |?#=1,"YY 9` @"7tetgyUvM,OƦGs+A"kc~i{|K9#|u *9` њs|o%CiiAĖDtamtS*o%m0R""""r ՟G`kW7ӣ=\KW8q{_͆3Yn}(9G~0F """"g>C.?r6hf{ v, ד yػfx:}];> {;|N:YՍߵ_No{e|=Jl B{)/IǮo+$Zv_G.cm-ߑvv|[[?a2=`2`+<6<ܾ{3kv vej*=/FO*omcVer>Fee45_c[oMOL>dٝ+uQ^zL0A|/$ 1H); d<&󯁶y;?cX2e λִ(Y*wmŋb{w78Tccɘ8sU"x 8"]mLǨWj)_]O>úUŔ~$3fDpp7HUq @E@x"ދKk{/"ɭ ǝϼ;}_CV+gY܋=lu8~)H^PYU7aD7̈eAj -Ջ.z;]L2]uָ|=+SUӕ.\P~b裣oNP> 0U @{^hҴ m:4O폤f. ‚ i,Q;#   m4,-e#Wd;6w%y)>R<&m9eGB]`|/C_DvqeO&Ze'`K꫘:8.5('±|h?5tcg㷥a]8UhqQ7ߴܹ%]>L"S)3Ƹ1Kgx2޴c\gN^kv;}9b|bޑ#>W| $K,'@k[暜iu?g?`~=L۽u6 [?"3O[j$ߊ;kx>nQGp&O'jz5u%.9\g<\*P︲o&㥹;e=#PSoe7V5q,O{"8n3 Jw;WbR"""""&'@WPT**s羆[{.i?WoBcZS{!'?+gXlD(Z{ϙ㓭zcA]c\‘i hR!ȱbue)ÑůcR3A< _u@To/7X<} ~luD*ME; ^XJl=w˼I q||̛J>_w؉sϢ[qIxc ?`X4iJ&In,f]*Wv 1Fƛ1cbߗ֖*:ş`!thmJph xu>|΅g\m|2C15M)*:K,? 7j nu 7gݐs>>]Ln箭$fɚxYNqPoۇ"bU(;#%@'Pt{0P0!S {2⢲% 9\2_?y )^V\/މpl>dp+u1t\zm z\grI{i\:v.bko'U*4Þ@VrcݜM;1sYC&U%h7` H>t 2%`|^JDDDD $ s/ljr\a`+X9F+3`Ӌ$lqpAK$_I[2 ٍ[y uW'ؖ49wm[L*-KX~^{cYXk:ִ?W~,hn"ho{ӥ]RP?W^CҢc̭L{+R[EC4-ۍuK\'R[@xcm ֝C}S1WJ)='z*jFh e~v-d4s?NÑ5*At)=h*V.ڗ&ĸ\Unm,X.rK ]gF#/@^ut՞{1V0x9meX=uoٌΖ"Vi9Ah.*1^YQ@/4WrrjTԻ vͽf_S[h..U#\**U]2d_.dX27)5hҲVSvjjc}~ לtͫ.'OJ7`#$% @GL %G|ʗLH.pG1Wy\SۚC@UucԔ}Y$ PCJ/6<췎ȖaI4,EM cAXu{I)%gqKz0wošUфXs+xq{R l1ӮşRt1-rzn۞ATY1p5s2a]t~ ,srYU~=A-w"à㕩U+x9P"Scݸ dzZ4#<_3qf;EƚY2NߚT+9~IjSPɔ!4'..Ut.ݹT[{*~U\݉5n'GgaXove z|Fm *Zi*{)ALL h~ &%> ^mP"BqJ@p-tUZᚍY%FWJQW` ^> xhKeZ*o]Q-lIv[><}Ϻ].֭MCnNl-JO෽ hN uO ou=~{=fzـGi|.i0o32L8bC(<pyqG%J7$F; v -w[i2srE8ti\F5F_A,9ͯ qLD<ϥs/8fkV&mrQhtt=R?87{: 3CcK5/j~kVԻ ?}/Ac=\N].FŶJ~U\Sqxh'giKY[Y~bʮ5Y(7Eb[[ D4'[ey)ėTLOܕ}u/wX v}U?,,.7&w >)p[^Zp):%v]1jJ埊=0uҥ?: } N5ҝk$\b]m%^UߊF7--~b5 (!ow8 ]To@8nE\tjS sHn>O0A.lCyŀW^^O{?GKؼ2Cpw{܆ݧ]xu38oHǔ6JRd|[5]L*fM=ҷݛCS°qe6cIVX+X6˒,V|9b[2UH7:×aZ5Tm"x"A mEY2ZʷRW_;>sv-nH pjb,9돛PI~353vRYG UBov&v"ْq~+jWvr_>fim/Ur8XFf̘YnÇ#66ƚ(ǒ$v&""""&~]gnu, ]'܀y |`3*Q 5H` nHLfz9$t4 <5>75CSDT?6}0 K@ ~l^Uz.l$ (m-B`py]ovGxDO6߁Uc0'W }bc)\0`"ƹ•"#,qZS?Uwv~kCi*MO4G@CGm|g6dⵃ*^~l^PεP,HGrE DZ@Bi[fپ 4@ߘݝٙ3gp=RФ ~p^M$z>%fo/ƻ>26BtFtlmz%{ijՔi_c:ozᖴt5 sgcHu69S_sF+JkmU3{`+Zw1ζO~EE"t<z5 93GytyTL]9&󯇴c<}_@_/g*=`|\닯f~9s}~qqRP$he(gu_ąvEy,Z5R\^agc:Ͻ#: RL?Z;h`;Iֿ=o$#d0k ~8P'1{!F M_~ Nv/ssAT4\oԞ:3f_߾HHLPc)FU@copӭDDDWukD;lv"?W^3&u/6mECu2`s1:}Q'X\Vralc @KƈuK B)9~7Xv[s3Krπi}/ӎq ,&_ݚr$.^.o(]tu{oKm(:.DDDDT DXܽxa.3D5To&Oq9u`kVP^Q&Kݴͤ 8ol:|[f<6>${WNs%EhZ {l{a`"""" ѥ B A앶V<`K!=ޜL(ѪKR3m-ղ8.!c yI@Dҵ_ ZUFvm^*b"MddT+=|4caAԑ|X Cd;0DDDD@"5ck2wdr jE>{F\*3\'T湼UaO`"HIMÆᗟ޸ BB+WW[ϵkת*``ailݵ &IɩLD""""r //tׯCYYJ||}T@DDDD0HD"AjZ#u!""""""O$ """"""""$""""""""$""""""""$""""""""$""""""""$""""""""$""""""""$""""""""$""""""""ôL"M$IBAA> `DDTA"0 ah&QM{I@D;z0HNKA"^Xv|8DDDD5@"5OA"9(jEе%k-j]Ug"݃ gB HDF~~>b*U =K""}^F>vdzLE~^ &c ?Ch}`YZ+m;| ϕ2Rm/%#r0MLT""" #^!Tꇒ:f]c}ּ$'c cX.Ly)|+8a&xi=88v~ M)LJg%+)c; P(ĺ7[:ާEУw4 i6_xn#'4 []ݻ}O|&W D}pvRLPCH0=^߃SX;})[?(1 ʞq Aqի}h@,t,:eyʜ`iԩ0$&vrŎLDDDTGLw 8'̞K[㡗,(-,~Mc*CA>l[K.3&G!Tiq`BwMwmT>1.eͧ{w!:,B%ϹKĔ)SǧNR~$?:1$'';GLDDDt0HfG3 0A tǢatkkq7ɣ?Ap}h \Kj0I7Gr,)"dF(Z*c^1#"DJۙ阵*ķC}%Ͻ9?hht\~ѭEl)os> Y8_!_M?ļq$7k;׮ǎ#0{Gлawq|$>wVp4 a.%DZO1mz%ҵѢҼ JU{ģQzcL˨b FQ>m7nӲ-uۭX=|h67YT,CcWŎ}1g q!a[<4= >n1\o>o3ix$&z yR9w16I}Ҭm~9C#ⶇ"1)l1X 4L D49Ehо"g/Cz7."@sgIIx7+zro{ʰxJF>)0<@W_~õqjI}|LebWc1y] xmB srt4< _*Ǿc1q'Hpx,|=q*^S,oDn K(2S翏ٍ'c`C%ㅠƷ'!ouwl@G2 1B~p߿KꓞU5ZRB#J*s(Xip<,t /(BlB{<)Iam1{Xwoͅ^! ض7&w@}yjK%8q},\Ef)I )~uU{U)<!O_c1~Aa׌ј>2ŠmG>D~8h9WsZZ}#=/PŽjt٫ Eðc`FE4D7|Q;H:ZUcOEh<<1D$>Z_Us _*ފN5DX ]@~q-pM$_?fhTy= '#(\{s4Shcٕsh0ĵBFu۔d8 S@ǾC㬙ݾ]gu˴{ScZ`6 N蓨WGt6oZ 70o`"c>- !ޅNdaP^ :c!n~ZEV\| V鐪+[1~`} >~L_Bߏ;'׺y<̇cݸY]&C_ǃYbҐf=\c(d] {}q=h&DD˚;Aq]܇kϓlʏ#pSq*'[` 4R{uܱlWf#1Ә(PQUUŭ8Ah<^m(FR&c{qt{pLɋ y䊼2XDTj`U_vW^{OYn2ŢՑ &QuDeIGÀc"lkϽ2I9 N\nbH8+K]Wm  WU)hRH4?[ ͍FV!6]cRXʤ$w T0m-za̐-ߏoMΰfH2@PEΖs.o:*lL,+~)sGD|輷8QƸ}r&x궕JPP)5""""9 ҕ%(80Y}q8k!m.6 Qްٌ%Ɩg!4HAB OED\fkjy k`NbǞbhc`CكHƐ7EuE fYcS+ր֊5(Zh ZC\|<8<6<#Oûߥn1Ћs~bNkB;l}1?9}b!6~/Da@nai9m\Y B=r]_mX*4#*cܺCE| 6E%JvvT-QAg #*u}\½Dy)r^\Gk#+EE@pt4lHD*c% hO)5IA$NBDDDt 0HOşXh|nfswCLxm"\ؽ2[~\-9AzߙC#y!  htwgD K+4*@֏`0/E;9}2EMT+sCX6͍á+ñ3ѸUVqk=2o> 4 rZZgA)2,G]@i(uy. X|,O R>A'u&ٿFk'J@G;8yjP~dHOtKs>²֯[h Vl3vgB"k3_X2g~oU&6IF =3J5Rrk1f M7bgG/!Oa%(@hQ Lç{HqVVilQC dOG3oaPu^4@4Nƞ^DD A(+$w`)g ޛ>īAxƌWc?/Ƶ½/M[m=\׫36 _@~hLf^dQ'Z024k|k4}ָ;ŻC)ħ~ -!-UFݙ6CѬg :6T'JI.lv+1]Cbe?tx{o2]Yp,ZtOw5rZZ }NzeѲEkGYXZ` O]BuCzMm[gXw )uSj S3_bOB#o#Gl\).Z?'4Ab2/"xBjZ'Ń/>. :۱_aμ!_/3r]-hQsqq߯/5py!9yU .DDDD5N[{ZpEmeѪ/E?3%Ra FD .{޾jJ2)f [3B|+eY1 1QUrsAT4\СØ>c틄=RkQt7LX""GZGt.f>d;"?W^3&u/6mECuR\EU j Qr1PI^U}T0\&|?~&l~MP{bFY9'f難c+"k]Y^+-F Ng\vL.8] QCm x ڡMVqԧ܍}:k'fMamhp?"VᜒsJ-EZlH^1HD)Z[-[1x;4%ܥ7kq ˬHD5HVn{mȱOlADDDD5@"5aE0W֊ZWeLBpT*򊌌u%ςFp.hlmzuQPPpz=1HDFtt,vBF0L.=AHjl5-R䠵DD1}T*]ު{'0jDTkauHo!++-4r^._Vu&F$%2jDTkhN>l\eeeL":N IHNIpDDDDDT*5R"""""""4L""""""""@"""""""":@"""""""":@"""""""":@"""""""":@"""""""":@"""""""":@"""""""":@"""""""":L$ D$䣸Y}NDDu:-F`DT[(G[TAX$"eYY egCK`ODDDT$Z#ttZ-S:ZV][ڟVRv UU^{>)r=(?аp&$Q DTk#*&R3Y$"G)ecq!\)+2Z)]?(D%"""a Q!:yB~(*c57#$"2$2Xp,= u[ʭ- ~,oD@"=UHGW1kٕs\)""ewcp-E(JnQfDDYqOu$,\ݭ9mmWeҵ"yQDI1[c`X(h=3%+5`4nk^@DD.VIl AI@87d-~ į//Jm܏GAY\Jzks[Eػq#vA9.\pE8#GTz$ ؏jecKOb |2/Ǐƃ7iw{o /"<* Q:Pz\Zr)æb! \EϺzxoo9xIG.h-R[0 ~چFMG}I0~σѶ_v>|geQmchToK`zm;t]VWفOB͏#EDtʢiSa@HNIMd9 0GuYat$.hqg?MՇ)UJxaP3`Ch\x*=;jtQRpVN9 2foS1:^|HgvbƋ/cIvZ ׃9p %.P|"Ƹ^xqpSKQ?[G߇O[ވ ⍅ѰcXl^ <.RN̞߇'zG@:_͚qŔ[O޵ *4W5xEzm.PQt?1eSԿχ} Ɏػ2 0} @pDG>I1HW4OBnQ-c5%g|y["ep{q{zz|xk " m>F|ch~̶>Nci~,<`:fDnн_tIǩlo.%c8rV60]FăNX)]ꏻ[;1|= sfQDxQ~|G1ّX5L~$ ;CreˀFiHJGyA(15mvap1~xf|$ JطTgYg|!fۃ h1m9'/]Vhy|-”a'1kA/PM@AFkh*n#)qq葨)l1X 4L t^[DQ#^MeehU!cѨ3'aIv zz74篤mtߐנE!ho x >cނMx)輬6-x#kNZ@ٵXZ2M(RR9ѕ*LNJ[oYEF\ U V[x6֟rtg Qb0HWXPs?ߊlff9ّ|eDTa渃(7=/ 1J7ףp-Şbt"ڄAOh0yZy_8 F7o|gFF;%"Eh1ˀ>GkgPx<-,~63^X-]v1'SZ;7 xr=fLY&En_U'I", ̒'h Džz}X!7F KGR|0OB`;{e.dz'aJbT b L?CGO_WMa 1g|Z얯`®1am}35dc܏0}'p8 |/@=(읅kqܕfpۦ:c_ gOda? wDpv]{mn#/ صz5KN 5si ^(?b0B QcUDDDTV~#g)V[Ea8Cl3n=!=^ Ghl[#oZL+X`'x5!2K۱"4 hC.:|~ͣc\DawG_`IDi]׬Q$*\ uň5ڎ1=fb_LQ"wÓ%i'Rۗ2 l?Κ\6 /Rɫۺ Kr saݗ!%șQr Vho}G~z+3sQ.޶|㚖iϯź#ehsG{&bDD뵉>U?S,چ9 dx:k~LMfa`t?$ ݉V@}0 E,|48W-ܶ]}+"ps ] sI?s]Ũ(?l ^1@C<@ژx7 ͻ6\^'+u"jVh\xF(``"""?`j]p(ɯ74܃ iQŞd.m]Yz lߋS \)1ѪuA9ZRƩ8p^"DJ M@*UHQ.&1=}J03|i ҰuM(J֌;qX6[7-݃cJ~|o#?ɟ2hKI{}^QA$xqF}%kÚW48v8s&--t,:+_Rxg&nO'xmإT+&h?b,:i|0M~`>]k1_`X/5'^ODW̽ڒV+- :tqD"":MW*X[`Vg .^^@z2yoT_R|Q݊x(3?N_bjw<xA~RJʤ$w +HLJAdJpPF9eɢ*>]Zb乮3YLd +ymN3rm,l6pd;o3-3F$ow1˜![ ޚa͐d FC~`woa.-ƙRؘX&"a}gʥЧy+j8u,V"U2eDRnxc: @N9 dx??_mLwuD67acnw_ODZ^_0(uVݶ] *^@DD􏽷~(7:m,@kX~,YlH]]yؽ,QSԙl>tRKC{}C Fj OED\]ŜlY;NXW!bk:IS mL"t -gǶ0H=mX"9UEW+ր -]|%18z"\,+,[ @#:ʲ r h܉}GOb;ɥUWH|m`OVk#"a)r~\Gk#+V6򭇸x qxlx6FwKKbM-|~V5wD(BUV^z/g˼ґ;FYTx)c#I>%hz^<m| ڄs $XDkz嬤Tt~S*16 JO "q""P^^v%'Z`k(F$ T i!3댧hQ LgKq}R܃6{4bO<6K( \fS[Bƒnn]Y7Bspk{C(ϟqChKQ1zxe$|%iǝTAlˋ&`nm}^/i inm <]ߏr[ly]Z|E}m Irr0u# GWknA & 1_ Цh_tp,҅? jND,U2v`6tU [~\& UGm;.g]3Ҝ+}"#ŗpmh_Gg8w| ͷ$BNƝ]Yp]hV؄>ܢrz Ru8g-I_% hAɱ߱j6cEz^L_I\:SUZHLLHV JQ]LMd1bQ7B52ѨZ_`H><ލ @O1gؤZ?'4ErFΡm~L~g.zCf~}ykEb\ !D?앟rŻ>kvH5L߾KCtk\ܝm`TLZ>o/QNBih_I4!mB/>ǒٓC_4Bm$vsOx@U"-p \rR܆͟+ڢY$)wsױTL]9&U󯇴]Vwh=y^%)I1̏BNIuؖjrmnY:Oa!14\Wq{IEPP6/[l;ѩtnZt}#*>&c Zރg l fl1uE(&)G-Xd VP$/.W3F@@Μ9>?88F.DDOzip`>DFE콤ۂ֮rrrD jrAeѨQUExۗŸ/Ab#kH8MxIR;SU+pG{`24G7`6!rtz^5'4}-;9.9 翪:3f_߾HHLpP)58:Kn̄%"M_?j6j?Qc-f o޴E'y E(M#,.hB` @:ɈuK B)9~7`%pSmxq{ ׯnM}A(Ư 򅈮6~nOUVZ5:S1\ެnPիNb~BBb2o^Ɉ9>|AB&U DuXܽxa.ȕ*D5TZ\cYgg68ol:|۵lz3|%0GDW_+Tj-jf#BH.DD'#orl2Rמ~D ^X|+dJ\hǮ?xQ1c0$ZdrV5Kz塭 ]~D|BR&W*eRv<Q&JDDDT$ZCt+JPU]ǬkoGl HDteHe|YF{ [y[,&)Q cjOUZutZIw%WD]\l{-~9Qc"sRw Ux ۘ"x kEX7c:.Qz>g.""KW[kh4B׻݂罀j'Q{~CҚy)})YNC%6#*9kOXcwF-Xs.\pR;p`?F,%It+$"""ylB?vWv/u3(@4iۺwǍikfa1@mSMěCp-z|e*ĺ7[:^Ǣqmѻ y|`݂YX6Pw#86;'"lxY>F6^~Hl w?FTN[il~FDzyP-IFn^Wb"X!HvEC[+v]Gz"Re`iԩ0$&v߳1HX_yN55w<ǒBu^inac1c(3fME;!.HWb 8RESٹgWSیrz-`00{;Ϟљ'h+@:3^|K#^x<e9K/A>wфy0‹XaB=4>|-]CF^0o,,ŵ~Êfc?h%JvbP><;jtC,<~-gP ǿ¬Kw(uksDt)SO:H~>tcHNNvl'Ra.c gU'sm~:^-N|3>&#' <> H5O,Ũ"adO1+qGO/R1~ZWkn~><`:fDnн_tI`9?[lT6mpWo=osv,3oő)2b$LVmv:f JP"񥕌9i6 Z'r;ώ֯a#IW,W*+`^4M@xݥ">%nġQzcj<ڤA/=c=1̹̰HzВuLƬqBM89o 霹h*n#)쇈ƸuH6_,߆e&v}:[(Gyk*Ɛ?`hD$;=^\qGWҶQ:9~`w-\@>|vaGACxo[0I0ۦÐod)S (KP EjZ*ѕ;|xPŽjt 8 ?}$nu#3Ю]vy% 8# 1A8WqQ2n,z&V`}UvJ竱.6gS|9a:LVޥ޹qtMoE|3 q E ߙ1N ~Zu }b2ÃO8Yz8T:x9ߧG .V=?ba'4w|Lh} 01d囀]}UUt&X,0K\$h Džz}X!7F KG~R|0OB`;{e.dz'aJbT b L?CGO_WMa 1g|ZYJ0a׌ј>2ŠmG>D~8T>OFTrVEm8J3mSUޱ/Ʉ'j;im;S.=ԶqVWsJ=s| '֏C4/FozDte\Q`.sȦQb> b4+}4L zD"66ҙM?fh2 JeDϾ vgZq߮XS|t;h~>?YV㈕r͐q GÆF4ڎyscłU')ru]F88ds(܎o# j;@\=8sS&E]} jډy\@Ķ%.>"[eo6-w9C|+>OM#?=hovqqMd5GbkHZDoǜQ3њ'gE0gu! }^g[ICi,_"kCcTϔ,0Kt'VN[}SIT'r*U\p۾vM#M=tv-'Q""4uArOL4r/x#^gD1Hz'Akc*`Wͻ6\^'+u" ,5]jkMt56lWL>(ʯtJZ`:GAh,R=,y]0ںG@,ؾLR02/qc2U(\A9%SH2Nݠ&0X%B4ޯ REScбطΈ s1c/G2M X}VKNP"wⰜέ[7-݃cJzo#oɟ2hKI{}^QA$xqF}%kÚW48v8s&--t,:+_Rxg&nO'xmإT+&h?b,:i|0M~`>]k1_`X/5'^ODW̽2\iѭՑ &Q0H/š\Icq_N01 a!^ʤ暩޷RAϠc< Q$g*o *` XLݤ܎ \nJP^D۠A@{I)plV (o1Y`=@ܧK AQ`a"Gqh\}/ 8Sg[o%RE!N)cVF 0ٺO$s@1h?<6tWwn@d1l}s6vI[DtY:i{n[ٮrP~/ """0 1s?Uw]qzg̔~@jAsC'Q!Et#0F\0g}gJEҤ OED\]ŜlY;NXW!bk:IS mL"t -gǶ0H=mX"9) 埳5h 7 `("\,+,[ @#:ʲ r hD}GOb;ɥUWHk'+dk:.HmXVQ J֭|!.>BRR}SpKg>(0?-]tSCVą  nPq A- ( {^eBM]6)PӣMr\ޛܿmsx0 gߦV|9-EVTZU^T4G\@zzz"ڇ%u,\#t8 i.'?S f'VwO&߃Ƈ#I2gRI@*t(Ptr2fuA0(.`%if/=fR4m/3>"|^:7jfÿX"U] -jx \2^ufI-f`UTi:œ1UxA~Wp8*xG||mxkCThTG|5Oc@䆿1/|Ч./ }ѥ7i'q5ҽ1z5sĔ_7h@l|m*"q B^NY& y-FLI[uαwld@m8pM} pbEn+5O毃[pUZZE(yI]rTɋ%)zn沵h(([|W{-}1A7\pAh~B qbjrǏ9.;7"q`lJqG!Zvax{6G[(m'2#[pTulk-W.K0<-]ynCj@u(zVYiU.9i#kn|d$OQ AHHu Wu]t[)]a𧟠|_PjZ ZmOsm7̡Z?>/9l:z=*  ~7>}ʜTjq`Xh֫668;7y-NX6 r7jyP8o٫~K;xZyS__411xw0 7ϞGS1OWL^, \|jE7sph(<7w,%eh#wTV*nO` 7 ̛J zMh)j9y ŢyZ-R..gIJL\ߨ3ÔgByn5/\xGsxceei݀K|]9entcԨ 7v c%Kt/OFoAP=NNOǕҘ %4Z--Ztc`螴sfT ?F%Q^vƧfZ,l|:EjX K=jlHDfYڲGp2"v{.; a "Q9c* JmSرm ""'CB*DT.QK^)"""""""""  cȆ1HDDDDDDDDdØ$""""""""aL0&lDDDDDDDDD6 @"""""""""f2B >>I T5\]PJ!"""""k?* )wiV#NP(xƸGZ7 b*Ш`0I)˖9-Ul)BɻbT0R5'#>.^,DDDDDD6cQj%Jr $'.[&N ?0q7n0xDDDDDD6 @"4tYpttweJWJfY,}Bj%h~^Z.Fw[e,r7%P &Nu,DDDDDD6] ONr}B^uc5=bZA!v/߷"޼dΪ-+z= ! b*nLXtk-8ݽ/@[)'\ȷi`v&"""""MLQ!Q\.2 hގYI# ++ Z6_L *? Ɵl$*OYg0Hg4̔k'-k)w9RY0~Bř @""""""tqdߘvN^1 >]|?<Ѡ%:?P!k t04 yg%oԃ}YmXcc1} <aIArO61HRE_-Rl$L #-!xo=WtGžua;n mQVY͇B`IKᏳu1ծ^L@+j۟!"@iB{ȷE/ ͹]ʴ>#ʪiJ*<rڣRo_gϞ/#xW^FXXXoLDDDDDd˘GOF#{^t* "PVmSkѶX?e~'ԍx=ʹB :odnqOx#N=բKmL M 3ÔgB!M˟@F 8ØbM;@wWDt.-A{qj a*к-`?%%z`HKD5"fENɧ~<_K7-,x _4h@b[bĉBQtgpu*lzXRKヶO,};KK{e8Ǝ=v5M׆=ύg,O[" gǔՙh>:~Ł{+ j 1g5b qX>v0zޞGr!t qHPJR ,f6eis> } n"nUe(bw?"~0,=1he,e 7x~(1SI(4|mP&H?gT_7GLUTN PF1H.^']X<|0M [½VIva{8ۦ w%LW襑`9l$|? /pbepuI_!=qY@@Nh)uU(ػ+zTS70mqD݈9?Ą*LդлA 0͈1r`҆,f~xY?soNOZnFz^N#% vJGoKKmtW]7WGdZI@JhOBԆ@fq*-eͲi,[ߎ^a [RQZ7x^.p@GOefG;w{r @!u0'L*TrӐmp4;}TucRykt_:0N܂я"HfW$HdI>G_s*}XU[-)F&lIO͉?X.!;J%$bӬ g+~tD^V; ?UdqY- myf`aiPwH1Z #q!I jP[12=mn=nŬi+q%Et_~%`E"7V*P;$'/< jrR.Š`M-b;]:⯞ƞ' m$ƒ#q=FS%B8#{Dǻ7*'/XwtU.;f7=aK;Nť.A; .&I**XGw|x2*{S/hoJr^lAJLԲ`NN] \^7:; \]4.܆ԀuQ"!g?GӪ*ϟwqKq}c|й*Ԛʽ}Q`dQw;gz!CRtCJK~R]lt2wv36-B4CUj1uT nE"9Z l|;-6j1bq_u6 ^?nFTp5w.sW[}9X3u)=`rl߅hE1jQ#5^c[cLv&/4Ejyp8݃D$*?6ʘ҄!m1x@4p02wi/h=I߿U\<#ͯ3u[fM_CWzeJ}^x7`pj / 99Gppܱ2'LDDDDDdE!;Њ4bQEJi,)e$%&lf$"[z ܮXNSw{&_XEF^ B:9?)vJ JiL-] !;mF0=ExԮװ4@b6.z`Yܐc @"4.]s[ g |@l{o7M"/FRGF q S&1HDi_,I[⟜qx+3j4 P똷.DDDDDDQ!' r>sPmթX09SL"bNʳ -b @"4n ptpmUHUt5ǰHlK_JI1Q(֔X)2~JȏKAXi,DDDDDD6 @"4pQ4o :"ZJmRmN=֢PrBqXU BHDDDDDd$J#<oۂ[7vp**{:~ɉE}EFJ&bѝeg!4,1HDRBp)ض J{ 5ѽ @"T %"jԒ"""""""uȆ1HDDDDDDDDdØ$""""""""aL0&lDDDDDDDDD6 @"""""""""  cȆ1HDDDDDDDDdØ$""""""""aL0&lDDDDDDDDD6 @"""""""""  cȆ1HDDDDDDDDdØ$""""""""aL0&lDDDDDDDDD6 @"""""""""  S3dS0DDDDDDDDw&jM4a*ȚKLՒ""""""" d5B e$1HDDDDDDDta ݇ @DDDDDDDDw&jL}$1HDDDDDDDta ݇ @DDDDDDDDw&jL}$1HDDDDDDDta ݇ @DDDDDDDDw&jL} bȆ1HDDDDDDDDd8 UZqY8~9'$ @pU tEU1PDDDDDDDD%`*4Y|Un ݠP*Cx;, |dЈ.T;75pABbq I!v v\U4S[g4L/aKȼ_M_ѳ#ut0'_'0~U햑(-Burl\,ZFjDD,&X;?<5(%cp1:  ~UP;.HJ+ IHAǺ.Ъu bJ(xZ ;/pW^]ʩ_`ƶ'c}l8Z{T(qr+c y̳"1$?֏y G Tǵ1+TrmH܅O5Ra,b }xG^r|ݭnoz^cY8i)Pf+ݥJrl:I)i/W<:YM4 Fxe(ZC΀WA G|TLt3^|6J37z|VEǿg3_OaUU.d -m$ySs=MZ}Th}ibkŸ-^ůZcv$fݿ'=_OM붛XQԾG 8^|d`ՠ͉0AI \N&&e2]1)Nhη #VcC=q4 t4[Es[XmrEp:\[x ]<7Wke}읂Pv-T$N|\MS0ھ Or5aQ)]|'R nN^c=w*cc{=^˟$e "ʇc'_j[zKJCrz|ݝСa/W"*K4v4 QqC r:֭ZޙXgpjr`LkT{I؁_]ð[$&Ȓ x=1bCT)3cqvʸ|7}$֮ڹW\n^->Ө)bbb6w0:G3֡^^:2)3jJvG]/NrPQ~-u mnk᭶0x5t KfoڀkY*9Qd:]d޲שKذ. >Oc//~MgU`3j$ FF8"vt;4/^}x&"68)mށ x߆L!K"0]&);-B|@gf¹WO l\bs~4 2hqg}Ϯ" Wl#n*Ou++:f0 N7_ٗ0dnaSqJa}$AV*N!B\.-V~yǐ%T2#*mW F0eGۍO<ᴛ}U,~A4 t6]g\,ՊHO/xw1xa<*k)ٴvCoc k㑀C(mDž@ :( ;/޺X5q4T]nO"%C_'"fm>N<[VښZ,,2l|k?"tIpSRn,< '*)c:׬ _E:NJ'7ݐ*w\^\Kyʽ-΃p(<ġBz.g':v5~|8 7"De=hۡ#>;{b泃 hw3WlzšRQ!{(w٭5s{t_kvnRvJ_$*ަ1R#&!j jnNv(0o\r~BYDzN\N,ǽ#z,ӿ| U0;Zxd'ND {/A|sxu)*Pt~{& o_'ODH$КP킚6RD2;+Q`gXn2y'Vx\ œ+td_cqcjt| _߈;c{5R?(&> =FbtH|կ^_Ptw:cy8. O;6ƫ0Xgz6]х/f>;-Ǚw1{:]:u-zLu }&Epf|WXr ˰1 Cմ/Zt@1PcXf%N~ [wX݆(c|%T-{=_xQrmMy-x|jv<aK%*KJyiOhչV8^ͻwbٶ:֔27yз9Ԗ灱L\}vznq+ى8|@NX0 b3` w~ sUR=agU|9|w8_=ga&͒N+Q6bۋ9+X>UNzҧq1.%ĸ4. K3VTSw?S{OGΈmGq5.EDǥk"ݎ6.63W,?,f9&_L\)1ZSIS|!B/ҋ{NA1*D>f^TkKEtvj;&2-P73%nseăZq$!5IggF_iH(dE@x "Rs˾$~lbf9↡c!X-=.$ؔby2K u;H ˸-?xkEg DqGEF>cӮ?ursO}|*91?JWL2&9K"exCDUz Ea1: cYke׀tcziAocSthDǙQ"N (]h11&Эye /r *p3"jBӟ.⊲רE[%D/N܂U ;KoJ)ZM,!nMp}j*ms]O~>=XN)\DXTte)~%*//OgNgOΜϞΈ ϊĥ 勑ʥgf[u{u||j7T漀{ga @b3aV@otG';;gR_^ SNo/\KAJwUЪ<]p|\_H^x>8Hw85+Cq~wS\?]YIWgG =%T%M+ՉigbwGwh8=}X:[8F.gyxgXNxs4 deض`;pnPN Cen {+WRLWx*"#)PWĵ2'ini}܎_o_b]|%vN: iؐ?XO 8僎]B g~ "}ZQe,*)7sGXy1vjFvHĴah9#zn^'͊r_ڨ5i'bWzGSػ}-}2B?OA={E%ms]O#gu[Rq.sӲTUv SQI]^r/3Ko0W`3jT[ .XlN_ǖQc ½`g*:]6]85.{Sc=v_m6EOEcϱx+z,k'Ż"n"Q#Ƹ&'EV( e<)3aO-'N'.1̺<&PK=+k`PՔƙJfkC| &tZ`%fJR/vٟ C*h0uf^Pk2zQrmMy9(KJ͜?Es PBm#;3zٱ]w_~94_~59nE/{S+#EAep=| W+:r AÖm<#{ \B}w~#jMb=gc\9;Y]zL]* %_)~uDTɱ Qjd G9g`{/a΋KD'>5:㒅Nh\Wo`KШUШrK@]0n|H؂o\GQK˲xFd ۰f_42!a<,:'@"N82cG/͌_w}9I0^} UMڅ:j){ Ҭ:vZz"%q/r\H%dAA}h{DcHI6@[fY'7y;gԗ[,dEbXhj-n)'7qCѽ}hش9긗$,ZP*:}VLƸש:K-:Doy6xaW~>~אKO;zP§xa'YN? UQjh[}e~"V7Y?[SowY(S"7uEsLX` jyw.q)l|=5徬M:v 73` k9@62K(SqήxZ]Wl+z@y>=e-YiWkƦB;bW"ʎ-鎪VQ7R4q=> z=J Dr^J)uNc%/< 6kU"O85o7~I hfy2. DƐozD-.3~1pC&S_CB_[Ԙ:߬n|>lt0G~'o=\ mpCN0L[}ekWբJ=a53@J8y^ Eѽ0a580]||:o/ޥc$؅=?B69SD-M?Fa)? k-SXKKL o8SDcklu2\b7#1bmk`[& &{l9`=?#-Z 8 k<'῟'|1pίTWyzζ'J#3guY+XSϗN)lu4aLm1 K4)s@wx)^p@וG_Oo/=OQl:rE<-ƈǣEfω{.EϊU{"Eߏ)_t4"芚dg<}}uV=%5Ltk(̓+\CD_5Q!3O; $N7J"AL9CD.Hn/͏94,g Zb$ 0W}i93"{!S)ubDMu{uxcXN!*|h#yWbTbXN=WDuL=Xݥcv+qA(N:*2z87-N+'R,#&SIZ$9\,Rs1XV6Wľ>)W$V~v*96 xv%TJ܅3_7]"i^6x>_l[\Nv+ (b"֑w{gQZb ;R9RޢDRb /M"""~Ufȁ]弁to{yҢڸk`$cˡ(zH|.ׯ9&"""""SEa ]ka(E>; z} lilYوONGjU:5 *cQaLRѩI3pZ"4 €llFF*L: QJC^rYU*y"ހlO73K' 8p:%K`LRҵY0L_|qIj썋jy C!4LNĂ'|vWU,DDDDDDDDEQ3THu`nl@o5]`"%=Ӑg?soIws~Kk}_^ mۥ<]wkWmp ] d_9 0Oi+_ }$""""""*'l6ENvf,9fcnh |W+#+1o_=|u}1$ԧKeewx1>o6Mn*tI뇡[0b:\"~=ިGGL8qo*m>~6^ϮnLvDžvlHNvV] tga܂:1"JrO`#Rz$ >x oqO@C}+[G ˎHX/_1kw "=1u,DDDDDD6 @t\}Ɵ͡B?)'0+/@jB<#Kذ. >Oݶ}+ik_'xq_&wEBl""""""k9tDp:PՆ¡Cn |cW!ZIa[sqdI`GPtGG(r}y  tq1l@* ԙp*w{3POᎁS6cJ&HolϿBn|wtY]tp5~z 0]Y]/XRcu[Z9.i"~9 aomU^d 8~i?㒾mc}hb?ڼIrӾhkz=VVK Vi:߇?KaؚRWĕ2bh襒wC,p\J'ikgzT.|Xr2OKuֱlg]r9!""""" TTG@0~!TנCC))v)V$CE|j{( Hƶ)@`Jch ccr>o'\Z|Xk9 W.J|L=[ ' !x9 * 2',N4$Zo6Î2}A*= %N/Dzɺ OQu0 )72i8::6CQ,+ezoEjYEMmE_q]9Wx5THŲq1}KF`H\rg= u9i&8,yWDDDDDDt;1H̔k;֙*m1uQ=FlDH@7ƥ %%"mCW~fۈ#:_<Хz^. ];z#&Dfۊ/n``{o^Ssk<^Aoj= M+ze'ڽ6̔Kه3^Ow hZgx ;#?t4ŐF319A"mτ#*y_m_.Śm.TiT*yQ*r^{{{4lPCY&prrV#=W?j Wٙ1S(;:+^S{aҏppg0o>ڋ 5X_S΀lCQ{,pcvkO!L~k1-K;poMF9 pҠv(/[LDݮP {9SW{jJ'Qj*+uiFoyDDDDDD [R!%斻TZ? N?}-{Yԯ_ /<<y󃏏够"')aܫ81OիAp nu7"aHeXz5Vڇ9Po8C҄=O{CjZptvCГJ|}=VGF)yK^bRX ή.xe<[3yuiL[}¯ESKw{5G.bYsUݧߥg^E+k#ǍoX}I₞ƧCJ-z6jG}sC1`+g[޿2҄bMஶJ 1k&eDӱI_Uq]؛]Dou9I/ѠڐՈ""""l30Hee0DepA/6b:?^I|z>.ۈO[:CF{4cFϮ]oͪjM(~>-OEF5}~ h$ %jCF([Z ڡnȊgB;8ɾ #n TQ,(* XXE>^U`Qk.܋"-( **UDְrddI&&yg&ws~63_QnӬJ<'So}^fW]cjK]*Vj0Qu~>zx>Otrc3@9u"]vd 4;&S׼NsrzY[mTDKg\d5Қfybk̫-(,R+VZvWXGi(\g5ؗhJf_[y)awTc?ǒ}WRٵQ((V,sb,8'd/[YCOF5P-+6Vݩe]N1nxz]8t,s>6WSro(>>AYMet NwG2mF2XbiwZQ#4G*_#Z'in ?_'NWRr4hDg!hc^YTͥmW.S|[Vީ:x;bNWjZ+)9BD#3P b@-Fb رC~o0A-[P%TD#3¾5l@ ">sn;VM7T.> S"nWQQf~5Kp8d4ۢ ο?v}?< 4nD{w+Q.N;T: A! 6VrJ}9`r:oYB!(8_vv+v}:t@EEE:zo7DjVǏՑÇ)&6VɪWR P]`-X P"h:tj@n甑5  FP"h111t@ CQP5 9j@f 5  `A!DШy4*j@!Dj@q\.rss{n=zL;E ")11QSfԴiS)( "8_A6mڤdjZ5Rrr7nB'!8N>}Z͛cvsN۷.bcv E6K34c4=-rs'/_E)33CÆ W^T~}:5ѣGjŊ:p࠮J 2 }<EVi%4[cj޼ݽZǎeӧ>`5*@6mҍ7)n[bA)SԩS'?^]t9=T:O|Wg K?{^':Lىt[j3P^.(qyns{Dn.[5tʩ4ymZ`~ti]/5>V7 }R>4AS>WhhwP|/Y׮]pBwkTT7@2Wrr:zJx34.AW_}SAq:{%=4UKWW^s_i˸^ol+;)gLheVUG8*}3&Z~wrӯW?K)qn'5yOMR8MeqvF࿓:u꘿\eff2pj`2{QӦYWanӁf\7; 7ol>x|P8U5ÿ7E/> ^qǝԧRj۶;٠?Ui7h5dY\;[]h> a/ڥ;m.WeTv93S݅~=ګ ]1Vmtj;Uv4mXYi/[KvYgK?o:Uю{y75(Sue=^^_bDlj[f7F,+TKGk@7zkd-^4Imo{Bj'֢տbuG~pW]rtVa}K)jWuRʑz{ [.M-%oPݜ,>^f\H oIW(̜4O=s1O3_1JOknyF][[j~.[t/ҁ44o AF eY_Vm{eΝf 4hmye ;t+BmڴQII*rg6"~tB랝Z{ ޜW(eZZxflUpE.Bk}*>~OEwNe;wi; HўcŞ׷.:kz:x鵩7kA wgQF߁jZ Fߖ]ŀ^jTVa٠jmUi @_u7Zl֭[3h !ӽ{Hq~>e+(r+tVʾWc'߾*lo8޽; @2YYMo߾WV~F73>}oE;ٵqb=z.S$_DfN*QuX IoPWܥa\i9- tX*n(n+֮U˵sKnYsSJ5fأc.IMZ;V{GUBt+n7L]r|_)4SvߊsťC72s(u϶x>WӮo_.m6SB霾,ooxݻW͚e1h !Bs:u}M6aÆS-Zw[# Z2v6m.mNWxXۿ:]mUWGПtPOuԆFŚ~t珝?OguM[Oqv߬>FJ믛g>X~kY^{e{g{c) Gw_2D{`]TgO*vg3VSo7#**q*n>F=?[gSu~3R6=0&O~5C-?\фLF -R~:/?==-GLѥ+xgol} ?\;w6M  NZEݡY<28ی@8ҌB ޖ = O?]_~YSN {_l3 fq@z;v)Z5ʌK|=1ѣ>"K+K3fmi"!խ[W=SoլYgAA8ɓ| wQwYE=Rή]ݺu3@ljȑZ|n氼 *er0˵+VhԨQ4p.6d`srrhI.yWtٍHƿZuРt)@XM:Ef^YYYJOOSվ;-]T3fO8]¡}1b^z%?^qqqt 0W_v! @\{5:|=Z t qn  /UW]Is|Ѷ3gܶYb,,--7wzC\.͞=G۶m3?`:01w…BM4IvN`}<EVi%4gu[Ȇj?*@Xq>_]> dNj-[hʕD`|T"֭_'PRR :ʾ}fkʔ)jߞs`|p8| -ZHf5`֭FF:yo߮[*??_^{~!A`FMpFagzUMTƍXq@π2VjN9߿tXκ@;%ٳٌ\޽GGQAA! *++K i$33l~;]^̙sQ"A<Q  Dq=E=JB@"(Fos1Px@< T&@XD601> `pY. @ӻ| Q`@$ *$2+I7q*jb]D&cB?(D?*LA _|QElgZ.f[|ZO>n=ހz>?hVӼ;}`{ ~ttn7VyC=>T~|oVYC@ߐwU`@gNbVyCOU и~VF" c}{~}x]: 0t`kooeF@gt+Η10A?vL8FflmIBťre=vu7l-1,Vغs߻< EoOP(A %Bql>/099I/ƃ҃3Drě R4*.gar)7wy%H-6rDk*e+Iʅrb/JTw]ry+٤X!‘ %ian'URVzݥA sz!Þ!Jjpzp Š Kx3=Py얼'xH#.?Gy?䢞ZBۗ[VGvHbs #VZ`"F|kP~mZ~p"ОزP l=" "FX.X29}({^n}3&KnlQ%#t*^cBv ^k, & !0KznxV17#뒭sC1SFkQuQ[߰/MqC-%zw!t\dCiQG;D`mt5ֆ& fޯ]F&pXzvq8a4 ==zFc rfٓ4}-V0~ kY 0(dhusPI G5[| 7[Gɡ*,<=5N.!φjH+Y%>EYlR]9*TտQW-J X$ jed sO)aa9: *6:Kh<ޡAj|,ͲT*r1^ 뎍QAR^^Ž?=^bl0dr@0oIx AJ%$aLT9sB1'=lkE#a.nS!9]DYxH9 - Y# *FJ#Vʳ" 7 Fy $ [Y6k#Byq AVm6Eӧf@`*)i#H,/Ț@?$e,a2JqXehxx8vI PFq*6ؒˮqIɟ:rVWِ_Q?=Fe&qLjHKcL:S,JD"?g릚󳂽+kWLw 4z<ʈ3avy2g)V.Rp'X]]e<ŕQT=E9y um [^Bx@=wfs{kٌH.E22XPLnI.szM!%>DzlZGrgǜ{# YhQ٦Q7b䉰W@mEdrq" |0GF4u1Gs@ٳkT(Rޕ2b%O8Z:1=Q%=2}Eeڝ, xcM'rH2B`#`2[Dd&rN;R{Y#q{ ʎx𳏃Pƒ@*;dVѯ&{of1EK&傞 i%i Er'xiueEv#o|瓃`jZ.G^JE/5رcbLgϞR);2/?eF% e!@mZ2ӫBq'h||\GyDo6fc15I?%zSNч~H/x~[Vb񙙙H&'Vs fnv,.ҵL\,=**A9sFrI1?qMLL̺~x˗:T>OOuV-:7O<?Ia} * NĢBqGc=F}'t%̊[g|i\QD3v7L9Qf`܎{Mt[q%t:M~)W_}EO=TOrGN~{z8F[SVv#/uҟv^G !x xeICL螨[4ӯ9¡-`,긃N<(+6yNM_vDV(n ȻBO_|ȶ䠎>J~9YM\M5<BNs~0Q(8A &fԣ?O~+ޢD%F7H {|]BZFz^cR5JQ./DNK*)}]l92Ƶ Ȏ:RC&I P7K&ch$h}lʡzkO,JGi#,Py;N+(w 2)fNk?<=Nנڴ{H6Ī|$z52+Y >|Xl_60PO|@&(gg1z饗oA/_yPEq{+A^}Uo'.N&G^aeڽU9S} u#yg?G}$sJ;LC=Do}}-t(lwz+nKLk7O*⼩A-Sgtž# r5|1tts15v: =vZRn~X •+WdXe&1SΝ;5Ub1o^ addEdsƒKJ,T>} 2z %ȝqO%P,T(A+JB P(A %BQ( B P(A %BQ( DP(JB P(A DP(JB P(A} ]>Xm>B6Ϭfm29p[25.YckJ%%}?N)ϋA>|kaAH%,傄p? / H{T)58(OMp$&ؐ1%hme*GǎiiqZ\wtxxJOdmO)VCdHԡE:Ү%Yu ~@/\5j*zn]"R 6X!2}" @.u6>gffA{*L9! E"5,Pÿy{y.$x4fn\hN%}1LveSP:2 1zs,X^'Bf߼R %3l\=%Am 9g) *:M߾r(~9⠸5͗N@l+++ƻ¶ý<ynn5fX|DqO)P9} ,,,Sq/Vl!F5-FqOj>I`^C[rY bG2eiPlU(  ?f~IENDB`DisplayCAL-3.1.0.0/screenshots/DisplayCAL-screenshot-GNOME-adjust.png0000644000076500000000000014712612647526537025027 0ustar devwheel00000000000000PNG  IHDR |tEXtSoftwareAdobe ImageReadyqe<IDATxx}.wfv.lNM%("EɒU["&7؎:I/'q_۲$muhE`AX`w.Xl@ݙ3ٿΙ"""""""""T6                          fS-NDDDDDDDDaZHDDDDDDDD4YP]81*q|mł| U2#"""""""RcHz ,WH{^)qDDDDDDDDTL&ߠ^kJ?11؟ bDDDDDDDD4g|w`y-y28ł/_'F s܈MR>.Zn T*PP&8Z  J@` _fKRYAQ bB?sN爈h1<{0K]|3<sdЏh|+˞){okjBA ]sge4 .νZ,r<7j~F& fe'vٖ.Y`UeٝUU,DDDDDDDD4Td< iC~ G/ef˅QT AQL+oLӧOhᜟM˝GDDDDDDDDt $IDcq:<VH|3 +wYcr#,77e߲v容NH ӆDDDDDDDDDH)-(^|cC  b07oǗ3&g-yw%zϕ/G"1C""""""""&r hV{kYs|?9 >7bF= -XYYv*F#"""""""#bQQY_uOM8{Tp4mQ~ف@j]Hu$oQle%HdpJ%QF TX~F2@px2f(oC[,;p9 ɣ4/""""""""<$*2&TS HhP3dɌ|]~lQUuh*waU&qp*\p:%y͜9 n  'q1_hd `H#tP6X4,GDDDDDDD]2ȬJeĮrg]swÒL t(KEe]<@V ߁_v04tӍb* ]ꫛ*˒pI b\7W2Œvt?@\Ŭ(Ui";ppaD_8;$?_Ȋsga~Cx"G88o4.?y7ϗJ];]"emS}¡*DG9p%H zl|ۭ}2 z }+c(t"[4yVm9@€Š~ ڽ9a`G2Evtܸ;g_}!ɦO.<Ͼzmr_r$ +2?^ 0Fxp{\.""""""鸔b(|Uv+3+Y<؟?zRj pvJ& sy7oGIQ+e7C+{'nZD"3hWiXZ+ÖWx?MZ%d|'_\oE#60)&0ឍʉsц]{r}I$y|@X0 c$7ha$cxBq.8PwS8,lv{2Sf"DBoÔɓ(K/\0ko.WbߑDҊoeuxmVa)Ɯ`МZ)7D >mS_e):"^9~b&Rh3 @HQBECK2:qU|R^Ɨ{MX׸$` p$d!-٧9' ~fWx÷LK0+^oaU_?H}JDTsJuw9F"/`$v'úyQWa34q[~SSP3&/⋯F7w|j4UDc~Ƿ]oІn[6 ' ~Onl0x8AzØ^|0ok|Bez1\ RYuQ*[O}0z97|?yDq#^BRy*@({W4B#mc Xvgp_O=p3M3:On}gx+R[)6J"r=~f > d zߧgys(ObZ9j"Ͼ.O:+݅}m`wG㫏|3垼F'_]Bx۷~ [ sVi u,n?v> D+tSTo=3ɃpT!j lt/}Ք|DDDDDDL [eǶFѰ p?ʥ-q$T.|c|}xw'M lIg^MA!t"h$y~z #Q0 LɄ iBdaXa>(gOu:'݉8m Bhb_X%3 <7 ~ׇD|V[樊!aW;t֠J+ { sO??+tK]<CRDE,hE3_ܑktNsը!hjD峿ߋ 3?u.(V|B=U mv#6uQ'jmHĤL?Ve.2MPeHvڰӏaߖ8.Gp&f5'x@H-'6˜݈@ +T|-H2mı}kgb%5>bkpoCx_O{?W]}QsI^MDDDDDD_%q9ږg7PeJ|ڙ# ]|2ƴx ̟}d*u@"u[Q{e6ՉSoƛon+X믿\[*T"%5ȡ5|x+_{|ɅeUƭ}eH9Gx"u3q𣭯fmT!eq1v;pUQWr ̯x' ;e/uN!lPW.KݐLuP{ѷut̨ZConhLv$*o,Y#hz8:UKp"se7-gf]9MU9ɥ/ϟO@0Jw?| >E|厉qϽ?vKV TxvqBUCb\NtOuS-ز n]Gg %'䤺|.9 m3J Tu!>kl}[m ўOo!$+l}QWYDDDDDDN:F˷775bF2od `]E/G4d?os6Q["W%SՋɼ|'+9/Kuq`߼7s賂Y^ .+1+-YEWad|dZ9P\czE5m3{.z1eFWbǍ#2 %'%Ŧ#5Xqu oeg_ǖ JAA8$+L s^bv HDKlrv'vt m{ vīhb{'x XB>R iy /6oTSajy (q4,uOg.EU ;+ov>6*IpM`s[k8|HUW8͠6ycv (cDDDDDDRun%\Fpp^ @MSq,=n$ tƂgy#49LNN@S-=y˼|nΞ ("/h^R.ř5t\ (Zϖ <Ƽga8&i綣5k?&ȩ4֠/>uLX'#/0xK*țL_;<-/Drԯ^[:gxi;dߖCTFy+D̩dߖ'_&NsZw _-soH[6l(p{hxVc=y'B8,Ŗ쎨%Àmvx:^cmmwx}I _%Odzjθ̘BUx5ee `nuo ' S.|i?x9rtLMТ`׀ny;gSc@]>'ڝ7yByk Ӫ4ɎǷqu b! gIԢ }5$bqTMM+ӯ:XiT'ZE=žw^_9D" @*\&ow@m5eߪ.oF5x'~ˢ,um( h ahO%HGJR,p`dž&mC\7оya;Sxaym֬뭈|9刟1JhbIŶo%~z< $t9?|;7LЁ.7_ny[x,SRzB0bf+7 m{b'atl+Z^\nU#yߎϯ*â?epaH{ފp.ſ >ܸ+r=C1`dK> |Q e [an,]Sf|3m$2{1DJhYVׯp`? ~1S93Y*6h}g's?Ho}t9_>"""""q&y1/,M4\fn?&8rae4 =e #[+^#cp;?> ip..h*j"CcF@ a[^/t!*,ҲfC>9aq|$S~Uc*p:D۸zmK&^D?-(*QWl"50"DaխAŗ,Xi ZGMZU޸c +} f5W(OW\8qn eeZ9X,h4 χ@ h.W^+\Y,e mmHBƻ̻JVw@X(W.&qz=>52G$[O9=vZOy2;P ]Ϧ`Wu?9roy@ Wc}.`r8;dUe߆aA[P|jV{UP>W$x7?;0Cs>&]NkHC6_߾];xƗpܿewEDjǶ-q$,;9"_wXɀy94h@޼eϋ| UK[F*g 5V#^'~m1{GGF]e*: O|1"͜}/]{.KYkPr 0pK_~ 823K/ťΘ"""""""""+1. Q?1x@"""""""" ^F#"""""""p%ƥ`0H#""""""""'nKDDDDDDDD41HDDDDDDDD41HDDDDDDDD41HDDDDDDDD41HDDDDDDDD41HDDDDDDDD41HDDDDDDDD41HDDDDDDDD41HDDDDDDDD41HDDDDDDDD41HDDDDDDDD41HDDDDDDDD4YC+#LI 9NQj&MߺHoD'""""""/ EQ3zJH$$ːAbm6ebLqy<c*,N\?%מċm2jn]Bx7`sklly[q DlcctODDDDDD4 B&'w;o86V Y6ȋnĞ" ̓m'P4ےs Lu@:}nlU`Z~o`$g-c g7%q#{ODQ^SHtD:uODDDDDD4\o:@2(Յ`08| P(d^_I|g}GnLpk=îlq]Y(ˌB8ƕz:ߎp?"DFp p;lK-߶_5oeCTCWq 8'{D23@i. LsgcDqDuۏ;h@sM@x2mB/hn\Fg6Pz 8` r] U3dYMCd p4'0;B4lb94t!itOM8r"KY->Z"Z.|t.Ώ;vN3n,KRw Qǟ)^8#aӖ`h8$Ch?v-yn4]wOEe\FkڶW_Ќ0:D^;܅Dh^cƄ0"ڏm ҞY,ߊb֝}_Wfm[([eyߨ]v+gʥV:S-U+NF5ME\j+R2rr`dIQ6yݹVjZܶ =Aux56ܽ SMT'g6`BE:0g^ g-]Ynw^/ 3a)ֿgy{ט UӖbP -jroWp E>iKZ> |-u(N$lZ} v2t M: ϼܛaq5P1skv"(t@^}r PzyRtn;&#~EETNXgbch 2&^imdIFYudJ5&WUb4ޏ4LOLͬ<نHN'݆vo;NߏT|ɁjRs("HQEZe״Xyz]ވd0T֗C>tv̾xTjL8&MC&/oT3oنíh=[B~ILx˼ɷ-]7ONr둟Bҟ|4 2 vfZ5!dCU""""""тc'7ܸRJ<57hDŁIMaT'qFnFjarf7A1.AmV+F<3M ~Չ6O=s_75beCݰ/ &AX[8~+ۥ S>|n4hÊjD]94U-z#DDDDDDDi2p&w%22].רXl[qXT.Xh>:}]0.kQ`AX+Nv مH";k] ';S͝ Èa?f^T,PU{A^k éO #z6{#6ov=EP>h]i{@[h}ODDDDDD4Zq FL/#LA@y/gNa x0og5-v ×vլ٘\U uHtYs5Ty0qr-h;aC8Ӱ5—6㴹 +Ŭ:όkrVft&}騞xqo{|IJtӦLGi1}0 V~\.+ e1g(ʙw6L#9 O6e9TJ4" 礖FOH:dNP:uds_j6хc,^-5(6m7Oiڦ`-"w 9ni7Ӳ3gRËǮ-G1WÚe n?yCWKrud--$w'-t3w>ܿ|0N=YxpE~'0@DDDDDD42`|1ގӧO;:n|'+Ewv1 č{:lzY̡3ʒ8yěOq饌m3xV2QX|  >6>G[=d#;+ԅ28O?m蚁Wvx{(Un#=xNWbћ޸"7>$Χ^ۏ#$ Bo>`_Wql#PhtR.gP(kdRJrllٲCUD6xV^./B, tttX[ȥ#;1 qNuvvqRԬ>wƟ e~d2h1d^CmY#&#y}""""""""^*8@\;32O8 ^?5'_&9RW0L.sI,LrfܬrDDDDDDDDt7ˠZrʍB,@r3f#̦u@y|}=0n|Dd]q@pYM(wvݢDDDDDDDDcȸ d EepgeyTbzN ުb܅X4q2&eFL^e+ғ|G`28*g= w&""""""";EPV.ǭ1+3 +SSɲr3P'.qW L*f^Z Ξ6(/ \,r! "(zCZ76#cu='Y"/Lh.u@pl4Tv̟'Wc>8?2VU(pfzh^bfMR$y;x:wmTűNWjUr*Eggrp];qM%NR_ ~Zl5brдm:'pT~g\**݃k.8q,q1憡Cy8fGDDDDD1+8忒ulD$l]-g])xx\+i[O;Xr ɩy#>NTUU K `YY%|cQ5:Z6 eYcضi3w'm = ln;$,jTlUg݂X2Gs(ECӦvÏ#~8ЁqU͈P"00?TeIƑ)O=GDDDDDWqqp:x,򏶶5RALO""r_kyIhgt|TLYLU/ ʥ69q%u,w_@Du֍B-GEAK O M5O2krPG48X؃k+8 Wd5х۷17$ f,c>8%rg;;q00G`CCEC4 "iZYR_N6ira `j7# :HWJ8XsO@9:kIdtziX:̟R[ҏ3oWD _ +gF:&cɪX4]|77'90C l|t+C"Ѷ`kꏍ?uʬs c]+{> CµkxN1 >ɳE̓ 8>A 4M*np~c0+.:n(T2X+MC1؏~ZxWL1+0/ > eP.FWxX_@YPJ_S+n]xyES*}2}6/϶N.?E ?x#慄a3_W*>ph^r1#zc&{"bƖ~Iܺ '*֍vm ks^۲?:g*wϦWN l/Ҧy~118 v xŖR>q8pp5,j YR;#tR ş^Z޷Nόry5DDEȁZx*vn|_Zv+G Xu֭_'r#E=nŢoǒ9\ZԃDC8cx&D2qe6o/{3n|VY߂WubjnǂP*BRL,o/9״xMKе9`ܶ~5;q / ˑ寿;~3p\Hݫh9O}b8Dunsg.֬ k.oRKCѳdԈǐȫVkns_F'дbs :H>%>k1gDq97B( 5Q<q'_o_Rkxlq01hǂQS'WuszuY<҉(DDDDD4]h扭 J|d\zF$R=tPW30S4Ggo}ݸaVE~>6Z:2P?kB8TcUsӅ^ىnq~adœ  ț ^!+=M"- +г xpmHxϣ~8m"JDPt@ޅhccǡK:q][Z TO1GV=3˽=3~$xSB~>lgT&ۡU5q^,{Wy|nvaY|6.421*Ӏ_~|}qj/^y8Ԧ%Pb m٤Mۘ[ Űh2#2RKw@} we (RYW#҂?Ꭻ<َڂ(3#x3&y֢Bt2AxRe?Eb~olRKit<Q.K ~_O,W/`~|.١aXzoY ѦWD`鸱u_|nGoޡpc 5+PPq"0  Y-͹y*O[ 4lϱ-m͸C-B+ ( ˈxVTNn cSKQC&TFgoRt}]^wqib%}3`Z kk޽zb\ts*TeTwKn\;}U#Hr^-UYTMQ'"""""iWP|=>I^Ý╵"m˽|C$g}ɍ_X#5ApH.5{ZbFL@YY%&6-<(?p5` N &LAbI *k+a&zW 5 em2K|qvQ5rieNs=A+?\y*.f KqL@e[Wa^lS0eBLt!sZD~#2˩r,]s-ftQ^hFb (S_KOwOڱO#|Xz)VQ6a_5C|I `۱`L*Q_Uv g,cI~//K{gZM|?DMPX3ۻxD{X76:˾;e{}@J49$(_'ҳCQfX,ەv}PAFy˰tl#҅3^K}v=;p-7%87޳p^خk׋׮6}jنً[nzo8 ~p*R RS[Z,냸^8Bm^hD U],T.֚iT țxD\}WQnnj3?..R}K|զ"'wgV{K ٖޛƔN|S' )үp18k?g؞yIosA]޷,-xzKszcfPX~ϩu1vblށ^;bxϓK{@YzϦ=4WSK.(=]L򻭖Q5[&-[l@=+N; chyA(')%CCsDZ$RHU6[)&Dq/Na9Е`Rsf{@-7 \L-R(z"hDnn'oZ5CVYYw xfY-07>mqO\ ֺwW2}2}6/Ϟ """"bΝ7¼}O_FbYIYIΑ0.gLnX]*~扟sqrEO$H/],f&?S@He! RN|!Qꆭ +HDEhUXr{"=ôяVyW$}j^x x-hY>z\#~# ~tc ats]Q:EWVh"\x$XTX$eP.\G$ɞu?a F rij;rKt`caN>}l*v~_l """""|p01d8EQP [ԑsk%N4Dd1 o2<|XNO96C0)U&˚%ӡDO,A#|U5Wvȫ1`(KKn\fcxʍ?kf!]꘯> ܥ"7`^w<+O y~c.mܯ75?0I.r)YV!!HFܿ KniPt8\6h+U/*n>6YjlX(4{\2B6DDDDD4\:YIyO*M.P`$O@0!zK~HGD#jAj^N<lo|̫r#䏡c|P \! J/Wl=TT,|\sʯUkOG6< n2ƗX̱rpau>|zFfl^zyhl~d0+S30ٳ89$es`w'6T+Dq-TdA? s-@ۅe L`)}p{rXG/gςmթVeUgM38w;v@^f6-_S`.;q]w߃嵙L8M<օjDql~m}|=\޻nlј0.rP()wr׎%B\ Gn n y6evv|S?̷;bϋuwQ[[=lm5 Uc6cY̙a'H ~5M˰>M'°_\y;6U{]x O@sV~ Nhݏb! $pxvQ5W{wԍM""""" E0 8xS[T$O$@PXgs= QSC M@&?W4DzTSimtooq̓{ѭڧa0JlI?μ:^vՃ 8E3Mʡ!6Kn]ƺqN0)gP]SkbT9 >mP/27hu5c˯`hj&Nn=~s+_'33hX|܂o@ztP,ZN69&^r]镼Z \wWt@͉5s1]?-Cfd\,j4¡xm˶,P UhHI{bߜa޴rhXz!\_cԵ"ޱމ (̈e^j%5Tppnߋxns;mOƺş3e%35koo^9X>CtS6?N. 3VyP D:߈~~vXymd>)R>xt?>A+g}}t ~vV{gPAt 3?}"""""bp̒A @jCՐ dLXzn8m|O\i8L<#2H V]VVnGIkI1!|1nmP%݊x#V]uG ;<Kll5mut|~C4ܶ~5;q /QS'}WuszuY< *,.x'&NFb~E}b8m0\Abz>[GTo%V]O{Ŕh{ҒX+Ma.cv \1{*<ʏ k}i_9cDENN PbÁ0Au퐶:=[B?qbmmIOg?Ƶwyg}"""""Yo[[S Xm2 ]===H9 C>$8i/1}dgoa (++?oÿA{Y+BX `zǪNE[A^ EjN3^Oہ"qq}IsPi>{'>NOH&}_ř*A<˱z#MJy{Ю87DP8>_lS09ׅ{Ⴋ%^jGxK1}Zͧo'0{<*WwoH|8#h(Eݟ/S[WTߦppqB,]8^ڂsGPuw_S=5ߦ̟z>iZ ֵ}"""""]o@gg'6r 2&,Ú6xp1CtyYrي{I%1[&(ˆ.elz)0nSLMÚ]LO>Lz=߉O`٨}\ ލ)3ːy|*@]&=mn,O-C~D$T"WS:5>{,co?ڦpHO;g#b!w~mfޣ9Xc{}h?^kي eN8J<N~+m}7w~hhtoj7/$PtHh2de]83_\Gjwl/҂䌪¥^:ZR5!k|]1 S|/j?SG1oWA+2ҬIGu<=o;;(ÊAy&zOR&Ŷ%jݾ K(+bUl@xro!e@D~Cp$-ܨ>h?/QF铓rܡ|য়VpƬ}v[ڍa=^nɎ1f.JOewuDAg}j`#_b q]1a%XwM%X,=Bȇj7 'N(9k ؖ-.[=*lMxhfFՉPZ[,{&xwӱTmzm'؄/yc 86+NA2>:4 ߏii`6iu8~s6)-A{eDSa aaڧܟh;$x1k.a?uobÇ͸o!3/A qK}p=""""""*Z="U7!]E /WߟR)7x {#BkS"FۥO`織+o Z08{Ăoh7,4"&aZB-cYd O n @v#J>fxsR`#SMmG \>ˊS:`R:QXx`Vd;\*G χ |,Ҷ]8U[ K[q2> 5]Q8kL Q&V """""""ml6dgg<@!A,2:UgZP&-}\ =Oi?"""""""ۓ]>R-te'#ldt#9鴢<^c;cug~!;f[q,m.~6eҳ QoOO=ٙOcY#%h݀է 71_yŗ%R~Ӟz-7o g?IZav$ԏv:J0{N>?y8x ͝Ct]Sf7<}Qt`L~vUWM^EDDDDDDQj.77^R'HW.m~n5|n{Oξ76Gֽqk,P)|=3?ΪЋ[l}oĴ~ ʘ+azYtb/vي056Z;}rNY^7R>3K+0ogsaeAfܙ~{vz`L+ s-ZPWNnǖGr+hbL+͂-䅫#֠+!7.:JL>l{a((@[-܅]o&Ւv<+}v/zSY:*iiqmcY~ ONŞqE=ycqNqLYb󤯙 Vج6{i<#.`nƅ>IpRMVYkEpj֊O7#{ArײuyKc(:s0MB@?+TĪsM3j\ aԄ|Xr(ɴ݊ ak:;A-^kT%V]O{ al܀n?~}?RX{Zl~;>ޚQcr U G$,X dtbÎ:~=f`keëذ<|6h*-zovQ6G3^lƤ9݄:?Ž7?  -y$:O(ܽ^Li[_;V'-YEY&VP^ kF-+hbBևQ(D/J6[1, ue\p{hpG.GP8>?fJ*P(kL/tX 4xh?"(i}D ׃ DZkyX'AY6m?38(]x{j1iDz/ڵ}pC6~b?jN5+ԊON!crw?3FyptAo놻3{_q#S09ׅ{Ⴋ%^jG8f~Ю[jN3^_Nہ" 'NW\>گd jYԆ#V;ODžk-Yy !t܆uH8Bh;us@a;1e33SfQG i*mO$^%:NZx}>xڼOc%z_'sN~/ V& ];;;%6}Dqu)fLa$BUMVTB\TQ}Qjr N{RaX3aǂ'_̀]Ag-(B^{?/Z:>- utōPKͽ90jTu`WSw_[h^':Qq#3H;<ށV_?{8Wb;K}@6[*,)K!/ĽZ;\ ۑx \y,҅-8w UU\ߙpG9V)3yӦvޱTq6kN۞L8^K96S/ .I:En % {$Jn}#;¢1!c,pւw"hSVCH&NzR6V!] #lso)CAu]ݡ5͟jҷ1oh̼ #_Y%3'#1R m]}7ak2O@QM{=ԏ6=KdLX53l8TS'lcW_WX9؅{ΙȯX]ec[3&;©_>D睼xV\8ksdZ[IZ;oNyyy NNspE^1r`Tw &Eh=]wNЋf:(CAV6 h=OE{L(ʁ33 qo6ODiArFUbJX/ŎB-q%sWl߁*c YX,(M7TY1n&Zq䝗_˲e鸳wBl9[:yNdؼOD빘j!*tf#__6ml[aDГļbʵ뚕"=}X21( ZW\MpHk01`EZgڵ[c g}Σ8i[q~CB/'}[Z?p H4]/""""" |XJ0o-_Zrq5}*oC75x)Yq>?Uvw[ڍa@jyB ݭ8i2ugƘ*mZkbY9C.۲eKg=[Un-o;ry}@91~8X.W<0gaQ8wq`W/,=A[؂*LtI~t&`,{tVwڍ@x*TլGc߂5}}WmXk8wԟw.FMʵS' bD&GU9|iߎ3u<ލs)8|hYgkl‰Uq-K}*}l6?[z$ )^"""""",k8oe5LTa1,Ra3,J: <+=]-3;T@yN\ vWFs@&eh}e*jM}mK8Y'hBn\9[^ޖ6| _LM,BכlĴ~ cxhN8mɚ5W,2tb/v׸{[>3K)Lȍ Ρj<ޯA{؁1<3 7jqx.oB5͟.'\VbŘV[ WG&AR9Ŭ'Y\ۘlA5X:m42-t–?U/coy}] fGq{)'rz;}v[8g+#WmIDDDDD4Ұ_9].kYValr^ ѾuYkHf_#'pi̽w^džmKt0[f[y;؂4~K3{޻ovX b+e}}f؇37`o$aב͑[ow3|OT`&޷+_Oo/fht.U&,+(u ~1שx~rXj_?u wbEV2<0 '7mIWHrcwS?΢UIKbQɵ?j[pNm<щ ;`b"pAfvntOkoj(Ү}QvC5Fl ׷ZNGZΉ}]m7yOޟ $P3iZw .@9f̩f 烧͋H,r׶h|8gOŌQu= GE8r9rp8PHic|ڏ66ٴO/tX 4xh?"(i}.mv\9BF{?n ڛ?NW\>گd +#kr<5[7.ڗY8s]8.q]Bvc^A7<^Z.Ǯa4e8q9ԅՉLX|hknCWD.%u-kmtᆾ'%P[(jÑ]P?tc8H^+ߔDDDDDDC4m9VُxuX=5$]ˡ2tcD_2Kc\h0`a,䏛+*9 >"rZ1w\/FNX=m M͟Y:-gQQyKg4ωBٟ;P"dXhMDON>]8/XfjId ov ⷯzb,^sf#7n՛ QZQXK'qQDcÒY1EYH.wЊ4kJp !#cފy(Cv]dg,ǒ`Ai:,IDDDDD4XHC+GU9|ih8__,%±-[`]k??{ֳUXU{}v|=Z래6\w?W.Јba ے 5x)Yq>?U =1^TM8q+|VnN/佀݊m=!}j`#_bH+،bW`KxHpt&`,{t>+3B>4W12Vi 6ذ }t\;y2qDv{皉?C9Fz[7iZMboѿL墤5t& D"ubXfX$ty^|Zϟ!3/A qK}p=[lbшtС߳ȇ؀ag T%E 3c zl٨X ' ͢:]xjveGDDDDDDDVf$ DDDDDDDDD0DDDDDDDDD0DDDDDDDDD0t";;ADDDDDDDDÆptՊI&իhhhQɎ!"""""""!pɓشi٣φp81DDDDDDDD4|{Cee%JJJ̙3""""""""r A @FFFvpX$""""""""J }) h=z4ގ!=V~~>  QWWR ܹsđ#GPVV6d7nN:\t ս* a` oرطo^x1Z K.իWcnD`zy,n޼*}QgO<ߏb^ """"""""J ~,YD]wݥ˗/ǂ dʕ]t=4#n۶ oz衞XvⅠ3 JKKЀwyEDDDDDDtdggc˖-{~6}tݻW8V8qD xsN<쳘3gwƆ z. <^><(b rOn5ӦMkmmTIC|;+~|>~+[o|w}z5@)d cEk׉hx0LѨQoʕ}B_׸|v2qnGZZΟ?o&֭8J($GF ,^sNW6?>pUU^e(eӈeV?""""""ܲf?֟'ߏ?@}JJJꫯןhߟgyRQ(!Č3P]]͎MU[YGDDDDDD4p$0On-//G(ÿ'|#<';jo!ӟgzL "KfcG7 c FDf}_p8Imo} /^55a=Dۈn DDDDDDD#oD2ɇ<R_:n݊#G 77I7x3эpsN8M6 /\QQlv*TXGDDDDDD421~_I@'^pAvcҤI %ʄ!2C e&a aXz/kDDDDDDDDD` R$Wy&n/?C'ܿXV^;w_׾5L6M8DO7x555zx3ҧ]׮.חv^R4<"""""""AЄ+۟g\oxS}w&O.=plll?o17Yfa`ffW׋55{znp־?$"""""""d MHf`/cڦ3}jC "0,>ʿjjˮ>kOA8ϟLAFFFu\D1=Sw?/ 56&_iի@yyJæ]靁,OrKI%CDDDDDD4 rx<|oɍ?wO=OBBy^y޽{>!ۊ?ͦ3F_|hۍHv#"""""""4 c*@u{ٳB>"aq̛7_ǔmٲm{W\v:}֗[%ەG`0ʒ\ce$&a_M[W^^>~3}f4kCm#$C+vfDDDDDDDD :u*)osNĺut HaN|Iäґ v***o} /RرgPZZ[sJJ#*h}$"""""""A-hر8ɓ9s&/^5k8={k.={'Z[[L'a=d7NśWbv~B!4X؝ѣ>Q_Hl;aېmEBIaIӖt̟?H踲2l޼yg2+)S0k֬*++q933F_Og]]] wo'N˱tRZnC-4, KP[B% 2jo۶mx7CC9eQQ?!KgZQ_d;ه"ՃRa(! '"""""""py<޽6lɳo4Kp\t߲__+ӧO޽{qDDDDDDDD2)|M<=?CMME+**rJ| _YOB!}=?6m@zDDDDDDDD4)pz{~&ߪUʾqƙnw5|_s=o}['?~tQF遟Y(BQn{ |쌹wuWwy^gXf?d"^oQ&@n=t^8|꫘0ang {e2x._e˖{ի_'O """""""0R'Gaܹ ?iPB@D&A ADDDDDDDDIc`rq؎WWWT01>OoUͮ Fp|KvAG&R!"""""""pDO!Uc(<\s g]ڟ4/WY$"""""""pL8կO -- /o>ʿsC}_tQWT r8b(((`' v} 4776}jD&+rO*E)im,Pv XBInax~ꕀcƌѫoOq l@0DDDDDDDDè=@E BB(DDDDDDDD4,˚9$9{s$vd@ãa[/V""""""""D| tL|i"j>ᇑ?/Gf~f v0Q icL՗»ʋPY+68w:13|g,((`Uff&&j+'h(DDDDDDDDD0DDDDDDDDD0DDDDDDDDD0DDDDDDDDD0DDDDDDDDD0DDDDDDDDD0DDDDDDDDD0DDDDDDDDD0;S @cc`_BN[""""""""d iش]NmGs_Cnn.;h1aՅ xlS{= ӦIrsb(((`'@!?N(\&&LHmD"6+ >DˤI|C #NB^3#Z6xUP^p:RwE `"""""""ҰŔ)/]` 6[v`~X"""""""8Ұĉ!mQ89DDDDDDDDC$""""""""1$""""""""1$AQZZ/DDDDDDD4D4(͛qFv0D""@DDtbHD&ƍӿ/]N!Bf@"**3aHDDtsaHDĜ9s }׈R/܋р|*@gEk"dHA_׈haHDbSXH4t_%"J1S_ n. ߢV .?ZDDD | oTBt2SXH44CǏShX̞= n QWWxV+233QPP/D7X Y' '#A ptvvHKKêUPYY ׋ɓĉaYtSW hn፾허h~Śl AEE|Ms=L>@ _|py=<`ƍ#U@"""uɓ; 77>^o~nyyy8""a6+F.RD0$""٬삡5zh\|?FiӦ$""J8+h8""!yiMΝ?+DDDfw%¤iCI[)( zb֭q""Y}CD7""""F̜9?я\oop%5FDDI}o"A~pCLߊ+/v|+_??b̘1bQ7%.z׮]=ܣW~_D^^zq9=?~ꐟ~̿ 6CH*d$$gnii'/^dGѐa8 j޽[9Y@mmm4""""""""2diiiرcx =klݺgϞ+͛7_*?=z4;ogib|r< zDDDDDDDD7+fÇj|;xꩧpw;yd[NƩSP$;p=v>}:… 1g릦&lܸQU<8*.]׍6i$]VlfϞ=5jz!c۶mpƍ+~~/iO!ǒcFK.iStH/t\?+ҳ_!=Ӧ*BFGEƬXwNkllomzk}rRm!="yJ_3 FocvLƾ\ۚ^FfRq&nG AQQ>C^ݗ%KˇXC3*  e$B :{2A $8E5+*2xz0&f,Q'/-fYFt"#cILX~Bl5drv6ؑפmTODDDDDD#<dr!|˫O*eIiz]cjd&(GUIP8RU_Lk7C6m\ۜeq+.S&sܖ{r\UV8bMd#Ɓo1~n7xU[|cرca7T"៼.JXl%*j5BjBuk@H^*U&QT9ѳ HU=Nv0Oݺlv{ n$lJd\U(nBݪQU{_3i_&xNFMt"YHSYw3dVdlX3׏7aq*H:1*~""""""]0vwܹscsY"LO*ԳŌRdmuj] kgPEnT@O=8ᆴS+ZJ=P=PMX~Ԥ*4RQul=шB1Lc] PeѢE=;O͞lFN3BDՖfS1>/Q*Ut^U=h$}d3YO*$8pPQUBXχT՟g'*jqx'""""""-CӧOcc}"v ggE?_mD*<~.}ƐH@ $2>T06nŔK}Ś5HcL!U7I8#ڟ|/Y]rƪIcrdөsf|N AhREt3u oN\xtM¹Y_Ԅ$TKUN7}?ݎ,9]K"r6"ð=j?ީܿ*|~r,))D 4I#N+hɿd =HL<*""""""!֦WΟ??:|> Hff&;F,V8 `wժ?/M*,f6o a:`a8y~xc#oڴifϞ @hH1dR'q X>}rv )'NgIE'uvvÈhHqA$ʾ˗_rA8N\.v 6mȌBfݿ?.]tCە'|7np[.\tn}V^9h= YWnc=ѯ򊾾lP~.۩v7k׮ד8?d_F/b϶+V9={ٸ]͙3ozl3N( =/Jj1ԾTzuS!}F~5_֙4iRM^q .iF^T_޽&Kی,}/ ^yK_KAQD5ٱGDDDDDt`8222ڊ;#z(,,AWn@J $P; H oxzTIόaeҏB/H%ǗuiO#Lj|d_e{ eL13N'˱59w嘲SpPƖ8mPcR&In*3A*42fYo#{(V[ x?~X3JK?J5]Gk&}qT^ڐ&R{DDDDDD ٙv>GJEdEˇ_~:,Ko T`V'ߟ>}Z_'zLB^! 3VɾxDW)UB^3VmI(# #TU^tR+?N6mkiSȶ:N%P竎/3\U0f lTu_KBj>FK2V3c{s @f|/?0>QtAtN~gH-Iȕ6>>W 'V8f1dͪ9/YhFBTj,]xg[umPc5GDDDDDt3Tl6}x}Y:u k֬gzJ~p% #Y$PRgJHU"H eFkO$}IX%AǬK)$ +!{ TiF;uԘl'Qj3M H$8po"ǑlKb5΄XǣX[,H8l e~p[Qd]Yݦ.Hh_EǪϢh*W۹cQវu~2uUh߱GDDDDDt3c z|s{'OD}}N2[l͛ؔ< { "sU]@?uy uz.R$ȑcUzI T#UJL+1>}l+HbQ~j:61-M K:sJvOX}; l*o46^w {?cf A&hϜ9_qìY0}tAJ^CT`@B "d蘩IBJ;^h#x6`HAU~I?I` oQ5VvE?xJ_Շӟ E>C N $ T1 Bd;s0j%D!R!Bu[;d:+T $dQ^3 Ⱦe[PsuէR()ǑoR$zFzVm< t"9Tǯ#rnoMP=#Oಎل qux~f2.dTO{ cfplmmm(//?ٳg'~?⩧n:BF"/OF'0*Ka3R=>U8"A2 Scl -"h59 vrƶueCL5QF=GNf-UMM8!Y8Xcll'^&0C+`y~#Rc*6yߧD31 )c\Ɵz~etx(gN<;d IdHS"HJT2 vkjݯ׵U o_Rj˶ʡD l4@0B2{;rrxs|:ΰ~N<_u0y=9kVXN&цz({NGg{17~XGMQ.Y_`$q@&.GO+‰}[Qu,kylꕃBĵG>Nġ>j'–|شУ~N~d1L19~sX)0r˓4MĿzgꫯy&?g[I?bvLuFۺ8gGc_Z y6G;]JAjF#__^oCN@z"9Db_mPr^m7-˦M_+ExLVɉ݈ehhhd)/O?NE\祷wdu+-[=ԖI@m9v|-C%Mg&p ꕎQ}''&M S`j & `@( & `@( & `O΋/o,A* y'e`j ٹsg>~g; kW8)U@'Y8i*@]upr`oo?2@`Rt93#:~w~z ffi1<<|77irCCC/NsNN=f@?t}gi͚5Oog]7x3~z}cǎjkN`T2b| }:an- դ ^v?ɡi144֮].jo|7U`LR? 'GȔNgqF7nj"^{-=sӋ/򕯤OW]}Q8W)z(W{+yM7ݔ:X\Rt dE5_px>o޼Oj,>L. 3"f~`_)&&駟^-@w.k׮Y!NZK/!EI*@.@ऴ*@@`š*@@`: v*@@`B:Ue``"N @( & `@( & `@( & `@(9c[oM7nlUW]nQ5fkV}Mԧ:%u]T<@zǵ]x=ظ #8җTW\qEZzuzΝNG^_wusϭ޽;s=cS']`AmmNXK/ǚHߌ&lٲ}1oaaI{.^@}n:JE8vWWq,_.*.MT>bݺb"Ћ.*T01+>p0Bf08Y"\sXڵ:h[@@AZbYbQetE_O9uE Wڋ,qwzE_Ǩ.ˁ])zEV?,Wnݺu1WE(ϣ2_팊8܆/Jvm_#̻Gyrb_f/%(~E@+nmxljW$Ba\;r`~9n,{y.{-Tc_+ry9Ls65|8V,9<7_ر#=z. mI@(ZPPEɈ*5k֜t=E_""H y8|/ž"GW!^l ?/ª]іv[m.l07-ߓ0ԨW SG sDMT^7oN*<8c<ĸ9+"/UyB.°p"t/"ċc,!*^]l:_g/ս9싪¼n96D@U t;XOU}%By%3.˦M .^t,CCC#O$`ZwyodYk۲eKT-qr2X[?kKL``L b00&A L@뫥sM7|o~cnvF{`:"lܸZr{t;wh/_^>wym_uUdk׮9{z ^zi˫GI<@ڶm[}wZ7Ǯ&/"|Ƽ~e$wm>^uі~ubѯw}wu뮻nޑϣ-.c?ѮgvhK}0T2E!V-\Ų})Ρ._q> Ο??]}gqn$EGX۷.m#}7_+^*=֏Dxnݺm/Vru֑DXת-[VwQ7#>%@5+^~UֿXY.Bq~r`1#l ƼNnO#fX͕luKnC>x?Zf]c+iWx/6ݪ /׮23o02ޏ⸹⽼Mx|qh6DwZg{/L Z9}sgN͠.\n*x'ޯO} wAP,*Վ; )BP吰iuV} z\rb`~iW+ |?\m#m%NCcq|>Ѕf^Οz(TOBlmxl9$P Z9 '·ƚa^S![Nj-W jzdh2B!>^|怫.®X"m{9̯s@l3 9Lt}ۓخuTWx՗Q9ԯ}rK:63s`|EȬY5E~v&M1}"U@lFu`"́ܮ]Zc 8BkH[_o<#-z]no3a_Cy$/Yc]=܌7߃2"$4 dVaM{՝LâP?.^-[oƳn@5AsmnS30kfvuѦ\fHW ̕{yzUdz8^|_澊ǼC@n2Oo13ޛg79gqA\u8Pv}X0Bw'Y*qOVa]0ߎ^|Ma|yxql'Ji16͛._S@+=w%jKjK܈kA^6mt _7xJKM?pDSXF駟I8R__;[e˖?-1@m9v|-C%Mg&g00%-Npר ;3z&d00%bTbXn̴" <*`@( & `@( & `@( & `@( & `@( & `@( & `@( & `@( & `@( & `@( & `@( & `@( & `@( & `@( & `@( & `@( & `@( & `@( & `@( & `@( & `@( & `@( & `@( & `@( & `@( & `@( & `@( & `@( & `@( & `@( & `@( & `@( & `@( & `@( & `@( & `@( & `,G80=fo?;o0 fяo0 ⽽g`vT\pipp0 UǼM^r}}}#*`v,as_|<ދ/ߘzX[@@ ox௾ @`sgC]' &Y)~fXߙv& YC? 0/'KGy¯#=D4t/ ̲\ߘNυ~0; `(ρ^Y`oڽн0~ (o10{ `K0{E~P. L@P0 L@P0 L@P0 L@P0 L@P0 L@P0 L@P0 L@P0 L@P0 L@P0 L@P0 L@P0 L@P0 L@P0 L@P0 L@P0 L@P0 L@P0 L@P0 L@P0 L@P0 L@P0 L@P0 L@P0 L@P0 L@P0 L@P0 L@P0 L@P0 L@P0 L@P0 L@P0 L@P0 L@P0 L@P0 L@P0 L@P0 L@P0 L@P0 L@P0 _3889pLI?-X u5=YlgѢEiiٲeXJGMKvJS/9UP rŋvAߺu/BF`jĿ V˚5kpǎst1A׊p-*u.]xJ~6lWO>UR?fk_cmg;ׯ Q;`a{uuhl'*VZ勆1,t@61$/µnGkg;# X: 2pMwjg;˗/C C0Ld"tu;t ɽ&T 4̅!0[Ŀ :{tM7?_E0|yX"=;N?^Hڜ>ҒVY|WOܞ8s />K/4u]'?o|#=?a׾lT( ^6mT=nٲeO?-^yjZpok)Ypfӻ^A/?ֻ9iwJx/&U.U}?H[x.}EL+2]r%mo{[:|p~򓟤W_}z /L=X,.g|}o/_wwϞyY3ȴ=ӹn¿W|5}?ꝿ( [.#K֧iK?ޏ֗UObak/<#HAܺO>+_SӇ?]nӞQ`CfCRwyo }$=[ǣN954gEMWty<+ڟ铗opsםاS6|0^ڛ<w"ڏ+_V-8P]>|(혣}CSǜx`:P)zQ #XE?6Y 3mAW}ǍaAXqq\CG?Wǎ`-^>9\f;swϵU_4ƻo?!>^o.v;z4V`'ρY?畏>"p9z@rЖxSUs[#|`1׍ǻܷ6w?{cy}\xq*k8BKOKˣ{voO^wEN-iPoZg?!ScxcW˴7-Noog#饃Gҽ?ʽ7^oӨh'td?=>^δqӮZtgEO<޷r+.JW]$(H~K/gX'6>G떦ޱM_1| ܔi;W<_~8}Msؾ)cN[ aYa.E0f5Y}noEFV9xcyb zm2׍|j <@>6nXa_җ0& {?SY <+qʃ7 ;6ҊUO;ZV?f<)֛a룰ǽӓb?/oG7cN9յ>c3M7^!>t/OGk1kx>Ԙ9sr3]5Y]I&~mCm;Ŧ1#DCh6Fǹ! N-q~n700oW{=usNi׮]GV3w ϥG^Jk׾;}G?t䬧o~7t4 lz%mHk.8'-j(璳7Vk{% ţd0\gʴ7C?D,?#h:+ݑoSݚvui 71Nl]}yi/QoZjuZx|'/=Էf]:r7z7/)5KQՆ]Ir1~Ǵ$E2{gǨ yXl}"E\f14BO.oW#4x08f{<ڕ%gyfa9/G`DCvhK )}J:0>a2};v,?sG[dIW_WPw+o]ow^Rڱ@,9}izkO̯t}K9M}GWhA)nx[za`avWl_NxY7/IOJo;CoSKpu̟x~o\tJ:ӗ=ޓUt1}NjӒݬ5¡xeE"%|1d6OVh#N4k@SOiWnCYYpbxs/Bye޺|^9"țOvD;x:jqGyz<3͛Ӗ-[[u•;Vv=+2]|i̳SUm O"O>J:t%w15u_vh_o߹;iw[z%Nҏ>vXr\1?P[b``mڒ3SLK73v :m{88x`;H"(____S c XnH[&:40bFҩ9? ynQ6̜y͊kS;ٷo߸gF{, @,XP'7t^kzv{n_2t_~sCϟ#5zkzvCw勆K/͉!@#bӉ Ui\~M7gW7+ӪZ] څ~v3BvUS?c.v ;wu$ Bz*Sk5`pmBtlOcX=Z~@Z^{{>g4 {ܮBp? ^NϻB7ܪ{F 'zMuh8;ݰkI4`=G阞 v @&4o7ega̦8*P^] a{0T@P0 L@P0 L@P0 L@P0 L@P0 L@؝ *IENDB`DisplayCAL-3.1.0.0/screenshots/DisplayCAL-screenshot-GNOME-calibration-settings-thumb.png0000644000076500000000000003731612647526537030776 0ustar devwheel00000000000000PNG  IHDR}_,XtEXtSoftwareAdobe ImageReadyqe<>pIDATxi$q&yugw)u7H4҂ V=`Wٝ4 JR7ɾg]UYWVWdwGDEUd]{={faլvxk6gv;Ey R@qoڵkcmW}=yA/.tzeb^kZV=rV#Ǐ_kǮЉ~;tK*6d&}/;?FWm@o6C]֜BEF`,.^ߒMP' mDc#;tbkǏx=X[[A(A*  (hjMy8NBa)9&նqs:]$'eO ݍr/y1XvC9 MeSԆ Mx5p{H6 0KOH:w M镛^*6]o7Jee-)kh+dsHe](K)*ٙ`0<<,mDOO\hٵ+,UhBp8P >Z> '1K h nI_ C6ӣP!ְ̓KPH[vK*17&颲"2L-IXF՜.7)W-2K /2` mcv b$P.bW&]1?7 lou6e3 pv˗|!,UG :Z !U, znSY.-#\ !QmKsU]\V KӮ K6(|јu:n!ඡ\r`h ;ֱژ.?K| hxpzLIRN PPG+אZHxvo|8PkyPOitIóSAn̬1Qt\Jc E|m!]iZRen3M="s6eFtp$ }XVիvsquCmhR/b8bGM0v&i7BXǾA7M 0vfK_FbZ:8J52}@DSӶ@bnWǀ NLOZs( %h$ĹRAZ"@*_L/ 8.Xy?[ƫG1b /j(t;9x"bIЗ銃dh;i] @ wd\fQ&aLUܺѲ1蛋yTu#n;lkI_7/5r = vyKUb n3ZS(7/ps3fTDt1SjӚmAE@ 2G>fsXz?cl ˁ|N6 'dLϔMu'(IJ$&~v(Jj~|H;e*1OZc!/D7W?4 27P0Kpq a#ss aQ; ǝCaoy:a9}4]4"R(ӁE!bRspAӚhD lHL f$rU}y%v7FCaNjt-}0QJM'ALwlzR!FG# }zD`3w:!phD`-@8z*# HӅހ#-KEp}zCG.WB5 9Xmd" ̺[ڃQWLe2*._Oલ:TBR n? w 1{+8LxgAަ*/ QY^z_"-%l)WU8I8yn&a! zM@ޚaR'4¹bU0clr+JC爀|4h X͔AgQo`AHol//_E@ {/5w],$`T5 I^xcpm}flTS[rfN[oYoRclGZuv{ߟnF"+5Uh PZהSgCC_ ,$ f`' ݮ H!ꊩbn7'[w[y_Q^NҠ.Kuu 5ii:[a !1z^:H~t&#Fј['>&Sv؉ޭ];ʣ {S}÷-l䱒.ǰЮjN7 tv[(׺<8,К KGe7׻vNuͨMo6K3cwvCMoTӥpźk@d_4dϸZ/=&'+N''+"]2|4`:; dۦqA@b[~@`{=vw(t kC=AX$(G>W,P'Ce71L4C<=bϬD5'g/@lhh|?\..fq!ɶ!p_"α^<±(="ʪU8tѐ_sݣR,+N٦䰆{hWJ=p 1kj:2Ş?vU&h$ vTl!?/@|mNX[.7E\Ƃ~ƃL z e UkUD1)sN)xtDNF8ECU P-v>@r_့fi~7˲#PlX/9qq9i.+$>c|E{H8SADJuM@M+Am,{ɣ{tFs)se-ᒹ* WK/jTҝ5J# b󐒑P~(n֒YyY>s\rq9ph h~u8>87"*޼՞i&ڶ"kO 3r!^O@jj&4Ņ3 ^\Hf3YYS?CZ%+BDZWj#E'|[)W*tŎPR,x阝[l 5&tCW~ co(ܰmok!vB2ٍU^s >[@FG ?9ϡyETK߀?( v9CE+Af/(Ww\>3S, 'd`DWX[O$1b&U>#IK}M$Ox՚2a^W7\pyx}FbۃpȏB/F5s3s8vp7?uRw6pɣ^AsE\7oA BU2`dneWWA<ރ PUg4ϯ$ ŃU?l;ܴ8X \'CjDWubhhߋ1Ceؤӻ >OuWm bf?t#c#ULKyB-i^(mmFYY-?)s# <|D?.l$ >?LpJJ5= !Oˣݶ1h4pҿCPf-Aq}kA ^_},/=7krVd6iMC *6xvrBxu"9ήOAt5 DI(RcP.3Y\\DEs}2Q>3n 2I"yc~w);5 Ӭp8,g0 8s,ԟ*ideͤIwJ^q:>: [x5g( 6 O?7GI>Qx"‚xK.`tlG/,/"nwuց0L,X3GT*vq#0岆mPCۘoc{GanAL3W*:6>!vuSf%j6' Z\sT+[b3qE7۷?"% 7ؠ|7Gz8I}h;4)\ n{Bq J> #K067 FuB ܇kjd{ՌSqF+++quu_2O>JIdQc,uX/ڠާ0VJA:‹ohCq<иp[Y8XizBjb2#;cCYn/ @'OP%S8ut,췚Kay_& HmfST9(+aLFC4CCh![k"2lggN`hhSp4hOUnD%╷+J}]Obf+t2z[j $Cz+!}C]P7vv7jV{oDJ93p퇃[;7:lk^ qPSb/a4ZeZ58 8=K߭On9KYB|8]-]AI{CreZbQ.Yg'AK\)` si(dKx{e=AAT5 H+/p4'mz O q9L:-Šk\WD+  -UU>_'ơYkkBV_ wox^U}!a-.u3j In<ӛ(TYP,/07;Z]C8*ώQ_1{F˷2&6躆+tZxaOY"\pj, j`Hju NJPUͨXvYN3{:zd^$`>B}m2<4(4J%R`@FBP8ɉI?$lߊ3@p \zb D#4[LgAgM,mөhli,ܶ<9G1tEʈk ][i.}5v{B` oU}]UjFxAC߷:]bݴsFwCw}nt-7Fioګgt4ϻ @@3q(O[=Fkw̧^ +릉+Fll(@2AJ x 2'h 蕊%l$D*k8r7D4C/p vknvZi* ֮sBĪC%Z^&qzmX,jR'?%rQU"@В=>Di Fwk/׵Tȳْnߊݷߤ/V j@~a Z;jk/Vdcg㛵Ϫ8~bV.=Fr6$ FkNAZ9)~.B]0ND^,Ŷ w2nVZN4.fӞl§&<{ĬV{ :W7 (.Wkرc bQZkc#āG1:+f.JAB!'+^$AEC6 ]G4WJ!JUYVڣ#0N *H6Aq!!a]b2'3Kvq )f ITYQzѤ5 WEX슾k,vL$N<[}"[iqDԎ)P&$}}"P0Ib.$u8 YjHgvGm0/"MW5b pKv00{(]Zt=-m4Z1WRIأjd 8zqSMxhϜJ;aѝSKbH p?nLJ,pq?h8Ii5 ] Nj&8. {%=|OJ'$ a]z.*ZS |g{7_Fc~; NJ-p|1~"Uay-"HCWK(س{cКMK*h8kNBW6u>N*@(Vbm|sKnbSA]bdޥT# ݳ;=j⠈ơ*j Aqy`wpj!NmjxZ bHl jn:'̤nA՚ؽw?F~dzVLˍq{@(! E%rϹx b J%LWܼFHF3ŕhp{PK۰h0gC0.x|n$y⠄ D\3-V0N6ǟ/Jn0TU9== %0AC yĤIǜv+d  v̝$OV,}i7Sm{mܚR=gҶ[Hͬ,m 0kO Ƙ2ֹ6j/67=?ض}%G%d2qf$YxHڶSvBfIh!Ix ?oB[r~隈|ϓ]oh[+bF.k{JH+Iu=5ݬo/Fb'}!C\L^adld##(7TU˘æ T?$hkpy<(dH9<Џjuۻyyq*f-^ao5Uw!~zͅF5~-=~=RM4'"Am\/qg1vk)Ģa{H@װQA\8sF'&ᢾb0WFa4XYZFEb6IG졳sR\P)de_;L GīV.agt꿸C\ axvY^ՕU0BX>e2H/5"^uL=%g$>CwRmZ9=r"Ev^ztU\S;q'uć<];i??ʅ >TQ$ڵs {?_(ggg%VT3M{XZY&Λ~Hϝҩ& yh~7W.!Gx~#+P0kΟFbX"4`X^G&'w#N5|NJF_'A`/.cS0;o \PU 6"Cbݲً Dx Eݷ?C2WK_ S >C}5G֍hDٮ75P( M3h^֔H+|֌:eK#MɤQh߶kFWK嫝ߪqFRŭ\oժrhm5˗/>L]47[߾'MvuѺW};׫K7?oaln&Zƭ^u׾[y 7?q3ӧ\?upԆT"=ϋ. HesDAxM4gŚJ jpHFT;^QΥ1"r9ykixrpmy ˫I|ۿQ ^rl&S(a7'rKP&>욞D2 9g=ӟ~F4hlP7P,%RF%wLbeq@wW.pQ](îKFH3 &LgcmP"yn%ΠKspB>*ȕ2¥dBp긑yb=ө6Q5Cgh13 &ߑJ[\^?f@szzi^gE6غ@("K-ռ(4.+)&Lw\)peu[^O M}qRq:Ɖ7R6Oڅ}Wf{1+%4mNAOω2͡< { ?Elp +DIlx_ |zvF~+K<6q=5g*r<.'F'qh-JDݲHa!p5̜;C2<">%o\5 _?9ETer˿$v<~\hQێ9ë&2tمD"<ud VZ8zZ LxW_Ab2ʪME1gpeb/ :A_%ǟsXrb߿i/$I8<4J?rb.V SqkMWnݨn\>r;wE<"mcwX qk#*S֑B>4@~_}zzWHIi3LZj]QMv@In|od0)v i_ = :G הoJ#-c^(KfimV8 >>L9r MXԝK"9!%>G2мorpZ.kNy X(ݱ+t_l+FrTj43 =^K4 py,^DR|,pT`3c(eĢX'Z F'C~#I( +bP8u=Hhe`=Hg%zvJӨTL4M($DBCAɳDLXpdGB>*<:`BAn9shNxzUcE8~McM*fΜcoP㑷Atk\B14}DIx`$Cc12HO1 OMM`:!HT.TdC4P1s'҆AFq}E yb/;7.AgډÞ Ѯwp}cqhRۑ]!LGt?$Gsȋ6ĉørP| t7h1:4LmlqeO*Us1:Dž EzFVr V$,)R'vL!/~l.HIִˆAz}?J(܃D+T)7fs!` T"~bc$Vzz6$z`mi@=q]\7#%ذ엑=D2AY# ~v :݋x4 !y'G12Czc|l'j)v1GKݞ=q^F4,G{^iG NMDo_|>:*9<&伬!an9ܤC8~D.eA {q`[kT%cm=aq}vܼt&c?6r.I8 z]7\t ŭvm%odsU334}n7(FWSܞjqSs:Z) cyeh lV1T HW\L&Mغ>t6o\7߻JH3r.U{եUEq}v֨749F3_.\k[^Z06ӽ[++k[|N-k>&nkPkkkF2W1}~jݼwXo'0DiJF>ynԫy8t]"3qy'JpzC;==042~^Fbu\h'Fd :i(4IKUi$s0zت_89 WD?)FF^콷Y_ H4"]Hey+_#wui| kzH3t]{H; Q̚!aW8+(m荅HcVOOAmjس>HlcoN䱣8{3Ғ.q1R}={p~ >]ljD7x)t1FiNe=9@Qxk6aˬ B'u`||Z0H|ڥ{@Ƿ7X MSl5Dx.O?LII'*I!#atĈn,=R!gR}(r2O5$e0HQnDeAL8QE(B=aFɦa`p++8E`0$vFb tA6TY4 %ڵ t\֥0%c78 Y)&vI1s#ˌ|>GԷ aQnj?i,zYZ #˶d=w=獋uA cc}JtBUcqaHhHe3flWe#GTQRsT2j[ __{0_^J&麶zդj3웛{kJۗbx71A}^2\|I#heUٽ:4PJTj:M{}o 9y|7?!:0x,ŕeIGN?BJ#SAGF2:t/}WhT?zc|;zcqit/py,' ހКW.Km&q(L9<\=܃=Sxg1( wgĈўLNb}y ͆X/ u*=/L4O^py\>/67Q]6+PuDWOOhYC4+D=! :pl<6E|E52WKȗ'\ZƢ`mbw#*hCBn(: ;H$LP 7(>Aؚ*уoȠLZ;x 0'#ǎIѠ_8yl$i'ī76Vɣwlp/}WȾ(b)* `jr׋$l҅xOvP"EBmb0۷ϴ} }=0Vaz.7v BEy.#D$KIÇt`@ŨaFPk. s`C4-"uSB:yo>g+t7+!$;v@>ňK,&'Q"\#42BmJ MQo&KEڦm h-ߧ֛ #ޖtSFCk06njJ-۸IgoV.W =m/ʕ%xHѝ'6*:p4Hċ,(RI+9ϳuI*% E4BYTF4 Ӗf 4b:罹1{P,"j?y|%yi6K_[j@f5 VYլⰂk׮v Xjq6 .3Ә\hs;il[`[53|JTGz,$` ˚˵W P>m]$NT*% 9R9&N|40獪FMRsNq SpDVKw!$H'rf!ey>*ZsOoZ,,H2 -g2ՇϊrYl8ڵkX^^bf-L HZl=}vX",Nsx8$ȦְYMoJZ3WeG0 ؃8u 1,/-yHá;.zB>ht!2АU62J,Gmӑ=KlE8$u! *DZd( t\Omfv"BCOnd cc^H 98Yo*aW%TKT޶/btb\78ɷd=,<3;vܿ~alw;úEt$? Nfpp6a΃ Y ec y1eYnn ^=0gլКfff.tgO:@~w~[j?B*J]LD5:rڣ`- x ǏG4[nXjaZjwll؂&IENDB`DisplayCAL-3.1.0.0/screenshots/DisplayCAL-screenshot-GNOME-calibration-settings.png0000644000076500000000000040066212647526537027657 0ustar devwheel00000000000000PNG  IHDR |tEXtSoftwareAdobe ImageReadyqe<TIDATx|չlVٖ{6؄ IHz)CAM)!tlp7l\*V3]ic?_>OWuB!B!]@!B!B @B!B!Bb(B!B!rCB!B! B!B!P$B!B!, !B!B!g1 !B!B9H!B!BY @B!B!Bb(B!B!rCB!B!'@Qv!B!B::;,B!B!4+$B!BN/4#= 4=C!B!q̹)P$=tu!B!rrD=y9@ 3 !B!C2?snN!P$>&+=V~5 zƵlyQ$I|vOr.6[ !B!]]ld 婀"9 @,m~Wm>!B!Brӝg9N̽$8mrYJٞU!B!B%eleQ(t'uT'fC!B!BI'_̤{1" P$Ķ;OWDcB!B!\%m_ ~8I|?{Rе !B!bҝ]SmbٞѺɟP$,_@v|- !B!bҝ埆t0e,&Q(t%sbϝKP~?!B!S+ТJSG{^~~ hYa]>'^=枛ͥ.ԧw.~x S!B!SxLC$MGaٶz-lAms Y[oašsE'B!BICu(p9#׿#] -J0si%#/k0['\W]6E/x0qM4X7k  ^.7|PyB!B!r~MvO?็8[0L!xVbgb7n@}e'/1]Þ"jӖ[qM7u'Ϸ/{vmG$N߯d_b˦uiH!B!NN͒I๋߭`W`0œ"s7幘FmNӕxNjKz-(ȫx܈D"y5FMxЯo-[W_˙Ϝ9suNXr9J_0h`?(<|N[Zڰs^)¸[;RuHC3hȯ۶±Ʀ6l Ӂ oM;?c̘1i)))w܉|dY:p{>яkJ !B!$yfg] [J #^Yx:63J\ŏ;cJ1ZK0%Un,;ֆ'W>pXC>8\_m^W_}U{y㱜yOsruVUUnLEP#ɓaKq`=nV)&xG+0t''-/Bf?&#8x>.xcUzeU 6~;/+X7GfܷF7` 8@rQBHݻLlټ>kP$B!ұMb`a>Yd"Waa!X EьyܜysѣG?cI;v.yI1󫮺&Mx^ymСi@!(*+=?F<~ӟ>qU+IWGVZ`(oI?}ku2=2ƬYs϶47ᦛo߀_U9B!BH\:hxA?\~W8]A S'#! Eqۘ~}ZxПlʵy2Ro+W\Kowy ~gu̙$6ȑ#䍗SY^x'w] &N9AUu5>kpMX3ǽ_%ߣ '7׭5}|R+Ȧpl޼> IP<[W_)1cƣ~C!B!$4SG;: ;ǡH"M* (hPki7o?SO|ixNUS::BRRsٜlkmM>K$e90g:LT ɼOݻvJPъtc5z:Q,^1L: /L1ao`͚U3g.f^2KxMuW&motGƟ'.~d;*k.v?B!Br3)nHȹn@W݁&h3Nr pn|oC x.Cu&y0y( #/Gy 9'g?ii( ◾*<Щi j]=N,oSpuP.5MokƠhZ8d\K뿽+:(*rAy557_-Gn`M-(.*2.(g>--9:VRݙ|Xҍ5gv6cǝ׉+ /<5kVK>_4O^ߺu39*Dmm_/,efyps(*KϴaU(,o5J-(|n:\N6K{G4{کMoyt,OIPXNva}'N`B!BG^t,3¯Ö %: B[L0hS8ǧ#3K.;8֬Y恓uhnjcIq?1!B! B4ҙnHLiRԖ5Jܖ-;f]ENv<L-`#r昂q7Vx3R-˕+fWWW"%pg\.DQD"*Mtuq*~eM/\#B!Bș;/ = 8x^=-'# B^ƀ'*pG4UP=yI.'CM׿͛@!B!g<| ؓH/ޭ 0!B!BNח -t$o$B!B陧I>,B!B!g<|HzaDžB!B9s@҃  B!B9@7K>]FZi#$V6+jilƶH>r:pJ*jZr7vh+F֡v_o7A忺lgDXw :s8yPJK9jqm}0-h#~5x*Ōq[Ҭ*L%B!rtdv ?F i=la aȐN_5*p}qܵaTߌT#HpɂP`rQt{tpCW܈%*ضȾ#tDMRD4/?B!B!@?4H#m)@DWWtơH9PSeyp@Cs*c2g% 5BQLq8WTiRsd ~Y?UnR!B!rP$Q\`f#[ǪI`EZ;L qҺ)%5TlkܐnjYGyҒ0!pm=:{"'"xO7*Fڅ4Bєb/!it%B!BȉCv*之H kB)P=i8.ZOun.]Z)EI s5!5֟Uj*Baʼn _e\%,@vXN+A$,,Zu iG!B!@?gȺs% 0NWIqve-p_?GV59}qڱtĿ))8\wZ w ;Vy PYQ UqIOMKAN:&(1 ֟ A!B! @H8ll[Xb[ZZfh-]{l0b]j흀BKs lE-D\W,DrgE4[߄_6?R(B!B!$Bϙ`h1ZQi{[HaAþxqߎ+z某{{H[6?'.,Vel)7`]ݗVB!B95P$^ ŬGo#U~TGŀ")MåjtEW6!CQ/ÁDFM* dĿthsv b  _[T!B!rH3Qw 2҄PdH`뺪"aUSJGDѧ"hs"a~iXoH*>XnDЏE}S3b́!B!@{ifgE06"HM =iiQ qe` zln ρbl DfMQLahEKC+?n)G!B!S@?)23Uqiۺ[ѮĠtF $YA?c׎J"ЇCWRU%Rz(V"=҄XK[ /f qſN? p!+~Rm8B!B! $P│r8EDTw`p! &?s+~w5nW Bqqx0O zy +%\}ng/ᷓgerEhG,2딿h@.U N.O2AߌۦǕ3'ᅥQXRuJ8اoǟ4qF(vA5XePpuSs7A `x]q^xegGQF$؎H_UϕlA̡@)1|<혎>4u1kj14೹~'vP#`ZMVf0*"[7O5>yӯƟ⪾Ң-@cGϿ̾ϾV{L]X?Ŧki*B퍘lj/|()**}Kv[^i*%jv!exmG^SXHGBpFY۟]U>9_sֽ: E~,x?C)/ !B!S@?'MI(_:Z%?k̤zUVm<*Ovfol%.4.bq,9t 6/f ~,ki]YVCZ}cq8]Bd6fL˦Nè}ހ^+nK/o7]Qcz޽/ae[> oOFihc?r뢒]?:q$V{跂k3Ftfxaptr4 Qg↭F WC3z(p.zP3:e B!B!BIeZ笭8v/No~88t9PR'j;VEqw!.P#)ZOmnG#Y\~>n #n h \R44⺥)um6ݎCSW/RRNx+ޯ^.؆B> 9@ӷK2xi>+*rQqmpUQqɶ,_ӧNB>ջBpy}=>5G1DZ+a[CqP/DPn@8쒢 G4 ݡS$B!rJH@V:̈ "d>5@兪h(X ȁST*芌ªؓqp/=`߲"o'}g*<4E“Xv R̺xav ”phw<%P;"2i(T)c LK87-32?ࢣ] DwAA>b$o+7jQ^(Wo2Q(Wϗm=#`JC 5S7ݒ#ꯞBYO8XĨx޿`Z4 -.HHS\"@F/l3&2'wMO X飈U<F_ -Eh?Bwmxu&௯)p3l@Q'fw$G'Z~'Vۈ,cIo!jjɴ%#AՋ^zU| mM%XYM56NB!Bȩ ɟ },OIVBk_l\Xfkq^㸠!qja3!)6nr#!d<2y@9\ߎ^s @zr?g!l.yXw]X] ! Wg?t%7 +zxf@Olq4 ւ_QRbœdWFDBqy_ŘԴW>v| cіirpBo ,ҷo?sK7KoJ\0[;ebaW'G_^gtU&ٺc/5DPR]sCw開K]Q\>݌,X ۸q`6?EeiЭ ՋϓA@F\ӯ^-TN# !B!S@?=R(]KX)X&@w_!ZJU،+иGVGGF#Wf_kPN!F?(vs.E:BľVe?t́kh &hE;+,:q۬ROaK\ϻ`<,]sƍf$O,zN p,\8i4>yX͇sfס7]*=ԫגmqF>cg?}F{\7ΟShFԐWO$\Y- #ټ.ϴb p^cY6%@iYi c2s4x Ս5a;^#~9.z[h)MjʄB!Bȩ %[tl⟢ؒOGJswPZj;,ftRWT]r ?TjBl vD RCjxew+b0nیug#Lk LhhjIe].sCoY#bVzY?/3z$~/,݁~#o\|`xb)u?,F[ž)N8/7 ˵źX;nj;*(k}=tڛqYs65E[ᣲ"aoG(?~b07L|V-+G[=4- +4 H!B!Bj}?\؇*6kL VVT9RU (A6$\8p`591ctf6 =V-?I=7S`΁FwmA;|`/ٳ 3R\V@ 8KHSTEAi ^ys>ve.3Sh{cN)0w⟈Edpkg͕KhqS=:BMrMEױ/kO J/7e` w~9ޟЎ.)Κ1znaצ;**=-OOzB!B! %CL/CKJH/P\kB¡H53eL;:Mѥ'ĽE*ЌGQq3hhM%~b+-P5ƹ# ͸0]~VTJOTȾ!xEUV<>ԑ\b_خ{  us.ݷ]a$`}xdǛ^u0-K|r\"vtM3GY;n/m؋.FVcf/S1f@7ίш~!5 S _ OQYz.33Obk'.lީEX"tcp* MZ"Pr=u a!1Lw^ڪaA)i13 ORI+6~x2`άYZnznTLYw 9uFkEfPF.ٵxeN.b?ڝf_#mQj !gпWZ{B,\0v LZ']} gId{=_?q-V!aY#:#QxrNT?Ik? Vja&cX"Y>zb FsS=Wfb3OD[c!B!S @?,fYi֚y%%} STԤDÄ%1*Y:#thnfg >4T*RbkujP=`O ZB[`}›2"30I4*' Z0ځ{?usއ$~gp7Yqu0?Z&-J cЬ.U5u)ɵӰm!EG?i)@)Dn}FE@ ]|@{!a3Zꥥ\V݌}1Io p[wW^OQu2m' @Mh/kV`KL 5Z秏zQ,^`-[6#tXbW^8oNZY- +ߕ~on7ΗZSe{Z}}V'#)p)GW% J{iz J:>I \8;˧OC6!´ۿoor}۷1F B!B!9I\020 aY0*luZ5VBqLwdgrPlՅ~2杷]z>Ǝ{@[nJ^=?|%-B^τ|'_G쫺[WNk MXN=7eYOF,zMK.k6 g gAibHoi Y /`\6mlZ;e[~;۰`rpɄ5MwPX;Yl]X]6_ۏ֓y"GB!B\QHYSH-%7{.[rôɓI׏,MC"/iMQѪB2]_,K ĶHCǪI+k Ր!@$,6:"VXE̘n&Ͳ)9/a#2XK/jR J PXB#툆#֚ 1,D ~XO+Y,ȴxv杰fs5pbA?Ѱ,CX5EXoxI״@QDCrޱX8('58f񼨏B,(;n<#"MY݆ )z~;IYOїpZ4 Ey;Qw\PM7kݮ`9NH'.wIO6B!BN&/wLkšH5jm4w6jCg?$=@ =A04Rf|wύ%%nϔ uıXʑFQ:p EDZX 0W }WOZ/~( slr;!>!B! P$= !~%ȴPJ|FHk=)o,: /h3غ~p8ؼO~R[qV,nr4?đ]> H~O (§uEC(wGphiU(ÿ8B!B! ijKgòK 2Ru])  L?XCHS)56Owv%u/=h;ny \t ֦]E.uXb#"^AB!B9Uj'ȋ>)k-M_/sߞz<! 1/jUĉ뜸^bVaBg5*9X/6CqS d.te`LK@ 1d_J\P& VD C3^.b CB!B!=gn[hHz@6dŶUm9VIKىuYY`v{. B10j ~1Y6\=zݯ""qi+'<>ۖ /B!B!A! E.!%%䴄1;qY~`z v {صLk?"f%+o_SD b]!B!CXƐI[ +qk/?#"Ggf"MOM$+o.?U0Cw  !B!B{(.~%z8b˜.!6ZD6 CPzmt/a{V_MgR])}h !B!B (a_/!5ĐR{@JK(t )m7!La+%,҅? *, {" !B!B[( S2 Jϳtbi6[6 1Pl[=n&i(tSk~s`+L+@9y?Yі>z0ј߉nu>Q 0Qud5(%`1Ҿg3p-߀oݙ=&B!IOf2H&\_2Z q|Y{`'RӬz/YR#!']y.x w> #Oō1aPt̰I̬Sf/\2Wl݇?uV\;u4`M}4%g~?-?y(l'd3Fa:?ЁX < O3f=q)s8~Q?T2NO<=%cԁ|%mXo';㺛qg>?{ڍ2V\5ZF7` j@=f5 7>3Sk+W5F)! !B(`xH'8QS UKTLMoyxߖ'60r4|A3: DzoGLaqJ (?qWǞ^vLːNlfWעߺeoѸu~\ z슙W]\܀~wގ:w*C ^oj]N6[SVbXpS=yn%~ݔ]L"|^Z*GWV7^}-^l=nA͛\t{~<*흠v2W~E>㱕X'2GOKqb޵i˥؁F|g!H0﬚2 O\\RnVVwu=ξNs1E}z}|.kݸ>3݃da'>fL&&?]u!>>sKF Ǔ;z W=tv Jm WyxuhNUیkLg.EwXgc닾Gw9f$Uv뎦h¸kǗ/?: z>>(9.&jTWE`Ƽ ONbeGnԫL}<|cr]k: wKzgԿ#ލ߼ҀFOջgQNxL-f/."|SӰߨ뛑\uqK}uoW)nL\ߍ}mQ؈SEFyQe(\G+ǔ[Fp{[e}+ƍ%؇=qcqY>+AU߷ 1ʎn1+:ًX/2+GbfܨiɋXhv:z9VGmmFc}QNB!P$:gODHTak+&ncbZR43ΫQ$.1t,E|ɉ"-2ւ2؀pꑴTo!JF9)<)O!,rL c{%n7q?:h?'8)Epmenl.üxX4w9.cǓЮڠjqbԽ $2BY<>F:~c/Zm?tK9uk bA[NgzZ5^x?xUoՎVx_Tч<{;XOkѾ}]b{gFIY|?V[+̾[\zU}:y/yx˴tڶ|kĊ9>a?4E\K?^3y|}ݗٺ;13lsCF|[@~lKp`GcA_{=<Գ|y~$b\>z:4mb2; ]67 %IW&%2VJ60)ԓN PB,OӳQl6;3چ_߆WY&f,ƭk۱IB4_?*DAen],zOq>X5}1ՊGvt}7:X=.CϬS>dX;FUƱ9'\F~^lo6}6ckDZ7k"-M8Ѩ*vWrUT;2DYLd)+Vouͧn*j0ǒ?)uHY a+Ι:f˧̖CxP Ϧ6_6 'W#0rћFεFs|Sk@E]3=u&+Y5FԀ?oVl:q_t==+භa¤an듰e+rB! ! a;CJQex|` c*LRճO6Ix䎱V79cYmXb K`˘Zۅ7iu-Mmu$hWMB܂=?&i$o^-5TK>2/"HQŇNu=k^mNދl3xo }_`kqݝS<ݷD5~iI|&OvX߆g ۷?mc'Ƒ>mj} zޓ֫g|UƨG~Ox^2-l-*|7QwS5[qlIYF%3t<@#fmҪ˒%c%z $H!$$ IHbPj6^qluޔծ%q>iv7]VwM-ndz]h,簯kX5+6bg鳏ek^?JB4p!B(A|W6US'SԿ~Kk%q$3)fH1CO>:;`g:ouBn-6(~o܈7}w}>; _t>*jDH[l  7إ4O {(ټxOǷ([Uƪo%qĄt8vGs %zt`θK+P&~=(|iэXʿC0s920kl*e(MqI[3kr&\0VaI$~cWa2c)(]Q:#I@Ʌ"Rk&y}lS a{x\xt&Ս~Ո[yJ]~<'^HP$w\tx*X4|)!ٴ5 k_z1G[_"'g.'T >p]XGNQ%y9*Yn1ֶk=&Bp;`I>Ovn*Gٓ06eo!B@B"h$E#iS_/<0dx="Uz_v,q6(tNS5%Dހ8I;ЃEO/{rҙ7Lv6dȡ.&?m:؉5Y3-xca%QLكb_*p.=sj܏Z%RcS7aYǢބV7On؋7ogJk֮fȨ*’OK?T郆 N421#pin}͐5O{4b]󏙁Kk)yX'5%xSpw`.}߀+=9Oǽ-3\Lp+iF- `XuY# O oş}@ W [Z Rgfp:kƯaoC\=y"*|?B! lBC&5(؜Rb Vn@ڶQАldKu0E߂Bc(ob52` E[ĞΜg۵-#O~gA0Gu<̔) ,z}3Nb"n;~7.~i-|9 ??c6>N57b}H?]'뱨2V)>|iltY"KK/,G+F>}`t]ȇ۪P3mzlغ X8umEu,6cśx86Dۏ۽G3Nin|r׏m} IW;۸(ģRW]esh{[I6)yYy w4ߟWb*4$ؗs#a(O;OOWkƜ;mT۩ލfVQf9:rz&S$SWIi8!H)K[Pn;vw$.%m,"Gy'[!TmЦa #[X ^kvkƅLSӍTY%mk b-{6$Kuz"VXك쉸⒩sjr0w?YWC`B! V0yU- }₞S+O*:_G8} Y^i<1PWZ{r쀠WkW"М+PZ4glױ+4BzJb:s6 S:\# ~}: ^/n]lt7]y%A]r8^{V<awu&!B)+8K85;~kc5TGm7/xHxz+ "w^91lH\udfl|:B!M9ѝ|R&ٵ0Bd HC 6[wxc%MEz` >_9ߎyhed6}$I$B!f70 =Ia hVB"kEmFzQ.,SlzYE@{yS,~$ EfA?B!B!L( hM$ȿ_ RqVchbN3e4gQ_")qݖX@?ċ ZZAB!B!C @4BRZb@ ꐆ~Lq*M@+g.|/}X,O$!B!BH I`Sfzͨ $x_q dg]O:gQH 2'À !B!ҳH&jLM ƒ]pksb?3$8u߰G kWK#J!B!ҳHFtK 1@]lD)r0&Dض@Qrh,D~:O܋ !B!sHF0 b?!yP7©pgg'.W%HsuF "::B!B!B$M~E ٘g){"/}M#HsbePB!B=P$ID_"$Xa6c.}~8io347BVJ򱟁ˠO<B!B!H&wl)ύإ^dp"%jn_l\[ 6dj)FD3KlB!B!= $i L/XP [PdmBuM1f|/1D!b gZ|B!B! $i@3968`|kЀ]Va*{ x!XBDῄB!B!= $iBqZe7S Z6e'QmάyAny-Z3[OwveZ$!B!BHς I!}EK\"9]B3Թ$cX‹WZMm'hk/#dZ*V/!B!sHK]B͠a'9Zq7W_쫂" #7Q b}F& B!BP$IJ8 ,1ZqUL03jL/xv렋-~~D?kx["B!BP$Ic n-ycVxOJ# ӼU5{! ݒIb#ňz6!B!BHO I0e#B.)b.k!AT*Mm)Z@mb%B+Q/VM!lB!B!gC$BI{-˙ZHr6A~`a 8t?`_^~A׋Ģ_вo:Mp֌3.2$B!ږ>ۺשּׂB $BA@B &9^S` <[5{(oގ nḋ; )? 0fA|j=U䳊~?=o6'#'If'rsuǟlOOR7ꗻ_7h] v!Wf>TV@tNyD$~xxꀒO`SxC?Yҋ同`7`[܄0 8}}|B!K/ggDf:/n*u]ك="ݳ@BZzBdEyn6'?HMM5΍P(CǣKн[JJ}˥Hx+1<[.̜5mW[Y@i$>v)Rע~Q"Izޠl%W{ܠu$Q ݋,QF\"j*, v~xƐ@vl{Μ&[i1xWy9hz6![J[Ma1#{hkGտ[]r|욧_Uċfat9â[0JH漢GVvM׋zmb_t:5q033JEWxuG9U8z$v|!K.h"\{l\3'/7`oWˋdD&At*DYV/^)P_{_߃}2c(/x9ZC#?-q5>\e܊?j ~?X~9=45>lAvwL-HO\3[qLkW^qSS0μW> iQRX Y>*GȑG}ϐpT 8/ԋ dK!2۠mkΝxѿ<Ӹk1z#9W,d'iSECe}u!RHHt$;[W#?sZZL vDZ1F37Ң*GW^!3F_A!E#?~h;Ʀj/. HI qؤ#*iҺ{>QԎ{eor f?+Ž&$y"wXW]рHrVaJ͵va ܁ԔnÊ_n'w阼+>lP9w`1ʄk$ZwC5s76cƍ{q%y<(۽Ū jzgy#>R) ~fz/K9lEY߄ӿsEphBz)G ɒLPmkmPiiigqn;j߻~rxa^7FM}ǭ/.hrٸ$ 3~Os/CLϏ6?X;^/ԁO޺]x=ĉ Pn.<2, {b|qyM ƯOMnx -ϖ.;ߟLo(ۍ `Nc4:/-e?Kڳ&0w3Z7b-mHPl1o3cȲۙ> ǟv*>xcʸ_<-+^zϽF oI^ku݅ᄃr%_=Uo?{~q-ǔӯí%`ֵBHok#$0G?>Py!ű'!D [͗ Eb Klbtvq<]!@Z=wϧE(8[K '>|Dg-  V>j>Zezl8erHH:RԬQxaWf^ -ブb~!$Nʂc0B -ޅX;Brof7boTs\9sGXf<_Q;|[Oy0f@/w_plzGXqbӜX֧HGbF .ed*ׯo-; 9-^,[ųk;a^VT33uqbV^Q<'0ae~qpϮ)cGp]~ٷUw0qֹ¿)AU}vo?c_֯7v־BHAG';"Èڵk[w'kCLFU33E@M*6!m)B4w:jzE4?+ݔ9pH~S5~%ૅg2' >V B$Jb(BxYX:_<' Vm] KO3|f6|^-7{lmwN,7…e;x갽>"$n*/M_Ĝԡ|^QNFٻۧEkՇeۛ=-Y϶b]_=EUml)]3p<Ƒ?nvuߏن>ǥsr5ga_ć;qd};(,,@sigױ#On*;*)3>ٲD+,e:(ȘO=U݅2V1.쯻`*fLq/_5ŜS41ƎuW"0YH~}!?RfښvD*)~/u1?ds]f5zãnåc\gX/fލVN]^Ѯ$7wڐ9(SjP ANYd{?g*0'[ WpO@?!3M6xBi#N$Ʉ9㖀-,])??nv}Yvw#S.!H {+,&nx -I7!X"B[E@qn܈"?!!Ĺ1wQV3 u=aK1E;=?F._/]"3LŘZۉ11T D[PWkߝ=!2- hlhA@Wn;%I48M?A.o︵|(yOJ̾׸$>8S5BHAE>!mdGx#y睃o;?&dee`(CXr^"@ݬšDx Nm!]v2i31if_bh΋NvKXqΝ; .C.b^L@JC)H4H z"_V~ڴر`|*+0~PEmk/g7M%'I.ƪ$Ռ_|p2CpI4|eEtNfe҇ؽ;vp$|L<%3Se_x/Cdɍ ` xBa#qgY;Nu\<)r%4V7$)2#떿9jN[N_ͨZy-&>hٴ?[#ny$Ԣκ!LDxcH81݄aOf褢tJ[o.nHkSS=vW:嚭]zz` ;?+}3pIǣ/,co~ezkϟpeB  $yVecέ7~6u8\<g"<)N>6 =shcyu1,~TDS1GW4|;*JnKmFnr-#cP>e,s+5ϙD&șGAP߀2,LLjOsNÑVq~gd)E iw?,*,y#ԏsP B!n?;!]n{\`Vl¤9nB!=J|!FO=tI_wFa;4#Ѧ7-:!XӞ=N:*̺zTd"0k۴zZфNr^s<po;]gW`̙1|H6wՎp c@)Ix4)Mٓpӑ% lN}-<=WO |oahά8)=Ǯ蚽'lBV,FdCek_|S[ƕSqÏ|:fNy1_'Y 7BZٗF-Gf`~tE-zYC=ڙ1(86$?BA:ґ?b2Ffږc.> +Ͼw$\=3se:o?Lh5& )y0f,\ ||,ocGZA4s,޴q~Ճ0ڛOr˸=nz K /{¥t*,mgGJP~S:&BH7Dr>kƂ_@ff&qap_Bۑ%EQjk!;;?JHHh`Q) ~|Ϧnf+3;+k^Cm cB=a#^l<K[{ mWNǕ&7>?_Y wV#uWlrOt,Ŧ)"hNKJ)fǗF= yƛ9Jz!G{&`]5|x$ X0 AozeG 3oolVFg+Al;>8yH!^EEY)  kc$b<3>j9B~v$.y5~A8xviOPdm53PGN?F%ZA -#%,jEH)BgOZ\&>8YWảQӖ}?{`g_=qq֋Y4YJԜQxjC}zk˻uI/'Hŵ>ipPPvΛ=Yk0fXgTJſ_?R\rxe$\39=<%,pʬH!^N,"6"ZZ?JC'{!욠lG'Ȉ܅FxRBx}x'͡Z%l{v)ޥ!n_Kp`6~Oe |u\@$O(0\l.kfa@?h&*lu&Y%L>rx]c.QNx%q MżLB!q)@DfYH&.)zc-J|!CC!ֽ؝p3}&yp'= $yV?,y5tq#F6 P2;#jRF]v,s/F!wMP#CaInb+lB@m4B޿ٙ$qzدlb!!B= <$x! OHf^PWHTVU]OB nc}YZN9Q88"Ih3lC씖B!Bך죕gpbWk4H!@BHŞ FV?g`@6% BXm=Ӷ3ųX_}E5Xr0P$tx~mG R 颠G!B# 6T(XU*A!rpP$t+"qE-|{K!B!t6B!B!B. !B!BP$B!B!CB!B!> @B!B!B0 !B!BP$B!B!CB!B!> @B!B!B0 !B!BP$B!B!CB!B!> @B!B!B0 !B!BP$B!B!CB!B!>$Kx!B!BzIHă@!B!ˠHfc8!B!BHo IzB!B!>( !B!BH!B!B!}z !B!BH IH!B!H !B!BH IB!B!>B!B!҇ IzB!B!>(aB!B!tB!B!҇ IzB!B!>(B!L(B0Ԋ(eYx%C o !BH !Axq)))Zq\Z!=!ܚmss3^&vS$B! BA"&M€ Fo mcc#jkkQYYی M$B!@B9@Р<999Z }Bӊ B`EE (^ B!7@BI[__ Æ C~:=AR{!2B@hB!G۲<BHPP%Dwc ~f9$#k&36/AH ݏ8#Px~ZoB!SH!O$5jqOV w1! •A*BpV:PKB6*&'NCHRXXwFzz?`O`o߮eQgz}Kl 5]^M|3ף(✋:K\V1B!]@Bz1ƍCZZZ!^C驩hiic5ޒiܙM[nՆ6'^ Վ'qm ;Aks|a.H\K"バ8Ѵ !$x齈FKm;Bг!pxD&ٴ“0#ݍTferK?Y5hIR b_0Nz4IC$"BzG<ˀ/kbUۑ>3u?Z'@(0@"Ԋ&*8z&?~2:©?>3f& '$u'h_KyO?Mx ݯEAe<~k^].T EAo`|״…_t3ڬkE1_n ;*1HH<)QGgSÆ;hD6(|@!P$774mVnڋxCc(iC14!2vQ{ `_߇߫B dy+/֣h£. aP b~3!'*DcFK!65/@Cȕ9Ґ\_&94/@_Hl uWKs)n?f_>D." 0m^xG%Q'9\ byǦ$*Mo*HwGb+xojl iBU'!jV7DB˦{)(yYqm9,YA]_q_<~b>trܪanz*x1lh "++c×.Dc5//Oktvl)&|2/'DTKԋ.@Dm>EL&IJ8[AYx]nx٢]O3Bz;\3! xnlllUwyI{MO>Re>sj]0 'oQmt;m4F gyֿ"`K^oGD<= W_?Xi% $,DD?QtXNW]/A-X^E(babeHoBx 2׭.~|2\ [KF:&ZRg"U+YFֆ)Z֊+\2TAPR2OzŭM|)q!?ER@}u^GB!0<bZ&ҙӭ׽ٟ4=Dby!+I!ؙ}3P|]1{'_~~~Y}C8.9M+EH~5f:4>v(!n?)ܷh"%ӈ֋t8Tc&gKRTcd>1&B0O|׉DfG~ƨsB]'pƑ3WΓe[~JB (ҋS|a'buyNl7?).f)-_+Ƭ@]&:*o@C$Qh XN;W~.-ש w{^tP%KE@ $gj;g>So^OhQKZ!2ޕ =N6!PBz#f_{B33 F7!B+,,:1uuua= \!g3X|B 4ĉi%h(_IICtu'5Uʆ[7$6yK%:{Q"z1$>/,1x"ŻF4B+!-LXdEhJfCD[zzzcEC6o:^4 91y Otm ):`=D{A'w?U _:pFn Ac Uyov^W_3qBIzɴuuT^:%m4ey2Re%<=r_[o*ivD{>'BQ eŽ`z0_a'4k`yȑm:ZfȰi :%&Aw i>^kF!Vޏ#l#kKӂMk( )6o`ӖOƩ0w~#mipڂHsE!>Il#HDY^^^֡5\Eȱ(N wpj{r8.M S!z61WVpE. OP~ؽ{P vPQܶKArg*@~cY̮>w P oEة]|N" r^YCbr5}=3'<+ο=~BŲu BT3 7טdb􀡨7hʹGDdž_og\%Xhҋ!fzIfPgQIAeN嗀vh ezx%R\)P0$B)Aڍ}ށ;%  [(~xh9z_.*D PM/@=vBrEBRD_\١9fx>%€hSƴwU[ !Fd/o I-gGm.L 'uho`oƚCtP]]~">(}kf /d3XLYb"LX)VVV曃bW'qQ3,GP ĝ/>o~MlH0 !|HH`]h\38PV?P˰Ԩ[|u{֡ߠHyp@Dk:lf$@`p٥8:e{rd^>DG ZT ;H9hжnʆ=ّ01E9!jE}fB5hf6}ށ6m^X~Pԟ0bh>TUpcgZC !3yƷ&f $#PrT_3$Gjc(BDZƷnn)aOioi}Ow҃}/:ݎa{~D1Y[׽A/8dѐ5SuwSŸ lfuT7ⳈFȯD3?!9"`p0-Єb/8 ǔlSS=?4Jp WĪWע3ɅZ!bQMYF9(,vb C5 xz5o`ȯ߃P(}nfcVC\W Vo>]jx^1]aQQ=(ނb“P+̈́#'^bhfwN9Rx܎xs 4}>w=ī;:NdF7 n <0dž&) IF`fg"ӌeNd; ?OH o˳o6&VU肣ð FzO4='UsQ {Ҏ]O6ݾMՃd:ҀW!.y1\;ٷ떼 >MP ̸׸tK*۬{3?C]n_B8MMMԩn-Uvlك&[*`Թ1eV2>+Skً[uZ74YR JwYyT~2d+8fh&ΝZٴ Uc;[qq#Ė/fx6K+3wUUo= IH!62%ZZZQj+Z_[^ԅ Y ! x[%d$I~{$s;97ڸ/(&"O;jп HD,˗hv]> {_XO9W_7)0nFsQ ˿#:#"G/HԳ#덕͙|G&Ӏ_"S9x /AS!RRdegSܘ|BR`w׶`?\< TQ3s|LS_+ztZ1ŷOZ=H|e(˜y)H RK ,4_uT5:WZ#"o?Y~ف@_`k;``ՁZ N!3oh(6:BTġo_Ŀ{Y_þ1 _5/ GQ\!#ޔ_Gc(̜z1~\ 7kڮ̍҃ضbAH=3ozUnĒ5a89-_A:S9Av4mF.Ǭ6{.Kv`ӓ;Ph')mo6l4N? 77lYhDVR3”&"ْ݅*S0*sp;؋Ƅ;*܌do\o=1g\@.<8gpVd 0g%xq;nmt_m Ƌjz'k{A_P p?;E5,7y| i?;iMby f(O5_[b!bu3kf)Mk@kdc0y4\Qs=Z+)jWvי]fRUʑvJy"jj(Lu6\oy([ƩjyF/@zgrB c<}f9gEqßs]}'j?%7J)-'{'zwM2b7XՄ`h+2x 7Sދϗo Q[e$EP՟'$$?k#Ni#<8 qcG"JQvj ;g&cl2#"jB]]j!w>P.BB :LHjWnsխ&t~ԯcT|lwcY8#eS0r4_}OAAUzXL+IyW]"(VۮwT~쪞+O^=YD Q_Eӷӷm тsnATi/>YXR8V]kDkR,+iR|Fw~[0vc]`D*+ogL7EDŽw/^5W:qS$ OJ\tƏ +?EW`̜ᰮ]t S>>Ե 칊ÒmW "4`kUۏt_⟋#w31)]w/}|ψny"wi#/#SmiS>NJeѾ1kP}oNޟ-Σe;=䦘4 y^:uSrݼ%0y<$ʦ1[L%b;({V)G߷65JyEq]$4\`V5[)bR6=w͇c!5)/5S އ]~Omʍ1,ov:>3㝯d-ٯY{y L If ? %+Ƅ)g3[j3_֟yW[|| sh\\\^'UۈӮƥ'hYbC:kف҂Z 1f xwAFԥn>iF Gvi Y~ ގENwcڸTZ8hF#Ou%yq;QM3~CLY5ny3ƎXeZ1p{Ph)s)yW,>z[WN{.lX_@hSׇąo.Dʐ=Hy(X%WIbe/aC6^Axw9?Č˦#&*Fgi\Xw/+ (:XL Al{JY_:k_5͆ =㑤T&՛P>Jز q"K;GX{1"k@MhVLd&''A@e_4 A_-4"cP (k̀(Un8bٸ:YFgGB绑>2P@\T.3:ɉÚxlT3w7,8)cVGZۖ`ut>,|i7ƞi%_"x3'tK1T|N\ 4,{e1HD}|Uoiky }7ԵjP]7#}7U.j<'Uo /.h{xNv^{GR*mGЄ_kø}mş{nY+O#FIQJl,kt6<#y/|U% |L K@W@xwr!JRb3ta_?Zد ]?zDmL!7z{A?(3QZ}frLV'̯ԉ@,mcUQlC\$XWaW4<|t跽]nýqk׺Zg`H泻 Ӫ QwT`۪m(70׭Ɩ.2;?G,zzMRʸ}i#ՀCdABw!bhz6Ǯ]ݻ$؋2Ghv@ݕ7` H@FGu6')oPV}DRamj%EX7aڨdT8*߅*)Vc.5 +C#wp$X7_s]1n$G{ZaC joo`蚳TSϻ7T KگHyj3pbE|\$[E;EfbZĘlJe\Ф[>߬ߌr7N'}lDkx ZW12 ?{ڏs()ȕE8 #_ b{Jp GHqxKY[#w(ފ[}."usCyZPur S㛔^bR޻VW25jS],Gt<Ԥ(YN.win#&*)em8hBRkv=q8/0Ck}!4y(Bvljux)ט) ߄  젚:eIbp:CɈ5jˍ4Gmh{FYv'g^|M]ˣp D98tGZQ n3G!md2@ -yEP5Pu*}F g؊ `ii)jkk[ݗE088X :-%5Ϙ;af+uTƎn|+7jedbօ LXQK*@}syQ)KTLvw%j͙ɓ cvMiD!!:y'lE]b4m4v")?N6\7熏twvP|͞8Sֳܽfw?js޴|}?tVABuyR.r$obǯW`> wއ a1,x<݊?]4P+En6:<_Iډ6@4;M^{?fqmW!zr^Kvހߎ`UEpy(X,ޏ_=8?ivcՏ¹ a{YhE%m8#CH^G\+uz+7c#A7Z{]exwB<0ZXD ix{zS͞lUVrAR<6TwZ z%-Of.oS&/&Y+jFF"Fe9fѯQkQ&1SYU @[dzzfmcI) >,)^ /ƮUp[1,=;9^7ܮ\7˴& "?Kk{9 = 0kQ o-YEQ:%WkЃݳx~k]+Z̹/,:?A@fGu>)k$|bւ3:I1HrrE;k@9S^u%}FHLVιIw@nv5;N:`~ ϯU=X=DcՠݮDP4f"'ʆ̓gEߊ :[r IqyK)@qap>;pxbDr<"mXiFwzئ0uljepK](ޓ V/>z8 ʷ׋7Z:norJe}?o 1܌=9e;gm=JJ"bvPnvu``s`~~@-#C{!?c|T?o/c͙rhL;Olk|Z^>Ap$qrbXh)G\Ua^?ŗ%֞>#C+xP~ \|h.AC)kM }{V3r` zȊnW1]:;m[KWmd利Ӂoyf):ly!j ~6s&構fݲ=PP9>+ L߂'byؿTb $S}P܎'$D(?-܍M߯?$!4ĨF{ovR,w""r9y$3l ED BժAUѸr+ AĹ)xd?=oMUeuQwwRVOwT&w=J_µAГ^VTBb0l05<ʃh}c#od'T3)1oR-"hId0*kW:m׋uie0Dæs B}̀Y6Lr" aMڕ6Irk)b#D ۀ/lpr  ]U*%5`Z*kg׋^*: 7ܧYM{YBh)>ǮC?gaRDP}#GEE^dX,'&&F &ϊ @ ,,L]~MMMԴو2rǔZ!w Uî?c3%vXx@~#6؊I"'26 ed7ʸk–A@|C|U%mDѶ?^]]v"<,Rq0PqS`#a_^~<75{9K~W[/萴A6Uh5)Y Z`_PAm lw+MPӣM.oRPbkꡚ HE@G$y q5 =n.~9Iwզ̳d|SpƇLJ>}g.k~ʼ=jDԹH*Q߼km~#_^l?_!|}قÇWﻂȾM}U &"فb^=K\Ge0wsP/GnrNʛ&9~'<DH5o= h267n=|X&D?V׼uTTc@aIڹQ׸h>8ןWDIuuusR=6 ]AkjPh8jP&]+-gegiCɥ,ǩLY?@7PŒX_`xxOFԊ,0_){A.T)4tGɮY<{ cj5<\=_ Z# >AD"8.ʛ}?ƈyDF={ Zg_'P.Be}# rhoǂ a)FCb>D=ѨBhHW[h5 K͛yi"EEJO[ 5d\lV0ID$*MEϭײLo Yn-(jLZ?$:mp6`·%ʕ'sQplf ]ކ;[်ʍo߿E;(0EpOD@0ĿE\_&CY|jŠ<<>Aӣ]w+LfGw#")cǍW;,BT*xhTUyқ@NdqTNz@:$^ -)zeʳ/,"J ",4~ NӠٛ`ǦقPQkܭj?ŗ'{:@шC,A@CÛ(jǯ@#2ښ/~9]7hMߋ9,//W%bt`yi?wQ] 0&-ёwW+G7(_.9иHD DfȑԿ@!p WWqA0YZZ>x`0f 9~d%/Ӑ|Ay$ccs濲mlk@E% P468jO âE ԻJŐB ʲRVQzӬ达7@q|@A+4px yGV"1نԡV Rd5!#M[ y숈z@h6fṚ=fY,@<AȓzB4#MHɻR6G z${>' mP~;)>/@fl?ٛ \7EG7 ,%ʑ(OI{ }Š y&AwuشPm@,e!Ό&Ѵ7)QO0Ht<2jU3Uz(O%$$eF4euM˶W6:kJǛM6͂q~D>ozr#cC3]yMnZ5F}WyvOD0ב*&͕pWPoO> x]E leB*th4IJ9AQͮ,ÂPc(@ +q}G1pKe7qW("z|0"ε8\e`k>|?ko$U 01]NɿV0DPG|8c,2bfV|x<9w9#tNy3 -L#ll?fP=(--Ubc??ac"[ݩP? +"ahUDU3DVӠA&وQzMyfð$Fn!|fqqAӷʘiaAG8ֵ(//W3D`ubY ":1HJHyD*DDD7-gr}3wDv"'0ٛl?I}DףB@EFXoB ;9j3_18"@HDDDDDzHDo" OfwbK__>8%|F&T+=y?bDP(((H@rjI{DV4;04g""""""""@""""""""M)`+""""""""_HDDDDDDDD41HDDDDDDDD4 0Mf `1a  &06&"""""""HDDDDDDDD41 @"""""""DDDDDDDDD3)`1d+yK R="""""""~@ XII Q? LgDDDDDDDD 0Nǃ@DDDDDDD0Hc Q @"""""""@ DDDDDDDD0)` ? Rt:)`za&DDDDDDDD0)` ? Rt:HDDDDDDD0hc ?d_]u}KlsA87 ?<81rtL$ZKw͖ 5@]ӐxOQoQgbv`VS_ބ50jF||ҫX/5F~v~*a77~_%M΂0%BY ?{  yq5r6;|b)%m[?oFN[ްA1bdM}Fڂ[Wދ_0D p(-"3@o/E˂@xAsbPb+؅rcVf;p_)4 Cx jOD/XGSݛ3Q$h:,~)cY/<,3ap UNlzoXufW klܿ@]ŖWӋ7 JBX`D-Ʀep] 3ϸʲPäѝ> Fs uW~ٕʍ԰5,~5ʀeG/kXLkހ0ȳN F#;Y0o})_WT*0?Y( p\8#VhOZLY&'Ez- ~-ۖ En(Y* ;m'!gtw>Ħ_@}_8aw\&"3!n $9bT0maHTֿ[_p 8, rfC;pbwS^Q T^Y_)$LVfoŊ܋))F8@CXZ^C/x(oTw;.B9#qv?DDDDDDDuH%غ%ǵSem}/~}Nc2^<,}k] {\j?"Чw4|E o cJR[`6$#m6Wgk_,߉܍ōPKI aAևD}uw:wp;۟Zx;آ>cY)n$գi)芅rq0DD;߇_ LNiځ7Y*gCDDDDDD+>,mqwetWqw =-(D#!`x, ;qqqGzG+oZ4- .ƨ aDdW$aJ3\ܯq}nx" 1缾pМ7K01TeӺyc將 Ay !0e'/ų?ačo`ҹ͘r{}tE?mcӿ&EDDDDDD;>%|qt 64= gA/pfD}a6220#~X$(E^)a003kYj˜jZ7 _p~̝le7`ƂQQrd8np{ţIʼ:5g S=< ]O AApՖ rX&_t'n >So~ ^2"Ş!q3xcgН r.f8d&ƥ Ű e> &u]/""""""^ɲ̣p_}CXqc0F Buq!@S_.EVٸ`bxX]{[~_΋io>G{_3"P_\4  Ff V 8T@wF߃tN 9<_v*/d b?5cB+DN >Aͨ)m|#߄}{P2㓂~ڇř7gl}qlGĔbKw?1ȯ[Ł !(k(WGD~~.3Ru& ,GvvM(FUJݰWUPcߟ[٩QObozEMcaTY(4Cノ;8""""cωuyY?pelwMW)A9mpp&_T ݀@Z;s3m5mؠR)ݟ?#Lv;b [LY{C}矗ꑽ Zf=ۿ.ߎ"""""Qd . RvArIzf:x-9pw`2%{sus_NPaAEYH9޷ 9Yu-A0M{ߏ%D@} > dd uF+T`/b(uBCo#B>|uI:v;M L S-~؇J2W0j8Jzp*1s5Uٛxȫa KÙw?lˉGxr|L3؉ye{t0#uX$E'5"g72%Co@8!B[SիP8hfjYQaE#q8kWUYNdUN]rIC,dceʳv@n0,Ƣk^"WVI-N-:CGGJ$3 AeeP+}:ߴ sNiJȎ&-0 ?YH>#tu꼁Ȏ]r876G!6-y?&?fݸknઃ-Ʀ ǰhM,οU}o?:/5&Zv]oJG/'+> \} Q3yzs0d2?3܍߂UUؖmiņa'mW} RbGmYlK`xP#v=V+xqߚ ̸6L2|wO_P WxM<<1 Ru1"ԀP)/(o?ƻp0s;Kx"upb$}e0 Ć.GkW:=KR-IO>_og$`ϯ]VTmHF/MbQ]/DSH:ƍ Ӏ dX )30<̠W{=v2bpD$XV[KT 'bT=`o81%hMh}mjxU~C5:v:b-ʺv`]31 5cK0" M.dFfQW(zjK4B9VQ0nȡÞ{[nTgIÁM?@> 'D˫PT|fŁͻh'~Od&:[vŪuP\V< Ay7 ~.}Qa҄T1b˰kCiD#)eTZfoz?;%R}vc6!nQ炓'`x\u%OTo6_ZJ( VwuRLuWHI'GWDHvSmga^9 _lǷ~mߚZ$] n>׻Qa~;vp #'6e?Cc}vLNم; !:=^!31\2Q5 \l-!T_ڕ@EGRNJc41% qgo5Obra ,v ?iX"7ɓ`t!С1fXeART%chj 3*7@ ! n%.p j)oU?fs}8TFLߑw"+'G d]ĥaXnf#-*~e ElL{mGγ+7[9Ρ碣B լBNf)Rl14F>|E(_W:yMDDDDt1H}њK: }+/]piG,X\~х0Fc]:oo"RoPixWY nTv\6LegPa1ZФɩs[UpL3]8MkvfLX`; EZmk~w@#c X Fmݍg3aZjX[0etܽ/}xVFY)܎,W"ݶIqǽzďE߰Qq֠֩lU9;0 R~QۨU@p,[1bP yo`-u2{~*DuC<:#tQNe7H;cَ6Qm5WW^ 6;\QfdUቇYwdcaToPtPm2#Kdiv zK,p-<2JL7 {32PpP -~F =1eyл.Ű#>j[~ߦPuOc)s7G s/bCr]8Ɲ6Ϊr'\'\#GʮUE 9 LپK?/> !RJDLƬ&S#gdzKqq.禡SqiX;0}J~pQ'2 cC%!l˰vCF!x㷁Xov_DЅM'Og8cl,(jp6Rauaw~>Z>Sq $Ĉk>Hv8ψfA@1XB<&tq`B:ΝecqÚOwy{0a8gM 89߮ca \v YY첌|&FDLlߨðA1nBU5Y86NkNH9 'd"2 #A̘9 %]NGRLJ֋"rKB&] $"((@^D 90,ъ-9C7CD^w#!H\מ%C|`v(ۑiW`v~#,"[~;VQ^݀m 1v=}osN̓6a~dC=)̯@""""D_4 o :vH 3/Н4^&-N\Y <0*+Crj8xƅЪ,@yJvSBCoz?syk|B߽bnA6`vTKP{!=us=]ؑ# @uTHK]-UTko]co?a}'>A#c7Ď[:#-S܉Ǫ ЈFίBXb,N:?!8?έޝ;wYLކmf,ꑊ#""""j)$q͝Kk~\69PlӚM3<[iI/,N!It ^6'* [8PQ r[NJPhhEPP6hkc:c]W1yT܅S_>6|o`Y_< 2|X[W]UGBV)S_ф`D Se82\~e["""".8e4X\6K. }H㋄cpǫT*G=c H(9rT`/`"R%N8{R/tM bw.huyG䉼FAObb |EU@SGdx-Ս/^ju'+R`:S^ƒc*']c0!,4G0jgTM^ P?r'"+"K[`"""""""08B* """"""""ja 0DDDDDDDDDm@""""""""6 Q cHDDDDDDDDԆ1$""""""""ja 0DDDDDDDDDm@""""""""6 Q cHDDDDDDDDԆiXDԒ$IBQQ!JK`DdZR """"":/XDRy >)zHlTV#G\DEADDDDD Sj4OLvEQ :\G: )H%ûs~/ ƾ?YDDDDDtN BwRn)ܫ/8!v k(,(`9@"j1&c5 n9% \Z9uޗlrv jgd6R1$#:ڢ(|`N}'""""Z?X~iRڧEΔouXoRߗ.Cq[@Y#]C}֟Nַm_ߵ?+DDDDDDgR]+~/Q6~<=T~{‰=#pEL]FS.o jFIn-vA6 lZOC֒eg㕿kuI> |0fb9OcĨ7|[5_XrK z#<6ɘyᅬ;J"f.OcZ-H =ΐ⩵x[q˸qfH粁uZ/?ڋS|0fEHRh-gKgWX + M Ͼ7GC*j++O+&j:$FZ97TbqveӔSidTWW#??_[}>8Sf PlǾbbǺ=Gq*x91*pd_!aqE?O?,;'n=7&yC0q㱮<*=fnS uTZ*|`0$RM_}yxGj=ץ֤"X43V!;>Pc9 S?m+_V*o'7kރE?輪1ssTd/9'y`5_rl2fn=<L7 ǟ`)̞}أxu4)|oJ|c㶇Ǿ/M߁SKZϝ:x  AFVz9|o Wj[gW?S+1c,FG'aUP7X&i?Ō5Q` 6RWrst3s|\{:+'Y!""""":K :[@"|-`qlVG÷x+ rhC1 x=ES c۷`ֻvav+C+A̞1y}7z!ch?1{ơ,vO> عjfӯMX^@ObTpp,|5T:F$x-X#H~㠯>߾US~{ ]5֗(m!6/^"?ׇ&Y.{ۂA2583 Q#0dxefajV5E{pL|:{wx#v5o -xJ}'giQ÷ܭ4 SIJIԁ$Mۑv>?k_iWCe.&u w,Ei{)@Χ>+DDDDDDgɰ 5R9XaOo`\u>(@|vnSh зm_rPM-y!22ɥX|w@}[T!=vWTtO'--¸l.\Lwʬ$n)P3Kdz o+MEJH>vLXo+l85y9ʧth1St+: =;?b#eJ ו"꞉xtmd!R|vr.|T*/S0#ډC0G<:Kј` HDL _JT01S)>"?B;t'p^!JaB;D7|ˢY-rypz* QWʕ˱Mt7aX-7p0~0+Y+*"TiTx*J*`cۃrC?MA%, '6W ~EֱBT3Z%W[ll:#2צ2Uz?t -|G<<:5~[Pu,f1y 6*[ٔ"*cpW[xÔoMUcԃ1#lRޓ zYG#9_FʄJld=RvXPPseٿڣ^֑CAT"""""sKd}wtkWtSsB@:wϖ>A}.p. @Um68a=" d@D+y-s[Mx"mؽ+`N"sO)4"?`0(s_h@e|,Pa^X"l=,_}!: .nz]1爻QpՔrɏf5rA7GmWy"gfk3MG79'01Vy/F$'#B ;?ը#oi}@+r\DE@0˺za݆%(/v_WEuݡy; \ӧ!H`Xp-BtrE\: nU,Ѳ 2km߆@R#bmt*|'_/{jr‚PHr+*Jɣ3PWFAN D,c_ ,۰z'OS>v*H5WPFa˱g7Kdnц#?`5,S8Qx g.&={b/1(R^25 u-2|0P-L܉k@W'WZtQHF\|ŗuv=0f bcclw}]P։T)m%r 0 `t-jf/ 87c"u~ Fߏ[{y R'_RR~[݃ޗ*mv,KDS01=D]0s*f.oT^qsqsǹvg,w:m2u?&"dcԝH T5 A=YX$zecؤ|FoBFrBBs `@Ǩ;=:NǼ55&Hȡx"|x^m[QI9LE MaO?c/Ohzm et3ヲ2{HDGG9(HP9>#LDDDDDA$RqI438Q2*&.v4JJP)c+-)MW0u_Qqб\tkVCoh]i^ 8}\Ԛ;p-7 ~>(8?B:-f0+y"WM`qDT9P̆>$Lkt1嘢vqyTU5Y7j)nZe@S0$c}+m=@e4\p\FmgBߢFc[n"7~U8@"m$0YF 7Dsed`ZQ"G*}1}S?r Db䩏%E{lA| ۴_Ѿ.=, MZz= *y5fAY:4EE㪤DDDDDtQDݷL&K'(A~_rZ+V^Nv9TLDFǰ1$c㯿 Sg J+#;¶ݛa2J$""""sZJF^lڰ"FzC|B"yaHD-JTHLlDDDDDDDtXDDDDDDDDDm@""""""""6 Q cHDDDDDDDDԆ1$""""""""ja 0DDDDDDDDDmU@D-I$YOP?0* !"""""j- a@|R"z_-++O#6ETT ے`HD-T #DQT#בG ^\ûv;n-E̊$"""""j BwRn)ܫ/#׷]o(C$ XyDDDDDD@"j1&c5 nJʟrɏI(A~nf;v_czvԽMPe65MDDDDDDQqL$[' STS|#/,ɽNGkV#9ڴX,R"""""V ʟn\C%хlMvmGS:9U`jR p:>~ٜjmM+۵f:0ք\m~9[ a>c]yC> F[p[|[8A׶%"""""Z?K v/Gq?Oo*RN+}X}[Þո1FsDjFIn-hvA6 lZO=McߵFD6dHDDDDDz0fb9OcĨ7X|[5_Xr c=|ߘyᅬ;JUZ7%D:Cg˗j;n- ˆsnl|ŗ Q޿R)DDDDDD@j&Z$ur滄z\_xun5`1؄e*1hX)(Hrqoġ)yC!gW:?MA=ܔdTWW#??_[f@"""""փf PlǾbǺ=Gq*x9*pd_!a|E?O?,;'n=7&yC0q㱮<*=fnS uTZ*|`0$F/-q x;w0|w82CD ?Y8um$אucm{t2f~ʳ㓹 $&KRM̭W"Gj\iqf>Q7 put@^'` u6Y]Ώlp6?6 F4/xEO1g2#}| 5T6Go-9Ҋ{EgxAlLѿaRD3,D/܎?\UrWmRe5" zĦv"P8 R4f,X#y(yB$nyƗD!(he>L{qlF'0rJBa5$8"5W&(|<sFBl.G){ᪧE\{u{\oyD{uڂ/<}_o/8Ѿr@%B>@u1-==@v@VIcLy{pTn<;S *aU8q.Z+RѺ/ںOgCeY9Q_6ՍOѧc T[OZ5m+:?yS[Y,%1$"""""j-Rv.i`"ۂ#=@ W!~t̺Cv%$60%W Pzzy u[(#{B:BߟY0%DZ (l켅l.[ZH_H-F5ȗJ1w=,}7 0)c [ ^# d-:~ ZlJ f~orAj z08|M{>Yϡb8$kWHpTYj *R,W{jr((C޶DDDDDDfkG(."T9᳥/GP. ( A/-PUnt ND#rѴ+<ׯi'cϿ7ÂHG4\.%JW3P'߮6"bsx/TJ%U6}/@q׾mtW}7=ήs](8Zu}9t tA [@eauگC< t^+rJ#ls9V=L궟64e1U‰ KH0o=s4; ~ϗ܍Aq>rPfTOy׆EoaN\%?qת9>:_|Ygc 66v6JymSZ  `t-jf/ 87c"Ҹ?z?l@O@%<5%&-jD/OAhw ƖOW땽&< Boa:$y*s9ץra`eʨbM'EX ƨ;((j@z BٳbIƦ+uIZ߄H>RІ8.>1N1oMME9O[/O۫mkRj!^9i9i瘻cl6ˇ>Q5T&Z0X>/Ohzm i3߇3feeer(7(HP9ڔSZ AK%D\ jM5Cy8Ғ_Xt!Y&v9{/re~s]Xyǎ}x\(j=_}111OnZ Vò%o f]d~!/^ M\6yDeR9@1j8Z2Mesc&$g]ynwBM#&`϶2 .8.j8magBiQF-vQAp?*LDDDDDzXDRH>WFٳ:\ƦSs}a"") 9@"j1T"xwSK%ya Ǵ_ѾΜKdLFXXx\߂Jp^=XPߑ쇽 NJ%"""""j%QDݷL&K'(~_rڋvz:mrFa% $$&a/Hu& ŵxzSض{3Lf#YDDDDDD@"j1* }{izTVVRSGLl9=aHD-JTHLlDDDDDDDt*DDDDDDDDDm@""""""""6 Q cHDDDDDDDDԆ1$""""""""ja 0DDDDDDDDDmU@D-I$YOP?0* !"""""j- a@|R"z_-++O#6ETT ے`HD-T #DQT#בG ^\ûv;n-E̊$"""""j BwRn)ܫ/#׷]o(C$ XyDDDDDD@"j1&c5 nJʟrɏI(A~nf;v_czvԽMPe65MDDDDDDQqL$[' STS|#/,ɽNGkV#9ڴX,R"""""V ʟn\C%хlMvmGS:9U`HD-Fp5;zX[[F:έ-l5ߵۖZ$c $Ԍ6[ǭ5lrǏW6$!@"""""փ#yXN c͡3?zW2(!Rc_!? mGv)}ݽ8xgKFmYWbX47 >x#?4bvv6K/Ęѣ`( 9`HC> |&3{ZɽPm@yXM$չH.|HҮw rikN/֠mxHax n0wYw>)S(?G|`"""""ֆ 5ANRTc8N]c.ŽS1c8Z"cѸZNaԏ1[.JQ`#{cpc-v0`납*yU*DaHu2NÌp\7CƎLj_͛”sO,c!fGx4n¡j^<8Cvrw#Z+@D ?Y8]"$א4X?fG:7d׺@3}&^c^RM̭W"F`5?KalœuX9\?4<SҪmW ~ÛY7uA{~ǟ}c#޻X BB=mKDDDDDD- RΞw~xfa;1"C ڋw㠯>߾YNCW%LC0t̿3  ?7oOEɏ!uT^Ǜߙ{#;B˱KBo&WQDh@VmQ[!w6e.D˟,,YW}qS|=F?w+ @AB|:}LI/A<;P5nMgYlfEQc\' ̴>gwxZ wine0,8Yb&4 ~Akԓ-,*He;`I6!`Ԏa% 2psk?+2ݻATcDŽx؈aX[N;(ADEt ]n盷<=v|NM+!ztaͤː v+Ư,>nb.%i$\`*:c =czEOvb̽8Cux/Pxk%!ؾ0nr'5yМs+KođcơVo)ﵡ;)tGlWi3J0 9aHd+5&ӆ"5 v|So֓h(fOy#ՐwN2c=z< 2YF0"=YR7emh_]N^O! Z2"wLܒߺ:#6W ~EֱBT`}jX9^G`J >}bW[ zX_Wv@VIcT4Rz+ WLKSwDi8<;Mr#7&E  bHmj5TFr=z=<\I P[wXg`~H[G26đH PgQKٚC}m!7?r07RVda]&1xxV|6IP_lDYigIײSAI<5R UȊI0>2U}ǝgAF@gFp lPPnO{QcH]2:hVc|SrM'I07~D!"kpՏؕr>!ܓ"ir:'i'cϿ7ÂHGE.%JW3P'O0?47tgUكc÷]rzp2x5rQ{:ޘv=|cz(aޙ#=,L##8۽ }?=x"""""V O:n^>>ޅ+%䮝y44!qxs$|Wu G"0c+\B~; NVaP5}x`H_oL }bwe-@G-AڽwͿ_DעW\0R :m?F64e1U‰ 8׌X@MqrF-'Qp'b*W[tAlu" Ⱦrrs_1w~R%|FW^ o` 3/oىSF]]0:_3 z0u_Qqpd%;Kspb}N]qW">1 7+p >:{FͶNx!nEرh*fG+g!#Gn6L"T>ȞiܘTkrV}n@nǨԕbW`޶8^"}p#p]oS.Y2WOt }$ljdd<_g~9벬uA@t,eΟUDWP}d?VZtH? {Ⱦmq;&go[Ivf@P }no$&v`hED)}'o9njd752i -w^WQ7)}|b1>£IJ-'JT+qco vۀC0{MћSE*.|*IJ%nןa~@̥bG"CnyÃDe01 ؿ%y+VB򳞹i<O_b=Z>X_RΞw~xfa;1"Z ٵE7A_} }; ޝE7C;5N >!,$q(3 < عjfӯMX<3}"&1F2d,߼='?tCe#Oc痯^1 R=?a LF%JwAhݵJny?QT6Yݎ|g-&u ӧP:wARy^f{/iiƽe vgPj-tze?@ 2c(֧UHnd,Z_Ȼ^?n_ /䀫>$#MV_4zHɶ}m -(  UUMC%#JP{C7#yX<áUb0w6~ : .mvkZ&!d, eWC sس#EDDDDDtw+jVxL8y>vJ&j`tJ}8e_t2 R3RJ_,'M-?X )70kXd_v }|DNaw Lݡߋcf3ê?<-Gi8XXnzR֛.73c--]_Xow&ڂKy+)5G#F[]Vա?D?[M5y@`l kLb_vk> ^^X,~A AABh%>Ӏ M_<'jU=$TV+B.F P[?fsӣ;Fc}S tjyd(3.ެj.!W둱awC!)g8s xY_Unlpd]2:hVc|lSa:=tHj gF݇YS0} 8px'r" 3*o|KtS-콑!*Eq_q A"CQqd{({%i(ߏ'ir{} ,yPuU(jzi(= \߿ .UBӠg~ ̄*%Cum#!lg@u<%IM6"b6B0l7Ⴓœ+x(dR$NW]H<9!H9Bڠz晘}<_rYv+bU)t-R5*j9UfOFhq} ?E][f?beGQh'h:[z0wL?ػϣ{=)Jx- :s o>wG,Ju ΝIB^'z `֚0zqTPSh~wT>wGt!g*Z;F/ĵ\puZWJ*V ;Pn(/)wh! Z7JV 6x=Sv)GF1ceO@պdHDDDDDTJ%u_/*c+楕Ҝ9oۍ!9)q#Y.`pY 23}t:ԮUvĔPP":\ݵ]瓡wEDxΈR%DDD}"*]`suyAE;Sw>Ã*1L Gb zu<U`O3ޕ.fBNnRY];UĠqP-~slYw,rq3f#qփ=KDDDD @"*]ޕQfMx=0 Y5 ?݊)IFA;֛1ax{>~-^=3~mGq>^c u}WVJb9Ӝ,$Tﰦxе3 \yLݺruIL#_I_rI(|e%`1u\J7~]< |Ŀ;OG_ZPh/a%|5*.vyS:y#uGsw1xMM|Eov "Fàf> |tSn/|)7gLwT?4JF͞h5 sAܑus`Qn ޶-ˁʐ;~5cȀT)2rZPq  M v *c_EOI1)gZN}47-Kp\U0u=#\etd_&O#Us´#3<f}b09he/x9;-Qt* \-Dծ8( oHנs;ijKZM横؁' wkXZ ~r MY=5vc|++PT~ \[]k!s.#* 9g .) .AQőo< {mgM[+$c⥧[ |NTxaa<,n~VfG+xaH:nž!hݱ?r_ȡ8d0wP*мQpq`9 ]32oIڋ9P0Ϝx1;ߚu30l/oNFX!x{|pf>gʮJ]F=l.8s{4@qT4q4V5h3]ТAD!%QYO9.G7Ľa( 9vb|/y權5ߗ{իY 3c}ns( Gc {^z-m__e[5ڠgl9Cy\TJ\R!GOT? -Xb[h>k?ElJAL?ܭ7k*^2=tgLG>m_2 ;mgMmDDDDLKXO|r=ܸR*Jnj{]ӷq}^N>m`7 J:\{6G/' S PWϲHݵBy/ (2/N8XV1-SI,g~jpa%%Y{4- Mk{c١5y{|Ѭ^3UWs5]sJxFG?wZ;qky5۵w>҅Kگ>C1. :dqm Wxf؈hpax|:*Z1 ݪC[Wo\*QI&`T?>ME 1a,yc|ܣoavJӹDZoM*\ja7ۛ9q,TfSͯ1 +8"%Vv{eȺ0ٌ*:g+ ؗiBҷ^"G9[esds*8r9Ni-cT- rVꍭA<JWy>䅜w=SYl:W]H<0}F VQ.Hm^(`[GyWsZ%윇y!mP=@pqL̾{r Wr &{}0J0|z~㡨(TkJO{oþK4 ڡ>3bѽepGkPl~mczD?.]\ :!+Ⲯʹi~ NvTgaӴ5Hꅶ8&i·RTv>wO"81$"""b(K 0 /}r3wU>M7_f?b^(*`xo"~?_C;+yYCB]=5a*BrGt!g*Z;F/2FhQ٫xNVx.e'sW?6s&oS]P.(^XNB֡D򫜨VJu ΝIB^='YQG;x=].M=pt Bޝc*9<m\5:uCxnhS+t{1ylֺbGn{-h>؋-?c;j7`9 GiYݵ }_^ƁK,t|1$h<]yc'nE7.6cHDDDT6)߸!Vd)r ULn7M$Qdž1o:;9~+~Rװj L+ lQxM$~995kmo[Ltc ]3>`Н$""" N OwThק#'fJ--ӹ2DDDDw^LDDD? %|ߋ>;tIܢÀ'8"`O5@ 숈4y 0#x 0 @"""""""";DDDDDDDDDw0&`L$""""""""1HDDDDDDDDtc  @"""""""";DDDDDDDDDw0uI6 9I& m @rXJJ @DDDDDDDtaP(""""""" 0&n?LØ$"""""""0Hc 9 @"""""""0&n?LØ$"""""""0Hc 9 @"""""""0&n?LØ$"""""""0Hc 9 @"""""""ۏ! """"""""s1HDDDDDDDDtc{Rő)w& G.$`ƒwjߐ3\խaǸoy2c+yiU~d5 |Q+~ܑKu% ~~MϿ#†X$Û]iV$O}+GI߭6.ރ{p)ׯi8u#v[zo۳pq/quMnޫP* 4PT]Jğ9w,<*y".*%2к/~Zzt/=cMEoWbX]>Kı!tМZ\."ڽ_м^N|7Ap0#;UFpƥxړ70m<#.ag):Zz5>JT#3<=1 ?hUψ{eC"> Eدɞ8 Esؔf8֥5ˇ?zVi~!ulEnq&5H>n78s`2`RON7{GXg\{m c4A7꽹f6\iUæSӰ{^sEh|UިE̿w:ZW4dxO4 NOx]HR}Oʙ?S5lC!w{tj!6h7BkW}xeY'Rnj W{NcUIb츷P`#.gwݑ3YbK}2V~(W%xw[cg{![tdbսC.qz*<^NFߝ& tꎘyMl/Wm`0ݨYFQZ30oyűq]^/-@QC 8,u7:Ck_hhPٺTomp}ӯN~ ?^ኣDDLD8į8p7^8`P8DơqhfH pua=kS-G_*MC|\1i-/yV~^z@~XWfn8&Cv+reAœ1Se} Q AnޔƏ䥭i}/o:o<㸋urDc{˓=J"$uC/_˞d.)S\n/OHCd" !S82~ Cg˦ˆʜiêe"Z.K͕yU~X4q ɲH#QdŊY2wh=%!3 ޲XC\;d}_%Aբ%:^g(9T˺Tx+\ӑWbm+ʩ2&JiɐBdu:N, @v'IYW7^?9~u^S5MX(?ZO7Zc?yaewduk`kZClmM<6b,]BM"/8+mͅfK 3+zu[6rFəT;˕g[Zx=sGȌ%evԖw݈؋#u˸ MػH, ۶t?xc80Gnt='H<,elL_V,'kr/BNy#6p.w/eGjO:ƾ)EkVj=:ӮñC'ەN򮯼{Jxz^za=Xݭy5/`n?b,ck9d+`Iz%gM]MH+aΦǪC˲2r?2mb)W礂 ٟis\CV赩r9}5qXW>u2XAYgJdʱ mEm^uPt Кm?b$xibttZ2 rhLkK9ܺʡ9!cX}; O/*k`#x_w͝fI"oN{55_FC:ϒXC;ʦ]oIe˳SEeW1aXOyxye1OC0/oZ\$<K7O4|HuZ3Y{m7T;w^rDuHwGiaN{H{%(]$d蝫_g&X!I<(z0`:m\_7cZwLהG4NY͑Rw<$ָ rVLi.NZʥjΙ8:RWǿzI9ː!{Wu0h [ԞM-,Z<Zy%ֶ/6Yq(~ @u©:V8_o4r䳚GdEBzD;hgvB?fz[ŠbgJ':9dsǁ8-mJ~oܦMIrPT A~bjFCZן*,]ު:CUHʷȐj$́y8`Mɉ NςbWδscqڇSGiWTxO x 0kI(7* ~8}9Z6@htzsWa\\TpuQ_ *)i7:C[.`mD]ґ*b7T$v]T@PӏAӋr0)mj=:WlCgڕX)?QiC@TM ,=|<>VotpUPj˹2l>cq'Ru,sřR6ӎ7g<<]">WJAWg6d^Gx;C;Diq0d( =#s%)̯zX#cЛbnڞK|xg-X?9)&`C?!Eᢆʸۧ7$ƹ?bDc)Я$b*UDW;Bg"D˥+4Tq6T@\mK8*xǑ3' hʦIeݘBUщ EWAF3~\/D5cy3 .U-f82e2fh/RC-, t(.ֺE/)|aͨ?b8|E3ԁ"KRt+y+lFQjkrŀˁ:T+6wWcҬas0^,ן/޾VUľ`0(2G36%ׯxh Cط=3|4gDnx{,#uqKa7 U1$G1'0y8ߠ=5(_ҍ(M]\v۹jNkptЙv^b^V~"R3Ty@cYtNSBI:EP/4qذ.*UJ󙀺,1NxKz8z9Iq}!qGNYn\?yjzSOI¹ h'`9HѶJa@؟K}4<NW`9ңzr[86/{]yJWj\7<5Nd;Q_gqr5mwEq Օ{HڵQ;{Fv ý~[TutA]Q1o9D>Q>lZ;;œ\wh lO.bZGěsLiEDtg_^n^4;FylZCU5Wj1^x:@lHӋv1ܥ"/G%ֶx>=Dg}h4V@rw)c/zZunWHYkݫޅ+X 4N}\v薷 "GD_ ⁨3&~;=zEٴVϊR~Yr-QŽ&G37hMށӏ4'gM|skbb.~b9=!WљP9?t]9ZU[~""&?J'bn<;=c͂u#*yxT)ͧa]CT/]U񅋋*^.w,EV(©ttg8_w@rTo07iWШnsXc:nh^ռ'j⧻+ǣt&E{.߫if:+'ܪ\1$>1|`Hx[[Ɍ7[ S{f8kĎ+zP>yKAbQ8Yg9G>~!g`_1fO7!j,]AP:?E6b|v$}zF;t]6֥:Y|;I7vT<@W\GM0K^ OUJwwX96:b`}n!*ks` iOʠx@("-3iZXqy#v~hg0K"S=I; CW³w2GYuՁzU%± e[vbp҉:ofq=fw²#U]T\\I->^ i_K_%Va=Y2n96ڣ‰b:Ӯ+%T~"R!! (净3o?oa8( ̑/Gq5~䊴{m,vZ:' JOIL\j1 'ȈJK$}4_ͣzIO m_dzJO@qAazhޛgQ5ȀO,W/Aw`73e@0- ٘T45eݥnyZ˵rEWX9<\ ͥS!nֲ%Q/zk|͙s?Ⲭ4jMH9n>PC{AyHj>v7pskCT gߙgeGݥ^uHsyZ;/xTpP!Bsm{PP{@ßZ()͍-N9yF yDf{JWfɅ<#yٺlm2Ox) / Rz3TX-K%tx\ԊsbH;&=-Z6&mHvg$vOse!+h) Ir8͐ݯC 'X_o}_t\+K_yE{D2uΙehT;ҟв[k6n?&u-"xEIgE|vV92x52q>g؛nA )l]9P~U Xe# v<-ݶ:uː$A.УBtl ~C%܆]Q! Vs4_j)n<\'{ȸÙEkƾ8ZX{t])S+˻򯿒)?¡t0 `m"O"b n sn ƺ$vL<ُnB3SѺ~oJJXxz6Fe^#9MnN/u3^q?N|q+C(8> ć-&.gqhbxU {_4p+cQ#9*G U81aB؉cN `X K[`b+۶~|X&u݁ݙ@ }D_;b_Ж허`z.ǐeA9Nrd*u"3-hV"J0. 1=j~sSpz{J쮃G"y ʿ=+٘aރxzk&2RLi_%u`>l |[ )­E =^ qA9-Eү6cDTBaLvAk]ʚMQWs a-ėk:n7eQ<4ƣ4ADDA%&j+ѡQ(swUbps5_|-1_ݍ|v'I`l""""""/`gR鰀g:Ķ13Y3a0dAVffe!!%5"+K :s9*?"""""""0HeF&aOąIP[ofz貌. ZTJA7 hny\$"""""""*TfrzX\T*@z 3LOhu(祆^ 0'$,$"""""""*Ttj/9_@|r\A = |@ߔt m8e[b;O&"""""""5U! |KVA0}vF ޏ9%{fxeư{r7(9xQ&'*L S}"_~tYY&)9]o4>dmG ǿ!ޯ;K*!>]yuX3O;]k>Dua(?&m5DӘQVAը_qv_9O? J@ܸ&-};D#Hׂ{ Siq${Б?aCe[zPW2m@O{k],>='r?,_9Ȯ)؛*P0 +Wse_,cGⷭq' d}Šہ#e/lcW} ~d|xY5úGDT&hvsNͰ+_'qO zU JߍݺcwU>Y5}j/qh⪀³ؔv!dō=Q-߯%[jhHwj|z$Ys5,I~,gݳa]9]w\.=a]F,= $l= %m' Fƽ0qgtg!7 P/⧦:v&KAuE+c5Rr}=T[Vl_.1a|9^J0Eƃ&Y4ݑϊ,-wxQpa nGmXLQXoOD*]Pxr8rl1a翤D2q5HCnE\ǩcqf+ZԮ_5_'+ ъPdrF^ړl6i[gCd&q A֢nib887q/j, ߶xhԙ0; mn7<>2' W [-(<:C7d'`L$!%nGFw KvG?˙u'c>{E7jV-tdp3}X耝px~1_kT1?%*끑[g;iql\yZ@A UX7b)0Ţ>TyĻR͗*-T~;oIhbQ =1*8ڍi+XE/4rCތ3㣂yT~zAV)ԴnxbvQyX1'E~9ʎ h~O ױ.ºC-HDU|CDKۉ/?|>a,f􎄇i:nѺ$qٮ$&x#ru_ǖGCYƩ? ).+?&-kgm 4Fl 5^v'lBXHLFKtcaSb6 7}XA^1Җ|Xc=LCT.78ˇ?q=A{rUsEhTިE̿G8O7*phxUEZkJvt v :Ǒ^YĶ~ !G}եЪ{F܃7@2]ؓ] Dx[ Oki*Ǝ{=(<0|=݁ +#g3T1ʿq`v^ Shʮ7>}s[tdZu8Ϣ؊VV֕u*u=*P՝u~xzCarQ~ؗǹ|ө>uAҏbkw#+BۼUqEne)$rįS{oCeajơqh#SSe@I<~d_&d\_OucƲwXhZ1 _Cly+Hyb,Yba;ZmOO>xu!3,%37ǩ-JN, @v'IY y};;{Fe+dr,7@/ {ɜedu2y`vF($ln^A\PƟYuA~jq2W !E 6-\1U^!LuelL_V,'kIVk'gЎ>Ʋ(qWNEVʂp΋T\=X~Xv\ʙTɵ>L]iE$YB%_s I,\M)Wjyvs~Aܯ6Pm$2ƍ|@f\!%SRe} Q A~c7eGzrK[^ߖ%uг+\Us.5G/O*IHHT{hP}~9r*n$UC)^.7V$g/Z>9dZySj3 W&keWv{VvGZ^ ˊy?8W'~3~ ƾٲi߲a2pc1QLuۉxq_fiŰSTc=1JWZRH2%vƽFwc?Ѹ-Q-6$&ˉ9؏Zq̸E9].+/ ۧ:ns)%Lq}8znysC`YJj4IIIGdD/d]d۬r`Gr)IKK3'tWm<~H2w(h[Y'vy ģ|KҬ0]oIe˳e2Ȑj$nx|}7iRH_. Xy*O%+W`tr~fY Yx^*jiG8֝+)/O_vh/FY 1xwY&sӬDB@s-F_?J s2C:+)R$!RNCV赩r9}16q'N&+3LiL96^uPt Кϗ`+(fiN&qKI%Ӑ.ƴí.2%}I;̽3!I<(z0Stg~^[M3}KNpL5/oHM8i^|5PsP6K Hm}Inܝk:xr|N/ϔz*9+xLV8W4/!:D} 25~[$`١x~hg5ȊNZ!=A4nw ۶8|:cf8svk>9uSƤ|?l-3Rǩ"؊#8֕uUKmUJiG'CB~bϊ<'\u!fQBQҶHwpM]_%!LAd*[{:kR[mZkZWkڪuֽ ^pBņ !$e%s=ܑ?ƍڅD_ [d^f TI!ˑX/Z4!"sHD<}Tdff2l;ys.ȽмUY侱fMKAv~?nz̩ iꆌs'+$OTLkF0_؊ qmY78ݦgAȶlm0'8ͼThdyi}/A iA:OBٍL2 |:G[Tmm8ΩFbJm=]l~,rW~ OT1^ʦB^aINU>BfEl}B1lS|гSQ$ "wXy"!uL3tr8VhK<I[j+sj|Za@1N,ۃ+-|mRB\Sxqc?AYjNE!`0a$*baU1𣏱sbI,s}! )r|^dk@v[iT>,?#f7 iY&%>81$j=BƋrQ]rZ_uo _Nlcc=yS'㧅Q8[1OZ'7Pܞ2*l+Co]ҟs&n%rEEOrn.?vfyIubN_an'ht,~h,S/5lm9Ӑ8HsE'%]rҫjrGѯ4!DO O/kc> x!ӢhS"nݜ-6oƉ?i=35`xmLDGe}YMcz!1ʫ{O?Ĵo;OyS3$Hjᓹ&VPRT,-.t"Db>Ǟk})"6~ QyM3#Sn sV٦bC3:WdV։n_!q><[>}h#+Zއ B@|Ffi[7!} ZЯgqqTl? ]žA;d 5- 8\z\ ]yX;ctmtw|0}Bĸe .qY`/W'nB\oj\M3/uYKy}>`ނm1 ސ=9Ȯ jx~z0WY`d>u/+]ÚJJ&^Wջ"T=M9C^]|Z[3]/##xly?TѪ(?|2)*ź?w5I8Y .EsE%[`d_Ol^H;[T4L= W=/j .Ne)ΎǡfߑX~.Y&MJAP߅+=ᮽH vG:6y1T(Y1j{ј^ia:4Oœ;N2gE+(8t6 !i; ӥ5`0LmA;HuD\4t6l+ 0O4쟫6͈PonoKH6Xw +>D|stғsR SWJi6Ϧ[Q]w[| لBj 6]v|ۙ*e9Qeq$7ٱZ8mꮑƝnIȧ#Ihȿ U ~{iȮܖVG/ i?=6u! m{PIq[5sOuI=&lN ~ R'hNTTsB \B73TNT Z:jWAIS~4\y414{-*nG4c{DTW>khXc?NVc8O2mЅT۩Գ ɑAgGUk0 cR>|fI^/N9gp=G)WfP0ѧ3 zPM!&ծlCcY9ktgS*u̘o)il5ԷF6T*+Mr&u 1bYq6O HcO;WNዕ;XVsݎ Z90JRBH9P>wJa_7(n+jrxrx45؄<?; ȘBʷ-XSfEI[XOJM)LD RM,4Rq}ԩ5 / Co܃ҧ6&fҔd0! ,Y!elRx(_Z,H6`")/{8[94,*ai>v*RI=ɛތ&JEhu;2fd‚FMɿqmKOc=}%GcP9L ;֢ oΘ`)}L2|F[Kh%? W f 8 ,u=ſLĮ{$Q g1X7G\eUmEYC0~o6f!gg}%^42[c0 x]L C X ƲPM\IµCÿgp/9!gwT+̀6!Bzj`2B9iql`0 <ߒf3 `0 &+ ^O `0 `0  [d0 `0 `0` `0 `0  `0 `07`Urco0~-f!ûoWσQ]1,:͎ǎ0y[j7>1 v,,zNi.bmmEnd0 -2Evg`'c1߈ic) d~ y?cѧ测ҏbX=E#גcv0KDS=ocaOXy&ɲ#O֕>dj;U]6z]5b5m̒[ _e_X1QQ8v;],髲yRD xa Փsjq*_csiJ`'ByqŸ|H?`GO>J`bDdi w7؍6%Oy(/SNCaOVJ6n ڠT>s,6C}ya${E~nЭaUfɨ7e]QNDGGPjc0>NZ!CJ&g ׇ;\.bM> 'Z7Fo B~+PEi]y؉1)ОlD֕SFQ |*D?S}MĿd8⣝xxX!2OG`<yXTSF)In]'u7 M&XbͧM[=ȓj-gyuͽy4(SGfm?17ש1En9#5@UE&MѼM#֝baBxOie˖\j~SYmRYӚ(m'pa֘([)cXˍ9&DIh1{2_ -2/JѱjY;y~W䜉YMU;`%ly6s6Ñ{曊8S|1;V:}Z|ڝQYϰ9h7olݺaN&'QzsN">*cHDw%[M:m&F/W bW$!%aߗMmA:Gg%#eebݪ~x> >Y@Rp0ƭEdZ wbܱ 6s8w}?hMȟ#[-܉'(ycNpEF^м@UԲfO)ǮǺDϡ8q VM  Mfhr\~|ؾfzoWMbt9Zﶰ5QBW0{G̵>G%} :f魐m?ˋG6F2:-*:Ga\2] ޛ%2waۯ"c sD޻ڱ؆ꅺ%ړPe0‹D,I3¯xeT33K\R*r)KԐ2 k(`)J|}o1qRj-( y={]/i| #c 5(|uvSEw~OO4Hr5%(ˢ47eM_'G/NPk[P UÕT*)Gl ##ɸš q-Hc*ة-EA2"GTq<2chby]j*MBYh }:8%itīcC+C/bPZ@&_"ͤ(AS #@v;̰MlBCfPd<*FGm봑jžozJ oΩF k R6@q[ j۶ IC1EL+A~[6MG%KO"zY#oͩzԣ4 ȡ&z0w[ht =|$߇!^nZ_l| o^|6E07?$G;iٺf܆鉮]$GQw'{єg;*9/ SBGp{W7~NN' 卌1_J$b=>϶bAq$'`Xrjyf﬙k$u[z{{0@h<вS0Lf|b+ĵ!fҳTOIJX s8ͼk?5( yQ/T$~b62:DV}"A iA:OĖ8NXg})N*'] Z7-iM%n[#stl{;k /4nJ~IֶS|ǘM. y~,"1yZa@1N,ۃ@@tE6=9x`0zcSa`#JL;jU=:uc38w7r@!- =h[F*P.nT (ellQ n`+hOŋZ2v0-؇`٨3}W)$y:2GVA9jPuİ*-˶b;FltCҧâQ6+)KxcU7~uqQkqͫ3 ywa(קSo.bgmvBҌs ˕سdCq2^! $!).8. Gk8rQY{w ǰm]vp4- $ aq/o4Fvn C7ٸ ?s iT4|ǘMj߂nGAjbm(~*ym$4٢|(p~w-ʢEr,Zr^CU㚠4SLG#pU4_fXB2l~]XP?':=~S3e|cs_T9&yKv-E20i'Db>Ǵ6MBT^ Z00L$ghpZy;bx'xKړ)q`0 SwgO׶,%Z##s ?~ƬouxHzr{D. 1r@Ԝ10gy&]څ)pNyc0N%] %E8,E+ٌy:a_r&ERU&|V?vD jZ)q2>u:F*Oᗕ0hO3R0rh03>r..R͠0DuCwпq]fai\j7o"#耩CPZtCZ>hϤʣۻ2}0MtWk1b}w)gYuC!,l*Q%g?A0n9쥐t釀o6D\z%Pda\ci:+A~\`xfZ"ʠ,b.PEm-{MBh5F!~L Wī1v1w;YϚ !zP>l!VlmJ8Mbd07XOb| o^P׬(>(O"zg%شx6zi3 g^jQ EN Lؿx)w%PD"gI4?(Q1Ǟn׌SB-,81€m; 9Ihȿ^`KZD'6Kɡd9j1\R w=l]ӷ;>cGu脼Myʦ[Q]w[|S'EJ5߬9Av|ۙ*y8Qeq:(36ۅkqk{) }EFѹum.Փ.m߉*P"3Mo?h '͆FdEo|:e<]?^y6Ԑ>]?fiATZ RWу\ʴ];1;)S[W.!>d ^{wMm(~ 6Ų봑-Kjd˺J3r߫4.{ܤϏ_gV}iN<?ݠ [zk3Z/ͽp ߔsUMڮ5Y<z++O HcOm?1}|HCZվDnݕѻ*hm` _Pp [LJUlTXW嶞5&=[e<qs{2ihڅ`dFMj-t_$M0x/ؽHx(0U.B#7 ѲRbpvC,"`0a)?I?Oc\ZjۿY'*ai>yŶ[zc aţh;[`]L! seZI\+)O JMaֆ|+ A2W쑔G?7H`qo U1sIi;yϐÿ R8؃M~woA`a2ÿ+^13]+WXj+m,YF9|߹1zR\00e |)n_ρĖ`෥+ `0 `} 01S`0 `0  `0 `07`0 `0 `@`0 `0  -2o+1s&oWFѿĘnve0^'2q ET;53X+2ocn1~nu[>?|l+FDwglC^1X S`0Ey\MJvijW gvhpiTQBrb:~>sbJpm+g\~Ts,Z{Kx4VofD>w $G@ȷk %!>06-'ioXUL\#rQ]Fn;1 E a"zO<<{Ȟll`X a *712NcƕCHS#bbTvU?]VLSѷ!?^L~'T}:;X5*x:>1Rj8,Y6n 6(U~9\uJŊϛAy> 'upytEjisO 5Ll.7t6nX4Vi>?0i,!%e)5ن×)?!k|uֵ}k:1ϰ}'K>.-P]FyU`7`OS¯1ʩgtK\R*r)KԐ2یlPޔ?ȾKjn9thD9N̵f.OOKsU~4yf]IQE/, 95Jks0)Dox R$R2iʽttZ™ދ=p= ߃ *O}g6ȋ &_"n5L'ϝsͤl֮ٱTNt::p7'!ȩѧ}7p}ZKql:VCo]wdymJk%:и/zZd(RȨ\}JIWr~ӫLJXݒ9/\@[HIp)g$;D6ůhA%G;gM]&͹!oMi~nڱj sALEnEChTCn#GҚIm~]wG6Nfg lRY@r$ʍN\_&φ鉮@A\asn<_hbfwRr tj}ڟy*؝3NiOJ?A}@~#Oqٔ㔮7|:_W֭+J/Mw?WPseFL)')۪|ґl4.O9;dIRB΃TW{iNK\<0Vf٢TԭdVbjB&)L) ?k#:oq_@cc|CBDW.kr*ܾKX?krjyf﬙k$u[zօ [40ݾHD]6(:P֣UR 8"echbynf-%([㜓#ȗrR)5]Lpo̦P8;;/bPyP!X!zkOAQ Hw('!ȩO'$?.,lW>Gcm7ԣ4 ȡ& k571|!ONIT{*?W<ۢZ HDYWif ?? } }&wh.O &8vKIԣ8wT$[Ut@G(O6sqL\(r}/R_QiO Lv&UI[67-0[#vYM_&Asߖ]5 y%%A~s.T-P7)SNi@Rgvmic`ytQfB<(VlI`Of ̟(:rX]c}HPevX.Cew:yYzs{0t j 0Hݎ! pA"*@nZ q+$OF歃#/tܿtqGpMƍ-w*z;1M0q }'r_=૓_? @}* A洫 9xp0zqw!ɬSOkAhdyiY.^0'QN||e0/_B  U;AdNwT;q#[ㆊSUS|b+ĵ!fҳT+f[+Y͋!q2ޞa4kPأcS5bWaP9z:/ogݧWc#qAA֍GJAv{nX8i+kזj,*4ND&jGkeiߕfxs`0WfH H.DD|OGD!!=- H 1-6k$r'rH=c$8=ZA[H8x@|e !%<C<}:ՙ=u ZU}JLjW Fp6 J嫰h"_=-- ջn"k?i=yI3 z΂d^T)ĂѸg٭}8gNnYJ>]9He(uԓG,{i⧲-D"UYewAe>c1)qϟ-O/^fX5oce}e;uz kT`v#-߅n\5FeC=o"*1l4BjWgn!ŽԾl=T'EBBb=1Bsz:=M7TyG#pU4:Ataa B2֩EvQQ{vB71<G{ØJۑ;AylQJW0uhOk9cH'•C#4 ?'`vݡFw'c[[$PZaWs=> Pd/i>ׅrmmS0R?4'\\1Z *ey=-qNڢW|ĻHB7[S|ѳ$싨Vj+vBx{&Zvv-G+cƘy7?Y`83fM}CrדـRlEu:FjΣO"zg%شx6zFyr#U\hPﴰaPA'aΝxq'xMoSCԅ=art)K375o fݩ[}ْи/B첚=x-='r9Uѵ;g`^pqGG8;uMl+Sb!?[XӅiiw%q،:}]oe>ԫ6[ub aLoP*/1e—jaQ(ԣ'krx ;7"Kihu`Z%{xM$^,H6`")޷{8[9V*/ Wlk?"O Y U Ҏq}nm800 }6^~Q`q'qAX2{ `0 w/^܉[{ajC`I@ cz^cYwt`0 `]a7Kqz$L ƛ{mih 0`0 `0o|ET`0 `0 `@`0 `0  -2 `0 `0o0l`0 `0 xa Jv) ZQuE>˙{c<^|Q"|kJHu}O:vġ zEi|8c%>~X;G"1(P4_:e?Ƒ}#M-n] mYFQR"l; u?}#+`[d0z&0sO`_+Wr9/劤{̻pDA {e~F2oO7%>nR'Hp:9Pd^7 +B"ǯCʦDi4,f]fmN_,,lUE`.EIyF5Yw+k/ ,NH`uҭKa5(*&ر5XdbDdi w7؍6`0Ldž`0Ovz|\47cڶ0I l?ßs0|(=+6>voa[OOc0! |]SdDģ8{p@Rc\#޽fCdǐX%G7m.-s vFZb[[ 4Jm%,.؅`z =#{փ#`0,30Z rx 1A!)e1 *zq&ϝ#5}KB+ۗ;X5*x:idqYSW8lO}.:bMn _a:C;YױlX')禹GU҅jzIU;s rRH%XzR\ߢJ7Loy _`ͻH@T$먞ݍAΚ[ɗCN3C)gQV`BhKIN$>#dbI@3)~^E2N$tY|3 ##~YWS۵I\}HhfB=aXOƓ$cW/ƙo'ĻE>?Nck /;z*g dXZ'}k>m`mߺayO Gb1[7=Zlo͚ma5Z"JːIWjWBڝ׾ Z6e`0^9f'fWrf%'.9sɍK\R*r)KԐ2یlPޔ?ȾKjn9thD9N̵f.OOKsU~4yf]IQE/, 95Jks0)Dox R$R2iʽttZ™ދ=p= ߃ *O}g6ȋ &_"n5L'ϝsͤlFBGFS+)bW$m\stڱvoHB9VZ>:rt/Ԇ\@%pWΗ6%RN;Q(ߝuԟyNҕޢ5TzdIV :DFU+Kl(h| e򖧇$q$'SS='G心gnz-9b*޾O(ƝL'' <:u1ۏ(Coh {3ڡØ|ck%1V@?թdJI k9Ю@*PG+ٔ %ky|f^繁;kuf]@ֆޢu! ,[B $" z|uvSEw(*j)U|2s214<ȮZJP;PmN _L>Jj*R P)Ύ$˨TeF,v>VM[{*Zۂ'_ȻHUeԥ<y~zD@bHvS5VϢJj&dV}և.O`Ї8TУ[ߚY\ gӸ;oI\Rko'ƜͤKj!-&^ZR/~lYJQ*RB3rgxP|Gs=(sȢs<&e*/ Ḫ-{݂mfh 6olN$T0"ͭT @ZSy/Y!~i~T$*teJ0k''0.O &8vA忻Pq 8߰r9H"!x CJa>f_4N7e@7S{x?f#emaofU2&Kۢ+E՟ BdYϦ_0l"+ $`P N,݅9@zvAf^܇ r/4oUv/`MKAv~?nYT;0 y brD!4 "z\Sxqc?6.47剦+. dگ1."H\b += dQ$7evQnOJָ@; ?\ƥޛ}MU#&TsXdկ_,Ư#U~p ^}qT)H]`_ކN00S 6P^,<~+FUZz;C]׌H\PY5uKJ@v{nX愦'Ӛ1.n*|ύrpqǘ|29 Xn?V_/p= c$a~@+O$eZO(eآT;g8C1[S +n^3qty)8~A nDԃ29QN7n8wq2 X-{m6fijuh̗0*lm+Jve ?$o!:|`&b/Ҿ QHzmpS'BİfٲlC")$!G| qy8=ZA[H8x@|e I^ ջ&VSWy$t9 zQ]Xn0_Y救;Sfr{aB@ Bӷi rC#LEfY]rZ3}{c~A!9WW,Ɵ^U{@I QI4 dWQʩ,u+|Dqo%ޟ n>KϡfȾЪScPw1c P$|l>{N=>񓖎oLLn>`Blup68Ux}75cp%~3?MRߩ7ggv޿3Xmrd]3\Ƭ}흇xΧ띛P}#{ߥOUx>ݦs>z챳7ڧNܭT+K9g.65#RWTeμË=4(5Y3T[b1gu6s^j9;_>ުsnjT1vx~&MzAuY5 |/ *+nm:rnJx{lO==Z=U&Gv?iigjS7Xo;VfE]A-}Xowg:' >O'kӍP%W/Ge4RqʗeRGNɊyx\]L{F3[<_6{e+Nr]fG __bݪg>wCj+bTQ:wenӄ/G&*qBo5ceע)x5~Hb~J7=5@HGOUSӽDߧh4S@f//mo®Yz}TT8~VqQymk|hkd=ωƍΓz]6i V`h4jZH)+4@d4n[zKc%ShSϟ>Yq83sbd3U2]'ےav9W>.}*;E\ޤ_{w:EF "x=oց2j|'}1W:Rn_no3nt7;d7L4ԸyyS![ȴ\uvcJVPiSfO`ޞO1oIX Ԕ3Zmy jP+XM쎯ۚ%Ώn[&̯Ǔ3:2_\Q.{ G149O3MF 2%7.:n4ㄭM@]s nf>z_&uaK1Sifgs7 peM2~l:k f>^}+\cP\Ш REsL՟m']7]F©hfԩo3S:E9 Qmy|ohRfq*!=\=9O~MLXھ_7KE;x;|i2~e^i:`SэfҊ턧&*cQs^LRm0{(|W6yͼP6:Ϙ?XiX.0J̈]8.|yma10g_>9nY8-;iDxY ^mF?siSHi 4gP`0%1 dX@KVRbVl!k[`P;9<,Csj]zeuuzNCkvLi'/oi|}w*!VN~lq 0~qЊbc??p!=nڴDJ^~P'WZ5:߳T~qIz/UlD꼂^M~ynPN WWKu4mHڧWigoыˏdc'~|j'Heݤ~;e>N[=^ͬj\&N]R'5^lT(ujMج;&/>}iѳ7q٠P}?]dx 0/E kJCT̓OR4 =;K߯ziƼ;e]8[+if}:NWl|]R&֭Z0l{څ˵߶|};_xQ¾у;hXl^U7jh}7Y[]YuTl ۯZӺM{R'_MR?ԯ[om3G_h)qRsc.SwT'Ιգ*,O73;JU~ѭ0]Bdj`⼭gz3L{~6gf Sqj؟_k"5|u]FTMN^˼O/17Vu駗|S)X/nWC&La}em^f3"5 6_On=롎bL&Wm|#!8txIN}K⟓MEkrd~.aY:WfPv _0YL5Tʣ?msLoNd2MzO225oJٷ.n̡;쌧M6:ʪbrvT \zeo R㫤חK=/zSZ?ΥZPN:WQj̇իaXX^SJMP?պq.Y;n2mH,:W~ԥCů_]!4*H򹾲6^Z=#R,>9BtM:w޻~ԖD-ݯuՁgvzL*M'Jjj1I}_Ju{9O|Yu½>kn-v2s_>J?YSʼ[u͟`2miZ u~_1e@!rAe#VʊnNP3:"n;? %+m draVɧE?yË|>wYDgvkH,kn$(X*^_Yf]֪$k,)jyF%bLqTT׾J7nt*5oY4=֣zxm1]u lVA-ƬL߹C>\ƚh;Z}1!mYbU԰Un+vؓDmZfiXdkܶe9 9U䰸mzQ_{Y.+VGg7R. UnZ]r@uf2mSS=2.uk~^LuK9KރŶWXARu*j[׳f8FXv<,}awj# VUrrz^Jح%?Spo?FꎷVLָ;ql7ݘA7 Ӵ\޶WٞzzxuzMXEa'~ӞҳUICU*ftliMuY:BkisC49k,-5:CÛkZNgYōD A@O{wH?DD7n|nKh-h4`2 5cgqs{7O3)+T$ZOUSe/Gx3kSno[ۘ9#L! Ole I}j6 ^m̹-A R8$tĹ^>͘Mb))^7޻yL+YU_𽾲8__e,jnދIN70`ZSR3mNu-m~_:J?4{Yk=fGWԸyyS2$4}^h[; BNMV @KVRbbW~&\NizԎ)M}Y>pֆqW-uO"x 7J$: }|?ِ`rL|P͊%x|>yx#?|RL~JKv䣧ղ0 %>ë_# ?F1@~c# ?F1@~c# ?F1@~c# ?F1@~c# ?F1@~c# ?DW|1p!֭K%\b᳀g@,00Jg~=.=gJg\ p!p!p!p!.= ;VU111ڻw;89sATpTX*T| IIIZj,Y׫PU^Ce˖UDDʕ+O%!INNٳgumذAC԰ak^W^DAA|,1Z(B[}X@bvTBl%44{7o|͚5KQQٳZlRJQ9$;vL?ϟCkU"22GSIDd+Nj+Ʃl Mȇ=^}5H}ݪY&e曎Æ U:u@"/ ʆ&#3f7|#G]vT K/wշo_1!j?kݺO<c'XP64={ǔ)SH?~cT 9wƎ{' _3fhϞ=4i'$$DO=F3? 7\O\Gƍ5w~zVh\Z-t{t:}It2ζ>{g5m.KUXxOr=@YjΜ9#/t\#p9rׯnMuz|F*q o'幀b 6pj~u = gkT|=Q%i^jV*oksTbtTZy$bQ4kz{5Pbz[i̓oetF/k`~a^=\w.f:R>~:`LS x9uZ 1[߼k.G>| q tE[n{r֭kF5kTbbxc5)%m/:[}.<\L.K5=_j.XWl^URP܀y.Y]F"(}lwtPsIOo-/#p@w>C岬lE^ب=+w\_rnomYSKMaYygUv+v@u.S:S뛇U5jh\ArMӦt_yЗKիWw~K}PX~֎3W_sr%5]O h"gIK!T%{h. \-\yڷ=$3Jr$9)eR=h\ _-*[38ݶ]^XrZ Ǽ)#usCu_]( v fYVKʢX=MhMgIݮiM>֥k]gb}ޔM6 :p@h~^Vi߳gf~EW]{^fc;waЭ"B ;V*t&%K8d:z>ڻ-A{ӟG7V/k<[O@\Qzz4=1RemO߫\zs\{D^.Vjw_T w.Xٖ}?+*YuuݸB=Oe}}Ub4 DEE)..1Abl.={t\jUGhj˜jPhǦ#/5j-6-8N^WX (J5MORMrVzޯ*-YS*QwvT92hF VӪoG^iwyTNӘ-W_WD*^-|krBکizpHأ$|6uwM[meNuo߯URp#-Zu;;ٖuDzojUVޗJ.9v{}_߼r >Ir 5{5h@k׮U֭lΗq{{>}:gDUY/@s٢?VT7,Q'4䭥wpZnf}v6o8!5,e߲S?}pE5^w=8Dm%K0ҭ!SemH_>G;C"ն)%h][%o*}}BTw=/_`{!E7Bޣqo;ͦ:#eYKJ~Լ#q?o^հaCǽ)rM'JS p\(@8ة/ M+11&+G˳y*TH/飪U:?_@.8v+7B3ݠ@ɓu-լY3*iQmm?J$:{gdb߅q*"Iz׵{nUX1Oy9GSNIiryH:{q\ޤI*@_6Էo_͛7Owyg U̟?__ r;9Ur[:X~}* mfX /ُ{oծ]P W Vtt-J@;y̙cq:uwuw(88JAd>0N~Tvm*:@gn9#߿BCC({S~'uuR! OX김lh;n[J:{ TBl%4djՔ)SuV\~3T:t@EFFw* Tl%٩kȆ=@~zwԵkW?۸q.\~:FK,(|h-π|=>3gtaǾڠA}uQ5RPw@o# |) R%4&&F{ӱcGu\|-<;@xj<܅ (̵  s =#<4V\ @="8k/w=v5tsЯ#sC-L6@/??zH=׻.% i?]ހ?%Bp]zq/;GwݗހQ=  (@xjl ;8t~޵ Y;'ww.OA`F n)88}F{sv3Q#,`v >wȝt ރ`7&7^B?@|?WXFi@pm]쩇d<2(iT,Fy>r=;{{~z(F9q_#kc`b#C@r=?C4.x4*~,*= cPc# ?F1@_촟$BIENDB`DisplayCAL-3.1.0.0/screenshots/DisplayCAL-screenshot-GNOME-edit-testchart-thumb.png0000644000076500000000000004534312647526537027574 0ustar devwheel00000000000000PNG  IHDR}_,XtEXtSoftwareAdobe ImageReadyqe<JIDATxygT}}}M6O%Q'%Όvfgg=$138Hq]cY0b 5 6؁ݝCitPIfwUy~[o}[Kz>~a6anqx2qx<v}G}xQ(_|?K;|.X=ŋ >  5'GMϴ:]3{,x!>ݲԢL$0@|r&ep9GH^7wdAFw^㳑^ssi-˪D3cb#}xb0*Ba)C0ٖ(Ϡv.ef}>v j3NQe u:Bϟh6L>O˟`-Xeugïp0 ׵`tCvIr)\0nэiʥT,Dq*[_#Yh@n]t<,5( *?vgg(0ɴO9*cnV" 2Ogi-a2 6-)#!qSG33ћAZ#ǨR)3wi֢sO,XiwB(>WQ{kC]m,<+ c+gs%Zf3T][aXa« Qޠ%^[VU*5#"W֪L&ݹsL 3ww(jԫ,SӅeUMJTlJƎݼ}V˔fŗ0ewT,>%qnT6@k Uj56 vMǗ}L,61H?T(Tj)L~2t:C HPB[o"M7i>{e` cmuV׋Sli>꺘n8:;%LskFBJVG48;/A?̙XTlϳ$?Y|eu]F<0oN!ů"= "R= G<$qZ{< oy5u#cEг b kY#DEv[]˻7̰C4u96,r׃uja8S݋5h?gBp|y΃\&gnޅ>{%#wE6hV#% du;7]i5JEĨN%$TknّORPw)pN8ҕj8|5YToDтժjE\ӕLR=B-ϰZoQ.c`Xj%( f^__WqCTI>Oպ J̿("xr oUVy}LZ>Z.Q8s%(֘Jb=wkTo4ȁ4;Aߺ'jS|&d~,M&3 C^cBjC>s`.-~LG}roo BҔf~s& H.T5$~q*2*.&T3Ȓ+>fxtfh0(LQ,u^wKԙs4M=t-aӔP{GZAGS4d{rK s|F٥N6ߣtaP"{د%zstMV'6* X ^/,NݛWL=4GIZ} C$F)KֈC"0OsY*C3!w=6>FJU)?[>8G:7D^LoyJLLCCCfa||f_\0Yc@pŒL+bm&K, ( 92:kd 2FX⋔6t|jJfYy $ iqޟNItJBdQ<^yE4EM( ·LTr9Fmᚍ8N<ɩ{CCî xY~ٳHO+˛ U0WZ߫ oGd(DR ~~W=~0@:owBއ.Lo}Я"oMw{PN$:&r4=c4LQ+k{#IiOtpbKMhW+ 9C٥uKa:T2e~ENEr;^ J-%nON(0F{8?~ b:Yۢ)G=lvp=G /& BAY?@}THPU;i{^CmV3쭎ī31&gSQ&3'ڧWhޢ^ԃ؞N#ʎj:HoʚDZJl6lG>"4>:ʄa{sYmLx |{tly6:}'Tf{Xyu-4$gt)&JWlz>?,07|X*G#92`'!r "ո~`@֥HRl3ì%*$mɣt=DPP[=\,U[cdJJ *kdD( 6A| 5Tl&ցd۩-/RLpz2<5kE[Xg':Lwec0Tl EUwp`lկ#h {XThF"LM Y 5r_CM>m*wZt]JSٺ {g:I~V/M%ѣ415&۳ )O HX3DXNt́^ؔx|5[ ( L [$]{3ȩ()ӧBf_9 m:rSϐE`f1O&ZDxl*&0NvRg|&.MJ"l|LޏOǧd潍o[̳\!/ ?yz ~M`H ZȴY^+f|a ,nh[g-9I~נ5]0 mSّFN'< ʺa^īgL3H`ȍyk:] `2 Y$}y>sڨw C٥.{M1ETeb8N<#]G)` {C[S-Mķ1lP톮-o :'7Dό :czm;$H=dm)(ܐD$Ɔz"baAK)w)ALr1 0d-lF ~ p-}D$9 &K$ auimHAZJ-(H:FbqS+L C=*  Gh\2t$\ےHş'"CnFa:pM=uMS]&r8xvldv O߼vfWYLiZVQ2'ԡrNLO‚ Y5f ,y9D7?{Youu%ptz )Z.ӕeƋP9;Lx5eIZZZT2)abcb,-.SmuR Q03OZaf,F@tseiqmG+v%,њ)!hZ4|VqkDO<{Ih`h6OT.Q<$Q P4T&/!l&ǚƄc q !9& i:[cPѨIG"L?[,ULFO|( )9Hnx"|k>GEuh hRh6Y2cIЀ@hHB8H0@B4(JŲ`"JUѤJ"jSR%N|ad{ȐSsS}۔K)wy$gd0j_v%M\H:}zԟ+BT))ߐʦ/TSY m:!H|0u"!:Lm*75SgH;"m(nKJMPJBx3K# 7fBJ_Maޠ~gv2S<9D-同74R7 !ʍZN.$a[L ;Q\c>tF-) .opT4o?Ba}k)1c~M zz,Sl#&<`d9 Qu,Q\dWT:e젶 uT6MkW;ܶc8J]pU)A5pjS{#W=z>k6iJuY:*Ffgҍs.2A7̆F U5/֙^512Ry!may`4 Q *v찮-/з q#&ǝYT%e3e3|OTLNT;YU u8klPAFWKv_=4q89&ՠJ-ȏO4, ݟ=OrQx, KsCQZY-+r_xpcS4s6 d33_yJk&9Hl")kPݧ2>C-cDAʔ*ia`$'2u[@q^}4ց.Mu7NS3Q[}ֿ~fT"!.IkqވN10/" GtRő[!xwd ]]2:;{io8}(?"| N)Jx_Ǒ08CFI]<@6J)Xy`$wH\*M5}JUku-xH@m9MQ}(& ?k=A9q RZgMxP% OI k{]7=1Yɩ!Cű*2EnUjğD=FU~M$$$> 7 Sn|Amv+5ZYijr խu/F*0 >C[/Q%[MJg"*:JKd<Phܛ/0> u>G"vm :urV?7oolON4Gz*fS L+@T>'sezwYZ+]#Ï(k446)۳,fKC2hGk"Dlˀ2 ӠoΜ%j9Juaa"P }r]5|Du(J|x?>CZ\.Ee=k1$%#tFf++b_=05uc4u(E)7 cCB482J&KEhi}z*R yG ő?IRLD\m)Z^^_._ȢXu m:%$! AԚDp3ALg]vG&'2P TfP kn{ 5yߧEf@X4IA3J9P&ȧ5$puf)q-\&] FÇ bI[MCn/{@쏛F)@=8LE~^ \66I#1>##lI #2G@w!E@i˩!c=' ׄ^~ew>wvz ~XA ` ̝S0߶\3l(G'LQ 9u#(^~1l&mCOK,D#D#Mَ T'_F܁pY ;PD/Yv1BV@5opUHi6c#%yQx; Iؼ^X?m¶?=R֣kۮ,f:Dt:9~+ "Rt4'p7lu rnX<ᖑ#F z[*@gT]k&_ h!Cj'b}ӵ\= C*鴽zOLYU?ncZ=!0NqDthk^bGHh0$>Ǔ'xnM[z{#lx6M'ʅ*NgU)`K];ɘLrgGJℂHрBJ# ;ZIƉS( /.YZ+i``Z2GxW)IId`>\0!wmS1 Ý:-PCZMFٹ{Ųp$Msr`4A*1|.pepWKʄ_56yj5ށQ}1>Z8v' T E62a:}3HtJ~}?DgĒDg8B*F4dnaQL`B|@b_Uʱ&^BfMjHke!Hs,-3[E~ucdIoh ?.3}v5MDz XT+!'R+(X.b}c4?sdfJA'N1qlnܼН[KJkQ  -mX^&a@LAJ|Y2[2a] BcV @6/2C( , qKt5Nadfgf;Nz@4HɎCxrl舛\RȂHQ aR&.[T~ u ӌ,f=<>CgbҨ&X8e$cl ]C{]g..8Ts9$$߆1ٓͶ 9y4 sWy!,@<8p {@:a}q8yhfND`iyghhR 9N:aՎlpicIɞr\`JAh7I$.8M闄=1 FaR1L5p>?0;uWuHq#~EMR~P*UwX_/7ökȯ2ڈzw![,5[@MP2r(% pQmJ'M!5˦į@)_2)WAŒ]6GQ"Tf_gTcG'61`;бSʯaŸ_ӛṖ=tJjn^>~ #4:R}Ȥ3"(XXXVd < .!{S_% *.65jeZb(N_eQ_[UaFt]en[X`tu[Qvn0㍏yfݾ}ҙs̶ZU'doFggݠGw(tFS i&&ewnݤ@VV[41yTxԣ#t~ZJEP+gKz.0B\ťe)vDFJCB 6dU.c"Iۄi1#NvA:g8jCNYHGãj2X)'!fDU`Di&bMq/]$cu;Jch&]5 q#HWIl=iADYHk"b*"/3==-CHhT!4RW_!  :uBhone7gs9t+}h$4 *t5ZH>6͆k@]$Cʚ3qגR((cԞ }#(:ԦKdl9OCUɇWIߪn8}pvsuIA+$󀧳p;GVk4}m+ 4&tCSe+ݧ@=B;d/9P_f kv(TQ`RˤkJ{@q,s%K}@t 0Qp0"̥S(gJJzOk:b8]Zq5edN.ftBk{P5N]I|Nv/qkѲx9E@=_'[rh5Ʀ#=` ?A!&uKGޢ 3JxcjƨeXPnCڴQ1,'Fum/y5B|u@4 |K2nʱh# ߤT;c,e1:P4' l"-.;I2?CO`Ssfghi,k2h8(| B_Ka`Px>zχUdH#MfptFb|}"JeWoibhvfN%-Nƥ]%?\ԹW [Ub5jml%WK2:[, uWOwW;lS7r d!+FzfȵXrvoR,߾қn;&cn2mßx戠A`߾z vH6}WSzM KW!GL|̠7nߥcǤp|>LJ?vMO3&1s>eV{HQ<{~cJ_:%ca)CHϷTٗͮ!s! (ZCG?.ͯլWI3yRW_DͽC(t iZuLj)&++h0)fef5M#Gm'2Ya.:yd3ij>АCJN+jH+֘O>Fw"[/>G0/78DH&4ʒ@>~{ey`ࠌ;+󢱚9=<<"#ΦzTeB6C9iŽ#*nY2з-9tuP g?J:E 3[DU& ĸyHC#Ru@. _8%Ha|r 2QS T~5@Nڼ_WޡBw__8ͥ|8xB:AU4E!: Pdžvـxd[8VZ`o6b `~pQ]ixǶ6 -ҖbF}}{H=< ړ8h=#7 n^U!5p!K˺aZF5wn =5d6Jx} }`<-R?]I 9T_Q6 [vʔo~)_:nIL>~ؖom CE_@{ $$e?3S @) "K2ӓwT<$IRxAA+/Q ?ZMA)(YZ$͚mX\[X2!D ) H!d%;Қd'A;gr@:t㏤QFL3AZ]R~`N9^j"gS:AAiQ~^i}M^J%EcMo= ƛ1|:>~Cʣ`Q1G%yH3 D@չClԨZkP>2 ʴw$ru, zK?][şo%*ma&|,9$޹+}-gB-|%,.$] ÔIh=VF&k0` w魖ڟ8*MsAʡUEOIީSuTH< DIƹ`ymblBRO:P(Oerx&ZR掌m:,"|ǎʵ[Ylwj@Y 4#m461~^of3TV3C#$씱l66-jY= w^GPfZ77;P# R1@ 4FgySO?4tC[ zqN7Z nm Wb@'wT~L442sr%yșa?jfMY;Z˩U.S ~I>tԕŪ^XNus+ŖK߫|:jH<>(R h]4::y8SvhݾN/2(R^rH"NRJ:ή~;vBM'פU@b#WK-N p? OBPDJf,p Hk4{Dq߃pAv@?M8-y#c|6ᖩRogQ03G0o6Jɇ(gj7C@ /S5qo.@`4 A:$}ҫĔ&}G ԑ ??Qz(裏sZG2?G'?cK@Q}' )1/-S}#}I7_2}ujt z`ViES;}}:ULŇOtwf|^Lr9.^~w;46|L3eG]!CMt52ȣql'l)!Rj<fC(HRפ0ZT-TF%:s{<]fdHD&ƃEX# S'RZ 2)mt2ѣc'NP8k*b}Tg% %}inN<ɌlJ/XP=l|YO̩f- /I][[]J0,`F4=}ughl3a#/hA,/@sg3.3IlA"j:Lj(2D(ܙK-z21e%V^!`Ȱ[DJ5yY~L='0T& ̄m r4r@ɔsa% SLG_coUzK KZxu1$60ןIz^njjT?Q(= tf/qBЖ:,n?} =PT/ 'J;v {.'a x16!QOHUͻ^mmoxTv*{\#Tta:睱c=F5~4g&L ꉷnYɖ1]MR=B\ow0]v<]03R`Z@ʰ<~`1*kSRY2lFf(MP2u"H6I,UD֖(fAZ!\J볟Gfc_7oSP<*f55~0R>iӈTDG6\mHXXameVe ,iTcmưT҉ln@TL nzE./f$(m|Ӕw H4LJ|$Ƭյu1-κ/ ; t"!3IK|!D8XD 9pؼh?, !/*_f"_[o1elkR,g⪲ ,Gh=&VvYr)2a, ܹ2R }){Kyx߹Of ,wnRRӧO 'BÃb&'F֝䳣=8NEW}AClcȍf铏?#ǧU^udS.(*&4:\l@ Bbeqnޛ%*doq}:21AHf)6h~B8-/@.Q@{9?|=6- gW^|&!Q̓ 5NAP~A2 ?V>a!5#R;dJ?SSGZYU€h@ߠH&OH.k. K5G3jilxH Q1]j5b>x||BֆW_dON9ui;U7떫u0ib9@3&F^f- J!dNNJ%`!Og< ҔI/S t"*5ec|Mdi[&$mWhi5Bꌿs/Y!s,-,pL䠧@h vK#}V||zDEeņ3 ҍ=yZlɁAta#G-]EzαFP<uϥQ ӧ> Lm(7I5/AtHbDuWUʮtr$k[}n  PHlz#R)="wB[giUtdrBr^][=SAw7rpZXx6׭B8խ^\=q293 5xfsB˧?U lR2.HzyVwj[Ms>g$ I]5#;v wke1 4AO ,=j{ hmoy& Ii7gUO.]G?-U8MgзKH( \ ]ۦ?ߥѭ럐JK-mww sw9wJx^}mqRץDE|gAizL,5%ywiӿ]w!_(Nѯ\Vcw Dn\ZQQ(M|n (=ywg{oߡKoF}.ݼBԽYC CUj]l6 wuRORp0~ߧŲ]3J~E_%(ijPj-'RH!DPJ*e$/2';TetbRBZFƮXgs2YTqb(L)\ }34~q@%y[`գY'Y8M@'G8P.gGd|t1m;%BvEf~*IjY]_{d]OB vCK (Ј42:N˔- ?fiy(/Hc#t]z?ADD(YU+tm<}k<>O=sRjסNjU%`.,.]y+N o#U #B6&kk8kYl T4 u&67Tju7k%Z^]'3uJ4u*ץ KKԶ z-G?)90A?+=)X9:/үmđ}! (?B'XEtcνϕ;SiO_n TًRr*k@*K/*?ʙ赣k:?Eު ?*t+3 jG@᝶*clbfS[Q>:xq~9{3s?yϰ&L9- ;|X) zndn5C-Ci}b{zA 5@&l~;Ш"a0hRTEcy#`S^{: HYvӌ Q}c'N^x%[ÿⴶ#3I:" 7::ܕw؉b0-qs~qFuXoFxerj;%`U-/Mi~SNo>}ͩC[y B?_Do bWE'iZ,KQ0. I2ҕ_|(ݽsK  ٓOHoexNFRBܹpǦC{yAݽ{9:&I)nk:uW[7cHcRS$涪Bc|f-^h:CBSTc&ܥ=6aJc\V?^5hIz-gI_OaS1˗]Ml(zI<Y"ɓW=g, zI RGF W=ٟeW> W͙ ty8fߗqȠRup|l.M:7[_ݵS_7 ۬:U G+Hsd#t`QTht|ΝWjAqm1EʥwcijO lc]=Ku)fAR8HV2" F1J!,`FP]qAP,c )<0 ?kvv6]g2ytKd^sח:=Ogl]]/?@ӴwzθXP$J 'ȄXR' ?DqNoEȝEA3Zoj;{>T0#b9vښ (I͗J| Ԛ44:N-RVp,Iok֖G?9:JJf**Nϟ1n`SA408Dt^! 勯P>^ǦcL> :q- f')S&bE-/w_('  `pQL`@Nmz,ݺ{,cĞbKߢpLNʬ0u}0s15u)@YGv߭GeYGd'vAC \ѥ۳xs:.Ź`<3"w˘ݴN{} Etl*ŲE;?Iى.HYq}g_ȞyO=C=t>|J\Y^(4CISD,S sɩDKr#*x,o"o`T١27E 2""j'^w;`L6<,7a9??/L~iO#c8{& j~Ƀ Pik&8\|Ƀ 0C߸Edr(]g샼A#AT]e;V =ݙeTNLOK#S$gpdD|dO:dQ^&?@'! ']3%w,tfd Aü SϰגݲXu$I>(S~0(?(;1іhc\Kpe"T 3 Dg?CPa"Yk+ҙdURqM}!;m_'KoׯG2N-bbZDt}K-͹Ѹ'= J8?QG{ꃰCo-_fܻG2זhfaE$K/uzѾHfS_cՕ' gz+" ţu[4K8RRUcu702W`PjrY:2e9۷C? f/2!>U8w)§X,ILAExĮ<Ut*6-({~%wҔ;3">Ug=&>q^*[L:Օ>'h=N=Y]u~_[*mgJgWc;2 eeoC;F)BK2s}l Ǘd?& 4  T6-+Ugl;p D|W6dr _ HHHA]Dh3!kU GMTH!q#2ca2רl;Ŗ|>7S4.J/JΚRP}G3J:Nqe pM0w2Ҟ|nI~(A!?`۠ mv)Z^\&ۄ$ɰQyHkcuju:JrU[  B9BC-Ui8JAh>x}YP11c8;.kaZ)i(=:~$JDkʤJei{(+tY2Y =+]ڏGmO 17i $X+VHe]c 41>IUwTVl) Jed,LbS%(⇀S2 Jf )ԥ˗Y۔y=5|}?y] LF6.&;-$W ^T2LHDB ^L^P^8m'*loB~P,gAhqq M=HP$)O`2cAr{Il'#@lN 14}hF`€;vaD/|UoztF. נC} &߄N{ (yx|Wu!zJ"0@Xwq'dtU3 w`w몳s>0rxx 0P_IENDB`DisplayCAL-3.1.0.0/screenshots/DisplayCAL-screenshot-GNOME-edit-testchart.png0000644000076500000000000037262712647526537026467 0ustar devwheel00000000000000PNG  IHDR |tEXtSoftwareAdobe ImageReadyqe<9IDATx|On( N@Tā믢ƽpVTĽ' 2ĉ (2d]o': ym˓D$ DDDDDDDDDT<DDDDDDDDD@""""""""8 Qc(1HDDDDDDDD$""""""""c 1DDDDDDDDDq@""""""""8 Qc(1HDDDDDDDD$""""""""c 1DDDDDDDDDq@""""""""8 Qc(1HDDDDDDDD$""""""""cj,A8IQH.gm{G/\T1gR!qj SC=7dO^4V˖YoT*/DDDDDDDGPh5jxQpE~/C@`3H/ ן4j#"""""Rf"0D"yƋ)K EEV`FQcP3ڵ j0GDDDDDDBUuxCfꧪgxA@jƨSz|)p`1̓ĩDDDDDDt%T`P޺q$ 70x&FVSnK+".\n|>(1CZf *Uliic4ZIǢs 5 RcA .$I+Ib+nZgm F N- m/lGB&!jZerZUVHNJVCiYoۆ͛ 0uy%5\N͍d~!ނjT ͤOk{eA$ks<2ݤOA!""":DQy,UcO `O^LML2 B'}GEeZ[.8o鿑+ J33ښ5G߿aÇ .b $1hy3^ Zv 5_dn\K /! S} ^~IY-RGL!6TӖÒI[=>! * `t#I_:# m+:j ^~YAW/-IRO PEX^ZiǹyZzXʃrEf8UӴ9U۞Fu}סȟKƍ)[0yX^>)i0 a a].e֘mI'-7M}46{c+tGl©WmӠ _>Tr"'YC4c/iQZvڀvx7k pgO:tIK>V [zL pˋ.O>Ck"EtHrK}w16ԩ8-[S*TAk);1|@dI`3ov\J`PYSF|i>ʍgtw/D'^}rCҍKt7>yv;Fb OWdž 1TylʼKƱoe;"CEɺ?0ϰm_gn{n_ku|d!_*%:S?ÍOǮ Q 5F+xf8.cA ~`N:$vm( רQSh7`` 쮚)iB|h<Ғi/a9a:R+0] 2xD KpUs-mWTCm[7>2तyw?6x*3TH$[Z^W>y}ZD5LCpۊU>%E ;ESe7vY:؋Bj*]V?╴B펖o/L9 =K@]㬬؁NW?Z4s$իQ˦u R|ty띸LS"5YbVr@A:gjVeTuE|H~TzbC^;* ǦŻF\\jmj-۬i`6t8WEY^㩂(WCbU0S_w1yXחUKnXLd$SiOB1bˣ" s2_FPU*Zv:=nƄX9*m mYӶE#4xU!?RMDDDԈƠ D (.'%(ѕ~< u[ۼxfOtIB{St`4k΄uhn9؛5aή~6;\-h>ӈ2!  I*7K4NfKU+2qɄwq뎩_aT[UEW{VSui(př}ʢx#~b fd90w;G F,Ca;>AFLԍ܁aǢrݣx 㿨ާD yM Ѫ v`ן`oۡ$\B[#-P?\(\8[.xp7cڣM9P)]a܄!G~B< =S (eٵ Xb+\ >5rYUHb T?p3J=0 N[@af2v-8k,~]LջQan2EI@{]@E W\ZZG3!,ɍ=Xd|2w'$BC f R9y[R%ό}pрo~\I59Uf9 88K d'ʷKz c +fO{Ø$o!21xh~mLp ZA?I >[LĉX? RhR3qP-z2f)Oݍ?+~x1|}A RMձܖWөVvy&t3HDDDM,BYD Bj=8 RtUQ3no1c]pN7+ZU\/iZiL&0hQSZV5L>a:X&NՋkW4HKU B [^r)J#RPP-( Ȑ4%ۼǩ7<Cxo>13I.uSpTȉ§](c9YUQ0/Dm2x7ԊpU'ĉW y_l/6#EFyt1Yq<8s ?=nU)$U7~hona Ic:ZKE> gLDd976,KkПV d"IP˂\ ߘW^۹jT/vil̩Gxrt~i%hByE F\U·MS?2sA||| H SVP_j&ҲڠtNx&ʷVdt͂{N15S5>ozUiЪ/.hU$ڐ܁Ô^y 6=ۍ 5*NS۔[ } :zhJunp,W+]U^,Y_6WcR94}cFi˂~7n"?DDDc0$:_z- @eDž>/FtiVrѲl;N{m-*p괥RI/^63׿wRhiUB?$i5Tq6|%?<r: lGJ;N|.BZxQ|WV+ +9i 䵺@Pj7=>Gī׷Ca@W-lcB?9 xå pͰ@pIO?K#;QpRdԳ.τr HJJťoaNJ9~z8ҺKfC46zH0 O)af]L5e+zY(UHm-j혀f9ir*NiN8p|8ыN_7ʠ[⨝Mˁ!˦M &ۺyuAjs|ru=P^F`*~)Arb"Gi9p#xyÄkRχ g?z<,nkOi-鬒z=>[R:MS~>[r;Mo߃Sy:t=l+7=2*܊/PoX4uLY^5\A9v}xmCF㥑tҙț+| nV{sʗˋ:*[^?1 ?1povϐ0j5*Ʊikx01Ht5K+|$Z|+Ż+Y=̵6DJ3% V͠SO WԴ3?~Z}qU9>X+DJ@2s*uN$$d7xhSc VP -@պZ^oK}Z4/,+imp/%?:屦pioJMq—A4 6pIPV*ذ b$PjcvH:NThE:o}wzVL{/~$[O]GNȍRIn$$՝a._o=CGோ&^g zD>I*cF`D{e6=>֯F{_u-Y6K! z\H?DTɣ)g Q"*=o\QsVW@o]2U!Wxƙxm=8tl\pU&:;er|o+@oA.ƪcH2 gh[1lFJf t9 _{ 7?/#O.-9emd䩛][ʼnJb~+\[VqnI E+"""#j2 Ӏ#^VC/o [mΰ#_ks kG:B'oC)Vel-kII  9-uĴ0O)~=TZ w{ÚdTA44 <*Wj+l(@ĚU/B/N)JCU1bRMѨ`֖a#sqiк0_?$ǐv圕c>I Qل6y;%Pu)<t7mֺ[ke|eI(38IUsifR.FIir صGrщYڵ0cE8t>;w<-WƗ;B|7)02׫PU;}j X T^ߊً`1`.YNE%)x춏kٗ'%౗FBxku>9DTU`uNnjl߾Kpiv:zwNڬ_Z[<(QvJJBeڞ|awABVrlpȫ9J;<|(tݖB&jr'"""j._F@j*E j5,z3SAŌ'k69lhNnLH{jnVUSauvbʐi( VL_\!*)*#r=p ߼;LE9^eթhc%@"IWC-% ̺i=c# w@-h e%=}0g ; .zf ggḾ>+Lf=l|uG Cw ;./HLr˕Y/|7<;~gb]3bZHM$k᷌@ڮ@m6z*CYkq;m'`jF '܄fjj[E86 f v ec&yPs75LqN %Peٳ@cBןDޕ}!֔ & HJR߉Zhr>r2=t`> Ӆ=.'N7_ _.-_oEROh4rH:.W&;*soE~1/e"pA\>t9h ""ipmYhprۯL Wy[L#N߭$dYIB?DDD$ƥ D8W #\kM0j)0 Pvu[=6+Z{=.m`6yjX,ښ^*iXȰgKNt:QRZ)bZǟp|tJKæ`{Ny!_SOJ@W:#=XYBZsKT= ~n Ha׵V ,~t^Q ʃ%܍w7 V p&(u-gKM8&9_7xWi.nx|tVؑ K0a0!1);s/y)®cG]NӺ4bY(3M=l%7\^- fQ8n"+AdIxFx5@Y!!шZ؊c抳0 oyoZU55 Y8Ѹk ՗;ďCrV$3NDhĺMDF-7LI 9 `T~֯f'Nw]թUӖ{_騺bRU_. f>CP"DDDԈ~ D8XkhO X,,#a?>OAV]`b.|R =6oނr>͛FM:8FҴX_p\zjON2 ]زr[7{˥9 :9=2::i&?3KQRV ,=Ѷ K|O&my"4&჻ejɉj԰Tעwӗxv#E6証a-֯tj5"v;O; ;~cp@ wp r*6bDtj" #EXg̘2vW:ZiYާكD\͕ ˽zЋ^e7.jߪT%]fXH,&ʓp9ҳ9,~lN蝫ra Ye{e 1Es˝FB TEJ^h+6l-BV0+1^WSfc>3e>K^)1LmN 2QEUAv{=GZє:CL YA.|n'TuLF`Z$EQ rSFDncnೝ.=W v3 >>#"y*C{f|\"I:_rw3PVKhF@jYN[ Zi*4QJwLgV AF$A3E. J<*NyUs}kבhǹ.G.c{Iʬ6ʦ* elj_28P?Y"[%54'A5ǰǟy*~ M R+U7.AZQŠ/±T+45iŮ6$\zx+I%I^^. >.ɨ| *| O@ܯO+jYuk@b.#Es>@եCZUW=GqbSOT>x<@mnh$X}ȃ?:,苖lFBbt:yV {apTu3-x'nWcS6"\' w`Xbá6`AQ~ * Ԥ0@M]`jQK5j,i_{T}&00ZzJZF nGȴFaO(5AڳErn6Ê7iӱʶBDDDD}YDM7rCJ@MY¤֠{5ִm ~~(u^AZF A'"OO"c(FIvnC *rZ6xFK`0J@llDQ Q~OL`ӆԵRRӠj"ҾqZ Nvڅ}ȿ:''DD41HDYLnۮI!ьv;b(iA''DD4fDD1;v$Ui̞ OO"B @"5ke@t M&|~"OO"Ic(n@xx/!"O"b@DDM цgO1xG!͛6 N+¢_so lG{=֡L_E? /˙AS`N&;P{6a=8s`_XGT@#Z^'B,6o{ᅬOP2u!dn\ k ݇>6z_}>eC5k}xʟ""+ ƈ{S(7{cmdAⳉ1yeG2ˍe?4+l|3$x7vo߾Oz3 8lqlo=y' kn{N[?D[). 3ppW5A Op^Xn_gra+w⚪>OY.:O NiP`׬?7 '}Up>Ó{!+^{bVX&ބZ&~_? "Ɓ@".2w!I a"O_be]: 7Vr?|V5 S~Xv v8㞇0u 9uGxV.阫Ɲ5Ȼ  }{WF78 ƛ/Op隷|c1f:m_˷!ߦT_5}bM&SngډPh=Ҷ+|7$"J9G.~~YXi-}9ޘkE;_-q>cQo_ÌE밣-lFこjǶ%:vI[oHށ_Z%>tϬDoQaMpc^wP4ױ?5DBJ{KKaMnҥXR)@O>Nn jP{.)>,L}~Zt+z~X҇ރgȃ&tc vX ^cg?D֋%hh":c:nl|)OoFP5 wT5W~q_ĚNpcg̷>~ .Zs"l^MΈyV-^ 7 NX 7a~+uw^i|xj6HBu% G3]X]oUރe_N Ol\7 /P7ؐ6t0mE˗.Z#޺Hǔ}CmZ|3Bb T%R,~]q1?#^~8gLu#Z۱i*g^;nD eRcm+BQ?1XtI U3cٍ_Ug⑻Ock"""eG nـb_g䈻0Qڜ Ne ]nxP9V,{:~BziZtG^٫W=?gAeooYnV ^^n?l+ȹYv^sԚ㍜ّE[ ;յ:5A`˴q*]75 Ir;o:w\?|wNg!S\{*;:gGT֧Uc>2y.lobIsh I^{vԶ嫺O(we!ifol?>>chmsU9czExY־/~!'}:Կ4rp ݇o}Χ.Ag<'""b$ѦW60u5:EZÏCW|36hk/MiT"[f{moށ߬HK#błCW>yQL|BkKeVh;"+p-vз{b.8;lyO38 ǶMlҝ'4Վ&\<%hn I(]mHońcݟ1oΗxhwhqgXbOɭSe}R7@wsetжbS``739y>!KnA;V֗ z.ۋ^?7tw"3chU'נ_? "DUM![/K?cN+/AE;E"odbr9gcbpJ- ݎE^Y Prj*Ч$4EZί+C5Z>؃9/?c!{!5Zt8wկ~7xc0<XgD,+Xq[#~xOGqWOљocÈ6V'?PC}:z~@mKOP7e¾!2f̞[׍uq>9<{I/ɞJ<h,ТWWJ|@N6פE~ƺ eU5PjH:zm7ݵ60-3D݈ZNi[CNOQZn|r -:/"[DDDQX<DU-qb/0KD:4}ߐ!@7k0יh%, hgfT.:9nP._朄v-{SpHfC:f/A҉*FAE,wr*|)8J㳢{#A_sW`?;1fV% Kn-вܑm۶?kA֭km}xg!+I|}7B[ ixQLxqHw1o. %UʄTPzVFߜې|\mh\7}CC(] {TmqckCܶXFԺS}֭5CshVSpꐶЫl%Ćut>< &~O_,}MDD Q,h; ݯ~&}}g hy?HŏJ[_D;c.E|}U)j[/:K3t6W5GWy?F'N´ _'L{m-oyДn/VoIlqZXe˖暫S`Ay#F\x=xB"LֹY( ̤1 qpZ&CS"0xfM]Z \tZi.%o?Gkކm렣ۑ9DuA6 q>cQ^L7V4HHvtKdh<.B [Ct_&Z 0v3axk}MDDk_h*Q(Z`6hQNՋ@ywb}a~UmYSOGbbRKKP1OpUWUV7ڽ'O#A''v>cn`Ĥ|P46oТDqj 8(IQOxj!W;r<س`.Qe!+c|- R,\"O"b@DDG!~@j:{xEQ;* roz)}IDabK1GRTM;Ҁ"Z8W,级u}AO~o?`z 00̰#99P F#%% "/-"OO"Ic( Z-[c`2,+0hJĘu\(, ^}I5a| 05ȧS#>!WήJiz˛̾mh;ZAjJқ5BIQOx 5 5r U*ue m"@*o(ѡ! """"""""_ 1DDDDDDDDDq@""""""""8 Qc(ix$ >~(u^AZF A'"OO""""j$"B .x=nXk6T8H!EnQk4H$ !! ''5a EPRRM֣SnHIM̼ٸ~-w\+Ӂݻvp_!:NIDDDDMDDQ^ܱ vCd 0h׾#6m\}HK>>icb;v$Ui̦"OO""""8(FMuHAc7S?S>8 !pA6 :.{ʀ#<%]?MDm |XhR4j{fyf%""&@WENƊKpiٍQ6,NNhƎGBټy3^ v סk_ 4,ڧE{";jQfI~?%Ӟ# W'Bo#31_}¹r8qY亼/1 `1秦"7X<wO=DGb/YC^O\7.]nee}'jXX6mތߡN <0kq{kKwlFvmY nZ6T/?}Oޭ<]V-YbM{ q-F\~\Qc^gK?M+>x:&w9^6S9޽KSΚODt0H8I)GSQĹ ]} : &^]9/s Sv+0T~}aT.;YFy&pطo_zzMQgq7ϼ#.m{HAN)}/+\^:wc Z)J"*Wܐ^(V.7KFHaꔏ܍-:~ڲ?/_p?F*A+nï}v<">el=/n@8;=Z= 2(خk߽ bVdDzv _H]NÆ &ɄDH؉u_ݹ1qoР>K?SBKVvfb,u\ 6'`sF^a,5vV{cQҵaƢuQD~vxCGVm.Q oog`(n]mX3pC\~j.ƒg|x66caD|fǷN xS~ g>`Ic E{N}?-g_z=n qKf>Ą-%` 7e!Ҡ>}ϜSy+_xWqk0>0$0㧯 ˺ttrniZ?z-߂eZ3/3;W߃Ň1rbͬIrK$<Uo/yVB "Cy0uGxV.阫Ɲ;ǡ{,yG|ވS'މ p}+qC30gיaF茡&7 P}_y$+`U76d䵢Dky?^{U=}‹W.wgm -ߊ2?B1_5;l3qy:AHm +V~!vWȽT>88greیĉ9d5Š u:wɍtalO8 ގaD~vU n'acMd=8Cnҵcmd^;nD eѶ3;NvA_1|5<C/㓿qƨPgD .YC#ЇnՀ u mpȵ}XP0hsX._^ue˻!' y>? Ț9@DD 1Bkh*N|[ԿN>ڠ!ƘNAXz"e\%gۿ%FJt`ǚu(QT7]s>ÔX o bIˍM3-]23w+ܓpHașaoeHQxw*|g&7˽ S^DJйNbs=?f||z7Џ VsE^bLŎW^7QTg8뵇zX)ͽw`&>ِ][`]6#>uy7('2ҥmMraôxn6pQ%}T|p?9#k6c>@j97}(3e I|r8ۧ2PXk…ȗgiׁ\;Y\rXvzгMl@T[=qL@v`%땻_-!pӰ뜈Wam]5<<=B'9*5Xmu2ZK?{_U}߹{'7{ Bl(j}VNj]** "VQp+Ca콓;{ι7!ɽ rpoY<<[QvAun#[rXҀVa5u> و6pgȎRIW!^+OЯ9ޕK-<1\ B$T"uf&܈;/=~ 7Wmܝ1t7R(e\5A]R9,ZQ.OhKd9wRl|kŐ;#2B#;Yr4!^8CX(^ς%N(X3\9at-ptŁ'bĊN49`ecWl\|GV.E\<8%kA؀oGRjZs;${Un7j=߭3Zѡ Or`sT ǔQQަr5PGf_smSpgs5)]eQP q]1-ۋsoڃ8ϰ8'ӑwvӫi@q˨G6nӋ~ !?Uې(B$T#qX7x>A] '8.[זƮL:Nc{`'ch >߅Jԙ uaR^tP!i)!׬rPw<\ _stېSXOF\`<* ۫pCㆹaa4x^z:/𶢶: ?s1_iXY .B央mHzR]d[#lƟ·Ww=lZp]Z-9DF |JwR"ņjLț={PXT8#W\r1Z*-9;Qے#5KmK0bmEru֓nojIe}vu9Xvf*g?Է<}WguL ^4WRLYODlz;b[qM-?O>=-m98,^Zꌝ{,SA9*؄B !C]"zlu<|elB-q/.c7D8gxb.rʎ*?C.Pqo~g w#{^v M^ J ;g/-a}/𯙷N~R$&trַHYA0!9fl՜{F@E/t"嵳)yEl4:Nt_ $:שK]NTYdz;6Lڈ—E7`dЈTW[j*ۿĂ+.ǛKlg֌Ȉ4ùi%fr|nݜu"|v8زFe"^ DH<6:(вR7ImmtvqEYKL_t@jLy}0HJ81~^z[Xn 5Yo?צ]-|x kҘwpF|p:l,*- VwSGݏtBB !CG8bgm/,TR66̈*CLFΈ GqJ0^=cI=F$Zzr~١sWbFh2 }] Oc{\X} 7=gk< g2Ʃ1A{xcۅCp*",|y0οS7V6ܽπ )V4Hª,vٸb2yʠ o.}_qʌp@3WVFL33v]!cCCXT,eENcmAHp골 h(7ҳspӯ64:aK!t2P#jov:74%.ZފӭKv͈I9 D#|sM eF"L@ն5ZIǮX~)&@Vo;ν9V@WjtMfEŏcVj4%LvQ2WǪm@rj$ mvb%]G+´IH1B%u@qmZ%o퓔4CCᥗ_9減o#Fr^Hu!5Y'pL^p fhs3065*)vW8^A>s+5:W_?,z^Y"}KJc1qAςUDSj6Uh8K^X G8'i8)y<.RrvȑbSovIcܸRYXP{SoV-^^FJ۶LL `Fޏ~^âO_QFL`7Z9?mjDދ{Edg fT.v +Slw ypiܰ%IJu!dX Gocg̒7bwnz䞃}%x?xMX[sޅB*ׯ3,;ƫCd2cg6捅dC ֖؍]=ƒWT'` w!~( 68>ϙSoZoSwMEi4R0v0dh)$İτoɿM~6٭vbF  0B{[=v$_A_,)s 1zdNW0 eP !B !@v.MfTW!<r`0v{d? |R> !BІ@B rfJ.ȇdBtLtdj XGk+K U F@(OB!p`2t#W&C@Zۻ !! "쑈\I$BNk 00B0DҌGYH_ !B9qXB!B! _$B!B!dC !B!B!: !B!BH!B!B0@B!B!B1tB!B!2B!B!aE@!En ;***h5Z*'"#--p;er ? z# &|fyB8tBHdǂ@uu BsSS8}Zbjh Zdh]] 4-cX(A~ʊs9D]m5|&B0tBH<7on{D$T!ww&N>3}QTM(*,DyE9FR/NP jz<\J eQ6E-!d0}/^tQ~jSZ^YI"PYQD9Lf$!A !rC!8F322on(GdT$d"1z=anH{}ڝP?ÛBN2{^,(h 9wspH!dH!;M<򝐐v!:&V2>@+z=OP}b]uA#HJNҟ@?$M' J` mNkM ! : !$HT! lP ddwF0;B,cHRlжBN uUt/YlL:TT{, r<H! N^L46H4v.m*͈nMzl^i-ruj]hm(3BqbB o=v~Z](7>{goǐ'Ek* >JPU οm6?o3wmfxNUVڄ-N]m6}{Y_'꟟wm>?2=`푁mL!@BN5)'hv?>zM_heÎ?Ylzߏ"O#@伿rڒ n|a28/(>Ŷ_]^o4J*l`Nv'}6]8\ƞ+䭷p[XM'(ݻ+[do] fNh:Qu_Ov=UUUcժOQ[S{ѶA,r0!C V݁u㟿 =$_8I6|A~Q H6A=\FCw#(q|u hbWWWTT(=~zm9r$ +:ymsS@C3brmj?伿rw2tWFqgJWO P)݀Jd"=J[Qw%}jF_6y6XMR ȑ<5_QQkl,ǘ!xTP4TtUWf up^b79kׯWUWaӦͰX,ذq#&N0m@|H!z.6~$(NW&?ч/W[]!aM#%qx ݃& uS. ww?ɔ!P_muG)6 ,HG-JHu(<gsxNLj)73Grw`t"gau:6iN$4m3yxco<3m'Ldaٱ:K@uuillT>׭SLA=4BW]G! : 郢 od3%/cʭ(mU:W|#f!xj5p!eƘ<_ C'P%xE!p qqx?Px<|j7*Ww;+LW6yh "bT\t\ck3(H2r`WƊ8(Bc;Âjz ZK$\z-$Kc_+W»qAT4?cN2kށ k`:c17x%1@4# N ddʁEngLf 'r3"?9O.v~Mp{7cί~ zˏƹ܌k; ?wirOwه0ⁿ諶{I`{/㍏7YJU̽f\>6ܗOV,o%Q#6ECTғ0~;3o#)Aձ/ybԻ\5n4eضrA4AO)F,:oCx7̿ fX᪩9SgKr`+qXHy+硏Syuw~?>R4Ć2E*ۂrgW[g!S[ɉC:͌63߻s1rE4ˊWކ^z {6t[_A+p[ⱏi )/ ‚ (ܱ5.D#G16,]ةFYA}|7Uhcsc{"3* P>)iEb5hb$;4Fk:<hʜi&e.Ye(r_eh r"qTaϦ|lbÈ30=\ؘb.Ƥ(w U8Qaz[T)afŖar&D%;7`W`x*NnkrTL Skd ߖ)8;' *yw(u"KwKi^ 0#Q@eN-qhE..=*'ux*fG(=[wn֯7!LJwgbZ zṢĹ F-pXu :Co_Tvgb|8P{p;~\睏cꪣN݀: 6O]yCz@{;|ܨ9Aȍd(6m<F) w8ZPt6m7wBx$'wXK?8ˮi?_b|8sXL<3FƔ2SR|3R(^|ɶ.fMGX_ fIoޏoz0XپvƱ))9n\wMEp$b,ZQ.Og|&̉fGb_cQ'Έ|Gk3AVQjԗV:UBXR/CdF*D4`t6R%8@5皻:t1퓯7>/#{˶c~TKtҒ列t| oT<K{t˔,颱rz]-|脱(l~% UBsQmM؇fx}R"!>BxSXv,C- st׊(V ud b‹T(/o7v j#laF!U}-Fby RJ1fcLQљZQvv#.;"9ݖhjT-9+\c0ge0_Br&FEa:%H0Y3P>ձu^bLw 1zHI.`}/:%6޺wAl/='@rYz te缝<-PcrԟdPV*B$d;r0bm V _?jM#b|Y0; 5v28y@i *!OیWuT%oB ǥ?L>\>2wWA栶&yi}BtT $CWE98%OjD)ZSVi ¢IC# &i<ݢ)\Uٮsj}Z¸[;UP6 `#aAbbA)$N1GcBo&կKzϋ<,{!ôvF]{]'U0@R1꜋Xz{vvcw9k>٭{@CT mj[yPioǖE6|-0IOv>Э ]mx";6Bq@Bz\/cEƅHQ>33Yv< <獎E 8{v̽\N(|~#$ eA/ےgZt?-/<@zYKf +JD7`qޜtkiΜ͊C_Ǭl;4MhJiq\UۀH\?0 _ '?CU!ӜG`-7uXc*8i8f]-)ً  aq1s+h}\[v(֏q/V*bҔXeky+NB,=dx\}A IC{ f8B,)ż)zD;-8O6Ş"fDW?Gmf:&Y{pVI㐨 o/Zh-Ɉ2;; H ׫D*GYU8ph'F#\lA!)6'l{}茼D 'oxjwaVزS`lEmI1Ya 'ՀwhTf48H.f|^ V{s.guVw?!2jŁw>9: nG|-4@95fJNmu[7pC*R}TH 9fdMoFi6CZʎΌxS ]X} 6 lb!K1\ʤo>XM-6oYl12!: 99|Mx͒D o~e%"G]aaѧ/ey(R])L/*]. +z4 ȘsbX Ϭej" CJۀ->eu^r0ڶU@frt*x]yXLi4*=KWlp#Uw#<0y~|4 鬛__!];'N[`0ӦMv~}_'#{/bRǡ>ytEHJi=ZGNu\:{w֦gN>LcFԈ1iSyw^ƛ=S\u͸.i/Pˏ!<yS2=#~ѶAԱtt݊m쇳!g8PR%N  [e!35w$6 S;f`ٝ*-=mغ{ng.bqzE\>Z !yB [}S)MXl ۷گYu}'iinº5.Ri߸~-F瞁f)illM1sLuZ\]CL&3voCnXN62dٿw7rƜo\N@ӢO? cgaX;JOyYx sP--.B\B_gˇB}}6lܨt 0-*ߡ:LT$ p(B !HrIIQ!R3`2|ף'jQ110Y,8|`RFHP6El9n% wBM !X'ZlM蚪*Dh4)=m>Ja7UUUcUBNJyi<:PB!dpSj:qlehsk:;o*@)ncC=e.0;>_Uu6nł 6ch7{o@A^u6'BȠ!tQ#;S~?1BJ'qHSP#mTy}1ͼ(>\ OlRµ-.4VNQ% 0AMQnsQ\vΜ:L`oO_^"w\_\XL"Ӝ`\T:=7kJQU]f<ءW PBְkOH\(=f,LJgLI6~ C和Ggڿ @^!_* Z*uݪ UejT5lC(5e(TabC('< | .ɲiukE!\% 1dLf˦ ]7aR)Y[7onZ9 F9`LwU[F-쉉h).:5h鈍0)ukP;ph%jZ#cT`WWyA܏Jh\(TL^;FG1F_H`t:~%YR4 "*~Xr+J[UN7߈9j`jle-Nxa !2Nsc=&HEO50'+/6bKsߘ0cFcaa/q""*/Nj3ݓmM8};+ G\7|M~tWs'~9;Zc~}+ ܐr!|p!,+N{P#tذt!>*R)ƚ{7(@lBT%⡠cxQ1]imin%EܼC!H꧁)@H (~iwZñ6ڠG[\:.#9/hS;<o_@u/Vab>pB]%&'g<_~v8ʋbW Q7Ѹ`RD^e=3-='r,!K?_gc5ZU0d=N! 1Bqc`;2s1f?+kRh;v }IOrl8Vt\H)e\5cx$'w jĆ-XW?[%*NȼQp/يK[ ly9Q-9&zqnM}[usƎع?,)_V[Z[[@jhU~栠V 4oȢb&qq x7`T&13nōakǭ89(d~-,.č?,35@?.EWPVWb)}K:$6>?ЊgLr$ȡ[?_[KmMBJx/'{(qB! o$ gї0oo3vi8v,V} zy^2*qlbt5vԠUe hܽwɘ4ڂw |19/3Qlٍ 4R ;>AusN(y%]HW`bx{ms{4Iso2rx$Il6[CIY r #A/]Ռfk9 p3?wO㙷-YS턔 ]*/Q '$tq*FuNR{ICWg$"u Ζ:THa?8!B5t_R{n.걢d3+BN2<}H+y:Jwpjb%4Z¯ Gq6ߏyWH1{4I1<)t\BRʐ7=.7J+#RPtCSkՃŁE Akd`)-W>jM6᩷+cZM_P7]Um cRx\9ˎG?UWQжT!g@0DHOU|zlo 6yWݭhhE;CZB!d8B !b-}Δk0!J}DO>oOWbd^[o{ W'uZXc05ɬDxiR/o jGWYbuJۀ->eu^r0&1B8&|f>zztY< /̀)qf\?)f G!.>B/w #ʱ7Q#(ER[HvP.Ca4q"l dbڴi0p\]a0N@0p_XKօu(yBO0Mo=ZJUJ`5s?VO`MqWkXKxb<6ފic90Y=Ѵn[jQS[Ve*xD@'#OPB)W#C1po/Mj&ӷou_LF]G S7{)7D/<׃D "UjI ܄JDE( Kz쾆Flܸ 3gΔ H]WQ,eR='ޑ8s8O  :zBB[XxnoaZ#0,yYuU"!1^S~6hH'1B !Cp{ !F6e+zm8:E)Itѯ~mZ 0-RrUB !p0! ̜ZٌZ:=!2 *r;X_|v Φ~'BHC !F20- zTWY[2i7 (/9*&ɠXmxB !H!e9D F hGY_HvMBL=N!#JCoBNL=N!B!B!2B!B!a B!B! c$B!B!dC !B!B!: !B!BH!B!B0F"  t F V9**hB4t!qq2$ :.5u(*.Bss !5HIJDTt T*G xZbjhRvBX2uZ=Z#!KG)d` I>}0BɄ@B FuM-8QF!<<x++wkkk{nzDFFb3v[ZPTXr?T p 0=B\llGʈ:tXè9`طg7F厁="2$`2{wwFL$].+ο#FTeghĮDGՉ4ƾQ)u@#(!dhꧦ&Xla0 !wEdEEy@4O4@T^ɏ>gu#;#3Bcr2BL Eq~ Iؿocb'9=qBcCS>h40[_T'@t!`y0奰*Qldz؄CDe`4"66#a6[RoUF9H!A ɘtϗӯ&np, OQR\`Iht|L|T5UU8|aSM_$S Q~"]Y^͛7"{h䍝ŧop~|W?~"$=VmYjLw d/`rѽt:%CZkgΐ9򯤨0I"?^Ⱂ쨘$C}HM OҤ#{tBPʞLe EDEADETpP({H2ʆͺ߽7I6ix"i:<=+? X1r9?ڲ.uع Uz&_QGmvڋ4ATCA/$޸>WwO}BkcɁ$vYg=6{\o"5%lFRbq礦mM2IMMQ9uE/~{zg8Ob57%c֌xҵ.`Aא o$&bܿߵ}ѕq^y6>+ 4wX7zH k!?7rm\dgE;}3ȸT&ʯ[jgg3g =#9iŽq#{fꐍcJ~?n Sv_k Z 9 Bϟp7-ƇoЗ_a?ϱmSMLo!)q ~u툎cU8,qdrU%KğiN=, x]Yq<ӁKpӁ ߔMf^#̮Q5 BSw\ƺ9a7412?Iw^/a"no8'ᥞ-E1m}.w`x=}"|E,Xfo'>xRM}Oыb¬qvd.U^hrkuq *.n(Š,ϭY(?P Rb(LJ8xâ= B\]u.ݫBZg6Pܺ1Vh|Lu8Ƕد02bWj33@^(XډœDljaLk-vqdJwj 2SvMd.*4X8 ,#G/Ϟa6:n9Q H!n6+W8;l={ 8f熝ѻŻY[yi0_T8j@7G0pT\K;=6n K0uHcذ2/6Ƕv`|#ըs qGJ,9/æ$)K+qy$aG@P[ N/17_avo0>Xu&c&w~X)ݼ ['nZ!-|O;qMieN%Ìj=wUy[&O9X4<͹~ng3;{K ٜ4X&2%52F8M H{:lv-ghc T*ο'7%Dfez7{FpLl rUbi6ݼC"7ڰmCZz!DtnmQR^jgyia9&JoJ"Rl"JcoYFk]8  ؼ*}fx_;4l;MbѡKgh:~GDMA' nf7x+X73tzN_ݽJӮ(͆fokqibn~̸'Y+~߿x>7=_~MTeVm, ٸ8\?EvܙSz4kJks.]8vyy*lL*s&s變)8 HuH&[AP\EZ1. R.۾1lkw:؆|i0`3[k6E.˜V|#ט h5 FP!y0D!>QY Ad4!.> ֥WDxeSE"wz<3o\| &W}EGwhᒍ?_ע7Ѭw;# ? )!"|0ʔүuj9}m? vM06pΠM#_>&bV3(3TR6GV9{1i~1ql X?r~AAE^Kxw'8c-6~ǣm!/'. IkXIs0y-QѺ]GHUϋjܴJYYYx8Av2JPdPEЉ#F|Vڲia+d"/_ƲZA- '_8A|R!B#> Bٽ'lÜNbOt~`NA&CN 6+طx ŇvwaʆJqc\]b`C'(êG&| #6}{C'bxpFl?E&1:!بc?dbR}a˽Wd6wnxd,kӎ䕰qtt9tSj#QgAn= hVBqpcXAƈzA.mؚHGj a)[8*F ,sY,ˡ eMBrȔǁPebSL; QAAXLD9qZ:N,@e{7*4'ۀh$X?" o2ٞb6K3Sƭs[9/!ރU~ _8 HFՆMWR2Fc'Cl)ã۰f1$$@(X py 8%"D=[|OײK0,ה7Q4qao'b?Pٓkx(#c[xyA)H+SnL_+tnƤ"-loRb*EO&!}7U口.@hi= HŪ2:4<)LGY6$!茦Ngvޚ숽!~VlAøtdzQ.6q\qn2OyzEg0ĉ[q|>קn?F! aCmIآZ#ҜƈP7}YCc_zMfwI51=1i'[=}DN82SƐ|ʙ?ⲤV,., v_WsgNr@;upMvV:.~ [5r4&'x6]jE~[FpWZ:Gz{V tc %Eh!ӼҦOcq^o ,\yS{C8Mk0q WS!20{4/=,T5Ǹx% "p~'|qr_3C%i),,GG&*jդ*~J\ګ:lAr_':ٰh=elL\[g(ܰAGyܚG[_5b6.$CaߊO΅P6^ c[".V`߾}+V*vlhР(7peEΩ~ % YzA\L06p> +v^V`k+ѻ(rt ~h B`%a#;l;x7#6^P9C\,Iq?p#:Lv.PV@ OGa;0VeH&69}[JhXe9m}H062v?f.x:6b{'zS&A66Nԓ 9޿[©)Yԓ杤ztSmt{Έk v`Ud  A5,\;`8m rBⅨ $da`;<?\/ƽmuDM aZQ-2l|N>5ڍ‚ϫa:n>`@@Fx6ls0tw]jx,鵗pкIh,[Wh Z=6,,$6o'"[5Fk9娑zlZ|=ƃB6F{Vh:2L;keN{Q->ڴq&Dϸ;bM[!p8Dو;T-=&ƐHIl,dj݆/% ܹ5%HKy jvF) ,8a=JsRg `<&:[bWO1A I;cuB*-ГBc#k<WbίY ŋSF_U5ٸ/`Μ:(gskգtttDsƝ7q6 6 :.J̨åy[ч:N6Yi>YP UE~^.N:uClfڵ rsrݹs׬ūÇ!005:B/kոMDőÖp8v ]Kl)q-( x < *q^)5%nn_VV<|iŎeѱcGal*~+kIl9:.ad:ZQB-/+Bh AD=TNyo8! {wnBiX3H~į_:%bogg:?ͯ(ʌ^G)9x\ ̽S;wKg F"{ǏA|%7:9ߵkW:RPDǭgDcI$6x꩎3 B A8YjUAԖ@ ܾˋ=99-;cl%N7(a|V7S';HgZh]1a Ԡe5]?7\Fhhaie#_ 6qn84AU 9 71p hM]CAaD| έHNR- 84jo1eʽנ+Se+7GĎ~d$ ڶ;_fem&οڬJs#)EAiiccVIII-/"5XZZ!8;BIPz7.0(- }Ԑ8$!1 0-f';u8l$HOK6N,χ4AU$0v/kb| ɯAco`R$ BNpdlmm@1pԦ=X;YVdr)re9zV.]k Wī4WUi0 Mn4DɌ 0QIJq#199"ܜ@erpp+"uf]bB$+<Dqq*?_޶i LHԜH@m5>QFp#ŖeFkA4OA6lQ ` r9E ;RdhtAu>)kM%l8 j AAAAAaHAAAAurAAAADAAAAQ! AAAAAaHAAAAurAAAADAAAAQ! AAAAAaHAAAAurAAAADAAAAQQA_Azz22P  `'WO5AQ@Q?{w`ei0B DA5G~~.ܿjhPk5'kQ[! AD=%-5b!a =JI=ٚutADСbL' QjW =-.nkQA4WPtAAhtF~u~j ?~"(D5C# )2i!$[4‰R/ե:}UrAQ?si@1ݠfq:8!H?e>507$ d2JE -!#jW^ Q}i'F-*TGQ '  ~/(H ͩ EBŗ_k~¤w&~Ky $ Sq ~͜@*DK۬FhX]fa AAs B4AdZ)o„W{м|,[SȓՓ.A@A&ǀACM'1N;t }9X89_ SG lM%JguD] ;NCOz&(҇ǰic|6Sɫ”+U p281,Y@HH(fP{s8e ޽w1(6XhsT{&T@?^ճ4D]aԳ(z~d( {#CCk;wS,Zže5y*._΀c۷ѻu,۟>VU(<5*S`W&GMWgr?Y:#Uw Q:.l߈]CbBp@gsOc)׵uGPtG{eZ1e*:K-ǚ`ϨN,>]p#)0/tU;ȼz;vljK72 ("nƗF0vĉ"bk!EX !m덆vRp%_9W؉x=qH_w[*^b*Hypo¸Maj_+jLgro`e5EpcGP31l~%zfՎ~hԢ ^ M`{E , ]*WFpcE4yb*]Xbݱ| 5 !,gi񷑙u_0z11Uض֨!Ԉz6[PPmy HuXea$äbO+˰x'"zg4+d)8}%6?![iqX,09if۹y]}cQIe؆aHΒ5 5T!nX͇*e$AFȖÖp8v :lT#3cҊW> íaxظ4ng)ͯ4i8j L^bƳCUO^rz7F?ƈGz;~P#T~(#\hb-L75lذ禳 J6)$|d܏M1#|pd_ªghk0&Dx2?o]V[*ezi`|8.{.)Oŋp0}5@7ꫴy6=q눰U5%HLKߟl|mW!b_ || EB u*sqbҸ{ u#\ؿBO0(}xVw۾tE~iJD~+{CD=:.%[,+w1&w,eF'Mb㓅?9o A(%._ a? l4Y}5-Is4ur1[cGF`Z=pb༹^vOi /~->!Đ cGHf)2t-%ڠìQф7cq8 0qS71R-# I8y D g/vɣHvhX-cX HCc؏poyպ^_ޛW~v=S-P̺I+, 30jr}2[Dۛ0Oh?M ,ݣJoXXLG܎Sux0xV7wX%w' rk//FAXrdwqbGܦOqM> 2,¨Ph,Ä4omLűe_cxY k>^E(GmWin* 2+ct ٧z௱㿘| wjޛ;#nEb|rLilUz/ձƍQxk~~\c6O7ߓgvɂ[ mn>+&^:;.&;kb%ylۗ >s^>i)؁%ďW*Mbb <oދF"K3e~7Ok8RC&eE0z靝X.Pf&#K3c6"Pjr86m&Oh;h{-'9u(!Md}˔>QCn"eNlޏ'JoH,P¾A W~cy!ȇ$"m\XEX ƻ|~fӾ"3yQd,K~$۪1\Dx*:v| B#Ȓ| $>w! yv"XF=QS^-rgi!68Q\į/{qs5 ,ʹ?w:w.$ =`( 8m5~ KA3sLmX!h~.v3nëcT p;`xp% űx\VGqmOegY2v9C_W_Qk %(p9${Ƥ7#!'ǻ bЛڐq9MO6J= |Cݕ_4N_c\\ʆK6Cưp2`).[<+U:;܈ <|4Z#6/}uKFdmL Og6mlO ~r& Gظu[4iR`J܊GW q{7`Gș?CC<Wʐ׹0wx{Nz_Ly˯Q݌k{5kLd4HEьR*⊝׹s߂|ąQwgZ-=Oz|PBťjMۺ+>^j`F$:J=&5E_COQ1瘶X^^jP !\=#Z4v/6"O8=愖ĞhqWD f?,:'jfvayƗb}JaRW-"'>)X4஢f2L6e ۭN< r`P=7_G4i.naACUԟ 4/R̔!ao{R+_aĀγnY?MB&M|a]R8ouuBzΗ,>[6[D\  Oc`+ͽLq 6 cA){Y8yHˑ x5rNa7Nh-<8[VН hbȏ@X g dnh*:WhA}?s#k ӵ/IpGX/ қ.lhqakx㒽'Z6q+ijB{ٳg Pke``BfJeutcR)G{xAn| ֨(Qh぀@7޽i׻Q_?Xڄk3k?LsI!jߐz*49R|Ytz=Yv0p f=M KDv7~"6d ?Hnl4&²`vرLܿ; Q :|>ZL-*RZk/gSQlHı%^r !u?)n.?y+ o>*uE#m>o1E?pS z\ #!BOY-jhGQ(ĮfwھJYg3 ؈삒Gpȝ ؏K0D7 %AVzfX!܇SQ=\c/h O4v-q׋ApA\IHa󄪳Eӈ3(r``,^.ƥ^WY^TTz]eievjM-A-j!9)2HR&U1o~7VHVt?BU+.%ce@ϡR˽,3'_B| wAX> 50f٘a[P͛E#txg\~P#& x<jf jFD%onI6A,}pӾ@*'A j H5M mi*tB`Ư{k |K h Z= [ ;Ʀ?~W?s;4zHwClv~6o,^2 B6]T`31a=6]~/hgk\,rHtz=6->yxP(wWt@q1rji!O ?Q(FaW1a4DJJM{Vh:2D~({T(5n=>Šx7qD=%\ۃ.x o>6/6b@Ïػ;ZĵZaW]\l +ySn#n.]`}Z>[{_@w'BCє ǕXLQѭkHW:Kݲ7L [6"Ѯ &7qy&4TSSt’.=y;=ȯ/%e>0~7DfK;73/l 'o87ӾÍh}ǰyL揋x(mpK8/)cп~ @R/#DV!l&u l#г>ٺkѪ}gܰ|AGyETmd9cU8e 8΍<[>nNأ۩3"sbԝ_bMagd9 [õ@x- l7c7\kpVŹSz*m .؂bƙ@MgX).luw8w1G8o3~KEw<ˍPIc3m:YǮ4/w0ULpoƎMhJGZe8#@HgXfu}-?g|WtcW4n:-' Hs@dj$2Y;KZX|ECZG_7T 20ݽ{ոv39͞ k+J=ר~v6KvL$k kE߾ P$p(f'F_b!{?aO=þy HuN,89;Khm +VyBt]J |$SRIvE,{ɐՅC`s "XtGw4 VE۩9]8*䱀 S?c\uY97 N}#K `ۥ}1wjˆIk; =e+-{x`6l3 Qӆ-?}`j6(k<SXsq>FM7S zC]U{Fïg |Zy)q=Cn[~#2 86PmTl'-D!< %?ϿvBTZBoK]:Ob;{٨KqX%E԰[9ۼacٌv|tfCQB+Vc3'/LbӮh-[Ve];o~ =6SAOXr Z#KO,ȌC0z vv7* Ng~fc)%~8=C)Fٯj5Zg#?YPܾ0q2 /O;?}mx>`!{6X{HmKե |8 _b͑ȺxTJcΉ_ 9OCC ^тUT``@Fu7 Ю/* aii)ptQ\cʄƦJХFErYT}Vm¶C-;@"2^#mU5#[E_}8_擕9-,"5dfah $:kR<lLe1noHOKɤh۾S G~5 9QQks&)B  k4 FHhVHԉA?{EٚB:z"bDP)_ xm^EPDET>鈴@m|3۲ٴMHfyy);3.f\  bȍHDDDDDDDDX$""""""""rc,1 DDDDDDDDDn@"""""""""7 cȍHDDDDDDDDX$""""""""rcJ u0 F^VLBR\8aknDDDرHDDu,dee왓(*,$͑15~B-&2ٍX7l=cQ`,=|Z"(8F2ȡttrCŅ8w,.]8G농5gl{""",Qt8s$dYF 5Ix|G!SLCBLI3qf6ܞ퉈~DDTfaAC厌FvvfbnknDDDT?8ȁ`NhpJ\`֍ƚ7/oovC8cknDDDԘHdG*eg_m[MHwNxػͅ]>[]"o#eÁ5+7/h 'jPՕx,ƙzJmODDt`IdGbmᣪ'n[w}P{߾6JJW]LC(Ń mcϗ<һ EaEښ_gGt-;>+~VIUHww~zs6`/p,jwMgffbճ'BBB=#""Dш,7:uJB|MwW2@&dWǨ7cjB##]qX4}:ߝ  G׳f!,,SwE#!~ ɇn}p ;~^M' ͟G빱xts5U_sm___lݶ Wp{FDDt@"RQOQI«Mk= "X=ef_:*i!1lZ0D{3_.>vIA1Nn|1APӘҵz:-܋+Zkw !Җ6ѐs>sr w;+Ď%`d C=| rʫ0l^>sEOTG>z ,?WleAΖbrUk Ə[tF|R@Q\d2C#@&FXS0y^!n}M<v g /OETG|P\ѽX}E9@f5X>uL/3Ae\6 3@;*Gn߃{I7C 8uu(E$IFRg*JÂE2s8 Ĵ5OG !+fSsZ5*qt8o;S91)e8W]gaAR$h n2EQmi7X%C/}bKϞ|z 28Jq^~n9)heїDΒu?Bpc;یv!C jwj{785 D ym>U7cH;xO&(oHߟ }RT+GPbb* SѲ؟%wlt5+!g| ]-qgӱyb!V-IÀ;1ۍ%"7p_ Slxv!~?^UUP}ͻN$d`b-FT-mNmKGz ۫~_[/X P(F%z!@].|OF82AޟCrDW_=دJ]#ΖVvw?!Fs~6b|7c]DZ.K?c=oC -w6lȽҊIXK}%A-?G :+_]>z=rx pcU-᥃8D6a *md!\u٘9|TTAB .oeIYrӀJ< {bԚvO8U0e ~h_MG(nBhbAZUݹ{mN]!fA]= pE,_Ó)3Wk Bd;usC:yTU9|cbFG|Q#nOl؃Z~gzZox"MWDDDX$r@P\- xjt⫘:^ U+C`x(ή{汘P<qk?mej0Θ ƄƴWƢWpm\$m.0x֫6 3^&[E|ePH7W|ihvef,:o %8d24z&V w5zgDDDb)C@Hҫ) -|aATaHRb:,v;J;nŅSwψYW|_j +XT7-{2,셖n/qm'}07Ť-s.#;>Axg凘![SB*Ĺ(9/SH쀡}Ej 8,ۛ?bUV>}6vy㩚v@k9kqtM| 8b TJ(8w ,k1.]UgvW+Ĺ a*ƺcf͚Wǟ=o'$aʠ(h$D)a߮ &9w*a4eE:6zǷ/b]Dk~욉>= /TVd{WzFDDD.@"ǕB2}-;7@Zg WVS3n @t77~<?%.X0 O@krc.[gu#N̺dqC|[Μ<}eU''rU>v/FCi z_wvEh|wX| Al(X#^D٘cL+רw8 N(U:嫶|\^ھʊՁWНڹkQ@8mXfhMbTbXT|$鿡$iܛpwSuLs,;۫2/xӍojEp٨ѹk8Ww ?'lKpKZ1\W +14 GeYvC|ۻ궇퉈ɸ'"63UJRAe-G^nΟu4%8!!aHJI(T߇+u:6d3qdl&>j.1fa uSbuj EضenVcX0m,z5= 9MG/uEj!ia8cn36ryYA{ ((}x}❏Wݗ6ƎŀD̪ ᥻^ra fg9=l,mODtQ:{HGCҷ/֛ K\e:  Z 9ܜj_/}PuB'%)ۢH\GĤc@C,{,af0X_E = DD`";ҵ|||ѾS3^c0G&A~kfDI/@eLX۞\ Dwzc8\:a*H_T3cMl{"""rU,QNo dU sUKR)'z0ngƚ3=5v,Q'^>κ"a¥ NcnknDDDT?X$":P( aMV{GmWK~.]tmаp zٍX7l=cQ]u: &ᔲ=rGFtR6iҠ7bnknDDw&w NgdȭH50 kV!<ȀkOekw5gl{""W LDD|J>3Xcl{"""[r}HDDDDDDDDX$""""""""rc,1 DDDDDDDDDn@"""""""""7 cȍHDDDDDDDDX$""""""""rc,1%C@TJdgg!/'^TJ 08rYtx_wqQ 7^'kFc\LBRe9u ń\^&eևtD{HjC-><ܜ?"):s<Y\\sgB)All2Ӭ<XкWտFDQ ++gϜDQa!׸S(J^\(=CgЋC . X$׸x%2bbRf*wE ? i}Upȡrm ۭڻw|ۈ:ȿ˗q!j Өk;NZ/:u;[r9;`"+h*\**HK([~:~Mq;K\rpRU,ܑc[cXۈ:zgNDrT4k۽H#p!d^0S* YhZx{ 8'.eiw; iZy:ZHpFEm Ьhex?Iq*ژO(ok-ʱHԱ ‚(Add43(F"""ƀ#K?K!OfIʕFהdj \ɀBo+XFyV4б X Ot!GhtRR!W($F˲!P&Ζ-xX{]etYS ˍ3Ԧ`LJ|oUڷQ]swgyy{C7Ʋ˵YHdwf=(cqJpyǷB!)F !oʥ(A뿅ҺBy N=q+ؾm)gM#pc>/ݲk<_[ˉXFɬ}G(35Mv\:YCs('aϘ$ epdGnu]/*[7z=ʊWIM)W}&"#E4kVbo@_ eDDDV,Yk1ΚL8^kDʩm;3: By a= t֑| QO| NŎGU;A:ݺOlw9N iT/d olɼSjul?cTb!W+3"~?LIb?'~x {{\%N_ iaKuY@0da˜xr`O)p$~X nǐ6q-)233if!!!5[9]xWm1ސ:~d_H>iEښ_gGkۗ_)C~cbDEHd=l7i[XG$IПCAIPGB@l369(ذaAs`(/CRv8Ê ~/ƚ,1gHNiRFu6ʜDU#jQ1dc.10Wz\6)ǎ'x ( u4]iPGcHtJCc솢Fi;wb~$~ :va_@0̾}8Y EǰzX ĉwy= g/cӉ<Nä+ՠ9)/yA|v,<dtEkT۾}?mЭ[rE@ۜz~ kSF {c#{ ?W}"MSwwľVB.|8 *IN`Ȱې쯰[biȒwF@tKt;nm/amWL4;qc!!ң qy!421cXb.?(`uߪ_&n+ho(xm::տ\DvIuCÐy L0Bt*n~5b WٹtC8Y:S{!tdVEɿ<ŎS(kSTE g$%Juy`nUI!0PovM3j9vf} 0k7?n,7(-@iMاuҩz:vry@h?5eDj[LHCGގvgil\+؅cYZS"w<ooSb336g&>ahz#?= ǿp-P#nwmm(Bι4[<S.wF B|4r.mţIaPg©8S$tN̽45 EBn|!?#h7m~ Q]DK3%#g`Ꞌ6A!? s^y+φx2):"\F!ԭCLhcGGS-B4h)>| |f>Un4յn#K¯8OnP[^_sQvWg} zMS.a9?.)S۶ ?''~M18>p<c^xz/u=,.aZ,(z`q4޼%*[tرd6݃9aȸq{dt|b )sOp~1?O~KQ~,W>< / 1m^\1}7}l U`"~kCd#.)nw070,ˮ`ڿiLj ohx8, x-H4V4|OI) ē_ԌMlel:cи񸳥/d3qdl&>¶(.>UM--e?+;s$$GVcښS7OJr;cs{wr~밍ƾb8] @韀۟Qv/ykƹ"GFuap@sjͳgb'K+t3Dچw:zp ?ii99 RV!89 w$[1dW.@QUq=vZ'Ӻix&PV\Ee_$2򴦣2}HTʜFkHQI$J vBS/zx@H50hM F5}|_W)󔒛3@.WYqaA>x@)WVtILaUAXVf18;x# mDŽ] 嵹;gMp2uX*a;JGŷhmq1']!X7z%݀ M]z¸o'U8|(Zǣ,V}_Z%'_m;}dVV80o:Vi`dO/Z%LjtcKǁL=\}^*wwx} ֥2bFtoZɺDž %0߿> ۓ#q%Y&:wz["i=J;y̕1u*z_qW]Ѧ]\.܊~X3*7[/*aO\nz>#U?»tGHJ-RL::ԟOa9^>0|<,>r'N dtOaVixkPQb{?m ]_A|Y;M?':893sx0HBL!.{I7C W /x.ܷYcbZdPC\46Vm̅g10 :^:1RT#=׵9qfrh/{%Bmx >!>$xpZ;$\eso; S;ڦ~1ljcClFg,s:隤Gw~ң12\)ME8T }NmXͿƨqa,ٴȉgJgab=#GS!#<,}a,}= iOE]:·bxs մojOۿz!Ɯ 䇛%3?W>/{wz# #TM-ӱ.O2ԑx31$*Oh 3ql.=y똢q\!o8Sp"xo=&#&4@枥"?xYF: {Œ8|5h?ƣ>U?;RrR1J:5Ii͛q~ ݿ!67b_LIIpp^l7 YWɧZju A\OoxZzW_Mςv1Peo6I][1<Ĉ.ކ6]OzwJia͌F~^y_3Iq88t: _H}h2Ov ު,shSP9YPWݶީ1}^!>bxu/GHpahT\7s`Hhrםż׿FO0#]anD.n/_J$Y0$G\kvm;>zKnnv0%ƒ?rGiiP6v</A$XmNm[){v@X q~8KXt]k`ߐNf-6gepP${ʬ ]DnB}Ȓ)`<7i;%.`49 >ɧyɼI!rFvPȭmz~1O*3|omiNYgcո,K{!7@we/G L_h:-[HҎc,LjNmv_h<@D Q}c,7#0k9U'E"@vfdP!l0 SZ `8:/1PBb M S ^157{}x'v4V&3B=SJj݅ͯ)̿'6{xɀ<naMAY,Y#Sj^6=vI?rRP& IF6])Y$>-RǟcP{`C>6|?0@)4:1Ley .^0V>(a̽OIɧP5m]$TPqmDC8N+axr7["SUEAUEhX26;| Oy_ٛ*"RK~-ԛ r"6Ɯhiҳ*M-ڔ+ʔYq>[o`xVFz\_>g!o Dir`8X 'yȃ.#M,{Yi8#狧0 ,M=\BeqB6JP UK:).]0$2 oxq(vfc4ɽbGSIp;?4䁩vcSqCzawN>AN/ȪXAgTmU/m?+8sˆܿ`#z0݃ˇ'tCa V [.>ۄA@tN6X.Vpa"O+.uM?+&S1_D#*Y]{ 俰`s8ֳ/n6tkoڞ{WdŗƉ}Y""jS7(-)&on/&'ńBQ|=pbP%S0" C&׳k! S\ y-42AB6~0Ξ;oJD[swi~C0^8n~ Nv}1{Heb>UL/+-jg[xg|}{x_ ׸\! !)-}x\UTPUhZKP۞&YU$xuR3_ 6;$G&H{i)S[X#_1cA|pZusDO܏]/US I]|]#HZ2L4f;;} bCyx&d"1m]rKAZHt5`eѐ?M x-$yO+T7n"wx ֭9uݼi߭)ߊmL|v/Ǻ}pr;2;ʆjvxmSvg51{fwT7;yʷtqUy/ =*. \TR)NO [SZ!}aX>Xn>f}ՁgZ?|m~2SSSsuZY""jQ, #d 7D ͱP؍P΍ :5d C"P[4ur]X~KG< M#0ngY 2[qNc m)~bn-ٞOhN/ſ? [$&4kf|v,70be9rU,dQqI')1 yW ۷ e+p99ӫ'B|{-T>FaA*%X7䳅!2%BGI@q#ER"TIrK?hK-‘wU0hk|@D^yTU[pp"ij -nĪ/kڷVɫ- \p"UI3%ex݄{,{ލ2 C\Lcvf`lE |d䕎J4WQG_dh /LjjiJB![geU\|'/A#DA2%U@I֩b4džތvRe Qn+w85k_Y<&=):xbE}dUR bjCr(2)Ѵk4];~2zǰPxtkyo8#PWƩ$նM-9s!vM<5ތzG"!1K񊔯Gھ%ͭjh:O{Nw n0:v3qpbNov18v?ڣ DD, :tT^ ?c< P3ĨSb:xzzF${P5oeki8`6S2]R4":,#dl?qm#JGْ:H.sQBigq^Jh탶>?@JGjNcgZԱ-0x %2U#dr 'j~*k 0^|u]br?Sr"IIJBv4Z: O.&ϝ䷾?%b]P{%=b ]H|m*=-Bab`t6r$Y_\Z]BuF+ؾxd|WxF(y?"T dUT8j(($C~F64=FrgŹ\ 0**O#T|jwWRq}u޽=}=ot%]S)1W}AM?*x_ S ƇI@}epw C̐ŭ)Pg\~zߜU8:w ҕn!m? IQJc1V'CNy%uZ;z6 .wo{WnsUi2$߇ wcu7pW?:< :.-B%(8>З ?$v ־-x3e;j)~\VB޹~XԮHWY i\c?+s&.7[ = 8# -TW;>x{8 },BadWt}Ej 8,*ޱ "{e Ae\*[ݺ瑹1q!]3G+|wىX$JhKOA ă P']  T h2ͻ!Є%Bf t'7X./XGL#L*8ZeG^v;P:A ʯR ں`eJER?}=i_\+DǛKhHEga׾bxk.b1a!ϤN Tޚ%L?P6?)9ԂpӑkFp$ܼ.awZIu4BġЮCIceT/d`ʿbD5LlKJ/TRPh[ZLy#uSႮ+'^(kX>#%! p ߦ&*< rbXT|$鿡$iܛxw,׭of)qc4W߆)Bᅹe>h|wX|`*v]oB{c_aᒙ&>mxi.ƏfxWVguBڷ ZFXnl^#ckݯ]nlbE5<ٛsM 'uas`MѺSMÔ> -'ߋ+2ٹi-uA؅g7Gr^e1lUMejc]#[*wV9L ?zUZ _#Ʀ[L(Zx=gc1MxGuĽapU6,WcҙXk:4ޔV)sc.[gJ:cS'v3mϕ*e'"f[EU:cZ妣҇jۺ50nh˨1vՇh5NK;f EPX~ք<0\I.]Fd_A.7N;C'Nh) AOc։Mx3CkŬprZJJhx! [Nbm`Q?./;J͇Mɯ/BTbBO+־Nʥ5c"B /mDQm~A<s. ۻg#˧ :<>B7\?P=/^?e]A|;ix!VBKV`ݎC`5k7&ߞe;VϨv=K *صnҕ0 L,SkleIq3-a|$%Rr C␋퟼qNlރ$1⺴ygXm] #GddDήyzdw{>sbBTp,^lI]8[`M'ddl&>t3+?01C¯®bfY;FIV;{ugcYvq^~n)b^R,79|Acb@PRKlj4^{af}<)^ ˎpԝ^I7`TR;v u)i3vT+58M#{OS=g> 5of;Q)ؿVon|!wq APd,ZyZ!e}s"=Z pi8{$SZEQQaN:oyq?[+ Y ]#,;)D;N?\/nnJPẓz]ΦUZ䰼R 2䶱kEV(];uYA)TWɏQ0/)en FBsBҕlW_l=&V6F\f+ZׄH36|iĩJ :KJ\\6"7$:VX?S}jx:~? 7PAH, h8ӺU󵹫+ Y"""+JKGza2DH72szZ A(sm2{c m4,]MMd彵HJLSɌZ4-/l.pڟyy~AMqHT Ŧ7de_cg Hm#r72x$ދ d8,ݿ`<~b ڻɕ䫺 Tî/z?vT1>{ g$j@"ʠR!''^޶BtY2-X>e{u`Kv /O/iltү\n4PDzIvVf6¥ǖ&PNRm~M} fR)m{?ڈ GB>[YKZ`UKR)ߝQM"ܟ)yH[e!@)Fط1q*Riy,oWsH[nPt键SJGLl ,VՖaY߭ing1T]222TJ]ȭ} )Wb-V{ eNDDD$HHl-7bHNirf $.)stz-Z'V:Vѩ TV=$~̙SP{ 2:^^RFcmB;{M bc9ݖ{ssT Z̀äUNENv&zjs{ scND5xCcJx^|Fˡ`^eYw!8^eG$,+jbJ8U:l}B,:ƿv9:5 ~ұ`z`Xr;"e˥`[Ӳ얀I;5/BPۇ랋sƜ1bND5 ^r JEI;&eokO(2:YNC:7 (FT0Oo _RqL0(j둼Ѳ|4a:10(Ņ\\3s"">DDT%VSnĒ5,`MƬ@bH(ZW=1.QtL6uNˠ7Nt▩erX7q&9y}\:!3Isj'#=9c~=ĜO,Q$Kp(X2u2[57,sF%G S7~e2U4 sE.l.3WCm{|"X9@\\3s"">HDD<ܣle؟&ɑ׾ͬm`m Q(GJwitv,.+,.,iL7KaY/hj11g̯9]X$"*F8wD%|6Sn 7"k@(2an+QS=3hW]1_ドq+PCxXOǾ<A'$ lwO bX8DbȬ&.MsoX=x$}v.}6DZ^=Ox.=< o/<,>%ä;_e/]Y8C'Oӻy6ӭr8 S7~y? ['%U{p+6Fǘ}<)z]1Y. 踧$sRQb2 [|x4d\չZaka Ppol=b~K֡pS:nî`o*q~:BN.aH+,\rD8ZeO~uq I/;l"i8?>qDMz tqʹlX~m:9Qsti;g[&JF!&9>?_ʩ/cs>Gv| >kye9j-s賱Rĕ8<פmAvΎ I=#-Ϡ]gqOlye?h&z]I/Nq-)/VgT\ݧ(?~?r|cʇuv   AATȲf)X-n=&8m܉8 C I6-±mxw?og!Jx%ߏ> ?w *|#|_Lmv6:&Ud n`tL{4d `+44:զYӋĻk6y.;j4w`Vcco`׈{ԠtfY^: \cx81*i bᯕ9 7\Bk( {CW]cЮG"駰.^.jn;>)C֕|0qU?:ށPmNá? Ba[׃4A?+ dKu*{U=x_8vGb~+p[`v00,Ȏki:m\JE`d  @3DZ+:fܖ cgXr۝+mmE2Wo>>^B2oƲ& @ rADΙU u;sV4oWSCZt[d;tj ɷbۏe[rL+3>',E΍;=FK[_ƯQ.b.!hnI{]-5(;:nX>1֬jߏ?!tGxpS$t{LWdQ5}m+_*A$WtQQl(_s,ҊR(2VMRzrg \PH@g tϗ,:q-S%;wsyvA_^c 4gҍrvSY,|¥, ϗ"S_ t* Gq.[f6J#}TVA-V=Q>8>j}}sA`+/y&Fb:Ÿ (CDQҏBu>wD禹ĴS`9\^Bk7)t~cce7mб=_۠}h0/LźeQu46 lHf(M}otWM]b8bt/0U@"\cg2P~aY[vNm1gVlGCHBoqBwM3uNA  p^3AN< r5)KOU>!V2K`0*p}n8y-% 7hʹ} e>>-qa utkr^ʴ4ӎ@):)}#bdJ^.б<] D mz^X3f_/GEG0V) xFuƀdd^s'ƣO^Ɂ0F^9C)QP 5Wp.AguDF@u7hLsz*3p6%vY2_JCXutqeEUL߫ѼD1)M+0󗥈{5LLͼzFD(r 3.OΑqQ۞sGt]S8"b| $D(JxwŸ1m0^ F*UaM(:%{`Q㸤A6 B^ uឯ [P]r鼢1=2l`*KhnאǫeO!AD?fIh|s AQ 3c|M^aj'R?a-2- E 0<ʓJ`矊/aǟap}K+}3]ȎEmP{7@CcڵljxgH,\mJs4U#~xp;*ۺRǦᦢ0fLH)@{8+;)k7,Qjmq? [Nɰ{̜]gDCв8kJr1w˂z:~mgVhvVM V !YxDBq+GsVUPsD*{$U`yXe6)KB(v>\ڙ-ݥ:2EJyaKQ[ DEFꑋ)6\@9go}pmZefer FM5˱yL:[WK_9VcG%]XvÅ2 *clEƆݮ1WW%MIO[= =Q  !܏5GmwТr 9`-zy?[ )ˀHB[32(ubcwMl£bA⣴jzҕP4X ދqo[xƟqVqhQ&*N֨ |$Ki~ 'XTqȶYuh^X꬛{ۦ@^&#j2BG!AТF 2Qu /_?xQY +p{gӍ ?[<=rplӪvcI=Td|4E@JN"TZ4eO*g yɺihda Yv%N} vce(C6RYrB>ΥQ\~wňT,&\-aʯB`T8vņ|4VkoKvoTƊ6^~uu2G]Vj-m]X$ T#|}A۰:' nO( btJU G=.)`Hx:P @<1f$sx#wbO1Z@]ӷ/ذwx" ׋-VPl]_Z܃H6y>;vȜZᒹ[ܽ2pR!?-x_QԼ 7#{QuQQ#e DY E ZFq *y' PaMCd2T#|YkgRQ R,N8phI,4Džja@^j!J銿Nh@7(t((Dd4vDUEp |dnBKВcTQXJϮW[tKE3o W_5kK$ӗtoVMyVQ}2gS>lm^ϻ͟gK|f3¢+4XnE?fQ#6} `ז?: ~Q1ݜy/G,OE8Kh9z8dqaLGZjRϠM][vgPaMy-`z䤝?~žk5tYV^|uvvl59a*SH+pǖ9AA@ 0 )ꋅ¯&A5زev?B^m"zfh U|Fi&qiK F1TYGy8tQ᜝ޟ.I-- CC]R%5MRV`ur!uu^ 8 ~2dpķ^!.9+v^tn]WiK7~9M GZG c5?8[A ҒDcɌ֍)eS $/"my ~}&#Е[{BWhJ_Ya5E߉E(J( 6ZgN!UʆZmv~Y^uQ+ Qx? RAl\F\X4y"jY99Aӛ{)mmW یL̒߅h P AaaXlXQgp%sfvNV9JgdSy&睱3i k_Sː=4=&t9/R;#[*T>7eCш")A)$ lwJXjze."HB1ħ_9Sϖ"3]1׭9I\#un֏t:~tNefs9   $ʈD#jȐ   hTh OEAAAAф! AAAAA4aHAAAAMrAAAADAAAAф! AAAAA4aHAAAAMrAAAADAAAAфQ  ˲u0 `F//(P*V(kNN6s VU􆏟? "H.;*))FYI N=pu͝dW TmUzɤ[Oߤk jl3XQJoJ_)eV6 H[~^_Ah 9rEpQT'\n`zEh\Au\Ez JEr\$W r?5j"[VN9 u=;dWspU4]  E@`=}*l27Q?xy^d[9oe (V)k߅h>ʈDɌ$ _332p)$&pr;w!66 s5/''O~vErݎrh0p`ᵒ\B)O,B85rqJnn kW3z<Ӡv\:u -7wzɤ[Oߤ۷$4 hu:\tIɭHÍ`jgNq5$+'t]sNUÿQgRN!HQ.~oPpPvt>;At^+Yd1}'8sD!n5W^$QQQT;tZ-N 00.\[LMnؼMĭM@A4jpQa0׭Faɴ;TԀh0l8Mk:"nG z0,YIQ"XQm'W#+Yx4?+cբ"p+bq`I߷IԽ'z( %ZCQZ77a~/{ C `%4,|D"k9RPiH$?9\$(+FI{\b 1q)}F(A0 ܴ!{[͡lm27 2$ ;UQ^^FSmCޑXJ#`Er\$ηǘ Y=Z3FV~=hs쳳m2A&]є  Ap{ހ/1j,z\i Uw'1PUlgSS|=+䜐iZF!2Rēc-+MwА\$%+3kZ_M~>Fдև>h-#T4,\6 } hJ` jeoǬԘ-Gy,#\|C w#W-7G@7() _޼O=6_WK&!-qK:k| }FF:o<<!66,,`5A"3'aByprJsׁ9*LNKrd\UKvAf'< ] ry5g2>ޑr<{ [O FPW C_ZŵaXg~4\E{JEᅎ*Dž/3o6nj8}sgs//{},V};ji& ɗ^5+8lwX<:wEAːo6{>{vgYl["cAܥnۑ HDMp58κCqn6c\H-5W@Db()@"CfA_K=ݳgϮ8G8 X= s L[K{6.icGc┤E QaY+8尿W~p<MIO"3gv5\y3Q1 o<ȹv /_9SD 5 AƥǑgdNɆˀ/vh7fm7rQhR5/5 ŸReLь9ؽhқ=9K#+B29eN<.ҊUcUPr)t^~5 Ƚz [V,cxgw ^EEwBEx>^ꉅ=P;^ms}d;\ @LB`.bium}7P^}2."䤥`u9vM9 *7.Oa,ďz]e]%t(eN"\h( 5;rp o_ځ \FA#mG}GcYK'cRěm.?Ͻg{0D0~05/Ɓe_ǝ'q)VOkwzFm.?Nm1QZ-m:B;>&clŽo?NJ_.t =;@/)N¬0sD.9O& :9Vc6 {W~%#TȮ4v mn.ln?<^f5b#q_i ϳnsPGR$$w_sXs¸֟ĤoMkdž#%XdS*ƉEsJϜ n<{R.#^D7Q_2k[㎛/ s3^i?c0xRYG /U]xj}+QwA߷!VSb-Z[ {z`[V2vBx#!1U; Ǥaӹ!oY銏as4h -'+T }uVy'8v|qҫ}cKprj(ie6m@&}Wƿom|.aǧGkw5ڙ&A2 r^tK=?^V` q =?^*de={|N`MGA$-c ϝEu3̏;{^‹}hvj!90xKFxs;zl)N/~mK({…fʱ I@[v NGϢuFdh(w\Q~ 82 ew3ea­) c@<4 t+U_aߢ h_hcK.=l^槣ZvG6/ǢQ4c:FkjxuPtE\J7oMLm[ueTe?4(GQ*AObݟyvX g`V/`\cЗEY`"?Vay"5|N,RvO ?Afn9W;hI7s [Xt})~ _=}u0E1|0`E[i%`?Xa8矂,-,Rλ@2cS]?H?b-DgÐb5EMǗ:^]sSذ=Z8'&wM'Pt4~r]_E/]A@ o`дņ߯H!=5>M<)I^80RFXuPwKnkqh.O-"=qu47!#Wf-GE61 tfr ~ ։!(;??<^/zѡ-/Ck$fдymeґG.b;_~Z߬0<8 V;0pP2'0Ya8ٗo G 9&G%LZ CVi^.}9\YHpCd 9KZ.N|яDW!QgnZµ1-C^nh=1c V:hpar|84s6߁3Oz#O>QX.FJ_r3`PZűnw>Pўkd \Ϲz[ΕU#C~:f^f|aԨ2ӫuv6oV۴Gv_#ɍ!];[A B6lM>Dd\ѡgKb@ŞcIdKH{7xp} zNT5@WO\Ow$.}йu%QI^Xy2t]U/~Evn)|Z{X9~{ D z P18㏎͸#x DvN_\ѩ~9~<^ |O-lwߌ3 tulЊGRdt(>1C暿V6'=>*& "̈:дG.O] ,-GL=mҰr= NhQҼ4c9}:0CoijH}oiUPR@ O /iAX1 GFî@In1|D[C>GQyt߇;ӐdgIJYb+Zf IDgTp1PzBF>ꏕ&LV>~Q#_XavWMѣ 8?Y[#!};zooWVqĶUX>-ՙx'ҵtM9 Lmd1Xa/S#;ajxsM8|?tx+6 ?z o Z|(>Ia'c"~n1'rm$J(dH٣#WUumſ¥6q]`ڃtZ.]Q-:k0\W/_}(ZBTjKVgU^2_ޏo(rN+ǃZT#b8ҳX9o.Pd)Rx +HC靾p%(/`i(r DxXi^)D#>O_7P_au6Jňن}b.j.iW$ A?xtɆ uK`S7sɽ[@3 ]Ai4[^XV#mtU +#Ʌq*r*7E6s&,G}9Jf̎ ]A[ ?._iޖs磹гU2Zu݂%ȕc_.fUݬ==Kqoi83p~4tIRO6qm,ҷ吳ME\VhԵ LP AU:R oƁ 5bM=\źe`NC kGa*SHMx|(c/#E/ذx" ׋HUaD%}וO'įY+t$ŕ?bE/m-WMUl^E Qnjʢ0X1… *71BYSԤd@Edsӣ6q&>po-ڿB03&- ⵜ*<1|a8=-bdn`$}\‰pї ⮻6цWX0uRލ1pi7's X2Τ!4b8n,D׾P:rqUXT !e"7ECu- / ^!!Ēcakݯ{0LyA*F Ʀocvs'|;J[=\`ފǼ=>wug CU~g9I

,FD‹s՚ GCM*>ޟ,ҏrG_l͋rG@T+zU׋ؑpEi-3[hJ=ą@DLXr(L԰Mql,Lj#M&}ߚ&]ATcIAD9Y7MȦѸ F|}v:C{rr3-6ZE1I!PA`MLab( sM l99Yp?c#Erݎr)J2rCyeBq/:#EޗAT6]j9ܒBff&<<܅gR6}tMATEAR(J97775 زRܸ&!a0:744'GݠMBiV >يLaT*5N=("nGH:acBr iF( X$ r]| ޾~ nWCCqi] lpZxgGFF:-juɤ[Oߤk= V&OfU ˷lrq)4;jˠT돀  ܱI-`qj5du=CWaYssp1t޳TI.6?sPnnTQ.\,Cឹ/J &t#b˙v5gSSQXXtK# 11 ^S)fI߷IX_*DPF$Mf$ A6'iy;+=sZp<8UETt b[ &\$U3!+3YtN`:]Ǵ:*oy 뮃M&}ߚ&]ΆDPF$Mf$ AAA  E@     C@    h     0$    & 9     C@    h     0$    & 9     "e< z3A4*V>~P(RAA4Ѷ)j/S ,qAl|Zw0 UDʣ%%Ez W/ ""(AA4)j/aWdFe6~xRjlpUgef q -G*!ZJ sT \\\@$: &v#;ո^>2Vm:٦6l3IDc$l4TTUP'p&|>AW15 Gvf&) | `ۍ `ѕ;*2VNԮ!c4VgR^!SAU^GJ$: z󈌊)m7S^&gC@1+K늃GXr1@iYPTQ U^ ʿ Zs^om(U*(0NTk]Fv浗 B@04啉r^q pf^ŌF֪ïh0Tv2r翍gkn'gt~ A1sL\wPDܜaljMpĻ?|Hu>q Gۍi/DSڶ!rKEk"&!aN~J&:#~^cDz5|*^Z1ڃAC;`jc ߏ"-֓qf>t-'6n07wþ&A봇SnV:*Fq*6w_F!ǃvݷ"t,<`-ouG{U_1l9Ju>AM[e_jC8d-„{׹-]ehИ.d {oL:vYmĐZS-:us^G#<1Boٍ-F=8p~}rpxOz:zN>ϱ*o:Qp)!m@tCwFNK>UϽ#xl9t^%ǟ0oc} oBJ~= (?}`uF<͹wilU7!\,8{'N;o7!Cވ~n-5:"Iϴ5ʍoŔ)SWgnrfé]p,)mn/DS" B" u13S/޻5%X1S3ˆǢ/Dμ-Ji*̚sm3l5&W0k˦qtHkz2!uB |qlbg,] o$%FLsAxp3#1lYӏeY#޵bԡ{H&A'ry<5~x~qzwkd&J4hu0 =u&aξBWprؒKؾr n=lh.? y9g2>ޑi.JJ@Dꍇ+6uu}Cv/55?;-Z8VbF5fo5o;s UC~3є hO&~]gWamj_R<#b1{O=6~ˎ K h>/fl8y uxsG7CPD N{#2IgK2Uq98[,tWxOlt\l߯!}wĥ2 wzj&^JC.K~ً \P! ,AMۡ*K]琖 _lW7b$K2 %%_Ma(!Kآ %ڕJpIuf(޻Xr L?\1%s|}ďs.&=eNxp8<FwYb*gK>{t*tWQCv|9V쿀rbXo:_18#/WNZe"\a1噶pӗ !l\:_̏ QcJ 璂))XęKߨCLG ϴky1rWa,><[t۹X}IM=/Bx!>?[[MvJEmؿ'oD;,:L$ۡW~3_28Mt,^~ oeW_bǑYot,T|Β=Xz9طs,5}vuXuؽK JǞ~|g:wTdJO0lW2sdy Ug}f<%z^+|\,`|#VV:_ŻZ^L;z\y^xDq D0&'+ 'b8]1G2k^>ޔ|}gbn ~ YAO3 grAczdnض[Yjj0yza 8},bl0xKFxCɖ30k}:<4$xc7NfmУDvLz:eqdr,qE3ch4~xt^{8B (Klٹ"K4SpЈ(?oC*gB\F=pG) 6lZ3_? l^%~E[ {5bNkŸr4rt^b_eO:[~mN{߳XS˻X+7ŕ".u1&^]F]d_<#|nc߱$&qbGXw% gˆW7$&&Ap鈶)8G;  8v>~X 'Eմ|p:]Ixdshj}U5輲ϡv n`Qk11ᇕ[@ S9mTQ*ڛ~QuFx39jē2A n:ֈ}j$wbn?Xm3%P!f,;or s@8 C I:vl\yix[0y]tC/)^G#OzEx$r"FA--=+ǂ_#r h^ӋĻk6y.;jN'E8n+mOX#Cp-Mǡ[(uF^c쫏d^/~/ݼ_>o'Gi2EqFj?:,Fv6MzaMCA3a.G\jUgv ~0vŁc)sg{=;>.'e~~~cصsO, Eȹz[MKr/.ҖRV{) e *.\(Fq KT޻@u\F."#\_?'i.ܽ<{ϽmX) 5";3hѠ|#FX㍄-aTBvwՕ^wl'qwW?' 9͕֩iHaTs'{MBױd~j[Tp2z8ЪiI3!{NF~闱ߕ~SGxlnͣ {eV,8/WqX_סv{WH:ܮN,:;ݑu e Em " O"F[sϨ6hʲ{lEק~`:.SϜ}N]襁i6AÚoߖru_${Arє! 8x| V ~yM~4 uGJu`wbE -a,c=89∠Cn1]uFߎ T~X'>,.DHC`q$]!R샘N1P؃CTb \S~Nyj9N9{QoԈ7 i:iWr|JIYxT92'b XwԂ> [< GCSZ]|cs6r-dوx=8~/gщהn[ǣNs6uY1g]&?!l9el֝CƖ)M%ӂshVͣjn ,l/f/OBaᲛ{+ڦi!~NSha:`~aه^kc!Qձ^`OFQ;oh~#"JBf]: :kBn;tlm)9veB ԗ Olb]JE\^<бLL`T& %FxboC4*0wj8u ua01ZmkOݩHݳ](ƞ)EXR PiUJ CoQ_>;Csoţ-LqtpA6Mj7`41;KQ;WԣActZNFF^Xy.Z*PWNZ,ٙmy }z_ؗC]A@V5M1!g"|9.S5*;oW:BŘ'i1zkZq7z-B-`7JA);5m/cќ= +J 1 k~L_ uG8" YmoeW*5;_hj]<0gE/XK1G*.2T{6 1tt33}Aȡ8vaoU-6U3mvsn竰SoZ|7NzݐGNǂPDLUZXq>wP*Fu$5kW# (J9$CndZx^9RՓQ(~^QQ\,_A_.ާ0p̹z&9} iEmtl+Z?uZ7²CGZ j-Xb: 0=e"ӲYrxus~%`TzogpKw}_[c~<`nԘG6 4,=tlGO@Dso5c`L:cy0nTSxfP@^!2mgdKMg(/W@~P<7"H/e5O݈QcA Bs?Z;Z窷W0rYe6&]:_挫%TSyZ 3 ~hx;xr}[}J2riv@prn\*bq_DnaJLJqdF_=zAth4PI#sEm%^E%uQ#k}!vxlHtazIuq엣ExoG8J벢M.a'>%X'|вeu`nT]rw5 ~L؃pnm^GSLW3mGp.׺8NcUoVB#,s=w`͚Vl5p6܄2'bŕ:DPӫ69cŜRƊÏ 266kp/43s5e Fep]MKحO0Ŋb1e.#ul2<NKB,p@K<$Dɇ@3_Se_LJx\μUS߀ƣZ_,CGǟ p:>t eХl(cQSrnoex@];}LHJq;[e/ȉ\(C!@F}/s|U mWNHێYk6^)M &S]oa-.DW,h%9.k^vUT:L]B. 7[,j; m1TQR7 Y8**{"ƛO6{),4rbGH" X#·NeDpXG!~0ǚ'0i  zˉvhtAj E=MXgΔf92mI(81 i9k.7s_eȜh{;[8ůq2܄2'bTFk*qol}O)CN0f`r~d6mSŁ=FxLn󖆧S:r=,3KSĘ, SrF`wPPu8?E.ulF@EOs F$5nD~]ԜDqCgI((nZBŃ|+6^ oz:<ZAc[zRf;6pu! ,-TyPc]aNBR ? >-1'EGfQ}x Z{Y2x6ۏ|U-'Oh <-[@ .bNn#r>l,8X6FHӐoaaJ4bA!Y%j{{y^0.:ɜz-A03|z]$S_"Vr;JZOLfC {6#4OVQh+ۮ71عB;#6P@s1?wkrdU,J7: ߝib P֝Qs,GzsD^sf}+c_%v4kV!>M e]CRM-A- @SdW\=AS^<5&0_,CZasVmԱ5jʍ(UTVWt̯rĊzހ[㔹Aq&ێo^Sv70fbf M 'NVtvMiJ, eN Q5a%LZf\x{Jn p= Kƞ6 Nd@WH*UPy;~M1KQt@qwC|78Lwm*>~"ƌLr a%ϔa̍'CF*ĞQkZ7krM/g}3EoGK5~1yt鍈Zwǎ5m1yH__&3>^gLZm E/~j34QbwCE0tX%:)췧ϋ C |h Uɉ R9uG-D}M.ʲJjgZ-qW r6ol|<~izY#GTTdqjnT1X@5#||v|g>/%u;dĂ ܶťג+dL$e2hIuZ!C# N7h 쒿'>aM>U|S#J.\!\&JeѵNi)+KEZ~PΤzA`ٿaL6<K@gZA T݅xhg W^b^e*|PM}-gدPWZcÄ0] o[|~~Cl5f'YG~byIs?za:#H_ow_}."^3AWGPe;OBιd4|rDln m/G1{\Awje~LQ+,YFNN?6<el:uWvr c 15o&{/˜0',9ߊf6 8Lc'K=e~%>5|@~dMn2. %7]}NWQ(f^۽0m]/j޴DDVaaqam|-[ˋU\VvuPaf?xq}J GD:,D""D$DF Ppw6 Phب1W8W`/{PO\E33p!SCPnc/""D$ky`&uvƛTF:yΞAAAr߈QuSBD:$vcr2$wDr`}DDDDDDD$)`""""""""" cH˜$""""""""0&$ @""""""""" cH˜$""""""""0&$ @""""""""" cH˜$""""""""0&$ @""""""""" cH˜$""""""""0&$L" )X|9 L$<ȣ,"""""", =22Ӡ-B&*/os2I$bwEJU׏qwrzgϜk*9H<@i$ ܓ;6qw\!~3FMBpp-s"RL"*:ּViiFvz%T0w w`!6^^r{χP(ئ!ׯAۻ吋(^l4?s u~Iktv^Ɉ] IqrVIf2qdW{{?r yv=k2~?ʾG]<ѧq}tf doEadV׉qS> nI)0 8z1Yi 8i6 taĸ4-:Ki(>iMa][8p({(i4FӿFc[HJ8 I(wϪLfǼW↯^*z,{ט% ֮ 9Nb뚭ؕG oN}_/U-v!CLYg~y2$@}Q\lb!6CnZ"gbfl!" I!Rqeb-u ~c+-z [?rFOAi/! mGDZ(P׻xiwLz:OO[;ѻwFQ:2;uWqQpn'ΚE.d0dĮH*׸-;ĸCWզl <(}˝dla` ٘$- *ݝRܔ6ݨ-H~uX {t{pDċqo9pI|og?ot;d߯`c+o7&ꅅ@?/1յiI = !cDئ!׏I 8.~r9==Q'.C吤0HiR'jJ\x膶lL꽹߀>^V]l: UY WQ!0[:܍ڙ#5SЎhfW3ƝjOS)jtY/;ĸCNi_GC#W@ }ur0ި((0q=QQ R<$''HLL@Ӧ-d0Hҩ37ǵ`c*z80 -؋9ayg tg1)8 o5MO7|| Y?T$ǘȸS)^dz[ #x;vSPWxgBbܡ+i1D0#%A.cl!׎wnR@ۺ4w$U+ A8|܇>>H$ BK\>s#5bGLS70yԫ,(M=?a璹Xy'L/i5;[pwc!E}7u91uXgLup,ϸC;T6;[!mٰnj?"Ռ-CLN=n.g/=/5+޸ļРQcݳ 540H6.:6mYl1ރCנ`$L8uQa/@!g+>|u)r'FʴmڇxxP#n q"U{A;d{b00c?8v2#ͺu-wq*$wGHd d!)>A@Sx<&0͎F4\.h Mυ!==_IL`%M3 $dnR[I[TE-r̓/I1GŶl\.]A~z|I1M⧸yx}ŬwPr{Iq}K Ip8 b"b!"""W2@,X&xbbR.C I\l1!3Mbzψ%YfF$)L1JK0BfXhdL#a$SWh4.]dό;DĸCD}Po1'%$L$X@DDDDDDWfI4ڧY8A#s.(}ѭ @{zvS*V߸㥕K,mw?u)%<eT@$`$Ϙm0=AL5Ot yBe~(jEתr!""""c_\FZsI'ID$YbOga\oy0_qP(QMX>DDDD:=X>z]Ij$"I]͉)9Dv8(,""""rI.NM1_k#0T0HD8\a%fG, """"r9ŗt'$H" "){1z̽~΂ """"#^|`n9t{ I8_rIX0MDDDDD7F  IsiXDDDDts/FFI {]5-VNÏ~}^Ttd,b?׸ۯي!wY@y n[B*<,\s˺˻Tewq%v,YIoǦbb345/?TB[gܹe]c c U5DOb~Z rB.}=y0ߏ*'vok?~-I@̉? 4 I #&Q{r>q>K%cnJx@}x=; JMq{8 k?@`<\|\8۸]Sx؟o,sQ0nL_?^d3˺#"u:6F<]oߍ' 1j@Pӟ`NY{ d%h0HTUړv@pك7y y stm" ?o :q<yy7xC"HY?3wޗB u'xy;OVst",:<"blal+;b3a~l1 lLz'Wl=^< $ @RGc/⹉eb>ƿCgDjq[oS(܋?rz!:~:/Z}WDRD_(Aw0j&nx(Y:D<"blal+Qv@@غ~8:{!B#(i~;hXpD@Ut]kX[Ϝ A U4> JBcԾ @`:/[[<ަ d bgςyN2Z5O .nŮtOmM;l/чܚ='[ HI;I_-z4N #v`wXs\=go NȚWfPXX`N̏k?\aQ!7{mk @"@O5#!w *?L2ĞzW/\(\\+#hL^P9#"2»D~,;Σ+TD۬EY}9ȹ/5%2d @[WYJ2/Ý_ID$`ĵW0s? (E)" 2 2Ͽ˻UdwXqT3pbyX( V h 7yyDBƝ4[|ԈwSswo0cC:j NX0wYzhMY#11>>"H,"EEGQ9:{PCAv~+PKnwհ=wX=U_;o۟QXT;o܊IC`+c c Ug3 ?>z~x< ߟ !C{ػ{'ܒuT!W(p%@^g1o _z Oe!GEނ0]ʮn7O(wKtCQ7ZW׏YZbQ:/Hk<"blalAǻg=>mx$d.{cP*-5((R_jhuZ$'"yEhx8r35$l_r%$NUMb}۔ŕMp 3Ʊ \GQo7ʺUY7(σ^R'k;0;+ u1nKdu&]%XD$&Pö%, $ b򏈈\<<=-cc{>L"7Oh~r """"" $" ̹ۘ!sba$I 04li2SY 7'_""""" @",EIw GY\ǂKe߼{&H]扈ZH T*Kߍ=ѭ$jhu3βZM@$ @""""""""" cH˜$""""""""0&$ @""""""""" cH”,*rqtLؗ-PU_gx?,꾃 L79C~3-IY+> b:è'%/ċCi'@=2-هS@s;ѭ͐g`ʭ8\hjaׇ&<_ y໡u ~BW BHwm""Ib$jt/|1[ȏMAp0_,;~A^,jI5_A3Y2x!W)`no ;Hշ@rA meZǰp9=n=#]gcdDtkWIhh4ݼ.;ˣ (BGT(7g!nD ȸCDlI*U2 &1wEC&B4~P1lTaNƯ߾j|״"C>R3Pԁo%b y/S02rByKp,Wͺ|PWC2P`_pq28fw/GX`3*wm""ib?0o;_cňLVk29dNP +/Wќ7ã7KzKC:;FwIK[C'l,IMR].'o[ h>|Y;D6 4`KZ?`w};cB[>OKB>CQn,~C?\D>3ka-@& / 5伷Dj UI1Mѱx&w.ct7bܜ\(MCD$6#ː=Kl$<#-eG1c`` C̽wTAMǷCm'Y!M|6$J&t1t۱3ͻԁqئ!"x 0QEǹ1Y( Obu~7z>XY|}r?eu0v1"b`tHK9% "Ev&|~F =χx2!V,^;Ҵ5m?7DoǧFdw0s0lԺ!ͣ\OR:3nu,X -^ƝF࣡^;#Vg!"i 0]A.3X't$V*I<ݧMEE[\yj `""""" D qvYV-Cdh4ɭV6ɑqͺZd7l$`7aI']p @""""""""" cH˜$""""""""0&$ @""""""""" cH”,Nk(DDDDDDTYD{IDDDDDDDDD 1HDDDDDDDD$aLIDDDDDDDDD )YDUK3>mKZ@Fw ƸOơo f9&3r,gZ-w,9k\ J_DwxGB}/YK2ؑ?76=֧a1}jڪ/F>M|v'"#f,ZAL!+wm""`MZ|j#;2NaǶqhaUW3n~wsoDa~xooo \Ƀ1=@a~NGJ|Źc|tz%U?{wz"Dh>/"iTJ8#32b{ B`!"i%QcC/DAt`#eTU^z GYvse^1 W)`nmc0A\қ˪ Y(^zQ5]p߽> 􇋰<. s0|nm)7qئ!""+&25B0{pgjZ 7S})zD+ע&ʷ}eP"C.e o%b i()PPja MܬQt9B ˆn}LlXP {y2΂qئ!"";L] !3(0?H&C HX ~?C÷7 9_!<' ;/- Kȃjzej_rRrs0*cIjݎϿ?|oNšTMCDDŘ$8}('fjz~4>S+ q~'?=ƌ]"Oϳ0L|`ԻߝsZ#cj!:ߍNMbQ75 qݕVrP̸CDlU{L]5T^м3%2]UP.…㍟d{(yèRPxWr[fr0_o֯*o9?8' 5 ;D6 Y1HTEظ/EK ڷϊ=Zˋ?*ÿ1}@$@0s2%9qU;ΣжS[/q/gc'sC4rCj%GPT;D6 Y.DUb@җ{>@/"FF ylI_V#+1tF6|6f NϞj /C2,؂#7a/V.UWml~/bQX8z('[ĊY<kYw'kQ2"b$#%l=xy̻ƿ4yXDTD @>LOj[w"dߎF8>& Cv|jyMV~clֺV?;B'[ qEaZ >]1jp1G;D6 YA`)k&?IVa7)G:%xOcrss!g'*RVgmºUY7Z<4Mr뿕Mrdgea\.Mb:[g76Mmbޅ\+#""""""""0&$ @""""""""" cH˜$""""""""0&$L" )PT.~j_QEnd]gHDDDDDDDD$aLIDDDDDDDDD 1HDDDDDDDD$aLIDDDDDDDDDdE0G<:]A zz &!?ar@˙AmsӬU1aԓ}KVᒌWš}OXӖC amY G֏8y'1gqw<5ypq}$TGw`j.cZD.s[ wtA1m= ; ۈ_~ ?9(@9*&2l,F$`cިt4ѭm_wGbظIhu Siunx8 7萸s|W:FUH"bl!"&KCC@L,#yqG}G|L2x!W)̻ 7x[ JUAc r6EL2‚cX{~h7N=#]gcdDtK+:#&Ԩ#N` a_m#IJZ雳7j"zVd!"""ibii=yw)3Nϧ=8~:<ȐL=!u[dȻ|i-e]:coWn{4:B ˆ$vL@]HҚÑv2r^؃6Qte ݪxO6ΚoÆk@VN FxY|"婂[\3 n8l+ M<'#YVk0c Q5 эPt kgg)cX|81!V,^;q4m?7DoFdw0s0lԺ!ͣ\OR:3ny1cgGhsyi<m;(#ˏŸCD-DDՃLh"c ivX&MEE[\yjv $"""""HT|u׭ZȺi[l#;+ u1n:I`7aI']p2""""""""" cH˜$""""""""0&$ @""""""""" cH”,Nk(DDDDDDT,=$ @""""""""" cH˜$""""""""0&$ @""""""""" cޝ7Q&mҋ"(go˥"+r ^"_uFEZEDQ@Er^JڴJ~ޯ׼晙Lu_gcTPZVvZ-5պUdO%kHEC_`li:a#ӝy=r~w1&4PZ?E'%YUC/ ZE@Mg_mW-P.w 5Be' J-GVE&rU@TVFj^T3HiWyِo2t ͕(XC+ůc9>󑖕lczxHW {hř\,ڳh&.>K|Xhٛ4~R^{. V.*~ =U^[[GUcnKzib_zH;-|KJ?Ô5Zٯ&c!Cպe~^v@2TIm?;Sbxu9d(MaB㽊۳PB=wb}&k|vy\5ܩcg_%l];r:D;-V@zM\?_jI]Z<1 0L~vF FQr<c L:DP̺"+oтfj;bM|zXi.9Lگ8]=Q5Mh?訍8 PZ*ٲ.vz~' oF Uz -uO e|Pub٣/WWT+0+ W6i2XPhƙu;,)rݞ2FL^)ڴUc}?N_/ׯk49;-*U(vIO9u`6%啅EsR Ae׍zmHWuT#Ora7Uo&aھn3~Vj`/\,ڛ:aAm ([I2N@)enCbWZzv^AMz$+ߴdfUiPORھ񜟕x7:bϾT9>'>VV/\ T+¨lYܦN9gJ =h{/K-FYMG=3{)PbۨMՅZƻjڿigoj]v 2:" CvCmuj[W_oޫtK!o4rp;*';Uwԗ;TW!5Լ=}ǵ;i-:Tb{jrw>4gLH1|nk`& N38jq0:'WG6> վL&O~w,uK??. [PV}sZ4W8}ҍjؤJ˜>Tj :"Umr8Mw J{`-cDz}3Zi Vľr^ BtK%TxiC6L=9ܽ F7<։=ꃅuu_%tqnT=ӅK--i1O>V>oR_bp8&|`tr=On߻mr}T0eggԐn-ح[c˖^s2?5f-\\4mrnv)/?w/#1#1#@jITP1#1#1#@(%ܵsq)!˙U9َk5㟔d V4ja,]bsXtxB|3'EH5r &aZǗkr=4饁jdq @Ÿ;|(5T'2RSӥHqVURY4^T<ꥋvItV˻@EEXuȑz:-Mx'e8Y6ƪg5y?Oݨ T_R1(\mYM~̠K{ )s>xyFl`9PeXjmr.@VL![ĭuFΆzNf2jܤV5_#F׮y-P"*8Rc e:O~QwE҃XWy}B kE 'rr.?`P@AŞ)6֨x+ǕfqW#Gq׮y-P2$2j|z@MP&*^(UT=Lj9RC#i\zZ\,Ƣ_uˀΊ :d6*<7PG=]?f+S#E׮y-P2 *{}ܧ-_Bhgihȳ^Aot"+o;tU[tcG **$ze}zACzף_%PhƙRXpr~S9־oTG&ўpjs qTBb][dHebO?}tUM.=*;Sj*+T}ݎhH<\ y;7cy#V^Lj;@5׮y-P2 ttR>ݑug$uz\%O_&ԣY9'ԇ'4 2˹@gOҪw+%៺zvL{8Ehʨ@"J߿Qnm%pC&i ,9OkS5ӓz,{ޜ5I,6=q_hq/K4},4v{A5]7E krP55N]OxӅK*c]Jp8zȟ\&׿w/`JOO[˟dI$r1+-Q ]Od,j2*5%YZ̹hJ[&unSn.`"_=?Fc$?Fc$?FcTd3$rF@ @ @ @R@ْVۨ$AQMk)z򦆪b~*%E{_oYwFл{iXAslxY;ݗSS_K͞cZ;MpX[ym<'\[>*WT.^s_! \@)eXٮ_%SqDH>ԤmL5U:z7d4(_ ٲN$[;w^d(f jTKW̭ZE_;YyL9Դn ~z>]CjgǯTcVѧH3VЉV%qBi"j(ľSRVAm?|!D; rYɿ㔒NxQ"jg)CSQڬG 5P6(%j`8&+<08RalmW*@$R W?(zܥSosRA.>@}wUTnV!kQA;҃շMZ{q $+\g:jQ Ҏr\,vs]zo;-<*Tc84&y/?U3JYڳdFN?KF 4Ro]ѫOW?=Pm·Ewbԙ@>@)zLw%ռ[KVwo7FIk5Ot `%cujʜ%0\qn}$ʼ> S|TRV#\,`o~F߭/VS%WQQ7% @F(e۩P s(ٖjrr(c =5}:x%b<:JMòme7娦VM|\,zp֟WD@lxbTe}5p왢K꾧iڹ7YT B*'}RlrM֮ߒ E׮haz24T]/KݾR3P9hk[16ª4M=j)z9n_K_ZYMzװ,'JuGBMt!b  @L jJGyt)v'X8[] QB~7F3~374-cDz}3Zi VľGqDU ! nX9\kpmnr\_LY}A`ۗ_{˖^s2?5f-\\4mrnv)/?w/#1#1#@`…TT@C;wG7lQ_G*~ H~ H~ H41}zy!|erRٚ&w|?Ҷ~6?ޯ.q-xRvξJ|@HEqdȖSrfTX$e+W˞/g|MIm7[muǖ}ovg\l<#*_'i5koQ34]ƨ[t19p.͟:U{z[ WUG@.BS8 ۡ#렇E5=Z"e^Q?׸"'yV%6Um89"N /Vс>T_eOjtRnEy{L\O {KݗSPs2k-G:aumNWQ߫ꩊّuӞk˒R@H[tQ[{s |_Bw=ڧ\}ڿEBjPlysU g}tw9濫Ɋ RjѰ1M}[MWWQ:Aw%kG?z^ծNSK=$TvٵS<߃S'3^zx@+O_9zv^=:iچ*nx|~֊4J6y\<'+]cu]}Z^R`R-S:~ݧ'h~6.sfٮ} 0næGP5Cɇh4ml¦UPߪcא2UAsU#[Aߚըy3=5lڴ-^B6gPyyzвO:bQ[۫3~B|Y7C)MnIG_YD~o#[v~6hoCtQꛟH9 \y;OLSQjP#o^q5fni\ŭ.o&/}@J{V՜=mt}V]fc*6ZwC:#`lF$F,'C{7oՉڷ!}D?}6_Rq+;P]l6=Ħޣ4 59EϜ:)qT߫6!8=uu8:M?.YEݧ'腷WMv9yXi59rn+' 0 gXMUpqǹ #&\Uzz Y5~l;׺!ǩb]!~xCoO3CtIui@۲R IQ,/ P^#gꥸ:nR`Xdթ<9uB Fe%PzpgOܦONQp]ѨyaUFv}7DvRjB9|7JP *~ *t/*i$ռyߜ$kbJr+ڭԾmy۶/È1dϺ 3JHݤ3wCc{޷Ij}Ϣ5e5FuM g-Z*+iL"z|jyu㸎,v^wDgl}J{Q!d9\W\kZ2z??؇)^YguyRC_YvQ[J?JUjjU-]',QC#]0Ĺ=1ߦiPǸCvKP e =0 zX" Onqy5ۨpzbZ]w/ong=:dj[}|iO~֖芇nVon/\ɿ? Z RakVE*U3IS jLS"zgm=,cL)VAutq0-eY+\[8?SU]a(҉SvYnAM'__)$Ndܵnh\k:5(yqdkgոYG1YZor "˞պ)j⡪9A6%tD묲C4\#u󲶗JGڣmUpWuWFj:cm̟5Ae!Ms:eyfۋ |@\4mP:^xIkcܛ~2p.o(yl;\/[EKO~{*믅Z4fV&FEWkN(jTz%WCԮ_Cx\aV? Q@)GIyе>>+VwO̜R/)ch {*r 3+<*V#N9hunC[+$7-:S?Wk >9Z<Ѡ)k>խX򀪵!ʾ"m_rq)/ӪTW:uJhZSGk6|o{@>췘!QomWgp _L˜46Q磲6:hM-  q>f[>EPwMm\cUMrJ=ӯXJ~24V-yg*i}8i\T8Ø mu}{}L;{ާAS[hҬTDzmLSuT46YWUQyͽՁbaDqvC4Wu: EuRƍ~$ qBj^z{:Q6$SVKbJ]nm ok8ϵfm.rLe8K$s{}oC%hm YH"(MS ko՘Swhsp ]m:Su5 Ԋ/hY)qB)ԹF#h>YRU/q9rcC?}qh?yb-ubZp(JWlVo/b.k^7]gLsnMqB:E^#n"J~4EoUcd<iqKF :^+~WS~ٗ!Ub!~T|F鲘ڻd~YroP_d[#e=VRXjyѢ?:-_ky?Q}etj&ijmeuOmӡ3DXc/թAnャezoic|FqtQQ~g7R&%Pێ_~Eq뫚hoJl*m{MjPٲvl6}Dӣt _TSDH ,e0X }Ј4/h^% J8@0[<[Frm/=臘mMZw/1sXj-Kt׺>;vTe4iӢAJ1AG^_v%ĩŝO鑈55ejjӀ-bU+W}G?)87 \uS/oN57lD_ۇݐcS}a<˳,)~nWKT5QeVY#pW!_k?_gyRGeoiG&HPڡ?|5x!RRԩ!H {ݥo%./~xj$΢}k钅:jVۯU-,^ vXM+,gԚtW($"DFWhfC«G˴n3#Uq>pc[@`({I%>75)07qf2L)'UiݧGҪO~ }՞y#4jU ~.5 FJHh+WU#;*@mr}+owrT(aHuYqzXQY5qOE 28GoEE@<#US/+uᅡ Jr`=^U/'!Eh(uE*ɰ"nz!2~9 /+<S5٩*@9-$`xfp_.kÁMBSFǂu$@܇]d硿vy_`{w/`0*BvWsW3ZUt  *J,x,$H@mczKNzG @z`6 ɽ"/4 Tvf )WxD> |9(IAڽ`Q $ '* I@$Z:k= n{ݮt%HB _ E% >GPT"d`q?G1| @T) fv HWߎ_=<%H@koZq,5O$C)H{\TAo=H@m_Zq{,l(" $ڠׁ  *B62^ (M;H"`C4=%iwY*l (P!p8ьTH~ H~ H~ H~ H~ H~ H~ H~욫rIENDB`DisplayCAL-3.1.0.0/screenshots/DisplayCAL-screenshot-GNOME-profile-information-thumb.png0000644000076500000000000003266012647526537030631 0ustar devwheel00000000000000PNG  IHDR}_,XtEXtSoftwareAdobe ImageReadyqe<5RIDATx}I$uދ}_j_9HH$$l \dY|2$G苡)K A %т QLPk}ψVdVڵtwO$+32򏈷|o7!_×ggggggggg_>_>_>_>_'GuO?~7ӿ:oWAo[v9Y_`Ÿ;?s_Ʌ黫uZ izr1#Bf$%ba*dYecGFZbaw2CKhyě`ex'J,Dۤ#ズO1[+CASr@B$ד M C`4"*<Ғ/qr. @tNv]:{,_&F_5,hJ\~Z6 hv)ⴄ;dj8H ] }WIpm9&wUK/>(ao >33te9FYĎ'O֭[ſi(]{8V*{괘B4=3#,g/5Lߢ33TcM{ 1v#;\ >Mdp{Z Zn8#,XS304~@.ab8)rGmu 1{Ap2cfFbQ0=%͡.}_}c#*o, ]"lki9`{6 8 9f8+ѡVCQ3lp0@]!Y)8[S zx&&'Q Zm2^g˫A\_vծɒT_[v'vz`|C0)}W3_ ~{8Zc _t)Lu&H\6#˭_@Xmd6+397?/һBJX9m!44I& $ A3MvĉaY%  -jNLtn 5[ EkldiG$#sP)qxjffgţUcmM$ȶ ^#u;LDRC1R*&'Shvg Ņ 's1GeONyN}fi7n>w~^eq}܈\'&Ns:;hD'fQ5O(cLx ګ ]0 0Q9 tP32~R.6-ju{.`ЀSc51imyN6ߏhr8 Ѳ:`Sآuw .q-%e}#ԃ%QϪ1.QsR{!\h0 9~dRl_ E<wQK&{0bXR ˲乬MR\ϤY^f/V:,Z)hyu}($q㑦 1N90;cCHpra`ŘR ^,U{|jlZJ8ZcS f!v[.?V}͎f 3ľT{=봡  0A7"$<Yl]3 r(k4ieŦb)$ٷD0X8Ҩ͏gvZT,WXF oR# ;em?lMX;P2d".qVKtRJml K+ 4+Pٖ!g*5g+4hʁy!gy > 27\nwDL0A:)Zynɉ! |(ρՆAJ>M է#69[䭄&Ǣ8|UɌ7K_ "%)zNYXY80a#8aln*r-ϊf:~Fo8/{B&c*:ݡ^‚$,A"\ ։&* ͛\Tl=0¬]fn41Cq;~7uͻA֌]4QXn,UIHE]8֧שj3RTH*KYHvoru:[\N 2K &1clma9e$Dv2@09\`0>.6n_yi5VLzCO6CH+JDO׋dZ[\ԸM_@u 5-KvnK,iq buA Py)xq7$Уx/$Mho S-ВE7tUޟYQVH,F!_O$R˦U`0@ޢRM2Yo):9.!Z[Yqf r0l*5InÃNe2b] vȎ9R-&&Ysdxe5YBXӋ JW)%!ъ mX"Nei2 j+RnIQ,2 xC4v^c] GK33#QL!;PC{ՙ`밲U/Bii6Gf&VP=@<,m_2B߻N/\e!\8a hEW7y43Ջ%?{LY$׈?i47+֟4{"xRiެ_|G `272D=t3Uɛ'Q>>A`,zDm*R݇1ۥ -d_rFu&\ k Db |l:̌vXtx28z8:Z:A2l?j[&m0]>*q`xzc,cxmc4n  OZA2n<|C _:_%ݸq9 j7&Df%g<&iA;/ d&G퀝=jOݧO(ʜVF#c *D2ͶLY`q:?BvIfcwtlr8ml%k(/zx`A hRLX Ț Ó#mV/L2=H'K>C53l#ƨsyAI>Ą;JkufZiFf GEa#u,'|f@/:\gdKGBtw>|s3B";x@+&DRQ CLbW599IRoC/:FkΞsނs=x}^+W实V,ёQgh7zJĠѱQ1"  $*p . IݺL@47 k kȡB8&@GnY#<4moJ`U`2q!Vْ~6qC+44wbdyAHR u9(wɬئm>Qp-tdب^٭`jiBLPg ${V|mxu?GnWi+tyqdlg뼨ZDrzAv^,-Qo@*:,MEPz&~?.. oh#5Lgir,$0v>΋u[@a8liC:ؑ@jcq+P<"r֨Ko.MZk/^McQr'jh=D Dq@+Oh  (I O8*nN\ UJF7Gh|"*tS:#vkK?lc>W[Jdez >q`(4c(CND&+σC6߂6lSRM6(hmta&(WʭdsL/}Mgk /m.ZkI@D=F͉79)hijG_5GJQ)Pf}r4KN=#A48̃QlA`ԐĒ{lwd<c##i1Cm$S~dT`/PT>P۟ zMtb4E PLͩU|vl-4Y:h۟ke@-XA,!rAǢ.MgPpc]RߟS xJE rж?{ag!Bd뢳NR#yD Q=2[Oc(Dat/(dDzv^dwB6 Ȼ髒 JxZ1w>ylOYVְ^b29۝0X4GYjy2K)+CJuH!;Jn׃ImKS*1f¬aM ݃Azn[dݪ'J@i.ẍulonIo'Wz $ /Dl[2J)XJV2u#ߌR5kPiÒ$u胵&xj BG(P\"&d[$JSn`;tzGHiGHHz. !1;7?Ov GBy >fBG5:CA5\tST 0m[ O~#ݒTx2Xc(-T3><8%3ဿ8`FSv+k |@z¼> ːC,-љ@ѾR[FesӢUUm3&G&EJl(:g NocND}F|NHn T>j,kK-xP12bCә.B[Rrk)|oFj-p QQxڦRGRD,gPQ (a`kkk}ei;z,ڇJYFmfUh/t[@zbR{0ө)7V~zhKPFҰ)cZ,x=VHKiA!+汻p6GR}^lZ {nx@]<ޓN:/(`qvmm"$ Ein̎{woJ$5Ye7s~d~K?[28'Tb?yT*tm@9O&!U+9ō1FEH]w$_l%ٰ~" ]P3S4n;!CDxZC^!eH$;{KMaIt $Mf֑/Έs0씀io͝@c- u^a8Q^VDrSHgjb* Ia ^Q`n^+w7I!cjy&̺nQf$`ǹDK`evfuCF)hhZn՘|cuXy(5 T*nHG4w tA0!sH!X\O=Ygf{Pf/.^hw DKF".>h=b%:_ߗ1O}(ŒIM"S@K՞rZ*wIIgq灶K$: /.f\ZW63hFKZS@No,/a~%㑞v-k3#ewb)e p`dN3ںTo2U>^7K<z?IX,#,]nm=}6#i]2# T0wҺk}6Wvd~tR!}uPpgjYt?Zd}sַDnI-L 驫R Md(rgc:;o/6`-/k։0 nfdV'Ed6ti Qqs4W sz:kq،A0FI-֠- DGHkXA9lLYe1zMLP m^Ml YDۤRcM_95Bn=*)t9j. :@` -)4|:"_{Uilu|lkO^]Xx>Yb0"?,p U@@4[tTgwU W =^Ye(|>C>F9ݥ5ִcs/}/XF#׸fț2n:H1[n׾aceW)~r!Bf}s>sEHz]^~PWy tɶ UUOGeV/znRM6h/"`lXWA*!dǔ@e17 ɖF9 v m Apf Zr9 r\0 y+:{f C3#wK/9 eM Xn(^a q`/.k t=1ؑҨat!MW4xfXt1]jKˁ[֗~R^=-1Hp臏 7Gd["C۷nIE(=Pg)Bq~q[-9l %(cC>en6^սD~y7Y&:m:i.}/ v?xCh$*-JRQ ƣX TsRudڃ%vJR7X 0 d^|~vI^a17AvymM^hT骶a8nx3TxIׯ*I%GlFґ"C,h{wnc$S6$ vsƩkt a&f))Z aoD!)U8[_o dz}D_صy]C%5ʏN1$ z 07x ZC S9בJ6ASC_)W)ҭ+i&EQTXؠC9NV%ph"9 !Н7WjMPW(?1Kvi[85ҥ4~gjx\0el9N"-`nDll5eto  SAf&Pj5iۉmH >v6 NkԘϞ9# aR.?izm!N(F_ŷh#ؐڊn/e<ՇW}n9i#⤷XP):A[٩bKR!|pCFᚂn 3by |*@ETy V` J['56$M=?~L?.n4L}TR`w.QP@ᄏ/&5acHp$DkR vRԆ<[ F FC29_B4]PR|x Wy2, ,k\ H0I#d|rNKN9P烦> Y5)ͲmRv$O3S;,9^,M/%GXu4;Adiy~%@}TwM{n~tESc C:c~/6Gz~G;$L\]G2",Hk͍R-!n[*6#C?Xdd퇢2fXJR$LM#!HӸkJ.\kX(bi7TTyhx>W1R;lZG[ WϾ„H{#6w}Yψwߡ__ݵf ffg&J7b0$hPKAHsa6HhK`ʣ=n?.p]_;`><7oC?Wv8m윔xV* kZ9UEwPR!M0,( *yVǑjX6%򨠃wTHxTH\7gǢ]U5aф̅@$:6! @nTF *!@qӬ9Ξs1#grk@\һV=Aw;ʡ-y?@ѹaɭCph^MX &xJq]^75 'řAmv1 T 6SAsqDӸqׁ 5j-q#"l2!FPZp66񘂑쳸xVYdJ/4"\,r>C?;} [xd0M_hD?'Ct_`BVݽ8eeeUƹ!ȜF5sa,G?֋5ʱ]@m2 2ڼ6CT2NRI/^d;#Eu5oңPalTzV֊tyPX_C5W?:MEsm|Oma0ܥgΑiwh%X4x?xDtZjKjH0?vNf߆wZBJ0 쟀yyrNA9my/Q֠D2&xܑ[AOhy,1,Cz:Tm(-ПXT8|"JkT)I7P OfU:{Y*952Č\g7-6 Uạ$zq^/ 8! {Q<@]!"/悈;jV9h9wb;w#5@J泮],v:45;$(S,B# kH50r̼dO8-8h||LŲh ]KAӣV%G 60l9X+++tM7c `lwA6K6RQaڴ4<(U])IP]6ZpYxqM;ӧ{ 6kzf2kVlڵApo:3ItgWr{,,_Xz*k|A]0OSu_:Vf¤Tct:MsQ0ٳgT] B /[se__________ 3/JG}&p:IENDB`DisplayCAL-3.1.0.0/screenshots/DisplayCAL-screenshot-GNOME-profile-information.png0000644000076500000000000036724712647526537027530 0ustar devwheel00000000000000PNG  IHDR |tEXtSoftwareAdobe ImageReadyqe<IIDATx|,[Ig'd @(ۖQF)- Z2V gO{hޫ,[q;6|)w0LdE$1@ IHb@# $F$1@ IHb@# $F$1@ IHb@# $F$1@ IHb@# $F$1@ IHb@# $F$1@ IHb@# $F$1@ IHb@# $F$1@ IHb@# $F$1@ IHb@# $F$1@ IHb@# $F$1@ IHb@# $F$1@ IHb@# $ ERo1h*v _@g0w4{ c7 ׺zn0؛;öxa ;1[f5w5:`3,kю5 bd"D'!DgiF}kZZfkh ?׵S3--67 5]VЏ=_{nR@~[şc{ :S[A^fjV@G2[[_|B?t@tK|Rgka^{Rϖ8sL  aљM_Ka` Pj& >{#>8&k\?t @t_K^bgoj7_bja9a5&D#DGiYnkЯGƜ9tE(Ңʀ ݷm ?#V[ 0M#FdRUM9pA}Jq-uP0Zmy9[8>~k:hޓ`Ob7`KEnC0}6- )NJnkcqykA4j0 : Mѹ{@G^=szrV @E+\Nr=>6ZѓǛSTY-ѣntFMݢ}{[}3! : :RQzNKl y=Caڕ-lW3tx俷qަ_ut"@Z Ě6=43VEUjk} 2CA!wK4l<. \BkF.P,6T m ҨiN t5>U:x@o HS˦Xʫ5hZYwȲ Beefr(Lkr*eeuwaӡ*~:p`gRaky뮅Cu0~O3`t*FƞoDuoNBggu|iۖjM]=u 8d NVVuTY7e]:5@dQEt:UYYߟ-+jS%V0K;R4w6&RUUC50]es*CaJWUЦ$6]GОw 2d  l=k_9&o]$ܚ 8qD`I~=A @t4}qZћjkV[SfdGya U+Tl5Cw:Ljjr]͖e6}_`-&~9̙owvz0STu* 0rGS.wLcLJJg\S)/%ޛ~CbLf|[uuiuuP.Aa*qt|*=~ZNð1TDOxE% D=mU鎆$^[+p+$~0 Mk:"7LԚRCqVWN 笖әUJy|*ح2efzӖ;vuOG$Erffj Fh;J5̫ii!_ Re*׌ R=k냷"EӾVo@>:'JuGli{YP6OJDJSyu_]5-z?kQ3u>7QwbOnz9~-MEF]] CZǫ~Z"ӂa jXzC-+*Hu(kJ?ŭCziAem}{ֲ oׇ B秨_>*)yVsv(vhxPQSQiW+TW[@(#éA=1\*+VmUaSݡC^|2td+X ;/֍˴9GV77)l m^9VD_Q`s3JKKWhm[gջfk[quMmvrz#lqÑMhU)*+k"Z،|feSͥG7s|T Y팕2ӣ˲Ȓ*VW)d63"ۣ=5ZoH_oE˯^FmGw[lolBsofj=_WCT0 p`ϯzd(TU!ղ[S_a^pjqy@7~]kFfjhZ]_uJu/+?|FV~|mڼy:㛽}UPeM\߽QS/L395h1CNyh֮4c'iPM+5畧ԻEJN|#neZKwjEwꙋ"O#Ȏb f0.5U&7zny22h;h()gmJlS=1MǞKO_Ln ˏ9dn}䨸2E#q,wdzXk>۟j)'R6[WRjVCGt{W N:z?U*sYPqMZYQ]j٤gM_3)mVفµ& zta\^RafБy}~ֲwa#skY%%%|PV J&xf +)ݕ_t@Sn[JvӴ"gE7QU+T0jd=aC%e+tQ=O=j/.Wr=E^kOثQ)Z_rɝ3P26^וE^: =[,r3K'Q9^8Ie8{i)\'LlWivTQ;ӣ#ӯ/?'3! T"(Wh5ڡa?n{F^e{z\ݵPbkc(F -EQVhMN *iU`@g~V/P5 T6zװE/ۺ3 3:Ro'kpVSߝ-Tڝb.)`?olR&W+[W_ y/[T] jޫue}%OS5haᵳnT FG0v&!L8mSUϯ ?~>D0Q}_԰u@۟;D}UM:gG)cilY]|6޿e.MJV{]]GV|Kϗ+33Kθ.Of<9w429NC9eT4A$hWֽyJs VO3E3`t@--0 ʌu6W?%zbS.eX}v( hҬTiRuj6,Z`h_n]ǝ![%BͿ 3>oakAz(V_iƨ@^mD\j^FzL6SVK܅ߑo6kӳ~bHM<(9MžA}zn^yt/;'ߝuo Zt+ `[4 Fmv84 5h-@JJ h@62;UyGvy떵Dyy~U0TSSeJrJK[]VMfȖ歯j! E8m\OstD&+)^]p/+[׶~C+IujE뼛/םK>x5k{5յ gVT4̝Gӎ #U|yDTmNUa65o Ü;huPtOiѳl vy[* н%\c-\m,aYruWA)R(x|PUy Uݾ bvhU:tH4k}W(;Źeo/exՏR}N@-zXr:f 6Wc3mo]͗n+̻W_T\W^jH }n͘6N/-9l5un\֮ϧMaXn~®0I pk\W/z_Xf^ OiHYrZv./ſ޼l|44{`F}e~pBfgUwKGN:q->_YZ]ԣJ3qo*];<* Z^UQ_~u!aF]+ϧ 6XTV6jʙB4UlU4/P#@ *k| Xxe y݆ܩ Z}ʵڰVUYq}{{˫KRC 2v#sV!ẞm#cSЙ4}JGn:PmC9|MW;TY^*0S 4YaWem(^u͡c۟nSO]>Kp|U bzgTf޼lBݞw۳fOUօH* T$e7l@h{#vZ~59կAvJVR4ƥir}lY>@^Gr"q:Q^^hX7HNV8 !   th5;rݚt꣊¡ TG2Ζg-+nSՖ$'y^E. J0fj֭RzuY |'Ȏ׾@W"DJ ;B@_]]JR5 Хy]~)8NgW[j(ޮ2 y۝ly3"bfdfQ2( i)_st"(/WI6UWU)go6 ]-`X5VX.M?QzJB8x;  .ؾm5|hcLۯ@~_5U .زe vj6]Y9=TUUIK삚jh6= 6I*ShR ɕhZqq|-رt!zDW#EրqV`By^_Q}&+;oB*++̝۬& Еѣ?x Cf]M?_8 ) t { B1IHb4:fS(''P@wRRZ9s>koT @]iz]ShS`{z0QA٫7n`V.ְ4``y<^@tKVUUӘuÍ(L'@XΟ.Z 8X=pJ7oW˖h;v.Gtc>JC֨1G FˆPj4}5zѿT}4[$ "î9) *vUdb}ȠХ`SFڞTй68hPv۪~Zιs{ <,C#FRYii@W 2ҽZUaK4|=5b6kVp滍6Uw"8/fdS@;Ca 1"T8?綮r32?z֧O_QLK} ,Vbo{"Ql S&aZl0udCN9|zf]UAXХgs^z̻*zu}SׯХN81Kif~ڀokk>7pl@#̬27^m(FfEY'\Vsln;W m}uPAt9 tWש#7wZB`yv|:F α].BtBPPh%OI c5(7扇<3IѶj7vitOlf*9Fx_2ySC@+¾nA^Wyyy9s>#'jgcáh`U =a]8ޮɞ&w27J%Kl+Nx2cɶ5>E#:X,Diy]ά楋1}&Twg Yʕ+t=i~y4ap|@tnhʨ>;H6LTQQ=P-Z>`M6-:2Z`&n(>6oެŋoѪ7}b*TYwت6e ϰoeN75nʸ:+Wڸ@WN~Cup:h@EkŲ5ksK;).eXg3Hi]ծnQNxAtMmL\R>Pۃ>s3 2n IKlld Q^fjÆsRN/.ՎJOdvjKU|M4I T~4|Ύ>ph˶UjUYYWA6sex=2Ҳi$}}B~§`IYPͮՑ}=>g ~g_¿X<'F4ېHp}t0UC.c6#:bze}O?]%WM6^5U@כT7?h[Zrm۶E7^pp F*oEu>4v`ntڦUZTTG@Z>V.S"'`oVtUj߻2E=r%5RF.S >8aY59otWr˓V Czj@c*\]#_jiQ)sfoGsxgO|V}H QЊ> Wkt 7Mm'<1ި?? )ys̹G mׇJˬ'ؕQ:@>_SQʰZz.yV~J e7i_~ՌcG]=-76olz5TP;j+V/ߤEleE;x~]i^}bVZv!:򤥩JHAg~rϢ.Aie՗,wF*3<Ƨp1d:L\R /pSO(ڨof.M=qJuSvV,8@ zz^~L\5;h4+ctS߾wt2UZr?S:\?9WcޓܦGߣ_nv2[9`M.9gda(5/U7>0{mw׭x^xѨʓ%Z'sEjt>Zt:)PZf D#:XYW]d6> ju k~0H+I:Zퟮ3>c5a`4L>g/GN8u|Er*կ릶n~JvSOGwcwaƿðwl5oF)RY>PJ*jrFɯ7kujDx5A?A>}=iꫯtsWC^~?*/+SN g|eQYJ!GFL}D(6j350P֯@CK77tOv_+]?)G.}S@;NGι;-ptx; D fG1~=u7FWc vgs|$p_6S83 n²)w+U/pJdtJ˪<[רa9e6_l6gbVH 4;>Y=tǩ,~E *VFOu^>V꘣'kֻٳU\CkV}$gVµ%ZZLzֆojӦM{+h]?RZ^)i25vGP /6~!&ǭkX\kLRP/Dv7|fC?[!50nСU,!-"K7,DXrUW+ _neL;WbQ3>1cY7H6_cn` }m _}Yavَ~ Z%S Z۫aW^wt&P̛Keuѧ;|JJʫEoVYSS+V_߾Y\%_d{GZnYr~oik #z+++#]Xa3SY9Y, wtmTY+.Ju#N[= cǂ}P9E=Y'^4䋏y\~6j~uaevn>kg6{ñQ4RެP}SaA?m6Ujނڲii׉GA)zE 8RLq*i{_v)њrJ[Bs&E ^l8`x-:]ZpXՕM ZV>N>DRJJP>Of٬:82=L9W4 ]e>^TthiM/,/ї6Z>mntB\<_ 4 ]+ a3`]3@u[A:l {4GQeH֨i95rPe(,GI%zGuۡޞ;`溱RaZ|w:~=ݚ34?xROYd^`&um> IB?>G*,_/u~6hߐV;Z{u-[F;TNCYYTFF<f8[KQu+%_j;+ru.zVKóSTZ\) =Dp>zUsN;8_ `Œm^XGj|OQ;toy7zWkޘ_R?V>y.{k766fc`0XW#vߚ X<;Us?c]'N?r $ܬ*[X 9I~=A @EQ&4` IJ/.+^QFet:5?PZg@SG4;l{?Ԫ5j># [K,s*ܚ^b3e?m]s-U+{jNҡ+p*=3KY^HNy z7rY|tϏpobxTWŗūU}vŚz/V'1M~f>Rh=x4p:GiJ_waof>.9mzU>9+7,2.#ȩiz>ȵS-UpͺhJS߼k ::OјЩ>7 Msboxv+ƚψnoGU] 9uK&#!)~5kkg&N-TTu6rDc4i Etjy].8#O *=f5\M5cuƅg)g}guӋ:9ƃO뺛=/; |v+9F)*l\wyQ_Y,?qޮ=>6{tuُP*[xעhիv6st <мIWܪv;G'w^{U+Nq;y FSh5TO\m-^TVmuMd2 `M=H{)p١Ͻ NҌ) MWW8ؑןp^T9l=iAjT}Zax7G6=;Җ/Mk[pW Ϡ̛u@wvmw~q^(C7˝n m~N]~u}b. w&ݤ{CAPN>`?5Sמ}Cif5;ܶ}2325ƂgXp]?luጌh>-N=k{2lFц0f*//Pnʞ#VjT;H;9sNɧu,ѲYi}f[/ko5*jꓙ2g?V;j,(GeY?p>?ӃaN!m_*S4lEf=@Rl# 3-(u䦫!TKJfЪB.׋9lԥWy/%G\4JKAj#-)E{gݯGc_mS?躉="EI_tZ&OJoE۞Rk}zl_n2 ~sw+G( <: Eg :  rr{Ghh0c  {rY$zWOLШQ/b=QVU$IOj5ʟz& N>wj^*"~=zb@ej42'Ǎʵ{_oU?ѱ=XVUɫP='^qf}QCӨeebJqR`U.D@Z}6]fx :e@, P_{:h7:myhŚv͟Z:l]wX-ۨ%<|tm:j~K~<>7<&S6mnqq-˵!T]j*ؾU}1oܷQ]#tOCoݥIyOin?̓O^EW>E^|~y@N}d؝ե5 }lwTmU2pFɣJm 5T,oԞ_XNC4bd-fΞ&3F;fjaɁ">DVOd*M_g98C)oMl^yyzg UjT+6ơU*e`Oo"s>SKiɕguxBxzઉu喠T.W%뼄u.0 DʩN: aS|)ȗg[@6/@_)]x3z)XE,Nv3UuCnn}48[z<./;̦L Q}V_[qâZTDEfծofFU~ ) e?I]BoSr*-r_[SaxSyh+M`T7ptj)щUc|S|X!Foӽd啣?ҿV/\wN\W4Ji--JO\7zWޤ_ۼ}Fyn 1N> lTիO2R2kK˥2r5.\xf/Vv[S5g9Y;?ʵ{L_>?K' NQOѩh9zp{8ho3?\8N:gKNBWG^11Pw͹7ÈnlK^?Eʟ8CWXDC={3Il ;HgtM "˜~Fr8Uգ3tyԢ=o]jq?Gs#}V d>zz$j~k~jfjpY[By֕t/~%Zkȭ/jwԖjc$!t.>Ql=戞4ܬJ6qٔ +=ûaÆQpCrta9nʺB[U uSb#~ǘK ң(l֌۬'* 4 95-ynw~@jY+ &Y݂x]$|uNBRk;ʧlVYԝʨk} !!t@ï/SInӼ^Ң&{8=Nj9T5e}g| FKWr\|&pKII]X55Nɬu.ed}_Vԝ3k}~q޺Su߾;kﴻ-ֆ˴=s)H.rӾ?yGw mYoGd&ܵ 9Ht}u5m˿0r$!2P¬]nsvKo8u_x\_ϛ[jޛﻧ0_C=,7*_>hLRoUu]pmjuRZ,Q;/Ivwz ј(?mOjl?dȲ=rMTE_|%+7:=౓4ື;U8M"ѫC"CN=Acߍ;"Xާ}Km(ߓt]͕^,_RSu󍧨oկ}Bgޥo[[dٲ-d2eB O^ЖR<-ZMh@XA8{/K(q8[No^ƝwwİՆ-+vr?x_2PMl(jįט3)jNJI?ڭۊgFժ1ˌ&%n,ݑF7PGgӏ % W'kq͏_qӿ Ҳ{/]Vdb;qd-yH_ض߬mv;ȟt WO%' \/*<.nǥc xq5k:3dNs hK uaSJFOa(ІM.U{_AiI谀 `͖_1Ca1t. <xŸ㞄R=7ǟɟwS 9WUS0jn&<9FjCp.qOGR_$dn6Fy`2^y_Lb4]wCI q _[K4 P:+6#N+UWV^J>xA+ڽo|]IOSe},]t;9~ Ԭŷܛ@ush,K W)6&^m_ v/KPߠ^Z;xؿQRjip1c }8̾F= QJJ2ehZ ~ޘmS~WP3>:dݎC44r2v F4A8k|fl>nuWrtʡ25wJ6쩠%IHDv=kT[ƶCg`pHN~nrf6LMP܏)"-kc1]1 5%Anޙ_c#|ڂP? R`.⻿}ƪ?e/~A)͟?[ N Qĵc6O˴l}T.y%1OQANLKUlCFkеQZRB$aĮ3w(anͷNJA^N.U6 ~FjT2%1p=|#ITXߘb;EJ2$tz6[́Ѐ՟)7,N;x{A w?؏eμ #VYB3퓷mhNJ]} kԵʦsu[>9sW٪O![OMKl=<\rSÂec"_. D52otQZb웉wa?}igЄl% !e$lTH3(RsUl7FM,҆LҮϬGڥp~lMa\1>sKaAZ`VykIrhiMa @O0g@3)MwR5,l9Ȇn2FðZۼGƧspήeh!W?ށm_xb8U Գ%TRysAbsF0P;דv/M<٥HJc[i:i]T7'gN'ɮwe X~kXN֫ea7t ?5Hͦ?l3<8ڎ&ĞՅT}_=".f+;nFun P {=fMLG;Ō{Ze10u\tk Vw ɺMU|L#ncV]hmEy}_YH6*U_*1/7A9$K6P7|g #15Vʴ`0hɼFVwddԬdĴ4naҢp_5_Sn Nj#*#^p &&& GUl6[Ցz.Ñ_ pJ]||*ES靖':mj"U.e\&M8jSH:2 REY k_(&k zd'p]Q;>?V92Jش3|a1"BCwuZǥsbχCk%m{6lWd۹rs99Hm'4PB\#\ iFȦ1 [+k{1>ԌuC)C}%>}5{؇M䖫jjb;_~4%iWWv:ph_y8=:xuӶnORɾ!}p&ҍ4 gtNsc)^ 7Wm'=C{٧4ظ/'_s-yռ'},g;?60_ޒbܑ{V፭p#E^g{T~56O߀-;}Ճ<ϧoU:î3&3,͌H  </sj9O퉧j# l|2ziiinˠ L85- >>ƨX,ᲴEEZ:`v},PjQSGXD>ugz*pU0wjm 2 P>ˋǭuns{qh ZN鶠<,Wy1,6)Ʀ.G',4#|}sL!'c=s>+hѠJ@dWok2ͽ<}>EA7 #/T0pߺ?4+¼l/M1xFΈg%xC'3徜65Es_ˢu ᪾ZVꯘx2vP\h?rmԇ3z:U~r*{%: Iiw{11;! ڳ~OgK&NP#АL,U+Bq7=(އ!no)wX'tݚﴮ. X^[L~=8L`@~Pkh\^-%wd\H橱erXm7`\ُ[ uj/,B6^(WF'#w7d\5B9|Prrܥ)7:aC%7ԱcgmcG7σۙ_?ʯ#Wr}7'?ŊB+>I't;N2b> o )WQc)5yA}J&m4ׄ\ЪVg8,jb9Fh{n!4Ks>dk?ҿȄRs%c$\}_q]~/ߺOx|x?ޘʹsx?xvl{mxpX\7Q[dq{q_ًiȿIIwإTk‘[wq]0/3zM^IMTEYu|銔.@)}pᄒ55N^#ڄ\?:^oc|uR:5?P:2N4#ٷ,d+_9)1}X&gﳾv Yҗk$߯RǥǗ3rkbO^c4y`1_u0;21W?EG9vuA}H3h*fPub'=~'U  (OPV|*o<%W|>_UzJDǍQV"P%uRU}HLaÎ|)."'+!t;i$浬۾%Տ:L: .ص^L!ر} =טd<ʝp4!q&ttK7>KOc"u- ~z}^\t4 cg@uYoi^axlw}U7h3MA펧Ud&~a{t`=ߌ'F&>lvг\ISO,v4 }]9701gٻrZ`ԟ9o_V0ZBW71o[[ϾM}ذЌ`_LK@z:Y g܈C>F6Mr4DGZ/"iȑzT𰅔9h  A@8B!ⲫЧD:s$T>*%.Fª{i,y};A@*S&//O& Qx.h C~{7E_Y;QvSI /W#2`|Ϻ.x0haj8]E{W3*_0o=t LA8(p\.اD?%)􈋀r5VI$\HT*^UR嫯[  m#PqS/s<1A." PSY%E"bZsD{JAAAAzO dmVFzJ䋈~=1ʮ*seeeXLHH+aS'[   ™! BĽH]t[oDgڬ"ƪHk$Z   ŀ Q싈~]{}bS֋X}֔pW OA(aZAAz " D".^%E^*()Xp   C@A V=& nDSJRQr/3A eeez8p݈5   BP喪?٣ܡY~ fJUUUR(WŊyr0}:7OH(5" p6]}BB@A@Y)I~JTJSI6,&$$T"WD?9򶷎}ټVej$g[v @l\<6+ R?PzYw#~4g~ ='M>wUETU(p ȳHФ{U=.a_NuuuD X{l9`8Sc1]Ԗkt .od_ySvs")Y&4Ekvoе&2&?eԴC3OcgqUXZ־Ii Yzw.9 ;a1VXº4/L<^~9SM"m?5X;Ppf `!PD^SŸuSVe\"OXLNN&>>>E-{\{MbP9^NJ(oAbTEHC٧aXNErA&w-1nS&b z&Xn̵Y6v \~T @1S5ְw]# ʤC#:ԉU^%+4I%t]T5Чd? `!׷R Ǣv{x|p@9( MD,x+DUC' ѝs:bN'Y}m ]ɞ IS1~7pYoKؚ)ib+eG{dg:L0MxB;3HuR8O0ǺmMčIQIFj7ظ3DiGY|Bm*&UCɂ?1([3x>_ ь 1G?%/ۯT"  " ω7Uò=AWrr*!/񏏏ND#9iEϫT4wjo,.`!/)t3ia謉XJGi|u6qrg|Az,,D3" ^S=Ч\H%E@055İ(UZ(/ݪ|b09Ǡ/;(qeay_c4Ь5#W2G} '|O`Ȭ;)B kF:9[zA>[8/-?gxM@w6G#.BT Ad@6lb WUUEYYD^7,*qWJ19F{ײwK@tl۹%Af?=8:LJ׌$$IALVozV=Mк(=Ԍ?򦿉Cmhؤ  -[_,f&ĚT\D J %ֆku =̱+oMՐd'04USo¸{9F31w׭sff-Y{2yw9D7M^ 6fJ<`Љf1g3r@,[Re+3' %;YǁukM$dd׺{v O}s@; pPK6zO^)kylk AL<*W+xcBOC}իr 1Gg2QX]]-"h>LJ l۶nLΠ@x_>]79c߹@@RlUf"}u\mYYTh1z%@k 7lVeӧŜ˘)CIT>2Vj{Bg3b KB.ecq<pw"5At_e/@A]άo:!yB!=;.Ig(\:=ԕQE.bh^v^@cB@* D\MMM&E={5yR   " xzZAzvlFMDŽG?%*rG" #  p#!xDŽDj`5"(De/eV;6,CU]AA\ "cǢ;1q}4{]eեVJ)++}AWLAAA.NPBs7*p+Tj_J8jaBʡT \^/*H_?U/:RǢe\TYEES^yE(ZPeR\ t<666nC=h#vNTGv&  y\KFUbYKm0j o la[kw(tu`Dd"JE܊,W*Ss655cAѹj 1H}森;T+%vF=In=GމH?AAA8(\Bx(^4:=Ss61{ʩ=攫Dʚ)Z"ۚLpVSbBbbbx7%' .O%JTedԾx-wfvz,%T)+@,NչmGSE[W*~y~i3\IAAh!XNPb^JS"O" UAAA.FPzR}/ ",x+   ń (lIIIa7C~]]]-~3F+PAAAQkiAz _%(WRBu\-AAA G48uuu}l~ hAAC,Aj"Q~VTT'Tijs tB?ⓝz}bWŧ?qwQl^___j>: YB@ANGJJ V5,Δ 9a02Km+/ 4oCBޞ=n6*Q嬆\:W {%mJid5lh;"5Oy

ֽw}sh=*~a}Sh<Z[ &wҝY<~IMDoK~BCW˶u]}ȁ| @D!抇?}(RF F$zzYezXWOcdPe7W',_DzUqx2v'!j1ŇiZ ~ޘmS~WPת:#cjmM+YEQcӾLЏ/\;3{g{Va7pmޛqER'pp%vɧːc4~b0t*n+DkNbi! E} Ծ0" *lKU(O;>5j:WvuLZpeӯlī?q9?1Ocžo-@S]K?5|Y͉>cu]o?AQ6 ~FjiϏ$Qʆ'oONvxW /Es~ȃ}~ݥ|2Y|jGnjV^ZPHyܱtaS3͓'+>y⡣.zz_KQs3)wzxҝ:ױ1gvj9VqWˆ7*:ddaGڼаܽ=˴[ Bs_/ \ D!j()KdHF~n,VwUK^Aٞ8 |Y)MYq*k8}-lݚŠ~00ŌV-&YΈX*`A)hd._ 6d1A%Q}>y]hYǺ ϺΣmޔ7;zz ܽTya w(DU$ƫZY,G˺A^YO(BT *2vN&Ijھ:5Ƨtdl+bÎE^z;lxW1ҙ;G t!]%v:~,a qUP:/m(Dܰ8$>ZIv fͮf9fܘHK'9IxwqL%g?B͓{kNsZC6 LAoWzzK`F o>~ƻm ]>39ύx,\g[[:9J4|1ycY#Y_xo\DZBEi;WkY}>'׊ д~]sbl k~9/߽)3`Cj9:ȡßg sV-ymF Ccz=Lidggׅxz }-U …F~N3l@SSEb8rHJUGZ IU)Y6![2y?E1_)"%JPWe o^̖*J}ٷDuWs_5Rٙn[S(Lnk  Sҗ]I3E|΁r%#(D5U0wvӖ)(Pt/7UPn=*bIO3SXRA/iJB\^cVpTN] ntp#7ր>8*!q SX7սѿ_rڭ:&*3᥇c1jx!fbmA3Cʹ0oKki`vHZ/mIXm`'kbzb$M=@߮D\C{{1ߌ9yhF<;I&2UAƤOh 4ڣ9bwkY/zY絋 \9z)#4[Y;_π w̰^2mqr|IG%8N]l2ڝwo m| 65BWIf;I::9TέXN#LO%430.3^+mۨ4TI ¹SOa,u206|_v%?#y=]vbf=#-ݥ)7߼u C}CI}5<Ƃ[_YMI9_Ħ ex r1v68I,@ČNω:'Y' Wҵٲ o.ɧKD-7#3no%6KrvgrA8TH Fll,V xݐAن1.%!nT)qˇ|Ɨğr 4,|1-]}R-` 4SR#%XrV_eWwRA3T7xy$|3w-fw,%UV6쳰fC(\lhY g%,׏ M -T-kMĄV-p ,ǰp>'?ŊB+>I;h,s ,( 3=casbc[7ˁYBcMY +@ eu*q Mtm[.vYS剺a|Ys1R1 Wf2&Rd+-s0+CUh$@O)<Д>8yw__B\ʏ۟Nӗk$߯Rǥ~VcSd rblIii&~$7OIѷioc$ j5fr>XC0sG^}lN-Խn/>۸}K-cu|:;x;ۮN/1~+sp6pwydT_|# ٌG^>~y h >eEτ7.vgRдZ (AW,rVHe\'u/2Rل)/-:%0\7Iòpĸ{[e2 }Œ$o%?~'ms4E4]PX{ΑәjXڍ ƸL]5S jmџ;X=NF`e vMHEN`(GRչU߶%Иo%gL 9;+Ǹt*lћl8eW 6mgu2/bNII C. c}oԣo29)v3?x`&M _|:o>/y#w}FraPodkfCs3U00~d&~aS_߿{mY;g${ ,rn`bj'A4f 0?'RobS26+^+y^E}>3"y&Ϣo .M Cy^~/ I] ?A?=w< 1#{1}W{O k,ZBnDfE+:$}x&q4)F~޿傖nˠh@ʵ3s&԰R^^<LJl \$1&ÍFьcК֍Ϋ#l[ t)7Zd|3v y Eڋ1=мf&>l+rҦY}zny[X/aE箢El)R:;/l6n7^ԁjOuz\uն)Ju}%ϴ;]άozgBI)I$o3A,A8(/999,6)˿%\n--nZ.j1i(/F1@s*1R׆ 2[{1CQ+[ifz0b?Tz7R^`M66 T =}4®w<<&A"a " pPVAIIIa @ew&)_C/ƣ'8u>jRl 'ų ̰YBQSÜA#o=չ ujhnu<: k4{&px3o%TGAoj/Ʒ^&AA@A#W*@%F6  %` b Ϭ3>-Ia36}w2td-uGA̮2MYBVة 좸6v4Xh^د` p1ds^u?cw<2wH ! 煘p_UZкIGNJq0MǍ~R1\)+4|Ey|.TgZljqB_>[\O@AAA.&D4z=aѯ*j]+-4O.R Ou"  pQ˥ A8(!t_埊XvjZb1hL1mk%1MA#o6@~rm;f'"O_CO_Ywcñq#7{KYwiT T1>E    " pNIHH`0UA?:P!oSc>@Ac>(Qaupz8!N$ZB Tl liZ ӠT`aM!TJ۫$ڌ=q4U\W0d+e1Nb)LVllZ;-BNjи&  =A8gX,Vkx߿QVj2]85"GA {-ᴸ*>fCs1_GE~ #m:mM$]$Tp0Ɣ~(>cY?jRZ=A@AAA.FDᜠa3(Ҙ"qK <%a^`ZZ6Yrj/G$ -9йפʴ4U%` TSڵ<>"  p1" gߟֆ-{ "$}fL?ы R3gp <>ԃM]l,z{(  EKdm73$ƋO]0eJ`pbaWKB"66H[[[w<֭7QFH=v]DTw 61-HvE@AAA.FDկƆD]# ſu}K1m|9s Sqqqa! LmPGGNQ/Zu:RY2l 7. *   #."W_̶VA/U;vN/ I*PL1/'ri4CHP^C|흏賿sD.̾O?m zghdj6v3\ YA  (I. 4y0)ZK+P+P " -P9y3{jfR muE}ټV_6g&0<* 9 ,>Z|-c\L;3Pm9U#qY3.814yzE5)[gu7hy33͂ D@Azii:6ڿQRjip1c Zsf_#QnE%)' = gx ĄAT=r<g@K-ހ9ԧu=GYt:,!ez=[0.jp"9>Z!Pbԗld++yɻgl?}86v?;8تA:kKcE5cPW%S?eMz pPb7o.̾>%Mg`> 0X`\XWQU~{!Sp%P2]z9ܭ2[1dtQETPC'0kl~U{ci12f-A{)7w== VaHVPud7%H$^bp)a;p;,.Ve.@ןĖa e# zc֖t7-qDNz,nwx1Tw3Y$1KHJ¬Xy"@HYqrN bŃra$Rꈵފ6cx&t_nɮ_$qy">멎Xx*g3,ӡ;/D~ ;pc45~#U<k8FK@RH8 J9WEƄt3 @鍨#- Sxݬp]t kpVI'bƌt'D/plal 11Ry{ Zœ@>yԸiɐE; =ELR*A1s+ Ri7&b(@-BQq|s"NNFjm+OXHcB@ 10r{QoCk@x8qRwاcJC>~1:Ъ:=V[d%''~[=́;K;.&hQ./b)y_K?s<Ճo O?2³M,R[<tA A\6 @U`\.x֩JRpz'2piUXLD$ uz | Bv:~bV.=m#e 0\<Y&6@|/~l\3±i3Nɉi~Nɱdg[s AAV~N/,1+@*IVD@3 Xp<{x-xG([)&@7  Cta[Se&"q/MzŋŧL# g0}nv    z|@w{ hfCDXqf֣IheEj QP>E 9\.GA!$ |*VT*J# X&qhP53MN0qۅfG pBیW~A+-wܸP^:wl .AlU6_rݾ&x $ TyZC;rnzG(:6NhȴI ʚ8T2Z vx}Wx 5+@۱Ïڅ+珌/tS~:<M~|Woo^"Ah>d2tϝD@PRĔ(JJ*GD$on7$ \1u~{ 6] ?PA8~6[i{.2+@$"̥\SK`EcR4vAA^Uv΢o^Lj>Ʊjd]p^BD m>6ЃtV1sWbz6(2tu\(,A ^?ic][LJ;>92Q=oSR֨nաto_AWյ_=&CZxAHˠ'PICqJ|'|__T<| 88 _}tt.hCњ6?vE0AA 4$ȀYZlFBxÎnJ&hvd )+%I  X~\AN߯ AD+1ui2V7~[=D qRVK*8wfX .$ʕAyY-@^8usYEea 8qU\6ۤmvtdU8Ud.9h(?Sb0L]e1h{)8t>z#*_mތUq[RWМ|<_1.,^ƋXcnoAĠB xP03$qn/$E,oKK L&P[[;2J ׿W }MD1FB?s` >j5f3U1h,/R Jp2r|߀)r%1)@_V{u{B&x7KqqZ V`yvT`A̅xb2gcQ^4dԎ](Kmy ʴ`:`cLyHSFvhIEp/'Ff~x߻q?jqDZO0"Zh5&/̀`3fMCgt5e& >U0eB2! s0V:T#iD0W`K" @m7+:* SRZ"} AD b5 F Q:( TFhNմ]0d1j]kMP` Ph1 .k0Dm2C/T>,TۇP3':aV܆h..FSw nPZ`Eh==Qh}m-Rh<뮧*2b|(5Y+.! Cp 8aq2l&6Aϼ?n@p÷#}2x|+_A@DdoƱ;#-aV "d,Y $4n=[ynÕfYEIR3w,Pv ?F'ڒe ?m[F{/L45M`B7,0Yz"" M Jl(܆=dt$( 3.]+\ U:S$M"ɱ6O8_,N-22!5yо |V; |u2RuT@KY{*V S(=pz `+ǩ@W@hCm+K+,K:*6 FE}| 2dqWD1N4M) Voۤm˒^cUŗc_g< gFrnd&G^`onE59swcl4TRn3*OD/ @[tUnA$_8N#*32~+C,#g4yau;[wUap sfV@["UY`u֊Ipg" }?>T?6"Gfdxp&Ywyo&l3P"t)5kH{#plbM)~ JLDŞ8T9ZC(8 p".e&].Ű}px/yBH&$SR֞˗75*n\c@~깃eGKpm>$X8^?߅]8 Bąyȉi7DMN+:-NBIk{LJ4ε`4Z4,\-ǩ£8Yr=H5$M#гy ^Jc rom#V~ViZӸU6'WtɄ,AcOWbO!G%ҋ#h }j]gf%+@:%! z0bv6dFn6uYHcտ/AVvnu;W;Wȱ c{ފ_b1 mXہeeeg-jX=0uz- %E8R`Y- 'Rdgis&#2$*nX?fk&9=`NFkE72 ˬ,L:{RJ%lng)eʿ}Ljj* ߊuLJ6;zqj8,ۗ@6TxM˼u1A ՘sfw\‡Ҋ-. H,l /Y#$9 RQ#[6H˴{=2%L퍬/{ _<9h4rIX$]ZOڒ:,,XE}/+^VnCяv06{XnLf֭֯޿R?" @c0Йq|!aNxZrNSd?  9 мuv"V9xos>>B~dᆉ#MMM\V`: S*JUY#]Z(D^!Zs'^ۉY]z$Tp {& p$! ޠHR(<(svqA8JQC:84#B&C L"2 ,&`X4hǩ$Ʃ1>:B#rTau&OY"֧k;Aİ#aHpd!k 'n\.e  $%u1)MgZIםDoo9rߍJÄLHjwL`ӆV,RX/,!!dn\.znή{ Q-{u$'}uY 7}:b 8@beݠs[sL76eI0f%&ܑ ,s+dIAX[VOL.k%g.8 g[rM=t-I#Tv7pJr>~𛨾B ~ {]lC]w]e=|GN;@h F ""bp:K0r9'0*v909S1n1}|4*-([II LwZ L8Ν;7?FʼnDy^Bb5lHC=kq 8nV at,QAwN?9{ysf߁ǀ`N+ OAOu}56O> DLh川Þk%tδ+~S᱿Kz:_ɣɂ//jw0'Yڿsl]@]Ep&d^|~`н@Ȅ@ " f]\Yb0` :E(ƽaooEDv;;Ɖp85]Q]]=Z %qgAA?w>&1YKH zL_ur⥦1uN>[7B v*XQ;?#2}{DO'7 _)֭nSΪ"LY:|-+ ? +|f#~QL |i~z-ח"!e·m]Vd}׸1Vؿs]ֶ(sla ?{92\SNn"<8:a^P%$[h2OPp}r$ ]g-dc7Ѡ eUjrta dAz'rZiW"YBՑY Qƒ4f"8؝_ NBenPdeb7ǎbdZ =So& u~'->MІfU޺bK93Ҏ ťf3[[tk.r+d߆}|\빼Vns W{;Woۃ}ꮟ q`4bc_KT)3pWYj OĈ@ "&r.LlESS~ {)H5Vʲ-T.f:κ--,VĎ@ƋZU@V/-I8Pp6#47&NPĺ$%:yAg%t"vjHq^FĐD%!%|()ZN56S*45ΛU3.f݌S; ԤĈǃ7*Rq3s .kڠAya`Pu Fx={PыXOݞ)\jlOB*ݟ_^+o#7!Uuv.yuŻ]C{>WC3}!^1+N^y9+,'?` F $ф3Y2`0YA?`zaȬ(Wߺ,8t|֭[o>qlLN|8HŊ>Dh.D$H#vz8wv\M +8z^_hc!5FA2(]{^G<-o<(߼zRoOՂ9߀ySړ~+8||ׯ4%3A# lN`+f 2D: ;]` >؂[W;Z,&6ncAcAq,s"2@b(tPCe r%V0OE+0pO("R϶o\,o flݎx^wa7-ݨYz)|cS Pƶ Jso@iR"a)܄Fu×N j]"J~u)]]tUQz~ E?8N>$шQe-L A#  10:\Y[ZZ"?[mh7Unʼn,ۯ`}~.;pJJ 'zeAF3 חp&Đ d16=SSW`C8 $[8e?DcQx$x@@ 䢙0ġ"U&h%gA'1 JgK+! JerI@GYPE^#4y?Mp_<xQ٪,0% TyP%M”K?uj#Uis!ʺ}{Є'CRpг.4N‡1E׿a "1`j̍trɱ4?)c]@a+RY;fLcفYűJb3q8݌$8,  sZ?S'")Z Q [SKn"rl8 [30!V Sq LPBo/P7LB'cJdI1I 7bKp&&ū p]|nIc&X2bC+ζKN7%bP__M}pm( jqA)AE\z+wa;sDܛ ]Iky~ߏAW`Û?Kp[Eo3ytUc ~H$bD,Ә@\5 bKpĊVLl-J sf"6 Kq*++/\QQ'v;N>=&QHfzn@߄dG$Xr1(.ޏn&< <+A\-AK`sa}6 DOus}d/6B F=vOP m`AL#Mڞ4f{R :1MEAȉYXXľQSYP Oqw0PD1?HAADC AfEW[[Y1A%an# c c50 [0ݞqNCe"  )AAA AX"F"%f`"0!߾ S&C }z50R&mDցx_dž\;0AAADB AÎc,>dVZ!LJDMB)[6i250qV֌'Ww[׿~HnAAAD2$1*aـ,Q #J+ꩧQ>5ׯx 'OK[}64#7)YI  dH$b\Оzn7ᅨ=Em5͢6eȪB]X_3+@t AAAE-'bìYD( Na [7(ΝWO˭#Bnq4aQe<4>X|,YbV0O  Z Y1&|hmmb2L&h4a! QcTgOOއqVyцχ$$L8   H@ Llhh1e fp",? up'2ǣe `CD {&Tb"D 4:%f Fq  T Q}*tgcg-sAd%Ka֓ع0A ت^\.p [$;?A1e}ћ>FdJedQg-WէT*'-   " k֡x@?^q~nV 7i# J:ќbӸ:^-QY­# ;hyi#V6@A?/I$  "!`& )JW9 zxLDt>j5 Kccc51~]ؿYj~k wNE5:AAɐH a4rVߏ-=1_c߾[eKṚ:E!Z\<@< B6 2;޾ 3 w#Qxlh`Qcvu&r,jKױjLQE۱   $D㟼57? 40?\}L1%aG#EP7|](`Y o ~t:)1|3+PgV_j(1^k?9U>W_pFXq^x_q=_7?kR_J F8H1LYÃmj/lV?Q cW4#B&Xx@T @K0J\ />w| y+a+w9{=` E%~}T-X=`X $;QmvT]w11S'"V~PuZފUZ.خД9落pfܡ]ZÿC;9?+Gm=(x?opIIh9";7μ{)J]St%B=WV?ɉr<A`N1[7]X;anfS*$Oвmޖ(݈|0LȄv?|gb"'|>Kh) YDRjuzp\q8 Bu[8ͦ(Ǡu~Ug ;O!y!tڻ=w,IpKc0ke6n1r`LZ /x2]z?Ri"Hɶ/xa*AiEiQ>6Ul\$ ԭpY"dhH]ƑsvY&]uX&ףz@(7䷸9/ׂn3#7:AhtĘ'M̕YO`9-;+ڳqdq,Yz'Kc(!7b]a:b 7d Ŀx6 ⮇1b U _ՐeL˰{CPW,MY{d2"BPF,L$hVC\p>Lf}6e.u48eCfm:Tu3*ha2'Q\7 y`-T1ga~N"] -Ϧ`yBj"OƩgj?@8\RKQ($b٘/o+p^G}qsotNTbaruϡՅH<,s! AD~lnmS=r#~rNGO֗_s\PVP1n#&$Ἰ0! L(J;PZGBQh0̓4OL~X,t]TN\%q()C}h߈@EZBϢ-Bʠ MհhҠA FtӱdwJ! sgbNGEđۑg!*F8Z%݃|ބʜ$f6;=owh)eZvЍko>c{ǩm@|3 QsP&i!Wo>g6so<oo<ܿ~[*Ͽ!ӣ0z?>rwIP)C[oX#`)=W 2 A#]A :ќ,嚛ܕ8;w%i3q|*4FHP/FZbR`d}>x php lhL5b}:sZh=Jk'K;:BfcRD N׹_Uvp^Lj>Ʊjd]p 6 ibG1 Ƨ"h0j)S6 W݆kt1*6%exrN,}5VVw?C]pQ!%{Mj2 ,b#Fl,ˋD TR&Dwvql^ ^l,ʋ ڱ er)||n*AD (t !^{]B\<JiЎWY BG$acmXn^X]ۊ ^TA%y@&r%b$, [,GjLQ~j0 ЙXzL9X`Foٝ a0`A՝ Z+0%{ z \),XE@eD]M:m5.&(gebp,".mYvU[0AZCܡؐ8Ǐ6ADĦ HqXӅc 8z axf}<)b o܀~EDnP&  fJ% 1 0Ȭ*сWm_xlG~ΝhJ74O[S=j~Ҋ]WC Je:> Ýc%2Tgj4@b(:iR^]F J Q=z8'"]󤉘>A ۰G$ 6w#QK $;_}K?cuxHepK#m.\_4^ލu7y{}.( WgߝU0\$DAkЗi}8[ObqˑlE7 3dYH1  a1d_M5Ė~ \/4͸ry}<>ޯYb&l1Hϙ='q$sbl'S;B'Crl?#۫B+c@a!F,Ěd_7S 4$WD&t7s[bh}%@Y_~~om;~^0tfufw#2˾{Od/<>}uaHEQIMkے%[c7in'h6iә'iMvXޖdmkK\)JĽI$@l?^P(Y\HP9=98z#}8=`ը̥WFfh%3bQi`ձ(x* cЃlThDgM@5d!T\\|hxWT̯,C9&`pʀYzVuR6ı Gd2&bD˦/g8lz?ql6H{}ӹQK0EÅ`Rr[.8qvokĵ.m6:fs}MMM~#k_)y:hq/""ݍ}L&wI>ڡɍ1C7d7Rhb;""@" ̈,,pCHKv_šs#., }=)^G(YDDDDD$"`"`f`3y} _&-6>Z>Q c!&{/DDDDDDӉM/MM&S00"""ڄ5Ad:o5cEOD"Rri JvqV]Z>(>"3&l@ѯRDBBBp|?~5=M0mD^>mW ЂGH3.hXڳ{yLDDDDD4>M2 (@h#9998>Hr4#^yuBj0 p)8|.Du>H%"""""n M/\[[,K0;,::qqqfI!/_} |XuMO_[)#Ctۋ̿ۂqCd2HDDDDDO&DDSL '́u:f3G0K04xd-z q> 11b`#ϡ_}^߈ q,@A4YL 4!#"(&W&+`dh*}F@ci?s,TDW* zcq?KS4$"""" 4_LLLp`p-8T,|papvgSʾ<0js햻!A!""""Ƨ"0 8^O>:"e7,oZIƯWhjޜX`?GDDDDDDDaDd`&`dddp%("H8L߆2_EEb]},./#;^q-;@"""""ħ"0zuC Pd&&& HJy Yg \+Qy.mFåܙG:eC@YGrIDŽ6tJ_X3!"""e$" sCyF8@ɏ̪ k $J]3W#<ػv?Dx4ӱf|1Bg+P uLvf>"}-#PVOJ 0 {]QaQ_]IkP%XV5޲͵x3xW_&d7~~2 Ʈx}78g){w;cMQbh m<4h0&d*G7{(xejx51h^54/$zVױˍ=~[qMfƝAUADD3G&"B@5Xd2h4GlךGNJOm@8oY3hl nl;b'ɍ8tN)pGg@p߼ȏ볡G8Q݄> l޳ 4={ 9ts8KKhq¯Bjj/LvHb(]70wj,͉~s9v|o/..#"6rZg"C4HOEp y»'d KgţKbFDDSDD3hz*))) WJ8PxfE=~Q;q$}N0w 5bS/1F9@ҚP fŭ@˧pӍ)HMa軌ʌ3/)*j/1ׂX >x3 (-mFqR6l75eY k י Mh 9LvO/<|/ߎ~?ݞ q)-^ gK_D4%") ,# b@;6Vڗ5<q)69i~c3DB2|]խأΈ 4TXԀo9 p|dk?oGǁ70^|J9Q;HQ `-H2kpvo6Tl׫jU!+Q?ls_3!y>sy7*4xX8>x ^XWNUójV#M.I3 gͽXmF_܁kRذfc9BCeQx@F }N?ѳρkQF-E=H3JzCZqW#tDazgBO#ؿ glÃC S#sVxۧ>Q2ՁlD [|,9׾VGnen=Lvn:|s8gO#Y#DDc(%x܃FM Ewu/aog66JF6<Dduvvv Z?b1<|NWsDuAy#Yޒ-jь?K`Ἲ.2C 0M iX <8_s+.ʌhC&zo=hhq6aP]Ehp=;L_B78;$S'GvYzQ~yHPhj1Hw Kk+zl?~1TTΟ~&⁧h1Aw=W;{Tf 8'<IB̓$E`WEARp6A2nYR>q.|:{M|*T]A.À' -@7L,߸ߩAO`NUe50e͹񁹷AALJtug{`$"> \xض+SlljaWzQfdŨ1{&b;DwH _P[2ۺ¯_!gK_>O4^5Fhh}6AD^jBugIO- XXc7X?@SUaKC!f,1mnLDDDDDӍ@|VU+ޏ:y?/c<pK!\~ n[4Y/uP9rуE111)8RV[bk0E}"Aۂ84`52ѽ?708{ĹWo9a'^y-γ(L%""""t<̀&jmzR8;OwA_  (9Fܥ QIt_Ka;F =gTGĺDN1)kA@nRjCl&>}:ۆy?qzsS4\__2<xסp``"""/6tpq0! wg9>x|~D_VF}ޚ8^鯨юm(+PŹ7`5ܭm uFd\-+S(}[nkK}Ѽ}SP'r8PYdP:Ngӵ?>)`IDDDDt7`EdXeE`GDlhNjÜ_AOV4&9I/c 7GL)ߗ *,)XB[l)> m?1IDDDDD4]""`_{{;Z[[M]H$%%!111<~L>,p1RN>ʗŒU_6qYt<5HDDDDD4@DDwLd@1EX1phj""Գ Wҟ |1R^F?`{23e6Y #z\3RQ/TeHS݇?L M¢~E0PLA1EۏWSCfCJ+VgdC 0i݌/Bќocl  .}=݇MhRxyp[[ ME`L8ƠDz`^@ K"ZՃ_FZN1ju_WfYϦ#ч'eApD h0HDDv755Z9%%(7[q!x$ }R"_E A1a剱c CԁG4I@1X PE3`"""""&DD4BM yF6I'aOcfI ؍O&=qe0nsN;|kaᓻ&uE֣Oh1P4 "lZr'j;a5{OXK]e;ڶ^%o 'u?CM`($"""" M;1\/0N^-`qky *}:UAs0QyIyհgpzRM(Md<&$$0H3D{i]?@(oOgZ96ԝ؏5}3|!"" 0HDDa%_v!2 ΃y+Nt>DK%hU| V?UZ|𕯀-7$CрE& Q;R};34hGùs(ùtxr M_vB!:z5;N.~=cQuߩ<ŗ/pO] v"?_m1(L׳9W!16_Iaף@ y\ٰF}}vvvяŠ Dm88X mbZW!'F/g0kXx6l*01PCRwQ~ N. Qw(߃hs=_6r,fh%%//= {7ڗrt Q `wAxx_ҲL`v$lAa/3r"އ]ga&8wVA/~qA6X^ ,Z n h>^A!E+QygG}1>ߌ~ S& V,mWv fG[;*a8$H9#eW㒂eO[z?m;^+jOCv}rDb!wKςҝoRxdyc2Qwp`sm(%%X`^Q19b=~sT%eh> F(,;f[ y*[o7}p\x-`ݷ#[#..xx29\Gtj -p?Z$7z[;4.X(}h8?FɧE({g!Lo_kUwNZǾ{>Y8}ZlM1@rX^ \ >Z";F{Eh2RFv8XφRzmbIrL똊r+2߈ɹ J qq74}`1b"Ae:[lPĕۿM~5n8JEoտ~t(};(Gk?ǯH/cQN"{KbmEb4ȈhJf4 gP̓XCIŎ?E0+Ფ@uDGbc1Nc#}-ڔԾ 62nT$;f Mo_B]) -H/@ܸi)&{vK3q4,]0;,vwb)c=vWsJR2rIl'ԄNم0}m%9rVīۈNBj`}&B]Tb4ƺ(pip""*u=<Ԙs'Ӌ^bB5ïEn>Z𓟚ps>e]JR {bWu7a@a"MhVTJQQ-'SY{Qג]GIo I2B눆˞sNO<Gpʦ> EPTz Fx8Q~x*(vdVED "k cHJР vo&X~8_ib4ر]E~oaȌ zh0}ŭvڈD5:KCmc*9s*. y r|t 99P[$,RO+NGڐobm`F-ޟo<wUx񯿊՛efȉM ~,GMԻeB:xAulx|G0'&L :`|"H76ĶU*4*ђ[f{WAVA+jBH I+gl]@4XKn,"B{cGAxR '|*;Z[ cGN-M%{CưQ5vd+noSQ# e,c&DD4{c&.d}b Z8;|Dwb@1@ZC߃ϴR0 ډ;h~?NAh;oH37rNغ;`GqL< ¹Kf@+sgXۏgpI4F`ٽ8 _\ VsѤBzf$+Hej \7ף1郣Z܀:*H&e;KE⽊=/an wN<TcXe Tz/AYy+K}Na90 !Z eHCNxF7ס9/*T Xgף p25㱍&ƏOqP9ܗu΁v#p-B;aBh 0HDDV} #P*@qP e ։###YblAw,<<4 I͎Bڇ"PSV'q-7H_<;p8 JQ'SØm}ND\J`j$-ۂ(= *k7˛ 6G8Svb"+06 qZnUTĀˡ5d"cَ [Y{ ao`y5 ȌQM@scY(e U܉CtHP1J%VSX 2V@S8)/drQ<⣐S4  Fyp(:LLEk|#?D%W}6́Gw, 02|#")>.8; MI<%LGC٠nrf S9HDDJ@h4j"\>D@)Ylp!dZԏu&`((#s"T n׾tLCq/;;¥xoaƦ0эfqO'ܻ9_&9_&k$ Dо!B7t'HDD4w/=vPL"(&ѧ`iH xu.akDDDӍ@""$xb*~ق![`dM J X}_!bADD4uLDD4B>~DG?%wžƢϠG(YDDDDDDDDDDDDDhlld%ь 0$"""}@kџf fDDDD41HDDD42fFt  ?"""" 8dP(t^FI¢^D2MwLՆRy؅˹nL.CV_p(©H_c !;ߡ2K@ԋx'#H2rù|s)(K8е*L8CDDDDD4u$o>Bđ>~<: jѬ Qumt]{IaBBZ/ZLη!S!2ANfžn 0.{av {jjqd,p0bc+hah3b &} e8x.7 |lPZmޝȀ5bYn~qlWש'CA^ѝ4v`g3ZWlcI3axmgl5œpF3o.~Dy 2gCp }(g%&{^ %UHUk%| \Hێ'W$h.?g8~rm<7m2jh """" + fp] h06)L(ڸu$,{VսpGwGn\<*uX}g{;qⵝ(4b3Jp3Nf9nV}b(.G8WgÜ{.Fbwa@By])],~ 2tްr:N**Ye ZPG)\ـ4  Q8a/D4ЊKYu6x+lDU$ɃJCrywV 7,y|;YLRGUSV'3 k+>{f9X`hę$ڈ$$$fpML@Y.8:pCB\v"479plś0)Ș$҈qR%d,\C.1:# p*3aP axF4{a|܀uP"ۇ. }fzXC{i=.<#"aT;+)":7JaUi:hjyLwLTMWYgsY ߍkΟC}b^P47V‡K2@ᱡyi0[wNs5{2]`]}R1pEg"4QؐIU;dAfՐI-=BSqq!QC{RjdP`$9F<ϻjmzU*9@';gѯXq ak9#ϠyR3r#ytõ+z 1$ϙpgd?ܸ˛ Arױu#LHH‚E iT]φc8U݈H|=gR |=8p!m;\?+ߎ#8YEU[!CDD4[ܻ95d2տMrY-xM`QאIt2=}C&A;z Dw|1HDD3،QXaf>KDDDDDDDD41HDDDDDDDD41HDDDDDDDD41HD4 vѩBʚ5HQ 7$"""""(YDDy+PcEV ]:v>݂@"N6`QR w[BLJ#8dAr΃W`aDDDDDDwf: DIAڇpOvޮq"j hp hBѪ8V+3a%݅T*+f$fGi*g@%!EB7@Qc# Ir\fm}ODD4c}v/v rf>r$@mHWEG4f$UC?""""$"""܍{.d֤jn S6*mX9B:'[bPv)"PUP^< Tvԫ?ǯ߫D[xK#?J>1DD4mILDDD4wߍ+'`id ^gawHhk. 3X-oFiqw"ɯ/_ މX~'" @"""YG];=4(mr^t-C<*veaיfúRĹ˰( zqA6X|W3hJ,LPCmWv fG{sxkG%L[ǚ8~Q~W3Ũ‡HFnhTǩFX8,ذŦo7m^\xAvXFH^ ܛgG}1>ߌ~ S& V,>1rhf]h);{$D=ᖣ䖤A|E}rdʎb?xgo'*0O^/}s%b'upjf|_N|'" Ѭ\_*EEKURS6m̌B]~3)UԾ 62nU$;f Mo_B])L1&憛lFYU? cMf(D]čژ (@$k0c2vwb^.a@Y(SOe{%_7۠/mA +ccZ3 t} l-Gf0 _F5$χICkNB(8Q~x*(׽>HlFx0#o_dä|X~8_i_$GJDDӋ]6.P+XQsPBcm/",ɓ) k0׆>bQa.RM0#z<}0hg s*"%sǖV 1 M@YĶ"ehD *6T wF8/4 \:zɄся/?D[<^lZc[^;3HD4HDDD4x rp_YҊWFP_yrTrH.Dp1c(gFTaNRϨ9sQ+ӥ0O>AbN|2e4 !Z eHCN%:KkC0bN^8]NOlMš~_&1VZWؚd+~qO> ~G{|gS,,ODDӊ@!}TRR2鐔_4Y,qxLԅ E0w\hFHX8Xe|1s 6J<&[4VXj9 ]l/whql§cLq#);`ǂjb ԨU#qlǙ#VfdrZ™M\*Vؖ$Jþr b2"#@R#o /8 q|nYF[/g r?ٺyw(]5,i?Ѵ>IoOS$>\׽j$5P8K0gQtX,}15/}g< ClE=7g ,ozx 5tb*a%xZ{gip7>_Eٱ>K_syy{"G]/%BG~4xƽLVVoB**>q7g`~5E]C&w` D! K MН`g&DJإO/>,lwk}p)Jnl]NJtdӱ7g4P޼<,Zc<):HY#8t='S g&+P${';vH@c,xuTͮYyn"2Df9ߕ"'^koocRP`vқ iRbXcCS8<d30&\d=}Ƞ ؽ*%W*0wA>+"""""$ M0Oo+΁`”I1G!L'1$1f=`mFx0یOCԡAT>ӆiN~o]qa U!Z%}XLQhyǎuH_\%"?1R>tsyd䬹%W{SG*$ BAпE/4tQsl 6bQLJ؉Sk| A{|q)hFAIL+b#c+mƶeiЋz|]lXeP2'ząKP*/Xs+ ]?X1?Xcد]c4jYPV>?pSbGm:dz->l3y(cK/@(ڽ!""""bhb?-:ucu`@;:@fr45@,D8D8:;EFU8^ {?hoYqg`O B%6[kV+” nUR`'pRMyvl]ߍ@Xuo[50S 2E+?Ly'Y(зrߣG+cz4PvSj$)XCNDAܺ?wHvuM@XiŅG }R.˚_Ab&C]R#0iXXڎ$ i;)6A6͍/S!'{f #}-hycٯ=sUAwFD gkAd @_cny{-anB"V„åyP8/':H@ƃΖ:wv]lV!ۤDc0z1.%#z 4yЀ̧b^ -s6qp;xabW=:F3|[ijB8 SQ8}zbBz].czT1BW .сoޖQ^QfQ6G"mj$V>=mkerI\}Nr((85u4\[ݴjp @gm-sc5~ Sn.se:{}mY>t6wXy1"P}` `ZONCxJFwS/,2أ!GۅuhAV,@±ĥ(gG^vaP}HET"r9t>/ni}[ౠՅEIף7* &W7|}hjq8=g'Z?'' dSE!+4>Ny}p9l)[G%V5n+O\2I1z(?|q N@Yk&i$\KyN[Ŀkbx$S(Ir͜'ùщF'OGcG7;:{cHX+qֹ-,@rܞdc?o:⸡<M,f}u¥FYG j:bDSe|[#T]Cm?+suр3xplDU ~!݋ ۯ5gr @L2Gՠ㡥c8jy+ﱢg>*ν{`@IaP*ڪmvV}ZmuDaA=nryJr{9Ys=g=G3=:DIII[ D>Qңf)#lw>U5D׸u߹4VD&9C>A>}^ZDcƗ wз78q%[}I!.S[ ]GyU "B!9$@!X{š T*ÐLۡt ~|/dQ3^Qn12x0P#u9K&0fff)K푯(r &r`j`l>2Ps&1.2plr=yw?NgSE4 !%xf MzDdï{(bwse ^LΞtGm&OkW(I֫3)bӊB!S [}r&$OI]_Q)JV L{s3{P8,2B!7DB!P{b^zę725g{5?_!ķIj !B :f,Wz>x4h:'y:jڵ nVN qͭm`= Û7qZLC@yS37e$FM0H\tg4ӧ|Q<Ə|ɏ?{KWI)K)wG)nR[$5B!}30ԅmsT[v1ĸhuT1Pe!K5ٳ32`[ _f+9Ә5k1n=FrSy!I4WN#ݽMK6R.9#.\8NژXE65URo6[>ObŠ Z]K{ytbpB!ķDB!Ggw"G lA&YIh,W6{Pn@})xn$\2ѡ/5]<,i$o(4Sbrz[O=Ч6SUUӘ2|B%MB!D\ܴ")9\_H"}+.^PNFG殦z& ڪONec 5u=:M@NӥJm@qAq vm)^i9b5ih-m̋?›/.8|%5Bth4̙=I&xb`ٰa#/`0 F[Pb٧x?v C$ wAmoǬZyđ˂X2 9~dL͟gXs11Gm?NS~g,CX{)+4L.ԡkvBpŅ3e/Jwt%Hې" )^ڀOquZ2†q9Ez\|!*EUWq!蘬ZdvuSNN:9B_>0ii$$%#@1 kf PXX?foiIKK;J_¢,0#f|,Meg7P%-_q ϝȨf#f{6eo'tx8v:25SsRfYFNPR.3Qѕlf$]iq0ְݿ=T=̙￞LEH!wB^ Lᑿ=XSbYrz(߾& u 1r%iӤ}!wM:&6NW$qF)@ ̚ 7\Gl[@v|9$zwoj|,^9AB!9%@q>BLbѡvB'1%'` _-d&̊7ɓ3:!OGBlĞ cߵg\ΕccUf?[ұ/bFM$7# w=K`sܗѓJ[M!y׳]jBGTMaV ?pkw`Ldu14}8= V$Nj Cɘy7?} .rS{#wS”_&k} _ (7:y"q3`rR>urrQ$B!IP\t vFndzb(XjCԊ+2; 6/˸Wl2|4O’boΊ:4A\:1+F=h (&ڭ}1G{U|j#Z]mظt';92P6*Pue_zyhI{5s[<͞Yhxo%%<_mR[&R:멷ZgwZ_\G71|9^~W{80)_kyY{5mujwx?)mpS{u+KB!Bo8˴![YV<=ܗmzWm߲\Bn`TN ;4%Vwzj˨%O'}}YgR_nhv/=Jf(EjJa1~ht85]eDt (Zi,B!yFs|gA{$HXSWHY(|4'NH`Uv8{QP뻩v2"ݤ?i4R Ecy SvZH:s#h6{ugr7H3DGUmqg6cVz Z̪yܭL;#.DYqNWy (EMoҎɺ.KiNÜ;Sл+:NulXD}qN L&[zzD!B!Ĺ'@!2FEr~] KqP2Gbڵd}ʂm}SA{/8Yfb޿hUHtI{y5(Zm'!-;ʮ)gv f8KTV9bj= #!>aGpP1O=eB;֠h%q16*S1D!B!%r=&پWĀ{j{]XAٓ(_:剩f63Pu gA~+!3 'Qlujvm;@iU 5UUԷ;OqUOoy' e:rj(\X'`7^?4Y*fpdyS~F<1 q_JSSoaVtmǚ(ݱJZ W1#IϮp$z׎ TGB4R3Ajx}@;m7vang{uOK S Gwnbc4܃ǰP7ۏl57qgj.Ď4P!s v}>ѯJ뮿yxp-;KvrMoB.}SQ %#|Rյ/GXCuu6JU\Ro=lhưeض: ^3}SųxϷo1LK`{M"jze$$%ۮ5o_Ɔ:9lu :&4Y\MNqmF7 H @!@Gh~ms4X vݞ(]m_=jUxnOˎ4>o2VWO qLM '3{)jeoPϰL[vwqu%h%P AIR/cŘ~w Csx9i7mq:a~:=rçc$MHeNH|ֲf 6II}  !ąFB!fE?@[m/PN{ǿ^f8no>m6,2H󄹙½'&M%2d?\OZvP>^~uɌ}&ELtHׅdǽ2b_.6:sg]NVD9MjYJ܆s{;jW|{疉tO-[|UmdSEgr=jc^J_'gѵ1:'veFd༐h. Bi=&۔_;R#@!.v [LHQ0:j*&!QӖ?:q}?=]>^hs fH/&sHHֿwOZ6O}U{ϘӠd2}ͧad܏#ߐYNu X!.0BaL*{!=<~͎~ Π0EFF5g_EtĬhakOm>ra6+TUQNH6v~_vvƾ9Ÿ}{wR^&tWb A?rB_j&m7ܜ-Ӏy }F2/楕n wd9SB \ !ٽ'`.=Sl FrS/\>NsE]\\ٶe ;vI+_Ԇt&9Qu[,Z,WvcI}~ ף w(mƈ?'#{o(!j;ٿYtǤ3lj+_q6x}xﮎ-4He9e O.׆SQO54(rƐڣ 噗v?r6Yf41X8B\p2H!ͦ[IcKXxɁ~B4#_;^-@kͿ[P\\$~*Rf"+%n~qM `ƓCv/d(A%9׃No? 9VnD95[}"q ڳ{I vGm2}eTKd&pot|䍋:=y*QSN_߾w8WGp 3<!Np1Kfǚ4nxLa~1Iib=7L< MLKK-QʐϗWki͔^/W|ҙ=އ >uSTۗB\p$(~n4{EUU%>>rRĀXMMٻm;F跞!:c &ֻgw| ؾ%-$!~|.嫷cuPC{}@ōP-r,{n%&V@N`SCj(޽-&z1zJAZ)PI^.[8JƝa7¡kxµmZ㎆G 8c9˹}7Zbv]v5fM"wDq$ !8IP!D?w9&Z5Sw咑0XZWSYU-0=ʛͶ}47b]0OI9޽(k0t(jh-$\FR eqKöX6EUq$qEWd >}Rp9J@|+ iuyzݺ>cK=55 ]5@K/h(o#yQSi>$:a.0"BqNo~²PF͹ᦫG[\9GB!OB/k`ɀ[1eԥղVCi7´pw\ k+d+ICGS*h%qSEQt15RV#'. MciKI=>mØ18?-'1x5S\ص< @s1cs]V̲(j|2~×<v?}/,^xZ<ϖ<@dB; !nVPm%-JUCuVk>c?1G5;nh6*bO\=Q\ n))l`\z2A^$RlqȜQ M_XGqp+{ǭnV-d c|2JO!Υ,XӀgM翪~¤>]P?3|'rC<ZHvn">Lkbϡ]U|Xw2!]4r BMhL5;1#H!a u]jBp+fі jKiS55VPk$*ʷU֗(OLu4ܚh, >L=^ȧom|8rܦ&n]bt !739<V\;q?>[0b]gw5{-@C%67j'QWro4&_PpO<Qs\ K !AB}j &skʜ٬[Z!bPȹr?#f\J(jv-&jvn ,92+_wa~EsX%y=%-y!|K3qȮB!BڒѤa~u܊&dO,+CR!l!S,y/5YňVw ;o_uOCx_y>|Z}|0ii$$%#@1 LHh(#ӓl#B!yBB!lf]~) i XY8 `sA3[~,րqF(TK,^LNB! P!ɓHLN=+[`H ^cAe")%)$B!8H @!6~>Z\:;`8:j ";#y!??_9B!BGBsg O6u>3;:YA[dWNU.q= !8 Gx}Q;;K[Q[N!8(¦nAMA{ '.Xsnx[nzwaH(\w~ym|G<>P?Qin--=keswrˏ㨡[eAwɳWJs.S^}5BCCy׸HNIAq. Jci,hݽpDlk;"0'|7~z?<J>׷|Ox,+s}MޘzN,c'Ipٲu7fU)\&q&)^:ϭ {~&v}OzU"^>SB\ $(9G; 2)ƚ4^EEᩑcq~u Jo}:('G/'o5o[RPP/l{\]]m}t4B\ =mJ_R0' *"o|^GH wr/ZC>AZ3t "..!I \zM$KǷ)'ǹeb:Z<> )y* q)DNF`-y~ƶ*Cmu4fM"wD<^w֓WBΧJx?FDmlؚXt[q7qdAQ;h}I=~={+Q'`t|Z[Ƞ~vBL'ZC#װjGm *$OPKǍBlĞ ]>ݾI_\96[Kc7zQZgYo^3pWiGrͣ8Vw'1&@YWŞ_6kl!{23d/Jq?Znձ)6 |qvҸ TZJgˍIy#?S⥜X_E[)k1\q\hr2`+"*7k l~8  \{2Zy_v32# d>}LNJg9NQN1Rb9}祮Q\{4Bg'.d2#%Jw~ .gM;3% C4sm> S'~d$n Turǭε)ݥ!E@Bmndzb(XjCԊ+2; 6/˸Wl2|4O’boΊ^illo[FdU\u (n 6{*gMὕ ǫv+vVacĤ1Ж,1?I92{=nb"miV>Տɽ*O>akq̴cҝw(&[=uIy*}Sg=\ŜMZ/O_s0'鵍&GdBjZDNìƃ::X>gi~-iӸ#=*QsGs<8>l-8Dž0sW<|-mO>w<,;I[>|Ŀ[7<&k}ןxȿ,yE>^UF.9RbЉGpB;;VРmqߗs%_||qcd<>)d^: K+]R +Ȳg-7pss"$' qi=C𷼳kqx1z/ >`:bYE.!70*'݋НAK5SSYPk>eV|Zn0J(9f]qRͪȾʬ1J1isA{s4SjˍאG{ lS{QjOjJa1~htmیq;/$G wpss ,IΨd =8Y#,X^mM~p#-d9SȦ% XdϚ5WMeXtrcQʈFDQX1yEJo]繅%e{N`H7PF\by@d7j*_9-^D?bIC4eIN #gg^N#~5Gh*rB'G[ZBq@{\(:25RV#'. th"{N=Ӻ3{6 ]cS O\:/{2Q\NFT$ԟv;ьJ!2UIk٫J9 tFQWgHm=Ɓ05- C1=f޷~u s{4/`G>kU՝~Ƽ=_/"hG?-8ȧ`ad1>X9zs. 'Vj1kύ/r;dO BK /7Ay?{;}@L&[zzD!T׀ty;vSUW͇ù,|-ƪ-,q [^A.3zr eH VYī4fJb/Igx&L2r~zČ\u'8%3R_Ä @!2FEr֫?EsSUcVɍRTs-*3F}Q;,t,s۵g3L׳|]J i@иnT鼨1,n_ml9iC*A7$MWXV}_jtfǠNA@ثxO.B9\1g*"}9>vda<ϱ-[k늹3v Pb9#:94rR&1c,\ !d4>eU [!&R{wWўD8Mb?{_Uy{I @AqnZGVm֪mVVDDD@a$,w8{HnB;{93ιS~9LeP_&\8O#>"`SݷimZUۋֱ("31Oa+lvKg޼ڧK1aZmf^ʉ-ყ?j٤A.UD.Iב~"3CvaFVlSɵC&qi#!p2ٹm]N&6N Kͤ̀=gM6 sٶ'3Ѽ0w/ϣH3(=LA% \þu'6+v^cE!هC_N䳠cG+46ppnwhJS|KX7oG9Z|n緦[GfH?W'lYfegV8XEf"MR= "ӧroUq|˖l̤Q<ܵq)=Ate(%zmԪOh4haZOf,  " …LWϪ78}GnAmY9\,e0aW2U9lz +8i7 ed_WqNWѵk0WƩ#9\oF2$u,T:Jϱ;Toװd],?󚊷;Od檾v/Jl#gɶoX6!WzM^yOQT׎hq6vZ.[wŕv~+ www2sexF͊}}a>dڌL~sG]M d=Y=5I~x!RLKt67~gœ~w=#يwyimHS;<&>PGQ}[srOfCee%wyqqDfцAAB#y7",M3\6UdvuQzn-33s`%!o$%w>+1 S)Ӯ`G/p,!$ݛS' j&;;}7 0OmZ-z=;8 pA6h͊e'&Y4g k[RRcZ5`ӱz6Q] B( ݓVžZq%fVk?Xg}`k օY 󩨨eGAA" Vv!0 WM`08 zjuv)LHܳh):/qF;\ٲi۶BAAA+6n&>.%9x(ag A =zvԫc_k͛fR  p! ``4ɬ9 Hoo)S`Ee%ve˶*  "  ln   B@+E     =AAA~(E|?ym)R    ?rl:R (  I\|6 WoHIe!rٍ?c \AAAA:R N3htܽ{)7jH )" hZ\5#GF#]swY  =3_aщ8nzܚ(7)msś9Q Czܐv竣8R|3#βÛ^+PA" VT=JJP\XQ"8$iy`6V 0jrزM[fyֶg%M^]:<^}u|v = Kyus'Wz3j#f}z?x͇s_j'wT 0.k kz~qAA8ODw0Ft5q'^xX,:mْSMsR,+׵:d"#Kزb'1(/-tIYw_Mk9r5/mjܥЉtd4e矲`vs(IeUwIxR/=ƿ֟1ÒW p71*o'!Dxs|t9;KHH.3d4mA^  ѸE1|TTq|VW`zvMd-XaZ/""=#cټ}.=ݪ^[M:cq&?+P1R]Z7iz'wwCRg<B[y(5}m)#RKfi?JOfgxx+y]vBgPZoG7ߴ/**01N  ňh\ z9JGi "&}49ްǫmvo\`<\]}e<M=m=J~yLkGvT`t'^v<yI/#Pu)S%qeZ5N"Wn(Pop^7˱%i2<ZU)9uYt˱|>@\f|a#Ӷ().nmG1Փ_pU(ZMmC#x[&1lSQVu`. /2'%&1<: cC5%wsWCQNY**r` ڦgOk?ɍB[HTΜc:4ٌb+#ꖗy-GL,85l #a9ϲ'CKVnŶoSjp,  " zcfc[M\|#rdefĩZ2c#6RM\x,g0XN`E d3 2m&3"=u,0h\X EYȋg5zhwHgNu1w’ҲpZ۫ٞ*YҮMя!i4;יah 2Me>z[S^Ѭ٨uY!9i2"u&@DAAA.<" Bc-~Wӕ~`фahgk;۸\k &OHüoR+H<[c\1}H4g0`|܅/|vqãr 5r@ɣK1p]7c~>nxܜbo_Qw_|AF||{q; *+j0,himp)è$K䮴tFE=U\TtԶa69]˰jmXB1}vZ\2q,ғw<5ͽBۆ* Gۼ-d   \zJ! tqGܒ'cMy=iYCtso&]^]KG2ݩZ?Ҵk~.hnPCU.VY|G'.2v,9\3/)eѬ^hg[S17yZې AA .WQ]cq f! p|+v\!̴g8~\uܶyAFa *! e%;aMW[QH%iei~rIo4TѠ!* iP5 vut-J5  (#,m:p2͛{ 2/ŧzr8f(TlQ PȮ*@d+wou_àfđ'2$1ն؊SZU녛vkbBҍs81^y(sø@6jqUP9ڵ@.8Ƽ̫hly3| m44ֹ ֲ2`AAAP.Dg~VE;tkDmY9\,e0aW2U9lz 8Nl{h0U5lkMOTRXWkVJ3=Eq/N]O[-^g9л0$eXZx j ,ssrOfCee%wyqqDfц̲   \LhE҅lDYzMgU6u]U7ǖVJ q bIɝϬV| ?Δichhh "Mҽ?uȨz+asxwo vuqA׳x|?M GA.AsY$s d{mkRQ^Jjc,Q띶NMNmZsG<A+aNC=C`-4+_6nG+V=mwy[ۑ!  pQ! Vl+ڇƢ8~g-4WC l.,=^Vo?uqZbqc!y$K sٛV@9d\[yS);ϷE|˼,AhУ[|ӆ|]ll6Wo{jlU?z>fX_ޟq,"4x^(bY~|앹ԝw#0'Jܪʂ,3\ s5{ppi6cj6 U[]"Aa'<^jFx3{ :'+uʎ5ΏeW=~AʆeEdJhXBP;N4'cpgG:VϪzmݼl6n*xp',<7}T ))\%߯[Ox,c&g?IQ[`_3{$o/z9=0< eW; *5fwp[٨?źOU8ݠ# >]SG͐UIh$yӝNnn5zwӷ~%ꢣ^ K5s=#}#NGx!{2V⬋)Z$ȏ߾8C܊;o[ȭR&sգOrG.i,aw-ǶrƒLk hQrt st[)P ˅ޗspWv\GVnF0]s/^mJ9:*/ADA. F#̚t B:'* ڽ-۶GI{ArILuhVfȉxsjz6/Wq,q`n 0 :,Lҵtq+Ԝkrǹz9TAϒ۵EétI*}qPJ%v@Y^uX-lVKcroXwĕ̱$h.8Ďgse[Cv.YԔԠ yuRgL'Vzmd֊*x|z,׎Rþ!\Tι!_Uw׌qz fQs$~ȵx)g-^)g^JoAA<|_o|͵(td2Q~salxHÃđ),+P]Hh&Y˾ڱyA=f?s_z˃Ci9ޡ:̧by㧱>ywjELʒe^)G[A>0)ĺSy6U>Q}Q^y  pum ln t ;@K0cm;>r yЈrmPp{7_{u|tN,`^8s~`t% ݡzHϡt*DYE]ʼnE.3sugNf[0$':uU[DdJ|Le k:_5Yu L;2l6]([YVo?zWf):]Os}\pg+{3:*Z(aóYym_[ADZV`ohKghSxy iꋮzo[ހ=c90qO|cey> 'iES@45YwD}ο۳i`X~u>7_]LTl⳥D"_e=A߱`yb-WMqZe[+xD`5\oBױ(FMIZ:>]E{GwV2_^y pi   Bw%NBfj}Ƈ뚇qioUW#9;ٴ5Ak4+!.xZz5 &T< lS2s9u-|JLuCsv0QV0wt!y1; C;".7+,k*<)כ'ZRG! :6@`z*N뉾ұW뷖w?oqxѷ~z*ئy;?{k=1$rGzPiP\CB qo9t5~ݶBÙ`l':|#|Ki[r%̲`E]^핗 "  tcL; J艤7sTַFnڋ&et9z-َj69AQ>ډn\HstZpE1}Ohs-u楷\*B>fn$OE[B]]DapRc]j:/+W_$)lu#'xrv~pҞmJgӐId2 CHÒljiXY?B[lVT[ѐwVEkKAA+ oGKb=iC Z:kc" =Qҧy/u K4 #~`ZUgsnyhNV` la|x! k1tpvu1SzzZe]x7ז5ӲWi)zK@=BzYN !cθv>D閑=x:J}7_ uO/VcRj:lklyU\t@L7*]_bu0 Tljf *ЫV}X-gi1p^ d@ӛPtש8 ׼:Ζٗ "  tK?冫@mE[Ae#IRkaP/O^jm:¼p1VS^OrJpiweø'னy(_b}عkweRYKuӒxlNMw7PCR['s˃s>>|UJ#qi(u,KmaUl "OCÔYo.myǣS0۸*MɦqsujOLn<-'hsE`\kOs"ˮH7[&6r’ a1_}1jɯ=ّmZ/=x8Ϋwe+u)% flB+U#yz=?iG6iAxUθKƈ O Os3.N!{'Qi!s>΢|Ju[.DAAѢÉݬZ@H@ƍO%H'bd.XesCնƸa|s#|Ktnބ^k.]Ψضc-9j+0(`u.+7I~B܈ZmNX;ڑ!$a^-Ώ辅6bjO(N=zwbGMd&voYA@o xQ~痷6Lp ԃћ=a >j\pzPŀ£~0gxq:,7vO:>/wRn O~̯+>a<e==^Xfs{uv^lӅ2lz>X2|c_O_n{ibd;WM lMӴϝn-33s \DV˔&3zHh`swY C;8 R9a*r=CxAmˈOL>/s^ڴTKzMlop_LN+DyA{^)և//oN>VWW€&.ޞmW" ӥ~f*nMQhSm6 rt2nrlΝC!&VهV?{E`9rזmAQ̥  BwB<x4i:Wĺ52Ֆ[W{) TQVՀN[LIm ]xXE['1s*슟J.5u;ۤ>s惯6SM'OTlmL>Mlu>Y:o>OfMY+|b#0Jc׷kؑS=7÷<x&%&?y~|-5%AAA~tDFZXW)׫WFOk2k$ڝqE/w'{δUicJȔ'xl0O˹}u C*> {-"^ >NRO#oR|1zn6w&q+<%-2Wy޸Wg[(dǹSi&SϨ[nMVڒ   ?>" EEw`$#e:ɦb#$z 6M_ƛۆ'TG)[솲/ NU{} :NǒA馅Yn˫!w 3v%d[aǥiKY41[O[єPCJK7VQ\\ݨ=k+KǰMuA~XX`/ޗK c|e9\qGݻϖNyRu_FZ;ETEƀN\)IM%D ^m]0&-5#26p|&fFaM"mZ\n92= X<?ej2y6b׬e!B6ssqlv{ b@[YZS0[ͿGLp)a(FO@dv~=YĴxp^ȣw6몿MmD6F"C{M7ro0cmYJHK_`uL#>A " …" ~+ʏ5Vp a'ߢʴb-zop4ͫjSr=std' Zrr0uE)m0oI 70 Wun(W<lƬgp.]累Xf \j6ua$&\u}7Sqh$2I/=#K(2g^m_GfN4;hJ}>Nv/7 t-&{c{Mя!iMv5;{:GJYJQZ|},QVofɅևPo_^lnaQ뺳CS70` &*ZgTNL.bE9QoX6گ.@E~DJ Bݡ9Z?u#AV(|8 02&"GWR8r[N{U6V:%fд5=v9:AjEZ'!مyT6d-*U1h&sd 75(5OMɖgs*vʸuhEk*4ϦLZ!ľZp ؛ˉst*޷84p*gğ#V<Ρ|mo϶d}m;gpvyk 3 jk (, N>MR̪eph&gRL)*T*=soSE%DRPܪUPT""vpZŌby筍t/y}A=E,^_Aus_lүUʆ7^d❔ ǯNiZe*)b6g|škoHoK'i O 5sOh{|dCAYt|jMxiD(₇%ʺfod"49vF] Ev9vXn6Xw6v&b+em5DCs 6=?2hRcQE it -;mX[¤c8)ylr1˼ΘpZJ,׆e9D8jʊ(V<е짹3`u 1}1װt<΂ͫɊ@Uhe}B$,{6g&nX}!ZwS|ћә4wXUNxPa"xE{YUcϿ"Du[O>MʕwIKwַvg=yw%un[CPrɧ1@w]g|L>b%ω͎63o0Q?}d;y^uoisWt^秏?O"6|=c$Gʤ2T:?ޟ\^}v0]Y\ϴ!ʃ7y3~xJݻrV 5bl۝\7r~\fL4of*zo8֢Urٲkӧ0Q'0wR/_]M;5p+ȇRMXy䗚I3{( ϚlgJiKR^pxəmVI, jcel?B?! ˢrxל]x|Uu -ݹUj n2|qqq ٫>0?oUx Yq"Qa Ƽ/텷16%RL(W}SJ(dLt _M\7Ӝb tnW73w#2"lDf*MV5rNqӲj r,;wyC?1FPz\*Z02¡zE#c 21NL+]Hd6})$kFʘQ ۸We|LcȐ yt{.6'b$h- kl)VjN8̉:̮Dfܠ -m0WȶQgκ$0p(Y:fe,|jΛՠ(4w7G\q'S=] IG/غj~j{Y/02m/6pThi(.*kaTezO1}bBx\N#=LJSM◿}/,bMxnrfG}[_|ɑn8^be߯|>ouu͡x wSdW31H-!L;=Ȃr 7rQH ̈xKNA}.ws]LɌwz}aV?2ϦL:.T׼7}Go&%Xȿ~I΋쩼m~#gJl=Jy%{"֍Hu5QY\axÂ!ok=a8Cd 9\PzV]2amf> رu7iAX%(s,ѳ>Mƒ~2=o~4x;]q G0>,3X|2kѩzzߺ}/^9sgd7[./-b1x4끻j [-^g)0݇!Qdsq͇.7yJ8[z*gz۞0.6{~v72*++;m'Rm fцdV\A4Yʼ݇k'hk@9ǩ N||/,6 ml(\JuVۺ-nW PNΎlZ%p842b@< 'XuBoaî(ݣǻߕLmtvn,uA ?y[X"q#ǐ_LPhy;ngP) "q GGt]QFvnI=in@Vw8-p![uޤJڤfwiF6h3ٱwޙy3/lg_8k) D*֓t 2 J> /"|`m=Pm9y|7{Nk-%uE5TJ<] -yYݸhCiWnkj. 4n&l4yPL,Jq-1lڲVMBEYN6.>5Rfg;#"MkV_>ǵ?pk?2zH($(,f/I|1kjrl"l61Ĭ1CuX;ˎ&}4iHZ9:UU0)Wu`9m'tv:AگW=8=2`4rtͶzuj O*~fWLSyw֩mq|n3֩cWΗSY+&gH gıTY@"ͮe_0v圻?_>~\\^[T\+`_7<<7>1[N׆-Uo PPs|AXHIn{7PGW?[l`<,CщarXnl'4;^kxlkQ0?]fH=4[@FxjFn>\#|Q39f_Z!HFtx{7=ʫ {䧭'Q kԎ ׳l+EAqf~rNlXƞ넧4hici]š9A:=M& ү(>t%ȩ9eƿ^es>=`^2 g5w'}7)\j<ah*Ƞ=~? ?J/|u8{{k&v?9߳Mb`cӈwWZ]م A`TmE^z0NssͥV=/lVfS:WhN]7l]Ů)9g { :G*PkjeKVŢeQtǰ~esg$c kRo +eˊ]MO3~(?o)=UQvMPgpOx gb(]Oޓn!>$5OI^)&+| Îb{7#Zl$d ̯'xt ^KTӝX yA e7UO}{FZτ_ـxO_w,OiKZbBRđ]G0ÿ9c(cSx}TWo/bkn_b$?pDSe~)uDئtt;oUsY7iwf˫ِ>l ][-K{Zq5ȱ5t,mAC{(7e/9(_dEkg2FojX٘1zݻ^S=p5}J @ieqǎ#yÂmM$Vys$XoߕZѬBx'd1?||ߞP[f--IB֚Ʋ&9cv~U_t2;~Ί\ӆU0&AkUNxb8~>[@a ,ݞL?lc r4_WnZR7IONl8K^8 ʴ tδM)P|hG- Ĺ j+S\ZF.<(yAީ,:8盭ivq{qyĊO!D:gl*`RoԦ 7'%꦳1F?'mpǭ']f<8&"/."NGZ$n(A!@!ۮ݉x{0rXFc^?ꪀ_*E^Rqz~k^sķְe&m)'Q1tIJ@r5 O»^[sd/;wZ Dkl~ܸ 9*I?>G0|se\ӷ7f:&UDU;u- l28U41Sth;:3^5q> ~qi`ݘDAJ %{v̤'OR~ޡ7#=ozoM NC'yCf|K̴noNE -Ocq y3|tniے_4ǧ_J3AWݣZ5=~@&ud|A{NoIyrO sZЫ3h+9:SV0.l!:;-ob[߇塨̋WaG싸Ao./ >;[Y@S׍c \(s9)7{9/I|xvDkg +96B.ZvC3i4s4~y#|]loh,\k~#= +wD~ƗJ8EEUM'5zWO')>>^^"Qɴiӆ<3t|}ϫfx3ϳYoM=zogت3f|ubbbBBS '52p=/vû<3O|_?O|#u紭U˗mؤ ?]ZW-5”ZmES8{B;cE=^/"{>{O[mB!.M*?0H ^!B!pBGĩ46$.:Jk_@!B!BKB!B!IP!B!BK(BBFQ2A! h4 UB!B!B\$(B!B!%LB!B!B\$(B!B!%LB!B!B\$(B!ToTtt !Z !BY*(L?Aj|)7_}?x!c.$a#{B#dB!D`$&]Ra6'a ͮ)˖{9=5(4l_.Mޒk26'%J^} BjjfJ,}C>{}`&i lミlͳelO)$:d6^:o);_~;9c~_X^~{9LZ:jrsVҽ%1fy~4a͹.2w0}}{zc?ΣQ 9iWqߴKDe)yi^9Squ{/k5˩[sl]7.#U{Vi0o;Tw;6*{?weiw,^嵙m嶈3s1{\Mw7/ǂ3*p|YIMVږ q)B4lStUi43mk֑Yң;IN.yGϜ0~]BpS?5ZZk}nC|heg|;Vˆ }p-tԱX.!Sn֊}Ez~rMu% Xr%[v{BqXxyifYg0!5yc8XJ`t(-^=i.AJ x;<'0;lGꎗ m;{{g*/ V'N0bOO\!12^FχE趧{ZM{f SFv&ЩyKoӌ_qjo61DhZ@꒏y<+_ꅧme쿩7H>w F \û+7z30r\6qǵ:Y}S"ퟛC5gw+2X;o/Ux?v]eiQ0ʏXHe)l? (\y'1ρ(+G+h,~I˽ݵ,nyOYŘ@88>{6me=nÄ́yBFC]2*NCƥ+Sxƌ,yO?g '_uKW\nZp,)εڵ1ʐ POH97-+6WXPug=!D,UCE͔/ՇU%}ɦGH/BAe-”&G5gvMp~Tn[+;NST~A!Z/Wn?XCN<@~ oobes/<)֟[{xY*X9m"<ϤonAUBq"~ױ7-2+ZM@nLO"N`N`q^=HF `ɒ%;}Z^\^ɇ'7x22JZf\F^q,_=(~YKcp6z`$}뮩ruƜ'྾ֲ#+WsT]Edno1Y:bebk`FVw ھLi^&+|A@qVƫP",X|N^5txlqrhIʇy״v1e6qm"oOgCEɚ*NsddZ μ'l.- OFvA=} s{cf܂kё6RPN:-J+.ók=;xVwPf]ٗ 9CGh 5?OJ!D#%dGDt,%l8^ڂgAfEgkѱhhӅNFRdPX$#{v W:;''.~hٞiڇi0΁-pS&FIE)kևݢ :u<ZkEN٦rSYʩee(=R :+U/9co:E^7S ΃)/umŜ~T& Nm'}sht47Te)˂u\(/%]=(Jٶ`sIq$$h6o¿#HOgV8r m-u:h(Wt.b@۰g4W yÙ]!9S!< !D3FVY FC>+6Y]歷>ȕQA[zE6K2=YNtUE1ECO;l;+)0ڀJvokYUF[0w3r֪{Юjnt?B\0&?ǧ72;m\ѓGmÈ,),21̮Yߒˣ<|mBaa\R5)U,%?:qp+J'rhMl |+WO"V_3t+ܚZ15.N)H:-(eAAE2'>Zl K;= Ed+"h$(vBh}~;ɢ扛"CIG)t$XCT0O&Ч§c|.mз7- "Zykvmb<wHʕ4juZwDrj`'k&b8ckTruQ طw3Gl}wZ g?t27Qh 5a.پo+v+ GeHR!z?wm" !-lÏH?G1\-;WhݓG(.CW?y"-m. ŷoD`)<>mjG`%yzbde˹Q6f w !Q'|<]-js*}}@L_N6 i>a-/=U{c&7Eiۧ|p,g/uE&z1[䗀ڈ+y`js^YRk5; f|oò2-~zS^U3oE|7qE`7~zʛncxh! wDZtuXf%JuZ ydC68'Pb0o؞B!ٱ>߬^L2@=ʢ62ta lt% 2QOX:zKOǑB4Tpi?6 L@~D ٕVTR%M:淵leUٵ'a _ϡb:h&}&,Bkm@l$b9̚=]cʱIن.!k#NJg)ItI.Pڳ7~,<^ !BRNG.5ROpHjMEɜ4%1#ǧ$OǑB4x y@eΖTJnDšttSqk`2UTj !Bl7=y:B;ug`ZS)9NRjR,3px {YwK5+Kf<ثsHIJ"}lcѣ< sqG{xTPWSxή4Mu^w)CzAm)`p/EɆo?UĻUwR`N4>OK/2hw>"+2/xu?;?UcG@ EIP!Nm^Z&t!V>F*&cBxgqދW]?|ydήJk5p {8Oq[;+TEtv}7~U{uu^ٷ̊8t:Fg>;v pu[_Gbvqz5%I_/Jϛ`8v-Uq8|vSk:m:NdQ Qc[+iʪSC]ޯ7w7[^-///ğNB!ؕP)ڨ7@MF1fD?Tشd=9Nn{+08}-`k]3zhL*HZDEF] OlSn;POȸa8i)'75R8.;úᓻ N݇cF0 ZMlI7ʵ 4Ƭ$9Fe%z5!@n}ne,>}%N,xYݸcZ|lQ>ǵߍLvm"`&o/lW Ƞ) (waM/M o@anĤ"kYSMK.U1Qf10Ǚ@SΣ=OyL%ٔ*TdShjUu0TJf~0<8v-a1Rtj7Kم&ylLs [~_ *99cמ鰘1L's4W= 4vte8||bi][𯸨M QB!9si6^4O8Qmy|RfplWJIlbl,-4=x_ɐn^ U,EZ  'ANU65e^!RcxlKwÓv_UOEaoşTA1zP ~:8^Iٖ>wA}o"҈TMyGH+0\lUzNA/IDu"ܟbޒ.!tpkH39qlGF{H&vm10iۛt86=X&ҕQ8s֚p}Shu_Mh[K;Yȿ"@lʬGa4xWjÑÇH?uwO\]Qk#rq~ִ*Pr49>RmyU_LDğL懎"2Oh1Y}@URđ]G0خÿ9c(c*7{觇QvwM 2-#Refytz[?5Θȑrm:3M_g3a<|6w/&$ħn`~|}/7&>}ϑ<HDT33:rj ?73lyy5'wMp|k^{#3aQ5W&ܛ6^uٹ4:J[3>[6 q13Xh{!Bԡ S[;.^-S؇n>@uu~jj!&[:s`VY͢en\1 *4xua@X mod!HEG 1≓MJi:^6,.>A x38zϘ)䚗DS|B0`m߲v - t9uo{Kr!3~#]ӕ{zb[NJ ]Ue]xQN8yxC}C ?&Iɉ torNol6}< ۑ6z4r NK߶UޕLٓA R/;dAo[OJC1P0dd>sgv?&CUx'GTD},+[JAD;web||[JB2.1LYq NeQVEhn֢ bڢǵk>XsP+qIz<ΡIHh狋9uxiA첀-%\?,v  cْӇr}UqQwq1vMK)Փ@j8<~b'a" ٿ3607N:-!Z1W)p "Ztnr:<-@˕J@E7}8VSE;XV aW;Z=6\\&CB5} VU3o2 2m~/f8ko?ߜ"o[a|8#g 8xyf:hÛ+roH§qֲ`NgƢWy;׹֍% ($(._SpB!D (u:YG$%m b O»Dp tkY\YCd{?N;csjonQNd "5`xT~ڲg=/PAokr>G0|seN+Z-W>WLP<}( ˣ*[qx⛯!zy(P ⁷|X4.5?VvtҞ9l_ C SQm=6_}ɂ(722,1i*}lB+[ptd|{ 5(q5QM瑭Ъiy8Oe lbYs!:o<;u"M ).)BSy ?HFW] !B!J@@ 'Rb2U4l&/'N k(Aq^HP\(&B$$B! U=&'SS]\uH }VP)~OZ !hFdBh?m}Eڱp<= o}֞ I0P7Bׁ I @!B!Z]L{rsd (P8;ͽ:u[68.ӥjR֚T&uդ7M+kvB!B?Zu v~Z?mSEXoToj(0hߧoĹB[Uj)g_;X{B!BgyzӭT;X?WT`P\0 T+kM4SWͯ:x7 !B!F~]BVA悀 ,y%@q ?beZl$(B!ϪÙ{v}XIP\BFQ0z_ n_eB!B!zo~~yXgTX;HZM+@!B!F]~?k!@q ?q$'?!B!K ```C-$(.( U*=s#5گB!B\, P߀  Ņ(X -k' !B!꽵HkA M 8$(ȂN\B!BPW IO\Pl,XAV;gB!Bq1փMMp? BB k I?!B![ nib!; ])POB!B!oc5G`c5M F(z5͵B!BgMlBwT4R*) ϗ`B!BV'>ߛ\"@q! m18M=|-.͆Y>?Py~S (ݦH!Yc~6=ʁO\UhY;-#hsl U(n#$,.O7\ѐ= &sCd\pXƗWjEX\G"B0 `iT.BQ$IrbpDP4qUlw,CQ$'97۴ʞߴQ:2LL!AH>?rP1HyyD 4MB!`(*½x9 @>EayIArc0 C{¼ mK^Td)U 6$ebEHkV@[]]E6!hٵX~xۀZ<k >[@ 砓1M9Ac*=A k %!!W+H,ΔvI:ѱ ttQU2J/)xF7@:Jt߽+l(9KБLs0J_+f\xܿ[@A60 <@$ٜQlHK:ncn8iC(QxwIJ@ u[Ed `&}6~~穙y4 n 1 $ifC(@: LfP(\? Wa GX)jxGjQE"GM3+#]rHFPpJ‡S9d-x+F7dq~L?"l.8BDv ܉)߽ Hrl膉%t( U71THXV0e(Հdo(`z~#lVTT2 )Ls$~rX& ]Q`XW^+PP,$!.T4bjDT?n]- S+XkHS'zҭ ̬pj,t AȚ'A%?~ !%  rd\fхM " %apNƠO.R9jv3G2|%I7yn~y vi1>]NU;9O~p} gܨUL޸a@$AOd=W2@XaQPOŚF6 !2֫"3|ƃ$i_p(Kw (>}/#APE8FTQsyHКI3LA:HZ "%q c@2REHPCll<"*m_!1Kbfx$k̙ ƽkk?i:!bD:H^M' MCi!W0ь#򑠹#!(ְR#7FpPAg"a bB}G^MI-"B{vKd@)}`]+"Tď UĘB߳  T"0)‰Z`v@KEC!5cb;հtk!:f(*XeM{p' _G!4 dh˺QS{W0%BY;NH*%Α`!foi,oM" EhiVu^WH ZΓ`ZBT:N_XHao7`XhP -2LxXeOl&asD@NNnj68 .N/Alpli{7ҍ`) !aOHQ3v۵|l-*u˛$o\|*3ݗ3*4NO/b߂6A;5piþlx}Pwvo] h?>? ߑn04J^Kug@xȾ g}N훈e͔8(0HLsM98? D(6rPGu=."kn[Sӂ9vwmx0zyE4+Daҥ߸\Z~\uzm(Fy"n8UƱcP$l$7fo!޾O?q27fdO *'aMQo<$r >2B$wn;gۭ{ڎ(MLTnN"Wc /Dt8ekp|`Cp$Y\"Dž1ir'sWsQe7}>#@e-:]}H8-wi$'?"x\s,D$m_An}?aCy?W1B|J,hDO(x+ʼn*.hQ-VoySݓ%w?(ȦhF Kϵj>& Ei A BP|6ov@t O S(7Wb!*G阃XG¡-qģa%f[Vr[#$`^~\Ԡҟa1#b'Br j5,Z$繆13`Y2шLkK$M/ .S4ZK+ۃz۬;p֟-a22]itwuFP! t#H\Ykx-0fF>/a:~(BFF" CH&(KFR0E\r;oN>Rg>,,tT&!Jp蹰r צgeg ^'3d.ۻ#P2|>NcǞE*Ccѣ$ tqeK ߼rǬʳlH(vpH^BX79`N%nQJ:epx&Й_&ΞtWۏ'Uֹ A @%Af 'Z*ʪ&^k_(}#=}B?ǣ/ NSWw?VPQdSq/_X?(} hYa~ ;>.,LWo5Pՙ"Pqqoܸ3_\XL +Rdqv"ʶWqY^!HW obje uCw.63]Bϓ cաYo *(!G3pN}ijW U+8Ɖ$iu-A&EnyUln DYdR|4V-!oQؖKvZ/q\1iK^׾{( l8Gƛo)b@ڃ?u}OcOuu^Aßy#P<*ѦՕ%qˤEr}}mmUg3qtYGҷ1FfXz0LUITlmmu[kZVզ-T-` ALͨA\{ԏs8k%.Z5D% *[b';Cq=vF:)S06{>hNRzG8 "7` Y5Y~r+jw:<lǎ˗?799Gd|$9w )ESZ> :k|zPG?7ofYKN@GQ(H*t~<֬~׈AFEkݍ'_XXUsgyA']" Q0t!}xw!gJ&kD*Wkblʈ}:,` Ǟ=Y>+Pwq֖gp=L0>*^;SN<^47v{0e|7\(@/`=+8.f'~e,.\-uEٚ\ oKtXolAv+hwBv^%5f[^y ꆍD*ND!Q?c7 bQF*tޮ7E}F`tmZɣ+B>@0ZT# PdS2_ ekb>cgx(͍gox"IZBuuY5GxJTn [tE(Fx,+ީTJhh$"Z::;蓾Q+L, dSituuT,NI"7  #F:1J 0GZ< ڔہ)"| j,r n]\1OvPZOOF4g8*MvH\YD"!L_CӪ bd*]]G^|. ;+HkPD$Jr|i~BP5]t7:@x#nigm3 _٥hi}. @if f~[Qh]bݜ2LʐȦFqN.S~h6 ocxtˋD"_{hh-G .Udҩdk=웯"!3w ?cYZrt*k˘G<FsF,zhA lG'Vr8DdὩ)t~BGopdrtkQE##/+S >}.jo[„?hؚ (c # n\m4QJ <#R mw}=Ï7*Fif2iy'NDr3L iPgG,rh,&>K5%иWY](6Eb=p"fion>HӫԬx?#L*ם$Q 3ɰYm^yHo17#n^{;Vͷy-Y)Pl4?7o*ɝ'DQHԩFv1jj.n4)L!Z#HXD}fb 8F 54|^Ă>/!ʢ|AUrME$$q`x]SUjRۃEǼjWjMfŲ\n,uUÄO*Cg^B\*)" @ .O BA?6 E[W5㱲H=O:>jz¸r 4܀pѧhSFZƛӪ b)kjx@4TFP x5>ut h[XI^\h"$pH}OxyO6@D(kXAJ4[sN#AĒrHLpZϭŭ,z<(ޫ+´BH6E9a{.#AIH$Pl") ?F눆X]_#XjQ'ıg]B9/}[Va;C&D :vL>i*Mcѧc|+ߴm&hh V0 `*hyyxV!7JCoo6{36S)s[ޗ6}P]nh87rSйYMuA&>iSliٌIwm_;Ҟ% 7rh'"VͦjM7o[b3FM {̼ µܜF@bkb1uFv |bhD ,LJ,RKE8O1hBpRL&vIDs3nE< 2DhsM&EbLG(LIH`T2!S'! VnўBY  @\rIdKvdd !}:&.ȊZ]u{c\vTZ31ޣ s+skD."ӑ>CiѤ{b._qNjh$M>U%EɉVQm_r$w@GO?R!8#M5Ӆ\# GD w/@De<83M>M:0<^{'U1;ga|b|d:~=9ѬWqpzJ"S71Op>8^> [zFwhY/Aέx'ׁ@PA 75J4-h- LiFh4ghV Uf*l+s'#;|$ 5lFà *dAܞ |^@6 h>EtI+4w28ڏyMy<^M;]oX==0=ۂ6Pn~k_ l_D"is't$ԲMopkG'[ 4K2 _'5 v j^sպ}1ж-tō4v{6og= &Utv -@>[@& ik4ZE;0EjDnxbBtkI&e/k˭s~Y bA~@w38*l&hNm:*c𚉦[(Wb\SДd3)25rL2TMF7/RrG&?)uEZ$7 zHdTB[4C (Wd+++D#x!LO_NXqsk'3E7xēm6 {;P3lVَ@&`V+:jݝ(61qUɍBlp\CǞ("ycO}Ptϛ͖ ,|LqXӌYx{A0Dd2!$þV)!lCt"TD~}LZ]E]*:u,C2 iQ2R1oZ^] }_6 {GS*-h3n|OT}$zƯps[;bmwo`ͻ߷O*@9vkduy'_u|mKr߭WzoxcS"-}ҽnNحΘr@|^$/ݭ}߶Tyt[G]v#yiwg7*x@{2C]FExW;9֛td1<8( W+UD1T%6Orh\y5Wӛ71C>.؈?spzVA##T2%z{za&VEKwWVUvryT:+dM96mae[awQ͐5EdA`T:6ҾEoFpyj.Bk+/"BdWalln@W ?j2t2%׏xsf*s8n7f~_8fN(I]榬bDAqvj= U\N} ъ"I!x}#G0 LG{ujVFAtD]\C&D)GJ-)AcOb~W8uͯ r.ܜ'tÑ(֑G&ZV"`6K`MKQ,QV~|d"B=#,1LFhG_&w\F8k!3iP,* 硃0"(:[1j>ӽV&Y.BxFQ;֪;bWMd0:<+;IC}UluQnc84~kNOa^W;xin#1~G}j!هC" W:D!FƐϭb򛯋''i2"AZicO@Og4KN B!94cVK,DOGJfIxHwtC,ܚ]}8kH38:1JJ:62"Q!J806$f~ɣG݋b4KD Iڎf$i !H4WKJg^@3 S)cR2jMZkN][ &^hn4tB- [.|/cmJɩ1ڦ&[^Zt k*mGMkQs 40/=^ϝ;@7Ć'KȮxL__ڭe$Q#h30NܤYIZ Kˤm, i4+8l\x9ӧ>R tt⤽~wLG"> fΚ!lqǙtO;K.wѱ>V7tLvY#~0˯|OKu*Ez辜z)bmKI LfhzOb,(G%nBwE(~,?uDUv"{ITA#MTtcU !l3}%Kp( _cpo@N\ư{/cv; `QOJP!fd:' (gddQI\ ={!'D B2ϟT}4;7JNvJQAKdqߕ { /p9 !  R O}Q:K\D{3D+]]dg$ELO`(U^yDvPD"XX. NP?ݟU8u\!bDvm'n|wM#L jQ ]0-~Q*f1Fm6׾7 E4BA4ݸog5Uպcź g (!Յ2~Qw|lg}ͻtGG$ q D]^YdhJr@ q+ȇNbMs8z$oMa\#QMP-(s4@4-GDL ^S+"oDouPhU}D3( }CDU|neːz֚haۇkӤ-:ztwELONMDacB TB V<}@iIn7iJhKgWsST*Ps*q~Qܳ['آ%C|hM.MtD+8rtb,~g>^х<O4,_%k )d3$%Qg1(t5cDVU4$*~pQ:N] kDB(z Fv$AvNymb _iќ(LQBǶFB@a#(eQL3OIE4VLB͓ ge3nݮ" s[DJ$va||TLfNǹ0*Q9VJ#ݻ#`]tntRx>(QMۙBTu =8g_ ^=.>~˱)&7Vq4њatEQd{+?ڥpVwcB8ghx0!CJޢXPElw?Ө60;Eyr>vF$GdSIA{q4ox ox7 ox7h<$n]]'s' \.?sg!O"HX}@InEUEf6_4U=[|:K{k_m|~\٧Af\IrY*\2 Q {an7onN SuU2TannQhtg01 YkMLy %k d2J":8s ~ϟJE, Di u)tuf 9ޏΰS`nvউp>!Nn'_B}}}ο70Yk0%F;, ?cbbB%ACz0E!=X^!с ,[rk+(vz yK Yp j.@ 244w޹(><<,4 w|샃CnM;#]F'1%C(&a_ ]Pl)WL$7 o>H%8ZX vgXfQ5޹noo}Ge)= l r8X<=ڹ}[ek_)Е7vuDʕ+ẳ,=s1\|~ƳBouzTܹs3<4/T0ѣ?o< ِ;~8ҋ@rIiqw߼(ۿ{by P%T>YIENDB`DisplayCAL-3.1.0.0/screenshots/DisplayCAL-screenshot-GNOME-profiling-settings.png0000644000076500000000000033734412647526537027367 0ustar devwheel00000000000000PNG  IHDR |tEXtSoftwareAdobe ImageReadyqe<IDATx|չlVٖ{6؄ IHz)CAM)!tlp7l\*V3]ic?_>OWuB!B!]@!B!B @B!B!Bb(B!B!rCB!B! B!B!P$B!B!, !B!B!g1 !B!B9H!B!BY @B!B!Bb(B!B!rCB!B!'@Qv!B!B::;,B!B!4+$B!BN/4#= 4=C!B!q̹)P$=tu!B!rrD=y9@ 3 !B!C2?snN!P$>&+=V~5 zƵlyQ$I|vOr.6[ !B!]]ld 婀"9 @,m~Wm>!B!Brӝg9N̽$8mrYJٞU!B!B%eleQ(t'uT'fC!B!BI'_̤{1" P$Ķ;OWDcB!B!\%m_ ~8I|?{Rе !B!bҝ]SmbٞѺɟP$,_@v|- !B!bҝ埆t0e,&Q(t%sbϝKP~?!B!S+ТJSG{^~~ hYa]>'^=枛ͥ.ԧw.~x S!B!SxLC$MGaٶz-lAms Y[oašsE'B!BICu(p9#׿#] -J0si%#/k0['\W]6E/x0qM4X7k  ^.7|PyB!B!r~MvO?็8[0L!xVbgb7n@}e'/1]Þ"jӖ[qM7u'Ϸ/{vmG$N߯d_b˦uiH!B!NN͒I๋߭`W`0œ"s7幘FmNӕxNjKz-(ȫx܈D"y5FMxЯo-[W_˙Ϝ9suNXr9J_0h`?(<|N[Zڰs^)¸[;RuHC3hȯ۶±Ʀ6l Ӂ oM;?c̘1i)))w܉|dY:p{>яkJ !B!$yfg] [J #^Yx:63J\ŏ;cJ1ZK0%Un,;ֆ'W>pXC>8\_m^W_}U{y㱜yOsruVUUnLEP#ɓaKq`=nV)&xG+0t''-/Bf?&#8x>.xcUzeU 6~;/+X7GfܷF7` 8@rQBHݻLlټ>kP$B!ұMb`a>Yd"Waa!X EьyܜysѣG?cI;v.yI1󫮺&Mx^ymСi@!(*+=?F<~ӟ>qU+IWGVZ`(oI?}ku2=2ƬYs϶47ᦛo߀_U9B!BH\:hxA?\~W8]A S'#! Eqۘ~}ZxПlʵy2Ro+W\Kowy ~gu̙$6ȑ#䍗SY^x'w] &N9AUu5>kpMX3ǽ_%ߣ '7׭5}|R+Ȧpl޼> IP<[W_)1cƣ~C!B!$4SG;: ;ǡH"M* (hPki7o?SO|ixNUS::BRRsٜlkmM>K$e90g:LT ɼOݻvJPъtc5z:Q,^1L: /L1ao`͚U3g.f^2KxMuW&motGƟ'.~d;*k.v?B!Br3)nHȹn@W݁&h3Nr pn|oC x.Cu&y0y( #/Gy 9'g?ii( ◾*<Щi j]=N,oSpuP.5MokƠhZ8d\K뿽+:(*rAy557_-Gn`M-(.*2.(g>--9:VRݙ|Xҍ5gv6cǝ׉+ /<5kVK>_4O^ߺu39*Dmm_/,efyps(*KϴaU(,o5J-(|n:\N6K{G4{کMoyt,OIPXNva}'N`B!BG^t,3¯Ö %: B[L0hS8ǧ#3K.;8֬Y恓uhnjcIq?1!B! B4ҙnHLiRԖ5Jܖ-;f]ENv<L-`#r昂q7Vx3R-˕+fWWW"%pg\.DQD"*Mtuq*~eM/\#B!Bș;/ = 8x^=-'# B^ƀ'*pG4UP=yI.'CM׿͛@!B!g<| ؓH/ޭ 0!B!BNח -t$o$B!B陧I>,B!B!g<|HzaDžB!B9s@҃  B!B9@7K>]FZi#$V6+jilƶH>r:pJ*jZr7vh+F֡v_o7A忺lgDXw :s8yPJK9jqm}0-h#~5x*Ōq[Ҭ*L%B!rtdv ?F i=la aȐN_5*p}qܵaTߌT#HpɂP`rQt{tpCW܈%*ضȾ#tDMRD4/?B!B!@?4H#m)@DWWtơH9PSeyp@Cs*c2g% 5BQLq8WTiRsd ~Y?UnR!B!rP$Q\`f#[ǪI`EZ;L qҺ)%5TlkܐnjYGyҒ0!pm=:{"'"xO7*Fڅ4Bєb/!it%B!BȉCv*之H kB)P=i8.ZOun.]Z)EI s5!5֟Uj*Baʼn _e\%,@vXN+A$,,Zu iG!B!@?gȺs% 0NWIqve-p_?GV59}qڱtĿ))8\wZ w ;Vy PYQ UqIOMKAN:&(1 ֟ A!B! @H8ll[Xb[ZZfh-]{l0b]j흀BKs lE-D\W,DrgE4[߄_6?R(B!B!$Bϙ`h1ZQi{[HaAþxqߎ+z某{{H[6?'.,Vel)7`]ݗVB!B95P$^ ŬGo#U~TGŀ")MåjtEW6!CQ/ÁDFM* dĿthsv b  _[T!B!rH3Qw 2҄PdH`뺪"aUSJGDѧ"hs"a~iXoH*>XnDЏE}S3b́!B!@{ifgE06"HM =iiQ qe` zln ρbl DfMQLahEKC+?n)G!B!S@?)23Uqiۺ[ѮĠtF $YA?c׎J"ЇCWRU%Rz(V"=҄XK[ /f qſN? p!+~Rm8B!B! $P│r8EDTw`p! &?s+~w5nW Bqqx0O zy +%\}ng/ᷓgerEhG,2딿h@.U N.O2AߌۦǕ3'ᅥQXRuJ8اoǟ4qF(vA5XePpuSs7A `x]q^xegGQF$؎H_UϕlA̡@)1|<혎>4u1kj14೹~'vP#`ZMVf0*"[7O5>yӯƟ⪾Ң-@cGϿ̾ϾV{L]X?Ŧki*B퍘lj/|()**}Kv[^i*%jv!exmG^SXHGBpFY۟]U>9_sֽ: E~,x?C)/ !B!S@?'MI(_:Z%?k̤zUVm<*Ovfol%.4.bq,9t 6/f ~,ki]YVCZ}cq8]Bd6fL˦Nè}ހ^+nK/o7]Qcz޽/ae[> oOFihc?r뢒]?:q$V{跂k3Ftfxaptr4 Qg↭F WC3z(p.zP3:e B!B!BIeZ笭8v/No~88t9PR'j;VEqw!.P#)ZOmnG#Y\~>n #n h \R44⺥)um6ݎCSW/RRNx+ޯ^.؆B> 9@ӷK2xi>+*rQqmpUQqɶ,_ӧNB>ջBpy}=>5G1DZ+a[CqP/DPn@8쒢 G4 ݡS$B!rJH@V:̈ "d>5@兪h(X ȁST*芌ªؓqp/=`߲"o'}g*<4E“Xv R̺xav ”phw<%P;"2i(T)c LK87-32?ࢣ] DwAA>b$o+7jQ^(Wo2Q(Wϗm=#`JC 5S7ݒ#ꯞBYO8XĨx޿`Z4 -.HHS\"@F/l3&2'wMO X飈U<F_ -Eh?Bwmxu&௯)p3l@Q'fw$G'Z~'Vۈ,cIo!jjɴ%#AՋ^zU| mM%XYM56NB!Bȩ ɟ },OIVBk_l\Xfkq^㸠!qja3!)6nr#!d<2y@9\ߎ^s @zr?g!l.yXw]X] ! Wg?t%7 +zxf@Olq4 ւ_QRbœdWFDBqy_ŘԴW>v| cіirpBo ,ҷo?sK7KoJ\0[;ebaW'G_^gtU&ٺc/5DPR]sCw開K]Q\>݌,X ۸q`6?EeiЭ ՋϓA@F\ӯ^-TN# !B!S@?=R(]KX)X&@w_!ZJU،+иGVGGF#Wf_kPN!F?(vs.E:BľVe?t́kh &hE;+,:q۬ROaK\ϻ`<,]sƍf$O,zN p,\8i4>yX͇sfס7]*=ԫגmqF>cg?}F{\7ΟShFԐWO$\Y- #ټ.ϴb p^cY6%@iYi c2s4x Ս5a;^#~9.z[h)MjʄB!Bȩ %[tl⟢ؒOGJswPZj;,ftRWT]r ?TjBl vD RCjxew+b0nیug#Lk LhhjIe].sCoY#bVzY?/3z$~/,݁~#o\|`xb)u?,F[ž)N8/7 ˵źX;nj;*(k}=tڛqYs65E[ᣲ"aoG(?~b07L|V-+G[=4- +4 H!B!Bj}?\؇*6kL VVT9RU (A6$\8p`591ctf6 =V-?I=7S`΁FwmA;|`/ٳ 3R\V@ 8KHSTEAi ^ys>ve.3Sh{cN)0w⟈Edpkg͕KhqS=:BMrMEױ/kO J/7e` w~9ޟЎ.)Κ1znaצ;**=-OOzB!B! %CL/CKJH/P\kB¡H53eL;:Mѥ'ĽE*ЌGQq3hhM%~b+-P5ƹ# ͸0]~VTJOTȾ!xEUV<>ԑ\b_خ{  us.ݷ]a$`}xdǛ^u0-K|r\"vtM3GY;n/m؋.FVcf/S1f@7ίш~!5 S _ OQYz.33Obk'.lީEX"tcp* MZ"Pr=u a!1Lw^ڪaA)i13 ORI+6~x2`άYZnznTLYw 9uFkEfPF.ٵxeN.b?ڝf_#mQj !gпWZ{B,\0v LZ']} gId{=_?q-V!aY#:#QxrNT?Ik? Vja&cX"Y>zb FsS=Wfb3OD[c!B!S @?,fYi֚y%%} STԤDÄ%1*Y:#thnfg >4T*RbkujP=`O ZB[`}›2"30I4*' Z0ځ{?usއ$~gp7Yqu0?Z&-J cЬ.U5u)ɵӰm!EG?i)@)Dn}FE@ ]|@{!a3Zꥥ\V݌}1Io p[wW^OQu2m' @Mh/kV`KL 5Z秏zQ,^`-[6#tXbW^8oNZY- +ߕ~on7ΗZSe{Z}}V'#)p)GW% J{iz J:>I \8;˧OC6!´ۿoor}۷1F B!B!9I\020 aY0*luZ5VBqLwdgrPlՅ~2杷]z>Ǝ{@[nJ^=?|%-B^τ|'_G쫺[WNk MXN=7eYOF,zMK.k6 g gAibHoi Y /`\6mlZ;e[~;۰`rpɄ5MwPX;Yl]X]6_ۏ֓y"GB!B\QHYSH-%7{.[rôɓI׏,MC"/iMQѪB2]_,K ĶHCǪI+k Ր!@$,6:"VXE̘n&Ͳ)9/a#2XK/jR J PXB#툆#֚ 1,D ~XO+Y,ȴxv杰fs5pbA?Ѱ,CX5EXoxI״@QDCrޱX8('58f񼨏B,(;n<#"MY݆ )z~;IYOїpZ4 Ey;Qw\PM7kݮ`9NH'.wIO6B!BN&/wLkšH5jm4w6jCg?$=@ =A04Rf|wύ%%nϔ uıXʑFQ:p EDZX 0W }WOZ/~( slr;!>!B! P$= !~%ȴPJ|FHk=)o,: /h3غ~p8ؼO~R[qV,nr4?đ]> H~O (§uEC(wGphiU(ÿ8B!B! ijKgòK 2Ru])  L?XCHS)56Owv%u/=h;ny \t ֦]E.uXb#"^AB!B9Uj'ȋ>)k-M_/sߞz<! 1/jUĉ뜸^bVaBg5*9X/6CqS d.te`LK@ 1d_J\P& VD C3^.b CB!B!=gn[hHz@6dŶUm9VIKىuYY`v{. B10j ~1Y6\=zݯ""qi+'<>ۖ /B!B!A! E.!%%䴄1;qY~`z v {صLk?"f%+o_SD b]!B!CXƐI[ +qk/?#"Ggf"MOM$+o.?U0Cw  !B!B{(.~%z8b˜.!6ZD6 CPzmt/a{V_MgR])}h !B!B (a_/!5ĐR{@JK(t )m7!La+%,҅? *, {" !B!B[( S2 Jϳtbi6[6 1Pl[=n&i(tSk~s`+L+@9y?Yі>z0ј߉nu>Q 0Qud5(%`1Ҿg3p-߀oݙ=&B!IOf2H&\_2Z q|Y{`'RӬz/YR#!']y.x w> #Oō1aPt̰I̬Sf/\2Wl݇?uV\;u4`M}4%g~?-?y(l'd3Fa:?ЁX < O3f=q)s8~Q?T2NO<=%cԁ|%mXo';㺛qg>?{ڍ2V\5ZF7` j@=f5 7>3Sk+W5F)! !B(`xH'8QS UKTLMoyxߖ'60r4|A3: DzoGLaqJ (?qWǞ^vLːNlfWעߺeoѸu~\ z슙W]\܀~wގ:w*C ^oj]N6[SVbXpS=yn%~ݔ]L"|^Z*GWV7^}-^l=nA͛\t{~<*흠v2W~E>㱕X'2GOKqb޵i˥؁F|g!H0﬚2 O\\RnVVwu=ξNs1E}z}|.kݸ>3݃da'>fL&&?]u!>>sKF Ǔ;z W=tv Jm WyxuhNUیkLg.EwXgc닾Gw9f$Uv뎦h¸kǗ/?: z>>(9.&jTWE`Ƽ ONbeGnԫL}<|cr]k: wKzgԿ#ލ߼ҀFOջgQNxL-f/."|SӰߨ뛑\uqK}uoW)nL\ߍ}mQ؈SEFyQe(\G+ǔ[Fp{[e}+ƍ%؇=qcqY>+AU߷ 1ʎn1+:ًX/2+GbfܨiɋXhv:z9VGmmFc}QNB!P$:gODHTak+&ncbZR43ΫQ$.1t,E|ɉ"-2ւ2؀pꑴTo!JF9)<)O!,rL c{%n7q?:h?'8)Epmenl.üxX4w9.cǓЮڠjqbԽ $2BY<>F:~c/Zm?tK9uk bA[NgzZ5^x?xUoՎVx_Tч<{;XOkѾ}]b{gFIY|?V[+̾[\zU}:y/yx˴tڶ|kĊ9>a?4E\K?^3y|}ݗٺ;13lsCF|[@~lKp`GcA_{=<Գ|y~$b\>z:4mb2; ]67 %IW&%2VJ60)ԓN PB,OӳQl6;3چ_߆WY&f,ƭk۱IB4_?*DAen],zOq>X5}1ՊGvt}7:X=.CϬS>dX;FUƱ9'\F~^lo6}6ckDZ7k"-M8Ѩ*vWrUT;2DYLd)+Vouͧn*j0ǒ?)uHY a+Ι:f˧̖CxP Ϧ6_6 'W#0rћFεFs|Sk@E]3=u&+Y5FԀ?oVl:q_t==+භa¤an듰e+rB! ! a;CJQex|` c*LRճO6Ix䎱V79cYmXb K`˘Zۅ7iu-Mmu$hWMB܂=?&i$o^-5TK>2/"HQŇNu=k^mNދl3xo }_`kqݝS<ݷD5~iI|&OvX߆g ۷?mc'Ƒ>mj} zޓ֫g|UƨG~Ox^2-l-*|7QwS5[qlIYF%3t<@#fw^ot.U1NlޢXcb&c55" Xb/(HH;;rnޔٽݻfwۙ73o+~x[ ]h , +ZKaig`Yҕavp!B(ED ԿԩũVno{rLJ"Y*끐-ZLPEc@3`*>WfƙNP9~Z9m%fO?paž#FFyP$؈>xz 0womƗ"^U'") j7ç#`jv/+ƮPêO%Jq>>nCSJ\F'e:ܶFKH/=8^ T`Gx<>G&f %CBA&}޺F}fLʂkƭ<OuM7[$ſ %82PAْy)ZJ.L=gq㮗QދcMm&q;lS cmu8\pt&&M-o-G%{V-ր>m//R(]$O?\xD]{8ʓq񃑻~jk1SGþCw_"'.'VյA̜~|.^,O Iv:4+`7awo}UЬ6ODdrT5ؠ C!B(Z>Ih$8աpCp#8'VqjM2zfI AiHs<)ɴ|1ΏVc'b/]6g`Οl+kVđC\e𰩸b#gLek@?afl*TP\rX}uJ&[7cޙbϮhlOn܅N凌xk{ B dVcaGۈӢĻ*c`3މWf?'wh&.q1F@AN,(}ͥxba8d\ˀCk5gmΛ~oQ?kē?I&`;+-nv'9.;J0wq+:dQ^74ux6y2?oAEv.d׵z6`]q8n<3@qPvv; /PP4T^aç/ɘٸg`‡67*[0r+>{}ǀ~t7{fxT=ێu`Wc<>i(5x!B@Bh1@!a@E Ba|N`)E1t@?K}Q[hX~6ch:LfB}o"厷 Mo5a톕 2hqEZĞUϘsvvCO7ag g+$k_e ^߀.;߁^Z>m[ҏPZ$-ƚŔ5XPB0_my&n:XLߍv:}P]؏P{꾲ibkMq13~X`JZŘq "`ɛxogvk^{?[N?zŘ=Duk־6ni: ?vqSéYQ:jC}񂻀WNYx_p֭mVM)4?sh|2P\~ 2]HX1ics6s'Zk/pJ lHN9X݀,!`V1⨉.7Ώpz>Nք4W`]ԇ!&Ў\NBД|, ]ӬXۯwOlAʼnJ]鎙(>]rpޕsp@{oįY~ "[O^Q#q&\(޸<kBLB! r;ʓg׊pvA6#"+v -o"pC%R ,a:.~81 _9u(SV@d6m$H!B!ft-I` hV‘"kEmAڨi ۬~VО`cnQdn8kkGB!B!= $egy*5 0/lW4mg~6?LMYb;Wme,^Im !B!BHB6ъz#])YE?sihE|w:b-eoXĎ2D"B!B!)( E>KigFkA\ȏ Y/7Q_u=DF%!eNB!B!gAL͘IHWJ$ Kp]R")ALPP\,1=1P@T' D<_牀V !B!Bz.I18xE<*9,5N]WXK21#%,L!B! @2m]cƊ!4br012=RdV5ͺ'sbePB!B=P$)D_%Xa6c.}8Qt뚛 PPUg~`?%v@gK$vH!B!P$)J86&lWYpmbwqJܿE-;B!B!ALb`i/a+Ӟ)ڌ掠2Dp/<`{6ŏX?!B!;HR&V4]w؎lnk >TĿ6V&r;B&s%B!BP$)N8*"`2iح~r!EV* 2P"uO YZ3[OfF-")#B!BYP$)#X+U4KhA: 4DŸ*5D? %5 9f63 =,B!B!= $e'bĤ6[C]"L @kApm: ihh?G{LVT@L=_ZB!B!B)&NVK@^ThE&ƪt?_C=PSM{3E@o,ľo bƊB!B!\( 'bu˜ m]c*u}3uuh`Lh?މſVDEŸ5o-B!B!L(1Bl/.b҄H-C5kj?2[*?RCld'.?=A!B!ғHRƴL.yYEP reX˚KpUpa~P6I@"`bXJCT~q[!B!BP$)#pJsE?~&!r֦-];KKP`?؂b#)[%0(2\ YoGoI<|f-@~}B!BSUUeB(B^T"Kb la.cFu[»d @ 9tϴ[k-D_Z@Oa_"_g"ĿCaĈȀDB!${PZZZPWó׶BV' 'R5cJiV?MM2V,>Z5Pv4T7;"JlJ$ =w" kj2Z D=ؗHwM$1})0fp>&Mu,k"bș߭Ž!BH'o>_|P4|xwM5w$!%>c:&Ci3XHF1 x_-uAuRKئG]fCKBb;}a⇉22ogq<9M/^kSH!Bz?Y_[5j$fWR$} /R /iw 6|Z~k j P0?%^^{"`2Q:o"я_gfCFFf8kN?=Ao" !BH/dg 12[}@'hN",=vTB(=0 ,Y2^ ?TyeC? 0+03DBs{9Ig!Gw4:|YB!ۏc9ab/ Tz4֔Q0kC{ԞI7NfѵN $lweK8hjV+vg/@t΅/zH~0:a,j)(NJO͞C*ր ~.сCB!7Rl?YVbcIZ7|XſzY] #=#P`"bۄ, GZҌc#!k/uv\.N"Q́P9~~0kڄi/߈x;3#H:d[tv_Z/~X?IO PjlkJ w`e9g*|>i,z9~xཻ*^l}el>|1>l}]/ƅSs!zKWڛh_ 9ֈ0wS'@۵ 7H?yEF%ǮYxov6 N3"B!.zWdh|hhhж-"7өYYYhjjRwPmm$Vjhl.i=Ÿ朙;gOk/bWO<S)x/72lMP$J20jWq]+P܁EQ%#I!iz C7d^{_Dј(j)W;;uߴ=-='.ֱw<-x럏?_Dyr+7`W_aݬ Bԫذ&aJߖx`" QdN+^00-&B!ۯȶm[裏ᦛ~ѣXt#YGg>--*-lm@ w]v(F_VvV񍍍,\pP~>'Y;G G! qRL477Ox +?۴0^">9-W~eU𩣵kē+Oǀ\ُV(ο_X6V2[a0D?0rH]QpDžSpLX˾\߾^2~ᇧa܂/x9:]#j|Gw+9as!i)WccޏEJl' E0qi.%cy}ƸLi/Oèo_> }\T'/BH/ڶm;SOŵ\c,ҟD֯/FCxPYp:.EJufGVxBtjgnSsV)BqMw`17hߣ~2?c=cn]|FL`B]}vzI۶mc=}ֆ>fZ,K9lE/o߽{Xw84[!Y-#܆dl }(ܶgp=KkBU<OLݻ@rexa.,o6O̿<{eg=G+@ҭP$ywD xb }#Ś7#Vxi?_㻇0[.ܭMx= sf0,MA瘿yE|ǟ듌_~s!YΝ_ -^zn<òSq{n!fߖNqR=0[p٣uK@6~1e Ca{5'LBM8S~Gz'lXxݕ(ڐ=\pqLHr>տw7@T}}nɧ][/=b ;{ U'p!qu7[-NnfWP TdO-#ҌZҡ{--L aw{ 'ގ1Nv`G jzlso­tT RTc9o:r7-}֢:x2{;gAWcX7BHo{FH-=jڌx )ArQ0IRW|yyP$8V|;!r MlݴxNg'ʳiخP|Z=g-l]/-žDU* r8S"g\A2/ލ̄Sz@ d?Rjj/] ƕe|RL/x z'="I;.yr*/=w)-(^Sb r˴n›53f36A}\ .CZ&ċxzpŵ4.}A]/xGa>/~s!E~S؋!Ǒwv<$x Ghy%Bz ~1armժUm;ᄓd&кU3c"&vuewhŶx!JJw]EY Hr2.R%1]?8zb^L@ $uBFϦFԚ* ~ }8oj=~wxcZ=/ހ>ٌ/+ڮe ǥcѥڸN sGV}=zl)m o$㓜X~b,̺{,NE~U5\I]3bSV j;["dmss:8bhQ8€nlKcM%Ϩk/í-8bG V zӇ_q9J>1_]QYpG#un'fyb;Ѭ5KY 2'䫇J֌[Cu۱[+T)'VX/W`01Ǝ՟T"8}Yz$}ϗ@N5, VEPlBHBu)v}È%%{>xۦN{Ӭb_{u]E׭bߛ"["MCXt~1-$mLb'YSv&6P(UhibMs I{xUU M+[kO} ~O o솿p Fm(2,:v`KD`T\pËEk8[O3bLZ?ހ{eh rS 3ך>Q .j5^e#bb$/_ƼWݵ ˌˈyXu׬M0@^u.u+::EϿ[:w9FRo!k`ګG? - e3M 7LG-a{ŽOW`~osaoo~z oB!= ܎H1M2aN@+,ZΛ0G}e[K^"b ?ag~UgLFb͊lZK"9oWb ](L9pȀ m&8 @ $u:Mxgu #(/%&X +\Μg| W. Ohݚ>y-<3S.=Cd/$Ii &P>>4>7qUhM **Z:u( !΃?ڟIpei\)ډum<{{_)')E8,gv2cXkn'4mo0" ڲzݶa7|E4Pk#[Tcm~$D#pHomp}/2[G{=TbuG–t08uf_B!Oס(M{C! >-??HsƷ眂&dggEP8Xb EiJt kXaa'D8!Ytٳa'DHk(f?]7c%9/:ٌ" aٺ8gP<:}:cM$ļbC?:-=*Z^M_}v{CAl]W91.ώ*T&b`쫺Vx0Z'{SۛY]51GǎĖ}jw[?ߌw/8PL|c,K1XE7L.WߍO]J$`Z\1$}cE]|͛nдSb,q”\ap"b,yP ,Qox6ɴZoeS^ϰKs< M{ p~g N>< 9bNmG3*E6V/G)[kib^n P`]Bq]dxcH8qaBdD uRQ:% ȭ\Х۷O(jqIz.W=0nBt3ϊnfaydYxxOa6X-5M~ xA @:^̀/[Z݅;H?ψi vX8C1@Ƴ!ȍ;-xgy^܄@ZFfEUh 6aU Kv7DAC1ޞdν\Vygex\a:mZ#qD`ki3ZY1ĭV4EL6-e)YE@xTk=|+߂ees0ptMp<҅8ib!5  #&V_Ԏ9`4 1rlTF;cW7O=bR.yYJbB ƜJ-r88z1l@( #YzU/~mg#G£4H}:oe }e:GL _ c.¬znH;h0rZ?q'Pdϟބm٘8:B!G@I,Ĩv㩧涙tݵbI$GNpu*)ٜpZ"Q!`7}KE7ZO c]4Y~=~VK@<ɞv_o݅7?[7cFl]pUdo_1gKt*,`FJPρ쩸nSB!DrÇ 5W_YYYhjj]ÇEbE mG-1RW[!)*"JillPqp=>}v3u_ى]~نJt(H?}7^Є: Ͼ_vUրEpSqŜ xWS0H*]6HJbhw4[%Y{a2kDGI/5x:^w߾7_3眇q Ú7p5>]uȑضRy7ac/BUT.C`}x'7W_uFcZ:6˅w| {~3ֶު &b4O&=ȡW˴"$uaH kq[p5E@Sq%MR$ݐB>uyt.5Tbl~t̚6!f7g7U l7hQRy6 IxKxkx-1b$)7`grz>N:0m½efOV1acu~V&Huxuq PLJy !pʼB!ӝ$@=w\dL6fiqvFNYHk^N$ ݑ5,,GOYC$lv)RMf!h_K `؀lm|Ie# Bu<^H Ip:b<\6z4Qi؏qS˰9Pd%~ SJ|&}d|7]v:kcK!L,!^x;Gi |"W$V; C{Bۻ{,vg"f`#LL$~‡B(B0 '++vwe+1_ HB! pDOwSp0W(~6FP$*F7̝J!@Bc©' z m6!Y: JK!kMѦgpbXQN$} !UI#b~m;8JLA!ҫ̾9.Q_OU5X|%+jd- !d_H9`eUALRv>@!BI0l (X[`Y :BȾAr@ۖ*j[B!B!@`. B!B!BB!B!> @B!B!B0 !B!BP$B!B!CB!B!> @B!B!B0 !B!BP$B!B!CB!B!> @B!B!B0 !B!BP$B!B!CB!B!> @B!B!B0 !B!B8 H4|w!B!BH/ II!B!BzIl'B!BmP$)C @B!B!@2$B!B}P!B!B!C @2$B!B}P$)B!B! $e(B!B!>( 0!B!BH!B!B!}Z !B!BH I$B!B}ФB!B!> -IB!B!AB! ( dYֆk/MEd1t:p8L!n !BHC|^@~_vr`۵B!kKK |>&P$B !BHA~͚藝#++KH"ISSPYYLM$Bj(B!rب4۩ }!hEX !B"-@B!t% !F{b 2+շA|w8Я_?Eڤk0!B]@!t/BY$hձ$ 6,D +2!7Q/D"PXlZLmB!t6 !nla 'G!w9c+ $w!PnCV(Bc InE2O$5jf5J{Layo۟evDBaÆiߎ;?B!]@B!|á0N;K*QM  i2jS? kK.,8& M)}o0㵸q n"0qN!'eDtD,@q\l٢>EEsqv6@!t- Ō;:ΩLOKKCkk@Cb*b|ӦMڐMSv96;W!zdDgI,, 33؟bd㻳OY puxo s?w!D.^j_)\6ROb*37ޠv85DЄfo ϫ 'Ålf[*x1ll !;;@N__#|BsæZ\5^tP$"[Oф?Ss B >Q f?},!hB9Yv u5,f!Хzc# U]83NŲFq}LѣryKu`=G EW3ԿjG?BP$# a:?z m$1P,H ##ͅԬ=.NPb?/BKdXdҜJΎ89hŰ&~'2Q ϭYɆ'uP/VPo A؅OgX-!.3s^Y9oHX7"\hAw_d.wΓ}ƠAa=񭻮iBtBxެ>3Af<@4!hiwi7P6/0ļvĉzz󓾏 M:y;^n>վl=l4F yw!L,H*CTp^SK6DDH'ޫ2SUWnj%(֛܍ȨhouaP+,VF#r0Ŵ 0GGcMp -dh%[4d%GWdAPR2' DMWG}rV/ F 2qQ9P"K/DXG <҃î!-] C5kHgNՌ',MA3чX^X5 =!ؙLQO ۻɬ #v kABqA:t\n!նTZWkk'!^NĝOv_DEX:jg&BgKR;9i5|b M0aNDpsD_9A! yp!4ц:T _}Viih !]_ғOxܵ(VVaG\%hOs_i]؛snhE0#LZ\sDţD@jqiB 4 nu]*F?= ižpnĂ|DMp cv-$ڃnzۢV{B)f{5VbwСz)B1^~Xl-g["{pa;GNC@G@iI8Oml܌M~(LD!& BL7[V< ~6O)@K+!"lpB`puD Q H9I^}QXQ|p.EuPR4+@] Bz_a>tW ?V%OεmyMz6BDW`D]Q@b✙W`7„oذa@'ƕ>r|}Ѿ'Bb&LЦ A\B4 TNC EN1jIn=9xhYG]BFBzԋ!!.A8.'ޠ;epv!wvJAqhn"/"d[>?쐓"z~|hD6r@Y(Pu+@Sth.XN 0^ſ1tB5:bʌ 3QLzG3u+XF] ]`u lDJd\Gd& )t b!H_z]EE8p b7hg9͚X|9rdd|£2lZ' !}fYA\K8[4^Ujl.BGp}D:ˆn9A]k(gSoL{m_#oHy|r:2]Q뿈˯źORۈX!Rd Z?5mdlׄ;d85=9WfDihSBsE@wXg'dސ^ZE@,86WȂNm] *ʲ۷s%,mɄm2~L+"tM)}N=n|Q)֖}b 4%܁dlZ*ڙ2L!,LۮDÌ'".nO[$].\c_J^i3V Kf%6}6Bz/2D'*~8" 2'B[^Gwԇ1vhހ Q1 ]ne0u 'dsF xLdj9zu_OhZ"bD(.CHԬ®o@^S K8u4/ `i]cMA5[ǥ 5%+ex#Ĝfo.^~#=bҜzB>zuuuD5R ڗ_136oXW b72Mծ+OGc!%%>o~۠͟!$  m1k:vv"sZLy-Ӄ #"hŸ 1.f6a[Ot·.G?cO.AC:t9j*jҝ2V܆fd_F$i,],?L|B XUշؑ0Rb{gb)gbz*4LD{L@}Dd64kBvm6B9iH2!'i!Ѵ&=xfφSu -zxOy{Z~ɥ:p54[7ٵ(':g&ZVf6`S Ca(ׯ_YY~P<8pƈ!诶к&)Uu^lYZ7w!$pomK28f@Bs} HPb8"v;^8 7?rNy?u]`i8vN=yC`DVm܃^? ۨ"4@î Cï)0*E?4,%/!>".BP ꃳ׆#d/1kvs9֦;‰UĻBCN;Ϻ !t"Og'R{Z-J~P2{~Ս.V[_KGKp7vxT6zLHRc^e =ƕm柿A8SqL<%,=SG,CF8,ډyMϚj' w]a *D\ z / /?uũFU3P/͊o+[~81}pHKHLa;ƈKrߪ'.#zlTloǖpHcұ{GXX##~XL{Ԫެ.6"BzBımnnnc'a,mp#Md6uEEE]KKx+1 GNA"~j=,ć_lC8Kp GOhrj7ڜc՗b{^CpIxq(]30cRL =¤C@uH`a뇒=ؽ-pNno`ϞßOr_]~Մ}/נo596e>ԮAU8ui? ! 9?%&qQOQ u"S8:D@(64g&/=Xrز0pTL?zL?d̿N[>x}{ގ~ v`6җÜk._K_ o{!(c6!؉g (ø:c@ċz?:UP/f>ŸU-6R -lp#I"[זß1̜fķu<<3-:poc]Ff+h::+Ύk0tґy8jJ.n}>vk ={4=W֫m;)'谥cM/({A0Uxڎp| 헋4g{~s~jŃn{6~>(QmK{4w={C_]juNv\|$ FעoKӬR<|_6 u賷-OfI+ -3M+}R1DGzBpLv޼Mussð|eK߇V#Հm3mwH"xm) fGCĻj{=?Cܯ3UM_})\7,:?'@ޤwTгe+Jzc܈'놏ձ-_ ?τ؝-m0d@Z(2P ?G92yƍPՋ+N1>o X{;= K8mxi;ny42zNaIp[WpP j@9S4]rs&_O}\oRɓ聸x|eQ2|XS{ շ\L^y0xp\(z//z ˑ>NB鎥Xc]c ,h2KpcAw"&&tTͦr=l9=U=.os7c(][X\v~Ndob&a/AwU!i5`0:YG7 l ())QewZfX^BWONNV\ʛh[v~(ںv)=7q)6͋I.DFPVVfx /t Ů}:oC;L0ƥ(_xdB<>.` 8='G$1j ?~c& "CxNW`az9lQڮy~$"Np~VV/`0Z鴛cɗtbOc0(S}mrwDF_ޘ&C恐>}?."vk3pk0f@J,ڗ>Ǧ+&,|/^tNod72Gӫzbsju%ʣW'rx|k?, ̜1ħ\=} ?*ʦ kHƜ)z3rTk\#cJyzH<>g:;KnE!,])ގ9Wʍ1L9lc7rb;-/K.;1Xgr <W %/Oiuv+ZBWcZ֟wl]1t\=A nkjv$:yRue\ W l@}MrzьƫFtJ???C@i_, הjF/5vDB/AW# B]?80c||gv:s!Ewcw HZU|}4Nt|R*Cv|^!_Ζmpd 5/I7pWB$`?qQt=}]g֬V {o 006}Qî`|bD,EA]cܮ?DcWG0cLHGd7P Qn˪G~ꛤbBoq_=Mn[7G񈑀]dV'IZGAo:)y.^$e5p^ߗl`7yyQi%p j+_B9{(5kr]b߻k|]py=t70ۜ~M5V8lzVDW}6o7%eڃ6 %`\R@|R.7І=!f؈B$X9DM˘;&굛ފDV`jj2ij>-p4S`y1( a3(rX3sE#S N;SHo<}F%r=zC8d;ґ6?7 L5 6jDϔd2-w7,8XK%lsz69 X9BSIC@G"b JRNW__,WW}_ }?SP{ʻ*}IJPy_RGzU^w]yX[Vog_܆[?kxJ]:F<2efQ<{hI~6 r$9CwX}fsSpl8^[9O۞Ŵ߁m_^}!+nዲ*  +ryp3}Q?/{htKN@* v:^: tJ0@AR/M_SkrKb?Fy=?YAe;զ^GY=}[}l==1P3!bz:͛`M[^Uh6Dٕa\H ۉ1ѮC|JM(S^%q09c߫oyOI+rwț0c .;"w`_"ITm\ݯ G8vyYM~櫇I| 7_gC[\Qʯyrj/c +zDvH/?/+b}Ӊ?"$Z9U5+媾 Y?>>ށ1!+W"eh4':Y"8$Rz?3g#wl8oYui32˃hmo?mt흻?ɮHLm LuIMRyoTUN<.O~Pfy77|Szo=b SoVy p1XҍebNo 7XPH= TS| ˑFAhT_7~ЩJVE,T5$(E}xqkxwn4'&7(Ϥ)9ذ\.צf\V]-1E7cҘH=úD`M_U9hb w6 ̂A<Df)N:lNfAĉ {ĩr[1 gt],9}ڇBDQs >уq{ij.x-Bʏ6(  zu{Ce'J9Zm>ډuv ?ĒOűH2HDGD:XAupЛz9N_c^/HKZΒx=/FmvPX`3l0q! D"i>|sd xhde#E/ZݬxQAѵ m~4u/څt[Ǎ v"~rVw^ٛ=ÆL85Pcy|;I?z`y;cgQuzo >+p-zojx/-DŽ/b^7 krOWNC#eLAko(Bk {(A͛JOiU3,?Ime9%ur@$]PrAhQ~O[)Fȓ )HFف}e*͆=ꇑ_ovA5" yX8ŗ3e_ܖt-]4߸KjcO|ROCq]P cucz:Hr~ÌWSokNX >LU\rUZ -f_NQ]m%ߨAOd1[ibsB6_.o1A^\?I:`ז{bc` |1\áԱە fb_lWDy}yx^/~ ٻw=(F *͊f=zP58> 3'."vE'8vmAS",1̳Wh%OƲV!MK<\ vɁ,֕`7z_tsPC$|6P7PԹ..}*݇*Qg/C-L(M. 뛆!u]LqX5?LjG[>v|Z<0p ϼYkP=&l݈7oo/1ڌm?G"b$JL5 5`o=Oޣi~:_qG-??^@jT>meaו%k88|PmO,"HqfW_Ɯ\Qk߃o^w]="QxHvh\2E4"'MXs1rkl}fu|>Ķ#{bqlᑈ4uu{ Ǵ9Ũd9݈?Z3nq45ڞv_O&U&\x^9{ܫN '>3nyR ?{7AȡgbSBA5XGJv_ÛN5q"$r#Hw_B/•y~3&;Yer8v('-VV*/Uoed/mPRUSSCl2>Ĩ~ܹ!uApM+>(k֬ a6Z+`RG\16t Z/kkFYL0O=k'&/mzCI@Ϗ׫ުA/CEDner1`D Ə@T7`9UN#,(ߟ%No$2?Q 1CoV[_ /0b9:F0vJW@6<\\n5P|6! Q""nr""|nx˧ G. 2á++FlCMem3PTV|?}]MC-.x%r+vr"hIw?bs9E hsS nOi^c6Rp\\2(ɰx%(~DEE)_RRjqs;0o ڠԝuMbu]<(?vd BX'7QAqp{J+\Ԃ3x}M~}2: 0Y66N}|Mny ʏ9=E ]Z>yP@1вʒNCr6RbeX_V@ij0u3(opy6~Gd|2(=71+2V̛sQIy_-Dq8'L^!C:#ߛQa`-!5 Ӷ[3DOdlA1׮]2.LWdXE>DvXV ?23 (LfG%Hķ~6Cd"O/aGOVJTf/߻wo!2"nk\~x&%cڵ\DP:/vּ}'-19 ZODϫe" Hz5kk|@% ЭE^I|Y"ODa]3,b )#Ȣ:CP xrYpCbd̒χc2#'9=*%A-o ^2P@X~ʾ", /Es|1=aPjOD O+ח'_"2 ""@[; jآff)?j*GZwȢP 5RX&p;n]i塥F2E6)ӕϫ'F8V~~wfx ݝa AF 6,DeFD\ DŻW^D)ozfrWT`\aDAR4=? J_]3dAOZ>"F bq=48,@T2=ó]p;Ml3i A:.?Z u~9ZW&~|F}"O4]j|^"~.K!PlDq/<>iHEXu=ڸA>9\:9Pʥ\DDG@ٳ+ kdb_.XFԄ `IBmw#+{8 )ЉIL^e elWF_^ @%(2=Y)W|JP5J7ܕ?ǦGċVHzCgv]sއiQFsq eU(F l&,l b>-(erb ӘB'ǀOttY!RRѥS|*QŒV)A:J;"# IJ4#ӻRbV%YFDHUhn|Q=ӛsȏ;DM(L@0U^DlkDD "FCLk9ZjsG|, _W{uko_1Do-W_y`M =J> <.MTĒG2̨ 'Ukeey$:+]^/?<z8U DTtjƆB3N]Mnj4hB}HPr}Qh4a6{eIG3f#"9[ {!= n b9#z" 6:pbbb=r M%T|Z6o^Xf@T5V:^&V̈OlI&8@|J BuzY3'7DM6J $$$(FLb/--E~~m)2p),_ ED-`,)>D 111JRf\_EaL#""@"">j*<"X^^/>e .xbۈXD3_1>"xؠZDDDDGDDDD!BDr"Tʔomt_m~aY~IYVDOdir Q%1rJ0J}:DU4(DDDD' DDDD!ND A"""""""" Qc` 3Zf0BSa Qc DDDDDDDD3BDDDDDDDDD!M)hlLDDDDDDD0(1 @"""""""ևDDDDDDDDD!+4Jj=+a˕@DDDDDDD0HAe$Qk Mq%2 RИHDDDDDDD0HAca Q @"""""""և@ DDDDDDDD4@"""""""ֆ@ ^J """""""je 0Q @"""""""և@ DDDDDDDD4}6L""""""""" a+WbsVڎQb q _;}[r[p吜{f` ԫ.W?84tu"g>;kMߏ.>ƜgUՏϾt3(Ubیojᶘ3 ҽ_/$`՟y{m,ێ{+p~-Cd)--.$s ?e?Nd֥rvpJg?2-*pF`:z|9+J:a1-78&o3k5ߏ:hw xx;{Y|DžM?-Ag:G~zr yf`5[9. #Ν#B4fVR ^Wc Vb!=b)u| Glֻ8 uOo۳ShPk]'tU 0kZ)r: ڤi r+3s6V)ǤÐKᇏ1sdKwO:U"x鳑sm5}:PƘ4N,e\J pxs_D pxOt mL{ e.d pƒ7J经Y`OQImgr47k6.-\_I 6ތ"']Qcˌ¬,7 ""tSx}Ya}X;&%`hsG5}E` 0׉0/Q8q]7NPo,,b 1ț$~ ܋aˎoYӕ5xL0{rdz_.-aĝ/֡Vd}~?!Wsg!_uŔYIFHn'za\S8UC cϫP0r">R;V߯CDDDDDDD-/Ȟ/$cV9u0<şa0qX"L: yI:]%׍a)rOC" lA/kj7p80~TX=EPA@e| JdK@J{8o Y / fz☒`0zIM )<O 6a|i\$y}"C'GSqJZxsC{ 8Q  @sr?:ql/- w@6\A UPa$5*M7$b6b:‚F(wS7z_gg㏵ydLO$ɯwj3 O^J-+lMܺ 'R{+Mn5ܱ~ |˺tEcZC(\1{<[1־u~g_:*R.l|~zq{fm0$GDDDDDDD-,MBS08Qc(1HDDDDDDDD$"""""""" a 0BDDDDDDDDD!@"""""""" Qc(1HDDDDDDDD$"""""""" a 0BDDDDDDDDD!@""""""""f* "ji$x^H6:""""""" DD-AEyٍܜl8Hp$%E.]`E@7peQP$"j!<rnZ -"By {3vcْ8p0$``>Z^^ukWciЧ_XmVHWl6xnP!""""""j trqc/gG-h{w:썄6Rx.[d2>[|ϗP RH1絇ɓ1ɸ,3gkok yKslsEN|]kqۻP|*n쐸CzJ)"; \c<%j9""""""j?G^\\{ǎ[hgxn]&k uk1Gށwxx3S νңd\.eP䖿'W^W9&,sDDDDDD!@:":GjR߁م sO)\w,t3g0?q.?2g_9Q F(YYU^6A<|ur8MgpX8S-?V#HxfAlJ -24z6~3j-:5ˀQ 9k n|]Y'1}JPa^w>;ϿWxpAO< iiEF*s'ؿ R=f! ?oݚU58dr+NlGw0ʜ\743R V$7܆ŊOm Pɻ?:=:񈈈N8[DSV./$o9vڀKq=孄 Tϟ#'ݎ)g< `RZu+bMxT89 ud&ٱ퓧0}i"._W ߼/|ov;x T>N}R߿56WD> Wyl7fF,Ix7( °f=_D-îM`z%ڛ[q(x1تJmtVқE*0|8|Y"x(?1 M J.8 t7\w}4сAor|2l/t\y^/Jv |#|3$""""":O @p0k |6tiKW+t(QfoR|kw)Jp_vpy? QyMQСCRz|:eTa`yaּ\9iwE'aXSCk@ KUJKĂMyp B:K;tտe[JpqWú:Nk_Dˑi#Ƣ~xj:Pj˗Ԙg)ղSMC­׾UG6>rR{ 1jg<#lrb@kO?%"""""  W+aLH2urmG;C%*?) zE;p5 Qtۍ7oÕo9 S?C4NF\c>۳P䔿Jw꫏3z-(>u,"nnW C}zu7">:*$3u>ǭ5Õ[? _շmC+ _MvwDDDDDD-tԾ0!2 c,'.H%\"Cozw o`$W̫iO=M*]Y? kq?"+o#h?o,H[ %I1 >4vqɌ67qi@s .N5`ohJaIU8K$=(=mNJCٿ!zt'D koMbE07m:J(bUk7.qሤ!@xTGmaĈȾ. LH$ƚQKIɱ/u0&6LEEJKpMLǻw\Y_C'437 #rLNCljHML^zcCD@,ÎbD<6GpU X[lF=A@KO YrآoqWdbշ?"7nFw`5`seczt?7 :3.j)AQcbbl߶iiݔw Ţ V_"Z4~Ե;0?+ fQr:`j[kwg7T:tH7Ltʽ8}zB%>SmBʒ}+K _/A ^VéOw܂j:s,M,CgF|ވWp HDZտ0 ȩ#p\4fNĞ_?;,2iN)q>L\ηP.¦>§s"\1* g&uR+Z<-(B[Cpp^tFix(pBy>gMBxCO]|b;2 6Y<0BͫdVjW؆oG0ٗBj Q5L8Y)7q-Ꭾl? sGxjDBƗߢ1ѓrۂ:]H@] N^XXC˵koFFzGԧf"x)L@D ̹=ԥ!M"EF|Rm`djz|&aD:[X=ػ U"*4W~^& nnN 5ۣs-s~RyYc/kEĤ8t3 Au`P|K4 CImPXiKY%Bd<2Pdplb N_om7mw(6};wnǥnPGl~}bEKjt9#2P<+6Y2{ֵ 3 LDDDMrOX+ # &>L!GVfn_5lA{J/ cࡕOnW&k}`eG9{K/]g=f0u]4}{ )J`xfӿԤ %W^'c@.ߤ`3U#ksHV<4 ߋǜ6/M0.rqT)@ꛛw[!m7x wkᑪrb`.%r].c^Nֳ/XR}aЪV[֝U`|üA¼1Zty 1DDDDDܶۧkEAAA~)-X-[舨KеK7v$,,sF1CiǟqJ VQA=8s ƎVÐc` Ys&,Fӷ?Ơk )#<XtW2tB?bp[صrA?HP!jԝq˛'TddA:{p&>.(Û2G$1g;mµ&p1+*O%K ̮H 'zm=cD.%i?~#A3XJL`?GF!]$_Kl'`?vRnW.9LrB$]`+[ 8=uGiOJs "TC@F\ ؘ+%%W0;ǿ^!GE˦_f^!-l=.q/ԅ~N嘶6;9ǐcP UKU0Ɨc'׵"=]Цbaiͣpf*`bm@a9v]>CCUcmmmiN2[CTP4w,:=Jbn-kBi%ؑGda* ]n<`$P'ѻM=xKUp\` 6Ϗ A[4 u 1WBU$Tmα[mQC`)k'Epm r#`Pj*C*^ >4ks#D>"H u\]t%t?+{LHHQyΦʄ\#KG8A{mpjBN)a ki4n:Tp4"iZs Y ,T=HT|c\5{b&*n")X6[ &7+< M2h Z^Ng ~Y,ʝ0}+ME/ q1Bif?'Uс<ɣbVB]kzшEIi.V,x~yޱ{M}k" 0un@wa""""uGAeannnxkqŪN"@[ǭ.q1-̭U ))&&O{PEWjY-@_~ l:^sBضe6n wQM ldfߒ|xĀ"$׌rĄIjځt:+P]@ *PԝptvA]v~ @mچerb=U*A*BTbtʜ?C^5TRq9k++ <A *4Y{{{2j qpI cMbmIs;-Z3t/Mu'e/˼#""" oo҄P( 9 3( 7FA<@"u,t^}8*n_!3 SrBIazN'A||,Jf*U ZsqqÅgڬ9juPђ-s~*bȖ*у?6Cu| Gmf"U Záp[6W+[Q_ͭwWX=T &#PkL$* UkR -Zƥ/HOOgcI!=j0HDAEI _:JO&""""""""$""""""""$""""""""$""""""""$""""""""$""""""""$""""""""$""""""""$""""""""$""""""""$""""""""$""""""""$"""""""""zt@"y'T*!a =6t:-RSRqe܍Dff&A Q *R3(DXjSNN]50/%%׮\Bppc;@&cH1ԉchT; lS)AgT*=q^ةHOM5|$tI8mV%K{Eթ [[{:I+/X` =7 wUi1Wѷ߫>8j^m"؆RP :a̿^>``Q7"#oCղ@_Eߏv Z$:*̘QR.qL<ouJR]{ii0111t-jg>CDDDDDDD|'ԸFT^ٌWbѓX;oSS_(Y JD0脢&J%R2ih8""""vR) %|pU i`X6M6mEsUM82XCP9;I9 vxm\e;NvrikUvA<׻|/;;݊ c61/Űݵ'!*)K?W3&q''#N=aZ7Rÿσ+LӢwSc"@n჎c>D5#YSHcpl" )=AG~q-Y0q x}.6Z6EpeߩG ,$4| -ϜD* GDDDDՎ9|}D눨J0HULq !6fKí32 㔋ضp-^tFW^ûƈ? ~ugba+m@o2?}}J0g/ct'/d +p5A9gscn;; Iu"fGP_+-Q?]*nD\@a0μӻ`gWT `Y^{ lTb"6dl |(B&._n cu|"Tvy[+kNlX8T<`.'M2i8Mԏۂًöh|l]B}QkW R ,B"1,W O9""""^uդ$DGGǏ@" RD 0o5uLP,>?n]aM]Ѱ=?=hپ93}80 @Yr6!X W?i|(,JDS@4 {tnf!3{ܜ =yRCa!ǭ.b4jeXaCOHMugF0H`Pe}^!) kGY7f*4k]ZQ81i!8oo"- AF!8*y%uH Շ~wV+:rpe6?IN+AHDDDDՑonatKX! U=ڍ yvؽg7v ‹ÉHc.&V+ pO]`~ +Xc'J uIQx#74kmg/ FfJ5Y%Bd<2Pd7)4ZI4MCa;5{%>/JgM2bBN7似56Di@غwhdLmۖLkjh4[ ٽ;:TӎZV_uDTeK= @pxtlf,úp3֪F$]`'Q 8z- HI0կ'#% r);~=w#޳Ȧ \̊O=8/%gg${pv\ ,1SÎ-;r7Qz&*I]΄.U{#}}Ur?"2 RU}!.LwG?ͫvT|(ښ~``)kfgEpm r#\ )$7//3BU$t# ;ȱ{ZlyBu'(l68[Vcm5hX؆eڰnZ e<5ΡhXL>[[[k|y:fI{}][(cp;m(vR N8~(կ%Ξ8kXV o9r.%7QYI +Mb(wJJLϜ"X=Ck)fi8|oj {ΟB@f-abjS̉j. K+q||SxWohM:MV<8@=$0155ngϞAVf!(Nk=q^v ec `VpbP?y?""""""".Oʁf`Ap￐a[)DDDDDa`* $ǎkޢ :a_3GDDDDDDT8>K*SoDDDDDDDT8ejfL """"""*` ` ` ` ` ` ` ` ` ` ` ` =N ߲O%@ zZ2 ?K¹m˰`tm8Bl[S{2 G$=z""""$'f!Yx@<ҫzeƱmR˿.c_:${8GgV^K3;a,yyf7eG-^Pjcqp9qw,2XCP9;I9 sͱgUvuVCQcpl" )=AGehu#dbվ ua Y|)SQLٷ<<~xs\ d8[1aFԞ=F_܈U/~ZϜu=q QIJ` F'PTNCe%O1LÿD& (`ϿXdw (2>~xm\e;Nv~K#t7]@#.դz)$Yin3 _t7y' a3G7/pbqcx|&2.a[~f2#5݂7^Ĩ=HRc2>qwbxm\[piǵ{|`/4sECO 1KYʁs|*c)DD%m8($;X>7ﶳ6J`bkJtiu"^;]|arҋhkxWcﱲL 54wnNبDl6_;B, ڶMv2x"$#||,3D*~eMbG˒`ViJ珤Ke5t&JϜuƻѝ`y7o}HKX~*{򇥊)T܈8q_y8.NZe]EgSSOcIyŕS6y\߷˿ |>F !!㻟֡Wagn7kZbS^]5>/ ķLa8vq)oYuOc7d$P(.CnЯS{8ai^y4,6s8k8)Kvmt=.`kl9:}dD`ƃKAes8-7q$"""bH|a~QSLq|Sc֫?/mC5vSVa}/(ۻ-7G~h]=ٟ0ǭ`OD4!P>bBbMDݡSл! 9$]?d[6H[FXp/"{JvYRin`R %܃и|JuQ@Cؤ8t3 A(?2V㔧dQ~ް'$`3xal#b_q 0EC:2~ׅPXH@4??/Aaݑ:uP [[:MD6f\ǩ[i.RfkWz$J+ؚ@*4kpb~CylV|&wձqNuŝ2 XgnO'/d8%_JWQ9׋SrSWQk%Ddq o"Df'# p+б3heQ f@V"7.&4TRX .D#Cj EH a(V2e/+ֱ->v]1i.b*#Ŧ2a +Xc'*{HIKʣ5önp.#n=njhRU ԡPR/o{lJ1w^>Yu"Mk e ^kQOZSXc<(˺!|RŞ%Ldkɸ%)% 8׋+7DDDDTk{>P$|/ns>ڄ4{zøŶDYMJP=rV܄ i=V]Hq+C&dĄ.I`dm~A E[y.LR>ͳ|ArgaL!+H?e,CJWd$˔8֧9ʫyixE-zك @CK*/R3[T1Ȕ#ggV|SZXO~][ JJ[˙/Ş;%Q\Ҫ<$"""{f(c85G,pmv\ʾ)4[fdAW̼sFOoOSVIk$sq2("ODĩHdURvb<Ghd U O%ҤDA/j)ʱV{p̽hDOvtr)~:d|>nlnDjyy ^@ع }Ї^ * NDfvi`_R=żDy\bjk ~QHۉe^R15b<妨<$"""dlHD8wVIPGn`7Sk$Lȱ{ZlyBgt-a?aٲ6,Vm[[k|y:fI{}][(cp;m@e^:M0CA"3*.+%VE};ݧhhe!jamJ&U%g|1,cŦ_R#lpn?[Hk<=(-PZ̓ѳ=}C+./hhً'${+1oo#L|bZi6@C&.&SZ~>hе1A.8n.8C+;dҕqY?#gn se1xW,PǺ ̗ Q\DDDD@"zބY_n*]W|7lǒxfFu7B D˰r)lAzw'`Ř;{ )=T!#?X%Xg!oZ߸7O@%3o0bVl_Q ;bpKTE}&\)"ϕ>Scպ98"&_m𶐖=MGq =+cŦ_VCHF9ؔ6Ͻ55-2~}&a",8_.c t1Vk[/ε>,u܍+W ,t4TRnV}џwaP nvօ \)}Wā,#8w}=~FŜD?H` uWHU\TbF^dU> ̅'@K߮IM,$G#0slSX㗱__૞nP$U9 Kbm$$27?iiMHB |,L\kWNc99\lѦ_{ kϦЗ,\߯ثm~Ϲ2GDDDT 0QY#{~G +g0||wxֈ# B :Hmmhh숈u <.DDDDDDD5SI 0Q Q Q Q Q Q Q Q &gQu&45Z-BDDDD=D\B * U[bOؘX\~))1HDDDD93ssxzzRBD@"Z bcbp9lZ$\@DDDD/Xl ]*DTmij\veQ`emS=nh U66!jKlhGDDDDT88:#%%``"lHDQMִndx}{ܗoi;`UjW76}/AheS  S#9V,lw $D ғEC)O'6GVy^x-d̑_c/NP0c=3׷0'Qxc{7/|`keV_}aެ-*=(Z}:*Ѳ[C.խ|Utzt7'ڷn9S_ư?c )?mWXY ?c 2t8Z0Y*E8~^GPƦIVU #Z%./a줏чcF\/'rhbq\,wCuOkO' Uh hoX3+V}29=KTOjfÇ(5k*ryRUVU ]dy sv0?-=p/Ivu+KDDeu~ WaR"15Js"'":lEU ua&,F#O5L.8>t72 Pxm-4۸v4FoYedA YO0`OzN-јp8| I:-Š]ʐܣ)^4}TX\4kO\CT)Jt4i}Xul-us'}=z8ː?2߸ w[ WAgmĉ-pJ<.h}L Ki}lCo30g\IAn]/1 #g]/RFe8F~*킅GW)u uo!fۛ>M)&b8)`^kn| /6h3u'FXJ?tɧ0w(mOx(+qσ8_>?ދ ^ )xרҷ}rw/\Q#O V̱F㏙_JJMOٯ>ۊ2g=< ޵] ]Dw3qZL͍@lR#S}A"SKrQCaKn +m@]Ӱo2?}}n̚] =dEl\Hߦb;t<Ml~>N[Ǚo",_MEĻѝ`y7o}Hd6*1`X;B, |x/S.bµXzm^y #jgV֝FKߓrѲ 8y#u-#p %wLy/8?|a%Ql ώ^ DϿPwxŧ$&,sπ2L~9-!DC*S`۶Ӭ?f'~fZ}7?-[0|j=$F`_6Áyvdh o`\uy_m8;-]SC'aD=Kc`MeYـ0A;cޔa52+߾)|CG.$k'E֝㸠0G: Uw5.Z_>@_2nغE$2_WI~eɑy9lڡʶ/d^úIV?^ W)&]?Đ3݁M`elOohg46vQ9,b]I`ηdwh嫔itp%>$>KSG+EDD1 []s27L&{|8aнgԔ@zb jdԤ YY$>xT_O4,rB^ȽcݮhC/uyC.Ƈ"gYᗦj Ia/D:[XCqUJ<%FAb`wa,1{0Bݳ0ǭ`OD4!cAotF(q`Ο2_\b6ىxf>]qꫡp"A=>4BKvk|[/F7 A0B(J& ws4oD_֗>D;q30y-.DcmQK?[t1@nXP2nðYqpg/3]AX7cv"VvKe?!0Kq,3m-E/KbXӰoc?)dBl1DKd]8-P_rϤs0jt9!-g@X8z J̏&g8/JR%(b~4{ ͥ^#yN.' eAqҷ?ymO{W).@\2{?|%[s+DD`| <UJ__ >9J  m*K{yP'ş m^zo;n+T)`ua:MsI] sGNLX*<`KlY%Bd<2Pd@xghd%")K~K2 ߺnOו3}5oAH՚\?&Í7u0.̘?b{@Y R]>C bR0n5邱rk ƗۿC2mRL}RXYW T:r|% ڄ8ڪ]wDp%;YOʨ϶ {f}WEA0Z/;chJ񢐱n&O#J *0gBH0PE2X%m?fd|s+EZ*) Yyhߕ0\ؠ~ƅn˗{ikZ1圵!"J1kd A~Bf {* c#3#Y^zr7@z`0Svi4`^%06/>&.&|VH !ް=Gm#C*(}59P\! 5l~8 Oի֩~X1DᔓQt?f썾7Ց-X7L^:}i-Zq6Ms.&3tfPge5.6 P/CLHOBmy_m2H𨓨tڹǍ{p9)\Ewš%p:MVh,b%b&U%a/o1QAn?= םèf͡< ;_hd) 4hTC#]yʗT*sҳ圈ʯ f|Mrn׷ߛPm*f RܸyKQqDUr,*g __x??\ 8{^^#Au4"'A;E)ӐaSIk$sqR2yD{C<8g> bi¡Px(吶zNsۂ|]i_tpu<,Y M.#,#Eڴ Х~Up< y&}}oż!J*s[էTD0gjKp~ *z6GgO+tw%.kZ*6P:# V_!q\}K:MDTNOWN|7W^[y3{8% 1HTȷ1L8EXq6HL]AcT_h9y E@_1Z.= 1}ý}R4Szw'`Ř[=TeeK4# 0xzM o0a G,0w |xwkT$٨?w1jå)9?|ȃ,K 34z{.}􋻢Fh[ލE4&{۶0Q]ǸV=0oz<:<xgN TC>8+%?tbB|0:2cb УqiAU>v KZa~ƕmoG;5e?iFpuFCCI`޼ءo(%sYeJKŧF7sMlwjcހ J{ +S( jETa<Z"ɻʛ:,$7MQ9IU)=-ڋg{Vz/c^bVP(rǕh*g\8_a(Uia9'"*.ݠʪn}3>Zn]:W~Z_bn`߭[yɍA/,[~^1 Jd7#hMB |lHDDDO,\߱'p42.^[]0˘CDD5𫪠_~#_1]1?1+r='Zބ1HDDD5."q/U H-S&E=fQE@">I9L! mgaem !"""Caڕ,L%q^R """%n-,r/DD|, J&óΟ Gۆ_Igb6J_=~ eQDTmr889gN¡)DDDDX{AP0Q)DT$j0v~SȕDDDDD; QUa}6Qq&i]hK)dodEdp"C!8񏲗Ȧgٔ -Pw&]FiK\:?Iww{/;ƞy:01c1c~|@c1c1Ɗ12c1c1Vq1c1cb1c1ccd1c1c c1c1cc1c1+8c1c1X1@c1c1Ɗ12c1c1Vq1c1cb1c1cc\ܹsxOot54K-Ǎ7 }ׯ7|UZдIck.yufu7`ΝgLɰ.q3sM4OdΗg23|͝WWWuѷ_Cnז҈y5zὉ\G}s7%iZ,g'NNACPUfLsxqDz]Q-L1a _{e~ ݁CY  @E $pMz' \|qoF|ij_]e[}SO~&_LJ { n xbSnśpJ ;*ToOţtWo7ù*ėG7G)y*=ս*|:|s *C'G*>~NUC0wLYlmV6>,役 SL7 om+bqhe{O;G[[g* ͽ_wc1+t ^jL)B ơt7qx ,]XarC 4: JP2')-@j8 VǠr97ʔ. e?E2d~'w8κB>/mFך=%8=E0'Sb9q1{Bj"$!12%ᒭndpCbcoJr~߅aP*6Dþ.}N,ߌ/aH[_dtLjmRKˆ{޲2JohJ@x,' hf։@_nd ;_1(b9m'R9+r1sEyXv72@)("VUs.vy 9rj9Jcȡxwq"&NTb>-[xuט0n\Ʋ~ƎǖAH}Xy\zC?ʻ$Ldgf2c1V8+J#8v` y>;3_'Ys~!*ܘ?2, 4/KQ\g1Z+SN2?5?XjQRp4u:-BcnGW0KxɈr9$ :U(W]Pekw{iq,Bz~3W)J) LO˜#~L*X^Gyރl<*:歮^4UջuXg&^PP‘(Ds)[@V/1zk2}s^Hj\s"^isÊw=P!kRjő4zc }1o(ێ@`/er(fkrdP.$,P2FOj ^{fcօVa}( +:d1cOcł^vf] ɹ9cbPO-Ӛky*<Eψ8Sq%PiTy|t$ V( 5P-^#G˔pV$1)+ D)flcyS_[_6DRѩRU+͙Sa<9Bw(f}.KL0JIN`_* #N$?ON_im@1c| cX[=Ġ0 317,^gūA6{kKWrzDbڬA>31PgN\9br]#́F1g`!89Зy+4@XF1XG2U{ J@BpZy 7nE N|S0tCܶ0?ŽmyGL8^mO38u~ hk!fk}С<4[SX7whuݑNGuݼF]AoaȼsभJAP:e{Q>heѮ1p(SI}z2.QS_~_-tXN؄!FV (݄=Ark-U]aW_D;#-?P2[nYmn/&΅3NjAITrĹX(S`c'+JPCc1+rJ801'CM n6C4Ā3́B1(ַ_ؒŋ 3}71f_9H'oW? v9@*A3:+́Iq#p3qO3UefbBf/8aR|0L3-G*|e9V#V$JJ zadΰ?>%^Xj ƤP2%+H$s]4\߈ߏڬ[ezJP3{X~u>%j1Pr :\cݟo ޕlKc]Dit AGu{m|5F˯Zz=8uq«MM9> /_G}<|3n?sA#ӭ|=: t]Πv >W9T2c12"Z/lhY,$7<`yRTLSbB>Ic1cJGefğULo0( 3c1c1cc1c1+8c1c1X1@c1c1Ɗ12c1c1Vq1c1cb1c1ccd1c1c c1c1cc1c1+8c1c1X1@c1c1Ɗ12c1c1Vq1c1cb1c1ccd1c1c c1c1cc1c1+ TW¯r%0c1c1d5hЀ+1c1c ,))+1c1c L&q%0c1c1dq1c1c 1c1cEdd1c1+z8$ c1c1X@&c1c1Ɗ28c1c1VpI@c1cL22c1c=dq1c1c 1c1cEdd1c1+z8$ c1c1X#*`1c1c c1c1cc1c1+ŻI8s#$B}Q ˸RYW8\Q1c1cVp=sRǥK o7BC&!>Ipj,kFhQWc1c1X.'rV"F,8wg=BD`i9H;1t+)i(*C Gtu#0+HJ(_k[C> _/ 7OK{`߰O2"epBkjoaWo~^ugѮ-6 [v>7gc6+8ȞǼh^.b0!nOAe=P= %FxD<'M͒P9d`SE/A)`PkTpA&}s¹> }ILzS<{fۅOk;C?M/̥'N|7O{a `a۬踹}QS cI1xg8{;(:[)Tp}͎>D'gT,>eZo^y'qh쾖\ϢuQv<ȭ?Q *W?Bc6+8Ȟ wcҰ}C/19w& ]hTuJyrڴ"( VXy*Q3lR'WW0a@9AvoaګHolp+P:C,o),XfFŦs`7n֞+0@@(:9ݺcP4#zХ;,]*ExU_ .0iOy"Y'yS2y?_t: *0Uj.}i,'Ca8375{ҞȾ0c/1,6D`mbnCaV &YtK~ ]LuC&a̺W5KIcL: {a0Blb*4(A&7E2s`CxT.J<Ș$aWXtDG$=˅1L\7FZscAya g6LO!&7:§;UUc̟WN$߱m8aDM;ؽ3}VaXfp)6;] 3O=+v{^ oƼjW1E9NԊ87>;f/*5K1݉a-c2[TBIu$ݍd0;B<,8F+ƮU܄K|_0FԒ I4ja<}0M]q_D)&9$|%u)9V 7&4md, XyTeR o PyK CP Or1miXA{Q}_NM):ôM8O~K^Hِ·?9ohj&Tוde957gx]2ݢ eU\'<%RrCR.Gy]*PHs]={Z}Tn~mȻjPfo?_u%\P,rC{КH~=Q&}"s5ouhoQ c!$lSH:ד'&LHܚ;iT^3 VR]1 vҌ.!gd.hˮ:O,D(6Vi֖#-М*&{lE}կm)NH{MEJkXM⼮|M?EЂlDSύl:.Lh ܎yR9 iQղ%M 9yTy>'SǢd7o(Kn Xq4Ҵ\N @@M'<d;xIHF<_71}Mn~'S@a 86 q%piGuo@V)+ьN1A{L S_[ݤyoOӊ=yGDxt]qDMiG:٣]QǍ,g*Wo2!5#w!Whq{@WOdJgY99I?=* 6cWѾcGhϺEBf:1 d-?sΜ9K22|o ]}\_ECbiG %[ӈŻޕ4yo7h-qlC(K u<%[6Ҳ-;i5tೊBڊ& LNIthxH=&,MCi…f>Փ:GSJYDG FWҳUC%xLgm3Pڃzo1-'vCrGw*EN|JGSl_mc>+Jt.k.Zc@ry*m>1u Os}&iWΰ3l5n<$.6 o2ڴ3E*܃FVۨ~XPGq{]3u^%|K 9y]y8;Cًcm9YnJVΤ*՛y|a;֛miN2ZoJk@!%s_+r1p`)!N^Um0[qm (g1o#IjJcn~;51t8S)Ḭ6th̆6NJ232HIwnSL'hjB6KLߞޘmZN :E\]9)IRnyʭbi c?MjLzDjMβ4tA#mTJ{,sgiL%H w 55nusS㹷X&.lUBG˶U' q">&=J>N~> ֛<8fcdOL2*јCC=v} T0/QSO5?Ŕ&>NRfq֎-Mhy%z܏9=Sy,1[DCh8Ny)icž j89Ƞ=_O\4r  #"[!Tr5#݈-|^OW/︣ۨ7ʙRiBqNdG|jeΨ#yVC~wb 7N CKpm4_?٭+iqX|, |g!HZ~&B]VaHEDD{mvfnZcv=8-v*1^LбMi aӤ]ߍ0/tz<|:['u(%n/tqNEx.J{|pl00Xw*An:ǍKF|-bl2IW\ڂWs~@JBy-ތޔ'K!r@6.nJ*~~eкu{m4\]%JgKLhR5}loq_'n8VC˱xrug<ԅOG.g1jе 8mެ11+E>Cݢ,sH~ Cvxui(La{]0 ^{a1#AʎvvyRh5x':cNa 2;X+Czb»5yj%$6B_O 'N$4g*~.zMbX> %uv|~s)nڊ7ЩҾXʗCzK]_W#(gkR) 0gzVFEr]o>Cq v7+Y ,KMgiijh6O ?t#{qe6MB;"5/k1jZÉKN\J0Su KARTL:wA='<+N ,Ăue ֨|mGAsLWk'_ރ+hD&ϡnƨ}i^u;YoǚUP]]m{96-uag[w_Twaᄏ_m~ zj}Ծ5<8&Q~C@gϻaМݸt/ ~d-֎-:~шG!5n_3Ue4w|j=¾jqU+y~6tB\7rwz$_8c:ʕ&/abL7#ޮC86<_a^N2޵V$Q6 c_>cjp J]:2Mm͍rMwrq&jv?W)`6,ww'fI4X6秎pֻ-&Mbk!rЏP`S}iV K0$'$|>Np9)jsp{ݭKbTj@iOzQi[b؀h{ ׽*?Xk>ewcDUJZq,/ ƇNʦpDs?l+LY>/Wt+NY-L7?ĶA>~\sdA\V=ڹ <)?# ڸceIR2o~r80vytWOq&< b|u7:O=ǰqlGPO\;qᕿ+IJSqN+~F<净|1\s0%.//VSi:r>N]eur;tILɅ`7v۴TtQ燝t_kcޜ7pb6W@CǨzHA. Ч\UޠMSS-GKq6ntp(hzʜ|c⠸K:ƴ*8<[>j15ڭ5p>&ݝj{;u-)*5 CZ6ɒ+nn!;aLWnzCn4vSD1v52n?k$|Z'{f%<PǩrDW]F;U']ft1Jo .T66lk>k ~}}:`9yJ{~רA9&ȫc=斧l1-Tz ד'ߣeT2:wpKpus)NXPo :H):>qȬcR35Z(NpK)f.$/WgiLI.9P?fO] /8p/& =a|~ \.B2Oz7-<&~.w 5>=+aIr>6t46,1ɢ<~cON:.-;Q% 0# _8c1VC@3*إh:+ O6Jp0c7ʆ~,aI[Ѷ| sRN䤄siv @Z W7Fc1c'&=#;,୎pl>]F*tt z4KJC@&nKB&c1c1Ƙdό ;4JOzdtf6-rB)7GzimR+1c1cg0FkpP( hQU !$zc1c1, {tlW"61*0`!n(MJUc͞K||t`c1c18gAd|Vbn]'h?\3c\/W-ScH]TY.|xˆ>twWƳǼŢXfP=}^r]dږmM`o;p0;p`,G:Dqᶖ1Vtq={_u ^oqkFg`-NPtQCz|˷y?Sbc%0> vBXĶ>(f oJ"q)xC`S5{16<ȱbr$\ݻ娫s˓ ۶mIq)cQOIlgCxc CmζkB^Oى(aGDqimgȼdz/TILzS<{ѯSB0]jO­ dz8گ>ÔWn ;'C^~?j?ˍngӫhWjk#Ƣ[P@@(TSqt+,,.ہcGUի 2nY'0[w {Pi.I(.6Ajbaׯ!"B0f+>aRRxol ;FŦs@= ExU_؈yGa`+x 1Vw .# h@c_D8>E50lI +j z5Kc/Ӹ"?jdy;݉a-c2[TBIu$ݍ#% cEd}3~]|jz࿈t~RGnǜ;`mKO>0Ɗ4>gN|D(Ԁ±:d!?'d @R^#Y D_`[tDX3ETq8t1 h<6Z#qFmNí_#`TE>9(^߽:+OTMd9N>je\MW8ᣫ2aΨ_” mi#ilw4ȫvK$2ի<9\e4USQK>;-W[ . .\~Z5g.6 l*Qk| 6ol* ]eR3Ļ{C0՘ZY(P>I6Z|Z}?u|(W"FNj?o.3cQF c4^dCt4UK7f7wk41M@W}Tp t],m gƨ㔜[OE|]m]TVra.AMȫ+u^x2l)jbzѻ,+W*u]@˅v`NECMc0WiN279./ xn:oc:2LN8ql?JTՔD/.kі9O-;Сut58JII1 ,&?`SX@w1Q*ߑaL:^ޒ@J!f+}:"$m>juCƟyK' A ø0}V_cpRq= `Fc+ ee^=VI?Kc*|?ZSɦewj}t>xk58!Lyu?pM|o. NJ'G*[(>s+J!Q$ľ۹$w*An: ">Me^=X]↮TT=ԋpZl/b;uQB+]J{,_|M܋^f! 왡P( \.PNm |=l۱IBc4jpvv6QTyyJa8 $VNH:;1A9\| P5[uHo^SI)Q7QГ=RIx4(s,]/=_*kvڄp!q{ˌ+2 od3,>]˝x"~}7z.JhM^!l셦"* t*wKmoR ekcVs<; Vh?]>~(4`I|:{ 2 $SYz1}INHRxLyYNj&4pZjZc3a<ي3G XBz3!:i{=a<4e] 8-]0mL%ӽ¿^ý[`3ye¸RxMͥ(׺|O*ևxeHOd*[_i;O2Ӻu6"yɿ *gef^mU=IWi‚sc+3tqq{ヮ/uƌ1_[ovF@@ʔ)///f֨|mP[ PEeQ52jtw0t1NC fo1fm@]QNaiYQUq;݀ؠ]b坬bkTǮ7A}[w?V+9p <{o/4WSPac,Frv©N+Tp<DƓ3s{>Y3p-i$(_~(vaᄏ610>'-%ӜSKWmPp؂K.#MJ"J Ex15,2V/ш$5n_3[hh`* ܺ#^Ek[1P5[$r{PYlh[0c\F|l᳭F返K~1=Ul!$|NΕZU *b)G< g/xs8q)Pz╴.gIWipu_6v{r1 _Ȟ9Us%LCn>j%M=?t ^S|TSM\xXol O0jO{cakowqYc7[me$T} k^ONkwE ‘{,x8\I蝄{ AbA@*M{AbA""(*M w!潻$p9.3\ݹ';ovV/Q *]OKF/FFnG>[XBw皳zCUEOr\.m9|b|mռF]u+Uھ2Qjki󶺻Wc}ޜk;iRYEvhcRhC}nG~l^6{QR Sj 5ϻu5L5ExU]Z/To?JZ V[-s~]>'ev}xܶ϶;^vSےcoʨ+ּ=zz]l[#ں7m^_ ck's͂l[}?8~D Atc m۞kwiVóYr_U.Ch[l5~"S3W~'ռ[:^*OԎ-OEu7UGe5hNJ}+򸮴%UQˋ6$hnz[dkumlԱiTIu=.n*r\Dai3H}3}݋qͼ˶\+4%^m&kw=.Ռ[)v{CV2qU~0w*sLh4aJ>h;JP5R٧o>O ;f^_Aŋ+ujzX% =\brَ]`1lTjQ4oMA@FW3+NVȔqws7a{iX&$5!eLNCůij؞ ԰x_*( 0}&HΏ8np֦q`k#\f|Ϲx9qnȫMi7cӌMV;bZ 3[vCf?[=XOfBΎ(Q*#:n>?Ŵ\qu|~W[Suݲ`21͇[QCK*WǛSKK M+Ԕk׼ٛ?bfҝoK7RoN~ֹ?ۛ׸n3?|ͣ} [H}>,t~iw7,lۘyʰ guY1޶[YokYFN侟̈́0K7ֹk?msNfN q+EGrZ3 ۶]Xa&T):@ Lan3OnLYL Y.|??~z޶f[0滑ך&Ύ[$p4Q^c͉F˫7Ai:lCkLob]W*g 9-ڴ#th5'Vn7-kBT ]j[#}MrNG7 4_:~\ڠ%m[Qf3mզaٴϴ7unlg.^A}7|3fIG< pi:ަo4N9Ĕ<2ȹ͝>Xr Gw/i_n2?sf].}c,TGI17O0/ڭC}7ZeXiFHsXsd~|#;!;!'_тpEx\LUS*%8[={i xޓ/tU'drjxp}5>hfI=as2Z=8ixj=Y-=m8^|y~ ES4ӴݕVju}:xl JW\l{m:3aԴH:x|,o4yidq?ur:'ϹXYRX}CY>ïo^ |'O^Fi??'.U 39O{v#т[ծzUt&6@z@_("1cehXBB4쇕FM 2{ox8~HkxAoךUc@:C#zV&?B?FJ߂lzNCÂ{,azyII_|OFp|@ ?,^kCK;)}CJ~`6 -%jj#|'9.i.ثҰ(< pBdNF҇ӈ:1n,\^lpIҷotTфڻq}inr޻PMUxe:0}7:5*xMXzXGիT)2/t&y*__ K7;MTUЃ_l0JءowUb Q٦7?y տE^lX%5ͿzR+^fe{w}阸a>L/}D?^n9if%S/U|.GqL.Jeͻi؅yP?nۭgtX~#ljuj=^q)F'T^=+Ӎ#Pl3euclfvM= 8C%.EQA۷_jKip\|:ud+EEjuy.kByǶzl—OԆ,WnMTHowlf}|aC|:-FT MYƓ߷,U_sG]_ԢHU{?jЎv=תwkp6w^?+ÊF-[ﯳ^ :-2E;'5%wSǟײzSkLPE_^}XW7*BNJPpJ7w|}z.wfdzH)>t୶*lqk}O}d-vc8Oi3ǃfXǟm~;ۧe *NsnPζc^Ҏ%tʹ{_eK/ ZNv=oCS4ۏ6#[ۖe-Sc]67L[-cf^ھdfy<>ews1fM"[R˱AQ[ Si㫦חO;/v Q  X.a2u^k}~3L{֜XuC&Fm ךufl-N_:Se沏 N0is"S`bN*I;\$Ez;еS|a:~zݹ_mFה)eڹȟuL&:4\oԥ`SfwW[0ac[e%M99rSO?]ʛJ&yn2fb0U9bL6εr=AkIXoՖ){o#;& 7ݾ=bk̶W`KQo-5Clӫ9fIp3g?l*.gY5c[#.8ȴy_co GgAI;L6?վ=3`6<[(Z37}81)3Vt?>۟6#[ۖ?ߙi\1Gյ?f!u|'~ڤ ʋm|YY%YY2ll'mV%ܣo}˧hwgN}%}]j^:oDZr/w-+5sH-m73wozumT.ʷp]sY)YX;25Fv+KNP*-dyZpt'?^Z5zjڞZY[GWYzVW٫H̶1>+;v<• -@m/:-LXwuQό2?YY^%[(#ס3i+jSC}'?mFnl[^Ѷßc3¹IJ'd=;[3]/scYm;LY ǃȲz,9sHpj ]7ux2m_ŕ/Ĺ@ -Tvxi7jׂ~?jǟ[WjT98iGި.*d6tRjzwQ.BJJ)i_uASPQ2V6AONxz@?}sx_?qniC kNU_/ui3.2$[++;WN׌mVLt7 UרGqfeHLjjF>~r\qG7ghc᫫]nh9Վ ґ-{|hy5WD+c&>OGdZ37qߣib\Klپ4{}Ц# zRnz$׆Rz S>Usz㽷GV"uN~O|Nz߬YTxn־z;+PuX?$Ыgz~'fnr;5a_.wVֿss=s!,7ќZV" ;[uźJH`G&h[zʜ_S!TAU]Z/To?JZ V[-mK Z*\wŨ㨫7e$FwD>UzTS ޥ-'7K'׬OXV{m^UWOLR˨;+zO8 "ڡ붻[s:T=>nW*}\a*CWG~k:5.6tǪ ?6d=鮧U%#{<624vs =qWquѷ=R:8~o')`]9hm#U4"ANVamfx?ШP5}ވ5{ql=km~Mj=%{2Q[Q>_ܠ2bn^-*WUgscFZ{ݱzuW|jU䟻R/xJDK=_yۮlfo U]Z_2D׍k?ǵP \fK 'Jw]VHqU,!;sPKwweQnjjmuɱTy3^Tq۴UY>h,Yjcܞf}+LPZFJ׼+ˤ~Wjvz[΅̛_V_}?mF-?̠^nO;5K5^Youm>ca~mN]]W[Jq#gk?+uMoKhI۴D߾XA7WT@F "oM7oniT"u0u(:aTOSTP 0}&0IfY Df:>htRO1me1W|2dB.]mMaiUDo/5;݌`=|8 M Ҭyu}9d$PڴBM}KKt3+25.5Nc܍汞wF^mOzѳxAuޖ:6 ?vlKS$ubU%7hMNQ&y ^̓ɾ#G|ӧy O׊MQߘg5ĿA@~TWIliO_4[VLSfԌnnK{?]_9o=c<N>3zkӸ|p:r?>n}m~[fCL2a}KvkTN͎I-m ;m1>fC6?CvOyW,įiʣ+2^>jYv?C]a,je>ڗa ,Vxn5Gndr7k}Ug.Kf~Fy}4;:~n{_>}-cfX:LH2fYt(9}E "NwT[&RO'j`+UZ=agsI]Sgové$JSߜ2ũدsqE68/!閗WjԂcI~y>H꫗'fQŢ"mV* L+wӓ>ne{&,ndEs 0x%?`@# Fx޹"K:nDuSӢ"}T'ʲMOlӄFJ '&*rQp|@ CxO-קƘd0 Wl1SSN:0[)^lbj|u#$JSIO/V9I+" |`@# F0@ `@# F0@ `@# F0@ `@# F0@ `@# F0@ `@# F0@ `@# F0@ `@# F0@ `@# F0@ `@# F0@ `@# F0@ `@# F0@ `@ ?Joգ.0[PW\h7@  L%\`7z\xHtF@@{\x7B%\`7.oooo@Cժ}i׮]:r{ATHQtRT*VN@Bd-_B?֬Y…#UFM+WN*_|'%%EO֡CvZmݺEqqgԸq#oA_\!!rC-}b7ة؏NCJJ/]LMr=={O(uCmڴQҥ\9_Ustתk׫"**GSI$l+)Nj+Ʃl(Mȇ=xc5JsjժE lܸQo Rݺu@"? ʊ&#㏩S~?S)h-+=V޽G \}^{]}]*Uq5 ]r%O= D}Fga=6մiS@[ Ћ/.] 2@Z|_ժU,j* 4H7拁Gviƫi~|Wz ry>XwF؎rcժUs\rJlْr W-X@:t8Ut#<~ߎށvy=?ʙmݩ]KNQdm?I{IV'shq:y~]G`I:޸T*Uj#tk]fڵ/, {YFrK^kQxxD%$$8!CQF;դIroM8QM>';?^½TIQG׶ɊMةIVc&}Idl[-9P)~՟OϻDV?jOh+%6XZܪq>v2'XUiwUVX(Y}^]:uek֬NnWr 5{Udd+ڃ{O0Gh_^CuwqgVs58`pEջ8F;vAyR#>Iji_E8K,'*%%3Ŝ)qz`,vOO6ߧ)@>^ _jyqoяKNHUhқT#421c]xmt߾}9K@ٽ{*VIyޛ*=_\hQG>0pڵ_'ւqO8¿7_|)˾Cm;?] kvڪӲBǓJ;Bc顮>i8Pj⯇d}N};Vuk\ڭug;ui=0WMU |uV׉2ye2x4 \ӥKgmЕsX^=]s5UIM,t}q-{opv9px%;]j{L՜ (մjvڣ=4]۹Tm?UvM}b^}~HTb}5.}5JC2jYǯΥ;te9sv~VFzXiuj`Ӳ_Cx˴իf͚4 W\ӢEK8p0{8=zF~JVUYw{D^԰I\E1/-tP)NG97pErR#h8^s>i_̤(iA2Jw=Z \ .n$Ǯ)~Q鶃(r u f^VKX=/UhMgI[M>֥k]gbyޔ-Z䚘ڳgO6={/~ӧ3?bMգQVFϿ޼ f۶u-[H%nYZ{ә0.Rp@ZD\0[[mhPAK} SխwhUF jZ=U4;F؞Q[oSrPc=ue\{D,V\ѻ/aXY|Ulʶy/FC:Ǐ:iVI(IGdsN͛72@!{޽{kٺ뮻d^7mPr`Μ9LHTm]^3g:ذaC* )HOIO8~?d7_ު]t2@"ChܸgbŊQ)(N8^Fq䅺ugϞOuw*44JAd>0N>}TN*:@gAtSB({S~_Z* C=m9{mS `bCJJ/]LMjj״i&\~ԩSՠA} 4HAAAT ۢ~$8D[Ir*ɶTw5NEdC OCk{ҥ` [NS>b%zM@@>aFM0Aj߾={hJLLԐ!CT.,zeEd͞=GӧOWdd7`͚5UhQ*'Oj˖-ڰaԷo_u|%r AXPV4 +V?/k /_  ; WY}cccuǶڨQCuQM6UHw@?JBBԪUKG۷Ov֑#uL<|-""\eʔULL@:֦ @~cO@Q@"/g 8wDž64$xQ@ŸƂF^OEA  8/p-V 8 <5B@x @8sm$\@O(!'.Ȁ6OKoH@.#@!^!PM;)z*( .qOB? @<5$+,ư ĊX駽9`VB]JKI}v&p/=q_O{Iv)I.%.<;MB@K{zٟwswW95s{F8)=/=<(c/@Wn`PA8w#t~/@O;.5 0`BHbgqi`K>K]sstz}<ˁ (@kh@i({9.%ys~ _`B 5 tpD:Y=5sw/ ?GOr`wt^+h4,s89 yHX@Sc# ع=9[uy ~~p ,PSyG@]G"G0X"}w:}?z;wn`nL,n~7~=܅~1o$ ,4SA_=Ǽ`4*G%95p~ 9'GZ=#a,Y˷KeǬPċX˴"2SBzlœ`=}AF=SVDh7Iy=1P۸>yaم$ +q5 ٺ)wEA:d_QZ<#&N=ÃŤ \@&#FA^ R1ߟq OoـX;͔bb$pY Ѡ# _c$`CMpY (V % X)yI4H؉aڙ@'@bfP/AwA+xlGXVPᱛk:M]:^pbj%1$NLZ =j}0*=ävAgSԑFNzczڈ7oYTКPkuXSQQ4v[WqxF\ Zl3KCTTp Ui_EBB o 41Ѩwk}@ Lԕ6⇯?*~xoN@)Tqfԉ,4.bbqb\*B%|\_Hans^DnG_ĎRTLCH?@/3P{A5qUnB"7EEnj-~%JClFjY,i1󲯑.u뗉=״Ǻ tk%^6MkQpk1zTDtI&Ax UDZ"A<ԑ?~| -oB9{඘-UIG!Ef&bn2(8V4-' n&EcR跲ڠcM!LvNTIW 넭Uj&_`2oHc4B@E߂g!FfdbAC Lk7Zn81:.H4v)F$P'˄(6 |n3F..-.TXׁiR.V3+jMv& VQshF H+U$).sAۏh2FH~S!&Ȱr0!*J t\!䲢Rk2ň\`q=CsD&M N+f .2LZ:|&v&2tIz#"݂ )Bu ,uaFUѥ.}zu7ieU}T¤<)N@q bV0T}c[TQDN`5Qe}Z!XVa&d@^f\J\i(|YʰhĞc6 2'䈀l8$a%UuV\߳AkQ8GWkˊ`D#8G4;֮Es0W(A^:$\#i(-ϡEG 5/VKqm}.,uM}e>7u-T:sVM߸xWDV{*!PZFo4wlvA4 `$1K1B6*2%]+pZQwV hﮢy8hxnGF* Ә>n:Mm%lP܏I H@5['EvIhGh"NCoͯe,Ű9Q>RvH!DL:s!KC?bCaöVQSh3*$wW^&d#qdLcf]oUa4[鍪TMhw55FuW'dd ` :V#H4d"[0ݭS32"-2"צ]L FH`5Sqk +k ?-XmD'Fżfb3i8Vғ )f3 w!5B ŀ%XX|Wǹ:ڋogpŠ1vzKn[L_fuq,00,}|&-e.@Y݁GB;Ħ)%|a?UJ]65vb$-E PFr ?@! ql@!TR8D< XQSUY5#fq GJ9W8Q3a@(i-@1 Z0R\OkqI,|f )&!| ,*7e8*T94i zjM{dK/Z.0Нm-u LHf&^a67_7vr3&s:!&#nC19X-Xkzʁb¥ ?sy q#ޫ0bTVm]IQm4(;.vlv!+A' EY3w .y0Y KI T[4vf5銸B ڣWjRi{![fZ#;G|:;GDjhֹF@f@C-7`ucZ/N{MO rЍ^= QٶH^VY!N?qv] im(i LGL 󐰓GQ4'_8l8{%.|?E6CjMR=F }HX5WØ4X!wxM +~0Ck+64 uLL0-l[)?a J'fklu<$ˆœRm|$r@iϑ}+k*e D*bs@b5}2V2؝xͪaֺk|  K1jQ:~٢ U7XT@nɤJ7?;zz  v9$]$?ɂΣIJ%v/@*Wf'V%R2={ޛ$x]N f 4IgӺ*r_" ema=|eCXcl|K8 ӎL6'IaF V5| l0]WaT?[?Ǒ F&F0{wNiP4b X\XȣX*7}+SZ g.AO=HGj4=p|}]/qלx[Q,}@{s }׈phƐO1́pȇ|@W$'F{CDтX)VEr L`8&)f6xj.߸o35#NWI"ChZؐY[T lq 'sm7a |>0±c+8|p?-# 30["EWa@~,)30$*h>188qQBTFرwA"k*rB&+G3BDH.^o\(7`PTx9BBB)s%_S`"_F_1$@RUqa$ fk%=cJ.] #Lp]LXȪWNB_#dqP'ϕWUm=[x%QOrr<<7qDәٙMd`au;`N ?>MqLy߅jUaiWCUshw$QS0]+rZUBA({'ޫz+0QX^^xƩS=mhb hvZH43 ^*"}h?"ЯAA)†'?r8.?4)z03fnO|"0*M %q}.ħy}/S <؛|I? `EP F籺QGatr;Kpn'na/u+7w }oi__D"}ce|a/ⴾv+@j.=xyN<%wܵJ#l]It=L~ϕ%K4*RpA)}}8ZSWlmUq8"0q({c=s\Qwv@դ.#%J&frU8á4斆2Z@4|`e#-GJ 3ii@wۤFxSXhlt |j18.v/**~i7mMNlxjE%|Hۀvg[>z+i>ZZb++Y*-͢%EQtmrKjGR&9e=KRs9 X.sgN)m:T5ck9TP(j)#++JJH ;sBuz@E"tlD")q)iz xB8,=E ag:r9e3gff0H[Ij^O&8Ŗ{L-fYZZÇ?xը7a2b!:ZI8:{ɕ*mJEljA5v@êZ!% b"f&{6#pݦ! ']H^fhp@%=DԚ;yZ*)JdKc1rTAc/B\LcN*&*pjMP>udw+aV-0ɒ -X̝ۙx`X\kR"jh9Ը)Y?Og~^oC+z^HK bQl6-Z-䦠@"M k. ٤WMuux~ݙ!t(g۶bCKQZ{jk+ӟ<ip(ض{-rwbn)h*KAlݍt;#4T=  u;@0v >+O8?9*ul(RE,=JIs'[J5Y0.b NO:T`0a`zr{LI'@Ϥڹ'{uP+ay-A%K'D3^jR$J+!V1E#eN-IoеJ" WX0B8ESi290s^pe.dP`@ʢwF¢;- ȱ,vU VeԴfG !Bonf͹^M;-8umQtddL\/Jg-F*}'-?+lC?־nxPqz[9[c/2UkHͮV=h-f(]?wY']Tvw.:s|IT_Dhj:Sm53:jl}N7R,hpw)\.E4A$o) l+׬ BLp: sqRQ<rRļ  DV}>|'&j ƨsh)U9Kbp>Ʒr-m5zFbvejr"l,e3z.ߍօ:c6*'\hKbJ}w~<=c!޲_T!W;̮qw[7] wgf,q=-*67:1_ fVGxhʹw]HDHYA"P"@,T0?Fb2@"<cw߻ Wp hk.%&y\"@oӍaEuTaŖQ(pq./5qGPcyEf[o ׉(N\BAl-h85YD~'++K"i\v {LKw߅~ };.{ 7Q,ou GƼ_> ؽgP*"ZLD]$ltժ$68{Oء`8+xa&앸Fl$Jx o<= zC\qddL^`N@"J^MLGE6޽?ƁvH(|>W x(In'gE_\] ,q}Pk[ZICM7H aEr028uDQ4yI/ZiUwԽB:ǭ9 tⵣ'02ɡ#oTNW Ѽ!GK{? >Hwa]d$CbZ?0mA(܌S~g0 b;:DOD`#k %iYNN.+B</* .N;vN-5_}%u%}&Bzcp%$M@q33^yE[;}yPUAz / oc|b++§ x(}sD.mo~3Ocu6RV+˂ī?Fj|w%Ao^k)DBd % b$zjJBMC|>tBu>vdµ%q%;y +sw/O:ٛSH0[ 'yD ҍ "N~'M<#ZVTR܁7qh3 9 _<ɬPin촘02(vV֊%vkth(fS6"9=x2>}Fj*%bQd 16t\:H?v <xmíQQZGizCsysmةa4c:&ዿ%ZYq4qѓϢ^-BmhBG %alddֻB8!^'Ӽ&5 Jd$s=剀8/t~O:GE[NZ3p2!$~D,diOyx5Z+W!(, %na " l Bd$Z#{ CXX p̒no"Yv"Z!.$j"79Gzxx^}^NŘq5zMơ۞[uB+ G:E7&[x L!}12<Uwu/Ƹr lm$ʹ7]C/sYeBkFaV Aټ㣣]Roã,p=s u}H p,EX հ,0ۋubZ_[O~6&YC&CDm FbVo(iպw21㪌b/! $f+‹p LkWڻHнTGȗ|9\U^O$ Q]bn4T~+`& 83=K$Tw [^D螸[0hTz{ &H'"BS{gAxY)72 T$Ӥ$b^5:y W.^B8BnNݖ!?4~W>QtGLNL?ř'` /nۓ(VkݷosΩg!Y~^_ۃ݈ ̪_~ey%4&o*T$7г{k념{っ쵦{.8H{$*޾ۂ,>sbH ~̋/4c)cp>p8[70gZ Td)0c$r?'~ӟJ??̓7b9Yg?&DI'z $*V∯IFǺ<>)N=樖 *3>2iR'DEct^ 'WrR\ AӍbiI?:89(C?CM(+\l&vHopNJCRfd?[z`tFZEDI%QH4")`|llNL}t%Td'\z_L5łϟ(U")Kq8zXG!6KHq {mXKrC&V(/wnW+{D&S_ŵk":s+R2浫wdZ2t| K\.bltη8N_QWQnӸ95>Y,Bt= ?37I.ॗ? +/@b`d"ƓhElaH1=26GcҮ2pTjF>ysW/!WjMB`u,FI/a7biFܽ5 ߇D:g_zr+twaP|noFe\T2Y=w)BI.DDPobspxQӴ@*htӆf0>}!"nquuETGw iZ|g9r_ӶrMh?޺zDlp4%JZڶuZʹz]jMlr=h4Oxum38HVQ1QHDX\K LI{8t4\ǥk4y|p*.|x!,FVnęDE4r*.+ŬaN]X$$htfŲQ7o> n^znntpHw^rL_B?ό{^`wn6XLV>ڵ".lH>τ#8@k_ſ?‘P)0h2{fG^DeF!pZ \@"K԰mB>D "HHe 8{,VfI0 x2lE=&dW[dc*_ UzX{vQPGZmV"8koQz&b )B5NI7 Wr8Zb ~t,~]pMZGz7:?HoFA>`Xs7S'.>p[uf~wZm9#[+_Dž^F9AZ/ˑp+hr1cQJnXy!!LVLѥEL}`A* k7?DԮ,Hj8 "2U6I7JvxI:gRQ%M3%퟽T!\ V ŤifBثs8r 2t:'FF{6@yB"NۤHmJi4E:u/s JFWi c#UG"X&bh҉hIJqN+W`~aAG.ݥ0zΞ:o%hjW݅ÆZ)iR;O|Bv`ufrEwUii;O۟۟(Z"*UusN<{‡ $upٻ pHΪ0._pdsQ HjfV22<,/ٳxoJvA",LE0538 rč8˸OPbet bRΥp9lz{X!ơ,%K/v`d4wW/;ĝۭٛR?g-"v}P0»  ira[X"?w9B^,,,X `Bp7o)4vDPj$D +8pgPlZRȒ1jX^>U}p±ǁ_6HFDgXpqB|NsH 4dr O"=.I:q`bCcBMf^(zs= ݑS)d->coenaHV:<KlAohrBrƾC'd.~qY;w%ep>Vub;3k^zA> Ϟ΢ZqImb{l/Y:+o=;6b|mKk-EX?t@\j1 !#\c{m8qO8qjبHծ{Q|\5䤪uk_SuK%ĭv`/-௾#O#[%[eb ޺QZ&,/٨(R1-~R%}ܽs<֓iD!QckQi} "OfH?`d+yJ!?M55 O &YpM}^ɠXV ;>7n޺-FRKpw.,6,.C"[qK+ %~BPYT5AEt=! <j$.ߘĞؤp] |548r)t={pU L&/\3#koA,-IH3Ni)+-DI0Ο: {C;t~7oH (~~OhV q$`s6n!)\=P2XP4 s._G,|VyFFkՊGG6ld KH'bB!iE.-,@!de3c>R [ꚴSӜ+ FbTY'p[a8 2Տ,:mVDpqX䉐pr"2t\P/,%n\AFA>"dqexX¡5"qڳ;3bs1bw}%噛KҀہkWbaq(-=#]ڔirժVo4apv!Ƈ5gm} ?kJt6,JZZ{l{L; x5Q\qM*!R 2$^bQ*\MXQ2qVi2D Y|t2`TXgg%QRV%qLE #cGuQg)0)\T:p$(-Ӊ[2LMU`dquzG9|~FJXʈ.7\L:eɽQL4I5x9,]`vxH1".8-QuvB'nݸɊ3'cq~E>^H6A);`v;w<./I[Oq<'3;h}n)98lg.WW+p`ow\暮$~ =ͥMbٷo߄L b0Jt"1)^zEʔ,,lHA$+EǎJr5/ҹZ.6}NP/oD X!+ډb>VuCWtmb! Y,ul04ToBSP\O4ċT*aѐ2a!͟)xsQ|?Џѡ hwYr;镧5߼.=z\N zmHKa|a,b{jZ[Ձk[!ʄL+3UmdJjE=A2Բ g|.U՚FȨ˕M_oM,wykmskBMy=o{5>DDcM~XlzxE,{c&>^e̖`_pGiHim]takŭ籉 ᖢ [ {&>Sr>ЪK0z[J0‘-{>/ɸM1a[x@UozUZ[i(T H:[S0K]"IZW~?+Z ZMRh r;i:ثP1t7V9 {7+;wŲk;=gwОC smS88a{GNs 85?{g qs\s$ k|te]z˱4҉U`H:FADPͭBخ"XZ\X$_3)o6$R95 |* iaDəkHĹ 4Lwd;\02zD׉{?Ž*bRzqH-(xAΜ9zϭ7`CZ/ܶ7z`cWFIENDB`DisplayCAL-3.1.0.0/screenshots/DisplayCAL-screenshot-GNOME-verification-settings-thumb.png0000644000076500000000000003326712647526537031172 0ustar devwheel00000000000000PNG  IHDR}_,XtEXtSoftwareAdobe ImageReadyqe<6YIDATx}y]uwo;sˊműib;ݤ E[A8RiմEӢISA4 v⦑"h 93o߷s}f8HCΐPO3޻~g?G, y˝p=h|Pe} W^G>ԩSO08ITy*j0g~+nXJȧ2I2-4LI"O%$٢Рec*]0;>mɛ,B=D`/t_򟳹WlP} x_{&L؇/l4JgDD2`0\vb X Te~$I9i8vm+&;m{TM0}ReD 3حPz>,A`X$O=<"N] w6O$0O*_|UOνU1WG=̤uzampI:\- aX&:]+4&R>::~$dm 0LTh2\/a~ Z2oc5Z 8݀Z~~2~qX'mi]EUׁ1J*3ЉK6jI ~b 1?6!|Kc8Kb8Jf vP5D6<zT4⡃$ABW D(?&p$Y:bpJ ƚܦɅ2Tm쑠je,qr.emz6ػVOcۅw;Jof9Om,ׁ,q& >TP{t7d@Q,G$A?y[W.d>݉0+dH\hrM6 !?dۈlϔă"nZ$$J5Ec@)Ycw5aDRhQB6!uB@"6t]Doi{>`_Adw,"_Bgd _?_jFX&E'9Obax$K̅m m7tKvjoF@@˥dىay|Ѡ,-H|OԼNi$vy ܵ׽äBZoo:A&AtכP%y[Eub Ԇ&.4Z G6(^tl*>< 3-mSmA BwbK t;3t~]#>E%# c- pL˭0 Nk?о=FZEc ݄`] B[ z= Oz+ihB?0N8Q~5?8 2$$kwnlNIkWq3PJ'&;H4Q_mijrLv/Wj>nn!MR?cܿO~/]s8 O~o!V C!Uo:̷ 6*0?@\|- aIlnlbfv9եeTjG<F\0b3ߕ ?̋ʟ\ SsS~mAt1(VԒ66ZF XwtWigDtJn~TAMJX]3&`؋Oh!? |KXIFD#h6DctfQ)l*B|s\IvզT>^y7wkHx17 KM\ٸf 'ik3qmѪ wP/ "o/=(s__YhGs8{ hE&U[t=OB>k1c5K 85v|tM(HĮ$&7 j?Zkr v#г/"5ynZ(}yJ@N[9WNC3kXzSSXq?T|^k$EW2l~nmX?[J0濂 _n̦kZը0Q3A|q\;U*#QՄ})*J+\->XLkUPX?ƍ%ɥ2y>[m~\[{!- `jkmEUbMՐ` *Vm}R |/ߩzXInT@k}vDz𢰼镕aٳgzA܋qˆyPb"LBfa?"ȸGఏ4# L^I~V ӼwT^Z)@x5p};bWJ|'=2G {l=gOy3>i<3ٹ]׫M5=^\3"`v鮉i99I Ǜxl݅voYo~n9|'wEn߾͎=b{7u\NT`sJ56h< Iw n@Z,IªKN$tG¼pP҉fDn0%PD{r=> d]ȠhuLP%]_NjB\֒ՀtRUz/Hݯ>ȘÒz65\[\C46HSRȺ2'VMLL#u=U}QR^ֺ4Z)zǎښ4"h$+bԎpC-<˄|(@fϚallќח 97 lb|Hv:bt&-$6w*3'Lv/'RiwMwmZa:MbtCwl4&ݷlsŇ2(WKJD]ܾ0s*=nX2vlzxL .678i|s _v$;J&dv+e2(2\H$L&pâժӢ.$vm-T/Od004 w*Qfk;>qfsv#:URf)pCm*#[%"9YuLNH&\.k#fa Պ=75#YXs[S;% L>AYA*mH{n|Gw+K6ޗa'['x x)*ܹ<1._h(mbnæ6WPwJQRk6JqN礗6k4{$(d>? B1oH#uT٦!бѭ_Zd>t u {SI [D^VʢOkZ*ؖGeIVw'ۑn<u\; ^ -k } 5?"$6_빎!%[ܧ҅P6c/fwx9Į-1 T}Q E]_gߍ;m?-}ݱ)X"h|՞d<]b{Vp}K{0tGf(ϴK4R gvyvGߦt ^9-,y8WKYܐ:t+;p6b%?B6P9m ٥w5wU 1b}FYBŎ%El`{tĆense U fhBo_W~wqs=KndІGCZh$,F.&30Jl:UK%9mAΈ} vO9ŞWWVC#0 ٞS܃A18:ڪ@gx|FB&=yhe81 l̋de>$wqaXƏY2H}&e>I./H 굚=Q9.blbV 1|\pa[V \ IFPGޔ)L+DymoVא Br:vQE94+'^$J7_ j5./ALc8;R8vD{8)pŪe(&1A̪XZ\_ N՛Molg7@,D>F.Gz j$J+.#WQ035abQ6I:#nހIjbla9M]TEQafa|jz[ѱހKk 5'06bxBzmI_,6q&訤|U\,WnH@&c׉`fC ۜ@ `vvWw ݺ~ {h}Q'5|7ϓU+P],$;naKۤ,_CnΦͣ{OA47]Ekbdx/@sW}6w1FpAbK9n4VJTQdr43U@|8cIm=@d 5-i&b ?vR Jp>Mu:5Zo/+v@bl>MaHOx aw._A,?W-b77/]%nԟR <~4h@qZЙ~l;°B.5{9]{9yZzYg:nZvFIo\rm?mE5ъW@6n~9 pYōu|Gj0#c'G/^n8->玞csN\BX9"Ox9d<^ G̸fw%<{dpT.^+fѫdȁ6Y ?_a{4Q9[H:IS \nw+ d^yÁ[]# {s<&h/4&ģ#nO {IpH?6Exp0ޮy[m0.T$4)'?nN5^;~ȹ^a͎786ئM nIST2݆ |'7a\[JRx"u=niBd[Bx,4[uZ, NZtb[]ӞnF%?q`wv<Ξ{:{_o_C4bP%陴//#[i @r`F| c q\8uz ο~rze cx;߃F2 m AI1(XS``d<4NV`R퓩ԉzr Χ{㣃Ĉ$aL#HVjz siy2!d*MR7Zh,Nۤ,+ĔK+ѽ&u $E8r*"$}|t/ 967s=?JL]Nt=ch E_')A2\#έU}!(H]'1qsA10&7E®"zkc\ݾ.8}42 /Goܰ^K?dU]iX6RoiR4 kS^S)|x/N/ٳg_Ȩ#Њd7l ôs\+sIgsӇPʮȐRmz I✇_x*C+D,ƍ`r$[K $bMFqԉ}IpD "=)[T:I*ӛ:ޤZV}AbI\6Ozc+ڨHEHXB)S iH2q z$jY>-L`u}MԈD_$ hb,ܐ[T,U02<:G@=C~/H|r~W'o{&V1A3q]Hȑ#HM-.T[6"qq<]Ӣt pFjv5d_(N#!hwi2є7T.ӹeJEjG( ȉHZ>Aa̅r?ZfwӶmw'EVj;Gj/n^gգCp;#T{%A +v{/|qWV?8aTsT0b%R`%d r-ONG$P٫L{d(LGD|Bҿ ݪn߷c}&-e6rverhJ7/ҳV h(ZMm*<+Jol6Q߮`tbS8j},,R5V(3' 'JN޽p0;;2Z&{d/O`Im˄ŞR 2$\eK5tal9 D-=<0bf/v6GN\_`{NkZ1L8 rBp=]KG\&;ǎޠR \bɓi ƷodcppX>EIAI~ܹ qBR'R+>}V0|#ш~ Y~2??_U>wzG^jjҫrP{~;~YRygNM焻sAۿLHyt{ *%MIENDB`DisplayCAL-3.1.0.0/screenshots/DisplayCAL-screenshot-GNOME-verification-settings.png0000644000076500000000000036221012647526537030046 0ustar devwheel00000000000000PNG  IHDR |tEXtSoftwareAdobe ImageReadyqe<*IDATx|չlVٖ{6؄ IHz)CAM)!tlp7l\*V3]ic?_>OWuB!B!]@!B!B @B!B!Bb(B!B!rCB!B! B!B!P$B!B!, !B!B!g1 !B!B9H!B!BY @B!B!Bb(B!B!rCB!B!'@Qv!B!B::;,B!B!4+$B!BN/4#= 4=C!B!q̹)P$=tu!B!rrD=y9@ 3 !B!C2?snN!P$>&+=V~5 zƵlyQ$I|vOr.6[ !B!]]ld 婀"9 @,m~Wm>!B!Brӝg9N̽$8mrYJٞU!B!B%eleQ(t'uT'fC!B!BI'_̤{1" P$Ķ;OWDcB!B!\%m_ ~8I|?{Rе !B!bҝ]SmbٞѺɟP$,_@v|- !B!bҝ埆t0e,&Q(t%sbϝKP~?!B!S+ТJSG{^~~ hYa]>'^=枛ͥ.ԧw.~x S!B!SxLC$MGaٶz-lAms Y[oašsE'B!BICu(p9#׿#] -J0si%#/k0['\W]6E/x0qM4X7k  ^.7|PyB!B!r~MvO?็8[0L!xVbgb7n@}e'/1]Þ"jӖ[qM7u'Ϸ/{vmG$N߯d_b˦uiH!B!NN͒I๋߭`W`0œ"s7幘FmNӕxNjKz-(ȫx܈D"y5FMxЯo-[W_˙Ϝ9suNXr9J_0h`?(<|N[Zڰs^)¸[;RuHC3hȯ۶±Ʀ6l Ӂ oM;?c̘1i)))w܉|dY:p{>яkJ !B!$yfg] [J #^Yx:63J\ŏ;cJ1ZK0%Un,;ֆ'W>pXC>8\_m^W_}U{y㱜yOsruVUUnLEP#ɓaKq`=nV)&xG+0t''-/Bf?&#8x>.xcUzeU 6~;/+X7GfܷF7` 8@rQBHݻLlټ>kP$B!ұMb`a>Yd"Waa!X EьyܜysѣG?cI;v.yI1󫮺&Mx^ymСi@!(*+=?F<~ӟ>qU+IWGVZ`(oI?}ku2=2ƬYs϶47ᦛo߀_U9B!BH\:hxA?\~W8]A S'#! Eqۘ~}ZxПlʵy2Ro+W\Kowy ~gu̙$6ȑ#䍗SY^x'w] &N9AUu5>kpMX3ǽ_%ߣ '7׭5}|R+Ȧpl޼> IP<[W_)1cƣ~C!B!$4SG;: ;ǡH"M* (hPki7o?SO|ixNUS::BRRsٜlkmM>K$e90g:LT ɼOݻvJPъtc5z:Q,^1L: /L1ao`͚U3g.f^2KxMuW&motGƟ'.~d;*k.v?B!Br3)nHȹn@W݁&h3Nr pn|oC x.Cu&y0y( #/Gy 9'g?ii( ◾*<Щi j]=N,oSpuP.5MokƠhZ8d\K뿽+:(*rAy557_-Gn`M-(.*2.(g>--9:VRݙ|Xҍ5gv6cǝ׉+ /<5kVK>_4O^ߺu39*Dmm_/,efyps(*KϴaU(,o5J-(|n:\N6K{G4{کMoyt,OIPXNva}'N`B!BG^t,3¯Ö %: B[L0hS8ǧ#3K.;8֬Y恓uhnjcIq?1!B! B4ҙnHLiRԖ5Jܖ-;f]ENv<L-`#r昂q7Vx3R-˕+fWWW"%pg\.DQD"*Mtuq*~eM/\#B!Bș;/ = 8x^=-'# B^ƀ'*pG4UP=yI.'CM׿͛@!B!g<| ؓH/ޭ 0!B!BNח -t$o$B!B陧I>,B!B!g<|HzaDžB!B9s@҃  B!B9@7K>]FZi#$V6+jilƶH>r:pJ*jZr7vh+F֡v_o7A忺lgDXw :s8yPJK9jqm}0-h#~5x*Ōq[Ҭ*L%B!rtdv ?F i=la aȐN_5*p}qܵaTߌT#HpɂP`rQt{tpCW܈%*ضȾ#tDMRD4/?B!B!@?4H#m)@DWWtơH9PSeyp@Cs*c2g% 5BQLq8WTiRsd ~Y?UnR!B!rP$Q\`f#[ǪI`EZ;L qҺ)%5TlkܐnjYGyҒ0!pm=:{"'"xO7*Fڅ4Bєb/!it%B!BȉCv*之H kB)P=i8.ZOun.]Z)EI s5!5֟Uj*Baʼn _e\%,@vXN+A$,,Zu iG!B!@?gȺs% 0NWIqve-p_?GV59}qڱtĿ))8\wZ w ;Vy PYQ UqIOMKAN:&(1 ֟ A!B! @H8ll[Xb[ZZfh-]{l0b]j흀BKs lE-D\W,DrgE4[߄_6?R(B!B!$Bϙ`h1ZQi{[HaAþxqߎ+z某{{H[6?'.,Vel)7`]ݗVB!B95P$^ ŬGo#U~TGŀ")MåjtEW6!CQ/ÁDFM* dĿthsv b  _[T!B!rH3Qw 2҄PdH`뺪"aUSJGDѧ"hs"a~iXoH*>XnDЏE}S3b́!B!@{ifgE06"HM =iiQ qe` zln ρbl DfMQLahEKC+?n)G!B!S@?)23Uqiۺ[ѮĠtF $YA?c׎J"ЇCWRU%Rz(V"=҄XK[ /f qſN? p!+~Rm8B!B! $P│r8EDTw`p! &?s+~w5nW Bqqx0O zy +%\}ng/ᷓgerEhG,2딿h@.U N.O2AߌۦǕ3'ᅥQXRuJ8اoǟ4qF(vA5XePpuSs7A `x]q^xegGQF$؎H_UϕlA̡@)1|<혎>4u1kj14೹~'vP#`ZMVf0*"[7O5>yӯƟ⪾Ң-@cGϿ̾ϾV{L]X?Ŧki*B퍘lj/|()**}Kv[^i*%jv!exmG^SXHGBpFY۟]U>9_sֽ: E~,x?C)/ !B!S@?'MI(_:Z%?k̤zUVm<*Ovfol%.4.bq,9t 6/f ~,ki]YVCZ}cq8]Bd6fL˦Nè}ހ^+nK/o7]Qcz޽/ae[> oOFihc?r뢒]?:q$V{跂k3Ftfxaptr4 Qg↭F WC3z(p.zP3:e B!B!BIeZ笭8v/No~88t9PR'j;VEqw!.P#)ZOmnG#Y\~>n #n h \R44⺥)um6ݎCSW/RRNx+ޯ^.؆B> 9@ӷK2xi>+*rQqmpUQqɶ,_ӧNB>ջBpy}=>5G1DZ+a[CqP/DPn@8쒢 G4 ݡS$B!rJH@V:̈ "d>5@兪h(X ȁST*芌ªؓqp/=`߲"o'}g*<4E“Xv R̺xav ”phw<%P;"2i(T)c LK87-32?ࢣ] DwAA>b$o+7jQ^(Wo2Q(Wϗm=#`JC 5S7ݒ#ꯞBYO8XĨx޿`Z4 -.HHS\"@F/l3&2'wMO X飈U<F_ -Eh?Bwmxu&௯)p3l@Q'fw$G'Z~'Vۈ,cIo!jjɴ%#AՋ^zU| mM%XYM56NB!Bȩ ɟ },OIVBk_l\Xfkq^㸠!qja3!)6nr#!d<2y@9\ߎ^s @zr?g!l.yXw]X] ! Wg?t%7 +zxf@Olq4 ւ_QRbœdWFDBqy_ŘԴW>v| cіirpBo ,ҷo?sK7KoJ\0[;ebaW'G_^gtU&ٺc/5DPR]sCw開K]Q\>݌,X ۸q`6?EeiЭ ՋϓA@F\ӯ^-TN# !B!S@?=R(]KX)X&@w_!ZJU،+иGVGGF#Wf_kPN!F?(vs.E:BľVe?t́kh &hE;+,:q۬ROaK\ϻ`<,]sƍf$O,zN p,\8i4>yX͇sfס7]*=ԫגmqF>cg?}F{\7ΟShFԐWO$\Y- #ټ.ϴb p^cY6%@iYi c2s4x Ս5a;^#~9.z[h)MjʄB!Bȩ %[tl⟢ؒOGJswPZj;,ftRWT]r ?TjBl vD RCjxew+b0nیug#Lk LhhjIe].sCoY#bVzY?/3z$~/,݁~#o\|`xb)u?,F[ž)N8/7 ˵źX;nj;*(k}=tڛqYs65E[ᣲ"aoG(?~b07L|V-+G[=4- +4 H!B!Bj}?\؇*6kL VVT9RU (A6$\8p`591ctf6 =V-?I=7S`΁FwmA;|`/ٳ 3R\V@ 8KHSTEAi ^ys>ve.3Sh{cN)0w⟈Edpkg͕KhqS=:BMrMEױ/kO J/7e` w~9ޟЎ.)Κ1znaצ;**=-OOzB!B! %CL/CKJH/P\kB¡H53eL;:Mѥ'ĽE*ЌGQq3hhM%~b+-P5ƹ# ͸0]~VTJOTȾ!xEUV<>ԑ\b_خ{  us.ݷ]a$`}xdǛ^u0-K|r\"vtM3GY;n/m؋.FVcf/S1f@7ίш~!5 S _ OQYz.33Obk'.lީEX"tcp* MZ"Pr=u a!1Lw^ڪaA)i13 ORI+6~x2`άYZnznTLYw 9uFkEfPF.ٵxeN.b?ڝf_#mQj !gпWZ{B,\0v LZ']} gId{=_?q-V!aY#:#QxrNT?Ik? Vja&cX"Y>zb FsS=Wfb3OD[c!B!S @?,fYi֚y%%} STԤDÄ%1*Y:#thnfg >4T*RbkujP=`O ZB[`}›2"30I4*' Z0ځ{?usއ$~gp7Yqu0?Z&-J cЬ.U5u)ɵӰm!EG?i)@)Dn}FE@ ]|@{!a3Zꥥ\V݌}1Io p[wW^OQu2m' @Mh/kV`KL 5Z秏zQ,^`-[6#tXbW^8oNZY- +ߕ~on7ΗZSe{Z}}V'#)p)GW% J{iz J:>I \8;˧OC6!´ۿoor}۷1F B!B!9I\020 aY0*luZ5VBqLwdgrPlՅ~2杷]z>Ǝ{@[nJ^=?|%-B^τ|'_G쫺[WNk MXN=7eYOF,zMK.k6 g gAibHoi Y /`\6mlZ;e[~;۰`rpɄ5MwPX;Yl]X]6_ۏ֓y"GB!B\QHYSH-%7{.[rôɓI׏,MC"/iMQѪB2]_,K ĶHCǪI+k Ր!@$,6:"VXE̘n&Ͳ)9/a#2XK/jR J PXB#툆#֚ 1,D ~XO+Y,ȴxv杰fs5pbA?Ѱ,CX5EXoxI״@QDCrޱX8('58f񼨏B,(;n<#"MY݆ )z~;IYOїpZ4 Ey;Qw\PM7kݮ`9NH'.wIO6B!BN&/wLkšH5jm4w6jCg?$=@ =A04Rf|wύ%%nϔ uıXʑFQ:p EDZX 0W }WOZ/~( slr;!>!B! P$= !~%ȴPJ|FHk=)o,: /h3غ~p8ؼO~R[qV,nr4?đ]> H~O (§uEC(wGphiU(ÿ8B!B! ijKgòK 2Ru])  L?XCHS)56Owv%u/=h;ny \t ֦]E.uXb#"^AB!B9Uj'ȋ>)k-M_/sߞz<! 1/jUĉ뜸^bVaBg5*9X/6CqS d.te`LK@ 1d_J\P& VD C3^.b CB!B!=gn[hHz@6dŶUm9VIKىuYY`v{. B10j ~1Y6\=zݯ""qi+'<>ۖ /B!B!A! E.!%%䴄1;qY~`z v {صLk?"f%+o_SD b]!B!CXƐI[ +qk/?#"Ggf"MOM$+o.?U0Cw  !B!B{(.~%z8b˜.!6ZD6 CPzmt/a{V_MgR])}h !B!B (a_/!5ĐR{@JK(t )m7!La+%,҅? *, {" !B!B[( S2 Jϳtbi6[6 1Pl[=n&i(tSk~s`+L+@9y?Yі>z0ј߉nu>Q 0Qud5(%`1Ҿg3p-߀oݙ=&B!IOf2H&\_2Z q|Y{`'RӬz/YR#!']y.x w> #Oō1aPt̰I̬Sf/\2Wl݇?uV\;u4`M}4%g~?-?y(l'd3Fa:?ЁX < O3f=q)s8~Q?T2NO<=%cԁ|%mXo';㺛qg>?{ڍ2V\5ZF7` j@=f5 7>3Sk+W5F)! !B(`xH'8QS UKTLMoyxߖ'60r4|A3: DzoGLaqJ (?qWǞ^vLːNlfWעߺeoѸu~\ z슙W]\܀~wގ:w*C ^oj]N6[SVbXpS=yn%~ݔ]L"|^Z*GWV7^}-^l=nA͛\t{~<*흠v2W~E>㱕X'2GOKqb޵i˥؁F|g!H0﬚2 O\\RnVVwu=ξNs1E}z}|.kݸ>3݃da'>fL&&?]u!>>sKF Ǔ;z W=tv Jm WyxuhNUیkLg.EwXgc닾Gw9f$Uv뎦h¸kǗ/?: z>>(9.&jTWE`Ƽ ONbeGnԫL}<|cr]k: wKzgԿ#ލ߼ҀFOջgQNxL-f/."|SӰߨ뛑\uqK}uoW)nL\ߍ}mQ؈SEFyQe(\G+ǔ[Fp{[e}+ƍ%؇=qcqY>+AU߷ 1ʎn1+:ًX/2+GbfܨiɋXhv:z9VGmmFc}QNB!P$:gODHTak+&ncbZR43ΫQ$.1t,E|ɉ"-2ւ2؀pꑴTo!JF9)<)O!,rL c{%n7q?:h?'8)Epmenl.üxX4w9.cǓЮڠjqbԽ $2BY<>F:~c/Zm?tK9uk bA[NgzZ5^x?xUoՎVx_Tч<{;XOkѾ}]b{gFIY|?V[+̾[\zU}:y/yx˴tڶ|kĊ9>a?4E\K?^3y|}ݗٺ;13lsCF|[@~lKp`GcA_{=<Գ|y~$b\>z:4mb2; ]67 %IW&%2VJ60)ԓN PB,OӳQl6;3چ_߆WY&f,ƭk۱IB4_?*DAen],zOq>X5}1ՊGvt}7:X=.CϬS>dX;FUƱ9'\F~^lo6}6ckDZ7k"-M8Ѩ*vWrUT;2DYLd)+Vouͧn*j0ǒ?)uHY a+Ι:f˧̖CxP Ϧ6_6 'W#0rћFεFs|Sk@E]3=u&+Y5FԀ?oVl:q_t==+භa¤an듰e+rB! ! a;CJQex|` c*LRճO6Ix䎱V79cYmXb K`˘Zۅ7iu-Mmu$hWMB܂=?&i$o^-5TK>2/"HQŇNu=k^mNދl3xo }_`kqݝS<ݷD5~iI|&OvX߆g ۷?mc'Ƒ>mj} zޓ֫g|UƨG~Ox^2-l-*|7QwS5[qlIYF%3t<@#f<3qG*U`%coĨѨ1&kLbFƂkT^pwgMٝ۽[ٝ3̼3>zoJÜ.xZt4_as׈_hXp1tgq!B@B"FjqjW`7oi=9d&%Ь^Cu@)x("b`2߁9>_!&ؙ3ϝ!2n%[ 7l;>7_tL`E"F-6?o܊/DU~T['=RlڀO##oZ:JWao0W=8ǮpvDSRI9JeݶBsP/-q+@˱+43Y~#KE%! 1ik]>cfMʄk** < <&\ y;=cr ;r{gM̽*{DM#_bsT-ZoM1E_SVO9$XL> #ikۻgb[SXxq`[tO3Zl)V0êkR>oH-x|poɰ U}f M56aq'O@ϖS#BHH ͆(?1kB(\: ,%)˜ndmg3'[BDI|)Rn r~p pm7]n§K."c)s"S />9է7, X&xv.|54xX=l܈u>"Alt-֝t ZuKoᎦٸc3E|hg1ѡw!oD#ce"o)쭳m+->.ìkg?ߨcCX۸;7~"Nse{aN~lCLfHzYW͍G'NӏK]U>*$Oyо&اeGV&lϝ?S+{cr|y%K0xp利EӺUΘy}'M>'Un+/W. !B V0DKa;&ZvK"=7VW.ujp1LA0)xbgbAKϮJJ6fA֮D(9W] 14$!i:jji0@&*wu=gX:\@Hj ^/nYlt7]y}L5d:g3`XV  j>vQr"h`뢟'E ~~|`B`3"/N/PPuhv莐󮜏+)طs3~ Bzξ*U6'+ÀTCMɯ.y$B!}*'B<ԡ~v8P`:Y/nda<4JԲzozX>$B!B9Y &B@4~PZQVZ26UǙǼ"`z؏Da 5G!B! @4M<A6J3?b Mi,J+[622("xqDkB0H!B!ҳP$I#d/?9,i/9";2FbE"B!B!TP$I t]p_OK4Z2Z<]'Lt+s2 B!B! $iD<ߔpj ~#"Fpc(_|~zzZh?8i(ADgQg`B!B!^(i`Dv!s,e~OXݤ~ 1"v\K.R#B!BH߁ I$ &B!B sCj!D^ZC E<[y)~:C,_<dFB!B!Ά I`ܱ>7bZ2DJ&VϿ_>"! lhow`4e7"Yb#B!B}P$I?X`zƊb؂zlC&ik6{q! 0}v^=[CB!BP$I-ـϱ\DF 58TcĿV^m ?B& %B!BP$I;*"`2i=(U?mntf Tg# hlY>#ڡjI?B!B!@4ByZE@sfsIHǰpŋWR ,X}@Y-B!B!B$M(k(lh+U3Ę۶CS3eF?O. "mB!B!wB$5eB`[)?Y+X 7 2LjC &%#9Fv#O<B!B! $iLĒUe XeQ W;6hM}-ѯX-^DDX/6B!B! @4B %5WgD,g j!mڊu[xÐ[{Y<?mϿ ^$}w $ g1s_cB!BS[5dB~!d`s*%al1JBؾY]'m(BF0|Cِ]3co W}|XE>Oיs`1b!Q$B!Zj#E<<xu;d8!/IH?@'df(cղ൫E]%`G uc2TDIMI@l~ЏZ`f{:A*bC~I>? I&iƜ@eMT,**4!Bc:_OT6'~u~s@-A!Y*b kKL$ Z'Q RmHOψg5$i 5E} !B vak][ۀ'?C4YYn;*!t iKK GO%x*qO2?CD LA/VNaYa!/j;_8zxB!DqRdl΋1 Y%&LsnDCuIyð>8W9ImHW48Dמ;?d{~y\-Pp(RУuu$YVzl\;Sy  sn|GD⇇( ?aQW1@9Z%^hZxz%MÀjYG!җr}'Jzl6M7]+"4{'{hWBHKOC(B >mBԆ]{#5ƹ bxuW|KIIѶr}bo}gK]}f]_쁼^@i$>v*Jע~Q"Izޠl%W{ܠu$Q ݋,QF\"jJ|I|=r!wU47woo\x<>NjygjPv(Ŀ̬V¿YE.C>u Oft@Bt(hjj?6jq^~ⷷa~!yϞOOM t4g6nFTߒ'hҌ?y9ooGH:ya|;ԇz! Zӆ!'bx,c C#SQpۅSp ǘ+X߼20n nЗ`@Yy-j|ڡQg݂l ~w1w٘=45>l{~,X=߽LUzcݻwv'oa-tJеUx೗러ƎqQS0θWw)~xO.z_Gȑsw6eH9*F}z 0;pK!1۠mkǎxbO<^s Fc$ŞD6n,B}h;}Р~6.>DJ dG^xBtjgnS V)Bzb86hF1TZZZPH :+1Q8ꗫQlQ)oƭ^KWacv$=@%ꍸlT b4Oi= Ԏ{e~|4flǿ.&(y"wxWL/рHrVaJ͵v!~2܁Ԕl^Ÿn~'{xt^7`5֯E;1qHieBk$Zw%~rmrqY ԢtfVmP7Ӟ(艏}nn(?3?ߡ:~Ο>1,~۾}LD!-۠ +iǎxGUUUGLOt)BEM8/ƺá qtC96$KVfS3E@BnkKiBU'ƹ} pm{1j+>n56͗k~ IBtا=iޠS (ļ?Kv|ϐ:S^,n݉עL8.n> Ă>âg/?z)\1uEU2pڥ'SP_ %xf~[f;?:y$ƉpKُ2ԇXPlÄ➳G\F,y-diC`y9'LBMδY8So>cD*,QD]L-m?g/B!ٺ^Z0=!#X?hU8/f><%PSßg]~2-+Ug)x? = @rO)Hv%ji.b2>h)Bd,~1);QkGH.L9F,|M|R>?y.!>3/e|ިjxc.?K]U%%'54!y|9x4')RѸpD .e*x׭k-; 9U-^,[ųk;++-±gd`{O~Yy Xxwa?o Cg˜#p]9USƎIg⚟~^ ]/=;;J^VO$yבe \y>Bd;1/`7u;トBHA9 >eOئ#kk֬i5߉' ^O'3fV5t.C؄'/%& Q Pg~;tS!V}O]i膞W,3(/ռ% I:Qdz) }uxA7Xw?>˖m oP2 qñim¹#\lo]G\MeX >}{X:ԁ/ pI(}ZL}H]2|K ƖQ~[=5Gj!6lSx:Ldnf~5y|'qd Faa&M~=lxom9|Ge"%pFַ'v"[?}\HV`Ś,XJ֜[;Q!S 6%"uLGs,˖`+C11UDAcu/#˴ ޏwgBv;5L A@lBHBL0,v `)!>OtmӦM#eiVnG׭؛"[A\.\󏟎8 [_//FmȻ2:z@KD@>T…n\qÃ9SO~3q1&-߈EmE4b9)dkMYWq( Q17jBcbď/^—?ǖxlipeeļXu׬3k  zs!c+Zt~b2rv%QӆAU[:_r$e Է (wd[ܓw{,*tm5[}ZZG!i!dzLp"I&in ؝}"ҥb…q/̲Pu A\OD_Qp`'HYMoIQ3 J V=(߅c=Lז)j#o ǠH)Dw0_˃׈UVbkܙp/1ͬ'#CQSC1D62Jԇ@ kIq۟K~׿Q$ϛLCP"8 O7Tl@ܘ{p(WnȥXǞWp_߄tF#xo.ĉmc ˙Fbz-^ĘHu-k(wJ=!2- hlhA@Wn;%I48M?rwZU, yo;2'C~TVGB;h6]H4b؇B6-ڞ<y{Y8`g[O߈̰ r} VH!D7&B1vBB5AH o>!BZLbbW(R*Vn؎smϡh 1X& P!= I)VA/V*/~6o(Akw%v+1nPemk/gϻ76n;x8&V&ٟf="ހwHzⓧ9 ? m K`^ _0=(TDS13g +[. |ݥ6]r#7 طn!7ԁ>y ǜJ sfX8rQ8i֣? c5{$. /p|z|9?oe }2GS%}1:itls!gd|>NH۞?%!X;Z0qtl#BHF_Q**O,h5kȑ#Luf$E'}ڳgkiBGYWWڂ]l"Fۣ]4Y~=vVO@<ɑv_mߋ7>돰_g[c 1|H6w}p (Ix4 Ń쉸iӒdPso8p>X:~x4n ν 74?_' 7HG:GLLWqwNÊSW6zf⮬?"׬Cm cB/x߿=x~c3-׽ e+_//;ooǑ+]6IJbHO4_̸ѥQDހ~>kLpx,"ܿ8-g?! +5! ^6*|(m-n%my`cI/BS`А6Fb)*ڍ'.W]#Ghdo߾Wk ONs[ &bTwܓȡ_˴4 (ue~EX5E@S OKbWR$ݐ^u3}uy+0v ?r>Θ57で7~fn8z2_&K3Om$yb=b㽤`Ljٓp\ݵ>ipYSQPtΛ=Yk0fXgTJſ)s/> oYa"jǞyn=y(2o$BH 'mHOxstIDHdcf?@C'z!욠lG'Ȉ܅FxRBx}x'͡Z%l{v)ޥ!jKp`6~OE |u\H IP:c<\(=WÀT~C捸XM( ?)J.unX5:kcK„ MLB!}q)@DfYH&.)zc-AB0$,CZB{Su/vg*L {^>ܼI/ Ivu_ !B!BIP$B!B{P$I`B!B!B!B!BbHB!B!} $i !B!BH߃.]B!B!$ = !B!B !B!t P`P+@emHC.Nr@B!BHƥhrnkk zhSMA>@B!B!4/++  @ff&qQ[[ Qۿ磦ŚGeh0!! Bz!,:Lձ$ը$htBJD߸q( a@ZRR*3 P$BzSӲ#ҝId !wXTܒ  5(d{ ujx`I޵טeȡw3CF'A5J"$䥰Pvڅt@BH ! P0ӎs! 4!쁌FG 29jU?SFg\XQM&R$h"sPR[=KU˘uСUE\ziIB?^}m6A!A>رcnHjozjj*ZZZX{^2GtemHȡ)ˆklyq=veAuȄ piņT-iiQtIOA2<a =٩3O?OJhjSP!QuN-2dD((9a'.pL7Bv 7bMq*r{^lr;|u;Ea}=]<Er!, !a{%Zt?B,ao Iөՙ۷ku" ! ՋW5ϟu+E=E4~mlݺwq/ш4=Iz b0/I#tcX!MG|1phB.FRaK- hťE-V"N-!]ڇ߇k=?[B H|Bf=n3Zٚi<qǼ-vļ4i w`xaw޹Skw6|n;ԼXWxB/!$)_X!PN+Zߟ5oBGy::f'O^/@\v֮u h48Bг!?  >DgI,< 3HOKE^n\v-瀰ZbE5څ|g}!CC> Ӽ^/vư߰[`u۰ې>3u^?Z'@(0@"Ԋ&*8z&;~ է<"GBk =) /(h񴿌/bVB RD{1&/QW̗Ω { A$/E(y^zmTOwϼِiD3f& AAyxg$/?XmVl܋e[TJPo q3nTڌ=-Yʋ( BԳ*P|qX?΢ Bd䨕9W?hK?[XԽC M0.P[AWK'[s!C5)B:f%G%! 5' 3SLDeg_HϬ-mzm]6z|u`LqڵYe\ )_O"DÇ =BHC>]uCXU,!e=aPѼƸ6g|{WP۠ow_<~b>trܪanz*x1lh "++烞 eSz&ޟJD'R`SS-.P/(0EOф?Ss~ 6ECA&uLNL!ds=Oz_0$Bs5Y) e *DA!.y*9󑗗 >Nlԑ#2yf:SG‰Xi X p~VYL#Z/{PuK".iK}xggB#AP4P2}"j(ilr (A&rBiŭ u@4_*^ZhAq衿'W'"(+pMGBfEnF`LIsD~X% 4Dyrb2[GCoq|EfoR\8a i=Ax{~ ^-// !=@B8g}V, u)NcIr-"#3M:옂iE <)C{ j^!!#M-nM&aWKZ(@I+)>~H :#>x (2,'G6b7 {BH.^{.9StEM̾Æ #!B!b;fh>sݢ_:! }i J qD߾>9~~9^>yIo@\eee{!{HHV"z1$>/,1携x ŻF4DM6JHt4C 3ޒnllNKR44֓E#ʚDI׆{C C d/p~]Xſ.5g{U!(CKIZeڛY'ծS@2<)2nC0 Vf7P$#QDB( B}}}Բ“aNi,ȑ#HOOׄG3dTM@B-8uoN=mpE)-rQu|)BHBG,=R b^13_ӫPd a¢017"M֛C{qzkl!YyCC A%w Poȫ2`fqoD5L~(ҧ3Xڢ?#4 6EJc)}TFݞ7h FE$Є?.!-1O1vmǎjHș3!(m()~M>x|v}ϳ1Sվ̄Vo=klz Z C$7nܨyY~PV#~BpuňBC@HLoF,<64NQl6K6?>f7?-p"YO\7>%-ONl\!^} ,GɕaHKhKi8W´ b_(=I'HܽWw%(jW<^v_V1@B,B 1aPO%jZ<6`>ѯjՈ8Pp9VZ"pelax/?$>,Gۣ7R3cUAV[ӂHiaj\H9dS_>B,i:w<)G+\sL:JV~%2+wkn!*WGz(K ]綩(SNEff6^~gu$2k"u_~xX%֮hƘYsqQ!OCѺ%hk{;IM(ݹWEQCd㮾3Scy߻BkP0M1+0''>⬷@qz: F AzU^?CEi=l{Ssy_ckW-WnLǓXveIRJ> Ľ5vF305G{P`S|:xgO܋)X%~z洊{@B(BgZG{(o(q:E HaaP+- ,Έ Jr cV5m4ffu=fq y'Wޫwˍy1qH[w~o.5<YƎz N)+}y$j_?OmxŸU)-6R]lysqCɢ /O//}=n<: s!+ǩ='VU\L<ϿGM-_0̙ <{}{ž|em[֭!B±^W&(BMPBxlߣمc +¦ 3':m[K݄=ɖ18<+^z {;קLj|ޛmn ],%ۋѬރ'F]pjVlIyxog~ [G~G oc'F["^p,z M>t8)5_1;Ri=bO$zPGazB i\ojI6k?^A0/`G!{\l^ GJf5!mddL"M3?3؏pa)"F"bd4s?jo ˮ}[0 7=Vo\Q"g`ܹ?mQ.쑻pߒuOpQ%'q/ў)7 ??s,r]oh,Z nGX\-kފ=o\1~z}XmQRO T姞ūyʩR՟gW[ߡ~ (}ǓyQۖ~a{w?"rm6NI(o?^xJ5(nǹe7uC8j!UswJF3ƨl ;?Sã{g݊O?N*V$B_GE78@2C!¢^ᢴSpa:MDlui{Թ}^u起.aO)(V#$nr0wh_W` qe.D˛^]7;}:sS_ܪ:71m֣ -BR pu?UgL@՛>٩d+UNuy_cE MBms{ 2ą +=zn|+/~=\\Zi1{7S&cئ{7{_}~i}f_!,M{@!Oj~M0 "W"X(ƛu*,{Q|n,g˝˯>ysX]+]Ɂ܉g`;(@ҋt=<{zy*gXVTP{4&ffv6%eN}|_|#VcǢCUCބa{#s=uǢ2P/V`x jV4Hwr SLJaOFBw ?TgJotSǪ?gƻ\8Җx.?jF-SJFPl^z^P9S1a-Y%Bi-}ڕ69<|1JDXsJ/U"<)uãԕ?E]iS{E^Ck\(B@BvS@/@w`@Ի+vT iFH3[>]f^P6,' %֡~zoN9 {m;/b5psW~%|T ,,a;jcKIpX\3/ wcP@'ct_O;s*ak#+h;{V#1X5e ("$`(XT g'Jӭ/[ 5ؙRNy0d8rM(EdW!Gz[Q6&\Q'_/0vny0n{|80d-)Yye5v~ኌ7ad6|6$ꢠ. Axrݢ薫''ȧ?Ot0y+O??nqPcUxyweoB> #&{We]_b92gcP}1&`Ąqxy?W7S^EvpagR{F !x\qM^s1wvTI^n>6Sv|)8їpp;/w"e98ؑv6_xn|nL 1NO 4>{aNNtAJ,i! H߳gO@j^RKd,b#c2%Gً-?ApZz_ J^\ %E`:6TV K鮟R^ e[j 6S,n\iY̡+:/Szm[E41 8yAZ5;30QnTM6ڲF&|Jɬbm3ȩ peϙՈ@w]i[qɘe\iRG,e٬sAu gѡq?)u\qeq:HP$آA33 s @]X~H{ a >Hݦ*h]v%m_.4GI}C0(R"` c ^̝!ޞU^例Gg&aٷV z1d`,^/z!l:zEe 2H7/];fk߽-~=^|*䏑Fު%9"8 ,Nr~ ;lyn=#gc_R1c3)F Kk^s瞂|]yMWVY#z7ܼnٺ!63&UJϬ%1i\79cIzJiT}iI5TpxQQ6HZ|xϱ8orO#eW}i5v>I-Wq]<%=WEiC` CbhqaSA *7ִCK0-Cy ;kM%}>#0 :ǟ֎n[ͪӽ"*e8;;;b9Wt W1z=zQ+N)ݷ2ne VHÔGpK:۔R;# ngDW ._F[nG6\YJ;V~r)Vac0c֖M3FE÷k :ŵX?]?۲ꖂMAq 7qsBϩIiÔC>Jks~RM0퀺Y|p\1 WߎRlj(u8HY H9R\gpu1Ьy,3n4*0Ĥ@l`m_ .ťODVHc Ye}Ik N뫸sn|E ]4I *O9[8w\lr5vâin2B(NJN/5U;qfS@tvWAyVB-$.}Orݴd.87?ⶶˣ\]I"ȂbKv-aВDAGK pijx@o$o-1 !ǢKΰ57iKלE߫xBVkpW8Sty%,';^=a^ч_VS;k\_97:5e4뭘'322e(;! B>]ӷ" AP({>ٱH>#zOŧW3lʟ.,+Nރ;/4C]XnBܾ-uz>{DGl_OV]C u;S#nX$븨t_B@BHQ`3ni? c qJ*&BԽcɪ@n/A>ҧ8Y(EV^&T /\{ V .:d1[q' 古* Gȴ܀Գpύ{˼\\zqTJP+>`3+sexֿcF`Dg,lLh~j2E_P"䆿Ǫdgsە%<e%حuݗ\A]Ľ&*򕘄Gl)ǐu-¦Z9<3[ ghQL!WGRu סYXtnӺ׼ZzeGvWsD\ſ#ux #>'z!_z"PABўu vcӦMh 2;C3oT~G`RHu7#ZZh [Z6g W{$xغbq" cgص[)J9kvM.x<Ao?]5u+ٸmZrhrkmBڵ(eׄ:/5ج{jcQE%K e]rLT(n0[=ϾSw;6|SGs%1y2Vo W=@ +_+Ƹ]#.Sl5VF?9AqUS19șaI6JjS߃o½nG.mƗ5:F4xvĦ)Fp(~2C?&wf/W6ڵzڄ=U!H-~Y2>,MELvjzu 7=l^GB,$]FM{7a2׋kQ.>Kb{߱gnu( c0TϮȡz}8>пrڊTX8h |<9YaSt۬ǟ`{eOg#׆iT;}[n7ߎE+x <؃wPX;1W9R U8kJNV>Wѿa+ _W5fƯpgn/RqyseSثCdc!R xnUݞݍohT|& HnzZ^-k-؇M֊:<E|+ToODJр&hE@L{w߫W6F B{8k,l.ב}&oy{쉏騞~n;cn@B̚'򤆔bT4ڠS^&ނg1q l+\~PGFж5qi+FHn\phYQ_COta;V桖FJ+//̻G_X 1F8TES((ۮD}{],/~5s@.>ݻwރ"RX@Vw۷-8~/w~<DuqJcr]sptO s:g U('<,vsstqRWlY` -/tMT~5k(T!Ҷ60npox̥Tۍ> .E|l%F r~xE0[oi}$]4UyiCcƿ<7jٰ/![6Kkw÷~WoUyZ(Bwkdq}D"^n~Ƈ '܊WfRau{9;1@al! l#S{3@MGɐ>-G@]LtG0XQ\(/)&mM.|1[-j G='x9;yjxJ!gɉ]"/V.9p7ヘ?ƭDw ~ǖNT%,uϜ̯kE={ģkKo f+oۙuӌW1?cSS#K^k^~Xo%Ծj1׬ރPPɟ_7bpqx%ҰBWOP2omw&L^B ^] ŸŸm h^woʧ]nSֳ(O֮<9)֫!P$(@]QI3VUڀj]ˮà-n[fnnջ*}%ؼb;1vWJw ~^yKʤ:*!}vHXxv\=enAie9u_&b\$}Z.7/iI.v㪓{Ix'~xpRDV|u/4M pFYKkR3bL;  TWUJtOWWjY%֡ Bf;G^UaKj^}5q|Z`k3o;ܒc")/[JcM+W{[-%z)VCHe fWZhE{#ֳ)۱ /@EPtV~u*3k<o@%.r(B z-ڱ0 "|MOIWoS3bʢr٢ ^77Py/A+kP%uv̷>k`~{q-7T%w%lg6 1 OB/H rB]vT1Q,+<ٻw/bbb헗Oq=u(T0׵##%*:BnZ*T /nA KXZ!!CvO6w0 *=aCh( c\4XXDaC$-heeظi#bcbѣg*v׾&cpj+avF !>&fÏ(+x^ɬ.$MH.wçF6&Z`A4;Jr  ~.b |qqxf⥲l+mxU_js0vpΙQ-i} lvl۵XucDev!  92x:vS.-)efC.G/ba^M3zY-Q% 2kAC@W kq+n&Q7OxЎ7+= Q#h. ԑJ /+++>#1V!/8#ݗG 9? qhpK$rJR]-u/IBz#1P$(EWxW^9 j'GUu5.Y #$D156$} )p%S_U?b(4'=Lш!I8Vhq) ^BT=}qۆ:BA?BaEDw^YV+z/b\@'Dw`1.vxA)%qMD!)*`z!91U2l8rEi=voE"1E? Ͼ~oUP{jo33<[,V8l2Rޅ_mII_Pod$5Ct/ 5Px"yYTP~.Ty q}En!rD@Q׈">MXM"@, XO$#Iaa*RgGX*(EaMajHxept1'@BR UZv]]:Qr-Rw\NXZV&$mx>'{.1IY! hռ\vן&<Ÿ2%-G-#BCAWB.5.z!"/c46j_r'YXr]!ɎZj mHj(Sl? ςjU _OݻUad\#sBBCnlG\9\;fCT@ɧy$Zbqk\Zo^~'uV󓴸f&C'D#(B8 9zDtтE@_@x -DFFꆗ/ڱVU/B)&|Z0Kp·2>lcj_xvԉA @B2DWϘ/;vdBDg 0%oK2ݳg7L2SX'Laq MPz}⟸gҖ0`@ pzz:VXAXD{!i1uvP/ED@㴴ʁb`\~=OJIe7++e(1߇ ;89_|>~[N!Dעb*O¬F^1(<1xß h_w;oQv/ nbqhV_sg)fj#̦Ѧ^0m7f+DX#h:^ ]cI-P9Lzk|>gC6x+g;ѭqvde{ZPQY]Cim <{EW!儐?>PQ.b <yJx}^OT! J>2|GACbcׅ1ʾilqE|FH} <oZ* D@ Tg803ad"pkx` 3au/QʋX{W [.U<.(ۋ;- g`WovFu"}>\nWjmq`eJx8 EYYLcB,D]_ff"5[՟F"ZqóZ9E`y5 i}DoQv] !\Šy' IX I6Cjz9r"dۢ !ԨF ;b8f A|킐|E<:ފ Vs>LSjX=)MRr3Ɖ$Jr%XbDQa[:^6_xWXM}k!$@sm눇P Sz=Q'Q2# ҥK7'6d6eˆ:_C^,WGq?۷OE#rdXjbA{1$3$'=QfWDwzX !xBB]fv~x vfjCRndXަԢT 9;PRmڕR:$}9>8 >TDe[~uXf((WkMS]]l52pKisp[RZƑCDF zB'$)2 >_&J|gVs*K>/LVQh(Y2BH[(/E9%899EuJs׸LC(p?B& tFԑ2h}{ȲxrSbɢT'kQҶ:uRgee!))I G\Gzĵ@QQi._8vH jBHo{BH[A;"xM%%%S{$t 8B}whbb"iP$B!U#<XUUb5NS+k.B !B!!ބ׺*++ծMD ^g;_n/ ^ԭGn?(B!B9(&^* OLoE^)>9! B!BZ! @v&6V?3 !B!BP$B!B!.$dB!B!}A@B!B!B:0 !B!B 0 v&B!BiB!B! =IB!B!A@B!B!B:0 !B!B 0 v&B!BiB!B! =IB!B!A@B!B!B:0$!s1!B!6ԩ3HP$!s֙g2!B!BI0!B!DJJ ^vee]BjOfW{PYQp#SgX,ٍ@2f3+B!B!p!ofo#`X 0!1 qqط/%ŅHJNaHBd21!B!D8N 9gĬO{wYL#!A = !B!Gn^>tq dHB !B!rv"!!^Vk} '2" %4IP$B!B7W1c/AYFB  B!B8V^(\ F r2%@IP$B!B 矠J\|@2&@B!B!H3<f OxIʴ,I "(1MB!B!!>IȰ 0!B!BH  B!B! $d(B!B!Gܽؓ555jW`Ln{SJgfiICB!B!$ kV-Gmm-zNi[p:[7#7w/ "!CB!B!z2XLx"`2«$łttJMq:0HHO'!B!BH@eo8\_H0߀(/+S%$(UYVoLW{<>,|)+0+p=bKe?3.`SZ (rO[s(G!B!m'W>eդ(+ʼtTTT0HHP$G Kv*M}6viE=spFAW rWoJXHmu`!ڻKוCvÊ5ʩ/Ɠ w=2>zy8p~B!.e))U?ާ_F f H X :e []^=m dL>& t)nZ ~+ɣ`rūʔ_lzۋoLĄj\|XvjhHOme=q~B!_XD|^(-rOv|FB 9B=d uJW .E{i›{/ٯ.7$ S&X=wT)[B;o.`'5_ Q9>15]jP`nb2j} l zv]m0IU}lv[X&,Ra5Y`vP%Jٛ E~[]A]m>R"ai(jlQ'lT*YbS9юR7Õ[< =P]sscWHPQU#7s>B!ҡMjRT9PKd5> DZ=$ ǜ2 碸|~Κ>M7LƉv`<gyfwn&}M1x`/cl}67t O*ïѷy]^gWW_?ľ``pn)֣sšEpGve9(R+^#8% Y[>4Ihd~~n-b1Pm$,nOÃ_t>B!ҡ5O,׍(AO}H3Z#98M(8\|S?mǕi8O}.su9)݇2  Vx㟺E;2Ł-O^[?k):ZM+&cdؔ;=?D' |&Ox`W)%Uj]RGaDd'޻&B!ёuOxA.U1QIKϙȖ?xcj|K,X-Y#>QSƠ!A,ipkë?5.a{?`OXVB|Ө R<,_]s9Bc4 ayjU(*u|>DB!׀ߑ.$3 =ɑ"SR sz)ݡkj֔ o8ae 6َy" ^^ڷas'" -.ʎӌ}fLv"{*ڏ%x\:+!B!(AL?2HrWr"ƜqɆ8){h,J89+{SaȈQLrk@jk+pԱ̯B,6M͜o B!BHGCBd`rdGDž{`2$![ IHr6CjCOeБ,,/!Vd>|hӞČ+{L"B!,^ q6K?IRbつ|yaaXbqyU]$XHzQEdC{B,R)tmAXT8*h=3p!B!G7.~u.0OuQ%i !GSZO$AqUib8咩8C!B9 3 (  #\t䛟d!B!4NX٠GZB!B!ҁH!B!BH !B!B! B!B!t`(B!B!ҁH!B!BH !B!B! B!B!t`(B!B!ҁH!B!BH !B!B! B!B!t`(B!B!ҁH!B!BH, ȲT !BH6+bcm'\55$]+Ō0G8""a2B u9r! l8s ÅD B!!Un&q.奰ZmHNIno!rWeE(/+Al\SE5]D쟧}* M2)OG,A;$uӝLf y( y9{ХkFݵ2FTV7- ^ !C yMpz/VfM> ӿh/GH 9:*凯!\x|'G嗤`;A#h !}%XW\02?j rlX{.BBcdpva=ZS3؎:XZڝWSr:it#Fo:|l8t :{kpO ժ|0 &9ըwV:3 6!m X4(غs7>hG?X,s/?뮸S/7 GQVp5b륀qxIv" S撷XU}jm$/uՙ;0pyᆏwz'阱Ўqj:`+o¯@mxZΝ;vɴ!ֺP]DNg-rLgs> 3^:Xzu+uiisH ᷶󯸸GYi?6){2BCGrd¬=-׾8&%&ޅ/f@9᙮lnKAb31kC.J Sػ (0qWznNnmQi(/V64{ 8Ag?HB[;%,VzcࠞH{Vسe#GIт$t9f(ػt~˩>jn;d 2bs!4z%zbYQQQ :bpllj|R|<|{m0Op%z wӟz8ɑ>.NѠyW0k@\}H.ѬblRnYc(>E`Nu0L뜬͇1n^rm[:yy[K7^s|_8 {?%@?\ :8lWu۬ϏBHkE;wf^S߯~[~M7W^p؈>tN_|酭u P#q?2vɋ|ظ*0yʱH%݅XdVD  UE(w"P[U _@L 6[Vvm݊󜰝1 q%y_RRR?/_ѣG#!>.0Z7G^ۜn5dGMW˾ހ{w4 @rd0ّs/.8~SZ}=`POV~ffDws_zG$`O.J> #='Ս߷{1SmoQ]=U21q]b(]8/Eׄ#qkpV("o (/ ]>Oc?1n|yҋZ?kJY<{^:Mwc{bȯpIFV.F*x_3ЯĘ{P9Ler硻e-xH[qG{?Scُ埽E^1=]兯ߜ+v!¥Utr߀sEk/]7ϛQ"G/X+GPƚ^wm{? W+j|JW.U֍Л^mwag5ڣɲe?h{N%n%V+Geμz\0,o6uىs¿?_]or>=%%6˟gq%k:kX!%Q^={;t׃^L Q$)-->`xNV1c8u$6Qz.(N@ȬAɓ1$HwjUQ)iQ-)BӇvK1!!gygfhr:Tp'V}zGLE/`֚$v_Q; &Nl)\s+F&Tb¬gC7cP7xUH:6<6,RY>*S)wIɰ(IxRP9㋿o}񍸬w4+87?8 E6jޓHƳ RpObtb~oH}NFm(͘}X1;0, k|/-+ +o ;GTkz5\z)u'We{`uzG:靦ΧۗE~ꥸ)9Xo_Xjr|?/NW )6a"f~7>D\m߾_uwv!>|>< S O3ר2r0xH<="QP9NFTh3Ns!A./5+!vnWώ:hq/"J/0oݺu,7idG*Iu>ez͡s\^e{?ﮅ5}*xDztW#kG .a>`]ZnZ:=Pnlk5<񈾇3گ,dFmi e7Փ1Rzmv#f6' iGI:r q\r|j`K)V~ɪ[1cB؆#>] sv᳸O 4=Fa숞71^rρa-׻[4.z73*&m62c(F Y׍;J\*Tn8S;R zuh4^F._d^-gհʐ;EtCz?y?=X!i_'r1lH!j47/ +޺ c1/b/b˕Z7݃L@[D9H |5>W7Sk",y6zC0^j^ HV xO v^9 *qSv`آ>uk~FS1c7m,Ŕ`ڎ>6QODc1rh2L\SmbD~ՕISWZ|m/Z(+0}?q}>\chz$gn.cHΨ>oK=4B(6T,c/b`C"`APH'@( !vuݻ\r)KBB ff3âbSC-R k_=)FRGź%iS}DZ韫ܚkkhl˹LoY{(;d^_y Y )+@ƎCVR6Ro g a|<;ُ ޮDh]~"_GҚ}/%%Q>{A|*2{_[=.D X&J>7}Ԩ>7c cŸҋ0wؘY& L j՗/~BQ!۸_-Z}9ŨQx@mI4tc>)].uRp~[輲πϩ}cZ-'vo=akl77SmM */i,{}`ڭ}kP8 am[j'ɍܽȖF)RKRY„}1?u۲[cbZhЬN=ߪ47 nnc嶚,[_krvTO qa@yb_w񪑎WU^JCEٍL'~Rc?7m݃\`x -EWʞc3W{sΖʧz%\ʕά;ڃe2y(CRApX5_XʕgiO,nf_ۯ#X[F,Ys ZyO ZPwv.|`̠`r3T[ i! uk4}^{BӠן_S:.;:n^DDDlQ׀I*w-7xU^}Dkx\1HgstipwO;Va?g+Ou );HߓƬ%xݥP _w>ƮP(?S֗uGnN9T7=B2y9WcSh\_CIcf5?}wwk5.b((ee6۶kmI !*Wn:7\ Ň+D_CH.l{~ Xzںz`͗` 6{Ș=^ q_~d4MXz6,7_,-K}0ᙏ0hi"tܵu6_>h|a4(?'Y kZV'4 hյh؎:˖l•1qx{U LfכŌX7|.l&jוO/70js1 yS[P :,`pA-bC7؆I*x`j @" m4'4rAF,<r)ݶ[\M0tR& LX#h~ȫEXt;ÿ'^m2&܋^ 7gMAyንؕVc|^|/r&A__쎈k$- H .c>Ah`IJ4k~jUhWCR co7}H(8*>\IπϿ/ZT]ʈ&i]* ^ F5ɏXz_Z[&6W^} 6VqJTLxo7RUZni~@5_r=YyE6'|^s>XW-u+8 \];m؏\m;6ҺL-=,[ tc;=g>|lg#"3,}C]0q@v?@a)!7yi**Jq.B8pˢ.<&:YͧZaX 'yCDPrhY[b&xRLHuw[vLU]ONkLu '1Hg=:&VL…=.DvyF[& D@k,J:;@VZe F,BJ菫K ^ûk/l?*P>B[N&$K8Dߜ~[9^0`<7-|Lj8j`ݩ:,ug?~tvQ{1hU4w;4BąO6s IXϹxJ*/ dm~~/f Wiu 7_TL$.~oŽڏ6Z&ME]2.x=mi{~ *66^jۖӨ xm]xoM;DiuG w2+;b tV>B[NU9ۏp#"3"t| Hz#ϛuiV(#;C4efo=pFm7%%кi;$FsY hډ7*'$⏴M8:I^j鋈[c(Jp?aM"GJPR4PU4h=:m(} nD^qq 5s!C[G ij<hú%P ^ Tf`B b)A>r~}ۧoq`?{ޅ~lé`7Bl x}g9rl޲F&ck>RiܰwN%$;=>tȃ֮c/&fk&V뎍mFIr7;<, St=c8a &o2GDDDg۸O打{=Pնcڷfo5kk78-EQ۞;Ye/ʩ- ب7\^^1P*0 h@9($ 0xD] Dt-lkTYj~lVZRlw܅|c'FBe ͡|֖]'Է㯮j߶NeϨUH?$sM@ KD$c͆]eWc4Khk>77q nrZہbƟ5i,xOM/@6k4`X+XY,oFD -%ph }دv/B]Øl<_5*f Fն,'ќeP(QS]A5,mjhQA1(e:u_5AlSXl&ګQmL9 ՕP)<DtΉ¾ݻ1x0FѤ}P٬7hqXTRcOZbyAnn5yPNXo vjbNRw޲I56Xp?vڴ̬LQyE@DD_Z䞽ش1BO{Il0ThZsm9XR|[vod@6A8z2g $4:6vNjmѾwJK]SYaͣl@ +<a9 Gذn-Y(DDDD͐$պ[lw'SiqGgXGt}% @!$s1@Bb냈Ε6`냈\`u] ua ua ua ua ua ua ua ua ua ua ua ua ua k%ӷ~[ , ST_WY۰a/1w]~m~_+`qieΗ!""" Q.fnŎ*GnEv{Hɯ:v:՜ǥ 6m|}̥/Xs 7H 8[HzØ7~0;+ĮQW:|MDDDA$s+nE-17K (;ɶњ}x:XWUKS}&.®3kf/GYߛ0 m-׿ED#6-O܃-@xf b9)*0-œ,F=Uݧ~2һ:2y~-3Y[ LΨϨb4O>ls\֕z.P! 7p#.K /h2_"Jz'?.i*&%cf`ӯdl,yI^x,YgqY gޏ׏^W߸ӈy_+{މXA.77HfeM?g(75S[,cI?oـ_1pśanϙnOϋqCQAu&0sm&L{ ˱Ok:^Ub/õq}B?`{* -Ԋ2wRK!ITCU:!,wql^4so߃V֟Ϊc.cXE}T"3m >;09V#585H^v ]=߾"y 7ƻw>x 1c,;+ >.ķ}hcoՈo)nBò}8PA(jtM=I/fMH4>~b,>z]r!D^0Mέdtr>T;bFa H:b?7WDz+mN\HDDD Q3;^s!xPy!Wo$vw.|/ QQa'PcLAj ycq8F\8 )Zx־ aJ%#G>cki0ɶX=?YcC5Hڎku3s|璽qxmxڒveYiǽż(sWt}1OrKn9MɝO:Rп$`k>ˀNO3:f?9\ZSO{jj,a]l2M_f,\Iq`uJ0?[܆'ՠ9H! oy p\04qOR\|?5G혀) oR*@#h|)MA:VIk}uNjEx6Wǹ>l-M`DO0X za0|NXvυDDDD 9'L}Bt77c cŸҋ0I,U (3^KKeյ۸_-Z}9ŨQx@mԉ"i,Hq %ݏ>j"= +bpvu-. Jo!oQFi|6~CQUg #04- {zPhtx}kY&_ J 頻AJ7nߏ`xk6OFW+EkfOچT %-#vWi0e-j9o-̦6U:TBa-ί'~@E;`VYZ f uTʵ#k`4ƆE }.+dⷧ4d4̋3:TRBق_}Av 5R5֝[Qm m&:C|S:hr'4-\/_jz)=_kT=P' @}i NBwԏ~6#moT~ւ_q201e>c{~[ .DMJF΀[EP7~HNm][U< P[sΎs٥oO3[u6< ?`*-I`@":7Udbng=ShC֤Q1 ;pN^}#)B`Y%P;bO>9x,]|Ft\7~|?x[1  =&:~|I]޲\{AS95Woip7S&C0ppq>{A=\_6I tNgY\_hC}UiDbckaA./m4IW?L8 1"!wwbEt<=+c!5 9?ciǥ#; #!x$a<'8n ġ!MoԣK#vG,&?_l>f\ڪm+Rf+oc/\>ǡ*oogk]0*KjOOsǹ*v –ˈd0HD%x% _ `âeh=Ez MODu/M ޙooGx `̕xxJ >Y%^[acJ0-8$8vbRny|+?ǛK7C"glY6 o(wR+$C"u \еy3j5U [6Wح7OSgu>W\_نXK.?R 4{4ӣ4M?Yv;x kng8Wl7S/]ϝ@3Tcco)jD]2K?Gz m.AQrL5!x|EMz $?80! V㯣z$&8M߼90=Ztue0ge/cէ E^Z,#"""ODtwPw%8<ֻᡂmR!Cnre%kXDDcx?Se!}:>5^_k=O˟oG8[LދO}.xN5akW_Qb͝l˯F{Z;6 OjܒpxHUfӸNwں:(rB52ҲU-//ꑻ7,_s?Vc#(6tRRP( :u7n4LI1,]NѩC1h0IQ-tҾtW+Π@Uu˯LDDDtVc@":gA=eJ.,K_cgp\;} D?C/xțRF`c/a9VF1= AhUN^"Lz#Ԟ^QB; 0hdO 1F!aFQt s%9}G4!i=;F 9Kَ%1wpi2!S@x?SCc>u>-W&S/i VauH,-}LL|ߋ{ G'Wg['YnO{ʄeovAz D-=w̵xfNJo!6-9w F!rꭸ4^hFڻހn]xWwx@)W"|}o?g(7 +NDO˨3aJe{9rn%{.LؾxfU.?.i*&}I:g AnFo)mԖ_?T*`X9 YIJk'@d,H{ވmG7ckzj1+!ZWa~~.\'dJֲX dR klK^[K 3vpbTJ1dT2ӭ;؈ 0$ZJ}}zK{Z?ނ5Y50Z[>k)w_u=x-5ejͣkںތ2T̵eh}[$":@o4;WmG~`k\c,U8+%Q Vpf<Eyl{s&ۃmK5|z^´,]w8<<&r?G@w: {y3a´0п;_6 3E?O' ƽ8TaA7 vf@PY#CL957OX-Ɯ7D\9}nLۇks|~0*_|c5@H/h9K1>+;;DZyќ:5sjV f)޷;{( 87y$R&?IQs"{l^ R Djm6{&^a~PD/wSFC-HPێIgÁa: N>6+QJDF4ArRi[ܤj}Q\cAUb9Jۮ(,Bgm̕8`>qrTiZ_>Tn;(< Z].ꓺY!&JĪ Qjce0GKKQYPx%W%B޾Wc& 2]t\h1}Vi{TKݶ{ߚMDDD QJEFz =ozm G.KC0mC3="S[했uر8#.f ik_݅0%E-#׎΋±5ʴ|ys CTT]X=?Y{{16=8T~}?Wa;JHPrx+ \`ˁnNl=r5Xe@߸s%חmTvRSc!xK\Z|Mz wK'`x;gQzMArP?֖{EBۗ 2^J8tLW[w_٥&5c*{ٞxkP'VBt*y{5O7>N#2Rڮ"6䵜%x{!2K^^=a)#f`?7I|"j E]l[y*\ yAŚp`!@$}!4x}Be7 ؋"BT0@/+G%b=@hx*P^uǐ[nFoiR/\uYlu)P*z}ݫPhOO7DDNtF@D>6o?1<~mta*-e( JJoK/U}u5"o|hFAN48 M&|t?nQ*I i? },sJCZq rd[jh EU`*a @zq$`Jő,[Q";ݥ4V5ٖn0$v`\ʮ='"""j )@F G_QpÐqcx+.UŰf{OPYt!i6.hZ] Řqq,ltyU,Z|~6\>wpjlQ"uH(]}.oXQ;CÜQ(fQd WMձwT#G>㕄rTC[w6!>kBpV4([V^,maѧ/4@ֶm̈́z]%^;pB cDWi:uڛ_Z]VʣMZ/;Ct8u ku+B"Un!)dSر32mo\aYJ?#h  ~ő" W }$z1*gQڈ^ wMr]<@MACu`„8rL@_'#tHŵ!pkWwdwTD+1kn;BI*<:IT]0ۆØePE&"H~1mo0>Gʳ7zwaQ :(puQz%D!@։*xJ;. &(Vb6&-0Ά@_ȫ45XM<8Uzޘ EE(#[qy#AHPaŪX b"~|?x[1  =&^`n:#Ǽ0ZkTP g`ܝQhW 7}/޴G"1Pı LM~&]濅GV;պL?%7>{6d@g0b#zx3v pTJ'#Tp8QC: P*ct ;LxzMš[al>G;j{JS+t`3v+->dT'itPWuV)!*H߂}$z ϲBOpGgj;P{=#Qq|?Uj+cPN_֏ 6; GհX,P(Z7dҺl@f+?:jLpto GpW'n(PSحm*#?^~7oO)'k+l]4ybv)b0٘6HaHY<o.1[罊 >/MFB08̛UyAp~wmc"mou9Z Lᆞy"1C; .~/WqS11ޭ}N uWh =DwV'rОl B@HuۍYi~H `9 @XB,wa앀d=vg,[_% na<)cZ$"ԧOL4<%2>u-uijl O-bo)]Z'E~ i})Ccnٿfq(5yt!AiDm8 o ]@Uim\?Zl@n==Cb4"<<8I_eAeת2HDDDhZ";Ppx(W}!_e%kXUkOBR.ro4@ACa2Yg:cx?SCsќl띧==lP^Vj '%%,XW&A#0"J1˔*kW_$,9jc˯F{Z;6 Oj|tx]ˀ!OL!:B!@r\#Mㆸ l@mJd;& :Dm sNBR!.!b6 {ڟ;6,S55n>Eq  Zs9M$DDDDDԱvQ(*,d{9hC5{Ȱaoޗ%HDDDDDmsat{.mm kcܖ7,T6`N yd"* vZD'WGQ7Nm=bO@""""WڍMFJkoM^ճy.rSN>QPٳghq}F%w P$8c3b`[u0`ghY15996.CGBDDDDDmmnZǶ n #d葃w.ekU9Y%1>AhDOS [ 'ٽEs__(} ='ý32g)ÁMwؕ[y ׳Dy@8i/ ,S,ژ 9x+xyF<*D< Ʋd4h@8kx86@8 I^#-'Z~A6HGq >rȺyAaק1g';: )'-@tht6u%!:!nW*3nzg_<O@/Dpǵ'#0<AP)a8o+Q䙘ֶe fјt:(j?;[cAtpb3 #""""[l[qÏp=w#..pru`MUu:I׌ޠE@Q@˖]Ig%锳n&#,Fu۵qNu{ _!\ >}_o0N(/e rMqqgC!Ϣ6t{g؃?$7./]Pyh6'*־\Q7 =_I7\^>'5_fWxq >>i Zw; }|l=f%;Oxs6oĎ ӧ_dF=j-'?#c?qX5n|~YqG?cIg}zp{}qRs^WXW 1iU\8eJDDDDh322#((}9M9\(m{VJlP~t LQ_ ~0[8ibnHO?Xus M+l/1u daތ'9;4X7ryeKUصz2`r A+n=a^ػ6o)o)|d1=kAβw;qBrh)kr8}sg`\}gRպbl_< ݊*@4,re뷣g@\1u'zoW"lC)S*/\vÍ,p[CfܟR_?UZDjՖn]idؤx?XM gaȭQ+fz+.ס#g-oMn!J,"'_w􅇹 v`<֭)WzFt'{k14MJGWˆ[ӹx5}r8~x̩8w>bM{/Z%R6liSaQFd.y `C#\qJ,wd=͕m;23Uve&QWCxP||~=|tժSrj˔||+*#>#?0s_ v$]ONtYD&BcP޼ ˎU5{$[tOʭuF@Uۑ;KJGIԵxhB:=oGkQy>[b(bDh]g ` ﺠVG ii' } x`؍`J4pt|%VkpEs0/=s(K%2H^Xhyع|>fx/ɱi {rCӓmekRsh5>PV"o^̵A0) /ǎ?ׯB{ϳBcc/ FzŠGr2Ҷ @jxzw,=xzlc|lrk^p>?"Tމg1%i]/ה״qitZڅ?gҗpJ J//χ/*᎑N>pqǫ?auj!FI J93 MӘg-g- Oedh T}b A} ˔qݻou|GʹIAhhp#MJF##xECo Zlݵ[܂|\{(@(|/lA'yU%L5=<1}ϻc/9}ô-LAjo]"appRXE ik_݅0%EmcplͿ2-AuCcp'F+bv,\oEw׸k@-G w`mOT lz-gз[yja asXp.?*mnuZr>kj!(Iy\Uӟu,blz;qtܭPbYbTỳJX_,_vjӶq˔xϮL!.ھ}{ƌoMM5w$xECll1m}'P*1_~0n7LJhFuyN D>6o|?i[eyb'NFҤ]Feh -ZJ/@i_ʟgX!(BJ&˙q;K'yȎ8|.u;K瞥]ZC:Xbhq2o-j [:G9Rë+`Oe#l*#@ћf]VʋnhX|^:g2@ʩ&#=F􉘙kƧ;95mYBr-~GAWdИu~$h=>ÍI.{wWQ7W 6+0qى2:2,nG~6J ޺n7סl'LhE$glIջ6&‚77 u gsCN[}g2v\]cv:sVgkcߣ1r18uJDDDD ;oﵺJY D=&]v:;m}>}:$={[J 7 Qq'g"b>s}rN9'3?x,>.l* tj%0Y;Ԃ2o6_?ԫquxi?VVCyMs?V Y7[*C_{vz dMϠ#%瞍KKpvDܮ5n5X~@:0_v\ ίqyK抏- %Grt5*UDDDD4kZv߿vOnWu "ho>acf۷->EEq?tO !8azQ<%^١д7=n6%*Hh)ى!i^xqx|x>rv+_^{XP^[kQpd_4IRϽ_{[?*0i"mO<(Q7bW+Y}(^cN:|eeCk~lo[(NA*tWViv(q')]1S""""6Bt~‹ͺk9DPWyo2]28wJ*#MM0 c~%pemXߑ3gZWFn|!J>-wPX,b;TZ.?X0{[ɘ|}:Oo`8r<) Ajrw>_^>Y:@]I `}f$}'n?W=N=b;; *\'v|?/ <%3.5:-Zt>]CRVu{xgK%)~9L6Wo^gA|f v]ފ̹9^VuAn)|{&'%ᚫo`⊟\䤞u+EAZ~ 'n7-$Ơ P:5LtY?i}&{B雱(UbϫOb_^B0;> zrĜxλjxr0%pxs ; Hkdυ"""":t1qexqUW!%5ųLw\A:>hN;cѨ̳u<_rV+:L:U_aљr `-tO`69CPbҲaB`21!JHpu<]uGDDDD4*~}~~VZ{?B쮅=P:.7fD4Q0l3Tމp!J]{Ut+#9F~ opQF *قwHM шXD4!/>DowO˾k?'""""F닮^8as.uݪGx,!H&KASs#Aƾ3.@+vo"K0/66nǕ`OTBW{^%S3](zJ4 h‰OĞ;1{<8N@O\~V4] oKDDDDtQwî}hUPV"0$ '#3 k׬oANdE~2D_lHDDDDt$|z[ pHKd%@"pTj5x njtvvR1@)iHmyF M 2&y&""""""@Q@""""""""(1$"""""""" ` @""""""""(1$"""""""" ` @""""""""(1$"""""""" ` @""""""""(1$"""""""" `VMT QtJVJfq MHJX סn!`tL,N:y!,!VJTױ%Ǹ|Sa]C% t`OHą_6l>% \}:o¦ܻu9:[Pqvϓğ%By&!˲eRG >{yX_6 Zk~>yuuT 9HOǎD4!)^C]?ɯ.jyyu!b A,'/;`3Áoފ~,؏N AC\Ӳ>^ x/v %<׶b-8#Z}bbeҌ9NU-MXJP8vP~bY>W=vjBȼ_98 x4}?ф`DD/`"p•Fy_uظ%,bl*'\!Pq;ƪ+ӠscKOJQT٧XZGc99Vڈw~ʖ sHo9PxWB<ϸ7^<>8ߺW> }YU#~fL3kt[G]wQբlL9q&ιZe[O{CeasK/Ïr,Fl~yv4(4Mrp+M^mU_z7{xx6wHӸ%c<\w>sX݄enQ>H~z M@ǎ&3tO ߊAlBktw сݯOĒkasxїϐo[Ob*v)"rI& mZaN ܖd@w{[Olhj!g_.AIB]Ǟe F"ݎNҦ2(b;I6G<)0[qePj|A.OcE4aӊeXW1È8P ʲ7`/?TL7lCUlXNHI!PS.y7KׅDA9DU8Wֿ0qn(~Aǎ&,ZuL3m0a)J ަtRV,ߏf5bmo}6O k=1&a]"`qXp<~w?7 Ƥ|No~/ je^EbhξkZ:Ƴ=LޤXKG˷fҽ?y1MٟGCCJ13׌OwAsk5ڲ #8둝?nΚ(wZ?#y#Oǎ& *hWV/@`os+A$Dm_㓏?};t$ ̺oޕC7Xb=?Gs]XAZ%wjynqC݈ہpYBB㼅xՅ8=7:lɧfwl3&ј9;؆ӂ!U{ʈ0#P}- DS|+,HEUE";^_2~dpRj (xV{ &K2,Y7MG(q ;Y*V*Cq5yCoүfuԫ ?g6.YF_u.n } ]X7u87_C/TZe]r/47?x wk4C?.*m+4>l_KsCoү]q%]CO2H9qn,{p㷞lZD$G48>R,3r숈A$D8BgRRϤZIZaMR:gNG";wʰ!Yz̘5.x{yX_QKs[G~. i|l(|xS`e$l2؃!\T(DcE4aӊeXW1؉ݯOĒkasxїϐo'$;}Ӆ߄K3ll)ҏ_ *r}6,b'$eBq+4]H e R!])+~Î[f+V3lA޴|LʙOmތYsb-A,Ϥ_NgY5O1i<7&HcW<JymO…\)h#cu!6.Q&gFԺ˿A셏Ƴ0yba/-߆ Kײ<̘YrߏFJo{_!jPYlw{=ٔ4 'LUѵάPkv;Jm) X~ >5ըEϗVÏ^w|  tXxpVϮzՄys2{y4x2s i\pAˊYya6y9,ߺٰ HNkMF(>GCBr-~'zz(:kv L!SUh>DKVc+ AAP(//C ]^Yflq^̍[rvvDDDDDDtT0Z $xc)Aڬũ}hy n8!;mT+4NGpf^*aecBO<$&`T#,p]uMK2ah+ħ/ pW$7}gJ/a鬒Xpqbu8It!QPwVh]M.4.hY;jAh<0L+mD&b/B@ lK(^7 f`إxhNL]'e0eFdž҅th2ep l>-k~BOQg!z }Crs V?;ʎڏM[$^r~zwXPjv{jEbbb OOv0qADžgDwK0YayU4κi:[k>[G>~Q]s#x|jL3p0<ޣxfBހ٘/m89-RU)Zs5)]FP6:6PKJuۥ}kKp4!Q[%?T GWzC]$+fO7;vhxF`@%NKxp` K3uL㎐W/݀:I~٧d]ֈ򲿲>_јsu.$F qcsx{X<Ԙ22WG2 #/Jg0ٿV2Tʯ.};K9Uoʬȿ W,hS+wM. &u?tKDDDDDDbH=ov6!;iiq_^> >Dn'p̐1вx|4/Gb&]'߸`#(uJ(TUDzf_ϩv7W`ӎ61Khӕ^xy-pd&YwKGiDDDDDD4<D41_4Zƣp.$y~Dݘ6cDq@t6~'p|Ĩ> χ(u+`??|O?S"؋Jn{nGiDDDDDDg`VMDJ`kX""~j̙Ҡt\ذ[# {{ p߽&37p@ KR>ο ,3QJ//y}}X-0'QpnGiDDDDDD4G6ޏiQKI̭4O体KO=47}Ú@_Rjgx<:;;PSU½F<hV <AD%q?+WgkřK;I^393)b>rqg⽺'$ MR#sR.bq p=V̛`K?"""""":.1$ O 'NJ%xF$πJ+ADDDDDDtbHDow%sYDDDDDDXxu""""""""(1$"""""""" ` @""""""""(1$"""""""" ` @""""""""(1$"""""""" ` @""""""""(1$"""""""" ` @""""""""(1$"""""""" `V "\.'$ JF|%"""""":1$ a uV.HFsp0#l@ӏ‹ڻ ul&o-9x`tIH5Ѯ{Pk;K5B"4d !T a\͍Ũѧ"5B7FDDDD41$ n 4bEBb"jK@Y)BBBJ=v@r H#zKp(*)Ʊ]rQ#__spk6,uK&؎}խp>cn==lExȏ7n[#(Bq*Wdo','MC фtq`lN$$@% !!VX,TWV` 6w+'9)bcGlFMhM_cٺh)܄uO0:ZZɳ$!ś:Q iݞW~l߰0''m-چVIS2Fہ((<6)SO'Aը9ajMF\ze ,-Ikg"x蘘?_Btl,?[@{y$-bYDCLĄpp4C ĆQ֨Elz4]lFUF] m7hݷ[K1al*-e/ucFXNI3,ۆfDrJmQNE60$'~"""""[ф Ԁ GY&ʃHϜ4|+@WJtš3ףi3b0{O-Wӌvd`ERv.ºZ_LNm[ZR1l{vKDk*+̅گv6V5.AܹuF5E(:Pmp,&OA>~CWDgM%:tQlQM?wZOTo+M+VW$L2=? &YfXD Ԋ "B,WcTjUŌ hBRFUsA&TWJ%x!{M jqaQն$4B[]llM ݎ(HWBnBA= ʶ$Z; ɁY=P=> Qm`ÒF6ctLV37asi mw@ۯnE(RqB~\h*\- ZAѦ瞄>䙘ǡ&H UGV#X(A;3,N7BdjM#סSZ~lUido$иg- Bꔹ;P_{7|D+ok};s&=ES%sb[g hvm !1F%lp3t 4kDM Q@kTk0;~iTpX4E:쐬FBDDDDD4!)n7TjF 1\`U͇U#@XZhE\O:9VHD_ͷ(+CҌhhGmhBm#!݂V\/ &Y=e@l/!#,Ö FTmvHJAIY;L`JZ_;QY:oBA׳@195س033* `)[qu:urT:BtyZg 8NdazBAkWaGؔHޟdGͪ=8BD@M&<\2*J;cug'o'(n&*QPFp4Xy MA4XAhhSHaHDDDDD4!)J5 E rh3!~ZWا"12fal`Dkq6w42DB`O-a~ "2",T} DtTޒChj-h 姅J}ŎzzD zY{f쒂Va pj n7E#8Pe:BsXXL=!ͻP,5)]++q MHJVkvhkveuJz8Rh-Md(3ώ `"bRBFiXce“"vXaGϰSY Z-[K!$LVІ-[Pt`ȠQKAرsm-[ 86'D:u Y#JKP1+oI~;:U:=XPC-?UiA SmwG\PTgDPtn=,)գS ٓxPV#""""#&"Alsl[,!:Wʫ0œ'bn4o&RL.Ԗ1ӕQaPCWpu E!RӈP]݉Xyw up8 ^ %3V C040 v4wbLis"V }(]؁eüeA%n-ۯ}I)29bfePBzw23aՅJAUu9JJX/;vIhArw_O%;bBg20$""""[|hbEU!M&tUZu!5# 8xDߏZ } uPE|W#@{UJ $ڋ}Oue luQfBY#? +ގшiAjC]ZW;E͌o7~0Za@)ʊˡ@']FZv)68M11,gLĔذ~'[1;羈. iIFl,ڄ[$TAI S2"*ڈ}ص/q!:Hͽ FT(k2,Flu:ukF@BE`6@mrk $裐oM.d!ADÌPh(r9`7B*C ?ڊd3*b)6T쪄ۚ$ej0{`;S>b& *Vl%hY=#M hqf3$""""30&" lkjh5,lP_`SS#Bd4v RɆ:'!2T0$\UK>*+ނR!o!Qe[ɡm3`_ ĘHs-UaFoM}H,f")D=Ⱥ31=ǎ%;"K5j.a91]e۱X^FmBtn8M|B315k 4Dd}Wk< PXs)vD#<@QY܎bn=z vnoiEL?>u ԆI&Tb{tdMY\r`>(OOy߇8 _e)m۰p*jyȟt]AQQ,٧ scD5,ӑu+6~L`Ys(BFDDDD'Ax q{ gRy>iN'IiZaMRQZVWFz*7X"v:` ClB߈7܊oCQ o -3w#v ϮcRN@U(NǂЏǓU]߬CcɘQY+,:\.H(^|Vs9N6E{waH"""""  1Ѐ${W4zJuס!k:KHDC]+@"ch4y7T>򘤴i>?+u[ouS [1ruԇ]'|4G\l uĒ⋈ /k]t-s{Fv&""""@&$Ӂo#&1Rs-56mî}<9$1s*T@sbRw6eTҪ7C\hol.on[/mx0)ݺ~^] i]e޲~-҃@ӷoއ>taeY8`i¹*h2iB[B΅={d”(y/P+]D9W_C_ MHn7T]NH{_J$nϲNQg?/"GZlTK0<QԒ7-7.j=Q=\ݴl;Q;p>u1D`-hR,*u2)Qxctx 0U HDJ~;ch UnNo# %Zߢ+*7GiƙM]ܝy%p&XTmUcOpd'_7Gz{ꅳ1kqhpR[1C)3/E|L ~qM| 6P@a*_/O FmAox|oVWRq,)!Q׿3bj?ȟx č AچvwFQocϯXq6>]nTQT*4֏ .֏EES!Oa@/.hܖl @1a4TsaԵJ/y7FZ*ivKgoO9 T'B(-yy*JXZx?yrHOOǨ#V+9F2x 0U "GLPū(pբ6En,n➷leIREct=1'q%z99,9酪"u 5_`U%ukw`rsozB9eOm[|º+,&~3y1m&/'R2Ըa劥ֳ7 n7oBSa#,-kzδvl1:Ih\iY-zyVr#_MVjpuT_Hf5S//oxJKiōgzZq{yf5oz|n_M7S7 h4Q I=-DDDDDT0HD$tQa\\yhOsȡ&'QQ͓~n*SMj >aYDDDDDTa0HDtԫ;۶Qdcq(r+׊*G9}GwAEYDDDDDTa0HDt(U* gN#;;RNȁXOOvk"""""P$" %70-DDDDDDDg&""""""""$""""""""$""""""""$""""""""$""""""""$""""""""$""""""""$""""""""$""""""""$""""""""$""""""""$""""""""$""""""""$""""""""$""""""""$"""""""",rԩgXDDDDDDDDwa-Z`!UXT&$0    9@""""""";0< $"""""""0Hc 9@""""""";0< $"""""""0Hc 9@""""""";0< $"""""""0HcΣdU\ U` U`| [I8~9ϧ4@X5ODA`oԭ O7 I?">955Qw*P(HI!j2IB|J.FuXhDDDDDDDD-T7AO#zGUFXU%Aqudfg![*X >Yr z޿1'6/Ŝbe˃l XxۓeiQaD>~;>,czxL3+>nW+9<Ljaʍcsh ~^r00ӠQP/ïҲ8}% )ڸ2zun7 4¿+>:c~-(<P(p ώk>u 2E1ϋb%[ɘӇ7C\AC"A\*3N<ԃo#ʫ::Xg3adqxžFK=qf :z+mqXgyg" wj4 ͍i`?Uyrgi/m{3}t1fo^sЇ@*.'f㯽_ZF.%#4Cah0«} h[m#C3$iиKӴ|/ⷸ9z}: n#9@f,ߟ H1=Bҁn}G+xA1KDP:^u~{#et8eREHߟG^BmG>8-/Rm kh(ݠ(U E>Cǧfp;!,EJ5`ɉ '/(ޭ@.ºWkA(q /0늃k*ED""wh¸EJ{Y<[IPۊ桸97W}]| vBshZ IiYHE74 Z/d+c*r`X&#,бq5gqߴV2]a雟LW'±i_|3ޖTc,v2 68^>9_'A@^:b3>*7yۮ~o?dt\M3G5V= _/ߙ\tK3@)C^1j ~֣c{F~3$GǼe0AGrZՔ>4k==̯umy`R뼉O07-eVB_ciδmW}AH0wJwr4s;7aߌh^U~s6`3Vȧ7r>uY\Ko6ngعQ]~]U\kv]G]Һv筽: d//tA7v|;:O% p(p(i{_ἕEOqmv,?WWv߷» ֑\F_X_BYu<@CZG i!-PZECGQFޚ{Xt^1m1}>qb.b3D$exӒi=1b?OgN_wYڌs}o7RE^^&#nдEb͚EoWhIkgi1|BK;ח&?O\F,VD?UŎz ?x_Hr7åtv{_,\F\xFwXd:^\0E3C^tŌhq5&2o7_e!g]}`yCx?G/'^M<=vJ`"jyU,c^SΊE}vF Ճ!nhz0G\N++QrHn!&UD@5a9>j"vg6e?Ңtjzo96e祾xt͏N*_mIӴ_D;Ҷ-m.`bCԵa,Xs.jrӽ$o!q]^3lH6s;t_,kk rg_)ߑ⭽zRTe5 Ń>}"T)"9V,ޘIܲHL#уBr" 78qb뢅G%s~p]XwD=M5l6e=7Yžq5[2 ?(ؓUd--!4h&8gIX]#T,s9[d9ViEb b)|nFG&\B\SDUVKֹxSԑ~[W*t3m'MeO{%/a/-{Maq.U_d6gė-́*m<;B!7C$\:/fG\N1g.kԥluʷirjE9QpI{|KˎlST@2v1 R|;]w|f9s:OsEG%DғMz#f͸*ON~8=Cyp؅am:Z%n"G{ 4=ڸK-ob@..\x 0V Zx0;p..ٹ:([ h_p5 ۠VVJ? $%{~hљ96.zF]guѫkUho玔}.rеgX3^Cf5PM_G|zEq4C(Rq%-1y, l;D#j6my ->|Syo4}[ 8[>@1[ɫKN&:~Md%Dy]²Pͭ G״" )Fdr7 T] JJ1S"MΔڶmRmcw"ծ{oHzTWd̵iP \۱|Eˇ ց;{E9 ZOvPb܍&T_m'(δU nZ/P:e㑐mڭH_32L}:}|V1K*ft#ż=J=a3u,M9_nQ/ҴOGJoi>BN6s]Z6<;ni/ЌK?^ࢾVt|%ȏ[݉S""gp.\˄ :>`6 }+|iTh\;=L8}95.0O_yHT>*( Wu \d(R2/=AjM.{S|2KCJ*La4[=M:`~ O ޡx*hV^Cq / +a6fȒδ5C~Vզg р$y qOh-{e0z=Ggbm\_9>CPM}3m$! Ҡ :z+z>Cl=M܆ɭQٙ$u糨}:?E~n F}>R4:PwH{<$UHh3&O{܁[U&eX/%=Sm.i~\Ʀg5-t[UPC3BT'llw w]DRYgr9:iEo4o|4j4*i$N/}ޚfQ3ki} iamtܚtB>GG DuwB=S'a"HIʆu3y{.]NCmmWv|[y4ؕMhZOXF;{n48@xd$"UQi |Vo#99N9xep-¨ ]߷y6$BQv'ޗs;f4_֣*][-v ܡ++a1~)l~>}&9ȧu&23a.|s$%̟~m}qI?SL*\SxgDjb_nqq p$IIL[uδMGDu"}ؔNkRaDD% 'jUBLW cq-9 ZnJ4 @!{*iFm~Y/ VkunIڕUaux#<%p`kxt=s!t)>>iE-P'k;A<ޡ4)p(m0|O'Bw"Δb";ƍ~o<Z5ÔbXJ wZ[}\S~z㵇b`E14wS n`ThHluD|.$fPhTx|Xr<臯n^oi:c1uٞL>l,@}GH->9Z2?6Rov^6Łȱ>R|;Tw~f9s iqbn:g_1%y*g#iϛkN( 9nɎַ.=^ Q!Gi 3'RB>@~hUPQ(-A"螷HmekY$| Ez4]#g!*?w*XN]ò-ҰM9r.i85+3PJTKFH yN~X6,H{o5j9w̗!b_nU,C!Fw5NWgZ];O0EPg7iJcCH]px-1+j Rh jM^Ɔ}1g ױ_|*|8bQ`ʅQ=cωԘ&2=p^aP*L@yw7iҏL-URZ!vL‚*v %b9g{5~Q$eQ m᫥q%!Aӟ{ FGFBàl _ewh P+ظ^bLtư$X{ʒ b_*rAh8kgg`ȁѨPX7#9=|B#ǥAPE $Q! RѽEM$ThT׌^ZtzR  ? UbӾxw$  R!OX,*i"h'աa9Ną*HDDDDDDDT\* ~0pxHj l@ozK7GV)P";A%n\k{zjTU#jekܐkYHAznGnm" C z=\nt1+⿘lۛޖtCm  |jT!|3[uqX;~DLp jvdX]I||ձJhViB^/B_x?P>l2aߌh^\> p y2w 9R GwEyYAH0wJwr4)'5}r\˼r̈_"?:_V36gn3v,N S^Ўbbڮ>ޖxFQtKխvilk[g(mT L*t`.7Fz)~VMe!XDmhD>{4iwEi< 6ny{c<g~VV!Bw ~Һtl3}<4m>^;6nN#1$`U8S=R! Dzc]!1>{EQ=kx9}"桸}ziҕ=RxaK0ڨ.WVҊS#5imR׈!{DZ+ۿu!!2cy==M4^|I!v訄hUYfnB4|̔/adcjAx_&jY\:J[Q"""""{VX* z䈜,!]fx]\/+.Ąkuu{:>r]d\{X*K\@пg-TnB՚O'Dߟ0~vGL_߯75 C72"`xF!GqBC#!PYnA}+W2 }.rеgFgk96.z־ν.zu -8ss:J8Wty ]R1s].V䭕"x$d[nPGH0j85oVUPuħg*+tۼTISV6s% uGњ,suYeKDDDDDJ JeZJ^4jя?u6")#zF- OOO6nnnh4o5J:.0R(O[?o- ѓ[m.{Q27F][v; `mP]<*G霓mќn'-f.JY@Gh}`;q\snBm%"""""2]sw^^^\?y4~}ѯϽy 4*.VoAǑ:gjӕ{~1]4*icP2P%UԮ;ƭv]->< F܍j8`9ŔSJe2j~jo 6|纇#eNo)h$: ML:UeC|[lk KY/[C!gG!rI@ʛ?G|M7­QSĄkD{(D)IbD@@t₮O.Jй1´i%D*~7rzKMv$D$ JnN4O'Ocz/b_)˻ ڈ9qYMnaoTy5:i #O=h ^93j+kO5*8cY'whf9Qn\"_@`߬'{K^pSDS;?*ED""y~k0Ƭo݀?3MWaڣTTxSp8RƫX߼δ(QF3z,9Q_ CKiN QdŻ4t= WkA(q /0 /Jv¸wZz+/>m!)n|gR YDE k wAlOνg~,)1N@WڄhGbܟ1.w%DoE1nX;KTCyYP ;ĄI1з|7<@D,;*kS{b;0CGlŬa5],P`hb0#ӆc14t{f?4T$$*˾g3"*_˳Le<P$ݰ 2vNɿm%/i1lid[^4K@nysYt(>ޖtm  |jT!|3ټ^Gw@ 7$E7q0m\}Lja8qc|_4Qr}z!UGЗE92ڢX6X>[8l-U`kR}8'}c0 Ė+FPŒرs|^`A}oWBQmkeu1㱨ӗ\5Dw,&b X=:-ƌ]GcɚQ/4 vd:]f"_b۬uG2Ty~!مǣT\ty^ZzszHyH;#h"Y>]֮ f>]#׉Q檴9ʮ]/9mLYgVF[B}1{-Q霳G:O9b8GWhz?Zi\S?r{y z `/_G)6;;5&bͳ]7q4y>VZI}#\Q ״[""2'k x#> lS˿`C%+彷%HZjHK4(ii%-ſ1A,h8~-^&ZψݭAOo˹'?N5/x3""˲cEMǶdCyE?kQ~k+sD'RINZ!z)Eob)2l<[tP)DYLB>dHvc_zBL]O9u!!2Hk'dUy$o!qn,b7ߨhQmǔ#bR=!DZb߸՘!~"P e'ˁvySYj^ŚC+C:Rfy|zaXPX%D!^ؒ*n*M*><)r-/垞&WN/9sa"'I!{/׌ΥV>]R#։mÉ檴Oqeh_r\mmoD xĹ/*Z xؖi<-,a- "&ب#;;5M>z_61*Dn*ʳp^KnVX* zԧ戜l)22EzjHJ.]qW.+.Ąkuu{:>r]d\{X*K\@пg@(>5ؗlDYXx=~=vr`-N)_J-4 !Hŕ=r: 2|[SB\(r{H3ZoMOvPb܍&1m/ֶēj@_8CU7ž9oNّvO0yurE㐶z wf̢пY TqS@rr@`طc,W=/@w;b *  ٖUCc>#!u,v0<c7Ƃ:f[DŽ.ѹ.ڎ|\CiqA[9Gtֳ6ܭF-Z[p>ǹ4gN{%Gl׉檴qV~n)gΝgBz9ع02ױ}i &am\- XWjѮlkpostlY1;pΝ{^svKDāZDJhJςcq K"xoGZ/=֩K1ce[yбZBJ*o<ދGZ-DZhH"OJ#tϔ|'bǏki U8\whv|Y8r-{k9w< 77/oا8m,o#jعxfmg`̮H]^}=Z-k:|1g. <"ЦgЀ$iOh\)p>- DaN`~*ei$DczےW^x'zw]#[ۻS(6k=r NZm峌[~FZKr>ko.k/ޝlݙ>ܒRQLM>PIkpn?!ÆadD,=p:x p]eoӕt4=H^HI./Rb('32 0 s9P*91HTj [@g0˽!TR7=V}5~ژ}z}}=cOj=<!*WcWwم~^_@^ ^j#[^;%fB+>y4mslH?g>OL=zW908 t Y }9FGlC"ۢǭmǎYx'%lhw | cx8#Ӊ 0mvS\ٕLK/֝=-k+tC#P?~vCz}X; ?>!uQ=q}L)nڊ#3"5WSvqy||$"WiP(7+{_ތ* IB#YD6x7È޾"*1cE0}>Q;OG1T5Ou KhF xeX20k{#gN4j% I "WV/&v1v'θt''9s&=3t'vzә98Ig>m;Ǝ170[IHоM'JUR 0s{.zw_kg쟫ovz~ rܣoEvUs <6#)^{Y3Z:-@?z-][81tЫǿ|@ Il-J񴫡r~ӿ{z(J3ܜԐ4kM>/Mku-|)}6uZ~ZyKn^W w(r1יMq_ԯ7Uioh++yRxYZljeV +g Rޣ̈́g\Yw?ouj,^yk;K .7E߯.џ.ewe_G:+^:i_{Rm\6v݊KӱK#~u;W2iHzoЬo>x~AsC7^n ]Ǭ}P}Nm=/.Nmhc}6>w|3_/Ѫ'?|p\ŷPeҾ`ާ~}|2`:jV+p! Cm:}rrr4ĆYD,2 sMy3dWdhW#Ol?clƺ5^{΁۝/q?ׇ ;Fg,vjO?&_nǏ4f˗Ir|%l"t?>d\3c%!kqۓ9qy+7o_hd;y/x78SL$,5nғƋ;"O^ˊ_5No40ӈs9}#Mhߵxt:P/3leoȤ&Άm8dEy5w)t2V ˘|w;/LD:dFk\k0Pߵ#?3.\݅\SglΧN_tߟ:1}Wm}8/{/3w#huLuzҨcvweҶ?!9ƷnSe=9|y8>gjKmb.j{7g`lyA<5W_8ex/>#-q [oÿ8/n4 Vxoعme]]Fg{l-t7]>E@(1a0t2-`q6b we5һTm~x }%KjӪJg~ S']|ǀ b:K&]n9nuwwkb͓;p[gOI+%= uTR<R|}!Ŝ;?D641]ժ?zTL?p9_ceѼ_?:Z=ddw ߨ'v lW^~Ojyr:]JJNR923uuSa  O^q(oczk/|צg?R}Wrdj_ӳyB+_N%0N,cGr^+S_}>+;{ bA3 ۬:sQ]]P_˭Teg(!qFj#&`̰,` )9&駇}TTƄa_\\rvLa\n}\Sy!_0`U||…\+F!U0<)WH&<՟y>_畔L!&@vNUy`IW`BbL~Jصn=(O_ӧtznf DX`p:*YPj:wV eMSVrJ* gT$C-ZJd3)#&@Č`!D0"f|Ht)=&@Č9&@fQ  b`ɇ1 C`!D0"f bF0+0 U]]zbt*))QJKKRA.W]]jjjР8rrf(%%En[YT隷O:{W~~+VQQ! KF.X>|DTZZ,Y;SIIITptuuѣ:tzw%*+[Hf4/g )_b®`ih8cNkڵk5c *9sF۶mSGG֬YopA~~E_HJH/)"d}:|֭[>7 ONN6l`|ͷx"S1 & & o߾Z|>*Ν7jӦMbV^: "@3ֽkTJ?`|$&&+]viժUT  ޽{bfo#z\䮻K/} :@0"s#G*Gf@?`b0ׯ׋/<0De}۶mʕ+OL0 sǎgBAp Ç(99YEEE67ts!C͞=[GQeeʨ0  wzѴ~+HKKB@@`˗k֭*-- DTWW$eddVdffZÁ5k,* A":zΝ;+!_pp[[gfA8^uѹTL}̙c`@0544b{9Ѽ4?`h^^zWGO8k^ Wȣ϶)f}7*ѕo~Qu|5[ p`3`srd17+a9,2@{k{hq`gd^iQǧ4ߏ_V~3).._Do/m{a_0Gb؂@Z@G4uGvH*iS/#plۢOTrtO3CJ^9pFݾguǵSnіwtWehyg_VO?)Uͣ Zϫ"C Gf9W&Hk־͛ںe k2-I?Ckt.pq9 <-32bk%/Ҫ;nѢ,l˩Md=>ᆵ9kcnZV49^ojz{J)Xݤ%E{y1ŷ!0uuu뛐`*%% QC@_f dՂsfthTI^6+OxNUz]RbwѦ߹W(!3U0WI~>m8զԙ6OKdj3%o B3ep ]Ǐԩ?Csf*QbVRHҩFz4,O㪪~O[9 TfkRJL ʴ|lkކ󅕁#q*fas)'6{tV<tv^}CTI|j^7_߫b-LɣN9EyXy~g3  SYYe]N&3 .I0 >7xi[f',^~Jk{ޝZ]G㕷ޭ앻.}K6:MXGl2ݦMf} SKoЪ/,8 M@C/xKtӺ V6EZklNEvthshkSQض8~Gu:e$GZ_9|zCG},eZ}:e{=tZޤ_TC/o{4oYP#$b7˚5i`:se{Af\2۫.Oҕ-Iԇ{yUPɧ̉󩯣^́[WLMjөoj+["'֪/O}f~=y|cQ%%u$e&nvtgv+͜԰ɣ>Ǹ=S)Y R}z}LJGR>$.VjoQo)M/.R: ^MZ)ǰϓHFFf̘A# Rkkۄ;RlIIIs=Oo 䴧i\޺[o*˰~ ;m E߬[$¢62mۦޯrݺ@?흵ᒻH7vf߫}*ޫZA-:D[ N௿sM g/lf;TT^d^zeUNKk(1dchiV_O9*)t|ZnZYA+KަyK6huZQDG<Ŋs<\څah5[Hxntqv`hXgT4.nϰm&w ?+s,6C]j^)r+-P-Ա8E)u5j <*'*>jo8*p6 540 f/*sAGx `=H7c-hpiҵ( dwX=ҼZ>#5'7Y6Λ x׉okWI6)mz^ed9S}ܙq:vHҭv7@HH"Fwv{pw3e _Ğ iliS#Gj1 ci@zF.>~F~Gʞvc;ۗO(G\Z6?E6;FW3Tev:6V0fؖgϪ`%DGFaxzdFm6}`lJ[FG}Qs;+Oլ֚i:Vx~{}ϾF\ӣwZsr'e)'١~_Z:mfs(1gV.VyuηKOԪ95QJ_j" :]\\?8xmg.Vxa'hհuR#YE.,x=}j9^R|j$ROj{T9{~hժ5'>7Fg_zldd(5퉰fș3gOM=x2'r!n}\,f )npz5 lj'jٲeCǎ`7&*Ѷ7x2%ۨp{_0 \HC9ى/H!EdCS=@DEEڹsڬwtW&)|>!̡̹TDdU^^*~_r# qIUTTX[p :tΝ;,*Ǟ6jyݸ[=dKKP "@ٛo믿aͿv`1ş8qBA? ŋU]]29<kN!Z|:;;aΜ9ʼƏUPPKP!`D &k֬Ѷmۭp֬Yr\T 0~E? z**f馛jڷo򔖖FWQ[[UQQn  @0&f萛wyG T 1V5~bG >b4Cd J0vvv˚o*-]B<` \3XxTWW'0f0h0:b2>ǟy;??;sL?pe1CYbjooWKK壟1pJLLRzzRpE+*55*&S Fc ;&!@hА01c=4EX  &y=z QB@&yh "5OC=G90"Z)H`!DF-<viHC. =b8DjlH)G 4C)\!Y|TOCChepxG@&sB?iÁ#`bE9 1aOfp5,+ +ΰ|=2|!fV"ޓlhsR._0Գ|<4 -GZBC/|U` FЄ>E F>??/74y F #ipz6(Dz~Q47 K{FF;*  ^^>48Ұ_{PHE "54A"4B0yywP04 /R?Bi h`2@H,c??- ##ዀH=燇0se5@[F 4 ohB{F_vz=ހၠ{NSHW!h }< vNihAH,ӷQEkB>C{pyG8R"#fG CHxïG o#nLln1}#:1@[F6J8a~Lqԛ/F!u4"\sXqLqo ljS  8hT44*S*.zNA=FLaFLaFLaKǶЩC]IENDB`DisplayCAL-3.1.0.0/screenshots/DisplayCAL-screenshot-GNOME-view-curves-thumb.png0000644000076500000000000004733412647526537027131 0ustar devwheel00000000000000PNG  IHDR}_,XtEXtSoftwareAdobe ImageReadyqe<N~IDATx yczz} EYhɲi˖Cqkwߋf}qZJI8vז%MYHL$HA`0gOw}UUO``@L=Guw+bkڶ7lm[lm[m>7/~NZ>l*Îܼ ri}Ƕt<{*&&W&f3ݏڄdӘI߱MoM&3߀a>Ԧڟw^oAF4^zO³뿾j?NYBӋ`"9t|>?bij;F@6CH<6 .rY?k4P#Y-Vͷ>+u3C,R=YXTnndbF.&&i`}@ZEV`MCL&M $?>ns E!:ַPTk blRFJxRWN/p;\ȥ gj8AVAwwefE]\tN$7_NLT鯴E! lX` ydQˇq#8݋"1. >`7X索Zo"2susb$<:*~hv޻`_3X:RۢFt֐Cc.?fۀ}!!LXs청簯߃yb~ W{3ljBWAdׯ&3'ʖp`*3dD-t& 鍭1dzy?@.[E _ 6܁ TB4] iÌ :HVޛ`Ņ":x>zD$9Ӌ|BGc[5W~ xꩧ tlM$1D$w'7q;-D}E8޸(vI7Ng`7RCX5dpo8f+,хH.;@@XAPjiA*W׮Fw 0b,a,ȕb0SJ5*uQ)WP#Ic~gh,uZU!nbA he{FtlqKVU==#m!]-W{)Vt"Ε kGs YXmV:|.+f$UaMtZ 0 :>5tv顬WrICZ&~1&۳{׶PLdu$jTpwbR Whl bEo*iqb3*! ZN5uY0]= !TP6hl,'B}2v+v"0G0n׶\",5stۆsyH;WcDv\S4.1݆(iOL_k yHbapN"D. cU"+![ibˍY̛u]8鱋SZ.˽ϟ1l "nٜͤE·~FڐNԫeB ٗ?vxG:$H$,l~دJEQ|,`7Z_r@hBm\W t,%=xnB^DX u3t:u |*1qCd pܼ B.lW11hJ$w"Yb |*MUl݄Yyq,73}vy:+1E4nft9l(nMJH=C#^8~ڂ@ÃSq6 XR塙1kl% xYɛb1+Ze@5{|t R#,TI 5,z\6hmoK%/XȤ}ڈ` -[eOf K HcZ8yd.ZMR,d[Z \6p' 8(|dֲ yώW58 ҄ bאn' Fti=;3$lMDsndsY@Ns$(ofsK:D&PfEXTvf]r:e e+$鋈,jbbBMnhg. FU*\,/>C7vJ+\]O&#ɖ]qeu$*53egZRE׉tMœ-vÒ.Z$GBd"@@B}~A\^$ $jD|\NX86; CXaPkvcPOB1NBhʅ, %b: )b mc2 ΗXX u^kf",.BJM]==H9bډ9J'Si:>/VHS`1[Y"$Z`4DrgzTcAKGԀ-Ud(mp*$ 6=4/RX&XEIԙӭ]i^W͟1qiqBZM UՅ]D$S]@*xf1c\qb$F͐Ў$>d ߙw,+`bf즁(Y1ed*Gp7s bxGXmFXr&qL:Gpv -D. XÙ`٢7wk#,_`r3EI85,n냎|I7YZ Vu߮U;b<-jϽ riK.˄V q"VlO(BGs~jbn0٪nkn4Og- ¶f[7 ?">p,H3jO iJ+l2l˘Źzfs9(, r3DIȨȾJs!Y5~dXzzVsQM_:;-F)xMf"!07aիWa瞽H6戺E)k NM7Ws^t[J7kpxnJСòfvm0hc6Aii-Mv8mJE,10_/O&"@TK A\P76AT0MJ {L䫲3{\D{%5eJSܼJA s*<>/,jC4ͬb!>OGAgZ$rbETJܼ`˒gk[%@Hd|Ja\q,=̊gW\bAr!j2$8~/=)rBV}e{Mz|J'S s"ڦxZG瞕P6X~l_(71| CT0r˪ |&+p N'mx*s~ų=p9\*Z9.[y`t) ^pk'Zh15n6B̭)'Y?2%"Fj {X@rĶYG]RdB6U ap:lx&]ndQ0:^N ˽ˎ׮۫ q+DUᚭ"6UBJUpN=n-* ~/,9])msp7с\zUln4\p!WJ?+)-KtfQ*XW1׍Y t>:Ab'B(tNˆ ie |O#\b?2>/X8d4ށ~x.,DcH$3p!K ⫊[wUwsn4}3h\ ؒ] iV1m;V[Bt>jA Tj>}ö4lN:%Ii^_"Sӳz4yr];3H6A@nwza5;}$ w47؏-_~rYLMxc(݋8x0̪ > hDzzΑbYFFǕWU@ [q^h>^piK] ]1 A,۳v܇4M+1/oToNcB)X" t0hy mzDÆ}{b|#%f{;qʻx;/IZZ@T8ih6.Y!vpY-`n\rewݱy/V3T9.JA׍Hd^ xd#}?8Ѓ9Xlvtqsjj\z93 HY.--"ѹ]qhY| j[cحp&*N.vz8W˥אz ,Ai$Kg>v-n:?`scE~:&rFGj%8/*2FYɯ mvd,zUg9-&yĥ .<ȵ? O`>k>1[H'COڿD|ZٮhaBNEuPhQ`E0MjV0о0M9ߟw zv)([$gD"LJ~{usza:q! x8"L#U}k,ǽtr =k1[QZRPLyϘ``cׅp DٕD0pziL@_`^f|ƄɉB^;)Sאq !`oG6I *c}[TX<Վ^(b0ʘ{m=;2o&^^?Vmpe,!Ź5V8Wh,'0dbDV;3F lP@J b/qӼ3Y-13Aqx1 s0{~-2[󆦚l"&P+ܷ36IE=K[-Cj{#-qXwGollL-Nl5SMؗ~і}k{ol ?}"..f`۾}@H$.q'޲ڲYm߉d|S_7_%vbT}w؁t:M=j]]A,fiYG 1#Vf3Jrx6ڽH}fI9X.,,{)pS0G#XLe#8:Bnmq*^L*j)r)/]=.DTq@Oudstwg cLaU4E2/nW{Z0=q /\!mbl^|0m?qFURN+n\$GLYfrf^ۃ S@՚È5zO:#0<@ϟ0]Tݳw[.o4Uc&{7i^4>czi:ρߩ\ЂYu1S=RiU[-cidݿ+ΨzḘr0'ϲj5r6n?>(ǂeB_A(],-?% ,D@Au|<@҇B۹Y  'l&OG듲Xmj}C%\m5 A!2xp33uK }Պݤf[cイZEpe&%- YMm&7[ ak#L*55i[]14mUY&@jm SfY|\L6/-ك^In Z5Rspy,א3sl{h]ဨwZ<ӹ4N6k5;ߺ|UMPM0ip7ֈ ZٸK  Eq3F,7?Z?U܍%\-##!X ԮCwX^CζQҺgŧѲէӟљPځ$jON :Մׇ=_F:7č8 =mوQ^;VzX[Ԭ4Q>]|~1I[eЙ *tDZЗle6gi^ATZ2b)t+n0vɊ | ɤQ[0-&yss'z(+mvël1]2_r:Qj#{]6K Uל${q1 (Fs!#tH~Q>EiF@$$[ HT Χ "\sL c:vc!:.skǶkM~ RN >Ǟ8S݃HdZR.}gԺxxx&CU+Gr#I ܓY5ؓ2?Mpˍ$`fm۶nA'iR:1ŷanvcA]j(C$$"/ʼk"2cl$BLfCluvG}wu~+b!l&#" 2Rr%\zAn1D8=0Cps ֹt"u|^?ʕ|pM1d뜧=1Na\q6`j 14(󢪙:-:m0D ~K8!{z{} *Id*P7)i73XyA!x bIa҂ՍVT s__^Bjhaq8% KAHEwZZ% Fsz=xtunE.x;f,Ws#Gɶ(fn@ .;\$<1`Gɽ1zn7RNw;4z3\mFqۇpa,%pujrz&mN'L,F, о="u\ R`Dg%{>(|T6ٿ<" 풡k^JYHKI}#~ C8 NUzM=, kЏ6mvJt~Z!}ba |N.-Z*Q!X|Yb]*ުޣT* ,&w[/LJS5dꚬYl[)UL$7ǢQ)+UH$z-楊vܕt F\=>b\7g4*[B%mg%9H9;=l77gY@N[ jb 3ʫ(qv]N?_7q;Ky_Et\'fg%({n\<DO)\zI:+E*5!Jnp12ԇW@"E3ׯo~Y=a,a:eĞ7OYHb|f~}5ޏ/d?_7TKw1;T:Ckу۷aѬZ' l(@7],N $EpL\N*v|v$Jcv!FSUވ;PBt<Tk clNdx<݄g}ob/#0C7w:= ZҜ>A~ǎmpS2XΩipa0?Iԫu(܄k;$KPI p`tdpCOzzsڤcG4L$7SsމEֹLo|dwzTKB aj>!ܻx~x1BߛNxRg*rDeعk;B^*5Pei[ tH TA\v;JCs"PAO6$Q~.ZdtΜ>%O eFUc5;0<4ŅtB`0$<\xF*֎N|" H/kk1Ӫ%ZnSޯ5:nVH0G '#tHŪg@ֻq9R&$'9z즿C{YٟGZ~OǰH;oÃЮGe-i񇇇ZP4лHrᑥkk#];w谆L;v߈~Λm\HPgpк{=5pn  IU7$_ߡkp>4N 2K\ ,j$vvoW^A5E>Y"ip>&\B(\>'0KKؽ{/fƱ |,J 탇4KW7#Lv xwʕ뜕P/^F#4t/wvȁCBdɠ. 'OŞ;fKbe^DٵW J􆼘,8Bg mo~WRAJ\.ß~\6bV {PCk:aǑCg8t \Q>G͊bJImyҘa}DV18G%@{v]ab,(۱O}8}Cd$s* LF<B7)]>]-ltm&[i}DyTZ$9^f p[2.y1c(CA*0O[oZ'ss1vl.;,,6)&ttT}Δa;l/pr첀s Ay7nΟJ MNO>ĺO*8o.~NYnKC(КA>|X&՘>:З$o-xܟ9КA &DwᴙW,9 (~Tzz#9Y8c~D3zl:KL~li2Zd^l<# M.'|#Q Vʉb##0: L6;J~?o~8Uq0oG:+U܋|&MUP% ]ȥQ(פȊKf\k9:Bؿoby)Im^ڨ Sj`ˇ\`eq1S q3;:0*YH$ErY1}teEovusc2̺UZZmOڷ֪;=N5QH{:>nA왢;.1 כ޹q!Ï?󣘜B];FWO71I s ʙE)]% k\6i; %*U66{LAZ#g7t 8rXEqR'bYN h.?+# p9z %I`.:KI|eۂ=e9ؿٰll[_h~k۵l߹"akk!B|Ҿu "OR֑s^ZJY:Lv ;bOe]O iF8/*6uB~o6Nq ?#=zEpq$XT B l%|kTq-+ ,mvlapm1HΗ8NY'$}ͤ_ ::: AQ#w=3Efc'/5/XLMIgHK栘-BVY Ԃx{a%"XSf k7 ԑͦs)RI3yױ1Mu ϹPI "\H*yi ׍y2ع)'UfS%ZC80K{TwpC51`K<G-6dԛ\ǒZ8jX'pr#"ǣt|+Dxϔ1JMc;J\sU\хEνxl7y;`kdZg((M&'~\L)cpdĢ{G(܋p0|$^P28!2DU\6: ׯOJq9F:Wt!VEs&āqGr9=;צH3/qn ,vThM+s Hu/v{ZXV6]5O,.ܶU'Vijq` dZqϓ7eܱD-<݃gJ;'(fd+ z~Ƭxkƣ "JR$6{\r: j ۿ9x<77*nf)k\MwՆzˬT*%4\ |eY* -Nc7+-ͬ3|{ YLwi3KEӓlǩ%B!>A0& y*&fc2 OCUR1a!U@ ,j.ʤsn_D^"i;F18&|ՌP33|$8k'P07W-Ʒ^x{N :-|*AH# b(ToJ ]n'榦M u(ܳ29Fi!.Dg'H"@0!@" D8 RӠw{x8q8]^BAL\x&V|k`7 D:&GGspΥKQsɘ T d2b |tpBdd "%s{#CZ&uL EsB5_*<:A(zcxN1N8DZN!XGPA;$D4]֜ 593/+SrAV)aϮQL_G@7+%6b AI #Iz >' Pđ)Kxn"& E>4 "iZCLIx˝lC2RMό'6܋sg"A!fW k4DVحfFa]'rYv1Af~0Wrbl5j;xrsѴH"&ww-6b#g4+zz\"}_\᳖R%T4V}4adh@fFfa s.f3ɁE`L1crtz"5.gҩ$l5BUfeQ[L}1<3RO+/j}WnP6iy91_"/|--HS :JY2in;.7w bk},<iP05^ ._#$W0+pcջ/k졙n]mk鹼IÍѪT# v^gkm-@5cE?VM+Gڼ-GykjL+HV1ܓ\ 2X!ֳP]0콄Xܼ].qu6<]V~2@?V;.8v>ϊ6&و/| FJ=FO٧Q.ZK^ox!|>Ւl5ЭoAy2 w6Vvd2y2RVV_l̰=Xaψa6 u0f͘_iTo5ȶn,6cSjE7[ \,?2ZEnm[۽8H:;;#<(pShUuu`'5ʣWq/neL),kIV԰o:1 مZ?Z ^Ҡ~,E&j6#4h\ItVNZFfF-^Zטah c.Ff6Fr*B4Coo#$=6# x+vTY#3Q0a&ݔ}j5܌ۖkfNw:]weH??_OHOP\I 3Gp%!x~fL8g/~}=GQpo* J~'?!%\bpG@WzT-ě:VO|2Ό@r b׮1g1l}}|0[dO8037/ 500B4IFP"𦕨[ k&ۧu<+}愺H$"x`RVÏB]2QM~=poz|1'-nK9F!b0?~ 3^J' ڨ`0@e`K{<$ n'ˣ(xUޠQܸб { zDoo^p\έHv7N:Is멛A#+?ﳥ M'g>Ws64ףl[ֶIڶl^cXʬIENDB`DisplayCAL-3.1.0.0/screenshots/DisplayCAL-screenshot-GNOME-view-curves.png0000644000076500000000000052420712647526537026013 0ustar devwheel00000000000000PNG  IHDR |tEXtSoftwareAdobe ImageReadyqe<)IDATx|չҪ7r؀M-H K{ 0%jl]\%[]>93;ZwIyOٙf4yEuB!B!Bz'*B!B! @B!B!Bz1 !B!BP$B!B!CB!B!^ @B!B!Bz1 !B!BP$B!B!CB!B!^ @B!B!Bz1 !B!BP$B!B!CB!B!^ @B!B!Bz1 !B!BP$B!B!CB!B!^ @B!B!Bz1 !B!BP$B!B!NQWB!BI A @B!B!Bz1 B!B!Ci6@B!B!̢gsHO !B!3[ߺmtKz)uT2'B!BȩcgJn@OEM,oꆯ;gV(:?B!B! 늮XHտ=?. ا%,PSnEi٭yc&8rF]N8*hG!B!itc"͵aۖ] 6܌t!n:S6Hȹ;[fKF ?2B!B!gU]u(pdx?ߴcxC . HHwŸn=&$B!Bn pYƒƮ8L0ahH @B!=% HQ?t*SB!B!\ ˝N1icȞ ` @"]sA5^=B!B!!rTšt?t#a00J\Ӻd:ǵBˆb/c o\jגt׺!B!s|?xgOk0gsKOT;=5Fs ì!}1 9nͭX(^SBrsd5bp <EpFbhljBسg/ r]gࡣ5r(8V{aؐ8?}B!Ѵx@GHᏐnBwMfSt} UU+5ߚ=|Nшx*0W\n w7m.]w`Μ1>DQ*V ߏ7\UJ]gig;>Ǩ)7x(|}_vJB!BH/@%}U"[g fBQ@sGwt,`KGoE9 0/_߉`0ݦ.]W1e6ch4iw9,yu*466amP&͟?\^1ݩ s/\?}aX]]#ݪt1[.׳ȐA8_3{ >!!B!_fH/~t=XlK`#. 8Br%cyRp⋧W8cu*ODj*M =8B!+!Sb&;Ua#.4 0*?eE^Ksqă<^\'Cɸ{q#t"6hhﰮ^{z͛n]`ng]w%?kVDQQ_ `W¡Gf޳pJl++-1>+ݝ_ >$KԙkYWVV;>}?tsӂ?O7n\x pםwoߛlKXΝ7=y>1@Qa~y:!B!t=3%.O9* P8Zʮ5loƽ0Q=?WV,X9^O~ pXC~8Z]i]\su_xEv: ڧ.,++Ǎ7ނ//~ዸ =SGjrmR(L䓏W`QяJZ .]*- pF}w':t?0j{.xaҲ l޴~ /ફ⟈c3[+4h @ `-\!$ר6mݐu~(B!BH2iHH:ܑ(A:cBIsy>|ḿkz v'ɺrssNHR8ۥGݺNӃ9mc1y?˗fW_& ^li@;>d^@vD?O_8v~O U+ȑqWB0M7,zj!ֽ&YOU>YƜ966[n 7܈7xe!B!gB'Js!h`jg$A(n7x<ST/QX(.3&XjM”kp.A/̺N޸qGeo:: /O=`2yyMcyg-_7x3\q7{|r&cuƹ"{rspHdrQ nѤX(έڏ qQS}!B!=ҽ`dEAs$B]K;h}uq_> ظK;My:M%f.nN$,2IYt_uANEDٻg(=֮Y ǏҥKp3ҢWW׀Io~֟@k׮Ƽyc%sץHX]}۷oCqqiؖ@s4ay bG*͜D㪫oss!B!{&!{ҫ,{1Lv Ќ;t`^?ބBgá:u[P_ihu9:Ko'KqbNy2R|K_ۇjӞ?a ;n+@BZ~鿿&VH1eX1\2'eQ9qDܲeբy߇͛7aҤ17lXoǚի0}ƅ翀|;2Hp()h%8ɓǦkOR 2O B!BxO'tozu8Y5AtҰ?/܀!p8.ǿ@^ˬߪr+4a Q؄ڭݺN !y?XMܜo >τ Dm\L/Cl۶ݾݩktKRb//M߿~CCEE~ӟϽŨQcpᆵ}~W\1ۍxW16ϙ}zOA!B!鄐nM^&Ɛ#BםY[ s[8׃={bI7H|g~x=N몫;N,Z<֮]#-|9r'S]}:?[/O%T9r0*+ua'm۶ŋ_@^^:8k֬FnrV*(J,Ij*\8Blܸ>:;V~~■͘ļzr{eY.1N"B!鄐ҝ~PmibE5H)T0y.lAUdp$h_( `3x"M썹z9pK-{]PPDHpK9PQWwK⮻>k׿~Թgo|=R~ğZB!BFhW^]>PEXD"OD ,_|%]zUnPq[1='a0:b XtH.\^񯪪 y> v\FD"ҵU$b٪;^l~]vyr{E.E!B!}=u. N/\x%-'3 B<);OԕP d+'{N.9ÇOW?֭[K!B!=ҽq.s/٩ 0!B!B7VnL$B!ByO'to(B!B! ! B!B9tBHWf&B!B{O'toz#:gm1*%hTD63XeQ|*PtQ18TԴ2nٜ5ͭCw-(3nAZ ou";U9мn(Мy2j\Gj޺Gin1h/܅7b)%bk  fĺ,2MKAB!B!s,:7J(;a` 25}TjYſ\F-nʇnYIz cPs "1/n)(۪_O"6'-%ŵG?B!B!-O `jk[U=H|C!vZĿa W-]]Z&D@SnM'n`D41ՁD\u]XZ@H;ݑz8@(BY%?B!B!=ZB(K&:OI }pyT?"ֱtik?n5&-ŢքWW}>!'".7|Ep9|ꦶs]c!8M?=lq iG!B!x(]Eq_T_-?-rN\H _SSp<4+@0@Hw"8栴⟪7mtCPZc@46֟LA!B!k )0ZFEdVV飼ﮖ:X$8GAq:FrQ́Rk˥桲q]AIJM8 fih ˿lVQ#B!Bd\U(`,r}s-p'0_@<[MlA~n=،'dDbdK?B!B!kco4RӒ~4ǰ%2~t 8U&D@Qu(]w#9֝9ܨS|WLmnp k,V1pͫNB!B!7ASAQd!*(C)U@ C\W8*~%A/,_;w @0FH3-Da} }N|VSQ- #B!B'BqX$ 9-ӢV ˤ ~ عB),_Z h3'ڝja&Єƚ& M 2/SJB!B!CdLmեrBo~?Z4Ad_J3Ǒ|U`T$pxe^P(;׉flae c5Xb[Q;K6A}O X֓:0l!B!Bz%.qp*mQ-"]]BLRG՞N7`H +VIJhkWC#_$~6U)Nc<EH|83~VMr+˓RЕDqZ٩ֶ迸%"B6sKB!B!B0+Ptڝ02ZAyi-5A@w)ph3%-Ly8\CXs"d\'S* GuJ=yx՟QzA   vw_)U N.O2A߀gU` ʃ-(;bl7n۟{94q)qѸ՘b1ADCc.#RF˛ KMmq ­͈“W,=<6"DZr]+l*[9l{P#9H@4B}n?yO/B!BHoI@Pڮ˅RTEVP.D/7.jѓ]pg&0-ؑu3ه*ʤ]V%EG8Vmciho6CPtꡚZ{GY .=_nu4+gPp:6ĺ, jB__ ư~wyi7kc/1y1*Ҁ|}MquW#߾gI[0a5nʃ0_ؾ֢p^QhH!B!Jh5›ei@|L1>WOz ع1%G]:Rc:Pm%(ӀZ#uЂ3 k56WRX kdRݠ~=ϾZ.K uqz\;<:[hg벨VPĶ~MTc1Z0_QU0M^X^j*j+OaEx}W^MXHkrBpFYǟ]V?y_ Cֿ6y~,|d %)g"!B!ʗ Oڅ?8uGB0SY2;=hjtxQՅbכ&ſ@,eGjk,bO8֟fYz\i;kpc4ct̚4<7\>c÷yz~W.??tE5>Oڋ +CL̔xO2M4Xۮ>T'ƀr|oY8ǬQm,&s>܂6b!y=;8*f;f|x\<5M ܺg>q<ԀVgB!B!P0-c_'g-ŶS~ayxáǡ;Á$?VK܁7{"}sq 8IORb{]C v:=Ha-u[Zv2:薀+4/HN.Xvb+;|>uDw++)7(w2ԥ0ۭ @o9@3fӷOe~ϗWWąc'y/*M룘`S>|cYffN1oZz}j;{-T:;#%9C&BݿK0tNB!B JE;̥u*yP=Zuj ǁI*sUPQbA]'/ @Up?`߲ oHTx h*'aKR̺Xj'MaJEeX8h;NZXF~Yxꔉ1\9y% ȄYHp"]c";'(y$z"mڍ%n+$&›La-ړ9f!:P>uc=%CQ}xeLYp.9is bڈb5ۤ(r(bsl"sB̼@q[do(y%o=諏 $AKc!<Ș B!BHo?DLX%lŸj&P,Ol \y.MQGBJ4#!'Vmr#SWY^Y>3l /nsz$j~XqKR: }Zc"#k0_n<|oz)L ; @{c=y ^_!"!?f\=?duOͭ%:ڪ-__ŕFٳ0n`yxl,9ƥp&-'p.=]i|m3v7pqAi8\SO0-H\?8 &¥&@A~"_%گmxyӴlc̉Ym qqܱɺm؍5ա% ۸|wEMQ5ٵdZt'w 'QkOI@ s3 jm !B![?D?%!YK! 9ut @paiУbć Gؼōp˅^@) Yv(*hWgԪpCͅh6o0.UzſH\ǿ5&QXŸO]hAX4nŢmm-}()VQq,|'ϡKV3qqXϵpfF iIxʹ!.!Ŝ̘4:ڭ{L˿T".'-paŖ(-+>+ݠ@2b8& \xkQ^>V;DZ#p51lz7EcNeRS&B!BH Jٶ3?EbY)t"XwUذd ?iBl{ GD 3RC*ߺ0^ۄX( =.2#Οu$Sk0c>j>[cYcţrncq,2﷫Xf<=GwŠ(0Zzد SkI10dvo~)r*4)ÅX$_Sa@r .AuЍ[Hp(|r^Xq x5kvÕS,6ItZp9}+6WmqqWQU5h ٮڿ~6co|^2 5WA2 j6- KùH!B!Rz ki'5?ӚTf)SoPRheMկABq@i56uF6#JCQ|iyc9̜6v5 nhш%,ี߉Xf:q!1jhL ;#} >e%C翼J6E5 ^Vշc7]U"`6U)3')q`er58H3Vm.-L' 'TZ]<\}6qz 65vOXF[+=H$P *JJwk}r)kCCh;m JxO}!X1앇-F8Z" @B!B!@G0M[VlHΔ)JXĹ%:J]֭(PVhRrH_"4P5 G"VızBbˇ3XzGJREQ2pc2< .}OYo $⍘>ie.Бv^b] l qӽƋyۯ4 }Wk뤸Jtczݪ8~PLV5MRS%se4" h0} >}xfY]MaSh)XJКFEPB!B}<Г!&XW,;+l~aY U ,UŸ8<(:Yqh.LС9p)RѬXk5,٬U5Zz&-C2dX&odn t 0SKlgd =.GZ [N&bϵW)=- qg>ۯ~8v&CBH3ꉆZ1zH%sqp+-2w8Kw*+GEu,5w\r?'61*D>yXֈHx ^9efy}ڏ{@IP'6҇PV&U1Q9f՟BYB!BH ,fYiV<>`%J*RaBSs؊ jV(<uq!M":Du{jTD~(lŸXsHM@k# F)wO,/]۫-*j#&yBqCd/1k8yt߄Zqv: Ϟ*?_vlѦe ]s}Qw1YW 2+p˕;oۿDDE-˯86*_[~}r8?_y,^)8ǍXq1>,BjSKkc7< ;O/];o6>ov gsmGcC/(3-́\RQ{:!NozO T}/_h%\N%}f!+{ 7/8(߮(!}/WNA' ]Gq})xdDv}Unmy;'!B!L/]CC,k ⪙=7!&\@Ys$m t tVڪ@9@,b!Eu^ W6΋ZZ՟eZ^.B^֠N l'K}2e",~zp:ʴI/wwq<|'nF~ۿ{ނ2Kx5օxl>;UC0 nymFѯ&3 K‹Tʺ }P;ȄB!B<RQֆMf񛚙̤ky@ye[.&GXU6JQJZ(5 txOױqzY݈æfdA3aח]luFhwN =P*Ҏm+,Oǁ& %P.]4hřKEu!߽m$^[M} wtYrߟ2\^c΄|'qô5k;4Ů_؊Zo{_wVVZLG$\tsbӉ.Ƣ͗>,}k3"^AB!^|N2BzvDu !W`zоu_:-! 1/j;T k*M0Cv u@Ch~/6CqS m%3_bWbLKDh{x{5c}2piq&"^$͸W,B!LG% Xú()}x4Y^R_Tm3f]8T)1[ؖm%E8=Pv"J?l cڮϻ{@L %ĺfY\~۳;qQZyH8D9W7p3.B!'Set=ːqk V[K=4!U}z=؟YG{(RnRXBNK.< ?~9aݭz0ⱘߍnw>wGLd ہlJky0y8LkمG6p~I7{3 YDŽ^>o'?nh3IB8 Zef2=. &% 7`UJ]`aSXi{S _ͲtVN<<w>1siyJ(n87lw-}ŴK ϊ =gG2/V?<{1 .D;d9׳73==πscBH{J.ſ bB nawHz/%-KgGjI@NML̯ϳ.c܌VcU7A!o3؎]^h}-=ΝjjUxX~,f O D./}Kiﳻw} F<:I}#Nlrٛr{T-~"|;q$~h cSOmS+1!)8%/_"g<x=FlX04ފjF,)ir)_(T҃quopH/$ G7544~5 e}1ZMH҃@2(DyZw,?KkE?c @R/YY|sUFYEf_4~}??؊X "z/g;jF2Ǭ\WN{ۛ=giIvt^tܣ 6+hٽ;ܾ/ffwE b&zqcϝ6h0WgSXU 㛟 'O9(! EՌ=,/S35s:]p(HB! GN+Jnw˫ٸh7]dSÞVm"w#Q` 5EQmP@Ŕd?\Bw,(֎-ٿ|e=wWIl{KV5w_~{/{-3Y3+`Ϙ+2ۏü[f?Tg=!2KAsk*Q.B_Aq7G;n^(^WVѿ m:v9M=<:WOS#:7]OulDr>3[~O_G~_Dli̥02xkT9[W~?~3Yבi<'^= ӈGZ?UEfGR,(@S|b|}Cк;<kA>9l]]am 7bO.uNz~:Oś/opxRo*=r|7ª+çN'XostՋGcР.]u|sU>vwaµ KW[_O?<~S?|d9ʌkb 0k'c˱nL||sjK_j>wHzg#݋_Z:%3LwOmq&0ߟߟX ^\xEܧf׷#%r!\VU\cqM|/^z|wf7!>/j.1dLrbqEƼm17|wvNz6LKpXw ;;㲒xM}-kyN\7l(aFqI?twM"a%IE^ ١ xh7jZ}"7{Z>ycQDP~aTd#ht *㻌70B/3č*ۅ~>TQ\XCCm; a $ 'O믒QN.R\%bZP0Q"l_ײL8JSY m鱠q`w``.z$8՛D{GYoSVl ] pm\t:7u aشpݨ<6Ѹ{/k^<] ]t-Z_%Eၥm^;j#-.}nMrs\+߭]јXnm3vm%Ԅ݇mY8}P*q<X,j]My_%U>=Ec}}y8u={9騮㎩^}~1~ݭmObM|^b݆|̲K}=w'O]`cwLK spɷځNd\x؏MnՏcC@L~l_ݘ\x!aP!-` h ުF]Nw::rb/ JUCxv,_[/*³#b)yp%8 KrZGo&Y<' h** Z+}|dv<=a3'br=|rc.`d=bK&Zl7V; v!)Ӳjt5ӣ!BH&rN?xG6a-Ug6"`wHln'&j'^6a.J`s* &3ETwjwCGIk /(Dž⯻3 cف'؁X^& X+FV.g@ 2_X0 EAe^],tqߌ~(Y-1Մvs괧/;X=s;nCSWdX7ǔ± Hw2sPc|vS6cͮ_~YiG-Ƣܫѵ~uT  'ҵbB'K[Ѵ~'׮I]WI9T~X_NI5k_W?|d%}&:! ks|v10;qlhG:"]Y1A?h Q,1%%jvOO u֩d}/łJ}*탑n*`;ӏ xƍoy">dyY ] m{ٴ^j'w*q`nŭXb a۸Ju>ل괍>XWbL@#{}/i$-ɘj*+."HQŇ6}A'm9?{E^!z.MAE>v_ >vboAQ`ATPATH Iri׷{m_ 7m3L58 S|n,tf 9vp&8_ata2$Ye<߉ܓmĚ }T.$`|{}]pqw#~rpKY,ռD>0zlF7<.ۈm;]х^F!卛CZׅ|`V%gv(`pXR](yЉ\!kވ+Fl^s&b#qa Twu_@q 8VPH˲.HVk`4P$6BPNn8R+u2yȄ?>X wt%C!$wQ/cVQHw;bѥS^rl"J#vтB[\`#ol q*XE];q.Fn,!6ꬩA;0BU<3=0%dInZJQ*KY{oصT`M,,HAUPD$$e8&+ bAPN50_>[' ٝho9y] kxhaeQ~+(9^ׯzW~~:uꄔd5*],Q\TH:~QZf';'RL&p# M6ҳueRín}"8 ?Z. JK &xx^j#y>I: 6i=I1x5ي)퀝lYhI4(8L@M&BrEv6ks6 h) ;aSަ ƌYv2k%[N=&r CkD4ɔՌl:ü.ޅ*mӳ ǺJ 5&tyN{>_ӄDGe>!l?>ZcϟgXxu,U{aY?IY`[S^ #cS'[ }[]љ BX3O?=ߍ)-*$Wy0 ˿߈gjtgH3osPБw&ױ?Ď8BaJq=%Tr*Q(|% (d0cBt1 ]"&_ Ud2DK8\rnnDf ݺb/JptT*5pD7QhѾdFE8"0ZU8? 6%'58 -'r#=kF%N 8y}2-NHXx5,[m((FF6z"b=O2Q (bHOT+ŸuIB6tM`&A12ژINTDOzs oY&0CI|;Ic?/_U;Yxs7FWPD>8u@|h{+X:Bd g<-"ϱ EyyҨ3Q4TȭĴՅHOOϽ'UUmgN7+WJ%N',YcWz45 0qDoeaزW,\ "B1x(Ϙ^wHΘ| Xp{؃XR1y7Op2yZYWcX>Z[^> s?]ށҗ%@W߫k!0R~bei<!G3z_8pzXUqD+Dn^2&ŦK 񇒚:7:_"፻@Bbe=؞Gw?:+ĸeb +s\)H6Z*?%E?;c m?%f"|fkʤ:wou9e8nC}kGS0*dwLE~Fb}nL; R"^ ΐ&Ce-XgbU6wf0* ldB-rX ɣNg/2ͬ`/&)N8"R\+٤D9V+3$Ј BƲVtQ1xt%~:Si^B}Z/%i,_I A$#X|عM2Haxř0Erdo\B,vY8QUۀC  #ӓY=Cm6Oj'I nۄ'z%ۂguZ_Yp:ҽߜR$HcL E?_g~$ku>TiBEɠm9 ]f̠4hFN{ gf$AZg(Iiqzhy<Ny߃#O|,\\x pz7j tO\u`tIV][?~y&&htwm!,_>99H-5g('Ƥ4Xopy*T(#*>j2=.W& +@QSIyi`tAcC?̾&d_+#B -Jyr#QqG?;-[O|hKB9}*q<*Ά}O\ΤP('_Xk`10Ȳ,:Ha꺚xޘ|'.PjώN2yRA'\2 pY4g:]B~Y,(kxâO_G+jB: ˡʓ^gpPPac5aȓzn8Y5taYu@d`/93(Kmȿ!yCJ}X_D!5, Ž8,Nm8s2v>6݀Tuxh^LCyFR2XF$MM2 ݮ~ǥNÙ>'1cA)x&wA/ϡ.3^0bFrOLxU 1K׀3#ƯΩ9穜{UD-Հc4AC+a''lv:!ra+ZRiRb/jX3G/f3,o%IWzԹ5up  s:-z< v'R֛`[~KwVXH2$1\TF8Gb.2?Yi/ !qP( BPY7LHF-?iuȺqexkA?كR71 i>߂4NVv6lLtK h#}dUp("@/͟hʤY|Y}nj(̍(3ROÐP#s*jC 3p/bm?ޘAvȔ0 1簸ҢsxBJ8:44F#߾s$hgSc$5` -M0|ݑURDkNJ,3kGYȻh .v_JΎ9_!h>CjF ?W1 ceK^IچĉDDͻƠ$i"mJ !r43܉V Nސbq]Ͼ_ ɣ&"onl"Gi*퓏b~AZr[0!i0?;6^YQtEΤbHO=1ht~$ў7d?98_-yҘPYn'mo6Y`˯gd\P( BP'xbž3/eqd>*ೲ<0 >R6.D=N\&e9CYΊzuV#_F^ $`WsaDL#[(9U :}?3b$UXSAݳέnY)ڧ`eԒuU]|5Lx>IqQL©) 7XQ==ф!xnLo!OSuJqrzߢ_ 0.àFRKJo$=$uhZM,8?'ajFeS&Ehz56|~wd>J}P/#jnTȌ}p01P|dLC'aᑧb%H fg#(RjmRAÇR I`84ey԰~^'$ʹ;B =īw{:7 [0ё$jIo$LR'aZ"'KZSSvϺ8;CUr,TE.BUѡ:qQ0$Zr|Bg/7dgXxzpeN>n\dTgu}D{ B$0EkkCSB0ZQr̡cr`CVo/*D@Xzb1BP( rt`|NRaE[D\O :I?G<%NQUQ^.u9uuټyK01J1u;ؓd]GCh Чuƀ>YP9k!a,fѫ{X+zM-&'ٗ}6."]=Xz|xL0TϿ§s bpup Z$Em+vSJbtؼ*1>#pi&I󥍸3Wҭp /.>jXBReuv \IZ|^=u}1iXW7 qnJ6O+|8eax#3] 'Hx8;ppXI2Kws磓YǀԻߕlXG?t.N@h841d7XF I(6\%!,1/NgUХjsB+aRdJ$R#A *.&*I`{TS&zD y4jTn{Bhj"e_H-${9=]z[\T qq#,P>3i!eF-D+<۬7ClNluj,ǒ*LD8 TFy'J~?>GF#m&(a=τ:Q݊M|]OC t Mnp 5{? фl:__>%6=:dPUjY0{V)NwĹwH$\N$ϛXfGSΠl|lWPC)QZC7/|L:{~[ (ݽ<;=+IPAc݁y߉Cf('6VHV`5z=PY"_<&(LI9r[K!W W!*I(Q}4_T 6-by4\p.n|]w-Ijexuag1cfj?O~S >=R0bU!TNƔC D6KwĩTG8\^8j BP( V%:#,:,ٲFu-v N )nJCg<X ެ5^F"%;t IN'JJJ9_4p:OwN EQ4< %Zg"=JU0g]+6N.Xo6FX6VwS586 HsZ6=9]a23@g֙{]Ңr<٨%/@wOr?-jHɁ%y XFUJژp*4t5Ձ$)aSyYrحn{ә\JI0o#)&nq6:Ak} \ďdwؒqhTUF~5Y/Zђ2!<*}'ZӻVhIa~JN]zv6h+3bԓ^t{^i>w)RD ,)\8o=" *frWp* Z|Oh%t8i#yKi!~JyzϠ"!5"jLE[%Ә0"Dž|V_81G-,Lʇ;j8xIKh,'}]/QQH89wD,nw躌xuH)Z[-ZZX6Mo=ֿjTÀCsCAoy210h^@Dũ5Yl9BP( B9ZXR%zV5w ,UqJ2^儵/^w<2/мrB o/Lk )`y-}"[܈$f :Җ}V|?D@($6!C~yPяBP( ;Q4*\vny3'_LsޢRZN()2Xg*[)-k@{|WB"dA_Dh/ BP(߉V3 BimF+0eCXO 8$ m>$CĿ0+# nfG6BP( Bi}(*R( ZNz\v󉀬l>QJ>i`Dt\:DT:(N +PH"A"j/&o? BP( tHP(jmJ df(}XQ$-mD#(+vP]ط⯨@|BP( Bi(:mBPZ߻q -"G.1am($Wp0$g wd>+@>!O\9tt>>+H+#l~.?ʿDP( BP( BӪK^=k^ q5,!_$Ꮚ-(=tQ>uDnn.F#R( By+'_:w BP=D Ȏɭx46k 8]*n%ehtUP 3B!ZxVD?ni`1+^OXb_$/to$r/лw_E]*5rqP~BP( h#8 BP(Uko@oHp!e%wؕ8M,qBrN'_C.Qx`d~1l:wp/ti_oKqFTtٓkQĽPP!BP( BP( :"؜}n]ت>p"ıxD?*/MI_KSh4{M P( BDiP( rQ*%3- d Lx?} z@!Xk SZ /4O67hI&E)BP( Eh؆BP(T oDoEcW?8՟$[Z1oz<u\6BP( %v*1'oQ BP(TP4K@yӢက d|'.>ς,_HsEw|O6mMY $[U?ƦWs5!ؿ+z1&0K5%V9ph|: S'4P( %b)1| BP(թh" gj䋃8fz?POO7kdD>#Fvȱam |6 0f/|n#Fblxt!Xa{h$^%o:ƠǞkcTiiQ+ߵ^T:KVcSP92/UfW"ﭻ0LA) BmDP(ps1j.K]V^- BS5bA" 8 vQA'm՟^8^Z+ɶU Ph(ڱ.q~g^~C-6O}|5s/ /~ލr jRҞSfDfL+iKF✋&aX{]V;1ks.qJZа; Ō80-1F*,g4 E] V?,یZ %'Nמ\(_?R7"t$t71<_.ތ=Y?]~@M BDnPGz>t ]H9)oZ/P(Cu*GcIQwmBD? 'O`Sa`8ߏ ?93jO HB/۱KY -DB|iڛBj! a*/njK`ݯ_;Ù=FxjlnAʨ1yDwheyv aq添w|ۈB{]~qx8οwl݂¿QlL\D1L1 rOiƞhb6.=uAP(Jp$qr8wCᄃ-'d3 r ͑Wh9C etqXo4!)#źh\!y|a^_# /KtA,dfm=Jc'crQ'|p-:_|9^sp(qۓSqpѼ*8&Ljn=-͞PZsW`nCuFwq%BYI+QxtRǒՈ_V6$la(5 9hz$OCKp/y-6cբɢ(+y.&Lfû enbx_?sF,L=Lj$qk7?)ūS~f&߾:y]xNАϚ,(DRp#$OoWn yYH3If߆< x Vm+skl`y= 1JvVoۍWC׸ g~wknt]9O4;knH/y8qvTֳPeuD*R<㟯|ؽl,(BP(m$MUUPKH&0>uRNE@Js(.*D΁zkT|eJ,k^wLXf4Q) ^׈!`'B?ySx!^r'a͚]=-%aO;mҾ?5`CqQ{qa𦍲?J k*;;al1cpv{,g%tѷϏhmE Wy~THO].EN߼1%ZI{qKů9vqH Q'9HASJeHP(Jp|z{GG-z?@\iv6X5clp5n?]xw&hsjL?_7Į7DrA51*߆ݣERw 옊=xZc /0>"(bs=ɄL,^>XA(C@__,F)p%g_cg0 a粥k-8㯠^MZEzÙ6Acy c_O!?nxxx faV_\m\<70O{ 7 NļMw[pHioBP(p ȖϼMq#D(2;H|=]Bj9Om}`,ز;,2SlhG(5€X0ТpwUbߕ8BiJØ K'e,b|ʊw9/Ftft6bJ4%# Ӂ(V+\xixеt<;cSgt^M^Kʄ Mx>9_SWo4|szK>lWl,Mƨi`xy 0TX2^cb\ (ilca /`GC~.E\$)jPa5UY<4 8 ,Fw1C(/3zKͶ5r-@*k?Zԧ JāGm!&i}f_=|c(4Cd@/cA?5K|Y둗]Ɨo-i1̤#3Y ;Mc Q@m :BM[vHݰaXɩ9j Uؼy `%SD@tDP" |R)HW(%ț7Ub9~qn= L`:,]Uކ%İ[:kK_Y#q cQv:){SRF*l^w3n 2 @0`"Җ!lYן_ ]IA.¿}ekH`zz:I+?pB9î3@iɸj >a^3ZmjnmTȹnb_D3HLb'`0gW>_144ZCr*#?3dI%<#5Mbx0EA]$&^x#SnAl' h5&'J=3ܧ^•ir*X6̠<eIqcBP(gB> Q v3qf?8~<]{fC;Q2wn!?B s}]sUU}]%`:FCE\no=Q=Яs֊E74}4J5JצPH۶#&3CJJF) WXPLn&e$KH)$ !E^5~An0|ֽ0`ڿRp)p\)@|χ9֜\<owE29Ƌ}7f<48G&R( BBD'vfEvtJC<8s9a`m]ފ3_S0uG7#›,JnAhDsn ]콹cQ/k@./߿UtCGG8h2`?o?Gy,8m|o׊V &v+xt\ *b۱VZ}<=&8 R4j雙&:  HXpX55|e Njx:.V\.[s~ZFn㸦S)ūS7= ëo^\ʣjуeN2ꪱɢ(+y.&LG 6,| NC{uܬ!Sir)-A<.3\zQs|t8S-}H;oQ}'yN)P$poF3 ~5axv!0p}'h'pxtIbhg<?B E:"J Sϳ X zzv]v`b9  (RIBBz:{3; )BNfίnƻnQ޴ZM܏Gc1G |{^됵{~Ho+K X'[d־~v8G04+?yo>  3-EEw場}iV¾yRw %1nhEaZ^Q5#ԼW)bLJ( 8@&B"/oL2Qwāz>|8&܏=رay}xgjP xΊLjBN_p%&{Pr0(qg4;0 0L}Lb<6`|۰K;O ZBpi;OD1wu.njDw X&@)ۈzyoD+Brur>~LJ{PH =ޤW_B??dg'E6 ιl~DG:'Ώ*8Vޔ2wKI>"#edJAӔ727⃍6pm ,2'r#Ă킞z3yCQ4!jȊ_;g.tu1:`ac.jhɝ[M"w'xk/s^TZpxಧGXΦyKzlDxD),_6X>r!a5E1dzzz ָ4${)OZI]B砮Ac,xi XKDŽc݀lE]=Wc_ sp^xy8q8Ӥjj˭ 0Y )v _)7wau U UUw)6t(~g,X{svn1qVb h׶=wENN_ȘƧimySw i݀2 GQqaa΁i MB_fFfh+F[B8D(>e|'~Itc6 ԠMZ[{JmǾq jH>AU,@9QLľu3 MCA{<.W}"ƉEi }Z tGX{8nO櫯07<W57|C-,*~' 3+++utLIAΟ(܈ $oDdffb|!c VHX r=-ǔEmttPQaafߑt(?U/|XBSi`80׍SE`/aN}dWfm.c_Ǡ)[.tDH Ya?M5-ep@UeٷjE]l ~:Tjަ':~?IO\v}XuZZ/4NyXz^I$EmEe I̪|D煈Y@"Hdeg!ו@cRQ8ȜoDu. @}eY>"APG)]?sɗ|QU.^y'9pEС^{eu(ae؝b1 L ?:0xбhۦ>V}EQY50 0>}s`#,Z}bxEo2{Z)Ӥ f6`U€Wb޽cY`PDD˱{&? # ?!vxgX TĻ?cUV{ ik WE\S g7V1-HyE$ىՐ[2aomIbübvӐEq`R}{ Om>}//4;YpU1ޫA1 x`zo3(0'tj!CFCݎRS۩J"{aQc{FibcTB; |d`I:%ۃe@D<nv ;oՓ&K"`mђǞNW4-7/-I-keiEY22gsAb|N'~e~=<jb9rk aHJ@=aaC,ԐV(.[o~D}| & @ HHqqٗq޻X\FIAN扅xyZF{T[hYYpŧa+?C˜r@J[9=ێK?;5`:}##f|+$q|Z9{pm|t<^; w^sګ*A PkXk=]|4)%XIQphOK //%%%|R`aaaǚuHOig) =E 3b)$sQS<6'اXt)V\'aaaaZ ;:bw`hۮL= 98ʨG{+oKcr> s0 0 0 JxO0dбۍ(>)LRYVd T9DXdaaiE*.[! 0 :, 0 0 0 0 ӂaaaaaaZ0,2 0 0 0 0L @aaaai0 0 0 0 0-aaaa 0 0 0 0 ô`Xdaaaah;⟞_aaa)95uTv|a0s 0 0 0G1ب4 3 G?J2Va?#eM>tX3ai!u^ 0 0 \䛭րc/Ŋ Aɒ==XWX]w>ca[2 0 0 sԣV`k"P2 Mqɠ>= 0L+-aai4gXNE[>Oe*܃aaZ6> 0 0 ô8f)5_ffl%X{XVV-GFᓟ23a[2 0 0 (V~Ƽ1FIgb|8 UUKBl_FG%@}o0 ô 8 0 0 0GF-QH}6㛅QnڴbFE~)vE(0l|4Gfg>?\um"!!K,ᓲ0 0 0alx ͱ8[4\=߮5w+<8̡Hq1]k1oAta}UUU}X}0p8&njO~+K-DDDߊ9կ9;wƔ)S{x(IM6uhVh" 8?0 0 4?jKbLͅ|LLLlƢZ I)JKKdԂJ>Zpx<\Yj1}ԩS1sL,\^/_NO 0 0 0 0Ls /ĤIpc֭|Bdaa 0L+_kPa @ѠD94!n8(0 0 0̑\~nj w4$QV nt:eq8Z0LskCUUUR 4qDD 0 0 0Mnv <\s '`9`HlD$Ġm۶ ônP>m%Aaaa!2'OFqq1F@f!ᯤD&''#..NK/R /11Q $!077WZB 0 0 0Lz!o^& #qair%;"!!63"iM6HJJYYY"_[kp}>_aai \.M&=H3B1s1"TbRؼy"{T|v+ڜ@`D@J1X'nb>V1u"QZ9;'?Jl)DTD{̖F}=\uUoN^@aa/f饗^‚ 0}t>!M >G=zNqC.] """4jhdaEև͆?;Z9lݺu ?vNl""" oۊ=f(B4,C \&MSC гn.w^[o*ZŹTs$t d;];6 o*v-8uH^-X\UqQ ,ر?-p3\_[^bۘd]QQZua9tRRR /o'` ox uV=ZFyS_״0Fw}7[o.HÒĘJ@5 <30??dQ!{Ri!?_FŒvEX+`=T CU,vGT pݵtU,7ζol tM]2o Vfuccyo4 湁wmk'pě ^su\W[FN-Bat&(k>K!"-NaIOOn.>>!M LJA5huavmHгF(_Mh yESШD]H*sЎd@vȧ ~Ѕ`浩O|VUU:^iltM4lAq:\،HqBb*ZgŦ $*z.M`@,R&T})x2',4,0T*E#WnQHG_ʆש*X#kX T\Tq3< Y @R1?T5^8da C{N _5&@&ݻwLAKeb8TTS>5C=5m߀=9(>*mU H Tէ +dBĴ4رm۶mV1&=ž2xQ8$C6iKHԬT] yC5|B"ڿW/N^PP0Lc]Դ34€ȇ$$9aGWOq_);s 0 0ƀ3`ʔ)={6# :K*{JXhz*uTV|θ|xO'V؋UWB^Y{51P[VEl1cnX}9OK*cl?eNHHI5!%3?^!m#Q (vQP+HI@H$tT) ^)){D{+Q[>_nU_" 0rM3qϭZb6]j a֭Mh+$.2*0 0r'GC=E 9BHr%_u2'+@rhpot΍`Š[m։vK lVD*>iWv$Ҵm|$HK 2T \v:n~zٮhp,ˁ ڽ<?;"!A]Stϡ HO+tD4+W42ъܝVP'K@3 sh4c7HxPƵŜÈg4Flvh~Ν~])+YRt,yM;Č<0 0v.yXr%#b0w2G xek.2Ο(9V,(RIJbs?F,AntSȨJqOX݀ `[1MvQuD@jWGGNJa2Gb;%FKʩSXY (APQhnQ"Y*q I 8A~xa?3ɸR3>7_x~d!hX >h}&=XG1i£.뿤kOv0 0:^x!n6x,5COJa J(Ӭ*6Bփ6X_"ׯxV"EFi@b T)r}j[2MYQ+@cp;]>d#pDȩ**hL~.إ} M]Kf?f>KEKZ%yܕɃ}ֺRGa@$Ì?05bLH Guܰ"4oMk?ca &K.ɓet`+J‚ -oX3>H uNMnC_SO "?|~=Ύ!jJ,U PZB!2M3jWd9BneGl,3Td#2_ xN]@nQ")F*S. 4x`ozD$Uz MwWٛJQ Y0 ȵaGXH3D7K^#>aGۡ̾;vۡ6$$1M3MI$k|AA\0mm 0LkgҤI8squ!;;OH3V uj)f>X8-f[⡦&=XWzP\nlPY`V' Pr%w^c"z@Mհ5. c)LSBР)Š7")|R?P iV=AHPKbcGխD  sM$Vl 0k9#/aÄ*:zEEE>@ h97LGb]{%?$hH˓ܰ0 ôvwرk6`+\f"##CSZ%>/$1qb=zn̆*R8˷BI,6X;&݄)/BƦy;L_\ER(;dS"nNn9U(A jAiT"T5+@CI`EY!Xצ[A*_ijYIUb)Ş]ٺH݈*`˸ڵeW `e:6z!bV#`<*?o֥aGnOg,4ߥK>D£2lXL@0 0}wcRlL3)hKbbbmO&ur5܀m CXനn 6O &tسwwwsPtn#[\~MˊG E@R)@O \]aCdl.-̿Z?72T +@ ΐ WE +Zi"`]=V\W)ѰY- u go!7 ~nUDtc~2ѯls~̝v)}KyR5,ѵ,L xK?=|5MIAHTqxaђo=HII_YYf rq'ه+uIh3,# pH;Ւulv7?1xؤe`7XU [t8ˠ?Ԅ>Cԝ)C+zbxEnMw)9z5_OUhX"d\(W ?6-i҆*1z0GN٪aC;d]U߲$ĐhNE >#bbYQXb9CIZ`h[H mgϞN"k\# 1FF_2vɂ2ʴ{>0 0 O{ 7 LV (JC.5m%zGY[mPKw`B1殺D>ŷG(c5 wR)Qܿ q5e6 [-/'8W ̓Ms͑(8~ ҝA,N]t#t/2аK @hK?kJaWETHBn*V$tQ+5 kcH'cee{PTh~!QPzڔ"=wowHsYEp庠$E#jPO<c(ڼPw ~ @ 7[ uͪ}׭=C#P}FBa5hd6ͱiJdn:igv5" 0 Z!oڴi2?Pb.y`+:8qoU5Xd W=n8.(+ʀSu(m8|TX=T{B(I@'pr+B`[\2F_pNڌxc}Łttރ?B?MeFrvB1Vl_SM"`Xt?k-O%CKJ(]Ÿ-,VsؤglF_837 ,Dz]=_"ۖc^œ/VQ)D=P;o_Rzv)vݴk?dG:?+?s} {_C#إOtAk %.f\<'OG;v,h0C KBZ3FCJFaaɘ9s&6oތ{̑V!HjgUO&ճV+0ec% )ة*>=]b!$gG$ι-{f& 2- _}5jLB6e  B+,ɇ.@[p`Wm9 {ݱ%GEc? M%z { .jB Y< ] DHhY תO\@D⟇TYib ⼨z}E^8}DұH زr>f&~p$#ug2"}y! X(.}|j(BZZU%Ω^-QCPJh@t,~ڷ?).YՊ#Ly[zWx:J!}x$ pB5W^ji/4~[CT )EBۤQ]"mfN ߧ,>5݆q"9a 0(5]4#m>,mʥď}j-F]u8ħFhOk.Bj|O]cp3aOx,p9N=lai$%%IoŊx9 Ls8u;xm>խkduYSM ֎q~O{p^!^\\uz)&<Fc~}ژߧ a?~*D=d? vt M۫ Z)jbE#,&I?(f,Zb ,EK9L!*wc˚x";H x pV׽6 f^'kujN8g?,[<:>.ǵ~;℁@;x˩r GI#юs5YpLndgXgdgLC2NuҏT^"4=$bC,$1dž-hף"v`N1iyȹ8M|H\ː!ebvBй_o,SUFUg+͖O[P.Z- 0 c@_|2G,Nѩ=Yy9e_+@  @d:{7̆]M xNN ?C3c eVb%,F*VWi`5eOn5Lzn|a NdqeU, /`RXiUQO}N8Nq܃㦁)/ qJw~ދO+f|޿8[pH' +' ,Å%j1nׅ)8.vqb(T Ĝ4zptâmJ:ӕSWI6vLy sHR8+ Dٮ;tҝ-34b%$ j*>bK [gQ 6XԬއϾ/~"<6ty鄱Wߌ+v?^œm>;D}Ǡ.:d},|V|:ć3j []븺6 H Ponu"Zxnv|%n6z[W4\w,t?>=0>2~- gd@G/YVJ,/HeXF¼-{񋾞%~(&^5iq,BHd]ņgq0a%_زp6nM’ߚiaHMM /O>FPdY4Y@5X M:0QjFԹX2G\ db,d Ȩƒ^+㎾cqFskEqhk16jB;xrK%ОHvlDE|oz\|W?PgVE7<#yEk2qb771=0$E ZV,¶2c'/O' ס~?qo'VM8p۳s~E5 \wV7"MnHY,#˻Ko-iZ8hH.^r]#\G/ȧoLm%6cqn|o?9`(ey;?v3pc?O= $ >xL|!H5@зY$Y <]o|U!9%(..Vr]faYH< $;t =XmX%21h$uU? }qzJOm9a&gϞ>}:^{5|g|BXdZ%*L"%,YjX"OD#Xn*A4Ĥ۔b '\iAm_J-q`bl#蛌vPj e׏wnZYsϑ ɣ0aXmyӧ |ޙzkKA/ApJa"ۺOM9?q_(NJ7?〇tq8=}#~ۯ/,8![jhʩyު}%<_@l9cM4+T_gdvmj7}`_px$-1gQwu3#~KF^#[>n 9<$޺}&ƾD}*'uy۲y d'X]qH|.J?XkRfk[37 >|T\yxuԝ,8\<gpE~Ѕ>QqG/a-,PA5 v{0e%N^u]s;w3 Hˑ/i=Ggz؉Sҟ 7V=*Rb뀲 0LҧOL:Uٳg a9tCȊ[mz7xhѬ-zr J!&7bSi~Lj ipHT-s Q%¢B1uW?&U.3\ŋba8eKxw<|rq&*M.|Y2;&@)g1ϕX nx:|v2~ݗcűa}myeak}چo>)ĈM[ \?wOSWVϟY5;XEHy^~Ɩ|`l$DS#cW%-q.(v0 $GۮZTq6"45,JjP*ѤOC3J5S͠Y@/ЂڗO2Q(ɂOVT:MZ# j}Zv.A6u}I q)vSrg,5"ѱW{wr\ {ھ V,~UVE}-5 m"-|:D_5Q5?yy:uxnF(Y-C" vt=&` m!s?,)YSJ2V'/9;cԹ?w([_o7uh1 0M̐!CSOGmPGkjWr3!#1F₮Jꂟ!=i$cR [Ѕ?5"m/fbkξ_5^?MZΏc0ǃW eՇxzj&;o}OvNEq b%U"z_ãnd̘]w?7=i<=%i~p ܮLba$15y5d-ސb/,V߽?Nsw]T/x^c9$mٻHj.E?t/PUc_jqX+QV`(p-K@|{2Y|݉|q : Fk!VnLmx?D9w\?ϙG=`#Hw^K $Q+s$)WQ][zB(o@ƢzQe=elU Ђ~}.YQ>#=JA|$X|}!nbbb~%XvYDE' Qz$>)TN1b{6.y m!R+Ȃ"0 Scƌ}݇{K,r&0xKDS(U%Z*(FDEЫK//*.mt.j[Z %`zş/өSDqBt΢{,ntS,kۯ@c&W[e zDzBlXͻd0r0ش&b.gM&Լ)_247?z]_^Tn㸮Q-g1nttxt)%}F&`c]C3?$0//%%%J$FFFJ!sΡXv"8я ֵŁ6N(@:wwtq!KwG*tBV6Tw@a>ls=Xk!`+:nwM-9Yz?K,.Q\5liEL6ï̈X#ZvEeލ31hc z' x󱏴5ܻ"\mQͼ(3*=1hT_k0k^6~;q߷㩥Qtx]yۿp󑡶À:i[sN낟?؊C}+b'0xiQv_VN:>%;H:g=î Ģ5DwDJSuҎ_Rh^VjFҦBkג[oPV~-V<В}U- H Elb;G+)S,E_V:P:Pn`UTC7ÏϽgNBK'aBI#l" 7vnN'_VPS߫#`|kgȡi@;WR- QR>X

riyZ~ ;/&ci=HiݻwKb#C'LcqхGϊ'.[.q)ŅH'TReN? fzXT\ϛ9($SHy'eaj /ĤIp 7`˖-|BXdfJFXCTQN YLB&bۖ#~[Mw4C,QG@ rMı'"r6􃯱b/r߆fĹ ya<-v{ꃵBpJgm.ކY}޷]DWț1o+ȝ0=.\S{ɓk'N/3w 7]\z0+GL+Tu~L:j>KZ[gg=OGgo.ᮖݵz R}x~ .1Cnر|2+j;N{|?aL8XG~e{:nY||;˼^$&OՒGUoV2&gbb=hV\*Hʯ!!.hv R`Z,u.\:bv\;lqןKʂuѷq_v*ᘞԢkXt#z O,ەYޞ~) TַONGWaԉۍk [t͸rrfc##Z}i^8N=KWUD/ 2 68mʆ4uPa_IsX\7m^7|oL+qݵ(ׅ{aG nG"!rIAK});]:F1k4g (W޽RoTȯGyI%Ԙ(Kޯez-e'0ư[;o*p }9%a`ua 0 S'K.ɓe,堨ͨg|brD=-zO)!Cd8K.W_u9VRZNp\|5ҍF=1/#'@И^g:b{q)]0yl{YsX{>^fU zCw-_,@Qtl߾}퓒T{f!^p*R/QTe?ZLU}`4 GKF+1HѺnQH ˀ2QȪD̗hScT+e["Jɂ ޤ1#'ҐU !6Xhf"$4ež&cQ,#.yu=e%_Xt@78_Z\T7""""{1P] Kri hTBVݴ[|kN*wn?hqT)Ԅ,N=T9%Ct>R,_|$4g*Hg*Zp1r.vOMc V =-MCDB\r#{ra x~Rbb[Y &t/z% VP^ŠMAW®ϊnxPX0ګ1,: CYxs^5GԱ:uu.*IQ2! Vbަ>9PC%V-/g۱Ǫ$Wrixg+w>frHA&~+vAˊH4*@v)4 V(τE-Su:y(Dv}5SzP{K ˻e|k;8j=!ۉ*oLmufb 1@I#DPe$DZ,BLL~qqqh 0 sK)qkV>cZ,bLy ui\߭ };Gj< uƩ$ piaD$IP(ZSTTT5k 6&]&cGFv5KÆj8]_x~C`\'ʷg}*Up Ec.v? ڧEzh&Y˯ &v&9, $Zb?U+p_g P hŧ+2BS%GatMNDfdJ]=&EO]k$\;?(kP!BŪ/07.鏏2SK}ڌXu1x!Y7{,V"qI'ij澋_EGYkzM X -.ByD˰aJSJ&B>hDB]C[a GB zM F gggK!p[LzӚF=rűm!5a&g4[BQP?7)=E~W瞌u; xqxQ +(! [*wv%|bkq4b %d٣.!Ϯ[&T4}b;^QBVЯ ~]kcm%p[,6QUUk({nIBLXKSU! PINEyEFqEqQŗ_Яgq5҃rUJK|'H3oP}# AJAHi\~}a~,1 0G;G<(raCWzM ?=?czʰ+7Q` vZnz|?g.LCʈ be2~!srX (VF$-]wuK_ "5+ [@?I`P+;0%o=Xbl[fdޏ~~QokzhH(&?#F+{І>#A zMss~p0 ô>9ey馛<ӲaC1q $Թ߯ ]uɒE[h0-F:R`rǏ#P2qX_PZUI/)BmPc_8ɢʢ%!+ ^&UNl':wl)C[1 ـ A#፰i&9!˿m۶5Q`q=vbaZ49s&2226i!_ġ+զW^bEG5e%GYy9V,_?sT@U'1!cjh*Oh(.J?|B9 >h(q3zЦVXУ[(-86l !Bwg?aG} `hd%o}N} #?rp&/%4@uahp Xr%yZ,22]^^6u,9 Nta,-fcjOVߘ`]EېZSPh_T2A#!Т d(E@ HO $yJ((6!iA΃haH8{f7aDrHкsLca9iӦ-Zӧ ie0%,wF,Gv{p:K%w#jOG@!JBK+ e` h` #?JZ#P?E,$> %M8t?M 01a:bed?aԼPf_J B C3k^[ 0%"9s_ ap Mn2u_F<:LXmx` &ɂm۶HpSUb|9!!`i hTn@q(KG~\e8>@R.\ g"fa&k$PSJ ¢0 IOOs=?V :HrdÁ!ܑKؓ Ö- oAUsSܹy!*QILLlv.$N){` r=SP) (ծyXEzR-I)/Y,~6n Glve9ѻw 0YE,] 0LG1cbXdBFq333*C}qΝϛoBll,JKʤ%&B_P ~%%8a4X|X|e.4d5Bnd4:j"`v5/{`w|bR]$ @}&+@H6`/9gbFw~Yc$Vh(XFhlV\vևX-.m7Q:n[4㶺wie"yIJai)_&:u*fϞ' S ry$vI 3?Pҏ .G>~h b᎐ICbch/R!32HR{v? OSłQ✇g>?w7PC* z` T<=좇Yr׳SQzI g~ow6Mbnfggy3W{eku=?4x;KAݏ b[v[&vXʋ PV^M.KwsPv'XX`zONiXJke@U8C $j2zAF &""j. G}TM=3`hL\|."WjR&tyN= G.۴iseXII",,szO`v MjdzRxsGMUOj6_,^t1/B!ڷo>iXTMqڇ1V&'MeǬrʣ')giiiHR6ǚ&HcMN:9I.//gf4cFŒ3ԴjժfN!/??7իφxpיL҆39= ٰ8"Gu{U#vaxWrrJ>ߋ/~O!H~Hɣ(쭞Vt@eyTXn}@`BUƆ rQf܋ld¡(->fՔR돟K >BGaՃu-yamyQ+QS7qDL:z+6o !/FԐy}tत#b.fv].yAOEn92pNc󯮟}LHEK]p8#rF.(UL'\F\&; &y_B&D[1BǤ%]QqWiڴiصk30HɪI|$&&~`lwSSwj !''GbEsfA@I%7fo,LڛBa4TsXkw Qs0yd\pU7EDc|i[/}H 0//c] -0GA#5bl7þ5cxLDDDDxO3A)..V"oyMFӓZz "Z~H(Rەe9s&1eUI6 HDDPv HO54(DDDԄK#c!: fQWzdWJwzcĈӐ E`OWPRVKؕ 5^RQ'P.7tCt, RdS`""""jP.+lX5_jA0CpQ8L8cd?8V~wؐ<".i1( rK"j"##1{l7]wݥZ0Q*;}*rXb͎)&Bc2\6ݺi] aMŀAؼlX1Μ9j3f0GDž@"""""j6 dC[s ca~YQhDY ?[b{GDVBB^}Ul޼?ꂋx4&ҷ5kucM#Ǵ1o9k)14n;-/D8nsw}jHDDDDDM8}+⋥P 9 ` E (tưًPb5 *5 1]1(4Ԅ.D_`MyJDm۪:a QfBsckX>5~.z G;wEȱ;Pcֳ-~d^Qe;qJj.ѹsg *0C| 0z&.w75IcXVK9[ͳ/D#koĈળ{vP }p8PRRƒMDTϞ=h=Kf 14XpPb;Hi&6qy؈cQ:s=ho{Styy93߿?x ̚5 /f ..W^-8UL2,g>ҧDZ z~@6%"nԨQ1c~,[B}Ə[ov6m z o.u]iӦ!33BM^k p oc)DDDDDDDDoY7yddgg3Ca @"""""kGDRq>38O<z),XBDDDDDtR5 {4x$"j.r->}:6n FM;ht4i=D]q1m4dff2CbNJQ~|믿&LIpAf5j I ʃ3迾#s"jn6s9pa#+~/X""̶m>; ^~;Ÿ0󦗱qɓDDDt*Ĩ߮]0sL8CMS˻sQS3;WmZ q={!ic0XV2GDD\p2MDDD-Nbb"^~e,[ >wsEܫ 0VE֠h<̵]Z ڣ<}nbDΪ_/† vCp]7`@A|X}?W"R{qe; 衫 y//ٍ26#k6X2݅ſDw9@C#DDD5Ǘ/[#rn!5c3eVWj{1<|fގ73ؼc3_+&G0Golǯ_DsTZP4<x饗ogPc>\NWqC̩?^e;nŒb}X{-|9{~yx ]+*]I`69eȔSb`2/։[H :a090p9=?V&`ใ[UwOc845cv~iw3=l8|ti"bEvy?ʓpK9 c;a;f 6\ %7n+ m[s,,DDr>}6n f4"0L:gC`=H3H'GV|ۢ68ίVpJ/$]Gވ{Y $t l , UC!:%vaè {oO8?iQ=89ޔt3],#<(v]]t+*0"&3;At#Ń1N"u3!*%)&GkHK.vn&3\  q̀ZTXQd:<9)jGe`хUsp(]CYxq{ }r:p8GhV+*ZYJ+}äݣĠ0U[|^\wu袋p-`Ϟ=,MP\\^lgl>4 uLN=SC؎Q_IcSŜvX+YDDDDDDD'dڴi3f &Mlf 6f %OΌ?fCDDDDDDD-~;1`L<j1/p[I{g0ѨF)SPXXL@"""""""jf3fΜDL:eeejq$""""""f)""<H`PddQss突>nvEcXزejt:)Ԣ1HDDDDDDD͆ V?$""""""f"==.\"BDDDDDDDM^ǎ/?{=fIڵ+{9O>a``"""""""j뇗^z ?<D5` @"""""""jYfG? !DDDDDDD5 3fދ+V0Cj 5)'Nč7ވ[n[laDDDDDDDd\qꪫ0m4޽BT Q ?|L2`Q \.硨]MDDԤODAl|FC 9N>sC9G]&6ajjNDDuucС4i= !:{z^ZBѩkG`04Q>9nڵbm 1#)%f>w$AwL*gIKЯ;\}۷/&O )DǩErs` A.ݼ5BET|k@ 5ԅnu(%?hum;mA~^.[dޕd4!!!I>rlU`@_m@5jKh4GǎUbf hb Q}ۻg7wXu3Kg0z*}Bz@s'gÄDDϢr :I-2/幩j* DDD1Tͭ:E kK[9/!1QaKĈ3: $]1*"^[Mo@Ut򝈎g2Le>+C:= 2RʒKZ qLSy\F'hpD) ?w5LüzeEގvC8_دXXWLpb⏰Tj<";} ]9s_~O?ͮIpPDDD v5O||EGhh("͈ 1&\((.S.nRˇ 8սi~>j7ʋRu-]Z?,M=?eػz%:ú U?s^}X0`n{ﳡk1vϠAD0/c…*HDE^?ojY'Na*))W_u5<ЃOxl[$q̝1czior﷿^%v9aXr#~ݰ{dDzR nrᑸz0CB \g]@1ϣ-kWysbʣ\V;#%SM_S YY-uH 9$?\kGAJpu:fr{S%jx۷o3Gt*N-1O"駞BTTuk7aԩ;vz.Iᢉl;XtuyM $׷Zo0K7_:u°aü",XO>TKNtwmG[RRaiM{d}ew~ڶlO+isO'rdBοM=샞Ⱦ˲y1c&0o$%uw:$MK]ɾJZ%ODx.SR߾y*'o?JSި"4M6Q=+.)V$?7=%z0ku56qz-_%X:?IWʌl_*|'I}sI#22{%]ȱǺ݁>Wʞ쳼GSz?PKHNUpע؛.w]Mjh q_'sU=zT=ߪ&`fuR[5_J+fv4qvT$EbH6YϿٹE}vugM@Bo PV13&<{~_~+@\/T[8kp 0!9W_cR8d9C51zwj}IÈyYԳ5phJ,w6jYX,ۜ4d .TH{;*% +ي[-E*+o\(kZO)*ho#7-6!aMLh;"G)mݍʄ6 #ѩ֫W/~?Seq\$4 {bk|Cj I@@TdZNzZl֕]-M'LDJr ~-t<:etB߾}nz{}j9U3_9pu:Ԋk;3կ6 |je׳ j]Xt gfr $!|4ISU˽2մ_~UU3a̝3Z+)+Lcm}w*jg+UW^qK] FYG<^Sz*,EGQ&߼ӏ!YWmDZ1j&v9SX[ٓ}4H^KWV67%Ęct˶t=8UMYɱjRS;9\Ƥdd-߆ zu閁vm+I}dDVdp8[1zXk BFϮGeY0/fĸ3`Vat9+WK,`!#vV\ߡChgm#/s5~ٴRӇ̌Hؿv6CqԆ3!< nI5nsx~}["4 ꓎ ~%]py}ŷI9wU;m=z4ت0dꌳۆy݁m(yJ(=ù9KaW[7b<'XovLke=%&=@DKs֣XdØ  A1)a@4˴2##ҳ|X+5,b-((kIl6 'j_8$XJ[,hiEQlzuHDt YfâE!tLz_`8}ES }girw^d INj$2|*W+Ufd_x&y߲"ې `ʶDvl}8\>AKy35c.V>c5OҾާٿ%HPNާ$yv%H-Οhm[*OdKj:3|wC`=7O#5{7 "2ڭ[ {JodMQ_A@UH*9q^րn#n2l mFr5.aD]efl;P>ԥiq,]s=`dZ8\% AO%򳎢,CC^۹ Qg Ф 6;-.emMK8nA\xfhyOH&W%rKah A2aCS΁,GĐIuـPwÒ;7`ݏ6j4vT t9F{jL6Qgnò ;QKN]~OU(-i ~<\>]N+ sP.t`l7tJ;>.q52XzxVW`u145qm`<.l# .^3o v̥&fm.¼/78 ?*dC}ђ~GZّ;QY]CL&ߏ DtrF{WM+V`Pw1 =Z'tnq nfu{;Yw|;\ t"[5udln^˺|;\F'ALtkׯ_z7&CYYYO=2 ÕW^+ .Y[PMY7ry%KFwt6TSIo Ⱦ_Ao>/IG$Rj2*(ur#Ճӧ82~ IK_z (+U,C-7ZQY77lJSn/|gc<<I>/wܽ0nU3/oi[V3{$r$M%eL|՟~(iYN/<j!9Q]F] 1t`=]c˜=MM3շz)1OCt!CȕO>X͹_U>Az4E&ёrmQk9 59qZ⫇-S핪=Ym4w-/sLĸJ E*3=o{TSp8Th@q>{P55JA(5ģ[lҽO1޺ 6,E^c1[ {lݔgAhm`(֊L15^*6=ilthDJHس [tT vnKFi]/‰:V "Kqx^+t~e4ג67,&[-(28X!N+r*6]G h}O]9+-Xexw[?*hSYYOUD߮ 60C˫zfkf|;*vy}_`ϫK'Q;~A [W}ƺF2.l|GUC7x`L2EEuYN}t73""'Zy0Zl9UHsԨ*"0e?$8zh+0>&vTKdee{I1tKw<Ǽ.)mҤkʔ%\Z㱒cpBW\'O=q qh?t\Px;AMTc|p8*Hu"$'8 I7>yEwa]x1hAVRD~I%.m,}9'?zJ^d] i:WM5Ǻr?7uAăk.3&H >c4-~4T zmF}'Jl¯[hq0èrS\#VFyFjڀJ*dw)1l:FT `%GQ Ezr}@rR(6>G:,ڏMU׌uN響ӆ i-z݄6CqldV ogĘ֊¦jg\AeQMcm+F~qBT4UZs0evqfiMGHoۙ!D :U4b&~7LfBFTA+2y{}Anڒԣv}1._u|Hm=͗`Œ͚ IǎԼ:`!Xhfû5Z޽/֧:j5ʝǣFaAjT=gc)6SSj$@?zA.UkKKQmz##j=jr k0Hڤʤ*j~˗/dL/-G1d`u,U~wPsyOme7Éq4w=2yౖ)Z#OԴ_>r<>7%ڝr,kj@g]]U\r~3'0x0VMѓ; T{Q+3E9#=koێa[s0Wv1lwd(܂i?X6X) ƕU#j>CE g =iB±;: ֡BMV1R.-c1.DkFM=lnBT2I:!-X!Y68M8rXbk t+'e0` `*$ah=-:i,abUxgArFVw#2 I5'"j?.ôiDpZ(Q\.[(X (UbE~OԡC{UiA_6ws'Z`$}ڵ#Gtp[GZI@4t:k9nOVL2wyۦׂ(|T~<;_{G]d֠>Ogk73IV[1վתާ#HJ'_V!뮯_?~.U |B3U30-|9JgѵMüJ3܉w=e u^턡#uN,YE󿱗2i|dšHK >`?ND-ō7ިjM96n:ή֤=v-8r11{^u|vg]՚hӼyk@ǫy˗PUۆ$#˸++T]e˽GΛ7_m[֫磼GQ Q޽{zZT:%H(d{iJo9̛?\pZ__koeRS} s?]qW֤SԾK,8ڢE:d-^MEC%#[W <{XƎ6YI^6lpc`;q>{f]%%#Y.0jb8|h\ah5 K){ZaCm.dE^^gR4%KmYEho9}mIFόHmZ_@V~l[kI$:Hv=.˂-p.3wbC8/vlX6UOaU;I>Z}vl }3.[(8-{q8+Kf׮s_7Fà]yW,ݒ[g`OT!S<:@_S[WjJ bmvA~0;0j(L4IuCD et;]ގӝ}?|,^DxŕJgF̙ 7V[_]ֵ{Dǎ0~8Omw- x k?C >yn7nJJJ1ǽۗS'4h|[>%moSn_={e_{uXcW^?> X/نs?}7)h Uɣ^xoÛ/]k3EO{ۖHqr_&Mpm}K<u 8{~ї8ʱQdV,+^CE?pN XUNj@R$OƜڎM뗷|kUT7ǟP.їڼ2O/ԼM5کCVT+\;o?9\5Y] ޝ\ⶃ8gHĴ GDGH~)aw +0e4WԛºB Dߛ}Y=fXSҪ9 o¢Cd U5QuVȭp_bgP=#Lڲ *%(OGdh߫م_3pi0_9l[vhD UO0;uE__.ְ ™uXuK Uk84t7yv$KY5ysx ]iipΓVH6#c4ikoޙb;yae{>pcu-6nT,MF\y\}_BcH,|lMޭj{,j0" &xˠV;#^+G ]\5WrХK|AA37bhL lv2XhQaNj6oUŒOB`_|?sQWӦ݄#29;S[}ˆ$^]w]y:t{" g^kE]yr5L00[,jާ9S}4<,|"#"#٪!VQZV <8;)Уw_TVVxOQUQ6G!6-Z)q^ma6A[*o~E0$wSPeз^V'rTڅPLlf&#/Wª]ˣh٨o.Y Sew$SŤ]̚5 >}wFlW>[{1g 6k ϖ9@qWȖ*2<3z_|%V\v:iV,=wcjS٣NβyUs܁ߚC9=Q3nγZjw fti[M53] a5gcwˆ5{My0 K*~[G1 | .O܀ ] eOd=t4eEלiAk #( m l'Y[kei.fJO=z~뭷6Hjb{݂SZqWS/7| }xo[K/+WR{$V_ X^w5joڼ ]z5yY@],Ʈ?`[ 1pX7Ě[Ôt:~?Vk#7Qߩ9K{l-tKSc6I^5[QQQxpCXI@E`RQ--tPhBEy &vWS'QAoPe$ujho##b6UMw^-X{!C;w.,Yٳg3CLOo6aА⪀fRm4h 5gb>| 1c h۾C;?+ͪIk;UO?gpyk%cĸNbP5 `DlypFv9^ufQ#"tŲ?aKУg/'VѪbJwyC ,M+`[ѩKͻdݽ vg"u""RD0 W5֦dIF `r?VcB|pq8il?LVڙDEFF^|Ex!DT M& ;lܱ˗ɓѡc:uҢ!7(T҃B*(~}vYmʣdmmHAð嗽(sz7:DHϞ=Us_cF,&`0Kj"""v7 1)YMDt?A@$'@jRִBYe󖨱۷/}Y@{Ųe˘!DMDDDDDl(S1!6dYM0ӦMm݆ 60CI0 12E wkQ]v1C1c#ņ+Fk5I& /Ĕ)SpfQ 5>,0<UTb5$i{9 #G!DMDDDDD`i}Mb,$g?߄60HBw}7믿&@"""""jD  6cLT"13pE<̲2Ht F<#HMMU~)DMDDDDDxmhrWm=1ah7l| *Sb`֬Y7ߌrf Qs82 0E#-*B-8hT?ٌӧ3GԌ0HDDDDDVcBj3Z%W^Cpj2SaǑD SUÐpd;$W xWzj̜9N'57W%.]mc C~N{87 #՛$Xh̙ !j$""""FU_m iHMV=Cyep0GToڶm~}^ufQ3 5>.r#3YAt*ddd`ܹx70C9Z={bj/BfFfF%y""&_~xGOb ??+W,G#p8}s:gn8cbT$g6;ca s`9X޻Xv9N=pz,x+FDDM<_WG_X*e\:lv%ߥpj:,}jUV\ -6hYj iK.☿ˍKL~?~BXrP\4,֝x/=“z U쭛}FpBwGEرl߉G˯e9PQQ`h\e(q[{|IWKTS9 DD<ϟ7lNs%\ ]y^-HrQ} Çg,%}~<#\}c/ _B´څ}^N.OujcҖ:l 5]fڰ0dLw rdiv>.y0XBHLKCZRWsng§vbd`wַ%\=xuj*g򝈨%%P/܏9+r3hk(]6CByCIBeXa e`ԥj'nH 9ݭ !j.r\{۱k.gjX8O-9ro:~~z3y^l;jǠ(OC|\l:#, ڜ`u8 t2[{sysbކxZSyyu*󝈨E5.;bu]/Jx ~t>^x8Qވ>f=<aW0"8EVw;P0NTg\s .L2G."jZ|cIŎ%puS7?-'tD'zu< wMoI=(EK[ʞEU-"*KQ6DE6Ȑd=eB3Iґhh\n<{O{ ~LbŰ}1x½6:Y@cp7Wf`cBs@'7,Ǫ="g=Qo1/&Jpa0̸fuxq“_bJk|mUeXs䆰 (-gG~ts%an\4f)r nOQ.30]ҥŭ+riOPm>w}+w$D>B펔#`;x/|%m*ѡ!.84vBț}1S,v:Bg8- vжh`iE?}4ru2?mk W#y^/=usZhmV")&f0PLL cHoo> B / J3N\-!GUIo!(pY%XHFUG߰j x|*?,:ūOÎgj=?Qq(B>'Zlgx:jNaVn od\]Q| @L²Xx z kxrls楩$;uư~U`JZIy_5;y7/>xe[TZ7Ӷ)Q lHEL >sn;Hz \Hvbݻ㎾0I.hҳFz Z,]=VW~Už_h޿2LRžuX9'OBFoSc|citij8NmZYvFmw+NTx^yDºj+#xrq|K}:VxMo9CY'2<){ *zjWժcmA]5[쒶Ÿoyx^7Iy .o >cAm=}3ܽNb;GT ѣQfMQQQ .?cjRpQ8T~k3[Eo?D :y:_KkGC{vƶpwz:6C~ѽb189r /5:VkV4'ƿ7PX>=׿ ^9y8=&`@u q5Ǹ!U-$Ef%]Vm94ng\Nٟ? {?1w`ˆY]XkA2Z6@P13p(f.յUzeHFO nTM]jO]3apĹŲ㯎BQ=0~^& Bs`O9w!vz' 7Jy>y h6 $PcOV?#a7Ǘ&<"2u490 {ر| bDϐ0aŖ `Fb՝Up'##xF+7[EDH-GeE^>E +]4 -ʱ'{NaEp0Wbˈko}.t,󓛈P۠K-WF`GrwM 'sBfùTh*’ܻUE M%6Nof+Tмt#>9&vU | O5aTl<5egXvڣS) n7j6m^G=/X+z=A 2ͅO ubWd_N"2qP=|50&*RʁX7K೩(Y౶Ojul[Fy^Yl[_" P >3*9BD2KTI&bŊ dxaPŸ1mPu8X8$ [߱ZW9wi.QŪojko4# I:jo3ɪFֲ>{ D.TP궚Xta.'Ѽ/Kȉ/)Ѿ褆ɑqU 1tB*b^6}WA*;Fxs}~?o݂6㯷ė]a3o6Ǟ ^Ɖ^y>"MәKu XgOrccu>]Zqy2{^7kP7v'Md[яbh Ix<ecllӧ : ec^ sQŚy2ߋ-gT&XTj[=8p)!A/n VS4) l8|,I0 ]]9,eOY AuM>/vOC`ayԐeUjgk/䈝4.FP*Ta,._yO%G\C_ˊMs AbB++ݽ5N ƛ]#jQ|&e25U,r~+X['G+jy<-qZ,2H 񽻰sD;xΐ8"]Xh>|8DJ_<hT lAUS|Y5 +To[3 lЪ+2GTq5 xgS }kfu6IeUȒSW4il]I`gD]8QۥJ,Ц& hA m lyf݊,no830GatSJpc/Jljfv~櫺Y[&F#ѥ.@V0q,@3O5_ Nh?:,yAM;ڢGt%Ŷȓ{p"CS[q{9;}?nT V( >]52OŹ}p(-[yXRȱO̱`?_9|1f^<^RXH"AޔP"N)rf)qD`\zӦMfD+2xpIЇ8^jR G2ΪFCثFF_x |!լ+FYua4ME GݦJVk=Z=uw]|gMӺ%oBZ3KJ l\{ |{LXXs9fojw2X:y4S7^Y}HYOV`%QS4vBzh0US6sΟ}N>|{T6.8zhj8.$L;-?۴(]ʳ6 | #?O؍,*<}ĭr<v؈o'dl7xoLg&y{v-S1a6w;.SЭ<* NF=mk&IHa~H舅 ѣ;w~J-Ii:@O+ʬjoO6HOR u9^iZJMIƵao*U 8. ^ؘ(ԬSJ{cp7"}PO:-h |}^t>mh(3Uܾyo)t|A5JKx'Cc{q޻b5WUư48v~+RJb˿+WQWuŅ>~-PVݖL6x'CĹ+qΎ0 ;FGzUUZUwظq#BDzy*K%sGy#AD|8\€Q0HDDDDDDsbbj32cH՚ oEԔT) ޽;z֭[ DDDDDT|Ѻo<{jQbLJP9s߿?BCC"z&LQ!˗0Jnmڴ)G1 D̘$""""""*$ >so߾aPD0HDDDDDDIR|pwwǀϠQa%d:u*,--1h $''3(DT$""""""zILMM1sLT*1 8)C@DDDDDDY[[cň'|=7lHDDDDDD~3gBV3(D0HDDDDDލ[,pT@ͫP\} Y '7ߊAp60")M*%)V0dO"JJPjհpDD/<+. uǡ{`TRj׮ٳgcԩضmBD/DDDDDTc!7A5LH ,ۼ#aHaJHF0}t|ؿ?BD/BDDDDD^ZSF)UpM;$DD"sssoJdҺuk|=z4Ξ=ˀ=#333LE FpoB&­[oԊ<-]B\Z} [t87T|ahc ect_cqJذ6Rj5B};>v>}`С~:BTcqFȈ)&#tJ,=5k\(oK&r%}޽; {1 D%$AFlDDDDDDD%dhӦ pJ&p[QPNO>>߿?"*U$""""""*E!&MGGG 4 cC@%<-&&qHKShDDDDp0.R!--MT*ЁB\!eƘ5k!CʠQ zF󅩩y棸իf ɿ!3>O$QY%eJ=)C@ 7{9[2GDDDDDeO?GbԩLQT, y*̳[it~ [ Q$)@T`…غu+.]ʀQ *3U[CY#T-u!s *+<==~׬Y~!2 @*^%/UGz??#"""*uC#STvc޼y矱~z&Xtȯk?$a exq8 Cڸp)UWɸm-ؔ9h_qֺz6q>R߀Х5Yk ٳ1gܹ!22rMV|!|/ZZL~k6h/qP'! &b8\?v "K^7ن1k,=xrCu</߶os~كD y g^NT:թSsel#uJ=; +&pFNN-;9sp,Ls7hS8/YUBXf)l=} y6ƪi?|5hv>ů2;qx*lWLQ7MA8:m8fJ0@joNXN OX۹3d)f6WaO!oKS&_%!vbpTn"q`vY yݐDāqR8= 7et1u1:(N8ļw(No{8i j}+*Us{Fhߥ+^})'^30`,c nnpu}uY^rGy}wTl@k)lws7~=L/[c Y2rmS3coa^)Ig0dDo1mN|XWgTcDr?͛7Ǹq 1X' W7S=~N0QD#5ĥIdh ZfԹ}s\sp]xXvT05x1]6u OM]ȸ[~9F_we*HIܺ`Ljp|:4|pC\;o,qn]5Y g\#5 fd>V`{7o(j(*7CSSnB[nkh2lJ]25[v bRm\(IEG͒>ͶF`¤Pdň=s G`*0?%c&ccg .Nڂ #g9]e]3>۾cEG{-g}bK1#LS6/lᙨҖsf0}.†50rOzf5OL9c@Eü V[g ߱ 7; D +dDe?WC?P;D͛oaÆ?ƥK"bNqmx]|L~[g?c3xVq6}N!6ڠ̚5܏Nռ`~Syc)z3{(X<"R>6>eX4'ah6Ezz4>X=ŘP=kG`^0kpd?}r½6:YT[Wy)\[o}HFx=ca9~8!N26ě7uRDuY ~8z&Q U܋ڗY dloiGMWCcGՁ!r}k=#F;tH++h.=ud3ˌyæ2QڟmS {g? oK8$\{YΖ-`Ι.#zTNZ-R`=v7-M@Y&%V1Ig.K`$jYf%;,sy}ѯWtM͠VpOZ ZG;sXzUc[CF* *:Wkr f M_|Gy~^VM>xGh)L}[yUHKK2cI4J ^7=#JӐ*Wg/7 d$)(B+qq168𲯃3ɠH˥W9+}!rr~ ئ9.Z4M-3j 9Ru^+UE³ \ͧ*TBsذ1bDH3[6G*}\sԪNuu l&{Ct189r /+]psH'!_U:9k)f",_0#qna #_VOVUٞ#̟fcQWh m۶@ ZySjU[PFeH>kΡu`k"pT6f^U{+5c_]sN>)̘yxd=WоnYCfz0VШYvu}|˺N'إvl[elOj09=>oۥaRis^k?aVzdC.OA"ѡg6< Zgy;3¢հq83}dFAoxls-߫$C+e:zݤ糌8|6>_L;b5>F.ApnGr:xs~ YIm5'n')bC'RU$pZ2_Tm̘W~W=4q8|?uAկ!fMluEra/a1 BF'mP2|6ny﷊⬧fo3c`1hiʜ:c:p·FCvSɈzPT9^S<4t>|86m*&"##"bWP/Pk[x| J vJ*ɜ` #RQEJyJ%b {rlTͮjiں,.؍褴"TT9*z ȌJ -cnr۵Sw;cLHo9'\ D-s.hz,Ǖ辥lAo:|>cȾLHq`qo [$ﳶcu^AG rsUSn,7SʑFF)qJ}qZ0Q%zE޽=+e <#bh gQ?ThE?4h/˺$9S<ܻaL >K?cmwRжV: ]$tѹ+釩lpcP#f}[! l/J97fw׬Q \E'm^2~|⬧5;᧹v:QTS Q$ɵYɈMPq<.x-uMhرZaP 4k}C6 w\uEFZB@x%=@<^]/`[feOށs$fи 6v'b캅T[PSg$Ďʲ.w$-`D?o"}cW^Q+s٨RK7ݺ)l.|^^vb"I]iަNѷκlGF_0, ai 6ږ?q5G@.Tw `"$Y-q@*nx=^_ -WX<+鵌cyQZEiŊ޸&%awc%l.s̜mcTr7=jԯ'!-3\CZ_Pg=Uʙ>Z3wؗ϶(V]}?G",}ަ-0h mg|yQP1'Ƒ:j[<ܼ9bAX`j ieqȻ_d!"0m4888`Ȑ!LQ,DzE}u*@Dxq tiUbY4TU~>b٘'킖U K~O]Ѥmjfv~櫺Y[&F#ѥ.9!_>oS8Zh\9窕rG&Vg&)6b9|᤹W' 0ums%yL~F̾3Îl1Ouò77 F`%£1$5.a~ ,1o=;%cOyc3GH/M))?]\dSE2bĩvT5^> 91(|Mwn^6DžNz[(7 T6iXF}3*qP#nI@&Ar}́&M]u.fv-aeH-'8:tmI[@%\>=X5afޭP{8w5F$6(`fn 1o2Hk55{1'sچ6Q{zL{cXrB90N~۱e(k~Yئ:Y yGy PR=^c@߳^0̘1Cl8b2(D`yc`CaMس7I*x6Y?S4b5ǸxJ0W۷ 7{4xu ?Zջ`FMm >zчhJwV *sX*y*N ۀ;r JX4f/,݊X9 |=Q "MY5j9k[J22]g  <+tݬʙ퀙}4mͻ Pn_n¡f]8?wc\⠎Ź] v\o_ V® 0c٥9fM9ٜ};b: 3g f}mϱ>{$nބV͚ ``53^Ҷ+y)y>4z #_Ѱx{&`h5GSCmӍ!t55Bg:IvË>Pq-Fsof덌۸t 0pюbOZkJlT9@NWࠪ.>n DCz0nWX"~G۷=BD&xu\W=$Ke;`OT|F>0pCo˖2$D}5t,3Qyٵ\?^www,Z6l"z0Hů䩴WŖ}m/WȻbg. CIJb6=H}MÝ " ,k׮e@ L&Cl\ Lr\ KBlW?$V`H2o &"""GRāy œ9s?`˖- bquuǵ˗Q~#笄Dl(M[*5LOe}UhSg AJ?%B_9='k1m4?"WT,>~8z0{Uak琫U_AH}/Q)O (`R&(T ?F믿W_}!WT,R4|1nݼcG1DDDD;$"""""2| 1h $$$0(DD` ###̚5 RT|oJJ BDT)C@DDDDDDe9,X &F$"""""RK,{ľJ%BD'LDDDDDD/^Ca޼y Q ZXt)vQ11HDDDDDD~gY?BDTLJ|wC?l€=$"""""Rz1w\&J[QѠAL2_~%>̀&Th֬ƍ> Nb@JDDDDDDҵo#FQpՈJZ-J%iii?JeP( 3 w޽{cȐ!y&BDT\VZjDDDDDHFP2~CF/c~Q>}ЩS'aaa sPO>V#""""*EJH g$3~ҫmСh޼9Ǐ3 DDIKJ$n5""""R\_g`ݞ?GHH(9bJ+5zHRL8nnnbwy=LQ׋ ^-FFFboo ܹs1ch""z$""""@₅ b׮]XhBD0HDDDDD%Z_׷ k׮ůʀDLQ׋|! Q[gT3S@)t=N]qBPnu`ilĕޢ~/_.&bJ^XkP7|\·O}v]4E!܀%jժ;wx͛"R @"""""*zO-GÇ̝ԪUK|ӱw^`J^*b耚Gu/ȑKx[}KR 0i$L8f@J&D.ǥmTB2Tmo9Ѷm[|'/p)2DDDDDTH|4k \ʾ"y5T"tÇcСLR g%l ,V q-ſU*>}ʠիz聁޽{ =WVVV3$""""rMb:LhBB%=x?_#L!I֭7jEĖ.Ax`Z;i <ZB~΀s'3_̐~|Fr{;˜0_puue^"ӫؽj~5zYMCb BuOVV IFFF9sAxگL@xм]H ? Zn-q?|^۷'ʺuiӦ055%(4M#"""""*m1w\eرP( Q`>V^-&<<9&mJDDClڴ?"r <8qoz TO؉QZ|||R v`km42CcGCfp4sEWTA@ 7nL$SRмEstO'i)bs(M$<"qt&쿝|{'Ybٸy]up v\yȹI0#EŚEwz@"~1y"_7YR@>6Įf\L)i%=ͳgq/9h׼Xv3^j٥?S9 9Bm˖-ïʀL0}t$%%; 66DX}T䆐 T {;GX[ FF kjb 0>wfW**v]=()8u4"?A`mcOGFJJ^8nfi0%] gx=i|ձF(f}y _6q˕B]jڇ?ƾ[I)*ӥlSDĂmQXU@_`::~ ̄_7_.'f~1LL]īN+)XvW.QiaXR[skQjT4ժU/ aa:VZ[;;x'NBR 0NNN051CJr j GcFgB e­ӱRS$H##i[yø pM\|>>^"&ĉKlMaܜ3xkVÇ4v.nyU}y0Q`#Q)Bp8XQhY*:~^akSFҶzOD,7F"b|8VWW'g^#!X:?"B0%:ϲJ`a000T*Z* *ixKSA;08sJ5l+:VQF fZ$%9~4ڧALM_yC8艹DzEItCLoǼ^ %H.l[)Cv`SW4׾'1[^}0 r\ $k9z3 bxÅ…q^8|C/=WITMEofXYGIE :$d𰑥/%*7/<զ巰beYz-'1G#8[PC3e8jevvQ>U ?o'ZtًH)toJ+ ڐTRF`YP;jvsc+ġ]GbGFi >3\x;V{ðORdCx`2m߉"|ƷD-! }OO%"scq0IWx5끐7ې{Ɣdgp坸D]pc7ee ?dgx$YCU}ΰעX6d3;{7õ<(0cR_;u)v\b淹7cVo ݔZ%R&q=9r%DJd؃o5CyWmѿӛ$g/}? )LOl܁[u'b}ػ'|ѽTo]zQ6mx9!U6Ap]oDoC}LQ"?tо9mDgյ &}č|%HO=YUZzl_A-U ]cƥGB8XQ~; #s+AV.n[ `k]GE3~n7O>Mz Ljԃ<C5 ?@7_sE.=Щظ{/vA+pm-W7 3C+RmБj@Xۡޅ|,%J+ ˤy5AݠЩzZ7])FOmQ3_ǔ)S0~x>}BBKv 7wwxyy!>>h$.PT.,zůJ?/=C"a||hn,LNicXؠa9|<+aSmQ7 ^}c͸3]Sz?1;1aG4\Kup@Thn ?vcߣ,jĖX6-_,u;f ՝vn84cɈfUUx37/x[8tWq DP.Զa߰+ztnV[cd mrت8Uآ py_A:E.N68rJ+ HK@3ukYmCwMU]||6~NF.ë`ZpiB c{̫`̸pSD_o{s S +@ͱaC)B ={OôQjީdB0k.~9LzP1o"h>%F o_;kl1>Nl}a]k:Hۄ@\ ]H't†  6t ҞOH*׫vb,Mo]Q.fbVK4i^MP7h|:ڸz.ծmt6䮑#G$ ~ ;o֭h-y=QNv(= wz`_+dgI$K,}ޛ sL'g@fF&r#G"--djv< plM4Q~;^XtaN.\>x#$j6gcY;D O?ԹTE Od#1KnpK8JwkWJŐCHG^%rhPLܗk'ѽ B"BUig:Kea^իW\aCWr0&H]eɭ%H.}nNϱy۷ڠ;:T۱0 ]jWF D`g>Dc{6y0Ӌ|1 ZbH[g.FbВx$ {_~QZ`IRT; K><4f`ʃMb&2Tc JJk7U#OXmf>ˆRʠ`މOM Ѯ׸NMNWh`ms/crrO$J<|'ҥ D A9_|P/()ɨ '''3gii >_rޗ^.]^:2浌{]5sۉ{\3qAaQ{`c&1kQ I(]9$] nܖBB8IoHOozQໃ7pp-]3O6-rl6Lvb(4f|P:-<# ɫlt?~8!T&}q4JW?6\VyХE#7GCƵ8=o@< O#={ |[P9V|PVY=pX H9'[E#Q]{^=a H,KDsֹr}moO[8G!}`V̂" ~ߔ~T8RKh-aύqZ6cbZC]G`(|Awb'CA8F,G1;4*πyh[13N2UizXLU~LVQXj5C$52Fc&&b*CmmqHh̄I'OFf0tPP ^^=R)޻&̂T_ P(WM4젗G=/xۘ3954{fc7i'<=<`ee\XXZ"+;wޅoy]ah?޵pᧉfڕKw_̜;2;Cy*;HW+ jZ=2;O5EZNө|O/=a֘_bT_g\ӆz:0Mi!߰8M+E-Ơ>R gA*[9:vm0hP\bR.ah8^˰} :zې<Δ 1<[אyn$7 Av9$nE89֟YC-GXi 6窇C>EG'ʪXӓ!6md9N[K18#$KXHB ǸV6[ŌXޮ7x.O2~W3v+3G8rmZ3\>kӱp f| $JK3:ۢ4mY.>e'E-:AΕwbw¶6v-cƎT_TkT=7:Lx7DY]/ݭ g="G`L 斟/]'j FML) SK|%f?tToQ]ǐ6Y/N9x#7s{>:vf_Fs'T6m|||0|pfAA%!>>bwozz:l-yzxÏu={%߳OOyI29T|!%8O CVpuu­waan{G\tF٠Wf&̌ـ}pĮkaobr@.DiBJS`oqd6ktX"[s?wᣥ輼%Z;=.ţs. :Y_[z}+_2:ᛋg(өϊo&Eoc:eK hTk>y8莛_^vF@] @IU' s_W뢂};$aшZٗLFGh$ 2"%n5*-0{m4qꊏ8l_Ye3ov-Pkhh/J焮+wbp)g J;KvQt!#;OzKuLYVcXشDO:mңʡ5:=ы.{E#żʆ\!}L[} R1<[}hwk O\8:ty8 !ehޫ`kxL_ g Q !@(g%p]Lcsi#~аC+oNóy4[V'ՄU%Ge &-_0UP轊r4$F:Azm>Io\ 4gVn0obRDZ[iϿzLVKmhlh(|19}أvWĥp AV`F$,Y92jڴ)E$aƌJѣGs{A/<ٙ{+liB+dBfLz*XedB;{;nzT&Цċ* g Y8p#/ ♦|}A%5kn_hE/:u*7N! ^N^j ID̆y:.\WWWR7RxO?ǃL.7BYZ@%Nz*(s[?VE+@(@VF.Y)#D`5[/єƖAOE6n]9ǃ9 pDPYhiM6xa.[ /_Ɯ9s," %7KS3Pܷ̔@'Op{F4k(^\5\ރo-/3v{=Qf,0T7T2Ҷ+KM3 <\$~˱g|$ vS.U*է=3Wz/R={'@prd)}NY[k/!"{q3I%AAAVZoƍXz5 xbn#bJe;BøӁq^|_> hS"h-6sy'!+0ʼk۹ōsʕJ.=BfAAubժUGA,Ob?W'..n̻JR@ƨ돌k7C}1OKz?^G ;J({:fST\T(aaaQtd    [BAvz{{#7'a'W(}- VJf豳X3/?3u3 Kw9%e^tfJ ٙydғ9xzxAA&MpΛ7۷o'AR;v1$pˁY[W#8,s>0d`%53,C[[P/$E?s$ Bd 0yŭC[J6w3fu& y. 볬!y7~ji8q6l:d,O_xvgr$un2PuMMvϋ^VNպ ^p0m4?G%AZyVVV@^n͐toc]tR\Sǯl@>,A5q5(^9R`fܧl܈@LJNP)Yˤ>AYS@YqSM7H0*Ґ>zyU/s9{2)={HA<}ƌ .@ _vt۶"A\xCuݹsu`&6Rx*Xg]JU8߲ܽ{nD{.puv\VDDjaqaOUt2lK P~ xA8p  Çݻ$ B/]xLKKK.e9i42hUR.<ێ¢czϬ5NЗ_U5=|,{j3+$>@[!\7'2/KCZ7]6M\%ryPc4{GW~4//,;W#M?C-T5Y<ɸ()L˛g͏TgUф 3^m~.x< #ʡ^1c^?sxx ݦ[XNJpixpy;A<ϻQ٭hs[e['D!Z~GtUikֳaUVvݮlzbPݞ=EF_/KDV:`}A5ȑ#ѯ_?rA4ssstw`iaPG"++N圁|3-^6\oPFOXx{C!(,,ғRbrYLqݰ}[iшTU)Ĕ<ǮA8_3اmMـ z ӻFb<x/^ꎶ`'E~z8`FlIS:tKk 9t*6ދkc |2v,q[mKäѳ!U>B<mgEulbUe轼}VljCk1)cĎ UT3}6ߘͰOvJAE;'u.cq(QjL%_]D?FE~ ɫ.F;XLɿ/C-sm:ф!q7x 7Dܦo1@4 caNg9SdCxoؾ~!ͷa|HĜ-."sTa֬B,ې4ظNڝwO Q_a =X^ CSvŘ@w^ m;{pF,w- r`\Uhn 3vXnСCH! FH"틸]] VVN}he}Y~R^[+V}٧9[[BPU^@H2<~$pGv߿[nۥKk4v!нK3X"}=RmJ;&SB`Vv01ތy|0]6scvbŽh苫{K ؇uG0FθkCsE}\`#]c2jۿc8b:ٰaך876!ϯSv!;'hn3?m yJ&t.u5Zy=dQ:u-c͵>Х>UNL_rźMy2cw1ky6Dv&Nc\Ǡӑjѩ`D~ ~\ "^}e؂u853F8lW&hx>U;Cʙ]p'Ŧ3wc얞p4<:} -CǾ AElGآpPhþaW謖mYt ]od[zڊ!Ր:T[jWjtۀʠLjha,6{޶H> xB(lъwێHgl;׎$a'L:AAA1b7Y  jKHr3,--pؽoߔ P&RjN-=./ggޠA7m ~U8>&ĽtO,faB6>/sn[Pt j:ߙS $!ȸS[&{7<`m@Z |U5p p RVڊ]njey(8n*Ѯ]-ɢ#Ɂ!p>D W˪MX,;խC^*ui+.L5U,;J#߽#k_!cp9$u󆼆f =+0)U;YHG^<Q[ pz0V8U~CPͼT[0aZQMw^ 9kR_F26% tt݇HƮʧ^Q7{lԮ]Ø1 9 rVۣAH܆5p1ݷ}/Tb' #+xudrC}.J ˑh g;[L9r!?Ѽ"fH,3*җo!ǹ}+1Ȼf%43)!Wj!+*<PR/Tlx\z6qiqmd4{!SUYRʘb ְ~dFȥƨn4=Ǿgp](j9ݼO>Qo CP& cY3O;k\YP)##Σ:@t;&v.< F"!#Dnr'YY=TQVϒ\^+Fء޼js"D]p9^D~08( 캃]pӽ?Al+,X58  oe7n33 k+k6SS Bd2suiy"vJ x6@ !oǍdط6oTH*ŭ1sLgBuZ v?ܯBD)ؿ';:q(3-s_r]?hOg CK[Ֆ5m`Q*voB2m@~.\78%W|\_ռmP/|wvùpB_RbV ?tƉA3|u1F.SղR(9Aȇ[eq ~Kw)}`&7LPg΀rV4>((׹!:u2mOb{鯻bq#7Lgr3$jSClNуP7e3a%NwCT@tۿU?]{۩ATkkk|P(O JI(AD=Ϊf[p!ƌ͔ppr➲>wI))xWX7PKJ(+V-2T'zCucq&s br1zΝ,|Z_G{0 +feGvho 3F= gA*[9AaiT-o7E~y0kLZ^/1/̳znOꅎ#Z0#<7" 9X|7vM+X4lT֒칔 yoJ"G`L 斟/][Ceg"ԡ c\ꧥeGh/{'vAO#1sB?aWGgO~[0ҫ[yMm_3%m WLF  [I- :lN`{􋡸.Ť~u"E9w$et sH7q0C*mhkˋu;?SHFqP\At6^/}릀;8=0,_y_BA9+F}>iꫯ0aˋ۟/%!Xh:u . OoXةݕJ'& (((䞎fܲCLL 4hT./SgW1t(z~t<UDWf&̌ـ}pĮkÖgJ71F/[bةظ$ gF _N~hU^tU&3~<ei90|OBϹSZ38At&xmQ|o|O茆o.B̀J%A>3 6ȫ4 6'Dpm NA 3Ayzm>Io\ 4gd2Tv&V[?FE~+;"?5Cl|g>Z[ 6h8wǢmIϯ=g<(ǩ9cL>`w:˙f, _ ĜT,|"0U{ *ڷLFGh$ 4Z9>ߊ3䘁'rOՄ;7Lg!6[U3]1к] 11eC |+-~}NI ޿6M󀕦Ѹp3;E@ ӸxTggV'%;`'Й1o*+vrvj=xc7ipҠ!5H 3|}V-o89:qK\R IH{ɩ(,*ea|& /'_^=.|vy1;Q(rWYG LGm=͇J 4\ocy%) J %LO֒f&=yG0^Wܜs qC xDCAa'2ZR_ORAa;%"d/~6mT?SN&#)!R \ApXm7GA^֭#A&3}B:X $ׯ_s>}W\A`` \annBD*ED}erssI(ASAAA&F,cΜ9ѣQPP@B! |AAA0337|-e#A! AAAˑC*P 9   L~g\~'OR$A AAAD5qssʕ+% g HAAQ c˖-# IHAAQE??Aij-&  %KJ#k8  U:88-ҥKuV'AB&#Wb|6v`W y V HPAA8ɫaPڈdpm[`þ6j ,9sw^%ALC"@[o#%ގ"8 9<>Y2$fܭ dI֫Ѻ   ;?ǡPk7 gDߵj 3fq$AC{WW`gDPRHp#\8Y ]aˉD,r $<]ȓsؖ.}CV\>G_~?nv Bߌä?<_$MLz-מ診}^΋l$=,(EY(ZN:qο &X|VjqvH>$ l?U=K8X4KɁH(=89LBZV"Cl 1O2g1r i@=~? %> 01ɀ! 7nM2Rp_1bZi8W@֡-q%ʓ{#(t*O 5UMnꎧkSqLz}kOoutTUHNyք?xvve/bkkkr&,ɄGő{6px*l {(~~y:kY;|[i=%LSwfY.e/)L`X+e3wF@D/| :ÄM[qX#շ1[(PQݢ{ x1=zb'yq# udz*g.6uj2>/NYB%7I;#F#iIA<&3d;h-FFNr pwB0/yvK7慯,D8v5 IrfpC q$k YfQ:9I㽖}˽œAa8, =sܪUxΪ($pf,f?N=As&q Na*+߀]ET/!Tǽ\r$Ȧ xܕwFRp Y WXp0p@tGÇYK&p3H&ZBYϳb!*#R(1NY!4B*Sq)amdK b2D}>sqοNpPGzv!Z׷Ǫ((eJ rԕ`ūlXb{Y7$şIpixp>VؘqP1 |3dC%n-@:-:! aޚYj^{\>CMiݥUS )}mx iϪzWg˼ClހJ5@fٴ:1]WfLY`W6mshGW[]>e#w~'' ;;Uzu(:+؋S:Gq 홁aӋm0y PGuH# #{=݇*֦ԩ:umL_MQuHקFv(HJU-f@E5*6j&2On~xiJ%Ξ=K Y`onbdh-Tgը% CCa7|8} -CǾ AElGآpؤ"fԛq?LSz?1;1aG4\ L}îѹY%i`:Z1h00~vfsÙwࠖY :tDp[F;;(6Έ ?8_Oߍ[z±Y؇uG0FθkCsE VtE I!=xU]SޙhTnC8is Tb'r q7Vm lJQԫ۰Қ ~J"d!;/1gah24Ⱥn:Bs,>zPʤSk+ -?m|xPق :Ea* ^xypj3wv*FzuWHP#bt~%V F# /F qkDt󆝘C, H tI`tꎿPz[ZFs9]oq6fc*BdXvǔ!l>6m W5\j"uq_ P Q} (z2ZPyE_gB)rG^1RjzٯI˛+FbEGp fYc\b򓘘W".IfFa*Wdfo4K\A:C HN}t۔Щ*wboK kgTgQ6;|e2J9$x7F9B8b k'px2^*6XeW=vJz֪QW1FUWF֩ m^XN-<^Y 9fao%L瀑H߂X$@Hg8ژs{J|#BaaVL&9O/C|wtA!6"bwa[R颥{B> Q\e*(F`sz\ n>_O=3F[4FY*%wKE$D~ !V;"gDeQ7_ڡ.mSޯO )9~݇YMqreMzDWՏ7*ifYD>[W.X{}cl,uCDpӽNiD{.ݼF9j8*/*2ҦL*`ՔdR[{*#Z0ʕ#Ug~+|4NЗ,gȥ^ye^ágX pB~}j)J p;oJ1h#oM nȹw]BDGm !\#˺z֋u`n;0n]_tW•?i;:{&\Lm`9[K)=dHP0kkZ'N@ )^Uii)R ww @Bewn-7%;;s=+bJ-G ~mD;8}\wVRG53#Ϧ;+sg##z}QVTWvԪ꺆jԗ>B9ŇΓ%'ٸ.:mVO~bQZzD8/45_~%_~s2c H*6]Ʊc{e.!u|~sj&;͕d{ef_z;O 1\nҞT7p iOc\6ReTw)2hF|5`r&iG!je@CNkq]4DX7 1MkuJ%6_IݍGnk@󷲷4'E1Cro]-W)̖/7W:hFmWW,״ǴSԁCxaRc8Ɨo$͵sH· u<`[&xPy4yT6fv~$zc0Q'"x7|F6jp A;qar*;P0SpSwMKnw?w? U~vP}/OM*MIL_̪"~]̼ﱟ:{t7mZ~ASVXӨ`Sw½K8t@9aS:) !Քw:Ni䣏[s},owDksCjƳաL^ bWZ n}*s5y[ʞ|[}Ʃ5 ]V1cs?_8bsէQ 翣è^Tif/PVd==Sϧhסq?4/*vXú>Ń7mS}'{WA߳~OZJر6ҁw;ݿk^YM}۽4:8pv'bIWJAʚ&J(HM*ή%{kZWJृP?u-@yťhiϬ5sj#juJaI KdDh4CӰzq޺w\פ5VI-e=<:u ?dOL!Ou(桧3e-<9Z~Uthۏb)Ys#^Q欺߸cZxWW 2-L.zیkyO4<-/0b?|+vEq+3y1i/mkS*d/hOΊm) yg4"-Xw1gxXϑ jWjƬ2ܨ>.)gfӼ}FMlߩ[.נ^:}vjr,ʛ?2W`\}ԅ[4oıvPm>`F=cf+*Rg.(GV{<]\ǴNxѷ:.ϻ+0'޻ϛ,ژ1ׇ1tf;2E}|k M#* o:4fg˭!t_T\WO4KT (MEYibRl{hRmgժTѷT@Z47$e[g|\fPZY\1s@ktwkVuImĞ\}ltT*SMO֔)'e"EޤKѐ3xk6w%:OaGB:]B~`}\S\RfUztrKxRy+;f_üBPm<լ_ n+N Ӊv7A 1pYPc2-c?[]^+YKG͔wSdh4>N%%%>|K^?]h&tNeo[VfѹF26RSvRWI[CR-J.A׶WTm|KM~Ci?V|!߲ȝ彉(mTT?sг#sXN5yjظq2r¡YZPb uS?Dl/-)lX׾Yuğr*\Qnf-.k \L/>sh2b[w$VXӅon*Eii&c*of_+P-KdN"Զ36QVYF!2bzGm^o9e*A4 (7t=s#^uNW8|El!Q_3/9eκ<)QbA|D-9\6aN*#i\SpLlyRHV~e<,& m Mb -zy=|շTs#=ԺV,XGR{6)p&wj&YBx 3ө1RYMY"g}KԝkF4Co˘>?O{վUhࡵ~WK7p(e.)lSawYSצK?/˄M/ȵhpu.:\\4X]-8|"ߖC BAAS\@AA8TK.}-"D6Lfe2QZFQI)?/W$pb@AAAAV`-lqXI@X71M()+[\RلrOl    /Gn>l'# rZ8-3cZ3;     & E@wx5Or2WOXO\u.Y@v^=> o47eg"l?Nշ1(LPv?m'i|3\/ۘW31ޗ`iY   60\7)1Q{").*#C4 @2b,+&.֭ Sh*N^µ)0SƄэ \.ȐDYq:t=ȌX@ ǰy<5b' j-h@DX2YtS՞2LN|GO ׇK򝰝ɜ҇qG9\:w7ȅ4i-`ՅKAA[O'!G냇VƷmYbŶͥٺݙRP5M%U=@eh̰Fҽ@ J/ux N,v@C fNRU_ʖY5uJ79xw FoLf+Xɷ3[10Df FMǿm1ׅc7ϫ  PPinWQ*Y%۰ y(3HG'gyK5\'{rֹ99VKx_FwlȞ?"n!chk3TptہJh8']49bVx* ,KD3gMHU#9=5ܽBT>iM l5o&}!=M>|Q>QX!~&pQŽSc̝2Vwn qǛvvȕ|L|v皅 :E[v>ߤ\79PZ{2Vxt<}p!V-'93r"GIP_(jlz.tV="=lCJY&3;s;+I?#`vޜЕf=ը,ċ3Y=[~^M#7B>%lh<6f(`bhcM$ǝ|-G*ce~쀭WAA."Z?:oq\ Hلw4:/&Ғ"LeF 8tCΔjڤXX5kI)yS:sS0}Kxft kqӕPi?{sp CzX1g. :2V]=HvˬBqhʼnj `:dwa_:Y2k5y4Zd);̗Bۺqz=gn~}<%+ps)"lM%LA6>AJg䊶8TLNN=Ptt _?؍iXB<%GY8c{YKBҷ+[mItBKs 5 V\^% wuYYODH[YZY˶l)&y&KԈHC6GQV9Fȱ"w5fph'>ԍV{"'蠭WC  e?e<=_hEA uC~ C0'T\d:u[&`NH]ҿ٬? bŬYCCEvv6``m>`4{5;37:쌕,L%ij- ݯgŔܱ2Nﶒoh\zcǎq`֍kX2s_1ԥY9ј WG%YJ|_7J^n1'\;J܀Ml~*7?;ey9# ~{ Ee-ǭ-ou"c;j zi4-늓3>;JaA>|*`/;(8WidÍ_z%YֽR%me0-V+9CV;+w/1c_C9N/)=ƞٱ5$-`ٱRy9kAAs!)=NL;ْBMs-YZU[O*_ƒ](* \HQCߐ%~эgy=xn@3ˣz(yZǥpFFX(¼-cU夗ڹx@]Ds g]Z?fˠ e]<ʅFw%6|(wTN$2[ kMӛZk\Iwb(^WM*5ctXlQtonҪCsUeٵ^9WE ~mKF3-`:t@މ}@G&ghˏ.tf+++)Z(+gqo Zyw!Kpw]<qG` Y&'}y[U&   cdۺwl*=ʠp7x=_;K*+>|7r_͒yr~p#SkFc=juJ^U\,r+/\DF^.u}|< 5...4JZNgV7e^2>u2zn _}_ʗJHәWR3LF4ʮ5c4s%- ӀUaƿa:p$M(Cf2})nw8Y/t$F[VLE̎Mw)Ϧz%gU:T0UJ26(3u9T^=xw ^gno >`%^Q hqŧI;i ($TM;|ww[v/˵[w÷Ҡ`!>.ŷ    ;e'LHH_>AAAe x16Q0aF:T]'25+ϱx!Xro|S'[gkce^FСG17gL#NQFS:$K%e;KF^2ﻛMe[ivlz..72y\"2Ow/d_K4g^FV_U/o<iƳj[9 uumJγt!9$(  P@cA:y4&,i5V>Ϙ[RWyѶ FOH*q8b!a߬NNt4XZFơT̍BԫH7 _nḁz*c#1*A1-yq3Pc#VUPP ߏ?07 T"6-bC iwڢ_Xq@`T89Y,"\ CPٹ;`oj%9%vv74,ؖF֛m;KfQ)6ks2RKt2Mrٲ oۋٲ-hM ۸YGP)2T9[2,ߛ)+N-i٭=طnўnzp'_ 'ѻΪGWºw[ȁ O5.TTێJڢGxuzu   !u1dr?t5Q$͎{8]zVd"F;pd|j@[KfZ? 67DNҙ./~f3hsCD=TgÉoM%E3ۀ80ҋK0/4O#?;mz>,mZ!9SdPRY;RvY~g^bUmwJp8H5)+7s#eL(K2^ӞZR"*㰽j{C&!,0I(#ZVc}>GF7%!]Cر NZ3))nBSAzSz=x 9Wn`: G&AAAC\`9\Rn eVvh}pk*ڄS8r0DoW8--¼g»0 el++KזaڽS)Pм__.D.Zَbve=oBu2@j.dLv˜0'Vs$ߒS)gd1f 0uw kJ\ٖ3cCڿhLWAe&lmbOڔQT8[sO/FpD.   4jOc.%#)|<>1' 33\50fgJd$ i޴9A%G8˱9x5iJzG9?cqBC=ϝ=;oغaI餧UpEg:"B\1cgTeMZtvmq S1<:(iGʂi$*NնLNf&,rĶ);i;g; oGGm9wU6Fcn:JۨBD ٔ%3G2;usA|ե0??0>{/mLc[Y-/{q)/Ğ;|+Ȩ7vR|)I18Tzs1FۻёGq7q(\t ;si?qFҪU{gccU9 t#:>&r'78f7\xM{n7~1DC#?e9@\|SƒǫLNs vkLz*q.>a4ьɶ(3Bڲ94ѴaGz QKe&`ѺU0[̎EBێYNJ*ϳU h_^EfAUo^u|J.0@WvsVƫ`t!,<*[9 vP7){oOhFJ"h ̗k;s r`,ڑ]w0pDڴ٥~X͛9oy/%~sǹm]jR۾U3X6V7k/lͪyo/V P&g',-fCR!fR1-Z2ZϠA;sr(\ʉ)2?}3l֟1;M ,mumSn"2,dfO Vμ'jكC0gk|7`L4b$#GK.'Jllaߺӥo%#8vB;d`aِf?Lmls!/g^0fPv4 rd樃ss|n9}%V{Y5l62+\ȱ- ^fvlp;aϮ!9$xQĒEMGuRӵ9#RcbnDƺ5ݯ+mGڛ }$*RUY`ZyXӫT فm<"ˎ]i^F_2_G{HF|zev7r{NϬZjVNGH{x`9јSp3V!fwM4Z\[k2mW_U:س6Qw"MuJgDvE%,3whZrkЍ?>c:߿uc++L<%at-/_gISLfKY;s;+L;PdЕfŐm/flx5a38Q.UHz{:9Z`ד '+HuVڜS`>;)̟:8?.Axluiku{rUg먏:ZߵhcPtq//Kb]=i|JN=aeivړׁ6n%QEEg)4w?0[2kljtQٓ[TWM{r÷L|'&ƺS&oV:p>^]~g[u}Ԡ,XTOVNR/RobǫʾؓԨot@_Sz>L}׆Z7>!]sc&[/EΟhG4鹉 y!ޭGOgIQN[†Fڄi(JX<81o5y윳r_}{mu[^k"ĔȬX~yvwt8E z;^h`dO5=)}|<}SW_[xoP>Yu:Ln'Sh93i |rX@#i{^&_k$b{-%k7}Iy q hBl\Qz:jnEǹ04[SMyr?H̔|ր̀1osy18(O l_ UbCR Wd"i; a:Bucptmeyp^Z59rP\yҼ?)=،k&/;2ہ,]xn-Цs5xm}KF'ǘI>[ː^Ԧ PUMNչOjeԩ?ۿ Y^.*>!fY{`*-*yܱ<;Ny_z%wJyjΔ-yďzUy7LDyu%g۫5CM'io0l"@ny'|o5_'|{mttJo1afn0/RJq,v j/W}{/BFX}7~=3W8NUȨgy[CtK ^xy>/w^Vƙ/輒C|$90_־LzOW]G'-FZy'~{ϏeLh[G?ӣ< ¿LCS wtհ(3; ɺL( Og2]1WۗXҊP9U{Gyg6hDcb/H+/-: (q{JKYrCHF˫tJLEj6)/1U.*4F}]MF1<\k6'qgAG&g lbb/e]<ʅFwMUKwfR {s+<^J끏bc=ء|"qUhv=maQNmKF3 199i2.YzN_eUth5MPRxMΪKVDg+rІ}Ş\ot@_G|ԙ};mo^n]Ρb^8pKҏ-XvM'Y5qO?GEI(Oi፸\B5;_A~YÑ _6q1C_^綮jT9eIq;nF١쵤]vk$^`o⟴ 9~<_ ¿G{1si|R_U ,+'Ѫ^2b¨c1bg+\E|z%Kt錝_wAE>e&5HJb.E8kf_/F~+yThI{6A*CƽO:R߼^ïƫnXA Sxl2Mm6jL% /~&mL4 o)oħQiPN15Ly&fOse[*d >aº#ؓב~J}KygrԞdPݵv|\SmTن:,g|"Umr?PUة6l{/JVY?+`hg'_OB8|? _~7pcill.oOۋuB0c}==MvG5HKk~yoF"Bvm{8zEjT袶##7#{\wgp*|\MۛAb4Yw"rȆ5/{r],8#>L}׊koogC,^i'Tl4YcK[u?L$L># apEן; }=Ɯרɬ|{^/ݖ7k>gh {KMU0ذah,i#:mImMij9bbbhҤ1a Oc  \@RTx?+{K#yb\mjIEgsUn3x~c ]5S_;^\M )%pĶnG!lϨ.tkϟ펓hmNx_EfA~u05ef*wj>Zp흨6^B.~UFڤ:13'!Ps9Y);DV@%:`ѰG˯J^!?6!+BW&Nx?d{Wu1&7Œ^DQcoYy[Sԣ3Qkdd{ sW`yŠ=ӱN.Z^e~̬߬DlE?0A:_{l:J}3p/LjL2D@P͵|6l00>{Sk$c0>ְWؕűQ9Է#e:3m&͑?=Ek~ a+xb@M|WVE_U~;]\=W/_H בp֡TԶLw2[uyQ̔,ʛ?9 qL)S틏`F}?C|"ۨ=e&q߭#6@lHʛp#nGn%3yxh)7UVˀdz#hL{ j˄Wg9#hHzGb=_UIW>F/+}ZxW??ؿ֮_HA{s?ϻ+t[w+#g/1}KFlX35=.Muk5m5ho4<Ǵ[yy9H/O:>pu~-.1}^fp{~Zwg<:8~GUD!*QLb{Ԙf4XFM1&{{+( |?>nvvf۹]){-ޝ[͟PT  t'`-dmr^!;DGVEHOaZMmY0 ׁا,Z֊tBA*>hm!!'!lhjsSCRoJ B$Ɯ%HAsGDDDW.*Uhx &JpB$2ctM/AP@Qܿ@J  *u; |`(6AEA>NuI AQ`   'nf"A`$         C@    P     j0$4^g,9s$&e+QGO+Þ8USpUX#lW5J}ٯĆ ˮh~&*m]k"YMFAAA<=hp7lG藛ppW9<]4N8qOV貎cV 8N=5yOŝK@1bqdg0oXL/b+MHVU+܊sˮh~v7MY~ ٴNvuC=k~UuwZ2   5,: s@SՠJ þHc:Mٌhf6=P2*"tvI<V@FZQ AAADE'ذ:$ě#=>ӠƍάeM6HfH0뮷sm&$uUTxBAAQP?p&r o2T%`ߢahhl8H!}xo۱z'nBߍ$N)N6Zz}3zڂ?Vc9v1H)`Qh3nL]waY,*2% {:QqlFuډ-w{?]CU 5toc8GO# .9-?r o5/m"6u5wP/-\_ܸP'[6 VL Շ Z: FtJ)!E{K8)+gҿ*C$>Ҫ($^3 ǃcxR7Ӗئ1=n_,ԕ>IAAtP`-wNl¶Cn/2E|ަT&sco1'9?0:׎#Rl6[عt. E pý;Xr"xcxvr-Dk.f,>#- z9X0ɌLN Qpq`͇,~&kqb8t P_|[\<,d:;ضn}J(TcAE1rz$i qo|qpX|*/Wk;l 2g*@fif7$Z®%yL&ȉMؚiJd _2z*p8u2G^N pvA'c`+mŹ_2HB!@u*wO3r{[v˜- /{ͿgpgGfj[MS C\A6nҧfPyB]C.   *%Xy#00ٚڴ}X}4,ٍ_јq'5Ջ T26u/>1 =lgz}pfOϳoC0`td¶|9CkӠG^#?o=X8 ??2,4nxT;Xgbϯ&M)S"q_NGvL6#Fx?>pwK;<2KDXcJG~jmxȢW>BD>;#Xr9 YxL)}bՖײ2S@*ŭ5]ߗhl슳q>m6rʜOAAA<ȣC@VD ka)<nT810 f*ӅOH9ȫ%lw^u`/c:J)EP<2|"F._2&Pv9F??Ă':AeY <ЮANiJ^pM' #DiE_#O"&B/"ݥ OW9]&O}40`ehc.a=6l ŷdS%22f̪\[/`Lmw+βrLeicI\mlɬnL?AD'ن`q$h:-e).=&匮L7ؒ"N**M,_WAAACC 頃Fz K$%vcOV\=)4+Sy@() h5N!p|l/nWEsNaFֲ8\~LJȔ8<KSPCp1} Jd\{|y}-#fޛ-+*L v s+B[:3 Jᆱa6[jldT_˯Zc2do8ν1w{var٥{SDWpxS^{ 6jJ>5/Kk|+4d7\6]-{3~aFo1y2_Q6nܧk6ˣGoJ7Ƹ P x\ dm:n#:ݡy?U,+4Yt:Z#NW=o\+s >Z4¢|gЂ,8$s%BCk:\Z0=:Y;Wc}:[rXo->`xCqDNcL|ÛLX Z^s|bDm \k'qC&RyhѻYr(|FhW3,R21vsH0nF":=+ z`_[@@*lw6Kbxa 0}?t<$Z80[2K649T{hPy(i1oEEM41 z)-CckEx>(^Xُn8~sh^\NɅt&NhQsBȚ5 Fd65k6ay\*^2mo8p*MόmG܊ӕC? P uܝb#%#9㠰CMsUN Rr}d=k{rUū4U}JG`~69U\:QÃbͿ$iXG~gooZ) |é.ߪyذyAJWGDqTmA5:*1XъtB)66h7Z JU)J(m֬Y*F÷Csعz@$ZO[K 6׾g'Ah);m/XoZc V6D"AGǴ~x9vW|lpOD>`5 Dap>w[S)ѬL6"zn$!̭#m۶Z' 8]jEͤ* .芶Q AAAD-1vP+@VwG MSxWcߩ(t5Y|%3`16ʂ M{-Lߝ1;<̪jҐ_:7u3Wub򸻻3-f8jx:~qa0UkXLf!̉px[cϞ=Fn,A~cѻ5YHKddڕ&[kFuj2iPQlT:TgG yHO/!:[ENj $  E(D>pvu.4ɑDr ܺQcԇ*ђ蜢`ef| #؞_i껰8c֯]yddʺM 9l%}VARryДSN 8l;/pr!K8x*JVuCagb&Vy1׈a pC\Bͷ:huVwb[.`Dy"FwhҦzb +(X AAAU 6~ALu]prpr2R_+s0sr/u\u-٥e +32ԝ t_{bU |ryDBQT]\|||i1ZǁNQ y)4Mb4iZIepI7oL$''A\ Gs HIT=8xY_\H)Qw+Nd8U$<@| &  AAA"067⠕eG~tou=!g, ꕜSthx" ;ͤSX CkE!W=.pڪ)FbZ   j;ԩ՗Fj  ?՛?LT|`QЏ] {VjjydR}0X0a->x8hkkJY%YYUta󹸚DR-{B{0Ӳg@pጮ eI36 M;Zsg&O{>U5֝g_Ly<:tJS[ AAAD-"uÌ>!269`%V|nQhQ L!6JYJ\HpqvCBR~jVàtZBEzF**]w7]y.ƪ\!r]~t XK0sޘ2C̉{pW{vq ComcP,4Xwg+4*prW6ߎ89-R AAAD- }5ow6u]:ls΂}t5#֎pJ . dceJ\ B$$^o iHHCK,냃$\wJPd=.rf"}ebe\ɵ 0HU&EkA[y 6!-GtUȦB.sd(A\j;Y9{NĬcL\,4x(HAAQ`%@]֣?C|@Wyl0dO - ^YgB,ر=탆~!;|ΞCN=V&Э1 +שSBوMҲf6Mntw>8EB[biȇ<[!_c_U.ӡea}'cו,hl:e nĪӠ/,M]O !1} e(HAAQ([qݱma{|U&8  ]6DYJJXج@Zd) VV,{9l Ч~ckgn^fqf dff HPB F R R RT iTLoĢ5G? prbZz9AF-Rps/Ob-Sߗ2טbdc=nޭJ©ԳmAlMw9;6PW AAAD-f/%^2.nn)8Ш͆uԹ" χUqf_O6.TVEvsv(6d6'pc-!|>k Tj: G"M)}!V7S_}C\&?]I}v{Ҹh帑Qr8H\O꯭=?^Rݤ0v}vlCi1QAADhf[66KS+؀B(f͚E b`s(DžB u#ri2`w \M* HQCee"2 P(@ANN˔o`y",K&i-Ώ I8*Ze{#%""+CQbcUMa֔ش a*Q AAAD-&\=Z Y `*,Uc)6zLcf_AA-:θKcFGfA*RgVYXz>}GuZHq/+76;.LW u-~=M}Fl߁d[y,_zcƫ*ym>cW~Ӎۺ%?+Ҿ[Ϫ3~RgRLAUk|.냙Fmw2q}38S'b]ȩfr_sECaޔ `Tzׂ2TΞTa)BbVu)یæ*jW)*?Em|'Tw  -|RA-Cߘ;#ssHg& sGrK9ңih)Q1aUg5{^T_  j$X*'R~kaROo#&F؀*)p?p\^IۉIEpSX| 9#A~GL Y7-ps죝OU|ǁ(`Vbhn]x -Fәlm."m\y1hc^ }{q9oUuxu} +W@w}6 1p \q;v5|g i̕XLP֪{NKtd[Byið%U"- ħ#^ZuR]M3m>Swe&)}3zڂ?Vc ]c RJcBKvuX,j&2'p%^oL~1T>.M#PWdcYţowWS.pug+l&ӄ-YbǦd2fR~f/~3x؀[(N{L|~eoh{iY웁rYY[eU̸nH]/z='s4҂y_~XN[7 zK]dlmm:Hd1DNɿc[1q?b%Vd1 ,CS2'Yhkn>d 6_C++yXT |Kjpwº^ʌrۏ.ϼ}nVgɺdʡ03?.}!~YciUٴJޮBꥆĘo(=auҰT:~ >SbUhHEBNA$*kc #\8wWX2zxyW:-W6}}&KwƐM `pP0_2d0} ^c7xE棛6p}9؎V{Z+/6~ءTCj,}1{]?k oG-s~У Խ$pMw4'`G< a|Z) uRT-cdK_Zگ-=șNqwu5<35%lRd{ { x &{ުh54fè2z;q^jG9T 6؏~K)ᓕXoG_1_4 aKb~±t߷ o0"hV4 ި~M*V}9e/>ۜ_/ ;.l؏'hLOk7=c_1fGzL2c> ee_4jO/ JĪN0+"{~ YHdY=O⻖Խ}@ d? 70r>LɾDVfĘoeOgt8:ZǿM>¦)8/EP|7 J pe'Ǩ˙Dq  Pbza46ue@+F9)Y˵7(|Ab$|M|FׇZn+B۔WB wͧB|Tf}ӮDf߳c6o؟k:< {< ѩ { Ȏx'{(/zvvƢg+<X>1bxv?cx'8~eL׳)=*^jNxC0 %Jo{וн>:5 E;5YHKT`#Z#Q]ZAAV2GQPR)c"p%Dgsե9-pzm1u$h s#ЁgƵCwL: ceZ÷mtj [ 9TE$ʩk4>]5Gi=(JS"/;Rz恮@?a~·_|}o?<K7.|y\ʠNF]ZF8=tO;ۍ?tS:)2  xS?׷&֌˺VcxP2/\/ *MgEɮQ_ѵZZ u1bH|tCAFN,l^]6SR̙Zbo|,p:'<>LHal,9{'hKCruEC v _i”E,-9 BzAIe γ O` _AڎV]WHtC#LQ@^ 6pHA|XeKT% fݘUI-9Ccb(N!ίQбi,Y#n7|XiB&;6^:Ui>kke婿bdױx&ā]Q5ny)[-<=r?8~:+~Ndfٸ*^jNVD1~b:6੅Foш3NBGڀ"I̫8J0~?^@JPzc.RJd݊,,,&'^ >zӆx摀Wt+E0x8IPzE?w/p㑡!#9\fPݸS=w6wD~N]Id&o7mxƲsplnWq;Ce Z2ꌶcGql=  F3%lxyʺaa0g].Ѹt"yo|OVU!z8N> #_Bv%d a1.Z]-~Tpl#˯ ,y?W$_@.<4Ļ V'jc//s]sѢ'Ek-ZՅ>\`Z>Æt!k8&Y%_F/c4Sޣy /Ms}PQv:901X7_|oƋܲ)l4F~aꎛ6^~JĮ)~qf.8ThWyC0J#H%|75Gfq" Hv/і;b^ߣ% sc}CH̎CKmLۮYv7c ,>exw}OVޓM3򕼊c2nK8V&mmru.}6:sʲU|9yvs?;>ŧM_Dg_>Ե!KI? ٨*^jNt,!]}!̍AT?&L ̟_iyȌCwwj* )@`# T1'p5UUq"[Sļ)d\AHЕ9qB~[q$iv^exMFʃa:(SOw+զs,ԍNu{'wB `M-% 5#owXeg46^h߿ 2CRCзq.܍21|@Gxs薺b J K !/߾-ƅ[t*{l¼OGcK0l GK+xͶlG>hV9Clק+0+~O#Њ&; Ga^,ڲdXs>&/S3/ĨW-r3DOm!NK}:5qx|n>ޒ9X1/t{hPsBȚ5 f^0_caClQ-Ɵv<^W<0r߃D9Z>ECZ}1e\4GCɪʂ덾+ Su4U&m\vjE"ä/f`cw˓8: Va_(/. `t322}Ӿ`7W*ÎM1a㏵G/:*glcxhѻߵҰo|ķflY/Ve.U'7XFTRtb]$@2~0s4C&ig~:_+IR}?hnp a䅦aI 5]1~X2a.o.`wv|&&"$|a*g_Lyu<˺NgaPǀnh甁;QzJ:]c UdITmVWaLɇi"l9eQ|kNi ұ: LWT2;Ҙ#Qj#ωnjqn^Gia67-SA17ʐé4c^LAL@Xߟ aˬU3y0yAJ͓ b䍣j"0&Nh"h ,G;י]{!A.*>hm!!=Uk+5j5T*UV p6k,ѳ,\|ԪB dӳ~RoEP˲' Ĩ1m ޒHv8K"c>bp`Wh"TLגom܀#,N^v̀<6c ٣pp 胡NƔ:h[O"ȈggL;LpV'zN;~33q|뙇$MFNg H}~;oz1F" Uc {;T7ᠼ+{4a|;xTeܟ9DDDt빢OUbccmU @Z"lxh :DӯF8,@~H=IOfq{代MHgxKV8Z K9,2]d7/;o TqbBV:3)NUI2 ɳiHĬcL\eSߓf!Gvc/7F~-iyC0&Rɡ6s[⊽

'pd*9~ u;A *^͓J8fF > \*;_!`%lQS98yvd ~1ꡮ YPFTE} 7,r!tg S6sh!WFչ&/ٺpq!Nc|"{# '.4藣DzB@Qm >'MD gwYYH'ss8z++gMCw: 9Ϟ8r8\/G!&-jnNԘ ';S5O3D# 7McBzVpq-kΆLÆ8xVsُޝ#>-vKBYh ]rM4 %ىf[6w#-/U\O݋͇d5QDd)ixSA-#D{QRh6pgsS@N:䰁P   xt*] CT!w2=tEzGYp4"vJY6'#_.anr A7$PS\OP/:Npy1hD2\+7[@uԠR{@Gv k $Ay'm Zcȼ{17Sȸ#еM 0=(򐜭QNh   Z *Haȋ]Pp` x[-¥*#   y {LAwHAAAA<N`VtA$4X1 DCI *]ίէ3Qa sHL^{R{Q'yX'|?''_BʔKq4T=jLhkL+A?5:RA Ca?2'55vu-~=dY3 V = :p*J6ul߁d4//Ua;I֦1p8ڎEg`F5Ƨ}O笑z=+ZZ%&3Aa t4X|ezݏA"Z}w̍,: s<ŋmܣ*[_HS}l=R87zڼHp$X pPh|+ 3Jim(eflm6jjVEW{;>@72<{ԾU^Xۢɐ%8jI9:^ }q l I<97;#Q:O?Ԯp0oufB5[8[0Yjƞ}V<[Κ@cEN}3^B%ppmEże g3dޓ[>FmѦG9k חc 4:-ssI/&Og[6v鍕7Os*q-RZzebMBh7\W/s ~}\uEXA$0yW /s1n63aG81 L5Ibb8XwlZ8 ZW>7O{ R^S1( 5QoY&y1?0PPbvxFhfο]Ms} *n%E p F rף|uBK!D^K6H4T>P`mNO #TJEѐEl8H|,{M ,̴={;v~>\[NJYFyM#PWh|u:JZ>V{Nī,!‘_DW^=|ʯ֩ȭ(;Joa9Ϧ!.9_[U|ǁ((yݭ ?N̕,}{@cSxO' &:ce(]ڦ𡜋 '`5_=1cO۱n] }\cL:F2|>m8^aXvJ DZ~+gbY\n)poDtzלƶכ@\M:fm?U?;6$K6S /2Ckﷇqfw{uO7aEsec>U2]qRƘIMNwJ.V)7]׊[k0vwL.#ʔa׆XLEȬ&/ysEI3OV k\9 -wݎ>5nc1k y|v ço*f=F#btuw_MgᕩCJXݿ4j·OƠ1eݣTp;{Lq_S[!1#x9×}7 p'$^:I)%4e)P&֚2iW* X~?FU}ê Dc _!Ԕ"[O- s~OFAͨ*[P(SL '9rrrP9y%:ލAO3sϘ*GxVrիwK ]>li Q Wxi xA$%$}tnNô%ܚ @#rܟEojb16W# Nlڅ폟)26}>&*h28 V΄`67¶.xvR<f;cxʱϼm-&'0{Hsx#y1gt$uiEIf q]6m۠4= _˯45Vy^Sa-q?'xz?l EEys/1v8yCO_r9EտxL][hD 9J.!ѵeTϼ2Ŧs5[VƐKPt mbo2Q^5+zun0(ޞT޶:dyp>A?d'Dž, C(M\d_(k){]ˢ}9#KԨx 69?5ּu"_rƹ/cFp?T+n;}v}ԛ~?E}dUP(:8Zb;5av#kwuױ;j09]_z.ABNM,֭ !Ŵ͘7baQj!о<~߄{Ag#tğه#>hlOx+NhΑDz1'\=BZ!&2b:a~seR5-P_.Z{#]'ZRrSsRÿnA!:C0jȻTSdP"n~pSŞ~9 gezWXun6t}Kj*ΗSmǵPVuZGRÿm-a-Ď&x%ů[ϒm; ^))t]S-=wr`6%-Ǧv}oW1/GSϹ㼢*[=l5l㇨Fvuܒp6?ƖRPrCZقU+Wb#mRɿqF#Ȝ|e@35䷮>.qI Ou9Bb 7|򐚮gÖ#?= grq;ԅpqAvYo&q*X;8V&y'I}8=Lj\)$εPCoA{K?_eFR` d> Es6l,1} ofFȘ{:iȄ F8*}وfQ7`yI!omG ?Y04#|^U3XL(TjŨxBc/tJa>%.l)Q*u]b;h&8: No @8"2_^rz\Y˖[{I4XHNe4җ: gꃖo\?bA% faKrh[mĖ1A'1?K!\\wB8-}tļ0 olS^ID,$*J<=M|[ P.0v/7}iױ3?N0\vAqE/NNo۰u}h~ -ZuQaeXu0N)ڄ/нP)Qݪ[JBl9/OI! –5u(y֤-qG o3&mª#xN?hGĎ4BU9 #prC{`So ~7Q5n Q;YS.'w#AȔt 6325_zKp@"c͝눽;9p;@ Ei֭JTwn"9%Ox<㠉vEFMBNeE<.Σ%x?ÞS%D K~ie]k\ޖ߶}I(_yiuɆ_H AnRn2 ]y$Y OQ?1+=<J ^d]ƿgq?>mݽX隓T 8L-rpO؉:sH9` JȺS8-lӻ]Z'ak{^Ŧ)i[HmQEy'@aW+A4?#A@HBLbpm=qa'.)ޞ>]5DD(}&\$Wsq$_̵$eSO)q9[H82^:Z}s9^sMug^$Zl#MQ صf[VrQ#uDt} z +QC= _|+Sx}4AA6g[Deݦe;U6ZBI3tk\ϑ_w`]9jiO ~UmQ{Hv1NMLPϼĹ3gpF7CƯYPo8â mZ25'B!y%B=2"siYRe=.~eڠ@q=++v(z>۷eIض9ְ'c-Oqr9FewalK_ꎫ=*M}[砮S8 'Y9Rp`M<8бTWB*>pf#>^/RfB6db7LSeG8-TT jrC!Ԗ6Pg|$ګpqJХxe=^pZIKCQ˥H969}Dݪ\C+O⷟Ē7 [-Qػa9ECs)[nRnЫ bn;ʇ-XǺHq@n!9Az,[q8g%>~1V;7㖼R O!m[V>Fn{wCZ;0x1\?/bS;.P } T_oAof%D9PÓFw}wp^\P}]`ù xl#o/"g`HVc'dń&>jWt,ʯ2" '}fB$8_&Wt=rxEsJc AǶ`BH hLӆⵠl eȌcA\ ن>or> u}|5nH`RwrKX93EK5,|S/`ĂNĥ|&"? yv{q!\k~/,xw"g;4_i,x.m1~|0x:zj;řO֩7p?xgiP:qn騒u]3i\\NVSw%+y_y~pȎө@Tϳ<:k#Dk8?0mE/YC&unKzsCṿ1tl} YWthڅ-RdĚqͯ6S}#X}$4 Csґ#.N'_\Idp(x\US=2B\x>M/*pHBhNd+-RI Mb DW-`wlV\ܿy ¿sԪr ws岱_mu^@.6cbr} /*Sd[{1$a‹}_Eփ3Z|kGaҌX|p 酩oPoiЛ<`->Ɛ!^=*|tw {z.7LG]b^Fn Gm^y<'3`|=5gKCCy1ֿ4$n/OI/wݩ`T ;<KY{WFסg[ :ShiUY,9UcTU@7P`]/}q_ @яg)6z0u̞?ÿQaRon33nF\.b5rFǦ7\ /G цt4v(gqoG1 @0E1YHjE-:?٦`݇oǬ##wW7b2>#gƖo/G,f l.̛{q ^D `H87~2bD16}>aŖŸX'~ s(2,8ٸW ֺQFJPo>c+ۋUU`WC1ÀpV/O@I27oj+a@'g7j>1o4q,]}kZN)Vw%)dGs1!~ 3‚)~2>5>}'y%LK]U|}!Kv^"24#kIHUׇi"VРȩ!AH6.8r79R5HB%jy8JrnZ.u87/rǷ"]8æj-xH2q19 yE<. uᭂ:gTwPiYUZb$U U(p;'ܒjkݢpmJ2WQL~MO؝Mtߕ{^Yّ } /4_$ &ˮ6$Q'H$0/)5WY7و:o{KTW {z*}뀕hWay}ur߼`Hl?-KIW?8> J<6>_H-OhTWv`dP;zN~Vp4̪ ?B7A8nG{0r>Əhn3.aQA@@05.8 wzѬ ' y[{S4!>{ am[ @8vg2q]*.OFi4z 5`%]r5d0_8K'X=yRDf8[=ܣCb[9CLK?GN\ wf@.uh|qM%E~|78[ta ? Lo iliWxm: uX+^(᥺s, ؆92xnfMxYt{Wdp! gnhƕ8#ӈV} [JME&ذ.lRSp?G [W?6 OQ,(*l: v%_vhy؎i9Suķ,98lEP wq6#g0fl_Rds|.:׎]bߜe 0*,-/SI^㟏y ̵ ̍:WaC^+4km+{qtÿbG.ƜhZ?rp~Ċ#/íSp?1O!IοزBmen:Rږ\4\T, """"£0$"" aeʜOW.DDTP;,n2"q-"KGD]/.k_N@po؊s D;p[xn5>pCXzۋϱAVsa;]TE|69iph\U]6jyQd!8d2UTb@Sqj>$bҩhxfޘ_Wq Lޟ}:ގAޟظOL?i]⽃`kmD]S 㾏ڠ,v;Z0kXWS1hp Υ3BjV#"""Lu5 Up*V^KHGth+x!,<vέ o uUO?_&VxJ6<YS7`H^~wIA.G~ZO­C"t=I#:hkpCѲIH EDDDd  *8f `c@VR}Y89Bmw`oJfU\݉yзc-Ma[VŇkw!6g%U5a^NC=_1 ?= cг1v( jDDDD"T*믿"O8gT(&R~+\M,l"3ҿN h]8b#STScEu9|VBVv6  IְT{xWۆzHX R_-7/fШ{cz&$"""0Ӆw!w0O|P2|> 9 U԰5`R_q;1^[! 0rbӎ4h;91yEdG7 8~FB>Rgw{ugDŽWsqxʉہҵn៩Ol'>O^,'TUzuQ!Q8i>6Z~ gp5> OѠWwuF_>v{q!]}Ĕqv ȶ`~ gSBp 6a k)E+It'~7$"""2[ߌ<_:X_ N- F2$sMװ!`q_bHFⓝX< f kH/L]5w$9ѳwcK7{E-<[a@ 4sW{8ٰDsxsX'3`|Bdkx5ϖvQ9X>~;@L03C@"lx@d ѧCid*l LK̩;aij1Dž&[ayop$""""2+(PN2lŧ 脂dH2XW`P?ah5IalHDDDDDeNO]K@c RYP~BdΌ3Zq"""""lta{ag/@"* x436oa bHDDDDDeFPG?4 DVKdt@huXk@@T_y< 1 uO [1$2k~2Xk=S!ag*3} g~C=cEaZ1#[G?T   ԅocHDDDDDeT ꏨRL "*nk@ yY`HDDDDDeBM{ %ݨJ#CKN] G{'9`HDDDDDZ21D] kXf ViL48> X*:Q/7 Lkͧ⾮YэjlbH}0$""""ThxI_GDf8U<_0$""""Ǫ||lHT0ʸW aGd11DDDDDDDر[?ѓ#eY.DDDDDDDDD cHDDDDDDDDdY0DDDDDDDDD̪-%Ո!!!jDDDDDDDDDT@ pL&V#""""""""*&$""""""""`Lӈ,[Y0ȂUP"pY0$""""""""`lHDDDDDDDDdȂ1$""""""""` ,8JDΝAFF: ̒35jz┈4Q(8r(oߎSNux{Wc!Q*DJJ N>+W.#++ሉi&M"ae>"""JVga~K-"+6&aMLLFDDeM ֯߀+Vݻ@tt4<<}fT$;;SLAj5j[D U:<> ,rssoj4h D]R9s ֭[yZ21cP,@""4 *\]]Q'R¼y_ʊDDDDgyDDTi_UVEfeqpLF2W 7nLݻwgY DDT)VXɓ'['bk#FQF l :| :wVDDDDgxDDT)9rT/ B8qp'N`ш(G "a՗_aKNWLy<+n%u  w)VOXڵ5݁_DEEq{YQm6iAV^fy1j(?~\:PTS`ʾ?,?{㐥PBAq%G|~^~e4OEn]:=$׽ ͈h we6hݺ5vŃb @""xbSN/.jvvv.r pرѰaCM"PzΛVť{{#$;3kR0j )eV&({y*ojݚ@-Re]&eY7ne˖i[*YDDd`*Uk[1[hB@.<{,ƍ  Y Pyk#08VGH?e\mpQ i#>T]1Sj,ՃJJ, E{O=K3/3!kx/2/;>cy\9y},/@k `Y+sGa`""x7n@~ږWOEh㏳)q?GXнv}{| GҠK5ըQCA° Y#G ##GRRΝÄ _|/5>5p닩cZS*8Ǥ.[pf=asVagx|W=h AV36}v⛑mo➀]kJvbzG3/u]!-l=CzՆaCκu|b_1\1A661WCZj*jTj#%ONFn ؼ7Lz: ֫?EG뒗-=ץ5zƾMbʳ`+p_Hg5|Ü"L~, nַܻwBfȒ0$""q&y u]nX3R%jۉ7,k>?T %;[ БD((!U5OBrHt?0L׭7LϳV~B=7up9Mi'I.WA"&gcQ '4fJC}aӍf 4.7,$l26~V*$Swb++שMe~YK%66V3:DDDD YΝ;…O! 0$$}APP4SQTjmz& aI8Lend?SFzR-tSU? po8k'#{d]?Xg7e 8]z,4N<]HNI\^)E  u>=뇮!uɾ~ׄҳYG ep5d=l Le~Yh}Q:uPn]4, @""xMF!9V,N(~=z@``&*-U%@B~\h>''xs.(ÇF柘MW(䚠QyΣ9Oq!Z Jv n`j'([xYvYǧxfƋ:a3 ֆ-,J%.<؄*m+>Iv=Wau0,Kò.'ޔM6A0$""Wt7333=¥8qb%f ^myYȑ!emݚ;@~({өa<J:Z!u׷/~V2x\օ6p{] UG͵ GuBT}mMYqj/<`f{0MPH#~G_H [D>.*:CӺ7Tw\엷G~nB͚2k\&^Gʲ`Y}͛7QDDDD Y<___h8pqq),ݻwt,iGHװopꗑ:=`gSӕR;]L]CrV[I]PMO:5ܡ`wVu~ոpw].> vs6Ok?4 8~إú;ز+=}O5UZ✆a: 'm$w A),_u^ .?$;PX73] S1.jraY|^><rlX֣%55UOADDDda'Ne˖6_nbKnݺi?_zzzT䵞 }ob݁8~2 sF˃u0sd*>[K!B'`4~[sSR*qEXtNko@ZV>VMaL~V㪍ZGACi#w6!S^=bb 6{0wG5ǥbwcoU^ch݃)9p#ߚ^0.@-> _XA/Xt(uJ.VZV-/ǎCDDޔDDDDdY$Eݠ\ TsŠ )Bb!ĄlDDTR¢E0nܸr#̙޽{vښ8{c} cAH ͝;=7QQQ, ""*1\a x#6v5W$"J!21,Xk׮F2lM4n'I7(:EKׯkGFF0,@""_.y8x0 oZ 0p@dlIDDDdC,"",v킵kjLlxW fIeȟ)7o<) l*E7 @""""""F7 كT0=&_@""""""F: ^DfȜ@`!?H<IOWuB!B!]@!B!B @B!B!Bb(B!B!rCB!B! B!B!P$B!B!, !B!B!g1 !B!B9H!B!BY @B!B!Bb(B!B!rCB!B!'@Qv!B!B::;,B!B!4+$B!BN/4#= 4=C!B!q̹)P$=tu!B!rrD=y9@ 3 !B!C2?snN!P$>&+=V~5 zƵlyQ$I|vOr.6[ !B!]]ld 婀"9 @,m~Wm>!B!Brӝg9N̽$8mrYJٞU!B!B%eleQ(t'uT'fC!B!BI'_̤{1" P$Ķ;OWDcB!B!\%m_ ~8I|?{Rе !B!bҝ]SmbٞѺɟP$,_@v|- !B!bҝ埆t0e,&Q(t%sbϝKP~?!B!S+ТJSG{^~~ hYa]>'^=枛ͥ.ԧw.~x S!B!SxLC$MGaٶz-lAms Y[oašsE'B!BICu(p9#׿#] -J0si%#/k0['\W]6E/x0qM4X7k  ^.7|PyB!B!r~MvO?็8[0L!xVbgb7n@}e'/1]Þ"jӖ[qM7u'Ϸ/{vmG$N߯d_b˦uiH!B!NN͒I๋߭`W`0œ"s7幘FmNӕxNjKz-(ȫx܈D"y5FMxЯo-[W_˙Ϝ9suNXr9J_0h`?(<|N[Zڰs^)¸[;RuHC3hȯ۶±Ʀ6l Ӂ oM;?c̘1i)))w܉|dY:p{>яkJ !B!$yfg] [J #^Yx:63J\ŏ;cJ1ZK0%Un,;ֆ'W>pXC>8\_m^W_}U{y㱜yOsruVUUnLEP#ɓaKq`=nV)&xG+0t''-/Bf?&#8x>.xcUzeU 6~;/+X7GfܷF7` 8@rQBHݻLlټ>kP$B!ұMb`a>Yd"Waa!X EьyܜysѣG?cI;v.yI1󫮺&Mx^ymСi@!(*+=?F<~ӟ>qU+IWGVZ`(oI?}ku2=2ƬYs϶47ᦛo߀_U9B!BH\:hxA?\~W8]A S'#! Eqۘ~}ZxПlʵy2Ro+W\Kowy ~gu̙$6ȑ#䍗SY^x'w] &N9AUu5>kpMX3ǽ_%ߣ '7׭5}|R+Ȧpl޼> IP<[W_)1cƣ~C!B!$4SG;: ;ǡH"M* (hPki7o?SO|ixNUS::BRRsٜlkmM>K$e90g:LT ɼOݻvJPъtc5z:Q,^1L: /L1ao`͚U3g.f^2KxMuW&motGƟ'.~d;*k.v?B!Br3)nHȹn@W݁&h3Nr pn|oC x.Cu&y0y( #/Gy 9'g?ii( ◾*<Щi j]=N,oSpuP.5MokƠhZ8d\K뿽+:(*rAy557_-Gn`M-(.*2.(g>--9:VRݙ|Xҍ5gv6cǝ׉+ /<5kVK>_4O^ߺu39*Dmm_/,efyps(*KϴaU(,o5J-(|n:\N6K{G4{کMoyt,OIPXNva}'N`B!BG^t,3¯Ö %: B[L0hS8ǧ#3K.;8֬Y恓uhnjcIq?1!B! B4ҙnHLiRԖ5Jܖ-;f]ENv<L-`#r昂q7Vx3R-˕+fWWW"%pg\.DQD"*Mtuq*~eM/\#B!Bș;/ = 8x^=-'# B^ƀ'*pG4UP=yI.'CM׿͛@!B!g<| ؓH/ޭ 0!B!BNח -t$o$B!B陧I>,B!B!g<|HzaDžB!B9s@҃  B!B9@7K>]FZi#$V6+jilƶH>r:pJ*jZr7vh+F֡v_o7A忺lgDXw :s8yPJK9jqm}0-h#~5x*Ōq[Ҭ*L%B!rtdv ?F i=la aȐN_5*p}qܵaTߌT#HpɂP`rQt{tpCW܈%*ضȾ#tDMRD4/?B!B!@?4H#m)@DWWtơH9PSeyp@Cs*c2g% 5BQLq8WTiRsd ~Y?UnR!B!rP$Q\`f#[ǪI`EZ;L qҺ)%5TlkܐnjYGyҒ0!pm=:{"'"xO7*Fڅ4Bєb/!it%B!BȉCv*之H kB)P=i8.ZOun.]Z)EI s5!5֟Uj*Baʼn _e\%,@vXN+A$,,Zu iG!B!@?gȺs% 0NWIqve-p_?GV59}qڱtĿ))8\wZ w ;Vy PYQ UqIOMKAN:&(1 ֟ A!B! @H8ll[Xb[ZZfh-]{l0b]j흀BKs lE-D\W,DrgE4[߄_6?R(B!B!$Bϙ`h1ZQi{[HaAþxqߎ+z某{{H[6?'.,Vel)7`]ݗVB!B95P$^ ŬGo#U~TGŀ")MåjtEW6!CQ/ÁDFM* dĿthsv b  _[T!B!rH3Qw 2҄PdH`뺪"aUSJGDѧ"hs"a~iXoH*>XnDЏE}S3b́!B!@{ifgE06"HM =iiQ qe` zln ρbl DfMQLahEKC+?n)G!B!S@?)23Uqiۺ[ѮĠtF $YA?c׎J"ЇCWRU%Rz(V"=҄XK[ /f qſN? p!+~Rm8B!B! $P│r8EDTw`p! &?s+~w5nW Bqqx0O zy +%\}ng/ᷓgerEhG,2딿h@.U N.O2AߌۦǕ3'ᅥQXRuJ8اoǟ4qF(vA5XePpuSs7A `x]q^xegGQF$؎H_UϕlA̡@)1|<혎>4u1kj14೹~'vP#`ZMVf0*"[7O5>yӯƟ⪾Ң-@cGϿ̾ϾV{L]X?Ŧki*B퍘lj/|()**}Kv[^i*%jv!exmG^SXHGBpFY۟]U>9_sֽ: E~,x?C)/ !B!S@?'MI(_:Z%?k̤zUVm<*Ovfol%.4.bq,9t 6/f ~,ki]YVCZ}cq8]Bd6fL˦Nè}ހ^+nK/o7]Qcz޽/ae[> oOFihc?r뢒]?:q$V{跂k3Ftfxaptr4 Qg↭F WC3z(p.zP3:e B!B!BIeZ笭8v/No~88t9PR'j;VEqw!.P#)ZOmnG#Y\~>n #n h \R44⺥)um6ݎCSW/RRNx+ޯ^.؆B> 9@ӷK2xi>+*rQqmpUQqɶ,_ӧNB>ջBpy}=>5G1DZ+a[CqP/DPn@8쒢 G4 ݡS$B!rJH@V:̈ "d>5@兪h(X ȁST*芌ªؓqp/=`߲"o'}g*<4E“Xv R̺xav ”phw<%P;"2i(T)c LK87-32?ࢣ] DwAA>b$o+7jQ^(Wo2Q(Wϗm=#`JC 5S7ݒ#ꯞBYO8XĨx޿`Z4 -.HHS\"@F/l3&2'wMO X飈U<F_ -Eh?Bwmxu&௯)p3l@Q'fw$G'Z~'Vۈ,cIo!jjɴ%#AՋ^zU| mM%XYM56NB!Bȩ ɟ },OIVBk_l\Xfkq^㸠!qja3!)6nr#!d<2y@9\ߎ^s @zr?g!l.yXw]X] ! Wg?t%7 +zxf@Olq4 ւ_QRbœdWFDBqy_ŘԴW>v| cіirpBo ,ҷo?sK7KoJ\0[;ebaW'G_^gtU&ٺc/5DPR]sCw開K]Q\>݌,X ۸q`6?EeiЭ ՋϓA@F\ӯ^-TN# !B!S@?=R(]KX)X&@w_!ZJU،+иGVGGF#Wf_kPN!F?(vs.E:BľVe?t́kh &hE;+,:q۬ROaK\ϻ`<,]sƍf$O,zN p,\8i4>yX͇sfס7]*=ԫגmqF>cg?}F{\7ΟShFԐWO$\Y- #ټ.ϴb p^cY6%@iYi c2s4x Ս5a;^#~9.z[h)MjʄB!Bȩ %[tl⟢ؒOGJswPZj;,ftRWT]r ?TjBl vD RCjxew+b0nیug#Lk LhhjIe].sCoY#bVzY?/3z$~/,݁~#o\|`xb)u?,F[ž)N8/7 ˵źX;nj;*(k}=tڛqYs65E[ᣲ"aoG(?~b07L|V-+G[=4- +4 H!B!Bj}?\؇*6kL VVT9RU (A6$\8p`591ctf6 =V-?I=7S`΁FwmA;|`/ٳ 3R\V@ 8KHSTEAi ^ys>ve.3Sh{cN)0w⟈Edpkg͕KhqS=:BMrMEױ/kO J/7e` w~9ޟЎ.)Κ1znaצ;**=-OOzB!B! %CL/CKJH/P\kB¡H53eL;:Mѥ'ĽE*ЌGQq3hhM%~b+-P5ƹ# ͸0]~VTJOTȾ!xEUV<>ԑ\b_خ{  us.ݷ]a$`}xdǛ^u0-K|r\"vtM3GY;n/m؋.FVcf/S1f@7ίш~!5 S _ OQYz.33Obk'.lީEX"tcp* MZ"Pr=u a!1Lw^ڪaA)i13 ORI+6~x2`άYZnznTLYw 9uFkEfPF.ٵxeN.b?ڝf_#mQj !gпWZ{B,\0v LZ']} gId{=_?q-V!aY#:#QxrNT?Ik? Vja&cX"Y>zb FsS=Wfb3OD[c!B!S @?,fYi֚y%%} STԤDÄ%1*Y:#thnfg >4T*RbkujP=`O ZB[`}›2"30I4*' Z0ځ{?usއ$~gp7Yqu0?Z&-J cЬ.U5u)ɵӰm!EG?i)@)Dn}FE@ ]|@{!a3Zꥥ\V݌}1Io p[wW^OQu2m' @Mh/kV`KL 5Z秏zQ,^`-[6#tXbW^8oNZY- +ߕ~on7ΗZSe{Z}}V'#)p)GW% J{iz J:>I \8;˧OC6!´ۿoor}۷1F B!B!9I\020 aY0*luZ5VBqLwdgrPlՅ~2杷]z>Ǝ{@[nJ^=?|%-B^τ|'_G쫺[WNk MXN=7eYOF,zMK.k6 g gAibHoi Y /`\6mlZ;e[~;۰`rpɄ5MwPX;Yl]X]6_ۏ֓y"GB!B\QHYSH-%7{.[rôɓI׏,MC"/iMQѪB2]_,K ĶHCǪI+k Ր!@$,6:"VXE̘n&Ͳ)9/a#2XK/jR J PXB#툆#֚ 1,D ~XO+Y,ȴxv杰fs5pbA?Ѱ,CX5EXoxI״@QDCrޱX8('58f񼨏B,(;n<#"MY݆ )z~;IYOїpZ4 Ey;Qw\PM7kݮ`9NH'.wIO6B!BN&/wLkšH5jm4w6jCg?$=@ =A04Rf|wύ%%nϔ uıXʑFQ:p EDZX 0W }WOZ/~( slr;!>!B! P$= !~%ȴPJ|FHk=)o,: /h3غ~p8ؼO~R[qV,nr4?đ]> H~O (§uEC(wGphiU(ÿ8B!B! ijKgòK 2Ru])  L?XCHS)56Owv%u/=h;ny \t ֦]E.uXb#"^AB!B9Uj'ȋ>)k-M_/sߞz<! 1/jUĉ뜸^bVaBg5*9X/6CqS d.te`LK@ 1d_J\P& VD C3^.b CB!B!=gn[hHz@6dŶUm9VIKىuYY`v{. B10j ~1Y6\=zݯ""qi+'<>ۖ /B!B!A! E.!%%䴄1;qY~`z v {صLk?"f%+o_SD b]!B!CXƐI[ +qk/?#"Ggf"MOM$+o.?U0Cw  !B!B{(.~%z8b˜.!6ZD6 CPzmt/a{V_MgR])}h !B!B (a_/!5ĐR{@JK(t )m7!La+%,҅? *, {" !B!B[( S2 Jϳtbi6[6 1Pl[=n&i(tSk~s`+L+@9y?Yі>z0ј߉nu>Q 0Qud5(%`1Ҿg3p-߀oݙ=&B!IOf2H&\_2Z q|Y{`'RӬz/YR#!']y.x w> #Oō1aPt̰I̬Sf/\2Wl݇?uV\;u4`M}4%g~?-?y(l'd3Fa:?ЁX < O3f=q)s8~Q?T2NO<=%cԁ|%mXo';㺛qg>?{ڍ2V\5ZF7` j@=f5 7>3Sk+W5F)! !B(`xH'8QS UKTLMoyxߖ'60r4|A3: DzoGLaqJ (?qWǞ^vLːNlfWעߺeoѸu~\ z슙W]\܀~wގ:w*C ^oj]N6[SVbXpS=yn%~ݔ]L"|^Z*GWV7^}-^l=nA͛\t{~<*흠v2W~E>㱕X'2GOKqb޵i˥؁F|g!H0﬚2 O\\RnVVwu=ξNs1E}z}|.kݸ>3݃da'>fL&&?]u!>>sKF Ǔ;z W=tv Jm WyxuhNUیkLg.EwXgc닾Gw9f$Uv뎦h¸kǗ/?: z>>(9.&jTWE`Ƽ ONbeGnԫL}<|cr]k: wKzgԿ#ލ߼ҀFOջgQNxL-f/."|SӰߨ뛑\uqK}uoW)nL\ߍ}mQ؈SEFyQe(\G+ǔ[Fp{[e}+ƍ%؇=qcqY>+AU߷ 1ʎn1+:ًX/2+GbfܨiɋXhv:z9VGmmFc}QNB!P$:gODHTak+&ncbZR43ΫQ$.1t,E|ɉ"-2ւ2؀pꑴTo!JF9)<)O!,rL c{%n7q?:h?'8)Epmenl.üxX4w9.cǓЮڠjqbԽ $2BY<>F:~c/Zm?tK9uk bA[NgzZ5^x?xUoՎVx_Tч<{;XOkѾ}]b{gFIY|?V[+̾[\zU}:y/yx˴tڶ|kĊ9>a?4E\K?^3y|}ݗٺ;13lsCF|[@~lKp`GcA_{=<Գ|y~$b\>z:4mb2; ]67 %IW&%2VJ60)ԓN PB,OӳQl6;3چ_߆WY&f,ƭk۱IB4_?*DAen],zOq>X5}1ՊGvt}7:X=.CϬS>dX;FUƱ9'\F~^lo6}6ckDZ7k"-M8Ѩ*vWrUT;2DYLd)+Vouͧn*j0ǒ?)uHY a+Ι:f˧̖CxP Ϧ6_6 'W#0rћFεFs|Sk@E]3=u&+Y5FԀ?oVl:q_t==+භa¤an듰e+rB! ! a;CJQex|` c*LRճO6Ix䎱V79cYmXb K`˘Zۅ7iu-Mmu$hWMB܂=?&i$o^-5TK>2/"HQŇNu=k^mNދl3xo }_`kqݝS<ݷD5~iI|&OvX߆g ۷?mc'Ƒ>mj} zޓ֫g|UƨG~Ox^2-l-*|7QwS5[qlIYF%3t<@#f3<3{%&܂ "(}jWU[Z/EEgUBEA Iȝ=on IH/3;緳̼~+>܀'0#?Yk9u~eyc+r:;,>8\M8DB! !DW~oׁj8+0E꧴fžG2HhV/A}}5@)x("b`2߁9>Цcb vf a`[-DbǮu-X q8m(0aO)@i@$؈:%)a^LCh ˥E? P2 )c,ϑi" %WI-Qi3ڡ!6 +OA+jW]-)__AyIzJ.L:o&sWPjosL)%O%=+ccp oڃ+3+9ؿj y[lmlH$w}pT}~cp5"gNT%h׾*Xc4&H}l%EN\gk]gWnڇ70}d\GNQԼ`Ζ#47D[Amtl< w8m'HB! !|HZqCG @Č[A7ɐ@nx%y q⏎x 20yM' Ǎì~̟TJg0\4^Ҡ,jp}vOmJ.ُ wL_(Ѩf? Ng^ZҀ9g!Yr<s:~'Ļ;t#ZGLW?TÝhteb Sqyn fo!kR{.+ڈ-R:kwaPsOŃx8lTЧ/P9Oǽ%D}Ϝq(}7ßCS,ΩkkX ~1{Iqکoo/53ޗp'"elfv|eY9e\תjPML2緒>;^Qi dkcSp9\Ck[[7k@2ת103 O~+ѴW~g.|xax;' |Tpa[53ZWŒ׿§foݍh`pa_ Xr K!#7SKH aKKAz gٱnK%aŬSƢR(B!P$$FCŸ5!PDAYa̷ t}3gg3'[BDI|)Rn}r~`D։$om5nXڀ,{3qYqg]O]dz/S0pu_U)^}KkO a[pUcq ;q+pkizضk {XsqXѬ?Ňo^{4L-'?-aἽdY+ Fޅ|ضUG+&V-˻ΞV4u\i7LÏn,Tj# c͛n vI8 ԗ=svc1!z-ُoO?}X%v5B.kwqotp uۗ/ŧ_.A] E|isz0n^=یlw24 >/s'Sl^WVkkM̵JJ1' DJ7X,48[qɑxD̓E?}w>|'5=uP8,8A=bu*b>kQj~F\|$\t18-8NʱhM{햡ހ}Pi:(RG>{,l"ҝ;,! @B!CY?LwRΪ' }₞S+(s;_G8} Yh<1PSXA%%6FA\P@sB!chkIB,Ҝu:Zj3@&*wÏ}Z<\@H釟 _ܾ" j:MkkdX B9,{-ևSX>F ,:afA#X4̡XYFb@q`(w]l0|0$Y/9pg~CZeǰca\>pY1z3~] ڇLB!H !&> j>vQr"h`뢟'E ~~e>0!'(q{(T~b&ٵ0BlÑ> ; lNVa2 $a:!>=8}drQm{"B!B!nb0izE֊ۈjQ)Y="=2S,F=K3W!ۏ!B!B'I4&Tj`_ 4[37?LMY;-WmeZe/PD$VaB!B!B$fЄ!_)YE?shE|v:=uDb"!B!BzIcR.5 .EI`DӬ/Ϻm".beNB!B!{A$MٔNUHS֖' fHp,PLa?9hfWz$?B!B!{A$.邗N b X`TxD-#B1X!u?zB!B!B$`?@ĈB n Skqg',W%jDtuf&B!BH I!FAa'1.=ZD^ #%Xs't!B!BzID'1 bXJzNT" -&W_(O^?vp/ '3B!B!t4IN4E6^j#˄)QKX=bEڈPL(%߁Ѩ]fB!B!A$M`+aj9-R)ڌU4DPL/q!lV B!B!g@$Mhf6cCg1^:@F6 581_3/  !B!B'I҄Nn mڸ{1Q-mά E{]Ӽ-'k;bjT_HRB!B!t/(Wĕ *%4H]JB:^Ŵr1D? '5 |f63 %,B!B! $i'bĤfMةBhbAp}: rjQmj).`K#B!BH IS/u 6 <إ.ф V?~Vff/D}X@Y-B!B!B$M(k(lh+Ǖ3Ę[CS3eF?&@̿D!B!=H\2!~㟬zjyVVU{! ݒIb' '- B!B!@4`b*F2]S,C2_B(+4hM҆>[FW/"_C !B!BH I!wZ*2{-˙ZHlf*ލ`dp^(Oi/(D"ïEn$a|e8!I<&B!$1M|i?_U@H!v@ !{\R ac)4m-{(m܊2Nd,; )? 0fA|j=U䳊~?`FaÆ!==@B!B}hllDAn& Y=N!m i5,2eXv[;޿Oݙ)L8QaSR!))s-6#X,Q\iDDг}Dؐx#i/gNQ0~x͘ȲŐ3?[A!BH'o T@BHHڍЛB+cb>-aP-!V|!/|~u ɲ- c ;~;Û_KF!!BX?s\|/ˍ1*(BH;H;~>WTN -ZB:T6 OcגH.Odڐ5jIi -E} !Bz vbk]ۀ'?C4YYn;*! iIK GŽ%x>VO B?B!l%ח3?YVcI/nu[у{e { v%4!Ȋ&dAmع?|p8p"55m$B!žz<.uF׊o)))].V'(l ?9elԼ/݈~jkݏ-H:D[tUߨӚ>X?IO Pj4/ޔ$ @ke9ʈKdYn#X/#j?L[-N9>v/,E|lpa- j%$u㼢G#+;[ۧEmmoQ!9NMD}}zR)vQNi6ɦ?_H_ϛ{Ob-yكc c?6Ͼ}GmBIH yxA\}1w`QHk},}K"q%/v"9Q8j K^?֦_6ǥs|`Kbx`Ҹ .ԫʞ3c} ]f^^نu؛9G IoUzã_^"sm^̛SS2i4B!=ENh"۷oO<[nFeÏ[x!z>466x7. >N5j,X# /3+w|Q.`OO?! a֌QnB%## F-4}O|f-L\4y:xJpgq֣\=;Cκ++w_v AƁun? _PCQ7v\11SZ&#sNטŘxi!B!=6hھ};=} _F,b';P[+Tĝ߿&M:EB#ّ:!€bff8X+)4Q*MMMZrOq{pԈ\\tL\˕(6Ŀednqk1731 bAt z!.abD?X?MSwC0j-(|l#U$/Nasvv $iXྛ&hBUf,5鶏p=-~ Vbj̼;)L`͚+;KmJ>[1Sk3֫_9<Q\[S;7bjڥDi\y.wŸ}s_~C!HKm\>},.8kn.~KBYA V;Oj'MOt)ByM8{]r-V~V; 1!Y2B)m/g4M賊~b펪{gߏ/߃]Q_iweo\۹$ #~ws-^B-F& w-_`Ӌw_X ;VΟN(ĐT5{v`K_`_سoEO='&M\0>[N| O;1g"nlߖig;N1"Ro> f0ęxܑ'^}?]\b5bGEfc#˦g4piwF'lXSxaJzl~,.8wt$9j>@}?{]-3nW|qHכ~>. _Ӹ㰘-{g(}aA[%ʲazMc_`\1i}*K@YX;3X"ڥ61[pxsaAJ[$lNM𦵨tg[w1`,uƎNᵖBi #FϏ>l&8F^Hqv"@zrsHVl;!r MݴNNg+H_ǡzq/B!:_Z0=!#X?hY8/1 r(Ӯ(jŵOSz@*ܥ""5"^ؕ)~_6 z&((L?nځX;Brawã1wYu*=w~rL~|a_J~~YJxc.:|>@SJNzs}ԾUOZRQRebӴ |^ [qZv+k& ^4/Mp7CSQ%u`OG}= \y6G!v/o3_-5;BHA9 >eOئ#kVjI' ^O'3fV5t.C؄'/%& Q Ptub3E4Ǖ.8 S >2AO,+韟J^A Ie:Qdz) }ux_/N,_ϗ`ɒ xj_@;!4|[xbY6mpa.|Mߎ[k#[J b,^_L̼4NWel]~J-ZVޤiR~w՟ƖQ~5G,jC8Э۪x|ffa%e|qd !hn7mQ8faWagwepYN"Dլ|JO$+bRAqyO%kέثGmLKD2uNQFs4 Ja0cqek!px!Yz$ w%LCv+5L VB@lBHBZL0,v `!!>Otm&M:GӬb_Ku^E׭؛"[*GWLHt&[_kBmDI0܄#VAH6zQQիش [\~u1>uQz-3uqonQRbn3dlSSy&GHW6dTBS$,o AƸ=v^x2Lo! Wpw@?!=MxBi#N$Ʉ9-/ZYs̞3'nv|YvwJS;/!H {mDd îh&#fE6%Elgb \(?s~:%pE4(i4Q57Ģ`(Ʋ#brj5^:|pWfs]v"x%IMSW юUxᱹ|IϏᅢ)GSLCP"8 7["P0"ܘqWnڰȥ7_߅t #okE>űBL#S1u/A~bLL:}{aі5}ԫ {=12MukB@+7$AbxhӦ{[;n>n<:'C~TFB9h6]H4b؇B6-ڞ<$tDp;矆{YYa) /~+V:IlUUX!;! ͚ Ӟ o>!BZ`&F1t1+Q en~)myy9"! 0G1GEUЋb?7ע5u%wɵÿq3(+pFƔz3@)bap쬍٧y׺XpwIG`܂Xdx7n]f"M÷0)pFa1v 5o3Oo^/>sҗaFAtg<Zڰi3,ʊnZz)r@\ e p ;= K^g2ئ~Bj}G3*Ef^ɯkѿ2/jb^b?(re-B!t;7!NL7!BX2z:(nP;:|rS[7!ugEx`V73YZ ?_t0)xxOcfX=ŏ~/2yA  $y^z@w8\s05=u8s&CWى=[m؅X<0`3ɆMNV=򎶎+wy Hy1_'Ys!-QD+0pѡ(<w\Ug~Xvfnc9 / 77>W_ 7HG: L[ p쥧cƄkGaʵb/aVawGQiA`4ȃQe)WŘQ;cܔÐ%jZ}|Oa7/Z=n^)V ÿÙyiTtXWPYp`GtM!.}2_w-233Q__C -YR~a؏JuU% f,"*Vǡlf`2;_ $& P7>~xq=9xᝍ8WL,쟉~}1x1 _t Бd)6MqqGsZUJ1˔;Zu/L o~(N+Gv/DG€aMb}M>˼k%>&̾l>EpB!=%?p#sskŰôeLOnMrwo?iw}F6SCo?AD,@{<}:9ڴNScR'ZFJHYՊZS48Ϟ)vqQꜤRЫn}ƳVWvFu'לSFۍxw܏~~}Z/RfRz6 IXOXox-1lx-bWrZN9HVoC%fOV"}qGN{Ƨ`2H;O !0Ib '<$"D$cr![@u$&%щ$2"wb8&<^<דtuPqur=f[^\ WS;1B{;R/K{_ u\^H IP:0t_l. 9MGT~CX]( ?)J.F}\NY %`B'LB!=v)@DfYH&.)zc+J/|!MC!S޺3ʃ@!B!àHF$B!B!@46# !B!BzIB!B!A$ = !B!BzTt!B!B$ = !B!BzIҰ@B!B!@4 !B!BzI0B!B!AEB!B!^ =IB!B!A$ $B!ByХB!B!^ =IB!B!A^@(B0Ԋ(eYҝ/Dߢbt:p8(!B!t iRRRr`۵BHwFצx׫f;v !B!HHB~ 藕}"33SL ]__j۷Ok H!B!}P$ :-w%MKz B׊ B`YY (n B!v(ҍ8x`1 9tnP郂TUUXޯ=4%QB!BHx鞈PH$D1cư/4r"/(<_KJJPQQw!,D Tz$ PB!BHKP$"IFy;B%2d&ܹZ=SӲvҝd!wpTܒ  UY/d[u52$ɦ[82!ɴ'(w:jB|(!@~#$8?nݪe`v}f!r 4!소zGKTuYX P/i" @&26/`,5kgcY @V{E梫.b !B: t#' ѣGkFqkPÇ?H|a%6[w2wbaI?x NS;Omۦ7=E4E!x??άU!.ؐޠ%&-.)@!u~Np `szccBڜ[FdȘ1PPnqyÆ϶NpT7B`8mXS 3`X6mE.v1aѷ@^MMMK! !! CXgn '&94s94x{yfu]ZrTdCIb%P(YgD_I"D;Lka@G g_[? 7TR68ZqiEQ'DBHxoC=Zh0@\O̬my+ ͍1aIЊuaB ½P'Z׺/Xp۝m`uDv5vx(a$.jH?9 N4,Ce;!DP$ ~M5 .Y:a08Bг!?g!MA@Dڸd!#ݍTferi j O B(ĸ> ^ot4|5j&Ga[[ނ3u?Z'@(0@"Ԋ&*8Z<1+?U|u] ϣ?!5Z^6M-4% t&M%CZZ]NH晑 K mǴDg!= Ĉٸ v6, ;>B !JK!66 uHqY%m74DEo΍(ݍ~![yEuAPzR^_Sc#}P"۷[ ^惰;f9E R4ϡyu?B)5D=j3\~[e@\V(B:f%+ H]]QfLAКDTX_*uR۟b {NY#rqu` 4 !/<\a,xV쪭[QŠb .X6g5Ƶ4c\x kVAu]~MkQU ]r hӵqcXDVV'O@:-;//O;DRA ^ƭ|2^ ljqťyEE!h)g5OR@ԇzI݀wwRPِI!4Iʄ@LxڎX^*uۜfMVc bxB QPb ZpȑHCQR؃#G!U\-5o,B 9;R5`e./Eaӌ87;6pި#CNnf*"ÎTR@Hs4?A!at-A!YBn !JHu /A{ؠgl  6hx8!:'V /E aO2D?!^XZΐZ]'_=1$dJ~Rk 1!iBtBxDWŚ:Oն#w5\*<T__XVDM7.L\#*H,)P-iEQeqܑ#1l@_ZDm!yFO- {BH[^{LMdE|6@O3#2(5N4B1HA@v{=fቇX/@]`3?mdrdwi6;`OAPnGp^!0f}B4Qx/ I5H0XZZ~JՇެ)ZStO?.Jgv#AHP+ԇ3)O=y=!I-jpJܻ6vM; !-} q+݄oȐ!@'&lXma O,'Bb;V'^ Oby!k?W?UcPMp•qu !$IrDLzzFԆ^ qq 'ޠ;=%HA);$6JHt4C 3 7?4IJ!%3+фn<xQ,6?Qҵ.^Ba3 axAo2tjԯRe#_vBHs!]qi>†0!fd0-(ݴ"ِbS6o\L]+i "# Z—%%"Erp OY1=Oltũ3ѡ&lWr>-]ҲB^MYxi;u>쨮sy)rQm|)6ck^#B,63cL[Adta¢_W7p߾}}:(v^yRgsꂥ*eoV ,B!4 bă0p;$Ci88&نX¹ euR,VShon^6("&~d4 d6 ۺcNzfGjD(D;m>Ńk;xCY3E9!UWWkE}fB5hf6}ށׯ0!jpj|5Vb! $'|T>[6J cYIr:H. aXv"tA.7WWyd9# Q|Zz68 P~M05,f_(QB|X3B~'ǯ!9 g e5;1'\r۳e!HjJCqcP!ȉAvTϳ} Bh?{oۛ_91NZm}} dN%0ڋ-kw!@d\ݶҮѶe x Vo>Y'<M {|)â"{P 6'XVx GLO/T4L!"9{!2ej%<%ҥhLݯ=Ļv$u HinҵāIBtިKV^O@ccCkb lF |V/2ϘnB$7C??O S-ۯtQJ)@a_\aWjBK,nѥaw}?,}ҧgYB{W f uϚ(!B,B 1aPO5õg m|_?!<8Pp%(F[E8ʫpIGah0V~ן~?5\,zwֳXѸpᒻ!t{'!oj혪mկ'jC=V Rzدp.@2 {5=$imXm̝4)G+\\:JE2wim!*W\gPnP'~ۆfyԦ/"M=іDamfaa!" UʞQf #0 CZ5Q'|qG&7TbXl5}}1+05e^{f>X/A8j<{!Jp8.YXJ1_y5f$/vA1~ :Px`w~SvpGWw\7Z_a1gsSW7_ף=&KkG;A?B( g3݁ntMj # abI H؟Pr";Oo_DQ0`Y{s W}ہ>b)r6^=ÿ~4 i^Ɠ.=7.Õ'^5:Î>]x"tzMYFz NA+Jx0n(!P/b]]FR#=.iC*Y@Qldu=[J|Ŗ?8EtهmkKKæ'm9՟m_?P7iNEĿN+>Z G. ݍc&⦻aW{_`̘ a/-V>*D?!ډ\Yx X ?+P~- "S{O$ CSHˋPlOxbS,b[hvBkaaq^sxyezݶín`KEvB 8 &ò^×^tJb&lV67,DԄmhT)ц'C{c'm~ON.Fv>چ*8xz㦈{ N^+q<S\R!οWjŃn>ĜǞGzK W?u$|XSt'.9CsT~:)97&~YK5ko^¢Z)(V8BrsҖ?G|> Hˆ]͟٣ϛ/ykOWmj[7}F sS}/xiE B8wcHKk+ն>x@/׍wP\^ qwڳ&˯O v٥Wq<\m.=^y:W>VdzsqtQAvSPK=D˻n&j׶ێ-m$-߷aʈLAj[m-j[Zwnkj*:֍({ށ {{}y /! {ws99 A\U%vi<9 XW^x|/C|On& x2WDBYHDex]z&=}X?,p9,\3  X+]1Yq~9:o {qГe*Yh V0 V|Yԑz , 2y y1j[vh5vdBE ۱ [pip Vo>öJ"UչcS LZع isNF\{(EMx9d t L#C14Xm{BKv/=ĸ7[vO5V7@%dŸY<M M…_gm⼾a޺sFrr|(I)pUgMEYjv g]?=_?%GPYmG+ &N܃-@^/ _Vq1*M_̚g9Yg}3.}dsZqoGV~ ,#[:=XfآQ9c;Sbp[|k ~W~0'pd2|tLy1~ȉ뮟}M+ (XF'ֈ@m92C>É(h9xiq5k ȧo|"5yŏԞEWǿk?, !/*ͤi֛-W([<|{W;cѸRkewKH5|shZ0ݜq>;'ǡ|R,:O%u*P^jy]׸ Lk \2%vp BRZ o܌/܉JwTNGiR03(ڰ eO0n(W6_d53C_„N" {i^ڱ6FóPmE,,,Ծ֭/V.8 $钵Qd7XB(rʠ D33 sz^΁bu#iTT톢 I=6X;&jчy4/%Ch4 /MyTLhMXrWf |\>=>+޹i6g.V|VB.d~&QZ؃7:C_!Kq}r#L}Ơwn7^ Bֿv'M!K^|R?koxL~ y 78kwٟy9͍}8TxWG|v.~,}" Xt.}>U˪ccr/te5vOדry5V)6@ի(Y2m sv|ȡ3NU`_u 2?|\7f8zԛ;\p)ft^wyp\xN7|QeWko2du]jU^[IĚ 8#mdb ND$Y,;%/YX׼{ R"1z vx6<ZBN9mw°-fM33u#10d7tବqFe?+C8O4c_݊nS%^bCcɮkŅˁxtÔњIx1=б7;NjC ?i6ޏʝ^s_)o-#`¹[PENaLNذܰ'ז5lid2WHvouu}$P$CDZ*nsPC3@ h34X30&0ĥf >m>45>!¡S1M쨈baV` 1\7?BTMcpmҐΝ1vK;j!|<!C|yb1`Wnٷ_Ac*ρo8R\:r2z۷7tD"n(/4qL|~ &| ԎK0IԆgKR?~'r#9|魟Mh} vʎ5adk(@Sz+߉W`zz"X h|pg %'Ǡ,(*ZdA|(\%̊G^C1$ ]soDi7*َlCtӺȓ _̷𹢰v&T-i.cI3< |i+>Cf6T{؏Mm G/+fHHHB ɖX_T335nky!baHq!J?ML&iKڜg&jgP/>rDdncon+e+onڋ_8 7 Fp_khD ^5cmDEq?z\zX3p*LR-pq挏'/0/~ܐѨqulZ~7wQ;d3ϫ-bY %-տ^-u='R(j2] 'j9ZnKgPRBE@>_Udf= tj>>ۮqɪn}U/km-4$f8Wq 8K&L6w_9 zsn~Z̚pϺk6),woJN&EpY=ظ| jhyKQ(J>GistWkM:cEA )uxԝ,?7휯yfxCW ^s. zNt㴷yj'Ʒ6\?d2ĈSd" SsRKQw!5(.tٟ<؁F\鵹P%OE\s=_% $]388h/&`z_@e3ʷr?FCZ#l޽GSKr-濯BJP=.WRCM}b{R˼ ͺ:&vZU6~*z[6݀5j9=!yل""Ld~NgLҼ*r7gMSۦj#~sݞӻGl! d Yt~1\\4'06r|QrO%8(W;~yFgaM﷭I)Q)1Di®yYcoXǪq=~5blD)ܺ6(w rIbcH9>HH+#F-c|!/*|s?L:"v>1gɤy}6_}2c>zs 6׳+z.N#x8m}OX!7q 3Qax|TYkׇ3Θ4Vf|^5]ލ2Ÿ;Q $AL{b|-n2«Ky *w^ z{1()vfjgƷEq g_{Xx}P/tČ)?C%bEC#9^C ñts|ݑV6FSi +J[l 5iuvD$߲EFAk6ׯ{i^~>s+zpA_æ苀hJ} мEy2[-+: ! n{;0ի QbuX8k1OؚU3zO{hfzH7S`]cDibͽP0 T| s ݏƮ> ]{OQ <%-[2;xX}8#'[j!~$vǘ4m]gL~`ɓ+Q}uͺ -vϛ[_=O:\1PuNMP*2lW?)'Ãw_aEEz+'ٿ=(+ڰbcZhÂ<FdWJ1]Wݳ 9.ԺD8cs1H7T\,l5 rts0(.Zm+yQ2f]ny(7'GJ{.֭? Oĝ1{[J|?= ёXlDfDP.^t%aɶL8W.Zo7`ïp覶>_}!@on5*gHHHFW1f[dz wJ.<~!Ps}Ap3 nAOD40硯EyePtˆ)ӴVdb'_w>OHl"͈3?)/7 ' 9KJL3{9^,O&Gϼ[.€p x=7l<.JKPU_1O_"p_4FM~Xo/??_}7._s^YSW nwm05.,x9 58{ܹMQuVw;`<G\:a"f aEؿn=#p WoX3%zjmR5tR[pՇ̛aۿ (\!Ÿ/+Ÿ]KZisZNM,j*5vDk%@ #)f5_>m~y/02bΎ^cF7bqqѕzS:b޳"Y8 Vjt:_wb0zF/] sa"mucTO>_aҸQGs`7㱲p 6Ћ_Eҫ펈n8P܍="6EhmUZ[QB+K<˿F]m.2Tg_ qŚ><0sp~о]µ톗v"o?#""4AXW]WVю1q]cU&ʜ{ZLj|bZ*􁃴]`8Puѽ_P֭cxS'^=~_kK|(Q~Xr^_"B; ]p؁Xd݃X$PAqTp(՛-?_}v`)*GLALx[:/5cj-;Uz"h׻ߨִQS\N}$}EQ8)qk&l!ARɏ5j seE޽7#$WWŊH61V⫋| 㭷ڞ'ׂW5}~c[ۯ~`lUqմޘ35ڐJ0?O/>1Ğ'p"Yt " ]vmkʢ9j6>nq*:b$Mn8LEju;!;Y|(L;Dф*J5WqE]UzpV:ՔbRA(Ѱl:G"9y"xUI0< 8ykc 1Oi0#Ӛ &fz_5i/x tC qθ7h!Y'e#22iiiQPP(e@ʂxVUUi(gϞAn޽{}ar‰E3K ^.8D*Y-VmaF`ڵ,1XWo u|HI@xa+ܡP ^R0,9j5QP~,bE#aqaA4;ͧ@ )iԄX0f t횮>MV;pX2XwemyU\^wN|K .x1W { <7*SlT:D T3L1 '"~yyy!rΝ;kb+9x 󗕕O&5((KN]P>#p;>88 n3B  (++b K_ !žxlX,axd b!,ch8گ(Z_STZZ[6#>.bCu<N1hU;;k1ɘÊ̯Cb{k_-j³Zo6-@i=j4kpE4D@_,;Wikͮv>"ujC^58 wn<RЌwKBk-BLt_sd˱8/})e€)GPĨH?ǂw`hPgDߘ6c]w^}\mВjt:k E*s?ՙW=b mg-v|re.@[P۷f 2"B )b(B<ۃ[m J1cз32z^r73lJ,؇ʅ6f.! 9 ț6ǂ)?t&$9dƪ{2j]W>,҄P@#.EEرk&joS<|qmW,WQ:DՔ jћp* hqiQ!.&yOXD*0¡hq!(zB7 z Μ]nDY(u岘ESe/ʣ!D=e ].MS;'sN8 Q(9˂/:,IM!՟U^4_HV>A B!/l,!/Hܶm[Ў0D? s#cV +1zPW8ՇD! mþRTecB>= 9I!,vXx…#'bcbk|yxzY(٤Ցz%dtInDV*vmM!A?^d^}e uyzuP͚ ^@b#w*SEHow Tc;ֶ1qMڊ0՝mv((71TX<9ZEܓ6†`(2G~狋v\>6C=Xo`nj;gFY[`llT}K?B9V(r9q'3.!C [<98),iH95phwg= K`Ÿ)de%0Ǧ)2j2 C@W_V]VvހăvXq!0V6<eC>vڥ טOVp73#{;|^|=ɈL@$0FDZ@1wf)0B9V(r9qG ۓ!VPAN U"{rTVUaa] IU/6Նp Wa޺mz>OBs}񣑅C~]דyRwtE<}!Zӷ#( Ol2x $}'Áe:C,,,yA)K?-V8_";%[ZWc¾C^ $ !'YÚƭx 8H{ˮ JB~e$m)RuX}Kv-+6oAvmII_P76 U/(uP<5P<}^26k"&r*mA0K~h3"6v ! gx`^лB i+1?:ujsC\ExH0)\O7Q~ Yl(`PFJxP=& `P٫MwV;_BH["###88-- W]0߅v0[F 22 >ŋJ/JKpndYZBt(QMFzza?Vcz?t#QQ^yB_"'P^VcF3F`~݆7`C"x02HJlk"`\T5lߠ|6*+ UxO%u@(sß5 h_rGKΪ4x/FDEH0!A}*A6 jeLT >}{bvjauX6xWIil'y-W^L5u /s%RzG)ORκu릕Af?H[6\hl/SkNDq{BB?Sj|Ԇ::$!buYYYy6^~2p24 xBZp !k˞094 }?QV ꑨqWɰ R{[A LEpoߌkՎJn۴\[Dac즞Wa5hn6ډ2{GRdвru}wFͨ枇BNE(QC:a#;ɉzs!ǂt> pN[h:E0cմ΄Ϸ žwP3k✭C1X0Y8+f ḇQHe WIT!=o.Or?3Bi'BKa!BAÛ/ ^-)=`sqAH H_-_ !6'~>.R/y\v܆R%BW\qQZ7];b!AZV3{K5,'&XMoƊ8B)i;(3MB! @rR0<5u[x(?j|(E%߿߅*h-yxbO·/.??F,䕺Wm31uL".'νs.xK lMZT`O^˦f4YXd!rb|ANn!_?L.^-_3c`OANvTa_1ۍ\v8 [_w㯟D3,0;@L\ pp7xq=ݜ;#WN+Ŏwc3C!4Fo]"6xbɛ[@h-6 H M'a ?;VGyڲvrD3`ScRy`5WgsaOeZ<@Ep·>疕^}Hoi"B9A"tXo2N#-Ff5ŕލ)V(^^p=Oھnl}^|#lvt`o[xwYK:؏/+va̰N4 !fmt|y߭xs_%/ɂ{ wOnh<>sQ뚔x:<'x聛^7:xX݅E1iot3 =[^ۅ>_3܌ќ4B!,a"můފgK=#dk/^wP} 1ڏEyqUE~pR`<S4'|\_+W^硫ř]hB!G5 $jJxov1lӻۮ*7=MJ&dk‡w].|mWr楗B!䤘arQ*k>݀끮Ѫ^ψ6Eĕ=>mF֚5kp0( |~%EQu7[^_cUOpƈGagM`3w۟oA4rPuuwUz qqRttNf!BZFxG$F1c.6\e7b2}*k脎^4< V9[pͻ(57S&gc?+*y_6Lx;FFJILfk^ODe4`y"B!6O~Bv 2D ok u|8p(Xحxayv1ҟ/?B!B!3(_%<&]wYI>lB!B!$!ʍC !B!S&́B!B!ҁH!B!BH !B!B! B!B!t`(B!B!ҁH!B!BH !B!B! B!B!t`(B!B!ҁH!B!BH !B!B! B!B!t`(B!B!ҁH!B!BH, (())Fyi|>7!Ү *qHHtʷNY8-fD8" )cf 1 Hk7Yp4DF!ݶUWWjNٶM򢬬V ), t֐qQZRb'$2?km|Kqڇ)$pKHAjwtƣn ~߇>, !Vl3O(\%޹I:yWUU χ)gv^E@L6r6ZOfyh*_t*Vb **+kH[&V'$x @E6)=IR\\ @l!J!m-Q\~ݺNYPvIIC0c|!j"#BBIT3OR|)n.4OB MHLSFdf U]GCA1KB!'гWZ=0o]h"V8C^6yp^g2tO #86[zBZнGzX"׷ {ݤnw~ m A*`W *LABiam O6!z{|Vy^Q%^p nAaic"л[~6=S_]_L?Q/>%3r9o̚7QhBZ#oIW:&WAF #<_C P$TrTQG!ȶyзQr~yd5fB"ciYP]sǽ//NycoVO|ffK@,P jȯL&NH2F˨ˁo5q?⛌<CX&TN_ 'f DHZ_߄BHknS{a臶u'C%K&!&ҎjnAi,ܪopyogL4^ba>卹v~'֭Ɓ70^[Ts7SChF{>};O l-ً?Š p6f3b`fV_ ub``(W\q6n!s}b޼yh}=뮻Ϡe v \'˜_=o~ {$j07wê[6i)EFY`S;'b`!~OO!>Y}^[ aݧ m)n8ÕAY^|'t2XTT T+yBiC}ϱlUjh_ShP=?-|}?^b Eh3rL*gm̭0oGu…~ݳw&hݛohJj\Fܮ`<ƍkYט1cc=)sߚ]55o)&ۋ/][8vy#J`E;4˖/> M q?gu R7.ts]**+|OCI!fmܴheMjX4O+J 6T•pd?Iwh.IZ~DGGﳤˈ[/ }l?_f=cyΜ9z1wr{}L.7|_R?It~(wJ /˅S+FmɷW6\= q184ɉ3;{\y`ysepD]vaɘgS vׯAx b3^xr^čnv٘y U%@KpuF rxƛBx´[C hLx$m'~\ &E :/9_~59VHZI.̰HD4?AT 2;Ɏ<ؽ 7~q֐4D=Y AE:J7&ckӐHCJ*}l>*n>l^ Py;Joظ+4>F6㭾WaWy<2MŐn@Bw h=lpky܍M90C-7jTy[,Fɠs130r'|S.NnXӜk0h( l?*l\F!euOG+?>ɖ=q?Y~]m,9?CȢ"3'fXa8{t,|VsnLdSW-C^(+z2_śľ25ޖh$g` jI`7܀j3zſ .K_~ އr֎Ħh:ŻK*'| eR[h#x~z};jdU(W@1ޗ>WA 1 4qB!wG8cfjGhΥ4&{_5 }5+Lq/]H;vѽ9D((.oķʪڹOX][iBojL8|"d9%̚5+\ǽ{%q^饗4@İ[oUGrC@ '0dUҫ"ZFɻ>!i+Md#C -+r ħ){[ƹ(I>JY|4q9%ojB}7:B!=4%+)ǐ#%D'xz2GiI7 $0ʋrrQ%3CZm !BKohy"I)fuں~˩v#~_굈?JVݰ#ʰyg> UFK9kxׄS>|, ȆaEE3d89Ccmy =X3`jH(Օp8`BI^qcDX}smVli`p%u}0|@D8vb֕X|LH#ĠPPhcP_K0ęIb ?|^ƒyQp( ]W[,5c0"(ݷ_ 90, s;} /xQ5ȏf`G]+6AihTgc>7 5 ?tߍBT==3 6omۄK#GR>eؽl vN}+RGeP#T5pƥTTB򷼐0u_i S_W=?ų/DKnϷzů(,sgPQ]=GPm@wGbv?Jlz!4 /=&p(+DTփxji2~raTR6{sy]#b'6֯i2D~|ZTv>+&]c̻|R+T+Uؿ)WK0H5 o FrPyK?öb^`GK=:c/^F7cdD6@Il:"kao`B&/Εz)naN(=g^UI<߹׋1o>ٚNz I P b( b. X^"DHQxE: jBu|sgf7 5f-3ދ}-*g\|. NCB).9s-ĵ4 x/<2cǎ'/<Ųaqa@0E-?e@HH[&/v3WG7=r?ow2=۳gwS8<SftQo;p1|8yzw؁ Ç,ÇO?ƍ vdy ʊϔ6,ζ~K7 3$$X\v)qX+Ӳeho KR_wEQ)@a5+7mH 9)ؘҋ)K̊8W1bXvDyeOz vW=sw[Xɖrorl}sƌFP=&6& 3?] r|r<͖pϝw^=-+G1Xce 6}(ăi\vUSw1yo^cVx>:UMs48dE1]ЎuJ kKD,/6Kp43PTW >;(F5@P 'aFk0_n8to 7Zؗ}k+Wp4@(bmljZ$ĩJpokEKMU80*4` ͬh0i}s~htūpp>RD>Cu)ʅ"kty1MzHMIA`~,HB0)J@"=#q* p{"1OŰBY5'pTfgo݅]Q# +V89Y]eAyR [LN ^FV6^j/廰duLã}#ĴdD,[ςw. QC~aƲw#tϺR*w1qcۄX ZTyo܅YJ ;,(ofKpWjPe`yg:''C9cqҝXicbFy?Z-cPۤ㡊n h/džhí1h*RyxP ~Cx^}>Z>Uf 5>2uDϩT*Qg-r`h-ZX36x;ǯILeۨu eo)*0X:t`1cƈJccL e1n;2OZm3x)6mڌrQq٣GwQ–ax0`Ϟ=޵1Ĵ19*|ω v߬LOO7Ě,qvg*mlIט1wc.5kaÆmؿ1 wy[+eu^ceaoroXܰZqN(h)9)N┾Z^ΫѼG&=8{e62$)8'c!Z<1jPR(BTu?%QkMfY<&`(?Y1/APT-i_EA: /JTmFk@c  qmcUD.#Bڣ{wQi&cF?lBI,Uk Q`8aNzPϔ 'N=uX$qq⽸Xtk֮Է,~Ⳍ4{qqF`~^hyֳG{tҥбC?rP7/<uϚ9KL'[>tR1^LAc'NjOL, {u6]Rכ,uV*[v?I`J%ؼy3F eڜvi';tRwlriN}eVp12v/M gT2+Ej눫x9,?.[ru'@4<5Z8~2mdܤ_b]%q@ R(owc]5='Fk٧I\Vwg{- ..CW8c7@hB0$[!& Pfjc!mBʄ2jENΆ&%7jТe)OyN&j.enؽW|I$D ᪡x܁] z]rd(?mЬkB2mBee5CDES^lg= 5( 5RF 0{Ou Kɣnd1CTIK=׈ovH#"T#ΠՂQh31 >ARZk9ĠA/ܗflfa ϻwf)X|ՠ}NH2eS2wO>9zHga}Ϝ'eh}oQ%șfN?۷9ɟXo)8.mrS_llmƔNf ő?Uy-ccaYe#2f:؅Ywtcbptڕ.ȤI1Nӽ{7ˇt%xu_.ݷ쟛t6'^*Y xqk Ɔ ,_,݅aľ߷v,]S<5X&1/NqoeblrvfX&>j'/枾{RHqCG89’Цm蚨@ɑ#(qkB0AJbFW^ryZB_m%P6KB9qt<#iAhiN8 I-TCgI{Ν7jI}r.ydМޏceS7aiQr1|x42x%6GPnhAC OP]RMYXpx.K@nmѬteߴʠ}zgj3S2Vo, &:j,jP^ (r14YX7ݢ;6Ah~HaJAf*!]PmB#RV yoք`ovdʃ#BV;q<( a\5rOs@ GZzI5d-h DlB dɪL_s i0<̟CyqF1BSgc,0QS@`X,W3zpxV뽋{P,0 }-R/[<] xLW ۆar|޽;W;op')xkۘ4E>=I>[{˗c~7o#qLܘrln?EC ~/2ɔ˄fqŸ1E scnN) q` \%3?h)9Jx) 1X|YX#S9Lv\BYarci+ȃŅũ{wt, e/6{xz"J_,2w>l/֛oue K%c}ec|f|e垹mHƎJL}Td*9޳S0um7,rl_h?XZY~jSXY'iqC'/QĺgƉ7kyl-m J 6<Ƕ'QTZ̞D'0 Hվ%TG?M 6M{`iQ/-(Gq mzWűW%Ss% 0ZԜ9^QG8 * ES8;RO:p (?(oΨXH8hPyJ}x{KՏ"-=nFl!Wk~DrS\K?q,&0З#e&" cڵ?5%Pᕈ1a/0owq&Av)gJi(1PtfW êCȳ9^k{3dzg#pKDxiX߼T\[qݥ1)huHdeƼXߞh Y_xs*m5c/n:HdBtZ3& B۠{5fs)C?qJp5c{9%vcxn|h~ ѵP+PNQП?U>hgn A @d~Fe˶_;, @#(fx111xױpB;7LĞ9ۻa߾}us/؛>bF_v?v9/ '_)[zp…| 1}L}EEE2M'{>)|XlﳴtE= Zh!/A # S~eo_J~_xA8r>'rA2}Ԅ-۲eGf2@1n[X|ڷd+OLbU|dpb]12,6[Poygw eehZ}<ヌX1\sіWb.rЮISBTXP=QP\ruq"eUYy"oÞ{ L9{uriU)WʁlސcF{ 04:#[gKT 8}jXd$ GFV|%sӉp)ؾ52BLITIKaplϡ=p̘@B o}dم I峎#"0f$ߍ=!y7CMH :1I 'KTc m^e@x0;$ė sIЦ,$r:SKvؗ$( k@u" LAǴ|޿û!ݻB,T۶m#ၚ8[ӎv6 4F @]2F? 2/g&PLeH2y?U: {!ܕ4*9$ I>a9\'*C!牌g|_aRxDtȺ5RWtpv&>_rS'}͗,Ś5bchf)G+w%T>j`22w($O=mÔF?Z6Ya=6V# /"Fz| f9bBEKUNx}aVyDuv]2/{Foz?x>ÌYfLA mۈV"BI W(벟нWCgcH Ly3Vo9׾<&:TVB<|+ޜ|ey!Dmm2An?SUsPw+]ѧGw;WoDez/ $=e>*}=pˠcgvd붬w@.]DE^cI8(Jdۃ7D7*CW3pme+S7! N2^{GL鯼$(yYsP7 4f0c3\L ~m)t! @b{eђ~ܰxxW_uVQag-+f.ѭkW1Ɣ\Q1֮T6IHP(_v뭍V^mX9dywvhBi;g}z?yDrɅeժiۮ~]cnꐀnm?Xj?CiE |h ߁fWF|9dpÍ`<ѕQ|㿶;7˄Y y<+Z]yY*H9@\ -ve~ͳh-nQ"JjXi%;kKmFǏ^5@<;~y;,)q-HB,\il[ tŘpu0s?CՎu8f 3$l{is[d2qo4ԟwc>c LNӔ++^,="gc.KA#58c=sPơ}^VCNi D :b&7ǩ?K86FpnJIGxr*l-'QT$^K 렭r܎W\~=2^$W4yW?FhSyKALګ|sQG+6ct7x+Z{xW/o?{^B.eZlð3ZGHVN uk ;pj$ӟG,\ש9D2Q4f  )+ 3.)--Ǵ{ lo0`YP ܙ2\IL;tV8q6[ P*7,i5Ucn061o;A AWpv8.7j/̊ Se-}9ިgպ2kh@cz%"" GVNj6q 1-HAWIu$2ETL +;___2`{ɶ3ۍs&?IuA\-q,(58Xw9ط}&&;y$|h^C3ИV+5>7\tUO6شq R[? nY& v8{!6*) @ :t kdq1ab#Ehp=iGulklcMeô4!1L5ʢLA2Q'Ք9AuzTGBbƞ c QRtA!i̒?07ʘ[2ih?qAAAA\HHD@AAAAMRAAAADAAAAф! AAAAA4aHHAAAAMRAAAADAAAAф! AAAAA4aHHAAAAMRAAAADAAAAф! AAAAA4aHHAAAAMRAAAADAAAAф! AAAAA4ad$j`ja0r/H + JIxAA>/u#⪜9;A5T޽8"O:ԯA9 qaBtŭ>RM' 8WL-N,a Q<0,5aNp_5DZxLU rG·{IxIxdxjI^rVGA7B?/aObf&κ#_~ ! @F&a#89e'pY^:\0}6$?Aa> :nTy>R/8PNO_$jϐ. n~^ס4QӠV8/Z^+G!'SN:AA8U\wa)N>U>_HhNo3N6zppfl` [Yxbm1u·F_8),zn"ַy ,x,0N}SLi h m_5xtDDφ'6.'0-7~wbɍk^|GϢEkqA#Lu/? MqVSMUXb+abVJ׾k iw#/[tػ|.['+x|yb}?Z1l18seZVZ߼eɰoF=Y2|cJ7}aןC^S})v"Pvj_5>q#ryd7פy+gb=!>K6-se-ne4C nކblÆSC4|= vĪTD݌Rϟǎw"hbiL f Ryo`ֆ`cisl8oYS&tJl.,1 zHPW#{n=7A՛d7 y7GP'(XX 9><19| }tW9uz /- ܕ9]‚0Rރ(cQ{{V/woGo`P۰ 80psa~J th ygg~hoL aBd! anKL#HCp Ap+(kD ![_PvVeGwn7ћzOco~ڈyŨ!&d]68Ǔ +àEmig 2^饘ᯐt{Nbc˕/AW7 -=0弌5T_{eʩZ7U͈?~S!ˍފuש_' 1$$L $Ya`^`?dJ[w =v/_**j9PS,JBW#"avwӨw9La}i}Z#@҈p!+ޝyuWM]*\  `uV C#RVli 7 d_u8SYxu>5=LU+qTvl!wV1K@WvCqygjT D!lM}^Cmm}^h) ﾿ yz"C:ԯA(dH\ PF㦖j߸ %>8d+?W(.6`4aͺ26E(k.IqOW|ޗ @AWLyn-$j {6a0 o]+}:z^7aRɪЯwÊ.E|Zcmxe44 F`(!f+yٜR]a 6Yz3|]7KCLxKm?E!mC۰fy?U T&"ןM\*70!yFIRW\ZUGx(%ev}^zfWނ׾̟@!,ש_~   A4Pr H$nݚKK6n-!^iSz1MQ<=.|Ag|_aR0FtȺUTF_OWUYh`z w #Ymr$,K9$ I>a9\FMFHKc"R^^ֽm85҄4<3 V}?2lQAH2y?`Z=JTEy9v1JEGah Iq܀l[_r Zobsß 1Bp1wc%繘Ƹ_+a]-QU>AL?Iޛ[J?D&uwk=#jkU=?h7^X4K XԯSNA\7p1:/$  k~YZ~S* ^b3i9S~Z4!ƎMP塝|1|ȇ` Q~<en*DDPz>Pݩ*7d;)~Qhu 4_{nAbz]\8_pD9=R'OJ9~[#˦@T7G  F]cmkrph$ kZG˯Bpp0+z!$$& Y-Kg\Qϛ5 @ffeb}+R@ BryTaW 55:Ȥ m &VaCB{huzd,) *`Sۙ@}$C[TằEGoU}ճ:{6`_bgP hesp b77඾}WtZq)͠Qc(PY\D1-Y3ebLb5 y>s`Atco(2H%[:6]ZW3{f\^zqm-7: F(7,73kAOV[Kϯ=9XbB 9#=|đG`!vqT7zz&%;bgvksgʂ0?mY. 7o.X\uƅ;yևv&>Ԙ:^^Kw wd,wa/1y9L9)Jw4 mCz{ 1cy\:sg`Sw eQ;n:r=3ޜoC3vAp噊oV]"Ճ&AWWw'͖ 8ץ[l S-Z烆 a~thYZ_0, V/ TV!c_ 9dcX1kYe- +I)w3Q絗1 QeUumu+Ʈ*a}?Z ,6ɢZ'GO ]$~@Hضdލ c:FOis8YC擈>OOİhc,x,0N}SL,¢&b}1x(܊l1~ؑ2U{EÝBd/mŐԜݎCt(KQizx|rgKH;LJ{[~oVD^>qqߘָ9'ʙ̒W@yi>c|!'}Z=pʼ]Ģ FFQ?=e.C&̘0 9'cc-akR_&1l];Lz c"h k=O>/2[VaaG[ö֓6:Ӻe+m6^'Ɗ#e-7vm>D)kPfgB<4|/^ _ylGN[+/|x/͞17p_ʴt)o>/f//fYo\޷mrT3k90=xwk~{0g;m7 G%Bm1L G)m[{=y;Kd7G y7܍@A$Deߒwt#dg}4bTT)+24a V'Dj'AWWrL}}q|Js2WHIZ u Q;"BTa7䗦JRZNT5Gt*xZ5: 29w߬CJkPXRC#oOwfPY'HH@T¯J&+,x8h~}- K&* ٺc !}aB= ^Brs|;m֞Y^C֠04Rx[GP1rP.2U8/ő1_vs_>1,A)N<=ևG^GV`v.s aO@[Z|?/ա'qE% [|Njxg2 V S8y'ÆqA"H'< wOI}mW4CoЋn>Xqgڥf;X<j]鎿 7.988p7mnٻ%[. ^*&B\}55aJר6x؂xK*c6*^n3ewoфށBen[#zb߰t:n^ 0@˜An܏J9Gjҝ'Qu{0PHڬNSqA|ܝ. N1qL|m@np:ܤt﫢Zm!-Ѻu&a]b{x5%H;n6,Bl7kTun,% {H5̢Z}uL&ڵJwuLkt0Y&ޏ %oQ;آܱ& Y!?[F=7ޗ;|>Qaϲw;2qk0 Tjm%N+P%_-frc_qWj\r-o"U (DXz ˡ[r9`G'P#_sf`yy|7"h ŖpEx:$1uw9}C?tX6^I7֣B] أ[q5sg`5zOb\}XSb d52m֠W![mBV}ŊtUE6 ,=j/&Bmi; /; !2'?oG_`"h`: *-O$ov, 5v233t&yECgu:~g;TZhBhgf#xbU(һ/CJ-1:b?`o t 8Lsl2Avi^X jB3Lf@݂ժ}8!Ȭ} H~X润o'AEz8x5B)k^ `{N&Yrx!ʟz7}3 SYVxKF Ln'P L]h\dK}yo;QMGH ~ޜ6RBbv"N Ю]0$|و/FPT 1]N0btEܸƔ!s[z{1'J$4F}I/DˠF* A՛ J;xg`+&I o2R Z{ZZ ϑk7_|95ʧuR j1"p V߷ -[u TQ]Eh<`Ί=%<}k&Ա㨨je̽$n,>QJCy+8B&aP¶ 㦹WT<1lRh,ӦuBAH2-?I?OYaDUƛkFe։'727Cv2S{ F u1Ygcbp0=#ޙ\Qxrtq67Xaz&S%ޑb;r j9/=@P|HoV">>aoC;[0[D ċ3%S; !~J叭\HePvMmݑZפP|==잕Cӽx9cbcb݊x3 p+/]l&6giT 4gXrg: IIvq,fjKq;L D0oF(lOGڕ.kd64ؕ3w>/>޶ q'/.JfC0іP¾ dū-mn\yʐ6z{Q4^>?ҡ@{H *  n~Տeϔl~ +VrpW^x6c ύشe%WJ ŏ|rؐ-OO@UM`1HʅVˣ ЯCe˷[%?E WbǨp$n\8$lGI#<9"ekyhMq؛]Yd2 ]•%![yFQ}=^H &(* "xEEE Q쯾"]*.J{ηw\BK.$N AѲ H`Jgn|%3@(\4p2ۂS'nB\VfLG::.e ˛)E2"hlt.5̂E,X6;1 u=KӿJkRhq<pknk6;'ƕ/4h.$. /5z)Vx"Io?:'ݲ3ī&qD. (z )X;?qT<,6VµQ84ּ·c7/ߊ[o! 񂪓/~߹H9ז+6}VnVM:b̲vEP.1nBhZCi?M:d(Yy*T"phYjzz \Tpwu"&HxT\F47\@@Ce_Gœʐ}Vaַ(mxoO|fJPF^zg -_@&d #I[/džT&r<ڡGx?ޕL3hl0_ ?m Y$`7px&dH"p_֡W`wx3$^e)\s𡻛ds|)@f}̾Mf&-22ˏ.X7#p7inv\;qr/')|wvfeN1wN,fVOs/VM%i'8j6p;tXwشExo eU͡Vw% yIځ6B#bQ 7hQc ~+kl%.qȿjKei0 7WN㤥??ǽ/:DzA{ǶŮD:,:xHAyZrGdޗG =V`,42HuϢ%XF86 :$l_lpQ"ef=Nq1xX Oeyctvy*q= ,wG| H;KnhH  jpV$&_vGxxXPO'gR>7a 0kWxϸܸ`@vvT_G/އAP \= 5%fʅف˘pP9sB.\&{W72 [-co>nh_1OIϿDž@,-L~FLWLD߰yJ/l޸Htgqt[ś~œ&DN6EotxYj!=ƕ/.Q A60eMf Ǭ-Xd [w8;HaКl*rq*w,u02rD ?lkB:@p9 ?228:nhtR=Ne&Ax,j>bSDG?7ڌ;.|t߾OiT|ٚ2rz[L/}&+VaDCZ nN՘j9GbZ=_vJVQZ#+YW2kisf(3T6wWxr)d)v؝X(U񍧡i< $ſQ^B}!wi8XɪOfHEotėKg?̘3?U+~B| cwXgi*U{h2Q{&ヮ}#t~.v rC%SzO3ǡL.PzFYȥ8U~=vAI,?:dʌ4<5( ݟd"ŭ5^ex f}ƍܳ?ꊼ<<=rBCO3HvXww2I󬿲Js{.AnnkEF]ZWv<rBF~8ݜUpqnTzĠ};>;AG$}.-pXDfhzTf$Ylݼ=FcP ˽廤S6`j|BχS?|BGKH$ E0o,3;ŝ &߀`,kIL_dzG#,<8dR~_q WO~Վ?~} ߫O? /<ZlUk: _ o@89 { s Դ|h鑛G@ߐJo فlCw?4 ´~%14/*90+9- J> TDݟu-ĊMl3g ;\_x ( {v4Jy ¸gtܭ>K%G:7ƒ`DZ8p_Kw&hѹߝ\K *='[~?@AHX0?ʨGғAX-%D=o@4jAc+ Use=r%o0@.OL") C]Gm b'`m<״@C;y0CIDM8!I Rfs8BHA iEз7t!-Je+AC@h`SsXy#2.51u )4AAQT|XoW) O >L~A J*AB@h`ܙ3ع ZAO"tRdHƮAAQo)z>n[x8{BBHAT }{wcߞ]k ^޷wIBG5AADIJoUԏ獁Y8r: ""IAT !е{\L{wBAA DGGG 2*!RH ":&VpAAAAU!%AAAA     . AAAAqC@    ! AAAAAŐ     bHAAAAw1d$    2AAAA]     . AAAAqC@    ! AAAAAŐ     bHAAAAw1d$    9˅$     Ѵk׎@AAA  !<AAAAD h$    A@B4d$   hx     d$DC@     ѐ    A@B4d$   hx     d$DC@     ѐ    A@B4d$   hx     d$DC@     ѐ    !%AAAA     . AAAAqC{ FѣG#$$C~~>n:   ! Ѡ0`郳g"99YYY8tXBAAAa DE… صkj5R)_8    @@*,pqqAQQ5k#G ==qpus#AAAq"a.]+p!02 N9qNի(((@LL`9pv)\\]];xM\|W\fvzO`NNbcc!HA   :}-sZ 8,6t e=S!|E=7.^X05nX0jJפItUn6 ߼1OPZ  ?~m۶~' 899_~) AAAd$BKzEJJ rsso {zyĉ!IOʹ4dddj\gUIߨ0d;wɓ',\ ט19|sIMTcw=nV>hN sChlSĆzkzT8㘰1-w?OI=zVƴ;+O% l%J_xd _*OYy17œBzg `6y'OsځUG61v8\ՒT߫} ['\]c)2ͻLַ^MA5!-|AgfC0h,~~~ptpBqQ1L J CG>ZR~)@Q!iiB -{L$Tapvv¹s 8} "кU+ ?iexQ<6a V%.FEG ^ADDF{۷&8U²6ሜ4^)Hp" k G<#n.`?Y㠌}|E`ekg ?.+I :fu/߱cѯ_?a WנyQ0rHC:N8w2 RrfԠAwzn7@…xǡ1x zpタ\i)7fK<{+s_ǼܽaR-{(yx5{ 7$ ߎ4B5\≧w}!G>2LpۓY:[ƞq1 Wz!ԑSobs BT'bq㟗çSr>Ni^+* 2?UCĻES}FH!Y+u,}b$4L/!8IJ»*$ f#qH"IuIpHŮ% j|w^qoYŸŸt=w$`뫝Ca+{?35G1 ]ǞSn p\bw'Gb@1, 7+Rl f`3^³.C T̽gxW/gxȩ(# j7Φ6q_6kC5UI^xp޵r6_NSDQU|c!;+?l^?d _G;// Mv~f-_/޾]q5tf~x;]$1gXg4w(? |s$EO 4ñ\\֕֙f A+owǘ-uK+'_Y ھS+.7_EcYr ' 1\[kC=m 6Pu}5, ѾN8(% <*K؎t} &S1~WZA[YI:bҥb'WnDXG񢲲֤nNUVTωEQUل6ڞ3k~[Tp$͵LV=,V_t { ްBwXO@s389?óp5\Ku\wV z6a}t[~=[Ov>_rrXn^𙓛Ͳe,egL333Yr-dKże򎻖KY2W_Ǿ+f:˯O`bqi x ֏eD-fb?Nj'fY./3dSncw.cw<0'UĉSrl*+."iz_Pd^9![n[[ZO./wT,+gYװw}1O8oqwחuOTJeha<VRɤog؎|wfO93l;vʝ5bSB^gijJb̉!7ԑʞ@ w'6pi* ꎔ'M?c,{̉9+e>>ee!2ʾѓdn3az֩txVϺl˵Z^U>1q:mk9*uQL|x ۰(׏=iVxfyvPH;JZYjͩn<-(r3^l,f?~Y#5qM*3{㥤?Mj|^ɢü)O^zٔ5kc| ݵ4}pCِ-gSڗz#b?l♬'W^jG>]F|Ȗ}Ja6Tr#57U}CͮPGV; SusU*v\/a*v6Zo߾5U[tp$͵LV=,"_t{q{K8>43L~@f H6tمHdK جO?e /]͛ǎ?,x`Opµ43o,2V,cMz_X?sإKl_X9-6{l{8Yz( 7uPS8aK4v7lgXqIg$u-c udfaJ % on@רo7hW;3lz %~YZ][tpk){yӥQߏbgsͺ utg#Xm**k r.^UnkZ\7TdܰY O+L5 U U;*ݶTILkcV{XYτ,7 *wU$b$&^9g$: ݪr2%:EH_>$ѳgH:,<>*2RE8BܸoÆwW'^(: <xU0ܕw+\Ćq` ̵=tOH8:Oa!BdUC(ԫ-DVsfG.AU@7`3eBGZ.ڭ|TOrR;mŊPG p=M=|T%11(p/GwL )ukV\&k;.oIz /}O⠄O7'TtHn_v֟UdjJbV1< G[,; 5nk?ONפiB[d]$Ld(Z~^E uϦ\(0 FCaɅ,MA`ën0tvG\xԤ =~L5([ 5LeX̠2(eڑOm jЮzڱ~?Qdm5UY4դg jĿt 2ĝ`ƍh ZQFBԴ o 2-th5>hwYw❮^,/ܻPT\b..ضm`XM"z"۶$tش= =OΖ{" H>vbo+ w\p8\pgM7y2>0?1\?#AxӦhZb.Ҫ"yX{jӦ$b۞ (b;?o:FԳlUD v;o~ۂ˯"!R# xu"\A}1,zOQȺ=!'K4xSx<=w8!ȅv ;&[+ȣƕ5I*UX'Ul9U袈hSbTQGW`e3~bI0@69pel܀^:zCs9?dthW"}9>|6>z%d▬=F$d´y,duiޖ =NTuEY*nr[U~VSbi+C vJYFZ77k%̪j3{_QJm`oms}u $.h4zڶolhAUhX(2rv? e?~`|RF>JOzs_ד` D`@G''dի>@x9ݦsbtK&czB?1H̜5cgq~{Ðp?lZn u"!O`7-†ch@|8> ]?ᐽ*?>}?}Ce31wq6F Optoys;GkvaTF٨O;+n t̫313n$2L1?~s@JvjOCqh|bsq"U".m0z;/#2^ݱUq `yFXw3snA<^¦oƜkqxgE_jjNݵN{!gnPd_GN>.n5(*Ml,p y ˎ3TS)VY^; 6M)Z zɀSVO8s_5DemV w4MT=?Y -]͵ACFtsαǽ7ld`<#[redS-dvoحgR7p.#`7xOp:λg׾g7M9͚91jrjSaq boٜPp:3 0~dmΖ݂W kTOV՞!̫kly{Nk>:'g^؛[28XΞ}Ɠ}ZG_ǒʗ=5腮,QiqVz|-ݵT_eĚyI~L[8d$様4eqhNuok*Kʇ9¾݅rqdm3g XcnqZkX7TNQVTϥW~]26GB2 5?jmǾ5ݦ:6dC@,uZa5u:rhS{~PRhvrSe`v q^񉏏ǁ@n$'#,4t?fg2`||p_oCx1XF&^Ȍ~ͳK<0a8{$v97ɓ'wI >_wUG'qTP@Jrck|1vʼn [-~B}}g96^wDݎ j ǟ{pnz g,6tCK:ڵkpushL.\"N眶dn/K !B@7ce̴\Z-Y0DEÝ J V#nܠ">O#XwCNQa,1!^e?Ő1XМFS C@NΆ b/ .dOxc^ļ'@de"NЛf Ve'Efc3J !ːGE4|ΘuN %ADݢAž%d1$bE ?Dє& {%ӧNNÞ{ xo^Ky/I{'&]k^.l]$=7GA#G <$K̬Hr:~[@HAAAtOK @N0_?_?DFD\A+=d=pwW$Bv t:dujuP,Y%߹OQ>Px#&<' 3   h&NP*j``hprr?ZlL.X$e)@*1X$Iѩsg/Ť>mWL?4[/>)R/ xZ;{;*YV>ukuUAA+H @~^.T*r{_[(X4i?4kP _esc/ΟMka?19p3FI9bbbjHBc"6G0mУf}|^Ik};-A>ޭ2ٝAm峘p+CyNAQ-$۷/֮G!pImV0]|QQP)U0 <_94!Pj2 x@ 5 _oo88q4,tIX#TM1qQLnT'/'',H^  z$޽{#33:NNNHǏ Kpwrٯ0Ojoc3@Οd,;R//DoOO\MLĿ.@.CPk2dH>w#$zߺkX<bKf56j1ɬxɎ6fFF2ү3&7ݻiqW0}C2gE)M4ͬ"Bis8 IZ0L Lu2K/aWo~P\0`v[N^Vx %$+GG6OY֗LK1i-!G>>e`DDi*|2m}F O}/-;ɷ y<lKe#FUBu㘍] x'};H &^?v7 Gc]v{6CzcK9]{!ߜ>wzsvU1<wq$O8n$bWiߎ4BIh/~O<#_Xvf v1 λ]ukFY\y$6+JZD28VlOJD$ ~,Mco  H7P~r2!˱kdgg}Wɿ1Pj4-ӧyٰgPo{G FXO!%vGSErwtF/ OV㭇_,VnB"e#y{yVO q]'Ax@M }u8'Na~_7zځ}a[MpiAGU4e=6,g~7֣Ѩkj6NFbkq0`Z?[`0B 6߹/7a}&VV6SbR:t;gWJדwz;<ټ }cyC#NvoU%lKe#&UQ8]ɦ#X&u #Y>ڱNOc ظ;<\S-zWe9gĦHҷd[:C^1Ha%!Vnh?#yOÁW0͜jې4_'cg<Za|Y^ԡVT]=:-vWkqd,wni-8`tC}@Aqx?=], 2Sr9W9?s.sM8ǟсsY-PXXo_|ޙ:-ZJ1 ܧ쯾b=7flt}:UpNJŊ}> 4b!M4M|k {I\ N8X|O`bwM㭥A%XӬ\ &3Δ+>ɦE-c "ޕ;XܬLSeN`~/cV%*f~8ۘk򓳑 u4wW\z Xw)X,]qNB[`Kff^Z‰=!ǶFZdfalՓe ,|ʑ|%qLom8IUV T?N {-,dVd8og=dR$/s5$eOdj[®>ڥS+,-2w enskyKǺ$ׅ43L~@f H6t8H);f ="srrĩ3gy?>c9\_iZHtovRwwHF];pc;~;wf:::Zb";~U`+!7ue]ގ?Ug/i? +ă}>Wm{WYpqd<*J d1){*VꡄO7P"ZOIoq>$ѳgH_ٍsl(, C:N7n*v|3G~nU<( \~}#p(bdg'V}G\*G5ˎ(IqhV.خnCWYR0l);@s< E'v!Qm{yn2\Uxn5Ű^uMR[mz ;ZmWl*oUEf)ұwe"ZmE%54W7cSJc<:(:n ;! Q ͛5Õ˗J⟭[KOOGAAJ1G:C.\jt 6f dqMcǰfhz8:8 ?7 /MDˏ ɝxc9i*:[/ 1٠gqѫ pƙ3g,ܿX6ķ+Cέ{yA12I-7A)Բo-5d{ 3M( ս~֠ް" [YYƏ?%ƪQ'ry# q)~nE CrN:F2|z2u\^+6մ9E(<MKp*  Đa0266]FeH'bm}@ADÆD`ĉB͛pqvܶc'^ Ʃ)P*=7 M|} QS!qu:tlzFJ۶khT(9\p3g΄L&p&Tl|'8DD3E*mI,MӠlUQUpd>\@5c wDSOq,BDz{&6Je1\?#AxӦhZbnMML;.`~8\.wPڥްC%;M"ɀ"3;ܞbv+_ESC @P/ 49k=٪Ą[Kmz(sJDԿ~E҂Ӽ34Z8YO+MAQI" oΜ9?~0S³Q#aߡǐ܇J0ܐ? J $%]ǖmqBAT@ɓ5o2'D[Lѽ}4u>a/0gk+2^+sTF5Kzz%(tC+BOPLDMkc:S}oĴO7!eE_VC~UUse~h.Dl9mJX" )C)CLaoO}Myo*:}&0M6p@vIj>n|kí+$Ϫ۟W_eĚyIspbC$23uv#,]c?h:MQQwja [ +6_`m}slDUī0lb4UpkvHOa[>yWbQً+nn_V(kmJܛ5n?,Ce7دl{Ӛw 2M| gdw#&,u<~tudm3g(ـu9eg/VuBMFT?bZm?KY*d!q,>9EqB'۰kv7XLb)Fol)g&ά̘?٫^(\djȺɸ氄NQ gٯc;]PxжCWgktHb릲sS!>2&i`AB1Z,p/`1Mb̆@*'Ω̎ӕ]2: zt:FTl|9w.Ѭy akB&7CF^*RHFEaa!|W"%& ^\L0M43rgwͅ<~ayih'w wv%qƵzwc\H6 h}~"i8p)]z ن~h 0qG>@j53Xr%vl߆ظrZ)p#9R(*Pȅ|yC"GQCՃF[$e2߳g^zI8ƍ'/.Iٌܽ+ad+ƹ߿VY4bB <~!c9 v$>Ldcc1}7 \'@9vvf&.^L e˖KMMf3yd˦{>q2e> {Eǐd^2-]\(O VQǏ:c9ÂЮ!Ϩ  '%JF׳%fy/o!33邁 ׮]fIR nPTe{?~Fa~^.nraNW0 KC ox䍂   }ZLXfuQ9 f;~=` r.##nDay枔E|Ƈ-8y7!_˿ᏌAAAA4tH 5787778aV ? м4877Wg ل7?!84PJATd) PT@EAD\"NCd {QVBL}wI(%m&{ܰ~o^}#"""""""W @(}oܯso="""""""zq;#"""""""RN" """"""""r]$""""""""ra$""""""""ra$""""""""ra$""""""""ra$""""""""ra$""""""""ra$""""""""ra$""""""""ra$""""""""ra$""""""""ran,rU)Y8v1&؅d@xET,/w \'$ӸZՠc]?*$}5{OJbk[ͫ`%RKșeD:^J aą8?wi(B ટbo_`)Hܭ?,JM7ҟpi{k!yLX| c/{0KW _~O͸ǎ{w(yrPq.qFDTx@  juG|r:R2uM6MjT7&ڤ?"BŶ#1KAx/6LĿGbѢfP$T ޫ)Bb8i4}[77>7oYwFPA9Sv,2q58gU 8o}֎G;H\r{NU0lS`E1`# Mg}oP($hP| hjӃ??ߍ?,g:x4j\O@$32G)՟G`XѭTF{:]/bKR +vE5ǫbr&}Uɜ&*mJ5]ưΨ[r*f>="8~{5½uQ;XsjYjeB)o}?/11!B|,qzl>0oUNx]zL:ǟ <g'"ZLnZ5p*B'č%y- V߶NA ;4L yZ3<3fRKGwy#6g*3vllBCRL?bc--gjtXtECOsT/]nm5(PO?a(:W0[DjrOXY5l rޏ :;Fٍ78H͇BI7\K̀F775|0ꎞxA|ԩ FpG oǂ8UyZug! lCe7+V؎ȴ1{;z Yaˮix<"Ĝ7CތFaUX>+\wZ=6o6a ^U ^YrM%;d:ǟH/-¤eYzQð-¨ 'z˥ECS}g6\_Ӱ/pCoOz^N*-4Igq)%TDoO|Ѱl1O-"*BtHn6 RVOV(//j.o;YA?Q>t1v!lg0q*D.ϸ/{O$lz5ހ+vX//-Rctktp/VļmHġu#y+#bYb/'(%i GmAf`X}7K ǃ۽!ob0#+Cܛᇆ}BkN9Mx8@k{Q&]̒4w,]4ƷϴưyOkSYY3zps[pm+7 >._-)>Wm4JKigHK#ii!Q/MO`uE,vJl;rIĥJ|&biY夘战}Q} 'aqAQzy@SF%L 7.jxyuuxT Quyc̃bleEGDO,*YQEM~S3KPCf"mX ʸB'nK~e1wyřCUE"N }V"lW21!_.SmӖ\[K(.קib۫rx_ϼ&#ͦmr-9eh#텛ibFNÑU/oTYm8vm.̽1;[Rŵ gũECSĤ,:24pʜ:CNRtkx.>O(Έ_V((N|E SV+̎7jHzoԪ$E/n{acRWwf;w%ȗ2וlc/:z@Dܓo_6&:.KT<dG(St^'8CBr(M;}*G.w^[ԥF-zє.cS:-Θ_V;">}tnudZ=^]--Ja;vjɕVg¸;q`/Lm{>^MSk'鋶U(>pm)pw{$*$u:ye^@Źgt_ @@p7\NDFtƟ|կAQo`4, i3i(gZ~4;bPs v\ j˱3z=M8AqcЦt6lf!3z;!h*L }['VѤGcWK|j68ѺV#DݲsWA_ҳLg4Nz' /^(^e)%~Աq9fG֔B'g,uXYn b(JMnH0³Jwt _땂PQHgOmEi 0jCиiXW̗ۉ[H${:E.%f#8ccPh,g)k+R~.]J-AN;Ѧ}|)Lw^^k_nɇnl0Nَ m] 0-|70O|[aQg8L|~ {E A /K Fĥ6 *{T-4!tnnc|미j {}hUΤ;l^Q/i 5*MkptY#~C1aP<]/WA|DtAjW׹< V__W#xơ1gxoG.nTvk!֥mйJ*}e~;vr%NqKwx8L)H|ojEgUV6U=;q&QN7~V :j<'퀯'g`Þ Xy'.`%鐔,A|=_MFm:P-0wK=6}wbPᙧMgayVh+ذ67u7^{0n-@̾Hs@3jhbon|[ҋj0uIlz={݃.+A[ Y}׾qZM8Fxo@cD}S3/Nŗ^E=5}#ggOx}94$ jcmx.c]4+S" coKdg~%@I8jJťxMao*d?BDTC^؞囡 ֯9 ]!BGF_WGX#elr13vܣ/*_Ysh׫NϚi3 PKyy;:?6 Veݰ'qḻũpҎ`Ɇxxiyԑȷ_ε{ۡ}#{Va+;5JkA"lpxPV6c5GV ܜF/}2n V.1аR1D$ 6!:jԊ(5CM5jӯsZ*w "BM 1#|ܴJ:qR &tD7çx]<D S$Pr(ڃ _(qb~OCp#ؓ1tA\\V _qԷ4q*Ya9`(?, 6G MsUo/y/.'?z+ύsѿ0ƶ_b̗OeUbZո}gdm,ٻz"Ǒw0՚j~8`uoѠH,0,Dբ|/:wډ(J@Z뇘<$.JSN!O×ˠO jS)8z&^}򋻩(v>ކOR&^@R]?_()\}k5ۨB`ȧ'xQKf\KʽB0(7|<{joPgC'= U Jq1$]kR~~:FIC|Iwsw{qhtj9dizwJs==FڶWgd]<)_-7J6DZ {of*OXY QR K 'eH<òV-&m7زbQ7XcZ+I4dKKD1IWryW ݄<$$r6yݳKu_.{B<eGmU [g+{;6>&hinwY1z.q:bPD7w^Hb. {ѷ^)01l!N;?XTm9H9%/'ԖJ]?\..f~7G7y،O{@A8_ReEIGDfc͠m[nb-U.iicn%E~sz3n{an^.yt5}*^n ِGBS^\^K׫%|.:/OR>?6(/F>뤘X[ڮqLgunwp$C9Jb/y׀fbc{hbXQGT~nuxT\>;el>➧;b;qjJ#7~ʩe#xyɟB.Awx,j՞O&\.ك{PX/(Z;7Eܐ%t߫/w7\@)/C5ZhTpwӘ"?Sd.sypݞvH݇Dlff =%T0Gl߂t~zMeT & N Ĭѻx uY˛Cl#c"" @r =ZӖAG* -So~2|J2M pwC4Z=XG߻ L `ZXT@mg)4, Ou.>k.&g@Tk:c Wu;x nvIgCG5""""""['r9ٺ8< ~_u]סyZ ēu"1k$ Bp6NSaxxqGXtA*"aެU`|q(!=Q\Z!<)}/>}Mr6f;w!̫x{z_/iG0sp+Q^>+2}WyNJBQ5<,z69.F8xz{!zm$\\~_M+g xo>R7fӳ(;HƦŋ?ot@ y,B`6o Qrr|[C,UB -1jM}7j)J]=4YΕ]V:=eMdWmu""""""*RE.'R$«Ԁƣ:T^r&`^Rd0\Yd|YiРmH^gեך6s+?h V[b#Mj㙯#)Ri;_O3ؚmTu&̍%4Ԙ>.E\ Y-?N>N-|\ŒqJ_xi1o7} X+]1~s+d¬Oq@hU:(^k^Uv\M7!x[in8l~ZE3#>?!Zg^aM·[wRCOsT/]JssxUyL$f[mӻZA@xczWR8_j!LΔ,0nU8Y8p:V5ES +RD"mr漩TL?[/ͣj ~z(/<\h=&…jh0@ cz!^MfP(L{µrvCp<|NQy<]֍unf!>i9RQ4JU>LJDl ~:/pG`)-/lW[!+ 'mkIXF;4`(U{wF97) !-^m:}% +wu`I`mm y7|H<? lkSIK_N6vi'f} ƪ1?fojvᕄ[L-A#z4 |uO|p8gKʂWPTeaرrv^=V رadCS5TD$%%!==4XX:<W@R2,kYV; #Nz/nemM@Z)Li(NĪ fl1jS4.]SKGOE@]Hi:;&&Xp-87U}p,?m*s;>CC9ޞ$OyϔP v ͹iB]fA!Gin;:.nMב~ot1xEdW40so5f\+IGؘhqKEai.f7mj֣8y/Db{>h5#K8ghnb%Ͷy{sN/2?NgZ4-[c6wg%15FnȨ9qHMMEffi0 ]-\CaTM_SX[%E Kkm(6/czt)YƟ~|:Z厊øUxḅ=ołpill>= --g_[<ת4RAi=v2Sg[r>}:auQLQ݊S-9啊wPyn?֟h[wZB4njnWnh1[+o2hW8S\UKN^)X!r/Ra]6 3U*Qx 0 FcZj^OOOԭS_zk֭G|j :<4L븻j g5/A_~4xf3G߲d>S*h,[F21o+`0ZA< S݆D34%[Va>)'8/5_ 腊JPt%:o64QINu{8`w(yfsc>m@ "5"(YuT0e3~&M] >Cx`ں0aZWoL:PΔU5DDDDDDy y4'_+'~xc0S" ?y0Mݘ+zV{a?lUaV/`OU{__žI0 ֛nU*c%")oԇF@w,b#, @Zg]Hp4(xg3'7[}"|SFq.mP+p8m&y-_ZVNgRıU<TUu {RW㻅g7t6 R6٥t@me4,//坡 xj)xA#nO%'is_Ř_FuXJul\Q[&/@!$$tFRk:("=X^}]*E-'*ijP{FFY 7<*]R^'}JJa  OA1tkjyqy"{@ pSD; w%|6wDŽ _ffp5xCXͅ[i647clw, G>O'#>Y|: +5xCmoq|kMK<%=TUu'|P?˽QVc4o:V:WnSV+g^^(gE@T`曺u^~y|:ac!nx0U}kwp7ګ/1c/Hyuppjw.~Xw m"Dt_ Q>\Ĵ*ZCi!;Gw[1uw:9TX5V-=ۥ+/Z/wuBA c֫O0YL/xs\a_^}XDw6Ap1WSx߫b8kefMﰿr扈$S:dWnટK"Vt+U8sU%MzcfyOU19)u#P㋓9OMB-U۔jf黝Ql1*U :8D FWP]Ȑ_gǜQ%Dz%j[͗/~_Jc']9s wK[/H?voNK ovZ| }O ^J-PlMO{AWXSVݨ9}zpC=\=ot%*V֟%ҏ7Z#KeZ5;0>X6n;7}f۹՟tG活79f:=^(eLWiUZ߅XƎ X}^mj!7鉲?6_qf*&Xؗy5Y\zG[Fl])S6g ~BdYB͊(j_ۘ69֋uu۲N萝"ObHbJ]"(2#ڌ[lشwh- X68:ߧ`:j'STjeKĴj 5J[R o%FA<_m+Xg|`l- "aR`&}1"^߱'_Ds5,܂+K Rψur'͟A-| >=$2L .gy]#:vQrdL[߭jy_.W=BTsP_)Q )sO-]m8/־v3<r1z0Րj/ၛȋ6'/yW /[URI@k[be \*_+V#$B8;*tJks'rfL߭,KxzbHRㅝb+]cc*iwac82x1w*|bX+)/5ݖuwae †16kd(b紕k$]0#D'x;IbugS1K~<[JD.I^=rwjpD'戥KFi1p]X)wy:18~AU[JK?"&?#45  8/ТF;1ƊBbɶS&1?wxv7}%9u,#,-}-=-˼sCм 9ymrqhQ&/'!.jxyuuxT QustP,t/b'm!/ۤ~KExasHOxcs,a,NNPMLl)za:Õ?DVPzoԪ$76cLl<$T~uH0Q4Xp<5dҙ3Y$m̾.ֿ]扷/3zW%y^%'#gmbfjZ_Zb`&@_97}z)v kqoӍt+)/h+T(WIu C7Gc;[ Xd`7ْ+Av):/ҥg}HhTn!V9bhK]+cy'c",rwjx)tGU 5\YFA7{e+Xh^. e4SԨE_?X㗘I^('ưҟ W?8ȥ^LtєA55s-+;ӏ/ΌHg6>mۗǍ <*CRڌw.uQI FIUE4;wTR*+avBiz-tVq\X.V|KR$:P^&85[~*hZ@Vzr?ֳJwt ډ+ב|R |ciԽr^'U8d(>|j;*fT-0dIxlt뢘p+OGwR{jq<;`hxPLG&ӷ7Zu`}h;-!Fm7-cjy%yŹyR9Yy2U0E[mܙ>Wc-5vf#fMt#Nv["WIu AGcc j68:ہ> BE!ch#4KYu:/C.PVTB(wp#K@|g9~aۘ_za^AAw*VB[9C=jk,_1,mHOTV) eo7QiV>f~K`TZ0@OWMgJhxyJb+JWpHٶ/gRJNֵ5v\˷m(mq\"HݱQQ;PC}fo,/erִܳ2F<bÜx^\1?> 邞< V|ڶxij^r}T݉(g+跾- ciD- UV+yFfӯx p^7ǤưџtlODtXDV zl8f¿ϡ3O;Yjj`hܼx Z"B>w @x ,䁆8v~ S7Ħ׃-`Y_)]iqi6nn}W,UD5P#gp?8{eb%&D#7n {!m5 /+xeJ$val{əAJaV<٥2WVlZ')_L¤I1O L+dJ*Lw݅W M̗xiͨlz4/y}1GU;;GetY|>>iXƨ~uV)P9Ec/LϿ~C> үy\x=4`PLk5&{Oebŧbk|5n:C_9ױxjtFo<2v{1O"W<5d",lln4X-{/v0,y<_g̟U6Fxj+ |j^%+H6!lBGt3|E3q+Nポumq}N]`쀲hcm/5/ m$U޵E/;mfjM6H}+Agc vKa]%]kR~r:F-hygj5߱ 6|<*ߖDC&F(f֝ȗ* U J%ぽ;QxJCLkr(~܅*~qDDvF|{! 9)87U4HJDY%8X6IQP]n1ߠ&􍧧jDxۣcTDmhayZV-&mϹt_E:ˊLp4 3/[b<,VuhvI7sn%E~sz76^l=[D rݜ(/'ԖJ]?\..fZ t+34[KA%>7Xxgm\NڌQb'ERZ˓{D^3)3Va椼aEw^,UBm~op}>7q dysZn%y7J'm e>A% QR K"NEmVrMK>"j$|*^I:;^(6p(EmTi}R;>*̋#ce]M&nwx1ϓVlqyPpIw6xHS|?6(/Fbbmin>\isܝ˻k@3Qͺ mWLk5*OGڞ3VЄ:UŨ=)+QI,\mҶAAeܕq83ݍT}9¥!qVJe=5xcq 7$yV$1j'D}vrb$:cEVm;MY&(btN^t2^FkG'zp﷔NVX;"`r}^!0⑈m L!T8QK=gKٟ @{oϏkl0f x"q| b'*mg)4.ٟK%DDDDDDD}]|        уp 1sΚ'9::t+Ga}d_?ŸӅPcK#5h~=SMaNm?s⛟J6Nc Nm^LXge_F/1cu^/X΋H؀7k{A_,$coΥΓ)m; LߋO_zcM0qSqevd3kpM#9LO]w/_ӹd[GQ/DDDDDDE%}v˯>f3V'l  5^}Q~o:w2r<=PmZ$c[ş\:RP0os\*{w1r_=zuP4-5oΉBJ]ӧRU&R jKx} I9gXלfM1?XK5=̟י3 A)$WvZC,41qG{¥aϋX+eJ}zp3Aɇz Cѹz9*<&Wg#\5i-1]8uͼ(ʯ<+sTGY4u&ںT$b&(篵h LAV8l~ZE3#"9wXGU s:uGcٻ(5 f!zN@^"p"("R*"`Ât@!t(!lIXB`XyFfg3g];j)^K"ih/SOq"ՆH{k>U]< j> %be@u-lWKO{vK6@Ϸ 9鿺uz4D /c%y-i[8fݿ+$.bBeLE,n,^,RBYBTS'}bސKe޽w~9&+[Q<7yDE-{*.'÷>PJP8BFY/7.-EzZ^(ijxY2J"NWk[%]nC ۶cZܥݢko$s}w3̑u).--HN )9l$R&S1Ew/l78ygJ(祝F9^wrĵs˳ s+.AAAqK 7\q<^* /&iʖL֧3Ʈj)ImvSM52kYM(w YfYC u[=c>'ʮDDDDLrq_&zȒNm@4oY/UbH޿<2fIMEt W E!/e{{נF .I-·ѡz xiON) )0M<٨(Rlǹl2?9/躕N%u==h+rܛ[ ?NV 医z[_΄#_!|PN*jx˥b[}sF WWݼ튰N3=RO`ׅߞz.Pd(]_$N cCxňnvp."nDZO)Z} ^aWmsWOi,.n u"zsY̳[pRws'MC_ɯd56p$ to* UJ!y֝LQ}KERt.91moUލI""""!*tzxO0)>rƤS9^Ho^n@x>­L*k`3ȼV+VG_K&u3n]9Bhx83Ï;m@:uceXܪ5AiWSt9e*iQ8~s'F׽xB//b}rBjC{ ~: [--Vnىݻ/ZDY5Ks-QTWgo.UsY&k~n/ 5;a1}F+AYew@xkP B5ѷ.W Zt;Ԕq={7j nj'W-qo('u5j/h:E jfJ;5uKCЉ(^y߿fhr "MR[9+^ݕ`NnL'G ]fH7E?Pp1^-0W@濽NAjcggi^^t k+-䍒n}j)J>/F)Pn]nXj712. ܀y-W}BiOC&VW J=$ʷ_}>%6nѶׇ*RU X>*V}U1:r&/7T>x-X~]i6D 6c,vNn> jU(+>ڢ!|nZ3klLހuh? Fk1䋃He,i}P7R!Ū~O݋9/2#JMyo\L29#>UEUګ6]8<P>:F%EU]nt3Zg=i ў:렌yM 5+_mǟV./ѫf18cr֑Q{BPAN,Ui$zBt$LW诳1ۓ\SMT6ǫfB1ཧ૲#}ہ:F"^Px%4mS<Ӯ/h5c;iT)v.4u4 UK!-ViGM:릵@U^qciO.V'q*#""""Ǡc*ս{KӀ3w75&./⚱(}e#ID DbW ѣya*c=,d4dWL07x cȁ93DDD!X̯z=x cȁ1HDDDDDDDD$""""""""r`L90&DDDDDDDDD @""""""""" cȁ1HDDDDDDDD$""""""""r`L90&DDDDDDDDD @""""""""" cȁ1HDDDDDDDD$""""""""r`L90&iWe(z2x_Ggo-ztAKX5y8.4 S_8w|?b0&o!" @HS{VZJKp] X!cpY7p,Nl\b}d͆:e]†k?FUw|a=GIx0.c7oq/Ax; ~<syqA?78˓"|GMoaW7ey=WMx1c @|;Yu& pS#;chTq '6o>VnB*bHhr}r;=a+eP#"FDHnoҿo/hzdzܯñ8˳Qw,B Cz.!" o c1fT+Zkk,6}̿l/Ƅ( @E$ 2|¸&D΅*33^Kƾe{u'19iT1[Yu ׌EW'|-TQ?_cx;T/QHJVߟ3yFQ!xN$v5BO:N(Z>rp5.vOZԆ{oN:#*X禋o/RøAM`oc^+TF{`Ɉ([j>϶V?su3bbAIUZ _ .tKm_FD1nnAhזR/aνd| nZRNQ/42[Go}&njJӞPxa8ߧ_ghWP^h7* WM;ҧW~Xyj~3F:ʮTSi6oq}}ҏQf^%#p?!m [XsLmZ,k3,%[2Yƙ-W'B`!8V^bg6J־Y}fhPP/xc[:oۖk\v ^ksJ>xTن8!w11w,bm^q]PN.8s-G)IZΆt1q\cllc."FD< 1VݷܔSYWY*Ke,O(Kc!!h<_nh'B!E{"+{cגDB\8L;YO@\&7ʖe,#M^(QQ 㞡ʿǮ!>:*)ƭ,QDzGfjb=| CL|,X% ɫ5"=%V'e)F/M; ~Ň+OॲK_r*&|9l,g x͟j8iة0WYLf *N(&/o3l@{Gs et /=dMY}?d mzY0]-& ml^A7 W eG퓤[Ւ~B#w>1EX-nx9|=L.-ݢd!\1O{[/e|E|yv?_]/ϖzm 8[Υڶ'avK}د%_Z.6ʒSCJ-ߐ}PNz}X;>6Yqǚղ[Ymhc.Gwn.Sk^^%6K݇ے̮ʘS }9k_slCmصg3R-$,8C8RL̍-k@{mRKkG6Sqk:k +$tM%:f׷s5w1_^`D]5^ikq%H8;@ڀh޲4\3Vp CfŐ#N?DUG0bpN<w`zDsv^{T SunQqk$ތ#+ 7 x1.ۯk/'lI"N,| j$L8{t/zňn\Eܜ~7n]BrGNf9r?7 ;ɷ~&uvw GVaC'T.5Kp%gl}\ Aƾ3p\yrC|Kolc\1hC?T&{.h0\;O6*#q.jd6h ;'cg"q&I-IH11[G+ T4Y{qvve$]TNJpss9^6q^{-|QAZ@k&"/uGոV?hSJ9ta*'8+iiOY$ijx{E<[|G]w>} Ea7l\xiEBJJ^:mz(`7,/',$o"w~_bz(.G0(mj *5T&"ff"9]ϖ4ZC$-̨JgQ/%42eIJ1~Zvξiҝ(j%oo~jc  lVdɘU`4=Sj?Rʛvbw`c*]@$l)Nr88+^[cr}|dKHW>Ev m\=DD0DkH.^ዟbɢ(\WUN(D ֯={->R Bus; i,vaTh737Æإ+rߌG-ɇnNw \*"ۆ[k11wt 3ԫu"L=4AYJ0uQ/xdܹQEbi$K":;uTC2LO18{j[Ga(&bÞ`ʔɘzTŝ}QDL˭MMߖqhC_ɾO]Y$]?q @*֬8f Y3gl>ԱR`?ȯ1kݗ_~b[p]髹ݷ:OrQ6H117 QA}֜FrS渵aגO4.c f]l^Lž½Qna/B1/hj(^5b1v`4 u{c[?0?^HyO?hm9rz1(Bgvm;c P4>zPCJ3SNKh9f{WF~aT9Ⱦ Ř |O~ ^5>wߦK0x"<^u&= i ~ĥcCo/a e.`Xܐh![Xz8Q=ѣq,hczw4eb\Ou }6|pS2xfe,i*:?ƪXl ݐ_l>2lYߜx|̪|ʎ5m+(7VŪt?,Nh1E(l؜YK:6bYBd36_̡\ XŻ\%Ϣ'Wc6.-qzQaU+CIkl])&fEX~v%6>mT;SzTnS;e3X[G #.#b8<˾!esM"f7+[jc"߶ DDoȇ)0ɼٙH[9nz|TGm{x'ykԗO]HHn<{i4_zGbFAƧLjĿfV捑|'}1ޥrP,Y\T'/?1逌.IgdOKU?g6j_lYJwM%3^7ۛkj1 RrJ<-U:PKz~Nf-1K%ecmӃ{=3?2n({F6;cLI 7c 7ffN-%M{'5D6ظoW!%iv,84GbC}Y0fR/ځ.r_⋒]}cƊ}}~lLfxviw͌=[`/_9rC +z%lgm =*s-cמ^uX}6YH312diǩ8G8PLXgeaϲ3jmɓ9(qkxH-_m ! O YE<"VM̭oSҵZJZnćp)`JD}*SL,ٸ3Xtûf,J_H>$qѿB[D Dd;9hZ?âE8s}Y:fw؁Ӟ;Ę?0UBm'e}Yvg"dEܯTEwgtE1YܐW Ǚ]p wW0{6wA Q\{`|"DĹqbL $y֩ˡ|I_oâpd?XYpf_9cND9& 䣘٧>>:F`1C`XW8{"jC"81&Fz oj_Tl9sGa1DWW|_&""""""""" cȁ1HDDDDDDDD$" :?w=[,QX6mpH=CWG_W%<c_!Mi:>xΥZq8H[}==<]7N{λv~DzDD @G6'6.1G66.c7sve%lny%w B[9BS==qU^-:-^n|xI9&O~&237 <-OBk(nޘ9r61;0guU"\p,ci @|;QYu*oc,SݕhB/~Fn4<äBHpT ) 7uH;_ޜkm>ńfN8n)?WP^7Zv!^ɔe6Yrn/n:pZ񱌋$Qx?4:G^amm˘#_9k*-Z{;ߩlD+ſ0*t?RO-no/6 A!սxU{g9.=J?g~ᓎ!E~Whٯ |Uʿf.%DO>}U金#Nj#/Xz:1CuCc?yӟQ=x= "%g(υe Q`c13G~'[}kSGW$aXzZ5 CKؿ1WSyw#qـ1o#1{l~{D{TƩ_Z]Oz!b4 ?A]nͿ1Q}M¾m1yWGmg0 gW*<~Ujq6CGH+WD~Hd' -OB:CJ*^{z9T9v5 =O<̳yQFO\yD0{x`1;f];ם({)(K e U RMYPBI;/3kCPI⦒Joow1R}iIxYA' /]OʋwKĢ[%i# ^W_[L涑W U,~.םķJWqrdjk)n\ϣ4w9bC2Ȯ/zIM?mtu^?}-n g)޸|6ut/.<är=sm1AvH0~Xx^eoj}wg%JͬoREwtlZZ;fJC*^MqƗ1J^Uy{h͍k}!a [m?fb1NϗY tkQٴxm#g\5Kbjg8d? u\jR{A'}Ir⇮|n$+IX2~7 Rs9d@,kn`rƮ^'YFH*u{˔ ׌[VC->dfi.ìy%s5irfF-[[Y0;$jlgkj𭱹z+cy֎\</w/ {Yge-c-;OXڦxepv7I?]c=IxJыdοdò_d!I-7ѳYOY5oUNTQ^,Z&T'3NMk>^ȅ̘X8{4#V?W,m>!Ӻ[:X}Ik285'+iWUr\˖̎@3H  xo4.ml^Nyq8GcjYRB9Hn}%qi\N1hl\/#id(y`ҁRyU̽_'MUʾSe==:I*T}Ʉl1s +VɊeHD%.2rW~{u2Tjff=qmL!+ T$ro2sD[e^199q?GTj언x]?z0z3gW|RصHL.3U?;`r_8Yٜk ЈlfǼcmnf:~D%?,їSs7ͽn?Y*90sg77WeӧAF̘'1G&vy0(hx w6Q:β E{"cO]Kc9=qݲgf?f5f ZvtJLra <L(=߭$N-S)$ӯΓ4 cʽ rʉK녆J6iH.e0*ՔgLNdd{HTNn抖2* 6]qѽJɦ?Pd9APo® {r,jB .>'KEOc|rHIHظ='ݦ1?Ĝ2o0XY? 'K2w=N༎kPucb>/nZ}ɈUͭ_t1ןsr3~2U6c{K个6HҩhKS+q0.ӻ'mQݎ(hvp`K)wn|0Y5+G0\*x/n™d(xkH2pt2g6%ޜ>ss0xPT3ny{ pV<)7q$jgZǾ/%Mak}fm.CuyN-r#'q)gD'K ͮv}nMԍ4kzof qilP">aq ǐ9S`l"|jl>u_ 9Ite^O7u/1V=#sXd=uoGw -[ꉙr 4OF]9;֦*yXOag0ii6'Ts_뗃v,lrrEa7%gI_.MrqOE*^F(jRWt4֦6mruUv1! <دY,0/cy`8,;׎C(Wx C ӟıƺ`T\gyfp åJ*^o0[;Ş*#l;c6ڗTFv-PbrI9[nBS>J COkdYyn\Śǐc 8잏ŀo,ǎMQ)8GteO3B)Wp*s\d!y9mVLaXC:"Hm_;Xm +X4sȫ9Ryl>* jMP5m~5Q9os|gea1aæMQ;Bgs*uT=,F:з`ocx맶ӝMq_rWAKh9f{WF~c7ږKV!j_}'ڰ݆E3ʐrz1(Bgvm;cꟓc@;bc'Kqv-.φaGGJA{\-jݭe_ţ1\KxZN_+}%nabx8{ {`C_pFpXuυ;qH]wu0j\^縤ÿƕzWwcLQb%oq{`g\;wAp;j 7[C*{O+(~}|A5-a1xiFrHqKLy:^#}øJ(Dp0XqUf[c˥P{K8w3|Uο=*ZsD h ;[p46c޹HiT,bBbXJSA,v'L+rNJQOۇWaˑXCt1fRo;x~<9:Ya^o3ѽ(- -cھ_.Aqo9 УjޏuRy6sh-"+$V.>9W )cV%mj;gJ~gel*k ?sx<ɯоX#\! O<>MM,Q*y_$xߍo|'}1܄ߥbrYR;g?9c+F67^# Kkcd״^R9!EH { 7ŶTo!\kĿfֽ[6ePOfg<.4逌.Ɔ?Z}lg^/5Ƈ,h|$V7PRZ kh}Kˀߨ=zگTORCdu,?K=?)9?=H|nڷE{؅6:f|ٷ]BjVOH16)N7,R:e2tW帙)cu2z(o&<[HLRÇJjC7/Kڲf֥n[&b/Ԇ}hH3zv4RTD˲=vKf+X^[|^}# Y:W&w):{M՗2 I|%Adc-7Ϸaf\d1>9ϰ%e߅ }6;6~νewʾN{n?1uKZ=,90:Wks2V K&G_o7>_vcc( Ӽ8wA̬Ǔ:%>KU9(ݍWM,ٸ3XtwX$"ƗM*|n:|`4TNbz4-aQ"u0˗=,W{uN[ʒ#+U;pb+AT߻+Z {߭ߵSߢI!;|7ož1Us)P1$""z(MEwéTEwtEw?!ǯQ>0`]K|x6 G~ur(_[h$(?V@܎58]7~ܒbM|-̮;+=U! ;ZY1{>S{ANƐ1DD?T(` MVa72.MԾr H4'ҡvy̺XU▯eI>}#j6#?DmIsBMxڳ(q*#y RڿƐ2Ǥ`"""""""G϶6|EX{FbjCF_a+QT ^@xw[aw"~TQQ n}m3+MDo>_^Fr>F.$1l7˗ zl8FͶ y$t;.aüxq 4l5"""""""/hpGc*WC/bϭ3Hi\#1z)T{?W-V@jh* _ E_ʤMaxyC."[ ^[fmDŽ3g]ĒX4s;[A-ѨTˆ"""""""rPqA~@\O4^2@8tjy䟞kZ5+q:Iyϙm8 DDDIW%ތ#UbM؇\'ݦ1?Ĝ_""""""" CH* 56] nDSޭZXCtBv&a,'jx{EYj aq+ʚ+X 3^L>R BݔF \skVCnNw \*"¨n(fn8 S+m@DDDDDDhx@ĩX{XFu'o5ƘeOmT1~PY4'b@Pق& ^ FIM=4+ 38t2ϳUPF)J>nAӯ,BmK.DDDDDDD2& Ua4xHx' #6amxxEWmnֿO}K_3Ӕ=K }7.3fL75ܠ*:0c' ʼKe6Yt aE_$""""""*PM%,DRM4eI7Y0^a\ܐ=DDDDDDDDD @""""""""" cȁ1HDDDDDDDD$""""""""r`L90&DDDDDDDDD @""""""""" cȁ1HDDDDDDDD$""""""""r`L90&DDDDDDDDD @""""""""" sfVs =b$3DDDDDDDD&fNN8ѣ @DDDDDDDD&fjA """""""z0H6DDDDDDDDft$ @"""""""Gd3 LR1DDDDDDDD&f 0ѣ @$"""""""z0H6DDDDDDDD&f ٌ @"""""""Gd3&=LQjqe;w7oBRRb* * 777-ꋒ%K"888%"" @"""*Ұkn_ʖ-xxx A'==~:8'O !!իWCDDSԩS<&""JDǡZe6YtGEY\3˗/mb$(+WŋTw@ PhQI7o͛jJ\r;wF۶m$"|QxP&K,iʒnhEL07|\ @""*tWL͘rZ*ʗ/ϠC9rfΜBRJ )&L>.    bx7C۸q#>3t]v=(0H=/… o뫿#kԨ .]_ C+DDT;MBcꟜJ8ILL| 0WQ @$""f8{,LF+1c`ذaXpwA!""| =DdJL6M}q UޝGU{$$@Y4!H P aQX@DE`hs`+bVK]EZP6Y*" Y BsN2prɢ̘fyI̙Nx{yպu+: BcǎU:uk_+_?;9EF4@ЭXRW׮]C2X\!""a#*+caUVt@TFŋ5uԐqFgTСA *Çk֬YJMM  2@PmٲլkҤIB8ce۷kj߾} R,-{y!eT~ٽ荙ԙ˴l}rcgzj׸7nש,ו8uu3XQc{!xmNW^^)%%EFҵ^kNO>/ܹZSubRkԔɺ5)SF~qe}G wPn}ߑv\N9Nz?- w}MOvq=rgEAc "\c4kuw~WGZxU꒾eˬcǎZhwkT\n h=ժU+SoǨV 믿ĉ pȑw ]Wiʐ4-=FCqj皕z$ (ۊ">Wռ-#%Ev_*).k^;L 3+ǃe Wk3׫F(r3R4͛?^͢|}Nj׮mfdd(!!\vLAsa5lXTyf0|A18..lF8i$3 ܹsz“Z3q3krKZهZ撏u;2|!ZlV]街*OU1hܾ/zG[zONx|Auet[_>+0NRVd=lQiɌԣq{4)8س}oAihjHSѓvt1yzumW^;GKfU믇oaO>W߮xz@+xj5{A hl٢kLNݻwkJNN}ݧ֭[Y >Q >ʒM9h3fnj^L]oIQ{R~fv\'] .T-UiEJmkuza]|ֿ4Q[;^A5#giL*~+΁IUȢ0ᚲM6kW UV^y7J =)e߼]:b<$F%E(5w.t)'5RFM[2ĥx:ozR|]?F}ܤחmoo2TSf}ǭQqB=ߩ=e ReWa"u=/~9tTWQ%>m4sjl=: {~D&5P{uEoX.|*>G{laޗqmΝ;3h APG y`i3|1AKh] [heKYE~*?}VEצq,a,-_׬^=:%*}ܶE ^PY@}QC׭knZ//V9AN{E%-k꾄>XaG]}]0ҭc}`AbFy/Ku75jȠMBBrssj׮l7ZVJ}A-v6F5SJR]EP't%RuO5]F5O|ާ7*֜u__[r:x꡿w3UN}qS9VrkqU}F%svzla>Sȍ}5۫zrËgxE=C5GjJLѲZ+9MFTcbA;[(Q(z4)+;mWaT'Q=ս5~8K#Fo W& bnwɔc{_+Jff7Ϡqm߾]7xckiT s]/Q?KϽ})]Sö7Mt=ߌ3o?>#B5T5Eڽ3Snwti:JvlާO7F GTr\WLV>@}Nֶ/˴Z?|OnGV-ߢ3^ t)L>[{ %vG_;V_W,и1F])D+N*nT h"O'k}"U@My4M7-y.۔&%sE7T o޼6%@08ʺH6} ҜfQfLkG7ГMz75qĐFzgu뭷*)) ʳ 궇UiZϔA͙3G3\]t3{giV`iFҌ]x,MdCU :ujԨQHcyyy:{,ɷ(")tN: h@plDFjZbF}P \XxQfrJ :TF ~' @Gy-d:$TOK?/n@VJƿZ557 Gd&NL̙QbbjժE 9sF˖-ӴiOR}.кuk 8PoF(:aXXgȐ!jժwL'N7CaÆzt Šqmʅ m۶zqKsz[pU꾖qt= n}^{1?`:0…1wѢEj׮Ə/Inޛ*@Hq=w}WRSS@Uk.^ZC 6W%*僦P ͙3G111޽T)Gц 4n5(p TaaVXŋ+66֬l޼G:{ӵ{negg;P7/ (QA*9#ܺu>xj9U2CAcځπJ=X7++Kǎ3VSRճgOuA\u<($2R]v1%4##Cֿ}R99t*hիW_JH'6]*#  B@P&@X @*7{a 0H-Lӻm(0|@kP ʪ$ 3_+E7PT2 ×TNsB?0Dt`TN /9<> ?Zn洴[,nQik;-׶ hsYnVhkek $"?_xgzegmW 98l5t)pYZ J??{T и~eVF" QA *ګ(|] 0t`kooY@6ݺlϳO 7u@stuK[Ӂ 4 P~ k5+m/ ϿS5/:Дn} '#e0_ L/"] oM%[Ӂ]_g+5@GAk`?Pst^Hh.ltXn|sr DJP/` < \G;g\ZE`iM_G0f/}?ygwO)A# wO9B?@Ү>IaM T!XV?7/ҪKaA`Pq1ط{Y#j 1s_a qybQy<`" @ 0P0@ #0@ #0@ #`1]bgIENDB`DisplayCAL-3.1.0.0/screenshots/DisplayCAL-screenshot-KDE4-thumb.png0000644000076500000000000003534012647526537024470 0ustar devwheel00000000000000PNG  IHDR}_,XtEXtSoftwareAdobe ImageReadyqe<:IDATxy]u}{U}Hڪcn\HA"(&-("( mi4$qWNbK,ےHQ܇ې}޼{ϛ;oCqp>˷|rK_R'.+_OtեK7Ĉ]V9644,. b1C~: ]eJM?O)V %$&qS1_VRFWkPvqZ=#Vԡ_WtzwN.l {墟K 2}.J\ NmӷMVsRL+R,> x߿ſ훷#UUuzԟGNo+覲\JKR=6,; Je=I6|!DE/wdQX b+ ]9:S"U*/._彡 P([앲1Y3BzZJfɶ~%ݓ~P&'RC2s~T*w*:WBF&ݗPHGFY8MX֗|&Uy>))ҍMޭ9ԝR22=|F>K#Zfa]ViQ~#Vt l-pԔr #ˏ*Np-)y~uyJ ݛљlIʼnWD-Kz.!xsQ}N1!%Vݪȹ٭2T*5?ZAAwv)?5$*wlOlz&-_{Q^Q}2S;rQq$;R6˗O@wZN^BEbay&W Ce"_wuˎ !_>=$DU笲B9jsf[#LBmILxt\y["O#z E)so^[sJ;tvBŪ9lT:R(U9~~ĬLϖd)*N}m7,ztҵy9]>^ <'.?299wQ_>g6f$:|uKȮ:KQqaD7oRd>ehcζd-?aP:Ê$GD.όx̛vUL*;عQ\L\\8+3G2=3#LZC\ٶmk`i#Ik?!N?<9Tw9d,Pҁ_l)`XH?+#Q,T&殜ܽ>z}X" ׉xMY(ʥu**Zl{)E軁 N]rNI&'']p/nmu :]ӕK&IeftM1Ȩ\-*S)@XFTF).O:̽4/W&NDIWߓ)ߘ04o6 B?:zαʄYx|XA$KiXDmz:0$cGZ"gE dTɫ dg1ګwJ^MSIgHu1rG,.g^׀kr͓RHQVZrH"S7,EK&j#jVe2'jRװyiAEԈ[ٜjfڥ%ŕӸR5 %?eEV%E")Ξs+l̈b1+n>ex˸@Mep1mТ?-dx7 )8;s 6a%ҪEX#{ʺtf+21لd3g.~+O\ Oj.}mUj.z//Gd/gi*LL7HoE^ڊv YW-;vɶ?b=/tFT~ոra㉹YU9@#QNk (H\ͣ$8|ՂLBfdSy} Iw,ii9UɆ21IG|)Ί_")=ϯaZE+]Ώ,1CƓ;er(aIuV$>6qY ͑䉟w%y󱔾Ʋ,Xǫ~L^:)㳞+۱|쬲) 34:E ZEK(+WGbUF!sNA;o}ܑ\Н97\`0rYA;i2]`z2v,ل.< ! ;dN)dDlZb=1 O]]f{]񪔯_~6ٷed=6~<9^o>H!3"F>\&%l诤LMM;Ȟ{z\*Ɇ%cȦer)suR2鴳T$wҡ\wnqguWt-iy:?,E⢫a|lLRIhE˹sxΓIlNd/+/姥V]ߒ_FGGݹsCfg]/^\ʞ39Hɶ=YINT'RUsЍwddm0ewWt,n(~o|mJ*~AN|wRz:ܜW͛7:OZdu!ϯZ*Ĺ[*ud2/cfjS+9'Ek].𖍁O[o%]eAHomjjJ 6mJ1b[HڞvП"AɔҩJQ3"$3vUŗl2d-p˖-Y:ukZ&*}"WU>/:&6xNqZݸ)ҕN[ %)v^Y֘7 yl)@|yvI\rޓRUfJXkERQ}KuGv-Rwӳo-˕#:CwiLش0CEyqr#='o~Yf3Iulvҕ~{۵!sSr!x Zx8g4p`> ޜi' rsҰ(Wj+(sZeObE$SRJV#GA$ߩ$uhewRi;.uu(Zx#6&A6,Q/㽨ZM PYsT1fNf7Fdj晘gܫc#EO3$q,9:`,-EߗB^=dFrYq4*MTw?00ҙ/?b*8ulݶ]^{UxvX8< ԩP), 24窍zkvbB.]$۶n Ah^^ h?Rr|xLsPndj?gRDL$I=Hc0E;';gt`b3qյِe f,uƛMeZcs\us|8k%fwʎۯ16ӧ3gϺ~or% byqӀ$ɐ==9K\w(Q'LBPTӿayASr9kۥ]V&H]7ouS|ϝU?Vx.5ITAgΛ`*^ŽriR,\5h86"zdj4q r ansGި {"ւL;cjrJ |z"y`]YX7܇uAMp=vvv"ެ<]P]A+F'.g 16(U{0:O dф$<_)W{U/_# &seH+;l.siT(XFNھmaL:fHs*D+vkA0U'Zr ]])Y@1Kd`7ГM=mQjP ) rXrd?XVkVxU}qӅ")TLU7Pgs3[jkAꚑPSbn¤Vb;N$յPX.dvxg'";x{5̡l&V_&q|&m38yJ&&Խ $V( FEi4$o|JB2vٳǩQI| V$y={v5:kʐ(8EyO88J Wd~^&I;9 3NֹzuԽAiBΈX3TezjJzz{l۾LѠr!*=v\.&7 XꋕS· YC;īTYSSg.ڸd 1cG4mNm^ 7W6vS.g1Mƍ{ Y'F "ȰJEkE{o4}ٶ$sԛ}13ӤZ;Ύq||رE4:6@ Z-Ԭ7n6JFǻ؜*McAnp毣Voz-V{e!ʵĩrsiو`ywdJݐ4.v Uaj-+x/P^8ps8g] ԮGcUkxzZ}%z̓kP rdm$@[_jk`vELSm ^he^*Tmjj2t4 (ѲqTl\4ZRvӋ;U;:OLN8? T y&"tHT BOWp1 uZ.efzEO$V9⤹P~`pjَܺ]2k911鴛#o:7[wȦM+&9.:#T1:]l*V?0t"H ε|-tH@|vpIQ- Q1tp #>xˁ ;gPb۶msjMc-NPVCH9:c.\6'G;eKwOsv$95Sh'TqYwq% ❼cy ga`NU;W"f ~tԧ}O%_}!?]5 AP]>Qr_v/tx54KF.8X}IÅ:P]c^c(;O|ÎpY «㚽w>G،mxj0|6u<" @]ƶЧ}ڻoR:ڈIHW\L&]g`l٩k;N<ɥ69u)'}{t΂`X-(hFxmeGO#Ჾ$f=_xsæxuߋU=%Lg7pawޱa|4ph0Bg5`ZF}w4+ZTCwf&S5P78hC:jYΪkٻ߱`הGΜ9=xP:QZQqb5xnpp]]4;zYߥalhΜ΄|L:zIc$X`͝J:<4w̥hh(8PX/ +qqIV׉'a6 >s-ƿY͆b(r09 vDu\q:0cKGa2 19KFq 1_~f h/̀ސ}wir&a9~<`)ݻ]nSoxfnq?dgΙO}Sk"X)gWɛu18w+Ѐ(Qs,]ȶKtwR=EX_6~~nŶ.%"۰]'u`O:̙$hKa_q_* ;'݀@ $Sat%6QKX ygy睮ARr!+/.'\d&P1_1QX񛱃|O7ʽ).D.#eGO;v`7_%&@}.>a xoYhZ"bɨba]XҚjg8Xh|(2}>vyݒ>n(}Hm֝'.~A3X1KeG29FnoraW& xWX>l'L4lл)f&F5"<} `7)]Ge0V̀ ` %|~3={/HOZx*uoOL>oymBvY < Kp eO*'Gs]YsGX#WD1FnCh=~C|c}zkcesmg!n9֘ bG?Ѧ]`&`y{쬑jQ؄ x#BG\ظ=g@." ʘ'GgeP]ad(Eش2Q@M[b;9r*iQ,k&2E,OXg6fFL{7b|53FF4]f{]G;.z^KAPn:qaJ\R.Slq̔@g, ;vʢAo31Ћ}{ԏp\/C0Mr u"#2E&Bۄp, G~Ooo D@QO烘Q>!y{uu!0=:έ@cYDb eygp`fA v  0fHpt:Z' o3m)%ԼF͖`o Q#rcc>Gyи&.!Q6pT( åP6."9r} udym > 3`iAe>(d2TϠfhQ3Nsw1\m{ꩧ,rq⢧ FfrYXFD[@Q:“,Јovz@2_s.ʂ|2%X]"t}7f,D-hgi Dd|5;3|anf>A04<f}U벍y0!S'?c! ̓gHtit)Zs%A?HU9lx#ko d]x_]ͷ.ouQu)ߔ+Q׍mhY;#PYG?lS ;}g[NACEؙaC 2 ",`]ryg{|m|4;$Q'saGg>*6Kew7Lڃa7fcx9䷨*Vm[e f >֎H F!@iwd]axOu?ca SxnϨbFڻd)E.rF2 ;l%DmLG_?)I&l,N`[HclW4kl5l XAsԴ{͒>_4I۷X)qgbm`KmLRq$\v,<^MgqBε,'&KO[ {(-*Qm2vXKl&q1B5mIP00(pdvR/sb6F]prqXxAOxe`5-ǼvH,*9 EN)h0efCsFp \Idh.|t- =hB4icN̸ivcm 8p !Q?yo3ļQ%bWLa5=Cȸ@*SX4RS.b րMOF :ӓGm]1Hc{o2f'htgg3f6޵Nc㛿/m+GkٜDm#~=ڱ*|rqΚQd6]osl\1d:t 8fvv%Eء,u+[γEX#5UmA}ON@~ܱh>[C-nv vxn;P }(\a'a2}h $uWg3S#0T1QXfGaob'sYHW=0VPIa!,ńPX ~PY``ҩD@ZfbCᙊ%f`y Gpph 9y̒^w--E}ꧯ*k*pPa[ uԒPSoE. b1[-4ϱ.h}76YlB937’+2pZ!ScK[fQf Iz'YLUuQUeg_HExFyYhNj֟h1Ei2mbI)=/j2mXAX,6mB0tJW뵻!s9\9n'wUb>@ZgY,e/_(+y5]n+1 ^¥ֵ]l1 mXj\dB @[HA<1ZIa#|gVYNF1Ђyn1I)^<|9]R]2ZWhY#˼P3r2La,qlsU׀AmD`ѹ1dpg8\G-Yǖ1\1xn߶͝KtK*mI7 .(Bae6*dY]pЌy}+jWz[U.-Q Aw2m|`/ʬ؆PNm3&Fp=YT klGK8s'?)a`s,>X05q loP)C%޶}GVFUH f9#K ;d,QIf $89*XFͱ EmNsj#:"Pܿd2i%ȱS:a^%δRK MH Be]/,+G˟~yCl_R!(iƋ/¡\(*?q /}W/gGۥ]œ_B맺\RuNﶇa^D?,̄z(FcKuDYBr+J%ڿU ǡNKtU(X]*^zQIENDB`DisplayCAL-3.1.0.0/screenshots/DisplayCAL-screenshot-KDE4.png0000644000076500000000000034572712647526537023370 0ustar devwheel00000000000000PNG  IHDR |tEXtSoftwareAdobe ImageReadyqe<yIDATxř9*K P # &gll#1&:8w3> 6"cld&cDP@Y+mN;ٝ}Qtޮw>4MB!B!B`(ʈ\-M!B! B!Bh aN\?whuv?3؇_A-ZۊH!B!7LMBףjLxl05Jg RP ,(CqMPb?+ſ !2ThZ *B!BTx$nz+1AU'nXz$D|>9G`j"!ds&c ce</R +PT|Z& !B!2b@\}13U 7( ~(*CM0kĿl1 ~T4Ms_'~PEVV)>H?B!BL݌iq5  l/=0tӌ[cz]uXQ4bt|e«{,MvTWsI`EN q5͝>)& IY9c'%6{_xbcƊu:05u=x<[c{XuL^((T6uߎ, ~;GpB[C%!c10kf_|RJ,/OE8e=h{@Ws_ kYS&M2^.븱V—w"8/2X%{2 l8:'ʣ[wgx{>@HǢE+M`g yA ]סuh4U偉xF _މˬwZ7]$gq+6aI-=}I6l(BtB q* m޹t?\tVLOj$?Qʚe5s5>MH;iO/%CCKLN Sz %S)) vRWSOE,O~BH(XqMɰ0 ]nֈ`7|5?h yR h|de^ѭ+OR-★ qQ I`' ]Hq)[R2Y{n\|#TMMfW&/qc:W-I3SETAO$yʹ~BSUN?4Lu_KM.]:(')MRΛh]Z>L h*Gu&0Z+, 9|~I$Ecc>co84S~kxg7?.qypK @2,,u, >JꝂ PMc}V`aڌ>)0RRkk{>p Ñ{/)5`ąe@MϵD,ӣ9zD4ܔG_ŋoD{{裏ƪQnQn\T\b[xw@oLGTK* ;Z\!),Ɗ7|W?^kX18ǯ-.p[K<͔wsS3Z< >_ N1.)8ɰ^b|xUQ,F`&p[W3K:*V?z h/kr8~֫|cº0~>p/<q|xe e+s)XVTs Ac!2N7.Hx4ItL14ǟ,Xe^FnBÏBs{'S_s\x9ڨ^Z a̯s\w{okVVA\?~?***"ÚZmiٖOy|B`/Mր.f]`]nIA<ʟT,Ǖ8Ղm}I.}YTNX W_~RU´lM=Z>igݔ{ݹR\lk><4\~e &;gENUXӧ4ZyoYg@a+?ot!EbOO/Z:qWa򔉸wW_Z e)ﯟnشn݆Y3gs1|a,y b޼ykꫯwc\Rp(P#1( غ:?=||rg!xg,V6ڸ9ļDMM S#9Et>QW !؏'p[T6ᅒ|2;!?n p+#" ZO>$9{hhlH'ʼ/bl VYWMos͞,K{G;\Lyg͚-wP}[ .R\~2_Hwac塴NV }Y+إs3烺 Ҵ( b%-b{U ~UV'Q#AbWOZ ſ!3-YcWsYayO< oUdFϕn;8#<HE00co{spЁhAMn@zEY /򱿣饃<Q]]wy?g[oy@B?zq#f5݂kX V)p1 Iwk'#*6LMi "51!HªOgW$܎ib}>fϚ},͚=[n>&]{ᆄe|~ WRX/%s&ӢEHS-1"'r2 z,AG{n&\,(3 m(?c3gpO8=7IIIib"qeuBATkFߺ~K|#W_d,k(,|}wtnX1SޙInGq*!8c7$?O{~3p5g],}ҟB_T55jWS`Q 5rCde3ދ9N^mOMG0L>pm g&]}=MC.u;5kDuKĮΗ8 kt7RU}_ rfLNώ~}R+^Yc{׍ @HH8fIB-mU8cnG'_A"R2m6+\i+WȦ@9, 742Q]xcű>wަG"mFoO[ӈĻ=CV$1;YtMϺccZ߈1>,۷IoD5ݲf_|i~/a伦xM2=s>g  aӆdL8ﶇ<! 2M(=8|FJ ދ 씢oxe4U ZBLKU/ fx;b5wp 7ly\gC̷䎎S_iqd̡;)9Vy2ɰ^fTD|~5z7W #rФX*ͧa$Î q&-in-g0u4456}|!dpN\xe-@g|r4m_CiA(jwf%-si~'p + /7ݴXZ%܂N_"B#u9,}}4ˤ(XqMHwZo7.>|J2۸MضNi ES ei*}N'rhTuﳒ[𡲲UV XQN~JvML_2*e^\VD˘k]9ldʰaQHۮ8xY)BP$4@P=`>th<9å#"U)R+r.oyb!CBHAQ u5Pkbȕ0x#w3Vec90ڢT-JLBx 8RȈRuzo9lS Rz36VJw^4WY@Yn֗h6N!$ !5S7)ܘ \QvkxϲIUQpl4z0˧.èY.{ Sw\@!$(B`O1*0]X []!G~tGŊ"Oc~GBK#B )uBh<<Iz9:[*:dnq:˗"nG}KuN6~B B="ʾv*%ZΡKi*H[QcS/sځ!BBHA=8{6E/n福rhf80ZB)<*$]ocC~rxqptM郹TZ@,: WBQR)c~#}: ZMd_u&2RM73Y{[<^CDcQgD˷qfvǝX hfTS 77AbDK>\tضxk׭K܏= {CίK}~ oy ?*Ƌ{pmmWZRkҿChF'e&](B)&I ,+bHn|]|TUE4ý?kPUY3~lظ!u*%~+,DlY?޷1}4Kpˍ7A1 Appa4ls H # >PA2=Ƿa67XP#2P$Eg0 /av/]70g|5_8#?8[w8rǗk_=>iמ{˧-¥'"mWNOSo_zia(r>Llii/u${i%DȽCwcK@EE.:{tC2 A4g2 nN,}ihϺo>\`9~j0oλQYY)yU%>'׾y,5w$@ &{L :0/(|3ףP2nқo=!:o6n܈v[19Ȍu/%7oiOſʲ]]xg_,axE?HGg@w޺;{xa[\ڰa#qM7nVq/wAs1g^F!qVn]lm+quu?Z~QA9Xϩ<38?y'S4w`4,92գ0x|xd83'aϱWܿklB!@2W^7rn$fZ77u|>c /R);:[MmmϛښVg|tX/gM+w[7 ,Y$~֙r˧G񸝏㎓s̑suͧIKDaiuTWW|t32V~o>*s>6eDߘ7onr[ĽNS]s|ݟi[k^xU󍳊>Hc?UH:.ۿҸ#x14cQ w t4&w1irM&&&&+.` ۆ8\gga\te}a@)WMMEeUU--[QSW;P[Snhh@k[[kttvJWƆľI&eV hf!9C/[nCZ]rq)ʽUe$k ed_B)%(QF5ګ|j&`S<O8.O?ob[Z[$[[互cB:h0&N|{/ǖ]_41-WZ*@Xd^k5ϛ+7/_H.oGGGst]Olwwu-vRQQ=n;07F+TLF\0,jaQE1j[c^~&ۅB؂.d/OXvgqu/}}K|P_'WKX5w$DpqXe;%vg;Nyg!R:.هFV[D_ۅNdA @2TWWK_m_R2,:-9_}} `P^&Ak%d%!8U&z:| =omf8Ti b)t 9 [XL鳒uj@UJqpgUT}Q ĺ2IsG!B!HcEݬkpt0 tńjmvNU&6ſ5]A7t~+u^SfYI$|]yjC *FC D±/&>՟+t%B!BHaHN<+=.5!׉(20@UxSj Lu55.-\b+n^u7TM Ň?z*L[s-4 o< _O'u-\y iG!B!BG;W QL9S+4L ձ3tVaZYW&u?> -5M"xMMPTӶ4L3۠āX<}?X2!B!B@2昫e"+Rl ~sB1pUGjLLޭ @q+ ݭ!b}M̺jLmn*:r@WXcw_&?Q(B!B!P$Q  oXK]V jkXǠLA`ݨss Oy=U+碧3!T tt8<l:o,~SB!B!Ń ɏ]Vj{]A;"IA?:x?lhFCut5M"p,턾 ӇIͨW` F׶./_+.v5B!B!8P$cEgJ+9 |J[0 WEo +>paö͞Ԍ3ߟWs.1lnkG7G?B!B!I~ZqZLA@&VrB0i?#f j Q5aۯ+ihmODnMM0kx"i5\[z;ѱ 2/U JB!B!#@%pLmկbunϼA7Q1C4+?jBL|MةNjwBU ,(ִ!ɖB;Ÿ7[ P]p!+zB;B!B!E ɏQ6'eSUlXՍMFT'v+KEXHQ-S&bR1>\q+u;Zw]XEc#N&lF=Chت{h>},҇po UPt䫤wR̈́'ωNsEE }Z %!B!AHcDAIovͨo$-_h`ޮvt_#ag[>B!l}`%: OSD[V۠GDɦ?EX ӤB Vr_=g:T6U^_߽! U+Z/⟩{>P&mُXj( ]h4?JBUEԬ=u!k.@Q\#ߍh_\" j [CUˇPNц0mSd_!B! PBPT$MT( qwDZ|s7L ܽ𫆜a[ -+1`:4Y kg:_YK:v&j'>ןbfVq J䮮߲ >_׆MBI}1.boW(}#i5ĺ᫇V$ ;"|iۆN+?=, oRjv\r^n;%v{kk#wm7>޸?@/du˩^FM}c|uG`sβ($B!Rd((cw>Z?Q&3qMRab~Uc&tS?WUmk?q]_ky~UG+{bc+~i+g)̄*"kÔ |7/y5ӤE{BkG]?ܮzS&ՙ6l&BnŞS|wNAmuuF'*!~7lWeV~{윴za!B! $? &ʗ']Ÿ̺ yuIaqXPŌOPfϮ/~6}2v ?mir,0ן{?ñ 5i+CcȴI8hqā #ǼYS[Y3)n\]QmsZO``;d[io6{.<(C%~s1}|gvH,߃LL! e"PY>,i⨚-˱oXe_>Ɣ}a{!&|v B!BHѡH `bv})BxTg>'$7G=Lf@5V !ku]DWBT&Vj XۻbVh_74=a]Dt0_Ug]6:M֏e,ǣϿ.= wy}T5L”iRry Xr&½]8p*\xI]?O㚫}CG(ڸg~D]^x >1eMprLORGtΦv¶iT7(BE`j&@B!B!E ɏIkRjvDM1jC0/aO h*xzM3(7YoİtVw89"Yeo#3U$)mݟ!Ŭ#y”HU +klwhaEcPU ᯨ-D4p h!Α}5V *jTa!z*(1+uElBxA7k2͵'sځR8*P8SǬԂK}FfBaQ KWo>LŖH%B5Im aߝP[m |/.z=) v[yDfWL@D85ՍۈؓDwG5Z7#2j B!B@%$v@ĺiriV`g}fvƠn ?0hjP~7}xzNhAi_VU6uam01G;Ÿ1`2_KZi~m5N:ӧLĩG{ ه͒@zfn} LY_89,>y΍&g੗x3N8 ^??܂ ֭%,]Aa 5J>;w}u_y//6liy~DmEXj|y_.{ɿ?{OGm̀EޯD*kmpgj]#da:V#!.tD^Ͻ1^]ݽG~࿠c(Z}-: VOA†I{ t4eZy>5mƯJ]MܷvŒy?w] ^?ñ39]h t''_WXuCHo`].݀^8'ohViJ< @M !>ӏ q+"*y^hXLwr<a]A}Ϯ8 _=v>{|q?ю!- OwKrq_-H/sn⺯ `m7D,š&%5*CxO|A2ep{\߆ +;i.z!Aƿaeh뜏 MB!B)I~([dNœ<~chŸ/ꁺ:kgg!#\sDv.umiƕD hlb)a`׷EN1v˔yUj5`*V{liHlV4lgN ˹w=x 6rI/y{>=lFU}h>WF|}M1e",Z}!+KPP=`L4?~\p>b رxݵRz9PwG(Տhz7m}CLqa$='rDqoM[eYEujeOtp{^y|Olp<ԙ{Bڌml¦)m-oBS(B!B):I~^Yzme}Tc*Y]PfΉ;97ER J`"K\Wb֯&?Ecvx:$֝uMbA?ą45rpUUތVs }w'9@T Bě8c-A n"||KGS]"HPO)mv5n>maEZ#Θ:E}X /\Zٸ-iy2A}/>vn U*dcJ) D wwvb쟁:gc289R+ tx:U! 1$ q'vgns*ʶG(o[u 4; 8FeO[*|;s teC3>Z:vb?3]N!B! $Ϟ"f"nRjZұCpOL:ZR^jt*0b" ge)h A'Z*Yn+P[ PD0`R}Mb+NK:]vue㋟_oq]׶ %#kl*9_6SnuWOglj.ϝVcF]w/Ԋډ;&/$N3#X]A8B{qA ~tΩV};n(]1.H6ζ0}-Jlh+KIJcM 0 0!B!:l7\) !ڹ+IrZiX>TYΐsD$`@!-UuXD&vv7v-rooPۢ(>+Yy3{ҙS03C~hZs}#o@`!UOێ^A3c>5w^n՚\nȺGu=]gO,!sp9w(*5xЉnC#y<^kYu$~N))в\u[0q wrw?lxdpp ˆ`bza mW5z2J:LL5I!B! $?) w]qy O&ycY]Vs5ؘf&5W c8sftv0_όyD?1s-L7ZK7FjEր@VbI@+zp%K7_wly 8BC˶nǷN~:s!WH0w]+Y,+֣>6~q=+ !0cꤤx5WvvǑ%]}} |Z>7|7?\gl#hU|8ֈh'?`Ǩm~x6C wmc_jYݦVaUO8 p'`Lq5=ޢ3OD֝>KB!BHH#A4?Ù3Oq27@p\Ɖi$zsL`_m&ML*)q7LܢWA  WZ`ӜTVŀDLZ(hN̟ .?d˰|si¡.◩2+_c=}ıҝ7zḥNJ~g_[k.k[t#5ij'ϲ<*T_!R|U؃ó$Q(ظw<>qsaE\Jέf!S#תT~%1ڵ^y_EWX>h'-R?s "iN%"t_ _{HO;:lr.bvCcnG_CzB"m!\t>ZG^ ?19ö{]'~x ~sxkN۴KX 3`_.EP<.z6IQOa$ U/(O}i ľ'^xڴ'.6lg*i~gNAh|nB!B) (Xdt afeYg=᙮s]!uv5͓υ&.UOB ڋV2 OQ)<8Bȋx`cu^̱3;VHzY]0(,JN.2?.RKEX]2T5LdvfFJ:+{>M[q?WnFRki wܟajH.\>ϝ'oIy/ a$ {ڏ_,/-[OڢlAQUMwqk;{ vUa5y_A?wpb7@ Ү"M’yV ý0UPɄB!BATF:ahaj-=f&#:nj50ajN?+59WVlQ`ZYyD6oͺuݨ#sf;V2aӵ,$W&*P]ұ␈'^+bmƩP4.KX6Kq^C`93yGdzg_z|qH'ؿ֠C?Lwcĺj\ۿs ? oqζ)܈Eˆނ.k` 1wdn"zcuVp%S.`=h/}؆ʆɉrdz=_ax⭻l<#`tB!B!%-)7/9 jI+뉥?% T55jWS`Q 5q4sM#r~B+)\MkA!Y֭sDYD}|Jc[@N t+Eϯ]2qyRZRSe, #Mz:~v=(i#%]gՎ4PlwNB]΁&'K!B!eG o#6-iDFwwmF8,Ay-E -Is5J'MnVβRb~eVn_)W_3 nE&7zIE)@!T vC!8EBHFEz2וֹ T$n])j9 ;q!e[},eV*vDʺA4dڗ A!B!TH\RRԽ*+6[o n&Bw| p8>N~Q[끈qV\w?}@sEl2G@"Dyqp-Sh/cBGw}e%)HB!BHHDϰu ΄c%NiV+mv&Pυ:bЁ6 g;$@O-E9b}KO"ZHL sntgn:>`Taɋo#V!j !B!"BI zl-;b^s!ĿqZ'u셵kyNݱwV*;0 Z/){qwuKH owhA{@B!B!Ņ ɓbYz,ʵ鉩GTvbNblxCzpܶźXy\~Y7V)h)2HҎ(D`U-R!B!@'B.k`@s4 a} >9}l/[a`׍y+qOZ29򗟄NfKE!B!Ҁ ɓxJwqx-8tCXnF՟ǻ6^{:m/&'o60WʟfءLB!B!@'2^ˍ!,⼊]c:Wlun6c (DW_?/nN_ohR]^(B!B!tH Mn ?CDŀ*tn]| ;EZIе3\1vsE07"S<_|wIle*Ųr{{OʿO~-?CB!ܠHHdg'z]l\1P,73m/f&OENEXv"Y Me՗q؏**nR9e-dێt{ý/7F)ɱg"B!RNP$y𺾺2m_Aa$鉦  .bXc) =*d0 gP EbڃWWl_}Hۓg#KAAAbNxfE̞9y{39xz*H,K؜&OU5ݳ=3..vOw6^" NNh{5ݧ.ZBk}%o<F⢣O~lkKw-{vu;|]%^;f:Vny} a4xc]x8q!;aGa~[}sg#B!@%JTM%Ĕ} 9󀵢S/>1}P !Qol%y5>׾z=Ÿ hCmY<Öm?3 ~0?oM_ w}][S__v(ޘ;l0_W%V~v`{oǗ5`(=+p3ӱArNݾ79lf/.a#B!@mS ŸUy^iPQex k#2oTO41" 0hM6.}-WV }}YWqqb^S/oG?Tl:gj"FУ=cjd={{Tc+*œWOY|:(v]2{+o}^O٣7kOwB9oy&\٤9;]z.N+}8l?rixҤY]wp=|B/>iwx]Y G?-inLw-gp%y}0~x%_޹~IOs44U>%ۮz+\o/PNbLka3~]p  aK{\FhP$kkPȣt|4>a6C4 ETvcbQ?-, 7ut$U-]3 =pnCRg? "䙏7P]2M{o梔:rϡ{?Fy8amȔӝO>cXeAqMzZ|?3<:[햇9+g'?閗}^rGې(ui/v2\q!g)>m~0濽47Vړ'wr.;n%B!`0ɒd?-Z6Tù@AOlXnk3_P'zƣuFTg7?3ME/ѸF&Rl1][Z:Ou|0WbhïE/O sVpצSaʩ)αfSukt{`t-RlJ^ֽpNyM,~&a&='ϝ!\٤;SznC#$]#;e\mȔӝ%w~[}h9,=~%3>͓9H\p<&)^yk3!`Y^wb]YMڷa8-RY= %O~Q& ԫ 8d'i~B! dC^X'0g}Xo3,Ba$Y"6 PO#e/h]ʆ5eiQqގoG4W}yu8w?^+n{~-jAy\N9w5.8j .9f,vx&*Я[,y53]ps.3>򚚺Ö\{2ynkzN-2+6~KObCE-} 6]VD|>@7ʃ=L;!+AcS[Z?L%3>͓3r崫N{ i^w4g b26T`Ms4d#$ks3 PXxsyP޴y2Cz!BH`sb1֠APIrb`j"'eD1oyQ@'{c`HYXkIB`Ryj)CBwDZ{39vRԫvMKy<LlǑK/@Hui{'> g2 /Np%>~)9yO:q g}t^K窪c^M~S~ZSJҤӟ3ղ\{,otҝ/\-Ik}ҥ'w񟙋p{9\ýuنv72LnAZ>鵧_Y3>͓3rбԠκ\ VAI&y/[Wٕ'uY0O~)ĩ/ݦ“t`~WT%(ʮ5R]E>h4F@jdERsBS^n׃SN|{ם4y[9Cza[E 1Q M!!矹DВoV4f sT*sA*To!{髄~uxTT /~kJ_Z4?DU9sq _%W ,_5^OYij>k1t.~ڣua_htD/?~w<19+XK{+9yzG*4q6ytCs$IT;_.ߨ+ϲTװӠn;k||y72LBD rrwW۴~fڧy28rGI?3`҄1b%)IK)Dvk,~: x.d2.9vWL:rE_\=쟼O~č~^rP8zB!jh\v/OӬNX;ڌØ:#Z܎|W~^-7jtŸÐj%N^ h4VprOHV x TkEg_X0fѰ FdΘ XGѴgl*' ,eT#˙c:kys8>c5}2~B!4@d:"*?@!ƦaAVNxVON#i2TZ䨾n=B4LQl)@B!B!LP$Y!@+Egz:P sTO¨#ɂi:DB9YEy.CF,aV3ElF޼Z$Il M>#!B!Bօ teEɿuT$fۘxh*w˅Jʑ(B!B! $+BJ ӕ/bWZfk$V?:SFS}jI{l(h)=FI'B!B٪P$Y!e/ѿh\ PJk#8Sܳ~0`[g#l}/R4^-@O@B!B!'([Ĩz5AK%5jp辩FxY|LX26w*~1!B!BHkAdEђ7=>n>#GuJ%% fHp2H~bm_4 b!B!B'IV@x ! `LA1`MƦ>D@c D5h, B!B! $+b}6$OJx>"2o%Uu5%"s/9\aa4 &B!Bi_P$Y88D0j@!vomO)/ژ$6'sb2(?B!B!t,(HD_2$Xa6cԇ28QtO۔dc!E<y'!CT`ɌB!B!m@K=M0k\d|8N+GjI 6l<ꄭBgZrB!B! $+RKL/dPNQ%肝6BuM1f|^[n|aC$>[/X^"a$ B!B! $+@s4`s>98d|r`h\sjO1z$5L*y=g m*B!B!BdE$RfaԦ}X'\U:ff VnB1Oy-ZGߔ_{-V*,KHVB!B!?(WՔU4kJ\gTe /@A@[w`s_@L#B!BiP$Y Vh+aZe4L/xKeȔ,1ӅB!B! $+L0ԕ* zaآy.>U@F(_My!R[ ga_B!B! $+"MKăơrFqh][|ۭrTڀ 5r?ndºg/=OUUUGIє9@`,%tc*LC1H!)1p? /LM{DOO].~ݥB!dk br[‹{裖tùhGGIz/Ҩ,?vl68]θE6j΋6 PJ[EoNS7ȃtcQ]TiZV@fS/iDq@JL:v/\pʑR oIBI EL`2R cTy`d7`~"B3UMry]8a u0z"%%xk|8cR-k_Kn5k/bʕP3N=tVsϿ/=4zB!@]]}~fj|ak$!LP6 -VS)IӍ[$ S'?ebjJt⤴<oaޜqFM Gdnn|sWk+/ƭ'1V|^7u/Ok>|dB", @hwVgUS޸{>Y{%S \x(֗G'F k`G'U0hW^s*߾ϏfyZL9|X[\KbYB!t _*)r}]1f̨-RG6xKǨʩ4^zIѭŸyN,!L%)4ֺ׫PelŶnЇCp1?c!%lm:\}\xx|:sobdAV RN2 *AS "gu`^ŧ[/[]7Z_݊?>iV;r,0~%~J7ObN_eg=}xhMWX\w9ԽqظGxp{cD?\uܻe><-#M|-K/cSiy>Ǟ)'+^޽QRgwjy8K0 }$~pҹ6lheRT^kD%"bk9^:U݈ @7p_ssN;87^w5zyxqy,!B` J4٣Gu7mRS^[4)Mi'oƺáogK ۤygT[L0kb\["ϙ>('yބ2\qYx5XURns7~UIHm{YGc_ ٪P$-,} &aҁMp&EP-3E?Yn75okCً߲JǛaRBFۜ~hۡ.y%톇>.Y{S-K;|Z:lgzxպ>]qϷ{`¾wN:||jt-cvm_~U > ƍUNg4t}o]O3bJZ/=H1/y_MxTG /.HR/<6O?{Aw]8 sO{w>}`ijXŕB!#q?eA~e%=p__ GP0a FuSSY7mUgE\Rd7E7ӹY,Ǚ'3[9n/8>dBdǏu>A7UKۥ:@<3g3n:c_ 0mJQgz\+wK7ͪd5ʪc27 h2aqգ2;$*= sQU!ykg|Q[眉=v-adXҭ(aFI걩0ߏ=;32YAx+/!+5G;?\v곬<=aa0^&~2z}~|,oǎ#G+B!^K.x+|atR*Y'ף 6x/;C=1VV:ݡ6)sɩD`,67V>s^JHs~KxEJv׭cʄN<.cܧw<'[ $;%.BuM/٬b_8i]QqNH?'?I|OSs8`\dMRx?&VPZef lxg JARSxѱ.[Ӳe+c=jzqdeݻuk8Myz<د*(xM$T5-8r55î~3iղ˖JSaa!=&BIbذau7ފo .5]WRyZotmA W}K[3fV/fmv yIR l2 ܦ-!iCNAid*of7jnٚP$!}*Yx#hZLm0*{Ό/vW<)֕4_6˚Dd\2\'(alQq [x9w)'჏>ŗ]'rbv>Yg(n#vSsJÿ}H8Mˌ 㕗Ww÷c9 O?!j-O!bEzk=c?I--mݧ@0(̜9ϿbsOYJͻ3~mgk7Uc^]0騱j}etT˚g?.õ썿2C}攽}!x9Xx$R " 8L+N'p7_>8`ԋ= )k"ͷdrG̔ϧ5_OKc4͆c> O>.b +4ٳG},QyyPn'x{z^B!#˖WԣWC)nm&-6m|Ljs믻 F7p$%bΜDmi[Jt k,u])Yi+Lo>)BZ`sǼ%;Vgؚ5~9?u#yXn+ in 0dGÇqB`g5\8c63[Uzj6oM.9\yP'>)ɿG~+>GeOS[F~{|>o|} Y].?5JAC_ijϿ˥W;zp^y{J.p^~uٴDTf; <Ͽwz}ߖ_B!dB 5]s%>lCr iSZGN8~^ئjoiߖHLi3+q톶Н)Op2Z8r]|L:a$.pwCOsE~y%T4y1/cL2krymy6#ߕWhjws=trèzM.Yak \zsh`y !BHR[kA ،!USpWaEͨFQT?VׯmGgtDsݗ!//OK+RR`SP} Ma₞n$Y=Hi/[w8v=1 Uc]#[9:9rq!jy8:@.>m`NOpI5#Gsš1oq9cpq#S{36:P$ّ썟͗λOzf 0*ׄB!d+6G_ThӕS9jCw6I8v2^~Lؔsn-{c m?Jwx٘\\{q~={ν_X1ؖvQH"O㍩B!ҙY tٮҤkvՋfTv ))}y|=?oiiJ!qq:426l6mz {aEpA UP+ئi7P$- -}i몒RQ^03B!^hec^oZ68U>'@[owvޮhh{%o!݉>bvB!BC(^`S K!-E=[1s,[دtr)r)r| ...F~~ Ș'ÕD@(Ww ގ:̏b+2vM &ּTڇtQ]B![ t"jkj Æ S#6JnTeR fHv6!5Q ! 74H?"e.nxs 0-;FMæD@ &RH6lVQ3O>f8.Ht/cb B!dBNBuUd0bDư+ltejeZ/b} JOL lrp89+!-A#GbŨGaaaI|dޗVzmV0*RfG52kNA4ʰ gߋ3] QAU[1Loh{;//*ŊP.wpn^DCdӆ9Zǟ{46jÊU:é`y+UAC!^s7n0~JltN5/!BZ t&ӆ_yHy)SӬ2̩i'`ѢE#  NIED>k0`S^VB9 iKNexbFBtu|[Q"xQx`K68e.e20 zDpy]OYw`zn;rj\m5DJP,s`~!0aXA^n`7ް\, dL׼o \.*ahuS0%=Vӯm}=㏃0hP_@+1#Pw{*W  y!j'j!ZA!nұ|; .NJ$ g)M@ˁԼkb^YzA`#R@lhRS"!b_ecĘ:9Adsy{cE*,j,AxU b*Z.aR !F-`DXX Zoυ?$,j]FcJϿ PJ|Rh_z_}|AMsGƝ5>`Yn96eC9VSG&>R' ^w;Bm/_uuˏ[)S" +[H;E0tBL:x]5BҎh5 !d @B:0TW+?gjækj]4V6mҌ\egJql*Y 菵#QP (+1&JaP `?Ƹa]B4tbСXd0jo<9 _Bt/j]Js(/`O77#$Z⺃ª8h|~EVB"FeSB"IuWƨIEL0N**Sn;z+EÛS͐طrI{<{y%"VUlJ 鬭UyGYC0v٘b>2u"i"E*o!R^UY>}0l&vvQgT<.[SO ՉMuygˌyѧ*xBJȫQ^c(upr5oL((Ѷ;'$s" 64NeS|9/]|RsC4Rހ1 r)vLρ4]AH  j } kwulͧHiT6k4G #svհ J'rqpy`wB̛+[m, U2~ ;_l(9-2̸>'C¶d(΂ -;/AItU: ]#~ a.BA^y2ɾ#m v:ljiLluF6יBaQZ8ZHyax]N/A9Y -H2fAW`p~1j+XU@`v,< C1 y"`]|mvvpj}Os]@g~b>l?<'Qȑ݆MS-*#2QG!~=C;1GG8GZa~Fg.e(*?E !$,% 頕 0TgաL/X%ZW {ͦ,>@H|M~b4c?8Bٗ!W_H-`B= աK.p޶QZ}Y+QZ_ͬLz:v0ה D<]SKT ]T~IBX񨫫CϞ=[S[kziO?'G6춆mckp;ju<`8'`O72$Xy -W^9ښn >x@OzuQUV$wQ&GW3kxz /@ڷ+SCy@( ~/Y7^5Z7 vj͎Y]Ŀr&ms~[@8P M|5G8޾*flNZl}@]!6^'BU&QT Ó^o o@++|iYډ)<( V RnS`/BJB= `}Z@7zba'c:dhq<N)]  E2RFg nCw }h5Ľ QwL3 G>G~ޭ١}SœnnT}D_0*&#LzڍB<c#Jq6ϕ_l ?"`V', ;r#mS1!hI9 %zvgc]ޥ{bB,X/#zK'_ܞ,D4J좼u#,Ǘ_~|9.G}8 Hzt?>E=r<6{6n7/Awމ=-*9j:gO]uبm&ٴfUU[@HB zny")=egƅ8`f+ۿ떣^&Z 9^ #"7!Z4aT?VIѵkWlظq Ӂʫ(@$0*61⟴\5 ^-CBCj_D@H4#1g1NN8k!T!Y"cx9c8z|Y& ]V=,xtT*I߈cDTO_ȼR /t;PXܮ<GL ɰ~<\-v^s^ yF P ^1 "e/j j BM4'y|x4lC;,夕([]{uNƑáuux}H$> AR4Ko3)q8j(F;&ˉcN8or0sL쟻?gO(wC^,m.qjU󬙉`ȧ {}īD*^Ox?S|A10=p8cC “DQ?o=,Wu [呦< <*B^ B݆ uĉ׮z*a'0E΍gtuG.]1,\\&2"r2BȖ !YVWHZgK@tr5B:hOGZ)" 7=.0qYCCqgR)))ٳ*Gj}JUce]eeexW1uԌֵ{yD[#5[ ЁB7M_PSn@O\3C5[ 0 gJO/(,`NCs4a\ԇEh`ya̘1ʓrx뭷̙;%mxI@VLRh=Xο9>9+?G䰺 {xa{{CUyt};=4?Ѥ?Κ'|՛ <k|AOW@iջ%@8Ux _~Ѱkoj?Yw곑 %c |Pd jVFxR8]. duOBY6nN?t9xP#ʶMw,^$/?=' P_Ma !E'\ 6~㧍[oo|3TB.L!݈G/+P>)vC P`0@E؀ P`Cz:&9 _@'ſs sP߸Y?C+~Ϝl$ɼēO!CpꩧH$[9:{APgXd2GС]4A>>  x}(TU13y[ݻK/O%rK~wC"/&ބֽ[XO}lB)mWa }KJ}Qc=U٫w}nW(؀3.!kǢ/r4enV}wŜV^</7(?9Ntp׿pua~/b ="ip?zޔ k%eX%bmq1Λ &࣏>jc… -\!t(ґn,Vڬ1x6Q(p`( yzQzu]PD?b4t$Ym$uHK,QVWW瞋{W2e ?p5?vX\x8p ***O?oOVӧ+~I?_~e|={G矯җX$*24jhlI6XMsNQQ-[~^rek Jѭ[7eg=_SixGqh`Ɇyd?۷ѣJxC~rݑG\F4g\doK 1zI|%Sv&1Kc}6+%yIYii)}1<'nk>J休JIG3yK/TI|ywTܑŞ/;s>=0, pP?_h:!%qVl\;?|FwêիQ+rFRuP{8VFE1+Qr8/g|Í7&|~K|qFme~g2vKyF-/1:=5=lj왨x ??NU?땗~"B~~Il\RMkߥ|Bo!ݦke樼⟭Thpl ɕfAn!(2@Md$P;"Хaӓyz|aA5M^r'c쮻nRN<׉ʝDlqOŗ\(a*qn_G3E &MR^?K,3=R(Of?wߍC4{noAUFg͚*㵛^r-YT>'M4Ho'tM /nm!!]r]yd#sUbϹbu5fjn;@Iwrċ8G54;r4WMS[.\b^[G}qthz 8 s~1[\o3LS#!Iqvϙ׿|N ϊld8_ze0`hA/\52liSl aA (/O8;3n~2qĴeMTrکb_ns9稁Byo]FH628FK-*Z-.?{UFK( `/wWT{/]Q≞`O(6@$'o$H 0͛f~fbkS7}uyc$zV0p/VFXOcolw; ٺ|ƍuxBM;6n,k/N*b&Bƛo7y]w_]wީ+:qa _1=xqK~MsENdu: on|hX&V >v1SO?+䉞WSe$ enK[՘Vk#Ekįla$8j{( ! !Xn":k3)Mqn^~5DKP_jPu?F"S8 s:sL)Rޟ9s& vDey7Y6[BSa!h It2N;.6XUOGm_p镖b,,[ ׋M\~ZCEH뮻zvk1HP;>eKW%.Z?u䃥sXX=ջ|HzGݾXIdw=On:7oao }Ew.;ly *?lVzD2¸qO=.B#>kE,zYF w!d[.$\/;lDw ; B1 oCPUTU}H냬8}^QBq̀q, ]C t$/7 >r]hn']HK*n}x"fn+2/\"D ]9 &M}O; 3Ue2|.5Ep 7`ڴi/{ M]uP9j;F<^ZHCsS*>V-Ԯ:ߢCjƮ P^TY[ i[({ӱp"bI9{DW,^0|$܃&"*KY\j\YXb.njE=f7=.l$rmʃ3r,'("ph,6d{N Uu`ߏԴ4aB,ռ'by)*<虝(?߂WU[%E?Z|k)>25\<4EWud 8&6ceQCt-|@ YT~ƯYX3 ʹw‚+Qc*:dXE7ŋz}}>kE>j&e t0]Uk-k'[5)Z <,r|@!ze AvV~[WdP ʾ"+( ,Q o%' 8-Y7|>{T`b yim'믿/2nVuVƆys֬oVw1{sJx# 'Ln&/6olXԹ]Rk6y1-ICeRykKhuFi[+~uR75z KL:(xQlr?ykԆ^Fʯ+beЈƼE_KDxKWZ_wj}mE+ ֳ(b+Xu='}\7k=SsS9~=<|*]g[gc'Gz6}j+Xy3~*)"~@< x a9R߬UD\WĊgxn)E|{rzW1hPv% 9ΟaG_;G280Gwx7Ogߝ/l^yx"NTY?On[:||Pq.#Y@HrU[blbY#B5Eצ4یx'PEnX2C$r>b&_J+/<|bD>}žc@J/dO?4Rjjjt i]y v+ӛ/ x .o1cߕW^/%s'JioNܒV "n8a !P~C!PkLW:}  jGmE+A5)je PjIO/#ER~rAMM })WԵN #GKPox]t> r67!Iǵ="ݔ%\p"/#?ʳSo8s@vQi'h|_XB⃮1(ť(PUo]]-y^_GzN8쳵ywԻ[>-qNueiPJsQ/R|>sC437J+xٻ~f;j$S%_m|໌$춭> !=ASijFZ Z"֏ק.>dJ Ԃ%h GU@8 ihD`&H&ęWVV|oF[Ijz,ȸ̟'xBdv5}ppWZZO5jTԶb).&Q2X8ΐJ)(ĩ8ǐ7䵌;݂s/O3*'wrP1HW_}_iLHu"*]Il4-@'Ͷ풥O ~ƴC-OM]q+uPPOy"`X`xAx=y ofŠ? FrdۺacT2Vmx152B b-“b)rFjKeUQΙsDO.GuA/G/xxQWJySLO;݊KzIbAb1A~ҵX\>3":b{rZx5RnØk:O-Dl|V8- ;ebg-6Ƃ%P˳X{/j[2vs~"u'="u_ȸ+ !۬-LH!*F9-4-v]E6 SlNg533g:33y6+ϖҹWQG*bM5Uy>ӱhnCZ+$YC~_5,Mpw`9wÉA~ו}o80PQIƙq罓xc HO"$퇊r=wnKh@^6< @U']ʈ?A#dI@\Bl~3]R=COS8E)tjkUhWU}*Gtoe1]UalS,Ǵ)HW 6IIۖ?,<k.Y>7 , 99BW:xe*#r7@wQZTu҇߻?s7lrϨwANz:;Ű&G%5Ԃ|QC^q;z*.{Xn. TWz*n_eԪg]{1,o#Ϙ"RB @B醵@ږ/ì| D͇76"3@C ' VÌbzVĄ{["7D~ǑF (:m(6t+âIb(!wb#VOB d1 缎`KN6cE%aK jM9Z: +d(ր'Am &VR~ݱW AO3w! ioiIRpϼ>A8~]q;Jyn}b]$@?/Czj*r2(CS\FaQj9Y"$Ґnfג-x,V5, 5װyY0,-c4[Fܰ 3}~aݧ~e>`ZaH :<Bcc[}^jH \[8 ju?oc+J`y1wѽq~ DCs0oq(݀mUF@WXQ y)@(v8䙝c6RI 9l4|x0sY)R<Ɗpu~4B8h)ouBϓLCHI)1j+nz[-hV}gM]*7U~_`îeĈߏ2VclUpii`k=ȫY遥fe!б RmjVUY{/nP<[.y%>k<BȖA$BҒRϥ_4hGզ*Vȳه\;{,PѪ{h!!9 Y9!?!Z=XB]k|*b@q77@j#V.\llw<8NڝG,ʧbp!8w{PU>j7^aY`3͆Yp Nt:-45U/u\ JߌcAnCpרW~wuM}Я|ƨeu5(^]Jck_R?9uMVeh_&4{kH# r867T!й>^>{).`qa$gHIC,]Z_f` gl)J-?n^+Nk?[-(}хߏVײ Gzx-'ݖP?BHkB$#-- E[d)!>h?p@߰iݫ/~>&m"0oHYuIw|Aa3?3^ ⟌g1[SBXZ9`+pX Y@bݝrt( $%}o2ḃ!OP+_`>gs6n|]Ɩ ͊:o7"^kTg Az2#$ʅz :|Z SVV'~_UJ! $!شi wmG L,5jjjt=Q?MVVT(糛QgPPmxz{3.jx v 3qW[Q6=#ݨbC`G!ʼn:?6բǔeBi](bƍHMI&]E;b٭pkW/II{ڈUҝ:wnWo0DVp# ݵ`oXI7vy%~Z?]p~ï)kPTzԼ(w ![Lg9RwZ+HKo$ 5NzAaCݾ֕c-p )5_we"vrrC!- !|+paa!z۠6sd؃pclU p0 *t~1c R*jٖ|>]V{md+ p!R [Q:(ꖱ9^v={%,=PbTԽIopak&i4/Ki:L{))V1~]_.qPטX,Vb)HMM?CyKݨ:&rHӑe&vB$7$cջwHHh=N/Evv6*+2"_QQ^#GYoap8lSC4DJz6!2>Ozm`i-7 P?{p>G=_{# d˨6(VFN͉Q"E,U6%4͞X>N-צ" U0|SϜ̠$&#5&Ejvފ ~P>=rϕT~fQ grHcq9MBrBLYzLH &(cСPa=|/|~ag ~Z~U4dg/#++cGZri)bWiا1K/n"|h M#$u`?=~3~?~&Hq cpȵ/*FXz.#6˾ETetU"Ϧ|=@\msY;(no:֎0cBd:qyNp}7bs?ևU9^Tg{1?BBHIJ|d-YޚP0mi~1m7tZ333.{33#ۚgsl){N`*+={69&`_fxP]]"zĎ`>h89Pv8$$@%dKn ̤J)^}VXԎGrԓ= 67@fU7_BM_9gcNkX6.+llA"˽!JX.աz#B'_>}LdWh<[Zv2zfvfdg˹(- +sH3^h/b&?uu&]*TVܾ@eeU7Hߋ1A^Ծo  M#{"RB @B:b (k֠sz*kU(œ~*bΐ 6 JJdj_=p:pհYݐ]`CrC5U(r?0e)j]U;HivL̮^$jY p` aeOgk,6uGƑcymwD!R@B:"v8NnތrtowKIi֖VijPT-Do?Zڨ2Wj0;pH_o Jӱ1` 1X|׬6;Vҭ!1-e2<3c_q-5bY!օ !V.]讻Az::u2p4¶nX5d&^Z2D Fo+b!)*H B^22@!d;B:."IW/EDK,a$ҝ p.bڑrg%$B!B@B:8"SģoYY6l?8(c:2`]H;D>v|vnG_C^!B!@ D(1"QN{ώ<ʮ.*~tM!B! 절 !B!a_?B!B!B:0 !B!BP$B!B!1IB1!B!BHrB @B!B!B:0 !B!B 0Iv&B!BINhH!B!BH$!hH!B!B!B! @B!B!B:0L] !B!BZB!B!ҁ IZB!B!$'$B!B!C @W^y%3B!Big\tfi $! L B!BIP$ aeoqB!B! I !B!BH2B$< B!BIB(B!B!$)H !B!BHrB$.B!B!@ - !B!B $!B!B!$9H] !B!B $!hH!B!P$ aB!B!$HN@!B!B $!B!B!$9H.B!B!I ͺ!B!BP$풣O!Y%B!Bi 0f›t'v8D޽0f(u $BXOgޮD!@y덙E"y=<tRK!B!ҊP$ۅTS?\zpx0?pI'_/Y_|+WŮC㨿^7| EEEڭcL9`k Ĭ,מ8Ӱys.rN<;ifI硢My=z%BZ.u1 7mB=q90h."WN:z %%e<Ƭ7=iW:MUu5ϝwIo ǟwdž"t ? ֚;ΉB!)$HBW_a_6>~_z!,&w ^z( =$>&P]SGL/ԓO}^*gP[W/"Ҷয়P^^=F@[)ov6X/޻qbxDwp2mG?C7^ /7ĸӵxbO<~๩OaSLÇޑ97}N |B_]tыKKKݶ v`QvCpuj\di]A~{Ni8aq!ѫq^w1G Ͽˎ>gVé'4~z~ݺu-4vSO: iiQ˵@N9D'GBaڵ^v1>z~w[tέZ7c````Gv$U\E7/7:sSNs/Vwݩ_?~:tvާkWCX,ڰx,]3f`ŊF ˥;lӿ mW,WbGcYK!m#/ϨXm6=/{_]Ȳ\p4H%,2W8KY~}ι-fBP$۝w3}`␃]l, _yNyN}*jb=4Qwh?7k#ēO Gk?ˆv##B3EDDHJȇ 2'"!Bȶ]v˗#>? Ǎot+VjW ))=‹yGYY{EGk4@Sx 1|vX7h277ܟB4W?Կ6lH(Gok+ZZ8p/Rׅ_[nE!BZm1c]zE8h(1ē/ʾ:gqZo?r pNpyb!7_g=|t1GnG| : Bپ4W?8k3qޅy_x: S}L Ÿ|yq#;;gNGWAKωB!DA$i/D3K(ӶдCDJJ әǰ̰lkzFʳt'8؉mZ @q6>>232X !B!lwyݍ8裰{&u>5TUVsf!% HB5,_ ȼ#;d~CYYklg?(rY0a W^q%8zY~WaW'cQq{ι8!Bcƫ3!1r:T%}#䙧%KT&e1cjL1us␴<q=lp澒Ϋ #G3'|J[ho뼓Wy}߷#đ%?L(6/$O:  5jq#ϭܢ42|\Lc<8or]:#ŒW^JҥKԹ^m޷9t_ɛ'?e[nTj2nfka?MEK!yPUUjܧsf'7yr!O?n)7y@Ȏ¥n3>%(zݻ`@1'zt%'17J j0NSQ]]8 :|HOK,*.xŊ]{cohܿVkTZCXVԯs[5_kkkrJ<гgOtQV)G~nKC+ p[|^~105N2#!zzCr +6k\I]9orϿ8V^`m6;&{4ve N;ǸGճt`Q8rap8qO0ڥUw܅+.yyqqrO?c@Hae4CfF&yTTTD-G0b;w9O> O8!^fϞI&׏c-DiDr>s\}Z0tι*̸o¼pb[`ƌWkt#cy<ēz+ @8o$}'#8sޙI\>|23xy~ĸq }Fu".EA-w?F7?%%"o2-5ߜ9sT^ `%WDk^QY\uձgoU:t>?XA$T*-M2"i1_ʦu5z]"ש-DC[WL(j٧?BmM {ј~Ѹh]YCUmv;X8%'C э^|zY~'bU5G{#v*ۍdx)\ָᴆB޽dْV-c5駟%#F`СJ|"dn +/G]]mccq4uH5˥}l>P$XH"gy(Ɗ_"DuԍT3 Z im"g~ 9Gk. xZ3'_~EB=z_>8"H\Ǒ ۉfV$=CU%kda~h;S /{E,_xID"R|<4wҤsqQǞG80?+$ɲʊpK4Kڛ{n;R~d[Dob 'i5+Ur%++*JXgJ>d^K8#Aser*т.",nrM%r]{@#ˇ,?岭s^G^;.d? >oLkAw~#咁Xow,ۢ!OӖOn.:q 2\{PtN䵇ax𹏱+WpBl|qo KCRKNia o߾}µkƿZ5_0EE5[`8˖-ՍxQ&6ye{ԶQxa.\u"zZ*̖bEDsrm)//JnM'}m70ӭ[7F Yǿޑ26r,>?#^b6<3)H;xE9ZzoF^|c,|xp֤tiYf"ipގM$?o/q6}I}.[7L,uoVv&u7j޽zժq=3&\u~rGW{ㅗる/2jjkXT:/ ο2n/$W\w\p ;cJO>ν]z{ҨSk' pcQBRv!-Cu)5Kyᇷx_ke}֫xG%M}im)vC3OGmҝW$?d~$}_eZJ2̴C;bH=&)hI^l$_cH:|pΟ(asIz[oG+rJkǽBԹ2!pK='C-U>92t\vzT\gW9|-SM뢶ELZ$R>Xu5-Kcwޙ/2^{u.ws/f,"Kd,ϒo{fkq=wjj17fEz {_q=>_9s7h\kJǡcNg_|`biO!++ />"\Q>RR2><Ug r#SNs/+}F]'}OszjشO<yq)z`Ue%P$B04ek)vy dgpcAƔuR!8 [" }2ұp]"^̝;?>L,w>cS;-|"h 0 9ncM[6awj mVZAfwnwGIɦ+s4k N:xc/Q{I{bʓiб W"'%B!}m}~塇]wS?(ZtRu=ay}\݅W8u˨/HDEVA~hĒ.ҺKđ)=;p,]DmS; J+zDg73I-'iӦ45m}TtK0+Xf%c|1-k!ylZ5|$y1=}|] /"a语?s@ت|WEKCla Dm"b(9DlztPi2qm7^n+]^P5bqUF`W,F ל/=fDÆ?7>9K9 q!q(UAʚ5ЯNHKK a֡Axǐ."ϥsiMѽ{4;,*qz);XmiRfc|a_udH?6KNy())т o캛$UK02ToJJ*Rt-/C /@uLxփƌ3_Ǘ_}-: )-lt5C"e:v}$byeW6}]奤T fxȍ]UID,msrrWhƛnƫrhE6.ۦ )bI&be.]dge%em{ HFh_g~h?+2 E(ѢL+T"$[K.#D!2n6\ QE؆WTsAPdS0ZdZ>JϋeV׿-9\e λ/S{n{eKSK.H%P)OSP<QG{ᆪ$_x!RAZc "Ekcl;M_~/NݙG^H:d_Ys]lZ+S͕4L+*{"v]̲?r^ʼf:1*?"JysˢK@apUW 'Wxj+D!N,LJnA̝&BFj8TQ /N y`"RRzſlM7!'r0ĊxРAبYj%lXй2۫cߥ`А8XhQx}Zj*6 6oެ=КJkuZ`j {99ZT\ihɶ y۱t2tꔧ>$X/`OCNŠ+8{ExKP{+#朞=Gd yz^{@}&b1:0EկN>x=x-P ]ʕLG/Tҹ3nZ-Fs39b0-?s^ ։hٳGwUWa.[Q̏b9h+zw2h. \z9D/;)M"Pȹnԩ8Q\Ǖ}%,r93z"_rNwy'L&[3"zr`(Κy0!w &."m=iښN,b(<$oJ$w7޹qNK/{^/cם7bAz3uK/0M~~Aqe;aaaV~b!{Gm`%ӌ[ X>5fCċR떯^#S ^w[ Gy~̳¥\Ew [5VA g5)xB۵(BWK8XL{]c\(%hr" B\_p#eSx)*qz޼72_+S͕#W&kkM\'ĵ 6ȼXy,1# n:nsE$Dŗ\t7Nf[l:['M--eA};aYgtnq%zGBx,Qs&wscO4H{FVv*^{u\y?.v?f&-[o's/.)Kr=$$xg s^ughәǰ̰lkzFʳtg'lmze&zUY(AJXhHv8̳8o[ >Ï8"u8pݵ[XiJ<kW, R1i7C],%`$C/ 1fLEHMKb`qi%R(ũ -,c=!ؽ[9"33?6GMIzntc%ۯo-WfGyvm>!MA/H܈kۢrt vK}םwIH u~v~1{j+Z݉jto Wd7gG'46O}2Bؾ)*ڀ/ݰx#\ϫYHv$!$!w;B}v¥ӣG{㫟Kb&TTסSV} wil/İỷZz217iiB`^n혆%Bvl(mX(n7l( !Ӊ i;cyq1fDow=Aܴq͌Diϵ=-klD#{ "DaemjEzF:32RB8O)_~AuXO ${7#3 ?;s>I&hHV 9\vuwMTMM -{lQ7**2 QA=Yf2UA]i~/p 6|?x&\n{wQRb=$ Ri]nHVl?S6^b+HHx+^+KKKRtTt?p݇@T5jԈNMn<$ D' 7H XtvDnzd&::Λo})J(&6F4 @EEEH8oQDDS:r*'Sљbdv^ ky 7>B`'=ł8p @ } @#gj1j1j1j1j1j1j1j1j1j1j1j1j1j1j1j@$TI$%^ @ @r*QZZ%{J@^?s g\ AH@PNMҙL&*)1RfM,yx:ǿ"%4k.%? c ~f~TB0/@ͷ߹ ysZ|~|܄2m7_ReuN6ḥWtMi* 22h[9O):--ݯbZa(|CX,tt. t:7ϧr?@1Q1ϙ }B#oayVW.m޲7kvvmC{>@ Ora>-=S;K7n_|LgifP= ,88O{>^|;B*l CFhqyoN=UU˖/ e u-X"_ er>ޙ1^|U*))mժ%hy=̴oimdYӦt)44TCZ-?CeSw^ʵ\ta&(ooWe+VÇRfME|\ڻotA{rSth礋 Y)}W 6[Ө"3g.?xP*.":xefeS]Hȿأa&ڶm?3ڷo+ŗ'-[Rt߮];;Dg҉KP=[mۈf-^]?}e/Z7nFx1A7 HsiPNo9]:KzEns7з-_|"#"P>@th UF*?"7 w-[99T\TLݺt `%-oٺUL<-oBBhShȠKfu3OOP _-XHWhƴ7`0Тh~OիmY*˧ʅ^.%Jߞ&!ߝ:|q:y2E뢐ֺU+X{:um.EϿ=Gokț\oNiJ~W7}ƁD!m#o|3229oāh9-x9# y - ӧ.{t7ÍwyCӶ[_Np+֩cGӹ:{)ݹ,\L>=kP>%-. WݺݺumrCꫮV5D+WDvA+{mۺ ԨaaɅ,ot֭@Cnz߯ߵF>l=8Z},ѯNw>R4{au^!8Ɓ7okur߾s&M(%->ÿۣu}MԔNW-޷hޜRRRl룧@ZqXƀqSre^-dj4儊)'(5x}|5Wyca OOOuP>@2h U[;\@ohVqs vQnͷKg+С A!;_N BZl7,aHm_'{k>!!!I@Ld6F T]*`υӟn#ǎQ֭x{l/С=৕s9"2B}+/PXhO.X􍓒JYԡ]r/7*2Rpsss˕ޞ+"#"I M5x=x@*C+in4tAهk{3"[-'__n*@IrROpwܑz=2_yY/7?O.ճ'}1o(3N7 +WHW$$No9CU>p]ݧedf85, vp~f6cG_}1P (^l.,4ٖ‚\єo/0Q@@:r<: \d{^%{I^D*,uJO?%TgoC\O?uJ Btd0P.,$m[^C@9- T*^O1CWHڷz;c5%-v%T|&$y ('^ .`Fщ͔7QQar NQLl yMXXEDDcPN @\87 nX4 @r CG?=r@#j1j1j1j1j1j1j1j1j1j1j1j1j1j1j1j1j1j1j1j1j1j1j1j@$@&IvAAHH @j#T/Ñ `wJK  $ @5e2HmZc (p>07oJ'jܜ/7˥͚HfLf3IF#OJGRllKTCNΥp#A%L!::z=΁ @5d6[(jdG'Gҁߦu{UE%pr;&"uǺMNi;+lY27bK%RLBo]]NXM;Uj}}x?&4HP ɓ4oBڵkۮI4K.6*W5?+I:e˖DSMo޻qf}La:۶mxUY ![f۹`r'%%шG͘>a\O#F,dbs֭VZy]ie{ro9>u'G۶nImN_oߚ5k>6۬طo=pob8/:ԩD~rܸsyO벝AYz>^ʼw櫅fj4X}yOW#ogΏ?=:ue/z5[Os򪂏7cY}ǢzL["[j @4i/7w.:=r-~i V7)K.GstlRj٪Xn9DsI\Oӧ` .,-[7ŗg <G1mpYhe4JN믿>.11QrpĿc.um9-)#leb斯y\c瞷_پ_Wm54|ew*8~W4[:y4ڳ=g޼K"?Z;sDoL=9c []weu֭NiX8'׌o< ^oS8>pX|iu^ԫW/Ӻrk]nIi79|R~by}|),;v\@e޽{+VFon_zE>bࠏz|5̜Ӎrx^;Uͯu;ns.z`O|F -;oM|h知Z ew7sE?,[F&b/&a,׊ygҳgOPnj9gk+/,nyp{_:&N nvn'3޾m|&Sn]ֈmp<a!n.\ os>5uwbw[q[-\n"Hײ\=q_8wa(Ǽdx:^/N'uOo⦹W7cY=[0dVgi^Æ˯l?x[yoC^Z)qy&4啗\l6SiiÃ@rrΙ.6DvʢIxfoJmOgJc),LFԸOEyQ"Hh65Jcz M| JL'>sd}C11ӷ}_t8>3=C.ԴT?a7ml_&wEv&|CMߵ݀So^fNj{uwCe|Oy,ZKn{JjzZk0D&c (~Z۶brZla\[|^]iz6$<$zѱ۷W4T]]Y q^yV~#o/C-*Sn;֕t,9C3g̤崫)<'W^1LGǎ=7ͤ |\?bslAdcѣ|ż)%%L n҈Nm6暫sGuJ~^ղ8|tL9IIN\?_yzD9(ﻼ|y_cz z湗ͩQttFQ|_nMe}5رzJUغQ=fe9V+edd7;ζx. -XHH9f:l& j/g_]kkp-̵V֮Y+FR//W3;պqZ[hqI<0ArͦO8I\P-^OCԉs&S%ӳL ._G̻qF^Uu'o7|SiѴEl}"``*Iܠ:֭]&A.MJ|Xqxi}o9PM֒/f]4]|;_r%Xԑ\6WՔ+W5~]W'",䂦tnM+.ٟ~&as/yY^{ tIlcǎћ3߲^O)=EFE߹u% \f;Z{||E5Z/M"≯ S $ *5x\Gr7\ÅoO a H8w}7͑̓2NMοm4q8_(WZkW4\r|9g:Rq~Z-y Um̟W\y=O8{._5s8a+Ў'ONcЩsgq|pEpS9=Xy<=7S`x\.j޾Fo4r>xG&M/_37m2tus]w-#S> 0`p\ECY+O+n'Vl9"byy7x=edqO<(_/MG=7yz,u^uoաB4pkZOM:STD3ҾHZ]iD ~1 ).@QQ[G/Bw jBᦲ/j-2Ki&tg2xb=9).|տﵤ קNSEs[FrD^3ϿHF6te 8&=,q0/@㾺 r6 ٣ٛQ֜ٷo?ӀMq'[@u7<<쌈5Vzј^~-W_9 3ɴb bsPS.tםwؗ˵5~/\l}"4O\sHfNWL\x-Ոu%dv-mqW@Si~xy`\3oڽ/ez`/C,w5ټg-[+mޱc#oܩpHU*Pؚ p?+skhҤyos܇jPJ@5ؙ֭[ko{v٪RN#9k|9/S>8 xǜrl";DJo֋K<z|o~p-vÓqJo}ٵr?p^GP4 ?x?]Zjެr;G#TW}.WtnD}zO [.o8*,29!EPWS9t *m_I C(:2Dksu7MtpzbtxS೐`2zS^x5}ppP5~XzGѽmH |O&>߲;z]ص55DAybzFr?ԻJɹVCn:Wi蚇ӘQhJr ͕G.zLјm),./ȵMsII<: ܮd{^%{I^DP _ʹOgTN:|&[,[p OC#nYantQTzgqi@qaDIqyg(5BuuHNt_1TgԦ vòHȑw:&>|fڴ3vΤ{:H4K.BpG@55jb-}~O.QQM! NGmo2($$>!B_ضoq @5)6:rrhCvhVy^Wx+^ך2=KIK;w! >@$`FщZhQQa)NG11LuvaaaAP;rA㋸`tł;4h @ u=2#j1j1j1j1j1j1j1j1j1j1j1j1j1j1j@$hDMvDM5I@@B4AfB4AfB4AfB4AfB4AfB4AfB4AfB4AfB4AfB4AfB4AfB4Af! j/j1j15RII 55jDٔOt Zt)կ_@B ֿӧ޽RRR(''6oތ 5l{ڵkEm@NGǏ6mPQQ@Q~jܸhD"׮];ڶmeeeQ֭)2* 59z(9sZlI,_Ѻu ڷoOM~%IEUV.Bٳ'yq?yyyԺukHpjeѢEtIQoΜ9ԱcGQ㏛2DW&I|`lժуJKKȑ /@;w-[9 8k, E@ Tiiiiƍ"##)$$D|dffQzFh{ KX64ԉ$33}]1 @6)\Kkqpnd*5htQ˕PHH0P@:]?d!cq Щ42'QhX%K S߾}m6wK;DԩS&am|r0הTjGV=}_VQ Vu]OA᫜]\?qIEBB;n㦹G{P~~EFSF(::Bh4RpP0_xx8JKX~O٧i}tAj԰t뭷ߒ˪?y7P&L@SLoQÎ5v>oȻ8A+͛77L:m/?oԦm ر%' )!.FǑT2dD:)EI ir2k߆ڶoIQ~y~zM |я]s5{9x_i* 5w n:O?D_=QTTxC=$6o<v# Ο?Fkny|s|,?u~8kqXSm!o!j 4N>M׬'Q SԴI3@h 1pM0ɡyu쥨'O_Qj۾-mLŴeV8I_r1 د3yd>}RZZJ3fzুs?;C?xz:?DiĈGӬ]ݻ+o6nXa7{0y *`SGԎΦ5ә3Ծ}`lL2Z+gY,k&PL:nF~ZGf*w#qӦԱc;1]D;uz"O]txR _;q|3ݠA1{nƬpW=Oߨ{A-Zٳg;|7Tn]1iӦiN+ޏ}GMT34r˲e{/<ԩS~b^bƊfoLK7>X~s4s-|nϝ;ڶm+nhӦM)x[xyݢkS{zx?m:יkqIO<|=/%z /@͛7xG._'~}?qa>S_~mx 9xrMYzqVZsYSeOw8o&-?]Y2m{՜i&|#o.R8`RpׯO?TqӜ}ybY@C+xz~ɓ'}XBnZdZ|8Ggmt]<͇|Ly1"ܠUYSeOwn볿˂)+rv8,W| $jTaϨ=Y6 `Hyxy' 塙<ЅBC/A ixTdvG_z+qWx?kCII4vXi5҉'e+WJ%ݿGɔrr57tZ~=C,)[~ΐr~/Ο'^8_YWR6,yb")E{vH~>G[˥ٟ~* :T/~[nEۥ#G͛7{&UjѢ3p5N5j$͜9S .w 缼<),,~ϿsVצMI.0?7\R&M4muޖNYyݷz?'q۷לo|ϾSyˋZCIc8 }|n+)**ry=۶m+sffܮ];4Rpp$`JybYy+99YwZ>Oy9,ђn~iΝ;k5?Utۗs볿˂ަ;棊.-X_òqkYꐯ1`ޝ^ޞ^_5hhbB-d1ձbjn5Kcuԩ:UpPo;Cxܮ$ꃃtȈh!"N7Ƨ~rןϿ)--۷uH͚6#/fhk U5J$wrHf ׮#;>"U,&WP2vBpȤPW.mՍ#,ˡCUV/|\#sNr}r3#Y\=ϸkpgPm^]oq[[n.?:TMNߴ/um_8֭[iĉINNǵ^&5?M4I}%И1cYw]L!|5^ܜzϵr!Sk]=쳢&|jrokOu}fWS>sO&ep6-F1T>5?{˧ޖ9NG/&I\qoȞ9q^ohDM>OY|i#4&)o>cz'EpmA"vO_ϋeɻ=z;?Ųχk9\>78o*=m7ﲠ=m灊.-X_òqW $ \Xi6-%)ߒ_`.))3w{lN@WUTJd"Ph U K-nݻP ]w-fb1٬ʃ$'>M$H>YX,FxO+u[S9NB#WBScӞ="}ܝ|=?% ]@W+6ӃݖX ZO?]Sn볿˂ަ;qEoWYse)[x_EUkZ۲e ĈdԶmQyd7M-|'>Ep ū:N5u7oFqubSCCB)Q.pc'e7r99589c_a(c[oUys ܯgs?q!=iVjj(?^SV8&|ͫyʋZn}qk*+3ځ< r7n\hG5\Cq- Z\# .kF}≧秲]_$Ӈk)_ǎ?Mlz)))bc" E1OW8og=XeAo{f_Ӹ2{u| A^>siƍҬ9sZ%JY{wKәsf))#K2ӥSiRzFNH<gϒҧOf)ΰ)3i ;0ui/J!K="*ɓ>Hz[n)׶j̘1Rzy/X 7o$؊;w,/-)ﺨsWraFUn]^_ 5}pa:t[SNbbb<4޶roۨ~mL2Ẽ%ߔ9 }:o… -[J!Gſyq%[UK;vOLs5^8aݺuRND7ڬYܮ\}r> xgZ/׃_?Zu|<}cߗ_~)4o߾ʕ+C^{:xȻoEiʵ|Y׽6nsze>6ڇ[e|++b:yn_r=pw}wY@EnGʲU1`@ytӠAb58N}zMoL&_nkϨ~D~U}ʿYtz['-/hOQaN72enj9cOMw-7x {UԶNi'TG/ k,q< 6 Ppa"Qp}v@ D@eN֭+((,MRxX8>[FQK kXOy'rONGY9EMnBwJp9^S|}*?ĭ/͗^z 3 P?NQTl4c#ƒ>0D3\#k$!@:&6-=OWZJA9dInA1Ѣ0SRZB!at‡'D_Ti?L5 |E4E?~"(c:u*]`k|~uf:vf0g^ژMg(k`2_i<]ޙ3T_@yzy\>v B3o?, =vvE[nfL{W p,܇6yz_r}ykl!X.ߛMJ;r=Faaabֿn @M&P锧rs_zuQͩLF)O ۃ!cTh2iJKMLfk{`{~Gp%&PPLb^@-P/?\)1):u$jQӓ~:듀N/ڼ~.А`؂O >__tBM'&EfPҵV5-?!W}c@eA*]dd$Zk4ꉚw."wl.Pf-(}3)p|o r>\Nlڔ"x}($7VAv#]fl'@M T P~^ag2)'/[Н}krkXL [;5%L>"(\bII4x9ӲrksW|<*rvi4Qʇ T͛SFf5'KKḾ9vɿ? J@kCo@%s~oZQQkPt "~p-V@*׊ lPPPQvN>tzf3&u=Y(3H׼9bcXTLǏDE;v,v:Gm/v\;^x>};~?.jRye)į۷o 6֭Kqqq4d>*->CjٲwÆ 4w\j۶}=?YRRB?Xg~ڴi8OtZ:RXqt,jq Ĕt $A@q#o?믔N}xo[~gڿ?co4M%5 6V>FڗOu#DEѷ-[w!MADiYz09u}̏9~8%VuzzNiw9|ߩS'tR#o"/2:x`mTi֬C|? Z'W󂖴6_[~zLtTM79]r%"A(c5\#5ʳ+M&Mtv.>^mׇߝC9{ҥ4|ꫯfe5J䙑#G`&i`Lјm),./ȵMsII[k7(u`ZlzoFB @z,2'SD-.M lAN{_QOgGilQ[?a!z[MA{@LfQ KGv} 7!čcEPndosQQi]?))))SuYl֭F*>MGEI`fzzN~k|MfeoE-nRM< ?߬*i%ʛwe=>)qA_z"W" |F_cJ=~n{cJ-@L/"7eNJBeIooSq}5y޽{!s g3P%Ç(<,ry ti{_H"ɿ"mꎤz4[H'/Gw@ kؐ%%fXO춭[&ʟ աCy:ʱ-B~1J:uJkYWo߫+7ܴ\izƃ~ʒftE7?-] 7asҭIyij(qͱ~[WuMG-׾n/y1<wm0@\y(z2?_W暂ݟOo,[zigE\#|k޶C9ŋ)L.p_^6wq U;>N%raa{ 8{S?zNl"]t} 7A7{߁i7*ܑ=ԁ#Fc=&j0vX1N+~Ǟ={qo^߯y}\m'7Z85-\]?aM {=(ܹO޶s \x"6fQgС! zC@;m*kyr 7r3{IμtƸo֬t+ozR}kZ/9>~\ Ao.o+yy,K^vL⦸'N,Ń|hJ}"#= OyV5׼m;|9g~>"_zx(xHMy5! jܑvFV5nLԞῖكo"`4Q۵g7e.O %7Kf JM)~`׉A-۶?,"BCyGUI& PB Wp]al~|m(+ "ؐUPTT6 41w7-Ss[=9<ϕ\9q\M0#5LG)}|YF}, &(\{JYi BHͅ!v @R`̉l9z萤$ .ٟ~ZGR2*-+K:6l(Z~bIĤKRnE7pwi%dgKQqpIIlݼI9{f?b L/WB_J1|v !BHTAG#pխ__YbwOlthOeR9͛Kոhr`Ӧ-P"ݻG|'7oq_IBB..uW˘1// G- -[.Hѣ)Bdjժ̘1B!8 /BMQL9"O>4nL6k& =uHvm={rWQNI)v nee1drTzf||圔7s=|'}]8gB!B؁+I+t6#X% rrt}:~ٲu4l@Zl%͛gJzipRbԊQO:Rw>ٹk8pH  |{vܓ'=a>X4 B!B! ^{EEEj nUfϞ- [ :w+\IiPJBB$&Bq E")*.%oςYq˥~֯MȽޫ>*~&޿B!B!J0*;(O8VuI)-[&֮:HF %))QJWT\,EE-H.&Fbݡ7>0u)r߽{w Ǻu몕~X&B!B!h @Ri+tS\P7.k:w,wKK{?##C4i*u%11ZY + rs*`FÆ*:uHNNZg!  ~ !B! PH*]+pkVRSSJ=(RرcraٵsZp=JDw/A*KFT4 (D#B!BHA t5] EqX\ӦMG=Yn{X} `VBxC

CJJtMƌ#D"`Rlx(2M!p<&hZ-e7/XB|A xe/'9+ԑ{~綔;6ZgHME]HQIlٗ-K4Hbb" +ٵk\tE_[o%S}VڝxoJJJd2k,iҤ2'+ mݺU9_"O?4 B!B*IDi"鞙 9$XMKj&i$6&ۯ+6VZ7N6uod\i0Q( K[֧O1cFcXef'O"yGYf*`ǼL}{ҤIjV+xiذzƄ JϞ= mʴi*\7~xiڴl2x`u]z믗GڒY~$ _*^xA.rS=zR5*lu+qذaq+moY{ꫯ*'$$Hffz~nn%KTկ__] 僀o^j׮-g}̝;W@*J׻woYbg{cX8)STCݻeݺusXK/Iv$##CNϷ.ϵ^6mH O'Aǎe?myoyR:٪-?~qܪUƴVλ̪gNtҖډgXN_`F;]'{;}U=pZv] /4+NVNۗY}_BT~=,.&)DNI%]Z՗XᏘQc1ҸnmH%qX9z@..o}UNE_ou3<#/bNc< Aɂzj7n4,ZH~'+Wg|W~T;& ,PW(,YlkӦM~z7}ݧVرC p}Y[21*}v ]m΍x`޼yR^@l]w]moذArrr~6m4sm4ngo۶߼ysmҤI{ xmV=dgg|ۑY~gԳ+>WHY~U'$$8Ƹݫ :T1bt-Z[J{rlq޽[yXqqڏul`X@dj,Zjy;uꤹ's}DOkٲtzUڵSY;յ8v }~Y1chڔ)S 7ܠ͞=Vlwc@Q' >~[jm߾V?N]b=fU^vUw_(QNvާv4ڹLNvzHmwNӪ/tzWuھy_݆U10DZsw1ǜs{1Ws~t( d RuI:r˨{.&rC ֶWs2֠5(]ܝA6$jŦ&ƥ&&s%&s%'58 \=U8%ȔG$#jۂ?)_hTz)>]&I0.eH6!I}g)?l /V9DܓKe*7ng㯜KE|=|aꗿ/uH._\z)r@7s\3,}X͎\uUr뭷*S5+2}t[wW:wUyRB+P(;}Y+;;qՃpg0}ݱep`뎝MϬHɠ3K ee,+:[WZ\\ U#A/ jۚa[_DF%RB`9Y$Iq1RZI̺(֖NHAqqYi&E%RRZz.u(Gܷ.IuokRNyJSHYŋ_Lfu`2 "ԩS}(|(M0n{?tzĉ#j'LaLGKKKm 9I7W]g/T0? x O`p "WWLsK 'NFsL d3^ ء ;ƪiVqX 9IU[ ?yH8#k<̻AvL[n-3gT_y>d"P9S^{MmGuϘv];nٛvd3dhNާv,}끓>.vY_\[9-4+@h~fu! @BGNIzKJNJ:T4O*3$wSsYj%[$bĨ/;VI^0+8ƯQ!3dy*3zH9s  ĭ0a<7|Z_O?%ҋh`B.]a>'i-eҾk[ .O|p(40_~g|׉cn' C_kȑ#ϸN2{%/EK8U{U6lp=ܣÄ>*p}=*^L"0*ʼnc=v@ $d/~*gv+X=LV}j l:y߇5Ӳ1KS }h5{BHDC;hTv2j ݣm\kG?Fws?m8-\W[zμڟ_Rsڧ?mf.ڬmwW@3fh۷ >\kԨ 1_ /PKJJRL&O)_n 6ƍ7{Oرz{eeeUnر*U ggΜ9*̓,N?,}N֭[[nEkܸ _ ާ/1'|Ĩ4kLׯK3>oѢEZ޽m{݂ =z(^K/U~{ҥKMm瘝g{bGVq?^KOOoLFy~Qbb֭[7O>q._ϵ@{駕$ &C-Y[]5OM'U?/]u߬/U/4+@i5U10 } VtN=.k.j$E%V+QJKV|\vQke+1JuPsHt9}C)*9̂wU>ԭJsת$0.+BO>xS_dUQ55եD8 $v 0Xj'IzI`BKJg dcQʿDĄ8\⊉{K6M9X}ߵ|ԩSՇ%@P&8h`?[0AD`y±!IE@"[Wgkz5܂qHfTٙ犕xKKU>ocҨ~IkecҵU]iR?_V+i毮&ARWu_fkd"!B'4«&:LINZjmrR$)RPk}^SMoBK2yKU:XB!B";O$ɲG%V0/11V8>%9Eң]C[H)TB!B!$*D<tC+S_Q_)DRVzZ헖E:R75Q#.%^֙$B!BHTB x~5ՊӧPNOJr<@:Hӧ%FdǁQs;4 !B!PH?)ٹIwvL+ӥRrJNKaqb5_'QJDӊe(@B!B!D-T#w]U^M\.q+--ӧ?|DRT+j1u٢Z!..N` ws9sHǎWF"ߤj!B!$QC-$Y*欑|7b%N}DScݿd2T_T8 #FȶmdժUriʔB!Bs>Fh_ "n|r47I23YF$'H^A>~JNmnu9+Hhd{nۥK B!B$QEiq xyZ&^.#͗[gI_=g}-? lҰaKJiʕj?T+VP:wޑΝ;Krrwy?{WPWRy‡Oz-9%--Mv*o:x%55U{߯ UZ޽M=dg\7ސ֭[K||OL1sLիԯ__ZlҨSVVҁ4שSGu&:׾}{]ܹse̘1ҢE %޽{z}dY@&ڴi;.dӧ'3p@o*@.]*~A_}M6r=(X ur-?o-gyFHNNJ/~_xϳ>kY_}ծB!B T‹Qt̍)|q^!ADӒ\ bSSSbRRSbS빒t ;?# W^Rh1ID~[u`V+ .oX_5\#^{Zոqc+??_<(v̚5K}+j׮]ҬY3UJqqqk:X9aٸqkNN8! 4PP;>xb +gu[N)cNZV_^ō`ӦMdgiҤ߼99۱cYFBrAwܩV!MP`b姮(ԟEWӦMPRRR*|ê:_u< uNPk <̀`Me}܉L!BHMɠ3K ee,+:[WZ\\ 11j!rW(PW+ |J+ITqr7ҲCq%vZK@IOܝ4h\- [:`* Ǐ?VAqSNR8+ +\0 e˖E 0yBo߾\ehժLn ʿprPNFU}^x(_R2`V^z%u /Tf]`4낑#G,P·\!B!$ڡDP;Ioɮ3Mdgʔ/w$X9]&%//O)+V ]oQGK˨Qo:TPt@YCLCa(`'w}juV<{P;T>﮼J 5dÇ￯}x9T3sGVfX6o<0a/T@d ƏJwq]&99YuvF4MzK>lIKK]ʛo9sK=e˖_ek7ސ֭[{cݻw:utx^Hܹse̘1ҢE ޽{ˊ+l,vd/ONӪ i?ڵkdwxؕ>*Vi+`Qح׸ژ4ec5k6x`=f-##C2eڿٳgjCNen/+@PU{|״Mj/GgڵZ-BVZi۷o=N*_6ۉ*;`Ύ;cN=9?:2u u:rB|e=P:$ @*^'h;vԊ!C~.))I)H}leZIIIPi5[l6h ~Z?^IShGFQ T}*Ş67|SKNN\wyi;CQeTJڵk{%&&!x5qqq꘱9Qzˡ@:ut1;`uZVuW6{n8̬[P+[Nfc8E0ΘOz|C]7Vq^4ec8qRa[ng}Kɓ'CNvB UXG(ʞz)G*? }{iC j< f}S@ hLH573ŋw90۷oD& ::uʳ3⏉ YZ9s&N|X=4;~n1@N77tzD u`[ZZz?I?raΝ;=0g]g;9\ <)L(T01|N~qo گMp6}0m0}/P!uLݪ'\ʧUtZ5v礝YˇUڲC_7jՒ+B>S5Nؕ] GŬ=Fki~`>LU?ѮCf}]E! @BP MHH2d&=:s突:DCc'|ʡ-6w#pa8‘fC1PO9 b7v b` |љtŃi5{jPOc:pNyQ$={#rk%N+5N~νvqZ/&{3]]}0mis %v^ɾqm%@nUG.YXӪ^:-`lsάscw{NN * RTee`~WBH2HMf̘Lnt0FÇk5RF l |L<9u0U9jYYYsǏ- $V3!sOtÜ9sԵ07) i\饗*34t3LUi=zPˆqʇ{̎Ν[!|f<~sP6#^\wѪ.#H{'X`;^;M`k0vO RÆ 5MzoCġiLҟ~i rG+@:b{*Vi+`Qح׸nر*5lذ Y[˗/W.8߯WXa:Ю?BU.fx|Q,ۥ] ^w̢E޽{WG Re`vg3TSH"j̸=(c JXrUވ!A״$WBBԔĸԄԔzz>{%^Z`VH~~!$m(ZeJ'#G>}Dmc!M Y_x(,?/87dYܼܲ)B)P` W+ JPT-eee2m4m!!l˄XumBBT1gҪU+1c9BB2!5αBH*fu 6ȶL`!N!B!B!$B!B!( @B!B!B* uB!B!* !aC*F}qVU=yΜ9ұcGB?B!T$$PI}MSMfĈm6Yj ,cB!B|LB &ݻw.]P@!B6p !a@_:Hyi֬ 1K/$ڵ ;%??sL"m۶eݺu7oKÆ ^zrѣG+(ŗ yyܹ$''y'?%KH>}~*oL~7u:{z-i߾Ԯ][>l;w3FZhһwoYb>M=6--Mv*o:n7fy2cңG_ndڴi*~fffʰa$7753gΔ^z)lRfRJLLTrܲ<߿_9\cGvA<ݻwWL![u٪~*@جN:_uu<:gUBQڻzkODnfi&B!$R0>q%رc_իW˸qL6 .y)e^II550ϟ?_:$ {soOv%;vPJg}YYYl2Yrlڴoz}PC믿w9w-? o>|XyCYv\}ʔeҥKo\+P`PN:vɟ諯RkӦs=JiaFNN ~_xc]*J˗/WrŻ+C $]frnRy<`nfuٛRo֭_+W鴌afܿ~?S Nۭ_VNu"['r3K3!B!JL +&H5) (scʃ*o\oWHPxMKr%$ԊMMMMKMHMIMNJLJNjpӹ7PJ id@(:xV|J>\޽{qjԩSҨQ3Vv'XٳsN\Y~'=S4A`;r C_tO>X(eߪU+*V>+~JVNKeȍB!  M)"ciV&vLQiine(򗿄,B'P:av iz$O𑌃%諗oȑg\hy$V\9 PA[_uPOOW]uUeuFy"s(elUPW^yEN<)'NTSgUB%nڕm(fc=B!T'$$L`r|%T,=z]x*O?7Ç+e 7 u֕?Ϧ Co`Vk?(Kk0GZpw㫠ɥ^ZcI8L ?U߅,PcXʼnkōIW\yJU9_u˔lc=d@@yYBv̚⤌ʹѣG/bU̢!*Wo[ B!RH.<$"B!$2@b$B!B!$B!B!( !B_B!B$B!B!$B!B!( @B!B!B* !B!Bb$B!B!$B!B!( @B!B!B* !B!Bb$B!B!$B!B!( @B!B!B* !B!Bb$B!B!$B!B!( @B!B!B* !B!Bb$B!B!$B!B!( @B*ŋKΝ%.. $UHuŚ G"Mf5YU PHH%Oرc5r Wդ5T e\oo9}}w8e@!TTR 5kmZC5Qפ eU'ruzc [:)cʉBRILL 'V7o !B*$$ڣO>2cƌ v-͛7'OJQQ<#ҬY3cz=i$iժǛQߞ2emVRRR/uyҳgOuL64o'?}Rvmѣ;(Nz6n蹧L^z%i׮dddȝw)eUFOؼy ꤿn;YVn[uvnVV2&2tk'Vu 5jiF4h XΪL~O@z>VC!TBB_́__+;yy+L氏.&eAے%KTXz7Q-Z$?غoˡCdrzvm*ǎ 4Y_~)_}9rD*W]u̞=[ .w}_}UYp̛7O , ˪|OUZw%;vPg}'OVyNOOUVeڵΏ1B~X) {vxUyAl2Ujٶm|,]Tn aÆ) ҀSNP@_YI1k{L C;Yr m-emVxSeV׃i}jP4rws~SYYY@ܴiߺJvch'ժ\ݬ dMe2N/,:eٷoE('V9 XJNv7+OBzj nb %tO}IrdwHutwh!ZCwHRR/ILJM"i[ܑڣ#i.x^K̸G,yzM>]moذArrr~6m4`s{Rm4ngo۶QZG:jժo޼6i$=6vҼgϞ iJWN4ճ(k-[/2LV!;;[[VZf+ܹS# qcZurQwޭ<ܓuXzܹ:qFQߥK ^[p?`~h(}yene6S{W۩VW׃iz+((89v뒝ӻ qa_]vZcX#m^E'r*C3xPAWVu]v*ӄ}bu-ί]L+'3C$1wsy1s}57@r@fA \TS/1b"XD!PH`+?cǎZQQ6d5p%%%)ms2()) *c˖- կ__k߾[|'K0'z0N~yfrK,խ[ד68u܍A+&?uگ]_%B X)(#x4sUgPfq4˗U۬%*]vhC0uѪ*Coe;=vڍ;V;nZL&v "]Us(QNյ[6~t00PH`R $d̶d}X E=г3⏉ YZ9s&NX=4;~n1AN77tz4r>,~o#_dff_!rOA]02SAAAXh%P2n*n|9mա>Z.jfe.;픡w3PVN_h'ժ+w24I8 e+Vu}dUؽw+'3B * `?'pj߄Ϲ!C(O{UᡇRt=\5Sc }oY֯_8ްaeH=ܣ|mani#oO8c~( ; pgΖsp YAu Oo0m,_Nfuh/VW+횕Smu"ؾݪD;I{cݪ d2tj'VumEG?~\5T8)kcUv(duYy?up$Mi\&3fP*ÜaZFTX.Be&'OʴU,F{=e}ZVVtI1Y<[nlÜ9sԵ0lѢJU矯'Zfʹ)SxΡ=Z nX_ wU|/hsG]^_hֻw*iXP0rOi[Æ qƙ*n|Y^ZGtjbalVfN꒯Ӫ =vXUP VInj7bm@UګݶDvڡ?xPAW;0駕;>T&NZlu]5jTw~HChL]LrEUcuFkP Fl >EӒ\ bSSSbRRSbS빒t xxk_QUb:rHӧ!ƾU&AYf\wušC]D2M Y_x(,?/87dYܼܲ)B/ opW+ J PT-eee2m4ٹs <!$deeBL(0[8Dl4($r !$PHH_&Z3f8Fa#L(e˖rE)?{\s=:$r !$PHHCB!#"%/, znڧ\֯_/:t8C~ةS'9>Kcެw~IYf 8Re/FǸRPHHWZ>s+۲eT_~E?.̘1ɧ&(\>}P޽[jB\x s[#vڶްaRv>C~ۯ_?rݻRJn]-7VJy#8q| QFI6mJUj@ںcVyw4/'P'c@sҏG(iN;}w]8dNu~˸B !MzzRvmRRRPuɒ%*^ZƍƕpBč 8&ϗC9w7}'v;v 4|?3ĵ T[/TJ#G(EϞ=[ f#f3Y,ZH~'ep_ݬܼj&M12di>픿kƌUĩgM&#NO䮻R+ΰr2b1].R6l<}ʕ+eӦM@jALt_ZZm,i۾'P%%%V(S09۷`uԑ:KN---p1ie~Ӿ߳0yӟV>Pn]|+\hFX-o߾ۺ1 dliB-'6dd'OvdRƍp"31;O1cCCwh;%ľ+6غ=<͌+5gK~Ǵz6mhg_ڶmZ=tIs<ֲeK[i1ۻwg?''GU8L8C͵I&iA{Ϟ=g`bY^w۶m g&z$X\\gzzoZ_6 v^vgSk,~_,_Q y͜93VZAAg.vFCsG 5ѳgOmj{Æ J&z{uei̇]Ivk O|\pF^5DUݻ6bĈ N*Nƪ=yZmb<+>+YD(iN;}Y]ETNmSNU0 `+fyf0W1?;_8);R 3c:Pdr-2sLK $|m TK.+:Wc^Gm,Zr>l/#:{mƗald/3IѾ?/fr F!/>dhj,om8mU`՗=n֞}':ϩ,(4"6nVv[]ƍȁ @B* L1d=òw^3 Nxic҇A?|a/Trru8ofsKeɥ|S8,/v{!d E/ȳ`_8Fb NpH-<S>퍙#$ |گȎp(f͚&NN> = nz">|;!(7 >?W^km}_|A[/ďqC'FоCLn~/gpX=( (ZP>FcںU`n Gd֞}2rSYTQiDÅ* Vmܬ\I8ƍ iL. `V1|pe*mI [DGbb2ɔC,ϙ3G`+Ix8̩Fܓ*-++v%rq"ؕ/|\x*[2‡~u]^06'rssCjfg~1[85ee7w ǝS<駟V&&Ly[ʃYmړwwdi@I UڸY2 vWYF3DN)W$$XC5(c AWy#6&]Ӓ\ bSSSbRRSbS빒t 8!2 ,j4ٌV֬YSLsʑ#GJ>}j\{Š&P+̒Zr&T+5_tOj/`5~;y'+=EnBH$dGKsN-+-..B),,t_ [eZfVhT"E,q!`g43\b{РAsYYY5daEuUSVVܹwUw ~u!BH@ !bB˖-4ʹkdєea ֵjJf̘aGޝ@Qd# `ȆQv!!,.|r ȦHWxxr< OԘEK^r$˛[=Iu>㵪nOo6^36j MLMLML9f-> 41 41 41 H|\pAl&ٳ}\z饱N;ń u{]{^'tRL>=+i?=V|lsN,/9n4iRy䑱f͚u_{f_&'ѵ^կbq!?OE$z໮.RW+WGjRwwG {jwoPJط-m+}LE[z‹y# 4 8:::/[,fui?8|#<3gT0BV?zai@dڴiC;N=RWkOf̘<@#ZҼU{C's=7#hn@؀|1lp*'xbXUG0 M=SI:cr=d]w=?o޼Xti67`vh H" HZ# kr)Oin~c;.8;wnlq衇 ̙=~z\ve*E@Y6jz@@@@@@@@@@@@@@@@@@@@kS4@%* 4hq< @> i 4DO@R(T@ i$!@|CIHC'  4D@|=IHC$!@|241=r%~[<#zxgU 7n\lV[ٻƫ_hoBMC4;#xb}9s;1~xĠ֬Y+W{7/^Wꪘ1oޡ1k,Ƚe˖/^,_<:xӛ--g:)J*A;6M-Q.n.Ϙze˖ﱡK`!;s6ST{2͉w7k^!?^&7sýz ȍ4^.mHH;d W9Rza^)/GO:>W6\jպ^rG6ln?}~`йJIZ/qa H1S~{zӥk36$z=^-БV`m`` wǶnK^ԛ,-RVMCcSC]@zjrJ֛m޼yLզ _vaC|[{}C#8"4w_$ Mdg̘sLݞq)8M i~܌ni oȂ47` :0)5o|#[m9I^3sýz$/% 459ޜRoO۶et;6*Gk8qB˘'Nجe1c[Ǐ}韾y\5HK?yI|%R(HSV4|5}'[99R`-v(#j㎺K]]+kV^UK3Ɉ4qπط-m+}LE[zV2uj|ͱ}4?ݜ9squQ FVH=O&rCʼ̋|1k֬lߡyʴin?߆%`ӂ/?x"@ WfKL25no|Ð禰f6$or3gA!r裏 Nx+T?p/erE)SEI&^TO?t\y1I1ydȥ]v|`^\r%1wܘ1cJE#ď~wt-wyb^[^ޅAQiŋǒ%KbI'e3@ \u]+ E]^xaᄆ;GKKy)˱tҸ馛bbY_55 {iU}_]w]lv!SNǘ1cTUV˳>O/@Ha³Ί+Vğo9盳!S?6 :Y9&8 zK9ׁrr{-bxME wFFjb?vW͞Y-Y~mr_^P 9^Ú2֔2QFGk똨Tƶ=u[FڤwBM6k;nb1㣭e|mBkaY5ΎUݽl5kz;PR+zz{_JO_)RM)(s"D-4Rzhk+n) =m3%ZDPji-GIs[tu<[ZӹY(Jmm_(# .^9MHo[俥ZJ˨R^].֮݅Jۘh)z!J)¿RGgGJ,\,j(pe 6a`m80kX;LXL7hkKJPbG<* R XhmQZZ #$[7-V/zԕ¿ԖςB'?po%FcrJ\j ^WHʸBut艶JW[kt ` oZ\d~SϿJ=Y𷶍_o- b8p6z㹅BJ܂!AֽR:;+S=zT.T*- #P(Wݥroj9 jv*5-`0B<7_ʽ7[H{SJ%Z-02 r)-ѻbߢ_mitX0sS [U#.&6lkkK]-> | R9j{ 5$ů&Bms7B_Z$D#mmǝR_/|!`9 *W g/`sVBf==ՅB 5s#ljWP ؄8r?5j 16`pRV:9&lޛ@0@ >o~x⯼?pp9>A&i E̻]4y\~k"ôLKP( v vZKh3-KCH;{ ۤ,XvZ`Sтh`\ }N qjmj}zґ: `g4RF[$ KQgW*8>7MZ' <%h)#tLZbC /UgsxVOLT _CւM}hrvx~aVUXoƠT%itMXbwI6fQD 2譄=@r;c(@DGg!T#X,cMA<-9J FհULW aZc?H~e1! c#Bod5؎?gR)%8lǹ] fB$8 {`m*V.Ywdx 6}8F3 9ŕXBXQ,GZ  \TBN\54cz ?28,ә_ Ĭq&Ն?3a8'H6nM"L`)dP^kXAl-j83XRp妉C񐊥(Y{3e|t~ of&djhM)=1GdOXnCCVLBAa^%kmUtp/Z,ږz5 XLc0&%+J@^c /G "Uoqn4t\@}PCTI%#<8'ƋU0@%uW-]^M`Rga߽^@$NJF*!ˆ3D YcB!E"M܍|EΡw+űĐqIv^wywSlg{.nc>yoq=9h_xnGQvC5ϊ7<i^M@bhyHFtM! FV ]CX Q4Qj1 I۶ 6 X5Z&IdT-[ Nшpx PZH~iXo2y. >IKP߶xX98Lsߟ]93@,͞{J\&Ɇ:?x E3u[D&0lăFrC!<uk zbDJ z.@P%3Ǥs$Ij89En[(M$A $¨br xe_M7)~,sD3Dc)|"rD݄|(cxfTFo"b, Enyˋ$E vO®Hm|Ӿ#B‰#|GAI2 0'6\ob^u9<qB0q3X(]kG7/ĥ2L;spGS<0:ҁsU%EbXZaZ"5s9Vq.~ͧA@HZ%C!D`ۋMe[>@vkNN4!N8-1Z$ZgbUzђ&pK5Msv^  Un{-^ﭢ7~YGƪ`[>OW8۲Rv @H deBhǔBȜ'.̀I,vUTN8hv+oE60'* ~@)\rCv,y8;Q;MdWI<vP6H{>CU;*L[UdAu#!!X=ןH-{?p|;s\eٰXE|?B턨1] N `%2Rb l }f>U_{}*eGNtmlˍ C>@}WVP4LrOcce8J//8XcLS"~P1؇\TG2ˤnN0s(4>@k.( )5_fDQAl jm9S 0K| o"R%C^Z=%ћ#_sZW}1O7fh]cMrU:9@Vz !%Zu֮jGFfܦLF=+6{ÔKE"߼6L,LI6R$0DpeҴX.\5fрx}uKF&z [nej[.VQ,W-fiR21.$)^wl&7-="O@8U_xHܯeŽ¿a$,E\ H7xŞX.?3B 1ϯDr kBujȷAURe>Lk:r\&?. !BHpO,R}tY]]s%ItpIOEt2kk~ V~wk&S'~_#?:h|YMhtRn?1|}Q@mDG$DYk/!Fp86z> BX4+%8 T.RQ/D}$,,W hܸBp\i| | xiO^;l K!U6DmJ@7G[AYy7@񖂯/#(= HJ0|q,,ahpV5;6Q}L#]"Hc_it 7ZuvP5gĚ/"pCf`!ffA̦V.a~aaHr3xRBD_I/4lD)VAGI{(:cM!a!AQ@0T4FQ TR nw[Oa9SXA؋SliЗˢZ (qmf;0tu%PF[рʕ:VhRmR\#QkO0oS0ܦLn.a,pg$o[p?I4p*_l#Ra]!$J"Q bZG:BX?!"VAFs?D7ŋHY]̕ !.dZfm.ꔳbu:F,Xِի-\9#q xPKT{XnX^%XEډCWwo<%5_+!zes%sj"1HD,s8{s 7wi-Hq[7~זcP^[ŋueT[^ZǎUp{EVxkCCCg@>_h7Ca"-!Ν|TER*F,@}okq ݋)kkoעXu#b wP$E\',F BQ;DUn}n6CU*^ zF{PuXM&,` %FA3\^)!}dEcm emƗՅQZbpp0oQ=kD/˄Gp/s֪v Uc Fw[vO؁ њ1_m"%N!")7PnEIMaxi['Di1|ukq;D>@v2‰x_ VjZgqȶFg?Yc9a6 LO0>@䇸 /e kk(W2zwU-b5=H쥑&M"nsAmM)^^\Ifo쨀w\˸v}H'( xK毲2s`S71G1b mD8qD2cb/4u`ݼ-2~+_AOo/JY@(`$?l"5;"x-|os, 7Evf@N(s?KkʘnuqF0pS)ɟZ-Fd6Zd>0;)#@̷mDcI tq4/*ۯ U=Elm!p5zam[rR٪cnt'!E;ͪ#f PJ`C'68]t)}/\r\XѤO荹imnr2e=Ja?KN}'5_j-o8^m+21%SۤV1](S <[ut@&:Zr W ʻN w: b)]/4ꜭ[ s6"0UH[M2T5j$!c|CCā%儌]^OI^XV&xݚlE`C^-VHa0sӹRoߵH_:Sr7+TdH<̶2$8J"w_IZd%&F^*#E*(iz"iFAMd8Yq{~&> O5ת$̓r.N ŢrxwN7Cq3Csa*jLe׀5p6/3PrŬ|IvA:\(ץPDۨFFGQίHftk )N#=9>_."pPlj"pQ豣SXE[ ¥& S1I݃I} q oxBDxhFhma e2jV u$bIIMw8-{h8447h IJECVk:fq4jZ'З4Z[cJsR'?SSl-2˄!pyjt ܾ;Cc8:9q;36֦b7nbZ"L?i+.`Q!/%KW qիH*o@2AVG$A2{٧;zKIWnLTT:VqL)i4$YVo"UջJCbRp%G/6^Ǒ4SjbD.qy|Mz/H +ulDi\C2IS6^Zq b@qsvpg{EVǸR!@[hHkLka^HyݤHZ-? oB Cn 3[/lN]T,u"ZVuVﶽ]8nּ0qhlLd- Pݒ[bxW* Hmga||{\{&jbtZH >}N]騆|^w;aG RP׹́[ϻx@s;^mg7 Bܷ+& v܉x|C-P%cxAm/=u րc7 ⇥&^nf']*bz޹$TPwF} Dڰ7UV\wFs\'%DRT;^FͅHH1ql޻;5^Μ;/5|2'w6WdzdŒ{o@TT')MG4cmصtz-jr@S$=Ud3YZDmIU%" ,8%%HqzhQ%(-L 9^/mc D rl*/0reY"^z%]9v7٢߬7[fejx$ Q΂ֆStm0X N!~Mww_8a x Wo"pm&޹uG86* ̬qj42k9yaeosv[bJPniZ ГKzw_z+&Lm|2L!<x cXY֠FX/|5J~cO:Ga vV@. ^"ރt7 $mdF p/_ kB.LEH"I` .\*#Ï>D)+'4ݨh* Ei d,zHCcH{$cjIKYefsѦpҿm5{Dɒv$-8^@]wA pB`IK}p%HMn({kcxx'$-tO9J*Vh}[xPcD$=P؏l]/$V}=]v-ǹ@dsERwYEbےZxAﳺ:2m:I$Vx!}3 JQ-=ײ*jpl宅1﷼<x.BҰR*>;5=NNFrűTL)|G[b_z 1G/}yvw3q<#LIm)k U0kk]E-@#N׿m~Q8{4Ų|*ۇ>UQwoWXjcm~wo^SwZ\\:w]ӬW@쪽w]rE;xWDpYWm(KH3juAbCYo„بz zDBjtѰ8e^$vXd :@e)}>-JLvɋ@~{muZ(T<*#s\X^ܐ␂3Nh8od5v&BCS?{mZ/7-oě4mHRRm /Ѷ0y1 Uv<"P tx޹G{32=E46 HzP,艳j%P 8,Sc^"p>ǬV_?W.F WGk-B!"D2js|`Cx;&b\4Lr=H.°AɔFEC晢y7%c$BJuhDЊh#OҵO(9zqDu4 ;{.g#8s(.\*\;խӏ04:'9~ mt s&%puf9#5O Gx'r8?npSgI qqԸ8u; E4f,D,t|CJZ|1lO?G"o唐! N ɦ Th4+8c•]NRO8c&s;zpfK9Bz 'ֻ̦ER@.7 L  ]DUD0ga<ܳ`{PhN&)ds2/o2kpF[ΝW8M%}惽 vo67b ss8l ʊzwLocbr+ MnJ@fS /ZD@(O>^~e aP`6RUtvSmTL ֱjY/pU8MG5d=3E&:NQ=1\xY_wAKv =zW.^B$"Pǩ ._A&}\m "8|߇:E}\"lKGG=hбh\¹bh\~?˹xx}y`r~ ?B'-/#H{rlD'yowl9׀FOOÇy6 Z'h1ؿ[=sf:ɉsm9ndܽ~k^{5(cw>@\Y3<#EZ3~o%%Ȯ\ʕ$xlJ^yOA2޺>L,.= %PuzsRu;2NOod oW0F@.F۶__oR( #d;6r5H"544rӹ1K+K(* =sB륚8dijC )C=VV(3s9Fݡ:Tq4Ĺl`xl%$f7i^RJk3*0n>\6#p7ak:LoftƆ} QJR"_ỉLj8ej_#B24h6h:b"۷VQp'N:tC6u; sԛX Ce)Y3.br>+7nXl"lV\ڶd2%]칙Nj yZDeqswfr+f3z`!"ʥtLD|llOt$OH%(RzĤi8ol"uwf(7UcĥuϋE2BtxIzoumRT5qaW.^I0rё`+˭}:x-IDIs==4<<*|ML|x:>rΘ:S54sNm޹ qN;r84m.p> X'uT ,-q/w]r~z2P3p{J =5$A԰p WfgaTqJFn&GRVԕ8qI2`Dx?&}eܷAvH'ǰ2;@`ٌ$2=n;'jw侶u]c$gZ~>" ~n-PU˰lc{頻S>gnφug6bd;T4Z;˺t>mvj47c[v)l_NaNⴼZXkP=>{%uU|;I\1-["$&q,$fz(ʛdW:[3'B*,fV)MS7MimJDB ~~ ="ҥ P1##vma7@.G57J5QIh4с\| z8@2qx:~ յUqе'Dm<za\|mqq\x@vHdO|D<\/"D*x4TɈ%n-e0;#1#i-"^ 1D:Œ 4qJwZE,Aޢs!!HZ;%w8E֔m^$BR`bUR86>2`8*ln4221^4둬cv'bQ_Q+:x+P: "AEP!i 玅ؐH n/1;7/2I?.. x=Dy qċ?SO|~N[۵r &6\$đuQ8Ú&Uu-|n7}qfFFqɿ)׹\a M*lLF0e[hH5$ h S{sM7'mZ7iuk0Z țI 5CwA37s}#i}='Be'XQu$#qq ߸r^ɶ0+%\Gn#&DI=7n`N<Ν׿rD땚4nH Mǥׁ`&%EDiDХJ {J6:4͕,z~eB"G*׋33õToC'0:|X'^![(ۋVqg#/Q|EZ.]O{5jtUn 8M *F'px`oA?t<,>ܳbLw7q5JQN%8oJ:CN$|~%c'qV3総kxv/+%=w.({MkHRk֥˱C"E;M;)6,Uo"e126$]>@v( M$V륺xN>Au^j?v$fq ,.̉U!h8cjDFb(U+84uuHH^\t jpjcG6$`8m7 ц[m\M}Ccq…+0:~[ԽI }Ԉ E%^kSȐ*y aO_?֫U8&%H\.#Ɉ]k%i`qmeH_'<OEC"p*A8{@1A4(2*G̋++4'<(ILKL&ofab0!ӤáqpwP8HXG qH୒z5+6'@_( )LK=Lt^uYRO8%IXZU(5I_ʯ ⮂:b yEW_׈ziܸv sR/D,C.7?LR&&79(׍lჇv~;>Nbg' f;~k.t>OgSKϳYw.*s m֋+.kh'&* 27qI/wq%/};+5cO$N@ݢY0W=b(9?樷⩕fW2qNQn}|wY,d|<\qﰵW@qo cm*Di8p@yn2'IܺSMdK|+s=&<%#z=i%W|+HgyMK_HbJ:Xx:!I2 ЃAz`jj!۟q:L*E4ے9Yq>@`/]ukyVXNR"=uqs[:T8nvo0fZ.kw-w x8Bm^jt;qBF a]\1]G:i{aͺi6#@/C\Łۚ=طQRXι\|U5- oyf߁f,@m=4uiiy_ 'э%+r׼!4HmVR~j7l!gd".&,W_y^ǼG DA'a{Q5h3MtRL>^ ^RLv8|-t$M2˜H`, ,6>H8vrl;/v) { Ag6v8c;H!A W-0;c @>'QC3; [h~ y_ bBIENDB`DisplayCAL-3.1.0.0/screenshots/DisplayCAL-screenshot-Mac.png0000644000076500000000000047115712647526537023376 0ustar devwheel00000000000000PNG  IHDR |tEXtSoftwareAdobe ImageReadyqe<rIDATxŝ_ͻڠ$$!9ll;t cL0&g0" +(KHe͓뫪YASuuuOT0 B!B! LLB!B!B. !B!BP$B!B!dCB!B! @B!B!B0 !B!BP$B!B!dCB!B! @B!B!B0 !B!BP$B!B!dCB!B! @B!B!B0 !B!BP$B!B!dCB!B! @B!B!B0 !B!BP$B!B!dCB!B! @B!B!B0 !B!BP$B!B!dCB!B! @B!B!B0 !B!BP$B!B!dCB!B! @B!B!B0 !B!BP$B!B!dCB!B! @B!B!B0 !B!Bxy ȱax2n o!B!i7Cy1 @B?!B!y,B~@BΕB!B AB  $!B! 1AB 9z!B! 1AB 9N!B9\kq c Nl0B!2p"(b !} @Bgg{4A!B!==87@B K!B!c"9(rP$o;TߑB!rlqB !@BS(B!B8ɆEB !EBWB!CH`F}P$H(rh:m&B! 1J6DAy  ) Ng՗B!B#GC̿a.x  !8B!rGzeD勩B E@Br@l#XpP0$B!d`g(- C(R|cx|_\!B!dpkD)z7B&E@B2Hȡuaoq[%B!2(Fu̡}F)FԣHH )Myж#B!rl/ױ=YK "" ! !w~5^B}B!xz(Lb` ݟ4[%?6B-`eވX4z7nrjؾ} xnGYY)`F!4v4+Ed7`l#*e(/+ 8Hh5O`ȩUM<e틪BVLu#+g%HkW #5Pߏ\y啘:uJD<˲+su RvekoDQ~2oF0U.S [yO2V~Od @rB @2>*Y/׾dɁR˗qcFx:}-e(/@p>eAN;/|831|p-+.GUei@gE򗿂`0*+m۶#>~38s1nؔ8Æ GS"޳9!Bȱ?}@1sD=ZH @Brg[//׼KP#Cs C[Y˄dQ{G<%SujOWw9eY1-=1Ŀ-qK!UV̒e/>YAOwh&Y{C"Ǝ̔^|z'=J@y()iŧW[XL⦛ ?/~A_|9n&qAOkpСŷx}"G$T"~~'-Z}f\ssϛ/qϽ}_\|EJG͕܌s/͛;>9-2}?pc̙Z۳g>xZ|7mfJY6g}^ {+W_3<6l@MMa’BȀe ľ) A @2;_N!'Km0F̰aqUٞKYWŦµ* س 0\*?5c<}%X\g -?!I @"NY0}:?W_jNYw~ηaW[8Ʀ͛,?7-ùF{)h3BlI@R]%Nma @2;|Z"%DO}\r}r, 3O]EHS[wމr?7Q CMM>3~vGhGG{ _pĉ2.2TUU⥗_?~yۤږ񒘦ӫXV[ng>) u{Q9BȠL_>TVAΎ2[VoX6C[~" '#*>oؑwuFWBjؔe=7+8Ft㍬-X*ilOK![(ywQ k6aiv%%x>|+/|kKqӍ7aP]:S^[[E#FODSOi?%c1϶*++o׮C 1r(mݧڤ6tK*%$uW_]}7~ӟG(_wuYBȠwx("`Q#TjfzrN8/ju-Y3;G*T~u@])=c]ٕ:ۯb%Xn% vBt"t&IOΡp^NJ^f|˗/]%oq׈+.\:u??0sɥW6}.]ZYZ]w)A/P~oVjOxg˯B%6qWDCB6&Bw7v ՆCO1 @2;:S"'ρa-lZL?fT_\4@uD+/.k3uYC}'UVᱶ:ۯ(?%hk8G!oa8J,[nӿ2j܂~X'P 7֥(+^;.Rkaii:~#aanR30~xwk+_kUh|Q1}t]+onCII C8k׭)S\oa8YBȠ 8yL>BN`Ȁ N!b4rtl::$ C }ITܭ'_2,zOG"2fy/Wl* F=ё7챾!Fwu߀>e],eTYZ~BHHK/s%}bZCCCͧ*ǩsw݅%KhKOSNYM4 ?яn-7nGnE?/۬ʜ}hiinIFwxq[~_idduI'ikdүWĿęg i e  r+$K0![ ᠜˺S̿lT|e\g`>/gjXmwcFÚ~5wex[ހorXrU"6\%#@l7Vem˰*630TY?+!2<%SeHPzJ0TS,_^xNe֓YPZNߧw[nĉE+)N2^OGթS27! :f89+.p ۲-[ζ H]  9fB3s͜#e oS$v饗gN yAnݺgp_L\B!3N`!"`>/ؗO̵-> X.d aBy q%ulBz7j2f<2Ba+ HX'\ۊu0Xdu$/4G:|⟉%+!BNP;uq-7B9R6clB^!Y3_L,@d@\ȲIG"Br!r 9.+4;022HH%:P_^+-['B! &e.lc5f%$`ץ{1ݐ !aD6',[r4Zr62˥r>kbxKe7&L 5{M[X>yܰvTֽl՚hxmP#A0x`d%e=AX˝'mm*\Mi6@\nLX [0T;mKW`l!}!B!{l>>[TO1 X>B `tzVH̿B:|"Qc!MX l9 eWNjXk4Zܾlh-AӔPU\W~rL-aHx &DJ2ti]pD@]Z"*j`J1tW"'LWI:B!BX,])`q[ȱk! PuTٶ_$odmya–ULy/D&T2vwu[YdW%P3l+9w"1{ߛezPFYeH,'Wx_8V{Pm] *vt>= >!B!Gx X0.Yn$ dC &z!?zN2>D:)r]NArQV]Dr/'kbT$P7jdfꂛZyl Ãn}ZSXZ3=Oϕr ـ?#aşS!ni |#Bdyh}&a@2H2Fwl]'[4SN 5Sʔ8ZN쾤K.)O(0tvg"cD@vmn>{ D1CN>/J*7 'S_ZG0Am- ˯7Pdq#&Bclc+\Q+^~l!YCȀ Oo;lWa_OΩS|=ԟ DwC`XЋ#&)=@øFyy;\a`_ h;Xmj/bxP[Y!"&]N Zt7Z6xZ#@LYY:֟埥} v@{$5W+M1B!?ȳOy~A @2F*ۓQ9 o1ZqT @8amExB_aB 6/{p>e 7G(@(]|Ÿru?~~6oyB!mVXl|} bB=ɱy$G˳&B88 𗙮JM~(󅴕سDwOD{<^(GLe NK9˃r!!7xlv[Zqۯk;~¢3ïcvE@>B!]]~\}xrD1 @B<$?]ueZ[kD!@1A816 "1X~hz\U0,3_`qt_DxP7 ^?±S?BqtM/!XmZK(rŸNl'=~;ؾo+z?$B!`K&ẽ/~d  z@o)&GfǕK4]˥)%Nx9-o8nrCIDR*#!@Tï2 79G2ï{7؋#b%\7_-McT_0SdE$B!G{exL˾b-odB &s9_*}9W"'iu~ti PwdOa=Nҏ#kТ~FT$?'UGK[Hƒrی2L`N ,`#!4lI8ں/n9I$?O TEW؃,B!䨌rLcbeG  )q G | 7@ OlF,@0~h+0LwWvTk/*^b𠲦cʑLЫ ۱gբ-mHEF'\?v}͓E2ɇ`݋YcN>tZ&Xkʗ" !BHxC~Pg{ţGHP$@(Wg|qwv\qFWjMO_4ZqS LeasC^;=+_jP ,p:5S$--mh#p}U?u?[/.PECǢ{/Ehӫ%ea~597|7]u@5'~kCB!< IDْ|vOـ P$_[yJV!X`y%`h DeY%|@,_!%SJ߷{7Œ'0V;uprD@ B!@nl/sF22HF/+z1^TT=vN!W,[3ˁIyeQ-־R4"&r̭f7j 8؆֦vtKO W]X٢3<>cbgn45XKu6oj+6bݮh2QZY gON Ȗqmola|$5ʷ"h(փ͸PSgXߒJ[Hf{hm.G~׮[S.\:Chnſy|5_|FXi#+EٻNƪυB t ]uB!?Yf  9>B$`dlO*ryn$} i=fdU,m6 A=v*r[X-M>DA}m &vSn:ҠoK(M{[`E yr!,gr?֍>*}mkLjkP[^4Gl~T mIt_H+7̓` z*r,ȦkTm0OX V4̃t!JJOer~v~:Dk׉D0m.gċ[(Nm%H(\sѫ'nLN*l\zʪ0rZVq׌A xZ]]j|#B9cD@Q67{jɀ !;N'2,㦊M}Pf0ǖn?UKt[;c6ՇR,ւhie/S (_K\<8m5#'TL?ef5,Kaµ)M-mNԖzcmPsOHq:̙:gL9aZ|o *;i inmUX;E}֠ VZrEr!񴭹 _^xjZsqcj|]+N"ΞXbSU阊if\p Qԣ(r]^g] ۛa !\ Rt@B!qV>Y= GH(sR\[nIh^\Oۮ?l脿0<‚n~%%k!dX-kqTdߴiE[vr3eu (cv8*\Z@Y=]ӔVSK_xS؄r9zq kayJ+;ZHԛ1%r`}p:qR|9]Ex]X]nh&?Bx}]ڨq}qZ^3jHDLp3x9_mQޚhۀy㽵/W@ !B{4f%~gK—@2Hjr$:lud]^["4Dꙶ8ALb\ l  xP9@Ep[7dሩJqnCch+tϩ˻I>_2-GJsT-t[ CnI7aXڄxE2?(uc$Fe‹kC+Z`{DpJ8 [w?k,zqsۤ%v~Vy5*B{^׵cknBĦT1zJ]ݏB!zY=' 8(ؙ(BWHC`tgxec:?J0 q1 5,$?&m!0 ZLNn -%WC;ЂruY:ïVn?۹&C->2Ms-Ȳ2Cg}d̟ݤ^5o uZR.>g<-߈?,څ D#!TbP\~yx{#[;[#vJ>u1قe=2 F6PZUM붼7vT!{\qyn~O,ވMQx>0g.s<7wcKf|8~(ǩ3&X#lz䓂X];ZkCWc\XWgp62B!rkz#P@dA?:rF[i.y&x\+şX)t{fTB(_Ue\N{*`6"sHo"*y̡S%1t P LI?7-g)/5ý{;lҥ6ۧƂUxu1mBrR$k=5wTPa۷nKD-52}C3bQKo;:K!ȕgxz}J+r_  nݮAYMwe+o`]M%)êmĒPeFW"!|;:Ufێ=x{o u9{۬1gcαps,] ͙_rK@xA N's9C*f6H7ܮ"`ҽWͼI> c-LGȩ( B4]qVp\mDjZuI?wˀiWAXA9<ʺM7_6c4jLu˭Y\E`'^:<5OUs8%Rus`Sqsm^trܥ'“,TeZ~L[ŗېxOc^hNXak\?@̵UJLw?#B!rTU=KtgKAw_B !=/\];6o$mއ]kW6k-]@t7SrTamX c~ lI>e Ǎ6QT\%պaqUK;1+%MJ8LsD緳X*Hik6+^a_ۂA;O/;~( P1f!a%Pt,:a$-3}mY.֎ &WwܘMG> j,p?{ c9݂7#XQZ% x5uwJ?z8ΜX7iaL%AktʓF%;mxuڅX=^@5bfշoE{kߏDyBC8qZ"p3FwBB!6 @2:YέvPۯ-%kHĿJ`Hmw:y@r=1V:)Lxw{bɚMm%i&5 ĕw Ze dD\U"` \7\5 gW93&iWߧW쀯rXzToǕgJڳgBP^q3ukŕM_-?TOͭxw'-n*m5ڣY]Sm8Tn* Sc%<)jTJO !BH}<6V-U=$ R\W_Kd>s !B(`̔m|%;1pxrC 7z&lp?'[RK&Ps P]5tԑdqCo U!e#Ժϫ,8IFu_{,j-*m1O&\ @i劘k5]cƹkŸc (]\|5lúߙ.f4wDO;ܶ{po#X>$63J hxܟ/‚5[gpʘ |u՛wi1/?%s=ziK}ĊݨnɮYj厰ĩe=셕ڹ0 {@,3˶jph}[Jݺ\*_؃5oInL9~TDiKicQEXS.+4N-؀XP7/y{svh1yAG!r,\W/݂ qHH(CMg/]0ϢĢ@$Fee~Z'sUd @[]KB&E?=wͤ6pbuˢeNS yJC%ݵzPYZccOlC"fx:j՟KZN ҩgr:J=@WۘԳn{oç,~jT iD a$M8_abF]E[+7to~nVr?zV q*]+R,\͙ cFoX:{Ulܲ^|+v*}a fLqz sRxn#lōC&ț#?ofj*m{Qw[RtΔ:<>y5, <ҙ)EU @ @B!1fw(uB !w*Ŗߡ)n*!FSp@ pR&yʀ!uN~M]-G;dj9rFSVr*U5\ ,b WY~mģFi]_Wڮ*v[Y gY%^ϼ["U`ʂ5XjєdxazaI ӇkZ+gn񣇥ݰUnc}=f=ROv3v%+cE&u%x4{w-k9JiK.\N#.᜵S rڀ(uB".,Ъ4Ȅ@H!y\D qL1 CC!PʦJ b cfג hdt maG:oI1,|(_0ciq/ʾ%QxJa* Aے#xV<5^KJTeXW:V|PV5?PRȄ;ުJ+幃x+/-tK^7X0YoOnV:azz9Y~սEBS{.mB3_ .nY`[]sz=~.(r#B9jEz Jn2v== ؖkB北żd/䘅䧐~V!uCqbJS5)]_gܿ0KI8+u# oeBNWWqٯ)]&o2i:ӥd|UbO7 V*q  Pa(NMɔu*|xC]s*I"ldipEu/,YD!Qׯu-h8K+z'z̲-gyQ$B<{9 Сw\ԝl2 -2̮*+:ً^Sf{nXhmbBҽOV/)/dXk5_+ntBC1(2HKnE C}p'i9xuΛ{";xt6x+bZw] !BxUo> dCӉsEv'%)vEz.r/B!La9B yJ9#1V:ÉP_|(%*w끈%U4PeMY%'31Hq*[ـYl!B9FXU9D(r:vF;숀TAZvfZ7B Vh:_b4?w.YFzu]+mxZK:? w!B!ldd`> !wP}[^52ƒbON"Ҕ3 XQ`_@D. 1/.HsstdQeQW3:õ`0~B!B8RHHHP$ΥD1d(L!͛loP.(Igu'q93!j:\V.:ɋ'g*ZUMhQN b&Ým0.Cq|>,j'{]ͪ!3zxUh{s3Y 3'9Hbbzw0qqum݋-~KL -AU< ^ϩ#$؇BȠk#@(һ7i3${,$DZ^S@L3s{Ǎ[DۯQ[ :n1U ,!JXZH:ϝaiܸ l2 L8y ._)SpxK [a7`i"TVϘ};-"}"cG358~lxw"4އ=Dxh[8nRoX>7K\@b)x<&[K~ ZBxx}P,и*y.&M$rLz3GHP$uV skJUf|NvP9BS_uMNDR;{d ~Ilm$ ig{jW<[QLŏo1qb˃EGBV\'#9oMo]$h8$G%̹# IO?""ᴬ/hGD\K8mI{{6f{7O{^&\ݻgXC>a>NjaX*k,xLۛ$T6]7 Om~5>ُ_ΓK oAy*\ W>qۗOeM!d(K(r:l_rكfw,:BڭMJ3 7p\E"_lJs2ѹV\mBSs7lƇ~iN#6OƃSq_E`TInkw|Tbzm4}>-D&Q6 ,̭jAf+Kp!~9˸c}D^@ n3_|҇?O*kmq}(7ŭǗؤ65;~e7n*d4k܊a56'bjđ^VgweĭJ/߇[8s5dS=c:^_Ys+}Ξ6Pacj|jV;o9iS~,(pSbkዿX;q/lct~3Ӿ0NsXd'>64?o?*smD^H;}"? /ԺLT(1pc^FxZ.BH!G>̌S_O9 .p j#jv5:]4_1v^buiIŴ]LGEe۽5P˸;O?68y}J̪hW8V:g}ݺǟ:ۂ8݊g F}/IewԎ,x+ԥ}5'F?s M7,_݁_~q\1q*:弝<O} t1^9T_C gwu#p-i | ܏*2 J,\cqt,U֖a}O-J\cWʽOƯpۥu۬2Llߦݗތ䫦8#_~tي/g;Fs >eYzy\Wo>6:o[ O#L^t9vlGv>)'W=Օ,? 㲀ݳb>gz_Y/g&`K|Gv 5(y{u% y{̐ ?".~x[=ͨ?g;8;gfdYl0`1BK$r!BB:)ӎKH) $@(@۸wIej̼{ofvgW+Yr|?7wX8FyT퓓0Ir3Yx'v}KL7.?{K+ñ[W}.܊)C慍Z?֦qI'+,īԐ~0Z|yLoxh_'Ψ7hzrӠ2v-8Hy 8{ܸ\O:h|Q˛h´&d&l ?~q :~we\瘸*d 6 k|k7D t=܀dM}Z ?jw1eR^ԉAaO‘v,e^-뗞ڬ_N{{'²Wc& XtEAo];/oUZ"qGr*QOݎ.HN}oT.ڵ0?c"!~Plƃ05HOqm?tԔ. Oh;]|ޡ_#9]-F1Mfh2쨝Rb}_ojT]YzgPwtlF&yͯ~ o"1D3ywоU ?_o`W^e>Ul>|`ψG O.YV0Ol_2 `r\#<ۿ3&ՔW oӂmBYՊ,X矂M_#{_ekq*f||{XWB~D"#[ž(T'XCޖ~/ /;ntijSXe_O:FS]wWJq=A0/B-IkB˸"w}\mnK)T(Fqiz{=Q&m/<8NqÃKqg)̋<|=ߊ߭8ےE3q:|ˣ8aF3i>yB~ bwv=j&βvjpruX8j4ʍg Ë|vs-Q1};:f\uL_=g&N0Z]r u7e D'6$J\>s["ta8JK>v|8Mah|,?[︂ N3ޔZz[F>?~l%D,o}F^=O- t=8d& m &`o%L'kZhhCMDd[7V>mszGk&Da]ٍ]^Ep#S[s)*K𳇗`~(0wL]у$Fo^&p$R%'jkODsCkw4nPV +3xpA 6<]e@£[? =kDqƻuLAmNh6pAg^~Ƭ__䱽zn#m$0)^baaaaa\ !#- !^sV*ԙ6jQj' u7ˆP=U D6} A+B\AsKK+ݩX(qɧPݖ{ew8/x!^_bɏ>OGaYgW\yN/H޺\;V0בz6E1~~:q0\ ^ e5Y2~*/;9{߾ߘ?W埘#{¢-Y4ZKx/Yy:.Ԇ:7 Ǭ~2'ٳY4_bEɹH(˳c雎[pM̮]p6Zc.=WqzEMu"ER:Ɍdm}O#k^ct /a5Dž>y{JyĐevrs3 u]sp՝O_dpg2|S<ݨ:5 Uk蹸8S^w>|=kvsㄇ^)AʽlZ/U&nZG;⤫.E:Jnѫ:͗~2f]}<9֗㾨Sxh8s;eFn/+?w1>?W"?KYQY, 1lK ar +ūk e'"f+3*o87,Q( y;ym%YYxg9 %\ouٖ+vt-X/q"]!w WZ",i(C Ál0tx8ظ7C)Z2Bws01T.P+.F̫#``ztcTN!Dov ?\01~:XIldmW%F'M;XLG=\0 } ^TSdSYTSaCX.vb;/be)lR XkS}7==)yqi7ϧR rv-J)blZ\|jDZKބSIíg>}Ϋَ[oZϥ[we{oKB! -{d2"O*k@K! UĒltxX~~K.r)WU e+ZDY* ;p :F_N㮅+eg*w[ea_z^ wQփk %q$>ԑ)O}%:BȐxk !#- !2PxJk!oLe1'FAE [7b0d%`ɅM>zOǧ guuv^3gu0mmKZm hnlI'&'B! !p GT m4thQPݤ* `J] W.jp2zo㨆 $Ƞ*p ayrB!B. !H\e>E^;F\CNG` ؈U}BhqO|;+t3pL@KZ.b |p6`s+-/?(JREAB!B!  9Տ,La"[G'Pe V}V@WIDiT@s|O >@Aw1y vUB+[&|B!B !%q<ߨF.LtR(jY,d8`U;o7p/! BlGؾ( !B!+P$diVS}j_D9Bt#f ĄQ‰@JSnnY]=/9A`7 D J+ld;snanYxր !B!2(2BE+7Q]OY 4<>ݴgh [[q* 8ao{vZ5ʣ 7B!BB3/p 9XЁ<0xZX ('DIl~)f vez۞r[3t&B!Bv r ۑQ3kVNHd"`bE 0D;@!:%41$)B!B5(2Bx^`,' v}{юzLsMkU"Óz~!- 3mޖ[~$B!Bv E %?%ր*`F bk@4 BJimg'+}0 'bsxŸ /l_HB!BP$dͩ[W %` uA觅@QցJH{~_P˅=MP23cZB!B!dWHP90RSE]D7z-Y~x?%q`U~D tŰ$\U_C(+MA+@B!B!dWHQcB^ qD+Zq99+wU H8pmgw"nF1@,&B!B!dA"_qn1H bbHc tDUegoXpvoӆ#}+B_X!9<[BB!B !#Dd7+"b;x/& :}?w]w-f$e;#:ސ-} @#B!B !]ΨDyrE,Ң0}QոJ۔[:e"!J:&.Oo/!B! @BFe+[t ){ӧ5@Ѣ"z~Mh_?9NVֳ ?9Jsno P< @#- !B!HdEw$AtQgK -qK@%jpleY ^tEQ+9݂rB!B !#DFv$dM625'J4Cq{έ&WƵ+{9,T?!Q*9pB!B! J۱1E2 @F9UN% Ar|[U _T[W>וgXgWLQYH!B!N(2Bph"`5N\!Y*sF p "J?\H!O3b2&ϙB!B! ܁ k yeQ= 9q1kVrn(+@sC"¢;o%1P[$N9/I#~wZpn.'_Bm!Q'}Q99\::F.;pӝlPBGH2t6o8V` xqj,oMbӂ}%/PGod hO [#}@2P+EV4 =LF!B^`e=MSÒn RjlR{p2 !d_ !#̎E@и74bSW:re> N=jT0mx(n<葻|{b_3elvɸ]1!WBd0ik[ aML-53elo~uxG/nH.r!ۦm:q=V#c5L"k-ɒyg4PU]-.r9/ddadž}ɡYL>-uoߎ5kעX[ZPH HbXj%CXcRVn徲+?˲x20 mw}l񡷟tX۞'5c |x !/ ه^_je@6VVvT;y6: YEu'MX"'xX+>^;reB!qP,4N/xf(,#Ҥ"dNZ7 E>=rK<;ox hĿq,sݸiKۅm絘Ǔr;%ZSBeEPS]\.Dǧ3LS/W)S@m+񯩡I++ښ~}g4P'Zž5c7-w7g_zƃ/m WzϭD՘IُH>Έ9Ya|̌qaFΒ]1ky~AQ6/_0Bb/s_61^,ƌ*\zTt?:ڻ(% ɆZykB!dG).)&=1=sgֺ%? pKEwp-|F>a +mh{H7>F;1c,m)5#a}suG`˖o-r۶v2?xgΤ1ԣ-+aatu[_GcaGV< GX߭\~ WW2wȻ禡~5MݘJ= '*cv&n:0|\xAי0w>]-7U3WuZ/? hrgΦ9\=vJpo\vX3olB!dGkQ/M8 Iz#xt>g6c|_DŽҥf|2ۻB;tN!R}ioKGvÑ1v*G/%7l66rGgoo mmmEwJDT~<#F%!8jd<ZC7_(jMB~ - هd ;g9KfVvPdܼ7>0]x1:<+`~.`Rٰ||ϑ`ZoŒV覜} ~y펒ݸ_|. ?Y-= Ј/?E83l1s.<%P6mc'&'B!l')ډv,,_ zsC eQ- K-WOE%PYxKiLXT%՞\"/H[[[ qxV[EK'x{vC޾v]V.vtB!B/Ogǎٞ~a{ T:(UrU]1Mۄ Eu7aZv 9dhOd FepQyۆՉP{q:D 6^GAӌ{w;Yk>vp-. c,dCӝF-.OĴ*C}s w,SK'q#{*(oQi6q먃p߫Vw}s]Xqqqs`׋KpN}ьco|~/^( yu7gnz ~S8|tR]6 C޷=2|Q˞ ,5xS.W5p\-םG\w<:w߄y8ml7:!u w HtpzlԿIZ:z.A?#\8 σ6ׯiƆm7ӛF#زC A<W`]C=RuuBe1Bݳ`t Wٗ˱ԮCDkvn啖u,P$d?@d[*y/'`7nA3~îЊ(rnG.؊<| sDSqݸҤ"cu˩㕛l]m>Mɨ6;hFbm_K[0Vt?Y7ٳ'Yх1)8q:|뻏`6Tp$YGdĦ>W Z5WG'J\O=U[Zޏflcj H`˯__N? %|BsQb8TD@W!A"dz@G}55~ CKga\{ lA2D&AwvTWWGΫkqq8N0b!"C6˄Q1ilY/ $:kָQQOH> Dۀ:B }B/4xNֱ=/::/L7DY-,P,XWKKtQ|_oǛfB۲rtMKWj'^/v~1z|3q9oY8 %>0W`ڪGZ/^M^\C,IlT[N#Qs]&-UIƌ - Lo)@4MT%JRʿߊ}W~WNG! Jݲ.eߣBS/e࢙.u !hn|ymi/L.QS ՞(7cL{)q/ɒծyA"@2],",cxVs*!iYM: 'm,j[u\dz8̤SۗFܿd8.[ݵrXUdyB^Bԗ3K $7P `a>Y!-`HJNg 4mOܰP9F7q眈}<|lѸcqol$`1^oIC)3 Nۧ`B,78G ^]G5Xn☱n=o0|)t xG̛V}`oōOނڇ93~,p"ib* M`1b)o9ċ |亀re^q<|! !}eDp.:0O7qVtx 1 7|JG(a o`Æؼq%ZbKjli_N?X|eu(E1/,v/E܌DZ*mDBdU5F˺jw=K9ĵ`PTUWo˛Z2BK k̬,(k{׀#(OY[OYEr~~2_o\]~K~ />fO},贬^^ty|շ_ W͝μǿT}o..Gy9b#e+_foc+PK]<=8oMzz;%Sk%1O,mcs%8j_[o?<;NCBp˼oUtrwc'Lo499.{L)O!ʵnZUqYbN% Q.B 5ZwOwX :;4⠩EKCEΖl DI[1եdCʣd=ۉN&#A"ߐ!c#S}hhYn|EI wY]xL(ɼu} ~GGŘ%vXVmhwCndLys]O 6gorWJ`VE2QaX>vg46] o!# 𾢬 G',ʭwlzxr @->; wgTGC(_ tuCÀZl]+[B9ఝ2/^-Vx ܲFğ -6a"~K;8\wΪTxYUiaouK6р֡uuZL%Eoo2K+$v3Ft}Gx==D+}>X>qύo-U~Ezu !? !o>(<]O;Ը<Ǜg?i>XHuu.giFbXffN&BퟺF3dwiUnjXP}[ppͨyl.܂ eK Â;D˿B_0փ}f˴/"2sH4OҞ _9LЬء~! !#2@w}?rU_Pw gMm=xv۞KQ$B^', 9PIH0i5T˳}}8B^WPBl,ˮkVV<1Sjlslx;rA痹}OM߿C9Q_Ǿo>X̘F!B!{B2Q53|PQXwmEUZ6"!lBFU5PFб P0q,T^xr~+pYA!g(,Eؔ`{j]\mbB5kKv9 !d !#I[ E 9@$6^\B!dNz <ܵu :0ؘClUvD,0Bٷ-lBHHD!B!=MK!B!B9H!B!B @B!B!B`(B!B!rCB!B! B!B!P$B!B! !B!B!0 !B!B9H!B!B @B!B!B`(B!B!ra22lklB!B!q(2BXF B!B !#alB!B!q(2B&- !B!Ha$B!BȞ !#i2 7!B!B< )B!B!{ B!B B!B!Z2BXwB!B!y@B!B!rC @BF1 !B!Ha0 0!B!Bt&B!B!I @B!B!yhH!B!B - !{0o;Ȥ岲8\ׅDv ˲DØqB!BH(B89ͣg{7zzzPU]YJ"TeFVt3ph[/._}[v8\.4}Bkk+uUUU @B!B)BP_o[:P]]1c#$e,|( r\fu*QX[ QܾZ^%UK*W @|˔EYP[[W-Huֆ44ԣV[ B!Bȿ:|3"vfѶ3gEH P(B|w`= zpVa껁AlehBxYh|m4L%b͚ذa u@?B!BP$V͛‘Žx)U!<`A0|VBDɰ/:%k]fݐZ0oh B@B.eغG5XlP&: R~}!L} D;F Rx":Vh,ߊOt dYlF)BNf ̝k֏Z[˲883>j75 a {Y=ZD"3o^?0l᧦m]Mg5yT3%BȾ@BN*Κv'h( _R gy&G4#0+rCLRnJzj")sYT{q,_\}u$rR,\Qy# 9]׳d/ݽ;u6kuzsQߍn1+~);6ݨc9xN)r^޶_ڳr*o|yBWHirE<"Ѩ|AF)LJ$FZI HD {B`D iyb`<_LNzJ[x $(5EN[V+1*뗣E|xy_U.qJT3e4lذ&Mg^BOY6$1Yh*c {|1ʏ>3gsvui r>øO+T2Jh#Ⲍ60hB,tN^_CLzy4 ~@ zv>r^NNg^ I߻nOB0n!#DqA&FVqu#ey_K Oqzʢ/Zm:U>O_XƆ|nc!/է8ٰbyo-RȉnRȧ(BH'0!dXR:qB*Y$*$Ź rj1 ]B/)/Vl'Qq*rިꄗ" luSΊ+P'[wK}np^JvT'1:F?ɄjƨQFbccp%OY%*aA*yT+pԳ@LxiBDY9$SGv,&Q7:m 6}/ u:ކ7`i}mk~JG?bQ:g*8xx~*F# !dlލQ!#/5[Il"*9);z$:U [_Ѩ1O}mgw$~CeU׉sP $ ޅ| mokze9=&NXxV%f2zc`hɿ,# _i8ێ^TSk3KeyBF !Xb挙Pp 6?T, V~1Жr^- DoGCSQ{ېILɘ/"98@ , BQK __oOo(mpJH$ڝzWٱmlYWQOڍ7y/yIyPX'ELGt2oy}&s0 _Sھ'K:MS T/f͟rTg#fbWk_d h$dOmXGS0M:&ݒ̤I6[o~7ds{srrD9mUP&sXy?'>-1'C(A/&e(AԕW՜v`ܝrU/ -*:4BHe?I]щaZ~6r` xw2{63l陱B)T]ڽ#hl[m:Q[Rmz 7aʳ ܩt=̹y1qPU@񯬼*+(cʰN(_.1Ki9zXex<wE86~#B=%7ϢFju,\3x!d; !]H @)_ff&rDmq%j&4g$ dѫk ߘ+ng\.WFW\ F@f%<>Fqevrr{&"`F2"Ǝ?S{˺ OILFrWZ_7j>`J &˘ ȳ3ܚʮX}A,_I:ަ&ky[9 ps3?YT.n[h4g>!_:5OZIK SZVJc ,MSرe2tvbpRm_F/c5HO}1!P4vwc^[q# D7KJJ>ᆪ0 ~(1xyn;>CoX z/7p42>rt~G<UTcљ۵|]/ w7!XÃ)1d>%uXQne)ݲ@0| ź3kc9X})rLOYJ >zԱv:MX/ફ{$FegYZÔp(Qao7 (r!z 6"s ƺBhpGF 6z'p(FpS7Z'tomB(B ުY MVV&4L+ DrۂKvu%ɤ -ws,Ofşm[6@Yv BaIĢӒ$$ uEFqrɸawԩ=p6>:eZOxkjf=q?'=.[p=S]:μ 4P5whIˁ(zr5#O{7o? tևY|B[c"Av#F(akrJZ:ʼn 6P zT~ ʻGq:Xy D6 %d+Is&Q W.^QS:u|p̏#Vx?|f=>7ƞsWy+p՗#rtܷ|;Pc.x<~ M_tnOwcoᶊy `6caDlk`RmE1s[M{NQנq_W?ՇҫFo3f#ki8nwx9;LG]k#+3N.U[!*Q0nPLLÆ Cf/(Ĝ9se@ѐVgLB_WOϳ܌׭+Co{D>g\d2 )%-ƒ➦R{x0|"V$ok)=><{QkY!hX6;t{0s/#zG[!cҥԻcMEV݀R&ݯ%{8f~!Ǟ׃mZz+gTjf<Nkmmi姣‚ " p8: Vn#;`rTt%'b0Y*a:Pu2SQ_hlQSLNc 4 8,eret:$qOAy5^\!kqw( Is9bĦf5 UG+܅5jϋ& vcq#{ZN&ğ3zM~wǘǨw[;V;j'iRjPQ0'|(شc#ʷ‚2 ߴ-BHٮшnNjo@Hkeg oZ,Y*@[Dk_<  ̮MDpcrEVϴcRQblb:t.=!>Z癚UVSPS7q k&?_:q_}p2K1 ڵՊq7U;mR[y (؊ [?{~݆a S,o=Vr8wu`~\~{凑?/^v4' \5>=k7paah8PH\7z݌[?]! Hr|j?=uE'{Euk n1]v^ߠߨ=N'@Ʀufͯ.-;a:]",vw5v2X(+t=&: "'cĖbIO>(>/v4qs :Sq[!aGn݋P|7%8 _v{46FsΟ"+lhtH|TL{'NWbB ns>ӪoŒkǙpB uNϜG|܊gqev-Cn+P39؇|oU"F‰?O< QkF2~nD#{/b%¼nu/i/U'݉Oo}ʇpDw ƒ݃EP8LThD$b" )=iv[Ezu[omM- &򜕕(HB9D#H]qxgJy$dJkj(ǒñq͐p$R]b\gԉZ@|=+hDO&*g FWE{?}w(_Hz!7KEעnȑ82D#q֞YiJ}\[F_ijZWK[7ފڻ8^6&xɃwO{;]l/{/`Nn?ܚm\{G8<FƟ7[ۺO )V9݀;?\?!d  .;":8,cTk$;,\5Pف亊+a} 8=>MtVB7֨!hD1 pR^ z#Flx |/D?in3ᄩ`Ǣǔ1f)~wֺ=[~ n;ySt=ܴ'nY%OGaSO`"?{k0?l15sw_9cCecG[u n]1{j~x vؿa*N;(x <8§Pux7dCs OfPƱNC:zEL1ϑQ'4ClpA)/1_ KA0xBCJ\=zZμ{Kq{Qc} Ƚwt 4ijlSG+i>xyh 2p9&d] z@v/ιn|wO|{Xpx<.(,jSb g$yX(K7C]ř^Nsǟ| &Vk/ʨ/k?l<(6ʄ*r$;{9.Zrzv"qoϺ>='-b P`rVR X_Ūk O?$51{\ãh~MMXg ۈ_ogGE_2 xw]|=Z1t5 gf,]Ιg;e mh4ƙD%U!=fs.ǛWu齸bJ8肉p}ݪ<*|m8͚nǟ>ȶkKw?.>Nmop=r8 Ϝz9~:wP6|*ŶNߏyOW v+OTxjuy$Bv?/!d#$ [R,QAr;%I"1_%X%V:,Pa2[[eqQF/>xD#Qq~cY+XՈ/BVp;qjUO|X*3girƑ8u`w[jxyq0T.`ῧ#8:&>8|}vqQ dsdlQ3o|-|LqdTԊ}sj bJ]ccWSq Յk0Ժu: TLy3ˬo-J ^mY~zKuKVL(9Xpz}u8 %k '.VK0~/: &:צu0mH2Cjm*ӯe"Zҳ\cϊQk^3ݤ<)Fya{5i r:* am\qkŅyVY.6߽4ʸ_KoK@:^24Րk_G:Ws>^{n=Q.Q?6k'jD™fhrt1{*=g3`pku X#7+R6[~keB|N9k8J,Ew'i[[7 aYպ$hH![OK@iBtdp_Mw73nq$63J TY-iOr Vcٌ@!q*nma(- UCZ,V` Hb'e6-׃??y)+fpl,Ʊ݇SOS]sf=lX?CƟ.CSpFVKt2kD6|S½Oơ=}8mz'kͮdD z:E (@MD'E&w!Inrxfm#Ӏ#Fn@P%zC/Q.dJ+0IqN5к1+SP>Wl1nM0"Jޚr7 5Rk9X彔jHTu 1iɱg~kbySl>i'YD ~Xcٍ13,/*QoblfZR)TCY&㳗AW>vQ܍{p8ȨjBq/ڶ]'9\+E+yPӢf˕7 x[߈Qt l.~]GVc9U%k|org5c%x+@qpv^|2`Eďj>J=OJkcmQVNK#덿Kv{P.r0\$6u7ށ?j{`g@X9iu]:y0CL{'̴͛mN;z}qÑS߆:;;"a;:LT=!+uTㄽ} t?YM[هoG6ʲ3uҺa% fKM^힞g+K .moW>?Kÿ~`VoBIieH\x8d^1<$#+ٶ~*:t!>?e {B6$et񸓤XLvNلLereE")xvTi'u82 Ċt%8%9mTpqHk)-!{9K%QRL.‘G5̟;xlB%8 ,]={}uUʺw9Zgq }%ѵxկqSX@4 ގ}kl9#wW*|\wn8L5y"&-ހ݁73r9Qء!S/M~\6_*ʌwctr8SIP~-emDz 6lp^_IlKۿ׮IJ+f 3AiD![4,t«ҵ 6Z c7Szώir-z:.//G.]PTT$.4FY"g,rxݶ]u%_,[b}(Dqf$ƱAvXHTe3i{aY~' .?'y U;Q<SWqJK_z\]g=\f6_5nQʪV~}N? _]r)kܞ5}ǦY6홥jrl^&եz֭Cuu5Zg\f?1hQ/QeZpyy y9b,eڃV Ơ&y!?ܼEy<}~(>wf抲5xF׌CfN.#Rs;*$';[YIWޜ,nUzn5ŻC+-%~u4%,Co~蒟܆7lXݻ',E=hv X]-q=ӧDpuyn7w9;#y|*M8{Ƈ+3txg`#3Yvqחֵu@fފ46X~k# vdFײ wNf¶ԫ\i>p;oYF8+x<bɱQDt(bYI?NZE`:pm@0-HokRCbClLW!ѩ,Pu !P a-XT%y_/MmNlaGܟaėyVw|N΅jt?7c ż $ۆLw.aAx#ҏ5pu{5%}n<B@BH? :Ö[ϫ5VGLtspTqݡ Эӓ`rdDcn+i'+,>[T vP$4o3AJۤ7S{tZo}i~Ԅ«g`xߡ ͖VV^(+Ŷj;MC]UuTR1dffr AUgJPBᐨUU=*K?SѰf䩷m8-  ǾCF_ ~ƮW/磬U(E& !B63Bע4W)nH2m[%șՃa:4S RPrp:v_)m+"m[ j*ۯng?fl& LeVQ;qC},AVVwEJ`L= >4ѳP$k!I'@5eUi-Hz1Lkao;o(@(.k[":cWX4΋OZ#tEk*- = Stx&6-O^i"R IX@֛Tqt;ǎ1șʘr'B){#q݈6BmzE`ʢ0(*m:R\w~S%J.,bp$ )Xfwbp82JAX!]CZ XYֆt pT5fᇬ8s麷#gRCoKSÆ2KuBb` ÔDjUt;h*b&Y un ={UֲbbOMX6w:P~ߥKJ~K}w zB9>U~#VloU ^XBP$ pKKdN;f_#sq2>i{,jAy9*ևe ڷ\RS=hc}cH#uT6z^*Dt9FQ^d6^)po dg`BJ+"cGX~2.YOdlLfgn*c\߶n\!(i ({,1](?z G~ǖ{Ao~Lvo*Zo?mP dۓ,[ńk?ظQ%IAY"qe^B/,+La_89yJ;c44L8 ,Ł#"H&֖bhMkYLqlÅ'rr[!Zj+\zRE=lb{H6etkUθjWGPza*?O@ Ӑ42ݖt=\u,8a\<`2-TIA\ PlYY\ON !#c|WX1xm Kb*@KY u^ΉyA;2T1= >ֺZr`rj!t(B6ع\fy-tGohhN;M+ekh,8 B8 ʲC xz:fyOZy284ł2ߪLJJM *#6,N ` x2Um%B,2pY76PS[\0rV>YY^YJO ~1/apP1y|4]RTBrmp5sO)G>Ի *`el,YY8D! FZJJt+*l}l)\L!p؝ |֯Uh+dҚڄԘsQ{x&6/5[<ޭua-1xry.Uoϕ율朇C_C|}5Wtʼndx2Ke* CCBR+bG>:a+ƦYK*d{(8^tnbx^ WVii]ұtTyl#aO[U?K`MM|sc'lC٤BQv }.yKlvH"gږY8umGf=裠;tHF`j0"1B3v Hhk$ގ-xumNԖ/fOMm֯߀UEZ۹=ntqa?Cgф_ boA!$>L b,Db,e2ih؃ƅۜGf/!;N< *'ik]w/AfꎄFٗa^\%Y^Lю2ӋW# F(WVؾBhH$:N Qj1 {90*kQ֝xme~5ir}G!dB0 ,^D%pWJ$m4J!A㢋/FNv6aʄ u#fDhs=뮻`ԩ5k62犱<9/11S|3~3ۣ(tl3#ߏ`(b˄.5fPXkTli(!Q.^agJwr%˅o݋)3+PXwFǹS}"MtmD[KiSweq93ŨL =Dӌi>)ߙiƩөaӅn%yS@!C,HQEv KJ'v-l%ڼElAY#u-w_qac[M5TV̖ׄt{nZ"J%X qMli[m7[mm|9_nl6lذ].*!S N72}y8mJc b.D83D 4蜫"g8tX^<-)8(t2t[ds:vxp+C:fF鼧tyMBo6! ͊Y,YHJ@ǥ8 g[xiL:RƩQMmƗmz)h4F_MN:7X_VFvA^^~p-7eiDbYz(l=Cv2Ex !l_P$lƣLb-Z^o ?z<T"[8uзL{fx}m,mmL2`3%xXڗPK3~Z :Lf8h_}/TVU `H|ׯSY:l;uWB! ![ )N؀*GUUJ׮U񩲳d逦ke n*H.%05Kx[Gf JEZhmOxÆt ChllTH3*Gvvږ[!B!dDž !d#Ř\5HE߇ښ6 1DMKHڲ$u'nRE ɌgG!B!H٪H&+3K B!B }q^B!B!B:/ !B!BP$B!B!l#QB!B![ZB!B!҉H!B!BH'.l#L.B!BB!B!N - FfB!B![ZB!B!҉H!B!BH'.l+B!B![ZB!B!҉ !ۈ- !B! !B!B!ZxGy!B!; {{/! l#B!BP$d^B!B!lq(5B!B![ l#4 B!B P$dLM!B!-@B1 !B!H6A @B!B!l( 0!B!B F B!BP$dA @B!B!l (4B!B![ l#tY !B!H6.B!BP$d`B!B!l(` @B!B!l hD!B!BH' !B!B! B!B!tb(B!B!҉HH' oaw-0ךMܺu3ǛSf&\WüB!;" kE}Ojة7N %g3oL?f\zC&\W?7NÃ݃/o!Bi[`yj5\߹w/$eoHn/F6'RW6ۼćA_4٧B}z]zܛ!B: 4Bx_sԬy'/맩bυ 3ջpTQ/EósEϰ3>îxS<EE=P4!.{clh!BI@N']vbp%XnI9&|;h*n~E+W~yg*&=&7=gb 7Dх/EƢO&a4~)!^7oWVz<+,ɳw;{tK_a.5 `֯kQMC/Eiwbw]w }o ட49QxpeM\u_q;!BI% gpDYy]wTv9L?HD{x텿a]Jݨy~._u53B ?Z0zo6p8e`o!lg7s֙8 26oJC] \e9r͸vgQQ`oO0dS֬XȈX ?R*nzo/XxmxㅱDV?LS[y+jk}~->W6?>B! !;>34#g펧G}9ч)xge".kX "418]'>$QLȼ8!Q!#Ǻ8{-qh8v3gJ6'ҚpE˳'ўt~.!zZ>ēsnzS^?4WvB|G{ZBLőGMqqj0>s[B!KPOȼzJsObՉu)"ٸgE]r;[OKMN{ƟԻ1xx W>/gǍVB!P$SO{ tr|exfֿ1ة~%bȐq3ga'}Nyz,i|7sq؄; ʒ#8[ghn>p\r5m|e}8t֕B|r.ˍ` ~$n;l7Mj/܎7=vE!]2}5=| ǾӻτeѸe{8qK!BI4LU j.-6Z 堧Ni>;RsAvazTTk[];=G_trszQxМ!GE-Mx&jNó;f:q?aT !#Ҭ( CR<%)(*qA:E!fMLL3N hsikB:,HHENJLfAJ9^/xuxS㫛r٘ _+>!SӼ-@!B!DV7mZ'싄B!B@BfE B!B3B!B!N @B!B!B:1 !B!BP$B!B!CB!B!N @B!B!B:1 !B!BP$B!B!CB!B!N @B!B!B:1 !B!BP$B!B!CB!B!Niho@CcyiZ|{B~lLv=CѭcWYWwe !8PQQPPB!)Aך΋YΗӦfɸD 2LR]=~ >m 4݁H$F_W\W?+*k?Kf]A`B >BBH+dGGiB3i-j/%ib^TS5`MYC {75p pΗiG:ꑇ @IiJ((bł=ٻݳ]O=ٻ)]T,%~:Ű;Sμyy;{% t/ jA|KH9RIB HWٽ9OcM 0ko+q-D7Dʞr>zGD&~[<{57Kؠ@> <| rRDG"J>i(dܵԄ /Exx8>R/GxqR£lIf ғ3TwFr'|ec?KY߷_CJw=#j.F-vc6|^ߣׂa_qyG :&Ǯ\=_P/$U[=eKɞmr:_i\$G [e1n$tR U ʔqxm6 T5*)j5kϧ@3xR-Bi08[IN_É':][M |jNq$@vr1Tt{Ԩo&g0\5fs8@Ɣ\ߒhv1ij%S_=/NWp=xmru_Ԅv^-_ØX" Qtɣeu>K{R퍝9ԁ;#}=5dDTn}H[ xNªW #/4i\Z_c52ZiqII&b Mʡ2~.h^F/ucUfX͖;~2d@# :<ޤҀ]$ 1 Raq%W3_ܣN}bQ? ZVcwa'i2HHP?$b 68u+-kŜAЯu5X[YBzb ,Ny5oTmq[׉˵SiwDBvÐA̘#/4l0lR\^˭qw*2c̳xD8}1)~ixN^RKOjau{\Oޠ 6xNWbnauAt1 Ca{ >eQw0,]Nd93tU+1}qu.#hWa>}F6J"Ad$blI" Sp.\B?`nA͑kl }wBQ3[S<44OxpZ}׮tZ>[4M$N%Gi |S{3äwrG&ۂn;3=9rv\NTcJ'AuuO[&~(q2nem[d1Ÿz*X;1Mx6Z2=2bS_qq Μ{9]! ީJyFap *l2HBp@Xi8r}YӔsm4~}'$zۯ52i=飋8h\KgBkqih{#ƻeO/ËE1YLBݣ,0VKA Laɝkp~Xbs.(2ybӿmBru[' AG0H_ĿOLufvz|dxB!@?6 R@f? ;ƴռ^ٺkq~y ^`E"-6oߣ73Ot6<N_6 5`4N.vtjZ\M)Liȝg={vK6wyZX0Cu tj"/y18bXx 9D /1XQ~-)1&n4[Vە8 6\q؞-ѫO8q>z6.=Z')h'чT}a njMg1V[:cӏ߻o燩v2=,f"GZ-V%oW]jywh=LN嵞JkyIذm hLjtAإ;louc'h?5q{XYæhEt5Ů#ezo`Ӄ)PgF pP$mQ865ngՇـ=#xl qDu;032LC"nc-7q5?lkGb ż7kt5K1ȱQ?^^>1;`I v5/1v!~^EnǪ  AߏϢ|f Ɲ^sCT~ܺGv[5g`|F/Q8>C&=;2HCŌS\*3t)zb4苦cRqAoZUA5W79b6 '|3fAp (/=ZũrXOx?=#WFX|lǎb}Q8+k;܎XBTH}֣%wb^7vŚA#RPUtBQ]qx?Xz2Hku xc:r.!ӼLldR&%?) 7%}R>9SNaՔN婈!V*K|DCѧACc@ٺG`2@xCv}3Z_6|>11(w0>scCBV"bqLS񿌿Ŷ >] ZK|- *FݶGZOC ]{~ub/2qbaǫrq{/$Laa*dK$̴ <>Ku>̥x>xh++1Օ=W\]]O(Z"F$4>e H2 -'3vm4 FU8[6 &8'%p>n윎#bA/0sh^p[#GuOR UnMLK__R=!L{{-oqx#uo˰#E͆ҽ63J11|S=JyhK[N8`ߋQidc0OCpE*ק~BY>.LƲ􆴢4(y&*xn/b(c>}zDs lO_hzևT1o|rDǾ^8-Yjӏ )¾CO85~ka8?z5л6޷K\N cd8Ӏ{zul-nʼn_ٳCŬ7TLUztZ*s #ZaУf;Z' c4TgB|čnm:b`\ܵ8ɌJ39GOY 4S?un:kr5F̳L9/&]߹]q sJjL>~9smO^^hWi\$ A|?x0sDz8j0F`xxy,bbEl܏WНt2]&b~Z*]!'@#sT_xn AYϘ<{4j/Ǎ <0ܛTG `^6h7k嶒h/p+nJ1ȯpiƯ=}& `Edtl XeQ23#gM$n~ogCeb m8npzߦ](?p-</Gˬ/03P˒5xKS rH͆cr󊰱(1lh{ cIhb19& &8 ٳg2K c(ApwF^ Aɣp ΒёY3 Fz1$[аqٿoU&6;ߩN\ Uh0ܣ6֞H'cA Jb繇P\ªeI,u2g<L5qy&o &_y}U'=mnWGktr}klf v5{hx+$h2s] \YuŀЧYT]tAQMƾX22ݭe JqXg;VH]bl9hgR[ul3?m@& ZV挫8_{5EAZwC}ğ],tʶ&W/ŬL'0k}nɻr^)Ir #F-^<{a@a^0|S }CK+ btÁʚU8Zj t 㻡 yjƩNJl xN0f1Xp/cx8thڍg32)]}(㆏zpǪNoSSB> {V5J=;; ھnLC\f8~ 4Oaϑ d(7 jV(am3>̲=tcnÓ#'0&ݪ7A ]=:dKH| eȯ3dus)Qʰ{MG.ZUu1qGO{%>135,c ѮyO*dˏI(^+!sum16bF,CXi򏪯EH@jlFd[-ܕcrR[,}k;M]x{E&E}*^?$E#=8Hgb 2YOG\YW-&^zى5h/.^y"@!P(y:NV/u-Ԁ&qENN8i!l"Y=vrC0q@"h9Ʒ4ÆpF.l5 G-j Rw)1 xOL} 1> v4 pAuԤjLX|p/( fT"i57'{~YHiR<c:k!"as2m}nN)gV]O_GQ'.6?6$D^nmEn"ᏰQM6&߅x Zf)H%6(e7ƍ5`̝zr {`A5g6khzq&MSVą[yq.̨/ Űa(>Z4.(ɞF030}4ɳ̙= l]at6S)5i̽ؿjkt" xgbfa3f07p/˂٣hBu@Cp fvᑱ'3{t>(?L{{`-?ȉ)B6Rgl1ھ_LQ"ۡ.;qcnXEj4!Kɏ  A[>|%0E!$41HDFFT-ܚ ?: R`k3Կ ɷ3玣#-rixei讋 Y1pjZe _ٷŲ?,شiqp.hз"7'T 4Q;̼`\,VP!Fs=>܍f}U([=t>1k9oj= j׷P(lн]6<PaQ[Z 屲bW.܀3vV6rAѯ+8~K`|y9 h,ǨE {lݗO#ŋ{| C:s}sn'< V;]1lGiaw]j]Ķ]sqqP?NuNS(fUԶ;E'-Pa`,]RSLF!#K갖Dߎ`>J'c@+oh\NF.V ?cOY)b=c<{lx 2aq3zV`Š6I7\b >^0+:5p[X<Oк Z.3.˯*ƽ{߻U~FB>͎o|vL:Qϩ>p0;ŕstR4} X'w<V<2A"`d + CvMld7wjm;[(ZN%Q|8XA,CՊJϾtA1f/G3=_1ԍiSIJ]R&p2}w^8 09,? 8Gd ţ]`cLH$܂^k}ء?F/]1*S J]H&HܻoOU?w!мf Ȟ,Ma4F7e.|Vp"DQFc_e 2{e``T?9lʹbsWm- X#~phW§cS~3i<z:ޞ}Fp\Z 9 ( %eҏvLqi%;Wa 3ߑ}{B,ˠq&hh·@rI2se ~qg/.`%(NV]?_۳i(Tw41حAIћ xue%5m׷Wc~Tf,ޟۺpqQh^8~UrmN:,O7 )kqPTggqX9z' c}:XT]NMۢnVuL 9m=귫J7,fu~qL>yU/ |l_ؔjЪDҲ_7r% CGiϻ6vK mm5X~.*ln ̀R$GW*Á+S$}D)#)X5w4X~GgY'哶 "MF ^J}:r~x }vfk v?m#Bw͋w; K8w7cfXu9:%~ߍ&GlRGTԉ*zvNdp2*6~&<=j\0&&Oí!Y(oʰ<h,V2V3\si芑MX3eZ tWRvQ=Į[i [ P09b+MbLU Iq߄|\s𥳐/Vh5R,O\{wߣ〚FiT)kG7frR1IaLuh &Ig/"Tkr3Ŕ59U1Wˏx(m94B#S1WpJZ"6Em*Ұ%M62.NcXyA߾'}8 Kap=73bEmv+kZE[xBMm˳JWSrYr|D{L!Uss%-siUU&co="\:= TS姰 YQFiL`η3-x!umfs~ic?u*30ȱN2I>&Kgc)uplTs_^X޵ΰ7#=g0~lmGj(s7\&\0Q׮nad Nw픙-:2{v!%A4Dm5˿) %(vr -VcoAw'- )(Xkb|w*ÒVLrS :C;/aVV/N%jS'Xe:"sXFŹm.V7OF> mc))Y[|v4m͜&ukk^JQNX,Lw?H;'4 29$L+ 4ҵ6d=Of 3䱖dcD(1ONDDGfRfˌJVo±G 2H2oY<v=w+ C s0)<8LŰ?.xNp/Z8=ĨNyH ¸k57#fEm`ոVy Sݫ٨"mid6Aa֣R (}ݖ|],o|Ɠk3& ('WʙEf3N0,T"e1Kͨ}O`f3RK}7jLjTP%hq%E:N9++!B rfWI?.1"G#G*9Y'+t :A A@LMMQ̡޽7o08֋ 'KmSz;{^Ü/cD24uS3A" N?>=;{q*Je Ğ@$~hd#4V N{< "&&n#:AAcA3 ԡ=    "C@    Ő     r1d$    \     "C@    Ő     r1d$    \     "C@    Ő     r1BAl".>6ݸfEQ{ h  ' y LLD^:,%xh45$< +h    Ap#,謬\%"po"AXAcAAOH9J ^5C_y2y%!KճPd2f:׋QcpcIӏ_3u D*[%4i1  r8d$ߋyr͇#`~qûLOX5aw w'q)P8S6s _wYXHaڀC_n@4ӋgX/h"pjPt^}Q=s: .mǖ#a="Y3&bRgZM,.uq(LIcA㧃$xlƾb8ggo@ƕU=4*6%($HCUWܸMMP=ʬL[{lPT͘x&K%1:F1zlbo+|||uF PA1}OCquz:$3|Z-hwѧu5׊zWwSSMKÞ?guetl&Zo3G-a="L[Skk3#G $+PN7̈SLB89U'5n?*+#j yn9>_ܮOɒ~mZ]i˂# "! AjQ 4?Aavm?7 ner\\Qg.W* }xsgvdP~m`jVυm`g(cX@E- *@P ;IkHǜU`)΃"ґ3sMio S3?trfE yLfª#l:vwZT.$-=QZAT`Fld O{1G=*@/xB9}]F_)3&1iʂ#  A|S Tn6{`熳~aiv*Q[ࡁ9ZѨ̅-4cEa.`ZkWtbY٠7,|w/ƻq-a ,3+3ʼnaڿ8SinAA2*'ykDf#,Y3ދyxҕ; 3K^J:z]?_*mZ+!2M^BbS])$oS^Nhݹ3: b5Q+kP|aSghJĐ0zCè[sH$FHBau(f-L vd*18p :S29F% #h  o o]]ccohC)95G]*(hL3V(R?4*[@8cPF}ԯN_%Lj}aSÒH_"P`/Dᝀ BF R5j!la܋eG|i5f+WR=/jE Ø4A,?|C,>\:S&-P6Er`ӲyJZ+g!+:y#`D}Kw4r+I+K< #6L3*7A9FOb!Ex0J&IW_ċփ[ǖ`7 sz&{!/; WhSl|I l:%^@QկW罂 ^u`1#Җ4FAķ@H" 1RT|6.{Mꋆ0!룲xrPK E:E5MhphӖK1=&tj'[.`V?p4hz^Džl=狙(B҉/+X =+uy?6)M|t˘:xǻ&HQꔯ ⎟ult K%"UOBdo`!э'"S 4&%J'AAA(UcۨCoB|e[OðcLZ'"CHD&.>  AAAY g4j5x<.s5ީys1xT> E^~Ť.5M9-k*GLe{CVL̠V[BFTlAXh3G iU;t|ݩ=:*L rd$"GR*IAATjvOD _ob .J\ Ѩ2O,qwoѾ](rD ؐT(nKDDqOQhD#\Z"M~ BB+Tg[f j8}'1+Ԍ:  ! A"b#>#%0ccPem|+,W!Et3Bu㕥%_uXZ"+{FiI#ƈRba VVZ @|:7rU 6RI~s>ZjȟB.xil:^(%}}_w);AD!AN{1>FTJ%TCc`dg@KDE2=J5m>V^+°`*̴ #zB E?@ӛ'(£Xv &6 ** OGs"cXXg)"cPx<>v g>jT-2 ;eʻ{MTsuBH{YA=3xR 8J_?7WX{lFdڅSwFUiһ0ZuDNy6H<8~<\^ۭڼ2JTX'WחS ,MC!GЮ|\ K:s]H酇mfT&3Aq3B#š%[eғkxiبS|Ko,*YJU78odwc){f[L.ॸ'۬`q7(tawqL792e<*1׍k-6]v+?o8,J1C ͨOqk? 3({~܀Wi[M&Aր3>|T*ǘZB/HǕ7{\َW?l|^S. 1MJ5D׈O(C&T*soQL |~45\D r:ߵ>O񠑨i[M(l+Zy4p xeA T5'|ook:v <5 {av;2[npڅV3S ݂#עXب8x GteGjA(>=cW8~o* 3^o0DQod[OR0+IZh[Fğ*{2l^'FAio8x=L5snoMBLCP')p}8]vܮ8~b #`tc/Xf.H^vx*bddX LQRW7E]KWhrgL~…\)Zqjzc"`Vx9셟᳤/5[Fu*ػL-&ώpdiV@Q? 6:q=&b$2c计XI._9kNB׾ ]aΡ['y}"Vm_یT[>0gMDZ54Ʋϸpw)T6C1\lAz%hb iW)4mviu,2soJ J|@N"$O^m|y j/?sb 3|y"1Ƽ J T@B3ρoy%TL]X?+ r| 4h3v/KR#yDG0/e&=Qkh¬;_p1W- g>Ɯ0cZ7qiL6Aѷض hJ&4 CMa[;rn9c޼||BQŞ{Q\7ڌb' ZK=6Iu a>42i֋DP3UmkBcWlH r0ApԱR35}+oh**Bق6on#u6z'?{pV^co1=h$c&{7^\ov㸃SQ#%mc ]?mX>|?Pe_Mvdm1Rg~gUlilkPӈ'~EjAzU3v'a:DĐҨT|k' WOt0Xh;M(f6irx`4}Fbx,08pH>vBv12_3maxGk~N=DhыS),E`>L"' >NG=kѵK-D-q/:@=Ҷ|QUX4C#W25ad. _V3u[#2efljK6S:yh~CvS2x*:dƻ\']V:A9FTg2OIׅkɬ_]S4HVg\LTR9 opqOB7I%B~ [8Mq{dݗQp9dl.Nzh=  A Z9&x~5Y AJ{?ġ f]% M=őyk6Ƕf  =]7(97+Tn; zm~-'@59WF.\BݓGqa|}tk9vĬ.=yOa>ƞի؝DWv [0 iY硶FnJv oaf++D:X}11τfQ B2Yug5sc0< WVd+#z;8tb>Lel/.;Cףߴp,,꛱(88daQh!ݎnܷ/ԅc6ȭ=ƵuLFOYXݳ9b)2+Y87 } [y99X ށGBBzɞɥOD>hǙ2tm͆Dj}cp;4N+QC9)b>J; r$NT4{mT~)fs4Ei:-؃Nl7Tk`NU9IqC`UQ7>LY8 Ctd4tA|ånk`J"u`#lZ 簂u<9t \]\vZt5KBD=T)uQB g?nQ~x5?u1(_fYuVE>_ᱸ)qʱ >JrD. #sqn9Htxr .wg1o'g]{x g24W0G!cPvDsFN$a4Fz'gx9=G|$:hV5q4q}`83G7kA!oG^ ςu6툳>B%< е\ \}39x,EMg1a8zwꞏ񍗁~/W2(ahV*]fwಬjǼReMx0;l\ojW>FvS*!_C#~7L(d,$!WH-dq}xTlRqwTj;۶t"}^ee>8MXOaS*5w|N;vFJr,ixts&,WikN~>jEyQq'(&Utͣ`]mUd`zڄ5,992v%&{ڹ\RxP\2~wD *Pv{ 7M:e^me%F<^4³&eBn/k%xoH6R8n10|3phS2mvD>Ohݪ1}R= 0u⺃0p\ dc *荣7nNg~sp$x@a_ƦGTLU)dz5]*u܂< (RNƱYH"H~+1fk縿pG\^D_|8wC?fx-`b@zfcCTMpG-ѺǖSq,^ZooThxNmsPEcx 񇝰2̸5x(PU48įBYYgb(ҕt;14nqf_Y'oK i5 7}t:b>hVo[x/,y7PxƊNsBӁvM*>;{q1HV#I(vN/"c[3C_2Ei '@48No??љm{6a %X4@Z^7\KL0{]si.#Ohw{t_wAuNMw ~xD'#ј6U"kBbQ0؊ؼ3\kζTϢC*̆Qi&4]0ep?7WBbĭey&L.XG2%,M#|g>Vm xr s/ѵqh4(_1M5%N;vv GM7|h'A2k0^Hd!2eƸ[ke}gZ}:A{0(O0♺QhSsdh~ ׅߦvh~1n L2B-G!x(OEd<ghP6aE?IGm: z!QgNÜI,ZS*)ˮ`J7)ARh A uFx>z}XXq-mlsX2Rf@5pTKF*X1M1#+b '/N'ڽ:lG|w֎rzy_"G`ܬ/6k{q:p-QvhHtJ԰wnʝPnd0/ eQs+nC|;%_h~8ܮEp7sW6:méQP RI|2A=*g0:4Gcv8ĢTO5>; uУv!fiѸ,܈e0dͽL.G 9jb53F <}~niB?|tºi=YnȽv +⊠'B)ųc!cEmXS9:Xrg̼3Y+ЇaZ%F˦LeHS.2ql6{AXMV'A[;|[<=9f:q#=d\? dzvCm\t;vH<Vg/N7Qw+1[U(^Yvvv2 gsvE"Kg #Wm  hXV=^q0{cǵҌA|?VQƍM8_c >3?BzMI_OD>d&}[{qHJJg16eK8nD&iUd`y (g9UuJĀ^v{M}PQFЧٛYۯ;az3X8,|ZFXmzܘZ2 {d$W^E ^݃+}E4-.7QI}8_T[54+A "גwz9. 7S͏6[/] }i@]v;L s3,q^pqvRZYEx>>$  c|4 JSRǃ#pa>ǡlAO.#:~d$wH{;3pAAD3uYg0 Au]/C"hRUIA^H{n%-R)AAO[0z/Lf>?A2k6+AAAABkAAAAD. AAAA! AAAAAbHAAAA2AAAAD. AAAA! AAAAAbHAAAA2AAAAD. AAAA! AAAAAbHAAAA2AAAAD.ƞD@AAAAo2;f͚$    8d$wJ"!AAA! A#dGB    C@xGpd$   -@@xGpmMAAAě AAAA HNF@    ^^HL|   = ZƵkqN , gW7$TT2N>Ǐ\ AAA{oO^#1bwX~uCW5&" 4رr^o7тk-qoˍ*hmO`?^Y" KqLhz4m 8wTP:/Ygd_CLt *VoIV_}fc=d-JO:G|t!8'+a p|f&Z_A[CL,(,&RG*_'B(.S$uXӨ}.Jo$t&-Oss=47|>h){s [F4v{nأhbwP }ųD#X>;rnx"OL; ~ͧKSsYujz/;ce`gM^vnp7Pҷ\_ zx e[`Dy~'Vwb:sG 9F>]VKDG7[Q`N_[Ҟ/S72X^'Y_#kEԾ?}g8gznLڰp_JӁqAK&Z6ό#zyz;3ⵓ{7hqKށq,q,sڗٗ:1i qk}d.sʒf䈖_ǡV`YF|?1ev|Z{WaW5/S.=G1. K&G-4͘cub WsVv1=pC1ÚO+17G-ZԤCGF`˷[`,˥PXI$ :bcYGN K{\%LP6M׎K{nȴ8J+Kcs c8Hӱ K#Vw2!-SdUM,UZ ett#1əxt>$%e'o KKy{N-!}d|UF2WoqȊ46;aOx҉GEt)O!6)9[XPe:! \o4iycyOV}鶃|`Û8kd--{Ug, s]aUoS ;Ƚ,83qF'7:s2:s̹0ʜ;sJ<Üs>eΏ|`.Bas%+\s嘫\e0WZ5d;z5'Oϟ? Uq1|:Qt q|BR('&)NɇjvL:O=<^~$`W~Oh3̗%y|2M,NsZX3e,6?;'f!}(yD'|z,n,m{|J]~c7n˙x&|Ln):?\1{f,ep)]$čdvLe5iš<*^]gggIϳ{\OJsKIYi Qׄ\F{qJ Wsr ?3K$OR˫' (8=>_$eGFuNy:cνd|UCc^rxpxSj)ޢᅠ#ek;ÏXYGLGSxcU2bTxwQGe~3}}nkm&~PL;&NAJzg\g ⟃e7ŘOb?_$>wu|%zo3]<߈&d_ wVNO{]"~bz/sS gkiX﫴9Li,ZZ" 2|:EN~?T?b/U0Uc+g5ϼ5c؟s1&}>Gc?0OG47'37N}v 0A"|k׬B!g߯oCNBrAP*= ف7a`K<‘<M4)g'= V3`_$PD ))" *U}6r&M~ގkۢi%``KO]B(^a@W#жf1hu"  *X@;yb_ -j^GvY/ƽBq^}& 3QA! 3BsE0Kg|+v|W"%/2QLUMbbԑwY7g͖vQE"=O -,1Ka c L^ހf@d/rsƠqe̻8[x K,JHꖅΘyd8VshjAHk f R%F=B0q:?J/Ú4Q"1Xljגͽv{T'air~[0CMJ{\X-SkS=IMEYfF,>=j'?a/N>i6EMB脺%a-k$&(2UdY'e^6=&Azu>PCxr{S#]G<1YQVGQV Ǥ;^޹l .k{ ˮm‘v?~J^ߚ168UK3Ih,Lk]B,-? 8*Fm8&/%pv63--ϱg5JՑOs0c`(yZ?T)rcٗߵ k.XS?S,KF;cJ'Q.xgQ8yP9+_oZ~^1|/sʒ=Qe) "g)صc  D^ր~1?{b6W/u50вz t0hRĩcN]UpIj8T6~4Jw,U,Dzx~M|\hpf-Q i!,qw7J.9prHk*xFzkx,wPh2] $imJE#yw2rLI3O΢ u TNٯ!ߧrE"EX ,BND80%

t۲VFg%Bp6DqeEfuʥ7YI:bSYwv5+RjYhppH7и c˜M6dM^ @Zv\R˭JSpvOK@eQsKM||5mN,)i$wcMo,fO(]ܐWEH =/N gO鶁 :cu-ř{~_*ki,TBYB A#wg lyV4^1mL.Ϻ*5-yN\g-c{yVAmѦ+/܍.QO8GF[|UlFd)9Ӓ,Nk8]TPS|rךuICXKkR9/7$i˗fF`pb]?`F hXd:?snѮQ)0W;ǍGf?7dH;/_Y*h,:i@^GsƠߠN(Gۤo /B~g._dh =3_׾u8*41ї,>|`mѣ*MYL=qrMѦm+3ôdža0Ӧ|bYp\a[Q^uN^k5hMgy&n ݻ#Ӧ0|X$ӤEpf̚%?.WH5 T#^M?vWbP8c6t}b1q {1r shv%V.2M~/6Krs<9!_OLnndEyeK^/V]'p۽<ӽhB ti eS1z8rvg:p;y ce⛢-LF} Sk Gt-{pn'KkaN]}6NTߣDZT8:ҁi1iQ\&-WI>YhXUቕ=l)  AX;FDQ?ǏM=6q!u//ō@ sV 9h`Gxnt:3EEKP'kP@x*(R[n: C֡2<:Km#k+ؤbF.h!y;aj%?q1 nnwˣR8~/%;ިVbEHPA˼`⎡( .;!E'1?H!Zn24\{VgxGJ"b PUmU+~?j`LY&7\u+cxulw7*I*-ϱ7<-4f:8e_}o<`;:SljSUءXtgdƞɳ[Rj\Y__X]aQ1?FGE|NZZl*?*mK:kͳ62'kiAP;J-5>sٲ.÷SADI){ܒ9YGvf,6?׮IyL;TP  ݻ+TFElL z@fǁ~ҍ!hݑT9Ym᭴o2WF0aa8x0xyյvJb^f' ^2}l/H'K qeIdLJY` ;|/{uG Jb^H2r ^־\fQ'FYרt˪(ʇ Kd*%X]dlTzeoJan_*ϒX)m3[Ȳ?+ *d[~kv$7SD.  cQFgp4X͛-S6=fun'iɀB&  HIIA <<=Rųg'oy٧S/60lj_IN*̱֚F3~xU#G>ysf aoP rȜٿ!c2ryT' V(6̐>WeYZc(Gs1v'y(GE&Q7/4:맥*楜\b1Y|\r, 0}su`xTwb]mq+^\fQ'FYwPʭ7"U>xB9)Ĵe0\i &e:.To)Yq~<ᲚmV/,Ov}ͶΗ߈NA9 "v/ .ΰC̋(!d2q`ؓ F;iѥrECpO0;sz=K"d:rи1p9/L1~xI(\\剻A@o\z :>6d)$sV쨒Ke Я k|JqA|^J + "WBkD. NEbR<==d,h,xh'~Ұ?psa Þ:$'c|Dt][,,992p=(>Xԙ"M"4%" r%4 rᏟ))Zh5P^fޞ^g @LZ03N 4d` `頷㍣usq; Q]@\]5욓3   H888@"uvv};D,cE]& sAq9& d؉SQ~ztsaD^o h %$%v5pfqCAAAAo2D.@ш Op'4oK,N,NӦSq5Wv?{.l=  sAePG hgɓ8: _8hч+-3nH~k*ݫ̫paWs) 'ڗH ww}ϽwḑPws?VʋW.&:Z/AA K60⹗ I!(#ig> g4 >|nBPtjuRE!l("f7HGA.l Ga??oȋO^+ѾPI~G~rKa^ag>5]zEJMT_sMA6%sjCūQNRR@h5DX|)̈́ ǎf̂9翉 ljOڭ5yxE_+-Q'|w]4&:Z/AA  N@N/||Pd)q=@'MMu@;`qT".\}k֣D.Rʀ:FtZ=t?q@q8U=h'ӥ;ߵ+?L|+u,rK h4j:fϽ8ãF>8ڿDZ\ܑӻ# Jy}QqJ|"]0hk ֽTÑ#t9M$ CWʋWԱJKvuKkS}|w]4*JЫ׿AAo2D.YdiLNZK\P2e6Fà   ŋn(4yF8Cm'8 hKxGX<>aeCMKНTFKb+#]/OK#pc i=J*ƦGjpէ׹#ıgccN89t[*lzyw,mU5^oq Fh߅K1c:qs]F%Ę֮)R8?~"¶C2.x[!ȃq$ΦCX]tr9U6i&&v"<[St&/M;7[I c8׌K{)S3R:mI%=2vm )m7O5^|'Fw=񜴸H[ǔGssшXySG洽lEt)S 1ڡ.<*j OnɟmP6 |~M-<h^]̤gq >=~Xyg/>o.#V ݧLH7ˠL˛^D> 2!oч,<~T2fzk1ߤN^6J80Y|5ﭕE[?4EpT.{sEM  HDxi]*Ɋ!҅ :g'Myvр⢀D:{ >8ZPf=q5,E<Sc"86 gB)0LDnɡ |ѼlTPfos_q8IҽWA}7 %?=,Ln #kQ7}"X:Vݰ#x\Oj%qp t uT=-$:BX2ngc U Dg! L>r f߂F֯y0b>y ގdV}QۢoݥHV"_-jqd:9oдZ C3~~Ǚ//7Fi_Le Fe$gq8M0KuyfISkn֎XЩ%NJә.K۞ʢ uTrpsQ)ְrx20j¶8AA 7AEy:~ϞGA$#3^ ̸GfC > yn!$ hrjn ;QQHIBno-TsYr<0r ,_uV#W`KOlT^rJއ_#0*0v'(TVW Ihֺ}ӯ%i<3kD~/I3vġ? \Q)h_=_ &`okTx!O S@r7[+0uBQcY E]&'C5e 8f n_VRi[Hn7/%D&W[[䑭L_J@sh,߉H?vqQJQ8`g#lŶ/#:.!yT4 MOx;6U"s?g `CYغuF*tF%VAm:sVYsx<*=w֮p~D|GKsJLz'Z>8W ~t o oqnaʟOu7r\CLG\׌zi j~Ѽ-ڴy-^pesG::~>F;Zu_X*7g|k%VˇFA&"UcVHTl9 m6OF..|lSr1 wibiL >퍝s6▗P:t(,u]=k,&ɦ13V:cH1L.SէñI;ԅcbJD^+3/bCpr0\aF0lGRn*)=Uw/WHxM#K)0ĭ=O}z!uN/OWE~>ix^Y,t4A   AӰaC\z*gh2^7߀}LO A\#R[H8iÜшA;,%tw :%:T{wޡsݡX{pCn F1(CYsc0H\mrgaxTTki+CwwS \UWVvUǤwfa}Rx +v9^==VmͬAB)PgM>B~ۂAv@ˏ6Q ~7'n:_id]쯈j8̞, mgm)ySC(GCV0.P td3(^,f񵼭Sv=߭Nk`iXZX_VPSQ=X ŷ>-:űEXUn! fN+s=t3 dy k힉&2u_AWЧZ,OywѣAYx Ҵ͍ E=~Bx\Ӷ"^Z_too s٦#AY_tyaybyi*Mac4Q^q34|QCŶQn?&|]Lg=[ sD}.<\Ѩ/F FP"aUd^o[T@gk?X뚨ך< Hkb)eֻF OӺblYVw$xAq [="~}< {wz)L%b[vq J4K㘺@Vh*D&e,|N$a  5$ɬܕKWg-;g9J\|:JmcP7Z4x0оlЬicDW Z|DlybvHeR_k'MAa6nxkKLFX||ah ?ܼ~+֬Cv>^cY!# :V:Njɨg`u%n}&&ƒ)-wyd]VڅwO~96r3H]>E5Kz֣L5jf|/6vGB?`?$L6#ԽX>Aj ׃m7p-X\l-.Nx[Wǟ'}d@!Xd$x:u+WPLqpr8JGwO"^m+xf_l,4mup0L8t/d鳠bI?:㟀 L0<` 6T?"ɠv3vo/GvZn6...U|F A_Ɍb#:u*Z~r7Jg͛D#X9]MH_RC{DhV!f ,|: \ܽOR!aQ`]4C-sǰ.~Q|Wݻk飊AA %;D 0%.R5(-z W7 >z{hB&dG1mW E   x "rP(01t\:q8vP:pÊ[y` 0bF4Y}⅋0drF#}#DRr;}    .gNO\䮬J\Bl.u:&uP7ZT1ff2 5j*DUFXX2a6X.8/]ѕQ2823`by:nٳ8{ T$$$};,1]'cq\rW\;oh1mR 6`9dr,/!    '7xlDL=FK,DTV!0 C &aL*Bdj u&vh4#ۘ Z`MO"Ajj*N8ξۻ/!шo$ # A*B&' AAAwpd$GHO '`Ad3Hswjժö[R/y 1;zwNzs,Xfe" DFFZj,=E@P0LLM     d$'O:a=mBdyr[/-g#qu^(U*ŋ?T\v2$9zlF4o+HLH@Ppʗ+V ]jVa\.}V*DoB!OZ`#   2NAM^+c'ߔJ*4^^򆯏Tsݻ)8} ZZD&z,d3gA?? BhH( !s1@5ũ2z AAAA3Y0[SwhS ^>>O@hY Jޟ'GAAA2S`lܲ{!‹:KY\P|aQX z BXWⲾQ([ ^9{    ?HO1Ҝ&t@O1'¤]^o=ǎF)yD#~V>!>ƀrx26t=P=E73AXBA8>{<쾎JaR$둙eBVEA {H-AL0)nd ΜX٠aa7q/`L7cY{:o10񣾨cÕEC0h8ڛfOĤM6&*wEJZ/L;mMy2fzp%QG`jpW9쳲>9ѻ9˪r@߲vp$zaU#MvurjϬ@ζ!VoOinbm蘸)v?Z=-ίϓAՎz&7s4+N܀4[;A'+Wc]M{DM\cȥ\n—u!f ?E)=(~_inv~.nZ vZ{27v}n%յ̗ȖL6{ީ!xԩ.]\wo[uXs*R2oV7s_y`X9SYyL^]pȳ'}چl"76lkݻuN8>sօ^ڂ[{@o?xu9㫰8S]}}dDތ*cq("W_΋e[.mxg8Hn_zr.۟1özy*~qCŒ /趾=iۓ},vwǡ]zu_W}gT^7zgu0x~\7[vdZqg_ܔɼ+oak~ڛX~]"}۱*Ad)Px \]-m=6˔,lA͂/YeA˂ ,P`BY(BIJBʳ³,DP,`& uXBc);N%_W$?giإD vJt[`9=q+3X% uO.|qk:qg9$d|dJ cW⹝x,Iu[38&zߙ>_Zh&^7l*?fE>n,n Y~xʘf|}B<S5_wnOv,? ngr×yX_8);)5%GRn[?jΣl2߇w.S~6y>r[qgM-N|8ޱ vx㯲ktmx^7tlWnɯ5| e ;X?3];S><֪wWc>edsBg$?ۮۈ-^trԣ$A~W啸x_r"m3&#ڏǓƛ4$$#) Qn{HٽN_/R &,YBD\|/%Q"i KN61gb` EE@_0vI4b`W Ny1;:A@4Ԍ{!ZEbcM❣*]c&` |m6^f,&e+M6qthb|ٳgcKUSXsCFy$[7__WsjƄ_>CU=g m!{@8ۏ=gҟXz1n_U)v4ߵ5GV/SVh'>zWNatlvIBNSV2b$Ld+G/1^|u6=b0Z_ӳRj߲e q=?Ѵl(ղB]w] LcϹ%ֺiH:È!q83E؄LJ_؁g/oa΄ Wz Î1{z$Go,o$/ PFš[ry,L)X^5϶‡؞)z.PiAi5K>10w8ڗBQ P˼;GEyA]olk|eĖ#:8NJHx"n>{6̋ظ&6(QFB"} w6_ZGs}Nk` vo29ëA`e#ۗ8;7ƈ/ː󆼌b@}"CD=+wAO&d$[YP97Q!( ]fg3Ig`rq0;\d n<.wlMj['G4-aj;:6a9rQDz98S(-, gYT/6j<Jxœ>?l@m;kV*4#(15KOA`nm O _DK N1?R;ME⳸4DD匼J5oS?WT^eZlܸ6S3:`is8a-)>j:ƌ~ IZ qKET֝;j"T~yw@}mXZ7}; *_!ԗҳ2A xIeC#`ycjԸr;zfF&J>˥ReGn:-ǴB2|9ZPh%A||M|5(Xw$zx/ƵON,Rh)YFÉ}LZ8- [g@̙$c+a؝r BOƎmXͼU:[LF1I 7.!XR˄EϹ|1>1ak,Rϸjkq"AP߾&[8ڀիVa߰u1[شzlժmyo{gzڰ ?n]gchuHAI64*Fط'uz%qӠ )A1h7.9_yV3D#0#Jv{C}޵?񻻮p`M\Tb܇X*hӶ-^Va8 |AI4%$L, x^AxZ|v t tIVX>L\2H6U4ZgǨQYS`|1]aMQ/X./,VGdjLZ-6}荛jo2z D5M1ϫ(UĮ!%rjt8V4}Y븧* >dUcPve 9fh-6cַY?-!R퐏jѼ-ڴy-^/p6OFS\O,mwxB+lui8K3^ȳެt(hYExe8`2 {RYJ<*D ~/&z۶3pN2 )Y뛸~i:֞rc<,:2m.7k0͕ȐcAʩڟq_ngou,טt;X׭+.py\ݓwEϵ퍝s6Ӌ.D/h]aW?G==OmA0P[= k~4yl.u'tW\dCAF6!amug 7AA 'kwQK`2YzsY<5nNZFIFLlYuk]E6;W.D#ƀFkE3BܽȼD j:>9;̊T!2uTyîޛZcZ @|L[ul $o[0aש{oCupQU} 6_ uaD< #/bn̋/?M늱eLxA>sxmtw&6U]heylxbԗ ȕ{⳦&|ߣ ?l@jJ|i}ڵAvjxy?6Qzz] ؛i|_tjFtBϒ~VA)WF^ȗ%7f2ωBFbojPE~6KI.Áam}zxy0z4"xŗ` X,uSa?=?meD𰩨*vF2m,E oN4.#Mg+DǴ@4;[W %RSGN*G"CU10z@DӀnmF? \U5~C-?%l>]HʪXBC0,:vY/.WʶCڃ!m?CZ<[ʑ*h a=Ҟڻ8Xw!/+ENq pzPc'h"s+-D%eX*x6zePȝN.d'EB((Y kisD3ꝌKm*XmF(rY 42YWǐ>diEOeEM**UV_%sK@SS#0B.DS/TJbYJ܉v~i-]#~)5.z#c]set>nG<;ޱKbº.{|_ڦ1gԸ5.32M H]u0<׵BE^(XYQ.F͟!=0u8n$'aw-_N7\BVɹ(xSynBȆܳ?ÎaܠWDw9(~*˶g}iu:,?2 wYewB_h^vM'?mCH/vL/w?mK2"Uڟ+ SnEVpy :٧ddsWʬp}ap=FXWp'7ۂ;twugHEF" "Aܺո,dP%GgA! ZRhҌZ)AxvhB)ۙP-DAte]gj#qX!Sۭ[vof& Kv߽ѹq) Jiy 6)t>%l@_s "T/Itixג1ߏ7z,zBX~.۪@PD+8*++>uR~^,M-y֓}d^uU”"' [WB }aAģ<'CaⓈQK=8fam5߮R*ǂ& fZ8'l`%^a ¯)֓ q];YUs)&qq7!h I+ pHZ :6(/O!D±a^h*~ی› ,\j}I9U2ra~Oi77= -BCCr2=r3YAtEA=$aOtd2ndC#ggPlNSXJV*/Ƨ~TL) J ;N@IAAA! A|8\HJ%xN98*riz*Bs",>$L   xĐ |Ԍ @IgV@b6`60Y,RA(m'o e\Va)!CRb.?tideyN\O%p^2byܜx -v&r|Olv 7TkLX   1 A8tIPʥ <y f3t(_vzR:8s^Wt'|nl#'ab̋X4j^>n^M[[׵]yN9awcyps^&3Cj-uP^xub&mmE>;q`ۛNAA2UÐǭ;Ix"zff &H%ԄC˾Rx'Xzo KVV  Ɣc ܝW$SV Sw>|r>"vK[/;E3sCS3'  ? pL¡[Hl9z2UplzfdR`YLN]bBW+^919n|dx+&Y4vƁ2ܫ gPqr悁m2;bD簉xm5_ϳb'Ǯ7k +rߴB%`/bf]F0>?4eǮ42G+N*ÈE9Xʟ~ ϳkNEx!Ɵu5E#@aG[V:>EV5][1%//5yuׇK>[giXr=q([a2ѯ'~?$X6Ǜ0ӷdîq=s yۓjM߾Rus0]})q pI?^VޟAAAd$--2mCJ JD|/`²el9ׇ\V]3U/, iİl_\<{{[೦&0W%UܒGˈ)>9χ=g5Νݎ/M=z/ǢqlP,^OA%+oA2oTm)0 j,ܺ.}#985v7 >m!q2e[2Ps[!^WW̘04v:ZǧbUǛQk-c ߞ7+,j>sD|Y-l!< \oښ8l9o :-?b`Mulлa:R^[~f&g:tQ,__CӰH'&5q#f,3ǹjųdLٸ[am4:.4 ބ6cɠ0:   8d$ !8|%B@ J@ZvSp7# /FDPۇMe-g ۰-_@X)>kPe=ѳN+mQks= ͻU-]=MzfKb> ,Z#soqq簺~1n߻R4GZZ]r iO]1;AAA ɘ5c;eMpT\J,E& +gVA[|H1j٧GaSw,-!:Ն4FUjF>\oGO9; [XY5TCv؛XR_X"" /YWlFnҨ\l\aˤq'^ن=ټ(ֲ Fbd~ϵ@iX5f:6,ߘ0h u}A]rw?D@KX`'tV}蜗¾p xb9n?&`M9kY>.Pk 0e='>5Th\]{yz)qt =[Ԯ^n]Qx~,]7őriEz?[/ѹ\ҽ8[4=v0 ~co[:    h xԃ7u?W@اO NPRISw-E@v,Ûͣ'UϾk~hMjï* jMz'fC X.FlRNk²Zt}7z-ÿ|g:T?.e/Q6OZ '/4^u`DtVYڡ#FicV]f-ƍE1>[Nc}( }c~’F¼Z[} ~̾*Zb̡/<F1Pl+!I+/w]G;w-9'U 8P&yGO>N   ydV^Nι]g-$.>o%.KI]l XBy 뇻#0XU`pW`!)٠{POn2d Ҫa鐡Zp07V?uܖE̳Y[hpsZ3%zFl#Ce#&fkz}JCw/y   c ׃mYW1ۂ;twu [\}wָlɀBAAp4 HGJAAAAO؞D@AAAAO/d$    2AAAAS     ) AAAAC@    x! AAAAA<Ő     bHAAAAO1d$    2AAAAS     ) A<|!,7ꋺSrܦ<um?FOM8<O^C6h:^|)YWpJgzw9ɴPx}]" 2dqVXjznRCk=AvU]~X}pa/p/ha vg=u'"96fyK(6ZwhE.T, Ks=nug?F\v?LuȧS֨|> Zg->6(Baavu(GA(*ŚlB>+L9I?k &t}~R8΄՗1XղcQ EXI+q>p6e6[n笟:V/˰{SߠْhS L}.=y)bز7xSp EkqlX=4{ Em;B/_rcxQcGwıN8c^<Mӗ"4ƪ ωeCf~u!^v쫖 Ǖ8iL`?>c-dzic xH?C}F\~\!Q;fKveױBK,"}+:ۿY= "D)W&Ua%1J.FUNJ9);OyɃ'Oe+S~yz<(Ox*SIJOxz cD|?CWUvf,V .5l{TfVaQYdYf{,տ!/[ٜfl" 9<} Cϳ_֒hY6lj"_kB~S}]\Ϛ8\6Ȧ)뺉f"{G<,m>e!] w [-6bcG :5¦qKtu6B.2>nQ>x'G0z+ώLG~zbE)fdv%c'*k&Kٝ(ʖqMfپ6id=/ggyR\Hrr }MW]IKctmC6ONfNNٲl=6^#qm2X/sXuxY}Q߃;B\f1%dW ĖĘ[D_8,'-ʺ&3 Y/) gyziWqa1YƎƘdn+IAem.6y : 9oZMYz,R4vi^sQږi/sk.eE #gg;uֺl D{rNe}sεdlunLn*?e3VP_?koƜ{BQS1D6A|i1ߤy8ܜ\i F? ìK`KU>q/,tkLXT= Ԕ䟀련=e1H{}wQuQ0FOE]  4hS;k۹jVMGPWE $q$l3oX]xBɯOl˪, /,`kMF:ѥbxByᩆ0X+_<s4GBSg-ض>]w¥!;=/Nbn{pV]YMMf)Y oj2#EWįS*+񼏢;o ƶ 4lֱw:\o1ӱ@4:aM oكX#  Ɯ4OAߘo RB%h5~1 or~nL' BCqZoaI'v({ִûk_!(L1{ _޶zq(hm,+k37X C,4]joO9h<[:Ga<(˯QX嚣5^~is4<' &ńeV:*>} g#ӺjUJuVD=FuM=e8GCOUۋIPyXT6iE7^Tl}Vlٯo=Ǡc9a{eBprb0 fog M69[z?n(,{FePn })S/PLocnr[6y;bm5>nScWqW}XQL Bg04/ >Ìi*",BOɃP׋zuOBhy;G#܅[0M0!2O12 YFwX!h~1~熇C{b! 5&"V1GMm~B{`p`_@-a䙷NJ' cJ[u{ADG ȍ+E+)cмf~11x.|2Zr^Dg)sU[릟!i]ypTJ("K;}veum2"(:8jBx4'U'`sqmC/SUE#[ 3;Otj{/[#q$* FJRP$o@ JK4s 3,w R^mts^frug\F0d+%<-ՆjF}k?c,c^(V mݨE[a[9p[GF\P/77GC:.aЉf#Hl[9Jƹ ZT,B E3_{bE,)]\lOLGէJc1Nla'03}PW'E7v81+{5Is77ӲlewE_}峋?"AX*QQHmwxg;WFcpF;IauG7 :;goLns^Oj 4tV!# qYTnW-,v/?]AHy*Ɗ-]AעAH[TW,"MWloK_-JwF]z|pv+MׇpU|a@t:掎Ou|pb+jawm0_s:k q *T 8Fж;xպڕ pIօR &6ۤ W&O°QS*ˬ-cQuxq26 L1,|:"`) 4}'|JEFpCw_-f/M \ w8 K`PD%Xi'pe4t?uէ9l=bB D|֨Yv㞰lV6;tYu;[<'Z8[ClS7~ՙ3 e[YQ1hZ}|`F>!WGVF஖O@/G`<ܪ zDuK~9U8wcx71 V&6^| Xh*@vD̹&N81jX1I=[_!ǻ-wUG niD?q{ܗS.2# ] >k+?2 M#iq'[Q*8uQG\?j I&N<}6kwFAHM00.( }u-UW-ao½lU>[Z|'>%:%}y[|`~OxԠ6Ԓ]{ CcL٨ B>} qUX7:ԃֲ.q"fkC7b[ yʠ:kWVUĄEt9ey6'rp1O͹Ņ1š&蟱@VOá;㥟C*~g,n-ރ_^;|!)jCٮkڸ* kwלu sOj[0nE=F*Zwxʛ:vzEoPkFW1ݺpgyn^VJ^a"'yضgPOEHָ&;Ȇwv-e۝QSGB 2aY9NBv>prmq7 Y]=bO`%1NcG\^z{\6QNiQ u1RaQƿDXZW;Hзhjd{Pc|d% h EaZd JVbҬrg6<8+.KC;k}'' T f pbhiH.(ŌŲʎχiK6V}W.dlO,PfҏT4 Ae)baGa8-J1No>&ʭ\;z/9 o4y*bHlqԖ,n!:J?$&D,\/<>6Dzۙʥ [Hv{)"6AӼ &&n8ڊ~aЍU[LkPq$EmBcWyLyĺ@Vh)4;߻X;?pgQ=ff{AD@!ABU(b*l|R+_Xbvʫ˭Œi7&R0-:f"=S lҡNoH : 'Zj52y99+-OJGڤEzaYijnȧɩbDt+kx0,t)ݺMҹ,O9;Wf5JGYmM?']/0(f ~dy/_ Oh-KY8?糨_e̶ۜma9ʱ[6+۪g ~>G5RX_[~JxN[Ɩfdms:ζ,ǐRN^~͞pMlo9uP>ׂf[_ l(Ʃ-e;ie;3R8$n(PTᡝr4،l#O'߹sl;۲cȋ ƍwOtgeO:~z~k0Q}wB  r5ȽK; i;"W.,w9$Ard ?JAD62RAAAAA AAAAA A< lʃ,2S:~؏; "Ed]Ƥ^>ПbO1rP/ wǥL @  1HDRx8v Q9FcVۍ!SFaMu΄_MXB[ّnvGӲw̱{@kt ځv=W/_[ǡ-zNS;&j4 ]r#>CAA1h \ wW <]m얍CFr"7:+{\_o+gmn=D9ȴuc|^Xt0NHax|;X)je~Qq[@j`wva{G5Ո;aSP[*ʦs#F>4d,!Q0Qn_RL 6uM֗8V[zvve=*W+0BlWZ\0pNAX.z'lj0ߖOŏ$,]ve   1Jre\VRb\夔O<啓'A!ϝȕSYd/cYiZψ% PsxyTwbFu59|, `iҼM(cv r FBk:Ma}_`h<]"f`p̆}NkjO0ftR}OH΋2mYs+ E憱H?9 m|]llM6#k/so8.DlPe#Բy[ήNiuŞ.p{U}eb2h߷^%!i/9}o6|۝DsD1Lu\c:,~Ǝʺue[]&MB/d\>Vtك-v$3gZpaa3oF.g'NG>SX8 e|# >8F?1<~dC>.ˆ};%>1X*}㕑 :~HaRq܆'$NdIgKO _GkWOH߿3ݶBd,xSvd   ̃P=y~TS/UOT9y~UZo_EXAy~/1*K7/qd(,X7v:]/S ]yy_ߟ[VړS߮ , Dr.fw4fBP /a31R]ڌdžeW3dO~pۨa>SA"˜hؗD"X/,MeHZkiJqYm(n:jF N_ye=TCky5 Qyh2V` )Z<ؖ   c AL('$6oiu&!dj``3 +Qp0%?omk{_pO!am/+$&` Ӷ1^KQzg  кLި@1TA[^89NOW݂6sb"|F Ynwέ ۇ6~Gl<KJל_ON/a|֨Yvզ"vewu'iCӏ2;/0S} 쌷XLx; `CYx5z,FN:3KG&%%q-M\t41dLPݦO#vh ڍ:hk:ueX+O#-hSQ⏿}`lO"tP%8m24}[W5RhѦ\WE7 qax~)BCOHς|/c zc)]ۧ G,GAT۶ ,f//W  ⟄ (0cmOⵡ姂"_E i|\„-Wכ"a4]B%6{kar^n| &+0@^(x5R_CEjcKqIi66]=v0xWxS;Gღk@됩h/Z%``LIyR}l*'uk.wK;rҮ<1ֳ.~Z3M({&ܻuG)l\şEM[)FlsEǰ5cKgVhW]en"ih> Jh /ˀp/n \bIw#~蜄uJ&&v!tŷ~$}XB)<[+Mݚf@yu(zPR e60]sʴZҾ< ,#o_?CA.:Q__|4ZJ3J 彮L?Eώch }3L,׻{+ 0cG][܌T7KT½"&Ĵ]W3v£FܧnG硩7F⧗AANS \ {*l|R+_Xbvʫ3cʫ{]ƯK_0--WRAҕ'T*U6 v'  Z\U+@C<k[/N&A߿YJec!SG_߂qLn@jD7{.l;AAAHAm cCHAAgAAAA+ -AAAA+ -AAAA+ -AAAA+ -AAAA+ -AAAA+ -AAAA+ -AAAA+ -AAAA+ -AAAA+ -AAAA+ -AAAA+ -AAAA+ -AAAA+ -AAAA+ -AAAA+ -K"Z$4 u'aGpq;~؆I;%aX@cC cqWcj\= Vv +Bt8~QC_KN@lu<΅&|z3ԙ?VbHj%o %C ARJ [SWQ~6A'$As kߣCǡ8%x1m;czl6'1u Ƌ#:67X 6W錰$]f}8f)*8MM[#zk2juqR*G)'v/Z+ߙ)ϤF_q+ɿ C A"'PT _( _hZ9qĀ~?_'Am񛵉Txrd_e6яdt#k26ϚȔQ~u"Nj(c{uavstLYM:?ꈁۮ>? ]߱@0RlD{gO|%PBo],?o/jrVJϋjWn   A c|Xzt8 ݘ\'>rj+\P(-k_}ʗѩiNKQA[l4[칽zJΘ0T6;m)Ӄ,i^3 xBx]q:}˟;Fc_tJ- Ix*ڈV s#Ҏޮ:Jyxj-YS`xw}HBK] dNE, q^;6EoGcmiG]ֹ|ZQcȞVϿadF;Ex|;xO0^u0be ^1GOwƖnr}lsawo.(n>bdY mQ|4ۅ۔Uj˩9۶s?:@?{%~|1 %,~bSvTٲpu>> 3J/&$,۲|CWklӯo͘.].z}o k_/|moY8b>nmtǾK` g8ziطWOY`#Ij1gilC-5ءdg>Vԇ#~d}X' @z<_*ϟ*r<*.Ͽ_7y>)TFs>wyF|r )-`n[-h4NrU~|[Oqo~0CŋZ{ 3c0Ta ;{ qYx5"I^vYŶ,FHiahO}:Me˗/igc/򼳥y[8|di6a1ex̷b@ǥiN.IU.ؾk&^WxG9_8txY/ #DI<ѯ`}ҚEy'INNmzMfx,oKfR+ĤQlYtGc :^|[DFOIq|J#Z@JV[ ȕ+ہܮ(Aa[l@%w!@nƯ ^DB?O)?GivbpwJ"{732{ /"on\~4mO>)>dq֥{$pUJ("K;}veum2"(:8jBx4ncO,qD}[ |F9ć&+ݽ-Y~PNC2 2ӄ<#'?(Sl1Og$KroEuk7D5Эkr`3ߋZbgC~{-QOtΤBP}g0l!(Z/;V#`7C P+ċYno%[9Jƹ ZT,B :.[Pd ׅQ>_|MnmP+[@I>GHyj*Me* .lE<]jlkL|˼ bu5?^j3w"QrJl! u};1 fՆEʾ[ +`%1*]Jkc+X5|M6f~JQ(")P&W 8Fж;xպڕFHL.B^(&Iu,0yuoV%y׹mEaAej ϰ~Sb){0 xKuR“l"/%xýPekTMeqOXHαcc(%YyO)h.Qcߖu4GRl0:AUa&PqEq"~jLPu NcC^XS"l^M`}{SOW㴚񫁁ċ# m3Owa =1fƋ8 MhC݁97{7Чmc|bqE_qV|E3 717p=l, h+z[av䱺B4qz~ RN3Xr\?q{MF%ŝ|@ز-Wwb<\IYN;1ݰ,eDą[A3hmjOυb+Lʷؾ;[V!ܳ;wuίfvBd,lX=qV'ۂɧ./3^[}5M렏̨2[ ;cC_DH |1Ⴎ Vr[hW[U1+m6qKq.! D@Ӯ?Ⳗ]CH8kj|Sa;|ʟ1 N⛹]% ^!h$%nMG-48AnHύn5EKh#=3n8Ng33q۟[g]o}xj,mT6O6_󜑞Y'&*ܲcr(p#С>a.VW[Dzmg!eeJԟc[gdD4ӹF6y犉+:;{|OFP_9j-uMOc3mmt3]ZHߋÙɢ|?oE2e7<s42G]*/!zv!6O[gjYYvG2nB/m%?mw 7%5s՞lݭ4 0>OX}&Z/Z>:Y-_󐡽BQ{uä>GGw E|yk o+fj& oj>Q_Ob\36o55V 6c'?3xlkd6w7Ģ~B[y]#2ƅ['vV ymĴvىeǤ쓁c%B,llܲ5 EEЄL!tn<6OJYMCF.g0`gmĴ}@nKOzdkS}kn|ʘMt 0L)'BBƯ {s*$ﲅ4zYo"53®84m&3PvtS4BNuvb?y欴td@ Khi uk4kQTʜڪr:C/ r_mYGvuZQM7v^xqYqg`CѺx{<%':jY;XSc}9?l) ۫|bANa]fY̎1+u 6>{/o kq%J'A^ 784MJl-d%r(5eKkd8-+kﴝ$ â,\=Sm7;9^FG[+=V'iɕ˖a_QZ:/y> 糡gq{=_|!g*_@kU'9)WMѽ36F XV]/7:?me8cZ? qċUXw53%TEp\8߫;YX7(YA~f?Y5Avyi aaFvĿm:R/ Lvek 9똙>8+K'jXe, 0-RvOv*cw q>9u;Z񋰧rٹз\}j} |>^&ʸW{qu+٨y;E3}axr󾀂yQm?eOBIZNl>FvoĀ~?Cm'7o9*|K/jQA@ r OFAkN#gUک4'S`xwTJ=~bVG6OZܒ 鍡x|yuyvIOE*I߻Vuzwjbŝ)^3ch=s{+,;_]$_|)FXaq4[/hpirDK¾= 3+LZ?|.Ys6R-rG\' 6dXӵ-n;c ?i }>g*cŖBBxZBZI~s|VO}flXvNX'M,gWt*ژkKQEWMCMch:G{8j_e#:5r{ پbir{aGb۟(aBL4W̨'~5m^gF`BJv c v$֩SI,U3&%2mm֩|uVUq ]_s{PdXfO5?=dW--vldž{G2aSb}9ݺ{eF~(üp&kۿl^h!f>B?&"sь~YSsB?sA\]^muU̍M5|Zf΍N߳h8<1%5s<<s Ck7U`j'UJ2+LFuW}s/pTOw4i6|"Ỏ4kgϓ?ӾI{#JCy'5:c[LnN>ݜ]δrpJ_K~ɛ>uPyC3KGZxhuϜ;\/|iN}hyPZo97S+Ӳes'Ǎq+4Ϙ;vڬc^vNz52=g"Ev=7ɾNXA7|KQCUy=b27wk<9\d]7qr1뺹}Mz123ZG7[fڼ{:᝱2=9YB׎Z˼KUy:\zrL:cى] Oe̍[b/|N7ꧢnt}jku;uNc^tݽǘZs^m+V>:}k7·s;ʜ`5w7U?F9|ڹZ~6ո~ysu};NxeEƅ;A tT^ǣ nCCBSP{jPjP{C6)>+ ךo\P./( mvcd{F{v8t@0UAzIZyQf[I5WnyyVw٩oʥb]7۞t̺YIgy+hite_+鷛Nm]x=>=G}yktNzR&>1.;;=G~Ikcb)Vo{ىڵU/tOߜpZSW\J^FuU} 3Cc6;Oݎ:ցôcAv=e&Me<^c(͕SK5e.u{yuG9Wnmݻo{U-omM|=Sw{fu4Yt5Cui rtDgM JFsK5fUzn}j5F7Qnܱڴ#~[ C媷h9X*ev/syo=iRƁYR*˱@!P/S%sVy NaoEveT-5\{ԩs+oӾwn׀ejۿIe5JEyը\wOvM>)F R9W&LNJ63=]>n|Xkc_Th25̩j)eWZȨղh[U5iLЙ' 4˭U:k@; KKSnmQpiՄROrPvS'S|;KCF&i`O3Zp?*i$T 4iȼ`_W`Pjǿ }O >>:{vpx&XWguJA:#ϽB>2sz"|U)btИꥧnb_ kZor,y.]l-xDQ{;s?foy$6N,H,TJk`[>r?g0yl;T/}C3ޝ6[#=ؽx{R9aa9oZs*NnC >~K?mzu ?4J`+Wpﱚ^?>-=iSӿ+wuLyP)[D3zP:{`wC'+g-We>y#4_gP*򵩪QܼO~u2{ >#V/Y_Sg}*PW}8<_9TYft_Vt:whgqi(|0X#yGJ/:9ֿ}.{w7O?_ *m\֔3W8x,le>!2W>^[6C a:~1dO]rd@o 9{WYsW~zvNvV׼䔕]޿,YdN]M[4M^gr;[;؝px 4T{\swPry1{]Ӣ~!W ҠÏԀ=O'ޅ՟g[:vlCx[+z:guXhG {mgx]7 GͿaY>5suS`Cr>C3L1~U]ԧmn~4{{4S;,I\Q:p˪q3kyCy:O5j'j5Dy\9?}-w5];S)s?zixZ;C>?[O_2(kBN^Y1ӗaT:Qk\3uҝ띲Ulj5,Fo:OY(ocb5aӕcvl唹Gx^cr.וoYG(g_Zm^kwv灵: y]?]]Qqh.ւtQͭakΫyX#,V`Rɚ4B ko=.]O{gX e=)Av'MgnC=zhIti:O'j.jA zH+Vn(TC29jm vl.[U}.M4j{*o;,+' VX_eO~v0'3ùB/a Ȍ2h5WWyo?F B~"O?DO>2224j׮'Xǎ]NˬfS\fJF8SaV$UbEえR﷿63Nx^ͪKG`{NrN)ڿN,P/ioW_j[խ[Wx)Ӱomq#">T=T}~Em0d:ljyG]v+Rvv{oN0stϽS5y ܥ*ϘU3<3g4E}O<=wO]s*+' H{@ZÚUyy= ./p^aV Oyy0r t9 8ӂLEw` n**Cc/3+Uo?\ aI:놇nuxTD ++2d'pE_[# sj֬o睯qj e?bup0< /ߚ1RՍo; ~.iJ.RϨC=goSW韅 Tw-f`~}xhoz1jaxx~0[ĝh)`y{g[ZOS8ꫜt mi~SQQvߣsiV8CO8xԤqc4o[T qh۫PU 7}:IUn#S_zw:%G4wO dwE Ѩ-y7o6>7#OڗV1tj1op+pM|xg,zF_z6\}}hգGP'^=q52Z {Wq5~O{uzGtdZk zG9ӝpξB=ʕ'\Ge sS%Vw=>p坼=MK5I&=Ig}:*,Py_ Msn:t =@ڱ{辫vʡ1#*g^P6mZG7n."-^Z.Yǹ 4xpUeS.T/#\:tp w^Z.x•zum0c<]Oezg^=zuuyK=wx_٣jA1?Iοt N>oeM b ~Y]yϵ1)[ m@`}9xt}>P;kץA/QN+d*"gGiU k=i}pGWR=:ګUu\uSE? Wѩީr/99q}S\~gܪN׫oOܥ1-RT-|v|3_ѹbZIUV7.т.%ܭWn1Ycu>:Eg)YдG4iX_\&^Lzdwfג`ymbqsn9N'A>,XǏ>Gǯпq }C'ʷmhŊ| -UV+?*[b[dC"bXV6 vw"fܗTv)[Y*7MAJf;a--{-:ǝuWH/'P?Aܤu.׼?ܹu>ܥ{Ʀ{뉅_U`YwWMvVo_{ ^>غ{?"_?rD`I @pf7_{hCԽs/:>ҥ\/|k8g[ߣGk{'j`.ԓgGfKN.;=Cysoli3~RgM-w9L<`4Jޡ1#||HGi<ދ73# xثWO :L]vQV߲*#,x럟7h|49};[.@/,{@p#f@ոim젣yl?/ZgM+ ls^*]̗)Pm6JC=ʝ@Z-]:]ՖׂUgj_:ŶtlG:s5k_+^yvo8c52˝;`pJ~gfJ32nޮUس42'2Jɲ P/'ĈLdl+76atETfڴ ޲lށݛ/nݺjذaԹ*˵yo;?"oki4M/WW~Ig=6E]\L+O.2Uɝw[; BN,kugv5c3_:pXPG{E<^l[@kS=Zy!J0+-qƥ:пhC#İiҖU)o֏|$ ECw4T4s4xxyS(HYuI_O2noJxvĭϡ|Fm N5atzױvp@3ܫZ< _ho? ~e*P\,jf(f(eBN>vIK_[1>-=vc/ИsƨuڴD[JKV^.Rg_+48M[gON=n ;b|):sXQ_Yfg3/w3Q:l9vcϷ}}P(T7gLg4yX]=(f}%f:oWkj\vqhJ/Tˣ&i7h'kFhZ z,=tU:Y<@UGh63OӠ?Gtu+%X7|J֔PcNyvLOM8BM@1 YYvye9=߽"[]&b]}0NΡi\.EwKԣGN> y&HӃ6wxЈdG3\gFtڟ\_~x_oƛou^jF߲k$Ə\kh;:o} _3|rZp~:-XTFv*ȍZBK7"doUypOIfKrsߣoI\>eɌOtz#]Y붔+QS5Ί *R!4SAnfeeFd z㴃tOh =Ua*YiUW` r2]G.mCƍb?oo_/\:t$udkL3%O]ƣf16U^^n>ZJKhƍ]"0֏~ 6Y}MMz([ 3 gkTNs0R@(Q= _-Ñ_3r87ya"N<4 19C[+hoX_,Dl+vzqVrk0|w EG_yE=w)pzقgesʴqeܖoy5q34?/7i빌Bvt˿vW_{MG~'H[ֵPK7|S|_.\f\a8ðrm,k/gえ@p(uk] YZkfy("f3s7+BA46*=B*ܿrG&oV3 -s~lt@; H[uhԡڴmk;>_"R؞abThLe5k&M h?i L2ڵkN=UN?4u~^]Fk|n0MeؽBxaimEe:m39tFv _999=8A;Uodطwΰ*\1Z\uy{ Ms͈Fhnۋ\5}F?ENPyرs8v =;Hcztk=TFmzlu3Uϼ C:{XYn"Ur:[eX˛M[`#YWg?gfei_^YG I*DTVP잀;u҃_~ Pݔi*S[i)vZ0Mg̋ Pxome׬4?Btf*@Wa+BFLi-wQvV?nֶJ- AF]=`v q#FF=5Ɍ=3ɵ>'n|zWUTT^z9lѼ4nF7ն^Ud]V?+5o^Çuc.ˬf"ߣ?fk<2`=r5`@Aڢ _"o$<lCvo?,Z˖Іu봥ji~ZI=zа+} lm/,@*xL*(غ젎>H /vdP@+3ƪ]6@Jh@ Rm R*Ѷ$RSAY jVm$ P7׫,   vmS@mi#$^Q TDnL|D!^vy3̤`~K<7H@ J"T(%>jV ~'S!>eoXJqhBퟲP{Od\t@G P_u@Jmc7kXn/rkO<{uHE.ҖaHӃv 1#Q>.Q0e OO gG̏^v aǫ ╡|z~ok5=nw.E.O%a 4}v֧$4^1?pٞ۾c1ǫ a == cT$\ICcam~^nߕ| X?f- ``^y0}WFm- 2v0<S0V^~{xT43/Vo@^uѽzF>˟ߗ.Ui Bi$0=mFWbbw=Wp5 $Hy8V/@[qDj +dˏ=߭w_^AŘ'tA7r<^9TԸ"yUԵK_Qm(> h2=^y[ŪPݶ%!ŒQi67)jזId_-}9-%86 ,@+<*dс`F2/(v/Frɳ4[5-^OD{&:- `"LyC{B"4| z݆[%jˈ1M =02}nx{U m|j$ f*@\^-C3%xz kEiv%[e-72V&/Oq%2@bD'WO앏]@Z"{G[g%@`m^сXݞ' vJ}6^ &|@? +Fzn&Y@F]9?22xo@_t^ @ umd %{[/Fן[cD Rq)X6: }Kp`on=nw;@1.//(ֹHOڔ]i b%j$1kY_!~d/ۀ%26GSȀ@ B[&~ˏhȕi-*#|å2|Tjw@0T=+9MWm_`i}#p6hO@ށX֫"TU/0<*Sq"{{E]twi/Z? x wp/V/| )/A!hItHBs y=O/x@a4b9 ._d$`xJce4xѐ*g+V\?'{GdncMm8%zpwLU@0^@3|*C^"\\'7G.YR`t0֭X|;@ݴs΋=շǻ%8gE?7)._ b_c Io?/ͳ~%,@$^zcy"}FJPۂkKv`[7-g&V &RF,o mD} q}J6/6z-D௭r0v@'\7U -XJ>g*[~ !V~$[m 5ҧȼTc'2vcU>`4xQ+=#Exc7SX?qމ35-](f"k=V:bL|R]#Z)Ai~nڿ[Zgqirݓr^/ǨހY.rͿhUy2~ɼ +H_`|LWPvK*Oyn)8~,/"\qKe0^oD_H"qk;uc'twڔP/D}n.n N$~zy3q4$SVI:k }mT@Z ^yq"L:TϠrLm `Yu+_Р+SxKysqmr /Y6{K$w^!Pn J t yw~y(Dހ^ zצLh#k/쨫4"GDmJrZm4HP*<#en J_g%I:fͭ0--h/~[pɗȴxiL$^ )j$Li 7-D @4HrxbMbMSIz-8x2=R#H ZXA@)5=M_0r*G~ȭf-KU<'oo@ūԿ6LmMe@k^]=@@4 Шr^/0>chlϡa#A7WEʌ`*.T")փ elLEE ȦDecݺ^nr _ M =6LT44\-? IFJ&Ȯ\VZT.$ud2Wz`~-Z-b: .Y]dAIrDu(6GjP, Pf?/?[`?\'Æ2J$8 ydwŶݤdW(|@0 O@]B!CCoIG}DFB|%Fs-0 "nW8rSKx[OVN}DT {(H>20C% }I &M{AHQHF ]&{]| R * Dמ۬`v(,ԫTbs>Is8Qyd8C?1  #m-7I:~,ZR}K[L]nDЃd؃xWbj>M7M UΎ*83ZWW b$@21r,v1u#R$_8bvUJK\>gԚTTe($h<@U.wFIcZ*ICp gBb4c{0PVkh :w$wxN6M 6 x}w.UADzwF<}IǸ{:*ކְqL ׁ?d M6O$;j-AL cXJL PUj $DOԏzSvxP|oZj VlCr!pó7B !ZNuTA&бO0>3:y4J5 lbb3AmuURzb>r m I d1 ^&b'x" Hdg@duڱU@ f :1h'Rm@vY%S*jꈐ]PPL45EGrN@".S x?M \t&^ ̖!s#_5=6, #>L[cn@ɣ&8cѾXQ L8D1$P,-ԶEX%1%UIa$ A%5֢ٶ n]U{m`c>i~ 3V|1I0m+Dun %Met LmPlx$%mF0hZvwDҨTǃp\>MPR5al[N ̃,}VpTIPJ}n#ĘgLD]+ i LRWN .%-߅c0rk4'縆RLCIzE-9nЧvv^0u˰f3i| @0YtwQ+r69!nyk߹WA)kQS̊hLVkM$~!أsY.> lTUpGex0uVjm/?Փ`0T^:$_m O,EO `um !O02x"J7M# CN jQ+'d(\D1@Y̩"a EDQ`/ߚU04o[k4wv=[DB$ Hm*7ycdh=/B{iܞk2,oѱ> HRPAx]BYF u!۴)6$6k.([D^TDԂI Ս,5jd?ju!VVwA.11|n|}֭Q6;?qHmeӑIA-MK>-_kh?nãb$}"\Rc#}w_K+)d&ug{6;L(pHQc ׂ th1oH )|.< p:#2:uҹy3qΆvJ,IJO .PxD\vŜhJ{~݄c qXXdOjKvx‘4]C$DT6i_djX̴CzUЯeT"<6ۘ`&hVQan|| $5O@ j t_3OA&!@ؗA^U KŢ(c$ .,- "VF} D>&rQ +lA/\ߺnxxO=3 X'WC*@RZscMzcbV@; W|ASnkD9Q:FY~޸MEѓ).)1h}bj+`Lz z,&s'1H N‰Z=)*U)B7Jj|Y!&K(f="En.a{H?onnAH<'}EuܹS) 0}\i,5XUeժj j僬l zpˤ~K:<~+Z⃶(dMqcͦ`'ןě&]/ID:VHw3e7w H_yLvIeU[ )|a:uӉ ۭFVXܖ&&"5B2HU _ΰ5Ë܏X""umyL[ۿi` ,3~7?}w,3,g130u1rJ./ӅQU9嘡cfS BWF}H[kKއ2I_s fOڷNHׇY Ð0j2nGtkG1l$*l^7ҙR@d@p,^*V`\㣏$anI@>in4IKǬ *GF'sd7}嗑pr7s%ro;+_ Ξف_-nqCe㛬>rʲc6=D~t%gyvv冶R(GNw; :"ۍ`([7;;8,.-!E2GooJ,wkmVD~*pJ4j"qLONkq>\-$;/˅$x_n2 ^l"a'av3i>Dԧ}fʖJUJ?>pވ [__(Dhg3=΁Daπ㿅BAlxf_X񺵵%5yMk}L0`kmJ | o@K5L'S[ SBZd* )¡ܜC_4Ȓ1 ;I6K\N$U26$y >l~oWEAI EԆ ʥ9鞴 5?P8c~ "f`쩩) ,(UޟL&8offo6Cs/,, >\;A044%qogu=`>hF㵵5q$͕p{9+ <\> &Z߀!&gP"l ݅a(uMuxh2=K>W?-(/D(!OSЛ5V~zĘ5 XDfȔZ#"Q~U ۤ {h{Yē-ϡP,#BՔ&\n<`,3gIJK700X"fZfxFv~v̸^KD: 1!v8=g01_ *aK0;~'i4<;Ӌ)\B,@\HrhEf!%$f+KĜ"T.oSK80ڨsjm [iuxT8=3E QjS0ܭrZl Ƽ#OƤ#^aJI{`TK>1v:A/jy) T*Qg35nk)dGBD#Hq8t^,l.ﳱbMd5(Ӹyg=ܹYܸz 0PЇM2&r6~NF4F45{S' ~.mfAlombeaM]W @q}M,$ _(X]˂OM6,^`]P`ҳF1|6x$!2ݞ xUvu^=@J{ܹOLL?{4c#\єngkr-HwV2߽}A^8>?jW6t9 :7 tuP؆hg{?}Jy:f{?jDŽ XCCkyv?x΃Y|ݼ).=2v%;gwWdzL`K#6ܦ1D<+װ+_{)|bү]+z~I6VD^5cGUv >Ʈe%vߺ%Ns+ΜXtRWpD}]ĜB[[YܼrKL\D0^oArYg/>޸Bŭ8Dٳ3ۼw 9a2Ìa7nВUyGE0xΝ;SN/6!E@E/^9* Q>پbGH>Dž5驳(4.7"9[K^o3{=@"lD )Q':tC0 3}V̀`k]I%xf>L~bgf2sfXrXu\b~&_&g)61X Gi>+UX3gqD x(Ο*ѽGi;"ꖮk;1G58CD} Sؕ;Ca&U:\+ ,LIvNvtE\];AMb i/]Нk*D1˩@CQ2@xwn݂A8W\lm#LV)e"_!׃T߻Aj&RGq!a#"䗱t\IӓM:vo|Pz #ym,^ʲClD8z @.[g~0&XϪ΢Y&.Ԡq ٱ!sآk.%ޏ rn'"a,bw}3آ~ Èb((W+%{$rEjAU Z@ 1B$k>+5>mHD>#ۭo8aVۗ/[vy024 SgPr%z e^Ћynic+"BCZ@8( Z\\2t5bHj3ng67ހ7DIY\M$³"@RuQopSpQﶈ8DLEd2|\f3OWV[j: v=oQSiMEk6p+"~KǕ E yR<%zFY (NbmmE}*_x`*h"oL+*tSQoұoӢc4]2ПrH8 e#N/z1Qibb|O}rcm >Biv'WDaW'k]1Pw3b=zb.jm a⸞|HH*XUj  5&zIɐ$p{|4XYXO"rKĊ/چu, 1(LH٥vƓ)lmbt|澁!,!p{34e14ҶFATq#k*WIH;YWdr*!u2`cmW "*y>H Y_} N=!K^>F(#AbRE)W~R]XiD$k7\4ͰI SZD@YtTOR7\M"&]^t0d' Y@ Ǣ9FF"baR=]K|Bbhuyct'<}bs/3$ըP, M%FihN =K^JDF bn`ONL|X"<\{Eq,BCo|ľT}.lI}rzӎ1x`A3 IzOrv;Dpfr/]FѐϝkرVsQDDV_("\RxLP7Ȁut:,%135) <R#:PJR^nu} bݳ*>!ԕrXxJ d6KYv "jKsu2ԹW) BnS^5[΅bxTK \X:qMb.5m!?7s9%6 âNl)̎R$&V},u;ُ W83^wa [cn`zv ~Kx{x.FSO? idsPﮈI1m4F_*:<I &YdU˗Qxy}Cdܜ[z4C{napR6FNB__ W^6r&dM C&VVCBCImQAJ&&'oY\Zr!1vYȉ s>KkQ4-T4P19;F!BRK 4 44Ӌz$L34=E +#@VKvë?E 54MUHȾ|D ʥ''Ebҫ],Z krKX; Y \yĸ(>?╰f/\ţ.jqwacc$8s^cxdDTOsrss%Ʒrـ RLwLL>&IQ/@Rʋశ_8K-LΞR0%P~`^z6MKViW^EDj RxK (Oai@&mln`c} '”}HM\swPHx̓O"WQTK%2V>"4}8Oa{*n;X=p1q`g4=3}L(9sw;6qrO>g3gwF 8k kὫJD U@lQA"1?9Yd P=#ۄ]zl60F +SO= Hҝ};S$1.ص\3=q| qȡ]!0p|n./# {QʅZh<&x/kO ?^(X]”0(5ڴbb+§XZ\N1l}"g_A,ڗ^Ov99Tz!WE#y$db ;Yp܉Ʒ)Ff5Eu8XWKj{sHj`vfYH']9*r1uzvgϝ}\mzڪZ%NN`ZȳI~ Zs:G[K,ȽH#^O_/ BI_v&+&R) EH *XHZ«T'X_''zv\uFнA.Aa]^s|CK0/A^ʡ0i$0?\+X#H%Q#q%ˈI8( ܸci\ƔWF8IbUH,4hn߾;s(k ӽ<1N/>}WIO|sO\^>_|Q=0}3{6={x(~C9*cAdD\zCЙaM5(:Xc+:qm'M>-:I+:Qk~#W(tHyh$f!\֚ dHphzz{a0mÛ=QlbFIں(0Q"萗h6Q7^h-{]Ԗ0y u#=(B\#~9X+n4eԚpV92y"m7r뚨kt^^(*h5C#؄1rzfZ̃4MMz٩DL̃pW.xb5GLqbm,#Lēd\Iu4dd<=Ko]IhX]̈VnbFqbd 4 & TFne"54˨hȪB [SS',N'pwnۥq\%A>kgy wo$rKд(f7z|.|V!? ? 28E4r4x#q|ϋ;d/(>_-e(yvTUfKY7UM۱O7 nLmLZ\}kO3UUkՊYq:νx?:נ$AZVsc5n[M||KyM*_mlBbsD_1lgz,W1cnݺe[*jne2f0[t> b^``׾Hy o#⥑ 9 ^m?z!&x9$R{"p!I*t{"'SZ$Ҵ}iyEJbQ\Y(?0h"\]1m(Oj\=X_GrpJB gYEj`Hl<JㄘhEK"Gϔ樿zP`qq#}‘kgIJ0GƸ iȞ!MϵN*'=jB_d-CC#ocyel,XϺ'Yj)R y RO( Yo z0ވyŽ;yCfR^G}7 yQ91`xtZeD҅ 'cQagp@:?#viEd4<=oXto]:n~*T+\>&"(i8*$UV5]T"p9WC_$C3M#=q[K$wEc_'6<ԝp"DTh6(:w\8 `:HeGT,bJn$' H/|sɈrH ̜w~i!C#AJaǛ6/86)賴ZBKuI?KE ) I؞.v v($\\s -33>  3J5w)H3y-;E h4t:-@Ѹ<G2H캾^_'[9\Tk9F"G$|ªU>!^u|[WUΜ훷P%9 X rU;>87SO\Tp15s-:>AOX^^ 1//{; "$d% y]vl0εnm`+-朗dټ3;=’Ixj*"Aj6F0a.._""""":Y32":6fū!thƯx'ś@nTRR??B1+ADDDDD'3=*,":F$W‘8TUBaֈr5*?ƣN+FցKDj/b(1@\W! FӴSUkwWmec>ED= @ee_ӔxX\^b15>U~B? [4T^[XolDEs?+@DDDDtC r9 fu]ᅬNq@cFiqʵ0&mϏ/|# 0e8/2 "Hd}>tn;/v:묔_:nݚx?\EO+8|Ͳ].qkr… q_U K4=!b΅sB@^^t1{セ~tuS@ԣ_RK[""ڌe֊*ORe6Wb9[G9wyh4hm_umo"!ޥ^*۶h"&Q1iҤOo:ÿƙgW߭}bG zWg#J~> U`UTut? VZ G0'?9#ö7Mr-ٞ}Y+[ZZ"""""g(>{ Q*_\_T#Qaa@u`_DQq "rl{z~yv gIj+Dˋ/8U~\,vW]J&݌8puE'?>D x SNMBG79aoU"D} ,gbH bc[1Q>d?cccIh1 G9 ƻװSN9%Nn*oŲ_t}G_?яҶi?.ÇOښD7qDyXGT$f"BG""""t^.ijۯXĸ'("@9HEx cm@]ؿkV4ߙƌ@+aOpN"d!sm"țdU.zO,N E'>{RlKp?Mtvs S4NI5NV1c,߳񳔧Ay `U(E0v,>P#a[Ixs*< >)4hu k~ϵC}"PՃ" ۱uD%-E8(3OEaADDDDDԷ̙3='9GQB0bm:҆)n9:^5CP۽x!D&5n=]'>Q+E'Ն"PՀb=?O?($.bՉ N1 3M E8[ğ b(r/>|j2E:ڏv"tC0m ]Onz";u$ ";OT ?Yuh"pQ"soCvhKLDDDDt ݛO$"={w ?ck= f+W M @UrŹSOcUXt;vN BDDDDDDD.D|P 0ѧg&""""""""c 1DDDDDDDDD@""""""""~ Q?cHDDDDDDDDԏ1$""""""""c 1DDDDDDDDD@n P(eC;a2⪹}qGzEJO{Gk۝+e8+OLDz ѧNrG[Ɣۼ>98n*pOq]6+vۛG;]ݘjBi_ٶGXc hz @xD7{c#rdVL0 Sn+9 Hz[7/+NJ{]K[{ 퓉 -vz;Sǂ]'e ^[p ZYcm{}~$"""""^ZDEQcQϱK@,CۺнO3 fw'e= q[pCzAWOM^nj-AA 7@&jlE7ܦ1LD>~c1U*J1qKbM(:"@2B˔?""""""taH9t:XڍeL"C5nи<ć՚g8|rJbܮ8u&"3+ƺR^j*3;;T-pԖDş3 XGDDDDDDr >%fKYU]YWWp;_ca ZۯZ ;6tYIhf'62GwBDSS}+~U?U((UXQ2,!`0K'&Uv𧱻/ Q>NEsت; SS}+~DATW"+AT7=xwokB#vşU1N!R0$ʇdܹr+@qv/`_S)m8Q!qo_C ;͇!V|z@5T% ?U7+u+oӪtC P;c@4>֟'/9'D2q٤YUV]-8T PP #fuuQ͇{h6~)F\W*Į8vEil3ڕ^U1#""""""J(N @ ˸[ԡE(,NaS6E*3n5S*̻} J Z@G)l&I?a׎jtFD>9_jV^!;׉* X\G#s K_ Ί?}ކ'Q"4Vu Q>Pr*vT>n!-"ljPKwWC*G(3F|=l0!+bwMhUh~?k#=@Y,,@8j+/#_%-xf"ߚooȇX%>C^@W$7]˨K)][;z@o}DY 2~ 1fT,ܓ?؀x['9? dݸ?nGhqJE/"zP~ Bma,3//_VCq> %z;~/iPT_ d)Pq.#2F@mjǍ тhgrJw(lEM^V֫b[ET!JoiAPXnN/ʺ@9t+_w͟4>֟`t}\8%%g?Zpч)}p@)oWGq҇&o~q]WGiKnB= MOyޓ/{H Eè}^sڈo_7g~Z; GT[^: _Jy'_ Ю+4ޖ5_/nBYe|2 ^>KPW5VeVu Q>z>祣O^+ $ڤǀm;)Ptvfd혎KI fۯjwoWk;< 3 ZMs+RT @ks)Ea/Γ֟fU|RŶ#quEt!8(\2L|s1q0𱷠 It7-(k׶]Qz7^׻ڋ?vn*tGyUfxtTk_zPΏ-1 -<lUL~3,.O>,,D5#ߞY_UV޴h{1y*hΆjGi>{;'Ft+9QC\>}֥WfPJxhOC0\ʋľZ>-b`1r/ZO^؊m?xt'.uǴftЭ(0_R&~Љu/nK+6g&6w,zi+J`JQXVm,e<^8 T=~`i%楼e~a ,37\!W_/PFq;~1q,+_a0qhjC>5{[z,>ZsAPl@8t(_4 ݧ3$"""""@|8PrsQ}/3gT&B*HLՅ/jbQ(X92?e]*XH8|6/ iUϑNx4EXrf]2 6v ,bN㸋PP\ovU6h(T/'pb6PB^y˷ףbRηO)m` |~&lf睍Gq(6LEXLrqqxzA=.r1@6gPxwhE;qYfIJPXZr^.@[˦I@܍WƟ xLbHJ(3+SO\`Xʀb5 as]bcZMÎ[Ua@`Z 2 OQPe]gfzeӬ?#k D\}Sg Ƣm2w0~݀kkqpiS&5oH]_1 _ϣ8?/]kƕ'cSc 3jJ«-%ZN#PPbVu311wm_ K⃽PVV~NvNL>6rs݆!>|:Vl-D0҆_ƬS֡yj2e(-n?Eq,j?ŪS|@EqonB\L [ utnم8+&&0{ٽXHHPzT7K82Nj4q>7K>|.sۿ+8+Ce@wcůWz$V|܁L]}vWcİqa]_]⠊ G@,҉61 QE bZ{$Ta Pk苵\%7;(::,kjm5]oŦr DaOd[2{::̀COB 8mθ#t-:z|-u8r,p@"""""0$Y!dgVsa8V@@`@5or)Wt7tƵJևAqL3pTF4#1=V-?X9n]ќ}_w*=.g.)2Yh>;n޽ÚXJ&80bALR;k/Yw+m0c jA(,ٙ4Y8f0kc~ ֩zUYɰ [QGiuAwu;F:1X{HdV ߟ ,~}n-?u$[GPO;~vx=BAL:{᏿0Mxr#.fO(+DS0gvOUAXСrz就~ MfZ>7x- =G1';g8Dا!kkZbRi|eg,BXj;2U3U1Sd\2^R5+ЌMOD}*hhA'%>ظXDf<3K(nsLC;!ౌ1,qpK _bV޳?T\sL|ˍز[kk/(LmG6%rL"h:L@<3|upb|Ax{[#FTPMú'iXtuD5p`"""""\b <ӕ"VghN G6PT|?OBk;L@|bDT-kV uJ˛gQ1Wᾱ#q5{c+9ڕ 9]^" ޱ((ٍ ՞{} DqLkMsNf)>Ѳ]"nb\H WEgO"PXf-j _ ՈeKPJt(:JjcH^4bY1/?C:$s;(kYIqhLЧ+Td Yc;a&9UG_*+HcK{ :\a}+@V5Cdeke7_{LUqo\aϯGS׿.?v5ɀЭ^?T|b^ -AbQ'f[YDDDDDD]cHfUi֘yٓ}V߂|E|Xu(ЂZ, -Vd'6oױ^E# ڕ#Y6v:Xn Ph?/ބ|X-uaWVu<~C+ο:‰uew^Ox^5ۭ.Qcޜk?/C8s?ʼ}E5z8ʇ1yDnxEH_]~>ke+QQW Ɲ7^!>vE/w3nq=}$|kuJ0fx>461;ͳ q^.np]fX3]va)^~w GR#{mք}uug%?k,߮50PG'{uz&>.wmfcK?@)Cq7pڴ """ODy(f9( ,A_ b>.2Ru,NڋZc9+ߨj]f A^T{TE?-bqO]~H/cL N63'+߾ $[r4׶(-*@K[;Ν6ܝ>C˷݈v=|-i?|G-uu^a77 S&Wn6Z>غ7& &I'V݌Y3u[!qRUK'MWvVU? }ЉbNu,LۇMkSâpxmSqsBЂ%PK0$ʇэRn8NELS ԷIjs2gh_kmz 2jko z s?` m0vk7"F"[UrA ]9;tv*S@w)릇Cb?6@VAq k7}3{&N?:͇e#^Xe:x{~in}ӫxe4ŋ(,4ΙD^pC1=Z+>lF,Κ캬9*{#E'cGV nlw .9Ǻyk://xL&W M5Wb +{nExu#Ι=>(/L3ibV#)]^L mzj$:Ephe|"2ʿvWi,nk#M^>2C@X!ZݵKGļՀa1ႱϘn.Uדq]Y21^ZbHU,iE4ð#&1uţLGhcމj`qN! w نx4,!*Ęb1o\y?Y7!'ʈhub}cXG,)' kpxE{D}Ǎ父XwH oeyk\>י2n$C?8w9hnggTwyD~a_"""Ou I_/ qחB(85 @ЭYvf(qjcן٫{ES%9#rqEԵ ^e~NADDDDD{~ZtX dꌥٛs4q)Nk1`cD览Xֻ}?6?Q[_<١WFGnB?$]yE8hU>Z{+$"""""E>KK 6XK=ٙZ}0>Y'f֬!$v{mf:?-7Su$*f݉*H yLJ[560͕mXj"j U@""""""ʊ Q^xg#Z󢎧y6D7ZO<^n-0C-uok5Gܪ[Nbqޗ]̤ ]{x<(>?><؉]Wtiw'ބ/e+ "at>v5NO,bmRoO6c:򡭻N 3+E'@q]]~3U6PciE'f8Ēhm@BTaqj|先D"gwՐ 8͞HXͼ ?Vص"Լv:cfԒrf5=~Ub" {0lC-""""""(/b= N#)Vs1Cz՟wm(h8_^Y3ٖ 95qW33$""""""- ®9ge!*✉]D1.V%_ tv_L7׉[3jz݋*rtvvbHDDDDDDԛ=s?{+bv$?;'U@o&iOve n`1^] z@rGfPD1Zű; M[N\d/ ݛMT6#5 uc QoaHήvfwۦ `v!%Oԍ=ewa=Ygwլ?w_3;{ l s6f;}%|iIyc4<#?^#=cpӣ?t"N|~`ޭ7{Xöw +77o&}ݾqW\3Ǜ7:y }0sĨy3j\__t;t3_XOvMg3; ?u_3_v_ěCVnj/7x'ܗעC~Sg*G'ǯ<G/jX)}؞j{mXSOuc:g^`­v۹?>i~6uKDDDDI E.D`J 46[RV_Ǭ}6Mb,p/΀W(o=FbK{e=u 89^ԗm<ǔ} [|㦏6-o0?^_hꣶgjo%)][|`%9?Ŋvcd}3>Q@pxfXz(kwQ3 TP1#79] P׳~=Qؚ9yu%,,.+/^ߜM/`Kx67V`d}x]XJ]7Cwۿq&co1?>rLqW^߈yL9/ekO'smy|#6Ot&kǔ2TلZFlzzȌu^mҞ.װltq*poƍ*x':+s'+uҳl_|U`SW`ҽ3ƾQIx<9LpXlǐ0 o|xxm|~=7S2/gyƍ!c\n|+K6KN5pSQ ]m/~Ysx@eHDDDD a݀jV'*`~lD QAaɥ; PoݬRt|0C| o~=]9x._S_1C } c˅eoWVbcd"<:w0imt=c[ܷrN?&\v,c{29S>Xk< Ncx=>=zݐq k¨!{5{?h{d:9r<B^|xڕyzFj̕Cd iLC6k\?R?X6 1KDDDD *OQ[m؈؇ChB+"2sV'fX0OstbX0KLI3ӓA~}QKݱ uW8!1waױq_x.kƨaJ+0e|ދ7ָ++NrE7k\!n HrUelzmyۮ#1w3p˴ 8=iqWMmg:ٶk{2>s׭-:>u Jۦc.oW`ݍsi\Y?9|NgœcVbyݣY彿LmҀ_sn?lCۄnV7]cpOc="""""';QE37>>w, o_޻Ѹߊ|Zи P)F 3t?DہXﴖDEƢōKͺԓvX\.J#E81:а.pz 3A's:\vx]sg =uߟ4BrJR5\k$Q(@(2b\ϸԌK r a= 8h|ۯj]ڿ-]]xm #r)1,xb9oې wNF98Ᏹ?W,u@DDDD'DyЉX⿰i g>^XC|rB0н8wVZ/=чsgW`t1yHh{s {E8 wZ< ~'l|:ispϩ]b.I]r ]%;&;'K)Dg_+UOҏ Mt6%l\Z݀f_1`n^]'AW ]v`""""":f`<` QKqTLvV2&c@"4 0-Ԑ818.+Kk Y}$ =kwvy쑈z QPt_B@59Gp1 %ًdH(+4viЊG_b~ܳ @ڐ?3z Qf̥%X4h| 9+!c;2+K V;Uez5 5cQ_bHQ,O>5-೯;|ۏ1=baJ]+{`1G ?x^DDDDDDD偈?Z" 4@1 .ڟVA7*{ \{#""""""(bk# 1Q D`^_K(yu ǏM=yyM1$ʃX=7=1n h@wEr-`]"~Gfߌl,HNQ_aHf蜯78!`+c16[(H2 '$y !=c Q_cH8 D׉:a8 ڷNss@O&k!ث06Dy8u0F&'y<˾ HBt=xNş ط})˿#[U*)@zB!B! "}uJYE@B;T- he ǁd<+@x$ l2ٝg !B!B5 J'Ĭ.;_mE%fh1E/=iW3VFD?;ȑQ(\ݹB!B9P$d0`q+q[:〪сJSsݟ 8yZ{3"q[*ط W0!B!B5 %]E klw\gDNkwVS#+b}򏾉MpſEŸ?o=B!B!\BU2KD..gҊ_#Lր'O gtA&`OwM!;9o_1LB!B!CX"`^(s97u|mqD3wx8khD@>^ FDW%W(& rŏ@!$O! 2 DVkgȠ,g^֝8PP@:Z,; N@7Ң_wlxb^B9oزe O! (2@eM'#eqH{iߍ̌EEfbjX++V!|/Eb?B!B!d(@7ML@˷og[/gDPr*'DkZSB(V!H@rD?6L!v,Ѯ՚v=WL+t-&1B!ҙrnsBDf8k[l_ܳIxzP|bYcl:TIX8N;҄l q촄 C(2ޒ ]v d#ݒ%"JJVӌ*ـ.lI$aڲP0v_]iLK!BGĿ <:w NΙV466!N!kF+{oKG1zh1'OV+(& R)@5ѱ?xƍC(ž={|$af3Xh~u܎5147#Z=a@B,蠗S~󂃎jYBT$m ZLiU2"([MiBp݉DAb?B!=T`Վ*Og7o,=]^Ea;^մhǍ"]{{;Z[[ނ6w@&H4.Yto-M4I ׿FM%XAy(dv20U{1WwS,d9Ǘ؄W`_<~H!2$Iw^#͟zc tR4~ "-x߂Ea֭zL&^&Q`&uշڎb…Z ;v3h',f}v`vL}\b7qN|v̙݋sj!N {AtxGq_ن~@OWk۱a1<ı񵧞El4v^B  dXZ.˯7/FSo#qU'ڝ?rsNo- α՟v/WS,QJm0}{!77Q/+>f= C!ȶmuhnX[4i .lAU"3flYZ(+=)b'nb(4VA]uu5t{"JPAX=9N9ya׮]0a.̍)Y]g߾}2eޯ z7dSq\>+[m_0kGq?'f)y-l;@0˜ (2Ȗ~OѲ72yUI'Ynތ WڠkR{szQu636aoxܫ{+> .|,/{y`ղ>z#XUB!ߏھFuEO?˔pD3BrHzyI-؟EثE]]]'P]Ŀ3fzBkRZO>>svZw?p$o@+@B  "q[@r㒎75$ ,7 tPJN+|xm^\u-ܴ+֝N^zF\o_ǸxYgq,=gpg3_yuzۍ=ތ&^|;3S_0[žUCDoc5XKB9/K/z|fN:%il<ե^MX=!6"1Iq 455Rʴ_o4M8P8)h ou"  ѽnވz*q8tEdoڴiz_NC?xv6/|os:møW"l'yQ2L2t09v+?:T/>끤$ JF#@xEZ3SW!4(zYKe${q/[xhY>X~;TyXuS,^D#'T0H5m>q"|,{m5jY}掳 =3g|uuoފJkbOw?^BZõ.T̴joL C?ڵX:li !2 qcLI`\sm;;ӥx!=9;v O555Z<3EtV.-e*O2'Qp-[ZZp|^7/Ÿetԩ=D4˥aʸ*5p`j#+>!?N-"ueIc+ya2L !C ͩԴyK\w_-@siw&@r<<-;~ jQZF|'0 bTQ}=qo纷 ݙ&\u-*/x.oza\u 0ߍڭx W VϮB߲Uv=&o6_k< tq^-`ގ[  !2bx>TĿM6uR?$ c]veg"I)4v'.~k=}+}>v%YeKd%:wfs~ibd`!!)Byث^H})t#|>tˇ o`3szYP,#9I$rM-߮ ~objnwmr>vMmةăfgu`A,,!}5;@`B!dR( g* pdg饗^O>sk쳯x}Hw AE^oqiO,$X{ i[=ĒP2E̹64u{-C4.cc՟+6 'Z7! "։wPEZȳVDtAIu'Rx;1[r7?kpF}p9V4?=+R4Fݤkqǒ7wM ~_Úc/o,[sH,x/^-zWΉV?M_]yMEx&BF:"6>~/ǟ`Ԩ*ڶfݎsϿ RCϏqb'1ŵX, n,:*'H1cڔ"Ftc(بϓLl to ؏d;'EM*@0*!pźW$ Q\+Trޑk1-f^yh41X7cus\/~v{qe*7 ȋor8KVy\l{ng~ZV- Djp!#O܁e("C! #gN.f۷ wGo>DD_ @q7NEG΋l7wܒuD"  BoUc?|?p~^8ڥp*||Gˋa@BCؾiH)_W럎8$ ~9f}zǵD vbbqDm,/B!x$u4"\g@[f!@&EANdLDRG;,b)&),EbƓIXX>fVƍx'۞ơ5IUoeXx꿟ŷ~bckq FP$d h E.~qX om̼<1B!goPZ3xIٶKJYԋ*q:rzC }+'`׮]2R>([<}+VNuAO)>a|6S lP lΏqOijo8-l~s;n[u:Bt,v\B۽@bB`e]T?xB!s.{>0n9G:}{{lmtꏞLm GQw^{1jTZ[ܼ`(t&cb'xZ>+Z=;"N 3&kAʊ R5Nթa%dB (v7 B!u~B!B9(2[Jأ7ٲe O!B! !S@$O!B!'S@!B!Bȅ !B!B!# B!B!`(B!B!2H!B!B !B!B!# B!B!`(B!B!2H!B!B !B!B!# B!B!`(B!B!2H!B!B !B!B!# B!B!`B<{{B!B)y(2Xœ@!B!A !@ @o{B!B!  hH!B! !- !B!2XP$d !B!B  !B!2XP$dH!B! !@B!B!  B!B!U B!B!BF0$d !B!B H!B!fIB!B!`hH@ @B!B! $B!B!dC @B9ǶmqdY=NT3 OC+B0ԟᰞ|,cB!B)5) JL&1zhTTTuUUUzDt!H"~&ɓ'XVVh4BB!B!.!B*bڪE7N qeeen3сӧO"ր^AB!B9ߡH9+%b%bLuuun8"y (:; H!B@B!5kFk?2KT)Ǐq}' ɉ~[Hyճ0}aiYY%B n~C{hiaYu)#چ~BP$ qO,Ǝ۫!P~- mKA0ĘT>,F+ >D?Xմ 1Tj ^z6V PE!pޣiOBM_;WH_Bhb|U2~BЅ !Hf̞=Ru(Z'VkT @Kg߾}zCF."Λ7O/p8%уl H߂AMB5@T=-pJzҰGV-; /9.  d%,{ρ= a}mbeӿLFvyu$b2"  !@BH0>.w$^ꫵw".)B35E6lΝ;qhNnP|ɗ,|6}1S2Ǟ8q_G,Νݻw5-s:ccoGm2eІPQ"*!'WKDG[0DɠYTXp>_hRcHp#eZp@ʪ˱m2.dZЃW<ൽ0s?jar6пHy^!oY*}E+YK(gYa M2XP$Fm)yїzpzADSyy#>g:XUVPQؚQ:hE>Oľ'%U֛:I`B˧ aΜ9سgϐ sS|.?܅؍ hAUB'bxB@ ]Lwߊ~h,r$SQHd3;ſtuŞ:iBNZpyDcvqndpVD=y6Jb%ѭg~X3 ~Ǎ"Jd2ɓz]ŬTcյ{9mo n!Bz0HQ&Sl1ϿT3wdK9 '%7o9o=m/>"5BH/bB wYUo! zLF-> A4NOt;(q:fTL >5޴#%\sIy f'N<z㾿.~KUaLΒOD=5V%JD[M2]ŸBHir@& F''mU a]{MRV}D#!<2PпM)mH;r? A'O.C3 .3Օ8booh!o͙3>.z/rd9C!@BH!kkk}0`ip(_ݗ~c)UT_x]1xe=" n Ri]U%rXR:hPec*9'd`~`"}O9yƛ{׸@Sd^~8 jY/S6֦+@\Lpz϶m*<T.rG /N{\>xN6>S?H!@BHȋ$f^2p?E2=p]CO4 |PWMbʲEvt,A3*hwc0ٞxn-XX<:u*ߏ8Z &UxV.G Q!7*Z؃ZT#^ yXZY=,GĿdOphƕ%اz`Nyƙ:Nde}iW&%ȶ& ![^^'- <|1\l?2`(ETAK[FdPRY+cicUEzSsLt9:KJ986 g`mFP'Iy`L"_am(Өg芀orʋIOKkB,mwߛ2:2)KD;s3CL. IJdswѨ^&dYJuNQ]fL*;,Bv-RG=b$lxh%!dH3XZds> 6|pPW6-g2v>FZIt&YZf s U P[Z<+@ < uhT-y_ 6UiZ+`س t) $ ]bW;^v~E+6lhf&dc_DhN>(DܓX &g:qℾwѣGsuEL'OH(gq'cǎ>3̩^G/FjBi/ZgT`*^߱;9%w\BHIL>yY(YxC+f΋8@!cw@܄GUy]Ztt:YY::D /X P_+,oY7FPj=2/nq@W|D["`Kt3_Ȇt0?5r70z*ni2(@ɩ\}D@c++@71FG;J8ƘI;P>k In?:l ,@HVU)jN-LZ †HݮR Q/p*r`X[FTv2/΁ϙ7Og{=Mz.!=lO ќg\M߰ghy@'%R% aO Z"vaXn}W#F0`_9s+Ss8sb?+0cM=4"{XkxW;DVo{\ywu%X\e[[m +AWeqKМi@.  MZSBzB"/g#\Xv6ZU,Ӡ.(~a0P2PmB;uG~]6Km3U{=} ;/O>9|/ᙒq6bgV=%,m(}!=o@Vޠ.Nna"2 tcUK6ZTOKz.'/ȗf'2DE7njח/z3.54{{cgWSťcspx5@۔}a% пuW+oju{3OyRd^tR"5='o' RGڒ:RDLRY?ydݞX Ož݁Q2^!EړoͬO|eB\zBo/m{e]UcOw@zOU .DSz H|Zk,6ޥ7u5Xװf{[t!dݷy !"Ah:?ճ"l d'] srҊV^ ޲[㞵C|!s1l* VR}s @;햫s8K驔 *ԴBO`(W*YZu'@*$^ q&]KNSD"KqI!֍XſG{#۟kGV u=?g'jD"+?z𠖋'.g,L4 ̏[9O5F+/]-l= L>_toP_qhAX3UH#ۂ"ߎh#pCeNY=kx gzBsvV>@+'ԙmLи%ךI Q1u!-CBeȤS~~l_3q!ʍK:w>VLqX]¬u]L:o٧M:oѦ?ugn#WxXgÇ cz\|ڏvFle->N +o-"q/ܗSiqXm vU:׷r/kEThzpMM JX 2bUEIZISf' u翇on\w/wq|i="]O+c×J/A΍dO.XQ>e:qQl-7z[?`vNő}%xtr<W{L^hLŚ{X/u^^\X>{=[׾;i)ܵψ8}s]Mx _؞>]?@/Ⱦuf_Z  绉'_Nb "IB#3ەV~0-dLdWѣ9wb: 7W͕dDv ,n57qpѴw-ۉM6RKsvZOTwסmWSg>wS< F_]PVUӽg; N@%1b`gP ˵"AQ=Wxfe@ Ҧ#ۊgÝwD 8: \E-}{߇ۿW ϻJM0֙Vo|[<6[U}:РvAfKscʔ+M+<\q xk͊3;9-bg{^IKV1UpV2Uőio-^DAw>"ZNx31=sáL^:[ 8>)Ŗnz5z3hv.>mT©Sp*Ţ2dز{+^յ5s r}N^ol)_H=먍ύޠ-۟g! !dB!&qB˹dynV9ɸB۞DhqOI!]1& [z7v8st;mVm7N//X%!ܽZĻA,t [z{g^oSb9WjYm-wcC Mӝ/jߗ=:< N) ]?[?Հ ¥4)R'E?d=/[P2jtRA^ BH6Η.Si&ɂtj%At#o@@z|ajFSls6d|I@b: o^,??>A"虌n7_^|d"~V~9{⪱ ؅ ӧ4G‘K2xi?:N%3%FXrPuѼ65*K.Bkv7C-/s x>j4镾Dgzs2aBHQ_^͋{9}s  tA]W"uA `:YA[eA "[Z ]MoڏvK;[?:/zKz\lm͘iO|FtT= }N,9=pyc\Λ2mvɿP, |]C+;yˮTRm#:-7X ?Eg#e_ߺڣnwK5Ͷӌ9T*j*9r-n:iNFDHU$ eW$1.^fDݩ]J,_XlOoY{ZsnATCgp#.YY[Iמ^|׶E\| rw> Ծ| 5y?>*Vz"If_`Wbwi-eV9~8ZZZ:%0BiӴuX )Ȅ ȧD4FcWS#4dt ;#P Np0]4zm;ґ9sh4~ i\,La*OE®CGQM܀߲K6tr/8{! whH))L8@g8fo󂠗 tky"Yi>/3\]_7Zg7\A&|_SfE5JxR| o;^W>W=r#cC 1]wCnS+76WmǸk偂6{?4cu%wYz_I@:YBo-i^۵V~֛,R[[X^F-d5"UKj'"q$o\2ZIT#8剀b>g:гnY`e`Eﮧ|WuX^l`i؂-[zsF5Vx׿%GƖm8Q惱6ʯOæ{iG=1oBP'D {JS0yoSYyU>վ֬> ú##*$gw"T~%~WxHqRWIL?ACd:-56#˼yt" qtcUWa78ourU0и/UJ \WU׆۷|᥸*5X7" Gݐ/@#RqW'u7}2F^=g,xhN@. C!7U^u>{u_GֽK!dIB'1 ]rqE'S}v//_ĚV{-lBy,g-0njYre].uuȪK6.moҞg~g&V(|Q[,]ng/]Kq! |sxl'sG}~HP+UjJMG9 TY/KTuPw*5Rj|E1L$4hoZ"W--2mz)jW ^QlE,RO=2P=R4O^z4Iu'_eD)w"~xةtۄC~yɩqz"v ju70'?B@۟]n,Uxxa,>미<^,D4i䫯uW?y0}џdܹޭvڥ <㦥 Zёm-BNܖllJ]-@%*lܼK@Bpp拝jW_u Bz1>) C^E 0aB/T=jje ܬ'vE@vi] ,Y62>/Kv2ټg>%2Hg&>- Sxw-FH4[w!;c'׌W՟&O<^Ry DC4HгT+BY-8jMܳ4%ezNɊO*bhbwB(!2 ї$ 03"T>>ZjiOD׽&\6Ew݂G^S#&n &,okku4MX'N˰/K]Aeſ!J{l,GCh˜D1AOhJA44 z9}Llh/[_(B !A L/&DB.s w-<]?N@ɻk@my7aD gWkx3ۊcԔ>1ynu>i/~OzCi#$G (2lV 0tE@qnWk;¸OL@JL?@[YU`};(4EA-'ՄX 'q1 ;~8ZGՀ?K&],nnDCaQܟى/&Ο(,e̋gD@q""'瀼C@(fҎ̋(mdIı6~څ+7M@K/vsg&tX-xXphũH*I&6) Bc`(LaOEybr|#qLBl7{i MMxwQ=fOFsmV__ߝxs1vC\/'¨Ѹ5СD4"`vYy/2%Y#H`HYԑQ@TRY=R" V*%f '}]KEϸh2¿C[f;.O/y͜] /}MIËX|'61ysh#$Klawӗ;UxsgZ%!@BHI3epaOe-_&@"v $)딽 d`?h9yvکc'Ղ"q_ P_?'QXrhqڅW_+j,,W87pZR%g(nOxB`-I UD,P0Byx-Mp)u7餶K3hT۴pKLJND\ocڦ[g~/$͙CƼ- 2ND' /|qObYO=<0 0 bV& <+@ߴ Auէ-n;sh =Yxٝ).4d1׷ !^ w}SLĂZ>6, XIGth >sK'ILs6" ;oBs^BPwhBHTUUرcK.Н *:H+PXV0/_Cd\Tw2+lOBuUW  맳ϩ+%T qUe5OVT*8p?KQxd"\7re~Zo}i'W\M}& CKFT/db񨈍F{ы;QX{F|z&5YA!C _b1+V)D5z`~8&*u[o"B,YDs.øErհ,j?|O tˌa{j8vu=D`RULzV"j /`q[- !##'.#Ȼy'gXI?#I'O$hll# n'-XpA ƍA[IqeP:mQ@BP$Huu59y$bwE}tbͿbL)/$@IJ*Hw܏CsT` ,I][ѹ9QO/'\P,(ټS-iPDdA?BB,qN:)yKbJLBn² #A4}?7ԙ][( c# @BHH,yq{58q$wr1J_YD4+2h PcȄuH5n׬+fm7YYEKs \_~9:;x tbbe  N6mm_D!駦W@0Xb,&xǑ.Ϣ"Lo$ Rz :ZOaDnꎨX݀A6r s*HIBWlu_hq9=H9 ٬Ӌ]1! xD0"Npa<X {fYL}ۓv!}(B 0vXR)7ƍ]a_V@D'Ocƌ ?ڗ]0޲+!݅S. %Kշl84`V(!U T,fG&%\ݏJEd>_J}}b !:~) S?'րz?,|,"9/|9HTON0a :¹d9ɹ[Z>B3!?P$LCyy^ G -}PǏh+(]B! XO:vbdq./ Y-1I00҅RP#B! !#‹D lmmeᆐ3$7A)hB!BBr1B!Bxh*A!B!B !B!B!# B!B!`qB!B! $B!B!dCB!B! ] L!B!B!B!`hH@ @B!B! $B!B!dCB!B! ] L!B!B!B!`hH@ @B!B! $B!B!dC @B￟'B!B ?x({: wi0耉/@dcy%N2'jgs0/9ќ$㴓9Ɓ0gD# aE \4[Ok}/UjUw=UNp5P }nt@'ˣ @g t|n m5Q@' tzB] B@W!t:@U *NG%.A] B@W!t ݒFaaJT5MY;HiRN`Ns{w Г[-ժ-icrP?t? =%9 C T,qor\3w8'+'b"X5uE7jǻ5dغY⾟Tm^:e74mJ(:@]4eJsvs"ZZy?|nËn{xn6~iȿ' ^${|r@e[UqZ%4\|r˼#hx6 5a+fQKqT}7s*jf9ᵱ˫el3kEy_-˖kr筻%׹!ǔiQ98r#Cmec>Âv3/wzunQ~~8͜pcgZDTZmyPqI˵5ς)] c+rkGu>wM]"ڃBb ÆgمmiI#T+VӿdE{Y TU鿎x5=+@t,CЬ7|޿P fEDU.Ի]/9À+TQړbC=SzccFo^Z]T:$Od@'+o~kEN 'ѹpc,z8k";k\r24잕/_2 1BCwWf}qWM!ȪfjHv/)?0˦!?ݾ{W=lVajicTEڲf.=˥|?5{[Sc`j ĹI5 uʍ ') †Bs SN ۱=ݑja09 9 9 9 9 9 9*uQ I8GqzJ6my?u-ߠЭZguW.=QfS~|}-wkЩŷ8t{^ ֡#'as?_~}>|LgyN];W:"^>Wi}H/Y |L]T1WX.N7W^,W$0=~s`;7?Vpu7gqw?v5N*֭eQ>xwvsve p.ϕW^gyer Xxꩧ_$ HEoׂ%rY"5mk=.} 2ğgv6t\6{olr.imn `Q0' Y\Pƥe-_x,oLV&:sʾVKG?~e, Wm[LbD\٣6R-mof…-,z.?Y,?VTHՋ붉vjk^C )_ݤ?ڷtUj?:AjhllIco^7^O~лu鎄+Ղi>*4Z/t#lzaҽNue߯2H@cn&܏u+H+] ŬPwv#I/,uIXd@^0(*[ֵ@)lEq[,0bx d|:?[ֳrl`;[@@,?ۖ}ɖ 孼i.]WX .8gJm:d2MV+{3:Ҏ.4K-gM9޾K+:_n#ղ[o~z2|͌%bEAt!_8[o׷굽#*,L:rVՇc:xy1婡%/Ў߀~i//zŨ.nMIcZ}rw};{ug]<qM]d#GJDd=yI{t97O%eu n-]\EM\pRM!)bp`ޔU +ڬLwvx?ĮΨݝwοw|l}εG] YĂf MHt'.8eSl{.+(czɆ.gAq{ۦ ma&ua(+\So0`ރpUn~]n^u˥GO׃0dRFeRinȷvn!6n( e~o^rKҷrYvSXY_k͚5mw6/_AN4w?~?clϾ8(jnj:]|-Ӗ7?ϖ<_ŸTsC}ryxY#wdau'f}tzʂ[oClxZː;Pznlram:yo[(>{=MIK5͸ȧgĜ{5١s$؏%rFyk5YgUh~^+5SSY1e*YQjoڲHE{["b=/-VHysT>2 yVI봞?XǣgݱӏoȘ,ox \;],3?,aAV6,r=l {ѽ}}H7i뻞p /XrI  -zc&z% ĥTG,\6ؖz-ketz9!߮bشyl.ڥD\enZvml^*=vcټWK[oWXXzhЩT-Jֿz{xS)oM _Nq#Rnz1=8e8]kϚz!>4V7fivw'#{?i9i{puzCi]^s= ,m+;熡f#'_lqAǜFznxyDo[{4СZ]kFD_=[ϒ'g5V  mޭ{ج]>׻/Z/'N-k͎ ,]r݃#Ut004G=ڡ@oDy%HN5ͤˍ9=gv<52W箢\ g2u8E>U3Rϯ]ŕ, Պp@'gr2 h c[۩{AyYOzؓMNxoӈ烜iȜ RadKĂg]g X}(awU.ↀB.M;m՗ @K0XAK|ܛͶtunvtÒcᯱ[' X.~HW:pLb5c䒨.`$ٸM^z]+?P]mNدeWH[ڧƦ&]1|k^}}}1e^B~Bv!~iGۻ?[U۱vqz@!{gGWCVyA ZFQOԜ;/oG}7Nqu۾?G]{zGW";DeI3FgDaK"#m,kݬŭCeuo{x>mwyxJ) :DX̥r5`4 HXp%0tOMd=,h,= >#q\>ܓscVl{rAEP[W ~w?frn(zigW{ f+,!-Npn:Cq X.~p=8mZjGr-lˮ]u:8[[|U>Bw5-7\gR_۩2uF/{I/]_zU4 __}w*Оw/_w?Վ.&[j[{vi/VIz1=}/iCj#O&Wx鬨@H3mԃpIg IBꦇ'rj#Ӣq4oX3U/<׿_&y+< X Qe,o\0X=f=@Z^]ݹثH{ONWw.Xmvdm+m+{l^r}zZr2v_~?AT > igj!Uh^}qtS:u]X[gG.29]Z[h]+,չb_ۋstEVޡ;FDtȋ4KڗQ'ϛm]Kt!i #٪ e궓f{nX0.uQ('.zA{nN=ce=MVyup8p]SZS=7NR媮;wnje|C=m 8FEQ?_;+Zͱ xG3Qsk׋R9=B.j]c =i %Z(yyK`L00iOosڵu骫bG`r=ӢZpOaЩ(s`de5 Zu҃tioO\i&M4)+iZ߲iA]%:ACAjj}'RxO5_ﬕdG4»W5SiQQgt9+tΆ? =lutooSYFx(:{R{ǣFyoSC`j LM90={ѵoa:t\OD uv-@l#nH3u"= [կ߯J}$E.>x-vƆ.OdлM7뺲amg'E*]JhT/c{ěZN⧭N3rY]hRdi3w+ Sy=TιtwT:]JmwԸ'Nh\^;ꂯD ZQ5s5<ٞ:=Ӣ-޹ڛ,R孥Z{2Wv@dpHj*YHFW9+w, bRU Ir!8U3R`ȩapwccwmXPhٔSz*QecCJ䆟tJpek#)K(-N'v,]f]D^c [:^:e66־WuH/v^mx˰a5|1Ӭ]Ybj{'9E; 9sn@0\%5}Vw8][.K0 *^YnY醟'84w^p嵫+4k^xV闩dEhGһ ڨʑz,ךsc3qVʓ7vh(^pYdVZ{h\XKGeIT:;Mo*+YW4'')w 勵},رͭҊ6nc>,xDc8sn@$r@ :\+eqZz&Eor +<(c<~^+7Ҽ.6~^gi>Wfmlqݦ~yiS߁e$oW`z6ֶ6܍!;>H-wX|Y{B?@E8Yyu?|LiY,nPJ1uߢJU9sg~-oe^ޭ=ClߩآE8T`~ ޸H&FY'a`s;vЭNA2n_Qep"ЭԖ++KZ{`d2=r{ũH;Fy]g@⧓n}D\+jҺnCǍ-駾S>?c<"1| ݚo9n p3yqv?{_l'ܿј87o~`e*JG)`eRQE3NY@BZv?rev 5N%; cfr[ +ҘHec߳C%R)w6 {CGrMۇ=o̕cZs;1򚛛 فT S/tw=]۟4i6mڔW]u֭[ǎ쩋52E55:vxCoMUm]yyw{1_y=x&?u*(8ONRԻF R]A5<ӿ52.ӯ}M S2VŇUibtsznWo[:z~Dߺu.\f^EE?̚5KrnX+'*w\~ikr)?v,O<3mұ,쿪*?r 2OdGg۶y/mnױ4\d\?я/OAտk/YZVi|Y6̓{˓6o۳xH&+:vGGۏ?csm>^6e{;5-oiYq9K &ʓ%+cesufoO,k ͷ\ȔKڇR;wmmR [ݸIADƶm˗(Oe%K, Zڶ\mYYz]q$jߵr,T* cxi7>ofFillT}}+6m]_xbWzNV,"[|r(1=YXp ؘ:waoh/;׻z~-Զ& 9{,zg ju zp b[2hH-krjt]ˣ J>)g^6uALlJpE]` / %bnjkVvkn{tם;^\f,XADm6[~,XܶW"mW.`+ 7<=X߱Ρf͚6;y)MprjjN[d~{B{?΂ Z jhhT^SvZ5Kں+`sokW_o|>>q_P7\;JS'5W ?iP@`ظCz/1GRfi yʴeq95f೿FU)R=k:&1)c}ᙓ{K.VnmØ]([P!G&hh w?>[Fo %u7̯=gC/mX?T,aeqLGu=?˧+O਻`"år߿>ws<o\p`Y\]N6}_x\):O{u3{uC7V;Tl:wuz]wͧҮqXy,gqH{,X|2JoXv?Gzre,l<(= (&J{Z0+l}ϴtqXkFnH|$S۳}}ODۖrf3Gz﬜rCW=#ӽJ[~w_0=='1ٞvH4.Xs s.hl{Fߜq>;/BO#o[^+LjҴq=S 5~г^ cNO U}l<7.ˏݩ.m|{:|N/ȑc?=93s, a==ZQt4MVypO}U٘t(p]B%Cɚ>+ie4~`3X ؓ&ܲhȶu+ `ܖfF}^0xo<zz-%JmL+ђsO콕O++{uOn C))]n试%"$ςqsto`۰٫{s ˩7Ln+ }]ۈˇ (Xt]dml}~1;FogO{G~P>Ѵ&SOMīj߇4_/FoCC~hTG9QGj1e\& GNOrCd\<{p[M.~H=HmfKssrкz it0vqn[>z(gL&6sy . ߴNDiz6ϥʓL>iK3pd/<.h;WV^{Jl"}` X`7w -z@}oYݷqY0Pkidi2w^͉z䤓TlbyVn^EjWDX,n=dG6ϩキ##v '3x4 M6iҤI ?{~@Fs5"/z Rg7,њ!z[ux?o>:F ?k}˚z(ͽ+*U[˧7xU=cL|?5{[Sc`j ĹI5趬Gܐc=;V?Rojc˝VT~;+/Ԣ'ЙI>7grd7Y~:@@eC"z {f?uGzƮOuӘKKWkϰ_3brU4O RSFa #@&MD%!9 9 9 9 9 9 9 9*:^UUm N@cǎ sP@' t#GP K:A^^@] B@W!t:@U *N@t@'  @] B@W!tS@"0@Ih޽*++Ӆ^/BGѣG5qD* A8 555iUYY>H믿f*B8 }ںuy(??_{ѥ^s9  N"555ڱco߮.ۯ_?r):tF͛7KJJ4p@*  cz_~wq9R\r ͜9Syyy_N8O>WUM{K/^{?OTTT/s㪭uul38O[_bÂ~QtcaO+_}UqqJ{ӡÇ%ԧOoGE(??O_SsjktA}~5Ӭ霳 7ܠQ.ʕ֭~=DtOaCqmH7M?׷o_*oב#uugkРUKݫlS#jکww ?[|y~oʕ0a?9܁kƌ|ᵍzukޜF]:b]~hйCiNWc}zр+OXs*RlꯝU^׉M~u-:v 0۞ KTޜ:Ӝ lǥo^сU-ф7a:z:sضB9z.v:Э\ek׹ s,q8Crc xOÆ+ ֩oݻ?YO~}i:a |wl}Kϫu\QҨQŪѦM٧t5Wka˿K`6MW..d6ϛN8 Nz_꾽qf?۬WWqVIwkƖ}[F-_]ͻT>^ZvctvϜ$mQxw6ޝA,l"p/@SLс/ /Ǐ.xZjoR}]=_mOyohTwQ+֞H5ApP]~y ж֧~+B.X ,ibNU2"8M[eV M.5ާeZ՞۴+<6>R9ǹsuYtpK^'ѹ*#wKߪ]HXJw&ܑuxOw6 vKܿ hT#蜟jO\yv dիN?/.gBoF566on{ٟUMuQMuTF+1?u`,:gÁ?<{^Kxj-WZGz?Gj  vcCφZ~d. -Ðͨ4J,u]>+-\2Byofkǂâř\WeTt +fM{,2źl- tWG Q2^U^[٠`QNms%x+loRp5?6i7?4$U~o&/[-Y۠m%OD;^NKvRi{Uqҍo1WNnWhպXw٫?XF]5~MM~WWZjZ5w lAm|]GߩK_Ly|"]2Rj~Hz?A?3[-T+GhcF~d>ִVtmZ[TqlHk+I;:MToW- (^rj[0},]0~f[P7o蟊z\kR)i£;^ 7*pϭPмm~% -<ʿEܶZbg=C ZlÁ=݈R>:IO;ua9:Xj3;߄,ꨋۭ1 =@ڰa=\|Fu=C{vQC}l mjyoAA oZ19]`S}tD( ܷO_Y`ܿP9qK'۴4 b`Ye]QK%4ݶNsCsfD{hD2mZ\qz#aoPi-s=\`%+*f2g1v_K+rHPjIMznI`.UzaWWUZo$2w> l~285X6#&EHO}t[062Î>?tyS4eFDOt7!+ /QLѿi\3h䥗VXw8 )W~~A6+OQW_S]^[{ٓ{OG:Qs\5^^ 9Gg;4= C~25{yM(p,lxut[!zE(~f̎wSDRM?|ǭ]yWƸдy*WF2wUjL<:۠ .x P>r1ZQMs^s v!TFr)+QKuj6s'Ve00l=ڶ/*`J>TݐЖXo˫W]=ݸ<\%Ew|rl>RI;V^yV˄ɰf\RLG譳ߥ^i lv:9޶jO ejz<={54xN\r g=d+jϵRVH&ݵ*;_Lz;R;)ÀvwǣFyoSC`j LM90=fǎ4u)43*ݫ?+?; Y!P1QyH'Nh:3t{o8]6mbG!k c<:sK[邿 pwYgz=vLgqsA=ÀB=(pC(O~нonRws{{hUL9t:xt7a*z{ԁܫiBz+6 u zl앧˄{o__^_TST4K*_uuۧ>#v9nv/fݟ3Uax&tk9vaߐ_0ݻjkk{]z)~Pn֭OTXXһ/wC}m8?B{oco648{[zcuQr/OT_W?v@7Aa! vo:555k>]6o{~[-xqzj k^Sc Mڿw`CmP`QC=׆65{Ygux=n 2%g^54A ݧZ#{ﵨw/6XAy=Ɔ@,g=տ 9g gz凞l u5hokBۧ  $j 6 @7@a)5'j^>Xx_˺p❝9焟 АauH#p@a SN=U555TԷoPZz?_GبMͭo} G P(ۧOhR GWk5y?? VC>}Z y4'zK{侉S/ Ҏ}cl9^Q"t;|up˹{@9r>;Y(p` >7:x0:7 ߇{[/Á޹ojO>Ummz#1bD Y|^i~Ewnxmu btDk; C4ҾA=̨QtA566W^x~}}n_~A! }cW" >\5z@baas;@7Aa#էo:|DUUˏu@/]~`?"KurM_g=?*T F]ve,e!UK洔cBܮ*UZ2599 9}ܴLT:>ssDbl7m\kl%b1n#MX3:s)yyJPY2,-bӪeɬ./N]&w<)o?O"|k*6j;Jn̮~J=݇mc2y&:O;ρsL;cc+жJy1ѹ0v}L&>W:moMvN M}{/(7T]}{n5X=0Ђ{Pa{O`딯 ?/"8WWcgF6R}7ο`vy3BÕ c\x-mWh9ozlZbnDF?yW4=fkwy߇Ҵiؼe ^MJO<ݥ'b1Q#=ޅv"vrݶ+޳”w*lT}G΢ ːZS 2qbe/onXӪ#U4{*NM$kWy\D~nʣһb<9n+c1b?Q[0yyL&9WMϭҶաV/JF @@&O?P ߿>#mݺ{%O>ra~Z&f`\A^dϟ;љ}{j;;UXP޽zi߾;iJͻܦmZ7KU~͟AHB:vS)mzq|$ʿ_.{Kucyq6:;FhȌSg'a=z'ӺLVXI㭓,[4Y-\llW q$6D%:$qۋ2iY=~c/ٹo|n666zd???qN@_~:u٭B+ z  |xH%ؤ|o;3T?_uuzWtDC޶/6l׍ҳ~]*2=;7_&[ϢbeuF]vj4+NZPnm'd6xs[:Duy@%ukuooiRxwמ|@;޾})苃5kE <#ևxv`O@AַTphjlԆ?wwzjǎwtw]emd_ZU.\蹔]0D~xdY+Wۼ Zr{=^u_.J{[txu]$e[L%Q=[/dt_#Vy);QرfqV7a~޽+WQ7z)}MӌفOrjqWFO݈3(޼=l]-0/#JG΢ʗ q˞Q$t2Ee&1=i㤓Q;ʠ{v;^+ < ~mu>_(\4fҦ3q˟d\ _s [mٶ@07{ɳ! (ry)?0dcq{ Ͽ`9vLÇNUMe80gN#{Z,^xՃG1, 1)HO"/br#K#PIF @c 8ƨex>gY$[UU]jIǣ:uΩSժΩ:}?=8'>i]{ʞ ͝ԉXJ;=6mبcGcȈ,5ڹsg<{ i(]kcf5Wo^]&=|"*ۇHMP@S0J MN@y{tc=߳عS=\NT]}L.+Z^rlcA~~o5\yp>)` d~ܜs??O|zGtEK6۟M,ں|]z%z _=Ϟi&mQ=z)=CzD?noL|q}cqamذh`;V@`(g&w {Iuާ7nWJmݶʝ:5=>;aFmhw |M ,s ͝WZmY^>~:ؾ]CEAIS f$ ޙ#G|W\q=*o~\/\_U6m|'N'2c=839:+-XyyIR3zQ]uU+QǏ9c 42Al@ ّt٩`v4k>7O6ZZZt{b^xoߡ-g7LӵGZyG}F>C?lGpvo˖-zgf[&|S> el_LL0Nwg#LPΌ{'裏g zv;oNgq?|;Ϳ&h϶a&Se&gqf ܹ~ hg{?h? 4A Lβ_7m#@m!a&ؖhF'}bym,+$^}}m+~@G |?u4]#D@ F0@" a#DXMC?ngs[VL7>.hЋ/@/k٭-[ΤXy/ܮchۙuռebu1=s\=qƧ4r]vRGh4j@Lޡۏk 4:zY|76lRAIZwy4 5{8/9W:Cgn}tXvK-̱zq~Z_|ݶC7#=U.фc/klʹ)cMf՚y),ŒmkZSvb%汞gaX~vNi]GlLMxlP9CAe)j_FثwOKeX?K{Whғ=jFldzR=M*DwLdVR7XD J3N z?5(/OVy/g]\-ZZsLU]A5kủ]k XulaaAY^'<ϟжԯI眹ILPW]/8_{T__{Z/8Q5l?˷ 5_+jvPֿ]jskij*M=#HTgY DX-hS)=}PW:bSg ߢ 9] uzgI=3U.xToxz[c*efM/Wvfګk rn<[gʙ#S:OvQw% STVK]mǛM-Ф=3=T`ejf|ۇififV'EV/ٟ4LoR`eR}U@?Yz@̮dOޟ3[q?qm{hk3ܿ |6F.k4h92qZfbLSMpq"̹*X+> <z_=fJ7xl|7X.GuB'=Uɣ;r^Rwvw?#+@@xFgiCbkeF9:LoLXƆz:5ڤ{l:_fr8cSg~wєtnZSŽ0KsGhpSfZp_ҭ_GCPyOXkS;g$Sd.m{#Mv^>~AasLdFMD׳2PXe=W:%3}$D<h%bIocͳ;N|T#/+y8 ӷ[W鏕Z @?@/@n9]ۢ{|\Nt}>ҩv`އyؠ ^e~ עMFks?$%6#fڥq;>WN=jHMۓnxOFh':9ӝ@*3R/,G|_ٷ%˞j q4QFu`:ͼV 4-sYB!3ٿ-_cWz?Z.g̛ NsܸSsszΙvSJ+~gF_-֓ϞгϝOO}v^Z :^m\z41#vk{N.hXcgLq5'\ 7-~3&34?uo#zɣz3:g:NW6G|Nɟ> j4AzKꎯ|E̴a RmLY_s?gc  ϯWMou]+Ny}Km4 v{Ւ(UOߨOBl Vf?{W0~]'7;w層YbiPO:oo+ѿ|kSGW;Ȍp xK:aZ\w/na*mǍKO}x)KG!oLE}`YV+OO_9*;>+kJU,L?;rôv+=w;`yPkbf(7(\\Ε]Mv.:=̳wW^z?O;M''Qj6nh| _sO/ 3]L5_|Nϳ)j5Pn֏4JJiWq 4FԖ-g:rlAu^_x>|iSc6oܠM`-z舚/> t捺c[ZWBC1"rzNhlz:pߛ`A@"c˗{Җ7أꭴr7kmԠ?rT[=]gQ u:㴍y.=]rE+XY :tʚʹ֬zmDXsGnJy'qZho 1sDp p^~ť:F{捍J6hFQ ZwAu,~}@ӿ>^w1@xLV#u]{~pcH>;i=T_oMA;. hF'uᦣQuWЪ=O>M̟Ug3C glP_o>]_!QuΌ{g|`}C}L)<=+3tM\CCPPG/#ГiӆzujJt)ץuޖׯNPPCCV{P_-ܜN4< X}B~Eoemng洡q`?$mNo߭ScczvP%?趧7.mgyU/^uPt߷P#hF]]yiyůI?I/A;/8S7SSzѥk&>ڢ?MЪ)M46X}9u zDÛ4{#9tN3ks̝pk2mCJr/'ƆղiA f5Lp7nT=ڸ]51u>ճŖԼ m:m.=e+Gfj233g5sMPw֩T`&v'32B+c:2fZ.gN5)ޛ/C[guMu^~Zݝ/wn;uw/WAݶ{ޖO>/W2@# ޫS֫J{Y<>鴎yJئe+G9a7:zFSω=ʏmԈUԀ^Wb[mCiwe~6? u{N (aɞI+_fb*gۚu/@*mbshm̴mbgLdOvfaMƋEj곖M~9/-SjaY'ۭmeSS&MmgPy]ͪ߸[oRLeBPy;_uDziOPtJJM+RЬym}ڹ'S.;ش~i K= l=3N[)vԲKmm+;]#E$:n, ˑ7c?WYR(*r&}}aq6P/zGv`{)ϕ3T?@@9;ߨ{Ӊޥ5??S'O#u42:u-UuM{i/S343o$߼Bkvf<$#1z6ud":0ZGUgJ}HǴ3ό3r3DMCɓ&=[Ong}~cB?[o&ώ_#G駟s=gI{ߨF225<ҪoݤI>{TGd0%K*t:SlJF5ag5ag>Z*udpb22[՛BW̽06 rdFbFU3o|[J=wL\ Ugq6ol{駫Q7n۰aޜlpn֏4JJiWq @}}N;4mڴ)4moN r&ZWWg'3?Nr=@4,?aCD@ F0@" a#D@ F0@" a#D@ F0jЄc/kjivPV ήݰ.Ӱ}>~* 7+QmjUV9? ڿkVxZ5V1z4TOSuً-ΫYL{DVA߬>㟠kO_@M#` H9N+ %0ejkrTo<ւ?+jhdm&lOe* uVkds˖)W~u)N2 Nclvqu+W\\/՝<9W3B;_nT)CsnwQG]&]1|kkO=T'rlXo~YcɯW+rpvhryEcX s_E燢}OJJڦsHP9Km%zLJ)wSgt;! }7J ^Trku[seyyi7UNI$R9Az+5Zi6[ +esJ;t.n Qweﲟ+O+ ,fusts=չ:˹\5:cuq )db C]cQncSf=)uYG}]IMdP瞦P k˗#xYEnֈsC{[u۶e}X\}VzFԙQ^Y$zJ׹Ǯ_ӞNKrOekv)ή;m.d;<в =IZu/wXUmMH8Dž}(YԱTa K8=do&W-8Ƽvz~)P? ?6%!VA}٫~Hvf2#Ǧ)^:en)؟m{&|QBKh}~to\) SZe?WP6.^~߷o-߱Tz~NUgcmQݪ+A$FۄegUŘ>[Tƀrx#[lżiBE3BKh>PȤbc@Y%?p瘚ci%7Gfٴ kOYDmJ hݙUgjHdOue`>J,^p+*S2JHߵNpقfԫYfZ^Y\Ӊ\Ӝk̺^*k<3ˌrꓰn֧}4Ϝ7GN ,xƢj٣N[Qyel *WYJ,Jg[v,,s׏C;U=jqm?mP[qGV~A'aGmSnٟ}W LMo(cP9<P2x1|103BKiS>>U9Zjx@YnfunϨ;V}Ss1b;PbecTJJn+lo,0l)'{D;S 4,!C>16&VʹJˮ&ٯK<jNw]J7S,;';I Vf1gD`wn})1R|zn=E9ښ_'7Ӕ,lNc)_Q[,Y047MֵM=[]|e,Vm{|?BOά[3m˺xqP|7oxoҿ EѬ]>ۦٯ&]r_NȖ{?Vw_>/W2F@JK Je^[VJ hkYnT)gq?PR]Jچv]ZK#6ջmM $j0OLM٬ںƳ푕]vHmZֵMnM~w]㹶NX=yɩuUS&~-cB\'{vEw&8dʞ.ɯ)um3z  u´9dۨ~ltUMK_;i&do(W%_n=2QG@훝єі+rA3}XB s2hr̬+h`27k'T6*PMY7g/&P4HtjOSXDsTLZ\oNe`=S Q{utʮW[eGF6]Q,OР:}*{DQ;{afѦ2ur:of/q?*>T\lM?c}Ƿ{aYN*"KّCih9&.gg6}_igxgJBeOJf+`G̿:0:g2{djM9|۩W, ״K-Vn]#/i%͊:TgUfr<T+'O@P(,C@4dϙfkswdF=c*4^Ͳ{R[Hezon:cx=Ĺ'3>\Îd_O%*kzs5s6\5D9ppXzY! 2#F,UǦ=4K& V6ft[vջ_p; FbFU&Vm;[zͯ[c~×KNw[(_[[]eGscnw㳼gf=_*_dy~۳W+^o? z)~Muq)^m4}lg^]}s9|/~v۾D=}6z|rωAA݋viJ>N X4D*1'h^oF+mf+atZi.eV|ۍ(xK]?')źf^Xҙfϖ@:ˣ8?z -Z.mSlyʔNmӽeRb m˵{Xe (oP?W|~orټ[hu3y E]ym+hyr6[.[~Q1T؎fIC@~a\?/?V'~/տϊ {ۧ!}˷ٗOs_ ip|= D·9{sh>T=۶Cs+P=z\79O9S[뫳Ws=V\ B&FX:5<665}m/3R:ڜzוt*L ui |9-Θ?Ǜnqq5ޖk]z;#_ۇUڧaWnd1U:${ 㕝찦=Viᱢ@aKt*Y[vl;a+lҮ eo׮O.C,_\֟KKKܦ#΢ʱL^>u/[Jr=9*lշO}hsn]}?qTg5ڰ륐kF]a91{4l Z.m+{:>#70~"cv_Se^L/ Fih*ȿK L̴v9Ni Le.R5ir_.'U9BXsVd/|ηk5U_NuC 5͌~U~B.hXcgWs(_L*e]LfW29_+5dY}_x?8lQ]aF2Lhb0wxsk?ئ#٫[qt~CjJvr}sP`;'5z {Ͼ̈EŬ7k"t;.C]@{ֳmX شG*~WmϠJmu\g?ԐIs`|6%qݠ?L1jSG߃6YL {NpقfԫYfZj*_",yxNI{ԢaBi]g۱}qfjV! %lKχ3,c.|Ҏ!+r{\@~>S~?VOVڏտ} xi}ZplZ?gY}V/B}2Dg=ц_3eq_ڨ\-AJGZs=߁/s:WwW27mv.ybXGZTA+XfUSiR=ZebBǧ՗+ujtnSNsyWZp+P#_ౠvg Ϗ{S+;'"+ :ShOj^^Ss?.OVRwOޘ 9P U``e00@" a#M;S{V ήTVj[+`vPQϒj5f?N]>Js;_֒oiEEĢnpEy9>).2Ee7޺'yv/(GXQ %]r%)ոҦM'.~v*5k/tI#ҁRQUl=һ>0hgJlXLpL*ox6-oTf&jߛwe%5TxdmJst/Tt>\y%ߡ`9 g5U/+ 70#fZksQ5j. bARO[jz;D-1تvk2I=PGu:t HPi%V kg%msj{M_zOp2ױP=k^?u#3_5z)~OYǾϯ~Y> L ^>CLn>sO+X?W~)X^SUݭζG$xlkI+W|ٵ2|#٥h> \q{Ԧj,="$Li:٢]aFV=L3SJʛv(9_C]Is"ӧ3T4 /N>1#`4ǫ%If53[iY?Δw/>]]<={HEsi.[s}3rzg ;+߹lS]%;u6`M"HsVjF+mV:JZivX"+]f˷x0rHJt׸Jj \xW:{'%)g+=ŋYw{T+_[?'ysqըG@y=Y\⺸il|JS>\@µsKݻ~r=(_L Uk.:.X_eP{;28-EFs0oKm|Ü?ڢp?{{;f|ϭm+}y h߻a~NW]ZN;L :nr.r:Wg9[Fzι>#A"LP441lvFSrhjQ_WRqe#YbvrqcFX̺FQ73Y̗CkTTD>_yyg\YnJS0\JrZ)!_Y}Y^V}R_E (Sb@h ^ߜ*1UMD 3RgI)m"qnGӿr#uƦ6jNvh&45Om>|fڵ1x;v s,uwF7nL~OUx*}o]=wr9TJ >e> T@MZ n@7NkD{Wv\rߴGaE}Si{t_ qW3]6cє)u fm}S7_R̃?L0 ޫdWq{l-yeL.K9f淭y-UXɿzwrϥ+`m#`mpF\:S2YFՙ=LW$;#_ Wqi$B1yy7{T"!O9&\S)UGQ<_XV;~rkPnzfn{=m*cUk_iS3->^u? z`BiFY둽}P.[;MKTPOff~mۥX\-'277eՎf:`˰ r}‡:y̗ZviI}ϣ~F{V3vl ݗ'Ro\]cׯV=Pnӯ'+lm X߭ݽ\iޕ\1Jc `}1I;GH U{ YMwU2lL}Ei`Dw5Y&7f ;Wo>d&P:Jzzk[Ws:'Oն2;_)@)PuLVS#D@ F0ꎵjp !D@561XL1+uOH&旋ź\ccwg5ؚ?v:ݭ=W2;y vcoװꍻRʶZg 7YfjTRH:xcګY|Tچ73mwOk-\YͶjch6 :(gvZƝm4 v>Ѩs$jTB#=j2?u=MS1A'gd>t*Dv$]{>oVbpD\j䱯m:Um.uduM=J޼,1z%\.ӹQh93]]) $Ez4inۻ)[mԫywZ-l{[c6/s<1姾^5\b.l]{:a:]SfԒāR+ջR+5ƃ]N#@wGw~<9WwWJk10@" a#D@ F0@" a#D@ F0@" a 4FFFhXU4+`4{&V@`1 V @` BXXF V @`  V @`0, FBX/4+`V@Z+ X-ܘ 0FuiffF?яt=ɓzG#0qj֭ϻwV<_rKq1}_w]m߾]ykw[7nԶm ÇNz'?kVosA X^oN}ӹ瞻h*"@f ɟ^]zi,y@Q+u73ΰߟq֙:o_z}_ngMH#"3=kߛaֹzoG>K.a@ddF.cz/KO|BЇ쑀D@If;N{dWШ?3.NhЖ-[Xԧ|D~:" /| =^>؁¦&Ԏ;ѡ˿Too/ " #GhrrRQ~Ǐ׿{^3ӅM )KkkFGG!"ellLo~'y͛u }_w];tuE/zu~ RG8u_;W*b1vi}̿&hF~ wwyiaOos.I7N.?yEq2svy+&o̗=Wl3u_533c"FȘjFg{ H?ƍ Iz=8H3eШ_Gרs*M]!k=B&]o=zu9+_;Xe~H}FPYYT\}Hөr{y+_;Co|9@dq]w%_#3#Mp~Q ɤ_U{$Y&B3}4̜7_6MEVҋ?{,LBLmalZ]|>[zkk_mf=vm@0Dƃ>m۶inn.T*͗ 駟|I{D 7ܠOz衇Zm$͛K^_zv夛~ɛv馤nX^K_{Nޤ]Y={՗7ޯ/wWnܶ U_|Y 뺭ҭhG2W2)ɧGvaQ:mݺ޿Q@&pcva-7"?~7zoՎ;VQe}*7}]SCekvl0( 3R/RxMoÆ :묳";v찷aR҅;4=`B~˽Xe`jk{o+鰯)GWd>_ՅyN~@LNj-\yb{!;r3.]swf׳×Քa~31~zW)m}k@sN=S40F@k ׽ΞZl&A tqbD^^~ug?UKܩ;MiȶLg|,oj^}_uoIݚo[wt|j)K¢{!S5_p@<GIA߶ YVׯm#\z~%apwO =6olOk/nu֫>r_]ju_wˌX3F3na1}Smfͽ>}|߶  =ӟTgu ]veKP}}=a{Wǎoo@n\q?3=C;@q"/~vm?z׮]4XwunjD]MD@N*u*p_Tua}I= J_SC^g@`y"\G5 /)7 Xҿ%_ U-e Tu(Zk* *Z B]O-$ %",K/S -hq0s}M&~/@ʔ_6Gea@3_>_̕9Nk5ʏtc(y8^6+Ju>'yٻa +o,v ͞!ЛAr Nzy:@]5w ]ŹX+"7I#(?XD{쨆Z=6yK< z^'}ˀ[1P@x6؎3{!O];E p3yIW#`Ka1~fL }wֻ"@`Pu o/vp;& Wv .kYv_>u^yoNg]M^?ƚK@X3z1%!mm;vuG`C <j.Q,/?}z%Ώ Y+a+~@RsK|41H zGa0b|91p cp=v]7͎ pkLGl  b|<~~uؗe \~@HL@HL@HL@HL@HL@HL@HL@HL@HL@HL@HL@H2ecSݒIENDB`DisplayCAL-3.1.0.0/scripts/0000755000076500000000000000000012653527012015164 5ustar devwheel00000000000000DisplayCAL-3.1.0.0/scripts/displaycal0000755000076500000000000000013112647526531017242 0ustar devwheel00000000000000#!/usr/bin/env python2 # -*- coding: utf-8 -*- from DisplayCAL.main import main main() DisplayCAL-3.1.0.0/scripts/displaycal-3dlut-maker0000755000076500000000000000014612647526531021376 0ustar devwheel00000000000000#!/usr/bin/env python2 # -*- coding: utf-8 -*- from DisplayCAL.main import main main("3DLUT-maker") DisplayCAL-3.1.0.0/scripts/displaycal-apply-profiles0000755000076500000000000000074712647526531022223 0ustar devwheel00000000000000#!/usr/bin/env python2 # -*- coding: utf-8 -*- import sys for arg in sys.argv[1:]: if arg not in ("--help", "--force", "--verify", "--silent", "--error-dialog", "-V", "--version"): unknown_option = arg break if sys.platform == "win32" and not ("--help" in sys.argv[1:] or "-V" in sys.argv[1:] or "--version" in sys.argv[1:]): from DisplayCAL.main import main main("apply-profiles") else: # Linux from DisplayCAL.profile_loader import main main() DisplayCAL-3.1.0.0/scripts/displaycal-curve-viewer0000755000076500000000000000014712647526531021672 0ustar devwheel00000000000000#!/usr/bin/env python2 # -*- coding: utf-8 -*- from DisplayCAL.main import main main("curve-viewer") DisplayCAL-3.1.0.0/scripts/displaycal-profile-info0000755000076500000000000000014712647526531021640 0ustar devwheel00000000000000#!/usr/bin/env python2 # -*- coding: utf-8 -*- from DisplayCAL.main import main main("profile-info") DisplayCAL-3.1.0.0/scripts/displaycal-scripting-client0000755000076500000000000000015312647526531022522 0ustar devwheel00000000000000#!/usr/bin/env python2 # -*- coding: utf-8 -*- from DisplayCAL.main import main main("scripting-client") DisplayCAL-3.1.0.0/scripts/displaycal-synthprofile0000755000076500000000000000014712647526531021775 0ustar devwheel00000000000000#!/usr/bin/env python2 # -*- coding: utf-8 -*- from DisplayCAL.main import main main("synthprofile") DisplayCAL-3.1.0.0/scripts/displaycal-testchart-editor0000755000076500000000000000015312647526531022531 0ustar devwheel00000000000000#!/usr/bin/env python2 # -*- coding: utf-8 -*- from DisplayCAL.main import main main("testchart-editor") DisplayCAL-3.1.0.0/scripts/displaycal-vrml-to-x3d-converter0000755000076500000000000000016012647526531023343 0ustar devwheel00000000000000#!/usr/bin/env python2 # -*- coding: utf-8 -*- from DisplayCAL.main import main main("VRML-to-X3D-converter") DisplayCAL-3.1.0.0/setup.cfg0000644000076500000000000000056612647526541015336 0ustar devwheel00000000000000[bdist_rpm] release = 1 packager = Florian Höch fix_python = 1 post_install = util/rpm_postinstall.sh post_uninstall = util/rpm_postuninstall.sh doc_files = LICENSE.txt README.html screenshots/ theme/ # keep_temp = 1 [bdist_wininst] bitmap = misc\media\install-py.bmp install_script = DisplayCAL_postinstall.py [install] record = INSTALLED_FILES DisplayCAL-3.1.0.0/setup.py0000755000076500000000000012076512653526636015240 0ustar devwheel00000000000000#!/usr/bin/env python2 # -*- coding: utf-8 -*- from __future__ import with_statement from ConfigParser import RawConfigParser from distutils.sysconfig import get_python_lib from distutils.util import change_root, get_platform from hashlib import md5, sha1 from subprocess import call, Popen from time import gmtime, strftime, timezone import codecs import glob import math import os import re import shutil import subprocess as sp import sys import time if sys.platform == "win32": import msilib sys.path.insert(0, "DisplayCAL") from util_os import fs_enc, which from util_str import strtr pypath = os.path.abspath(__file__) pydir = os.path.dirname(pypath) def create_appdmg(zeroinstall=False): if zeroinstall: dmgname = name + "-0install" srcdir = "0install" else: dmgname = name + "-" + version srcdir = "py2app.%s-py%s" % (get_platform(), sys.version[:3]) retcode = call(["hdiutil", "create", os.path.join(pydir, "dist", dmgname + ".dmg"), "-volname", dmgname, "-srcfolder", os.path.join(pydir, "dist", srcdir, dmgname)]) if retcode != 0: sys.exit(retcode) def replace_placeholders(tmpl_path, out_path, lastmod_time=0, iterable=None): global longdesc with codecs.open(tmpl_path, "r", "UTF-8") as tmpl: tmpl_data = tmpl.read() if os.path.basename(tmpl_path).startswith("debian"): longdesc_backup = longdesc longdesc = "\n".join([" " + (line if line.strip() else ".") for line in longdesc.splitlines()]) mapping = { "DATE": strftime("%a %b %d %Y", # e.g. Tue Jul 06 2010 gmtime(lastmod_time or os.stat(tmpl_path).st_mtime)), "DATETIME": strftime("%a %b %d %H:%M:%S UTC %Y", # e.g. Wed Jul 07 15:25:00 UTC 2010 gmtime(lastmod_time or os.stat(tmpl_path).st_mtime)), "DEBPACKAGE": name.lower(), "DEBDATETIME": strftime("%a, %d %b %Y %H:%M:%S ", # e.g. Wed, 07 Jul 2010 15:25:00 +0100 gmtime(lastmod_time or os.stat(tmpl_path).st_mtime)) + ("+" if timezone < 0 else "-") + strftime("%H%M", gmtime(abs(timezone))), "DOMAIN": domain.lower(), "ISODATE": strftime("%Y-%m-%d", gmtime(lastmod_time or os.stat(tmpl_path).st_mtime)), "ISODATETIME": strftime("%Y-%m-%dT%H:%M:%S", gmtime(lastmod_time or os.stat(tmpl_path).st_mtime)) + ("+" if timezone < 0 else "-") + strftime("%H:%M", gmtime(abs(timezone))), "ISOTIME": strftime("%H:%M", gmtime(lastmod_time or os.stat(tmpl_path).st_mtime)), "TIMESTAMP": str(int(lastmod_time)), "SUMMARY": description, "DESC": longdesc, "APPDATADESC": "

\n\t\t\t" + longdesc.replace("\n", "\n\t\t\t").replace(".\n", ".\n\t\t

\n\t\t

\n") + "\n\t\t

", "APPNAME": name, "APPNAME_HTML": name_html, "APPNAME_LOWER": name.lower(), "AUTHOR": author, "AUTHOR_EMAIL": author_email, "MAINTAINER": author, "MAINTAINER_EMAIL": author_email, "MAINTAINER_EMAIL_SHA1": sha1(author_email).hexdigest(), "PACKAGE": name, "PY_MAXVERSION": ".".join(str(n) for n in py_maxversion), "PY_MINVERSION": ".".join(str(n) for n in py_minversion), "VERSION": version, "VERSION_SHORT": re.sub("(?:\.0){1,2}$", "", version), "URL": "http://%s/" % domain.lower(), "WX_MINVERSION": ".".join(str(n) for n in wx_minversion), "YEAR": strftime("%Y", gmtime())} mapping.update(iterable or {}) for key, val in mapping.iteritems(): tmpl_data = tmpl_data.replace("${%s}" % key, val) if os.path.basename(tmpl_path).startswith("debian"): longdesc = longdesc_backup if os.path.isfile(out_path): with codecs.open(out_path, "r", "UTF-8") as out: data = out.read() if data == tmpl_data: return elif not os.path.isdir(os.path.dirname(out_path)): os.makedirs(os.path.dirname(out_path)) with codecs.open(out_path, "w", "UTF-8") as out: out.write(tmpl_data) def svnversion_bump(svnversion): print "Bumping version number %s ->" % \ ".".join(svnversion), svnversion = svnversion_parse( str(int("".join(svnversion)) + 1)) print ".".join(svnversion) return svnversion def svnversion_parse(svnversion): svnversion = [n for n in svnversion] if len(svnversion) > 4: svnversion = ["".join(svnversion[:len(svnversion) - 3])] + \ svnversion[len(svnversion) - 3:] # e.g. ["1", "1", "2", "5", "0"] -> ["11", "2", "5", "0"] elif len(svnversion) < 4: svnversion.insert(0, "0") # e.g. ["2", "8", "3"] -> ["0", "2", "8", "3"] return svnversion def setup(): if sys.platform == "darwin": bdist_cmd = "py2app" elif sys.platform == "win32": bdist_cmd = "py2exe" else: bdist_cmd = "bdist_bbfreeze" if "bdist_standalone" in sys.argv[1:]: i = sys.argv.index("bdist_standalone") sys.argv = sys.argv[:i] + sys.argv[i + 1:] if not bdist_cmd in sys.argv[1:i]: sys.argv.insert(i, bdist_cmd) elif "bdist_bbfreeze" in sys.argv[1:]: bdist_cmd = "bdist_bbfreeze" elif "bdist_pyi" in sys.argv[1:]: bdist_cmd = "pyi" elif "py2app" in sys.argv[1:]: bdist_cmd = "py2app" elif "py2exe" in sys.argv[1:]: bdist_cmd = "py2exe" appdata = "appdata" in sys.argv[1:] arch = None bdist_appdmg = "bdist_appdmg" in sys.argv[1:] bdist_deb = "bdist_deb" in sys.argv[1:] bdist_lipa = "bdist_lipa" in sys.argv[1:] bdist_pyi = "bdist_pyi" in sys.argv[1:] buildservice = "buildservice" in sys.argv[1:] setup_cfg = None dry_run = "-n" in sys.argv[1:] or "--dry-run" in sys.argv[1:] help = False inno = "inno" in sys.argv[1:] onefile = "-F" in sys.argv[1:] or "--onefile" in sys.argv[1:] purge = "purge" in sys.argv[1:] purge_dist = "purge_dist" in sys.argv[1:] use_setuptools = "--use-setuptools" in sys.argv[1:] zeroinstall = "0install" in sys.argv[1:] stability = "testing" argv = list(sys.argv[1:]) for i, arg in enumerate(reversed(argv)): n = len(sys.argv) - i - 1 arg = arg.split("=") if len(arg) == 2: if arg[0] == "--force-arch": arch = arg[1] elif arg[0] in ("--cfg", "--stability"): if arg[0] == "--cfg": setup_cfg = arg[1] else: stability = arg[1] sys.argv = sys.argv[:n] + sys.argv[n + 1:] elif arg[0] == "-h" or arg[0].startswith("--help"): help = True lastmod_time = 0 non_build_args = filter(lambda arg: arg in sys.argv[1:], ["bdist_appdmg", "clean", "purge", "purge_dist", "uninstall", "-h", "--help", "--help-commands", "--all", "--name", "--fullname", "--author", "--author-email", "--maintainer", "--maintainer-email", "--contact", "--contact-email", "--url", "--license", "--licence", "--description", "--long-description", "--platforms", "--classifiers", "--keywords", "--provides", "--requires", "--obsoletes", "--quiet", "-q", "register", "--list-classifiers", "upload", "--use-distutils", "--use-setuptools", "--verbose", "-v", "finalize_msi"]) if os.path.isdir(os.path.join(pydir, ".svn")) and (which("svn") or which("svn.exe")) and ( not sys.argv[1:] or (len(non_build_args) < len(sys.argv[1:]) and not help)): print "Trying to get SVN version information..." svnversion = None try: p = Popen(["svnversion"], stdout=sp.PIPE, cwd=pydir) except Exception, exception: print "...failed:", exception else: svnversion = p.communicate()[0] svnversion = strtr(svnversion.strip().split(":")[-1], "MPS") svnbasefilename = os.path.join(pydir, "VERSION_BASE") if os.path.isfile(svnbasefilename): with open(svnbasefilename) as svnbasefile: svnbase = int("".join(svnbasefile.read().strip().split(".")), 10) svnversion = int(svnversion) svnversion += svnbase svnversion = svnversion_parse(str(svnversion)) svnbase = svnversion print "Trying to get SVN information..." mod = False lastmod = "" entries = [] args = ["svn", "status", "--xml"] while not entries: try: p = Popen(args, stdout=sp.PIPE, cwd=pydir) except Exception, exception: print "...failed:", exception break else: from xml.dom import minidom xml = p.communicate()[0] xml = minidom.parseString(xml) entries = xml.getElementsByTagName("entry") if not entries: if "info" in args: break args = ["svn", "info", "-R", "--xml"] timestamp = None for entry in iter(entries): pth = entry.getAttribute("path") mtime = 0 if "status" in args: status = entry.getElementsByTagName("wc-status") item = status[0].getAttribute("item") if item.lower() in ("none", "normal"): item = " " props = status[0].getAttribute("props") if props.lower() in ("none", "normal"): props = " " print item.upper()[0] + props.upper()[0] + " " * 5, pth mod = True if item.upper()[0] != "D" and os.path.exists(pth): mtime = os.stat(pth).st_mtime if mtime > lastmod_time: lastmod_time = mtime timestamp = time.gmtime(mtime) schedule = entry.getElementsByTagName("schedule") if schedule: schedule = schedule[0].firstChild.wholeText.strip() if schedule != "normal": print schedule.upper()[0] + " " * 6, pth mod = True mtime = os.stat(pth).st_mtime if mtime > lastmod_time: lastmod_time = mtime timestamp = time.gmtime(mtime) lmdate = entry.getElementsByTagName("date") if lmdate: lmdate = lmdate[0].firstChild.wholeText.strip() dateparts = lmdate.split(".") # split off milliseconds mtime = time.mktime(time.strptime(dateparts[0], "%Y-%m-%dT%H:%M:%S")) mtime += float("." + strtr(dateparts[1], "Z")) if mtime > lastmod_time: lastmod_time = mtime timestamp = time.localtime(mtime) if timestamp: lastmod = strftime("%Y-%m-%dT%H:%M:%S", timestamp) + \ str(round(mtime - int(mtime), 6))[1:] + \ "Z" ## print lmdate, lastmod, pth if not dry_run: print "Generating __version__.py" versionpy = open(os.path.join(pydir, "DisplayCAL", "__version__.py"), "w") versionpy.write("# generated by setup.py\n\n") buildtime = time.time() versionpy.write("BUILD_DATE = %r\n" % (strftime("%Y-%m-%dT%H:%M:%S", gmtime(buildtime)) + str(round(buildtime - int(buildtime), 6))[1:] + "Z")) if lastmod: versionpy.write("LASTMOD = %r\n" % lastmod) if svnversion: if mod: svnversion = svnversion_bump(svnversion) else: print "Version", ".".join(svnversion) versionpy.write("VERSION = (%s)\n" % ", ".join(svnversion)) versionpy.write("VERSION_BASE = (%s)\n" % ", ".join(svnbase)) versionpy.write("VERSION_STRING = %r\n" % ".".join(svnversion)) versiontxt = open(os.path.join(pydir, "VERSION"), "w") versiontxt.write(".".join(svnversion)) versiontxt.close() versionpy.close() if not help and not dry_run: # Restore setup.cfg.backup if it exists if os.path.isfile(os.path.join(pydir, "setup.cfg.backup")) and \ not os.path.isfile(os.path.join(pydir, "setup.cfg")): shutil.copy2(os.path.join(pydir, "setup.cfg.backup"), os.path.join(pydir, "setup.cfg")) if not sys.argv[1:]: return global name, name_html, author, author_email, description, longdesc global domain, py_maxversion, py_minversion global version, version_lin, version_mac global version_src, version_tuple, version_win global wx_minversion from meta import (name, name_html, author, author_email, description, longdesc, domain, py_maxversion, py_minversion, version, version_lin, version_mac, version_src, version_tuple, version_win, wx_minversion, script2pywname) msiversion = ".".join((str(version_tuple[0]), str(version_tuple[1]), str(version_tuple[2]) + str(version_tuple[3]))) if not dry_run and not help: if setup_cfg or ("bdist_msi" in sys.argv[1:] and use_setuptools): if not os.path.exists(os.path.join(pydir, "setup.cfg.backup")): shutil.copy2(os.path.join(pydir, "setup.cfg"), os.path.join(pydir, "setup.cfg.backup")) if "bdist_msi" in sys.argv[1:] and use_setuptools: # setuptools parses options globally even if they're not under the # section of the currently run command os.remove(os.path.join(pydir, "setup.cfg")) if setup_cfg: shutil.copy2(os.path.join(pydir, "misc", "setup.%s.cfg" % setup_cfg), os.path.join(pydir, "setup.cfg")) if purge or purge_dist: # remove the "build", "DisplayCAL.egg-info" and # "pyinstaller/bincache*" directories and their contents recursively if dry_run: print "dry run - nothing will be removed" paths = [] if purge: paths += glob.glob(os.path.join(pydir, "build")) + glob.glob( os.path.join(pydir, name + ".egg-info")) + glob.glob( os.path.join(pydir, "pyinstaller", "bincache*")) sys.argv.remove("purge") if purge_dist: paths += glob.glob(os.path.join(pydir, "dist")) sys.argv.remove("purge_dist") for path in paths: if os.path.exists(path): if dry_run: print path continue try: shutil.rmtree(path) except Exception, exception: print exception else: print "removed", path if len(sys.argv) == 1 or (len(sys.argv) == 2 and dry_run): return if "readme" in sys.argv[1:]: if not dry_run: replace_placeholders(os.path.join(pydir, "misc", "README.template.html"), os.path.join(pydir, "README.html"), lastmod_time, {"STABILITY": "Beta" if stability != "stable" else ""}) replace_placeholders(os.path.join(pydir, "misc", "history.template.html"), os.path.join(pydir, "history.html"), lastmod_time) sys.argv.remove("readme") if len(sys.argv) == 1 or (len(sys.argv) == 2 and dry_run): return if ((appdata or "install" in sys.argv[1:]) and not help and not dry_run): from setup import get_scripts import localization as lang scripts = get_scripts() provides = ["%s" % name] for script, desc in scripts: provides.append("%s" % script) provides = "\n\t\t".join(provides) lang.init() languages = [] for code, tdict in lang.ldict.iteritems(): if code == "en": continue untranslated = 0 for key in tdict: if key.startswith("*") and key != "*": untranslated += 1 languages.append('%s' % (round((1 - untranslated / (len(tdict) - 1.0)) * 100), code)) languages = "\n\t\t".join(languages) tmpl_name = name + ".appdata.xml" replace_placeholders(os.path.join(pydir, "misc", tmpl_name), os.path.join(pydir, "dist", tmpl_name), lastmod_time, {"APPDATAPROVIDES": provides, "LANGUAGES": languages}) if appdata: sys.argv.remove("appdata") if (("sdist" in sys.argv[1:] or "install" in sys.argv[1:] or "bdist_deb" in sys.argv[1:]) and not help): buildservice = True if buildservice and not dry_run: replace_placeholders(os.path.join(pydir, "misc", "debian.copyright"), os.path.join(pydir, "dist", "copyright"), lastmod_time) if "buildservice" in sys.argv[1:]: sys.argv.remove("buildservice") if bdist_deb: bdist_args = ["bdist_rpm"] if not arch: arch = get_platform().split("-")[1] bdist_args += ["--force-arch=" + arch] i = sys.argv.index("bdist_deb") sys.argv = sys.argv[:i] + bdist_args + sys.argv[i + 1:] if bdist_lipa: i = sys.argv.index("bdist_lipa") sys.argv = sys.argv[:i] + sys.argv[i + 1:] if bdist_pyi: i = sys.argv.index("bdist_pyi") sys.argv = sys.argv[:i] + sys.argv[i + 1:] if not "build_ext" in sys.argv[1:i]: sys.argv.insert(i, "build_ext") if "-F" in sys.argv[1:]: sys.argv.remove("-F") if "--onefile" in sys.argv[1:]: sys.argv.remove("--onefile") if inno and sys.platform == "win32": for tmpl_type in ("pyi" if bdist_pyi else bdist_cmd, "0install", "0install-per-user"): inno_template_path = os.path.join(pydir, "misc", "%s-Setup-%s.iss" % (name, tmpl_type)) inno_template = open(inno_template_path, "r") inno_script = inno_template.read().decode("UTF-8", "replace") % { "AppCopyright": u"© %s %s" % (strftime("%Y"), author), "AppName": name, "AppVerName": version, "AppPublisher": author, "AppPublisherURL": "http://" + domain, "AppSupportURL": "http://" + domain, "AppUpdatesURL": "http://" + domain, "VersionInfoVersion": ".".join(map(str, version_tuple)), "VersionInfoTextVersion": version, "AppVersion": version, "Platform": get_platform(), "PythonVersion": sys.version[:3], "URL": "http://%s/" % domain.lower(), } inno_template.close() inno_path = os.path.join("dist", os.path.basename(inno_template_path).replace( bdist_cmd, "%s.%s-py%s" % (bdist_cmd, get_platform(), sys.version[:3]))) if not dry_run: if not os.path.exists("dist"): os.makedirs("dist") inno_file = open(inno_path, "w") inno_file.write(inno_script.encode("MBCS", "replace")) inno_file.close() sys.argv.remove("inno") if len(sys.argv) == 1 or (len(sys.argv) == 2 and dry_run): return if "finalize_msi" in sys.argv[1:]: db = msilib.OpenDatabase(r"dist\%s-%s.win32-py%s.msi" % (name, msiversion, sys.version[:3]), msilib.MSIDBOPEN_TRANSACT) view = db.OpenView("SELECT Value FROM Property WHERE Property = 'ProductCode'") view.Execute(None) record = view.Fetch() productcode = record.GetString(1) view.Close() msilib.add_data(db, "Directory", [("ProgramMenuFolder", # Directory "TARGETDIR", # Parent ".")]) # DefaultDir msilib.add_data(db, "Directory", [("MenuDir", # Directory "ProgramMenuFolder", # Parent name.upper()[:6] + "~1|" + name)]) # DefaultDir msilib.add_data(db, "Icon", [(name + ".ico", # Name msilib.Binary(os.path.join(pydir, name, "theme", "icons", name + ".ico")))]) # Data msilib.add_data(db, "Icon", [("uninstall.ico", # Name msilib.Binary(os.path.join(pydir, name, "theme", "icons", name + "-uninstall.ico")))]) # Data msilib.add_data(db, "RemoveFile", [("MenuDir", # FileKey name, # Component None, # FileName "MenuDir", # DirProperty 2)]) # InstallMode msilib.add_data(db, "Registry", [("DisplayIcon", # Registry -1, # Root r"Software\Microsoft\Windows\CurrentVersion\Uninstall\%s" % productcode, # Key "DisplayIcon", # Name r"[icons]%s.ico" % name, # Value name)]) # Component msilib.add_data(db, "Shortcut", [(name, # Shortcut "MenuDir", # Directory name.upper()[:6] + "~1|" + name, # Name name, # Component r"[TARGETDIR]pythonw.exe", # Target r'"[TARGETDIR]Scripts\%s"' % name, # Arguments None, # Description None, # Hotkey name + ".ico", # Icon None, # IconIndex None, # ShowCmd name)]) # WkDir msilib.add_data(db, "Shortcut", [("LICENSE", # Shortcut "MenuDir", # Directory "LICENSE|LICENSE", # Name name, # Component r"[%s]LICENSE.txt" % name, # Target None, # Arguments None, # Description None, # Hotkey None, # Icon None, # IconIndex None, # ShowCmd name)]) # WkDir msilib.add_data(db, "Shortcut", [("README", # Shortcut "MenuDir", # Directory "README|README", # Name name, # Component r"[%s]README.html" % name, # Target None, # Arguments None, # Description None, # Hotkey None, # Icon None, # IconIndex None, # ShowCmd name)]) # WkDir msilib.add_data(db, "Shortcut", [("Uninstall", # Shortcut "MenuDir", # Directory "UNINST|Uninstall", # Name name, # Component r"[SystemFolder]msiexec", # Target r"/x" + productcode, # Arguments None, # Description None, # Hotkey "uninstall.ico", # Icon None, # IconIndex None, # ShowCmd "SystemFolder")]) # WkDir if not dry_run: db.Commit() sys.argv.remove("finalize_msi") if len(sys.argv) == 1 or (len(sys.argv) == 2 and dry_run): return if zeroinstall: sys.argv.remove("0install") if bdist_appdmg: sys.argv.remove("bdist_appdmg") if (not bdist_lipa and not zeroinstall and not buildservice and not appdata and not bdist_appdmg) or sys.argv[1:]: print sys.argv[1:] from setup import setup setup() if dry_run or help: return if buildservice: # Create control files mapping = {"POST": open(os.path.join(pydir, "util", "rpm_postinstall.sh"), "r").read().strip(), "POSTUN": open(os.path.join(pydir, "util", "rpm_postuninstall.sh"), "r").read().strip()} tgz = os.path.join(pydir, "dist", "%s-%s.tar.gz" % (name, version)) if os.path.isfile(tgz): with open(tgz, "rb") as tgzfile: mapping["MD5"] = md5(tgzfile.read()).hexdigest() for tmpl_name in ("PKGBUILD", "debian.changelog", "debian.control", "debian.copyright", "debian.rules", name + ".changes", name + ".dsc", name + ".spec", os.path.join("0install", "PKGBUILD"), os.path.join("0install", "debian.changelog"), os.path.join("0install", "debian.control"), os.path.join("0install", "debian.rules"), os.path.join("0install", name + ".dsc"), os.path.join("0install", name + ".spec"), os.path.join("obs-autopackage-deploy", name + ".spec")): tmpl_path = os.path.join(pydir, "misc", tmpl_name) replace_placeholders(tmpl_path, os.path.join(pydir, "dist", tmpl_name), lastmod_time, mapping) if bdist_deb: # Read setup.cfg cfg = RawConfigParser() cfg.read(os.path.join(pydir, "setup.cfg")) # Get dependencies dependencies = [val.strip().split(None, 1) for val in cfg.get("bdist_rpm", "Requires").split(",")] # Get group if cfg.has_option("bdist_rpm", "group"): group = cfg.get("bdist_rpm", "group") else: group = None # Get maintainer if cfg.has_option("bdist_rpm", "maintainer"): maintainer = cfg.get("bdist_rpm", "maintainer") else: maintainer = None # Get packager if cfg.has_option("bdist_rpm", "packager"): packager = cfg.get("bdist_rpm", "packager") else: packager = None # Convert dependency format: # 'package >= version' to 'package (>= version)' for i in range(len(dependencies)): if len(dependencies[i]) > 1: dependencies[i][1] = "(%s)" % dependencies[i][1] dependencies[i] = " ".join(dependencies[i]) release = 1 # TODO: parse setup.cfg rpm_filename = os.path.join(pydir, "dist", "%s-%s-%s.%s.rpm" % (name, version, release, arch)) if not dry_run: # remove target directory (and contents) if it already exists target_dir = os.path.join(pydir, "dist", "%s-%s" % (name, version)) if os.path.exists(target_dir): shutil.rmtree(target_dir) if os.path.exists(target_dir + ".orig"): shutil.rmtree(target_dir + ".orig") # use alien to create deb dir from rpm package retcode = call(["alien", "-c", "-g", "-k", os.path.basename(rpm_filename)], cwd=os.path.join(pydir, "dist")) if retcode != 0: sys.exit(retcode) # update changelog shutil.copy2(os.path.join(pydir, "dist", "debian.changelog"), os.path.join(pydir, "dist", "%s-%s" % (name, version), "debian", "changelog")) # update rules shutil.copy2(os.path.join(pydir, "misc", "alien.rules"), os.path.join(pydir, "dist", "%s-%s" % (name, version), "debian", "rules")) # update control control_filename = os.path.join(pydir, "dist", "%s-%s" % (name, version), "debian", "control") shutil.copy2(os.path.join(pydir, "dist", "debian.control"), control_filename) ### read control file from deb dir ##control = open(control_filename, "r") ##lines = [line.rstrip("\n") for line in control.readlines()] ##control.close() ### update control with info from setup.cfg ##for i in range(len(lines)): ##if lines[i].startswith("Depends:"): ### add dependencies ##lines[i] += ", python" ##lines[i] += ", python" + sys.version[:3] ##lines[i] += ", " + ", ".join(dependencies) ##elif lines[i].startswith("Maintainer:") and (maintainer or ##packager): ### set maintainer ##lines[i] = "Maintainer: " + (maintainer or packager) ##elif lines[i].startswith("Section:") and group: ### set section ##lines[i] = "Section: " + group ##elif lines[i].startswith("Description:"): ##lines.pop() ##lines.pop() ##break ### write updated control file ##control = open(control_filename, "w") ##control.write("\n".join(lines)) ##control.close() ### run strip on shared libraries ##sos = os.path.join(change_root(target_dir, get_python_lib(True)), ##name, "*.so") ##for so in glob.glob(sos): ##retcode = call(["strip", "--strip-unneeded", so]) # create deb package retcode = call(["chmod", "+x", "./debian/rules"], cwd=target_dir) retcode = call(["./debian/rules", "binary"], cwd=target_dir) if retcode != 0: sys.exit(retcode) if setup_cfg or ("bdist_msi" in sys.argv[1:] and use_setuptools): shutil.copy2(os.path.join(pydir, "setup.cfg.backup"), os.path.join(pydir, "setup.cfg")) if bdist_lipa: # Create a Listaller package using lipkgen from setup import get_data, get_scripts scripts = get_scripts() ipkinstall = os.path.join(pydir, "ipkinstall") # Generate doap file replace_placeholders(os.path.join(pydir, "misc", name + ".doap"), os.path.join(ipkinstall, name + ".doap"), lastmod_time) # Adjust .desktop files for script, desc in scripts: filename = os.path.join(pydir, "misc", script + ".desktop") if os.path.exists(filename): with open(filename) as file1: filename = os.path.join(ipkinstall, script + ".desktop") with open(filename, "w") as file2: file2.write(file1.read().replace("Exec=" + script, "Exec=%s.pyw" % script2pywname(script))) # Collect data collect = ([("%APP%", ["ipkinstall/%s.desktop" % script for script, desc in filter(lambda (script, desc): not script.endswith("-apply-profiles"), scripts)])] + [("%%ICON-%s%%" % size, ["%s/theme/icons/%sx%s/%s.png" % (name, size, size, script) for script, desc in scripts]) for size in (16, 24, 32, 48, 64, 128, 256)] + [("%INST%", ["%s.pyw" % script2pywname(script) for script, desc in scripts])] + get_data("%INST%", "data") + get_data("%INST%", "doc") + [("%INST%/" + name, glob.glob(os.path.join(name, "*.py")))] + [("%%INST%%/%s/lib" % name, glob.glob(os.path.join(name, "lib/*.py")))] + [("%%INST%%/%s/lib/agw" % name, glob.glob(os.path.join(name, "lib/agw/*.py")))] + get_data("%INST%/" + name, "package_data", name) + [("%INST%/scripts", ["scripts/%s" % script for script, desc in scripts])]) for bits in (32, 64): collect += [("%%INST%%/%s/lib%s" % (name, bits), glob.glob(os.path.join(name, "lib%s/*.py" % bits)))] for pycompat in (26, 27): collect += [("%%INST%%/%s/lib%s/python%s" % (name, bits, pycompat), glob.glob(os.path.join(name, "lib%s/python%s/*.py" % (bits, pycompat))) + glob.glob(os.path.join(name, "lib%s/python%s/*.so" % (bits, pycompat))))] data = {} for tgt_dir, files in collect: tgt_dir = tgt_dir.replace(os.sep, "/") if not tgt_dir in data: data[tgt_dir] = [] data[tgt_dir] += files tgt_dirs = sorted(data.keys()) # Generate files list with open(os.path.join(ipkinstall, "files-all.list"), "w") as fileslist: fileslist.write("# IPK file list for %s\n" % name) fileslist.write("# Generated by setup.py, do not edit\n") fileslist.write("\n") cur_tgt_dir = None for tgt_dir in tgt_dirs: if tgt_dir != cur_tgt_dir: cur_tgt_dir = tgt_dir fileslist.write(":: %s\n" % tgt_dir) for filename in sorted(data[tgt_dir]): fileslist.write(os.path.relpath(filename, pydir).replace(os.sep, "/") + "\n") # Create actual Listaller package if not which("lipkgen"): raise SystemExit("Error: No lipkgen in %s" % os.getenv("PATH")) out_dir = os.path.join(pydir, "dist") if not os.path.isdir(out_dir): os.makedirs(out_dir) retcode = call(["lipkgen", "-b", "-o", out_dir, "--sign"]) if retcode != 0: sys.exit(retcode) if bdist_pyi: # create an executable using pyinstaller retcode = call([sys.executable, os.path.join(pydir, "pyinstaller", "pyinstaller.py"), "--workpath", os.path.join(pydir, "build", "pyi.%s-%s" % (get_platform(), sys.version[:3])), "--distpath", os.path.join(pydir, "dist", "pyi.%s-py%s" % (get_platform(), sys.version[:3])), os.path.join(pydir, "misc", "%s.pyi.spec" % name)]) if retcode != 0: sys.exit(retcode) if zeroinstall: from xml.dom import minidom # Create/update 0install feeds from setup import get_data, get_scripts scripts = sorted((script2pywname(script), desc) for script, desc in get_scripts()) cmds = [] for script, desc in scripts: cmdname = "run" if script != name: cmdname += "-" + script.replace(name + "-", "") cmds.append((cmdname, script, desc)) if script.endswith("-apply-profiles"): # Add forced calibration loading entry cmds.append((cmdname + "-force", script, desc)) # Get archive digest extract = "%s-%s" % (name, version) archive_name = extract + ".tar.gz" archive_path = os.path.join(pydir, "dist", archive_name) p = Popen(["0install", "digest", archive_path.encode(fs_enc), extract], stdout=sp.PIPE, cwd=pydir) stdout, stderr = p.communicate() print stdout hash = re.search("(sha\d+\w+[=_][0-9a-f]+)", stdout.strip()) if not hash: raise SystemExit(p.wait()) hash = hash.groups()[0] for tmpl_name in ("7z.xml", "argyllcms.xml", name + ".xml", name + "-linux.xml", name + "-mac.xml", name + "-win32.xml", "numpy.xml", "pygame.xml", "pywin32.xml", "wmi.xml", "wxpython.xml"): dist_path = os.path.join(pydir, "dist", "0install", tmpl_name) create = not os.path.isfile(dist_path) if create: tmpl_path = os.path.join(pydir, "misc", "0install", tmpl_name) replace_placeholders(tmpl_path, dist_path, lastmod_time) if tmpl_name.startswith(name): with open(dist_path) as dist_file: xml = dist_file.read() domtree = minidom.parseString(xml) # Get interface interface = domtree.getElementsByTagName("interface")[0] # Get languages langs = [os.path.splitext(lang)[0] for lang in os.listdir(os.path.join(name, "lang"))] # Get architecture groups groups = domtree.getElementsByTagName("group") if groups: # Get main group group0 = groups[0] # Add languages group0.setAttribute("langs", " ".join(langs)) # Update groups for i, group in enumerate(groups[-1:]): if create: # Remove dummy implementations for implementation in group.getElementsByTagName("implementation"): if implementation.getAttribute("released") == "0000-00-00": implementation.parentNode.removeChild(implementation) # Add commands runner = domtree.createElement("runner") if group.getAttribute("arch").startswith("Windows-"): runner.setAttribute("command", "run-win") if group.getAttribute("arch").startswith("Linux"): python = "http://repo.roscidus.com/python/python" else: python = "http://%s/0install/python.xml" % domain.lower() runner.setAttribute("interface", python) runner.setAttribute("version", "%i.%i..!3.0" % py_minversion) for cmdname, script, desc in cmds: # Add command to group cmd = domtree.createElement("command") cmd.setAttribute("name", cmdname) cmd.setAttribute("path", script + ".pyw") ##if cmdname.endswith("-apply-profiles"): ### Autostart ##arg = domtree.createElement("suggest-auto-start") ##cmd.appendChild(arg) if cmdname.endswith("-apply-profiles-force"): # Forced calibration loading arg = domtree.createElement("arg") arg.appendChild(domtree.createTextNode("--force")) cmd.appendChild(arg) cmd.appendChild(runner.cloneNode(True)) group.appendChild(cmd) # Add implementation if it does not exist yet, update otherwise match = None for implementation in group.getElementsByTagName("implementation"): match = (implementation.getAttribute("version") == version and implementation.getAttribute("stability") == stability) if match: break if not match: implementation = domtree.createElement("implementation") implementation.setAttribute("version", version) implementation.setAttribute("released", strftime("%Y-%m-%d", gmtime(lastmod_time))) implementation.setAttribute("stability", stability) digest = domtree.createElement("manifest-digest") implementation.appendChild(digest) archive = domtree.createElement("archive") implementation.appendChild(archive) else: digest = implementation.getElementsByTagName("manifest-digest")[0] for attrname, value in digest.attributes.items(): # Remove existing hashes digest.removeAttribute(attrname) archive = implementation.getElementsByTagName("archive")[0] implementation.setAttribute("id", hash) digest.setAttribute(*hash.split("=")) # Update archive if stability == "stable": folder = "" else: folder = "&folder=snapshot" archive.setAttribute("extract", extract) archive.setAttribute("href", "http://%s/download.php?version=%s&suffix=.tar.gz%s" % (domain.lower(), version, folder)) archive.setAttribute("size", "%s" % os.stat(archive_path).st_size) archive.setAttribute("type", "application/x-compressed-tar") group.appendChild(implementation) if create: for cmdname, script, desc in cmds: # Add entry-points to interface entry_point = domtree.createElement("entry-point") entry_point.setAttribute("command", cmdname) binname = script if cmdname.endswith("-force"): binname += "-force" entry_point.setAttribute("binary-name", binname) cfg = RawConfigParser() desktopbasename = "%s.desktop" % script if cmdname.endswith("-apply-profiles"): desktopbasename = "z-" + desktopbasename cfg.read(os.path.join(pydir, "misc", desktopbasename)) for option, tagname in (("Name", "name"), ("GenericName", "summary"), ("Comment", "description")): for lang in [None] + langs: if lang: suffix = "[%s]" % lang else: suffix = "" option = "%s%s" % (option, suffix) if cfg.has_option("Desktop Entry", option): value = cfg.get("Desktop Entry", option).decode("UTF-8") if value: tag = domtree.createElement(tagname) if not lang: lang = "en" tag.setAttribute("xml:lang", lang) tag.appendChild(domtree.createTextNode(value)) entry_point.appendChild(tag) for ext, mime_type in (("ico", "image/vnd.microsoft.icon"), ("png", "image/png")): icon = domtree.createElement("icon") if ext == "ico": subdir = "" filename = script else: subdir = "256x256/" filename = script.lower() icon.setAttribute("href", "http://%s/theme/icons/%s%s.%s" % (domain.lower(), subdir, filename, ext)) icon.setAttribute("type", mime_type) entry_point.appendChild(icon) interface.appendChild(entry_point) # Update feed print "Updating 0install feed", dist_path with open(dist_path, "wb") as dist_file: xml = domtree.toprettyxml(encoding="utf-8") xml = re.sub(r"\n\s+\n", "\n", xml) xml = re.sub(r"\n\s*([^<]+)\n\s*", r"\1", xml) dist_file.write(xml) # Sign feed zeropublish = which("0publish") or which("0publish.exe") args = [] if not zeropublish: zeropublish = which("0install") or which("0install.exe") if zeropublish: args = ["run", "--command", "0publish", "--", "http://0install.de/feeds/ZeroInstall_Tools.xml"] if zeropublish: passphrase_path = os.path.join(pydir, "gpg", "passphrase.txt") print "Signing", dist_path if os.path.isfile(passphrase_path): import wexpect with open(passphrase_path) as passphrase_file: passphrase = passphrase_file.read().strip() p = wexpect.spawn(zeropublish.encode(fs_enc), args + ["-x", dist_path.encode(fs_enc)]) p.expect(":") p.send(passphrase) p.send("\n") try: p.expect(wexpect.EOF, timeout=3) except: p.terminate() else: call([zeropublish] + args + ["-x", dist_path.encode(fs_enc)]) else: print "WARNING: 0publish not found, please sign the feed!" # Create 0install app bundles bundletemplate = os.path.join("0install", "template.app", "Contents") bundletemplatepath = os.path.join(pydir, bundletemplate) if os.path.isdir(bundletemplatepath): p = Popen(["0install", "-V"], stdout=sp.PIPE) stdout, stderr = p.communicate() zeroinstall_version = re.search(r" (\d(?:\.\d+)+)", stdout) if zeroinstall_version: zeroinstall_version = zeroinstall_version.groups()[0] if zeroinstall_version < "2.8": zeroinstall_version = "2.8" feeduri = "http://%s/0install/%s.xml" % (domain.lower(), name) dist_dir = os.path.join(pydir, "dist", "0install", name + "-0install") for script, desc in scripts + [("0install-launcher", "0install Launcher"), ("0install-cache-manager", "0install Cache Manager")]: if script.endswith("-apply-profiles"): continue desc = re.sub("^%s " % name, "", desc).strip() if script == "0install-launcher": bundlename = name else: bundlename = desc bundledistpath = os.path.join(dist_dir, desc + ".app", "Contents") replace_placeholders(os.path.join(bundletemplatepath, "Info.plist"), os.path.join(bundledistpath, "Info.plist"), lastmod_time, {"NAME": bundlename, "EXECUTABLE": script, "ID": ".".join(reversed(domain.split("."))).replace(name, script)}) if script.startswith(name): run = "0launch%s -- %s" % (re.sub("^%s" % name, " --command=run", script), feeduri) else: run = {"0install-launcher": "0launch --gui " + feeduri, "0install-cache-manager": "0store manage"}.get(script) replace_placeholders(os.path.join(bundletemplatepath, "MacOS", "template"), os.path.join(bundledistpath, "MacOS", script), lastmod_time, {"EXEC": run, "ZEROINSTALL_VERSION": zeroinstall_version}) os.chmod(os.path.join(bundledistpath, "MacOS", script), 0755) for binary in os.listdir(os.path.join(bundletemplatepath, "MacOS")): if binary == "template": continue src = os.path.join(bundletemplatepath, "MacOS", binary) dst = os.path.join(bundledistpath, "MacOS", binary) if os.path.islink(src): linkto = os.readlink(src) if os.path.islink(dst) and os.readlink(dst) != linkto: os.remove(dst) if not os.path.islink(dst): os.symlink(linkto, dst) else: shutil.copy2(src, dst) resdir = os.path.join(bundledistpath, "Resources") if not os.path.isdir(resdir): os.mkdir(resdir) if script.startswith(name): iconsrc = os.path.join(pydir, name, "theme", "icons", script + ".icns") else: iconsrc = os.path.join(pydir, "0install", "ZeroInstall.icns") icondst = os.path.join(resdir, script + ".icns") if os.path.isfile(iconsrc) and not os.path.isfile(icondst): shutil.copy2(iconsrc, icondst) # README as .webloc file (link to homepage) with codecs.open(os.path.join(dist_dir, "README.webloc"), "w", "UTF-8") as readme: readme.write(""" URL http://%s/ """ % domain.lower()) # Copy LICENSE.txt shutil.copy2(os.path.join(pydir, "LICENSE.txt"), os.path.join(dist_dir, "LICENSE.txt")) if bdist_appdmg: create_appdmg(zeroinstall) if __name__ == "__main__": setup() DisplayCAL-3.1.0.0/tests/0000755000076500000000000000000012653527012014637 5ustar devwheel00000000000000DisplayCAL-3.1.0.0/tests/vcgt_cm_test_blueish_yellowish.icc0000644000076500000000000000420012647526537023624 0ustar devwheel00000000000000lcms0mntrRGB XYZ  acspMSFTlcms-lcms descwtptrXYZbXYZgXYZrTRCgTRCbTRCchrm$$cprtH!vcgtldescOVideo card gamma table and color management test profile (blueish - yellowish)XYZ =XYZ o8XYZ $XYZ bcurvcurvLchrmT{L&f\textno copyright, use freelyvcgtJ X_$gOBAJ ] y 4 e?)y$~.Gn)b#m 4 !"#Z$'$%&'h(<))*+,o-J.&//0123f4J5/66789:;<=n>^?O@AA4B'CDE FFGHIJKLMNOPQRSTVW XYZ'[2\?]L^Z_i`yabcdefgij-kFl_mxnopqst%uDvdwxyz|}6~\҂$Nyщ,[OUÛ4mYԧQЬSر`0wO-y^ŬJɚ;͍2х.Ճ0ه7ݐDVm*J p6d1J X_$gOBAJ ] y 4 e?)y$~.Gn)b#m 4 !"#Z$'$%&'h(<))*+,o-J.&//0123f4J5/66789:;<=n>^?O@AA4B'CDE FFGHIJKLMNOPQRSTVW XYZ'[2\?]L^Z_i`yabcdefgij-kFl_mxnopqst%uDvdwxyz|}6~\҂$Nyщ,[OUÛ4mYԧQЬSر`0wO-y^ŬJɚ;͍2х.Ճ0ه7ݐDVm*J p6d1K k T[#!#;$&u()+,./02`35*679;:;=.>y?ABHCDFG8HoIJLM2N^OPQRTU>V]W{XYZ[\^_"`4aEbUccdqe}fghijklmnopqrstuvwxyz{}|r}g~[N@2#ކ̇ycL5БbE( ˙jI'៾uP*ޥg?ënC믿e7 ۴|M츻X&Z&SızC țc*˸~D ϔXҤh+հs4طy9ۺz:޸w5p-d T@o(T }5\7Yy.KDisplayCAL-3.1.0.0/tests/vcgt_cm_test_cyanish_reddish.icc0000644000076500000000000000420012647526537023232 0ustar devwheel00000000000000lcms0mntrRGB XYZ  acspMSFTlcms-lcms descwtptrXYZbXYZgXYZrTRCgTRCbTRCchrm$$cprtH!vcgtldescMVideo card gamma table and color management test profile (cyanish - reddish)XYZ =XYZ o8XYZ $XYZ bcurvcurvLchrmT{L&f\textno copyright, use freelyvcgtJ X_$gOBAJ ] y 4 e?)y$~.Gn)b#m 4 !"#Z$'$%&'h(<))*+,o-J.&//0123f4J5/66789:;<=n>^?O@AA4B'CDE FFGHIJKLMNOPQRSTVW XYZ'[2\?]L^Z_i`yabcdefgij-kFl_mxnopqst%uDvdwxyz|}6~\҂$Nyщ,[OUÛ4mYԧQЬSر`0wO-y^ŬJɚ;͍2х.Ճ0ه7ݐDVm*J p6d1K k T[#!#;$&u()+,./02`35*679;:;=.>y?ABHCDFG8HoIJLM2N^OPQRTU>V]W{XYZ[\^_"`4aEbUccdqe}fghijklmnopqrstuvwxyz{}|r}g~[N@2#ކ̇ycL5БbE( ˙jI'៾uP*ޥg?ënC믿e7 ۴|M츻X&Z&SızC țc*˸~D ϔXҤh+հs4طy9ۺz:޸w5p-d T@o(T }5\7Yy.KK k T[#!#;$&u()+,./02`35*679;:;=.>y?ABHCDFG8HoIJLM2N^OPQRTU>V]W{XYZ[\^_"`4aEbUccdqe}fghijklmnopqrstuvwxyz{}|r}g~[N@2#ކ̇ycL5БbE( ˙jI'៾uP*ޥg?ënC믿e7 ۴|M츻X&Z&SızC țc*˸~D ϔXҤh+հs4طy9ۺz:޸w5p-d T@o(T }5\7Yy.KDisplayCAL-3.1.0.0/tests/vcgt_cm_test_greenish_purplish.icc0000644000076500000000000000420012647526537023624 0ustar devwheel00000000000000lcms0mntrRGB XYZ  acspMSFTlcms-lcms descwtptrXYZbXYZgXYZrTRCgTRCbTRCchrm$$cprtH!vcgtldescOVideo card gamma table and color management test profile (greenish - purplish)XYZ =XYZ o8XYZ $XYZ bcurvcurvLchrmT{L&f\textno copyright, use freelyvcgtJ X_$gOBAJ ] y 4 e?)y$~.Gn)b#m 4 !"#Z$'$%&'h(<))*+,o-J.&//0123f4J5/66789:;<=n>^?O@AA4B'CDE FFGHIJKLMNOPQRSTVW XYZ'[2\?]L^Z_i`yabcdefgij-kFl_mxnopqst%uDvdwxyz|}6~\҂$Nyщ,[OUÛ4mYԧQЬSر`0wO-y^ŬJɚ;͍2х.Ճ0ه7ݐDVm*J p6d1K k T[#!#;$&u()+,./02`35*679;:;=.>y?ABHCDFG8HoIJLM2N^OPQRTU>V]W{XYZ[\^_"`4aEbUccdqe}fghijklmnopqrstuvwxyz{}|r}g~[N@2#ކ̇ycL5БbE( ˙jI'៾uP*ޥg?ënC믿e7 ۴|M츻X&Z&SızC țc*˸~D ϔXҤh+հs4طy9ۺz:޸w5p-d T@o(T }5\7Yy.KJ X_$gOBAJ ] y 4 e?)y$~.Gn)b#m 4 !"#Z$'$%&'h(<))*+,o-J.&//0123f4J5/66789:;<=n>^?O@AA4B'CDE FFGHIJKLMNOPQRSTVW XYZ'[2\?]L^Z_i`yabcdefgij-kFl_mxnopqst%uDvdwxyz|}6~\҂$Nyщ,[OUÛ4mYԧQЬSر`0wO-y^ŬJɚ;͍2х.Ճ0ه7ݐDVm*J p6d1DisplayCAL-3.1.0.0/tests/vcgt_cm_test_purplish_greenish.icc0000644000076500000000000000420012647526537023624 0ustar devwheel00000000000000lcms0mntrRGB XYZ  acspMSFTlcms-lcms descwtptrXYZbXYZgXYZrTRCgTRCbTRCchrm$$cprtH!vcgtldescOVideo card gamma table and color management test profile (purplish - greenish)XYZ =XYZ o8XYZ $XYZ bcurvLcurvchrmT{L&f\textno copyright, use freelyvcgtK k T[#!#;$&u()+,./02`35*679;:;=.>y?ABHCDFG8HoIJLM2N^OPQRTU>V]W{XYZ[\^_"`4aEbUccdqe}fghijklmnopqrstuvwxyz{}|r}g~[N@2#ކ̇ycL5БbE( ˙jI'៾uP*ޥg?ënC믿e7 ۴|M츻X&Z&SızC țc*˸~D ϔXҤh+հs4طy9ۺz:޸w5p-d T@o(T }5\7Yy.KJ X_$gOBAJ ] y 4 e?)y$~.Gn)b#m 4 !"#Z$'$%&'h(<))*+,o-J.&//0123f4J5/66789:;<=n>^?O@AA4B'CDE FFGHIJKLMNOPQRSTVW XYZ'[2\?]L^Z_i`yabcdefgij-kFl_mxnopqst%uDvdwxyz|}6~\҂$Nyщ,[OUÛ4mYԧQЬSر`0wO-y^ŬJɚ;͍2х.Ճ0ه7ݐDVm*J p6d1K k T[#!#;$&u()+,./02`35*679;:;=.>y?ABHCDFG8HoIJLM2N^OPQRTU>V]W{XYZ[\^_"`4aEbUccdqe}fghijklmnopqrstuvwxyz{}|r}g~[N@2#ކ̇ycL5БbE( ˙jI'៾uP*ޥg?ënC믿e7 ۴|M츻X&Z&SızC țc*˸~D ϔXҤh+հs4طy9ۺz:޸w5p-d T@o(T }5\7Yy.KDisplayCAL-3.1.0.0/tests/vcgt_cm_test_reddish_cyanish.icc0000644000076500000000000000420012647526537023232 0ustar devwheel00000000000000lcms0mntrRGB XYZ  acspMSFTlcms-lcms descwtptrXYZbXYZgXYZrTRCgTRCbTRCchrm$$cprtH!vcgtldescMVideo card gamma table and color management test profile (reddish - cyanish)XYZ =XYZ o8XYZ $XYZ bcurvLcurvchrmT{L&f\textno copyright, use freelyvcgtK k T[#!#;$&u()+,./02`35*679;:;=.>y?ABHCDFG8HoIJLM2N^OPQRTU>V]W{XYZ[\^_"`4aEbUccdqe}fghijklmnopqrstuvwxyz{}|r}g~[N@2#ކ̇ycL5БbE( ˙jI'៾uP*ޥg?ënC믿e7 ۴|M츻X&Z&SızC țc*˸~D ϔXҤh+հs4طy9ۺz:޸w5p-d T@o(T }5\7Yy.KJ X_$gOBAJ ] y 4 e?)y$~.Gn)b#m 4 !"#Z$'$%&'h(<))*+,o-J.&//0123f4J5/66789:;<=n>^?O@AA4B'CDE FFGHIJKLMNOPQRSTVW XYZ'[2\?]L^Z_i`yabcdefgij-kFl_mxnopqst%uDvdwxyz|}6~\҂$Nyщ,[OUÛ4mYԧQЬSر`0wO-y^ŬJɚ;͍2х.Ճ0ه7ݐDVm*J p6d1J X_$gOBAJ ] y 4 e?)y$~.Gn)b#m 4 !"#Z$'$%&'h(<))*+,o-J.&//0123f4J5/66789:;<=n>^?O@AA4B'CDE FFGHIJKLMNOPQRSTVW XYZ'[2\?]L^Z_i`yabcdefgij-kFl_mxnopqst%uDvdwxyz|}6~\҂$Nyщ,[OUÛ4mYԧQЬSر`0wO-y^ŬJɚ;͍2х.Ճ0ه7ݐDVm*J p6d1DisplayCAL-3.1.0.0/tests/vcgt_cm_test_yellowish_blueish.icc0000644000076500000000000000420012647526537023624 0ustar devwheel00000000000000lcms0mntrRGB XYZ  acspMSFTlcms-lcms descwtptrXYZbXYZgXYZrTRCgTRCbTRCchrm$$cprtH!vcgtldescOVideo card gamma table and color management test profile (yellowish - blueish)XYZ =XYZ o8XYZ $XYZ bcurvLcurvchrmT{L&f\textno copyright, use freelyvcgtK k T[#!#;$&u()+,./02`35*679;:;=.>y?ABHCDFG8HoIJLM2N^OPQRTU>V]W{XYZ[\^_"`4aEbUccdqe}fghijklmnopqrstuvwxyz{}|r}g~[N@2#ކ̇ycL5БbE( ˙jI'៾uP*ޥg?ënC믿e7 ۴|M츻X&Z&SızC țc*˸~D ϔXҤh+հs4طy9ۺz:޸w5p-d T@o(T }5\7Yy.KK k T[#!#;$&u()+,./02`35*679;:;=.>y?ABHCDFG8HoIJLM2N^OPQRTU>V]W{XYZ[\^_"`4aEbUccdqe}fghijklmnopqrstuvwxyz{}|r}g~[N@2#ކ̇ycL5БbE( ˙jI'៾uP*ޥg?ënC믿e7 ۴|M츻X&Z&SızC țc*˸~D ϔXҤh+հs4طy9ۺz:޸w5p-d T@o(T }5\7Yy.KJ X_$gOBAJ ] y 4 e?)y$~.Gn)b#m 4 !"#Z$'$%&'h(<))*+,o-J.&//0123f4J5/66789:;<=n>^?O@AA4B'CDE FFGHIJKLMNOPQRSTVW XYZ'[2\?]L^Z_i`yabcdefgij-kFl_mxnopqst%uDvdwxyz|}6~\҂$Nyщ,[OUÛ4mYԧQЬSر`0wO-y^ŬJɚ;͍2х.Ճ0ه7ݐDVm*J p6d1DisplayCAL-3.1.0.0/theme/0000755000076500000000000000000012653527012014577 5ustar devwheel00000000000000DisplayCAL-3.1.0.0/theme/bg.png0000644000076500000000000000116412647526540015707 0ustar devwheel00000000000000PNG  IHDR2 tEXtSoftwareAdobe ImageReadyqe<rPLTEPVIDATxdۖ@C# :(BCxty9au*o`fٜq>ɀ ˟rRt A7|m7,onj6h979<%x2 S(#axF{:)PtɀHS(tJZbV<0v;=p4; ¢PFT%$TV8Z uGa](#5Rl^P͸ɀqS)lgY6g(Hcqzi -#x̌[ 軮HS(A9&Md AMm&4Jd@p4#ɀ }9BɝiN<;#oOWt"mfIENDB`DisplayCAL-3.1.0.0/theme/DisplayCAL-adjust-reflection.png0000644000076500000000000013726512647526540022700 0ustar devwheel00000000000000PNG  IHDRtEXtSoftwareAdobe ImageReadyqe<WIDATx]usnen z!(R,ˑ"Il9/_>ycN8$۲eْ-QIL3rZ{qg0(npn9ڒZZz'TZZL-R-jj0TKTZZL-R-R `jj0TKTZZR-R `jj0TKTK5ZR-R `jjjSKTK5ZR-R-jjSKTK5ZZzS,QZZzG<^|;SkZZM-;ƍzF".3֞TKS \zaHg06&J%WLR-e+U+F= *9#~(5pZ'2eP)Nl  U 0R0$I6l6UU`up(n߃mxT}p6RX,~!Y†_ ؋`z-DiNSeJzo=Ut{gt_MzOsWҽ|nNAItջ[Kuw]?&z7S`nwzW"<` Mi~~{WFF6[Tĥj#WcgG/655~5L&I0p0W߱E~kFwSȲbbrWfiĤ[ b60kLQF:Š(J^wo4ȊY(@ÌG[MXIf .aɕ PCSsV+"&&&E+ࡪEsy|hiikCaޢE5*C(lad0PR 9ĨF9DPj&4ab,7 U$#Ц:uP*G6'ʁ|)VQn{^\;~"tR@"o>,R_ŅU'i5) d{im'IJO> o 03zXɨCWz}aRdzf<~ STDHjUK=41q} L^Ena K> 1:/6 "JbuuUW-R[dPЀ~lN?SNSw tk H~{Dd Iݒ|%Q׽W~|\QMt] @|ϲOY* f"U,Ħَp4 eAHgI+sS"/YR%]"XV-;Rg׆!2'l߄_oc!<[0v5_|g׃o4xft@}޿$+_GC?a_~`/['牒gO# gq`:=<->Tmۉyve/|kSEԿgh0_ VRyt|~w}$~GK.D}?* ß$ُ/ } Q_=mjW0- 1wW. vT-4,rG(Hk0!dI2Β"++qc ]InE-v:tI (:JQ98 .[F[{}x#X| /{?O=ځsFO!?.$^i  jW/p}B@s6|=8wuӑW-= |@#8vMcXG5ubǁ%b!P12{ xv x Ɵcd>C"`9sb%:@NЙMXq󏿊K l Uq%lo+{]|}i|lo=Ξc|{=t×׿w~ Q~g7 uK׮wQ0KX2P?_͋I͹Q\^ᧇ1"Db@Ěx4.fE{{+Ze0UNˌ&N51*DńNk \)NwUHIp1 (cqu>Nl )Ͽ0MTDp '?i,]w/^JfSԥI%7(^ysYlxE[`÷ I&+vA@&s?,$(|W0Sоb9VҷÙBYʓ('ygAef FN܀OH^8Z-ucGN`!VC'/b'N`q.(CM/_\ We$8hiAI-Oӈ{]q,lpv+2! r#wOe8t' xiU`qiQHB'0I&/ ݷX"KOHh#r*娔GLl#] eD,  6|ۊga9kF}b>VVzV~b&Y$8;|{xπK<ǟ&JKk;xs8=2k< P疉@*0Hyr!o2vi(@!d2vy{A%aiǿOpE̮&P3[zq`:[μ</N\G~ev6T 7ƮʥQ(Z\("4Ēln _9_>[kt"᭛~v$٠VM!&`*oY.VvY?bUW)ɰK,`EX` b2E[s 1J9 Tv2)v^B:>$`%')b6Yʰ>(WЌ,Tb#O,>'vd=3埂X LS=L^ M =L@v% n*2$V-#Û?&LeN2 ?`^1ARLtZޝIg5ŎK݀ǟp&ͻA)ΓW#=22ǾgO/|GïpY\x"#L8k LP9UFS$_g$6CW:}!\H'Zmr}vrA0<N}ƛ5w?>sWh@oC+188/#<2:M`Kꆺ._DeVɌYf4wS;-߅jW*NHbC!:k[V-Y]T [|u(:&EIeg2<ؤ&H,bR]=*cvzc]-4&Y Uuߨ>5c}mem 'UUBިgkߨU?qmm{ުF萊 Rr\mՊFrQĖg@JymߪVnX[Y-h%ݝ@?줐27nۼ}k5R-R-qa*95y ߴ3ZZ8dTKTKX9yR-R `jj0TKTK?\DXƍwoB}g~v e=`ʭ`%"jO "Noq}wTml] ]~lMF8]3*' p0d&bW:;#%7 }._䐆"A._NJec*䵠9IEHY'8Z€±]Ѩ30 |g|g|| \nsޙhGGW'fTɈ6zw+ց:Ǟ }!%fs*=<r>WC;|VHZ(PrXjn4wchw2#_ w<͍`-CWg Ņ؍tbE{'6cOgR@Oཛ% kl+Dp|Nw6gA,@X. w]OAPDG$Q'DTLdʧl$*Wp 80DPu.<䧰wS O>vMvx\8~\IEf11VO>g;HTG--Me1l:=nx.ބfz=$,7u<>}nmm=FX J[r;&oA28[?a|3@O&~ Y8vܾ Vڒ=gcSC;uڅ߀ƀ=IqeAnR} '[Z&D#>R*G>Amw^a gXÅ:CDKMDX p 0 8T[ N8;*d]^||+q^tN2=hl4Bana tF G/JxDg R#/:rxz_7p,8w;Gqu."`#02a,TLb! ^,ymXOHР":H ,-@vU7_BSJY1wmpRlցm12r/r\x֗AFD>$;' troz폡xݫxGqT'bxoj '>2f 0G~f zf$>~$X]hp`I$ntwt_R8#||};΄b 0793d0KЋLx7pyՀN7bɈؼ~gEx-~7m\].\G61o:G̮ ܈c~5^gZ\N:v{/ ~OI6귉 ΉW=?9۷@Ibg Q?tݫ,$G3v16rfw+{%p"z7BZLuh"fe `6Yř20p 6(be~ 6tݘv˪/M#UDDX !<,T^ěa2Jb ǷѕP Q*:H$Tܦ,Y.X\ESQD*HyQ0),,1בwс%2,cKH%x<%u<8>J`ȦSN`u]0(ԢE:|#Xê={[zE<&tT[m^fgq,1hf> kt?yqb= F*[ avΓ?;v UPk[,̡=r8"j3*z|Ϣߓ K3Y|ӟc8$VRĊ%%\ yAy5#0F0-*4\>+Na9gA@o df%mpj>[w(3}@^OॿF$M#rN6.p$<{z1J n$h"Y.؈c3*,Jz8 J)$17 ӂ\*N<$ts|Uzb(L/ZAh$] )DS{0K"b A?:SjUp{:3)b_4n7lFB+%8=r 9=ndclѤhDž\bIۖEƅc YE* j8 Ä*29>C@@"[56#"4/_+]F[)Fxg=MI(]W78ꚭ{f4 Uɪ/ņ"o᪒w?LTg,>#pyD~ۯZRH')//M?4BLB=U&OѴ<"&+tk|E$C1KAg]z+uJD J2氝x.͏YyB[y򼪎NiʿCٶۡM˻v*ן| 6ˏ>]$̬ Y.cQu 6b_:<.z ktϑ ͌OҀ(C7(ۍtN='. 62E`x-vdd`Xc0dxzܢ,ExW fU+nyw wXlU/AvAb!~o)o#&D;.\^m@%"k4}.DE"'_N"@gt~ ػkw,/ U괻g$õZn ":P(nrcM(B4P7;^vo3w*mDwGڠWG Q/ 8v\-sP {u[k .?!!0Եߗެν姽牠Wduы>h;E=0+7K+ YG}d{\ꫵ`塅ЋP eZ&|:TW'zaDQέ` R?U'R]w_e~VqD-iqj*\sW?ZJVwl0lD#V.%`S@}ΔQ4G,Gj`\p~;>Lft2eo'N+/غk?vl݄^XU؟رbv1 eI3+ XHT ػ NPR ֆz;z߿[6oBgS^ꂁ&!ck"fHj6(&j{wcїN诞O^91tl3@f6)me|<^|u,h܍zb7C Fs]N3 AW ,.?=s+i F_Yjb.nILBe֫; :`]"NDp\s14asط+xcmTYĥs{:B6Ɔi(K'p#aAίkgڶ m^3W玼IGBC hG~Oj.+V܎@+:[a,q%t؏z+U>3G# bf q,n %>?ƩӨߴ".3ƦakE@>Yc}&mv ]>lbGO\px: wápqd8w87~9FN;޳._H*Kׁ۷T5곂^!8zZx@g]$<(XV830J>p7 ~fC>7D: Ha'b>Msi>ט  6W:ڔDbvĉކ.cn'*WLcиi/ޏ:+4;wk/Z6d &li, ؾs;^{%\ CX ]C6hr2qǣg͌őSWG0;3ANNL0,Fbq:mx&Qu53΍Ʀtcy^?~,g&جC/Lip$M#!%CW 'hjjˉX<G/ƫ''7D#iLPg۪CУw|/2!e.irv0QK'P՜"rfg!;V &bo8MF EhvnP13>A WOlѣ.￈,gG^-: Ach!<_>{s?ZXh9~ME}=v"jIp)qCg6pb,DY~4C0]PBaPvKbpf\jևDҋo@uc:1DԕeD0UQu_o T:[s$,bqz*: o׉L7G,HY SkbH'}N'YL 4u ǯDh<:,jW뇠o܄څ뀉(Z,E"h^:$qUlNBf+<9S'D vmH̠餈Ƴr|>v=Mnن!hH49EBh%e,w{'f7P CR+n(9fI9X׏]F"F:7#{cǮԼ]<&gB1[QKҳ+J}enX|'ftf< rjnȟ)08u&1t4FGgоelE,2g&Q~$zg^T5]` UΫXQ@*xC{=xȢ*6V_{ dtE R44ϒt^wnn̓RLRņͻÔ^qy|`#\Vyd K8Kha ZCql0:N!TGs7cOC(MB݃'080Y)1[ʓHKb.&<ZŸY+fsE1H(v4|({g&D3RQ_JD} 5fiC,J\׍6$;O!J峲s)T6KlZW$:Izrx;t9%I<dvnN1r =l c0nn'B0Ey.I %$w]+X%lGq0r*vL]Llk+E}!)j244RF@Bm7vE+ b6ɍ=I|Mxc'V1y|^an@14;,1 ,b8յğTD%+S1}tfp(yw#>{3s=;;gH,sұ4` x뀭xıa$:IWu jl``u> MmN+Kh޵ L7GÊLLy@.rggy[ gbZ2+a<٢Xe4Ib**1ՂE6$i0aYH=#_R<ز`ln3BϗNeҷA CjhȔiUr=mWtYpfJCLRt&IlCʐx-:KAS:*,~黻ӽE#f/oehW-$E_[(C aֳ e?wvEY@C6s\Cs{ 9_edh0rq~!.X~N%kZ2  ïCWr:$ `E "qu.z㐕ɂmw #@  Gk _ޭی킛-LՒ)r$jhlv1 oheD!( 2A FxԎ$W Keh{A{O 9<((;#v02X\hll:'~=";MY'U@۹>q`G ETqL ufXZs>{BvSzMyH ,`vx }tZiB qhߢ E_$cxmxXd3Eܼ@y.0#f[ǝz7G= \ItmBrRL[7#/kSFq~, '`᳨F=ݣ7*~::nBp}ZDӈX=pBc!|}qnFûz0=z5@#q,-l./Z NXCgѶeE6'2M ^8vln!#Z=UDVWDd5s鱣3cW!tAP)кG( M [vKգ/a"m&mAp gFKG3hG67#oE4ǯ1{Rc98[#g1C$#s_OЊJ=Yۊ+>u65\LsԄGO"Lsu`;(HqbC4 =hčאiwa+׮\ׁf:p 2} OG*ÉC 9ŋ aDnt6"v%@踌G(e~ i M/b9xC؏jF 8t:{i"UAsk` canAZk -`# N^Ռk`fEE_G=.~ E L^DZSD^៣wx|w.:OaDl5,jPuSu N(8uhd /bt9I"QDdžv{6z-v~Co`yG,Hdy;?֎6L:׎^/1I<[7>F s>U&bXHLJf ܉"1PD +^p:YhNeS#$JY7P M"D6;v*+;fE08,b^Z8fQ9 PgK4B1s|!3:zX *BJ".W;Q2a3[XŭTvK4KƇ+ -vJ zT|vx(| (w&egLAɼL-H5c)mس1Q-?zn" Q!N"cM4^|xQVɫaddD)pJ`|mб3]EO-*P&8 \A L bӼ q.;f/.2*Vv"1?F)i*gˑl .-3fKG; $;"d\HRE N*R:Tb魃Ӫ$n̬O졞VgGÀ,҄%Y&WbuIhwm1 r V  煇n.czzVJ.G42h Q g`RXXjB oFdy3qZ0;r}UL"סD/h+s(8_^B@ZN\b~(XaGbe\2"?ޜ_ :h8{" $BrQb98:OM!oCOg8C*cV(A3M^NʾƮ8t)ߘ@8&/zxXK"` V&.؍fVY X^\&Ɔ,fѥN.܅f#WFiC{xB0Dn3!D&3]m$ىq$ EndA=-K! Juku DqLn$k~D0^QKfoX h mha(f zPgQ1=9UbD8ج-]r~xߧ (b=SPXhHLY|17pV?,F`uڝ _,hu̻,υ^Kۡw5;sY_9IXڢԼl{ϐK4rU.c"UśC5c1"ʩ@0+^咨"lnވqVEĀ"+ŜQ*~(ٽ8ɒw0D<YaRڙVXRPtL6;\80nҔ<$ Hd#R2"+o Ţ([5aXG5 -lU-ɐ+6O3dIMwJ,_kg>jP"oIQږtQq2Cr%*oYcaׇe"t`SW\9kLS"UbH'! TŸbL(p9U<1O ,")Ğ"'@ 86"?F'} SUGo48 68c \1Z_ $$E.뭊jm|&h'WU.E%2?XzG.JXQnQIu3Ρ| ba}N;E{#PL'%34yfbTN5ЂxiV&rniRJv*.[3h[A3ДO,%V} K (lTiweے1<׶0ph< XQ>2Q̭C0D'>E}9HԳJiFxxI+PAGgA {`0LWHwާ¦S^OqN)U掑8>I{i:f #l5$+JUvqgMh" WMP3qYNtup$&[چS) ;p-Add+z{+X]g^7I&`H!o0T΋nGqK ͰIL N@V}{g3.yU'*нm',: _c.,.F1s>vǔZҰI[ل(+: Rl@'|3,ikoUwV(®%-% tuشs0nDoP4P{\a!-pb64!4qEX67v 9C6ѹKVڄ0սz:wi# "&CRaجǪ@)T< T֞'Hv9BN z yt3FO5SaW-88rqib ]C0YD]q:\rFlݱb3P3EtS3GwfQ #ZLS .Ld1, nR_*smu|Gw?!l߻ν`P0RZGe}4+AHx|+z}:[z~U>> g-B݇KA T!Gyp'Bn#t#rS[6Qk=Abyl!Ģ]<tcB>y<:ɬca%jzٙ Ca~w}}uRj"lFh^3"}#ĺ,$qJH9?Ebb9`I[R,p c , ,PWq+UWgwx:M]p53s:B4C->Umom"SS]e642e+@'cIiҐOdM&ݐK1Uy(d #`x{D ЀאH 0Xآ>k#m*,Ȗd#_65˫LKM;z{n_  :7əMCgsV}3S+57M]gzJhj,0jgc1lifΆl:3l ĆfV8rjc^eB)FpWu{Ԧӗ cff9kjM3fYJR(<$1{aԙ{iMtȂ]tnƽeL%Q,)Ku_Ab+U6ŽAfx>ojoWhrz g3:_ -<2ߓJ13fqN1*ᑒx&Bde+`$ru'jVؖVwfD`<Ņ\?IP'ϴ{k<+7}]L+Pg޷KѬ#I< i됬k?hoL4 ^Va5Z|۔c'(-{E;V3O){Hl=EOlAk,!5ԲCO c1l,2#Pf?t@!*ab*dY7hw6Zx_7Rv]~t"e yF̓>EGu|B>7p3M/?uJ-KY x^Xf4 g5ڻi<Ӎ֊yNIXˍ)o5v+I6{x^{+c}߆!/T̠86sZ_0y~ɽ]$ p:{QI`86ЍH_uExML7mnqkwfd32fbFs *W\&ѬV8hcfn>وXm]ߺsˎL;#87ՏzhDp2fd^ 2RAkƽO$LceL#yrV:d~+*1u@eOʬwiF#eQy*5077cۛ6]N絟8T97ߵX{JNKBsq~a#xT.5MO f0!حtc]?TǶxC ߫}?rƌo<;F]$q"n [1t#=>d;Gx] U(x}aI:g}P&{s|l&j \^_G!΁;O~\~^+w? YF:[+؇sg߲̓x\*A]&Pfc,G>wA/H"22 7bINbqa~R6p"LgאJf 9s')[|=KeB.F;sKgM7S&0]`o|1qy} $8;;ϊL*ó!2>G9rBw8 T: mۃl:s )RϢb rzsuL=3(*%̜(j-%jSG*ҹKM'_.P3J`/#L+ȩ /]AZD>\{律ٱw=X _ZBeřʥUR:Lr_Fry>e̼6˼̠elUE sZ 7v>w1)`$xܽ0\{ _G(_5yL]x\&EjYAr.'+Obia !4Oqv̏h;ؑB1x3C,I*(4mmEy)پл{\bL>ڂ5ۀ-7ko 'O'5,l$y8>M ,zVqFqB F204 ۫4Pk,H@lCEfC.V7PerZ5lol -iqb`pAjU2Ft6 ih1㯃dV)LL5fڲʕ*?e*+i4Yl,]*KbI{@-`ba%iHa'#p9šd\_#!&]X&` @xMeF!X2^G8:5(RTS'dH(Pb\.op(5yەKbD £6~pTA[(OO0Ϥl蕌(k 35o6٭P?v7h&0=M25gP wYt & H0<`<;˄_AZ<[i,{YVJ+yy;sOq.I>7xiXb(3 ͬz}713^tawdZ;2Dvcɮq0ZEP6LlMX̝;wb@^yl!" EF"pO'[^`l];Do/?ٱuvxEys|RNg?R)8G@Ƴ9ixxWtNc_\O;um d p`a"[ry?O$O `N\SkޏqTB F%=i[+=W: LǃݍoO̷堁:eV?c@I&0o^R{ 4uY8y\tsel!(rk҉6dmoڍo٪ƹxjgNwT`W`NhPU,_ }cF1:u 33c?[32}=˸} u,vJvuU0:9XuÃHT 5v_~eA Ci"Πa:tȥ<]NdMz FVx}vTK%ap*5PsN7d]lnjT:@0] P@d9&XV0\N+ʹ r ~NC~Q3Ivd*C%q^..8P,Tn}#HvD@TSFo]pM5r.'*wA&W큮VxlNIk ^"[7HCrc6m,Lȳѐp eU~lj5f]E<&rE>{U(ԑ.+/DԎ}h4,MN:n MK?E>f>R{;2ugwV182X(Fclmcp{(S&&`ͪRgfφÏ /G|p6?n'6wQb\ w7^>B&RP5 ǟacTifp0v?F\ymت%L^@o A+]CtpSg13ASmp`-Gp, j%U/_E%TE\3CŽ:vu%ѿp]vS|h .\/ޚ**<D9(]$- *יkDhu ݉?}b#r69D} 5sK1ۋXЁC] bgQ&ߨNKFRÂwEEhPh& c ֍Q]6Py33N㧸xCcʀY!Z:l ( BgsFl10_C'x{6-.,^~ ]|Cz@Wl 4؇HE4c#G.ܠI,X'1p?M`"soAձx3F+XjiL fBe\Iwp~] Æij~D8]>xvM vL+4@lr/yH &l73['ɦvtG#tJUa}Y^|5UCtjfdESE>W6~Dw-ť'j,$428C3m+ti&heQM.H&fE8i0ȤĨZ(~U63KT6Z|xqtǛ^YґOQ&vGM'bY` %\zkw4&K^c pg'LT<.(x|&4~MJ8H 5d-wx}6dG ٚKX +%Z{)o f`iTqm4$ݔ94 n!u%{&(/!s@LB >\;.B2ͽg+oQQA!sD셁4zP/^Š&IlnŷG礉,?&Vi)o^a|tX<6Hŗh#į~+WngffH-.\NUԆZ&Z-.MY쀻 TA ݫ l Lg {RZnz]ܓpw)3V|3aUn{]tzl  *)lytxAtӵ.hd m 4KpkK\†WӠgZLn(06L)̀kQ2uMkM1hG*=)w $:sT:gUl:)l9LEfWסּe]YYR1cJ`0Ұ%=,`|eƝP:pkДո#x>2@fsj)F|*@횵z=vv;U,q"8nr|8Y~z>G`s+# ǥdNo@d:6)`$cB喤EB+Fc2`Q;AjIYYaq)&DɈ]M:+Y܋ʙ=66 +FYY-l=N9cTVjF̆1N;i67| |Zu1%ޮE6{2.mdxΟ ElGX9eU#HPb69*#Οgkgs<; p }!wQ1ae*PӘYgh_ck޳A v]&(v2:q:ĞBo ;(2-WlnW"}>O=z qt==LѮ([+`%D_71DCiFo(ak?ˇ~؛E~զaI _Q![^J5D{cMd;d_{^$  X;ЋXzM䩢6qpz">ԋYlB vkUqtBa0Pj鲩rQFGɜE6bv)M7ڭwh2Yl./'P[Tm5ҩ4X; Vk^6kf9Ĉ@(7؃Q:z$F!8e6RXkw4HPgHwt}4F(}}8?;mTMkxsp4[٘oy~0?J,?w]VpPs{l|`!^WU70#X5fqYY 02.hLQDRJZ0ƺ=<&6Ņ pGbaT |IOhsod "N@,% fDpYX4*!0.xU9zG~shTkysc1'qڈUPLBۍk)3&~6xwY:3@ .(û?&zR\AGT$Ysr<&{14iF"Q\\+ ­òBݘޝ/oƭeXX\X0݅s/wxW/pfxp gqM/`4hрiIЉ0yeCٙ(zϾFmjFAD!؞)IoG"N,9<4rE'r4,]!v玎biv#Աm:;!l/o TUb(lPep_eаΧnM|udLO:H'rMBho_>D<_!26YaxuT'`mMj\d4FU*dQvowoaoԫ ʙ(qqr&Z2QXRƁ6M͂A< QDzJbtYv8<^bDCؤv97=? e{۾, u I-CHGܽu R>|  \6`g&>Et; ;-ܾe,n̅KoGqZ\̾`$#Ћ[D #n86_)RWFP>\6IԌzPaLOCqՉu4 /sG;6ܘGСbs7il`6zf'afav-/ne,u QRdyd %bhʸŧ8q'o#P$ ̗mIp+[p9m%6%͡ʕ*9@s1o*5^^(z:AAH3Q7k#ƒѴ<ߌJ{6:,r2L7Gvvf#fv&ՊfO/16\|:]xίٔSc,OSV8E6c?u60l|O/ S:.v8!o J|V"Dy"F!`"D(BƒNH+!`\[[[/sM`B'vr!ǿ,`uaޓK.!__??G6%^yAb OO{޳j{'3b LW:O ;]v gϞ僑1Oh}uY<}ųlOLE;x<$S}^z!`^0&t:䯞\z?GuV׋p8UE4`Ǟ"/z|U9:9 P-y1!N&B|+WZ??1FGG9s9<.(d2>t9:_oP,=u" Ӌ>%aٕeqzfgǚ/鏢'3#;113 Mz~Lkf{ S0uVWy@ZI@v,2?N׸1L`)[?@Srbq0 w.?@wo\rofp&a[Jl1,^Zfz09F;1 P*W85T~|U|\]׆6` r/KA+zBBo FQMneTus 8|"?(VY"h.6=Dlbml;'05nb ك3ss]э=\|2:noN,JfLH10= vWo|0[{h zztj2]бr&͔ PAa将3g`;%֠byH vۏgg`!+hRu6RE#ǯNuxkc(nPSqGU,{]R ulo"<6^\#}ڛ(j\ڀg]w3lXZXOS!х^;9ߋwQ*a=azzSSXYB+[ #ɴ4Q)ptjAuHZJwΞx&RX2ըf U԰ _,1Z#`!p೻h*vyĖj]|g8Èv9p2?DYa'Upolo~Xk)ubPM Y$2)KEēi(VYCUc(r OK'sM`cQtRDpqa@$nmr V_CݐL3H cSs\ E<ȦDpnzK /]O#o^ S̴h\}fEqfIj=CWKY2ɲ1WLf'Fs "Nbn&uqr>޾C‰ 2Uyt o Zq=Z%+X !0 ,fsSY|> 6xM֋SɭrHY#b .j]?6,6x)񙥏@i`0? Ņ p@##;w"SֈpBm6+ :4m4 +  Y1 sS9q!{8XA{0vJW?Fhb xPpvԋO?ۋ>*7^Рyy(eU=/ֲti n$18> 07& i`g74FqApw`W*VaթdoWѿ{#xp@OЁ;} grͅް ˟]K;Ⱥ o4MAd}ċM NM[o>O!1u_W@ERLoP~-;g"b ~ _C$)vl8]XNt9t|G8Zl$o 023  | g6ɭfbDdvc}/.;0/=;G_~,cd ML@?G[ĆILBs!4IhŒlp86v:AUjw~ܘjky2<*Nҕ8@M&3O{7Q.<.7{2؏~'mjs:,}VY^'gӮ׫huߧ@͈Yéuj &SA{Bypف,⛾WmD"D!B"D!B"D!B#DoO8IZ䫖v|ݶ:KE9]}э}ER$Q׳;a{OplZ1LXFěAF9}Ueee#OZY9Nf9ƲVՁAvz~NW2cEKۻp]N\7 k J@?J `tt}0N8:YM@md߯:N9v 5#OeӉ'F˜: 米|7oP(`yyE"&ILI ɱY^7*ole;McDx^{Km^7Rs{Yָ𪆳/qp שּׂa4C4~_IE|q /~;˗0?9Rz)Wj&S<2iTaiofs87,oՀY&QGk M:^%k4ޑ ENu6"%U2jҦr2Td,vLNNO?UH$'IDQb1jpu +'6;#L&m47;EpD-dVZ$wh&h7ˁnrfw"r2SJEr83{`ò:spXj0#u^EliJͺ)s$ZurAVgʬ"7ڵkj9Çi}?]w$.w~ r`>0ۛ(=MN HM Wni6Mt*]$r%1L%!o蘜,cw7Ǡ7Ht *U Gm!65?J",e"F=5sЪY"WVH ی} v3*8AUϟ+0g+&#˙ɷU(^`JM)C|  i /Aӽ,j$<>ST_^%}ĜI(O4Uo] 9Uj *ؼn #v$F>xg=f Un>Γa?J)3BaxUbL7cZE1[2%Pv0a`x$ ")_?tOe4 k]`lŶf^Wi`i#alԮ03z:.̎Rx$nuyPt{X}(a8v>0s}Y[*d2>xˏ' KAWxk\7po_aqeWYt,߿id ق><6vWRy]M,  v8 4vl 0Hrw2խ<3gy[3Jj>33IĊH W1/H9>PoD]X{4*a9 2NZ* #!<D|ccȓAgF,NoSS1=^ 0 C6jˀ50(k$&A]'`'|`h5ln}@ iJy~’ ,Gdz-D^m.ZNbD^N>*{Y<(TA`Fj`cM'lNwT/{d101$^,>ŋ]D& ؤ@j%V2FI#'ǁ&_[]_ Ygϑ)eKd5 rx RƊ*ύ) @ݹC{8YYv1?/jxsץ$Zn MM8ǂ+a5+ kV J Cqlc!$6n̐K\2Gg 4K~i44I?0 "Gb8.' a4@4T*WB`x~!"%YvWDG9d:k^EƜH :yŊ(-NƁj/CQ&h¥, wvZwrLhCxmq>v:oܸqmEeh6ٖ*˔ӂ`8]8^]&f)LΠxT +ے*0`08>3sL9 [-80wӼT$9!\DhHEb/&gɽ)@ 4=a 3Cm3|V |g 0lEV"( $#^PC>:ҍ|D#mz [)Hu N8-ZMЋMgۤ9pg jiC[ĭU`cݤhfpVtV ݤA)֤IQ0MbjX_(!d3<رLV։i hY˭S.i3?szo )iWԘD&Q Zmj@JUu̧s&N;7ѱoQjakǃ`y,[R3Xj@ޚ@L{+-CMl5ALr)k~Ѥ2-,|BM6\մ~EZZыK!YQ8UTu%S 5{[ﲵCZRϻU;-Ԋ)SߩelBFyne\?NίWKH&e:kR$,V{}6+8~8^L6O1؊&+N@/n&jmK77qpT;S^nm9ǝzG_UqsMt^G{Sy#Dj){L *ozWiQ}] ~ [G5^ pS7W|B`tQ`n[ӹ|޻aapU˄약,'Ȩ`/NqGFkNOKwzN2Ғɫ &Pipb QXV8]aܣL;Tp$q~ӶgWl;)9g Q[9,lnnN|P~'_YY5n1;S= xkA1( vJ_>ӹ68'ӿ D}l2L'EK7TPξ &vR:]z1Ϡ3tQT~cHhszmZWGI&~o,-RC8٣]nu-!aG{Ns0Np[L76S{Buxp/ -*e T@VTijt|n=wAueSa"-f`2+K*"- #&iPfl21 S6 hl|ɂ&>Ѭ|&ѻ82+!7 魺5s&7Cۻh ʶk߾&,'ee]uhVhYsL{d.=ׯ_ŋv}eBFg˗/O>Qlro~>3S@hQu:5n}!JQ2&pa.H ]4q .͇.{O籲a~@bk+M\2KA^Şkf!*Iܽ}嵀WiF=xwG/ @j8f)Sg L]:Շ1v]Tku=ܺ>a(ofldV~~evoߪmvs; 9+St,y<=b2f.d1uD<U (Ç!DC,#J )bhrBQctbb#"Fc|rO I#t?QͥMb/7qcɥhnՐK7FTG^D!hpF82Ulx11SPjxj 61IGGtrr'N(y:]׃d":atkVL'QhpMhi~eZ2,PL Lp%N xxK4L~ղ<M ?ǘX@9! S6'@4""0XIG} xn}}e%<6\ p'g0/w6OUBu5 xOx5 ј,K!u#!(޽txWBQ5bF1< :BhO?u Q/ǹplp}<Ɯ&ӟRXT8lӱʍ-W~64.22ج1R#d-xPQ>&7gj^ZohJ`|v b;Pll]u`[zJD#S5`[˓|f+kq̞@ _@J!X_]E]1e*G=3dC3D5t3@+{irUt᱀*N113FZTlEA4L`LZwU~8.; %_~)L/?P< 2ՅM~NMכtr6DCl qm:Sr|| f \ H 4#afv^b1?"!? qܸ̼Zw- iLV\^%SH/YOO.ࣹkbw _O OtT QDԕ0^:̔ҞIr&|.`-i 5&81Ǒc/8T׸G]ELhTTxY jdTdxkFnn&fZ6XV|1ov̀ Yd^gvK{E(^J}n6٠٭Yޤ~กl<>#z'י\fe0@_dUBaM0G.4yxU? : )jpˀA-mz! dr>iM~!ДGcro@,Z37T46_`a2"^->GfVWZ&f+yȦXֹq<+Yxa.\Ѻ!F'P|FDy巤J,o@YF.`bIW,(a%Ν;'Bnџ&k p:bFUCFab*B)aȨ#7iuh2G'-WQUd5F0$륬ȗhj ZQPMI.ȥ30&ŴHȺ +Jn[M^P>YDFh='4Y%MyPP&a\ŊD2cYHF\$W- )РQlU9iDIi P)d.#&wCH_HCL4r-jbrg n lG%}u]{:)$O3Oai:Wl &wW#|`jR˻_]Hk4l wIug %Yb}ZTp?MjY2fPriEvڠjڧQ WG~gFj(Q;.?Ԅ߿bg+?–%Sd@4ruu-u Yeתe-t:cs="]r@W#MķeA[Vt!b.m`j"ZHùp. dkd,l0Is7@#LҔ욝'Ye9j1b2ri,-nl>MQIUSȩ:EZ!Rr%ru"mf\¼YԳbu5'KŚGh&eDrK,@?˓}Ejf/ o+-ȫCF'“'O?{L [+ȓTm,$ŝbi9hmim[J+`ru'i[ĩK<ܹ-R7nǏ5,Ovm?Yt3N> cν~2u叇Gv* 0f)>@ts Ar h$|L`o) DX#umO|>4p,J/3[xӫ}Gڞ~~qϸG9lQ{,bb< Hvo@hդ_#X =5O 2m:s&s*pzM7G7̭ţDZmW=/17r,(7O2>ǻiy{NqmˀScz [ .]&o֜m 9N^Д1ֵ:P/Or~%a=Ȩ,N&T5z/P,S?~} H2Vn㔳<=QnSnHR<^tfc%/8 ?FV HUβIENDB`DisplayCAL-3.1.0.0/theme/DisplayCAL-main_window-reflection.png0000644000076500000000000012743512647526540023717 0ustar devwheel00000000000000PNG  IHDRtEXtSoftwareAdobe ImageReadyqe<IDATxgYv&Ef7Y-LOw[r,9\:-JZΡ=:g${g%Rf8ǵA4Be>3"tD(v@cNdVddċgW1 RHq"F)`H"F)R$H"E)R$H"E)RH"E)RH#E 0RH#E)`H"F)`H"E)R$H"E)RH"E)RH"E 0RH#E 0RH"F)`H"F)R$H"E)RH"E)RH"E 0RH#E 0RH"F)`H"F)R$H"E)R$H"E)RH"E)RH#E 0RH#E)`$ժ )R|b٠|k_ۀ}"EnoٲjVV[~"EK_R@X,_U-)R~YKP3WVe8V>f"EUlD}9=n `bVkXx&E;"Eʣ$:a(]K$__nܳrxZK'8U "jeT Ԭ1}zDe"Zw|eH.%E +(8{X4LP0S(aϵZ]ܔJ1+j:T* zŅ aw ;y4Ο(4^WSmĿouHy1`bU,5Wvl .qGѻt+zJ L5witM /MX~Hrҵ5s(Sl"_c cg*BMKSpؼ}bw֕"a`0eM5bM _=Hnk^OC;…X ޱ3(VU Z~7HaBՂ*(ׁh4#Eʧ\'/:½XP44E*J-.$-& ܚB>@d a %֒ޤPR5UbB:)u9H)Vp FĈi5`; Nb0}(ZtF-alkB'f63׎DYCa9r |Z%iZҡ?%MկNAK5-ij:MEj`'Eʇ;uw t(xpxp<:80QfXV%0j ub2n@@0tl p=DCd- ,sc)]EFڰo M+,Yt׫q][׶ I"僈m Qi'HA:SJڇ rw.-!TB╥)5Wwʙ *5  6a QJm#n F1t;=6?xl3< 90_/<+ma,v{^Ǥ4 ݪI#EF7l` `, 8{}:}x߃׳8|%f&[!@=wy|-"NjΖQ?.G  8r *M6x)PE NOԶ~|5Zǭyl s JʡU1_%eF#W`44i"H©N4k0ZۇŪ/O2:4;90z 긺TZ%Dhx0mr#N\V$ 2*NjxbC^ `3(! Ps5U!< vNUbEĠM>9Njq,ZDu%Eʇc0#i,t (F \F`vGfry lA_ݼ0NkU~rjxvce ]c@KQ'vut\6+T {q<.Mx""~n,g1!}4=p$JN"Eʇ\?D @plf^^f!*p ;4#!% s3e1he1 쑙N\/@%ЩN+iރn q>I}?.-GU1< g撨Z3q̥H AbF%Lg"@ TݢjԐDOX ӈ5v,nh9%PMRJGW^U< }rŔ 6 \ K@ o9lnMŒXSIc;"B*o^/84踇]1q'w&gӐ.R<CѤ+6m p&MR̥-歔6GL¯04RtJ_$Y V{Zck7Χ.ka!]uR{fhts\¾4q%b߼,5ve޼ Ujh׮:eV?-YMv/.Veq?4*J `ۍ=wx8Tǀ,aG6a1Wu&A/F.\u۰,:808l2GZY]llARkؽeR|> V M9ڞTz{ fPNS#dڑF8bhc#-yMG( cΥEB:06d؃h"xC a٨q krކ\ڗ"xR#G92jb`D5NG0|~"qm1~ԋe85'vnF._FVD]T SA8޽Ā: U ~F.\Km,Lݷ4 +,ln7xqjoUo !zQm0˰+ev;=xRօM1 HmpbS!intC-d600:Ma'N\KahUzbM#*u 1BCG7@RH8KP-WY Oo߼q (b@Mɹ$=]ʒ0k~ŭ8plnBUB m" 0hW!8#x0{a'7'QGkAF1n*tD^6\ 6OinFwd;GØzغa[aςk+ED ,ڳi adLx tZ,7h Ja0AFaHPزlB!b͆o]@ώ9a' 8oChPR%ˢǡctō4P yd|y?zdy$fS&Pxvb<14'CNl#+Klra'>;ڃ:VԸs^!ݏOa(VxzYRAvXMXv+:{jp-Dq=b'aE|˻]XAp4@[$ ^X`}_ }oЃh,¬b!K/;A~ <xxLDXRmr2Vkh® Eʣ*gwSa»)i$ ;ll>d^K4ۥF缣s)&8Qް(]Zt'?hfN_Ի Ðj#W(B1\㴄om1:o6vWN:f:.m;Uz ˟O/AdϔO7Ė1ҿJu;^,9 mn.nmTP\_;ܬ?,Y}hQVL]?a,7kU[A'UUF6>bF 𞗈ntVv+Ys/338}.1OZdp}7pMPkYy<B=].˺t:00#< 5"M#Lkg60xw ӅX3LM)n!ߎQ+pkkYiRݍSspi }8)aE#t:,e^nbUU`rgƮ_~pf{6t $ʍdz(qX~ԊEu |32> \ \W802ZB0A)ARh]֟ۋbr_.]-;wtb?w6)`؅^|P|Ǔ(cuxK[ƁWyJ&1],"XT#;v=yNJ]X--lJ"݂cy$usm% `4|*ͧ & 2b^֑~! 6&6u kT l 뽂++UjƷ1~~k_;^G,aŵK{>,.,7:ѱQx7Z+‡?>S;gِa<`l^"l;iM4J]CTͮ£q+;`gK^i54[$1vl44bv;Y޳q 0.&rtߚq1M!SE ɰRa KJ*8JY%D{Qnq_|yt޴+?Bׇ"G 148"ep}1?~ޙ]c) `8&%\t_x* tx{"(V8w<'% *n-T tRe4]Yk( ͮ ԌСtZӂh!6N1qmvW{2l+),,'Po[bk>X9R_FCl/Dp녁m2p?"L1'D#H;o* ŽE0+tnН 3oݒ6)bX_{G02/|Tm N$bO` r &v,J]ckk˴73̓lL1.輏>,F{N]i+|{[c4s/:Bp~1ozB]&kRR|`F ̇/;1'F;~2xT^4)e>~۾6d_E)W\@LV6O[3ɱmHyͣ l)R|9u)R܆ߊFQ9=(+F)wE`=,C[:&}CHr̸gacwy%H"FIl`Hr;PVȇYD6v=出;e*2琔G`>5MXViY ᠷS0ؘjRT25s38 *Ejnxx$[io96fj mNa>4B{~ "\xߐFoo/FME8UW5]N]%$vn~a.nAA2}AJ+b}sme:~Ɔ}LJ3<0{z*P,:PtZ0ҧ/ Np y1Ɇ{l*-!Csr h-Bhsb" Ei#½zNa 2y:Pz]ľ"2XivTfVvJ[fr@.M`U.Af[lD"`: ?l؛|Fy|[s1̓v)-Â?z^Ug'=o^̊ZeGXh's(sDcx ^=t6}#o 4ǠsV 2M*-vڈ3p1@Qe3(+X-b1)hF|Bg"RWmve,Vv b v, nO󴙋G>f0m`Fh(p;?8Fba/,i ~pm^@bo*$*VhnkLJǮ5m_\_6bBX_Fkַ 6I7z׆a0b)I <Lxw9T}*vb0Zo3"C#h6Zf"bYpŢdY=LwVjw{cpc6΅f1.2N>%bJ^$ƒ)@MX*<g}xZzU5t:7jH訖JJW?h u7 e,V| GyWV4coVՊ ڠV%2WCio-o4w?~GG-$[ ߉TK$/Ie;"UQ[b>ov0 'UjoKu8=t]%#$wNG.L֛m|$LgVtndUOux8HU8:&ǪHn!?}sgµ"0Y\s{֫oq.`%DĆoKEP:u6?.^ ! $XVkf=qE GO,h`?gORk6~+#.BQ.`!hR'Նue:sNKat0HL΍Br"MBΏ3˛95asR ϠU?aa!b <ijMa붝fV ^,ysxb4^!`(y<~9 `9d -XZUw#a$+(m* .\ۅS]RC~yu@YĚ;hOK*N3)@hFǟOmǷ;X3xj&)b>S0>0LRb-w?s_Y:5~>4N8|ZQ!D@|ڍOuz6&yr?Ve> v mȦRzza70n}ZVhs/\AUc(|(6;9ߧ?[꡶ڞGINJ? 1(<49'{aq Ỏn?5SaD? `1\ZMӸN9줃Tv00E~%g]xj8/ԕ[P}rlTWlx:3A1O5DUjD}Hj: #6YIՅ2aKS6Tq M£x0D fZ1? ʛ5TROzK,{>0|d[ccø Qޫ~7YC"<3IK^5b&v_Y6!} =AУtW^Drnx9;8V"|xIly0 &΀ƞιk|` ñ zۣ=|5d؋`>Aif"l#yhH"!cf.{*cƭ"Eik8?!)RHY\{#E{b0[)X+ f0|LJcZ݅I>E#͖& ?7OF=s>=sPk nc#vA7j({ 48 UQvs3‰"M`4|> QTb  6 *1V y!bQD|Jߓo%~326nZq=|,< z!,pq )]6QQ8̝8 F* W^b O}8HB RɥMf]pZ _8h݋_/C[d= Rُ gO [v.8T;&q{(Z{m+hw7H`e& ARX&8x] O՟'Ft.Gʼn8z$>lnꕑ#"ǩFwt(C}\j| +ףpO_A 2э(.A JK#*bEjle]Mb%۰k;*isL^o~:"A"IB"ZS.<"S7̗^³JkoPygl|v vw6iOHR]i5^cџ O.fUk7o7*@^Yq-*4o;V%E& jKË/KhqMG^8"ୋEV=CT4>2w2<"/I۞>6{̝Vw~j~?S?y]2ߒ eh/;y\n8!t%xFYX\RIQ~ZNEY9;n>} e|ԑ[X .̌x ׿Dy\xtLMNѣؽ{iijFGM{UW>1YH mftOlK = N `|熃v'01dAesͅ0 17U4A1%cq18r:=TMQN?ؤN}"K ijifH@(* Y X< C\+]DE&a!p V% P6DBfD4u1#KS?ݩdXD^ Qd0aաL( L:XrZ1Um40:1ǩӏc|.lRԪe3 ظ#*1&h/Em)ƗP1uțȗ L Q{e`fnԿ vn݈sgOAw3Q_WƯ8{ `t"`cb8!=sZT;oP}SxL#&^!Ce5b6@%ghpStP4=5\~N` ʅ Q/F9EË'܎ 'iV#p{imP~z,S.7 wa_߾ۂ0l޼fͼH{v~wNB +B6(3[[m4蒫?wZfΚQW[;؋shY/M/Z'L9Rw\NPIѱ$:yLA׈fีLBWnT)fe|a0цbQ0A}Wu r!o.F`GIt]NMNШܰԉq܎!LIgĠvToͥQsEϠ{nU[ mG-P0 7RkLmk nqL)gH"uáJvFю'2% #)k,͠;v:?N6Bmr*QMήU$?6P@5tZw'^dr$ bT>Dcm=7lf}v069HS]WO?Y`y"TFNeuMmucowZ<+tD<5[ ;mUVe4\C\ZCYNU5k3A{íK6o+Hj#Jd{>ah%D sp`EYc?pMf2ηZLI۝+e *fn&JUx)Xi(wKN g:/X;^.& ='a Vw谷Fg1)w,sx /27i2@A>[j.N9# ޳t_F;e_ivr7t¼N><~l01H1EX86nY7}ҥNjU~ pXR%0;ڵC[ޯ<[8Z\{U(p|W>jKUڋ>btm/dq0ެUj[I#<0 bh%RIӰӃeva7bU|mNɞ@7m\>[ےˠhPMUo+o[ԅKtJVC+AZ2XOvT]0 #f=+32P]~my+Ë^K3\>sfzh l& *{DDgaO"& +mݪbS&2w~[>X˫BřOeTcAXTx],\<ꁕǦ4pUcj hnC,Οm eKYt}w>«H-7 $!]t8g(`>E(AjA2N3A:D^iÏ#v8P6l܌xtCØ6D<+];6RR}!Bz!+Qz]<ƅsgGwhl)gք7Ћ^חؼy3t?jWn?,z@R/е}HDaTHزi!}#nqAo@zJ!C+Kйc!֫HUTxي <6N[UߋuX[5*l z<~0FٳP\~uJ a pqdK5z90G4 ;=O^+БkcqM(6$ \jwhr x^l6BVz8td-3q=}>LnߦoĮ=ۉp% DBBeS,bʦ1dĆ.^]P˱6nފ>^9xI^E Z>a!&Z-Jy;k?V)1a 1_w̵8BQs§60HB5kbKKHJG2/bd|:3Xz˗ cF,'2P Tl(T(e./bfzˋaU&u.)UhVuy#,~(~Rq b$!]QW(*4vl !-8|}V]PU0?7>AloHj7ݮ`*4ٕ{I%"DIm1O)Oxiet|wE:$^tx)ؙ9=\v)o܋'9IpCP^f3ft+m#""c go]֠MAnjĶyx`ݩ;q5qT7RQV xT.6iUerÎezC89ud'7lu5A[Nj[ރ&<~C&FK Smoyym.R MT;<=P-hqXĞ&}e!Hmyinؑ'WKf0zjCyv.Wq-ִQ5n8X=%SdS] #U1oFh6"b}6acv\E|"QT <mCѐXErqlj떧ا2y Ԣ=^ qW0gvS?M۸D3ϱunK+7Ad`D}AK3r˥| *Rs[bZtm,Zk_0Z6X> a_kZjww_|)RH"E)RH 7Ia=PQ."'R߀qsLwwߢF->.17bW;6R 9]kYrED[\jEn *> *cvq hhF7NX͘BSqYVG_F|3J{/K9#ՕsG{qKZ 1nwxc^料dzL+wFaNou:Y+*Fzk;jLEJ$|"#4q>E 6M\Y--.Їԉ8T#*m1hW 2.LTIB>tk#ݍzU>{j{pu[5j ἧh bY#TtZqPhNF e64M8Jy"A{| MfY9>9G w{}p gw5i7QG"WhP,ӃF$=k:؈Y,asq盛֑Ne-*%QHT̥Q,x]I`\#Ht&FێX2+څT uB6Ł)9xEDF.-d>iXH=8`oo:a45 O3OCC_W(ꉌ[Tq5ZD4Us;Ev`{ Y6qzN:˰ G Ed!*YL`{uoLn}-(vU˸pu{ +sw4(sf鷻OCj-(5 ėu({0>G~ /r9׏}¡UK 8} 65e}~/ e>|f 3"qy4.$Ƨp9a1$kH_ze(W¾/|ٳHV 7_FsHC_x|^Vz \_IagC5Ͱ珼8u\b Mx!r: 0w9dgq,ʕ",DaYLL~mڼSa!~ÛO89H=^d Y͘|os! xTiD5<~ 7oE$+4޷f(ݏ&gzn@Z"^CJؽcj8)4 ʥzGq\?Јn $j֮?MX$z3NazE7e4UzۧJ\c}::ʖ"PXPpPsjK"}Lnڴ7Ry?58ׁ9nsȜEIY-VeYgyjeKVERN9܍9WȡD"%rUNX\9sPk0wta&q[R.JR&xـ`ZEŲU䑙}3LrEGsEք !~nݾ *D aK,9!V@ŀZY[[A74F;>:Bva |YzGf(/)dƕZ ALL%CW\q9 1~,}Q& b5 wk.O %.q݊*)1$.:M Z_E85 ڄ)d.ѶJY#M(28]An6DB )(̓M39ԍ#u\jV5E&SҼApaD.M3 %Jw| Do)Jttj@1j*TSFaen`\1ϻR^ZN8{0")'vz ވKE(^VZ%s-Me28Dp:~0T7IKUMf܃Mñ7)!Iy}?8<).6?ќ>쨾rNCqD g6jR++7.iU\nWjGZ{c~|'ØjrsHgXͬ2ύIt`SJueUȔ$oqr*| !rWq,bvf6eJg$Zm,D+6, +.scʕ+`WoHX > J&u7I<$Kn lf!+2f yecWc[ZopԕUD,-{#ʓ 2YZn.*ް{C9t;?_xMRjqIBxG7GުMsɷ/AVZ %L޸)W J".eu%œ~ `Tx'ieVx6Ql9bdtW/m|[y|9 J Mz0-BTkmE,ʿwhKTV2aRƷЧ>Ŗ,:FqreW\)d~=;f-ÔP[(HW;`e[3" rJ+ˠ{p,G'9=BȒVϰ:/^@]~'O_Jw}nʚ2Ԫ}ʼn.̾mo%A,BNo] -_#gG SINNQQ^^´O}:?I͖XLvu=*~u661O5;NP3?W!h#b2GOd>wϘVzSS= ;N`RPz M-y~l)ȧb7态ַ hOxc)!_Ĩr'08.#;\Ν}?NaV6PꤖKGTƉ#OQ成 p8v FN aJaxlI<'mjr]Sgq۽p`(QXTGΤggDVO.PhAh(YZW}<<󓧅PWbP #2fqj**aP$C457a<^;{¿>³gݽNEunty%h5A .pV3.i'Ǐz7y}JT#KT>~ht^Nw9G8JL:Hg1::VbrI.HBCwW#T֢.CFVH&&߁` '5j j 5v.<jY B?[2FR@Aa16?XX b- 'clʲ"9߂ĜAz<[PHYڅGRU -¯`Ф ˷ܬ2 Br&s19)VDgb&ffLj$w֗/a_i) aSBW Ka5ы> R* BQtN) DiT {nh$N(Ҳ f2ϲKL{M5!Es v O[*8v,ݨCSg*OGDx&VYJҍٜ86H\W Ĺm ڔ?3J-:U%}̯EȵQ$>av=F]*k i,7'!qmYrb"sQY^іUDQ z,SEf aeD(i L ޷6? #IVAarhX]]]c[Y .5ru}^4:3[ ~> 㔘Kݳ4< /iMNZUaSd0;wY NzNI_?O.%i_ f2V H(ƒx4߼L$6 g~DBd$h+M x~xҿ|"IP0Ο:_]=$[_Kґd0Xohmo{(t8‘t*WJ Y/{.+(V3}cØQY 6xS@Len:m*OPXL>’\'ƈ2_d &('(B Ls陲c(Bq /c2UFh|Wu191JZ^)wE gDY33[Rfaqo| KE Cs*t ~!FVoia1uMP%rvs&s7&h{N(_am}ÂiBq;]^' `$>[=^a%mw$O̚<𛞕 6 ۃٜ!<zy!P[% AwoCxSsY"C P^֭uf5Ccd.<ťu[|ArmuR!Y[GPxJTl`uaŔԾUvyw[[߾fu3nkيMD@!++|_A0_B$QK &tc"TSV'J7RX)l6pc THk%oncs~HP(0syA:Q!9f'.} }>w?ï G}cSýK)'Cd@֖miaddR֗Hj3RT !ޘ "Yq xP2DXgY@cR^ͺˋ׵ΒOnޡ **+D!.blkoCM(Bb9)ŠХr)rrB1*g"I|˓L|4˴]xT  a'b7-J%΅Ir刺-uyO/ɕ#z:uZ#[(UoF̖3oTʢq z) M a%Y'3D(NVdʴ}BA"̔]MUޑx !%!\-J.X>;CtW+m˄vrb)ċNl&H=<#pts?{oCq. ,\n2_0¡KSLƝm58{gzeܫKm\tft0}Cxa ~D9IiB`ͣGK=OvaM`K ':Q_ B?1.Fr1t QTO峘+v];8tuQTZ~}a^Ξ =˅6"/hy44naqf{ /OPe2?܏EK8*=m| ̥t.zQ?a̳-| zy'fbMv J2 k6J+ʹtu~TTְIl2tJ֜>FW H~.^ 5m33?G ɢƄgٲy~<1%bNcmyR/Z'5H'ݨ&5^݌݅٨'= "6=EǪKxvS#z;)n {_#8E^a;v2֍G(\ ]8NT&3]'\҄LIz7'w4%ˤ `+(ӟ#]TnM>KEY9pNb+Y^¤G)22ȶ&5K- qWiyGPљ=[Ա2[\̺ݎ-ʤtLGȷkjySQ>TVƐќ; &,2+amBkBJᕙ lٳP:}UʠɇjeMq?0~[0H>_E˞44$OxQ> D+t;" D4e}t*D4-S[UI_/-އ[9tѡܗ.JSmvlsJvq.ʬ2Jpsry|my:s< h i  _63LPa&LR{\شZZ[xf{^fHkX_i\pplB@CCnݎS:ѿtNB>/|\ܞ(XMPP | ByoOBΗ7[(?PFN֗afI.c:(,*U'g`.<24<ހ|.גA=񪽂 عk;WPU" 0뉑&Gn.^+<$ uWVDq؅ђm}Df4ܸKر Li=R*OPFxL߻Saٓ:J>KIO{ª5'#r>Wl6VWclT3?s\aihwSv2 X+FfEJ{] ]2:>.Ϡp:lӳ91"Aat/M}7'iyP*鿦9U͘;V"{R.IB$nzK/?-*=ǻ[-C'{Ba=(`*yГws}VFY ҒYۿ!]'~K>..B/۩iyl;aMhs/Н-<v8>ٞ6@"[׉YD()HC(ZG9zh؞[.Dz3q cUa& J3OQT\+a^hD<{ ucԩ8bz<}!ʲ2ma/{|[{dKq/\:O>Mys=u[!zٟ`5Z8O"J{S1 )xb+t?~BZ[[q&?f'^oá[¸410D[`d)B]M9[DX!J-,5O}JvJuϭkHTs' u|3_}h>"BMn NKn{Q CcRw~U[(f9)x][M{f=)5Cc RIA RR0)HA RR0)HA >@ 05uuOkA/MDrp fg]kѷ}TS(ڟajoϹPTN>=]oN XY#h;udޡ1{-3 x\LMϊq)q8֮.KoԊZv;YO58uC96M7<{sd"~.~\{[#yYz!Bh7KT8C7Ħ 117R$4.`,"ajdJSޖZN".ѥo6'^D_מSo1fK5g.e.8D"!rǟz},PkYPS]MRD`iYq9fX%8g}2~W׾E* #v81S6":8=$^T9(Kcƕ̪fnKC~6)Q~0u(|v.x_fN 4(NWqoVc229Q= X!c:Ɏ!LxfV4]'>>e`|gU(Uf.⋪h'$M˕{w7cefM"gnq ,i$J|5w'#"mPLFqBhZ5\J4Maޗ?|+S H;H.{:ڎ#aef&Ľ1&ZK~6Tq5,5U,P^S3gV d#x+ɩ|iLZ{:i4ZX9bb~Z*8{nms̬Yu12}gGJ Ϩ"˜sΑUQ%%JM`E2G@~7X\GbSN'c.vFkh@\兓]hf 8a˲Xhʠuxp؉VievӰGLÂi$9q'cXX`@0YsζWh]'STfzgXG^B#Ģ25[ppnx06ԁ#}$!EOpf8­{h9"V9t*eN4MCS#W}{1id{\qPQU#+jZZF4Q;71:1EmU5Bb)^Вplϸ]vVWX,{j]bGxQyMNWٺ #G8n]>ef;ѫDZyn2 yA;@/1~s`v/ E]@GciLA1o /8e񶓡{nvQ[Q.>wgwF48}CV/O;\`zl,ng]L~㱏%^_iO\I  P!.466z" c[[/{c~ "x+zSR%,kwd^Y ;k?o޳'~JiBjJ Y[c(ew<.oma OXEMͿynۿmZYzfh==fqIAap͂}1۶0'b ܋"L0chedU~yocה}+~L#cG/Ω{.4N#G s A? >D-e\hg}}ή~jԧKp#"OE 1:֐&t젤::yteӣr=s]'~[o|APF &ؽo7ԩ|LRX|7q.$c &a]66S! KEyХg*~[ϢR:ퟣ6[]Xչ L7s<XГG!ڕMʠ~V{H/-C?'6_}s9#w}?%lXe}cdft )޷囜|E`;4zE踄?'/o{84|TCF ]&+c)׏r]9vaNpy*z~Oݜ|"7V a4a0nIx0JH\pJV ˫.**djގŠ###j2" Yf#UUX_&BEa>5u 0,%*oB9FDrɲRi޺E dIˋV7%/?d9 y&z<ϭuW3ϟg= u$LDW pFq`_v*$˒b œIVv:%$#1Y]_y8Zp]1-Ņw*),Št(,*&"4[`8/#eVjSܟw_߫t HO(N'6fnnr&I(_9յurss /Kuz3J3Jtt0=zRx&I^(-i5)לEReY$qBtVv-^K8 j!VӅ C#‘522<9 b tz=p_(ՒAL pQaxN$*\ wJ0_} r $ߏ53ׅJo]@Xni$Abb-\W)P0NמA5`1W7J:FW6:IE~ȯ7/_K^k03ZZSIione#K.ZOf9WrkPk6~m9(IHaɼzȲeЧf+ވus8j7ȼjsvwGs6iaڷJn,+TҩRuSB,R RIA RR0)HA RR0)HA >` &17 }ߔF r{'& o/ D5ؗo^8gzf#Մ{}]a(uk81ccrf~y Ֆ,;V7vz_Ogaq 7fgf쑛tϺ)DKxF!+U]]###+ePPPP/_eGgΑCwQSǽB? σerd`{y;#}(5&'3]TqfH*Ux= 242ʊG% mm/123wP*YkNb7]i4I?nKouY Ĵdh?|$:J(EKZ/Hp ts3sDcQ0ᐟ'sY%QzxIKiXclaBI ýs ?{ ^'x1,fTy6:Z/> w㋋'x[:X*x; K'pSZUKVT9Evu\ %*Ta:%[hG0K,.Q)L> 32AQnfYZ]$jUE6N,Gҳa{MR[QLq ƃ]̏C efU-GG>Jxni ',o + Mx5DUc>:kYEz2X/NPQIVrjhy)9G34BS۰SGta).9w7 o+ |C0F &ǨR?xz }P(4d]0Fe١q0SL Brw SV^x-h)S PǺu'@= ybp6N$]믆iV.+];1V ǂॹQ V1낏z=~ xC,ztBI*/.p4>zKxAVVikoaJ{y6y+穪.ǜW- h< N,~M< ODQFaZۅr^ + 7qWV TXp5F'&>ͧ#"ڲ(.+!/,~^sb>[M͔f[vMeM=f JaMW1Xٷg7Y$[gljj(-,q ;ܲj:5 aͲP[-sp](Zmg~ʪi( G@dvϮ&r {}wQQXHS6=VV(l2.!qTYi,l./= ww;K* +jع"9&!O$3H$'=H$|$H~~9۷Jx? "**,JUKcm 5 KHȦBˎ],.HT=.! m|o{bUW}ēCC@0ΞH^F+AkH\+^G*2/mX7~~|wA7yC?{uwラev./ BeK~ɏvN$Nf:M:vOtZfδӴɌǞNj;=?  ׾}~.Bfbs9;H]Wc|$yta7ud[-,L_PHi@iqb)Ixw>KGϻ<彛+?~"`(>?pvXfն |fNs'N"IXrlBBwZ'7;5c"an:%ǚau a9Yٞ#?x~QC[ 9:wl3( 7%sS%#Bd >'󣆣e"J8MiaHHH܂Ĝ>:r#!=8r%d%"RC^Vxie ?"!ըY||yP.gzO{)F{095?|Ќ*>btdBF> Z=Qt:ƲS{&<~"?&l 9hDMFXz*D2gN_xk2v'ccaŋMeY1y'[~ǎn7EBnƃ8Jj7HX[\FRI?NG?>Ư\ADtu [1rs!\#;{=^R*Ad$r0 mW+Kyq/p.GCHo\ % ɚm=؁Ylz @܊?{:)l_7f5/"BI8 c7;މ9ښaB%b?oK b'.g: o&_A1 X?Z8惯lwhlG17-v#_*{y+CuV>gnp/~kSW'Ptv]L/1ۂ7?+x_G^i{M024M ^(E8WLOEqmLLzQRXB:q{CM@$0;ߗu"K.pO^l+A16Tޏ v7C4PQضzO}{(qŐg[!*\n?b>SƉPu#$|*HvGP΅hrbL`jިlՋ&3CVk|#V#L͢ g"z6Wc-{a+!h###pʑm@-͖>W/ rI)Tphg`FWQ 5u'hG,=SfT4z wCoȆH%W'P1Ev@oCEy B^"DRUgfM-$'Gi GD4jw}6>-ͤ0X4`F0xul b3Ӹzmӳ6l枛իl9><C U.nƖ 7Qn9 /y@zfQ`c꣡ٻr [ҬYTVf8f~hLxhw-g1eɓY0PHϰ(3#F_HX +PӰ Hѣ #b(vn o c0$vCE,EQ©3-E1Ek6 ǡ1b;%yF5Vs _Y텑XӉ;"VDiw~b[;Ɇҳj?6624$sr0C۠hA 3k|0mD]BhM;k ]MD{1ꋢ]Qe 2Sn14)MsG{jjCs %j$w`!JΠ5yYj?2kl&͟C`WG*8C!) ݎȬnjývCǞwc;ށAl߁q|b:&"N ;[ ޞp&_—wg5._<%v3|aNqETOz? Na?hPAuLSS@IY)3Y&.#0tu _x|.9|Cص hƷ{,v4݋^L&#\nWbW^n d2禩"H/_}/XhsmU)lF4vjH<$N*` f #%0co=j^21r1盆%tf6Rd4h4jv݇w}Kv#Ӄ̲`4LNN9D<&X1k6*X=2LHen^&UĩĞjȺnυwlĬn210-1<+gxL|y+ݢ=0@)߭cAAc6b]q,!z׆`q ˨#}:Y]NgQ)ZNI9d\7\8ofΔ lT0s8ir؝ʨSK! }?0.6C^E=,Woǟ}G`'{_yfZE!n#CAQ@3aE=r=xCا3ʾAԔ*YQD4RЈ$;nPVprrxV!ȗ7ua –$r^RD`֖nGg<[*="w( QD`QD`QDE>U}0l'QDEYK"ΝHSQDEQ9fv\NSFE0UWI"("`fd`ع l.QTgK=5oeΥR)3fj~0C4 ^/&''H$pTff!+f5}S6fgg%%%0Ll&a%Õ+Cx<<455]gb0>g.KVi,,8KѤԬ\мLVخT.F.\KݨA,S:YEn0y={KOSw^~r"̑ "O~uxJ@oYX$3)aVK8HJ`0:0ΝJ0.as%j6/YE0}e+Fj3v-u:DR\@9oUa2.p8yR*p$?ѝprQA-J s3@BCC="Qʣv[[ h4. 82pa]\>Y\3Tw7ȰYTTQήqh5L2V&$0dEI-Qd c.&3pٔ"v!pArvWdsUnsB%CZj ihB䨈"edc0r N~M(e񄨀"(FNiڄhLX8ÌEg)Yn"% fLR) Qnu<@-u+C_JTb2L%' 3̪>qF-,, h8!W% `^倳*%PR@[ﰢG{w YMVxtϗ(g kue/-s522S҃%y79uCkVthv^4 d2@H *&Z"H ٜbc/+1QX~~dL@Pa߱ lC@_188wytX\hR$f[|D Xffkkc w1h^`CwHOY F;Tellf@LOOѣx`۹]i~mp6:"ĢqXs|yr8EgtZsPm7\V[0I+}-ٮ2Tz Ξ<:<:- 5|craua& wJrY^444\Y21({xhxx| K;ya477O>$rs Jsh 1} s }J9lqh8=>Kҋ'Otx!W}AuY1<>|JL_rR /< (//JJȞUeI&$ԨdpNNVohuä!y:'6D} Tf!X©@dIݿ?^xTVVk?F)zzQX݇ͧUl,s܉D jE>5/Hg_@OfS,SS_JAgdS.b6YqɈ}5"1jASsѸ\Ŋws Lt@lصX0t2{ <@^ZuuM@F*0SH`1i`JKʤYʾcO.®{6?D\ٞWgcl/Ĩx:A*"=‚XLKRÞ6@J)!K,t=1,Wb 궂y$7ih#I5\3jgȸڳ$뭒0,0@~BB)7[UͼvM1|i1 x*Rå˹Inb?)D +~dxx̲A466l4t{+uNg7SGъi lߵN#H)OvbVytwH9yc)Ni$goĝ(䖽޸5& Hb¦4[?1./bp*h1[G+U2הQfQtRJ Bdjn-5 ݻbK2 A>e o E NLrƅ~đ;nӳhd8yT::ih' a3EU)͠;+s`ܬQȅπ=hT3K=Nj]TrXԊz'Lq.LK2,Lf/aUZg x+`V,2qXF&]w,Lrat]t:},9 r0(r{te38f+2hK(+"ad:y6 ("l,N/|пLV/ҭf{ʉr5{T 9 ^\}JۮVtuE"M{ɍMr[W ~Xؓ*[!e"-Lk/   lܳLb|+v[3ۚI7<7%}D3nH3i̸tZ u{3!HRhtFalr:==ozZm-'K" +gQ+LЕtL.tO o>XV*'&(ݒsB#0a Mcs/է0CZz TFkkkHUU0dd#o=wAB%sR1I{yQ "=_jm9&7];<95r̠PyVJ&P &AFƪ԰tu3}zbnx6a|c 0Q;CEIENDB`DisplayCAL-3.1.0.0/theme/icon-reflection.png0000644000076500000000000004167612647526540020413 0ustar devwheel00000000000000PNG  IHDRj6]xtEXtSoftwareAdobe ImageReadyqe<C`IDATx}i%Iv։̻^o=ӳ6le%kXؒ$,# 1HH`ؖ1c 3Wo53'"NDU_w͛73oK(DOW79Ng]g?AŵɬI@V.㓆&kQދgM1O׏zX+?s eFAI=}Uu8*<5}@R;n6'`2(]ӍJO0E{y_31p^lz{^7^o):nK8t \pN׻k3Q*8,hUv>xlI`-T N>оzEp O2c"g}^94ڽ!!fpzO o.w0QJQQIgB\jgGOt^(Ia@ՒĀF⯌"$"$ࡠ.TQ$to~ߩ$zLI:>Z>7܁ENЁtgY'ֵ$ lVps@o_WsiG:*Ph A1>MN bw 0=9𡿉n) T1%0~ n._kn_|Q`>'(@R% !/}@m9^ ])NZ0ɟΎAJ r@2kŒ19=C˼1jynm[ lf=n[R E@ {3^ݳ`ksS;{tI1OUItJ{NGvfZA|Gi#  TQrxz T@S3Y`jR<:.,<(a`Wb_2m],@Rjxs[iҾj?F_(p E* a2TŀhhL*=e{**V$Ť`rIeT0OE༖ѲiU*jxv+_ݬ-8<>GP(+3dM@4Qbx"eYoh{7()>TZ gm큊$׷|- j kK͞RO8,e2g`-}NӯCA $l%5p4 _a7٠~XY8|d$4T,QTx%vHA%GIzcR`"R~R5-XgE@%QTrKA+=;7̱'JIn&sbkVDQJ&B"gSp0${_=2e`5:PT4Ͱ3T1 Jc*YbR=%Dm3w["(ձG/_A2j/$ˢg DFfe߀r{BF3r{ׁLJy޺W-t ,,C x|Y_ ڲf},P ۷-Zۼ=]XWSS-/Ym= _zuA!I`V.}4h-G~FNb8q Is~As-j_llo TRͨVCTV,p*rafʚrUIT*R #L4˖z'Pq{Q̜hgRpY7#xKp wn ӕE13VQY㥅3< TpOM ynsxܮ qCXu@$)V"}W7n2)b's? +_oF٣XJ#s( ~}q(`h?dJ׽uX' WdE xN,5I*)1Waoӊ8ZONp@ JܠK]̠=+Yi:ZJmx25LA4Dz)Q^6 *œE4Ӭ@HXw^\% a;570O :MvdQ(Oi&*$9*M:\yx@NRa>H,!ϱMhC9Nf\+|C>; |r^`x`HG{PECzfD5'8ݜS 4"ݧLe*'3N_k.mОRFw;pop~DTPT(ևpNvP(:#w]wu/=5ʅi#)n fwD7Z_;`}AW(||8CkZ^o;&r]4$z/A;r#uRl01G@h6iόJ 6Q^ Q{8QU]6UEyQbHAh)DJ(jtk$|~r2 DhF8 mE$yj_їdQ[`H|A{U0,/3ތEs4 eQ'+pPn!Mh0i *-CL4>@%u\_C'`j8/.M]j#ګJǤI ^lүl'c 6e%3;fjATT8vgxRp*CLKT^LhV>b3[S\Exk;24MQ:?ЇAxQ Ҡ'&J9!$ۤz㸢=>@MP"Ѭ4\l? ӃjiDgpB H>&2[JTI^b}>pXԞS;ƬW<GUV]wx2Y:_g7Ub6gPZDpHvl"('O~i{,t`Jήz;N]-hh+hki v`Կ)ܤzU C0efL^;% ɱDd}jrϳ$IN\"9)zi=oYn:;.zLS5*QDE4+,D;k F1S2/ n^Io΃8\yl `qMD(+lWƾ &nȺ.E$창R*?We>(m_9Z<0%Y)s1w -gb8i8}[`:$Ȭt^9=bUI\Q\gM[guJJd#Ӊ2a=ކe3{ )%PK$~iUPzy~ɐbOְf~X6nC!8,JJV5GQ};D=[d5fkͫ{e! 'yzd9m~iỴ=C2E z.W`&n qڷ<۳rjxcW; >:wN3͗A2"9{~p'9ǎݑ`KRv mLd|w1tgjvm5HA Ut9X]b\UsE=rU$j̿Pĭ HAPS=g 6>ۤ,YFV"J 8{01|j)_N2rQLi wz jNæ',oȀ7i䏒3a.j@-:sP*P-uWU`)A:=ng4\bh˴+I}c6&zRNi%prEgG3S[P\uiҹ2Q)!Wۍ˾6(Np{5ty̡CF^ T)JeY~t:si@o=9bQ洯\ߤ?s, 2q8z4. Pn\rsӕOXr>)"Ĝ(l8 C[ziˬtSi䡋UzJC/V:YySy W&O@/#6_ӱ߅ꉣ$"dА6xkk(CBΦEk`\Ca$<4ƹ P''#8r<@S)lIF-k yV9p24ĜuB7@3(A`vPt"a`ﴀԊvP:vRL[s쎴%x^)Q>ބ+;EAtvNa~pl` MkS=M @Yno씋UBCAKG\Rݶ{8Gp &2)އG k #ֲ-r  XU2 ua(HkElQRxiwHIu] `(Hjz`J>leC7 yV}wdғ09v{!\~I]…Fgpxfgc DA`SCFE2*P+DZTE1JZRJJU\,I<^@=sd`$({yUPawncm۰sRJ(#OGؙU,Xjj|].A IYn:( P+ɸS١v+MIK4 2PmDt;d$jzbSp0?J-2c ߸o^ucu6ɣ-Pct>8`A`5ǃ7 MhbKM GjR)FRYJr', ua^[hfs%}&\Ї%HǤOBFd_ww`A6Z-zp+P0sv w`t2vC5>ֲ:a2Q+2x**`Q^y:V2?ʕ~6u "Uٲ,es钓*ik7XP1nT{6#0; ;t)0x U@MSivs$ 6v pc89Z~9#\?O + ^9[ _ S\,y& gT+<۫lC3 r«n).ʠ1u mcU~Hj>"p'ƻF0;T}&q9|ln4YsB8 a~HqP^be(\%٪%dϴP"l_ʚfpLT(* X*h=m\wXwrWp~c A >mʝW̵< +Q}93Bm/`b%WAxd8m$Tm\wtv+"k 2mb] @Q(%#R _&EV³0^CWX ~F1`ze yUeۑZp5#thu<<ǰw8w8u b_ DAO1UB[:ǁ )Yd 8T&m붏KQ0! ?F]܂N5ے>X}kldmņ+T m}ʓLW$'b#0EU[R) $F4F[;%HRַ$pEWic,8nooo=p @gf~2l}dԥ]NfmVY@ztVі0p:7Fd  ahӔODQh` I(%3Gur(Ȝ@U =XI^#%bQ6u޾ORek)jONE}Yn ~Okt6?CGgr? F69H-psǀcLHp Sr$O >-R|I\IQZ /i.SrRNS Vx )D;5z&v<5n]8 5x&BIx-ma.C5X K{$4k3yg=PۻG'#7\-$mEelw& TXY_ǔj]C:Ѷ厞b}r ~ w ؝ -nQ/n`6FvÜnsHT0ׅurl?&['$Xr%\ E!4ncjzJ6ԥPE-Km1۰ MbKk$?z}߾SqAe"D6oΦ~{Ұ.;,+SV 9( 1W*gcbM+i"N V4)8ѱF˭ FG4 6j%eɂ{j&IQT%:}lVpgeko6 QYp|O+4r4j#' Om;{"$ I%PÈ@Ѧv\=7i H;q%~թ ?5v.P# &ޤjb:`U(HuX(-}NXszvh;-Տߊsn2xRy )0رmv=RÉ L:V13)(&I<9DqSyBXfPv<mn+]k/ROl PX+%KyLF ,hv-ǣY1:T ,r PLcJv]&*\Zݙxtq͊D3 ֈZ<^O6e>Fm]vƎ9 Euc4O88|h 6Sfǰdp UE]'rϛʭ@rE^隵TʀV99Z9Ig$H!7N_S}s0I73+24B4̆FA]I74%+d[P&0FbBHg\jl/Gv`uF vS6S֚>ie>zKf†H*t jZȧJ?r?&mvw y5Ʃ>٦aS˭b)|\}*✉%\jmI V->`CbS9ռo}CֈʅJ{tZ( J}qyS1$Ȟ4YD@Zт"&)>}p"\XNQ͊=vwڲ 5͹z`+!٦*^ke;1 n$&\Tœ pejƥRSVAl}Kq5-^.Є0H(yDԔM*3a=vWo:.dRn6aBר2\n6,2m i6:'.6e'r86xE8!f2ԋ򕛋jXq4}$w<8ΎSl!eu $HST@#bYh9YͲ)ea+l"8j ޣc=dYI[g3싉)h𶡣w|gF&=Q2BV}Tu)(xGLH6vuCbuw`o-R%2j[%(sMwI;"ްrIAzƂ k66j[ A%jO\P-gDQVhh-8 `!rѱu]/iwwFk%ΡV-8u&Ӫ9"<ء'}=0V}CۏovԬwk̚w 'pN}rQ˷._`H.G}I^SS$qO?ԔI^Wu ڨuX!iM  )05D1m;$lKd(@uVo,F!#9]? Tx]JZJA=MnC"$!S,ʳ=!d; )e*t0,JRTdc-Es#v?[G3魇 G'䕤n"A=v$.igՒk)`'E>< 1%p%VX:~:+w=լ.8J:PPTrsJT^Bcc'z@]KyVuv׵Zhg6p0+SB8љM'JPBJsELtӭ\3E\ Zl rmKÕ߱|uFy|- tm^㷂gxUkJ*P`vC%DNz\8VaxԔ7ܽ?t׼EuتlKrBY\kE;֧wE\Ԕ \a6;[v8i6Ec X~_pBSG!,P(n1:0%8ajiƬl`سA9i@¯#`N@5\RJτ*v&}Aq-n<4S8 *n!m;2.Bfz=5Y4WݶT*l2cemБiײ ; -v Lc-yzR,+lpV 16m 9}ŝs}ho@XHU?:K*!FƸ98U;9.Eщ!O *?=SgypHW F¸4jXrS zh;:xPJhCz>0YK^|9k}V䘆6!-/5mJE<}sվ*F!;Uk١\Y5t~IIVld6sl wO7R\r\6Z3RB s Ts\swz&EHhD< Mlq+]z2qlmS'4Drb6[8a;koiv,dZZj|򐵇Y?D̚u@ЯQ.R EyPR( ,JF0%y4C|c85TVediy>"7Aa  ]ZƠe:R+\Q́.Jo*= T)dϰoɩ&L,9Ǎ/hB`}Agyؑzfةn6窭-uju ¶Z1xK5 w* FGE",X1` ’=EtZp=Y--/R)Vمk?6MSFQ(y ,`rv 1p=UǖFTh8֔;dMۢtU|Էb%Vm=Q3D~` G=e IgmDW"|/e=׮z բdx;,MbˏM8);Y5mHB=L,QX^'gK0_Ŏ #Tཨ9y!>yӰw17n㶅{_O!592'B &%q\YZd0]JX6"t\WX˓?z`2#p#~E$蓇tծ"moILl8( R M'\r譧(0Xc倫ݾMB;oDE%NXn2֖0I bgaDk-:' v3=va6"S͹&:0.L-b)czi9g!  dIY`R-jCfΌ 8rIYS/w:68CXC_''ٲJT flt3U'&Nv׷|QH l뚗b2Yt-@g2ux33NFd1(e$ BLZxD/Gۏf21w:DaL|ijw 0; Xʻ)ex44S6Fawvesfg2Ґ{*`E6G=E!𨺰fIdD֏WUY|I?3?W4$30KSYݦ>N)KE9ISY RaN]{L6ay=y%Yi u'T8.ٚΈ>M>b}E|1߬WP~ e/*F_b6e;X",Fbs*L>l(h}u=Hpqua)P L>Wb4l+zZ6?K|)1[dV/7x> MJ3sp$&n.{_ ,(X?]@݁>˙]щ+px~ CK嗃)47YY<:0loXV"'Nh_'~W{l3osއ?K?ë-.eؾ)61~SVnmg#0AEGT!1]J_٢݁ǯ(8s ;di+ MǼTXҾJ.xېʖ9sw z,T.-؋kVJ5?svm Fx֥e֗aiLñAJ,`x_8@ ,9k׉]  v q"NR*[ WllCەdCԐ}:~)gWpNEg KFɿSnql/ Y-@ਕ[؂S&܌ F&P[0P(QJZdv!4J\49 r ˻ CP q1e(Օ٬4t;NY k0\Vwc;מ!nҠ.rD暩R@1d fcWxў洽ҫnm%ֳWsSm9),XX%=,'۾>47.}S}ـv2yH8HzJ֡wnV,!q *"P) )ݹk6H몹` CpRV>W:* D]&tbѫo)OVa/ɛ&'˫&+q* Jt)^TǬcjyiײ*<~% KVԗ ӥmK6@"W *j)H1+ AS\7$v>$^Qܞ!4p4tNȊb^]2ta"EX2?k2Qe@bshz0g e<@,0PUϭQ8E4\UT9Ѹ繹U $AoʤS!e۔N0퇙.$^bq+0lHF%q)&kT0js#V Z`ӇEҞ]$WR D P/)YdU!6jp_ҁ_UQd^ zP,FZH,ҫSm2lU폅i(1}.m* uBA1UX) )HB;úU-_TS^0â.gŦcf\L'WdJv̭bq:\]@I;)(JY[mş'=ϟd{UHeeeӖ\ZR޴%{ؤYk Gŋ>wm]6AٵNSvrkL)NrU )ʎ 2ʆxzaRU/R@дpB(h6t1N츉U,~ 2e0ղ/Zx@QJjRQt^WzUNΩIm!'fmjGr!%]$nPފr,4+H vZ I'E.: Iy.%m30eȣ(YnPP]9wJ Y!*V\e꠨uRA#`'/C԰1 01>IENDB`DisplayCAL-3.1.0.0/theme/icons/0000755000076500000000000000000012653527012015712 5ustar devwheel00000000000000DisplayCAL-3.1.0.0/theme/icons/favicon.ico0000644000076500000000000001246612647526540020054 0ustar devwheel00000000000000  & h( @ 3V3ԟ85=IVco{pZRKC@533m3j8f3f3f3f3j8f3ԝf3V5U56<@LXes~^VNFB7444u9g4g4g4g4k9g4g4g4U8Ԝ9;HQ^kwg[RJE:555:p5h5h5h5l:h5h5h5ԟADM[fsكdZQLB<;;@;o;m;m;p@m;m;m;CM\mzߖi_TNB:88=8y7j8j8n=k7k8k8Qbrtg\TG>:9>99l9l9p>l9l9l9fxܢre[MB=;?;:q:m;q?n;n;n;|Ӡ~ocTH@>A<5/p̽ΰvɘvɘ|ɘ˚ɘɘɗɘʚɘɘɘɘʚɘɗyɘtɘp˛t˚}̸̞ޛ1*${Xƿɖnɖqɖu˙}ɖ}ɖɖɖ˙ɖɖɖɖ{˙{ɖsɖoɖlɖiʙlʗo˚Ü˹q%~yuA|ʗjUʗlʗn˚uʗtʗvʗxʗy̚|ʗxʗwʗuʗr˚sʗmʗkʗiʗg˚jʘi˙u͝ȪʻYvrqU˘iT˘j̛o˘m˘n˘o˘p̛s˘o˘o˘n˘l̛n˘i˘h˘g˘f̛j˘f̙m͛}ʝ̬ȾB}qT(  tE~El9b1d3e3i6h5g4i6g3i6h5g4i6g4q\|˭[מYLo;g8g7j8m;k8m:l9k9m;k8jAf[fjܫYGs98|I{@yheNhyNvHҢJC=950~K~EvyDsxDWYpGKA4.,OPTH`=DczO~QȕH3$TVK\YK74upTVV֡>VXOȃId81'ZrXąXY\^Ï[cz͈So(+?uä[đ^Œ`Œ_ǑUǑYΌ]lq#{{(tdǔaȖcȕb˕ZϕYɒaOuzvurʗe˙g˘f̘cǘoŗqѕag5turp˘et̙g̙f̙eЛ_y|Ϛ]֔fiq p n}AAAAAAAAAAAAAAAADisplayCAL-3.1.0.0/theme/jquery.js0000644000076500000000000075572112647526540016505 0ustar devwheel00000000000000/*! * jQuery JavaScript Library v1.7.2 * http://jquery.com/ * * Copyright 2011, John Resig * Dual licensed under the MIT or GPL Version 2 licenses. * http://jquery.org/license * * Includes Sizzle.js * http://sizzlejs.com/ * Copyright 2011, The Dojo Foundation * Released under the MIT, BSD, and GPL Licenses. * * Date: Wed Mar 21 12:46:34 2012 -0700 */ (function( window, undefined ) { // Use the correct document accordingly with window argument (sandbox) var document = window.document, navigator = window.navigator, location = window.location; var jQuery = (function() { // Define a local copy of jQuery var jQuery = function( selector, context ) { // The jQuery object is actually just the init constructor 'enhanced' return new jQuery.fn.init( selector, context, rootjQuery ); }, // Map over jQuery in case of overwrite _jQuery = window.jQuery, // Map over the $ in case of overwrite _$ = window.$, // A central reference to the root jQuery(document) rootjQuery, // A simple way to check for HTML strings or ID strings // Prioritize #id over to avoid XSS via location.hash (#9521) quickExpr = /^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/, // Check if a string has a non-whitespace character in it rnotwhite = /\S/, // Used for trimming whitespace trimLeft = /^\s+/, trimRight = /\s+$/, // Match a standalone tag rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/, // JSON RegExp rvalidchars = /^[\],:{}\s]*$/, rvalidescape = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, rvalidtokens = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g, // Useragent RegExp rwebkit = /(webkit)[ \/]([\w.]+)/, ropera = /(opera)(?:.*version)?[ \/]([\w.]+)/, rmsie = /(msie) ([\w.]+)/, rmozilla = /(mozilla)(?:.*? rv:([\w.]+))?/, // Matches dashed string for camelizing rdashAlpha = /-([a-z]|[0-9])/ig, rmsPrefix = /^-ms-/, // Used by jQuery.camelCase as callback to replace() fcamelCase = function( all, letter ) { return ( letter + "" ).toUpperCase(); }, // Keep a UserAgent string for use with jQuery.browser userAgent = navigator.userAgent, // For matching the engine and version of the browser browserMatch, // The deferred used on DOM ready readyList, // The ready event handler DOMContentLoaded, // Save a reference to some core methods toString = Object.prototype.toString, hasOwn = Object.prototype.hasOwnProperty, push = Array.prototype.push, slice = Array.prototype.slice, trim = String.prototype.trim, indexOf = Array.prototype.indexOf, // [[Class]] -> type pairs class2type = {}; jQuery.fn = jQuery.prototype = { constructor: jQuery, init: function( selector, context, rootjQuery ) { var match, elem, ret, doc; // Handle $(""), $(null), or $(undefined) if ( !selector ) { return this; } // Handle $(DOMElement) if ( selector.nodeType ) { this.context = this[0] = selector; this.length = 1; return this; } // The body element only exists once, optimize finding it if ( selector === "body" && !context && document.body ) { this.context = document; this[0] = document.body; this.selector = selector; this.length = 1; return this; } // Handle HTML strings if ( typeof selector === "string" ) { // Are we dealing with HTML string or an ID? if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) { // Assume that strings that start and end with <> are HTML and skip the regex check match = [ null, selector, null ]; } else { match = quickExpr.exec( selector ); } // Verify a match, and that no context was specified for #id if ( match && (match[1] || !context) ) { // HANDLE: $(html) -> $(array) if ( match[1] ) { context = context instanceof jQuery ? context[0] : context; doc = ( context ? context.ownerDocument || context : document ); // If a single string is passed in and it's a single tag // just do a createElement and skip the rest ret = rsingleTag.exec( selector ); if ( ret ) { if ( jQuery.isPlainObject( context ) ) { selector = [ document.createElement( ret[1] ) ]; jQuery.fn.attr.call( selector, context, true ); } else { selector = [ doc.createElement( ret[1] ) ]; } } else { ret = jQuery.buildFragment( [ match[1] ], [ doc ] ); selector = ( ret.cacheable ? jQuery.clone(ret.fragment) : ret.fragment ).childNodes; } return jQuery.merge( this, selector ); // HANDLE: $("#id") } else { elem = document.getElementById( match[2] ); // Check parentNode to catch when Blackberry 4.6 returns // nodes that are no longer in the document #6963 if ( elem && elem.parentNode ) { // Handle the case where IE and Opera return items // by name instead of ID if ( elem.id !== match[2] ) { return rootjQuery.find( selector ); } // Otherwise, we inject the element directly into the jQuery object this.length = 1; this[0] = elem; } this.context = document; this.selector = selector; return this; } // HANDLE: $(expr, $(...)) } else if ( !context || context.jquery ) { return ( context || rootjQuery ).find( selector ); // HANDLE: $(expr, context) // (which is just equivalent to: $(context).find(expr) } else { return this.constructor( context ).find( selector ); } // HANDLE: $(function) // Shortcut for document ready } else if ( jQuery.isFunction( selector ) ) { return rootjQuery.ready( selector ); } if ( selector.selector !== undefined ) { this.selector = selector.selector; this.context = selector.context; } return jQuery.makeArray( selector, this ); }, // Start with an empty selector selector: "", // The current version of jQuery being used jquery: "1.7.2", // The default length of a jQuery object is 0 length: 0, // The number of elements contained in the matched element set size: function() { return this.length; }, toArray: function() { return slice.call( this, 0 ); }, // Get the Nth element in the matched element set OR // Get the whole matched element set as a clean array get: function( num ) { return num == null ? // Return a 'clean' array this.toArray() : // Return just the object ( num < 0 ? this[ this.length + num ] : this[ num ] ); }, // Take an array of elements and push it onto the stack // (returning the new matched element set) pushStack: function( elems, name, selector ) { // Build a new jQuery matched element set var ret = this.constructor(); if ( jQuery.isArray( elems ) ) { push.apply( ret, elems ); } else { jQuery.merge( ret, elems ); } // Add the old object onto the stack (as a reference) ret.prevObject = this; ret.context = this.context; if ( name === "find" ) { ret.selector = this.selector + ( this.selector ? " " : "" ) + selector; } else if ( name ) { ret.selector = this.selector + "." + name + "(" + selector + ")"; } // Return the newly-formed element set return ret; }, // Execute a callback for every element in the matched set. // (You can seed the arguments with an array of args, but this is // only used internally.) each: function( callback, args ) { return jQuery.each( this, callback, args ); }, ready: function( fn ) { // Attach the listeners jQuery.bindReady(); // Add the callback readyList.add( fn ); return this; }, eq: function( i ) { i = +i; return i === -1 ? this.slice( i ) : this.slice( i, i + 1 ); }, first: function() { return this.eq( 0 ); }, last: function() { return this.eq( -1 ); }, slice: function() { return this.pushStack( slice.apply( this, arguments ), "slice", slice.call(arguments).join(",") ); }, map: function( callback ) { return this.pushStack( jQuery.map(this, function( elem, i ) { return callback.call( elem, i, elem ); })); }, end: function() { return this.prevObject || this.constructor(null); }, // For internal use only. // Behaves like an Array's method, not like a jQuery method. push: push, sort: [].sort, splice: [].splice }; // Give the init function the jQuery prototype for later instantiation jQuery.fn.init.prototype = jQuery.fn; jQuery.extend = jQuery.fn.extend = function() { var options, name, src, copy, copyIsArray, clone, target = arguments[0] || {}, i = 1, length = arguments.length, deep = false; // Handle a deep copy situation if ( typeof target === "boolean" ) { deep = target; target = arguments[1] || {}; // skip the boolean and the target i = 2; } // Handle case when target is a string or something (possible in deep copy) if ( typeof target !== "object" && !jQuery.isFunction(target) ) { target = {}; } // extend jQuery itself if only one argument is passed if ( length === i ) { target = this; --i; } for ( ; i < length; i++ ) { // Only deal with non-null/undefined values if ( (options = arguments[ i ]) != null ) { // Extend the base object for ( name in options ) { src = target[ name ]; copy = options[ name ]; // Prevent never-ending loop if ( target === copy ) { continue; } // Recurse if we're merging plain objects or arrays if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) { if ( copyIsArray ) { copyIsArray = false; clone = src && jQuery.isArray(src) ? src : []; } else { clone = src && jQuery.isPlainObject(src) ? src : {}; } // Never move original objects, clone them target[ name ] = jQuery.extend( deep, clone, copy ); // Don't bring in undefined values } else if ( copy !== undefined ) { target[ name ] = copy; } } } } // Return the modified object return target; }; jQuery.extend({ noConflict: function( deep ) { if ( window.$ === jQuery ) { window.$ = _$; } if ( deep && window.jQuery === jQuery ) { window.jQuery = _jQuery; } return jQuery; }, // Is the DOM ready to be used? Set to true once it occurs. isReady: false, // A counter to track how many items to wait for before // the ready event fires. See #6781 readyWait: 1, // Hold (or release) the ready event holdReady: function( hold ) { if ( hold ) { jQuery.readyWait++; } else { jQuery.ready( true ); } }, // Handle when the DOM is ready ready: function( wait ) { // Either a released hold or an DOMready/load event and not yet ready if ( (wait === true && !--jQuery.readyWait) || (wait !== true && !jQuery.isReady) ) { // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). if ( !document.body ) { return setTimeout( jQuery.ready, 1 ); } // Remember that the DOM is ready jQuery.isReady = true; // If a normal DOM Ready event fired, decrement, and wait if need be if ( wait !== true && --jQuery.readyWait > 0 ) { return; } // If there are functions bound, to execute readyList.fireWith( document, [ jQuery ] ); // Trigger any bound ready events if ( jQuery.fn.trigger ) { jQuery( document ).trigger( "ready" ).off( "ready" ); } } }, bindReady: function() { if ( readyList ) { return; } readyList = jQuery.Callbacks( "once memory" ); // Catch cases where $(document).ready() is called after the // browser event has already occurred. if ( document.readyState === "complete" ) { // Handle it asynchronously to allow scripts the opportunity to delay ready return setTimeout( jQuery.ready, 1 ); } // Mozilla, Opera and webkit nightlies currently support this event if ( document.addEventListener ) { // Use the handy event callback document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false ); // A fallback to window.onload, that will always work window.addEventListener( "load", jQuery.ready, false ); // If IE event model is used } else if ( document.attachEvent ) { // ensure firing before onload, // maybe late but safe also for iframes document.attachEvent( "onreadystatechange", DOMContentLoaded ); // A fallback to window.onload, that will always work window.attachEvent( "onload", jQuery.ready ); // If IE and not a frame // continually check to see if the document is ready var toplevel = false; try { toplevel = window.frameElement == null; } catch(e) {} if ( document.documentElement.doScroll && toplevel ) { doScrollCheck(); } } }, // See test/unit/core.js for details concerning isFunction. // Since version 1.3, DOM methods and functions like alert // aren't supported. They return false on IE (#2968). isFunction: function( obj ) { return jQuery.type(obj) === "function"; }, isArray: Array.isArray || function( obj ) { return jQuery.type(obj) === "array"; }, isWindow: function( obj ) { return obj != null && obj == obj.window; }, isNumeric: function( obj ) { return !isNaN( parseFloat(obj) ) && isFinite( obj ); }, type: function( obj ) { return obj == null ? String( obj ) : class2type[ toString.call(obj) ] || "object"; }, isPlainObject: function( obj ) { // Must be an Object. // Because of IE, we also have to check the presence of the constructor property. // Make sure that DOM nodes and window objects don't pass through, as well if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) { return false; } try { // Not own constructor property must be Object if ( obj.constructor && !hasOwn.call(obj, "constructor") && !hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) { return false; } } catch ( e ) { // IE8,9 Will throw exceptions on certain host objects #9897 return false; } // Own properties are enumerated firstly, so to speed up, // if last one is own, then all properties are own. var key; for ( key in obj ) {} return key === undefined || hasOwn.call( obj, key ); }, isEmptyObject: function( obj ) { for ( var name in obj ) { return false; } return true; }, error: function( msg ) { throw new Error( msg ); }, parseJSON: function( data ) { if ( typeof data !== "string" || !data ) { return null; } // Make sure leading/trailing whitespace is removed (IE can't handle it) data = jQuery.trim( data ); // Attempt to parse using the native JSON parser first if ( window.JSON && window.JSON.parse ) { return window.JSON.parse( data ); } // Make sure the incoming data is actual JSON // Logic borrowed from http://json.org/json2.js if ( rvalidchars.test( data.replace( rvalidescape, "@" ) .replace( rvalidtokens, "]" ) .replace( rvalidbraces, "")) ) { return ( new Function( "return " + data ) )(); } jQuery.error( "Invalid JSON: " + data ); }, // Cross-browser xml parsing parseXML: function( data ) { if ( typeof data !== "string" || !data ) { return null; } var xml, tmp; try { if ( window.DOMParser ) { // Standard tmp = new DOMParser(); xml = tmp.parseFromString( data , "text/xml" ); } else { // IE xml = new ActiveXObject( "Microsoft.XMLDOM" ); xml.async = "false"; xml.loadXML( data ); } } catch( e ) { xml = undefined; } if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) { jQuery.error( "Invalid XML: " + data ); } return xml; }, noop: function() {}, // Evaluates a script in a global context // Workarounds based on findings by Jim Driscoll // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context globalEval: function( data ) { if ( data && rnotwhite.test( data ) ) { // We use execScript on Internet Explorer // We use an anonymous function so that context is window // rather than jQuery in Firefox ( window.execScript || function( data ) { window[ "eval" ].call( window, data ); } )( data ); } }, // Convert dashed to camelCase; used by the css and data modules // Microsoft forgot to hump their vendor prefix (#9572) camelCase: function( string ) { return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); }, nodeName: function( elem, name ) { return elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase(); }, // args is for internal usage only each: function( object, callback, args ) { var name, i = 0, length = object.length, isObj = length === undefined || jQuery.isFunction( object ); if ( args ) { if ( isObj ) { for ( name in object ) { if ( callback.apply( object[ name ], args ) === false ) { break; } } } else { for ( ; i < length; ) { if ( callback.apply( object[ i++ ], args ) === false ) { break; } } } // A special, fast, case for the most common use of each } else { if ( isObj ) { for ( name in object ) { if ( callback.call( object[ name ], name, object[ name ] ) === false ) { break; } } } else { for ( ; i < length; ) { if ( callback.call( object[ i ], i, object[ i++ ] ) === false ) { break; } } } } return object; }, // Use native String.trim function wherever possible trim: trim ? function( text ) { return text == null ? "" : trim.call( text ); } : // Otherwise use our own trimming functionality function( text ) { return text == null ? "" : text.toString().replace( trimLeft, "" ).replace( trimRight, "" ); }, // results is for internal usage only makeArray: function( array, results ) { var ret = results || []; if ( array != null ) { // The window, strings (and functions) also have 'length' // Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930 var type = jQuery.type( array ); if ( array.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow( array ) ) { push.call( ret, array ); } else { jQuery.merge( ret, array ); } } return ret; }, inArray: function( elem, array, i ) { var len; if ( array ) { if ( indexOf ) { return indexOf.call( array, elem, i ); } len = array.length; i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0; for ( ; i < len; i++ ) { // Skip accessing in sparse arrays if ( i in array && array[ i ] === elem ) { return i; } } } return -1; }, merge: function( first, second ) { var i = first.length, j = 0; if ( typeof second.length === "number" ) { for ( var l = second.length; j < l; j++ ) { first[ i++ ] = second[ j ]; } } else { while ( second[j] !== undefined ) { first[ i++ ] = second[ j++ ]; } } first.length = i; return first; }, grep: function( elems, callback, inv ) { var ret = [], retVal; inv = !!inv; // Go through the array, only saving the items // that pass the validator function for ( var i = 0, length = elems.length; i < length; i++ ) { retVal = !!callback( elems[ i ], i ); if ( inv !== retVal ) { ret.push( elems[ i ] ); } } return ret; }, // arg is for internal usage only map: function( elems, callback, arg ) { var value, key, ret = [], i = 0, length = elems.length, // jquery objects are treated as arrays isArray = elems instanceof jQuery || length !== undefined && typeof length === "number" && ( ( length > 0 && elems[ 0 ] && elems[ length -1 ] ) || length === 0 || jQuery.isArray( elems ) ) ; // Go through the array, translating each of the items to their if ( isArray ) { for ( ; i < length; i++ ) { value = callback( elems[ i ], i, arg ); if ( value != null ) { ret[ ret.length ] = value; } } // Go through every key on the object, } else { for ( key in elems ) { value = callback( elems[ key ], key, arg ); if ( value != null ) { ret[ ret.length ] = value; } } } // Flatten any nested arrays return ret.concat.apply( [], ret ); }, // A global GUID counter for objects guid: 1, // Bind a function to a context, optionally partially applying any // arguments. proxy: function( fn, context ) { if ( typeof context === "string" ) { var tmp = fn[ context ]; context = fn; fn = tmp; } // Quick check to determine if target is callable, in the spec // this throws a TypeError, but we will just return undefined. if ( !jQuery.isFunction( fn ) ) { return undefined; } // Simulated bind var args = slice.call( arguments, 2 ), proxy = function() { return fn.apply( context, args.concat( slice.call( arguments ) ) ); }; // Set the guid of unique handler to the same of original handler, so it can be removed proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++; return proxy; }, // Mutifunctional method to get and set values to a collection // The value/s can optionally be executed if it's a function access: function( elems, fn, key, value, chainable, emptyGet, pass ) { var exec, bulk = key == null, i = 0, length = elems.length; // Sets many values if ( key && typeof key === "object" ) { for ( i in key ) { jQuery.access( elems, fn, i, key[i], 1, emptyGet, value ); } chainable = 1; // Sets one value } else if ( value !== undefined ) { // Optionally, function values get executed if exec is true exec = pass === undefined && jQuery.isFunction( value ); if ( bulk ) { // Bulk operations only iterate when executing function values if ( exec ) { exec = fn; fn = function( elem, key, value ) { return exec.call( jQuery( elem ), value ); }; // Otherwise they run against the entire set } else { fn.call( elems, value ); fn = null; } } if ( fn ) { for (; i < length; i++ ) { fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass ); } } chainable = 1; } return chainable ? elems : // Gets bulk ? fn.call( elems ) : length ? fn( elems[0], key ) : emptyGet; }, now: function() { return ( new Date() ).getTime(); }, // Use of jQuery.browser is frowned upon. // More details: http://docs.jquery.com/Utilities/jQuery.browser uaMatch: function( ua ) { ua = ua.toLowerCase(); var match = rwebkit.exec( ua ) || ropera.exec( ua ) || rmsie.exec( ua ) || ua.indexOf("compatible") < 0 && rmozilla.exec( ua ) || []; return { browser: match[1] || "", version: match[2] || "0" }; }, sub: function() { function jQuerySub( selector, context ) { return new jQuerySub.fn.init( selector, context ); } jQuery.extend( true, jQuerySub, this ); jQuerySub.superclass = this; jQuerySub.fn = jQuerySub.prototype = this(); jQuerySub.fn.constructor = jQuerySub; jQuerySub.sub = this.sub; jQuerySub.fn.init = function init( selector, context ) { if ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) { context = jQuerySub( context ); } return jQuery.fn.init.call( this, selector, context, rootjQuerySub ); }; jQuerySub.fn.init.prototype = jQuerySub.fn; var rootjQuerySub = jQuerySub(document); return jQuerySub; }, browser: {} }); // Populate the class2type map jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) { class2type[ "[object " + name + "]" ] = name.toLowerCase(); }); browserMatch = jQuery.uaMatch( userAgent ); if ( browserMatch.browser ) { jQuery.browser[ browserMatch.browser ] = true; jQuery.browser.version = browserMatch.version; } // Deprecated, use jQuery.browser.webkit instead if ( jQuery.browser.webkit ) { jQuery.browser.safari = true; } // IE doesn't match non-breaking spaces with \s if ( rnotwhite.test( "\xA0" ) ) { trimLeft = /^[\s\xA0]+/; trimRight = /[\s\xA0]+$/; } // All jQuery objects should point back to these rootjQuery = jQuery(document); // Cleanup functions for the document ready method if ( document.addEventListener ) { DOMContentLoaded = function() { document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false ); jQuery.ready(); }; } else if ( document.attachEvent ) { DOMContentLoaded = function() { // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). if ( document.readyState === "complete" ) { document.detachEvent( "onreadystatechange", DOMContentLoaded ); jQuery.ready(); } }; } // The DOM ready check for Internet Explorer function doScrollCheck() { if ( jQuery.isReady ) { return; } try { // If IE is used, use the trick by Diego Perini // http://javascript.nwbox.com/IEContentLoaded/ document.documentElement.doScroll("left"); } catch(e) { setTimeout( doScrollCheck, 1 ); return; } // and execute any waiting functions jQuery.ready(); } return jQuery; })(); // String to Object flags format cache var flagsCache = {}; // Convert String-formatted flags into Object-formatted ones and store in cache function createFlags( flags ) { var object = flagsCache[ flags ] = {}, i, length; flags = flags.split( /\s+/ ); for ( i = 0, length = flags.length; i < length; i++ ) { object[ flags[i] ] = true; } return object; } /* * Create a callback list using the following parameters: * * flags: an optional list of space-separated flags that will change how * the callback list behaves * * By default a callback list will act like an event callback list and can be * "fired" multiple times. * * Possible flags: * * once: will ensure the callback list can only be fired once (like a Deferred) * * memory: will keep track of previous values and will call any callback added * after the list has been fired right away with the latest "memorized" * values (like a Deferred) * * unique: will ensure a callback can only be added once (no duplicate in the list) * * stopOnFalse: interrupt callings when a callback returns false * */ jQuery.Callbacks = function( flags ) { // Convert flags from String-formatted to Object-formatted // (we check in cache first) flags = flags ? ( flagsCache[ flags ] || createFlags( flags ) ) : {}; var // Actual callback list list = [], // Stack of fire calls for repeatable lists stack = [], // Last fire value (for non-forgettable lists) memory, // Flag to know if list was already fired fired, // Flag to know if list is currently firing firing, // First callback to fire (used internally by add and fireWith) firingStart, // End of the loop when firing firingLength, // Index of currently firing callback (modified by remove if needed) firingIndex, // Add one or several callbacks to the list add = function( args ) { var i, length, elem, type, actual; for ( i = 0, length = args.length; i < length; i++ ) { elem = args[ i ]; type = jQuery.type( elem ); if ( type === "array" ) { // Inspect recursively add( elem ); } else if ( type === "function" ) { // Add if not in unique mode and callback is not in if ( !flags.unique || !self.has( elem ) ) { list.push( elem ); } } } }, // Fire callbacks fire = function( context, args ) { args = args || []; memory = !flags.memory || [ context, args ]; fired = true; firing = true; firingIndex = firingStart || 0; firingStart = 0; firingLength = list.length; for ( ; list && firingIndex < firingLength; firingIndex++ ) { if ( list[ firingIndex ].apply( context, args ) === false && flags.stopOnFalse ) { memory = true; // Mark as halted break; } } firing = false; if ( list ) { if ( !flags.once ) { if ( stack && stack.length ) { memory = stack.shift(); self.fireWith( memory[ 0 ], memory[ 1 ] ); } } else if ( memory === true ) { self.disable(); } else { list = []; } } }, // Actual Callbacks object self = { // Add a callback or a collection of callbacks to the list add: function() { if ( list ) { var length = list.length; add( arguments ); // Do we need to add the callbacks to the // current firing batch? if ( firing ) { firingLength = list.length; // With memory, if we're not firing then // we should call right away, unless previous // firing was halted (stopOnFalse) } else if ( memory && memory !== true ) { firingStart = length; fire( memory[ 0 ], memory[ 1 ] ); } } return this; }, // Remove a callback from the list remove: function() { if ( list ) { var args = arguments, argIndex = 0, argLength = args.length; for ( ; argIndex < argLength ; argIndex++ ) { for ( var i = 0; i < list.length; i++ ) { if ( args[ argIndex ] === list[ i ] ) { // Handle firingIndex and firingLength if ( firing ) { if ( i <= firingLength ) { firingLength--; if ( i <= firingIndex ) { firingIndex--; } } } // Remove the element list.splice( i--, 1 ); // If we have some unicity property then // we only need to do this once if ( flags.unique ) { break; } } } } } return this; }, // Control if a given callback is in the list has: function( fn ) { if ( list ) { var i = 0, length = list.length; for ( ; i < length; i++ ) { if ( fn === list[ i ] ) { return true; } } } return false; }, // Remove all callbacks from the list empty: function() { list = []; return this; }, // Have the list do nothing anymore disable: function() { list = stack = memory = undefined; return this; }, // Is it disabled? disabled: function() { return !list; }, // Lock the list in its current state lock: function() { stack = undefined; if ( !memory || memory === true ) { self.disable(); } return this; }, // Is it locked? locked: function() { return !stack; }, // Call all callbacks with the given context and arguments fireWith: function( context, args ) { if ( stack ) { if ( firing ) { if ( !flags.once ) { stack.push( [ context, args ] ); } } else if ( !( flags.once && memory ) ) { fire( context, args ); } } return this; }, // Call all the callbacks with the given arguments fire: function() { self.fireWith( this, arguments ); return this; }, // To know if the callbacks have already been called at least once fired: function() { return !!fired; } }; return self; }; var // Static reference to slice sliceDeferred = [].slice; jQuery.extend({ Deferred: function( func ) { var doneList = jQuery.Callbacks( "once memory" ), failList = jQuery.Callbacks( "once memory" ), progressList = jQuery.Callbacks( "memory" ), state = "pending", lists = { resolve: doneList, reject: failList, notify: progressList }, promise = { done: doneList.add, fail: failList.add, progress: progressList.add, state: function() { return state; }, // Deprecated isResolved: doneList.fired, isRejected: failList.fired, then: function( doneCallbacks, failCallbacks, progressCallbacks ) { deferred.done( doneCallbacks ).fail( failCallbacks ).progress( progressCallbacks ); return this; }, always: function() { deferred.done.apply( deferred, arguments ).fail.apply( deferred, arguments ); return this; }, pipe: function( fnDone, fnFail, fnProgress ) { return jQuery.Deferred(function( newDefer ) { jQuery.each( { done: [ fnDone, "resolve" ], fail: [ fnFail, "reject" ], progress: [ fnProgress, "notify" ] }, function( handler, data ) { var fn = data[ 0 ], action = data[ 1 ], returned; if ( jQuery.isFunction( fn ) ) { deferred[ handler ](function() { returned = fn.apply( this, arguments ); if ( returned && jQuery.isFunction( returned.promise ) ) { returned.promise().then( newDefer.resolve, newDefer.reject, newDefer.notify ); } else { newDefer[ action + "With" ]( this === deferred ? newDefer : this, [ returned ] ); } }); } else { deferred[ handler ]( newDefer[ action ] ); } }); }).promise(); }, // Get a promise for this deferred // If obj is provided, the promise aspect is added to the object promise: function( obj ) { if ( obj == null ) { obj = promise; } else { for ( var key in promise ) { obj[ key ] = promise[ key ]; } } return obj; } }, deferred = promise.promise({}), key; for ( key in lists ) { deferred[ key ] = lists[ key ].fire; deferred[ key + "With" ] = lists[ key ].fireWith; } // Handle state deferred.done( function() { state = "resolved"; }, failList.disable, progressList.lock ).fail( function() { state = "rejected"; }, doneList.disable, progressList.lock ); // Call given func if any if ( func ) { func.call( deferred, deferred ); } // All done! return deferred; }, // Deferred helper when: function( firstParam ) { var args = sliceDeferred.call( arguments, 0 ), i = 0, length = args.length, pValues = new Array( length ), count = length, pCount = length, deferred = length <= 1 && firstParam && jQuery.isFunction( firstParam.promise ) ? firstParam : jQuery.Deferred(), promise = deferred.promise(); function resolveFunc( i ) { return function( value ) { args[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value; if ( !( --count ) ) { deferred.resolveWith( deferred, args ); } }; } function progressFunc( i ) { return function( value ) { pValues[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value; deferred.notifyWith( promise, pValues ); }; } if ( length > 1 ) { for ( ; i < length; i++ ) { if ( args[ i ] && args[ i ].promise && jQuery.isFunction( args[ i ].promise ) ) { args[ i ].promise().then( resolveFunc(i), deferred.reject, progressFunc(i) ); } else { --count; } } if ( !count ) { deferred.resolveWith( deferred, args ); } } else if ( deferred !== firstParam ) { deferred.resolveWith( deferred, length ? [ firstParam ] : [] ); } return promise; } }); jQuery.support = (function() { var support, all, a, select, opt, input, fragment, tds, events, eventName, i, isSupported, div = document.createElement( "div" ), documentElement = document.documentElement; // Preliminary tests div.setAttribute("className", "t"); div.innerHTML = "
a"; all = div.getElementsByTagName( "*" ); a = div.getElementsByTagName( "a" )[ 0 ]; // Can't get basic test support if ( !all || !all.length || !a ) { return {}; } // First batch of supports tests select = document.createElement( "select" ); opt = select.appendChild( document.createElement("option") ); input = div.getElementsByTagName( "input" )[ 0 ]; support = { // IE strips leading whitespace when .innerHTML is used leadingWhitespace: ( div.firstChild.nodeType === 3 ), // Make sure that tbody elements aren't automatically inserted // IE will insert them into empty tables tbody: !div.getElementsByTagName("tbody").length, // Make sure that link elements get serialized correctly by innerHTML // This requires a wrapper element in IE htmlSerialize: !!div.getElementsByTagName("link").length, // Get the style information from getAttribute // (IE uses .cssText instead) style: /top/.test( a.getAttribute("style") ), // Make sure that URLs aren't manipulated // (IE normalizes it by default) hrefNormalized: ( a.getAttribute("href") === "/a" ), // Make sure that element opacity exists // (IE uses filter instead) // Use a regex to work around a WebKit issue. See #5145 opacity: /^0.55/.test( a.style.opacity ), // Verify style float existence // (IE uses styleFloat instead of cssFloat) cssFloat: !!a.style.cssFloat, // Make sure that if no value is specified for a checkbox // that it defaults to "on". // (WebKit defaults to "" instead) checkOn: ( input.value === "on" ), // Make sure that a selected-by-default option has a working selected property. // (WebKit defaults to false instead of true, IE too, if it's in an optgroup) optSelected: opt.selected, // Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7) getSetAttribute: div.className !== "t", // Tests for enctype support on a form(#6743) enctype: !!document.createElement("form").enctype, // Makes sure cloning an html5 element does not cause problems // Where outerHTML is undefined, this still works html5Clone: document.createElement("nav").cloneNode( true ).outerHTML !== "<:nav>", // Will be defined later submitBubbles: true, changeBubbles: true, focusinBubbles: false, deleteExpando: true, noCloneEvent: true, inlineBlockNeedsLayout: false, shrinkWrapBlocks: false, reliableMarginRight: true, pixelMargin: true }; // jQuery.boxModel DEPRECATED in 1.3, use jQuery.support.boxModel instead jQuery.boxModel = support.boxModel = (document.compatMode === "CSS1Compat"); // Make sure checked status is properly cloned input.checked = true; support.noCloneChecked = input.cloneNode( true ).checked; // Make sure that the options inside disabled selects aren't marked as disabled // (WebKit marks them as disabled) select.disabled = true; support.optDisabled = !opt.disabled; // Test to see if it's possible to delete an expando from an element // Fails in Internet Explorer try { delete div.test; } catch( e ) { support.deleteExpando = false; } if ( !div.addEventListener && div.attachEvent && div.fireEvent ) { div.attachEvent( "onclick", function() { // Cloning a node shouldn't copy over any // bound event handlers (IE does this) support.noCloneEvent = false; }); div.cloneNode( true ).fireEvent( "onclick" ); } // Check if a radio maintains its value // after being appended to the DOM input = document.createElement("input"); input.value = "t"; input.setAttribute("type", "radio"); support.radioValue = input.value === "t"; input.setAttribute("checked", "checked"); // #11217 - WebKit loses check when the name is after the checked attribute input.setAttribute( "name", "t" ); div.appendChild( input ); fragment = document.createDocumentFragment(); fragment.appendChild( div.lastChild ); // WebKit doesn't clone checked state correctly in fragments support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked; // Check if a disconnected checkbox will retain its checked // value of true after appended to the DOM (IE6/7) support.appendChecked = input.checked; fragment.removeChild( input ); fragment.appendChild( div ); // Technique from Juriy Zaytsev // http://perfectionkills.com/detecting-event-support-without-browser-sniffing/ // We only care about the case where non-standard event systems // are used, namely in IE. Short-circuiting here helps us to // avoid an eval call (in setAttribute) which can cause CSP // to go haywire. See: https://developer.mozilla.org/en/Security/CSP if ( div.attachEvent ) { for ( i in { submit: 1, change: 1, focusin: 1 }) { eventName = "on" + i; isSupported = ( eventName in div ); if ( !isSupported ) { div.setAttribute( eventName, "return;" ); isSupported = ( typeof div[ eventName ] === "function" ); } support[ i + "Bubbles" ] = isSupported; } } fragment.removeChild( div ); // Null elements to avoid leaks in IE fragment = select = opt = div = input = null; // Run tests that need a body at doc ready jQuery(function() { var container, outer, inner, table, td, offsetSupport, marginDiv, conMarginTop, style, html, positionTopLeftWidthHeight, paddingMarginBorderVisibility, paddingMarginBorder, body = document.getElementsByTagName("body")[0]; if ( !body ) { // Return for frameset docs that don't have a body return; } conMarginTop = 1; paddingMarginBorder = "padding:0;margin:0;border:"; positionTopLeftWidthHeight = "position:absolute;top:0;left:0;width:1px;height:1px;"; paddingMarginBorderVisibility = paddingMarginBorder + "0;visibility:hidden;"; style = "style='" + positionTopLeftWidthHeight + paddingMarginBorder + "5px solid #000;"; html = "
" + "" + "
"; container = document.createElement("div"); container.style.cssText = paddingMarginBorderVisibility + "width:0;height:0;position:static;top:0;margin-top:" + conMarginTop + "px"; body.insertBefore( container, body.firstChild ); // Construct the test element div = document.createElement("div"); container.appendChild( div ); // Check if table cells still have offsetWidth/Height when they are set // to display:none and there are still other visible table cells in a // table row; if so, offsetWidth/Height are not reliable for use when // determining if an element has been hidden directly using // display:none (it is still safe to use offsets if a parent element is // hidden; don safety goggles and see bug #4512 for more information). // (only IE 8 fails this test) div.innerHTML = "
t
"; tds = div.getElementsByTagName( "td" ); isSupported = ( tds[ 0 ].offsetHeight === 0 ); tds[ 0 ].style.display = ""; tds[ 1 ].style.display = "none"; // Check if empty table cells still have offsetWidth/Height // (IE <= 8 fail this test) support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 ); // Check if div with explicit width and no margin-right incorrectly // gets computed margin-right based on width of container. For more // info see bug #3333 // Fails in WebKit before Feb 2011 nightlies // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right if ( window.getComputedStyle ) { div.innerHTML = ""; marginDiv = document.createElement( "div" ); marginDiv.style.width = "0"; marginDiv.style.marginRight = "0"; div.style.width = "2px"; div.appendChild( marginDiv ); support.reliableMarginRight = ( parseInt( ( window.getComputedStyle( marginDiv, null ) || { marginRight: 0 } ).marginRight, 10 ) || 0 ) === 0; } if ( typeof div.style.zoom !== "undefined" ) { // Check if natively block-level elements act like inline-block // elements when setting their display to 'inline' and giving // them layout // (IE < 8 does this) div.innerHTML = ""; div.style.width = div.style.padding = "1px"; div.style.border = 0; div.style.overflow = "hidden"; div.style.display = "inline"; div.style.zoom = 1; support.inlineBlockNeedsLayout = ( div.offsetWidth === 3 ); // Check if elements with layout shrink-wrap their children // (IE 6 does this) div.style.display = "block"; div.style.overflow = "visible"; div.innerHTML = "
"; support.shrinkWrapBlocks = ( div.offsetWidth !== 3 ); } div.style.cssText = positionTopLeftWidthHeight + paddingMarginBorderVisibility; div.innerHTML = html; outer = div.firstChild; inner = outer.firstChild; td = outer.nextSibling.firstChild.firstChild; offsetSupport = { doesNotAddBorder: ( inner.offsetTop !== 5 ), doesAddBorderForTableAndCells: ( td.offsetTop === 5 ) }; inner.style.position = "fixed"; inner.style.top = "20px"; // safari subtracts parent border width here which is 5px offsetSupport.fixedPosition = ( inner.offsetTop === 20 || inner.offsetTop === 15 ); inner.style.position = inner.style.top = ""; outer.style.overflow = "hidden"; outer.style.position = "relative"; offsetSupport.subtractsBorderForOverflowNotVisible = ( inner.offsetTop === -5 ); offsetSupport.doesNotIncludeMarginInBodyOffset = ( body.offsetTop !== conMarginTop ); if ( window.getComputedStyle ) { div.style.marginTop = "1%"; support.pixelMargin = ( window.getComputedStyle( div, null ) || { marginTop: 0 } ).marginTop !== "1%"; } if ( typeof container.style.zoom !== "undefined" ) { container.style.zoom = 1; } body.removeChild( container ); marginDiv = div = container = null; jQuery.extend( support, offsetSupport ); }); return support; })(); var rbrace = /^(?:\{.*\}|\[.*\])$/, rmultiDash = /([A-Z])/g; jQuery.extend({ cache: {}, // Please use with caution uuid: 0, // Unique for each copy of jQuery on the page // Non-digits removed to match rinlinejQuery expando: "jQuery" + ( jQuery.fn.jquery + Math.random() ).replace( /\D/g, "" ), // The following elements throw uncatchable exceptions if you // attempt to add expando properties to them. noData: { "embed": true, // Ban all objects except for Flash (which handle expandos) "object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000", "applet": true }, hasData: function( elem ) { elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ]; return !!elem && !isEmptyDataObject( elem ); }, data: function( elem, name, data, pvt /* Internal Use Only */ ) { if ( !jQuery.acceptData( elem ) ) { return; } var privateCache, thisCache, ret, internalKey = jQuery.expando, getByName = typeof name === "string", // We have to handle DOM nodes and JS objects differently because IE6-7 // can't GC object references properly across the DOM-JS boundary isNode = elem.nodeType, // Only DOM nodes need the global jQuery cache; JS object data is // attached directly to the object so GC can occur automatically cache = isNode ? jQuery.cache : elem, // Only defining an ID for JS objects if its cache already exists allows // the code to shortcut on the same path as a DOM node with no cache id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey, isEvents = name === "events"; // Avoid doing any more work than we need to when trying to get data on an // object that has no data at all if ( (!id || !cache[id] || (!isEvents && !pvt && !cache[id].data)) && getByName && data === undefined ) { return; } if ( !id ) { // Only DOM nodes need a new unique ID for each element since their data // ends up in the global cache if ( isNode ) { elem[ internalKey ] = id = ++jQuery.uuid; } else { id = internalKey; } } if ( !cache[ id ] ) { cache[ id ] = {}; // Avoids exposing jQuery metadata on plain JS objects when the object // is serialized using JSON.stringify if ( !isNode ) { cache[ id ].toJSON = jQuery.noop; } } // An object can be passed to jQuery.data instead of a key/value pair; this gets // shallow copied over onto the existing cache if ( typeof name === "object" || typeof name === "function" ) { if ( pvt ) { cache[ id ] = jQuery.extend( cache[ id ], name ); } else { cache[ id ].data = jQuery.extend( cache[ id ].data, name ); } } privateCache = thisCache = cache[ id ]; // jQuery data() is stored in a separate object inside the object's internal data // cache in order to avoid key collisions between internal data and user-defined // data. if ( !pvt ) { if ( !thisCache.data ) { thisCache.data = {}; } thisCache = thisCache.data; } if ( data !== undefined ) { thisCache[ jQuery.camelCase( name ) ] = data; } // Users should not attempt to inspect the internal events object using jQuery.data, // it is undocumented and subject to change. But does anyone listen? No. if ( isEvents && !thisCache[ name ] ) { return privateCache.events; } // Check for both converted-to-camel and non-converted data property names // If a data property was specified if ( getByName ) { // First Try to find as-is property data ret = thisCache[ name ]; // Test for null|undefined property data if ( ret == null ) { // Try to find the camelCased property ret = thisCache[ jQuery.camelCase( name ) ]; } } else { ret = thisCache; } return ret; }, removeData: function( elem, name, pvt /* Internal Use Only */ ) { if ( !jQuery.acceptData( elem ) ) { return; } var thisCache, i, l, // Reference to internal data cache key internalKey = jQuery.expando, isNode = elem.nodeType, // See jQuery.data for more information cache = isNode ? jQuery.cache : elem, // See jQuery.data for more information id = isNode ? elem[ internalKey ] : internalKey; // If there is already no cache entry for this object, there is no // purpose in continuing if ( !cache[ id ] ) { return; } if ( name ) { thisCache = pvt ? cache[ id ] : cache[ id ].data; if ( thisCache ) { // Support array or space separated string names for data keys if ( !jQuery.isArray( name ) ) { // try the string as a key before any manipulation if ( name in thisCache ) { name = [ name ]; } else { // split the camel cased version by spaces unless a key with the spaces exists name = jQuery.camelCase( name ); if ( name in thisCache ) { name = [ name ]; } else { name = name.split( " " ); } } } for ( i = 0, l = name.length; i < l; i++ ) { delete thisCache[ name[i] ]; } // If there is no data left in the cache, we want to continue // and let the cache object itself get destroyed if ( !( pvt ? isEmptyDataObject : jQuery.isEmptyObject )( thisCache ) ) { return; } } } // See jQuery.data for more information if ( !pvt ) { delete cache[ id ].data; // Don't destroy the parent cache unless the internal data object // had been the only thing left in it if ( !isEmptyDataObject(cache[ id ]) ) { return; } } // Browsers that fail expando deletion also refuse to delete expandos on // the window, but it will allow it on all other JS objects; other browsers // don't care // Ensure that `cache` is not a window object #10080 if ( jQuery.support.deleteExpando || !cache.setInterval ) { delete cache[ id ]; } else { cache[ id ] = null; } // We destroyed the cache and need to eliminate the expando on the node to avoid // false lookups in the cache for entries that no longer exist if ( isNode ) { // IE does not allow us to delete expando properties from nodes, // nor does it have a removeAttribute function on Document nodes; // we must handle all of these cases if ( jQuery.support.deleteExpando ) { delete elem[ internalKey ]; } else if ( elem.removeAttribute ) { elem.removeAttribute( internalKey ); } else { elem[ internalKey ] = null; } } }, // For internal use only. _data: function( elem, name, data ) { return jQuery.data( elem, name, data, true ); }, // A method for determining if a DOM node can handle the data expando acceptData: function( elem ) { if ( elem.nodeName ) { var match = jQuery.noData[ elem.nodeName.toLowerCase() ]; if ( match ) { return !(match === true || elem.getAttribute("classid") !== match); } } return true; } }); jQuery.fn.extend({ data: function( key, value ) { var parts, part, attr, name, l, elem = this[0], i = 0, data = null; // Gets all values if ( key === undefined ) { if ( this.length ) { data = jQuery.data( elem ); if ( elem.nodeType === 1 && !jQuery._data( elem, "parsedAttrs" ) ) { attr = elem.attributes; for ( l = attr.length; i < l; i++ ) { name = attr[i].name; if ( name.indexOf( "data-" ) === 0 ) { name = jQuery.camelCase( name.substring(5) ); dataAttr( elem, name, data[ name ] ); } } jQuery._data( elem, "parsedAttrs", true ); } } return data; } // Sets multiple values if ( typeof key === "object" ) { return this.each(function() { jQuery.data( this, key ); }); } parts = key.split( ".", 2 ); parts[1] = parts[1] ? "." + parts[1] : ""; part = parts[1] + "!"; return jQuery.access( this, function( value ) { if ( value === undefined ) { data = this.triggerHandler( "getData" + part, [ parts[0] ] ); // Try to fetch any internally stored data first if ( data === undefined && elem ) { data = jQuery.data( elem, key ); data = dataAttr( elem, key, data ); } return data === undefined && parts[1] ? this.data( parts[0] ) : data; } parts[1] = value; this.each(function() { var self = jQuery( this ); self.triggerHandler( "setData" + part, parts ); jQuery.data( this, key, value ); self.triggerHandler( "changeData" + part, parts ); }); }, null, value, arguments.length > 1, null, false ); }, removeData: function( key ) { return this.each(function() { jQuery.removeData( this, key ); }); } }); function dataAttr( elem, key, data ) { // If nothing was found internally, try to fetch any // data from the HTML5 data-* attribute if ( data === undefined && elem.nodeType === 1 ) { var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase(); data = elem.getAttribute( name ); if ( typeof data === "string" ) { try { data = data === "true" ? true : data === "false" ? false : data === "null" ? null : jQuery.isNumeric( data ) ? +data : rbrace.test( data ) ? jQuery.parseJSON( data ) : data; } catch( e ) {} // Make sure we set the data so it isn't changed later jQuery.data( elem, key, data ); } else { data = undefined; } } return data; } // checks a cache object for emptiness function isEmptyDataObject( obj ) { for ( var name in obj ) { // if the public data object is empty, the private is still empty if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) { continue; } if ( name !== "toJSON" ) { return false; } } return true; } function handleQueueMarkDefer( elem, type, src ) { var deferDataKey = type + "defer", queueDataKey = type + "queue", markDataKey = type + "mark", defer = jQuery._data( elem, deferDataKey ); if ( defer && ( src === "queue" || !jQuery._data(elem, queueDataKey) ) && ( src === "mark" || !jQuery._data(elem, markDataKey) ) ) { // Give room for hard-coded callbacks to fire first // and eventually mark/queue something else on the element setTimeout( function() { if ( !jQuery._data( elem, queueDataKey ) && !jQuery._data( elem, markDataKey ) ) { jQuery.removeData( elem, deferDataKey, true ); defer.fire(); } }, 0 ); } } jQuery.extend({ _mark: function( elem, type ) { if ( elem ) { type = ( type || "fx" ) + "mark"; jQuery._data( elem, type, (jQuery._data( elem, type ) || 0) + 1 ); } }, _unmark: function( force, elem, type ) { if ( force !== true ) { type = elem; elem = force; force = false; } if ( elem ) { type = type || "fx"; var key = type + "mark", count = force ? 0 : ( (jQuery._data( elem, key ) || 1) - 1 ); if ( count ) { jQuery._data( elem, key, count ); } else { jQuery.removeData( elem, key, true ); handleQueueMarkDefer( elem, type, "mark" ); } } }, queue: function( elem, type, data ) { var q; if ( elem ) { type = ( type || "fx" ) + "queue"; q = jQuery._data( elem, type ); // Speed up dequeue by getting out quickly if this is just a lookup if ( data ) { if ( !q || jQuery.isArray(data) ) { q = jQuery._data( elem, type, jQuery.makeArray(data) ); } else { q.push( data ); } } return q || []; } }, dequeue: function( elem, type ) { type = type || "fx"; var queue = jQuery.queue( elem, type ), fn = queue.shift(), hooks = {}; // If the fx queue is dequeued, always remove the progress sentinel if ( fn === "inprogress" ) { fn = queue.shift(); } if ( fn ) { // Add a progress sentinel to prevent the fx queue from being // automatically dequeued if ( type === "fx" ) { queue.unshift( "inprogress" ); } jQuery._data( elem, type + ".run", hooks ); fn.call( elem, function() { jQuery.dequeue( elem, type ); }, hooks ); } if ( !queue.length ) { jQuery.removeData( elem, type + "queue " + type + ".run", true ); handleQueueMarkDefer( elem, type, "queue" ); } } }); jQuery.fn.extend({ queue: function( type, data ) { var setter = 2; if ( typeof type !== "string" ) { data = type; type = "fx"; setter--; } if ( arguments.length < setter ) { return jQuery.queue( this[0], type ); } return data === undefined ? this : this.each(function() { var queue = jQuery.queue( this, type, data ); if ( type === "fx" && queue[0] !== "inprogress" ) { jQuery.dequeue( this, type ); } }); }, dequeue: function( type ) { return this.each(function() { jQuery.dequeue( this, type ); }); }, // Based off of the plugin by Clint Helfers, with permission. // http://blindsignals.com/index.php/2009/07/jquery-delay/ delay: function( time, type ) { time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; type = type || "fx"; return this.queue( type, function( next, hooks ) { var timeout = setTimeout( next, time ); hooks.stop = function() { clearTimeout( timeout ); }; }); }, clearQueue: function( type ) { return this.queue( type || "fx", [] ); }, // Get a promise resolved when queues of a certain type // are emptied (fx is the type by default) promise: function( type, object ) { if ( typeof type !== "string" ) { object = type; type = undefined; } type = type || "fx"; var defer = jQuery.Deferred(), elements = this, i = elements.length, count = 1, deferDataKey = type + "defer", queueDataKey = type + "queue", markDataKey = type + "mark", tmp; function resolve() { if ( !( --count ) ) { defer.resolveWith( elements, [ elements ] ); } } while( i-- ) { if (( tmp = jQuery.data( elements[ i ], deferDataKey, undefined, true ) || ( jQuery.data( elements[ i ], queueDataKey, undefined, true ) || jQuery.data( elements[ i ], markDataKey, undefined, true ) ) && jQuery.data( elements[ i ], deferDataKey, jQuery.Callbacks( "once memory" ), true ) )) { count++; tmp.add( resolve ); } } resolve(); return defer.promise( object ); } }); var rclass = /[\n\t\r]/g, rspace = /\s+/, rreturn = /\r/g, rtype = /^(?:button|input)$/i, rfocusable = /^(?:button|input|object|select|textarea)$/i, rclickable = /^a(?:rea)?$/i, rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i, getSetAttribute = jQuery.support.getSetAttribute, nodeHook, boolHook, fixSpecified; jQuery.fn.extend({ attr: function( name, value ) { return jQuery.access( this, jQuery.attr, name, value, arguments.length > 1 ); }, removeAttr: function( name ) { return this.each(function() { jQuery.removeAttr( this, name ); }); }, prop: function( name, value ) { return jQuery.access( this, jQuery.prop, name, value, arguments.length > 1 ); }, removeProp: function( name ) { name = jQuery.propFix[ name ] || name; return this.each(function() { // try/catch handles cases where IE balks (such as removing a property on window) try { this[ name ] = undefined; delete this[ name ]; } catch( e ) {} }); }, addClass: function( value ) { var classNames, i, l, elem, setClass, c, cl; if ( jQuery.isFunction( value ) ) { return this.each(function( j ) { jQuery( this ).addClass( value.call(this, j, this.className) ); }); } if ( value && typeof value === "string" ) { classNames = value.split( rspace ); for ( i = 0, l = this.length; i < l; i++ ) { elem = this[ i ]; if ( elem.nodeType === 1 ) { if ( !elem.className && classNames.length === 1 ) { elem.className = value; } else { setClass = " " + elem.className + " "; for ( c = 0, cl = classNames.length; c < cl; c++ ) { if ( !~setClass.indexOf( " " + classNames[ c ] + " " ) ) { setClass += classNames[ c ] + " "; } } elem.className = jQuery.trim( setClass ); } } } } return this; }, removeClass: function( value ) { var classNames, i, l, elem, className, c, cl; if ( jQuery.isFunction( value ) ) { return this.each(function( j ) { jQuery( this ).removeClass( value.call(this, j, this.className) ); }); } if ( (value && typeof value === "string") || value === undefined ) { classNames = ( value || "" ).split( rspace ); for ( i = 0, l = this.length; i < l; i++ ) { elem = this[ i ]; if ( elem.nodeType === 1 && elem.className ) { if ( value ) { className = (" " + elem.className + " ").replace( rclass, " " ); for ( c = 0, cl = classNames.length; c < cl; c++ ) { className = className.replace(" " + classNames[ c ] + " ", " "); } elem.className = jQuery.trim( className ); } else { elem.className = ""; } } } } return this; }, toggleClass: function( value, stateVal ) { var type = typeof value, isBool = typeof stateVal === "boolean"; if ( jQuery.isFunction( value ) ) { return this.each(function( i ) { jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal ); }); } return this.each(function() { if ( type === "string" ) { // toggle individual class names var className, i = 0, self = jQuery( this ), state = stateVal, classNames = value.split( rspace ); while ( (className = classNames[ i++ ]) ) { // check each className given, space seperated list state = isBool ? state : !self.hasClass( className ); self[ state ? "addClass" : "removeClass" ]( className ); } } else if ( type === "undefined" || type === "boolean" ) { if ( this.className ) { // store className if set jQuery._data( this, "__className__", this.className ); } // toggle whole className this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || ""; } }); }, hasClass: function( selector ) { var className = " " + selector + " ", i = 0, l = this.length; for ( ; i < l; i++ ) { if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) > -1 ) { return true; } } return false; }, val: function( value ) { var hooks, ret, isFunction, elem = this[0]; if ( !arguments.length ) { if ( elem ) { hooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ]; if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) { return ret; } ret = elem.value; return typeof ret === "string" ? // handle most common string cases ret.replace(rreturn, "") : // handle cases where value is null/undef or number ret == null ? "" : ret; } return; } isFunction = jQuery.isFunction( value ); return this.each(function( i ) { var self = jQuery(this), val; if ( this.nodeType !== 1 ) { return; } if ( isFunction ) { val = value.call( this, i, self.val() ); } else { val = value; } // Treat null/undefined as ""; convert numbers to string if ( val == null ) { val = ""; } else if ( typeof val === "number" ) { val += ""; } else if ( jQuery.isArray( val ) ) { val = jQuery.map(val, function ( value ) { return value == null ? "" : value + ""; }); } hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ]; // If set returns undefined, fall back to normal setting if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) { this.value = val; } }); } }); jQuery.extend({ valHooks: { option: { get: function( elem ) { // attributes.value is undefined in Blackberry 4.7 but // uses .value. See #6932 var val = elem.attributes.value; return !val || val.specified ? elem.value : elem.text; } }, select: { get: function( elem ) { var value, i, max, option, index = elem.selectedIndex, values = [], options = elem.options, one = elem.type === "select-one"; // Nothing was selected if ( index < 0 ) { return null; } // Loop through all the selected options i = one ? index : 0; max = one ? index + 1 : options.length; for ( ; i < max; i++ ) { option = options[ i ]; // Don't return options that are disabled or in a disabled optgroup if ( option.selected && (jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null) && (!option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" )) ) { // Get the specific value for the option value = jQuery( option ).val(); // We don't need an array for one selects if ( one ) { return value; } // Multi-Selects return an array values.push( value ); } } // Fixes Bug #2551 -- select.val() broken in IE after form.reset() if ( one && !values.length && options.length ) { return jQuery( options[ index ] ).val(); } return values; }, set: function( elem, value ) { var values = jQuery.makeArray( value ); jQuery(elem).find("option").each(function() { this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0; }); if ( !values.length ) { elem.selectedIndex = -1; } return values; } } }, attrFn: { val: true, css: true, html: true, text: true, data: true, width: true, height: true, offset: true }, attr: function( elem, name, value, pass ) { var ret, hooks, notxml, nType = elem.nodeType; // don't get/set attributes on text, comment and attribute nodes if ( !elem || nType === 3 || nType === 8 || nType === 2 ) { return; } if ( pass && name in jQuery.attrFn ) { return jQuery( elem )[ name ]( value ); } // Fallback to prop when attributes are not supported if ( typeof elem.getAttribute === "undefined" ) { return jQuery.prop( elem, name, value ); } notxml = nType !== 1 || !jQuery.isXMLDoc( elem ); // All attributes are lowercase // Grab necessary hook if one is defined if ( notxml ) { name = name.toLowerCase(); hooks = jQuery.attrHooks[ name ] || ( rboolean.test( name ) ? boolHook : nodeHook ); } if ( value !== undefined ) { if ( value === null ) { jQuery.removeAttr( elem, name ); return; } else if ( hooks && "set" in hooks && notxml && (ret = hooks.set( elem, value, name )) !== undefined ) { return ret; } else { elem.setAttribute( name, "" + value ); return value; } } else if ( hooks && "get" in hooks && notxml && (ret = hooks.get( elem, name )) !== null ) { return ret; } else { ret = elem.getAttribute( name ); // Non-existent attributes return null, we normalize to undefined return ret === null ? undefined : ret; } }, removeAttr: function( elem, value ) { var propName, attrNames, name, l, isBool, i = 0; if ( value && elem.nodeType === 1 ) { attrNames = value.toLowerCase().split( rspace ); l = attrNames.length; for ( ; i < l; i++ ) { name = attrNames[ i ]; if ( name ) { propName = jQuery.propFix[ name ] || name; isBool = rboolean.test( name ); // See #9699 for explanation of this approach (setting first, then removal) // Do not do this for boolean attributes (see #10870) if ( !isBool ) { jQuery.attr( elem, name, "" ); } elem.removeAttribute( getSetAttribute ? name : propName ); // Set corresponding property to false for boolean attributes if ( isBool && propName in elem ) { elem[ propName ] = false; } } } } }, attrHooks: { type: { set: function( elem, value ) { // We can't allow the type property to be changed (since it causes problems in IE) if ( rtype.test( elem.nodeName ) && elem.parentNode ) { jQuery.error( "type property can't be changed" ); } else if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) { // Setting the type on a radio button after the value resets the value in IE6-9 // Reset value to it's default in case type is set after value // This is for element creation var val = elem.value; elem.setAttribute( "type", value ); if ( val ) { elem.value = val; } return value; } } }, // Use the value property for back compat // Use the nodeHook for button elements in IE6/7 (#1954) value: { get: function( elem, name ) { if ( nodeHook && jQuery.nodeName( elem, "button" ) ) { return nodeHook.get( elem, name ); } return name in elem ? elem.value : null; }, set: function( elem, value, name ) { if ( nodeHook && jQuery.nodeName( elem, "button" ) ) { return nodeHook.set( elem, value, name ); } // Does not return so that setAttribute is also used elem.value = value; } } }, propFix: { tabindex: "tabIndex", readonly: "readOnly", "for": "htmlFor", "class": "className", maxlength: "maxLength", cellspacing: "cellSpacing", cellpadding: "cellPadding", rowspan: "rowSpan", colspan: "colSpan", usemap: "useMap", frameborder: "frameBorder", contenteditable: "contentEditable" }, prop: function( elem, name, value ) { var ret, hooks, notxml, nType = elem.nodeType; // don't get/set properties on text, comment and attribute nodes if ( !elem || nType === 3 || nType === 8 || nType === 2 ) { return; } notxml = nType !== 1 || !jQuery.isXMLDoc( elem ); if ( notxml ) { // Fix name and attach hooks name = jQuery.propFix[ name ] || name; hooks = jQuery.propHooks[ name ]; } if ( value !== undefined ) { if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) { return ret; } else { return ( elem[ name ] = value ); } } else { if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) { return ret; } else { return elem[ name ]; } } }, propHooks: { tabIndex: { get: function( elem ) { // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ var attributeNode = elem.getAttributeNode("tabindex"); return attributeNode && attributeNode.specified ? parseInt( attributeNode.value, 10 ) : rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ? 0 : undefined; } } } }); // Add the tabIndex propHook to attrHooks for back-compat (different case is intentional) jQuery.attrHooks.tabindex = jQuery.propHooks.tabIndex; // Hook for boolean attributes boolHook = { get: function( elem, name ) { // Align boolean attributes with corresponding properties // Fall back to attribute presence where some booleans are not supported var attrNode, property = jQuery.prop( elem, name ); return property === true || typeof property !== "boolean" && ( attrNode = elem.getAttributeNode(name) ) && attrNode.nodeValue !== false ? name.toLowerCase() : undefined; }, set: function( elem, value, name ) { var propName; if ( value === false ) { // Remove boolean attributes when set to false jQuery.removeAttr( elem, name ); } else { // value is true since we know at this point it's type boolean and not false // Set boolean attributes to the same name and set the DOM property propName = jQuery.propFix[ name ] || name; if ( propName in elem ) { // Only set the IDL specifically if it already exists on the element elem[ propName ] = true; } elem.setAttribute( name, name.toLowerCase() ); } return name; } }; // IE6/7 do not support getting/setting some attributes with get/setAttribute if ( !getSetAttribute ) { fixSpecified = { name: true, id: true, coords: true }; // Use this for any attribute in IE6/7 // This fixes almost every IE6/7 issue nodeHook = jQuery.valHooks.button = { get: function( elem, name ) { var ret; ret = elem.getAttributeNode( name ); return ret && ( fixSpecified[ name ] ? ret.nodeValue !== "" : ret.specified ) ? ret.nodeValue : undefined; }, set: function( elem, value, name ) { // Set the existing or create a new attribute node var ret = elem.getAttributeNode( name ); if ( !ret ) { ret = document.createAttribute( name ); elem.setAttributeNode( ret ); } return ( ret.nodeValue = value + "" ); } }; // Apply the nodeHook to tabindex jQuery.attrHooks.tabindex.set = nodeHook.set; // Set width and height to auto instead of 0 on empty string( Bug #8150 ) // This is for removals jQuery.each([ "width", "height" ], function( i, name ) { jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], { set: function( elem, value ) { if ( value === "" ) { elem.setAttribute( name, "auto" ); return value; } } }); }); // Set contenteditable to false on removals(#10429) // Setting to empty string throws an error as an invalid value jQuery.attrHooks.contenteditable = { get: nodeHook.get, set: function( elem, value, name ) { if ( value === "" ) { value = "false"; } nodeHook.set( elem, value, name ); } }; } // Some attributes require a special call on IE if ( !jQuery.support.hrefNormalized ) { jQuery.each([ "href", "src", "width", "height" ], function( i, name ) { jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], { get: function( elem ) { var ret = elem.getAttribute( name, 2 ); return ret === null ? undefined : ret; } }); }); } if ( !jQuery.support.style ) { jQuery.attrHooks.style = { get: function( elem ) { // Return undefined in the case of empty string // Normalize to lowercase since IE uppercases css property names return elem.style.cssText.toLowerCase() || undefined; }, set: function( elem, value ) { return ( elem.style.cssText = "" + value ); } }; } // Safari mis-reports the default selected property of an option // Accessing the parent's selectedIndex property fixes it if ( !jQuery.support.optSelected ) { jQuery.propHooks.selected = jQuery.extend( jQuery.propHooks.selected, { get: function( elem ) { var parent = elem.parentNode; if ( parent ) { parent.selectedIndex; // Make sure that it also works with optgroups, see #5701 if ( parent.parentNode ) { parent.parentNode.selectedIndex; } } return null; } }); } // IE6/7 call enctype encoding if ( !jQuery.support.enctype ) { jQuery.propFix.enctype = "encoding"; } // Radios and checkboxes getter/setter if ( !jQuery.support.checkOn ) { jQuery.each([ "radio", "checkbox" ], function() { jQuery.valHooks[ this ] = { get: function( elem ) { // Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified return elem.getAttribute("value") === null ? "on" : elem.value; } }; }); } jQuery.each([ "radio", "checkbox" ], function() { jQuery.valHooks[ this ] = jQuery.extend( jQuery.valHooks[ this ], { set: function( elem, value ) { if ( jQuery.isArray( value ) ) { return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 ); } } }); }); var rformElems = /^(?:textarea|input|select)$/i, rtypenamespace = /^([^\.]*)?(?:\.(.+))?$/, rhoverHack = /(?:^|\s)hover(\.\S+)?\b/, rkeyEvent = /^key/, rmouseEvent = /^(?:mouse|contextmenu)|click/, rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, rquickIs = /^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/, quickParse = function( selector ) { var quick = rquickIs.exec( selector ); if ( quick ) { // 0 1 2 3 // [ _, tag, id, class ] quick[1] = ( quick[1] || "" ).toLowerCase(); quick[3] = quick[3] && new RegExp( "(?:^|\\s)" + quick[3] + "(?:\\s|$)" ); } return quick; }, quickIs = function( elem, m ) { var attrs = elem.attributes || {}; return ( (!m[1] || elem.nodeName.toLowerCase() === m[1]) && (!m[2] || (attrs.id || {}).value === m[2]) && (!m[3] || m[3].test( (attrs[ "class" ] || {}).value )) ); }, hoverHack = function( events ) { return jQuery.event.special.hover ? events : events.replace( rhoverHack, "mouseenter$1 mouseleave$1" ); }; /* * Helper functions for managing events -- not part of the public interface. * Props to Dean Edwards' addEvent library for many of the ideas. */ jQuery.event = { add: function( elem, types, handler, data, selector ) { var elemData, eventHandle, events, t, tns, type, namespaces, handleObj, handleObjIn, quick, handlers, special; // Don't attach events to noData or text/comment nodes (allow plain objects tho) if ( elem.nodeType === 3 || elem.nodeType === 8 || !types || !handler || !(elemData = jQuery._data( elem )) ) { return; } // Caller can pass in an object of custom data in lieu of the handler if ( handler.handler ) { handleObjIn = handler; handler = handleObjIn.handler; selector = handleObjIn.selector; } // Make sure that the handler has a unique ID, used to find/remove it later if ( !handler.guid ) { handler.guid = jQuery.guid++; } // Init the element's event structure and main handler, if this is the first events = elemData.events; if ( !events ) { elemData.events = events = {}; } eventHandle = elemData.handle; if ( !eventHandle ) { elemData.handle = eventHandle = function( e ) { // Discard the second event of a jQuery.event.trigger() and // when an event is called after a page has unloaded return typeof jQuery !== "undefined" && (!e || jQuery.event.triggered !== e.type) ? jQuery.event.dispatch.apply( eventHandle.elem, arguments ) : undefined; }; // Add elem as a property of the handle fn to prevent a memory leak with IE non-native events eventHandle.elem = elem; } // Handle multiple events separated by a space // jQuery(...).bind("mouseover mouseout", fn); types = jQuery.trim( hoverHack(types) ).split( " " ); for ( t = 0; t < types.length; t++ ) { tns = rtypenamespace.exec( types[t] ) || []; type = tns[1]; namespaces = ( tns[2] || "" ).split( "." ).sort(); // If event changes its type, use the special event handlers for the changed type special = jQuery.event.special[ type ] || {}; // If selector defined, determine special event api type, otherwise given type type = ( selector ? special.delegateType : special.bindType ) || type; // Update special based on newly reset type special = jQuery.event.special[ type ] || {}; // handleObj is passed to all event handlers handleObj = jQuery.extend({ type: type, origType: tns[1], data: data, handler: handler, guid: handler.guid, selector: selector, quick: selector && quickParse( selector ), namespace: namespaces.join(".") }, handleObjIn ); // Init the event handler queue if we're the first handlers = events[ type ]; if ( !handlers ) { handlers = events[ type ] = []; handlers.delegateCount = 0; // Only use addEventListener/attachEvent if the special events handler returns false if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) { // Bind the global event handler to the element if ( elem.addEventListener ) { elem.addEventListener( type, eventHandle, false ); } else if ( elem.attachEvent ) { elem.attachEvent( "on" + type, eventHandle ); } } } if ( special.add ) { special.add.call( elem, handleObj ); if ( !handleObj.handler.guid ) { handleObj.handler.guid = handler.guid; } } // Add to the element's handler list, delegates in front if ( selector ) { handlers.splice( handlers.delegateCount++, 0, handleObj ); } else { handlers.push( handleObj ); } // Keep track of which events have ever been used, for event optimization jQuery.event.global[ type ] = true; } // Nullify elem to prevent memory leaks in IE elem = null; }, global: {}, // Detach an event or set of events from an element remove: function( elem, types, handler, selector, mappedTypes ) { var elemData = jQuery.hasData( elem ) && jQuery._data( elem ), t, tns, type, origType, namespaces, origCount, j, events, special, handle, eventType, handleObj; if ( !elemData || !(events = elemData.events) ) { return; } // Once for each type.namespace in types; type may be omitted types = jQuery.trim( hoverHack( types || "" ) ).split(" "); for ( t = 0; t < types.length; t++ ) { tns = rtypenamespace.exec( types[t] ) || []; type = origType = tns[1]; namespaces = tns[2]; // Unbind all events (on this namespace, if provided) for the element if ( !type ) { for ( type in events ) { jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); } continue; } special = jQuery.event.special[ type ] || {}; type = ( selector? special.delegateType : special.bindType ) || type; eventType = events[ type ] || []; origCount = eventType.length; namespaces = namespaces ? new RegExp("(^|\\.)" + namespaces.split(".").sort().join("\\.(?:.*\\.)?") + "(\\.|$)") : null; // Remove matching events for ( j = 0; j < eventType.length; j++ ) { handleObj = eventType[ j ]; if ( ( mappedTypes || origType === handleObj.origType ) && ( !handler || handler.guid === handleObj.guid ) && ( !namespaces || namespaces.test( handleObj.namespace ) ) && ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) { eventType.splice( j--, 1 ); if ( handleObj.selector ) { eventType.delegateCount--; } if ( special.remove ) { special.remove.call( elem, handleObj ); } } } // Remove generic event handler if we removed something and no more handlers exist // (avoids potential for endless recursion during removal of special event handlers) if ( eventType.length === 0 && origCount !== eventType.length ) { if ( !special.teardown || special.teardown.call( elem, namespaces ) === false ) { jQuery.removeEvent( elem, type, elemData.handle ); } delete events[ type ]; } } // Remove the expando if it's no longer used if ( jQuery.isEmptyObject( events ) ) { handle = elemData.handle; if ( handle ) { handle.elem = null; } // removeData also checks for emptiness and clears the expando if empty // so use it instead of delete jQuery.removeData( elem, [ "events", "handle" ], true ); } }, // Events that are safe to short-circuit if no handlers are attached. // Native DOM events should not be added, they may have inline handlers. customEvent: { "getData": true, "setData": true, "changeData": true }, trigger: function( event, data, elem, onlyHandlers ) { // Don't do events on text and comment nodes if ( elem && (elem.nodeType === 3 || elem.nodeType === 8) ) { return; } // Event object or event type var type = event.type || event, namespaces = [], cache, exclusive, i, cur, old, ontype, special, handle, eventPath, bubbleType; // focus/blur morphs to focusin/out; ensure we're not firing them right now if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { return; } if ( type.indexOf( "!" ) >= 0 ) { // Exclusive events trigger only for the exact event (no namespaces) type = type.slice(0, -1); exclusive = true; } if ( type.indexOf( "." ) >= 0 ) { // Namespaced trigger; create a regexp to match event type in handle() namespaces = type.split("."); type = namespaces.shift(); namespaces.sort(); } if ( (!elem || jQuery.event.customEvent[ type ]) && !jQuery.event.global[ type ] ) { // No jQuery handlers for this event type, and it can't have inline handlers return; } // Caller can pass in an Event, Object, or just an event type string event = typeof event === "object" ? // jQuery.Event object event[ jQuery.expando ] ? event : // Object literal new jQuery.Event( type, event ) : // Just the event type (string) new jQuery.Event( type ); event.type = type; event.isTrigger = true; event.exclusive = exclusive; event.namespace = namespaces.join( "." ); event.namespace_re = event.namespace? new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.)?") + "(\\.|$)") : null; ontype = type.indexOf( ":" ) < 0 ? "on" + type : ""; // Handle a global trigger if ( !elem ) { // TODO: Stop taunting the data cache; remove global events and always attach to document cache = jQuery.cache; for ( i in cache ) { if ( cache[ i ].events && cache[ i ].events[ type ] ) { jQuery.event.trigger( event, data, cache[ i ].handle.elem, true ); } } return; } // Clean up the event in case it is being reused event.result = undefined; if ( !event.target ) { event.target = elem; } // Clone any incoming data and prepend the event, creating the handler arg list data = data != null ? jQuery.makeArray( data ) : []; data.unshift( event ); // Allow special events to draw outside the lines special = jQuery.event.special[ type ] || {}; if ( special.trigger && special.trigger.apply( elem, data ) === false ) { return; } // Determine event propagation path in advance, per W3C events spec (#9951) // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) eventPath = [[ elem, special.bindType || type ]]; if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) { bubbleType = special.delegateType || type; cur = rfocusMorph.test( bubbleType + type ) ? elem : elem.parentNode; old = null; for ( ; cur; cur = cur.parentNode ) { eventPath.push([ cur, bubbleType ]); old = cur; } // Only add window if we got to document (e.g., not plain obj or detached DOM) if ( old && old === elem.ownerDocument ) { eventPath.push([ old.defaultView || old.parentWindow || window, bubbleType ]); } } // Fire handlers on the event path for ( i = 0; i < eventPath.length && !event.isPropagationStopped(); i++ ) { cur = eventPath[i][0]; event.type = eventPath[i][1]; handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" ); if ( handle ) { handle.apply( cur, data ); } // Note that this is a bare JS function and not a jQuery handler handle = ontype && cur[ ontype ]; if ( handle && jQuery.acceptData( cur ) && handle.apply( cur, data ) === false ) { event.preventDefault(); } } event.type = type; // If nobody prevented the default action, do it now if ( !onlyHandlers && !event.isDefaultPrevented() ) { if ( (!special._default || special._default.apply( elem.ownerDocument, data ) === false) && !(type === "click" && jQuery.nodeName( elem, "a" )) && jQuery.acceptData( elem ) ) { // Call a native DOM method on the target with the same name name as the event. // Can't use an .isFunction() check here because IE6/7 fails that test. // Don't do default actions on window, that's where global variables be (#6170) // IE<9 dies on focus/blur to hidden element (#1486) if ( ontype && elem[ type ] && ((type !== "focus" && type !== "blur") || event.target.offsetWidth !== 0) && !jQuery.isWindow( elem ) ) { // Don't re-trigger an onFOO event when we call its FOO() method old = elem[ ontype ]; if ( old ) { elem[ ontype ] = null; } // Prevent re-triggering of the same event, since we already bubbled it above jQuery.event.triggered = type; elem[ type ](); jQuery.event.triggered = undefined; if ( old ) { elem[ ontype ] = old; } } } } return event.result; }, dispatch: function( event ) { // Make a writable jQuery.Event from the native event object event = jQuery.event.fix( event || window.event ); var handlers = ( (jQuery._data( this, "events" ) || {} )[ event.type ] || []), delegateCount = handlers.delegateCount, args = [].slice.call( arguments, 0 ), run_all = !event.exclusive && !event.namespace, special = jQuery.event.special[ event.type ] || {}, handlerQueue = [], i, j, cur, jqcur, ret, selMatch, matched, matches, handleObj, sel, related; // Use the fix-ed jQuery.Event rather than the (read-only) native event args[0] = event; event.delegateTarget = this; // Call the preDispatch hook for the mapped type, and let it bail if desired if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { return; } // Determine handlers that should run if there are delegated events // Avoid non-left-click bubbling in Firefox (#3861) if ( delegateCount && !(event.button && event.type === "click") ) { // Pregenerate a single jQuery object for reuse with .is() jqcur = jQuery(this); jqcur.context = this.ownerDocument || this; for ( cur = event.target; cur != this; cur = cur.parentNode || this ) { // Don't process events on disabled elements (#6911, #8165) if ( cur.disabled !== true ) { selMatch = {}; matches = []; jqcur[0] = cur; for ( i = 0; i < delegateCount; i++ ) { handleObj = handlers[ i ]; sel = handleObj.selector; if ( selMatch[ sel ] === undefined ) { selMatch[ sel ] = ( handleObj.quick ? quickIs( cur, handleObj.quick ) : jqcur.is( sel ) ); } if ( selMatch[ sel ] ) { matches.push( handleObj ); } } if ( matches.length ) { handlerQueue.push({ elem: cur, matches: matches }); } } } } // Add the remaining (directly-bound) handlers if ( handlers.length > delegateCount ) { handlerQueue.push({ elem: this, matches: handlers.slice( delegateCount ) }); } // Run delegates first; they may want to stop propagation beneath us for ( i = 0; i < handlerQueue.length && !event.isPropagationStopped(); i++ ) { matched = handlerQueue[ i ]; event.currentTarget = matched.elem; for ( j = 0; j < matched.matches.length && !event.isImmediatePropagationStopped(); j++ ) { handleObj = matched.matches[ j ]; // Triggered event must either 1) be non-exclusive and have no namespace, or // 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace). if ( run_all || (!event.namespace && !handleObj.namespace) || event.namespace_re && event.namespace_re.test( handleObj.namespace ) ) { event.data = handleObj.data; event.handleObj = handleObj; ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler ) .apply( matched.elem, args ); if ( ret !== undefined ) { event.result = ret; if ( ret === false ) { event.preventDefault(); event.stopPropagation(); } } } } } // Call the postDispatch hook for the mapped type if ( special.postDispatch ) { special.postDispatch.call( this, event ); } return event.result; }, // Includes some event props shared by KeyEvent and MouseEvent // *** attrChange attrName relatedNode srcElement are not normalized, non-W3C, deprecated, will be removed in 1.8 *** props: "attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "), fixHooks: {}, keyHooks: { props: "char charCode key keyCode".split(" "), filter: function( event, original ) { // Add which for key events if ( event.which == null ) { event.which = original.charCode != null ? original.charCode : original.keyCode; } return event; } }, mouseHooks: { props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "), filter: function( event, original ) { var eventDoc, doc, body, button = original.button, fromElement = original.fromElement; // Calculate pageX/Y if missing and clientX/Y available if ( event.pageX == null && original.clientX != null ) { eventDoc = event.target.ownerDocument || document; doc = eventDoc.documentElement; body = eventDoc.body; event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 ); event.pageY = original.clientY + ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - ( doc && doc.clientTop || body && body.clientTop || 0 ); } // Add relatedTarget, if necessary if ( !event.relatedTarget && fromElement ) { event.relatedTarget = fromElement === event.target ? original.toElement : fromElement; } // Add which for click: 1 === left; 2 === middle; 3 === right // Note: button is not normalized, so don't use it if ( !event.which && button !== undefined ) { event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) ); } return event; } }, fix: function( event ) { if ( event[ jQuery.expando ] ) { return event; } // Create a writable copy of the event object and normalize some properties var i, prop, originalEvent = event, fixHook = jQuery.event.fixHooks[ event.type ] || {}, copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props; event = jQuery.Event( originalEvent ); for ( i = copy.length; i; ) { prop = copy[ --i ]; event[ prop ] = originalEvent[ prop ]; } // Fix target property, if necessary (#1925, IE 6/7/8 & Safari2) if ( !event.target ) { event.target = originalEvent.srcElement || document; } // Target should not be a text node (#504, Safari) if ( event.target.nodeType === 3 ) { event.target = event.target.parentNode; } // For mouse/key events; add metaKey if it's not there (#3368, IE6/7/8) if ( event.metaKey === undefined ) { event.metaKey = event.ctrlKey; } return fixHook.filter? fixHook.filter( event, originalEvent ) : event; }, special: { ready: { // Make sure the ready event is setup setup: jQuery.bindReady }, load: { // Prevent triggered image.load events from bubbling to window.load noBubble: true }, focus: { delegateType: "focusin" }, blur: { delegateType: "focusout" }, beforeunload: { setup: function( data, namespaces, eventHandle ) { // We only want to do this special case on windows if ( jQuery.isWindow( this ) ) { this.onbeforeunload = eventHandle; } }, teardown: function( namespaces, eventHandle ) { if ( this.onbeforeunload === eventHandle ) { this.onbeforeunload = null; } } } }, simulate: function( type, elem, event, bubble ) { // Piggyback on a donor event to simulate a different one. // Fake originalEvent to avoid donor's stopPropagation, but if the // simulated event prevents default then we do the same on the donor. var e = jQuery.extend( new jQuery.Event(), event, { type: type, isSimulated: true, originalEvent: {} } ); if ( bubble ) { jQuery.event.trigger( e, null, elem ); } else { jQuery.event.dispatch.call( elem, e ); } if ( e.isDefaultPrevented() ) { event.preventDefault(); } } }; // Some plugins are using, but it's undocumented/deprecated and will be removed. // The 1.7 special event interface should provide all the hooks needed now. jQuery.event.handle = jQuery.event.dispatch; jQuery.removeEvent = document.removeEventListener ? function( elem, type, handle ) { if ( elem.removeEventListener ) { elem.removeEventListener( type, handle, false ); } } : function( elem, type, handle ) { if ( elem.detachEvent ) { elem.detachEvent( "on" + type, handle ); } }; jQuery.Event = function( src, props ) { // Allow instantiation without the 'new' keyword if ( !(this instanceof jQuery.Event) ) { return new jQuery.Event( src, props ); } // Event object if ( src && src.type ) { this.originalEvent = src; this.type = src.type; // Events bubbling up the document may have been marked as prevented // by a handler lower down the tree; reflect the correct value. this.isDefaultPrevented = ( src.defaultPrevented || src.returnValue === false || src.getPreventDefault && src.getPreventDefault() ) ? returnTrue : returnFalse; // Event type } else { this.type = src; } // Put explicitly provided properties onto the event object if ( props ) { jQuery.extend( this, props ); } // Create a timestamp if incoming event doesn't have one this.timeStamp = src && src.timeStamp || jQuery.now(); // Mark it as fixed this[ jQuery.expando ] = true; }; function returnFalse() { return false; } function returnTrue() { return true; } // jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding // http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html jQuery.Event.prototype = { preventDefault: function() { this.isDefaultPrevented = returnTrue; var e = this.originalEvent; if ( !e ) { return; } // if preventDefault exists run it on the original event if ( e.preventDefault ) { e.preventDefault(); // otherwise set the returnValue property of the original event to false (IE) } else { e.returnValue = false; } }, stopPropagation: function() { this.isPropagationStopped = returnTrue; var e = this.originalEvent; if ( !e ) { return; } // if stopPropagation exists run it on the original event if ( e.stopPropagation ) { e.stopPropagation(); } // otherwise set the cancelBubble property of the original event to true (IE) e.cancelBubble = true; }, stopImmediatePropagation: function() { this.isImmediatePropagationStopped = returnTrue; this.stopPropagation(); }, isDefaultPrevented: returnFalse, isPropagationStopped: returnFalse, isImmediatePropagationStopped: returnFalse }; // Create mouseenter/leave events using mouseover/out and event-time checks jQuery.each({ mouseenter: "mouseover", mouseleave: "mouseout" }, function( orig, fix ) { jQuery.event.special[ orig ] = { delegateType: fix, bindType: fix, handle: function( event ) { var target = this, related = event.relatedTarget, handleObj = event.handleObj, selector = handleObj.selector, ret; // For mousenter/leave call the handler if related is outside the target. // NB: No relatedTarget if the mouse left/entered the browser window if ( !related || (related !== target && !jQuery.contains( target, related )) ) { event.type = handleObj.origType; ret = handleObj.handler.apply( this, arguments ); event.type = fix; } return ret; } }; }); // IE submit delegation if ( !jQuery.support.submitBubbles ) { jQuery.event.special.submit = { setup: function() { // Only need this for delegated form submit events if ( jQuery.nodeName( this, "form" ) ) { return false; } // Lazy-add a submit handler when a descendant form may potentially be submitted jQuery.event.add( this, "click._submit keypress._submit", function( e ) { // Node name check avoids a VML-related crash in IE (#9807) var elem = e.target, form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined; if ( form && !form._submit_attached ) { jQuery.event.add( form, "submit._submit", function( event ) { event._submit_bubble = true; }); form._submit_attached = true; } }); // return undefined since we don't need an event listener }, postDispatch: function( event ) { // If form was submitted by the user, bubble the event up the tree if ( event._submit_bubble ) { delete event._submit_bubble; if ( this.parentNode && !event.isTrigger ) { jQuery.event.simulate( "submit", this.parentNode, event, true ); } } }, teardown: function() { // Only need this for delegated form submit events if ( jQuery.nodeName( this, "form" ) ) { return false; } // Remove delegated handlers; cleanData eventually reaps submit handlers attached above jQuery.event.remove( this, "._submit" ); } }; } // IE change delegation and checkbox/radio fix if ( !jQuery.support.changeBubbles ) { jQuery.event.special.change = { setup: function() { if ( rformElems.test( this.nodeName ) ) { // IE doesn't fire change on a check/radio until blur; trigger it on click // after a propertychange. Eat the blur-change in special.change.handle. // This still fires onchange a second time for check/radio after blur. if ( this.type === "checkbox" || this.type === "radio" ) { jQuery.event.add( this, "propertychange._change", function( event ) { if ( event.originalEvent.propertyName === "checked" ) { this._just_changed = true; } }); jQuery.event.add( this, "click._change", function( event ) { if ( this._just_changed && !event.isTrigger ) { this._just_changed = false; jQuery.event.simulate( "change", this, event, true ); } }); } return false; } // Delegated event; lazy-add a change handler on descendant inputs jQuery.event.add( this, "beforeactivate._change", function( e ) { var elem = e.target; if ( rformElems.test( elem.nodeName ) && !elem._change_attached ) { jQuery.event.add( elem, "change._change", function( event ) { if ( this.parentNode && !event.isSimulated && !event.isTrigger ) { jQuery.event.simulate( "change", this.parentNode, event, true ); } }); elem._change_attached = true; } }); }, handle: function( event ) { var elem = event.target; // Swallow native change events from checkbox/radio, we already triggered them above if ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== "radio" && elem.type !== "checkbox") ) { return event.handleObj.handler.apply( this, arguments ); } }, teardown: function() { jQuery.event.remove( this, "._change" ); return rformElems.test( this.nodeName ); } }; } // Create "bubbling" focus and blur events if ( !jQuery.support.focusinBubbles ) { jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) { // Attach a single capturing handler while someone wants focusin/focusout var attaches = 0, handler = function( event ) { jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true ); }; jQuery.event.special[ fix ] = { setup: function() { if ( attaches++ === 0 ) { document.addEventListener( orig, handler, true ); } }, teardown: function() { if ( --attaches === 0 ) { document.removeEventListener( orig, handler, true ); } } }; }); } jQuery.fn.extend({ on: function( types, selector, data, fn, /*INTERNAL*/ one ) { var origFn, type; // Types can be a map of types/handlers if ( typeof types === "object" ) { // ( types-Object, selector, data ) if ( typeof selector !== "string" ) { // && selector != null // ( types-Object, data ) data = data || selector; selector = undefined; } for ( type in types ) { this.on( type, selector, data, types[ type ], one ); } return this; } if ( data == null && fn == null ) { // ( types, fn ) fn = selector; data = selector = undefined; } else if ( fn == null ) { if ( typeof selector === "string" ) { // ( types, selector, fn ) fn = data; data = undefined; } else { // ( types, data, fn ) fn = data; data = selector; selector = undefined; } } if ( fn === false ) { fn = returnFalse; } else if ( !fn ) { return this; } if ( one === 1 ) { origFn = fn; fn = function( event ) { // Can use an empty set, since event contains the info jQuery().off( event ); return origFn.apply( this, arguments ); }; // Use same guid so caller can remove using origFn fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); } return this.each( function() { jQuery.event.add( this, types, fn, data, selector ); }); }, one: function( types, selector, data, fn ) { return this.on( types, selector, data, fn, 1 ); }, off: function( types, selector, fn ) { if ( types && types.preventDefault && types.handleObj ) { // ( event ) dispatched jQuery.Event var handleObj = types.handleObj; jQuery( types.delegateTarget ).off( handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType, handleObj.selector, handleObj.handler ); return this; } if ( typeof types === "object" ) { // ( types-object [, selector] ) for ( var type in types ) { this.off( type, selector, types[ type ] ); } return this; } if ( selector === false || typeof selector === "function" ) { // ( types [, fn] ) fn = selector; selector = undefined; } if ( fn === false ) { fn = returnFalse; } return this.each(function() { jQuery.event.remove( this, types, fn, selector ); }); }, bind: function( types, data, fn ) { return this.on( types, null, data, fn ); }, unbind: function( types, fn ) { return this.off( types, null, fn ); }, live: function( types, data, fn ) { jQuery( this.context ).on( types, this.selector, data, fn ); return this; }, die: function( types, fn ) { jQuery( this.context ).off( types, this.selector || "**", fn ); return this; }, delegate: function( selector, types, data, fn ) { return this.on( types, selector, data, fn ); }, undelegate: function( selector, types, fn ) { // ( namespace ) or ( selector, types [, fn] ) return arguments.length == 1? this.off( selector, "**" ) : this.off( types, selector, fn ); }, trigger: function( type, data ) { return this.each(function() { jQuery.event.trigger( type, data, this ); }); }, triggerHandler: function( type, data ) { if ( this[0] ) { return jQuery.event.trigger( type, data, this[0], true ); } }, toggle: function( fn ) { // Save reference to arguments for access in closure var args = arguments, guid = fn.guid || jQuery.guid++, i = 0, toggler = function( event ) { // Figure out which function to execute var lastToggle = ( jQuery._data( this, "lastToggle" + fn.guid ) || 0 ) % i; jQuery._data( this, "lastToggle" + fn.guid, lastToggle + 1 ); // Make sure that clicks stop event.preventDefault(); // and execute the function return args[ lastToggle ].apply( this, arguments ) || false; }; // link all the functions, so any of them can unbind this click handler toggler.guid = guid; while ( i < args.length ) { args[ i++ ].guid = guid; } return this.click( toggler ); }, hover: function( fnOver, fnOut ) { return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver ); } }); jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " + "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " + "change select submit keydown keypress keyup error contextmenu").split(" "), function( i, name ) { // Handle event binding jQuery.fn[ name ] = function( data, fn ) { if ( fn == null ) { fn = data; data = null; } return arguments.length > 0 ? this.on( name, null, data, fn ) : this.trigger( name ); }; if ( jQuery.attrFn ) { jQuery.attrFn[ name ] = true; } if ( rkeyEvent.test( name ) ) { jQuery.event.fixHooks[ name ] = jQuery.event.keyHooks; } if ( rmouseEvent.test( name ) ) { jQuery.event.fixHooks[ name ] = jQuery.event.mouseHooks; } }); /*! * Sizzle CSS Selector Engine * Copyright 2011, The Dojo Foundation * Released under the MIT, BSD, and GPL Licenses. * More information: http://sizzlejs.com/ */ (function(){ var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g, expando = "sizcache" + (Math.random() + '').replace('.', ''), done = 0, toString = Object.prototype.toString, hasDuplicate = false, baseHasDuplicate = true, rBackslash = /\\/g, rReturn = /\r\n/g, rNonWord = /\W/; // Here we check if the JavaScript engine is using some sort of // optimization where it does not always call our comparision // function. If that is the case, discard the hasDuplicate value. // Thus far that includes Google Chrome. [0, 0].sort(function() { baseHasDuplicate = false; return 0; }); var Sizzle = function( selector, context, results, seed ) { results = results || []; context = context || document; var origContext = context; if ( context.nodeType !== 1 && context.nodeType !== 9 ) { return []; } if ( !selector || typeof selector !== "string" ) { return results; } var m, set, checkSet, extra, ret, cur, pop, i, prune = true, contextXML = Sizzle.isXML( context ), parts = [], soFar = selector; // Reset the position of the chunker regexp (start from head) do { chunker.exec( "" ); m = chunker.exec( soFar ); if ( m ) { soFar = m[3]; parts.push( m[1] ); if ( m[2] ) { extra = m[3]; break; } } } while ( m ); if ( parts.length > 1 && origPOS.exec( selector ) ) { if ( parts.length === 2 && Expr.relative[ parts[0] ] ) { set = posProcess( parts[0] + parts[1], context, seed ); } else { set = Expr.relative[ parts[0] ] ? [ context ] : Sizzle( parts.shift(), context ); while ( parts.length ) { selector = parts.shift(); if ( Expr.relative[ selector ] ) { selector += parts.shift(); } set = posProcess( selector, set, seed ); } } } else { // Take a shortcut and set the context if the root selector is an ID // (but not if it'll be faster if the inner selector is an ID) if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML && Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) { ret = Sizzle.find( parts.shift(), context, contextXML ); context = ret.expr ? Sizzle.filter( ret.expr, ret.set )[0] : ret.set[0]; } if ( context ) { ret = seed ? { expr: parts.pop(), set: makeArray(seed) } : Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML ); set = ret.expr ? Sizzle.filter( ret.expr, ret.set ) : ret.set; if ( parts.length > 0 ) { checkSet = makeArray( set ); } else { prune = false; } while ( parts.length ) { cur = parts.pop(); pop = cur; if ( !Expr.relative[ cur ] ) { cur = ""; } else { pop = parts.pop(); } if ( pop == null ) { pop = context; } Expr.relative[ cur ]( checkSet, pop, contextXML ); } } else { checkSet = parts = []; } } if ( !checkSet ) { checkSet = set; } if ( !checkSet ) { Sizzle.error( cur || selector ); } if ( toString.call(checkSet) === "[object Array]" ) { if ( !prune ) { results.push.apply( results, checkSet ); } else if ( context && context.nodeType === 1 ) { for ( i = 0; checkSet[i] != null; i++ ) { if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && Sizzle.contains(context, checkSet[i])) ) { results.push( set[i] ); } } } else { for ( i = 0; checkSet[i] != null; i++ ) { if ( checkSet[i] && checkSet[i].nodeType === 1 ) { results.push( set[i] ); } } } } else { makeArray( checkSet, results ); } if ( extra ) { Sizzle( extra, origContext, results, seed ); Sizzle.uniqueSort( results ); } return results; }; Sizzle.uniqueSort = function( results ) { if ( sortOrder ) { hasDuplicate = baseHasDuplicate; results.sort( sortOrder ); if ( hasDuplicate ) { for ( var i = 1; i < results.length; i++ ) { if ( results[i] === results[ i - 1 ] ) { results.splice( i--, 1 ); } } } } return results; }; Sizzle.matches = function( expr, set ) { return Sizzle( expr, null, null, set ); }; Sizzle.matchesSelector = function( node, expr ) { return Sizzle( expr, null, null, [node] ).length > 0; }; Sizzle.find = function( expr, context, isXML ) { var set, i, len, match, type, left; if ( !expr ) { return []; } for ( i = 0, len = Expr.order.length; i < len; i++ ) { type = Expr.order[i]; if ( (match = Expr.leftMatch[ type ].exec( expr )) ) { left = match[1]; match.splice( 1, 1 ); if ( left.substr( left.length - 1 ) !== "\\" ) { match[1] = (match[1] || "").replace( rBackslash, "" ); set = Expr.find[ type ]( match, context, isXML ); if ( set != null ) { expr = expr.replace( Expr.match[ type ], "" ); break; } } } } if ( !set ) { set = typeof context.getElementsByTagName !== "undefined" ? context.getElementsByTagName( "*" ) : []; } return { set: set, expr: expr }; }; Sizzle.filter = function( expr, set, inplace, not ) { var match, anyFound, type, found, item, filter, left, i, pass, old = expr, result = [], curLoop = set, isXMLFilter = set && set[0] && Sizzle.isXML( set[0] ); while ( expr && set.length ) { for ( type in Expr.filter ) { if ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) { filter = Expr.filter[ type ]; left = match[1]; anyFound = false; match.splice(1,1); if ( left.substr( left.length - 1 ) === "\\" ) { continue; } if ( curLoop === result ) { result = []; } if ( Expr.preFilter[ type ] ) { match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter ); if ( !match ) { anyFound = found = true; } else if ( match === true ) { continue; } } if ( match ) { for ( i = 0; (item = curLoop[i]) != null; i++ ) { if ( item ) { found = filter( item, match, i, curLoop ); pass = not ^ found; if ( inplace && found != null ) { if ( pass ) { anyFound = true; } else { curLoop[i] = false; } } else if ( pass ) { result.push( item ); anyFound = true; } } } } if ( found !== undefined ) { if ( !inplace ) { curLoop = result; } expr = expr.replace( Expr.match[ type ], "" ); if ( !anyFound ) { return []; } break; } } } // Improper expression if ( expr === old ) { if ( anyFound == null ) { Sizzle.error( expr ); } else { break; } } old = expr; } return curLoop; }; Sizzle.error = function( msg ) { throw new Error( "Syntax error, unrecognized expression: " + msg ); }; /** * Utility function for retreiving the text value of an array of DOM nodes * @param {Array|Element} elem */ var getText = Sizzle.getText = function( elem ) { var i, node, nodeType = elem.nodeType, ret = ""; if ( nodeType ) { if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { // Use textContent || innerText for elements if ( typeof elem.textContent === 'string' ) { return elem.textContent; } else if ( typeof elem.innerText === 'string' ) { // Replace IE's carriage returns return elem.innerText.replace( rReturn, '' ); } else { // Traverse it's children for ( elem = elem.firstChild; elem; elem = elem.nextSibling) { ret += getText( elem ); } } } else if ( nodeType === 3 || nodeType === 4 ) { return elem.nodeValue; } } else { // If no nodeType, this is expected to be an array for ( i = 0; (node = elem[i]); i++ ) { // Do not traverse comment nodes if ( node.nodeType !== 8 ) { ret += getText( node ); } } } return ret; }; var Expr = Sizzle.selectors = { order: [ "ID", "NAME", "TAG" ], match: { ID: /#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/, CLASS: /\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/, NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/, ATTR: /\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/, TAG: /^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/, CHILD: /:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/, POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/, PSEUDO: /:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/ }, leftMatch: {}, attrMap: { "class": "className", "for": "htmlFor" }, attrHandle: { href: function( elem ) { return elem.getAttribute( "href" ); }, type: function( elem ) { return elem.getAttribute( "type" ); } }, relative: { "+": function(checkSet, part){ var isPartStr = typeof part === "string", isTag = isPartStr && !rNonWord.test( part ), isPartStrNotTag = isPartStr && !isTag; if ( isTag ) { part = part.toLowerCase(); } for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) { if ( (elem = checkSet[i]) ) { while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {} checkSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ? elem || false : elem === part; } } if ( isPartStrNotTag ) { Sizzle.filter( part, checkSet, true ); } }, ">": function( checkSet, part ) { var elem, isPartStr = typeof part === "string", i = 0, l = checkSet.length; if ( isPartStr && !rNonWord.test( part ) ) { part = part.toLowerCase(); for ( ; i < l; i++ ) { elem = checkSet[i]; if ( elem ) { var parent = elem.parentNode; checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false; } } } else { for ( ; i < l; i++ ) { elem = checkSet[i]; if ( elem ) { checkSet[i] = isPartStr ? elem.parentNode : elem.parentNode === part; } } if ( isPartStr ) { Sizzle.filter( part, checkSet, true ); } } }, "": function(checkSet, part, isXML){ var nodeCheck, doneName = done++, checkFn = dirCheck; if ( typeof part === "string" && !rNonWord.test( part ) ) { part = part.toLowerCase(); nodeCheck = part; checkFn = dirNodeCheck; } checkFn( "parentNode", part, doneName, checkSet, nodeCheck, isXML ); }, "~": function( checkSet, part, isXML ) { var nodeCheck, doneName = done++, checkFn = dirCheck; if ( typeof part === "string" && !rNonWord.test( part ) ) { part = part.toLowerCase(); nodeCheck = part; checkFn = dirNodeCheck; } checkFn( "previousSibling", part, doneName, checkSet, nodeCheck, isXML ); } }, find: { ID: function( match, context, isXML ) { if ( typeof context.getElementById !== "undefined" && !isXML ) { var m = context.getElementById(match[1]); // Check parentNode to catch when Blackberry 4.6 returns // nodes that are no longer in the document #6963 return m && m.parentNode ? [m] : []; } }, NAME: function( match, context ) { if ( typeof context.getElementsByName !== "undefined" ) { var ret = [], results = context.getElementsByName( match[1] ); for ( var i = 0, l = results.length; i < l; i++ ) { if ( results[i].getAttribute("name") === match[1] ) { ret.push( results[i] ); } } return ret.length === 0 ? null : ret; } }, TAG: function( match, context ) { if ( typeof context.getElementsByTagName !== "undefined" ) { return context.getElementsByTagName( match[1] ); } } }, preFilter: { CLASS: function( match, curLoop, inplace, result, not, isXML ) { match = " " + match[1].replace( rBackslash, "" ) + " "; if ( isXML ) { return match; } for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) { if ( elem ) { if ( not ^ (elem.className && (" " + elem.className + " ").replace(/[\t\n\r]/g, " ").indexOf(match) >= 0) ) { if ( !inplace ) { result.push( elem ); } } else if ( inplace ) { curLoop[i] = false; } } } return false; }, ID: function( match ) { return match[1].replace( rBackslash, "" ); }, TAG: function( match, curLoop ) { return match[1].replace( rBackslash, "" ).toLowerCase(); }, CHILD: function( match ) { if ( match[1] === "nth" ) { if ( !match[2] ) { Sizzle.error( match[0] ); } match[2] = match[2].replace(/^\+|\s*/g, ''); // parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6' var test = /(-?)(\d*)(?:n([+\-]?\d*))?/.exec( match[2] === "even" && "2n" || match[2] === "odd" && "2n+1" || !/\D/.test( match[2] ) && "0n+" + match[2] || match[2]); // calculate the numbers (first)n+(last) including if they are negative match[2] = (test[1] + (test[2] || 1)) - 0; match[3] = test[3] - 0; } else if ( match[2] ) { Sizzle.error( match[0] ); } // TODO: Move to normal caching system match[0] = done++; return match; }, ATTR: function( match, curLoop, inplace, result, not, isXML ) { var name = match[1] = match[1].replace( rBackslash, "" ); if ( !isXML && Expr.attrMap[name] ) { match[1] = Expr.attrMap[name]; } // Handle if an un-quoted value was used match[4] = ( match[4] || match[5] || "" ).replace( rBackslash, "" ); if ( match[2] === "~=" ) { match[4] = " " + match[4] + " "; } return match; }, PSEUDO: function( match, curLoop, inplace, result, not ) { if ( match[1] === "not" ) { // If we're dealing with a complex expression, or a simple one if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) { match[3] = Sizzle(match[3], null, null, curLoop); } else { var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not); if ( !inplace ) { result.push.apply( result, ret ); } return false; } } else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) { return true; } return match; }, POS: function( match ) { match.unshift( true ); return match; } }, filters: { enabled: function( elem ) { return elem.disabled === false && elem.type !== "hidden"; }, disabled: function( elem ) { return elem.disabled === true; }, checked: function( elem ) { return elem.checked === true; }, selected: function( elem ) { // Accessing this property makes selected-by-default // options in Safari work properly if ( elem.parentNode ) { elem.parentNode.selectedIndex; } return elem.selected === true; }, parent: function( elem ) { return !!elem.firstChild; }, empty: function( elem ) { return !elem.firstChild; }, has: function( elem, i, match ) { return !!Sizzle( match[3], elem ).length; }, header: function( elem ) { return (/h\d/i).test( elem.nodeName ); }, text: function( elem ) { var attr = elem.getAttribute( "type" ), type = elem.type; // IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc) // use getAttribute instead to test this case return elem.nodeName.toLowerCase() === "input" && "text" === type && ( attr === type || attr === null ); }, radio: function( elem ) { return elem.nodeName.toLowerCase() === "input" && "radio" === elem.type; }, checkbox: function( elem ) { return elem.nodeName.toLowerCase() === "input" && "checkbox" === elem.type; }, file: function( elem ) { return elem.nodeName.toLowerCase() === "input" && "file" === elem.type; }, password: function( elem ) { return elem.nodeName.toLowerCase() === "input" && "password" === elem.type; }, submit: function( elem ) { var name = elem.nodeName.toLowerCase(); return (name === "input" || name === "button") && "submit" === elem.type; }, image: function( elem ) { return elem.nodeName.toLowerCase() === "input" && "image" === elem.type; }, reset: function( elem ) { var name = elem.nodeName.toLowerCase(); return (name === "input" || name === "button") && "reset" === elem.type; }, button: function( elem ) { var name = elem.nodeName.toLowerCase(); return name === "input" && "button" === elem.type || name === "button"; }, input: function( elem ) { return (/input|select|textarea|button/i).test( elem.nodeName ); }, focus: function( elem ) { return elem === elem.ownerDocument.activeElement; } }, setFilters: { first: function( elem, i ) { return i === 0; }, last: function( elem, i, match, array ) { return i === array.length - 1; }, even: function( elem, i ) { return i % 2 === 0; }, odd: function( elem, i ) { return i % 2 === 1; }, lt: function( elem, i, match ) { return i < match[3] - 0; }, gt: function( elem, i, match ) { return i > match[3] - 0; }, nth: function( elem, i, match ) { return match[3] - 0 === i; }, eq: function( elem, i, match ) { return match[3] - 0 === i; } }, filter: { PSEUDO: function( elem, match, i, array ) { var name = match[1], filter = Expr.filters[ name ]; if ( filter ) { return filter( elem, i, match, array ); } else if ( name === "contains" ) { return (elem.textContent || elem.innerText || getText([ elem ]) || "").indexOf(match[3]) >= 0; } else if ( name === "not" ) { var not = match[3]; for ( var j = 0, l = not.length; j < l; j++ ) { if ( not[j] === elem ) { return false; } } return true; } else { Sizzle.error( name ); } }, CHILD: function( elem, match ) { var first, last, doneName, parent, cache, count, diff, type = match[1], node = elem; switch ( type ) { case "only": case "first": while ( (node = node.previousSibling) ) { if ( node.nodeType === 1 ) { return false; } } if ( type === "first" ) { return true; } node = elem; /* falls through */ case "last": while ( (node = node.nextSibling) ) { if ( node.nodeType === 1 ) { return false; } } return true; case "nth": first = match[2]; last = match[3]; if ( first === 1 && last === 0 ) { return true; } doneName = match[0]; parent = elem.parentNode; if ( parent && (parent[ expando ] !== doneName || !elem.nodeIndex) ) { count = 0; for ( node = parent.firstChild; node; node = node.nextSibling ) { if ( node.nodeType === 1 ) { node.nodeIndex = ++count; } } parent[ expando ] = doneName; } diff = elem.nodeIndex - last; if ( first === 0 ) { return diff === 0; } else { return ( diff % first === 0 && diff / first >= 0 ); } } }, ID: function( elem, match ) { return elem.nodeType === 1 && elem.getAttribute("id") === match; }, TAG: function( elem, match ) { return (match === "*" && elem.nodeType === 1) || !!elem.nodeName && elem.nodeName.toLowerCase() === match; }, CLASS: function( elem, match ) { return (" " + (elem.className || elem.getAttribute("class")) + " ") .indexOf( match ) > -1; }, ATTR: function( elem, match ) { var name = match[1], result = Sizzle.attr ? Sizzle.attr( elem, name ) : Expr.attrHandle[ name ] ? Expr.attrHandle[ name ]( elem ) : elem[ name ] != null ? elem[ name ] : elem.getAttribute( name ), value = result + "", type = match[2], check = match[4]; return result == null ? type === "!=" : !type && Sizzle.attr ? result != null : type === "=" ? value === check : type === "*=" ? value.indexOf(check) >= 0 : type === "~=" ? (" " + value + " ").indexOf(check) >= 0 : !check ? value && result !== false : type === "!=" ? value !== check : type === "^=" ? value.indexOf(check) === 0 : type === "$=" ? value.substr(value.length - check.length) === check : type === "|=" ? value === check || value.substr(0, check.length + 1) === check + "-" : false; }, POS: function( elem, match, i, array ) { var name = match[2], filter = Expr.setFilters[ name ]; if ( filter ) { return filter( elem, i, match, array ); } } } }; var origPOS = Expr.match.POS, fescape = function(all, num){ return "\\" + (num - 0 + 1); }; for ( var type in Expr.match ) { Expr.match[ type ] = new RegExp( Expr.match[ type ].source + (/(?![^\[]*\])(?![^\(]*\))/.source) ); Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source.replace(/\\(\d+)/g, fescape) ); } // Expose origPOS // "global" as in regardless of relation to brackets/parens Expr.match.globalPOS = origPOS; var makeArray = function( array, results ) { array = Array.prototype.slice.call( array, 0 ); if ( results ) { results.push.apply( results, array ); return results; } return array; }; // Perform a simple check to determine if the browser is capable of // converting a NodeList to an array using builtin methods. // Also verifies that the returned array holds DOM nodes // (which is not the case in the Blackberry browser) try { Array.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType; // Provide a fallback method if it does not work } catch( e ) { makeArray = function( array, results ) { var i = 0, ret = results || []; if ( toString.call(array) === "[object Array]" ) { Array.prototype.push.apply( ret, array ); } else { if ( typeof array.length === "number" ) { for ( var l = array.length; i < l; i++ ) { ret.push( array[i] ); } } else { for ( ; array[i]; i++ ) { ret.push( array[i] ); } } } return ret; }; } var sortOrder, siblingCheck; if ( document.documentElement.compareDocumentPosition ) { sortOrder = function( a, b ) { if ( a === b ) { hasDuplicate = true; return 0; } if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) { return a.compareDocumentPosition ? -1 : 1; } return a.compareDocumentPosition(b) & 4 ? -1 : 1; }; } else { sortOrder = function( a, b ) { // The nodes are identical, we can exit early if ( a === b ) { hasDuplicate = true; return 0; // Fallback to using sourceIndex (in IE) if it's available on both nodes } else if ( a.sourceIndex && b.sourceIndex ) { return a.sourceIndex - b.sourceIndex; } var al, bl, ap = [], bp = [], aup = a.parentNode, bup = b.parentNode, cur = aup; // If the nodes are siblings (or identical) we can do a quick check if ( aup === bup ) { return siblingCheck( a, b ); // If no parents were found then the nodes are disconnected } else if ( !aup ) { return -1; } else if ( !bup ) { return 1; } // Otherwise they're somewhere else in the tree so we need // to build up a full list of the parentNodes for comparison while ( cur ) { ap.unshift( cur ); cur = cur.parentNode; } cur = bup; while ( cur ) { bp.unshift( cur ); cur = cur.parentNode; } al = ap.length; bl = bp.length; // Start walking down the tree looking for a discrepancy for ( var i = 0; i < al && i < bl; i++ ) { if ( ap[i] !== bp[i] ) { return siblingCheck( ap[i], bp[i] ); } } // We ended someplace up the tree so do a sibling check return i === al ? siblingCheck( a, bp[i], -1 ) : siblingCheck( ap[i], b, 1 ); }; siblingCheck = function( a, b, ret ) { if ( a === b ) { return ret; } var cur = a.nextSibling; while ( cur ) { if ( cur === b ) { return -1; } cur = cur.nextSibling; } return 1; }; } // Check to see if the browser returns elements by name when // querying by getElementById (and provide a workaround) (function(){ // We're going to inject a fake input element with a specified name var form = document.createElement("div"), id = "script" + (new Date()).getTime(), root = document.documentElement; form.innerHTML = ""; // Inject it into the root element, check its status, and remove it quickly root.insertBefore( form, root.firstChild ); // The workaround has to do additional checks after a getElementById // Which slows things down for other browsers (hence the branching) if ( document.getElementById( id ) ) { Expr.find.ID = function( match, context, isXML ) { if ( typeof context.getElementById !== "undefined" && !isXML ) { var m = context.getElementById(match[1]); return m ? m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ? [m] : undefined : []; } }; Expr.filter.ID = function( elem, match ) { var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id"); return elem.nodeType === 1 && node && node.nodeValue === match; }; } root.removeChild( form ); // release memory in IE root = form = null; })(); (function(){ // Check to see if the browser returns only elements // when doing getElementsByTagName("*") // Create a fake element var div = document.createElement("div"); div.appendChild( document.createComment("") ); // Make sure no comments are found if ( div.getElementsByTagName("*").length > 0 ) { Expr.find.TAG = function( match, context ) { var results = context.getElementsByTagName( match[1] ); // Filter out possible comments if ( match[1] === "*" ) { var tmp = []; for ( var i = 0; results[i]; i++ ) { if ( results[i].nodeType === 1 ) { tmp.push( results[i] ); } } results = tmp; } return results; }; } // Check to see if an attribute returns normalized href attributes div.innerHTML = ""; if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" && div.firstChild.getAttribute("href") !== "#" ) { Expr.attrHandle.href = function( elem ) { return elem.getAttribute( "href", 2 ); }; } // release memory in IE div = null; })(); if ( document.querySelectorAll ) { (function(){ var oldSizzle = Sizzle, div = document.createElement("div"), id = "__sizzle__"; div.innerHTML = "

"; // Safari can't handle uppercase or unicode characters when // in quirks mode. if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) { return; } Sizzle = function( query, context, extra, seed ) { context = context || document; // Only use querySelectorAll on non-XML documents // (ID selectors don't work in non-HTML documents) if ( !seed && !Sizzle.isXML(context) ) { // See if we find a selector to speed up var match = /^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec( query ); if ( match && (context.nodeType === 1 || context.nodeType === 9) ) { // Speed-up: Sizzle("TAG") if ( match[1] ) { return makeArray( context.getElementsByTagName( query ), extra ); // Speed-up: Sizzle(".CLASS") } else if ( match[2] && Expr.find.CLASS && context.getElementsByClassName ) { return makeArray( context.getElementsByClassName( match[2] ), extra ); } } if ( context.nodeType === 9 ) { // Speed-up: Sizzle("body") // The body element only exists once, optimize finding it if ( query === "body" && context.body ) { return makeArray( [ context.body ], extra ); // Speed-up: Sizzle("#ID") } else if ( match && match[3] ) { var elem = context.getElementById( match[3] ); // Check parentNode to catch when Blackberry 4.6 returns // nodes that are no longer in the document #6963 if ( elem && elem.parentNode ) { // Handle the case where IE and Opera return items // by name instead of ID if ( elem.id === match[3] ) { return makeArray( [ elem ], extra ); } } else { return makeArray( [], extra ); } } try { return makeArray( context.querySelectorAll(query), extra ); } catch(qsaError) {} // qSA works strangely on Element-rooted queries // We can work around this by specifying an extra ID on the root // and working up from there (Thanks to Andrew Dupont for the technique) // IE 8 doesn't work on object elements } else if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) { var oldContext = context, old = context.getAttribute( "id" ), nid = old || id, hasParent = context.parentNode, relativeHierarchySelector = /^\s*[+~]/.test( query ); if ( !old ) { context.setAttribute( "id", nid ); } else { nid = nid.replace( /'/g, "\\$&" ); } if ( relativeHierarchySelector && hasParent ) { context = context.parentNode; } try { if ( !relativeHierarchySelector || hasParent ) { return makeArray( context.querySelectorAll( "[id='" + nid + "'] " + query ), extra ); } } catch(pseudoError) { } finally { if ( !old ) { oldContext.removeAttribute( "id" ); } } } } return oldSizzle(query, context, extra, seed); }; for ( var prop in oldSizzle ) { Sizzle[ prop ] = oldSizzle[ prop ]; } // release memory in IE div = null; })(); } (function(){ var html = document.documentElement, matches = html.matchesSelector || html.mozMatchesSelector || html.webkitMatchesSelector || html.msMatchesSelector; if ( matches ) { // Check to see if it's possible to do matchesSelector // on a disconnected node (IE 9 fails this) var disconnectedMatch = !matches.call( document.createElement( "div" ), "div" ), pseudoWorks = false; try { // This should fail with an exception // Gecko does not error, returns false instead matches.call( document.documentElement, "[test!='']:sizzle" ); } catch( pseudoError ) { pseudoWorks = true; } Sizzle.matchesSelector = function( node, expr ) { // Make sure that attribute selectors are quoted expr = expr.replace(/\=\s*([^'"\]]*)\s*\]/g, "='$1']"); if ( !Sizzle.isXML( node ) ) { try { if ( pseudoWorks || !Expr.match.PSEUDO.test( expr ) && !/!=/.test( expr ) ) { var ret = matches.call( node, expr ); // IE 9's matchesSelector returns false on disconnected nodes if ( ret || !disconnectedMatch || // As well, disconnected nodes are said to be in a document // fragment in IE 9, so check for that node.document && node.document.nodeType !== 11 ) { return ret; } } } catch(e) {} } return Sizzle(expr, null, null, [node]).length > 0; }; } })(); (function(){ var div = document.createElement("div"); div.innerHTML = "
"; // Opera can't find a second classname (in 9.6) // Also, make sure that getElementsByClassName actually exists if ( !div.getElementsByClassName || div.getElementsByClassName("e").length === 0 ) { return; } // Safari caches class attributes, doesn't catch changes (in 3.2) div.lastChild.className = "e"; if ( div.getElementsByClassName("e").length === 1 ) { return; } Expr.order.splice(1, 0, "CLASS"); Expr.find.CLASS = function( match, context, isXML ) { if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) { return context.getElementsByClassName(match[1]); } }; // release memory in IE div = null; })(); function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { for ( var i = 0, l = checkSet.length; i < l; i++ ) { var elem = checkSet[i]; if ( elem ) { var match = false; elem = elem[dir]; while ( elem ) { if ( elem[ expando ] === doneName ) { match = checkSet[elem.sizset]; break; } if ( elem.nodeType === 1 && !isXML ){ elem[ expando ] = doneName; elem.sizset = i; } if ( elem.nodeName.toLowerCase() === cur ) { match = elem; break; } elem = elem[dir]; } checkSet[i] = match; } } } function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { for ( var i = 0, l = checkSet.length; i < l; i++ ) { var elem = checkSet[i]; if ( elem ) { var match = false; elem = elem[dir]; while ( elem ) { if ( elem[ expando ] === doneName ) { match = checkSet[elem.sizset]; break; } if ( elem.nodeType === 1 ) { if ( !isXML ) { elem[ expando ] = doneName; elem.sizset = i; } if ( typeof cur !== "string" ) { if ( elem === cur ) { match = true; break; } } else if ( Sizzle.filter( cur, [elem] ).length > 0 ) { match = elem; break; } } elem = elem[dir]; } checkSet[i] = match; } } } if ( document.documentElement.contains ) { Sizzle.contains = function( a, b ) { return a !== b && (a.contains ? a.contains(b) : true); }; } else if ( document.documentElement.compareDocumentPosition ) { Sizzle.contains = function( a, b ) { return !!(a.compareDocumentPosition(b) & 16); }; } else { Sizzle.contains = function() { return false; }; } Sizzle.isXML = function( elem ) { // documentElement is verified for cases where it doesn't yet exist // (such as loading iframes in IE - #4833) var documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement; return documentElement ? documentElement.nodeName !== "HTML" : false; }; var posProcess = function( selector, context, seed ) { var match, tmpSet = [], later = "", root = context.nodeType ? [context] : context; // Position selectors must be done after the filter // And so must :not(positional) so we move all PSEUDOs to the end while ( (match = Expr.match.PSEUDO.exec( selector )) ) { later += match[0]; selector = selector.replace( Expr.match.PSEUDO, "" ); } selector = Expr.relative[selector] ? selector + "*" : selector; for ( var i = 0, l = root.length; i < l; i++ ) { Sizzle( selector, root[i], tmpSet, seed ); } return Sizzle.filter( later, tmpSet ); }; // EXPOSE // Override sizzle attribute retrieval Sizzle.attr = jQuery.attr; Sizzle.selectors.attrMap = {}; jQuery.find = Sizzle; jQuery.expr = Sizzle.selectors; jQuery.expr[":"] = jQuery.expr.filters; jQuery.unique = Sizzle.uniqueSort; jQuery.text = Sizzle.getText; jQuery.isXMLDoc = Sizzle.isXML; jQuery.contains = Sizzle.contains; })(); var runtil = /Until$/, rparentsprev = /^(?:parents|prevUntil|prevAll)/, // Note: This RegExp should be improved, or likely pulled from Sizzle rmultiselector = /,/, isSimple = /^.[^:#\[\.,]*$/, slice = Array.prototype.slice, POS = jQuery.expr.match.globalPOS, // methods guaranteed to produce a unique set when starting from a unique set guaranteedUnique = { children: true, contents: true, next: true, prev: true }; jQuery.fn.extend({ find: function( selector ) { var self = this, i, l; if ( typeof selector !== "string" ) { return jQuery( selector ).filter(function() { for ( i = 0, l = self.length; i < l; i++ ) { if ( jQuery.contains( self[ i ], this ) ) { return true; } } }); } var ret = this.pushStack( "", "find", selector ), length, n, r; for ( i = 0, l = this.length; i < l; i++ ) { length = ret.length; jQuery.find( selector, this[i], ret ); if ( i > 0 ) { // Make sure that the results are unique for ( n = length; n < ret.length; n++ ) { for ( r = 0; r < length; r++ ) { if ( ret[r] === ret[n] ) { ret.splice(n--, 1); break; } } } } } return ret; }, has: function( target ) { var targets = jQuery( target ); return this.filter(function() { for ( var i = 0, l = targets.length; i < l; i++ ) { if ( jQuery.contains( this, targets[i] ) ) { return true; } } }); }, not: function( selector ) { return this.pushStack( winnow(this, selector, false), "not", selector); }, filter: function( selector ) { return this.pushStack( winnow(this, selector, true), "filter", selector ); }, is: function( selector ) { return !!selector && ( typeof selector === "string" ? // If this is a positional selector, check membership in the returned set // so $("p:first").is("p:last") won't return true for a doc with two "p". POS.test( selector ) ? jQuery( selector, this.context ).index( this[0] ) >= 0 : jQuery.filter( selector, this ).length > 0 : this.filter( selector ).length > 0 ); }, closest: function( selectors, context ) { var ret = [], i, l, cur = this[0]; // Array (deprecated as of jQuery 1.7) if ( jQuery.isArray( selectors ) ) { var level = 1; while ( cur && cur.ownerDocument && cur !== context ) { for ( i = 0; i < selectors.length; i++ ) { if ( jQuery( cur ).is( selectors[ i ] ) ) { ret.push({ selector: selectors[ i ], elem: cur, level: level }); } } cur = cur.parentNode; level++; } return ret; } // String var pos = POS.test( selectors ) || typeof selectors !== "string" ? jQuery( selectors, context || this.context ) : 0; for ( i = 0, l = this.length; i < l; i++ ) { cur = this[i]; while ( cur ) { if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) { ret.push( cur ); break; } else { cur = cur.parentNode; if ( !cur || !cur.ownerDocument || cur === context || cur.nodeType === 11 ) { break; } } } } ret = ret.length > 1 ? jQuery.unique( ret ) : ret; return this.pushStack( ret, "closest", selectors ); }, // Determine the position of an element within // the matched set of elements index: function( elem ) { // No argument, return index in parent if ( !elem ) { return ( this[0] && this[0].parentNode ) ? this.prevAll().length : -1; } // index in selector if ( typeof elem === "string" ) { return jQuery.inArray( this[0], jQuery( elem ) ); } // Locate the position of the desired element return jQuery.inArray( // If it receives a jQuery object, the first element is used elem.jquery ? elem[0] : elem, this ); }, add: function( selector, context ) { var set = typeof selector === "string" ? jQuery( selector, context ) : jQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ), all = jQuery.merge( this.get(), set ); return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ? all : jQuery.unique( all ) ); }, andSelf: function() { return this.add( this.prevObject ); } }); // A painfully simple check to see if an element is disconnected // from a document (should be improved, where feasible). function isDisconnected( node ) { return !node || !node.parentNode || node.parentNode.nodeType === 11; } jQuery.each({ parent: function( elem ) { var parent = elem.parentNode; return parent && parent.nodeType !== 11 ? parent : null; }, parents: function( elem ) { return jQuery.dir( elem, "parentNode" ); }, parentsUntil: function( elem, i, until ) { return jQuery.dir( elem, "parentNode", until ); }, next: function( elem ) { return jQuery.nth( elem, 2, "nextSibling" ); }, prev: function( elem ) { return jQuery.nth( elem, 2, "previousSibling" ); }, nextAll: function( elem ) { return jQuery.dir( elem, "nextSibling" ); }, prevAll: function( elem ) { return jQuery.dir( elem, "previousSibling" ); }, nextUntil: function( elem, i, until ) { return jQuery.dir( elem, "nextSibling", until ); }, prevUntil: function( elem, i, until ) { return jQuery.dir( elem, "previousSibling", until ); }, siblings: function( elem ) { return jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem ); }, children: function( elem ) { return jQuery.sibling( elem.firstChild ); }, contents: function( elem ) { return jQuery.nodeName( elem, "iframe" ) ? elem.contentDocument || elem.contentWindow.document : jQuery.makeArray( elem.childNodes ); } }, function( name, fn ) { jQuery.fn[ name ] = function( until, selector ) { var ret = jQuery.map( this, fn, until ); if ( !runtil.test( name ) ) { selector = until; } if ( selector && typeof selector === "string" ) { ret = jQuery.filter( selector, ret ); } ret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret; if ( (this.length > 1 || rmultiselector.test( selector )) && rparentsprev.test( name ) ) { ret = ret.reverse(); } return this.pushStack( ret, name, slice.call( arguments ).join(",") ); }; }); jQuery.extend({ filter: function( expr, elems, not ) { if ( not ) { expr = ":not(" + expr + ")"; } return elems.length === 1 ? jQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] : jQuery.find.matches(expr, elems); }, dir: function( elem, dir, until ) { var matched = [], cur = elem[ dir ]; while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) { if ( cur.nodeType === 1 ) { matched.push( cur ); } cur = cur[dir]; } return matched; }, nth: function( cur, result, dir, elem ) { result = result || 1; var num = 0; for ( ; cur; cur = cur[dir] ) { if ( cur.nodeType === 1 && ++num === result ) { break; } } return cur; }, sibling: function( n, elem ) { var r = []; for ( ; n; n = n.nextSibling ) { if ( n.nodeType === 1 && n !== elem ) { r.push( n ); } } return r; } }); // Implement the identical functionality for filter and not function winnow( elements, qualifier, keep ) { // Can't pass null or undefined to indexOf in Firefox 4 // Set to 0 to skip string check qualifier = qualifier || 0; if ( jQuery.isFunction( qualifier ) ) { return jQuery.grep(elements, function( elem, i ) { var retVal = !!qualifier.call( elem, i, elem ); return retVal === keep; }); } else if ( qualifier.nodeType ) { return jQuery.grep(elements, function( elem, i ) { return ( elem === qualifier ) === keep; }); } else if ( typeof qualifier === "string" ) { var filtered = jQuery.grep(elements, function( elem ) { return elem.nodeType === 1; }); if ( isSimple.test( qualifier ) ) { return jQuery.filter(qualifier, filtered, !keep); } else { qualifier = jQuery.filter( qualifier, filtered ); } } return jQuery.grep(elements, function( elem, i ) { return ( jQuery.inArray( elem, qualifier ) >= 0 ) === keep; }); } function createSafeFragment( document ) { var list = nodeNames.split( "|" ), safeFrag = document.createDocumentFragment(); if ( safeFrag.createElement ) { while ( list.length ) { safeFrag.createElement( list.pop() ); } } return safeFrag; } var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|" + "header|hgroup|mark|meter|nav|output|progress|section|summary|time|video", rinlinejQuery = / jQuery\d+="(?:\d+|null)"/g, rleadingWhitespace = /^\s+/, rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig, rtagName = /<([\w:]+)/, rtbody = /]", "i"), // checked="checked" or checked rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i, rscriptType = /\/(java|ecma)script/i, rcleanScript = /^\s*", "" ], legend: [ 1, "
", "
" ], thead: [ 1, "", "
" ], tr: [ 2, "", "
" ], td: [ 3, "", "
" ], col: [ 2, "", "
" ], area: [ 1, "", "" ], _default: [ 0, "", "" ] }, safeFragment = createSafeFragment( document ); wrapMap.optgroup = wrapMap.option; wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; wrapMap.th = wrapMap.td; // IE can't serialize and

uw}= lߤ?q7n;x<ݹ z5p|sg0>n='|7mCxC_"{(VAp{j>U@{ȶOl 7y{gq̓6~ 76w6z0sﺴvY>  PgЗ8@w^~~:N~P[Z@؉E}A 9}a0>'~~x϶7xW:arorҍ߽*FWiot2]6ùvOy}>/Nt3g赀 x IjA ]]Iə6l@Q f~3ߟT|7vCno ۋQ 7^1.nAdwZ8kgz8 ^7uwCIӽAx> ~[3 x qu=@Z l{v曝/:B,∛Wp͑Wp+.`lz^>ҝXǛ;W>O~a{ݠ7mCxCo  > v_:{ӧxkRe6!>N7v> o~6OfS~g;g= Gs^9>{i3U{d7mCxCoݣ@w'<>}lBnusAn{{f;m\!2fg4n}-4-jus϶f[@\>JGo%^~ߋ- W{ݡ7mCxCov{~:rvt81 CŦ `^X^0W@{HYsx]MZV}>9ht'OwY:nBo<ۆ^g&== Ɔ6)h+j5֖?`n&gו L 3k3WLy_o"$he໳9KG97z647:U2Ww`]Wk#өv93wj۩JzsG6r'9RSc:8^_`ǭ,ԗꜳ"6 2/ߙ7Ք9|#+K}S'&;Ao<ۆ^'=}~C|:sctu%;{e`dmn&%s h7f0kːJ{A~L+W }fׄfs}nќyNV໮'ugZg G7= vt>mAV@;r Z,({ۛ\l)W^[߹3WY7f2v:2 A}沥 z/0O'=|ۣ| |'/=Aoޫx ~|M7^:A;knt Br8e2x3[eRrn7wLs)/3v”VbO u3DҬko͜~yVnu>}BoohoKx v%̇2W׏; 1ASA2K!g-ոB7 lI25{_]xNE[ZK SEb-ϭ|Sw}S2ݪ_{{=2ƳmhoޫuKW:ߺo88Ep땕nN&&wPNF w65[$v@ltqLpN+`=iy=GFMgWʞ zA,b닦<_oX>2;֯=tχA56dzmho1JwiO?+72؝ݞ;m]mJe24q?S҂v<ғY79ha~] ]4i!-%} P𤅂~fsݘdo-uƔgMn[]V蝴Iݍ_|z3Xaw_`]ۜoЧS[Aw|Zl^t9%SNn)9>N֙eY=;KXW@$|8+a+^2M0B/s.LW)NdT0fR2ց7=+LDۇzӛ+.ޫry647RY@M&#5}yvD tf<2ȹa}ÍF9pPެg|?tKrꪌ,A\(`' Wr}__"5sy̛N3my_nh2ilz ;Kgʣn-aS}WaμuZ҃@& ezSIPrurIv\F%+*w›7yx!` 2-”ߧxL<ZJK% # >릩}2\^VQzkN&5?k.mgރJ/ܼP=[̗ x۸`xn__t3ARΤifа /: $w$[vi^. +yhWLRdjH"hk2MjI!VW9%gW}7OSU[˛лlӵ>/<|,.o<ۆ^# ~sg`/}}Χ`3ZL2̼/UҺly=MrEd: tɤaKYpsޭsi+a܄Ĭ5!@L]$%1V(0)x R2ZX}wl1Bpl.ڬĩe)àw8憎,U7 x-eW@X}~hv:e a|C7\(ZZANd% 8hId4cpCëpL S4D* tudzdP߷R*aM”Ɛ2*z@ﺥkCo<ۆK~mN,I켛5%>}W-N(W鐑K !>!Vfu7-{o+2bog/$۵(HDV3414G*iJ* h+2TJYLQ-ʙƸJX(۫8 =Y־àwUNﺥ7 x3Sʼng?D <vN3*e.< `4ZZt 3xҺqr |p.PH2-yޘ{['9Mcʹ]⼿()!X&+SLL dH>0%ք>2Uno^2s f .ׁ[U.oohoukuwk.ƳNr6tO ` Ind02 0V@`ɚʔσ<,g a?wN $D&?@ ' C͚bf)d*%Ff2u?̢X# ۞ˆXV=67mCxCxvwow/c˻'oe̵oN? {;3~fnl a4\\]:DMcX־\w%C;οv)b{VMJ\WRT.R $ 𤔰C77e=rR}o~iQ\_!4]KC*7zg֬nέJ+" ηNZh䖴tlA.Q *aE՛Kд?eڶVCh +-Vѓq] .{-n-eN[3nt?2&e X\kJUZShrC&%2v8B97P ; DnάAJ kPf/Ӑ+hY%|>EPXˡb̈)iʚ-Y*ڄ27m}=ji3qklz2vo9C]VD·S O8 ZjBsz.3*Gl:#\&JnXʝ2%vpKd>.=ʖvg ѥV' (Hz}UD#k4ʔ)#1itm-޾{IQe6ώ3_z=Kg^ {v6桻;m͎"(ϗ8?vnA m\1a"Z6eaZ2BQ`XAeZ@3Y H@Knp:sbv9vͭ,3$eWf )emW2$#Ȉ7ΚmDf[g Tx!02<]=Ґ-ݶyUys?~e. ^uYs<ۆ^ ^Mel2E>|nĭl+,&o V!r; wVY˛i4š))t0idV3Y98.C.0# $Z0,wyARPE*eYT=ūė, .˦&[:Zu)3QNN sx)!̶+<:3t]϶ ]Eww'mkovaTnv2M4fM+Ζj`J6xl^R̍rְD$Y+伜!eA$u`2wٺKsiy:3"7YB@H4R\?*UTژBvF9;o'nZxCxC]V2}&1Z'dGNNǣ6hμz]wY_ gAtEEAg> 2tr>)SK3 $3ԫXAoqsBjDEMn.˺p_ڜYpsV\^5+wհ>ݝn-mqnRkk)h &r3#6zv` Zsetd#`@Aw[EtՐsT!SC[I+*Qz>$:Jʘ2Eɪ"dH-P&@" u0SH $tH),{Ñ DJȾ^V%``n}`Wv{;OϞ̩eekƳmhoǷә'yY93gmv)ڬm6vi6Y7+~Xf]6$3[IkpNP3h2 qoJ4En0R\@.jc^ESe @1SA֔̚ f"b:Kiq}kDgP[BPѵ4;c=Y2"м_[~iSn 0ޔWʚxCxCo8 ^S.+gf}Z#&x[׃C*Nv-徃ރ`gh1k8d07]U2i+`N[zZg\޹*.fV~rMjۖJ;!BBLE֢eP=@fH"{ ~BO3^=;# u%*Dѻ+-0.eD5r'%ػu5>cޫDy)͌½&y''w$&;84)Y!47̍haGɜZAV+ڰB_ FZe@TFؕ4s<=%#hB%$d 0+d.eJJ0L2RHP,3CWZ3ak99 )' QGjsyNZ.sJ\ޭ}e3,UTVN|)U<&1S*iPJ>BB*On=ٳG--Ca=aҿKvqOKn)1f(enO @>+xCxC+V=/gOu|䳻My4WSCvKQھ3&܅ӲsԢy4w`Qt5's6%NC# >מrFRow/:=y;zDЪIXO}&g_Og~Tu VYN!xKZ!"3 Q{Y :r)1 Q;!A0Ҷki3JΝ-3 ܮ.O:ʹLۮ=UD᪲uxWNjgУ嬨Oj~vㄾurYL=6RAݡ% `6TgZd.LFV.&o gfy>aTqܻ7{Gʬ_<`%;|qs>>s\.&S@1،xE נ2ҬDmKa $gev,,Tnry@-[ròmk ;ߝf(ٶm:,g*afMEp Wo;Z ksw`lXӘ0ېX?v>s)egGffje̬r{UgO~+X} ;WmO@[~/:2<VE}|w\|s%@}E"3DDf[KevAOiqy`+2fb)|,̲?"fɓM_/(Xx^鉓xCxCxf`U36.wPaU$OəmNiXMFS47`6t',`PLY#k͘AF'wy_{zl9:|-{ W)? g(9?,Ƌ}C,'5kMXJFe'͵^3{~RH̾6PIik''d;YxƮ?wX ^òaЛVkaLlknuwLwrjl11w0S.22a6J^ %jitE0smΞ/§cm7U^Pc> /;?_M+礓.)ʔ5+rw<#=Q2{5Iֵuj}R_]^Zzu&<3[SPPײfTKY\79747zoܳZkIM٘MImn1O_άRss"25vIF䀛l" vuZt47l^mϞM/ 7nE+jOߓл_ $*g" D9)DGh^`@S. `YuâuC0Jh}^W•e-[eO7647jwaB-\h߿l88:m#?[U`j`y3-₻Kgsay]pwR&)M#iH|y:#4~;_IC3o |gބ_g l ?i/XN(ALeDOdHYι-JɜKNe(1wpfC(B}xE#;ò&x~֔[t~"oF ,𰁕w ]- Mm:ӈvNIIps`\R$dl^i O\fւ5g͸"f\ݬyi4=?W-+; ſ U8 6?E7֒f2Lz֥X`SYT(4P9YR:=YB5SMnZ:}up+hsG/yw~zh~ֶnrfk&*Eod\74z6r"}Z˙U,'Gd@#m9+P}=s'5̬@afO+/}k*w~ K{>o^ cg"sZ^PTdAHW:թޑgG ˕tH}uX}ofL}{#Ixlgub7N'-~Rd67tG˩V87M5M#& xXVqr@oэ`Kߎp3яNj/~h0Mmj KMp=W z)/դfk;\^֭e[\gad$u$"[&5!01Cs@Y8?w'5"^7_6|nw2\iiK&q6~>b\z~Vkk4k4-'ݍw<׽36́㧀 _/qR}OB dF*gW"2˄fWP%H,iF[Yâʖ,fs+f0㠬|[wf\}[я^cxCxC'[+ ͻӑݺȣhKݰf}2,,mZluԕ&ɥ&gԤ$Fr2zui&7n`ho ''5B[zv, x0_+%' F ^/ (HO Z,5Yg*03U(=@NlhבX~/g f[AȺ+,><f]}RY W#]6MzC?m&ݻa{u@8eG&ZoZ[b5bP*qag3֤P/gGfF3ں=G̜p;/mgw/ځ;#l?K)@vv./dJa6ؕ9Wn)iǨ,^P[$f*:$}u)dHͼƹ(>&5,2xk$aߝ ^$\=m5rn)`ͥ]|rI3>6iB54T׼]Mi^F{L_~߻VNU̾\Sʌ@LZ̞U\Xԗ@r{ãŲfVPϴ>Zl_52eZtV4a?|>747t=(t ݽe~8uJ/oG] lk&NktL$j:JOXwPy32/GaF3ӳgԀ?g: |7܏ggma>](T_l`Qj.Rʞ9<ЉQe܂;#1WppяgO͛W䝧2^]:?򍶾<X!ad69sZʛܖ9wAs7#&*SE-2a]/=w?7wc?Cvw?qOݦkLZ&7kbs)kZ2́%+7ש#m+S$u f]ݺIlDzohouoݳn:Onz6̜Óٴ[M |ٟlKqhX@Mj0+p^MkFNun-;[w^~t}'>?^˻y/iS\Iv5.H@tfz0geOԼ< (18{d,\Y Ȟ]xk07747o?wrRl YQC*Fru <3N 7:Uh宄_|G9747Xwݵbkmݮ <,[EDKO d9wg󁕥Ynw ߀ovw;? L?Dy}Zʌ [s2{Tn#VPF3Q@)Hu 3D`6wa08{W&6s?xܧ9747Zw-OO!g^sRO}Y3xXܴMk@sOnTT&6ˎ fY ,vuRNO /*v~|[[4?|\SO?jT:+r^aJlՓ98Й1 9Ko9;9S39oS@tuwxCxCo$G)r:>jëm+W Y]9_G@)Fְ/{4W''t_"[OnhkIr3oVjLl%mw=;}<`b^g3;fW/`qЗ,6]mn\æg\΁͈ d5,Ue  xh%Ҿ?_z/p'>\f{ ifx؊UGd!:8SKqk8%l sZ :6<ޚ[uqp~~1z~;?_?(cݩC/e *h~)xP 쀗xˎMu3Qw7Vw;rs$gSbؘ[NHof1DN٬yr"4Չ ֭:dMj.M4??V ]-ګ4K槾8?%'> /gO~Bz(X# 32#Y;x\LXee UTaP4iksϼN0<^7.^羵}vIAgsn;2Ֆ*{d@7pk.k$kPelxeŘooM  W%/b _=c]%z X6Ա׺ps&xAGgbХVsy3Jɹ[oݥm[d> =I?Ȏf3Xl &u'Ը.c34qY'PW6/WMh``n=dF^ԶG)Qt5N`CW8rL9yrsgjmVDa8U ^>ubȺ`VC+N֓ݾQu~[[SN>?SOşxdJ#a<Œ99\+8Ut͖Qg^ʘʹz"f߹C^'80:~vkxy$RxCxC_k'u MLv6M2%mjSd}S <(gGc &[b \wu$i6Χ3 p3k򦛱{+$&̷R$G/:m~v;ii#օ{+̎\ԌyY+ lgft s'g uhSεLfvu0%Si3k=v'枅]3 nk}=|uiAxsnĆb#9ɖRޔdd@M664zu`ex5q oGoww/?xgǐ;xz)A=) iN4'sFG #{i[AqKe,P2 QʐmS0G=Oo e !>O+<>zgnwrz {rfsxfݬi &wl5 :jju M}6h|nMmZY.&K;Ͼp)[ O.>9#_De*:ʾ4cqsz 3Cs=ia):B;Hg8Kz݀ڽ#[}Mtֶ5rb4!؜湔1&'lkpu+q 6YO˰nn.78}>MCux\|~fsT{/}M?2*l^1Բ(zY _dvfIi Ϊ?uNK *v32I2"ԽFv[VnFߜ-++7"Gsoho^%| Mޗ}ɓi[L76gZkV9-3WՋ1Gm>j&`6ㄽJjw߷%ml|=_eGQ3 '+k\F-F"S^IPnWάջ L1wpVb^v3n].:Y3YMhȼ{l-WEeAL^;Sm`-5(綺< tx9>79s3yk+^wKI ?OfF& ,+B۝fqWMoJtUD!r&]PXbֲ'Sm[n,wdB}ux,~H dcޫ _69qlaycLM}_~W*eݻk.Y.V$U laFG.=r9-B em_ eږWzhnOI*77476?m"4i#X8MS+GrwOtM6*kW.likfFpy+_ʳ?{mJϠvm?i5?B|o~9r٠5|)Mdڶ%swUVR1,ƜDXR -Dh=|5׿y+Ľ80x>u )i按}rPfҽ1'&m\u+W7QuNM.ф`a#itsW";K P-o^Pkٝ?w2QL2!dԑJe2U IUgt jR3$tS0C93X3pa9 998^E7lsވc5-mIdm(4' *V aMf:8wyNC#*xN`N-046_' Z71i _J]."8\2"2lY aVkuwxU'.wj=wiٶyn3ݴm[*X9$ =6o[{yMlR3ds gSdN7Ev|v^JKT+-1|`aN֐et`u w>GcA$m wWO ~ߍ_!P? /ݛ?wIJ`R]ʬ 瀐@ C "*W7#;Bf$2, F3~Y9S/IyovVD;.&ttW Tx-q#S$sRCTaeMZrY& , D`NLZn" l`rxRDx =yݲ&Aj^V֜f|d Y[F$EtXMi gzSp.,ǃUDF3˯@M'o{׾Al3|n/xkrsB-IgXRf >xן3^J A%kRafugv5P=Z`p+\?GQ rrUB[Ͼug}fv:%6<͛ڼp1\Vloho}C]M x[ov4WQײ7.h>I-Q.EkOTВ-Wa Rڬ^DCL^+l4"`A3qO OI|_o;n<'p\g"j > ?0)|sГVWdsc*sqyd<"=yv\щٳG&UDTRܝGW,Fݭ1{*V VVk W3}Ø_)Iq4mfx6e{ ni +gCun4EoZViϯמn@+Y[`'npAѬGvۯx^~|EAp |7ոE8z q9i? aA@ڼt=9PUJe0LI@$2LD,0r`hc> Q:Tyt&G}Y:mm*99Tbn=Nyآ< 6bLJiV'>϶TsXx}N HB6Er љQtVe͖520k-+ui"jbkf\TXwl D6sct]fF f f0ZO䙻½wg>~sp8]Π~|16 ff IRP*Rf&L! _P=!1R$z^D0nH1f#60K xra7747o?r&_]^zM}.o߹= X:-([CNf^C1/jz.#O}iۇ>eAvŸszq:$TKT"!(3j>3ep%%+G!KBNed2* %.df&E(msVy5̗6Gz nYs֑wټLi]uȉFp\h cV}>ћQMK ܌M;*mN64$,G&# 0#E'lOdUito˰۩=ڧ9z/YBBՌ:7.YLAe"SB(8;@zdX2wI)3Be+sUfHwwTFf"O1ûG99,:ˢ.S܌=δmӃw0747bRs{=S'kvfG܏'tsӔg\Z6xXrqw 9CWڄ\k` =8EB= 7:jB0rtF(3T!U(H)D<)'ܶ2v;$%!T?*[R%h *A Jd9Cc){V! S+X.Y_u.n~ m]. :I)lȖTzdzn{yYZ'4;+yﲲ&f7nf-ϖ\{ydV+'&M6L#GgKi2n> =Ck2b-`f" 3U$eVF ;%KcoVS:E@ ,IdE>C(:@F&bzm.W@M_+zZ],*aL;R  عJt﫻[UlkJXq^o !NY?,kn^AMimm>Jz >ux5nTrhU钜 )XK 0[wV[l)cҹr)Y掀7FDe]L_Q˄pf1OZA5@xfy$;eDeYo`,'])SP?TY}P;twf]J}Rb[zA_X7xW5Ww _DN2LyiI-0B^}試,Z0Z , 0r̓L+[Wd T60zhvO;p\' Ytב ДJ2@pvAGFC CA%+R&!0tw-"SqUL8ܰr^+ϞϜ{isÞ8_wy֛7us)b Ѳ%ڲył4I&i˂-SyEd S8R֔]|bͩXd L4Txf1 Z,D.`&)`Q0#jw&" .1tA7+cZD0}sBӕm P=,;b am4gn"U7Sޜi5֦ euxJp[\NU?o3s8aaј˞G^ٹ&S4fDA 8DUO\uKvy0 u Jz-*@kuf﫻 Vyr&pEnohoKvly˛"H]ә8 3'm-mj-ajB\zA0j@: -Lv+ KYDmXx +.$6V} KA=S5rUZL@JR&ڊAeMkZ#v3~gxfow>1{ҦE9~^oi'Nd8ș:"E+NJfg8mU c Zyks Js U*_Le&IV*wT;j)*#CPTD/Ž~:SJ$P~ҕ>cWr~뺻6S{3wxCxC xyٍ27ӭͦpDnt<9ٓfflRBo)? =d\aMUv4:MF_u\S,!0ckK*&*% ť4Ա (\]^ )-ʤL$R!/ѳ}ص~f- =L-h=; Tz L͹ $&e澻;#m&3=ur<xCxCx*k^vUi3l 5dҬm[Mj4bۇ^5Ras4M4w V,ͬL˾hZ:`F-k*flUYfS*@[>IlI="zJ;Z#؛֔5D" %h2)=yLd-@ѲH ,>GȖR *Cw34= ׏s'afxY~^n´=fd43O`zkp$k;\z r#DaNYJX6VÞ"@3ԼʚK&%p[tfuL" Th"IKBVP91A&BpsRTFl)0\!mCȖdڷEnڇBq&<=hXտz\.lf#>7 y Mj01e[A'7w( ZOV]}\e˦amXvZɢ7ܗKm٣5PuQU)Ide!I,%ua@g, V_/3Y8d FVo@gd]2};xf3pPO'=.w7747X(e5 wš˳٦{fKi<>r)[:4zxfSGG7|^ݷ3eE &.ÊsNbj SDhݺR_]wd.M֩eEuXB K\zqVA $=춘"+r~] Coe.f#N>_[X'-I[zwht9\:||<^`.UK^Ӛ4 ƴC&΁'\^ּQһoW'P[_[wckrs&TN y= @ȔpJyvco=u;u2v};ogRkqw{;747x8]U[]^lGw7tF=ٜaRc4ĺJlW⬒T 7Z4YZFپ[e-no}d%G=sy<8ßFBե[ʘJ)$ '.]Ծ2`GTlfB٧HWshZ{vMRͻ~)s\{isWsw^ܽ-g =n=fdB/h ڷiI MmRc.6eՋT<*yڲV ŭiJ\fvj{%LE i}U` &U K.a );2[Vo/n)P W2r!`M]q*{wa)sPu\\f~C,E^YSNz%rmNB!)ȫUg1K_'MbQcځ6k^᥄,yOlWIJYߗ)\}i,bpLJEW'}إ*f`˖7XaGJ1Zt쎢8r7͞dyW^ ^y|'ry+[3o?<x5лMD5Zū||2肟|i%-4i]ɒdpe UBY,2!W@MZC]f ,Τ d*;S=v6vI é2 \WC,Л֎,eIṿ0>EEVLp&*\\usgudA,~G XJ0xzI/?4%i)ȱ"z谔"squLjuuuSoJCصMղEmN98!BtwNOJH]}>9e[y{SEM ْk_/ha&haH-ex$#&_i}%i.10j5r{~eWn7Z+suKIrx?Xb: SZG\:gRZd9Zf1/~a^+`zO/Bo-mzs,If[nW8/,o-s!@f@ᗾ Y󵤩-e4yO"s9 T^.N)Svr^r Э}W.~X/nmA]o'SgJ[KO<;{^? 8Wcfd*sVD!l~A0{YpKڥoᒲ^9s)s^L(,}ǠҗrҔY,ڕ)MҺ3a`$;6/ԃJ}>647Z.o-mCo-m^zU.Bynj|_zE$w}ݍfi-NMIz:y5XA%`UEz)hZ<jeX%T \s1lkhBu3[VO;tef꺬@0%֭+ki)fv}?sp.Pv)ZL\A'*L5/]<Ӕ5W̫Jy v)nohoq:.zWީOvcM̖}lIwUig+@Y73(9aۙ.J8;-_Jv n,0NU"ԭ&*S[ $gK]kҴ881nnji޵uU%SwmV7Yln!Gѻ=\CXZl_yɲն ʹnITvZ?wr+f+uْ[Ag,ۺAw*~7uslru*`_<Ӻ{$ۻ嶍; .>H*&g439lQN&W֛sЃt:鴪۱-$>v{,DIv߉%b<<#xcSPn#ID/L{cKs3)sƖlbf6izTxL|}λ Fۙbm7|8'4ힶ'IU杭me|$g4޹6vD7:Ie+l\wJYUtoؽ|a"vG-e<<#xS6EO~\UTdIa^W&[PSYRbf_?W& `8ni0,knM+!C34nIh&fuL$sEҾ\wX$sdk?e i؝2<<#xiohSRSڡ5h6&Tֆ0vImrD'Ie&rƧTz&TXoj뭩|S 89޶猅Ζ;f[|<<;xDoҼ,k[,/Jsj6HRnW6L{9yp3.MZ&M.5yD?4?ڟ;\\3t{q_N&ZY_&,uckڛ+{ENB ;P..0C쮿k(v6H@\74틞$ҵ,-q>W3SgdĺC8m(MlVu8ߕTf<79$LlqкϷlǭv׼W3 *Cx=D 7oLW $M^wt<<3x=IzA=Holh _5͢llo,θ:3 o,c}d(r \7˗utlskB<͍nVU.,]ơf7>bG@pы75zg;&|5Ok:̝ТM݆+ ڙZZ4Q_;E.\;7KᜰR4i{@żv~Eu3ᅥˡIRz.lL [\K_|<<907͍Mf #Xrk%IլvLNܢů,tW!riN ]<ՅM^w<<]f~ϛM ]#x xxMP>~|,!zC[(̗wƖC6!~S"wUf*7؎b[/z祾MB-''ٲ9pőK!tar(tO; }?퍅O}S_?!~Uhm@IPjfl.m(lqu8p"՗kq{B'I/B7%v;;W;xC{Iҋ^n-#?I_u$X02b:M]Ͷc,a(jIR/}|g>Yf.cC7SB76IYbG@;릻CbҼ\.{ܬohoC5%Q u^$iѧő{?|v;D.zM; CM{}S$_,w=C%"S80 ^G%}wͦsa$"7ȅ#wTw<<xF&I.ms?%l!n47?_$t1xSww(qSb8joN_NZPyʞȝ2=ik $̛?MF0x~=8M@Nء [q=i>v}$T8p{'p&tR(c"xJ Ԡv0l"G@)A'2z{}82IѦ#G@,;2C7{5MhM>=Ic=p>۸<<ڂIuSuG Ue~Z/efծݽnʪe䳎`0 ~бq `0o0 !x`0  ``0 C`07 `0 ``0 C`07 `0 `0o0 !x`0  ``0 `0o0 !x`0  ``0 C`07 `0 ``0 C`07 `0 `0o0 !x`0  ``0 `0o0 !x`0  ``0 C`07 `0 ``0 C`07 `0 `0o0 !x`0  ``0 `0o0 !x`0  ``0 C`07 `0 ``0 C`07 `0 `0o0 !x`0  ``0 `0o0 !x`0  ``0 C`07 `0 ``0 C`07 `0 `0o0 !x`0  `0 `0o0 !x`0  ``0 C`07 `0  ``0 C`07 `0 `0o0 !x`0  `0 `0o0 !x`0  ``0 C`07 `0  ``0 C`07 `0 `0o0 !x`0  `0 `ѥK0Ck\ϩT=Ui0o0ߧ8C% A{z~_m\!B )DľyMDpq!xཫiD8Gg`# xz3q{^y*~}/SWX<!_!x!x!x$poWJnp}`wü.o&uu $ |mǯ ܛ ۱1>}pޮ^w+]q >$c{{4܉GϽ ~J o7-*|g`,xнw~{m8$by/;{?·#(Dl7/3n0o}-toW侊ݛ̈́i[ ;W]a }߄oq!x=ୄXs /_(_= M$Q{+!xn˼.C(>s0;~:(r_4' ӊU77- *r}ܞFVVq{.??TK?Ž͕?x?҇v"x"x,O+w=3v5)/_uoG&| |@ԮIBw]䞻wv{<ܱ@Χ S~ލbu,ngYw34fNg۫  [~ݽ_g$xv˸+6WByE(!nVv$j+OMt鋋k7!nynKm};àNnVUsr{+{%KE} 7θ$xoK%sULr۶cʋgWvn;rtq*ng7c?&n2'7;Jl۞p>]npvWspR\sx~P;žX-ϝ"z i]]m>^BxЭ"gnM&z *tb$y;wyƓ(Q:UT1&})O*pSI0r┏-99 ߃vgzЈ8C=$tO]{jĄ~Нd[%nspd8NJr)F6-O0-_8<6ߓDh_q74chcG,7dƝ$~^{wVỿ;wn*|g`#v}l|+;:\}s%L M[u9vO\?OսN얮TvK=.zo ^sg>^BcC^ڙtWvRx9UoIv:/n*z u4MDoq!x@Sgl:xxW̳>PfBwiUtMĮ4[!Lb).OjWrp]?by|jKM:gBEvۺY:N~1œS}U&ss<:cƭ878~#8CR/u[n>a*t7'pXm Iл[;En Ϻ{k 5Z"Nآccwݽ-ory~$b@2\T\¸ _*|I7ٔ𭢷=QܽE&vEo`&xO-v0NM? V]l(RUnݶ8Q&%fJ$+= gd!|fƆ&4-'n&cӄ]KdUVq[o& uwz?Ֆ y䭗k3n0o.Iw?Dnp,v[HcOs_i%\ ]Sr"'"*WK;LZm)R ZNI˃OΜD ^S2]<Ax<Ǘ<-,!Znrt"nikδ?Ӕ6PƔkQK7S͋ dͮn(UvִNqwM~ŝ\Eoj:v{7*|3nK0xf[╧cWw;1ϼ;]q{+)Y& ^Lmٸf$i{4CL&)LpabwKlO la.!i@񦋵 Ew^`]I SӔkx=mqk7a-rvf86]4Kus&q'0R蜵i=wS;1'W].{S47glwq'o% x{ "_*zv/gU$z_2^/+"ɖ`8{K |ZGwlo adj( 7/SnmmNnZ&:a&k>.4|6E 㒿K* !l:rtuĀS[\]Ġv$ʖh-sql\>4Y`NW,Oi1 ']SzY*W-| ky^qN2ݝnwsxW_eYhsi |?;vwnw؝"O/m缘Ҧm"8)M599quulݬ%g4HU*iF[MY43 C8.Ryܵ SkኇRչϐfҎD& g&y/aJ&Xa1ӴVz#v]{ Lٛҗ0o]sC6iU^vQ-QkOtzgn|GE,}d:vzO^o77x/oR/Ƽg"ř_}pqno%vرfmuu2;[S^N"rL\m>,iQ}dp434Å록i)zKHfV S4 H0"Z/ YaOOLCiP,}U+ӕkOge KãN}wfS|3ѻ{ cuwo&vYNFM"y,v2xW3y2dl)h-L9pFt #NSy9cZ c:h1hJJ z_ {qZm n5  ,$S28ɠ&OhJ8Jd:4A7ސ"0,Ȅe -<`2 !@4ﱉ;~6a~zcxosx|S>UlJ 7mwʼr{;;crblw9)eI-a}3nSӪ.lqpM($ro4eDṆ1Ǎa˃h}3:"t^?}@%U2d$&ڻTP*d }Y 3.Eul.20늾IC7t'9"ڥzl)fP 8 +حB'O%vaiǛĮo L, o5c-^qT8j"Lapa(-0\$P%. 0@B$HjKKN^,!̵V3 c2M<IP H( )K$+% E@d .HKLPARGpazlzxF o;Iexl7f'1]<9ݶ>s?#38C^w xgwR Sl\[Fn_qUMykM['`U֯_n cMr[7Lzd#m <'5Mi4ȦF dKQ0&9'45 `1hrfdsfCd6211֖ @#蘰4a  Yn@6iXoDFZ3iBM4<&>)ip1`c [o4$'<7aw>ѼYb>uvc9-3^qm3/~c<m_>S /I;vw^y{LL9W'=퉭'أMsvn)Pimg !n&d9e3Y`؈Ԓp|/t;|:@6I `c"!Hk [M&&#a7tNtNpۘ7D$aN'&87tM2:`Sh0MZLVc.Otyjc.6N@iYqbm.}bh֦.޴*zK^/.;̫Yl$gsh@s546FL&6fD[`S̀ɀͦtrb[_6`hl.4.W47pMNIha naF+׵1& FKo F'34z*zqy3o=8}g;I= 7ww:se e¾"VPfvU T*v}2R Bd3ibm; Y N*t5њ;lShqll1[#r2ӆDh*ǵ|ashp iZ|ڿ5ŝݿ:BMi>МLL0: 6%tllpn3&'M9)otwS9d7ldzYL0czצ&P~,zH'o+wyg65.>š7g ynrwk(&wTގ۞'فc 7?mvD6ټ׹Ix$f\ƽH8 Ks3eihJ(5A(#yZ@$)R +K+¾\#ЏJ4Hy5>p$eL0 <=TH H%Hޠ`jJ3{Nh1;4OdxaB4{<2&)lhq#6| M'mKsӽSP6qNj˿Mҵ+6 7xÙ7_ngŽNvғd4_;z)}\gb&ۍbg0G6'jj1 U|"Zs1iIjV!rLFز6rN6؈15HH`6Ц|zZ3p2p%] rȦFc9VO|1ҬyyɁr{ԛ'Z4i"ӥf4FgsY9Os۞bnϞc[/>w+n]`0o3~;7<=/Dدp Ud镫۶f:Mj huFh,Ts]` %M4NvDR&d&#! $@ٔYF'IT,dN5t,,}Jav SQC1d]؞*v|?An-"^O7!KFᵝy)?κ5 n"kS91r^fƠ-GbG)ne+oGZ' ` NZZQߪ2 Iz\ lV95мrzf;jK`=(o d`k>­͚˃y5Weg3*1&#'7&XcA4x,jT4wkG49[̙0<&7-dн;<7Qm-73N;ǡ~f~Za}o3r_ 7xuwZ{᳝x+'y ܝ`67LƔ@MI 3UXAӄvE;eB`pH7+MD)h<`L%^M &gZ  mE_j7c@*tY٠{ RdE !IO 0T"\"+. FHKYD$`B: '42M3rhݽ[XZs@Z h0u˜u/'8]=x|'a1Lz0os{;q9!o] ,y:ӼFPf!fK 5"LMx6L5s"= J=vkRpFݛj 0 ­D$H­b?>i;&OCUY7[V:S2Z,&<̈́L02i2$҉*!2r DX_v$%<A C%zDzf} Br & #l1lOp{3tf&Mو ̫+- {M+*īDl,;S1q6i6wn&5af\ [)|sU`>7( )s3fLP8k3P.`)hev(T9ޖ@ ZzWR J\҇WqƄQ Z0d e3f@HF1bT$x4Tf(+E+D&-:, uЃӉ/9mw˾}5˻xmõ #>x[+^m_ުYp> iUaqђ.q;.5g DjA++Ggay7UߝLZp3ZѬȸ0ɫU!if0gߝEasgG5PQ>1Ws0IOv ^UxrY7D!pn62i5S';ec #Yj(pM&UtqhDet nI'WBk)Gc44F aU Q$PEj +qdLb q}x>eF@ I9tK1a,G(QSYy@) iDR# F{"D'@BN c3& .*Zu) JwmC3G[ssu;^oNNnlnlf<,57Ff\_7FKdk|'տt:V)w9fV #8i<f\2W '+ogӘn=` yzn:dfF;l?y;˫^^zˏW#7obk?흘 Ͷm݃s!!{;Ϥ /wjt 3NFSb4V/RVm lӅfΜ7ͪj@X- V6: 7r/rsK^7d *j,ˇښSjeZ#xa:(gJ0e`aJ$hHRTZ&dJ HdJ| re"nE>H.iґ-fKxxyL tjR5Y6+[I8L' l5i >8pr6@[Xџּ!7 yy>J ͸N.-#M {5z;K8$NM 0ҳ!j٘t I=&sgol&sHw`V R6YKAK9 2 Q=*e"vDUt35X*,}LSj# &B]2T9; ET4̄,YJ "p&2A:ZႥ$:\R8&3FKM$* 3f9)6г7XFliC [܋İ+/+pe0or[Ùs҃$:O,֛)Id~ RNLAFGi\VCNh&t(dbWn/h&{bQ4M*Y34@,樢B\h4Y *b٫u һH^<@R) )/{)"PyDd _%-4`lA(tl=*\ X*;{L-M@M\i W2Kw8Ib˫'Q6oŖG!`k輳[qhw7WdtXN1h%Bb--'`05L\"S.cQ T`a4D߶@N5ai2/a\ƉYKg^2Οq$KQʖ;xæ˻my D- J2.\mo6\`RU V-:i X%.dJ%iJ8HZ9N/uugZ$`Ε[%iB6iiޡ6װk_=s7G`aBzYdg`aI4 ɦiݍf٪it3"-͌H npɝ4Ep0MU49k*X [nKb^ czRzϽmZfjVcAI  @wNhwg&&1)`eǺCCj X5=0D,,IE@5%<5HGC.I(0Âhf) &W\( WJFOܨNr:py:װfDL|bÓ%tyyc \۴ibX}^Ùg,,4-aUHAe9d*GZ#i,)8r4ol.hVa.^9:.XՒ20Ï~͖ic*v$6? pp<3~f>?o_ՃW  dUT)-;*r bj}c~W_~4o0o՟y:.v^5o773ͻY_6`{-t[A&#QSœΰhrT~:#L#Xa˪t#J>N`*n Ykً?t;4PR[%?Eg'B>8C^K_ W^/{+,IْKLF1J]H\};[9Ks V% ]tt HAn54<`iEM\ "$R2 Ys91bӓ{6ӧk*?\ U^;_ w/_;wgNl*'Sc6d3[$ݳFXѲ6d2hini[>tȗ3XGBa2.fw&1: nTn kN\V | mrܟGq fs33 w,p~%zX E#[`zw73_}8_7TU՜iP UjRkQ PS.ՅhR.GĢ Ja@KS@ͭEj6wDO0i!4[t&Gm34:l^GlΟFF`~Ff7L|S$a5kj6Váɨ-EYF3i?Z,KLdh%乌#ҙd$:Tڜۑ[\_t N? M?On ]+|c|O?"w|DO //(b/O*ɤ)`E_C4@B&Y"W:dhH2 KܺR(p&-Rpe-U75*E˦L ި'5#6;|s+?n}VniGX™ضM<;ofpfdF3^i,0z,oe hS^VՖtX49Z4 r~l/vN-(7,bGsy~/vHg%| _te I pA#q?c142po??qo~.jz4-T], $t,kPfM:cINhftvHF ~;~2&ZX71UBKZ4 QV]0!g*LWZe0]3z&;&45v>N/cyy?Yrsz J1a8H$e lAHI9GӀ*`) GXuf2k,&Y7]4'ݠ* ?w 9?_l#>w '-w$xG7?O1ξf5YUFPג\&AV =Dôu@% <|h~{6OdOswory;xy+x'@7;g@wu?MLz2,".,YMM&[h4YWU޲gi_ Vѱ| 4-y;?O,oEbqu_ /Y !gwr[݌X05چ7Z:l1&`k苅 GA, F|ASxz!T+>n],1;_{Ͻ/_02,V:}/ \VEnfYҺNrrFLd+:sZl\BfpV0^`ڋKQU9C?t <=&ǟ~u&/*hO[R)i4uJD"u3j ΋vLX hJq錦 S\c`?,߯lX\՚E*:tH ӹLTrecA*}%t-&7e?P<+?sϽN*.":;wY7"8?~M7b:h7_J-mY}5 F[BɵBՄNZŚ)bEUR }Wy;r;rzw]p7&P+Зi+@UeNOK4&K%䲛p/vtc7ܺ:&'8<ޏzx?su>9d!!xwcR~v RVQSLW_T9jy <٢zӍB(:{GGep'//^<l/nͮVdOI}sG pm5g([03•Wgl-ϓ}9L5"aUi"0^v\QQNS6&_=;rz}>57xx?恼noܿҶhW.%dkQK뫛HCMZQ9m#V}:kt?+O#S Ӈ zl{şrm*˺XDZ9Ptj(P ^|Øn5K!2Y W΢f^/\SyJ >0VW73qJUKBLڇǦd^MUex2V̘pTUCJpXS` LKbm _/̗1Y53y\ Q|4gϰZݪ].~99 hl0ڊ`X Q/*_WM Ud,tr&Ͻ[v5yMcD?6?<W/kږpvr;>r"2DZdpXgiV8j6ke9?':U%~@;yϼ&ȵB")rռ7 YrK/iK^g#וD_ ihYjΣzFK`t,Oᓼ2;sܻ7OŮ3^+ @%t)cѓ/A9UajՂ ҌZN|U?۾X=v=qU}G#?lO=L1,WWSC&W<aNx gP9rcgl:8 }07xO84'7;?*`^m=jw9[}JEXVs/}xSZk KaVs>Gk>n K6s}[Eg?䶦? AY}e+ 9ԄSSh7^nM 4VI>&&I;jGXf2&."rf2csUceCq-e0Ǯfau%|ޯFl'y5­ƥMKV{c]T|-7/" FGs4OAN;۝ȉ9=5H"Ku [! zGe jpyw8R6# $E,'mܳ1RO."T{cU& dXM"C`lCؒU&ʓdf3V˓Moҋ7 gԇb<8әl[?{xͮ]LɈ wOPk/'@ !eaAKUXd T.e_w9ʀ|~4@G 2FΓ>~ 8s 4:-GEEթwx*\C̣p'`MWB~T <َ\E{LCVhƺO YX*?v~\D(,_$ew"O*Ա< 8~O% xtİZmmu7zփ\ ;r5Ǿߵ= ?̧ɩ\M̖Lc:rw4ȎYpi{ YQsspeʋ?p\ٝE`QLޮC+ߕ]['D{Ekky!f!xn؏;+vZۏ.w|kϙ^m/_pvg~ 8uU-/D)G(hL_V;voמ׽  |Hx<̎gm>}=] n˫<0* _uvyU{or' y8ՒpPG}Cwy7U"f%G F{)!\ gOe}'W zWqج83ssHji_-4$\ '![!xOt"n?M]*v>kEv']˙ތ!֧=6O~;{k >|'8èB`6F;\j%B]#-N5k^޻k9}MӫIJcI78]f׋WYKorrg8ٟ\W͑7)u+]8Z J"ķϦ8k78 p tqv{1l뺾)S"M%C. (p@8S.ng`}v7 ֪M?tZ]O׽TqB9 i=RK@}73@^>5Q0q^JȃE͈WG*EV{#OunyArh}ZÖ޻@'4g3ZP7`bzjFI)ӗ\rtUYB % 25A 9<R~]xuobJby .3 D^!zmpI֯$DLy2{sK/^;w!x/|N'.ǢVjNO[Nqi2!0DҨ`\G_mx&B.-{SRbF%y:=_.{]l!'޼އۨhy}7*w9W7'xCPJ2#6:`.8ڟ%?Zu$Sda:.X$C7m k~;!xWs.on> rIa,ed*ɬT TR5.mKQ !Q'Q./_ξ^"[x5ǫ6` ~x*^/oӭ(V[/UBĚdIs|ţ={)_y}xݏ2g=n}z{``𮘦W+3U}xyE*--qSIRXr"űq)\T!N-DE0)QE?q ??.ftA{]c|$v} ֡ҿ' x[7_#ʻ2KaA+WeMIQ kհ$2 g%2hTe2 7).,GaLZ[|~lS+67x<_uWu֗*)r~~|ui X~G."rVsKNJ$si[W2CN,Sr>w"[7':a[_GCm'߼P&RC @WiUcq\*lU dã&xK蓬@.ۤrmIl`]>]ޮWAK(-3PzJPh aA9@@J&eZ ].L*J8?}[9'įGgx._~]x?njqlPRFBBh/lK*3%<% T@&LXk?b, i|}+1Wz(B[oڙz].}xz%a |~v nd9;F_:,Wy̑zsK1U֧"Y*u6`,*KfF ehTFP̴G=_+ae~6sS߸&vǢ7'/ճg?V8Ur>G,!H %*,,*W˔X8RKd&j_Hu3ۉR $+ջF75FK`u`݉y /V}wFRɬ,dݥW^=xh Ͼ[ 39m6ufFmznʩ' Gf(. tRҸ,Y&-ME#&iFTSB$\)4P(s2A?9'06/7*sx 2j 8yWWwoo2>&W_oN^C>dT~- df5ϩ)C@d2ajC/J,@\gfE!Ð)1Kpm];seZCǝǢ$NI qۅͮ_ʣ%`ќͺ&fv&fN2f- 2!&eDu5%M 02(ҒLzXLHXfuXPp2PHwXsg+MpO]>>cQ>|Nxůz忹axMj{ 6wS -^y# 2 H]R~&,jOTTG+2MnJf)ijS M ,,E,`գ͹H|ZO 87xWŗ˟p)څ.D󝛚vbIī:!#- 1-03eʒTv!nB",H`01=`U-aZDR@ID03^<B' >[+}n?Oc,~3xÅ<"QwQ3\`y님 Usf_5 o˓YMPfD@BTtD"2ڡ\MP2GfZ,qKr2xEmid#-+9e3S!GJpG3Dˍ6M$b\:F_` _^tmδk&\ÚMLȂՂMWKMJX4IdM(A:LX:C= %K#}VE.즄LSj%)X`4A/տO>7XR 7_o ~ 9Pٿ8rn؇*E.P]wo!^'g5=E,,SFfhTkd ]Bz"@fgPLz$)xKO5Ehn#M"ZK T>4eh.ۤۗ:ND'۷bm07x|k;?n û镳&odi) [c74g9"% F(, F &M˨hʐDVqK2ɨ/'B"jV"L: c_~3;E U–G<pa§/A8+!-o0 Y7VAJT!HM.DGHW"!mwGfdDR!o4ddz{fzm,35UŔ;s5 )Lo=%a g<)fS,+gKa`A)-flhtCDwxz&-IH˔e BdD_:\T'6P@òIVmҌ?}0pe W1㫰8` .)q> |=z~kLYݓj$^Ȭ\]TKɼ`"ˌ* *BP!MeluzdgÕTr]!Ww,p:6|7sB%&j4fК^NW $2+ Ң I04&22ddª ffܝu(qY`;eZ1O2zd+&|wɦ\RcF`}5atM^L!Dž;C_~üS\aMYeddfBdZj H9"m K.M$)#!YiNh%H8 $L ݲ5K\h03/'>cXq{ut%n\#ÍgGN^z|=JrCBT"jss%E!-{zaMDɞB)d`JX#=/A:'TnHڬ67i!2k!UK%)&SLP}g>Ol?}1Oc#]A7#~g~Y,>ū%pZ^ma٥,qS P#f2n!CLI ˶^j/^ADFz{1ѳPJ)$"ꭥ'Mf{(P1 ÙCa,wPM8{(XM I 5L Ao|tjBRԼc930.oZL (yraz$)'n@KZ@ KkiLL2z0gYĸ(@3$1Vh7^ۗ?ӻgg<\vKzo&:<5YTt3oM&Y4ue6Qb7FKd" b5`&5x%tx&("jk+D)%,=S!+lW\cD%E ߙ<ܕy8eq-%TJGeTÞQ xZSZTd 8 ;ΡPNjȴNQdI-aP02]@#kydzW/}-B 4h!E&M̸hM?Ycx!x[WyMk!@3x9SA攱yc;M$$'"a-DLUwv5dzU?O?D3U6eҤXݼ A'3v_K}Ndd"Id3 #q2&Η˷Dd`^8Mei'8( fm+54 BCNyKlt,h8=3P͕Fϭ6:/i^W:75:UVP'a ws][[Xp DzQk'_O4'RP(nK1&CM LYob1oFB O]Ufx3d4T3,ѹN* f&:逛`v]'dw} D2p]Fwݐb]JX6&4JHkI[eNAa PZ)I]\biitNP&ƞJlC \LKB. 9j(9Z<6e}>`/}n3~J|;ߕ?Ov1>Mg0_5MWMy{dc˓M3޺`J W2ED6DJR5} aጦ.Cny#0d:"s=JP J@Px̐8XK[.1vbH QԒ"נ C .K\ A !2%%=Ð! &Ⱦ>1!;,oNy2!F;NzE<ZL)>ɼB8H`7s:jd{y<=y9^~{^͢W|G߼>_y4vk/8Fs'Wqs<])N34Yi"ɖ2RO=Gcp^:ɖ 2Eʺ>d L]TJI~Ȑ)uTgZ RBPZ#gϓ%uZ!L0DAUf1!c0!:qᙞ#=s8ڞ ɰR@=p'\cH,[G b[s;,%É&'ac l%G#xsRpٺK6.&غlI-lݚ0iqly*e|17RKpb ),шRA#HK#X:qPOǾ-f[2]4dk!Lh lEstzt.q~5˭VR搟nnC3FE:H 2-t&.g,mqC٧wʦ,<m$7#h&;=4 0?[գ~]ʜfYmҖ|vx×# r=^AʚoJy_?t Hz[i.^ s.C7圤3#DG:-hCE) cVj 'dw B1cR1-!pru}!ԕ(-G[$s%.#q<6D6P&יt!;90>:NcO q1$GPhԳ1 ‡0iI?0]2AԹz$hR9ݔG˶n78'U) uBτ_:3*i?}ח?N]r9Gs+m.{n^xҖ&NǩcΥb)Gͩ3SHKSK%M3 Z4n=E>Y|4e!Ѽ%}40 @,D-#{c}Nܤw!ױuMc?Ҕ]z)JsȄ8ʟ>BS0h[鑦DcD=a+'Rr]Υ!6{gNGʧfi-؍ 4F7&cMԤ.e>;N'*ӓ7LwU,JxŇ,kޗn?諽6=|ũeLYқ&]z }lxL4z M )z*fKf# jtKz50)!BS!u _GO["A-@.i4䐚3ȱYer{@\ FvY;B@)q2v!CKd}ҚK36e掐-Zf]tpt]]$r[|fr65il7fYg}$z43q.%&xtdhdѳӕpTKf6MʆkѤ4]\IS%LoL4$nȮd:Mi-Ѓ"xCvO? B:2ոpz^;Ҕ{ $]EwRE-Aˠ, `&3 H҂ROz$=n ݈pe\ןc$Feb$$¤0ZJ3vS1\1,CԳ@!ѓ-hv1lcN7W8ْiHЖ<}='7y@|]{h$7OSI=Sl 0ף kؗ'GS_Xc g5;;zh˽w4M̽;30w6Yxx #A5W%&oݝlBxZ9eTM6Y1.9кe1^ಶ0_GLj6[φn});-):7yvv6+Cs&n1PjTPe L-BqX+r\dhf#yl.MuAj@Ӯfm%}.Cn4l_-}g=(Wxo޹`&Mz/̮ؕbu8X^=0쮦$>G4ȓhmk PlR:}9 7{= n-ծ>&*6O0I3J7Nׯ<9hی:,]c%o7*lZEFij:^I[{{~(}tWW/Iz?n]vᏮⰮ{,A44]S9qZS]MBԷsr'cL\*Aͦϐm2E4]oe9v@^_Jk,µInK}mں[RD2i)sZᥦ;={מCz粛5UzdgްIIw%WPIzŃķ]J{TxC~[KFrdvĹ&]h|jԦ+2J nn݋Oc w鸟۲gXTv%W|h'=7~􎏺e <)]WMzzh_i]Uعrk): Ht7S)uUh \f1m+cn"|{{k0ZnضʠResגB}MuM2 5%}Mr'=xW!usٽMtIvkzMHv^^>w}ķqyMymkvjm/.ȉl:YɎg%lx͵-2e<[Sڹ6-m-eݺfhKv^.^ y[tu=]zQ? G><7~Rٕ^һť?/7>kO5I`\N|&7is@FL (S̷ʙ7I.<]=Zt.ͭ&r6ѵݫL,:x5>='] ([xCzp[|ħ{G {UZ.y}Z.l6MILx[{6jm>GR'|];$q k[ٱa>%MrNu,}:}?}{EcˮW[x-=`r[zŷIGշo&R9yuauo&x[E{w|;uV5 Z˳m`IbKӫtCv6K. N_n$wQvoiP +%C ]oon\w[~m]ڻOU؆`{e}yR۹Įʕ2N?Q^h_]{o/.O%K޾1y (?;ὫJ{ow7v(4ߓ-Uu[#7t+OZ)/]iKhp[n[ Íuv nܹ%gW6':ȮW-wM{7n^vEX~ !-.X/{]Bʣߕsݐqҹ6^2tJn 'n 5=FO3ѝKQOoսIv>JxE 1]]_'sON~b-g~s"Ð&<ܔ٬߻W =IRw \p<.wÞ^}#NM9~{w.MrwHu?JxE =gk.ueϻx/^v$&k*|)o7F]<r/__w[r[w4h7St~4ٕ^c 3a` ģP&Hk7xgko]bۄvJ^_nen^XSnIG] (?noM}x.MaO.7 CG Cl/^ޛzLr?/Mt%W{?L~wI\p~5_dy۹nsx@76%{$ʮWZxSzo{ kr}>ݖۛdvJ-EW+JxEx?P|o$xu2?';# kro$o1=?JxE 9 =]wuww:(ޅmrJxE = מK;.BKn"W -?'ѕ^s5E~W{{G\ (i{b{3+w0[Pܷn@~rW9~NB+(#%D2?(JxE3I",E (2nҤX"+^QWA|hQQ]EQxEQE ((JxEQEQ+(^QEQ(WEQ%((EQ%((EQE ((JxEQEQ+(^QEQ(WEQ%(WEQ%((EQE ((JxEQEQ+(^QEQ(WEQ(WEQ%((EQE ((JxEQEQ+(^QEQ(^QEQ(WEQ%((EQE ((JxEQEQ+(^QEQ+(^QEQ(WEQ%((EQE ((JxEQEQ+(JxEQEQ+(^QEQ(WEQ%((EQE ((JxEQE ((JxEQEQ+(^QEQ(WEQ%((EQE ((EQE ((JxEQEQ+(^QEQ(WEQ%((EQ%((EQE ((JxEQE$_KIENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/splash_anim/splash_anim_04.png0000644000076500000000000011510112647526517024344 0ustar devwheel00000000000000PNG  IHDRjIDATx۳yމ=/sƑ@ $JF#5:x3f ;tg_Y[__8VFvxf"F,$( @7j}|֗;kWcΝP_Z|#%ahhhhhl\U%9ASz7Wm\?q k384744؟we|Boo^?F\{G;g!1κq |P{/Ϋx]'}`=0Y7Iw۸_u|]{wY&~xq֍no <>. fdORo/cyMHpu!On[-+x}=~V;1 # q֍no{1v }q@;m{O[~1z;l>/|?2g8> ~!wǁ& ^->xC|{ z?tnuxC^B&GAOt/޵仅›q|WߢY7x|EWw>uaGv[˧zk}<.~S{@x vs{w|^5o}c=~q֍no} W}=c;<1Eot|١p`u+| ;ՙ!wעz5< ~*nuxCnK{n y{؎!Q;Z3Bv}yvWO7:}[&w pwuz4Dm-{? q֍no t_l^w C-p[+=;.`[|͓}qƍǭx%N6Eivswm_swns|N/շouzy@wݣ w.y[\\ǀ[*+7~fzl9ɯ;/G_y|S9Cwf8}7B |?荳nuxCOxv !w hr[ ٙ'Pz=@n1o|/}f8=>쑕\my.pqzp; .Yٕ65. |<ŵ\;~B;q֍no _!nݭ햯̟!`3߶cw=rwWʽSSng9\r{lYoLǀq<|wMl6b.|vpn߳s,;u{#q֍no==Q;tuϜi4wUV^9z>n\ ʍSc&=n5ˁ۫Z@0'Vgv\`=as߷ãs;Jq /zpƩT'v{aCmWczq֍no==/rC՝Ɩod{~4A˧*bSww 泇ڜZQrȦ V\wgu, L,{(sxٜXm8C蛢CG!Oab[`ߥt:_oιX-{/\1>0荳nuxCxvֶ<ݽض' ֕u::yKMtއ)Ko ]ƺn\ܫ}˷c֜]c fܪ^9|ŶZ[MlKk~ʮv/]p,B]]i|?@0y|2g8K{GlsO10g9jk%LSEt1%4;tH3(kULڶ8Mځ,"vѼ< p.&4>&I+!f)iJEdɣ 2Њ]B=׉//z=vl]\j՘ڜ!v8OiiFp]—Wj-(Z-v&d oK4esnd: 2JtkRkXŘ83ؒ&eo榔X* Ocj FdLCv2 s(ݗ9>mLjh- Inz_)̪,\};V?xJkgpx [__xOToV`Nwڼ"Cwy4f:9fZ@I-tHN*\djJLiD*lU+H#3k`5VU,Ŷ'E敥Dy^f:EGMl&S+??1<8/t<ݏ'm9W.mb٫_xwzv=<\`w}|&ص0|apʌҦDTVC6PI.\H}6 I(ъh4zH*Q.@fL>Gth߅4S9<`2V&,]@@UZ)DCZ0T4'(*A2EiIdO)2spGL<*`{deNObBk7m{TC=7G^?Xz⁽zvI|Dhshh4XHn_}~.lݱ˳k\G,[Av%Q*-itOq.f Xp/ piȒrr{FF,i8ňtXFyRU< }`l֞$%[d™ \' %dPZdx4eU* $}}+jQN2u^-ڞ‘(mo΅i޽Yۂ,5]o7w_l0 šo\waw.vymv'sv 6aW2YRae3dBg4(-记ݵ˖Sdrh'Lh&acfj.nA"7 ܃O&iAO3 F$[&D3&*@w~<@R&@yoy7zPd D4&y"&̢$'LOKc0M*L*33=e_2 2-Ռ jԺʂ- q'vXunO\_1WZdsYey psM~7zDryCCxCÙ-o_2e%o=Mn㔫折<Ȥ-v#^ͭ(Hԉ 4<-, "`p gy)MކL4 hGY:`Htvn`r RKIa _yA-rHP"3-Ad0DJPӪ1`'l zP`d'`02VQ ,)zz'VV(\@Xmt8ɜmΒ vq.Q,+Xv`i;kIYEK+j.dt|4s7DqLm܊ ly3i&0AM2a_=stld^ W[vP{HH쫁(%B*}HH)RhZ' \'RHrP(,LX$ 1lFaaR*C)@o`+qu<̓=e)gq3"&'ٮn]VHN$ ƕ&VF, (&#'Nt99(Nr/F(t`6(+'8Ƣb@Nϑʙ2J1KO3tsKGz1Ϝ,N[ed4SdTI/++K6.-00N>">}so ~ bCC =摻Zɜ˲U'69 cZ,<'qέHnVb;Erbbt\KuH4rx,2IpC+6Ӽ\`s2КE2+50}(%@]۟@@2mTUmi./ºVSƆ[k[׀6S_tho}ӣw]N&x3')>d(s_ "jqKRѪm\,3=)T [—(lm0WC֠'7m:m{x>}qcrk`_oK73Gxsho8]g[{랿[6VPblCzX{)Y.+<܌^ *2 z,i4HɕV@҈V0eiqGLB 3`9=Fi ij!N^fqLk[R&hZlE+LH[C:+,iiH)K&R 0,ԭ!0C2J\ZAz=Q@0`Hrszyz"Hj=K"@Jm*d̒)gn]m [.yv.V'y.xcГM^4v {:w_ܝֳaJu 1׾_lnz\b1A'4z)̢ }qqc`g0&rᖆmXk_H7:-֙wGڲ66c۲n"@kpRV-=ޏN*'5"VWI.Y:el 2 " CL&$`00ii vq4 T^Ҁ+jei}tm:I!%1/aj LgR3THR#` JS$sЦ!Lb+&U(2 Kܫ*4!«2DIK&.Osj<2%.\ ` )VzܜN;:X,a8-I\DIcYz8Fj͉l$gz`3e Nl(ހ dIrV ؖZ5 }&Wl$R in@iN )&xI &3[Zڮւy& p&^P /1e£8j}c"؜* *-r+7E{ȏp-ysopholwg^'~l,]QUNP bJ&%UHb`%*in>wgq'dttDq8 {*<(Oۈͭܞ`p riAhkK`A|L"NT&\wK|]|l>Z3CZPڂ$X"ÐLE`ucP,EJ߅% yCa*̶0= a!UsT lp&Xa>lUSC0dsyYJiU8ʫ ̫vq\nnom}$Ǫ')$g[vj*a;­t1annb@ g7Y(eqxͭI+t4g{ص- &:̈I+m4X 4|=Kn֧l=JYeoB `S;qWoO|֔]M2h, MauAK(Aq*%6g&G-UQR:'&$P݀ȶQ1Pp$=ia+jX7&3`v˃< r5B p^au6'"$r:%F)IrQܺϭ`67j1]FJC Ce(9<н@-(T@78 D'I:ͼ8eNSk2]f`/\mlZ)L@D$ JM%P RL bYc BKCwJ,J2bTx)RLo5waM܊+np+51BCxCYA8ڠh X2=iuZZI*F/` $h&YsG 3-}wY<IƥA4;c u;Zъ_k us>'OE:t|F|B'>=w؟\q]XmoZ(tn2k.Y@ɞڴLOY 9 ,sׂjgkÁ;vu8c?F o|?SuPaϿ뢁{"ZE"hR(zhR R+1IYR)&[YRtK)-9^t$-a-|3噜Rvm.ʓ-3N"Wۗy s'4@5mjw&`Q:nIuLJ;Sd{L{Emɫ%EX@76۲sϴr5/z%CKF> k{ `AQ1B^brhy4\^|/ݹG'VhvWsi/赚ݛ?vOL#@,W?c^Xh(6-FƖ[-m~7!%ӭW3)&9AgP;|G3qpڀbg;G_۠ 򔢙̌saptۡצ4^ ۄ钵C0d.%(a1]%YZe%N[#ΥGwW?.KX"Y"@YĔ3]L~ O;ڄiiiVF-q }Xlz_},al3wlY5б~SO珀=Gc2BYw>+_J-/Ikf2g_)4a˿Rɋ䂙Joivrd k2EIlkJhqҮМފYGC{ =VZ xs:Uu#,=Ų=|گUhLim2%p " mP,VrGjÚ@P_zsqo]ʋ_j_\sswW7p}y゗3wƏEs?LVo~[Ѯ˘LXll8(&2K@&m dXN*4-e_ !i$l ֌4CE,<^Ɗqqq.̧+su2 {-?߿&lnڵ&y&e+&BZJBcksH gNm{5Gs&66gҼٲ٠Lւu-+_+bځͺAC3?|zp#wq.o){ր8јR}OlKemJ`Apɶ5Ym`LAR,`. BX c$s' :V ^bN$d6k_<ޡj͚X&ww*>ELחSO5c o)G*3ZɣEFm \۞V6{-la='wZiK!wc>Yj >&u@G?.9gGs*ϝ{U%Q{k[YZ2XG7DC.,E,$}k×A{:_t*5WFnoho}9yokSWbԊYdjrP4O]&-NS-6*i+7|fTbhoh]D*Rlkڐpzo?ZOӚ[Њ!.S잮A96Fo.7N?tuKs}ZBKxs_?)o1y6__>6F>?)ע ]Vi0kՙe@kCHk4 4o87@fC:+uzϦw[ٶ ݠGwc]]I1 )V5|xUaV4ՍmVÛ-Lٷ۾ u@7aj} iރ[g΀EX:̀?}<mU|ӳ^ݻֆߜ^>=Iӧw kY AF@zXs}RjSW$cw[ 7ͻ*Oq:j6?3|;;6E2o,ͨυn9>[0Ծll S۫g]0u>3ݕ^OQ }~ӄxqJ$K_R sz(0ͺ3?wp3âyܪe&tnC/y͕Қ0447YoEu;ĦkYcƈ-N&{n}/L0֜Z|(+>Zlq#mQ@;ƍF3!`_xp=A-q{^@ v9/Vh-qXxُ4cn[%~2_Wx-c (S2/vC LU# Wrz46'- Nۜސ}ųq0V,vi&IMTIU-O'3ROHZ*5 50VvO]m^~0x9*'YKO8w\ۗW`,j 찶~ƺE2zu&԰vp{/f(K".'y0NAa &\o  -b}Mk,>?ضtPv; ߋiaq|T/T VnP=d˫狡\]Vz kO=g6π>7] (Z< ۅ3M [h`j9<Z ƶFqc-՛}r}ps;nwgW܇,ֺgt~=JS]j33wSõ++FY~qADc=^Mp.nndTǭ ٚ0447t۶,p+ІZ3Qo!? ~hɱ~lnLC jn9B&ƆǷ9K][ [.N^ Z@ he]kBКۚP!}^(,Ҁnd: [v^j)op`mڻb>*Cpr؏w yCpG L%,diP7.m۰ZpЃg <(PYg*5=[ 0 7=8[r]Z҄k,d|q{g^$maiToe=mοb)0mO'9_-GE+τvB/>w9o}sǧ`fBo[?]ߖ\m<1Ng]lK/ }澼CEyf)VM跇Ø։ЏÐޟ|O{CWgOlwy#@gBs~Q_ ewڇS\nZn /. hC.&E>S3ihoףhk;|=@*Gn)־p 1 ,6kWnpwx |4ؽ]-'?xHaaJ%]z(Ȱ=ox(Un+ۓAU7۟ !7L;kՃ7hlrX~`?=[$O+rViuEƻ m@.&ӨcuÏ[o^+_,?`~XW >\oIn8•!u˜3߅1 [:+ݞ8k5>^avq7׊ǵʯr|tŇ-]|ntaJa^7lbɧア"29Ïx}#[ ,AIk_/L}Jx6/wC}]g G*So^؃ڵ|Ƅǽ,y:[')~p. 5/jt 9 ß]x^x[^P?z(c|sFHQs1ǝT{npnCCxC?2,n<.OqfLo/eht,ʇD…d~mw&Tm6O<L %[b~vͪ! R@ML=)-U)6ssohzO^ruMnchmO-uw]td5'BsyWO' 8o(;E 0`}2&Lj;p{{Xe_o`-vE-(3!.n<5U pƺ? o^CX Ɏܝ,w7qPŏv0z7kלٮZRMGC<۠iyLG03JO@>]=k >pnJᐲD";)Vޘځ'}BN-nnR wLECA'чjk]ݖZsgˋ Eh-Tt]+V/H =9^}RǮEF e2N}]B6%HIfJoNG2Wnnzӯ&$J2;D5p, {> ؚpx h+a-0˴9!j?Aʝ[*8%(wnkYχ/ry?TxǾgZ\xf[rE.7'B%LqFV ]zT|^갠߼%N'W_xgcww<^ldz-(*[8يL;|yBiKXW#pso}hKÙy?pyg~d`ovK$$Z@)e7I,U=9;땛tE>| zp]<~NztQƱc *K(=,O-' P2w%-ҥ4w?v-3|8^?87݋^Kd. e)0EpTcR;gVTԟLk/W6E׾}|tohoUY=xdJ8F1;@Tzfc ܜ>^QZ_S 產졶4- ,9w<~wf[*nɚ{^k\㒦*kTv-MQ .aWTuym  =rb٩\ɣ0TkpZSUg.9"LJJy! Vb3si_u( [p:rx~ܓ32=Pۿ}nFm[cfLdВkO]j>Es>7nCxCa~xʶlTBj!sW"f7,rpRB-'~roFy|WC_4 h3aanϾkCjR iRP 璿#$d/l}$&20mڇ01xUz/Հ},<{A[23J+u'RbfZ:I)].d\2! %JH2L68Ƞt7^G=FC;o|eL`ZwS IEAk{MIAeZfs{q_Ba-\]+{-D]h:;[ z8zԊ0;%294;&v>(][H\brd$bsDóqͶt~BBH|L;U< wxw}ZulTR)ٮeW$lhaTZզ!Әaj,u)JVh.zc:נ;D<}_&P BK&&h"%ֆlE.l++[KB"{#G-&K%Z^){Ȗb/uא'-K|pv /?T[~o  TB3)D VIkpHZUVJhew}oiOIbyi^"9Pz2ZZ.{kR6veU}uʼ"`l=o'f R`Rjw-VOTыQ"g! ҈.5Bӑ5!Ɍ쥁 doOuqyoaܾo>G8z}w_ޒl`S&"MRBB.wG)VhM^!kLYSC!:J88;_{ڀГf2_]/_OKV"l a/y9X^"?:npyM9kn=n U~vr=Ͼ֝e:!\Z>" 1{'$B3uT<πE֠`څ+#۔E8GB8Pk64Z^[Zϋo,(Y٧,3(WE$5KjFkaZyB&<T Q]\L>vΨ zځw*g:;r _~_D}|z[o|7%e%}h./{-O.00@mYԒ|9ViB@ seX{h4m|=+4_zϺi郇CKf\(E*siVE}(tZ֓l* )3Ht>_=5 _+[wC^oh<M̚?\?_vP0"rEb12ظ6&ARx[#g#k,&&ƔvjӼ}fu ю0^U%z\ɥty l:ŋb2JpvjbXaA{iQ%h`"C40pVnJO ՛!3Ғ$" `%%&3M`+~O]}4[8k![SU_iaa;>t][vM/R//W߻Jw2"\őj!ZݠG DJDo@O,L\AE2\ 90;I%pSmpg$z&oaq\ }z)֗'y[v)R(KJaQzl+Hi"A3!2Ҁh&UHghH( C2`h]DC Z5~oW~)Lr`w\x7#<[c ~ċ}Vw;> `|@h8>`RۿƩŨLdOxzGCBʚl fH%3eA"=|h+"}z4%Xd'ˬHdeWl0uZ(<=8$ڎoڔ0;:{7C_-A{:ntqšӆҪnsŭ9k' Ĕ`ȓB,t³Y[4eLh`L2Sf})IS9HUX;=߽?\ .u?¯e)>'1<^34q1H\^^rr_CƿojY@H m : T),u-?dҪZe1}!ڞ<-]VMՑ %}+z-$Lwe+GMWnCxC{zG>V kfus)V@3Lf8FyfLaED+:Z?$FZtS!Ô2ت!HcZp)P"P$6P |_t]CY 8Z=]\w P8K?ǐXa6:-?py~}~k5 IzX*ٖh[7h2Cn`[R`H'iZ5ݤDI* SIN+EB)Xy+3DTr~g휕v^9 ߌE1sCN-! WA|s2_ߗ{e*C-C)D"z ٪)kc`h =-B݂3 DZ)2̬dd BD@E۵2WU9vt<7@847/Ca*θ)i\ WK Eb1E _%E[4'SZz"(>;#&JTјZlGY 3=( =@:{;?7XAh0k%`K0p$ 8^a} ?߅w| Q@8/?oI4}VXidRRm]r fD_6l%łHXM2R XdE)i59Q'Tdmzޢ3=DRLەVTުpV9ms*o_{F͡tٛØgLpT>_2U 5ٲr噖2,S"&L}4=ЃvsrwRL3Hgf“HKCZkPH!QH j` ~ɝ/l>5ؼ$Nu-yӁk!v+0|e9p CQA\ºdj{|9Y˿?ߗ2%V6F-ЦfQaUh T=&I jz +#cb"id(Jd׮h*kUj+:X)\dm5IefB.z_M]w~ׄ)yq֌+ӥ4Wtβuœ#ަ(D;ۢ5]`iTK0I , 2x ӃN H<]|SioCK(9% ʝ{k|~_rt +t V2& y8[~JRQT@ @Y# 2`!S&3-T!m^JxiY Biٵ-Lr> 7VwK`hwY_rޛުRɎ.TWM\Xom씥P""J(gRIOC(D]LfXzkәL0i%*0瑁E kbEҞO7Ľr >{s|Ys~ݻ?ޘۃ; 췮mLR_)TbJѝ[RUPf4يXT&H~7sFjRR=nj"v]2k6x2Ym4*!  I]n0!`[ ٙ)ZX6'h|`o`uSkƒSwek%9ӍOK:# P3K$-2T9ɒi3Q&U1I&@AQzq0 ID/tX,~_?k~#w|Z8akAp{Aȓ; B~?ykWWeMvFbe!}kDmd+Me8U3R- ټr!lURPݮEYu-cՌ)vQg(iֲӍl |u}%CCxCHeyJ<K=Re@7ˉ2%$-i&r6CV= ÕLZT)ddt1eLS`ol9 FP(ѐ d8Hh}܈(K"]|䕓/^ŋ֧hC'w܇:y㨰^̿r[&R_&:–BJ̀MLD΀2`-I (Ew(><Xd\NMe.XjLHNj3W-w߅?[Ww|CxCM/0YcK V=mbs;VxPwJYBS 5UJHTN&y-YKЂIeB%X%ML+UTaj &Q4Q$H}: rKF46 хL B~?y.><n7DM7|ͧo%DFLH.H(2D2TL!TvUPՔ*I H,2ƒl!O*DD0uTlmڮ~^6{T*`7nnߢYagC€{W/\o}{O\Rj!OBt:x$E& J=kIH$b+7i!X) QrlcIC2*m}E$5^2m{'urn^oo>ynTܪ&+5sfE3ݷܩ>7Vl>47$CʐGˤT"@pٔ ez ^jiSH&,,S2aTQKf2-ڦ R2۵X;:|+K&uߡ.zye]i:*^/RS -EMB=a3\bM^5⑬g:B 1hi$JA$e`)hTZ A-fMLH)]4 3a W/L[~@OIǔ &72omuR[JF@j[R~A 2Zc”Va-Ӈ-#S^[oךYî̌CjIKe-RdJ `Q2UMTY$,tVY0m&q3r%{NOmaup;c a>?l<ƌ]>fx gʦKmZX3Vssymi( V@I:Ey(L#%0 a^`( E* :!A )d $d>Aс4̓Z7M!pewlci$8~+M$slCmI?aa\Tu:%@!!"Ź C5DВچJ+($m ,[E0XifY"s1Bٓ^Aa iS˲R} G=Tv:O~4T(Nג8Z|.mjTsӗ<3-"AELDu֞$D.ˑeYz޿@::)R2њ5쑤&2a__HAMiJEEEFp?{`@qK3 K;/"1YtQC0_E'|ZteG=fc*C7lj}$-o0tɤ1-t=0eԺb\k7Bǔg8ii[6 dk ֗sԗg(J=F+,ځ#hnfngϞCW]>k#T.lvz!6F/ML~(^װj^WU9(aB{HJy/5e(!( Q肇`4! sc;̆BQ 3 ṋG G-G鍨д.F#d0"8qU DvH=(&B]c t8ut3}"Jt#h2l,3l̻}ي24&^N[+{M@nMgy~o)$|j@wĕ5yGDU>.X/|JsIUI@x7Xpiv 5qFpLm*,pjNz2HEQQ K6fKЊYP;r<0ְ‡n( djs\rqX[XIp 1ZTarh#i,_ _en&FE qYj#(E *̚F3m}Y3b;+;ev(R U #l֮l^P9uh7әWU}Ǟ?!әG$wo7_yzvzg,Ns5uzMV䌪΀:E\f!WЄteC {`d zX~zH嵀FhHk@4F j"6!v:&c(u-`5]dIش!4$0u-&NavNNӣa|ǿcgaXC5h*NzcbK yf/ Q,a`F`< EkE&2 W#}Yf+|P:\tfd|+o?CZİEbW< U]1}XLBBbD\ tL\ujtR[qMAЭW:"&ui@fcX8P*)X>T¡B8rc"8C4FanFhpKlbe 8&0kj?홖34D #uy/ #c} f`GYQ %& X&"چNMD=Qh2I͓ d`Mj#\iw+ۇ_ /]%)Қkon^pWy] }5鏏zl6H.I%?| } WgϡWQVkQhrhNm\Hmbٰ 'Em㦘̼Gpu %;X4X7D4VT RjqBuEc)qT;-}#X4A ٍ: lRIJ4of7p7+S`$Wz4G$6L6N0F<8H1]%daEDwp6YhP' aމ(,Bp*#F:9؈hU5ڄ\ NW(g?>.G/Fu)k:3+4$V{󯾹yۯGҷtɺwͥVgi v+toT( 0\dY+@E1zA}L1kћGM` gNc5!f ]a `ТaF@jF0꠺Nhhcc8KhmFh)4 t`,2--Qh#thƱ5Fvna0jDvniBnbNB[eYiC¢yZhCdW(np!۾% otwI /`,˱n3ۺv4Sv\MM]o\ޢ5ڣt \=XɎI(Yu(0FSfC|P7 D wSl،ԨЄzzٍfMPרI btաbD4i!4}w=LCʻ|\3Ag[Qxq#Ym uKYr}1\ת!dMؠ.1`T_ln0~veoA|_ v %{H^< bFz7;S*x֬&dmQ& /(Boҫ]X2i"+HdB(n!e9 Cuk\vƔ|{EwC~23\1|ô4 N>`"LLTDVEbv`aNnpmPܢtiݬH.۟u^ewnWCv.4ɹ ٍ#$AVi&\"7=y%ŸgZsHo#]o{.y ޸&rӧ8g]]s5]?ˮ* F3k1X{F7qT V~oB]!\s8n֖mtt bVly.MGǺu5#Kޚ/N[*?OBYY6*6f1SPFX]GagaشІ -b"glܢH5yIz ٍtɹFwO}I /ɸMa90Ne"<<^6q~#JH5vTzNت`٩ˆMP@'.[E1o  G ]NzɇĂ% yij'}.6ZMm 9""uDRq2-v32vy_Ȁ|=c$e7"D݄Aݜ1%ż 6r`Ho:}q Y_z":"mi?"jɼCf Ve{|CSv~.OHq"]뛰&l0!|+\O)lQOZEw갃&nGA5Ne7^g!$/cW`[#=x<3'alLk1os`c:Ks4ӹ9FoksϴFJXY#5Z[%E㬮ՠ #BxO)^K>Vx޿ۛS|>Dzh|\دwWgk77~* lFQ`4@]d\JOJOs) W_-8_5DxE*nK\֋̺>u β~ou Kt[Ew!"vfե*Uz~Fg;vCglV`? v>:7~uqz۫Qy[~ʭmlQi8׸l }V]wIqȫH}>^\+-Xc`c%^|g#^K~H}no|F{OTziS=-kԧno 0^V }|%>g  =t{lNAY;gmDp>]m!.WZ'{` Kvq*_*WoyG.ou)S>`o}wW~*U|n1x<*~~K6m;%8;]1-wXgk'Qn-Pn.fwLEUOC%Fe|` 1=VK%)s}D|?{wNs}b^ݝ-?h$uO]N#)ὢEPWvs-7^ޖj`ʷ;-+:DaU7*S%_ܼs] /I%Kx*O]?{T~'Q=-C"ndw{_]ooU8=[w䮶Ee95[$+:_-eBKlriNeX囫Y*TxwITt,'[%$[t?RxI /뿻Y! }8t{|9}L Nv*7?>xΫ*?y_.gv7/.&n{/TGtxyۢ{Cro⃢:`^^9һK|f"U~a_]galW8!S #w/7/.u*7^{rq,h%5EY.OEwV_qvCtIv)$D/ڻ-tߩ &~Sxu^LYM`wr:ϝ[vʩVէߍHչ˿^=>Dv~T٥^C VOn=?U~ !_"|og}C(;C|}F.VCloJo;'$K%){&><~}ќo>'mÃ/xn!dw~٥^c޸7xm}x TmW՛v[nXҔ-\WtH'] /I%?>Bzۮ Ώ2Wϐm!Ьr/N"? {/'wEKRxɏ-I|_O `3y>D򞢔b!r^O.^K~ }&Oy~'g>}&SvC옟RxI /){}SMp}>{Y.ZxA|"/_y[J}>QL9:K%)$$=~K% 5߂guO:i~vԏ?]%I /H~#3)$$9g?'!^)O.$)$ߤؒ$$7I1E$)$EJK%I$U$I$)$I$I%I$I /I$IRxI$IK$I^$I$I$$I$I$$I$)$I$I%I$I /I$IRxI$IK$I^$I$I^$I$I$$I$)$I$I%I$I /I$IRxI$IK$I^$IK$I^$I$I$$I$)$I$I%I$I /I$IRxI$IK$IRxI$IK$I^$I$I$$I$)$I$I%I$I /I$IRxI$I /I$IRxI$IK$I^$I$I$$I$)$I$I%I$I /I$I%I$I /I$IRxI$IK$I^$I$I$$I$)$I$I%I$)$I$I%I$I /I$IRxI$IK$I^$I$I$$I$)$I$$I$)$I$I%I$I /I$IRxI$IK$I^$I$I$$I$I$$I$)$I$)HIENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/splash_anim/splash_anim_05.png0000644000076500000000000011623112647526517024352 0ustar devwheel00000000000000PNG  IHDRj`IDATxٓlyމ=~+jOgLb R$(1jZ--;CajW" RK-,I (@gCUe}_|\Uj}pA$*keV:/w$ IS044444744444474444447444444744444474444447444444744444474444474444447444444744444474444447444444744444474444447444444744444744444474444447444444744444474444447444444744444474444447444447444444744444474444447444444744444474444447444444744444474444474444447444444744444474444447444444744444474444447444444744444744444474444447444444744444474444447444444744444474444447444447444444744444474444447444444744444474444447444444744444474444474444447444444744444474444447444444744444474444447444444744444744444474444447444444744444474444447444444744444474444447444447444444744444474444447444444744444474444447444444744444744444474444447444444744444474444447444444744444474444447444447444444744444474444447444444744444474444447444444744444474444474444447444444744444474444447444444744444474444447444444744444744444474444447444444744444474444447444444744444vT)wX8L|jdp"|?|Ͽ_x~r^gZk7Unɹ {o݀ 97474ݳ~=W02>}7X?/B?#D 0nBm<|!tO݄|W UȽU|VZ'~#~?% ·$^w/{mC{ܓvȮ YMp?'>]zE^<<#~J _x MAooho;>tork8- j[Su0{toU^k]Q> |G'd7747~د{V=+]9ip}.p5OCk?o&= O|xCxx? |-WËvܞ }V=ٽ~y^x~C=n]:uv^Rs:- |]{~M l hjkd7@)t9Nuri[7B> z%ޯo|V'Anynȉ= l_hVpۨ;[Vo8ٞ9<ͭ<&,zs]!̷9g߷a xpKepzxCxxO=躳M[n=ro`Xs3N.=wFo~k{.'nLݥC-[@oug޻  tk7‹><•7nRyCNj;WsogpnoKpo|P]k 9^S] . z^z3&{77473]Ի j~t V wq3y#6O=?~uMzס-.tX0nBׁobz¯ ^~ hWw+3~77747MCÚYy?_9- rPeQN][d~\p1=\z:f`9k|gJ]5D7Gv b '߾ e]WmT> tr;*pSwN'BQ{RxQ[T'Ou M4= xkX.U(s [F?_ &tp}8̫|`wtbgǼ[s 렷uó@oohon W>yf56١Uou[C.~Zȭm96kKE al;jz*mvY{N*GX,*Z?'8l9A= XŅ:6v|[w{>zOzxCxx'}57P]uv*U.# NUܜKrRlx ӎaMl_*מ렷7'w pٝ^[=7rsR|yx/[m;<lnҖ7 m|HAo zxCxx?p]d|WAW^\`WXVh5 c+8\_Ŵr|lKP%y+!5WCfaRjVut#/6qY8Ku9uo𭡷 ky|kU}?7747ݥ[`&-*{Ԗ&KFʢ>O/9NTcF٬S+|R\wn]rw::ϟ1=~ĕ<^qwtv&߻*ĩs 5*]3sxÜ%yrTߎMy- knoo>?G/1ͧyxNQr- ..N뒮dĺ .-0qq~=O%Y3WLW5cŭ f#-!ΙE3]\~&].ٞ71/l qև;=-m/giwo纃z~jwvO?H݃%[ݽ1zjݭ3Am%\ɪEIm%w•On i.D\t=W+:\͌!ht\Ӿ8k!D7ߎ6*߹m5?v6%&O!z7:]ݫwN|<;\@5V2i+J :WMK-v[rxkJ 9]TIySA/V)hԏyf0m6eX(t^m $dY j~PˬV.e]\Zd• Np%IVTflor@#+] UK^roE K- ;km 3b l T=){a߽{vj >6rӍ/z2>odp߇1+&;nss\㫚S3fy#| [*j-ͺ oL8*˵'x< evXF$SMIjqY p8ԼsކҘҘ|{9Y~vsggG[-yf*oj-8qM۔G:ʇ5NpwzxCϢ2Nʧ_n9,2x~/x1['ƜnVq骬ynT͜{NɚB$3U,U|&dԜFhJڻ3<~jD.BXqy54 L AWC'H;@Rٽm7;rqO936)ZJ4]ݔɋ4-LU fÒ$*0SFzB(Ȭ-NK8㱄Q>(?v2(::0e< Ag4ye)mnzŦ!.;W|Վm PiVUs|~/ ZNu1.Boohov߽s6v xn)uIyb\ؙ i&IBfL,"dp&Qp.Q~ b4xtGxZ2tLETmUmR ws ,nt\Hfrlftct7"p{0H6&P\5iLE1Y7\4@R s_%h Ru eK&!!h BV`#E,$ja Q  siϜ7ϒ6v'g4w<S!{?W 6] Q|gF|GۖS0 MOFkK.veUUw74%Pâ:7 7+VyTDESPH 7dML$&EBLEnM'3 D,ƅDBSp7MEf@NY8h](&s)&J9 Ig,aL,0pJi^a,ղVfӾwⵅSgXhxorΓK8ů)A?ݡ^}-Nj]=PRM5Tm#nP[u bps š]RK",[%4fJ.L3tLrQ&Ivoe,`<Ț%Ortڗ4?˒tbBRY{Lu2!R)ª1\:*S͹4 cTfz*= 6 CٖnҦc`{/y[Nwy-9QQ ?[\=䫶7647 }p%y|JJ++żװK3/CZD\L!wWI IT1(39L&fŒIDYzskh\ `zT$. *3a ` R !<ȐH`06Ō)O iT,A֒8eijD2Ҩ0EìڧL!‹+v43s33/n<2TDݦN:@ov<BDs{}vy8\k ;0m/ð||޳%h,)OaSuyB;jb;my0$MfNîZqQ7Kҩly؊,d0daVHPk3\d.hjՏ$^ӑ deThZG[BtD,eD(Ĕ-'AJE;!("x*' (0OVlsԋi'|[dYKRZmw `ߪ92b[K{m }U?B~ O [;ד~Mrba'>DDx2 sX ]4Zf"&OU7P.X4x[L'}-SnZ Qw}A~ .gMfC4 I9K5dK0uG,e“9!IȢ FyDL Ci3X+ꤧ%Dj]7ofu#Ì(뼍zyGvsλf;. c|'lnhof~v>Br;{㔹 [Bd֍UwGti}]"bvf$:EbP4&bWxfʐL;BiH(0UHΘl"((KxxUft&iRf/jhuu#0 8VKoUnj^zX븗k{V+4xCxC™7vy%4l{oV\0/0` >Y afE$2BlUF*pJ.r9CrHh.Z:[D6H ZA4iN҈`3o4lHoT[ +fsebRwfmB0(ED1@$L,,J1UDT$Qh'#CɢjNX @*9E`(pyYxRZ{sx^m8TYcK5g 747ܳ3ǿ]q"WdIdNn,KZl@][gH9 dY`at2 iUY+ 2WZW;dIs9A ez{ `Npxj1MliLlu) mI/Ch1af4meJ CfZ) fOH gXHY6{$A@E H\0H('YfP:!DbԴZ$Tb#0P:3wSc"'FNʡ[.U߃z_kwwqvwqiTVɳf)oDO5YKUstȘ%fL"=iaN@+} 0Z/^l0nZ`4F/\![dmt+c1h߮{<Y}*rž6i zL& E['4emuZflLXAPmfK)QYbd)V aV` Y Ƀ^Qgˬ .OY'ir':tfU3F}j wo:hd';o,bՆm臈6Ӽ5q.,djJ6gܞ\(4-UN [!3KX:%MFkWƏ(3L4vxAҤk(Qmg^P8.FǡD3{'>2Ra\2dkPDm1!&\ѪP-h 4y=hmµ6;қ߉4jf7!Ey±/0R>)Io?x/Ή4۷I ߮Zm1/ܿNWaM>47847:_ l g*|7=1j,](ֈ@KCBfJn2.IVYbkU=ɔn2I4st#Eoݶ 4aY69x؏|V }>KOY}`zS{RR8E1s)$P*}%,LTg-秶1֓A4%'$" 2A3# F<͗>=RJ Α37 磓vY.{f>^tVΡ.™WRlv')ŝwmDYEًUFNܻAi%[3Z?^+L1Sk=0@&&oNXA|]#` j@o7 i̚{2aVҊSھt᧎5(Pgd+IH%UcyֲwdPIӰ #T.ZͅO/#zǡDKTYMiPfYŬP*2H&L9 3Κl=p[AY8VsyW]1|P=d ]_\݃{ݦ6~,ssw |daa9 RE^ 3#Pgc@(tKJ4"3l"Dќxs=&#[rVI}v!͋.Qd=AjBRt ZJ_jt2-;<[ CB@67̂V"ۏ΀6 4P5A% fB- 0-|MDQ2깸UA ZYq=3 +CCxC߽w(n4"vũ6)O2X7&wV+UMj9v3V1<,؜g_:,.OSTzM)QҙAZtxZa08zSz{^ww}hi\#A`c״ZBgQT:^"!;E 6YhiH>2"nu3D&YmqU-ڏ$,UT, aIHJO7fmdʜ І%e ˜d,Ŧ,/N [ b7!ûp<ؖ047j_{ aU]nũ[J8Eww0gŋ"2 <ҍdAZot/%duCf.9^ P09Vd0Y.I7# dP-G֌ hiV~i,twK|nĝ{\,TLd73쭲9t𛛓ފUx\mE:%g Y*=/@F+׎Od;fֲfyÅA,@ka{&B6Da,rVNjrd.5%ed fyheKkBϘ^g"xOk>[yWÙOgO!f*זZ# =ͼ7эa,Q,Q L4Me1"[{/`M,h 'UP t̰r~,qiW0M̻;9{я/?_ykXZLZbղ}k׾pwYl Z8Ù4k+ϢM9[ 0 B@cCK=obC>äL+fZ#d"FpsWT *^ n`5!EX_tƿ7~zu*{Zew "J%*dbM >hATYkoAV", +ȄN@a2eqXSՍ4) Miy)PJΔHh33 }l26ilXn<^s8 m~|x@oho9x|Պ`wۜwdD)E8'F "4ۤ:^*=fa4Na.5PٲxNpbkW0T!G„Pe{=Nx[[XW`[v xWoG($?ŏ_rK+L4w^`f8{Čh摫<~SOw>l_N^ NdW3~{|7YUdd!F\h [eR5JN*T[$$B2:ZUS -r fRzf;hdT-%9L3MriOPvO k<ހл6$\TɥJΒʳM_&XZ+O4Go?h$ᕓMn4LO;NSkk1 &`2/ m^\(w]~~5w n | #8'&ߘ|v JJuzWG_ͯ,?xEᅻ>'q{_ſ*&Yj*RASE6Lo?'NuU% -$HS8$TfՕ'ҴS^%-Ķͮ%:esa؝ǃ _|:ajn)xVΜ'0X,ئ/6S$4omJLb03 ,pGAҫ<ǼHyko(*{VܼWc`&䃳⃷~Z[nB~tyK?hW=gt 5:o7lw''yg~B?_"W^.))ZeP 9ZޖLQ*<)< jmqof7@ ֶ]t[ԢIUN ,!˓ggrZBz4Ee9vC$`;kuwSstEv>mm3R K *4ыNʒ4z\Zsr5t֖QW(3#a xc7>o[ W (Zwmszeuсӿ}ziW| UusfI[=g" x~y8cK=ơht/ fCxح(z٠ÿdf[enV*ѳ'26ߪ҆ҺkjWX> Bsߵ0~ld'G`͛46_L@.k`݌avXC8MBd9`0Q_sNt кurV <#Бc~ !ج^۷_ ̇;9yk qIX[ZqP9 $n '4Ysz2Y5$LE&9e%`PJ垭oEka͓ˀӭuq Z6>8D;ngkn[l`i7H3O;i2W XÜoN&Cimp]uV l> 4d\qy˱>_?[OvuWAv7+Ǟw/wB<,^/}~TZ!p oƶծOD"Ho n-./M=#`*;)MnTGT8G§2޽w™!"0ݢKL(ǃ$#<{HaW`7G[;'H$Skh?ꅨ/`\-P&n.Ξ7{l~€p&- UG\OzAQNs;XX6Ҙ.U3<4Q%XRy$f˜.лkf3v%㛧^- KVt[=f&Z"LEF5wk6gN4qg>sY{tSyK>iI'73sq| q_"pj W_{|$zt[踅IXk9O8apSncm];̕Hzi{g\57=S(טyrp|'i'"w~+b},!(đH( ̕FrjaFZYŖ[*`Zb+}dH4O++q[?4g^Dcn?ePm~ѕxUǏ'E ,8dodow˿pR?ud?r&q)(-$[=,=!؆{&IKGz%IyU7(!áu'~h3;Ar!}w{/_;W/V+km*xqU4疜"zf}2+NGRFZ+-甥F֠Ъ>shDz^~坅Pr=wǚ@wOPۇEhU4=yOq67gWY{۞YK=V룬E4K4LԵWVDThز|>۽B/\\޺ AkuWnm_|O-rI\]z^suq,<{$c+G\ZppsM^<^oť7`74 3e7Uq+ < ti`>rwiƴ7Dw5.c/ }$i|x+-k7g<¯w |7: }:ō1nO_W,sMa'^ 6۬ˬw>Mm!b{h vRCҞpx왧O/\n`;4 /*K/^L'aufĸ$ldmJ"X/yp"-(i}k;-Xnp%LI`Z8͍cC?9? ?ИS+gl ǯwO\1~0iifj9Cm(:xU&X ~5k'O^zf Ƽi+lj W*Xe~py@N#KeQmhsXkKH3`bmvTVZO]\sñr|?} +/g~4*Za̕* bݖ.ߖe+泋˓ҮO[ތ/db[~WwO&aML" mtkOXC5Ay?Пp]+ˏ_86kpߵ/ޏlc:}hƄ7 Z״p&Ӛ%/m‹?߿,/(Yn>ǀO,t/shWrz+.'l3"P׏<\ڸ1VpO9\U$,ʕp3@X- Q%wWTɧ^Ќ1gsho=E;Rr<1Pd6eZi@IZ咤<8.mc\֒s&ۿxɹ*w(^Y~^nPAE+|]_? +\rr~qo\\ħ uʄSY`_?Q +-=%=w' "LJa"[U+@ Wʃ*1_nZvs)\Y&ʡgvxP\.L9o]̥ojZ lswpiۀG]m$s}}A ]\ư*tYzFת k1TyĪJ3hvhOՖ2BK`:eZPI0y|YOb`Y 3&v \w -AC p(_)dYڠLiNC6}1f6M}ddCPJ`_Bgݩxac5#xc}KyLx,mc*7'az%~"Rre=/;<;pgWX; |g癬*dvz{ t .Psqh~tu}}lj]칥[4i]ݢ;gDUc޺ryWX@&;d~lI%^~76*.ZħYɲr`ٗ؝`=g'jgz=0b W-/  7Oޥ:~N K%ۆ7mo/;rK|#uNwfCxC{EC}J8x@p,D9I\jnXoTeínYnrXp)/eA*aM2/T J}XrŹ/E*/^u Wc=Y޿ MaGGWs<;.~B3mNn)<\;z\U.ro xw_tsz@ԪBpyQ)Š۔=leԘPsrW£TwzƥbIytxKʴMPvW>'\1kDooؕy2iZB@d5D SJ}6oho{{qh12nYXۏ~co=I5< Y{R_Sq8 jWﯝ&x_>qtp.$_{àiFb\Υ 's(\"-_O*Iv0 O]f0aTusr &ڳ6Q)X"Hʹ^_X=vݨ箫Ƽ`eVW4׿E(,?$0!K:@lKa v<,q| zWH Vh76=~*\sd.[bߕ* y=◖K$$KSڶǾ}|rCB4wL]nG85+uץJ`8|uRC^]ut8 ޹v1oz;y>W UX嵼2ţM5J ܌ R8C,`1z&Ȗ~g蕋=^Z7__x׍c83;ϯ*3W໚ϛnL}J?m ^A~6%7۠{Laxx_vv'<#?\/vr}~CxC5ؖzK"]RxhEXaX.I4 au(kz lխ\W@rzj{#7M%LQ~l/NԪĖy{lJm1C{7|Jqt8vlQHBre%X)]YLS1o܈LGw ?oxzչ}]e R6}WsU߲~ڑC:M2dǭOtʪh۳hgt\5+F+лwG'p]rvh~0<*P7:^T&"⿹μz[+c5o?&R3Xع4x] {^XEymu_F?B^Jyanhot=7,՚[%`Zwr=l'*xQ-G@ǔw'\“/ +3zȪ}|邖+-PKq(ZY.˕1\ZDLPܜIKeJS&A(LTB*oy">~o/ukh5ګN_d;yziPWJD 2)[f +<yVD.\nnL8 :پryJ8*J0)] $J5'%,2Ȑ(cRު1:[HBA*#×U\ȼz?~z޿'@n{~i}{{^Iaٜ\)[ʪQ26Z!U{Bd2~[S{/ߓ$% I+&0[ԛSK"M3)2[(hњ[V֏'RtC\"H ݬ.&ZVjV6?\f?9-:&^i\@dفj!lNC-T{n޴\U E.joD"/75}~V[}JH3Wz;?"!u(gLH" ) "<)2 ) d*ӂ.ym՛sH b hU|ݥޓ{ԆM|Bs^W[@w틎UK)3W:TgAL*]} zUak*WgTWrk )Ѭߚ  ~o v ෿/_u!ͺ:/˜ӻߐBly`ReX=WɂRd—%1HF(Y&橽x%aho=Ӌ_e_Lv zp\SHX$,޽%lIt0~|UI]U8ʍtCxCOg_(B^bIj8:l -i ]tfA2 ($2L ,T7(\n3W#{GE%')~w}}zvO-/foktw~_6Mvu+B2zN/ۑ%C=2M%3=ijv kZ en˥څmRuv V*lwjCxCLOkM͎Z;<8sO1*)%r=X UcO1gg)K ピls5 *]W_g[Z^/o?o=ob$V?]W]//z+T$teXЊT Zh[uxH6T: C;pEA!fl1#C3MȝKs{[t!gotOvrC?`Y6-7;j[W)*{ go{ep! YFFaJFپ LtcܟL<f S:v.)"-rX4$7IeiSha W'ae<~[Go}xYf7xXc?tŕMa[Fe0(R [JJi$Zh3ZGL`—^M@F鲊D{Ȳ.I~{{wP۝Ij Erdpj' $, j+gB SL Zj,m C61 @e5YDf/{o~S!'֋b q?O8>^Z /a_]" n':~F7Aݷ_V٫ECDh] B(UV[ JdkHS z Q"#\%Ssd5E .#@e`rd'ΊsB}NBkYZлx'Ծi,w<1L}7.`vֳBRd(z+ e20YnYH9%dȔ/woR8EZ@˲~7?+/q~?ga(7Bn 0_?2LXH:TRP +AZ2-Z*+"2XUKTʔKdfE~k.LAmN >\0 '-35Zbâs;p3@847t߂|z7I/Nwļe4948~m8eAYD2AĔdF?T=$=Xl%宅(C`& IIDk 7TxqB\JV;=uC_+9C_/AL( >GxAlqxWA|xQ ow7cB: +/aCz Ck( Dw W,bFiܔAldu$}6o/ޒpW@/{;s4)z:Gy<_šmʡ*mVM4/Ӽ%|L\ QbD,JZ)Mɤ4%Ц#" HnBz <, 0<|y\}Gǀg"P5n@au?f|?RD8_ pq)[23hYj!*EK1MI*f g6޷Ze,#VIYەYȂh'q.96PҶ#lpxp2]\m7?zWTj~#G{x"wM+\Q!\&3I!9w @bE/0ZV<ӂ&W$L 1].PAӃ J^HE5 5Ȁg x=;9}dn}[j9d]![rG@%y.7Bo+_m| $z/AHxR) E@>-UlwloR?S2L*JfcR%ah@m+[OHTQlQ@:dz[||ʀ5& =UxܿwEpuZbPse2!K*aFg zYѷ&D%#ȄT+-)dF+#TUI& U!Y̔BRJ/fmZČ<^xyo._W6D2k* D$JՄf 3L5 )RPր*hRD Y+ViZcO%صuMuRZ"ћr2mbu㯱wo?Z֢''k+5v&x%KtlcbRB}XS &CQaUV%U!CPTԲ ve TKrlU+ j{f~;Be~]7/jRuD2Ym kes}IѶW(L VvF^d$L eSF8~}|S5K'~BlkBߞ^p!͡wKWoA{%=o!ʺ|I٩L ȩfK5yHl}4%3Jϔ<ŖdÜA%A' hBRCL2ADqzBfJz~vR [’\.>PKPa<6q%CnH0w~ߞ ! jLf*@XD Y]!y-}^iH8݁fuKHʓj8[3DC e- ;®7'm-y@oh<0z@qho{Ӓ{cޮ5/bK]u2λWx>J#a+䅽zu =|x.y̶{U] H)؞[ o7Q^(p/srTNUEhImX8%=-R2iP c2pL3QhemU!= RZ{魟}hRk檁۬\zkj/<\MmjV(ʐՀN"dQ36Zi3QAy FJΖ:l=vEۉǩ ܵVͥ,?6 VK[z*.幤򐪓fR۬؛B5Jl aD* Z$ F EL"ӂDZDPemJ]M ,xKIij~oh)_~oß;q9,8x:>Gkz~ߋlqH*)E_NޖB+PbBaYQi-TU!h߳"ShjZBjd e+SUUNe@<;=z-mɓnwohoYÚ&~kw?Tu&̧JB9j %d%agc`[L 3 fc1%G50"d bz 47%2]f9) *)m[_>Wng}}>/,'1JXs<雧߉|7)q&*R@m?n B @%`FkwRU^FF@ʣsVi@[o^)e $u%ً%B$SO6&OTaգ|tf@;cy/|~jx£%y>8=˻/vٞ”YYyom'O_՛'+ Z(5lWuTW&5Z~a@ëZc]e02ա+%eQ24KCP&UAdRʴ6m/HےXs ݊Urdq#pLVV$i2^}563zyQKjlh4SS$,D %[gybYڔnP1)6>Ɩ{&Ýcd$xR B2*s#)5xʬ1Rcț6hnMr(s>z)ȍianMc rz:/k|s^\Ę<,4˵-AH9n۱A56M`As#iw4!czYCv̄{04i+Q1!}dmgES$}e-|nc|kZђpz:RӋ%➛Ń_} oOMMruMS5l@)mݧ?pr}>tfQ+/?O>5πm_B_f]fgB}SOMԕnZNMΩ6E39en褱ej)m*AE+<4St h҄>hL5JT3RZN!35@Fm]pY3N4X>dgcN3̴&'GY4^|04$KxiKHc -0X#Bi9Z+@1<""-Mh ZQS[b-,@Gg,ؐh0Oo̠3dѴ݈摺ߊn:׏Nu_Q+=y}%O`ko;y[} DW4XJ5p#S& -lq7 puc!,G(G8FִwKՅݨ2}%$PT[{ЍiN)-M1">H1m Ru!KQ-l4'sJ F lF#s:{%2YMxa)kãtfyڦc ř~[p *ɍ_$W% 却 Hָ٥/['6-؀f] Sΰ4'@&:3!ZXbJOohL@&NA$I9Z+/=8#=9#hHƚek(Z{< &eNT1]MA2b?  m=%M4=[&pu A<6JQ(*i41ؙk["}Lc1i4{R0 Qmy01L5! ]>/D=N8df"غ(\ɶ?ÛFLgN@ms%pxLݟ?❨}x ?[~_~2[|ĞRTnc[!ل)rL- .بƌ9x_fZML)fɉ|-{ǐG ieH a :eA :!r}L`\(uB@OgIt";2 CRPî4 Cc2hHPALI)_#  c$i !S@ =MA:8EZr,\I&NRY'LP9%'= O$J~%;A2XDp B]PT>hDo߱Ft7Q]BR!hD(@E:{z7,b2Ht }dhl@#;"2K`PW:;f٨M 5j,eg{Zs3]mM⚺cMgzc)aMglƱ`cH+aə4,ZaLSQ;,#@ʐ-IY)LZC4MA.r\)KXCPiٕ KXҚ=  t¨g)`UAt4uNH6[f K&tefS(b@)i2dĖf]?^mv}δN={c6|ܧ_̊JiO? |{|}8Y~+\Oi aLcl\jS;?L>n3)86m}q#6³5t3rDhlIК {JnÔʣu2G6$:4i,6t:H0A =`#@3>a@q̏Z(cRؾQbtN6Ҩ4*ei-ed9uB@0a.m%RMb4 fSr9E:Aƙ^dOuxhAin׍8Fw~!Ӛݟ\6uZq3-mܼ5N}4 mL9sLz5f:yJ7jbeҙY!g攜S=]iJz8iJ AgF%f=Mʠe QNfȑ% K: ؅+R?Dz ms)zY-Cv nd f$1eNH0X40:Ѝ;&Q>ƎȘ3 ]3O#kMٵIL5z#tHc;h'SJ]z Yl.>.9r]s6dg|ȯJXbMtݝu Ω' ۮ)ihL֦3i)'ќZ4,Ll4P2sD4yh1dٜ>6x %763:a3A7 @hԐum]q!) i$8FdbLO]ta(4e4ɴ5kEq/:@|#;h}~ZݒM s'{qtN._?NewzՋ'WS״7,okZw+qN [6LYgZ- \l gC2frZ ) CIa"sLF%@<í Oa!tpD‚P7ebcFTG` `M˗:q9a,$uI;," IAS銔-[s<$3-FdNl id k},( cVٙ1h<oܦ.,7(}7l{%vv~yToPz!U:GЧ_8>< i9qʼn7}rPÄ66 S};E5% qRck#nNFK`)yfdLOf1-ޙ-t_Gd`늢>X|Z20Z*~%0lL~ĴlܸP1ǡ aDьJCMK# ܄NKSQ4$Kc'Lְ p| `D3ape2 ڀ@^:'4R eL'~</óϤE=ozμLXHޛԍ >s.n)T 6Fҙ!2ҏ2XftNCmLZXf0KY 51emsuMpӹOv((5o2O3? 7+=w|,ZZc릫kkKo!NΑNk]}2S&[b) PeQH:S<-JɺےˆIjٍJKerm)=CS4u҈-M l X&,DX&I}G"SWNυKzoXhHK!F$ᶋqvHUH1GGbE%6 #S,2}8I{y벹kw%6}twWvO`twOoE4W45Sqj1쇿y#SJvKxE VK({hu'3Yv'=Ni77m|Vbc& M.#&ZoyTLy#>LjQb$wə,>fXL8 [đF•M qoCq 4mk`|#Z)>Ǣv#[ELi譳EgEU{56|%m#y /<^xۛ7y^'Y+Jx%]ݍJwmy~oeWxldIyDJz^j3҉6!SlM6+n/19vWM|D}eX^r\g/ nߠ6}c1 kz!-MQ&h,sJYN˦Cr&'[[ ,]{4nnҗIχf}'C'W>JxśP}x+y+~K~qg/?c+8#׍Kmߍo.jϝ>:m6-w#yδ!E'vscr٬g|1L:Hii2lsr3M&M6ocCtnOhw~IX\&߁)n>+cF0UrZK҅Qbi=˦eꜺ7!&}&듮I8I :vn7͙"?;S;F~18W DN&((pj]3mg:m󦩝M،IGf搤˦i3sU|w^/`RIsd8~QJxt7JnSnlu#>u^z׬>M;1".Mf&FT=ٍ6"_딶ݍu-ƈ8xeٯo =ʮW)ז ?Oرo-lG쥗Y㚓L<vɞ?OFc6봖fob}-^9dkSiZq s(L%i<ɻ>[tAEG1V:^}{ˏ]ˮW-[{Y|vWz$i};^2h-sD;DRӶ}Tt裲s/?oߍxN1dw#er!_Ti! nvLj mqf7jǢy9.IMgINTZ𛓍zsz;ido/?~7?}+w)P)%<ޫ./nR{|5L{v_";kAZlǛyEKUz\~d˙v!i'7z|ښd*x{w%Fܖ>%Z-vw+:u!}kˍ$*W>v5GۅN/?{PvǢFj{XZv%W^7;~gzҋu-b9L{˙Gƙv~u<iۛFHm^)t$D`K9y>(幛qwGpn<<w!Nt^t5Ma 4\<]xT| 7\n4VὯ>^Q+MKo/kquķݤ9]AFXrδ{xKb/N=rxJxE >o("[mw,:}<'/}RO8%)M-7»ܾ|_8koݕܱ{|7pۏΟ٣vj+%}7ڻMkҜ/;߱Mhz؞\A }~Hf}"{Hp#9_ vw%Gk*zPt?/+DeW+Jx{{ރ?~ma񫿶:/O=~Lˣt?(ey<1w>h+|o > >ѽ$]ɮW.7Hu[ oo_\>%x,vV=/cɵ ~*es쎊SN9Jtwew+ٕ^A{ݖ}}7^.DwrOH~9${{DvH] (Lxo(!k/}r{wTy_Zl焯 !W~]z6.eW+Jx^G|?ͫg]'ɇRm 3W}W=$!<(^Q+}h]r!߼Y4xoR- %/&?Q!׾!dW+Jxw&ޛJꫤ]_WpOVt%W|{/ ez] (ὥE>oM{m{}?ѕcz ŧF/RT+[ }K]?>$({^Grz ]5%W߱^ݽ_uC](JxE7ͷm}Ш$WG~}F#%W{9{LB,%S\2LoQ?yέ}T]DQb)(JxE^QiԢFEQ.z (^QEQ(WEQ%((EQE ((JxEQEQ+(JxEQEQ+(^QEQ(WEQ%((EQE ((JxEQE ((JxEQEQ+(^QEQ(WEQ%((EQE ((EQE ((JxEQEQ+(^QEQ(WEQ%((EQ%((EQE ((JxEQEQ+(^QEQ(WEQ%(WEQ%((EQE ((JxEQEQ+(^QEQ(WEQ(WEQ%((EQE ((JxEQEQ+(^QEQ(^QEQ(WEQ%((EQE ((JxEQEQ+(^QEQ+(^QEQ(WEQ%((EQE ((JxEQEQ+(JxEQEoN$!IENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/splash_anim/splash_anim_06.png0000644000076500000000000011721412647526517024355 0ustar devwheel00000000000000PNG  IHDRjSIDATxۓdyމ=~+{q$A@Cb4 Ob+3W_Wք1vxKP-Q($H `л{߷2WeUu>bSD"3WfeWe^|#%ahhhhhux >9ރN)>5~U|[ yi|hhohm7CxCCn?_?g@phohQOϬS ~_gx /|_ T`oߝFҟGG:Ob{; @|W|J8;Y*͡?͠ė?O ŧ{Z~ȟ<4s'8G-|q}M<5i!^ව D>bǩoohOw w O5g8y oc_Mpoho w+ǟrv˧^Njמw{[Ns~/U5 ~AG ^?r7&;-^? |xCxx&5% t[@w8X w5;|ōKfM77kzW=rc[l .RGWgm ?M?[-p<ŕC yGWnw߻G v5n]s/s-G O>\Țc5е{'Vt>9*ȶ:zs'ov|M9msvt%̙`!c02~[lv!WkzxCxx&; |-v{tekur57WžgHDnYKK&V8.#՜ ~mi|?ԮXťM07747an9`w-yLrs%ldRݽ\Wm+M#dhjm Yv`͘W\4$oZPLv8ruJNؕ\›ASu4ǓJ׺Eʶwyb^@YUϞفpL3`z;ZeC~Wv= Qgǃ]u̒KӕܘffbYZP PvC` RV%,``jf0AL9|IC1h2 7W39Cds;?S4 (R!TTZ#3J*] 4 (CNWh> 0&'% Ӏ<l[+u@u.Li P%`j10 ॖL".c[S݄vs4+]d( iH8gڻbZzXY5?lέMY8!ؼ;&ow>ui}P!k[ v޽@I{p1 q.'*aH'6t`Q)!t$$5]ZYQ 8MIy%@Ѿ5ܹ7H 9;J8yp&@ Lx@QR4[i L-IWBIpgfSdgf݄AS!]bi-! +-/9ihkѝl[3/rzwbkgs>r$‚zS6zOpwW`j|rN'd2Yg0cJY,6"$ZCBC=: K%HViq|] ]^qn0.cq J0&(jpr;&%)h:eI֜ jLS[Aqœ- /A1Tmqu{l-9_KhᬭyG:]ؔͻ*֚\]' .qN.o8>0w4sa%RUlI0`WȎls ES7n ^=U,A(k &Qi, iVL)䤒*n$횉`v&IID^$iI) -; DX(a!PWmpIiHU$ *A<ɬ(DHl'ԣy C(if騆9,K㜏Ϊ8oh69!s rixb[E>C+byCC މ v͙uཱ}e7AvݱJzo9Q-8ddgGm"ZQQ2c2-VJJhi679D!̖F: "Vlql2dj̝ _푹rv gj׋jI\7#-'' ƕ -bգ.$c!=HMeI2%"ǁKBs lm4v 0[Sz[\]Nrw"m?89=86VoUz78#\w3'Mo8C-;\Xٽ<߱v̻[b՘1Ynl:`&L-V闖d*Ɠ>cnLϭ{Cw]rip/@Vd6 =% v%p,|s~y|Q,,!^{vvƉmqw)^LŐݽST'EȔ2KKNy.}zLÔNR,t4&`8`=o+P, acn-{2[wjI*S=,:3AHTR 3deʌTW M2tYﴰfƖ!Y夛Ϊ'ALnbBkB'5 ݨzO\`w只n$v&j)խ,iŐN0IT[d6)Zh!#= 2 QtSe5cA"-)$+9Vri\)u_ }BD_=d-Ccsa2VZ\BXo2HWZ+mƔdBp0i Ff'Iׂ"deFe O0M Vf z[ԣ9+aK`g!{TA{gă;KU g ,[󞔟{r'EmCxCO g>:k\\S\`Ev{% YzfZuwc2-&OY+1 7gҊ֝C9I~\.)p% n2ZBZV^\LPq%LYzXZ$ )6&?IHji i)e+,I&ESLRBͪjs0T&-@OՃul&-IrMnyPs3'˜=Amt < Xx.?P٭[zV>bZr/'u| _ |PehoÇMLvigyoge]7ae)>edn%t)FH0m/<`QK+ekt9L 2k7ZGo*}`&Y,Dto @M)@&ERLbD KBzT&p (-)2D(,%kL@H#-(I%YzLJ"huC@rH̨)gn*O܌ac В#ҠIȄT`ZKR@qS{ґ $!%hDiHUd(P$,I$Pd33J7 d3fi:h"M\6r$0?4vsJؙxy|VE,sp gp K X ]۞,.4q[[ W`i4 Y`gO@x(m((D24gk69,'9,-Ue\cJCL%ۜib2rHk V"2]Z߮9>&-=FkGh;;Ԋ.(% h#ІȐ'٦2J#R"/GXcɷWw.xtvl[&!r򖿥|vm |Zwws ۏ)^հGm\eŔ]g1`nRkgf7+F$3FD)*I T1Z:@K#̝1MR J""?WT&L BkP @fA)"cd SRn[<63ԅHCeY{Ba]nc.Ye:Mۧzd'i 9^dކR/.cKM[F[pxCCOݛ/掷α;;%P6 s>9 3^ .Y3nAU&̩C%B͂ Y2۶YKҪGz CMJ̥+uguWxC;M㓷%N4푝z f]ahhoXP"Iϭ%!]y ĜDΥ%fuWIӐVj4&S&ҳ!,f,+ѷR^C!I0.V=$ipU|fiOMQi%A6"Z-ArhL(*òNCeʠZagVc@pZbM,lMQQ:p,!5Қ\:ՙ)'xˣK/ģc@>pO~/:lnhoKUSĚG'7xdZ-0ei=|v7.G1Lk}v|#dVȰSܠ QDOZi4dl%\,]l(#M=-'F c=;%6>D1-[O;RR?nٜS <ӂ -+V Ҥd5#< lfZ<"K+Q9笓\IiL6.jIʖT!y|pC{`7@747b Nsf~@v vv>5)4`1AW2M`xH3`i;Y@&2* j{]䐙#i->`ZsmS"ӐFZ #MD`CZG5 RTte eܒe}oRdH&dP(h!F)2-HM"R耣H!T#iÔyS네Gq՘ZxpW)I eL4umnoho/¦A\[RǢ"T O, oMFZdZ5 13&I4E:zHxҝ&CCPfNQ$dͽ 49e:[A5hRf dʿW.\S;>>.y)I1<fAN/'p6-K1ZNZS;$D4y[#íjn ,]=W֦f(t&Jj.k4#]Nߚް,V19&rז4-70$2 JKɀLcBL"IȄ'[L~z~|O?4Cm4_u}9q Y2n'ksqi}k,E+-tf4 t4#k!MK oki6Q% `I3./W-׺eFZ=d̥$$D2 `[:'F" zTAK @4ԊTDS")&L!Oyۓi=3= d)ضQ7 La6C$B V4 Ho}YV34T7^Fݸm6=BQ)ә,7Ӓm4jIH; AK$ PQ1$H0)K--6, `fՔZ-p@=WG1݁&y3 nB3-ҡšsKRyyކMuzir1*3KL.* W‰O}OR8ͽ2{`y ;\~):fnt٥M6E¬4V^RNNQ@Û+'#ZufSV`K&:pJPQୗΜ0kK dBi- F[3IW/>Wj{7nJ&Z7g}sZ9yGwNQ2kb?6#@ PL$jda=\CHʲCIB.xb Xʠ]ӛ2`J0g^dcY!HL8B0if3jᙎBipDLtmOtvB9tsē7% =-[͟[,DO;<GF4K0LdapR%IT$MRaz-tfDmC4Nt: CnH0 Њc5[H/g~/m/?l[ZIn- @T z9~7s>TMRk8Z9[}' ^@(@ew%,Ew3F23l5R$uJk<)l&*m6@}y>cTJoЀ|ۧ! 9N m{`pf:OpqwKӼi^>KfIv 憒Vp:nL)'`$e(@/j62npp'=O?/`nV4mY449a%Y^c/ؗ7~oGO˳YZQ4&SF2\$Ph9F {aDg2`+ϴf%27$fMs% ɔE!m>yDMZZ~wngg/3|ć8K}<_EeЊU`Vh.o{$bJ WlGМv/F<LJz:(OtWIWb}Sm++&QA Wh Kws> 4yOOG6h\m찺>t~z<_f$r/[ɳ?@ Kо^)쓫d2Փ$L" iIYoi%< !  @KJwy"}$S(d%9e6'bm[ mf0Oɘ,Lj/.OG\З[#: §K|vCxCJ/Pl=xf.--gwဇX'zQ;q# 7O!̼1=3(toC. !ۂWڟ6emZh36aϜρîu5*y>}5_?g|}O%& ih{F`60Ӑmj tDK֖/ZUm)V9Jy0^S` 31,@8Fl)=e5#c픾Obqye^5wּ)9˜CxCOyS3Pl}\{[ 1n`lu٦{9LVYZws3\eAstdhF,mZ7q$M'/o%tg[07w\sJnxǁKw^zsne*3<_><۷LmwmQO4S Aӭd(a}Y]Jz“ȒiӾuсDb y8ae/V:B a1 IG3[ $M M &$޲ ,p g # v7^Ł<ĵ4w:OJ-şqGjS-0 ʶlPwd߲9)l"ypN"a)OA [ }9fh#~ poץ.͹xW֡K>؊Ϭ E"%w0?o~~|Ԧ6Ȝ-k6h\%~I0Lkp6Y!6%eWehØa+Ň'(^zO,sR+Z=yٖ\<)' rLTQ^`t%6}:0s|/߷Vyjc`m=27K'ZUxz뷏 6X9;^fSz|?l+j^ъ֯BhC|4köqm3<$Hzey];+Am*K!KGodKxz@;穡_ 9K/Oijӽ[G{4gELY6gEm1ռ̧Lqf~ZDBCk.3C[/[`YZByUp_yͿ:!`CAW: /+ܧ\ ~_[ybv3awoEK_>a(LFi9L{.l_C^mewyjvIҊXǸ;747{>s_Gwncov~4ৱrw7tDҎ7m{/RFWwzK_bێn{s~}AF϶Bde M&YmB."\Ȋo=7}aaXs ǝ#oo}hoa} +V/jX'vh.1J[Oʪuȵ ˈ"#ƊҧUp6G{_~v[B۠ d)vnv[g򟵪`$c7Bϯz*P'k$Y9_Z>s 1vv'Te#ĺ9sQ +;Н7 >7au`_ |t+CO5N<~Ɖ9h6߀K;B;֮f99h*0K O@&v`9ܡUn$E.a_9lKJUW;P'?~ /OP [!VrP/g6} +oU2sU]”6j$Ȣص#euB*i+•]}nh8?lE' .?6O44!ML'L}C9BR@:@NWk+Na=@~V[6ϬÚ'?|e??khyš|*!ޮuUQK ?xM:nSSLŒmٮYI2LX)6P@$C "2OP, %9-v>?6U'Х]hS&[%$ T?%D7 ̈́˒4W ddo]8A~7}xr l,O[\-`Sj%DnC8W_^'QJg"ɾML!+53IǑd 0'aWo,.G3uOp]#l7zhb}aˢl}Z@,'e$t;Yxmy\-v_DP|nvZpn)o~DK|͛{o_噩M_Y(}q[ Uxօi@@ CZIgk^߯aKrZž7cw\M }pmZ޻]\A.薶5/o#dj?[*7rɴfj2ոYm|1_~/=L{a+W|=gn^[Ðh{RzӸdݯ8s${ùE!aIx^={uS\9~G^y={Pr LYn+\)YS;YҡG o 6bxAhlF{UwoYfoCϞgZ?v/WӲܕpcf{]z|p[_z> r҂Ɖʯv_׳1K@\bA{xCC~r(<]{ݤboE֪4c~d֫26 vr{yOK&W~/9S{0t5BXp4`Ͽ>s4Wo/%ԙ+"luƁW>7S櫓UWWO5Ws@nhoQ Ҧ6D.{cAwf-q1 ,NNӎ&JF]~WAh|~[.?zhLe_dfx-_3/e.i̶w8Qi7E<eބ"Qcs4޹~񟒷 't0W"aK`-ijCwTPu 3=*y܁ zvan>bv,[gYճWDm_^+RQ*hO$om[n+Py_wn|Tr}Zڤ\eZd{ 8-r+W w!G)_E 6&g8o+Zr4]Mŵ]ڏ;vCGBs퐌څ,0[Ls.tI}mg*YDC.tq.{wׁ|vBoG+دªA +0P)sW Oj7!u[KbUJ߀^ON>:\#]][c9{shLs صLs)ni#<% Wgp恾7[tv_ }wߐptkٴVp6^o<օC-ņ>L= Onvo93:nыRtžKR×:[.PzȲڏ_VcGz+r9Ti KQ}b.2Vop-6pMCxC^{<;Bi`-{-0[6v8%/՚ 8@oR/{vhg,@ YkUgPIZIa{g[쏽ͼyE…m~dz8|)TY\]=1v%'/OQ4JlMjK_Qk>5-][/>_ ip\Wk.[-,]}U"s_aϕ׺ͶPo꟫h/ޓ'ˣǴ%Y:i0_˲[vojd;3-sۼaB8xM[Oַ?!pyK}/zvK (=)Ggbz"@LysչiS̆>|篃v0BSաۨ4[&m ^-Jd4hզrsxn" 9.uQy%NteGO7ϟxEZ_S͛o7GLlf\u;9G>IIcnu',Oju\S̵m0iWmyRaR&bRܲ:#ݱYUq 2!AAI+_LWp[U7>z\g.ԏ]uv:UkrHm/zwc~/H!%mvw*νּlΟ5*n{z\Wvr𤻿UUe*HQXb]K.Me +32J6xoܓ*5 ?r? VVU; vmN LJ]ȒRRr{Dzq˵ʓf>kP~xCCk/v;p{<ޮ/oךF\b/fR̰Vvl])J4w׮ߴNÔO[zGKf\]g?v1t{e`<K=)v0mC߃@q[m7%nu#947A])tvxnϗ|얦usWXㄶ'#D6iJ1{:%4pnkΓ~#ysC (3ׁXUejVګy-6=$q\qqr| @$zNGrhoMx$A/Mjz\3rzBLBDoFl՚KrHzXZ- K__' n/?Ho\ I= hD_ohho|"^7_UOaFC1&T/6ѵoVlV4)`(aOKCcrnw~6WÕy`s+X9tWh7 @`(- oySX R&K/ȥv?! tj <:sw:xcoho׺o:ݶ>+Ɩ}2G3,rSijP  Ф_C7IE+OE KCǷ9>b,qK*9h7|ؙ7ҮR`͠Cl\W{iLPƋq 臅+naR3VvZz!Pe]x> J* QVǢjPQ佊$6[Sb!椄j!~=7?޸p[r;`*JӒCR!Z ݽ6 %jIfyhb\k5itgvw5Oś~Kcym.̨3+%%TkvN0%AfA=~2pDZzҕb5 _ǯ793LW>T}v[[1??hd*3|qH*?ݣE2+H2\-m l3湆cgw\& W.B%G5+nGX_E|ЁOgN~[ƈ![ڃͥ$k'hH ^b}!rytզ| L涰BTr.oKPZZx2 f7`l_% Cުz=} gzk7 0&bd-}ؽ|&sǎrykMZvǡz;9[bs۴5j_f>w\+f_UL X:^m 9pux67ØRD(VBȝ=!.O?[ǃЦ>{:?xU vYt]Z- ]S2,UOprCxCOR\xKh>a͉XœNf4f[Jdrً,V)dJ$P;JA Ӡ, <ѫoO=o^ٺ^ ==~?ƧJMhZousg}3J>m믷|r|{_Vcz_+ߍdjjO1k-esI)$1aİ;vy$XUÙه3-uQHF:η2`i V{wV+_~^UൗΦl7e3Qh.p0=1 7)` $ҠL 9Pa -ALR>,ayޚv~ĄxOg-)>Odzxf3$N~a9M\Fp ?9v,d5|߀a0'8m !]mׁ5֡C5ʝ|{/9+22 RQjS (eXbZ뫣U0[ץTXP mT\>*f,i-z8sl.tCxCO^syNlr7,O3}]iU m M2JSr+MTz-2(J QB*-{M4 D!iRH x+w^|Q%';]{`^BD=bF. 0C\q/`7BX>v<w!o`?Cg5>EJvTfRmD1Z"`G&VIF0X1*-CWCZʢ4T%Vog1hL .cԮvW7647gg޾9ĹB6ݵ3FEXWh\h@LFd % ek՞LDa*Ml=cJВL:2 =ͷ| -\+]^;wGXq6خRҠ̲}x g8{l70/ðم"`&oq~RAV0o72hFV+ADIK@RXZ 03$Y֬`j"6 F#hM`P x6@Jͫ+JshoW)syA_<1HT6əIm^aۉ);y(*yz΄U0%7ȃ45 * #MAB>[w~S]Xs\N;i^=Bm5TpP ("Ff8 T| `;} L!!Z,.Sж4E0EXY3I[kW`.gm@cB:,$`2ojjMsɋMr5ǞrCxC\ nYPl|(vSbf3`eZTLUdT#=[&2X,%1A[CyDUk􍯷 )$FB`dªZ>+D %[B Ķ0A-ܜBʘ z$YR>K5}\J7 <v˻3sh-txCֵ dt9t~rq 2vZzŦ0En3IlB֛WE(+K ]FyfV4!YI1`Ie I&H' Mo;\ WrU5UGXww{oa@WaqCi0u.m~+"HfRd&P,SiRHd&f!)Ӛc 3Y>2L Y3͢TYf";\ꭁ[l 3/mpfsrkz-M+o?sr|--'P>C[&*bA G`Qˆl'2pTeUB&d="`#BՔ ċP*ԕlObiyu]3bw|2#wǖ\}NŌ~٢^|˳_շPAEB)F&3*P"$cJb6,[S C^̴HKH\tD[9a9 >;.bXkcސӫ07͇^'.:&2CRyjcjnXnlniv d_`FO)LkK&3h Q̛, IJ1mdH7D5rC{E^@]`@yWwз99BDPU" 1ڼQddZ,RiYs1`ۄ ִ>-%Q)H XUY3-URZssa\$=IZ™oS3FHs'' yO[r^y6Me.TTVUMHLceڦlP޵dI ,j`2n  Ff@ mmH{LL<[wzL{f=X=]8s=dl٭ VPf{%F_˜X=B{e}L׶WIJP.S@-EӵGoPZIlRV',HV2ӚîF@[%S40"IW]$V6$:DP:v;`Ւ[ycdhho^^ Ћo4&UyIv=ϊcϣmVL[1I: "DBd"M( fN!Ҙn3-dӄHx}T (@QlB 3X^gf[_\Wi  pHrypU #h7;o7/9hd 0d+\jBbՁڶd2\jLyۊж!$ȄL j6\'PjqB( j,sy3ߴrZ(L!͡w|'w;<fyۖ#hZڢ5$ZT= ikcƒJFzfz1,lHR"M!!{~¯7؅5ח]&qKNPf=kփȜQ?ףJPT6:{N!dZHSEFLIA) Uy"Y%TVITXf82 YTmbY}t[͗U/kQmsxmInѫXᷞ{E#74;ӗ~zB ^C% n O(gKt j>zƪ IYUSXjJi PD6}J*!ɓIKp)Bg|i.ߡ%+6+)kg߿ssчY/%oVenMh P!)aրܿZ@$h{m@}|%'ˬSDɀmA!ր^y> V8mn}ysIVn0z CCxCO^ݳ;9kO 0XJ Y(0 Ĝ2 1VH k( ,N$|/^?賗?ɞ_k[OloþNbW%پ}o (4G0^WǿH57IdE1@DY"ČU1#¤ y(-/*$*ڠZl f5,<(0B2R&jͥÛ'œI%B!l cMgw >Q`ПU]-xO kZ#"/@Uf`t]jMy i5-I8,.mTH hd@U)&dt0}iV_R? PCFo}_^?2JNkwF`biT_ b985𖞽~ο:?*L }C쎎ZBsC`a SE"̀UJQM(S>CQ **# jYY)ֶ)Ua n00Ld0jy-[V k#EHLH}7~_|izUq~$(wp"}aՊͲTȋ _gVSJ@TQB([L^!LuF-Oק̈́ Ay%#*ȬL%|NGd[UfXʫXtjs4} zVXFV6}%D.՝@zEh2Yl{ k.ENBwaw~L\ GwThyGmYu%V2'ප-X@ni%`F+Ќ(-?7EA"ۆ E@W !mXGކ1SanhNAm{?z>WB3.o o UN׀μ[A/?;kGNAֆ V1TWm2!"`xF&- ",[$YnP0v$Y'}N4$X]ծJ|'qvG(Z zvkUG9k$o=O29!ʹd$Ñ3Rji  tRՃ<be,lz#RL^L)]U Yְ' ȣo'up_|^XX_]71׭mm"F\R@ITL-ef%дUŔ܃:em -.'i= )L= dZNYK ƙ* d 倩R,a<m!l@Nq[_?٧._zg?~9W+ Gm}ΟVɊ be9+Y_kGUEYu LUIKzIsx^G!t3d jP&kkI2k$x3KC bGܗr[as6jZPhD^m̔`K^ɭ;OП~ٗ(<>?;fOgA(4* 5 R$!Y(ƺ5Ƹ$ѱ#h},ztC M^cnNb(m6]bj,θ(c{1kgK\uۋYxhoAxK&»[xˇe$DyXΠü 6{y+^lu>~C>0oL,,º15s2?ѶᥐA#$d C8 Gc)FEXCU@Q(ƱU*DhB$hƶg@G{.l[5K'zUDB\vY1 f FzABW$nCr@8zt8=(ݣjW r%niѻ7j4";6a|Ztu6&#|y(T^:B>'^WGy zmRnEsEX 4׌SL]n(`^X8-Xp*)${]y">ɥXgo, +*6u3LaQA#땝 2 A ٣7a@" D, 5HP8tAU*=H 膱,Pd.ōJ@4`0 icݙCΑ<#qc_ԕئ lb5:QRCoaȵUN{Y&Dtx͈VmSx]%;t^Nٹ8k 4EP5[q;zH'8TgͽKtwI /_Q^] VvGyN^ZڤDKz XblKeEwQ$iEU z%%h   R>jS 2F&cG$j(GGQ(CҚ'ntnn[k's#$_&IךuZ.RX$a#/D6c C:J>pN3G/-6>vhDm&m 4cr2l \YxϖNen$I%o} _, |?n_'rn0šf &g jmJDh9xŢ(*dhf2J2QDVڲ`!cdMBn"QEa 4&T tŰRA@s.d8VlH.QЂ!,m\'@ GqT#s4\>J#lpx54E ./1]5z> Y0(Dc>!hoƈe{ AkKEI8qLMf,H%v{f\qbx =*b.JߋEcrQ ۽SVfp2T@LݣKt1Wzca*,\T'"Q"Ὠ/O2_g9u7oڦhaGdf'CsH]3j9z].;jNfD uP4DWt'pwFwļqCug4H⎀1֠Cr@!1a. >TH}l-ZEX(h]3ː]0v tqɍo즲ʎ;\n E71e5wXlG!p ͋} ^{ 5u?z-ތC`]l.6;"z@-6NEwj!ԉp(=J4:"gFzxQo-@/ C%:Nk YR\)(|₹m'vƼ(TY :;apL^5!o.S[?uTxuᰟ~ >4O.܁6 mDZ$zr[ߔ(>jȬע"'z c,JTX F_17+ HE*&3, -h4D"c lF8ҘL4;K" aEQUZs9(WY/KʈǞ+XϣЗhP`nJtJߨŐ:慑,*Q|DkNs'cOЩn E7sBX3oa&zQcqJk.c1 ą?:ӗw(sov|pi8?I wGwx^HoMkxk^q+}iЗ&s#jw@ib旓95w2|DusFDp#8")':Gp j4UNEbtHK1ND$tFtPj.5/b&zGD(o o`n1{%꓇iIy``Kʲ@#܁p'Z٣{QP{b*nrfإ0SknPX4~'Nic~V,-Q܃qzIvIdJr+Gy7SO^criUo--l.֪Ŵ=3o#m@]1qyD ﭔ2V |0HU!sW#V VTDLRA[4320B2M6c*.yL>(iKa%֝VO䤠rHlpB贠5\ 4Ƣ32S> A줱W&AQы0RÁfѧnpxmkFLCvrmk6/E(}iٝ6X(l܎f/v xCtoݩ̔`^yt\\>Z{:5-UX+9ٻelՍSV!%|LE.G gPya2=ꭢԁo2tZދza.)_ C!e]Khb4X_ֈMK9 L>7X (.(\jn@wFM P7yzpX^'oa^+MQC8u7x_¢aEfZ)nl S..+u7{YgT.g_eHgCbٙ~ ({i-CØ 'ֶc 7$y*Q /֢ cͯTTe?DEѢTyjƚZ̜E&ɤbXf^ &-QZ]AX@016,XVWQΝہrnDXhVN0vSY.X{`-&  x0Nh͸|LR^7q}Uk³_kw=҃O=S3ҩS|D{tJt'jto[@aaAQa޽[D wZGPa{ gVս|'&fF7C&w[tVZj>A-,Tux޺~MUԝjNVD:-s@_a=Lp>H_#b$=J2 VY3ԢO1dWGlm`(v7eͬUv\ȹܭNwJeftF%o|d4wG/R~}=KF,$a=ժN9_bm0Ei^EaE> daVQSWdUbR%(SV B2¸L%#fA6{cWL,2\'qAi!jtM>6u—) nc%WqL@KxYlK$78ᴎm:ԅɂv=&ks c^  ΓXg]gRG˭* "y3ou/^J,ɔf~S7Ӛkjf{š!xqHm%lMX'/rüM;"F=6[8EXѵ)7Eg5V] R",T,P kJӂ+ te!J( ),g el+ nv-mqt\  22F#{RBQtzqa0ys.%,gcP+&:%swTD'Zbכ؋f3GZewYC[pAgX,R< ũ_Avx;FwLRx)7M»)1A'W)'v:»Mz^|c>S*Nژ,X &ҭDZw6/LMB="kFak¥rY+m/ ьϽzWc@,kw*[ky|,]3s6\Fbuq Jtыޘ=Sp Ԯ]b/"fmBt1umgur`ȏ[$O,c)Ko*^KXxwIÕnFyһ8Jz}{}s`^ō&0qQuԲ.hRe &  UE|#kVYE*\q `W)K[h6 Q֏^eT/vbOtMx?{9+^KIxһ-_3_7o_3߂Ox`Uz*˱=Y-&oFZs% ZYERE, c'^a8$a ^;OkTx ܮRS, C˚(FdCr¡Gm[R"Q2u[i*ۆG sM6M*i~&OK"\OqG?z_ٽFxch%yk╛k?+_30t >S ⮹_FOn(o͜S[s5%FXǜSפ)¶C&'Rv(4jf" "/  .E2@ 5}WGp< JI1} /cz%5ɥ-`I*e,^pt֣cߎu4Zf\F-JꨁSxtD6 hc`;Π8j`{)^ndP`{ \l_v2Ő݃]&?"]du.Q0|t7o'm}#=xDbb:nSB-7F{abd2qꢖu_-l#ͅRYYsc`r-Q`c)!\SZZR1i<JscPmYCP+&Ti`<um@ZË~|=SĞS#R3x\`lupkvg1Vߊˎ* VOONGr{u.{$?|!|!dRx,<,s?["wO"o6o<' ec=P>֊@'k֨јCceW\n^UxHihKzЮauMA1L뾤_\Ӌc!5W1bFQV%[<ѫ cAvg`dxӫ Av\ bOx@xo?~gW?8^^K0௟^7o7|tml^lX"=l'CmzR&R"V-'µsM_~Z'\"4j^ %VA|oMktm8ݖKl5E\#w{z,1cs!{ѱqƓqfǑqZsїΛ'%w\Ȯ)Ihut 5#rx{6kG-ESzNVƂRg\*2d8oƺl)Ryi ~҆;V>eKRxK[=Wzoa7VKZq1޼G{oPEOmG*}ÍYE*klen?>W=$9qo+VCG]7mY^nb`뱦0_l8W qY)̋๾yӽeWW굲!7:Rxor(szOnJ.J#EؽķF}>(;ܷF}KJ eG]֗*6WmR3ʡuCԴ46;b36#*rG)2$FDV٭[eWK섻Av)$|彋| >h/ʕe|.0jP6 Q1$> (;~Kl| BSmi5ݹ]kSx)[w-ZRr]"Y# zUtkwybc|vZ!!RN.Uv??~aW]WO:^K/I*ݧV}h1Uć緋oT̻s!ey]~h7vS~=3IM:6@59sTrܑx,b;yٌBlWz9/Ĺʖ^ncm7_۫VK%)C [wt5>.G{)^,[ķqcp=~7ﮧ8!(j]o~\VF/]\5ѝ?jC&i- v[rwkl/nM}*}ٽ!)${׋}WJ>; HXQK|a-nڃ q߱o0g)| o߽J_ָ.5}yCr'Rr^s4QЏU<9[պeM}yDgō:8={y-n,<}{>x?^KIo_qՠ[G=:jn)!}`=d/rB<'bku!򖢕)mWC3\6Gn}^Ga]_ϱ~P~^".p)${O=ݔķ6)n} _~Ǜ"u^yIZ:*R{{8G? K1_ v7e\Omޔݫw?RxI /9 戮 u}'1ߑI=_w^$mO~<*9*Z)OhoݱV}e}.&@zw c_j}ra}"A) .e^!{K?Dyխ;ݯ}}Mdw$%^Kޫރޫw+SCrEJxzmM=vqew>RxI /kբzsVic)~ÍfGKLJGNq_ޥe=6GwV+z}D:}%-^K޻ޣޗ^>OZWDu[7;q[%x~e Lm?a[׽)^K>@z7Z%5 ~m;{o#ݿG!RxI /`{G齋y]E$GrݿRxI /{C-ڼM?ew_JrOM?K%) E{׻ ̛۟¼+{U?>g'^K~2}h}]w1oq=֛|?RxMjC"Bo =" !C0EF N{ջ g-$I%5awDRF?ExLk}Ô]K2{?{+&!]?>T$X.I%{^ŽJrzu7I~HkC|)$$.>+$S}L$$W|D}>z?$I%?;=nLYUʼ_744746ޛġ׏3 8474?R~phoh"gy?rohohr!|ߏOs~CxCC?DxGgg~uohohc _s~\B>~P67474C?_q;C?Ǔ !\EAY <_i?p~ĀЀ9~| {a9Êr#<KY}_: ?ƿ5s# y~pco㍃c+ 9YCxxu=hث8 |T> ݱ^G~QEyp j|o{x#2gLOZ8Ozccu'W=O1S&Yë|{|qr vp[Wqл?v'nGcq c=)$ ~G.n?> |=$?ޏ tr1؞hO;޼ ioּ$5+nK9?, (`A-|ʞrܳ><l'9'7{WwӃ罌{:C߫7]= |/wQޏv t n}~̏^h|n m.P'o<_77{ZwSn! |xCxx?nSw#rqCAwf~k=ĭ, W88Kqn9~| s\h m~'Χ5nwwt~ "~[|xCxx? =oG1 , p8vgz/pny|y̏`tbs<|': aqwwU5V_7AI{^$яv>ŏ Aِ|[o_q4JCAnyB_ ׯϧ *& Xh8.ໃ;C>-Ň\ު W!L6~B~z_ ⏢sh8y`'=x˞tCܦk fcգms3Nxl/x׳wW9;<s+7p-6aK6;?Mno^ӫ=HHt 'aivuk% >K(wpҾI[[c(VLuC0a \\ׁ;r}6\8,МP7)nqutY:/֏%-`'j3gM7.Me?i&: rSaUכ02uHP9s!Ť MeU%u -SY>]ZUtmq5}ϼy7747"`ρ;S]ücǖcvy%o+9kci{,Tlyun^TalvjbrB=q\-68i\ xZw &еb,9 fU 5va+6wAu }szkU z_uu> 0`;>׮5[@NRf{/t3Ņ6;`.ObK~qqKhV Xݱ[`[l೥'O55g|w\1RTqNj$^Br;^z",k=+;77>8~tM!vWÖǷqn]kgJfl 9&,U,dl~H b&qI !ISK8GfӺ%x T؇C3a Qe^PmI۩ UHAD[i(yԌ4Gͫ& 1m!XaIQ9h¬%9c.Oj" 'xS5w+]L/c.Noy+<ج1ʵ[n/#Fpz .`_hyn=@)as.J;mOi$Fnn9XRn&q)DY™zQH'@=+(;GL9 cRwaZWwM2{>/MYM.GҬ^Y$f4EPl`+yS]dWdn+<}K+–]sw4#Cooh4>'\Mc}v[򖸍3+^;I5Iؘ:'[ቘS$^c•2cQhh^UIL4CN-.,i0f\NĆ%j#BP! 2Y!Pt3r% yZ 31o$UaVYVVL4(H]X\lT956v͍Nu-\ۃWB\pFp%@ns=e q>!ͧ7z^Ʈxݴtkm8j&buunJ '7jOʳv@׀E زfdu7:<0dm;jOuzfR-y\n)fKcDdp_"*+]g7gmڪ@VnQyCakxn|j˻q;6eN<<ӻ 747"wbf{ss /ػ:s cY4z).'nl8uJ>t vkw\{Hc&:vp8˕LMڜ-d,9ѫ,4exǠ.{>/$(k*dF$=0Z4]`\#{l.ʐd.?swIe'騒!g, g]c4da=5OTـ7qK&b^zr/h90v=)k^~WKvkw,vn{VR v&16i.'dNSs*&LS pIn),b(QLwfɽc[]—'ޖk-Mԫ<ҪЗ0fw\Dɀ-i&2l +NPefșEI_[N c*9ɼ fCu6LWZ!3\zxC(ZzF4> ր;!^Wcz0O&Hbd9UM)^M-+; pKJ4(JRKzjP.S0Bsx˧״0,.vKJ0  ^ыt< |Ș"`2fpyEȄIY EL"r =~] \LJ+JU,^n{W8+x⾽חa8p#=p居,?ohoj 7RеPvSٶ ǰ}*S ֆf^Ĭ0B ]ђE%EiOdf@x` cQ2[Mr [~ۛk!˽tY?+lWҜDi$R2VIdu:Yr{^F!-Q9k#c2̣u2]S:a8ٺ_oJ^WF'i՚CK<ęfk6{B-N)|ħ> FHsCϵ7]w +DV:wIM[`WOd'IA'D، S O[u{GZ"rgZ™F_Brd&8 Z ( 1D8s{]t@/aϽӓqXَbm{\ ==kɢ>dZ$- 7W[gU^"yA*ɬW$gU5˓?V8k-$niⵦwy÷'>\qy#943ݳnqvkmq2s{Jg><-,"N,4YfM"(fbH7 aObv %M7%4G<2s$ad˃HF (I#v-*do) V, JV_vEK˴yt2ȰBLZz!3=̃%[,AD- Zb[IPDE eX"c=IuI noU[W5N5UNYlū׆[lņlzx̡ǞF>x-}w[4^]b%Y+:9ʖP&Jsp7vRbJ8e[X谫>EoP9m J%[z#bIF,aNC'iVbRLiU\,YO5ofy , ܘMAz\+N6PV%|wW7\GKwz|賅1T|Pμ$f)7-Zql`qcr >R*1װK3GIӗH$t:Z9a{ѕXއzH5'K5-$V/H"MHvoThB eHL` '$R\ -,jN@ 7iSpfjJe1o#5KTDT ,PPP2m^l zY'1uR]{ܪ:.xށ65 ;4cc@kpv #ww#yc??ݽ7kW=U4 )\^!>'ӲU-}۪YҪ{AZ(Z 3[3m9l9t J{W\FQt(\&A0c;FS>BDwrIʖx~70$ )fo^ c0 -MpJk= J ,M$$ʶ-2:kp}*20IU0=$0s,w\4be%EkbO8=P@:M0%K.96B3dSKx UL4CFBI0^f[NRI">EcRVIPi0ijۅdC$@㽡,!e)TT3l SVέ?&TYeNU6YKTZ)goW dl{R [y[x=rcS`6@747k:ٶP MyB,]8ޖJfK44岹4Y> 갋Τ,Yh]r'[K(\^^ﭽ40&hime@Diғ݇\ru[ [ZS5<)VmU - X%^ڙN%lج"BփHcW2KϬ*HȔ6O EPuqT<%}O57:.Z6Y`7@747bt(%9ݕ szǦ MGoA:kI6STq}wlŧt3Ms(Y5f NgZ-h ,-K&<6F;(r|Ŭ/EL>z9=,(L"-}lѫ6њ[ғ-$dU m2i!"{qL0,\NYX2&i5El.94JL%݃)X2*RD%l}gmXR&ۚ'Y.=a|Z^i:h)`h%9874g.v:mDl"ڸ'xU&baⴕU#KAR 9I(X`i"LHI؜MAl` werIwDJb$mn͍lm0il7w9,á >^ AB+3S06ѴLZVpIw'I*lބ h+j8@%W-w=OVh'Db%P7m[/1s E$TݐnJŘŵ*G΂+tœ.`(Iza(KhMA; [x.O^]Ҷ|;]OL,iYLo3}ͭ{ g,wɒX ʲ maD.f&ZI1D-/Bm6g`qvdeJf40"]@(2cK)YڤkLBryip%\!6cA#wgp\σۋ}k4X@LeD>3IԮhE(ETMgz{ɴt)]d[,Yk2Õt2F{'_aniޫM2G Y t4fz}3}}5^kmm&H`iMhM<@.ͭ~o>r۾$ m.H&B_ BiFXϫNE5$<#C  VIbzґbmZ0*WP%aiP)4LR= eʈL}K`vCxC?] +}txegewq z ,Vn[glt3LڰHDIO)$= |_t 5apblU <=;5^op>.ӖuΖ<28X^.?x/>Ng+_''wViD[1h}Nu*M,M}D'Hk)E*@~4@ZBUh\5F˒m,᜙t*n0$f7t ii^B@+-H8c y#p¼}I8wqw_gb)Z4oSxJr hog/}Кvԩ-+Fmh=&X̐'͙NcZY'C Y&,5ctK 1hBhjߋDo#Ƭ0ʌCIpO>wqœ۠׸4k˔Af^?7앯|oqbB(/*XV Aߊ> N9غ<[ߝw3&<DldhHrX*ӘH2ѥTے^Ծc@ D"TH,jEQnms{xgU-qR+dMVuDAܺ2(SSM&58$`0w7$J fi -։LmNd`tS&gz{..95y~'~_-T,[q і%L,H4 rl ٣U /6T#}QZ^^=TJ%@MX ḓӜ[4I^%ڗ抶syqV\Yd/v RNc>*|c >z)Xq"Qd+N`JēZ&-@}^%]c `- %Kn(,_2D,i0BZ9j~{xrq |1ܞ-㐦kmT$Ab~7[Cn.)&Z?^a2` ^B"ۚb), (yk7)(y7d("En!XuHʒL{uZ_E)@MX-9iћ|C3nlKzlCϢҮכ.'!jޘG2914IZ4)K3‚`*,|?,D[Ŧ Ha-̙+tМ}?{Lvsr=~loӁ._;^ʿ~M] az4f.cV`V`,a潯@pME f"Kk[}J5Kx[T'ip8i4V6c8emMҬZ-)Ҟ0t|dho菁[n?8-NMYفΛȮOO1Ji&Wb<-h. 9Yܘce$ގ޹ 'ep`pvws8^ԟĦr1sc@X?wFW?W¼XZ_!& f ކBnj=,rd'ёrfVJFۇ*iVY`uZv빙W"X2M }Z֌؄ tuVgw|\8CxXg۞1`Gn:t`~41&9;mr h'0c9<, ~437pX^|O~77pq0]9rt^GP=vxm>sd,ԧUMEtɭ5Q`V6q6(Kb+Yxh=5u#wVGA2Kq Ɯm=FIS]NȔ68^2 747 guy^-ǣJ,Ъ/9Z/YXp&GMl{`iQhNSl"eV h'~l{孫훿?ZQ`~p;QWNmz':bW'_WCNنaӖV npƒf daAf2+FXR=mi#U߄_,>PEi!%|S\^Oe}s }>|p:(ZQwoǯO6][7m/ D*&f1V ,]L,\EOGiq.y_lSWGK>un;ZBo_n/em[”BWmm~ 8I Up^w`\}+!͋{\h PuT#lM@)iJ37$Kf3$9)YiR%0R퍨)7\ӵ8K̖+@jI]QWwSV+wi @3>\'-C0Jswul^)+mr(!D[X8nU@EtHX)\̽2YLNh}x&39[(tC/pswK1ou_1ciS 77x۟nO^_o_ \%޻~;~> L% kQ6aD&dDX P2e<”&5F%OC&EZfԉpXdF1I&)<[#sJ+3ȶWjJ8AW}wm;?:LJ|r3p37wwsO@$fL XziLoM,(U tg]vYdzDK%Fwnk('4 zV[]Ozl5i[|/w> ~ey)I~Ȝ^ۯ/~^W>̋|MȈ2D4Bt9mC^m$J Y-J Rfyl  7ᏂHӽlFLٳhaK}q+<,^ypxCC7{?i[7۽AU@F& @dŦL.KT?1 veeig߾nܒtS'&,1i0xEdF6W>{y-϶\܍M?ts7; ,k.OOW[Cn}9D>WtznLૂl mZh'ݳDIx8B p$hI+4m+M;"B4TrJ@mM"0hNlqvE]Nk9[n߿RRu[s{`zyYZ֖vZyں6EObQKn,͘F"n&#Z߿R[lli>_ĕu7>Z[:2z<{8]ӟy3[z ݴۓZzZqJi;(kPDP&8ՖZ8}U֖qWǬm0g;&o9=7^؜ kt xt>~_i_~QxM~-z,n8}5ik?#I_\,6i'Xf&6d-֒O^M=8YP/MX2_!6˲Q\6Z2b%\HO߿|su7/cJw|Xԡ֟pr{{w9^/.V<< ^_3πth)'-ffN gza *m&!N%MS{,K[5v)s;v&$ =^я(D.< squ&Z&(cZ^/ !ГD)W[;CRnC'OF}Z[|G`gaOIٽgh78}ߥ_[`/4kG,{mL`+Z>lq`V1% mI.5h[AOp|CxCOE^y:9=R'?-|5d7`tQ\@‘NfhO밍ꃣaja̖ןtbjYCmVy+qyK.ƌ=Knq VԀxyU *n%~W7 bsKd6n-Ǐ<>o']q5JlE >> kTi=W=pynmC’[3K]UgNriLQL3YqBvDۄ`hE0 i%3D`FK B+h$u5b_UmU[]s_>OlvѦTx r(Ws4?{38KK_ ?wjrܻOHm LɔːtI)KU֊64FdtXk)%k-oeQV{+H\<m-\cг+? r悕ӫ6F&&h['̜, }n븁V"a%S$X sr3Rk KOb"%̬Z؃lpplמߎK~$pz<~ [75?'Oxx](orٻ_3.L2$X ap% 0a- 0FT 4e>R=ġi^{]'6L/T'6ڂW|kel'mP:HЬ5pW9ӝKncU|빚+ŷsM':[z7 O.p;r~ Ko kdyA_8_;O 2Mi)Ih;+% uZJQ"9"Lƀ?XFnGOOK ڀСiE ;1 ܞ\8- S,.6\D:0yAN:\<νؚ@R&{Ri{Ův\r~ I+kpZY2vjB|?}@•#%q>]B\8f{Be}]^fL@ETw R6mz)d :7)yXr}q6/΄͡^~xxIц=97S~-'~ xY__~5Ce V$$K:.IK%LKPCdT\jB6O#I@5'ѵ  X{cguIkzul ED;e1Zٻ$v֍2EnKr8+ iN~C8'>7g|~C78ݚAkv2\_e|歍}["F [:CxZ >gϖ5'dȓ 䟺ݐVW竡|^lrզe2ڝv30{QI oH#J~n҃umEo*VFoiFX T#|{݁O};'u-=?`?p);-+n2殘߂D8 p-e ض@d+B1]sr}t+0gwpu635{}GԀС7RleJޱ2&B~4Zd"L>ɺ[VhaL5вh$ 4Ad/go`]n|_y w~}]Ø?eg#nʾ|\CMG۹xk}m76XU8i}ɴއ*I$۠ {rC 0?/̆x>Tݿ >vin^eK 6=fl3ySI g nfC\|#*Y``ڽ^. ,pv&nڿ:Z]1߱ry_B?k}j[6p%aw=yM=hAXv7MEOr|) >E Ǽ9vN~&1 ][Sq\f[F>Z妵'J@i~ p[C.Vy ~=[rzcG՞p,%4Bއ{ WJ3RǛ'hqaǀ]^s:47C]LV^{lqytbb!;mK?N2v27p. n>ǀ&YϏ@ˏqz[Ǜ2W~H` QNO{ T/S_'`b?^f~ep{CxC/TDZ휹ܜJZx4flCw3:[vņ׭J`J^ ؑ{;1WY<엋L=%y j~>N{WjlaMo/iFv2XM+VSWp~A687McŞU׫j;-Oa0uJ&eK mDFQa@'OZxT(rۧepšCG|f֡GêX}8lK' ,K^hCEo-3l@nho|8ޒrFrx o.y( S;ys[ȈwS^)Te|fM _Ai܏/Ѧ™>΢2>ΆuAƝ`V.;֏~?j1X{ pيPJ<f!̼扆Kŭn XZ t'$-Tw|-zkhρ\g2D8+LvM4v Vc?p/(bqTIJc}6K`k$kQ LAhnc-!GǫogD] nIIs]8ޯI`:q-Z^r=DJ۟>{po(mύ?f~?7Uc8< m.xnP41VvC.9-uf}Bq;ozsvnϛ'S:Sv N|]얋lL$YAI÷{&gMϻ % X.y}3zazv߈4%hԺ@k<^?™CxC]3bÆAuω=gɵ;z8s}8Yws߷ T_|N7xL-q6MVQu򞯠':\!oճrHit~;;*ք{747 $,K8s.P]_imE?nOX.aLbd6/JΖcoTSAw>&|}5c/\>(}a;P59L vڵ>*zT$GsI|CxC?b]=̫9(:p|.;U I6VVj?ohDž-1 xQҎBqFvqD,7znhoG6^, =7Bs7]WߟE\[k0X9<=W' UKDspfJPI* ?yDIy֗^aufc.NA 6ݳ{w[ݒ[;=dm uyܚ@j͡L /q.􌬁m׫ӱ %_T?9l۵:8ƜW\ȳcR،rg00^iYghho?Z&\]xerwǵc4]|ޜ\ᔀ$2@xW7>ܦǀ*3+MGo}<ޒۿwaN>=Z#QU8pk Veіhq\~%mU*; [.՗i}va}׺Ы`9EHZbhH-(%N@kw#S*VC#7747qK_z~ru&̨NC|T= ΄B,EQyzܪO 1>"0Xc>8:k{G-o7`X?H =q[u| fjJG34ozykhhoƉ+l9f8\*4w3(=3wP0f WR'zXŸ=N-|T.aRl_W 1~)~,8P&nrs+Wֹiz{bB]X@st`+b%kի(X"W QM- ”kNzηi Yv=loDޫ01j7QPݏeL;<[_#BIH] e| ;c=k-? yԖޜ{@Q;@mft%yΖJʬH yn_*o.|$_ක¥/O{n+2UqjфL]"jsWSz=xz(s=eV=qX\ޜ1B ί&i-}I"ԝ\L2Ha0╏|3њ047ۿb>VjytF;[a3y? )7Tge^ݙHڥywGxu{Wd=<&Dٯp w^ehlQ4MUgPuP7#ëDdjkfJ\h>>Ћw[kޚ.\Y`weRTg&"[6x l&E--jbsvXA-1&&~>gw=<tSTsxUAK}rk$M A`Bj9:KٿU?F=UZ4uLUxEKWʦ8 w }t}O?\X?v܀~ '\nw @X Es;^"V@5ȵKx3>ZX[?E:Tbu9ݭC75Ǭ\~pzk%X* !(Eez&R@6˥D^<R#˜^cF*5 }|ZaG9kC-GWV9Uxՙ\BLiՎm!iuR\aC7n-6_/>.}y%Gk?@`: g&Ƌ 8O~:la빥\GS0f=}(&e O X~^~%N9"s,L2 Yg5A1Wp)T3 J@`e o.~_ik>m_%npuËGCח|zK-$!^H[`&tx-+aűHPR+R٧cQ+fO`YUKpn96647zZk4ǯ{Hkk#8¬'Xyv}^P` ]xЫ0{K.*H™-'I)HӇ`Ī5a  WOB닣L;o1 GN%wm𪫐pKt~Ґ`" Af.anos;poˢy>gl6 T[0zx *^B% ϾeADv{hU#G(RQdzP* 3 2ClRL]=@@u6Z"MGl އzO-Y ~? ±_~]'`Gի[pCg,Ň=yWw܄~x{_;gXj!HI! !$3MfD% dC5מD)]s1|o3BUuJ,CxC/V@'-AE=wOBnZ4 }LXEɑlj(&0ǃI:AV(ֵB>w!]| /.~?/gy~yv~t=:~L}{0\mMw߄m P2-[x2M SJ?oͲPZuKŭBtɍ C;v;_0$K_=Ⱦo$wmG^)]e[NJM |d1( !``h3.YBm`jIֶZMX5N= }-}#9>O3I~Unrph{>숼wWOx&~ed U+|տiWA$B!"ӕ$ɐ`0%L-3%(A(kIX,QDoGd{]۔h!h)-kHRzNw7647|: k ̭@zRQ2zf\AֵlPJ4$-TS>naOz{NGNoe[p?&%~`5lx;\βcv|m78BG쀫ug'ooDXV"h-df5RZ\%Rm zU%DzR%J3=ҮKoBo>JRlm4V+'{L܂.Ϡ ,UG榊>B;t~r~Cz۝E"Jf4ӗ2AJ`{DD"vcJm.[Hi6kNG+t89 ZFshoio?DpSJOPiE-Z :e28:~P4YBIE+78/SZRAd*4=ǤA[5֕cݼC];WzzO\=^0gesvKQJd8<~rkVm!^HaL0P)L1M3% HBt `\ P׽(9dT"ur 1< _<'3s( -Q5-= IF%0fHL$( hK S ;kۻy._>lDPf"9Rj@0d@^ޒMc"{B8`ƌ~_xKN/+ qs?T $R @h 0SiLWrK: #{@V5Nļ.[\><~xcЋ4ysuHsY^(m<e0 }&y *( )"LBmjkʻ_~Y4-:[fV^bYwD- g;neZ^ϟ:Ngn3D^~]R,`ٲ)"a2HID12(o!PIQIEQ"2%IFVxwyͥY8Ӥ.xK|GӺRG r3B ȃS `D-e0iΪܒ"CIK2(*4h*0A cP2`LCcveo~篿l}bMו3:W)%oj@cy"[k@j D,K&h#5ME0#JhU~%DZJX/lٺ2B h<9Zp&hUoi-a+胗kpd:H^#=0]bct-gkd6Pl DLK4IDd BV Lu $KpdrxچUHq]-n7g*O/a/ga(;sSX\ꔚg_m]z !Thq % ʶ@T c2$6HFt-%}J]62+|0rtxC\%Bþy_vxp ;P[|v&V2OC7o4[ZO^L+F( #I)I~$#Y a k5Lj ~&7[ß{8hS];8(WNr5}OU5f{pL(,&|x7v9ð5POk{*߼́Pd"-@0eȢ2i\f F:RJDkbEkmD#- x**4fYI 1[nLlS%t-KSzgQڅ2[~}<>Լ:A@ՑS l5)EBbdRSɶ#%x&*3Y$If! !1e XozdAȎauO^ alce]a|_P p>wwu )"@&2 FԔ9$6V2+4 S3 d5 VHSuF%ĭ%- B[dS.VYy-uCX4477;{/C(炜*Th)fNr1YIc`!,|UJ9&#r(KZ2DBmU dE#逥3wͯ՟ln)]iAEZ*xmub èvp;q] _ANOaʔG]K6 ԶEBdV)c"ڀLGE>IXD%bVGZ/܏f,ۖlE:(Q@E)k#<mcT6ӊ- KHY{@ S ^}2f,w,"#Ț[ Qj/TُkǶyz+piXȔ_S6%B!d$3AT!RU932ɬBϔe@T29tք0&$,3jg:r>D*=K1,Bs&ض pQ6I -Bd=8 747z<[ӫJm \z h[jy®:3q=ж0Զ0Tx&SY2:}}\r]9>H:=jR̚@TSe(Rfzoޞ*Eߛau5؎7bFAnln?WK4I X E5 5 YIBBMS3Ba 03DzX9FFRp(Q@>+jNj^Z.:Ҿ`kֈ WXt =xZ@}rR+k \a&5tLϨFgIA5l2X[M{zkdMS i9;HB ]{^NBʰ$7k6_>twk- a+ewz[;lQ8v}1#?߻DT)CRMf &A`.J)D)2*5i d YsyȄ"JܞgzHd06K+\zɥ쮼;~X7A0e4rxCOԓ5zp8K.OHҦՂj%` pfV+%Km [#k2DdLl;]YI*|( N2`hE.V-#JW 39yn޹vz1 _+;õ)=߾\߷~J ^b[Zׂ ! 2ȠU"Ą5& j`nSD HChmP!YkOɐUDo a6ަk;e•f0NLJ[g*nDp ~آȱR Q=VcbFlvtD'@4`Y5DRjh"ZoX`.PJ.#n?8S{iٷ,,Ɖٮ"Ul_6,Wk~>b^z+19h$ȶΧOɠq5̾5%F̶-`W^Zef,` 6AdDes@j}|Ed2kQ0Rvi2'uk. ^ ;w._юWh.A/A`;wtnm$tAVY—'sJy%but fZ4AP"l.V)sڐM $0Y!!0Ad 7)L^_OYÏjjkC]*5:߿?ߧ٧'ORn )E3Gt,T!!AFͅYoTPA x|Ό+>aYZ)H2ճ$XZ*rk*a3 4w+0VQ7974tsX.[GyM#1A瀽X Xi+ۮ_AlڍA6ȺCj.󤭹u*&IS@ֽi0orxUYߞw@4(/@@"O|@<?<ݏ?WGdB CwlH@^gٯ+cfVUYdgw f- nU@`AƎ`\DuFhtEor8[Hd@AR&[h(Z ѨC%CKݱetE~ ?DwͅyMwW%;훏gy|mv0Qht"V<aCP3\ucNv3d4yf7EvZnd  _5j{v=]+bnm}ަ1D a Hsn`嚵 Du" MFdahp8I fQZ٠ei?8ej@n`b1|Z@m{>hՌX .5a0t1[M2ք;_Yق!㾘,͊ ja.v7&޼z{$({}ZcťB U{|%KuY x'WQ+={zگ3 g˫%[Mvvn&ѡÑaց>:։hZ'1Wkb'ea@b`-ȽB0Aa1ehr YX䮠hf 5Z92fA. )[ !72X6ϕKV匊<*M(gQ' BEgk\*0<]u)ޛ|9)Бk˞:hNs]ڹpvN-xVK*ۏBsAtW̢W1 WW)(ۏcv'Q:hYi{r2_}n@s`@:.3j ,>Hyf1LlFe͉hBF0 zyq,\9?2ofyWSX3F'a+=ٸǰѤ [$sZf& 5M01ZX&m`Cce6c@kH\҄ZFq.)Xnz* ڡ2aY' &:d`bfx)S‚ );rU(L̓ Arߜ7GP:{s:  y91G+yt4d`vF';w6~ș2iE 9v+m[S.ܹXIO_"<#Ew:K`ExEZjxX4#b h1т攁e1i3ŸqB8DC .@Dk! ]ԆؚB0T7{ j~ 2lyX2[X0w$c\,v3rrsIeS7LεK$Y0B`b9 EucB[6!uޜpa.Нpkv] zP& 9t7~g,a؏-g.nעn>&q깙T-^n;zo?}~_m|̜ve/b|a4m7 #H=8^yReZցhh[لH0`4Z!.X$g dBH6'[1N PQ ()s_4+#:I\aLd5+$-2"tYd?0G#;'BћNsIYBz.m̾<ɼy7ME(1#Թ4SY>b S[p iqzM.uYB,JxśOyA?( zE(6)=nX0мIN-zr|yԴ 2R 0Xo1Rk0D S57F9EM`1!p4e@ !W%b mSFϑst遚#9)gA K%DU.Myٓ.bi$Pb'+\N: ApnÙZЙpc.1Ѣ;V@t Ns1 Mk;m|ݥ;®DwvG:˟MBI+^{B2t7?;g/~M)6]Aphmtj~6c ەz7ü>Ssn=%{~" `@wC)S<{@}#r*bWSO?TwqB3| "/l5PM=x4uw;c:ɥOӹmzmolhW+SP2qL :ࣱEƆ!H@rG*d Ml1t@h fAX7Yg?M , "p}Ct['}yGo>5繜̕)u.'D&څƽ+w/Md ;>,M‹'q_! %Ģ&s~wwL/ۭ>?-_z?n?5]^kY4w&[) (iQd(2ljy{gkR3Y (Zpav 2Ec`hl&( X6( `by԰Dzغ0gs!ڼrȎW\E|D~7 d[9BXhYRKJ)x 8-E AuS i#:ɜ"Fn q7F/9AbpXcLsɂn[ &W)˵ci jL-˸G`$VWpTj_1y=A?m_<6b =nXb '6r=X55knT-bb xd4Gc'ŰhaGs[ t 2H01F`&6-d NȍB:<& MasK¼r4gB ѡ ܷc ts\⪵u==РlC0][׫vA`8n\Nd>ttx}wOۢEzEyӬ6O;߆ND53;ۉ>] SZp녯1L "(9 ZrSJf6D [ Fl f-tls|\R}&1zXг1=f nhY?. E0- DFM WsPjcnFW `|!es*sj`G&p#0 Bs3\9wcۯDYVjICp؋ >_.7;-82N=.K` (+9yRHO>/^'=Yp.چ2qdbh:H/ oog!EzY߬ukjˡZ3u30D2s㺱)LjDdjs$!ǎ-hWdwHgZ6J}P7 nKhErG^<0Qz<$N-ȳiNONCBcكO7Dz_gJSW}~͜wS[Ȯu]bح.#Kv-8Lzz7;eםݝ,,&[o^9t˟d3pbƢv#rPgl;m7q>!+L=bnpўb)hY9c?0!K"!0ɐKW$O²xE!EhNЦ!g膜K,Q,2 #C& G'n#D(fP܍q=?.1*` qUXguu]bq܋/.7٭vϞ(/Z>=Kz}mj*pd|UCE*( 6- V &D[~F-ZF\ =%(%R[BNhz X R g3b>B4B7u IfS{\'4{ʏ\a V7e77,>.J[hR)5㜲_[qi :,h7YWzNn& n\2Gt3 Bt%8 ޴_)-װc:%D)}66a0Q ƅ?J.ΠۡNE.d‹w] (";<׿[%3oˑD5Gz]69Zxq-ΤQ9ޒ΄Qnsf}\D10e*M̳⳹-AA5 F~La^Wn;X Z<]?jq~|RvB7v%WJ N~qZ㗙\Ǧ|tVe1y%+ք,8XR]-)L5q"8<-iԹa⸤,\nZZ3O#mYs*C̑„rf!ΓT&RnnLzV>iƮ6a4hF = ,0_nȎxW;}ݿl‹'ǟs)y.c;M-s9-⪻E/:(l=՝:-S]e"ENevEa,ޖ“~}? 8qycz2\!}i:nʼ:z۔^`e7 㔂[f3Q29E-煰/Sw.Cv%W+>S靊O&j{Ƴ_D{kE/">nbC#̸硷C o~8^IQ1'G~o^Kbs;Dq±l]]뼉Tp?֔m#Co߰ձqg6y:oݣWTNw*/|/] (*٣w9c'<h{&n4"%nC#,ӈN>dz羿H!Vir`N$s{֯2+V~4]"~֖4&iY-s硘qaІp4{gkq/g\Wd7 q vch. QiKyٕ];F,hP'Q_v6!͇|PD#5( T0tح6/zɉܒGs|.)$^Q+Uxo+=[1h/."#ޯ/͖Ǐ4csrWۯmHZdxEb'[8bcq.&` ;`]n:X V[qA _MG^ :Dv$-y݌>}&ߌRxMv%WviR9]>k᧢;<+;tL]녦WJxF{Cdyk&D!xWRJ.,^Q+>>P.{i!]%ƇmvnFrw/fC] (Lxo!7)#]|[]ܿ?8ѕ^m%6ެEEvk+7FfotɮWDxo)wR|Oy[D(^Q+oa}+ٽ5~%-zKy5k 1@#j]Q?Pv\k@ޣx}O?_Q; !b{!FtZJ%W?K&s~(\Q+?5S+JxE{LoQ~f5%(uQKdEQ+*J85i(-((JxEQEQ+(^QEQ(WEQ%((EQE ((EQE ((JxEQEQ+(^QEQ(WEQ%((EQ%((EQE ((JxEQEQ+(^QEQ(WEQ%(WEQ%((EQE ((JxEQEQ+(^QEQ(WEQ(WEQ%((EQE ((JxEQEQ+(^QEQ(^QEQ(WEQ%((EQE ((JxEQEQ+(^QEQ+(^QEQ(WEQ%((EQE ((JxEQEQ+(JxEQEQ+(^QEQ(WEQ%((EQE ((JxEQE ((JxEQEQ+(^QEQ(WEQ%((EQ?˖!IENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/splash_anim/splash_anim_08.png0000644000076500000000000012040412647526517024352 0ustar devwheel00000000000000PNG  IHDRjIDATxٳl[vއ}se}WP $@%lDH&Cp֋܅Q'(Il$RTDC X(T_uv{c|~se̳inSW+]FKI]6~CCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCCO_;xo_SO~sW7744@3CCxChw384744!<CxCC |?Cˇ!A?QBPO}"Q974gt!}9?yT }`pΟ>~@G^c?jg}< 77474?W }PGy~Y0^^E8ЀG: 5sK/ Arsr 7ý0it[? )&yl}{0 ~[4=Nohoh~w _(0x|\ ǟS@,X/77H_# i~$>sy kx-nSw>\68?KM= }=9?y\^dP0!~ww#[-[;>R7B缃W@p7&wKx7ߏ[nߛxcD777~ x?ؽhݵ/rO5? )D4gwortk͘1|W{no =]?"UxCxCJ E wk ܲ.prs9y7-Nv - }Xm|NWTGwN!ν.yVm"+7o-un Z&w-:>y.p7𦮃ޢw>Eww> (ςݳ\sZ]s8z[Mz!YNv77φ-.u S\xxqu #£zWN`ohLZayBBi{x$RЙD"N!G+F;uěܝϻ<;/\77.CG-<1'MĹ]l?e˼G|z۶2?C +m|R?/ѵGWwa=@w-S+8m\b};vi5ׯţiPnBG5c-<>*daWVC=nӢ;Z;oǗ<.7 }0v }v^9܋nF7A9:q=|Z_Wy:G>:GvggԚw:|p )0z\Cq]AѴyñi1q7uJ6 ֤ 5S]ʾbsKTLV1Vn.<`7+=x[կ]=?:q8(އO[}7- }PBy?T:-&6x綆:/נb@kƖrkx5kMbU& 7A:[1AX;\)Gn=B k<+6Teكz VCh⾮i BGӟvBhyv:en=NDt앛;=Ob`ZA8ssW` ` t8p8]Z`Hf&L)%2DKF՚DUl١LJI;ws`Zi-<%)C<lE=z-W{3)0o 7a9~,`wZN/X˅o=j6GgMI{'9bXA}-a*+=0ׅ7R!?zrzC9Pu~t W[ő-;\2aGE+[H 7ج, 3'(G<h8rk 9\[xms_b+Gi.Epx }$~^v_=v]\]`jnLiEǠ3bXiNY?wے[XI!{NC]l ZǷ DY_REI/aO}DDLB;a.?yJ-pT$\)SadKrLos;vr5gv3/{/% Xw _;Qd\C~`{vGV;{/۝5؁-@uD2X4%ʚī;ewk+ZU# >,*cN0䱛'N@eU]zEZV?YPג8*d6S!b(4R4aWr+Kb J^YFeѤ@`b3&nu<8 *]捊=^Ewm|y|_u ol@oh4>o}<8:w;c vZ+Ak[s{[h}g'QYbwp(ILD\{$ՔT| km]@IhWfVuzzK2a2V%LG(0səc,-E~J2fM5}_̩]=Bw(X=-c=U/=-.YCK? z#9ѝS]ޖy4w8ǹ-yfSŔ͖HDF؈;ML 8=hauL ̔YCJ3nFKR L=%"/  ]Z*7S{M pikN/*B2IBMf }zeI(Lb‚& 0`-,@)WfmI*w4iנ'+np p =m<{x%[6-.,Cy~x/BK;K%gz%[Y,ؕL:)&'$SV7kdtÜfɥPE  $Ŕp,o {*8= N|"BOP7}OXDx&\oEDiTLPVdPJOG803AMrdBPY;zM$ʭvpwv<%pKpTo!6oٝkU~XsCohh47ܻ؝ݽ*l9ݷodk]7#'4 X2E-e2BT =eKN/ ,u ((Lnz[ݝ X_<XoU8cl[I<-:.+l)*d܇>Ds#`L*e.;0cǒ^ fV–Kn\zD䄝v4q+ns8˃ęZ~\==wش(hqy_?ƯQC#97~ x'™C_݋أxivgÚT[n Ksf/:LbThy;JJS.cZwmn*s 9 r ܄C&ģ}KA,`:@1 >n B|(u%i"2rzU jfM Uxʤ)rx[]?Q֤*+Ҕz3H)wBnz;ӧ{{-[WNx/z!d?NCoր8͇c܀|;y.&fնUjZ[)| eي[I,n&Fi,Lc!Ȥ%b-hFe k[蒁aD5uf+nOr6ֲwtZxSk.ÛЪ3a: K%qzM2KU S&P$3 2Td:vn]"K37:`q/ptwusb|;#=GxshokIpmN|=ؙ`W'<3ĕjibpA&HZ$KdISILs7dp,K 3n`:' N"Yrx0 j J@܄`mNO-aÓ"0SES i?eInbb$]AAPgL/ҚUW.Kŕ Z H;Gw >;ٍ'8}+r ;*Un޶ܝRZlSȢWc.8-9{iLFt9=j f`&#L! `XSjI,YU[UJ['q _ OZe4'[4S$ou\GZ> KA8%M(JTCxTZ5KP,*UT/9[ DYYHb]bޠjdE ]1Y+'>T9q!{T|ߎP6n\)&"ce*CV.2)%˽{k9>xFf2R " #A[~ F4Ӹj>nz VJE iK~NeJoPKP򟠔msH2JC3=KmM筘0!n!+-1U)&!,*f֢g0+7\siov7?n~\UKVVV6y] I˜|b(+J%AZzU4s[kB EZ8Iii"i&KhIgJ'e4ITHQ0`q}.[v}50 d2I!̴^BesTez@HK2L3=-Ri PaTn i.P왖iJp6L9oFe]"/2؊}0ʕ6sUF`a7S^aB+'Öp|F\Wa/LYgwwvg-|\mU;sZ~.bcur|2Hd-FI+Q t(#$3O*Jw%NQfaf t ֶAPÒ-) @QJL:yF HۯoM jXYI TP0ޓgh)ii"&QiITH&N"<`:rJֺ!iP&(dԩR^!tye(VaପXiĽKL,k v@o |oڛx#o A  =ݽ*ୋZe.oqw) :ٶ`lţc-vx\!݂Yu,ȋ &Y Z ]^$kB4:(3ڄ 6zepŖ[9> 6N-t @piI'@%I%Ze',҂dRĠj3Sd T3 }Y%ښ:& J \KKV9%ly֪MYqmRʮ+lyKYx}Y;-t ^89474tC _;n^;;.h:OL,kFIKʢ v.PNh怅yV"U6nF#i%Ô3&Nu--.oq ՙCCxC9c]ּYQXPM",/Rww::Y*v[urwWg`h.i&Cmp M,!ˢ23]4KW>;X iҫ#pYЌ f*pNKR,H"CB:h-d t(~SDHZsuD. \] -x$cHVBoRo- fIH91"@@@)Hf0XZ * E-XGbƔJ ͢4(qs&C"TXaVrw|pk֜1%{6`w= 747n|o]/@8ۭ:Txu}٥mC"ظ1cbLhm 23Ln4gE%]rL3Z:ԊS62KdFh2]0fnrK#kefI, Ύ|Z{ˮ}ױ ,dK ,e@6IK@k?L2dpsh"I% t0*Z'p!0]b,TC3 A&._*WTY`e}׷S6Ops }z \ÖJMxxe0e-T婢4YmfN.KɭҔLˢއNR0kaHi0K8֛Mf4e+d[,dV4 Q-fsZ]ʖI+c {+r6׻zqw@h*dʁl B/&5RYVÒL*KC`0sI4̅*UN PJuDQZnteت cc*W - GXГny~GgRL3x5f`wGf,ckO&o94,s2dP'ha>Of'8LLO3c24QE8D`&ĞKCdB1P*UIj]Ú-ɶ6;626 _d}-PTJ'[ K ! ͈\1ڏD64@$EiL&YX&; Q+Ԫ>,գpTۡ|x^  Mۯp\w sHQ!G hr{Ƿ( {Cxm;xu&PK+h1Q*NLOBN0Y5sU_("ݓ.,`zhRQth5pSka[I2c@h<mDپ ^Q6|3 n X^ G018$x@p&肵eڐl32pd_(%ZE m6FB@UxPIY 0>h3:|Vy:KQPW b.Sg7czdCxC[kqwY 3iE+ ģ{wۂf&q&p瓑rGS)S:Ayhh[zÜ"MOi}wͅaZEއ.Sswj5!w}SEǸDB]ݫjt^%S7M`Vڮw>dwߜnժ-]ⲚܵO=#Q ̀ŌR$*EnB遌M*66y .ٕ&%vv %"Ԗ@atЭ2xYo| j m$x?wwۏpNg(- @̯ZHs{ 4,պamxs6+D,4+Vt"]&E#X错`!im zS+5 wYx{sy/lmCt6tqXg_=[z嬟÷>gXTܴ"_t$w3Lզ6JLt]*D+\ܜL4WYd(5RbJQƾ5At$ irU_gZ(rqq{[F;vykgpp}&"s_xΧd+=gUk52RmhWيXz$CI(3j?FP}ȶ1y cRRBd;Ȗ&x=?d݆jˊ֦qwy+iy\ۥk8-w`5/t`aL&nhaL-7oۚTaq.VJ -N(2'LtmAa9L𶼧|էX/Hه.cvMHsAJ; u.y%ic`>_B}mw`PVYe>H43H7yz@ѳ-۞(Š/xu`ad+paO mJZe َBpKEgYUvd4'8!OQys8*z8;z|š;TzhoGMoUgږGwi yrXXےhk _"eTk:-*ŋNVZWebS0P7"YzMLM%=ɴPRtQfi&QN2ᔕtăϼ<'xl[98—} fN*6Ύ3OC0c:'Ov5{öq&UO%#  \-i3YݼHnѝ[[mIF҂f[ Z"V~߇2Wkt~~\Ģ|-y2h\8I[oWr5po7^zs[R׵* mr JRP6I`[F$˂l)4w.!m&\er$ :Kj)ձ[VIeI8tkk߭uxUxh5O  nlިͷ(n &APNf}++jM&j&gq??h{ɭ:wuu.O7q)hYfk|_X;?zq8[=O)o@DZJVb@F!Y, L)D'ZkG@iOSZ t8BIai24O7s;S3َj.nI 69^ncЏnڐ4=}}4M@ue̜lCYHX etg'Y[j0*M(&1Y`d梥xhxiL-?'[mR4=M?Xpf?/?o~4hu`aYg>cv/X^s?wDxTR ꣩V Yd_7|6%eQ(HUKZyg*&BeMP4&<ڌy|n;rr\Te>e zna>Yˡ{,$DzВQHM`8QR SfU ͜lI0IoY"ZyHl%&0ΑȒ]g[=A :*^oEt|q-3.M˗/[x/돑=& Z JKq RmD4 9e:YڎTegfP}e{ S}a QIk pv1|[IXJ'>K{Oy;< ,!+̾ ( p j14 l3" $eX.!4 Bh ?'0bIkI1͉%pН7p K^q% Z_g_^¤I$0$&%LHysv)e7  !Iٳ.LldslS 9i.',{kvÚ7n* =[tuxN[к4_m6; D15'Zy oZAEu  myfo?h L *1A$b^l#Dэj aU|Z8ivn\[r eis~|o`vڹ ;d?v|>>&}ίO}}z#\^Y%B M\zS44d Zpijz³΢j3=Ooݪ@H 7475/ XVN.JWC3}E_\WY ڲvpk>WMh[No}tGc׼vqwO\:Li'N/qxkwc²?'P;W_w%%wBjΕ aLL:3mڞC#%VZZH\ᒔmjMrr[-wpq[8{/=eaU-E-ft>U='1 ڦ{ȑJP\Y/f1LBLJ $_W:?C[*y?[ǁ61qtr r;?u 0[ ޺ ٯW' -%,x&))e8(&C\ wfj\G/ j D^ڙhؑNXFsV;C'^ytLIdiK;tPr 4ҁtlZL,`;mii[o (S\[γDeJYdWOqc8qvsrív خZ!Nr1vQ~ZlYm1g# lx&U޻QA@SX*rJ[;s- 1<{X;4Ћ-C]Lǐ=qAtв7K6EAʜS$ڰtZFsF؜Fxsy)ڸjȗ*iOfkux x5W۷P6.EPM9:q/*u/)keߋV2$#-^ai D/;ZH*RY5;lBϑohoB7WysԦ]Ҡm mldX,z.Ky/iiEVg2@ UXt.Veww`w6Sy9?ZY9O+]x7|ǽvׅ6ׅB)XYݞV[E⿩M",MieQm j9?Q[*dFukeuZ&bٟל!w\h=ymغC"fki+UgR}Xtt0[AP7}+[NoS*6$Zz(i&L˦sdHҊUmр/ /?coVVKrU6xwuN.B5 Vgp2XFC$I DB^ZKjQ x%yӯ γoS9rxe:5 Fxua_S(tb_mDetcs 8UPK.)8֢0\V"uz=a v& N Vީoz~ ^~*O|N, u>o aŽW?G#mlkt"Ȅ4zd4IQmG^*%JB$JeyvC-"N>zڀmZë[ӳhØ 3V7lW4 j4alw"I8Orŀ3= tM~B?3~w<vNLM@2ɟ}XZL(epsZ3y+Pz*AEه5O۱cl,n6і0BM_)eEi!`mնУGQz)oQ֛o<MՂW_í=dtFƚ?"[w,;޼Y*%LZr|䣉Æ~r7;hg5>1~ -p< |l~wevO[!ӜFfá: ]z6⎓i/y;`647t8 4WޞCKj|rp 3&$M5Ԗ0cZ/~XkDNjYz>.Y?4CG}<ѭs[<WkV<@6,i.nh!`F;,ԁq?bl)TRITVlN{׷rtq[õ }(a̧dd>Ab-ǡ3Am+E*$!0Q>.-]g}z:[3w?nS؝pnrzy/=;~–q 0cWz'48U=ZP'7Zh< Uģa;XEg§k͡zwrغ:6ǐ[v~2sUUbб<og+4:8j DQ &t0 '-bk;eƃ3@}e~㯽]a%8ԡ l/O4m#L?- %-`p(Ot  =[_ܓ.z7^L\rwLwG541=4).imyiC'uY( 7 Gj79v|G,qE_S\V.O-лȏ} }iϟ"yImZ^/ÝݱU:j[gPa9}BxbGnּ.K],nvlPX3ئ!WY$_LK 򓖷Xߏ Pv\C\x|3-z;Op?[;`bv /}4|9`6 774t;%i&w UI]5f/y,oŽ*9}Ks{}N2MYܝط%p_~o?V-P{x '~8٥}[>|U',1#1`mr 0dzX)ff'vׅ+|`CxCϯi:?~~v=,.nqwbzlF0\5d8 f{ ej9B.\ԏ\k@Ex|7g8m oowpq;.R369=+ݻ ^| 3w߮SѭQ247g@ 9vÏsZn?P]9sI3Iu7{"=Mt.HT$;M|@{bVөsZo5Pz)XYWϹ{/eY@@}Xoonz…R{І~8`ZrwmHǏu{B١'^"'+,WtAaLM#w?{y~}~q;47"_yig7L-٭z󉏫ڸuQ>)%G?sZ4Nnj9;;h0ijPwuzgl' ڛ|P1bu>r4VlݚތНt\\Vz& HۿF١xe_k6*NjOoUMwm%ٛ.VTxSOVfW|ǁu׀FQ_zD̲~Slk$xz[]NMCxC}7Kt }k;XW 6Ѧ7Uo+m:P2IT?L~Zq _wxrF<ޟhg@ȭWY *_es *`)Jb=V3@747 1hV AHB/myKWu>SLmG,kxw=t~-~?ruqaG/ss<:8q!~ ?b:WJäJ רHo自wǷCq m^ : [-*2փ9vU K0|_-Z蓺x5hj敻[B3]_?_m ]Wp~ء-)q =1+ơ =kߪ`-ciU0&09;aޜ?o 7~ v=v0:.E'I=u3iJ>Pг+8+M,;@z?44\!͡ MP h& C^;v`{w|@F0nl~Im?}*6A~__fңkVE/xmK#b%~;*7`s(\nN0o  *3d}.AEʑ>^tq+0ar8_s- K3쉥+V6bl<;P2JP5 H%hGN]Z?_wC6E'`Uֽwk׷}]nV`j$J\I=lgEOL_OL.G~07б޻ݺxv4Oy/dQ+,D2 K mbJz)hU t( b8t#?įKCM2>ϬK|T[;qu7݀uUkG'՘yU`[0%j ]6Gء$v\xhKђ{]Z'K QD|ϡ[%[:nTv| lP+w\?O\q>)lnPEXގ^T*8CTeIKaK@Js# 78476tѓnj z0i%:\'AͭX**BibUPD")E"uh[ ;<~o|@ - \tGvauf p'k ȄZ%`-K4G $kκ{jO[p 8zV>8zL(zq+7>}Mנ'oW8)Z_]ujS0@> }gJ4DIY: f/jIv!S?x|ŋ`=w|⺸.T}/#BYO~/c>Oup _҅,~Zx3B=~2WR@1語,^c.72dPfITTԣZzNo@ _^n,nhoSMTx9CUe?,*bXAKcZ!̔<Y.޾z\7\@0&r.ҐTM^'wtBB3'@Vs؀^-a/"r$jiH Ur5jdv$@&%eRSՙa].{2c'Z -!Q! ,ڷ1Hr5eZ]Onqx=|ݚ5<_cތjVWOlmhHXUnf3)̒HE }y 黜ޟ<ʝm.>] LJADL Lf䢠 D br~71˕kaCQK^o[!K{x |42O\ua\9v[8 G\),KX3Wo+,]ZEW>e)+ō>u=y4;[ͪn^o(``~lxJs‘V9:f ,ȰI6<:) =)*ɤDEij=zʪ!\|>yB{'!<[񱣶; CɍOy-oxi~᭫2QyUJr{û? a^k6O%R`ȐJHCXv y"wHtUdϐR%s+E>)[j-dYUUcÙdBTr*DbN?{'<#ɬ4ERG=[M_?8[YG/9P>9P! |rwy x}xXoqxw_B$B EbRO!Q$"d2Rewm)%}}Ejg߱ {?ux|1`ٚoZ{&t/ɖ!̤"6sϥf142-U[c^nݼ:׀Ѩ$:7s+|(w >6!'n'՚ ~7 :,?PQ@+˥plCXk2'zzVxVÙLlVâs2><:<AoZvZ,#\!/S(MLoCU3D *J&6R23}wG낕E+yӫ'No^,,qb۱u|gn~S׷@ P@<`sO\ZsmZ 2"a?A$ZlA[BiZ{u&+l.T Ibmc•,T+tW:m`A@Rb#=/=ϥkT`Jǥnp>I*15~0}e]Q™o.0#pldRoԔU@ݛoi+.:moEr? P1X{}4f+RL EAUA)MNwq7%qP?n` }0mf-ήNSHOx Tz/,bd )$!L4e)@$Aa֟{K[>svY_mH+֖Ў~ fDw0-&y<ٙ~ )bmYتf ( ѻgq\!0Xհ P2FH $2` v%UcʌM!nx+zpv?w'^:shhoz]Bg/Cw^oԌk>'IYmWjEYS&y;CfMꫵ],eDۚID[k ̻pw~qܬ랮`ļaspܟC׶<B-Tpgwae]鸱=~㷁w}@+Ufb)jΗBY#QLY&u abLFm$DLx,M 3 ]k,ܪ1*\h!>^i.s7 531#:u+'_6sz.gg62( zU0KZC%_-g׷nbf23`&@"J_zAfZ/^IQ>^W9We{Ǐgx z+8{>xmʖ%OZԞ ;_/oÿy7^R+NRۙrK"2A Hq} Kqb@Tʊe]f5FVi `uũoO0ەH=YwanC ~M3àO+5z;l-u7WG:IKff-wFAXD J,Z+`!A1ȄeRJQ,H0l|kOz@gvBn#"֎"=CbmQHO3I Ϙ2=-ҡD2Dm:7yH@4Qo+,}/jQ*ХC-z˱eKu7Q 6< (2{W]CJ[ߏ׿n?&J4T%RDfoIH"LD##"BYƠ"Rv2 S2,  =]WVcxdsazjʶ܇tlC%g􊔇P0̴QҐ z``( *cv%K6+40Wƻz~/m!OÓyl t2}pxٟ @8 /Gy1 Nٺl`"rs@)@2%2e̐!dY05KIaYeTfZmU, >V,iًAKSΪ9!{NİlUQ7+ }4يUd{ۣ'i)ʱ hE+CO\ •t];PgB\n[nqx3go1z j" mXFis5(aFjLBYi5 " \ZVH e BADB5,_kӾ=Uz YvZJX=z}W~?|t9GE"k"CH)zAʌD(9ęHLXe(%SQugD KX$Ɲ-T[DfcV;ͨ PYeqr gfBodñ|gٚ ReYj, DLYU2=L壙imBQNIUx~w\M`YOfiUEfpZOY{5`;}.2W__Wʨ* $#*e(Uj](dڪXU! ^asȨpP!E 2!E J5E"$CHaYBZ(4B̤Jm]0hyP)H!<26pf37'SR+$YsaJnjX&lޓVb+u4{s iWFrhoo|}bסW9>syF>>6ۘ]aN!rmY||v ;cZ2}Sgl.#QBki% PLtAD g 0JVSa%-?}Ͻv?Nj|"Pyu}B" ]BWxOO$ ۦ*, f3Hb^W"%.# @Su$̫Zs`FA*C%JF-@)"JвLSD%%Usm2$ZV6(MǶfCWnڃorho 3J{M^8fz/7Цc,ūIS SƜfpezD#2̫Sx'#I]1z$DŽ  Y rQpKuTnJ˿wG}3j+,Qv'7RTvx(e<ރ/76 P> F|ٗ%5)5.o!TD`)#zF&,fª)UTY5v6?3v(*4Id)<9[Jl+%V$XhwޝzZ%^o˨1:AVr51 flT! lsft2iL)ֶ!2AªA4&,%J5V'\ w6]MCc&l$&EyVȭ2Gkno7~?>żo`?n]/S<fp^{_[s[^wߖD$,IٷI{mlֆD6mJd2@f"J"hw+UJ$=dZE(UY61:w˒,;>q!-\h>z'5MB@/IDhdl_v5#2@¾"%<=ٶ Fa1fx̃ZÕmb)}nUsyQ+ 7 < +6?:s}8yy~"6YD _!s'14yކ6!0iIn3@AҔ'[f9 &em* r$$ h"L!%GW͏_̟GMq~1Kb[ti'i̵.7_ٯ>OI?Zz2a)bt%j7H2 HMR ϷI)!.]2EmĜ\Du7>9"&*49)͜TfVap6ЖJ>b/ct٧zU|%^Qi̧YOǍ._@/.{hKt=1_̱6nh179e8h.ê8wAdb9S( v$LײazPaRC0F) ~w/G"6:פyzsޖ7!e,-Be 6<ۤ9xY]r[DYHBЛCa#7 䖛 #NjyW`-ʞpg6 l;X!='D a^d$8OaPoet7@;:=?~({*ګ󻢄W{9/Rj_^\qM͆q 7D$Cm͐t0<0 D+m;kjq`i:(('ghjBsd# E–352ȌYaL0`zʢ}͐CeaA :s"#7*L V0r(1M(dY1\ pܝK2i)n!@ܣ5\<+429O0AFkiIeR.*deEUdVo.XLjWX6_ [LBۙPYMf,X|[L|t0pskA6' Mk. N"Ȳ@2"Xdm :`ng0 a X I0ytB@=83RȍPw6i6a>yʮ;žYpFpw{nN[Wl1tk5%C5} }o}/c o ݆1]5NxA؀OmF1@ H6P Bޡ SjZ-j 2SXф.,d" )ȲuVof/ZdbDo)&Zu D*`2)AU Z&*i6@@twG&H GnwZF} - me.\G g@=icpp #xyl#8,H3 3:U,eˬдq8ˣDwoۛWa cO]i=t=,/w'yC۽Z/3?%67FE9H6D t#d1̭{! >1 SC2I$9j &Zn@,–( dR}h I TfQuC ӛY|fqiWfJ>;K.L*)Mʡ ""(HbI{!,+8 (%\ ɴ,;,oYIW@9-+6ãA'tgd{CCn4y,:!y`4j]t BO8f#0tէ~]:`37Y[+JxxύY@?|}, l,1N{bA3¦a;oC=Z2xs :ja4C 3Jpef5(#:QYu6_RIjK4:F|[ e|,nQUt2u;pG=!" e>ѝ09#O>[m/ߟ Xht6> kקNz|C*}Fw%^Q۽~}1'2.v0pe: ʀpn= 1fxf}O@ Gh#zcXM!w&L6Mc2P! an`eLj#, 5Cn"DΙ^K//g[ "uHir[{"[,2u ptI.sZjyhm`hB!`>&ot!-[w[)h9+l8 G~9|gJۈK%ȎWbҚߑcLUڲ(Kto/CJ-ޜ6fކi[0A"S1 st;ld*R,dm6-tkdkTs{u_\6YE 0R\"=<Y |+(=W[]XHIa ܝAam°O1[a6l>$k뇨Ѭ#lhrGͽCF0018h5p:{`Z Ct6q}D}#r)-/ YⰀLMDڄNA&)C-0/qhCeegs GCH)ln>z9H3:6c:}N]{ ař3Zؾ,Z6g?Ė}xlsOUhVx'#?[?uy-:WqʔCMvd[1olw&~:lhm20YZsvdhmnf#ZXChY4PTiDia-ק,+-hbR%:W3o\]Xzs:x=@(H"gpY (BWλ a9sdc,#Y2}昜@Xy8,xuOYq{@ f쮶'ً\8_$7E~o5L> ++*a4)o}߲c,;} `FA)CD4 fe8Hy[3Rc2gD˦r;$Ж3a Ami fS(2)=7f-v؜᠉bF&7i*ї:0 ln4k @g A.Cw'C :z9Ӭ8 \\s 4J r }%2OݗcsZJ%xRnE}?:\{7ʣ6 aT4Aogu~Bܓ^)lWL6%YX(Fgw`̭B30lL>r| aaCp=Sl " {#eٖgRsv)-{iPҪﭛdD@˞Y-2t @n" " s2{(ܚ6G`0rD6qcb6( ޽ \\AlwdG ٽ)+%[K{߯~xTz9_tʗhήpm!ϱC'DJOhs' |F )Lڄ:F(GL3܁ g1K ++jo>{07?BJIHO&~ o39"k9g' OFo1Oˀ6mc e֮uW2Ŭ}&F[667 9kriZ)D4r=j(Zݙi.g|?,f"LWf9"Kqаee4us&G !Űܰ@op!lMhʎ>g #{na;m^blAcdFutS=,o$"=u(-Lŋ_H/r°;hiKnjY?kSD6#;ͤfZvM1ar,oRX)4Ђ uhOX3m\nK&pޖZFvFuTY+xiR-AoX-|Sl4<ε=ٰނnqYrG ||г玗8JAv}z;zTW+Jxoc{cjD|\?9t@ŵ2Jo1ٜϤy`Ax74% XeWu5CEx8Ͱ.olIc\YJpy,NqrJ^5Idk3%F"0eq d̚N?#7+ (%}5E[wx*"^`B ͸P pX鴼>5]]A`,|LSylKf_o)F}%W|;Gyõ\vvs["?;zc@EM2 yXD;ЛeZi iIn}x6xr@r;#ma47  [df,Swc<巙=%h6`t-'˃qNmi(Uv_sf{nZ"‡dx:+uW<75?6p$PʎA2Vq{W8Lo d bw1Kظ0O f:2S'qQ]Ϊ6N{ :f`pB&1:SYlPa&EJv򹽦-ciSPn]# ymܦ7ay>7LS| 疅&s[]MZCw7,>2 ૳)Я3\ŶJfeݽRUQ^^"Km>xFVωs>=pMg.T趝JCF{ 6Cw"@fte Q۩pw~}1}[I t jߚq<["h"=ӟޖM vS8ˈnw쎹 c:qX mgko^oٔ> m={2A/>ewUWJxo|L~Im>,`O#2HQ\ִ[,o?ۋ<V))Nko}AcZ>ey{f[ք9>Mvr d60Y]th[`?Ql6 ,T,w}.LU~W:Hn=[wWvg7ݳS%RŻ3Tj'Ns%?Ae&E7x~]_7~ka 욷Ę,lRٖ5Gv~'/gj<Xĥ3FM0k$vXECm6/RtB`qݚRv۝roֲ+'#wޔ|^?Cv|!u1BkAdSў).fgٺj"~haӡeijϟXӨny:IcDxas Y#\qnTX Hiksn]sw1ux6Tl\%n:9;vt&U*"W{};;ɉpz9;*Ԏ94EvNnL<9 0oNtGn?0=x7n?aN~>Meh:y2M90/b]4w"߈}v}=mpvg4*^xĖav*QQxDv%W{(1}3-]~d^^O6Ǘ4~<exs5 `>(&{PXD06-s,@-9:~ZrTtॉy-#54YܟiY:tl9Xk \VU*oVzPvA܋Ꞗ[o0Jv%WPQH?:%E{;͹ݪmōC57g8<%,no?JM>~:4|HbJSyޭ."$h\WSw7'$^f9=Ә]Fvw 﫥H|9=zVFuo] (KݍnKhׯ/(ς篧<Vښ g{wup#Irܩ:JvNeW+Jx%Bzodk;*=<භSwߕޝsÇxJpwv*[Tk'QF4&([@dhnHv莲{'ѽJxE5߄nBAvژs8Ho,h(_/?AzWqH sbo=ޚ gGv7ʺ=fM[J˟swmo/n^_ߩWQidJ_~t4w~x,=7{F.co~tXǷ>Fl%w548;Dgoߝݿs||n xw#uZ볻S.*ޗg߿?;]Ex%zJxߵVݕ"vy._ONxD3gtnrdt)OυEw_vjTW+ջP6?G|~[R[%!ޏ"yL!Q>&w8f{i|-*I!^=zOeϏNew*{,](/)B{[=|QV܍3|q["\ `Ft׮Or{Hr..(7g?g?&S}ܾ*$w]}VW+ջPė2zV=WNm|[i4OŷJk=*%{>٧o;O~-/˿}QR+ջP{eÏ}<,OyC|TCCvzF&=&Oq'}!٭[yK} ^ ޅ޷)o"E}w\X:=M]%sI)wnO]쾭6^ ޅއ~v#A?M)ˇ~>n+W7zI-_>CJx%zJxHsYQ=&7 mdX *N)JXN{>~cރ˦^ ޅ?p=MOb|He p?ܟio*dHpok룰W>Vr^OIH!9^??ޗ4WJxʯp{2|LjOE}ϕۻJ9_w V+Jxſ'o)}۾k|s?? 7I?O^Q+}˿<x0Ͽzw*˺}^+JxE ȃ~7קo>vEW+5c$-=CpJ';z}EQ+J|P0ۻNw%\Q+?}m>"*%7"w{x)%w;ߢ(4)E R,E (ޫ *Z(((EQE ((JxEQEQ+(^QEQ(WEQ%(WEQ%((EQE ((JxEQEQ+(^QEQ(WEQ(WEQ%((EQE ((JxEQEQ+(^QEQ(^QEQ(WEQ%((EQE ((JxEQEQ+(^QEQ+(^QEQ(WEQ%((EQE ((JxEQEQ+(JxEQEQ+(^QEQ(WEQ%((EQE ((JxEQE ((JxEQEQ+(^QEQ(WEQ%((EQE ((EQE ((JxEQEQ+(^QEQ(WEQ%((EQ%((EQE ((JxEQEQ+(^QEQ(i7 ەIENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/splash_anim/splash_anim_09.png0000644000076500000000000011741212647526517024360 0ustar devwheel00000000000000PNG  IHDRjIDATxily;"L5PU$"MIDɒveCQ?@իji{jY-[lHJI T 5!};bGd9yNHkeEĎSd}?tuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu=KSbFN}KׁAWtuצ}~::g} ky Ձr>G A}ϧ: _>|=t) PC'q}~_/㿔~YO >HxY}=|-\MtC7g}uuuuݳGɏ|rcO Af9^칽4~ߗ泄|3?>hQ79{H;v%n|P}iш>{SC'wS؝^Wwx]޳qe @{-?+xq{E;>{z>soL?nc\S'nn g}޳p{~j!zxx]x`'@9 o7O:O :::>=mG }pv}X8^zf}~i}c`Z~~}'<<hO<%Nx w!&Pw@|s{Ao_IAn tpǎ]޼.y p~[B esw3 a]܏œz'U{vuuuއݳpo{?=h7ݕc:"1]k.`w`}tvF|m\E>>tsK-] .v`=-7nİܫx]z_l`H$ws7O,Cz9`m;v .׸9=!U]c!LY|K .]\tTn.XPuK/$ެuuuu}l{̣֡{5p|Kv71mtbmN7Gv=R2ixbuakv}W8;<MZ9a4ȭ- pKw\AYCu_^W^x*oσeCb`4wuu$ʴ{q{\ѝG$6]^L&`=H[AG + #+{+ n>1 WF$ĖK0+%P|6 *m AxlKgWZJu愢ͷX'z#-<ܻxAcn~pwx]u}?|)A|0=p;x$e1)nt#8sLX_r!Z^VVtN`<8I^찵 _.!mb n 1  ek5@$Llv\o.5X8a݀3Npyn|ow񂾆x _Wu_:>ؿ<6c ca[+<-1asEWQ-@X3h D%ps>͡Ip5ZW[5$Ud M­+ SU6-8~nj:/4`4Q np)쎟3쎹%}Vz0 7Nϳ5T|9zd>j`mp8UeoKXwnD2[éY`{.\ l ;/!(\iυv@w{w Rrš;6;LqWRg-f-GP#s W$ZqltULty)(ױ9`m7'w-]}~o/)|G˛ϙw=iÙW`w{%0^;Yزݣ06sm`L ;S:Ȧ9W'P\ں7S~P۰gEpYې Þ<'CPss %X M(37wNUͰ[aJGhJc n>8x%Kzooⅽ糂^^ivu_~*2݃eW<˓ݔc1-sxyTlt5腊b"=]FĶॢl'ٶ/D^.,omD<|Lk̹ CNZ8 j_$%)"8} q %F1VWG p 1szX=nQqS .k;^<==- aͷ6^ =xz7 qfW^3u52xx/e=~t\ma7ƵllKm` F$pzjEItea %V˸]&M21B1`X#0;:"%;W@ZN pBZ ' ̚3 i* "c t2mN*Q#*U {:F6nkCi{{.K|/`^xk/'z&[>> gkF]yn>o ;Z*i*TعL͍A<0$MiI wR$_6岠\$T Jz3;0AP]θ^s6`{ /zZ/ZA)wW좤sI ,|`1=3ᰉ6` %ZXSwy\::CV|Yƫ+Y۬`usˀmfAY֎ Yi!0b9iE&9.K1{0i2Z Cs3e@t0s_`هמk y*[L3Ҕ|-QP ve5LY\\Š R)]Gl\6QrQbX ѦAb5Jdu ZHn\be<mQ=mnKg99kg~ 瞺<ɾ; Vfwwv;oW lNC}_cnz*glGawU2xznW V=`eflW.`PVcNjqҒL՝Ȟ)Ø$BӣĆ3dTlvyܐ #o0b㹁Oh- .dE[  PX_ T(jë !Wjf5 'zAUƁ"+$qYSR#W1`hEk\k;E\ЊXԆJZacU7 MAv-0|#xr;w3|yy/OeUhFk <#ÚK̡,^׭\ ;) %rrJ8«܂tٗGtctZL2L4 &s m: S~3Zˎ@kXn2H!f`TX! *+T1 B HEJs1 *+-`aFV{XU NAJN j|b G410۬1<XOKF mm7( G W.a8=7svz]x]ڏ/|`\ח;jniH'W&/̫8)+s nꊤ,(V6=%\Z7_-uHYu1+ nRn.q%}x ;,(7fK.9I9L4|)ZMt#G-5( ts ^۵+41Ӏsy aAddK5'X!"Z:XBZ \1^ebsD[-Ȋj0k=* ASrkD@]M@#W4XW/筀eBAr 6`%֜]6bx]<jcyШñzۏ@eylwѝQbbe7E6@9#Ϸ'""[En *5]Cx& 2 ;eS1o$\0<& HCZ! se z[XGB ļef0k5 (,2צ1m+`P$hAFǥN`&TC8M&r$ʨi7ZEu CV}Zava50r. x*0n mc|u}Kkw_obts2wyݲp w^qV`eeJ7*&hՖ١f n(2t9$Q2*3 SbY8j[n s trZg6. (Lʰm06šf,)S(,``Y U( ԀqjM:LC6 cqN*3_&O44yVa(4rA#yQ9%@;5J m84ǷM;JhBð8얏g}xwwՙ nnI@sRYZaWѐq0 &SBob|2$cy,drMK ֮ 3لns6oXwy)l63D 00ZXXfXTL29.ю]sCbpۈ6:!tz#`˜JArOa'QP=XYQ*89" -`UvrQU+J3TW`Ġhqv6Xq C(1=uhڬw1\4 @up juVul Xe3X}y( ]娱&Zn g#S1e"Kș#UA"TV}ALc(ܯFr 69$msv܀ P` J ssbdaDm`tX (Z>Z&Q#ݠHհ\|'Vs{2@ˢj49bT/B$UFܸ'TVP]ܮX?1 ~S+ZY.V5.pyZB7z2__z'"x~ޟ'ՙ jSAG~jW,0raIٺe >2Sà-n%]_hX KЌ.XD`ӕ=y"=2œ9 9% 9tx&MK痯޹/0x`|F_V^޿'o=%&Za[ *kNN  m&d5W r PA.3H&yxrGzrV ]T5 N `(XUQиxdqKk \!F 0vA6`7Y_W^U/`Gxuv;|ݝfh.`2 sP& h1\d" T ANzEn; T΋tPչAn.ZqYƒbefe_fuĤT=_xŏ:lk++P #l|NYմPԤ j5Ba- ^(56D8D*"NƠMZ8jbV%<"AIU=`Ui`>VpXu+lPyq{K7`TNhYqVXW^ӻ^'\$ rWp* >K[(9Pől(ȑp %fVTdPPdYk0wzxeqbV\ P-4 a9}x]5*hL]wmw[0܍sw~sgòNo"2 1 ʪU\Nf nF!X춀ٷ'VYRV VX6hѩ8S!0De8mp> dM+l6XYȰ⨍iR y:׶ ??˸z=Ձd};}S৾݃{୳{ὄ~58Lfлĉ<S\`- KıQjCM0J0ECFSDDŠ`Ar *."&:\.ҁl6gD3"")jϿi:9l\h1쎵3Ag0[oF6+ʑb, 3 b~^s 6 $E6)M(#  i@HԺLa#lW'εV:ήm>w z%.aLJw݅æa;7e`c"-l*jG+F[E8 *CmVrvLVXEfXdIN(_%(d a`6_xoL ˅h;77;_66CTz/?szWnt|l34ZDvT57 rqB8sR ,fT%rmQ%G7z~ᄪV>UIbIRQĉnljW 9:5Y.eUE*l#oJS\Rh %n.p桻I*@Ͱ.KVhM P9+u6(KH1i pjnaF3 K=YSeDx^Bmpt53p`֣/f5Co *۾{nn/n W6;~xp~X `k@XVL45 R@rv"C8d% &h00I#r2 4L"`a4T(4G*ݾ{2-&j>=;]YW^GSX_'zVnJLpyb K`*m)ŲaL nr\ ل|Xst`fZzp:Ҧ^ I4t!+tݻO[uwT6¶m?2ԩn\uzmJ}&~o~aY=Z 9ڂʉ٬AFx`OlDgdU[Q Wa,2IX `&ux U1 & 2PZk"c9̀m֜7C{`o]z9{0#vE*v@҉}Æ9 V,JVn0 w>{scsZBPgw˜mp[oʰg>ћ5'h % 3)YcY}22#S!RKn*2=ݜyE.X nOpEN=3< mNe|ﺐ'qt7uu| û8OaK52/|mw/iN x+YuN'<h 0 gCvB%oB`guxvYty:Қe{U]Hwꝷ~_<jdVFȐMQs[I4a@5RI#JF!J`S1DDuU!d @ʨQm'DWQ[,+9д@-wՁt?#pvw/*s>0mcVp+stbJB K1z&h13zu3Ck?0%7B\jT|w&m_n =fO;3YaNorŦ_y7Da$&" ]d٘pEaXP!Ae J E2T. B+LIjsZR6:Q& d\ uuuu}8]Ãhk*/ӫM26p`c YO:ʦXa%diGBcaC@f zn(&&0KY/XN9@_/~l(̎Av@o#no٣)H,-\mAh$|O}7N~N2EO$q,GK2G"Su1BDut0A4 n6($1Gq5mfeX3x+6k,BX%E!]x?pqK=6qT/><̕ڗܐ8܁g g7V_!lL a\Ȅ4mptUܜ4SVsO -F½a\D~❳B\Ptxr[a\SGB>Ԗms-l{yO[/*NA"`*|. MalSV0SL*rܐR~u !3 (rTFֲJ9Ȅ[*GM< ?ChƜ/ÜK~߱oSqCAׁյ+V3\s:7m%PpZ2qam1Rs+>& n)WN8etRjJf08jީЙtf?t| Cw;;qxni<\BM.syeg^|P{}Yt`*'Wsk~-Y]0IR "y-F˓0k5X5܌TULT2J`a_LiE&t8uqkllDV,|!wӂðYw]=?06l%lM偀Ւm]ZG4$-ye~`P&L^aͭsLaLDNSŐ{43ky;aT29;@ ct<|!<͋&I'}%/)ǖUN (@Mf`u8B0x A M>dAу1a҄2T +L^J"+1d X'Nqs/2碖 }w\jS Ts7 aZ#HD`(9_J ]hM2L̇ v_}0}~n89X=m Ya0 B*tX ̡`8۬ *fȐQ݄k+ M<W. Wܞ&=sd+՟K^=ّ __d=m1SPvC+LV=9*-@Zڕ&vM h""P2 zj" &J;Vro:T|@7"\iHWgJ]c5Ԭ4$bk}P *H:yLaa.*7@ 2PʼnƉPfH=dfm9 Y,/_sr$/v"e;-š:y?[Bc9x=" - (h$:sUZ@h"A! TX U&%\ac4( &ptZM, 3g8Ѽ }nOXVoFB"n>i _i*'Yry g*wb(X]fc[ch)+YrZKM"yLe 3tSn>Ր-+2m1n;>qݗcq Wޕ&my(ݛTAeRM0P a\* 4USul9P`nʱ0Zo>vMq}=فØycyjf#6.y%JxZRiI2bBN  &1X =gErUt<@#i%O:/JA 9;tp4gi_E\g%G]>cR?-`@.ተ%CAjH4N@hrPs:AL`B k#PCfbVhJwK dU 6ljr-!f[W^74Cs8ra5f8]([o81;]>/+%Zt{Hh5KE6OB \ucZ\NN B0GÝ緃Xs]]mB" ussv.AX~7x/ }:M!J m؁jY|ҫK f1 2eh=7LEjL+p0d!%^:R2:Uxan:;;Z3 Izy=̗H;XǕݩG,yj '1dД!aFT7+U33N3Q2.{QGou<Phn w,9Cr C@,VqecT|W+ţwc?cł 1BFy*i&T4`` a!"vY=RkU EW j1)lQ[hC{ׁv\vF&慮-Vq9e  Qm㧲 uYͼ]i q `܅5,Y[U%|?nt\1Fo8_1> h_;o {'.?#<ue;rI/]EE.U5Zى2ar#Ȝr*$35[h*vd4T@F a\S{nk^`zrXn gz;FnI(S3Se 9`5U`t7RPdвrفg N#H \j9doe;¡Zâ.rr^-1E*gWlU@8vkv Nqp*''O}b_m7EHVMBYk9f !4gGr<ϐ`,el s)m#Ej!eH`pdtbh-W[:𺞬ăt|-ܐ6^fE.Ïb- -@*lY=N9~ u=6,d\(f0#iF4Wp 4z)+X >Ǖ|\|e;w)`0wYg P~?>76.OJ\O +@~ʰw7w~+!n$!."'P TM^= 9tg Тq3<Iπ۾- W d 3l Sf :smt?dLS a.T=ڴ+2\&Rs -r5w呅,@hd) !,^Zs#;x|ˁ~?v k{Š7| |.tmC <-Ái? W|z LS$#HT4U`nP% p!bdp3&pyTtC~3@<;Uk]x]Ay[jk?h q",pr#hL.tk={3Y- fA޶xH1I Ech™vPL[ ǿu'21oq`<~/^^~[;޹]{L0n[WӾӻVkџa ѡ9t+59Tb+Km[ ib,!LŰ;ͷ8EkȰrc\[cvuu=Y5ha1B;Z5^J`$=[҃lr3@&ܽoyYk_GE]f( c! P r쮿$d9]Ahs5\$q2v@\\憐:~"6iصi ǪYT'X`g/]%e 239f"Lڙr00,ǔl,VgE nkↇ7%Kj{&pvS:`]Ӥ_=Vu=9I$rDXL VrJDҦ3ԫZښ g _W^i@_TiUaaKP.4ɲ<$f5!%hYR h#h;rtcFh,( Ε9GSwN9>O?5xCǜ"X4+> W8E+{p&basڹ܅7CV_ q}, r+Xd5'\V I,s0gCdHn2: Yް0z=8mV{ܹ3|٪.F ͡MPrVmp|CfSǑ a M&a58.5Y$O?tnVǮ{ V7I0ޥ`W+Splv4{ÂF< ;|+ߣlI@0gfb;|m1 j:l?J*5p wuu9avK-tz3̀k7í]!fsdTpbYa@a9;ZTnaFi䄕Wx}nV8?B eqi<ė[ӟ\7u S}=G//$Xa6X 8d\V\BTT vڈZlOjzzM<:?M]wX#UsXslh7VӶz,T#D@5cVYS aԪ6ߍ/?o>΁k?yeBp]_ <`y jL?^;vlp_0C|` Cdr) L.<(MYdY2Px%0NoC}F^\]@oy;x QDk`XF_D*~eKλ|gW9C-޲=a\s~'gkUCZ@DN4| ;+] V.ք®GSѭ.nx>?nm9?sr" H'(VnW:3%r'__Aw#~ne#\_ lX UiJKU3;/}f;Qrbփ B#D ehH޵*zY]O ON\Og^>ؠt}Ґ. mKnnDd%X ,Ѧ ˡ.%q^^^)y xOkM@^EnV[_6<L™KWtt5A* %NN:"Q 35邽?`Omv'?۴╩d;¡F48weJylU973sz- #~ӛ޿b;%itF\y.6Gք% M c\ra*rA8?Ʌ[3on><J:\B/|7UdffuL%̏Cرx sQ3yups"Gswǎ||?WIMՍ椔vm! oօ9)˸w;l)&&~/9` փ;|5@Oe}àeKdrQ|' L@d2*Z)aBuOUW{7ǀq͏Q/ y/: %Xq 9wYN~u.Vq;&m7\ف:6VՔ-sW,  oW:-@BxejE`:Ü6/')2~ 7wa='”c34.NzX+Dtn-@NgX۩s/%_QaYn>-޺:𺞥{d ۤTX\F.“\!JP&I|V : p|}%1$1mm7`Yc߀cn\۵aEW{eA`?7-E)U "j .b3w178NNg0AMR󨹺Z{jL%2wgz ] ÜIXVj"Lj01L|aܻ"oyxK7E*.0'kg } 7rA2_[NZ \-dAԜ7&hg^kWI"fEmj yC=MQJ˱Dv|]7tu=V?jw\2څeS2ל|^%Ɖ1mJ3\>?Жv#6]!o_7Oqx;] s.Ճ -f5U&gjE.~fUWwx]:UklEZ!Y@Y3[!^ܫb_m .a?ܙkw;oqw8#NUWFC7C.8c9@B[)@(=]:0z6z\MF gdlNeUCTv !I+ Q܊;W7[3nSk_1al5 ^?w N^]1jas9 Jޑ|.'4@16u-֖0阳[m]^3^;LoCO8@݈@g͂MSHK7n1sÔLysK~Z#.G8/WC,#O/^sfW&b斄z% o 8MmήTҪQ)\C2 Ws7T1Gru vuuu=O 0L* fo{ܿ,yqRBmmGɢFeICB2esY2@tyϧ pN7ad^WztZmkh5U*Gš6 &2bimD-Oqd_)d < f;evO#w7`` -["~A,f@VlEȧ+b90 P"Z;G7-WN<P~x]]n04x'i+OiȱJFT%SU\ha}a4 ڛ5@|`/=~k\@8ق*dK-"Ƿt{Py՛ԸڼRrQOnu*HA Qgr?4٠(4D*Sh"0v#>DeJdUW^½ ^|/5)&͡R-.Y- (PUnfQTI~yph jS+dA|B@cl.[X6ZNuC=z\lv!̩A-tzNJUWu @߀M '|/UHhd9*rZ6F ,KڂJAտSwՁrkJm7G750rˣ2ҳBOPs˄ܢ@DϊM8V5p˱ng(=7hMGBK7xZ~-6Hf rm!uЀAmJl 2$(Y G_4 `dф  3+r]H/Aדyytɽ\R2ě KҤz+~h1#3DENW0*kl~6ck;elǏMv<s|{=|1Ţ| >rx휭myg}?^ DD*T1b~ڜ۰uԺA㹺z:?=B?SهeeݠiF<ò0W4YQQaE5*FDs|ϟ7poAqocu{xv=H.o gO;G Hޭ #\IQZ."h1cלmȢ!%t˻:n0J2RƤ0 IP-dž-ÙW\v՘S!̽fvO"! U:CmwT0*Dd .Ù~)sı̑6:Fi.Z::n. W!9UmΙ|{RlgCuU2$fcjm `ĝo*uxǝpf]8 Ao <gc6-oE+uv;tQ!@o^YeDLZQAF +Vq@ ')ڼ-Z8ZH](Cx]?hqxe T,J dcc6jd+Ra4yT]C5b ڄ[aeN%v iӋǛf%ep|Bhaxz({ÑmUistz'psݽprϛ]GΘ m&Į_/DsjB*h(^٭%^¾ۅ5c ].7[86*9𫸏ϕ6HHs<K Uborv5ߖ!mnvpg'}㫊t!K(2$&Q-*qP'Z LVAZsw}܍gP=?e'b[ ƂV@ՀUT.ݪք]@kPQKD|`i$"7/v!Af0e=Լ-a.b!xzzǜ߱7 x,svXŜsvj*O0EU"Fʨ`5 j[`FUHSvĜK[xsov{t4]x]7{t+\CwyѩDE;:Eo^kQ rs=_<=w<|yٍ Z9N/v \r{ZoN^/A/aM"BTlEفBw歒eĈ60co)wSW. g0$'tu'HoGFÚ'-D@ٖ!梕9d- )ΫO@kel UNdQWo{۷~yʬ=wK@n {.{Btw}_,n |عrY쯛V={X q}k"hUPEP0PX(e{^xBtwѼ9?V'x̡ʑ%Üs8sçMvu]Q5&>*PФh0^ V.0-gǐdrW` Zc*y%pF@VV`UDi}a|q3cF?yDAIoEk[wݍ=g9ڛs+~#añۆp&Hρo\-6PeFr]28L;'["P+ȨaYù*! *LY.ձLT몒6ZV1GeRk p"A_Wwx]]upey o̮N!')*OA!2<¼+&QVD֩}ղOOfs2UWEP1/nݵ*,+dm!ˮzLn\8}o>x\^;囿 Յc;Ȭuq{|ۮ9c'v_\=*"*BjY U2&XzIa`S*f#zek%ɲ|"sw1x~Y&Dف^WsНGpF/a\ݹXCQr(*(&m]aOΩD`nBL .RP0s$Z  $/Ow˸U?kv]qy3 Msx\ 7;u{>7'vc_)XgP`[Wo;˺~0ƄoUWoc{}̅I`EիIP5@<e;!v; `Np5TLejnf B xG9ƒ:Թ)U2TW϶M筅mh޸ڠ ™c=qW^W7X jAw@'2ߟu~^cA D@88D *Ҫ!C.f&Zd5HPj6v~*(/_/߼|ySyyar+0vnͱuu`cϢ-4oa8W_[+E|1lNNT\u AE7x;a/TU#Bjl}T3U RBj/?seX  0jBQç6J0۶)$.چ3x"CY;+[q&*4g\ƥmƢ&Ɠ1|*JNҪ̦sU4YŪ:Â0X bg2+bLqj.Jiuo[X sZ(4s O~o~-S~OL+3|woA(om/SQTn[o|MD jz*J5lb5X5UQSo$0&UYyRQ&RdDuƤ,ToݱmQ{~ׯwlXuzV꺪wwĝk.o[9b5Q.TM(|vy@Vn*0:XQ“[MFX +XyF.&[|wNxh@fY]6xٶZ3Ɯ^ip9 aMۺ][ߏ*()*=?.o)0ZXMn9bU1 N#U!jV䓨GH1*Zj˞r+jFpٖ3(B6>]nfw7XL^:zQb\tv8-vzT&ҘV7 e, `iXYp!V.MPp(%I⡊0Vu%cF(Ɲ?z{|_<_I=,g֯nZO/ru-\sy߿νHu hX"RB-0) pLP"Ñm- "T5y١P JZ V3!pk"L*j- N@j Dd~2ԑs4qHq DLᐭbD"gH疛@= ):>{īofǛvDr>;>:k[%M.X]6kW 7(VVi`@D# @Vk^^YĜJ$Yn sH"ߺo=_|//l>EBQmv*;+_~޷Gz"J4YP3!*.*#P$1B"`hvNBUV"gB juROlqBHwfJViZTPXpcY bY}v:̪Fl.oLV=& JbB8jC+ ކ!$dP8\ B"Ճ<.j 9HDZTb,bCIdI.V2=ŀ`UTɑ.E"pJ42ä" Fn -O߻= "-̦;uB׀jTtL0 @`̈! 5S.OBBhD I!T >) Ϝ<"X!8 W5@xª,OUפ5b2 n}! Xb۹UnJpZ tؾ߹PQc׸ e>vuuuǷw18XXS^BUA/5\d`YK''\CnNZHclV d -aJb dZ0܀P”E. C z.rBF @mb6].#ș% ?VTXX Z>$õRV:4Yۉ+e $ZMw"*FY@ULז.MUd!*FT.0Cqեdl*QLӺ"Fj&nێ$Ir3CwLK,A肼 %<^;t%B$C*3~]GfdV֩zvcbYQy77sW".ۉܨ"|T-.IRx˝=T\\}ٵd)iK+bX ZTP($UjSTYXTP8,.1⧎*thO&IU)^pm(*BU^jNQ-(]A5,dUA/OAf[r9.qc.sFQG!Hw {~H6S}|'(&]{tm%zw&e8ŵQ!eDJk7 nlkNeR5.>vL-Hwۏ;`{e 3$7<B~yeیDSZ >N``)"V!0AA*$8\JRzcl*QbBRBEXJSgH>E͇.Dva K'iݸF/%)f"VidL%dR'{Ew?]ԄB7A]AI1ʤt5 KwLP&GtTzC5QAL<&W.0r15tNqFwCG&\KRxG=.R#D//>DG |ݎq U?F׺ EISS=;b6r+ h``j@kEYlG u2it(!(Hz+X [HSE EAR]r&d T"E7~&^hqyqb.q*Qb?qFEWT~ ]t%dusbtq7.Qœ Ngi"iS1ٮL`0 MC?!ZsC?9`~+_vhr_+]KNQ - G_MGpc ^W[(!؎q/fGh[eR [4z1"&nP+ EbiEO[fKP`H~{J@(0ѨI1Єq7 Ȍ- .1RP%:28Kp*qţpOaoY7z qTy?~FX4smPV̪S]Lܕƞ҄PqkC {ǥ˶wa &M}1H(vݚ)bfE)sf ~CvR  і)oKx2;0S]e<~ %˫(o +FTnKS(f6ZQu*hJT"n(/8@`̹VChBqiD&4PЅP..}@A¤j)RF ec>[oJS޷ܢHIܲI.SQO81P bj Z2?JlN"rx+41uNݪ67\aKlFD 6PƉ4:5:-d*[mCvv &;_W꥟e6%WKzo_ÿ.N2?W靯EH@D Bt2PX".ۢ8 Zs j gԵ ɢPJqV.M`6\cܫ S6ĸDiR(Hq9(@\9 :"_ /ITּ3} n&̥M9฾ԫ3Ś)"g؀> 0آ"fZ&-:Lax)P7xQWNW2!Z#Q S ҫ@RVV5F Qc(ҴDWd8SewDlEhјҏ/ F MҢS%fJ6LT=Qaʰ tWq4aD PŶc7V<μk]zlQz3KOubաNݪa3D Sj4\$7=M\OIw)^eǧo_՗n/6'>065:XcK!XgU \Jmڌ*& дVX (Zh[T 4UX-9BY ]vĤHTBi;\F +B?jg"1lЏ+X汭 6+->Eu᠒$\ I  $T'L *iъO>4D7N&J֓b] ,~ .:>-橽5lzz} ~s9H:b6 %/i` BO:h"hXUB(N@(^R@BS TCL(92:3ؾ%f贗:!P'X!ݟpSGBbQOoXӛ?;'/NيM%4b=ѩ8}*j>֦.TO6Z6lm+|ٺ.M0T59Q֫ʹ} >I /Rw__GmޑE\"shlJ1P9.HER-soTR x1g 'T!dE(QuTzq Bjj"RJDoQh76.KiOEBTӅ,ss<l|}ǵPG1}ЌbVU8؞Sc>kvpF7Vx]1uW~L]we'yRvr{RrCdB}ȉ@p^(\׷gzR)F Ju]MmP*VUZUW,J/iEY"մ@$KP DD%`707) /*ֆ=y@M4F ^`!:!4%[ӸbBYҔpQZ ic'-cw]hb-dc<ӹCkiꘪT|5۶;z8NYljׯ޽"ێ zh{f /y$^wV/_| Qkr!m 4F [zb.(0P8lC+^hKpUC^z?x~)NŎ*乘C%@Ve>4}K20P+hBTXN$ kr>iqP))Uð4,>1mY8V\V\QZu-ƍ\9qu1s(a-;<@vLx ?!J~R$Ios. '؜dm MQ :U~(2ªPHo P)"*j`E=F *wX)0Ho4HzI"Il;J}4C-Jh;6/|Bl:D9rNo9 !'2Jr MpLevM f"dN}v׿8u}-=dTX̄d;S ]UHyz(qrnUlWܞ`7 `FW Y:8GU|+f K3VUTNxoo0NJ.Vkz1퀗(T}7)B Ĕ,Iw%8 qԬXHw"5/$Dao&Iű]+)hqk+1դnOc mPij?e)H~ {='g vh&^j*I%&d''Swb eg}]N}])Pp؊L#PDaBn N%`@L$+qz(E /RI @YS:8b5>397|b+iyLJQXlK^ OIi?dpP.NnݥX+S >e͇HV!8KHR$ʁ_hYvu!’L%{˚d1˝o?SxM\_JLw.3aqCs(id qbyV^ʾ?&Я .Db̡_^zIrƘ>z*vNheWܕ>m.kąhu_z2@rb؄ͯJ+D_0U5eXoJD6 m%Z|--NcFl}SXS'eߐ:_בR˙ȲdOHtңBy{KBy*gWEl-6j5d}d 7 h :ub]9@E!.(Ihj'"\YH!xN+8 q[_>qYx'\'>fVw}ݯ)N*h]b9 Ezڳ~Ql*ݓj1-W!WW! !jiLF뎄:=Q+GӛRa w edK2}T-Jz?|IlN`q[^~,/]SLԲ~dhP0.ѻ(V O)=DM/7_|mӰ6_?u)Xy`6酻9Ez71UVT棇bV? H)Q&Q2zuP,dvunYOw}Is)(e>_?wb&-=lוR}{nޤǾ,~%$6B^\bu-؜+CP9p(+6 VcN4َѪ"Q844FI[QnV =x/sBw￴6KbN? P'‹HuhJQN!.>!'FR;~H|[YS e ,zczNR}yrQHH 긪C@6cmF0l{R=dvI /GߩOzo^/ե^+ryMviߟOzF .czݭ^| (1@K{ ZapfbMof-ؿkyQ6iJxzk wBi5o=lYFЇ{ L#"F îLy](߽V1݋0] /w.7%7Kovu/{vM,v紒Vv-;pܼ+KYhu+}ؿYVw=uErWKfvV׺fR|'IMh5妁wkͪ7ŵqnHNtpU޾7D9oYv)$޼ͷOIRv鮯-qm<|VHuʲ1n{ݽ_B";9*R;R~KaN}Hp gqPSbZ>ubV=副˰/aΉnf Imzݜq'ޡ rNv>積<)ڈ};ؗ1.{ g,yܯ {LYζ.EdW<*&C**7N~; 7tG/}sJFOt6:3w7hH%!Ffwkۧ9ͥ>s޿]w,[v'xRv)/ٴ}觮u',9EzJp}p%ƭaگ+FŸ+@z +Ӯ2li4pTj+5vW4eN>"x8y@ N~+;Tm8rh.6ĸDCz-vDZ1n1n?XȮ؜"mBv8/g]d˄J%w\|%2)p^ӛ9Uܜ]uɭٯi/f}OGio:tw #eyrKsخ?S/n`bNuD֊J<CqF}}KEew20;Uj/S{PPp}y6g{>͌=VPtK!mV\^;NYKkXcNpKݙqߩݯbהf]]57̲E'dGg] /[z}R;%/znnsXPRz'ØN>[f[ l,y}n,xCtz>ߞg~xw/}y˸F<~G`~Rx)$xrNgqŷ|`}~3OHmQ<OnWn|rƣܧ:_JnW]7_g@a=i.٥RxI }|/vJ|?|~(9az[>﮸H>Lpp}WHpR4 ݭecE.MKg놅 wn~ kvx܎).^ /I>0һK|?|~ ٭d䵿~u<OXhb߱hgێg-0{g< <:4'/c̲;%?At&^ /Iһ+Jzz{ݻr[w+ULv;RHlmIy$ rPv=+^ /I}cw˯Z)f:|L15&es/1eg7%Y\ۥ!$t"?\.K阥0k?M=Tj`zRx)$\7mI[6JyLyHt˯7'$>Q|G@tC }~Ǔ]v'] /CzrqAmٱRNJS}z&ӏ浥N%SIT;O*o߾y?C#dX}rѥRxSH}j=E|wz)8jM'txJn˴x*YtW7ŗ\~ oIxx>ٽ|G_=D.K!tO<&"@ U|qz~oIKͲ\ ;k|_o ^?k&yO(D'y)$1'\{,,o[w !%Z;%6OIO5_<5Y 3*Rx?K=c_+)C_-N?,;Zyo~o>4(KRx)%?䓼ί??}sfѝ}9䓾c"cD[ /I%?Q=\??ǽC)v,RxI /Px?|'?2Շp#?>(¯ >WyV' [>5#:::>rQ9GPO5~O4;::>"~TxB}yOG8= uuuuu}Py> 8)'1=)O > Q8>={i,[>+Gxq{Ũ_::~{8p}X^י~K3pt~|~y0awWw]x={ PӇ zuuuuU=s>J$';zxx]? ؃k|';IK?>L~.i•u`Azx/󮏎v?$?qx>10-Oaɱ}=EW|>q/<̞%綞TOܣ~~\ǁ G^+`k@ ڮ{[05A4n:nNƓ*<)ujz]x]`4 ZOzQ|w$ \wGn:viw\fGAE+?HVY*]L*%z O8' h;v a^ROg'9v(wՖ={q]ܞuuuuȀi`,=4ދcq㑯yt]A:~iT gqϻɵgj |l/✫q.ϛ } | ܅~Tqׁu9W}#{kK@aw|{_c>6_~I= |?pO{ڕFruuu}YiT[㔬]~ K]0|wzmU0l[}x]xx9vrsW1±sۯjԫG)= )q;|ga^^^W޳އf,>oSݹp 'yǫw: cPx|Iws6𞅻6~f; c۹8Qh~τ8au4q|co!Ϸ:w;xp?}{Bjeua(W7߮q:;£nZs+œGߟhdcaGÎZ4mBLXs,?a^C\/m%Ltc.o 7Y(On(n3<|֧N}s4v ۆK'Q`h𻤢LJ6"j\u5sV%.;)..A0๻o@8CotF:xK5e^W^_}n1 a߀=j9h0+c{0\% ;p{0 +ꊂ@ y)F|@*QA*@9T < c!%fW7x p2Dž6 $o>NgGw~ <;WQ;\B; ingFsP@!΂@dsN00%9\6|h/Y0pd%-i8<¤I<i˜3NqK mK8'z3}X_^W^xKvKw7nꖰ{z;-ag ;=.tF%M#XA24.Ý3A3Ը]"LweY|B4ۀ5.aaJ$nC K.< cf<ЛaBoC>n x]x]x ;!|ή"ZvӪSg5F|S.]n([9NQ.\[BoqlOp՜.gr)%9l_/@ S>_Z&KZU#7o¨x֜>n oX.:>^4>0ߪo{2ؽR?m8,A˰[<`r: he&Y✿ 6;Al P~nV)'+x O~E$`rr&@R ^խˬ+2jy0t TȓCھߋ1rJM!w A9`kv+x3MBe|Ǡ7qo_}W\OY?60?YCve;nc 5mъ*,5,ruG[8G@[83ƣ^zC;G>%r,]vmQ u;H9$Kupb4'Vj~/`h-Y0@a Bb1L9ae Fl7r{0$9q y3gz$-侎"w2BPzal{\ma޿y-3aʪ:0겁o㫡혭 40,[3sе:4hvdma KRi&|^PḔӳ2 %TW4UZnJӚlZ'`rgh!2)@)dTΊm` S\`Jsz+lO]xাO>w :^՗¬C뙅.G`gΠ8펿xz䮂g9<`&lÙ1S 2ܶ 4,A,s0.p؂n˔.LY-q*ȸ y lwbİl0߂`DsxjߗȔl 9((b0%i`tS0XaHC029KɆZ7aS>Mn0bˆ[Nq .^CanᶾO/]k5P^#}UJ=+W9'`'w6Co(]Ux6;Ӯ6*6yFh ߆23V>Cp]`DY 48|o`iEܲz35ظ}N:[mae? n"`Σ-c5!lo4X{=dDhm)PdOOAaSa3i*1i Y8xnr\(̕D,TC ֹƉ.pԜ]ހ k*^xuQe} _{~ v"v].i'*nlڜϝAwvCxjlB6&*s ivѽl!MX^nbkίߵkymimn/i\ea5%JChbBZTq2v dbdLYut1d)iS99 #0fhcQ@d zɍ @؄1!xbHِ+$u>Uob\h*5Opfmq۸ 9C`^;z u:ѕ;eB;vx>pc|[m{mxaԜVihsXqd}w; N6 FV'wSP6ryż:?Ȃ^v3[wUZKFfskr @⪼A \BPN]0D }`!UKIK LDrAO“j~GŚ6F0ÐL 42v>$,Ɖn` >M yqS=M<"x`73gݾ~ xV.΀heY9.Σp}sv̇ba,FyXtm|t+h)KW-X( f0f56Z@jqf`6Dօq bRau^ b P&cC ҂@(T+O݂"ђHXtr3r%iH)F4 N8ZkCLt6l,p ۼ{w"Kxokޗ|_V^Ө~T Gkǁ7|eWr~=l.\89ަܬ`Cq &X)gf91a1ԂOYz+XQ&7U؅F`4ap,5,Cf%,CfAV2S{n1Ŗ9e36W7SU,5`TWܭiR;$s>ΰs$’Ȍְ>L:v[8$7C:6yl82"2 V`ܛ鈼-v}<0"w]wm> z=^WQ?o>ϼ[+1a9mNulɮBsgr[bAX0, )3*OͽaRB Bm3)kLـ:yRjALVfsת6 -(HahD@%0PCB70[-5rv[L5ZtXrH:A iLyGRP8E¬'1wSDd gxmj- JS{\d!p_Ún省}?zLgwz]x]Wq|ysÛ57ڬl]'e4BAQ&++x1Y!Od Nts97ynofcT2\5v6x9զm՝k {0j*0,鍃ն +,8I \.pib=A %42hQOj'dU'dڐNVPmQdm_v$u^5Y;L -r{fZiNry kRI2*A!j'3i@3AG! O(ծhb41\ 0k:$.t:OA3ω:61nr8!^ 8,7 @vuuu=v]ww^{`wν۵:g8>t+'`: NcIDU6i2pp"/k(8ʑ&&7(\C`3 4=94 f%Ak scY`+J!k:f gNmDN$hT2L&G:<:Y T,)03%fL2IDV3i0ȨK9prT, A&5c)XcS(4Hc$& h!m`(P^T# S"L09 XD`(, SȀUzL5Ob@@ ,[捶L'X ZhSk5;s=¼[;IzG hb1iQ^x>~uSKon=o<`rnp~ X8d eԊL69 &p,5Iȓ{T8ӜL{Yδڮz qbCm&g3 tf ܶ'WNxBm﮻۬nhnd>X7߬k.E^m=nGH$H2ʄeX+-!LHX& DD26U%HP/2*"LC 6奠.Nʀ8K:{+,CЄa:ŅVބ/-/lW]y>fzDw^I|pLɟo >d|,~eLC13b5}_s#Lr@j.0'8eez,ݜif1YYnRV}E` _/~ +.v_Vg`20 FS S֫7iOA+`@.xmK;\fڮr Isl 6-h9@հ&NY99?gyoBD-Bs@q]wNp h{E%/~];{v[&ocӘE+ JJKa1J.d EՕ&:Aŕ4#ڸ5 #N378)X8D-oVn&ZOv >nb%Fc{fW^9zDᄚ;>3߻y_wqZ!n꺟Nm>YUl:Qݗ9Ҵs!yЌ鵟It sRdq.!ڐڅ@/}o߹(?st@pg[};}'~[>tϖ/oح#JVn {W<? ;جTo+u=O9S<eK]:<2ۜM962R%" SunnΤLՁȺW|c?7^Q ) c^.^bڜs"<޶o $4m12^"2$ g L'D('3h_P 9$T zPNR4տ2B!$E8C۝W0aAF ^+oAףt|~-`LJ7p>nͪNQi ӈy(4=24g`jl720^V479< um`\ s{y9e5ߩ7L2|tULrKpc̊1kihuhW+prkl "V0`A|>\V +B]u}™W^-g7[k;H +UmGxx~U-Vq;N L:)A^LBSO|ZəCV (,܂^]F el7D@OY8li H.~ cuwIu(4mn5GF))t\Nd@n_zAPLBmۂ oaz /?.LlVΪy)Ȑ: 43uQa% AڎBȭ@ .^nuCl4#[P Yv1emo.A| fXzi VNb$(2d9 L8C@\{Cr%D/愹L2l2YdN-$qy!|;pc}1lj3w~ϕ$:4lbYCd # 9D!2{:ɐ A}A:44̔9}'fH%'Z{:Bṝ`9b[9큭;븼8ya53bwl}6lLO`Pp15*uԗ`e%z԰'4j.ȁ64Aw.xeݽC/}?)8<ޱc76K|hE2؋c~'wku3N(LC:#I:[H: (6u 4HuGgj^/ p!bPԅ XB%NhJQ&ВJ4'n1ZN@6!2Z‘p&:ܺ:J }xZ Wۅ2V'8;;Vl P"]*PsvdCs 29Y@I$cTm,-@0gm0'UXN xS7?9_gv0caw= vΩO0g-PIK /C5BHP!9Ȕ MzA`T*1&J0P2#e,y3ЗJ@q0qo6{rg{y SN:Uɺ(bk B9laC]` (&jN`at!81bљtmN@ww2Vd1Oװ2':lr8VN8,`.clGY@RsS:r0CfsffrGVhit?{{ҧ+`%Ύ -\l?#m¨vrPڲmscYZ^Wq-۱aXۥɳNO40MO•eS@] kJmc``A+,5LYw-Jef֖Śz?>u3]3P[@WΛD*2gwx+ Y^y{ocT4BiHS-JH z-nC[3 QwepRYY܌,ɤҦ>LA7!tjvӴۢٽ OtՁŧ g=; , ahfuG[mPhm7I1Md3vq2AVgdA9͒^:A|^4q)Oa|Qv n+ lsR46oDgg³lJ-\m L pLfX-Z]&j*oAP7ԐP6%")nsG@:xn <莅8wOGq2bpuR{bn9HRJ"fiPm4%$jX!f,N&+"6zKή&Gdy ~p9-߱:vew7 oL:  m8LxZ )\)&aD=Q3G iKde1;ji=D3?U-[̽MWmvG^y75!Ձ1v||78afYn)31T'^jA d:|-DyZ944r& cĺX)AWo߄0{y++2sh_՘nv0z֬7nƩ(.) mdV畉HIz&j^em5I1.HX44D'3R!71;k!*76' u3k[mv-[Z]Cf"$e2g00+CI#ŬW5Y:1`i`''// |XU5`o|w" ps4 $3MsWN@ ϕ~ʭo2/aJS윃:f,[.i.xĉ4H r Vr ¬ ".ح# ^`;'n./C]tVSءlܬD]dfjahdĐ.WZij"6֊Aδ|'/~8ǰBEA{׿ׁ7;]UԲݧz"=7|>-勓/|v;oqLVR:L&CPHg5L$QM_LPֶG3Ih4 v~H,ƈ] =\=*tuu=Ùs2+1Y`WnfAkJ9 dja& eruI2uDC2.&@2Y$wn:GӀ/?p[,HFs/˿< `_^zl/Dov7߼_U"e4joAiD] QjӪ2 u\{D BNPvV!V@ .syl* %{R^^ #o$sъ DU lNıyॆ>2PC՚6ZLFK-e #fe颥ZRii!ug}S*͖-D;+/_c_!p1U/۟/?_]׳/;ߝ#էp:Ο߿xv_:oFeݜ@c,M" ˔1[FK[=MVI!,BVWRlcXLS Ԫ6'9k8bngrt z]]x]W; un?Ģ͠MWI-\X*feZK/844&2YtuLh2߶H#-iuK)"[~K?K/c wx??z헿XCw~}qu"@w.\ށnwo_<N2{(grrY`L0!v9;ZXQЛ?~W/n/k1tn adݶ>_SU7:ASng6K JaW r+lm쬮|:aeaa-ܒ׾8j.v}vy=> ]r:Cky=ԱRʔ.$EXh࠺Dizi:;8hy: a0[='/ҍ!QkBo;T~~||sMyCs}[-2j'Lael(RNQ4 F Hz)$9 RF&Hp9k|YrUk^sgzI*u>9RJ8 u9 Pm:jXm#X6oj;G# ^>uW>+K-[@-AWn c/`W~ynO+w vw?Y,[Rbk0&NYD:22 prԽu:ݿ6uE>o|Ǡ'5@ڇts65:\Z 0js|id1:B,2UQl*Is/'kb[~|kv}}f{ .);bkY/? s/*5_02e6LJdf4:y[pq)P0Qw{W|s%vp!丅\x9CՏ("dnUã؂a4^XZʫ#<4e((&&\ x~+KG(_otعfx/a?i ւ~ڂJ1@& .hP 0Ǵ=^poeA5htxuu}C} 4d_T[[.]_,-La k)KaD=I1kkSL@C+݌o!WX%[g 5?^n|Tή,-⧭KUseuU]sa|,*vK98o0'qqO|thsi8ش?bz9 W YDllM aHN.n󥲀!8+w=`6*} ? cBvo]6I (Y<{=OO݆Agq`ӻ Giyukîj- %۬,]Xv'‰@RL2i0yœt1̗;ɗA..Aqob\Ec{D(s No}snTlSV-K; ]ڷt+!C LCX}/.YF\ϠaQ<ۊMfqt۪ϫ3jIwt|×fժڏ ZsW"*ck"e:n(#PJ€s7~wx;z\:=;[Cm ˫8<,0gל氨\p lpsJi*aM2UM+`զ,SZt{|ٞ^`{Ǯq.ź|ÜՖE! b:F-B@8 9&g;°.xD鳻~=*h@:)ǫ/}xyfW/g8Fm JX̤r v߃ش e^o]3AՁœgC'skijrI g֣.[ aPÞa@`Z,ÖW󾃻*x{gf -Uo[୻ʽ6tܯ\e{\3pXGQQnX$"M9eDaע0zQ!.]0qMc$Cjyq]%l9;Nخ 'LҲjJ#0v΄)w^` 8N!. Gc:w]>~,_(HC J]H#Y4btN~@j+ȃe:-8F|r<?Ԋ+o=_Ak9Em 5g>m= `9?} Cs_h\os|E.6f9GpW𳸁W@><7z }r^`] a,I/y kr⥽IL=wmQ{V;}o7;s~&�si[B\:+p- 0?' evuuu}p]Bte4}.j07kṚ˃:(K % 'I' 56U(8R.EK*~_şu| ?{(y2EcU}xK' }bCB.%j& FuSPQ{*pQbVzۂN 4[}Zزo¹J'tB-ęk!5]< `Y [!pEʞ G,gƻ-E>O5j$s{i*<l9s>?Y>^Vzf'Q-~&@5@(, MT>zήه6/5_#.šUЖ/4@fEoOb|p3ԑ;qY,^Mlf5@pP.xvh A޻Ay\`L޻28%ftoq[|]x]O7_^zgqA z>qRQ[(s33J=xj@Q"dT{6\,08 0;r~X#a}ǖ?| o ԥϣV@m I`qr x~I, -L"ĉ]f<- |4a9p fuuuuEpG"Uᔩ^Iv}vˊ0JJA0Y*1#/=+*3u~no@:B-`eu 췰!$q?|ygo#– +:bB$0Zg,kߟHD93N$\ۋ]Nr~7/1u= ]W^׳)t]+(kxUn]Togʜ[v!P`4Mz;R Nx`薥,p#:ptaLoSXpۛwtA Ð&{ }.*aE~oFCf]ՄQPYVkz-n>gygq$WaWw󅗭JPY lS\偔qv@ }W[{e%wŹ}GaAʁ< 6nK!9GT5 rmk4|޻jMXNAP֐=Y/; *FJĩ4wK{5H9>qxyEs A}8pw wwx)#tpf,//B?)R9r?wuıg[-lC5rz ԡs?;ԠՁëXf*Fši*&a*M1SaX20v s:vg\9pzTðʜ;|>`.\pa6G}mst=m֏ l6ZxTaȑ v3& GBuuu}j4t> 2@ c$M%Ri֎"4i3(J\*Xo#GWrrc ˉ]5:m>Uj5]\/ Zu##,uA;yJ _rV8p\p#B]x]O=bP+>14֥† TgE],0y n..Nhk]a~&.Up^ >)8[޻{X67x enhzydy <>6nu ~qƇ~hW#ⴸkeu`++14QDJHb\ Ub esW9\v[^]= "b?.8ԁ;,`#yo~?^f>Cj8ܞplJZ'R-LXTrLBY! [^c}x8yTޮt]K߂9c5득=Z@oڟP ӾuBvoNk%d&DfɤLv=r:oL Sc l~ٞW?Q &<ĿG*f8܏+>"dˍ0gYl#՘˜^!} oʔ4%mMuA o4Bʿ 7d2V"]M@6Fx0Μ3n̛5JnTa7m/y3}L(x؃t|>1`( wVR0w_@΅* IKν+Lޞ4!Cl$E4NNorf;.X d WzAk% %T^5AO jgo|+mPȶnޜ(2s/_vS|+|ho;-|uno} AЇM<5%ค$Qd\:9}Oކ] Gf"I: sn1(e6 Q^Euu<f移P汓;=MB-pvjɠ TZ$Ji[׵\:=mms,M-ؾs;qnOX@*,lN_BQ~r}G27MJw{m h⚋S“Pa!ʈ \CZ f!o/*ya}xr{';~]&{BZQy]x]O Wnoq6E8s@ydED3(9|?S%?Pr DV ԞWfB- Tf6{Y|LH\cHɠu< i<F͕{E>˞إcWm),!(TK`sjuU' gCr]x]?. ˀ,Cssô+Pqd]zm :0,rvq`&:J ,%Jw br#*9!Υ;s1^\] uV V=o磮.+j߿ [Vh.Cb{[bw^1 Z0q+C**êC#P fD 0:}Lɷw\6*kϋ:9n0؁#|b=.yqƜ!Hm]{ ZTZfq!05< k=҂bsxY`z{'ol<2#S t˜e2/,×e/711> {&OfĔK+Y;S# e(S;l]Pl[@$B+Q{j¬n 1ꆄV9%V]q˶ȬKvG1uuu}axfwxq:x6#jA%GtUlf,CT ekx3j)Kַopoa.OG`+m$t>\Qbr2YǶWpÚ/oqt XIUk.EߝaF-A>w_IeVvFPP',ҜÜnA+\ C` gV-+3OOby)tnViC3 >9DZs)Z!tFJd̤ ( p[fDX.m*qoPȬv|<8-V-UP6n l;>,[ݯZy| {X"dE%f[\7wx;_UX H61(  [L0 U0P"s/7 Gӄ滺꺖<"w\Cٕ]{6Y [VGvC "\%-CR%r_Gv^.8wxBi,›h8.nڶ&n/Z}+.𭭳wo/n 0OEᶬʌE#b\2 {mR8M`|Dj1  _&ZEHkm 8R2CU`^K A{>۸ߚ\bR-G-NplXr՛z|wȐBTfmsRPxuf-kxӣٹoQuۓrvH\|L8(;{Hc|c,-ÒwtvQϹ8AeXs^jy#LGrgbcLb!8'.zXefBHLoK;/(펅yy G-laln6wЗ؀JxƷaP R_~'o揽^7Aݶrv2Qan~_`B uaE|K)ltձIRlr7>LIf`3.)avw׽}yG>lͮл{~ϖkuض088S9NřCFD:\2b2J,B ҶɶZ.az??OI_BǛ7Gh^fG@mUP 1l.z,`X}οw}|M~g,} e>/Pye 9co}+CuttI2ee^Iԙ>;0#UF%?z,@nݺ;6.l-3<Ux]]OupG\+ZW)֪ͱ, 8 Ⱥ1p$B02b@,B92,>mwo;g½7e XApjnnΏ\s1lB;ֿ״vzw?ӯP~՛V+Jzry` Y؃ӷϿs#uOfe >(KD(-H% ka2V 2Iۃ$BYXwͰ-bpU,aڳvt]?r}t[>޿>LUΏ.QN\&yze2_ta2FK^.> -]9@rpNLs 2'h/UD1a%nzۣ_7Ψ ֭Wś! K 2! H&4xvIya}qOgd")ro}=7^W~N0 Pʚ?Ͱ;+M@(@R' ؜Ld&̡CuD ,S in0 qQVHϟ+X ^ÍP8r<`)D5HCfc\CxfB2Pj.dp +6)31u%P-c`,bL7Odf%6n!C ҏrx{]^sy\A(hb +jj%g2[NO3Vz/(Gd[`Ƞ&tyltVD'%s)TmNR%Eso{f7vU:a=Lc<_!Cڽ5!9M;ղj !$(* Ru~u#n˔ B*4=eaj ,Dz cv")X2;N+JiZQ,JXT*mf}#qIs68w#՚ ]x]x#ryޅ6^剻VX'A#& FҧT> ū]"Z倃  B !Qm.kZ &P^ @B&e&,%YPh|0޵{-iH'd!< 0ɶCTݰ# ëԪn5 2O4$H"B UR 0ystP ER9C o; `iT5:yȉXM MByVKǸ'p~x]~kΏ\Z%)ИLX4 !aAuJt { 0l 2П9ґTJPF$% 3TjXa0@ X" ad C*TszHIL1;`dQ;g L!/}ŭɨ3OFoCmOhdG-TnXX#lг\\ NqlN!mFjdRmQh ɔ[K e aɐL9yYԢN )j=Z:nHiHY[WL)X{0 )BCstd=ŀcd n@P 4UH0e}@Pin.bC"s(3k0U;[k r$3 ѲMI( *M*$v=ţWOS 13ңkrTeU*TmUEHJQC DaI6E~pIlm/2Zc= <*^Vf.Y/x>'ckJw.K\!6b,(j7I^3 cIEr]ju(rb"f1$]fydxO6`Y1Dao"ipj.v(Pb&JS{ݾ؞vF$2X[^rr.kv1c8*-7[$]"z2"DJ5vHqЪ uh"PSg% Z$%yL$PHjJ%T] 6ŒUyPz/>AqHo= *~h^o;#TcYüBԑܱ5n>3_ybUØ*Rk={'*P&CLV6!-ZD7GvvyjnS;' r{99_tˈ_,_am; '#]DR^jTWh4^{U谋l@94EIsLEĭ*9A`p6$-zL`*EH{?o׷.*8/3 ՄwfdhNX6Q`B.@M׊TE ]5K2dRD-d7&qe1GT(.hOS!;mzJtG Rx#Mk>%;t_|8_vE;KAGt㥭`%HALsE-G% vW5Dm*^m5ETs]P4*@ڠҗ'fMz[L[J U6Hcxl[2h `E j@Q]Z5 hb&rAO@ 2]jLdqirS1QXM<7ܬN '5]#dwlZ- G%2|VB]pduQr[l(b< ; R2v}uO%K 5J#Ҋ1SSB0HRX 5$--BkSVLE`VZd'@rAՖld@MPxRh 4w֗'գƸ1SV`Z]B$4नG]HڶpH&Ulg E[+]ݘ,Rsbv'YY=4JLB[SFyɭo4"׮J_%*Uܓ)L H tsTqPDphKd5apUQ5$\fyhӾW] oNъ[ }m.gޢ1|E:sVM/=0ba%T15c6`)ȫb.|MeG͆2zт NM\"A÷ [{h%G(lڱݵ}Q pNMzy*ӭa{ζȻ*e|v'qTHSBMuwbK %6.VS2BU ^$I4&@Kn)GSi)L@.poV&DX)B)6{xէtt~;ܒ~"k>{ѾP׬-V&ՑD1UIl*͉k(nqkEcя'pŦ5ALp9B .-E CIQG6'f؃^m` *J}$OSmL1fRu%}{b"{1vBtj=.ә}F(<(hzޱBX ^U\ED7jDyM.5ؔF0T;q&HUf5v/o* RU...(Yڅ<^c|YڊUڜdX]$(~ [jPwE 5?o1/uI$Mbq[C1vqPb:Ԉ5vPsH&7!n_9[GxpwmP#OJ}>Lz޿[G~]tα=a'M EPmeKɥ[X@0tR̘L"TT ڼ̐Wj_TV69v1@Nʳk}lڜZO]h|%:>hlN_թ9sˎ)JBg^Bzh[Oe2;4\^њi\7}=o2c v'&bM%~> (C*Q:0T.Rgk]9R &^5jmo9&> hxHfIm&9u䂩 G'V@&sTXC<.>ѠbJ_[Lv|6,~_py1LOI|7.KkZ=K+n7X03d5&x8`*4ĖFT\ &_=V21mzE)K9WqXk{5O|̆~_uSxyȏ^x;o>=ѭwy1Gt]zYf=e`tzvM5G|nқ+!˯H]RRp]d]2&׿ĻaNi"8n @>\:Oׯ?6=(< |DwXnE{_.+b./fI]e֏7,i]d%hGzsee U.I y4]k;(Lvxl-x[}]>dž9޽~Pt#OpG2)< Px/)C)}達,e].9U&e+8疑ݜ)Ex܈M|u=J8+mt2Su\|}v:}3?]Ύ݋Ɏ#G.Fy-ۣ~*7b,\/#YzGt=y8G4gqb-.\ExvYDycf[ 9e9Gl]S$:}of\̛Qb?_܎CROGᑏPx/(﫟Hm)t=[8;}ivmULi䓰#eTx}Rl.f-ew}@.?Qݾ޽d~EvG(S/`rnJ+!st=[\{wo\2[i]0ǚ^I~Cd]z˨m-::2[޿]WwSt!fjA(< ;/t߷ Q>Zsu֚(d/#ӣC$|29*B7}먭͕pf-~ .͡uI@}hˮOׂ_>e۞u_GᑏTx߁~!twR=W-]E]7es}}v_RnJk6T!]e|_>nymu$#e4<~cr=^B|qKo_VK޽UtBI==(.?,J}{,-5fw}z󸱭]/0so߬Es;(^Bt&; #?R=h.#.}#d<$bde }:]+Er뷯$+/-gxƧs^?[cw-xiHKz%B}}X[G{K巌ϩd&̢Y1Rnks_~}G\ʯ m?"<C2[FnZ!< l!٭>%_ Qx=.R)>z?;={s@x(*o>= _eIm~I}- Ds#Q #G>>Dw.]Jo} y>O~|{7Z$3yvɝ^9|{UpKncdzD Px&Jyd~K="\;ܐ_o_Z>M.PyFsMrw.eX={G?׾Wrow?ksȪr'Gr_7IџG^Xx߅sۛRvo_o<엳sw7/VG}go3W!bB×_ȽB[xOu!F#MF eΓg}ǟ]=_wW=Q__~?˥(": Px{SsY9$qhҫ-^ǞE (/79\y@O؀0{^%!1anxݺuVޘk=c:u@7s$#ﮰgjJo᭒n:u@ 4z DWaPʛD{'~yLWmnxݺ}m=RMf p|Z;˹p$!otTKҘ|[[n~ҁ7!1ʜ 4ܱrL{]CcK2Dc:uueq[&_:) N sgvs N(kS37=&>2D*/ jց׭"(nCn\] sZ:x&,P-u-nxݺĶ ډ#`5?եơ6g&<==[^n/ ұ#I& tK>XmT2qyZ]n>'*<>mq[8uI./º[^n/uhSusx-/qUs`y |V`uح[A-bZ[nNUIV9u޲YA#\n:u7PB]}.yԷyݺuum۔)"ȍ<-p۽c7uuYoyu(]۱xߩ::/ O[wx%,۪u׭[V׌_OqmS`xޯE[uu6 U/dvB{Xޱxס'-4kz[^n+]Uk/؁=ǎ" yL-+#^&N:;3uuY/+%i5w$|c[Q9&pS_O[8oZOnց׭gdӈ%q9}=Zk)veo gɢ<} uu)c41tbuGSC Sz7Mn?wLց׭KbĄkTsK󦒄gq.a4)|ޞݺuugh\C0S޳i&! n:u{IwbOơXgmcyϣgWn~mڪ8.e\X1 [ngUy=[^n#Be ~~[8Nw9M; ց׭˨qvK zXھ^mKSG uց׭sbD-9KV =9z7u1&tց׭˪iK-knRbtH,^wnxݺ=gMPZfaJok-\}74*{kvsls漍ndnWNUA yĘ{1G:uxCnCqʳŅNhr Bi6mFiwv3Qlb{w gӭ[^n*&@MeY:[$؁9y)̋Rwgv3Uov%[WsE:҃ˎAC[^n? |Rru8yJ l\<`w:u,Wt~āeGw5>)\ʻuuhwQ.gLJ8XgA8:нht׭[ϻ«Wmun״ {%]u'Q|tRˋ *b)n3+_|n:u4W猇Y4 pfumm OQy=ϳց׭[ga1"!ѯ ]5).^)&Wm oL?dnݺݤD뺦;qAkzu7`%l< 2[OO}@͕ oyj:e)Jyn]uɶZ 뫮*>5PM*)(>WzXdZb;2hef|:vOyg} ݺu׭ۧd^|ee:fnr فyP^n/T7~aV]o/͕C͎m9|>o/]]]>8mhu1ׁ[n>/TI8s9!MBbـZwsebKd,5w>'d'=y:uu٪4 hy6d{v";;[g\f>O{fҭ[ϡyDݓw5pKWI܉>5G`(-6w; >3ϗu*6wi܅Ty=ily9Woڻi=g3wT֩#|+n/,nݞ3n82X|y+3BOi6jAm;t'x:؈zi?4 6tN7M)?Vbq,~wj)źu{t]f*">,t cs.z]mCM̏O}ujn ܛ٭[ω›02LHq^-a67.AE/]M3`Nq[=+^nЭ[ϭ»rڲ-UײV,y6.,._cV>[r??,9+Xwց׭KlT,MUE&o^>0sYnRu29hS~w~Din*6Ϗt`\W~^nݞʫIV0˲l|s<Ӷ-gۀ.iĞ"gLl9vlu [xԃ͸a2՛bpx_+E5vus4MXygJ,9K/L_sT:u^[^nWՕ76&MLYN3:h+vXL'-́xNrhߛnsѭ[^nLW25?+8ЯS=8m@#Gwwgn^k&6M b-5W4]}^p >Ϫ֮ ,2HAvց׭ۧ AS$:)Yj?6ϚR[iSTv5k_Nir^)VpCqK n[`V \0d~h6s1|yh:(9dy e})iAu zJu{ɀ- ؓ` IMqjXܲ˔ J'677o=6Ys]n^"cYWI!'k )"[;啘۬|ra?sNocnyS\N>u`@[>~)@: *:nPQ|]u O{M24xityNyN=^n;=yx||s^zNu_^k,u[KQe|N3B:uxn5 &-?@/J:؁׭3ݩ6z}@|%z4wkTRr^>`^vUL|3NvOfOƉ 0N}ׯx:^2v>vkשOE==t؁׭Kx 7#<SowZkk Ocnׁ׭3rhbyv@O][阺`7_ޱs0uu;zn/Nqa7n 7QqN)ŝ7;x-_*2l;0kqz˸F/֭OUo8B{h?;pQ?z;A{_nr.i 4;X m z76QMOuu{$ ]gר%X N79P]s%\ƽJPiRa4;CQz:}A,nஃp~ֱ J}[ z,0a|j> aBO,:R`:}nmUMNPVpuk7X6M`otOل̛@Y2ϦC.j1Ao&DhZW^Mۨn:T |ځ&}ܤ]Ǚ2,]v gGy.%Amvp,nƖN1!19>Sy; j`$*8z-n0ցso[^;[,!e'w;Tw2I7uK>AkWZ1i'¶j\Ҵ 4 @AjBRAOÆ(A֭ SNPxTCgaH.ׁl-.@ۏ:刃pwwN7o<~Wq D`í90 F! TsFi0="~>|/\e'KYx,{n[7wm{|o7 yXWa|L]ycAb׃ kWŻ9WiK=n*/4=Wh\"Y"KR'B@ `*0:tv\oۭnxx/ x vi(`di R6k'+pvp܁^8z.] _;Jp7=n Ty !2* yƏ@:4|!brNϳMaցׁښ~؁jݕ~> 67wC`RtקvyE]ɽF3M~q啱fB Yi+ABJTAPE& qB#aWM6À =<]y:ցw"no㡀^w`kʍv305aޏkX1ݎERcmbs[0ܢCT{ڹ.SBɦ`ů [҅K1>Y,FB Zz0ddu(=yb T Z`6Z0D:4ǸeG! n2ؓzŽՇڬ >ϯ{E=::0'~^ƺuubjۿ~ݷ*އ=n^ٹ5,Vn]}fzff.la7aA0ej:oq>3)3(N!&ˤM" 8uX1)'hnZ('K%LڿKȀSTt.K/x<'32G8,3,iƚX^9j*\yU^`p1b͚QWՈ D+Q|2 iM"|R_k|RÄ0{o2@zu}ywlz:=5쮳7?{a.&xn tsL=q N8̨ Q̴]8\&zdv +ZvW! HihEk^-e\)yӵ xAY+r#՜,J'5#Vl:aoOhuȌi rmjkyrn= #H/,T$j-+LNG $,o_{Ar^"Y ~oC[^?gg'W}x8K/R]gC{+G 7X`u\;Q[j*[ È^Ί'*S [^Ie]Of\eb"`65qv^ں8w3 0A ɵ` 1(2|aF "$(z4 6*EX )? }Q- {1čhF\L+܊Vq.QVAUhSh+=_q|˺f*C[^gRv Koۻdtg.34/`gMeٗWW6I ]O74h,Cਃj:3fTL̤ӱo% 5l-3V,2#482k3blpu)Rsގ`չ~̍i=/='6d\ _'x@6uk|0:uu{!{wnoO*U&ؕvy~%ixymNl(zf2Y8Zgf&Pr0b M.CLQJd^4Tl撼Y$f?r1Mn-͸'0eV\-)1R+2׮FO𖸒fB15v ;wYDTE`lY "3P$Aa\4H>Q̻y TýQ`Am8t b&kZ!Ϊ.ƻ0 }bwlSG|6w$6_~̻?֯+֡׭ E<ޣm0{ Ĕyn| }`Vupa^e CuCFYNɕvJ>A[1dWy=%K H6w$ h$>Ӑr: ?n > >*_;8:~w vuL{3_)77W|rgZ 8dY<u7FMYƚM pȶb=Y*f)]} !d;OqE(p,$2`QA&k ,0R2ẗ́!q;W5TF`El܉eu~8}>9~)<'̘-P*D/ CnYf0Y*2fuÊPWt 65i,@U9½Qee(`>0:PZYW֨串zɵQGp&DK1ހtW>zXځۭ֭+"_Vjp+>~(31*.ͩEsg>e /W.%&ɪ Y}Hy `uvJ$xC@Xi"]ϐ>AHɬ# F 0XEY7$}ϟ}cîi50B8+ɰw=4ϖi cQh*O> {fWb F)o5َ0BXyVХT$\Lq@ՠoh͂*xZ[C6qoFl!'?8/ :6_ A37]N_rybG;/ 8no?׽~*Gf8ݢͳaq7:d 碛8h׆nhiRm=}%;#b||_|~'YsG B(+ BVk"Snc)*Ff}J* FRQUx`PuC*Pl` :Ҥ먡AC^`UU\EkY< w1*X?{zE@ďWdA|ODhP ,/ ?ŗa^|g^ϟsi~uv@`y*9GVUfNNSYW+ %cve +G\3 2C JsܥAԝ&Ǔ2 J"̿WP ụnvOYSGJǹ";Lvج3d\q ,+6'=desdf oAVxfWB0Ȫh`C2 hACA5gaF΂tSg_޻(95MN7yUGb#lm>fUbLQeK'@2C3 9Ձ鰠BaRFP}cԸD+F0PjQšP` 7A\CZְrEKc=g q% x}kЙtO*λw߉nxn\LNyto;Ov/d˳ lכ`:Ч6 >TD<;р60ʤpk &XAB0Uנ0'G`2,Fs _q^sb)Aeo܅ioeo@.Xogw#{a$"K=aPBJIpPC4' g-f*R9U7RPs5&bBp8$J8AQWPPh @$c)w%Wjcǵ=ó) ͗?oW3Wy=ׁ C]e LVjڜ52yelA\&y* `CxC3#̇Ө 9`tІ Y@hV0{/I 8H,͹ sYlv`6Sul-{.7zlw=2L58LZ)!LjA`DSvO N  J UB kQ*rUC5Yy*NGP]R> mª6fU c]LD3!} A6)x|λĻ$fn_uw~o0^&ܹmD !w".S[צUЊR`Jf\^gy:9x :+tf|anȂs p ViqYPF3#1PmϿ?8 lAmܘ^nMM;wn:\ ^1ÿ/1`(s0z!VYB1MF0PrH&C5#|N!dAF{QH$G0T`#RhTc VrXbȑEV1r Ur.ul\j^-_.Cr^|~qěasvیm a؁ c˸8ߩnTdE0)2{a-Ŭd-68yhY|Fjp`C `9"g9anA .jqIDi s ٫k<&X&p[ٖ i}7;gA kNOg\WGȈPvi :PD; bL ՆԖ)1 }aň˕sմ 2Xab JX`r`[5(Ȯ*'p1m]J\F :llSkj| Wb\ nց׭9ǯ[˘ٮ`xqeȝ՘.R=$qr&W0n9xv27-e3GНֈ""rCDJ'/jAP@a6T E]zLĺVP>X9*1r0f#=lUpwW„` c˵D=/E?νxrv Uk'':uuwqE f3@xy$=nkpSdPv8H(X8^*]lX9ճlV1Ts#\WQ{!AX82`53dna4 ϼT,N' g-n3W͒Uf'cv`3} _|R䨅mPKJ$yN!rxP!AR6 04wȼ&@` AQV$]d)rm0/9 ªs`V%sֳqs^*u!ǁmn^>a;OUlZ#6ΓLD)]3֣,eq7*mP5Oޒ^{] Uϸh^$7FV(f1pe K3,oީz{ r#4:%*} gu0|_E_ʹK"@WS>M_:B`.'B+B5,b< Վ] ÔQ}e%V. V+XPG ; `]c9\}x|^B Ó33\FK[fKuun?+mR4nή+w.rXbx,` ^a&WMm]`abp!E`>g SN fC1*ݦ!cXcG|x呾Ɠk𹒛+a?gm_aVV. 7sg22ml紹{s }5GeE dE6Dr!$-'J S jH"C*YPa!CdcYd1ݫ5n,F%jEDk3% J*wKzv_):uޕْM֏lvQv;W;=@E`4gIa)q6(%Z9%O7$̕mDb.c*A:(Ѷ y p]2d˃*fBj晵GU^wkvur9. s\R, xsq Y@ZG%PVU`p0w;dY-UjC ~P"]&W@,C"j `‡ D"d.EBJ R)^ (P<]7P#!2 .pIn QIѰ+Q+Bp&"ʊ51T`̙D NuE׭m)C*W>t1Ҵ2 vA ֑/}3M !KMQfk0,^)89v9̵t!:s WwD[tLL6,vYrr%SsRxs"eW&jx_Q8̤ Œb4# ,ADȬA B < *kЊjEM$Έ 93]XІ[%U1pI+AQ!,\\$cNDuߎ=n_wKu7__ĘMpOYj;[s\V|òO1I,5i2sViܪS ofFn\/ͳ5LLYv$aZ&5hWQWUf:+f.3TC0BfaK*\ k!Z5R A,0X ]5?Y BV9HC!l4V* _r6k;T'[^/"AWf,C,razLwh6uUoD Hª*Wb\9Zfd2UY2:+/silp7/ӮtN9Ɯ'#}hsFړ_Un8P+{ٚ<2xƿ*-y%cyV7K f1"!a @rA"V`DU**V$\R.,*9Ns*b E]0P@7* izx:IM7v[]SL"KJNg%ƜH( ÿbE?m@Z;(6Na9IXICh*}bo`CSxo=mw|4 =-`Kn!+; .ES@,g 9*DIeAZD,:+ f0D )z!ubd ku=(Ej0]p"3bʕ>וB8^CH&SHdf\d;|GJWcffXd3^MN g3 UV#"Q,ZݩX8MA"\a&j"CA EMaRmm 3r\V`"ˁėM5xjn n_`/1'͗R92iY!l[l5z .`^C&mL4AG6>1Ew6jn 1MCNOM-l>Tmq[$̔W HCE0CUjH{gAim zp &1BJ(JpJAe6 eCih5G+,D*=Bu THZ BҝITa䬅7[X<\ݭU6; ӵYتdqgFgn @u"`)AS@ F<Cp3bsfVc@aH~g%tnce6~!uY.fٗvnW𕉅aTYB`)^iUXTѶuyt0 ĈTjmrdaf2FgIBcȨ 8^<1(Q6XQTO&XZ][WpxݾN`sEwLMl.hE6=Cs_5Z8e21o2 80Y7N`UfD"fcj҂A6ܪ$ bv4̕/cwuz:o*$L,#+(Hc+VFOUf]!!1!G"@fY5X ݪCa ]!G`B(F= իI Ӊȡ|TrJuE@JD ovj Nm*ݭO:@7OPi61+R$IMp*e&7"\2k`&#en!:=>%|۰TY6OLݚ[קxʲtC 6WKfy-U GT,GpeU**ee:L^221:ID,j- A"@Pz::nl͹bsun)aY96 : 0Dq4eQि"#r6WY -YQdVN2X%0ދ%f )<%KsyF%gjp$,ZLTY4n?x* TBfd#"1l|* JZ4V0[Je!UYwjL1 Jɨ0p2ñ&}"jDZ(t,6,a|ˉPń҄CJжfi^wM->J9+3]C0+ffAsYuҐ*FXtcnF XȲXM"97s{ G`SG~W@)dZ=PKZp}g|/x  .^ JQm*"[T!Z+C0U*H,G1,w @B 0 F!9(K3*](1:Ѡ!V`Sv 9%U%!4% :}msL*癛Mdhu>T5 CHfM$: fZ haeW i[xX>@A&6ޱzcDn$FUef՚C _91!,L~ Cb 8!,PGR d DVC(麔ҮJFg'COx]!Z y98Omxo?-7Eqrde^_Ԛ}O%D Lj m=#8jӧ#Xb%mQ>4P6d-]wC[C)0r ]aЈjLד$+nF<[)rd[%I3F6Jkwʛſ8`@iq'^9S߅5_~y~']pi]oP@~;7?݈e` Jn,$c#3%C LVc6[dU UsXtNӥ!iE#"$3 $YN߫Nd6/ݚ-f+butW`6`=:ک!>@S8yY2 2Oәe912o}7**ų9-ٮď;άG˘5;g{|KH7}xJ|aOOK,ԥ+O_?">( Jt32g$(U,`3I$e4F0^&$YPrIF4VP8g̠VRZQb*.nx_tW捰;f8R*Ye h *kLH8zb2˶XMKZ6h~絩] &G@ʫ zyx=߾=*)>w|rg*Eh_ك˳_[0VeBGs_" YVRɑh`WQ4 ZKۆ ̅1$ZWQ+BwdxgmiO}q@/ww hܙ,s %dcei:CY]Q HeJaef6y: ^U S__Olt;|O_!1u4k|x׀ݡ \obw4MN|xPJ!ˬMFS5Ak`tc%0Gfd/]jʯfq4iPTD`,ME& R ӾRV.7oޭ\ݘIJTrBwPf 02Ieh.P4 dWuJ&jPR?`H*,=oxsM ZwK]we:5ryy^^~P৫ ~7W@ޟέ9"ҡB&NY]2H`=;SO!Xȳ@i (ahg>YN< -6p [sreA렂'z۴pqt`ظO)NXuXdB&rD\bn_yW~WV:lRğ.C1cGJpݺ3\o>6*ͳ /ͳ;j\_08ERb֦ @,XXe]hVG_IZ 3)Al7֚DkrapYݓ?f-j,͛\fuu}fQf]X N3VLV l$mjȱwmr+sX y(ml]*>D _ۗ9|v8e=kַۿc{/^f]ҧI6|_{#WDcSUck3.*Vg.-Z< !pb|n k<ׂqSuu )m/ +`Ðq@։`3eq{yguM١|m3EU ?@+ o`~5t~/5:pc?GJ^UWf*?i $T g_ہ궝[5Z1޳ ˖baH@"P2fjv.򭤬ۉ@+ݜd&w)[Nmg7 ;:}!y;VW4AȬ̶ m$a[n jPkNiD5엿ko-UNʑn | U|V<p~ϴ]So.n7)\ޜt)qJ0$Jc9FgffθK` GP(hpÔy%s!m枺زze ~ v{Roˌˋl/vȕTv؟؎-O WEK,O4YsȂ,ګw_k2?ƈ72W[s~ٵvY %?U;*3e}-Zܬo_W>a5<dPakdYr^k64uYiI*S&sPX{}ډa֭S6?gb1p.9!+@vbhCWckF1: Z"\鹯h+*l7@l!6ΰi O*:Cfl^^`V#+xcxl2.$fu*ۅm15S~rn̹3'{޳t|Ss:cL!ĐDV|^sZBMmҥ͐)?\Ws::Ȟ߹/U)=,McrJxۤ<]W,hfŨa@P| xc)|v['Ùa{OxoBl2/cWjʔ=f+g^}{L9wAdSMfA-7Ot`pHbJ}((]׏:%O x Yؙi4ܹ]@g]1#)S! ];*U|c+?z˻Zٓo=iZLO +&^+휫/ܚ5oo~qu`xqQHE츭t^FJEw>g+)?3)"G.Tr+5=Acj$9bh/MM<;ׁ׭ëm.z8d=q3xod}PMm]j)=,bu,k4S|\띷"!2D %C b2)]®n?vweDI5]ڽ`1uuu"wp{|s<9Lcͥ,2s UPZ[  Q AgҗǦuL96W@9^<-M з%ŏ5r9u]ew,-N7w[j?&5M) veQ^ ^m.Z\[QĊ57ILUw0sl۾oyOغuutc<ҽ M!G2'O[uqtj8P< %pe αiyހ\yR-޸{hv_[%ۈ?.ͨИ`Tx@*gjTĈ[*¥myig̔_Qa2, lI\zuԮͣE̸e]V8JQP(x|ip$+ƣSaa< 0Zi SNft!Bq=*,\jOřkvo<p.&L6M*(*n4P8Ovb]¦eDkr:|*uq4fnNkj@@AA`;,psγV/qL5`gY֥[!6eal}' Ňj Pu;WŨ .+og)Ŷ`֟nxݺ=?hU8@EC^ܐBAT A@ Ӭ Ù-:Cɱq9[U +,A.335y: I/(ϾܖEXľʛ2@B:&gz#*F m?^*,T[u9LM5mC` ,vMhP _fznq؁ Cĕ3rSn !U\"<_<#\HϥV%US@ ן?.ɓĄ8Y#e>`/HnrwNJ{ʥ.C{wv)SK;W)e1,e .swf9ю]#u@VW*L%de﹂q?C^igXn0bnx>`;~ڬr% Jèjƴ Ba!G?|}[.^~9pZa*4ApP*<0&Ǹ 5dĕC19 7~r@a^}7mm5yLͭ~T4WYEk흳̧v3%2 dw%ZIiDj ]㹃S!ׁց틨N{bJb9S(x&BzQ³jyY1won|-^j…a ?mswnʹ@-oAx]-Ȗ%|' 屺y9uz9rl6~m]'ԝ30\qH#CEfT}mV:$hW{F){s>|]MCٯ[tuu`Β@aAU2H%tgS! +p{#V3&vO=wKJۛ~]@1z,&# \\?XM4HE]4C DeTX۷?LZ`5A&` ʯ[^9S)e5-by1\ mfv?% V U,AOa^c>'Y_>a;ah"Ye|k|mt|.ټز|q+n̘J nc O@ QŪm&#d掬p3ԵZ)ž , jVA-['׬pbk\lV{bhˋYNLij,ͬϋmRK?t}l128[?ҖEcm lؠ`De`ĈG4wt,iyۯwWܕio/nݶ"Vqe9B`_LMzHۉ:Ap( v%!Cub r>P=~\n8fK`oW>kT]ᲊEb)8zT!1?(x,+/O+ 4moھiq{`l?%9vnxʽvd% WM穳+?9]382%`HyA)*X*28 6f,1Ѧ"l?[^D^<@SZnnxݾ`<&aٺ?`V2pʼmV!6Bb0aGW,nM: N~ bخK7q >_Pfs%Y,u6a۶dZlB,\\ZՇlbۆHuޭG-#̐;!r3<dY- !/?LڀЃ$SX"EJc$Fps=TU^wĎȪ>ݧ:ȓq] e 9iBݑ`7DeG)G؂_ޭ[svyWP\>l2g2 8)I""GWk޽,g[6E'aZnUݖ+sBu |`n\׀?s"I%kazm\U´C_ O R8DqzeLTLJJ{ 7(h=^L<`Vm>q x:BpW@t^>؞LM$.YapʟI{߹1-ssyljezW*0mfYL!>.MÏ?קLL9h-4%ٛ~X%pvk \kjQ:Isu:;Рi\܆6Uj(-dF)Uܼ;9 ?jK|r!`°&4M/x6d"P|"cZXBM7x8D電~k Z՗'~1/\*rҌ]͛[um>7'wf; ȇ$ѷv/!X6za@hSmB!nqJ/oCg&Jdnd;d0Ty[j3Н::B0 $<=ʫ=XxEM1!eb.-&A)nJ s³ãW+BRLjM"WAwXkJ[K| 6x_~BoN'b6͡s-q) myIˢ JSY)HV!PKBC-Wc̢Rrpey}:𺽢p[%@8] pl[TL4|͍ [nYFI.AEl8CݩT` Qo ZJh4x}qn8G'xm֝WV*X4b@CLS&&pidq Ztӷ+|^WKژ\7?>v_`a@Ѧ2W1lu XMIwϛjBibMB+3=J_WYʉN9tSw%ɝqCŦţKI@U1cyxs/18+u[%0T_  "1h/O]gä*Ux( BU8~?{o )xQu. K@Eʆ>YycϿfJ{ȮA07Jهkz]tZq>8L,PBanTnpqdCrq/7,Yrx6˛&&4`MJ]ܴuܖK~[+g<*/$3 jI$0% tp&xȤ⚨a J'H5i$Is@L)$S/|P )(bo_T~L 9e؀\g(#B\>lX @ePLIANP7?sol ttuZn 57F~~53PZF cVwc-#bKSCaɄ,FK&p -8L8 9Z$* C$DI_3%3ƽ'oȠũ fWz7.4'!!2G)<\99ⴝ )ܜ9EZ=1ȻӟJyMf,/]ٙX?2~#os 1du,fH88@IbbpXҩ| (.]\TQe &Ys၉ 4۲;ܙ-|Cmnm*.;|'yjO)$.A(CX]KsHb_Jݐ T%4&SC"1$PEL T % $PM$q!]F]G*Is(8 'S+`JDoq(:L!`N.P;Ӳˠ1-ܘ\LXS!"~7h-8AՀOCjATz"h4" 9S#8. kl h Қ6ܖnjFhM9KM3SSH (BIO)J :EB:cen4x2޲AeTJ$YJ8΃\`VTM|RWmͤuu6؝r orq>{FQJ/rqr%!5%b)Jjx^aw[wd9xrq1 (*.v83"t>@DFgʀ "3؜C$tTc(J,I` V@JZsIchx`E PbʼdBJ)lG+r" $Rd/*I*-^gqLn (b$%bqR&" y 7(E6Xx iJHi F5wqY#6X RqД1.jW[%G>LFցNͻImr޼R3:]s^G (6Ī&IB(`$Hk$pg?ag hUStkh) , *I+R0 sxiT(2vJ'"t/u C2Tޓ;*@#|٬1Fg#].JTDFl0~Tc΃C:wDT9E$  7&3TDC2dwAK  8=BpPg7Tq2;uu{ݚO% \.pu<`2S%xxqy'DNIR\w` 9Ǭ<:i,bք@D“BR$VMpѸa Lw1iѽ,PRN,55A\C1>bz`U I:Lnjv|kցUޓ6osuzQv[S!T;(g1U@]rƸSPZ20,BpKFRJIV)] gnͶ+2wB/ER VbKf _ݡ LI@DNe6^}QCQ9G я;nI>:BH+i䣊#$!)p+Ke /ܗgt6s]<{A]_n v7<z6NUgf( _KZF9{r$d8 TQ*cƀq周5Ҽ(Bb=RKM Pt@3A8< Z'S/SWxM \b:)Q$@|YYGJ`"|)8DDnϓ#=\R"!I(-8;V'縹. u6&3pkZ`ɭyv \Gpm:Lb,U 1rz~׵?̐7/G\O0}q]kNA6ayRf' 2{lZ6W T~?e`<*I#ZRc8pʻ y]AFS$ơ"%%qJ$ DsHQ:<9!)Cr ag8;ys83Mnq7c' .SJŰ_V*9umJo'ӧ91G&M v cX?)=5|- w x\ kQMi8TW UHV8N bDO.50X%Y ɤa,1ϡ4v㱄 7*ǘ8HƝc(C&] IUIPnjzri>Kݦ:vuufwId+8gfZ=LM’%yU$BiI/QR~$̐K1yW2! =IM24KwIoE<.S e&Hj" 'aWL`ER`aeI RZI)2SdeR}QWGg =;t$&?Oqevvu*װ{!s-RꯂnW~ z)*:ErnCB/\ԵX0%fa`~ NA+>ݬ['_HBX7+Dc%"(W+.P L" %9$Hq'W5nY3LC/%S6=DH=y)ɧ]{ QqUMu9箆þ&Ɲa0j_=⌎,WNTd1m*7M9--;ŕ]BӓV^?гIZҺmܰܰ%|Lv?rq?Z WgpVEJfUzsҊb}簤^M}\wrU|yI՘߸CIpn r U\ƒRUݐ`,y&Q&1QA~.E]N8m}0sጠ;{%JBΉ\-3v"/]u{9]t`k1z^s[I>Iϯ1)[P<6hSznPn/JP1E /K֯P2D/fEe)/nN؟8pأ d_s :JKiɖ"'28k2\zsFj5{ZR :0:Ue9yA`'$HMî(u^sSnZ>Ej÷eQvЂk(Y]+}񰗲,^U6ȴ<0תܔ3D|;k&'(@ 0)\\=joMңsLZyjK6Ͷg-nܗ,XD,Ws3$sbtz4߾iݩO ܎wf>kk,Ppu.5;Ы;exkpVTYuصsϰ_J 9 MeƝH`(IH'('S)joGObSKصȍ\ZZEo"3;|LyRa &ۀk7 WWvx8xjeXWw>֘HWuTP]9kR`Ux^q~61qyc{Uuձ&W)c,.Kqu2%,Yul;4\܏K_04*#EfBqf%g4q`w5}J2 ! |cN],qɢh)R >+>2~ g< ōyVԒ9iٱg$O]RLa׭+n;A=һM O5֪o,?z}O]5A{]TX7_U{5)f r͉->I6YU\=3HN\**8brsDipyj6'HwȔa7% %H<|_LM>|'v@絛1D@Eսbiqo÷C{RMйhg{olNrM퍻b wLW0KUx=L.>RC&.9VU%Wd,I*@*ϛJ۳3CmD߼zwUuO :: Tw]'Z`kYZZ[u.-jG $N&vy' e[Y(EE,>,6KڼӉ7*.xF,+4'i 27q' +NP/tځ޳޳>QܳUtqVM z}ZUkݞӺ<^z lUᵮǭt վI@褨Phƃ/OU|ko-eزR|kq [x\\\{>/U\]2 ._>'s]@S|岼jޣэ텄]^^xOߩ/OʦBkO]?ǃ7{F)Ar'h-?z[9.ϋsnB6n_ G5e"rQqRc3vx纒{uͯr[RˌJYM%V0ޘD¤֤'N-K"Pw$?#3+2y.=q] \/lځǡN= m)߽ҟ~-kfZ nnEyQ]{|&7|g_3un`~q|4(]9 xB.~Qn/'>4VO~u?oܟ ob?ު[>zռӺ gg`L(ܖO.Mpָ4WXAyP^*uuu{wWrrʫ?&95 {r' |ӱ2|6'`޾l7e ,Xu"txx>aIο<R۲ c{{\kr]"/-p rO[#w?mP U)'q!o<=m7ët/::}rPzvێn5ϵ}3Ƿ-Wnwݣs̑x{ ?iXS}aݽQW5q}GUy0}P~ o{//i ݞ0  A_d}]Ȣ/%|;?q=\v} ޼ևkkhc%JNq#+m׀{,{R ½uKz<>Ǡw}/~?{scۿ,OxIMSjrz_{Qŀps֛4S] 1B;p47w/#_>M+nxx/wiw* }j)p p7A~SosN!Hi {Mv_&ey*~6>j^O\7O}cvoX|rx6_V-dE-QRI,ГUsCUmn3 _ցׁ߳??^w7G w{o8|7YsD_wm>Zٝ5W| *~M5Ix::^I=?p_}{ [AOWW^;/懼_V;uH/C2v ٪-&na픖aw uu .`{Zmn6LvP^}@q@*O71d]Uj۱o{y_zM~Mց׭K+;'"7܍2,ǵt&Ԗb5>'\>\5=oqoʗI'_nxݺUn.2^_6{r=nr+m- [^n/ʫ>TYlu j[ ؾ-<y:u{9`'s jbz[稠lU^k@l|bWy:u{ ԝvxfwڭ& ަm ^-+u׭[[\.*LudzB/m5Z>֗sunnݞ] qU 2yH*c(<,X9JhJ*[}ўGx%@~t[Wxݺu{_A)4G}8}MelZZr}V0ܛ|ͥrǮ{zgvGnxݺVcu0DC Cl뾚0Izc>b{yiN,kIQP+Hsߞߞ=\?|Znnxݺ0X]_ ݴ^Ҽ}] 9;W|c}[_;zO uu}pU6ٗ˰+zCvlLJw/1A]4~}:ɦZ{\{_C?.xUʢuuB(aYu[Bg* 4֕Y7L˘[-oF}Nm}{Y_ҭ[dYK(rZɲoR~M]SuOֲn>_[gX:'8 qsv֭}Uy5)&$9qeRRiySUMIߔxtqr6EꚖP^pͫywyNPzݭ٭[+fvTaJu{rCm e5^#R>_-SڗON޵znݞS0’o"qu]D}:e+| s46($&h۵۪LsgYOܢqA?]u/ [†jfuYXmfk/Ƕ٘ uh͹7k]nxݺ+P .T nv)Һ)9ktn4]% W@ufu{!~qu76:ſj@U{ìt(mXF˱E,P-2)f{Z͵9$Ig9I[^nݞ fy(1%'jc]Nʶq¦n]Wbf{?Vu͹䋿?(:u{遷RvܧMK6Gk fTmAZ&X[<~X=[nݞ/N/aE fS/p=nG稕sv.cxsLEmqu}οyc W6jcݺu׭Tξi]A|+K5(nzkuy,W,); r"¢ d#[/t׭+n^Z1;aP27 ve<++* rځES8[">w]O%*D_6^LEH )&єv|+ӭ+n^_;,9&E7Ȭj q葹ʂtϫǙ٪ԀGTںXε\רBnxݺl&[TεyflM ˮ,5sS4*ódlYj),' u VICrв]$?<:u{ހ9yeX+lM%'AgUuحmV<>*HѼ$Rez}~5nwuy.KrNz7}D\>e:2)a&L#r&V_9ʴe }J}ީKۦcͥm{sӦؼٞ=7y-7生>?\:u{Wܖ`*Q@SP'd͸ v(e Rbd u y͍{ٔԘZA-p<-QP]UB}!n .nݞf`~Y׷bO9AzK2wiiϩMˀdu{oBC=5n,S#JRʤ\uܠ(?txݺu{~ZrT|[H>[ڇޡ [OZɚp(u:؜6i30'7%DK*p5 &`̘]0}JHAJVд" &4{jvݺ Bsl[vWYi6^z0m2s~^n~X&+5ʭU|Qo}F zTfa>p}%H6yukع!?ו^Wxݺuٯ/xݺu֭[^nݺ&߃nݺu֭[n>Y*+nݺu֭[nݺu֭[n:uų{ vIENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/splash_anim/splash_anim_12.png0000644000076500000000000016261112647526517024353 0ustar devwheel00000000000000PNG  IHDRjPIDATxۯlYvމ}s\2+++*EĖ()Qb2`7 ng݀[ta@nw Z$UHɺeUN}50XvޱT9s ##b+.7n^{;ܼWkoONp.Bx< I_<}}GЭOƖpbwIT8x&Ix85[^n^hS{7npi%OZwB8 QTuuE=yCIU񯻪ƹ]c~c!nxݺy;2b(mpyܡݤڵ{lϋ*n^ݒ`bp_ \U-U,/Ύɶ|v[לnxݺ>_:5'@#ʋflE"j8%֭۫Uzvݵ3JgcSIۋ۽j)n,Miԝ?nH?TwMz9V}(I~𮏽y)ց׭ś5o{ޱ-yI/D=I[7z{X)On޼/݁"??6tl1P;]y}`)!ݙ/rvu}~m :C{$QwycKnRbz:u{͵_M[P'wb{(=tXW桙z Wnޔ/B)({ΎQ';f}Eyy]/#מ/xݺ3n澅PË勾&xHSrLҟ6bw0bnD`x(52 Mo{ΎG<Kî[7Kkn_L.w㨜۶dC0KPu]^ y]uuuF(= @o I-11&1c]owuυ˞} /ۏ=z9x=}2,Ǻ3Bŋnp-p̏{}dC񰇞F~H=e7ݔAzϻun%P5!vKur/ Gd٥[^n;hKlY*jZ#wHN`U/xr/c/nہ׭ۛ;n)9eܷh9F]DG!VzoCOB'KW>wfWyxݺ)v=/+sY`<>e :̛fSKC罭>Y>vz\8.Wn/"C&-M-oʼKY>;F>[W:v]uurZм%e3$It9ۗ.ޗǟM̛ܘsuuWss%7A`;4vI J_RmN?.sD82Wwݥف׭ۛ!O4?ᶌ̻;ߔrי|ǨW!O_Uwn Կ xݺ)ܻATCvX-ŻBe%vm<=fT?Zθc]_};u{S`7]]!͡w1R1 5*bp%ܴ' >VX%l;vׁ׭ۛ;jSoǛU!5G 0v2޷|%-oRv߅nu7WpKU?u]٧u|U]Rȗ c^Mcs ;4w[7z{qSM#ƛqӂ~A]=D.^*no&$-d>M|tf^nonOgHOvwAw$3.͠^ zlϟM)ց׭lx;6cs~l!j^:w-NsYnR~\aKucz^^no[.̶npy޶{l.l.S [p8Ϲ|&n=% Kn^w \oz-g>@%%ܥ}8x|5m.-.v9߃nMah<ִ))E&Sm/[$Q>uv\}MkrK͡ZO'| NӾnb~#UxyqW5>9_d 0o =-7]u׭<\ON I+n =:^0Yy(5Lvz/]c; [7Xݴ<$ƻAϳb5+sʾ)se7ux6 CmsBgы(Mkͻz:ϟ o\n/!>i^^no›"pOR!ow ij&RvM-!:caJ__<v7,`7>ց׭k%fwh> -9``_}#9 ?r ;2n71n$7yXۛJO=6oRJ/<>0ϸm"}Rk\S#W3amZa<:n~$fC`Ͳ[ia}Z@i{16=Gh{&-kow`wOR;+D_{Wg7ݞ,A86fw. [݈ ns{RjStZLv򚼹Q!etl"mF=ɜ;#ݼzRK;Y( }ZB^nox{w}nC&ߥ4வ}]0"@okO_:?ꖝTmR.n^Lnݙ{2ܖVۄM`\ں@cT!`i*'m̅zk7оc`w_}1zN@p٭[ڴ9 D1yms\E6?@m} vzjV^dm*E:eN֮ݯ'ʅva!`Yv3N֭Oxqk[o2%}mV ՗!㢼sd]β[ݮ^TueכBo:.bFƶ6ϛ0+Im|`mЛ+], _\vݼ>bv:*CAn^MIMMy{~cY;6yr>M)øan9v:W ;}NN9Ies] pc _os[ܦn*w\';БW.iĽMvRY&,rf?~{]ݺQv& k{~glvufU&JQݗjO؎7S.vwm g)EsI!/+.V*c-G\~`F`|o,u?>;;[^n=0Vkǖ<gs};͠m)טe{ZxZ+n>,~ b)#P̛jLC7~(%u{$uvln?緻}lԡ[u7`밅ODYsnvׁ;co_嘟ۧvX;}oy1Mkxݺ}aw{ ?Q^;=}TNn\&,G k.캈Yuvep-W?o>uRqJenYXn=QWxݺu{Պe/pYC͡=jp9{`gv׉OE|ݺ틪_T-\^5}~zL ¾쮮:v@]Wxݺ}@uw.5K{ =^k)?4|_˲t7=4h P˱ۦj8VewqޤPv/.nn_ϯ;ioЮLs+tһi7~_Ы:u)]].fNbAQAv<5~rKm25Q.޾x]l;; ;,`7Y?Q>ѯlx_COWˈ՞˾aWTag7rK[/ vy^ή/A| '/_&n}0\/QٳY +xݺ}mmK-@T\=p%vm-, 㣀w_c`x ^ڛva~UlǾC Z4wa7Xm[A" Zw]zZW{YuwvEn.ǯ<1KxG 2 mz ٽx7}},^.&멹| w?Y+]^n?Yfz¬ iW`%5ozͼ#@T5m;} G@or_ΓU5vv]فw~b }l ,~Yg nV b@-O 󆽧N<+:r/nʰccG} {K ^ww~{n~vp݇38bie[V -kWU;nq?w1-Coz_?` 92nݗxݺ} =c_-?H0%9@ JKJYfa Vf@X[dҀ(+C\<>ᰛ7}>E`wl'( ,:!~Û%+c9:;u{;)&7aqo_7*v}peI{ހ4_8 6-5Ks:ONްQxvPZrh|L Xl89G탟͞= v{Bazvnxݺ=$_'mj6ٖM5Yo֞wlDE cygt'e W C#}gnv|m Mz=f*[flms۸Aq#ےTx&,a;/?Nu9Q~K0HݵNvvfevuuK5/n3?~VAGB'n( )xݺ=QuǂqmjjA|{ZmfҤ m' [D8B!lKXu/ΰ( ~~4fi旘@oz2{cxW|OԱuu밻;t a_ǖ&GxK6ܞqW phEjMF'f$kyHP("܀֜vn8O֘o[Y(K.TTRsu7=o0^mt%ׁ׭unRwQ{u *)S tqY}h D|  Z`fwŔ9 9֎O *W ~PC?Л_ݨqNOx xOvz`;R 0/mSNY>nN PU* 4G !ZP3悔fק\ j݌NQjTM*sC" tu{}aw ;l3lm ض<ϚC{֞5a> ,a'&.+xݺ vxAgVmae ]sUzt=pRv Fm$@TaY A3!Zcc%dֶ.Km! /q$gk0nˍik 5 .T] 2WUD8|ǟrO۾8x^{޵I]ܡx)5mܓsgg¦d-4.Ҭ\a~D[S%ӬZ6 b-ַy4M )mjf:n]V nbsc6wgT͙DpH8xW@im?:C;*/cTݾݎ"dqN[i'7؎ҫLM6l#O mW#`D "BpnkNq;5nL^@I US vU9F}>P`N`soFI (M";x>|O}ZnTk|oNn_(%nw m}۹1v9&҄mp:0=$Ew?;nʹcS{~Bam\&po'VMݹX'4WJm(UeR}"TV  S( 8=k GXX^nǫa syفmfaSu{f47{|,8۾X]50@zmvԜjwk p>/?}.M-2F6?5j%xԜT z5)P3mLJ5u 8&` + :ۼm&_nݝvwuY.$,)aN2.f5|Q/sei"@sUVcf5_DQmB7y1m9uŷ,Þޔ2>)꺔*r JFDnWD^U[M'а> Z(z]^nwTw/v;ؖzjGсEQڇMpSnzIZ]\):52#izMwgD'[3 B"];*p94doCg3$jҌDi,1^kx1ho\&p=9zP 8峧MU} ˞فVw;` ^غ(`|Ϗ\An6herGpѭ%lx)5t c~fIV* 4H `.F A!X 8J ]$m&2RlG߽ ;r{D|_זhVAū+Ӑ]Vcv@s_rT21b J*V'B5`X˓Gz/Pj[]|oOn50fekT]^gɸi6lLbk0 |hY7wdN6M[ɍuZ  D:>hSk7&e⚳IJ鷱9oTw:83rid uC!Vjp$+Tj=TWDe@Xn|o2Ŧ)@a2LdJF^cyk_Yayf*`٠b ʀ] V#죷# 0 ?~;f9Ԁݭفjv;, }[$}6eogmq lj287&FU6.dd2Z9h!",x\=jm?Pr?7j63mbv u:t\)m C&yk6fk faTDV|rkZFYXREwN.; 8OU~ۯtYwkvu)[ݕ/볋&-!w 즘qK-o\Cͅ4!+#҄ɪҦkby⦓SJ0tSXsS# k!ךa` D1K":?V S7džc@~2l drIo6\x@p{q`QMqPA1jKܬ]Vd Ȁ<(gr^>} )py+?`K޲ߎ:f>}6n[2}/[ݸj (X֊͚ n3@- OLڬ.Qo=Q[ĩA`UjJJB*$Q$k(Z Z S GL:X`Q[ L:v6I"! +5լӔʀ\(d951%[ɡ0bb=:Y"lxbN?(ުJob4N::}`+&їw.ۗgLM-&7W% Y+g֒MHRU-6")i LNAwr Mʯ1IfŐX]fɵ8$VYKRF)DH@,&A0T&2WeTsN $V@5fJՑ̬sȢl;*OM嵙s@ɢlG#2 KY7R, $%XVlIX:q<_>y[£ z#\AN>.n_L r^ߩr]'mi-Y'Ɛ"Xcq-E56Vu[D=S4^ !If5 T7fHe0D(*lJ%)P5g Zj+LtoF&83NgܜuKLIpDوl@XJBC i$s!1PZkLPituF) "4>05Pལ`7ie<}z^/?_͛cw}.l7*n? ӷ*awyZU~`7p](!Z\e[ n 'fj`vlrHm\Aw"`"VzƶqI)%&) SpӨ2ՑLI\@* *KZQŎsUK b8s6`@`TuP)t `EYːWbm'Z1«PփxH+ ~k7Sq`0~3z_@:}!?wA>uZ?zo\w߳yaܺ5\a^%N^ݘ%x' ,nC0%8M唼9Ag&H*GLORuьrkQr(yj0Z &HA:a\DC-jTK0j jT3h4N/2%CDb$/"bt @U0kuFR%eHڡbљ]8EŊ XSDAe~/hm/zwi׭ .X  $1B Ԗb&%BAIYLj` '(?Ǻp†6a?A<}%Yp|D }|H04{J^7vg'UͷZ7m=Bo˛'],m¸j.KK-.(9); %23<#%'48!`Gh*(O$,:0iٖYьs'XKf 1JhHd!cZ Q Ru$2BPjT6G#M٥ |an: I©l2xhRGVs1*L5yȑUJWƲ^ud .Hә.5OգBdWI<0>9Ao7u 7JwOvu{=mw2~~:?{IUwVt}}Q6WusfIu913l\^Jklɭej( npB=jLצ#Z}܆(YB>LWI0>%\\=+vo}?98ei~xz-6q;s}RWB.'^Lj UWTE.I{IaL!k5m2\5A% 9 C+D 4kMjdu]&E N@A (EH%⵻t-p*C&0X :B P4EY8r{! QbjW Zh Xb6fqc +(te#B<]96B('jtE_A(Q *sMkwo >ICHx)@ ̷ >'[^/?[y{m?&[nGݝ?B pqV<T苲`aƧLQgSUSddd2,{/djsk,ϊ!dE^A 5YH$\`&Hs@^U3l;r5gt`\PL*"ɤhĪ!ԛ3`E%kR 4 Q9++[ɂRTmfpD,*4lNAך5MWd2uuc4JXCv%q1 +?}B.().='z4{k޾6bX^/ G vZ"c?{>>˪N+y޲2'ȥ + Vƕ3=0 U՛ >:6jYS"n{KPP~C*D=$~p2LdN(.)! )s! PRJ5.GIT5D-Xg'B:Si9IG jB#.)!! %h\UfEu"G +Yt$3rHz%*Êk%w4ٕix*aIjje zzJ^7E Qo={oIw;syu:QUvøɾPؕ<--C$gh%d(;@&dT5 U˙S!jm n3j)`N+uVAf\]FR\Zx0!) H)@g$NEЌdu"@ %\3-4ղZL+n@"y`P PKhQ!EƕeCØId/%pd+8 aE#.VbYAFN+qb%#b6"'ʞ!$ۏU (L9phڴ%`j;~nk5֭v{{/o}KpՍZ)XRuun wtjN:<,>퓽(9*:VFo.ʨR K %RVdaH^,5ڍEJ h8]^(4%Ц%nPn!t!* :MQKRT{ YD)(:捪UDdb+ 1BdSdXu"s2>J.fC* FEAS1_d&ȋF_ EQ'CÕ0CFQaH׬|Sqh|=<~]h}w~`s̳8d v9N%Nu[2JL+æ5:]F:@j4(r`VV(w־JrS$ auL&KӬj69 ,+lsu wcJ H) ?jVYZ B6A* Buf`XD (a OqFIuyU'Gh&g)Bqb#S^G)l*fFdA/(ezJIB:Nl(--`" LU:N$< d LQpI #Ȟ:qi Bưq4j&=B)ZN 3>5ܤȜϣ嵠K,^FA+2:4H i8gYqd҇PrUF&%D? B!&T Rs5C % <ȕJ-QXAHNL= s"e%Cd\XzejyK6#)2W.d6*(d)"%\KT^Rh jίAg!c孏¯ݥ9vT9]u{o~\Uuw5 M%Y.DsGK 9YW a/??3~s|}.ۇoV %ه!}lἔBD"ҒWJVEQ Pg =UhD:JdUwȣVPH ƨ(2G<7qa¨KWL%.S8`"˺xd+ ,*Q,ִє#I/"_[<;3ӓUu$q|W+^ +n__:n&۟*gv)2)Ye_6^*«+e,Zb0‹,`lrD2tKoBMdU5Zx )A1zJj)$Fr dfQ4 O?x#||Nl`g~T-]WRҔW]O^<9˓{2I,DXmQ( \U@RuN^H. 5C"t(Z0,JdD@3# yt/CY@Tv 8/Zlԕ]=,4:% $e3dWF(e0(4WbǗf>JY9C~= 9SyG:u; Ï޹nϛ\>5첁g'Um<aEZjH0E2: +CZCddN[v SNRpcMfJaD IUd A{4o|+)57nj-5uYo3:b6=(ė^^Y飳~\t)IȽ2,:A!4Ya梖@؆SG>faLJ)!J@FZJhy!ipa0D/$yr0Ap0N@.HB?(P퐑`d GAr Eud  9'+)@YYaRSN_*r sXUg |b9L!NЅNJA<.k gܚw!fցMwk.a :<gg^u=z6CUy1CN]`<ǡ+aSXNi+ N):\.F `Vм69aP g g0K%!- 0`d$jo||7 ,Hoͬi3+a:gmW&v H^/'^{RV `X!}VҗtboRB  . UTmFSRENNP" 2%;ڹe9üZ c1Gb#D^91@]=<ymI ĈK V %"x"[i)9;6x&VkBMܭ ]u ;Е_qͺjh&`w\'[ 4/RWu?KݖSM`Y¦j6 p:1XL^ ٫:4kup5yE5$G䞭$yq?'wvNθUs+%8KZPZ[5Բn g}N~q5Cu-J+5e3 C 3ǀ"\A9gCdc)DْbC`D]Y@(bc!`$/9y1Tȉ cPQ Fw O? @꣝5uSwG/ׄ>/՝TM'WU鍫M5Uǜ6]YʊM]eG3K֌KY뷙j6;ˠT̒P ae/n.2p&h&e`0OuO :}LBLn3^&jmhۆ*aUfS?ӗ/_>[+uʃyMtGId 8T_^CdrS$RD|\#:Kqpf%l3Ñʊ*' J T A$xjd`WpZ .HVRShcJK.k YD fn&x[}D]pu PgOߩU^Wx0 pgnӪyeuaR`j l5X rlpӊ lY'#X\,1SN`rڎ?En`L`. c LFg)a}NYv&ĕ)Û]ʜghnwmX +W+ǧy Oa KFXu޺jBmYD&0E Yq)bXeJ0f#"!3)#!Bb'T*2.h%hrQ].EIV@5jE]VYA|O&$B\<>{ < 虚xݺnan\颪qv5$a15e"T-\&77Y*\t(<JWÉR}iU9-m1%oQWdV͕94T`޶YB{I# sE@TP$7nMeT$kPq1`9E8ڪE#sEɲV laqFKL8d2#`af*+SY@Zh/h6«"i>iVgMmaab0yGq aIC5[3 `gsЌY%2A& =<}"N.8wmN1~m mmն gn ڽ`T U$'6 TZMEtN"2 R8XI%`T^LXEBAV CQ`!d, gx$[hE5УFMF$q$<3Zx!1 }8M/)珅bgO 5o_A:)6nrGηCmyv25fwrU5fkⵤsYYZM``-LQyD$kZFSEo,C28BN IPf\Jq:iƇWޞrt4ZLxsrunHN3_mҦPh{M 4-,f{ &P 2Z/ <+Pđfوfc,C(" Y W^.-X{I ;/0L*9v5ɠ+a( ɉAgqƵ9-!Jzn2z>PsحW m)N)Ta9>q ZKV&r<@9WCD] 4SbnVfJ^aij&!0!1iG߬MlᒜN{ 8oSglM6&7-`g VB5 2B*$:ֲYLRkwHS,E E fBa a!Q 2IQ{dkJ q]}ף\0ՠqL`5CU2h- W ` 2Wψ'xWСׁ n+s.GUjC;a*E ɥ ¸^S.թ浩9`A<)Y jaVGӂI4]2=ׅ):aH~c(׶)F7ء)8,m͝-bxCˬܔ"LK]wcN\5w;\ax:@ jQ_yI (XB^D 1t[,a>QB4(fQi*PqD 2$"5C&\"#LC4Bq n*f" PV>d8D$"ʍV9-|!J.Ks@e=z:~.=}0KmS>եuYIN+ !E0~L:2VP,Ĕ j'RkYBJYo]#2d0M1!-cr&SvPxl.MO[7'􉛶ۼMv SP1X>`KO~#JfY%5 (@E)2ŀ{(0:JP lMdRBnA)˵;5ZEō@+R(H0LPP @pPY1 ȨQ c` ) 3)yEp~yUO˩Z^\8\ ;}۠OSӫ M2iy8 VЅ(#Rê[Wp%aJh0$&eP3eV C pP3st/L_ҷ3aYa=6vZJJ)m;̟zXbRqCve"8¢ eB+u!, EA i9*Y(1h%̰2@ `R<H+Rq*1en?u1R ZhNՄ<2 <1O jߛn|XtAZҲ/fE;AxDm0 *ITm̛s0NHh^%DC6ɂ3h i RU&9e溜4pYπ75^rejw zf@f,r{2\<˳ rY`Uwf՝iRC!B53@@ :FF" ,@!V(A+&"P!5`4*K( "D\eڐ(u.aY W'G@n秵OFJ8,cSzy*Dxt|6Sءׁ]SUfmo=biQejfq*ZH~MSm;6ZzdHfaB0٬9e<g4n4Ih4dn>E-g}Rk[7Ds_r6orgky|LS_ߗNa~| E)=2+0j4,El3HN֡{:&(XXǑdNU` "L(0v1K*H #SUA䁸\)Z 'Bz]3m_ 6۶){s3ݶWltb{-X]f. =`1Ȭp9a>M6u_ߴӞr,mGqe͒Vz];w g[\TJugZSwކ'g|u1qb( TGe@T0%"h;٠PX # !1Ձ\T`l% PY=KM=F%XlۊT Q㉱H #3u2 LSre ?2W\[ψ&(Iue6M̜j<΢no> RFՙ4mm Y`#a`CHA .L!-WUBtdz˵n96=.k,oZ%­H0pӛ-@Uݥ݄M dGO.=(PYT@B"PVj2 g1T$^T%h ȢQP1Xj{5 U(pDQKmkFX2xȃ(Q22@+CT 1$ȩr"-A" #TV'tu{ݠ{mRvTMԮ)Tw&QKrc a6f2-ĂZ$bU)@i =f) ,M"=] 5q^O7V>g*Uª U{`ȉZ LM i $ SD3C󐅑3k4 Ei+ EGed=P]wknli3om/>YܵcМEGAnW -6YOZeiT@+jd¢eZDг3 V; Ujz s%RA X[(ĺu8lu(.2E<4礬N5.]̬x#0;TPkʐX->/~í5xMJo2ܦƮ) x':-!M4`ZGG"kY:i 33\ފ 9e0 # Bf ^ |X/OvR:)Lߺ/'`}B UV)n_``/1'oO ܹ_] ۤdsd"@mVC&L4QK'6Z\{2/gjse7Sxn/ [b6aʺLvKmued⧀V`N%/(BC PEUeTFMp,rAu+I:N#!U 5QbM^Lͱ+FAJˢv+wD BjRF\J#+mL^:ڼ{ӡׁst.ng n"xyֺ6K {謀btPianE YI$%"H`n7cX&XK,Y]fl>2k@g{\mϧ%Lz9ܥ,JZy)OPHdIT* JXLx z=*" c1CY 0WHA "*0 MIEa5SSfJ֠ ZW ʫQ%) c .nYD:^&N\%C6a=c2W'Սuu:!u7]%t,!:]d&3N;+2cM1^7a~natgnL[ k2W~^4Ց6cMMSܾDBI'['ۮ`"K-T 3iP!+pc j/x+=3-KUMsdQh8@@nEㅵ!ÔnC Hň1KHy0d3ܘhnTm2 "S&0#zJ^7 ;'}珀n pu}<[aM S19d`hĒ`W@U7!IApOj bnE\052jٗ;c)%߿w"J:jϽKsYn檜؁וbt]xNK7}f_d|Vkto;4]ll694 `m  -*,k`Ig"X` AGS VEWd & V (>`ŽH$R"X FPc2+P e0$:@Ȭnh0,l/,[UulqߏcV҄}Jn߾b5;Ӽl]m;1m>\&21T<9f̪C̼ՐP+ЍR !H5we5i>x~k{w <~ X= 9?Zw-F\dinza.V*Mz)0]A\2C @qD ҦVQczf/$JT7H![TdQ&% IT$ULdEr )0}%_єAi91!{qDaB!Q5s^]czȭ:}1]k6L:癛]­Kb7Y/jSdV]zj6!+N5z&3!@ ʭ0("IVe~.?lGLy,䓏-7ێ-sU7SgY3inN~Hlʲ~ss* @y%~?NK|D^Hh+` #r1F)p5(k:?E3:UGC-Ij.hQ`AJCS `E.}ĸ"o'`"+S\+S(f9L"BB&)`Utrtݲۛ`2 Ӵ8lD &,oI7#,;0iT4bu JqRTdLٲՃhJ _W ޾%v&%/*pq@..OLٚmZfbu !?WqYy(Fzdβ?I:sߎq;?TeJim2P!!Kku*t !c[LUH-T`na@51oAWO"L((ݑU`QuUVWU{iT-U 4<ĘQwpsv8vu)}\s'gj}!+zxl#ԈS\+S0)(aUyec*t6!LZ.H`F_O_Go}mC>C;p]Bg_K/Ōuq'?I=e2k:&JUߴ\e{ϦvOMb^l!i 2jG 8F o 9Xy{ݧO'kk$d:0Ax-3ڈZHB-1êܬ5`O//=u$Z`| ['@}E-5aOz} L@ZK`G n{jUY8N-_Է"C?qM UJB8(2Eg jJm+%EX]hJ(Vcx$a A@ 7#Z١Jye S*F9XP ~jńYܮ] }0z]^^޼Ta -0j\aЈ aAQe7#Zp^[N ,HJ;îVBff?ڿ޷gjD1 3o){/+~ | ՗Ooش Yϫnrl:>pٙlZhTO!~ϖ~w%Zȍ!#pRĂG E@aJFز3ɍ0"P{i TΛ k2 hOMEƚ !7U7X_d!#Tx5Tkr~xݾ ydgjuR ͵Uw9TEpLPZ{V^Z6S,dQjrQ %I,-Cjf&\@6=l5+UUљPu:!PXOg%lx3/|7u9ue C6-U^TP; Ŭ+$WUoف**=B1˲.P E[XG4Tݶ`M4Ȉ&G0yT&V5B@Ql*[vS57fk(QBUm٣߈gAx:[-Y3Nmjk1v^Z4E^NG" NlR (a |'u԰r S t u;X#M+=ۗn_ C@Μweq'I0ؤȪCqjy 2ILX]^ $ z1NO.Gr6pA5H-՝zLoyC ls1I^ .Qy7{,ɼCU $(J6i !QA7?K/%?ʯ~p¡ [aɔC!J`@{o燵9̼Vu5{$${|_,Ax(Ye67SLy(.Pj Ȅ1&1*<sHRD w~s?_ү2tBxե)͟>6;Ҟx %vhbvVBy: e=$.'%ueJjs_2曇?0MAH9D $ ɥEB)$g"g2eez%se֥Y{Jla>90piDd%s`mvvu0r7v8#8 }98'cLK2'':Z '@, uOT|O_uYaB4.M)o.I2uz[]$`Wm|&?_z(xPvMh6g\Y6jOX唍_!R$^W.."~36ߎ_FiCS EMą?QR 1e}E~L dFlU|&@&h{ӵ7g I eG* TC8ɻ}HLKMY72bvO op",__-_S*N nhᬍeдm{_C?|7j~"SJP~rDh̰y* 1z^ކ2c(%PU}sPrewO*G$1-駞n n/؃f \mCơF`d])skvhdS%U:V(Οup1[-gӿ /qjS=r| M;%uLE5]ͤ*l.V/:߹*`BOE0F4f4d tJp܇}AN< 6gͰki/"+#4Hmͤk Eߑ Q䵪X}^]denópU:bjp(@PõYzr+A&)#J]5/ԯ<}&"G:6eNV?/|;4LV~c1C1> kBJBmUZ"$0k܄JlV2yܾ~ Ý}  HN Gݶ2FPP2 %zBh#e&D+B,ʽ'l4RhxqI%O^:6Txx>mqyy2nqP&JHNX"6c! T|J̝7T٠.{yc-~gKy5]JkpvO.J&R7Fyo? P(ZijTtx=98E]J-,n&,|1Pa>ADnˀX9gb ٵ9`fMN{/ Lz>GDAcց= o 5# `I"$e:ŧ:viAA"%aPg?_jsf2lfVw'il֕X>;\'l̫Suӯ򷈯Rj"TS/3H`S`s`I=[`YZ]OɷM TBRĜŬ1Z< 37 ChQzP3(IXy')=6*%:2d|iPWux^pSm_JrkZ!NJ\:7iR[GsA >S~g~>#7mvgb*Z^>[io>|wcJ3ooE;w7jEɸTy6o]f6g{?Pb EMPJShX.+yDqrY 1pefd,K8_@%G鳧eucx>jF9Bt6d`M/YTH,tkoS*#3B$&Dx֮u[`nP׏1xqoUZ]_ )ƥY78C @|aNVqFsXe[J<x?o+39 8[)H S &((ƀF0HiT ܶU^i^*UցCo5,pzuܽYHqbbs6LZgGRhZ痢k)!ɓ;`봴^\GdL V+F1D٫ȁ۵ -x1 ɜ};?*}19CYgJҎjjr Q <<IO/ߎ"t(sTIJD"թpqδ)d{=5 Nj)n'WxݱLk4F- \t1 uJ@% \?3r-uYpPϦ{x|'Pt-6x 爮+Lw݇Z x;tyDEX ЭQ~u_+?sTC%S$FdN",#.jԀ/Ԟ5n[\4.@6aYDĸ]ukۆx&NBa[~;sXrxT1[泃+XMLKl6P'_t} Qx$1~^icw{/I(d}on"ye\80Ly 07bpBZv$\}U-E wbB0Hy) sD:FM&ET`in |9G[TPڳh<}yY^Ȟ˱/OK*\cbJKˑlrt]Q5 'O韥Itlڸݸܡs Ll| ?C|K]z.e[cu<|2XK0.'W$> ,*dv,@Qp5ULM7㣻ӋbGNMтȈDh[&\fĨ0cxb1fwe,XaړXѹ׏-\7C 1b Y ήsNNQLeZN!Cjǫj" b2~L%1M'P\,j^|+xy.n:3{?{'PXeV&uqqs8u].\4˺l4ۏSۗ/hERQ⥹3&+si0LSJ rlJckq=!@>GԵy|7 Kqm9Z. $A!4k;\n-bUy\u\ۥUE$,|eV 5_ZxH&Ae zi; |t*׬k3=5Qzvdz$8Q@2 )4c Je]WӖD|O!-`=?m!ׁ g&:G9Z` ,J91^v8"&1rx\(5,4/*Wg8n7qsuR,Cc|PM#K1Uw[ǒ:u;vf8ǫ/XqkWDU(^_\>c^n1.hg\6ufut 3 ڍ:5֮M0e nr-2`5 +*mƬ@lݚ]ϣJ4.eɨciI+enM|o";6 ]|&؁׭nZfP\-I 3ErJlISt&nV]5I8\uJt~\X+F\.\Uե6 j\&L%imU(>&|VTMF5ڬ̖ VoDN)6&/Svsd.T"QŠ4תa׾/ڒx o{zx>.xФ[S`XPkSi).Rc=|i7;Me$T` %mUQf؏Y 3Eapffp*Eh+\3@aOnZ'QY](ddk֚eޜ^ sݫ[uRᵉ*O6>uux'&V[sk c8N%p]%L`q{ux_U|i/3 WZ:rvalMK#F ?d\Ė)Cq Dqm#l蚂ZGeRkUh&H:Khr5]? <׼7A'VjU"tC*t dW^m(y@vqMѪ gUzhPZ4^"#1LfB)ZژElKq4)?pw$`ɶH'y?QQTJzc1(KpG@k =u>lxݺ䥠6'(2 f)',N*S9|H}%\DWJ`rHr\Ups4k2kŠN'%-~v:Xfm*< cnSgW3#Q*pGZ)9Ɠh[-՛u:0DL`QĆdTeW]Ƣ)% 7:8c|P6uu\N]W\x>"=)/ی94g2 <J;v/TUtzޙuu[`5HVnί~ b\xhw(3&ߛo"F7cMYU9`/ejfM(l)X YK'vouBScpδ){; F/ݠx^tGwW.Oӫ1jn*U~4x8s'"<^&P䢦tP<Iv'`5P0Tzso^ nL5%Iq7 Yg7_z~]WJBs u7-b|:֬5yq N'ݡ^{~xyM[ŷ.=hZ?7^mdtf_6h'34i6lvoZ֩Pw] ٌ݅vhR͎}kPB=KBKWux^tv/_rh5u[KKۂfCʺLM\Yd\<ܬ{pjMf,o3]} .BB@#JKDU Z#] fbsNqQփ:5>[^ GMbY%vXW`v8XxTBMœANS Ar zz#j$w2n;OpkγHě{u|;bSOWVN1آ>uݓ&tVcz3.(m(nꥍ&ADke+)͏Ut|$zB7_vxMn @%['ݹ6`ϫn"9aOsS),ͨ)*=~$ ֤Zfn罕"u.]`BÈF쐑1"cĈG'ŝZ/\` T2~3QPA7Yiq\2= P~'M9feW34\~ 1.c910wx#E i"Ko\@{Ja{ ǭC@;6Mخ~tuu{aOny7$f ч>.̩qF/ 9+ݖHqRߤձ-rܟA]qWeb@/@Wq_]yq.ox{s# RM X{u9e4/@Uـ{dQsd 9D),j*Bdb7KʢAJ&&W(M6Q6mƺuuBikx@aܟ ؕđt.N Dbt AqqqS+MwkݓVT_.J/O eWoW8W Ȱ?q/w[f#Tom|9ͼ[q@m˰͑Բ{<qC'O)t;wN cJ4 p$QiE&3K&BY &e-{Pwv|N߯nx>ʭ9<6/i|2fwV(B/̀|ĩ^GWb$&bg?>ך5EqrYW "WnVVÈ |`ݸZ_ո}YT7u]沅iz,giےWՃROoe;]a𺟓;?BI \n90;6%rvuenPv>-x6oNn<GovSut0WEYv6wZ, M '/%$1YqGJ%!e ܔPd1\l4$EI2/OZ.1wViݙ2J67*zqkQy^aXXVצZ<2S@EMPl-I,Kg=\n"Fӣͻ'WUvҪ<- )^ܗTFU6oL]Ih,q]%e^}eyL ŒE&ҁf=TF5CutqߞUH(B rqe(0H r: )$C)bU)`RkrszU^5;n{X^^= oJW?mk(d18ĵB̅%$:"Ȁ8mT)AɏxeK6?4&e鍍ҫ-u ܼQ;d\x}7o;k62u$ue]}Uq!}e >,BMk>JhFe<\qTWT_I"鳼+;{-SցC [}ɸ,L`YPaVG"'h!YeRj|x"ȃ)}.׸M7n6%7 'z\3Xƅ U=—x rٔ䦍Xs.k̫֓rٛBhxӄ*txuud71 C2:'z`p9dP@(PHs*(lRBuz{2nwL9nW`^~(v!|AwϺJ9Kf)]ġFOn)p848 ξ?.}k>KeT5{#kKB-x#KE =FUj1:yyָ'ݚdrFšy~uq_gsHJ'!K.*dx ,,<$Y2N> ٚ.Hv'+e23Jn7/-oyh}ҢE9j.f Amf 7e"xiآF!7__)\5gh>):N,sf%&T*Mqzdq>?7~7޼o@o'r7x˱&7ʽk+z-'ܡ[9eHsbNW .N#|DܠM&p p1CtDR4eʛVZ.w\QA`Xo-po+vm<͜28q0MPpP0⃡4DQABWyDH IPq;⍇xovs%t6&^s?zhH9_ 6k`׾!S?? K6mfԸj UPlj>ގER\ JMIit#J&hAA"d(~jRG@Bk5Jʼ\`3o.S(8ց1-+5^.̽6)̉6ZhfqP,*MI\:*Nٷ_?SO{p<\ |ҘJ.eO=2x`- gNgˇ}_zL:gww?~KïʙJwǵ[s],@oui N'`C @wS4tVFx9#U9KM}Bs y$' hEB 3 HgCbJ-¥pT^ha$0wp\kݤ :>D&d^7'ȑZ'er0&o(PIt(PؐL#) 1%2%AФ$I$BS2M.iBL@Ok>~.ΖZ^ )h@1dyL0LS٢nL}{_@y,6?g>/~榅X.+ļ] "T0diPi TIAOůsOT+<HӀסdHTU˰ % Po᛿Ss;`R JXRPm3w3KEr5^`i ܎B@vn)bh!Md5Թc"qu*]]\$&b1iH Hx`bb,1ƢKPM /M .nSxf+Y<u |O~ܖc;/jd a&(`J7W0P"PdJ1)UAU5b&P`JP}`JxJĠ~!~}Ť*Ux(f+>ʧzݗT7O% ȃe)ax Ͽ7~d6K՗›$4㓯_ [B4G\͠ ENO^wDI |6SY c [)V\5r"Fd1 6):(5 '8nWށׁsuk޾[2 ôx L 2&*tuCI!@Mj#􄦥&Q  yv#jp-mP&!56{Wf^^xTmw[A)Z>MF9/1=PݐHMRېe 4A&CJdI q! Qj4#L]}2r8?g7xED-N]7 ;ܗGo?䟾{p}llR) yy< r"Em"' XX4n~s7+) ;ǬVd9޷<>0^}3yC#2L&n6"NHQnDf*Q#Bg#Aqu2T!\1Do4cC @Q D6jWHedTԟȵ:D" |WO:+i}rF\/ke2r2'HNP;@e DkL]Iot5iI˄dc*yF4'7)i&55ayYw T:N]9-oGzJ43+/YFX@K%7+w[u>~v] @JK4ED-SU"jjHaL EE Hr\0; FB\>5aM4I&&P@U,9}0)+rd \$EiuTQDI-m kfɘ(EnpRt \(Zxɘ,xbHѓ[D f%ԦPs L)j>PBbtdqPc:KD'A:T]B8AG #>wt$,Hn&↖E-FʊCnPM^pHyslvtu.VrK1#8ZgT,b!HVD82Q{ʃb؉j&K+I$Od"^&઀E I dTREIb 7,M'PTrQez_HVQp:LHEg/bsefeP, h&INv5rdxBt@I$srRLM"Ս!@0Q@+1*AML'&n挔8# )*q̻CY`!!xhtyr?TdހmoGHIg K@E@ 'ѫP<INBSrDh)3\ę\AU(U$!HdrhIi ]`U0f WQvEJ$K& vه׹8ʼn(> #粜tt`BIH j (b $98Y&xl*AeLSH&Fʊĵ@Өҹ_6GV':*B -"nks/dSЅT'8:""I[ƫ@'}`T E wOFX4H TWu1%2")3ɧ)1Ȩ zԌԈ0x:cj^ձa.P:vS,8ym`!؁#-o/N'+dJZS8(mF@Bj*!aFH (!\LR R!IiHBI1b"H.AtDBcri-_X/򌮺q0ՎVZTko_5:FǵLΘa!JUPiBC*Mj$bo[ZzIy%jZ"N<o`'>&+@I* Wqu8"6P/@X57t86ynKFmawLn/{\䚓)у(Th;lR#ϓ(n %l4MYHTP-b)Q.u[eR xGb~)p*I*1nN\)ar# .;%4R N*Pb‘ T\RSJ£AdNN%CA3 U*5P).tS8}".2gZLZbF2?Tʼnc78\"-R!bBx<ޔ}nx>*:mT1[oSKpq ].b*Ev'FnHř2`ƌ<65 = c!PT (ʭj R-5i`Ҁhx`#@=+ r f* .!bJ`I8ܡ%Q.N^*0є@PfsH!*Q0dn#@uD_K^2%(P@P&ByOOu'&qCZosdOD߁8-LU)!]^mmuj,+~*59zT& bIIk$$ PFNq % " &Es6D#*]\$,)iXqZ4L5E&i0 YRVAl +`8͋'Ȅ8` L3sr GdG#eqJ1"Y"jc uEdɜREb:69JYi`e,ƭYYj-aNK.f`w7O )Ǽ]i35;:}x]Bmb{T^h%s5nFxQYA Z jVM&pȚ󝫊ÇrxVELnTEr 'R"LAKnB$(ݕq%ƶ%'Fէh^0Gj',0o-"ZUsFB4k$R"hr]%1BDMC#jL!lȐkFN9JR`3(2<`%`YAxx0NJLou: qnE1uk>khr+^Arޔ4*ms`L$#96SI0*dQ@c0*i2d'NB ]Rrr wؠ( EK;QP5r4PZS+ :158lWe.c\LW-5y)"~bH`;"0>}OjN.>ju8<ՄÂ1a$ QR@ӓCY}@5 fK#>Z SpLՍ&%T1nOĩP%n& avx>&ngQy ;4\.OؙgQB#"U>$vIqnvEALwsRYyt es%)>Y M t' !)2-]&G\h/$$`'e`#8!%ZeKEQ_ؐ166cVcL.QO.Ƙqg^z{$UFJyQaHΈYF ^22Z<PB=xm WRvBNYHypenZ YK+2\uwQ†\KqEFRHR\^}NI &Dו9pHx)51ɱnse4ƓGQ@h6&ƘU FJJ=Jt^I&7/դyp‡Pi-jKG(Z"EfBaDeA)1Z*r,9RjJ$v$(cm/G,eid5Ƭ=@QaTZO4dܝpeZH!Zy1P99H@RT@Б/@i SJuq'.LLO`RdCzq^lɅS%lîy[wZ=Iqy+S6;`w"F¦$wdNjS0QHqkíGK* ̀'gޖ8 fVuy%^s)/f ~ujP<X3Z+b5Nڨ'}UpU)ԣA@zbptב[%)깼@k$P-DžlFDݠX4M…ddB䔜JBQf9i` hUhȷD ٙЧjܖ YY ȃaLfWG,#GJޖ"d}c )CNMNP:?bzR poT!u7"}van^'ln#\.^#Ag m-0nmm6&2O,$ApOq8-:Uv-,σF)^.\T-6#0ێn.;|}pC݆vjepcqlw4E"^X݇'N'u]0E5#^^5ɅY-$ʮ4@o9zpÏAc~P? w'nsnRz`H2g1y{ 06AO(،V0QJ`\/j+7 &ȶq~*;5`J^m "S4@eV9V"W9V!"KTʟpY:F)nMބW'>4M`g&R7o+EyO˦Fm f.*0M^` Bu1uWsm> 8gfZ=LE v[)I,,Q#EU$aJ2N!ՀOBeDr2 YIyL@rq:24Ԟ8E9LEUnS^=ǤԈ6S"YQCוXYKGo!vHlOV I ͹),F)LPc(?6O-$24˱^k᫐ z:}Tuۯa,;BCѽofWA7 =Kq[`"YL9!`TXc|*@-T̀NEaM`Qi+3*1*x),qz&S_aN=EbnQCq8D"9]mK1;6p w- $Mp<>5삔n0W ⬸9+OTq]I^71 z>15tnZwxޱmm_ɕ8Bk,O/Oerm*_M^Mj/odVwv[LC b 1X'xEmEM]6npq]nbukP,Uy7Is< Z8%qy|si,MB m\w'@vl97+붋.,Cb=F/v *,Sun{VTv-=pm3 Ӱ9[.O+00bVOڭ7!] z.Z<\772ov}Ee-ܑi.Oqmlpml778/\>2⃜ܝm䜿hѦ+ ¥QiɅuo&ZvN̫[ gywyZBU<ͶQʠk×l7di6u ¶,?-Ew4n{Sn7S^? wWz7 NseǦLatfy|7szA<36/dR,•wu*^ .πa z@0^3Z}lC)KyvW|v\*V..>69ewP)@ f$wyy]j{!ħz(Sx|RB<[{}& xoٞRV*nZ11'@p,@`CǯG%Z9-C4mQZ0)^׾SVix4܁}-~@'tOѽ߫ߙcru|$<9T .֟b_mĖv5WlЋ]$v|⯙g,ȇwnw_Bƅ 8\ I=6s^UuU͝5տ7+$ϛmzN;@Ox~2{wn>ǟ{. 5<ެjgu{u-,qbNnɼww^-a6=9[*v] -]fU*x{Tɏ?( GonEe3qR>(‹ h/_)`[vӇ7~`$:^~oyG\ CY=Tz[۬{s|c[*=7n-ܕ26{rmU^6jmՐgwѸ-/ѝn-誽rYUyu>ip7S, +Җ-e\ԵI*x^ȧi?W:𺽀 TO 9LkMdiYq<\B~+P` ڨ]uu wx}Zn٪//]zJQWu{NNݝy =춭z lU]p sOr(2k]6{A]܋nJR>d*")d}Qm]] ?5?ukh]s|O!o!.Cuuuw[rvg ZAmk)!{rUo+5؃*X =-PZ=sx!]O Z~#cڬN+ՇF]5tgeR֟ T7$S|߃A@`ﶪ/}srP|c<ܣ{ݖVk`|Ҿk).ueŪ:B42+' 5Z!r*haVM_}>tRKS+Q| \^xOg߷~0w_WrZ=+GAx~` j[?V[_Z_.Rխݘ-8q?=^Vݝ kެ{}@B O)rs?Ys\^xڻn.[!k{^fV;{ln+O B-pqβ< [awCⴉMϣ\$!a^i׵Injoٷ~Vo~o5Nn VI1{7*nAP\}e$0dk_YVUAplS7 ?7(+xx^h=-r_ܨr#Z{?5\+C;ǟ8{m_= iڟ)|@p(_|ߺ]uB^^x? =ᓺ\ Ru:vy2|Z>U{^XWWU߬Z}4Ã.S.{[wK79@l3?'{߹wݣzȎxh_}Ӻ7Ǡց\N(>˿zx۳񭟹~!>xg_&o4&ۂ<5xʕZ|ׁׁKZvTл}޼?sxcÛ⹾/aнzg|7f\>;::}<,xm+n 5zv_Z,=?ϫno^{ ҁׁcD$}/>dH~ yx_{yOJtO{;:}4:c_l<8/=s_5o~V: =W~E^^^=7޿_:/y{O~-&ح@.Wʋց}8ވw^/I-~tCn?}xAAE<<m | }ПnxdɅ*H{;j_>+xx:^@[gϏu/WX$r2_񞟯lA:`Sct۷Q{Ǡz\SlAցׁ׭ bTU-^p| y١۪~e>zze>˯$:>D6[ Xf IvԸm|>^]^ۯ[Ͷ=Nݦ]_Ϸ>qڿ}>16!;[Wxݺ}|lK@BE d* !Z4ZMսfJU`U-M 9w;橪+_cOl,B kT5qRquc/n?cۭ֭],tZN p^\2.MUUIu,2$0ҹê}? H(#ٖ/* rDCϡ8-WYߡnxݺu{/`Ǘ1{B[y.1k&ׂds\M|l!ImU!U\_C:<桬E/94Bkqrl~:uA|3`ܮ2HhaVxl-mAdoVfޜrUZMD<lkQI:e<~u1dZN~nݺlSJue*%WWT@Se m B/Fij\%w]ۢ\ݮd,3'[Xx tl'׸JW[ VG_Z:#A~k\vu',p~cqo:\SBuU.T8'P - P}T=[/oR[~zXIR(˪NQ~kzt3=.kLK~Eu}%tA~S}N`Il@R-_8d~[P*1hmKڲ=VϙMYDM7#k??]urlh |{@EAe Yݯ'uSz4mnCin.bu69-2?<~}lվxs9?]u ً#0++mrQ!5f'EXQ}cx@Q[MM|.!KΎ\5*jU7eufͺϛh:ݨv]z_nݺ=/KҺ\JªGv'i"/g:,܁_W<.We ecי ~DɆ;6R =/L*EҪ+^؋eˎ+'Ⱥ8Zw1~زE1ߴ_֭{Rxhr`dF)0 =zF@tFyd6t1U\STd-+\VX;T@Gx}]pbObdCȟ~au4RYVtOR,˓._œ9p]K쳮;4KмC~,=йs^rm nWxݺu{Z9. ֭+nݺuց׭[nݺuu֭[nxݺu&xݺu֡׭[nݺu֭[n:uE֭[nxݺu֭[^nݺu׭[nݺuu֭[:u֭[nݺuU^^nݺu֭[n:u֭nxݺu֭[^nݺu׭ݺu~m֭[n:u֭[^nݺuց׭[nݺuu֭[nxݺu֭[^nݺuց׭[nݺuu֭[nxݺuQv[n>[uu֭Fuׁ׭[nݺ- Bnݺu [nݺu֭[n:u֭[nݺu֭[nݺu֭[n:u֭[nݺuց׭[nݺuu֭[nxݺu֭[^nݺuց׭[nݺuu֭[nxݺu֭[^nݺuց׭[n:u֭[nݺu֭[nݺu֭[n:u֭[nݺu֭[nݺu֭[n:u֭ƆIENDB`DisplayCAL-3.1.0.0/DisplayCAL/theme/splash_anim/splash_anim_13.png0000644000076500000000000017261412647526517024360 0ustar devwheel00000000000000PNG  IHDRjSIDATxIly݉fo!DP(*tc i!Ias \pXP\p(Ă4 UYPSfdf =w{_fȸaf͇wvTRX+K~%W%_ũ5~5=m/~2;gC–K|'c}tuYg1|ݏW -'£j=Csd}ֻ]П`t r us{ Ko%89鴻9TJS~ \sR)-nK,qg\AH v|q]|_Ǿ%o%83na'wY;V;uRy~]؇?j<ʒ\K0МRNj:U?i9yDsX9')Ɯ7ϵ2-= LoӨT0z05T_q}7_ e%X-S:|s:Kmy@s{ g6%X'Vx+Cwlێ:f~TK*sK,yq YS̭Y|--[b%rxSz⹛ 4{K kK*sK,ͷ}.!5S+:y}o4._/nK,Vq.xRW}YX!97.[b%*^'Sɻ)ey%Νf__9,}×xK,Vfos>f;Gܥ*:D1pz>>حîL|r^Kv)OK;Ӈsh)SaWtDY~K,1޹: sm1>&y"kk |~?<;z Xb ׁSCawt )ڇBuN*[wue%?o%ȵ@N(9LKw+;wCAԯ9^#0xK,^|O#)9 mRoXܿ=k6PK%Xx}kU{WJp;>s V+Vsݱ&w, Xb-tc0>8Εcc7>/_ vJ팽X-st9~=/u]9ag35u- Xb;Ƽ/R|cm'?]ݔŖo%1ǩN #Χ5Ҝ_>Gܱ*8|j9{?&,K'vcb};΅C&scFǾ6nim^My7Mvz[_K|S_e~Zަ3]C}QkZݡp2v-W=كwnWj!Py(\usA|jv vs!jW%k?"j|$;~Sx>Ԩ͠R[KiIx;|2z*]*Xz)^ JJ!pΌȷUQsmǒk[ew؁ə7oXF X+N@S)CCTۨ vG_X:<ӖT_,[_<CϡJ|*U6>I%{ Z<}96[PyK,[bj|R·ɹSuc@}s7S?/#kO gΏ@Nwœ^_\ XݩC<ywjxxӰ;Uw,}9t%+t3.b1[ιϘ[k%{#U@Tsܮ׭8WyK oK|uyw\r¹.1jS/#mAw930UvK|͙uw~{ʍsNo)}u݁{ v*؎/5xK,Rmo oЯ6_4)7:a*s>lμKKex6 X-ebv*ulۀo| 8_2yKkR+G@6'o>L, 1ȖXvMO9<Nw1mhS;S*'`G nS:bv}ƖC8},(%*Ƨx Qloчt^Bh;x_ew9փ4#nx(%ge߃g|?}[Z-k=|=7D3~1aq1e:PvsEwlM?z{K|UMdعO]d9-S1w_^c#xK? [_xU=`ֹm1M$ws]c?gWcOnıÅ7*, oK|]*§R|}O->baF77T>OaXfwv 7oYbK|%'k>P1Qf7Z*#;P͕]Zo%qm!7ՠj x{h5D@٘{s3K7ӛʏuevavدopwLoK|uŽ,c=V10~h|k7;U;uظA[ o%S0ɞ ozʻhoꊚ>|caW桪;vƜo(?֬Rpg7pf׎BxK,WbO@T5OW۽6P#g< vv{NubjNwcή?"~K|S2yy;.c_Wnt;yn<\ӝPri* u;ݏP, X+oJkۣ:Km!\cV=kuX}s2ӘwﴻqOu`n_ go%q}oA# {NuC9ΐt&C؝yP՝]n ZY_ٸ*wxթyXǼ_>DžkwDC |v?@c2HxK,U LZ1[B|5&Sz j8S r߾RZN >^~l(|ʡa\,vv7#>7չpnK|euIONMos76  SذCuU%n#e%o%jjuNۿO{n9ȌSǦY ^k:n~yȰ|vv%(%2}#WM` jyY{LuuN;Ľ\WW{?O8n,\w̹ώ=#}? '?N4p.(%ªr?G+n7_/=<~ cm u]7T桩܏(Sa TnFN,o%~`w>]k:9lT9Yyvp]4Y˧kaKa2V8^;6 cwiL~cIi. v9}i)YOxȻǑ=%zC\+#n7 kv刺[ÑaG|v,R]j6xK,s=ޏb5>SzmǞ5ZߚSǖ;Qtv 5|,qw,)%rFվgi;i :dܟ8rx"+M-=?tVpc8Puݱ&Ca*r?#z:=3-ėL?(<~7vCǷPb Љ7 xgTkx^0rcM*gd6؍o~#\`o%~@xxyiۻM7esG(#'SNv>=⾇4 :}+Ta32λ4Osw8xz; '^_߮-M|ƕxK,e9u6nV XM l9h O=-LWEVt,5We8=`> ,]z{Ęc)y4Y1I[z5LTN-q='~?i]v X;> r0,6~q/9=nRI5ҟmm]-rq``Si2G^aJܝw><64^uQoo2K* X˨ǚY@=)3x>\zڔ]3갼5%M njv*g:Z//J;LYqd~j)ݴ#w*%-ė@;TjiFd!3 f*8^3'44p}5S`Uk?c_ØNߨ_8\s0Awx|y;7 ||â-JgwN|]lݚ.qګ7)cSZ~ٚg@ܑafGot#»sw8e>ew`.~PT1^el%mޡ;>\Zo?MIhpwS}s.#&_}[WKq_4@/Ewl ǛT^c# >pJM e%*c YAn`yMS+s4pnc;L=|:1Ee@o S1@pz멡ܿF_o:p;%o%;>Ecm:OiN1kUޡn *waz/~vo Kx%~*[:wօHNCx-e *ljwU{ī׸UYϏ=cY(%"sTރ^}`c=HUl傻77q|+4~'_౭ocQxK,Ǯq1v0P ݂ .ZN)îLKݟ4c9ԚKtWŌo%hJ>}SGvL'hTfm-1_Lwv7Wv) x׿pt&imK|fgi.?_u8( 86^2x /¿ě_N`ݗZ_L7MCB%67샭:%-lw7uO'A J QQ9A nm) npx oW? }✾RwGv܅o1u(xK,Twv5́3M@t=G <޽AK.n€Vw v!>t*sТ-ėt7 Z=7Jrnps:kn# !!0~ YjXv] sNr{n@xK,yzN~D}[:s8Koj4` 1`1*sG ;͞0"B#kXw߭;c jq$qm|N͛U{~~op2`O |jm,֎vd͚]S~@ A!_¬0#oft| }S;}h@V7~tp%5ˑa9L]o`%?oŽQߡ`j>-,T\>G$HLȱVQh5_ٰ`s v&qoJS0<ց3!Sv݁C|zwyڇܖjwxxK,ł DX泔e[p]P8]&|!pTtIIVHC}n/D>N!llIȑc |JpxlwFn]Z~~'P>7 X]v>SpVE[_F*t\PJGZ6$5@Aެe>4;[=fg& A+SJ]az.-x+f2$>>t `ߢ-Ļ̦l@=Ɠ`RűMh1uv#>߱jتB@mLMkkUc T fc='VzO?;$>L2*m^!-[b/}nmޖfM):Tmm |5L q;Le7ȝwo%8e=i45g-5Vrn&+ڶkhihܔ]m@bmi4kvkbJe6cZmN[N@S~WA'+ TUQP[-PL'ivcC=zo~0kK|ـ@>cnCıg)@V fhyۦG.}-__ 0V Y[cd9֥)A(*R9lGv |`7V໿Cl6';U~KsK3~>bhZL{*0-i{*f-z4gkhv柮i$/P3'+S8!}_eQ;&wrȍWWՙsx*k%6A\eTzƜl>Sg5p뿛x z5*ҟQU:W Z.4'(j|ln`Lc :uJ=zD N'ns2/or9Ώ)ᦩ;5YLej684xՔ^h'ЄckRvnIڕvhnټš #nx=#wjOָ{;/B*sxK,{#nMkPuM_lS\ jSqzx5dUB8 "z=R0yf̚)LԀ R|U6)=̠w=ю(S{RCaxሰE-[b<z@o޺ܼ-J`*m[+0fe(3eWv\[%cY!PeW%'U9ukrR~SBڪ20tW8+eTN͕[ܞ{Q;tPxK,{w,v6h&?Цe0X.@*mbK2YeZ^ŜT^>ucsM JqV܍<ہ7 ;з= {s\@,\'n'GkNA[ߜ:-ja)a[Mݗ5W ^k6LPd@2MbL`l*ma\6 ,LL+c3ia${xw]F;V1]FQQPQ  ![yҬ5d=z7m{Q%_l}CCL/]S4ؕTY ovOx>S-Y*Mݔ֚RTNvewfO:^+k C0I 0]eMbށ5y' Š=e02Z/_]SsnܷaP k{oݹe\Җ jŽXw謝0[cn͝9Ƽ}]-٘}n Umݼ$ rSSTR]BFt|:-WֈW`$d9;EMI`Ƿ𗃰 @)re c}:yKݥ,x;=N\%{*O=z -l CmZm!e[U n0)]*s֨x 4A0%Xǰjv:N|pkY;|S2 o`龆c\9&3`e7owK?;O|ٍovm/z~;8SS ӷ)MSC6,] jn޸2.-ƈr7WgiO.2k=FX`ͬQj ͘ME$)B^G[ǷOxyTcEj[%{wQ%feەZ S3&mDU A YssB=%]Rv7? oS' c5w7Ln ]#[MVudr69E[gc&Yʾ+#تHHxGTEɜ mL9ky賄"- a&wC?kw|7w/,OAmQw X`w{z쩯Μ&h։mNjweV[u7lkBv+xoɮ3V5IX͘RXքb Pc  kqdkfz3KF8T!w_L=%K Yb?;G՝ sg8Uvf:o%M_ {&#z6)lyƜ[p^!-։ h 5'YWW0NM.9RڔȜg׀=Z23sg V+@EcF~mu];=9Kur1/W)l77sJAd@P nrHD #b5g.px]*/kxK|!T[oG[oڝP[ pƔ]Ǧks:O݅),b69)Y@]-`Ci@ i c@H҂ϱ)0N /!6v.шpEÙ5` UjxK|caw{ kEw5sgina!fI, mܻ>RAٝ9+hjTNAlSu0m3[ % zj0AMU槥RhSxOMۺPh[ZMQRYE js%o",  u! XnW=^t8^l f5I͕ݪuk>fx BI Tf$f ,-Uy= p* D m/vf2!a-)pBK&pDXu @a 3p~TX5xTK,[˝|&x<ݙy=ƶkvvq&v[7.'\BX驥0\EKkah)l%ru 03l #X"472{A2T!]_~6Q,MBAаJ::40 vz/W/O_>&_ {?s;3m9C.qm<ϩ*6k9p]dVcKեmΊ35Us5sh;b[g~mrk4^:dP4Uֆeen)\uJ톡aaY jY%lL7ݍ/W7Ϡ5{ߥ<^ 0-CD;~~D\NSSvfr5a|_yV aK@\>Le:Ph $mg5@g=f`Ml=pvmK6c!Lplrlm) 5rG*U Q[hy_5舡UK Y7k2;8_|>ЫI^j/>/u-QwUPSxAn g۔ڳ2tn ~US<es}YrJJk.m̰QoWeʓU3xKcfmE=rHĔ62_k 5bZ cMO]P8Pjr( X <- C 8XA7k3ԛ g :T{z pzxK!us`w>2(dW`i{ힳ@Xfݱ[=k=φET 2-@Z`jLۙ r۶a+b ø:*1l7!Ȁ]nPC(NJnp, by`C"t} 7+X8psn.n6}~w)c|lO\ϭ|_]nn=ۜr+wΛ&['֒6.=x9,:Wb4@!QgkPݥwz݅mWޟЦYF4 Q5W & VpY6PPTGՒuaGK/ D.%y6l/|ݟwLٽ[W'}(3{CsWL}wb =B3yPl>fD v m4&B%8f@Ȳ*ZvKo&*}w"<6Ee4GKUmSwѡe vu YC_yԯ~u dWߡyQ wZ݆}lP.>jd3 6(wue}e; 6A.SixB@1lYQKBB$ĐMc"# h &)2Hm# $ٜ 1os[x cdS鍆Z3Ygn/Fm.KX_P<5vl)w.}ܢ-UwΚɇ R;uv6P{0*q?iҘc.`&-[ϓ.pHy&]7aNO_9l 62S-hF">=z] )l?ߢ-Ѯ} ؁j~xSxkow.9o"{kJ;ܦJGҜ3;;F)g9@-ӌLȟR֟G͆@T~-('4^,Z4_MCMqsP<W ᣣVGVzYcWiKؔ:h\@7f__AC ;Im~[HE-[ RqWvA;m;Tu jV &)2 ihH@g15hёzgoK+cK,[sQr+Y^^^>o!΁Tz}-\kn{O$jzT!`"]m@jU`pBs:V|z.4vS-q'\xNeX{lLYʊ\McfMۢW1@9U # @kp!c~o%(Vd2 ^1EWr6Yzˍ 7kh(sE #wc&X{;gOi-[ v&حzpT1ؽ~ 1 +Lӛ[Zq9vpJF,{ :k#H8 P2T]su pF[gʃklm&wd TZ ښ BmCX6()zAsL)4VF3 fUF5Շl3AR]uvϮl$|wh C Lf 6M!u߬ (W.sA޼;RB8]Zb_gn)yk,>7NM&77بA5G򦅌vFA:Af8CLu;jo ,\ z̧֩ U"WT"`6Jٔ~$f3SjpK]0EKgh23"{a=-"ǚnfuvGdDUmU׆&rKm d7胱=Pz6F& ].K Wg*=I;|jo/Igy"Gy{WV^o=xb -awsveB[ewڰ</ (0SC (2Z X(ТVká+\ܮs"awּx*~p(!L$' sݏDZl21khekbtSz}LR69܂Y"z@A#kd I]$ U7ʛUPחUn~gW9/) g/2rrO-{ufa{K1Zj!H0"jtGH4p ҳ'c~׌[Ӭy@ C1-)-Wm:%0bfнv׸)@#6. ;XVj7%= R{wg\b?pd(oSw7wU^ͻ5'ؽyv.6҅ޯkDkg٤, 4V3e C#55x$;ₓ4Je7M9$f&Z Lv2-M1V-ӛoM  JYL !*:8-Y Z72ds4_lʼdˌh}uy%x: 3071ƄY0$Ϥ.M S` %o0OF^.-V7zZ m a1hhcRKv@3CQV$zi^LM1<[z ~|:a7?ٸ^Ao^˛.'m.K3|gQV-`Sb-ZȢ/g kFDA9oHJB)3ʑ)" dKn Mh1d.ڨ1ɝS\yeӥZ lbL1-zͽ㝀1ebpyH-DgmaO,bD :Ĵ6hm Bhd)MF7zF 6F-Km;zo\ 5tjm^AKm>~)kqK]ooL^WoC  シ̄ޯ*nެ׵aTj&$*S͖@0䅒J/PE]β71VJ5SY=a=d=tԓeb#gd Q{X7wi 1Fc nֈDB}FE*|S1ǍRo{w mQ} `wW|#{~/^ ^^;٦쮟< +X-;7v`&c\iL[; @.-#HV .ҙ Yl <]DIQdk^:6s 36aUɚ$/3ΠAD ur e9ˡhVxA!M7c ky!w˴`#ӔV#XJs9,P(x@Eˆ^ `*m&wurApCQ `D0H-0hmh!i0СTC2J3gT1Szsw׶'-)xK*F>;_vkb4;y/S٭{YBl cɆzk2`}I73dٌ?xBV l w(*=;ptnYsFvj,9&8 TFrٖg8&KQbj{4RfkZ@dPeBQMv%x%mިpI ̣m _@/b4h(b_X.Wj7~3la@!CP,FKAzT0hŕ{~m?5,ާSM+K:r_RSU>g׷? UZ76z*ى+s\arL - J``+m ,Cfi; Z2A;3Xi"ewg.႙QucNJڜm39b=:|AΝl@یE]IY YMY1J6Yu,"Z k#&NvMV!6# FE:!X&QDE҄7kApëp+0Q6FBS=]:5]^yH9,kj3WzC齽-1rQl )o15f:Csm֩ܮm>;0Rw608jqX VCZ\SDK\ eA $A^eV 5 0*p䚟\J3 nW,= YvnќPQϼl̄r!HKMU6K.RE?pMM9/ʁڡ-mNM6d|@OAhQ(cP-ЯXW|9k{8Zh j4zwVjtEAS7RWU)7O>zxKs%qَ Ao /M盋6۬pXW`@ k6WX̫la)m2LfZ 9+%#!`')` ܃@M^n9<Ҵ : Ôia\JS@42B1 5*f( "mEk4+? 4, BțA.*dI\p@Ξp0e6PE1TFB97'"V!*Kp`A@(Tnb;X{HzI,X -eto?nWϮb^_nwa57٬үSci0LoZjSeEjF%](Gw/aZS EUEɊڦ:lrI ,Xdp܁G7˨za;-}(g]ˬMV!10wTB&1v]B9(\L„k@aZX)Y:ə>v$ !X 1Xf "kFC0T Zk` cx>? jjKX!FG0!4v24Kmff4J]>jen[1q).[];Df5{7ى9LiNSVnZ:997M6S ] 󢄢dJ Z۶Cu\xcj#BpYxh{ܸR)8N$etd 9V>xv3r6+ma|~r}@?H&7Q`v9<ʼ nW\f kiMY>No12{U k rRhR;u$W6Lf?F@`‘A5l`A ΐe3'#rB\DB"T+ωpWڃ]jޓ5e,[;ݡo?}|La^^gf?}:)Yu_"H$'ب8ځ_ú^`-&G#n(dtHf0f!`լPr 23SXJsW6Sō"2c۽x3~5.g;з} 9nUJhXՖ#,3U(,5KK޷d9v: x= }=^fC)zy VDU$A!iFYDY7a5BD^J꺆LB*]5gjk>ͥ/|T.ކxK4a|7z"W؛+@7б5?Fvb`#ee̚ݸPso(h(k{hmt5pV(p .703KE)WXDXIZG\bU//U\2렜r81uUO Zcv_fCE Cp{SYJWS>+3|à~TfnMGlAPp72ٝ1hk2!n60X*QHʲȈA !"d/xEHVj.u*+$|`]rpyeTNݗE,fxK<ۻo^ <Mӂ5E`Xnò#_\Fp,`,씧p&PKreI$*@f YeBud :`~oo!6]N?Ź۪٥^| u7C? ; ym}BmjS>T4#{LTN`N*M =Aa#ȁhQc#s>2*BEs΃{!Vcq *ԀY xDeKKٛ5\Қo]ZN` xߞ.緧o',\K䔩6i=@擡kq ;zuYC6|NY2EXWۢQy騆Ղ\S MAVL[UnF 0ENsABeIԥ.q[/$f{An )96َ:b ˡTOGNu@A<"].*}M2@ ՟x%Xj4T@O@(gp`8l`D8r UIJE)b L5 D2hӄ"$-7)X{ o^zǤW<ۓwo>YJKo4y/9Vvv\uW'W`7&K%6se)Jʫ(.'PP\pGw'lhaXn2ur%r8GYj{ DG.[\ R,\>*:Π,Rsm,i-)Mԭ{S|)7'>B)#,` eZ# hڒsb2)!,śb1 OF=M  e U"FD*ŊPPD*EXP)`T XC Y)hV6Rt_Ҵ%o!v}'aw7\Oe:ޯ҄3nf? bX/rvSK) TT. fW0XMƚorJ.0&0hd2f2Z ZMlA8\mSTf=[`7FKM~S3@zvo#97*l3#-nL;UߠsA (z7R| X^ p#0G BAQ1*#"RUcP P"F pa*E*Q^e䕥1B`X( 0 !go2M~\='R Yly]@Y\ԯ[Js}'1ߩfr4cl.9sI Ye6XL^ VF9FOuhfRyE܂t7XI0l4Μs)9Da[CʶFNgڬ71v4u295n)Z|m;ڥ duŷTn\k0j($(њ' m2ڪh?τ8{9IZ*3qi>́hXVPA5\x&Sjp=WK* Eje/g;.ˏij7(9 cIi.[Y忶7ϳ!en;D !wyM*=bڴk ZUjk j̆Ezyn-m,cN Ý9a*pU!EpQseN׾?BY7lA8ݶys>k*ϛ{5x1鵋=ߤZ_ಕ el(L7 s B9"?o6P&`= pCr8$ 9!UTU* 1Vp``2 -hZG⤺U1teٶ]B.@-Ub Յ +~*T"|/Ӓ\ēu\Ti͋Td*!wq)L lYH1ۦG\]7K[3VW+U ,e< J<\֧JsKec5Xl3!oῄQu~{>~I9)j5ϳR3ЩNpS쏣0΄ =7 3 Ɯf7t~T:4 FF+>$P0b@ HEl" ҃'$~vHi<.1g2Ĝ"SpZS͹ l aW9^ TGjC+b,fM\=w@\ݛE-[v?]˚f8t7i+0ݐ) c+p5%]­9KSKJ7Q6Y % P^&_aYzsxK<$MsS5W;n֙W9a_Wx"{ n6Vr99U+oWҤ9<:vUEReӶ@(H d!aLVp:efitrt}>. 栛0s&&9hckViVAU ,*>_#b$cPdJ~dyگQAFFFecT.8T& pd!(黋~ 渕 TUXYs6+GXeM!3=kdbU;4!kЋKnI;gk c!UV37k+ R}oMkq%~WyE{S:16::QF]-u5[g^Uٸwϱet [u7ȣWZc9[J`s2WƠoeշҁr dsMӼyeJk6kA)9k&^xkZYYj;NM @W'ҳƋW!:.A&&՚Wf PV 0/<)L%T<*V KU!SVɢ\I΢*bvB00T ~1P;ZjvW ՈaxR7mho3-xK<;ܬom/6LUN]c`np4ts[01XhzaM>aXQ'٭1ljhc48DPM U|7-fWq۔vM*ݞwXRӮ+S p2k\9㭼=Vx>O߽,!B!rxt@|ܭEUR8ȭbWP9 :RdU/$3R"~c/0d&;lA! n~;Q檬 z*;AC6XX` yX_'7^T~~z w敟-b]k6;>t92śv2tY[oK @̔f4XWVVz1t0VT%Ԓ\D"s0"<hG.q 9E@sg#d: ioۗ t}U76Ҟ 6SqSn vs`uԜRS,j;fh*tm~>_QɏB]`0hR:*QQK[Yܪ,UTU5sLLBfJKƦ^WieR®ݬ_dOWA/>*êa2Y0t PwaX_Wυjīυ?>6>' ~C9* %xB noaׯfP2椔R$잿5=hYE9%6*;#Wc6E˦&./4SI;i೙',MW3W\r\FcEw/~:_[K)Ҕ8Hcb0KY s3s,Wu̴ ]cKkZ;M/<˗7lіeXejF)THKdРb)*@ְ"2T%q- = )barmIAVc,˰Bsb`9#hPdn b݁]c}z(}`(pn.담*y&y|> { Ėw ð/Ᶎ,oa*_/_TZr +Ҭ> cZ6­a"T8Ma v# e y& Cg^"{ , ̩- r-@*aggWs%gL:8sv{ΜU{Дf wN٬G˓޶'~mI|>#鏒fxu ƨ@9B'P 0VF D%TUDT 1 WSĐYPdP0 Pvj:aa*A5FXE3Ts"n=Bq,"YFjĦ#ش˛ CR q x\x󜸹8$cO>v`V;7-qN>ucn9\G*n>va"tnޔaWf+ZYVn5ϡҦޭlQ.X.hZЪ l0Wz8ØBD:B;FVMIo0nJ4/Mk^pRF&b2u0 v.кj ~uҘրGT6i;39>6&+Zh6$l7aEC%n/#|3Y˹` (!;558X1jCnUa5N!(TP%j67o" ۚ>eF3Z"ť. +rئHY=aS }w*C.ٵysI 73yu y~7'mQx xWJ?ݯMhݘ ~o;c[orEOOªSRj(UKo@.2̞lD̙j70sɢ4bAijf? ~ݞ7}tynϊ0nJ_>˼n?vyN5.9ݖ=P Vv}/66 jLeD`lZQFH>>AHK1[+BSҵ$D4aIJ : +aBV@+:3̕a;FB_Mg-b(Y7+ëB5ͅpuI\ },9g>)n E-[%9cIe6?ޫ!}#Mۉ*Ӹ0kGܬ4oiR}ʱcCIA!(@ f S` GLs(y+hNy%+zP@ƾr*BBodSnt-a574i+hݚ)ͭ=aHB,x]|?+ Umd.YV5>CDU Ř=ƶ`Tlkw VnA"\ ۔R S/Q*Xjl `7 gJsㆠ3T6EpЯ_(7۬2_)w9B(xK03mxfTW^5}yW )ϼMUZ3ye[*-]颥CYnJ(`[WEr>LsزI379Df Zi6TE.Q0]y!Te3Uw ^0b( ؘЛ}g8YL͛K6UUˈNyn^Ĵ(xK< `9yқ7!5%7o綄dchMgё>L_f>sh33\䀅ɕCP91:m  Y%(qL]3*rjg$[%-} J(dYKke #JR.d.!S01m( mƳKƧf1thN؎™$zc8$b\% {ci r!9ngʒaY$`<W9.LZO23`0FZ Gѝ xvcG߇|_M*]qvĘ'SJfiIELv;iD-+|vm,H323i@Jhr/ #1$HugjKSFY@Fruazd =&6uiZs%SJ -0bBrdHO[7b@=n) pcRŘ}JT?LXu˕4/BP% ڣ:kgzoz:n0xQQ{ & &lha޾rئNUN܏_[v\V xŷUK&郭lR1 9U`G)R Yr ,Ybh"54ULnDCf0*sѮ.My;P~676{75c*rOh1Ygu;Lk GUXs6v]o y^mΩ6WKNK O=-i(@r(\N+"geCia&BINu<1 0ګaVw t~B-m?90iRANi3vfn~ ds7psACVdS%qI[Dg3Fˇv5TD&DoRo<' fɭҤP0C̢T Q+PꀞDOjLy =P7 n(n:PP~9k%01eԺ4ufAмyi t#V1\4j#JvI@E k[7_{P:`? dl ߼2O},95xvUpfO-]!:vˬ=46sz:*BMKx$Ze&DsK聦19'244&9BNбc k.j FT>t#cSQ7&7{xeb` R?A T #фр<˔h 汩+窼f mxrZكgJg!8.i߬ zjKd)̚ݯmb`Ȫ`FLʫ0) Zw8uPK_.p"i{o~}cS?>`;sx>^ΚUfm{XM|0p1br]|f&1e ' ?D`lRF!1Do&H\OH ֖[7(cDV`q5.q)bY`Mׄ>,Q5X&Ʊ+U7 :Yb0Y۽ Bo@B'Mnٕ>Gčۼ._BUPN&P%HhD3&2 kDQAp@LFH3HUL T$l^|ow^s|q#n8,nxx~ݿkǘSv=v=p{e b M7tz2T./Qqȓ>hN "*ea[]$H z&](]H:- -ѻڽ}3YRy;%dWcwmg9vwtKi G})1-\Aإ|};O={G}AbE؉R1Ĝ.h0Bm$ ۞䈉vO9YPKE6Vy.(@G1Bvl٭w>"?JSvpHHTwb@*YȘEQqcE^ݪխWP{uum&xhd2= \.%Pvk !˜Jl) "*%JJ .AՒAs<$g(*B͢5&uIR.0Tί/W/ynBA< d(?{ \9YkoN5 SƂ2=Krz/(u@q!{kcpX?{ ?8sPd$d&R`@g1G"iI@0 )E Dl'Ķ m4s;H D$aܼ *yeYqq2лƄk܄tw3T&pF Kb ,1 jeZ¨HTFL,dZ/7w0M`|H.wkۿs`q]HqO 5MkP(mZ='9MN2W WXyoNW=v( ISaLbH0IBdIp)2K&Yˆ"&+[`M$M.|(vA}1w"PőykT:#HR]%Aɫ{BU+D`2#[aL ^z=t&}&<9[!n 20Ly(Q.'`dBYYx2IL++F )hXq@n}_z?pq5dYK%͙}l\L,W  pw|wtvZ.ԫ!Qco d}:p) n.E\6~->~j!]dQd9eqYiNg8q0¼<*!vG^.X"Y&YD" UTNZq2j6Ӌ~$YT,ܻ~l`WoU˷NȘ4 R< l?|uJ)Nပ+`:\9@"?䏲'&I! .kN*(}ހn*"Y2P!ESq>Q1>X2œ%9Be˾R{K782&1&:Ne*.*&q:0C W)CCSGe!eXD93Ns"C}D8Bڪ#CK:+MIG8\tz-nK ޵YnT^W W1@څ+s=T鈭 qfX4 fHƯk_*q1DM=ٳewHN9V>~H9NgїH9$eDV΀=[y`g&yhܸ hj(= qE<1Sh s;BX~>™i`MM ri!U uU_# =ݸ{xz]/ۿP/o\i.)PK& ` HR#Ha| SjJK[ BLW[k::=\@+&OwnXCO/2X+t RG@|=\_Ya2-/m&}cۅi0/GV\6}f~N*i͑ʟ9dpcd" }'#i1 A xY0+&22d pDPDoH@Axە2!F- 4`C,xA`l1Xdrx^ jMy28aRyYnk $ %+XJr0]Y *H)܆ 9SU@w1#TW^/ꮵ,1p\,*R-q y"*8pYnh:у/{gy˹qebO2 #_Jz26pڣ{>iF%Xlaܬdy[ rDe>Y6<3XB`f!> f' f3 i3p`oYd6ϔ1c d6 $Fb,mgv60ـi']/5]/VR^)]vqS闌UbN)k6f!\KTPU_loq3Fn_ʼ'} 1=O X`ȘcӗVl2~@6LI,^ott σżBNe0Liupr:,"qHȢQXHP@@8Ku=I Z#5dɛ :&>,ι(`][Xk/@+ꢦ@lFsT۠,o%q -l]|_ӽ 75byG(1 dՐҦTFkHKtmep rcs^Hvygۋd +#$`&SJ;Fh" YRI+,& s Ü2 1%2 ELyR2q2󜙇͗˥w]^7kNᬫ v>hwY(9ŇbK%O任:1o{uZ~=~"oFz&~;86nV"b~=6'șc4fܚ63wzu+3("fq&'I2"k+S%¨B-%2 Lx3ڝwM>D.,cJDJǓIHj35f^8) E1 T} ʚ&kI'cƶkp=^8\4!Ь˥Gř[ <}G5 \ GN!Jo3&396cߋhC51d͂5'i{w $M! bvymW6E c׫GOfp{v gG`uj^.ݾsV&W/lpIhI0)7㴺`u}в|?װF#+9o6ÜYR>.ǀp dztY )l *l&qyg5}=M:oc%«ʣ yfGJK"PSĝQ { .$u2 L $HCMw6,͋&@oGlq"9𦱄Pz sKC\C3vKbΫ47,2?8=&xyqt v1,P 0aW ڟy-8:gXA r1`1{G,]qڟvnIEFk$pG6FP:L! +,[i8n2gmTzle'@_ 9jԌeLor7FPe nj+Xa:[H)!i=~ޯ&'PKŴ '͙7^Ƚ鄣ZF\l%$i ʌ]1E¼i*5MC#qf*mVVL,u $-2^4X҄x\x1HqŘ+CSFɚ) W:FZO}j <9` Y [}R2xV+nZU nI+G9u4 ,8Bd3"90nn^=|(9X.`{,.$M-Ab E^(iGU?'O8}6L*!/ߚ}Ƿ+y.og5:{rg:M$ɤbT ,}>fe݀PSYar2<]͕]&Iwު&"%ΩM\˘^n\:̂d cZ?]y1ʵ(r"-Uw|^C3L, {,7b0qvس"nƓq hU7s9fG4~ysa xbrh_5lRQW' WYf ~M? ȋ{XO+_^$vJ$Y&Ib4R(DAdlABHY|:Ey7=S1:4,4nm4SzHC_)fO|vh^^CSΎح!_4]yGOX'c=U5r~Vy8ms(;@=-wK;z}U[șvQڴ<ˀoC]dUsa]Wy2XvxG!#ABٸ*[Npr7̎eN!RKJ|P,~\X}E2aU}G4 Qo굶|%x~/*KśX5/U(^_ژ w,[a9Wd\!"qB<C\)Kpj/Dz)bV# T-AJӐ8<˞+#zLٽW6Ixq Bi_ݗQ"qk$A WXYDf0H"癌@]U'<$:X|gK֬cՑ|>*XS:M&HJNA'u`/UD~-`21Կk,H€Z͖#8ZMVW]eJ+u-]IZ;˾#w e7*]630zqbʶq/c^`<ވcLiY.EeSHA"2B.E,XVGEua dny>HcZ,,xy b` ȿ<ݬ'U}x^u=>O^*t/k /ٲu %>,+NWл8Ǭ]"֨_6g0T;5"kqWyc@o,|mf'` ܙa 2bK"/NP ÅxAMUL:~D/n|`v@ G)X:,N.cr(ݙuҟ6y`VL֔xip)k14J/] ;S!Oo8- #7Χx/KXy1 fay_s1YR¥rGZ] |\*8c U 㲚ku][Y899:*Ab@Ir(M"<[iKA؄ja,ʟ٥x~@|sаR{m, |7WY3x&+ @bWK/g`|K_ ՘JJX㰗#!q pҞ؎1uNbP# t'pW˩]'d9~{*LY.A*hRb&ְ.dPDPYZ+T"2 cSKR_"q݁.DY TBd_^kneĴ>W^?p 9iYIsڡ)\>H_,}*.[WltOC$ ÅĔٍ}J@fܯ jzbtjɜ%O,AL*WrnWGڙZ0C`(#lo]D%e]BMA:+CsT |0}NL! uݖqKKE@擊kEVːMkt 3C?|IruZV7v _}ÁS!eB]#Wqi)ť /ԇr q,OoK} d)^lJ/Uۡzrq|m!q.g2?<~1s'ӑOqxrQS:($;ۉ]ovlLX1gƕΜǿ3|Y-yrv>hX]݂MkCNMoMO^[h(vXsS/ys_w.ۮ~ٸҚ1/* jIb2a,]c ;HX6+{C& P&mmPtyU pwX1Ld& _S?O˫E۵ޫ_n_ & SZȘjPK $D'0?~Cݻ;{%fPzq.Fcbuߧ89Mk*۟s,)'s7osee|,L3VZ#N.[Z~sԏtwarP쮧|ԇWm>'L0MEuFXN^ : \bnN^3Hؖ%"'3^"1 Ls9gj {^sߐrJy9Bឲ Saj{:>Io+~Q]xҜ34ʝ9@nݲk"k!&@gX{{$}9N`7`j٤?+& zژb̾ '8HT,%c|;'m͔]GZfpH٠X+;q|)d8AsegeWʃA!!I*=<^W 7;Ö0wxDz &*dLYs$tuxz6k;~֫"sA ey*c.[1)V[ؼCWwQIάnֽx)N,7n&lbuYjIh'240^ }JlCI oƢW%"ZJ].}Kax2W$f eO Z=YHgxT$1t{ ,Ayx^. "$qo |؊"Q4lZ;2Bx2(i|PW@iAli$LLѐgxk|q!]^Y{zxx#`;kHFx'7 X5uJ),N"ΐRFzIØ jdR#󌜔X&F׎/LZPbhZ[}~JKrw0h&Ԁφʙ/땰`x)Cοg ̞|,) Lɠ'doK`fKcU75{󢴉 .OUS]>Gl&@  o4%jljaۓy,ZkZKݾV2m S!Ν /8[ac.uڮ{:`Ӄ1؝81c@]XT7m)iO݂ ͈2%.ȚDI "HtڢeIY4ӑ%@P7 q(ĭ,8Oۻڱbsx@4;z&Gl ~ ^_#{šIy jPKnTO~᭧ vq_Ț@1 Pb eȥPҼw_ ~Ǘ/]轆5dSi/,q.ͼI1p/|UP ,)9*?, 8;ux3 \p{L8HauQzdQO1au[ʈC\\WVf5cE *1Yc2_:WNF>r%u꣋yAyHZem ɰ2Pej&RU# ..n w.=]?Zw>@WI\Z.b`~`St=nVǮ!cDƈ|~ۯ]kGH´- L;-]zt S3r6S~Nw8 'apq;`&V(1@)p7xL~tz&?>l&~Nt)M%Γ#0z!݌m}eGިҎ1l; 8sr rn*Ҍ ׵ o=Ysɏ߭b ^'oF2"mfP7]c !B㏏x|໾$H v<_t!7VS&UnM[ =)|-G k\vFzp};sti I-co\ddԩR-MR G!)t)f iz~BKAק+;[bc2eԞmyp\9\O[#iHm7.e qz&b k/&#,kLx^J<4'!R8bޓҿKpPLa$>ÕT;O7\QɆYeu۩[5`74 eOy>m; bHkG".ș+jY50o)^]fnҺ' gR-sJH9"3ӵ|fp8bR/c,(2s|"eū U| nQ+Iyuz,jZ?`el4/Pc 1@u Jlwd]c^١a:PzuIK/u4\7m2w veφLTM% 1!qOOvf^⳴r*Sz/sQfYʗ ;Nre=m+v;.iw8uk0>kƭ h,ǒɱ f׼VVGO%ȭ8Qv 33S]HO;HFt(^L''}8! ZI7H5Q7#?=NV|ɒ/+bu`<##2={YP:b%!"e@_"E+Uc׫3^W2\~Y<=z6ɣ58UI͘IX\,MyZd &jD(n(4fLo[7uhM ..`[J͗U{3#gbaO?ej$Y00_ÛXؤ؞\Ɇ6:ܻs\dP˒WJ蔍8) ]|z, "SJ3=uwunꖤlMxGYp<*6VUj3Nu[ Է9]ƨօF%i%mWP|dby+sxB9MI\C4{pt^LayJfy9`8!>߻81U5e $TBL!w'?kP oBif :V ֊$ԭ_z>S11fŦ_Lَ-M,eƁYzMY=FI7Q讦N n1fYGN(.U[6SPkDd(ijUUdZ,PG5+ ? \/XJ@BVHaweyDW{}XxnL0*.c R)h:s]is}k|eC6} irf;"禜d&.lfYlë׷jXݙpz ITi]2B鲩Ng/9 rO{1XK:њXyHB[d00紒GngiӮpb4rQʂYlReu_Zd4:9Პe<9[ O̮I]7dq ug$Rĥ t$*aV)3Pv'߿}t=mcw-==>^U, M ;][$9i׺}៾Ewy;ș^|ϘҀᔽgVךY%G_~I,8y4T0Vf!FBeYTJl#ӗOaF3vI\Qb8q~9V#'T+;Y2gOTA.;RțG剽m.WT^^/=Y!iCC*e8}pD)Wq&$.QRZ?[g+7'R4%˥eY 6wx/y7?x0~t?coTI.{mKFX]56r&/GxߩuNVۈX)\$:s2]2%8e?PGۖ^6{ [ -#;،Ő[l:Z X/חDTUh@!+vؘ`;Te~^^ 2M<^{啭e> .R@OQ[i"2AupNDfRKGG'K`jt^/DG-mc u0/ޚ5Ew}n>p#/?'W>_0 l*lF\buj$Porcv}_ bN<֎J_8// g@;q9uP6Q523,3MMez:vx`WRF@26g+8>w-؛W;A Щq,T"@*VYdMdLl\񝻆_qivJ^/{{훜͉啴塸6+1@N R\7a!=Aq >DkSȤ*@vdwֳ_ܽs9ۭ}e>jIb):93\2ɛsn,w1o''~_o=apq;7 /Cl$v![ɛ}w7G3)9wl! DWJObJKNOal1G8#ّFcx,w/CK;!b,5eom>I # tJs'LG<90dg[0S'V)+~ځ'LFq$Wu&~8?s;%e,ϓ5O.\>ʨK$v٭m@|LbS f`BVɄ`05ep((ᓠ)d%MTN巟j~ڿ騪hiL+hedAyy{*e*NZO'w7 r_+4P-"|9Aw'}B)VD
XL5\DCT.HH!ɩUlZ( K]tO ؆rZC6d<3ѹ)> i3#yݢN;X`5Fx͛_ߔ+c{=z9kR!3I\޸ɶR" Zs ln \a@M",ǔ)0AIHq&ûߴ{_oē&q2T7Ŋ'+搳?;>džQx͞tSc"iQ"&[d-~n>Ym*bGÃ?uVHR)ASΔU{l:1L*"JT" Ѕ"<u%d ̮JwwCq j^GD-o2vGG>SY0U9`(}@ҡĉY;.{w>l27o ݫ^1o*k sYj'2J-J>U$"C(Yذ /8U1"PӜ,"P L[/G#o K<LJ7i\-~cܻ+?}#.xtU;k]0><{/|`&@$c2@2B;hwڼf*lHvSiD^^-2tݐ4axE5ǐ3<>&s""%ۓX3Ͽv%9]"_Utz)[ U@'7dy]C6\Heph 99Y`T$"E@ThzD%`Q!SFTMO[? ThckK†zWٟΨ'>d/-*M9Whk @Hd>{TDV JwG|L ԬΠf,{,NP.wj,. u]48v9֋XH}I 0hc(ũK9/%6"SJc&oO#QY]Dst0:"@qKA.--Ó3ǽCb3 e*f@ r#ؔSYY٣:z@<{^/Ҟ^y*|6zXG⊣c\AtT5$0H5d$,A2%>E9dB`"drt@L@'Vԋ FEQEKgG}&%ShtR2HI"?E2PeL ZleIJǜ)[*5-$ W?]B4_8i Y$R3H }EuwL٪1w9TB QHh@DJ)N-@ eũ̽+敯L1ٰY }2+0r ~ ;>1O + 47;ıvH)o;3xuΫǨBجܴ$.xYBD0pe0ŰQuLP2*PM$.nBO$"j&uZ%TL&iD('*1A,*R,-et/t&)A2Ugdfdh +tA5.ȳK*L+)"F5@+2CA[쐣4P&"GBSWDkdJuRA]/eZxKFΑ2IVd%x%ϴ?_4:Rymێ w>ܾO~.Њ y@s ;Gu@qDEpP *#c3T/{dpهubB_)Fm zATS%$;!ئSEf#JeZkRUZT=|@2!mwsaȦ椖@%4Ag(Hr:\dLpY DIc:9Q7inX"lWP @JJem"gyMEq^ Tr]+^]`vsLISd0KAHSd!4L:&ӆRhLc.|8SaqU\ndu9LN+6ZVs2~a<~ ଚ4;z~!˻]NIx|X(ncD^}(ΔD 1VpY S4%!, y9R(̭e :j҂9\4pb (䂜JĽ S̩[,9M',*=q-aEbϛG(&p `=*0b+#D-eqD*0Vcn4F(YMcj_WEaӬhB;Jc{=Nt$ɴ&W&3:RE^ѵcW{e~x^]w6*w荼7"ARŐzyT* bIIΧe?E (#A:]5!gPI跩&zHXkPSO)1XN^phБ2P25<$fbTS#<6WjX@LE 2K1BGX ^BkgK il$V&Z^d*8#*9ޜ2[S'kWyNenIǴy829]-rXkOoV@+_\>zPuz{-? <15^}\`W@QYA Z jVM%’C4aÇp16/ƬXr 'R"L ` nB$"x4LdzEZY=iKJ ?q[-N-}/WFi5ODi(A9 X߳8<9d#'.KEhjCIW)dʡuQsC̀VЋIyLU .:_>׽4]jFRG\&`_T+A7a{r~Ț7ay_;_AG[4PMIV>= A23 "HT"0M1_W:BCֈ=2R!U"bABD KGLLޝW7 f!N[ 5 3`CHy(XVB'cdPRʛ\;z!!ygN`⊅:HDr#4F(%'S0 e0@BZ)Zȳx.w,L&  7bY% s6Կx |hߎcVcYuU{:W^ kHKʚ/7!v97lRevv&:qZ-^8|xON䔄.c. *rr@IkJ g5D) OMI%MD&G_h\`'wiLEi"%TC/&&Y)ZaΩ dIȀaq|[l R'P&Sf"'f^TTҐ,b:$0 r1 Õ#t81S\KXM RO(1-|Mg˹]eR sv^WnA.~Z.{\?5_wHi=leJMy 0GG^ 2ҕ"HFؠF")*R FU*aC< ξyN$< 5iC|خvbbXQcLc.Q.4(0yU6" P lWʯ&e)06xC r!88[#\l\=39VNl&Qe9hY# &.AgV# fΖqX -(ݏRNfs7Hm.zvZ"RM͛M$`0:-k/uU'W:ua7Y%t˪š!+Pzu$nW De3zhG5S!e⠦L - .D$zwӓ4n0U, mк].j@ِC0auֹ)-+};/&96f)# E)إ,Ԁݪ0!c F,yaRԝԩ^Lj4ObZOq𸮻C;lۮK?JS,<&pVd˫ y0hu3B}, 7,*\BU*1SV 1qűvUc´ʚbE,@c]r5y=nU>ϜU "/.'>qK<8IO, u$KJ9 {l{b0^jJIJ?7~,^{QiyRf^^Ț bӫbY/uEJA݊#Zb)R!K)%ؐbqkC13L`ru'4tI5͘ESdgE_0wD"mEW#|^ve9h0'j4ZȐiJh4u? 0ʐsrBrrQi r#ŃV>Ibu٦*g֞`|bJ英 y:\ ^ٵ)v]:bSw5LF $aބu324zU*媳 שd,2r_ٳ';M@z,i+LdS&.JUb.Hb@'=0%gIq:5}58%uɡ͍׸z]u͗qr--`Iܜۣlڱ Io(6K6%)( ȵFsyʾSOk$P- YA4MBTMdNed0plmU#B̵SՀ✀@"ٙY+Z":qg0°0a)ۍ3PL}i2|yp>/)dbؘMZ7g$jQnLb*3fAɅeNj`gqA^<2uˁ/驖^oXt㺽.0ڠ} ȃFL<)rs' 2 {Ul:_\y0yEPȘCHRm>a0tݱ9]/LRe)X\\^ȖyrnlQXc[fkPHR잞AX#)P,Cմ(SCx\~8GyJ>X^gבBcdgxnw{;t9mS"bw)0zBjtւaQK z2Zw`yy d۾^|j2-uM#|Dr*4NlNÊL BiX/H9WTJk)=:0lq N2ey5MHdHRX\]^g9s:@qܛ•TYfej|lT*3ϞތuVkëW6ozKYӬP&f\8tzZ=0kL\'IQ˞;;T|RkvJ rf IPL批m\E?L7Eeq+D Ur,?"XL9FԳʌ>|,W#p~T#@_8vK=/7ڱy˴߲F3tR Z#q[7RJ^%u'>ؽ]cyofWn~ z)2:ErnCQ6`5^0I5Be, b\a2( ip`p g(bOa_Jk6fT~F-@[c( Vs// ¥]5l7gGozV?>mARaslNo>{nӺ[{CuUe}W^/^]*7IId![&:Ώ,fj)ǐZtbϫá0-<1fͅ,:3!J /)eZe f 228;Nbd KӉU ڮg[|StY2x>+-àvy[`xG )3NZ0Dn~mS?5W)i3u>^eTs.ݕ7H"d6DtPzM1feziE1uaI111~W ۫=*2LV .6Voey3 .s>oAo\5 Pn3`N<=zD wyp˻>ۓrq~\erԋl'y3i3^TNM e |g'cnOѻz~6h.}=0ep4ol(3}, 8$"jb fCS'hmN we8LWKH`77b5ةG$\V<;Eoʘ-]dpYqs7.;\'JsrW3;~3d w_gLazll=Y4ofnGuyx__Zd*A3,07 vdD%XZex0y<V[}+,nMcNc*;;Z^`!eVs <NHܿH;^y^'tK^^_ty΀,m˂ ۣ8| zvkArY_^}Vm +h>7YT1 ȕm03!xq˾v|V of0w~On# ՌtB7ӫCw]߹ؗ[Оxzk xL.ζVg Nh+w/1oYn/+X]gh@m)Q& V*K@ey?~_n>;`x:Au߽lὋ.'-=KolM'kՒ\)؍{F ׼ަSy5ϗց}f n-պAw\WMn?_`/*=n z7?@ le{莔RHeyڀd^}itr^d!Ylepyeo*@lyvѝ%10Eu]/ׯg*ԝuSW|w5[R⬠7ѩ1je鼣rg7udg-??"9 sm=9]h>ys|e%] ރO^?ˀwO/*q>~? uP}\qol`_x9 : _C ]Go tg:Y벾/Ao]Ƿ vAr#g;^[-q!y;-+(=ݐ?`7d v2|_nj,`^ {1܃7.2o;=~|ONR <~` lUֶA&r7;.ْ˘-p~/t:u`{׽˥cEؖ2`uVCo\}en*ЭF6mer5ݫ(y:ug{/~ݧo'ɵ{ e-}z6f;;[po˛Hnj:uܫ<փ7+><ܡ>~!v@rց^xaEy?LA]W~5S~9 JCYV~&Wf7 vx:}f@yW?˜:?w.|zo|}yW˼9~E| u$]v~=>>箾|?>o}˗q^_A0{^]/`^0w _2лn}?雗Fc}7a{#ʫt:u |/r7˂up?yzo:,p{ ɫr:uK~/s_W|8$w7 >t:uK~|t8ǿ~;_ z:uY=o7\xgoVG7txzuŸv`^?Ӡ؁WVCz}\? /Kǯ;`K^z3&mtKW^zuիW^:իW^zիWxzիW^z5T΅}WZ? ΁@nׇ;b[<%߮+୵Z?3B;j LKP ~V`m<7kZkAxd-Dfv4x+|B<׿Zk}Fgz6v -] efw}xX xkzKp;|^u U-`6pZoz/n;~Kye(x\O9w|)K+୵ZۋG:"@pxڊŭ)/| rZ]~u |꣞G,հ|)n{]ozn98tXq9c =+|#K;E쳼~pI|)QWE xk֋cy֛9ޱ)LmD;IMAվZkln V׵2Omsƶʥo&.Gji*Ļ}aZ_>[򬥃 }\/RZUri?z1hV[k CjB;H;VK2{>HmMV xk`7A.WnzmԐcS9_z{}ԙޱd_ +୵Zk-̏c,V ?$^)ћXRV[kn%<+9~h5Y淽w8j! s^dj_Xo:I*Wp~\*Z~[^s]gX?w<վZk2-l͎X;RGq>{wޝ=+ ް}ae{+୵ZW Ǹ-!xӉ'WU25P||V[knL(dl;|[:Qefwׁmfx lJV[ku>C9@~/C_z7g8v} 7%<j_Xo~*_ ݩ+l-}Q/c2"7BXE6Rv_o~j8ځy2TPI`yUD0}(;ئU?yJksibw7;v]fl~\@3?}bc|}V xkzv͋<}} @[8ʖNIyvV!7 FV[kWλekVcdzkL$:9Ǯی~:Z"ٖr8"CC/NʧdJFz^H-.oY݋վZk}^A #l@!PY(fmV-Yusne˕Z@w㚠xMᦼKo4|7YNIy{ |)vݵZk}"^i^L_[_vW͙ܩYvY?̵C뮽ZWIa9IxxX:;my7{uZk,66XS,|fc{׬m t+[o^Wd7^󰮛@yԋbu/jZ+୵O-{Lo7(6WŁ~]Un ,Y,?s2Y vCW[kWUX}9gyK~ P[UbwhYԗ</'ZdxքC,_rn7/3\h,jNm,,b⫬Ii6j4 7>6N$9z=pgd+D'$y/B"261ZD֫n:v7yxngܜCrJ}`4jEdlaƁV[kW̧Aakc&,~XE'o{@:trH,ruH+zwZJ@YK\1dfWWxEROmOci)KԤS ]3W\o^=w,Ks–&C/u<ɀq~;;;1f-?yIx< |Z]C?\Aы;qn|cFg=-BS^gF_| -e=sZ+G]z Fw딖#qzk&;njϺ9ROݑw(1%ct+[o^mv7o_=0[mc';geusz]A{V F6sy_;rkدZk}rjܖw-7) ]xFgicHs~fvױ ل.?Z' hfPJ3kvyEIu~17>' ԣ-aK8lZrk3#,}.>: x@Wu3fpl.͔jQ 8 aZ\|ǎ G*%1e=Xx2d:n~]"{rֽA+୵+m!ԫ8U;@wnE#6mcrNxKF51ooy{ZkY3k̓׀;60~P=p"69e+JT n%x>ȯcua`w ]:_^j`~#޺Oq5h zfv $VM= Y~cyc90;nb7Y 'fݛ7Rtgexk*6>lYE;{lz+}A{h .:Akv%JcFkݖoG䟷]ܣhEBw||k o^9gvs%kӧCJ Ofw] O<іv=~~R{Vmdzc=fSi6fw6`v[oexkjIPTH*vylGر0\i1}PƤQ=&8l[X)ߡy1 Fg@o={Zk쬤`ň,zlX[wm`P瓂a:pe` _K{١mގ.D`o\n2 rsCKs`xpv(g Wf}:[o^5}K܂k`mO޹ncK8ݝ#\ ~3;yN\zlϱ6\?oyw 6CmC5c;C76[0@/7cpgZZkLviV7 @";q+2osdsh<(^:<L u[F:v]沝yh^7<|s(Uau ozz,+` fP {hm*vkx=zVbsv`!q4i;^xCׁݕ<<l;frV[kWE)X(7ka9՝ vٚ`^wgcf@T@;16mb?9><4;[\7 xkJx&mN0Waۘc?1cva{#P]梢8 _kINCv⛜ݕc`ݜY%;[+୵֫xþyR;'J[ćG"Wmd8c4N/21ef.u/L1ƅ*l얖~rW+୵+ |-vf;Tpȼ pQc_o~qx׵7ʼn.T9 [n>fi>L[X̟ޟLBcNgr>?myG}woc9GMFiHuH-Y!e1?oZkO$czi>|,qv&j HY>/<ו$gGsY,n> |w˙Z'dځ՛c=ݢ(go ւAb6kip?J:ʩx mj\aw5nxV[krvgdzׁup喝M EOfwcF쇬a嶠gmkiyaM]y}ptu15|^w xkSrǃ'}c.wb" <Ѭ% ƹ߰Ӟ<|&z6[մfuh`qvsʒjgb{s\zZo~u1g7Ͻۃjl,L ֭2chvͭLdu38> Ԝ U`ۘs`v`V[iV2~@;v]/ !r`g0G`ãr ^C b矵|^v oYRRx͌o)D=ycv;XR!+ikZ({׾~i,LY% {{AgƜEټ&\0F*#}75AY0?4ݒn~tZk}5]#N M 8@bC!7Ȁh謵( `l !va.wg㠷 G>~$,j?}[96m;Y]w|WnmܺkcAWCpQ [[= OA~9C ftC[Y^Zq6ی5dB]@8He=Gȭ!x@ŋђ- ~\/61ۯ7]LŮXEՙ[O Wc,`ͯ/f? x+୵Kt|=x~b`I f Hz6`Y;3aq7o{^%X:0.%8}uZު0;1L~?w|Y4Xz~,ޡKfGo%֊w+୵v"5? v 9^71x; Ao9ky+qbu#X1jz>[ 1-i8E!pg<:s9Zx8V9+Yy >;l;(GܡVfw|׾;fFaᭀZ//t09fpæ[? I&65 춉=9*6bgwro6{’X5'lsAohaW%\ՙ']>ݷ ,ۘms 9S*CM?1H_ xkq)~S@'^^>M}i# wڛ b,G6{"ۻ7,slH(*`mL&VL o]fvy 1|,#@7dCals<^żnnwLbL ㏡4kZw[Ec-yZܔa klmN~]38*9-TK/Fw$Q -Axv&~-6Xgm=LE΂GN?0˛[ \2 8m@<^\y6f5b!3fW[kj@qO>hl.0 Ȉڠift.S2Tu48ysaM ݝQ/4kvzFpEF(N-۝f"lV 58xmů4wj&ښlY1;f?X&,gv+f{(~VZ+vv6-BYCsvv0ˣi2 W& gX0sx݁P`DQSǟMc 솠lޮnV1>~Vz-%?fSfN)j ء`Xq^GeN㘢b3+B6l 5CȖȥ?/WM6Y4Bi&m zO&pYy$vc7\#W1,P]r;ꈉ["!֤ZA=Odz<ǴA2ladhjc{Xm ەv0OP=f764=u~Mڀuq"!Z*2SU[R`YrJEjxi:Zݛ +׀;{|Ɉjz xk@uSu6*ؕh4ndcg@jjmb@Mb6Subls,vvZk[#D Y4zˢK rB2ڝc"mE6YfNcY]K ]0+7O=>i11N  0մ5W[^ඬ&6g'n8kG䩋,5=yÛ}xn- 8ì9)=ǩ4ud{hPh@o[T50 tKc1M@߰Ѐ&9p =cOϾwuK>701W>7kD+KV[kT5w؝ԓ cњf)3ϖ_ϋqއYk;x~(SZ$ f2L=jl2F9dciSqqdq//J+ӛ'[?veuۿē-{_%.NZTb6tnex+Str⩳#9uFg׀ܡ(12;^ a% 89 M>h>m8|}U߿2G!VtiPz*6@ї 8r KZzְA!`N3ݰ9Ac/”dpHL M~Xof!U1[ T!}]ؽ xkR_S1vw >|v>8U|L[ȇ8N4*0cbTkN7oor)w#̫?6f&İo}0T% `@ч Vю0l[~j{ñ؛Օ`s9^ @j<|Gج;'0jz \'잵xsf1v=oLY?G\xdn66S;%>,vZ]i5W`ˢӲv$`!7p"fĘM߀2M7aoVgؾjf&b)S\mI >ty>;Y|kďޛK&w xktݳVn<71:; xsɤY7S|vc̊͊3Fh2þt0C 3D4[N n #SY4&MLZQ`Y(*OmW|pA+,g{>r?}C7#d-Y`Y(*ܜA L*!h-"@nDEZCtMHʼnlyZ ( lC(Y>+ Mbw)|;B'yErCG?Cb=vK5!ákb xkTmD+_fnǑMMq/.}q&^7vLQ |ڥ%F%@/M85qI[lLoV`A Q A=mT$0s.,//~K(B*+3\cwHb;?- Zvm̑`Z8h]%nhUؘڍPu޾1gZKBloJNjMݽ;TD  KIwJFE):f\tʙ)C,w+p36{inK`.{^_pD|Ļm̸.fքՃZ|;NyḿОeyhUbzi>;6h;x;@L ٧rvai @mmJ朮9Ԛ,Y|ilsj4Pч 2?,#T|wm۝o3Ý.l.@ikm,*) ׈Ǐg&RU"jIXoO؝nt-o7tcp6fdNiƴYfWk6aASsl|]9DyYs^WKm]K^$(Q%4DCX/"f͜ǥ3ܠLH;V P#6沝dueKVwl`wVZ,;՝ tn^Ģ 8\4Mu1?iNډ_Y(uc|> >Ҽ ҽMM ]@*4JF26!QQ#!js<"SZh30}|% I*;׮60Vg l" fdzZ*<"L3حZ?`wS`ێ݇Gny?irs, 6rC`0Enl6Zlfr.sx9 fW3}a8`\Z P'grf<Hq9 S!gDKRaijOӲnE ;8L=D[K!l^`˝v,o^My38讂,c*@|Ҝ{8RQ8*p6gg zyw>u6PTP0/@xK҄7;(E TҚdpHyB>p {~ԗ8ww?~R^n&?w?xg|`4W[v|Y nY ȯ<œפ|;}(Nfج9L`g{PPA8v8̃luQ@F=31@hHZ)i>oLƖCCJ h9P 4odLYr瞶wüNܮ.mTV[ew v&Oc| |n| [XC8G.ۜ,v WZL^M{ O[.ԶbyAQƽ@ ,>^ A@q+ C#vmf;-M+y~lf(%ۙрTV/EUB%\VB?>4{Q '1g72L;p}ņP^j&\fOAf-R 3;þ0$$H-$),#Tj)ۖYk>>Ogy7 ` xk})-Lx|\1`t~ /8,R);t37$. hۛ _|qfdb;ǽ5v4 #>*k<7ǥ>Fh/1lN6{ Ha[<7C'Kޓ=Itӑ}fiSoA>>Z`w* 0ڑ@ KVu:-a ڠ}F)Ϧy> [ڊ?~l, ] Om,Uoً:E&S##+\|l=S ff;K#HH]7yjcj| ;?o];^av+ح'=HT{cubc^;OlgB2|WE<96bvç' $ݾ7!  `m  ȝi*7HM˖$ Elbiqkh;:`i] '5f654YPCqO9_1t9;oCw^ jEqLhf.c$@9 !Z则ah=Iܔ::J ]Uubu|FǙ@b؝*կg*1=]ZWVnV[awe|;]'N9rXup)7AN6a )͛e+)Cș/=h~;!ͬhI)i2R̼9R'd{`Gz zsC2+*dﱔ ٝ;i1.l zyvlL¡'O~N@8́tsZ>fnw ؝6q8LGy̳]\ L gMM_h5y4{:gM])c$Kxur ۀ1TH $GIKeeN9J3O&SsBPDͬi쭛YJYD*?|Zbon`x[Ў\W ^4Wshm?3epY9>ٙ9l8޾'T18čȤTDaE ˞֚4FEsQFÊ,*tY(3;To.^@lD*g 6`qr2<6;[ߣ};Z'M))Pc7ecF_HҴ3O],`wۖ]Ӿ)*(tKR~37\T[cİLi澱{7 ͽ }7-p* ~""3ڬ6T60`,$i 8CfwLp4Rof;O\kcK͕C;s0NJ87?\$ޘfn]w29+\oW}`wۓ{0wfL7=Kbl#g&vGj\m0$DN;l4hllUrbofI+Ô> Dku4Tn"ەf Ɯi 3 B`6 "g pS&"^PSY 6`lVPg ^ӋWf:/v9͵~Kz_RN9ȭZ;unwRo$05ṕ bm>&! yY= @to]3vGS9?C3,F|]nFY`V0K{P0SȭBE"Vwֶ@hDU(jXJ@p[ii*."N2JnA:.|2[$Yev@bX]}& lĞd_G7nypzu*@ 旗Glqyz0ctKъјa:f51@@s9f&f S"|p#MOkbmkQ G/xEID *["I+@I .2$Hp-+4ʘ1a!zԗja<ڕX`zþ!!e8-Ө榩,E># ,Hz }QJz%YI,?Kzm %kP![|`s#(pNhϛg!$o)|W ,RCb{LG2B#ar] ne`}2&˂`fx_v '!d9KnW?9hAn.5~J43y"LPAfҵxKPhťZa0cVj"5̋o?xaFGDcv[̘Pq7QpWZ+"N 7-ݢ%96S(ŝ4K,G\Eހ™Nb"PC%#\4P5& o~xpv j$݁ɶ t\SjHٶj[&KM =^DkA>';=PS\"-I |QVt:l|AB6&P}1 ݿ(i u$Z]| w 3'-AmyLoeZ16041M*10A;lϵZF "3)Vـh:&EUfv)-C[3yhE a$?'_y\ j&U#w' G%JI$ D1R6Br]0wfJCT;R L7r>n`V uY $\t )PIb9cv%AR$SN cfuks^2{>h:6f n<v-i nl^*7w0lYZNKR)B48=Q^,}PoZ<5 Cֳ-7}l~kڳe4Nr"M .1[|s8tjmW)@exm_J1S4H4`\Զ!4\V,NS]q AGeptg5V$!6~Bh-KԦ.hO1Skf D=m7 o?nz9y{SX}._ܙ omٷ$8sZOƑ  0撒4L֗FII0dd7Rlr-w&% |JNc:Jαe&U }0&/aFx=ϮC(OnLr CȖ-x2!sqn$`ڴiow߲ n`eL(m0Tw#0ؒSJLU>5I4 A(ڬNH8 --tzS&PђqCa+[o@w]r^S׫lAm%]g;"luf 7| -Lh08E⍵1U.” g" LOsdoȈCsqn ڕI!8V љA=m䌸`Ç?{F!*zX;eW0Ès5 : h<(Ppb\fMSQ {q7(45ߜ <ņBHl}#`m w@;,z׍JTrbuq&h4pi'-m:>_T0[E-+i]K}Kp>GoºF?| vw v:3v(q<0D` kK.Z~iZS4Ț%"dAvZZi8KC0ڕ9w˰/cB^ y@1(q Hkl }]),mD5+a4rO;~OclY:s *8ʮ͝]ΰZe9C`I96,sv76@lV_yoğa3HhHFNjMV[y~ݼ~m>35s6}\9{`ښ^han X)Yrv>[v`pLKiNF5QJ23h^ل+14d|h mnF3M2L[A2ְTs1&q)Xe(TXDm\ ug PQ =9*j@(TTwrZJ; 2,;1spzjGkBp&f!.`ôod;O;a`x 0,E|RfwSF &66/uY aa+حt7 <ہ=H,} Ym7\Y~5μd^a# $ÕS*ULQ21J$#d ,fKpt.&()rH_j܂ LQHsrG)DyDsL/՞adaH m|iFo(k4YUpMRf1093XDN?{q)7 p[`rj27m "L#m8s kݰOkk;"KVڗ1G-j׭+v_2xQL/^=z0|7|ۙ(Y [T\ t9 2;)g X:<A4G̚Mo99@/1`L@+tt'X;SnJXPPmP$6D˼׭i^o\UCDwm*tt!I0zu#6.DU!?Ad^R4Fg5@ 橽6dcm-4[1$`{5kcηN>nk|9{/_}>{t? зg# 97ko뙙alaznՅ'C뭸5&$ o1*633d12*ʌd"q񹜅`%*@4pHf.,m.'Y-'D5JK? q.u2Pa@aFdBu`aSbA-UMBrܙTҭ7.;`+ *̟ ECWLP}#,|AQ#:s4[8f{*fF +W`&]o쮫ϼ σo7g;O@|=j^߁O џil[ r綇Yʫs;wV偐E2 \ 9֞RӲ͙kq2yT`=m $ qcb04׵ǜN-?StT01uS0Ka#LJșSv;\䝥߲)Is%'CdV¾yџKQI4 ̺(*\ŕ!GVvG4KFc0έTj[PZIr3'u4&/NV[c׏,[| b- 6v,+gg^LF,tojM @ ݓ{yIfwMP-/0P H$ ;kދOV 5&GL|sf!V9 %$h@M*7٥!'q jKS-Hʂ2& s:8txp/.w[T ښ Qd9ح"9U+ؠDJ a߽maaaF9RmU . Lzу@*>:irԘTa֍[tkg9Xi1 |6M2 Rԕa1f[.,o[Oߎ-nz sۿ}-;O}yb}ٔ-&- | 0X5=u;xu ֛N=`=JJLbm[㓊Jz-Ll >3  8I, eƓRoaX{֘`7F_]o3J YП{sS¦e&f_ l,(s"ތpZfP+߶IYD!.?QY"ɪq#ZM0<&Fg*ޤD> Ti¼o;׫ͧTKUnVhFXm@Zj&t-ڙl_,XIԗ[󵝹ZssYqvNC 2y29O]V]SĬl>gv@-DӘnҧ}̼fѡ m]*Y #%^ !̉!W_M8m8`|>,ЧS (-?OsрiA||?}xds׃Ѷyec]> (FKve2˲hb^N[.]4Q?UU*;<,f~Vj|'F7N|ff o  y|Be)EK w_3r$́2SW:7ơ)6dlh.!CA Kw2] ixdgjho7Cތ RΣo'5ը>ª"' VX0Y}$KCfB-4$RNܙ`zNיyw)B_4^3B^yM6|rNEZovr~}~|/A$oAii=v]LwmaO=d}e+Su+0ߖ?/fՒVdf\ *w aEAdf yDi(0/>{/ln4Hc6/ڛ cewwmoN3!J\bAXaNF%~Sg)yj[@ehR3r+Ϗe?mjer(®{l./L;vQ̷#TL5١jU]\ d!*#(5;6l,wsQҡ $~t=7}_zT]J3R([!&)}yìOQAZ*x,E/<@E.5طwolm[ֺ5*'&ȡы^>TV&a0C# : pXFBPnsmnK , v-4m8{Z+uKݲ.~q' 䯿bEItz`RA6&¶0 y  -R\nͮ`250dsZև40>09{6;(C*_‡C#7p?#i`sľ`e֮4}93;MmΒqn?_z;kV7! !"@38 Y rkH"qcC,(ɕ;t;Ȭ[h+QT"ST!*`-7e5DY5LF@b4BKr䟊%R P7*E<ҒK gy?ɚaՒBgT6F da_&+';RjW[z*3Y '-zt p#?f9y0,k}3NWlbuNLo`{`(݅TleA@U\E[.;mGآnlḲZLG$TO?=l۩[oTv*UЪXRJ!UTgA(Qn)?O4zxȬ nr9` K-IxooCtri:xa πOkr~}'O en;D AE~>LGM뻖LTo}*./ 0j1~V ChVw:U 3<g{ Eaa 3AEpHOgm?` 46: 8gwe6ӛY &FmNۿ 4y./}Mֺ}m[#o&+T5cuDzW8#sfP.z{g;փGO-Njҥ }R=)+hJ-'KMaQ3ԫ pDZC dV)1%\4\-]'Q *1ky&@ p?߲óm?(C}FwKSodЃĶZ .|bq-ښʓlaR`ߥPfb;i6ph*Mװēg;:XbvR)y怇y"Vm"7`.AF t19e~£ݿago9-OWg=ufx>tpvn+@quS0*).0[s>S TPo=b=H1v)&TEٷ_t_tc@Vvv^ыjOpGX5vp.D"JAVaܖ UE)m呙bT:,^ adR٢r+8m@t%UŽE9_=zq77ʱM9,B:W[Ygt׶<0۞h˳lUn7Wx|?{ ܬϭh926\JK#:vUERee&f-*J57="œR }Z9fn!Z w&:Vc.m֪tguWۗ :pGkQPHnw ŲFZHr2<=,I$o=Äހ`z7o#:h=QwJ{UEO*YC0 : " Rlo ]-&T!]>)FZ Y#V#l3XQek?ҧ{w f&6±#F#"JnzaՍ٢׽&%f;A+ݝ)D5AA-0#lI@ɌmPз%h{ Uw< L{0Y[ki,(X @?T}n嬮rg\ǼfǺűn)Tiyu噜}`g]T5"XH4,?[OkV*eΠ"$yoGd^@]O[j`"*Jt ֌+ DȐ,VFWHf@Վjhj}neb2;}& ' T@6sf1CKf@~A_!"%+р/Un[kle^]^>R}wMܹc`nm>~4ts01XdX4YM>°.SRJm`w1=q Z(WцVem;,W컴9(X. abR^N3NnU^anab &ѫ+h{JYv({? g1gf[fYۂm[A▭;'VGMm }SWcH+YImXa&:& w?۟hcc`^bOBTe#PAjq" ,2 erv9Ts DBT@y|c0zsX S{23PvR( mhpD y^.jb* x_n_q.ᶕEL?RүZ/|~hRk_%<,ͪORy*n RR338\ƐW8irܡg^i 3sjARi+TA{}>;xyMP+ӹ?M7>ց/볯 5}l1wlKjH$Ow貖AL5Wzg;JabGVU{xZ{*g A8@eH̍BEAo}+Z.rS$hUCa @KT! FX $QQpO M.KE0os86e~eP{-5iVUM7՟bw|dz5m9Dz^oSw7;bwsL; Vn7Z ۍF0m{jҦ:,!eNO낅Y2Gӂ sLA= ᙕ {#D9)ಷL{0'`q8˜=nr^11>ou>? `[qGZnQQbw "+~ӺsAգŀa!=dUY AVX0Ps,#QY3ł(k#DMe!D-L^*+LĶ0ZTV G0sRIfʘF! =#6dtzJ՟>/GSN28'C^J&Zr8ZKv]͖p}zA 8nPaiKK^ߞ?L_]&6k2pg0NpK{sY#{%J_XJ@T3Hek`T)\O4ckٝ̀o|Kf7! *ʬeYl^狶gR8L 3YV8欫m7wm^>2o0CӫM| vC> AU zU zU@3O՜Y@J0}l2z-'uu#"(fdUQjTlm+h0(SɎ%*2 fo~9_پ_ݭNYDC\!}-Qg/k`v}cs\[+u{MxbY=möpd/s!(5MƬn.nvrp,E\[nV@fˬ @Y8(0ut> N6\ Wg@octvy koi4cv͎Eۺt4a=x](;D_`vZzYTPTzz(t"sびG>[" VHYc"5U@zhجaL#j5PȀ`L!P5, p$ I9nFvIq*3#UnEb!Ym"&뫷Qñyy?ڟ ḫM ywQCBls DU0TvP˫̼.Sz!G̝Ff.Yf, 5}}|^D)ř+O3;̮5Gp:S"x>5U7! cԊz^HBOΣۺhCQUfZrx h9`DFK R!Fv}>L f&YԌ=B+I$h ɝ 0R:d;'E0UQE|r3rZF֖`lٞtv6 Wז xkTv}If6?ɐg1Qe ֦<?Fla`2gx}} 7x@i60mfLox>?N`6[5:9Wٹo?O>?%;˼LEHaݷ%+*\i- +Pa@f^`V q` yTX{*XPuXEG Xk"rHSߏN0'@@+݈ #V (T8ݹ٣"Qt`ec+-Z 14!j0E'>AD/W*ۚuhg5K VV[1le6PZ}yElU" v=FF23!:`ʍ2 J[[YTd2FdfHy% ь (Y9\Щ`.iLo9&J;+Bb;4 k;  ACJ_b E`e9+]攲G2VH- !׎bMZs a<]%S#FX w^3l@"n`VfpRAQf^7?}ga;iGCip(Ri|r&Z d LGf}p1x6gYs#۬@î8ڠk`vÇLM)5ۙDZ>Jp`L|jn "#X-ٝ&Ѓ`&,YPrW&Z4iF/SW Pl @ƅX }l__(D bSh14f/1Ur/w? fz6-@7Ayh>(FmLsY9|x72{X$,SZ؜+Û/-́ K-͛8ů-Aϥa7/60y?ڻF.{"L[(!$CnqZ v\ND*=@I^܌(9E#RKĦPA `1+;UMB`K/xq S5\30ASP8͌(YhWȐ+< ٦zL쎨2#LVSMpfrpmA}) wjLkln `|悔9ȍ;涄fch#e#-iFd++3\䀅ɕ